ATLAS Offline Software
Loading...
Searching...
No Matches
InDetAlignTrackSelTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5// InDetAlignTrackSelTool.h
6
7// Sergio Gonzalez Sevilla, started 04/7/05
8// Miguel Olivo Gomez, extended 07/6/06
9
10// AlgTool to select high quality tracks for the inner detector
11// (Pixel+SCT) alignment algorithms.
12// This AlgTool provides a track selection based on the following cut variables:
13// Momentum, pt, number of shared hits, number of holes and chi2 probability.
14// Returns 0 in case a track is not accepted, otherwise 1
15
17
20
23#include "CLHEP/GenericFunctions/CumulativeChiSquare.hh"
24
26 , const std::string& name
27 , const IInterface* parent
28 )
29 : AthAlgTool(type,name,parent),
30 m_particleCreator("Trk::TrackParticleCreatorTool/TrackParticleCreatorTool", this),
32 m_minPt(2),
33 m_maxShared(0),
34 m_maxHoles(1),
35 m_minChi2Prob(0.2)
36{
37 declareInterface<IInDetAlignTrackSelTool>(this);
38 declareProperty("MinMomentum" , m_minMomentum);
39 declareProperty("MinPt" , m_minPt);
40 declareProperty("MaxShared" , m_maxShared);
41 declareProperty("MaxHoles" , m_maxHoles);
42 declareProperty("MinChi2Prob" , m_minChi2Prob);
43
44 // Tools
45 declareProperty("TrackParticleCreatorTool", m_particleCreator,
46 "tool to build TrackParticle");
47}
48
51
55
56 // get TrackParticleCreatorTool
57 ATH_CHECK(m_particleCreator.retrieve());
58
59 ATH_MSG_DEBUG( "Cuts selected : min_Momentum(CLHEP::GeV)=" << m_minMomentum
60 << " min_pt(CLHEP::GeV)=" << m_minPt
61 << " max_shared=" << m_maxShared
62 << " max_holes=" << m_maxHoles
63 << " min_chi2Prob=" << m_minChi2Prob ) ;
64
65 ATH_MSG_DEBUG( "InDetAlignTrackSelTool initialize() successful" ) ;
66 return StatusCode::SUCCESS;
67}
68
72 ATH_MSG_DEBUG( "InDetAlignTrackSelTool finalize method called" ) ;
73 return StatusCode::SUCCESS;
74}
75
77double InDetAlignTrackSelTool::Momentum(const Trk::Track& track) const {
79 ATH_MSG_DEBUG( "in Momentum() " ) ;
80 double mom=0.;
81
82 // get measured perigee and momentum of track
83 const Trk::Perigee* perigee = track.perigeeParameters();
84
85 if ( !perigee->covariance()) {
86 ATH_MSG_ERROR( "No measured perigee parameters assigned to the track" ) ;
87 mom = -1e12; // return big value
88 }
89 else{
90 Amg::VectorX perigeeParams = perigee->parameters();
91 mom = std::abs(1./perigeeParams[Trk::qOverP]);
92 mom /= 1000.; //mom in GeV
93 }
94
95 return mom;
96}
97
99double InDetAlignTrackSelTool::Pt(const Trk::Track& track) const {
101 ATH_MSG_DEBUG( "in Pt() " ) ;
102 double pt=0.;
103
104 // get measured perigee and pt of track
105 const Trk::Perigee* perigee = track.perigeeParameters();
106
107 if (!perigee->covariance()) {
108 ATH_MSG_ERROR( "No measured perigee parameters assigned to the track" ) ;
109 pt = -1e12; // return big value
110 }
111 else{
112 Amg::VectorX perigeeParams = perigee->parameters();
113 pt = std::abs(sin(perigeeParams[Trk::theta])/perigeeParams[Trk::qOverP]);
114 pt /= 1000.; // pt in GeV
115 }
116
117 return pt;
118}
119
123 ATH_MSG_DEBUG( "in nShared()" ) ;
124 int nshared=0, nshpix, nshsct;
125
126 xAOD::TrackParticle* trackPart = m_particleCreator->createParticle(track);
127 uint8_t iSummaryValue(0); // Dummy counter to retrieve summary values
128
129 if (not trackPart){
130 ATH_MSG_ERROR("Could not get xAOD::TrackParticle");
131 nshared = 1000;
132 }
133 else{
134 nshpix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelSharedHits) ? iSummaryValue : 0;
135 nshsct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTSharedHits) ? iSummaryValue : 0;
136
137 if(nshpix==-1)
138 nshpix=0;
139
140 if(nshsct==-1)
141 nshsct=0;
142
143 nshared = nshpix + nshsct;
144 }
145 return nshared;
146}
147
151 ATH_MSG_DEBUG( "in nHoles() " ) ;
152 int nholes=0, nhpix, nhsct;
153
154 xAOD::TrackParticle* trackPart = m_particleCreator->createParticle(track);
155 uint8_t iSummaryValue(0); // Dummy counter to retrieve summary values
156
157 if (not trackPart){
158 ATH_MSG_ERROR("Could not get xAOD::TrackParticle");
159 nholes = 1000;
160 }
161 else{
162 nhpix = trackPart->summaryValue(iSummaryValue, xAOD::numberOfPixelHoles) ? iSummaryValue : 0;
163 nhsct = trackPart->summaryValue(iSummaryValue, xAOD::numberOfSCTHoles) ? iSummaryValue : 0;
164
165 if(nhpix==-1)
166 nhpix = 0;
167
168 if(nhsct==-1)
169 nhsct = 0;
170
171 nholes = nhpix + nhsct;
172 }
173 return nholes;
174}
175
179 ATH_MSG_DEBUG( "in chi2Prob()" ) ;
180 double chi2Prob=0.;
181
182 // get fit quality and chi2 probability of track
183 // chi2Prob = TMath::Prob(chi2,DoF) ROOT function
184 const Trk::FitQuality* fitQual = track.fitQuality();
185
186 if (fitQual==nullptr) {
187 ATH_MSG_ERROR( "No fit quality assigned to the track" ) ;
188 chi2Prob = -1e12; // return big value
189 }
190 else {
191 if (fitQual->chiSquared() > 0. && fitQual->numberDoF() > 0) {
192 Genfun::CumulativeChiSquare probabilityFunction( fitQual->numberDoF() );
193 chi2Prob = 1 - probabilityFunction( fitQual->chiSquared() );
194 }
195 }
196
197 return chi2Prob;
198}
199
203 ATH_MSG_DEBUG( "in getStatus()" ) ;
204 int stat=1, nholes, nshared;
205 double mom, pt, chi2prob;
206
207 // momentum
208 mom = Momentum(track);
209 if (mom < m_minMomentum) {
210 stat=0;
211 }
212
213 // transverse momentum
214 pt = Pt(track);
215 if (pt < m_minPt) {
216 stat=0;
217 }
218
219 // number of holes
220 nholes = nHoles(track);
221 if (nholes > m_maxHoles) {
222 stat=0;
223 }
224
225 // number of shared hits
226 nshared = nShared(track);
227 if (nshared > m_maxShared) {
228 stat=0;
229 }
230
231 // chi2 Probability
232 chi2prob = chi2Prob(track);
233 if (chi2prob < m_minChi2Prob) {
234 stat=0;
235 }
236
237 ATH_MSG_DEBUG( " momentum(CLHEP::GeV)=" << mom
238 << " pt (CLHEP::GeV)=" << pt
239 << " nshared=" << nshared
240 << " nholes=" << nholes
241 << " chi2Prob=" << chi2prob
242 ) ;
243
244 if(!stat)
245 ATH_MSG_DEBUG( "Track not accepted" ) ;
246 else
247 ATH_MSG_DEBUG( "Track accepted" ) ;
248
249 return stat;
250}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
ToolHandle< Trk::ITrackParticleCreatorTool > m_particleCreator
Pointer to track particle creator tool.
int m_maxShared
Maximum number of shared hits of the track.
double Momentum(const Trk::Track &) const
virtual int getStatus(const Trk::Track &) const
int nShared(const Trk::Track &) const
double m_minPt
Minimum value of the transverse momentum of the track.
double m_minMomentum
Minimum value of the momentum of the track.
int nHoles(const Trk::Track &) const
double chi2Prob(const Trk::Track &) const
int m_maxHoles
Maximum number of holes of the track.
InDetAlignTrackSelTool(const std::string &type, const std::string &name, const IInterface *parent)
double m_minChi2Prob
Minimum value of the chi2 Probality of the track.
double Pt(const Trk::Track &) const
virtual StatusCode initialize()
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
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [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].
@ numberOfSCTHoles
number of SCT holes [unit8_t].