ATLAS Offline Software
Loading...
Searching...
No Matches
TRT_SeededTrackFinder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6// Implementation file for class InDet::TRT_SeededTrackFinder
8// (c) ATLAS Detector software
11// Version 1.0 02/20/2006 Thomas Koffas
12// modified by Markus ELsing
14
15#include "GaudiKernel/MsgStream.h"
17#include "TrkTrack/TrackInfo.h"
19
22
24
27
29
30#include <memory>
31#include <cmath>
32using namespace std;
33
35// Constructor
37
39(const std::string& name, ISvcLocator* pSvcLocator)
40 : AthReentrantAlgorithm(name, pSvcLocator)
41{ }
42
44// Initialisation
46
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}
90
91namespace InDet {
93 public:
94 unsigned int size() const {
95 return m_prepRawDataTrackMap.size();
96 }
97 };
98
112}
113
115// Execute
117StatusCode
118InDet::TRT_SeededTrackFinder::execute(const EventContext& ctx) const{
119 //Counters. See the include file for definitions
120 Stat_t ev_stat;
121 // counter
122 int nTrtSegCur = 0;
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]);
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 //Total stack use for this function is 828640 bytes.
138 //coverity[STACK_USE]
140 std::unique_ptr<InDet::ITRT_SeededTrackFinder::IEventData> event_data_p;
141 if(m_caloSeededRoI ) {
143 std::unique_ptr<RoiDescriptor> roiComp = std::make_unique<RoiDescriptor>(true);
144 if (calo_rois.isValid()) {
145 RoiDescriptor * roi =nullptr;
147 double beamZ = beamSpotHandle->beamVtx().position().z();
148 roiComp->clear();
149 roiComp->setComposite();
150 for (const ROIPhiRZ &the_roi : *calo_rois) {
151 double eta = the_roi.eta();
152 double phi = the_roi.phi();
153 double roiPhiMin = phi -m_deltaPhi;
154 double roiPhiMax = phi +m_deltaPhi;
155 double roiEtaMin = eta -m_deltaEta;
156 double roiEtaMax = eta +m_deltaEta;
157 double roiZMin = beamZ -m_deltaZ;
158 double roiZMax = beamZ +m_deltaZ;
159 roi = new RoiDescriptor( eta, roiEtaMin, roiEtaMax,phi, roiPhiMin ,roiPhiMax, beamZ, roiZMin,roiZMax);
160 roiComp->push_back(roi);
161 }
162
163 }
164 std::vector<IdentifierHash> listOfSCTIds;
165 std::vector<IdentifierHash> listOfPixIds;
166
167 m_regionSelector->lookup(ctx)->HashIDList( *roiComp, listOfSCTIds );
168
169 event_data_p = m_trackmaker->newRegion(ctx, combinatorialData, listOfPixIds, listOfSCTIds);
170 } else {
171 event_data_p = m_trackmaker->newEvent(ctx, combinatorialData);
172 }
173
174 std::unique_ptr<InDet::ITRT_TrackExtensionTool::IEventData> ext_event_data_p( m_trtExtension->newEvent(ctx) );
175 std::unique_ptr<TrackCollection> outTracks = std::make_unique<TrackCollection>();
176 std::vector<Trk::Track*> tempTracks; //Temporary track collection
177 tempTracks.reserve(128);
178 // loop over event
179 ATH_MSG_DEBUG ("Begin looping over all TRT segments in the event");
180 Trk::SegmentCollection::const_iterator iseg = segments->begin();
181 Trk::SegmentCollection::const_iterator isegEnd = segments->end();
183 for(; iseg != isegEnd; ++ iseg) {
184 // Get the track segment
185 const Trk::TrackSegment *trackTRT = dynamic_cast<const Trk::TrackSegment*>(*iseg);
186 if(!trackTRT){
187 ATH_MSG_ERROR ("No pointer to segment !");
188 continue;
189 } else {
190 // the segment finder is applying a TRT(eta) cut and a pt preselection, so we don't do that here
191 //Ask for at least 10 TRT hits in order to process
193 ATH_MSG_DEBUG ("TRT segment fails nTRT hit cut, reject.");
194 // statistics
196 } else {
197 // do we continue to process ?
198 nTrtSegCur++;
199 if(nTrtSegCur>=m_MaxSegNum) {
200 ATH_MSG_DEBUG ("====> Reached maximal number of segments in event, stop !!!");
201 // statistics
202 ev_stat.m_counter[Stat_t::kNTrtLimit]++;
203 break;
204 }
205 // Get the number of the TRT track segment ROTs
206 ATH_MSG_DEBUG ("=> New segment to process, number Of TRT ROTs : " << (trackTRT->numberOfMeasurementBases()));
207 // statistics
208 ev_stat.m_counter[Stat_t::Stat_t::kNTrtSegGood]++;
209 // ok, call track maker and get list of possible track candidates
210 std::list<Trk::Track*> trackSi = m_trackmaker->getTrack(ctx, *event_data_p, *trackTRT); //Get the possible Si extensions
211 if (trackSi.empty()) {
212 ATH_MSG_DEBUG ("No Si track candidates associated to the TRT track ");
213 // statistics
215 // obsolete backup of TRT only
218 Trk::Track* trtSeg = nullptr;trtSeg = segToTrack(ctx, *trackTRT);
219 if(!trtSeg) {
220 ATH_MSG_DEBUG ("Failed to make a track out of the TRT segment!");
221 continue;
222 }
223 // statistics
224 ev_stat.m_counter[Stat_t::kNBckTrk]++; ev_stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt]++;
225 // add track to output list
226 outTracks->push_back(trtSeg);
227 }
228 continue;
229 } else {
230 // Found useful extensions
231 ATH_MSG_DEBUG ("Found " << (trackSi.size()) << " Si tracks associated to the TRT track ");
232 // Merge the resolved Si extensions with the original TRT track segment
233 std::list<Trk::Track*>::const_iterator itt = trackSi.begin();
234 std::list<Trk::Track*>::const_iterator ittEnd = trackSi.end();
235 for (; itt != ittEnd ; ++itt){
236 tempTracks.push_back(*itt);
237 // get list of TSOS
238 const Trk::TrackStates* temptsos = (*itt)->trackStateOnSurfaces();
239 if (!temptsos) {
240 ATH_MSG_DEBUG ("Silicon extension empty ???");
241 continue;
242 }
243 // Add the track to the list of tracks in the event
244 ATH_MSG_DEBUG ("Silicon extension found has length of : " << temptsos->size());
245 // do we do a preselection ?
246 if (m_SiExtensionCuts) {
247 // get parameters without errors
248 auto input = (*itt)->trackParameters()->front()->uniqueClone();
249 // cuts on parameters
250 if (std::abs(input->pT()) < m_minPt) {
251 ATH_MSG_DEBUG ("Track pt < "<<m_minPt<<", reject it");
252 // statistics
253 ev_stat.m_counter[Stat_t::kNExtCut]++;
254 continue;
255 }
256 if (std::abs(input->eta()) > m_maxEta) {
257 ATH_MSG_DEBUG ("Track eta > "<<m_maxEta<<", reject it");
258 // statistics
259 ev_stat.m_counter[Stat_t::kNExtCut]++;
260 continue;
261 }
262 // --- beam spot position
263 Amg::Vector3D beamSpotPosition(0,0,0);
266 beamSpotPosition = beamSpotHandle->beamVtx().position();
267 }
268 // --- create surface
269 Trk::PerigeeSurface perigeeSurface(beamSpotPosition);
270
271 // uses perigee on track or extrapolates, no material in any case, we cut on impacts
272 std::unique_ptr<const Trk::TrackParameters> parm =
273 m_extrapolator->extrapolateDirectly(
274 ctx, *input, perigeeSurface);
275 std::unique_ptr<const Trk::Perigee> extrapolatedPerigee = nullptr;
276 if (parm && parm->associatedSurface().type() == Trk::SurfaceType::Perigee) {
277 extrapolatedPerigee.reset(static_cast<const Trk::Perigee*>(parm.release()));
278 }
279 if (!extrapolatedPerigee) {
280 ATH_MSG_WARNING("Extrapolation of perigee failed, this should never happen" );
281 // statistics
282 ev_stat.m_counter[Stat_t::kNExtCut]++;
283 continue;
284 }
285
286 ATH_MSG_VERBOSE ("extrapolated perigee: "<<*extrapolatedPerigee);
287 if (std::abs(extrapolatedPerigee->parameters()[Trk::d0]) > m_maxRPhiImp) {
288 ATH_MSG_DEBUG ("Track Rphi impact > "<<m_maxRPhiImp<<", reject it");
289 // statistics
290 ev_stat.m_counter[Stat_t::kNExtCut]++;
291 continue;
292 }
293 if (std::abs(extrapolatedPerigee->parameters()[Trk::z0]) > m_maxZImp) {
294 ATH_MSG_DEBUG ("Track Z impact > "<<m_maxZImp<<", reject it");
295 // statistics
296 ev_stat.m_counter[Stat_t::kNExtCut]++;
297 continue;
298 }
299 }
300
301 // do re run a Track extension into TRT ?
302 Trk::Track* globalTrackNew = nullptr;
303 // do we have 4 and extension is enabled ?
304 if(int(temptsos->size())>=4 && m_doExtension){
305 // Add the track to the list of tracks in the event
306 ATH_MSG_DEBUG ("Try to improve TRT calling extension tool.");
307 // statistics
308 ev_stat.m_counter[Stat_t::Stat_t::kNTrtExtCalls]++;
309 // call extension tool
310 std::vector<const Trk::MeasurementBase*>& tn =
311 m_trtExtension->extendTrack(ctx, *(*itt), *ext_event_data_p, map);
312 if (tn.empty()) {
313 // Fallback if extension failed
314 ATH_MSG_DEBUG ("No new segment found, use input segment as fallback.");
315 // statistics
316 ev_stat.m_counter[Stat_t::Stat_t::kNTrtExtFail]++;
317 // merge Si with input track segments
318 globalTrackNew = mergeSegments(**itt,*trackTRT);
319 } else if (!m_rejectShortExten ||
320 tn.size() >= trackTRT->numberOfMeasurementBases()) {
321 // Use the extension to instead of the segment
322 ATH_MSG_DEBUG ("Successful extension, number of TRT hits : " << tn.size() << " was : " << (trackTRT->numberOfMeasurementBases()));
323 // merge the extension with the Si track
324 globalTrackNew = mergeExtension(**itt,tn);
325 // Add the track to the list of tracks in the event
326 ATH_MSG_DEBUG ("Merged extension with Si segment");
327 // statistics
328 ev_stat.m_counter[Stat_t::kNTrtExt]++;
329 // clean up
330 std::vector<const Trk::MeasurementBase*>::const_iterator iv, ive=tn.end();
331 for(iv=tn.begin(); iv!=ive; ++iv) delete (*iv);
332 } else {
333 // Extension is shorter, let's fall back onto the original
334 ATH_MSG_DEBUG ("Extension too short, number of TRT hits : " << tn.size() << " was : " << (trackTRT->numberOfMeasurementBases()) << ". Use Segement !");
335 // merge segments
336 globalTrackNew = mergeSegments(**itt,*trackTRT);
337 // Add the track to the list of tracks in the event
338 ATH_MSG_DEBUG ("Merged TRT segment with Si segment");
339 // statistics
340 ev_stat.m_counter[Stat_t::Stat_t::kNTrtExtBad]++;
341 // clean up
342 std::vector<const Trk::MeasurementBase*>::const_iterator iv, ive=tn.end();
343 for(iv=tn.begin(); iv!=ive; ++iv) delete (*iv);
344 }
345 } else {
346 // no extension tool, jsut add the two
347 ATH_MSG_DEBUG ("Do not try to extend Si track, merging it with input TRT.");
348 // merge segments
349 globalTrackNew = mergeSegments(**itt,*trackTRT);
350 }
351 // do we have an track candidate ?
352 if(!globalTrackNew){
353 ATH_MSG_DEBUG ("Failed to merge TRT+Si track segment !");
354 if(m_saveTRT && trackTRT->numberOfMeasurementBases() > m_minTRTonly) {
355 Trk::Track* trtSeg = nullptr;trtSeg = segToTrack(ctx, *trackTRT);
356 if(!trtSeg){
357 ATH_MSG_DEBUG ("Failed to make a track out of the TRT segment!");
358 continue;
359 }
360 ATH_MSG_DEBUG ("Add TRT only to output list");
361 // statistis
362 ev_stat.m_counter[Stat_t::kNBckTrk]++; ev_stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt]++;
363 // add it to output list
364 if (m_trackSummaryTool.isEnabled()) {
365 m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *trtSeg,
366 false /* DO NOT suppress hole search*/);
367 }
368 outTracks->push_back(trtSeg);
369 }
370 } else {
371 ATH_MSG_DEBUG ("Save merged TRT+Si track segment!");
372 // statistics
373 ev_stat.m_counter[Stat_t::kNBckTrk]++; ev_stat.m_counter[Stat_t::Stat_t::kNBckTrkSi]++;
374 // add it to output list
375 if (m_trackSummaryTool.isEnabled()) {
376 m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *globalTrackNew,
377 false /* DO NOT suppress hole search*/);
378 }
379 outTracks->push_back(globalTrackNew);
380 }
381 }
382 }
383 }
384 }
385 }
386 // further debugging of results
387 if(m_doStat){
388 Analyze(outTracks.get());
389 }
390 if (SG::WriteHandle<TrackCollection>(m_outTracksKey,ctx).record(std::move(outTracks)).isFailure()){
391 ATH_MSG_ERROR("Failed to record " << m_outTracksKey.key());
392 return StatusCode::FAILURE;
393 }
394 // Update the total counters
395 {
396 std::lock_guard<std::mutex> lock(m_statMutex);
397 m_totalStat += ev_stat;
398 }
399
400 for (auto *p : tempTracks){
401 delete p;
402 }
403 m_trackmaker->endEvent(*event_data_p);
404
405 //Print common event information
406 if(msgLvl(MSG::DEBUG)){
407 dumpevent(msg(MSG::DEBUG), ev_stat);
408 }
409
410 return StatusCode::SUCCESS;
411}
412
414// Finalize
416
418{
419 if(msgLvl(MSG::INFO)){
420 msg(MSG::INFO) << "\n";
421 dumpevent(msg(MSG::INFO), m_totalStat);
422 msg(MSG::INFO) << endmsg;
423 }
424 return StatusCode::SUCCESS;
425}
426
427
429// Dumps conditions information into the MsgStream
431
432MsgStream& InDet::TRT_SeededTrackFinder::dumptools( MsgStream& out ) const
433{
434 int n = 65-m_trackmaker.type().size();
435 std::string s1; for(int i=0; i<n; ++i) s1.append(" "); s1.append("|");
436 n = 65-m_fitterTool.type().size();
437 std::string s2; for(int i=0; i<n; ++i) s2.append(" "); s2.append("|");
438 n = 65-m_trtExtension.type().size();
439 std::string s3; for(int i=0; i<n; ++i) s3.append(" "); s3.append("|");
440 n = 65-m_SegmentsKey.key().size();
441 std::string s4; for(int i=0; i<n; ++i) s4.append(" "); s4.append("|");
442 n = 65-m_outTracksKey.key().size();
443 std::string s5; for(int i=0; i<n; ++i) s5.append(" "); s5.append("|");
444
445 out<<"|----------------------------------------------------------------------"
446 <<"-------------------|"
447 <<std::endl;
448 out<<"| Tool for TRT seeded track finding | "<<m_trackmaker.type() <<s1<<std::endl;
449 out<<"| Tool for final track refitting | "<<m_fitterTool.type() <<s2<<std::endl;
450 out<<"| Tool for TRT trac extension | "<<m_trtExtension.type() <<s3<<std::endl;
451 out<<"| Location of input tracks | "<<m_SegmentsKey.key() <<s4<<std::endl;
452 out<<"| Location of output tracks | "<<m_outTracksKey.key() <<s5<<std::endl;
453 out<<"|----------------------------------------------------------------------"
454 <<"-------------------|"
455 <<std::endl;
456 return out;
457}
458
460// Dumps event information into the MsgStream
462
464{
465 out<<"|-------------------------------------------------------------------"<<std::endl;
466 out<<"| Investigated :"<<std::endl
467 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtSeg] <<" TRT Segments on input"<<std::endl
468 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtFailSel] <<" TRT Segments fail selection on input"<<std::endl
469 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtSegGood] <<" TRT Segments after selection"<<std::endl;
470 if (stat.m_counter[Stat_t::kNTrtLimit]>0) {
471 out<<"|-------------------------------------------------------------------"<<std::endl;
472 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtLimit] <<" TRT segments lost because of processing limit"<<std::endl;
473 }
474 out<<"|-------------------------------------------------------------------"<<std::endl;
475 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtNoSiExt] <<" TRT segments without Si extension"<<std::endl;
476 if (m_SiExtensionCuts) {
477 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNExtCut] <<" number of Si extension failing cuts"<<std::endl;
478 }
479 if (stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt]>0) {
480 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNBckTrkTrt] <<" number ot TRT only tracks created"<<std::endl;
481 }
482 if (m_doExtension) {
483 out<<"|-------------------------------------------------------------------"<<std::endl;
484 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtExtCalls]<<" number of times TRT extension is called"<<std::endl
485 <<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNTrtExt] <<" number of good TRT extension"<<std::endl;
486 if (m_rejectShortExten) {
487 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtExtBad]<<" number of bad TRT extension"<<std::endl;
488 }
489 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNTrtExtFail]<<" number of failed TRT extension and fallback"<<std::endl;
490 }
491 out<<"|-------------------------------------------------------------------"<<std::endl;
492 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::Stat_t::kNBckTrkSi] <<" TRT+Si tracks created of output"<<std::endl;
493 if (stat.m_counter[Stat_t::kNBckTrkSi] != stat.m_counter[Stat_t::kNBckTrk]) {
494 out<<"| "<<std::setw(7)<<stat.m_counter[Stat_t::kNBckTrk] <<" total number of tracks on output"<<std::endl;
495 }
496 out<<"|-------------------------------------------------------------------";
497 return out;
498}
499
500
502// Merge a Si extension and a TRT segment.Refit at the end
504
506 // TSOS from the track
507 const Trk::TrackStates* stsos = tT.trackStateOnSurfaces();
508 // fitQuality from track
509 auto fq = tT.fitQuality()->uniqueClone();
510 // output datavector of TSOS
511 auto ntsos = std::make_unique<Trk::TrackStates>();
512 int siHits = 0;
513 // copy track Si states into track
515 for (p_stsos=stsos->begin(); p_stsos != stsos->end(); ++p_stsos) {
516 ntsos->push_back( (*p_stsos)->clone() );
517 if ((*p_stsos)->type(Trk::TrackStateOnSurface::Measurement)) siHits++;
518 }
519 // loop over segment
520 for (int it = 0; it < int(tS.numberOfMeasurementBases()); it++) {
521 //test if it is a pseudo measurement
522 if ( dynamic_cast<const Trk::PseudoMeasurementOnTrack*>(tS.measurement(it)) ) {
523 if (siHits < 4) {
524 ATH_MSG_DEBUG ("Too few Si hits.Will keep pseudomeasurement...");
525 const Trk::TrackStateOnSurface* seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), nullptr);
526 ntsos->push_back(seg_tsos);
527 }
528 } else {
529 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
531 const Trk::TrackStateOnSurface* seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), nullptr, nullptr, typePattern);
532 ntsos->push_back(seg_tsos);
533 }
534 }
535
537 Trk::TrackInfo info;
538 info.setPatternRecognitionInfo(Trk::TrackInfo::TRTSeededTrackFinder);
539 std::unique_ptr<Trk::Track> newTrack(std::make_unique<Trk::Track>(info, std::move(ntsos), std::move(fq)));
540
541 //Careful refitting at the end
542 if (m_doRefit) {
543 newTrack=m_fitterTool->fit(Gaudi::Hive::currentContext(),*newTrack, false, Trk::pion);
544 //coverity[REVERSE_INULL:FALSE]
545 if (!newTrack) {
546 ATH_MSG_DEBUG ("Refit of TRT+Si track segment failed!");
547 return nullptr;
548 }
549 const Trk::Perigee* perTrack=newTrack->perigeeParameters();
550 if (perTrack) {
551 const AmgSymMatrix(5)* CM = perTrack->covariance();
552 if (!CM || std::sqrt((*CM)(1,1)) == 0. || std::sqrt((*CM)(3,3)) == 0.) {
553 return nullptr;
554 }
555 }
556 }
557 return newTrack.release();
558}
559
561// Transform a TRT segment to track
563
565 ATH_MSG_DEBUG ("Transforming the TRT segment into a track...");
566
567 //Get the track segment information and build the initial track parameters
568 const Trk::StraightLineSurface* surf = dynamic_cast<const Trk::StraightLineSurface*>(&(tS.associatedSurface()));
569 if (!surf) {
570 throw std::logic_error("Unhandled surface.");
571 }
572 const AmgVector(5)& p = tS.localParameters();
574 auto ntsos = std::make_unique<Trk::TrackStates>();
575 std::unique_ptr<Trk::TrackParameters> segPar =
577 p(0), p(1), p(2), p(3), p(4), std::move(ep));
578 if (segPar) {
579 ATH_MSG_DEBUG( "Initial TRT Segment Parameters for refitting " << (*segPar) );
580 } else {
581 ATH_MSG_DEBUG( "Could not get initial TRT segment parameters! " );
582 return nullptr;
583 }
584 for (int it = 0; it < int(tS.numberOfMeasurementBases()); it++) {
585 // on first measurement add parameters
586 const Trk::TrackStateOnSurface* seg_tsos = nullptr;
587 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
589 if (it == 0){
590 seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), std::move(segPar), nullptr, typePattern);
591 } else {
592 seg_tsos = new Trk::TrackStateOnSurface(tS.measurement(it)->uniqueClone(), nullptr, nullptr, typePattern);
593 }
594 ntsos->push_back(seg_tsos);
595 }
596 Trk::TrackInfo info;
597 info.setPatternRecognitionInfo(Trk::TrackInfo::TRTSeededTrackFinder);
598 std::unique_ptr<Trk::Track> newTrack = std::make_unique<Trk::Track>(info, std::move(ntsos), nullptr);
599 // Careful refitting of the TRT stand alone track
600 if (m_doRefit) {
601 newTrack = m_fitterTool->fit(ctx,*newTrack, false, Trk::pion);
602 //coverity[REVERSE_INULL:FALSE]
603 if (!newTrack) {
604 ATH_MSG_DEBUG ("Refit of TRT track segment failed!");
605 return nullptr;
606 }
607 //Protect for tracks that have no really defined locz and theta parameters
608 const Trk::Perigee* perTrack=newTrack->perigeeParameters();
609 if (perTrack) {
610 const AmgSymMatrix(5)* CM = perTrack->covariance();
611 if (!CM || std::sqrt((*CM)(1,1)) == 0. || std::sqrt((*CM)(3,3)) == 0.) {
612 return nullptr;
613 }
614 }
615 }
616 return newTrack.release();
617}
618
620// Merge a Si extension and a TRT track extension.Refit at the end
622
624mergeExtension(const Trk::Track& tT, std::vector<const Trk::MeasurementBase*>& tS) const {
625 // TSOS from the track
626 const Trk::TrackStates* stsos = tT.trackStateOnSurfaces();
627 // fitQuality from track
628 auto fq = tT.fitQuality()->uniqueClone();
629 // output datavector of TSOS
630 auto ntsos = std::make_unique<Trk::TrackStates>();
631 // copy track Si states into track
633 for (p_stsos = stsos->begin(); p_stsos != stsos->end(); ++p_stsos) {
634 ntsos->push_back((*p_stsos)->clone());
635 }
636 // loop over TRT track extension
637 for (auto & it : tS) {
638 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
640 const Trk::TrackStateOnSurface* seg_tsos = new Trk::TrackStateOnSurface(it->uniqueClone(), nullptr, nullptr, typePattern);
641 ntsos->push_back(seg_tsos);
642 }
644 Trk::TrackInfo info;
645 info.setPatternRecognitionInfo(Trk::TrackInfo::TRTSeededTrackFinder);
646 std::unique_ptr<Trk::Track> newTrack( std::make_unique<Trk::Track>(info, std::move(ntsos), std::move(fq)) );
647 //Careful refitting at the end
648 if (m_doRefit) {
649 newTrack = (m_fitterTool->fit(Gaudi::Hive::currentContext(),*newTrack, false, Trk::pion) ) ;
650 //coverity[REVERSE_INULL:FALSE]
651 if (!newTrack) {
652 ATH_MSG_DEBUG ("Refit of TRT+Si track segment failed!");
653 return nullptr;
654 }
655 //Protect for tracks that have no really defined locz and theta parameters
656 const Trk::Perigee* perTrack=newTrack->perigeeParameters();
657 if (perTrack) {
658 const AmgSymMatrix(5)* CM = perTrack->covariance();
659 if (!CM || std::sqrt((*CM)(1,1)) == 0. || std::sqrt((*CM)(3,3)) == 0.) {
660 return nullptr;
661 }
662 }
663 }
664
665 return newTrack.release();
666}
667
669// Analysis of tracks
671
672void
674 if(msgLvl(MSG::DEBUG)) {
675 ATH_MSG_DEBUG( "Analyzing tracks..." );
676 ATH_MSG_DEBUG( "Number of back tracks " << (tC->size()) );
677 int nsct1{}, nsct2{}, nsct3{}, nsct4{}; //SCT layer counters
678 int nsctTot1{}, nsctTot2{}, nsctTot3{}, nsctTot4{}; //SCT layer counters
679 int npix1{}, npix2{}, npix3{}; //Pixel layer counters
680 int npixTot1{}, npixTot2{}, npixTot3{}; //Pixel layer counters
684 for (; r != re ; ++r){
685 nsct1=nsct2=nsct3=nsct4=0; npix1=npix2=npix3=0;
686 const Trk::TrackStates* newtsos = (*r)->trackStateOnSurfaces();
687 if(!newtsos) continue;
688 Trk::TrackStates::const_iterator itp, itpe=newtsos->end();
689 for(itp=newtsos->begin(); itp!=itpe; ++itp){
691 const InDet::SiClusterOnTrack* clus = dynamic_cast<const InDet::SiClusterOnTrack*>((*itp)->measurementOnTrack());
692 if(clus && ((*itp)->type(Trk::TrackStateOnSurface::Measurement))){ //Count the number of hits used in the track
693 double rc = clus->globalPosition().perp();
694 if((40.<=rc)&&(rc<80.)){npix1++;} //1st pixel layer
695 if((80.<=rc)&&(rc<100.)){npix2++;} //2nd pixel layer
696 if((100.<=rc)&&(rc<150.)){npix3++;} //3rd pixel layer
697 if((280.<=rc)&&(rc<340.)){nsct1++;} //1st SCT layer
698 if((340.<=rc)&&(rc<390.)){nsct2++;} //2nd SCT layer
699 if((390.<=rc)&&(rc<460.)){nsct3++;} //3rd SCT layer
700 if((460.<=rc)&&(rc<550.)){nsct4++;} //4th SCT layer
701 }
702 }
703 nsctTot1+=nsct1; nsctTot2+=nsct2; nsctTot3+=nsct3; nsctTot4+=nsct4;
704 npixTot1+=npix1; npixTot2+=npix2; npixTot3+=npix3;
705 }
706 ATH_MSG_DEBUG("Total hits on 1st SCT: "<<nsctTot1<<" 2nd SCT: "<<nsctTot2<<" 3rd SCT: "<<nsctTot3<<" 4th SCT: "<<nsctTot4);
707 ATH_MSG_DEBUG("Total hits on 1st Pixel: "<<npixTot1<<" 2nd Pixel: "<<npixTot2<<" 3rd Pixel: "<<npixTot3);
708 }
709}
710
const std::regex re(r_e)
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
#define AmgSymMatrix(dim)
#define AmgVector(rows)
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
static Double_t rc
DataVector< Trk::Track > TrackCollection
This typedef represents a collection of Trk::Track objects.
bool msgLvl(const MSG::Level lvl) const
An algorithm that can be simultaneously executed in multiple threads.
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.
SG::ReadHandle< Trk::PRDtoTrackMap > m_prdToTrackMap
ExtendedSiCombinatorialTrackFinderData_xk(const SG::ReadHandleKey< Trk::PRDtoTrackMap > &key)
RIO_OnTrack base class for Silicon detector in the InnerDetector.
virtual const Amg::Vector3D & globalPosition() const override
returns global position (gathered through Surface constraint)
InDet::SiCombinatorialTrackFinderData_xk holds event dependent data used by SiCombinatorialTrackFinde...
void setPRDtoTrackMap(const Trk::PRDtoTrackMap *prd_to_track_map)
Set PRD to track map.
Trk::Track * segToTrack(const EventContext &, const Trk::TrackSegment &) const
Transform a TRT track segment into a track.
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
MsgStream & dumptools(MsgStream &out) const
StatusCode execute(const EventContext &ctx) const override
TRT_SeededTrackFinder(const std::string &name, ISvcLocator *pSvcLocator)
Standard Algorithm methods.
Trk::Track * mergeSegments(const Trk::Track &, const Trk::TrackSegment &) const
Protected methods.
ToolHandle< ITRT_SeededTrackFinder > m_trackmaker
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
ToolHandle< ITRT_TrackExtensionTool > m_trtExtension
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< Trk::ITrackFitter > m_fitterTool
SG::WriteHandleKey< TrackCollection > m_outTracksKey
SG::ReadHandleKey< Trk::SegmentCollection > m_SegmentsKey
ToolHandle< IRegSelTool > m_regionSelector
MsgStream & dumpevent(MsgStream &out, const InDet::TRT_SeededTrackFinder::Stat_t &stat) const
Describes the Region of Ineterest geometry It has basically 9 parameters.
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const std::string & name() const
Return the StoreGate ID for the referenced object.
Simple helper class for defining track parameters for charged particles.
Definition Charged.h:27
std::unique_ptr< FitQuality > uniqueClone() const
NVI uniqueClone.
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
const Amg::MatrixX & localCovariance() const
Interface method to get the localError.
std::unique_ptr< MeasurementBase > uniqueClone() const
NVI Clone giving up unique pointer.
PrepRawDataTrackMap m_prepRawDataTrackMap
holds the tracks associated with each PRD (i.e.
Class describing the Line to which the Perigee refers to.
Class to handle pseudo-measurements in fitters and on track objects.
const MeasurementBase * measurement(unsigned int) const
returns the Trk::MeasurementBase objects depending on the integer
unsigned int numberOfMeasurementBases() const
Return the number of contained Trk::MeasurementBase (s).
Class for a StraightLineSurface in the ATLAS detector to describe dirft tube and straw like detectors...
std::unique_ptr< ParametersT< DIM, T, StraightLineSurface > > createUniqueParameters(double l1, double l2, double phi, double theta, double qop, std::optional< AmgSymMatrix(DIM)> cov=std::nullopt) const
Use the Surface as a ParametersBase constructor, from local parameters.
Contains information about the 'fitter' of this track.
@ TRTSeededTrackFinder
Tracks from TRT Seeded Track finder.
Class for a generic track segment that holdes polymorphic Trk::MeasurementBase objects,...
const Surface & associatedSurface() const override final
returns the surface for the local to global transformation
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ 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.
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
int r
Definition globals.cxx:22
Eigen::Matrix< double, 3, 1 > Vector3D
Primary Vertex Finder.
DataVector< const Trk::TrackStateOnSurface > TrackStates
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
STL namespace.
Global Counters for final algorithm statistics.
@ 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.