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