26void L1Algo::InvertCholetsky(
fvec a[15])
28 fvec d[5], uud, u[5][5];
29 for(
int i=0;
i<5;
i++)
32 for(
int j=0; j<5; j++)
36 for(
int i=0;
i<5;
i++)
39 for(
int j=0; j<
i; j++)
40 uud += u[j][
i]*u[j][
i]*
d[j];
41 uud = a[
i*(
i+3)/2] - uud;
43 fvec smallval = 1.e-12;
44 fvec initialised =
fvec( uud<smallval );
45 uud = ((!initialised) & uud) + (smallval & initialised);
50 for(
int j=
i+1; j<5; j++)
53 for(
int k=0; k<
i; k++)
54 uud += u[k][
i]*u[k][j]*
d[k];
55 uud = a[j*(j+1)/2+
i] - uud;
56 u[
i][j] =
d[
i]/u[
i][
i]*uud;
62 for(
int i=0;
i<5;
i++)
65 u[
i][
i] = 1.f/u[
i][
i];
67 for(
int i=0;
i<4;
i++)
69 u[
i][
i+1] = - u[
i][
i+1]*u[
i][
i]*u[
i+1][
i+1];
71 for(
int i=0;
i<3;
i++)
73 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];
75 for(
int i=0;
i<2;
i++)
77 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];
78 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]);
80 u[0][4] = u[0][2]*u1[2]*u[2][4] - u[0][4]*u[0][0]*u[4][4];
81 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]);
82 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]));
84 for(
int i=0;
i<5;
i++)
85 a[
i+10] = u[
i][4]*
d[4]*u[4][4];
86 for(
int i=0;
i<4;
i++)
87 a[
i+6] = u[
i][3]*u[3][3]*
d[3] + u[
i][4]*u[3][4]*
d[4];
88 for(
int i=0;
i<3;
i++)
89 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];
90 for(
int i=0;
i<2;
i++)
91 a[
i+1] = 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];
92 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] + u[0][4]*u[0][4]*
d[4];
95void L1Algo::MultiplySS(
fvec const C[15],
fvec const V[15],
fvec K[5][5])
97 K[0][0] = C[0]*V[ 0] + C[1]*V[ 1] + C[3]*V[ 3] + C[6]*V[ 6] + C[10]*V[10];
98 K[0][1] = C[0]*V[ 1] + C[1]*V[ 2] + C[3]*V[ 4] + C[6]*V[ 7] + C[10]*V[11];
99 K[0][2] = C[0]*V[ 3] + C[1]*V[ 4] + C[3]*V[ 5] + C[6]*V[ 8] + C[10]*V[12];
100 K[0][3] = C[0]*V[ 6] + C[1]*V[ 7] + C[3]*V[ 8] + C[6]*V[ 9] + C[10]*V[13];
101 K[0][4] = C[0]*V[10] + C[1]*V[11] + C[3]*V[12] + C[6]*V[13] + C[10]*V[14];
103 K[1][0] = C[1]*V[ 0] + C[2]*V[ 1] + C[4]*V[ 3] + C[7]*V[ 6] + C[11]*V[10];
104 K[1][1] = C[1]*V[ 1] + C[2]*V[ 2] + C[4]*V[ 4] + C[7]*V[ 7] + C[11]*V[11];
105 K[1][2] = C[1]*V[ 3] + C[2]*V[ 4] + C[4]*V[ 5] + C[7]*V[ 8] + C[11]*V[12];
106 K[1][3] = C[1]*V[ 6] + C[2]*V[ 7] + C[4]*V[ 8] + C[7]*V[ 9] + C[11]*V[13];
107 K[1][4] = C[1]*V[10] + C[2]*V[11] + C[4]*V[12] + C[7]*V[13] + C[11]*V[14];
109 K[2][0] = C[3]*V[ 0] + C[4]*V[ 1] + C[5]*V[ 3] + C[8]*V[ 6] + C[12]*V[10];
110 K[2][1] = C[3]*V[ 1] + C[4]*V[ 2] + C[5]*V[ 4] + C[8]*V[ 7] + C[12]*V[11];
111 K[2][2] = C[3]*V[ 3] + C[4]*V[ 4] + C[5]*V[ 5] + C[8]*V[ 8] + C[12]*V[12];
112 K[2][3] = C[3]*V[ 6] + C[4]*V[ 7] + C[5]*V[ 8] + C[8]*V[ 9] + C[12]*V[13];
113 K[2][4] = C[3]*V[10] + C[4]*V[11] + C[5]*V[12] + C[8]*V[13] + C[12]*V[14];
115 K[3][0] = C[6]*V[ 0] + C[7]*V[ 1] + C[8]*V[ 3] + C[9]*V[ 6] + C[13]*V[10];
116 K[3][1] = C[6]*V[ 1] + C[7]*V[ 2] + C[8]*V[ 4] + C[9]*V[ 7] + C[13]*V[11];
117 K[3][2] = C[6]*V[ 3] + C[7]*V[ 4] + C[8]*V[ 5] + C[9]*V[ 8] + C[13]*V[12];
118 K[3][3] = C[6]*V[ 6] + C[7]*V[ 7] + C[8]*V[ 8] + C[9]*V[ 9] + C[13]*V[13];
119 K[3][4] = C[6]*V[10] + C[7]*V[11] + C[8]*V[12] + C[9]*V[13] + C[13]*V[14];
121 K[4][0] = C[10]*V[ 0] + C[11]*V[ 1] + C[12]*V[ 3] + C[13]*V[ 6] + C[14]*V[10];
122 K[4][1] = C[10]*V[ 1] + C[11]*V[ 2] + C[12]*V[ 4] + C[13]*V[ 7] + C[14]*V[11];
123 K[4][2] = C[10]*V[ 3] + C[11]*V[ 4] + C[12]*V[ 5] + C[13]*V[ 8] + C[14]*V[12];
124 K[4][3] = C[10]*V[ 6] + C[11]*V[ 7] + C[12]*V[ 8] + C[13]*V[ 9] + C[14]*V[13];
125 K[4][4] = C[10]*V[10] + C[11]*V[11] + C[12]*V[12] + C[13]*V[13] + C[14]*V[14];
128void L1Algo::MultiplyMS(
fvec const C[5][5],
fvec const V[15],
fvec K[15])
130 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];
132 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];
133 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];
135 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];
136 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];
137 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];
139 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];
140 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];
141 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];
142 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];
144 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];
145 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];
146 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];
147 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];
148 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];
151void L1Algo::MultiplySR(
fvec const C[15],
fvec const r_in[5],
fvec r_out[5])
153 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];
154 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];
155 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];
156 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];
157 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];
163 for(
int i=0;
i<15;
i++)
173 for(
int i=0;
i<5;
i++) dzeta[
i] =
m[
i] - r[
i];
177 for(
int i=0;
i<5;
i++)
185 for(
int i=0;
i< 15;
i++)
189 for(
int i=0;
i<5;
i++)
192 for(
int j=0; j<5; j++)
193 kd += K[
i][j]*dzeta[j];
200 MultiplySR(S, dzeta, S_dzeta);
201 *chi2 = dzeta[0]*S_dzeta[0] + dzeta[1]*S_dzeta[1] + dzeta[2]*S_dzeta[2] + dzeta[3]*S_dzeta[3] + dzeta[4]*S_dzeta[4];
205void L1Algo::CAMergeClones()
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++)
235 FirstHitIndex[iTr] = start_hit;
238 start_hit +=
vTracks[iTr].NHits-1;
239 LastHitIndex[iTr] = start_hit;
245 Neighbour[iTr] = 50000;
246 TrackChi2[iTr] = 100000;
258 for(
int iTr = 0; iTr < static_cast<unsigned short>(
vTracks.size()); iTr++)
260 if(
static_cast<int>(
vTracks[iTr].NHits) > 6)
continue;
261 for(
int jTr = 0; jTr < static_cast<unsigned short>(
vTracks.size()); jTr++)
263 if(iTr == jTr)
continue;
264 if(
static_cast<int>(
vTracks[iTr].NHits) > 6)
continue;
266 unsigned short dist = 0;
267 unsigned short stab=0, staf=0;
271 if(FirstHit[iTr] > LastHit[jTr])
273 dist = FirstHit[iTr] - LastHit[jTr];
275 stab = FirstHit[iTr];
324 if(FirstHit[jTr] > LastHit[iTr])
326 dist = FirstHit[jTr] - LastHit[iTr];
328 stab = FirstHit[jTr];
376 if(
dist == 0)
continue;
381 vStations[staf].fieldSlice.GetFieldValue( Tf.
x, Tf.
y, fBf );
382 vStations[stab].fieldSlice.GetFieldValue( Tb.
x, Tb.
y, fBb );
383 if(
dist > 1) stam = staf + 1;
384 else stam = staf - 1;
385 fvec zm = vStations[stam].z;
386 fvec xm = 0.5*(Tf.
x + Tf.
tx*(zm - Tf.
z) + Tb.
x + Tb.
tx*(zm - Tb.
z));
387 fvec ym = 0.5*(Tb.
y + Tb.
ty*(zm - Tb.
z) + Tb.
y + Tb.
ty*(zm - Tb.
z));
388 vStations[stam].fieldSlice.GetFieldValue( xm, ym, fBm );
389 fld.Set( fBb, Tb.
z, fBm, zm, fBf, Tf.
z );
391 fvec zMiddle = 0.5*(Tb.
z + Tf.
z);
396 fvec Chi2Tracks = 0.f;
397 FilterTracks(&(Tf.
x),&(Tf.
C00),&(Tb.
x),&(Tb.
C00),0,0,&Chi2Tracks);
398 if(Chi2Tracks[0] > 50 )
continue;
399 if(Chi2Tracks[0] < TrackChi2[iTr] || Chi2Tracks[0] < TrackChi2[jTr])
402 if(Neighbour[iTr] <
static_cast<unsigned short>(50000))
404 Neighbour[Neighbour[iTr]] = 50000;
405 TrackChi2[Neighbour[iTr]] = 100000;
406 IsNext[Neighbour[iTr]] = 0;
408 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++)
425 if(IsUsed[iTr])
continue;
427 vTracksNew.push_back(
vTracks[iTr]);
429 for(
THitI HI = FirstHitIndex[iTr]; HI <= LastHitIndex[iTr]; HI++)
432 if(Neighbour[iTr] < 50000)
434 IsUsed[Neighbour[iTr]] = 1;
435 vTracksNew.back().NHits +=
vTracks[Neighbour[iTr]].NHits;
436 for(
THitI HI = FirstHitIndex[Neighbour[iTr]]; HI <= LastHitIndex[Neighbour[iTr]]; HI++)
441 for(
THitI HI = FirstHitIndex[iTr]; HI <= LastHitIndex[iTr]; HI++)
444 vTracks.resize(vTracksNew.size());
445 for(
unsigned short iTr=0; iTr < vTracksNew.size(); iTr++)
446 vTracks[iTr] = vTracksNew[iTr];
448 for(
THitI iHi=0; iHi < vRecoHitsNew.size(); iHi++)
vector< Double_t > dist(vector< Double_t > qp, Double_t mu)
vector< Double_t > W(vector< Double_t > dist, Double_t sig)
const Float_t d
Z-ccordinate of the first GEM-station.
friend F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 fabs(const F32vec4 &a)
vector< unsigned char > vSFlag
L1Station vStations[MaxNStations] _fvecalignment
vector< L1Track > vTracks
--— Output data --—
vector< THitI > vRecoHits
vector< L1StsHit > vStsHits
void L1KFTrackFitter(bool extrapolateToTheEndOfSTS=false)