Project
Loading...
Searching...
No Matches
ClusterLines.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include <cmath>
13#include <algorithm>
15
16namespace o2
17{
18namespace its
19{
20
21Line::Line(std::array<float, 3> firstPoint, std::array<float, 3> secondPoint)
22 : weightMatrix{1., 0., 0., 1., 0., 1.} // dummy, ATM
23{
24 for (int index{0}; index < 3; ++index) {
25 originPoint[index] = firstPoint.data()[index];
27 }
28
29 float inverseNorm{1.f / o2::gpu::CAMath::Sqrt(cosinesDirector[0] * cosinesDirector[0] + cosinesDirector[1] * cosinesDirector[1] +
31 for (int index{0}; index < 3; ++index) {
32 cosinesDirector[index] *= inverseNorm;
33 }
34}
35
36bool Line::areParallel(const Line& firstLine, const Line& secondLine, const float precision)
37{
38 float crossProdX{firstLine.cosinesDirector[1] * secondLine.cosinesDirector[2] -
39 firstLine.cosinesDirector[2] * secondLine.cosinesDirector[1]};
40 float module{std::abs(firstLine.cosinesDirector[1] * secondLine.cosinesDirector[2]) +
41 std::abs(firstLine.cosinesDirector[2] * secondLine.cosinesDirector[1])};
42 if (std::abs(crossProdX) > precision * module) {
43 return false;
44 }
45
46 float crossProdY{-firstLine.cosinesDirector[0] * secondLine.cosinesDirector[2] +
47 firstLine.cosinesDirector[2] * secondLine.cosinesDirector[0]};
48 module = std::abs(firstLine.cosinesDirector[0] * secondLine.cosinesDirector[2]) +
49 std::abs(firstLine.cosinesDirector[2] * secondLine.cosinesDirector[0]);
50 if (std::abs(crossProdY) > precision * module) {
51 return false;
52 }
53
54 float crossProdZ = firstLine.cosinesDirector[0] * secondLine.cosinesDirector[1] -
55 firstLine.cosinesDirector[1] * secondLine.cosinesDirector[0];
56 module = std::abs(firstLine.cosinesDirector[0] * secondLine.cosinesDirector[1]) +
57 std::abs(firstLine.cosinesDirector[1] * secondLine.cosinesDirector[0]);
58 if (std::abs(crossProdZ) > precision * module) {
59 return false;
60 }
61
62 return true;
63}
64
65std::array<float, 6> Line::getDCAComponents(const Line& line, const std::array<float, 3> point)
66{
67 std::array<float, 6> components{0., 0., 0., 0., 0., 0.};
68 float cdelta{0.};
69 for (int i{0}; i < 3; ++i) {
70 cdelta -= line.cosinesDirector[i] * (line.originPoint[i] - point[i]);
71 }
72
73 components[0] = line.originPoint[0] - point[0] + line.cosinesDirector[0] * cdelta;
74 components[3] = line.originPoint[1] - point[1] + line.cosinesDirector[1] * cdelta;
75 components[5] = line.originPoint[2] - point[2] + line.cosinesDirector[2] * cdelta;
76 components[1] = o2::gpu::CAMath::Sqrt(components[0] * components[0] + components[3] * components[3]);
77 components[2] = o2::gpu::CAMath::Sqrt(components[0] * components[0] + components[5] * components[5]);
78 components[4] = o2::gpu::CAMath::Sqrt(components[3] * components[3] + components[5] * components[5]);
79
80 return components;
81}
82
83ClusterLines::ClusterLines(const int firstLabel, const Line& firstLine, const int secondLabel, const Line& secondLine,
84 const bool weight)
85
86{
87 updateROFPoll(firstLine);
88 updateROFPoll(secondLine);
89
90 mLabels.push_back(firstLabel);
91 if (secondLabel > 0) {
92 mLabels.push_back(secondLabel); // don't add info in case of beamline used
93 }
94
95 std::array<float, 3> covarianceFirst{1., 1., 1.};
96 std::array<float, 3> covarianceSecond{1., 1., 1.};
97
98 for (int i{0}; i < 6; ++i) {
99 mWeightMatrix[i] = firstLine.weightMatrix[i] + secondLine.weightMatrix[i];
100 }
101
102 float determinantFirst =
103 firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] * covarianceFirst[1] +
104 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] * covarianceFirst[2] +
105 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1] * covarianceFirst[2];
106 float determinantSecond =
107 secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] * covarianceSecond[1] +
108 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] * covarianceSecond[2] +
109 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1] * covarianceSecond[2];
110
111 mAMatrix[0] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[1] +
112 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[2]) /
113 determinantFirst +
114 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[1] +
115 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[2]) /
116 determinantSecond;
117
118 mAMatrix[1] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[1] * covarianceFirst[2] / determinantFirst -
119 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[1] * covarianceSecond[2] / determinantSecond;
120
121 mAMatrix[2] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[2] * covarianceFirst[1] / determinantFirst -
122 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[2] * covarianceSecond[1] / determinantSecond;
123
124 mAMatrix[3] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] +
125 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[2]) /
126 determinantFirst +
127 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] +
128 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[2]) /
129 determinantSecond;
130
131 mAMatrix[4] = -firstLine.cosinesDirector[1] * firstLine.cosinesDirector[2] * covarianceFirst[0] / determinantFirst -
132 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[2] * covarianceSecond[0] / determinantSecond;
133
134 mAMatrix[5] = (firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] +
135 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1]) /
136 determinantFirst +
137 (secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] +
138 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1]) /
139 determinantSecond;
140
141 mBMatrix[0] =
142 (firstLine.cosinesDirector[1] * covarianceFirst[2] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[1]) +
143 firstLine.cosinesDirector[2] * covarianceFirst[1] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[2])) /
144 determinantFirst;
145
146 mBMatrix[0] +=
147 (secondLine.cosinesDirector[1] * covarianceSecond[2] * (-secondLine.cosinesDirector[1] * secondLine.originPoint[0] + secondLine.cosinesDirector[0] * secondLine.originPoint[1]) +
148 secondLine.cosinesDirector[2] * covarianceSecond[1] *
149 (-secondLine.cosinesDirector[2] * secondLine.originPoint[0] +
150 secondLine.cosinesDirector[0] * secondLine.originPoint[2])) /
151 determinantSecond;
152
153 mBMatrix[1] =
154 (firstLine.cosinesDirector[0] * covarianceFirst[2] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[0]) +
155 firstLine.cosinesDirector[2] * covarianceFirst[0] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[2])) /
156 determinantFirst;
157
158 mBMatrix[1] +=
159 (secondLine.cosinesDirector[0] * covarianceSecond[2] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[1] + secondLine.cosinesDirector[1] * secondLine.originPoint[0]) +
160 secondLine.cosinesDirector[2] * covarianceSecond[0] *
161 (-secondLine.cosinesDirector[2] * secondLine.originPoint[1] +
162 secondLine.cosinesDirector[1] * secondLine.originPoint[2])) /
163 determinantSecond;
164
165 mBMatrix[2] =
166 (firstLine.cosinesDirector[0] * covarianceFirst[1] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[0]) +
167 firstLine.cosinesDirector[1] * covarianceFirst[0] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[1])) /
168 determinantFirst;
169
170 mBMatrix[2] +=
171 (secondLine.cosinesDirector[0] * covarianceSecond[1] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[2] + secondLine.cosinesDirector[2] * secondLine.originPoint[0]) +
172 secondLine.cosinesDirector[1] * covarianceSecond[0] *
173 (-secondLine.cosinesDirector[1] * secondLine.originPoint[2] +
174 secondLine.cosinesDirector[2] * secondLine.originPoint[1])) /
175 determinantSecond;
176
177 computeClusterCentroid();
178
179 // RMS2
180 mRMS2 = Line::getDCAComponents(firstLine, mVertex);
181 const std::array<float, 6> tmpRMS2Line2 = Line::getDCAComponents(secondLine, mVertex);
182 std::transform(mRMS2.begin(), mRMS2.end(), tmpRMS2Line2.begin(), mRMS2.begin(), [&](const float a, const float b) { return a + (b - a) / mLabels.size(); });
183
184 // AvgDistance2
185 mAvgDistance2 = std::move(Line::getDistanceFromPoint(firstLine, mVertex) * Line::getDistanceFromPoint(firstLine, mVertex));
186 mAvgDistance2 += (Line::getDistanceFromPoint(secondLine, mVertex) * Line::getDistanceFromPoint(secondLine, mVertex) - mAvgDistance2) / mLabels.size();
187}
188
189ClusterLines::ClusterLines(const Line& firstLine, const Line& secondLine)
190{
191
192 std::array<float, 3> covarianceFirst{1., 1., 1.};
193 std::array<float, 3> covarianceSecond{1., 1., 1.};
194 updateROFPoll(firstLine);
195 updateROFPoll(secondLine);
196 for (int i{0}; i < 6; ++i) {
197 mWeightMatrix[i] = firstLine.weightMatrix[i] + secondLine.weightMatrix[i];
198 }
199
200 float determinantFirst =
201 firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] * covarianceFirst[1] +
202 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] * covarianceFirst[2] +
203 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1] * covarianceFirst[2];
204 float determinantSecond =
205 secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] * covarianceSecond[1] +
206 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] * covarianceSecond[2] +
207 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1] * covarianceSecond[2];
208
209 mAMatrix[0] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[1] +
210 firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[2]) /
211 determinantFirst +
212 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[1] +
213 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[2]) /
214 determinantSecond;
215
216 mAMatrix[1] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[1] * covarianceFirst[2] / determinantFirst -
217 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[1] * covarianceSecond[2] / determinantSecond;
218
219 mAMatrix[2] = -firstLine.cosinesDirector[0] * firstLine.cosinesDirector[2] * covarianceFirst[1] / determinantFirst -
220 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[2] * covarianceSecond[1] / determinantSecond;
221
222 mAMatrix[3] = (firstLine.cosinesDirector[2] * firstLine.cosinesDirector[2] * covarianceFirst[0] +
223 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[2]) /
224 determinantFirst +
225 (secondLine.cosinesDirector[2] * secondLine.cosinesDirector[2] * covarianceSecond[0] +
226 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[2]) /
227 determinantSecond;
228
229 mAMatrix[4] = -firstLine.cosinesDirector[1] * firstLine.cosinesDirector[2] * covarianceFirst[0] / determinantFirst -
230 secondLine.cosinesDirector[1] * secondLine.cosinesDirector[2] * covarianceSecond[0] / determinantSecond;
231
232 mAMatrix[5] = (firstLine.cosinesDirector[1] * firstLine.cosinesDirector[1] * covarianceFirst[0] +
233 firstLine.cosinesDirector[0] * firstLine.cosinesDirector[0] * covarianceFirst[1]) /
234 determinantFirst +
235 (secondLine.cosinesDirector[1] * secondLine.cosinesDirector[1] * covarianceSecond[0] +
236 secondLine.cosinesDirector[0] * secondLine.cosinesDirector[0] * covarianceSecond[1]) /
237 determinantSecond;
238
239 mBMatrix[0] =
240 (firstLine.cosinesDirector[1] * covarianceFirst[2] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[1]) +
241 firstLine.cosinesDirector[2] * covarianceFirst[1] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[0] + firstLine.cosinesDirector[0] * firstLine.originPoint[2])) /
242 determinantFirst;
243
244 mBMatrix[0] +=
245 (secondLine.cosinesDirector[1] * covarianceSecond[2] * (-secondLine.cosinesDirector[1] * secondLine.originPoint[0] + secondLine.cosinesDirector[0] * secondLine.originPoint[1]) +
246 secondLine.cosinesDirector[2] * covarianceSecond[1] *
247 (-secondLine.cosinesDirector[2] * secondLine.originPoint[0] +
248 secondLine.cosinesDirector[0] * secondLine.originPoint[2])) /
249 determinantSecond;
250
251 mBMatrix[1] =
252 (firstLine.cosinesDirector[0] * covarianceFirst[2] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[0]) +
253 firstLine.cosinesDirector[2] * covarianceFirst[0] * (-firstLine.cosinesDirector[2] * firstLine.originPoint[1] + firstLine.cosinesDirector[1] * firstLine.originPoint[2])) /
254 determinantFirst;
255
256 mBMatrix[1] +=
257 (secondLine.cosinesDirector[0] * covarianceSecond[2] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[1] + secondLine.cosinesDirector[1] * secondLine.originPoint[0]) +
258 secondLine.cosinesDirector[2] * covarianceSecond[0] *
259 (-secondLine.cosinesDirector[2] * secondLine.originPoint[1] +
260 secondLine.cosinesDirector[1] * secondLine.originPoint[2])) /
261 determinantSecond;
262
263 mBMatrix[2] =
264 (firstLine.cosinesDirector[0] * covarianceFirst[1] * (-firstLine.cosinesDirector[0] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[0]) +
265 firstLine.cosinesDirector[1] * covarianceFirst[0] * (-firstLine.cosinesDirector[1] * firstLine.originPoint[2] + firstLine.cosinesDirector[2] * firstLine.originPoint[1])) /
266 determinantFirst;
267
268 mBMatrix[2] +=
269 (secondLine.cosinesDirector[0] * covarianceSecond[1] * (-secondLine.cosinesDirector[0] * secondLine.originPoint[2] + secondLine.cosinesDirector[2] * secondLine.originPoint[0]) +
270 secondLine.cosinesDirector[1] * covarianceSecond[0] *
271 (-secondLine.cosinesDirector[1] * secondLine.originPoint[2] +
272 secondLine.cosinesDirector[2] * secondLine.originPoint[1])) /
273 determinantSecond;
274
275 computeClusterCentroid();
276}
277
278void ClusterLines::add(const int& lineLabel, const Line& line, const bool& weight)
279{
280 mLabels.push_back(lineLabel);
281 updateROFPoll(line);
282 std::array<float, 3> covariance{1., 1., 1.};
283
284 for (int i{0}; i < 6; ++i) {
285 mWeightMatrix[i] += line.weightMatrix[i];
286 }
287 // if(weight) line->GetSigma2P0(covariance);
288
289 double determinant{line.cosinesDirector[2] * line.cosinesDirector[2] * covariance[0] * covariance[1] +
290 line.cosinesDirector[1] * line.cosinesDirector[1] * covariance[0] * covariance[2] +
291 line.cosinesDirector[0] * line.cosinesDirector[0] * covariance[1] * covariance[2]};
292
293 mAMatrix[0] += (line.cosinesDirector[2] * line.cosinesDirector[2] * covariance[1] +
294 line.cosinesDirector[1] * line.cosinesDirector[1] * covariance[2]) /
295 determinant;
296 mAMatrix[1] += -line.cosinesDirector[0] * line.cosinesDirector[1] * covariance[2] / determinant;
297 mAMatrix[2] += -line.cosinesDirector[0] * line.cosinesDirector[2] * covariance[1] / determinant;
298 mAMatrix[3] += (line.cosinesDirector[2] * line.cosinesDirector[2] * covariance[0] +
299 line.cosinesDirector[0] * line.cosinesDirector[0] * covariance[2]) /
300 determinant;
301 mAMatrix[4] += -line.cosinesDirector[1] * line.cosinesDirector[2] * covariance[0] / determinant;
302 mAMatrix[5] += (line.cosinesDirector[1] * line.cosinesDirector[1] * covariance[0] +
303 line.cosinesDirector[0] * line.cosinesDirector[0] * covariance[1]) /
304 determinant;
305
306 mBMatrix[0] += (line.cosinesDirector[1] * covariance[2] *
307 (-line.cosinesDirector[1] * line.originPoint[0] + line.cosinesDirector[0] * line.originPoint[1]) +
308 line.cosinesDirector[2] * covariance[1] *
309 (-line.cosinesDirector[2] * line.originPoint[0] + line.cosinesDirector[0] * line.originPoint[2])) /
310 determinant;
311 mBMatrix[1] += (line.cosinesDirector[0] * covariance[2] *
312 (-line.cosinesDirector[0] * line.originPoint[1] + line.cosinesDirector[1] * line.originPoint[0]) +
313 line.cosinesDirector[2] * covariance[0] *
314 (-line.cosinesDirector[2] * line.originPoint[1] + line.cosinesDirector[1] * line.originPoint[2])) /
315 determinant;
316 mBMatrix[2] += (line.cosinesDirector[0] * covariance[1] *
317 (-line.cosinesDirector[0] * line.originPoint[2] + line.cosinesDirector[2] * line.originPoint[0]) +
318 line.cosinesDirector[1] * covariance[0] *
319 (-line.cosinesDirector[1] * line.originPoint[2] + line.cosinesDirector[2] * line.originPoint[1])) /
320 determinant;
321
322 computeClusterCentroid();
323 mAvgDistance2 += (Line::getDistanceFromPoint(line, mVertex) * Line::getDistanceFromPoint(line, mVertex) - mAvgDistance2) / mLabels.size();
324}
325
326void ClusterLines::computeClusterCentroid()
327{
328
329 double determinant{mAMatrix[0] * (mAMatrix[3] * mAMatrix[5] - mAMatrix[4] * mAMatrix[4]) -
330 mAMatrix[1] * (mAMatrix[1] * mAMatrix[5] - mAMatrix[4] * mAMatrix[2]) +
331 mAMatrix[2] * (mAMatrix[1] * mAMatrix[4] - mAMatrix[2] * mAMatrix[3])};
332
333 if (determinant == 0) {
334 return;
335 }
336
337 mVertex[0] = -(mBMatrix[0] * (mAMatrix[3] * mAMatrix[5] - mAMatrix[4] * mAMatrix[4]) -
338 mAMatrix[1] * (mBMatrix[1] * mAMatrix[5] - mAMatrix[4] * mBMatrix[2]) +
339 mAMatrix[2] * (mBMatrix[1] * mAMatrix[4] - mBMatrix[2] * mAMatrix[3])) /
340 determinant;
341 mVertex[1] = -(mAMatrix[0] * (mBMatrix[1] * mAMatrix[5] - mBMatrix[2] * mAMatrix[4]) -
342 mBMatrix[0] * (mAMatrix[1] * mAMatrix[5] - mAMatrix[4] * mAMatrix[2]) +
343 mAMatrix[2] * (mAMatrix[1] * mBMatrix[2] - mAMatrix[2] * mBMatrix[1])) /
344 determinant;
345 mVertex[2] = -(mAMatrix[0] * (mAMatrix[3] * mBMatrix[2] - mBMatrix[1] * mAMatrix[4]) -
346 mAMatrix[1] * (mAMatrix[1] * mBMatrix[2] - mBMatrix[1] * mAMatrix[2]) +
347 mBMatrix[0] * (mAMatrix[1] * mAMatrix[4] - mAMatrix[2] * mAMatrix[3])) /
348 determinant;
349}
350
351bool ClusterLines::operator==(const ClusterLines& rhs) const
352{
353 bool retval{true};
354 for (auto i{0}; i < 6; ++i) {
355 retval &= this->mRMS2[i] == rhs.mRMS2[i];
356 }
357 for (auto i{0}; i < 3; ++i) {
358 retval &= this->mVertex[i] == rhs.mVertex[i];
359 }
360 if (this->mLabels.size() != rhs.mLabels.size()) {
361 retval = false;
362 } else {
363 for (size_t i{0}; i < this->mLabels.size(); ++i) {
364 retval &= this->mLabels[i] == rhs.mLabels[i];
365 }
366 }
367 return retval && this->mAvgDistance2 == rhs.mAvgDistance2;
368}
369
370GPUhdi() void ClusterLines::updateROFPoll(const Line& line)
371{
372 // option 1: Boyer-Moore voting for rof label
373 // if (mROFWeight == 0) {
374 // mROF = line.getMinROF();
375 // mROFWeight = 1;
376 // } else {
377 // if (mROF == line.getMinROF()) {
378 // mROFWeight++;
379 // } else {
380 // mROFWeight--;
381 // }
382 // }
383
384 // option 2
385 if (mROF == -1) {
386 mROF = line.getMinROF();
387 } else {
388 if (line.getMinROF() < mROF) {
389 mROF = line.getMinROF();
390 }
391 }
392}
393
394} // namespace its
395} // namespace o2
int32_t i
GLuint index
Definition glcorearb.h:781
GLuint GLuint GLfloat weight
Definition glcorearb.h:5477
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLint GLenum GLint components
Definition glcorearb.h:5520
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLenum GLint GLint * precision
Definition glcorearb.h:1899
GPUhdi() Cell
Definition Cell.h:55
D const SVectorGPU< T, D > & rhs
Definition SMatrixGPU.h:191
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
float cosinesDirector[3]
static std::array< float, 6 > getDCAComponents(const Line &line, const std::array< float, 3 > point)
Line(std::array< float, 3 > firstPoint, std::array< float, 3 > secondPoint)
const float point[3]
float weightMatrix[6]
const Cluster const Cluster *static float getDistanceFromPoint(const Line &line, const std::array< float, 3 > &point)
static bool areParallel(const Line &, const Line &, const float precision=1e-14)
float originPoint[3]
const float secondPoint[3]