/[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.1 - (hide annotations) (download)
Fri May 19 13:15:54 2006 UTC (18 years, 6 months ago) by mocchiut
Branch: MAIN
Branch point for: DarthVader
Initial revision

1 mocchiut 1.1 /**
2     * \file TrkLevel2.cpp
3     * \author Elena Vannuccini
4     */
5     #include <TrkLevel2.h>
6     #include <iostream>
7     using namespace std;
8     //......................................
9     // F77 routines
10     //......................................
11     extern "C" {
12     void dotrack_(int*, double*, double*, double*, double*, int*);
13     int readb_(const char*);
14     }
15     //--------------------------------------
16     //
17     //
18     //--------------------------------------
19     TrkTrack::TrkTrack(){
20     image = 0;
21     chi2 = 0;
22     for(int it1=0;it1<5;it1++){
23     al[it1] = 0;
24     for(int it2=0;it2<5;it2++)
25     coval[it1][it2] = 0;
26     };
27     for(int ip=0;ip<6;ip++){
28     xgood[ip] = 0;
29     ygood[ip] = 0;
30     xm[ip] = 0;
31     ym[ip] = 0;
32     zm[ip] = 0;
33     resx[ip] = 0;
34     resy[ip] = 0;
35     xv[ip] = 0;
36     yv[ip] = 0;
37     zv[ip] = 0;
38     axv[ip] = 0;
39     ayv[ip] = 0;
40     dedx_x[ip] = 0;
41     dedx_y[ip] = 0;
42     };
43     };
44     //--------------------------------------
45     //
46     //
47     //--------------------------------------
48     TrkTrack::TrkTrack(const TrkTrack& t){
49     image = t.image;
50     chi2 = t.chi2;
51     for(int it1=0;it1<5;it1++){
52     al[it1] = t.al[it1];
53     for(int it2=0;it2<5;it2++)
54     coval[it1][it2] = t.coval[it1][it2];
55     };
56     for(int ip=0;ip<6;ip++){
57     xgood[ip] = t.xgood[ip];
58     ygood[ip] = t.ygood[ip];
59     xm[ip] = t.xm[ip];
60     ym[ip] = t.ym[ip];
61     zm[ip] = t.zm[ip];
62     resx[ip] = t.resx[ip];
63     resy[ip] = t.resy[ip];
64     xv[ip] = t.xv[ip];
65     yv[ip] = t.yv[ip];
66     zv[ip] = t.zv[ip];
67     axv[ip] = t.axv[ip];
68     ayv[ip] = t.ayv[ip];
69     dedx_x[ip] = t.dedx_x[ip];
70     dedx_y[ip] = t.dedx_y[ip];
71     };
72     };
73     //--------------------------------------
74     //
75     //
76     //--------------------------------------
77     /**
78     * Evaluates the trajectory in the apparatus associated to the track.
79     * 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.
80     * @param t pointer to an object of the class Trajectory,
81     * which z coordinates should be previously initialized by calling the proper constructor ( Trajectory::Trajectory(int n, float* zin) ).
82     * @return error flag.
83     */
84     int TrkTrack::DoTrack(Trajectory* t){
85    
86     double *dxout = new double[t->npoint];
87     double *dyout = new double[t->npoint];
88     double *dzin = new double[t->npoint];
89     double dal[5];
90    
91     int ifail = 0;
92    
93     for (int i=0; i<5; i++) dal[i] = (double)al[i];
94     for (int i=0; i<t->npoint; i++) dzin[i] = (double)t->z[i];
95    
96     dotrack_(&(t->npoint),dzin,dxout,dyout,dal,&ifail);
97    
98     for (int i=0; i<t->npoint; i++){
99     t->x[i] = (float)*dxout++;
100     t->y[i] = (float)*dyout++;
101     }
102    
103     // delete [] dxout;
104     // delete [] dyout;
105     // delete [] dzin;
106    
107     return ifail;
108     };
109     //--------------------------------------
110     //
111     //
112     //--------------------------------------
113     //float TrkTrack::BdL(){
114     //};
115     //--------------------------------------
116     //
117     //
118     //--------------------------------------
119     Float_t TrkTrack::GetRigidity(){
120     Float_t rig=0;
121     if(chi2>0)rig=1./al[4];
122     if(rig<0) rig=-rig;
123     return rig;
124     };
125     //
126     Float_t TrkTrack::GetDeflection(){
127     Float_t def=0;
128     if(chi2>0)def=al[4];
129     return def;
130     };
131     //
132     Float_t TrkTrack::GetDEDX(){
133     Float_t dedx=0;
134     for(Int_t i=0; i<6; i++)dedx+=dedx_x[i]*xgood[i]+dedx_y[i]*ygood[i];
135     dedx = dedx/(this->GetNX()+this->GetNY());
136     return dedx;
137     };
138    
139     //--------------------------------------
140     //
141     //
142     //--------------------------------------
143     void TrkTrack::Dump(){
144     cout << endl << "========== Track " ;
145     cout << endl << "al : "; for(int i=0; i<5; i++)cout << al[i] << " ";
146     cout << endl << "chi^2 : "<< chi2;
147     cout << endl << "xgood : "; for(int i=0; i<6; i++)cout << xgood[i] ;
148     cout << endl << "ygood : "; for(int i=0; i<6; i++)cout << ygood[i] ;
149     cout << endl << "xm : "; for(int i=0; i<6; i++)cout << xm[i] << " ";
150     cout << endl << "ym : "; for(int i=0; i<6; i++)cout << ym[i] << " ";
151     cout << endl << "zm : "; for(int i=0; i<6; i++)cout << zm[i] << " ";
152     cout << endl << "dedx_x : "; for(int i=0; i<6; i++)cout << dedx_x[i] << " ";
153     cout << endl << "dedx_y : "; for(int i=0; i<6; i++)cout << dedx_y[i] << " ";
154     }
155     //--------------------------------------
156     //
157     //
158     //--------------------------------------
159     TrkSinglet::TrkSinglet(){
160     plane = 0;
161     coord[0] = 0;
162     coord[1] = 0;
163     sgnl = 0;
164     };
165     //--------------------------------------
166     //
167     //
168     //--------------------------------------
169     TrkSinglet::TrkSinglet(const TrkSinglet& s){
170     plane = s.plane;
171     coord[0] = s.coord[0];
172     coord[1] = s.coord[1];
173     sgnl = s.sgnl;
174     };
175     //--------------------------------------
176     //
177     //
178     //--------------------------------------
179     void TrkSinglet::Dump(){
180     int i=0;
181     cout << endl << "========== Singlet " ;
182     cout << endl << "plane : " << plane;
183     cout << endl << "coord[2] : "; while( i<2 && cout << coord[i] << " ") i++;
184     cout << endl << "sgnl : " << sgnl;
185     }
186     //--------------------------------------
187     //
188     //
189     //--------------------------------------
190     TrkLevel2::TrkLevel2(){
191     good2 = -1;
192     for(Int_t i=0; i<12 ; i++){
193     crc[i] = -1;
194     };
195     Track = new TClonesArray("TrkTrack");
196     SingletX = new TClonesArray("TrkSinglet");
197     SingletY = new TClonesArray("TrkSinglet");
198     }
199     //--------------------------------------
200     //
201     //
202     //--------------------------------------
203     void TrkLevel2::Dump(){
204     TClonesArray &t = *Track;
205     TClonesArray &sx = *SingletX;
206     TClonesArray &sy = *SingletY;
207    
208     cout << endl << endl << "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-";
209     cout << endl << "good2 : " << good2;
210     cout << endl << "crc : "; for(int i=0; i<12; i++) cout << crc[i];
211     cout << endl << "ntrk() : " << this->ntrk() ;
212     cout << endl << "nclsx() : " << this->nclsx();
213     cout << endl << "nclsy() : " << this->nclsy();
214     for(int i=0; i<this->ntrk(); i++) ((TrkTrack *)t[i])->Dump();
215     for(int i=0; i<this->nclsx(); i++) ((TrkSinglet *)sx[i])->Dump();
216     for(int i=0; i<this->nclsy(); i++) ((TrkSinglet *)sy[i])->Dump();
217     }
218     //--------------------------------------
219     //
220     //
221     //--------------------------------------
222     /**
223     * Fills a TrkLevel2 object with values from a struct cTrkLevel2 (to get data from F77 common).
224     */
225     void TrkLevel2::FillCommonVar(cTrkLevel2 *l2){
226     // temporary objects:
227     TrkSinglet* t_singlet = new TrkSinglet();
228     TrkTrack* t_track = new TrkTrack();
229     // general variables
230     good2 = l2->good2;
231     for(Int_t i=0; i<12 ; i++){
232     crc[i] = l2->crc[i];
233     };
234     // *** TRACKS ***
235     TClonesArray &t = *Track;
236     for(int i=0; i<l2->ntrk; i++){
237     t_track->image = l2->image[i]-1;
238     t_track->chi2 = l2->chi2_nt[i];
239     for(int it1=0;it1<5;it1++){
240     t_track->al[it1] = l2->al_nt[i][it1];
241     for(int it2=0;it2<5;it2++)
242     t_track->coval[it1][it2] = l2->coval[i][it2][it1];
243     };
244     for(int ip=0;ip<6;ip++){
245     t_track->xgood[ip] = l2->xgood_nt[i][ip];
246     t_track->ygood[ip] = l2->ygood_nt[i][ip];
247     t_track->xm[ip] = l2->xm_nt[i][ip];
248     t_track->ym[ip] = l2->ym_nt[i][ip];
249     t_track->zm[ip] = l2->zm_nt[i][ip];
250     t_track->resx[ip] = l2->resx_nt[i][ip];
251     t_track->resy[ip] = l2->resy_nt[i][ip];
252     t_track->xv[ip] = l2->xv_nt[i][ip];
253     t_track->yv[ip] = l2->yv_nt[i][ip];
254     t_track->zv[ip] = l2->zv_nt[i][ip];
255     t_track->axv[ip] = l2->axv_nt[i][ip];
256     t_track->ayv[ip] = l2->ayv_nt[i][ip];
257     t_track->dedx_x[ip] = l2->dedx_x[i][ip];
258     t_track->dedx_y[ip] = l2->dedx_y[i][ip];
259     };
260     new(t[i]) TrkTrack(*t_track);
261     t_track->Clear();
262     };
263     // *** SINGLETS ***
264     TClonesArray &sx = *SingletX;
265     for(int i=0; i<l2->nclsx; i++){
266     t_singlet->plane = l2->planex[i];
267     t_singlet->coord[0] = l2->xs[i][0];
268     t_singlet->coord[1] = l2->xs[i][1];
269     t_singlet->sgnl = l2->signlxs[i];
270     new(sx[i]) TrkSinglet(*t_singlet);
271     t_singlet->Clear();
272     }
273     TClonesArray &sy = *SingletY;
274     for(int i=0; i<l2->nclsy; i++){
275     t_singlet->plane = l2->planey[i];
276     t_singlet->coord[0] = l2->ys[i][0];
277     t_singlet->coord[1] = l2->ys[i][1];
278     t_singlet->sgnl = l2->signlys[i];
279     new(sy[i]) TrkSinglet(*t_singlet);
280     t_singlet->Clear();
281     };
282     }
283     //--------------------------------------
284     //
285     //
286     //--------------------------------------
287     void TrkLevel2::Clear(){
288     good2 = -1;
289     for(Int_t i=0; i<12 ; i++){
290     crc[i] = -1;
291     };
292     Track->RemoveAll();
293     SingletX->RemoveAll();
294     SingletY->RemoveAll();
295     }
296     //--------------------------------------
297     //
298     //
299     //--------------------------------------
300     /**
301     * 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).
302     * This method is overridden by PamLevel2::GetTracks(), where calorimeter and TOF information is used.
303     */
304     TClonesArray *TrkLevel2::GetTracks(){
305    
306     TClonesArray *sorted = new TClonesArray("TrkTrack");
307     TClonesArray &t = *Track;
308     TClonesArray &ts = *sorted;
309     int N=this->ntrk();
310     vector<int> m(N); for(int i=0; i<N; i++)m[i]=1;
311    
312     int indo=0;
313     int indi=0;
314     while(N != 0){
315     float chi2ref=1000000;
316     for(int i=0; i<this->ntrk(); i++){
317     if(((TrkTrack *)t[i])->chi2 < chi2ref && m[i]==1){
318     chi2ref = ((TrkTrack *)t[i])->chi2;
319     indi = i;
320     }
321     }
322     if( ((TrkTrack *)t[indi])->image != -1 ){
323     m[((TrkTrack *)t[indi])->image] = 0;
324     N--;
325     }
326     new(ts[indo]) TrkTrack(*(TrkTrack*)t[indi]);
327     m[indi] = 0;
328     N--;
329     indo++;
330     }
331     return sorted;
332     }
333     //--------------------------------------
334     //
335     //
336     //--------------------------------------
337     /**
338     * Retrieves the is-th stored track.
339     * @param it Track number, ranging from 0 to ntrk().
340     * Fitted tracks ( images included ) are stored in a TObjectArray ( TrkLevel2::Track ) in the same order they are returned by the F77 fitting routine.
341     */
342     TrkTrack *TrkLevel2::GetStoredTrack(int is){
343    
344     if(is >= this->ntrk()){
345     cout << "** TrkLevel2 ** Track "<< is << "doen not exits! " << endl;
346     cout << " Stored tracks ntrk() = "<< this->ntrk() << endl;
347     return 0;
348     }
349     TClonesArray &t = *(Track);
350     TrkTrack *track = (TrkTrack*)t[is];
351     return track;
352     }
353     //--------------------------------------
354     //
355     //
356     //--------------------------------------
357     /**
358     * Retrieves the it-th "physical" track, sorted by the method GetNTracks().
359     * @param it Track number, ranging from 0 to GetNTracks().
360     */
361     TrkTrack *TrkLevel2::GetTrack(int it){
362    
363     if(it >= this->GetNTracks()){
364     cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl;
365     cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl;
366     return 0;
367     }
368     TrkTrack *track = (TrkTrack*)(*(this->GetTracks()))[it];
369     return track;
370     }
371     //--------------------------------------
372     //
373     //
374     //--------------------------------------
375     /**
376     * Retrieves (if present) the image of the it-th "physical" track, sorted by the method GetNTracks().
377     * @param it Track number, ranging from 0 to GetNTracks().
378     */
379     TrkTrack *TrkLevel2::GetTrackImage(int it){
380    
381     if(it >= this->GetNTracks()){
382     cout << "** TrkLevel2 ** Track "<< it << "does not exits! " << endl;
383     cout << " Physical tracks GetNTracks() = "<< this->ntrk() << endl;
384     return 0;
385     }
386     TrkTrack *track = (TrkTrack*)(*(this->GetTracks()))[it];
387     if(!track->HasImage()){
388     cout << "** TrkLevel2 ** Track "<< it << "does not have image! " << endl;
389     return 0;
390     }
391     TrkTrack *image = (TrkTrack*)(*Track)[track->image];
392     return image;
393    
394     }
395     //--------------------------------------
396     //
397     //
398     //--------------------------------------
399     /**
400     * Loads the magnetic field.
401     * @param s Path of the magnetic-field files.
402     */
403     void TrkLevel2::LoadField(TString s){
404     readb_(s.Data());
405     };
406     //--------------------------------------
407     //
408     //
409     //--------------------------------------
410     /**
411     * Trajectory constructor.
412     * \param n Number of points
413     */
414     Trajectory::Trajectory(int n){
415     npoint = n;
416     x = new float[npoint];
417     y = new float[npoint];
418     z = new float[npoint];
419     for(int i=0; i<npoint; i++){
420     x[i] = 0;
421     y[i] = 0;
422     z[i] = 0;
423     }
424     }
425     //--------------------------------------
426     //
427     //
428     //--------------------------------------
429     /**
430     * Trajectory constructor.
431     * \param n Number of points
432     * \param pz Pointer to float array, defining z coordinates
433     */
434     Trajectory::Trajectory(int n, float* zin){
435     npoint = n;
436     x = new float[npoint];
437     y = new float[npoint];
438     z = new float[npoint];
439     for(int i=0; i<npoint; i++){
440     x[i] = 0;
441     y[i] = 0;
442     z[i] = zin[i];
443     }
444     }
445     //--------------------------------------
446     //
447     //
448     //--------------------------------------
449     /**
450     * Dump the trajectory coordinates.
451     */
452     void Trajectory::Dump(){
453     cout <<endl<< "Trajectory ========== "<<endl;
454     for (int i=0; i<npoint; i++){
455     cout << i <<" >> " << x[i] <<" "<< y[i] <<" "<< z[i] << endl;;
456     };
457     }
458    
459     ClassImp(TrkLevel2);
460     ClassImp(TrkSinglet);
461     ClassImp(TrkTrack);
462     ClassImp(Trajectory);

  ViewVC Help
Powered by ViewVC 1.1.23