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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.36 - (hide annotations) (download)
Thu May 24 16:45:48 2007 UTC (17 years, 6 months ago) by pam-fi
Branch: MAIN
Changes since 1.35: +43 -4 lines
several upgrades

1 mocchiut 1.1 /**
2     * \file TrkLevel2.cpp
3     * \author Elena Vannuccini
4     */
5     #include <TrkLevel2.h>
6     #include <iostream>
7 pam-fi 1.14 #include <math.h>
8 mocchiut 1.1 using namespace std;
9     //......................................
10     // F77 routines
11     //......................................
12     extern "C" {
13     void dotrack_(int*, double*, double*, double*, double*, int*);
14 pam-fi 1.2 void dotrack2_(int*, double*, double*, double*, double*,double*, double*, double*,int*);
15 pam-fi 1.34 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 mocchiut 1.1 }
23 pam-fi 1.26
24 mocchiut 1.1 //--------------------------------------
25     //
26     //
27     //--------------------------------------
28     TrkTrack::TrkTrack(){
29 pam-fi 1.21 // cout << "TrkTrack::TrkTrack()" << endl;
30 pam-fi 1.3 seqno = -1;
31     image = -1;
32 mocchiut 1.1 chi2 = 0;
33 pam-fi 1.14 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 mocchiut 1.1 };
38     for(int ip=0;ip<6;ip++){
39 pam-fi 1.21 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 pam-fi 1.32 tailx[ip] = 0;
47     taily[ip] = 0;
48 pam-fi 1.21 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 pam-fi 1.32 // clx = 0;
57     // cly = 0;
58 pam-fi 1.29 // clx = new TRefArray(6,0); //forse causa memory leak???
59     // cly = new TRefArray(6,0); //forse causa memory leak???
60 pam-fi 1.32 // clx = TRefArray(6,0);
61     // cly = TRefArray(6,0);
62    
63 pam-fi 1.33 TrkParams::SetTrackingMode();
64     TrkParams::SetPrecisionFactor();
65     TrkParams::SetStepMin();
66     TrkParams::SetPFA();
67    
68 mocchiut 1.1 };
69     //--------------------------------------
70     //
71     //
72     //--------------------------------------
73     TrkTrack::TrkTrack(const TrkTrack& t){
74 pam-fi 1.3 seqno = t.seqno;
75 mocchiut 1.1 image = t.image;
76     chi2 = t.chi2;
77 pam-fi 1.14 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 mocchiut 1.1 };
82     for(int ip=0;ip<6;ip++){
83 pam-fi 1.21 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 pam-fi 1.32 tailx[ip] = t.tailx[ip];
91     taily[ip] = t.taily[ip];
92 pam-fi 1.21 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 pam-fi 1.32 // 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 pam-fi 1.33 TrkParams::SetTrackingMode();
108     TrkParams::SetPrecisionFactor();
109     TrkParams::SetStepMin();
110     TrkParams::SetPFA();
111    
112 mocchiut 1.1 };
113     //--------------------------------------
114     //
115     //
116     //--------------------------------------
117 pam-fi 1.21 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 pam-fi 1.32 t.tailx[ip] = tailx[ip];
136     t.taily[ip] = taily[ip];
137 pam-fi 1.21 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 pam-fi 1.32
147     // t.clx = TRefArray(clx);
148     // t.cly = TRefArray(cly);
149 pam-fi 1.21
150     };
151     //--------------------------------------
152     //
153     //
154     //--------------------------------------
155 mocchiut 1.1 /**
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 pam-fi 1.26 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 mocchiut 1.1 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 pam-fi 1.2 /**
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 pam-fi 1.26 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 pam-fi 1.2 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 mocchiut 1.1 //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 pam-fi 1.32 /**
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 mocchiut 1.1 Float_t TrkTrack::GetDEDX(){
289 pam-fi 1.32 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 mocchiut 1.1 };
307 pam-fi 1.32 /**
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 mocchiut 1.1 //--------------------------------------
369     //
370     //
371     //--------------------------------------
372     void TrkTrack::Dump(){
373     cout << endl << "========== Track " ;
374 pam-fi 1.13 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 mocchiut 1.1 cout << endl << "chi^2 : "<< chi2;
378 pam-fi 1.13 cout << endl << "n.step : "<< nstep;
379 pam-fi 1.30 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 mocchiut 1.1 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 pam-fi 1.13 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 pam-fi 1.34 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 pam-fi 1.13 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 mocchiut 1.1 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 pam-fi 1.14 cout << endl;
399 mocchiut 1.1 }
400 pam-fi 1.13 /**
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 pam-fi 1.34 * 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 pam-fi 1.13 */
497     void TrkTrack::SetGood(int *xg, int *yg){
498 pam-fi 1.33
499 pam-fi 1.13 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 pam-fi 1.16 void TrkTrack::LoadField(TString path){
507    
508 pam-fi 1.26 // strcpy(path_.path,path.Data());
509     // path_.pathlen = path.Length();
510     // path_.error = 0;
511     // readb_();
512    
513 pam-fi 1.33 TrkParams::SetTrackingMode();
514     TrkParams::SetPrecisionFactor();
515     TrkParams::SetStepMin();
516    
517 pam-fi 1.26 TrkParams::Set(path,1);
518 pam-fi 1.28 TrkParams::Load(1);
519 pam-fi 1.16
520 pam-fi 1.13 };
521 pam-fi 1.19
522 pam-fi 1.25
523 pam-fi 1.19 /**
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 pam-fi 1.33 // cout << i<<" - "<<xgood[i]<<" "<<XGood(i)<<endl;
531     // cout << i<<" - "<<ygood[i]<<" "<<YGood(i)<<endl;
532 pam-fi 1.30 track.xgood[i]=XGood(i);
533     track.ygood[i]=YGood(i);
534 pam-fi 1.19
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 pam-fi 1.30 if( XGood(i) && !YGood(i) ){
547 pam-fi 1.19 track.ym_a[i] = track.ym_a[i]+segment;
548     track.ym_b[i] = track.ym_b[i]-segment;
549 pam-fi 1.30 }else if( !XGood(i) && YGood(i)){
550 pam-fi 1.19 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 pam-fi 1.34 track.tailx[i]=tailx[i];
558     track.taily[i]=taily[i];
559 pam-fi 1.19 }
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 pam-fi 1.13 /**
590 pam-fi 1.33 * \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 pam-fi 1.36 Bool_t TrkTrack::EvaluateClusterPositions(){
615 pam-fi 1.33
616     // cout << "void TrkTrack::GetClusterPositions() "<<endl;
617    
618     TrkParams::Load( );
619 pam-fi 1.36 if( !TrkParams::IsLoaded() )return false;
620 pam-fi 1.33
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 pam-fi 1.36 if(icx<0 || icy<0)return false;
639 pam-fi 1.33 }
640 pam-fi 1.36 return true;
641 pam-fi 1.33 }
642     /**
643     * \brief Tracking method. It calls F77 mini routine.
644     *
645     * @param pfixed Particle momentum. If pfixed=0 the momentum
646     * is left as a free parameter, otherwise it is fixed to the input value.
647     * @param fail Output flag (!=0 if the fit failed).
648     * @param iprint Flag to set debug mode ( 0 = no output; 1 = verbose; 2 = debug).
649     * @param froml1 Flag to re-evaluate positions (see TrkTrack::GetClusterPositions()).
650     *
651     * The option to re-evaluate positions can be used only after recovering
652     * level1 information, eg. by reprocessing the single event.
653     *
654     * Example:
655     *
656     * if( !event->GetTrkLevel0() )return false;
657     * event->GetTrkLevel0()->ProcessEvent(); // re-processing level0->level1
658     * int fail=0;
659     * event->GetTrkLevel2()->GetTrack(0)->Fit(0.,fail,0,1);
660     *
661     * @see EvaluateClusterPositions()
662     *
663     * The fitting procedure can be varied by changing the tracking mode,
664     * the fit-precision factor and the minimum number of step.
665     * @see SetTrackingMode(int)
666     * @see SetPrecisionFactor(double)
667     * @see SetStepMin(int)
668 pam-fi 1.13 */
669 pam-fi 1.33 void TrkTrack::Fit(double pfixed, int& fail, int iprint, int froml1){
670 pam-fi 1.15
671     float al_ini[] = {0.,0.,0.,0.,0.};
672    
673 pam-fi 1.33 TrkParams::Load( );
674     if( !TrkParams::IsLoaded() )return;
675    
676 pam-fi 1.13 extern cMini2track track_;
677     fail = 0;
678 pam-fi 1.36
679 pam-fi 1.19 FillMiniStruct(track_);
680 pam-fi 1.36
681     if(froml1!=0){
682     if( !EvaluateClusterPositions() ){
683     cout << "void TrkTrack::Fit("<<pfixed<<","<<fail<<","<<iprint<<","<<froml1<<") --- ERROR evaluating cluster positions "<<endl;
684     FillMiniStruct(track_) ;
685     fail = 1;
686     return;
687     }
688     }else{
689     FillMiniStruct(track_);
690     }
691 pam-fi 1.33
692 pam-fi 1.19 // if fit variables have been reset, evaluate the initial guess
693 pam-fi 1.15 if(al[0]==-9999.&&al[1]==-9999.&&al[2]==-9999.&&al[3]==-9999.&&al[4]==-9999.)guess_();
694    
695 pam-fi 1.16 // --------------------- free momentum
696 pam-fi 1.14 if(pfixed==0.) {
697 pam-fi 1.19 track_.pfixed=0.;
698 pam-fi 1.14 }
699 pam-fi 1.16 // --------------------- fixed momentum
700 pam-fi 1.13 if(pfixed!=0.) {
701 pam-fi 1.19 al[4]=1./pfixed;
702     track_.pfixed=pfixed;
703 pam-fi 1.13 }
704 pam-fi 1.15
705 pam-fi 1.19 // store temporarily the initial guess
706 pam-fi 1.15 for(int i=0; i<5; i++) al_ini[i]=track_.al[i];
707    
708 pam-fi 1.19 // ------------------------------------------
709     // call mini routine
710 pam-fi 1.33 // TrkParams::Load(1);
711     // if( !TrkParams::IsLoaded(1) ){
712     // cout << "void TrkTrack::Fit(double pfixed, int& fail, int iprint) --- ERROR --- m.field not loaded"<<endl;
713     // return;
714     // }
715 pam-fi 1.13 int istep=0;
716     int ifail=0;
717     mini2_(&istep,&ifail, &iprint);
718     if(ifail!=0) {
719 pam-fi 1.19 if(iprint)cout << "ERROR: ifail= " << ifail << endl;
720 pam-fi 1.13 fail = 1;
721     }
722 pam-fi 1.19 // ------------------------------------------
723 pam-fi 1.15
724 pam-fi 1.19 SetFromMiniStruct(&track_);
725 pam-fi 1.15
726 pam-fi 1.20 if(fail){
727 pam-fi 1.33 if(iprint)cout << " >>>> fit failed "<<endl;
728 pam-fi 1.20 for(int i=0; i<5; i++) al[i]=al_ini[i];
729     }
730 pam-fi 1.15
731 pam-fi 1.13 };
732 pam-fi 1.33 /**
733 pam-fi 1.15 * Reset the fit parameters
734 pam-fi 1.13 */
735     void TrkTrack::FitReset(){
736     for(int i=0; i<5; i++) al[i]=-9999.;
737     chi2=0.;
738     nstep=0;
739 pam-fi 1.33 // for(int i=0; i<6; i++) xv[i]=0.;
740     // for(int i=0; i<6; i++) yv[i]=0.;
741     // for(int i=0; i<6; i++) zv[i]=0.;
742     // for(int i=0; i<6; i++) axv[i]=0.;
743     // for(int i=0; i<6; i++) ayv[i]=0.;
744 pam-fi 1.13 for(int i=0; i<5; i++) {
745     for(int j=0; j<5; j++) coval[i][j]=0.;
746     }
747     }
748 pam-fi 1.33 /**
749 pam-fi 1.31 * Set the tracking mode
750     */
751 pam-fi 1.27 void TrkTrack::SetTrackingMode(int trackmode){
752     extern cMini2track track_;
753     track_.trackmode = trackmode;
754     }
755 pam-fi 1.33 /**
756 pam-fi 1.31 * Set the factor scale for tracking precision
757     */
758     void TrkTrack::SetPrecisionFactor(double fact){
759     extern cMini2track track_;
760     track_.fact = fact;
761     }
762 pam-fi 1.33 /**
763 pam-fi 1.34 * Set the minimum number of steps for tracking precision
764 pam-fi 1.31 */
765     void TrkTrack::SetStepMin(int istepmin){
766     extern cMini2track track_;
767     track_.istepmin = istepmin;
768     }
769 pam-fi 1.35 /**
770     * Returns 1 if the track is inside the magnet cavity
771     * Set the minimum number of steps for tracking precision
772     */
773     Bool_t TrkTrack::IsInsideCavity(){
774     float xmagntop, ymagntop, xmagnbottom, ymagnbottom;
775     xmagntop = xv[0] + (ZMAGNHIGH-zv[0])*tan(cos(-1.0)*axv[0]/180.);
776     ymagntop = yv[0] + (ZMAGNHIGH-zv[0])*tan(cos(-1.0)*ayv[0]/180.);
777     xmagnbottom = xv[5] + (ZMAGNLOW-zv[5])*tan(cos(-1.0)*axv[5]/180.);
778     ymagnbottom = yv[5] + (ZMAGNLOW-zv[5])*tan(cos(-1.0)*ayv[5]/180.);
779     if( xmagntop>XMAGNLOW && xmagntop<XMAGNHIGH &&
780     ymagntop>YMAGNLOW && ymagntop<YMAGNHIGH &&
781     xmagnbottom>XMAGNLOW && xmagnbottom<XMAGNHIGH &&
782     ymagnbottom>YMAGNLOW && ymagnbottom<YMAGNHIGH ) return(true);
783     else return(false);
784     }
785 pam-fi 1.33 /**
786 pam-fi 1.32 * Method to retrieve ID (0,1,...) of x-cluster (if any) associated to this track.
787     * If no cluster is associated, ID=-1.
788 pam-fi 1.29 * @param ip Tracker plane (0-5)
789     */
790 pam-fi 1.32 Int_t TrkTrack::GetClusterX_ID(int ip){
791     return ((Int_t)fabs(xgood[ip]))%10000000-1;
792 pam-fi 1.29 };
793 pam-fi 1.33 /**
794 pam-fi 1.32 * Method to retrieve ID (0-xxx) of y-cluster (if any) associated to this track.
795     * If no cluster is associated, ID=-1.
796 pam-fi 1.29 * @param ip Tracker plane (0-5)
797     */
798 pam-fi 1.32 Int_t TrkTrack::GetClusterY_ID(int ip){
799     return ((Int_t)fabs(ygood[ip]))%10000000-1;
800     };
801 pam-fi 1.33 /**
802 pam-fi 1.32 * Method to retrieve the ladder (0-4, increasing x) traversed by the track on this plane.
803     * If no ladder is traversed (dead area) the metod retuns -1.
804     * @param ip Tracker plane (0-5)
805     */
806     Int_t TrkTrack::GetLadder(int ip){
807     if(XGood(ip))return (Int_t)fabs(xgood[ip]/100000000)-1;
808     if(YGood(ip))return (Int_t)fabs(ygood[ip]/100000000)-1;
809     return -1;
810     };
811 pam-fi 1.33 /**
812 pam-fi 1.32 * Method to retrieve the sensor (0-1, increasing y) traversed by the track on this plane.
813     * If no sensor is traversed (dead area) the metod retuns -1.
814     * @param ip Tracker plane (0-5)
815     */
816     Int_t TrkTrack::GetSensor(int ip){
817     if(XGood(ip))return (Int_t)((Int_t)fabs(xgood[ip]/10000000)%10)-1;
818     if(YGood(ip))return (Int_t)((Int_t)fabs(ygood[ip]/10000000)%10)-1;
819     return -1;
820 pam-fi 1.29 };
821    
822 pam-fi 1.33 /**
823     * \brief Method to include a x-cluster to the track.
824     * @param ip Tracker plane (0-5)
825     * @param clid Cluster ID (0,1,...)
826     * @param is Sensor (0-1, increasing y)
827     * @see Fit(double pfixed, int& fail, int iprint, int froml1)
828     */
829     void TrkTrack::SetXGood(int ip, int clid, int is){
830     int il=0; //ladder (temporary)
831     bool bad=false; //ladder (temporary)
832     xgood[ip]=il*100000000+is*10000000+clid;
833     if(bad)xgood[ip]=-xgood[ip];
834     };
835     /**
836     * \brief Method to include a y-cluster to the track.
837     * @param ip Tracker plane (0-5)
838     * @param clid Cluster ID (0,1,...)
839     * @param is Sensor (0-1)
840     * @see Fit(double pfixed, int& fail, int iprint, int froml1)
841     */
842     void TrkTrack::SetYGood(int ip, int clid, int is){
843     int il=0; //ladder (temporary)
844     bool bad=false; //ladder (temporary)
845     ygood[ip]=il*100000000+is*10000000+clid;
846     if(bad)ygood[ip]=-ygood[ip];
847     };
848 pam-fi 1.29
849 mocchiut 1.1 //--------------------------------------
850     //
851     //
852     //--------------------------------------
853 pam-fi 1.10 void TrkTrack::Clear(){
854 pam-fi 1.21 // cout << "TrkTrack::Clear()"<<endl;
855     seqno = -1;
856     image = -1;
857     chi2 = 0;
858     nstep = 0;
859     for(int it1=0;it1<5;it1++){
860     al[it1] = 0;
861     for(int it2=0;it2<5;it2++)coval[it1][it2] = 0;
862     };
863     for(int ip=0;ip<6;ip++){
864     xgood[ip] = 0;
865     ygood[ip] = 0;
866     xm[ip] = 0;
867     ym[ip] = 0;
868     zm[ip] = 0;
869     resx[ip] = 0;
870     resy[ip] = 0;
871 pam-fi 1.32 tailx[ip] = 0;
872     taily[ip] = 0;
873 pam-fi 1.21 xv[ip] = 0;
874     yv[ip] = 0;
875     zv[ip] = 0;
876     axv[ip] = 0;
877     ayv[ip] = 0;
878     dedx_x[ip] = 0;
879     dedx_y[ip] = 0;
880    
881     };
882 pam-fi 1.32 // if(clx)clx->Clear();
883     // if(cly)cly->Clear();
884     // clx.Clear();
885     // cly.Clear();
886 pam-fi 1.10 };
887     //--------------------------------------
888     //
889     //
890     //--------------------------------------
891 pam-fi 1.11 void TrkTrack::Delete(){
892 pam-fi 1.21 // cout << "TrkTrack::Delete()"<<endl;
893 pam-fi 1.32 Clear();
894     // if(clx)delete clx;
895     // if(cly)delete cly;
896 pam-fi 1.11 };
897 pam-fi 1.21 //--------------------------------------
898 pam-fi 1.11 //
899     //
900     //--------------------------------------
901 pam-fi 1.10
902     //--------------------------------------
903     //
904     //
905     //--------------------------------------
906 mocchiut 1.1 TrkSinglet::TrkSinglet(){
907 pam-fi 1.21 // cout << "TrkSinglet::TrkSinglet() " << GetUniqueID()<<endl;
908 mocchiut 1.1 plane = 0;
909     coord[0] = 0;
910     coord[1] = 0;
911     sgnl = 0;
912 pam-fi 1.21 // cls = 0;
913 mocchiut 1.1 };
914     //--------------------------------------
915     //
916     //
917     //--------------------------------------
918     TrkSinglet::TrkSinglet(const TrkSinglet& s){
919 pam-fi 1.21 // cout << "TrkSinglet::TrkSinglet(const TrkSinglet& s) " << GetUniqueID()<<endl;
920 mocchiut 1.1 plane = s.plane;
921     coord[0] = s.coord[0];
922     coord[1] = s.coord[1];
923     sgnl = s.sgnl;
924 pam-fi 1.9 // cls = 0;//<<<<pointer
925 pam-fi 1.32 // cls = TRef(s.cls);
926 mocchiut 1.1 };
927     //--------------------------------------
928     //
929     //
930     //--------------------------------------
931     void TrkSinglet::Dump(){
932     int i=0;
933     cout << endl << "========== Singlet " ;
934     cout << endl << "plane : " << plane;
935     cout << endl << "coord[2] : "; while( i<2 && cout << coord[i] << " ") i++;
936     cout << endl << "sgnl : " << sgnl;
937     }
938     //--------------------------------------
939     //
940     //
941     //--------------------------------------
942 pam-fi 1.21 void TrkSinglet::Clear(){
943     // cout << "TrkSinglet::Clear() " << GetUniqueID()<<endl;
944     // cls=0;
945     plane=-1;
946     coord[0]=-999;
947     coord[1]=-999;
948     sgnl=0;
949    
950     }
951     //--------------------------------------
952     //
953     //
954     //--------------------------------------
955 mocchiut 1.1 TrkLevel2::TrkLevel2(){
956 mocchiut 1.24 // cout <<"TrkLevel2::TrkLevel2()"<<endl;
957 mocchiut 1.1 for(Int_t i=0; i<12 ; i++){
958 pam-fi 1.32 good[i] = -1;
959     VKmask[i] = 0;
960     VKflag[i] = 0;
961     };
962 pam-fi 1.21 Track = 0;
963     SingletX = 0;
964     SingletY = 0;
965 pam-fi 1.6
966 mocchiut 1.1 }
967     //--------------------------------------
968     //
969     //
970     //--------------------------------------
971 pam-fi 1.23 void TrkLevel2::Set(){
972     if(!Track)Track = new TClonesArray("TrkTrack");
973     if(!SingletX)SingletX = new TClonesArray("TrkSinglet");
974     if(!SingletY)SingletY = new TClonesArray("TrkSinglet");
975     }
976     //--------------------------------------
977     //
978     //
979     //--------------------------------------
980 mocchiut 1.1 void TrkLevel2::Dump(){
981 pam-fi 1.10
982     //
983 mocchiut 1.1 cout << endl << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-";
984 pam-fi 1.10 cout << endl << "good : "; for(int i=0; i<12; i++) cout << good[i]<<" ";
985 mocchiut 1.1 cout << endl << "ntrk() : " << this->ntrk() ;
986     cout << endl << "nclsx() : " << this->nclsx();
987     cout << endl << "nclsy() : " << this->nclsy();
988 pam-fi 1.21 if(Track){
989     TClonesArray &t = *Track;
990     for(int i=0; i<ntrk(); i++) ((TrkTrack *)t[i])->Dump();
991     }
992     if(SingletX){
993     TClonesArray &sx = *SingletX;
994     for(int i=0; i<nclsx(); i++) ((TrkSinglet *)sx[i])->Dump();
995     }
996     if(SingletY){
997     TClonesArray &sy = *SingletY;
998     for(int i=0; i<nclsy(); i++) ((TrkSinglet *)sy[i])->Dump();
999     }
1000 mocchiut 1.1 }
1001 pam-fi 1.36 /**
1002     * \brief Dump processing status
1003     */
1004     void TrkLevel2::StatusDump(int view){
1005     cout << "DSP n. "<<view+1<<" status: "<<hex<<good[view]<<endl;
1006     };
1007     /**
1008     * \brief Check event status
1009     *
1010     * Check the event status, according to a flag-mask given as input.
1011     * Return true if the view passes the check.
1012     *
1013     * @param view View number (0-11)
1014     * @param flagmask Mask of flags to check (eg. flagmask=0x111 no missing packet,
1015     * no crc error, no software alarm)
1016     *
1017     * @see TrkLevel2 class definition to know how the status flag is defined
1018     *
1019     */
1020     Bool_t TrkLevel2::StatusCheck(int view, int flagmask){
1021    
1022     if( view<0 || view >= 12)return false;
1023     return !(good[view]&flagmask);
1024    
1025     };
1026    
1027    
1028 mocchiut 1.1 //--------------------------------------
1029     //
1030     //
1031     //--------------------------------------
1032     /**
1033 pam-fi 1.32 * The method returns false if the viking-chip was masked
1034     * either apriori ,on the basis of the mask read from the DB,
1035     * or run-by-run, on the basis of the calibration parameters)
1036     * @param iv Tracker view (0-11)
1037     * @param ivk Viking-chip number (0-23)
1038     */
1039     Bool_t TrkLevel2::GetVKMask(int iv, int ivk){
1040     Int_t whichbit = (Int_t)pow(2,ivk);
1041     return (whichbit&VKmask[iv])!=0;
1042     }
1043     /**
1044     * The method returns false if the viking-chip was masked
1045     * for this event due to common-noise computation failure.
1046     * @param iv Tracker view (0-11)
1047     * @param ivk Viking-chip number (0-23)
1048     */
1049     Bool_t TrkLevel2::GetVKFlag(int iv, int ivk){
1050     Int_t whichbit = (Int_t)pow(2,ivk);
1051     return (whichbit&VKflag[iv])!=0;
1052     }
1053     /**
1054     * The method returns true if the viking-chip was masked, either
1055     * forced (see TrkLevel2::GetVKMask(int,int)) or
1056     * for this event only (TrkLevel2::GetVKFlag(int,int)).
1057     * @param iv Tracker view (0-11)
1058     * @param ivk Viking-chip number (0-23)
1059 mocchiut 1.1 */
1060 pam-fi 1.32 Bool_t TrkLevel2::IsMaskedVK(int iv, int ivk){
1061     return !(GetVKMask(iv,ivk)&&GetVKFlag(iv,ivk) );
1062     };
1063 pam-fi 1.10
1064 pam-fi 1.9 //--------------------------------------
1065     //
1066     //
1067     //--------------------------------------
1068     /**
1069     * Fills a TrkLevel2 object with values from a struct cTrkLevel2 (to get data from F77 common).
1070 pam-fi 1.29 * Ref to Level1 data (clusters) is also set. If l1==NULL no references are set.
1071     * (NB It make sense to set references only if events are stored in a tree that contains also the Level1 branch)
1072 pam-fi 1.9 */
1073     void TrkLevel2::SetFromLevel2Struct(cTrkLevel2 *l2, TrkLevel1 *l1){
1074    
1075 pam-fi 1.29 // cout << "void TrkLevel2::SetFromLevel2Struct(cTrkLevel2 *l2, TrkLevel1 *l1)"<<endl;
1076     Clear();
1077 pam-fi 1.32
1078 pam-fi 1.9 // temporary objects:
1079 pam-fi 1.29 TrkSinglet* t_singlet = new TrkSinglet();
1080     TrkTrack* t_track = new TrkTrack();
1081    
1082     // -----------------
1083     // general variables
1084     // -----------------
1085     for(Int_t i=0; i<12 ; i++){
1086     good[i] = l2->good[i];
1087 pam-fi 1.32 VKmask[i]=0;
1088     VKflag[i]=0;
1089     for(Int_t ii=0; ii<24 ; ii++){
1090     Int_t setbit = (Int_t)pow(2,ii);
1091     if( l2->vkflag[ii][i]!=-1 )VKmask[i]=VKmask[i]|setbit;
1092     if( l2->vkflag[ii][i]!=0 )VKflag[i]=VKflag[i]|setbit;
1093     };
1094 pam-fi 1.29 };
1095     // --------------
1096     // *** TRACKS ***
1097     // --------------
1098     if(!Track) Track = new TClonesArray("TrkTrack");
1099     TClonesArray &t = *Track;
1100 pam-fi 1.32
1101 pam-fi 1.29 for(int i=0; i<l2->ntrk; i++){
1102     t_track->seqno = i;// NBNBNBNB deve sempre essere = i
1103     t_track->image = l2->image[i]-1;
1104     t_track->chi2 = l2->chi2_nt[i];
1105     t_track->nstep = l2->nstep_nt[i];
1106     for(int it1=0;it1<5;it1++){
1107     t_track->al[it1] = l2->al_nt[i][it1];
1108     for(int it2=0;it2<5;it2++)
1109     t_track->coval[it1][it2] = l2->coval[i][it2][it1];
1110 pam-fi 1.9 };
1111 pam-fi 1.29 for(int ip=0;ip<6;ip++){
1112 pam-fi 1.32 // ---------------------------------
1113     // new implementation of xgood/ygood
1114     // ---------------------------------
1115     t_track->xgood[ip] = l2->cltrx[i][ip]; //cluster ID
1116     t_track->ygood[ip] = l2->cltry[i][ip]; //cluster ID
1117     t_track->xgood[ip] += 10000000*l2->ls[i][ip]; // ladder+sensor
1118     t_track->ygood[ip] += 10000000*l2->ls[i][ip]; // ladder+sensor
1119     if(l2->xbad[i][ip]>0)t_track->xgood[ip]=-t_track->xgood[ip];
1120     if(l2->ybad[i][ip]>0)t_track->ygood[ip]=-t_track->ygood[ip];
1121     // if(l2->xbad[i][ip]>0 || l2->ybad[i][ip]>0){
1122     // if(l2->dedx_x[i][ip]<0 || l2->dedx_y[i][ip]<0){
1123     // cout << ip << " - "<< l2->cltrx[i][ip] << " "<<l2->cltry[i][ip]<<" "<<l2->ls[i][ip]<<endl;
1124     // cout << ip << " - "<<t_track->xgood[ip]<<" "<<t_track->ygood[ip]<<endl;
1125     // cout << ip << " - "<<t_track->GetClusterX_ID(ip)<<" "<<t_track->GetClusterY_ID(ip)<<" "<<t_track->GetLadder(ip)<<" "<<t_track->GetSensor(ip)<<endl;
1126     // cout << ip << " - "<<t_track->BadClusterX(ip)<<" "<<t_track->BadClusterY(ip)<<endl;
1127     // cout << ip << " - "<<t_track->SaturatedClusterX(ip)<<" "<<t_track->SaturatedClusterY(ip)<<endl;
1128     // }
1129 pam-fi 1.29 t_track->xm[ip] = l2->xm_nt[i][ip];
1130     t_track->ym[ip] = l2->ym_nt[i][ip];
1131     t_track->zm[ip] = l2->zm_nt[i][ip];
1132     t_track->resx[ip] = l2->resx_nt[i][ip];
1133     t_track->resy[ip] = l2->resy_nt[i][ip];
1134 pam-fi 1.32 t_track->tailx[ip] = l2->tailx[i][ip];
1135     t_track->taily[ip] = l2->taily[i][ip];
1136 pam-fi 1.29 t_track->xv[ip] = l2->xv_nt[i][ip];
1137     t_track->yv[ip] = l2->yv_nt[i][ip];
1138     t_track->zv[ip] = l2->zv_nt[i][ip];
1139     t_track->axv[ip] = l2->axv_nt[i][ip];
1140     t_track->ayv[ip] = l2->ayv_nt[i][ip];
1141     t_track->dedx_x[ip] = l2->dedx_x[i][ip];
1142     t_track->dedx_y[ip] = l2->dedx_y[i][ip];
1143     //-----------------------------------------------------
1144     //-----------------------------------------------------
1145     //-----------------------------------------------------
1146     //-----------------------------------------------------
1147     };
1148 pam-fi 1.32 // if(t_track->IsSaturated())t_track->Dump();
1149 pam-fi 1.29 new(t[i]) TrkTrack(*t_track);
1150     t_track->Clear();
1151     };
1152 pam-fi 1.32
1153 pam-fi 1.29 // ----------------
1154     // *** SINGLETS ***
1155     // ----------------
1156     if(!SingletX)SingletX = new TClonesArray("TrkSinglet");
1157     TClonesArray &sx = *SingletX;
1158     for(int i=0; i<l2->nclsx; i++){
1159     t_singlet->plane = l2->planex[i];
1160     t_singlet->coord[0] = l2->xs[i][0];
1161     t_singlet->coord[1] = l2->xs[i][1];
1162     t_singlet->sgnl = l2->signlxs[i];
1163     //-----------------------------------------------------
1164 pam-fi 1.32 // if(l1) t_singlet->cls = l1->GetCluster(l2->clsx[i]-1);
1165 pam-fi 1.29 //-----------------------------------------------------
1166     new(sx[i]) TrkSinglet(*t_singlet);
1167     t_singlet->Clear();
1168     }
1169     if(!SingletY)SingletY = new TClonesArray("TrkSinglet");
1170     TClonesArray &sy = *SingletY;
1171     for(int i=0; i<l2->nclsy; i++){
1172     t_singlet->plane = l2->planey[i];
1173     t_singlet->coord[0] = l2->ys[i][0];
1174     t_singlet->coord[1] = l2->ys[i][1];
1175     t_singlet->sgnl = l2->signlys[i];
1176 pam-fi 1.26 //-----------------------------------------------------
1177 pam-fi 1.32 // if(l1) t_singlet->cls = l1->GetCluster(l2->clsy[i]-1);
1178 pam-fi 1.26 //-----------------------------------------------------
1179 pam-fi 1.29 new(sy[i]) TrkSinglet(*t_singlet);
1180     t_singlet->Clear();
1181     };
1182 pam-fi 1.5
1183 pam-fi 1.29 delete t_track;
1184     delete t_singlet;
1185 mocchiut 1.1 }
1186 pam-fi 1.7 /**
1187     * Fills a struct cTrkLevel2 with values from a TrkLevel2 object (to put data into a F77 common).
1188     */
1189    
1190     void TrkLevel2::GetLevel2Struct(cTrkLevel2 *l2) const {
1191    
1192     // general variables
1193 pam-fi 1.10 // l2->good2 = good2 ;
1194 pam-fi 1.7 for(Int_t i=0; i<12 ; i++){
1195 pam-fi 1.10 // l2->crc[i] = crc[i];
1196     l2->good[i] = good[i];
1197 pam-fi 1.7 };
1198     // *** TRACKS ***
1199    
1200 pam-fi 1.21 if(Track){
1201     l2->ntrk = Track->GetEntries();
1202     for(Int_t i=0;i<l2->ntrk;i++){
1203     l2->image[i] = 1 + ((TrkTrack *)Track->At(i))->image;
1204     l2->chi2_nt[i] = ((TrkTrack *)Track->At(i))->chi2;
1205     l2->nstep_nt[i] = ((TrkTrack *)Track->At(i))->nstep;
1206     for(int it1=0;it1<5;it1++){
1207     l2->al_nt[i][it1] = ((TrkTrack *)Track->At(i))->al[it1];
1208     for(int it2=0;it2<5;it2++)
1209     l2->coval[i][it2][it1] = ((TrkTrack *)Track->At(i))->coval[it1][it2];
1210     };
1211     for(int ip=0;ip<6;ip++){
1212 pam-fi 1.30 l2->xgood_nt[i][ip] = ((TrkTrack *)Track->At(i))->XGood(ip);
1213     l2->ygood_nt[i][ip] = ((TrkTrack *)Track->At(i))->YGood(ip);
1214 pam-fi 1.21 l2->xm_nt[i][ip] = ((TrkTrack *)Track->At(i))->xm[ip];
1215     l2->ym_nt[i][ip] = ((TrkTrack *)Track->At(i))->ym[ip];
1216     l2->zm_nt[i][ip] = ((TrkTrack *)Track->At(i))->zm[ip];
1217     l2->resx_nt[i][ip] = ((TrkTrack *)Track->At(i))->resx[ip];
1218     l2->resy_nt[i][ip] = ((TrkTrack *)Track->At(i))->resy[ip];
1219 pam-fi 1.32 l2->tailx[i][ip] = ((TrkTrack *)Track->At(i))->tailx[ip];
1220     l2->taily[i][ip] = ((TrkTrack *)Track->At(i))->taily[ip];
1221 pam-fi 1.21 l2->xv_nt[i][ip] = ((TrkTrack *)Track->At(i))->xv[ip];
1222     l2->yv_nt[i][ip] = ((TrkTrack *)Track->At(i))->yv[ip];
1223     l2->zv_nt[i][ip] = ((TrkTrack *)Track->At(i))->zv[ip];
1224     l2->axv_nt[i][ip] = ((TrkTrack *)Track->At(i))->axv[ip];
1225     l2->ayv_nt[i][ip] = ((TrkTrack *)Track->At(i))->ayv[ip];
1226     l2->dedx_x[i][ip] = ((TrkTrack *)Track->At(i))->dedx_x[ip];
1227     l2->dedx_y[i][ip] = ((TrkTrack *)Track->At(i))->dedx_y[ip];
1228     };
1229     }
1230     }
1231     // *** SINGLETS ***
1232     if(SingletX){
1233     l2->nclsx = SingletX->GetEntries();
1234     for(Int_t i=0;i<l2->nclsx;i++){
1235     l2->planex[i] = ((TrkSinglet *)SingletX->At(i))->plane;
1236     l2->xs[i][0] = ((TrkSinglet *)SingletX->At(i))->coord[0];
1237     l2->xs[i][1] = ((TrkSinglet *)SingletX->At(i))->coord[1];
1238     l2->signlxs[i] = ((TrkSinglet *)SingletX->At(i))->sgnl;
1239     }
1240 pam-fi 1.7 }
1241    
1242 pam-fi 1.21 if(SingletY){
1243     l2->nclsy = SingletY->GetEntries();
1244     for(Int_t i=0;i<l2->nclsy;i++){
1245     l2->planey[i] = ((TrkSinglet *)SingletY->At(i))->plane;
1246     l2->ys[i][0] = ((TrkSinglet *)SingletY->At(i))->coord[0];
1247     l2->ys[i][1] = ((TrkSinglet *)SingletY->At(i))->coord[1];
1248     l2->signlys[i] = ((TrkSinglet *)SingletY->At(i))->sgnl;
1249     }
1250 pam-fi 1.7 }
1251     }
1252 mocchiut 1.1 //--------------------------------------
1253     //
1254     //
1255     //--------------------------------------
1256     void TrkLevel2::Clear(){
1257     for(Int_t i=0; i<12 ; i++){
1258 pam-fi 1.21 good[i] = -1;
1259 pam-fi 1.32 VKflag[i] = 0;
1260     VKmask[i] = 0;
1261 pam-fi 1.21 };
1262     // if(Track)Track->Clear("C");
1263     // if(SingletX)SingletX->Clear("C");
1264     // if(SingletY)SingletY->Clear("C");
1265     if(Track)Track->Delete();
1266     if(SingletX)SingletX->Delete();
1267     if(SingletY)SingletY->Delete();
1268     }
1269     // //--------------------------------------
1270     // //
1271     // //
1272     // //--------------------------------------
1273 pam-fi 1.11 void TrkLevel2::Delete(){
1274    
1275 pam-fi 1.21 // cout << "void TrkLevel2::Delete()"<<endl;
1276     Clear();
1277     if(Track)delete Track;
1278     if(SingletX)delete SingletX;
1279     if(SingletY)delete SingletY;
1280    
1281 pam-fi 1.11 }
1282     //--------------------------------------
1283     //
1284     //
1285     //--------------------------------------
1286 mocchiut 1.1 /**
1287     * 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).
1288     * This method is overridden by PamLevel2::GetTracks(), where calorimeter and TOF information is used.
1289     */
1290 pam-fi 1.8 TRefArray *TrkLevel2::GetTracks_NFitSorted(){
1291 pam-fi 1.3
1292 pam-fi 1.21 if(!Track)return 0;
1293    
1294     TRefArray *sorted = new TRefArray();
1295 pam-fi 1.8
1296 pam-fi 1.21 TClonesArray &t = *Track;
1297 pam-fi 1.8 // TClonesArray &ts = *PhysicalTrack;
1298 pam-fi 1.21 int N = ntrk();
1299     vector<int> m(N); for(int i=0; i<N; i++)m[i]=1;
1300 pam-fi 1.8 // int m[50]; for(int i=0; i<N; i++)m[i]=1;
1301    
1302 pam-fi 1.21 int indo=0;
1303     int indi=0;
1304 pam-fi 1.26 while(N > 0){
1305     // while(N != 0){
1306 pam-fi 1.21 int nfit =0;
1307     float chi2ref = numeric_limits<float>::max();
1308 pam-fi 1.9
1309 pam-fi 1.21 // first loop to search maximum num. of fit points
1310     for(int i=0; i < ntrk(); i++){
1311     if( ((TrkTrack *)t[i])->GetNtot() >= nfit && m[i]==1){
1312     nfit = ((TrkTrack *)t[i])->GetNtot();
1313     }
1314     }
1315     //second loop to search minimum chi2 among selected
1316 pam-fi 1.26 for(int i=0; i<ntrk(); i++){
1317 pam-fi 1.21 Float_t chi2 = ((TrkTrack *)t[i])->chi2;
1318 pam-fi 1.26 if(chi2 < 0) chi2 = -chi2*1000;
1319 pam-fi 1.21 if( chi2 < chi2ref
1320     && ((TrkTrack *)t[i])->GetNtot() == nfit
1321     && m[i]==1){
1322     chi2ref = ((TrkTrack *)t[i])->chi2;
1323     indi = i;
1324     };
1325     };
1326     if( ((TrkTrack *)t[indi])->HasImage() ){
1327     m[((TrkTrack *)t[indi])->image] = 0;
1328     N--;
1329 pam-fi 1.8
1330 pam-fi 1.26 // cout << "i** "<< ((TrkTrack *)t[indi])->image << " " << nfiti <<" "<<chi2i<<endl;
1331 pam-fi 1.21 };
1332     sorted->Add( (TrkTrack*)t[indi] );
1333 pam-fi 1.3
1334 pam-fi 1.21 m[indi] = 0;
1335 pam-fi 1.26 // cout << "SORTED "<< indo << " "<< indi << " "<< N << " "<<((TrkTrack *)t[indi])->image<<" "<<chi2ref<<endl;
1336 pam-fi 1.21 N--;
1337     indo++;
1338     }
1339     m.clear();
1340 pam-fi 1.26 // cout << "GetTracks_NFitSorted(it): Done"<< endl;
1341 pam-fi 1.8
1342 pam-fi 1.21 return sorted;
1343 pam-fi 1.6 // return PhysicalTrack;
1344 pam-fi 1.3 }
1345 mocchiut 1.1 //--------------------------------------
1346     //
1347     //
1348     //--------------------------------------
1349     /**
1350     * Retrieves the is-th stored track.
1351     * @param it Track number, ranging from 0 to ntrk().
1352     * Fitted tracks ( images included ) are stored in a TObjectArray ( TrkLevel2::Track ) in the same order they are returned by the F77 fitting routine.
1353     */
1354     TrkTrack *TrkLevel2::GetStoredTrack(int is){
1355    
1356     if(is >= this->ntrk()){
1357     cout << "** TrkLevel2 ** Track "<< is << "doen not exits! " << endl;
1358     cout << " Stored tracks ntrk() = "<< this->ntrk() << endl;
1359     return 0;
1360     }
1361 pam-fi 1.21 if(!Track){
1362     cout << "TrkTrack *TrkLevel2::GetStoredTrack(int is) >> (TClonesArray*) Track ==0 "<<endl;
1363     };
1364 mocchiut 1.1 TClonesArray &t = *(Track);
1365     TrkTrack *track = (TrkTrack*)t[is];
1366     return track;
1367     }
1368     //--------------------------------------
1369     //
1370     //
1371     //--------------------------------------
1372     /**
1373 pam-fi 1.6 * Retrieves the is-th stored X singlet.
1374     * @param it Singlet number, ranging from 0 to nclsx().
1375     */
1376     TrkSinglet *TrkLevel2::GetSingletX(int is){
1377    
1378     if(is >= this->nclsx()){
1379     cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl;
1380     cout << " Stored x-singlets nclsx() = "<< this->nclsx() << endl;
1381     return 0;
1382     }
1383 pam-fi 1.21 if(!SingletX)return 0;
1384 pam-fi 1.6 TClonesArray &t = *(SingletX);
1385     TrkSinglet *singlet = (TrkSinglet*)t[is];
1386     return singlet;
1387     }
1388     //--------------------------------------
1389     //
1390     //
1391     //--------------------------------------
1392     /**
1393     * Retrieves the is-th stored Y singlet.
1394     * @param it Singlet number, ranging from 0 to nclsx().
1395     */
1396     TrkSinglet *TrkLevel2::GetSingletY(int is){
1397    
1398     if(is >= this->nclsy()){
1399     cout << "** TrkLevel2 ** Singlet "<< is << "doen not exits! " << endl;
1400     cout << " Stored y-singlets nclsy() = "<< this->nclsx() << endl;
1401     return 0;
1402     }
1403 pam-fi 1.21 if(!SingletY)return 0;
1404 pam-fi 1.6 TClonesArray &t = *(SingletY);
1405     TrkSinglet *singlet = (TrkSinglet*)t[is];
1406     return singlet;
1407     }
1408     //--------------------------------------
1409     //
1410     //
1411     //--------------------------------------
1412     /**
1413 mocchiut 1.1 * Retrieves the it-th "physical" track, sorted by the method GetNTracks().
1414     * @param it Track number, ranging from 0 to GetNTracks().
1415     */
1416 pam-fi 1.10
1417 pam-fi 1.8 TrkTrack *TrkLevel2::GetTrack(int it){
1418    
1419     if(it >= this->GetNTracks()){
1420     cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl;
1421     cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl;
1422     return 0;
1423     }
1424    
1425     TRefArray *sorted = GetTracks(); //TEMPORANEO
1426 pam-fi 1.21 if(!sorted)return 0;
1427 pam-fi 1.8 TrkTrack *track = (TrkTrack*)sorted->At(it);
1428 pam-fi 1.21 sorted->Clear();
1429     delete sorted;
1430 pam-fi 1.8 return track;
1431 mocchiut 1.1 }
1432 pam-fi 1.6 /**
1433     * Give the number of "physical" tracks, sorted by the method GetTracks().
1434     */
1435 pam-fi 1.5 Int_t TrkLevel2::GetNTracks(){
1436 pam-fi 1.8
1437     Float_t ntot=0;
1438 pam-fi 1.21 if(!Track)return 0;
1439 pam-fi 1.8 TClonesArray &t = *Track;
1440 mocchiut 1.12 for(int i=0; i<ntrk(); i++) {
1441 pam-fi 1.8 if( ((TrkTrack *)t[i])->GetImageSeqNo() == -1 ) ntot+=1.;
1442     else ntot+=0.5;
1443     }
1444     return (Int_t)ntot;
1445    
1446 pam-fi 1.5 };
1447 mocchiut 1.1 //--------------------------------------
1448     //
1449     //
1450     //--------------------------------------
1451     /**
1452     * Retrieves (if present) the image of the it-th "physical" track, sorted by the method GetNTracks().
1453     * @param it Track number, ranging from 0 to GetNTracks().
1454     */
1455 pam-fi 1.8 TrkTrack *TrkLevel2::GetTrackImage(int it){
1456    
1457 pam-fi 1.21 if(it >= this->GetNTracks()){
1458     cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl;
1459     cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl;
1460     return 0;
1461     }
1462 pam-fi 1.8
1463 pam-fi 1.21 TRefArray* sorted = GetTracks(); //TEMPORANEO
1464     if(!sorted)return 0;
1465     TrkTrack *track = (TrkTrack*)sorted->At(it);
1466 pam-fi 1.8
1467 pam-fi 1.21 if(!track->HasImage()){
1468     cout << "** TrkLevel2 ** Track "<< it << "does not have image! " << endl;
1469     return 0;
1470     }
1471     if(!Track)return 0;
1472     TrkTrack *image = (TrkTrack*)(*Track)[track->image];
1473    
1474     sorted->Delete();
1475     delete sorted;
1476 pam-fi 1.8
1477 pam-fi 1.21 return image;
1478 pam-fi 1.8
1479 mocchiut 1.1 }
1480     //--------------------------------------
1481     //
1482     //
1483     //--------------------------------------
1484     /**
1485     * Loads the magnetic field.
1486     * @param s Path of the magnetic-field files.
1487     */
1488 pam-fi 1.16 void TrkLevel2::LoadField(TString path){
1489     //
1490 pam-fi 1.26 // strcpy(path_.path,path.Data());
1491     // path_.pathlen = path.Length();
1492     // path_.error = 0;
1493     // readb_();
1494    
1495 pam-fi 1.33 TrkParams::SetTrackingMode();
1496     TrkParams::SetPrecisionFactor();
1497     TrkParams::SetStepMin();
1498    
1499 pam-fi 1.26 TrkParams::Set(path,1);
1500 pam-fi 1.28 TrkParams::Load(1);
1501 pam-fi 1.26
1502 pam-fi 1.16 //
1503 mocchiut 1.1 };
1504 pam-fi 1.33 // /**
1505     // * Get BY (kGauss)
1506     // * @param v (x,y,z) coordinates in cm
1507     // */
1508     // float TrkLevel2::GetBX(float* v){
1509     // float b[3];
1510     // gufld_(v,b);
1511     // return b[0]/10.;
1512     // }
1513     // /**
1514     // * Get BY (kGauss)
1515     // * @param v (x,y,z) coordinates in cm
1516     // */
1517     // float TrkLevel2::GetBY(float* v){
1518     // float b[3];
1519     // gufld_(v,b);
1520     // return b[1]/10.;
1521     // }
1522     // /**
1523     // * Get BY (kGauss)
1524     // * @param v (x,y,z) coordinates in cm
1525     // */
1526     // float TrkLevel2::GetBZ(float* v){
1527     // float b[3];
1528     // gufld_(v,b);
1529     // return b[2]/10.;
1530     // }
1531 mocchiut 1.1 //--------------------------------------
1532     //
1533     //
1534     //--------------------------------------
1535     /**
1536 pam-fi 1.6 * Get tracker-plane (mechanical) z-coordinate
1537     * @param plane_id plane index (1=TOP,2,3,4,5,6=BOTTOM)
1538     */
1539     Float_t TrkLevel2::GetZTrk(Int_t plane_id){
1540     switch(plane_id){
1541     case 1: return ZTRK1;
1542     case 2: return ZTRK2;
1543     case 3: return ZTRK3;
1544     case 4: return ZTRK4;
1545     case 5: return ZTRK5;
1546     case 6: return ZTRK6;
1547     default: return 0.;
1548     };
1549     };
1550     //--------------------------------------
1551     //
1552     //
1553     //--------------------------------------
1554     /**
1555 pam-fi 1.2 * Trajectory default constructor.
1556     * (By default is created with z-coordinates inside the tracking volume)
1557     */
1558     Trajectory::Trajectory(){
1559     npoint = 10;
1560     x = new float[npoint];
1561     y = new float[npoint];
1562     z = new float[npoint];
1563     thx = new float[npoint];
1564     thy = new float[npoint];
1565     tl = new float[npoint];
1566 pam-fi 1.6 float dz = ((ZTRK1)-(ZTRK6))/(npoint-1);
1567 pam-fi 1.2 for(int i=0; i<npoint; i++){
1568     x[i] = 0;
1569     y[i] = 0;
1570 pam-fi 1.6 z[i] = (ZTRK1) - i*dz;
1571 pam-fi 1.2 thx[i] = 0;
1572     thy[i] = 0;
1573     tl[i] = 0;
1574     }
1575     }
1576     //--------------------------------------
1577     //
1578     //
1579     //--------------------------------------
1580     /**
1581 mocchiut 1.1 * Trajectory constructor.
1582 pam-fi 1.2 * (By default is created with z-coordinates inside the tracking volume)
1583 mocchiut 1.1 * \param n Number of points
1584     */
1585     Trajectory::Trajectory(int n){
1586 pam-fi 1.2 if(n<=0){
1587     cout << "NB! Trajectory must have at least 1 point >>> created with 10 points" << endl;
1588     n=10;
1589     }
1590 mocchiut 1.1 npoint = n;
1591     x = new float[npoint];
1592     y = new float[npoint];
1593     z = new float[npoint];
1594 pam-fi 1.2 thx = new float[npoint];
1595     thy = new float[npoint];
1596     tl = new float[npoint];
1597 pam-fi 1.6 float dz = ((ZTRK1)-(ZTRK6))/(npoint-1);
1598 mocchiut 1.1 for(int i=0; i<npoint; i++){
1599 pam-fi 1.2 x[i] = 0;
1600 mocchiut 1.1 y[i] = 0;
1601 pam-fi 1.6 z[i] = (ZTRK1) - i*dz;
1602 pam-fi 1.2 thx[i] = 0;
1603     thy[i] = 0;
1604     tl[i] = 0;
1605 mocchiut 1.1 }
1606     }
1607     //--------------------------------------
1608     //
1609     //
1610     //--------------------------------------
1611     /**
1612     * Trajectory constructor.
1613     * \param n Number of points
1614     * \param pz Pointer to float array, defining z coordinates
1615     */
1616     Trajectory::Trajectory(int n, float* zin){
1617 pam-fi 1.2 npoint = 10;
1618     if(n>0)npoint = n;
1619 mocchiut 1.1 x = new float[npoint];
1620     y = new float[npoint];
1621     z = new float[npoint];
1622 pam-fi 1.2 thx = new float[npoint];
1623     thy = new float[npoint];
1624     tl = new float[npoint];
1625     int i=0;
1626     do{
1627 pam-fi 1.21 x[i] = 0;
1628     y[i] = 0;
1629     z[i] = zin[i];
1630     thx[i] = 0;
1631     thy[i] = 0;
1632     tl[i] = 0;
1633     i++;
1634 pam-fi 1.2 }while(zin[i-1] > zin[i] && i < npoint);
1635     npoint=i;
1636     if(npoint != n)cout << "NB! Trajectory created with "<<npoint<<" points"<<endl;
1637 mocchiut 1.1 }
1638 pam-fi 1.21 void Trajectory::Delete(){
1639    
1640     if(x) delete [] x;
1641     if(y) delete [] y;
1642     if(z) delete [] z;
1643     if(thx) delete [] thx;
1644     if(thy) delete [] thy;
1645     if(tl) delete [] tl;
1646    
1647     }
1648 mocchiut 1.1 //--------------------------------------
1649     //
1650     //
1651     //--------------------------------------
1652     /**
1653     * Dump the trajectory coordinates.
1654     */
1655     void Trajectory::Dump(){
1656     cout <<endl<< "Trajectory ========== "<<endl;
1657     for (int i=0; i<npoint; i++){
1658 pam-fi 1.2 cout << i <<" >> " << x[i] <<" "<< y[i] <<" "<< z[i] ;
1659     cout <<" -- " << thx[i] <<" "<< thy[i] ;
1660     cout <<" -- " << tl[i] << endl;
1661 mocchiut 1.1 };
1662     }
1663 pam-fi 1.2 //--------------------------------------
1664     //
1665     //
1666     //--------------------------------------
1667     /**
1668     * Get trajectory length between two points
1669     * @param ifirst first point (default 0)
1670     * @param ilast last point (default npoint)
1671     */
1672     float Trajectory::GetLength(int ifirst, int ilast){
1673     if( ifirst<0 ) ifirst = 0;
1674     if( ilast>=npoint) ilast = npoint-1;
1675     float l=0;
1676     for(int i=ifirst;i<=ilast;i++){
1677     l=l+tl[i];
1678     };
1679     if(z[ilast] > ZINI)l=l-tl[ilast];
1680     if(z[ifirst] < ZINI) l=l-tl[ifirst];
1681    
1682     return l;
1683 mocchiut 1.1
1684 pam-fi 1.2 }
1685 pam-fi 1.6
1686 pam-fi 1.19 /**
1687     * Evaluates the trajectory in the apparatus associated to the track.
1688     * 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.
1689     * @param t pointer to an object of the class Trajectory,
1690     * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ).
1691     * @return error flag.
1692     */
1693     int Trajectory::DoTrack2(float* al){
1694    
1695     double *dxout = new double[npoint];
1696     double *dyout = new double[npoint];
1697     double *dthxout = new double[npoint];
1698     double *dthyout = new double[npoint];
1699     double *dtlout = new double[npoint];
1700     double *dzin = new double[npoint];
1701     double dal[5];
1702    
1703     int ifail = 0;
1704    
1705     for (int i=0; i<5; i++) dal[i] = (double)al[i];
1706     for (int i=0; i<npoint; i++) dzin[i] = (double)z[i];
1707    
1708 pam-fi 1.26 TrkParams::Load(1);
1709     if( !TrkParams::IsLoaded(1) ){
1710     cout << "int Trajectory::DoTrack2(float* al) --- ERROR --- m.field not loaded"<<endl;
1711     return 0;
1712     }
1713 pam-fi 1.19 dotrack2_(&(npoint),dzin,dxout,dyout,dthxout,dthyout,dtlout,dal,&ifail);
1714    
1715     for (int i=0; i<npoint; i++){
1716     x[i] = (float)*dxout++;
1717     y[i] = (float)*dyout++;
1718     thx[i] = (float)*dthxout++;
1719     thy[i] = (float)*dthyout++;
1720     tl[i] = (float)*dtlout++;
1721     }
1722    
1723     return ifail;
1724     };
1725 pam-fi 1.10
1726 mocchiut 1.1 ClassImp(TrkLevel2);
1727     ClassImp(TrkSinglet);
1728     ClassImp(TrkTrack);
1729     ClassImp(Trajectory);

  ViewVC Help
Powered by ViewVC 1.1.23