BmnRoot
Loading...
Searching...
No Matches
L1TrackFitter.cxx
Go to the documentation of this file.
1/*
2 *====================================================================
3 *
4 * SIMD Kalman filter(KF) track fitter
5 *
6 * Authors: M.Zyzak, I.Kulakov
7 * Primary authors: I.Kisel, S.Gorbunov
8 *
9 * e-mail : I.Kisel@gsi.de, M.Zyzak@gsi.de
10 *
11 *====================================================================
12 */
13
14
15
16#include "L1Algo.h"
17#include "L1TrackPar.h"
18#include "L1Extrapolation.h"
19#include "L1AddMaterial.h"
20#include "L1Filtration.h" // for KFTrackFitter_simple
21
22#include <iostream>
23#include <vector>
24
25using std::cout;
26using std::endl;
27using std::vector;
28
29
31 const fvec c_light = 0.000299792458, c_light_i = 1./c_light;
32 const fvec ZERO = 0.;
33 const fvec ONE = 1.;
34 const fvec vINF = 0.1;
35}
36using namespace NS_L1TrackFitter;
37
38//----------------------------------------------------------------------------------------------
39
41void L1Algo::KFTrackFitter_simple() // TODO: Add pipe.
42{
43// cout << " Start KF Track Fitter " << endl;
44 cout << " !!! L1Algo::KFTrackFitter_simple !!! " << endl; exit(9); //AZ-220223 - not called
45 int start_hit = 0; // for interation in vRecoHits[]
46
47 for(unsigned int itrack = 0; itrack < vTracks.size(); itrack++)
48 {
49 L1Track &t = vTracks[itrack]; // current track
50
51 // get hits of current track
52 std::vector<unsigned short int> hits; // array of indeses of hits of current track
53 hits.clear();
54 int nHits = t.NHits;
55 for( int i = 0; i < nHits; i++ ){
56 hits.push_back( vRecoHits[start_hit++]);
57 }
58
59 L1TrackPar T; // fitting parametr coresponding to current track
60
61 fvec qp0 = 0;
62 //fvec qp0 = 2./t.Momentum;
63 for(int iter=0; iter<3; iter++ )
64 {
65 //cout<<" Back 1"<<endl;
66 { // fit backward
67 L1StsHit &hit0 = vStsHits[hits[nHits-1]];
68 L1StsHit &hit1 = vStsHits[hits[nHits-2]];
69 L1StsHit &hit2 = vStsHits[hits[nHits-3]];
70
71 int ista0 = vSFlag[hit0.f]/4;
72 int ista1 = vSFlag[hit1.f]/4;
73 int ista2 = vSFlag[hit2.f]/4;
74
75 //cout<<"back: ista012="<<ista0<<" "<<ista1<<" "<<ista2<<endl;
76 L1Station &sta0 = vStations[ista0];
77 L1Station &sta1 = vStations[ista1];
78 L1Station &sta2 = vStations[ista2];
79
80 fvec u0 = static_cast<fscal>( vStsStrips[hit0.f] );
81 fvec v0 = static_cast<fscal>( vStsStripsB[hit0.b] );
82 fvec x0,y0;
83 StripsToCoor(u0, v0, x0, y0, sta0);
84 fvec z0 = vStsZPos[hit0.iz];
85
86 fvec u1 = static_cast<fscal>( vStsStrips[hit1.f] );
87 fvec v1 = static_cast<fscal>( vStsStripsB[hit1.b] );
88 fvec x1,y1;
89 StripsToCoor(u1, v1, x1, y1, sta1);
90 fvec z1 = vStsZPos[hit1.iz];
91
92 fvec u2 = static_cast<fscal>( vStsStrips[hit2.f] );
93 fvec v2 = static_cast<fscal>( vStsStripsB[hit2.b] );
94 fvec x2,y2;
95 StripsToCoor(u2, v2, x2, y2, sta2);
96 //fvec z2 = vStsZPos[hit2.iz];
97
98 fvec dzi = 1./(z1-z0);
99
100 const fvec vINF = .1;
101 T.x = x0;
102 T.y = y0;
103 if( iter==0 ){
104 T.tx = (x1-x0)*dzi;
105 T.ty = (y1-y0)*dzi;
106 }
107
108 T.qp = qp0;
109 T.z = z0;
110 T.chi2 = 0.;
111 T.NDF = 2.;
112 T.C00 = sta0.XYInfo.C00;
113 T.C10 = sta0.XYInfo.C10;
114 T.C11 = sta0.XYInfo.C11;
115
116 T.C20 = T.C21 = 0;
117 T.C30 = T.C31 = T.C32 = 0;
118 T.C40 = T.C41 = T.C42 = T.C43 = 0;
119 T.C22 = T.C33 = vINF;
120 T.C44 = 1.;
121
122// static L1FieldValue fB0, fB1, fB2 _fvecalignment;
123// static L1FieldRegion fld _fvecalignment;
124 L1FieldValue fB0, fB1, fB2 _fvecalignment;
126 fvec fz0 = sta1.z; // suppose field is smoth
127 fvec fz1 = sta2.z;
128 fvec fz2 = sta0.z;
129
130
131 sta1.fieldSlice.GetFieldValue( x1, y1, fB0 );
132 sta2.fieldSlice.GetFieldValue( x2, y2, fB1 );
133 sta0.fieldSlice.GetFieldValue( x0, y0, fB2 );
134
135 fld.Set( fB2, fz2, fB1, fz1, fB0, fz0 );
136
137 int ista = ista2;
138 //cout<<"\nfit, iter=:"<<iter<<endl;
139 for( int i = nHits-2; i >= 0; i--){
140 // if( fabs(T.qp[0])>2. ) break; // iklm. Don't know it need for
141 L1StsHit &hit = vStsHits[hits[i]];
142 ista = vSFlag[hit.f]/4;
143
144 L1Station &sta = vStations[ista];
145
146 L1Extrapolate( T, vStsZPos[hit.iz], qp0, fld );
147// T.L1Extrapolate( sta.z, qp0, fld );
148// L1Extrapolate( T, hit.z, qp0, fld );
149 L1AddMaterial( T, sta.materialInfo, qp0 );
150// if (ista==NMvdStations-1) L1AddPipeMaterial( T, qp0);
151
152 fvec u = static_cast<fscal>( vStsStrips[hit.f] );
153 fvec v = static_cast<fscal>( vStsStripsB[hit.b] );
154 L1Filter( T, sta.frontInfo, u );
155 L1Filter( T, sta.backInfo, v );
156 fB0 = fB1;
157 fB1 = fB2;
158 fz0 = fz1;
159 fz1 = fz2;
160 fvec x,y;
161 StripsToCoor(u, v, x, y, sta);
162 sta.fieldSlice.GetFieldValue( x, y, fB2 );
163
164 fz2 = sta.z;
165 fld.Set( fB2, fz2, fB1, fz1, fB0, fz0 );
166 } // i
167
168 // write received parametres in track
169 t.TFirst[0] = T.x[0];
170 t.TFirst[1] = T.y[0];
171 t.TFirst[2] = T.tx[0];
172 t.TFirst[3] = T.ty[0];
173 t.TFirst[4] = T.qp[0];
174 t.TFirst[5] = T.z[0];
175
176 t.CFirst[0] = T.C00[0];
177 t.CFirst[1] = T.C10[0];
178 t.CFirst[2] = T.C11[0];
179 t.CFirst[3] = T.C20[0];
180 t.CFirst[4] = T.C21[0];
181 t.CFirst[5] = T.C22[0];
182 t.CFirst[6] = T.C30[0];
183 t.CFirst[7] = T.C31[0];
184 t.CFirst[8] = T.C32[0];
185 t.CFirst[9] = T.C33[0];
186 t.CFirst[10] = T.C40[0];
187 t.CFirst[11] = T.C41[0];
188 t.CFirst[12] = T.C42[0];
189 t.CFirst[13] = T.C43[0];
190 t.CFirst[14] = T.C44[0];
191
192 t.chi2 = T.chi2[0];
193 t.NDF = static_cast<int>( T.NDF[0] );
194 qp0 = T.qp[0];
195 } // fit backward
196
197 // fit forward
198 {
199 //T.qp = first_trip->GetQpOrig(MaxInvMom);
200
201 L1StsHit &hit0 = vStsHits[hits[0]];
202 L1StsHit &hit1 = vStsHits[hits[1]];
203 L1StsHit &hit2 = vStsHits[hits[2]];
204
205 int ista0 = GetFStation( vSFlag[hit0.f] );
206 int ista1 = GetFStation( vSFlag[hit1.f] );
207 int ista2 = GetFStation( vSFlag[hit2.f] );
208
209 L1Station &sta0 = vStations[ista0];
210 L1Station &sta1 = vStations[ista1];
211 L1Station &sta2 = vStations[ista2];
212
213 fvec u0 = static_cast<fscal>( vStsStrips[hit0.f] );
214 fvec v0 = static_cast<fscal>( vStsStripsB[hit0.b] );
215 fvec x0,y0;
216 StripsToCoor(u0, v0, x0, y0, sta0);
217 fvec z0 = vStsZPos[hit0.iz];
218
219 fvec u1 = static_cast<fscal>( vStsStrips[hit1.f] );
220 fvec v1 = static_cast<fscal>( vStsStripsB[hit1.b] );
221 fvec x1,y1;
222 StripsToCoor(u1, v1, x1, y1, sta1);
223 //fvec z1 = vStsZPos[hit1.iz];
224
225 fvec u2 = static_cast<fscal>( vStsStrips[hit2.f] );
226 fvec v2 = static_cast<fscal>( vStsStripsB[hit2.b] );
227 fvec x2,y2;
228 StripsToCoor(u2, v2, x2, y2, sta2);
229 //fvec z2 = vStsZPos[hit2.iz];
230
231 //fvec dzi = 1./(z1-z0);
232
233 //fvec qp0 = first_trip->GetQpOrig(MaxInvMom);
234
235 const fvec vINF = .1;
236 T.chi2 = 0.;
237 T.NDF = 2.;
238 T.x = x0;
239 T.y = y0;
240// T.tx = (x1-x0)*dzi;
241// T.ty = (y1-y0)*dzi;
242// qp0 = 0;
243 T.qp = qp0;
244 T.z = z0;
245 T.C00 = sta0.XYInfo.C00;
246 T.C10 = sta0.XYInfo.C10;
247 T.C11 = sta0.XYInfo.C11;
248 T.C20 = T.C21 = 0;
249 T.C30 = T.C31 = T.C32 = 0;
250 T.C40 = T.C41 = T.C42 = T.C43 = 0;
251 T.C22 = T.C33 = vINF;
252 T.C44 = 1.;
253
254// static L1FieldValue fB0, fB1, fB2 _fvecalignment;
255// static L1FieldRegion fld _fvecalignment;
256 L1FieldValue fB0, fB1, fB2 _fvecalignment;
258 fvec fz0 = sta1.z;
259 fvec fz1 = sta2.z;
260 fvec fz2 = sta0.z;
261
262 sta1.fieldSlice.GetFieldValue( x1, y1, fB0 );
263 sta2.fieldSlice.GetFieldValue( x2, y2, fB1 );
264 sta0.fieldSlice.GetFieldValue( x0, y0, fB2 );
265
266 fld.Set( fB2, fz2, fB1, fz1, fB0, fz0 );
267 int ista = ista2;
268
269 for( int i=1; i<nHits; i++){
270 L1StsHit &hit = vStsHits[hits[i]];
271 ista = vSFlag[hit.f]/4;
272 L1Station &sta = vStations[ista];
273 fvec u = static_cast<fscal>( vStsStrips[hit.f] );
274 fvec v = static_cast<fscal>( vStsStripsB[hit.b] );
275
276 L1Extrapolate( T, vStsZPos[hit.iz], qp0, fld );
277// T.L1Extrapolate( sta.z, qp0, fld );
278// L1Extrapolate( T, hit.z, qp0, fld );
279 L1AddMaterial( T, sta.materialInfo, qp0 );
280// if (ista==NMvdStations) L1AddPipeMaterial( T, qp0);
281 L1Filter( T, sta.frontInfo, u );
282 L1Filter( T, sta.backInfo, v );
283
284 fB0 = fB1;
285 fB1 = fB2;
286 fz0 = fz1;
287 fz1 = fz2;
288 fvec x,y;
289 StripsToCoor(u, v, x, y, sta);
290 sta.fieldSlice.GetFieldValue( x, y, fB2 );
291 fz2 = sta.z;
292 fld.Set( fB2, fz2, fB1, fz1, fB0, fz0 );
293 }
294
295 // write received parametres in track
296 t.TLast[0] = T.x[0];
297 t.TLast[1] = T.y[0];
298 t.TLast[2] = T.tx[0];
299 t.TLast[3] = T.ty[0];
300 t.TLast[4] = T.qp[0];
301 t.TLast[5] = T.z[0];
302
303 t.CLast[0] = T.C00[0];
304 t.CLast[1] = T.C10[0];
305 t.CLast[2] = T.C11[0];
306 t.CLast[3] = T.C20[0];
307 t.CLast[4] = T.C21[0];
308 t.CLast[5] = T.C22[0];
309 t.CLast[6] = T.C30[0];
310 t.CLast[7] = T.C31[0];
311 t.CLast[8] = T.C32[0];
312 t.CLast[9] = T.C33[0];
313 t.CLast[10] = T.C40[0];
314 t.CLast[11] = T.C41[0];
315 t.CLast[12] = T.C42[0];
316 t.CLast[13] = T.C43[0];
317 t.CLast[14] = T.C44[0];
318
319 t.chi2 += T.chi2[0];
320 t.NDF += static_cast<int>( T.NDF[0] );
321 }
322 qp0 = T.qp[0];
323 }
324 } // for(int itrack
325}
326
327//----------------------------------------------------------------------------------------------
328
329void L1Algo::L1KFTrackFitter( bool extrapolateToTheEndOfSTS )
330{
331 //cout << " Start L1 Track Fitter " << endl;
332 int start_hit = 0; // for interation in vRecoHits[]
333
334// static L1FieldValue fB0, fB1, fB2 _fvecalignment;
335// static L1FieldRegion fld _fvecalignment;
336 L1FieldValue fB0, fB1, fB2 _fvecalignment;
338
339 const int nHits = NStations;
340 int iVec=0, i=0;
341 int nTracks_SIMD = fvecLen;
342 L1TrackPar T; // fitting parametr coresponding to current track
343
344 L1Track *t[fvecLen];
345
346 L1Station *sta = vStations;
348 fvec du[MaxNStations], dv[MaxNStations]; //AZ
349 fvec x_first, y_first, x_last, y_last;
351 fvec y_temp, x_temp;
352 fvec fz0, fz1, fz2, dz, z_start, z_end;
354
355 fvec ZSta[MaxNStations];
356 for(int iHit = 0; iHit<nHits; iHit++)
357 {
358 ZSta[iHit] = sta[iHit].z;
359 }
360
361 unsigned short N_vTracks = vTracks.size();
362
363 for(unsigned short itrack = 0; itrack < N_vTracks; itrack+=fvecLen)
364 {
365 if(N_vTracks - itrack < static_cast<unsigned short>(fvecLen))
366 nTracks_SIMD = N_vTracks - itrack;
367
368 for(i=0; i<nTracks_SIMD; i++)
369 t[i] = & vTracks[itrack+i]; // current track
370
371 // get hits of current track
372 for(i=0; i<nHits; i++)
373 {
374 w[i] = ZERO;
375 z[i] = ZSta[i];
376 }
377
378 for(iVec=0; iVec<nTracks_SIMD; iVec++)
379 {
380 int nHitsTrack = t[iVec]->NHits;
381 //cout << "AZ: hits = " << nHitsTrack << endl;
382 int iSta[MaxNStations];
383 for(i = 0; i < nHitsTrack; i++ )
384 {
385 L1StsHit &hit = vStsHits[vRecoHits[start_hit++]];
386 const int ista = vSFlag[hit.f]/4;
387 iSta[i] = ista;
388 w[ista][iVec] = 1.;
389
390#ifdef AZ
391 //AZ-230223
392 int ihp = vRecoHits[start_hit-1];
393 L1HitPoint &hp = vAllHitPoints[ihp];
394 x_temp = hp.X();
395 y_temp = hp.Y();
396 u[ista][iVec] = hp.U();
397 v[ista][iVec] = hp.V();
398 du[ista][iVec] = hp.DU() * hp.DU();
399 dv[ista][iVec] = hp.DV() * hp.DV();
400#else
401 u[ista][iVec] = vStsStrips[hit.f] ;
402 v[ista][iVec] = vStsStripsB[hit.b];
403 du[ista][iVec] = vStsStrips[hit.f].errf() * vStsStrips[hit.f].errf(); //AZ
404 dv[ista][iVec] = vStsStripsB[hit.b].errf() * vStsStripsB[hit.b].errf(); //AZ
405 StripsToCoor(u[ista], v[ista], x_temp, y_temp, sta[ista]);
406#endif
407 x[ista][iVec] = x_temp[iVec];
408 y[ista][iVec] = y_temp[iVec];
409 z[ista][iVec] = vStsZPos[hit.iz];
410 sta[ista].fieldSlice.GetFieldValue( x[ista], y[ista], fB_temp );
411 fB[ista].x[iVec] = fB_temp.x[iVec];
412 fB[ista].y[iVec] = fB_temp.y[iVec];
413 fB[ista].z[iVec] = fB_temp.z[iVec];
414 if(i == 0) {
415 z_start[iVec] = z[ista][iVec];
416 x_first[iVec] = x[ista][iVec];
417 y_first[iVec] = y[ista][iVec];
418 }
419 else if(i == nHitsTrack-1) {
420 z_end[iVec] = z[ista][iVec];
421 x_last[iVec] = x[ista][iVec];
422 y_last[iVec] = y[ista][iVec];
423 }
424 }
425
426 // get field integrals
427#if 0
428 for(i = nHits - 1; i >= 0; i-- ){
429 L1Station &st = vStations[i];
430 Sy[i] = st.Sy;
431 }
432#else
433 fscal prevZ = z_end[iVec];
434 fscal cursy = 0., curSy = 0.;
435 for(i = nHitsTrack - 1; i >= 0; i-- ){
436 const int ista = iSta[i];
437 L1Station &st = vStations[ista];
438 const fscal curZ = z[ista][iVec];
439 fscal dZ = curZ - prevZ;
440 fscal By = st.fieldSlice.cy[0][0];
441 curSy += dZ*cursy + dZ*dZ*By/2.;
442 cursy += dZ*By;
443 Sy[ista][iVec] = curSy;
444 prevZ = curZ;
445 }
446#endif // 0
447 }
448
449//fit backward
450
451 GuessVec( T, x, y, z, Sy, w, nHits, &z_end);
452
453 for( int iter = 0; iter < 2; iter++ ) { // 1.5 iterations
454
455 fvec qp0 = T.qp;
456
457 i = nHits-1;
458
459 FilterFirst( T, x_last, y_last, sta[i] );
460
461 // L1AddMaterial( T, sta[i].materialInfo, qp0 );
462
463 fz1 = z[i];
464 sta[i].fieldSlice.GetFieldValue( T.x, T.y, fB1 );
465 fB1.Combine( fB[i], w[i] );
466
467 fz2 = z[i-2];
468 dz = fz2-fz1;
469 sta[i].fieldSlice.GetFieldValue( T.x + T.tx*dz, T.y + T.ty*dz, fB2 );
470 fB2.Combine( fB[i-2], w[i-2] );
471 fld.Set( fB2, fz2, fB1, fz1, fB0, fz0 );
472 for( --i; i>=0; i-- )
473 {
474 fz0 = z[i];
475 dz = (fz1-fz0);
476 sta[i].fieldSlice.GetFieldValue( T.x - T.tx*dz, T.y - T.ty*dz, fB0 );
477 fB0.Combine( fB[i], w[i] );
478 fld.Set( fB0, fz0, fB1, fz1, fB2, fz2 );
479
480 //fvec zero = ZERO;
481 fvec initialised = fvec(z[i] < z_end) & fvec(z_start <= z[i]);
482 // cout << z_start << " " << z_end << " " << initialised << endl;
483 fvec w1 = (w[i] & (initialised));
484 fvec wIn = (ONE & (initialised));
485
486 L1Extrapolate( T, z[i], qp0, fld, &w1 );
487 if(i == NMvdStations - 1) L1AddPipeMaterial( T, qp0, wIn );
488#ifdef USE_RL_TABLE
489 L1AddMaterial( T, fRadThick[i].GetRadThick(T.x, T.y), qp0, wIn );
490#else
491 L1AddMaterial( T, sta[i].materialInfo, qp0, wIn );
492#endif
493 //L1Filter( T, sta[i].frontInfo, u[i], w1 );
494 //L1Filter( T, sta[i].backInfo, v[i], w1 );
495 L1Filter( T, sta[i].frontInfo, u[i], w1, &du[i]); //AZ
496 L1Filter( T, sta[i].backInfo, v[i], w1, &dv[i]); //AZ
497 fB2 = fB1;
498 fz2 = fz1;
499 fB1 = fB0;
500 fz1 = fz0;
501 }
502 // L1AddHalfMaterial( T, sta[i].materialInfo, qp0 );
503
504 for(iVec=0; iVec<nTracks_SIMD; iVec++)
505 {
506 t[iVec]->TFirst[0] = T.x[iVec];
507 t[iVec]->TFirst[1] = T.y[iVec];
508 t[iVec]->TFirst[2] = T.tx[iVec];
509 t[iVec]->TFirst[3] = T.ty[iVec];
510 t[iVec]->TFirst[4] = T.qp[iVec];
511 t[iVec]->TFirst[5] = T.z[iVec];
512
513 t[iVec]->CFirst[0] = T.C00[iVec];
514 t[iVec]->CFirst[1] = T.C10[iVec];
515 t[iVec]->CFirst[2] = T.C11[iVec];
516 t[iVec]->CFirst[3] = T.C20[iVec];
517 t[iVec]->CFirst[4] = T.C21[iVec];
518 t[iVec]->CFirst[5] = T.C22[iVec];
519 t[iVec]->CFirst[6] = T.C30[iVec];
520 t[iVec]->CFirst[7] = T.C31[iVec];
521 t[iVec]->CFirst[8] = T.C32[iVec];
522 t[iVec]->CFirst[9] = T.C33[iVec];
523 t[iVec]->CFirst[10] = T.C40[iVec];
524 t[iVec]->CFirst[11] = T.C41[iVec];
525 t[iVec]->CFirst[12] = T.C42[iVec];
526 t[iVec]->CFirst[13] = T.C43[iVec];
527 t[iVec]->CFirst[14] = T.C44[iVec];
528
529 t[iVec]->chi2 = T.chi2[iVec];
530 t[iVec]->NDF = (int)T.NDF[iVec];
531 }
532
533 if ( iter == 1 ) continue; // only 1.5 iterations
534 // fit forward
535
536 i = 0;
537 FilterFirst( T, x_first, y_first, sta[i] ); // TODO different station. won't work with MVD
538 // L1AddMaterial( T, sta[i].materialInfo, qp0 );
539 qp0 = T.qp;
540
541 fz1 = z[i];
542 sta[i].fieldSlice.GetFieldValue( T.x, T.y, fB1 );
543 fB1.Combine( fB[i], w[i] );
544
545 fz2 = z[i+2];
546 dz = fz2-fz1;
547 sta[i].fieldSlice.GetFieldValue( T.x + T.tx*dz, T.y + T.ty*dz, fB2 );
548 fB2.Combine( fB[i+2], w[i+2] );
549 fld.Set( fB2, fz2, fB1, fz1, fB0, fz0 );
550
551 for( ++i; i<nHits; i++ )
552 {
553 fz0 = z[i];
554 dz = (fz1-fz0);
555 sta[i].fieldSlice.GetFieldValue( T.x - T.tx*dz, T.y - T.ty*dz, fB0 );
556 fB0.Combine( fB[i], w[i] );
557 fld.Set( fB0, fz0, fB1, fz1, fB2, fz2 );
558
559 //fvec zero = ZERO;
560 fvec initialised = fvec(z[i] <= z_end) & fvec(z_start < z[i]);
561 fvec w1 = (w[i] & (initialised));
562 fvec wIn = (ONE & (initialised));
563
564 L1Extrapolate( T, z[i], qp0, fld,&w1 );
565 if(i == NMvdStations) L1AddPipeMaterial( T, qp0, wIn );
566#ifdef USE_RL_TABLE
567 L1AddMaterial( T, fRadThick[i].GetRadThick(T.x, T.y), qp0, wIn );
568#else
569 L1AddMaterial( T, sta[i].materialInfo, qp0, wIn );
570#endif
571 //L1Filter( T, sta[i].frontInfo, u[i], w1 );
572 //L1Filter( T, sta[i].backInfo, v[i], w1 );
573 L1Filter( T, sta[i].frontInfo, u[i], w1, &du[i]); //AZ
574 L1Filter( T, sta[i].backInfo, v[i], w1, &dv[i]); //AZ
575
576 fB2 = fB1;
577 fz2 = fz1;
578 fB1 = fB0;
579 fz1 = fz0;
580 }
581 // L1AddHalfMaterial( T, sta[i].materialInfo, qp0 );
582
583 { // extrapolate to 1 m
584 L1TrackPar Tout = T;
585 if ( extrapolateToTheEndOfSTS ) {
586 // extrapolate to the last station
587 i = 0;
588 fz1 = z[i];
589 sta[i].fieldSlice.GetFieldValue( T.x, Tout.y, fB1 );
590 fB1.Combine( fB[i], w[i] );
591
592 fz2 = z[i+2];
593 dz = fz2-Tout.z;
594 sta[i].fieldSlice.GetFieldValue( Tout.x + Tout.tx*dz, Tout.y + Tout.ty*dz, fB2 );
595 fB2.Combine( fB[i+2], w[i+2] );
596 fld.Set( fB2, fz2, fB1, fz1, fB0, fz0 );
597
598 for( ++i; i<NStations; i++ )
599 {
600 fz0 = z[i];
601 dz = (Tout.z-fz0);
602 sta[i].fieldSlice.GetFieldValue( Tout.x - Tout.tx*dz, Tout.y - Tout.ty*dz, fB0 );
603 fB0.Combine( fB[i], w[i] );
604 fld.Set( fB0, fz0, fB1, fz1, fB2, fz2 );
605
606 //fvec zero = ZERO;
607 fvec initialised = fvec(z[i] > z_end);
608 fvec wIn = (ONE & (initialised));
609
610 L1Extrapolate( Tout, z[i], qp0, fld,&wIn );
611 if(i == NMvdStations) L1AddPipeMaterial( Tout, qp0, wIn );
612#ifdef USE_RL_TABLE
613 L1AddMaterial( Tout, fRadThick[i].GetRadThick(Tout.x, Tout.y), qp0, wIn );
614#else
615 L1AddMaterial( Tout, sta[i].materialInfo, qp0, wIn );
616#endif
617
618 fB2 = fB1;
619 fz2 = fz1;
620 fB1 = fB0;
621 fz1 = fz0;
622 }
623 // extrapolate to 1m
624 {
625 const fvec zFinal = 100.f;
626 i = NStations - 1;
627 fvec initialised = fvec(zFinal > Tout.z); // 3cm safe distance, needed because of diff position of sensors
628 L1Extrapolate( Tout, zFinal, qp0, fld, &initialised ); // extra with old field
629 }
630
631 }
632 for(iVec=0; iVec<nTracks_SIMD; iVec++)
633 {
634 t[iVec]->TLast[0] = Tout.x[iVec];
635 t[iVec]->TLast[1] = Tout.y[iVec];
636 t[iVec]->TLast[2] = Tout.tx[iVec];
637 t[iVec]->TLast[3] = Tout.ty[iVec];
638 t[iVec]->TLast[4] = Tout.qp[iVec];
639 t[iVec]->TLast[5] = Tout.z[iVec];
640
641 t[iVec]->CLast[0] = Tout.C00[iVec];
642 t[iVec]->CLast[1] = Tout.C10[iVec];
643 t[iVec]->CLast[2] = Tout.C11[iVec];
644 t[iVec]->CLast[3] = Tout.C20[iVec];
645 t[iVec]->CLast[4] = Tout.C21[iVec];
646 t[iVec]->CLast[5] = Tout.C22[iVec];
647 t[iVec]->CLast[6] = Tout.C30[iVec];
648 t[iVec]->CLast[7] = Tout.C31[iVec];
649 t[iVec]->CLast[8] = Tout.C32[iVec];
650 t[iVec]->CLast[9] = Tout.C33[iVec];
651 t[iVec]->CLast[10] = Tout.C40[iVec];
652 t[iVec]->CLast[11] = Tout.C41[iVec];
653 t[iVec]->CLast[12] = Tout.C42[iVec];
654 t[iVec]->CLast[13] = Tout.C43[iVec];
655 t[iVec]->CLast[14] = Tout.C44[iVec];
656
657 t[iVec]->chi2 = Tout.chi2[iVec];
658 t[iVec]->NDF = (int)Tout.NDF[iVec];
659 }
660 }
661 } // iter
662 }
663}
664
665//----------------------------------------------------------------------------------------------
666
667void L1Algo::GuessVec( L1TrackPar &t, fvec *xV, fvec *yV, fvec *zV, fvec *Sy, fvec *wV, int NHits, fvec *zCur )
668 // gives nice initial approximation for x,y,tx,ty - almost same as KF fit. qp - is shifted by 4%, residual - ~3.5% (KF fit residual - 1%).
669{
670 fvec A0, A1=ZERO, A2=ZERO, A3=ZERO, A4=ZERO, A5=ZERO, a0, a1=ZERO, a2=ZERO,
671 b0, b1=ZERO, b2=ZERO;
672 fvec z0, x, y, z, S, w, wz, wS;
673
674 int i=NHits-1;
675 if(zCur)
676 z0 = *zCur;
677 else
678 z0 = zV[i];
679 w = wV[i];
680 A0 = w;
681 a0 = w*xV[i];
682 b0 = w*yV[i];
683 for( i=0 ; i<NHits; i++ ){
684 x = xV[i];
685 y = yV[i];
686 w = wV[i];
687 z = zV[i] - z0;
688 S = Sy[i];
689 wz = w*z;
690 wS = w*S;
691 A0+=w;
692 A1+=wz; A2+=wz*z;
693 A3+=wS; A4+=wS*z; A5+=wS*S;
694 a0+=w*x; a1+=wz*x; a2+=wS*x;
695 b0+=w*y; b1+=wz*y; b2+=wS*y;
696 }
697
698 fvec A3A3 = A3*A3;
699 fvec A3A4 = A3*A4;
700 fvec A1A5 = A1*A5;
701 fvec A2A5 = A2*A5;
702 fvec A4A4 = A4*A4;
703
704 fvec det = rcp(-A2*A3A3 + A1*( A3A4+A3A4 - A1A5) + A0*(A2A5-A4A4));
705 fvec Ai0 = ( -A4A4 + A2A5 );
706 fvec Ai1 = ( A3A4 - A1A5 );
707 fvec Ai2 = ( -A3A3 + A0*A5 );
708 fvec Ai3 = ( -A2*A3 + A1*A4 );
709 fvec Ai4 = ( A1*A3 - A0*A4 );
710 fvec Ai5 = ( -A1*A1 + A0*A2 );
711
712 fvec L, L1;
713 t.x = (Ai0*a0 + Ai1*a1 + Ai3*a2)*det;
714 t.tx = (Ai1*a0 + Ai2*a1 + Ai4*a2)*det;
715 fvec txtx1 = 1.+t.tx*t.tx;
716 L = (Ai3*a0 + Ai4*a1 + Ai5*a2)*det *rcp(txtx1);
717 L1 = L*t.tx;
718 A1 = A1 + A3*L1;
719 A2 = A2 + ( A4 + A4 + A5*L1 )*L1;
720 b1+= b2 * L1;
721 det = rcp(-A1*A1+A0*A2);
722
723 t.y = ( A2*b0 - A1*b1 )*det;
724 t.ty = ( -A1*b0 + A0*b1 )*det;
725 t.qp = -L*c_light_i*rsqrt(txtx1 +t.ty*t.ty);
726 t.z = z0;
727}
728
729//----------------------------------------------------------------------------------------------
730
731void L1Algo::FilterFirst( L1TrackPar &track,fvec &x, fvec &y, L1Station &st )
732{
733 // initialize covariance matrix
734 track.C00= st.XYInfo.C00;
735 track.C10= st.XYInfo.C10; track.C11= st.XYInfo.C11;
736 track.C20= ZERO; track.C21= ZERO; track.C22= vINF;
737 track.C30= ZERO; track.C31= ZERO; track.C32= ZERO; track.C33= vINF;
738 track.C40= ZERO; track.C41= ZERO; track.C42= ZERO; track.C43= ZERO; track.C44= ONE;
739
740 track.x = x;
741 track.y = y;
742 track.NDF = -3.0;
743 track.chi2 = ZERO;
744}
const Float_t z0
Definition BmnMwpcHit.cxx:6
void L1AddPipeMaterial(L1TrackPar &T, fvec qp0, fvec w=1, fvec mass2=0.1395679f *0.1395679f)
void L1AddMaterial(L1TrackPar &T, fvec radThick, fvec qp0, fvec w=1, fvec mass2=0.1395679f *0.1395679f)
void L1Extrapolate(L1TrackPar &T, fvec z_out, fvec qp0, L1FieldRegion &F, fvec *w=0)
void L1Filter(L1TrackPar &T, L1UMeasurementInfo &info, fvec u, fvec w=1., fvec *du2=0)
float fscal
Definition P4_F32vec4.h:232
__m128 v
Definition P4_F32vec4.h:1
const int fvecLen
Definition P4_F32vec4.h:233
friend F32vec4 rsqrt(const F32vec4 &a)
Definition P4_F32vec4.h:37
int i
Definition P4_F32vec4.h:22
friend F32vec4 rcp(const F32vec4 &a)
Definition P4_F32vec4.h:45
F32vec4 fvec
Definition P4_F32vec4.h:231
vector< unsigned char > vSFlag
Definition L1Algo.h:134
L1Station vStations[MaxNStations] _fvecalignment
Definition L1Algo.h:125
int NStations
Definition L1Algo.h:123
vector< L1Strip > vStsStrips
Definition L1Algo.h:129
@ MaxNStations
Definition L1Algo.h:122
vector< L1HitPoint > vAllHitPoints
Definition L1Algo.h:147
vector< L1Track > vTracks
--— Output data --—
Definition L1Algo.h:151
vector< THitI > vRecoHits
Definition L1Algo.h:152
int NMvdStations
Definition L1Algo.h:124
vector< L1StsHit > vStsHits
Definition L1Algo.h:132
vector< L1Strip > vStsStripsB
Definition L1Algo.h:130
vector< fscal > vStsZPos
Definition L1Algo.h:131
void L1KFTrackFitter(bool extrapolateToTheEndOfSTS=false)
void KFTrackFitter_simple()
Track fitting procedures.
vector< L1Material > fRadThick
Definition L1Algo.h:127
void GetFieldValue(const fvec &x, const fvec &y, L1FieldValue &B) const
Definition L1Field.h:44
fvec cy[21]
Definition L1Field.h:37
void Combine(L1FieldValue &B, fvec w)
Definition L1Field.h:19
L1XYMeasurementInfo XYInfo
Definition L1Station.h:23
L1UMeasurementInfo backInfo
Definition L1Station.h:22
L1FieldSlice fieldSlice
Definition L1Station.h:21
L1MaterialInfo materialInfo
Definition L1Station.h:20
L1UMeasurementInfo frontInfo
Definition L1Station.h:22
fvec Sy
Definition L1Station.h:19
TZPosI iz
Definition L1StsHit.h:13
TStripI f
Definition L1StsHit.h:12
TStripI b
Definition L1StsHit.h:12
double TFirst[6]
Definition L1Track.h:25
double chi2
Definition L1Track.h:25
unsigned char NHits
Definition L1Track.h:23
int NDF
Definition L1Track.h:26
double CFirst[15]
Definition L1Track.h:25
double CLast[15]
Definition L1Track.h:25
double TLast[6]
Definition L1Track.h:25
#define L1
contain strips positions and coordinates of hit
Definition L1HitPoint.h:6
fscal V() const
Definition L1HitPoint.h:18
fscal DU() const
Definition L1HitPoint.h:19
fscal U() const
Definition L1HitPoint.h:17
fscal Y() const
Definition L1HitPoint.h:15
fscal X() const
Definition L1HitPoint.h:14
fscal DV() const
Definition L1HitPoint.h:20