ATLAS Offline Software
Loading...
Searching...
No Matches
MatchDCWithLine.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7namespace TrkDriftCircleMath {
8
10 // clear cached information
11 reset();
12 DCCit it = dcs.begin();
13 DCCit it_end = dcs.end();
14 for (; it != it_end; ++it) {
15 double dline = m_resWithLine.residual(it->position());
16 double rhit = it->r() < 0. ? -it->r() : it->r();
17 if (dline < 0.) dline *= -1.;
18
19 double res = dline - rhit;
20
21 DCOnTrack dcOnTrack(*it, res);
22
23 matchDC(dcOnTrack, res, dline);
24
25 if (dcOnTrack.state() != DCOnTrack::OutsideRoad) {
30 if (!m_dcOnTrackVec.empty() && m_dcOnTrackVec.back().id() == it->id()) {
31 // take the hit with the smallest residual
32 if (fabs(m_dcOnTrackVec.back().residual()) > fabs(res)) {
33 // exchange the two hits
34 m_dcOnTrackVec.pop_back();
35 m_dcOnTrackVec.push_back(dcOnTrack);
36 }
37 } else {
38 m_dcOnTrackVec.push_back(dcOnTrack);
39 }
40 }
41 }
42 return m_dcOnTrackVec;
43 }
44
45 const DCOnTrackVec& MatchDCWithLine::match(const DCOnTrackVec& dcs, const HitSelection* selection, bool recoverMdtHits,
46 bool usePrecise) {
47 // clear cached information
48 reset();
49
50 DCOnTrackCit it = dcs.begin();
51 DCOnTrackCit it_end = dcs.end();
52 unsigned int index = 0;
53 for (; it != it_end; ++it, ++index) {
54 double dline = m_resWithLine.residual(it->position());
55 double rhit = it->r() < 0. ? -it->r() : it->r();
56 if (dline < 0.) dline *= -1.;
57
58 double res = dline - rhit;
59
60 DCOnTrack dcOnTrack(*it, res);
61 dcOnTrack.errorTrack(it->errorTrack());
62
63 // check whether any DCOnTracks change state from or to OnTrack with respect to the old selection
64 if ((dcOnTrack.state() == DCOnTrack::OnTrack || it->state() == DCOnTrack::OnTrack) && dcOnTrack.state() != it->state())
66
67 if (selection) {
68 if ((*selection)[index] == 0) {
69 matchDC(dcOnTrack, res, dline, true, false, usePrecise);
70 } else if (recoverMdtHits) {
71 matchDC(dcOnTrack, res, dline, false, false, usePrecise);
72 } else {
73 matchDC(dcOnTrack, res, dline, false, true, usePrecise);
74 }
75 } else {
76 matchDC(dcOnTrack, res, dline, false, false, usePrecise);
77 }
78
79 if (dcOnTrack.state() != DCOnTrack::OutsideRoad) m_dcOnTrackVec.push_back(dcOnTrack);
80 }
81 return m_dcOnTrackVec;
82 }
83
84 void MatchDCWithLine::matchDC(DCOnTrack& dcOnTrack, double& res, double& dline, bool forceOnTrack, bool forceOffTrack,
85 bool usePrecise) {
86 // check whether hit within range
87 double error = usePrecise ? dcOnTrack.drPrecise() : dcOnTrack.dr();
88 if (forceOnTrack || (!forceOffTrack && (dcOnTrack.driftState() == DriftCircle::InTime && select(res, error)))) {
89 ++m_onTracks;
91 if (dcOnTrack.id().ml() == 0)
92 ++m_ml1;
93 else
94 ++m_ml2;
95 dcOnTrack.state(DCOnTrack::OnTrack);
96 } else {
97 if (dline < m_tubeRadius) {
98 if (res < 0. || dcOnTrack.driftState() == DriftCircle::LateHit) {
99 dcOnTrack.state(DCOnTrack::OutOfTime);
100 ++m_outOfTimes;
101 } else {
102 dcOnTrack.state(DCOnTrack::Delta);
103 ++m_deltas;
104 }
106 } else {
107 if (dline < m_closeByCut) {
108 dcOnTrack.state(DCOnTrack::CloseDC);
109 ++m_closeHits;
110 } else {
111 dcOnTrack.state(DCOnTrack::OutsideRoad);
112 }
113 if (dline < m_showerCut) { ++m_showerHits; }
114 }
115 }
116 }
117
118 bool MatchDCWithLine::select(double residual, double error) const {
119 if (residual < 0.) residual *= -1.;
120 switch (m_strategy) {
121 case Road: return residual < m_deltaCut;
122 case Pull: return residual < m_deltaCut * error;
123 default: return false;
124 }
125 }
126
128 // clear cache
129 m_dcOnTrackVec.clear();
130
131 m_outOfTimes = 0;
132 m_deltas = 0;
133 m_onTracks = 0;
134 m_passedTubes = 0;
135 m_ml1 = 0;
136 m_ml2 = 0;
137 m_closeHits = 0;
138 m_showerHits = 0;
140 }
141
142} // namespace TrkDriftCircleMath
std::pair< std::vector< unsigned int >, bool > res
class representing a drift circle meaurement on segment
Definition DCOnTrack.h:16
void state(DCOnTrackState st)
set DCOnTrack state
Definition DCOnTrack.h:47
@ OutOfTime
delta electron
Definition DCOnTrack.h:22
@ OutsideRoad
inside road but too far to be on track
Definition DCOnTrack.h:24
@ CloseDC
too large drift time
Definition DCOnTrack.h:23
void errorTrack(double error)
set track error
Definition DCOnTrack.h:41
const MdtId & id() const
access to identifier
Definition DriftCircle.h:77
double dr() const
access to error drift radius
Definition DriftCircle.h:89
double drPrecise() const
access to precise error drift radius
Definition DriftCircle.h:92
const DriftState & driftState() const
access to drift state
Definition DriftCircle.h:95
@ LateHit
drift time compatible with drift spectrum
Definition DriftCircle.h:28
@ InTime
drift time too small to be compatible with drift spectrum
Definition DriftCircle.h:27
void matchDC(DCOnTrack &dc, double &res, double &dline, bool forceOnTrack=false, bool forceOffTrack=false, bool usePreciseErrors=false)
const DCOnTrackVec & match(const DCVec &dcs)
bool select(double residual, double error) const
const std::string selection
Function object to check whether two Segments are sub/super sets or different.
DCOnTrackVec::const_iterator DCOnTrackCit
Definition DCOnTrack.h:61
std::vector< bool > HitSelection
Definition HitSelection.h:9
DCVec::const_iterator DCCit
std::vector< DriftCircle > DCVec
std::vector< DCOnTrack > DCOnTrackVec
Definition DCOnTrack.h:59
Definition index.py:1