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