/[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.32 - (hide annotations) (download)
Fri Apr 27 10:39:57 2007 UTC (17 years, 7 months ago) by pam-fi
Branch: MAIN
CVS Tags: v3r04, v3r03
Changes since 1.31: +232 -152 lines
v3r00: new hough parameters, new variables, and other things...

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

  ViewVC Help
Powered by ViewVC 1.1.23