ATLAS Offline Software
Loading...
Searching...
No Matches
TRT_TrackExtensionTool_xk.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// Implementation file for class InDet::TRT_TrackExtensionTool_xk
8// (c) ATLAS Detector software
11// Version 1.0 21/04/2004 I.Gavrilenko
13
14
19#include "TrkTrack/Track.h"
21#include <array>
22#include <vector>
23#include <iostream>
24
25namespace{
26 constexpr size_t MAX_ROAD_SIZE(399);
27
28 std::vector<const Trk::Surface*>
29 vectorOfSurfacesFromVectorOfElements(const std::vector<const InDetDD::TRT_BaseElement*> & v){
30 size_t roadsize{0};
31 std::vector<const Trk::Surface*> surfaces;
32 for(const auto &pThisElement: v) {
33 surfaces.emplace_back(&(pThisElement->surface()));
34 if(++roadsize==MAX_ROAD_SIZE) break;
35 }
36 return surfaces;
37 }
38}
39
41// Constructor
43
45(const std::string& t,const std::string& n,const IInterface* p)
46 : AthAlgTool(t,n,p)
47{
48 declareInterface<ITRT_TrackExtensionTool>(this);
49}
50
52// Destructor
54
56= default;
57
59// Initialisation
61
63{
64
65 // Get magnetic field service
66 //
67 if(m_fieldmode != "NoField" ) {
68 ATH_CHECK( m_fieldCondObjInputKey.initialize());
69 }
70
74
75 // Get RIO_OnTrack creator with drift time information
76 //
77 ATH_CHECK(m_riontrackD.retrieve());
78 ATH_MSG_DEBUG("Retrieved tool " << m_riontrackD);
79
80 // Get RIO_OnTrack creator without drift time information
81 //
82 ATH_CHECK(m_riontrackN.retrieve());
83 ATH_MSG_DEBUG("Retrieved tool " << m_riontrackN ) ;
84
85 // Get detector elements road maker tool
86 //
87 ATH_CHECK(m_roadtool.retrieve());
88 ATH_MSG_DEBUG("Retrieved tool " << m_roadtool);
89
90 // Get propagator tool
91 //
92 ATH_CHECK(m_proptool.retrieve());
93 ATH_MSG_DEBUG("Retrieved tool " << m_proptool);
94
95 // Get updator tool
96 //
97 ATH_CHECK(m_updatortool.retrieve());
98 ATH_MSG_DEBUG("Retrieved tool " << m_updatortool);
99
100 // Get segment selector tool
101 //
102 ATH_CHECK(m_selectortool.retrieve(DisableTool { !m_parameterization } ));
103
104 // TRT
105 ATH_CHECK(detStore()->retrieve(m_trtid,"TRT_ID"));
106
107 //Initialize container
108 ATH_CHECK(m_trtname.initialize());
109
110 // Get output print level
111 //
112 m_outputlevel = msg().level()-MSG::DEBUG;
113 return StatusCode::SUCCESS;
114}
115
117// Finalize-
119
121{
122 return StatusCode::SUCCESS;
123}
124
126// Dumps relevant information into the MsgStream
128
129MsgStream& InDet::TRT_TrackExtensionTool_xk::dump( MsgStream& out ) const
130{
131 out<<std::endl;
132 return dumpConditions(out);
133}
134
135
137// Dumps conditions information into the MsgStream
139
140MsgStream& InDet::TRT_TrackExtensionTool_xk::dumpConditions( MsgStream& out ) const
141{
142 auto pad = [](const std::string & s)->std::string{
143 std::string s1(s.size(),' ');
144 s1+="|";
145 return s + s1 +"\n";
146 };
147 const std::array<std::string,9> fieldmode{"NoField" ,"ConstantField","SolenoidalField",
148 "ToroidalField" ,"Grid3DField" ,"RealisticField" ,
149 "UndefinedField","AthenaField" , "?????" };
150 int mode = m_fieldprop.magneticFieldMode();
151 if(mode<0 || mode>8 ) mode = 8;
152 std::string lineSeparator(90,'-');
153 lineSeparator = "|" + lineSeparator + "|\n";
154 const auto & w12 = std::setw(12);
155 const auto & sp5 = std::setprecision(5);
156 const std::string spaces = " |\n";
157 out<< lineSeparator;
158 out<<"| TRT container | "<< pad(m_trtname.key());
159 out<<"| Tool for propagation | "<< pad(m_proptool.type());
160 out<<"| Tool for updator | "<< pad(m_updatortool.type());
161 out<<"| Tool for rio on trackD | "<< pad(m_riontrackD.type());
162 out<<"| Tool for rio on trackN | "<< pad(m_riontrackN.type());
163 out<<"| Tool for road builder | "<< pad(m_roadtool.type());
164 out<<"| Magnetic field mode | "<< pad(fieldmode[mode]);
165 out<<"| Segments find mode | "<< w12 << m_segmentFindMode << spaces;
166 out<<"| TRT road half width (mm)| "<< w12 << sp5<< m_roadwidth << spaces;
167 out<<"| Min number DriftCircles | "<< w12 << m_minNumberDCs << spaces;
168 out<<"| Use drift time ? | "<< w12 << m_usedriftrad << spaces;
169 out<<"| Z vertex half width | "<< w12 << m_zVertexWidth << spaces;
170 out<<"| Scalefactor hit error | "<< w12 << m_scale_error <<spaces;
171 out<<"| Max impact parameter | "<< w12 << m_impact <<spaces;
172 out<< lineSeparator;
173 return out;
174}
175
177// Dumps relevant information into the ostream
179
180std::ostream& InDet::TRT_TrackExtensionTool_xk::dump( std::ostream& out ) const
181{
182 return out;
183}
184
186// Overload of << operator MsgStream
188
189MsgStream& InDet::operator <<
190 (MsgStream& sl,const InDet::TRT_TrackExtensionTool_xk& se)
191{
192 return se.dump(sl);
193}
194
196// Overload of << operator std::ostream
198
199std::ostream& InDet::operator <<
200 (std::ostream& sl,const InDet::TRT_TrackExtensionTool_xk& se)
201{
202 return se.dump(sl);
203}
204
206// Track extension initiation
208
209std::unique_ptr<InDet::ITRT_TrackExtensionTool::IEventData>
210InDet::TRT_TrackExtensionTool_xk::newEvent(const EventContext& ctx) const
211{
213
214 if((not trtcontainer.isValid()) && m_outputlevel<=0) {
215 std::stringstream msg;
216 msg << "Missing TRT_DriftCircleContainer " << m_trtname.key();
217 throw std::runtime_error( msg.str() );
218 }
219
220 // Get AtlasFieldCache
221 MagField::AtlasFieldCache fieldCache;
222
224 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
225 if (fieldCondObj == nullptr) {
226 ATH_MSG_ERROR("InDet::TRT_TrackExtensionTool_xk::findSegment: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
227 return nullptr;
228 }
229 fieldCondObj->getInitializedCache (fieldCache);
230
231 Trk::MagneticFieldProperties fieldprop = ( fieldCache.solenoidOn()
234
235 auto event_data = std::make_unique<EventData>(EventData(trtcontainer.cptr(), m_maxslope));
236 event_data->m_trajectory.set(fieldprop, fieldCondObj);
237 event_data->m_trajectory.set (m_trtid,
238 m_proptool.get(),
239 m_updatortool.get(),
240 m_riontrackD.get(),
241 m_riontrackN.get(),
244 m_impact,
247 event_data->m_measurement.reserve(200);
248 return event_data;
249}
250
252// Main methods for track extension to TRT
254
255std::vector<const Trk::MeasurementBase*>&
257 const Trk::Track& Tr,
260{
263 event_data.m_measurement.clear();
264 const Trk::TrackStates* tsos = Tr.trackStateOnSurfaces();
265 const Trk::TrackParameters* par = tsos->back()->trackParameters(); //tsos owns this
266 if(!par ) return event_data.m_measurement;
267 const Trk::TrackParameters* parb = tsos->front()->trackParameters(); //tsos owns this
268 if(parb && par!=parb) {
269 const Amg::Vector3D& g1 = par ->position();
270 const Amg::Vector3D& g2 = parb->position();
271 if((g2.x()*g2.x()+g2.y()*g2.y()) > (g1.x()*g1.x()+g1.y()*g1.y())) par=parb;
272 }
273 return extendTrackFromParameters(ctx, par, event_data,used);
274}
275
277// Main methods for track extension to TRT for pixles+sct tracks
279
280std::vector<const Trk::MeasurementBase*>&
290
291
292std::vector<const Trk::MeasurementBase*>&
294 const Trk::TrackParameters * par,
297{
298 event_data.m_measurement.clear();
299 if(isGoodExtension(ctx, par,event_data,used)) event_data.m_trajectory.convert(event_data.m_measurement);
300 return event_data.m_measurement;
301}
302
304// Main methods for segment finding in TRT for TRT seeds
306
309 const Trk::TrackParameters * par,
312{
315
316 int nCut = m_minNumberDCs;
317 if(m_parameterization) {nCut = m_selectortool->minNumberDCs(par);
318 if(nCut<m_minNumberDCs) nCut=m_minNumberDCs;}
319
320 // Get AtlasFieldCache
321 MagField::AtlasFieldCache fieldCache;
322
324 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
325 if (fieldCondObj == nullptr) {
326 ATH_MSG_ERROR("InDet::TRT_TrackExtensionTool_xk::findSegment: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
327 return nullptr;
328 }
329 fieldCondObj->getInitializedCache (fieldCache);
330
331 // TRT detector elements road builder
332 //
333 const std::vector<const InDetDD::TRT_BaseElement*>& detectorElements =
334 m_roadtool->detElementsRoad(ctx, fieldCache, *par, Trk::alongMomentum,
335 used);
336
337 if(int(detectorElements.size())< nCut) return nullptr;
338
339 // Array pointers to surface preparation
340 //
341 auto surfaces =vectorOfSurfacesFromVectorOfElements(detectorElements);
342
343 // Global position on surfaces production
344 //
346 if(!Tp.production(par)) return nullptr;
347 std::vector< std::pair<Amg::Vector3D,double> > gpos;
348 m_proptool->globalPositions(ctx, Tp, surfaces, gpos, m_fieldprop);
349
350 // Initiate trajectory
351 //
352 event_data.m_trajectory.initiateForTRTSeed(gpos,detectorElements,event_data.m_trtcontainer,Tp);
353 if(event_data.m_trajectory.naElements() < nCut) return nullptr;
354 event_data.m_maxslope = .0002 ;
355 if(event_data.m_trajectory.isFirstElementBarrel()) {
357 else event_data.m_trajectory.trackFindingWithoutDriftTime(event_data.m_maxslope);
358 if(!event_data.m_trajectory.searchStartStop()) {return nullptr;}
359 } else {
361 if(!event_data.m_trajectory.searchStartStop()) { return nullptr;}
362 event_data.m_trajectory.radiusCorrection();
364 else event_data.m_trajectory.trackFindingWithoutDriftTimeBL(event_data.m_maxslope);
365 if(!event_data.m_trajectory.searchStartStop()) { return nullptr;}
366 }
367
368 // Track associate with clusters and holes
369 //
371 event_data.m_maxslope = m_maxslope;
372
373 // Trajectory quality test
374 //
375 int nc = event_data.m_trajectory.nclusters();
376 int nh = event_data.m_trajectory.nholes ();
377 if( nc < nCut || (1000*nc) < (700*(nc+nh)) ) return nullptr;
378
379 if (m_segmentFindMode==0) {
381 return nullptr;
382 }
383 else if(m_segmentFindMode==1) {
385 return nullptr;
386 }
387 else if(m_segmentFindMode==2) {
389 return nullptr;
390 }
391 else {
392 if(!event_data.m_trajectory.fitter())
393 return nullptr;
394 }
395
396 if(event_data.m_trajectory.nclusters() < nCut) return nullptr;
397
398 // Trk::TrackSegment production
399 //
400 return event_data.m_trajectory.convert();
401}
402
404// Test possiblity extend track to TRT for pixels+sct tracks
406
407bool
409 const Trk::TrackParameters * par,
412{
413 // Get AtlasFieldCache
414 MagField::AtlasFieldCache fieldCache;
415
417 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
418 if (fieldCondObj == nullptr) {
419 ATH_MSG_ERROR("InDet::TRT_TrackExtensionTool_xk::findSegment: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
420 return false;
421 }
422 fieldCondObj->getInitializedCache (fieldCache);
423 // TRT detector elements road builder
424 //
425 const std::vector<const InDetDD::TRT_BaseElement*>& detectorElements =
426 m_roadtool->detElementsRoad(ctx, fieldCache, *par, Trk::alongMomentum, used);
427 if (int(detectorElements.size()) < m_minNumberDCs)
428 return false;
429 // Array pointers to surface preparation
430 //
431 auto surfaces = vectorOfSurfacesFromVectorOfElements(detectorElements);
432
433 // Global position on surfaces production
434 //
436 if(!Tp.production(par)) return false;
437 std::vector< std::pair<Amg::Vector3D,double> > gpos;
438 m_proptool->globalPositions(ctx, Tp,surfaces,gpos,m_fieldprop);
439
440 // Initiate trajectory
441 //
442
443 event_data.m_trajectory.initiateForPrecisionSeed(gpos,detectorElements,event_data.m_trtcontainer,Tp);
444 if(event_data.m_trajectory.naElements() < m_minNumberDCs) return false;
445
446 // Track finding
447 //
449 else event_data.m_trajectory.trackFindingWithoutDriftTime(event_data.m_maxslope);
450
451 // Track associate with clusters and holes
452 //
454
455 // Final test quality
456 //
457 return event_data.m_trajectory.nclusters() >= m_minNumberDCs;
458}
459
461// Methods for track extension to TRT for pixles+sct tracks
462// and new track production
464
467 const Trk::Track& Tr,
470{
473
474 const Trk::TrackStates* tsos = Tr.trackStateOnSurfaces();
475
476 // Test conditions to start track extension to TRT
477 //
478 const Trk::TrackParameters* pe = tsos->back()->trackParameters();
479 if(!pe) return nullptr;
480 if(!pe->covariance()) return nullptr;
481 const Trk::TrackParameters* pb = tsos->front()->trackParameters();
482 if(!pb) return nullptr;
483 if(!pb->covariance()) return nullptr;
484
485 // Number PIX and SCT clusters cuts
486 //
487 if(!numberPIXandSCTclustersCut(Tr)) return nullptr;
488
489 // Test possibility extend track and new track production
490 //
491 if(isGoodExtension(ctx, pe,event_data,used)) return event_data.m_trajectory.convert(Tr);
492 return nullptr;
493}
494
496// Number of SCT clusters test for start extension
498
499bool
501{
502 if(m_minNumberSCT <=0 && m_minNumberPIX <=0) return true;
503 const Trk::TrackStates*tsos = Tr.trackStateOnSurfaces();
504 Trk::TrackStates::const_iterator s = tsos->begin(), se = tsos->end();
505 int npix = 0;
506 int nsct = 0;
507 for(; s!=se; ++s) {
509 const Trk::MeasurementBase* mb = (*s)->measurementOnTrack();
510 if(!mb) continue;
511 const Trk::RIO_OnTrack* ri = dynamic_cast<const Trk::RIO_OnTrack*>(mb);
512 if(!ri) continue;
513 const Trk::PrepRawData* rd = ri->prepRawData();
514 if(!rd) continue;
515 const InDet::SiCluster* si = dynamic_cast<const InDet::SiCluster*>(rd);
516 if(si) {
517 if(dynamic_cast<const InDet::SCT_Cluster*>(si)) ++nsct;
518 else ++npix;
519 }
520 else return false;
521 }
522 }
523 return npix >= m_minNumberPIX && nsct >= m_minNumberSCT;
524}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
static Double_t Tp(Double_t *t, Double_t *par)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
const ServiceHandle< StoreGateSvc > & detStore() const
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
Definition DataVector.h:838
const T * back() const
Access the last element in the collection as an rvalue.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
const T * front() const
Access the first element in the collection as an rvalue.
std::vector< const Trk::MeasurementBase * > m_measurement
InDet::TRT_TrackExtensionTool_xk is algorithm which produce track extension to TRT.
ToolHandle< ITRT_DetElementsRoadMaker > m_roadtool
PublicToolHandle< Trk::IPatternParametersPropagator > m_proptool
SG::ReadHandleKey< TRT_DriftCircleContainer > m_trtname
bool numberPIXandSCTclustersCut(const Trk::Track &) const
PublicToolHandle< Trk::IPatternParametersUpdator > m_updatortool
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
virtual MsgStream & dump(MsgStream &out) const override
virtual Trk::Track * newTrack(const EventContext &ctx, const Trk::Track &, InDet::ITRT_TrackExtensionTool::IEventData &virt_event_data, InDet::TRT_DetElementLink_xk::TRT_DetElemUsedMap &used) const override
ToolHandle< Trk::IRIO_OnTrackCreator > m_riontrackD
bool isGoodExtension(const EventContext &ctx, const Trk::TrackParameters *, InDet::TRT_TrackExtensionTool_xk::EventData &event_data, InDet::TRT_DetElementLink_xk::TRT_DetElemUsedMap &used) const
virtual std::vector< const Trk::MeasurementBase * > & extendTrack(const EventContext &ctx, const Trk::Track &, InDet::ITRT_TrackExtensionTool::IEventData &virt_event_data, InDet::TRT_DetElementLink_xk::TRT_DetElemUsedMap &used) const override
TRT_TrackExtensionTool_xk(const std::string &, const std::string &, const IInterface *)
virtual Trk::TrackSegment * findSegment(const EventContext &ctx, const Trk::TrackParameters *, InDet::ITRT_TrackExtensionTool::IEventData &virt_event_data, InDet::TRT_DetElementLink_xk::TRT_DetElemUsedMap &used) const override
virtual StatusCode initialize() override
std::vector< const Trk::MeasurementBase * > & extendTrackFromParameters(const EventContext &ctx, const Trk::TrackParameters *, InDet::TRT_TrackExtensionTool_xk::EventData &event_data, InDet::TRT_DetElementLink_xk::TRT_DetElemUsedMap &used) const
virtual std::unique_ptr< InDet::ITRT_TrackExtensionTool::IEventData > newEvent(const EventContext &ctx) const override
ToolHandle< ITrtDriftCircleCutTool > m_selectortool
ToolHandle< Trk::IRIO_OnTrackCreator > m_riontrackN
MsgStream & dumpConditions(MsgStream &out) const
Trk::MagneticFieldProperties m_fieldprop
const int & naElements() const
void initiateForPrecisionSeed(std::vector< std::pair< Amg::Vector3D, double > > &, const std::vector< const InDetDD::TRT_BaseElement * > &, const TRT_DriftCircleContainer *&, const Trk::PatternTrackParameters &)
void convert(std::vector< const Trk::MeasurementBase * > &)
void trackFindingWithoutDriftTimeBL(double)
bool trackParametersEstimationForFirstPointWithVertexConstraint()
const int & nclusters() const
bool trackParametersEstimationForPerigeeWithVertexConstraint()
const int & nholes() const
void initiateForTRTSeed(std::vector< std::pair< Amg::Vector3D, double > > &, const std::vector< const InDetDD::TRT_BaseElement * > &, const TRT_DriftCircleContainer *&, const Trk::PatternTrackParameters &)
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
bool solenoidOn() const
status of the magnets
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
static EventData & getPrivateEventData(InDet::ITRT_TrackExtensionTool::IEventData &virt_event_data)
magnetic field properties to steer the behavior of the extrapolation
This class is the pure abstract base class for all fittable tracking measurements.
const Amg::Vector3D & position() const
Access method for the position.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
Class for a generic track segment that holdes polymorphic Trk::MeasurementBase objects,...
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
holding In fact this class is here in order to allow STL container for all features This class is sho...
Eigen::Matrix< double, 3, 1 > Vector3D
@ alongMomentum
DataVector< const Trk::TrackStateOnSurface > TrackStates
@ FastField
call the fast field access method of the FieldSvc
@ NoField
Field is set to 0., 0., 0.,.
@ FullField
Field is set to be realistic, but within a given Volume.
ParametersBase< TrackParametersDim, Charged > TrackParameters