/[PAMELA software]/PamelaLevel2/src/PamLevel2.cpp
ViewVC logotype

Annotation of /PamelaLevel2/src/PamLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.110 - (hide annotations) (download)
Tue Mar 24 09:15:01 2015 UTC (9 years, 11 months ago) by pam-fi
Branch: MAIN
Changes since 1.109: +97 -63 lines
CVSk fixed

:: ----------------------------------------------------------------------

1 pam-fi 1.1 #include <PamLevel2.h>
2 pam-fi 1.52
3     /////////////////////////////////////////////////////////////////////////////
4     /////////////////////////////////////////////////////////////////////////////
5     /////////////////////////////////////////////////////////////////////////////
6     /////////////////////////////////////////////////////////////////////////////
7    
8 pam-fi 1.81 void GPamela::Clear() {
9     Irun = 0;
10     Ievnt = 0;
11     Ipa = 0;
12     X0 = 0.;
13     Y0 = 0.;
14     Z0 = 0.;
15     Theta = 0.;
16     Phi = 0.;
17     P0 = 0.;
18     Nthtof = 0;
19     Nthcat = 0;
20     Nthcas = 0;
21     Nthspe = 0;
22     Nstrpx = 0;
23     Nstrpy = 0;
24     Nthcali = 0;
25     Nthcal = 0;
26     Nthnd = 0;
27     Nthcard = 0;
28 pam-fi 1.52 }
29    
30 pam-fi 1.81 void GPamela::Delete() {
31    
32     Clear();
33 mocchiut 1.93 /* EM all these are in the stack not in the heap, so no need to delete by hand...
34 pam-fi 1.81 delete[] Ipltof;
35     delete[] Ipaddle;
36     delete[] Ipartof;
37     delete[] Xintof;
38     delete[] Yintof;
39     delete[] Zintof;
40     delete[] Xouttof;
41     delete[] Youttof;
42     delete[] Zouttof;
43     delete[] Ereltof;
44     delete[] Timetof;
45     delete[] Pathtof;
46     delete[] P0tof;
47     delete[] Iparcat;
48     delete[] Icat;
49     delete[] Xincat;
50     delete[] Yincat;
51     delete[] Zincat;
52     delete[] Xoutcat;
53     delete[] Youtcat;
54     delete[] Zoutcat;
55     delete[] Erelcat;
56     delete[] Timecat;
57     delete[] Pathcat;
58     delete[] P0cat;
59     delete[] Iparcas;
60     delete[] Icas;
61     delete[] Xincas;
62     delete[] Yincas;
63     delete[] Zincas;
64     delete[] Xoutcas;
65     delete[] Youtcas;
66     delete[] Zoutcas;
67     delete[] Erelcas;
68     delete[] Timecas;
69     delete[] Pathcas;
70     delete[] P0cas;
71     delete[] Iparspe;
72     delete[] Itrpb;
73     delete[] Itrsl;
74     delete[] Itspa;
75     delete[] Xinspe;
76     delete[] Yinspe;
77     delete[] Zinspe;
78     delete[] Xoutspe;
79     delete[] Youtspe;
80     delete[] Zoutspe;
81     delete[] Xavspe;
82     delete[] Yavspe;
83     delete[] Zavspe;
84     delete[] Erelspe;
85     delete[] Pathspe;
86     delete[] P0spe;
87     delete[] Nxmult;
88     delete[] Nymult;
89     delete[] Npstripx;
90     delete[] Ntstripx;
91     delete[] Istripx;
92     delete[] Qstripx;
93     delete[] Xstripx;
94     delete[] Npstripy;
95     delete[] Ntstripy;
96     delete[] Istripy;
97     delete[] Qstripy;
98     delete[] Ystripy;
99     delete[] Icaplane;
100     delete[] Icastrip;
101     delete[] Icamod;
102     delete[] Enestrip;
103     delete[] Icapl;
104     delete[] Icasi;
105     delete[] Icast;
106     delete[] Xincal;
107     delete[] Yincal;
108     delete[] Zincal;
109     delete[] Erelcal;
110     delete[] Itubend;
111     delete[] Iparnd;
112     delete[] Xinnd;
113     delete[] Yinnd;
114     delete[] Zinnd;
115     delete[] Xoutnd;
116     delete[] Youtnd;
117     delete[] Zoutnd;
118     delete[] Erelnd;
119     delete[] Timend;
120     delete[] Pathnd;
121     delete[] P0nd;
122     delete[] Iparcard;
123     delete[] Icard;
124     delete[] Xincard;
125     delete[] Yincard;
126     delete[] Zincard;
127     delete[] Xoutcard;
128     delete[] Youtcard;
129     delete[] Zoutcard;
130     delete[] Erelcard;
131     delete[] Timecard;
132     delete[] Pathcard;
133     delete[] P0card;
134 mocchiut 1.93 */
135     }
136 pam-fi 1.52
137 pam-fi 1.81
138     void GPamela::SetBranchAddress(TChain* fhBookTree) {
139 pam-fi 1.52
140 pam-fi 1.81 // cout << "fhBookTree "<<fhBookTree << endl;
141     // prepare tree
142     fhBookTree->SetBranchAddress("Irun", &Irun);
143     fhBookTree->SetBranchAddress("Ievnt", &Ievnt);
144     fhBookTree->SetBranchAddress("Ipa", &Ipa);
145     fhBookTree->SetBranchAddress("X0", &X0);
146     fhBookTree->SetBranchAddress("Y0", &Y0);
147     fhBookTree->SetBranchAddress("Z0", &Z0);
148     fhBookTree->SetBranchAddress("Theta", &Theta);
149     fhBookTree->SetBranchAddress("Phi", &Phi);
150     fhBookTree->SetBranchAddress("P0", &P0);
151     fhBookTree->SetBranchAddress("Nthtof", &Nthtof);
152     fhBookTree->SetBranchAddress("Ipltof", Ipltof);
153     fhBookTree->SetBranchAddress("Ipaddle", Ipaddle);
154     fhBookTree->SetBranchAddress("Ipartof", Ipartof);
155     fhBookTree->SetBranchAddress("Xintof", Xintof);
156     fhBookTree->SetBranchAddress("Yintof", Yintof);
157     fhBookTree->SetBranchAddress("Zintof", Zintof);
158     fhBookTree->SetBranchAddress("Xouttof", Xouttof);
159     fhBookTree->SetBranchAddress("Youttof", Youttof);
160     fhBookTree->SetBranchAddress("Zouttof", Zouttof);
161     fhBookTree->SetBranchAddress("Ereltof", Ereltof);
162     fhBookTree->SetBranchAddress("Timetof", Timetof);
163     fhBookTree->SetBranchAddress("Pathtof", Pathtof);
164     fhBookTree->SetBranchAddress("P0tof", P0tof);
165     fhBookTree->SetBranchAddress("Nthcat", &Nthcat);
166     fhBookTree->SetBranchAddress("Iparcat", Iparcat);
167     fhBookTree->SetBranchAddress("Icat", Icat);
168     fhBookTree->SetBranchAddress("Xincat", Xincat);
169     fhBookTree->SetBranchAddress("Yincat", Yincat);
170     fhBookTree->SetBranchAddress("Zincat", Zincat);
171     fhBookTree->SetBranchAddress("Xoutcat", Xoutcat);
172     fhBookTree->SetBranchAddress("Youtcat", Youtcat);
173     fhBookTree->SetBranchAddress("Zoutcat", Zoutcat);
174     fhBookTree->SetBranchAddress("Erelcat", Erelcat);
175     fhBookTree->SetBranchAddress("Timecat", Timecat);
176     fhBookTree->SetBranchAddress("Pathcat", Pathcat);
177     fhBookTree->SetBranchAddress("P0cat", P0cat);
178     fhBookTree->SetBranchAddress("Nthcas", &Nthcas);
179     fhBookTree->SetBranchAddress("Iparcas", Iparcas);
180     fhBookTree->SetBranchAddress("Icas", Icas);
181     fhBookTree->SetBranchAddress("Xincas", Xincas);
182     fhBookTree->SetBranchAddress("Yincas", Yincas);
183     fhBookTree->SetBranchAddress("Zincas", Zincas);
184     fhBookTree->SetBranchAddress("Xoutcas", Xoutcas);
185     fhBookTree->SetBranchAddress("Youtcas", Youtcas);
186     fhBookTree->SetBranchAddress("Zoutcas", Zoutcas);
187     fhBookTree->SetBranchAddress("Erelcas", Erelcas);
188     fhBookTree->SetBranchAddress("Timecas", Timecas);
189     fhBookTree->SetBranchAddress("Pathcas", Pathcas);
190     fhBookTree->SetBranchAddress("P0cas", P0cas);
191     fhBookTree->SetBranchAddress("Nthspe", &Nthspe);
192     fhBookTree->SetBranchAddress("Iparspe", Iparspe);
193     fhBookTree->SetBranchAddress("Itrpb", Itrpb);
194     fhBookTree->SetBranchAddress("Itrsl", Itrsl);
195     fhBookTree->SetBranchAddress("Itspa", Itspa);
196     fhBookTree->SetBranchAddress("Xinspe", Xinspe);
197     fhBookTree->SetBranchAddress("Yinspe", Yinspe);
198     fhBookTree->SetBranchAddress("Zinspe", Zinspe);
199     fhBookTree->SetBranchAddress("Xoutspe", Xoutspe);
200     fhBookTree->SetBranchAddress("Youtspe", Youtspe);
201     fhBookTree->SetBranchAddress("Zoutspe", Zoutspe);
202     fhBookTree->SetBranchAddress("Xavspe", Xavspe);
203     fhBookTree->SetBranchAddress("Yavspe", Yavspe);
204     fhBookTree->SetBranchAddress("Zavspe", Zavspe);
205     fhBookTree->SetBranchAddress("Erelspe", Erelspe);
206     fhBookTree->SetBranchAddress("Pathspe", Pathspe);
207     fhBookTree->SetBranchAddress("P0spe", P0spe);
208     fhBookTree->SetBranchAddress("Nxmult", Nxmult);
209     fhBookTree->SetBranchAddress("Nymult", Nymult);
210     fhBookTree->SetBranchAddress("Nstrpx", &Nstrpx);
211     fhBookTree->SetBranchAddress("Npstripx", Npstripx);
212     fhBookTree->SetBranchAddress("Ntstripx", Ntstripx);
213     fhBookTree->SetBranchAddress("Istripx", Istripx);
214     fhBookTree->SetBranchAddress("Qstripx", Qstripx);
215     fhBookTree->SetBranchAddress("Xstripx", Xstripx);
216     fhBookTree->SetBranchAddress("Nstrpy", &Nstrpy);
217     fhBookTree->SetBranchAddress("Npstripy", Npstripy);
218     fhBookTree->SetBranchAddress("Ntstripy", Ntstripy);
219     fhBookTree->SetBranchAddress("Istripy", Istripy);
220     fhBookTree->SetBranchAddress("Qstripy", Qstripy);
221     fhBookTree->SetBranchAddress("Ystripy", Ystripy);
222     fhBookTree->SetBranchAddress("Nthcali", &Nthcali);
223     fhBookTree->SetBranchAddress("Icaplane", Icaplane);
224     fhBookTree->SetBranchAddress("Icastrip", Icastrip);
225     fhBookTree->SetBranchAddress("Icamod", Icamod);
226     fhBookTree->SetBranchAddress("Enestrip", Enestrip);
227     fhBookTree->SetBranchAddress("Nthcal", &Nthcal);
228     fhBookTree->SetBranchAddress("Icapl", Icapl);
229     fhBookTree->SetBranchAddress("Icasi", Icasi);
230     fhBookTree->SetBranchAddress("Icast", Icast);
231     fhBookTree->SetBranchAddress("Xincal", Xincal);
232     fhBookTree->SetBranchAddress("Yincal", Yincal);
233     fhBookTree->SetBranchAddress("Zincal", Zincal);
234     fhBookTree->SetBranchAddress("Erelcal", Erelcal);
235     fhBookTree->SetBranchAddress("Nthnd", &Nthnd);
236     fhBookTree->SetBranchAddress("Itubend", Itubend);
237     fhBookTree->SetBranchAddress("Iparnd", Iparnd);
238     fhBookTree->SetBranchAddress("Xinnd", Xinnd);
239     fhBookTree->SetBranchAddress("Yinnd", Yinnd);
240     fhBookTree->SetBranchAddress("Zinnd", Zinnd);
241     fhBookTree->SetBranchAddress("Xoutnd", Xoutnd);
242     fhBookTree->SetBranchAddress("Youtnd", Youtnd);
243     fhBookTree->SetBranchAddress("Zoutnd", Zoutnd);
244     fhBookTree->SetBranchAddress("Erelnd", Erelnd);
245     fhBookTree->SetBranchAddress("Timend", Timend);
246     fhBookTree->SetBranchAddress("Pathnd", Pathnd);
247     fhBookTree->SetBranchAddress("P0nd", P0nd);
248     fhBookTree->SetBranchAddress("Nthcard", &Nthcard);
249     fhBookTree->SetBranchAddress("Iparcard", Iparcard);
250     fhBookTree->SetBranchAddress("Icard", Icard);
251     fhBookTree->SetBranchAddress("Xincard", Xincard);
252     fhBookTree->SetBranchAddress("Yincard", Yincard);
253     fhBookTree->SetBranchAddress("Zincard", Zincard);
254     fhBookTree->SetBranchAddress("Xoutcard", Xoutcard);
255     fhBookTree->SetBranchAddress("Youtcard", Youtcard);
256     fhBookTree->SetBranchAddress("Zoutcard", Zoutcard);
257     fhBookTree->SetBranchAddress("Erelcard", Erelcard);
258     fhBookTree->SetBranchAddress("Timecard", Timecard);
259     fhBookTree->SetBranchAddress("Pathcard", Pathcard);
260     fhBookTree->SetBranchAddress("P0card", P0card);
261 pam-fi 1.52
262 pam-fi 1.81 // fhBookTree->SetBranchStatus("*",0);
263 pam-fi 1.52
264     }
265    
266 pam-fi 1.81 ClassImp( GPamela);
267 pam-fi 1.52
268     /////////////////////////////////////////////////////////////////////////////
269     /////////////////////////////////////////////////////////////////////////////
270     /////////////////////////////////////////////////////////////////////////////
271     /////////////////////////////////////////////////////////////////////////////
272 pam-fi 1.1 //--------------------------------------
273     //
274     //
275     //--------------------------------------
276     /**
277 pam-fi 1.81 * Default constructor
278 pam-fi 1.1 */
279 pam-fi 1.81 PamTrack::PamTrack() {
280     trk_track = 0;
281 pam-ts 1.95 trk_ext_track = 0;
282 pam-fi 1.81 calo_track = 0;
283     tof_track = 0;
284     orb_track = 0;
285     candeleteobj = 0;
286     pscore = 0;
287     iscore = 0;
288     }
289     ;
290 pam-fi 1.1 //--------------------------------------
291     //
292     //
293     //--------------------------------------
294     /**
295 pam-fi 1.81 * Constructor
296 pam-fi 1.1 */
297 pam-fi 1.81 PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o, OrbitalInfoTrkVar *r) {
298    
299 pam-ts 1.95 trk_ext_track = 0;
300 pam-fi 1.81 trk_track = 0;
301     calo_track = 0;
302     tof_track = 0;
303     orb_track = 0;
304     // if(t)trk_track = new TrkTrack(*t);
305     // if(c)calo_track = new CaloTrkVar(*c);
306     // if(o)tof_track = new ToFTrkVar(*o);
307 pam-ts 1.95 // if (t)
308     // trk_track = t;
309     // if (c)
310     // calo_track = c;
311     // if (o)
312     // tof_track = o;
313     // if (r)
314     // orb_track = r;
315    
316     // candeleteobj = 0;
317    
318    
319     if (t){
320     trk_track = new TrkTrack(*t);
321     trk_ext_track = new ExtTrack(*t);//NB!! ha dimensione 6 invece che 8
322     }
323 pam-fi 1.81 if (c)
324 pam-ts 1.95 calo_track = new CaloTrkVar(*c);
325 pam-fi 1.81 if (o)
326 pam-ts 1.95 tof_track = new ToFTrkVar(*o);
327 pam-fi 1.81 if (r)
328 pam-ts 1.95 orb_track = new OrbitalInfoTrkVar(*r);
329     candeleteobj = 1;
330    
331     }
332     ;
333     /**
334     * Constructor
335     */
336     PamTrack::PamTrack(ExtTrack* t, CaloTrkVar* c, ToFTrkVar* o, OrbitalInfoTrkVar *r) {
337    
338     trk_ext_track = 0;
339     trk_track = 0;
340     calo_track = 0;
341     tof_track = 0;
342     orb_track = 0;
343     // if(t)trk_track = new TrkTrack(*t);
344     // if(c)calo_track = new CaloTrkVar(*c);
345     // if(o)tof_track = new ToFTrkVar(*o);
346     // if (t)
347     // trk_track = t;
348     // if (c)
349     // calo_track = c;
350     // if (o)
351     // tof_track = o;
352     // if (r)
353     // orb_track = r;
354    
355     // candeleteobj = 0;
356    
357 pam-fi 1.81
358 pam-ts 1.95 if (t){
359     //// trk_track = new TrkTrack(*t);//in this case TrkTrack object remains null
360     trk_ext_track = new ExtTrack(*t);
361     }
362     if (c)
363     calo_track = new CaloTrkVar(*c);
364     if (o)
365     tof_track = new ToFTrkVar(*o);
366     if (r)
367     orb_track = new OrbitalInfoTrkVar(*r);
368     candeleteobj = 1;
369     pscore = 0;
370     iscore = 0;
371 pam-fi 1.81
372     }
373     ;
374 pam-fi 1.110
375 pam-fi 1.81 PamTrack::PamTrack(const PamTrack& track) {
376    
377     TrkTrack *t = track.trk_track;
378 pam-fi 1.97 ExtTrack *e = track.trk_ext_track;
379 pam-fi 1.81 CaloTrkVar *c = track.calo_track;
380     ToFTrkVar *o = track.tof_track;
381     OrbitalInfoTrkVar *r = track.orb_track;
382    
383 pam-fi 1.97 trk_ext_track = 0;
384     trk_track = 0;
385     calo_track = 0;
386     tof_track = 0;
387     orb_track = 0;
388     if(e)
389     trk_ext_track = new ExtTrack(*e);
390 pam-fi 1.81 if (t)
391     trk_track = new TrkTrack(*t);
392     if (c)
393     calo_track = new CaloTrkVar(*c);
394     if (o)
395     tof_track = new ToFTrkVar(*o);
396     if (r)
397     orb_track = new OrbitalInfoTrkVar(*r);
398 pam-fi 1.97
399 pam-fi 1.81 candeleteobj = 1;
400 pam-ts 1.95 pscore = 0;
401     iscore = 0;
402 pam-fi 1.81
403     }
404 pam-fi 1.110
405     void PamTrack::Copy( PamTrack& track) const {
406    
407     track.trk_track = trk_track;
408     track.trk_ext_track = trk_ext_track;
409     track.calo_track = calo_track;
410     track.tof_track = tof_track;
411     track.orb_track = orb_track;
412    
413     track.candeleteobj = candeleteobj;
414     track.pscore = pscore;
415     track.iscore = iscore;
416    
417     }
418    
419    
420    
421 pam-fi 1.97 void PamTrack::Clear(Option_t *option) {
422 pam-fi 1.13
423 pam-fi 1.97 // cout << "PamTrack::Clear( "<<option<<" ) "<<candeleteobj<<endl;
424 pam-fi 1.81 if (candeleteobj) {
425 pam-ts 1.95
426     if (trk_ext_track)
427 pam-fi 1.97 trk_ext_track->ExtTrack::Clear(option);
428 pam-fi 1.81 if (trk_track)
429     trk_track->TrkTrack::Clear();
430     if (calo_track)
431     calo_track->CaloTrkVar::Clear();//???
432     if (tof_track)
433     tof_track->ToFTrkVar::Clear();//???
434     if (orb_track)
435     orb_track->OrbitalInfoTrkVar::Clear();//???
436     }
437     else {
438 pam-ts 1.95 trk_ext_track = 0;
439 pam-fi 1.81 trk_track = 0;
440 pam-fi 1.13 calo_track = 0;
441 pam-fi 1.81 tof_track = 0;
442     orb_track = 0;
443     }
444     pscore = 0;
445     iscore = 0;
446 pam-fi 1.13
447 pam-fi 1.81 }
448     void PamTrack::Delete() {
449     // cout << "PamTrack::Delete() "<<candeleteobj<<endl;
450     if (candeleteobj) {
451 pam-ts 1.95 if (trk_ext_track) {
452 pam-fi 1.110 // trk_ext_track->ExtTrack::Clear("C");//Clear is called for all the array elements
453     trk_ext_track->ExtTrack::Clear("C+C");//Clear is called for all the array elements passing option 'C'
454 pam-ts 1.95 delete trk_ext_track;
455     }
456 pam-fi 1.81 if (trk_track) {
457     trk_track->TrkTrack::Clear();
458     delete trk_track;
459     }
460     if (calo_track) {
461     calo_track->CaloTrkVar::Clear();//???
462     delete calo_track;
463     }
464     if (tof_track) {
465     tof_track->ToFTrkVar::Clear();//???
466     delete tof_track;
467     }
468     if (orb_track) {
469     orb_track->OrbitalInfoTrkVar::Clear();//???
470     delete orb_track;
471 pam-fi 1.13 }
472 pam-fi 1.81 }
473     else {
474     Clear();
475     }
476 pam-fi 1.13 }
477 pam-ts 1.95
478    
479    
480    
481 pam-fi 1.1 //--------------------------------------
482     //
483     //
484     //--------------------------------------
485     /**
486 pam-fi 1.81 * Default Constructor
487 pam-fi 1.1 */
488 pam-fi 1.81 PamLevel2::PamLevel2() {
489     Initialize();
490     }
491 mocchiut 1.90
492 mocchiut 1.35
493     /**
494 pam-fi 1.52 * Constructor
495     * @param ddir Name of directory where level2 files are stored.
496     * @param list Name of an ascii file containing the list of file names
497     * @param detlist Options to chose what to load.
498 pam-fi 1.81 * Possible options are:
499 pam-fi 1.52 * +AUTO --> load all trees/branches in the input files
500     * +(-)ALL --> inlcude(exclude) all trees/branches
501     * +(-)TRK1+(-)TRK2+(-)CAL1+(-)CAL2+(-)TOF+(-)TRG+(-)ND+(-)S4+(-)ORB+(-)AC --> inlcude(exclude) trees and branches
502 pam-fi 1.81 * +(-)TRK0 --> include(exclude) tracker level0 tree
503 pam-fi 1.52 * +(-)GP --> include exclude GPAMELA output tree
504     * If no options are specified, the default is assumed. Default is:
505     * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB
506 mocchiut 1.35 */
507 pam-fi 1.81 PamLevel2::PamLevel2(TString ddir, TString llist, TString detlist) {
508     Initialize();
509     TList* listf = GetListOfLevel2Files(ddir, llist);
510     if (listf)
511     GetPamTree(listf, detlist);
512     if (listf)
513     GetRunTree(listf);
514 pam-ts 1.95 SetMaxShift(-1);
515 pam-fi 1.81 }
516 mocchiut 1.90
517 pam-fi 1.81
518     PamLevel2::PamLevel2(TString ddir, TList *llist, TString detlist) {
519     Initialize();
520     GetPamTree(llist, detlist);
521     GetRunTree(llist);
522 pam-ts 1.95 SetMaxShift(-1);
523 pam-fi 1.81 }
524 mocchiut 1.90
525 mocchiut 1.35 /**
526 pam-fi 1.81 * Constructor
527 pam-fi 1.52 * @param ddir Name of directory where level2 files are stored.
528     * @param list Name of an ascii file containing the list of file names
529     * Default trees/branches are loaded. Default is:
530     * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB
531 mocchiut 1.35 */
532 pam-fi 1.81 PamLevel2::PamLevel2(TString ddir, TString llist) {
533     Initialize();
534 pam-ts 1.95 TList* listf = GetListOfLevel2Files(ddir, llist);
535     cout << "GetPamTree: "<<endl;
536 pam-fi 1.81 GetPamTree(listf, "");
537 pam-ts 1.95 cout << "GetRunTree: "<<endl;
538 pam-fi 1.81 GetRunTree(listf);
539 pam-ts 1.95 SetMaxShift(-1);
540 pam-fi 1.81 }
541 mocchiut 1.90
542 pam-fi 1.81
543     void PamLevel2::Initialize() {
544 mocchiut 1.35
545 pam-fi 1.81 h0_obj = 0;
546     trk0_obj = 0;
547     calo0_obj = 0;
548    
549     trk2_obj = 0;
550     trk1_obj = 0;
551     trkh_obj = 0;
552     calo1_obj = 0;
553     calo2_obj = 0;
554 pam-ts 1.95 tof2_obj = 0;
555 pam-fi 1.81 trig_obj = 0;
556     s4_obj = 0;
557     nd_obj = 0;
558     ac_obj = 0;
559 pam-ts 1.95 orb2_obj = 0;
560 pam-fi 1.81 gp_obj = 0;
561    
562 pam-ts 1.95 extAlgFlag=0;
563    
564     trk_ext_obj = 0;
565     trk_ext_nuc_obj = 0;
566     trk_nuc_obj = 0;
567    
568     calo_ext_obj = 0;
569     calo_ext_nuc_obj = 0;
570     calo_nuc_obj = 0;
571    
572     tof_ext_obj = 0;
573     tof_ext_nuc_obj = 0;
574     tof_nuc_obj = 0;
575    
576     orb_ext_obj = 0;
577     orb_ext_nuc_obj = 0;
578     orb_nuc_obj = 0;
579    
580     trk2_nuc_obj = 0;
581     calo2_nuc_obj = 0;
582     tof2_nuc_obj = 0;
583     orb2_nuc_obj = 0;
584    
585    
586 pam-fi 1.81 run_obj = 0;//new GL_RUN();
587     soft_obj = 0;// Emiliano
588 mocchiut 1.100 proc_obj = 0;// Emiliano
589 pam-fi 1.81 irun = -1LL;
590     irunt = -1LL;
591 mocchiut 1.89 totrunentry = 0LL;
592     totrunentrymax = 0LL;
593     totrunentrymin = 0LL;
594 pam-fi 1.81 runfirstentry = 0LL;
595     runlastentry = 0LL;
596     gltsync = 0; // Emiliano
597 mocchiut 1.85 fUpdateRunInfo = true; // Emiliano
598 mocchiut 1.94 fUseDBinRunInfo = true; // Emiliano
599 mocchiut 1.98 fDiscarded = false; //EM
600 mocchiut 1.90 isSync = false; // by default assume that the level2 file(s) is(are) not sinchronized between L0/DB and L2, that is we miss some packets in L2 due to nested/DV-skipped events
601     il0entry = 0LL;
602 mocchiut 1.91 // hasL0EE = true;
603 pam-fi 1.81
604     l0_file = NULL;
605     l0_tree = NULL;
606     iroot = -1;
607     dbc = 0;
608    
609     prevshift = 0;
610 mocchiut 1.90 yprevshift = 0;
611     maxshift = 10; //EMILIANO now overridden by SetMaxShift(-1) called by constructors
612 pam-fi 1.81
613     run_tree = NULL;
614     run_tree_clone = NULL;
615 mocchiut 1.100
616     proc_tree = NULL;
617     proc_tree_clone = NULL;
618    
619 pam-fi 1.81 sel_tree = NULL;
620     sel_tree_clone = NULL;
621    
622     irunentry = -1LL;
623     pam_tree = NULL;
624     for (Int_t i = 0; i < NCLONES; i++)
625     pam_tree_clone[i] = NULL;
626    
627     totdltime[0] = 0LL;
628     totdltime[1] = 0LL;
629     totdltime[2] = 0LL;
630    
631     host = "mysql://localhost/pamelaprod";
632     user = "anonymous";
633     psw = "";
634     const char *pamdbhost = gSystem->Getenv("PAM_DBHOST");
635     const char *pamdbuser = gSystem->Getenv("PAM_DBUSER");
636     const char *pamdbpsw = gSystem->Getenv("PAM_DBPSW");
637     if (!pamdbhost)
638     pamdbhost = "";
639     if (!pamdbuser)
640     pamdbuser = "";
641     if (!pamdbpsw)
642     pamdbpsw = "";
643     if (strcmp(pamdbhost, ""))
644     host = pamdbhost;
645     if (strcmp(pamdbuser, ""))
646     user = pamdbuser;
647     if (strcmp(pamdbpsw, ""))
648     psw = pamdbpsw;
649    
650 emocchiutti 1.108 customString = "";
651    
652 pam-fi 1.81 // sorted_tracks = 0;//new TRefArray();
653    
654     CAL0 = false;
655     CAL1 = true;
656     CAL2 = true;
657     TRK2 = true;
658     TRK1 = false;
659     TRK0 = false;
660     TRKh = false;
661     TRG = true;
662     TOF = true;
663     TOF0 = false;
664     S4 = true;
665     ND = true;
666     AC = true;
667     ORB = true;
668 mocchiut 1.100 PROC = true;
669 pam-fi 1.81 GP = false;
670    
671 pam-ts 1.95 EXT = false;
672     NUC = false;
673 pam-ts 1.96 trkAlg = "STD";//default tracking algorythm
674 pam-ts 1.95
675 pam-fi 1.81 RUN = true;
676    
677     SELLI = -1;
678    
679     ISGP = false;
680    
681     DBG = false;
682    
683     tsorted = 0;
684     timage = 0;
685 pam-ts 1.95 text = 0 ;
686    
687     tsorted_nuc = 0;
688     timage_nuc = 0;
689     text_nuc = 0 ;
690 pam-fi 1.81
691     howtosort = "+CAL+TOF";
692     //howtosort = "+TOF";
693     sortthr = 100.;
694 mocchiut 1.35
695 pam-fi 1.81 issorted = false;
696     lastsorted = -1;
697 pam-ts 1.95 issorted_new = false;
698     lastsorted_new = -1;
699 mocchiut 1.30
700 pam-fi 1.81 }
701     ;
702     /**
703     * Delete the event (act as Dtor)
704     */
705     void PamLevel2::Delete() {
706 pam-fi 1.20
707 pam-fi 1.81 if (run_obj)
708     delete run_obj;
709     if (soft_obj)
710     delete soft_obj; //Emiliano
711 mocchiut 1.100 if (proc_obj)
712     delete proc_obj; //Emiliano
713 pam-fi 1.81
714     // cout << "void PamLevel2::Clear()"<<endl;
715     if (h0_obj)
716     delete h0_obj;
717     if (trk0_obj)
718     delete trk0_obj;
719     if (calo0_obj)
720     delete calo0_obj;
721     if (trk1_obj)
722     delete trk1_obj;
723     if (trk2_obj)
724     delete trk2_obj;
725     if (trkh_obj)
726     delete trkh_obj;
727     if (calo1_obj)
728     delete calo1_obj;
729     if (calo2_obj)
730     delete calo2_obj;
731 pam-ts 1.95 if (tof2_obj)
732     delete tof2_obj;
733 pam-fi 1.81 if (trig_obj)
734     delete trig_obj;
735     if (s4_obj)
736     delete s4_obj;
737     if (nd_obj)
738     delete nd_obj;
739     if (ac_obj)
740     delete ac_obj;
741 pam-ts 1.95 if (orb2_obj)
742     delete orb2_obj;
743 pam-fi 1.81 if (gp_obj)
744     delete gp_obj;
745 pam-fi 1.9
746 pam-ts 1.95 if(trk_nuc_obj)trk_nuc_obj->Delete();
747     if(trk_ext_obj)trk_ext_obj->Delete();
748     if(trk_ext_nuc_obj)trk_ext_nuc_obj->Delete();
749    
750     if(calo_nuc_obj)calo_nuc_obj->Delete();
751     if(calo_ext_obj)calo_ext_obj->Delete();
752     if(calo_ext_nuc_obj)calo_ext_nuc_obj->Delete();
753    
754     if(tof_nuc_obj)tof_nuc_obj->Delete();
755     if(tof_ext_obj)tof_ext_obj->Delete();
756     if(tof_ext_nuc_obj)tof_ext_nuc_obj->Delete();
757    
758     if(orb_nuc_obj)orb_nuc_obj->Delete();
759     if(orb_ext_obj)orb_ext_obj->Delete();
760     if(orb_ext_nuc_obj)orb_ext_nuc_obj->Delete();
761    
762    
763     if(trk2_nuc_obj)trk2_nuc_obj->Delete();;
764     if( calo2_nuc_obj)calo2_nuc_obj->Delete();;
765     if(tof2_nuc_obj)tof2_nuc_obj->Delete();;
766     if(orb2_nuc_obj)orb2_nuc_obj->Delete();;
767    
768    
769    
770 pam-fi 1.81 if (tsorted) {
771     tsorted->Delete();
772     delete tsorted;
773     }
774     if (timage) {
775     timage->Delete();
776     delete timage;
777     }
778 pam-ts 1.95 if (text) {
779     text->Delete();
780     delete text;
781     }
782     if (tsorted_nuc) {
783     tsorted_nuc->Delete();
784     delete tsorted_nuc;
785     }
786     if (timage_nuc) {
787     timage_nuc->Delete();
788     delete timage_nuc;
789     }
790     if (text_nuc) {
791     text_nuc->Delete();
792     delete text_nuc;
793     }
794    
795    
796 pam-fi 1.52
797 pam-fi 1.81 if (dbc) {
798     dbc->Close();
799     delete dbc;
800 mocchiut 1.82 dbc=0;
801 pam-fi 1.81 }
802    
803     if (gltsync)
804     delete gltsync;
805    
806     if (l0_file)
807     l0_file->Close();
808     // if(pam_tree)pam_tree->Delete();;
809 pam-fi 1.20
810 pam-fi 1.81 if (pam_tree) {
811     //
812     // we have first to find which chains we have to delete, then delete the main chain and only after delete the friend chains. Any other order causes a segfault...
813     //
814     TList *temp = pam_tree->GetListOfFriends();
815     TList *contents = new TList; // create chain friend list
816     contents->SetOwner();
817     TIter next(temp);
818     TChain *questo = 0;
819     while ((questo = (TChain*) next())) {
820     TString name = questo->GetName();
821     contents->Add((TChain*) gROOT->FindObject(name.Data()));// add object to the list
822     };
823     //
824     // deleting the main chain
825     //
826     pam_tree->Delete();
827     //
828     // deleting the friends...
829     //
830     TIter next2(contents);
831     TChain *questa = 0;
832 mocchiut 1.83 while ( (questa = (TChain*)next2()) ) {
833 pam-fi 1.81 TString name = questa->GetName();
834     questa->Delete();
835     questa = NULL;
836     };
837     //
838     };
839     pam_tree = NULL;
840 pam-fi 1.8
841 pam-fi 1.81 if (run_tree)
842     run_tree->Delete();;
843     if (sel_tree)
844     sel_tree->Delete();;
845 pam-fi 1.88
846     // The following lines are commented out since they may generate a double delete error
847     // if the file containing the clone trees is closed. This is because the file owns the
848     // clone trees which are written into it, so it will delete them when it is closed; if
849     // also PamLevel2 will try to delete these trees, a double delete error will be generated
850     // when exiting from analysis program. (Nicola 28/11/2011)
851    
852     /*for (Int_t i = 0; i < NCLONES; i++)
853 pam-fi 1.81 if (pam_tree_clone[i])
854     pam_tree_clone[i]->Delete();;
855     if (run_tree_clone)
856     run_tree_clone->Delete();;
857     if (sel_tree_clone)
858 pam-fi 1.88 sel_tree_clone->Delete();;*/
859 pam-fi 1.43
860 pam-fi 1.81 if (irunoffset)
861     delete[] irunoffset;
862 pam-fi 1.59
863 pam-ts 1.95
864     Initialize();
865    
866 pam-fi 1.81 }
867     ;
868 pam-fi 1.13
869 pam-fi 1.2 /**
870 pam-fi 1.81 * Clear the event (NB! does not deallocate objects)
871 pam-fi 1.2 */
872 pam-fi 1.81 void PamLevel2::Clear() {
873    
874     // cout << "void PamLevel2::Clear()"<<endl;
875 mocchiut 1.35
876 pam-fi 1.81 //
877     // This method is called once for every entry but RunInfo and SoftInfo do not change until the next run so we cannot clear them here unless we don't
878     // want to load them for each event even if they are the same...
879     //
880     // if(run_obj)delete run_obj;
881     // if(run_obj) run_obj->Clear(); // Emiliano: Do not deallocate run_obj here, it will give segmentation fault! call clear instead
882     // if(soft_obj) soft_obj->Clear();
883    
884     if (h0_obj)
885     h0_obj->Clear();
886     // if(trk0_obj) trk0_obj->Clear();
887     if (trk1_obj)
888     trk1_obj->Clear();
889     if (trk2_obj)
890     trk2_obj->Clear();
891     if (trkh_obj)
892     trkh_obj->Clear();
893     if (calo0_obj)
894     calo0_obj->Clear();
895     if (calo1_obj)
896     calo1_obj->Clear();
897     if (calo2_obj)
898     calo2_obj->Clear();
899 pam-ts 1.95 if (tof2_obj)
900     tof2_obj->Clear();
901 pam-fi 1.81 if (trig_obj)
902     trig_obj->Clear();
903     if (s4_obj)
904     s4_obj->Clear();
905     if (nd_obj)
906     nd_obj->Clear();
907     if (ac_obj)
908     ac_obj->Clear();
909 pam-ts 1.95 if (orb2_obj)
910     orb2_obj->Clear();
911 pam-fi 1.81 if (gp_obj)
912     gp_obj->Clear();
913 mocchiut 1.100 if (proc_obj)
914     proc_obj->Clear();
915 pam-fi 1.20
916 pam-fi 1.81 // if(sorted_tracks)sorted_tracks->Clear();
917     // sorted_tracks.Clear();
918 pam-fi 1.13
919 pam-ts 1.95 if(trk_nuc_obj)trk_nuc_obj->Clear();
920     if(trk_ext_obj)trk_ext_obj->Clear();
921     if(trk_ext_nuc_obj)trk_ext_nuc_obj->Clear();
922    
923     if(calo_nuc_obj)calo_nuc_obj->Clear();
924     if(calo_ext_obj)calo_ext_obj->Clear();
925     if(calo_ext_nuc_obj)calo_ext_nuc_obj->Clear();
926    
927     if(tof_nuc_obj)tof_nuc_obj->Clear();
928     if(tof_ext_obj)tof_ext_obj->Clear();
929     if(tof_ext_nuc_obj)tof_ext_nuc_obj->Clear();
930    
931     if(orb_nuc_obj)orb_nuc_obj->Clear();
932     if(orb_ext_obj)orb_ext_obj->Clear();
933     if(orb_ext_nuc_obj)orb_ext_nuc_obj->Clear();
934    
935     if(trk2_nuc_obj)trk2_nuc_obj->Clear();;
936     if( calo2_nuc_obj)calo2_nuc_obj->Clear();;
937     if(tof2_nuc_obj)tof2_nuc_obj->Clear();;
938     if(orb2_nuc_obj)orb2_nuc_obj->Clear();;
939    
940     if (tsorted)tsorted->Delete();
941     if (timage)timage->Delete();
942     if (text) text->Delete();
943    
944     if (tsorted_nuc)tsorted_nuc->Delete();
945     if (timage_nuc)timage_nuc->Delete();
946     if (text_nuc) text_nuc->Delete();
947 pam-fi 1.81 }
948     ;
949 mocchiut 1.35
950 pam-fi 1.81 void PamLevel2::Reset() {
951     //
952     // First of all clear everything
953     //
954     Clear();
955     //
956     // close and reset chains and pointers
957     //
958     if (pam_tree) {
959 mocchiut 1.35 //
960 pam-fi 1.81 // we have first to find which chains we have to delete, then delete the main chain and only after delete the friend chains. Any other order causes a segfault...
961 pam-fi 1.55 //
962 pam-fi 1.81 TList *temp = pam_tree->GetListOfFriends();
963     TList *contents = new TList; // create chain friend list
964     contents->SetOwner();
965     TIter next(temp);
966     TChain *questo = 0;
967     while ((questo = (TChain*) next())) {
968     TString name = questo->GetName();
969     contents->Add((TChain*) gROOT->FindObject(name.Data()));// add object to the list
970 pam-fi 1.55 };
971     //
972 pam-fi 1.81 // deleting the main chain
973 pam-fi 1.55 //
974 pam-fi 1.81 pam_tree->Delete();
975 pam-fi 1.55 //
976 pam-fi 1.81 // deleting the friends...
977 pam-fi 1.55 //
978 pam-fi 1.81 TIter next2(contents);
979     TChain *questa = 0;
980 mocchiut 1.83 while ( (questa = (TChain*) next2()) ) {
981 pam-fi 1.81 TString name = questa->GetName();
982     questa->Delete();
983     questa = NULL;
984     };
985 pam-fi 1.55 //
986 pam-fi 1.81 };
987     pam_tree = NULL;
988     //
989     if (run_tree)
990     run_tree->Delete();;
991     run_tree = NULL;
992     if (sel_tree)
993     sel_tree->Delete();;
994     sel_tree = NULL;
995 mocchiut 1.102
996     if (proc_tree)
997     proc_tree->Delete();
998     proc_tree = NULL;
999 pam-fi 1.81 //
1000     // Close file
1001     //
1002     if (l0_file)
1003     l0_file->Close("R");
1004     l0_file = NULL;
1005     //
1006     h0_obj = 0;
1007     trk0_obj = 0;
1008     calo0_obj = 0;
1009     //
1010     trk2_obj = 0;
1011     trk1_obj = 0;
1012     trkh_obj = 0;
1013     calo1_obj = 0;
1014     calo2_obj = 0;
1015 pam-ts 1.95 tof2_obj = 0;
1016 pam-fi 1.81 trig_obj = 0;
1017     s4_obj = 0;
1018     nd_obj = 0;
1019     ac_obj = 0;
1020 pam-ts 1.95 orb2_obj = 0;
1021 pam-fi 1.81 gp_obj = 0;
1022 mocchiut 1.100 proc_obj = 0;
1023 pam-ts 1.95
1024     trk_ext_obj = 0;
1025     trk_ext_nuc_obj = 0;
1026     trk_nuc_obj = 0;
1027    
1028     calo_ext_obj = 0;
1029     calo_ext_nuc_obj = 0;
1030     calo_nuc_obj = 0;
1031    
1032     tof_ext_obj = 0;
1033     tof_ext_nuc_obj = 0;
1034     tof_nuc_obj = 0;
1035    
1036     orb_ext_obj = 0;
1037     orb_ext_nuc_obj = 0;
1038     orb_nuc_obj = 0;
1039    
1040     trk2_nuc_obj = 0;
1041     calo2_nuc_obj = 0;
1042     tof2_nuc_obj = 0;
1043     orb2_nuc_obj = 0;
1044    
1045     trk2_nuc_obj = 0;
1046     calo2_nuc_obj = 0;
1047     tof2_nuc_obj = 0;
1048     orb2_nuc_obj = 0;
1049 pam-fi 1.81 //
1050     // Reset run pointers
1051     //
1052     run_obj = 0;//new GL_RUN();
1053     soft_obj = 0;// Emiliano
1054 mocchiut 1.100 proc_obj = 0;// Emiliano
1055 pam-fi 1.81 irun = -1;
1056     irunt = -1;
1057 mocchiut 1.89 totrunentry = 0LL;
1058     totrunentrymax = 0LL;
1059     totrunentrymin = 0LL;
1060 pam-fi 1.81 runfirstentry = 0ULL;
1061     runlastentry = 0ULL;
1062 mocchiut 1.89 prevabstime = 0ULL;
1063     prevpktnum = 0;
1064     abstime = 0ULL;
1065     pktnum = 0;
1066     isFragment = false;
1067 pam-fi 1.81 //
1068     totdltime[0] = 0LL;
1069     totdltime[1] = 0LL;
1070     totdltime[2] = 0LL;
1071     //
1072     }
1073     ;
1074 pam-fi 1.2
1075 pam-fi 1.81 Bool_t PamLevel2::IsGood(Bool_t strict) {
1076     Bool_t goodev = true;
1077 mocchiut 1.69 //
1078 pam-fi 1.81 if (calo2_obj && !calo2_obj->IsGood(strict))
1079     goodev = false;
1080 mocchiut 1.69 //
1081 pam-fi 1.81 if (strict) {
1082     if (trk2_obj && trk2_obj->UnpackError() != 0)
1083     goodev = false;
1084 pam-ts 1.95 if (tof2_obj && tof2_obj->unpackError != 0)
1085 pam-fi 1.81 goodev = false;
1086     if (trig_obj && trig_obj->unpackError != 0)
1087     goodev = false;
1088     if (s4_obj && s4_obj->unpackError != 0)
1089     goodev = false;
1090     if (nd_obj && nd_obj->unpackError != 0)
1091     goodev = false;
1092     if (ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0] >> 2) & 1) || ((ac_obj->status[1] >> 2) & 1)))
1093     goodev = false;
1094 pam-ts 1.95 // if(orb2_obj)
1095 pam-fi 1.81 }
1096     else {
1097     if (nd_obj && nd_obj->unpackError != 0)
1098     goodev = false;
1099     if (ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0] >> 2) & 1) || ((ac_obj->status[1] >> 2) & 1)))
1100     goodev = false;
1101 mocchiut 1.69 };
1102 pam-fi 1.81 return (goodev);
1103     }
1104     ;
1105 pam-fi 1.2
1106 mocchiut 1.86 void PamLevel2::SkipRunInfoUpdate(){
1107     printf("\n\n ******** WARNING ******** \n Skip DB connections, DO NOT USE PamLevel2::GetRunInfo() method! \n\n");
1108     fUpdateRunInfo = false;
1109     this->SetSELLI(2);
1110     printf(" ===============> W A R N I N G <================ \n");
1111     printf(" in case PamLevel2::CreateCloneTrees() will be called \n");
1112     printf(" it will be reverted to PadmeAmidala level2 structure , i.e. NO SELECTIONLIST WILL BE CREATED IN THE NEW LEVEL2 FILE! \n\n");
1113     if ( run_tree_clone ){
1114     printf(" ===============> W A R N I N G <================ \n");
1115     printf(" PamLevel2::SkipRunIndoUpdate or PamLevel2::NoDBconnections() has been called together with PamLevel2::CreateCloneTrees() \n");
1116     printf(" TO AVOID CRASHES call PamLevel2::CreateCloneTrees() after PamLevel2::SkipRunIndoUpdate or PamLevel2::NoDBconnections() \n");
1117     };
1118     }
1119    
1120 mocchiut 1.90 void PamLevel2::SetMaxShift(Int_t sh){
1121     if ( sh >= 0 ){
1122     printf("PamLevel2::SetMaxShift(Int_t) --WARNING-- the default is optimized by checking the level2 file\n it is strongly suggested to let PamLevel2 choose the max shift!\n");
1123     maxshift = sh;
1124     } else {
1125 pam-ts 1.95 ULong64_t nev = GetEntries();
1126 mocchiut 1.90 ULong64_t runnev = 0ULL;
1127     for (Int_t r=0; r< run_tree->GetEntries();r++){
1128     run_tree->GetEntry(r);//update runinfo
1129     runnev += GetRunInfo()->NEVENTS;
1130     }
1131     maxshift = (Int_t)(runnev-nev) + 10; // +10 just to be conservative
1132     if ( (runnev-nev) == 0 ) isSync = true;
1133     if (DBG) printf("PamLevel2::SetMaxShift(Int_t_) - sh negative %i - nev is %lld runnnev is %lld so maxshift set to %i \n",sh,nev,runnev,maxshift);
1134     // printf("PamLevel2::SetMaxShift(Int_t_) - sh negative %i - nev is %lld runnnev is %lld so maxshift set to %i \n",sh,nev,runnev,maxshift); // TOGLITOGLI
1135     }
1136     }
1137    
1138 pam-fi 1.1 //--------------------------------------
1139     //
1140     //
1141     //--------------------------------------
1142 pam-fi 1.81 void *PamLevel2::GetPointerTo(const char* c) {
1143 pam-fi 1.9
1144 pam-fi 1.81 TString objname = c;
1145 pam-fi 1.13
1146 pam-fi 1.81 if (!objname.CompareTo("TrkLevel1")) {
1147     if (!trk1_obj) {
1148     trk1_obj = new TrkLevel1();
1149     trk1_obj->Set();
1150     }
1151     return &trk1_obj;
1152     };
1153     if (!objname.CompareTo("TrkLevel2")) {
1154     if (!trk2_obj) {
1155     trk2_obj = new TrkLevel2();
1156     trk2_obj->Set();
1157     }
1158     return &trk2_obj;
1159     };
1160     if (!objname.CompareTo("TrkHough")) {
1161     if (!trkh_obj) {
1162     trkh_obj = new TrkHough();
1163     trkh_obj->Set();
1164     }
1165     return &trkh_obj;
1166     };
1167     if (!objname.CompareTo("CaloLevel1")) {
1168     if (!calo1_obj)
1169     calo1_obj = new CaloLevel1();
1170     return &calo1_obj;
1171     };
1172     if (!objname.CompareTo("CaloLevel2")) {
1173     if (!calo2_obj) {
1174     calo2_obj = new CaloLevel2();
1175     calo2_obj->Set();
1176 pam-fi 1.13 };
1177 pam-fi 1.81 return &calo2_obj;
1178     };
1179     if (!objname.CompareTo("ToFLevel2")) {
1180 pam-ts 1.95 if (!tof2_obj) {
1181     tof2_obj = new ToFLevel2();
1182     tof2_obj->Set();
1183 pam-fi 1.81 }
1184 pam-ts 1.95 return &tof2_obj;
1185 pam-fi 1.81 };
1186     if (!objname.CompareTo("TrigLevel2")) {
1187     if (!trig_obj)
1188     trig_obj = new TrigLevel2();
1189     return &trig_obj;
1190     };
1191     if (!objname.CompareTo("S4Level2")) {
1192     if (!s4_obj)
1193     s4_obj = new S4Level2();
1194     return &s4_obj;
1195     };
1196     if (!objname.CompareTo("NDLevel2")) {
1197     if (!nd_obj)
1198     nd_obj = new NDLevel2();
1199     return &nd_obj;
1200     };
1201     if (!objname.CompareTo("AcLevel2")) {
1202     if (!ac_obj)
1203     ac_obj = new AcLevel2();
1204     return &ac_obj;
1205     };
1206     if (!objname.CompareTo("OrbitalInfo")) {
1207 pam-ts 1.95 if (!orb2_obj) {
1208     orb2_obj = new OrbitalInfo();
1209     orb2_obj->Set();
1210 pam-fi 1.81 }
1211 pam-ts 1.95 return &orb2_obj;
1212 pam-fi 1.81 };
1213     // if(!objname.CompareTo("OrbitalInfo")){
1214 pam-ts 1.95 // if(!orb2_obj) orb2_obj = new OrbitalInfo();
1215     // return &orb2_obj;
1216 pam-fi 1.81 // };
1217     if (!objname.CompareTo("GPamela")) {
1218     if (!gp_obj)
1219     gp_obj = new GPamela();
1220     return &gp_obj;
1221     };
1222    
1223     if (!objname.CompareTo("RunInfo"))
1224     return &run_obj;
1225 mocchiut 1.15
1226 pam-fi 1.81 if (!objname.CompareTo("SoftInfo"))
1227     return &soft_obj; // Emiliano
1228 mocchiut 1.15
1229 mocchiut 1.101 if (!objname.CompareTo("ProcInfo")){
1230 mocchiut 1.100 if (!proc_obj)
1231     proc_obj = new ProcInfo();
1232     return &proc_obj; // Emiliano
1233     }
1234    
1235 pam-fi 1.81 return NULL;
1236     }
1237     ;
1238 pam-fi 1.9 //--------------------------------------
1239     //
1240     //
1241     //--------------------------------------
1242 pam-fi 1.1 /**
1243 pam-fi 1.81 * Retrieves the calorimeter track matching the seqno-th tracker stored track.
1244 pam-fi 1.3 * (If seqno = -1 retrieves the self-trigger calorimeter track)
1245     */
1246 pam-fi 1.81 CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno) {
1247    
1248     if (!calo2_obj)
1249     return 0;
1250    
1251     if (calo2_obj->CaloLevel2::ntrk() == 0) {
1252 pam-fi 1.110 if( seqno >=0 ){
1253     cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo " << seqno;
1254     cout << " but no Calorimeter tracks are stored" << endl;
1255     }
1256     return NULL;
1257 pam-fi 1.81 };
1258    
1259     CaloTrkVar *c = 0;
1260     Int_t it_calo = 0;
1261    
1262     do {
1263     c = calo2_obj->CaloLevel2::GetCaloTrkVar(it_calo);
1264     it_calo++;
1265     } while (c && seqno != c->trkseqno && it_calo < calo2_obj->CaloLevel2::ntrk());
1266    
1267     if (!c || seqno != c->trkseqno) {
1268     c = 0;
1269 pam-fi 1.110 if (seqno != -1 && seqno>=0)
1270 pam-fi 1.81 cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo " << seqno
1271     << " does not match Calorimeter stored tracks" << endl;
1272     };
1273     return c;
1274    
1275     }
1276     ;
1277 pam-fi 1.3 //--------------------------------------
1278 pam-fi 1.55 //
1279     //
1280 pam-fi 1.3 //--------------------------------------
1281     /**
1282 pam-fi 1.81 * Retrieves the ToF track matching the seqno-th tracker stored track.
1283 pam-fi 1.55 * (If seqno = -1 retrieves the tracker-independent tof track)
1284 pam-fi 1.3 */
1285 pam-fi 1.81 ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno) {
1286    
1287 pam-ts 1.95 if (!tof2_obj)
1288 pam-fi 1.81 return 0;
1289    
1290 pam-ts 1.95 if (tof2_obj->ToFLevel2::ntrk() == 0) {
1291 pam-fi 1.81 cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo " << seqno << " but no ToF tracks are stored"
1292     << endl;
1293     return NULL;
1294     };
1295    
1296     ToFTrkVar *c = 0;
1297     Int_t it_tof = 0;
1298    
1299     do {
1300 pam-ts 1.95 c = tof2_obj->ToFLevel2::GetToFTrkVar(it_tof);
1301 pam-fi 1.81 it_tof++;
1302 pam-ts 1.95 } while (c && seqno != c->trkseqno && it_tof < tof2_obj->ToFLevel2::ntrk());
1303 pam-fi 1.81
1304     if (!c || seqno != c->trkseqno) {
1305     c = 0;
1306     if (seqno != -1)
1307     cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo " << seqno
1308     << " does not match ToF stored tracks" << endl;
1309     };
1310     return c;
1311    
1312     }
1313     ;
1314 pam-fi 1.3
1315     //--------------------------------------
1316 pam-fi 1.55 //
1317     //
1318 pam-fi 1.3 //--------------------------------------
1319     /**
1320 pam-fi 1.81 * Retrieves the OrbitalInfo track matching the seqno-th tracker stored track.
1321 mocchiut 1.64 * (If seqno = -1 retrieves the tracker-independent tof related track)
1322     */
1323 pam-fi 1.81 OrbitalInfoTrkVar *PamLevel2::GetOrbitalInfoStoredTrack(int seqno) {
1324    
1325 pam-ts 1.95 if (!orb2_obj)
1326 pam-fi 1.81 return 0;
1327    
1328 pam-ts 1.95 if (orb2_obj->OrbitalInfo::ntrk() == 0) {
1329 pam-fi 1.81 // // TRICK BEGIN
1330     // OrbitalInfoTrkVar *r = new OrbitalInfoTrkVar(); // TEMPORARY TRICK
1331     // Int_t nn = 0;
1332 pam-ts 1.95 // TClonesArray &tor = *orb2_obj->OrbitalInfoTrk;
1333     // for(Int_t nt=0; nt < tof2_obj->ToFLevel2::ntrk(); nt++){
1334 pam-fi 1.81 // //
1335 pam-ts 1.95 // ToFTrkVar *ptt = tof2_obj->ToFLevel2::GetToFTrkVar(nt);
1336 pam-fi 1.81 // if ( ptt->trkseqno != -1 ){
1337     // //
1338     // r->trkseqno = ptt->trkseqno;
1339     // //
1340     // r->Eij = 0;
1341     // //
1342     // r->Sij = 0;
1343     // //
1344     // r->pitch = -1000.;
1345     // //
1346     // r->cutoff = -1000.;
1347     // //
1348     // new(tor[nn]) OrbitalInfoTrkVar(*r);
1349     // nn++;
1350     // //
1351     // r->Clear();
1352     // //
1353     // };
1354     // };
1355     // delete r;
1356     // OrbitalInfoTrkVar *c = 0;
1357 pam-ts 1.95 // c = orb2_obj->OrbitalInfo::GetOrbitalInfoTrkVar(0);
1358 pam-fi 1.81 // return c;
1359     // //TRICK END
1360     cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo " << seqno
1361     << " but no OrbitalInfo tracks are stored" << endl;
1362     return NULL;
1363     };
1364    
1365     OrbitalInfoTrkVar *c = 0;
1366     Int_t it_tof = 0;
1367    
1368     do {
1369 pam-ts 1.95 c = orb2_obj->OrbitalInfo::GetOrbitalInfoTrkVar(it_tof);
1370 pam-fi 1.81 it_tof++;
1371 pam-ts 1.95 } while (c && seqno != c->trkseqno && it_tof < orb2_obj->OrbitalInfo::ntrk());
1372 pam-fi 1.81
1373     if (!c || seqno != c->trkseqno) {
1374     c = 0;
1375     if (seqno != -1)
1376     cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo " << seqno
1377     << " does not match OrbitalInfo stored tracks" << endl;
1378     };
1379     return c;
1380    
1381     }
1382     ;
1383 mocchiut 1.64
1384     //--------------------------------------
1385     //
1386     //
1387     //--------------------------------------
1388 pam-fi 1.110 // /**
1389     // * Give the pamela track associated to a tracker track, retrieving related calorimeter, orbitalinfo and tof track information.
1390     // */
1391     // PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t) {
1392    
1393     // cout << "PamLevel2::GetPamTrackAlong(TrkTrack* t) **obsolete** " << endl;
1394     // cout << "(if you use it, remember to delete the PamTrack object)" << endl;
1395    
1396     // CaloTrkVar *c = 0;
1397     // ToFTrkVar *o = 0;
1398     // OrbitalInfoTrkVar *r = 0;
1399    
1400     // if (CAL2)
1401     // c = GetCaloStoredTrack(t->GetSeqNo());
1402     // if (TOF)
1403     // o = GetToFStoredTrack(t->GetSeqNo());
1404     // if (ORB)
1405     // r = GetOrbitalInfoStoredTrack(t->GetSeqNo());
1406 pam-fi 1.81
1407 pam-fi 1.110 // // if(t && c && o)track = new PamTrack(t,c,o);
1408     // PamTrack *track = new PamTrack(t, c, o, r);
1409 pam-fi 1.81
1410 pam-fi 1.110 // return track;
1411 pam-fi 1.81
1412 pam-fi 1.110 // }
1413     // ;
1414 pam-fi 1.3 //--------------------------------------
1415     //
1416     //
1417     //--------------------------------------
1418 pam-fi 1.110 // /**
1419     // * Retrieves the it-th stored track.
1420     // * It override TrkLevel2::GetTrack(int it).
1421     // * @param itrk Track number, ranging from 0 to GetNTracks().
1422     // */
1423    
1424     // PamTrack* PamLevel2::GetStoredTrack(Int_t itrk) {
1425    
1426     // cout << "PamLevel2::GetStoredTrack(Int_t itrk) **to-be-updated** " << endl;
1427     // cout
1428     // << "for the moment, better use separately the methods: TrkLevel2::GetStoredTrack(seqno) CaloLevel2::GetCaloTrkVar(Int_t notrack) ToFLevel2::GetToFTrkVar(Int_t notrack) OrbitalInfo::GetOrbitalInfoTrkVar(Int_t notrack)"
1429     // << endl;
1430     // cout << "(if you use it, remember to delete the PamTrack object)" << endl;
1431     // PamTrack *track = 0;
1432 pam-fi 1.1
1433 pam-fi 1.110 // if (itrk >= 0 && itrk < trk2_obj->TrkLevel2::ntrk()) {
1434 pam-fi 1.81
1435 pam-fi 1.110 // TrkTrack *t = trk2_obj->TrkLevel2::GetStoredTrack(itrk);
1436     // track = GetPamTrackAlong(t);
1437 pam-fi 1.81
1438 pam-fi 1.110 // }
1439     // else {
1440     // cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo " << itrk << " does not exist (GetNTracks() = "
1441     // << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl;
1442     // };
1443 pam-fi 1.81
1444 pam-fi 1.110 // return track;
1445 pam-fi 1.81
1446 pam-fi 1.110 // }
1447 pam-fi 1.1 //--------------------------------------
1448     //
1449 mocchiut 1.37
1450     /**
1451 pam-fi 1.55 * Sort physical (tracker) tracks. Left here as backward compatibility method.
1452 mocchiut 1.37 **/
1453 pam-fi 1.81 void PamLevel2::SortTracks(TString how) {
1454     printf(
1455     " WARNING! obsolete, use SortTracks() and SetSortingMethod(TString) instead! \n Setting sorting method to %s \n",
1456     how.Data());
1457     howtosort = how;
1458     SortTracks();
1459     }
1460     ;
1461 mocchiut 1.37
1462 pam-fi 1.1 //
1463     //--------------------------------------
1464     /**
1465 pam-fi 1.55 * Sort physical (tracker) tracks.
1466 pam-fi 1.3 * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).
1467     * Sorting cryteria:
1468 pam-fi 1.81 * TRK: lower chi**2
1469 pam-fi 1.3 * CAL: lower Y spatial residual on the first calorimeter plane
1470     * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).
1471 pam-fi 1.55 * S1: (ask Emiliano)
1472     * S2: (ask Emiliano)
1473     * S3: (ask Emiliano)
1474 pam-fi 1.81 * GP: more GP hits
1475 pam-fi 1.3 * The default sorting cryterium is "TOF+CAL".
1476 pam-fi 1.81 *
1477 pam-fi 1.3 * The total number of physical tracks is always given by GetNTracks() and the it-th physical track can be retrieved by means of the methods GetTrack(int it) and GetTrack(int it, TString how).
1478 pam-fi 1.1 */
1479 pam-fi 1.81 void PamLevel2::SortTracks() {
1480 pam-fi 1.55
1481 pam-fi 1.81 //Check if the current event has already been sorted
1482     if (issorted && lastsorted == GetReadEntry()) {
1483     return;
1484     }
1485     //Reset the sort flags, just in case something will go wrong...
1486     issorted = false;
1487     lastsorted = -1;
1488    
1489     TString how = howtosort;
1490    
1491     // cout <<" PamLevel2::SortTracks(TString how) "<<endl;
1492     if (!trk2_obj) {
1493     cout << "void PamLevel2::SortTracks(): TrkLevel2 not loaded !!!";
1494     return;
1495     };
1496     //Save current Object count
1497     Int_t ObjectNumber = TProcessID::GetObjectCount();
1498 pam-fi 1.1
1499 pam-fi 1.81 // create TCloneArrays to store tracks and its images
1500 pam-fi 1.110 // if (!tsorted)
1501     // tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
1502     // tsorted->Clear("C+C");//Delete();
1503     // if (!timage)
1504     // timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
1505     // timage->Clear("C+C");//Delete();
1506    
1507     if(tsorted)delete tsorted;
1508     if(timage) delete timage;
1509     tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
1510     timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
1511    
1512    
1513 pam-fi 1.81 TClonesArray &ttsorted = *tsorted;
1514     TClonesArray &ttimage = *timage;
1515    
1516 pam-ts 1.95
1517    
1518 pam-fi 1.81 //--------------------------------------------------
1519     // retrieve sorting method
1520     //--------------------------------------------------
1521     Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
1522     Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
1523     Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);
1524     Bool_t use_S1 = how.Contains("S1", TString::kIgnoreCase);
1525     Bool_t use_S2 = how.Contains("S2", TString::kIgnoreCase);
1526     Bool_t use_S3 = how.Contains("S3", TString::kIgnoreCase);
1527     Bool_t use_GP = how.Contains("GP", TString::kIgnoreCase);
1528    
1529     if (use_TOF) {
1530     use_S1 = true;
1531     use_S2 = true;
1532     use_S3 = true;
1533     };
1534     if (!CAL2 && use_CAL)
1535     use_CAL = false;
1536     if (!TOF) {
1537     use_TOF = false;
1538     use_S1 = false;
1539     use_S2 = false;
1540     use_S3 = false;
1541     }
1542     if (!GP) {
1543     use_GP = false;
1544     }
1545    
1546     if (!TRK2) {
1547     cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;
1548     return;
1549     };
1550 pam-fi 1.55
1551 pam-fi 1.81 // cout << "use_CAL "<<use_CAL<<" use_TOF "<<use_TOF<<" use_TRK "<<use_TRK <<endl;
1552 pam-fi 1.13
1553    
1554 pam-fi 1.81 //--------------------------------------------------
1555     // loop over "physical" tracks sorted by the tracker
1556     //--------------------------------------------------
1557     for (Int_t i = 0; i < trk2_obj->TrkLevel2::GetNTracks(); i++) {
1558    
1559     TrkTrack *ts = 0;
1560     CaloTrkVar *cs = 0;
1561     ToFTrkVar *os = 0;
1562     OrbitalInfoTrkVar *rs = 0;
1563    
1564     // get tracker tracks
1565     TrkTrack *tp = trk2_obj->TrkLevel2::GetTrack(i); //tracker
1566     CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());
1567     ToFTrkVar *op = GetToFStoredTrack(tp->GetSeqNo());
1568     OrbitalInfoTrkVar *rp = GetOrbitalInfoStoredTrack(tp->GetSeqNo());
1569    
1570     TrkTrack *ti = 0; //tracker (image)
1571     CaloTrkVar *ci = 0;
1572     ToFTrkVar *oi = 0;
1573     OrbitalInfoTrkVar *ri = 0;
1574     // cout << "trk track n. "<<i << " "<<hex<< tp <<dec<< endl;
1575     // if track has an image, check image selection
1576    
1577     Int_t tp_score = 0; //main track sorted by the tracker
1578     Int_t ti_score = 0; //image track
1579     Int_t totp_score = 0; //main track sorted by the tracker
1580     Int_t toti_score = 0; //image track
1581    
1582     if (tp->HasImage()) {
1583    
1584     ti = trk2_obj->TrkLevel2::GetTrackImage(i); //tracker (image)
1585     ci = GetCaloStoredTrack(ti->GetSeqNo());
1586     oi = GetToFStoredTrack(ti->GetSeqNo());
1587     ri = GetOrbitalInfoStoredTrack(ti->GetSeqNo());
1588    
1589     // cout << "its image "<<i << " "<<hex<< ti <<dec<< endl;
1590    
1591     //assign starting scores
1592     tp_score = 0; //main track sorted by the tracker
1593     ti_score = 0; //image track
1594    
1595     // -----------------------------------------------------------------------------------------
1596     // *****************************************************************************************
1597     // -----------------------------------------------------------------------------------------
1598     // calorimeter check
1599     // -----------------------------------------------------------------------------------------
1600     if (use_CAL && !calo2_obj) {
1601     cout << "void PamLevel2::SortTracks(): howtosort= " << how << " but CaloLevel2 not loaded !!!";
1602     return;
1603     };
1604     if (use_CAL && !cp && ci) {
1605     ti_score++;
1606     toti_score++;
1607     };
1608     if (use_CAL && cp && !ci) {
1609     tp_score++;
1610     totp_score++;
1611     };
1612     if (use_CAL && cp && ci && true) {
1613    
1614     if (cp->npresh > ci->npresh && true) {
1615     tp_score++;
1616     totp_score++;
1617     };
1618     if (cp->npresh < ci->npresh && true) {
1619     ti_score++;
1620     toti_score++;
1621     };
1622    
1623     // cout << "CALO "<<tp_score<<ti_score<<endl;
1624    
1625     };
1626     // -----------------------------------------------------------------------------------------
1627     // *****************************************************************************************
1628     // -----------------------------------------------------------------------------------------
1629     // TOF check
1630     // -----------------------------------------------------------------------------------------
1631     // check the number of hit pmts along the track
1632     // on S12 S21 and S32, where paddles are parallel to Y axis
1633 pam-ts 1.95 if ((use_TOF || use_S1 || use_S2 || use_S3) && !tof2_obj) {
1634 pam-fi 1.81 cout << "void PamLevel2::SortTracks(): howtosort= " << how << " but ToFLevel2 not loaded !!!";
1635     return;
1636     };
1637     //
1638     if ((use_TOF || use_S1 || use_S2 || use_S3) && !op && oi) {
1639     ti_score++;
1640     toti_score++;
1641     };
1642     if ((use_TOF || use_S1 || use_S2 || use_S3) && op && !oi) {
1643     tp_score++;
1644     totp_score++;
1645     };
1646     if ((use_TOF || use_S1 || use_S2 || use_S3) && op && oi) {
1647     //
1648     Float_t sen = 0.;
1649     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1650 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((op->pmtadc).At(ih));
1651 pam-fi 1.81 if (pl == 2 || pl == 3 || pl == 4 || pl == 5)
1652     sen += (op->dedx).At(ih);
1653     };
1654     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1655 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1656 pam-fi 1.81 if (pl == 2 || pl == 3 || pl == 4 || pl == 5)
1657     sen += (oi->dedx).At(ih);
1658     };
1659     //
1660     if (sen >= sortthr && false) { // temporary disabled NUCLEI special algorithm since the new one should work for every particle (to be checked!)
1661     //printf(" IS A NUCLEUS! en = %f \n",sen);
1662     //
1663     // is a nucleus use a different algorithm
1664     //
1665     Int_t nz = 6;
1666     Float_t zin[6]; // << define TOF z-coordinates
1667     for (Int_t ip = 0; ip < nz; ip++)
1668 pam-ts 1.95 zin[ip] = tof2_obj->ToFLevel2::GetZTOF(tof2_obj->ToFLevel2::GetToFPlaneID(ip)); // << read ToF plane z-coordinates
1669 pam-fi 1.81 Trajectory *tr = new Trajectory(nz, zin);
1670     //
1671     Int_t nphit_p = 0;
1672     Int_t nphit_i = 0;
1673     Float_t enhit_p = 0.;
1674     Float_t enhit_i = 0.;
1675     //
1676     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1677 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((op->pmtadc).At(ih));
1678 pam-fi 1.81 if (pl == 1 || pl == 2 || pl == 5) {
1679     nphit_p++;
1680     enhit_p += (op->dedx).At(ih);
1681     };
1682     };
1683     //
1684     tp->DoTrack2(tr);
1685     //
1686     if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) {
1687     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1688 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((op->pmtadc).At(ih));
1689 pam-fi 1.81 if (pl == 0) {
1690     nphit_p++;
1691     enhit_p += (op->dedx).At(ih);
1692     };
1693     };
1694     };
1695     if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) {
1696     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1697 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((op->pmtadc).At(ih));
1698 pam-fi 1.81 if (pl == 3) {
1699     nphit_p++;
1700     enhit_p += (op->dedx).At(ih);
1701     };
1702     };
1703     };
1704     if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) {
1705     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1706 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((op->pmtadc).At(ih));
1707 pam-fi 1.81 if (pl == 4) {
1708     nphit_p++;
1709     enhit_p += (op->dedx).At(ih);
1710     };
1711     };
1712     };
1713    
1714     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1715 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1716 pam-fi 1.81 if (pl == 1 || pl == 2 || pl == 5) {
1717     nphit_i++;
1718     enhit_i += (op->dedx).At(ih);
1719     };
1720     };
1721     //
1722     ti->DoTrack2(tr);
1723     //
1724     if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) {
1725     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1726 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1727 pam-fi 1.81 if (pl == 0) {
1728     nphit_i++;
1729     enhit_i += (op->dedx).At(ih);
1730     };
1731     };
1732     };
1733     if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) {
1734     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1735 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1736 pam-fi 1.81 if (pl == 3) {
1737     nphit_i++;
1738     enhit_i += (op->dedx).At(ih);
1739     };
1740     };
1741     };
1742     if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) {
1743     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1744 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1745 pam-fi 1.81 if (pl == 4) {
1746     nphit_i++;
1747     enhit_i += (op->dedx).At(ih);
1748     };
1749     };
1750     };
1751    
1752     if ((use_TOF || use_S1 || use_S2 || use_S3) && (nphit_p + nphit_i) != 0 && true) {
1753    
1754     // printf(" seqno %i nphit_p %i nphit_i %i enhit_p %f enhit_i %f \n",trk2_obj->TrkLevel2::GetSeqNo(i),nphit_p,nphit_i,enhit_p,enhit_i);
1755     // printf(" score p %i score i %i \n",tp_score,ti_score);
1756     // if( enhit_p > enhit_i ) tp_score++;
1757     // if( nphit_p >= nphit_i && enhit_p > enhit_i ) tp_score++;
1758     if (nphit_p > nphit_i)
1759     tp_score++;
1760     if (nphit_p < nphit_i)
1761     ti_score++;
1762     if (nphit_p == nphit_i) {
1763     if (enhit_p > enhit_i)
1764     tp_score++;
1765     else
1766     ti_score++;
1767     };
1768     // printf(" dopo score p %i score i %i \n",tp_score,ti_score);
1769     };
1770     delete tr;
1771     //
1772     }
1773     else {
1774     // -------------
1775     // NOT a NUCLEUS
1776     // -------------
1777     //printf(" NOT a NUCLEUS! en = %f \n",sen);
1778    
1779     Int_t nphit_p = 0;
1780     Int_t nphit_i = 0;
1781    
1782     /* cout << "track: npmtadc "<< op->npmtadc << endl;
1783     cout << "track: npmttdc "<< op->npmttdc << endl;
1784     cout << "image: npmtadc "<< oi->npmtadc << endl;
1785     cout << "image: npmttdc "<< oi->npmttdc << endl;*/
1786    
1787     // for (Int_t ih=0; ih < op->npmtadc; ih++){
1788 pam-ts 1.95 // Int_t pl = tof2_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1789 pam-fi 1.81 // if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
1790     // };
1791    
1792     // for (Int_t ih=0; ih < oi->npmtadc; ih++){
1793 pam-ts 1.95 // Int_t pl = tof2_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1794 pam-fi 1.81 // if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
1795     // };
1796     // --- modified to count tdc signals (more efficient?)
1797     // --- and to implement check on tdcflag
1798     for (Int_t ih = 0; ih < op->npmttdc; ih++) {
1799 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((op->pmttdc).At(ih));
1800 pam-fi 1.81 // if( (op->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_p++;
1801     if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3))
1802     || (use_S3 && (pl == 4 || pl == 5))) {
1803     if ((op->tdcflag).At(ih) == 0)
1804     nphit_p++;
1805     };
1806     };
1807    
1808     for (Int_t ih = 0; ih < oi->npmttdc; ih++) {
1809 pam-ts 1.95 Int_t pl = tof2_obj->GetPlaneIndex((oi->pmttdc).At(ih));
1810 pam-fi 1.81 // if( (oi->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_i++;
1811     if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3))
1812     || (use_S3 && (pl == 4 || pl == 5))) {
1813     if ((oi->tdcflag).At(ih) == 0)
1814     nphit_i++;
1815     };
1816     };
1817    
1818     if ((nphit_p + nphit_i) != 0 && true) {
1819    
1820     if (nphit_p != nphit_i) {
1821     totp_score += nphit_p;
1822     toti_score += nphit_i;
1823     tp_score += nphit_p;
1824     ti_score += nphit_i;
1825     };
1826     // if ( nphit_p > nphit_i) tp_score+=nphit_p;
1827     // else if( nphit_p < nphit_i) ti_score+=nphit_i;
1828     // else ;//niente
1829     };
1830     };
1831     // cout << "TOF "<<tp_score<<ti_score<<endl;
1832     };
1833    
1834     // if(tp_score == ti_score) use_TRK = true;
1835    
1836    
1837     // -----------------------------------------------------------------------------------------
1838     // *****************************************************************************************
1839     // -----------------------------------------------------------------------------------------
1840     // tracker check
1841     // -----------------------------------------------------------------------------------------
1842     // chi**2 difference is not always large enough to distinguish among
1843     // the real track and its image.
1844     // Tracker check will be applied always when calorimeter and tof information is ambiguous.
1845     // *** MODIFIED ON AUGUST 2007 ***
1846     if (use_TRK) {
1847     // if( tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
1848     // else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;
1849    
1850     // CHECK 1 : number of points along X
1851     if (tp->GetNX() >= ti->GetNX()) {
1852     tp_score++;
1853     totp_score++;
1854     };
1855     if (tp->GetNX() <= ti->GetNX()) {
1856     ti_score++;
1857     toti_score++;
1858     };
1859     // CHECK 2 : number of points along Y
1860     if (tp->GetNY() >= ti->GetNY()) {
1861     tp_score++;
1862     totp_score++;
1863     };
1864     if (tp->GetNY() <= ti->GetNY()) {
1865     ti_score++;
1866     toti_score++;
1867     };
1868    
1869     // cout << "TRK "<<tp_score<<ti_score<<endl;
1870     };
1871    
1872     // -----------------------------------------------------------------------------------------
1873     // *****************************************************************************************
1874     // -----------------------------------------------------------------------------------------
1875     // GPamela check
1876     // -----------------------------------------------------------------------------------------
1877    
1878     //---------------------------------------------------
1879     // count the number of GP hits
1880     //---------------------------------------------------
1881     if (use_GP) {
1882     int ngphits_p = 0;
1883     int ngphits_i = 0;
1884     float toll = 0.02; //200 micron
1885     for (int ih = 0; ih < GetGPamela()->Nthspe; ih++) {
1886     int ip = (Int_t) GetGPamela()->Itrpb[ih] - 1;
1887     if (tp && tp->YGood(ip) && fabs(tp->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true)
1888     ngphits_p++;
1889     if (ti && ti->YGood(ip) && fabs(ti->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true)
1890     ngphits_i++;
1891     }
1892     if (ngphits_p > ngphits_i && true) {
1893     tp_score++;
1894     totp_score++;
1895     }
1896     if (ngphits_p < ngphits_i && true) {
1897     ti_score++;
1898     toti_score++;
1899     }
1900     }
1901    
1902     // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1903     // the winner is....
1904     // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1905     if (tp_score > ti_score) {
1906    
1907     }
1908     else if (tp_score < ti_score) {
1909    
1910     ts = ti;//its image!!
1911     cs = ci;
1912     os = oi;
1913     rs = ri;
1914     Int_t totis = toti_score;
1915    
1916     ti = tp;//its image!!
1917     ci = cp;
1918     oi = op;
1919     ri = rp;
1920    
1921     tp = ts;//its image!!
1922     cp = cs;
1923     op = os;
1924     rp = rs;
1925    
1926     toti_score = totp_score;
1927     totp_score = totis;
1928    
1929     }
1930     else {
1931    
1932     // cout << "Warning - track image ambiguity not solved" << endl;
1933    
1934     };
1935    
1936     }
1937     else {
1938     totp_score = 1;
1939     toti_score = 0;
1940    
1941     // ts = tp;
1942     // cs = cp;
1943     // os = op;
1944     };
1945    
1946     // cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;
1947     // sorted_tracks->Add(ts);//save the track in the sorted array
1948     // sorted_tracks.Add(ts);//save the track in the sorted array
1949     // sorted_tracks.Add(tp);//save the track in the sorted array
1950     // cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;
1951     // cout<<"o "<<tp<<endl;
1952     // cout<<"o "<<cp<<endl;
1953     // cout<<"o "<<op<<endl;
1954    
1955     new (ttsorted[i]) PamTrack(tp, cp, op, rp);
1956     new (ttimage[i]) PamTrack(ti, ci, oi, ri);
1957    
1958     ((PamTrack*) (ttsorted[i]))->SetPScore(totp_score);
1959     ((PamTrack*) (ttsorted[i]))->SetIScore(toti_score);
1960     ((PamTrack*) (ttimage[i]))->SetPScore(totp_score);
1961     ((PamTrack*) (ttimage[i]))->SetIScore(toti_score);
1962     };
1963 pam-fi 1.41
1964 pam-fi 1.81 if (tsorted->GetEntries() != trk2_obj->GetNTracks()) {
1965     cout << "void PamLevel2::SortTracks(): tsorted->GetEntries() " << tsorted->GetEntries()
1966     << " != trk2_obj->GetNTracks() = " << trk2_obj->GetNTracks() << endl;
1967     tsorted->Delete();
1968     tsorted = 0;
1969     timage->Delete();
1970     timage = 0;
1971     }
1972 pam-fi 1.55
1973 pam-fi 1.81 //Restore Object count
1974     //To save space in the table keeping track of all referenced objects
1975     //We reset the object count to what it was at the beginning of the event.
1976     TProcessID::SetObjectCount(ObjectNumber);
1977    
1978     //Everything went fine so the current event can be tagged as sorted
1979     issorted = true;
1980     lastsorted = GetReadEntry();
1981 pam-fi 1.9
1982 pam-fi 1.81 }
1983     ;
1984 pam-ts 1.95 //
1985     //--------------------------------------
1986     /**
1987     * Sort physical (tracker) tracks.
1988     * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).
1989     * Sorting cryteria:
1990     * TRK: lower chi**2
1991     * CAL: lower Y spatial residual on the first calorimeter plane
1992     * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).
1993     * S1: (ask Emiliano)
1994     * S2: (ask Emiliano)
1995     * S3: (ask Emiliano)
1996     * GP: more GP hits
1997     * The default sorting cryterium is "TOF+CAL".
1998     *
1999     * The total number of physical tracks is always given by GetNTracks() and the it-th physical track can be retrieved by means of the methods GetTrack(int it) and GetTrack(int it, TString how).
2000     *
2001     * New version, with handling of extended tracks and nuclei tracks.
2002     */
2003     void PamLevel2::SortTracksNew() {
2004    
2005     //--------------------------------------------------
2006     //Check if the current event has already been sorted
2007     //--------------------------------------------------
2008     if (issorted_new && lastsorted_new == GetReadEntry()) {
2009     return; //already done for this event
2010     }
2011    
2012    
2013     // cout << "SORT" << endl;
2014    
2015     //Reset the sort flags, just in case something will go wrong...
2016     issorted_new = false;
2017     lastsorted_new = -1;
2018    
2019     //--------------------------------------------------
2020     // set input variables
2021     //--------------------------------------------------
2022    
2023     TString how = howtosort;
2024     //Save current Object count
2025     Int_t ObjectNumber = TProcessID::GetObjectCount();
2026    
2027    
2028    
2029    
2030     TrkLevel2 * trk2 ;
2031     CaloLevel2 * calo2;
2032     ToFLevel2 * tof2 ;
2033     OrbitalInfo * orb2 ;
2034    
2035     TClonesArray * trkext ;
2036     TClonesArray * caloext;
2037     TClonesArray * tofext ;
2038     TClonesArray * orbext ;
2039    
2040    
2041     // cout << "trk2_obj" << trk2_obj<< endl;
2042     // cout << "trk2_nuc_obj" << trk2_nuc_obj<< endl;
2043     // cout << " trk_ext_obj "<<trk_ext_obj<< endl;
2044     // cout << " trk_ext_nuc_obj "<<trk_ext_nuc_obj<< endl;
2045    
2046     //-----------------------------------------------------------
2047     // create/reset TCloneArrays to store tracks and their images
2048     //-----------------------------------------------------------
2049 pam-fi 1.97
2050     // cout << " PamLevel2::SortTracksNew() --- Clear TClonesArray objects"<<endl;
2051 pam-ts 1.95
2052     // main tracks from standard alg
2053 pam-fi 1.97 // if (!tsorted)
2054     // tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
2055     // tsorted->Clear("C+C");//Delete();
2056     // // track images from standard alg
2057     // if (!timage)
2058     // timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
2059     // timage->Clear("C+C");//Delete();
2060     // // tracks from extended algorythm
2061     // if(EXT && !text)
2062     // text = new TClonesArray("PamTrack",trk_ext_obj->GetEntries());
2063     // if(text)text->Clear("C+C");//Delete();
2064    
2065     if(tsorted)delete tsorted;
2066     if(timage) delete timage;
2067     if(text) delete text;
2068     tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
2069     timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
2070     text = new TClonesArray("PamTrack",trk_ext_obj->GetEntries());
2071 pam-ts 1.95
2072     //-----------------------------------------------------------
2073     // create/reset TCloneArrays to store tracks and their images
2074     //-----------------------------------------------------------
2075     if(NUC){
2076 pam-fi 1.97
2077    
2078     if(tsorted_nuc)delete tsorted_nuc;
2079     if(timage_nuc) delete timage_nuc;
2080     if(text_nuc) delete text_nuc;
2081     tsorted_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks());
2082     timage_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks());
2083     text_nuc = new TClonesArray("PamTrack",trk_ext_nuc_obj->GetEntries());
2084    
2085 pam-ts 1.95 // main tracks from standard alg
2086 pam-fi 1.97 // if (!tsorted_nuc)
2087     // tsorted_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks());
2088     // tsorted_nuc->Clear("C+C");//Delete();
2089     // // track images from standard alg
2090     // if (!timage_nuc)
2091     // timage_nuc = new TClonesArray("PamTrack", trk2_nuc_obj->GetNTracks());
2092     // timage_nuc->Clear("C+C");//Delete();
2093     // // tracks from extended algorythm
2094     // if(EXT && !text_nuc)
2095     // text_nuc = new TClonesArray("PamTrack",trk_ext_nuc_obj->GetEntries());
2096     // if(text_nuc)text_nuc->Clear("C+C");//Delete();
2097    
2098 pam-ts 1.95 }
2099     //--------------------------------------------------
2100     // retrieve sorting method
2101     //--------------------------------------------------
2102     Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
2103     Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
2104     Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);
2105     Bool_t use_S1 = how.Contains("S1", TString::kIgnoreCase);
2106     Bool_t use_S2 = how.Contains("S2", TString::kIgnoreCase);
2107     Bool_t use_S3 = how.Contains("S3", TString::kIgnoreCase);
2108     Bool_t use_GP = how.Contains("GP", TString::kIgnoreCase);
2109    
2110     if (use_TOF) {
2111     use_S1 = true;
2112     use_S2 = true;
2113     use_S3 = true;
2114     };
2115     if (!CAL2 && use_CAL)
2116     use_CAL = false;
2117     if (!TOF) {
2118     use_TOF = false;
2119     use_S1 = false;
2120     use_S2 = false;
2121     use_S3 = false;
2122     }
2123     if (!GP) {
2124     use_GP = false;
2125     }
2126    
2127     if (!TRK2) {
2128     cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;
2129     return;
2130     };
2131    
2132    
2133     ///////////////////////////////////////////////////////////////////////////////////
2134     //
2135     // sort tracks and fill PamTrack arrays
2136     //
2137     ///////////////////////////////////////////////////////////////////////////////////
2138     for(int doit=0; doit<2; doit++){
2139    
2140     // cout << "doit "<<doit<<endl;
2141    
2142    
2143     if(doit == 0){
2144    
2145     trk2 = trk2_obj;
2146     calo2 = calo2_obj;
2147     tof2 = tof2_obj;
2148     orb2 = orb2_obj;
2149    
2150     trkext = trk_ext_obj;
2151     caloext = calo_ext_obj;
2152     tofext = tof_ext_obj;
2153     orbext = orb_ext_obj;
2154    
2155    
2156    
2157    
2158    
2159     }else if (doit == 1){
2160    
2161     if(!NUC)break;
2162    
2163    
2164     trk2 = trk2_nuc_obj;
2165     calo2 = calo2_nuc_obj;
2166     tof2 = tof2_nuc_obj;
2167     orb2 = orb2_nuc_obj;
2168    
2169     trkext = trk_ext_nuc_obj;
2170     caloext = calo_ext_nuc_obj;
2171     tofext = tof_ext_nuc_obj;
2172     orbext = orb_ext_nuc_obj;
2173    
2174    
2175    
2176    
2177     }
2178    
2179     // cout << "trk2" << trk2<<endl;
2180     // cout << "calo2" << calo2<<endl;
2181     // cout << "tof2" << tof2<<endl;
2182     // cout << "orb2" << orb2<<endl;
2183     // cout << "trkext" <<trkext <<endl;
2184     // cout << "tofext" << tofext<<endl;
2185     // cout << "caloext" << caloext<<endl;
2186     // cout << "orbext" << orbext<<endl;
2187    
2188     TClonesArray &ttext = (doit==0 ? *text : *text_nuc);
2189     TClonesArray &ttimage = (doit==0 ? *timage : *timage_nuc);
2190     TClonesArray &ttsorted = (doit==0 ? *tsorted : *tsorted_nuc);
2191    
2192     // cout << "tsorted + timage "<<doit<<endl;
2193    
2194     //--------------------------------------------------
2195     // loop over "physical" tracks sorted by the tracker
2196     //--------------------------------------------------
2197     for (Int_t i = 0; i < trk2->TrkLevel2::GetNTracks(); i++) {
2198    
2199     TrkTrack *ts = 0;
2200     CaloTrkVar *cs = 0;
2201     ToFTrkVar *os = 0;
2202     OrbitalInfoTrkVar *rs = 0;
2203    
2204     // get tracker tracks
2205     TrkTrack *tp = trk2->GetTrack(i); //tracker
2206     CaloTrkVar *cp = calo2->GetCaloStoredTrack(tp->GetSeqNo());
2207     ToFTrkVar *op = tof2->GetToFStoredTrack(tp->GetSeqNo());
2208     OrbitalInfoTrkVar *rp = orb2->GetOrbitalInfoStoredTrack(tp->GetSeqNo());
2209    
2210     TrkTrack *ti = 0; //tracker (image)
2211     CaloTrkVar *ci = 0;
2212     ToFTrkVar *oi = 0;
2213     OrbitalInfoTrkVar *ri = 0;
2214     // cout << "trk track n. "<<i << " "<<hex<< tp <<dec<< endl;
2215     // if track has an image, check image selection
2216    
2217     Int_t tp_score = 0; //main track sorted by the tracker
2218     Int_t ti_score = 0; //image track
2219     Int_t totp_score = 0; //main track sorted by the tracker
2220     Int_t toti_score = 0; //image track
2221    
2222     if (tp->HasImage()) {
2223    
2224     ti = trk2->GetTrackImage(i); //tracker (image)
2225     ci = calo2->GetCaloStoredTrack(ti->GetSeqNo());
2226     oi = tof2->GetToFStoredTrack(ti->GetSeqNo());
2227     ri = orb2->GetOrbitalInfoStoredTrack(ti->GetSeqNo());
2228    
2229     // cout << "its image "<<i << " "<<hex<< ti <<dec<< endl;
2230    
2231     //assign starting scores
2232     tp_score = 0; //main track sorted by the tracker
2233     ti_score = 0; //image track
2234    
2235     // -----------------------------------------------------------------------------------------
2236     // *****************************************************************************************
2237     // -----------------------------------------------------------------------------------------
2238     // calorimeter check
2239     // -----------------------------------------------------------------------------------------
2240     if (use_CAL && !calo2) {
2241     cout << "void PamLevel2::SortTracks(): howtosort= " << how << " but CaloLevel2 not loaded !!!";
2242     return;
2243     };
2244     if (use_CAL && !cp && ci) {
2245     ti_score++;
2246     toti_score++;
2247     };
2248     if (use_CAL && cp && !ci) {
2249     tp_score++;
2250     totp_score++;
2251     };
2252     if (use_CAL && cp && ci && true) {
2253    
2254     if (cp->npresh > ci->npresh && true) {
2255     tp_score++;
2256     totp_score++;
2257     };
2258     if (cp->npresh < ci->npresh && true) {
2259     ti_score++;
2260     toti_score++;
2261     };
2262    
2263     // cout << "CALO "<<tp_score<<ti_score<<endl;
2264    
2265     };
2266     // -----------------------------------------------------------------------------------------
2267     // *****************************************************************************************
2268     // -----------------------------------------------------------------------------------------
2269     // TOF check
2270     // -----------------------------------------------------------------------------------------
2271     // check the number of hit pmts along the track
2272     // on S12 S21 and S32, where paddles are parallel to Y axis
2273     if ((use_TOF || use_S1 || use_S2 || use_S3) && !tof2) {
2274     cout << "void PamLevel2::SortTracks(): howtosort= " << how << " but ToFLevel2 not loaded !!!";
2275     return;
2276     };
2277     //
2278     if ((use_TOF || use_S1 || use_S2 || use_S3) && !op && oi) {
2279     ti_score++;
2280     toti_score++;
2281     };
2282     if ((use_TOF || use_S1 || use_S2 || use_S3) && op && !oi) {
2283     tp_score++;
2284     totp_score++;
2285     };
2286     if ((use_TOF || use_S1 || use_S2 || use_S3) && op && oi) {
2287     //
2288     Float_t sen = 0.;
2289     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
2290     Int_t pl = tof2->GetPlaneIndex((op->pmtadc).At(ih));
2291     if (pl == 2 || pl == 3 || pl == 4 || pl == 5)
2292     sen += (op->dedx).At(ih);
2293     };
2294     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
2295     Int_t pl = tof2->GetPlaneIndex((oi->pmtadc).At(ih));
2296     if (pl == 2 || pl == 3 || pl == 4 || pl == 5)
2297     sen += (oi->dedx).At(ih);
2298     };
2299     //
2300     if (sen >= sortthr && false) { // temporary disabled NUCLEI special algorithm since the new one should work for every particle (to be checked!)
2301     //printf(" IS A NUCLEUS! en = %f \n",sen);
2302     //
2303     // is a nucleus use a different algorithm
2304     //
2305     Int_t nz = 6;
2306     Float_t zin[6]; // << define TOF z-coordinates
2307     for (Int_t ip = 0; ip < nz; ip++)
2308     zin[ip] = tof2->GetZTOF(tof2->GetToFPlaneID(ip)); // << read ToF plane z-coordinates
2309     Trajectory *tr = new Trajectory(nz, zin);
2310     //
2311     Int_t nphit_p = 0;
2312     Int_t nphit_i = 0;
2313     Float_t enhit_p = 0.;
2314     Float_t enhit_i = 0.;
2315     //
2316     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
2317     Int_t pl = tof2->GetPlaneIndex((op->pmtadc).At(ih));
2318     if (pl == 1 || pl == 2 || pl == 5) {
2319     nphit_p++;
2320     enhit_p += (op->dedx).At(ih);
2321     };
2322     };
2323     //
2324     tp->DoTrack2(tr);
2325     //
2326     if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) {
2327     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
2328     Int_t pl = tof2->GetPlaneIndex((op->pmtadc).At(ih));
2329     if (pl == 0) {
2330     nphit_p++;
2331     enhit_p += (op->dedx).At(ih);
2332     };
2333     };
2334     };
2335     if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) {
2336     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
2337     Int_t pl = tof2->GetPlaneIndex((op->pmtadc).At(ih));
2338     if (pl == 3) {
2339     nphit_p++;
2340     enhit_p += (op->dedx).At(ih);
2341     };
2342     };
2343     };
2344     if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) {
2345     for (Int_t ih = 0; ih < op->npmtadc; ih++) {
2346     Int_t pl = tof2->GetPlaneIndex((op->pmtadc).At(ih));
2347     if (pl == 4) {
2348     nphit_p++;
2349     enhit_p += (op->dedx).At(ih);
2350     };
2351     };
2352     };
2353    
2354     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
2355     Int_t pl = tof2->GetPlaneIndex((oi->pmtadc).At(ih));
2356     if (pl == 1 || pl == 2 || pl == 5) {
2357     nphit_i++;
2358     enhit_i += (op->dedx).At(ih);
2359     };
2360     };
2361     //
2362     ti->DoTrack2(tr);
2363     //
2364     if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) {
2365     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
2366     Int_t pl = tof2->GetPlaneIndex((oi->pmtadc).At(ih));
2367     if (pl == 0) {
2368     nphit_i++;
2369     enhit_i += (op->dedx).At(ih);
2370     };
2371     };
2372     };
2373     if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) {
2374     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
2375     Int_t pl = tof2->GetPlaneIndex((oi->pmtadc).At(ih));
2376     if (pl == 3) {
2377     nphit_i++;
2378     enhit_i += (op->dedx).At(ih);
2379     };
2380     };
2381     };
2382     if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) {
2383     for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
2384     Int_t pl = tof2->GetPlaneIndex((oi->pmtadc).At(ih));
2385     if (pl == 4) {
2386     nphit_i++;
2387     enhit_i += (op->dedx).At(ih);
2388     };
2389     };
2390     };
2391    
2392     if ((use_TOF || use_S1 || use_S2 || use_S3) && (nphit_p + nphit_i) != 0 && true) {
2393    
2394     // printf(" seqno %i nphit_p %i nphit_i %i enhit_p %f enhit_i %f \n",trk2_obj->TrkLevel2::GetSeqNo(i),nphit_p,nphit_i,enhit_p,enhit_i);
2395     // printf(" score p %i score i %i \n",tp_score,ti_score);
2396     // if( enhit_p > enhit_i ) tp_score++;
2397     // if( nphit_p >= nphit_i && enhit_p > enhit_i ) tp_score++;
2398     if (nphit_p > nphit_i)
2399     tp_score++;
2400     if (nphit_p < nphit_i)
2401     ti_score++;
2402     if (nphit_p == nphit_i) {
2403     if (enhit_p > enhit_i)
2404     tp_score++;
2405     else
2406     ti_score++;
2407     };
2408     // printf(" dopo score p %i score i %i \n",tp_score,ti_score);
2409     };
2410     delete tr;
2411     //
2412     }
2413     else {
2414     // -------------
2415     // NOT a NUCLEUS
2416     // -------------
2417     //printf(" NOT a NUCLEUS! en = %f \n",sen);
2418    
2419     Int_t nphit_p = 0;
2420     Int_t nphit_i = 0;
2421    
2422     /* cout << "track: npmtadc "<< op->npmtadc << endl;
2423     cout << "track: npmttdc "<< op->npmttdc << endl;
2424     cout << "image: npmtadc "<< oi->npmtadc << endl;
2425     cout << "image: npmttdc "<< oi->npmttdc << endl;*/
2426    
2427     // for (Int_t ih=0; ih < op->npmtadc; ih++){
2428     // Int_t pl = tof2_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
2429     // if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
2430     // };
2431    
2432     // for (Int_t ih=0; ih < oi->npmtadc; ih++){
2433     // Int_t pl = tof2_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
2434     // if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
2435     // };
2436     // --- modified to count tdc signals (more efficient?)
2437     // --- and to implement check on tdcflag
2438     for (Int_t ih = 0; ih < op->npmttdc; ih++) {
2439     Int_t pl = tof2->GetPlaneIndex((op->pmttdc).At(ih));
2440     // if( (op->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_p++;
2441     if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3))
2442     || (use_S3 && (pl == 4 || pl == 5))) {
2443     if ((op->tdcflag).At(ih) == 0)
2444     nphit_p++;
2445     };
2446     };
2447    
2448     for (Int_t ih = 0; ih < oi->npmttdc; ih++) {
2449     Int_t pl = tof2->GetPlaneIndex((oi->pmttdc).At(ih));
2450     // if( (oi->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_i++;
2451     if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3))
2452     || (use_S3 && (pl == 4 || pl == 5))) {
2453     if ((oi->tdcflag).At(ih) == 0)
2454     nphit_i++;
2455     };
2456     };
2457    
2458     if ((nphit_p + nphit_i) != 0 && true) {
2459    
2460     if (nphit_p != nphit_i) {
2461     totp_score += nphit_p;
2462     toti_score += nphit_i;
2463     tp_score += nphit_p;
2464     ti_score += nphit_i;
2465     };
2466     // if ( nphit_p > nphit_i) tp_score+=nphit_p;
2467     // else if( nphit_p < nphit_i) ti_score+=nphit_i;
2468     // else ;//niente
2469     };
2470     };
2471     // cout << "TOF "<<tp_score<<ti_score<<endl;
2472     };
2473    
2474     // if(tp_score == ti_score) use_TRK = true;
2475    
2476    
2477     // -----------------------------------------------------------------------------------------
2478     // *****************************************************************************************
2479     // -----------------------------------------------------------------------------------------
2480     // tracker check
2481     // -----------------------------------------------------------------------------------------
2482     // chi**2 difference is not always large enough to distinguish among
2483     // the real track and its image.
2484     // Tracker check will be applied always when calorimeter and tof information is ambiguous.
2485     // *** MODIFIED ON AUGUST 2007 ***
2486     if (use_TRK) {
2487     // if( tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
2488     // else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;
2489    
2490     // CHECK 1 : number of points along X
2491     if (tp->GetNX() >= ti->GetNX()) {
2492     tp_score++;
2493     totp_score++;
2494     };
2495     if (tp->GetNX() <= ti->GetNX()) {
2496     ti_score++;
2497     toti_score++;
2498     };
2499     // CHECK 2 : number of points along Y
2500     if (tp->GetNY() >= ti->GetNY()) {
2501     tp_score++;
2502     totp_score++;
2503     };
2504     if (tp->GetNY() <= ti->GetNY()) {
2505     ti_score++;
2506     toti_score++;
2507     };
2508    
2509     // cout << "TRK "<<tp_score<<ti_score<<endl;
2510     };
2511    
2512     // -----------------------------------------------------------------------------------------
2513     // *****************************************************************************************
2514     // -----------------------------------------------------------------------------------------
2515     // GPamela check
2516     // -----------------------------------------------------------------------------------------
2517    
2518     //---------------------------------------------------
2519     // count the number of GP hits
2520     //---------------------------------------------------
2521     if (use_GP) {
2522     int ngphits_p = 0;
2523     int ngphits_i = 0;
2524     float toll = 0.02; //200 micron
2525     for (int ih = 0; ih < GetGPamela()->Nthspe; ih++) {
2526     int ip = (Int_t) GetGPamela()->Itrpb[ih] - 1;
2527     if (tp && tp->YGood(ip) && fabs(tp->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true)
2528     ngphits_p++;
2529     if (ti && ti->YGood(ip) && fabs(ti->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true)
2530     ngphits_i++;
2531     }
2532     if (ngphits_p > ngphits_i && true) {
2533     tp_score++;
2534     totp_score++;
2535     }
2536     if (ngphits_p < ngphits_i && true) {
2537     ti_score++;
2538     toti_score++;
2539     }
2540     }
2541    
2542     // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2543     // the winner is....
2544     // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2545     if (tp_score > ti_score) {
2546    
2547     }
2548     else if (tp_score < ti_score) {
2549    
2550     ts = ti;//its image!!
2551     cs = ci;
2552     os = oi;
2553     rs = ri;
2554     Int_t totis = toti_score;
2555    
2556     ti = tp;//its image!!
2557     ci = cp;
2558     oi = op;
2559     ri = rp;
2560    
2561     tp = ts;//its image!!
2562     cp = cs;
2563     op = os;
2564     rp = rs;
2565    
2566     toti_score = totp_score;
2567     totp_score = totis;
2568    
2569     }
2570     else {
2571    
2572     // cout << "Warning - track image ambiguity not solved" << endl;
2573    
2574     };
2575    
2576     }
2577     else {
2578     totp_score = 1;
2579     toti_score = 0;
2580    
2581     // ts = tp;
2582     // cs = cp;
2583     // os = op;
2584     };
2585    
2586     // cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;
2587     // sorted_tracks->Add(ts);//save the track in the sorted array
2588     // sorted_tracks.Add(ts);//save the track in the sorted array
2589     // sorted_tracks.Add(tp);//save the track in the sorted array
2590     // cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;
2591     // cout<<"o "<<tp<<endl;
2592     // cout<<"o "<<cp<<endl;
2593     // cout<<"o "<<op<<endl;
2594    
2595     new (ttsorted[i]) PamTrack(tp, cp, op, rp);
2596     new (ttimage[i]) PamTrack(ti, ci, oi, ri);
2597    
2598     ((PamTrack*) (ttsorted[i]))->SetPScore(totp_score);
2599     ((PamTrack*) (ttsorted[i]))->SetIScore(toti_score);
2600     ((PamTrack*) (ttimage[i]))->SetPScore(totp_score);
2601     ((PamTrack*) (ttimage[i]))->SetIScore(toti_score);
2602     };
2603    
2604    
2605    
2606    
2607    
2608     // if (tsorted->GetEntries() != trk2->GetNTracks()) {
2609     // cout << "void PamLevel2::SortTracks(): tsorted->GetEntries() " << tsorted->GetEntries()
2610     // << " != trk2->GetNTracks() = " << trk2->GetNTracks() << endl;
2611     // tsorted->Delete();
2612     // tsorted = 0;
2613     // timage->Delete();
2614     // timage = 0;
2615     // }
2616    
2617    
2618     // cout << "text "<<doit<<endl;
2619    
2620    
2621     //--------------------------------------------------
2622     // fill array with extended tracks (this is easy...)
2623     //--------------------------------------------------
2624     if(EXT){
2625     for(int it=0; it<trkext->GetEntries(); it++){
2626    
2627     new (ttext[it]) PamTrack((ExtTrack*)(*trkext)[it], (CaloTrkVar*)(*caloext)[it], (ToFTrkVar*)(*tofext)[it], (OrbitalInfoTrkVar*)(*orbext)[it]);
2628    
2629     }
2630     }
2631    
2632    
2633    
2634     };
2635    
2636    
2637     //Restore Object count
2638     //To save space in the table keeping track of all referenced objects
2639     //We reset the object count to what it was at the beginning of the event.
2640     TProcessID::SetObjectCount(ObjectNumber);
2641    
2642     //Everything went fine so the current event can be tagged as sorted
2643     issorted_new = true;
2644     lastsorted_new = GetReadEntry();
2645    
2646     // cout << " tsorted "<< tsorted << " "<<(tsorted ? tsorted->GetEntries() : 0)<<endl;
2647     // cout << " timage "<< timage << " "<<(timage ? timage->GetEntries() : 0)<<endl;
2648     // cout << " text "<< text << " "<<(text ? text->GetEntries() : 0)<<endl;
2649    
2650    
2651     };
2652 pam-fi 1.1 //--------------------------------------
2653     //
2654     //
2655     //--------------------------------------
2656     /**
2657 pam-fi 1.2 * This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2.
2658     * PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information.
2659 pam-ts 1.96 */
2660 pam-ts 1.95
2661 pam-fi 1.13 // TRefArray *PamLevel2::GetTracks(){
2662    
2663     // // *-*-*-*-*-*-*-*-*-*-*-*-*
2664     // SortTracks("+CAL+TOF");
2665     // // *-*-*-*-*-*-*-*-*-*-*-*-*
2666    
2667     // // return sorted_tracks;
2668     // return &sorted_tracks;
2669 pam-fi 1.81
2670 pam-fi 1.13 // };
2671 pam-fi 1.81
2672 pam-fi 1.8
2673 pam-fi 1.2 //--------------------------------------
2674 pam-fi 1.55 //
2675     //
2676 pam-fi 1.2 //--------------------------------------
2677 pam-ts 1.96
2678 pam-fi 1.2 /**
2679 pam-fi 1.81 * Retrieves the it-th Pamela "physical" track.
2680     * It override TrkLevel2::GetTrack(int it).
2681 pam-fi 1.1 * @param it Track number, ranging from 0 to GetNTracks().
2682     */
2683 pam-ts 1.96 PamTrack *PamLevel2::GetTrackOld(int it) {
2684 pam-fi 1.81
2685 pam-ts 1.95 PamTrack *track = NULL;
2686 pam-fi 1.81
2687     // *-*-*-*-*-*-*-*-*-*-*-*-*
2688     SortTracks();
2689     // *-*-*-*-*-*-*-*-*-*-*-*-*
2690     if (!tsorted)
2691 pam-ts 1.95 return track;
2692 pam-fi 1.110 // if (!tsorted->GetEntries())
2693     // return track;
2694     if (tsorted->GetEntries()==0)
2695 pam-ts 1.95 return track;
2696 pam-fi 1.81
2697    
2698 pam-fi 1.110 if (
2699     tsorted &&
2700     it >= 0 &&
2701     it < trk2_obj->TrkLevel2::GetNTracks() &&
2702     it < tsorted->GetEntries() &&
2703     true) {
2704     track = (PamTrack*)((*tsorted)[it]);
2705 pam-fi 1.81 }
2706     else {
2707 pam-ts 1.96 cout << "PamLevel2::GetTrackOld(int) : tracker track SeqNo " << it << " does not exist (GetNTracks() = "
2708 pam-fi 1.81 << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl;
2709     };
2710 pam-fi 1.13
2711 pam-fi 1.81 return track;
2712 pam-fi 1.13
2713 pam-ts 1.95 };
2714    
2715     //PamTrack *PamLevel2::GetTrack(int it) { return GetTrack(it,trkAlg); };
2716    
2717     /**
2718     * Retrieves the it-th Pamela "physical" track.
2719     * It override TrkLevel2::GetTrack(int it).
2720     * @param it Track number, ranging from 0 to GetNTracks().
2721     * @param alg Algorythm, see SetTrakingAlgorythm(char *alg) for explanation.
2722     */
2723 pam-ts 1.96 PamTrack *PamLevel2::GetTrack(int it, const char* alg) {
2724 pam-ts 1.95
2725     TString s(alg);
2726 pam-ts 1.96 if(!s.CompareTo("") ||!s.CompareTo("STD") )return GetTrackOld(it); //old algorythm
2727 pam-ts 1.95
2728    
2729     SortTracksNew();
2730     // >> fill tsorted, timage and text
2731    
2732     if ( ( !s.Contains("EXTF", TString::kIgnoreCase) || !EXT )){ //not forced exteded-alg requested (or exteded-data missing)
2733    
2734     if( s.Contains("NUC")){
2735     if(
2736     tsorted_nuc &&
2737     it < tsorted_nuc->GetEntries() && //enough tracks found
2738     it >= 0 && //valid index
2739     true) return (PamTrack*)((*tsorted_nuc)[it]); //ok return the track
2740     }else{
2741     if(
2742     tsorted &&
2743     it < tsorted->GetEntries() && //enough tracks found
2744     it >= 0 && //valid index
2745     true )return (PamTrack*)((*tsorted)[it]); //ok return the track
2746     }
2747    
2748     }
2749    
2750    
2751     /////////////////////////////////////////////////////////////////////////
2752     /// if requested get track from extended algorythm output
2753     /////////////////////////////////////////////////////////////////////////
2754    
2755     if(s.Contains("EXT", TString::kIgnoreCase) && EXT){//if exteded-alg requested
2756    
2757     if(s.Contains("NUC")){
2758     if(
2759     text_nuc &&
2760     it < text_nuc->GetEntries() && //enough tracks found
2761     it >= 0 && //valid index
2762     true) return (PamTrack*)((*text_nuc)[it]);
2763     }else{
2764     if(
2765     text &&
2766     it < text->GetEntries() && //enough tracks found
2767     it >= 0 && //valid index
2768     true) return (PamTrack*)((*text)[it]);
2769     }
2770    
2771     };
2772    
2773    
2774 pam-ts 1.96 cout << "PamTrack *PamLevel2::GetTrack("<<it<<","<<alg<<") -- wrong track number or unrecognised algorithm"<<endl;
2775 pam-ts 1.95
2776     return NULL;
2777    
2778     }
2779     ;
2780     TClonesArray *PamLevel2::GetTracks() {
2781    
2782     // *-*-*-*-*-*-*-*-*-*-*-*-*
2783     SortTracks();
2784     // *-*-*-*-*-*-*-*-*-*-*-*-*
2785    
2786     return tsorted;
2787    
2788 pam-fi 1.81 }
2789     ;
2790 pam-ts 1.96 Int_t PamLevel2::GetNTracks(const char* alg) {
2791 pam-ts 1.95
2792    
2793     // cout << " trk_nuc_obj->GetEntries() "<<trk_nuc_obj->GetEntries()<<" trk2_nuc_obj->GetNTracks() "<<trk2_nuc_obj->GetNTracks()<<endl;
2794    
2795     TString s(alg);
2796    
2797     if(!s.CompareTo("") || !s.CompareTo("STD"))return trk2_obj->TrkLevel2::GetNTracks(); //standard algorythm
2798    
2799     if(s.Contains("EXTF", TString::kIgnoreCase) && EXT){
2800     if(s.Contains("NUC", TString::kIgnoreCase) && NUC)return trk_ext_nuc_obj->GetEntries();//ok
2801     return trk_ext_obj->GetEntries();//ok
2802     }
2803     if( s.Contains("EXT", TString::kIgnoreCase) && EXT) {
2804     if(s.Contains("NUC", TString::kIgnoreCase) && NUC)
2805     return (trk2_nuc_obj->TrkLevel2::GetNTracks() ? trk2_nuc_obj->TrkLevel2::GetNTracks() : trk_ext_nuc_obj->GetEntries() );
2806     return (trk2_obj->TrkLevel2::GetNTracks() ? trk2_obj->TrkLevel2::GetNTracks() : trk_ext_obj->GetEntries() );
2807     }
2808     if(s.Contains("NUC", TString::kIgnoreCase) && NUC )
2809     return trk2_nuc_obj->TrkLevel2::GetNTracks();
2810    
2811 pam-ts 1.96 cout << "Int_t PamLevel2::GetNTracks("<<alg<<") -- unrecognised algorithm"<<endl;
2812    
2813 pam-ts 1.95 return 0;
2814    
2815     }
2816    
2817 pam-fi 1.3
2818 pam-fi 1.1 //--------------------------------------
2819     //
2820     //
2821     //--------------------------------------
2822     /**
2823 pam-fi 1.81 * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().
2824 pam-fi 1.1 * @param it Track number, ranging from 0 to GetNTracks().
2825     */
2826 pam-ts 1.96 PamTrack *PamLevel2::GetTrackImageOld(int it) {
2827 pam-fi 1.1
2828 pam-fi 1.81 // *-*-*-*-*-*-*-*-*-*-*-*-*
2829     SortTracks();
2830     // *-*-*-*-*-*-*-*-*-*-*-*-*
2831     if (!timage)
2832     return 0;
2833     if (!timage->GetEntries())
2834     return 0;
2835    
2836     PamTrack *image = 0;
2837    
2838     if (it >= 0 && it < trk2_obj->TrkLevel2::GetNTracks()) {
2839     TClonesArray &t = *(tsorted);
2840     PamTrack *temp = (PamTrack*) t[it];
2841     if (temp->GetTrkTrack()->HasImage()) {
2842     TClonesArray & t = *(timage);
2843     image = (PamTrack*) t[it];
2844     }
2845     else {
2846     // cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;
2847     };
2848     }
2849     else {
2850 pam-ts 1.96 cout << "PamLevel2::GetTrackImageOld(int) : Tracker track SeqNo " << it << " does not exist (GetNTracks() = "
2851 pam-fi 1.81 << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl;
2852     };
2853    
2854     return image;
2855 pam-fi 1.1 }
2856 pam-ts 1.95 /**
2857     * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().
2858     * @param it Track number, ranging from 0 to GetNTracks().
2859     * @param alg Algorythm, see SetTrakingAlgorythm(char *alg) for explanation.
2860     */
2861 pam-ts 1.96 PamTrack *PamLevel2::GetTrackImage(int it, const char* alg) {
2862 pam-ts 1.95
2863     TString s(alg);
2864 pam-ts 1.96 if(!s.CompareTo("") || !s.CompareTo("STD"))return GetTrackImageOld(it); //old algorythm
2865 pam-ts 1.95
2866    
2867     SortTracksNew();
2868     // >> fill tsorted, timage and text
2869    
2870     if ( ( !s.Contains("EXTF", TString::kIgnoreCase) || !EXT )){ //not forced exteded-alg requested (or exteded-data missing)
2871    
2872     if( s.Contains("NUC")){
2873     if(
2874     tsorted_nuc &&
2875     it < tsorted_nuc->GetEntries() && //enough tracks found
2876     it >= 0 && //valid index
2877     true){
2878     TClonesArray &t = *(tsorted_nuc);
2879     PamTrack *temp = (PamTrack*) t[it];
2880     if (temp->GetTrkTrack()->HasImage()) {
2881     return (PamTrack*)((*timage_nuc)[it]); //ok return the track
2882 pam-ts 1.96 }else{
2883     return NULL;
2884 pam-ts 1.95 }
2885    
2886     }
2887     }else{
2888     if(
2889     tsorted &&
2890     it < tsorted->GetEntries() && //enough tracks found
2891     it >= 0 && //valid index
2892     true ){
2893     TClonesArray &t = *(tsorted);
2894     PamTrack *temp = (PamTrack*) t[it];
2895     if (temp->GetTrkTrack()->HasImage()) {
2896     return (PamTrack*)((*timage)[it]); //ok return the track
2897 pam-ts 1.96 }else{
2898     return NULL;
2899 pam-ts 1.95 }
2900     }
2901     }
2902    
2903     }
2904 pam-ts 1.96
2905 pam-fi 1.110 // cout << "PamTrack *PamLevel2::GetTrackImage("<<it<<","<<alg<<") -- wrong track number or unrecognised algorithm"<<endl;
2906 pam-ts 1.95
2907     return NULL;
2908    
2909     }
2910     ;
2911 pam-fi 1.1
2912     //--------------------------------------
2913     //
2914     //
2915     //--------------------------------------
2916     /**
2917 pam-fi 1.2 * Get the Pamela detector trees in a single file and make them friends.
2918     * @param f TFile pointer
2919     * @param detlist String to select trees to be included
2920     * @return Pointer to a TTree
2921 pam-fi 1.1 */
2922 pam-fi 1.81 TTree *PamLevel2::GetPamTree(TFile *f, TString detlist) {
2923    
2924     if (detlist.Contains("+AUTO", TString::kIgnoreCase)) {
2925     cout << "+AUTO" << endl;
2926     GetWhichTrees(f);
2927     };
2928     SetWhichTrees(detlist);
2929    
2930     if (pam_tree) {
2931     printf("WARNING: TTree *PamLevel2::GetPamTree(TFile *fl, TString detlist) -- pam_tree already exists!\n ");
2932     return pam_tree;
2933     };
2934     //
2935 pam-fi 1.4
2936 pam-fi 1.81 cout << "TTree *PamLevel2::GetPamTree(TFile *f, TString detlist ) -- obsolte " << endl;
2937    
2938     // SetWhichTrees(detlist);
2939 pam-fi 1.52
2940 pam-fi 1.81 TTree *Trout = 0;
2941 mocchiut 1.35
2942 pam-fi 1.81 TString fname = f->GetName();
2943     if (!CheckLevel2File(fname))
2944     return NULL;
2945 pam-fi 1.20
2946 pam-fi 1.81 // UInt_t *found=0;
2947 pam-fi 1.9
2948 pam-fi 1.81 cout << "GetPamTree(TFile*,TString): detector list --> ";
2949     if (TRK1)
2950     cout << "TRK1 ";
2951     if (TRK2)
2952     cout << "TRK2 ";
2953     if (TRKh)
2954     cout << "TRKH ";
2955     if (CAL1)
2956     cout << "CAL1 ";
2957     if (CAL2)
2958     cout << "CAL2 ";
2959     if (TOF)
2960     cout << "TOF ";
2961     if (TRG)
2962     cout << "TRG ";
2963     if (AC)
2964     cout << "AC ";
2965     if (ND)
2966     cout << "ND ";
2967     if (S4)
2968     cout << "S4 ";
2969     if (ORB)
2970     cout << "ORB ";
2971     if (GP)
2972     cout << "GP ";
2973     cout << endl;
2974     if (SELLI && SELLI != 2)
2975     cout << ">>> Found selection-list <<<" << endl; //EMILIANO
2976    
2977     f->cd();
2978    
2979     // Tracker
2980     TTree *T = (TTree*) f->Get("Tracker");
2981     if (T && (TRK2 || TRK1 || TRKh)) {
2982     if (TRK2)
2983     T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
2984     // else T->SetBranchStatus("TrkLevel2",0,found);
2985     if (TRK2)
2986     cout << "Tracker : set branch address TrkLevel2" << endl;
2987     if (TRK1)
2988     T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
2989     // else T->SetBranchStatus("TrkLevel1",0,found);
2990     if (TRK1)
2991     cout << "Tracker : set branch address TrkLevel1" << endl;
2992     if (TRKh)
2993     T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
2994     // else T->SetBranchStatus("TrkHough",0,found);
2995     if (TRKh)
2996     cout << "Tracker : set branch address TrkHough" << endl;
2997     if (!Trout)
2998     Trout = T;
2999     else
3000 pam-ts 1.95 Trout->AddFriend(T);
3001 pam-fi 1.81 }
3002     else {
3003     cout << "Tracker : missing tree" << endl;
3004     };
3005     // Calorimeter
3006     TTree *C = (TTree*) f->Get("Calorimeter");
3007     if (C && (CAL2 || CAL1)) {
3008     if (CAL2)
3009     C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
3010     // else C->SetBranchStatus("CaloLevel2",0,found);
3011     if (CAL2)
3012     cout << "Calorimeter : set branch address CaloLevel2" << endl;
3013     if (CAL1)
3014     C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
3015     // else C->SetBranchStatus("CaloLevel1",0,found);
3016     if (CAL1)
3017     cout << "Calorimeter : set branch address CaloLevel1" << endl;
3018     if (!Trout)
3019     Trout = C;
3020     else
3021     Trout->AddFriend(C);
3022     }
3023     else {
3024     cout << "Calorimeter : missing tree" << endl;
3025     };
3026 pam-fi 1.9
3027 pam-fi 1.81 // ToF
3028     TTree *O = (TTree*) f->Get("ToF");
3029     if (O && TOF) {
3030     O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
3031     cout << "ToF : set branch address ToFLevel2" << endl;
3032     if (!Trout)
3033     Trout = O;
3034     else
3035     Trout->AddFriend(O);
3036     }
3037     else {
3038     cout << "ToF : missing tree" << endl;
3039     };
3040     // Trigger
3041     TTree *R = (TTree*) f->Get("Trigger");
3042     if (R && TRG) {
3043     R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
3044     cout << "Trigger : set branch address TrigLevel2" << endl;
3045     if (!Trout)
3046     Trout = R;
3047     else
3048     Trout->AddFriend(R);
3049     }
3050     else {
3051     cout << "Trigger : missing tree" << endl;
3052     };
3053     // S4
3054     TTree *S = (TTree*) f->Get("S4");
3055     if (S && S4) {
3056     S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
3057     cout << "S4 : set branch address S4Level2" << endl;
3058     if (!Trout)
3059     Trout = S;
3060     else
3061     Trout->AddFriend(S);
3062     }
3063     else {
3064     cout << "S4 : missing tree" << endl;
3065     };
3066     // Neutron Detector
3067     TTree *N = (TTree*) f->Get("NeutronD");
3068     if (N && ND) {
3069     N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
3070     cout << "NeutronD : set branch address NDLevel2" << endl;
3071     if (!Trout)
3072     Trout = N;
3073     else
3074     Trout->AddFriend(N);
3075     }
3076     else {
3077     cout << "NeutronD : missing tree" << endl;
3078     };
3079     // Anticounters
3080     TTree *A = (TTree*) f->Get("Anticounter");
3081     if (A && AC) {
3082     A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
3083     cout << "Anticounter : set branch address AcLevel2" << endl;
3084     if (!Trout)
3085     Trout = A;
3086     else
3087     Trout->AddFriend(A);
3088     }
3089     else {
3090     cout << "Anticounter : missing tree" << endl;
3091     };
3092     // Orbital Info
3093     TTree *B = (TTree*) f->Get("OrbitalInfo");
3094     if (B && ORB) {
3095     B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
3096     cout << "OrbitalInfo : set branch address OrbitalInfo" << endl;
3097     if (!Trout)
3098     Trout = B;
3099     else
3100     Trout->AddFriend(B);
3101     }
3102     else {
3103     cout << "OrbitalInfo : missing tree" << endl;
3104     };
3105 pam-fi 1.9
3106 pam-fi 1.81 // GPamela
3107     TTree *G = (TTree*) f->Get("h20");
3108     if (G && GP) {
3109     if (!gp_obj)
3110     gp_obj = new GPamela();
3111     // ------------------------------------
3112     // ATTENZIONE!!!
3113     // non so per quale arcano motivo,
3114     // per l'albero di gpamela il branch address lo devo settare
3115     // DOPO aver fatto friend
3116     // FGRRRVZZZZUTSALKJMSLKJ!!!
3117     // ------------------------------------
3118     // gp_obj->SetBranchAddress(G); //ho dovuto fare in maniera diversa dagli altri
3119     // cout << "h20 : set branch address GPamela "<<endl;
3120     if (!Trout)
3121     Trout = G;
3122     else
3123     Trout->AddFriend(G);
3124     }
3125     else {
3126     // cout << "h20 : missing tree"<<endl;
3127     };
3128 pam-fi 1.12
3129 pam-fi 1.81 TTree *L = (TTree*) f->Get("SelectionList");
3130     if (L && SELLI == 1) {
3131     cout << " TTree *PamLevel2::GetPamTree(TFile, TString) >>> SelectionList not implemented!!!!" << endl;
3132     sel_tree = 0;
3133     }
3134     else {
3135     cout << "SelectionList : missing tree" << endl;
3136     };
3137 pam-fi 1.20
3138 pam-fi 1.81 cout << endl << " Number of entries: " << Trout->GetEntries() << endl << endl;
3139 pam-fi 1.52
3140 pam-fi 1.81 // ------------------------------------
3141     // ATTENZIONE!!!
3142     // non so per quale arcano motivo,
3143     // per l'albero di gpamela il branch address lo devo settare
3144     // DOPO aver fatto friend
3145     // FGRRRVZZZZUTSALKJMSLKJ!!!
3146     // ------------------------------------
3147     if (G && GP) {
3148     gp_obj->SetBranchAddress(Trout); //ho dovuto fare in maniera diversa dagli altri
3149     cout << "h20 : set branch address GPamela " << endl;
3150     }
3151     else {
3152     cout << "h20 : missing tree" << endl;
3153     };
3154 pam-fi 1.52
3155 pam-fi 1.81 pam_tree = (TChain*) Trout;
3156 mocchiut 1.28
3157 pam-fi 1.81 return Trout;
3158 pam-fi 1.52
3159 pam-fi 1.1 }
3160 pam-fi 1.2 //--------------------------------------
3161     //
3162     //
3163     //--------------------------------------
3164     /**
3165     * Get list of Level2 files.
3166     * @param ddir Level2 data directory.
3167     * @param flisttxt Name of txt file containing file list.
3168     * @return Pointer to a TList of TSystemFiles
3169     * If no input file list is given , all the Level2 files inside the directory are processed.
3170     */
3171 pam-fi 1.81 TList* PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = "") {
3172    
3173     TString wdir = gSystem->WorkingDirectory();
3174    
3175     if (ddir != "") {
3176     cout << "Level2 data directory : " << ddir << endl;
3177     }
3178     else {
3179     cout << "Level2 data directory not given as input: trying to evaluate from list or taking working directory "
3180     << endl;
3181     };
3182     TList *contents = new TList; // create output list
3183     contents->SetOwner();
3184    
3185     // --------------------------------------
3186     // case 1 : input file/file-list provided
3187     // --------------------------------------
3188     if (flisttxt != "") {
3189    
3190 pam-fi 1.79 // --------------------------------------
3191 pam-fi 1.81 // a list of files given as input
3192 pam-fi 1.79 // --------------------------------------
3193 pam-fi 1.81 if (!flisttxt.EndsWith(".root")) {
3194    
3195     TString dir = gSystem->DirName(flisttxt);
3196     // cout << " List directory "<<dir<<endl;
3197     if (dir == "." || dir == "")
3198     flisttxt = gSystem->ConcatFileName(wdir.Data(), gSystem->BaseName(flisttxt));
3199     // flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
3200    
3201     if (!gSystem->ChangeDirectory(ddir)) {
3202     cout << "Cannot change directory : " << ddir << endl;
3203     return 0;
3204     }
3205    
3206     cout << "Input file list : " << flisttxt << endl;
3207     ifstream in;
3208     in.open(flisttxt, ios::in); //open input file list
3209     if (!in.good()) {
3210     cout << " TList* PamLevel2::GetListOfLevel2Files(TString, TString) --> ERROR opening the file " << endl;
3211     gSystem->ChangeDirectory(wdir); // back to the working directory
3212     return 0;
3213     }
3214     int line = 0;
3215     // ...........................
3216     // loop over file-list records
3217     // ...........................
3218     while (1) {
3219     TString file;
3220     in >> file;
3221     if (!in.good())
3222     break;
3223     line++;
3224     cout << "(*) " << file << endl;
3225     if (file.IsNull()) {
3226     cout << "-- list interrupted at line " << line << endl;
3227     break;
3228     }
3229     if (file.Contains("#"))
3230     file = file(0, file.First("#"));
3231     //
3232     // take only root files
3233     //
3234     if (file.EndsWith(".root")) {
3235     TString filedir;
3236     cout << ddir << endl;
3237 mocchiut 1.84 if ( ddir != "" ) {
3238 pam-fi 1.81 filedir = ddir; // take the input dir
3239     }
3240     else {
3241     gSystem->ChangeDirectory(wdir); // back to the working directory
3242     filedir = gSystem->DirName(file); // this will take the path if exist in the list otherwise it will return automatically the working dir
3243     };
3244     filedir.Append("/");
3245 mocchiut 1.84 // char *fullpath = gSystem->ConcatFileName(gSystem->DirName(filedir), gSystem->BaseName(file));
3246     char *fullpath = gSystem->ConcatFileName(filedir.Data(), gSystem->BaseName(file));
3247 pam-fi 1.81 contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));// add file to the list
3248     cout << fullpath << endl;
3249     delete fullpath;
3250     }
3251     // }else{
3252     // if(file.Data()!="")cout << "File: "<<file<<" ---> missing "<< endl;
3253     // };
3254     };
3255     in.close();
3256     // --------------------------------------
3257     // a single root file given as input
3258     // --------------------------------------
3259     }
3260     else {
3261     if (flisttxt.Contains("#"))
3262     flisttxt = flisttxt(0, flisttxt.First("#"));
3263     char *fullpath = gSystem->ConcatFileName(gSystem->DirName(flisttxt), gSystem->BaseName(flisttxt));
3264     contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));// add file to the list
3265     delete fullpath;
3266     };
3267 pam-fi 1.79 // ---------------------------------------------------------------------------------
3268     // case 2 : no input file/file-list provided --> read all files insede the directory
3269     // ---------------------------------------------------------------------------------
3270 pam-fi 1.81 }
3271     else {
3272    
3273     cout << "No input file list given." << endl;
3274     cout << "Check for existing root files." << endl;
3275     // cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;
3276     if (ddir == "") {
3277     ddir = wdir;
3278     cout << "Level2 data directory : " << ddir << endl;
3279 pam-fi 1.6 };
3280 pam-fi 1.81
3281     TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir), ddir);
3282     TList *temp = datadir->GetListOfFiles();
3283     if (!temp)
3284     return 0;
3285     // temp->Print();
3286     // cout << "*************************************" << endl;
3287    
3288     TIter next(temp);
3289     TSystemFile *questo = 0;
3290    
3291     while ((questo = (TSystemFile*) next())) {
3292     TString name = questo-> GetName();
3293     if (name.EndsWith(".root")) {
3294     // const char *fullpath = gSystem->FindFile(ddir,name);
3295     // char *fullpath;
3296     // gSystem->IsFileInIncludePath(name,&fullpath);
3297     char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir), gSystem->BaseName(name));
3298     contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));
3299     delete fullpath;
3300     };
3301     }
3302     delete temp;
3303     delete datadir;
3304    
3305     };
3306     gSystem->ChangeDirectory(wdir); // back to the working directory
3307     // cout << endl << "Selected files:" << endl;
3308     // contents->Print();
3309     cout << contents->GetEntries() << " files \n";
3310     // cout << endl;
3311     // cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl;
3312     return contents;
3313     }
3314     ;
3315 pam-fi 1.2 //--------------------------------------
3316     //
3317     //
3318     //--------------------------------------
3319     /**
3320     * Get the Pamela detector chains from a list of files and make them friends.
3321 pam-fi 1.81 * @param fl Pointer to a TList of TSystemFiles
3322 pam-fi 1.2 * @param detlist String to select trees to be included
3323     * @return Pointer to a TChain
3324     */
3325 pam-fi 1.81 TChain *PamLevel2::GetPamTree(TList *fl, TString detlist) {
3326     //
3327     //
3328     //
3329     if (pam_tree) {
3330     printf("WARNING: TChain *PamLevel2::GetPamTree(TList *fl, TString detlist) -- pam_tree already exists!\n ");
3331     return pam_tree;
3332     };
3333     //
3334 pam-fi 1.2
3335 pam-fi 1.81 TChain *Trout = 0;
3336 pam-fi 1.52
3337 pam-fi 1.81 // -------------------------------------------
3338     // set flags to include/exclude trees/branches
3339     // -------------------------------------------
3340     if (detlist.Contains("+AUTO", TString::kIgnoreCase)) {
3341     if (fl->GetEntries() > 0) {
3342     cout << "+AUTO" << endl;
3343     TFile *fprimo = new TFile(fl->At(0)->GetName());
3344     GetWhichTrees(fprimo);
3345     fprimo->Close();// AAAAARGGGGGHHHHH!!!!!!! non commentare questa riga, altrimenti si incasina il TChain
3346     fprimo->Delete();
3347     }
3348     };
3349     SetWhichTrees(detlist);
3350 pam-fi 1.52
3351 pam-fi 1.81 // -------------------------------------------
3352     // build chains
3353     // -------------------------------------------
3354     TChain *T = 0;
3355     TChain *C = 0;
3356     TChain *O = 0;
3357     TChain *R = 0;
3358     TChain *S = 0;
3359     TChain *N = 0;
3360     TChain *A = 0;
3361     TChain *B = 0;
3362     TChain *G = 0;
3363    
3364     TChain *L = 0;
3365 mocchiut 1.100 TChain *P = 0;
3366 pam-fi 1.81
3367     if (TRK2 || TRK1 || TRKh)
3368     T = new TChain("Tracker");
3369     if (CAL2 || CAL1)
3370     C = new TChain("Calorimeter");
3371     if (TOF)
3372     O = new TChain("ToF");
3373     if (TRG)
3374     R = new TChain("Trigger");
3375     if (S4)
3376     S = new TChain("S4");
3377     if (ND)
3378     N = new TChain("NeutronD");
3379     if (AC)
3380     A = new TChain("Anticounter");
3381     if (ORB)
3382     B = new TChain("OrbitalInfo");
3383     if (GP)
3384     G = new TChain("h20");
3385 mocchiut 1.100 if (PROC)
3386     P = new TChain("ProcessingInfo");
3387 pam-fi 1.81 L = new TChain("SelectionList");
3388    
3389     // loop over files and create chains
3390     TIter next(fl);
3391     TSystemFile *questo = 0;
3392     while ((questo = (TSystemFile*) next())) {
3393     TString name = questo->GetName();
3394     cout << "File: " << name << endl;
3395     if (CheckLevel2File(name)) {
3396     if (TRK2 || TRK1 || TRKh)
3397     T->Add(name);
3398     if (CAL1 || CAL2)
3399     C->Add(name);
3400     if (TOF)
3401     O->Add(name);
3402     if (TRG)
3403     R->Add(name);
3404     if (S4)
3405     S->Add(name);
3406     if (ND)
3407     N->Add(name);
3408     if (AC)
3409     A->Add(name);
3410     if (ORB)
3411     B->Add(name);
3412     if (GP)
3413     G->Add(name);
3414 mocchiut 1.100 if (P)
3415     P->Add(name);
3416 pam-fi 1.81 if (SELLI == 1)
3417     L->Add(name);
3418 pam-ts 1.95 };
3419 pam-fi 1.81 };
3420 pam-fi 1.11
3421 pam-ts 1.95 cout << "done data-tree chains "<< T->GetNtrees() <<" \n";
3422     cout << "----------------------------------------------------" << endl;
3423 pam-fi 1.56
3424 pam-fi 1.81 // -------------------------------------------
3425     // make friends
3426     // -------------------------------------------
3427    
3428     // Tracker
3429     cout << "Friends: " << endl;
3430     if (T && (TRK2 || TRK1 || TRKh)) {
3431     if (!Trout)
3432     Trout = T;
3433     else
3434     Trout->AddFriend("Tracker");
3435     // cout << "+Tacker"<<endl;
3436     };
3437     // Calorimeter
3438     if (C && (CAL2 || CAL1)) {
3439     if (!Trout)
3440     Trout = C;
3441     else
3442     Trout->AddFriend("Calorimeter");
3443     // cout << "+Calorimeter"<<endl;
3444     };
3445     // ToF
3446     if (O && TOF) {
3447     if (!Trout)
3448     Trout = O;
3449     else
3450     Trout->AddFriend("ToF");
3451     // cout << "+ToF"<<endl;
3452     };
3453     // Trigger
3454     if (R && TRG) {
3455     if (!Trout)
3456     Trout = O;
3457     else
3458     Trout->AddFriend("Trigger");
3459     // cout << "+Trigger"<<endl;
3460     };
3461     // S4
3462     if (S && S4) {
3463     if (!Trout)
3464     Trout = O;
3465     else
3466     Trout->AddFriend("S4");
3467     // cout << "+S4"<<endl;
3468     };
3469     // Neutron Detector
3470     if (N && ND) {
3471     if (!Trout)
3472     Trout = O;
3473     else
3474     Trout->AddFriend("NeutronD");
3475     // cout << "+NeutronD"<<endl;
3476     };
3477     // Anticounters
3478     if (A && AC) {
3479     if (!Trout)
3480     Trout = O;
3481     else
3482     Trout->AddFriend("Anticounter");
3483     // cout << "+Anticounter"<<endl;
3484     };
3485     // Orbital Info
3486     if (B && ORB) {
3487     if (!Trout)
3488     Trout = O;
3489     else
3490     Trout->AddFriend("OrbitalInfo");
3491     // cout << "+OrbitalInfo"<<endl;
3492     };
3493     // GPamela
3494     if (G && GP) {
3495     if (!Trout)
3496     Trout = G;
3497     else
3498     Trout->AddFriend("h20");
3499     // cout << "+h20"<<endl;
3500     };
3501 pam-fi 1.52
3502 pam-fi 1.81 // =====================================
3503     // SET BRANCH-ADDRESS AFTER CHAIN+FRIEND
3504     // =====================================
3505 pam-ts 1.95 if( Trout->GetNtrees() )SetBranchAddress(Trout);
3506 pam-fi 1.81
3507     // ------------------------------------
3508     // finally handle selection trees...
3509     // (it is not friend of pamela tree)
3510     // ------------------------------------
3511    
3512 pam-ts 1.95 cout << "----------------------------------------------------" << endl;
3513 pam-fi 1.81
3514     // Selection List
3515     if (L && SELLI == 1) {
3516     cout << ">>> Found selection-list <<<" << endl;
3517     // L->SetBranchAddress("RunEntry",&irun);
3518     L->SetBranchAddress("RunEntry", &irunt);//NEWNEW
3519     cout << "SelectionList: set branch address RunEntry" << endl;
3520     L->SetBranchAddress("EventEntry", &irunentry);
3521     cout << "SelectionList: set branch address EventEntry" << endl;
3522 mocchiut 1.91 /* if ( L->GetBranch("L0EventEntry") ){
3523 mocchiut 1.90 hasL0EE = true;
3524     L->SetBranchAddress("L0EventEntry", &il0entry);
3525     cout << "SelectionList: set branch address L0EventEntry" << endl;
3526     } else {
3527     hasL0EE = false; // backward compatibility with old preselected files...
3528 mocchiut 1.91 }*/
3529 pam-fi 1.81 sel_tree = L;
3530     // if(!Trout)Trout=O;
3531     // else Trout->AddFriend("SelectionList");
3532     cout << "+SelectionList" << endl;
3533 pam-ts 1.95 cout << "----------------------------------------------------" << endl;
3534 pam-fi 1.81 }
3535     else {
3536     // cout << "SelectionList : missing tree"<<endl;
3537     if (L)
3538     L->Delete();
3539     };
3540 pam-fi 1.52
3541 mocchiut 1.100 //ProcessingInfo EM
3542     if ( P && P->GetEntries() ){
3543     cout << "----------------------------------------------------" << endl;
3544     cout << ">>> Found ProcessingInfo <<<" << endl;
3545     // L->SetBranchAddress("RunEntry",&irun);
3546     P->SetBranchAddress("ProcInfo", &proc_obj);//NEWNEW
3547 mocchiut 1.102 proc_tree = P;
3548 mocchiut 1.109 } else {
3549     // proc_tree = new TChain("ProcessingInfo","Log of data processing");
3550     // proc_tree->Branch("ProcInfo", "ProcInfo", &proc_obj);
3551     cout << "----------------------------------------------------" << endl;
3552     cout << ">>> ProcessingInfo not found, PROC set to false and continue (not 10RED files?)<<<" << endl;
3553     PROC = false;
3554 mocchiut 1.100 }
3555 pam-fi 1.81 // --------------------------------------------
3556     // return the pamela chain with all the friends
3557     // --------------------------------------------
3558 pam-fi 1.8
3559 pam-fi 1.81 pam_tree = Trout;
3560     return Trout;
3561     }
3562 pam-fi 1.8
3563 pam-fi 1.4 //--------------------------------------
3564     //
3565     //
3566     //--------------------------------------
3567     /**
3568     * Set branch addresses for Pamela friend trees
3569     */
3570 pam-fi 1.81 void PamLevel2::SetBranchAddress(TTree *t) {
3571    
3572 pam-ts 1.95 // TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2");
3573     // TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1");
3574     // TRKh = TRKh & t->GetBranchStatus("TrkHough");
3575     // CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2");
3576     // CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1");
3577     // TOF = TOF & t->GetBranchStatus("ToFLevel2");
3578     // TRG = TRG & t->GetBranchStatus("TrigLevel2");
3579     // S4 = S4 & t->GetBranchStatus("S4Level2");
3580     // ND = ND & t->GetBranchStatus("NDLevel2");
3581     // AC = AC & t->GetBranchStatus("AcLevel2");
3582     // ORB = ORB & t->GetBranchStatus("OrbitalInfo");
3583     // GP = GP & t->GetBranchStatus("h20");
3584    
3585 pam-fi 1.81
3586     // Tracker
3587     if (TRK1) {
3588     t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel2"));
3589     cout << "Tracker : set branch address TrkLevel1" << endl;
3590     };
3591     if (TRK2) {
3592     t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel1"));
3593     cout << "Tracker : set branch address TrkLevel2" << endl;
3594 pam-ts 1.95 NUC = t->GetBranchStatus("TrackNuclei");
3595     EXT = t->GetBranchStatus("RecoveredTrack") && (NUC ? t->GetBranchStatus("RecoveredTrackNuclei"): true );
3596 pam-fi 1.81 };
3597     if (TRKh) {
3598     t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
3599     cout << "Tracker : set branch address TrkHough" << endl;
3600     };
3601    
3602     // Calorimeter
3603     if (CAL1) {
3604     t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
3605     cout << "Calorimeter : set branch address CaloLevel1" << endl;
3606     };
3607     if (CAL2) {
3608     t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
3609     cout << "Calorimeter : set branch address CaloLevel2" << endl;
3610     };
3611 pam-fi 1.8
3612 pam-fi 1.81 // ToF
3613     if (TOF) {
3614     t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
3615     cout << "ToF : set branch address ToFLevel2" << endl;
3616     };
3617     // Trigger
3618     if (TRG) {
3619     t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
3620     cout << "Trigger : set branch address TrigLevel2" << endl;
3621     };
3622     // S4
3623     if (S4) {
3624     t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
3625     cout << "S4 : set branch address S4Level2" << endl;
3626     };
3627     // Neutron Detector
3628     if (ND) {
3629     t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
3630     cout << "NeutronD : set branch address NDLevel2" << endl;
3631     };
3632     // Anticounters
3633     if (AC) {
3634     t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
3635     cout << "Anticounter : set branch address AcLevel2" << endl;
3636     };
3637     // OrbitalInfo
3638     if (ORB) {
3639     t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
3640     cout << "OrbitalInfo : set branch address OrbitalInfo" << endl;
3641     };
3642     // GPamela
3643     if (GP) {
3644     // GetPointerTo("GPamela");
3645     if (!gp_obj)
3646     gp_obj = new GPamela();
3647     // gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
3648     // // t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
3649     if (SELLI)
3650     t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
3651     else
3652     gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
3653    
3654     cout << "h20 : set branch address GPamela " << endl;
3655     };
3656 pam-ts 1.95 if(NUC){
3657    
3658     cout << "Found nuclei-track branches" << endl;
3659    
3660     if( !trk_nuc_obj )trk_nuc_obj = new TClonesArray("TrkTrack");
3661     if( !calo_nuc_obj)calo_nuc_obj= new TClonesArray("CaloTrkVar");
3662     if( !tof_nuc_obj)tof_nuc_obj= new TClonesArray("ToFTrkVar");
3663     if( !orb_nuc_obj)orb_nuc_obj= new TClonesArray("OrbitalInfoTrkVar");
3664     if (TRK2)t-> SetBranchAddress("TrackNuclei",&trk_nuc_obj);
3665     if (CAL2)t->GetFriend("Calorimeter")->SetBranchAddress("TrackNuclei",&calo_nuc_obj);
3666     if (TOF )t->GetFriend("ToF")-> SetBranchAddress("TrackNuclei",&tof_nuc_obj);
3667     if (ORB )t->GetFriend("OrbitalInfo")->SetBranchAddress("TrackNuclei",&orb_nuc_obj);
3668    
3669     ///copy the vector content inside a "fake" object (all aother info are missing)
3670    
3671     if( !trk2_nuc_obj )trk2_nuc_obj = new TrkLevel2();
3672     if( !calo2_nuc_obj )calo2_nuc_obj = new CaloLevel2();
3673     if( !tof2_nuc_obj )tof2_nuc_obj = new ToFLevel2();
3674     if( !orb2_nuc_obj )orb2_nuc_obj = new OrbitalInfo();
3675     // *(trk2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*trk_nuc_obj);
3676     // *(calo2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*calo_nuc_obj);
3677     // *(tof2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*tof_nuc_obj);
3678     // *(orb2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*orb_nuc_obj);
3679    
3680     trk2_nuc_obj->SetTrackArray( trk_nuc_obj );
3681     calo2_nuc_obj->SetTrackArray( calo_nuc_obj );
3682     tof2_nuc_obj->SetTrackArray( tof_nuc_obj );
3683     orb2_nuc_obj->SetTrackArray( orb_nuc_obj );
3684    
3685    
3686     }
3687 pam-fi 1.61
3688 pam-ts 1.95 if(EXT){
3689    
3690     cout << "Found extended tracking algorythm branches" << endl;
3691    
3692     if( !trk_ext_obj )trk_ext_obj = new TClonesArray("ExtTrack");
3693     if( !calo_ext_obj)calo_ext_obj= new TClonesArray("CaloTrkVar");
3694     if( !tof_ext_obj)tof_ext_obj= new TClonesArray("ToFTrkVar");
3695     if( !orb_ext_obj)orb_ext_obj= new TClonesArray("OrbitalInfoTrkVar");
3696    
3697     if (TRK2)t-> SetBranchAddress("RecoveredTrack",&trk_ext_obj);
3698     if (CAL2)t->GetFriend("Calorimeter")->SetBranchAddress("RecoveredTrack",&calo_ext_obj);
3699     if (TOF )t->GetFriend("ToF")-> SetBranchAddress("RecoveredTrack",&tof_ext_obj);
3700     if (ORB )t->GetFriend("OrbitalInfo")->SetBranchAddress("RecoveredTrack",&orb_ext_obj);
3701    
3702    
3703     if(NUC){
3704     if( !trk_ext_nuc_obj )trk_ext_nuc_obj = new TClonesArray("ExtTrack");
3705     if( !calo_ext_nuc_obj)calo_ext_nuc_obj= new TClonesArray("CaloTrkVar");
3706     if( !tof_ext_nuc_obj)tof_ext_nuc_obj= new TClonesArray("ToFTrkVar");
3707     if( !orb_ext_nuc_obj)orb_ext_nuc_obj= new TClonesArray("OrbitalInfoTrkVar");
3708     if (TRK2)t-> SetBranchAddress("RecoveredTrackNuclei",&trk_ext_nuc_obj);
3709     if (CAL2)t->GetFriend("Calorimeter")->SetBranchAddress("RecoveredTrackNuclei",&calo_ext_nuc_obj);
3710     if (TOF )t->GetFriend("ToF")-> SetBranchAddress("RecoveredTrackNuclei",&tof_ext_nuc_obj);
3711     if (ORB )t->GetFriend("OrbitalInfo")->SetBranchAddress("RecoveredTrackNuclei",&orb_ext_nuc_obj);
3712     }
3713     }
3714 pam-fi 1.4 }
3715 pam-fi 1.8 /**
3716     * Set branch addresses for Pamela friend trees
3717     */
3718 pam-fi 1.81 void PamLevel2::SetBranchAddress(TChain *t) {
3719    
3720     // TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2");
3721     // TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1");
3722     // TRKh = TRKh & t->GetBranchStatus("TrkHough");
3723     // CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1");
3724     // CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2");
3725     // TOF = TOF & t->GetBranchStatus("ToFLevel2");
3726     // TRG = TRG & t->GetBranchStatus("TrigLevel2");
3727     // S4 = S4 & t->GetBranchStatus("S4Level2");
3728     // ND = ND & t->GetBranchStatus("NDLevel2");
3729     // AC = AC & t->GetBranchStatus("AcLevel2");
3730     // ORB = ORB & t->GetBranchStatus("OrbitalInfo");
3731     // GP = GP & t->GetBranchStatus("h20");
3732    
3733     // Tracker
3734     if (TRK2) {
3735     t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
3736     cout << "Tracker : set branch address TrkLevel2" << endl;
3737 pam-ts 1.95 NUC = t->GetBranchStatus("TrackNuclei");
3738     EXT = t->GetBranchStatus("RecoveredTrack") && (NUC ? t->GetBranchStatus("RecoveredTrackNuclei"): true );
3739 pam-fi 1.81 };
3740     if (TRK1) {
3741     t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
3742     cout << "Tracker : set branch address TrkLevel1" << endl;
3743     };
3744     if (TRKh) {
3745     t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
3746     cout << "Tracker : set branch address TrkHough" << endl;
3747     };
3748    
3749     // Calorimeter
3750     if (CAL2) {
3751     t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
3752 pam-ts 1.95 cout << "Calorimeter : set branch address CaloLevel2" << endl;
3753 pam-fi 1.81 };
3754     if (CAL1) {
3755     t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
3756     cout << "Calorimeter : set branch address CaloLevel1" << endl;
3757     };
3758    
3759     // ToF
3760     if (TOF) {
3761     t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
3762     cout << "ToF : set branch address ToFLevel2" << endl;
3763     };
3764     // Trigger
3765     if (TRG) {
3766     t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
3767     cout << "Trigger : set branch address TrigLevel2" << endl;
3768     };
3769     // S4
3770     if (S4) {
3771     t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
3772     cout << "S4 : set branch address S4Level2" << endl;
3773     };
3774     // Neutron Detector
3775     if (ND) {
3776     t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
3777     cout << "NeutronD : set branch address NDLevel2" << endl;
3778     };
3779     // Anticounters
3780     if (AC) {
3781     t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
3782     cout << "Anticounter : set branch address AcLevel2" << endl;
3783     };
3784     // OrbitalInfo
3785     if (ORB) {
3786     t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
3787     cout << "OrbitalInfo : set branch address OrbitalInfo" << endl;
3788     };
3789     // GPamela
3790     // cout <<"GP "<<GP<<endl;
3791     if (GP) {
3792     // GetPointerTo("GPamela");
3793     if (!gp_obj)
3794     gp_obj = new GPamela();
3795     if (SELLI)
3796     t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
3797     else
3798     gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
3799     // gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
3800     cout << "h20 : set branch address GPamela " << endl;
3801     };
3802     // SelectionList
3803     // if(SELLI==1){
3804     // t->SetBranchAddress("RunEntry",&irunt);//NEWNEW
3805     // cout << "SelectionList: set branch address RunEntry"<<endl;
3806     // t->SetBranchAddress("EventEntry",&irunentry);
3807     // cout << "SelectionList: set branch address EventEntry"<<endl;
3808 pam-fi 1.4
3809 pam-fi 1.81 // }
3810 pam-ts 1.95 if(NUC){
3811    
3812     cout << "Found nuclei-track branches" << endl;
3813    
3814     if( !trk_nuc_obj )trk_nuc_obj = new TClonesArray("TrkTrack");
3815     if( !calo_nuc_obj)calo_nuc_obj= new TClonesArray("CaloTrkVar");
3816     if( !tof_nuc_obj)tof_nuc_obj= new TClonesArray("ToFTrkVar");
3817     if( !orb_nuc_obj)orb_nuc_obj= new TClonesArray("OrbitalInfoTrkVar");
3818     if (TRK2)t-> SetBranchAddress("TrackNuclei",&trk_nuc_obj);
3819     if (CAL2)t->GetFriend("Calorimeter")->SetBranchAddress("TrackNuclei",&calo_nuc_obj);
3820     if (TOF )t->GetFriend("ToF")-> SetBranchAddress("TrackNuclei",&tof_nuc_obj);
3821     if (ORB )t->GetFriend("OrbitalInfo")->SetBranchAddress("TrackNuclei",&orb_nuc_obj);
3822    
3823     ///copy the vector content inside a "fake" object (all aother info are missing)
3824    
3825     if( !trk2_nuc_obj )trk2_nuc_obj = new TrkLevel2();
3826     if( !calo2_nuc_obj )calo2_nuc_obj = new CaloLevel2();
3827     if( !tof2_nuc_obj )tof2_nuc_obj = new ToFLevel2();
3828     if( !orb2_nuc_obj )orb2_nuc_obj = new OrbitalInfo();
3829    
3830     // *(trk2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*trk_nuc_obj);
3831     // *(calo2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*calo_nuc_obj);
3832     // *(tof2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*tof_nuc_obj);
3833     // *(orb2_nuc_obj->GetPointerToTrackArray()) = new TClonesArray(*orb_nuc_obj);
3834     trk2_nuc_obj->SetTrackArray( trk_nuc_obj );
3835     calo2_nuc_obj->SetTrackArray( calo_nuc_obj );
3836     tof2_nuc_obj->SetTrackArray( tof_nuc_obj );
3837     orb2_nuc_obj->SetTrackArray( orb_nuc_obj );
3838    
3839     }
3840     if(EXT){
3841    
3842     cout << "Found extended tracking algorythm branches" << endl;
3843    
3844     t->SetBranchAddress("extAlgFlag",&extAlgFlag);
3845 pam-fi 1.56
3846 pam-ts 1.95 if( !trk_ext_obj )trk_ext_obj = new TClonesArray("ExtTrack");
3847     if( !calo_ext_obj)calo_ext_obj= new TClonesArray("CaloTrkVar");
3848     if( !tof_ext_obj)tof_ext_obj= new TClonesArray("ToFTrkVar");
3849     if( !orb_ext_obj)orb_ext_obj= new TClonesArray("OrbitalInfoTrkVar");
3850    
3851     if (TRK2)t-> SetBranchAddress("RecoveredTrack",&trk_ext_obj);
3852     if (CAL2)t->GetFriend("Calorimeter")->SetBranchAddress("RecoveredTrack",&calo_ext_obj);
3853     if (TOF )t->GetFriend("ToF")-> SetBranchAddress("RecoveredTrack",&tof_ext_obj);
3854     if (ORB )t->GetFriend("OrbitalInfo")->SetBranchAddress("RecoveredTrack",&orb_ext_obj);
3855    
3856     if(NUC){
3857     if( !trk_ext_nuc_obj )trk_ext_nuc_obj = new TClonesArray("ExtTrack");
3858     if( !calo_ext_nuc_obj)calo_ext_nuc_obj= new TClonesArray("CaloTrkVar");
3859     if( !tof_ext_nuc_obj)tof_ext_nuc_obj= new TClonesArray("ToFTrkVar");
3860     if( !orb_ext_nuc_obj)orb_ext_nuc_obj= new TClonesArray("OrbitalInfoTrkVar");
3861     if (TRK2)t-> SetBranchAddress("RecoveredTrackNuclei",&trk_ext_nuc_obj);
3862     if (CAL2)t->GetFriend("Calorimeter")->SetBranchAddress("RecoveredTrackNuclei",&calo_ext_nuc_obj);
3863     if (TOF )t->GetFriend("ToF")-> SetBranchAddress("RecoveredTrackNuclei",&tof_ext_nuc_obj);
3864     if (ORB )t->GetFriend("OrbitalInfo")->SetBranchAddress("RecoveredTrackNuclei",&orb_ext_nuc_obj);
3865     }
3866     }
3867    
3868 pam-fi 1.8 }
3869 pam-fi 1.9
3870 pam-ts 1.95 /**
3871     * Set the tracking algorythm
3872     * @param alg String to choose the track.
3873     * "" --> take the output of the standard tracking algorythm
3874     * "STD" --> take the output of the standard tracking algorythm
3875     * "NUC" --> take the output of the standard tracking algorythm for nuclei cluster selection
3876     * "EXT" --> in case the standard tracking algorythm has not found any track, take the output of the extended one
3877     * "EXTF" --> force the extended tracking algorythm
3878     * "NUCEXT" --> as "EXT", but for nuclei
3879     * "NUCEXTF" --> as "EXTF", but for nuclei
3880     */
3881 pam-ts 1.96 // void PamLevel2::SetTrackingAlgorythm(const char *alg){
3882 pam-ts 1.95
3883    
3884 pam-ts 1.96 // TString s(alg);
3885     // if(s.Contains("NUC", TString::kIgnoreCase) && !NUC)
3886     // cout << "Warning! NUC algorythm requested, but branches are missing"<<endl;
3887     // if(s.Contains("EXT", TString::kIgnoreCase) && !EXT)
3888     // cout << "Warning! EXT algorythm requested, but branches are missing"<<endl;;
3889 pam-ts 1.95
3890 pam-ts 1.96 // trkAlg = alg;
3891 pam-ts 1.95
3892 pam-ts 1.96 // };
3893     // const char* PamLevel2::GetTrackingAlgorythm(){
3894 pam-ts 1.95
3895    
3896 pam-ts 1.96 // cout<<endl<<" Implemented tracking algorythm: ";
3897     // cout<<endl<<" \"\" or \"STD\" --> take the output of the standard tracking algorythm";
3898     // cout<<endl<<" \"NUC\" --> take the output of the standard tracking algorythm for nuclei cluster selection";
3899     // cout<<endl<<" \"EXT\" --> in case the standard tracking algorythm has not found any track,";
3900     // cout<<endl<<" take the output of the extended one";
3901     // cout<<endl<<" \"EXTF\" --> force the extended tracking algorythm";
3902     // cout<<endl<<" \"NUCEXT\" --> as \"EXT\", but for nuclei ";
3903     // cout<<endl<<" \"NUCEXTF\" --> as \"EXTF\", but for nuclei";
3904    
3905     // cout<<endl;
3906     // cout<<" <<Currently set algorythm>> "<<trkAlg<<endl;
3907     // cout<<endl;
3908 pam-ts 1.95
3909 pam-ts 1.96 // return trkAlg;
3910     // };
3911 pam-ts 1.95
3912    
3913    
3914 pam-fi 1.4 //--------------------------------------
3915     //
3916     //
3917     //--------------------------------------
3918     /**
3919     * Get the Run tree chain from a list of files.
3920 pam-fi 1.81 * @param fl Pointer to a TList of TSystemFiles
3921 pam-fi 1.4 * @return Pointer to a TChain
3922     */
3923 pam-fi 1.81 TChain *PamLevel2::GetRunTree(TList *fl) {
3924     //
3925     //
3926     //
3927     if (run_tree) {
3928     printf("WARNING: TChain *PamLevel2::GetRunTree(TList *fl) -- run_tree already exists!\n ");
3929     return run_tree;
3930     };
3931     //
3932    
3933    
3934     TChain *R = new TChain("Run");
3935 pam-fi 1.60
3936 pam-fi 1.81 // loop over files and create chains
3937     TIter next(fl);
3938     TSystemFile *questo = 0;
3939     while ((questo = (TSystemFile*) next())) {
3940     TString name = questo->GetName();
3941     // cout << "File: "<< name << endl;
3942     if (CheckLevel2File(name)) {
3943     R->Add(name);
3944     };
3945     }
3946    
3947 pam-ts 1.95 cout << "done run chain "<< R->GetNtrees() <<" \n";
3948    
3949    
3950 pam-fi 1.81 if (RUN && R->GetNtrees()) {
3951    
3952     R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
3953     cout << "Run : set branch address RunInfo" << endl;
3954     R->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano
3955     cout << "Software : set branch address SoftInfo" << endl; // Emiliano
3956    
3957     irunoffset = new int[R->GetNtrees()];
3958     if (DBG) {
3959     cout << "----------------------------------------------------" << endl;
3960     cout << "irun\t | ";
3961     cout << "tree\t |";
3962     // cout << "offset\t |";
3963     cout << "RUN\t";
3964     cout << "FRAG\t";
3965     cout << "NEVENTS\t";
3966     cout << "absolute time\t\t\t";
3967     cout << "on-board time";
3968     cout << endl;
3969     }
3970     for (Int_t ii = 0; ii < R->GetEntries(); ii++) {
3971     R->GetEntry(ii);
3972     if (DBG) {
3973     cout << ii << "\t | ";
3974     cout << R->GetTreeNumber() << "\t |";
3975     // cout << R->GetChainOffset()<< "\t |";
3976     cout << GetRunInfo()->ID << "\t";
3977     cout << GetRunInfo()->ID_RUN_FRAG << "\t";
3978     cout << GetRunInfo()->NEVENTS << "\t";
3979     cout << GetRunInfo()->RUNHEADER_TIME << " <---> " << GetRunInfo()->RUNTRAILER_TIME << "\t";
3980     cout << GetRunInfo()->RUNHEADER_OBT << " <---> " << GetRunInfo()->RUNTRAILER_OBT << "\t";
3981     cout << endl;
3982     }
3983     irunoffset[R->GetTreeNumber()] = R->GetChainOffset();
3984     }
3985     cout << "N.run = " << R->GetEntries() << endl;
3986     cout << "----------------------------------------------------" << endl;
3987    
3988     }
3989 pam-ts 1.95 // else {
3990     // delete R;
3991     // R = 0;
3992     // }
3993 pam-fi 1.60
3994 pam-fi 1.81 run_tree = R;
3995 pam-fi 1.20
3996 pam-fi 1.81 return R;
3997 pam-fi 1.20
3998 pam-fi 1.4 }
3999     //--------------------------------------
4000     //
4001     //
4002     //--------------------------------------
4003     /**
4004     * Get the Run tree from a file.
4005 pam-fi 1.81 * @param f Pointer to a TFile
4006 pam-fi 1.4 * @return Pointer to a TTree
4007     */
4008 pam-fi 1.81 TTree *PamLevel2::GetRunTree(TFile *f) {
4009     if (run_tree) {
4010     printf("WARNING: TTree *PamLevel2::GetRunTree(TFile *f) -- run_tree already exists!\n ");
4011     return run_tree;
4012     };
4013    
4014     cout << "TTree *PamLevel2::GetRunTree(TFile *f) -- obsolte " << endl;
4015    
4016     TTree *T = (TTree*) f->Get("Run");
4017 pam-fi 1.4
4018 pam-fi 1.81 if (T) {
4019     T->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
4020     cout << "Run : set branch address RunInfo" << endl;
4021     T->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano
4022     cout << "Software : set branch address SoftInfo" << endl; // Emiliano
4023 pam-fi 1.4
4024 pam-fi 1.81 }
4025 pam-fi 1.56
4026 pam-fi 1.81 run_tree = (TChain*) T;
4027 mocchiut 1.28
4028 pam-fi 1.81 return T;
4029 mocchiut 1.28
4030 pam-fi 1.2 }
4031 mocchiut 1.89
4032 mocchiut 1.90 Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) {
4033 pam-fi 1.36
4034 mocchiut 1.90 if (DBG) printf("PamLevel2::UpdateRunInfo(Long64_t) - inside\n");
4035 pam-fi 1.36
4036 pam-fi 1.81 if (!run_tree) {
4037     cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree not loaded" << endl;
4038     return false;
4039     }
4040     if (run_tree->GetEntries() <= 0) {
4041     cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree is empty" << endl;
4042     return (false);
4043     }
4044    
4045 mocchiut 1.89
4046     Int_t oldrun = irun; // store current run index
4047    
4048     // -----------------------------------------------------------------------
4049     // the first time the routine is called, set run search from the beginning
4050     // -----------------------------------------------------------------------
4051    
4052     if (irun < 0) {
4053     irun = 0LL;
4054     irunt = 0LL;
4055     totrunentry = 0LL;
4056     totrunentrymin = 0LL;
4057     totrunentrymax = 0LL;
4058 mocchiut 1.90 irunentry = 0LL;
4059     il0entry = 0LL;
4060 mocchiut 1.89 prevshift = 0;
4061 mocchiut 1.90 yprevshift = 0;
4062 mocchiut 1.89 prevabstime = 0;
4063     prevpktnum = 0;
4064     abstime = 0ULL;
4065     pktnum = 0;
4066     isFragment = false;
4067     run_tree->GetEntry(irun);
4068     if (!GetOrbitalInfo())
4069     cout << "** WARNING ** missing OrbitalInfo ---> run info might be not correctly updated " << endl;
4070 mocchiut 1.94 if ( fUseDBinRunInfo ){
4071     if (gltsync)
4072     delete gltsync; //Emiliano
4073     if (!dbc || (dbc && !dbc->IsConnected()))
4074     SetDBConnection(); //Emiliano
4075     gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0, "ID", dbc, false); //Emiliano // the "false" means not to use level0 file (not necessary here)
4076     if (dbc){
4077     dbc->Close();// Emiliano
4078     delete dbc;
4079     dbc=0;
4080     }
4081     }
4082     }
4083 mocchiut 1.89 // ---------------------------------------------------------------
4084     // retrieve OBT and absolute time of the event
4085     // ---------------------------------------------------------------
4086     Long64_t obt = 0LL; // Emiliano, Long64_t GL_TIMESYNC::DBobt(UInt_t obt) since depending on the situation OBT is lowered or boosted
4087     prevabstime = abstime;
4088     prevpktnum = pktnum;
4089     if (GetOrbitalInfo()) {
4090     abstime = GetOrbitalInfo()->absTime;
4091 mocchiut 1.94 if ( fUseDBinRunInfo ) obt = gltsync->DBobt(GetOrbitalInfo()->OBT); // Emiliano
4092 mocchiut 1.89 pktnum = GetOrbitalInfo()->pkt_num; // Emiliano
4093     }
4094     else {
4095     abstime = GetRunInfo()->RUNHEADER_TIME;
4096 mocchiut 1.94 if ( fUseDBinRunInfo ) obt = gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT); // Emiliano
4097 mocchiut 1.89 pktnum = GetRunInfo()->RUNHEADER_PKT; // Emiliano
4098     }
4099    
4100     if (DBG){
4101     printf("0abstime %lld %lld pktnum %d %d obt %lld \n",abstime,prevabstime,pktnum,prevpktnum,obt);
4102     printf("0 rth %d %d nevents %d \n",GetRunInfo()->RUNHEADER_TIME,GetRunInfo()->RUNTRAILER_TIME,GetRunInfo()->NEVENTS);
4103     printf("0 rto %d %d \n",GetRunInfo()->RUNHEADER_OBT,GetRunInfo()->RUNTRAILER_OBT);
4104 mocchiut 1.94 if ( fUseDBinRunInfo ) printf("0 rto2 %lld %lld \n",gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT),gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT));
4105 mocchiut 1.90 printf("0 bo irunentry %lld prevshift %lld irun %lld \n",irunentry,prevshift,irun);
4106 mocchiut 1.89 printf("0 min %lld iev %lld max %lld tot %lld \n",totrunentrymin,iev,totrunentrymax,totrunentry);
4107     }
4108    
4109     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
4110     // if it is a full file (not preselected)
4111     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
4112     if (SELLI == 0 || SELLI == 2) { // Emiliano
4113    
4114     // ---------------------------------------------------------------
4115     // increment dead and live-time counters
4116     // (only when reading a file not preselected)
4117     // ---------------------------------------------------------------
4118     if (SELLI == 0) {
4119     if (GetTrigLevel2()) {
4120     totdltime[0] += GetTrigLevel2()->dltime[0];
4121     totdltime[1] += GetTrigLevel2()->dltime[1];
4122     }
4123     totdltime[2]++;
4124     }
4125    
4126     //
4127 mocchiut 1.94 bool a = true;
4128     bool b = true;
4129     if ( fUseDBinRunInfo ){
4130     a = false;
4131     b = false;
4132     if ( obt < gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) ) a = true;
4133     if ( obt > gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT) ) b = true;
4134     }
4135 mocchiut 1.89 if ( iev < totrunentrymin || iev > totrunentrymax // entry is outside run limits
4136     || iev == 0 // or it is the first entry
4137 mocchiut 1.90 || (!isSync && (
4138 mocchiut 1.94 (abstime <= GetRunInfo()->RUNHEADER_TIME && a ) // or it is outside obt limits (and abstime limits for security reasons)
4139     || (abstime >= GetRunInfo()->RUNTRAILER_TIME && b ) ))// or it is outside obt limits (and abstime limits for security reasons)
4140 mocchiut 1.90 ){ // check on abstime and obt needed to handle nested+DV_skipped packets
4141 mocchiut 1.89
4142     // check for a new run (ma prima il primo!)
4143     if (DBG){
4144     printf("1abstime %lld %lld pktnum %d %d obt %lld \n",abstime,prevabstime,pktnum,prevpktnum,obt);
4145     printf("1 rth %d %d nevents %d \n",GetRunInfo()->RUNHEADER_TIME,GetRunInfo()->RUNTRAILER_TIME,GetRunInfo()->NEVENTS);
4146     printf("1 rto %d %d \n",GetRunInfo()->RUNHEADER_OBT,GetRunInfo()->RUNTRAILER_OBT);
4147 mocchiut 1.94 if ( fUseDBinRunInfo ) printf("1 rto2 %lld %lld \n",gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT),gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT));
4148 mocchiut 1.90 printf("1 bo irunentry %lld prevshift %lld irun %lld \n",irunentry,prevshift,irun);
4149 mocchiut 1.89 printf("1 min %lld iev %lld max %lld tot %lld \n",totrunentrymin,iev,totrunentrymax,totrunentry);
4150     }
4151 mocchiut 1.90 // printf("1abstime %lld %lld pktnum %d %d obt %lld \n",abstime,prevabstime,pktnum,prevpktnum,obt);
4152     // printf("1 rth %d %d nevents %d \n",GetRunInfo()->RUNHEADER_TIME,GetRunInfo()->RUNTRAILER_TIME,GetRunInfo()->NEVENTS);
4153     // printf("1 rto %d %d \n",GetRunInfo()->RUNHEADER_OBT,GetRunInfo()->RUNTRAILER_OBT);
4154     // printf("1 rto2 %lld %lld \n",gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT),gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT));
4155     // printf("1 bo irunentry %lld prevshift %lld irun %lld \n",irunentry,prevshift,irun);
4156     // printf("1 min %lld iev %lld max %lld tot %lld \n",totrunentrymin,iev,totrunentrymax,totrunentry);//TOGLITOGLI
4157 mocchiut 1.89
4158     totrunentry = 0LL;
4159 mocchiut 1.90 runfirstentry = 0LL;
4160 mocchiut 1.89 for (Int_t r=0; r< run_tree->GetEntries();r++){
4161     // -------------------------------------------------------------------
4162     // save the index of the first entry of the run, relative to pam_tree,
4163     // and read a new run
4164     // -------------------------------------------------------------------
4165     run_tree->GetEntry(r);//update runinfo
4166     if ( r > 0 ){
4167     totrunentrymin = totrunentrymax+1;
4168     } else {
4169     totrunentrymin = 0LL;
4170     }
4171     totrunentry += GetRunInfo()->NEVENTS;
4172 mocchiut 1.90 totrunentrymax = totrunentry - 1 - prevshift; // prevshift is needed to handle nested+DV_skipped packets
4173 mocchiut 1.89 irun = r;
4174 mocchiut 1.94 if ( fUseDBinRunInfo ){
4175     a = false;
4176     b = false;
4177     if ( obt < gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) ) a = true;
4178     if ( obt > gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT) ) b = true;
4179     }
4180 mocchiut 1.90 if ( (iev >= totrunentrymin && iev <= totrunentrymax) || // entry is inside run limits
4181     ( !isSync &&
4182 mocchiut 1.94 ( abstime >= GetRunInfo()->RUNHEADER_TIME && a // or it is inside obt limits (and abstime limits for security reasons)
4183     && abstime <= GetRunInfo()->RUNTRAILER_TIME && b)) // or it is inside obt limits (and abstime limits for security reasons)
4184 mocchiut 1.90 ){ // check on abstime and obt needed to handle nested+DV_skipped packets
4185     if ( totrunentrymin > iev ){ // there is a shift (nested+DV_skipped packets)
4186     if ( !isSync ){
4187     if (DBG) printf("PamLevel2::UpdateRunInfo(Long64_t) - unconsistent iev - nevents, probable DBL0-L2 async\n");
4188     if (DBG) printf("PamLevel2::UpdateRunInfo(Long64_t) - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);
4189     // printf("PamLevel2::UpdateRunInfo(Long64_t) - unconsistent iev - nevents, probable DBL0-L2 async\n");
4190     // printf("PamLevel2::UpdateRunInfo(Long64_t) - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);//TOGLITOGLI
4191     prevshift += (totrunentrymin-iev); // add the new shift to total shift
4192     totrunentrymin -= (totrunentrymin-iev); // shift run position min
4193     totrunentrymax -= (totrunentrymin-iev); // shift run position max
4194     if (DBG) printf("PamLevel2::UpdateRunInfo(Long64_t) - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);
4195     // printf("PamLevel2::UpdateRunInfo(Long64_t) - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);//TOGLITOGLI
4196     } else {
4197     printf(" PamLevel2::UpdateRunInfo(Long64_t) ERROR! sync file but unconsistent totrunetrymin %lld and iev %lld!!! \n",totrunentrymin,iev);
4198     cout << " OK this is a bug, write to Emiliano, Emiliano.Mocchiutti@ts.infn.it " << endl;
4199     cout << "\nFor bug reporting instructions, please see for example:\n";
4200     cout << " <http://www.ts.infn.it/~mocchiut/bugs/bugs.html>.\n";
4201     cout << " " << endl;
4202     }
4203     }
4204     runfirstentry = totrunentrymin; // first entry of the run in the level2
4205    
4206 mocchiut 1.89
4207     //
4208 mocchiut 1.94 if ( fUseDBinRunInfo ){
4209     if (gltsync)
4210     delete gltsync; // Emiliano
4211     if (!dbc || (dbc && !dbc->IsConnected()))
4212     SetDBConnection(); //Emiliano
4213     gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0, "ID", dbc, false); // Emiliano
4214     TrkParams::Set(GetRunInfo(), dbc);
4215     if (dbc){
4216     dbc->Close(); // Emiliano
4217     delete dbc;
4218     dbc=0;
4219     }
4220     if (gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) > gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT)) { // Emiliano
4221     cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- irun " << irun
4222     << " has RUNHEADER_OBT>=RUNTRAILER_OBT " << endl;
4223     cout
4224     << " (NB!! in this case some events could be assigned to a wrong run)"
4225     << endl;
4226     }
4227 mocchiut 1.89 }
4228     //
4229     if (DBG) printf(" found \n");
4230 mocchiut 1.90 // printf(" found \n");//TOGLITOGLI
4231 mocchiut 1.89 //
4232     break;
4233     }
4234     } // loop over run
4235    
4236     // --------------------------------------
4237     // if there was no need to update the run
4238     // ---> exit with FALSE
4239     // --------------------------------------
4240 mocchiut 1.90 if (irun == oldrun){
4241     if (DBG) printf(" no new run \n");
4242     // printf(" no new run \n");//TOGLITOGLI
4243 mocchiut 1.89 return (false);
4244 mocchiut 1.90 }
4245 mocchiut 1.89 // --------------------------------------
4246     // ... otherwise
4247     // ---> exit with TRUE
4248     // --------------------------------------
4249    
4250     if (SELLI != 2) {
4251     /// decrement counters since this event belongs to a new run
4252     if (GetTrigLevel2()) {
4253     totdltime[0] -= GetTrigLevel2()->dltime[0];//live-time
4254     totdltime[1] -= GetTrigLevel2()->dltime[1];//dead-time
4255     }
4256     totdltime[2]--; //event counter
4257     if (DBG) {
4258     cout << endl;
4259     cout << "n.events : " << totdltime[2] << endl;
4260     cout << "RUN LIVE-TIME: " << totdltime[0] * 0.16 << " ms" << endl;
4261     cout << "RUN DEAD-TIME: " << totdltime[1] * 0.01 << " ms" << endl;
4262     }
4263     // add an entry
4264     if (run_tree_clone && totdltime[2] > 0)
4265     if (run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries())
4266     run_tree_clone->GetBranch("DeadLiveTime")->Fill();
4267     // reset counters
4268     if ( totdltime[2] > 0 ){
4269     if (GetTrigLevel2()) {
4270     totdltime[0] = GetTrigLevel2()->dltime[0];//live-time
4271     totdltime[1] = 0; //dead-time
4272     }
4273     totdltime[2] = 1; //event counter
4274     }
4275     }
4276    
4277     if (DBG){
4278     cout << endl << " ))))) UPDATE RUN INFO ((((( @iev " << iev << " run " << GetRunInfo()->ID << " irun " << irun
4279 mocchiut 1.90 << endl;
4280 mocchiut 1.89 printf("2abstime %lld %lld pktnum %d %d obt %lld \n",abstime,prevabstime,pktnum,prevpktnum,obt);
4281     printf("2 rth %d %d nevents %d \n",GetRunInfo()->RUNHEADER_TIME,GetRunInfo()->RUNTRAILER_TIME,GetRunInfo()->NEVENTS);
4282     printf("2 rto %d %d \n",GetRunInfo()->RUNHEADER_OBT,GetRunInfo()->RUNTRAILER_OBT);
4283 mocchiut 1.94 if ( fUseDBinRunInfo ) printf("2 rto2 %lld %lld \n",gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT),gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT));
4284 mocchiut 1.90 printf("2 bo irunentry %lld prevshift %lld irun %lld \n",irunentry,prevshift,irun);
4285 mocchiut 1.89 printf("2 min %lld iev %lld max %lld tot %lld \n",totrunentrymin,iev,totrunentrymax,totrunentry);
4286     }
4287 mocchiut 1.90 // printf("2abstime %lld %lld pktnum %d %d obt %lld \n",abstime,prevabstime,pktnum,prevpktnum,obt);
4288     // printf("2 rth %d %d nevents %d \n",GetRunInfo()->RUNHEADER_TIME,GetRunInfo()->RUNTRAILER_TIME,GetRunInfo()->NEVENTS);
4289     // printf("2 rto %d %d \n",GetRunInfo()->RUNHEADER_OBT,GetRunInfo()->RUNTRAILER_OBT);
4290     // printf("2 rto2 %lld %lld \n",gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT),gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT));
4291     // printf("2 bo irunentry %lld prevshift %lld irun %lld \n",irunentry,prevshift,irun);
4292     // printf("2 min %lld iev %lld max %lld tot %lld \n",totrunentrymin,iev,totrunentrymax,totrunentry);//TOGLITOGLI
4293 mocchiut 1.89
4294     return (true);
4295     } // need for run upgrade
4296     if (DBG) printf("return false\n");
4297     return (false);
4298     }// SELLI = 0 SELLI = 2
4299    
4300     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
4301     // if it is a preselected file (there is SelectionList)
4302     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
4303     // irun = run entry relative to the chain
4304     // irunt = run entry relative to the tree
4305     if (SELLI == 1) {
4306     sel_tree->GetEntry(iev);// read irunt from SelectionList
4307     irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW
4308     if (irun != oldrun) {
4309     if (irun < run_tree->GetEntries())
4310     run_tree->GetEntry(irun);
4311     // check if the time is ok (with merged files it is not...)
4312     // if not loop over run and look for the proper entry
4313     bool SECONDO_GIRO = false;
4314     // Long64_t irun_start = irun;
4315     int offset_start = irunoffset[sel_tree->GetTreeNumber()];
4316     while (((!(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s)
4317     abstime <= GetRunInfo()->RUNTRAILER_TIME)
4318     // ||
4319     // !(obt >= GetRunInfo()->RUNHEADER_OBT && // additional check on OBT (ms)
4320     // obt <= GetRunInfo()->RUNTRAILER_OBT)
4321     ) || GetRunInfo()->NEVENTS == 0)
4322     // && irun < run_tree->GetEntries()
4323     ) {
4324    
4325     if (DBG) {
4326     cout << " (test) ";
4327     cout << " tree " << sel_tree->GetTreeNumber();
4328     cout << " irunt " << irunt;
4329     cout << " offset " << irunoffset[sel_tree->GetTreeNumber()];
4330     cout << " abs " << abstime;
4331     cout << " >> " << GetRunInfo()->RUNHEADER_TIME << " " << GetRunInfo()->RUNTRAILER_TIME;
4332     cout << " obt " << obt;
4333     cout << " >> " << GetRunInfo()->RUNHEADER_OBT << " " << GetRunInfo()->RUNTRAILER_OBT;
4334     cout << " *** JUMP RUN *** irun " << irun;
4335     cout << endl;
4336     }
4337     // irun++;
4338     irunoffset[sel_tree->GetTreeNumber()]++;
4339     irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW
4340     if (irun == run_tree->GetEntries() && SECONDO_GIRO) {
4341     // if(irun == irun_start ){
4342     cout << " ...grrrvzzkhhhajsdkj!!!! " << endl;
4343     irunoffset[sel_tree->GetTreeNumber()] = offset_start;
4344     return false;
4345     }
4346     if (irun >= run_tree->GetEntries() || irun < 0) {
4347     cout << "irun = " << irun << " >> search from the beginning... <<" << endl;
4348     SECONDO_GIRO = true;
4349     irun = 0;
4350     irunoffset[sel_tree->GetTreeNumber()] = -irunt;
4351     }
4352     run_tree->GetEntry(irun);
4353     }
4354    
4355     if (DBG) {
4356     cout << " (test) ";
4357     cout << " tree " << sel_tree->GetTreeNumber();
4358     cout << " irunt " << irunt;
4359     cout << " offset " << irunoffset[sel_tree->GetTreeNumber()];
4360     cout << " abs " << abstime;
4361     cout << " >> " << GetRunInfo()->RUNHEADER_TIME << " " << GetRunInfo()->RUNTRAILER_TIME;
4362     cout << " obt " << obt;
4363     cout << " >> " << GetRunInfo()->RUNHEADER_OBT << " " << GetRunInfo()->RUNTRAILER_OBT;
4364     }
4365     if (DBG)
4366     cout << endl;
4367     if (DBG)
4368     cout << endl << " ))))) UPDATE RUN INFO ((((( @iev " << iev << " run " << GetRunInfo()->ID << " (run-entry "
4369     << irun << ")" << endl;
4370     // ----------------------------------------------------
4371     // update the tracker parameters
4372     // (non ho trovato nessun altro modo sicuro di farlo...)
4373     // ----------------------------------------------------
4374 mocchiut 1.94 if ( fUseDBinRunInfo ){
4375     if (!dbc || (dbc && !dbc->IsConnected()))
4376     SetDBConnection();
4377     TrkParams::Set(GetRunInfo(), dbc);
4378     if (dbc){
4379     dbc->Close();
4380     delete dbc;
4381     dbc=0;
4382     }
4383     }
4384 mocchiut 1.89 // cout << endl;
4385     prevshift = 0;
4386 mocchiut 1.90 yprevshift = 0;
4387 mocchiut 1.89 return true;
4388     }
4389     return false;
4390     }
4391    
4392     return false;
4393     //
4394     }
4395    
4396 mocchiut 1.90 /**
4397     * Update the runinfo informations (to be used to have Run infos event by event basis)
4398     * @param run Pointer to the chain/tree which contains run infos
4399     * @return true if a new run has been read, false if it is still the same run
4400     */
4401     Bool_t PamLevel2::UpdateRunInfo(TChain *run, Long64_t iev) {
4402     return (UpdateRunInfo(iev));
4403 pam-fi 1.81 }
4404 mocchiut 1.89
4405 mocchiut 1.17 /**
4406     * Update the runinfo informations (to be used to have Run infos event by event basis)
4407 pam-fi 1.81 * @param run Pointer to the chain/tree which contains run infos
4408 mocchiut 1.17 * @return true if a new run has been read, false if it is still the same run
4409     */
4410 pam-fi 1.81 Bool_t PamLevel2::UpdateRunInfo(TTree *run, Long64_t iev) {
4411     return (UpdateRunInfo((TChain*) run, iev));
4412     }
4413 mocchiut 1.89
4414 mocchiut 1.17
4415 pam-fi 1.2 //--------------------------------------
4416     //
4417     //
4418     //--------------------------------------
4419     /**
4420 pam-fi 1.8 * Set which trees shoul be analysed
4421 pam-fi 1.81 * @param detlist TString containing the sequence of trees required
4422 pam-fi 1.55 */
4423 pam-fi 1.81 void PamLevel2::SetWhichTrees(TString detlist) {
4424    
4425     // if(detlist.IsNull() || detlist.Contains("+ALL", TString::kIgnoreCase)){
4426     if (detlist.Contains("+ALL", TString::kIgnoreCase)) {
4427    
4428     cout << " ======================================================== " << endl;
4429     cout << " (( WARNING )) " << endl;
4430     cout << " The meaning of the option +ALL has changed!! " << endl;
4431     cout << " Now it includes really all (level0+level1+level2+gpamela)" << endl;
4432     cout << " and the file is discarded if it does not contain " << endl;
4433     cout << " all trees or if level0 files are not available!! " << endl;
4434     cout << " ======================================================== " << endl;
4435    
4436     CAL0 = true;
4437     CAL1 = true;
4438     CAL2 = true;
4439     TRK2 = true;
4440     TRK1 = true;
4441     TRKh = true;
4442     TRK0 = true;
4443     TRG = true;
4444     TOF = true;
4445     TOF0 = true;
4446     S4 = true;
4447     ND = true;
4448     AC = true;
4449     ORB = true;
4450     GP = true;
4451     }
4452     else if (detlist.Contains("-ALL", TString::kIgnoreCase)) {
4453     CAL0 = false;
4454     CAL1 = false;
4455     CAL2 = false;
4456     TRK2 = false;
4457     TRK1 = false;
4458     TRKh = false;
4459     TRK0 = false;
4460     TRG = false;
4461     TOF = false;
4462     TOF0 = false;
4463     S4 = false;
4464     ND = false;
4465     AC = false;
4466     ORB = false;
4467     GP = false;
4468     };
4469    
4470     // -------------------------------------------------------------------------
4471     if (detlist.Contains("CAL1", TString::kIgnoreCase)) {
4472     if (detlist.Contains("-CAL1", TString::kIgnoreCase))
4473     CAL1 = false;
4474     if (detlist.Contains("+CAL1", TString::kIgnoreCase))
4475     CAL1 = true;
4476     };
4477    
4478     if (detlist.Contains("CAL0", TString::kIgnoreCase)) {
4479     if (detlist.Contains("-CAL0", TString::kIgnoreCase))
4480     CAL0 = false;
4481     if (detlist.Contains("+CAL0", TString::kIgnoreCase))
4482     CAL0 = true;
4483     };
4484    
4485     if (detlist.Contains("CAL2", TString::kIgnoreCase)) {
4486     if (detlist.Contains("-CAL2", TString::kIgnoreCase))
4487     CAL2 = false;
4488     if (detlist.Contains("+CAL2", TString::kIgnoreCase))
4489     CAL2 = true;
4490     };
4491    
4492     if (detlist.Contains("+CAL", TString::kIgnoreCase) && !CAL1 && !CAL2)
4493     CAL2 = true;
4494     if (detlist.Contains("-CAL", TString::kIgnoreCase) && CAL1 && CAL2) {
4495     CAL2 = false;
4496     CAL1 = false;
4497     }
4498     // -------------------------------------------------------------------------
4499     if (detlist.Contains("TRK0", TString::kIgnoreCase)) {
4500     if (detlist.Contains("-TRK0", TString::kIgnoreCase))
4501     TRK0 = false;
4502     if (detlist.Contains("+TRK0", TString::kIgnoreCase))
4503     TRK0 = true;
4504     };
4505    
4506     if (detlist.Contains("TRK1", TString::kIgnoreCase)) {
4507     if (detlist.Contains("-TRK1", TString::kIgnoreCase))
4508     TRK1 = false;
4509     if (detlist.Contains("+TRK1", TString::kIgnoreCase))
4510     TRK1 = true;
4511     };
4512    
4513     if (detlist.Contains("TRK2", TString::kIgnoreCase)) {
4514     if (detlist.Contains("-TRK2", TString::kIgnoreCase))
4515     TRK2 = false;
4516     if (detlist.Contains("+TRK2", TString::kIgnoreCase))
4517     TRK2 = true;
4518     };
4519    
4520     if (detlist.Contains("TRKh", TString::kIgnoreCase)) {
4521     if (detlist.Contains("-TRKh", TString::kIgnoreCase))
4522     TRKh = false;
4523     if (detlist.Contains("+TRKh", TString::kIgnoreCase))
4524     TRKh = true;
4525     };
4526    
4527     if (detlist.Contains("+TRK", TString::kIgnoreCase) && !TRK1 && !TRK2 && !TRKh)
4528     TRK2 = true;
4529     if (detlist.Contains("-TRK", TString::kIgnoreCase) && TRK1 && TRK2 && TRKh) {
4530     TRK2 = false;
4531     TRK1 = false;
4532     TRKh = false;
4533     }
4534     // -------------------------------------------------------------------------
4535 pam-fi 1.20
4536 pam-fi 1.81 if (detlist.Contains("-TRG", TString::kIgnoreCase))
4537     TRG = false;
4538     else if (detlist.Contains("+TRG", TString::kIgnoreCase))
4539     TRG = true;
4540    
4541     if (detlist.Contains("-TOF", TString::kIgnoreCase))
4542     TOF = false;
4543     else if (detlist.Contains("+TOF", TString::kIgnoreCase))
4544     TOF = true;
4545 pam-fi 1.20
4546 pam-fi 1.81 if (detlist.Contains("-TOF0", TString::kIgnoreCase))
4547     TOF0 = false;
4548     else if (detlist.Contains("+TOF0", TString::kIgnoreCase))
4549     TOF0 = true;
4550 pam-fi 1.8
4551 pam-fi 1.81 if (detlist.Contains("-S4", TString::kIgnoreCase))
4552     S4 = false;
4553     else if (detlist.Contains("+S4", TString::kIgnoreCase))
4554     S4 = true;
4555    
4556     if (detlist.Contains("-ND", TString::kIgnoreCase))
4557     ND = false;
4558     else if (detlist.Contains("+ND", TString::kIgnoreCase))
4559     ND = true;
4560    
4561     if (detlist.Contains("-AC", TString::kIgnoreCase))
4562     AC = false;
4563     else if (detlist.Contains("+AC", TString::kIgnoreCase))
4564     AC = true;
4565    
4566     if (detlist.Contains("-ORB", TString::kIgnoreCase))
4567     ORB = false;
4568     else if (detlist.Contains("+ORB", TString::kIgnoreCase))
4569     ORB = true;
4570    
4571     if (detlist.Contains("-GP", TString::kIgnoreCase))
4572     GP = false;
4573     else if (detlist.Contains("+GP", TString::kIgnoreCase))
4574     GP = true;
4575    
4576     cout << "tree/branch list from input --> ";
4577     if (TRK0)
4578     cout << "TRK0 ";
4579     if (TRK1)
4580     cout << "TRK1 ";
4581     if (TRK2)
4582     cout << "TRK2 ";
4583     if (TRKh)
4584     cout << "TRKH ";
4585     if (CAL0)
4586     cout << "CAL0 ";
4587     if (CAL1)
4588     cout << "CAL1 ";
4589     if (CAL2)
4590     cout << "CAL2 ";
4591     if (TOF)
4592     cout << "TOF ";
4593     if (TRG)
4594     cout << "TRG ";
4595     if (AC)
4596     cout << "AC ";
4597     if (ND)
4598     cout << "ND ";
4599     if (S4)
4600     cout << "S4 ";
4601     if (ORB)
4602     cout << "ORB ";
4603     if (GP)
4604     cout << "GP ";
4605     cout << endl;
4606     // cout<< "Set detector list --> ";
4607     // if(TRK1)cout<<"TRK1 ";
4608     // if(TRK2)cout<<"TRK2 ";
4609     // if(TRKh)cout<<"TRKH ";
4610     // if(CAL1)cout<<"CAL1 ";
4611     // if(CAL2)cout<<"CAL2 ";
4612     // if(TOF0)cout<<"TOF0 ";
4613     // if(TOF)cout<<"TOF ";
4614     // if(TRG)cout<<"TRG ";
4615     // if(AC)cout<<"AC ";
4616     // if(ND)cout<<"ND ";
4617     // if(S4)cout<<"S4 ";
4618     // if(ORB)cout<<"ORB ";
4619     // cout << endl;
4620 pam-fi 1.11
4621 pam-fi 1.81 }
4622     ;
4623 pam-fi 1.11
4624     /**
4625     * Set tree/branch detector flags from the content of a tree
4626     */
4627 pam-fi 1.81 void PamLevel2::GetWhichTrees(TFile* f) {
4628 pam-fi 1.20
4629 pam-fi 1.81 // cout << "void PamLevel2::GetWhichTrees(TFile* f) --- WARNING!! --- ...potrebbe non funzionare "<<endl;
4630     // -----------
4631     // reset flags
4632     // -----------
4633     CAL1 = false;
4634     CAL2 = false;
4635     TRK2 = false;
4636     TRK1 = false;
4637     TRKh = false;
4638     TRG = false;
4639     TOF = false;
4640     S4 = false;
4641     ND = false;
4642     AC = false;
4643     ORB = false;
4644     GP = false;
4645    
4646     RUN = false;
4647    
4648     // cout << "Checking file: "<<f->GetName()<<endl;
4649     if (!f || f->IsZombie()) {
4650     cout << "File: " << f->GetName() << " Non valid root file" << endl;
4651 mocchiut 1.99 fDiscarded = true;
4652 pam-fi 1.81 return;
4653     }
4654    
4655     TList *lk = f->GetListOfKeys();
4656     if (!lk)
4657     return;
4658     TIter next(lk);
4659     TKey *key = 0;
4660    
4661     Int_t nev = 0;
4662    
4663     while ((key = (TKey*) next())) {
4664    
4665     if (!strcmp(key->GetName(), "Run"))
4666     RUN = true;
4667    
4668     //=========================================================
4669     if (!strcmp(key->GetName(), "Trigger")) {
4670     TRG = true;
4671     Int_t nevt = ((TTree*) f->Get("Trigger"))->GetEntries();
4672     if (nev && nevt != nev) {
4673     cout << "File: " << f->GetName() << " Trigger tree has " << nevt << " events instead of " << nev << endl;
4674     TRG = false;
4675     }
4676     else
4677     nev = nevt;
4678     }
4679     //=========================================================
4680     if (!strcmp(key->GetName(), "ToF")) {
4681     TOF = true;
4682     Int_t nevt = ((TTree*) f->Get("ToF"))->GetEntries();
4683     if (nev && nevt != nev) {
4684     cout << "File: " << f->GetName() << " ToF tree has " << nevt << " events instead of " << nev << endl;
4685     TOF = false;
4686     }
4687     else
4688     nev = nevt;
4689     }
4690     //=========================================================
4691     if (!strcmp(key->GetName(), "S4")) {
4692     S4 = true;
4693     Int_t nevt = ((TTree*) f->Get("S4"))->GetEntries();
4694     if (nev && nevt != nev) {
4695     cout << "File: " << f->GetName() << " S4 tree has " << nevt << " events instead of " << nev << endl;
4696     S4 = false;
4697     }
4698     else
4699     nev = nevt;
4700     }
4701     //=========================================================
4702    
4703     if (!strcmp(key->GetName(), "NeutronD")) {
4704     ND = true;
4705     Int_t nevt = ((TTree*) f->Get("NeutronD"))->GetEntries();
4706     if (nev && nevt != nev) {
4707     cout << "File: " << f->GetName() << "NeutronD tree has " << nevt << " events instead of " << nev << endl;
4708     ND = false;
4709     }
4710     else
4711     nev = nevt;
4712     }
4713     //=========================================================
4714     if (!strcmp(key->GetName(), "Anticounter")) {
4715     AC = true;
4716     Int_t nevt = ((TTree*) f->Get("Anticounter"))->GetEntries();
4717     if (nev && nevt != nev) {
4718     cout << "File: " << f->GetName() << " Anticounter tree has " << nevt << " events instead of " << nev << endl;
4719     AC = false;
4720     }
4721     else
4722     nev = nevt;
4723     }
4724     //=========================================================
4725     if (!strcmp(key->GetName(), "OrbitalInfo")) {
4726     ORB = true;
4727     Int_t nevt = ((TTree*) f->Get("OrbitalInfo"))->GetEntries();
4728     if (nev && nevt != nev) {
4729     cout << "File: " << f->GetName() << " OrbitalInfo tree has " << nevt << " events instead of " << nev << endl;
4730     ORB = false;
4731     }
4732     else
4733     nev = nevt;
4734     }
4735     //=========================================================
4736     if (!strcmp(key->GetName(), "Tracker")) {
4737     TTree *T = (TTree*) f->Get("Tracker");
4738     for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
4739     TString name = T->GetListOfBranches()->At(i)->GetName();
4740     if (!name.CompareTo("TrkLevel1"))
4741     TRK1 = true;
4742     if (!name.CompareTo("TrkLevel2"))
4743     TRK2 = true;
4744     if (!name.CompareTo("TrkHough"))
4745     TRKh = true;
4746     };
4747     Int_t nevt = T->GetEntries();
4748     if (nev && nevt != nev) {
4749     cout << "File: " << f->GetName() << " Tracker tree has " << nevt << " events instead of " << nev << endl;
4750     TRK1 = false;
4751     TRK2 = false;
4752     TRKh = false;
4753     }
4754     else
4755     nev = nevt;
4756     // T->Delete();
4757     };
4758     //=========================================================
4759     if (!strcmp(key->GetName(), "Calorimeter")) {
4760     TTree *T = (TTree*) f->Get("Calorimeter");
4761     for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
4762     TString name = T->GetListOfBranches()->At(i)->GetName();
4763     if (!name.CompareTo("CaloLevel1"))
4764     CAL1 = true;
4765     if (!name.CompareTo("CaloLevel2"))
4766     CAL2 = true;
4767     };
4768     Int_t nevt = T->GetEntries();
4769     if (nev && nevt != nev) {
4770     cout << "File: " << f->GetName() << " Calorimeter tree has " << nevt << " events instead of " << nev << endl;
4771     CAL1 = false;
4772     CAL2 = false;
4773     }
4774     else
4775     nev = nevt;
4776     // T->Delete();
4777     };
4778     //=========================================================
4779     if (!strcmp(key->GetName(), "h20")) {
4780     GP = true;
4781     Int_t nevt = ((TTree*) f->Get("h20"))->GetEntries();
4782     if (nev && nevt != nev) {
4783     cout << "File: " << f->GetName() << " h20 tree has " << nevt << " events instead of " << nev << endl;
4784     GP = false;
4785     }
4786     else
4787     nev = nevt;
4788     }
4789 pam-fi 1.20
4790 pam-fi 1.81 };
4791 pam-fi 1.11
4792 pam-fi 1.81 // delete lk;
4793    
4794     cout << "tree/branch list from file --> ";
4795     if (TRK1)
4796     cout << "TRK1 ";
4797     if (TRK2)
4798     cout << "TRK2 ";
4799     if (TRKh)
4800     cout << "TRKH ";
4801     if (CAL1)
4802     cout << "CAL1 ";
4803     if (CAL2)
4804     cout << "CAL2 ";
4805     if (TOF)
4806     cout << "TOF ";
4807     if (TRG)
4808     cout << "TRG ";
4809     if (AC)
4810     cout << "AC ";
4811     if (ND)
4812     cout << "ND ";
4813     if (S4)
4814     cout << "S4 ";
4815     if (ORB)
4816     cout << "ORB ";
4817     if (GP)
4818     cout << "GP ";
4819     cout << endl;
4820 pam-fi 1.12
4821 pam-fi 1.81 return;
4822 pam-fi 1.11
4823 pam-fi 1.81 }
4824     ;
4825 pam-fi 1.11
4826 pam-fi 1.2 //--------------------------------------
4827     //
4828     //
4829     //--------------------------------------
4830     /**
4831 pam-fi 1.3 * Check if a file contains selected Pamela Level2 trees.
4832 pam-fi 1.2 * @param name File name
4833 pam-fi 1.4 * @return true if the file is ok.
4834 pam-fi 1.2 */
4835 pam-fi 1.81 Bool_t PamLevel2::CheckLevel2File(TString name) {
4836    
4837     Bool_t CAL1__ok = false;
4838     Bool_t CAL2__ok = false;
4839     Bool_t TRK2__ok = false;
4840     Bool_t TRK1__ok = false;
4841     Bool_t TRKh__ok = false;
4842     Bool_t TRG__ok = false;
4843     Bool_t TOF__ok = false;
4844     Bool_t S4__ok = false;
4845     Bool_t ND__ok = false;
4846     Bool_t AC__ok = false;
4847     Bool_t ORB__ok = false;
4848     Bool_t GP__ok = false;
4849    
4850     Bool_t RUN__ok = false;
4851    
4852     Bool_t SELLI__ok = false;
4853    
4854     // cout << "Checking file: "<<name<<endl;
4855     TFile *f = new TFile(name.Data());
4856     if (!f || f->IsZombie()) {
4857     cout << "File: " << f->GetName() << " discarded ---- Non valid root file" << endl;
4858 mocchiut 1.98 fDiscarded = true;
4859 pam-fi 1.81 return false;
4860     }
4861     // cout << "Get list of keys: "<<f<<endl;
4862     TList *lk = f->GetListOfKeys();
4863     // lk->Print();
4864     TIter next(lk);
4865     TKey *key = 0;
4866    
4867     Int_t nev = 0;
4868    
4869     while ((key = (TKey*) next())) {
4870    
4871     // cout << key->GetName() << endl;
4872     // cout << key->GetName() << ""<<key->GetClassName()<<endl;
4873     // cout << " Get tree: " << f->Get(key->GetName())<<endl;
4874     // nev_previous = nev;
4875     // cout << " n.entries "<< nev <<endl;
4876     // if( key->GetClassName()=="TTree" && nev_previous && nev != nev_previous ){
4877     // nev = ((TTree*)f->Get(key->GetName()))->GetEntries();
4878     // cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<<nev<<" "<<nev_previous<< endl;
4879     // return false;
4880     // };
4881    
4882     //=========================================================
4883     // check if the file
4884    
4885    
4886     if (!strcmp(key->GetName(), "Run"))
4887     RUN__ok = true;
4888    
4889     //=========================================================
4890     if (!strcmp(key->GetName(), "SelectionList")) {
4891     SELLI__ok = true;
4892     if (SELLI == 1) {
4893     Int_t nevt = ((TTree*) f->Get("SelectionList"))->GetEntries();
4894     if (nev && nevt != nev) {
4895     cout << "File: " << f->GetName() << " discarded ---- SelectionList tree has " << nevt
4896     << " events instead of " << nev << endl;
4897 mocchiut 1.98 fDiscarded = true;
4898 pam-fi 1.81 return false;
4899     }
4900     nev = nevt;
4901     }
4902     }
4903    
4904     //=========================================================
4905     if (!strcmp(key->GetName(), "Trigger")) {
4906     TRG__ok = true;
4907     if (TRG) {
4908     Int_t nevt = ((TTree*) f->Get("Trigger"))->GetEntries();
4909     if (nev && nevt != nev) {
4910     cout << "File: " << f->GetName() << " discarded ---- Trigger tree has " << nevt << " events instead of "
4911     << nev << endl;
4912 mocchiut 1.98 fDiscarded = true;
4913 pam-fi 1.81 return false;
4914     }
4915     nev = nevt;
4916     }
4917     }
4918     //=========================================================
4919     if (!strcmp(key->GetName(), "ToF")) {
4920     TOF__ok = true;
4921     if (TOF) {
4922     Int_t nevt = ((TTree*) f->Get("ToF"))->GetEntries();
4923     if (nev && nevt != nev) {
4924     cout << "File: " << f->GetName() << " discarded ---- ToF tree has " << nevt << " events instead of " << nev
4925     << endl;
4926 mocchiut 1.98 fDiscarded = true;
4927 pam-fi 1.81 return false;
4928     }
4929     nev = nevt;
4930     }
4931     }
4932     //=========================================================
4933     if (!strcmp(key->GetName(), "S4")) {
4934     S4__ok = true;
4935     if (S4) {
4936     Int_t nevt = ((TTree*) f->Get("S4"))->GetEntries();
4937     if (nev && nevt != nev) {
4938     cout << "File: " << f->GetName() << " discarded ---- S4 tree has " << nevt << " events instead of " << nev
4939     << endl;
4940 mocchiut 1.98 fDiscarded = true;
4941 pam-fi 1.81 return false;
4942     }
4943     nev = nevt;
4944     }
4945     }
4946     //=========================================================
4947    
4948     if (!strcmp(key->GetName(), "NeutronD")) {
4949     ND__ok = true;
4950     if (ND) {
4951     Int_t nevt = ((TTree*) f->Get("NeutronD"))->GetEntries();
4952     if (nev && nevt != nev) {
4953     cout << "File: " << f->GetName() << " discarded ---- NeutronD tree has " << nevt << " events instead of "
4954     << nev << endl;
4955 mocchiut 1.98 fDiscarded = true;
4956 pam-fi 1.81 return false;
4957     }
4958     nev = nevt;
4959     }
4960     }
4961     //=========================================================
4962     if (!strcmp(key->GetName(), "Anticounter")) {
4963     AC__ok = true;
4964     if (AC) {
4965     Int_t nevt = ((TTree*) f->Get("Anticounter"))->GetEntries();
4966     if (nev && nevt != nev) {
4967     cout << "File: " << f->GetName() << " discarded ---- Anticounter tree has " << nevt << " events instead of "
4968     << nev << endl;
4969 mocchiut 1.98 fDiscarded = true;
4970 pam-fi 1.81 return false;
4971     }
4972     nev = nevt;
4973     }
4974     }
4975     //=========================================================
4976     if (!strcmp(key->GetName(), "OrbitalInfo")) {
4977     ORB__ok = true;
4978     if (ORB) {
4979     Int_t nevt = ((TTree*) f->Get("OrbitalInfo"))->GetEntries();
4980     if (nev && nevt != nev) {
4981     cout << "File: " << f->GetName() << " discarded ---- OrbitalInfo tree has " << nevt << " events instead of "
4982     << nev << endl;
4983 mocchiut 1.98 fDiscarded = true;
4984 pam-fi 1.81 return false;
4985     }
4986     nev = nevt;
4987     }
4988     }
4989     //=========================================================
4990     if (!strcmp(key->GetName(), "Tracker")) {
4991     TTree *T = (TTree*) f->Get("Tracker");
4992     if (TRK1 || TRK2 || TRKh) {
4993     Int_t nevt = T->GetEntries();
4994     if (nev && nevt != nev) {
4995     cout << "File: " << f->GetName() << " discarded ---- Tracker tree has " << nevt << " events instead of "
4996     << nev << endl;
4997 mocchiut 1.98 fDiscarded = true;
4998 pam-fi 1.81 return false;
4999     }
5000     nev = nevt;
5001     }
5002     for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
5003     TString name = T->GetListOfBranches()->At(i)->GetName();
5004     if (!name.CompareTo("TrkLevel1"))
5005     TRK1__ok = true;
5006     if (!name.CompareTo("TrkLevel2"))
5007     TRK2__ok = true;
5008     if (!name.CompareTo("TrkHough"))
5009     TRKh__ok = true;
5010     };
5011     T->Delete();
5012     };
5013     //=========================================================
5014     if (!strcmp(key->GetName(), "Calorimeter")) {
5015     TTree *T = (TTree*) f->Get("Calorimeter");
5016     if (CAL1 || CAL2) {
5017     Int_t nevt = T->GetEntries();
5018     if (nev && nevt != nev) {
5019     cout << "File: " << f->GetName() << " discarded ---- Calorimeter tree has " << nevt << " events instead of "
5020     << nev << endl;
5021 mocchiut 1.98 fDiscarded = true;
5022 pam-fi 1.81 return false;
5023     }
5024     nev = nevt;
5025     }
5026     for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
5027     TString name = T->GetListOfBranches()->At(i)->GetName();
5028     if (!name.CompareTo("CaloLevel1"))
5029     CAL1__ok = true;
5030     if (!name.CompareTo("CaloLevel2"))
5031     CAL2__ok = true;
5032     };
5033     T->Delete();
5034     };
5035     //=========================================================
5036     if (!strcmp(key->GetName(), "h20")) {
5037     ISGP = true;
5038     GP__ok = true;
5039     if (GP) {
5040     Int_t nevt = ((TTree*) f->Get("h20"))->GetEntries();
5041     if (nev && nevt != nev) {
5042     cout << "File: " << f->GetName() << " discarded ---- h20 tree has " << nevt << " events instead of " << nev
5043     << endl;
5044 mocchiut 1.98 fDiscarded = true;
5045 pam-fi 1.81 return false;
5046     }
5047     nev = nevt;
5048     }
5049     }
5050    
5051     };
5052    
5053     if (SELLI == -1)
5054     SELLI = (Int_t) SELLI__ok;
5055     if (SELLI == 0 && SELLI__ok) {
5056     cout << "File: " << f->GetName() << " discarded ---- found SelectionList (it is not a full-event file)" << endl;
5057 mocchiut 1.98 fDiscarded = true;
5058 pam-fi 1.81 return false;
5059     }
5060     if (SELLI == 1 && !SELLI__ok) {
5061     cout << "File: " << f->GetName() << " discarded ---- SelectionList missing" << endl;
5062 mocchiut 1.98 fDiscarded = true;
5063 pam-fi 1.81 return false;
5064     }
5065 pam-fi 1.8
5066 pam-fi 1.81 // cout << "SELLI "<<SELLI<<endl;
5067    
5068     // cout<< "CheckLevel2File(TString): detector list --> ";
5069     // if(TRK1__ok)cout<<"TRK1 ";
5070     // if(TRK2__ok)cout<<"TRK2 ";
5071     // if(TRKh__ok)cout<<"TRKH ";
5072     // if(CAL1__ok)cout<<"CAL1 ";
5073     // if(CAL2__ok)cout<<"CAL2 ";
5074     // if(TOF__ok)cout<<"TOF ";
5075     // if(TRG__ok)cout<<"TRG ";
5076     // if(AC__ok)cout<<"AC ";
5077     // if(ND__ok)cout<<"ND ";
5078     // if(S4__ok)cout<<"S4 ";
5079     // if(ORB__ok)cout<<"ORB ";
5080     // cout << endl;
5081    
5082    
5083     if (TRK2 && TRK1__ok)
5084     TRK1 = 1;
5085     // ----------------------------------------------------------------------------
5086     // NOTA
5087     // se c'e` il level1, lo devo necessarimente leggere.
5088     // infatti (non ho capito perche`) i cluster vengono letti e allocati in memoria
5089     // comunque, ma non vengono disallocati da PamLevel2::Clear()
5090     // ----------------------------------------------------------------------------
5091    
5092    
5093     if (!RUN__ok) {
5094     cout << "File: " << f->GetName() << " *WARNING* ---- Missing RunInfo tree (NB: RUN infos will not be updated)"
5095     << endl;
5096     RUN = false;
5097     };
5098 pam-fi 1.20
5099 pam-fi 1.81 if (CAL1 && !CAL1__ok) {
5100     cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel1 branch" << endl;
5101 mocchiut 1.98 fDiscarded = true;
5102 pam-fi 1.81 return false;
5103     };
5104     if (CAL2 && !CAL2__ok) {
5105     cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel2 branch" << endl;
5106 mocchiut 1.98 fDiscarded = true;
5107 pam-fi 1.81 return false;
5108     };
5109     if (TRK2 && !TRK2__ok) {
5110     cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel2 branch" << endl;
5111 mocchiut 1.98 fDiscarded = true;
5112 pam-fi 1.81 return false;
5113     };
5114     if (TRK1 && !TRK1__ok) {
5115     cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel1 branch" << endl;
5116 mocchiut 1.98 fDiscarded = true;
5117 pam-fi 1.81 return false;
5118     };
5119     if (TRKh && !TRKh__ok) {
5120     cout << "File: " << f->GetName() << " discarded ---- Missing TrkHough branch" << endl;
5121 mocchiut 1.98 fDiscarded = true;
5122 pam-fi 1.81 return false;
5123     };
5124     if (ORB && !ORB__ok) {
5125     cout << "File: " << f->GetName() << " discarded ---- Missing ORB tree" << endl;
5126 mocchiut 1.98 fDiscarded = true;
5127 pam-fi 1.81 return false;
5128     };
5129     if (AC && !AC__ok) {
5130     cout << "File: " << f->GetName() << " discarded ---- Missing AC tree" << endl;
5131 mocchiut 1.98 fDiscarded = true;
5132 pam-fi 1.81 return false;
5133     };
5134     if (S4 && !S4__ok) {
5135     cout << "File: " << f->GetName() << " discarded ---- Missing S4 tree" << endl;
5136 mocchiut 1.98 fDiscarded = true;
5137 pam-fi 1.81 return false;
5138     };
5139     if (TOF && !TOF__ok) {
5140     cout << "File: " << f->GetName() << " discarded ---- Missing ToF tree" << endl;
5141 mocchiut 1.98 fDiscarded = true;
5142 pam-fi 1.81 return false;
5143     };
5144 pam-fi 1.8
5145 pam-fi 1.81 if (ND && !ND__ok) {
5146     cout << "File: " << f->GetName() << " discarded ---- Missing ND tree" << endl;
5147 mocchiut 1.98 fDiscarded = true;
5148 pam-fi 1.81 return false;
5149     };
5150     if (TRG && !TRG__ok) {
5151     cout << "File: " << f->GetName() << " discarded ---- Missing Trigger tree" << endl;
5152 mocchiut 1.98 fDiscarded = true;
5153 pam-fi 1.81 return false;
5154     };
5155     if (GP && !GP__ok) {
5156     cout << "File: " << f->GetName() << " discarded ---- Missing h20 tree" << endl;
5157 mocchiut 1.98 fDiscarded = true;
5158 pam-fi 1.81 return false;
5159     };
5160 pam-fi 1.8
5161 pam-fi 1.81 // lk->Delete();
5162     // delete lk;
5163     f->Close();
5164    
5165     // cout<< "CheckLevel2File(TString): detector list --> ";
5166     // if(TRK1)cout<<"TRK1 ";
5167     // if(TRK2)cout<<"TRK2 ";
5168     // if(TRKh)cout<<"TRKH ";
5169     // if(CAL1)cout<<"CAL1 ";
5170     // if(CAL2)cout<<"CAL2 ";
5171     // if(TOF)cout<<"TOF ";
5172     // if(TRG)cout<<"TRG ";
5173     // if(AC)cout<<"AC ";
5174     // if(ND)cout<<"ND ";
5175     // if(S4)cout<<"S4 ";
5176     // if(ORB)cout<<"ORB ";
5177     // if(GP)cout<<"GP ";
5178     // cout << endl;
5179 pam-fi 1.8
5180 pam-fi 1.81 return true;
5181 pam-fi 1.2
5182 pam-fi 1.81 }
5183     ;
5184 pam-fi 1.2
5185 pam-fi 1.9 /**
5186     * Create clone-trees
5187     */
5188 pam-fi 1.81 void PamLevel2::CreateCloneTrees0(TChain *fChain, TFile *ofile) {
5189    
5190     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
5191     cout << "Create clones of PAMELA trees " << endl;
5192 pam-fi 1.9
5193 pam-fi 1.81 Int_t i = 0;
5194     pam_tree_clone[i] = fChain->GetTree()->CloneTree(0);
5195     TString name = pam_tree_clone[i]->GetName();
5196     name.Append("_clone");
5197     // pam_tree_clone[i]->SetName(name.Data());
5198     cout << pam_tree_clone[i]->GetName() << endl;
5199     i++;
5200    
5201     TList *li = fChain->GetListOfFriends();
5202     TIter next(li);
5203     TFriendElement* T_friend = 0;
5204     ofile->cd();
5205     while ((T_friend = (TFriendElement*) next())) {
5206     // cout<<T_friend->IsA()->GetName()<<" "<<T_friend->GetName()<<hex << T_friend->GetTree() << dec<<endl;
5207     // cout<<T_friend->GetTree()->GetName()<< endl;
5208     pam_tree_clone[i] = T_friend->GetTree()->CloneTree(0);
5209     pam_tree_clone[i]->SetAutoSave(1000000);
5210     name = pam_tree_clone[i]->GetName();
5211 pam-fi 1.9 name.Append("_clone");
5212 pam-fi 1.81 // pam_tree_clone[i]->SetName(name.Data());
5213     cout << pam_tree_clone[i]->GetName() << endl;
5214 pam-fi 1.9 i++;
5215 pam-fi 1.81 }
5216 pam-fi 1.9
5217 pam-fi 1.81 delete li;
5218 pam-fi 1.9
5219 pam-fi 1.81 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
5220 pam-fi 1.9
5221     }
5222    
5223 pam-fi 1.11 /**
5224     * Create clone-trees
5225     */
5226 pam-fi 1.81 void PamLevel2::CreateCloneTrees(TFile *ofile) {
5227 pam-fi 1.11
5228 pam-fi 1.81 // if the pointer is null, create a default file
5229     if (!run_tree)
5230     return;
5231    
5232     if (!ofile) {
5233     cout << "void PamLevel2::CreateCloneTrees(TFile*) -- WARNING -- Creating file: clone-tree.root " << endl;
5234     ofile = new TFile("clone-tree.root", "recreate");
5235     }
5236    
5237     ofile->cd();
5238    
5239     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
5240     cout << "Create new PAMELA trees " << endl;
5241    
5242     run_tree_clone = new TTree("Run", "PAMELA Level2 data from the GL_RUN table ");
5243     run_tree_clone->Branch("RunInfo", "GL_RUN", GetPointerTo("RunInfo"));
5244     cout << "Run : branch RunInfo" << endl;
5245     run_tree_clone->Branch("SoftInfo", "SoftInfo", GetPointerTo("SoftInfo"));
5246     cout << "Run : branch SoftInfo" << endl;
5247     // ------------------
5248     // replicate run tree
5249     // ------------------
5250     // cout << "----------------------------------------------------"<<endl;
5251     // cout << "irun\t | RUN\t NEVENTS\t absolute time"<<endl;
5252     for (Int_t i = 0; i < run_tree->GetEntries(); i++) {
5253     run_tree->GetEntry(i);
5254     // cout << i<< "\t | "<<GetRunInfo()->ID<<"\t "<<GetRunInfo()->NEVENTS<< "\t "<<GetRunInfo()->RUNHEADER_TIME<<" <---> "<<GetRunInfo()->RUNTRAILER_TIME<<endl;
5255     run_tree_clone->Fill();
5256     }
5257 mocchiut 1.104 //
5258     // replicate processinginfo tree
5259     //
5260 mocchiut 1.107 if ( PROC ){ // EMEMEM
5261 mocchiut 1.101 proc_tree_clone = new TTree("ProcessingInfo","Log of data processing");
5262     proc_tree_clone->Branch("ProcInfo", "ProcInfo", GetPointerTo("ProcInfo"));
5263 mocchiut 1.100 cout << "ProcessingInfo: branch ProcessingInfo" << endl;
5264     // ------------------
5265     // replicate processinginfo tree
5266     // ------------------
5267     // cout << "----------------------------------------------------"<<endl;
5268     // cout << "irun\t | RUN\t NEVENTS\t absolute time"<<endl;
5269     for (Int_t i = 0; i < proc_tree->GetEntries(); i++) {
5270     proc_tree->GetEntry(i);
5271 mocchiut 1.107 // cout << i<< "\t | "<<endl;
5272 mocchiut 1.100 proc_tree_clone->Fill();
5273     }
5274 mocchiut 1.107 if ( SELLI != 2 ){
5275 mocchiut 1.100 proc_obj->runID = 0;
5276     TTimeStamp *dt = new TTimeStamp();
5277     proc_obj->date = dt->AsString();
5278     delete dt;
5279 emocchiutti 1.108 proc_obj->commandLine = Form("PamelaLevel2 was called: CAL2 %i CAL1 %i CAL0 %i TRK2 %i TRK1 %i TRKh %i TRK0 %i TOF %i TOF0 %i TRG %i \n S4 %i ND %i AC %i ORB %i GP %i EXT %i NUC %i RUN %i ISGP %i SELLI %i \n Custom string = %s",CAL2,CAL1,CAL0,TRK2,TRK1,TRKh,TRK0,TOF,TOF0,TRG,S4,ND,AC,ORB,GP,EXT,NUC,RUN,ISGP,SELLI,customString.Data());
5280     proc_obj->outputFilename = ofile->GetName();
5281 mocchiut 1.100 proc_obj->localDir = gSystem->WorkingDirectory();
5282     proc_obj->uname = gSystem->GetFromPipe("uname -a");
5283 emocchiutti 1.108 if (!dbc || (dbc && !dbc->IsConnected())) SetDBConnection();
5284     proc_obj->DB = Form("mysql://%s/%s",dbc->GetHost(),dbc->GetDB());
5285     dbc->Close();
5286 mocchiut 1.100 proc_tree_clone->Fill();
5287     }
5288     cout << "----------------------------------------------------" << endl;
5289     }
5290 pam-fi 1.81 // ------------------------------------
5291     // add branch with dead and live times
5292     // ------------------------------------
5293     if (SELLI != 2) { // EMILIANO
5294     run_tree_clone->Branch("DeadLiveTime", totdltime, "dltime[3]/l");
5295     cout << "Run : branch DeadLiveTime" << endl;
5296    
5297     sel_tree_clone = new TTree("SelectionList", "List of selected events ");
5298     // sel_tree_clone->Branch("RunEntry",&irun,"runentry/L");
5299     sel_tree_clone->Branch("RunEntry", &irunt, "runentry/L");//NEWNEW
5300     sel_tree_clone->Branch("EventEntry", &irunentry, "eventry/L");
5301 mocchiut 1.91 // if ( hasL0EE ) sel_tree_clone->Branch("L0EventEntry", &il0entry, "l0eventry/L");
5302 pam-fi 1.81 };
5303 pam-fi 1.39
5304 pam-fi 1.81 Int_t i = 0;
5305     if (TRK1 || TRK2 || TRKh) {
5306     pam_tree_clone[i] = new TTree("Tracker", "PAMELA tracker level2 data ");
5307     if (TRK1) {
5308     pam_tree_clone[i]->Branch("TrkLevel1", "TrkLevel1", GetPointerTo("TrkLevel1"));
5309     pam_tree_clone[i]->BranchRef();
5310     cout << "Tracker : branch TrkLevel1" << endl;
5311     // cout << "CreateCloneTrees " << GetTrkLevel1()<<endl;
5312     };
5313     if (TRK2) {
5314     pam_tree_clone[i]->Branch("TrkLevel2", "TrkLevel2", GetPointerTo("TrkLevel2"));
5315     cout << "Tracker : branch TrkLevel2" << endl;
5316     };
5317     if (TRKh) {
5318     pam_tree_clone[i]->Branch("TrkHough", "TrkHough", GetPointerTo("TrkHough"));
5319     cout << "Tracker : branch TrkHough" << endl;
5320     };
5321 pam-ts 1.95 if(NUC){
5322     pam_tree_clone[i]->Branch("TrackNuclei","TClonesArray",&trk_nuc_obj);
5323     cout << "Tracker : branch TrackNuclei" << endl;
5324     }
5325     if(EXT){
5326     pam_tree_clone[i]->Branch("extAlgFlag",&extAlgFlag,"extAlgFlag/I");
5327     pam_tree_clone[i]->Branch("RecoveredTrack","TClonesArray",&trk_ext_obj);
5328     cout << "Tracker : branch RecoveredTrack" << endl;
5329     if(NUC){
5330     pam_tree_clone[i]->Branch("RecoveredTrackNuclei","TClonesArray",&trk_ext_nuc_obj);
5331     cout << "Tracker : branch RecoveredTrackNuclei" << endl;
5332     }
5333     }
5334    
5335 pam-fi 1.81 i++;
5336     }
5337 pam-fi 1.39
5338 pam-fi 1.81 // Calorimeter
5339     if (CAL1 || CAL2) {
5340     pam_tree_clone[i] = new TTree("Calorimeter", "PAMELA calorimeter level2 data ");
5341     if (CAL1) {
5342     pam_tree_clone[i]->Branch("CaloLevel1", "CaloLevel1", GetPointerTo("CaloLevel1"));
5343     cout << "Calorimeter : branch CaloLevel1" << endl;
5344     };
5345     if (CAL2) {
5346     pam_tree_clone[i]->Branch("CaloLevel2", "CaloLevel2", GetPointerTo("CaloLevel2"));
5347     cout << "Calorimeter : branch CaloLevel2" << endl;
5348 mocchiut 1.72 };
5349 pam-ts 1.95 if(NUC){
5350     pam_tree_clone[i]->Branch("TrackNuclei","TClonesArray",&calo_nuc_obj);
5351     cout << "Calorimeter : branch TrackNuclei" << endl;
5352     }
5353     if(EXT){
5354     pam_tree_clone[i]->Branch("RecoveredTrack","TClonesArray",&calo_ext_obj);
5355     cout << "Calorimeter : branch RecoveredTrack" << endl;
5356     if(NUC){
5357     pam_tree_clone[i]->Branch("RecoveredTrackNuclei","TClonesArray",&calo_ext_nuc_obj);
5358     cout << "Calorimeter : branch RecoveredTrackNuclei" << endl;
5359     }
5360     }
5361 pam-fi 1.81 i++;
5362     }
5363 pam-fi 1.20
5364 pam-fi 1.81 // ToF
5365     if (TOF) {
5366     pam_tree_clone[i] = new TTree("ToF", "PAMELA ToF level2 data ");
5367     pam_tree_clone[i]->Branch("ToFLevel2", "ToFLevel2", GetPointerTo("ToFLevel2"));
5368     cout << "ToF : branch ToFLevel2" << endl;
5369 pam-ts 1.95 if(NUC){
5370     pam_tree_clone[i]->Branch("TrackNuclei","TClonesArray",&tof_nuc_obj);
5371     cout << "ToF : branch TrackNuclei" << endl;
5372     }
5373     if(EXT){
5374     pam_tree_clone[i]->Branch("RecoveredTrack","TClonesArray",&tof_ext_obj);
5375     cout << "ToF : branch RecoveredTrack" << endl;
5376     if(NUC){
5377     pam_tree_clone[i]->Branch("RecoveredTrackNuclei","TClonesArray",&tof_ext_nuc_obj);
5378     cout << "ToF : branch RecoveredTrackNuclei" << endl;
5379     }
5380     }
5381 pam-fi 1.81 i++;
5382     };
5383     // Trigger
5384     if (TRG) {
5385     pam_tree_clone[i] = new TTree("Trigger", "PAMELA trigger level2 data ");
5386     pam_tree_clone[i]->Branch("TrigLevel2", "TrigLevel2", GetPointerTo("TrigLevel2"));
5387     cout << "Trigger : branch TrigLevel2" << endl;
5388     i++;
5389     };
5390     // S4
5391     if (S4) {
5392     pam_tree_clone[i] = new TTree("S4", "PAMELA S4 level2 data ");
5393     pam_tree_clone[i]->Branch("S4Level2", "S4Level2", GetPointerTo("S4Level2"));
5394     cout << "S4 : branch S4Level2" << endl;
5395     i++;
5396     };
5397     // Neutron Detector
5398     if (ND) {
5399     pam_tree_clone[i] = new TTree("NeutronD", "PAMELA neutron detector level2 data ");
5400     pam_tree_clone[i]->Branch("NDLevel2", "NDLevel2", GetPointerTo("NDLevel2"));
5401     cout << "NeutronD : branch NDLevel2" << endl;
5402     i++;
5403     };
5404     // Anticounters
5405     if (AC) {
5406     pam_tree_clone[i] = new TTree("Anticounter", "PAMELA anticounter detector level2 data ");
5407     pam_tree_clone[i]->Branch("AcLevel2", "AcLevel2", GetPointerTo("AcLevel2"));
5408     cout << "Anticounter : branch AcLevel2" << endl;
5409     i++;
5410     };
5411     // OrbitalInfo
5412     if (ORB) {
5413     pam_tree_clone[i] = new TTree("OrbitalInfo", "PAMELA orbital info ");
5414     pam_tree_clone[i]->Branch("OrbitalInfo", "OrbitalInfo", GetPointerTo("OrbitalInfo"));
5415     cout << "OrbitalInfo : branch OrbitalInfo" << endl;
5416 pam-ts 1.95 if(NUC){
5417     pam_tree_clone[i]->Branch("TrackNuclei","TClonesArray",&orb_nuc_obj);
5418     cout << "OrbitalInfo : branch TrackNuclei" << endl;
5419     }
5420     if(EXT){
5421     pam_tree_clone[i]->Branch("RecoveredTrack","TClonesArray",&orb_ext_obj);
5422     cout << "OrbitalInfo : branch RecoveredTrack" << endl;
5423     if(NUC){
5424     pam_tree_clone[i]->Branch("RecoveredTrackNuclei","TClonesArray",&orb_ext_nuc_obj);
5425     cout << "OrbitalInfo : branch RecoveredTrackNuclei" << endl;
5426     }
5427     }
5428 pam-fi 1.81 i++;
5429     };
5430     // GPamela
5431     if (GP) {
5432     pam_tree_clone[i] = new TTree("h20", "GPAMELA info ");
5433     pam_tree_clone[i]->Branch("GPamela", "GPamela", GetPointerTo("GPamela"), 32000, 1);//split
5434 pam-fi 1.88 cout << "GPamela : branch GPamela" << endl;
5435 pam-fi 1.81 i++;
5436     };
5437 pam-ts 1.95
5438    
5439 pam-fi 1.81 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
5440 pam-fi 1.9
5441 pam-fi 1.11 }
5442 pam-fi 1.9
5443     /**
5444     * Fill tree (created with CreateCloneTrees)
5445     *
5446     */
5447     //void PamLevel2::FillNewPamTree(TTree *T){
5448 pam-fi 1.81 void PamLevel2::FillCloneTrees() {
5449    
5450     // cout << "PamLevel2::FillCloneTrees()" << irunentry << endl;
5451 pam-fi 1.24
5452 pam-fi 1.81 for (Int_t i = 0; i < NCLONES; i++) {
5453     if (pam_tree_clone[i])
5454     pam_tree_clone[i]->Fill();
5455     }
5456     if (sel_tree_clone)
5457     sel_tree_clone->Fill();
5458 pam-fi 1.21
5459 pam-fi 1.9 }
5460    
5461 pam-fi 1.81 TTree* PamLevel2::GetCloneTree(TString name) {
5462 pam-fi 1.9
5463 pam-fi 1.81 for (Int_t i = 0; i < NCLONES; i++) {
5464     if (pam_tree_clone[i]) {
5465     TString na = pam_tree_clone[i]->GetName();
5466     if (!name.CompareTo(na))
5467     return pam_tree_clone[i];
5468     };
5469     }
5470     if (run_tree_clone) {
5471     TString na = run_tree_clone->GetName();
5472     if (!name.CompareTo(na))
5473     return run_tree_clone;
5474     }
5475     if (sel_tree_clone) {
5476     TString na = sel_tree_clone->GetName();
5477     if (!name.CompareTo(na))
5478     return sel_tree_clone;
5479     }
5480 mocchiut 1.100 if (proc_tree_clone && PROC) {
5481     TString na = proc_tree_clone->GetName();
5482     if (!name.CompareTo(na))
5483     return proc_tree_clone;
5484     }
5485 pam-fi 1.81 return NULL;
5486 pam-fi 1.9
5487     }
5488 pam-fi 1.81 void PamLevel2::WriteCloneTrees() {
5489     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
5490     cout << "Write clones of PAMELA trees " << endl;
5491     cout << run_tree_clone->GetName() << endl;
5492     if (SELLI != 2) {// Emiliano
5493     if (run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries())
5494     run_tree_clone->GetBranch("DeadLiveTime")->Fill();
5495     };
5496     run_tree_clone->Write();
5497     if (SELLI != 2) { //Emiliano
5498     cout << sel_tree_clone->GetName() << endl;
5499     sel_tree_clone->Write();
5500     };
5501     for (Int_t i = 0; i < NCLONES; i++) {
5502     if (pam_tree_clone[i]) {
5503     cout << pam_tree_clone[i]->GetName() << endl;
5504 mocchiut 1.98 pam_tree_clone[i]->Write(pam_tree_clone[i]->GetName(),TObject::kOverwrite);
5505 mocchiut 1.72 };
5506 pam-fi 1.81 }
5507 mocchiut 1.100
5508 mocchiut 1.106 if ( PROC ){//EMEMEMEM
5509 mocchiut 1.100 proc_tree_clone->Write("ProcessingInfo",TObject::kOverwrite);
5510     }
5511 pam-fi 1.81 cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
5512 pam-fi 1.9
5513     }
5514    
5515     /**
5516 pam-fi 1.24 * Method to get level2-trees entry, the corresponding run entry and (if required) the level0 entry.
5517 pam-fi 1.9 */
5518 pam-fi 1.81 Int_t PamLevel2::GetEntry(Long64_t iee) {
5519    
5520     if (!pam_tree) {
5521     cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- level2 trees not loaded" << endl;
5522     return 0;
5523     }
5524 mocchiut 1.28
5525 pam-fi 1.81 //
5526     // This is a sort of bug: if you don't have the run tree you don't want to exit here you want to have loaded the event anyway...
5527     //
5528     // if(!run_tree ){
5529     // cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- run tree not loeaded"<<endl;
5530     // return 0;
5531     // }
5532    
5533     //-------------------------------
5534 mocchiut 1.90 if (!pam_tree->GetEntry(iee)) {
5535 pam-fi 1.81 cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- error reading pam tree" << endl;
5536     return 0;
5537     }
5538     //
5539     // ... that's way I put it here. Notice that nothing change in the code (is backward compatible) since in any case you return with 0.
5540     // in theory one would like to return 1 if run is not loaded but now I don't have the will to add that 2 lines of code and it is not
5541     // a problem if you don't check the return code of getentry.
5542     //
5543     if (!RUN || !run_tree) {
5544     if (TRK0 || CAL0 || TOF0 || RUN) { //forse cosi` va bene per tornare 1?
5545     cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- run tree not loaded" << endl;
5546 mocchiut 1.77 return 0;
5547 pam-fi 1.33 }
5548 pam-fi 1.81 else {
5549     return 1; //cosi` se non c'e` run esce qua...
5550     }
5551     }
5552    
5553     //-------------------------------
5554 mocchiut 1.90 //
5555     if ( fUpdateRunInfo ) UpdateRunInfo(iee); // Emiliano
5556     if (SELLI == 0 || SELLI == 2) irunentry = iee - runfirstentry;
5557 pam-fi 1.81
5558     return 1;
5559 pam-fi 1.20
5560     }
5561    
5562 pam-fi 1.81 TrkLevel0 *PamLevel2::GetTrkLevel0() {
5563     if (!TRK0)
5564     return NULL;
5565     if (!GetYodaEntry()) {
5566     cout << " Int_t PamLevel2::GetTrkLevel0() -- ERROR -- error reading level0 tree" << endl;
5567     return 0;
5568     }
5569     return trk0_obj;
5570     }
5571     ;
5572     CaloLevel0 *PamLevel2::GetCaloLevel0() {
5573     if (!CAL0)
5574     return NULL;
5575     if (!GetYodaEntry()) {
5576     cout << " Int_t PamLevel2::GetCaloLevel0() -- ERROR -- error reading level0 tree" << endl;
5577     return 0;
5578     }
5579     return calo0_obj;
5580     }
5581     ;
5582 pam-fi 1.40
5583 pam-fi 1.20 /**
5584     * Method to retrieve the level0 tree (YODA tree) that contains the current event.
5585     * Given the run ID (...), if needed it query the DB and load the proper file.
5586     * @return Pointer to the tree
5587     */
5588    
5589 pam-fi 1.81 TTree* PamLevel2::GetYodaTree() {
5590 pam-fi 1.20
5591 pam-fi 1.81 // cout << "TTree* PamLevel2::GetYodaTree( )"<<endl;
5592     //===================================
5593     // check if iroot has changed
5594     //===================================
5595     if (irun < 0) {
5596     cout << "PamLevel2::GetYodaTree() -- ERROR -- irun = " << irun << endl;
5597 mocchiut 1.90 if (DBG) cout << "In order to use this method you have to first load the RunInfo tree "<<endl;
5598 pam-fi 1.81 return NULL;
5599     }
5600 mocchiut 1.90 Int_t irootnew = GetRunInfo()->ID_ROOT_L0;
5601     if (DBG){
5602     cout << "iroot "<<iroot<<endl;
5603     cout << "irootnew "<<irootnew<<endl;
5604     }
5605 pam-fi 1.81
5606     //===================================
5607     // load the level0 file
5608     // (if not already loaded)
5609     //===================================
5610     if (iroot != irootnew || !l0_tree) {
5611     iroot = irootnew;
5612 pam-fi 1.20 //===================================
5613 pam-fi 1.81 // open the DB connection
5614     // (if not already opened)
5615 pam-fi 1.20 //===================================
5616 pam-fi 1.81 if (!dbc || (dbc && !dbc->IsConnected()))
5617     SetDBConnection();
5618     GL_ROOT glroot = GL_ROOT();
5619     if (glroot.Query_GL_ROOT(iroot, dbc)) {
5620     cout << "TTree* PamLevel2::GetYodaTree( ) -- ERROR -- level0 file iroot = " << iroot << " does not exists"
5621     << endl;
5622     return NULL;
5623     };
5624     TString filename = glroot.PATH + glroot.NAME;
5625     if (l0_file) {
5626     l0_file->Close();
5627     l0_file->Delete();
5628     }
5629     cout << "Opening LEVEL0 file: " << filename << endl;
5630     FileStat_t t;
5631     if (gSystem->GetPathInfo(filename.Data(), t)) {
5632     cout << " PamLevel2::GetYodaTree() -- ERROR opening file " << endl;
5633     return NULL;
5634     }
5635     l0_file = new TFile(filename);
5636     if (!l0_file)
5637     return NULL;
5638     l0_tree = (TTree*) l0_file->Get("Physics");
5639     if (!h0_obj)
5640     h0_obj = new EventHeader();
5641     l0_tree->SetBranchAddress("Header", &h0_obj);
5642 mocchiut 1.90 yprevshift = 0; // yes, yprevshift is the shift in the level0, prevshift is the shift in the level2
5643 pam-fi 1.81 //---------------------------------------------------
5644     // TRACKER:
5645     if (TRK0) {
5646     if (!trk0_obj) {
5647     trk0_obj = new TrkLevel0();
5648     trk0_obj->Set();
5649     };
5650     l0_tree->SetBranchAddress("Tracker", trk0_obj->GetPointerToTrackerEvent());
5651     }
5652     //--------------------------------------------------
5653     // CALORIMETER:
5654     if (CAL0) {
5655     if (!calo0_obj) {
5656     calo0_obj = new CaloLevel0();
5657     calo0_obj->Set();
5658     };
5659     l0_tree->SetBranchAddress("Calorimeter", calo0_obj->GetPointerToCalorimeterEvent());
5660     }
5661     //---------------------------------------------------
5662     // TOF:
5663     if (TOF0) {
5664     cout << "PamLevel2::GetYodaTree() --- level0 TOF not implemented " << endl;
5665     }
5666 pam-fi 1.20
5667 pam-fi 1.81 dbc->Close(); // EMILIANO, do not leave open connections, open only when needed
5668 pam-fi 1.87 delete dbc;
5669 mocchiut 1.82 dbc=0;
5670 mocchiut 1.51
5671 pam-fi 1.81 };
5672 mocchiut 1.51
5673 pam-fi 1.81 if (TRK0) {
5674 mocchiut 1.90 if(!dbc || (dbc && !dbc->IsConnected()))SetDBConnection();
5675 pam-fi 1.81 TrkParams::SetCalib(run_obj, dbc);
5676     TrkParams::LoadCalib();
5677     if (!TrkParams::CalibIsLoaded()) {
5678     cout << " TTree* PamLevel2::GetYodaTree( ) -- WARNING -- Calibration not loaded" << endl;
5679 pam-fi 1.20 };
5680 mocchiut 1.82 if(dbc){
5681     dbc->Close(); // EMILIANO, do not leave open connections, open only when needed
5682 pam-fi 1.87 delete dbc;
5683 mocchiut 1.82 dbc=0;
5684     };
5685 pam-fi 1.81 }
5686     return l0_tree;
5687 pam-fi 1.20 }
5688 pam-fi 1.9
5689 pam-fi 1.20 /**
5690     * Method to retrieve the level0 tree (YODA tree) that contains the current event.
5691     */
5692 pam-fi 1.81 Int_t PamLevel2::GetYodaEntry() {
5693    
5694 mocchiut 1.90 Long64_t iev = this->GetReadEntry();
5695 pam-fi 1.81
5696 mocchiut 1.90 // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
5697     // if it is a full file (not preselected)
5698     // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
5699 mocchiut 1.91 // if (SELLI == 0 || SELLI == 2 || !hasL0EE) {
5700 pam-fi 1.81
5701 mocchiut 1.90 if (!GetYodaTree()){
5702     printf(" PamLevel2::GetYodaEntry() : ERROR no level0 file loaded!\n");
5703     return 0;
5704     }
5705 pam-fi 1.81
5706 mocchiut 1.90 if (irunentry < 0) {
5707     if (DBG) cout << "Int_t PamLevel2::GetYodaEntry() -- ATTENZIONE -- irunentry negativo?!?! "<<(Int_t)irunentry<<endl;
5708     // cout << "Int_t PamLevel2::GetYodaEntry() -- ATTENZIONE -- irunentry negativo?!?! "<<(Int_t)irunentry<<endl; // TOGLITOGLI
5709     irunentry = 0LL;
5710     }
5711     // ---------------------------------
5712     // if file is NOT a preselected file
5713     // ---------------------------------
5714     Long64_t quellagiusta = irunentry + (Long64_t)(run_obj->EV_FROM); // prevshift already included in irunentry
5715    
5716     if (DBG){
5717     cout << " irun "<< irun << " irunentry "<< irunentry<<" run_obj->EV_FROM "<<run_obj->EV_FROM <<" quella giusta "<<quellagiusta << endl;
5718     cout << " iroot "<<iroot<<" run_obj->ID_ROOT_L0 "<<run_obj->ID_ROOT_L0<<endl;
5719     cout << " time "<< abstime << endl;
5720     }
5721    
5722     ULong64_t obt = 0;
5723     ULong64_t pktn = 0;
5724     if (GetOrbitalInfo()) {
5725     obt = GetOrbitalInfo()->OBT;
5726     pktn = GetOrbitalInfo()->pkt_num;
5727     }
5728 pam-fi 1.81
5729 mocchiut 1.90 if (!GetOrbitalInfo() && !ISGP) {
5730     cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing OrbitalInfo " << endl;
5731     return 0;
5732 pam-fi 1.81 }
5733 mocchiut 1.90 if (obt == 0 && pktn == 0 && !ISGP) {
5734     cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- level2 event corrupted ?? " << endl;
5735 pam-fi 1.81 return 0;
5736     }
5737    
5738 mocchiut 1.90 // ---------------------------------------------------------------------
5739     // ATTENTION!!!
5740     // If data are not pre-processed with cleaner, the level0 tree may contain
5741     // spurious nested physics packets.
5742     // The GL_RUN variables EV_FROM, EV_TO and NEVENTS counts also these entries
5743     // while level2 tree DOES NOT!!
5744     // This means that "quellagiusta" in these cases is not correct.
5745     // In order to retrieve the correct level0 event, I implemented a check
5746     // of the OBT and pkt-number. In case of mismatch, the level0 entry number
5747     // is shift forward until when the packets match.
5748     // ---------------------------------------------------------------------
5749     Long64_t shift = 0LL;
5750     Long64_t answer = quellagiusta + shift + yprevshift;
5751     Int_t readl0 = 0;
5752     readl0 = l0_tree->GetEntry(answer); // prevshift already included in irunentry
5753    
5754     if (DBG){
5755     printf(" siamo qui shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);
5756     }
5757    
5758    
5759 pam-fi 1.81 if (ISGP) {
5760     obt = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()); //BARBATRUCCO
5761     pktn = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()); //BARBATRUCCO
5762     }
5763    
5764 mocchiut 1.90 while ( (obt != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) || pktn != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter())) && (quellagiusta + (Long64_t) shift) < GetYodaTree()->GetEntries() && shift < maxshift ){
5765     if ( isSync && shift == 0LL ){
5766     printf(" PamLevel2::GetYodaEntry() ERROR! sync file but the level0 entry not found in place!!! \n");
5767     cout << " OK this is a bug, write to Emiliano, Emiliano.Mocchiutti@ts.infn.it " << endl;
5768     cout << "\nFor bug reporting instructions, please see for example:\n";
5769     cout << " <http://www.ts.infn.it/~mocchiut/bugs/bugs.html>.\n";
5770     cout << " " << endl;
5771     }
5772     if (shift > 0) {
5773 mocchiut 1.93 if (DBG) cout << " PKTNUM L2 --- " << pktn << " --- L0 --- " << GetEventHeader()->GetPscuHeader()->GetCounter() << endl;
5774 mocchiut 1.90 if (DBG)
5775     cout << " RUN: ID " << GetRunInfo()->ID << " ID_ROOT_L0 " << run_obj->ID_ROOT_L0 << " ID_RUN_FRAG "
5776     << GetRunInfo()->ID_RUN_FRAG << " EV_FROM " << GetRunInfo()->EV_FROM << endl;
5777     if (DBG)
5778     cout << " L2 <--> L0 mismatch ( irun " << irun << " irunentry " << irunentry << " shift " << shift
5779     << " prevshift " << prevshift << " )" << endl;
5780     }
5781     answer = quellagiusta + shift+ yprevshift;
5782     readl0 = l0_tree->GetEntry(answer);
5783     // printf(" inside while shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);//TOGLITOGLI
5784    
5785     if (!GetEventHeader()) {
5786     cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing EventHeader " << endl;
5787     return 0;
5788     }
5789 pam-fi 1.81
5790 mocchiut 1.90 //
5791     if (yprevshift != 0 && (quellagiusta + (Long64_t) shift) == GetYodaTree()->GetEntries()) {
5792     if (DBG) printf(" reset inside while shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);
5793     // printf(" reset inside while shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);//TOGLITOGLI
5794     yprevshift = 0LL;
5795     shift = -1LL;
5796     };
5797    
5798     shift++;
5799     }
5800    
5801 pam-fi 1.81
5802 mocchiut 1.90 if ( obt != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) || pktn != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()) ){
5803     if ( isSync ){
5804     printf(" PamLevel2::GetYodaEntry() ERROR! sync file but the level0 entry not found AT ALL!!! \n");
5805     cout << " OK this is a bug, write to Emiliano, Emiliano.Mocchiutti@ts.infn.it " << endl;
5806     cout << "\nFor bug reporting instructions, please see for example:\n";
5807     cout << " <http://www.ts.infn.it/~mocchiut/bugs/bugs.html>.\n";
5808     cout << " " << endl;
5809     }
5810     cout << "Int_t PamLevel2::GetYodaEntry() -- WARNING -- " << endl;
5811     cout << " Big trouble here, no such event in Level0 data! (NB maxshift set to " << maxshift << " )" << endl;
5812     cout << " Nested and/or DarthVader skipped packets in fragmented run? checking and trying to fix " <<endl;
5813     // query the DB for runs containing the event, loop over LEVEL0 files which could contain the level0 event and try to find it
5814     // ma nel mezzo del cammin per ogni run che pesco devo vedere la posizione relativa di iev rispetto al runheader nel livello2 per andare a cercare nel posto giusto
5815     // connect to db
5816     if (!dbc || (dbc && !dbc->IsConnected())) SetDBConnection(); //Emiliano
5817     //
5818     if (GetOrbitalInfo()){
5819     abstime = GetOrbitalInfo()->absTime;
5820     } else {
5821     printf(" PamLevel2::GetYodaEntry() ERROR! no OrbitalInfo, cannot get the absolute time for event \n");
5822     return 0;
5823     }
5824     // query DB looking for runs containing the processed event
5825     TSQLResult *pResult;
5826     TSQLRow *Row = NULL;
5827     TString myquery = Form("select ID,NEVENTS from GL_RUN where RUNHEADER_TIME<=%lld and RUNTRAILER_TIME>=%lld;",abstime,abstime);
5828     if ( DBG ) printf(" query is %s \n",myquery.Data());
5829     // printf(" query is %s \n",myquery.Data());// TOGLITOGLI
5830     pResult = dbc->Query(myquery.Data());
5831     if (!pResult->GetRowCount()){
5832     printf(" PamLevel2::GetYodaEntry() ERROR! event is not included in any run!!! \n");
5833     cout << " OK this is a bug, write to Emiliano, Emiliano.Mocchiutti@ts.infn.it " << endl;
5834     cout << "\nFor bug reporting instructions, please see for example:\n";
5835     cout << " <http://www.ts.infn.it/~mocchiut/bugs/bugs.html>.\n";
5836     cout << " " << endl;
5837     return 0;
5838     }
5839     if ( pResult->GetRowCount() == 1 ){
5840     if (DBG) printf(" PamLevel2::GetYodaEntry() - WARNING - YodaEntry not found but only one run containing the event, it should not happen \n");
5841     // printf(" PamLevel2::GetYodaEntry() - WARNING - YodaEntry not found but only one run containing the event, it should not happen \n");//TOGLITOGLI
5842     }
5843     for( Int_t ru=0; ru < pResult->GetRowCount(); ru++){ // loop over runs containing the event
5844     if (Row) delete Row;
5845     Row = pResult->Next();
5846     if( Row == NULL ) break;
5847     UInt_t idrun = (UInt_t)atoll(Row->GetField(0));
5848     UInt_t nev = (UInt_t)atoll(Row->GetField(1));
5849     if (DBG) printf(" inside loop over runs: ru %i idrun %i nev %i \n",ru,idrun,nev);
5850     // printf(" inside loop over runs: ru %i idrun %i nev %i \n",ru,idrun,nev);//TOGLITOGLI
5851    
5852     // now look for this run in the level2 file, it must be present! code is taken from updateruninfo of course
5853     Bool_t rfound = false;
5854     totrunentry = 0LL;
5855     runfirstentry = 0LL;
5856     for (Int_t r=0; r< run_tree->GetEntries();r++){
5857     run_tree->GetEntry(r);//update runinfo
5858     if ( r > 0 ){
5859     totrunentrymin = totrunentrymax+1;
5860     } else {
5861     totrunentrymin = 0LL;
5862     }
5863     totrunentry += GetRunInfo()->NEVENTS;
5864     totrunentrymax = totrunentry - 1 - prevshift; // prevshift is needed to handle nested+DV_skipped packets
5865     irun = r;
5866    
5867     if (idrun == GetRunInfo()->ID){
5868     if ( totrunentrymin > iev ){ // there is a shift (nested+DV_skipped packets)
5869     if (DBG) printf("PamLevel2::GetYodaEntry - unconsistent iev - nevents, probable DBL0-L2 async\n");
5870     if (DBG) printf("PamLevel2::GetYodaEntry - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);
5871     // printf("PamLevel2::GetYodaEntry - unconsistent iev - nevents, probable DBL0-L2 async\n");
5872     // printf("PamLevel2::GetYodaEntry - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);//TOGLITOGLI
5873     prevshift += (totrunentrymin-iev); // add the new shift to total shift
5874     totrunentrymin -= (totrunentrymin-iev); // shift run position min
5875     totrunentrymax -= (totrunentrymin-iev); // shift run position max
5876     if (DBG) printf("PamLevel2::GetYodaEntry - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);
5877     // printf("PamLevel2::GetYodaEntry - totrunentrymin %lld iev %lld prevshift %lld totrunentrymax %lld \n",totrunentrymin,iev,prevshift,totrunentrymax);//TOGLITOGLI
5878     }
5879     runfirstentry = totrunentrymin; // first entry of the run in the level2
5880    
5881 pam-fi 1.81
5882 mocchiut 1.90 //
5883     if (gltsync)
5884     delete gltsync; // Emiliano
5885     if (!dbc || (dbc && !dbc->IsConnected()))
5886     SetDBConnection(); //Emiliano
5887     gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0, "ID", dbc, false); // Emiliano
5888     if (dbc){
5889     dbc->Close(); // Emiliano
5890     delete dbc;
5891     dbc=0;
5892     }
5893     if (gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) > gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT)) { // Emiliano
5894     cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- irun " << irun
5895     << " has RUNHEADER_OBT>=RUNTRAILER_OBT " << endl;
5896     cout
5897     << " (NB!! in this case some events could be assigned to a wrong run)"
5898     << endl;
5899     }
5900     //
5901     if (DBG) printf(" found \n");
5902     // printf(" found \n");//TOGLITOGLI
5903     rfound = true;
5904     //
5905     break;
5906     }
5907     } // loop over run
5908     if ( !rfound ){
5909     printf(" PamLevel2::GetYodaEntry() ERROR! run is not present in the level2 file!!! \n");
5910     cout << " OK this is a bug, write to Emiliano, Emiliano.Mocchiutti@ts.infn.it " << endl;
5911     cout << "\nFor bug reporting instructions, please see for example:\n";
5912     cout << " <http://www.ts.infn.it/~mocchiut/bugs/bugs.html>.\n";
5913     cout << " " << endl;
5914     return 0;
5915     }
5916 pam-fi 1.9
5917 mocchiut 1.90 // here we got the first run and we can check if it contains the level0 event
5918     if (!GetYodaTree()){
5919     printf(" PamLevel2::GetYodaEntry() : ERROR no level0 file loaded!\n");
5920     return 0;
5921     }
5922    
5923     // get the current run entry
5924     irunentry = iev - runfirstentry;
5925     if (irunentry < 0) {
5926     if (DBG) cout << "Int_t PamLevel2::GetYodaEntry() -- ATTENZIONE -- irunentry negativo?!?! "<<(Int_t)irunentry<<endl;
5927     // cout << "Int_t PamLevel2::GetYodaEntry() -- ATTENZIONE -- irunentry negativo?!?! "<<(Int_t)irunentry<<endl; // TOGLITOGLI
5928     irunentry = 0LL;
5929     }
5930     // ---------------------------------
5931     // if file is NOT a preselected file
5932     // ---------------------------------
5933     quellagiusta = irunentry + (Long64_t)(run_obj->EV_FROM); // prevshift already included in irunentry
5934    
5935     if (DBG){
5936     cout << " irun "<< irun << " irunentry "<< irunentry<<" run_obj->EV_FROM "<<run_obj->EV_FROM <<" quella giusta "<<quellagiusta << endl;
5937     cout << " iroot "<<iroot<<" run_obj->ID_ROOT_L0 "<<run_obj->ID_ROOT_L0<<endl;
5938     cout << " time "<< abstime << endl;
5939     }
5940     // cout << " irun "<< irun << " irunentry "<< irunentry<<" run_obj->EV_FROM "<<run_obj->EV_FROM <<" quella giusta "<<quellagiusta << endl;
5941     // cout << " iroot "<<iroot<<" run_obj->ID_ROOT_L0 "<<run_obj->ID_ROOT_L0<<endl;
5942     // cout << " time "<< abstime << endl; // TOGLITOGLI
5943    
5944     shift = 0;
5945     answer = quellagiusta + shift + yprevshift; // prevshift already included in irunentry
5946     readl0 = l0_tree->GetEntry(answer); // prevshift already included in irunentry
5947    
5948     if (DBG){
5949     printf(" siamo qua shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);
5950     }
5951     // printf(" siamo qua shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);//TOGLITOGLI
5952    
5953     while ( (obt != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) || pktn != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter())) && (quellagiusta + (Long64_t) shift) < GetYodaTree()->GetEntries() && shift < maxshift ){
5954     if (shift > 0) {
5955 mocchiut 1.93 if (DBG) cout << " PKTNUM L2 --- " << pktn << " --- L0 --- " << GetEventHeader()->GetPscuHeader()->GetCounter() << endl;
5956 mocchiut 1.90 if (DBG)
5957     cout << " RUN: ID " << GetRunInfo()->ID << " ID_ROOT_L0 " << run_obj->ID_ROOT_L0 << " ID_RUN_FRAG "
5958     << GetRunInfo()->ID_RUN_FRAG << " EV_FROM " << GetRunInfo()->EV_FROM << endl;
5959     if (DBG)
5960     cout << " L2 <--> L0 mismatch ( irun " << irun << " irunentry " << irunentry << " shift " << shift
5961     << " prevshift " << prevshift << " )" << endl;
5962     }
5963     answer = quellagiusta + shift+ yprevshift;
5964     readl0 = l0_tree->GetEntry(answer);
5965     // printf(" inside inside while shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);//TOGLITOGLI
5966    
5967     if (!GetEventHeader()) {
5968     cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing EventHeader " << endl;
5969     return 0;
5970     }
5971     //
5972     if (yprevshift != 0 && (quellagiusta + (Long64_t) shift) == GetYodaTree()->GetEntries()) {
5973     if (DBG) printf(" reset inside while shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);
5974     // printf(" reset inside while shift %lld yprevshift %lld answer %lld \n",shift,yprevshift,answer);//TOGLITOGLI
5975     yprevshift = 0;
5976     shift = -1;
5977     };
5978    
5979     shift++;
5980     }
5981    
5982     if ( obt != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) || pktn != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()) ){
5983     //still not the good run... continue with the nex one!
5984     printf("still not the good run... continue with the nex one!\n");
5985     } else {
5986     if (DBG) cout << "LA ENTRY GIUSTA E`: "<<quellagiusta<<" (spero...)"<<endl;
5987     // cout << "LA ENTRY GIUSTA E`: "<<answer<<" (spero...)"<<endl;//TOGLITOGLI
5988     if (shift > 1) yprevshift = (shift - 1);
5989     if (Row) delete Row;
5990     delete pResult;
5991     if (dbc){
5992     dbc->Close(); // Emiliano
5993     delete dbc;
5994     dbc=0;
5995     }
5996     il0entry = answer;
5997     return readl0;
5998     }
5999     // perhaps it is all
6000     }// loop over runs containing the event
6001     if (Row) delete Row;
6002     delete pResult;
6003     if (dbc){
6004     dbc->Close(); // Emiliano
6005     delete dbc;
6006     dbc=0;
6007     }
6008     // arriving here it means no run found, cannot be! error!
6009     printf(" PamLevel2::GetYodaEntry() ERROR! run is not present in the level0 files!!! \n");
6010     cout << " OK this is a bug, write to Emiliano, Emiliano.Mocchiutti@ts.infn.it " << endl;
6011     cout << "\nFor bug reporting instructions, please see for example:\n";
6012     cout << " <http://www.ts.infn.it/~mocchiut/bugs/bugs.html>.\n";
6013     cout << " " << endl;
6014     return 0;
6015     } else {
6016     if (DBG) cout << "=> LA ENTRY GIUSTA E`: "<<answer<<" (spero...)"<<endl;
6017     // cout << "=> LA ENTRY GIUSTA E`: "<<answer<<" (spero...)"<<endl;
6018     // printf("obt %lld (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) %i pktn %lld (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter() %i \n",obt,(UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()), pktn, (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()) );
6019     if (shift > 1) yprevshift = (shift - 1);
6020     il0entry = answer;
6021     return readl0;
6022     }
6023    
6024 mocchiut 1.91 /* } // if selli 0 || 2
6025 mocchiut 1.90 if ( SELLI == 1 && hasL0EE ){
6026     sel_tree->GetEntry(iev);
6027     Long64_t answer = il0entry;
6028     Int_t readl0 = 0;
6029     readl0 = l0_tree->GetEntry(answer);
6030     return readl0;
6031 mocchiut 1.91 }*/
6032 mocchiut 1.90 printf(" PamLevel2::GetYodaEntry() ERROR! \n");
6033     cout << " Entry not found! OK this is a bug, write to Emiliano, Emiliano.Mocchiutti@ts.infn.it " << endl;
6034     cout << "\nFor bug reporting instructions, please see for example:\n";
6035     cout << " <http://www.ts.infn.it/~mocchiut/bugs/bugs.html>.\n";
6036     cout << " " << endl;
6037     return 0;
6038 pam-fi 1.20 }
6039 mocchiut 1.90
6040 pam-fi 1.40 /**
6041     * \Brief Set DB connection
6042     */
6043 pam-fi 1.81 Bool_t PamLevel2::SetDBConnection() {
6044 mocchiut 1.30
6045 pam-fi 1.81 // cout << "PamLevel2::SetDBConnection()" << endl;
6046     if (DBG) {
6047     cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
6048     cout << "Connecting to DB" << endl;
6049     cout << "HOST " << host << endl;
6050     cout << "USER " << user << endl;
6051     cout << "PSW " << psw << endl;
6052     }
6053 mocchiut 1.82 Bool_t notconn = true;
6054     Int_t trials = 0;
6055     while ( notconn && trials < 10 ){
6056     // gSystem->Sleep(500);
6057     dbc = TSQLServer::Connect(host.Data(), user.Data(), psw.Data());
6058     //dbc->Connect(host.Data(), user.Data(), psw.Data());
6059     if ( dbc ) notconn = false;
6060     if (DBG) printf("<%i> test connection...\n ",trials);
6061     if (!dbc){
6062     if (DBG) printf(" :( failed, no pointer \n");
6063     notconn = true;
6064     // return false;
6065     };
6066     if (dbc && !dbc->IsConnected()){
6067     if (DBG) printf(" :( failed, no connection \n");
6068     notconn = true;
6069     // return false;
6070     };
6071     trials++;
6072     };
6073     if ( notconn ) return false;
6074     //
6075     if (DBG) printf("=connected!\n");
6076 pam-fi 1.81 stringstream myquery; // EMILIANO
6077     myquery.str(""); // EMILIANO
6078     myquery << "SET time_zone='+0:00'"; // EMILIANO
6079     dbc->Query(myquery.str().c_str()); // EMILIANO
6080 mocchiut 1.82 if ( DBG ) printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
6081 pam-fi 1.81 return true;
6082 mocchiut 1.30
6083 pam-fi 1.40 }
6084 pam-fi 1.45
6085     /**
6086     * \Brief Add a friend to the pamela chain.
6087     * @param cname name of the chain to be added
6088     */
6089    
6090 pam-fi 1.81 TChain* PamLevel2::AddFriend(TString cname) {
6091 pam-fi 1.45
6092 pam-fi 1.81 if (!GetPamTree()) {
6093     cout << " TChain* PamLevel2::AddFriend(TString cname) --- a pamela tree must be created first" << endl;
6094     return NULL;
6095     }
6096 pam-fi 1.45
6097 pam-fi 1.81 TChain *c = new TChain(cname.Data());
6098 pam-fi 1.45
6099 pam-fi 1.81 TIter next(GetPamTree()->GetListOfFiles());
6100     Int_t nf = 0;
6101     TChainElement* element = 0;
6102     while ((element = (TChainElement*) next())) {
6103     c->Add(element->GetTitle());
6104     nf++;
6105     }
6106 pam-fi 1.45
6107 pam-fi 1.81 GetPamTree()->AddFriend(cname.Data());
6108 pam-fi 1.45
6109 pam-fi 1.81 cout << "external chain created and added to pamela friends :" << cname << endl;
6110     cout << "n.files " << nf << endl;
6111 pam-fi 1.45
6112 pam-fi 1.81 return c;
6113 pam-fi 1.45
6114 pam-fi 1.81 }
6115 pam-fi 1.45
6116 pam-fi 1.81 /**
6117     * Returns the current read entry. This method simply returns the result of the call to
6118     * pam_tree->GetReadEntry(), so it is entirely handled by ROOT.
6119     */
6120     Long64_t PamLevel2::GetReadEntry() {
6121     return pam_tree->GetReadEntry();
6122 pam-fi 1.45 }
6123 pam-fi 1.52
6124 pam-fi 1.81 /**
6125     * Sets the sorting method. If the new method is different from the previous, the issorted
6126     * flag is set to false, forcing a new sort the next time GetTrack is called.
6127     * @see GetTrack
6128     */
6129     void PamLevel2::SetSortingMethod(TString how) {
6130     if (howtosort != how) {
6131     issorted = false;
6132 pam-ts 1.95 issorted_new = false;
6133 pam-fi 1.81 }
6134     howtosort = how;
6135     }

  ViewVC Help
Powered by ViewVC 1.1.23