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

Diff of /PamelaLevel2/src/PamLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.18 by pam-fi, Thu Jan 18 08:51:16 2007 UTC revision 1.86 by mocchiut, Tue May 11 07:26:27 2010 UTC
# Line 1  Line 1 
1  #include <PamLevel2.h>  #include <PamLevel2.h>
2    
3    /////////////////////////////////////////////////////////////////////////////
4    /////////////////////////////////////////////////////////////////////////////
5    /////////////////////////////////////////////////////////////////////////////
6    /////////////////////////////////////////////////////////////////////////////
7    
8    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    }
29    
30    void GPamela::Delete() {
31    
32      Clear();
33    
34      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    
135    }
136    ;
137    
138    void GPamela::SetBranchAddress(TChain* fhBookTree) {
139    
140      //    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    
262      //    fhBookTree->SetBranchStatus("*",0);
263    
264    }
265    
266    ClassImp( GPamela);
267    
268    /////////////////////////////////////////////////////////////////////////////
269    /////////////////////////////////////////////////////////////////////////////
270    /////////////////////////////////////////////////////////////////////////////
271    /////////////////////////////////////////////////////////////////////////////
272  //--------------------------------------  //--------------------------------------
273  //  //
274  //  //
275  //--------------------------------------  //--------------------------------------
276  /**  /**
277   * Default constructor   * Default constructor
278   */   */
279  PamTrack::PamTrack(){  PamTrack::PamTrack() {
280      trk_track  = 0;    trk_track = 0;
281      calo_track = 0;    calo_track = 0;
282      tof_track  = 0;    tof_track = 0;
283      candeleteobj = 0;    orb_track = 0;
284  };    candeleteobj = 0;
285      pscore = 0;
286      iscore = 0;
287    }
288    ;
289  //--------------------------------------  //--------------------------------------
290  //  //
291  //  //
292  //--------------------------------------  //--------------------------------------
293  /**  /**
294   * Constructor   * Constructor
295   */   */
296  PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o){  PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o, OrbitalInfoTrkVar *r) {
297    
298      trk_track  = 0;    trk_track = 0;
299      calo_track = 0;    calo_track = 0;
300      tof_track  = 0;    tof_track = 0;
301  //     if(t)trk_track  = new TrkTrack(*t);    orb_track = 0;
302  //     if(c)calo_track = new CaloTrkVar(*c);    //     if(t)trk_track  = new TrkTrack(*t);
303  //     if(o)tof_track  = new ToFTrkVar(*o);    //     if(c)calo_track = new CaloTrkVar(*c);
304      if(t)trk_track  = t;    //     if(o)tof_track  = new ToFTrkVar(*o);
305      if(c)calo_track = c;    if (t)
306      if(o)tof_track  = o;      trk_track = t;
307      candeleteobj = 0;    if (c)
308        calo_track = c;
309  };    if (o)
310  PamTrack::PamTrack(const PamTrack& track){      tof_track = o;
311      if (r)
312      TrkTrack   *t = track.trk_track;      orb_track = r;
313      CaloTrkVar *c = track.calo_track;  
314      ToFTrkVar  *o = track.tof_track;    candeleteobj = 0;
315    
316    }
317    ;
318    PamTrack::PamTrack(const PamTrack& track) {
319    
320      trk_track  = 0;    TrkTrack *t = track.trk_track;
321      CaloTrkVar *c = track.calo_track;
322      ToFTrkVar *o = track.tof_track;
323      OrbitalInfoTrkVar *r = track.orb_track;
324    
325      trk_track = 0;
326      calo_track = 0;
327      tof_track = 0;
328      orb_track = 0;
329      if (t)
330        trk_track = new TrkTrack(*t);
331      if (c)
332        calo_track = new CaloTrkVar(*c);
333      if (o)
334        tof_track = new ToFTrkVar(*o);
335      if (r)
336        orb_track = new OrbitalInfoTrkVar(*r);
337      candeleteobj = 1;
338    
339    }
340    void PamTrack::Clear() {
341    
342      //    cout << "PamTrack::Clear() "<<candeleteobj<<endl;
343      if (candeleteobj) {
344        if (trk_track)
345          trk_track->TrkTrack::Clear();
346        if (calo_track)
347          calo_track->CaloTrkVar::Clear();//???
348        if (tof_track)
349          tof_track->ToFTrkVar::Clear();//???
350        if (orb_track)
351          orb_track->OrbitalInfoTrkVar::Clear();//???
352      }
353      else {
354        trk_track = 0;
355      calo_track = 0;      calo_track = 0;
356      tof_track  = 0;      tof_track = 0;
357      if(t)trk_track  = new TrkTrack(*t);      orb_track = 0;
358      if(c)calo_track = new CaloTrkVar(*c);    }
359      if(o)tof_track  = new ToFTrkVar(*o);    pscore = 0;
360      candeleteobj = 1;    iscore = 0;
361        
362  }  }
363  void PamTrack::Clear(){  void PamTrack::Delete() {
364      //    cout << "PamTrack::Delete() "<<candeleteobj<<endl;
365  //    cout << "PamTrack::Clear() "<<candeleteobj<<endl;    if (candeleteobj) {
366      if(candeleteobj){      if (trk_track) {
367          if(trk_track)  trk_track->TrkTrack::Clear();        trk_track->TrkTrack::Clear();
368          if(calo_track) calo_track->CaloTrkVar::Clear();//???        delete trk_track;
369          if(tof_track)  tof_track->ToFTrkVar::Clear();//???      }
370      }else{      if (calo_track) {
371          trk_track  = 0;        calo_track->CaloTrkVar::Clear();//???
372          calo_track = 0;        delete calo_track;
373          tof_track  = 0;      }
374      }      if (tof_track) {
375  }        tof_track->ToFTrkVar::Clear();//???
376  void PamTrack::Delete(){        delete tof_track;
377  //    cout << "PamTrack::Delete() "<<candeleteobj<<endl;      }
378      if(candeleteobj){      if (orb_track) {
379          if(trk_track)  {        orb_track->OrbitalInfoTrkVar::Clear();//???
380              trk_track->TrkTrack::Clear();        delete orb_track;
             delete trk_track;  
         }  
         if(calo_track){  
             calo_track->CaloTrkVar::Clear();//???  
             delete calo_track;  
         }  
         if(tof_track){  
             tof_track->ToFTrkVar::Clear();//???  
             delete tof_track;  
         }  
     }else{  
         Clear();  
381      }      }
382      }
383      else {
384        Clear();
385      }
386  }  }
387  //--------------------------------------  //--------------------------------------
388  //  //
389  //  //
390  //--------------------------------------  //--------------------------------------
391  /**  /**
392   * Constructor   * Default Constructor
393   */   */
394  PamLevel2::PamLevel2(){  PamLevel2::PamLevel2() {
395              Initialize();
396  //     trk2_obj  = TrkLevel2::GetTrkLevel2();  }
397  //     trk1_obj  = TrkLevel1::GetTrkLevel1();  ;
398  //     trkh_obj  = TrkHough::GetTrkHough();  
399  //     calo1_obj = CaloLevel1::GetCaloLevel1();  /**
400  //     calo2_obj = CaloLevel2::GetCaloLevel2();   * Constructor
401  //     tof_obj   = ToFLevel2::GetToFLevel2();   * @param ddir Name of directory where level2 files are stored.
402  //     trig_obj  = TrigLevel2::GetTrigLevel2();   * @param list Name of an ascii file containing the list of file names
403  //     s4_obj    = S4Level2::GetS4Level2();   * @param detlist Options to chose what to load.
404  //     nd_obj    = NDLevel2::GetNDLevel2();   * Possible options are:
405  //     ac_obj    = AcLevel2::GetAcLevel2();   *       +AUTO --> load all trees/branches in the input files
406  //     orb_obj   = OrbitalInfo::GetOrbitalInfo();   *       +(-)ALL --> inlcude(exclude) all trees/branches
407      trk2_obj  = 0;   *       +(-)TRK1+(-)TRK2+(-)CAL1+(-)CAL2+(-)TOF+(-)TRG+(-)ND+(-)S4+(-)ORB+(-)AC --> inlcude(exclude) trees and branches
408      trk1_obj  = 0;   *       +(-)TRK0 --> include(exclude) tracker level0 tree
409      trkh_obj  = 0;   *       +(-)GP --> include exclude GPAMELA output tree
410      calo1_obj = 0;   * If no options are specified, the default is assumed. Default is:
411      calo2_obj = 0;   * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB
412      tof_obj   = 0;   */
413      trig_obj  = 0;  PamLevel2::PamLevel2(TString ddir, TString llist, TString detlist) {
414      s4_obj    = 0;    Initialize();
415      nd_obj    = 0;    TList* listf = GetListOfLevel2Files(ddir, llist);
416      ac_obj    = 0;    if (listf)
417      orb_obj   = 0;      GetPamTree(listf, detlist);
418      if (listf)
419      run_obj   = 0;//new GL_RUN();      GetRunTree(listf);
420      soft_obj   = 0;// Emiliano  }
421      irun = -1;  ;
     runfirstentry = 0ULL;  
     runlastentry = 0ULL;  
422    
423      for(Int_t i=0; i<8; i++ )tree_clone[i]=NULL;  PamLevel2::PamLevel2(TString ddir, TList *llist, TString detlist) {
424      Initialize();
425      GetPamTree(llist, detlist);
426      GetRunTree(llist);
427    }
428    ;
429    /**
430     * Constructor
431     * @param ddir Name of directory where level2 files are stored.
432     * @param list Name of an ascii file containing the list of file names
433     * Default trees/branches are loaded. Default is:
434     * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB
435     */
436    PamLevel2::PamLevel2(TString ddir, TString llist) {
437      Initialize();
438      TList* listf = GetListOfLevel2Files(ddir, llist);
439      GetPamTree(listf, "");
440      GetRunTree(listf);
441    }
442    ;
443    
444  //    sorted_tracks = 0;//new TRefArray();  void PamLevel2::Initialize() {
       
     CAL1 = true;  
     CAL2 = true;  
     TRK2 = true;  
     TRK1 = false;  
     TRKh = false;  
     TRG = true;  
     TOF = true;  
     S4  = true;  
     ND  = true;  
     AC  = true;  
     ORB = true;  
       
     RUN = true;  
445    
446      tsorted=0;    h0_obj = 0;
447      timage=0;    trk0_obj = 0;
448      calo0_obj = 0;
449    
450      trk2_obj = 0;
451      trk1_obj = 0;
452      trkh_obj = 0;
453      calo1_obj = 0;
454      calo2_obj = 0;
455      tof_obj = 0;
456      trig_obj = 0;
457      s4_obj = 0;
458      nd_obj = 0;
459      ac_obj = 0;
460      orb_obj = 0;
461      gp_obj = 0;
462    
463      run_obj = 0;//new GL_RUN();
464      soft_obj = 0;// Emiliano
465      irun = -1LL;
466      irunt = -1LL;
467      runfirstentry = 0LL;
468      runlastentry = 0LL;
469      gltsync = 0; // Emiliano
470      fUpdateRunInfo = true; // Emiliano
471    
472      l0_file = NULL;
473      l0_tree = NULL;
474      iroot = -1;
475      dbc = 0;
476    
477      prevshift = 0;
478      maxshift = 10; //EMILIANO
479    
480      run_tree = NULL;
481      run_tree_clone = NULL;
482      sel_tree = NULL;
483      sel_tree_clone = NULL;
484    
485      irunentry = -1LL;
486      pam_tree = NULL;
487      for (Int_t i = 0; i < NCLONES; i++)
488        pam_tree_clone[i] = NULL;
489    
490      totdltime[0] = 0LL;
491      totdltime[1] = 0LL;
492      totdltime[2] = 0LL;
493    
494      host = "mysql://localhost/pamelaprod";
495      user = "anonymous";
496      psw = "";
497      const char *pamdbhost = gSystem->Getenv("PAM_DBHOST");
498      const char *pamdbuser = gSystem->Getenv("PAM_DBUSER");
499      const char *pamdbpsw = gSystem->Getenv("PAM_DBPSW");
500      if (!pamdbhost)
501        pamdbhost = "";
502      if (!pamdbuser)
503        pamdbuser = "";
504      if (!pamdbpsw)
505        pamdbpsw = "";
506      if (strcmp(pamdbhost, ""))
507        host = pamdbhost;
508      if (strcmp(pamdbuser, ""))
509        user = pamdbuser;
510      if (strcmp(pamdbpsw, ""))
511        psw = pamdbpsw;
512    
513      //    sorted_tracks = 0;//new TRefArray();
514    
515      CAL0 = false;
516      CAL1 = true;
517      CAL2 = true;
518      TRK2 = true;
519      TRK1 = false;
520      TRK0 = false;
521      TRKh = false;
522      TRG = true;
523      TOF = true;
524      TOF0 = false;
525      S4 = true;
526      ND = true;
527      AC = true;
528      ORB = true;
529      GP = false;
530    
531      RUN = true;
532    
533      SELLI = -1;
534    
535      ISGP = false;
536    
537      DBG = false;
538    
539      tsorted = 0;
540      timage = 0;
541    
542      howtosort = "+CAL+TOF";
543      //howtosort = "+TOF";
544      sortthr = 100.;
545    
546  };    issorted = false;
547      lastsorted = -1;
548    
549    }
550    ;
551  /**  /**
552   * Delete the event (act as Dtor)   * Delete the event (act as Dtor)
553   */   */
554  void PamLevel2::Delete(){  void PamLevel2::Delete() {
555            
556      if(run_obj)delete run_obj;    if (run_obj)
557      if(soft_obj)delete soft_obj; //Emiliano      delete run_obj;
558      if (soft_obj)
559  //    cout << "void PamLevel2::Clear()"<<endl;      delete soft_obj; //Emiliano
560      if(trk1_obj) delete trk1_obj;        
561      if(trk2_obj) delete trk2_obj;    //    cout << "void PamLevel2::Clear()"<<endl;
562      if(trkh_obj) delete trkh_obj;    if (h0_obj)
563      if(calo1_obj)delete calo1_obj;      delete h0_obj;
564      if(calo2_obj)delete calo2_obj;    if (trk0_obj)
565      if(tof_obj)  delete tof_obj;      delete trk0_obj;
566      if(trig_obj) delete trig_obj;    if (calo0_obj)
567      if(s4_obj)   delete s4_obj;      delete calo0_obj;
568      if(nd_obj)   delete nd_obj;    if (trk1_obj)
569      if(ac_obj)   delete ac_obj;      delete trk1_obj;
570      if(orb_obj)  delete orb_obj;    if (trk2_obj)
571            delete trk2_obj;
572      if(tsorted){    if (trkh_obj)
573          tsorted->Delete();      delete trkh_obj;
574          delete tsorted;    if (calo1_obj)
575      }      delete calo1_obj;
576      if(timage){    if (calo2_obj)
577          timage->Delete();      delete calo2_obj;
578          delete timage;    if (tof_obj)
579      }      delete tof_obj;
580  };    if (trig_obj)
581        delete trig_obj;
582      if (s4_obj)
583        delete s4_obj;
584      if (nd_obj)
585        delete nd_obj;
586      if (ac_obj)
587        delete ac_obj;
588      if (orb_obj)
589        delete orb_obj;
590      if (gp_obj)
591        delete gp_obj;
592    
593      if (tsorted) {
594        tsorted->Delete();
595        delete tsorted;
596      }
597      if (timage) {
598        timage->Delete();
599        delete timage;
600      }
601    
602      if (dbc) {
603        dbc->Close();
604        delete dbc;
605        dbc=0;
606      }
607    
608      if (gltsync)
609        delete gltsync;
610    
611      if (l0_file)
612        l0_file->Close();
613      //    if(pam_tree)pam_tree->Delete();;
614    
615      if (pam_tree) {
616        //
617        // 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...
618        //
619        TList *temp = pam_tree->GetListOfFriends();
620        TList *contents = new TList; // create chain friend list
621        contents->SetOwner();
622        TIter next(temp);
623        TChain *questo = 0;
624        while ((questo = (TChain*) next())) {
625          TString name = questo->GetName();
626          contents->Add((TChain*) gROOT->FindObject(name.Data()));// add object to the list
627        };
628        //
629        // deleting the main chain
630        //
631        pam_tree->Delete();
632        //
633        // deleting the friends...
634        //
635        TIter next2(contents);
636        TChain *questa = 0;
637        while ( (questa = (TChain*)next2()) ) {
638          TString name = questa->GetName();
639          questa->Delete();
640          questa = NULL;
641        };
642        //
643      };
644      pam_tree = NULL;
645    
646      if (run_tree)
647        run_tree->Delete();;
648      if (sel_tree)
649        sel_tree->Delete();;
650      for (Int_t i = 0; i < NCLONES; i++)
651        if (pam_tree_clone[i])
652          pam_tree_clone[i]->Delete();;
653      if (run_tree_clone)
654        run_tree_clone->Delete();;
655      if (sel_tree_clone)
656        sel_tree_clone->Delete();;
657    
658      if (irunoffset)
659        delete[] irunoffset;
660    
661    }
662    ;
663    
664  /**  /**
665   * Clear the event (NB! does not deallocate objects)   * Clear the event (NB! does not deallocate objects)
666   */   */
667  void PamLevel2::Clear(){  void PamLevel2::Clear() {
668            
669  //    cout << "void PamLevel2::Clear()"<<endl;    //    cout << "void PamLevel2::Clear()"<<endl;
670    
671      //
672      // 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
673      // want to load them for each event even if they are the same...
674      //
675      //    if(run_obj)delete run_obj;
676      //    if(run_obj) run_obj->Clear();  // Emiliano: Do not deallocate run_obj here, it will give segmentation fault! call clear instead
677      //    if(soft_obj) soft_obj->Clear();
678    
679      if (h0_obj)
680        h0_obj->Clear();
681      //    if(trk0_obj) trk0_obj->Clear();
682      if (trk1_obj)
683        trk1_obj->Clear();
684      if (trk2_obj)
685        trk2_obj->Clear();
686      if (trkh_obj)
687        trkh_obj->Clear();
688      if (calo0_obj)
689        calo0_obj->Clear();
690      if (calo1_obj)
691        calo1_obj->Clear();
692      if (calo2_obj)
693        calo2_obj->Clear();
694      if (tof_obj)
695        tof_obj->Clear();
696      if (trig_obj)
697        trig_obj->Clear();
698      if (s4_obj)
699        s4_obj->Clear();
700      if (nd_obj)
701        nd_obj->Clear();
702      if (ac_obj)
703        ac_obj->Clear();
704      if (orb_obj)
705        orb_obj->Clear();
706      if (gp_obj)
707        gp_obj->Clear();
708    
709      //    if(sorted_tracks)sorted_tracks->Clear();
710      //    sorted_tracks.Clear();
711    
712      if (tsorted) {
713        tsorted->Delete();
714      }
715      if (timage) {
716        timage->Delete();
717      }
718    }
719    ;
720    
721    void PamLevel2::Reset() {
722      //
723      // First of all clear everything
724      //
725      Clear();
726      //
727      // close and reset chains and pointers
728      //
729      if (pam_tree) {
730        //
731        // 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...
732        //
733        TList *temp = pam_tree->GetListOfFriends();
734        TList *contents = new TList; // create chain friend list
735        contents->SetOwner();
736        TIter next(temp);
737        TChain *questo = 0;
738        while ((questo = (TChain*) next())) {
739          TString name = questo->GetName();
740          contents->Add((TChain*) gROOT->FindObject(name.Data()));// add object to the list
741        };
742        //
743        // deleting the main chain
744        //
745        pam_tree->Delete();
746        //
747        // deleting the friends...
748        //
749        TIter next2(contents);
750        TChain *questa = 0;
751        while ( (questa = (TChain*) next2()) ) {
752          TString name = questa->GetName();
753          questa->Delete();
754          questa = NULL;
755        };
756        //
757      };
758      pam_tree = NULL;
759      //
760      if (run_tree)
761        run_tree->Delete();;
762      run_tree = NULL;
763      if (sel_tree)
764        sel_tree->Delete();;
765      sel_tree = NULL;
766      //
767      // Close file
768      //
769      if (l0_file)
770        l0_file->Close("R");
771      l0_file = NULL;
772      //
773      h0_obj = 0;
774      trk0_obj = 0;
775      calo0_obj = 0;
776      //
777      trk2_obj = 0;
778      trk1_obj = 0;
779      trkh_obj = 0;
780      calo1_obj = 0;
781      calo2_obj = 0;
782      tof_obj = 0;
783      trig_obj = 0;
784      s4_obj = 0;
785      nd_obj = 0;
786      ac_obj = 0;
787      orb_obj = 0;
788      gp_obj = 0;
789      //
790      // Reset run pointers
791      //
792      run_obj = 0;//new GL_RUN();
793      soft_obj = 0;// Emiliano
794      irun = -1;
795      irunt = -1;
796      runfirstentry = 0ULL;
797      runlastentry = 0ULL;
798      //
799      totdltime[0] = 0LL;
800      totdltime[1] = 0LL;
801      totdltime[2] = 0LL;
802      //
803    }
804    ;
805    
806    Bool_t PamLevel2::IsGood(Bool_t strict) {
807      Bool_t goodev = true;
808      //
809      if (calo2_obj && !calo2_obj->IsGood(strict))
810        goodev = false;
811      //
812      if (strict) {
813        if (trk2_obj && trk2_obj->UnpackError() != 0)
814          goodev = false;
815        if (tof_obj && tof_obj->unpackError != 0)
816          goodev = false;
817        if (trig_obj && trig_obj->unpackError != 0)
818          goodev = false;
819        if (s4_obj && s4_obj->unpackError != 0)
820          goodev = false;
821        if (nd_obj && nd_obj->unpackError != 0)
822          goodev = false;
823        if (ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0] >> 2) & 1) || ((ac_obj->status[1] >> 2) & 1)))
824          goodev = false;
825        //  if(orb_obj)
826      }
827      else {
828        if (nd_obj && nd_obj->unpackError != 0)
829          goodev = false;
830        if (ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0] >> 2) & 1) || ((ac_obj->status[1] >> 2) & 1)))
831          goodev = false;
832      };
833      return (goodev);
834    }
835    ;
836    
837    void PamLevel2::SkipRunInfoUpdate(){
838      printf("\n\n ******** WARNING ******** \n Skip DB connections, DO NOT USE PamLevel2::GetRunInfo() method! \n\n");
839      fUpdateRunInfo = false;
840      this->SetSELLI(2);
841      printf(" ===============> W A R N I N G <================ \n");
842      printf(" in case PamLevel2::CreateCloneTrees() will be called \n");
843      printf(" it will be reverted to PadmeAmidala level2 structure , i.e. NO SELECTIONLIST WILL BE CREATED IN THE NEW LEVEL2 FILE! \n\n");
844      if ( run_tree_clone ){
845        printf(" ===============> W A R N I N G <================ \n");
846        printf(" PamLevel2::SkipRunIndoUpdate or PamLevel2::NoDBconnections() has been called together with PamLevel2::CreateCloneTrees() \n");
847        printf(" TO AVOID CRASHES call PamLevel2::CreateCloneTrees() after PamLevel2::SkipRunIndoUpdate or PamLevel2::NoDBconnections() \n");    
848      };
849    }
850    
851    //--------------------------------------
852  //  //
 // 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  
 // want to load them for each event even if they are the same...  
853  //  //
854  //    if(run_obj)delete run_obj;  //--------------------------------------
855  //    if(run_obj) run_obj->Clear();  // Emiliano: Do not deallocate run_obj here, it will give segmentation fault! call clear instead  void *PamLevel2::GetPointerTo(const char* c) {
 //    if(soft_obj) soft_obj->Clear();  
856    
857      if(trk1_obj) trk1_obj->Clear();        TString objname = c;
     if(trk2_obj) trk2_obj->Clear();  
     if(trkh_obj) trkh_obj->Clear();  
     if(calo1_obj)calo1_obj->Clear();  
     if(calo2_obj)calo2_obj->Clear();  
     if(tof_obj)  tof_obj->Clear();  
     if(trig_obj) trig_obj->Clear();  
     if(s4_obj)   s4_obj->Clear();  
     if(nd_obj)   nd_obj->Clear();  
     if(ac_obj)   ac_obj->Clear();  
     if(orb_obj)  orb_obj->Clear();  
       
 //    if(sorted_tracks)sorted_tracks->Clear();  
 //    sorted_tracks.Clear();  
858    
859      if(tsorted){    if (!objname.CompareTo("TrkLevel1")) {
860          tsorted->Delete();      if (!trk1_obj) {
861          trk1_obj = new TrkLevel1();
862          trk1_obj->Set();
863        }
864        return &trk1_obj;
865      };
866      if (!objname.CompareTo("TrkLevel2")) {
867        if (!trk2_obj) {
868          trk2_obj = new TrkLevel2();
869          trk2_obj->Set();
870        }
871        return &trk2_obj;
872      };
873      if (!objname.CompareTo("TrkHough")) {
874        if (!trkh_obj) {
875          trkh_obj = new TrkHough();
876          trkh_obj->Set();
877        }
878        return &trkh_obj;
879      };
880      if (!objname.CompareTo("CaloLevel1")) {
881        if (!calo1_obj)
882          calo1_obj = new CaloLevel1();
883        return &calo1_obj;
884      };
885      if (!objname.CompareTo("CaloLevel2")) {
886        if (!calo2_obj) {
887          calo2_obj = new CaloLevel2();
888          calo2_obj->Set();
889        };
890        return &calo2_obj;
891      };
892      if (!objname.CompareTo("ToFLevel2")) {
893        if (!tof_obj) {
894          tof_obj = new ToFLevel2();
895          tof_obj->Set();
896      }      }
897      if(timage){      return &tof_obj;
898          timage->Delete();    };
899      if (!objname.CompareTo("TrigLevel2")) {
900        if (!trig_obj)
901          trig_obj = new TrigLevel2();
902        return &trig_obj;
903      };
904      if (!objname.CompareTo("S4Level2")) {
905        if (!s4_obj)
906          s4_obj = new S4Level2();
907        return &s4_obj;
908      };
909      if (!objname.CompareTo("NDLevel2")) {
910        if (!nd_obj)
911          nd_obj = new NDLevel2();
912        return &nd_obj;
913      };
914      if (!objname.CompareTo("AcLevel2")) {
915        if (!ac_obj)
916          ac_obj = new AcLevel2();
917        return &ac_obj;
918      };
919      if (!objname.CompareTo("OrbitalInfo")) {
920        if (!orb_obj) {
921          orb_obj = new OrbitalInfo();
922          orb_obj->Set();
923      }      }
924            return &orb_obj;
925  };    };
926      //     if(!objname.CompareTo("OrbitalInfo")){
927      //    if(!orb_obj)   orb_obj   = new OrbitalInfo();
928      //    return &orb_obj;
929      //     };
930      if (!objname.CompareTo("GPamela")) {
931        if (!gp_obj)
932          gp_obj = new GPamela();
933        return &gp_obj;
934      };
935    
936      if (!objname.CompareTo("RunInfo"))
937        return &run_obj;
938    
939      if (!objname.CompareTo("SoftInfo"))
940        return &soft_obj; // Emiliano
941    
942      return NULL;
943    }
944    ;
945  //--------------------------------------  //--------------------------------------
946  //  //
947  //  //
948  //--------------------------------------  //--------------------------------------
949  void *PamLevel2::GetPointerTo(const char* c ){  /**
950     * Retrieves the calorimeter track matching the seqno-th tracker stored track.
951     * (If seqno = -1 retrieves the self-trigger calorimeter track)
952     */
953    CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno) {
954    
955      TString objname = c;    if (!calo2_obj)
956        return 0;
957    
958      if(!objname.CompareTo("TrkLevel1"))  {    if (calo2_obj->CaloLevel2::ntrk() == 0) {
959          if(!trk1_obj){      cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo " << seqno
960              trk1_obj  = new TrkLevel1();          << " but no Calorimeter tracks are stored" << endl;
961              trk1_obj->Set();      return NULL;
962          }    };
963          return &trk1_obj;  
964      };    CaloTrkVar *c = 0;
965      if(!objname.CompareTo("TrkLevel2"))  {    Int_t it_calo = 0;
966          if(!trk2_obj){    
967              trk2_obj  = new TrkLevel2();    do {
968              trk2_obj->Set();      c = calo2_obj->CaloLevel2::GetCaloTrkVar(it_calo);
969          }      it_calo++;
970          return &trk2_obj;    } while (c && seqno != c->trkseqno && it_calo < calo2_obj->CaloLevel2::ntrk());
971      };  
972      if(!objname.CompareTo("TrkHough"))   {    if (!c || seqno != c->trkseqno) {
973          if(!trkh_obj)  trkh_obj  = new TrkHough();      c = 0;
974          return &trkh_obj;      if (seqno != -1)
975      };        cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo " << seqno
976      if(!objname.CompareTo("CaloLevel1")) {            << " does not match Calorimeter stored tracks" << endl;
977          if(!calo1_obj) calo1_obj = new CaloLevel1();    };
978          return &calo1_obj;    return c;
979      };  
980      if(!objname.CompareTo("CaloLevel2")) {  }
981          if(!calo2_obj){  ;
982              calo2_obj = new CaloLevel2();  //--------------------------------------
983              calo2_obj->Set();  //
984          };  //
985          return &calo2_obj;  //--------------------------------------
986      };  /**
987      if(!objname.CompareTo("ToFLevel2"))  {   * Retrieves the ToF track matching the seqno-th tracker stored track.
988          if(!tof_obj){   * (If seqno = -1 retrieves the tracker-independent tof track)
989              tof_obj   = new ToFLevel2();   */
990              tof_obj->Set();  ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno) {
         }  
         return &tof_obj;  
     };  
     if(!objname.CompareTo("TrigLevel2")) {  
         if(!trig_obj)  trig_obj  = new TrigLevel2();  
         return &trig_obj;  
     };  
     if(!objname.CompareTo("S4Level2"))   {  
         if(!s4_obj)    s4_obj    = new S4Level2();  
         return &s4_obj;  
     };  
     if(!objname.CompareTo("NDLevel2"))   {  
         if(!nd_obj)    nd_obj    = new NDLevel2();  
         return &nd_obj;  
     };  
     if(!objname.CompareTo("AcLevel2"))   {  
         if(!ac_obj)    ac_obj    = new AcLevel2();  
         return &ac_obj;  
     };  
     if(!objname.CompareTo("OrbitalInfo")){  
         if(!orb_obj)   orb_obj   = new OrbitalInfo();  
         return &orb_obj;  
     };  
       
     if(!objname.CompareTo("RunInfo"))return &run_obj;  
991    
992      if(!objname.CompareTo("SoftInfo"))return &soft_obj; // Emiliano    if (!tof_obj)
993        return 0;
994    
995      if (tof_obj->ToFLevel2::ntrk() == 0) {
996        cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo " << seqno << " but no ToF tracks are stored"
997            << endl;
998      return NULL;      return NULL;
999  };    };
1000    
1001      ToFTrkVar *c = 0;
1002      Int_t it_tof = 0;
1003    
1004      do {
1005        c = tof_obj->ToFLevel2::GetToFTrkVar(it_tof);
1006        it_tof++;
1007      } while (c && seqno != c->trkseqno && it_tof < tof_obj->ToFLevel2::ntrk());
1008    
1009      if (!c || seqno != c->trkseqno) {
1010        c = 0;
1011        if (seqno != -1)
1012          cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo " << seqno
1013              << " does not match ToF stored tracks" << endl;
1014      };
1015      return c;
1016    
1017    }
1018    ;
1019    
1020  //--------------------------------------  //--------------------------------------
1021  //  //
1022  //  //
1023  //--------------------------------------  //--------------------------------------
1024  /**  /**
1025   * Retrieves the calorimeter track matching the seqno-th tracker stored track.   * Retrieves the OrbitalInfo track matching the seqno-th tracker stored track.
1026   * (If seqno = -1 retrieves the self-trigger calorimeter track)   * (If seqno = -1 retrieves the tracker-independent tof related track)
1027     */
1028    OrbitalInfoTrkVar *PamLevel2::GetOrbitalInfoStoredTrack(int seqno) {
1029    
1030      if (!orb_obj)
1031        return 0;
1032    
1033      if (orb_obj->OrbitalInfo::ntrk() == 0) {
1034        //       // TRICK BEGIN
1035        //       OrbitalInfoTrkVar  *r = new OrbitalInfoTrkVar(); // TEMPORARY TRICK
1036        //       Int_t nn = 0;
1037        //       TClonesArray &tor = *orb_obj->OrbitalInfoTrk;
1038        //       for(Int_t nt=0; nt < tof_obj->ToFLevel2::ntrk(); nt++){
1039        //  //
1040        //  ToFTrkVar *ptt = tof_obj->ToFLevel2::GetToFTrkVar(nt);
1041        //  if ( ptt->trkseqno != -1  ){
1042        //    //
1043        //    r->trkseqno = ptt->trkseqno;
1044        //    //
1045        //    r->Eij = 0;
1046        //    //
1047        //    r->Sij = 0;
1048        //    //
1049        //    r->pitch = -1000.;
1050        //    //
1051        //    r->cutoff = -1000.;
1052        //    //
1053        //    new(tor[nn]) OrbitalInfoTrkVar(*r);
1054        //    nn++;
1055        //    //
1056        //    r->Clear();
1057        //    //
1058        //  };
1059        //       };
1060        //       delete r;
1061        //       OrbitalInfoTrkVar *c = 0;
1062        //       c = orb_obj->OrbitalInfo::GetOrbitalInfoTrkVar(0);
1063        //       return c;
1064        //       //TRICK END
1065        cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo " << seqno
1066            << " but no OrbitalInfo tracks are stored" << endl;
1067        return NULL;
1068      };
1069    
1070      OrbitalInfoTrkVar *c = 0;
1071      Int_t it_tof = 0;
1072    
1073      do {
1074        c = orb_obj->OrbitalInfo::GetOrbitalInfoTrkVar(it_tof);
1075        it_tof++;
1076      } while (c && seqno != c->trkseqno && it_tof < orb_obj->OrbitalInfo::ntrk());
1077    
1078      if (!c || seqno != c->trkseqno) {
1079        c = 0;
1080        if (seqno != -1)
1081          cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo " << seqno
1082              << " does not match OrbitalInfo stored tracks" << endl;
1083      };
1084      return c;
1085    
1086    }
1087    ;
1088    
1089    //--------------------------------------
1090    //
1091    //
1092    //--------------------------------------
1093    /**
1094     * Give the pamela track associated to a tracker track, retrieving related calorimeter, orbitalinfo and tof track information.
1095   */   */
1096   CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){  PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t) {
1097        
1098       if( !calo2_obj )return 0;    cout << "PamLevel2::GetPamTrackAlong(TrkTrack* t) **obsolete** " << endl;
1099      cout << "(if you use it, remember to delete the PamTrack object)" << endl;
1100       if( calo2_obj->CaloLevel2::ntrk()==0 ){  
1101           cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no Calorimeter tracks are stored"<<endl;    CaloTrkVar *c = 0;
1102           return NULL;    ToFTrkVar *o = 0;
1103       };    OrbitalInfoTrkVar *r = 0;
1104        
1105       CaloTrkVar *c = 0;    if (CAL2)
1106       Int_t it_calo=0;      c = GetCaloStoredTrack(t->GetSeqNo());
1107          if (TOF)
1108       do{      o = GetToFStoredTrack(t->GetSeqNo());
1109           c = calo2_obj->CaloLevel2::GetCaloTrkVar(it_calo);    if (ORB)
1110           it_calo++;      r = GetOrbitalInfoStoredTrack(t->GetSeqNo());
1111       } while( c && seqno != c->trkseqno && it_calo < calo2_obj->CaloLevel2::ntrk());      
1112          //    if(t && c && o)track = new PamTrack(t,c,o);
1113       if(!c || seqno != c->trkseqno){    PamTrack *track = new PamTrack(t, c, o, r);
1114           c = 0;  
1115           if(seqno!=-1)cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match Calorimeter stored tracks"<<endl;    return track;
1116       };  
1117       return c;  }
1118        ;
  };  
 //--------------------------------------  
  //  
  //  
 //--------------------------------------  
 /**  
   * Retrieves the ToF track matching the seqno-th tracker stored track.  
   * (If seqno = -1 retrieves the tracker-independent tof track)  
  */  
  ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno){  
           
      if( !tof_obj )return 0;  
   
      if( tof_obj->ToFLevel2::ntrk()==0 ){  
          cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no ToF tracks are stored"<<endl;  
          return NULL;  
      };  
       
      ToFTrkVar *c = 0;  
      Int_t it_tof=0;  
       
      do{  
          c = tof_obj->ToFLevel2::GetToFTrkVar(it_tof);  
          it_tof++;  
      } while( c && seqno != c->trkseqno && it_tof < tof_obj->ToFLevel2::ntrk());          
       
      if(!c || seqno != c->trkseqno){  
          c = 0;  
          if(seqno!=-1)cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match ToF stored tracks"<<endl;  
      };  
      return c;  
       
  };  
   
 //--------------------------------------  
  //  
  //  
 //--------------------------------------  
 /**  
  * Give the pamela track associated to a tracker track, retrieving related calorimeter and tof track information.  
  */  
  PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t){  
       
      cout <<"PamLevel2::GetPamTrackAlong(TrkTrack* t) **obsolete** "<<endl;  
      cout <<"(if you use it, remember to delete the PamTrack object)"<<endl;  
   
      CaloTrkVar *c = 0;  
      ToFTrkVar  *o = 0;  
       
      if(CAL2) c = GetCaloStoredTrack(t->GetSeqNo());  
      if(TOF) o = GetToFStoredTrack(t->GetSeqNo());  
       
 //    if(t && c && o)track = new PamTrack(t,c,o);  
      PamTrack *track = new PamTrack(t,c,o);  
       
      return track;  
   
  };  
1119  //--------------------------------------  //--------------------------------------
1120  //  //
1121  //  //
1122  //--------------------------------------  //--------------------------------------
1123  /**  /**
1124   * Retrieves the it-th stored track.   * Retrieves the it-th stored track.
1125   * It override TrkLevel2::GetTrack(int it).   * It override TrkLevel2::GetTrack(int it).
1126   * @param itrk Track number, ranging from 0 to GetNTracks().   * @param itrk Track number, ranging from 0 to GetNTracks().
1127   */   */
1128    
1129  PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){  PamTrack* PamLevel2::GetStoredTrack(Int_t itrk) {
1130        
1131      cout <<"PamLevel2::GetStoredTrack(Int_t itrk) **to-be-updated** "<<endl;    cout << "PamLevel2::GetStoredTrack(Int_t itrk) **to-be-updated** " << endl;
1132      cout <<"for the moment, better use separately the methods: TrkLevel2::GetStoredTrack(seqno) CaloLevel2::GetCaloTrkVar(Int_t notrack) ToFLevel2::GetToFTrkVar(Int_t notrack)"<<endl;    cout
1133      cout <<"(if you use it, remember to delete the PamTrack object)"<<endl;        << "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)"
1134      PamTrack *track = 0;        << endl;
1135          cout << "(if you use it, remember to delete the PamTrack object)" << endl;
1136      if( itrk >=0 && itrk < trk2_obj->TrkLevel2::ntrk() ){    PamTrack *track = 0;
1137            
1138          TrkTrack *t = trk2_obj->TrkLevel2::GetStoredTrack(itrk);    if (itrk >= 0 && itrk < trk2_obj->TrkLevel2::ntrk()) {
1139          track = GetPamTrackAlong(t);  
1140                TrkTrack *t = trk2_obj->TrkLevel2::GetStoredTrack(itrk);
1141                track = GetPamTrackAlong(t);
1142    
1143      }
1144      else {
1145        cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo " << itrk << " does not exist (GetNTracks() = "
1146            << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl;
1147      };
1148    
1149      return track;
1150    
     }else{  
         cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;  
     };  
       
     return track;  
       
1151  }  }
1152  //--------------------------------------  //--------------------------------------
1153  //  //
1154    
1155    /**
1156     * Sort physical (tracker) tracks. Left here as backward compatibility method.
1157     **/
1158    void PamLevel2::SortTracks(TString how) {
1159      printf(
1160          " WARNING! obsolete, use SortTracks() and SetSortingMethod(TString) instead! \n Setting sorting method to %s \n",
1161          how.Data());
1162      howtosort = how;
1163      SortTracks();
1164    }
1165    ;
1166    
1167  //  //
1168  //--------------------------------------  //--------------------------------------
1169  /**  /**
1170   * Sort physical (tracker) tracks and stores them in the TRefArray (of TrkTrack objects) which pointer is  PamLevel2::sorted_tracks.   * Sort physical (tracker) tracks.
1171   * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).   * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).
1172   * Sorting cryteria:   * Sorting cryteria:
1173   * TRK: lower chi**2   * TRK: lower chi**2
1174   * CAL: lower Y spatial residual on the first calorimeter plane   * CAL: lower Y spatial residual on the first calorimeter plane
1175   * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).   * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).
1176     * S1: (ask Emiliano)
1177     * S2: (ask Emiliano)
1178     * S3: (ask Emiliano)
1179     * GP: more GP hits
1180   * The default sorting cryterium is "TOF+CAL".   * The default sorting cryterium is "TOF+CAL".
1181   *   *
1182   * 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).   * 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).
1183   */   */
1184  void PamLevel2::SortTracks(TString how){  void PamLevel2::SortTracks() {
1185    
1186  //    cout <<" PamLevel2::SortTracks(TString how) "<<endl;    //Check if the current event has already been sorted
1187      if( !trk2_obj ){    if (issorted && lastsorted == GetReadEntry()) {
1188          cout << "void PamLevel2::SortTracks(TString how):  TrkLevel2 not loaded !!!";      return;
1189          return;    }
1190      };    //Reset the sort flags, just in case something will go wrong...
1191  //    cout << "call SortTracs() "<<endl;    issorted = false;
1192      lastsorted = -1;
1193    
1194      TString how = howtosort;
1195    
1196      //  cout <<" PamLevel2::SortTracks(TString how) "<<endl;
1197      if (!trk2_obj) {
1198        cout << "void PamLevel2::SortTracks():  TrkLevel2 not loaded !!!";
1199        return;
1200      };
1201    //Save current Object count    //Save current Object count
1202      Int_t ObjectNumber = TProcessID::GetObjectCount();    Int_t ObjectNumber = TProcessID::GetObjectCount();
1203    
1204      // create TCloneArrays to store tracks and its images
1205      if (!tsorted)
1206        tsorted = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
1207      tsorted->Delete();
1208      TClonesArray &ttsorted = *tsorted;
1209    
1210      if (!timage)
1211        timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks());
1212      timage->Delete();
1213      TClonesArray &ttimage = *timage;
1214    
1215      //--------------------------------------------------
1216      // retrieve sorting method
1217      //--------------------------------------------------
1218      Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
1219      Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
1220      Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);
1221      Bool_t use_S1 = how.Contains("S1", TString::kIgnoreCase);
1222      Bool_t use_S2 = how.Contains("S2", TString::kIgnoreCase);
1223      Bool_t use_S3 = how.Contains("S3", TString::kIgnoreCase);
1224      Bool_t use_GP = how.Contains("GP", TString::kIgnoreCase);
1225    
1226      if (use_TOF) {
1227        use_S1 = true;
1228        use_S2 = true;
1229        use_S3 = true;
1230      };
1231      if (!CAL2 && use_CAL)
1232        use_CAL = false;
1233      if (!TOF) {
1234        use_TOF = false;
1235        use_S1 = false;
1236        use_S2 = false;
1237        use_S3 = false;
1238      }
1239      if (!GP) {
1240        use_GP = false;
1241      }
1242    
1243      if (!TRK2) {
1244        cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;
1245        return;
1246      };
1247    
1248      //   cout << "use_CAL "<<use_CAL<<" use_TOF "<<use_TOF<<" use_TRK "<<use_TRK <<endl;
1249    
1250    
1251      //--------------------------------------------------
1252      // loop over "physical" tracks sorted by the tracker
1253      //--------------------------------------------------
1254      for (Int_t i = 0; i < trk2_obj->TrkLevel2::GetNTracks(); i++) {
1255    
1256        TrkTrack *ts = 0;
1257        CaloTrkVar *cs = 0;
1258        ToFTrkVar *os = 0;
1259        OrbitalInfoTrkVar *rs = 0;
1260    
1261        // get tracker tracks
1262        TrkTrack *tp = trk2_obj->TrkLevel2::GetTrack(i); //tracker
1263        CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());
1264        ToFTrkVar *op = GetToFStoredTrack(tp->GetSeqNo());
1265        OrbitalInfoTrkVar *rp = GetOrbitalInfoStoredTrack(tp->GetSeqNo());
1266    
1267        TrkTrack *ti = 0; //tracker (image)
1268        CaloTrkVar *ci = 0;
1269        ToFTrkVar *oi = 0;
1270        OrbitalInfoTrkVar *ri = 0;
1271        //  cout << "trk track n. "<<i << " "<<hex<< tp <<dec<< endl;
1272        // if track has an image, check image selection
1273    
1274        Int_t tp_score = 0; //main track sorted by the tracker
1275        Int_t ti_score = 0; //image track
1276        Int_t totp_score = 0; //main track sorted by the tracker
1277        Int_t toti_score = 0; //image track
1278    
1279        if (tp->HasImage()) {
1280    
1281          ti = trk2_obj->TrkLevel2::GetTrackImage(i); //tracker (image)
1282          ci = GetCaloStoredTrack(ti->GetSeqNo());
1283          oi = GetToFStoredTrack(ti->GetSeqNo());
1284          ri = GetOrbitalInfoStoredTrack(ti->GetSeqNo());
1285    
1286          //            cout << "its image "<<i << " "<<hex<< ti <<dec<< endl;
1287    
1288          //assign starting scores
1289          tp_score = 0; //main track sorted by the tracker
1290          ti_score = 0; //image track
1291    
1292          // -----------------------------------------------------------------------------------------
1293          // *****************************************************************************************
1294          // -----------------------------------------------------------------------------------------
1295          // calorimeter check
1296          // -----------------------------------------------------------------------------------------
1297          if (use_CAL && !calo2_obj) {
1298            cout << "void PamLevel2::SortTracks(): howtosort= " << how << " but CaloLevel2 not loaded !!!";
1299            return;
1300          };
1301          if (use_CAL && !cp && ci) {
1302            ti_score++;
1303            toti_score++;
1304          };
1305          if (use_CAL && cp && !ci) {
1306            tp_score++;
1307            totp_score++;
1308          };
1309          if (use_CAL && cp && ci && true) {
1310    
1311            if (cp->npresh > ci->npresh && true) {
1312              tp_score++;
1313              totp_score++;
1314            };
1315            if (cp->npresh < ci->npresh && true) {
1316              ti_score++;
1317              toti_score++;
1318            };
1319    
1320            //      cout << "CALO "<<tp_score<<ti_score<<endl;
1321    
1322          };
1323          // -----------------------------------------------------------------------------------------
1324          // *****************************************************************************************
1325          // -----------------------------------------------------------------------------------------
1326          // TOF check
1327          // -----------------------------------------------------------------------------------------
1328          // check the number of hit pmts along the track
1329          // on S12 S21 and S32, where paddles are parallel to Y axis
1330          if ((use_TOF || use_S1 || use_S2 || use_S3) && !tof_obj) {
1331            cout << "void PamLevel2::SortTracks(): howtosort= " << how << " but ToFLevel2 not loaded !!!";
1332            return;
1333          };
1334          //
1335          if ((use_TOF || use_S1 || use_S2 || use_S3) && !op && oi) {
1336            ti_score++;
1337            toti_score++;
1338          };
1339          if ((use_TOF || use_S1 || use_S2 || use_S3) && op && !oi) {
1340            tp_score++;
1341            totp_score++;
1342          };
1343          if ((use_TOF || use_S1 || use_S2 || use_S3) && op && oi) {
1344            //
1345            Float_t sen = 0.;
1346            for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1347              Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih));
1348              if (pl == 2 || pl == 3 || pl == 4 || pl == 5)
1349                sen += (op->dedx).At(ih);
1350            };
1351            for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1352              Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1353              if (pl == 2 || pl == 3 || pl == 4 || pl == 5)
1354                sen += (oi->dedx).At(ih);
1355            };
1356            //
1357            if (sen >= sortthr && false) { // temporary disabled NUCLEI special algorithm since the new one should work for every particle (to be checked!)
1358              //printf(" IS A NUCLEUS! en = %f \n",sen);
1359              //
1360              // is a nucleus use a different algorithm
1361              //
1362              Int_t nz = 6;
1363              Float_t zin[6]; // << define TOF z-coordinates
1364              for (Int_t ip = 0; ip < nz; ip++)
1365                zin[ip] = tof_obj->ToFLevel2::GetZTOF(tof_obj->ToFLevel2::GetToFPlaneID(ip)); // << read ToF plane z-coordinates
1366              Trajectory *tr = new Trajectory(nz, zin);
1367              //
1368              Int_t nphit_p = 0;
1369              Int_t nphit_i = 0;
1370              Float_t enhit_p = 0.;
1371              Float_t enhit_i = 0.;
1372              //
1373              for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1374                Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih));
1375                if (pl == 1 || pl == 2 || pl == 5) {
1376                  nphit_p++;
1377                  enhit_p += (op->dedx).At(ih);
1378                };
1379              };
1380              //
1381              tp->DoTrack2(tr);
1382              //
1383              if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) {
1384                for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1385                  Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih));
1386                  if (pl == 0) {
1387                    nphit_p++;
1388                    enhit_p += (op->dedx).At(ih);
1389                  };
1390                };
1391              };
1392              if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) {
1393                for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1394                  Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih));
1395                  if (pl == 3) {
1396                    nphit_p++;
1397                    enhit_p += (op->dedx).At(ih);
1398                  };
1399                };
1400              };
1401              if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) {
1402                for (Int_t ih = 0; ih < op->npmtadc; ih++) {
1403                  Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih));
1404                  if (pl == 4) {
1405                    nphit_p++;
1406                    enhit_p += (op->dedx).At(ih);
1407                  };
1408                };
1409              };
1410    
1411              for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1412                Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1413                if (pl == 1 || pl == 2 || pl == 5) {
1414                  nphit_i++;
1415                  enhit_i += (op->dedx).At(ih);
1416                };
1417              };
1418              //
1419              ti->DoTrack2(tr);
1420              //
1421              if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) {
1422                for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1423                  Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1424                  if (pl == 0) {
1425                    nphit_i++;
1426                    enhit_i += (op->dedx).At(ih);
1427                  };
1428                };
1429              };
1430              if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) {
1431                for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1432                  Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1433                  if (pl == 3) {
1434                    nphit_i++;
1435                    enhit_i += (op->dedx).At(ih);
1436                  };
1437                };
1438              };
1439              if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) {
1440                for (Int_t ih = 0; ih < oi->npmtadc; ih++) {
1441                  Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih));
1442                  if (pl == 4) {
1443                    nphit_i++;
1444                    enhit_i += (op->dedx).At(ih);
1445                  };
1446                };
1447              };
1448    
1449              if ((use_TOF || use_S1 || use_S2 || use_S3) && (nphit_p + nphit_i) != 0 && true) {
1450    
1451                //      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);
1452                //      printf(" score p %i score i %i \n",tp_score,ti_score);
1453                //            if( enhit_p > enhit_i ) tp_score++;
1454                //            if( nphit_p >= nphit_i && enhit_p > enhit_i ) tp_score++;
1455                if (nphit_p > nphit_i)
1456                  tp_score++;
1457                if (nphit_p < nphit_i)
1458                  ti_score++;
1459                if (nphit_p == nphit_i) {
1460                  if (enhit_p > enhit_i)
1461                    tp_score++;
1462                  else
1463                    ti_score++;
1464                };
1465                //      printf(" dopo score p %i score i %i \n",tp_score,ti_score);
1466              };
1467              delete tr;
1468              //
1469            }
1470            else {
1471              // -------------
1472              // NOT a NUCLEUS
1473              // -------------
1474              //printf(" NOT a NUCLEUS! en = %f \n",sen);
1475    
1476              Int_t nphit_p = 0;
1477              Int_t nphit_i = 0;
1478    
1479              /*                            cout << "track: npmtadc "<< op->npmtadc << endl;
1480               cout << "track: npmttdc "<< op->npmttdc << endl;
1481               cout << "image: npmtadc "<< oi->npmtadc << endl;
1482               cout << "image: npmttdc "<< oi->npmttdc << endl;*/
1483    
1484              //      for (Int_t ih=0; ih < op->npmtadc; ih++){
1485              //        Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );
1486              //        if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
1487              //      };
1488    
1489              //      for (Int_t ih=0; ih < oi->npmtadc; ih++){
1490              //        Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );
1491              //        if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
1492              //      };
1493              // --- modified to count tdc signals (more efficient?)
1494              // --- and to implement check on tdcflag
1495              for (Int_t ih = 0; ih < op->npmttdc; ih++) {
1496                Int_t pl = tof_obj->GetPlaneIndex((op->pmttdc).At(ih));
1497                //      if( (op->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_p++;
1498                if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3))
1499                    || (use_S3 && (pl == 4 || pl == 5))) {
1500                  if ((op->tdcflag).At(ih) == 0)
1501                    nphit_p++;
1502                };
1503              };
1504    
1505              for (Int_t ih = 0; ih < oi->npmttdc; ih++) {
1506                Int_t pl = tof_obj->GetPlaneIndex((oi->pmttdc).At(ih));
1507                //      if( (oi->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_i++;
1508                if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3))
1509                    || (use_S3 && (pl == 4 || pl == 5))) {
1510                  if ((oi->tdcflag).At(ih) == 0)
1511                    nphit_i++;
1512                };
1513              };
1514    
1515              if ((nphit_p + nphit_i) != 0 && true) {
1516    
1517                if (nphit_p != nphit_i) {
1518                  totp_score += nphit_p;
1519                  toti_score += nphit_i;
1520                  tp_score += nphit_p;
1521                  ti_score += nphit_i;
1522                };
1523                //      if     ( nphit_p > nphit_i) tp_score+=nphit_p;
1524                //      else if( nphit_p < nphit_i) ti_score+=nphit_i;
1525                //      else ;//niente
1526              };
1527            };
1528            //      cout << "TOF "<<tp_score<<ti_score<<endl;
1529          };
1530    
1531          //      if(tp_score == ti_score) use_TRK = true;
1532    
1533    
1534          // -----------------------------------------------------------------------------------------
1535          // *****************************************************************************************
1536          // -----------------------------------------------------------------------------------------
1537          // tracker check
1538          // -----------------------------------------------------------------------------------------
1539          // chi**2 difference is not always large enough to distinguish among
1540          // the real track and its image.
1541          // Tracker check will be applied always when calorimeter and tof information is ambiguous.
1542          // *** MODIFIED ON AUGUST 2007 ***
1543          if (use_TRK) {
1544            //      if(      tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
1545            //      else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;
1546    
1547            // CHECK 1 : number of points along X
1548            if (tp->GetNX() >= ti->GetNX()) {
1549              tp_score++;
1550              totp_score++;
1551            };
1552            if (tp->GetNX() <= ti->GetNX()) {
1553              ti_score++;
1554              toti_score++;
1555            };
1556            // CHECK 2 : number of points along Y
1557            if (tp->GetNY() >= ti->GetNY()) {
1558              tp_score++;
1559              totp_score++;
1560            };
1561            if (tp->GetNY() <= ti->GetNY()) {
1562              ti_score++;
1563              toti_score++;
1564            };
1565    
1566            //      cout << "TRK "<<tp_score<<ti_score<<endl;
1567          };
1568    
1569          // -----------------------------------------------------------------------------------------
1570          // *****************************************************************************************
1571          // -----------------------------------------------------------------------------------------
1572          // GPamela check
1573          // -----------------------------------------------------------------------------------------
1574    
1575          //---------------------------------------------------
1576          // count the number of GP hits
1577          //---------------------------------------------------
1578          if (use_GP) {
1579            int ngphits_p = 0;
1580            int ngphits_i = 0;
1581            float toll = 0.02; //200 micron
1582            for (int ih = 0; ih < GetGPamela()->Nthspe; ih++) {
1583              int ip = (Int_t) GetGPamela()->Itrpb[ih] - 1;
1584              if (tp && tp->YGood(ip) && fabs(tp->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true)
1585                ngphits_p++;
1586              if (ti && ti->YGood(ip) && fabs(ti->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true)
1587                ngphits_i++;
1588            }
1589            if (ngphits_p > ngphits_i && true) {
1590              tp_score++;
1591              totp_score++;
1592            }
1593            if (ngphits_p < ngphits_i && true) {
1594              ti_score++;
1595              toti_score++;
1596            }
1597          }
1598    
1599          // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1600          // the winner is....
1601          // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1602          if (tp_score > ti_score) {
1603    
1604          }
1605          else if (tp_score < ti_score) {
1606    
1607            ts = ti;//its image!!
1608            cs = ci;
1609            os = oi;
1610            rs = ri;
1611            Int_t totis = toti_score;
1612    
1613            ti = tp;//its image!!
1614            ci = cp;
1615            oi = op;
1616            ri = rp;
1617    
1618            tp = ts;//its image!!
1619            cp = cs;
1620            op = os;
1621            rp = rs;
1622    
1623            toti_score = totp_score;
1624            totp_score = totis;
1625    
1626          }
1627          else {
1628    
1629            //      cout << "Warning - track image ambiguity not solved" << endl;
1630    
1631  //    cout << "ObjectNumber  "<<ObjectNumber <<endl;        };
1632    
1633  //     if(!sorted_tracks)sorted_tracks = new TRefArray();      }
1634  //     sorted_tracks->Clear();      else {
1635  //    sorted_tracks.Clear();        totp_score = 1;
1636          toti_score = 0;
1637    
1638          //            ts = tp;
1639          //            cs = cp;
1640          //            os = op;
1641        };
1642    
1643        //  cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;
1644        //  sorted_tracks->Add(ts);//save the track in the sorted array
1645        //  sorted_tracks.Add(ts);//save the track in the sorted array
1646        //  sorted_tracks.Add(tp);//save the track in the sorted array
1647        //  cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;
1648        //  cout<<"o "<<tp<<endl;
1649        //  cout<<"o "<<cp<<endl;
1650        //  cout<<"o "<<op<<endl;
1651    
1652        new (ttsorted[i]) PamTrack(tp, cp, op, rp);
1653        new (ttimage[i]) PamTrack(ti, ci, oi, ri);
1654    
1655        ((PamTrack*) (ttsorted[i]))->SetPScore(totp_score);
1656        ((PamTrack*) (ttsorted[i]))->SetIScore(toti_score);
1657        ((PamTrack*) (ttimage[i]))->SetPScore(totp_score);
1658        ((PamTrack*) (ttimage[i]))->SetIScore(toti_score);
1659      };
1660    
1661      if(!tsorted)tsorted = new TClonesArray("PamTrack",trk2_obj->GetNTracks());    if (tsorted->GetEntries() != trk2_obj->GetNTracks()) {
1662        cout << "void PamLevel2::SortTracks(): tsorted->GetEntries() " << tsorted->GetEntries()
1663            << " != trk2_obj->GetNTracks() = " << trk2_obj->GetNTracks() << endl;
1664      tsorted->Delete();      tsorted->Delete();
1665      TClonesArray &ttsorted = *tsorted;      tsorted = 0;
     if(!timage)timage = new TClonesArray("PamTrack",trk2_obj->GetNTracks());  
1666      timage->Delete();      timage->Delete();
1667      TClonesArray &ttimage = *timage;      timage = 0;
1668      }
1669    
1670      //Restore Object count
1671      //To save space in the table keeping track of all referenced objects
1672      //We reset the object count to what it was at the beginning of the event.
1673      TProcessID::SetObjectCount(ObjectNumber);
1674    
1675      //Everything went fine so the current event can be tagged as sorted
1676      issorted = true;
1677      lastsorted = GetReadEntry();
1678    
1679      // loop over the tracks sorted by the tracker  }
1680      Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);  ;
     Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);  
     Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);  
       
     if( !CAL2 &&  use_CAL) use_CAL = false;  
     if( !TOF &&  use_TOF) use_TOF = false;  
       
     if( !TRK2 ){  
 //      cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;  
         return;  
     };  
   
     //   cout << "use_CAL "<<use_CAL<<" use_TOF "<<use_TOF<<" use_TRK "<<use_TRK <<endl;  
       
     for(Int_t i=0; i < trk2_obj->TrkLevel2::GetNTracks(); i++){  
           
         TrkTrack   *ts = 0;  
         CaloTrkVar *cs = 0;  
         ToFTrkVar  *os = 0;  
           
         // get tracker tracks  
         TrkTrack   *tp = trk2_obj->TrkLevel2::GetTrack(i);                    //tracker  
         CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());  
         ToFTrkVar  *op = GetToFStoredTrack(tp->GetSeqNo());  
   
         TrkTrack   *ti = 0;              //tracker (image)  
         CaloTrkVar *ci = 0;  
         ToFTrkVar  *oi = 0;  
 //      cout << "trk track n. "<<i << " "<<hex<< tp <<dec<< endl;  
         // if track has an image, check image selection  
         if(tp->HasImage()){  
               
             ti = trk2_obj->TrkLevel2::GetTrackImage(i);              //tracker (image)  
             ci = GetCaloStoredTrack(ti->GetSeqNo());  
             oi = GetToFStoredTrack(ti->GetSeqNo());  
               
 //          cout << "its image "<<i << " "<<hex<< ti <<dec<< endl;  
   
             //assign starting scores  
             Int_t tp_score = 0;  //main track sorted by the tracker  
             Int_t ti_score = 0;  //image track  
               
             // ------------------------  
             // calorimeter check  
             // ------------------------  
             // check the Y spatial residual on the first calorimeter plane  
             // (cut on calorimeter variables from Emiliano)  
             if( use_CAL && !calo2_obj ){  
                 cout << "void PamLevel2::SortTracks(TString how): how= "<<how<<" but CaloLevel2 not loaded !!!";  
                 return;  
             };  
             if(  
                 use_CAL            &&  
                 calo2_obj->npcfit[1] > 15     &&   //no. of fit planes on Y view  
                 calo2_obj->varcfit[1] < 1000. &&  //fit variance on Y view  
                 true){  
   
                   
                 Float_t resy_p = cp->tbar[0][1] - calo2_obj->cbar[0][1]; if(resy_p < 0)resy_p= - resy_p;  
                 Float_t resy_i = ci->tbar[0][1] - calo2_obj->cbar[0][1]; if(resy_i < 0)resy_i= - resy_i;  
                   
                 if(resy_p <= resy_i) tp_score++;  
                 else                 ti_score++;  
   
 //              cout << "CALO "<<tp_score<<ti_score<<endl;  
   
             };  
             // ------------------------  
             // TOF check  
             // ------------------------      
             // check the number of hit pmts along the track  
             // on S12 S21 and S32, where paddles are parallel to Y axis  
             if( use_TOF && !tof_obj ){  
                 cout << "void PamLevel2::SortTracks(TString how): how= "<<how<<" but ToFLevel2 not loaded !!!";  
                 return;  
             };  
             if( use_TOF ){  
                   
                 Int_t nphit_p =0;  
                 Int_t nphit_i =0;  
                   
                   
 /*                              cout << "track: npmtadc "<< op->npmtadc << endl;  
                                 cout << "track: npmttdc "<< op->npmttdc << endl;  
                                 cout << "image: npmtadc "<< oi->npmtadc << endl;  
                                 cout << "image: npmttdc "<< oi->npmttdc << endl;*/  
                   
                 for (Int_t ih=0; ih < op->npmtadc; ih++){  
                     Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) );  
                     if(pl == 1 || pl == 2 || pl == 5)nphit_p++;  
                 };  
                   
                 for (Int_t ih=0; ih < oi->npmtadc; ih++){  
                     Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) );  
                     if(pl == 1 || pl == 2 || pl == 5)nphit_i++;  
                 };  
                   
                 if(  
                     use_TOF            &&  
                     (nphit_p+nphit_i) !=0 &&      
                     true){  
                       
                     if( nphit_p >= nphit_i) tp_score++;  
                     else ti_score++;  
                 };  
 //              cout << "TOF "<<tp_score<<ti_score<<endl;  
             };  
             if(tp_score == ti_score) use_TRK = true;  
             // ------------------------  
             // tracker check  
             // ------------------------  
             // chi**2 difference is not always large enough to distinguish among  
             // the real track and its image.  
             // Tracker check will be applied always when calorimeter and tof information is ambiguous.  
             if(use_TRK){  
                 if(      tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;  
                 else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;  
 //              cout << "TRK "<<tp_score<<ti_score<<endl;  
             };  
               
             // ------------------------  
             // the winner is....  
             // ------------------------      
             if      (tp_score > ti_score) {  
 //              ts = tp;//the track sorted by the tracker!!  
 //              cs = cp;  
 //              os = op;  
             }else if (tp_score < ti_score) {  
                 ts = ti;//its image!!  
                 cs = ci;  
                 os = oi;  
   
                 ti = tp;//its image!!  
                 ci = cp;  
                 oi = op;  
   
                 tp = ts;//its image!!  
                 cp = cs;  
                 op = os;  
   
                   
             }else {  
 //              ts = tp;  
 //              cs = cp;  
 //              os = op;  
 //                              cout << "Warning - track image ambiguity not solved" << endl;  
 //                              cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl;  
             };  
               
         }else{  
 //          ts = tp;  
 //          cs = cp;  
 //          os = op;  
         };  
           
 //      cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;  
 //      sorted_tracks->Add(ts);//save the track in the sorted array  
 //      sorted_tracks.Add(ts);//save the track in the sorted array  
 //      sorted_tracks.Add(tp);//save the track in the sorted array  
 //      cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;  
 //      cout<<"o "<<tp<<endl;  
 //      cout<<"o "<<cp<<endl;  
 //      cout<<"o "<<op<<endl;  
         new(ttsorted[i]) PamTrack(tp,cp,op);  
         new(ttimage[i])  PamTrack(ti,ci,oi);  
     };  
   
     if( tsorted->GetEntries() != trk2_obj->GetNTracks() ){  
         cout << "void PamLevel2::SortTracks(TString how): tsorted->GetEntries() "<<tsorted->GetEntries()<<" != trk2_obj->GetNTracks() = "<<trk2_obj->GetNTracks() <<endl;  
         tsorted->Delete(); tsorted=0;  
         timage->Delete(); timage=0;      
     }  
   
     //Restore Object count  
     //To save space in the table keeping track of all referenced objects  
     //We reset the object count to what it was at the beginning of the event.  
     TProcessID::SetObjectCount(ObjectNumber);  
       
 };  
1681  //--------------------------------------  //--------------------------------------
1682  //  //
1683  //  //
# Line 638  void PamLevel2::SortTracks(TString how){ Line 1694  void PamLevel2::SortTracks(TString how){
1694    
1695  // //   return  sorted_tracks;  // //   return  sorted_tracks;
1696  //     return &sorted_tracks;  //     return &sorted_tracks;
1697        
1698  //  };  //  };
1699  TClonesArray *PamLevel2::GetTracks(){  TClonesArray *PamLevel2::GetTracks() {
1700    
1701  //  *-*-*-*-*-*-*-*-*-*-*-*-*    //  *-*-*-*-*-*-*-*-*-*-*-*-*
1702      SortTracks("+CAL+TOF");    SortTracks();
1703  //  *-*-*-*-*-*-*-*-*-*-*-*-*    //  *-*-*-*-*-*-*-*-*-*-*-*-*
1704    
1705      return tsorted;    return tsorted;
1706        
1707   };  }
1708    ;
1709  //--------------------------------------  //--------------------------------------
1710   //  //
1711   //  //
1712  //--------------------------------------  //--------------------------------------
1713  /**  /**
1714   * Retrieves the it-th Pamela "physical" track.   * Retrieves the it-th Pamela "physical" track.
1715   * It override TrkLevel2::GetTrack(int it).   * It override TrkLevel2::GetTrack(int it).
1716   * @param it Track number, ranging from 0 to GetNTracks().   * @param it Track number, ranging from 0 to GetNTracks().
1717   */   */
1718  PamTrack *PamLevel2::GetTrack(int it){  PamTrack *PamLevel2::GetTrack(int it) {
1719    
1720  //    if(!trk2_obj) return 0;    //    if(!trk2_obj) return 0;
1721            
1722  // //  *-*-*-*-*-*-*-*-*-*-*-*-*    // //  *-*-*-*+-*-*-*-*-*-*-*-*-*
1723  //     SortTracks("+CAL+TOF");    //     SortTracks("+CAL+TOF");
1724  // //  *-*-*-*-*-*-*-*-*-*-*-*-*    // //  *-*-*-*-*-*-*-*-*-*-*-*-*
1725  // //    if(!sorted_tracks)return 0;    // //    if(!sorted_tracks)return 0;
1726  //     if(sorted_tracks.IsEmpty())return 0;    //     if(sorted_tracks.IsEmpty())return 0;
1727    
1728      //     PamTrack *track = 0;
1729    
1730      //     if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() && it<sorted_tracks.GetEntriesFast() ){
1731      //    TrkTrack   *t = (TrkTrack*)sorted_tracks.At(it);
1732      //    track = GetPamTrackAlong(t);
1733      //     }else{
1734      //    cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;
1735      //     };
1736    
1737      //     return track;
1738    
1739      //    cout << "PamLevel2::GetTrack(int it) "<<endl;
1740      //  *-*-*-*-*-*-*-*-*-*-*-*-*
1741      SortTracks();
1742      //  *-*-*-*-*-*-*-*-*-*-*-*-*
1743      if (!tsorted)
1744        return 0;
1745      if (!tsorted->GetEntries())
1746        return 0;
1747    
1748      PamTrack *track = 0;
1749    
1750      if (it >= 0 && it < trk2_obj->TrkLevel2::GetNTracks()) {
1751        //  TrkTrack   *t = (TrkTrack*)sorted_tracks.At(it);
1752        //  track = GetPamTrackAlong(t);
1753        //TClonesArray &t = *(tsorted);
1754        //track = (PamTrack*)t[it];
1755        track = (PamTrack*)((*tsorted)[it]);
1756      }
1757      else {
1758        cout << "PamLevel2::GetTrack(int) : tracker track SeqNo " << it << " does not exist (GetNTracks() = "
1759            << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl;
1760      };
1761    
1762      return track;
1763    
1764  //     PamTrack *track = 0;  }
1765        ;
 //     if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() && it<sorted_tracks.GetEntriesFast() ){      
 //      TrkTrack   *t = (TrkTrack*)sorted_tracks.At(it);  
 //      track = GetPamTrackAlong(t);  
 //     }else{  
 //      cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;  
 //     };  
       
 //     return track;  
   
 //    cout << "PamLevel2::GetTrack(int it) "<<endl;  
 //  *-*-*-*-*-*-*-*-*-*-*-*-*  
     SortTracks("+CAL+TOF");  
 //  *-*-*-*-*-*-*-*-*-*-*-*-*  
     if(!tsorted)return 0;  
     if(!tsorted->GetEntries())return 0;  
   
     PamTrack *track = 0;  
       
     if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks()){  
 //      TrkTrack   *t = (TrkTrack*)sorted_tracks.At(it);  
 //      track = GetPamTrackAlong(t);  
         TClonesArray &t = *(tsorted);  
         track = (PamTrack*)t[it];  
           
     }else{  
         cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;  
     };  
       
     return track;  
       
 };  
1766    
1767  //--------------------------------------  //--------------------------------------
1768  //  //
1769  //  //
1770  //--------------------------------------  //--------------------------------------
1771  /**  /**
1772   * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().   * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().
1773   * @param it Track number, ranging from 0 to GetNTracks().   * @param it Track number, ranging from 0 to GetNTracks().
1774   */   */
1775  PamTrack *PamLevel2::GetTrackImage(int it){  PamTrack *PamLevel2::GetTrackImage(int it) {
   
 //     if(!trk2_obj) return 0;  
1776    
1777  // //  *-*-*-*-*-*-*-*-*-*-*-*-*    //  *-*-*-*-*-*-*-*-*-*-*-*-*
1778  //     SortTracks("+CAL+TOF");    SortTracks();
1779  // //  *-*-*-*-*-*-*-*-*-*-*-*-*    //  *-*-*-*-*-*-*-*-*-*-*-*-*
1780  // //    if(!sorted_tracks)return 0;    if (!timage)
1781  //     if(sorted_tracks.IsEmpty())return 0;      return 0;
1782          if (!timage->GetEntries())
1783  //     PamTrack *image = 0;      return 0;
1784        
1785  //     if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() ){    PamTrack *image = 0;
1786  //      TrkTrack *temp = (TrkTrack*)sorted_tracks.At(it);  
1787  //      if( temp->HasImage() ){    if (it >= 0 && it < trk2_obj->TrkLevel2::GetNTracks()) {
1788  //          TrkTrack   *t = trk2_obj->TrkLevel2::GetStoredTrack(temp->GetImageSeqNo());      TClonesArray &t = *(tsorted);
1789  //          image = GetPamTrackAlong(t);      PamTrack *temp = (PamTrack*) t[it];
1790  //      }else{      if (temp->GetTrkTrack()->HasImage()) {
1791  //          cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;        TClonesArray & t = *(timage);
1792  //      };        image = (PamTrack*) t[it];
1793  //     }else{      }
1794  //      cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;      else {
1795  //     };        //            cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;
       
 //     return image;  
   
   
 //  *-*-*-*-*-*-*-*-*-*-*-*-*  
     SortTracks("+CAL+TOF");  
 //  *-*-*-*-*-*-*-*-*-*-*-*-*  
     if(!timage)return 0;  
     if(!timage->GetEntries())return 0;  
       
     PamTrack *image = 0;  
       
     if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() ){  
         TClonesArray &t = *(tsorted);  
         PamTrack *temp = (PamTrack*)t[it];  
         if( temp->GetTrkTrack()->HasImage() ){  
             TClonesArray &t = *(timage);  
             image = (PamTrack*)t[it];  
         }else{  
 //          cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;  
         };  
     }else{  
         cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<trk2_obj->TrkLevel2::GetNTracks()<<")"<<endl;  
1796      };      };
1797          }
1798      return image;    else {
1799        cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo " << it << " does not exist (GetNTracks() = "
1800            << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl;
1801      };
1802    
1803      return image;
1804  }  }
1805    
1806  //--------------------------------------  //--------------------------------------
# Line 771  PamTrack *PamLevel2::GetTrackImage(int i Line 1813  PamTrack *PamLevel2::GetTrackImage(int i
1813   * @param detlist String to select trees to be included   * @param detlist String to select trees to be included
1814   * @return Pointer to a TTree   * @return Pointer to a TTree
1815   */   */
1816  TTree *PamLevel2::GetPamTree(TFile *f, TString detlist ){  TTree *PamLevel2::GetPamTree(TFile *f, TString detlist) {
1817    
1818      if (detlist.Contains("+AUTO", TString::kIgnoreCase)) {
1819        cout << "+AUTO" << endl;
1820        GetWhichTrees(f);
1821      };
1822      SetWhichTrees(detlist);
1823    
1824      if (pam_tree) {
1825        printf("WARNING: TTree *PamLevel2::GetPamTree(TFile *fl, TString detlist) -- pam_tree already exists!\n ");
1826        return pam_tree;
1827      };
1828      //
1829    
1830      cout << "TTree *PamLevel2::GetPamTree(TFile *f, TString detlist ) -- obsolte " << endl;
1831    
1832      //    SetWhichTrees(detlist);
1833    
1834      TTree *Trout = 0;
1835    
1836      TString fname = f->GetName();
1837      if (!CheckLevel2File(fname))
1838        return NULL;
1839    
1840      //    UInt_t *found=0;
1841    
1842      cout << "GetPamTree(TFile*,TString): detector list --> ";
1843      if (TRK1)
1844        cout << "TRK1 ";
1845      if (TRK2)
1846        cout << "TRK2 ";
1847      if (TRKh)
1848        cout << "TRKH ";
1849      if (CAL1)
1850        cout << "CAL1 ";
1851      if (CAL2)
1852        cout << "CAL2 ";
1853      if (TOF)
1854        cout << "TOF ";
1855      if (TRG)
1856        cout << "TRG ";
1857      if (AC)
1858        cout << "AC ";
1859      if (ND)
1860        cout << "ND ";
1861      if (S4)
1862        cout << "S4 ";
1863      if (ORB)
1864        cout << "ORB ";
1865      if (GP)
1866        cout << "GP ";
1867      cout << endl;
1868      if (SELLI && SELLI != 2)
1869        cout << ">>> Found selection-list <<<" << endl; //EMILIANO
1870    
1871      f->cd();
1872    
1873      // Tracker
1874      TTree *T = (TTree*) f->Get("Tracker");
1875      if (T && (TRK2 || TRK1 || TRKh)) {
1876        if (TRK2)
1877          T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
1878        //  else    T->SetBranchStatus("TrkLevel2",0,found);
1879        if (TRK2)
1880          cout << "Tracker      : set branch address TrkLevel2" << endl;
1881        if (TRK1)
1882          T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
1883        //  else    T->SetBranchStatus("TrkLevel1",0,found);
1884        if (TRK1)
1885          cout << "Tracker      : set branch address TrkLevel1" << endl;
1886        if (TRKh)
1887          T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
1888        //  else    T->SetBranchStatus("TrkHough",0,found);
1889        if (TRKh)
1890          cout << "Tracker      : set branch address TrkHough" << endl;
1891        if (!Trout)
1892          Trout = T;
1893        else
1894          Trout->AddFriend(T);
1895      }
1896      else {
1897        cout << "Tracker      : missing tree" << endl;
1898      };
1899      // Calorimeter
1900      TTree *C = (TTree*) f->Get("Calorimeter");
1901      if (C && (CAL2 || CAL1)) {
1902        if (CAL2)
1903          C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
1904        //  else    C->SetBranchStatus("CaloLevel2",0,found);
1905        if (CAL2)
1906          cout << "Calorimeter  : set branch address CaloLevel2" << endl;
1907        if (CAL1)
1908          C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
1909        //  else    C->SetBranchStatus("CaloLevel1",0,found);
1910        if (CAL1)
1911          cout << "Calorimeter  : set branch address CaloLevel1" << endl;
1912        if (!Trout)
1913          Trout = C;
1914        else
1915          Trout->AddFriend(C);
1916      }
1917      else {
1918        cout << "Calorimeter  : missing tree" << endl;
1919      };
1920    
1921      // ToF
1922      TTree *O = (TTree*) f->Get("ToF");
1923      if (O && TOF) {
1924        O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
1925        cout << "ToF          : set branch address ToFLevel2" << endl;
1926        if (!Trout)
1927          Trout = O;
1928        else
1929          Trout->AddFriend(O);
1930      }
1931      else {
1932        cout << "ToF         : missing tree" << endl;
1933      };
1934      // Trigger
1935      TTree *R = (TTree*) f->Get("Trigger");
1936      if (R && TRG) {
1937        R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
1938        cout << "Trigger      : set branch address TrigLevel2" << endl;
1939        if (!Trout)
1940          Trout = R;
1941        else
1942          Trout->AddFriend(R);
1943      }
1944      else {
1945        cout << "Trigger      : missing tree" << endl;
1946      };
1947      // S4
1948      TTree *S = (TTree*) f->Get("S4");
1949      if (S && S4) {
1950        S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
1951        cout << "S4           : set branch address S4Level2" << endl;
1952        if (!Trout)
1953          Trout = S;
1954        else
1955          Trout->AddFriend(S);
1956      }
1957      else {
1958        cout << "S4           : missing tree" << endl;
1959      };
1960      // Neutron Detector
1961      TTree *N = (TTree*) f->Get("NeutronD");
1962      if (N && ND) {
1963        N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
1964        cout << "NeutronD     : set branch address NDLevel2" << endl;
1965        if (!Trout)
1966          Trout = N;
1967        else
1968          Trout->AddFriend(N);
1969      }
1970      else {
1971        cout << "NeutronD     : missing tree" << endl;
1972      };
1973      // Anticounters
1974      TTree *A = (TTree*) f->Get("Anticounter");
1975      if (A && AC) {
1976        A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
1977        cout << "Anticounter  : set branch address AcLevel2" << endl;
1978        if (!Trout)
1979          Trout = A;
1980        else
1981          Trout->AddFriend(A);
1982      }
1983      else {
1984        cout << "Anticounter  : missing tree" << endl;
1985      };
1986      // Orbital Info
1987      TTree *B = (TTree*) f->Get("OrbitalInfo");
1988      if (B && ORB) {
1989        B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
1990        cout << "OrbitalInfo  : set branch address OrbitalInfo" << endl;
1991        if (!Trout)
1992          Trout = B;
1993        else
1994          Trout->AddFriend(B);
1995      }
1996      else {
1997        cout << "OrbitalInfo  : missing tree" << endl;
1998      };
1999    
2000      // GPamela
2001      TTree *G = (TTree*) f->Get("h20");
2002      if (G && GP) {
2003        if (!gp_obj)
2004          gp_obj = new GPamela();
2005        //      ------------------------------------
2006        //      ATTENZIONE!!!
2007        //      non so per quale arcano motivo,
2008        //      per l'albero di gpamela il branch address lo devo settare
2009        //      DOPO aver fatto friend
2010        //      FGRRRVZZZZUTSALKJMSLKJ!!!
2011        //      ------------------------------------
2012        //  gp_obj->SetBranchAddress(G); //ho dovuto fare in maniera diversa dagli altri
2013        //  cout << "h20          : set branch address GPamela "<<endl;
2014        if (!Trout)
2015          Trout = G;
2016        else
2017          Trout->AddFriend(G);
2018      }
2019      else {
2020        //  cout << "h20          : missing tree"<<endl;
2021      };
2022    
2023      TTree *L = (TTree*) f->Get("SelectionList");
2024      if (L && SELLI == 1) {
2025        cout << " TTree *PamLevel2::GetPamTree(TFile, TString) >>> SelectionList not implemented!!!!" << endl;
2026        sel_tree = 0;
2027      }
2028      else {
2029        cout << "SelectionList  : missing tree" << endl;
2030      };
2031    
2032      cout << endl << " Number of entries: " << Trout->GetEntries() << endl << endl;
2033    
2034      //      ------------------------------------
2035      //      ATTENZIONE!!!
2036      //      non so per quale arcano motivo,
2037      //      per l'albero di gpamela il branch address lo devo settare
2038      //      DOPO aver fatto friend
2039      //      FGRRRVZZZZUTSALKJMSLKJ!!!
2040      //      ------------------------------------
2041      if (G && GP) {
2042        gp_obj->SetBranchAddress(Trout); //ho dovuto fare in maniera diversa dagli altri
2043        cout << "h20          : set branch address GPamela " << endl;
2044      }
2045      else {
2046        cout << "h20          : missing tree" << endl;
2047      };
2048    
2049      pam_tree = (TChain*) Trout;
2050    
2051      return Trout;
2052    
 //     if( !detlist.IsNull() ) SetWhichTrees(detlist);  
 //     else                    GetWhichTrees(f);  
     SetWhichTrees(detlist);  
   
     TTree *Trout =0;  
   
     TString fname = f->GetName();  
     if(!CheckLevel2File(fname))return NULL;  
   
     UInt_t *found=0;      
   
     cout<< "GetPamTree(TFile*,TString): detector list --> ";  
     if(TRK1)cout<<"TRK1 ";  
     if(TRK2)cout<<"TRK2 ";  
     if(TRKh)cout<<"TRKH ";  
     if(CAL1)cout<<"CAL1 ";  
     if(CAL2)cout<<"CAL2 ";  
     if(TOF)cout<<"TOF ";  
     if(TRG)cout<<"TRG ";  
     if(AC)cout<<"AC ";  
     if(ND)cout<<"ND ";  
     if(S4)cout<<"S4 ";  
     if(ORB)cout<<"ORB ";  
     cout << endl;  
   
     f->cd();  
   
 // Tracker  
     TTree *T = (TTree*)f->Get("Tracker");  
     if(T && (TRK2||TRK1||TRKh)) {  
         if(TRK2)T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));  
         else    T->SetBranchStatus("TrkLevel2",0,found);  
         if(TRK2)cout << "Tracker      : set branch address TrkLevel2"<<endl;  
         if(TRK1)T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));  
         else    T->SetBranchStatus("TrkLevel1",0,found);  
         if(TRK1)cout << "Tracker      : set branch address TrkLevel1"<<endl;  
         if(TRKh)T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));  
         else    T->SetBranchStatus("TrkHough",0,found);  
         if(TRKh)cout << "Tracker      : set branch address TrkHough"<<endl;  
         if(!Trout)Trout=T;  
         else Trout->AddFriend(T);  
     }else{  
         cout << "Tracker      : missing tree"<<endl;  
     };  
     // Calorimeter  
     TTree *C = (TTree*)f->Get("Calorimeter");  
     if(C && (CAL2||CAL1)) {  
         if(CAL2)C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));  
         else    C->SetBranchStatus("CaloLevel2",0,found);  
         if(CAL2)cout << "Calorimeter  : set branch address CaloLevel2"<<endl;  
         if(CAL1)C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));  
         else    C->SetBranchStatus("CaloLevel1",0,found);  
         if(CAL1)cout << "Calorimeter  : set branch address CaloLevel1"<<endl;  
         if(!Trout)Trout=C;  
         else Trout->AddFriend(C);  
     }else{  
         cout << "Calorimeter  : missing tree"<<endl;  
     };  
   
     // ToF      
     TTree *O = (TTree*)f->Get("ToF");  
     if(O && TOF) {  
         O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));  
         cout << "ToF          : set branch address ToFLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend(O);  
     }else{  
         cout << "ToF         : missing tree"<<endl;  
     };  
     // Trigger  
     TTree *R = (TTree*)f->Get("Trigger");  
     if(R && TRG) {  
         R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));  
         cout << "Trigger      : set branch address TrigLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend(R);  
     }else{  
         cout << "Trigger      : missing tree"<<endl;  
     };  
     // S4  
     TTree *S = (TTree*)f->Get("S4");  
     if(S && S4) {  
         S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));  
         cout << "S4           : set branch address S4Level2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend(S);  
     }else{  
         cout << "S4           : missing tree"<<endl;  
     };  
     // Neutron Detector  
     TTree *N = (TTree*)f->Get("NeutronD");  
     if(N && ND) {  
         N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));  
         cout << "NeutronD     : set branch address NDLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend(N);  
     }else{  
         cout << "NeutronD     : missing tree"<<endl;  
     };  
     // Anticounters  
     TTree *A = (TTree*)f->Get("Anticounter");  
     if(A && AC) {  
         A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));  
         cout << "Anticounter  : set branch address AcLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend(A);  
     }else{  
         cout << "Anticounter  : missing tree"<<endl;  
     };  
     // Orbital Info  
     TTree *B = (TTree*)f->Get("OrbitalInfo");  
     if(B && ORB) {  
         B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));  
         cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend(B);  
     }else{  
         cout << "OrbitalInfo  : missing tree"<<endl;  
     };  
       
     cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl;  
       
     return Trout;  
       
2053  }  }
2054  //--------------------------------------  //--------------------------------------
2055  //  //
# Line 909  TTree *PamLevel2::GetPamTree(TFile *f, T Line 2062  TTree *PamLevel2::GetPamTree(TFile *f, T
2062   * @return Pointer to a TList of TSystemFiles   * @return Pointer to a TList of TSystemFiles
2063   * If no input file list is given , all the Level2 files inside the directory are processed.   * If no input file list is given , all the Level2 files inside the directory are processed.
2064   */   */
2065  TList*  PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = ""){  TList* PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = "") {
           
     TString wdir = gSystem->WorkingDirectory();  
       
     if(ddir=="")ddir = wdir;  
 //      TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);  
     cout << "Level2 data directory : "<<  ddir << endl;  
       
     TList *contents  = new TList; // create output list  
     contents->SetOwner();  
       
 //    char *fullpath;  
 //    const char *fullpath;  
       
     // if no input file list is given:    
     if ( flisttxt != "" ){  
           
 //      if( !gSystem->IsFileInIncludePath(flisttxt,&fullpath) ){          
 //      if( !(fullpath = gSystem->FindFile("./",flisttxt)) ){  
 //          cout <<"File "<<flisttxt<<" not found"<<endl;  
 //          return 0;  
 //      }        
 //      flisttxt = fullpath;  
   
         flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));  
   
         if( !gSystem->ChangeDirectory(ddir) ){  
             cout << "Cannot change directory : "<<ddir<<endl;  
             return 0;  
         }  
           
         cout <<"Input file list : " << flisttxt <<endl;  
         ifstream in;  
         in.open(flisttxt, ios::in); //open input file list  
         if(!in.good()){  
             cout <<" ERROR opening the file "<<endl;  
             gSystem->ChangeDirectory(wdir); // back to the working directory  
             return 0;  
         }        
         int line=0;  
         while (1) {  
             TString file;  
             in >> file;  
             if (!in.good()) break;  
             line++;  
 //          cout <<"(1) " << file << endl;  
             if(file.IsNull()){  
                 cout << "-- list interrupted at line "<<line <<endl;  
                 break;  
             }  
             if(file.Contains("#"))file = file(0,file.First("#"));  
 //          cout <<"(2) " << file << endl;  
 //          if( gSystem->IsFileInIncludePath(file,&fullpath) ){  
 //          if( (fullpath = gSystem->FindFile(ddir,file)) ){  
             char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir),gSystem->BaseName(file));  
             contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list  
             delete fullpath;  
 //          }else{  
 //              if(file.Data()!="")cout << "File: "<<file<<" ---> missing "<< endl;  
 //          };  
         };  
         in.close();  
           
     }else{  
           
         cout << "No input file list given."<<endl;  
         cout << "Check for existing root files."<<endl;  
 //              cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;  
           
         TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);  
         TList *temp = datadir->GetListOfFiles();  
 //              temp->Print();  
 //              cout << "*************************************" << endl;  
           
         TIter next(temp);  
         TSystemFile *questo = 0;  
           
           
         while ( (questo = (TSystemFile*) next()) ) {  
             TString name =  questo-> GetName();  
             if( name.EndsWith(".root") ){  
 //              const char *fullpath = gSystem->FindFile(ddir,name);  
 //              char *fullpath;  
 //              gSystem->IsFileInIncludePath(name,&fullpath);  
                 char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir),gSystem->BaseName(name));  
                 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));  
                 delete fullpath;  
             };  
         }  
         delete temp;  
         delete datadir;  
           
     };  
     gSystem->ChangeDirectory(wdir); // back to the working directory  
 //      cout << endl << "Selected files:" << endl;  
 //      contents->Print();  
     cout << contents->GetEntries()<<" files \n";  
 //      cout << endl;  
 //      cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl;  
     return contents;  
 };  
 //--------------------------------------  
 //  
 //  
 //--------------------------------------  
 /**  
  * Get the Pamela detector chains from a list of files and make them friends.  
  * @param fl Pointer to a TList of TSystemFiles  
  * @param detlist String to select trees to be included  
  * @return Pointer to a TChain  
  */  
 TChain *PamLevel2::GetPamTree(TList *fl, TString detlist ){  
       
     TChain *Trout =0;  
   
 //    if( !detlist.IsNull() )SetWhichTrees(detlist);  
     SetWhichTrees(detlist);  
       
     cout<< "GetPamTree(TList*,TString): input detector list --> ";  
     if(TRK1)cout<<"TRK1 ";  
     if(TRK2)cout<<"TRK2 ";  
     if(TRKh)cout<<"TRKH ";  
     if(CAL1)cout<<"CAL1 ";  
     if(CAL2)cout<<"CAL2 ";  
     if(TOF)cout<<"TOF ";  
     if(TRG)cout<<"TRG ";  
     if(AC)cout<<"AC ";  
     if(ND)cout<<"ND ";  
     if(S4)cout<<"S4 ";  
     if(ORB)cout<<"ORB ";  
     cout << endl;  
   
     TChain *T = 0;        
     TChain *C = 0;  
     TChain *O = 0;  
     TChain *R = 0;  
     TChain *S = 0;  
     TChain *N = 0;  
     TChain *A = 0;  
     TChain *B = 0;  
       
     if(TRK2||TRK1||TRKh) T = new TChain("Tracker");      
     if(CAL2||CAL1)       C = new TChain("Calorimeter");  
     if(TOF)              O = new TChain("ToF");  
     if(TRG)              R = new TChain("Trigger");  
     if(S4)               S = new TChain("S4");  
     if(ND)               N = new TChain("NeutronD");  
     if(AC)               A = new TChain("Anticounter");  
     if(ORB)              B = new TChain("OrbitalInfo");  
       
     // loop over files and create chains          
     TIter next(fl);  
     TSystemFile *questo = 0;  
     while ( (questo = (TSystemFile*) next()) ) {  
         TString name =  questo->GetName();  
         cout << "File: "<< name << endl;  
         if( CheckLevel2File(name) ){  
             if(TRK2||TRK1||TRKh) T->Add(name);  
             if(CAL1||CAL2)       C->Add(name);  
             if(TOF)              O->Add(name);  
             if(TRG)              R->Add(name);  
             if(S4)               S->Add(name);  
             if(ND)               N->Add(name);  
             if(AC)               A->Add(name);  
             if(ORB)              B->Add(name);  
         };  
     }  
       
     cout << "done chain \n";  
   
     UInt_t *found=0;  
 // Tracker  
     if(T && (TRK2||TRK1||TRKh)) {  
         if(TRK2)T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));  
         else    T->SetBranchStatus("TrkLevel2",0,found);  
         if(TRK2)cout << "Tracker      : set branch address TrkLevel2"<<endl;  
         if(TRK1)T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));  
         else    T->SetBranchStatus("TrkLevel1",0,found);  
         if(TRK1)cout << "Tracker      : set branch address TrkLevel1"<<endl;  
         if(TRKh)T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));  
         else    T->SetBranchStatus("TrkHough",0,found);  
         if(TRKh)cout << "Tracker      : set branch address TrkHough"<<endl;  
         if(!Trout)Trout=T;  
         else Trout->AddFriend("Tracker");  
     }else{  
         cout << "Tracker      : missing tree"<<endl;  
     };  
     // Calorimeter  
     if(C && (CAL2||CAL1)) {  
         if(CAL2)C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));  
         else    C->SetBranchStatus("CaloLevel2",0,found);  
         if(CAL2)cout << "Calorimeter  : set branch address CaloLevel2"<<endl;  
         if(CAL1)C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));  
         else    C->SetBranchStatus("CaloLevel1",0,found);  
         if(CAL1)cout << "Calorimeter  : set branch address CaloLevel1"<<endl;  
         if(!Trout)Trout=C;  
         else Trout->AddFriend("Calorimeter");  
     }else{  
         cout << "Calorimeter  : missing tree"<<endl;  
     };  
     // ToF      
     if(O && TOF) {  
         O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));  
         cout << "ToF          : set branch address ToFLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend("ToF");  
     }else{  
         cout << "ToF         : missing tree"<<endl;  
     };  
     // Trigger  
     if(R && TRG) {  
         R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));  
         cout << "Trigger      : set branch address TrigLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend("Trigger");  
     }else{  
         cout << "Trigger      : missing tree"<<endl;  
     };  
     // S4  
     if(S && S4) {  
         S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));  
         cout << "S4           : set branch address S4Level2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend("S4");  
     }else{  
         cout << "S4           : missing tree"<<endl;  
     };  
     // Neutron Detector  
     if(N && ND) {  
         N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));  
         cout << "NeutronD     : set branch address NDLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend("NeutronD");  
     }else{  
         cout << "NeutronD     : missing tree"<<endl;  
     };  
     // Anticounters  
     if(A && AC) {  
         A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));  
         cout << "Anticounter  : set branch address AcLevel2"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend("Anticounter");  
     }else{  
         cout << "Anticounter  : missing tree"<<endl;  
     };  
     // Orbital Info  
     if(B && ORB) {  
         B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));  
         cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;  
         if(!Trout)Trout=O;  
         else Trout->AddFriend("OrbitalInfo");  
     }else{  
         cout << "OrbitalInfo  : missing tree"<<endl;  
     };  
       
 //    cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl;  
   
       
 //     // Tracker  
 //     if(TRK2||TRK1||TRKh){  
 //      if(!Tout)Tout=T;  
 //      else Tout->AddFriend("Tracker");  
 //     }  
 //     // Calorimeter  
 //     if(CAL2||CAL1) {          
 //      if(!Tout)Tout=C;  
 //      else Tout->AddFriend("Calorimeter");  
 //     };  
 //     // ToF      
 //     if(TOF) {  
 //      if(!Tout)Tout=O;  
 //      else Tout->AddFriend("ToF");  
 //     };  
 //     // Trigger  
 //     if(TRG) {  
 //      if(!Tout)Tout=R;  
 //      else Tout->AddFriend("Trigger");  
 //     };  
 //     // S4  
 //     if(S4) {  
 //      if(!Tout)Tout=S;  
 //      else Tout->AddFriend("S4");  
 //     };  
 //     // Neutron Detector  
 //     if(ND) {  
 //      if(!Tout)Tout=N;  
 //      else Tout->AddFriend("NeutronD");  
 //     };  
 //     // Anticounters  
 //     if(AC) {  
 //      if(!Tout)Tout=A;  
 //      else Tout->AddFriend("Anticounter");  
 //     };  
 //     // OrbitalInfo  
 //     if(ORB) {  
 //      if(!Tout)Tout=B;  
 //      else Tout->AddFriend("OrbitalInfo");  
 //     };  
       
 //    cout<<endl<<" Number of entries: "<<Tout->GetEntries()<<endl<<endl;  
       
 //    if( Tout->GetEntries() )PamLevel2::SetBranchAddress( Tout );  
       
     return Trout;  
 }  
2066    
2067      TString wdir = gSystem->WorkingDirectory();
2068    
2069      if (ddir != "") {
2070        cout << "Level2 data directory : " << ddir << endl;
2071      }
2072      else {
2073        cout << "Level2 data directory not given as input: trying to evaluate from list or taking working directory "
2074            << endl;
2075      };
2076      TList *contents = new TList; // create output list
2077      contents->SetOwner();
2078    
2079      // --------------------------------------
2080      // case 1 : input file/file-list provided
2081      // --------------------------------------
2082      if (flisttxt != "") {
2083    
2084        // --------------------------------------
2085        // a list of files given as input
2086        // --------------------------------------
2087        if (!flisttxt.EndsWith(".root")) {
2088    
2089          TString dir = gSystem->DirName(flisttxt);
2090          //            cout << " List directory "<<dir<<endl;
2091          if (dir == "." || dir == "")
2092            flisttxt = gSystem->ConcatFileName(wdir.Data(), gSystem->BaseName(flisttxt));
2093          //                flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
2094    
2095          if (!gSystem->ChangeDirectory(ddir)) {
2096            cout << "Cannot change directory : " << ddir << endl;
2097            return 0;
2098          }
2099    
2100          cout << "Input file list : " << flisttxt << endl;
2101          ifstream in;
2102          in.open(flisttxt, ios::in); //open input file list
2103          if (!in.good()) {
2104            cout << " TList*  PamLevel2::GetListOfLevel2Files(TString, TString) --> ERROR opening the file " << endl;
2105            gSystem->ChangeDirectory(wdir); // back to the working directory
2106            return 0;
2107          }
2108          int line = 0;
2109          // ...........................
2110          // loop over file-list records
2111          // ...........................
2112          while (1) {
2113            TString file;
2114            in >> file;
2115            if (!in.good())
2116              break;
2117            line++;
2118            cout << "(*) " << file << endl;
2119            if (file.IsNull()) {
2120              cout << "-- list interrupted at line " << line << endl;
2121              break;
2122            }
2123            if (file.Contains("#"))
2124              file = file(0, file.First("#"));
2125            //
2126            // take only root files
2127            //
2128            if (file.EndsWith(".root")) {
2129              TString filedir;
2130              cout << ddir << endl;
2131              if ( ddir != "" ) {
2132                filedir = ddir; // take the input dir
2133              }
2134              else {
2135                gSystem->ChangeDirectory(wdir); // back to the working directory
2136                filedir = gSystem->DirName(file); // this will take the path if exist in the list otherwise it will return automatically the working dir
2137              };
2138              filedir.Append("/");
2139              //          char *fullpath = gSystem->ConcatFileName(gSystem->DirName(filedir), gSystem->BaseName(file));
2140              char *fullpath = gSystem->ConcatFileName(filedir.Data(), gSystem->BaseName(file));
2141              contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));// add file to the list
2142              cout << fullpath << endl;
2143              delete fullpath;
2144            }
2145            //          }else{
2146            //              if(file.Data()!="")cout << "File: "<<file<<" ---> missing "<< endl;
2147            //          };
2148          };
2149          in.close();
2150          // --------------------------------------
2151          // a single root file given as input
2152          // --------------------------------------
2153        }
2154        else {
2155          if (flisttxt.Contains("#"))
2156            flisttxt = flisttxt(0, flisttxt.First("#"));
2157          char *fullpath = gSystem->ConcatFileName(gSystem->DirName(flisttxt), gSystem->BaseName(flisttxt));
2158          contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));// add file to the list
2159          delete fullpath;
2160        };
2161        // ---------------------------------------------------------------------------------
2162        // case 2 : no input file/file-list provided --> read all files insede the directory
2163        // ---------------------------------------------------------------------------------
2164      }
2165      else {
2166    
2167        cout << "No input file list given." << endl;
2168        cout << "Check for existing root files." << endl;
2169        //          cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;
2170        if (ddir == "") {
2171          ddir = wdir;
2172          cout << "Level2 data directory : " << ddir << endl;
2173        };
2174    
2175        TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir), ddir);
2176        TList *temp = datadir->GetListOfFiles();
2177        if (!temp)
2178          return 0;
2179        //          temp->Print();
2180        //          cout << "*************************************" << endl;
2181    
2182        TIter next(temp);
2183        TSystemFile *questo = 0;
2184    
2185        while ((questo = (TSystemFile*) next())) {
2186          TString name = questo-> GetName();
2187          if (name.EndsWith(".root")) {
2188            //              const char *fullpath = gSystem->FindFile(ddir,name);
2189            //              char *fullpath;
2190            //              gSystem->IsFileInIncludePath(name,&fullpath);
2191            char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir), gSystem->BaseName(name));
2192            contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));
2193            delete fullpath;
2194          };
2195        }
2196        delete temp;
2197        delete datadir;
2198    
2199      };
2200      gSystem->ChangeDirectory(wdir); // back to the working directory
2201      //    cout << endl << "Selected files:" << endl;
2202      //    contents->Print();
2203      cout << contents->GetEntries() << " files \n";
2204      //    cout << endl;
2205      //    cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl;
2206      return contents;
2207    }
2208    ;
2209  //--------------------------------------  //--------------------------------------
2210  //  //
2211  //  //
2212  //--------------------------------------  //--------------------------------------
2213  /**  /**
2214   * Set branch addresses for Pamela friend trees   * Get the Pamela detector chains from a list of files and make them friends.
2215     * @param fl Pointer to a TList of TSystemFiles
2216     * @param detlist String to select trees to be included
2217     * @return Pointer to a TChain
2218   */   */
2219  void PamLevel2::SetBranchAddress(TTree *t){  TChain *PamLevel2::GetPamTree(TList *fl, TString detlist) {
2220      //
2221      //
2222      //
2223      if (pam_tree) {
2224        printf("WARNING: TChain *PamLevel2::GetPamTree(TList *fl, TString detlist) -- pam_tree already exists!\n ");
2225        return pam_tree;
2226      };
2227      //
2228    
2229      TChain *Trout = 0;
2230    
2231      // -------------------------------------------
2232      // set flags to include/exclude trees/branches
2233      // -------------------------------------------
2234      if (detlist.Contains("+AUTO", TString::kIgnoreCase)) {
2235        if (fl->GetEntries() > 0) {
2236          cout << "+AUTO" << endl;
2237          TFile *fprimo = new TFile(fl->At(0)->GetName());
2238          GetWhichTrees(fprimo);
2239          fprimo->Close();// AAAAARGGGGGHHHHH!!!!!!! non commentare questa riga, altrimenti si incasina il TChain
2240          fprimo->Delete();
2241        }
2242      };
2243      SetWhichTrees(detlist);
2244    
2245      TRK2    = TRK2 & t->GetBranchStatus("TrkLevel2");    // -------------------------------------------
2246      TRK1    = TRK1 & t->GetBranchStatus("TrkLevel1");    // build chains
2247      TRKh    = TRKh & t->GetBranchStatus("TrkHough");    // -------------------------------------------
2248      CAL2    = CAL2 & t->GetBranchStatus("CaloLevel2");    TChain *T = 0;
2249      CAL1    = CAL1 & t->GetBranchStatus("CaloLevel1");    TChain *C = 0;
2250      TOF    = TOF & t->GetBranchStatus("ToFLevel2");    TChain *O = 0;
2251      TRG    = TRG & t->GetBranchStatus("TrigLevel2");    TChain *R = 0;
2252      S4     = S4  & t->GetBranchStatus("S4Level2");    TChain *S = 0;
2253      ND     = ND  & t->GetBranchStatus("NDLevel2");    TChain *N = 0;
2254      AC     = AC  & t->GetBranchStatus("AcLevel2");    TChain *A = 0;
2255      ORB    = ORB & t->GetBranchStatus("OrbitalInfo");    TChain *B = 0;
2256      TChain *G = 0;
2257    
2258      // Tracker    TChain *L = 0;
2259      if(TRK1) {  
2260          t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel2"));    if (TRK2 || TRK1 || TRKh)
2261          cout << "Tracker      : set branch address TrkLevel1"<<endl;      T = new TChain("Tracker");
2262      };    if (CAL2 || CAL1)
2263      if(TRK2) {      C = new TChain("Calorimeter");
2264          t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel1"));    if (TOF)
2265          cout << "Tracker      : set branch address TrkLevel2"<<endl;      O = new TChain("ToF");
2266      };    if (TRG)
2267      if(TRKh) {      R = new TChain("Trigger");
2268          t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));    if (S4)
2269          cout << "Tracker      : set branch address TrkHough"<<endl;      S = new TChain("S4");
2270      };    if (ND)
2271            N = new TChain("NeutronD");
2272      // Calorimeter    if (AC)
2273      if(CAL1) {      A = new TChain("Anticounter");
2274          t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));    if (ORB)
2275          cout << "Calorimeter  : set branch address CaloLevel1"<<endl;      B = new TChain("OrbitalInfo");
2276      };    if (GP)
2277      if(CAL2) {      G = new TChain("h20");
2278          t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));    L = new TChain("SelectionList");
2279          cout << "Calorimeter  : set branch address CaloLevel2"<<endl;  
2280      };    // loop over files and create chains
2281          TIter next(fl);
2282      // ToF        TSystemFile *questo = 0;
2283      if(TOF) {    while ((questo = (TSystemFile*) next())) {
2284          t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));      TString name = questo->GetName();
2285          cout << "ToF          : set branch address ToFLevel2"<<endl;      cout << "File: " << name << endl;
2286      };      if (CheckLevel2File(name)) {
2287      // Trigger        if (TRK2 || TRK1 || TRKh)
2288      if(TRG) {          T->Add(name);
2289          t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));        if (CAL1 || CAL2)
2290          cout << "Trigger      : set branch address TrigLevel2"<<endl;          C->Add(name);
2291      };        if (TOF)
2292      // S4          O->Add(name);
2293      if(S4) {        if (TRG)
2294          t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));          R->Add(name);
2295          cout << "S4           : set branch address S4Level2"<<endl;        if (S4)
2296      };          S->Add(name);
2297      // Neutron Detector        if (ND)
2298      if(ND) {          N->Add(name);
2299          t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));        if (AC)
2300          cout << "NeutronD     : set branch address NDLevel2"<<endl;          A->Add(name);
2301      };        if (ORB)
2302      // Anticounters          B->Add(name);
2303      if(AC) {        if (GP)
2304          t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));          G->Add(name);
2305          cout << "Anticounter  : set branch address AcLevel2"<<endl;        if (SELLI == 1)
2306      };          L->Add(name);
     // OrbitalInfo  
     if(ORB) {  
         t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));  
         cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;  
2307      };      };
2308          };
2309    
2310      cout << "done chains\n";
2311      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
2312    
2313      // -------------------------------------------
2314      // make friends
2315      // -------------------------------------------
2316    
2317      // Tracker
2318      cout << "Friends: " << endl;
2319      if (T && (TRK2 || TRK1 || TRKh)) {
2320        if (!Trout)
2321          Trout = T;
2322        else
2323          Trout->AddFriend("Tracker");
2324        //  cout << "+Tacker"<<endl;
2325      };
2326      // Calorimeter
2327      if (C && (CAL2 || CAL1)) {
2328        if (!Trout)
2329          Trout = C;
2330        else
2331          Trout->AddFriend("Calorimeter");
2332        //  cout << "+Calorimeter"<<endl;
2333      };
2334      // ToF
2335      if (O && TOF) {
2336        if (!Trout)
2337          Trout = O;
2338        else
2339          Trout->AddFriend("ToF");
2340        //  cout << "+ToF"<<endl;
2341      };
2342      // Trigger
2343      if (R && TRG) {
2344        if (!Trout)
2345          Trout = O;
2346        else
2347          Trout->AddFriend("Trigger");
2348        //  cout << "+Trigger"<<endl;
2349      };
2350      // S4
2351      if (S && S4) {
2352        if (!Trout)
2353          Trout = O;
2354        else
2355          Trout->AddFriend("S4");
2356        //  cout << "+S4"<<endl;
2357      };
2358      // Neutron Detector
2359      if (N && ND) {
2360        if (!Trout)
2361          Trout = O;
2362        else
2363          Trout->AddFriend("NeutronD");
2364        //  cout << "+NeutronD"<<endl;
2365      };
2366      // Anticounters
2367      if (A && AC) {
2368        if (!Trout)
2369          Trout = O;
2370        else
2371          Trout->AddFriend("Anticounter");
2372        //  cout << "+Anticounter"<<endl;
2373      };
2374      // Orbital Info
2375      if (B && ORB) {
2376        if (!Trout)
2377          Trout = O;
2378        else
2379          Trout->AddFriend("OrbitalInfo");
2380        //  cout << "+OrbitalInfo"<<endl;
2381      };
2382      // GPamela
2383      if (G && GP) {
2384        if (!Trout)
2385          Trout = G;
2386        else
2387          Trout->AddFriend("h20");
2388        //  cout << "+h20"<<endl;
2389      };
2390    
2391      //  =====================================
2392      //  SET BRANCH-ADDRESS AFTER CHAIN+FRIEND
2393      //  =====================================
2394      SetBranchAddress(Trout);
2395    
2396      //  ------------------------------------
2397      //  finally handle selection trees...
2398      //  (it is not friend of pamela tree)
2399      //  ------------------------------------
2400    
2401      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
2402    
2403      // Selection List
2404      if (L && SELLI == 1) {
2405        cout << ">>> Found selection-list <<<" << endl;
2406        //  L->SetBranchAddress("RunEntry",&irun);
2407        L->SetBranchAddress("RunEntry", &irunt);//NEWNEW
2408        cout << "SelectionList: set branch address RunEntry" << endl;
2409        L->SetBranchAddress("EventEntry", &irunentry);
2410        cout << "SelectionList: set branch address EventEntry" << endl;
2411        sel_tree = L;
2412        //          if(!Trout)Trout=O;
2413        //          else Trout->AddFriend("SelectionList");
2414        cout << "+SelectionList" << endl;
2415        cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
2416      }
2417      else {
2418        //  cout << "SelectionList  : missing tree"<<endl;
2419        if (L)
2420          L->Delete();
2421      };
2422    
2423      //  --------------------------------------------
2424      //  return the pamela chain with all the friends
2425      //  --------------------------------------------
2426    
2427      pam_tree = Trout;
2428    
2429      return Trout;
2430  }  }
2431    
2432    //--------------------------------------
2433    //
2434    //
2435    //--------------------------------------
2436  /**  /**
2437   * Set branch addresses for Pamela friend trees   * Set branch addresses for Pamela friend trees
2438   */   */
2439  void PamLevel2::SetBranchAddress(TChain *t){  void PamLevel2::SetBranchAddress(TTree *t) {
2440    
2441      TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2");
2442      TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1");
2443      TRKh = TRKh & t->GetBranchStatus("TrkHough");
2444      CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2");
2445      CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1");
2446      TOF = TOF & t->GetBranchStatus("ToFLevel2");
2447      TRG = TRG & t->GetBranchStatus("TrigLevel2");
2448      S4 = S4 & t->GetBranchStatus("S4Level2");
2449      ND = ND & t->GetBranchStatus("NDLevel2");
2450      AC = AC & t->GetBranchStatus("AcLevel2");
2451      ORB = ORB & t->GetBranchStatus("OrbitalInfo");
2452      GP = GP & t->GetBranchStatus("h20");
2453    
2454      // Tracker
2455      if (TRK1) {
2456        t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel2"));
2457        cout << "Tracker      : set branch address TrkLevel1" << endl;
2458      };
2459      if (TRK2) {
2460        t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel1"));
2461        cout << "Tracker      : set branch address TrkLevel2" << endl;
2462      };
2463      if (TRKh) {
2464        t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
2465        cout << "Tracker      : set branch address TrkHough" << endl;
2466      };
2467    
2468      // Calorimeter
2469      if (CAL1) {
2470        t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
2471        cout << "Calorimeter  : set branch address CaloLevel1" << endl;
2472      };
2473      if (CAL2) {
2474        t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
2475        cout << "Calorimeter  : set branch address CaloLevel2" << endl;
2476      };
2477    
2478      // ToF
2479      if (TOF) {
2480        t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
2481        cout << "ToF          : set branch address ToFLevel2" << endl;
2482      };
2483      // Trigger
2484      if (TRG) {
2485        t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
2486        cout << "Trigger      : set branch address TrigLevel2" << endl;
2487      };
2488      // S4
2489      if (S4) {
2490        t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
2491        cout << "S4           : set branch address S4Level2" << endl;
2492      };
2493      // Neutron Detector
2494      if (ND) {
2495        t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
2496        cout << "NeutronD     : set branch address NDLevel2" << endl;
2497      };
2498      // Anticounters
2499      if (AC) {
2500        t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
2501        cout << "Anticounter  : set branch address AcLevel2" << endl;
2502      };
2503      // OrbitalInfo
2504      if (ORB) {
2505        t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
2506        cout << "OrbitalInfo  : set branch address OrbitalInfo" << endl;
2507      };
2508      // GPamela
2509      if (GP) {
2510        //  GetPointerTo("GPamela");
2511        if (!gp_obj)
2512          gp_obj = new GPamela();
2513        //  gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2514        // //       t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
2515        if (SELLI)
2516          t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
2517        else
2518          gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2519    
2520        cout << "h20          : set branch address GPamela " << endl;
2521      };
2522    
     TRK2    = TRK2 & t->GetBranchStatus("TrkLevel2");  
     TRK1    = TRK1 & t->GetBranchStatus("TrkLevel1");  
     TRKh    = TRKh & t->GetBranchStatus("TrkHough");  
     CAL1    = CAL1 & t->GetBranchStatus("CaloLevel1");  
     CAL2    = CAL2 & t->GetBranchStatus("CaloLevel2");  
     TOF    = TOF & t->GetBranchStatus("ToFLevel2");  
     TRG    = TRG & t->GetBranchStatus("TrigLevel2");  
     S4     = S4  & t->GetBranchStatus("S4Level2");  
     ND     = ND  & t->GetBranchStatus("NDLevel2");  
     AC     = AC  & t->GetBranchStatus("AcLevel2");  
     ORB    = ORB & t->GetBranchStatus("OrbitalInfo");  
   
     // Tracker  
      if(TRK2) {  
         t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));  
         cout << "Tracker      : set branch address TrkLevel2"<<endl;  
     };  
     if(TRK1) {  
         t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));  
         cout << "Tracker      : set branch address TrkLevel1"<<endl;  
     };  
      if(TRKh) {  
         t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));  
         cout << "Tracker      : set branch address TrkHough"<<endl;  
      };  
       
     // Calorimeter  
     if(CAL2) {  
         t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));  
         cout << "Calorimeter  : set branch address CaloLevel2"<<endl;  
     };    
     if(CAL1) {  
         t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));  
         cout << "Calorimeter  : set branch address CaloLevel1"<<endl;  
     };  
       
     // ToF      
     if(TOF) {  
         t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));  
         cout << "ToF          : set branch address ToFLevel2"<<endl;  
     };  
     // Trigger  
     if(TRG) {  
         t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));  
         cout << "Trigger      : set branch address TrigLevel2"<<endl;  
     };  
     // S4  
     if(S4) {  
         t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));  
         cout << "S4           : set branch address S4Level2"<<endl;  
     };  
     // Neutron Detector  
     if(ND) {  
         t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));  
         cout << "NeutronD     : set branch address NDLevel2"<<endl;  
     };  
     // Anticounters  
     if(AC) {  
         t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));  
         cout << "Anticounter  : set branch address AcLevel2"<<endl;  
     };  
     // OrbitalInfo  
     if(ORB) {  
         t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));  
         cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;  
     };  
       
2523  }  }
2524    /**
2525     * Set branch addresses for Pamela friend trees
2526     */
2527    void PamLevel2::SetBranchAddress(TChain *t) {
2528    
2529      //     TRK2    = TRK2 & t->GetBranchStatus("TrkLevel2");
2530      //     TRK1    = TRK1 & t->GetBranchStatus("TrkLevel1");
2531      //     TRKh    = TRKh & t->GetBranchStatus("TrkHough");
2532      //     CAL1    = CAL1 & t->GetBranchStatus("CaloLevel1");
2533      //     CAL2    = CAL2 & t->GetBranchStatus("CaloLevel2");
2534      //     TOF    = TOF & t->GetBranchStatus("ToFLevel2");
2535      //     TRG    = TRG & t->GetBranchStatus("TrigLevel2");
2536      //     S4     = S4  & t->GetBranchStatus("S4Level2");
2537      //     ND     = ND  & t->GetBranchStatus("NDLevel2");
2538      //     AC     = AC  & t->GetBranchStatus("AcLevel2");
2539      //     ORB    = ORB & t->GetBranchStatus("OrbitalInfo");
2540      //    GP     = GP & t->GetBranchStatus("h20");
2541    
2542      // Tracker
2543      if (TRK2) {
2544        t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2"));
2545        cout << "Tracker      : set branch address TrkLevel2" << endl;
2546      };
2547      if (TRK1) {
2548        t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1"));
2549        cout << "Tracker      : set branch address TrkLevel1" << endl;
2550      };
2551      if (TRKh) {
2552        t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough"));
2553        cout << "Tracker      : set branch address TrkHough" << endl;
2554      };
2555    
2556      // Calorimeter
2557      if (CAL2) {
2558        t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2"));
2559        cout << "Calorimeter  : set branch address CaloLevel2" << endl;
2560      };
2561      if (CAL1) {
2562        t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1"));
2563        cout << "Calorimeter  : set branch address CaloLevel1" << endl;
2564      };
2565    
2566      // ToF
2567      if (TOF) {
2568        t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2"));
2569        cout << "ToF          : set branch address ToFLevel2" << endl;
2570      };
2571      // Trigger
2572      if (TRG) {
2573        t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2"));
2574        cout << "Trigger      : set branch address TrigLevel2" << endl;
2575      };
2576      // S4
2577      if (S4) {
2578        t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2"));
2579        cout << "S4           : set branch address S4Level2" << endl;
2580      };
2581      // Neutron Detector
2582      if (ND) {
2583        t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2"));
2584        cout << "NeutronD     : set branch address NDLevel2" << endl;
2585      };
2586      // Anticounters
2587      if (AC) {
2588        t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2"));
2589        cout << "Anticounter  : set branch address AcLevel2" << endl;
2590      };
2591      // OrbitalInfo
2592      if (ORB) {
2593        t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo"));
2594        cout << "OrbitalInfo  : set branch address OrbitalInfo" << endl;
2595      };
2596      // GPamela
2597      //    cout <<"GP "<<GP<<endl;
2598      if (GP) {
2599        //  GetPointerTo("GPamela");
2600        if (!gp_obj)
2601          gp_obj = new GPamela();
2602        if (SELLI)
2603          t->SetBranchAddress("GPamela", GetPointerTo("GPamela"));
2604        else
2605          gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2606        //  gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri
2607        cout << "h20          : set branch address GPamela " << endl;
2608      };
2609      // SelectionList
2610      //     if(SELLI==1){
2611      //    t->SetBranchAddress("RunEntry",&irunt);//NEWNEW
2612      //    cout << "SelectionList: set branch address RunEntry"<<endl;
2613      //    t->SetBranchAddress("EventEntry",&irunentry);
2614      //    cout << "SelectionList: set branch address EventEntry"<<endl;
2615    
2616      //     }
2617    
2618    }
2619    
2620  //--------------------------------------  //--------------------------------------
2621  //  //
# Line 1376  void PamLevel2::SetBranchAddress(TChain Line 2623  void PamLevel2::SetBranchAddress(TChain
2623  //--------------------------------------  //--------------------------------------
2624  /**  /**
2625   * Get the Run tree chain from a list of files.   * Get the Run tree chain from a list of files.
2626   * @param fl Pointer to a TList of TSystemFiles   * @param fl Pointer to a TList of TSystemFiles
2627   * @return Pointer to a TChain   * @return Pointer to a TChain
2628   */   */
2629  TChain *PamLevel2::GetRunTree(TList *fl){  TChain *PamLevel2::GetRunTree(TList *fl) {
2630              //
2631      TChain *R = new TChain("Run");    //
2632          //
2633      // loop over files and create chains            if (run_tree) {
2634      TIter next(fl);      printf("WARNING: TChain *PamLevel2::GetRunTree(TList *fl) -- run_tree already exists!\n ");
2635      TSystemFile *questo = 0;      return run_tree;
2636      while ( (questo = (TSystemFile*) next()) ) {    };
2637          TString name =  questo->GetName();    //
2638  //              cout << "File: "<< name << endl;  
2639          if( CheckLevel2File(name) ){  
2640              R->Add(name);    TChain *R = new TChain("Run");
2641          };  
2642      }    // loop over files and create chains
2643          TIter next(fl);
2644      TSystemFile *questo = 0;
2645      while ((questo = (TSystemFile*) next())) {
2646        TString name = questo->GetName();
2647        //          cout << "File: "<< name << endl;
2648        if (CheckLevel2File(name)) {
2649          R->Add(name);
2650        };
2651      }
2652    
2653      if (RUN && R->GetNtrees()) {
2654    
2655      R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));      R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
2656      cout << "Run         : set branch address RunInfo"<<endl;      cout << "Run         : set branch address RunInfo" << endl;
2657      R->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano      R->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano
2658      cout << "Software    : set branch address SoftInfo"<<endl; // Emiliano      cout << "Software    : set branch address SoftInfo" << endl; // Emiliano
2659        
2660      return R;      irunoffset = new int[R->GetNtrees()];
2661            if (DBG) {
2662          cout << "----------------------------------------------------" << endl;
2663          cout << "irun\t | ";
2664          cout << "tree\t |";
2665          //        cout << "offset\t |";
2666          cout << "RUN\t";
2667          cout << "FRAG\t";
2668          cout << "NEVENTS\t";
2669          cout << "absolute time\t\t\t";
2670          cout << "on-board time";
2671          cout << endl;
2672        }
2673        for (Int_t ii = 0; ii < R->GetEntries(); ii++) {
2674          R->GetEntry(ii);
2675          if (DBG) {
2676            cout << ii << "\t | ";
2677            cout << R->GetTreeNumber() << "\t |";
2678            //          cout << R->GetChainOffset()<< "\t |";
2679            cout << GetRunInfo()->ID << "\t";
2680            cout << GetRunInfo()->ID_RUN_FRAG << "\t";
2681            cout << GetRunInfo()->NEVENTS << "\t";
2682            cout << GetRunInfo()->RUNHEADER_TIME << " <---> " << GetRunInfo()->RUNTRAILER_TIME << "\t";
2683            cout << GetRunInfo()->RUNHEADER_OBT << " <---> " << GetRunInfo()->RUNTRAILER_OBT << "\t";
2684            cout << endl;
2685          }
2686          irunoffset[R->GetTreeNumber()] = R->GetChainOffset();
2687        }
2688        cout << "N.run = " << R->GetEntries() << endl;
2689        cout << "----------------------------------------------------" << endl;
2690    
2691      }
2692      else {
2693        delete R;
2694        R = 0;
2695      }
2696    
2697      run_tree = R;
2698    
2699      return R;
2700    
2701  }  }
2702  //--------------------------------------  //--------------------------------------
2703  //  //
# Line 1408  TChain *PamLevel2::GetRunTree(TList *fl) Line 2705  TChain *PamLevel2::GetRunTree(TList *fl)
2705  //--------------------------------------  //--------------------------------------
2706  /**  /**
2707   * Get the Run tree  from a file.   * Get the Run tree  from a file.
2708   * @param f Pointer to a TFile   * @param f Pointer to a TFile
2709   * @return Pointer to a TTree   * @return Pointer to a TTree
2710   */   */
2711  TTree *PamLevel2::GetRunTree(TFile *f){  TTree *PamLevel2::GetRunTree(TFile *f) {
2712      if (run_tree) {
2713        printf("WARNING: TTree *PamLevel2::GetRunTree(TFile *f) -- run_tree already exists!\n ");
2714        return run_tree;
2715      };
2716    
2717      cout << "TTree *PamLevel2::GetRunTree(TFile *f) -- obsolte " << endl;
2718    
2719      TTree *T = (TTree*) f->Get("Run");
2720    
2721      if (T) {
2722        T->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));
2723        cout << "Run         : set branch address RunInfo" << endl;
2724        T->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano
2725        cout << "Software    : set branch address SoftInfo" << endl; // Emiliano
2726    
2727      }
2728    
2729      run_tree = (TChain*) T;
2730    
2731      return T;
2732    
     TTree *R = (TTree*)f->Get("Run");  
       
     R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo"));  
     cout << "Run         : set branch address RunInfo"<<endl;  
     R->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano  
     cout << "Software    : set branch address SoftInfo"<<endl; // Emiliano  
       
     return R;  
       
2733  }  }
2734  /**  /**
2735   * Update the runinfo informations (to be used to have Run infos event by event basis)   * Update the runinfo informations (to be used to have Run infos event by event basis)
2736   * @param run Pointer to the chain/tree which contains run infos   * @param run Pointer to the chain/tree which contains run infos
2737   * @return true if a new run has been read, false if it is still the same run   * @return true if a new run has been read, false if it is still the same run
2738   */   */
2739  Bool_t PamLevel2::UpdateRunInfo(TChain *run, ULong64_t iev){  Bool_t PamLevel2::UpdateRunInfo(TChain *run, Long64_t iev) {
2740    //    //
2741    // check if we have already called once GetEntry, if not call it    // check if we have already called once GetEntry, if not call it
2742    //    //
2743    if ( run->GetEntries() <= 0 ) return(false);    cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, Long64_t iev) --- ATTENZIONE --- NON E` MANTENUTA!!!!!!!.... "
2744          << endl;
2745      if (!run) {
2746        cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, ULong64_t iev) -- ERROR -- missing RunInfo tree " << endl;
2747        return (false);
2748      }
2749      if (run->GetEntries() <= 0)
2750        return (false);
2751    //    //
2752    Int_t oldrun = irun;  
2753    if ( irun < 0 ){    //  Int_t oldrun = irun;
2754      irun = 0;    Long64_t oldrun = irun;
2755      run->GetEntry(0);  
2756      runfirstentry = 0ULL;    // --------------------------------------
2757      runlastentry += (ULong64_t)(this->GetRunInfo()->NEVENTS) - 1ULL;    // if it is a full file (not preselected)
2758    };    // --------------------------------------
2759    while ( iev > (runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS-1)) && irun < run->GetEntries() ){    if (SELLI == 0) {
2760      //    printf(" iev %llu %u %llu \n",iev,this->GetRunInfo()->NEVENTS,(ULong64_t)(runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS)));  
2761      irun++;      //
2762      run->GetEntry(irun);      // the absolute time is necessary to relate the event with the run
2763      runfirstentry = runlastentry+1ULL;      //
2764      runlastentry += (ULong64_t)(this->GetRunInfo()->NEVENTS);      if (!GetOrbitalInfo() && !ISGP) {
2765          cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, ULong64_t iev) -- ERROR -- missing OrbitalInfo " << endl;
2766          return (false);
2767        }
2768    
2769        ULong64_t abstime = 0;
2770        if (GetOrbitalInfo())
2771          abstime = GetOrbitalInfo()->absTime;
2772    
2773        //
2774        // the first time the routine is called, set run search from the beginning
2775        //
2776        if (irun < 0LL) {
2777          irun = 0LL;
2778          run->GetEntry(irun);
2779          runfirstentry = 0LL;
2780          runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS);
2781          if ((Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL)
2782            runlastentry -= 1LL;
2783    
2784          if (ISGP && run->GetEntries() != 1) {
2785            cout << "** WARNING ** simulated files are assumed to have 1 single run, not " << run->GetEntries() << endl;
2786            cout << "** WARNING ** run will not be updated" << endl;
2787          }
2788    
2789        };
2790        //
2791        if (ISGP)
2792          abstime = GetRunInfo()->RUNHEADER_TIME; // BARBATRUCCO
2793        //
2794        if (irun == run->GetEntries() - 1LL && !(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime
2795            <= GetRunInfo()->RUNTRAILER_TIME)) {
2796          irun = -1LL;
2797          irunt = -1LL;
2798          runfirstentry = 0LL;
2799          runlastentry = -1LL;
2800        };
2801        // modificato il controllo sull'aggiornamento del run, per evitare problemi
2802        // dovuti agli eventi annidati (NB! NEVENTS conta anche questi!!)
2803        //
2804        bool fromfirst = true;
2805        //
2806        while (!(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime <= GetRunInfo()->RUNTRAILER_TIME) && irun
2807            < run->GetEntries() - 1LL) {
2808          //      while ( iev > (runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS-1)) && irun < run->GetEntries() ){
2809          irun++;
2810          run->GetEntry(irun);
2811          runfirstentry = runlastentry;
2812          if ((Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL)
2813            runfirstentry += 1LL;
2814          runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS);
2815          //          cout << " ))))) UPDATE RUN INFO (((((  @iev "<<iev<<" run "<<GetRunInfo()->ID<<" irun "<<irun<<endl;
2816          //          cout << "runfirstentry "<<runfirstentry<<endl;
2817          //          printf(" iev %llu %u %llu \n",iev,this->GetRunInfo()->NEVENTS,(ULong64_t)(runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS)));
2818          //          printf(" abstime %u trailertime %u \n",abstime,GetRunInfo()->RUNTRAILER_TIME);
2819          //          printf(" IDRUN %u \n",GetRunInfo()->ID);
2820          //
2821          //          prevshift = 0;
2822          //
2823          if (irun == (Long64_t)(run->GetEntries() - 1LL) && fromfirst && !(abstime >= GetRunInfo()->RUNHEADER_TIME
2824              && abstime <= GetRunInfo()->RUNTRAILER_TIME)) {
2825            printf(" resetting irun  (it should NOT happen!!!)\n");
2826            fromfirst = false;
2827            irun = 0;
2828            run->GetEntry(irun);
2829            runfirstentry = 0ULL;
2830            runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS);
2831            if ((Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL)
2832              runlastentry -= 1LL;
2833          };
2834          //
2835        };
2836        //
2837        if (!(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime <= GetRunInfo()->RUNTRAILER_TIME)) {
2838          printf(" Something very wrong here: cannot find RUN containing absolute time %llu \n", abstime);
2839          return false;
2840        }
2841        //
2842        if (irun == oldrun || irun >= run->GetEntries())
2843          return (false);
2844        //
2845        //  printf(" iev %llu irun %i nevents %u 1st %llu last %llu \n",iev,irun,this->GetRunInfo()->NEVENTS,(ULong64_t)runfirstentry,(ULong64_t)runlastentry);
2846        //
2847        prevshift = 0;
2848        cout << " ))))) UPDATE RUN INFO (((((  @iev " << iev << " run " << GetRunInfo()->ID << " irun " << irun << endl;
2849        //      cout << "runfirstentry "<<runfirstentry<<endl;
2850        return (true);
2851    };    };
2852      // ----------------------------------------------------
2853      // if it is a preselected file (there is SelectionList)
2854      // NBNB - the event tree MUST be read first
2855      // ----------------------------------------------------
2856      if (SELLI == 1) {
2857        sel_tree->GetEntry(iev);
2858        //      cout << irun << " "<< irunentry << endl;
2859        if (irun != oldrun) {
2860          run->GetEntry(irun);
2861          cout << " ))))) UPDATE RUN INFO (((((  @iev " << iev << " run " << GetRunInfo()->ID << " irun " << irun << endl;
2862          prevshift = 0;
2863          return true;
2864        }
2865        return false;
2866      }
2867    
2868      return false;
2869    //    //
2870    if ( irun == oldrun || irun >= run->GetEntries() ) return(false);  }
2871    //  ;
2872    //  printf(" iev %llu irun %i nevents %u 1st %llu last %llu \n",iev,irun,this->GetRunInfo()->NEVENTS,(ULong64_t)runfirstentry,(ULong64_t)runlastentry);  
2873    //  Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) {
2874    return(true);      
2875      if (!run_tree) {
2876        cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree not loaded" << endl;
2877        return false;
2878      }
2879      if (run_tree->GetEntries() <= 0) {
2880        cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree is empty" << endl;
2881        return (false);
2882      }
2883    
2884      Int_t oldrun = irun; // store current run index
2885    
2886      // -----------------------------------------------------------------------
2887      // the first time the routine is called, set run search from the beginning
2888      // -----------------------------------------------------------------------
2889    
2890      if (irun < 0) {
2891        irun = 0LL;
2892        irunt = 0LL;
2893        irunentry = 0;
2894        prevshift = 0;
2895        run_tree->GetEntry(irun);
2896        if (!GetOrbitalInfo())
2897          cout << "** WARNING ** missing OrbitalInfo ---> run info might be not correctly updated " << endl;
2898        if (gltsync)
2899          delete gltsync; //Emiliano
2900        if (!dbc || (dbc && !dbc->IsConnected()))
2901          SetDBConnection(); //Emiliano
2902        gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0, "ID", dbc, false); //Emiliano // the "false" means not to use level0 file (not necessary here)
2903        if (dbc){
2904          dbc->Close();// Emiliano
2905          dbc=0;
2906        };
2907      };
2908      // ---------------------------------------------------------------
2909      // retrieve OBT and absolute time of the event
2910      // ---------------------------------------------------------------
2911      ULong64_t abstime = 0LL;
2912      //    ULong64_t obt     = 0LL; // Emiliano
2913      Long64_t obt = 0LL; // Emiliano, Long64_t GL_TIMESYNC::DBobt(UInt_t obt) since depending on the situation OBT is lowered or boosted
2914      if (GetOrbitalInfo()) {
2915        abstime = GetOrbitalInfo()->absTime;
2916        obt = gltsync->DBobt(GetOrbitalInfo()->OBT); // Emiliano
2917      }
2918      else {
2919        abstime = GetRunInfo()->RUNHEADER_TIME;
2920        obt = gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT); // Emiliano
2921      }
2922    
2923      // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
2924      // if it is a full file (not preselected)
2925      // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
2926      if (SELLI == 0 || SELLI == 2) { // Emiliano
2927    
2928        // ---------------------------------------------------------------
2929        // increment dead and live-time counters
2930        // (only when reading a file not preselected)
2931        // ---------------------------------------------------------------
2932        if (SELLI == 0) {
2933          if (GetTrigLevel2()) {
2934            totdltime[0] += GetTrigLevel2()->dltime[0];
2935            totdltime[1] += GetTrigLevel2()->dltime[1];
2936          }
2937          totdltime[2]++;
2938        }
2939    
2940        //
2941        bool fromfirst = true; // first loop over runs
2942    
2943    
2944        // ------------------------------------------------------
2945        // loop over runs to find the one that contains the event
2946        // ------------------------------------------------------
2947        while ((
2948        //          (
2949        //              !(abstime >= GetRunInfo()->RUNHEADER_TIME &&    // check on absolute time (s)
2950        //                abstime <= GetRunInfo()->RUNTRAILER_TIME) &&
2951        //              !(obt >= GetRunInfo()->RUNHEADER_OBT &&         // additional check on OBT (ms)
2952        //                obt <= GetRunInfo()->RUNTRAILER_OBT)
2953        //              )
2954    
2955        !(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s)
2956            abstime <= GetRunInfo()->RUNTRAILER_TIME) || !(obt >= gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) && // additional check on OBT (ms) // Emiliano
2957            obt <= gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT)) // Emiliano
2958            || GetRunInfo()->NEVENTS == 0
2959        //          || !(irunentry < GetRunInfo()->NEVENTS-1-prevshift) // ERRORE!!! fa saltare i run con 1 evento
2960            || !(irunentry <= GetRunInfo()->NEVENTS - 1 - prevshift)) && irun < run_tree->GetEntries()) {
2961    
2962          //            if( !(abstime >= GetRunInfo()->RUNHEADER_TIME &&abstime <= GetRunInfo()->RUNTRAILER_TIME)  )cout << "ABS TIME "<<abstime << " " <<GetRunInfo()->RUNTRAILER_TIME <<endl;
2963          //            if( !(obt >= GetRunInfo()->RUNHEADER_OBT && obt <= GetRunInfo()->RUNTRAILER_OBT) )cout << "OBT TIME "<< obt <<" "<< GetRunInfo()->RUNTRAILER_OBT << endl;
2964          //            if( GetRunInfo()->NEVENTS==0  )cout <<"GetRunInfo()->NEVENTS==0 "<<endl;
2965          //            if( !(irunentry <= GetRunInfo()->NEVENTS-1-prevshift) ) cout << "irunentry > "<<GetRunInfo()->NEVENTS-1-prevshift << endl;
2966          // - - - - - - - - - - - - -
2967          // irunentry = position of current entry, relative to the run
2968          // prevshift = shift needed to synchronize l0 and l2 data (nested events)
2969          // - - - - - - - - - - - - -
2970    
2971          // -----------------------------------------
2972          // store dead and live-time of previous run
2973          // -----------------------------------------
2974          //            if(SELLI==0){
2975          if (SELLI != 2) {
2976            if (fromfirst) {
2977              if (oldrun == irun) {
2978                /// decrement counters
2979                if (GetTrigLevel2()) {
2980                  totdltime[0] -= GetTrigLevel2()->dltime[0];//live-time
2981                  totdltime[1] -= GetTrigLevel2()->dltime[1];//dead-time
2982                }
2983                totdltime[2]--; //event counter
2984                if (DBG) {
2985                  cout << endl;
2986                  cout << "n.events     : " << totdltime[2] << endl;
2987                  cout << "RUN LIVE-TIME: " << totdltime[0] * 0.16 << " ms" << endl;
2988                  cout << "RUN DEAD-TIME: " << totdltime[1] * 0.01 << " ms" << endl;
2989                }
2990              }
2991              else {
2992                totdltime[0] = 0;//live-time
2993                totdltime[1] = 0;//dead-time
2994                totdltime[2] = 0; //event counter
2995                if (DBG)
2996                  cout << " *** JUMP RUN *** irun " << irun << endl;
2997              }
2998              /// add an entry
2999              if (run_tree_clone)
3000                if (run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries())
3001                  run_tree_clone->GetBranch("DeadLiveTime")->Fill();
3002              /// reset counters
3003              if (GetTrigLevel2()) {
3004                totdltime[0] = GetTrigLevel2()->dltime[0];//live-time
3005                totdltime[1] = 0; //dead-time
3006              }
3007              totdltime[2] = 1; //event counter
3008            }
3009          }
3010          //            }
3011    
3012          irun++;
3013          // ------------------------------------
3014          // if the end of run tree is reached...
3015          // ------------------------------------
3016          if (irun == run_tree->GetEntries()) {
3017            if (!fromfirst) {
3018              // -----------------------------------------------------
3019              // if it happened already once and the run was not found
3020              // ---> exit with error
3021              // -----------------------------------------------------
3022              cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- ERROR -- event entry #" << iev
3023                  << " does not belong to any run (should not happen)" << endl;
3024              return false;
3025            }
3026            // -----------------------------------------
3027            // ...otherwise repeat search from beginning
3028            // -----------------------------------------
3029            cout
3030                << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- reached end of run tree. searchin again from beginning "
3031                << endl;
3032            fromfirst = false;
3033            irun = 0LL;
3034            runfirstentry = 0LL;
3035          }
3036          // -------------------------------------------------------------------
3037          // save the index of the first entry of the run, relative to pam_tree,
3038          // and read a new run
3039          // -------------------------------------------------------------------
3040          if (irun > 0)
3041            runfirstentry += (GetRunInfo()->NEVENTS) - prevshift;
3042          irunentry = 0;
3043          prevshift = 0;
3044          run_tree->GetEntry(irun);//update runinfo
3045          irunt = irun - irunoffset[run_tree->GetTreeNumber()];
3046          if (gltsync)
3047            delete gltsync; // Emiliano
3048          if (!dbc || (dbc && !dbc->IsConnected()))
3049            SetDBConnection(); //Emiliano
3050          gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0, "ID", dbc, false); // Emiliano
3051          if (dbc){
3052            dbc->Close(); // Emiliano
3053            dbc=0;
3054          };
3055          if (gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) > gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT)) { // Emiliano
3056            cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- irun " << irun
3057                << "  has RUNHEADER_OBT>=RUNTRAILER_OBT " << endl;
3058            cout
3059                << "                                                            (NB!! in this case some events are assigned to a wrong run)"
3060                << endl;
3061          }
3062          //            if(hasfrag &&  fragid != GetRunInfo()->ID){
3063          //                cout << "... where is the next fragment ??"<<endl;
3064          //            }
3065        };
3066    
3067        // --------------------------------------
3068        // if there was no need to update the run
3069        // ---> exit with FALSE
3070        // --------------------------------------
3071        if (irun == oldrun)
3072          return (false);
3073    
3074        // --------------------------------------
3075        // ... otherwise
3076        // --------------------------------------
3077    
3078    
3079        // --------------------------------------
3080        // ---> exit with TRUE
3081        // --------------------------------------
3082        if (DBG)
3083          cout << endl << " ))))) UPDATE RUN INFO (((((  @iev " << iev << " run " << GetRunInfo()->ID << " irun " << irun
3084              << endl;
3085        // ----------------------------------------------------
3086        // update the tracker parameters
3087        // (non ho trovato nessun altro modo sicuro di farlo...)
3088        // ----------------------------------------------------
3089        if (!dbc || (dbc && !dbc->IsConnected()))
3090          SetDBConnection();
3091        TrkParams::Set(GetRunInfo(), dbc);
3092        if (dbc){
3093          dbc->Close();
3094          dbc=0;
3095        };
3096    
3097        // ----------------------------------------------------
3098        // then check if the run has a fragment
3099        // in this case we have to switch to the next fragment
3100        // when the end of the first fragment is reached
3101        // ----------------------------------------------------
3102        if (GetRunInfo()->ID_RUN_FRAG != 0 &&
3103        //      GetRunInfo()->ID_RUN_FRAG != GetRunInfo()->ID &&
3104            DBG && true) {
3105          cout << "* fragment *" << endl;
3106        }
3107    
3108        return (true);
3109      };
3110      // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
3111      // if it is a preselected file (there is SelectionList)
3112      // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
3113      // irun  = run entry relative to the chain
3114      // irunt = run entry relative to the tree
3115      if (SELLI == 1) {
3116        sel_tree->GetEntry(iev);// read irunt from SelectionList
3117        irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW
3118        if (irun != oldrun) {
3119          if (irun < run_tree->GetEntries())
3120            run_tree->GetEntry(irun);
3121          // check if the time is ok (with merged files it is not...)
3122          // if not loop over run and look for the proper entry
3123          bool SECONDO_GIRO = false;
3124          //            Long64_t irun_start   = irun;
3125          int offset_start = irunoffset[sel_tree->GetTreeNumber()];
3126          while (((!(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s)
3127              abstime <= GetRunInfo()->RUNTRAILER_TIME)
3128          //                        ||
3129          //                        !(obt >= GetRunInfo()->RUNHEADER_OBT &&         // additional check on OBT (ms)
3130          //                          obt <= GetRunInfo()->RUNTRAILER_OBT)
3131          ) || GetRunInfo()->NEVENTS == 0)
3132          //                && irun < run_tree->GetEntries()
3133          ) {
3134    
3135            if (DBG) {
3136              cout << " (test) ";
3137              cout << " tree " << sel_tree->GetTreeNumber();
3138              cout << " irunt " << irunt;
3139              cout << " offset " << irunoffset[sel_tree->GetTreeNumber()];
3140              cout << " abs " << abstime;
3141              cout << " >> " << GetRunInfo()->RUNHEADER_TIME << " " << GetRunInfo()->RUNTRAILER_TIME;
3142              cout << " obt " << obt;
3143              cout << " >> " << GetRunInfo()->RUNHEADER_OBT << " " << GetRunInfo()->RUNTRAILER_OBT;
3144              cout << " *** JUMP RUN *** irun " << irun;
3145              cout << endl;
3146            }
3147            //              irun++;
3148            irunoffset[sel_tree->GetTreeNumber()]++;
3149            irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW
3150            if (irun == run_tree->GetEntries() && SECONDO_GIRO) {
3151              //            if(irun == irun_start ){
3152              cout << " ...grrrvzzkhhhajsdkj!!!! " << endl;
3153              irunoffset[sel_tree->GetTreeNumber()] = offset_start;
3154              return false;
3155            }
3156            if (irun >= run_tree->GetEntries() || irun < 0) {
3157              cout << "irun = " << irun << " >>  search from the beginning... <<" << endl;
3158              SECONDO_GIRO = true;
3159              irun = 0;
3160              irunoffset[sel_tree->GetTreeNumber()] = -irunt;
3161            }
3162            run_tree->GetEntry(irun);
3163          }
3164    
3165          if (DBG) {
3166            cout << " (test) ";
3167            cout << " tree " << sel_tree->GetTreeNumber();
3168            cout << " irunt " << irunt;
3169            cout << " offset " << irunoffset[sel_tree->GetTreeNumber()];
3170            cout << " abs " << abstime;
3171            cout << " >> " << GetRunInfo()->RUNHEADER_TIME << " " << GetRunInfo()->RUNTRAILER_TIME;
3172            cout << " obt " << obt;
3173            cout << " >> " << GetRunInfo()->RUNHEADER_OBT << " " << GetRunInfo()->RUNTRAILER_OBT;
3174          }
3175          if (DBG)
3176            cout << endl;
3177          if (DBG)
3178            cout << endl << " ))))) UPDATE RUN INFO (((((  @iev " << iev << " run " << GetRunInfo()->ID << " (run-entry "
3179                << irun << ")" << endl;
3180          // ----------------------------------------------------
3181          // update the tracker parameters
3182          // (non ho trovato nessun altro modo sicuro di farlo...)
3183          // ----------------------------------------------------
3184          if (!dbc || (dbc && !dbc->IsConnected()))
3185            SetDBConnection();
3186          TrkParams::Set(GetRunInfo(), dbc);
3187          if (dbc){
3188            dbc->Close();
3189            dbc=0;
3190          };
3191          //            cout << endl;
3192          prevshift = 0;
3193          return true;
3194        }
3195        return false;
3196      }
3197    
3198      return false;
3199    //    //
3200  };  }
3201    ;
3202  /**  /**
3203   * Update the runinfo informations (to be used to have Run infos event by event basis)   * Update the runinfo informations (to be used to have Run infos event by event basis)
3204   * @param run Pointer to the chain/tree which contains run infos   * @param run Pointer to the chain/tree which contains run infos
3205   * @return true if a new run has been read, false if it is still the same run   * @return true if a new run has been read, false if it is still the same run
3206   */   */
3207  Bool_t PamLevel2::UpdateRunInfo(TTree *run, ULong64_t iev){  Bool_t PamLevel2::UpdateRunInfo(TTree *run, Long64_t iev) {
3208    return(UpdateRunInfo((TChain*)run,iev));    return (UpdateRunInfo((TChain*) run, iev));
3209  };  }
3210    ;
3211    
3212  //--------------------------------------  //--------------------------------------
3213  //  //
# Line 1472  Bool_t PamLevel2::UpdateRunInfo(TTree *r Line 3215  Bool_t PamLevel2::UpdateRunInfo(TTree *r
3215  //--------------------------------------  //--------------------------------------
3216  /**  /**
3217   * Set which trees shoul be analysed   * Set which trees shoul be analysed
3218   * @param detlist TString containing the sequence of trees required   * @param detlist TString containing the sequence of trees required
3219  */   */
3220  void PamLevel2::SetWhichTrees(TString detlist){  void PamLevel2::SetWhichTrees(TString detlist) {
3221            
3222      if(detlist.IsNull() || detlist.Contains("+ALL", TString::kIgnoreCase)){    //    if(detlist.IsNull() || detlist.Contains("+ALL", TString::kIgnoreCase)){
3223          CAL1 = true;    if (detlist.Contains("+ALL", TString::kIgnoreCase)) {
         CAL2 = true;  
         TRK2 = true;  
         TRK1 = false;  
         TRKh = false;  
         TRG = true;  
         TOF = true;  
         S4  = true;  
         ND  = true;  
         AC  = true;  
         ORB = true;  
     }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){  
         CAL1 = false;  
         CAL2 = false;  
         TRK2 = false;  
         TRK1 = false;  
         TRKh = false;  
         TRG = false;  
         TOF = false;  
         S4  = false;  
         ND  = false;  
         AC  = false;  
         ORB = false;  
     };  
       
 //  -------------------------------------------------------------------------  
     if( detlist.Contains("CAL1", TString::kIgnoreCase) ){  
         if ( detlist.Contains("-CAL1", TString::kIgnoreCase) )CAL1=false;  
         if ( detlist.Contains("+CAL1", TString::kIgnoreCase) )CAL1=true;  
     };  
           
     if( detlist.Contains("CAL2", TString::kIgnoreCase)){  
         if ( detlist.Contains("-CAL2", TString::kIgnoreCase) )CAL2=false;  
         if ( detlist.Contains("+CAL2", TString::kIgnoreCase) )CAL2=true;  
     };  
           
     if( detlist.Contains("+CAL", TString::kIgnoreCase) && !CAL1 && !CAL2 )CAL2=true;  
     if( detlist.Contains("-CAL", TString::kIgnoreCase) && CAL1 && CAL2 ){  
         CAL2=false;  
         CAL1=false;  
     }  
 //  -------------------------------------------------------------------------  
     if( detlist.Contains("TRK1", TString::kIgnoreCase) ){  
         if ( detlist.Contains("-TRK1", TString::kIgnoreCase) )TRK1=false;  
         if ( detlist.Contains("+TRK1", TString::kIgnoreCase) )TRK1=true;  
     };  
           
     if( detlist.Contains("TRK2", TString::kIgnoreCase)){  
         if ( detlist.Contains("-TRK2", TString::kIgnoreCase) )TRK2=false;  
         if ( detlist.Contains("+TRK2", TString::kIgnoreCase) )TRK2=true;  
     };  
   
     if( detlist.Contains("TRKh", TString::kIgnoreCase)){  
         if ( detlist.Contains("-TRKh", TString::kIgnoreCase) )TRKh=false;  
         if ( detlist.Contains("+TRKh", TString::kIgnoreCase) )TRKh=true;  
     };  
           
     if( detlist.Contains("+TRK", TString::kIgnoreCase) && !TRK1 && !TRK2 && !TRKh )TRK2=true;  
     if( detlist.Contains("-TRK", TString::kIgnoreCase) && TRK1 && TRK2 && TRKh){  
         TRK2=false;  
         TRK1=false;  
         TRKh=false;  
     }  
 //  -------------------------------------------------------------------------  
       
     if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false;  
     else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true;  
       
     if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false;  
     else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true;  
       
     if( detlist.Contains("-S4",  TString::kIgnoreCase) )S4  = false;  
     else if( detlist.Contains("+S4",  TString::kIgnoreCase) )S4  = true;  
       
     if( detlist.Contains("-ND",  TString::kIgnoreCase) )ND  = false;  
     else if( detlist.Contains("+ND",  TString::kIgnoreCase) )ND  = true;  
       
     if( detlist.Contains("-AC",  TString::kIgnoreCase) )AC  = false;  
     else if( detlist.Contains("+AC",  TString::kIgnoreCase) )AC  = true;  
       
     if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false;  
     else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true;  
   
 //     cout<< "Set detector list --> ";  
 //     if(TRK1)cout<<"TRK1 ";  
 //     if(TRK2)cout<<"TRK2 ";  
 //     if(TRKh)cout<<"TRKH ";  
 //     if(CAL1)cout<<"CAL1 ";  
 //     if(CAL2)cout<<"CAL2 ";  
 //     if(TOF)cout<<"TOF ";  
 //     if(TRG)cout<<"TRG ";  
 //     if(AC)cout<<"AC ";  
 //     if(ND)cout<<"ND ";  
 //     if(S4)cout<<"S4 ";  
 //     if(ORB)cout<<"ORB ";  
 //     cout << endl;  
       
 };  
3224    
3225        cout << " ======================================================== " << endl;
3226        cout << "                       (( WARNING ))                      " << endl;
3227        cout << " The meaning of the option +ALL has changed!!             " << endl;
3228        cout << " Now it includes really all (level0+level1+level2+gpamela)" << endl;
3229        cout << " and the file is discarded if it does not contain         " << endl;
3230        cout << " all trees or  if level0 files are not available!!        " << endl;
3231        cout << " ======================================================== " << endl;
3232    
3233        CAL0 = true;
3234        CAL1 = true;
3235        CAL2 = true;
3236        TRK2 = true;
3237        TRK1 = true;
3238        TRKh = true;
3239        TRK0 = true;
3240        TRG = true;
3241        TOF = true;
3242        TOF0 = true;
3243        S4 = true;
3244        ND = true;
3245        AC = true;
3246        ORB = true;
3247        GP = true;
3248      }
3249      else if (detlist.Contains("-ALL", TString::kIgnoreCase)) {
3250        CAL0 = false;
3251        CAL1 = false;
3252        CAL2 = false;
3253        TRK2 = false;
3254        TRK1 = false;
3255        TRKh = false;
3256        TRK0 = false;
3257        TRG = false;
3258        TOF = false;
3259        TOF0 = false;
3260        S4 = false;
3261        ND = false;
3262        AC = false;
3263        ORB = false;
3264        GP = false;
3265      };
3266    
3267      //  -------------------------------------------------------------------------
3268      if (detlist.Contains("CAL1", TString::kIgnoreCase)) {
3269        if (detlist.Contains("-CAL1", TString::kIgnoreCase))
3270          CAL1 = false;
3271        if (detlist.Contains("+CAL1", TString::kIgnoreCase))
3272          CAL1 = true;
3273      };
3274    
3275      if (detlist.Contains("CAL0", TString::kIgnoreCase)) {
3276        if (detlist.Contains("-CAL0", TString::kIgnoreCase))
3277          CAL0 = false;
3278        if (detlist.Contains("+CAL0", TString::kIgnoreCase))
3279          CAL0 = true;
3280      };
3281    
3282      if (detlist.Contains("CAL2", TString::kIgnoreCase)) {
3283        if (detlist.Contains("-CAL2", TString::kIgnoreCase))
3284          CAL2 = false;
3285        if (detlist.Contains("+CAL2", TString::kIgnoreCase))
3286          CAL2 = true;
3287      };
3288    
3289      if (detlist.Contains("+CAL", TString::kIgnoreCase) && !CAL1 && !CAL2)
3290        CAL2 = true;
3291      if (detlist.Contains("-CAL", TString::kIgnoreCase) && CAL1 && CAL2) {
3292        CAL2 = false;
3293        CAL1 = false;
3294      }
3295      //  -------------------------------------------------------------------------
3296      if (detlist.Contains("TRK0", TString::kIgnoreCase)) {
3297        if (detlist.Contains("-TRK0", TString::kIgnoreCase))
3298          TRK0 = false;
3299        if (detlist.Contains("+TRK0", TString::kIgnoreCase))
3300          TRK0 = true;
3301      };
3302    
3303      if (detlist.Contains("TRK1", TString::kIgnoreCase)) {
3304        if (detlist.Contains("-TRK1", TString::kIgnoreCase))
3305          TRK1 = false;
3306        if (detlist.Contains("+TRK1", TString::kIgnoreCase))
3307          TRK1 = true;
3308      };
3309    
3310      if (detlist.Contains("TRK2", TString::kIgnoreCase)) {
3311        if (detlist.Contains("-TRK2", TString::kIgnoreCase))
3312          TRK2 = false;
3313        if (detlist.Contains("+TRK2", TString::kIgnoreCase))
3314          TRK2 = true;
3315      };
3316    
3317      if (detlist.Contains("TRKh", TString::kIgnoreCase)) {
3318        if (detlist.Contains("-TRKh", TString::kIgnoreCase))
3319          TRKh = false;
3320        if (detlist.Contains("+TRKh", TString::kIgnoreCase))
3321          TRKh = true;
3322      };
3323    
3324      if (detlist.Contains("+TRK", TString::kIgnoreCase) && !TRK1 && !TRK2 && !TRKh)
3325        TRK2 = true;
3326      if (detlist.Contains("-TRK", TString::kIgnoreCase) && TRK1 && TRK2 && TRKh) {
3327        TRK2 = false;
3328        TRK1 = false;
3329        TRKh = false;
3330      }
3331      //  -------------------------------------------------------------------------
3332    
3333      if (detlist.Contains("-TRG", TString::kIgnoreCase))
3334        TRG = false;
3335      else if (detlist.Contains("+TRG", TString::kIgnoreCase))
3336        TRG = true;
3337    
3338      if (detlist.Contains("-TOF", TString::kIgnoreCase))
3339        TOF = false;
3340      else if (detlist.Contains("+TOF", TString::kIgnoreCase))
3341        TOF = true;
3342    
3343      if (detlist.Contains("-TOF0", TString::kIgnoreCase))
3344        TOF0 = false;
3345      else if (detlist.Contains("+TOF0", TString::kIgnoreCase))
3346        TOF0 = true;
3347    
3348      if (detlist.Contains("-S4", TString::kIgnoreCase))
3349        S4 = false;
3350      else if (detlist.Contains("+S4", TString::kIgnoreCase))
3351        S4 = true;
3352    
3353      if (detlist.Contains("-ND", TString::kIgnoreCase))
3354        ND = false;
3355      else if (detlist.Contains("+ND", TString::kIgnoreCase))
3356        ND = true;
3357    
3358      if (detlist.Contains("-AC", TString::kIgnoreCase))
3359        AC = false;
3360      else if (detlist.Contains("+AC", TString::kIgnoreCase))
3361        AC = true;
3362    
3363      if (detlist.Contains("-ORB", TString::kIgnoreCase))
3364        ORB = false;
3365      else if (detlist.Contains("+ORB", TString::kIgnoreCase))
3366        ORB = true;
3367    
3368      if (detlist.Contains("-GP", TString::kIgnoreCase))
3369        GP = false;
3370      else if (detlist.Contains("+GP", TString::kIgnoreCase))
3371        GP = true;
3372    
3373      cout << "tree/branch list from input --> ";
3374      if (TRK0)
3375        cout << "TRK0 ";
3376      if (TRK1)
3377        cout << "TRK1 ";
3378      if (TRK2)
3379        cout << "TRK2 ";
3380      if (TRKh)
3381        cout << "TRKH ";
3382      if (CAL0)
3383        cout << "CAL0 ";
3384      if (CAL1)
3385        cout << "CAL1 ";
3386      if (CAL2)
3387        cout << "CAL2 ";
3388      if (TOF)
3389        cout << "TOF ";
3390      if (TRG)
3391        cout << "TRG ";
3392      if (AC)
3393        cout << "AC ";
3394      if (ND)
3395        cout << "ND ";
3396      if (S4)
3397        cout << "S4 ";
3398      if (ORB)
3399        cout << "ORB ";
3400      if (GP)
3401        cout << "GP ";
3402      cout << endl;
3403      //     cout<< "Set detector list --> ";
3404      //     if(TRK1)cout<<"TRK1 ";
3405      //     if(TRK2)cout<<"TRK2 ";
3406      //     if(TRKh)cout<<"TRKH ";
3407      //     if(CAL1)cout<<"CAL1 ";
3408      //     if(CAL2)cout<<"CAL2 ";
3409      //     if(TOF0)cout<<"TOF0 ";
3410      //     if(TOF)cout<<"TOF ";
3411      //     if(TRG)cout<<"TRG ";
3412      //     if(AC)cout<<"AC ";
3413      //     if(ND)cout<<"ND ";
3414      //     if(S4)cout<<"S4 ";
3415      //     if(ORB)cout<<"ORB ";
3416      //     cout << endl;
3417    
3418    }
3419    ;
3420    
3421  /**  /**
3422   * Set tree/branch detector flags from the content of a tree   * Set tree/branch detector flags from the content of a tree
3423   */   */
3424  void  PamLevel2::GetWhichTrees(TFile* f){  void PamLevel2::GetWhichTrees(TFile* f) {
3425            
3426      // -----------    //    cout << "void  PamLevel2::GetWhichTrees(TFile* f) --- WARNING!! --- ...potrebbe non funzionare "<<endl;
3427      // reset flags    // -----------
3428      // -----------    // reset flags
3429      CAL1   = false;        // -----------
3430      CAL2   = false;        CAL1 = false;
3431      TRK2   = false;        CAL2 = false;
3432      TRK1   = false;        TRK2 = false;
3433      TRKh   = false;        TRK1 = false;
3434      TRG    = false;        TRKh = false;
3435      TOF    = false;        TRG = false;
3436      S4     = false;        TOF = false;
3437      ND     = false;        S4 = false;
3438      AC     = false;        ND = false;
3439      ORB    = false;        AC = false;
3440          ORB = false;
3441      RUN    = false;    GP = false;
3442            
3443      cout << "Checking file: "<<f->GetName()<<endl;    RUN = false;
3444      if( !f || f->IsZombie() ){  
3445          cout << "File: "<< f->GetName() <<" Non valid root file"<< endl;    //    cout << "Checking file: "<<f->GetName()<<endl;
3446          return;    if (!f || f->IsZombie()) {
3447      }      cout << "File: " << f->GetName() << " Non valid root file" << endl;
3448        return;
3449      TList *lk = f->GetListOfKeys();    }
3450      TIter next(lk);  
3451      TKey *key =0;    TList *lk = f->GetListOfKeys();
3452      if (!lk)
3453      Int_t nev = 0;      return;
3454      TIter next(lk);
3455      while( (key = (TKey*)next()) ){    TKey *key = 0;
3456            
3457          if( !strcmp(key->GetName(),"Run"        ) )RUN = true;    Int_t nev = 0;
3458    
3459          //=========================================================        while ((key = (TKey*) next())) {
3460          if( !strcmp(key->GetName(),"Trigger"    ) ){  
3461              TRG = true;      if (!strcmp(key->GetName(), "Run"))
3462              Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries();        RUN = true;
3463              if( nev && nevt!=nev){  
3464                  cout << "File: "<< f->GetName() <<" Trigger tree has "<<nevt<<" events instead of "<<nev<< endl;      //=========================================================
3465                  TRG = false;      if (!strcmp(key->GetName(), "Trigger")) {
3466              }else nev=nevt;        TRG = true;
3467          }        Int_t nevt = ((TTree*) f->Get("Trigger"))->GetEntries();
3468          //=========================================================            if (nev && nevt != nev) {
3469          if( !strcmp(key->GetName(),"ToF"        ) ){          cout << "File: " << f->GetName() << " Trigger tree has " << nevt << " events instead of " << nev << endl;
3470              TOF = true;          TRG = false;
3471              Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries();        }
3472              if( nev && nevt!=nev){        else
3473                  cout << "File: "<< f->GetName() <<"     ToF tree has "<<nevt<<" events instead of "<<nev<< endl;          nev = nevt;
3474                  TOF = false;      }
3475              }else nev=nevt;      //=========================================================
3476          }      if (!strcmp(key->GetName(), "ToF")) {
3477          //=========================================================          TOF = true;
3478          if( !strcmp(key->GetName(),"S4"         ) ){        Int_t nevt = ((TTree*) f->Get("ToF"))->GetEntries();
3479              S4 = true;        if (nev && nevt != nev) {
3480              Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries();          cout << "File: " << f->GetName() << "     ToF tree has " << nevt << " events instead of " << nev << endl;
3481              if( nev && nevt!=nev){          TOF = false;
3482                  cout << "File: "<< f->GetName() <<"      S4 tree has "<<nevt<<" events instead of "<<nev<< endl;        }
3483                  S4 = false;        else
3484              }else nev=nevt;          nev = nevt;
3485          }      }
3486          //=========================================================        //=========================================================
3487        if (!strcmp(key->GetName(), "S4")) {
3488          if( !strcmp(key->GetName(),"NeutronD"   ) ){        S4 = true;
3489              ND = true;        Int_t nevt = ((TTree*) f->Get("S4"))->GetEntries();
3490              Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries();        if (nev && nevt != nev) {
3491              if( nev && nevt!=nev){          cout << "File: " << f->GetName() << "      S4 tree has " << nevt << " events instead of " << nev << endl;
3492                  cout << "File: "<< f->GetName() <<"NeutronD tree has "<<nevt<<" events instead of "<<nev<< endl;          S4 = false;
3493                  ND =false;        }
3494              }else nev=nevt;        else
3495          }                nev = nevt;
3496          //=========================================================        }
3497          if( !strcmp(key->GetName(),"Anticounter") ){      //=========================================================
3498              AC = true;  
3499              Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries();      if (!strcmp(key->GetName(), "NeutronD")) {
3500              if( nev && nevt!=nev){        ND = true;
3501                  cout << "File: "<< f->GetName() <<" Anticounter tree has "<<nevt<<" events instead of "<<nev<< endl;        Int_t nevt = ((TTree*) f->Get("NeutronD"))->GetEntries();
3502                  AC =false;        if (nev && nevt != nev) {
3503              }else nev=nevt;          cout << "File: " << f->GetName() << "NeutronD tree has " << nevt << " events instead of " << nev << endl;
3504          }          ND = false;
3505          //=========================================================          }
3506          if( !strcmp(key->GetName(),"OrbitalInfo") ){        else
3507              ORB = true;          nev = nevt;
3508              Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries();      }
3509              if( nev && nevt!=nev){      //=========================================================
3510                  cout << "File: "<< f->GetName() <<" OrbitalInfo tree has "<<nevt<<" events instead of "<<nev<< endl;      if (!strcmp(key->GetName(), "Anticounter")) {
3511                  ORB = false;        AC = true;
3512              }else nev=nevt;        Int_t nevt = ((TTree*) f->Get("Anticounter"))->GetEntries();
3513          }        if (nev && nevt != nev) {
3514          //=========================================================            cout << "File: " << f->GetName() << " Anticounter tree has " << nevt << " events instead of " << nev << endl;
3515          if( !strcmp(key->GetName(),"Tracker"    ) ){          AC = false;
3516              TTree *T = (TTree*)f->Get("Tracker");        }
3517              for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){        else
3518                  TString name = T->GetListOfBranches()->At(i)->GetName();          nev = nevt;
3519                  if( !name.CompareTo("TrkLevel1") )TRK1=true;      }
3520                  if( !name.CompareTo("TrkLevel2") )TRK2=true;      //=========================================================
3521                  if( !name.CompareTo("TrkHough") )TRKh=true;      if (!strcmp(key->GetName(), "OrbitalInfo")) {
3522              };              ORB = true;
3523              Int_t nevt = T->GetEntries();        Int_t nevt = ((TTree*) f->Get("OrbitalInfo"))->GetEntries();
3524              if( nev && nevt!=nev){        if (nev && nevt != nev) {
3525                  cout << "File: "<< f->GetName() <<" Tracker tree has "<<nevt<<" events instead of "<<nev<< endl;          cout << "File: " << f->GetName() << " OrbitalInfo tree has " << nevt << " events instead of " << nev << endl;
3526                  TRK1 = false;          ORB = false;
3527                  TRK2 = false;        }
3528                  TRKh = false;        else
3529              }else nev=nevt;          nev = nevt;
3530              T->Delete();      }
3531          };      //=========================================================
3532          //=========================================================        if (!strcmp(key->GetName(), "Tracker")) {
3533          if( !strcmp(key->GetName(),"Calorimeter"    ) ){        TTree *T = (TTree*) f->Get("Tracker");
3534              TTree *T = (TTree*)f->Get("Calorimeter");        for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
3535              for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){          TString name = T->GetListOfBranches()->At(i)->GetName();
3536                  TString name = T->GetListOfBranches()->At(i)->GetName();          if (!name.CompareTo("TrkLevel1"))
3537                  if( !name.CompareTo("CaloLevel1") )CAL1=true;            TRK1 = true;
3538                  if( !name.CompareTo("CaloLevel2") )CAL2=true;          if (!name.CompareTo("TrkLevel2"))
3539              };                TRK2 = true;
3540              Int_t nevt = T->GetEntries();          if (!name.CompareTo("TrkHough"))
3541              if( nev && nevt!=nev){            TRKh = true;
3542                  cout << "File: "<< f->GetName() <<"  Calorimeter tree has "<<nevt<<" events instead of "<<nev<< endl;        };
3543                  CAL1 = false;        Int_t nevt = T->GetEntries();
3544                  CAL2 = false;        if (nev && nevt != nev) {
3545              }else nev=nevt;          cout << "File: " << f->GetName() << " Tracker tree has " << nevt << " events instead of " << nev << endl;
3546              T->Delete();          TRK1 = false;
3547          };                TRK2 = false;
3548            TRKh = false;
3549      };        }
3550              else
3551      delete lk;          nev = nevt;
3552          //            T->Delete();
3553  //     cout<< "Get detector list from input file --> ";      };
3554  //     if(TRK1)cout<<"TRK1 ";      //=========================================================
3555  //     if(TRK2)cout<<"TRK2 ";      if (!strcmp(key->GetName(), "Calorimeter")) {
3556  //     if(TRKh)cout<<"TRKH ";        TTree *T = (TTree*) f->Get("Calorimeter");
3557  //     if(CAL1)cout<<"CAL1 ";        for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
3558  //     if(CAL2)cout<<"CAL2 ";          TString name = T->GetListOfBranches()->At(i)->GetName();
3559  //     if(TOF)cout<<"TOF ";          if (!name.CompareTo("CaloLevel1"))
3560  //     if(TRG)cout<<"TRG ";            CAL1 = true;
3561  //     if(AC)cout<<"AC ";          if (!name.CompareTo("CaloLevel2"))
3562  //     if(ND)cout<<"ND ";            CAL2 = true;
3563  //     if(S4)cout<<"S4 ";        };
3564  //     if(ORB)cout<<"ORB ";        Int_t nevt = T->GetEntries();
3565  //     cout << endl;        if (nev && nevt != nev) {
3566                  cout << "File: " << f->GetName() << "  Calorimeter tree has " << nevt << " events instead of " << nev << endl;
3567      return ;          CAL1 = false;
3568                    CAL2 = false;
3569  };        }
3570          else
3571            nev = nevt;
3572          //            T->Delete();
3573        };
3574        //=========================================================
3575        if (!strcmp(key->GetName(), "h20")) {
3576          GP = true;
3577          Int_t nevt = ((TTree*) f->Get("h20"))->GetEntries();
3578          if (nev && nevt != nev) {
3579            cout << "File: " << f->GetName() << " h20 tree has " << nevt << " events instead of " << nev << endl;
3580            GP = false;
3581          }
3582          else
3583            nev = nevt;
3584        }
3585    
3586      };
3587    
3588      //    delete lk;
3589    
3590      cout << "tree/branch list from file  --> ";
3591      if (TRK1)
3592        cout << "TRK1 ";
3593      if (TRK2)
3594        cout << "TRK2 ";
3595      if (TRKh)
3596        cout << "TRKH ";
3597      if (CAL1)
3598        cout << "CAL1 ";
3599      if (CAL2)
3600        cout << "CAL2 ";
3601      if (TOF)
3602        cout << "TOF ";
3603      if (TRG)
3604        cout << "TRG ";
3605      if (AC)
3606        cout << "AC ";
3607      if (ND)
3608        cout << "ND ";
3609      if (S4)
3610        cout << "S4 ";
3611      if (ORB)
3612        cout << "ORB ";
3613      if (GP)
3614        cout << "GP ";
3615      cout << endl;
3616    
3617      return;
3618    
3619    }
3620    ;
3621    
3622  //--------------------------------------  //--------------------------------------
3623  //  //
# Line 1737  void  PamLevel2::GetWhichTrees(TFile* f) Line 3628  void  PamLevel2::GetWhichTrees(TFile* f)
3628   * @param name File name   * @param name File name
3629   * @return true if the file is ok.   * @return true if the file is ok.
3630   */   */
3631  Bool_t  PamLevel2::CheckLevel2File(TString name){  Bool_t PamLevel2::CheckLevel2File(TString name) {
3632            
3633      Bool_t CAL1__ok   = false;        Bool_t CAL1__ok = false;
3634      Bool_t CAL2__ok   = false;        Bool_t CAL2__ok = false;
3635      Bool_t TRK2__ok   = false;        Bool_t TRK2__ok = false;
3636      Bool_t TRK1__ok   = false;        Bool_t TRK1__ok = false;
3637      Bool_t TRKh__ok   = false;        Bool_t TRKh__ok = false;
3638      Bool_t TRG__ok    = false;        Bool_t TRG__ok = false;
3639      Bool_t TOF__ok    = false;        Bool_t TOF__ok = false;
3640      Bool_t S4__ok     = false;        Bool_t S4__ok = false;
3641      Bool_t ND__ok     = false;        Bool_t ND__ok = false;
3642      Bool_t AC__ok     = false;        Bool_t AC__ok = false;
3643      Bool_t ORB__ok    = false;        Bool_t ORB__ok = false;
3644          Bool_t GP__ok = false;
3645      Bool_t RUN__ok    = false;  
3646          Bool_t RUN__ok = false;
3647        
3648      Bool_t SELLI__ok = false;
3649      cout << "Checking file: "<<name<<endl;  
3650      TFile *f = new TFile(name.Data());    //    cout << "Checking file: "<<name<<endl;
3651      if( !f || f->IsZombie() ){    TFile *f = new TFile(name.Data());
3652          cout << "File: "<< f->GetName() <<" discarded ---- Non valid root file"<< endl; return false;    if (!f || f->IsZombie()) {
3653      }      cout << "File: " << f->GetName() << " discarded ---- Non valid root file" << endl;
3654  //    cout << "Get list of keys: "<<f<<endl;      return false;
3655      TList *lk = f->GetListOfKeys();    }
3656  //    lk->Print();    //    cout << "Get list of keys: "<<f<<endl;
3657      TIter next(lk);    TList *lk = f->GetListOfKeys();
3658      TKey *key =0;    //    lk->Print();
3659      TIter next(lk);
3660      Int_t nev = 0;    TKey *key = 0;
3661    
3662      while( (key = (TKey*)next()) ){    Int_t nev = 0;
3663            
3664  //      cout << key->GetName() << ""<<key->GetClassName()<<endl;    while ((key = (TKey*) next())) {
3665  //              cout << " Get tree: " << f->Get(key->GetName())<<endl;  
3666  //      nev_previous = nev;      //  cout << key->GetName() << endl;
3667  //      cout << " n.entries  "<< nev <<endl;      //  cout << key->GetName() << ""<<key->GetClassName()<<endl;
3668  //      if( key->GetClassName()=="TTree" && nev_previous && nev != nev_previous ){      //          cout << " Get tree: " << f->Get(key->GetName())<<endl;
3669  //          nev = ((TTree*)f->Get(key->GetName()))->GetEntries();      //  nev_previous = nev;
3670  //          cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<<nev<<" "<<nev_previous<< endl;      //  cout << " n.entries  "<< nev <<endl;
3671  //          return false;      //  if( key->GetClassName()=="TTree" && nev_previous && nev != nev_previous ){
3672  //      };      //      nev = ((TTree*)f->Get(key->GetName()))->GetEntries();
3673        //      cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<<nev<<" "<<nev_previous<< endl;
3674          if( !strcmp(key->GetName(),"Run"        ) )RUN__ok = true;            //      return false;
3675        //  };
3676          //=========================================================      
3677          if( !strcmp(key->GetName(),"Trigger"    ) ){      //=========================================================
3678              TRG__ok = true;      // check if the file
3679              if(TRG){  
3680                  Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries();  
3681                  if( nev && nevt!=nev){      if (!strcmp(key->GetName(), "Run"))
3682                      cout << "File: "<< f->GetName() <<" discarded ---- Trigger tree has "<<nevt<<" events instead of "<<nev<< endl;        RUN__ok = true;
3683                      return false;  
3684                  }      //=========================================================
3685                  nev=nevt;      if (!strcmp(key->GetName(), "SelectionList")) {
3686              }        SELLI__ok = true;
3687          }        if (SELLI == 1) {
3688          //=========================================================              Int_t nevt = ((TTree*) f->Get("SelectionList"))->GetEntries();
3689          if( !strcmp(key->GetName(),"ToF"        ) ){          if (nev && nevt != nev) {
3690              TOF__ok = true;            cout << "File: " << f->GetName() << " discarded ---- SelectionList tree has " << nevt
3691              if(TOF){                << " events instead of " << nev << endl;
3692                  Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries();            return false;
3693                  if( nev && nevt!=nev){          }
3694                      cout << "File: "<< f->GetName() <<" discarded ---- ToF tree has "<<nevt<<" events instead of "<<nev<< endl;          nev = nevt;
3695                      return false;        }
3696                  }      }
3697                  nev=nevt;  
3698              }      //=========================================================
3699          }      if (!strcmp(key->GetName(), "Trigger")) {
3700          //=========================================================          TRG__ok = true;
3701          if( !strcmp(key->GetName(),"S4"         ) ){        if (TRG) {
3702              S4__ok = true;          Int_t nevt = ((TTree*) f->Get("Trigger"))->GetEntries();
3703              if(S4){          if (nev && nevt != nev) {
3704                  Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries();            cout << "File: " << f->GetName() << " discarded ---- Trigger tree has " << nevt << " events instead of "
3705                  if( nev && nevt!=nev){                << nev << endl;
3706                      cout << "File: "<< f->GetName() <<" discarded ---- S4 tree has "<<nevt<<" events instead of "<<nev<< endl;            return false;
3707                      return false;          }
3708                  }          nev = nevt;
3709                  nev=nevt;        }
3710              }      }
3711          }      //=========================================================
3712          //=========================================================        if (!strcmp(key->GetName(), "ToF")) {
3713          TOF__ok = true;
3714          if( !strcmp(key->GetName(),"NeutronD"   ) ){        if (TOF) {
3715              ND__ok = true;          Int_t nevt = ((TTree*) f->Get("ToF"))->GetEntries();
3716              if(ND){          if (nev && nevt != nev) {
3717                  Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries();            cout << "File: " << f->GetName() << " discarded ---- ToF tree has " << nevt << " events instead of " << nev
3718                  if( nev && nevt!=nev){                << endl;
3719                      cout << "File: "<< f->GetName() <<" discarded ---- NeutronD tree has "<<nevt<<" events instead of "<<nev<< endl;            return false;
3720                      return false;          }
3721                  }          nev = nevt;
3722                  nev=nevt;        }
3723              }      }
3724          }            //=========================================================
3725          //=========================================================        if (!strcmp(key->GetName(), "S4")) {
3726          if( !strcmp(key->GetName(),"Anticounter") ){        S4__ok = true;
3727              AC__ok = true;        if (S4) {
3728              if(AC){          Int_t nevt = ((TTree*) f->Get("S4"))->GetEntries();
3729                  Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries();          if (nev && nevt != nev) {
3730                  if( nev && nevt!=nev){            cout << "File: " << f->GetName() << " discarded ---- S4 tree has " << nevt << " events instead of " << nev
3731                      cout << "File: "<< f->GetName() <<" discarded ---- Anticounter tree has "<<nevt<<" events instead of "<<nev<< endl;                << endl;
3732                      return false;            return false;
3733                  }          }
3734                  nev=nevt;          nev = nevt;
3735              }        }
3736          }      }
3737          //=========================================================        //=========================================================
3738          if( !strcmp(key->GetName(),"OrbitalInfo") ){  
3739              ORB__ok = true;      if (!strcmp(key->GetName(), "NeutronD")) {
3740              if(ORB){        ND__ok = true;
3741                  Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries();        if (ND) {
3742                  if( nev && nevt!=nev){          Int_t nevt = ((TTree*) f->Get("NeutronD"))->GetEntries();
3743                      cout << "File: "<< f->GetName() <<" discarded ---- OrbitalInfo tree has "<<nevt<<" events instead of "<<nev<< endl;          if (nev && nevt != nev) {
3744                      return false;            cout << "File: " << f->GetName() << " discarded ---- NeutronD tree has " << nevt << " events instead of "
3745                  }                << nev << endl;
3746                  nev=nevt;            return false;
3747              }          }
3748          }          nev = nevt;
3749          //=========================================================          }
3750          if( !strcmp(key->GetName(),"Tracker"    ) ){      }
3751              TTree *T = (TTree*)f->Get("Tracker");      //=========================================================
3752              if(TRK1||TRK2||TRKh){      if (!strcmp(key->GetName(), "Anticounter")) {
3753                  Int_t nevt = T->GetEntries();        AC__ok = true;
3754                  if( nev && nevt!=nev){        if (AC) {
3755                      cout << "File: "<< f->GetName() <<" discarded ---- Tracker tree has "<<nevt<<" events instead of "<<nev<< endl;          Int_t nevt = ((TTree*) f->Get("Anticounter"))->GetEntries();
3756                      return false;          if (nev && nevt != nev) {
3757                  }            cout << "File: " << f->GetName() << " discarded ---- Anticounter tree has " << nevt << " events instead of "
3758                  nev=nevt;                << nev << endl;
3759              }            return false;
3760              for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){          }
3761                  TString name = T->GetListOfBranches()->At(i)->GetName();          nev = nevt;
3762                  if( !name.CompareTo("TrkLevel1") )TRK1__ok=true;        }
3763                  if( !name.CompareTo("TrkLevel2") )TRK2__ok=true;      }
3764                  if( !name.CompareTo("TrkHough") )TRKh__ok=true;      //=========================================================
3765              };            if (!strcmp(key->GetName(), "OrbitalInfo")) {
3766              T->Delete();        ORB__ok = true;
3767          };        if (ORB) {
3768          //=========================================================            Int_t nevt = ((TTree*) f->Get("OrbitalInfo"))->GetEntries();
3769          if( !strcmp(key->GetName(),"Calorimeter"    ) ){          if (nev && nevt != nev) {
3770              TTree *T = (TTree*)f->Get("Calorimeter");            cout << "File: " << f->GetName() << " discarded ---- OrbitalInfo tree has " << nevt << " events instead of "
3771              if(CAL1||CAL2){                << nev << endl;
3772                  Int_t nevt = T->GetEntries();            return false;
3773                  if( nev && nevt!=nev){          }
3774                      cout << "File: "<< f->GetName() <<" discarded ---- Calorimeter tree has "<<nevt<<" events instead of "<<nev<< endl;          nev = nevt;
3775                      return false;        }
3776                  }      }
3777                  nev=nevt;      //=========================================================
3778              }      if (!strcmp(key->GetName(), "Tracker")) {
3779              for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){        TTree *T = (TTree*) f->Get("Tracker");
3780                  TString name = T->GetListOfBranches()->At(i)->GetName();        if (TRK1 || TRK2 || TRKh) {
3781                  if( !name.CompareTo("CaloLevel1") )CAL1__ok=true;          Int_t nevt = T->GetEntries();
3782                  if( !name.CompareTo("CaloLevel2") )CAL2__ok=true;          if (nev && nevt != nev) {
3783              };                cout << "File: " << f->GetName() << " discarded ---- Tracker tree has " << nevt << " events instead of "
3784              T->Delete();                << nev << endl;
3785          };                  return false;
3786            }
3787      };          nev = nevt;
3788              }
3789  //     cout<< "CheckLevel2File(TString): detector list --> ";        for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
3790  //     if(TRK1__ok)cout<<"TRK1 ";          TString name = T->GetListOfBranches()->At(i)->GetName();
3791  //     if(TRK2__ok)cout<<"TRK2 ";          if (!name.CompareTo("TrkLevel1"))
3792  //     if(TRKh__ok)cout<<"TRKH ";            TRK1__ok = true;
3793  //     if(CAL1__ok)cout<<"CAL1 ";          if (!name.CompareTo("TrkLevel2"))
3794  //     if(CAL2__ok)cout<<"CAL2 ";            TRK2__ok = true;
3795  //     if(TOF__ok)cout<<"TOF ";          if (!name.CompareTo("TrkHough"))
3796  //     if(TRG__ok)cout<<"TRG ";            TRKh__ok = true;
3797  //     if(AC__ok)cout<<"AC ";        };
3798  //     if(ND__ok)cout<<"ND ";        T->Delete();
3799  //     if(S4__ok)cout<<"S4 ";      };
3800  //     if(ORB__ok)cout<<"ORB ";      //=========================================================
3801  //     cout << endl;      if (!strcmp(key->GetName(), "Calorimeter")) {
3802          TTree *T = (TTree*) f->Get("Calorimeter");
3803          if (CAL1 || CAL2) {
3804      if(TRK2 && TRK1__ok)TRK1=1;          Int_t nevt = T->GetEntries();
3805  // ----------------------------------------------------------------------------          if (nev && nevt != nev) {
3806  // NOTA            cout << "File: " << f->GetName() << " discarded ---- Calorimeter tree has " << nevt << " events instead of "
3807  // se c'e` il level1, lo devo necessarimente leggere.                << nev << endl;
3808  // infatti (non ho capito perche`) i cluster vengono letti e allocati in memoria            return false;
3809  // comunque, ma non vengono disallocati da PamLevel2::Clear()          }
3810  // ----------------------------------------------------------------------------          nev = nevt;
3811          }
3812          for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) {
3813      if(!RUN__ok) {          TString name = T->GetListOfBranches()->At(i)->GetName();
3814          cout << "File: "<< f->GetName() <<" *WARNING* ---- Missing RunInfo tree"<< endl;          if (!name.CompareTo("CaloLevel1"))
3815  //      return false;            CAL1__ok = true;
3816      };          if (!name.CompareTo("CaloLevel2"))
3817              CAL2__ok = true;
3818      if(CAL1 && !CAL1__ok){        };
3819          cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel1 branch"<< endl;        T->Delete();
3820          return false;      };
3821      };      //=========================================================
3822      if(CAL2 && !CAL2__ok){      if (!strcmp(key->GetName(), "h20")) {
3823          cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel2 branch"<< endl;        ISGP = true;
3824          return false;        GP__ok = true;
3825      };        if (GP) {
3826      if(TRK2 && !TRK2__ok){          Int_t nevt = ((TTree*) f->Get("h20"))->GetEntries();
3827          cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel2 branch"<< endl;          if (nev && nevt != nev) {
3828          return false;            cout << "File: " << f->GetName() << " discarded ---- h20 tree has " << nevt << " events instead of " << nev
3829      };                << endl;
3830      if(TRK1 && !TRK1__ok){            return false;
3831          cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel1 branch"<< endl;          }
3832          return false;          nev = nevt;
3833      };        }
3834      if(TRKh && !TRKh__ok){      }
3835          cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkHough branch"<< endl;  
3836          return false;    };
3837      };  
3838      if(ORB && !ORB__ok){    if (SELLI == -1)
3839          cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl;      SELLI = (Int_t) SELLI__ok;
3840          return false;    if (SELLI == 0 && SELLI__ok) {
3841      };      cout << "File: " << f->GetName() << " discarded ---- found SelectionList (it is not a full-event file)" << endl;
3842      if(AC && !AC__ok){      return false;
3843          cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl;    }
3844          return false;    if (SELLI == 1 && !SELLI__ok) {
3845      };      cout << "File: " << f->GetName() << " discarded ---- SelectionList missing" << endl;
3846      if(S4 && !S4__ok){      return false;
3847          cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl;    }
3848          return false;  
3849      };    //    cout << "SELLI "<<SELLI<<endl;
3850      if(TOF && !TOF__ok){  
3851          cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl;    //     cout<< "CheckLevel2File(TString): detector list --> ";
3852          return false;    //     if(TRK1__ok)cout<<"TRK1 ";
3853      };    //     if(TRK2__ok)cout<<"TRK2 ";
3854      //     if(TRKh__ok)cout<<"TRKH ";
3855      if(ND && !ND__ok){    //     if(CAL1__ok)cout<<"CAL1 ";
3856          cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl;    //     if(CAL2__ok)cout<<"CAL2 ";
3857          return false;    //     if(TOF__ok)cout<<"TOF ";
3858      };    //     if(TRG__ok)cout<<"TRG ";
3859      if(TRG && !TRG__ok){    //     if(AC__ok)cout<<"AC ";
3860          cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl;    //     if(ND__ok)cout<<"ND ";
3861          return false;    //     if(S4__ok)cout<<"S4 ";
3862      };    //     if(ORB__ok)cout<<"ORB ";
3863          //     cout << endl;
3864    
3865  //    lk->Delete();  
3866  //    delete lk;    if (TRK2 && TRK1__ok)
3867      f->Close();      TRK1 = 1;
3868      // ----------------------------------------------------------------------------
3869  //     cout<< "CheckLevel2File(TString): detector list --> ";    // NOTA
3870  //     if(TRK1)cout<<"TRK1 ";    // se c'e` il level1, lo devo necessarimente leggere.
3871  //     if(TRK2)cout<<"TRK2 ";    // infatti (non ho capito perche`) i cluster vengono letti e allocati in memoria
3872  //     if(TRKh)cout<<"TRKH ";    // comunque, ma non vengono disallocati da PamLevel2::Clear()
3873  //     if(CAL1)cout<<"CAL1 ";    // ----------------------------------------------------------------------------
3874  //     if(CAL2)cout<<"CAL2 ";  
3875  //     if(TOF)cout<<"TOF ";  
3876  //     if(TRG)cout<<"TRG ";    if (!RUN__ok) {
3877  //     if(AC)cout<<"AC ";      cout << "File: " << f->GetName() << " *WARNING* ---- Missing RunInfo tree (NB: RUN infos will not be updated)"
3878  //     if(ND)cout<<"ND ";          << endl;
3879  //     if(S4)cout<<"S4 ";      RUN = false;
3880  //     if(ORB)cout<<"ORB ";    };
3881  //     cout << endl;  
3882            if (CAL1 && !CAL1__ok) {
3883      return true;      cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel1 branch" << endl;
3884                return false;
3885  };    };
3886      if (CAL2 && !CAL2__ok) {
3887        cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel2 branch" << endl;
3888        return false;
3889      };
3890      if (TRK2 && !TRK2__ok) {
3891        cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel2 branch" << endl;
3892        return false;
3893      };
3894      if (TRK1 && !TRK1__ok) {
3895        cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel1 branch" << endl;
3896        return false;
3897      };
3898      if (TRKh && !TRKh__ok) {
3899        cout << "File: " << f->GetName() << " discarded ---- Missing TrkHough branch" << endl;
3900        return false;
3901      };
3902      if (ORB && !ORB__ok) {
3903        cout << "File: " << f->GetName() << " discarded ---- Missing ORB tree" << endl;
3904        return false;
3905      };
3906      if (AC && !AC__ok) {
3907        cout << "File: " << f->GetName() << " discarded ---- Missing AC tree" << endl;
3908        return false;
3909      };
3910      if (S4 && !S4__ok) {
3911        cout << "File: " << f->GetName() << " discarded ---- Missing S4 tree" << endl;
3912        return false;
3913      };
3914      if (TOF && !TOF__ok) {
3915        cout << "File: " << f->GetName() << " discarded ---- Missing ToF tree" << endl;
3916        return false;
3917      };
3918    
3919      if (ND && !ND__ok) {
3920        cout << "File: " << f->GetName() << " discarded ---- Missing ND tree" << endl;
3921        return false;
3922      };
3923      if (TRG && !TRG__ok) {
3924        cout << "File: " << f->GetName() << " discarded ---- Missing Trigger tree" << endl;
3925        return false;
3926      };
3927      if (GP && !GP__ok) {
3928        cout << "File: " << f->GetName() << " discarded ---- Missing h20 tree" << endl;
3929        return false;
3930      };
3931    
3932      //    lk->Delete();
3933      //    delete lk;
3934      f->Close();
3935    
3936      //     cout<< "CheckLevel2File(TString): detector list --> ";
3937      //     if(TRK1)cout<<"TRK1 ";
3938      //     if(TRK2)cout<<"TRK2 ";
3939      //     if(TRKh)cout<<"TRKH ";
3940      //     if(CAL1)cout<<"CAL1 ";
3941      //     if(CAL2)cout<<"CAL2 ";
3942      //     if(TOF)cout<<"TOF ";
3943      //     if(TRG)cout<<"TRG ";
3944      //     if(AC)cout<<"AC ";
3945      //     if(ND)cout<<"ND ";
3946      //     if(S4)cout<<"S4 ";
3947      //     if(ORB)cout<<"ORB ";
3948      //     if(GP)cout<<"GP ";
3949      //     cout << endl;
3950    
3951      return true;
3952    
3953    }
3954    ;
3955    
3956  /**  /**
3957   * Create clone-trees   * Create clone-trees
3958   */   */
3959  void PamLevel2::CreateCloneTrees0( TChain *fChain, TFile *ofile ){  void PamLevel2::CreateCloneTrees0(TChain *fChain, TFile *ofile) {
3960    
3961      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;    cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
3962      cout << "Create clones of PAMELA trees "<<endl;    cout << "Create clones of PAMELA trees " << endl;
3963        
3964      Int_t i=0;    Int_t i = 0;
3965      tree_clone[i] = fChain->GetTree()->CloneTree(0);    pam_tree_clone[i] = fChain->GetTree()->CloneTree(0);
3966      TString name =  tree_clone[i]->GetName();    TString name = pam_tree_clone[i]->GetName();
3967      name.Append("_clone");
3968      //    pam_tree_clone[i]->SetName(name.Data());
3969      cout << pam_tree_clone[i]->GetName() << endl;
3970      i++;
3971    
3972      TList *li = fChain->GetListOfFriends();
3973      TIter next(li);
3974      TFriendElement* T_friend = 0;
3975      ofile->cd();
3976      while ((T_friend = (TFriendElement*) next())) {
3977        //  cout<<T_friend->IsA()->GetName()<<" "<<T_friend->GetName()<<hex << T_friend->GetTree() << dec<<endl;
3978        //  cout<<T_friend->GetTree()->GetName()<< endl;
3979        pam_tree_clone[i] = T_friend->GetTree()->CloneTree(0);
3980        pam_tree_clone[i]->SetAutoSave(1000000);
3981        name = pam_tree_clone[i]->GetName();
3982      name.Append("_clone");      name.Append("_clone");
3983  //    tree_clone[i]->SetName(name.Data());      //  pam_tree_clone[i]->SetName(name.Data());
3984      cout << tree_clone[i]->GetName() <<endl;      cout << pam_tree_clone[i]->GetName() << endl;
3985      i++;      i++;
3986      }
3987    
3988      TList *li = fChain->GetListOfFriends();    delete li;
     TIter next(li);  
     TFriendElement* T_friend=0;  
     ofile->cd();  
     while( (T_friend = (TFriendElement*)next()) ){  
 //      cout<<T_friend->IsA()->GetName()<<" "<<T_friend->GetName()<<hex << T_friend->GetTree() << dec<<endl;  
 //      cout<<T_friend->GetTree()->GetName()<< endl;  
         tree_clone[i] = T_friend->GetTree()->CloneTree(0);  
         tree_clone[i]->SetAutoSave(1000000);  
         name =  tree_clone[i]->GetName();  
         name.Append("_clone");  
 //      tree_clone[i]->SetName(name.Data());  
         cout << tree_clone[i]->GetName() << endl;  
         i++;  
     }  
       
     delete li;  
3989    
3990      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;    cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
3991    
3992  }  }
3993    
3994  /**  /**
3995   * Create clone-trees   * Create clone-trees
3996   */   */
3997  void PamLevel2::CreateCloneTrees(TFile *ofile){  void PamLevel2::CreateCloneTrees(TFile *ofile) {
3998    
3999      ofile->cd();    //  if the pointer is null, create a default file
4000      if (!run_tree)
4001        return;
4002    
4003      if (!ofile) {
4004        cout << "void PamLevel2::CreateCloneTrees(TFile*) -- WARNING -- Creating file: clone-tree.root " << endl;
4005        ofile = new TFile("clone-tree.root", "recreate");
4006      }
4007    
4008      ofile->cd();
4009    
4010      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
4011      cout << "Create new PAMELA trees " << endl;
4012    
4013      run_tree_clone = new TTree("Run", "PAMELA Level2 data from the GL_RUN table ");
4014      run_tree_clone->Branch("RunInfo", "GL_RUN", GetPointerTo("RunInfo"));
4015      cout << "Run          : branch RunInfo" << endl;
4016      run_tree_clone->Branch("SoftInfo", "SoftInfo", GetPointerTo("SoftInfo"));
4017      cout << "Run          : branch SoftInfo" << endl;
4018      // ------------------
4019      // replicate run tree
4020      // ------------------
4021      //    cout << "----------------------------------------------------"<<endl;
4022      //    cout << "irun\t | RUN\t NEVENTS\t absolute time"<<endl;
4023      for (Int_t i = 0; i < run_tree->GetEntries(); i++) {
4024        run_tree->GetEntry(i);
4025        //  cout << i<< "\t | "<<GetRunInfo()->ID<<"\t "<<GetRunInfo()->NEVENTS<< "\t "<<GetRunInfo()->RUNHEADER_TIME<<" <---> "<<GetRunInfo()->RUNTRAILER_TIME<<endl;
4026        run_tree_clone->Fill();
4027      }
4028      cout << "----------------------------------------------------" << endl;
4029    
4030      // ------------------------------------
4031      // add branch with dead and live times
4032      // ------------------------------------
4033      if (SELLI != 2) { // EMILIANO
4034        run_tree_clone->Branch("DeadLiveTime", totdltime, "dltime[3]/l");
4035        cout << "Run          : branch DeadLiveTime" << endl;
4036    
4037        sel_tree_clone = new TTree("SelectionList", "List of selected events ");
4038        //    sel_tree_clone->Branch("RunEntry",&irun,"runentry/L");
4039        sel_tree_clone->Branch("RunEntry", &irunt, "runentry/L");//NEWNEW
4040        sel_tree_clone->Branch("EventEntry", &irunentry, "eventry/L");
4041      };
4042    
4043      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;    Int_t i = 0;
4044      cout << "Create new PAMELA trees "<<endl;    if (TRK1 || TRK2 || TRKh) {
4045                pam_tree_clone[i] = new TTree("Tracker", "PAMELA tracker level2 data ");
4046      Int_t i=0;      if (TRK1) {
4047          pam_tree_clone[i]->Branch("TrkLevel1", "TrkLevel1", GetPointerTo("TrkLevel1"));
4048      if(TRK1||TRK2||TRKh){        pam_tree_clone[i]->BranchRef();
4049          tree_clone[i] = new TTree("Tracker","PAMELA tracker level2 data ");            cout << "Tracker      : branch TrkLevel1" << endl;
4050          if(TRK1) {        //            cout << "CreateCloneTrees " << GetTrkLevel1()<<endl;
4051              tree_clone[i]->Branch("TrkLevel1","TrkLevel1", GetPointerTo("TrkLevel1"));      };
4052              tree_clone[i]->BranchRef();      if (TRK2) {
4053              cout << "Tracker      : branch TrkLevel1"<<endl;        pam_tree_clone[i]->Branch("TrkLevel2", "TrkLevel2", GetPointerTo("TrkLevel2"));
4054          };        cout << "Tracker      : branch TrkLevel2" << endl;
4055          if(TRK2) {      };
4056              tree_clone[i]->Branch("TrkLevel2", "TrkLevel2",GetPointerTo("TrkLevel2"));      if (TRKh) {
4057              cout << "Tracker      : branch TrkLevel2"<<endl;                pam_tree_clone[i]->Branch("TrkHough", "TrkHough", GetPointerTo("TrkHough"));
4058          };        cout << "Tracker      : branch TrkHough" << endl;
         if(TRKh) {  
             tree_clone[i]->Branch("TrkHough","TrkHough", GetPointerTo("TrkHough"));  
             cout << "Tracker      : branch TrkHough"<<endl;  
         };  
         i++;  
     }  
   
     // Calorimeter  
     if(CAL1||CAL2){  
         tree_clone[i] = new TTree("Calorimeter","PAMELA calorimeter level2 data ");      
         if(CAL1) {  
             tree_clone[i]->Branch("CaloLevel1", "CaloLevel1", GetPointerTo("CaloLevel1"));  
             cout << "Calorimeter  : branch CaloLevel1"<<endl;  
         };  
         if(CAL2) {  
             tree_clone[i]->Branch("CaloLevel2","CaloLevel2", GetPointerTo("CaloLevel2"));  
             cout << "Calorimeter  : branch CaloLevel2"<<endl;  
         };  
         i++;  
     }      
   
     // ToF      
     if(TOF) {  
         tree_clone[i] = new TTree("ToF","PAMELA ToF level2 data ");      
         tree_clone[i]->Branch("ToFLevel2","ToFLevel2", GetPointerTo("ToFLevel2"));  
         cout << "ToF          : branch ToFLevel2"<<endl;  
         i++;  
     };  
     // Trigger  
     if(TRG) {  
         tree_clone[i] = new TTree("Trigger","PAMELA trigger level2 data ");      
         tree_clone[i]->Branch("TrigLevel2","TrigLevel2", GetPointerTo("TrigLevel2"));  
         cout << "Trigger      : branch TrigLevel2"<<endl;  
         i++;  
     };  
     // S4  
     if(S4) {  
         tree_clone[i] = new TTree("S4","PAMELA S4 level2 data ");        
         tree_clone[i]->Branch("S4Level2","S4Level2", GetPointerTo("S4Level2"));  
         cout << "S4           : branch S4Level2"<<endl;  
         i++;  
     };  
     // Neutron Detector  
     if(ND) {  
         tree_clone[i] = new TTree("NeutronD","PAMELA neutron detector level2 data ");    
         tree_clone[i]->Branch("NDLevel2","NDLevel2", GetPointerTo("NDLevel2"));  
         cout << "NeutronD     : branch NDLevel2"<<endl;  
         i++;  
     };  
     // Anticounters  
     if(AC) {  
         tree_clone[i] = new TTree("Anticounter","PAMELA anticounter detector level2 data ");      
         tree_clone[i]->Branch("AcLevel2","AcLevel2", GetPointerTo("AcLevel2"));  
         cout << "Anticounter  : branch AcLevel2"<<endl;  
         i++;  
     };  
     // OrbitalInfo  
     if(ORB) {  
         tree_clone[i] = new TTree("OrbitalInfo","PAMELA oribital info  ");        
         tree_clone[i]->Branch("OrbitalInfo","OrbitalInfo", GetPointerTo("OrbitalInfo"));  
         cout << "OrbitalInfo  : branch OrbitalInfo"<<endl;  
         i++;  
4059      };      };
4060      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;      i++;
4061      }
4062    
4063  }    // Calorimeter
4064      if (CAL1 || CAL2) {
4065        pam_tree_clone[i] = new TTree("Calorimeter", "PAMELA calorimeter level2 data ");
4066        if (CAL1) {
4067          pam_tree_clone[i]->Branch("CaloLevel1", "CaloLevel1", GetPointerTo("CaloLevel1"));
4068          cout << "Calorimeter  : branch CaloLevel1" << endl;
4069        };
4070        if (CAL2) {
4071          pam_tree_clone[i]->Branch("CaloLevel2", "CaloLevel2", GetPointerTo("CaloLevel2"));
4072          cout << "Calorimeter  : branch CaloLevel2" << endl;
4073        };
4074        i++;
4075      }
4076    
4077      // ToF
4078      if (TOF) {
4079        pam_tree_clone[i] = new TTree("ToF", "PAMELA ToF level2 data ");
4080        pam_tree_clone[i]->Branch("ToFLevel2", "ToFLevel2", GetPointerTo("ToFLevel2"));
4081        cout << "ToF          : branch ToFLevel2" << endl;
4082        i++;
4083      };
4084      // Trigger
4085      if (TRG) {
4086        pam_tree_clone[i] = new TTree("Trigger", "PAMELA trigger level2 data ");
4087        pam_tree_clone[i]->Branch("TrigLevel2", "TrigLevel2", GetPointerTo("TrigLevel2"));
4088        cout << "Trigger      : branch TrigLevel2" << endl;
4089        i++;
4090      };
4091      // S4
4092      if (S4) {
4093        pam_tree_clone[i] = new TTree("S4", "PAMELA S4 level2 data ");
4094        pam_tree_clone[i]->Branch("S4Level2", "S4Level2", GetPointerTo("S4Level2"));
4095        cout << "S4           : branch S4Level2" << endl;
4096        i++;
4097      };
4098      // Neutron Detector
4099      if (ND) {
4100        pam_tree_clone[i] = new TTree("NeutronD", "PAMELA neutron detector level2 data ");
4101        pam_tree_clone[i]->Branch("NDLevel2", "NDLevel2", GetPointerTo("NDLevel2"));
4102        cout << "NeutronD     : branch NDLevel2" << endl;
4103        i++;
4104      };
4105      // Anticounters
4106      if (AC) {
4107        pam_tree_clone[i] = new TTree("Anticounter", "PAMELA anticounter detector level2 data ");
4108        pam_tree_clone[i]->Branch("AcLevel2", "AcLevel2", GetPointerTo("AcLevel2"));
4109        cout << "Anticounter  : branch AcLevel2" << endl;
4110        i++;
4111      };
4112      // OrbitalInfo
4113      if (ORB) {
4114        pam_tree_clone[i] = new TTree("OrbitalInfo", "PAMELA orbital info  ");
4115        pam_tree_clone[i]->Branch("OrbitalInfo", "OrbitalInfo", GetPointerTo("OrbitalInfo"));
4116        cout << "OrbitalInfo  : branch OrbitalInfo" << endl;
4117        i++;
4118      };
4119      // GPamela
4120      if (GP) {
4121        pam_tree_clone[i] = new TTree("h20", "GPAMELA info ");
4122        pam_tree_clone[i]->Branch("GPamela", "GPamela", GetPointerTo("GPamela"), 32000, 1);//split
4123        cout << "OrbitalInfo  : branch OrbitalInfo" << endl;
4124        i++;
4125      };
4126      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
4127    
4128    }
4129    
4130  /**  /**
4131   * Fill tree (created with CreateCloneTrees)   * Fill tree (created with CreateCloneTrees)
4132   *   *
4133   */   */
4134  //void PamLevel2::FillNewPamTree(TTree *T){  //void PamLevel2::FillNewPamTree(TTree *T){
4135  void PamLevel2::FillCloneTrees(){  void PamLevel2::FillCloneTrees() {
4136            
4137      for(Int_t i=0; i<8; i++){    //    cout << "PamLevel2::FillCloneTrees()" << irunentry << endl;
4138          if(tree_clone[i])tree_clone[i]->Fill();  
4139      for (Int_t i = 0; i < NCLONES; i++) {
4140        if (pam_tree_clone[i])
4141          pam_tree_clone[i]->Fill();
4142      }
4143      if (sel_tree_clone)
4144        sel_tree_clone->Fill();
4145    
4146    }
4147    
4148    TTree* PamLevel2::GetCloneTree(TString name) {
4149    
4150      for (Int_t i = 0; i < NCLONES; i++) {
4151        if (pam_tree_clone[i]) {
4152          TString na = pam_tree_clone[i]->GetName();
4153          if (!name.CompareTo(na))
4154            return pam_tree_clone[i];
4155        };
4156      }
4157      if (run_tree_clone) {
4158        TString na = run_tree_clone->GetName();
4159        if (!name.CompareTo(na))
4160          return run_tree_clone;
4161      }
4162      if (sel_tree_clone) {
4163        TString na = sel_tree_clone->GetName();
4164        if (!name.CompareTo(na))
4165          return sel_tree_clone;
4166      }
4167      return NULL;
4168    
4169    }
4170    void PamLevel2::WriteCloneTrees() {
4171      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
4172      cout << "Write clones of PAMELA trees " << endl;
4173      cout << run_tree_clone->GetName() << endl;
4174      if (SELLI != 2) {// Emiliano
4175        if (run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries())
4176          run_tree_clone->GetBranch("DeadLiveTime")->Fill();
4177      };
4178      run_tree_clone->Write();
4179      if (SELLI != 2) { //Emiliano
4180        cout << sel_tree_clone->GetName() << endl;
4181        sel_tree_clone->Write();
4182      };
4183      for (Int_t i = 0; i < NCLONES; i++) {
4184        if (pam_tree_clone[i]) {
4185          cout << pam_tree_clone[i]->GetName() << endl;
4186          pam_tree_clone[i]->Write();
4187        };
4188      }
4189      cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl;
4190    
4191    }
4192    
4193    /**
4194     * Method to get level2-trees entry, the corresponding run entry and (if required) the level0 entry.
4195     */
4196    //Int_t PamLevel2::GetEntry(Int_t iee){
4197    Int_t PamLevel2::GetEntry(Long64_t iee) {
4198    
4199      //     cout << "-------------------------------------"<<endl;
4200      //     cout << "Int_t PamLevel2::GetEntry("<<iee<<")"<<endl;
4201    
4202      if (!pam_tree) {
4203        cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- level2 trees not loaded" << endl;
4204        return 0;
4205      }
4206    
4207      //
4208      // 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...
4209      //
4210      //    if(!run_tree ){
4211      //    cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- run tree not loeaded"<<endl;
4212      //    return 0;
4213      //    }
4214    
4215      Long64_t ii = 0;
4216      //-------------------------------
4217      ii = iee;
4218      if (!pam_tree->GetEntry(ii)) {
4219        cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- error reading pam tree" << endl;
4220        return 0;
4221      }
4222      //
4223      // ... 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.
4224      // 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
4225      // a problem if you don't check the return code of getentry.
4226      //
4227      if (!RUN || !run_tree) {
4228        if (TRK0 || CAL0 || TOF0 || RUN) { //forse cosi` va bene per tornare 1?
4229          cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- run tree not loaded" << endl;
4230          return 0;
4231        }
4232        else {
4233          return 1; //cosi` se non c'e` run esce qua...
4234        }
4235      }
4236    
4237      //-------------------------------
4238      ii = iee;
4239      //    Bool_t UPDATED = UpdateRunInfo(run_tree,ii);
4240      //    Bool_t UPDATED = UpdateRunInfo(ii);
4241      if ( fUpdateRunInfo ) UpdateRunInfo(ii); // Emiliano
4242      if (SELLI == 0 || SELLI == 2)
4243        irunentry = iee - runfirstentry;
4244      //    if(UPDATED && run_tree_clone)run_tree_clone->Fill();
4245    
4246      //    cout << "PamLevel2::GetEntry("<<iee<<") "<<irun<<" "<<runfirstentry<<" "<<irunentry<<endl;
4247    
4248      //     cout << "irunentry     "<<irunentry << endl;
4249      //     cout << "runfirstentry "<<runfirstentry << endl;
4250      //     cout << "nevents       "<<GetRunInfo()->NEVENTS<< endl;
4251    
4252      //     if( TRK0 || CAL0 || TOF0 ){
4253      //    if( !GetYodaEntry( ) ){
4254      //        cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- error reading level0 tree"<<endl;
4255      //        return 0;
4256      //    }
4257      //     }
4258    
4259    
4260      return 1;
4261    
4262    }
4263    
4264    TrkLevel0 *PamLevel2::GetTrkLevel0() {
4265      if (!TRK0)
4266        return NULL;
4267      if (!GetYodaEntry()) {
4268        cout << " Int_t PamLevel2::GetTrkLevel0() -- ERROR -- error reading level0 tree" << endl;
4269        return 0;
4270      }
4271      return trk0_obj;
4272    }
4273    ;
4274    CaloLevel0 *PamLevel2::GetCaloLevel0() {
4275      if (!CAL0)
4276        return NULL;
4277      if (!GetYodaEntry()) {
4278        cout << " Int_t PamLevel2::GetCaloLevel0() -- ERROR -- error reading level0 tree" << endl;
4279        return 0;
4280      }
4281      return calo0_obj;
4282    }
4283    ;
4284    
4285    /**
4286     * Method to retrieve the level0 tree (YODA tree) that contains the current event.
4287     * Given the run ID (...), if needed it query the DB and load the proper file.
4288     * @return Pointer to the tree
4289     */
4290    
4291    TTree* PamLevel2::GetYodaTree() {
4292    
4293      //    cout << "TTree* PamLevel2::GetYodaTree( )"<<endl;
4294      //===================================
4295      // check if iroot has changed
4296      //===================================
4297      if (irun < 0) {
4298        cout << "PamLevel2::GetYodaTree() -- ERROR -- irun = " << irun << endl;
4299        //  cout << "In order to use this method you have to first load the RunInfo tree "<<endl;
4300        return NULL;
4301      }
4302      Int_t irootnew = run_obj->ID_ROOT_L0;
4303      //      cout << "iroot    "<<iroot<<endl;
4304      //      cout << "irootnew "<<irootnew<<endl;
4305    
4306      //===================================
4307      // load the level0 file
4308      // (if not already loaded)
4309      //===================================
4310      if (iroot != irootnew || !l0_tree) {
4311        iroot = irootnew;
4312        //===================================
4313        // open the DB connection
4314        // (if not already opened)
4315        //===================================
4316        if (!dbc || (dbc && !dbc->IsConnected()))
4317          SetDBConnection();
4318        GL_ROOT glroot = GL_ROOT();
4319        if (glroot.Query_GL_ROOT(iroot, dbc)) {
4320          cout << "TTree* PamLevel2::GetYodaTree( ) -- ERROR -- level0 file iroot = " << iroot << " does not exists"
4321              << endl;
4322          return NULL;
4323        };
4324        TString filename = glroot.PATH + glroot.NAME;
4325        if (l0_file) {
4326          l0_file->Close();
4327          l0_file->Delete();
4328        }
4329        cout << "Opening LEVEL0 file: " << filename << endl;
4330        FileStat_t t;
4331        if (gSystem->GetPathInfo(filename.Data(), t)) {
4332          cout << " PamLevel2::GetYodaTree() -- ERROR opening file " << endl;
4333          return NULL;
4334        }
4335        l0_file = new TFile(filename);
4336        if (!l0_file)
4337          return NULL;
4338        l0_tree = (TTree*) l0_file->Get("Physics");
4339        if (!h0_obj)
4340          h0_obj = new EventHeader();
4341        l0_tree->SetBranchAddress("Header", &h0_obj);
4342        prevshift = 0;
4343        //---------------------------------------------------
4344        // TRACKER:
4345        if (TRK0) {
4346          if (!trk0_obj) {
4347            trk0_obj = new TrkLevel0();
4348            trk0_obj->Set();
4349          };
4350          l0_tree->SetBranchAddress("Tracker", trk0_obj->GetPointerToTrackerEvent());
4351      }      }
4352        //--------------------------------------------------
4353        // CALORIMETER:
4354        if (CAL0) {
4355          if (!calo0_obj) {
4356            calo0_obj = new CaloLevel0();
4357            calo0_obj->Set();
4358          };
4359          l0_tree->SetBranchAddress("Calorimeter", calo0_obj->GetPointerToCalorimeterEvent());
4360          //            cout << "PamLevel2::GetYodaTree() --- level0 calorimeter not implemented "<<endl;
4361        }
4362        //---------------------------------------------------
4363        // TOF:
4364        if (TOF0) {
4365          cout << "PamLevel2::GetYodaTree() --- level0 TOF not implemented " << endl;
4366        }
4367    
4368        dbc->Close(); // EMILIANO, do not leave open connections, open only when needed
4369        dbc=0;
4370    
4371      };
4372    
4373      //     if(!dbc || (dbc && !dbc->IsConnected())){
4374      //    cout << " TTree* PamLevel2::GetYodaTree( ) -- no DB connected... hai fatto qualche cazzata "<<endl;
4375      //     }
4376    
4377      if (TRK0) {
4378        //  TrkParams::Load(6);
4379        //  if( !TrkParams::IsLoaded(6) ){
4380        //      cout << " TTree* PamLevel2::GetYodaTree( ) -- WARNING -- VK-mask not loaded"<<endl;
4381        //  };
4382        if(!dbc || (dbc && !dbc->IsConnected()))SetDBConnection(); // PERCHE` ERA COMMENTATA QUESTA RIGA?
4383        TrkParams::SetCalib(run_obj, dbc);
4384        TrkParams::LoadCalib();
4385        if (!TrkParams::CalibIsLoaded()) {
4386          cout << " TTree* PamLevel2::GetYodaTree( ) -- WARNING -- Calibration not loaded" << endl;
4387        };
4388        if(dbc){
4389          dbc->Close(); // EMILIANO, do not leave open connections, open only when needed
4390          dbc=0;
4391        };
4392      }
4393    
4394      //    cout << l0_tree << endl;
4395      return l0_tree;
4396    
4397  }  }
4398    
4399    /**
4400     * Method to retrieve the level0 tree (YODA tree) that contains the current event.
4401     */
4402    Int_t PamLevel2::GetYodaEntry() {
4403    
4404  TTree* PamLevel2::GetCloneTree(TString name){    //    cout << "Int_t PamLevel2::GetYodaEntry()"<<endl;
4405      if (!GetYodaTree())
4406        return 0;
4407    
4408      // patch
4409      if (irunentry < 0) {
4410        //  cout << "Int_t PamLevel2::GetYodaEntry() -- ATTENZIONE -- irunentry negativo?!?! "<<(Int_t)irunentry<<endl;
4411        irunentry = 0LL;
4412      }
4413      //  ---------------------------------
4414      //  if file is NOT a preselected file
4415      //  ---------------------------------
4416      Long64_t quellagiusta = irunentry + (Long64_t)(run_obj->EV_FROM);
4417      //     cout << " irunentry "<<irunentry<<endl;
4418      //     cout << " EV_FROM "<<run_obj->EV_FROM<<endl;
4419      //     cout << " quellagiusta = irunentry + EV_FROM "<< quellagiusta << endl;
4420    
4421      //     cout << " irun "<< irun << " irunentry "<< irunentry<<" run_obj->EV_FROM "<<run_obj->EV_FROM <<" quella giusta "<<quellagiusta << endl;
4422      //     cout << " iroot "<<iroot<<" run_obj->ID_ROOT_L0 "<<run_obj->ID_ROOT_L0<<endl;
4423      //     cout << " time "<< abstime << endl;
4424      //     cout << " trk_calib_used "<<run_obj->TRK_CALIB_USED<< endl;
4425    
4426      ULong64_t obt = 0;
4427      ULong64_t pktn = 0;
4428      if (GetOrbitalInfo()) {
4429        obt = GetOrbitalInfo()->OBT;
4430        pktn = GetOrbitalInfo()->pkt_num;
4431      }
4432    
4433      if (!GetOrbitalInfo() && !ISGP) {
4434        cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing OrbitalInfo " << endl;
4435        return 0;
4436      }
4437      if (obt == 0 && pktn == 0 && !ISGP) {
4438        cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- level2 event corrupted ?? " << endl;
4439        return 0;
4440      }
4441    
4442      // ---------------------------------------------------------------------
4443      // ATTENTION!!!
4444      // If data are not pre-processed with cleaner, the level0 tree may contain
4445      // spurious nested physics packets.
4446      // The GL_RUN variables EV_FROM, EV_TO and NEVENTS counts also these entries
4447      // while level2 tree DOES NOT!!
4448      // This means that "quellagiusta" in these cases is not correct.
4449      // In order to retrieve the correct level0 event, I implemented a check
4450      // of the OBT and pkt-number. In case of mismatch, the level0 entry number
4451      // is shift forward until when the packets match.
4452      // ---------------------------------------------------------------------
4453      Int_t answer = 0;
4454      Int_t shift = 0;
4455      //    printf(" siamo qui %i %i \n",shift,prevshift);
4456      //    Int_t maxshift = 50; // EMILIANO
4457      do {
4458        if (shift > 0) {
4459          cout << " PKTNUM  L2 --- " << pktn << " --- L0 --- " << GetEventHeader()->GetPscuHeader()->GetCounter() << endl;
4460          if (DBG)
4461            cout << "         RUN: ID " << GetRunInfo()->ID << " ID_ROOT_L0 " << run_obj->ID_ROOT_L0 << " ID_RUN_FRAG "
4462                << GetRunInfo()->ID_RUN_FRAG << " EV_FROM " << GetRunInfo()->EV_FROM << endl;
4463          if (DBG)
4464            cout << "         L2 <--> L0 mismatch ( irun " << irun << " irunentry " << irunentry << " shift " << shift
4465                << " prevshift " << prevshift << " )" << endl;
4466        }
4467        answer = l0_tree->GetEntry(quellagiusta + (Long64_t) shift + (Long64_t) prevshift);
4468        shift++;
4469        if (!GetEventHeader()) {
4470          cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing EventHeader " << endl;
4471          return 0;
4472        }
4473    
4474      for(Int_t i=0; i<8; i++){        if (ISGP) {
4475          if(tree_clone[i]){        obt = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()); //BARBATRUCCO
4476              TString na = tree_clone[i]->GetName();        pktn = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()); //BARBATRUCCO
             if(!name.CompareTo(na))return tree_clone[i];  
         };  
4477      }      }
4478    
4479        //  cout << "PKTNUM "<<shift<<" ==  L2 --- "<< pktn << " --- L0 --- "<< GetEventHeader()->GetPscuHeader()->GetCounter()<<endl;
4480        //  cout << " L2 --- "<< obt << " --- L0 --- "<< GetEventHeader()->GetPscuHeader()->GetOrbitalTime()<<endl;
4481        //  if( (quellagiusta+shift) == l0_tree->GetEntries()+1 )cout << ">>> end of level0 tree <<<"<<endl;
4482        //  cout << " obt "<< obt << endl;
4483        //  cout << " GetEventHeader()->GetPscuHeader()->GetOrbitalTime() "<< GetEventHeader()->GetPscuHeader()->GetOrbitalTime() << endl;
4484        //  cout << " pktn "<< pktn << endl;
4485        //  cout << " GetEventHeader()->GetPscuHeader()->GetCounter() "<< GetEventHeader()->GetPscuHeader()->GetCounter() << endl;
4486        //  printf(" IDRUN %u \n",GetRunInfo()->ID);
4487        //
4488        if (prevshift != 0 && (quellagiusta + (Long64_t) shift) == GetYodaTree()->GetEntries()) {
4489          prevshift = 0;
4490          shift = -1;
4491        };
4492    
4493      } while ((obt != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) || pktn != (UInt_t)(
4494          GetEventHeader()->GetPscuHeader()->GetCounter())) && (quellagiusta + (Long64_t) shift)
4495          < GetYodaTree()->GetEntries() && shift < maxshift);
4496    
4497      if ((quellagiusta + (Long64_t) shift + (Long64_t) prevshift) > GetYodaTree()->GetEntries() || shift == maxshift) {
4498        cout << " Big trouble here, no such event in Level0 data! (NB maxshift set to " << maxshift << " )" << endl;
4499        return 0;
4500      }
4501      //    cout << "LA ENTRY GIUSTA E`: "<<quellagiusta<<" (spero...)"<<endl;
4502      //    return GetYodaTree()->GetEntry(quellagiusta);
4503      if (shift > 1)
4504        prevshift += (shift - 1);
4505    
4506      return answer;
4507    
4508    }
4509    /**
4510     * \Brief Set DB connection
4511     */
4512    Bool_t PamLevel2::SetDBConnection() {
4513    
4514      //    cout << "PamLevel2::SetDBConnection()" << endl;
4515      if (DBG) {
4516        cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
4517        cout << "Connecting to DB" << endl;
4518        cout << "HOST " << host << endl;
4519        cout << "USER " << user << endl;
4520        cout << "PSW  " << psw << endl;
4521      }
4522      Bool_t notconn = true;
4523      Int_t trials = 0;
4524      while ( notconn && trials < 10 ){
4525        //    gSystem->Sleep(500);
4526        dbc = TSQLServer::Connect(host.Data(), user.Data(), psw.Data());
4527        //dbc->Connect(host.Data(), user.Data(), psw.Data());
4528        if ( dbc ) notconn = false;
4529        if (DBG) printf("<%i> test connection...\n ",trials);
4530        if (!dbc){
4531          if (DBG) printf(" :( failed, no pointer \n");
4532          notconn = true;
4533          //      return false;
4534        };
4535        if (dbc && !dbc->IsConnected()){
4536          if (DBG) printf(" :( failed, no connection \n");
4537          notconn = true;
4538          //      return false;
4539        };
4540        trials++;
4541      };
4542      if ( notconn ) return false;
4543      //
4544      if (DBG) printf("=connected!\n");
4545      stringstream myquery; // EMILIANO
4546      myquery.str(""); // EMILIANO
4547      myquery << "SET time_zone='+0:00'"; // EMILIANO
4548      dbc->Query(myquery.str().c_str()); // EMILIANO
4549      if ( DBG ) printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
4550      return true;
4551    
4552    }
4553    
4554    /**
4555     * \Brief Add a friend to the pamela chain.
4556     * @param cname name of the chain to be added
4557     */
4558    
4559    TChain* PamLevel2::AddFriend(TString cname) {
4560    
4561      if (!GetPamTree()) {
4562        cout << " TChain* PamLevel2::AddFriend(TString cname) --- a pamela tree must be created first" << endl;
4563      return NULL;      return NULL;
4564      }
4565    
4566      TChain *c = new TChain(cname.Data());
4567    
4568      TIter next(GetPamTree()->GetListOfFiles());
4569      Int_t nf = 0;
4570      TChainElement* element = 0;
4571      while ((element = (TChainElement*) next())) {
4572        c->Add(element->GetTitle());
4573        nf++;
4574      }
4575    
4576      GetPamTree()->AddFriend(cname.Data());
4577    
4578      cout << "external chain created and added to pamela friends :" << cname << endl;
4579      cout << "n.files " << nf << endl;
4580    
4581      return c;
4582    
4583    }
4584    
4585    /**
4586     * Returns the current read entry. This method simply returns the result of the call to
4587     * pam_tree->GetReadEntry(), so it is entirely handled by ROOT.
4588     */
4589    Long64_t PamLevel2::GetReadEntry() {
4590      return pam_tree->GetReadEntry();
4591  }  }
 void PamLevel2::WriteCloneTrees(){  
     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;  
     cout << "Write clones of PAMELA trees "<<endl;  
     for(Int_t i=0; i<8; i++){    
         if(tree_clone[i]){  
             cout << tree_clone[i]->GetName()<<endl;  
             tree_clone[i]->Write();  
         };  
     }  
     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;  
   
 }  
   
 /**  
  * Create a new (empty) Pamela trees  
  */  
 // TTree* PamLevel2::GetNewPamTree(){  
   
 //     if(tree_clone)return tree_clone;  
   
 //     TTree *Tout = 0;  
       
 //     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;  
 //     cout << "Create new PAMELA trees "<<endl;  
       
       
 //     if(TRK1||TRK2||TRKh){  
 //      TTree *T = new TTree("Tracker_clone","PAMELA tracker level2 data ");      
 //      if(TRK1) {  
 //          trk1_clone = new TrkLevel1();  
 //          T->Branch("TrkLevel1","TrkLevel1", &trk1_clone);  
 //          T->BranchRef();  
 //          cout << "Tracker      : branch TrkLevel1"<<endl;  
 //      };  
 //      if(TRK2) {  
 //          trk2_clone = new TrkLevel2();  
 //          T->Branch("TrkLevel2", "TrkLevel2",&trk2_clone);  
 //          cout << "Tracker      : branch TrkLevel2"<<endl;          
 //      };  
 //      if(TRKh) {  
 //          trkh_clone = new TrkHough();  
 //          T->Branch("TrkHough","TrkHough", &trkh_clone);  
 //          cout << "Tracker      : branch TrkHough"<<endl;  
 //      };  
 //      if(!Tout)Tout=T;  
 //      else Tout->AddFriend("Tracker_clone");  
 //     }  
   
 //     // Calorimeter  
 //     if(CAL1||CAL2){  
 //      TTree *C = new TTree("Calorimeter_clone","PAMELA calorimeter level2 data ");      
 //      if(CAL1) {  
 //          calo1_clone = new CaloLevel1();  
 //          C->Branch("CaloLevel1", "CaloLevel1", &calo1_clone);  
 //          cout << "Calorimeter  : branch CaloLevel1"<<endl;  
 //      };  
 //      if(CAL2) {  
 //          calo2_clone = new CaloLevel2();  
 //          C->Branch("CaloLevel2","CaloLevel2", &calo2_clone);  
 //          cout << "Calorimeter  : branch CaloLevel2"<<endl;  
 //      };  
 //      if(!Tout)Tout=C;  
 //      else Tout->AddFriend("Calorimeter_clone");  
 //     }      
   
 //     // ToF      
 //     if(TOF) {  
 //      TTree *O = new TTree("ToF_clone","PAMELA ToF level2 data ");      
 //      tof_clone = new ToFLevel2();  
 //      O->Branch("ToFLevel2","ToFLevel2", &tof_clone);  
 //      cout << "ToF          : branch ToFLevel2"<<endl;  
 //      if(!Tout)Tout=O;  
 //      else Tout->AddFriend("ToF_clone");  
 //     };  
 //     // Trigger  
 //     if(TRG) {  
 //      TTree *R = new TTree("Trigger_clone","PAMELA trigger level2 data ");      
 //      trig_clone = new TrigLevel2();  
 //      R->Branch("TrigLevel2","TrigLevel2", &trig_clone);  
 //      cout << "Trigger      : branch TrigLevel2"<<endl;  
 //      if(!Tout)Tout=R;  
 //      else Tout->AddFriend("Trigger_clone");  
 //     };  
 //     // S4  
 //     if(S4) {  
 //      TTree *S = new TTree("S4_clone","PAMELA S4 level2 data ");        
 //      s4_clone = new S4Level2();  
 //      S->Branch("S4Level2","S4Level2", &s4_clone);  
 //      cout << "S4           : branch S4Level2"<<endl;  
 //      if(!Tout)Tout=S;  
 //      else Tout->AddFriend("S4_clone");  
 //     };  
 //     // Neutron Detector  
 //     if(ND) {  
 //      TTree *N = new TTree("NeutronD_clone","PAMELA neutron detector level2 data ");    
 //      nd_clone = new NDLevel2();  
 //      N->Branch("NDLevel2","NDLevel2", &nd_clone);  
 //      cout << "NeutronD     : branch NDLevel2"<<endl;  
 //      if(!Tout)Tout=N;  
 //      else Tout->AddFriend("NeutronD_clone");  
 //     };  
 //     // Anticounters  
 //     if(AC) {  
 //      TTree *A = new TTree("Anticounter_clone","PAMELA anticounter detector level2 data ");    
 //      ac_clone = new AcLevel2();  
 //      A->Branch("AcLevel2","AcLevel2", &ac_clone);  
 //      cout << "Anticounter  : branch AcLevel2"<<endl;  
 //      if(!Tout)Tout=A;  
 //      else Tout->AddFriend("Anticounter_clone");  
 //     };  
 //     // OrbitalInfo  
 //     if(ORB) {  
 //      TTree *B = new TTree("OrbitalInfo_clone","PAMELA oribital info  ");      
 //      orb_clone = new OrbitalInfo();  
 //      B->Branch("OrbitalInfo","OrbitalInfo", &orb_clone);  
 //      cout << "OrbitalInfo  : branch OrbitalInfo"<<endl;  
 //      if(!Tout)Tout=B;  
 //      else Tout->AddFriend("OrbitalInfo_clone");  
 //     };  
 //     cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <<endl;  
   
 //     tree_clone = Tout;  
 //     tree_clone->SetDirectory(0);  
   
 //     return Tout;  
 // }  
 // /**  
 //  * Fill a tree (created with GetNewPamTree)  
 //  *  
 //  */  
 // //void PamLevel2::FillNewPamTree(TTree *T){  
 // void PamLevel2::FillNewPamTree(){  
           
   
 //     if(trk1_clone)  *trk1_clone = *trk1_obj;  
 //     if(trk2_clone){  
 //      trk2_clone->Clear();  
 //      trk2_obj->Copy(*trk2_clone);  
 // //   *trk2_clone = *trk2_obj;  
 //     }  
 //     if(trkh_clone)  *trkh_clone = *trkh_obj;  
 //     if(calo1_clone){  
 // //   *calo1_clone = *calo1_obj;  
 //      calo1_clone->Clear();  
 //      calo1_obj->Copy(*calo1_clone);  
 //     }  
 //     if(calo2_clone){  
 // //   *calo2_clone = *calo2_obj;  
 //      calo2_clone->Clear();  
 //      calo2_obj->Copy(*calo2_clone);  
 //     }  
 //     if(tof_clone)   *tof_clone  = *tof_obj;  
 //     if(trig_clone)  *trig_clone = *trig_obj;  
 //     if(s4_clone)    *s4_clone   = *s4_obj;  
 //     if(nd_clone)    *nd_clone   = *nd_obj;  
 //     if(ac_clone)    *ac_clone   = *ac_obj;  
 //     if(orb_clone)   *orb_clone  = *orb_obj;  
   
 //     TTree *T = tree_clone;  
   
 //     T->Fill(); //fill main tree  
 // //    cout<<T->IsA()->GetName()<<" "<<T->GetName()<<endl;  
 //     TList *li = T->GetListOfFriends();  
 //     TIter next(li);  
 //     TFriendElement* T_friend=0;  
 //     while( (T_friend = (TFriendElement*)next()) ){  
 // //   cout<<T_friend->IsA()->GetName()<<" "<<T_friend->GetName()<<hex << T_friend->GetTree() << dec<<endl;  
 //      T_friend->GetTree()->Fill();//fill friends  
 //     }  
4592    
4593  // }  /**
4594     * Sets the sorting method. If the new method is different from the previous, the issorted
4595     * flag is set to false, forcing a new sort the next time GetTrack is called.
4596     * @see GetTrack
4597     */
4598    void PamLevel2::SetSortingMethod(TString how) {
4599      if (howtosort != how) {
4600        issorted = false;
4601      }
4602      howtosort = how;
4603    }

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.86

  ViewVC Help
Powered by ViewVC 1.1.23