Main segment finding entry point.
58 {
59
60
61 segments.clear();
62
64 ATH_MSG_DEBUG(
"Size of drift circles vector: " << driftCircles.size()
65 << ", size of segments vector: " << segments.size());
66
67
68
69 std::vector<HitInfo> hitInfos;
71
72
73 if (hitInfos.size() < 2) {
75 return StatusCode::SUCCESS;
76 }
77
78
79
80 std::array<std::vector<std::size_t>, 2> hitsPerML;
81 for (std::size_t i = 0;
i < hitInfos.size(); ++
i) {
82 hitsPerML[hitInfos[
i].multilayer].push_back(i);
83 }
84
85
86
87 for (auto& indices : hitsPerML) {
89 [&hitInfos](std::size_t
a, std::size_t b) {
90 return hitInfos[a].driftRadius < hitInfos[b].driftRadius;
91 });
92 }
93
94
95 std::array<std::vector<Cluster>, 2> clustersPerML;
96 std::array<std::optional<Cluster>, 2> bestClusters;
97
98
99 for (int ml = 0; ml < 2; ++ml) {
100 clusterHits(hitInfos, hitsPerML[ml], clustersPerML[ml]);
101
103 ATH_MSG_INFO(
"ML " << ml <<
" has " << clustersPerML[ml].
size() <<
" clusters");
104 for (
const Cluster& cl : clustersPerML[ml]) {
106 }
107 }
108
110 }
111
112
113
114
115 std::vector<float> correctedZ;
116 std::vector<float> correctedR;
117 correctedZ.reserve(hitInfos.size());
118 correctedR.reserve(hitInfos.size());
119
120 for (int ml = 0; ml < 2; ++ml) {
121 if (!bestClusters[ml]) continue;
122
124 for (std::size_t i = 0;
i <
cl.hitIndices.size(); ++
i) {
126 const bool plus =
cl.plusFlags[
i];
127
128
129
130 if (plus) {
131 correctedZ.push_back(
h.z -
h.deltaZ);
132 correctedR.push_back(
h.r +
h.deltaR);
133 } else {
134 correctedZ.push_back(
h.z +
h.deltaZ);
135 correctedR.push_back(
h.r -
h.deltaR);
136 }
137 }
138 }
139
140
141 if (correctedZ.size() < 2) {
142 ATH_MSG_DEBUG(
"Not enough corrected hits after cluster selection");
143 return StatusCode::SUCCESS;
144 }
145
146
150 return StatusCode::SUCCESS;
151 }
152
153
154 float segZMin = *std::min_element(correctedZ.begin(), correctedZ.end());
155 float segZMax = *std::max_element(correctedZ.begin(), correctedZ.end());
156 float segZRef = 0.f;
157 for (
float z : correctedZ) {
159 }
160 segZRef /= static_cast<float>(correctedZ.size());
161
162
163 float segRRef =
fit.m * segZRef +
fit.b;
164
165
166
167 L0MDT::Segment seg;
172
177
178 segments.push_back(seg);
179
180
181
185 <<
" chi2=" <<
fit.chi2
186 << " nHits=" << correctedZ.size()
187 << " zMin=" << segZMin
188 << " zMax=" << segZMax
189 << " zRef=" << segZRef
190 << " rRef=" << segRRef);
191 return StatusCode::SUCCESS;
192 }
#define ATH_CHECK
Evaluate an expression and check for errors.
size_t size() const
Number of registered mappings.
void setNHits(unsigned int x)
std::pair< long int, long int > indices
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.