/[PAMELA software]/DarthVader/TrackerLevel2/src/TrkLevel2.cpp
ViewVC logotype

Contents of /DarthVader/TrackerLevel2/src/TrkLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.35 - (show annotations) (download)
Thu May 24 14:32:14 2007 UTC (17 years, 8 months ago) by pam-fi
Branch: MAIN
Changes since 1.34: +16 -2 lines
Insert the TrkTrack::IsInsideCavity() method

1 /**
2 * \file TrkLevel2.cpp
3 * \author Elena Vannuccini
4 */
5 #include <TrkLevel2.h>
6 #include <iostream>
7 #include <math.h>
8 using namespace std;
9 //......................................
10 // F77 routines
11 //......................................
12 extern "C" {
13 void dotrack_(int*, double*, double*, double*, double*, int*);
14 void dotrack2_(int*, double*, double*, double*, double*,double*, double*, double*,int*);
15 void mini2_(int*,int*,int*);
16 void guess_();
17 void gufld_(float*, float*);
18 float risxeta2_(float *);
19 float risxeta3_(float *);
20 float risxeta4_(float *);
21 float risyeta2_(float *);
22 }
23
24 //--------------------------------------
25 //
26 //
27 //--------------------------------------
28 TrkTrack::TrkTrack(){
29 // cout << "TrkTrack::TrkTrack()" << endl;
30 seqno = -1;
31 image = -1;
32 chi2 = 0;
33 nstep = 0;
34 for(int it1=0;it1<5;it1++){
35 al[it1] = 0;
36 for(int it2=0;it2<5;it2++)coval[it1][it2] = 0;
37 };
38 for(int ip=0;ip<6;ip++){
39 xgood[ip] = 0;
40 ygood[ip] = 0;
41 xm[ip] = 0;
42 ym[ip] = 0;
43 zm[ip] = 0;
44 resx[ip] = 0;
45 resy[ip] = 0;
46 tailx[ip] = 0;
47 taily[ip] = 0;
48 xv[ip] = 0;
49 yv[ip] = 0;
50 zv[ip] = 0;
51 axv[ip] = 0;
52 ayv[ip] = 0;
53 dedx_x[ip] = 0;
54 dedx_y[ip] = 0;
55 };
56 // clx = 0;
57 // cly = 0;
58 // clx = new TRefArray(6,0); //forse causa memory leak???
59 // cly = new TRefArray(6,0); //forse causa memory leak???
60 // clx = TRefArray(6,0);
61 // cly = TRefArray(6,0);
62
63 TrkParams::SetTrackingMode();
64 TrkParams::SetPrecisionFactor();
65 TrkParams::SetStepMin();
66 TrkParams::SetPFA();
67
68 };
69 //--------------------------------------
70 //
71 //
72 //--------------------------------------
73 TrkTrack::TrkTrack(const TrkTrack& t){
74 seqno = t.seqno;
75 image = t.image;
76 chi2 = t.chi2;
77 nstep = t.nstep;
78 for(int it1=0;it1<5;it1++){
79 al[it1] = t.al[it1];
80 for(int it2=0;it2<5;it2++)coval[it1][it2] = t.coval[it1][it2];
81 };
82 for(int ip=0;ip<6;ip++){
83 xgood[ip] = t.xgood[ip];
84 ygood[ip] = t.ygood[ip];
85 xm[ip] = t.xm[ip];
86 ym[ip] = t.ym[ip];
87 zm[ip] = t.zm[ip];
88 resx[ip] = t.resx[ip];
89 resy[ip] = t.resy[ip];
90 tailx[ip] = t.tailx[ip];
91 taily[ip] = t.taily[ip];
92 xv[ip] = t.xv[ip];
93 yv[ip] = t.yv[ip];
94 zv[ip] = t.zv[ip];
95 axv[ip] = t.axv[ip];
96 ayv[ip] = t.ayv[ip];
97 dedx_x[ip] = t.dedx_x[ip];
98 dedx_y[ip] = t.dedx_y[ip];
99 };
100 // clx = 0;
101 // cly = 0;
102 // if(t.clx)clx = new TRefArray(*(t.clx));
103 // if(t.cly)cly = new TRefArray(*(t.cly));
104 // clx = TRefArray(t.clx);
105 // cly = TRefArray(t.cly);
106
107 TrkParams::SetTrackingMode();
108 TrkParams::SetPrecisionFactor();
109 TrkParams::SetStepMin();
110 TrkParams::SetPFA();
111
112 };
113 //--------------------------------------
114 //
115 //
116 //--------------------------------------
117 void TrkTrack::Copy(TrkTrack& t){
118
119 t.seqno = seqno;
120 t.image = image;
121 t.chi2 = chi2;
122 t.nstep = nstep;
123 for(int it1=0;it1<5;it1++){
124 t.al[it1] = al[it1];
125 for(int it2=0;it2<5;it2++)t.coval[it1][it2] = coval[it1][it2];
126 };
127 for(int ip=0;ip<6;ip++){
128 t.xgood[ip] = xgood[ip];
129 t.ygood[ip] = ygood[ip];
130 t.xm[ip] = xm[ip];
131 t.ym[ip] = ym[ip];
132 t.zm[ip] = zm[ip];
133 t.resx[ip] = resx[ip];
134 t.resy[ip] = resy[ip];
135 t.tailx[ip] = tailx[ip];
136 t.taily[ip] = taily[ip];
137 t.xv[ip] = xv[ip];
138 t.yv[ip] = yv[ip];
139 t.zv[ip] = zv[ip];
140 t.axv[ip] = axv[ip];
141 t.ayv[ip] = ayv[ip];
142 t.dedx_x[ip] = dedx_x[ip];
143 t.dedx_y[ip] = dedx_y[ip];
144
145 };
146
147 // t.clx = TRefArray(clx);
148 // t.cly = TRefArray(cly);
149
150 };
151 //--------------------------------------
152 //
153 //
154 //--------------------------------------
155 /**
156 * Evaluates the trajectory in the apparatus associated to the track.
157 * It integrates the equations of motion in the magnetic field. The magnetic field should be previously loaded ( by calling TrkLevel2::LoadField() ), otherwise an error message is returned.
158 * @param t pointer to an object of the class Trajectory,
159 * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ).
160 * @return error flag.
161 */
162 int TrkTrack::DoTrack(Trajectory* t){
163
164 double *dxout = new double[t->npoint];
165 double *dyout = new double[t->npoint];
166 double *dzin = new double[t->npoint];
167 double dal[5];
168
169 int ifail = 0;
170
171 for (int i=0; i<5; i++) dal[i] = (double)al[i];
172 for (int i=0; i<t->npoint; i++) dzin[i] = (double)t->z[i];
173
174 TrkParams::Load(1);
175 if( !TrkParams::IsLoaded(1) ){
176 cout << "int TrkTrack::DoTrack(Trajectory* t) --- ERROR --- m.field not loaded"<<endl;
177 return 0;
178 }
179 dotrack_(&(t->npoint),dzin,dxout,dyout,dal,&ifail);
180
181 for (int i=0; i<t->npoint; i++){
182 t->x[i] = (float)*dxout++;
183 t->y[i] = (float)*dyout++;
184 }
185
186 // delete [] dxout;
187 // delete [] dyout;
188 // delete [] dzin;
189
190 return ifail;
191 };
192 //--------------------------------------
193 //
194 //
195 //--------------------------------------
196 /**
197 * Evaluates the trajectory in the apparatus associated to the track.
198 * It integrates the equations of motion in the magnetic field. The magnetic field should be previously loaded ( by calling TrkLevel2::LoadField() ), otherwise an error message is returned.
199 * @param t pointer to an object of the class Trajectory,
200 * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ).
201 * @return error flag.
202 */
203 int TrkTrack::DoTrack2(Trajectory* t){
204
205 double *dxout = new double[t->npoint];
206 double *dyout = new double[t->npoint];
207 double *dthxout = new double[t->npoint];
208 double *dthyout = new double[t->npoint];
209 double *dtlout = new double[t->npoint];
210 double *dzin = new double[t->npoint];
211 double dal[5];
212
213 int ifail = 0;
214
215 for (int i=0; i<5; i++) dal[i] = (double)al[i];
216 for (int i=0; i<t->npoint; i++) dzin[i] = (double)t->z[i];
217
218 TrkParams::Load(1);
219 if( !TrkParams::IsLoaded(1) ){
220 cout << "int TrkTrack::DoTrack2(Trajectory* t) --- ERROR --- m.field not loaded"<<endl;
221 return 0;
222 }
223 dotrack2_(&(t->npoint),dzin,dxout,dyout,dthxout,dthyout,dtlout,dal,&ifail);
224
225 for (int i=0; i<t->npoint; i++){
226 t->x[i] = (float)*dxout++;
227 t->y[i] = (float)*dyout++;
228 t->thx[i] = (float)*dthxout++;
229 t->thy[i] = (float)*dthyout++;
230 t->tl[i] = (float)*dtlout++;
231 }
232
233 // delete [] dxout;
234 // delete [] dyout;
235 // delete [] dzin;
236
237 return ifail;
238 };
239 //--------------------------------------
240 //
241 //
242 //--------------------------------------
243 //float TrkTrack::BdL(){
244 //};
245 //--------------------------------------
246 //
247 //
248 //--------------------------------------
249 Float_t TrkTrack::GetRigidity(){
250 Float_t rig=0;
251 if(chi2>0)rig=1./al[4];
252 if(rig<0) rig=-rig;
253 return rig;
254 };
255 //
256 Float_t TrkTrack::GetDeflection(){
257 Float_t def=0;
258 if(chi2>0)def=al[4];
259 return def;
260 };
261 //
262 /**
263 * Method to retrieve the dE/dx measured on a tracker view.
264 * @param ip plane (0-5)
265 * @param iv view (0=x 1=y)
266 */
267 Float_t TrkTrack::GetDEDX(int ip, int iv){
268 if(iv==0 && ip>=0 && ip<6)return fabs(dedx_x[ip]);
269 else if(iv==1 && ip>=0 && ip<6)return fabs(dedx_y[ip]);
270 else {
271 cout << "TrkTrack::GetDEDX(int ip, int iv) -- wrong input parameters "<<ip<<iv<<endl;
272 return 0.;
273 }
274 }
275 /**
276 * Method to evaluate the dE/dx measured on a tracker plane.
277 * The two measurements on x- and y-view are averaged.
278 * @param ip plane (0-5)
279 */
280 Float_t TrkTrack::GetDEDX(int ip){
281 if( (Int_t)XGood(ip)+(Int_t)YGood(ip) == 0 ) return 0;
282 return (GetDEDX(ip,0)+GetDEDX(ip,1))/((Int_t)XGood(ip)+(Int_t)YGood(ip));
283 };
284
285 /**
286 * Method to evaluate the dE/dx averaged over all planes.
287 */
288 Float_t TrkTrack::GetDEDX(){
289 Float_t dedx=0;
290 for(Int_t ip=0; ip<6; ip++)dedx+=GetDEDX(ip,0)*XGood(ip)+GetDEDX(ip,1)*YGood(ip);
291 dedx = dedx/(GetNX()+GetNY());
292 return dedx;
293 };
294 /**
295 * Returns 1 if the cluster on a tracker view includes bad strips.
296 * @param ip plane (0-5)
297 * @param iv view (0=x 1=y)
298 */
299 Bool_t TrkTrack::IsBad(int ip,int iv){
300 if(iv==0 && ip>=0 && ip<6)return (xgood[ip]<0) ;
301 else if(iv==1 && ip>=0 && ip<6)return (ygood[ip]<0) ;
302 else {
303 cout << "TrkTrack::IsBad(int ip, int iv) -- wrong input parameters "<<ip<<iv<<endl;
304 return 0.;
305 }
306 };
307 /**
308 * Returns 1 if the signal on a tracker view is saturated.
309 * @param ip plane (0-5)
310 * @param iv view (0=x 1=y)
311 */
312 Bool_t TrkTrack::IsSaturated(int ip,int iv){
313 if(iv==0 && ip>=0 && ip<6)return (dedx_x[ip]<0) ;
314 else if(iv==1 && ip>=0 && ip<6)return (dedx_y[ip]<0) ;
315 else {
316 cout << "TrkTrack::IsSaturated(int ip, int iv) -- wrong input parameters "<<ip<<iv<<endl;
317 return 0.;
318 }
319 };
320 /**
321 * Returns 1 if either the x or the y signal on a tracker plane is saturated.
322 * @param ip plane (0-5)
323 */
324 Bool_t TrkTrack::IsSaturated(int ip){
325 return (IsSaturated(ip,0)||IsSaturated(ip,1));
326 };
327 /**
328 * Returns 1 if there is at least a saturated signal along the track.
329 */
330 Bool_t TrkTrack::IsSaturated(){
331 for(int ip=0; ip<6; ip++)for(int iv=0; iv<2; iv++)if(IsSaturated(ip,iv))return true;
332 return false;
333 }
334 /**
335 * Returns the track "lever-arm" on the x view, defined as the distance (in planes) between
336 * the upper and lower x measurements (the maximum value of lever-arm is 6).
337 */
338 Int_t TrkTrack::GetLeverArmX(){
339 int first_plane = -1;
340 int last_plane = -1;
341 for(Int_t ip=0; ip<6; ip++){
342 if( XGood(ip) && first_plane == -1 )first_plane = ip;
343 if( XGood(ip) && first_plane != -1 )last_plane = ip;
344 }
345 if( first_plane == -1 || last_plane == -1){
346 cout<< "Int_t TrkTrack::GetLeverArmX() -- XGood(ip) always false ??? "<<endl;
347 return 0;
348 }
349 return (last_plane-first_plane+1);
350 }
351 /**
352 * Returns the track "lever-arm" on the y view, defined as the distance (in planes) between
353 * the upper and lower y measurements (the maximum value of lever-arm is 6).
354 */
355 Int_t TrkTrack::GetLeverArmY(){
356 int first_plane = -1;
357 int last_plane = -1;
358 for(Int_t ip=0; ip<6; ip++){
359 if( YGood(ip) && first_plane == -1 )first_plane = ip;
360 if( YGood(ip) && first_plane != -1 )last_plane = ip;
361 }
362 if( first_plane == -1 || last_plane == -1){
363 cout<< "Int_t TrkTrack::GetLeverArmY() -- YGood(ip) always false ??? "<<endl;
364 return 0;
365 }
366 return (last_plane-first_plane+1);
367 }
368 //--------------------------------------
369 //
370 //
371 //--------------------------------------
372 void TrkTrack::Dump(){
373 cout << endl << "========== Track " ;
374 cout << endl << "seq. n. : "<< seqno;
375 cout << endl << "image n. : "<< image;
376 cout << endl << "al : "; for(int i=0; i<5; i++)cout << al[i] << " ";
377 cout << endl << "chi^2 : "<< chi2;
378 cout << endl << "n.step : "<< nstep;
379 cout << endl << "xgood : "; for(int i=0; i<6; i++)cout << XGood(i) ;
380 cout << endl << "ygood : "; for(int i=0; i<6; i++)cout << YGood(i) ;
381 cout << endl << "xm : "; for(int i=0; i<6; i++)cout << xm[i] << " ";
382 cout << endl << "ym : "; for(int i=0; i<6; i++)cout << ym[i] << " ";
383 cout << endl << "zm : "; for(int i=0; i<6; i++)cout << zm[i] << " ";
384 cout << endl << "xv : "; for(int i=0; i<6; i++)cout << xv[i] << " ";
385 cout << endl << "yv : "; for(int i=0; i<6; i++)cout << yv[i] << " ";
386 cout << endl << "zv : "; for(int i=0; i<6; i++)cout << zv[i] << " ";
387 cout << endl << "resx : "; for(int i=0; i<6; i++)cout << resx[i] << " ";
388 cout << endl << "resy : "; for(int i=0; i<6; i++)cout << resy[i] << " ";
389 cout << endl << "tailx : "; for(int i=0; i<6; i++)cout << tailx[i] << " ";
390 cout << endl << "taily : "; for(int i=0; i<6; i++)cout << taily[i] << " ";
391 cout << endl << "coval : "; for(int i=0; i<5; i++)cout << coval[0][i]<<" ";
392 cout << endl << " "; for(int i=0; i<5; i++)cout << coval[1][i]<<" ";
393 cout << endl << " "; for(int i=0; i<5; i++)cout << coval[2][i]<<" ";
394 cout << endl << " "; for(int i=0; i<5; i++)cout << coval[3][i]<<" ";
395 cout << endl << " "; for(int i=0; i<5; i++)cout << coval[4][i]<<" ";
396 cout << endl << "dedx_x : "; for(int i=0; i<6; i++)cout << dedx_x[i] << " ";
397 cout << endl << "dedx_y : "; for(int i=0; i<6; i++)cout << dedx_y[i] << " ";
398 cout << endl;
399 }
400 /**
401 * Set the TrkTrack position measurements
402 */
403 void TrkTrack::SetMeasure(double *xmeas, double *ymeas, double *zmeas){
404 for(int i=0; i<6; i++) xm[i]=*xmeas++;
405 for(int i=0; i<6; i++) ym[i]=*ymeas++;
406 for(int i=0; i<6; i++) zm[i]=*zmeas++;
407 }
408 /**
409 * Set the TrkTrack position resolution
410 */
411 void TrkTrack::SetResolution(double *rx, double *ry){
412 for(int i=0; i<6; i++) resx[i]=*rx++;
413 for(int i=0; i<6; i++) resy[i]=*ry++;
414 }
415 /**
416 * Set the TrkTrack tails position resolution
417 */
418 void TrkTrack::SetTail(double *tx, double *ty, double factor){
419 for(int i=0; i<6; i++) tailx[i]=factor*(*tx++);
420 for(int i=0; i<6; i++) taily[i]=factor*(*ty++);
421 }
422 /**
423 * Set the TrkTrack Student parameter (resx,resy,tailx,taily)
424 * from previous gausian fit
425 *@param flag =0 standard, =1 with noise correction
426 */
427 void TrkTrack::SetStudentParam(int flag){
428 float sx[11]={0.000128242,
429 0.000136942,
430 0.000162718,
431 0.000202644,
432 0.00025597,
433 0.000317456,
434 0.000349048,
435 0.000384638,
436 0.000457295,
437 0.000512319,
438 0.000538573};
439 float tx[11]={1.79402,
440 2.04876,
441 2.88376,
442 3.3,
443 3.14084,
444 4.07686,
445 4.44736,
446 3.5179,
447 3.38697,
448 3.45739,
449 3.18627};
450 float sy[11]={0.000483075,
451 0.000466925,
452 0.000431658,
453 0.000428317,
454 0.000433854,
455 0.000444044,
456 0.000482098,
457 0.000537579,
458 0.000636279,
459 0.000741998,
460 0.000864261};
461 float ty[11]={0.997032,
462 1.11147,
463 1.18526,
464 1.61404,
465 2.21908,
466 3.08959,
467 4.48833,
468 4.42687,
469 4.65253,
470 4.52043,
471 4.29926};
472 int index;
473 float fact;
474 for(int i=0; i<6; i++) {
475 index = int((fabs(axv[i])+1.)/2.);
476 if(index>10) index=10;
477 tailx[i]=tx[index];
478 if(flag==1) {
479 if(fabs(axv[i])<=10.) fact = resx[i]/risxeta2_(&(axv[i]));
480 if(fabs(axv[i])>10.&&fabs(axv[i])<=15.) fact = resx[i]/risxeta3_(&(axv[i]));
481 if(fabs(axv[i])>15.) fact = resx[i]/risxeta4_(&(axv[i]));
482 } else fact = 1.;
483 resx[i] = sx[index]*fact;
484 }
485 for(int i=0; i<6; i++) {
486 index = int((fabs(ayv[i])+1.)/2.);
487 if(index>10) index=10;
488 taily[i]=ty[index];
489 if(flag==1) fact = resy[i]/risyeta2_(&(ayv[i]));
490 else fact = 1.;
491 resy[i] = sy[index]*fact;
492 }
493 }
494 /**
495 * Set the TrkTrack good measurement
496 */
497 void TrkTrack::SetGood(int *xg, int *yg){
498
499 for(int i=0; i<6; i++) xgood[i]=*xg++;
500 for(int i=0; i<6; i++) ygood[i]=*yg++;
501 }
502
503 /**
504 * Load the magnetic field
505 */
506 void TrkTrack::LoadField(TString path){
507
508 // strcpy(path_.path,path.Data());
509 // path_.pathlen = path.Length();
510 // path_.error = 0;
511 // readb_();
512
513 TrkParams::SetTrackingMode();
514 TrkParams::SetPrecisionFactor();
515 TrkParams::SetStepMin();
516
517 TrkParams::Set(path,1);
518 TrkParams::Load(1);
519
520 };
521
522
523 /**
524 * Method to fill minimization-routine common
525 */
526 void TrkTrack::FillMiniStruct(cMini2track& track){
527
528 for(int i=0; i<6; i++){
529
530 // cout << i<<" - "<<xgood[i]<<" "<<XGood(i)<<endl;
531 // cout << i<<" - "<<ygood[i]<<" "<<YGood(i)<<endl;
532 track.xgood[i]=XGood(i);
533 track.ygood[i]=YGood(i);
534
535 track.xm[i]=xm[i];
536 track.ym[i]=ym[i];
537 track.zm[i]=zm[i];
538
539 // --- temporaneo ----------------------------
540 // andrebbe inserita la dimensione del sensore
541 float segment = 100.;
542 track.xm_a[i]=xm[i];
543 track.xm_b[i]=xm[i];
544 track.ym_a[i]=ym[i];
545 track.ym_b[i]=ym[i];
546 if( XGood(i) && !YGood(i) ){
547 track.ym_a[i] = track.ym_a[i]+segment;
548 track.ym_b[i] = track.ym_b[i]-segment;
549 }else if( !XGood(i) && YGood(i)){
550 track.xm_a[i] = track.xm_a[i]+segment;
551 track.xm_b[i] = track.xm_b[i]-segment;
552 }
553 // --- temporaneo ----------------------------
554
555 track.resx[i]=resx[i];
556 track.resy[i]=resy[i];
557 track.tailx[i]=tailx[i];
558 track.taily[i]=taily[i];
559 }
560
561 for(int i=0; i<5; i++) track.al[i]=al[i];
562 track.zini = 23.5;
563 // ZINI = 23.5 !!! it should be the same parameter in all codes
564
565 }
566 /**
567 * Method to set values from minimization-routine common
568 */
569 void TrkTrack::SetFromMiniStruct(cMini2track *track){
570
571 for(int i=0; i<5; i++) {
572 al[i]=track->al[i];
573 for(int j=0; j<5; j++) coval[i][j]=track->cov[i][j];
574 }
575 chi2 = track->chi2;
576 nstep = track->nstep;
577 for(int i=0; i<6; i++){
578 xv[i] = track->xv[i];
579 yv[i] = track->yv[i];
580 zv[i] = track->zv[i];
581 xm[i] = track->xm[i];
582 ym[i] = track->ym[i];
583 zm[i] = track->zm[i];
584 axv[i] = track->axv[i];
585 ayv[i] = track->ayv[i];
586 }
587
588 }
589 /**
590 * \brief Method to re-evaluate coordinates of clusters associated with a track.
591 *
592 * The method can be applied only after recovering level1 information
593 * (either by reprocessing single events from level0 or from
594 * the TrkLevel1 branch, if present); it calls F77 subroutines that
595 * read the level1 common and fill the minimization-routine common.
596 * Some clusters can be excluded or added by means of the methods:
597 *
598 * TrkTrack::ResetXGood(int ip)
599 * TrkTrack::ResetYGood(int ip)
600 * TrkTrack::SetXGood(int ip, int cid, int is)
601 * TrkTrack::SetYGood(int ip, int cid, int is)
602 *
603 * NB! The method TrkTrack::SetGood(int *xg, int *yg) set the plane-mask (0-1)
604 * for the minimization-routine common. It deletes the cluster information
605 * (at least for the moment...) thus cannot be applied before
606 * TrkTrack::EvaluateClusterPositions().
607 *
608 * Different p.f.a. can be applied by calling (once) the method:
609 *
610 * TrkParams::SetPFA(0); //Set ETA p.f.a.
611 *
612 * @see TrkParams::SetPFA(int)
613 */
614 void TrkTrack::EvaluateClusterPositions(){
615
616 // cout << "void TrkTrack::GetClusterPositions() "<<endl;
617
618 TrkParams::Load( );
619 if( !TrkParams::IsLoaded() )return;
620
621 for(int ip=0; ip<6; ip++){
622 // cout << ip<<" ** "<<xm[ip]<<" / "<<ym[ip]<<endl;;
623 int icx = GetClusterX_ID(ip)+1;
624 int icy = GetClusterY_ID(ip)+1;
625 int sensor = GetSensor(ip)+1;//<< convenzione "Paolo"
626 if(ip==5 && sensor!=0)sensor=3-sensor;//<< convenzione "Elena"
627 int ladder = GetLadder(ip)+1;
628 float ax = axv[ip];
629 float ay = ayv[ip];
630 float v[3];
631 v[0]=xv[ip];
632 v[1]=yv[ip];
633 v[2]=zv[ip];
634 float bfx = 10*TrkParams::GetBX(v);//Tesla
635 float bfy = 10*TrkParams::GetBY(v);//Tesla
636 int ipp=ip+1;
637 xyzpam_(&ipp,&icx,&icy,&ladder,&sensor,&ax,&ay,&bfx,&bfy);
638 }
639 }
640 /**
641 * \brief Tracking method. It calls F77 mini routine.
642 *
643 * @param pfixed Particle momentum. If pfixed=0 the momentum
644 * is left as a free parameter, otherwise it is fixed to the input value.
645 * @param fail Output flag (!=0 if the fit failed).
646 * @param iprint Flag to set debug mode ( 0 = no output; 1 = verbose; 2 = debug).
647 * @param froml1 Flag to re-evaluate positions (see TrkTrack::GetClusterPositions()).
648 *
649 * The option to re-evaluate positions can be used only after recovering
650 * level1 information, eg. by reprocessing the single event.
651 *
652 * Example:
653 *
654 * if( !event->GetTrkLevel0() )return false;
655 * event->GetTrkLevel0()->ProcessEvent(); // re-processing level0->level1
656 * int fail=0;
657 * event->GetTrkLevel2()->GetTrack(0)->Fit(0.,fail,0,1);
658 *
659 * @see EvaluateClusterPositions()
660 *
661 * The fitting procedure can be varied by changing the tracking mode,
662 * the fit-precision factor and the minimum number of step.
663 * @see SetTrackingMode(int)
664 * @see SetPrecisionFactor(double)
665 * @see SetStepMin(int)
666 */
667 void TrkTrack::Fit(double pfixed, int& fail, int iprint, int froml1){
668
669 float al_ini[] = {0.,0.,0.,0.,0.};
670
671 TrkParams::Load( );
672 if( !TrkParams::IsLoaded() )return;
673
674 extern cMini2track track_;
675 fail = 0;
676 FillMiniStruct(track_);
677
678 if(froml1!=0)EvaluateClusterPositions();
679
680 // if fit variables have been reset, evaluate the initial guess
681 if(al[0]==-9999.&&al[1]==-9999.&&al[2]==-9999.&&al[3]==-9999.&&al[4]==-9999.)guess_();
682
683 // --------------------- free momentum
684 if(pfixed==0.) {
685 track_.pfixed=0.;
686 }
687 // --------------------- fixed momentum
688 if(pfixed!=0.) {
689 al[4]=1./pfixed;
690 track_.pfixed=pfixed;
691 }
692
693 // store temporarily the initial guess
694 for(int i=0; i<5; i++) al_ini[i]=track_.al[i];
695
696 // ------------------------------------------
697 // call mini routine
698 // TrkParams::Load(1);
699 // if( !TrkParams::IsLoaded(1) ){
700 // cout << "void TrkTrack::Fit(double pfixed, int& fail, int iprint) --- ERROR --- m.field not loaded"<<endl;
701 // return;
702 // }
703 int istep=0;
704 int ifail=0;
705 mini2_(&istep,&ifail, &iprint);
706 if(ifail!=0) {
707 if(iprint)cout << "ERROR: ifail= " << ifail << endl;
708 fail = 1;
709 }
710 // ------------------------------------------
711
712 SetFromMiniStruct(&track_);
713
714 if(fail){
715 if(iprint)cout << " >>>> fit failed "<<endl;
716 for(int i=0; i<5; i++) al[i]=al_ini[i];
717 }
718
719 };
720 /**
721 * Reset the fit parameters
722 */
723 void TrkTrack::FitReset(){
724 for(int i=0; i<5; i++) al[i]=-9999.;
725 chi2=0.;
726 nstep=0;
727 // for(int i=0; i<6; i++) xv[i]=0.;
728 // for(int i=0; i<6; i++) yv[i]=0.;
729 // for(int i=0; i<6; i++) zv[i]=0.;
730 // for(int i=0; i<6; i++) axv[i]=0.;
731 // for(int i=0; i<6; i++) ayv[i]=0.;
732 for(int i=0; i<5; i++) {
733 for(int j=0; j<5; j++) coval[i][j]=0.;
734 }
735 }
736 /**
737 * Set the tracking mode
738 */
739 void TrkTrack::SetTrackingMode(int trackmode){
740 extern cMini2track track_;
741 track_.trackmode = trackmode;
742 }
743 /**
744 * Set the factor scale for tracking precision
745 */
746 void TrkTrack::SetPrecisionFactor(double fact){
747 extern cMini2track track_;
748 track_.fact = fact;
749 }
750 /**
751 * Set the minimum number of steps for tracking precision
752 */
753 void TrkTrack::SetStepMin(int istepmin){
754 extern cMini2track track_;
755 track_.istepmin = istepmin;
756 }
757 /**
758 * Returns 1 if the track is inside the magnet cavity
759 * Set the minimum number of steps for tracking precision
760 */
761 Bool_t TrkTrack::IsInsideCavity(){
762 float xmagntop, ymagntop, xmagnbottom, ymagnbottom;
763 xmagntop = xv[0] + (ZMAGNHIGH-zv[0])*tan(cos(-1.0)*axv[0]/180.);
764 ymagntop = yv[0] + (ZMAGNHIGH-zv[0])*tan(cos(-1.0)*ayv[0]/180.);
765 xmagnbottom = xv[5] + (ZMAGNLOW-zv[5])*tan(cos(-1.0)*axv[5]/180.);
766 ymagnbottom = yv[5] + (ZMAGNLOW-zv[5])*tan(cos(-1.0)*ayv[5]/180.);
767 if( xmagntop>XMAGNLOW && xmagntop<XMAGNHIGH &&
768 ymagntop>YMAGNLOW && ymagntop<YMAGNHIGH &&
769 xmagnbottom>XMAGNLOW && xmagnbottom<XMAGNHIGH &&
770 ymagnbottom>YMAGNLOW && ymagnbottom<YMAGNHIGH ) return(true);
771 else return(false);
772 }
773 /**
774 * Method to retrieve ID (0,1,...) of x-cluster (if any) associated to this track.
775 * If no cluster is associated, ID=-1.
776 * @param ip Tracker plane (0-5)
777 */
778 Int_t TrkTrack::GetClusterX_ID(int ip){
779 return ((Int_t)fabs(xgood[ip]))%10000000-1;
780 };
781 /**
782 * Method to retrieve ID (0-xxx) of y-cluster (if any) associated to this track.
783 * If no cluster is associated, ID=-1.
784 * @param ip Tracker plane (0-5)
785 */
786 Int_t TrkTrack::GetClusterY_ID(int ip){
787 return ((Int_t)fabs(ygood[ip]))%10000000-1;
788 };
789 /**
790 * Method to retrieve the ladder (0-4, increasing x) traversed by the track on this plane.
791 * If no ladder is traversed (dead area) the metod retuns -1.
792 * @param ip Tracker plane (0-5)
793 */
794 Int_t TrkTrack::GetLadder(int ip){
795 if(XGood(ip))return (Int_t)fabs(xgood[ip]/100000000)-1;
796 if(YGood(ip))return (Int_t)fabs(ygood[ip]/100000000)-1;
797 return -1;
798 };
799 /**
800 * Method to retrieve the sensor (0-1, increasing y) traversed by the track on this plane.
801 * If no sensor is traversed (dead area) the metod retuns -1.
802 * @param ip Tracker plane (0-5)
803 */
804 Int_t TrkTrack::GetSensor(int ip){
805 if(XGood(ip))return (Int_t)((Int_t)fabs(xgood[ip]/10000000)%10)-1;
806 if(YGood(ip))return (Int_t)((Int_t)fabs(ygood[ip]/10000000)%10)-1;
807 return -1;
808 };
809
810 /**
811 * \brief Method to include a x-cluster to the track.
812 * @param ip Tracker plane (0-5)
813 * @param clid Cluster ID (0,1,...)
814 * @param is Sensor (0-1, increasing y)
815 * @see Fit(double pfixed, int& fail, int iprint, int froml1)
816 */
817 void TrkTrack::SetXGood(int ip, int clid, int is){
818 int il=0; //ladder (temporary)
819 bool bad=false; //ladder (temporary)
820 xgood[ip]=il*100000000+is*10000000+clid;
821 if(bad)xgood[ip]=-xgood[ip];
822 };
823 /**
824 * \brief Method to include a y-cluster to the track.
825 * @param ip Tracker plane (0-5)
826 * @param clid Cluster ID (0,1,...)
827 * @param is Sensor (0-1)
828 * @see Fit(double pfixed, int& fail, int iprint, int froml1)
829 */
830 void TrkTrack::SetYGood(int ip, int clid, int is){
831 int il=0; //ladder (temporary)
832 bool bad=false; //ladder (temporary)
833 ygood[ip]=il*100000000+is*10000000+clid;
834 if(bad)ygood[ip]=-ygood[ip];
835 };
836
837 //--------------------------------------
838 //
839 //
840 //--------------------------------------
841 void TrkTrack::Clear(){
842 // cout << "TrkTrack::Clear()"<<endl;
843 seqno = -1;
844 image = -1;
845 chi2 = 0;
846 nstep = 0;
847 for(int it1=0;it1<5;it1++){
848 al[it1] = 0;
849 for(int it2=0;it2<5;it2++)coval[it1][it2] = 0;
850 };
851 for(int ip=0;ip<6;ip++){
852 xgood[ip] = 0;
853 ygood[ip] = 0;
854 xm[ip] = 0;
855 ym[ip] = 0;
856 zm[ip] = 0;
857 resx[ip] = 0;
858 resy[ip] = 0;
859 tailx[ip] = 0;
860 taily[ip] = 0;
861 xv[ip] = 0;
862 yv[ip] = 0;
863 zv[ip] = 0;
864 axv[ip] = 0;
865 ayv[ip] = 0;
866 dedx_x[ip] = 0;
867 dedx_y[ip] = 0;
868
869 };
870 // if(clx)clx->Clear();
871 // if(cly)cly->Clear();
872 // clx.Clear();
873 // cly.Clear();
874 };
875 //--------------------------------------
876 //
877 //
878 //--------------------------------------
879 void TrkTrack::Delete(){
880 // cout << "TrkTrack::Delete()"<<endl;
881 Clear();
882 // if(clx)delete clx;
883 // if(cly)delete cly;
884 };
885 //--------------------------------------
886 //
887 //
888 //--------------------------------------
889
890 //--------------------------------------
891 //
892 //
893 //--------------------------------------
894 TrkSinglet::TrkSinglet(){
895 // cout << "TrkSinglet::TrkSinglet() " << GetUniqueID()<<endl;
896 plane = 0;
897 coord[0] = 0;
898 coord[1] = 0;
899 sgnl = 0;
900 // cls = 0;
901 };
902 //--------------------------------------
903 //
904 //
905 //--------------------------------------
906 TrkSinglet::TrkSinglet(const TrkSinglet& s){
907 // cout << "TrkSinglet::TrkSinglet(const TrkSinglet& s) " << GetUniqueID()<<endl;
908 plane = s.plane;
909 coord[0] = s.coord[0];
910 coord[1] = s.coord[1];
911 sgnl = s.sgnl;
912 // cls = 0;//<<<<pointer
913 // cls = TRef(s.cls);
914 };
915 //--------------------------------------
916 //
917 //
918 //--------------------------------------
919 void TrkSinglet::Dump(){
920 int i=0;
921 cout << endl << "========== Singlet " ;
922 cout << endl << "plane : " << plane;
923 cout << endl << "coord[2] : "; while( i<2 && cout << coord[i] << " ") i++;
924 cout << endl << "sgnl : " << sgnl;
925 }
926 //--------------------------------------
927 //
928 //
929 //--------------------------------------
930 void TrkSinglet::Clear(){
931 // cout << "TrkSinglet::Clear() " << GetUniqueID()<<endl;
932 // cls=0;
933 plane=-1;
934 coord[0]=-999;
935 coord[1]=-999;
936 sgnl=0;
937
938 }
939 //--------------------------------------
940 //
941 //
942 //--------------------------------------
943 TrkLevel2::TrkLevel2(){
944 // cout <<"TrkLevel2::TrkLevel2()"<<endl;
945 for(Int_t i=0; i<12 ; i++){
946 good[i] = -1;
947 VKmask[i] = 0;
948 VKflag[i] = 0;
949 };
950 Track = 0;
951 SingletX = 0;
952 SingletY = 0;
953
954 }
955 //--------------------------------------
956 //
957 //
958 //--------------------------------------
959 void TrkLevel2::Set(){
960 if(!Track)Track = new TClonesArray("TrkTrack");
961 if(!SingletX)SingletX = new TClonesArray("TrkSinglet");
962 if(!SingletY)SingletY = new TClonesArray("TrkSinglet");
963 }
964 //--------------------------------------
965 //
966 //
967 //--------------------------------------
968 void TrkLevel2::Dump(){
969
970 //
971 cout << endl << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-";
972 cout << endl << "good : "; for(int i=0; i<12; i++) cout << good[i]<<" ";
973 cout << endl << "ntrk() : " << this->ntrk() ;
974 cout << endl << "nclsx() : " << this->nclsx();
975 cout << endl << "nclsy() : " << this->nclsy();
976 if(Track){
977 TClonesArray &t = *Track;
978 for(int i=0; i<ntrk(); i++) ((TrkTrack *)t[i])->Dump();
979 }
980 if(SingletX){
981 TClonesArray &sx = *SingletX;
982 for(int i=0; i<nclsx(); i++) ((TrkSinglet *)sx[i])->Dump();
983 }
984 if(SingletY){
985 TClonesArray &sy = *SingletY;
986 for(int i=0; i<nclsy(); i++) ((TrkSinglet *)sy[i])->Dump();
987 }
988 }
989 //--------------------------------------
990 //
991 //
992 //--------------------------------------
993 /**
994 * The method returns false if the viking-chip was masked
995 * either apriori ,on the basis of the mask read from the DB,
996 * or run-by-run, on the basis of the calibration parameters)
997 * @param iv Tracker view (0-11)
998 * @param ivk Viking-chip number (0-23)
999 */
1000 Bool_t TrkLevel2::GetVKMask(int iv, int ivk){
1001 Int_t whichbit = (Int_t)pow(2,ivk);
1002 return (whichbit&VKmask[iv])!=0;
1003 }
1004 /**
1005 * The method returns false if the viking-chip was masked
1006 * for this event due to common-noise computation failure.
1007 * @param iv Tracker view (0-11)
1008 * @param ivk Viking-chip number (0-23)
1009 */
1010 Bool_t TrkLevel2::GetVKFlag(int iv, int ivk){
1011 Int_t whichbit = (Int_t)pow(2,ivk);
1012 return (whichbit&VKflag[iv])!=0;
1013 }
1014 /**
1015 * The method returns true if the viking-chip was masked, either
1016 * forced (see TrkLevel2::GetVKMask(int,int)) or
1017 * for this event only (TrkLevel2::GetVKFlag(int,int)).
1018 * @param iv Tracker view (0-11)
1019 * @param ivk Viking-chip number (0-23)
1020 */
1021 Bool_t TrkLevel2::IsMaskedVK(int iv, int ivk){
1022 return !(GetVKMask(iv,ivk)&&GetVKFlag(iv,ivk) );
1023 };
1024
1025 //--------------------------------------
1026 //
1027 //
1028 //--------------------------------------
1029 /**
1030 * Fills a TrkLevel2 object with values from a struct cTrkLevel2 (to get data from F77 common).
1031 * Ref to Level1 data (clusters) is also set. If l1==NULL no references are set.
1032 * (NB It make sense to set references only if events are stored in a tree that contains also the Level1 branch)
1033 */
1034 void TrkLevel2::SetFromLevel2Struct(cTrkLevel2 *l2, TrkLevel1 *l1){
1035
1036 // cout << "void TrkLevel2::SetFromLevel2Struct(cTrkLevel2 *l2, TrkLevel1 *l1)"<<endl;
1037 Clear();
1038
1039 // temporary objects:
1040 TrkSinglet* t_singlet = new TrkSinglet();
1041 TrkTrack* t_track = new TrkTrack();
1042
1043 // -----------------
1044 // general variables
1045 // -----------------
1046 for(Int_t i=0; i<12 ; i++){
1047 good[i] = l2->good[i];
1048 VKmask[i]=0;
1049 VKflag[i]=0;
1050 for(Int_t ii=0; ii<24 ; ii++){
1051 Int_t setbit = (Int_t)pow(2,ii);
1052 if( l2->vkflag[ii][i]!=-1 )VKmask[i]=VKmask[i]|setbit;
1053 if( l2->vkflag[ii][i]!=0 )VKflag[i]=VKflag[i]|setbit;
1054 };
1055 };
1056 // --------------
1057 // *** TRACKS ***
1058 // --------------
1059 if(!Track) Track = new TClonesArray("TrkTrack");
1060 TClonesArray &t = *Track;
1061
1062 for(int i=0; i<l2->ntrk; i++){
1063 t_track->seqno = i;// NBNBNBNB deve sempre essere = i
1064 t_track->image = l2->image[i]-1;
1065 t_track->chi2 = l2->chi2_nt[i];
1066 t_track->nstep = l2->nstep_nt[i];
1067 for(int it1=0;it1<5;it1++){
1068 t_track->al[it1] = l2->al_nt[i][it1];
1069 for(int it2=0;it2<5;it2++)
1070 t_track->coval[it1][it2] = l2->coval[i][it2][it1];
1071 };
1072 for(int ip=0;ip<6;ip++){
1073 // ---------------------------------
1074 // new implementation of xgood/ygood
1075 // ---------------------------------
1076 t_track->xgood[ip] = l2->cltrx[i][ip]; //cluster ID
1077 t_track->ygood[ip] = l2->cltry[i][ip]; //cluster ID
1078 t_track->xgood[ip] += 10000000*l2->ls[i][ip]; // ladder+sensor
1079 t_track->ygood[ip] += 10000000*l2->ls[i][ip]; // ladder+sensor
1080 if(l2->xbad[i][ip]>0)t_track->xgood[ip]=-t_track->xgood[ip];
1081 if(l2->ybad[i][ip]>0)t_track->ygood[ip]=-t_track->ygood[ip];
1082 // if(l2->xbad[i][ip]>0 || l2->ybad[i][ip]>0){
1083 // if(l2->dedx_x[i][ip]<0 || l2->dedx_y[i][ip]<0){
1084 // cout << ip << " - "<< l2->cltrx[i][ip] << " "<<l2->cltry[i][ip]<<" "<<l2->ls[i][ip]<<endl;
1085 // cout << ip << " - "<<t_track->xgood[ip]<<" "<<t_track->ygood[ip]<<endl;
1086 // cout << ip << " - "<<t_track->GetClusterX_ID(ip)<<" "<<t_track->GetClusterY_ID(ip)<<" "<<t_track->GetLadder(ip)<<" "<<t_track->GetSensor(ip)<<endl;
1087 // cout << ip << " - "<<t_track->BadClusterX(ip)<<" "<<t_track->BadClusterY(ip)<<endl;
1088 // cout << ip << " - "<<t_track->SaturatedClusterX(ip)<<" "<<t_track->SaturatedClusterY(ip)<<endl;
1089 // }
1090 t_track->xm[ip] = l2->xm_nt[i][ip];
1091 t_track->ym[ip] = l2->ym_nt[i][ip];
1092 t_track->zm[ip] = l2->zm_nt[i][ip];
1093 t_track->resx[ip] = l2->resx_nt[i][ip];
1094 t_track->resy[ip] = l2->resy_nt[i][ip];
1095 t_track->tailx[ip] = l2->tailx[i][ip];
1096 t_track->taily[ip] = l2->taily[i][ip];
1097 t_track->xv[ip] = l2->xv_nt[i][ip];
1098 t_track->yv[ip] = l2->yv_nt[i][ip];
1099 t_track->zv[ip] = l2->zv_nt[i][ip];
1100 t_track->axv[ip] = l2->axv_nt[i][ip];
1101 t_track->ayv[ip] = l2->ayv_nt[i][ip];
1102 t_track->dedx_x[ip] = l2->dedx_x[i][ip];
1103 t_track->dedx_y[ip] = l2->dedx_y[i][ip];
1104 //-----------------------------------------------------
1105 //-----------------------------------------------------
1106 //-----------------------------------------------------
1107 //-----------------------------------------------------
1108 };
1109 // if(t_track->IsSaturated())t_track->Dump();
1110 new(t[i]) TrkTrack(*t_track);
1111 t_track->Clear();
1112 };
1113
1114 // ----------------
1115 // *** SINGLETS ***
1116 // ----------------
1117 if(!SingletX)SingletX = new TClonesArray("TrkSinglet");
1118 TClonesArray &sx = *SingletX;
1119 for(int i=0; i<l2->nclsx; i++){
1120 t_singlet->plane = l2->planex[i];
1121 t_singlet->coord[0] = l2->xs[i][0];
1122 t_singlet->coord[1] = l2->xs[i][1];
1123 t_singlet->sgnl = l2->signlxs[i];
1124 //-----------------------------------------------------
1125 // if(l1) t_singlet->cls = l1->GetCluster(l2->clsx[i]-1);
1126 //-----------------------------------------------------
1127 new(sx[i]) TrkSinglet(*t_singlet);
1128 t_singlet->Clear();
1129 }
1130 if(!SingletY)SingletY = new TClonesArray("TrkSinglet");
1131 TClonesArray &sy = *SingletY;
1132 for(int i=0; i<l2->nclsy; i++){
1133 t_singlet->plane = l2->planey[i];
1134 t_singlet->coord[0] = l2->ys[i][0];
1135 t_singlet->coord[1] = l2->ys[i][1];
1136 t_singlet->sgnl = l2->signlys[i];
1137 //-----------------------------------------------------
1138 // if(l1) t_singlet->cls = l1->GetCluster(l2->clsy[i]-1);
1139 //-----------------------------------------------------
1140 new(sy[i]) TrkSinglet(*t_singlet);
1141 t_singlet->Clear();
1142 };
1143
1144 delete t_track;
1145 delete t_singlet;
1146 }
1147 /**
1148 * Fills a struct cTrkLevel2 with values from a TrkLevel2 object (to put data into a F77 common).
1149 */
1150
1151 void TrkLevel2::GetLevel2Struct(cTrkLevel2 *l2) const {
1152
1153 // general variables
1154 // l2->good2 = good2 ;
1155 for(Int_t i=0; i<12 ; i++){
1156 // l2->crc[i] = crc[i];
1157 l2->good[i] = good[i];
1158 };
1159 // *** TRACKS ***
1160
1161 if(Track){
1162 l2->ntrk = Track->GetEntries();
1163 for(Int_t i=0;i<l2->ntrk;i++){
1164 l2->image[i] = 1 + ((TrkTrack *)Track->At(i))->image;
1165 l2->chi2_nt[i] = ((TrkTrack *)Track->At(i))->chi2;
1166 l2->nstep_nt[i] = ((TrkTrack *)Track->At(i))->nstep;
1167 for(int it1=0;it1<5;it1++){
1168 l2->al_nt[i][it1] = ((TrkTrack *)Track->At(i))->al[it1];
1169 for(int it2=0;it2<5;it2++)
1170 l2->coval[i][it2][it1] = ((TrkTrack *)Track->At(i))->coval[it1][it2];
1171 };
1172 for(int ip=0;ip<6;ip++){
1173 l2->xgood_nt[i][ip] = ((TrkTrack *)Track->At(i))->XGood(ip);
1174 l2->ygood_nt[i][ip] = ((TrkTrack *)Track->At(i))->YGood(ip);
1175 l2->xm_nt[i][ip] = ((TrkTrack *)Track->At(i))->xm[ip];
1176 l2->ym_nt[i][ip] = ((TrkTrack *)Track->At(i))->ym[ip];
1177 l2->zm_nt[i][ip] = ((TrkTrack *)Track->At(i))->zm[ip];
1178 l2->resx_nt[i][ip] = ((TrkTrack *)Track->At(i))->resx[ip];
1179 l2->resy_nt[i][ip] = ((TrkTrack *)Track->At(i))->resy[ip];
1180 l2->tailx[i][ip] = ((TrkTrack *)Track->At(i))->tailx[ip];
1181 l2->taily[i][ip] = ((TrkTrack *)Track->At(i))->taily[ip];
1182 l2->xv_nt[i][ip] = ((TrkTrack *)Track->At(i))->xv[ip];
1183 l2->yv_nt[i][ip] = ((TrkTrack *)Track->At(i))->yv[ip];
1184 l2->zv_nt[i][ip] = ((TrkTrack *)Track->At(i))->zv[ip];
1185 l2->axv_nt[i][ip] = ((TrkTrack *)Track->At(i))->axv[ip];
1186 l2->ayv_nt[i][ip] = ((TrkTrack *)Track->At(i))->ayv[ip];
1187 l2->dedx_x[i][ip] = ((TrkTrack *)Track->At(i))->dedx_x[ip];
1188 l2->dedx_y[i][ip] = ((TrkTrack *)Track->At(i))->dedx_y[ip];
1189 };
1190 }
1191 }
1192 // *** SINGLETS ***
1193 if(SingletX){
1194 l2->nclsx = SingletX->GetEntries();
1195 for(Int_t i=0;i<l2->nclsx;i++){
1196 l2->planex[i] = ((TrkSinglet *)SingletX->At(i))->plane;
1197 l2->xs[i][0] = ((TrkSinglet *)SingletX->At(i))->coord[0];
1198 l2->xs[i][1] = ((TrkSinglet *)SingletX->At(i))->coord[1];
1199 l2->signlxs[i] = ((TrkSinglet *)SingletX->At(i))->sgnl;
1200 }
1201 }
1202
1203 if(SingletY){
1204 l2->nclsy = SingletY->GetEntries();
1205 for(Int_t i=0;i<l2->nclsy;i++){
1206 l2->planey[i] = ((TrkSinglet *)SingletY->At(i))->plane;
1207 l2->ys[i][0] = ((TrkSinglet *)SingletY->At(i))->coord[0];
1208 l2->ys[i][1] = ((TrkSinglet *)SingletY->At(i))->coord[1];
1209 l2->signlys[i] = ((TrkSinglet *)SingletY->At(i))->sgnl;
1210 }
1211 }
1212 }
1213 //--------------------------------------
1214 //
1215 //
1216 //--------------------------------------
1217 void TrkLevel2::Clear(){
1218 for(Int_t i=0; i<12 ; i++){
1219 good[i] = -1;
1220 VKflag[i] = 0;
1221 VKmask[i] = 0;
1222 };
1223 // if(Track)Track->Clear("C");
1224 // if(SingletX)SingletX->Clear("C");
1225 // if(SingletY)SingletY->Clear("C");
1226 if(Track)Track->Delete();
1227 if(SingletX)SingletX->Delete();
1228 if(SingletY)SingletY->Delete();
1229 }
1230 // //--------------------------------------
1231 // //
1232 // //
1233 // //--------------------------------------
1234 void TrkLevel2::Delete(){
1235
1236 // cout << "void TrkLevel2::Delete()"<<endl;
1237 Clear();
1238 if(Track)delete Track;
1239 if(SingletX)delete SingletX;
1240 if(SingletY)delete SingletY;
1241
1242 }
1243 //--------------------------------------
1244 //
1245 //
1246 //--------------------------------------
1247 /**
1248 * Sort physical tracks and stores them in a TObjectArray, ordering by increasing chi**2 value (in case of track image, it selects the one with lower chi**2). The total number of physical tracks is given by GetNTracks() and the it-th physical track can be retrieved by means of the method GetTrack(int it).
1249 * This method is overridden by PamLevel2::GetTracks(), where calorimeter and TOF information is used.
1250 */
1251 TRefArray *TrkLevel2::GetTracks_NFitSorted(){
1252
1253 if(!Track)return 0;
1254
1255 TRefArray *sorted = new TRefArray();
1256
1257 TClonesArray &t = *Track;
1258 // TClonesArray &ts = *PhysicalTrack;
1259 int N = ntrk();
1260 vector<int> m(N); for(int i=0; i<N; i++)m[i]=1;
1261 // int m[50]; for(int i=0; i<N; i++)m[i]=1;
1262
1263 int indo=0;
1264 int indi=0;
1265 while(N > 0){
1266 // while(N != 0){
1267 int nfit =0;
1268 float chi2ref = numeric_limits<float>::max();
1269
1270 // first loop to search maximum num. of fit points
1271 for(int i=0; i < ntrk(); i++){
1272 if( ((TrkTrack *)t[i])->GetNtot() >= nfit && m[i]==1){
1273 nfit = ((TrkTrack *)t[i])->GetNtot();
1274 }
1275 }
1276 //second loop to search minimum chi2 among selected
1277 for(int i=0; i<ntrk(); i++){
1278 Float_t chi2 = ((TrkTrack *)t[i])->chi2;
1279 if(chi2 < 0) chi2 = -chi2*1000;
1280 if( chi2 < chi2ref
1281 && ((TrkTrack *)t[i])->GetNtot() == nfit
1282 && m[i]==1){
1283 chi2ref = ((TrkTrack *)t[i])->chi2;
1284 indi = i;
1285 };
1286 };
1287 if( ((TrkTrack *)t[indi])->HasImage() ){
1288 m[((TrkTrack *)t[indi])->image] = 0;
1289 N--;
1290
1291 // cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<<chi2i<<endl;
1292 };
1293 sorted->Add( (TrkTrack*)t[indi] );
1294
1295 m[indi] = 0;
1296 // cout << "SORTED "<< indo << " "<< indi << " "<< N << " "<<((TrkTrack *)t[indi])->image<<" "<<chi2ref<<endl;
1297 N--;
1298 indo++;
1299 }
1300 m.clear();
1301 // cout << "GetTracks_NFitSorted(it): Done"<< endl;
1302
1303 return sorted;
1304 // return PhysicalTrack;
1305 }
1306 //--------------------------------------
1307 //
1308 //
1309 //--------------------------------------
1310 /**
1311 * Retrieves the is-th stored track.
1312 * @param it Track number, ranging from 0 to ntrk().
1313 * Fitted tracks ( images included ) are stored in a TObjectArray ( TrkLevel2::Track ) in the same order they are returned by the F77 fitting routine.
1314 */
1315 TrkTrack *TrkLevel2::GetStoredTrack(int is){
1316
1317 if(is >= this->ntrk()){
1318 cout << "** TrkLevel2 ** Track "<< is << "doen not exits! " << endl;
1319 cout << " Stored tracks ntrk() = "<< this->ntrk() << endl;
1320 return 0;
1321 }
1322 if(!Track){
1323 cout << "TrkTrack *TrkLevel2::GetStoredTrack(int is) >> (TClonesArray*) Track ==0 "<<endl;
1324 };
1325 TClonesArray &t = *(Track);
1326 TrkTrack *track = (TrkTrack*)t[is];
1327 return track;
1328 }
1329 //--------------------------------------
1330 //
1331 //
1332 //--------------------------------------
1333 /**
1334 * Retrieves the is-th stored X singlet.
1335 * @param it Singlet number, ranging from 0 to nclsx().
1336 */
1337 TrkSinglet *TrkLevel2::GetSingletX(int is){
1338
1339 if(is >= this->nclsx()){
1340 cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl;
1341 cout << " Stored x-singlets nclsx() = "<< this->nclsx() << endl;
1342 return 0;
1343 }
1344 if(!SingletX)return 0;
1345 TClonesArray &t = *(SingletX);
1346 TrkSinglet *singlet = (TrkSinglet*)t[is];
1347 return singlet;
1348 }
1349 //--------------------------------------
1350 //
1351 //
1352 //--------------------------------------
1353 /**
1354 * Retrieves the is-th stored Y singlet.
1355 * @param it Singlet number, ranging from 0 to nclsx().
1356 */
1357 TrkSinglet *TrkLevel2::GetSingletY(int is){
1358
1359 if(is >= this->nclsy()){
1360 cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl;
1361 cout << " Stored y-singlets nclsy() = "<< this->nclsx() << endl;
1362 return 0;
1363 }
1364 if(!SingletY)return 0;
1365 TClonesArray &t = *(SingletY);
1366 TrkSinglet *singlet = (TrkSinglet*)t[is];
1367 return singlet;
1368 }
1369 //--------------------------------------
1370 //
1371 //
1372 //--------------------------------------
1373 /**
1374 * Retrieves the it-th "physical" track, sorted by the method GetNTracks().
1375 * @param it Track number, ranging from 0 to GetNTracks().
1376 */
1377
1378 TrkTrack *TrkLevel2::GetTrack(int it){
1379
1380 if(it >= this->GetNTracks()){
1381 cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl;
1382 cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl;
1383 return 0;
1384 }
1385
1386 TRefArray *sorted = GetTracks(); //TEMPORANEO
1387 if(!sorted)return 0;
1388 TrkTrack *track = (TrkTrack*)sorted->At(it);
1389 sorted->Clear();
1390 delete sorted;
1391 return track;
1392 }
1393 /**
1394 * Give the number of "physical" tracks, sorted by the method GetTracks().
1395 */
1396 Int_t TrkLevel2::GetNTracks(){
1397
1398 Float_t ntot=0;
1399 if(!Track)return 0;
1400 TClonesArray &t = *Track;
1401 for(int i=0; i<ntrk(); i++) {
1402 if( ((TrkTrack *)t[i])->GetImageSeqNo() == -1 ) ntot+=1.;
1403 else ntot+=0.5;
1404 }
1405 return (Int_t)ntot;
1406
1407 };
1408 //--------------------------------------
1409 //
1410 //
1411 //--------------------------------------
1412 /**
1413 * Retrieves (if present) the image of the it-th "physical" track, sorted by the method GetNTracks().
1414 * @param it Track number, ranging from 0 to GetNTracks().
1415 */
1416 TrkTrack *TrkLevel2::GetTrackImage(int it){
1417
1418 if(it >= this->GetNTracks()){
1419 cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl;
1420 cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl;
1421 return 0;
1422 }
1423
1424 TRefArray* sorted = GetTracks(); //TEMPORANEO
1425 if(!sorted)return 0;
1426 TrkTrack *track = (TrkTrack*)sorted->At(it);
1427
1428 if(!track->HasImage()){
1429 cout << "** TrkLevel2 ** Track "<< it << "does not have image! " << endl;
1430 return 0;
1431 }
1432 if(!Track)return 0;
1433 TrkTrack *image = (TrkTrack*)(*Track)[track->image];
1434
1435 sorted->Delete();
1436 delete sorted;
1437
1438 return image;
1439
1440 }
1441 //--------------------------------------
1442 //
1443 //
1444 //--------------------------------------
1445 /**
1446 * Loads the magnetic field.
1447 * @param s Path of the magnetic-field files.
1448 */
1449 void TrkLevel2::LoadField(TString path){
1450 //
1451 // strcpy(path_.path,path.Data());
1452 // path_.pathlen = path.Length();
1453 // path_.error = 0;
1454 // readb_();
1455
1456 TrkParams::SetTrackingMode();
1457 TrkParams::SetPrecisionFactor();
1458 TrkParams::SetStepMin();
1459
1460 TrkParams::Set(path,1);
1461 TrkParams::Load(1);
1462
1463 //
1464 };
1465 // /**
1466 // * Get BY (kGauss)
1467 // * @param v (x,y,z) coordinates in cm
1468 // */
1469 // float TrkLevel2::GetBX(float* v){
1470 // float b[3];
1471 // gufld_(v,b);
1472 // return b[0]/10.;
1473 // }
1474 // /**
1475 // * Get BY (kGauss)
1476 // * @param v (x,y,z) coordinates in cm
1477 // */
1478 // float TrkLevel2::GetBY(float* v){
1479 // float b[3];
1480 // gufld_(v,b);
1481 // return b[1]/10.;
1482 // }
1483 // /**
1484 // * Get BY (kGauss)
1485 // * @param v (x,y,z) coordinates in cm
1486 // */
1487 // float TrkLevel2::GetBZ(float* v){
1488 // float b[3];
1489 // gufld_(v,b);
1490 // return b[2]/10.;
1491 // }
1492 //--------------------------------------
1493 //
1494 //
1495 //--------------------------------------
1496 /**
1497 * Get tracker-plane (mechanical) z-coordinate
1498 * @param plane_id plane index (1=TOP,2,3,4,5,6=BOTTOM)
1499 */
1500 Float_t TrkLevel2::GetZTrk(Int_t plane_id){
1501 switch(plane_id){
1502 case 1: return ZTRK1;
1503 case 2: return ZTRK2;
1504 case 3: return ZTRK3;
1505 case 4: return ZTRK4;
1506 case 5: return ZTRK5;
1507 case 6: return ZTRK6;
1508 default: return 0.;
1509 };
1510 };
1511 //--------------------------------------
1512 //
1513 //
1514 //--------------------------------------
1515 /**
1516 * Trajectory default constructor.
1517 * (By default is created with z-coordinates inside the tracking volume)
1518 */
1519 Trajectory::Trajectory(){
1520 npoint = 10;
1521 x = new float[npoint];
1522 y = new float[npoint];
1523 z = new float[npoint];
1524 thx = new float[npoint];
1525 thy = new float[npoint];
1526 tl = new float[npoint];
1527 float dz = ((ZTRK1)-(ZTRK6))/(npoint-1);
1528 for(int i=0; i<npoint; i++){
1529 x[i] = 0;
1530 y[i] = 0;
1531 z[i] = (ZTRK1) - i*dz;
1532 thx[i] = 0;
1533 thy[i] = 0;
1534 tl[i] = 0;
1535 }
1536 }
1537 //--------------------------------------
1538 //
1539 //
1540 //--------------------------------------
1541 /**
1542 * Trajectory constructor.
1543 * (By default is created with z-coordinates inside the tracking volume)
1544 * \param n Number of points
1545 */
1546 Trajectory::Trajectory(int n){
1547 if(n<=0){
1548 cout << "NB! Trajectory must have at least 1 point >>> created with 10 points" << endl;
1549 n=10;
1550 }
1551 npoint = n;
1552 x = new float[npoint];
1553 y = new float[npoint];
1554 z = new float[npoint];
1555 thx = new float[npoint];
1556 thy = new float[npoint];
1557 tl = new float[npoint];
1558 float dz = ((ZTRK1)-(ZTRK6))/(npoint-1);
1559 for(int i=0; i<npoint; i++){
1560 x[i] = 0;
1561 y[i] = 0;
1562 z[i] = (ZTRK1) - i*dz;
1563 thx[i] = 0;
1564 thy[i] = 0;
1565 tl[i] = 0;
1566 }
1567 }
1568 //--------------------------------------
1569 //
1570 //
1571 //--------------------------------------
1572 /**
1573 * Trajectory constructor.
1574 * \param n Number of points
1575 * \param pz Pointer to float array, defining z coordinates
1576 */
1577 Trajectory::Trajectory(int n, float* zin){
1578 npoint = 10;
1579 if(n>0)npoint = n;
1580 x = new float[npoint];
1581 y = new float[npoint];
1582 z = new float[npoint];
1583 thx = new float[npoint];
1584 thy = new float[npoint];
1585 tl = new float[npoint];
1586 int i=0;
1587 do{
1588 x[i] = 0;
1589 y[i] = 0;
1590 z[i] = zin[i];
1591 thx[i] = 0;
1592 thy[i] = 0;
1593 tl[i] = 0;
1594 i++;
1595 }while(zin[i-1] > zin[i] && i < npoint);
1596 npoint=i;
1597 if(npoint != n)cout << "NB! Trajectory created with "<<npoint<<" points"<<endl;
1598 }
1599 void Trajectory::Delete(){
1600
1601 if(x) delete [] x;
1602 if(y) delete [] y;
1603 if(z) delete [] z;
1604 if(thx) delete [] thx;
1605 if(thy) delete [] thy;
1606 if(tl) delete [] tl;
1607
1608 }
1609 //--------------------------------------
1610 //
1611 //
1612 //--------------------------------------
1613 /**
1614 * Dump the trajectory coordinates.
1615 */
1616 void Trajectory::Dump(){
1617 cout <<endl<< "Trajectory ========== "<<endl;
1618 for (int i=0; i<npoint; i++){
1619 cout << i <<" >> " << x[i] <<" "<< y[i] <<" "<< z[i] ;
1620 cout <<" -- " << thx[i] <<" "<< thy[i] ;
1621 cout <<" -- " << tl[i] << endl;
1622 };
1623 }
1624 //--------------------------------------
1625 //
1626 //
1627 //--------------------------------------
1628 /**
1629 * Get trajectory length between two points
1630 * @param ifirst first point (default 0)
1631 * @param ilast last point (default npoint)
1632 */
1633 float Trajectory::GetLength(int ifirst, int ilast){
1634 if( ifirst<0 ) ifirst = 0;
1635 if( ilast>=npoint) ilast = npoint-1;
1636 float l=0;
1637 for(int i=ifirst;i<=ilast;i++){
1638 l=l+tl[i];
1639 };
1640 if(z[ilast] > ZINI)l=l-tl[ilast];
1641 if(z[ifirst] < ZINI) l=l-tl[ifirst];
1642
1643 return l;
1644
1645 }
1646
1647 /**
1648 * Evaluates the trajectory in the apparatus associated to the track.
1649 * It integrates the equations of motion in the magnetic field. The magnetic field should be previously loaded ( by calling TrkLevel2::LoadField() ), otherwise an error message is returned.
1650 * @param t pointer to an object of the class Trajectory,
1651 * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ).
1652 * @return error flag.
1653 */
1654 int Trajectory::DoTrack2(float* al){
1655
1656 double *dxout = new double[npoint];
1657 double *dyout = new double[npoint];
1658 double *dthxout = new double[npoint];
1659 double *dthyout = new double[npoint];
1660 double *dtlout = new double[npoint];
1661 double *dzin = new double[npoint];
1662 double dal[5];
1663
1664 int ifail = 0;
1665
1666 for (int i=0; i<5; i++) dal[i] = (double)al[i];
1667 for (int i=0; i<npoint; i++) dzin[i] = (double)z[i];
1668
1669 TrkParams::Load(1);
1670 if( !TrkParams::IsLoaded(1) ){
1671 cout << "int Trajectory::DoTrack2(float* al) --- ERROR --- m.field not loaded"<<endl;
1672 return 0;
1673 }
1674 dotrack2_(&(npoint),dzin,dxout,dyout,dthxout,dthyout,dtlout,dal,&ifail);
1675
1676 for (int i=0; i<npoint; i++){
1677 x[i] = (float)*dxout++;
1678 y[i] = (float)*dyout++;
1679 thx[i] = (float)*dthxout++;
1680 thy[i] = (float)*dthyout++;
1681 tl[i] = (float)*dtlout++;
1682 }
1683
1684 return ifail;
1685 };
1686
1687 ClassImp(TrkLevel2);
1688 ClassImp(TrkSinglet);
1689 ClassImp(TrkTrack);
1690 ClassImp(Trajectory);

  ViewVC Help
Powered by ViewVC 1.1.23