28 fvec d[5], uud, u[5][5];
29 for (
int i = 0;
i < 5;
i++) {
31 for (
int j = 0; j < 5; j++)
35 for (
int i = 0;
i < 5;
i++) {
37 for (
int j = 0; j <
i; j++)
38 uud += u[j][
i] * u[j][
i] * d[j];
39 uud = a[
i * (
i + 3) / 2] - uud;
41 fvec smallval = 1.e-12;
42 fvec initialised =
fvec(uud < smallval);
43 uud = ((!initialised) & uud) + (smallval & initialised);
45 d[
i] = uud /
fabs(uud);
48 for (
int j =
i + 1; j < 5; j++) {
50 for (
int k = 0; k <
i; k++)
51 uud += u[k][
i] * u[k][j] * d[k];
52 uud = a[j * (j + 1) / 2 +
i] - uud;
53 u[
i][j] = d[
i] / u[
i][
i] * uud;
59 for (
int i = 0;
i < 5;
i++) {
61 u[
i][
i] = 1.f / u[
i][
i];
63 for (
int i = 0;
i < 4;
i++) {
64 u[
i][
i + 1] = -u[
i][
i + 1] * u[
i][
i] * u[
i + 1][
i + 1];
66 for (
int i = 0;
i < 3;
i++) {
67 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];
69 for (
int i = 0;
i < 2;
i++) {
70 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];
71 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]);
73 u[0][4] = u[0][2] * u1[2] * u[2][4] - u[0][4] * u[0][0] * u[4][4];
74 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]);
75 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]));
77 for (
int i = 0;
i < 5;
i++)
78 a[
i + 10] = u[
i][4] * d[4] * u[4][4];
79 for (
int i = 0;
i < 4;
i++)
80 a[
i + 6] = u[
i][3] * u[3][3] * d[3] + u[
i][4] * u[3][4] * d[4];
81 for (
int i = 0;
i < 3;
i++)
82 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];
83 for (
int i = 0;
i < 2;
i++)
85 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];
86 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]
87 + u[0][4] * u[0][4] * d[4];
92 K[0][0] = C[0] * V[0] + C[1] * V[1] + C[3] * V[3] + C[6] * V[6] + C[10] * V[10];
93 K[0][1] = C[0] * V[1] + C[1] * V[2] + C[3] * V[4] + C[6] * V[7] + C[10] * V[11];
94 K[0][2] = C[0] * V[3] + C[1] * V[4] + C[3] * V[5] + C[6] * V[8] + C[10] * V[12];
95 K[0][3] = C[0] * V[6] + C[1] * V[7] + C[3] * V[8] + C[6] * V[9] + C[10] * V[13];
96 K[0][4] = C[0] * V[10] + C[1] * V[11] + C[3] * V[12] + C[6] * V[13] + C[10] * V[14];
98 K[1][0] = C[1] * V[0] + C[2] * V[1] + C[4] * V[3] + C[7] * V[6] + C[11] * V[10];
99 K[1][1] = C[1] * V[1] + C[2] * V[2] + C[4] * V[4] + C[7] * V[7] + C[11] * V[11];
100 K[1][2] = C[1] * V[3] + C[2] * V[4] + C[4] * V[5] + C[7] * V[8] + C[11] * V[12];
101 K[1][3] = C[1] * V[6] + C[2] * V[7] + C[4] * V[8] + C[7] * V[9] + C[11] * V[13];
102 K[1][4] = C[1] * V[10] + C[2] * V[11] + C[4] * V[12] + C[7] * V[13] + C[11] * V[14];
104 K[2][0] = C[3] * V[0] + C[4] * V[1] + C[5] * V[3] + C[8] * V[6] + C[12] * V[10];
105 K[2][1] = C[3] * V[1] + C[4] * V[2] + C[5] * V[4] + C[8] * V[7] + C[12] * V[11];
106 K[2][2] = C[3] * V[3] + C[4] * V[4] + C[5] * V[5] + C[8] * V[8] + C[12] * V[12];
107 K[2][3] = C[3] * V[6] + C[4] * V[7] + C[5] * V[8] + C[8] * V[9] + C[12] * V[13];
108 K[2][4] = C[3] * V[10] + C[4] * V[11] + C[5] * V[12] + C[8] * V[13] + C[12] * V[14];
110 K[3][0] = C[6] * V[0] + C[7] * V[1] + C[8] * V[3] + C[9] * V[6] + C[13] * V[10];
111 K[3][1] = C[6] * V[1] + C[7] * V[2] + C[8] * V[4] + C[9] * V[7] + C[13] * V[11];
112 K[3][2] = C[6] * V[3] + C[7] * V[4] + C[8] * V[5] + C[9] * V[8] + C[13] * V[12];
113 K[3][3] = C[6] * V[6] + C[7] * V[7] + C[8] * V[8] + C[9] * V[9] + C[13] * V[13];
114 K[3][4] = C[6] * V[10] + C[7] * V[11] + C[8] * V[12] + C[9] * V[13] + C[13] * V[14];
116 K[4][0] = C[10] * V[0] + C[11] * V[1] + C[12] * V[3] + C[13] * V[6] + C[14] * V[10];
117 K[4][1] = C[10] * V[1] + C[11] * V[2] + C[12] * V[4] + C[13] * V[7] + C[14] * V[11];
118 K[4][2] = C[10] * V[3] + C[11] * V[4] + C[12] * V[5] + C[13] * V[8] + C[14] * V[12];
119 K[4][3] = C[10] * V[6] + C[11] * V[7] + C[12] * V[8] + C[13] * V[9] + C[14] * V[13];
120 K[4][4] = C[10] * V[10] + C[11] * V[11] + C[12] * V[12] + C[13] * V[13] + C[14] * V[14];
125 K[0] = C[0][0] * V[0] + C[0][1] * V[1] + C[0][2] * V[3] + C[0][3] * V[6] + C[0][4] * V[10];
127 K[1] = C[1][0] * V[0] + C[1][1] * V[1] + C[1][2] * V[3] + C[1][3] * V[6] + C[1][4] * V[10];
128 K[2] = C[1][0] * V[1] + C[1][1] * V[2] + C[1][2] * V[4] + C[1][3] * V[7] + C[1][4] * V[11];
130 K[3] = C[2][0] * V[0] + C[2][1] * V[1] + C[2][2] * V[3] + C[2][3] * V[6] + C[2][4] * V[10];
131 K[4] = C[2][0] * V[1] + C[2][1] * V[2] + C[2][2] * V[4] + C[2][3] * V[7] + C[2][4] * V[11];
132 K[5] = C[2][0] * V[3] + C[2][1] * V[4] + C[2][2] * V[5] + C[2][3] * V[8] + C[2][4] * V[12];
134 K[6] = C[3][0] * V[0] + C[3][1] * V[1] + C[3][2] * V[3] + C[3][3] * V[6] + C[3][4] * V[10];
135 K[7] = C[3][0] * V[1] + C[3][1] * V[2] + C[3][2] * V[4] + C[3][3] * V[7] + C[3][4] * V[11];
136 K[8] = C[3][0] * V[3] + C[3][1] * V[4] + C[3][2] * V[5] + C[3][3] * V[8] + C[3][4] * V[12];
137 K[9] = C[3][0] * V[6] + C[3][1] * V[7] + C[3][2] * V[8] + C[3][3] * V[9] + C[3][4] * V[13];
139 K[10] = C[4][0] * V[0] + C[4][1] * V[1] + C[4][2] * V[3] + C[4][3] * V[6] + C[4][4] * V[10];
140 K[11] = C[4][0] * V[1] + C[4][1] * V[2] + C[4][2] * V[4] + C[4][3] * V[7] + C[4][4] * V[11];
141 K[12] = C[4][0] * V[3] + C[4][1] * V[4] + C[4][2] * V[5] + C[4][3] * V[8] + C[4][4] * V[12];
142 K[13] = C[4][0] * V[6] + C[4][1] * V[7] + C[4][2] * V[8] + C[4][3] * V[9] + C[4][4] * V[13];
143 K[14] = C[4][0] * V[10] + C[4][1] * V[11] + C[4][2] * V[12] + C[4][3] * V[13] + C[4][4] * V[14];
148 r_out[0] = r_in[0] * C[0] + r_in[1] * C[1] + r_in[2] * C[3] + r_in[3] * C[6] + r_in[4] * C[10];
149 r_out[1] = r_in[0] * C[1] + r_in[1] * C[2] + r_in[2] * C[4] + r_in[3] * C[7] + r_in[4] * C[11];
150 r_out[2] = r_in[0] * C[3] + r_in[1] * C[4] + r_in[2] * C[5] + r_in[3] * C[8] + r_in[4] * C[12];
151 r_out[3] = r_in[0] * C[6] + r_in[1] * C[7] + r_in[2] * C[8] + r_in[3] * C[9] + r_in[4] * C[13];
152 r_out[4] = r_in[0] * C[10] + r_in[1] * C[11] + r_in[2] * C[12] + r_in[3] * C[13] + r_in[4] * C[14];
207 vector<unsigned short> FirstHit;
208 vector<unsigned short> LastHit;
209 vector<THitI> FirstHitIndex;
210 vector<THitI> LastHitIndex;
211 vector<unsigned short> Neighbour;
212 vector<float> TrackChi2;
216 vector<L1Track> vTracksNew;
217 vTracksNew.reserve(
vTracks.size());
218 vector<THitI> vRecoHitsNew;
221 FirstHit.resize(
vTracks.size());
222 LastHit.resize(
vTracks.size());
223 FirstHitIndex.resize(
vTracks.size());
224 LastHitIndex.resize(
vTracks.size());
226 TrackChi2.resize(
vTracks.size());
227 Neighbour.resize(
vTracks.size());
231 unsigned short ista = 0;
233 for (
unsigned short iTr = 0; iTr <
vTracks.size(); iTr++) {
234 FirstHitIndex[iTr] = start_hit;
236 FirstHit[iTr] = ista;
237 start_hit +=
vTracks[iTr].NHits - 1;
238 LastHitIndex[iTr] = start_hit;
244 Neighbour[iTr] = 50000;
245 TrackChi2[iTr] = 100000;
257 for (
int iTr = 0; iTr < static_cast<unsigned short>(
vTracks.size()); iTr++) {
258 if (
static_cast<int>(
vTracks[iTr].NHits) > 6)
260 for (
int jTr = 0; jTr < static_cast<unsigned short>(
vTracks.size()); jTr++) {
263 if (
static_cast<int>(
vTracks[iTr].NHits) > 6)
266 unsigned short dist = 0;
267 unsigned short stab = 0, staf = 0;
271 if (FirstHit[iTr] > LastHit[jTr]) {
272 dist = FirstHit[iTr] - LastHit[jTr];
274 stab = FirstHit[iTr];
324 if (FirstHit[jTr] > LastHit[iTr]) {
325 dist = FirstHit[jTr] - LastHit[iTr];
327 stab = FirstHit[jTr];
381 vStations[staf].fieldSlice.GetFieldValue(Tf.
x, Tf.
y, fBf);
382 vStations[stab].fieldSlice.GetFieldValue(Tb.
x, Tb.
y, fBb);
387 fvec zm = vStations[stam].z;
388 fvec xm = 0.5 * (Tf.
x + Tf.
tx * (zm - Tf.
z) + Tb.
x + Tb.
tx * (zm - Tb.
z));
389 fvec ym = 0.5 * (Tb.
y + Tb.
ty * (zm - Tb.
z) + Tb.
y + Tb.
ty * (zm - Tb.
z));
390 vStations[stam].fieldSlice.GetFieldValue(xm, ym, fBm);
391 fld.Set(fBb, Tb.
z, fBm, zm, fBf, Tf.
z);
393 fvec zMiddle = 0.5 * (Tb.
z + Tf.
z);
398 fvec Chi2Tracks = 0.f;
400 if (Chi2Tracks[0] > 50)
402 if (Chi2Tracks[0] < TrackChi2[iTr] || Chi2Tracks[0] < TrackChi2[jTr]) {
404 if (Neighbour[iTr] <
static_cast<unsigned short>(50000)) {
405 Neighbour[Neighbour[iTr]] = 50000;
406 TrackChi2[Neighbour[iTr]] = 100000;
407 IsNext[Neighbour[iTr]] = 0;
409 if (Neighbour[jTr] <
static_cast<unsigned short>(50000)) {
410 Neighbour[Neighbour[jTr]] = 50000;
411 TrackChi2[Neighbour[jTr]] = 100000;
412 IsNext[Neighbour[jTr]] = 0;
414 Neighbour[iTr] = jTr;
415 Neighbour[jTr] = iTr;
416 TrackChi2[iTr] = Chi2Tracks[0];
417 TrackChi2[jTr] = Chi2Tracks[0];
418 IsNext[iTr] = IsNextTemp;
419 IsNext[jTr] = (!IsNextTemp);
423 for (
int iTr = 0; iTr < static_cast<unsigned short>(
vTracks.size()); iTr++) {
427 vTracksNew.push_back(
vTracks[iTr]);
429 for (
THitI HI = FirstHitIndex[iTr]; HI <= LastHitIndex[iTr]; HI++)
432 if (Neighbour[iTr] < 50000) {
433 IsUsed[Neighbour[iTr]] = 1;
434 vTracksNew.back().NHits +=
vTracks[Neighbour[iTr]].NHits;
435 for (
THitI HI = FirstHitIndex[Neighbour[iTr]]; HI <= LastHitIndex[Neighbour[iTr]]; HI++)
440 for (
THitI HI = FirstHitIndex[iTr]; HI <= LastHitIndex[iTr]; HI++)
443 vTracks.resize(vTracksNew.size());
444 for (
unsigned short iTr = 0; iTr < vTracksNew.size(); iTr++)
445 vTracks[iTr] = vTracksNew[iTr];
447 for (
THitI iHi = 0; iHi < vRecoHitsNew.size(); iHi++)
void FilterTracks(fvec const r[5], fvec const C[15], fvec const m[5], fvec const V[15], fvec R[5], fvec W[15], fvec *chi2)