ATLAS Offline Software
Loading...
Searching...
No Matches
SiTrajectory_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
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
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);
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);
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);
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);
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);
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);
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
1073 Tp.setParametersWithCovariance(su,pv,cv);
1074
1075 if (!sct) m_elements[0].CloseClusterSeach(Tp, (*iter_boundaryLink), pib, pie);
1076 else m_elements[0].CloseClusterSeach(Tp, (*iter_boundaryLink), sib, sie);
1077 const InDet::SiCluster* c = m_elements[0].cluster();
1078 if (!c || m_elements[0].xi2F() > xi2Cut) continue;
1079 if (sct) {
1080 t = PT.find(c);
1081 if (t!=te && (*t).second->measurementsOnTrack()->size() >= 10) continue;
1082 }
1083 sct ? m_ndf+=1 : m_ndf+=2;
1084 lSiCluster.push_back(c);
1085 }
1086 }
1087 return m_ndf >= 6;
1088}
1089
1091// Backward test initial trajectory
1093
1094bool InDet::SiTrajectory_xk::backwardSmoother(bool TWO, const EventContext& ctx)
1095{
1096 if (m_firstElement >= m_lastElement) return false;
1097
1098 // Trajectory difference test
1099 //
1100 int m = m_lastElement;
1101 for (; m>=m_firstElement; --m) {
1102 if (m_elements[m_elementsMap[m]].difference()) break;
1103 }
1104 if (m < m_firstElement) return true;
1105
1106 if (!m_elements[m_elementsMap[m_lastElement]].lastTrajectorElement()) return false;
1107
1108 int firstElement = m_lastElement ;
1109 int maxholes = m_tools->maxholes ();
1110 int maxdholes = m_tools->maxdholes();
1111 m_nclustersNoAdd = 0 ;
1112 m_difference = 0 ;
1113
1114 m = m_lastElement-1;
1115 int n = m ;
1116
1117 for (; m>=m_firstElement; --m) {
1118
1121
1122 if (!Em.BackwardPropagationSmoother(En,TWO,ctx)) {
1123
1124 if (m == m_firstElement) break;
1125
1126 for (int i=m+1; i!=m_nElements; ++i) m_elementsMap[i-1] = m_elementsMap[i];
1127 --m_lastElement;
1128 --m_nElements;
1129 --firstElement;
1130 continue;
1131 }
1132
1133 if ((Em.cluster() && Em.clusterOld()) && (Em.cluster()!=Em.clusterOld())) ++m_difference;
1134
1135 if (Em.cluster()) {
1136 firstElement = m;
1137 }
1138 else {
1139 n=m;
1140 if (Em.clusterNoAdd()) ++m_nclustersNoAdd;
1141 if (Em.nholesB() > maxholes || Em.dholesB() > maxdholes) {
1142 ++m_difference; break;
1143 }
1144 }
1145 }
1146
1147 m_firstElement = firstElement ;
1148 m = m_elementsMap[firstElement] ;
1149 n = m_elementsMap[ n ] ;
1150 m_nclusters = m_elements[m].nclustersB() ;
1151 m_nholes = m_elements[m].nholesB () ;
1152 m_nHolesBefore = m_elements[n].nholesB ()-m_nholes;
1153 m_ndf = m_elements[m].ndfB() ;
1154 if (m_ndf < m_ndfcut) return false;
1155
1156 // Erase trajectory elements with big distance from the track
1157 //
1158 m = firstElement+1;
1159 n = m;
1160 for (; m!=m_lastElement; ++m) {
1161
1163 if (Em.inside() > 0) {
1164 if (Em.detstatus() > 0) --m_nActiveElements;
1165 }
1166 else {
1167 m_elementsMap[n++] = m_elementsMap[m];
1168 }
1169 }
1170 m_lastElement = n;
1171
1172 // Test number trajector elemenst with clusters
1173 //
1174 if (m_nActiveElements < m_tools->clustersmin() && m_nholes+m_nHolesAfter) return false;
1175 if (n!=m) {
1176 for (; m!=m_nElements; ++m) m_elementsMap[n++] = m_elementsMap[m];
1177 m_nElements = n;
1178 }
1179 return true;
1180}
1181
1183// Backward trajectory extension
1185
1186bool InDet::SiTrajectory_xk::backwardExtension(int itmax, const EventContext& ctx)
1187{
1188 if (m_firstElement >= m_lastElement) return false;
1189 int L = m_firstElement;
1190 if (L==0) return true;
1191
1192 int MPbest[300] ;
1193 int TE [100] ;
1194 const InDet::SiCluster* CL [100] ;
1195 double XI2B [100] ;
1198
1199 int maxholes = m_tools->maxholes ();
1200 int maxdholes = m_tools->maxdholes();
1201 const int itm = itmax-1 ;
1202 int it = 0 ;
1203 int itbest = 0 ;
1204 int qbest =-100 ;
1205 int nbest = 0 ;
1206 int ndfbest = 0 ;
1207 int lbest = L ;
1208 int hbest = 0 ;
1209 int hbestb = 0 ;
1210 int nclbest = 0 ;
1211 int ndcut = 3 ;
1212 int F = L ;
1213 double Xi2best = 0. ;
1214
1215 m_elements[m_elementsMap[F]].setNdist(0);
1216
1217 for (; it!=itmax; ++it) {
1218
1219 int l = F;
1220 int lastElementWithExpHit = F;
1221
1222 for (--F; F>=0; --F) {
1223
1226
1227 if (!Ef.BackwardPropagationFilter(El, ctx)) break;
1228
1229 if (Ef.cluster()) {
1230 lastElementWithExpHit = F;
1231 l = F;
1232 }
1233 else if (Ef.inside() < 0) {
1234 lastElementWithExpHit = F;
1235 if (Ef.nholesB() > maxholes || Ef.dholesB() > maxdholes) break;
1236 }
1237
1238 int nm = Ef.nclustersB()+F;
1239 if (Ef.ndist() > ndcut ||
1240 nm < nclbest ||
1241 (nm == nclbest && Ef.xi2totalB() > Xi2best) ) break;
1242 }
1243
1244 int fl = F;
1245 if (fl<0) fl = 0;
1246
1247 int m = m_elementsMap[l];
1248 int nc = m_elements[m].nclustersB();
1249
1250 if (it==0 && nc==m_nclusters) return true;
1251
1252 int np = m_elements[m].npixelsB();
1253 int nh = m_elements[m].nholesB();
1254 int nd = m_elements[m_elementsMap[fl]].ndist();
1255 int q = nc-nh;
1256 double X = m_elements[m].xi2totalB();
1257
1258 if ( (q > qbest) || (q==qbest && X < Xi2best ) ) {
1259
1260 qbest = q ;
1261 nbest = 0 ;
1262 ndfbest = 0 ;
1263 hbest = nh ;
1264 hbestb = m_elements[m_elementsMap[lastElementWithExpHit]].nholesB()-nh ;
1265 itbest = it ;
1266 Xi2best = X ;
1267 PA = m_elements[m_elementsMap[l]].parametersUB();
1268
1269 if (fl==0 && nd < ndcut) ndcut = nd;
1270
1271 if (fl!=0 || nd > 0 || np < 3) {
1272
1273 lbest = l-1;
1274 for (int i=l; i!=L; ++i) {
1275
1277
1278 if (Ei.inside() <= 0 ) {
1279 MPbest[++lbest] = i;
1280 if (Ei.cluster()) {
1281 CL[nbest] = Ei.cluster();
1282 XI2B[nbest] = Ei.xi2B();
1283 PUB[nbest] = Ei.parametersUB();
1284 TE[nbest++] = lbest;
1285 ndfbest += Ei.ndf();
1286 }
1287 }
1288 }
1289 }
1290 else {
1291
1292 l = -1;
1293 lbest = fl-1;
1294 for (int i=fl; i!=L; ++i) {
1295
1297
1298 if (Ei.inside() <= 0 && ++lbest >=0 ) {
1299 MPbest[lbest] = lbest;
1300 if (Ei.cluster()) {
1301 CL[nbest] = Ei.cluster();
1302 XI2B[nbest] = Ei.xi2B();
1303 PUB[nbest] = Ei.parametersUB();
1304 TE[nbest++] = lbest;
1305 ndfbest += Ei.ndf();
1306 if (l<0) l=lbest;
1307 }
1308 m_elementsMap[lbest] = m_elementsMap[i];
1309 }
1310
1311 }
1312
1313 int dn = L-1-lbest;
1314
1315 if (dn!=0) {
1316
1317 for (int i=L; i!= m_nElements; ++i) {
1319 }
1320
1321 L -=dn;
1322 m_nElements -=dn;
1323 m_lastElement-=dn;
1324 }
1325 }
1326 nclbest = m_nclusters+nbest;
1327 }
1328
1329 F = -1;
1330 if (l<=0) l=1;
1331 bool cl = false;
1332 double Xn = 0.;
1333
1334 for (; l < L; ++l) {
1336
1337 if (Ei.cluster() && Ei.isNextClusterHoleB(cl,Xn)) {
1338 int nm = l+Ei.nclustersB();
1339 if (!cl) {
1340 if (Ei.dist() < -2. && Ei.ndist() > ndcut-1 ) continue;
1341 --nm;
1342 }
1343 if (nm < nclbest || (nm == nclbest && Xn > Xi2best)) continue;
1344 F=l; break;
1345 }
1346 }
1347
1348 if (F < 0 ) break;
1349 if (it!=itm) if (!m_elements[m_elementsMap[F]].addNextClusterB()) break;
1350 }
1351 if (it == itmax) --it;
1352 if (!nbest) return true;
1353
1354 m_nholes = hbest ;
1355 m_nHolesBefore = hbestb;
1356 m_nclusters += nbest ;
1357 m_ndf += ndfbest;
1358 m_firstElement = TE[0] ;
1359 m_elements[m_elementsMap[TE[0]]].setParametersB(PA);
1360
1361 int dn = L-1-lbest;
1362
1363 if (dn != 0) {
1364
1365 m_nElements -=dn;
1366 m_lastElement-=dn;
1367
1368 int n = m_firstElement;
1369 for (; n <= lbest ; ++n) m_elementsMap[n]=m_elementsMap[MPbest[n]];
1370 for (; n!= m_nElements; ++n) m_elementsMap[n]=m_elementsMap[n +dn ];
1371 }
1372
1373 if (itbest==it) return true;
1374
1375 for (int n = L-1-dn; n>=0; --n) {
1376
1378 int m = nbest-1;
1379 for (; m>=0; --m) if (TE[m]==n) break;
1380
1381 if (m>=0) {
1382 if (m_tools->useFastTracking()) {
1383 En.setClusterB(CL[m],XI2B[m]);
1384 En.setParametersB(PUB[m]);
1385 }
1386 else En.setCluster(CL[m]);
1387 if (--nbest==0) break;
1388 }
1389 else {
1390 if (m_tools->useFastTracking()) En.setClusterB( nullptr ,10000.);
1391 else En.setCluster( nullptr );
1392 }
1393 }
1394 return true;
1395}
1396
1398// Forward trajectory extension
1400
1401bool InDet::SiTrajectory_xk::forwardExtension(bool smoother,int itmax, const EventContext& ctx)
1402{
1403 const double pi2 = 2.*M_PI;
1404 const double pi = M_PI;
1405
1406 if (m_firstElement >= m_lastElement) return false;
1407
1409 int extensionStartIndex = m_lastElement;
1411 int lastElementOnTraj = m_nElements-1;
1412
1415 if (smoother) {
1416
1417 extensionStartIndex = m_firstElement;
1418
1421 if (m_elements[m_elementsMap[extensionStartIndex]].difference()) {
1424
1426 if (!m_elements[m_elementsMap[extensionStartIndex]].firstTrajectorElement(false)) return false;
1428 for (++extensionStartIndex; extensionStartIndex<=m_lastElement; ++extensionStartIndex) {
1429 InDet::SiTrajectoryElement_xk& previousElement = m_elements[m_elementsMap[extensionStartIndex-1]];
1430 InDet::SiTrajectoryElement_xk& thisElement = m_elements[m_elementsMap[extensionStartIndex ]];
1432 if (!thisElement.ForwardPropagationWithoutSearch(previousElement,ctx)) return false;
1433 }
1434 }
1437 else{
1438 bool diff = false;
1440 for (++extensionStartIndex; extensionStartIndex<=m_lastElement; ++extensionStartIndex) {
1441
1442 InDet::SiTrajectoryElement_xk& previousElement = m_elements[m_elementsMap[extensionStartIndex-1]];
1443 InDet::SiTrajectoryElement_xk& thisElement = m_elements[m_elementsMap[extensionStartIndex ]];
1446 if (!diff) {
1448 diff = thisElement.difference();
1450 if (diff) {
1452 if (!thisElement.addNextClusterF(previousElement,thisElement.cluster())) return false;
1453 }
1454 }
1456 else {
1458 if (!thisElement.ForwardPropagationWithoutSearch(previousElement,ctx)) return false;
1459 }
1460 }
1461 }
1462 --extensionStartIndex;
1463 }
1464
1466 if ( extensionStartIndex== lastElementOnTraj) return true;
1467
1468 // Search best forward trajectory prolongation
1471 int MP [300] ;
1472 int MPbest[300] ;
1474 int TE [100] ;
1476 const InDet::SiCluster* CL [100] ;
1477
1479 int maxholes = m_tools->maxholes () ;
1480 int maxdholes = m_tools->maxdholes() ;
1482 const int itm = itmax-1 ;
1484 int iteration = 0 ;
1486 int itbest = 0 ;
1488 int qbest =-100 ;
1490 int nbest = 0 ;
1491 int ndfbest = 0 ;
1493 int hbest = 0 ;
1495 int hbeste = 0 ;
1497 int ndbest = 0 ;
1499 int ndcut = 3 ;
1501 int nclbest = 0 ;
1503 int lbest = extensionStartIndex ;
1505 int index_currentElement = extensionStartIndex ;
1507 int M = extensionStartIndex ;
1509 MP [M] = extensionStartIndex ;
1510 double Xi2best = 0. ;
1512 const double dfmax = 2.2 ;
1513
1515 double f0 = m_elements[m_elementsMap[m_firstElement]].parametersUF().parameters()[2];
1516
1517
1518 m_elements[m_elementsMap[index_currentElement]].setNdist(0);
1519
1521 for (; iteration!=itmax; ++iteration) {
1522
1523 int lastElementWithSeenHit = index_currentElement;
1524 int lastElementWithExpHit = index_currentElement;
1526 int index_previousElement = index_currentElement;
1528 int mLastCluster = M;
1530 int Cm = nclbest-lastElementOnTraj;
1532 bool haveHole = false;
1533
1536 for (++index_currentElement; index_currentElement!=m_nElements; ++index_currentElement) {
1537
1539 InDet::SiTrajectoryElement_xk& prevElement = m_elements[m_elementsMap[index_previousElement]];
1540 InDet::SiTrajectoryElement_xk& currentElement = m_elements[m_elementsMap[index_currentElement ]];
1541
1543 if (!currentElement.ForwardPropagationWithSearch(prevElement, ctx)) {
1545
1547 if (!currentElement.isBarrel() || index_previousElement!=index_currentElement-1) break;
1548
1552 int index_auxElement = index_currentElement;
1553 for (; index_auxElement!=m_nElements; ++index_auxElement) {
1554 if (!m_elements[m_elementsMap[index_auxElement]].isBarrel() ) break;
1555 }
1557 if (index_auxElement==m_nElements) break;
1558
1562 index_currentElement = index_auxElement-1;
1563 continue;
1564 }
1565
1568 else {
1571 index_previousElement = index_currentElement;
1572 }
1574
1576 MP[++M] = index_currentElement;
1577
1579 if (currentElement.cluster()) {
1580 if (not m_tools->isITkGeometry()) {
1582 double df = std::abs(currentElement.parametersUF().parameters()[2]-f0);
1584 if (df > pi) df = pi2-df;
1586 if (df > dfmax) break;
1587 }
1589 lastElementWithExpHit = index_currentElement;
1590 lastElementWithSeenHit = index_currentElement;
1591 mLastCluster = M;
1592 haveHole = false;
1593 }
1594
1596 else if (currentElement.inside() < 0 ) {
1597 lastElementWithExpHit=index_currentElement;
1599 if (currentElement.nholesF() > maxholes || currentElement.dholesF() > maxdholes) break;
1600
1601 haveHole = true;
1602 if (not m_tools->isITkGeometry()) {
1604 double df = std::abs(currentElement.parametersPF().parameters()[2]-f0);
1605 if (df > pi) df = pi2-df;
1606 if (df > dfmax ) break;
1607 }
1608 }
1609
1611 else if (not m_tools->isITkGeometry()) {
1613 double df = std::abs(currentElement.parametersPF().parameters()[2]-f0);
1614 if (df > pi) df = pi2-df;
1615 if (df > dfmax) break;
1616 }
1619 int nm = currentElement.nclustersF()-index_currentElement;
1621 if ( currentElement.ndist() > ndcut
1622 || nm < Cm
1623 || (nm == Cm && currentElement.xi2totalF() > Xi2best)
1624 ) break;
1625 }
1626
1628
1630 int m = m_elementsMap[lastElementWithSeenHit];
1632 int nc = m_elements[m].nclustersF();
1634 int nh = m_elements[m].nholesF();
1636 m_nHolesAfter = m_elements[m_elementsMap[lastElementWithExpHit]].nholesF()-nh;
1637
1640 if (iteration==0 && nc==m_nclusters) return true;
1641
1643 int lastElementProcessed = index_currentElement;
1645 if (lastElementProcessed==m_nElements) --lastElementProcessed;
1646
1648 int nd = m_elements[m_elementsMap[lastElementProcessed]].ndist();
1651 int q = nc-nh;
1653 double X = m_elements[m].xi2totalF();
1655 if ( (q > qbest) || (q==qbest && X < Xi2best ) ) {
1657 qbest = q;
1659 nbest = 0;
1661 ndfbest = 0;
1663 hbest = nh;
1665 hbeste = m_elements[m_elementsMap[lastElementWithExpHit]].nholesF()-nh;
1667 itbest = iteration;
1670 lbest = extensionStartIndex ;
1672 Xi2best = X ;
1674 ndbest = nd;
1677 if (lastElementProcessed==lastElementOnTraj && nd < ndcut) ndcut = nd;
1678
1680 for (int j=extensionStartIndex+1; j<=mLastCluster; ++j) {
1682 int i = MP[j];
1685 if (Ei.inside() <= 0) {
1687 MPbest[++lbest] = i;
1689 if (Ei.cluster()) {
1691 CL[nbest] = Ei.cluster();
1692 TE[nbest++] = lbest;
1694 ndfbest += Ei.ndf();
1695 }
1696 }
1697 }
1699 nclbest = m_nclusters+nbest;
1702 if ( (nclbest >= 14 && !haveHole) || (lastElementProcessed==lastElementOnTraj && ndbest == 0)) break;
1703 }
1704
1706 index_currentElement = -1;
1708 bool cl = false;
1710 int nb = lastElementOnTraj-nclbest-1;
1712 double Xn;
1713
1719
1721 for (int j=mLastCluster; j!=extensionStartIndex; --j) {
1723 int i = MP[j];
1725
1727 if (i!=lastElementOnTraj && Ei.cluster() && Ei.isNextClusterHoleF(cl,Xn)) {
1728
1732 int nm = nb-i+Ei.nclustersF();
1733
1735 if (!cl) {
1738 if (Ei.dist() < -2. && Ei.ndist() > ndcut-1) continue;
1739 }
1741 else ++nm;
1742
1745 if (nm < 0 || (nm == 0 && Xn > Xi2best)) continue;
1747 index_currentElement = i;
1748 M = j;
1749 break;
1750 }
1751 }
1752
1754 if (index_currentElement < 0 ) break;
1757 if (iteration!=itm && !m_elements[m_elementsMap[index_currentElement]].addNextClusterF()) break;
1758 }
1759
1761 if (iteration == itmax) --iteration;
1762
1764 if (!nbest) return true;
1765
1767 m_nholes = hbest ;
1768 m_nHolesAfter = hbeste ;
1769 m_nclusters += nbest ;
1770 m_ndf += ndfbest ;
1771 m_lastElement = TE[nbest-1];
1773
1775 if (m_lastElement != MPbest[m_lastElement]) {
1777 for (int n = extensionStartIndex+1; n<=m_lastElement; ++n){
1778 m_elementsMap[n]=m_elementsMap[MPbest[n]];
1779 }
1780 }
1782 if (itbest==iteration) return true;
1783
1785 int mb = 0;
1787 index_currentElement = -1;
1788
1790 for (int n = extensionStartIndex+1; n!=m_nElements; ++n) {
1793
1794 int m = mb;
1796 for (; m!=nbest; ++m) if (TE[m]==n) break;
1798 if (m!=nbest) {
1800 if (CL[m]!=En.cluster()) {
1802 if (index_currentElement<0) {
1804 index_currentElement=n;
1808 }
1811 else {
1812 En.setCluster(CL[m]);
1813 }
1814 }
1816 if (++mb == nbest) break;
1817 }
1819 else {
1821 if (En.cluster()) {
1823 if (index_currentElement<0) {
1824 index_currentElement = n;
1826 En.addNextClusterF(m_elements[m_elementsMap[n-1]],nullptr);
1827 }
1830 else {
1832 En.setCluster(nullptr);
1833 }
1834 }
1835 }
1836 }
1837
1840 if (index_currentElement < 0 || m_lastElement == index_currentElement) {
1841 return true;
1842 }
1843
1846 for (++index_currentElement; index_currentElement<=m_lastElement; ++index_currentElement) {
1847 InDet::SiTrajectoryElement_xk& prevElement = m_elements[m_elementsMap[index_currentElement-1]];
1848 InDet::SiTrajectoryElement_xk& currentElement = m_elements[m_elementsMap[index_currentElement ]];
1849 if (!currentElement.ForwardPropagationWithoutSearch(prevElement, ctx)) return false;
1850 }
1852 return true;
1853}
1854
1856// Get clusters list from trajectory
1858
1860(std::vector<const InDet::SiCluster*>& Cl) const
1861{
1862 for (int i = m_firstElement; i<=m_lastElement; ++i) {
1863 int m = m_elementsMap[i];
1864 if (m_elements[m].cluster()) Cl.push_back(m_elements[m].cluster());
1865 }
1866}
1867
1869// Forward filter without search
1871
1872bool InDet::SiTrajectory_xk::forwardFilter(const EventContext& ctx)
1873{
1874 int L = m_firstElement;
1875
1876 if (!m_elements[m_elementsMap[L]].firstTrajectorElement(false)) return false;
1877
1878 for (++L; L<=m_lastElement; ++L) {
1879
1882 if (!Ef.ForwardPropagationWithoutSearch(El,ctx)) return false;
1883 }
1884 return true;
1885}
1886
1887
1889// Filter with precise clusters error
1891
1893{
1894 int L = m_firstElement;
1895 int I = 0 ;
1896
1897 if(!m_elements[m_elementsMap[L]].cluster()) return false;
1899
1900 for(++L; L<=m_lastElement; ++L) {
1901
1902 int K = m_elementsMap[L];
1903 if(m_elements[K].cluster() ||
1904 m_elements[K].clusterNoAdd() ||
1905 m_elements[K].inside() < 0 ) m_elementsMap[++I] = K;
1906 }
1907 m_firstElement = 0 ;
1908 m_lastElement = I ;
1909 m_nElements = I+1;
1910
1911 // Forward filter
1912 //
1913 L = 0;
1914
1915 // firstTrajectorElement with correction = true
1916 if(!m_elements[m_elementsMap[L]].firstTrajectorElement(true)) return false;
1917
1918 for(++L; L<=m_lastElement; ++L) {
1919
1922
1923 if(!Ef.ForwardPropagationWithoutSearchPreciseWithCorrection(El, ctx)) return false;
1924 }
1925
1926 // Backward smoother
1927 //
1928 if(!m_elements[m_elementsMap[m_lastElement]].lastTrajectorElementPrecise()) return false;
1929
1930 int m = m_lastElement-1;
1931 for(; m>=0; --m) {
1932
1935
1936 if(!Em.BackwardPropagationPrecise(En, ctx)) return false;
1937 }
1938
1939 return true;
1940}
1941
1942
1944// Test order of detector elements
1946
1948{
1949 int L = m_firstElement ;
1950 int n = m_elementsMap[L];
1951 double step = 0. ;
1952 bool order = true ;
1953
1954 for (++L; L<=m_lastElement; ++L) {
1955
1956 int m = m_elementsMap[L];
1957 if (!m_elements[m].cluster() &&
1958 !m_elements[m].clusterNoAdd() &&
1959 m_elements[m].inside()>=0) continue;
1960
1961 double stp = m_elements[m].step(m_elements[n]);
1962 if ( step == 0.) step = stp ;
1963 else if ((step*stp) < 0.) {order = false; break;}
1964 n = m;
1965 }
1966 if (order) return true;
1967
1968 L = m_firstElement ;
1969 n = m_elementsMap[L];
1970 Amg::Vector3D gp = m_elements[n].globalPosition();
1971 double rad = gp.x()*gp.x()+gp.y()*gp.y();
1972 for (++L; L<=m_lastElement; ++L) {
1973
1974 int m = m_elementsMap[L];
1975 if (!m_elements[m].cluster() &&
1976 !m_elements[m].clusterNoAdd() &&
1977 m_elements[m].inside()>=0) continue;
1978
1979 gp = m_elements[m].globalPosition();
1980 double R = gp.x()*gp.x()+gp.y()*gp.y();
1981 if (R < rad) return false;
1982 rad = R;
1983 n=m;
1984 }
1985 return true;
1986}
1987
1989// Sort of detector elements in step order
1991
1993{
1994 int L = m_firstElement;
1995 int LA = m_firstElement;
1996
1997 for (++L; L<=m_lastElement; ++L) {
1998
1999 int m = m_elementsMap[L];
2000 if (!m_elements[m].cluster() &&
2001 !m_elements[m].clusterNoAdd() &&
2002 m_elements[m].inside()>=0) continue;
2003
2004 m_elementsMap[++LA] = m;
2005 }
2006
2007 m_lastElement = LA;
2008 L = m_firstElement;
2009 m_nElements = LA+1;
2010
2011 bool nc = true;
2012 bool so = true;
2013 double ds = m_elements[m_elementsMap[LA]].step()-m_elements[m_elementsMap[L]].step();
2014
2015 if (ds > 0.) { // Sort in increase order
2016
2017 while(nc) {
2018 nc = false;
2019 int m = L, n = L+1;
2020 for (; n<=LA; ++n) {
2021
2022 int Mn = m_elementsMap[n];
2023 int Mm = m_elementsMap[m];
2024
2025 if (m_elements[Mn].step() < m_elements[Mm].step()) {
2026 if (m_elements[Mn].step(m_elements[Mm]) < 0.) {
2027 m_elementsMap[m] = Mn;
2028 m_elementsMap[n] = Mm;
2029 nc = true; so = false;
2030 }
2031 }
2032 ++m;
2033 }
2034 }
2035 }
2036 else {
2037
2038 while(nc) { // Sort in decrease order
2039 nc = false;
2040 int m = L, n = L+1;
2041 for (; n<=LA; ++n) {
2042
2043 int Mn = m_elementsMap[n];
2044 int Mm = m_elementsMap[m];
2045
2046 if (m_elements[Mn].step() > m_elements[Mm].step()) {
2047 if (m_elements[Mn].step(m_elements[Mm]) > 0.) {
2048 m_elementsMap[m] = Mn;
2049 m_elementsMap[n] = Mm;
2050 nc = true; so = false;
2051 }
2052 }
2053 ++m;
2054 }
2055 }
2056 }
2057 if (so) return;
2058
2059 // Search first detector elements with cluster
2060 //
2061 int n = L;
2062 for (; n<= LA; ++n) {
2063
2064 int e = m_elementsMap[n];
2065 if (m_elements[e].cluster()) break;
2066 if (m_elements[e].clusterNoAdd()) --m_nclustersNoAdd;
2067 else if (m_elements[e].inside() < 0 &&
2068 m_elements[e].detstatus()>=0) {--m_nholes; ++m_nHolesBefore;}
2069 }
2070
2071 // Search last detector elements with cluster
2072 //
2073 int m = LA;
2074 for (; m>=n ; --m) {
2075
2076 int e = m_elementsMap[m];
2077 if (m_elements[e].cluster()) break;
2078 if (m_elements[e].clusterNoAdd()) --m_nclustersNoAdd;
2079 else if (m_elements[e].inside() < 0 &&
2080 m_elements[e].detstatus()>=0) {--m_nholes; ++m_nHolesAfter;}
2081 }
2082 m_firstElement = n;
2083 m_lastElement = m;
2084
2085}
2086
2088// Test possibility for trajectory to jump through perigee
2090
2092{
2093 int i = m_firstElement;
2094 double St = m_elements[m_elementsMap[m_lastElement]].step()-m_elements[m_elementsMap[i]].step();
2095
2096 for (; i<=m_lastElement; ++i) {
2097 int m = m_elementsMap[i];
2098 if (m_elements[m].cluster() &&
2099 (m_elements[m].ndf()!=2 || (m_elements[m].stepToPerigee()*St) <= 0.)) break;
2100
2101 if (m_elements[m].cluster()){
2102 --m_nclusters;
2103 m_ndf -= m_elements[m].ndf();
2104 }
2105 else if (m_elements[m].clusterNoAdd()) --m_nclustersNoAdd;
2106 else --m_nholes ;
2107 }
2108
2109 if (i == m_firstElement) return false;
2110 m_firstElement = i;
2111 return true;
2112}
2113
2115// Trajectory quality without optimization
2117
2119{
2120 int holes = 0 ;
2121 double quality = 0.;
2122
2123 for (int i = m_firstElement; i<=m_lastElement; ++i) {
2124 quality+=m_elements[m_elementsMap[i]].quality(holes);
2125 }
2126 return quality;
2127}
2128
2130// Trajectory quality with otimization
2132
2134{
2135 int lE = m_firstElement;
2136 int h = 0 ;
2137 double q = 0 ;
2138 double qM = 0. ;
2139
2140 for (int i = m_firstElement; i<=m_lastElement; ++i) {
2141 int m = m_elementsMap[i];
2142 q+=m_elements[m].quality(h);
2143 if (m_elements[m].cluster() && q > qM) {
2144 qM = q;
2145 lE = i;
2146 }
2147 }
2148
2149 if (lE == m_firstElement) return -100;
2150
2151 int fE = lE;
2152 int nclustersNoAdd = 0 ;
2153 int nclusters = 0 ;
2154 int nholes = 0 ;
2155 int dholes = 0 ;
2156 int ndf = 0 ;
2157 h = 0 ;
2158 q = 0.;
2159 qM = 0.;
2160
2161 for (int i = lE; i>=m_firstElement; --i) {
2162
2163 int m = m_elementsMap[i];
2164 q+=m_elements[m].quality(h);
2165
2166 if (m_elements[m].cluster()) {
2167
2168 ++nclusters;
2169 ndf+=m_elements[m].ndf();
2170
2171 if (q > qM) {
2172 qM = q;
2173 fE = i;
2176 m_nholes = nholes ;
2177 m_dholes = dholes ;
2178 m_ndf = ndf ;
2179 }
2180
2181 }
2182 else if (m_elements[m].clusterNoAdd()) {
2184 }
2185 else if (m_elements[m].inside() < 0 && m_elements[m].detstatus() >=0) {
2186 ++nholes;
2187 if (h > dholes) dholes = h;
2188 }
2189 }
2190
2191 if (fE==lE || m_nclusters+m_nclustersNoAdd < m_tools->clustersmin()) return -100.;
2192 m_firstElement = fE;
2193 m_lastElement = lE;
2194 return qM;
2195}
2196
2198// Trajectory conversion to TrackStateOnSurface for next tracks
2200
2203{
2204 int i=0;
2205 for (; i!=m_ntos; ++i) {
2206 if (m_itos[i]+1 < m_elements[m_atos[i]].ntsos()) {++m_itos[i]; break;}
2207 m_itos[i] = 0;
2208 }
2209 if (i==m_ntos) {
2210 return Trk::TrackStates();
2211 }
2212
2213 auto dtsos = Trk::TrackStates();
2214
2215 for (i=0; i!=m_ntos; ++i) {
2216
2217 Trk::TrackStateOnSurface* tsos = m_elements[m_atos[i]].tsos(m_itos[i]);
2218 if (tsos) dtsos.push_back(tsos);
2219 }
2220 return dtsos;
2221}
2222
2224// pT of the first elementtrajectory
2226
2228{
2229 int n = m_firstElement ; if (n <0 || n>=300) return 0.;
2230 n = m_elementsMap[n]; if (n <0 || n>=300) return 0.;
2231 int s = m_elements[n].status();
2232 if (s<=1) return 0.;
2233 return m_elements[n].parametersUB().momentum().perp();
2234}
2235
2238
2241
2243 bool prevIsSctHole = false;
2244
2246
2247 for (int theEle = m_firstElement+1; theEle<m_lastElement; ++theEle) {
2249 int m = m_elementsMap[theEle];
2250 InDet::SiTrajectoryElement_xk & theElement = m_elements[m];
2252 bool isPix = theElement.ndf() == 2;
2253 bool isSCTHole=false;
2254
2257 if (theElement.cluster() || theElement.clusterNoAdd()) {
2258 prevIsSctHole = false;
2259 continue;
2260 }
2261
2263 else {
2264 std::unique_ptr<const Trk::TrackParameters> pars {theElement.trackParameters(true,0)};
2265 Trk::BoundaryCheckResult boundaryStatus = m_tools->boundaryCheckTool()->boundaryCheck(*pars);
2266 switch (boundaryStatus){
2270 if (isPix) {
2271 ++m_patternHoleOutcome.nPixelHoles;
2272 }
2273 else {
2274 ++m_patternHoleOutcome.nSCTHoles;
2275 isSCTHole=true;
2276 }
2277 break;
2284 break;
2287 if (isPix){
2288 ++m_patternHoleOutcome.nPixelDeads;
2289 }
2290 else{
2291 ++m_patternHoleOutcome.nSCTDeads;
2292 }
2293 break;
2294 }
2295 }
2296
2299 if (isSCTHole && prevIsSctHole){
2300 prevIsSctHole = false;
2301 ++m_patternHoleOutcome.nSCTDoubleHoles;
2302 }
2303 else {
2304 prevIsSctHole = isSCTHole;
2305 }
2306 }
2307 if (m_patternHoleOutcome.nPixelHoles+m_patternHoleOutcome.nSCTHoles > m_tools->maxholes()
2308 || m_patternHoleOutcome.nSCTDoubleHoles > m_tools->maxdholes()){
2309 m_patternHoleOutcome.passPatternHoleCut = false;
2310 }
2311}
const boost::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)
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
SiTrajectoryElement_xk m_elements[300]
std::ostream & dump(std::ostream &out) const
bool forwardFilter(const EventContext &)
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 *)
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)
Trk::TrackStates convertToTrackStateOnSurface()
Trk::TrackStates convertToTrackStateOnSurfaceWithNewDirection()
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.
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.