ATLAS Offline Software
InDetCosmicTrackSelectorTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 // forward declares
9 #include "VxVertex/Vertex.h"
10 #include "TrkTrack/Track.h"
12 
13 // normal includes
19 
20 
21 namespace InDet
22 {
23  //----------------------------------------------------------------------------
24  InDetCosmicTrackSelectorTool::InDetCosmicTrackSelectorTool(const std::string& t, const std::string& n, const IInterface* p)
25  : AthAlgTool(t,n,p),
26  m_trackSumToolAvailable(false)
27  {
28  declareInterface<ITrackSelectorTool>(this);
29  declareProperty("maxZ0", m_maxZ0 = 150.);
30  declareProperty("maxD0", m_maxD0 = 2.5);
31  declareProperty("minPt", m_minPt = 0.);
32  declareProperty("numberOfPixelHits", m_numberOfPixelHits = 0);
33  declareProperty("numberOfSCTHits", m_numberOfSCTHits = 0);
34  declareProperty("numberOfTRTHits", m_numberOfTRTHits = 15);
35  declareProperty("numberOfSiliconHits", m_numberOfSiHits = 8);
36  declareProperty("numberOfSiliconHitsTop", m_numberOfSiHitsTop = -1);
37  declareProperty("numberOfSiliconHitsBottom", m_numberOfSiHitsBottom = -1);
38  declareProperty("TrackSummaryTool", m_trackSumTool);
39  }
40 
41  //----------------------------------------------------------------------------
43  = default;
44 
45  //----------------------------------------------------------------------------
47  {
49  if (!m_trackSumTool.empty()) {
50  if(m_trackSumTool.retrieve().isFailure())
51  {
52  msg(MSG::ERROR)<<" Unable to retrieve "<<m_trackSumTool<<endmsg;
53  return StatusCode::FAILURE;
54  }
56  }
57 
58  // Read handle for AtlasFieldCacheCondObj
60 
61  return StatusCode::SUCCESS;
62  }
63 
64  //----------------------------------------------------------------------------
66  {
67 
68  // decision based on the track parameters
69  if(!decision(track.perigeeParameters(), vertex, track.info().particleHypothesis()))
70  return false;
71 
72  // number of hits, silicon hits, b-layer
73  // first ask track for summary
74  std::unique_ptr<Trk::TrackSummary> summaryUniquePtr;
75  const Trk::TrackSummary * summary = track.trackSummary();
76  if (summary == nullptr && m_trackSumToolAvailable) {
77  summaryUniquePtr = m_trackSumTool->summary(track);
78  summary = summaryUniquePtr.get();
79  }
80 
81  if (nullptr==summary) {
82  ATH_MSG_DEBUG( "Track preselection: cannot create a track summary. This track will not pass." );
83  return false;
84  }
85 
86  int nPixHits = summary->get(Trk::numberOfPixelHits);
88  int nTRTHits = summary->get(Trk::numberOfTRTHits);
90  int nSiHitsTop = getNSiHits(&track,true);
91  int nSiHitsBottom = getNSiHits(&track,false);
92 
93  if(nPixHits<m_numberOfPixelHits) {
94  ATH_MSG_DEBUG("Track rejected because of numberOfPixelHits "<<nPixHits<<"<"<<m_numberOfPixelHits);
95  return false;
96  }
97 
99  ATH_MSG_DEBUG("Track rejected because of numberOfSCTHits "<<nSCTHits<<"<"<<m_numberOfSCTHits);
100  return false;
101  }
102 
103  if(nTRTHits<m_numberOfTRTHits) {
104  ATH_MSG_DEBUG("Track rejected because of numberOfTRTHits "<<nTRTHits<<"<"<<m_numberOfTRTHits);
105  return false;
106  }
107 
109  ATH_MSG_DEBUG("Track rejected because of numberOfSiHits "<<nSiHits<<"<"<<m_numberOfSiHits);
110  return false;
111  }
112 
113  if(nSiHitsTop<m_numberOfSiHitsTop) {
114  ATH_MSG_DEBUG("Track rejected because of nSiHitsTop "<<nSiHitsTop<<"<"<<m_numberOfSiHitsTop);
115  return false;
116  }
117 
118  if(nSiHitsBottom<m_numberOfSiHitsBottom) {
119  ATH_MSG_DEBUG("Track rejected because of numberOfSiHitsBottom "<<nSiHitsBottom<<"<"<<m_numberOfSiHitsBottom);
120  return false;
121  }
122 
123  // all ok
124  return true;
125  }
126 
127  //----------------------------------------------------------------------------
129  {
130  if(!decision(&(track.definingParameters()), vertex, Trk::pion))
131  return false;
132 
133  const Trk::TrackSummary * summary = track.trackSummary();
134  if (nullptr==summary ) {
135  ATH_MSG_DEBUG( "TrackParticleBase does not have a Track Summary. Rejected." );
136  return false;
137  }
138  const Trk::Track * otrack= track.originalTrack();
139 
140  if(otrack==nullptr){
141  ATH_MSG_DEBUG( "TrackParticleBase does not contain the original cosmic track. Rejected." );
142  return false;
143  }
144 
145  int nPixHits = summary->get(Trk::numberOfPixelHits);
147  int nTRTHits = summary->get(Trk::numberOfTRTHits);
149  int nSiHitsTop = getNSiHits(otrack,true);
150  int nSiHitsBottom = getNSiHits(otrack,false);
151 
152  if(nPixHits<m_numberOfPixelHits) {
153  ATH_MSG_DEBUG("Track rejected because of numberOfPixelHits "<<nPixHits<<"<"<<m_numberOfPixelHits);
154  return false;
155  }
156 
158  ATH_MSG_DEBUG("Track rejected because of numberOfSCTHits "<<nSCTHits<<"<"<<m_numberOfSCTHits);
159  return false;
160  }
161 
162  if(nTRTHits<m_numberOfTRTHits) {
163  ATH_MSG_DEBUG("Track rejected because of numberOfTRTHits "<<nTRTHits<<"<"<<m_numberOfTRTHits);
164  return false;
165  }
166 
168  ATH_MSG_DEBUG("Track rejected because of numberOfSiHits "<<nSiHits<<"<"<<m_numberOfSiHits);
169  return false;
170  }
171 
172  if(nSiHitsTop<m_numberOfSiHitsTop) {
173  ATH_MSG_DEBUG("Track rejected because of nSiHitsTop "<<nSiHitsTop<<"<"<<m_numberOfSiHitsTop);
174  return false;
175  }
176 
177  if(nSiHitsBottom<m_numberOfSiHitsBottom) {
178  ATH_MSG_DEBUG("Track rejected because of numberOfSiHitsBottom "<<nSiHitsBottom<<"<"<<m_numberOfSiHitsBottom);
179  return false;
180  }
181 
182  // all ok
183  return true;
184  }
185 
186  //----------------------------------------------------------------------------
188  {
189  // checking pointer first
190  if(nullptr==track) {
191  ATH_MSG_DEBUG( "Track preselection: Zero pointer to parameterbase* received (most likely a track without perigee). This track will not pass." );
192  return false;
193  }
194 
195  // getting the perigee parameters of the track
196  const Trk::Perigee * perigee(nullptr);
197  perigee = dynamic_cast<const Trk::Perigee *>(track);
198 
199  if(!perigee || !perigee->covariance()) {
200  ATH_MSG_DEBUG( "Track preselection: cannot make a measured perigee. This track will not pass." );
201  return false;
202  }
203 
204  Amg::VectorX trackParameters = perigee->parameters();
205 
206  // d0 and z0 cuts
207  double d0 = trackParameters[Trk::d0];
208  if(fabs(d0) > fabs(m_maxD0)) {
209  ATH_MSG_DEBUG("Track rejected because of d0 "<<fabs(d0)<<">"<<m_maxD0);
210  return false;
211  }
212 
213  double z0 = trackParameters[Trk::z0];
214  if(fabs(z0) > fabs(m_maxZ0)) {
215  ATH_MSG_DEBUG("Track rejected because of z0 "<<fabs(z0)<<">"<<m_maxZ0);
216  return false;
217  }
218 
219  // only check pt if mag. field is on
220  const EventContext& ctx = Gaudi::Hive::currentContext();
222  const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
223  if (fieldCondObj == nullptr) {
224  ATH_MSG_ERROR("execute: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
225  return false;
226  }
227  MagField::AtlasFieldCache fieldCache;
228  fieldCondObj->getInitializedCache (fieldCache);
229 
230  if (fieldCache.solenoidOn()){//B field
231  if (trackParameters[Trk::qOverP] == 0.) {
232  ATH_MSG_DEBUG("Track rejected because of qOverP == 0.");
233  return false;
234  }
235 
236  double pt = fabs(1./trackParameters[Trk::qOverP])*sin(trackParameters[Trk::theta]);
237  if (pt < m_minPt) {
238  ATH_MSG_DEBUG("Track rejected because of pt " << pt << " < " << m_minPt);
239  return false;
240  }
241  }
242  return true;
243  }
244 
245  //----------------------------------------------------------------------------
247  {
248  int nsilicon = 0;
249 
250  //loop over all measurements on Track
251  DataVector<const Trk::MeasurementBase>::const_iterator it = track->measurementsOnTrack()->begin();
252  DataVector<const Trk::MeasurementBase>::const_iterator itEnd = track->measurementsOnTrack()->end();
253  for ( ; it!=itEnd; ++it) {
254  const Trk::RIO_OnTrack *rot = dynamic_cast<const Trk::RIO_OnTrack *>(*it);
255  if (!rot)
256  continue;
257  const InDet::SiClusterOnTrack *siclus = dynamic_cast<const InDet::SiClusterOnTrack *>(rot);
258  if(!siclus)
259  continue;
260 
261  if(top && siclus->globalPosition().y()<0)
262  continue;
263  if(!top && siclus->globalPosition().y()>0)
264  continue;
265 
266  const SCT_ClusterOnTrack *sctclus = dynamic_cast<const SCT_ClusterOnTrack *>(siclus);
267  if(!sctclus)
268  //Pixel hit
269  nsilicon += 2;
270  else
271  nsilicon += 1;
272  }
273  return nsilicon;
274  }
275 
276 } //end of namespace definitions
Trk::numberOfPixelHits
@ numberOfPixelHits
number of pixel layers on track with absence of hits
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:57
SCT_ClusterOnTrack.h
Trk::Vertex
Definition: Tracking/TrkEvent/VxVertex/VxVertex/Vertex.h:26
ITrackSummaryTool.h
Amg::VectorX
Eigen::Matrix< double, Eigen::Dynamic, 1 > VectorX
Dynamic Vector - dynamic allocation.
Definition: EventPrimitives.h:32
top
TopConfig A simple configuration that is NOT a singleton.
Definition: AnalysisTrackingHelper.cxx:58
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
InDet::InDetCosmicTrackSelectorTool::m_numberOfSCTHits
int m_numberOfSCTHits
Minimum number of SCT hits.
Definition: InDetCosmicTrackSelectorTool.h:58
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
AtlasFieldCacheCondObj
Definition: AtlasFieldCacheCondObj.h:19
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
InDet
DUMMY Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
TrackParticleBase.h
skel.it
it
Definition: skel.GENtoEVGEN.py:423
test_pyathena.pt
pt
Definition: test_pyathena.py:11
Trk::z0
@ z0
Definition: ParamDefs.h:70
InDet::InDetCosmicTrackSelectorTool::m_numberOfTRTHits
int m_numberOfTRTHits
Minimum number of TRT hits.
Definition: InDetCosmicTrackSelectorTool.h:59
Trk::RIO_OnTrack
Definition: RIO_OnTrack.h:70
SiClusterOnTrack.h
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
InDet::InDetCosmicTrackSelectorTool::m_trackSumToolAvailable
bool m_trackSumToolAvailable
Definition: InDetCosmicTrackSelectorTool.h:65
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
Track.h
Trk::TrackParticleBase
Definition: TrackParticleBase.h:41
Trk::ParticleHypothesis
ParticleHypothesis
Definition: ParticleHypothesis.h:25
TauGNNUtils::Variables::Track::nSiHits
bool nSiHits(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:691
InDet::SiClusterOnTrack::globalPosition
virtual const Amg::Vector3D & globalPosition() const override
returns global position (gathered through Surface constraint)
Definition: SiClusterOnTrack.h:115
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDet::InDetCosmicTrackSelectorTool::getNSiHits
static int getNSiHits(const Trk::Track *track, bool top)
Definition: InDetCosmicTrackSelectorTool.cxx:246
InDet::InDetCosmicTrackSelectorTool::m_maxD0
double m_maxD0
Maximum d0 of tracks.
Definition: InDetCosmicTrackSelectorTool.h:55
InDet::InDetCosmicTrackSelectorTool::m_minPt
double m_minPt
Minimum pT of tracks.
Definition: InDetCosmicTrackSelectorTool.h:56
beamspotman.n
n
Definition: beamspotman.py:731
Trk::theta
@ theta
Definition: ParamDefs.h:72
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Trk::numberOfSCTHits
@ numberOfSCTHits
number of SCT holes
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:71
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Trk::pion
@ pion
Definition: ParticleHypothesis.h:29
TRT::Track::d0
@ d0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:62
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TrackSummary.h
Trk::ParametersBase
Definition: ParametersBase.h:55
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
InDet::InDetCosmicTrackSelectorTool::m_numberOfSiHits
int m_numberOfSiHits
Minimum number of Silicon hits.
Definition: InDetCosmicTrackSelectorTool.h:60
InDet::InDetCosmicTrackSelectorTool::initialize
virtual StatusCode initialize() override
Definition: InDetCosmicTrackSelectorTool.cxx:46
MagField::AtlasFieldCache::solenoidOn
bool solenoidOn() const
status of the magnets
InDet::InDetCosmicTrackSelectorTool::m_numberOfSiHitsBottom
int m_numberOfSiHitsBottom
Minimum number of Silicon hits.
Definition: InDetCosmicTrackSelectorTool.h:62
Trk::numberOfTRTHits
@ numberOfTRTHits
number of TRT outliers
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:79
InDet::InDetCosmicTrackSelectorTool::m_fieldCacheCondObjInputKey
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
Definition: InDetCosmicTrackSelectorTool.h:68
Trk::TrackSummary
A summary of the information contained by a track.
Definition: Tracking/TrkEvent/TrkTrackSummary/TrkTrackSummary/TrackSummary.h:287
Trk::d0
@ d0
Definition: ParamDefs.h:69
RIO_OnTrack.h
Vertex.h
TauGNNUtils::Variables::Track::nSCTHits
bool nSCTHits(const xAOD::TauJet &, const xAOD::TauTrack &track, double &out)
Definition: TauGNNUtils.cxx:549
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
InDet::InDetCosmicTrackSelectorTool::InDetCosmicTrackSelectorTool
InDetCosmicTrackSelectorTool(const std::string &t, const std::string &n, const IInterface *p)
Definition: InDetCosmicTrackSelectorTool.cxx:24
InDet::InDetCosmicTrackSelectorTool::m_trackSumTool
ToolHandle< Trk::ITrackSummaryTool > m_trackSumTool
Definition: InDetCosmicTrackSelectorTool.h:64
DataVector.h
An STL vector of pointers that by default owns its pointed-to elements.
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
InDet::InDetCosmicTrackSelectorTool::m_numberOfSiHitsTop
int m_numberOfSiHitsTop
Minimum number of Silicon hits.
Definition: InDetCosmicTrackSelectorTool.h:61
InDet::InDetCosmicTrackSelectorTool::~InDetCosmicTrackSelectorTool
~InDetCosmicTrackSelectorTool()
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
MagField::AtlasFieldCache
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
Definition: AtlasFieldCache.h:43
Trk::qOverP
@ qOverP
perigee
Definition: ParamDefs.h:73
InDet::InDetCosmicTrackSelectorTool::m_maxZ0
double m_maxZ0
Maximum z0 of tracks.
Definition: InDetCosmicTrackSelectorTool.h:54
InDetCosmicTrackSelectorTool.h
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
AthAlgTool
Definition: AthAlgTool.h:26
InDet::InDetCosmicTrackSelectorTool::m_numberOfPixelHits
int m_numberOfPixelHits
Minimum number of Pixel hits.
Definition: InDetCosmicTrackSelectorTool.h:57
InDet::SiClusterOnTrack
Definition: SiClusterOnTrack.h:39
InDet::SCT_ClusterOnTrack
Definition: SCT_ClusterOnTrack.h:44
InDet::InDetCosmicTrackSelectorTool::decision
virtual bool decision(const Trk::Track &track, const Trk::Vertex *vertex) const override
Definition: InDetCosmicTrackSelectorTool.cxx:65
SCT_Monitoring::summary
@ summary
Definition: SCT_MonitoringNumbers.h:65