ATLAS Offline Software
Loading...
Searching...
No Matches
InDetV0FinderTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5/***************************************************************************
6 InDetV0FinderTool.cxx - Description
7 -------------------
8 begin : 20-07-2005
9 authors : Evelina Bouhova-Thacker (Lancaster University), Rob Henderson (Lancater University)
10 email : e.bouhova@cern.ch, r.henderson@lancaster.ac.uk
11 changes : December 2014
12 author : Evelina Bouhova-Thacker <e.bouhova@cern.ch>
13 Changed to use xAOD
14 Changed to receive handles from caller
15
16 ***************************************************************************/
17
22
28#include <vector>
29#include <cmath>
30
31namespace InDet
32{
33
34InDetV0FinderTool::InDetV0FinderTool(const std::string& t, const std::string& n, const IInterface* p)
35 :
36 AthAlgTool(t,n,p)
37{
38 declareInterface<InDetV0FinderTool>(this);
39}
40
42
44{
45 ATH_CHECK( m_trackParticleKey.initialize() );
46
47 // Get the right vertex fitting tool from ToolSvc
48 if (m_useV0Fitter) {
49 ATH_CHECK( m_iVertexFitter.retrieve() );
50 ATH_MSG_DEBUG( "Retrieved tool " << m_iVertexFitter);
51 } else {
52 ATH_CHECK( m_iVKVertexFitter.retrieve() );
53 ATH_MSG_DEBUG("Retrieved tool " << m_iVKVertexFitter);
54
55 // Get the VKalVrt Ks vertex fitting tool from ToolSvc
56 ATH_CHECK( m_iKshortFitter.retrieve() );
57 ATH_MSG_DEBUG("Retrieved tool " << m_iKshortFitter);
58
59 // Get the VKalVrt Lambda vertex fitting tool from ToolSvc
60 ATH_CHECK( m_iLambdaFitter.retrieve() );
61 ATH_MSG_DEBUG( "Retrieved tool " << m_iLambdaFitter);
62
63 // Get the VKalVrt Lambdabar vertex fitting tool from ToolSvc
64 ATH_CHECK( m_iLambdabarFitter.retrieve() );
65 ATH_MSG_DEBUG("Retrieved tool " << m_iLambdabarFitter);
66 }
67
68 ATH_CHECK( m_iGammaFitter.retrieve() );
69 ATH_MSG_DEBUG("Retrieved tool " << m_iGammaFitter);
70
71
72
73 // uploading the V0 tools
74 ATH_CHECK( m_V0Tools.retrieve() );
75 ATH_MSG_DEBUG("Retrieved tool " << m_V0Tools);
76
77 // Get the TrackToVertex extrapolator tool
78 ATH_CHECK( m_trackToVertexTool.retrieve() );
79
80 // Get the extrapolator
81 ATH_CHECK( m_extrapolator.retrieve() );
82 ATH_MSG_DEBUG("Retrieved tool ");
83
84 // Initialize vertex container key
85 ATH_CHECK( m_vertexKey.initialize() );
86
87 m_v0LinksDecorkeyks = m_ksKey + ".V0Link";
88 m_v0LinksDecorkeylb = m_laKey + ".V0Link";
89 m_v0LinksDecorkeylbb = m_lbKey + ".V0Link";
90 m_v0_ksLinksDecorkey = m_v0Key + ".KshortLink";
91 m_v0_laLinksDecorkey = m_v0Key + ".LambdaLink";
92 m_v0_lbLinksDecorkey = m_v0Key + ".LambdabarLink";
93 ATH_MSG_DEBUG("m_v0_lbLinksDecorkey = " << m_v0_lbLinksDecorkey.key());
94 ATH_MSG_DEBUG("m_v0_laLinksDecorkey = " << m_v0_laLinksDecorkey.key());
95 ATH_MSG_DEBUG("m_v0_ksLinksDecorkey = " << m_v0_ksLinksDecorkey.key());
96 ATH_MSG_DEBUG("m_v0LinksDecorkeyks = " << m_v0LinksDecorkeyks.key());
97 ATH_CHECK( m_v0LinksDecorkeyks.initialize());
98 ATH_CHECK( m_v0LinksDecorkeylb.initialize());
99 ATH_CHECK( m_v0LinksDecorkeylbb.initialize());
100 ATH_CHECK( m_v0_ksLinksDecorkey.initialize());
101 ATH_CHECK( m_v0_laLinksDecorkey.initialize());
102 ATH_CHECK( m_v0_lbLinksDecorkey.initialize());
103
104 m_mDecor_gfit = m_v0Key + ".gamma_fit";
105 m_mDecor_gmass = m_v0Key + ".gamma_mass";
106 m_mDecor_gmasserr = m_v0Key + ".gamma_massError";
107 m_mDecor_gprob = m_v0Key + ".gamma_probability";
108 ATH_CHECK( m_mDecor_gfit.initialize());
109 ATH_CHECK( m_mDecor_gmass.initialize());
110 ATH_CHECK( m_mDecor_gmasserr.initialize());
111 ATH_CHECK( m_mDecor_gprob.initialize());
112
113 m_v0_BDTScore = m_v0Key + ".BDTScore";
114
115 ATH_MSG_DEBUG("m_v0_BDTScore = " << m_v0_BDTScore.key());
116 ATH_CHECK( m_v0_BDTScore.initialize());
117
118
119 if (m_useBDT){
120 std::string BDTPathName = "InDetV0FinderTool/BDT/v1/" + m_BDTFile;
121 std::string fullPathToFile = PathResolverFindCalibFile(BDTPathName);
122 ATH_MSG_DEBUG("Using BDT File: " << fullPathToFile);
123 std::unique_ptr<TFile> rootFile(TFile::Open(fullPathToFile.c_str(), "READ"));
124 std::string strBDTName = "xgboost";
125 std::unique_ptr<TTree> training( (TTree*)rootFile->Get(strBDTName.c_str()) );
126 m_BDT = std::make_unique<MVAUtils::BDT>(training.get());
127 }
128
132
133// Get the track selector tool from ToolSvc
134 ATH_CHECK( m_trkSelector.retrieve() );
135 ATH_MSG_DEBUG("Retrieved tool " << m_trkSelector);
136
137// Get the vertex point estimator tool from ToolSvc
138 ATH_CHECK( m_vertexEstimator.retrieve() );
139 ATH_MSG_DEBUG("Retrieved tool " << m_vertexEstimator);
140
141 if (m_masses == 1) {
142 auto gendata = std::make_shared<GenData>();
143 m_masspi = gendata->particleMass(MC::PIPLUS).value();
144 m_massp = gendata->particleMass(MC::PROTON).value();
145 m_masse = gendata->particleMass(MC::ELECTRON).value();
146 m_massK0S = gendata->particleMass(MC::K0S).value();
147 m_massLambda = gendata->particleMass(MC::LAMBDA0).value();
148 }
149
151 m_V0s_stored = 0;
152 m_Kshort_stored = 0;
154 m_Lambda_stored = 0;
155 m_Gamma_stored = 0;
156
157// making a concrete fitter for the V0Fitter
158 m_concreteVertexFitter = nullptr;
159 if (m_useV0Fitter) {
160 m_concreteVertexFitter = dynamic_cast<Trk::TrkV0VertexFitter * >(&(*m_iVertexFitter));
161 if (m_concreteVertexFitter == nullptr) {
162 ATH_MSG_FATAL("The vertex fitter passed is not a V0 Vertex Fitter");
163 return StatusCode::FAILURE;
164 }
165 }
166
167 ATH_CHECK(m_RelinkContainers.initialize());
168
169 ATH_MSG_DEBUG( "Initialization successful" );
170
171 return StatusCode::SUCCESS;
172}
173
175 xAOD::VertexContainer* ksContainer,
176 xAOD::VertexContainer* laContainer,
177 xAOD::VertexContainer* lbContainer,
178 const xAOD::Vertex* primaryVertex,
179 const xAOD::VertexContainer* vertColl,
180 const EventContext& ctx
181 ) const
182{
183
184 ATH_MSG_DEBUG( "InDetV0FinderTool::performSearch" );
185 std::vector<const xAOD::TrackParticleContainer*> trackCols;
186 for(const auto &str : m_RelinkContainers){
188 trackCols.push_back(handle.cptr());
189 }
190
192
193 //Retrieve vertices for overlap removal
195 if (!vertices.isValid())
196 {
197 ATH_MSG_WARNING("Primary vertex container with key " << m_vertexKey.key() << " not found");
198 return StatusCode::SUCCESS;
199 }
200
201// Retrieve track particles from StoreGate
203 if ( !TPC.isValid() )
204 {
205 ATH_MSG_ERROR("Input TrackParticle collection is invalid!");
206 return StatusCode::SUCCESS;
207 }
208 ATH_MSG_DEBUG("Track particle container size " << TPC->size());
209
210 if (m_use_vertColl) {
211 ATH_MSG_DEBUG("Vertex container size " << vertColl->size());
212 }
213 Amg::Vector3D beamspot;
215 auto beamSpotHandle = SG::ReadCondHandle(m_beamSpotKey, ctx);
216 beamspot = beamSpotHandle->beamPos();
217 }else{
221 beamspot = Amg::Vector3D(beamPosX(0), beamPosY(0), beamPosZ(0));
222 }
223// track preselection
224 std::vector<const xAOD::TrackParticle*> posTracks; posTracks.clear();
225 std::vector<const xAOD::TrackParticle*> negTracks; negTracks.clear();
226 const xAOD::Vertex* vx = nullptr;
227 if (m_pv && primaryVertex) vx = primaryVertex;
228
229 if (TPC->size() > 1) {
231 for ( tpIt=TPC->begin(); tpIt!=TPC->end(); ++tpIt )
232 {
233 const xAOD::TrackParticle* TP = (*tpIt);
234 double charge = TP->charge();
235
236 if (m_trkSelector->decision(*TP, vx) || (!m_useTrkSel))
237 {
238 //PV Track Overlap Selections
239 const xAOD::Vertex* foundVertex { nullptr };
240 if (m_useorigin)
241 {
242 for (const auto *const vx : *vertices)
243 {
244 for (const auto& tpLink : vx->trackParticleLinks())
245 {
246 if (*tpLink == TP)
247 {
248 foundVertex = vx;
249 break;
250 }
251 }
252 if (foundVertex) break;
253 }
254 }
255 bool useTrack = false;
256 if (!m_useorigin) useTrack = true;
257 if (m_useorigin && foundVertex == nullptr) useTrack = true;
258 if (!useTrack) continue;
259
260
261 //d0 Selections
262 bool d0wrtVertex = true;
263 if (m_use_vertColl) {
264 if ( !d0Pass(TP,vertColl, ctx) ) d0wrtVertex = false;
265 }
266 if (!m_use_vertColl && m_pv) {
267 if (primaryVertex) {
268 if ( !d0Pass(TP,primaryVertex, ctx) ) d0wrtVertex = false;
269 } else {
270 if ( !d0Pass(TP,beamspot, ctx) ) d0wrtVertex = false;
271 }
272 }
273 if (!d0wrtVertex) continue;
274
275 if (m_samesign) {
276 posTracks.push_back(TP);
277 negTracks.push_back(TP);
278 } else {
279 if (charge > 0) {
280 posTracks.push_back(*tpIt);
281 } else {
282 negTracks.push_back(*tpIt);
283 }
284 }
285 }
286 }
287 }
288 ATH_MSG_DEBUG("number of tracks passing preselection, positive " << posTracks.size() << " negative " << negTracks.size());
289
290 if (!posTracks.empty() && !negTracks.empty())
291 {
292
293
304
306
307 std::vector<const xAOD::TrackParticle*>::const_iterator tpIt1;
308 std::vector<const xAOD::TrackParticle*>::const_iterator tpIt2;
309 unsigned int i1 = 0;
310 for (tpIt1 = posTracks.begin(); tpIt1 != posTracks.end(); ++tpIt1)
311 {
312 const xAOD::TrackParticle* TP1 = (*tpIt1);
313 uint8_t temp1(0);
314 uint8_t nclus1(0);
315 if ( TP1->summaryValue( temp1 , xAOD::numberOfPixelHits) ) nclus1 += temp1;
316 if ( TP1->summaryValue( temp1 , xAOD::numberOfSCTHits) ) nclus1 += temp1;
317 double pt1 = TP1->pt();
318
319 unsigned int i2 = 0;
320 for (tpIt2 = negTracks.begin(); tpIt2 != negTracks.end(); ++tpIt2)
321 {
322 if (*tpIt1 == *tpIt2) continue;
323 if (m_samesign && i1 <= i2) continue;
324
325 const xAOD::TrackParticle* TP2 = (*tpIt2);
326 uint8_t temp2(0);
327 uint8_t nclus2(0);
328 if ( TP2->summaryValue( temp2 , xAOD::numberOfPixelHits) ) nclus2 += temp2;
329 if ( TP2->summaryValue( temp2 , xAOD::numberOfSCTHits) ) nclus2 += temp2;
330 ATH_MSG_DEBUG("nclus1 " << (int)nclus1 << " nclus2 " << (int)nclus2);
331
332 if (!m_useTRTplusTRT && nclus1 == 0 && nclus2 == 0) continue;
333 if (!m_useTRTplusSi && (nclus1 == 0 || nclus2 == 0)) continue;
334
335 double pt2 = TP2->pt();
336
337 bool trk_cut1 = false;
338 bool trk_cut2 = false;
339 if (nclus1 != 0) trk_cut1 = true;
340 if (nclus1 == 0 && pt1 >= m_ptTRT) trk_cut1 = true;
341 if (!trk_cut1) continue;
342 if (nclus2 != 0) trk_cut2 = true;
343 if (nclus2 == 0 && pt2 >= m_ptTRT) trk_cut2 = true;
344 if (!trk_cut2) continue;
345
346// find a starting point
347 const Trk::Perigee& aPerigee1 = TP1->perigeeParameters();
348 const Trk::Perigee& aPerigee2 = TP2->perigeeParameters();
349 int sflag = 0;
350 int errorcode = 0;
351 Amg::Vector3D startingPoint = m_vertexEstimator->getCirclesIntersectionPoint(&aPerigee1,&aPerigee2,sflag,errorcode);
352 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
353 bool errorCode = false;
354 if (errorcode == 0 || errorcode == 5 || errorcode == 6 || errorcode == 8) errorCode = true;
355 if (!errorCode) continue;
356
357 //re-do d0 selection if using m_use_vertColl to ensure both tracks pass for the SAME vertex
358 bool d0wrtVertex = true;
359 if (m_use_vertColl) {
360 if ( !d0Pass(TP1,TP2,vertColl, ctx) ) d0wrtVertex = false;
361 }
362 if (!d0wrtVertex) continue;
363
364
365// pair pre-selection cuts
366 if ( doFit(TP1,TP2,startingPoint, ctx) )
367 {
368 std::vector<const xAOD::TrackParticle*> pairV0;
369 pairV0.clear();
370 pairV0.push_back(TP1);
371 pairV0.push_back(TP2);
372
373// vertex fit
374 ATH_MSG_DEBUG("unconstrained fit now");
375
376 std::unique_ptr<xAOD::Vertex> myVxCandidate;
377 if (m_useV0Fitter) {
378 myVxCandidate = m_concreteVertexFitter->fit(ctx, pairV0, startingPoint);
379 } else {
380 myVxCandidate = m_iVKVertexFitter->fit(ctx, pairV0, startingPoint);
381 }
382
383 if (myVxCandidate)
384 {
385 myVxCandidate->setVertexType(xAOD::VxType::V0Vtx);
386 if ( (m_V0Tools->vertexProbability(myVxCandidate.get()) >= m_minVertProb) || (m_useBDT) ) // If using BDT selections, it makes VertProb Selections
387 {
388 bool doKshortFit = false;
389 doKshortFit = doMassFit(myVxCandidate.get(),310);
390 bool doLambdaFit = false;
391 doLambdaFit = doMassFit(myVxCandidate.get(),3122);
392 bool doLambdabarFit = false;
393 doLambdabarFit = doMassFit(myVxCandidate.get(),-3122);
394 float score = 0; // BDT score variable
395 if (doKshortFit || doLambdaFit || doLambdabarFit)
396 {
397 bool pointAtVert = true;
398 if (m_use_vertColl) {
399 if ( !pointAtVertexColl(myVxCandidate.get(),vertColl,score) ) pointAtVert = false;
400 }
401 if (!m_use_vertColl && m_pv && primaryVertex) {
402 if ( !pointAtVertex(myVxCandidate.get(),primaryVertex,score) ) pointAtVert = false;
403 }
404 if (m_doSimpleV0) pointAtVert = true;
405 if (pointAtVert)
406 {
407 Amg::Vector3D vertex = m_V0Tools->vtx(myVxCandidate.get());
408
409 std::unique_ptr<xAOD::Vertex> myKshort;
410 std::unique_ptr<xAOD::Vertex> myLambda;
411 std::unique_ptr<xAOD::Vertex> myLambdabar;
412 std::unique_ptr<xAOD::Vertex> myGamma;
413 bool foundKshort = false;
414 bool foundLambda = false;
415 bool foundLambdabar = false;
416
417 if (doKshortFit && !m_doSimpleV0) {
418 myKshort = massFit(ctx, 310, pairV0, vertex);
419 if (myKshort) {
420 if (m_V0Tools->vertexProbability(myKshort.get()) >= m_minConstrVertProb) {
421 myKshort->setVertexType(xAOD::VxType::V0Vtx);
422 foundKshort = true;
423 }
424 }
425 }
426
427 if (doLambdaFit && !m_doSimpleV0) {
428 myLambda = massFit(ctx, 3122, pairV0, vertex);
429 if (myLambda) {
430 if (m_V0Tools->vertexProbability(myLambda.get()) >= m_minConstrVertProb) {
431 myLambda->setVertexType(xAOD::VxType::V0Vtx);
432 foundLambda = true;
433 }
434 }
435 }
436
437 if (doLambdabarFit && !m_doSimpleV0) {
438 myLambdabar = massFit(ctx, -3122, pairV0, vertex);
439 if (myLambdabar) {
440 if (m_V0Tools->vertexProbability(myLambdabar.get()) >= m_minConstrVertProb) {
441 myLambdabar->setVertexType(xAOD::VxType::V0Vtx);
442 foundLambdabar = true;
443 }
444 }
445 }
446
447 bool doGamma = false;
448 int gamma_fit = 0;
449 double gamma_prob = -1., gamma_mass = -1., gamma_massErr = -1.;
450 if (foundKshort || foundLambda || foundLambdabar) doGamma = true;
451
456
457 if (m_doSimpleV0 || (!m_doSimpleV0 && doGamma)) {
458 m_V0s_stored++;
459 myVxCandidate->clearTracks();
460 ElementLink<xAOD::TrackParticleContainer> newLink1 = makeLink(*tpIt1, trackCols);
461 ElementLink<xAOD::TrackParticleContainer> newLink2 = makeLink(*tpIt2, trackCols);
462 myVxCandidate->addTrackAtVertex(newLink1);
463 myVxCandidate->addTrackAtVertex(newLink2);
464 v0Container->push_back(myVxCandidate.release());
465
466 v0_BDTScore( *(v0Container->back()) ) = score;// decorate w/ bdt score
467
468 if (foundKshort && !m_doSimpleV0) {
470 myKshort->clearTracks();
471 ElementLink<xAOD::TrackParticleContainer> ksLink1 = makeLink(*tpIt1, trackCols);
472 ElementLink<xAOD::TrackParticleContainer> ksLink2 = makeLink(*tpIt2, trackCols);
473 myKshort->addTrackAtVertex(ksLink1);
474 myKshort->addTrackAtVertex(ksLink2);
475 ksContainer->push_back(myKshort.release());
476
477 v0Link.setElement(v0Container->back());
478 v0Link.setStorableObject(*v0Container);
479 v0LinksDecorks(*(ksContainer->back())) = v0Link;
480
481 ksLink.setElement(ksContainer->back());
482 ksLink.setStorableObject(*ksContainer);
483 v0_ksLinksDecor(*(v0Container->back())) = ksLink;
484 } else {
485 v0_ksLinksDecor(*(v0Container->back())) = ksLink;
486 }
487 if (foundLambda && !m_doSimpleV0) {
489 myLambda->clearTracks();
490 ElementLink<xAOD::TrackParticleContainer> laLink1 = makeLink(*tpIt1, trackCols);
491 ElementLink<xAOD::TrackParticleContainer> laLink2 = makeLink(*tpIt2, trackCols);
492 myLambda->addTrackAtVertex(laLink1);
493 myLambda->addTrackAtVertex(laLink2);
494 laContainer->push_back(myLambda.release());
495
496 v0Link.setElement(v0Container->back());
497 v0Link.setStorableObject(*v0Container);
498 v0LinksDecorlb(*(laContainer->back())) = v0Link;
499
500 laLink.setElement(laContainer->back());
501 laLink.setStorableObject(*laContainer);
502 v0_laLinksDecor(*(v0Container->back())) = laLink;
503 } else {
504 v0_laLinksDecor(*(v0Container->back())) = laLink;
505 }
506 if (foundLambdabar && !m_doSimpleV0) {
508 myLambdabar->clearTracks();
509 ElementLink<xAOD::TrackParticleContainer> lbLink1 = makeLink(*tpIt1, trackCols);
510 ElementLink<xAOD::TrackParticleContainer> lbLink2 = makeLink(*tpIt2, trackCols);
511 myLambdabar->addTrackAtVertex(lbLink1);
512 myLambdabar->addTrackAtVertex(lbLink2);
513 lbContainer->push_back(myLambdabar.release());
514
515 v0Link.setElement(v0Container->back());
516 v0Link.setStorableObject(*v0Container);
517 v0LinksDecorlbb(*(lbContainer->back())) = v0Link;
518
519 lbLink.setElement(lbContainer->back());
520 lbLink.setStorableObject(*lbContainer);
521 v0_lbLinksDecor(*(v0Container->back())) = lbLink;
522 } else {
523 v0_lbLinksDecor(*(v0Container->back())) = lbLink;
524 }
525 if (doGamma && !m_doSimpleV0) {
526 myGamma = massFit(ctx, 22, pairV0, vertex);
527 if (myGamma && m_V0Tools->vertexProbability(myGamma.get()) >= m_minConstrVertProb) {
528 gamma_fit = 1;
529 gamma_prob = m_V0Tools->vertexProbability(myGamma.get());
530 gamma_mass = m_V0Tools->invariantMass(myGamma.get(),m_masse,m_masse);
531 gamma_massErr = m_V0Tools->invariantMassError(myGamma.get(),m_masse,m_masse);
532 }
533
534 mDecor_gfit( *(v0Container->back()) ) = gamma_fit;
535 mDecor_gmass( *(v0Container->back()) ) = gamma_mass;
536 mDecor_gmasserr( *(v0Container->back()) ) = gamma_massErr;
537 mDecor_gprob( *(v0Container->back()) ) = gamma_prob;
538 }
539 }
540
541 } // pointAtVert
542
543 } // in mass window (doMassFit)
544
545 } // chi2 cut failed
546 } else { // unconstrained fit failed
547 ATH_MSG_DEBUG("Fitter failed!");
548 }
549
550 } // doFit
551
552 i2++;
553 } // loop over negative tracks
554 i1++;
555 } // loop over positive tracks
556
557 } // posTracks.size() > 0 && negTracks.size() > 0
558
559 if (v0Container->empty()) ATH_MSG_DEBUG("No Candidates found. Empty container returned");
560 if (ksContainer->empty()) ATH_MSG_DEBUG("No Kshort Candidates found. Empty container returned");
561 if (laContainer->empty()) ATH_MSG_DEBUG("No Lambda Candidates found. Empty container returned");
562 if (lbContainer->empty()) ATH_MSG_DEBUG("No Lambdabar Candidates found. Empty container returned");
563
564 return StatusCode::SUCCESS;
565}
566
568{
569 msg(MSG::DEBUG)
570 << "----------------------------------------------------------------------------------------------------------------------------------------------" << endmsg
571 << "\tSummary" << endmsg
572 << "\tProcessed : " << m_events_processed << " events" << endmsg
573 << "\tStored : " << m_V0s_stored << " V0s" << endmsg
574 << "\tof which : " << m_Kshort_stored << " Kshorts" << endmsg
575 << "\t : " << m_Lambda_stored << " Lambdas" << endmsg
576 << "\t : " << m_Lambdabar_stored << " Lambdabars" << endmsg;
577 msg(MSG::DEBUG) << "----------------------------------------------------------------------------------------------------------------------------------------------" << endmsg;
578
579 return StatusCode::SUCCESS;
580}
581
582void InDetV0FinderTool::SGError(const std::string& errService) const
583{
584 ATH_MSG_FATAL(errService << " not found. Exiting !");
585}
586
587
589 Amg::Vector3D &startingPoint, const EventContext& ctx) const
590{
591 bool pass = false;
592 double srxy = startingPoint.perp();
593 if (srxy <= m_maxsxy)
594 {
595 double massKshort_i=2000001., massLambda_i=2000001., massLambdabar_i=2000001.;
596 const Amg::Vector3D& globalPosition = startingPoint;
597 Trk::PerigeeSurface perigeeSurface(globalPosition);
598 std::vector<std::unique_ptr<const Trk::TrackParameters> > cleanup;
599 const Trk::TrackParameters* extrapolatedPerigee1(nullptr);
600 const Trk::TrackParameters* extrapolatedPerigee2(nullptr);
601 extrapolatedPerigee1 = m_extrapolator->extrapolate(ctx,track1->perigeeParameters(), perigeeSurface).release();
602 if (extrapolatedPerigee1 == nullptr) extrapolatedPerigee1 = &track1->perigeeParameters();
603 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee1));
604
605 extrapolatedPerigee2 = m_extrapolator->extrapolate(ctx,track2->perigeeParameters(), perigeeSurface).release();
606 if (extrapolatedPerigee2 == nullptr) extrapolatedPerigee2 = &track2->perigeeParameters();
607 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee2));
608
609 if (extrapolatedPerigee1 != nullptr && extrapolatedPerigee2 != nullptr) {
610 massKshort_i = invariantMass(extrapolatedPerigee1,extrapolatedPerigee2,m_masspi,m_masspi);
611 massLambda_i = invariantMass(extrapolatedPerigee1,extrapolatedPerigee2,m_massp,m_masspi);
612 massLambdabar_i = invariantMass(extrapolatedPerigee1,extrapolatedPerigee2,m_masspi,m_massp);
613 if ( ((massKshort_i >= m_uksmin && massKshort_i <= m_uksmax) ||
614 (massLambda_i >= m_ulamin && massLambda_i <= m_ulamax) ||
615 (massLambdabar_i >= m_ulamin && massLambdabar_i <= m_ulamax)) ) pass = true;
616 }
617 }
618
619 return pass;
620}
621
622bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::VertexContainer * vertColl, const EventContext& ctx) const
623{
624 bool pass = false;
625 int count = 0;
626 bool hasInnerPixHit1 = true;
627 bool hasInnerPixHit2 = true;
629 SG::AuxElement::ConstAccessor<uint8_t> numberOfInnermostPixelLayerHits("numberOfInnermostPixelLayerHits");
630 uint8_t nInnerHits1 = numberOfInnermostPixelLayerHits(*track1);
631 if (nInnerHits1 == 0) hasInnerPixHit1 = false;
632 uint8_t nInnerHits2 = numberOfInnermostPixelLayerHits(*track2);
633 if (nInnerHits2 == 0) hasInnerPixHit2 = false;
634 }
635 for (auto vItr=vertColl->begin(); vItr!=vertColl->end(); ++vItr )
636 {
637 const xAOD::Vertex* PV = (*vItr);
638 auto per1 = m_trackToVertexTool->perigeeAtVertex(ctx, *track1, PV->position() );
639 if (per1 == nullptr) continue;
640 auto per2 = m_trackToVertexTool->perigeeAtVertex(ctx, *track2, PV->position() );
641 if (per2 == nullptr) continue;
642 double d0_1 = per1->parameters()[Trk::d0];
643 double sig_d0_1 = sqrt((*per1->covariance())(0,0));
644 double delta_z0_1 = track1->z0() + track1->vz() - PV->z();
645 double d0_2 = per2->parameters()[Trk::d0];
646 double sig_d0_2 = sqrt((*per2->covariance())(0,0));
647 double delta_z0_2 = track2->z0() + track2->vz() - PV->z();
648 bool IP_check1 = (std::abs(d0_1/sig_d0_1) > m_d0_cut) || !hasInnerPixHit1;
649 IP_check1 &= std::abs(d0_1) < m_max_d0_cut;
650 IP_check1 &= std::abs(delta_z0_1) < m_max_z0_cut;
651 bool IP_check2 = (std::abs(d0_2/sig_d0_2) > m_d0_cut) || !hasInnerPixHit2;
652 IP_check2 &= std::abs(d0_2) < m_max_d0_cut;
653 IP_check2 &= std::abs(delta_z0_2) < m_max_z0_cut;
654 if (IP_check1 && IP_check2) return true;
655 if (++count >= m_maxPV) break;
656 }
657 return pass;
658}
659
660bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::VertexContainer * vertColl, const EventContext& ctx) const
661{
662 bool pass = false;
663 int count = 0;
664 bool hasInnerPixHit1 = true;
666 SG::AuxElement::ConstAccessor<uint8_t> numberOfInnermostPixelLayerHits("numberOfInnermostPixelLayerHits");
667 uint8_t nInnerHits1 = numberOfInnermostPixelLayerHits(*track1);
668 if (nInnerHits1 == 0) hasInnerPixHit1 = false;
669 }
670 for (auto vItr=vertColl->begin(); vItr!=vertColl->end(); ++vItr )
671 {
672 const xAOD::Vertex* PV = (*vItr);
673 auto per1 = m_trackToVertexTool->perigeeAtVertex(ctx, *track1, PV->position() );
674 if (per1 == nullptr) continue;
675 double d0_1 = per1->parameters()[Trk::d0];
676 double sig_d0_1 = sqrt((*per1->covariance())(0,0));
677 double delta_z0_1 = track1->z0() + track1->vz() - PV->z();
678 if (((std::abs(d0_1/sig_d0_1) > m_d0_cut) ||
679 (!hasInnerPixHit1)) &&
680 (std::abs(d0_1) < m_max_d0_cut) &&
681 (std::abs(delta_z0_1) < m_max_z0_cut)) return true;
682 if (++count >= m_maxPV) break;
683 }
684 return pass;
685}
686
687bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::Vertex* PV, const EventContext& ctx) const
688{
689 bool pass = false;
690 bool hasInnerPixHit1 = true;
692 SG::AuxElement::ConstAccessor<uint8_t> numberOfInnermostPixelLayerHits("numberOfInnermostPixelLayerHits");
693 uint8_t nInnerHits1 = numberOfInnermostPixelLayerHits(*track1);
694 if (nInnerHits1 == 0) hasInnerPixHit1 = false;
695 }
696 auto per1 = m_trackToVertexTool->perigeeAtVertex(ctx, *track1, PV->position() );
697 if (per1 == nullptr) return pass;
698 double d0_1 = per1->parameters()[Trk::d0];
699 double sig_d0_1 = sqrt((*per1->covariance())(0,0));
700 double delta_z0_1 = track1->z0() + track1->vz() - PV->z();
701 if (((std::abs(d0_1/sig_d0_1) > m_d0_cut) ||
702 (!hasInnerPixHit1)) &&
703 (std::abs(d0_1) < m_max_d0_cut) &&
704 (std::abs(delta_z0_1) < m_max_z0_cut)) pass = true;
705 return pass;
706}
707
708bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const Amg::Vector3D& PV, const EventContext& ctx) const
709{
710 bool pass = false;
711 bool hasInnerPixHit1 = true;
713 SG::AuxElement::ConstAccessor<uint8_t> numberOfInnermostPixelLayerHits("numberOfInnermostPixelLayerHits");
714 uint8_t nInnerHits1 = numberOfInnermostPixelLayerHits(*track1);
715 if (nInnerHits1 == 0) hasInnerPixHit1 = false;
716 }
717 auto per1 = m_trackToVertexTool->perigeeAtVertex(ctx, *track1, PV );
718 if (per1 == nullptr) return pass;
719 double d0_1 = per1->parameters()[Trk::d0];
720 double sig_d0_1 = sqrt((*per1->covariance())(0,0));
721 double delta_z0_1 = track1->z0() + track1->vz() - PV.z();
722 if (((std::abs(d0_1/sig_d0_1) > m_d0_cut) ||
723 (!hasInnerPixHit1)) &&
724 (std::abs(d0_1) < m_max_d0_cut) &&
725 (std::abs(delta_z0_1) < m_max_z0_cut)) pass = true;
726 return pass;
727}
728
729bool InDetV0FinderTool::pointAtVertex(const xAOD::Vertex* v0, const xAOD::Vertex* PV, float &score) const
730{
731 bool pass = false;
732 float v0lxy = m_V0Tools->lxy(v0,PV);
733 float v0lxyError = m_V0Tools->lxyError(v0,PV);
734 float cos = m_V0Tools->cosTheta(v0,PV);
735 float v0a0xy = m_V0Tools->a0xy(v0,PV);
736 float v0a0z = m_V0Tools->a0z(v0,PV);
737 if (m_useBDT){
738 float prob = m_V0Tools->vertexProbability(v0);
739 float nLogProb = 999999;
740 if (prob>0) nLogProb = -1*log10f(prob); //bdt model uses the log, not the raw value
741 std::vector<float> bdt_vars = {
742 nLogProb,
743 std::abs(v0a0xy),
744 std::abs(v0a0z),
745 v0lxy,
746 v0lxy/v0lxyError,
747 cos};
748 float this_Score=m_BDT->GetClassification(bdt_vars);
749 if (this_Score > score) {
750 score = this_Score;
751 }
752 if (score > m_BDTCut){
753 pass = true;
754 }
755 }
756 else if (v0lxy/v0lxyError > m_vert_lxy_sig && cos > m_vert_cos_cut &&
757 std::abs(v0a0xy) < m_vert_a0xy_cut && std::abs(v0a0z) < m_vert_a0z_cut &&
758 v0lxy < m_vert_lxy_cut) pass = true;
759 return pass;
760}
761
762bool InDetV0FinderTool::pointAtVertexColl(xAOD::Vertex* v0, const xAOD::VertexContainer * vertColl, float &score) const
763{
764 bool pass = false;
766 for ( vItr=vertColl->begin(); vItr!=vertColl->end(); ++vItr ) { if (pointAtVertex(v0,(*vItr),score)) pass = true; }
767 return pass;
768}
769
770double InDetV0FinderTool::invariantMass(const Trk::TrackParameters* per1, const Trk::TrackParameters* per2, double m1, double m2)
771{
772 double e1sq = per1->momentum().mag2() + m1*m1;
773 double e1 = (e1sq>0.) ? sqrt(e1sq) : 0.;
774 double e2sq = per2->momentum().mag2() + m2*m2;
775 double e2 = (e2sq>0.) ? sqrt(e2sq) : 0.;
776 double p = (per1->momentum()+per2->momentum()).mag();
777 double msq = (e1+e2+p)*(e1+e2-p);
778 double mass = (msq>0.) ? sqrt(msq) : 0.;
779 return mass;
780}
781
782bool InDetV0FinderTool::doMassFit(xAOD::Vertex* vxCandidate, int pdgID) const
783{
784 bool pass = false;
785 double mass = 1000000000.;
786 double error = 1000000001.;
787 bool in_mass_window = false;
788 double winmass_min = 0., winmass_max = 0.;
789
790 if (pdgID == 310) {
791 winmass_min = m_ksmin;
792 winmass_max = m_ksmax;
793 mass = m_V0Tools->invariantMass(vxCandidate,m_masspi,m_masspi);
794 error = m_V0Tools->invariantMassError(vxCandidate,m_masspi,m_masspi);
795 if (mass >= winmass_min && mass <= winmass_max && error <= m_errmass) in_mass_window = true;
796 } else if (pdgID == 3122 || pdgID == -3122) {
797 winmass_min = m_lamin;
798 winmass_max = m_lamax;
799 if (pdgID == 3122) {
800 mass = m_V0Tools->invariantMass(vxCandidate,m_massp,m_masspi);
801 error = m_V0Tools->invariantMassError(vxCandidate,m_massp,m_masspi);
802 } else if (pdgID == -3122) {
803 mass = m_V0Tools->invariantMass(vxCandidate,m_masspi,m_massp);
804 error = m_V0Tools->invariantMassError(vxCandidate,m_masspi,m_massp);
805 }
806 if (mass >= winmass_min && mass <= winmass_max && error <= m_errmass) in_mass_window = true;
807 }
808 if (in_mass_window) pass = true;
809
810 return pass;
811}
812
813std::unique_ptr<xAOD::Vertex> InDetV0FinderTool::massFit(const EventContext& ctx, int pdgID, const std::vector<const xAOD::TrackParticle*> &pairV0, const Amg::Vector3D &vertex) const
814{
815 std::unique_ptr<xAOD::Vertex> vxCandidate;
816 std::vector<double> masses;
817 if (pdgID == 310) {
818 masses.push_back(m_masspi);
819 masses.push_back(m_masspi);
820 } else if (pdgID == 3122) {
821 masses.push_back(m_massp);
822 masses.push_back(m_masspi);
823 } else if (pdgID == -3122) {
824 masses.push_back(m_masspi);
825 masses.push_back(m_massp);
826 } else if (pdgID == 22) {
827 masses.push_back(m_masse);
828 masses.push_back(m_masse);
829 }
830
831 if (pdgID == 22) {
832 vxCandidate = m_iGammaFitter->fit(ctx, pairV0, vertex);
833 }
834 if (pdgID == 310) {
835 if (m_useV0Fitter) {
836 vxCandidate = m_concreteVertexFitter->fit(ctx, pairV0, masses, m_massK0S, nullptr, vertex);
837 } else {
838 vxCandidate = m_iKshortFitter->fit(ctx, pairV0, vertex);
839 }
840 }
841 if (pdgID == 3122) {
842 if (m_useV0Fitter) {
843 vxCandidate = m_concreteVertexFitter->fit(ctx, pairV0, masses, m_massLambda, nullptr, vertex);
844 } else {
845 vxCandidate = m_iLambdaFitter->fit(ctx, pairV0, vertex);
846 }
847 }
848 if (pdgID == -3122) {
849 if (m_useV0Fitter) {
850 vxCandidate = m_concreteVertexFitter->fit(ctx, pairV0, masses, m_massLambda, nullptr, vertex);
851 } else {
852 vxCandidate = m_iLambdabarFitter->fit(ctx, pairV0, vertex);
853 }
854 }
855
856 return vxCandidate;
857}
858
860 const std::vector<const xAOD::TrackParticleContainer*>& trackcols) const
861{
863 Link.setElement(tp);
864 bool elementSet = false;
865 if(trackcols.empty()){
866 Link.setStorableObject( *dynamic_cast<const xAOD::TrackParticleContainer*>( tp->container() ) );
867 elementSet = true;
868 } else {
869 for(const xAOD::TrackParticleContainer* trkcol : trackcols){
870 auto itr = std::find(trkcol->begin(), trkcol->end(), tp);
871 if(itr != trkcol->end()){
872 Link.setStorableObject(*trkcol, true);
873 elementSet = true;
874 break;
875 }
876 }
877 }
878 if(!elementSet) ATH_MSG_ERROR("Track was not found when linking");
879 return Link;
880}
881
882
883}//end of namespace InDet
884
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
ATLAS-specific HepMC functions.
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
MsgStream & msg() const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const T * back() const
Access the last element in the collection as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
bool doMassFit(xAOD::Vertex *vxCandidate, int pdgID) const
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_v0LinksDecorkeyks
BooleanProperty m_useTRTplusSi
= use TRT+Si pairs (true)
BooleanProperty m_useorigin
= true only using tracks that have no vertex association (true)
DoubleProperty m_masspi
pion mass (139.57 MeV)
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_v0_lbLinksDecorkey
const Trk::TrkV0VertexFitter * m_concreteVertexFitter
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_mDecor_gfit
std::atomic< unsigned int > m_events_processed
void SGError(const std::string &errService) const
std::atomic< unsigned int > m_Kshort_stored
DoubleProperty m_vert_cos_cut
V0 cos(theta) angle between displacement and momentum (>0.).
DoubleProperty m_d0_cut
track d0 significance wrt a vertex (>2.)
DoubleProperty m_ksmin
min Kshort mass (400.
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_mDecor_gprob
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_v0LinksDecorkeylbb
SG::ReadHandleKeyArray< xAOD::TrackParticleContainer > m_RelinkContainers
DoubleProperty m_ulamax
max Lambda mass, unconstrained fit (1200.
DoubleProperty m_ksmax
max Kshort mass (600.
DoubleProperty m_vert_a0z_cut
V0 |a0z| wrt a vertex (<15.).
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
Gaudi::Property< int > m_maxPV
DoubleProperty m_lamax
max Lambda mass (1200.
bool pointAtVertex(const xAOD::Vertex *v0, const xAOD::Vertex *PV, float &score) const
PublicToolHandle< Trk::IVertexFitter > m_iLambdabarFitter
bool pointAtVertexColl(xAOD::Vertex *v0, const xAOD::VertexContainer *vertColl, float &score) const
DoubleProperty m_vert_a0xy_cut
V0 |a0xy| wrt a vertex (<3.).
std::atomic< unsigned int > m_Lambda_stored
PublicToolHandle< Trk::ITrackSelectorTool > m_trkSelector
BooleanProperty m_doSimpleV0
= true equivalent to the old InDetSimpleV0Finder (false)
DoubleProperty m_max_z0_cut
track |z0| wrt a vertex (<999999.)
DoubleProperty m_minVertProb
Minimum vertex probability (0.0001).
BooleanProperty m_use_innerPixHits
= true select allows tracks with no innermost pixel layer hits to always pass d0 significance cut (fa...
PublicToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
PublicToolHandle< Trk::IVertexFitter > m_iKshortFitter
BooleanProperty m_samesign
= true select tracks with same sign (false)
DoubleProperty m_massLambda
Lambda mass (1115.68 MeV).
DoubleProperty m_ulamin
min Lambda mass, unconstrained fit (1000.
PublicToolHandle< Trk::IVertexFitter > m_iVKVertexFitter
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_mDecor_gmass
static double invariantMass(const Trk::TrackParameters *per1, const Trk::TrackParameters *per2, double m1, double m2)
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
DoubleProperty m_uksmax
max Kshort mass, unconstrained fit (600.
std::unique_ptr< xAOD::Vertex > massFit(const EventContext &ctx, int pdgID, const std::vector< const xAOD::TrackParticle * > &pairV0, const Amg::Vector3D &vertex) const
BooleanProperty m_useBDT
= true uses BDT selections in place of rectangular pointAtVertex + minVertProb
Gaudi::Property< std::string > m_lbKey
PublicToolHandle< Trk::IVertexFitter > m_iGammaFitter
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_v0_ksLinksDecorkey
IntegerProperty m_masses
= 1 if using PDG values, = 2 if user set (1)
std::atomic< unsigned int > m_Gamma_stored
SG::ReadDecorHandleKeyArray< xAOD::EventInfo > m_beamSpotDecoKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleKey
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_v0LinksDecorkeylb
BooleanProperty m_pv
= true select tracks wrt primary vertex (false)
Gaudi::Property< std::string > m_ksKey
PublicToolHandle< InDet::VertexPointEstimator > m_vertexEstimator
DoubleProperty m_maxsxy
Maximum Rxy of starting point (1000.
std::unique_ptr< MVAUtils::BDT > m_BDT
PublicToolHandle< Trk::IVertexFitter > m_iLambdaFitter
DoubleProperty m_BDTCut
BDT Score threshold.
std::atomic< unsigned int > m_V0s_stored
PublicToolHandle< Trk::IExtrapolator > m_extrapolator
DoubleProperty m_uksmin
min Kshort mass, unconstrained fit (400.
BooleanProperty m_useTRTplusTRT
= use TRT+TRT pairs (true)
PublicToolHandle< Trk::V0Tools > m_V0Tools
Gaudi::Property< std::string > m_v0Key
DoubleProperty m_vert_lxy_sig
V0 lxy significance wrt a vertex (>2.).
StatusCode performSearch(xAOD::VertexContainer *v0Container, xAOD::VertexContainer *ksContainer, xAOD::VertexContainer *laContainer, xAOD::VertexContainer *lbContainer, const xAOD::Vertex *vertex, const xAOD::VertexContainer *vertColl, const EventContext &ctx) const
DoubleProperty m_masse
electron mass (0.510999 MeV)
ElementLink< xAOD::TrackParticleContainer > makeLink(const xAOD::TrackParticle *, const std::vector< const xAOD::TrackParticleContainer * > &) const
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexKey
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_v0_BDTScore
DoubleProperty m_vert_lxy_cut
V0 lxy V0 lxy (<500.).
BooleanProperty m_use_vertColl
= true select tracks wrt a vertex collection (false)
DoubleProperty m_minConstrVertProb
Minimum vertex probability for constrained fit (0.0001).
DoubleProperty m_max_d0_cut
track |d0| wrt a vertex (<999999.)
StringProperty m_BDTFile
Filename of mvaUtils model file, located in /InDetV0FinderTool/BDT/v1/.
PublicToolHandle< Trk::IVertexFitter > m_iVertexFitter
BooleanProperty m_useV0Fitter
= true if using TrkV0Fitter, = false if using VKalVert (true)
InDetV0FinderTool(const std::string &t, const std::string &n, const IInterface *p)
DoubleProperty m_massK0S
Kshort mass (497.672 MeV).
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_mDecor_gmasserr
DoubleProperty m_lamin
min Lambda mass (1000.
DoubleProperty m_ptTRT
Minimum pT for TRT tracks (700.
bool doFit(const xAOD::TrackParticle *track1, const xAOD::TrackParticle *track2, Amg::Vector3D &startingPoint, const EventContext &ctx) const
BooleanProperty m_useTrkSel
= true uses TrackSelectorTool
bool d0Pass(const xAOD::TrackParticle *track1, const xAOD::TrackParticle *track2, const xAOD::VertexContainer *vertColl, const EventContext &ctx) const
Gaudi::Property< std::string > m_laKey
SG::WriteDecorHandleKey< xAOD::VertexContainer > m_v0_laLinksDecorkey
DoubleProperty m_massp
proton mass (938.272 MeV)
std::atomic< unsigned int > m_Lambdabar_stored
Gaudi::Property< bool > m_useBeamSpotCond
DoubleProperty m_errmass
Maximum mass error (100.
Handle class for reading a decoration on an object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Handle class for adding a decoration to an object.
const Amg::Vector3D & momentum() const
Access method for the momentum.
Class describing the Line to which the Perigee refers to.
This class implements a vertex fitting algorithm optimised for V0 finding.
float z0() const
Returns the parameter.
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
float vz() const
The z origin for the parameters.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float charge() const
Returns the charge.
float z() const
Returns the z position.
const TrackParticleLinks_t & trackParticleLinks() const
Get all the particles associated with the vertex.
const Amg::Vector3D & position() const
Returns the 3-pos.
bool doFit
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:148
Eigen::Matrix< double, 3, 1 > Vector3D
Primary Vertex Finder.
static const int ELECTRON
static const int K0S
static const int PIPLUS
static const int LAMBDA0
static const int PROTON
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ d0
Definition ParamDefs.h:63
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ V0Vtx
Vertex from V0 decay.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].