/[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.3 by pam-fi, Mon Aug 7 08:24:49 2006 UTC revision 1.6 by pam-fi, Tue Oct 24 10:24:27 2006 UTC
# Line 36  PamTrack::PamTrack(TrkTrack* t, CaloTrkV Line 36  PamTrack::PamTrack(TrkTrack* t, CaloTrkV
36   */   */
37  PamLevel2::PamLevel2(){  PamLevel2::PamLevel2(){
38                    
39      trk_obj  = this->TrkLevel2::GetTrkLevel2();      trk_l1_obj  = this->TrkLevel1::GetTrkLevel1();      
40      calo_obj = this->CaloLevel2::GetCaloLevel2();      trk_obj     = this->TrkLevel2::GetTrkLevel2();
41      tof_obj  = this->ToFLevel2::GetToFLevel2();      calo_obj    = this->CaloLevel2::GetCaloLevel2();
42      trig_obj = this->TrigLevel2::GetTrigLevel2();      tof_obj     = this->ToFLevel2::GetToFLevel2();
43      s4_obj   = this->S4Level2::GetS4Level2();      trig_obj    = this->TrigLevel2::GetTrigLevel2();
44      nd_obj   = this->NDLevel2::GetNDLevel2();      s4_obj      = this->S4Level2::GetS4Level2();
45      ac_obj   = this->AcLevel2::GetAcLevel2();      nd_obj      = this->NDLevel2::GetNDLevel2();
46          orb_obj  = this->OrbitalInfo::GetOrbitalInfo();      ac_obj      = this->AcLevel2::GetAcLevel2();
47        orb_obj     = this->OrbitalInfo::GetOrbitalInfo();
48          sorted_tracks = new TRefArray();  
49        run_obj     = new GL_RUN();
50          CAL = true;      
51          TRK = true;      sorted_tracks = new TRefArray();
52          TRG = true;      
53          TOF = true;      CAL = true;
54          S4  = true;      TRK = true;
55          ND  = true;      TRG = true;
56          AC  = true;      TOF = true;
57          ORB = true;      S4  = true;
58        ND  = true;
59        AC  = true;
60        ORB = true;
61        
62        TRK_L1 = false;
63        
64        Tout  = NULL;
65  };  };
66  /**  /**
67   * Destructor   * Destructor
68   */   */
69  PamLevel2::~PamLevel2(){  PamLevel2::~PamLevel2(){
70                                    
71          TrkLevel2::Clear();      TrkLevel1::Clear();
72          CaloLevel2::Clear();      
73          ToFLevel2::Clear();      TrkLevel2::Clear();
74          TrigLevel2::Clear();      CaloLevel2::Clear();
75          S4Level2::Clear();      ToFLevel2::Clear();
76          NDLevel2::Clear();      TrigLevel2::Clear();
77          AcLevel2::Clear();      S4Level2::Clear();
78          OrbitalInfo::Clear();      NDLevel2::Clear();
79        AcLevel2::Clear();
80        OrbitalInfo::Clear();
81        
82        delete run_obj;
83        
84    //      delete sorted_tracks;
85        sorted_tracks->Delete(); // clean the reference array
86                    
87          delete sorted_tracks;      if(Tout)Tout->Delete(); // delete loaded tree from memory
88                    
89  };  };
90  /**  /**
# Line 79  PamLevel2::~PamLevel2(){ Line 92  PamLevel2::~PamLevel2(){
92   */   */
93  void PamLevel2::Clear(){  void PamLevel2::Clear(){
94                    
95        TrkLevel1::Clear();
96                    
97          sorted_tracks->Delete();      TrkLevel2::Clear();
98                CaloLevel2::Clear();
99        ToFLevel2::Clear();
100        TrigLevel2::Clear();
101        S4Level2::Clear();
102        NDLevel2::Clear();
103        AcLevel2::Clear();
104        OrbitalInfo::Clear();
105        
106        sorted_tracks->Delete(); // clean the reference array
107        
108  };  };
109    
110    
# Line 95  void PamLevel2::Clear(){ Line 118  void PamLevel2::Clear(){
118   */   */
119   CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){   CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){
120                    
121           CaloTrkVar *c = 0;       if( CaloLevel2::ntrk()==0 ){
122           Int_t it_calo=0;           cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no Calorimeter tracks are stored"<<endl;
123                     return NULL;
124           do{       };
125                   c = CaloLevel2::GetCaloTrkVar(it_calo);      
126                   it_calo++;       CaloTrkVar *c = 0;
127           } while( seqno != c->trkseqno && it_calo < CaloLevel2::ntrk());               Int_t it_calo=0;
128                
129           if(seqno != c->trkseqno){       do{
130                   c = 0;           c = CaloLevel2::GetCaloTrkVar(it_calo);
131                   if(seqno!=-1)cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match Calorimeter stored tracks"<<endl;           it_calo++;
132           };       } while( c && seqno != c->trkseqno && it_calo < CaloLevel2::ntrk());      
133           return c;      
134         if(!c || seqno != c->trkseqno){
135             c = 0;
136             if(seqno!=-1)cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match Calorimeter stored tracks"<<endl;
137         };
138         return c;
139        
140   };   };
141  //--------------------------------------  //--------------------------------------
142   //   //
# Line 120  void PamLevel2::Clear(){ Line 148  void PamLevel2::Clear(){
148   */   */
149   ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno){   ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno){
150                    
151           ToFTrkVar *c = 0;       if( ToFLevel2::ntrk()==0 ){
152           Int_t it_tof=0;           cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no ToF tracks are stored"<<endl;
153                     return NULL;
154           do{       };
155                   c = ToFLevel2::GetToFTrkVar(it_tof);      
156                   it_tof++;       ToFTrkVar *c = 0;
157           } while( seqno != c->trkseqno && it_tof < ToFLevel2::ntrk());         Int_t it_tof=0;
158                
159           if(seqno != c->trkseqno){       do{
160                   c = 0;           c = ToFLevel2::GetToFTrkVar(it_tof);
161                   if(seqno!=-1)cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match ToF stored tracks"<<endl;           it_tof++;
162           };       } while( c && seqno != c->trkseqno && it_tof < ToFLevel2::ntrk());
163           return c;      
164         if(!c || seqno != c->trkseqno){
165             c = 0;
166             if(seqno!=-1)cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match ToF stored tracks"<<endl;
167         };
168         return c;
169        
170   };   };
171    
172  //--------------------------------------  //--------------------------------------
# Line 145  void PamLevel2::Clear(){ Line 178  void PamLevel2::Clear(){
178   */   */
179   PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t){   PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t){
180                    
181           CaloTrkVar *c = 0;       CaloTrkVar *c = 0;
182           ToFTrkVar  *o = 0;       ToFTrkVar  *o = 0;
183                
184           c = GetCaloStoredTrack(t->GetSeqNo());       if(CAL) c = GetCaloStoredTrack(t->GetSeqNo());
185           o = GetToFStoredTrack(t->GetSeqNo());       if(TOF) o = GetToFStoredTrack(t->GetSeqNo());
186                
187  //    if(t && c && o)track = new PamTrack(t,c,o);  //    if(t && c && o)track = new PamTrack(t,c,o);
188           PamTrack *track = new PamTrack(t,c,o);       PamTrack *track = new PamTrack(t,c,o);
189                
190           return track;       return track;
191    
192   };   };
193  //--------------------------------------  //--------------------------------------
# Line 169  void PamLevel2::Clear(){ Line 202  void PamLevel2::Clear(){
202    
203  PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){  PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){
204            
205          PamTrack *track = 0;      PamTrack *track = 0;
206        
207          if( itrk >=0 && itrk < TrkLevel2::ntrk() ){      if( itrk >=0 && itrk < TrkLevel2::ntrk() ){
                   
                 TrkTrack *t = TrkLevel2::GetStoredTrack(itrk);  
                 track = GetPamTrackAlong(t);  
208                    
209          }else{          TrkTrack *t = TrkLevel2::GetStoredTrack(itrk);
210                  cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;          track = GetPamTrackAlong(t);
         };  
   
         return track;  
211                    
212        }else{
213            cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
214        };
215        
216        return track;
217        
218  }  }
219  //--------------------------------------  //--------------------------------------
220  //  //
# Line 200  PamTrack* PamLevel2::GetStoredTrack(Int_ Line 233  PamTrack* PamLevel2::GetStoredTrack(Int_
233   */   */
234  void PamLevel2::SortTracks(TString how){  void PamLevel2::SortTracks(TString how){
235    
236          sorted_tracks->Delete(); //temporaneo    //Save current Object count
237        Int_t ObjectNumber = TProcessID::GetObjectCount();
238        
239        sorted_tracks->Delete(); //temporaneo???
240            
241      // loop over the tracks sorted by the tracker      // loop over the tracks sorted by the tracker
242          Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);      Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
243          Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);      Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
244          Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);      Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase);
245        
246        if( !CAL &&  use_CAL) use_CAL = false;
247        if( !TOF &&  use_TOF) use_TOF = false;
248        
249        if( !TRK ){
250            cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl;
251            return;
252        };
253        
254        for(Int_t i=0; i < TrkLevel2::GetNTracks(); i++){
255                    
256            TrkTrack *ts = 0;
257                    
         for(Int_t i=0; i < TrkLevel2::GetNTracks(); i++){  
   
                 TrkTrack *ts = 0;  
   
258          // get tracker tracks          // get tracker tracks
259                  TrkTrack   *tp = TrkLevel2::GetTrack(i);                    //tracker          TrkTrack   *tp = TrkLevel2::GetTrack(i);                    //tracker
260                  CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());  //              CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());
261                  ToFTrkVar  *op = GetToFStoredTrack(tp->GetSeqNo());  //              ToFTrkVar  *op = GetToFStoredTrack(tp->GetSeqNo());
262            CaloTrkVar *cp = 0;
263            ToFTrkVar  *op = 0;
264            
265          // if track has an image, check image selection          // if track has an image, check image selection
266                  if(tp->HasImage()){          if(tp->HasImage()){
267                                        
268                          TrkTrack   *ti = TrkLevel2::GetTrackImage(i);              //tracker (image)              TrkTrack   *ti = TrkLevel2::GetTrackImage(i);              //tracker (image)
269                          CaloTrkVar *ci = GetCaloStoredTrack(ti->GetSeqNo());  //                      CaloTrkVar *ci = GetCaloStoredTrack(ti->GetSeqNo());
270                          ToFTrkVar  *oi = GetToFStoredTrack(ti->GetSeqNo());  //                      ToFTrkVar  *oi = GetToFStoredTrack(ti->GetSeqNo());
271                CaloTrkVar *ci = 0;
272                ToFTrkVar  *oi = 0;
273                
274              //assign starting scores              //assign starting scores
275                          Int_t tp_score = 0;  //main track sorted by the tracker              Int_t tp_score = 0;  //main track sorted by the tracker
276                          Int_t ti_score = 0;  //image track              Int_t ti_score = 0;  //image track
277                                                                
278              // ------------------------              // ------------------------
279              // calorimeter check              // calorimeter check
280              // ------------------------              // ------------------------
281                  // check the Y spatial residual on the first calorimeter plane              // check the Y spatial residual on the first calorimeter plane
282                  // (cut on calorimeter variables from Emiliano)              // (cut on calorimeter variables from Emiliano)
283                          if(              if(
284                                  use_CAL            &&                  use_CAL            &&
285                                  npcfit[1] > 15     &&   //no. of fit planes on Y view                  npcfit[1] > 15     &&   //no. of fit planes on Y view
286                                  varcfit[1] < 1000. &&  //fit variance on Y view                  varcfit[1] < 1000. &&  //fit variance on Y view
287                                  true){                  true){
288                    
289                                  Float_t resy_p = cp->tbar[0][1] - cbar[0][1]; if(resy_p < 0)resy_p= - resy_p;                  cp = GetCaloStoredTrack(tp->GetSeqNo());
290                                  Float_t resy_i = ci->tbar[0][1] - cbar[0][1]; if(resy_i < 0)resy_i= - resy_i;                  ci = GetCaloStoredTrack(ti->GetSeqNo());
291                    
292                                  if(resy_p <= resy_i) tp_score++;                  Float_t resy_p = cp->tbar[0][1] - cbar[0][1]; if(resy_p < 0)resy_p= - resy_p;
293                                  else                 ti_score++;                  Float_t resy_i = ci->tbar[0][1] - cbar[0][1]; if(resy_i < 0)resy_i= - resy_i;
294                          };                  
295                    if(resy_p <= resy_i) tp_score++;
296                    else                 ti_score++;
297                };
298              // ------------------------              // ------------------------
299              // TOF check              // TOF check
300              // ------------------------                  // ------------------------    
301                  // check the number of hit pmts along the track              // check the number of hit pmts along the track
302                  // on S12 S21 and S32, where paddles are parallel to Y axis              // on S12 S21 and S32, where paddles are parallel to Y axis
303                          Int_t nphit_p =0;              if( use_TOF ){
304                          Int_t nphit_i =0;                  
305                                                    Int_t nphit_p =0;
306                          for (Int_t ih=0; ih < op->npmtadc; ih++){                  Int_t nphit_i =0;
307                                  Int_t pl = GetPlaneIndex( (op->pmtadc).At(ih) );                  
308                                  if(pl == 1 || pl == 2 || pl == 5)nphit_p++;                  op = GetToFStoredTrack(tp->GetSeqNo());
309                          };                  oi = GetToFStoredTrack(ti->GetSeqNo());
310                                                                    
311                          for (Int_t ih=0; ih < oi->npmtadc; ih++){  /*                              cout << "track: npmtadc "<< op->npmtadc << endl;
312                                  Int_t pl = GetPlaneIndex( (oi->pmtadc).At(ih) );                                  cout << "track: npmttdc "<< op->npmttdc << endl;
313                                  if(pl == 1 || pl == 2 || pl == 5)nphit_i++;                                      cout << "image: npmtadc "<< oi->npmtadc << endl;
314                          };                                  cout << "image: npmttdc "<< oi->npmttdc << endl;*/
315                                            
316                          if(                  for (Int_t ih=0; ih < op->npmtadc; ih++){
317                                  use_TOF            &&                      Int_t pl = GetPlaneIndex( (op->pmtadc).At(ih) );
318                                  (nphit_p+nphit_i) !=0 &&                              if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
319                                  true){                  };
320                    
321                                  if( nphit_p >= nphit_i) tp_score++;                  for (Int_t ih=0; ih < oi->npmtadc; ih++){
322                                  else                                              ti_score++;                      Int_t pl = GetPlaneIndex( (oi->pmtadc).At(ih) );
323                          };                      if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
324                                };
325                          if(tp_score == ti_score) use_TRK = true;                  
326                  // ------------------------                  if(
327                        use_TOF            &&
328                        (nphit_p+nphit_i) !=0 &&    
329                        true){
330                        
331                        if( nphit_p >= nphit_i) tp_score++;
332                        else ti_score++;
333                    };
334                };
335                if(tp_score == ti_score) use_TRK = true;
336                // ------------------------
337              // tracker check              // tracker check
338              // ------------------------              // ------------------------
339                  // chi**2 difference is not always large enough to distinguish among              // chi**2 difference is not always large enough to distinguish among
340                  // the real track and its image.              // the real track and its image.
341                  // Tracker check will be applied always when calorimeter and tof information is ambiguous.              // Tracker check will be applied always when calorimeter and tof information is ambiguous.
342                          if(use_TRK){              if(use_TRK){
343                                  if(      tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;                  if(      tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
344                                  else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;                  else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ;
345                          };              };
346                
347              // ------------------------              // ------------------------
348              // the winner is....              // the winner is....
349              // ------------------------                  // ------------------------    
350                          if      (tp_score > ti_score) ts = tp;//the track sorted by the tracker!!              if      (tp_score > ti_score) ts = tp;//the track sorted by the tracker!!
351                          else if (tp_score < ti_score) ts = ti;//its image!!              else if (tp_score < ti_score) ts = ti;//its image!!
352                          else {              else {
353                                  ts = tp;                  ts = tp;
354  //                              cout << "Warning - track image ambiguity not solved" << endl;  //                              cout << "Warning - track image ambiguity not solved" << endl;
355  //                              cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl;  //                              cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl;
356                          };              };
357                
358                  }else{          }else{
359                          ts = tp;              ts = tp;
                 };  
                           
                 sorted_tracks->Add(ts);//save the track in the sorted array  
                   
360          };          };
361            
362    //              cout <<" SortTracks() "<<i<<" -- "<<ts<<endl;
363            sorted_tracks->Add(ts);//save the track in the sorted array
364    //              cout << "SortTracks:: sorted_tracks->Add(it) "<<i<<" "<<ts<<endl;
365            
366        };
367        //Restore Object count
368        //To save space in the table keeping track of all referenced objects
369        //we assume that our events do not address each other. We reset the
370        //object count to what it was at the beginning of the event.
371        TProcessID::SetObjectCount(ObjectNumber);
372        
373  };  };
374  //--------------------------------------  //--------------------------------------
375  //  //
# Line 312  void PamLevel2::SortTracks(TString how){ Line 380  void PamLevel2::SortTracks(TString how){
380   * PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information.   * PamLevel2::GetTracks() keeps the same track order given by TrkLevel2::GetTracks(), but checks image selection by using calorimeter and ToF tracking information.
381   */   */
382   TRefArray *PamLevel2::GetTracks(){   TRefArray *PamLevel2::GetTracks(){
383          SortTracks("+CAL+TOF");           //
384    //      SortTracks("+CAL+TOF");
385             SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
386            //
387          return sorted_tracks;          return sorted_tracks;
388   };   };
389  //--------------------------------------  //--------------------------------------
# Line 327  void PamLevel2::SortTracks(TString how){ Line 398  void PamLevel2::SortTracks(TString how){
398  PamTrack *PamLevel2::GetTrack(int it){  PamTrack *PamLevel2::GetTrack(int it){
399                    
400  //  *-*-*-*-*-*-*  //  *-*-*-*-*-*-*
401          SortTracks("+CAL+TOF");  //      SortTracks("+CAL+TOF");
402        SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
403  //  *-*-*-*-*-*-*  //  *-*-*-*-*-*-*
404    
405          PamTrack *track = 0;      PamTrack *track = 0;
406                
407          if( it >=0 && it < TrkLevel2::GetNTracks() ){      if( it >=0 && it < TrkLevel2::GetNTracks() && it<sorted_tracks->GetEntriesFast() ){
408                  TrkTrack   *t = (TrkTrack*)sorted_tracks->At(it);          TrkTrack   *t = (TrkTrack*)sorted_tracks->At(it);
409                  track = GetPamTrackAlong(t);          track = GetPamTrackAlong(t);
410          }else{      }else{
411                  cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;          cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
412          };      };
413                
414          return track;      return track;
415        
416  };  };
417    
418  //--------------------------------------  //--------------------------------------
# Line 353  PamTrack *PamLevel2::GetTrack(int it){ Line 425  PamTrack *PamLevel2::GetTrack(int it){
425   */   */
426  PamTrack *PamLevel2::GetTrackImage(int it){  PamTrack *PamLevel2::GetTrackImage(int it){
427    
428          SortTracks("+CAL+TOF");  //      SortTracks("+CAL+TOF");
429            SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
430                    
431          PamTrack *image = 0;          PamTrack *image = 0;
432    
# Line 382  PamTrack *PamLevel2::GetTrackImage(int i Line 455  PamTrack *PamLevel2::GetTrackImage(int i
455   * @param detlist String to select trees to be included   * @param detlist String to select trees to be included
456   * @return Pointer to a TTree   * @return Pointer to a TTree
457   */   */
458  TTree *PamLevel2::LoadPamTrees(TFile *f, TString detlist="+ALL"){  TTree *PamLevel2::GetPamTree(TFile *f, TString detlist="+ALL"){
459        
460      TTree *Tout =0;  //      cout << "WARNING!!! -- obsolete method -- \n";
461            //      cout << "better use TChain *PamLevel2::GetPamTree(TList*, TString) \n";
         SetWhichTrees(detlist);  
462                    
463      // Tracker      TTree *Trout =0;
464        
465        SetWhichTrees(detlist);
466    // Tracker
467      TTree *T = (TTree*)f->Get("Tracker");      TTree *T = (TTree*)f->Get("Tracker");
468      if(T && TRK) {      if(T && TRK) {
469          T->SetBranchAddress("TrkLevel2", GetPointerToTrk());          if(TRK_L1){
470          cout << "Tracker      : set branch address TrkLevel2"<<endl;              T->SetBranchAddress("TrkLevel1", GetPointerToTrk(1));
471          if(!Tout)Tout=T;              cout << "Tracker      : set branch address TrkLevel1"<<endl;
472            };
473            T->SetBranchAddress("TrkLevel2", GetPointerToTrk(2));
474            cout << "Tracker      : set branch address TrkLevel2"<<endl;
475            Trout=T;
476      }else{      }else{
477          cout << "Tracker      : missing tree"<<endl;          cout << "Tracker      : missing tree"<<endl;
478      };      };
# Line 402  TTree *PamLevel2::LoadPamTrees(TFile *f, Line 481  TTree *PamLevel2::LoadPamTrees(TFile *f,
481      if(C && CAL) {      if(C && CAL) {
482          C->SetBranchAddress("CaloLevel2", GetPointerToCalo());          C->SetBranchAddress("CaloLevel2", GetPointerToCalo());
483          cout << "Calorimeter  : set branch address CaloLevel2"<<endl;          cout << "Calorimeter  : set branch address CaloLevel2"<<endl;
484          if(!Tout)Tout=C;          if(!Trout)Trout=C;
485          else Tout->AddFriend(C);          else Trout->AddFriend(C);
486      }else{      }else{
487          cout << "Calorimeter  : missing tree"<<endl;          cout << "Calorimeter  : missing tree"<<endl;
488      };      };
# Line 412  TTree *PamLevel2::LoadPamTrees(TFile *f, Line 491  TTree *PamLevel2::LoadPamTrees(TFile *f,
491      if(O && TOF) {      if(O && TOF) {
492          O->SetBranchAddress("ToFLevel2", GetPointerToToF());          O->SetBranchAddress("ToFLevel2", GetPointerToToF());
493          cout << "ToF          : set branch address ToFLevel2"<<endl;          cout << "ToF          : set branch address ToFLevel2"<<endl;
494          if(!Tout)Tout=O;          if(!Trout)Trout=O;
495          else Tout->AddFriend(O);          else Trout->AddFriend(O);
496      }else{      }else{
497          cout << "ToF         : missing tree"<<endl;          cout << "ToF         : missing tree"<<endl;
498      };      };
# Line 422  TTree *PamLevel2::LoadPamTrees(TFile *f, Line 501  TTree *PamLevel2::LoadPamTrees(TFile *f,
501      if(R && TRG) {      if(R && TRG) {
502          R->SetBranchAddress("TrigLevel2", GetPointerToTrig());          R->SetBranchAddress("TrigLevel2", GetPointerToTrig());
503          cout << "Trigger      : set branch address TrigLevel2"<<endl;          cout << "Trigger      : set branch address TrigLevel2"<<endl;
504          if(!Tout)Tout=O;          if(!Trout)Trout=O;
505          else Tout->AddFriend(R);          else Trout->AddFriend(R);
506      }else{      }else{
507          cout << "Trigger      : missing tree"<<endl;          cout << "Trigger      : missing tree"<<endl;
508      };      };
# Line 432  TTree *PamLevel2::LoadPamTrees(TFile *f, Line 511  TTree *PamLevel2::LoadPamTrees(TFile *f,
511      if(S && S4) {      if(S && S4) {
512          S->SetBranchAddress("S4Level2", GetPointerToS4());          S->SetBranchAddress("S4Level2", GetPointerToS4());
513          cout << "S4           : set branch address S4Level2"<<endl;          cout << "S4           : set branch address S4Level2"<<endl;
514          if(!Tout)Tout=O;          if(!Trout)Trout=O;
515          else Tout->AddFriend(S);          else Trout->AddFriend(S);
516      }else{      }else{
517          cout << "S4           : missing tree"<<endl;          cout << "S4           : missing tree"<<endl;
518      };      };
# Line 442  TTree *PamLevel2::LoadPamTrees(TFile *f, Line 521  TTree *PamLevel2::LoadPamTrees(TFile *f,
521      if(N && ND) {      if(N && ND) {
522          N->SetBranchAddress("NDLevel2", GetPointerToND());          N->SetBranchAddress("NDLevel2", GetPointerToND());
523          cout << "NeutronD     : set branch address NDLevel2"<<endl;          cout << "NeutronD     : set branch address NDLevel2"<<endl;
524          if(!Tout)Tout=O;          if(!Trout)Trout=O;
525          else Tout->AddFriend(N);          else Trout->AddFriend(N);
526      }else{      }else{
527          cout << "NeutronD     : missing tree"<<endl;          cout << "NeutronD     : missing tree"<<endl;
528      };      };
# Line 452  TTree *PamLevel2::LoadPamTrees(TFile *f, Line 531  TTree *PamLevel2::LoadPamTrees(TFile *f,
531      if(A && AC) {      if(A && AC) {
532          A->SetBranchAddress("AcLevel2", GetPointerToAc());          A->SetBranchAddress("AcLevel2", GetPointerToAc());
533          cout << "Anticounter  : set branch address AcLevel2"<<endl;          cout << "Anticounter  : set branch address AcLevel2"<<endl;
534          if(!Tout)Tout=O;          if(!Trout)Trout=O;
535          else Tout->AddFriend(A);          else Trout->AddFriend(A);
536      }else{      }else{
537          cout << "Anticounter  : missing tree"<<endl;          cout << "Anticounter  : missing tree"<<endl;
538      };      };
# Line 462  TTree *PamLevel2::LoadPamTrees(TFile *f, Line 541  TTree *PamLevel2::LoadPamTrees(TFile *f,
541          if(B && ORB) {          if(B && ORB) {
542                  B->SetBranchAddress("OrbitalInfo", GetPointerToOrb());                  B->SetBranchAddress("OrbitalInfo", GetPointerToOrb());
543                  cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;                  cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;
544                  if(!Tout)Tout=O;                  if(!Trout)Trout=O;
545                  else Tout->AddFriend(B);                  else Trout->AddFriend(B);
546          }else{          }else{
547                  cout << "OrbitalInfo  : missing tree"<<endl;                  cout << "OrbitalInfo  : missing tree"<<endl;
548          };          };
549            
550      return Tout;          cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl;
       
 }  
 //--------------------------------------  
 //  
 //  
 //--------------------------------------  
 /**  
  * Get all the Pamela detector trees in a single file and make them friends.  
  * @param f TFile pointer  
  * @return Pointer to a TTree  
  */  
 TTree *PamLevel2::LoadPamTrees(TFile *f){  
       
         TTree *Tout =0;  
551                    
552          SetWhichTrees("+ALL");          return Trout;
           
     // Tracker  
         TTree *T = (TTree*)f->Get("Tracker");  
         if(T && TRK) {  
                 T->SetBranchAddress("TrkLevel2", GetPointerToTrk());  
                 cout << "Tracker      : set branch address TrkLevel2"<<endl;  
                 if(!Tout)Tout=T;  
         }else{  
                 cout << "Tracker      : missing tree"<<endl;  
         };  
     // Calorimeter  
         TTree *C = (TTree*)f->Get("Calorimeter");  
         if(C && CAL) {  
                 C->SetBranchAddress("CaloLevel2", GetPointerToCalo());  
                 cout << "Calorimeter  : set branch address CaloLevel2"<<endl;  
                 if(!Tout)Tout=C;  
                 else Tout->AddFriend(C);  
         }else{  
                 cout << "Calorimeter  : missing tree"<<endl;  
         };  
     // ToF      
         TTree *O = (TTree*)f->Get("ToF");  
         if(O && TOF) {  
                 O->SetBranchAddress("ToFLevel2", GetPointerToToF());  
                 cout << "ToF          : set branch address ToFLevel2"<<endl;  
                 if(!Tout)Tout=O;  
                 else Tout->AddFriend(O);  
         }else{  
                 cout << "ToF         : missing tree"<<endl;  
         };  
     // Trigger  
         TTree *R = (TTree*)f->Get("Trigger");  
         if(R && TRG) {  
                 R->SetBranchAddress("TrigLevel2", GetPointerToTrig());  
                 cout << "Trigger      : set branch address TrigLevel2"<<endl;  
                 if(!Tout)Tout=O;  
                 else Tout->AddFriend(R);  
         }else{  
                 cout << "Trigger      : missing tree"<<endl;  
         };  
     // S4  
         TTree *S = (TTree*)f->Get("S4");  
         if(S && S4) {  
                 S->SetBranchAddress("S4Level2", GetPointerToS4());  
                 cout << "S4           : set branch address S4Level2"<<endl;  
                 if(!Tout)Tout=O;  
                 else Tout->AddFriend(S);  
         }else{  
                 cout << "S4           : missing tree"<<endl;  
         };  
     // Neutron Detector  
         TTree *N = (TTree*)f->Get("NeutronD");  
         if(N && ND) {  
                 N->SetBranchAddress("NDLevel2", GetPointerToND());  
                 cout << "NeutronD     : set branch address NDLevel2"<<endl;  
                 if(!Tout)Tout=O;  
                 else Tout->AddFriend(N);  
         }else{  
                 cout << "NeutronD     : missing tree"<<endl;  
         };  
     // Anticounters  
         TTree *A = (TTree*)f->Get("Anticounter");  
         if(A && AC) {  
                 A->SetBranchAddress("AcLevel2", GetPointerToAc());  
                 cout << "Anticounter  : set branch address AcLevel2"<<endl;  
                 if(!Tout)Tout=O;  
                 else Tout->AddFriend(A);  
         }else{  
                 cout << "Anticounter  : missing tree"<<endl;  
         };  
     // Orbital Info  
         TTree *B = (TTree*)f->Get("OrbitalInfo");  
         if(B && ORB) {  
                 B->SetBranchAddress("OrbitalInfo", GetPointerToOrb());  
                 cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;  
                 if(!Tout)Tout=O;  
                 else Tout->AddFriend(B);  
         }else{  
                 cout << "OrbitalInfo  : missing tree"<<endl;  
         };  
       
         return Tout;  
553            
554  }  }
555  //--------------------------------------  //--------------------------------------
# Line 582  TTree *PamLevel2::LoadPamTrees(TFile *f) Line 565  TTree *PamLevel2::LoadPamTrees(TFile *f)
565   */   */
566  TList*  PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = ""){  TList*  PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = ""){
567                    
568          TString wdir = gSystem->WorkingDirectory();          TString wdir = gSystem->WorkingDirectory();
569        
570        if(ddir=="")ddir = wdir;
571    //      TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);
572        cout << "Level2 data directory : "<<  ddir << endl;
573        
574        TList *contents  = new TList; // create output list
575        contents->SetOwner();
576        
577        char *fullpath;
578        
579        // if no input file list is given:  
580        if ( flisttxt != "" ){
581                    
582          if(ddir=="")ddir = wdir;          if( !gSystem->IsFileInIncludePath(flisttxt,&fullpath) )return 0;
         TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);  
         cout << "Level2 data directory : "<< endl <<  ddir << endl;  
                   
         TList *contents  = new TList; // create output list  
         contents->SetOwner();  
                   
         // if no input file list is given:        
         if ( flisttxt != "" ){  
                   
                 if( !gSystem->ChangeDirectory(ddir) )return 0;  
583                    
584                  flisttxt = gSystem->ConcatFileName(wdir,gSystem->BaseName(flisttxt));  //              flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
585                            flisttxt = fullpath;
586                  cout <<"Input file list : "<< endl << flisttxt <<endl;          
587                  ifstream in;          if( !gSystem->ChangeDirectory(ddir) )return 0;
588                  in.open(flisttxt, ios::in);          
589                  while (1) {          cout <<"Input file list : " << flisttxt <<endl;
590                          TString file;          ifstream in;
591                          in >> file;          in.open(flisttxt, ios::in); //open input file list
592                          if (!in.good()) break;          while (1) {
593                          char *fullpath;              TString file;
594                          if( gSystem->IsFileInIncludePath(file,&fullpath) ){              in >> file;
595                if (!in.good()) break;
596                if( gSystem->IsFileInIncludePath(file,&fullpath) ){
597  //                              contents->Add(new TSystemDirectory(fullpath,ddir)); // add file to the list  //                              contents->Add(new TSystemDirectory(fullpath,ddir)); // add file to the list
598  //                              contents->Add(new TSystemFile(fullpath,ddir)); // add file to the list  //                              contents->Add(new TSystemFile(fullpath,ddir)); // add file to the list
599                                  contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list                  contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list
600                          }else{              }else{
601                                  cout << "warning! --- File "<<file<<" does not exists"<< endl;                  cout << "warning! --- File "<<file<<" does not exists"<< endl;
602                          };              };
603                  };          };
604                  in.close();          in.close();
                   
         }else{  
605                    
606                  cout << "No input file list given."<<endl;      }else{
607                  cout << "Check for existing root files."<<endl;          
608            cout << "No input file list given."<<endl;
609            cout << "Check for existing root files."<<endl;
610  //              cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;  //              cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;
611                            
612                  TList *temp = datadir->GetListOfFiles();          TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);
613            TList *temp = datadir->GetListOfFiles();
614  //              temp->Print();  //              temp->Print();
615  //              cout << "*************************************" << endl;  //              cout << "*************************************" << endl;
                   
                 TIter next(temp);  
                 TSystemFile *questo = 0;  
                   
                   
                 while ( (questo = (TSystemFile*) next()) ) {  
                         TString name =  questo-> GetName();  
                         if( name.EndsWith(".root") ){  
                                 char *fullpath;  
                                 gSystem->IsFileInIncludePath(name,&fullpath);  
                                 contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));  
                         };  
                 }  
                 delete temp;  
616                    
617          };          TIter next(temp);
618          gSystem->ChangeDirectory(wdir);          TSystemFile *questo = 0;
619          cout << endl << "Selected files:" << endl;          
620          contents->Print();          
621          cout << endl;          while ( (questo = (TSystemFile*) next()) ) {
622  //      cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl;              TString name =  questo-> GetName();
623          return contents;              if( name.EndsWith(".root") ){
624                    char *fullpath;
625                    gSystem->IsFileInIncludePath(name,&fullpath);
626                    contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));
627                };
628            }
629            delete temp;
630            delete datadir;
631            
632        };
633        gSystem->ChangeDirectory(wdir); // back to the working directory
634    //      cout << endl << "Selected files:" << endl;
635    //      contents->Print();
636        cout << contents->GetEntries()<<" files selected\n";
637    //      cout << endl;
638    //      cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl;
639        return contents;
640  };  };
641  //--------------------------------------  //--------------------------------------
642  //  //
# Line 658  TList*  PamLevel2::GetListOfLevel2Files( Line 648  TList*  PamLevel2::GetListOfLevel2Files(
648   * @param detlist String to select trees to be included   * @param detlist String to select trees to be included
649   * @return Pointer to a TChain   * @return Pointer to a TChain
650   */   */
651  TChain *PamLevel2::LoadPamTrees(TList *fl, TString detlist="+ALL"){  TChain *PamLevel2::GetPamTree(TList *fl, TString detlist="+ALL"){
652    
653          TChain *Tout=0;  //      TChain *Tout=0;
654                if(Tout)Tout->Delete();
655          SetWhichTrees(detlist);      Tout = NULL;
656                
657          TChain *T = 0;        SetWhichTrees(detlist);
658          TChain *C = 0;      
659          TChain *O = 0;      TChain *T = 0;      
660          TChain *R = 0;      TChain *C = 0;
661          TChain *S = 0;      TChain *O = 0;
662          TChain *N = 0;      TChain *R = 0;
663          TChain *A = 0;      TChain *S = 0;
664          TChain *B = 0;      TChain *N = 0;
665                TChain *A = 0;
666          if(TRK) T = new TChain("Tracker");            TChain *B = 0;
667          if(CAL) C = new TChain("Calorimeter");      
668          if(TOF) O = new TChain("ToF");      if(TRK) T = new TChain("Tracker");  
669          if(TRG) R = new TChain("Trigger");      if(CAL) C = new TChain("Calorimeter");
670          if(S4)  S = new TChain("S4");      if(TOF) O = new TChain("ToF");
671          if(ND)  N = new TChain("NeutronD");      if(TRG) R = new TChain("Trigger");
672          if(AC)  A = new TChain("Anticounter");      if(S4)  S = new TChain("S4");
673          if(ORB) B = new TChain("OrbitalInfo");      if(ND)  N = new TChain("NeutronD");
674                if(AC)  A = new TChain("Anticounter");
675          // loop over files and create chains          if(ORB) B = new TChain("OrbitalInfo");
676          TIter next(fl);      
677          TSystemFile *questo = 0;      // loop over files and create chains        
678          while ( (questo = (TSystemFile*) next()) ) {      TIter next(fl);
679                  TString name =  questo->GetName();      TSystemFile *questo = 0;
680        while ( (questo = (TSystemFile*) next()) ) {
681            TString name =  questo->GetName();
682  //              cout << "File: "<< name << endl;  //              cout << "File: "<< name << endl;
683                  if( CheckLevel2File(name) ){          if( CheckLevel2File(name) ){
684                          if(TRK) T->Add(name);              if(TRK) T->Add(name);
685                          if(CAL) C->Add(name);              if(CAL) C->Add(name);
686                          if(TOF) O->Add(name);              if(TOF) O->Add(name);
687                          if(TRG) R->Add(name);              if(TRG) R->Add(name);
688                          if(S4)  S->Add(name);              if(S4)  S->Add(name);
689                          if(ND)  N->Add(name);              if(ND)  N->Add(name);
690                          if(AC)  A->Add(name);              if(AC)  A->Add(name);
691                          if(ORB) B->Add(name);              if(ORB) B->Add(name);
                 };  
         }  
           
     // Tracker  
         if(TRK) {  
                 T->SetBranchAddress("TrkLevel2", GetPointerToTrk());  
                 cout << "Tracker      : set branch address TrkLevel2"<<endl;  
                 if(!Tout)Tout=T;  
692          };          };
693        }
694            
695          // Calorimeter      cout << "done chain \n";
696          if(CAL) {  
697                  C->SetBranchAddress("CaloLevel2", GetPointerToCalo());      // Tracker
698                  cout << "Calorimeter  : set branch address CaloLevel2"<<endl;      if(TRK) if(!Tout)Tout=T;
699                  if(!Tout)Tout=C;      // Calorimeter
700                  else Tout->AddFriend("Calorimeter");      if(CAL) {          
701          };          if(!Tout)Tout=C;
702                    else Tout->AddFriend("Calorimeter");
703        };
704      // ToF          // ToF    
705          if(TOF) {      if(TOF) {
706                  O->SetBranchAddress("ToFLevel2", GetPointerToToF());          if(!Tout)Tout=O;
707                  cout << "ToF          : set branch address ToFLevel2"<<endl;          else Tout->AddFriend("ToF");
708                  if(!Tout)Tout=O;      };
                 else Tout->AddFriend("ToF");  
         };  
709      // Trigger      // Trigger
710          if(TRG) {      if(TRG) {
711                  R->SetBranchAddress("TrigLevel2", GetPointerToTrig());          if(!Tout)Tout=O;
712                  cout << "Trigger      : set branch address TrigLevel2"<<endl;          else Tout->AddFriend("Trigger");
713                  if(!Tout)Tout=O;      };
                 else Tout->AddFriend("Trigger");  
         };  
714      // S4      // S4
715          if(S4) {      if(S4) {
716                  S->SetBranchAddress("S4Level2", GetPointerToS4());          if(!Tout)Tout=O;
717                  cout << "S4           : set branch address S4Level2"<<endl;          else Tout->AddFriend("S4");
718                  if(!Tout)Tout=O;      };
                 else Tout->AddFriend("S4");  
         };  
719      // Neutron Detector      // Neutron Detector
720          if(ND) {      if(ND) {
721                  N->SetBranchAddress("NDLevel2", GetPointerToND());          if(!Tout)Tout=O;
722                  cout << "NeutronD     : set branch address NDLevel2"<<endl;          else Tout->AddFriend("NeutronD");
723                  if(!Tout)Tout=O;      };
                 else Tout->AddFriend("NeutronD");  
         };  
724      // Anticounters      // Anticounters
725          if(AC) {      if(AC) {
726                  A->SetBranchAddress("AcLevel2", GetPointerToAc());          if(!Tout)Tout=O;
727                  cout << "Anticounter  : set branch address AcLevel2"<<endl;          else Tout->AddFriend("Anticounter");
728                  if(!Tout)Tout=O;      };
729                  else Tout->AddFriend("Anticounter");      // OrbitalInfo
730        if(ORB) {
731            if(!Tout)Tout=O;
732            else Tout->AddFriend("OrbitalInfo");
733        };
734        
735    //    cout<<endl<<" Number of entries: "<<Tout->GetEntries()<<endl<<endl;
736        
737        if( Tout->GetEntries() )PamLevel2::SetBranchAddress();
738        
739        return Tout;
740    }
741    //--------------------------------------
742    //
743    //
744    //--------------------------------------
745    /**
746     * Set branch addresses for Pamela friend trees
747     */
748    void PamLevel2::SetBranchAddress(){
749        // Tracker
750        if(TRK) {
751            if(TRK_L1){
752                Tout->SetBranchAddress("TrkLevel1", GetPointerToTrk(1));
753                cout << "Tracker      : set branch address TrkLevel1"<<endl;
754          };          };
755            Tout->SetBranchAddress("TrkLevel2", GetPointerToTrk(2));
756            cout << "Tracker      : set branch address TrkLevel2"<<endl;
757        };
758        
759        // Calorimeter
760        if(CAL) {
761            Tout->SetBranchAddress("CaloLevel2", GetPointerToCalo());
762            cout << "Calorimeter  : set branch address CaloLevel2"<<endl;
763        };
764        
765        // ToF    
766        if(TOF) {
767            Tout->SetBranchAddress("ToFLevel2", GetPointerToToF());
768            cout << "ToF          : set branch address ToFLevel2"<<endl;
769        };
770        // Trigger
771        if(TRG) {
772            Tout->SetBranchAddress("TrigLevel2", GetPointerToTrig());
773            cout << "Trigger      : set branch address TrigLevel2"<<endl;
774        };
775        // S4
776        if(S4) {
777            Tout->SetBranchAddress("S4Level2", GetPointerToS4());
778            cout << "S4           : set branch address S4Level2"<<endl;
779        };
780        // Neutron Detector
781        if(ND) {
782            Tout->SetBranchAddress("NDLevel2", GetPointerToND());
783            cout << "NeutronD     : set branch address NDLevel2"<<endl;
784        };
785        // Anticounters
786        if(AC) {
787            Tout->SetBranchAddress("AcLevel2", GetPointerToAc());
788            cout << "Anticounter  : set branch address AcLevel2"<<endl;
789        };
790      // OrbitalInfo      // OrbitalInfo
791          if(ORB) {      if(ORB) {
792                  B->SetBranchAddress("OrbitalInfo", GetPointerToOrb());          Tout->SetBranchAddress("OrbitalInfo", GetPointerToOrb());
793                  cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;          cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl;
794                  if(!Tout)Tout=O;      };
795                  else Tout->AddFriend("OrbitalInfo");      
796    }
797    
798    //--------------------------------------
799    //
800    //
801    //--------------------------------------
802    void *PamLevel2::GetPointerTo(const char* c ){
803    //      cout << "objname "<< objname << endl;
804        TString objname = c;
805        if(!objname.CompareTo("TrkLevel1"))return &trk_l1_obj;
806        if(!objname.CompareTo("TrkLevel2"))return &trk_obj;
807        
808        return NULL;
809    };
810    //--------------------------------------
811    //
812    //
813    //--------------------------------------
814    /**
815     * Get the Run tree chain from a list of files.
816     * @param fl Pointer to a TList of TSystemFiles
817     * @return Pointer to a TChain
818     */
819    TChain *PamLevel2::GetRunTree(TList *fl){
820            
821        TChain *R = new TChain("Run");
822        
823        // loop over files and create chains        
824        TIter next(fl);
825        TSystemFile *questo = 0;
826        while ( (questo = (TSystemFile*) next()) ) {
827            TString name =  questo->GetName();
828    //              cout << "File: "<< name << endl;
829            if( CheckLevel2File(name) ){
830                R->Add(name);
831          };          };
832        }
833        
834        R->SetBranchAddress("RunInfo", GetPointerToRun());
835        cout << "Run         : set branch address RunInfo"<<endl;
836            
837          return Tout;      return R;
838        
839    }
840    //--------------------------------------
841    //
842    //
843    //--------------------------------------
844    /**
845     * Get the Run tree  from a file.
846     * @param f Pointer to a TFile
847     * @return Pointer to a TTree
848     */
849    TTree *PamLevel2::GetRunTree(TFile *f){
850    
851    
852        TTree *R = (TTree*)f->Get("Run");
853        
854        R->SetBranchAddress("RunInfo", GetPointerToRun());
855        cout << "Run         : set branch address RunInfo"<<endl;
856        
857        return R;
858            
859  }  }
860  //--------------------------------------  //--------------------------------------
# Line 771  TChain *PamLevel2::LoadPamTrees(TList *f Line 867  TChain *PamLevel2::LoadPamTrees(TList *f
867  */  */
868  void PamLevel2::SetWhichTrees(TString detlist){  void PamLevel2::SetWhichTrees(TString detlist){
869                    
870          if(detlist.Contains("+ALL", TString::kIgnoreCase)){      if(detlist.Contains("+ALL", TString::kIgnoreCase)){
871                  CAL = true;          CAL = true;
872                  TRK = true;          TRK = true;
873                  TRG = true;          TRK_L1 = false;
874                  TOF = true;          TRG = true;
875                  S4  = true;          TOF = true;
876                  ND  = true;          S4  = true;
877                  AC  = true;          ND  = true;
878                  ORB = true;          AC  = true;
879          }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){          ORB = true;
880                  CAL = false;      }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){
881                  TRK = false;          CAL = false;
882                  TRG = false;          TRK = false;
883                  TOF = false;          TRK_L1 = false;
884                  S4  = false;          TRG = false;
885                  ND  = false;          TOF = false;
886                  AC  = false;          S4  = false;
887                  ORB = false;          ND  = false;
888          };          AC  = false;
889                    ORB = false;
890          if( detlist.Contains("-CAL", TString::kIgnoreCase) )CAL = false;      };
891          else if( detlist.Contains("+CAL", TString::kIgnoreCase) )CAL = true;      
892                if( detlist.Contains("-CAL", TString::kIgnoreCase) )CAL = false;
893          if( detlist.Contains("-TRK", TString::kIgnoreCase) )TRK = false;      else if( detlist.Contains("+CAL", TString::kIgnoreCase) )CAL = true;
894          else if( detlist.Contains("+TRK", TString::kIgnoreCase) )TRK = true;      
895                if( detlist.Contains("-TRK", TString::kIgnoreCase) )TRK = false;
896          if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false;      else if( detlist.Contains("+TRK", TString::kIgnoreCase) )TRK = true;
897          else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true;      
898                if( detlist.Contains("-TRK1", TString::kIgnoreCase) )TRK_L1 = false;
899          if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false;      else if( detlist.Contains("+TRK1", TString::kIgnoreCase) )TRK_L1 = true;
900          else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true;      
901                if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false;
902          if( detlist.Contains("-S4",  TString::kIgnoreCase) )S4  = false;      else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true;
903          else if( detlist.Contains("+S4",  TString::kIgnoreCase) )S4  = true;      
904                if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false;
905          if( detlist.Contains("-ND",  TString::kIgnoreCase) )ND  = false;      else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true;
906          else if( detlist.Contains("+ND",  TString::kIgnoreCase) )ND  = true;      
907                if( detlist.Contains("-S4",  TString::kIgnoreCase) )S4  = false;
908          if( detlist.Contains("-AC",  TString::kIgnoreCase) )AC  = false;      else if( detlist.Contains("+S4",  TString::kIgnoreCase) )S4  = true;
909          else if( detlist.Contains("+AC",  TString::kIgnoreCase) )AC  = true;      
910                if( detlist.Contains("-ND",  TString::kIgnoreCase) )ND  = false;
911          if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false;      else if( detlist.Contains("+ND",  TString::kIgnoreCase) )ND  = true;
912          else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true;      
913                if( detlist.Contains("-AC",  TString::kIgnoreCase) )AC  = false;
914        else if( detlist.Contains("+AC",  TString::kIgnoreCase) )AC  = true;
915        
916        if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false;
917        else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true;
918        
919  };  };
920  //--------------------------------------  //--------------------------------------
921  //  //
# Line 823  void PamLevel2::SetWhichTrees(TString de Line 924  void PamLevel2::SetWhichTrees(TString de
924  /**  /**
925   * Check if a file contains selected Pamela Level2 trees.   * Check if a file contains selected Pamela Level2 trees.
926   * @param name File name   * @param name File name
927   * @return Pointer to a TChain   * @return true if the file is ok.
928   */   */
929  Bool_t  PamLevel2::CheckLevel2File(TString name){  Bool_t  PamLevel2::CheckLevel2File(TString name){
930                    
931          Bool_t CAL__ok = false;      Bool_t CAL__ok = false;    
932          Bool_t TRK__ok = false;      Bool_t TRK__ok = false;    
933          Bool_t TRG__ok = false;      Bool_t TRK_L1__ok = false;    
934          Bool_t TOF__ok = false;      Bool_t TRG__ok = false;    
935          Bool_t S4__ok  = false;      Bool_t TOF__ok = false;    
936          Bool_t ND__ok  = false;      Bool_t S4__ok  = false;    
937          Bool_t AC__ok  = false;      Bool_t ND__ok  = false;    
938          Bool_t ORB__ok = false;      Bool_t AC__ok  = false;    
939                Bool_t ORB__ok = false;    
940          Bool_t RUN__ok = false;      
941                Bool_t RUN__ok = false;
942          TFile *f = new TFile(name.Data());      
943          TList *lk = f->GetListOfKeys();  //    cout << "Checking file: "<<name<<endl;
944        TFile *f = new TFile(name.Data());
945        if( !f || f->IsZombie() ){
946            cout << "File: "<< f->GetName() <<" discarded ---- Non valid root file"<< endl; return false;
947        }
948        //   cout << "Get list of keys: "<<f<<endl;
949        TList *lk = f->GetListOfKeys();
950  //      lk->Print();  //      lk->Print();
951          TIter next(lk);      TIter next(lk);
952          TKey *key =0;      TKey *key =0;
953          while( (key = (TKey*)next()) ){      Int_t nev =0;
954  //              cout << key->GetName() << endl;      Int_t nev_previous =0;
955                  if( !strcmp(key->GetName(),"Calorimeter") )CAL__ok = true;      while( (key = (TKey*)next()) ){
956                  if( !strcmp(key->GetName(),"Tracker"    ) )TRK__ok = true;          
957                  if( !strcmp(key->GetName(),"Trigger"    ) )TRG__ok = true;          nev_previous = nev;
958                  if( !strcmp(key->GetName(),"ToF"        ) )TOF__ok = true;          nev = ((TTree*)f->Get(key->GetName()))->GetEntries();
959                  if( !strcmp(key->GetName(),"S4"         ) )S4__ok = true;          if( key->GetClassName()=="TTree" && nev_previous && nev != nev_previous ){
960                  if( !strcmp(key->GetName(),"NeutronD"   ) )ND__ok = true;              cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<<nev<<" "<<nev_previous<< endl;
961                  if( !strcmp(key->GetName(),"Anticounter") )AC__ok = true;              return false;
962                  if( !strcmp(key->GetName(),"OrbitalInfo") )ORB__ok = true;          };
963                  if( !strcmp(key->GetName(),"Run"        ) )RUN__ok = true;  
964            if( !strcmp(key->GetName(),"Calorimeter") )CAL__ok = true;
965            if( !strcmp(key->GetName(),"Trigger"    ) )TRG__ok = true;
966            if( !strcmp(key->GetName(),"ToF"        ) )TOF__ok = true;
967            if( !strcmp(key->GetName(),"S4"         ) )S4__ok = true;
968            if( !strcmp(key->GetName(),"NeutronD"   ) )ND__ok = true;
969            if( !strcmp(key->GetName(),"Anticounter") )AC__ok = true;
970            if( !strcmp(key->GetName(),"OrbitalInfo") )ORB__ok = true;
971            if( !strcmp(key->GetName(),"Run"        ) )RUN__ok = true;      
972            if( !strcmp(key->GetName(),"Tracker"    ) ){
973                TRK__ok = true;
974                TTree *T = (TTree*)f->Get("Tracker");
975                for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){
976                    TString name = T->GetListOfBranches()->At(i)->GetName();
977                    if( !name.CompareTo("TrkLevel1") )TRK_L1__ok=true;
978                };
979          };          };
                   
         lk->Delete();  
         f->Close();  
980                    
981          Bool_t FLAG = true;      };
982          if(!RUN__ok) {      
983                  cout << "File: "<< f->GetName() <<" discarded ---- Missing RunInfo tree"<< endl;      lk->Delete();
984                  FLAG = false;      f->Close();
985          };      
986          if(CAL && !CAL__ok){      Bool_t FLAG = true;
987                  cout << "File: "<< f->GetName() <<" discarded ---- Missing Calorimeter tree"<< endl;      if(!RUN__ok) {
988                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing RunInfo tree"<< endl; return false;
989          };  //      FLAG = false;
990          if(TRK && !TRK__ok){      };
991                  cout << "File: "<< f->GetName() <<" discarded ---- Missing Tracker tree"<< endl;      if(CAL && !CAL__ok){
992                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing Calorimeter tree"<< endl; return false;
993          };  //      FLAG = false;
994          if(TRG && !TRG__ok){      };
995                  cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl;      if(TRK && !TRK__ok){
996                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing Tracker tree"<< endl; return false;
997          };  //      FLAG = false;
998          if(TOF && !TOF__ok){      };
999                  cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl;      if(TRK_L1 && !TRK_L1__ok){
1000                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing Tracker Level1 Branch"<< endl; return false;
1001          };  //      FLAG = false;
1002          if(S4 && !S4__ok){      };
1003                  cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl;      if(TRG && !TRG__ok){
1004                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl; return false;
1005          };  //      FLAG = false;
1006          if(ND && !ND__ok){      };
1007                  cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl;      if(TOF && !TOF__ok){
1008                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl; return false;
1009          };  //      FLAG = false;
1010          if(AC && !AC__ok){      };
1011                  cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl;      if(S4 && !S4__ok){
1012                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl; return false;
1013          };  //      FLAG = false;
1014          if(ORB && !ORB__ok){      };
1015                  cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl;      if(ND && !ND__ok){
1016                  FLAG = false;          cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl; return false;
1017          };  //      FLAG = false;
1018                };
1019          return FLAG;      if(AC && !AC__ok){
1020            cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl; return false;
1021    //      FLAG = false;
1022        };
1023        if(ORB && !ORB__ok){
1024            cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl; return false;
1025    //      FLAG = false;
1026        };
1027        
1028        return FLAG;
1029                    
1030  };  };
1031    

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.6

  ViewVC Help
Powered by ViewVC 1.1.23