ATLAS Offline Software
Loading...
Searching...
No Matches
SiTrackMaker_xk.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6// Implementation file for class InDet::SiTrackMaker_xk
8// (c) ATLAS Detector software
11// Version 1.0 21/04/2004 I.Gavrilenko
13
15
19
20#include <iomanip>
21#include <ostream>
22
24// Constructor
26
28(const std::string& t,const std::string& n,const IInterface* p)
29 : base_class(t, n, p)
30{
31
32}
33
35// Initialisation
37
39{
42 if (not m_beamSpotKey.empty()) {
43 ATH_CHECK( m_beamSpotKey.initialize() );
44 }
45
47 if (m_fieldmode == "NoField") m_fieldModeEnum = Trk::NoField;
48 else if (m_fieldmode == "MapSolenoid") m_fieldModeEnum = Trk::FastField;
50
53 if ( m_roadmaker.retrieve().isFailure() ) {
54 ATH_MSG_FATAL( "Failed to retrieve tool " << m_roadmaker );
55 return StatusCode::FAILURE;
56 }
57 ATH_MSG_DEBUG( "Retrieved tool " << m_roadmaker );
58
61 if ( m_tracksfinder.retrieve().isFailure() ) {
62 ATH_MSG_FATAL( "Failed to retrieve tool " << m_tracksfinder );
63 return StatusCode::FAILURE;
64 }
65 ATH_MSG_DEBUG( "Retrieved tool " << m_tracksfinder );
66
70 if ( m_trigInDetTrackFollowingTool.retrieve().isFailure() ) {
71 ATH_MSG_FATAL( "Failed to retrieve tool " << m_trigInDetTrackFollowingTool );
72 return StatusCode::FAILURE;
73 }
74 ATH_MSG_DEBUG( "Retrieved tool " << m_trigInDetTrackFollowingTool );
75 } else {
77 }
78
82 if ( m_trigInDetRoadPredictorTool.retrieve().isFailure() ) {
83 ATH_MSG_FATAL( "Failed to retrieve tool " << m_trigInDetRoadPredictorTool );
84 return StatusCode::FAILURE;
85 }
86 ATH_MSG_DEBUG( "Retrieved tool " << m_trigInDetRoadPredictorTool );
87 } else {
89 }
90
95 if (m_seedtrack.retrieve().isFailure()) {
96 ATH_MSG_FATAL( "Failed to retrieve tool " << m_seedtrack );
97 return StatusCode::FAILURE;
98 }
99 ATH_MSG_DEBUG( "Retrieved tool " << m_seedtrack );
100 } else {
101 m_seedtrack.disable();
102 }
103
105 m_heavyion = false;
106
107
108 // TrackpatternRecoInfo preparation
109 //
110 if (m_patternName == "SiSpacePointsSeedMaker_Cosmic" ) {
112 } else if (m_patternName == "SiSpacePointsSeedMaker_HeavyIon" ) {
114 m_heavyion = true;
115 } else if (m_patternName == "SiSpacePointsSeedMaker_LowMomentum") {
117 } else if (m_patternName == "SiSpacePointsSeedMaker_BeamGas" ) {
119 } else if (m_patternName == "SiSpacePointsSeedMaker_ForwardTracks" ) {
121 } else if (m_patternName == "SiSpacePointsSeedMaker_LargeD0" ) {
123 } else if (m_patternName == "SiSpacePointsSeedMaker_ITkConversionTracks") {
125 } else {
126 m_trackinfo.setPatternRecognitionInfo(Trk::TrackInfo::SiSPSeededFinder );
127 }
128
133
135 if (m_pTmin < 20.) m_pTmin = 20.;
136
137 if (m_etabins.size()>0) {
138 if (m_ptbins.size() > (m_etabins.size()-1)) {
139 ATH_MSG_ERROR( "No. of cut values bigger than eta bins");
140 return StatusCode::FAILURE;
141 }
142
143 if (m_ptbins.size() < (m_etabins.size()-1)) {
144 ATH_MSG_DEBUG( "No. of cut values smaller than eta bins. Extending size..." );
145 m_ptbins.value().resize(m_etabins.size()-1, m_ptbins.value().back());
146 }
147
148 for (auto& pt : m_ptbins) {
149 if (pt < 20.) pt = 20.;
150 }
151 }
152
153
155 resetCounter(m_totalInputSeeds);
156 resetCounter(m_totalNoTrackPar);
157 resetCounter(m_totalUsedSeeds);
158 resetCounter(m_outputTracks);
159 resetCounter(m_totalBremSeeds);
160 resetCounter(m_bremTracks);
161 resetCounter(m_twoClusters);
162 resetCounter(m_wrongRoad);
163 resetCounter(m_wrongInit);
164 resetCounter(m_noTrack);
165 resetCounter(m_notNewTrack);
166 resetCounter(m_bremAttempt);
167 resetCounter(m_seedsWithTrack);
168 resetCounter(m_deSize);
170 m_seedsWithTracksEta.resize(SiCombinatorialTrackFinderData_xk::kNSeedTypes);
171 std::fill(m_usedSeedsEta.begin(), m_usedSeedsEta.end(),
173 std::fill(m_seedsWithTracksEta.begin(), m_seedsWithTracksEta.end(),
175
177 ATH_CHECK( m_fieldCondObjInputKey.initialize());
179 return StatusCode::SUCCESS;
180}
181
183// Finalize
185
187{
188 MsgStream &out = msg(MSG::INFO);
189 out << "::finalize() -- statistics:" <<std::endl;
190 dumpStatistics(out);
191 out<<endmsg;
192 return AlgTool::finalize();
193}
194
196// Dumps relevant information into the MsgStream
198
199MsgStream& InDet::SiTrackMaker_xk::dumpStatistics(MsgStream &out) const
200{
201
202 out<<"|----------------------|--------------|--------------|--------------|--------------|--------------|"
203 <<std::endl;
204 out<<"| Kind of seed | PPP | PPS | PSS | SSS | ALL |"
205 <<std::endl;
206 out<<"|----------------------|--------------|--------------|--------------|--------------|--------------|"
207 <<std::endl;
208 out<<"| Input seeds | "
209 <<std::setw(12)<<m_totalInputSeeds[0]<<" | "
210 <<std::setw(12)<<m_totalInputSeeds[1]<<" | "
211 <<std::setw(12)<<m_totalInputSeeds[2]<<" | "
212 <<std::setw(12)<<m_totalInputSeeds[3]<<" | "
213 <<std::setw(12)<<(m_totalInputSeeds[0]+m_totalInputSeeds[1]+m_totalInputSeeds[2]+m_totalInputSeeds[3])
214 <<" |"<<std::endl;
215
216 out<<"| No track parameters | "
217 <<std::setw(12)<<m_totalNoTrackPar[0]<<" | "
218 <<std::setw(12)<<m_totalNoTrackPar[1]<<" | "
219 <<std::setw(12)<<m_totalNoTrackPar[2]<<" | "
220 <<std::setw(12)<<m_totalNoTrackPar[3]<<" | "
221 <<std::setw(12)<<(m_totalNoTrackPar[0]+m_totalNoTrackPar[1]+ m_totalNoTrackPar[2]+m_totalNoTrackPar[3])
222 <<" |"<<std::endl;
223
224 out<<"| Used seeds | "
225 <<std::setw(12)<<m_totalUsedSeeds[0]<<" | "
226 <<std::setw(12)<<m_totalUsedSeeds[1]<<" | "
227 <<std::setw(12)<<m_totalUsedSeeds[2]<<" | "
228 <<std::setw(12)<<m_totalUsedSeeds[3]<<" | "
229 <<std::setw(12)<<(m_totalUsedSeeds[0]+m_totalUsedSeeds[1]+ m_totalUsedSeeds[2]+m_totalUsedSeeds[3])
230 <<" |"<<std::endl;
231
232 out<<"| Used seeds brem | "
233 <<std::setw(12)<<m_totalBremSeeds[0]<<" | "
234 <<std::setw(12)<<m_totalBremSeeds[1]<<" | "
235 <<std::setw(12)<<m_totalBremSeeds[2]<<" | "
236 <<std::setw(12)<<m_totalBremSeeds[3]<<" | "
237 <<std::setw(12)<<(m_totalBremSeeds[0]+m_totalBremSeeds[1]+m_totalBremSeeds[2]+m_totalBremSeeds[3])
238 <<" |"<<std::endl;
239
240 double tdetsize = 0.;
241 int goodseed = 0;
243 tdetsize+= m_deSize[i];
244 goodseed+= m_totalUsedSeeds[i];
245 if(m_totalUsedSeeds[i] > 0.) m_deSize[i]= m_deSize[i]/m_totalUsedSeeds[i];
246 }
247 if(goodseed > 0) tdetsize/=double(goodseed);
248
249 out<<"| Det elements in road | "
250 <<std::setw(12)<<std::setprecision(4)<<m_deSize[0]<<" | "
251 <<std::setw(12)<<std::setprecision(5)<<m_deSize[1]<<" | "
252 <<std::setw(12)<<std::setprecision(5)<<m_deSize[2]<<" | "
253 <<std::setw(12)<<std::setprecision(5)<<m_deSize[3]<<" | "
254 <<std::setw(12)<<std::setprecision(5)<<tdetsize
255 <<" |"<<std::endl;
256
257
258 out<<"| Two clusters on DE | "
259 <<std::setw(12)<<m_twoClusters[0]<<" | "
260 <<std::setw(12)<<m_twoClusters[1]<<" | "
261 <<std::setw(12)<<m_twoClusters[2]<<" | "
262 <<std::setw(12)<<m_twoClusters[3]<<" | "
263 <<std::setw(12)<<(m_twoClusters[0]+m_twoClusters[1]+m_twoClusters[2]+m_twoClusters[3])
264 <<" |"<<std::endl;
265
266 out<<"| Wrong DE road | "
267 <<std::setw(12)<<m_wrongRoad[0]<<" | "
268 <<std::setw(12)<<m_wrongRoad[1]<<" | "
269 <<std::setw(12)<<m_wrongRoad[2]<<" | "
270 <<std::setw(12)<<m_wrongRoad[3]<<" | "
271 <<std::setw(12)<<(m_wrongRoad[0]+m_wrongRoad[1]+m_wrongRoad[2]+m_wrongRoad[3])
272 <<" |"<<std::endl;
273
274 out<<"| Wrong initialization | "
275 <<std::setw(12)<<m_wrongInit[0]<<" | "
276 <<std::setw(12)<<m_wrongInit[1]<<" | "
277 <<std::setw(12)<<m_wrongInit[2]<<" | "
278 <<std::setw(12)<<m_wrongInit[3]<<" | "
279 <<std::setw(12)<<(m_wrongInit[0]+m_wrongInit[1]+m_wrongInit[2]+m_wrongInit[3])
280 <<" |"<<std::endl;
281
282 out<<"| Can not find track | "
283 <<std::setw(12)<<m_noTrack[0]<<" | "
284 <<std::setw(12)<<m_noTrack[1]<<" | "
285 <<std::setw(12)<<m_noTrack[2]<<" | "
286 <<std::setw(12)<<m_noTrack[3]<<" | "
287 <<std::setw(12)<<(m_noTrack[0]+m_noTrack[1]+m_noTrack[2]+m_noTrack[3])
288 <<" |"<<std::endl;
289
290 out<<"| It is not new track | "
291 <<std::setw(12)<<m_notNewTrack[0]<<" | "
292 <<std::setw(12)<<m_notNewTrack[1]<<" | "
293 <<std::setw(12)<<m_notNewTrack[2]<<" | "
294 <<std::setw(12)<<m_notNewTrack[3]<<" | "
295 <<std::setw(12)<<(m_notNewTrack[0]+m_notNewTrack[1]+m_notNewTrack[2]+m_notNewTrack[3])
296 <<" |"<<std::endl;
297
298 out<<"| Attempts brem model | "
299 <<std::setw(12)<<m_bremAttempt[0]<<" | "
300 <<std::setw(12)<<m_bremAttempt[1]<<" | "
301 <<std::setw(12)<<m_bremAttempt[2]<<" | "
302 <<std::setw(12)<<m_bremAttempt[3]<<" | "
303 <<std::setw(12)<<(m_bremAttempt[0]+m_bremAttempt[1]+m_bremAttempt[2]+m_bremAttempt[3])
304 <<" |"<<std::endl;
305
306 out<<"| Output tracks | "
307 <<std::setw(12)<<m_outputTracks[0]<<" | "
308 <<std::setw(12)<<m_outputTracks[1]<<" | "
309 <<std::setw(12)<<m_outputTracks[2]<<" | "
310 <<std::setw(12)<<m_outputTracks[3]<<" | "
311 <<std::setw(12)<<(m_outputTracks[0]+m_outputTracks[1]+m_outputTracks[2]+m_outputTracks[3])
312 <<" |"<<std::endl;
313
314 out<<"| Output extra tracks | "
315 <<std::setw(12)<<m_extraTracks[0]<<" | "
316 <<std::setw(12)<<m_extraTracks[1]<<" | "
317 <<std::setw(12)<<m_extraTracks[2]<<" | "
318 <<std::setw(12)<<m_extraTracks[3]<<" | "
319 <<std::setw(12)<<(m_extraTracks[0]+m_extraTracks[1]+m_extraTracks[2]+m_extraTracks[3])
320 <<" |"<<std::endl;
321
322 out<<"| Output tracks brem | "
323 <<std::setw(12)<<m_bremTracks[0]<<" | "
324 <<std::setw(12)<<m_bremTracks[1]<<" | "
325 <<std::setw(12)<<m_bremTracks[2]<<" | "
326 <<std::setw(12)<<m_bremTracks[3]<<" | "
327 <<std::setw(12)<<(m_bremTracks[0]+m_bremTracks[1]+m_bremTracks[2]+m_bremTracks[3])
328 <<" |"<<std::endl;
329
330 out<<"|----------------------|--------------|--------------|--------------|--------------|--------------|--------------|"
331 <<std::endl;
332 out<<"| Seeds with track | "
333 <<std::setw(12)<<m_seedsWithTrack[0]<<" | "
334 <<std::setw(12)<<m_seedsWithTrack[1]<<" | "
335 <<std::setw(12)<<m_seedsWithTrack[2]<<" | "
336 <<std::setw(12)<<m_seedsWithTrack[3]<<" | "
337 <<std::setw(12)<<(m_seedsWithTrack[0]+m_seedsWithTrack[1]+m_seedsWithTrack[2]+m_seedsWithTrack[3])
338 <<" | Number seeds |"<<std::endl;
339 out<<"|----------------------|--------------|--------------|--------------|--------------|--------------|--------------|"
340 <<std::endl;
341
342 std::vector<std::pair<int,std::string>> rapidityTablePrint;
343 //Defining the range values to be printed
344 rapidityTablePrint.emplace_back(0,std::string("| Track/Used 0.0-0.5 | "));
345 rapidityTablePrint.emplace_back(1,std::string("| 0.5-1.0 | "));
346 rapidityTablePrint.emplace_back(2,std::string("| 1.0-1.5 | "));
347 rapidityTablePrint.emplace_back(3,std::string("| 1.5-2.0 | "));
348 rapidityTablePrint.emplace_back(4,std::string("| 2.0-2.5 | "));
349 rapidityTablePrint.emplace_back(5,std::string("| 2.5-3.0 | "));
350 rapidityTablePrint.emplace_back(6,std::string("| 3.0-3.5 | "));
351 rapidityTablePrint.emplace_back(7,std::string("| 3.5-4.0 | "));
352
353
355
356 std::array<double,SiCombinatorialTrackFinderData_xk::kNSeedTypes+1> pu{};
357 pu.fill(0);
358
359 double totalUsedSeedsEta = 0.;
360
361 for(int j = 0; j != SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++j){
362
363 if(m_usedSeedsEta[j][i]!=0.) pu[j]=m_seedsWithTracksEta[j][i]/m_usedSeedsEta[j][i];
364 totalUsedSeedsEta += m_usedSeedsEta[j][i];
365
366 }
367
368 if(totalUsedSeedsEta!=0.) {
369
370 for(int j = 0; j != SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++j){
371
372 pu[SiCombinatorialTrackFinderData_xk::kNSeedTypes] += m_seedsWithTracksEta[j][i];
373
374 }
375 pu[SiCombinatorialTrackFinderData_xk::kNSeedTypes] /= totalUsedSeedsEta;
376 }
377
378 out<<rapidityTablePrint.at(i).second;
379 out << std::setw(12) << std::setprecision(4) << pu[0] << " | "
380 << std::setw(12) << std::setprecision(4) << pu[1] << " | "
381 << std::setw(12) << std::setprecision(4) << pu[2] << " | "
382 << std::setw(12) << std::setprecision(4) << pu[3] << " | "
383 << std::setw(12) << std::setprecision(4) << pu[4] << " | "
384 << std::setw(12)
385 << static_cast<int>(m_seedsWithTracksEta[0][i]) +
386 static_cast<int>(m_seedsWithTracksEta[1][i]) +
387 static_cast<int>(m_seedsWithTracksEta[2][i]) +
388 static_cast<int>(m_seedsWithTracksEta[3][i])
389 << " |" << std::endl;
390 }
391
392 out<<"|----------------------|--------------|--------------|--------------|--------------|--------------|--------------|"
393 <<std::endl;
394
395 return out;
396
397}
398
400{
401 out<<std::endl;
402 if (data.nprint()) return dumpevent(data, out);
403 return dumpconditions(out);
404}
405
407// Dumps conditions information into the MsgStream
409
410MsgStream& InDet::SiTrackMaker_xk::dumpconditions(MsgStream& out) const
411{
412
413 int n = 62-m_tracksfinder.type().size();
414 std::string s4; for (int i=0; i<n; ++i) s4.append(" "); s4.append("|");
415
416 std::string fieldmode[9] ={"NoField" ,"ConstantField","SolenoidalField",
417 "ToroidalField" ,"Grid3DField" ,"RealisticField" ,
418 "UndefinedField","AthenaField" , "?????" };
419
421
422 // Get AtlasFieldCache
424 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
425 if (fieldCondObj) {
426 MagField::AtlasFieldCache fieldCache;
427 fieldCondObj->getInitializedCache(fieldCache);
428 if (!fieldCache.solenoidOn()) fieldModeEnum = Trk::NoField;
429 }
430
431 Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
432 int mode = fieldprop.magneticFieldMode();
433 if (mode<0 || mode>8 ) mode = 8;
434
435 n = 62-fieldmode[mode].size();
436 std::string s3; for (int i=0; i<n; ++i) s3.append(" "); s3.append("|");
437
438 n = 62-m_roadmaker.type().size();
439 std::string s6; for (int i=0; i<n; ++i) s6.append(" "); s6.append("|");
440
441 out<<"|----------------------------------------------------------------------"
442 <<"-------------------|"
443 <<std::endl;
444 out<<"| Tool for road builder | "<<m_roadmaker .type() <<s6<<std::endl;
445 out<<"} Tool for track finding | "<<m_tracksfinder.type()<<s4<<std::endl;
446 out<<"| Use association tool ? | "
447 <<std::setw(12)<<m_useassoTool
448 << std::endl;
449 out<<"| Magnetic field mode | "<<fieldmode[mode] <<s3<<std::endl;
450 out<<"| Use seeds filter ? | "<<std::setw(12)<<m_seedsfilter
451 <<" |"<<std::endl;
452 out<<"| Min pT of track (MeV) | "<<std::setw(12)<<std::setprecision(5)<<m_pTmin
453 <<" |"<<std::endl;
454 out<<"| Max Xi2 for cluster | "<<std::setw(12)<<std::setprecision(5)<<m_xi2max
455 <<" |"<<std::endl;
456 out<<"| Max Xi2 for outlayer | "<<std::setw(12)<<std::setprecision(5)<<m_xi2maxNoAdd
457 <<" |"<<std::endl;
458 out<<"| Max Xi2 for link | "<<std::setw(12)<<std::setprecision(5)<<m_xi2maxlink
459 <<" |"<<std::endl;
460 out<<"| Min number of clusters | "<<std::setw(12)<<m_nclusmin
461 <<" |"<<std::endl;
462 out<<"| Min number of wclusters | "<<std::setw(12)<<m_nwclusmin
463 <<" |"<<std::endl;
464 out<<"| Max number holes | "<<std::setw(12)<<m_nholesmax
465 <<" |"<<std::endl;
466 out<<"| Max holes gap | "<<std::setw(12)<<m_dholesmax
467 <<" |"<<std::endl;
468 out<<"|----------------------------------------------------------------------"
469 <<"-------------------|"
470 <<std::endl;
471 return out;
472}
473
474
476// Dumps event information into the MsgStream
478
480{
481 out<<"|---------------------------------------------------------------------|"
482 <<std::endl;
483 out<<"| Number input seeds | "<<std::setw(12)<<data.inputseeds()
484 <<" |"<<std::endl;
485 out<<"| Number good seeds | "<<std::setw(12)<<data.goodseeds()
486 <<" |"<<std::endl;
487 out<<"| Number output tracks | "<<std::setw(12)<<data.findtracks()
488 <<" |"<<std::endl;
489 out<<"|---------------------------------------------------------------------|"
490 <<std::endl;
491 return out;
492}
493
495// Initiate track finding tool for new event
497
498void InDet::SiTrackMaker_xk::newEvent(const EventContext& ctx, SiTrackMakerEventData_xk& data, bool PIX, bool SCT) const
499{
500
502 data.xybeam()[0] = 0.;
503 data.xybeam()[1] = 0.;
504 if (not m_beamSpotKey.empty()) {
506 if (beamSpotHandle.isValid()) {
507 data.xybeam()[0] = beamSpotHandle->beamPos()[0];
508 data.xybeam()[1] = beamSpotHandle->beamPos()[1];
509 }
510 }
512 data.pix() = PIX and m_usePix;
513 data.sct() = SCT and m_useSct;
514
516 InDet::TrackQualityCuts trackquality = setTrackQualityCuts(false);
517
519 m_tracksfinder->newEvent(ctx, data.combinatorialData(), m_trackinfo, trackquality);
520
524 if (m_seedsfilter) data.clusterTrack().clear();
525
528 data.inputseeds() = 0;
529 data.goodseeds() = 0;
530 data.findtracks() = 0;
531 resetCounter(data.summaryStatAll());
532 resetCounter(data.summaryStatUsedInTrack());
533
537 if (!calo_rois.isValid()) {
538 ATH_MSG_FATAL("Failed to get EM Calo cluster collection " << m_caloCluster );
539 }
540 data.setCaloClusterROIEM(*calo_rois);
541 }
542
546 if (!calo_rois.isValid()) {
547 ATH_MSG_FATAL("Failed to get Had Calo cluster collection " << m_caloHad );
548 }
549 data.setCaloClusterROIHad(*calo_rois);
550 }
552 if (m_seedsegmentsWrite) m_seedtrack->newEvent(data.conversionData(), m_trackinfo, m_patternName);
553}
554
556// Initiate track finding tool for new event
558
559void InDet::SiTrackMaker_xk::newTrigEvent(const EventContext& ctx, SiTrackMakerEventData_xk& data, bool PIX, bool SCT) const
560{
561 data.pix() = PIX && m_usePix;
562 data.sct() = SCT && m_useSct;
563 bool simpleTrack = true;
564
565 InDet::TrackQualityCuts trackquality = setTrackQualityCuts(simpleTrack);
566
567 // New event for track finder tool
568 //
569 m_tracksfinder->newEvent(ctx, data.combinatorialData(), m_trackinfo, trackquality);
570
571 // Erase cluster to track association
572 //
573 if (m_seedsfilter) data.clusterTrack().clear();
574
575 // Erase statistic information
576 //
577 data.inputseeds() = 0;
578 data.goodseeds() = 0;
579 data.findtracks() = 0;
580 for (int i = 0; i != SiCombinatorialTrackFinderData_xk::kNStatAllTypes; ++i) {
581 for (int k = 0; k != SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++k){
582 data.summaryStatAll()[i][k] = 0.;
583 }
584 }
585 for (int i = 0; i != SiCombinatorialTrackFinderData_xk::kNStatEtaTypes; ++i) {
586 for (int k = 0; k != SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++k) {
588 data.summaryStatUsedInTrack()[i][k][r] = 0.;
589 }
590 }
591 }
592
593 // Add possibility to write seed segment information
594 if (m_seedsegmentsWrite) m_seedtrack->newEvent(data.conversionData(), m_trackinfo, m_patternName);
595
596}
597
599// Finalize track finding tool for given event
601
603{
605 m_tracksfinder->endEvent(data.combinatorialData());
606
608 data.clusterTrack().clear();
609
610 // end event for seed to track tool
611 if (m_seedsegmentsWrite) m_seedtrack->endEvent(data.conversionData());
612
613 // fill statistics
614 {
615 std::lock_guard<std::mutex> lock(m_counterMutex);
616
617 for(int K = 0; K != SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++K) {
618 for(int r = 0; r != 8; ++r) {
619 m_usedSeedsEta[K][r] += data.summaryStatUsedInTrack()[kUsedSeedsEta][K][r];
620 m_seedsWithTracksEta[K][r] += data.summaryStatUsedInTrack()[kSeedsWithTracksEta][K][r];
621 }
622 }
623 }
624 for (int K = 0; K != SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++K) {
625 m_totalInputSeeds[K] += data.summaryStatAll()[kTotalInputSeeds][K];
626 m_totalUsedSeeds[K] = m_totalUsedSeeds[K] + data.summaryStatAll()[kTotalUsedSeeds][K];
627 m_totalNoTrackPar[K] += data.summaryStatAll()[kTotalNoTrackPar][K];
628 m_totalBremSeeds[K] += data.summaryStatAll()[kTotalBremSeeds][K];
629 m_twoClusters[K] += data.summaryStatAll()[kTwoClusters][K];
630 m_wrongRoad[K] += data.summaryStatAll()[kWrongRoad][K];
631 m_wrongInit[K] += data.summaryStatAll()[kWrongInit][K];
632 m_noTrack[K] += data.summaryStatAll()[kNoTrack][K];
633 m_notNewTrack[K] += data.summaryStatAll()[kNotNewTrack][K];
634 m_bremAttempt[K] += data.summaryStatAll()[kBremAttempt][K];
635 m_outputTracks[K] += data.summaryStatAll()[kOutputTracks][K];
636 m_extraTracks[K] += data.summaryStatAll()[kExtraTracks][K];
637 m_bremTracks[K] += data.summaryStatAll()[kBremTracks][K];
638 m_seedsWithTrack[K] += data.summaryStatAll()[kSeedsWithTracks][K];
639 m_deSize[K] = m_deSize[K] + data.summaryStatAll()[kDESize][K];
640 }
641 // Print event information
642 //
643 if (msgLevel()<=0) {
644 data.nprint() = 1;
645 dump(data, msg(MSG::DEBUG));
646 }
647}
648
650// Main method for track finding using space points
652
654(const EventContext& ctx, SiTrackMakerEventData_xk& data, const std::vector<const Trk::SpacePoint*>& Sp) const
655{
657 ++data.inputseeds();
658
660 int K = kindSeed(Sp);
662 int r = rapidity(Sp);
663
665 ++data.summaryStatAll()[kTotalInputSeeds][K];
666
668 std::list<Trk::Track*> tracks;
670 if (!data.pix() && !data.sct()) return tracks;
671
673 bool isGoodSeed{true};
676 if (m_seedsfilter) isGoodSeed=newSeed(data, Sp);
677 if (!m_seedsegmentsWrite && !isGoodSeed) {
678 return tracks;
679 }
680
681 // Get AtlasFieldCache
682 MagField::AtlasFieldCache fieldCache;
683
686 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
687 if (fieldCondObj == nullptr) {
688 ATH_MSG_ERROR("InDet::SiTrackMaker_xk::getTracks: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
689 return tracks;
690 }
691 fieldCondObj->getInitializedCache (fieldCache);
692
694 std::unique_ptr<Trk::TrackParameters> Tp = nullptr;
695 Tp = getAtaPlane(fieldCache, data, false, Sp, ctx);
696 if (m_seedsegmentsWrite && Tp) {
697 m_seedtrack->executeSiSPSeedSegments(data.conversionData(), Tp.get(), isGoodSeed, Sp);
698 }
699
700 if (m_seedsegmentsWrite && !isGoodSeed) {
701 return tracks;
702 }
706 if (!Tp) {
707 ++data.summaryStatAll()[kTotalNoTrackPar][K];
708 return tracks;
709 }
710
712 ++data.goodseeds();
713
718
719 std::vector<const InDetDD::SiDetectorElement*> DE;
720
722 if (!m_cosmicTrack){
723 m_roadmaker->detElementsRoad(ctx, fieldCache, *Tp, Trk::alongMomentum, DE, data.roadMakerData());
724 }
725 else{
726 m_roadmaker->detElementsRoad(ctx, fieldCache, *Tp, Trk::oppositeMomentum, DE, data.roadMakerData());
727 }
728 } else {
729 int road_length = m_trigInDetRoadPredictorTool->getRoad(Sp, DE, ctx);
730 if(road_length == 0) {
731 return tracks;
732 }
733 }
734
736 if (!data.pix() || !data.sct()) detectorElementsSelection(data, DE);
737
740 if ( static_cast<int>(DE.size()) < m_nclusmin) {
741 return tracks;
742 }
743
745 data.summaryStatAll()[kDESize][K] += double(DE.size());
746 ++data.summaryStatAll()[kTotalUsedSeeds][K];
747
749 std::vector<Amg::Vector3D> Gp;
750
752 ++data.summaryStatUsedInTrack()[kUsedSeedsEta][K][r];
753
756 if (!m_useBremModel) {
758 Trk::Track* newTrack = m_trigInDetTrackFollowingTool->getTrack(Sp, DE, ctx);
759 if(newTrack != nullptr) tracks.push_back(newTrack);
760 }
761 else {
762 tracks = m_tracksfinder->getTracks(data.combinatorialData(), *Tp, Sp, Gp, DE, data.clusterTrack(),ctx);
763 }
764 } else if (!m_useCaloSeeds) {
765 ++data.summaryStatAll()[kTotalBremSeeds][K];
766 tracks = m_tracksfinder->getTracksWithBrem(data.combinatorialData(), *Tp, Sp, Gp, DE, data.clusterTrack(), false,ctx);
767 }
769 else if (isCaloCompatible(data)) {
770
771 ++data.summaryStatAll()[kTotalBremSeeds][K];
772 tracks = m_tracksfinder->getTracksWithBrem(data.combinatorialData(), *Tp, Sp, Gp, DE, data.clusterTrack(), true,ctx);
773 } else {
774 tracks = m_tracksfinder->getTracks (data.combinatorialData(), *Tp, Sp, Gp, DE, data.clusterTrack(),ctx);
775 }
776
778 std::array<bool,SiCombinatorialTrackFinderData_xk::kNCombStats> inf{0,0,0,0,0,0};
779 m_tracksfinder->fillStatistic(data.combinatorialData(),inf);
780 for (size_t p =0; p<inf.size(); ++p){
781 if(inf[p]) ++data.summaryStatAll()[m_indexToEnum[p]][K];
782 }
783
786 if (m_seedsfilter) {
787 std::list<Trk::Track*>::iterator t = tracks.begin();
788 while (t!=tracks.end()) {
790 if (!isNewTrack(data, *t)) {
791 delete (*t);
792 tracks.erase(t++);
793 } else {
794 if((*t)->info().trackProperties(Trk::TrackInfo::BremFit)) ++data.summaryStatAll()[kBremTracks][K];
795 clusterTrackMap(data, *t++);
796 }
797 }
798 }
799 data.findtracks() += tracks.size();
800
801 if(!tracks.empty()) {
802 ++data.summaryStatAll()[kSeedsWithTracks][K];
803 ++data.summaryStatUsedInTrack()[kSeedsWithTracksEta][K][r];
804 data.summaryStatAll()[kOutputTracks][K] += tracks.size();
805 data.summaryStatAll()[kExtraTracks][K] += (tracks.size()-1);
806 }
807
808 return tracks;
809
810}
811
813// Main method for track finding using space points
815
817(const EventContext& ctx, SiTrackMakerEventData_xk& data, const Trk::TrackParameters& Tp, const std::vector<Amg::Vector3D>& Gp) const
818{
819 ++data.inputseeds();
820 std::list<Trk::Track*> tracks;
821 if (!data.pix() && !data.sct()) return tracks;
822
823 ++data.goodseeds();
824
825 // Get AtlasFieldCache
826 MagField::AtlasFieldCache fieldCache;
827
829 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
830 if (fieldCondObj == nullptr) {
831 ATH_MSG_ERROR("InDet::SiTrackMaker_xk::getTracks: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
832 return tracks;
833 }
834 fieldCondObj->getInitializedCache (fieldCache);
835
836 // Get detector elements road
837 //
838 std::vector<const InDetDD::SiDetectorElement*> DE;
839 if (!m_cosmicTrack) m_roadmaker->detElementsRoad(ctx, fieldCache, Tp,Trk::alongMomentum, DE, data.roadMakerData());
840 else m_roadmaker->detElementsRoad(ctx, fieldCache, Tp,Trk::oppositeMomentum,DE, data.roadMakerData());
841
842 if (!data.pix() || !data.sct()) detectorElementsSelection(data, DE);
843
844 if (static_cast<int>(DE.size()) < m_nclusmin) return tracks;
845
846 // Find possible list of tracks with trigger track parameters or global positions
847 //
848 std::vector<const Trk::SpacePoint*> Sp;
849
850 if (!m_useBremModel) {
851 tracks = m_tracksfinder->getTracks (data.combinatorialData(), Tp, Sp, Gp, DE, data.clusterTrack(),ctx);
852 } else if (!m_useCaloSeeds) {
853 tracks = m_tracksfinder->getTracksWithBrem(data.combinatorialData(), Tp, Sp, Gp, DE, data.clusterTrack(), false,ctx);
854 } else if (isCaloCompatible(data)) {
855 tracks = m_tracksfinder->getTracksWithBrem(data.combinatorialData(), Tp, Sp, Gp, DE, data.clusterTrack(), true,ctx);
856 } else {
857 tracks = m_tracksfinder->getTracks (data.combinatorialData(), Tp, Sp, Gp, DE, data.clusterTrack(),ctx);
858 }
859
860 if (m_seedsfilter) {
861 std::list<Trk::Track*>::iterator t = tracks.begin();
862 while (t!=tracks.end()) {
863 if (!isNewTrack(data, *t)) {
864 delete (*t);
865 tracks.erase(t++);
866 } else {
867 clusterTrackMap(data, *t++);
868 }
869 }
870 }
871 data.findtracks() += tracks.size();
872 return tracks;
873}
874
876// Space point seed parameters extimation
878
879std::unique_ptr<Trk::TrackParameters> InDet::SiTrackMaker_xk::getAtaPlane
880(MagField::AtlasFieldCache& fieldCache,
882 bool sss,
883 const std::vector<const Trk::SpacePoint*>& theSeed,
884 const EventContext& ctx) const
885{
887 if (theSeed.size() < 3) return nullptr;
888
889 std::vector<const Trk::SpacePoint*> SP;
890
892 if (m_trackletPoints == 1) {
893 unsigned int middleIdx = theSeed.size() == 3 ? 1 : theSeed.size()/2;
894 SP = {theSeed[0], theSeed[middleIdx], theSeed.back()};
895 }
896 // for tracklets we select last 3 spacepoints of the seed
897 else if (m_trackletPoints == 2) {
898 SP = {theSeed[theSeed.size() - 3], theSeed[theSeed.size() - 2], theSeed.back()};
899 }
901 else if (m_trackletPoints == 3) {
902 unsigned int middleIdx = theSeed.size() == 3 ? 0 : theSeed.size()/2;
903 unsigned int quarterIdx = theSeed.size() == 3 ? 1 : 3*theSeed.size()/4;
904 SP = {theSeed[middleIdx], theSeed[quarterIdx], theSeed.back()};
905 }
907 else if (m_trackletPoints == 4) {
908 SP = {theSeed[0], theSeed[theSeed.size() - 2], theSeed.back()};
909 }
911 else if (m_trackletPoints == 5) {
912 SP = {theSeed[0], theSeed[1], theSeed[2]};
913 }
914
915
917 const Trk::PrepRawData* cl = SP[0]->clusterList().first;
918 if (!cl) return nullptr;
920 const Trk::PlaneSurface* pla =
921 static_cast<const Trk::PlaneSurface*>(&cl->detectorElement()->surface());
922 if (!pla) return nullptr;
923
926 double p0[3],p1[3],p2[3];
927 if (!globalPositions(*(SP[0]),*(SP[1]),*(SP[2]),p0,p1,p2)) return nullptr;
928
930 double x0 = p0[0] ;
931 double y0 = p0[1] ;
932 double z0 = p0[2] ;
933 double x1 = p1[0]-x0;
934 double y1 = p1[1]-y0;
935 double x2 = p2[0]-x0;
936 double y2 = p2[1]-y0;
937 double z2 = p2[2]-z0;
938
941 double u1 = 1./sqrt(x1*x1+y1*y1) ;
943 double rn = x2*x2+y2*y2 ;
944 double r2 = 1./rn ;
946 double a = x1*u1 ;
947 double b = y1*u1 ;
949 double u2 = (a*x2+b*y2)*r2 ;
951 double v2 = (a*y2-b*x2)*r2 ;
954 double A = v2/(u2-u1) ;
955 double B = 2.*(v2-A*u2) ;
956 double C = B/sqrt(1.+A*A) ;
957 double T = z2*sqrt(r2)/(1.+.04*C*C*rn);
958 if(m_ITKGeometry){
959 T = std::abs(C) > 1.e-6 ? (z2*C)/asin(C*sqrt(rn)) : z2/sqrt(rn);
960 }
961
962 const Amg::Transform3D& Tp = pla->transform();
963
965 double Ax[3] = {Tp(0,0),Tp(1,0),Tp(2,0)};
967 double Ay[3] = {Tp(0,1),Tp(1,1),Tp(2,1)};
969 double D [3] = {Tp(0,3),Tp(1,3),Tp(2,3)};
971 double d[3] = {x0-D[0],y0-D[1],z0-D[2]};
973 data.par()[0] = d[0]*Ax[0]+d[1]*Ax[1]+d[2]*Ax[2];
974 data.par()[1] = d[0]*Ay[0]+d[1]*Ay[1]+d[2]*Ay[2];
975
978 if (!fieldCache.solenoidOn()) fieldModeEnum = Trk::NoField;
979
980 Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
982 if (fieldprop.magneticFieldMode() > 0) {
983
985 double H[3],gP[3] ={x0,y0,z0};
986 fieldCache.getFieldZR(gP, H);
987
990 if (fabs(H[2])>.0001) {
992 data.par()[2] = atan2(b+a*A,a-b*A);
994 data.par()[3] = atan2(1.,T) ;
996 data.par()[5] = -C/(300.*H[2]) ;
997 } else {
1000 T = z2*sqrt(r2) ;
1001 data.par()[2] = atan2(y2,x2);
1002 data.par()[3] = atan2(1.,T) ;
1003 data.par()[5] = m_ITKGeometry ? 0.9/m_pTmin : 1./m_pTmin ;
1004 }
1005 }
1007 else {
1008 T = z2*sqrt(r2) ;
1009 data.par()[2] = atan2(y2,x2);
1010 data.par()[3] = atan2(1.,T) ;
1011 data.par()[5] = m_ITKGeometry ? 0.9/m_pTmin : 1./m_pTmin ;
1012 }
1013
1014 double pTm = pTmin(SP[0]->eta()); // all spacepoints should have approx. same eta
1015
1017 if (m_ITKGeometry){
1018 if(std::abs(data.par()[5])*pTm > 1) return nullptr;
1019 }
1020 else if(std::abs(data.par()[5])*m_pTmin > 1.1) return nullptr;
1021
1023 data.par()[4] = data.par()[5]/sqrt(1.+T*T);
1024 data.par()[6] = x0 ;
1025 data.par()[7] = y0 ;
1026 data.par()[8] = z0 ;
1027
1030 if (sss && !isHadCaloCompatible(data)) return nullptr;
1031
1034 std::unique_ptr<Trk::TrackParameters> T0 = pla->createUniqueTrackParameters(data.par()[0],
1035 data.par()[1],
1036 data.par()[2],
1037 data.par()[3],
1038 data.par()[4],
1039 std::nullopt);
1040
1041 if(m_ITKGeometry && m_tracksfinder->pTseed(data.combinatorialData(),*T0,SP,ctx) < pTm) return nullptr;
1042 else return T0;
1043
1044}
1045
1047// Set track quality cuts
1049
1051{
1052 InDet::TrackQualityCuts trackquality;
1053 // Integer cuts
1054 //
1055 trackquality.setIntCut("MinNumberOfClusters" ,m_nclusmin );
1056 trackquality.setIntCut("MinNumberOfWClusters",m_nwclusmin );
1057 trackquality.setIntCut("MaxNumberOfHoles" ,m_nholesmax );
1058 trackquality.setIntCut("MaxHolesGap" ,m_dholesmax );
1059
1060 if (m_useassoTool) trackquality.setIntCut("UseAssociationTool",1);
1061 else trackquality.setIntCut("UseAssociationTool",0);
1062 if (m_cosmicTrack) trackquality.setIntCut("CosmicTrack" ,1);
1063 else trackquality.setIntCut("CosmicTrack" ,0);
1064 if (simpleTrack) trackquality.setIntCut("SimpleTrack" ,1);
1065 else trackquality.setIntCut("SimpleTrack" ,0);
1066 if (m_multitracks) trackquality.setIntCut("doMultiTracksProd" ,1);
1067 else trackquality.setIntCut("doMultiTracksProd" ,0);
1068
1069 // Double cuts
1070 //
1071 trackquality.setDoubleCut("pTmin" ,m_pTmin );
1072 trackquality.setDoubleCut("pTminBrem" ,m_pTminBrem );
1073 trackquality.setDoubleCut("MaxXi2forCluster" ,m_xi2max );
1074 trackquality.setDoubleCut("MaxXi2forOutlier" ,m_xi2maxNoAdd);
1075 trackquality.setDoubleCut("MaxXi2forSearch" ,m_xi2maxlink );
1076 trackquality.setDoubleCut("MaxXi2MultiTracks" ,m_xi2multitracks);
1077
1078 return trackquality;
1079}
1080
1082// Detector elements selection
1084
1086 std::vector<const InDetDD::SiDetectorElement*>& DE)
1087{
1088 std::vector<const InDetDD::SiDetectorElement*>::iterator d = DE.begin();
1089 while (d!=DE.end()) {
1090 if ((*d)->isPixel()) {
1091 if (!data.pix()) {
1092 d = DE.erase(d);
1093 continue;
1094 }
1095 } else if (!data.sct()) {
1096 d = DE.erase(d);
1097 continue;
1098 }
1099 ++d;
1100 }
1101}
1102
1104// Clusters from seed comparison with clusters associated with track
1105//
1106// Seeds is good only if no tracks has hits in all clusters from given seed (nt!=n)
1107// where, n - number clusters in seed
1108// nt - number clusters with track information
1109//
1111
1112bool InDet::SiTrackMaker_xk::newSeed(SiTrackMakerEventData_xk& data, const std::vector<const Trk::SpacePoint*>& Sp) const
1113{
1114 std::multiset<const Trk::Track*> trackseed;
1115 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator iter_clusterOnTrack,iter_clusterOnTrackEnd = data.clusterTrack().end();
1116
1118 size_t n = 0;
1119
1120 for (const Trk::SpacePoint* spacePoint : Sp) {
1121
1123 const Trk::PrepRawData* prd = spacePoint->clusterList().first;
1124
1126 for (iter_clusterOnTrack = data.clusterTrack().find(prd); iter_clusterOnTrack!=iter_clusterOnTrackEnd; ++iter_clusterOnTrack) {
1127 if ((*iter_clusterOnTrack).first!=prd) break;
1129 trackseed.insert((*iter_clusterOnTrack).second);
1130 }
1132 ++n;
1134 prd = spacePoint->clusterList().second;
1136 if (!prd) continue;
1138 for (iter_clusterOnTrack = data.clusterTrack().find(prd); iter_clusterOnTrack!=iter_clusterOnTrackEnd; ++iter_clusterOnTrack) {
1139 if ((*iter_clusterOnTrack).first!=prd) break;
1140 trackseed.insert((*iter_clusterOnTrack).second);
1141 }
1143 ++n;
1144 }
1148 if(trackseed.size() < n) return true;
1150 if( m_heavyion && n==3 ) return true;
1151
1153
1158 const Trk::Track* currentTrack {nullptr};
1159 size_t clustersOnCurrent = 1;
1161 for(const Trk::Track* track : trackseed) {
1163 if(track != currentTrack) {
1164 currentTrack = track;
1165 clustersOnCurrent = 1;
1166 continue ;
1167 }
1170 if(++clustersOnCurrent == n) return false;
1171 }
1173 return clustersOnCurrent!=n;
1174}
1175
1179
1180
1181int InDet::SiTrackMaker_xk::kindSeed(const std::vector<const Trk::SpacePoint*>& Sp)
1182{
1183
1184 if(Sp.size()!=3) return 0;//correct handling of Pixel-only ITk tracklets
1185
1186 std::vector<const Trk::SpacePoint*>::const_iterator s=Sp.begin(),se=Sp.end();
1187
1188 int n = 0;
1189 for(; s!=se; ++s) {if((*s)->clusterList().second) ++n;}
1190 return n;
1191}
1192
1193int InDet::SiTrackMaker_xk::rapidity(const std::vector<const Trk::SpacePoint*>& Sp)
1194{
1195 if(Sp.size() < 2) return 0;
1196
1197 Amg::Vector3D delta_sp = Sp[0]->globalPosition() - Sp[1]->globalPosition();
1198 float eta = 2*std::abs(delta_sp.eta());
1199 int n = int(eta);
1200 if(n > 7) n = 7;
1201 return n;
1202}
1203
1205// Clusters-track multimap production
1207
1209{
1211 m = Tr->measurementsOnTrack()->begin(),
1212 me = Tr->measurementsOnTrack()->end ();
1213
1214 for (; m!=me; ++m) {
1215 const Trk::PrepRawData* prd = static_cast<const Trk::RIO_OnTrack*>(*m)->prepRawData();
1216 if (prd) data.clusterTrack().insert(std::make_pair(prd, Tr));
1217 }
1218}
1219
1221// Test is it new track
1223
1225{
1226 const Trk::PrepRawData* prd [100];
1227 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator
1228 ti,t[100],te = data.clusterTrack().end();
1229
1230 int n = 0;
1231
1233 m = Tr->measurementsOnTrack()->begin(),
1234 me = Tr->measurementsOnTrack()->end ();
1235
1236 for (; m!=me; ++m) {
1237
1238 const Trk::PrepRawData* pr = static_cast<const Trk::RIO_OnTrack*>(*m)->prepRawData();
1239 if (pr) {
1240 prd[n] =pr;
1241 t [n] = data.clusterTrack().find(prd[n]);
1242 if (t[n]==te) return true;
1243 ++n;
1244 }
1245 }
1246
1247 if (!n) return true;
1248 int nclt = n;
1249
1250 for (int i=0; i!=n; ++i) {
1251 int nclmax = 0;
1252 for (ti=t[i]; ti!=te; ++ti) {
1253 if ( (*ti).first != prd[i] ) break;
1254 int ncl = (*ti).second->measurementsOnTrack()->size();
1255 if (ncl > nclmax) nclmax = ncl;
1256 }
1257 if (nclt > nclmax) return true;
1258 }
1259 return false;
1260}
1261
1263// Calculation global position for space points
1265
1267(const Trk::SpacePoint& s0, const Trk::SpacePoint& s1, const Trk::SpacePoint& s2,
1268 double* p0, double* p1, double* p2) const
1269{
1270
1272 p0[0] = s0.globalPosition().x();
1273 p0[1] = s0.globalPosition().y();
1274 p0[2] = s0.globalPosition().z();
1275
1276 p1[0] = s1.globalPosition().x();
1277 p1[1] = s1.globalPosition().y();
1278 p1[2] = s1.globalPosition().z();
1279
1280 p2[0] = s2.globalPosition().x();
1281 p2[1] = s2.globalPosition().y();
1282 p2[2] = s2.globalPosition().z();
1283
1285 if (!s0.clusterList().second && !s1.clusterList().second && !s2.clusterList().second) return true;
1286
1288 double dir0[3],dir1[3],dir2[3];
1289
1290 globalDirections(p0,p1,p2,dir0,dir1,dir2);
1291
1294 if (s0.clusterList().second && !globalPosition(s0,dir0,p0)) return false;
1295 if (s1.clusterList().second && !globalPosition(s1,dir1,p1)) return false;
1296 if (s2.clusterList().second && !globalPosition(s2,dir2,p2)) return false;
1297
1298 return true;
1299}
1300
1302// Calculation global position for space points
1304
1309(const Trk::SpacePoint& sp, const double* dir,double* p) const
1310{
1312 const Trk::PrepRawData* c0 = sp.clusterList().first;
1313 const Trk::PrepRawData* c1 = sp.clusterList().second;
1314
1315 const InDetDD::SiDetectorElement* de0 = static_cast<const InDet::SiCluster*>(c0)->detectorElement();
1316 const InDetDD::SiDetectorElement* de1 = static_cast<const InDet::SiCluster*>(c1)->detectorElement();
1317
1319 Amg::Vector2D localPos = c0->localPosition();
1320 std::pair<Amg::Vector3D,Amg::Vector3D> e0
1321 (de0->endsOfStrip(InDetDD::SiLocalPosition(localPos.y(),localPos.x(),0.)));
1322
1323 localPos = c1->localPosition();
1324 std::pair<Amg::Vector3D,Amg::Vector3D> e1
1325 (de1->endsOfStrip(InDetDD::SiLocalPosition(localPos.y(),localPos.x(),0.)));
1326
1329 double a0[3] = {e0.second.x()-e0.first.x(), e0.second.y()-e0.first.y(), e0.second.z()-e0.first.z()};
1330 double a1[3] = {e1.second.x()-e1.first.x(), e1.second.y()-e1.first.y(), e1.second.z()-e1.first.z()};
1332 double dr[3] = {e1.first .x()-e0.first.x(), e1.first .y()-e0.first.y(), e1.first .z()-e0.first.z()};
1333
1335 double d0 = m_distmax/sqrt(a0[0]*a0[0]+a0[1]*a0[1]+a0[2]*a0[2]);
1336
1339 double u[3] = {a1[1]*dir[2]-a1[2]*dir[1],a1[2]*dir[0]-a1[0]*dir[2],a1[0]*dir[1]-a1[1]*dir[0]};
1340 double v[3] = {a0[1]*dir[2]-a0[2]*dir[1],a0[2]*dir[0]-a0[0]*dir[2],a0[0]*dir[1]-a0[1]*dir[0]};
1341
1348
1351 double du = a0[0]*u[0]+a0[1]*u[1]+a0[2]*u[2];
1352
1354 if (du==0. ) return false;
1355
1362 double s0 = (dr[0]*u[0]+dr[1]*u[1]+dr[2]*u[2])/du;
1367 double s1 = (dr[0]*v[0]+dr[1]*v[1]+dr[2]*v[2])/du;
1368
1373 if (s0 < -d0 || s0 > 1.+d0 || s1 < -d0 || s1 > 1.+d0) return false;
1374
1377 p[0] = e0.first.x()+s0*a0[0];
1378 p[1] = e0.first.y()+s0*a0[1];
1379 p[2] = e0.first.z()+s0*a0[2];
1380
1381 return true;
1382}
1383
1385// Test is it track with calo seed compatible
1387
1389{
1390 if (!data.caloClusterROIEM()) return false;
1391
1392
1393 double F = data.par()[2] ;
1394 double E = -log(tan(.5*data.par()[3])) ;
1395 double R = sqrt(data.par()[6]*data.par()[6]+data.par()[7]*data.par()[7]);
1396 double Z = data.par()[8] ;
1397 return data.caloClusterROIEM()->hasMatchingROI(F, E, R, Z, m_phiWidth, m_etaWidth);
1398}
1399
1401// Test track is compatible withi had calo seed
1403
1405{
1406 if (!data.caloClusterROIHad()) return false;
1407
1408 double F = data.par()[2] ;
1409 double E = -log(tan(.5*data.par()[3])) ;
1410 double R = sqrt(data.par()[6]*data.par()[6]+data.par()[7]*data.par()[7]);
1411 double Z = data.par()[8] ;
1412
1413 return data.caloClusterROIHad()->hasMatchingROI(F, E, R, Z, m_phiWidth, m_etaWidth);
1414}
1415
1417// Calculation global direction for positions of space points
1419
1424(const double* p0, const double* p1, const double* p2, double* d0, double* d1, double* d2)
1425{
1427 double x01 = p1[0]-p0[0] ;
1428 double y01 = p1[1]-p0[1] ;
1429 double x02 = p2[0]-p0[0] ;
1430 double y02 = p2[1]-p0[1] ;
1431
1435
1437 double d01 = x01*x01+y01*y01 ;
1438 double x1 = sqrt(d01) ;
1439 double u01 = 1./x1 ;
1440 double a = x01*u01 ;
1441 double b = y01*u01 ;
1443 double x2 = a*x02+b*y02 ;
1445 double y2 = a*y02-b*x02 ;
1446
1448 double d02 = x2*x2+y2*y2 ;
1450 double u02 = x2/d02 ;
1451 double v02 = y2/d02 ;
1456 double A0 = v02 /(u02-u01) ;
1457 double B0 = 2.*(v02-A0*u02) ;
1458
1464
1465 double C2 = (1.-B0*y2) ;
1466 double S2 = (A0+B0*x2) ;
1467
1468 double T = (p2[2]-p0[2])/sqrt(d02);
1469 double sinTheta = 1./sqrt(1.+T*T) ;
1470 double cosTheta = sinTheta*T ;
1471 double sinThetaCosAlpha = sinTheta / sqrt(1.+A0*A0) ;
1472 double Sa = sinThetaCosAlpha*a ;
1473 double Sb = sinThetaCosAlpha*b ;
1474
1479 d0[0] = Sa -Sb*A0;
1480 d0[1]= Sb +Sa*A0;
1481 d0[2]=cosTheta;
1482
1484 d1[0] = Sa +Sb*A0;
1485 d1[1]= Sb -Sa*A0;
1486 d1[2]=cosTheta;
1487
1489 d2[0] = Sa*C2-Sb*S2;
1490 d2[1]= Sb*C2+Sa*S2;
1491 d2[2]=cosTheta;
1492}
1493
1494
1495
1497{
1498 if (m_ptbins.size() == 0) return m_pTmin;
1499 double aeta = std::abs(eta);
1500 for(int n = int(m_ptbins.size()-1); n>=0; --n) {
1501 if(aeta > m_etabins[n]) return m_ptbins[n];
1502 }
1503 return m_pTmin;
1504}
Scalar eta() const
pseudorapidity 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_DEBUG(x)
static const int B0
Definition AtlasPID.h:122
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t sp
static Double_t s0
static Double_t a
static Double_t Tp(Double_t *t, Double_t *par)
#define F(x, y, z)
Definition MD5.cxx:112
#define H(x, y, z)
Definition MD5.cxx:114
struct TBPatternUnitContext S2
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
Class to hold geometrical description of a silicon detector element.
std::pair< Amg::Vector3D, Amg::Vector3D > endsOfStrip(const Amg::Vector2D &position) const
Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame...
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
InDet::SiTrackMakerEventData_xk holds event dependent data used by ISiTrackMaker.
bool globalPositions(const Trk::SpacePoint &s0, const Trk::SpacePoint &s1, const Trk::SpacePoint &s2, double *p0, double *p1, double *p2) const
BooleanProperty m_useassoTool
DoubleArrayProperty m_etabins
BooleanProperty m_ITKGeometry
SG::ReadHandleKey< ROIPhiRZContainer > m_caloCluster
BooleanProperty m_seedsfilter
DoubleProperty m_xi2maxNoAdd
ToolHandle< InDet::ISiCombinatorialTrackFinder > m_tracksfinder
BooleanProperty m_multitracks
void resetCounter(std::array< std::array< T, M >, N > &a) const
helper for working with the stat arrays
static void globalDirections(const double *p0, const double *p1, const double *p2, double *d0, double *d1, double *d2)
Here, we derive the local track direction in the space-points as the tangents to the estimated trajec...
virtual std::list< Trk::Track * > getTracks(const EventContext &ctx, SiTrackMakerEventData_xk &data, const std::vector< const Trk::SpacePoint * > &Sp) const override
bool newSeed(SiTrackMakerEventData_xk &data, const std::vector< const Trk::SpacePoint * > &Sp) const
virtual void newEvent(const EventContext &ctx, SiTrackMakerEventData_xk &data, bool PIX, bool SCT) const override
double pTmin(double eta) const
static MsgStream & dumpevent(SiTrackMakerEventData_xk &data, MsgStream &out)
ToolHandle< InDet::ISeedToTrackConversionTool > m_seedtrack
std::unique_ptr< Trk::TrackParameters > getAtaPlane(MagField::AtlasFieldCache &fieldCache, SiTrackMakerEventData_xk &data, bool sss, const std::vector< const Trk::SpacePoint * > &SP, const EventContext &ctx) const
DoubleProperty m_xi2multitracks
StringProperty m_patternName
BooleanProperty m_useTrigInDetRoadPredictorTool
BooleanProperty m_seedsegmentsWrite
IntegerProperty m_dholesmax
std::vector< statAllTypes > m_indexToEnum
BooleanProperty m_useBremModel
MsgStream & dumpStatistics(MsgStream &out) const
virtual void newTrigEvent(const EventContext &ctx, SiTrackMakerEventData_xk &data, bool PIX, bool SCT) const override
virtual StatusCode finalize() override
static void clusterTrackMap(SiTrackMakerEventData_xk &data, Trk::Track *Tr)
ToolHandle< InDet::ISiDetElementsRoadMaker > m_roadmaker
DoubleProperty m_xi2maxlink
BooleanProperty m_cosmicTrack
bool globalPosition(const Trk::SpacePoint &sp, const double *dir, double *p) const
This is a refinement of the global position for strip space-points.
virtual StatusCode initialize() override
SG::ReadHandleKey< ROIPhiRZContainer > m_caloHad
IntegerProperty m_nholesmax
BooleanProperty m_useTrigTrackFollowingTool
static int rapidity(const std::vector< const Trk::SpacePoint * > &Sp)
bool isCaloCompatible(SiTrackMakerEventData_xk &data) const
static int kindSeed(const std::vector< const Trk::SpacePoint * > &Sp)
BooleanProperty m_useCaloSeeds
ToolHandle< ITrigInDetRoadPredictorTool > m_trigInDetRoadPredictorTool
Trk::MagneticFieldMode m_fieldModeEnum
IntegerProperty m_nwclusmin
ToolHandle< ITrigInDetTrackFollowingTool > m_trigInDetTrackFollowingTool
IntegerProperty m_trackletPoints
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
bool isHadCaloCompatible(SiTrackMakerEventData_xk &data) const
MsgStream & dumpconditions(MsgStream &out) const
InDet::TrackQualityCuts setTrackQualityCuts(bool simpleTrack) const
BooleanProperty m_useSSSfilter
virtual void endEvent(SiTrackMakerEventData_xk &data) const override
static bool isNewTrack(SiTrackMakerEventData_xk &data, Trk::Track *Tr)
static void detectorElementsSelection(SiTrackMakerEventData_xk &data, std::vector< const InDetDD::SiDetectorElement * > &DE)
IntegerProperty m_nclusmin
BooleanProperty m_useHClusSeed
MsgStream & dump(SiTrackMakerEventData_xk &data, MsgStream &out) const override
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
DoubleArrayProperty m_ptbins
void setIntCut(const std::string &, int)
void setDoubleCut(const std::string &, double)
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
bool solenoidOn() const
status of the magnets
void getFieldZR(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field valaue on the z-r plane at given position works only inside the solenoid.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
magnetic field properties to steer the behavior of the extrapolation
MagneticFieldMode magneticFieldMode() const
Returns the MagneticFieldMode as specified.
Class for a planaer rectangular or trapezoidal surface in the ATLAS detector.
virtual Surface::ChargedTrackParametersUniquePtr createUniqueTrackParameters(double l1, double l2, double phi, double theta, double qop, std::optional< AmgSymMatrix(5)> cov=std::nullopt) const override final
Use the Surface as a ParametersBase constructor, from local parameters - charged.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Definition RIO_OnTrack.h:70
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
@ BremFit
A brem fit was performed on this track.
@ SiSpacePointsSeedMaker_Cosmic
Entries allowing to distinguish different seed makers.
@ SiSpacePointsSeedMaker_LargeD0
Large d0 for displaced vertex searches.
@ SiSpacePointsSeedMaker_ForwardTracks
Entries allowing to distinguish different seed makers.
@ SiSpacePointsSeedMaker_ITkConversionTracks
ITkConversion Track flag.
@ SiSPSeededFinder
Tracks from SiSPSeedFinder.
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
int r
Definition globals.cxx:22
double a0
Definition globals.cxx:27
struct color C
TStreamerInfo * inf
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
@ oppositeMomentum
@ alongMomentum
MagneticFieldMode
MagneticFieldMode describing the field setup within a volume.
@ FastField
call the fast field access method of the FieldSvc
@ NoField
Field is set to 0., 0., 0.,.
@ FullField
Field is set to be realistic, but within a given Volume.
ParametersBase< TrackParametersDim, Charged > TrackParameters
-event-from-file
hold the test vectors and ease the comparison
MsgStream & msg
Definition testRead.cxx:32