ATLAS Offline Software
Loading...
Searching...
No Matches
InDetCosmicTrackSelectorTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7// forward declares
8#include "VxVertex/Vertex.h"
9#include "TrkTrack/Track.h"
11
12// normal includes
18
19
20namespace InDet
21{
22 //----------------------------------------------------------------------------
23 InDetCosmicTrackSelectorTool::InDetCosmicTrackSelectorTool(const std::string& t, const std::string& n, const IInterface* p)
24 : AthAlgTool(t,n,p)
25 {
26 declareInterface<ITrackSelectorTool>(this);
27 }
28
29 //----------------------------------------------------------------------------
31 = default;
32
33 //----------------------------------------------------------------------------
35 {
37 if (!m_trackSumTool.empty()) {
38 if(m_trackSumTool.retrieve().isFailure())
39 {
40 msg(MSG::ERROR)<<" Unable to retrieve "<<m_trackSumTool<<endmsg;
41 return StatusCode::FAILURE;
42 }
44 }
45
46 // Read handle for AtlasFieldCacheCondObj
48
49 return StatusCode::SUCCESS;
50 }
51
52 //----------------------------------------------------------------------------
53 bool InDetCosmicTrackSelectorTool::decision(const Trk::Track & track, const Trk::Vertex * vertex) const
54 {
55
56 // decision based on the track parameters
57 if(!decision(track.perigeeParameters(), vertex, track.info().particleHypothesis()))
58 return false;
59
60 // number of hits, silicon hits, b-layer
61 // first ask track for summary
62 std::unique_ptr<Trk::TrackSummary> summaryUniquePtr;
63 const Trk::TrackSummary * summary = track.trackSummary();
64 if (summary == nullptr && m_trackSumToolAvailable) {
65 summaryUniquePtr = m_trackSumTool->summary(Gaudi::Hive::currentContext(), track);
66 summary = summaryUniquePtr.get();
67 }
68
69 if (nullptr==summary) {
70 ATH_MSG_DEBUG( "Track preselection: cannot create a track summary. This track will not pass." );
71 return false;
72 }
73
74 int nPixHits = summary->get(Trk::numberOfPixelHits);
75 int nSCTHits = summary->get(Trk::numberOfSCTHits);
76 int nTRTHits = summary->get(Trk::numberOfTRTHits);
77 int nSiHits = summary->get(Trk::numberOfPixelHits) * 2 + summary->get(Trk::numberOfSCTHits);
78 int nSiHitsTop = getNSiHits(&track,true);
79 int nSiHitsBottom = getNSiHits(&track,false);
80
81 if(nPixHits<m_numberOfPixelHits) {
82 ATH_MSG_DEBUG("Track rejected because of numberOfPixelHits "<<nPixHits<<"<"<<m_numberOfPixelHits);
83 return false;
84 }
85
86 if(nSCTHits<m_numberOfSCTHits) {
87 ATH_MSG_DEBUG("Track rejected because of numberOfSCTHits "<<nSCTHits<<"<"<<m_numberOfSCTHits);
88 return false;
89 }
90
91 if(nTRTHits<m_numberOfTRTHits) {
92 ATH_MSG_DEBUG("Track rejected because of numberOfTRTHits "<<nTRTHits<<"<"<<m_numberOfTRTHits);
93 return false;
94 }
95
96 if(nSiHits<m_numberOfSiHits) {
97 ATH_MSG_DEBUG("Track rejected because of numberOfSiHits "<<nSiHits<<"<"<<m_numberOfSiHits);
98 return false;
99 }
100
101 if(nSiHitsTop<m_numberOfSiHitsTop) {
102 ATH_MSG_DEBUG("Track rejected because of nSiHitsTop "<<nSiHitsTop<<"<"<<m_numberOfSiHitsTop);
103 return false;
104 }
105
106 if(nSiHitsBottom<m_numberOfSiHitsBottom) {
107 ATH_MSG_DEBUG("Track rejected because of numberOfSiHitsBottom "<<nSiHitsBottom<<"<"<<m_numberOfSiHitsBottom);
108 return false;
109 }
110
111 // all ok
112 return true;
113 }
114
115 //----------------------------------------------------------------------------
117 {
118 if(!decision(&(track.definingParameters()), vertex, Trk::pion))
119 return false;
120
121 const Trk::TrackSummary * summary = track.trackSummary();
122 if (nullptr==summary ) {
123 ATH_MSG_DEBUG( "TrackParticleBase does not have a Track Summary. Rejected." );
124 return false;
125 }
126 const Trk::Track * otrack= track.originalTrack();
127
128 if(otrack==nullptr){
129 ATH_MSG_DEBUG( "TrackParticleBase does not contain the original cosmic track. Rejected." );
130 return false;
131 }
132
133 int nPixHits = summary->get(Trk::numberOfPixelHits);
134 int nSCTHits = summary->get(Trk::numberOfSCTHits);
135 int nTRTHits = summary->get(Trk::numberOfTRTHits);
136 int nSiHits = summary->get(Trk::numberOfPixelHits)*2+summary->get(Trk::numberOfSCTHits);
137 int nSiHitsTop = getNSiHits(otrack,true);
138 int nSiHitsBottom = getNSiHits(otrack,false);
139
140 if(nPixHits<m_numberOfPixelHits) {
141 ATH_MSG_DEBUG("Track rejected because of numberOfPixelHits "<<nPixHits<<"<"<<m_numberOfPixelHits);
142 return false;
143 }
144
145 if(nSCTHits<m_numberOfSCTHits) {
146 ATH_MSG_DEBUG("Track rejected because of numberOfSCTHits "<<nSCTHits<<"<"<<m_numberOfSCTHits);
147 return false;
148 }
149
150 if(nTRTHits<m_numberOfTRTHits) {
151 ATH_MSG_DEBUG("Track rejected because of numberOfTRTHits "<<nTRTHits<<"<"<<m_numberOfTRTHits);
152 return false;
153 }
154
155 if(nSiHits<m_numberOfSiHits) {
156 ATH_MSG_DEBUG("Track rejected because of numberOfSiHits "<<nSiHits<<"<"<<m_numberOfSiHits);
157 return false;
158 }
159
160 if(nSiHitsTop<m_numberOfSiHitsTop) {
161 ATH_MSG_DEBUG("Track rejected because of nSiHitsTop "<<nSiHitsTop<<"<"<<m_numberOfSiHitsTop);
162 return false;
163 }
164
165 if(nSiHitsBottom<m_numberOfSiHitsBottom) {
166 ATH_MSG_DEBUG("Track rejected because of numberOfSiHitsBottom "<<nSiHitsBottom<<"<"<<m_numberOfSiHitsBottom);
167 return false;
168 }
169
170 // all ok
171 return true;
172 }
173
174 //----------------------------------------------------------------------------
176 {
177 // checking pointer first
178 if(nullptr==track) {
179 ATH_MSG_DEBUG( "Track preselection: Zero pointer to parameterbase* received (most likely a track without perigee). This track will not pass." );
180 return false;
181 }
182
183 // getting the perigee parameters of the track
184 const Trk::Perigee * perigee(nullptr);
185 perigee = dynamic_cast<const Trk::Perigee *>(track);
186
187 if(!perigee || !perigee->covariance()) {
188 ATH_MSG_DEBUG( "Track preselection: cannot make a measured perigee. This track will not pass." );
189 return false;
190 }
191
192 Amg::VectorX trackParameters = perigee->parameters();
193
194 // d0 and z0 cuts
195 double d0 = trackParameters[Trk::d0];
196 if(fabs(d0) > fabs(m_maxD0)) {
197 ATH_MSG_DEBUG("Track rejected because of d0 "<<fabs(d0)<<">"<<m_maxD0);
198 return false;
199 }
200
201 double z0 = trackParameters[Trk::z0];
202 if(fabs(z0) > fabs(m_maxZ0)) {
203 ATH_MSG_DEBUG("Track rejected because of z0 "<<fabs(z0)<<">"<<m_maxZ0);
204 return false;
205 }
206
207 // only check pt if mag. field is on
208 const EventContext& ctx = Gaudi::Hive::currentContext();
210 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
211 if (fieldCondObj == nullptr) {
212 ATH_MSG_ERROR("execute: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
213 return false;
214 }
215 MagField::AtlasFieldCache fieldCache;
216 fieldCondObj->getInitializedCache (fieldCache);
217
218 if (fieldCache.solenoidOn()){//B field
219 if (trackParameters[Trk::qOverP] == 0.) {
220 ATH_MSG_DEBUG("Track rejected because of qOverP == 0.");
221 return false;
222 }
223
224 double pt = fabs(1./trackParameters[Trk::qOverP])*sin(trackParameters[Trk::theta]);
225 if (pt < m_minPt) {
226 ATH_MSG_DEBUG("Track rejected because of pt " << pt << " < " << m_minPt);
227 return false;
228 }
229 }
230 return true;
231 }
232
233 //----------------------------------------------------------------------------
235 {
236 int nsilicon = 0;
237
238 //loop over all measurements on Track
239 DataVector<const Trk::MeasurementBase>::const_iterator it = track->measurementsOnTrack()->begin();
240 DataVector<const Trk::MeasurementBase>::const_iterator itEnd = track->measurementsOnTrack()->end();
241 for ( ; it!=itEnd; ++it) {
242 const Trk::RIO_OnTrack *rot = dynamic_cast<const Trk::RIO_OnTrack *>(*it);
243 if (!rot)
244 continue;
245 const InDet::SiClusterOnTrack *siclus = dynamic_cast<const InDet::SiClusterOnTrack *>(rot);
246 if(!siclus)
247 continue;
248
249 if(top && siclus->globalPosition().y()<0)
250 continue;
251 if(!top && siclus->globalPosition().y()>0)
252 continue;
253
254 const SCT_ClusterOnTrack *sctclus = dynamic_cast<const SCT_ClusterOnTrack *>(siclus);
255 if(!sctclus)
256 //Pixel hit
257 nsilicon += 2;
258 else
259 nsilicon += 1;
260 }
261 return nsilicon;
262 }
263
264} //end of namespace definitions
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
An STL vector of pointers that by default owns its pointed-to elements.
@ top
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
MsgStream & msg() const
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
virtual bool decision(const Trk::Track &track, const Trk::Vertex *vertex) const override
static int getNSiHits(const Trk::Track *track, bool top)
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
ToolHandle< Trk::ITrackSummaryTool > m_trackSumTool
InDetCosmicTrackSelectorTool(const std::string &t, const std::string &n, const IInterface *p)
Specific class to represent the SCT measurements.
RIO_OnTrack base class for Silicon detector in the InnerDetector.
virtual const Amg::Vector3D & globalPosition() const override
returns global position (gathered through Surface constraint)
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
bool solenoidOn() const
status of the magnets
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
A summary of the information contained by a track.
This class is a simplest representation of a vertex candidate.
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Primary Vertex Finder.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
ParticleHypothesis
Enumeration for Particle hypothesis respecting the interaction with material.
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ numberOfPixelHits
number of pixel layers on track with absence of hits