ATLAS Offline Software
Loading...
Searching...
No Matches
InDetDetailedTrackSelectorTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
8#include "VxVertex/Vertex.h"
11#include "TrkTrack/Track.h"
14
15#include "xAODTracking/Vertex.h"
16
17#include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
21#include <cmath>
22
23
24namespace InDet
25{
26
27 // ---------------------------------------------------------------------
28 InDetDetailedTrackSelectorTool::InDetDetailedTrackSelectorTool(const std::string& t, const std::string& n, const IInterface* p)
29 : AthAlgTool(t,n,p)
30 {
31 declareInterface<ITrackSelectorTool>(this);
32 }
33
35 {
38 if (evt.isValid()) {
39 InDet::BeamSpotData temp(evt->beamStatus(), evt->beamPosX(), evt->beamPosY(), evt->beamPosZ(),
40 evt->beamPosSigmaX(), evt->beamPosSigmaY(), evt->beamPosSigmaZ(),
41 evt->beamTiltXZ(), evt->beamTiltYZ(), evt->beamPosSigmaXY());
42 return new Trk::RecVertex(temp.beamVtx());
43 } else {
44 ATH_MSG_WARNING( " Cannot get beamSpot center from xAOD::EventInfo. Using (0,0,0)... " );
45 return new Trk::Vertex(Amg::Vector3D(0,0,0));
46 }
47 }else{
49 if (beamSpotHandle.isValid()) {
50 return new Trk::RecVertex(beamSpotHandle->beamVtx());
51 } else {
52 ATH_MSG_WARNING( " Cannot get beamSpot center from BeamSpotData. Using (0,0,0)... " );
53 return new Trk::Vertex(Amg::Vector3D(0,0,0));
54 }
55 }
56 }
57
58 // ---------------------------------------------------------------------
60 = default;
61
62 // ---------------------------------------------------------------------
63 StatusCode
65 if(m_trackSumTool.empty()){
66 ATH_MSG_DEBUG("No TrackSummaryTool set. OK if running on AOD.");
67 }
69 ATH_CHECK(m_trackSumTool.retrieve(DisableTool{!m_trackSumToolAvailable}));
70
72 ATH_MSG_DEBUG("No TrackParticleCreatorTool set but shared hit selection used. OK if running on AOD.");
73 }
75 ATH_CHECK(m_particleCreator.retrieve(DisableTool{!m_partCreatorToolAvailable}));
76
77 ATH_CHECK( m_extrapolator.retrieve() );
81 if(m_trtDCTool.empty()) {
82 ATH_MSG_ERROR(" Eta dependent cut on number of TRT hits requested but TrtDCCutTool not specified. ");
83 return StatusCode::FAILURE;
84 } else if(m_trtDCTool.retrieve().isFailure()) {
85 ATH_MSG_ERROR(" Unable to retrieve tool "<<m_trtDCTool);
86 return StatusCode::FAILURE;
87 }
88 ATH_MSG_DEBUG("Retrieved tool "<<m_trtDCTool);
90 ATH_MSG_DEBUG("Using eta dependent cut on number of TRT hits.");
91 }
93 ATH_MSG_DEBUG("Using eta dependent cut on number of TRT hits + outliers.");
94 }
95 }else{
96 m_trtDCTool.disable();
97 }
98
99 // Read handle for AtlasFieldCacheCondObj
101
102 ATH_MSG_DEBUG("Using cuts on the number of Silicon hits");
104 //checking whether sizes of cuts and pt interval expressed in vectors match
105 if( m_ptBenchmarks.size() != m_nSCTValues.size()){
106 ATH_MSG_ERROR( "Number of cuts DOES NOT match the number of intervals to apply. Please check jobOptions. ");
107 return StatusCode::FAILURE;
108 } else if (m_ptBenchmarks.empty()){
109 ATH_MSG_ERROR( "Zero vectors for number of cuts and pt intervals. Please check jobOptions. ");
110 return StatusCode::FAILURE;
111 }//end of vector size protection block
112 }//end of memory protection
113 return StatusCode::SUCCESS;
114 }
115
116 // ---------------------------------------------------------------------
118 {
119 ATH_MSG_DEBUG( "Finalize successful" );
120 return StatusCode::SUCCESS;
121 }
122
123 // ---------------------------------------------------------------------
124 bool
126
127 const EventContext& ctx = Gaudi::Hive::currentContext();
128
129 int nHitTrt = m_nHitTrt;
130 int nHitTrtPlusOutliers = m_nHitTrtPlusOutliers;
131 const Trk::Perigee* perigeeBeforeExtrapolation=dynamic_cast<const Trk::Perigee*>(track.perigeeParameters());
132 if (perigeeBeforeExtrapolation && m_usePreselectionCuts){
133 bool preselectionDecision=preselectionBeforeExtrapolation(*perigeeBeforeExtrapolation);
134 if (!preselectionDecision) {
135 ATH_MSG_DEBUG("Track rejected because of preselection decision!");
136 return false;
137 }
138 } else if (m_usePreselectionCuts){
139 ATH_MSG_DEBUG( " Preselection was requested but cannot be made since no Perigee in Track is available. This is not an error." );
140 }
141 const Trk::Vertex* myVertex=vertex;
142 //in case no Vertex is provided by the user, beam position will be used if available
143 if (myVertex==nullptr) {
144 myVertex = getBeamSpot(ctx);
145 }
146 Trk::PerigeeSurface perigeeSurface(myVertex->position());
147 const Trk::TrackParameters *firstmeaspar=nullptr;
148 for (const auto *i : *track.trackParameters()){
149 if ( i->covariance() && !dynamic_cast<const Trk::Perigee*>(i)) {
150 firstmeaspar=i;
151 break;
152 }
153 }
154 if (!firstmeaspar) {
155 //assumes perigeeParameters exist...
156 //no track selection if firstmeas + perigee does not exist !
157 firstmeaspar=track.perigeeParameters();
158 if (!firstmeaspar){
159 ATH_MSG_WARNING( " First measurment on track is missing. Using perigee Parameters, but they are missing: 0 pointer! Track selection failed " );
160 //clean up vertex
161 if (myVertex!=vertex) {
162 delete myVertex;
163 myVertex=nullptr;
164 }
165 return false;
166 }
167 }
168 const Trk::TrackParameters* extrapolatedParameters= m_extrapolator->extrapolate(ctx,
169 *firstmeaspar,
170 perigeeSurface,
172 true,
173 track.info().particleHypothesis() ).release();
174 const Trk::Perigee* extrapolatedPerigee = extrapolatedParameters ? dynamic_cast<const Trk::Perigee*>(extrapolatedParameters) : nullptr;
175 if (!extrapolatedPerigee || !extrapolatedPerigee->covariance() ) {
176 ATH_MSG_WARNING( "Track Selector failed to extrapolate track to the vertex: " << myVertex->position() );
177 if (extrapolatedParameters) {
178 ATH_MSG_WARNING( "The return object of the extrapolator was not a perigee even if a perigeeSurface was used!" );
179 delete extrapolatedParameters;
180 extrapolatedParameters=nullptr;
181 }
182 }
183
184 //decision based on the track parameters
185 const Trk::RecVertex* recVertex = dynamic_cast<const Trk::RecVertex*>(myVertex);
186 bool dec = decision(extrapolatedPerigee, recVertex ? &recVertex->covariancePosition() : nullptr );
187 if (myVertex!=vertex) {
188 delete myVertex;
189 myVertex=nullptr;
190 }
191 bool isInTrtAcceptance=true;
192 if (!extrapolatedPerigee || std::fabs(extrapolatedPerigee->momentum().eta())>m_TrtMaxEtaAcceptance) {
193 isInTrtAcceptance=false;
194 }
195 if (extrapolatedPerigee!=track.perigeeParameters()) {
196 delete extrapolatedPerigee;
197 extrapolatedPerigee=nullptr;
198 }
199 if(!dec) {
200 ATH_MSG_DEBUG("Track rejected because of perigee parameters!");
201 return false;
202 }
204 const Trk::FitQuality* TrkQuality=track.fitQuality();
205 if (TrkQuality==nullptr) {
206 ATH_MSG_WARNING( "Requested cut on track quality was not possible. Track has no FitQuality object attached. Selection failed." );
207 return false;
208 }
209 if (!decision(TrkQuality)) {
210 return false;
211 }
212 }
214 //number of hits, silicon hits, b-layer
215 // first ask track for summary
216 std::unique_ptr<Trk::TrackSummary> summaryUniquePtr;
217 const Trk::TrackSummary* summary = track.trackSummary();
218 if (m_trackSumToolAvailable && summary == nullptr) {
219 summaryUniquePtr = m_trackSumTool->summary(ctx, track);
220 summary = summaryUniquePtr.get();
221 }
222 if (nullptr==summary ) {
223 ATH_MSG_FATAL( "Track preselection: cannot create a track summary (but useTrackSummary is true). Selection failed." );
224 return false;
225 }
226
227 // Create xAOD::TrackParticle to retrieve shared hit info
228 const xAOD::TrackParticle* tp = m_partCreatorToolAvailable ? m_particleCreator->createParticle(ctx, track) : nullptr;
229 if(m_useSharedHitInfo && tp==nullptr){
230 ATH_MSG_FATAL( "Track preselection: cannot create a track particle (but useSharedHitInfo is true). Selection failed." );
231 return false;
232 }
233
234 // get the minimum nimber of TRT hits based on eta of the track
236 nHitTrt = m_trtDCTool->minNumberDCs( (*track.trackParameters())[0] );
237 if(m_addToMinHitTrt!=0){
238 nHitTrt += m_addToMinHitTrt;
239 }else{
240 nHitTrt = (int)((double)nHitTrt*m_scaleMinHitTrt);
241 }
242 }
243
244 // get the minimum nimber of TRT hits + outliers based on eta of the track
246 nHitTrtPlusOutliers = m_trtDCTool->minNumberDCs( (*track.trackParameters())[0] );
248 nHitTrtPlusOutliers += m_addToMinHitTrtWithOutliers;
249 }else{
250 nHitTrtPlusOutliers = (int)((double)nHitTrtPlusOutliers*m_scaleMinHitTrtWithOutliers);
251 }
252 }
253
254 if (!decision(summary, tp, m_useSharedHitInfo,isInTrtAcceptance, perigeeBeforeExtrapolation,
255 nHitTrt, nHitTrtPlusOutliers)) {
256 return false;
257 }
258 }
259 return true;
260 }
261
262 // ---------------------------------------------------------------------
263 bool
265
266 const EventContext& ctx = Gaudi::Hive::currentContext();
267
268 int nHitTrt = m_nHitTrt;
269 int nHitTrtPlusOutliers = m_nHitTrtPlusOutliers;
270 const Trk::TrackParameters* definintParameters=&(track.definingParameters());
271 const Trk::Perigee* perigeeBeforeExtrapolation=dynamic_cast<const Trk::Perigee*>(definintParameters);
272 if (perigeeBeforeExtrapolation && m_usePreselectionCuts) {
273 bool preselectionDecision=preselectionBeforeExtrapolation(*perigeeBeforeExtrapolation);
274 if (!preselectionDecision) {
275 ATH_MSG_DEBUG("Track rejected because of preselection decision!");
276 return false;
277 }
278 } else if (m_usePreselectionCuts) {
279 ATH_MSG_WARNING( " Preselection was requested but cannot be made since the Perigee is not the defining Parameter of the TrackParticle. This is not an error." );
280 }
281 bool isInTrtAcceptance=true;
282 if (!perigeeBeforeExtrapolation || std::fabs(perigeeBeforeExtrapolation->momentum().eta())>m_TrtMaxEtaAcceptance) {
283 isInTrtAcceptance=false;
284 }
286 const Trk::FitQuality* TrkQuality=track.fitQuality();
287 if (TrkQuality==nullptr) {
288 ATH_MSG_WARNING( "Requested cut on track quality was not possible. TrackParticleBase has no FitQuality object attached. Selection failed." );
289 return false;
290 }
291 if (!decision(TrkQuality)) {
292 return false;
293 }
294 }
296 //number of hits, silicon hits, b-layer
297 const Trk::TrackSummary* summary = track.trackSummary();
298 if (nullptr==summary ) {
299 ATH_MSG_WARNING( "Track preselection: cannot create a track summary (but useTrackSummary is true). Selection failed." );
300 return false;
301 }
302
303
304 if (m_useSharedHitInfo) {
305 ATH_MSG_ERROR( "Use of InDetDetailedTrackSelectorTool with Trk::TrackParticleBase and useSharedHitInfo is not supported");
306 return false;
307 }
308 const xAOD::TrackParticle* tp = nullptr;
309
311 nHitTrt = m_trtDCTool->minNumberDCs( (track.trackParameters())[0] );
312 if(m_addToMinHitTrt!=0){
313 nHitTrt += m_addToMinHitTrt;
314 }else{
315 nHitTrt = (int)((double)nHitTrt*m_scaleMinHitTrt);
316 }
317 }
318
320 nHitTrtPlusOutliers = m_trtDCTool->minNumberDCs( (track.trackParameters())[0] );
322 nHitTrtPlusOutliers += m_addToMinHitTrtWithOutliers;
323 }else{
324 nHitTrtPlusOutliers = (int)((double)nHitTrtPlusOutliers*m_scaleMinHitTrtWithOutliers);
325 }
326 }
327
328 if ((!perigeeBeforeExtrapolation) or
329 (!decision(summary, tp, m_useSharedHitInfo, isInTrtAcceptance, perigeeBeforeExtrapolation,
330 nHitTrt, nHitTrtPlusOutliers))) {
331 return false;
332 }
333 }
334 const Trk::Perigee* extrapolatedPerigee=dynamic_cast<const Trk::Perigee*>(definintParameters);
335 const Trk::Vertex* myVertex=vertex;
336 if (vertex==nullptr) {
337 myVertex = getBeamSpot(ctx);
338 }
339 Trk::PerigeeSurface perigeeSurface(myVertex->position());
340 const Trk::TrackParameters *firstmeaspar=nullptr;
341 for (const auto *i : track.trackParameters()) {
342 if (i->covariance() &&
343 !dynamic_cast<const Trk::Perigee*>(i)) {
344 firstmeaspar=i;
345 break;
346 }
347 }
348 if (!firstmeaspar) {
349 if (!extrapolatedPerigee || !extrapolatedPerigee->covariance() ) {
350 ATH_MSG_DEBUG( " Track Paraemters at first measurement not found. Perigee not found. Cannot do TrackSelection..." );
351 if (myVertex!=vertex) {
352 delete myVertex;
353 myVertex=nullptr;
354 }
355 return false;
356 }
357 //using perigee instead of firstmeasurement, since first measurement was not found...
358 firstmeaspar=&(track.definingParameters());
359 }
360
361 ATH_MSG_VERBOSE ("Input to extrapolation: " << *firstmeaspar);
362 ATH_MSG_VERBOSE ("Extrapolating to position: " << myVertex->position()[0] << " , " <<
363 myVertex->position()[1] << " , " << myVertex->position()[2]);
364 const Trk::TrackParameters* extrapolatedParameters= firstmeaspar ?
365 m_extrapolator->extrapolate(ctx,
366 *firstmeaspar,
367 perigeeSurface,
369 true,Trk::pion ).release() : nullptr;
370 extrapolatedPerigee = extrapolatedParameters ? dynamic_cast<const Trk::Perigee*>(extrapolatedParameters) : nullptr;
371 if (extrapolatedPerigee==nullptr || !extrapolatedPerigee->covariance()) {
372 ATH_MSG_WARNING( "Track Selector failed to extrapolate track to the vertex: " << myVertex->position() );
373 if (extrapolatedParameters) {
374 ATH_MSG_WARNING( "The return object of the extrapolator was not a perigee even if a perigeeSurface was used!" );
375 delete extrapolatedParameters;
376 extrapolatedParameters = nullptr;
377 }
378 }
379 if (extrapolatedParameters) ATH_MSG_VERBOSE ("Result: " << *extrapolatedParameters);
380 const Trk::RecVertex* recVertex = dynamic_cast<const Trk::RecVertex*>(myVertex);
381 bool dec = decision(extrapolatedPerigee, recVertex ? &recVertex->covariancePosition() : nullptr );
382 if (myVertex!=vertex) {
383 delete myVertex;
384 myVertex=nullptr;
385 }
386 if (extrapolatedPerigee!=&(track.definingParameters())) {
387 delete extrapolatedPerigee;
388 extrapolatedPerigee=nullptr;
389 }
390 if(!dec) {
391 ATH_MSG_DEBUG("Track rejected because of perigee parameters!");
392 return false;
393 }
394 return true;
395 }
396
398 {
399 if(vertex) return vertex->position();
402 if (evt.isValid()) {
403 InDet::BeamSpotData temp(evt->beamStatus(), evt->beamPosX(), evt->beamPosY(), evt->beamPosZ(),
404 evt->beamPosSigmaX(), evt->beamPosSigmaY(), evt->beamPosSigmaZ(),
405 evt->beamTiltXZ(), evt->beamTiltYZ(), evt->beamPosSigmaXY());
406 return temp.beamVtx().position();
407 } else {
408 ATH_MSG_WARNING( " Cannot get beamSpot center from xAOD::EventInfo. Using (0,0,0)... " );
409 return Amg::Vector3D(0,0,0);
410 }
411 }else{
413 if (beamSpotHandle.isValid()) {
414 return beamSpotHandle->beamVtx().position();
415 } else {
416 ATH_MSG_WARNING( " Cannot get beamSpot center from BeamSpotData. Using (0,0,0)... " );
417 return Amg::Vector3D(0,0,0);
418 }
419 }
420 }
421
422 // ---------------------------------------------------------------------
423 bool
425 {
426 const EventContext& ctx = Gaudi::Hive::currentContext();
427
428 int nHitTrt = m_nHitTrt;
429 int nHitTrtPlusOutliers = m_nHitTrtPlusOutliers;
430
431 const Trk::Perigee& perigee=tp.perigeeParameters();
433 ATH_MSG_DEBUG("Track rejected because of preselection decision!");
434 return false;
435 }
436
438 ATH_MSG_DEBUG("Track rejected because of bad fit quality!");
439 return false;
440 }
441
443 //number of hits, silicon hits, b-layer
444
446 nHitTrt = m_trtDCTool->minNumberDCs( &perigee );
447 if(m_addToMinHitTrt!=0){
448 nHitTrt += m_addToMinHitTrt;
449 }else{
450 nHitTrt = (int)((double)nHitTrt*m_scaleMinHitTrt);
451 }
452 }
454 nHitTrtPlusOutliers = m_trtDCTool->minNumberDCs( &perigee );
456 nHitTrtPlusOutliers += m_addToMinHitTrtWithOutliers;
457 }else{
458 nHitTrtPlusOutliers = (int)((double)nHitTrtPlusOutliers*m_scaleMinHitTrtWithOutliers);
459 }
460 }
462 int np = getCount(tp,xAOD::numberOfPixelHits );
464 int ns = getCount(tp,xAOD::numberOfSCTHits );
465 int nhp = getCount(tp,xAOD::numberOfPixelHoles );
466 int nhs = getCount(tp,xAOD::numberOfSCTHoles );
468 bool eiph = (getCount(tp,xAOD::expectInnermostPixelLayerHit)==1);
469
470 //**-----------------------------------------------------------------------
472 double pt = tp.pt();
473 unsigned int it = 0;
474 for(; it< m_ptBenchmarks.size()-1; ++it ) {
475 if(pt>m_ptBenchmarks[it] && pt <=m_ptBenchmarks[it+1] && ns < m_nSCTValues[it]) {
476 ATH_MSG_DEBUG("Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
477 return false;
478 }
479 }//end of pt intervals loop
480
481 //now cutting all the rest by the last value in the vector
482 if(pt>m_ptBenchmarks[it+1] && ns < m_nSCTValues[it+1]) {
483 ATH_MSG_DEBUG("Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
484 return false;
485 }
486 }
487
488 //*--------------------------------------------------------------------------------
489
490 //normal cuts in all their variety
491
492 if(nb == 0 && nb < m_nHitBLayer) {
493 ATH_MSG_DEBUG("Track rejected because of nHitBLayer "<<nb<<" < "<<m_nHitBLayer);
494 if (eiph) {
495 ATH_MSG_DEBUG("and track rejected because at least one hit is expected in the innermost pixel layer") ;
496 return false;
497 }else ATH_MSG_DEBUG("recovered track as no b-layer expected") ;
498 }//end of checking the b-layer
499
500 if(np+npd < m_nHitPix) {
501 ATH_MSG_DEBUG("Track rejected because of nHitPix "<<np+npd<<" < "<<m_nHitPix);
502 return false;
503 }
504
505 if(np < m_nHitPixPhysical) {
506 ATH_MSG_DEBUG("Track rejected because of nHitPixPhysical "<<np<<" < "<<m_nHitPixPhysical);
507 return false;
508 }
509
511 if(ns+nsd < m_nHitSct) {
512 ATH_MSG_DEBUG("Track rejected because of nHitSct "<<ns+nsd<<" < "<<m_nHitSct);
513 return false;
514 }
515
516 if(np+ns+npd+nsd < m_nHitSi) {
517 ATH_MSG_DEBUG("Track rejected because of nHitSi "<<np+npd+ns+nsd<<" < "<<m_nHitSi);
518 return false;
519 }
520
521 if(np+ns < m_nHitSiPhysical) {
522 ATH_MSG_DEBUG("Track rejected because of nHitSiPhysical "<<np+ns<<" < "<<m_nHitSiPhysical);
523 return false;
524 }
525
526 // Cuts on number of Holes
527 if (nhp+nhs > m_nHoles){
528 ATH_MSG_DEBUG("Track rejected because of nHolesPixPlusSCT "<<nhp+nhs<<" > "<<m_nHoles);
529 return false;
530 }
531
532 if(ndhs > m_nDoubleHoles){
533 ATH_MSG_DEBUG("Track rejected because of nDoubleHolesSCT "<<ndhs<<" > "<<m_nDoubleHoles);
534 return false;
535 }
536
537 if(nhp > m_nHolesPix){
538 ATH_MSG_DEBUG("Track rejected because of nHolesPix "<<nhp<<" > "<<m_nHolesPix);
539 return false;
540 }
541
542 if (nhs > m_nHolesSct){
543 ATH_MSG_DEBUG("Track rejected because of nHolesSct "<<nhs<<" > "<<m_nHolesSct);
544 return false;
545 }
546
547 if (std::fabs(tp.eta())>m_TrtMaxEtaAcceptance) {
548 int nh = getCount(tp,xAOD::numberOfTRTHits);
549 if(nh < nHitTrt) {
550 ATH_MSG_DEBUG("Track rejected because of nHitTrt "<<nh<<" < "<<nHitTrt);
551 return false;
552 }
553
555 if (nhh<nHitTrtPlusOutliers) {
556 ATH_MSG_DEBUG("Track rejected because of nHitTrtPlusOutliers "<<nhh<<" < "<<nHitTrtPlusOutliers);
557 return false;
558 }
559
561 if (nhthits<m_nHitTrtHighE) {
562 ATH_MSG_DEBUG("Track rejected because of nHitTrtHighE "<<nhthits<<" < "<<m_nHitTrtHighE);
563 return false;
564 }
565
567 if (nhthitsWithOutliers<m_nHitTrtPlusOutliersHighE) {
568 ATH_MSG_DEBUG("Track rejected because of nHitTrtPlusOutliersHighE "<<nhthitsWithOutliers<<" < "<<m_nHitTrtPlusOutliersHighE);
569 return false;
570 }
571
572 if ( getCount(tp, xAOD::numberOfTRTHits )>0) {
574 double den = getCount(tp, xAOD::numberOfTRTHits);
575 if (den == 0.)[[unlikely]]{
576 ATH_MSG_DEBUG("Track rejected because numberOfTRTHits is zero.");
577 return false;
578 }
579 nhe /= den;
580 if(nhe > m_nHitTrtHighEFraction ) {
581 ATH_MSG_DEBUG("Track rejected because of nHitTrtHighEFraction "<<nhe<<" < "<<m_nHitTrtHighEFraction);
582 return false;
583 }
584 }
585
589 if(nheh<0.) nheh=0.;
590 if (nheh>1.) nheh=1.;
592 ATH_MSG_DEBUG("Track rejected because of nHitTrtHighEFractionWithOutliers "<<nheh<<" < "<<m_nHitTrtHighEFractionWithOutliers);
593 return false;
594 }
595 }
596 }
597 if (m_useSharedHitInfo) {
599 if (nbs>1) nbs=1;
600 if(nbs>m_nSharedBLayer) {
601 ATH_MSG_DEBUG("Track rejected because of nSharedBLayer "<<nbs<<" < "<<m_nSharedBLayer);
602 return false;
603 }
604
606 if(nps>m_nSharedPix) {
607 ATH_MSG_DEBUG("Track rejected because of nSharedPix "<<nps<<" < "<<m_nSharedPix);
608 return false;
609 }
610
612 if(nss > m_nSharedSct) {
613 ATH_MSG_DEBUG("Track rejected because of nSharedSct "<<nss<<" < "<<m_nSharedSct);
614 return false;
615 }
616
617 int nst = nps + nss;
618 if(nst>m_nSharedSi) {
619 ATH_MSG_DEBUG("Track rejected because of nSharedSi "<<nst<<" < "<<m_nSharedSi);
620 return false;
621 }
622 }
623 }
624 Trk::PerigeeSurface perigeeSurface( getPosOrBeamSpot(vertex) );
625
626 const Trk::TrackParameters* extrapolatedParameters= m_extrapolator->extrapolate(
627 ctx,
628 perigee,perigeeSurface,
629 Trk::anyDirection,true,Trk::pion).release();
630 const Trk::Perigee* extrapolatedPerigee = extrapolatedParameters ? dynamic_cast<const Trk::Perigee*>(extrapolatedParameters) : nullptr;
631 if (extrapolatedPerigee==nullptr) {
632 ATH_MSG_WARNING( "Extrapolation to the vertex failed: " << perigeeSurface << std::endl << perigee );
633 if (extrapolatedParameters!=nullptr) {
634 ATH_MSG_WARNING( "The return object of the extrapolator was not a perigee even if a perigeeSurface was used!" );
635 delete extrapolatedParameters;
636 extrapolatedParameters=nullptr;
637 }
638 return false;
639 }
640 bool dec = false;
641 if( vertex ){
642 // for now copy the position error
643 const AmgSymMatrix(3)& vertexError = vertex->covariancePosition();
644 dec = decision(extrapolatedPerigee,&vertexError);
645 }else{
646 dec = decision(extrapolatedPerigee,nullptr);
647 }
648
649 delete extrapolatedPerigee;
650
651 if(!dec) {
652 ATH_MSG_DEBUG("Track rejected because of perigee parameters!");
653 return false;
654 }
655
656 return true;
657 }
658
659
660 // ---------------------------------------------------------------------
661 bool InDetDetailedTrackSelectorTool::decision(const Trk::Perigee* track,const AmgSymMatrix(3)* covariancePosition) const {
662
663 // checking pointer first
664 if(nullptr==track || !track->covariance()) {
665 ATH_MSG_WARNING( "Decision on measured perigee: Zero pointer to measured perigee passed. Selection failed." );
666 return false;
667 }
668
669 const AmgVector(5)& perigeeParms = track->parameters();
670
671 // only check pt if mag. field is on
672 const EventContext& ctx = Gaudi::Hive::currentContext();
674 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
675 if (fieldCondObj == nullptr) {
676 ATH_MSG_ERROR("execute: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
677 return false;
678 }
679 MagField::AtlasFieldCache fieldCache;
680 fieldCondObj->getInitializedCache (fieldCache);
681
682 if (fieldCache.solenoidOn()){//B field
683 if (perigeeParms[Trk::qOverP] == 0.) {
684 ATH_MSG_DEBUG("Track rejected because of qOverP == 0.");
685 return false;
686 }
687 double p = std::fabs(1./perigeeParms[Trk::qOverP]);
688 if (p<m_pMin) {
689 ATH_MSG_DEBUG("Track rejected because of p " << p << " < " << m_pMin);
690 return false;
691 }
692 double pt = p*std::sin(perigeeParms[Trk::theta]);
693 if (pt<m_pTMin) {
694 ATH_MSG_DEBUG("Track rejected because of pt " << pt << " < " << m_pTMin);
695 return false;
696 }
697 }
698
699 if (std::fabs(perigeeParms[Trk::d0]) > m_IPd0Max) {
700 ATH_MSG_DEBUG("Track rejected because of fabs(d0) " << std::fabs(perigeeParms[Trk::d0]) << " > " << m_IPd0Max);
701 return false;
702 }
703
704 if (std::fabs(perigeeParms[Trk::z0]*std::sin(perigeeParms[Trk::theta])) > m_IPz0Max) {
705 ATH_MSG_DEBUG("Track rejected because of fabs(z0*sin(theta)) " << std::fabs(perigeeParms[Trk::z0]*std::sin(perigeeParms[Trk::theta])) << " > " << m_IPz0Max);
706 return false;
707 }
708
709 if (std::fabs(perigeeParms[Trk::z0]) > m_z0Max) {
710 ATH_MSG_DEBUG("Track rejected because of fabs(z0) " << std::fabs(perigeeParms[Trk::z0]) << " > " << m_z0Max);
711 return false;
712 }
713
714 if (sqrt( (*track->covariance())(Trk::z0,Trk::z0) )*std::sin(perigeeParms[Trk::theta])>m_sigIPz0Max) {
715 ATH_MSG_DEBUG("Track rejected because of err(z0)*sin(theta) " << sqrt( (*track->covariance())(Trk::z0,Trk::z0) )*std::sin(perigeeParms[Trk::theta]) << " > " << m_sigIPz0Max);
716 return false;
717 }
718
719 if (sqrt( (*track->covariance())(Trk::d0,Trk::d0) )>m_sigIPd0Max) {
720 ATH_MSG_DEBUG("Track rejected because of err(d0) " << sqrt( (*track->covariance())(Trk::d0,Trk::d0) ) << " > " << m_sigIPd0Max);
721 return false;
722 }
723
725
726 double sinTheta = std::sin(perigeeParms[Trk::theta]);
727 double cosTheta = std::cos(perigeeParms[Trk::theta]);
728 double d0wrtPriVtx = perigeeParms[Trk::d0];
729 double deltaZ = perigeeParms[Trk::z0];
730 double z0wrtPriVtx = deltaZ*sinTheta;
731 double testtrackSigD0 = sqrt( (*track->covariance())(Trk::d0,Trk::d0) );
732 double testtrackSigZ0 = sqrt( (*track->covariance())(Trk::z0,Trk::z0) );
733 double testtrackSigTh = sqrt( (*track->covariance())(Trk::theta,Trk::theta) );
734 // error on IP:
735 double trackPhi = perigeeParms[Trk::phi];
736 double dIPdx = std::sin(trackPhi);
737 double dIPdy = -std::cos(trackPhi);
738 double DD0 = testtrackSigD0*testtrackSigD0;
739 double newD0Err=0;
740 if (covariancePosition) {
741 double DXX = dIPdx*dIPdx* (*covariancePosition)(0,0);
742 double DYY = dIPdy*dIPdy* (*covariancePosition)(1,1);
743 double DXY = 2.*dIPdx*dIPdy* (*covariancePosition)(0,1);
744 newD0Err = DD0 + DXX + DYY + DXY;
745 } else {
746 newD0Err = DD0;
747 }
748
749 double d0ErrwrtPriVtx = (newD0Err>0 ? sqrt(newD0Err) : -10e-9);
750
751 if (d0ErrwrtPriVtx<0) {
752 ATH_MSG_WARNING( " error on d0 is negative: numeric error... (not expected. please report!)" );
753 }
754
755 if (m_d0significanceMax>0) {
756 if (std::fabs(d0wrtPriVtx/d0ErrwrtPriVtx)>m_d0significanceMax) {
757 ATH_MSG_DEBUG("Track rejected because of fabs(d0wrtPriVtx/d0ErrwrtPriVtx) " << std::fabs(d0wrtPriVtx/d0ErrwrtPriVtx) << " > " << m_d0significanceMax);
758 return false;
759 }
760 }
761
762 if (m_z0significanceMax>0) {
763
764 // error on zIP:
765 double dZIPdTheta = deltaZ*cosTheta;
766 double dZIPdz0 = sinTheta;
767 double dZIPdzV = -sinTheta;
768 double DTheta2 = dZIPdTheta*dZIPdTheta*testtrackSigTh*testtrackSigTh;
769 double DZ02 = dZIPdz0*dZIPdz0*testtrackSigZ0*testtrackSigZ0;
770 double DThetaZ0 = 2.*dZIPdTheta*dZIPdz0*(*track->covariance())(Trk::theta,Trk::z0);
771 double newZ0Err(0);
772 if (covariancePosition) {
773 double DZV2 = dZIPdzV*dZIPdzV* (*covariancePosition)(2,2);
774 newZ0Err = DTheta2 + DZ02 + DZV2 + DThetaZ0;
775 } else {
776 newZ0Err = DTheta2 + DZ02 + DThetaZ0;
777 }
778
779 double z0ErrwrtPriVtx = (newZ0Err>0 ? sqrt(newZ0Err) : -10e-9);
780
781 if (z0ErrwrtPriVtx<0) {
782 ATH_MSG_WARNING( " error on z0 is negative: numeric error... (not expected. please report!)" );
783 }
784
785 if (std::fabs(z0wrtPriVtx/z0ErrwrtPriVtx)>m_z0significanceMax) {
786 ATH_MSG_DEBUG("Track rejected because of fabs(z0wrtPriVtx/z0ErrwrtPriVtx) " << std::fabs(z0wrtPriVtx/z0ErrwrtPriVtx) << " > " << m_z0significanceMax);
787 return false;
788 }
789 }
790
791 }
792
793 if (std::fabs(track->momentum().eta())>m_etaMax) {
794 ATH_MSG_DEBUG("Track rejected because of fabs(eta) " << std::fabs(track->momentum().eta()) << " > " << m_etaMax);
795 return false;
796 }
797
798 return true;
799 }
800
801 // ---------------------------------------------------------------------
803 {
804 if(nullptr == trkQuality) {
805 ATH_MSG_WARNING( "Null FitQuality pointer passed. No track Quality cut possible. Selection failed." );
806 return false;
807 }
808 return decision(trkQuality->chiSquared(),trkQuality->numberDoF());
809 }
810
811 bool InDetDetailedTrackSelectorTool::decision(double chi2, int ndf ) const{
812
813 double proba = 1.;
814
815 if(ndf>0 && chi2>=0.) {
816 Genfun::CumulativeChiSquare myCumulativeChiSquare(ndf);
817 proba = 1.-myCumulativeChiSquare(chi2);
818 }
819
820 if(chi2>m_fitChi2) {
821 ATH_MSG_DEBUG("Track rejected because of chi2 "<<chi2<<" > "<<m_fitChi2);
822 return false;
823 }
824
825 if(proba<m_fitProb) {
826 ATH_MSG_DEBUG("Track rejected because of fit probability "<<proba<<" > "<<m_fitProb);
827 return false;
828 }
829 if(!ndf) {
830 ATH_MSG_DEBUG("Track rejected because of ndof = "<<ndf);
831 return false;
832 }
833 if(chi2/double(ndf)>m_fitChi2OnNdfMax) {
834 ATH_MSG_DEBUG("Track rejected because of chi2/ndof "<<chi2/double(ndf)<<" > "<<m_fitChi2OnNdfMax);
835 return false;
836 }
837
838 return true;
839 }
840
841
842 // ---------------------------------------------------------------------
844 const xAOD::TrackParticle* tp,
845 bool useSharedHitInfo,
846 bool useTrtHitInfo,
847 const Trk::Perigee * track,
848 const int nHitTrt,
849 const int nHitTrtPlusOutliers) const
850 {
851 if (summary==nullptr) {
852 ATH_MSG_WARNING( "Null TrackSummary pointer passed. Selection failed." );
853 return false;
854 }
855
856 int nb = summary->get(Trk::numberOfInnermostPixelLayerHits);
857
858 if(nb<0) nb=0;
859
860 int np = summary->get(Trk::numberOfPixelHits);
861 if(np<0) np=0;
862
863 int npd = summary->get(Trk::numberOfPixelDeadSensors);
864 if(npd<0) npd=0;
865
866 int ns = summary->get(Trk::numberOfSCTHits);
867 if(ns<0) ns=0;
868
869 int nhp = summary->get(Trk::numberOfPixelHoles);
870 if (nhp < 0) nhp = 0;
871
872 int nhs = summary->get(Trk::numberOfSCTHoles);
873 if (nhs < 0) nhs = 0;
874
875 int ndhs = summary->get(Trk::numberOfSCTDoubleHoles);
876 if (ndhs < 0) ndhs = 0;
877
878 //**-----------------------------------------------------------------------
879
881 if (!track) {
882 return false;
883 }
884 const AmgVector(5)& perigeeParms = track->parameters();
885 double p = std::fabs(1./perigeeParms[Trk::qOverP]);
886 double pt = p*std::sin(perigeeParms[Trk::theta]);
887
888 unsigned int it = 0;
889 for(; it< m_ptBenchmarks.size()-1; ++it ) {
890 if(pt>m_ptBenchmarks[it] && pt <=m_ptBenchmarks[it+1] && ns < m_nSCTValues[it]) {
891 ATH_MSG_DEBUG("Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
892 return false;
893 }
894 }//end of pt intervals loop
895
896 //now cutting all the rest by the last value in the vector
897 if(pt>m_ptBenchmarks[it+1] && ns < m_nSCTValues[it+1]) {
898 ATH_MSG_DEBUG("Track rejected because of Pt-Dependent SCT Hit cut (CAREFUL! Excludes dead modules)") ;
899 return false;
900 }
901
902 }
903
904 //*--------------------------------------------------------------------------------
905
906 //normal cuts in all their variety
907
908 if(nb == 0 && nb < m_nHitBLayer) {
909 ATH_MSG_DEBUG("Track rejected because of nHitBLayer "<<nb<<" < "<<m_nHitBLayer);
910 if(m_inDetTestPixelLayerTool.empty()) {
911 ATH_MSG_DEBUG("and no blayer tool configured, so will not try to recover track");
912 return false;
913 } else if (m_inDetTestPixelLayerTool->expectHitInInnermostPixelLayer(track)) {
914 ATH_MSG_DEBUG("and track rejected because at least one hit is expected in the innermost pixel layer") ;
915 return false;
916 }else ATH_MSG_DEBUG("recovered track as no b-layer expected") ;
917 }//end of checking the b-layer
918
919 if(np+npd < m_nHitPix) {
920 ATH_MSG_DEBUG("Track rejected because of nHitPix "<<np+npd<<" < "<<m_nHitPix);
921 return false;
922 }
923
924 if(np < m_nHitPixPhysical) {
925 ATH_MSG_DEBUG("Track rejected because of nHitPixPhysical "<<np<<" < "<<m_nHitPixPhysical);
926 return false;
927 }
928
929 int nsd = summary->get(Trk::numberOfSCTDeadSensors);
930 if(nsd<0)
931 nsd=0;
932
933 if(ns+nsd < m_nHitSct)
934 {
935 ATH_MSG_DEBUG("Track rejected because of nHitSct "<<ns+nsd<<" < "<<m_nHitSct);
936 return false;
937 }
938
939 if((np+ns+npd+nsd) < m_nHitSi)
940 {
941 ATH_MSG_DEBUG("Track rejected because of nHitSi "<<np+npd+ns+nsd<<" < "<<m_nHitSi);
942 return false;
943 }
944
945 if((np+ns) < m_nHitSiPhysical)
946 {
947 ATH_MSG_DEBUG("Track rejected because of nHitSiPhysical "<<np+ns<<" < "<<m_nHitSiPhysical);
948 return false;
949 }
950
951 // Cuts on number of Holes
952
953 if ((nhp+nhs) > m_nHoles)
954 {
955 ATH_MSG_DEBUG("Track rejected because of nHolesPixPlusSCT "<<nhp+nhs<<" > "<<m_nHoles);
956 return false;
957 }
958
959 if (ndhs > m_nDoubleHoles)
960 {
961 ATH_MSG_DEBUG("Track rejected because of nDoubleHolesSCT "<<ndhs<<" > "<<m_nDoubleHoles);
962 return false;
963 }
964
965 if (nhp > m_nHolesPix)
966 {
967 ATH_MSG_DEBUG("Track rejected because of nHolesPix "<<nhp<<" > "<<m_nHolesPix);
968 return false;
969 }
970
971 if (nhs > m_nHolesSct)
972 {
973 ATH_MSG_DEBUG("Track rejected because of nHolesSct "<<nhs<<" > "<<m_nHolesSct);
974 return false;
975 }
976
977 if (useTrtHitInfo) {
978
979 int nh = summary->get(Trk::numberOfTRTHits);
980 if(nh<0) nh=0;
981 if(nh < nHitTrt) {
982 ATH_MSG_DEBUG("Track rejected because of nHitTrt "<<nh<<" < "<<nHitTrt);
983 return false;
984 }
985
986 int nhh = summary->get( Trk::numberOfTRTHits ) + summary->get( Trk::numberOfTRTOutliers );
987 if (nhh<0) nhh=0;
988 if (nhh<nHitTrtPlusOutliers) {
989 ATH_MSG_DEBUG("Track rejected because of nHitTrtPlusOutliers "<<nhh<<" < "<<nHitTrtPlusOutliers);
990 return false;
991 }
992
993 int nhthits=summary->get(Trk::numberOfTRTHighThresholdHits);
994 if (nhthits<0) nhthits=0;
995 if (nhthits<m_nHitTrtHighE) {
996 ATH_MSG_DEBUG("Track rejected because of nHitTrtHighE "<<nhthits<<" < "<<m_nHitTrtHighE);
997 return false;
998 }
999
1000 int nhthitsWithOutliers=summary->get(Trk::numberOfTRTHighThresholdHits) + summary->get(Trk::numberOfTRTHighThresholdOutliers);
1001 if (nhthitsWithOutliers<0) nhthitsWithOutliers=0;
1002 if (nhthitsWithOutliers<m_nHitTrtPlusOutliersHighE) {
1003 ATH_MSG_DEBUG("Track rejected because of nHitTrtPlusOutliersHighE "<<nhthitsWithOutliers<<" < "<<m_nHitTrtPlusOutliersHighE);
1004 return false;
1005 }
1006
1007 if (summary->get( Trk :: numberOfTRTHits )>0) {
1008 double nhe = (double)summary->get(Trk::numberOfTRTHighThresholdHits) / (double)summary->get( Trk::numberOfTRTHits );
1009 if(nhe<0.) nhe=0.;
1010 if(nhe > m_nHitTrtHighEFraction ) {
1011 ATH_MSG_DEBUG("Track rejected because of nHitTrtHighEFraction "<<nhe<<" < "<<m_nHitTrtHighEFraction);
1012 return false;
1013 }
1014 }
1015
1016 if ( summary->get( Trk :: numberOfTRTHits ) + summary->get( Trk :: numberOfTRTOutliers ) > 0 ) {
1017 double nheh = (double)(summary->get(Trk::numberOfTRTHighThresholdHits) + summary->get(Trk::numberOfTRTHighThresholdOutliers))/
1018 (double)(summary->get( Trk::numberOfTRTHits) + summary->get( Trk :: numberOfTRTOutliers ) );
1019 if(nheh<0.) nheh=0.;
1020 if (nheh>1.) nheh=1.;
1022 ATH_MSG_DEBUG("Track rejected because of nHitTrtHighEFractionWithOutliers "<<nheh<<" < "<<m_nHitTrtHighEFractionWithOutliers);
1023 return false;
1024 }
1025 }
1026 }
1027
1028 if (useSharedHitInfo) {
1029 if(!tp){
1030 ATH_MSG_DEBUG("Track rejected because xAOD::TrackParticle not available");
1031 return false;
1032 }
1033
1035 if(nbs < 0) nbs = 0;
1036 if (nbs>1) nbs=1;
1037 if(nbs>m_nSharedBLayer) {
1038 ATH_MSG_DEBUG("Track rejected because of nSharedBLayer "<<nbs<<" < "<<m_nSharedBLayer);
1039 return false;
1040 }
1041
1043 if(nps < 0) nps = 0;
1044 if(nps>m_nSharedPix) {
1045 ATH_MSG_DEBUG("Track rejected because of nSharedPix "<<nps<<" < "<<m_nSharedPix);
1046 return false;
1047 }
1048
1050 if(nss < 0) nss = 0;
1051 if(nss > m_nSharedSct) {
1052 ATH_MSG_DEBUG("Track rejected because of nSharedSct "<<nss<<" < "<<m_nSharedSct);
1053 return false;
1054 }
1055
1056 int nst = nps + nss;
1057 if(nst>m_nSharedSi) {
1058 ATH_MSG_DEBUG("Track rejected because of nSharedSi "<<nst<<" < "<<m_nSharedSi);
1059 return false;
1060 }
1061 }
1062
1063 return true;
1064
1065 }
1066
1067 // ---------------------------------------------------------------------
1069 {
1070 const AmgVector(5)& perigeeParms = myPerigee.parameters();
1071
1072 // only check pt if mag. field is on
1073 const EventContext& ctx = Gaudi::Hive::currentContext();
1075 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
1076 if (fieldCondObj == nullptr) {
1077 ATH_MSG_ERROR("execute: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
1078 return false;
1079 }
1080 MagField::AtlasFieldCache fieldCache;
1081 fieldCondObj->getInitializedCache (fieldCache);
1082
1083 if (fieldCache.solenoidOn()){//B field
1084 if (perigeeParms[Trk::qOverP] == 0.) {
1085 ATH_MSG_DEBUG("Track rejected because of perigee qOverP == 0.");
1086 return false;
1087 }
1088 double p = std::fabs(1./perigeeParms[Trk::qOverP]);
1089 if (p<m_pMin) {
1090 ATH_MSG_DEBUG("Track rejected because of p " << p << " < " << m_pMin);
1091 return false;
1092 }
1093 double pt = p*std::sin(perigeeParms[Trk::theta]);
1094 if (pt<m_pTMin) {
1095 ATH_MSG_DEBUG("Track rejected because of pt " << pt << " < " << m_pTMin);
1096 return false;
1097 }
1098 }
1099
1100 if (std::fabs(perigeeParms[Trk::d0]) > m_d0MaxPreselection) {
1101 ATH_MSG_DEBUG("Track rejected because of fabs(d0) "<<std::fabs(perigeeParms[Trk::d0])<<" < "<<m_d0MaxPreselection);
1102 return false;
1103 }
1104
1105 return true;
1106 }
1107
1108} //end of namespace definitions
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
#define AmgVector(rows)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
ToolHandle< Trk::ITrackParticleCreatorTool > m_particleCreator
bool preselectionBeforeExtrapolation(const Trk::Perigee &myPerigee) const
InDetDetailedTrackSelectorTool(const std::string &t, const std::string &n, const IInterface *p)
ToolHandle< InDet::IInDetTestPixelLayerTool > m_inDetTestPixelLayerTool
bool decision(const Trk::Track &track, const Trk::Vertex *vertex) const
ToolHandle< ITrtDriftCircleCutTool > m_trtDCTool
Trk::Vertex * getBeamSpot(const EventContext &) const
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
int getCount(const xAOD::TrackParticle &tp, xAOD::SummaryType type) const
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
ToolHandle< Trk::ITrackSummaryTool > m_trackSumTool
Amg::Vector3D getPosOrBeamSpot(const xAOD::Vertex *) const
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h).
bool solenoidOn() const
status of the magnets
Class to represent and store fit qualities from track reconstruction in terms of and number of degre...
Definition FitQuality.h:97
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition FitQuality.h:60
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
const Amg::Vector3D & momentum() const
Access method for the momentum.
Class describing the Line to which the Perigee refers to.
Trk::RecVertex inherits from Trk::Vertex.
Definition RecVertex.h:44
A summary of the information contained by a track.
This class is a simplest representation of a vertex candidate.
const Amg::Vector3D & position() const
return position of vertex
Definition Vertex.cxx:63
float numberDoF() const
Returns the number of degrees of freedom of the overall track or vertex fit as float.
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float chiSquared() const
Returns the of the overall track fit.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
double chi2(TH1 *h0, TH1 *h1)
Eigen::Matrix< double, 3, 1 > Vector3D
Primary Vertex Finder.
@ anyDirection
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ phi
Definition ParamDefs.h:75
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfTRTHighThresholdOutliers
number of dead TRT straws crossed
@ numberOfInnermostPixelLayerHits
these are the hits in the 1st pixel layer
@ numberOfTRTHighThresholdHits
total number of TRT hits which pass the high threshold
@ numberOfSCTHoles
number of Holes in both sides of a SCT module
@ numberOfPixelHoles
number of pixels which have a ganged ambiguity.
@ numberOfPixelDeadSensors
number of pixel hits with broad errors (width/sqrt(12))
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfTRTHighThresholdOutliers
number of TRT high threshold outliers (only xenon counted) [unit8_t].
@ numberOfInnermostPixelLayerSharedHits
number of Pixel 0th layer barrel hits shared by several tracks.
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfSCTDeadSensors
number of dead SCT sensors crossed [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfSCTDoubleHoles
number of Holes in both sides of a SCT module [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfTRTHighThresholdHits
number of TRT hits which pass the high threshold (only xenon counted) [unit8_t].
@ numberOfTRTOutliers
number of TRT outliers [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].
#define unlikely(x)