ATLAS Offline Software
Loading...
Searching...
No Matches
SiTrajectory_xk.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
7#include <iostream>
8#include <iomanip>
9#include <boost/io/ios_state.hpp>
10
12// Set work information to trajectory
14
16{
17 m_tools = t;
18 for (int i=0; i!=300; ++i) m_elements[i].setTools(t);
19}
20
22{
23 for (int i=0; i!=300; ++i) m_elements[i].setParameters();
24}
25
27// Erase trajector element
29
31{
32 if (n>=0 && n<m_nElements) {
33 for (int i=n; i!=m_nElements-1; ++i) m_elementsMap[i] = m_elementsMap[i+1];
35 }
36}
37
39// Trajectory conversion to TrackStateOnSurface
41
44{
45 if (!cosmic || m_elements[m_elementsMap[m_firstElement]].parametersUB().parameters()[2] < 0.) {
47 }
49}
50
52// Trajectory conversion to TrackStateOnSurface with old direction
54
57{
58
59 auto dtsos = Trk::TrackStates();
60
61 bool multi = m_tools->multiTrack();
62 if (m_nclusters <= m_tools->clustersmin() ||
63 pTfirst() < m_tools->pTmin()) multi = false;
64
65 int i = m_firstElement;
66
68 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(false,true,multi,1,ctx);
69
70 if (tsos) dtsos.push_back(tsos);
71
72 for (++i; i!=m_lastElement; ++i) {
73
74 int m = m_elementsMap[i];
75 if (m_elements[m].cluster() || m_elements[m].clusterNoAdd() ) {
76 tsos = m_elements[m].trackStateOnSurface(false,false,multi,0,ctx);
77 if (tsos) dtsos.push_back(tsos);
78 }
79 }
80
81 i = m_lastElement;
82 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(false,false,multi,2,ctx);
83 if (tsos) dtsos.push_back(tsos);
84
85 if (multi) {
86 m_ntos = 0;
87 for (int i=m_firstElement; i<=m_lastElement; ++i) {
88
89 int m = m_elementsMap[i];
90 if (!m_elements[m].ntsos()) continue;
91 m_atos[m_ntos ] = m;
92 m_itos[m_ntos++] = 0;
93 }
94 }
95 return dtsos;
96}
97
99// Trajectory conversion to TrackStateOnSurface with new direction
101
104{
105
106 auto dtsos = Trk::TrackStates();
107
108 bool multi = m_tools->multiTrack();
109 if (pTfirst() < m_tools->pTmin()) multi = false;
110
111 int i = m_lastElement;
112
114 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(true,true,multi,2,ctx);
115
116 if (tsos) dtsos.push_back(tsos);
117
118 for (--i; i!=m_firstElement; --i) {
119
120 int m = m_elementsMap[i];
121 if (m_elements[m].cluster() || m_elements[m].clusterNoAdd() ) {
122 tsos = m_elements[m].trackStateOnSurface(true,false,multi,0,ctx);
123 if (tsos) dtsos.push_back(tsos);
124 }
125 }
126
127 i = m_firstElement;
128 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(true,false,multi,1,ctx);
129 if (tsos) dtsos.push_back(tsos);
130
131 return dtsos;
132}
133
135// Trajectory conversion to simple TrackStateOnSurface
137
140{
141 if (!cosmic || m_elements[m_elementsMap[m_firstElement]].parametersUB().parameters()[2] < 0.) {
143 }
145}
146
148// Trajectory conversion to simple TrackStateOnSurface with old direction
150
153{
154 auto dtsos = Trk::TrackStates();
155
156 int i = m_firstElement;
157
159 tsos = m_elements[m_elementsMap[i]].trackPerigeeStateOnSurface(ctx);
160
161 if (tsos) dtsos.push_back(tsos);
162
163 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,m_tools->useFastTracking(),m_tools->useFastTracking());
164
165 if (tsos) dtsos.push_back(tsos);
166
167 int lastClusterElement = 0;
168 for (int j=m_lastElement; j>=i; j--) {
169 int m = m_elementsMap[j];
170 if (m_elements[m].cluster()) {
171 lastClusterElement = j;
172 break;
173 }
174 }
175 if( lastClusterElement==0 || lastClusterElement==i ) return dtsos;
176
177 for (++i; i<std::min(lastClusterElement,m_lastElement); ++i) {
178
179 int m = m_elementsMap[i];
180 if (m_elements[m].cluster()) {
181 tsos = m_elements[m].trackSimpleStateOnSurface(false,false,0);
182 if (tsos) dtsos.push_back(tsos);
183 }
184 }
185
186 i = std::min(lastClusterElement,m_lastElement);
187 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,true,2);
188 if (tsos) dtsos.push_back(tsos);
189
190 return dtsos;
191}
192
194// Trajectory conversion to simple TrackStateOnSurface with new direction
196
199{
200 auto dtsos = Trk::TrackStates();
201
202 int i = m_lastElement;
203
205 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(true,true,2);
206
207 if (tsos) dtsos.push_back(tsos);
208
209 for (--i; i!=m_firstElement; --i) {
210
211 int m = m_elementsMap[i];
212 if (m_elements[m].cluster() || m_elements[m].clusterNoAdd() ) {
213 tsos = m_elements[m].trackSimpleStateOnSurface(true,false,0);
214 if (tsos) dtsos.push_back(tsos);
215 }
216 }
217
218 i = m_firstElement;
219 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(true,false,1);
220 if (tsos) dtsos.push_back(tsos);
221
222 return dtsos;
223}
224
226// Trajectory conversion to simple TrackStateOnSurface
227// Only for Disappearing Track Trigger that uses also failed tracks
229
238
240// Trajectory conversion to simple TrackStateOnSurface with old direction
241// Only for Disappearing Track Trigger that uses also failed tracks
243
246{
247 auto dtsos = Trk::TrackStates();
248
249 int i = m_firstElement;
250
252 tsos = m_elements[m_elementsMap[i]].trackPerigeeStateOnSurface(ctx);
253
254 if (tsos) dtsos.push_back(tsos);
255
256 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,false,0);
257
258 if (tsos) dtsos.push_back(tsos);
259
260 int lastClusterElement = 0;
261 for (int j=m_lastElement; j>=i; j--) {
262 int m = m_elementsMap[j];
263 if (m_elements[m].cluster()) {
264 lastClusterElement = j;
265 break;
266 }
267 }
268 if( lastClusterElement==0 || lastClusterElement==i ) return dtsos;
269
270 for (++i; i<std::min(lastClusterElement,m_lastElement); ++i) {
271
272 int m = m_elementsMap[i];
273 if (m_elements[m].cluster()) {
274 tsos = m_elements[m].trackSimpleStateOnSurface(false,false,0);
275 if (tsos) dtsos.push_back(tsos);
276 }
277 }
278
279 i = std::min(lastClusterElement,m_lastElement);
280 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,true,2);
281 if (tsos) dtsos.push_back(tsos);
282
283 return dtsos;
284}
285
287// FitQuality production
289
290std::unique_ptr<Trk::FitQuality> InDet::SiTrajectory_xk::convertToFitQuality() const{
291 double xi2 = m_elements[m_elementsMap[m_firstElement]].xi2totalB();
292 return std::make_unique<Trk::FitQuality>(xi2, (m_ndf - 5));
293}
294
296// Test is it new track
298
300(std::multimap<const Trk::PrepRawData*,const Trk::Track*>& map) const
301{
302 if (m_firstElement==-100) return false;//i.e. the int array never had elements inserted
303 const Trk::PrepRawData* prd [100];
304 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator
305 ti,t[100],te = map.end();
306 int n = 0 ;
307 for (int i=m_firstElement; i<=m_lastElement; ++i) {
308 if (n >= 100) break;
309 int m = m_elementsMap[i];
310
311 if (m_elements[m].cluster()) {
312 prd[n] = m_elements[m].cluster();
313 t[n] = map.find(prd[n]);
314 if (t[n]==te) return true;
315 ++n;
316 } else if (m_elements[m].clusterNoAdd()) {
317 prd[n] = m_elements[m].clusterNoAdd();
318 t[n] = map.find(prd[n]);
319 if (t[n]==te) return true;
320 ++n;
321 }
322 }
323
324 int nclt = m_nclusters + m_nclustersNoAdd;
325
326 for (int i=0; i!=n; ++i) {
327 int nclmax = 0;
328 for (ti=t[i]; ti!=te; ++ti) {
329 if ( (*ti).first != prd[i] ) break;
330 int ncl = (*ti).second->measurementsOnTrack()->size();
331 if (ncl > nclmax) nclmax = ncl;
332 }
333 if (nclt > nclmax) return true;
334 }
335 return false;
336}
337
339// Overload of << operator std::ostream
341
342std::ostream& InDet::operator <<
343(std::ostream& sl,const InDet::SiTrajectory_xk& se)
344{
345 return se.dump(sl);
346}
347
349// Dumps relevant information into the ostream
351
352std::ostream& InDet::SiTrajectory_xk::dump( std::ostream& out ) const
353{
354 boost::io::ios_all_saver ias(out);
355
356 if (m_nElements <=0 ) {
357 out<<"Trajectory does not exist"<<std::endl; ias.restore();
358 return out;
359 }
361 out<<"Trajectory is wrong"<<std::endl; ias.restore();
362 return out;
363 }
364
365 out<<"|--------------------------------------------------------------------------------------------------------|"
366 <<std::endl;
367 out<<"| TRAJECTORY "
368 <<" |"
369 <<std::endl;
370
371 out<<"| Has"<<std::setw(3)<<m_nElements
372 <<" ("
373 <<std::setw(3)<<m_nActiveElements
374 <<")"
375 <<" elements and "
376 <<std::setw(2)<<m_nclusters+m_nclustersNoAdd<<" ("
377 <<std::setw(2)<<m_nclustersNoAdd<<") clusters and "
378 <<std::setw(2)<<m_ndf<<" weighted clusters and quality = "<<std::setw(12)<<std::setprecision(5)<<quality()
379 <<" |"
380 <<std::endl;
381 out<<"| Has number of holes before, inside, after and gap= "
382 <<std::setw(2)<<m_nHolesBefore
383 <<std::setw(2)<<m_nholes
384 <<std::setw(2)<<m_nHolesAfter
385 <<std::setw(3)<<m_dholes<<" |"
386 <<std::endl;
387 out<<"| F B |"
388 <<std::endl;
389
390 out<<"|---|--|---|-----|-|-|---------|---------|---------|---------|----------|---------|-|--|--|--|-|-|-|-|-|-|---------|"
391 <<std::endl;
392 out<<"| # |SS| D| Ncl |C|O| Xi2F | Xi2B | Az.Angle| Radius | pT(GeV) | dZ/dR |N|In|Lf|Lb|S|D|H|G|H|G| Step |"
393 <<std::endl;
394 out<<"|---|--|---|-----|-|-|---------|---------|---------|---------|----------|---------|-|--|--|--|-|-|-|-|-|-|---------|"
395 <<std::endl;
396
397 for (int i=0; i!=m_nElements; ++i) {
398
399 int m = m_elementsMap[i];
400
401 std::string DET = "D ";
402 const InDetDD::SiDetectorElement* D = m_elements[m].detElement();
403 std::string DE = " ";
404 if (m_elements[m].detstatus() < 0) DE = "-";
405 if (D) {
406 if (D->isPixel()) {
407 if (D->isBarrel()) DET = "Pb"; else DET = "Pe";
408 }
409 else if (D->isSCT()) {
410 if (D->isBarrel()) DET = "Sb"; else DET = "Se";
411 }
412 }
413 int c = 0;
414 if (m_elements[m].detstatus() > 0) c = m_elements[m].numberClusters();
415
416 out<<"|"<<std::setw(3)<<unsigned(i);
417
418 std::string S0=" ";
419 if (m_firstElement == i) S0="=>";
420 if (m_lastElement == i) S0="=>";
421
422 std::string S1=" ";
423 std::string S2=" ";
424 if (m_elements[m].cluster ()) S1="+";
425 if (m_elements[m].clusterNoAdd()) S2="+";
426
427 out<<"|"
428 <<S0<<"|"
429 <<std::setw(1)<<DE
430 <<std::setw(2)<<DET <<"|"
431 <<std::setw(5)<<c <<"|"
432 <<S1<<"|"
433 <<S2<<"|";
434
435 if (m_elements[m].status()) {
436
437 out<<std::setw(9)<<std::setprecision(3)<<m_elements[m].xi2F()<<"|";
438 out<<std::setw(9)<<std::setprecision(3)<<m_elements[m].xi2B()<<"|";
439
440 double ra = 0.;
441 double pt = 0.;
442 double tz = 0.;
443 double fa = 0.;
444
445 if (m_elements[m].status()==1) {
446
447 if (m_elements[m].cluster()) {
448
449 Amg::Vector3D gp = m_elements[m].parametersUF().position();
450 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
451 fa = atan2(gp.y(),gp.x());
452 pt = m_elements[m].parametersUF().momentum().perp();
453 tz = m_elements[m].parametersUF().cotTheta();
454 }
455 else {
456
457 Amg::Vector3D gp = m_elements[m].parametersPF().position();
458 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
459 fa = atan2(gp.y(),gp.x());
460 pt = m_elements[m].parametersPF().momentum().perp();
461 tz = m_elements[m].parametersPF().cotTheta();
462 }
463 }
464 else if ((m_tools->useFastTracking() and m_elements[m].status()>2) or m_elements[m].status()==2) {
465
466 if (m_elements[m].cluster()) {
467
468 Amg::Vector3D gp = m_elements[m].parametersUB().position();
469 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
470 fa = atan2(gp.y(),gp.x());
471 pt = m_elements[m].parametersUB().momentum().perp();
472 tz = m_elements[m].parametersUB().cotTheta();
473 }
474 else {
475
476 Amg::Vector3D gp = m_elements[m].parametersPB().position();
477 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
478 fa = atan2(gp.y(),gp.x());
479 pt = m_elements[m].parametersPB().momentum().perp();
480 tz = m_elements[m].parametersPB().cotTheta();
481 }
482 }
483 else {
484
485 Trk::PatternTrackParameters S1,SM,S2(m_elements[m].parametersPF());
486
487 if (m_elements[m].cluster()) S1 = m_elements[m].parametersUB();
488 else S1 = m_elements[m].parametersPB();
489
490 bool QA = m_tools->updatorTool()->combineStates(S1,S2,SM);
491
492 if (QA) {
493
494 Amg::Vector3D gp = SM.position();
495 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
496 fa = atan2(gp.y(),gp.x());
497 pt = SM.momentum().perp();
498 tz = SM.cotTheta();
499 }
500 }
501 out<<std::setw( 9)<<std::setprecision(4)<<fa <<"|";
502 out<<std::setw( 9)<<std::setprecision(4)<<ra <<"|";
503 out<<std::setw(10)<<std::setprecision(4)<<pt*.001<<"|";
504 out<<std::setw( 9)<<std::setprecision(4)<<tz <<"|";
505 out<<std::setw(1)<<unsigned(m_elements[m].noiseModel())<<"|";
506 out<<std::setw(2)<<m_elements[m].inside()<<"|";
507 out<<std::setw(2)<<unsigned(m_elements[m].nlinksF())<<"|";
508 out<<std::setw(2)<<unsigned(m_elements[m].nlinksB())<<"|";
509 out<<std::setw(1)<<unsigned(m_elements[m].status())<<"|";
510 out<<std::setw(1)<<unsigned(m_elements[m].difference())<<"|";
511 out<<std::setw(1)<<unsigned(m_elements[m].nholesF())<<"|";
512 out<<std::setw(1)<<unsigned(m_elements[m].dholesF())<<"|";
513 out<<std::setw(1)<<unsigned(m_elements[m].nholesB())<<"|";
514 out<<std::setw(1)<<unsigned(m_elements[m].dholesB())<<"|";
515 out<<std::setw(9)<<std::setprecision(4)<<m_elements[m].step()<<"|";
516 }
517 else {
518 out<<" |";
519 out<<" |";
520 out<<" |";
521 out<<" |";
522 out<<" |";
523 out<<" |";
524 out<<" |";
525 out<<" |";
526 out<<" |";
527 out<<" |";
528 out<<" |";
529 out<<" |";
530 out<<" |";
531 out<<" |";
532 out<<" |";
533 out<<" |";
534 out<<std::setw(9)<<std::setprecision(4)<<m_elements[m].step();
535 out<<"|";
536 }
537 out<<std::endl;
538 }
539 out<<"|---|--|---|-----|-|-|---------|---------|---------|---------|----------|---------|-|--|--|--|-|-|-|-|-|-|---------|"
540 <<std::endl;
541 ias.restore();
542 return out;
543}
544
546// pT seed estimation
548
550 (const Trk::TrackParameters & Tp,
551 std::vector<const InDet::SiCluster*> & Cl,
552 std::vector<const InDet::SiDetElementBoundaryLink_xk*>& DE,
553 const EventContext & ctx)
554{
555 double Xi2cut = 30.;
556
557 InDet::SiClusterCollection::const_iterator sib,sie;
558 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator r=DE.begin(),re=DE.end();
559 std::vector<const InDet::SiCluster*> ::iterator s=Cl.begin();
560
561 int n = 0;
562 if(!m_elements[n].set(1,(*r),sib,sie,(*s),ctx) ) return 0.;
563 if(!m_elements[n].firstTrajectorElement(Tp,ctx)) return 0.;
564
565 for(++r; r!=re; ++r) {
566 ++n; ++s;
567 if(!m_elements[n].set(1,(*r),sib,sie,(*s),ctx) ) return 0.;
568 if(!m_elements[n].ForwardPropagationWithoutSearch(m_elements[n-1], ctx)) return 0.;
569 if( m_elements[n].xi2F() > Xi2cut ) return 0.;
570 }
571 return m_elements[n].parametersUF().momentum().perp();
572}
573
574
576// Initiate trajectory
578
580(bool PIX,
581 bool SCT,
582 const InDet::PixelClusterContainer* PIXc ,
583 const InDet::SCT_ClusterContainer* SCTc ,
584 const Trk::TrackParameters & Tp ,
585 std::vector<const InDet::SiCluster*> & lSiCluster,
586 std::vector<const InDet::SiDetElementBoundaryLink_xk*>& DE ,
587 bool & rquality ,
588 const EventContext & ctx )
589{
591 m_nholes = 0;
592 m_nHolesBefore = 0;
593 m_nHolesAfter = 0;
594 m_dholes = 0;
595 m_nclusters = 0;
597 m_nElements = 0;
599 m_firstElement = -100;
600 m_lastElement = 0;
601 m_ndfcut = 0;
602 rquality = true;
603 m_ntos = 0;
604 int ndfwrong = 0;
605 double Xi2cut = 2.*m_tools->xi2max();
606
607 // radius of the dead cylinder
608 double Rdead = 142.5;
609 // boolean to decide if initialisation is needed or not
610 // initDeadMaterial is False (which means dead material needs be initialised)
611 // for ITk fast tracking configuration
612 bool initDeadMaterial = not(m_tools->isITkGeometry() and m_tools->useFastTracking());
613
614 if(!initDeadMaterial and !m_surfacedead) m_surfacedead = std::make_unique<const Trk::CylinderSurface>(Rdead,5000.);
615
616 std::vector<const InDet::SiCluster*>::iterator iter_cluster;
617 if (lSiCluster.size() < 2) return false;
618
619 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator iter_boundaryLink,endBoundaryLinks=DE.end();
620
621 int up = 0;
622 int last = 0;
623
626 for (iter_boundaryLink=DE.begin(); iter_boundaryLink!=endBoundaryLinks; ++iter_boundaryLink) {
627
629 const InDetDD::SiDetectorElement* detectorElement = (*iter_boundaryLink)->detElement();
630 IdentifierHash id = detectorElement->identifyHash();
631
633 const InDet::SiCluster* theCluster = nullptr;
634
636 if (detectorElement->isPixel()) {
637 if (PIX) {
638
639 // Set dead material
640 //
641 // if already initialised, not doing it again
642 if(not initDeadMaterial) {
643 const Trk::PlaneSurface* pla = static_cast<const Trk::PlaneSurface*>(&detectorElement->surface());
644 double R = pla->center().perp();
645 if(R > Rdead) {
646 initDeadMaterial = true;
647 if(!m_elements[m_nElements].setDead(m_surfacedead.get())) return false;
649 if(m_nclusters && !lSiCluster.empty()) {
650 if(!m_elements[m_nElements].ForwardPropagationWithoutSearch(m_elements[up], ctx)) return false;
651 up = m_nElements;
652 }
653 if(++m_nElements==300) break;
654 }
655 }
656
657 InDet::PixelClusterCollection::const_iterator iter_PixelClusterColl, iter_PixelClusterCollEnd;
659 const InDet::PixelClusterCollection *clustersOnElement = (*PIXc).indexFindPtr(id);
661 if (clustersOnElement!=nullptr && clustersOnElement->begin()!=clustersOnElement->end()) {
662
664 iter_PixelClusterColl = clustersOnElement->begin();
665 iter_PixelClusterCollEnd = clustersOnElement->end();
666
669 for (iter_cluster=lSiCluster.begin(); iter_cluster!=lSiCluster.end(); ++iter_cluster) {
671 if ((*iter_cluster)->detectorElement()==detectorElement) {
673 if (m_nclusters==0){
675 }
677 else{
679 }
681 ++m_nclusters;
683 m_ndfcut+=2;
685 theCluster=(*iter_cluster);
687 iter_cluster=lSiCluster.erase(iter_cluster);
691 break;
692 }
693 }
696 bool valid_set = m_elements[m_nElements].set(1,(*iter_boundaryLink),iter_PixelClusterColl,iter_PixelClusterCollEnd,theCluster,ctx);
697 if(m_tools->isITkGeometry() && !valid_set) return false;
700 }
702 else if (m_nActiveElements) {
704 bool valid_set = m_elements[m_nElements].set(0,(*iter_boundaryLink),iter_PixelClusterColl,iter_PixelClusterCollEnd,theCluster,ctx);
705 if(m_tools->isITkGeometry() && !valid_set) return false;
706 }
708 else {
709
710 continue;
711 }
717 if (++m_nElements==300) break;
718 }
719 }
721 else if (SCT) {
722 InDet::SCT_ClusterCollection::const_iterator iter_stripClusterColl, iter_StripClusterCollEnd;
724 const InDet::SCT_ClusterCollection *clustersOnElement = (*SCTc).indexFindPtr(id);
725
727 if (clustersOnElement!=nullptr && clustersOnElement->begin()!=clustersOnElement->end()) {
728
729 iter_stripClusterColl = clustersOnElement->begin();
730 iter_StripClusterCollEnd = clustersOnElement->end();
731
733 for (iter_cluster=lSiCluster.begin(); iter_cluster!=lSiCluster.end(); ++iter_cluster) {
734 if ((*iter_cluster)->detectorElement()==detectorElement) {
736 if (m_nclusters==0){
739 }
741 else{
743 }
745 ++m_nclusters;
747 m_ndfcut+=1;
749 theCluster=(*iter_cluster);
750 iter_cluster=lSiCluster.erase(iter_cluster);
753 break;
754 }
755 }
757 bool valid_set = m_elements[m_nElements].set(1,(*iter_boundaryLink),iter_stripClusterColl,iter_StripClusterCollEnd,theCluster,ctx);
758 if(m_tools->isITkGeometry() && !valid_set) return false;
761 }
763 else if (m_nActiveElements) {
765 bool valid_set = m_elements[m_nElements].set(0,(*iter_boundaryLink),iter_stripClusterColl,iter_StripClusterCollEnd,theCluster,ctx);
766 if(m_tools->isITkGeometry() && !valid_set) return false;
767 }
769 else {
771 continue;
772 }
777 if (++m_nElements==300) break;
778 }
779
781 if (m_firstElement == m_nElements-1) {
782 up = m_nElements-1;
783 if (!m_elements[up].firstTrajectorElement(Tp, ctx)) return false;
787 }
789 else if (theCluster) {
790
792 if (!m_elements[m_nElements-1].ForwardPropagationWithoutSearch(m_elements[up],ctx)) {
793 return false;
794 }
796 up = m_nElements-1;
798 if (m_elements[m_nElements-1].xi2F() <= Xi2cut) {
799 last=up;
800 }
802 else {
803 if (m_tools->isITkGeometry()) return false;
804 else{
806 ndfwrong+=m_elements[m_nElements-1].ndf();
808 if (ndfwrong > 3) return false;
812 --m_nclusters;
814 m_elements[m_nElements-1].eraseClusterForwardPropagation();
815 }
816 }
817 }
821 else if (m_nclusters && !lSiCluster.empty()) {
824 if (!m_elements[m_nElements-1].ForwardPropagationWithoutSearch(m_elements[up], ctx)) {
826 if(not m_tools->isITkGeometry() and m_elements[m_nElements-1].cluster()) return false;
829 --m_nElements;
831 if (m_elements[m_nElements-1].detstatus()) --m_nActiveElements;
832 }
834 else {
836 if (m_elements[m_nElements-1].inside()<0) ++m_nholes;
838 up = m_nElements-1;
839 }
840 }
841 }
842
844 if (!lSiCluster.empty()) {
846 rquality = false;
847 return false;
848 }
851 if (not m_tools->isITkGeometry() && ndfwrong && m_ndfcut < 6) return false;
852
854 m_ndf = m_ndfcut;
856 if (m_tools->isITkGeometry() || m_ndfcut > 6) m_ndfcut = 6;
857
859 int n = m_nElements-1;
861 for (; n>0; --n) {
863 if (m_elements[n].detstatus()>=0) break;
864 }
867 m_nElements = n+1;
868
870 for (; n>0; --n) {
871 if (m_elements[n].detstatus() == 1) {
872 m_elements[n].lastActive();
873 break;
874 }
875 }
876
879 int m = m_firstElement+1;
880 m_lastElement = last ;
883 for (n = m; n!=m_lastElement; ++n) {
887 if (En.cluster() || En.inside() <= 0) m_elementsMap[m++] = m_elementsMap[n];
888 }
890
892 if (m!=n) {
894 m_lastElement = m;
896 for (; n!=m_nElements; ++n){
898 }
899 m_nElements = m;
900 }
901 if (!m_tools->bremNoise()) return true;
902
904 for (n=m_lastElement; n!=m_nElements; ++n) {
905 m_elements[m_elementsMap[n]].bremNoiseModel();
906 }
907 return true;
908}
909
911// Seacrh cluster compatible with track parameters
913
915(const InDet::PixelClusterContainer* PIXc ,
916 const InDet::SCT_ClusterContainer* SCTc ,
917 const Trk::TrackParameters & Tp ,
918 std::vector<const InDet::SiDetElementBoundaryLink_xk*> & DE ,
919 std::multimap<const Trk::PrepRawData*,const Trk::Track*>& PT ,
920 std::vector<const InDet::SiCluster*> & lSiCluster,
921 const EventContext& ctx)
922{
923 m_nElements = 0;
924 m_ndf = 0;
925
926 std::multimap<double,const InDet::SiCluster*> xi2cluster;
927
928 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator iter_boundaryLink,endBoundaryLinks=DE.end();
929 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator t, te =PT.end();
930
931 double xi2Cut = .5;
932 int ndfCut = 6;
933
934 for (iter_boundaryLink=DE.begin(); iter_boundaryLink!=endBoundaryLinks; ++iter_boundaryLink) {
935
936 const InDetDD::SiDetectorElement* detectorElement = (*iter_boundaryLink)->detElement();
937 IdentifierHash id = detectorElement->identifyHash();
938
939 bool sct = detectorElement->isSCT();
940
941 if (!sct) {
942 InDet::PixelClusterCollection::const_iterator sib, sie;
943 const InDet::PixelClusterCollection *w = (*PIXc).indexFindPtr(id);
944
945 if (w!=nullptr && w->begin()!=w->end()) {
946 sib = w->begin();
947 sie = w->end ();
948 } else {
949 continue;
950 }
951 if (!m_elements[0].ForwardPropagationForClusterSeach(m_nElements,Tp,(*iter_boundaryLink),sib,sie,ctx)) return false;
952 } else {
953 InDet::SCT_ClusterCollection::const_iterator sib, sie;
954 const InDet::SCT_ClusterCollection *w = (*SCTc).indexFindPtr(id);
955
956 if (w!=nullptr && w->begin()!=w->end()) {
957 sib = w->begin();
958 sie = w->end ();
959 } else {
960 continue;
961 }
962 if (!m_elements[0].ForwardPropagationForClusterSeach(m_nElements,Tp,(*iter_boundaryLink),sib,sie,ctx)) return false;
963 }
964
965 for (int i=0; i!=m_elements[0].nlinksF(); ++i) {
966
967 double x = m_elements[0].linkF(i).xi2();
968
969 if (sct) {
970 t = PT.find(m_elements[0].linkF(i).cluster());
971 if (t!=te && (*t).second->measurementsOnTrack()->size() >= 10) continue;
972 } else {
973 x*=.5;
974 }
975
976 if (x <= xi2Cut) xi2cluster.insert(std::make_pair(x,m_elements[0].linkF(i).cluster()));
977 break;
978 }
979 ++m_nElements;
980 }
981
982 if (xi2cluster.size() < 3) return false;
983
984 std::multimap<double,const InDet::SiCluster*>::iterator xc = xi2cluster.begin(), xce = xi2cluster.end();
985
986 for (; xc!=xce; ++xc) {
987 lSiCluster.push_back((*xc).second);
988 (*xc).second->detectorElement()->isSCT() ? m_ndf+=1 : m_ndf+=2;
989 if ( m_ndf >= ndfCut ) break;
990 }
991
992 return m_ndf >= 6;
993}
994
996// Seacrh cluster compatible with global positions
998
1000(const InDet::PixelClusterContainer* PIXc ,
1001 const InDet::SCT_ClusterContainer* SCTc ,
1002 const std::vector<Amg::Vector3D> & Gp ,
1003 std::vector<const InDet::SiDetElementBoundaryLink_xk*> & DE ,
1004 std::multimap<const Trk::PrepRawData*,const Trk::Track*>& PT ,
1005 std::vector<const InDet::SiCluster*> & lSiCluster)
1006{
1007 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator iter_boundaryLink = DE.begin(), endBoundaryLinks = DE.end();
1008 std::vector<Amg::Vector3D>::const_iterator g,gb = Gp.begin(), ge = Gp.end();
1009 InDet::PixelClusterCollection::const_iterator pib, pie;
1010 InDet::SCT_ClusterCollection::const_iterator sib, sie;
1011 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator t, te =PT.end();
1012
1014
1015 double pv[ 5]={0.,0.,0.,0.,0.};
1016 double cv[15]={ .1 ,
1017 0. , .1,
1018 0. , 0.,.001,
1019 0. , 0., 0.,.001,
1020 0. , 0., 0., 0.,.00001};
1021
1022 double xi2Cut = 10.;
1023 m_ndf = 0 ;
1024
1025 for (; iter_boundaryLink!=endBoundaryLinks; ++iter_boundaryLink) {
1026
1027 const InDetDD::SiDetectorElement* d = (*iter_boundaryLink)->detElement();
1028 IdentifierHash id = d->identifyHash ();
1029 const Trk::Surface* su = &d->surface();
1030 const Trk::PlaneSurface* pla = static_cast<const Trk::PlaneSurface*>(su);
1031 if (!pla) continue;
1032
1033 const Amg::Transform3D& tr = pla->transform();
1034 double Ax[3] = {tr(0,0),tr(1,0),tr(2,0)};
1035 double Ay[3] = {tr(0,1),tr(1,1),tr(2,1)};
1036 double Az[3] = {tr(0,2),tr(1,2),tr(2,2)};
1037 double x0 = tr(0,3);
1038 double y0 = tr(1,3);
1039 double z0 = tr(2,3);
1040 double zcut = .001 ;
1041
1042 bool sct = d->isSCT();
1043 if (!sct) {
1044 const InDet::PixelClusterCollection *w = (*PIXc).indexFindPtr(id);
1045 if (w!=nullptr && w->begin()!=w->end()) {
1046 pib = w->begin();
1047 pie = w->end ();
1048 } else {
1049 continue;
1050 }
1051 } else {
1052 zcut = 1.;
1053 const InDet::SCT_ClusterCollection *w = (*SCTc).indexFindPtr(id);
1054 if (w!=nullptr && w->begin()!=w->end()) {
1055 sib = w->begin();
1056 sie = w->end ();
1057 } else {
1058 continue;
1059 }
1060 }
1061
1062 for (g=gb; g!=ge; ++g) {
1063
1064 double dx = (*g).x()-x0;
1065 double dy = (*g).y()-y0;
1066 double dz = (*g).z()-z0;
1067 double z = dx*Az[0]+dy*Az[1]+dz*Az[2];
1068 if (std::abs(z) > zcut) continue;
1069
1070 pv[0] = dx*Ax[0]+dy*Ax[1]+dz*Ax[2];
1071 pv[1] = dx*Ay[0]+dy*Ay[1]+dz*Ay[2];
1072 //setParametersWithCovariance detects whether su is 'owned' elsewhere
1073 //the ownership patterns could be improved, though.
1074 //coverity[MULTIPLE_INIT_SMART_PTRS]
1075 Tp.setParametersWithCovariance(su,pv,cv);
1076
1077 if (!sct) m_elements[0].CloseClusterSeach(Tp, (*iter_boundaryLink), pib, pie);
1078 else m_elements[0].CloseClusterSeach(Tp, (*iter_boundaryLink), sib, sie);
1079 const InDet::SiCluster* c = m_elements[0].cluster();
1080 if (!c || m_elements[0].xi2F() > xi2Cut) continue;
1081 if (sct) {
1082 t = PT.find(c);
1083 if (t!=te && (*t).second->measurementsOnTrack()->size() >= 10) continue;
1084 }
1085 sct ? m_ndf+=1 : m_ndf+=2;
1086 lSiCluster.push_back(c);
1087 }
1088 }
1089 return m_ndf >= 6;
1090}
1091
1093// Backward test initial trajectory
1095
1096bool InDet::SiTrajectory_xk::backwardSmoother(bool TWO, const EventContext& ctx)
1097{
1098 if (m_firstElement >= m_lastElement) return false;
1099
1100 // Trajectory difference test
1101 //
1102 int m = m_lastElement;
1103 for (; m>=m_firstElement; --m) {
1104 if (m_elements[m_elementsMap[m]].difference()) break;
1105 }
1106 if (m < m_firstElement) return true;
1107
1108 if (!m_elements[m_elementsMap[m_lastElement]].lastTrajectorElement()) return false;
1109
1110 int firstElement = m_lastElement ;
1111 int maxholes = m_tools->maxholes ();
1112 int maxdholes = m_tools->maxdholes();
1113 m_nclustersNoAdd = 0 ;
1114 m_difference = 0 ;
1115
1116 m = m_lastElement-1;
1117 int n = m ;
1118
1119 for (; m>=m_firstElement; --m) {
1120
1123
1124 if (!Em.BackwardPropagationSmoother(En,TWO,ctx)) {
1125
1126 if (m == m_firstElement) break;
1127
1128 for (int i=m+1; i!=m_nElements; ++i) m_elementsMap[i-1] = m_elementsMap[i];
1129 --m_lastElement;
1130 --m_nElements;
1131 --firstElement;
1132 continue;
1133 }
1134
1135 if ((Em.cluster() && Em.clusterOld()) && (Em.cluster()!=Em.clusterOld())) ++m_difference;
1136
1137 if (Em.cluster()) {
1138 firstElement = m;
1139 }
1140 else {
1141 n=m;
1142 if (Em.clusterNoAdd()) ++m_nclustersNoAdd;
1143 if (Em.nholesB() > maxholes || Em.dholesB() > maxdholes) {
1144 ++m_difference; break;
1145 }
1146 }
1147 }
1148
1149 m_firstElement = firstElement ;
1150 m = m_elementsMap[firstElement] ;
1151 n = m_elementsMap[ n ] ;
1152 m_nclusters = m_elements[m].nclustersB() ;
1153 m_nholes = m_elements[m].nholesB () ;
1154 m_nHolesBefore = m_elements[n].nholesB ()-m_nholes;
1155 m_ndf = m_elements[m].ndfB() ;
1156 if (m_ndf < m_ndfcut) return false;
1157
1158 // Erase trajectory elements with big distance from the track
1159 //
1160 m = firstElement+1;
1161 n = m;
1162 for (; m!=m_lastElement; ++m) {
1163
1165 if (Em.inside() > 0) {
1166 if (Em.detstatus() > 0) --m_nActiveElements;
1167 }
1168 else {
1169 m_elementsMap[n++] = m_elementsMap[m];
1170 }
1171 }
1172 m_lastElement = n;
1173
1174 // Test number trajector elemenst with clusters
1175 //
1176 if (m_nActiveElements < m_tools->clustersmin() && m_nholes+m_nHolesAfter) return false;
1177 if (n!=m) {
1178 for (; m!=m_nElements; ++m) m_elementsMap[n++] = m_elementsMap[m];
1179 m_nElements = n;
1180 }
1181 return true;
1182}
1183
1185// Backward trajectory extension
1187
1188bool InDet::SiTrajectory_xk::backwardExtension(int itmax, const EventContext& ctx)
1189{
1190 if (m_firstElement >= m_lastElement) return false;
1191 int L = m_firstElement;
1192 if (L==0) return true;
1193
1194 int MPbest[300] ;
1195 int TE [100] ;
1196 const InDet::SiCluster* CL [100] ;
1197 double XI2B [100] ;
1198 //Local variable PUB uses 27200 bytes of stack space
1199 //coverity[STACK_USE]
1202
1203 int maxholes = m_tools->maxholes ();
1204 int maxdholes = m_tools->maxdholes();
1205 const int itm = itmax-1 ;
1206 int it = 0 ;
1207 int itbest = 0 ;
1208 int qbest =-100 ;
1209 int nbest = 0 ;
1210 int ndfbest = 0 ;
1211 int lbest = L ;
1212 int hbest = 0 ;
1213 int hbestb = 0 ;
1214 int nclbest = 0 ;
1215 int ndcut = 3 ;
1216 int F = L ;
1217 double Xi2best = 0. ;
1218
1219 m_elements[m_elementsMap[F]].setNdist(0);
1220
1221 for (; it!=itmax; ++it) {
1222
1223 int l = F;
1224 int lastElementWithExpHit = F;
1225
1226 for (--F; F>=0; --F) {
1227
1230
1231 if (!Ef.BackwardPropagationFilter(El, ctx)) break;
1232
1233 if (Ef.cluster()) {
1234 lastElementWithExpHit = F;
1235 l = F;
1236 }
1237 else if (Ef.inside() < 0) {
1238 lastElementWithExpHit = F;
1239 if (Ef.nholesB() > maxholes || Ef.dholesB() > maxdholes) break;
1240 }
1241
1242 int nm = Ef.nclustersB()+F;
1243 if (Ef.ndist() > ndcut ||
1244 nm < nclbest ||
1245 (nm == nclbest && Ef.xi2totalB() > Xi2best) ) break;
1246 }
1247
1248 int fl = F;
1249 if (fl<0) fl = 0;
1250
1251 int m = m_elementsMap[l];
1252 int nc = m_elements[m].nclustersB();
1253
1254 if (it==0 && nc==m_nclusters) return true;
1255
1256 int np = m_elements[m].npixelsB();
1257 int nh = m_elements[m].nholesB();
1258 int nd = m_elements[m_elementsMap[fl]].ndist();
1259 int q = nc-nh;
1260 double X = m_elements[m].xi2totalB();
1261
1262 if ( (q > qbest) || (q==qbest && X < Xi2best ) ) {
1263
1264 qbest = q ;
1265 nbest = 0 ;
1266 ndfbest = 0 ;
1267 hbest = nh ;
1268 hbestb = m_elements[m_elementsMap[lastElementWithExpHit]].nholesB()-nh ;
1269 itbest = it ;
1270 Xi2best = X ;
1271 PA = m_elements[m_elementsMap[l]].parametersUB();
1272
1273 if (fl==0 && nd < ndcut) ndcut = nd;
1274
1275 if (fl!=0 || nd > 0 || np < 3) {
1276
1277 lbest = l-1;
1278 for (int i=l; i!=L; ++i) {
1279
1281
1282 if (Ei.inside() <= 0 ) {
1283 MPbest[++lbest] = i;
1284 if (Ei.cluster()) {
1285 CL[nbest] = Ei.cluster();
1286 XI2B[nbest] = Ei.xi2B();
1287 PUB[nbest] = Ei.parametersUB();
1288 TE[nbest++] = lbest;
1289 ndfbest += Ei.ndf();
1290 }
1291 }
1292 }
1293 }
1294 else {
1295
1296 l = -1;
1297 lbest = fl-1;
1298 for (int i=fl; i!=L; ++i) {
1299
1301
1302 if (Ei.inside() <= 0 && ++lbest >=0 ) {
1303 MPbest[lbest] = lbest;
1304 if (Ei.cluster()) {
1305 CL[nbest] = Ei.cluster();
1306 XI2B[nbest] = Ei.xi2B();
1307 PUB[nbest] = Ei.parametersUB();
1308 TE[nbest++] = lbest;
1309 ndfbest += Ei.ndf();
1310 if (l<0) l=lbest;
1311 }
1312 m_elementsMap.at(lbest) = m_elementsMap.at(i);
1313 }
1314
1315 }
1316
1317 int dn = L-1-lbest;
1318
1319 if (dn!=0) {
1320
1321 for (int i=L; i!= m_nElements; ++i) {
1322 m_elementsMap.at(i-dn)=m_elementsMap.at(i);
1323 }
1324
1325 L -=dn;
1326 m_nElements -=dn;
1327 m_lastElement-=dn;
1328 }
1329 }
1330 nclbest = m_nclusters+nbest;
1331 }
1332
1333 F = -1;
1334 if (l<=0) l=1;
1335 bool cl = false;
1336 double Xn = 0.;
1337
1338 for (; l < L; ++l) {
1340
1341 if (Ei.cluster() && Ei.isNextClusterHoleB(cl,Xn)) {
1342 int nm = l+Ei.nclustersB();
1343 if (!cl) {
1344 if (Ei.dist() < -2. && Ei.ndist() > ndcut-1 ) continue;
1345 --nm;
1346 }
1347 if (nm < nclbest || (nm == nclbest && Xn > Xi2best)) continue;
1348 F=l; break;
1349 }
1350 }
1351
1352 if (F < 0 ) break;
1353 if (it!=itm) if (!m_elements[m_elementsMap[F]].addNextClusterB()) break;
1354 }
1355 if (it == itmax) --it;
1356 if (!nbest) return true;
1357
1358 m_nholes = hbest ;
1359 m_nHolesBefore = hbestb;
1360 m_nclusters += nbest ;
1361 m_ndf += ndfbest;
1362 m_firstElement = TE[0] ;
1363 m_elements[m_elementsMap[TE[0]]].setParametersB(PA);
1364
1365 int dn = L-1-lbest;
1366
1367 if (dn != 0) {
1368
1369 m_nElements -=dn;
1370 m_lastElement-=dn;
1371
1372 int n = m_firstElement;
1373 for (; n <= lbest ; ++n) m_elementsMap[n]=m_elementsMap[MPbest[n]];
1374 for (; n!= m_nElements; ++n) m_elementsMap[n]=m_elementsMap[n +dn ];
1375 }
1376
1377 if (itbest==it) return true;
1378
1379 for (int n = L-1-dn; n>=0; --n) {
1380
1382 int m = nbest-1;
1383 for (; m>=0; --m) if (TE[m]==n) break;
1384
1385 if (m>=0) {
1386 if (m_tools->useFastTracking()) {
1387 En.setClusterB(CL[m],XI2B[m]);
1388 En.setParametersB(PUB[m]);
1389 }
1390 else En.setCluster(CL[m]);
1391 if (--nbest==0) break;
1392 }
1393 else {
1394 if (m_tools->useFastTracking()) En.setClusterB( nullptr ,10000.);
1395 else En.setCluster( nullptr );
1396 }
1397 }
1398 return true;
1399}
1400
1402// Forward trajectory extension
1404
1405bool InDet::SiTrajectory_xk::forwardExtension(bool smoother,int itmax, const EventContext& ctx)
1406{
1407 const double pi2 = 2.*M_PI;
1408 const double pi = M_PI;
1409
1410 if (m_firstElement >= m_lastElement) return false;
1411
1413 int extensionStartIndex = m_lastElement;
1415 int lastElementOnTraj = m_nElements-1;
1416
1419 if (smoother) {
1420
1421 extensionStartIndex = m_firstElement;
1422
1425 if (m_elements[m_elementsMap[extensionStartIndex]].difference()) {
1428
1430 if (!m_elements[m_elementsMap[extensionStartIndex]].firstTrajectorElement(false)) return false;
1432 for (++extensionStartIndex; extensionStartIndex<=m_lastElement; ++extensionStartIndex) {
1433 InDet::SiTrajectoryElement_xk& previousElement = m_elements[m_elementsMap[extensionStartIndex-1]];
1434 InDet::SiTrajectoryElement_xk& thisElement = m_elements[m_elementsMap[extensionStartIndex ]];
1436 if (!thisElement.ForwardPropagationWithoutSearch(previousElement,ctx)) return false;
1437 }
1438 }
1441 else{
1442 bool diff = false;
1444 for (++extensionStartIndex; extensionStartIndex<=m_lastElement; ++extensionStartIndex) {
1445
1446 InDet::SiTrajectoryElement_xk& previousElement = m_elements[m_elementsMap[extensionStartIndex-1]];
1447 InDet::SiTrajectoryElement_xk& thisElement = m_elements[m_elementsMap[extensionStartIndex ]];
1450 if (!diff) {
1452 diff = thisElement.difference();
1454 if (diff) {
1456 if (!thisElement.addNextClusterF(previousElement,thisElement.cluster())) return false;
1457 }
1458 }
1460 else {
1462 if (!thisElement.ForwardPropagationWithoutSearch(previousElement,ctx)) return false;
1463 }
1464 }
1465 }
1466 --extensionStartIndex;
1467 }
1468
1470 if ( extensionStartIndex== lastElementOnTraj) return true;
1471
1472 // Search best forward trajectory prolongation
1475 int MP [300] ;
1476 int MPbest[300] ;
1478 int TE [100] ;
1480 const InDet::SiCluster* CL [100] ;
1481
1483 int maxholes = m_tools->maxholes () ;
1484 int maxdholes = m_tools->maxdholes() ;
1486 const int itm = itmax-1 ;
1488 int iteration = 0 ;
1490 int itbest = 0 ;
1492 int qbest =-100 ;
1494 int nbest = 0 ;
1495 int ndfbest = 0 ;
1497 int hbest = 0 ;
1499 int hbeste = 0 ;
1501 int ndbest = 0 ;
1503 int ndcut = 3 ;
1505 int nclbest = 0 ;
1507 int lbest = extensionStartIndex ;
1509 int index_currentElement = extensionStartIndex ;
1511 int M = extensionStartIndex ;
1513 MP [M] = extensionStartIndex ;
1514 double Xi2best = 0. ;
1516 const double dfmax = 2.2 ;
1517
1519 double f0 = m_elements[m_elementsMap[m_firstElement]].parametersUF().parameters()[2];
1520
1521
1522 m_elements[m_elementsMap[index_currentElement]].setNdist(0);
1523
1525 for (; iteration!=itmax; ++iteration) {
1526
1527 int lastElementWithSeenHit = index_currentElement;
1528 int lastElementWithExpHit = index_currentElement;
1530 int index_previousElement = index_currentElement;
1532 int mLastCluster = M;
1534 int Cm = nclbest-lastElementOnTraj;
1536 bool haveHole = false;
1537
1540 for (++index_currentElement; index_currentElement!=m_nElements; ++index_currentElement) {
1541
1543 InDet::SiTrajectoryElement_xk& prevElement = m_elements[m_elementsMap[index_previousElement]];
1544 InDet::SiTrajectoryElement_xk& currentElement = m_elements[m_elementsMap[index_currentElement ]];
1545
1547 if (!currentElement.ForwardPropagationWithSearch(prevElement, ctx)) {
1549
1551 if (!currentElement.isBarrel() || index_previousElement!=index_currentElement-1) break;
1552
1556 int index_auxElement = index_currentElement;
1557 for (; index_auxElement!=m_nElements; ++index_auxElement) {
1558 if (!m_elements[m_elementsMap[index_auxElement]].isBarrel() ) break;
1559 }
1561 if (index_auxElement==m_nElements) break;
1562
1566 index_currentElement = index_auxElement-1;
1567 continue;
1568 }
1569
1572 else {
1575 index_previousElement = index_currentElement;
1576 }
1578
1580 MP[++M] = index_currentElement;
1581
1583 if (currentElement.cluster()) {
1584 if (not m_tools->isITkGeometry()) {
1586 double df = std::abs(currentElement.parametersUF().parameters()[2]-f0);
1588 if (df > pi) df = pi2-df;
1590 if (df > dfmax) break;
1591 }
1593 lastElementWithExpHit = index_currentElement;
1594 lastElementWithSeenHit = index_currentElement;
1595 mLastCluster = M;
1596 haveHole = false;
1597 }
1598
1600 else if (currentElement.inside() < 0 ) {
1601 lastElementWithExpHit=index_currentElement;
1603 if (currentElement.nholesF() > maxholes || currentElement.dholesF() > maxdholes) break;
1604
1605 haveHole = true;
1606 if (not m_tools->isITkGeometry()) {
1608 double df = std::abs(currentElement.parametersPF().parameters()[2]-f0);
1609 if (df > pi) df = pi2-df;
1610 if (df > dfmax ) break;
1611 }
1612 }
1613
1615 else if (not m_tools->isITkGeometry()) {
1617 double df = std::abs(currentElement.parametersPF().parameters()[2]-f0);
1618 if (df > pi) df = pi2-df;
1619 if (df > dfmax) break;
1620 }
1623 int nm = currentElement.nclustersF()-index_currentElement;
1625 if ( currentElement.ndist() > ndcut
1626 || nm < Cm
1627 || (nm == Cm && currentElement.xi2totalF() > Xi2best)
1628 ) break;
1629 }
1630
1632
1634 int m = m_elementsMap[lastElementWithSeenHit];
1636 int nc = m_elements[m].nclustersF();
1638 int nh = m_elements[m].nholesF();
1640 m_nHolesAfter = m_elements[m_elementsMap[lastElementWithExpHit]].nholesF()-nh;
1641
1644 if (iteration==0 && nc==m_nclusters) return true;
1645
1647 int lastElementProcessed = index_currentElement;
1649 if (lastElementProcessed==m_nElements) --lastElementProcessed;
1650
1652 int nd = m_elements[m_elementsMap[lastElementProcessed]].ndist();
1655 int q = nc-nh;
1657 double X = m_elements[m].xi2totalF();
1659 if ( (q > qbest) || (q==qbest && X < Xi2best ) ) {
1661 qbest = q;
1663 nbest = 0;
1665 ndfbest = 0;
1667 hbest = nh;
1669 hbeste = m_elements[m_elementsMap[lastElementWithExpHit]].nholesF()-nh;
1671 itbest = iteration;
1674 lbest = extensionStartIndex ;
1676 Xi2best = X ;
1678 ndbest = nd;
1681 if (lastElementProcessed==lastElementOnTraj && nd < ndcut) ndcut = nd;
1682
1684 for (int j=extensionStartIndex+1; j<=mLastCluster; ++j) {
1686 int i = MP[j];
1689 if (Ei.inside() <= 0) {
1691 MPbest[++lbest] = i;
1693 if (Ei.cluster()) {
1695 CL[nbest] = Ei.cluster();
1696 TE[nbest++] = lbest;
1698 ndfbest += Ei.ndf();
1699 }
1700 }
1701 }
1703 nclbest = m_nclusters+nbest;
1706 if ( (nclbest >= 14 && !haveHole) || (lastElementProcessed==lastElementOnTraj && ndbest == 0)) break;
1707 }
1708
1710 index_currentElement = -1;
1712 bool cl = false;
1714 int nb = lastElementOnTraj-nclbest-1;
1716 double Xn;
1717
1723
1725 for (int j=mLastCluster; j!=extensionStartIndex; --j) {
1727 int i = MP[j];
1729
1731 if (i!=lastElementOnTraj && Ei.cluster() && Ei.isNextClusterHoleF(cl,Xn)) {
1732
1736 int nm = nb-i+Ei.nclustersF();
1737
1739 if (!cl) {
1742 if (Ei.dist() < -2. && Ei.ndist() > ndcut-1) continue;
1743 }
1745 else ++nm;
1746
1749 if (nm < 0 || (nm == 0 && Xn > Xi2best)) continue;
1751 index_currentElement = i;
1752 M = j;
1753 break;
1754 }
1755 }
1756
1758 if (index_currentElement < 0 ) break;
1761 if (iteration!=itm && !m_elements.at(m_elementsMap.at(index_currentElement)).addNextClusterF()) break;
1762 }
1763
1765 if (iteration == itmax) --iteration;
1766
1768 if (!nbest) return true;
1769
1771 m_nholes = hbest ;
1772 m_nHolesAfter = hbeste ;
1773 m_nclusters += nbest ;
1774 m_ndf += ndfbest ;
1775 m_lastElement = TE[nbest-1];
1777
1779 if (m_lastElement != MPbest[m_lastElement]) {
1781 for (int n = extensionStartIndex+1; n<=m_lastElement; ++n){
1782 m_elementsMap[n]=m_elementsMap[MPbest[n]];
1783 }
1784 }
1786 if (itbest==iteration) return true;
1787
1789 int mb = 0;
1791 index_currentElement = -1;
1792
1794 for (int n = extensionStartIndex+1; n!=m_nElements; ++n) {
1797
1798 int m = mb;
1800 for (; m!=nbest; ++m) if (TE[m]==n) break;
1802 if (m!=nbest) {
1804 if (CL[m]!=En.cluster()) {
1806 if (index_currentElement<0) {
1808 index_currentElement=n;
1812 }
1815 else {
1816 En.setCluster(CL[m]);
1817 }
1818 }
1820 if (++mb == nbest) break;
1821 }
1823 else {
1825 if (En.cluster()) {
1827 if (index_currentElement<0) {
1828 index_currentElement = n;
1830 En.addNextClusterF(m_elements[m_elementsMap[n-1]],nullptr);
1831 }
1834 else {
1836 En.setCluster(nullptr);
1837 }
1838 }
1839 }
1840 }
1841
1844 if (index_currentElement < 0 || m_lastElement == index_currentElement) {
1845 return true;
1846 }
1847
1850 for (++index_currentElement; index_currentElement<=m_lastElement; ++index_currentElement) {
1851 InDet::SiTrajectoryElement_xk& prevElement = m_elements[m_elementsMap[index_currentElement-1]];
1852 InDet::SiTrajectoryElement_xk& currentElement = m_elements[m_elementsMap[index_currentElement ]];
1853 if (!currentElement.ForwardPropagationWithoutSearch(prevElement, ctx)) return false;
1854 }
1856 return true;
1857}
1858
1860// Get clusters list from trajectory
1862
1864(std::vector<const InDet::SiCluster*>& Cl) const
1865{
1866 for (int i = m_firstElement; i<=m_lastElement; ++i) {
1867 int m = m_elementsMap[i];
1868 if (m_elements[m].cluster()) Cl.push_back(m_elements[m].cluster());
1869 }
1870}
1871
1873// Forward filter without search
1875
1876bool InDet::SiTrajectory_xk::forwardFilter(const EventContext& ctx)
1877{
1878 int L = m_firstElement;
1879
1880 if (!m_elements[m_elementsMap[L]].firstTrajectorElement(false)) return false;
1881
1882 for (++L; L<=m_lastElement; ++L) {
1883
1886 if (!Ef.ForwardPropagationWithoutSearch(El,ctx)) return false;
1887 }
1888 return true;
1889}
1890
1891
1893// Filter with precise clusters error
1895
1897{
1898 int L = m_firstElement;
1899 int I = 0 ;
1900
1901 if(!m_elements[m_elementsMap[L]].cluster()) return false;
1903
1904 for(++L; L<=m_lastElement; ++L) {
1905
1906 int K = m_elementsMap[L];
1907 if(m_elements[K].cluster() ||
1908 m_elements[K].clusterNoAdd() ||
1909 m_elements[K].inside() < 0 ) m_elementsMap[++I] = K;
1910 }
1911 m_firstElement = 0 ;
1912 m_lastElement = I ;
1913 m_nElements = I+1;
1914
1915 // Forward filter
1916 //
1917 L = 0;
1918
1919 // firstTrajectorElement with correction = true
1920 if(!m_elements[m_elementsMap[L]].firstTrajectorElement(true)) return false;
1921
1922 for(++L; L<=m_lastElement; ++L) {
1923
1926
1927 if(!Ef.ForwardPropagationWithoutSearchPreciseWithCorrection(El, ctx)) return false;
1928 }
1929
1930 // Backward smoother
1931 //
1932 if(!m_elements[m_elementsMap[m_lastElement]].lastTrajectorElementPrecise()) return false;
1933
1934 int m = m_lastElement-1;
1935 for(; m>=0; --m) {
1936
1939
1940 if(!Em.BackwardPropagationPrecise(En, ctx)) return false;
1941 }
1942
1943 return true;
1944}
1945
1946
1948// Test order of detector elements
1950
1952{
1953 int L = m_firstElement ;
1954 int n = m_elementsMap[L];
1955 double step = 0. ;
1956 bool order = true ;
1957
1958 for (++L; L<=m_lastElement; ++L) {
1959
1960 int m = m_elementsMap[L];
1961 if (!m_elements[m].cluster() &&
1962 !m_elements[m].clusterNoAdd() &&
1963 m_elements[m].inside()>=0) continue;
1964
1965 double stp = m_elements[m].step(m_elements[n]);
1966 if ( step == 0.) step = stp ;
1967 else if ((step*stp) < 0.) {order = false; break;}
1968 n = m;
1969 }
1970 if (order) return true;
1971
1972 L = m_firstElement ;
1973 n = m_elementsMap[L];
1974 Amg::Vector3D gp = m_elements[n].globalPosition();
1975 double rad = gp.x()*gp.x()+gp.y()*gp.y();
1976 for (++L; L<=m_lastElement; ++L) {
1977
1978 int m = m_elementsMap[L];
1979 if (!m_elements[m].cluster() &&
1980 !m_elements[m].clusterNoAdd() &&
1981 m_elements[m].inside()>=0) continue;
1982
1983 gp = m_elements[m].globalPosition();
1984 double R = gp.x()*gp.x()+gp.y()*gp.y();
1985 if (R < rad) return false;
1986 rad = R;
1987 n=m;
1988 }
1989 return true;
1990}
1991
1993// Sort of detector elements in step order
1995
1997{
1998 int L = m_firstElement;
1999 int LA = m_firstElement;
2000
2001 for (++L; L<=m_lastElement; ++L) {
2002
2003 int m = m_elementsMap[L];
2004 if (!m_elements[m].cluster() &&
2005 !m_elements[m].clusterNoAdd() &&
2006 m_elements[m].inside()>=0) continue;
2007
2008 m_elementsMap[++LA] = m;
2009 }
2010
2011 m_lastElement = LA;
2012 L = m_firstElement;
2013 m_nElements = LA+1;
2014
2015 bool nc = true;
2016 bool so = true;
2017 double ds = m_elements[m_elementsMap[LA]].step()-m_elements[m_elementsMap[L]].step();
2018
2019 if (ds > 0.) { // Sort in increase order
2020
2021 while(nc) {
2022 nc = false;
2023 int m = L, n = L+1;
2024 for (; n<=LA; ++n) {
2025
2026 int Mn = m_elementsMap[n];
2027 int Mm = m_elementsMap[m];
2028
2029 if (m_elements[Mn].step() < m_elements[Mm].step()) {
2030 if (m_elements[Mn].step(m_elements[Mm]) < 0.) {
2031 m_elementsMap[m] = Mn;
2032 m_elementsMap[n] = Mm;
2033 nc = true; so = false;
2034 }
2035 }
2036 ++m;
2037 }
2038 }
2039 }
2040 else {
2041
2042 while(nc) { // Sort in decrease order
2043 nc = false;
2044 int m = L, n = L+1;
2045 for (; n<=LA; ++n) {
2046
2047 int Mn = m_elementsMap[n];
2048 int Mm = m_elementsMap[m];
2049
2050 if (m_elements[Mn].step() > m_elements[Mm].step()) {
2051 if (m_elements[Mn].step(m_elements[Mm]) > 0.) {
2052 m_elementsMap[m] = Mn;
2053 m_elementsMap[n] = Mm;
2054 nc = true; so = false;
2055 }
2056 }
2057 ++m;
2058 }
2059 }
2060 }
2061 if (so) return;
2062
2063 // Search first detector elements with cluster
2064 //
2065 int n = L;
2066 for (; n<= LA; ++n) {
2067
2068 int e = m_elementsMap[n];
2069 if (m_elements[e].cluster()) break;
2070 if (m_elements[e].clusterNoAdd()) --m_nclustersNoAdd;
2071 else if (m_elements[e].inside() < 0 &&
2072 m_elements[e].detstatus()>=0) {--m_nholes; ++m_nHolesBefore;}
2073 }
2074
2075 // Search last detector elements with cluster
2076 //
2077 int m = LA;
2078 for (; m>=n ; --m) {
2079
2080 int e = m_elementsMap[m];
2081 if (m_elements[e].cluster()) break;
2082 if (m_elements[e].clusterNoAdd()) --m_nclustersNoAdd;
2083 else if (m_elements[e].inside() < 0 &&
2084 m_elements[e].detstatus()>=0) {--m_nholes; ++m_nHolesAfter;}
2085 }
2086 m_firstElement = n;
2087 m_lastElement = m;
2088
2089}
2090
2092// Test possibility for trajectory to jump through perigee
2094
2096{
2097 int i = m_firstElement;
2098 double St = m_elements[m_elementsMap[m_lastElement]].step()-m_elements[m_elementsMap[i]].step();
2099
2100 for (; i<=m_lastElement; ++i) {
2101 int m = m_elementsMap[i];
2102 if (m_elements[m].cluster() &&
2103 (m_elements[m].ndf()!=2 || (m_elements[m].stepToPerigee()*St) <= 0.)) break;
2104
2105 if (m_elements[m].cluster()){
2106 --m_nclusters;
2107 m_ndf -= m_elements[m].ndf();
2108 }
2109 else if (m_elements[m].clusterNoAdd()) --m_nclustersNoAdd;
2110 else --m_nholes ;
2111 }
2112
2113 if (i == m_firstElement) return false;
2114 m_firstElement = i;
2115 return true;
2116}
2117
2119// Trajectory quality without optimization
2121
2123{
2124 int holes = 0 ;
2125 double quality = 0.;
2126
2127 for (int i = m_firstElement; i<=m_lastElement; ++i) {
2128 quality+=m_elements[m_elementsMap[i]].quality(holes);
2129 }
2130 return quality;
2131}
2132
2134// Trajectory quality with otimization
2136
2138{
2139 int lE = m_firstElement;
2140 int h = 0 ;
2141 double q = 0 ;
2142 double qM = 0. ;
2143
2144 for (int i = m_firstElement; i<=m_lastElement; ++i) {
2145 int m = m_elementsMap[i];
2146 q+=m_elements[m].quality(h);
2147 if (m_elements[m].cluster() && q > qM) {
2148 qM = q;
2149 lE = i;
2150 }
2151 }
2152
2153 if (lE == m_firstElement) return -100;
2154
2155 int fE = lE;
2156 int nclustersNoAdd = 0 ;
2157 int nclusters = 0 ;
2158 int nholes = 0 ;
2159 int dholes = 0 ;
2160 int ndf = 0 ;
2161 h = 0 ;
2162 q = 0.;
2163 qM = 0.;
2164
2165 for (int i = lE; i>=m_firstElement; --i) {
2166
2167 int m = m_elementsMap[i];
2168 q+=m_elements[m].quality(h);
2169
2170 if (m_elements[m].cluster()) {
2171
2172 ++nclusters;
2173 ndf+=m_elements[m].ndf();
2174
2175 if (q > qM) {
2176 qM = q;
2177 fE = i;
2180 m_nholes = nholes ;
2181 m_dholes = dholes ;
2182 m_ndf = ndf ;
2183 }
2184
2185 }
2186 else if (m_elements[m].clusterNoAdd()) {
2188 }
2189 else if (m_elements[m].inside() < 0 && m_elements[m].detstatus() >=0) {
2190 ++nholes;
2191 if (h > dholes) dholes = h;
2192 }
2193 }
2194
2195 if (fE==lE || m_nclusters+m_nclustersNoAdd < m_tools->clustersmin()) return -100.;
2196 m_firstElement = fE;
2197 m_lastElement = lE;
2198 return qM;
2199}
2200
2202// Trajectory conversion to TrackStateOnSurface for next tracks
2204
2207{
2208 int i=0;
2209 for (; i!=m_ntos; ++i) {
2210 if (m_itos[i]+1 < m_elements[m_atos[i]].ntsos()) {++m_itos[i]; break;}
2211 m_itos[i] = 0;
2212 }
2213 if (i==m_ntos) {
2214 return Trk::TrackStates();
2215 }
2216
2217 auto dtsos = Trk::TrackStates();
2218
2219 for (i=0; i!=m_ntos; ++i) {
2220
2221 Trk::TrackStateOnSurface* tsos = m_elements[m_atos[i]].tsos(m_itos[i]);
2222 if (tsos) dtsos.push_back(tsos);
2223 }
2224 return dtsos;
2225}
2226
2228// pT of the first elementtrajectory
2230
2232{
2233 int n = m_firstElement ; if (n <0 || n>=300) return 0.;
2234 n = m_elementsMap[n]; if (n <0 || n>=300) return 0.;
2235 int s = m_elements[n].status();
2236 if (s<=1) return 0.;
2237 return m_elements[n].parametersUB().momentum().perp();
2238}
2239
2242
2245
2247 bool prevIsSctHole = false;
2248
2250
2251 for (int theEle = m_firstElement+1; theEle<m_lastElement; ++theEle) {
2253 int m = m_elementsMap[theEle];
2254 InDet::SiTrajectoryElement_xk & theElement = m_elements[m];
2256 bool isPix = theElement.ndf() == 2;
2257 bool isSCTHole=false;
2258
2261 if (theElement.cluster() || theElement.clusterNoAdd()) {
2262 prevIsSctHole = false;
2263 continue;
2264 }
2265
2267 else {
2268 std::unique_ptr<const Trk::TrackParameters> pars {theElement.trackParameters(true,0)};
2269 Trk::BoundaryCheckResult boundaryStatus = m_tools->boundaryCheckTool()->boundaryCheck(*pars);
2270 switch (boundaryStatus){
2274 if (isPix) {
2275 ++m_patternHoleOutcome.nPixelHoles;
2276 }
2277 else {
2278 ++m_patternHoleOutcome.nSCTHoles;
2279 isSCTHole=true;
2280 }
2281 break;
2288 break;
2291 if (isPix){
2292 ++m_patternHoleOutcome.nPixelDeads;
2293 }
2294 else{
2295 ++m_patternHoleOutcome.nSCTDeads;
2296 }
2297 break;
2298 }
2299 }
2300
2303 if (isSCTHole && prevIsSctHole){
2304 prevIsSctHole = false;
2305 ++m_patternHoleOutcome.nSCTDoubleHoles;
2306 }
2307 else {
2308 prevIsSctHole = isSCTHole;
2309 }
2310 }
2311 if (m_patternHoleOutcome.nPixelHoles+m_patternHoleOutcome.nSCTHoles > m_tools->maxholes()
2312 || m_patternHoleOutcome.nSCTDoubleHoles > m_tools->maxdholes()){
2313 m_patternHoleOutcome.passPatternHoleCut = false;
2314 }
2315}
const std::regex re(r_e)
#define M_PI
static Double_t Tp(Double_t *t, Double_t *par)
#define F(x, y, z)
Definition MD5.cxx:112
#define I(x, y, z)
Definition MD5.cxx:116
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
Definition Jet.cxx:631
@ cosmic
struct TBPatternUnitContext S2
struct TBPatternUnitContext S1
#define pi
#define x
#define z
Header file for AthHistogramAlgorithm.
This is a "hash" representation of an Identifier.
Class to hold geometrical description of a silicon detector element.
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
Trk::Surface & surface()
Element Surface.
bool ForwardPropagationWithSearch(SiTrajectoryElement_xk &, const EventContext &)
const Trk::PatternTrackParameters & parametersUF() const
updated
bool BackwardPropagationFilter(SiTrajectoryElement_xk &, const EventContext &ctx)
bool BackwardPropagationSmoother(SiTrajectoryElement_xk &, bool, const EventContext &ctx)
std::unique_ptr< Trk::TrackParameters > trackParameters(bool, int)
bool ForwardPropagationWithoutSearch(SiTrajectoryElement_xk &, const EventContext &)
const InDet::SiCluster * clusterOld() const
const Trk::PatternTrackParameters & parametersUB() const
observed
const InDet::SiCluster * cluster() const
void setCluster(const InDet::SiCluster *)
const InDet::SiCluster * clusterNoAdd() const
void setParametersB(Trk::PatternTrackParameters &)
bool ForwardPropagationWithoutSearchPreciseWithCorrection(SiTrajectoryElement_xk &, const EventContext &)
void setClusterB(const InDet::SiCluster *, double)
bool BackwardPropagationPrecise(SiTrajectoryElement_xk &, const EventContext &ctx)
const Trk::PatternTrackParameters & parametersPF() const
track parameters for forward filter / smoother predicted
const int & ndist() const
number of crossed without hit - dead + holes
bool isNextClusterHoleF(bool &, double &)
checks if removing this cluster from the forward propagation would result in a critical number of hol...
bool difference() const
check for a difference between forward and back propagation
void updateHoleSearchResult()
Helper method to determine the hole search outcome for use in the later reco.
Trk::TrackStates convertToSimpleTrackStateOnSurface(const EventContext &ctx)
std::array< SiTrajectoryElement_xk, 300 > m_elements
PatternHoleSearchOutcome m_patternHoleOutcome
int m_nclustersNoAdd
Number of clusters on trajectory.
bool globalPositionsToClusters(const PixelClusterContainer *, const SCT_ClusterContainer *, const std::vector< Amg::Vector3D > &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, std::multimap< const Trk::PrepRawData *, const Trk::Track * > &, std::vector< const InDet::SiCluster * > &)
bool backwardExtension(int, const EventContext &)
bool initialize(bool, bool, const PixelClusterContainer *, const SCT_ClusterContainer *, const Trk::TrackParameters &, std::vector< const InDet::SiCluster * > &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, bool &, const EventContext &)
bool isNewTrack(std::multimap< const Trk::PrepRawData *, const Trk::Track * > &) const
bool forwardExtension(bool, int, const EventContext &)
Trk::TrackStates convertToNextTrackStateOnSurface()
double pTseed(const Trk::TrackParameters &, std::vector< const InDet::SiCluster * > &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, const EventContext &)
const int & nholes() const
std::unique_ptr< const Trk::Surface > m_surfacedead
const InDet::SiTools_xk * m_tools
Trajectory elements on this trajectory.
int m_nElements
count active elements
const int & difference() const
Trk::TrackStates convertToTrackStateOnSurface(const EventContext &ctx)
std::ostream & dump(std::ostream &out) const
bool forwardFilter(const EventContext &)
Trk::TrackStates convertToTrackStateOnSurfaceWithNewDirection(const EventContext &ctx)
const int & nclustersNoAdd() const
Trk::TrackStates convertToSimpleTrackStateOnSurfaceWithNewDirection()
Trk::TrackStates convertToSimpleTrackStateOnSurfaceForDisTrackTrigger(const EventContext &ctx)
void getClusters(std::vector< const InDet::SiCluster * > &) const
int m_nclusters
index of the last element where we have
void setTools(const InDet::SiTools_xk *)
Trk::TrackStates convertToSimpleTrackStateOnSurface(int, const EventContext &ctx)
const int & ndf() const
const int & nclusters() const
bool backwardSmoother(bool, const EventContext &)
bool trackParametersToClusters(const PixelClusterContainer *, const SCT_ClusterContainer *, const Trk::TrackParameters &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, std::multimap< const Trk::PrepRawData *, const Trk::Track * > &, std::vector< const InDet::SiCluster * > &, const EventContext &ctx)
std::array< int, 300 > m_elementsMap
int m_lastElement
index of the first element where we have
bool filterWithPreciseClustersError(const EventContext &)
std::unique_ptr< Trk::FitQuality > convertToFitQuality() const
const int & dholes() const
Class for a planaer rectangular or trapezoidal surface in the ATLAS detector.
Abstract Base Class for tracking surfaces.
Definition Surface.h:79
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
const Amg::Vector3D & center() const
Returns the center position of the Surface.
represents the track state (measurement, material, fit parameters and quality) at a surface.
STL class.
STL class.
int r
Definition globals.cxx:22
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
DataVector< const Trk::TrackStateOnSurface > TrackStates
@ OnEdge
within the sensitive area of an active element
@ DeadElement
outside the element
@ Insensitive
close to the edge of an active element
@ Outside
with the insensitive area of an active element
@ Error
within the nominally active area of a dead element
ParametersBase< TrackParametersDim, Charged > TrackParameters
Helper struct for hole search results from the pattern recognition.