54 int nTracks = extTracks.size();
56 assert(nTracks < std::numeric_limits<unsigned short>::max());
58 constexpr unsigned short kNoNeighbour = std::numeric_limits<unsigned short>::max();
65 firstStation.
reset(nTracks);
66 lastStation.
reset(nTracks);
67 firstHit.
reset(nTracks);
68 lastHit.
reset(nTracks);
69 isStored.
reset(nTracks);
70 trackChi2.
reset(nTracks);
71 neighbour.
reset(nTracks);
72 isDownstreamNeighbour.
reset(nTracks);
76 for (
int iTr = 0; iTr < nTracks; iTr++) {
77 firstHit[iTr] = start_hit;
78 firstStation[iTr] = input.
GetHit(extRecoHits[start_hit]).
Station();
79 start_hit += extTracks[iTr].fNofHits - 1;
80 lastHit[iTr] = start_hit;
81 lastStation[iTr] = input.
GetHit(extRecoHits[start_hit]).
Station();
84 isStored[iTr] =
false;
85 neighbour[iTr] = kNoNeighbour;
86 trackChi2[iTr] = 100000.;
87 isDownstreamNeighbour[iTr] =
false;
106 unsigned char maxLengthForMerge =
static_cast<unsigned char>(
fParameters.GetNstationsActive() - 3);
108 for (
int iTr = 0; iTr < nTracks; iTr++) {
109 if (extTracks[iTr].fNofHits > maxLengthForMerge)
continue;
110 for (
int jTr = 0; jTr < nTracks; jTr++) {
111 if (extTracks[jTr].fNofHits > maxLengthForMerge)
continue;
112 if (iTr == jTr)
continue;
113 if (firstStation[iTr] <= lastStation[jTr])
continue;
115 unsigned short stab = firstStation[iTr];
117 Tb.Set(extTracks[iTr].fParFirst);
120 unsigned short staf = lastStation[jTr];
122 Tf.Set(extTracks[jTr].fParLast);
125 if (Tf.NdfTime()[0] >= 0. && Tb.NdfTime()[0] >= 0.) {
126 if (fabs(Tf.GetTime()[0] - Tb.GetTime()[0]) > 3 *
sqrt(Tf.C55()[0] + Tb.C55()[0]))
continue;
131 fBf =
fField.GetFieldValue(staf, Tf.X(), Tf.Y());
132 fBb =
fField.GetFieldValue(stab, Tb.X(), Tb.Y());
134 unsigned short dist = firstStation[iTr] - lastStation[jTr];
141 fvec zm =
fSetup.GetActiveLayer(stam).GetZref();
142 fvec xm =
fvec(0.5) * (Tf.GetX() + Tf.Tx() * (zm - Tf.Z()) + Tb.GetX() + Tb.Tx() * (zm - Tb.Z()));
143 fvec ym =
fvec(0.5) * (Tf.Y() + Tf.Ty() * (zm - Tf.Z()) + Tb.Y() + Tb.Ty() * (zm - Tb.Z()));
144 fBm =
fField.GetFieldValue(stam, xm, ym);
145 fld.Set(fBb, fBm, fBf);
147 fvec zMiddle =
fvec(0.5) * (Tb.Z() + Tf.Z());
153 FilterTracks(&(Tf.X()), &(Tf.C00()), &(Tb.X()), &(Tb.C00()),
nullptr,
nullptr, &Chi2Tracks);
154 if (Chi2Tracks[0] > 50)
continue;
156 if (Chi2Tracks[0] < trackChi2[iTr] || Chi2Tracks[0] < trackChi2[jTr]) {
157 if (neighbour[iTr] < kNoNeighbour) {
158 neighbour[neighbour[iTr]] = kNoNeighbour;
159 trackChi2[neighbour[iTr]] = 100000.;
160 isDownstreamNeighbour[neighbour[iTr]] =
false;
162 if (neighbour[jTr] < kNoNeighbour) {
163 neighbour[neighbour[jTr]] = kNoNeighbour;
164 trackChi2[neighbour[jTr]] = 100000.;
165 isDownstreamNeighbour[neighbour[jTr]] =
false;
167 neighbour[iTr] = jTr;
168 neighbour[jTr] = iTr;
169 trackChi2[iTr] = Chi2Tracks[0];
170 trackChi2[jTr] = Chi2Tracks[0];
171 isDownstreamNeighbour[iTr] =
true;
172 isDownstreamNeighbour[jTr] =
false;
177 for (
int iTr = 0; iTr < nTracks; iTr++) {
178 if (isStored[iTr])
continue;
181 if (!isDownstreamNeighbour[iTr]) {
182 for (
ca::HitIndex_t HI = firstHit[iTr]; HI <= lastHit[iTr]; HI++) {
187 if (neighbour[iTr] < kNoNeighbour) {
188 isStored[neighbour[iTr]] =
true;
189 fTracksNew.back().fNofHits += extTracks[neighbour[iTr]].fNofHits;
190 for (
ca::HitIndex_t HI = firstHit[neighbour[iTr]]; HI <= lastHit[neighbour[iTr]]; HI++)
194 if (isDownstreamNeighbour[iTr]) {
195 for (
ca::HitIndex_t HI = firstHit[iTr]; HI <= lastHit[iTr]; HI++) {
256 fvec d[5], uud, u[5][5];
257 for (
int i = 0; i < 5; i++) {
259 for (
int j = 0; j < 5; j++)
263 for (
int i = 0; i < 5; i++) {
265 for (
int j = 0; j < i; j++)
266 uud += u[j][i] * u[j][i] * d[j];
267 uud = a[i * (i + 3) / 2] - uud;
269 fvec smallval(1.e-12);
270 uud =
iif(uud >= smallval, uud, smallval);
275 for (
int j = i + 1; j < 5; j++) {
277 for (
int k = 0; k < i; k++)
278 uud += u[k][i] * u[k][j] * d[k];
279 uud = a[j * (j + 1) / 2 + i] - uud;
280 u[i][j] = d[i] / u[i][i] * uud;
286 for (
int i = 0; i < 5; i++) {
288 u[i][i] = 1.f / u[i][i];
290 for (
int i = 0; i < 4; i++) {
291 u[i][i + 1] = -u[i][i + 1] * u[i][i] * u[i + 1][i + 1];
293 for (
int i = 0; i < 3; i++) {
294 u[i][i + 2] = u[i][i + 1] * u1[i + 1] * u[i + 1][i + 2] - u[i][i + 2] * u[i][i] * u[i + 2][i + 2];
296 for (
int i = 0; i < 2; i++) {
297 u[i][i + 3] = u[i][i + 2] * u1[i + 2] * u[i + 2][i + 3] - u[i][i + 3] * u[i][i] * u[i + 3][i + 3];
298 u[i][i + 3] -= u[i][i + 1] * u1[i + 1] * (u[i + 1][i + 2] * u1[i + 2] * u[i + 2][i + 3] - u[i + 1][i + 3]);
300 u[0][4] = u[0][2] * u1[2] * u[2][4] - u[0][4] * u[0][0] * u[4][4];
301 u[0][4] += u[0][1] * u1[1] * (u[1][4] - u[1][3] * u1[3] * u[3][4] - u[1][2] * u1[2] * u[2][4]);
302 u[0][4] += u[3][4] * u1[3] * (u[0][3] - u1[2] * u[2][3] * (u[0][2] - u[0][1] * u1[1] * u[1][2]));
304 for (
int i = 0; i < 5; i++)
305 a[i + 10] = u[i][4] * d[4] * u[4][4];
306 for (
int i = 0; i < 4; i++)
307 a[i + 6] = u[i][3] * u[3][3] * d[3] + u[i][4] * u[3][4] * d[4];
308 for (
int i = 0; i < 3; i++)
309 a[i + 3] = u[i][2] * u[2][2] * d[2] + u[i][3] * u[2][3] * d[3] + u[i][4] * u[2][4] * d[4];
310 for (
int i = 0; i < 2; i++)
312 u[i][1] * u[1][1] * d[1] + u[i][2] * u[1][2] * d[2] + u[i][3] * u[1][3] * d[3] + u[i][4] * u[1][4] * d[4];
313 a[0] = u[0][0] * u[0][0] * d[0] + u[0][1] * u[0][1] * d[1] + u[0][2] * u[0][2] * d[2] + u[0][3] * u[0][3] * d[3]
314 + u[0][4] * u[0][4] * d[4];