ATLAS Offline Software
Loading...
Searching...
No Matches
TRT_SeededTrackFinder.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_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
138 std::unique_ptr<InDet::ITRT_SeededTrackFinder::IEventData> event_data_p;
139 if(m_caloSeededRoI ) {
141 std::unique_ptr<RoiDescriptor> roiComp = std::make_unique<RoiDescriptor>(true);
142 if (calo_rois.isValid()) {
143 RoiDescriptor * roi =nullptr;
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
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
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);
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}
410
412// Finalize
414
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}
424
425
427// Dumps conditions information into the MsgStream
429
430MsgStream& InDet::TRT_SeededTrackFinder::dumptools( MsgStream& out ) const
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}
456
458// Dumps event information into the MsgStream
460
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}
497
498
500// Merge a Si extension and a TRT segment.Refit at the end
502
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}
556
558// Transform a TRT segment to track
560
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();
571 auto ntsos = std::make_unique<Trk::TrackStates>();
572 std::unique_ptr<Trk::TrackParameters> segPar =
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}
614
616// Merge a Si extension and a TRT track extension.Refit at the end
618
620mergeExtension(const Trk::Track& tT, std::vector<const Trk::MeasurementBase*>& tS) const {
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}
662
664// Analysis of tracks
666
667void
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;
683 Trk::TrackStates::const_iterator itp, itpe=newtsos->end();
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}
705
const boost::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)
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.