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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Fri May 19 13:15:54 2006 UTC (18 years, 6 months ago) by mocchiut
Branch: DarthVader
CVS Tags: v0r01, start
Changes since 1.1: +0 -0 lines
Imported sources

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