ATLAS Offline Software
Loading...
Searching...
No Matches
InDet::TRT_SeededTrackFinder Class Reference

InDet::TRT_SeededTrackFinde is an algorithm which produces tracks moving outside-in in the Inner Detector. More...

#include <TRT_SeededTrackFinder.h>

Inheritance diagram for InDet::TRT_SeededTrackFinder:
Collaboration diagram for InDet::TRT_SeededTrackFinder:

Classes

struct  Stat_t
 Global Counters for final algorithm statistics. More...

Public Member Functions

 TRT_SeededTrackFinder (const std::string &name, ISvcLocator *pSvcLocator)
 Standard Algorithm methods.
virtual ~TRT_SeededTrackFinder ()
StatusCode initialize () override
StatusCode execute (const EventContext &ctx) const override
StatusCode finalize () override
MsgStream & dump (MsgStream &out) const
 Print internal tool parameters and status.
std::ostream & dump (std::ostream &out) const
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

Trk::TrackmergeSegments (const Trk::Track &, const Trk::TrackSegment &) const
 Protected methods.
Trk::TrackmergeExtension (const Trk::Track &, std::vector< const Trk::MeasurementBase * > &) const
 Merge a TRT track extension and a Si track component into one global ID track.
Trk::TracksegToTrack (const EventContext &, const Trk::TrackSegment &) const
 Transform a TRT track segment into a track.
void Analyze (TrackCollection *) const
 Do some statistics analysis at the end of each event.
MsgStream & dumptools (MsgStream &out) const
MsgStream & dumpevent (MsgStream &out, const InDet::TRT_SeededTrackFinder::Stat_t &stat) const
void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Protected Attributes

BooleanProperty m_doRefit {this, "FinalRefit", false, "Do a final careful refit of tracks"}
BooleanProperty m_doExtension {this, "TrtExtension", false, "Find the TRT extension of the track"}
BooleanProperty m_rejectShortExten {this, "RejectShortExtension", false, "Reject short extensions"}
BooleanProperty m_doStat {this, "FinalStatistics", false, "Statistics of final tracks"}
BooleanProperty m_saveTRT {this, "OutputSegments", true, "Save stand-alone TRT segments"}
IntegerProperty m_MaxSegNum
UnsignedIntegerProperty m_minTRTonSegment {this, "MinTRTonSegment", 10, "Minimum Number of TRT Hits on segment"}
UnsignedIntegerProperty m_minTRTonly {this, "MinTRTonly", 15, "Minimum number of TRT hits on TRT only"}
ToolHandle< ITRT_SeededTrackFinderm_trackmaker
ToolHandle< Trk::ITrackFitterm_fitterTool
ToolHandle< ITRT_TrackExtensionToolm_trtExtension
SG::ReadHandleKey< Trk::SegmentCollectionm_SegmentsKey {this, "InputSegmentsLocation", "TRTSegments", "TRT segments to use"}
SG::WriteHandleKey< TrackCollectionm_outTracksKey
SG::ReadHandleKey< Trk::PRDtoTrackMapm_prdToTrackMap {this, "PRDtoTrackMap", "" }
ToolHandle< Trk::IExtendedTrackSummaryToolm_trackSummaryTool {this, "TrackSummaryTool", "InDetTrackSummaryToolNoHoleSearch"}
ToolHandle< Trk::IExtrapolatorm_extrapolator {this, "Extrapolator", ""}
SG::ReadCondHandleKey< InDet::BeamSpotDatam_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"}
BooleanProperty m_SiExtensionCuts {this, "SiExtensionCuts", false, "enable cuts after Si segment finding"}
DoubleProperty m_minPt {this, "minPt", 500., "minimal Pt cut"}
DoubleProperty m_maxEta {this, "maxEta", 2.7, "maximal Eta cut"}
DoubleProperty m_maxRPhiImp {this, "maxRPhiImp", 10., "maximal RPhi impact parameter cut"}
DoubleProperty m_maxZImp {this, "maxZImp", 250., "maximal z impact parameter cut"}
BooleanProperty m_caloSeededRoI {this, "CaloSeededRoI", false}
SG::ReadHandleKey< ROIPhiRZContainerm_caloClusterROIKey
ToolHandle< IRegSelToolm_regionSelector
FloatProperty m_deltaEta {this, "dEtaCaloRoI", 0.1, "delta Eta used for RoI creation"}
FloatProperty m_deltaPhi {this, "dPhiCaloRoI", 0.25, "delta Phi used for RoI creation"}
FloatProperty m_deltaZ {this, "dZCaloRoI", 300., "delta Z used for RoI creation"}
std::mutex m_statMutex ATLAS_THREAD_SAFE
Stat_t m_totalStat ATLAS_THREAD_SAFE

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

InDet::TRT_SeededTrackFinde is an algorithm which produces tracks moving outside-in in the Inner Detector.

Definition at line 54 of file TRT_SeededTrackFinder.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ TRT_SeededTrackFinder()

InDet::TRT_SeededTrackFinder::TRT_SeededTrackFinder ( const std::string & name,
ISvcLocator * pSvcLocator )

Standard Algorithm methods.

Definition at line 38 of file TRT_SeededTrackFinder.cxx.

40 : AthReentrantAlgorithm(name, pSvcLocator)
41{ }

◆ ~TRT_SeededTrackFinder()

virtual InDet::TRT_SeededTrackFinder::~TRT_SeededTrackFinder ( )
inlinevirtual

Definition at line 67 of file TRT_SeededTrackFinder.h.

67{}

Member Function Documentation

◆ Analyze()

void InDet::TRT_SeededTrackFinder::Analyze ( TrackCollection * tC) const
protected

Do some statistics analysis at the end of each event.

Loop over tracks in track collection

Concentrate on the Si component of the track

Definition at line 668 of file TRT_SeededTrackFinder.cxx.

668 {
669 if(msgLvl(MSG::DEBUG)) {
670 ATH_MSG_DEBUG( "Analyzing tracks..." );
671 ATH_MSG_DEBUG( "Number of back tracks " << (tC->size()) );
672 int nsct1{}, nsct2{}, nsct3{}, nsct4{}; //SCT layer counters
673 int nsctTot1{}, nsctTot2{}, nsctTot3{}, nsctTot4{}; //SCT layer counters
674 int npix1{}, npix2{}, npix3{}; //Pixel layer counters
675 int npixTot1{}, npixTot2{}, npixTot3{}; //Pixel layer counters
679 for (; r != re ; ++r){
680 nsct1=nsct2=nsct3=nsct4=0; npix1=npix2=npix3=0;
681 const Trk::TrackStates* newtsos = (*r)->trackStateOnSurfaces();
682 if(!newtsos) continue;
684 for(itp=newtsos->begin(); itp!=itpe; ++itp){
686 const InDet::SiClusterOnTrack* clus = dynamic_cast<const InDet::SiClusterOnTrack*>((*itp)->measurementOnTrack());
687 if(clus && ((*itp)->type(Trk::TrackStateOnSurface::Measurement))){ //Count the number of hits used in the track
688 double rc = clus->globalPosition().perp();
689 if((40.<=rc)&&(rc<80.)){npix1++;} //1st pixel layer
690 if((80.<=rc)&&(rc<100.)){npix2++;} //2nd pixel layer
691 if((100.<=rc)&&(rc<150.)){npix3++;} //3rd pixel layer
692 if((280.<=rc)&&(rc<340.)){nsct1++;} //1st SCT layer
693 if((340.<=rc)&&(rc<390.)){nsct2++;} //2nd SCT layer
694 if((390.<=rc)&&(rc<460.)){nsct3++;} //3rd SCT layer
695 if((460.<=rc)&&(rc<550.)){nsct4++;} //4th SCT layer
696 }
697 }
698 nsctTot1+=nsct1; nsctTot2+=nsct2; nsctTot3+=nsct3; nsctTot4+=nsct4;
699 npixTot1+=npix1; npixTot2+=npix2; npixTot3+=npix3;
700 }
701 ATH_MSG_DEBUG("Total hits on 1st SCT: "<<nsctTot1<<" 2nd SCT: "<<nsctTot2<<" 3rd SCT: "<<nsctTot3<<" 4th SCT: "<<nsctTot4);
702 ATH_MSG_DEBUG("Total hits on 1st Pixel: "<<npixTot1<<" 2nd Pixel: "<<npixTot2<<" 3rd Pixel: "<<npixTot3);
703 }
704}
const boost::regex re(r_e)
#define ATH_MSG_DEBUG(x)
static Double_t rc
bool msgLvl(const MSG::Level lvl) const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
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.
size_type size() const noexcept
Returns the number of elements in the collection.
virtual const Amg::Vector3D & globalPosition() const override
returns global position (gathered through Surface constraint)
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
int r
Definition globals.cxx:22
DataVector< const Trk::TrackStateOnSurface > TrackStates

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ dump() [1/2]

MsgStream & InDet::TRT_SeededTrackFinder::dump ( MsgStream & out) const

Print internal tool parameters and status.

◆ dump() [2/2]

std::ostream & InDet::TRT_SeededTrackFinder::dump ( std::ostream & out) const

◆ dumpevent()

MsgStream & InDet::TRT_SeededTrackFinder::dumpevent ( MsgStream & out,
const InDet::TRT_SeededTrackFinder::Stat_t & stat ) const
protected

Definition at line 461 of file TRT_SeededTrackFinder.cxx.

462{
463 out<<"|-------------------------------------------------------------------"<<std::endl;
464 out<<"| Investigated :"<<std::endl
465 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtSeg] <<" TRT Segments on input"<<std::endl
466 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtFailSel] <<" TRT Segments fail selection on input"<<std::endl
467 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtSegGood] <<" TRT Segments after selection"<<std::endl;
468 if (stat.m_counter[Stat_t::kNTrtLimit]>0) {
469 out<<"|-------------------------------------------------------------------"<<std::endl;
470 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtLimit] <<" TRT segments lost because of processing limit"<<std::endl;
471 }
472 out<<"|-------------------------------------------------------------------"<<std::endl;
473 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtNoSiExt] <<" TRT segments without Si extension"<<std::endl;
474 if (m_SiExtensionCuts) {
475 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNExtCut] <<" number of Si extension failing cuts"<<std::endl;
476 }
477 if (stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt]>0) {
478 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt] <<" number ot TRT only tracks created"<<std::endl;
479 }
480 if (m_doExtension) {
481 out<<"|-------------------------------------------------------------------"<<std::endl;
482 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtExtCalls]<<" number of times TRT extension is called"<<std::endl
483 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtExt] <<" number of good TRT extension"<<std::endl;
484 if (m_rejectShortExten) {
485 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtExtBad]<<" number of bad TRT extension"<<std::endl;
486 }
487 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtExtFail]<<" number of failed TRT extension and fallback"<<std::endl;
488 }
489 out<<"|-------------------------------------------------------------------"<<std::endl;
490 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNBckTrkSi] <<" TRT+Si tracks created of output"<<std::endl;
491 if (stat.m_counter[Stat_t::kNBckTrkSi] != stat.m_counter[Stat_t::kNBckTrk]) {
492 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNBckTrk] <<" total number of tracks on output"<<std::endl;
493 }
494 out<<"|-------------------------------------------------------------------";
495 return out;
496}
@ kNTrtFailSel
Number of TRT segments to be investigated per event.
@ kNTrtNoSiExt
Number of TRT segments lost in busy events.
@ kNBckTrk
Number of back tracks found with Si extension per event.
@ kNTrtLimit
Number of TRT segments that will be investigated per event.
@ kNBckTrkSi
Number of failed TRT extensions.
@ kNExtCut
Number of TRT segments not extended in Si.
@ kNTrtExt
Number of times the TRT extension is called.

◆ dumptools()

MsgStream & InDet::TRT_SeededTrackFinder::dumptools ( MsgStream & out) const
protected

Definition at line 430 of file TRT_SeededTrackFinder.cxx.

431{
432 int n = 65-m_trackmaker.type().size();
433 std::string s1; for(int i=0; i<n; ++i) s1.append(" "); s1.append("|");
434 n = 65-m_fitterTool.type().size();
435 std::string s2; for(int i=0; i<n; ++i) s2.append(" "); s2.append("|");
436 n = 65-m_trtExtension.type().size();
437 std::string s3; for(int i=0; i<n; ++i) s3.append(" "); s3.append("|");
438 n = 65-m_SegmentsKey.key().size();
439 std::string s4; for(int i=0; i<n; ++i) s4.append(" "); s4.append("|");
440 n = 65-m_outTracksKey.key().size();
441 std::string s5; for(int i=0; i<n; ++i) s5.append(" "); s5.append("|");
442
443 out<<"|----------------------------------------------------------------------"
444 <<"-------------------|"
445 <<std::endl;
446 out<<"| Tool for TRT seeded track finding | "<<m_trackmaker.type() <<s1<<std::endl;
447 out<<"| Tool for final track refitting | "<<m_fitterTool.type() <<s2<<std::endl;
448 out<<"| Tool for TRT trac extension | "<<m_trtExtension.type() <<s3<<std::endl;
449 out<<"| Location of input tracks | "<<m_SegmentsKey.key() <<s4<<std::endl;
450 out<<"| Location of output tracks | "<<m_outTracksKey.key() <<s5<<std::endl;
451 out<<"|----------------------------------------------------------------------"
452 <<"-------------------|"
453 <<std::endl;
454 return out;
455}
ToolHandle< ITRT_SeededTrackFinder > m_trackmaker
ToolHandle< ITRT_TrackExtensionTool > m_trtExtension
ToolHandle< Trk::ITrackFitter > m_fitterTool
SG::WriteHandleKey< TrackCollection > m_outTracksKey
SG::ReadHandleKey< Trk::SegmentCollection > m_SegmentsKey

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode InDet::TRT_SeededTrackFinder::execute ( const EventContext & ctx) const
override

Transform the original TRT segment into a track

Definition at line 118 of file TRT_SeededTrackFinder.cxx.

118 {
119 //Counters. See the include file for definitions
120 Stat_t ev_stat;
121 // counter
122 int nTrtSegCur = 0;
123 SG::ReadHandle<Trk::SegmentCollection> segments(m_SegmentsKey,ctx);
124 if(!segments.isValid()){
125 ATH_MSG_FATAL ("No segment with name " << segments.name() << " found in StoreGate!");
126 return StatusCode::FAILURE;
127 } else {
128 ATH_MSG_DEBUG ("Found segments collection " << segments.name() << " in StoreGate!");
129 }
130 // number of segments + statistics
131 ev_stat.m_counter[Stat_t::kNTrtSeg] = int(segments->size());
132 ATH_MSG_DEBUG ("TRT track container size " << ev_stat.m_counter[Stat_t::kNTrtSeg]);
133 if(ev_stat.m_counter[Stat_t::kNTrtSeg]>m_MaxSegNum) {
134 ATH_MSG_DEBUG ("TRT track container size huge; will process event partially if number of max segments reached !!!");
135 }
136 // Event dependent data of SiCombinatorialTrackFinder_xk
137 InDet::ExtendedSiCombinatorialTrackFinderData_xk combinatorialData(m_prdToTrackMap);
138 std::unique_ptr<InDet::ITRT_SeededTrackFinder::IEventData> event_data_p;
139 if(m_caloSeededRoI ) {
140 SG::ReadHandle<ROIPhiRZContainer> calo_rois(m_caloClusterROIKey, ctx);
141 std::unique_ptr<RoiDescriptor> roiComp = std::make_unique<RoiDescriptor>(true);
142 if (calo_rois.isValid()) {
143 RoiDescriptor * roi =nullptr;
144 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx };
145 double beamZ = beamSpotHandle->beamVtx().position().z();
146 roiComp->clear();
147 roiComp->setComposite();
148 for (const ROIPhiRZ &the_roi : *calo_rois) {
149 double eta = the_roi.eta();
150 double phi = the_roi.phi();
151 double roiPhiMin = phi -m_deltaPhi;
152 double roiPhiMax = phi +m_deltaPhi;
153 double roiEtaMin = eta -m_deltaEta;
154 double roiEtaMax = eta +m_deltaEta;
155 double roiZMin = beamZ -m_deltaZ;
156 double roiZMax = beamZ +m_deltaZ;
157 roi = new RoiDescriptor( eta, roiEtaMin, roiEtaMax,phi, roiPhiMin ,roiPhiMax, beamZ, roiZMin,roiZMax);
158 roiComp->push_back(roi);
159 }
160
161 }
162 std::vector<IdentifierHash> listOfSCTIds;
163 std::vector<IdentifierHash> listOfPixIds;
164
165 m_regionSelector->lookup(ctx)->HashIDList( *roiComp, listOfSCTIds );
166
167 event_data_p = m_trackmaker->newRegion(ctx, combinatorialData, listOfPixIds, listOfSCTIds);
168 } else {
169 event_data_p = m_trackmaker->newEvent(ctx, combinatorialData);
170 }
171
172 std::unique_ptr<InDet::ITRT_TrackExtensionTool::IEventData> ext_event_data_p( m_trtExtension->newEvent(ctx) );
173 std::unique_ptr<TrackCollection> outTracks = std::make_unique<TrackCollection>();
174 std::vector<Trk::Track*> tempTracks; //Temporary track collection
175 tempTracks.reserve(128);
176 // loop over event
177 ATH_MSG_DEBUG ("Begin looping over all TRT segments in the event");
178 Trk::SegmentCollection::const_iterator iseg = segments->begin();
179 Trk::SegmentCollection::const_iterator isegEnd = segments->end();
181 for(; iseg != isegEnd; ++ iseg) {
182 // Get the track segment
183 const Trk::TrackSegment *trackTRT = dynamic_cast<const Trk::TrackSegment*>(*iseg);
184 if(!trackTRT){
185 ATH_MSG_ERROR ("No pointer to segment !");
186 continue;
187 } else {
188 // the segment finder is applying a TRT(eta) cut and a pt preselection, so we don't do that here
189 //Ask for at least 10 TRT hits in order to process
191 ATH_MSG_DEBUG ("TRT segment fails nTRT hit cut, reject.");
192 // statistics
193 ev_stat.m_counter[Stat_t::kNTrtFailSel]++;
194 } else {
195 // do we continue to process ?
196 nTrtSegCur++;
197 if(nTrtSegCur>=m_MaxSegNum) {
198 ATH_MSG_DEBUG ("====> Reached maximal number of segments in event, stop !!!");
199 // statistics
200 ev_stat.m_counter[Stat_t::kNTrtLimit]++;
201 break;
202 }
203 // Get the number of the TRT track segment ROTs
204 ATH_MSG_DEBUG ("=> New segment to process, number Of TRT ROTs : " << (trackTRT->numberOfMeasurementBases()));
205 // statistics
206 ev_stat.m_counter[Stat_t::Stat_t::kNTrtSegGood]++;
207 // ok, call track maker and get list of possible track candidates
208 std::list<Trk::Track*> trackSi = m_trackmaker->getTrack(ctx, *event_data_p, *trackTRT); //Get the possible Si extensions
209 if (trackSi.empty()) {
210 ATH_MSG_DEBUG ("No Si track candidates associated to the TRT track ");
211 // statistics
212 ev_stat.m_counter[Stat_t::kNTrtNoSiExt]++;
213 // obsolete backup of TRT only
216 Trk::Track* trtSeg = nullptr;trtSeg = segToTrack(ctx, *trackTRT);
217 if(!trtSeg) {
218 ATH_MSG_DEBUG ("Failed to make a track out of the TRT segment!");
219 continue;
220 }
221 // statistics
222 ev_stat.m_counter[Stat_t::kNBckTrk]++; ev_stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt]++;
223 // add track to output list
224 outTracks->push_back(trtSeg);
225 }
226 continue;
227 } else {
228 // Found useful extensions
229 ATH_MSG_DEBUG ("Found " << (trackSi.size()) << " Si tracks associated to the TRT track ");
230 // Merge the resolved Si extensions with the original TRT track segment
231 std::list<Trk::Track*>::const_iterator itt = trackSi.begin();
232 std::list<Trk::Track*>::const_iterator ittEnd = trackSi.end();
233 for (; itt != ittEnd ; ++itt){
234 tempTracks.push_back(*itt);
235 // get list of TSOS
236 const Trk::TrackStates* temptsos = (*itt)->trackStateOnSurfaces();
237 if (!temptsos) {
238 ATH_MSG_DEBUG ("Silicon extension empty ???");
239 continue;
240 }
241 // Add the track to the list of tracks in the event
242 ATH_MSG_DEBUG ("Silicon extension found has length of : " << temptsos->size());
243 // do we do a preselection ?
244 if (m_SiExtensionCuts) {
245 // get parameters without errors
246 auto input = (*itt)->trackParameters()->front()->uniqueClone();
247 // cuts on parameters
248 if (std::abs(input->pT()) < m_minPt) {
249 ATH_MSG_DEBUG ("Track pt < "<<m_minPt<<", reject it");
250 // statistics
251 ev_stat.m_counter[Stat_t::kNExtCut]++;
252 continue;
253 }
254 if (std::abs(input->eta()) > m_maxEta) {
255 ATH_MSG_DEBUG ("Track eta > "<<m_maxEta<<", reject it");
256 // statistics
257 ev_stat.m_counter[Stat_t::kNExtCut]++;
258 continue;
259 }
260 // --- beam spot position
261 Amg::Vector3D beamSpotPosition(0,0,0);
263 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx };
264 beamSpotPosition = beamSpotHandle->beamVtx().position();
265 }
266 // --- create surface
267 Trk::PerigeeSurface perigeeSurface(beamSpotPosition);
268
269 // uses perigee on track or extrapolates, no material in any case, we cut on impacts
270 std::unique_ptr<const Trk::TrackParameters> parm =
271 m_extrapolator->extrapolateDirectly(
272 ctx, *input, perigeeSurface);
273 std::unique_ptr<const Trk::Perigee> extrapolatedPerigee = nullptr;
274 if (parm && parm->associatedSurface().type() == Trk::SurfaceType::Perigee) {
275 extrapolatedPerigee.reset(static_cast<const Trk::Perigee*>(parm.release()));
276 }
277 if (!extrapolatedPerigee) {
278 ATH_MSG_WARNING("Extrapolation of perigee failed, this should never happen" );
279 // statistics
280 ev_stat.m_counter[Stat_t::kNExtCut]++;
281 continue;
282 }
283
284 ATH_MSG_VERBOSE ("extrapolated perigee: "<<*extrapolatedPerigee);
285 if (std::abs(extrapolatedPerigee->parameters()[Trk::d0]) > m_maxRPhiImp) {
286 ATH_MSG_DEBUG ("Track Rphi impact > "<<m_maxRPhiImp<<", reject it");
287 // statistics
288 ev_stat.m_counter[Stat_t::kNExtCut]++;
289 continue;
290 }
291 if (std::abs(extrapolatedPerigee->parameters()[Trk::z0]) > m_maxZImp) {
292 ATH_MSG_DEBUG ("Track Z impact > "<<m_maxZImp<<", reject it");
293 // statistics
294 ev_stat.m_counter[Stat_t::kNExtCut]++;
295 continue;
296 }
297 }
298
299 // do re run a Track extension into TRT ?
300 Trk::Track* globalTrackNew = nullptr;
301 // do we have 4 and extension is enabled ?
302 if(int(temptsos->size())>=4 && m_doExtension){
303 // Add the track to the list of tracks in the event
304 ATH_MSG_DEBUG ("Try to improve TRT calling extension tool.");
305 // statistics
306 ev_stat.m_counter[Stat_t::Stat_t::kNTrtExtCalls]++;
307 // call extension tool
308 std::vector<const Trk::MeasurementBase*>& tn =
309 m_trtExtension->extendTrack(ctx, *(*itt), *ext_event_data_p, map);
310 if (tn.empty()) {
311 // Fallback if extension failed
312 ATH_MSG_DEBUG ("No new segment found, use input segment as fallback.");
313 // statistics
314 ev_stat.m_counter[Stat_t::Stat_t::kNTrtExtFail]++;
315 // merge Si with input track segments
316 globalTrackNew = mergeSegments(**itt,*trackTRT);
317 } else if (!m_rejectShortExten ||
318 tn.size() >= trackTRT->numberOfMeasurementBases()) {
319 // Use the extension to instead of the segment
320 ATH_MSG_DEBUG ("Successful extension, number of TRT hits : " << tn.size() << " was : " << (trackTRT->numberOfMeasurementBases()));
321 // merge the extension with the Si track
322 globalTrackNew = mergeExtension(**itt,tn);
323 // Add the track to the list of tracks in the event
324 ATH_MSG_DEBUG ("Merged extension with Si segment");
325 // statistics
326 ev_stat.m_counter[Stat_t::kNTrtExt]++;
327 // clean up
328 std::vector<const Trk::MeasurementBase*>::const_iterator iv, ive=tn.end();
329 for(iv=tn.begin(); iv!=ive; ++iv) delete (*iv);
330 } else {
331 // Extension is shorter, let's fall back onto the original
332 ATH_MSG_DEBUG ("Extension too short, number of TRT hits : " << tn.size() << " was : " << (trackTRT->numberOfMeasurementBases()) << ". Use Segement !");
333 // merge segments
334 globalTrackNew = mergeSegments(**itt,*trackTRT);
335 // Add the track to the list of tracks in the event
336 ATH_MSG_DEBUG ("Merged TRT segment with Si segment");
337 // statistics
338 ev_stat.m_counter[Stat_t::Stat_t::kNTrtExtBad]++;
339 // clean up
340 std::vector<const Trk::MeasurementBase*>::const_iterator iv, ive=tn.end();
341 for(iv=tn.begin(); iv!=ive; ++iv) delete (*iv);
342 }
343 } else {
344 // no extension tool, jsut add the two
345 ATH_MSG_DEBUG ("Do not try to extend Si track, merging it with input TRT.");
346 // merge segments
347 globalTrackNew = mergeSegments(**itt,*trackTRT);
348 }
349 // do we have an track candidate ?
350 if(!globalTrackNew){
351 ATH_MSG_DEBUG ("Failed to merge TRT+Si track segment !");
352 if(m_saveTRT && trackTRT->numberOfMeasurementBases() > m_minTRTonly) {
353 Trk::Track* trtSeg = nullptr;trtSeg = segToTrack(ctx, *trackTRT);
354 if(!trtSeg){
355 ATH_MSG_DEBUG ("Failed to make a track out of the TRT segment!");
356 continue;
357 }
358 ATH_MSG_DEBUG ("Add TRT only to output list");
359 // statistis
360 ev_stat.m_counter[Stat_t::kNBckTrk]++; ev_stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt]++;
361 // add it to output list
362 if (m_trackSummaryTool.isEnabled()) {
363 m_trackSummaryTool->computeAndReplaceTrackSummary(*trtSeg,
364 false /* DO NOT suppress hole search*/);
365 }
366 outTracks->push_back(trtSeg);
367 }
368 } else {
369 ATH_MSG_DEBUG ("Save merged TRT+Si track segment!");
370 // statistics
371 ev_stat.m_counter[Stat_t::kNBckTrk]++; ev_stat.m_counter[Stat_t::Stat_t::kNBckTrkSi]++;
372 // add it to output list
373 if (m_trackSummaryTool.isEnabled()) {
374 m_trackSummaryTool->computeAndReplaceTrackSummary(*globalTrackNew,
375 false /* DO NOT suppress hole search*/);
376 }
377 outTracks->push_back(globalTrackNew);
378 }
379 }
380 }
381 }
382 }
383 }
384 // further debugging of results
385 if(m_doStat){
386 Analyze(outTracks.get());
387 }
388 if (SG::WriteHandle<TrackCollection>(m_outTracksKey,ctx).record(std::move(outTracks)).isFailure()){
389 ATH_MSG_ERROR("Failed to record " << m_outTracksKey.key());
390 return StatusCode::FAILURE;
391 }
392 // Update the total counters
393 {
394 std::lock_guard<std::mutex> lock(m_statMutex);
395 m_totalStat += ev_stat;
396 }
397
398 for (auto *p : tempTracks){
399 delete p;
400 }
401 m_trackmaker->endEvent(*event_data_p);
402
403 //Print common event information
404 if(msgLvl(MSG::DEBUG)){
405 dumpevent(msg(MSG::DEBUG), ev_stat);
406 }
407
408 return StatusCode::SUCCESS;
409}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Trk::Track * segToTrack(const EventContext &, const Trk::TrackSegment &) const
Transform a TRT track segment into a track.
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
Trk::Track * mergeSegments(const Trk::Track &, const Trk::TrackSegment &) const
Protected methods.
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
SG::ReadHandleKey< ROIPhiRZContainer > m_caloClusterROIKey
Trk::Track * mergeExtension(const Trk::Track &, std::vector< const Trk::MeasurementBase * > &) const
Merge a TRT track extension and a Si track component into one global ID track.
ToolHandle< Trk::IExtrapolator > m_extrapolator
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
UnsignedIntegerProperty m_minTRTonSegment
UnsignedIntegerProperty m_minTRTonly
void Analyze(TrackCollection *) const
Do some statistics analysis at the end of each event.
ToolHandle< IRegSelTool > m_regionSelector
MsgStream & dumpevent(MsgStream &out, const InDet::TRT_SeededTrackFinder::Stat_t &stat) const
unsigned int numberOfMeasurementBases() const
Return the number of contained Trk::MeasurementBase (s)
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
Global Counters for final algorithm statistics.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonReentrantAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

virtual bool AthCommonReentrantAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ finalize()

StatusCode InDet::TRT_SeededTrackFinder::finalize ( )
override

Definition at line 415 of file TRT_SeededTrackFinder.cxx.

416{
417 if(msgLvl(MSG::INFO)){
418 msg(MSG::INFO) << "\n";
419 dumpevent(msg(MSG::INFO), m_totalStat);
420 msg(MSG::INFO) << endmsg;
421 }
422 return StatusCode::SUCCESS;
423}
#define endmsg

◆ initialize()

StatusCode InDet::TRT_SeededTrackFinder::initialize ( )
override

TRT segments to use

Definition at line 47 of file TRT_SeededTrackFinder.cxx.

48{
49
50 //Get the TRT seeded track maker tool
51 //
52 ATH_CHECK(m_trackmaker.retrieve());
53
54 //Get the refitting tool
55 //
56 ATH_CHECK( m_fitterTool.retrieve( DisableTool{ !m_doRefit } ));
57 ATH_CHECK( m_extrapolator.retrieve( DisableTool{ !m_SiExtensionCuts } ));
59
60 // optional PRD to track association map
61 ATH_CHECK( m_prdToTrackMap.initialize( !m_prdToTrackMap.key().empty() ) );
62
63 ATH_CHECK( m_trackSummaryTool.retrieve( DisableTool{ m_trackSummaryTool.name().empty() } ) );
64
65 // Get tool for track extension to TRT
66 //
67 ATH_CHECK( m_trtExtension.retrieve( DisableTool{ !m_doExtension} ));
68
69
70 ATH_CHECK( m_SegmentsKey.initialize()) ;
71 ATH_CHECK( m_outTracksKey.initialize());
72
74
76 ATH_CHECK( m_regionSelector.retrieve());
77 } else {
78 m_regionSelector.disable();
79 }
80
81 // Get output print level
82 //
83 if(msgLvl(MSG::DEBUG)) {
84 dumptools(msg(MSG::DEBUG));
85 }
86 //Global counters. See the include file for definitions
87 m_totalStat = Stat_t();
88 return StatusCode::SUCCESS;
89}
#define ATH_CHECK
Evaluate an expression and check for errors.
MsgStream & dumptools(MsgStream &out) const

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

◆ mergeExtension()

Trk::Track * InDet::TRT_SeededTrackFinder::mergeExtension ( const Trk::Track & tT,
std::vector< const Trk::MeasurementBase * > & tS ) const
protected

Merge a TRT track extension and a Si track component into one global ID track.

Construct the new track

Definition at line 619 of file TRT_SeededTrackFinder.cxx.

620 {
621 // TSOS from the track
622 const Trk::TrackStates* stsos = tT.trackStateOnSurfaces();
623 // fitQuality from track
624 auto fq = tT.fitQuality()->uniqueClone();
625 // output datavector of TSOS
626 auto ntsos = std::make_unique<Trk::TrackStates>();
627 // copy track Si states into track
629 for (p_stsos = stsos->begin(); p_stsos != stsos->end(); ++p_stsos) {
630 ntsos->push_back((*p_stsos)->clone());
631 }
632 // loop over TRT track extension
633 for (auto & it : tS) {
634 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
636 const Trk::TrackStateOnSurface* seg_tsos = new Trk::TrackStateOnSurface(it->uniqueClone(), nullptr, nullptr, typePattern);
637 ntsos->push_back(seg_tsos);
638 }
640 Trk::TrackInfo info;
641 info.setPatternRecognitionInfo(Trk::TrackInfo::TRTSeededTrackFinder);
642 std::unique_ptr<Trk::Track> newTrack( std::make_unique<Trk::Track>(info, std::move(ntsos), std::move(fq)) );
643 //Careful refitting at the end
644 if (m_doRefit) {
645 newTrack = (m_fitterTool->fit(Gaudi::Hive::currentContext(),*newTrack, false, Trk::pion) ) ;
646 if (!newTrack) {
647 ATH_MSG_DEBUG ("Refit of TRT+Si track segment failed!");
648 return nullptr;
649 }
650 //Protect for tracks that have no really defined locz and theta parameters
651 const Trk::Perigee* perTrack=newTrack->perigeeParameters();
652 if (perTrack) {
653 const AmgSymMatrix(5)* CM = perTrack->covariance();
654 if (!CM || std::sqrt((*CM)(1,1)) == 0. || std::sqrt((*CM)(3,3)) == 0.) {
655 return nullptr;
656 }
657 }
658 }
659
660 return newTrack.release();
661}
#define AmgSymMatrix(dim)
std::unique_ptr< FitQuality > uniqueClone() const
NVI uniqueClone.
@ TRTSeededTrackFinder
Tracks from TRT Seeded Track finder.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload

◆ mergeSegments()

Trk::Track * InDet::TRT_SeededTrackFinder::mergeSegments ( const Trk::Track & tT,
const Trk::TrackSegment & tS ) const
protected

Protected methods.

Merge a TRT track segment and a Si track component into one global ID track

Construct the new track

Definition at line 503 of file TRT_SeededTrackFinder.cxx.

503 {
504 // TSOS from the track
505 const Trk::TrackStates* stsos = tT.trackStateOnSurfaces();
506 // fitQuality from track
507 auto fq = tT.fitQuality()->uniqueClone();
508 // output datavector of TSOS
509 auto ntsos = std::make_unique<Trk::TrackStates>();
510 int siHits = 0;
511 // copy track Si states into track
513 for (p_stsos=stsos->begin(); p_stsos != stsos->end(); ++p_stsos) {
514 ntsos->push_back( (*p_stsos)->clone() );
515 if ((*p_stsos)->type(Trk::TrackStateOnSurface::Measurement)) siHits++;
516 }
517 // loop over segment
518 for (int it = 0; it < int(tS.numberOfMeasurementBases()); it++) {
519 //test if it is a pseudo measurement
520 if ( dynamic_cast<const Trk::PseudoMeasurementOnTrack*>(tS.measurement(it)) ) {
521 if (siHits < 4) {
522 ATH_MSG_DEBUG ("Too few Si hits.Will keep pseudomeasurement...");
523 const Trk::TrackStateOnSurface* seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), nullptr);
524 ntsos->push_back(seg_tsos);
525 }
526 } else {
527 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
529 const Trk::TrackStateOnSurface* seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), nullptr, nullptr, typePattern);
530 ntsos->push_back(seg_tsos);
531 }
532 }
533
535 Trk::TrackInfo info;
536 info.setPatternRecognitionInfo(Trk::TrackInfo::TRTSeededTrackFinder);
537 std::unique_ptr<Trk::Track> newTrack(std::make_unique<Trk::Track>(info, std::move(ntsos), std::move(fq)));
538
539 //Careful refitting at the end
540 if (m_doRefit) {
541 newTrack=m_fitterTool->fit(Gaudi::Hive::currentContext(),*newTrack, false, Trk::pion);
542 if (!newTrack) {
543 ATH_MSG_DEBUG ("Refit of TRT+Si track segment failed!");
544 return nullptr;
545 }
546 const Trk::Perigee* perTrack=newTrack->perigeeParameters();
547 if (perTrack) {
548 const AmgSymMatrix(5)* CM = perTrack->covariance();
549 if (!CM || std::sqrt((*CM)(1,1)) == 0. || std::sqrt((*CM)(3,3)) == 0.) {
550 return nullptr;
551 }
552 }
553 }
554 return newTrack.release();
555}
std::unique_ptr< MeasurementBase > uniqueClone() const
NVI Clone giving up unique pointer.
const MeasurementBase * measurement(unsigned int) const
returns the Trk::MeasurementBase objects depending on the integer

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ segToTrack()

Trk::Track * InDet::TRT_SeededTrackFinder::segToTrack ( const EventContext & ctx,
const Trk::TrackSegment & tS ) const
protected

Transform a TRT track segment into a track.

Definition at line 561 of file TRT_SeededTrackFinder.cxx.

561 {
562 ATH_MSG_DEBUG ("Transforming the TRT segment into a track...");
563
564 //Get the track segment information and build the initial track parameters
565 const Trk::StraightLineSurface* surf = dynamic_cast<const Trk::StraightLineSurface*>(&(tS.associatedSurface()));
566 if (!surf) {
567 throw std::logic_error("Unhandled surface.");
568 }
569 const AmgVector(5)& p = tS.localParameters();
570 AmgSymMatrix(5) ep = AmgSymMatrix(5)(tS.localCovariance());
571 auto ntsos = std::make_unique<Trk::TrackStates>();
572 std::unique_ptr<Trk::TrackParameters> segPar =
573 surf->createUniqueParameters<5, Trk::Charged>(
574 p(0), p(1), p(2), p(3), p(4), std::move(ep));
575 if (segPar) {
576 ATH_MSG_DEBUG( "Initial TRT Segment Parameters for refitting " << (*segPar) );
577 } else {
578 ATH_MSG_DEBUG( "Could not get initial TRT segment parameters! " );
579 return nullptr;
580 }
581 for (int it = 0; it < int(tS.numberOfMeasurementBases()); it++) {
582 // on first measurement add parameters
583 const Trk::TrackStateOnSurface* seg_tsos = nullptr;
584 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
586 if (it == 0){
587 seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), std::move(segPar), nullptr, typePattern);
588 } else {
589 seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), nullptr, nullptr, typePattern);
590 }
591 ntsos->push_back(seg_tsos);
592 }
593 Trk::TrackInfo info;
594 info.setPatternRecognitionInfo(Trk::TrackInfo::TRTSeededTrackFinder);
595 std::unique_ptr<Trk::Track> newTrack = std::make_unique<Trk::Track>(info, std::move(ntsos), nullptr);
596 // Careful refitting of the TRT stand alone track
597 if (m_doRefit) {
598 newTrack = m_fitterTool->fit(ctx,*newTrack, false, Trk::pion);
599 if (!newTrack) {
600 ATH_MSG_DEBUG ("Refit of TRT track segment failed!");
601 return nullptr;
602 }
603 //Protect for tracks that have no really defined locz and theta parameters
604 const Trk::Perigee* perTrack=newTrack->perigeeParameters();
605 if (perTrack) {
606 const AmgSymMatrix(5)* CM = perTrack->covariance();
607 if (!CM || std::sqrt((*CM)(1,1)) == 0. || std::sqrt((*CM)(3,3)) == 0.) {
608 return nullptr;
609 }
610 }
611 }
612 return newTrack.release();
613}
#define AmgVector(rows)
if(febId1==febId2)
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
const Surface & associatedSurface() const override final
returns the surface for the local to global transformation

◆ setFilterPassed()

virtual void AthCommonReentrantAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/2]

std::mutex m_statMutex InDet::TRT_SeededTrackFinder::ATLAS_THREAD_SAFE
mutableprotected

Definition at line 186 of file TRT_SeededTrackFinder.h.

◆ ATLAS_THREAD_SAFE [2/2]

Stat_t m_totalStat InDet::TRT_SeededTrackFinder::ATLAS_THREAD_SAFE
mutableprotected

Definition at line 187 of file TRT_SeededTrackFinder.h.

◆ m_beamSpotKey

SG::ReadCondHandleKey<InDet::BeamSpotData> InDet::TRT_SeededTrackFinder::m_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"}
protected

Definition at line 124 of file TRT_SeededTrackFinder.h.

125{this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"};

◆ m_caloClusterROIKey

SG::ReadHandleKey<ROIPhiRZContainer> InDet::TRT_SeededTrackFinder::m_caloClusterROIKey
protected
Initial value:
{this, "EMROIPhiRZContainer", "",
"Name of the calo cluster ROIs in Phi,R,Z parameterization"}

Definition at line 137 of file TRT_SeededTrackFinder.h.

138 {this, "EMROIPhiRZContainer", "",
139 "Name of the calo cluster ROIs in Phi,R,Z parameterization"};

◆ m_caloSeededRoI

BooleanProperty InDet::TRT_SeededTrackFinder::m_caloSeededRoI {this, "CaloSeededRoI", false}
protected

Definition at line 136 of file TRT_SeededTrackFinder.h.

136{this, "CaloSeededRoI", false};

◆ m_deltaEta

FloatProperty InDet::TRT_SeededTrackFinder::m_deltaEta {this, "dEtaCaloRoI", 0.1, "delta Eta used for RoI creation"}
protected

Definition at line 145 of file TRT_SeededTrackFinder.h.

146{this, "dEtaCaloRoI", 0.1, "delta Eta used for RoI creation"};

◆ m_deltaPhi

FloatProperty InDet::TRT_SeededTrackFinder::m_deltaPhi {this, "dPhiCaloRoI", 0.25, "delta Phi used for RoI creation"}
protected

Definition at line 147 of file TRT_SeededTrackFinder.h.

148{this, "dPhiCaloRoI", 0.25, "delta Phi used for RoI creation"};

◆ m_deltaZ

FloatProperty InDet::TRT_SeededTrackFinder::m_deltaZ {this, "dZCaloRoI", 300., "delta Z used for RoI creation"}
protected

Definition at line 149 of file TRT_SeededTrackFinder.h.

150{this, "dZCaloRoI", 300., "delta Z used for RoI creation"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doExtension

BooleanProperty InDet::TRT_SeededTrackFinder::m_doExtension {this, "TrtExtension", false, "Find the TRT extension of the track"}
protected

Definition at line 86 of file TRT_SeededTrackFinder.h.

87{this, "TrtExtension", false, "Find the TRT extension of the track"};

◆ m_doRefit

BooleanProperty InDet::TRT_SeededTrackFinder::m_doRefit {this, "FinalRefit", false, "Do a final careful refit of tracks"}
protected

Definition at line 84 of file TRT_SeededTrackFinder.h.

85{this, "FinalRefit", false, "Do a final careful refit of tracks"};

◆ m_doStat

BooleanProperty InDet::TRT_SeededTrackFinder::m_doStat {this, "FinalStatistics", false, "Statistics of final tracks"}
protected

Definition at line 90 of file TRT_SeededTrackFinder.h.

91{this, "FinalStatistics", false, "Statistics of final tracks"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_extrapolator

ToolHandle<Trk::IExtrapolator> InDet::TRT_SeededTrackFinder::m_extrapolator {this, "Extrapolator", ""}
protected

Definition at line 123 of file TRT_SeededTrackFinder.h.

123{this, "Extrapolator", ""};

◆ m_fitterTool

ToolHandle<Trk::ITrackFitter> InDet::TRT_SeededTrackFinder::m_fitterTool
protected
Initial value:
{this, "RefitterTool", "Trk::GlobalChi2Fitter/InDetTrackFitter",
"Track refit tool"}

Definition at line 105 of file TRT_SeededTrackFinder.h.

106 {this, "RefitterTool", "Trk::GlobalChi2Fitter/InDetTrackFitter",
107 "Track refit tool"};

◆ m_maxEta

DoubleProperty InDet::TRT_SeededTrackFinder::m_maxEta {this, "maxEta", 2.7, "maximal Eta cut"}
protected

Definition at line 130 of file TRT_SeededTrackFinder.h.

130{this, "maxEta", 2.7, "maximal Eta cut"};

◆ m_maxRPhiImp

DoubleProperty InDet::TRT_SeededTrackFinder::m_maxRPhiImp {this, "maxRPhiImp", 10., "maximal RPhi impact parameter cut"}
protected

Definition at line 131 of file TRT_SeededTrackFinder.h.

132{this, "maxRPhiImp", 10., "maximal RPhi impact parameter cut"};

◆ m_MaxSegNum

IntegerProperty InDet::TRT_SeededTrackFinder::m_MaxSegNum
protected
Initial value:
{this, "MaxNumberSegments", 5000,
"Maximum number of segments to be handled"}

Definition at line 94 of file TRT_SeededTrackFinder.h.

95 {this, "MaxNumberSegments", 5000,
96 "Maximum number of segments to be handled"};

◆ m_maxZImp

DoubleProperty InDet::TRT_SeededTrackFinder::m_maxZImp {this, "maxZImp", 250., "maximal z impact parameter cut"}
protected

Definition at line 133 of file TRT_SeededTrackFinder.h.

134{this, "maxZImp", 250., "maximal z impact parameter cut"};

◆ m_minPt

DoubleProperty InDet::TRT_SeededTrackFinder::m_minPt {this, "minPt", 500., "minimal Pt cut"}
protected

Definition at line 129 of file TRT_SeededTrackFinder.h.

129{this, "minPt", 500., "minimal Pt cut"};

◆ m_minTRTonly

UnsignedIntegerProperty InDet::TRT_SeededTrackFinder::m_minTRTonly {this, "MinTRTonly", 15, "Minimum number of TRT hits on TRT only"}
protected

Definition at line 99 of file TRT_SeededTrackFinder.h.

100{this, "MinTRTonly", 15, "Minimum number of TRT hits on TRT only"};

◆ m_minTRTonSegment

UnsignedIntegerProperty InDet::TRT_SeededTrackFinder::m_minTRTonSegment {this, "MinTRTonSegment", 10, "Minimum Number of TRT Hits on segment"}
protected

Definition at line 97 of file TRT_SeededTrackFinder.h.

98{this, "MinTRTonSegment", 10, "Minimum Number of TRT Hits on segment"};

◆ m_outTracksKey

SG::WriteHandleKey<TrackCollection> InDet::TRT_SeededTrackFinder::m_outTracksKey
protected
Initial value:
{this, "OutputTracksLocation", "TRTSeededTracks",
"Output track collection"}

Definition at line 114 of file TRT_SeededTrackFinder.h.

115 {this, "OutputTracksLocation", "TRTSeededTracks",
116 "Output track collection"};

◆ m_prdToTrackMap

SG::ReadHandleKey<Trk::PRDtoTrackMap> InDet::TRT_SeededTrackFinder::m_prdToTrackMap {this, "PRDtoTrackMap", "" }
protected

Definition at line 118 of file TRT_SeededTrackFinder.h.

119{this, "PRDtoTrackMap", "" };

◆ m_regionSelector

ToolHandle<IRegSelTool> InDet::TRT_SeededTrackFinder::m_regionSelector
protected
Initial value:
{this, "RegSelTool", "RegSelTool/RegSel_SCT",
"Region selector service instance"}

Definition at line 141 of file TRT_SeededTrackFinder.h.

142 {this, "RegSelTool", "RegSelTool/RegSel_SCT",
143 "Region selector service instance"};

◆ m_rejectShortExten

BooleanProperty InDet::TRT_SeededTrackFinder::m_rejectShortExten {this, "RejectShortExtension", false, "Reject short extensions"}
protected

Definition at line 88 of file TRT_SeededTrackFinder.h.

89{this, "RejectShortExtension", false, "Reject short extensions"};

◆ m_saveTRT

BooleanProperty InDet::TRT_SeededTrackFinder::m_saveTRT {this, "OutputSegments", true, "Save stand-alone TRT segments"}
protected

Definition at line 92 of file TRT_SeededTrackFinder.h.

93{this, "OutputSegments", true, "Save stand-alone TRT segments"};

◆ m_SegmentsKey

SG::ReadHandleKey<Trk::SegmentCollection> InDet::TRT_SeededTrackFinder::m_SegmentsKey {this, "InputSegmentsLocation", "TRTSegments", "TRT segments to use"}
protected

Definition at line 112 of file TRT_SeededTrackFinder.h.

113{this, "InputSegmentsLocation", "TRTSegments", "TRT segments to use"};

◆ m_SiExtensionCuts

BooleanProperty InDet::TRT_SeededTrackFinder::m_SiExtensionCuts {this, "SiExtensionCuts", false, "enable cuts after Si segment finding"}
protected

Definition at line 127 of file TRT_SeededTrackFinder.h.

128{this, "SiExtensionCuts", false, "enable cuts after Si segment finding"};

◆ m_trackmaker

ToolHandle<ITRT_SeededTrackFinder> InDet::TRT_SeededTrackFinder::m_trackmaker
protected
Initial value:
{this, "TrackTool", "InDet::TRT_SeededTrackFinderTool",
"Back tracking tool"}

Definition at line 102 of file TRT_SeededTrackFinder.h.

103 {this, "TrackTool", "InDet::TRT_SeededTrackFinderTool",
104 "Back tracking tool"};

◆ m_trackSummaryTool

ToolHandle<Trk::IExtendedTrackSummaryTool> InDet::TRT_SeededTrackFinder::m_trackSummaryTool {this, "TrackSummaryTool", "InDetTrackSummaryToolNoHoleSearch"}
protected

Definition at line 120 of file TRT_SeededTrackFinder.h.

121{this, "TrackSummaryTool", "InDetTrackSummaryToolNoHoleSearch"};

◆ m_trtExtension

ToolHandle<ITRT_TrackExtensionTool> InDet::TRT_SeededTrackFinder::m_trtExtension
protected
Initial value:
{this, "TrackExtensionTool", "InDet::TRT_TrackExtensionTool_xk",
"TRT track extension tool "}

Definition at line 108 of file TRT_SeededTrackFinder.h.

109 {this, "TrackExtensionTool", "InDet::TRT_TrackExtensionTool_xk",
110 "TRT track extension tool "};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: