72 {
73
74 bool nastyVsRevertPosToNeg = (
basename.find(
"Flip") != std::string::npos);
75 int nVTX = 0,
ndof = 0, nTracksAtVtx = 0, nSingleTracks = 0;
76 float energyFraction = NAN,
mass = NAN, mass_uncorr = NAN, significance3d = NAN, deltaphi = NAN, deltaeta = NAN,
chi2 = 0., deltaRFlightDir = NAN;
77
78 std::vector<Trk::VxJetCandidate*> myVertices;
79 Trk::VxJetCandidate* myVxJetCandidate = nullptr;
80 if (myJetFitterInfo) myVertices = myJetFitterInfo->
verticesJF();
81 if(myVertices.size() == 0){
82 ATH_MSG_DEBUG(
"#BTAG# Trk::VxJetCandidate not found for jet fitter ");
83 vars.massUncorr = mass_uncorr;
86 vars.dRFlightDir = deltaRFlightDir;
87 vars.nVTX = nVTX;
88 vars.nSingleTracks = nSingleTracks;
89 vars.nTracksAtVtx = nTracksAtVtx;
91 vars.energyFraction = energyFraction;
92 vars.significance3d = significance3d;
93 vars.deltaeta = deltaeta;
94 vars.deltaphi = deltaphi;
95 return StatusCode::SUCCESS;
96 }
97 if(myVertices.size() > 0) myVxJetCandidate=dynamic_cast<Trk::VxJetCandidate*>(myVertices[0]);
98 if (myVxJetCandidate==0) {
99 ATH_MSG_WARNING(
"#BTAG# No correct VxJetCandidate could be retrieved." );
100 vars.massUncorr = mass_uncorr;
103 vars.dRFlightDir = deltaRFlightDir;
104 vars.nVTX = nVTX;
105 vars.nSingleTracks = nSingleTracks;
106 vars.nTracksAtVtx = nTracksAtVtx;
108 vars.energyFraction = energyFraction;
109 vars.significance3d = significance3d;
110 vars.deltaeta = deltaeta;
111 vars.deltaphi = deltaphi;
112 return StatusCode::SUCCESS;
113 }
114
115 const Trk::VxJetCandidate& myJetCandidate =*myVxJetCandidate;
116
118
119
120
121
122
124
125 double energyFromPrimary=0.;
126 double energyFromSecondary=0.;
127
128
129 const Trk::VxVertexOnJetAxis* pvtxjet = myVxJetCandidate->
getPrimaryVertex();
130 const Trk::FitQuality& fitquality = pvtxjet->
fitQuality();
133
134 if (mySelectedTracksInJet!=0)
135 {
136 ATH_MSG_DEBUG(
" Adding the tracks from primary vertex information ");
137 const std::vector<const Trk::ITrackLink*> & myPrimaryLinks=mySelectedTracksInJet->
getPrimaryTrackLinks();
138
139 std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksBegin=myPrimaryLinks.begin();
140 std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksEnd=myPrimaryLinks.end();
141
142 for(std::vector<const Trk::ITrackLink*>::const_iterator myPrimaryLinksIter=myPrimaryLinksBegin;
143 myPrimaryLinksIter!=myPrimaryLinksEnd;
144 ++myPrimaryLinksIter)
145 {
147 if (myParameters)
148 {
149 energyFromPrimary+=std::sqrt(s_pion*s_pion+myParameters->
momentum().mag2());
150 }
151 else
152 {
153 ATH_MSG_WARNING(
" no perigee in track for energy computation. Skipping primary track...");
154 }
155 }
156 } else
157 {
158 ATH_MSG_DEBUG(
" No information about further primary tracks available. Normal in JetFitter vs. 1");
159 }
160
161
165
169
173
175
176
178 const std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryBegin=TracksAtPrimary.begin();
179 const std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryEnd=TracksAtPrimary.end();
180
181 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator TracksAtPrimaryIter=TracksAtPrimaryBegin;
182 TracksAtPrimaryIter!=TracksAtPrimaryEnd;
183 ++TracksAtPrimaryIter) {
184
185
186 if (
dynamic_cast<const Trk::Perigee*
>((*TracksAtPrimaryIter)->perigeeAtVertex())!=0)
187 {
188
189 energyFromPrimary+=
190 std::sqrt(s_pion*s_pion+
191 (*TracksAtPrimaryIter)->perigeeAtVertex()->momentum().mag2());
192 }
193 else
194 {
195 ATH_MSG_ERROR(
" FIXME: VERTEX DOESN'T SUPPORT NEUTRAL PERIGEE, commented out in line 163");
196 ATH_MSG_ERROR(
" Track is not a normal track neither a KS. This is an ERROR (ask developer to fix it). Skipping track... ");
197 }
198 }
199
200
201
202
204 CLHEP::HepLorentzVector massVector(0,0,0,0);
205 double sumPtAdd(0.);
206
207 double dist(0.);
208 double inverrordist(0.);
209
210
212
213
214 std::vector<Trk::VxVertexOnJetAxis*>::iterator vectorOfClustersOfTrackBegin=vectorOfVertices.begin();
215 std::vector<Trk::VxVertexOnJetAxis*>::iterator vectorOfClustersOfTrackEnd=vectorOfVertices.end();
216
217 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator vectorOfClustersOfTrackIter=vectorOfClustersOfTrackBegin;
218 vectorOfClustersOfTrackIter!=vectorOfClustersOfTrackEnd;
219 ++vectorOfClustersOfTrackIter) {
220
221 const std::vector<Trk::VxTrackAtVertex*> & tracksOfVertex=(*vectorOfClustersOfTrackIter)->getTracksAtVertex();
222
223 int vertexSize=tracksOfVertex.size();
224 int ntrack=(*vectorOfClustersOfTrackIter)->getNumVertex()+5;
225 if (!nastyVsRevertPosToNeg)
226 {
227 if (vertexPosition[ntrack]>0) {
228 if (vertexSize>1) {
229 nVTX+=1;
230 nTracksAtVtx+=vertexSize;
231 } else {
232 nSingleTracks+=1;
233 }
234 }
235 }
236 else
237 {
238 if (vertexPosition[ntrack]<=0) {
239 if (vertexSize>1) {
240 nVTX+=1;
241 nTracksAtVtx+=vertexSize;
242 } else {
243 nSingleTracks+=1;
244 }
245 }
246 }
247 }
248
249 for (std::vector<Trk::VxVertexOnJetAxis*>::const_iterator vectorOfClustersOfTrackIter=vectorOfClustersOfTrackBegin;
250 vectorOfClustersOfTrackIter!=vectorOfClustersOfTrackEnd;
251 ++vectorOfClustersOfTrackIter) {
252
253 const std::vector<Trk::VxTrackAtVertex*> & tracksOfVertex=(*vectorOfClustersOfTrackIter)->getTracksAtVertex();
254 std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackBegin=tracksOfVertex.begin();
255 std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackEnd=tracksOfVertex.end();
256
257 int vertexSize=tracksOfVertex.size();
258
259 int ntrack=(*vectorOfClustersOfTrackIter)->getNumVertex()+5;
260
261
262
263 if ((vertexPosition[ntrack]<0 && (!nastyVsRevertPosToNeg))||(vertexPosition[ntrack]>=0 && nastyVsRevertPosToNeg)) {
265 {
266 for (std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackIter=clustersOfTrackBegin;
267 clustersOfTrackIter!=clustersOfTrackEnd;++clustersOfTrackIter) {
268
269 energyFromPrimary+=
270 std::hypot(s_pion, (*clustersOfTrackIter)->perigeeAtVertex()->momentum().mag());
271 }
272 }
273 } else {
274
275if ( (nVTX>0 && vertexSize>1) || nVTX==0 ) {
276 dist+=std::abs(vertexPosition[ntrack])/vertexCovMatrix(ntrack,ntrack);
277 if (vertexCovMatrix(ntrack,ntrack)>0)
278 {
279 inverrordist+=1./vertexCovMatrix(ntrack,ntrack);
280 }
281 else
282 {
283 ATH_MSG_WARNING(
"The diagonal element of the vertex cov matrix ("<<ntrack<<
","<<ntrack<<
") is "<<vertexCovMatrix(ntrack,ntrack)<<
". It should be positive... Ignoring vertex when computing L/sigma(L)");
284 }
285}
286
288CLHEP::HepLorentzVector massThisCluster(0.,0.,0.,0.);
289
290
291
292for (std::vector<Trk::VxTrackAtVertex*>::const_iterator clustersOfTrackIter=clustersOfTrackBegin;
293 clustersOfTrackIter!=clustersOfTrackEnd;
294 ++clustersOfTrackIter) {
295
296
298
299
301 sumP+=mytrack;
302 if (
dynamic_cast<const Trk::Perigee*
>((*clustersOfTrackIter)->perigeeAtVertex())!=0)
303 {
304 massThisCluster+=CLHEP::HepLorentzVector(mytrack.x(), mytrack.y(), mytrack.z(), std::hypot(s_pion, mytrack.mag()));
305 }
306 else
307 {
308 ATH_MSG_ERROR(
"Neutral parameter has been taken out until Vertex has been rewritten to support neutral perigee again. ");
309 ATH_MSG_ERROR(
" Track is not a normal track neither a KS. This is an ERROR (ask developer to fix it). Skipping track... ");
310 }
311}
312
313
314sumPAllVertices+=sumP;
315double ptadd=sumP.perp(flightAxis.unit());
316double masswithneutrals=std::sqrt(massThisCluster.mag2()+ptadd*ptadd)+ptadd;
317
319 {
320 massVector+=massThisCluster;
321 }
322 else
323 {
324 if ( (nVTX>0 && vertexSize>1) || nVTX==0 ) {
325 massVector+=massThisCluster;
326 sumPtAdd+=ptadd;
327 }
328 }
329
330
332 {
333 energyFromSecondary+=std::sqrt(masswithneutrals*masswithneutrals+sumP.mag2());
334 }
335 else
336 {
337 energyFromSecondary+=std::sqrt(massThisCluster.mag2()+sumP.mag2());
338 }
339
340
341
342
343 }
344 }
345
346 if (energyFromSecondary+energyFromPrimary>0) {
347 energyFraction=energyFromSecondary/(energyFromSecondary+energyFromPrimary);
348 }
349
350 if (massVector.mag()>0) {
351 mass=std::sqrt(massVector.mag2()+sumPtAdd*sumPtAdd)+sumPtAdd;
352 mass_uncorr=massVector.mag();
353
354 if (mass>5000.) {
356 5000.+(5000./
M_PI)*2.*std::atan((
M_PI/2./5000.)*(mass-5000.));
357 }
358 if (mass_uncorr>5000.) {
359mass_uncorr =
360 5000.+(5000./
M_PI)*2.*std::atan((
M_PI/2./5000.)*(mass_uncorr-5000.));
361 }
362 }
363
364 if (inverrordist!=0) {
365 significance3d=dist/std::sqrt(inverrordist);
366
367 significance3d=100./(
M_PI/2.)*std::atan((
M_PI/2./100.)*significance3d);
368 }
369
370 if (std::abs(sumPAllVertices.mag())>1e-7) {
371 deltaphi=sumPAllVertices.eta()-JetVector.Eta();
372 deltaeta=sumPAllVertices.deltaPhi(
Amg::Vector3D(JetVector.Px(), JetVector.Py(), JetVector.Pz()));
373 deltaRFlightDir = std::hypot(sumPAllVertices.deltaPhi(flightAxis), sumPAllVertices.eta()-flightAxis.eta());
374 } else {
375 deltaphi=-10.;
376 deltaeta=-10.;
377 deltaRFlightDir = -10;
378 }
379
380
381 vars.massUncorr = mass_uncorr;
384 vars.dRFlightDir = deltaRFlightDir;
385 vars.nVTX = nVTX;
386 vars.nSingleTracks = nSingleTracks;
387 vars.nTracksAtVtx = nTracksAtVtx;
389 vars.energyFraction = energyFraction;
390 vars.significance3d = significance3d;
391 vars.deltaeta = deltaeta;
392 vars.deltaphi = deltaphi;
393 return StatusCode::SUCCESS;
394}
#define ATH_MSG_WARNING(x)
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
double chiSquared() const
returns the of the overall track fit
const Amg::Vector3D & momentum() const
Access method for the momentum.
Amg::MatrixX const & covariancePosition() const
return the covDeltaV matrix of the vertex fit
const std::vector< const ITrackLink * > & getPrimaryTrackLinks() const
Get the priamry tracks (please do not delete the pointers)
const Amg::VectorX & position() const
return position of vertex
const std::vector< VxVertexOnJetAxis * > & getVerticesOnJetAxis(void) const
const VxVertexOnJetAxis * getPrimaryVertex(void) const
const Trk::RecVertexPositions & getRecVertexPositions() const
const Trk::SelectedTracksInJet * getSelectedTracksInJet() const
const std::vector< Trk::VxJetCandidate * > & verticesJF() const
const Trk::FitQuality & fitQuality() const
Fit quality access method.
const std::vector< VxTrackAtVertex * > & getTracksAtVertex(void) const
get Tracks At Vertex Method
TLorentzVector FourMom_t
Definition of the 4-momentum type.
virtual FourMom_t p4() const
The full 4-momentum of the particle.
double chi2(TH1 *h0, TH1 *h1)
Amg::RotationMatrix3D setPhi(Amg::RotationMatrix3D mat, double angle, int convention=0)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
Eigen::Matrix< double, 3, 1 > Vector3D
void setTheta(Amg::Vector3D &v, double theta)
sets the theta of a vector without changing phi nor the magnitude
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
constexpr double chargedPionMassInMeV
the mass of the charged pion (in MeV)
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ jet_zv
position x,y,z of primary vertex
std::string basename(std::string name)