/[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.2 by pam-fi, Fri Aug 4 13:31:35 2006 UTC revision 1.6 by pam-fi, Tue Oct 24 10:24:27 2006 UTC
# Line 24  PamTrack::PamTrack(TrkTrack* t, CaloTrkV Line 24  PamTrack::PamTrack(TrkTrack* t, CaloTrkV
24      tof_track  = this->ToFTrkVar::GetToFTrkVar();      tof_track  = this->ToFTrkVar::GetToFTrkVar();
25      if(t) *trk_track  = *t;      if(t) *trk_track  = *t;
26      if(c) *calo_track = *c;      if(c) *calo_track = *c;
27      if(o) *tof_track  = *o;      if(o) *tof_track  = *o;    
28  };  };
29    
30  //--------------------------------------  //--------------------------------------
# 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          delete sorted_tracks;      TrkLevel1::Clear();
72        
73        TrkLevel2::Clear();
74        CaloLevel2::Clear();
75        ToFLevel2::Clear();
76        TrigLevel2::Clear();
77        S4Level2::Clear();
78        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        if(Tout)Tout->Delete(); // delete loaded tree from memory
88                    
89  };  };
90  /**  /**
91   * Clear the event   * Clear the event
92   */   */
93  void PamLevel2::Clear(){  void PamLevel2::Clear(){
                   
         sorted_tracks->Delete();  
94                    
95        TrkLevel1::Clear();
96            
97        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 80  void PamLevel2::Clear(){ Line 113  void PamLevel2::Clear(){
113  //  //
114  //--------------------------------------  //--------------------------------------
115  /**  /**
116     * Retrieves the calorimeter track matching the seqno-th tracker stored track.
117     * (If seqno = -1 retrieves the self-trigger calorimeter track)
118     */
119     CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){
120            
121         if( CaloLevel2::ntrk()==0 ){
122             cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no Calorimeter tracks are stored"<<endl;
123             return NULL;
124         };
125        
126         CaloTrkVar *c = 0;
127         Int_t it_calo=0;
128        
129         do{
130             c = CaloLevel2::GetCaloTrkVar(it_calo);
131             it_calo++;
132         } while( c && seqno != c->trkseqno && it_calo < CaloLevel2::ntrk());      
133        
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     //
143     //
144    //--------------------------------------
145    /**
146      * Retrieves the ToF track matching the seqno-th tracker stored track.
147      * (If seqno = -1 retrieves the tracker-independent tof track)
148     */
149     ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno){
150            
151         if( ToFLevel2::ntrk()==0 ){
152             cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no ToF tracks are stored"<<endl;
153             return NULL;
154         };
155        
156         ToFTrkVar *c = 0;
157         Int_t it_tof=0;
158        
159         do{
160             c = ToFLevel2::GetToFTrkVar(it_tof);
161             it_tof++;
162         } while( c && seqno != c->trkseqno && it_tof < ToFLevel2::ntrk());
163        
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    //--------------------------------------
173     //
174     //
175    //--------------------------------------
176    /**
177     * Give the pamela track associated to a tracker track, retrieving related calorimeter and tof track information.
178     */
179     PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t){
180            
181         CaloTrkVar *c = 0;
182         ToFTrkVar  *o = 0;
183        
184         if(CAL) c = GetCaloStoredTrack(t->GetSeqNo());
185         if(TOF) o = GetToFStoredTrack(t->GetSeqNo());
186        
187    //    if(t && c && o)track = new PamTrack(t,c,o);
188         PamTrack *track = new PamTrack(t,c,o);
189        
190         return track;
191    
192     };
193    //--------------------------------------
194    //
195    //
196    //--------------------------------------
197    /**
198   * Retrieves the it-th stored track.   * Retrieves the it-th stored track.
199   * It override TrkLevel2::GetTrack(int it).   * It override TrkLevel2::GetTrack(int it).
200   * @param itrk Track number, ranging from 0 to GetNTracks().   * @param itrk Track number, ranging from 0 to GetNTracks().
# Line 87  void PamLevel2::Clear(){ Line 202  void PamLevel2::Clear(){
202    
203  PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){  PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){
204            
     TrkTrack   *t = 0;  
     CaloTrkVar *c = 0;  
     ToFTrkVar  *o = 0;  
   
     if( itrk >=0 && itrk < TrkLevel2::ntrk() ){  
                 t = TrkLevel2::GetStoredTrack(itrk);  
 /*              c = CaloLevel2::GetCaloTrkVar(t->GetSeqNo());  
                 o = ToFLevel2::GetToFTrkVar(t->GetSeqNo()); */  
                 Int_t it_calo=0;  
                 do{  
                         c = CaloLevel2::GetCaloTrkVar(it_calo);  
                         it_calo++;  
                 } while(t->GetSeqNo() != c->trkseqno && it_calo < CaloLevel2::ntrk());    
                 if( t->GetSeqNo() != c->trkseqno )cout << "PamLevel2::GetStoredTrack(int) : tracker SeqNo "<< t->GetSeqNo() <<" does not match Calorimeter SeqNo"<< c->trkseqno<<endl;  
                   
                 Int_t it_tof=0;  
                 do{  
                         o = ToFLevel2::GetToFTrkVar(it_tof);  
                         it_tof++;  
                 } while(t->GetSeqNo() != o->trkseqno && it_tof < ToFLevel2::ntrk());      
                 if( t->GetSeqNo() != o->trkseqno )cout << "PamLevel2::GetStoredTrack(int) : tracker SeqNo "<< t->GetSeqNo() <<" does not match ToF SeqNo "<< o->trkseqno <<endl;  
                   
         }else{  
                 cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;  
         };  
   
     // hence create a "PamTrack" object  
205      PamTrack *track = 0;      PamTrack *track = 0;
206      if(t && c && o)track = new PamTrack(t,c,o);      
207      return track;      if( itrk >=0 && itrk < TrkLevel2::ntrk() ){
208            
209            TrkTrack *t = TrkLevel2::GetStoredTrack(itrk);
210            track = GetPamTrackAlong(t);
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  //  //
221  //  //
222  //--------------------------------------  //--------------------------------------
223  /**  /**
224   * Sort physical (tracker) tracks and stores them in a TObjectArray (of TrkTrack objects).   * Sort physical (tracker) tracks and stores them in the TRefArray (of TrkTrack objects) which pointer is  PamLevel2::sorted_tracks.
225   * The total number of physical tracks is given by GetNTracks() and the it-th physical track can be retrieved by means of the method GetTrack(int it).   * @param how String to set the sorting cryterium (es: "CAL" or "TRK+CAL+TOF" ecc...).
226     * Sorting cryteria:
227     * TRK: lower chi**2
228     * CAL: lower Y spatial residual on the first calorimeter plane
229     * TOF: bigger numebr of hit PMTs along the track, on S12 S21 S32 (where paddles are along the Y axis).
230     * The default sorting cryterium is "TOF+CAL".
231     *
232     * 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).
233   */   */
234  void PamLevel2::SortTracks(){  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          for(Int_t i=0; i < TrkLevel2::GetNTracks(); i++){      Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase);
243        Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase);
244                  TrkTrack *ts = 0;      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            
258          // get tracker tracks          // get tracker tracks
259                  TrkTrack   *tp = TrkLevel2::GetTrack(i);                    //tracker          TrkTrack   *tp = TrkLevel2::GetTrack(i);                    //tracker
260                  CaloTrkVar *cp = CaloLevel2::GetCaloTrkVar(tp->GetSeqNo()); //calorimeter  //              CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo());
261                  ToFTrkVar  *op = ToFLevel2::GetToFTrkVar(tp->GetSeqNo());   //tof  //              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                          TrkTrack   *ti = TrkLevel2::GetTrackImage(i);              //tracker (image)              
268                          CaloTrkVar *ci = CaloLevel2::GetCaloTrkVar(ti->GetSeqNo());//calorimeter (image)              TrkTrack   *ti = TrkLevel2::GetTrackImage(i);              //tracker (image)
269                          ToFTrkVar  *oi = ToFLevel2::GetToFTrkVar(ti->GetSeqNo());  //tof (image)  //                      CaloTrkVar *ci = GetCaloStoredTrack(ti->GetSeqNo());
270    //                      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 = 1;  //"principal" 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                          if(              // check the Y spatial residual on the first calorimeter plane
282                                                  npcfit[1] > 3   &&  //no. of fit planes on Y view              // (cut on calorimeter variables from Emiliano)
283  //              varcfit[1] < 50.&&  //fit variance on Y view              if(
284                                                  true){                  use_CAL            &&
285                    npcfit[1] > 15     &&   //no. of fit planes on Y view
286                                  Float_t resy_p = cp->tbar[0][1] - cbar[0][1];if(resy_p < 0)resy_p= - resy_p;                  varcfit[1] < 1000. &&  //fit variance on Y view
287                                  Float_t resy_i = ci->tbar[0][1] - cbar[0][1];if(resy_i < 0)resy_i= - resy_i;                  true){
288                    
289                                  if(resy_p <= resy_i) tp_score++;                  cp = GetCaloStoredTrack(tp->GetSeqNo());
290                                  else                 ti_score++;                  ci = GetCaloStoredTrack(ti->GetSeqNo());
291                          };                  
292                    Float_t resy_p = cp->tbar[0][1] - cbar[0][1]; if(resy_p < 0)resy_p= - resy_p;
293                    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
302                // on S12 S21 and S32, where paddles are parallel to Y axis
303                if( use_TOF ){
304                    
305                    Int_t nphit_p =0;
306                    Int_t nphit_i =0;
307                    
308                    op = GetToFStoredTrack(tp->GetSeqNo());
309                    oi = GetToFStoredTrack(ti->GetSeqNo());
310                    
311    /*                              cout << "track: npmtadc "<< op->npmtadc << endl;
312                                    cout << "track: npmttdc "<< op->npmttdc << endl;
313                                    cout << "image: npmtadc "<< oi->npmtadc << endl;
314                                    cout << "image: npmttdc "<< oi->npmttdc << endl;*/
315                    
316                    for (Int_t ih=0; ih < op->npmtadc; ih++){
317                        Int_t pl = GetPlaneIndex( (op->pmtadc).At(ih) );
318                        if(pl == 1 || pl == 2 || pl == 5)nphit_p++;
319                    };
320                    
321                    for (Int_t ih=0; ih < oi->npmtadc; ih++){
322                        Int_t pl = GetPlaneIndex( (oi->pmtadc).At(ih) );
323                        if(pl == 1 || pl == 2 || pl == 5)nphit_i++;
324                    };
325                    
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
338                // ------------------------
339                // chi**2 difference is not always large enough to distinguish among
340                // the real track and its image.
341                // Tracker check will be applied always when calorimeter and tof information is ambiguous.
342                if(use_TRK){
343                    if(      tp->chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ;
344                    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                    ts = ti;//its image!!              else if (tp_score < ti_score) ts = ti;//its image!!
352                else {
353                  }else{                  ts = tp;
354                          ts = tp;  //                              cout << "Warning - track image ambiguity not solved" << endl;
355                  };  //                              cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl;
356                                        };
357                  sorted_tracks->Add(ts);//save the track in the sorted array              
358                            }else{
359                ts = tp;
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 191  void PamLevel2::SortTracks(){ Line 380  void PamLevel2::SortTracks(){
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  //      if(!sorted_tracks->GetEntries()) SortTracks();           //
384          SortTracks();  //      SortTracks("+CAL+TOF");
385             SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
386            //
387          return sorted_tracks;          return sorted_tracks;
388   };   };
389  //--------------------------------------  //--------------------------------------
390  //   //
391  //   //
392  //--------------------------------------  //--------------------------------------
393  /**  /**
394   * Retrieves the it-th Pamela "physical" track.   * Retrieves the it-th Pamela "physical" track.
# Line 205  void PamLevel2::SortTracks(){ Line 396  void PamLevel2::SortTracks(){
396   * @param it Track number, ranging from 0 to GetNTracks().   * @param it Track number, ranging from 0 to GetNTracks().
397   */   */
398  PamTrack *PamLevel2::GetTrack(int it){  PamTrack *PamLevel2::GetTrack(int it){
   
         SortTracks();  
399                    
400          TrkTrack   *t = 0;  //  *-*-*-*-*-*-*
401          CaloTrkVar *c = 0;  //      SortTracks("+CAL+TOF");
402          ToFTrkVar  *o = 0;      SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
403    //  *-*-*-*-*-*-*
404    
405          if( it >=0 && it < TrkLevel2::GetNTracks() ){      PamTrack *track = 0;
406                        
407                  t = (TrkTrack*)sorted_tracks->At(it);      if( it >=0 && it < TrkLevel2::GetNTracks() && it<sorted_tracks->GetEntriesFast() ){
408                            TrkTrack   *t = (TrkTrack*)sorted_tracks->At(it);
409                  Int_t it_calo=0;          track = GetPamTrackAlong(t);
410                  do{      }else{
411                          c = CaloLevel2::GetCaloTrkVar(it_calo);          cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
412                          it_calo++;      };
413                  } while(t->GetSeqNo() != c->trkseqno && it_calo < CaloLevel2::ntrk());        
414                  if( t->GetSeqNo() != c->trkseqno )cout << "PamLevel2::GetTrack(int) : tracker SeqNo "<< t->GetSeqNo() <<" does not match Calorimeter SeqNo"<< c->trkseqno<<endl;      return track;
                   
                 Int_t it_tof=0;  
                 do{  
                         o = ToFLevel2::GetToFTrkVar(it_tof);  
                         it_tof++;  
                 } while(t->GetSeqNo() != o->trkseqno && it_tof < ToFLevel2::ntrk());      
                 if( t->GetSeqNo() != o->trkseqno )cout << "PamLevel2::GetTrack(int) : tracker SeqNo "<< t->GetSeqNo() <<" does not match ToF SeqNo "<< o->trkseqno <<endl;  
                   
         }else{  
                 cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;  
         };  
415            
     // hence create a "PamTrack" object  
         PamTrack *track = 0;  
         if(t && c && o)track = new PamTrack(t,c,o);  
           
         return track;  
   
416  };  };
417    
418  //--------------------------------------  //--------------------------------------
419  //  //
420  //  //
421  //--------------------------------------  //--------------------------------------
422  /**  /**
423   * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::GetTracks().   * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().
424   * @param it Track number, ranging from 0 to GetNTracks().   * @param it Track number, ranging from 0 to GetNTracks().
425   */   */
426  PamTrack *PamLevel2::GetTrackImage(int it){  PamTrack *PamLevel2::GetTrackImage(int it){
427    
428  //      if(!sorted_tracks->GetEntries()) SortTracks();  //      SortTracks("+CAL+TOF");
429          SortTracks();          SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!!
430                    
431      TrkTrack   *t = 0;          PamTrack *image = 0;
     CaloTrkVar *c = 0;  
     ToFTrkVar  *o = 0;  
432    
433      if( it >=0 && it < TrkLevel2::GetNTracks() ){          if( it >=0 && it < TrkLevel2::GetNTracks() ){
434                  TrkTrack *temp = (TrkTrack*)sorted_tracks->At(it);                  TrkTrack *temp = (TrkTrack*)sorted_tracks->At(it);
435                  if( temp->HasImage() ){                  if( temp->HasImage() ){
436                                                    TrkTrack   *t = TrkLevel2::GetStoredTrack(temp->GetImageSeqNo());
437                          t = TrkLevel2::GetStoredTrack(temp->GetImageSeqNo());                          image = GetPamTrackAlong(t);
   
 /*                      c = CaloLevel2::GetCaloTrkVar(temp->GetImageSeqNo());  
                         o = ToFLevel2::GetToFTrkVar(temp->GetImageSeqNo());*/  
                   
                         Int_t it_calo=0;  
                         do{  
                                 c = CaloLevel2::GetCaloTrkVar(it_calo);  
                                 it_calo++;  
                         } while(t->GetSeqNo() != c->trkseqno && it_calo < CaloLevel2::ntrk());    
                         if( t->GetSeqNo() != c->trkseqno )cout << "PamLevel2::GetTrackImage(int) : tracker SeqNo "<< t->GetSeqNo() <<" does not match Calorimeter SeqNo"<< c->trkseqno<<endl;  
                   
                         Int_t it_tof=0;  
                         do{  
                                 o = ToFLevel2::GetToFTrkVar(it_tof);  
                                 it_tof++;  
                         } while(t->GetSeqNo() != o->trkseqno && it_tof < ToFLevel2::ntrk());      
                         if( t->GetSeqNo() != o->trkseqno )cout << "PamLevel2::GetTrackImage(int) : tracker SeqNo "<< t->GetSeqNo() <<" does not match ToF SeqNo "<< o->trkseqno <<endl;  
438                  }else{                  }else{
439                          cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;                          cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl;
440                  };                  };
# Line 287  PamTrack *PamLevel2::GetTrackImage(int i Line 442  PamTrack *PamLevel2::GetTrackImage(int i
442                  cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;                  cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl;
443          };          };
444            
     // hence create a "PamTrack" object  
     PamTrack *image = 0;  
     if(t && c && o)image = new PamTrack(t,c,o);  
       
445          return image;          return image;
       
446  }  }
447    
448  //--------------------------------------  //--------------------------------------
# Line 305  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 325  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 335  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 345  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 355  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 365  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 375  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 385  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 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 505  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( !gSystem->IsFileInIncludePath(flisttxt,&fullpath) )return 0;
583                    
584          if(ddir=="")ddir = wdir;  //              flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt));
585          TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir);          flisttxt = fullpath;
         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;  
586                    
587                  flisttxt = gSystem->ConcatFileName(wdir,gSystem->BaseName(flisttxt));          if( !gSystem->ChangeDirectory(ddir) )return 0;
588                            
589                  cout <<"Input file list : "<< endl << flisttxt <<endl;          cout <<"Input file list : " << flisttxt <<endl;
590                  ifstream in;          ifstream in;
591                  in.open(flisttxt, ios::in);          in.open(flisttxt, ios::in); //open input file list
592                  while (1) {          while (1) {
593                          TString file;              TString file;
594                          in >> file;              in >> file;
595                          if (!in.good()) break;              if (!in.good()) break;
596                          char *fullpath;              if( gSystem->IsFileInIncludePath(file,&fullpath) ){
                         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();
605                            
606          }else{      }else{
607                    
608                  cout << "No input file list given."<<endl;          cout << "No input file list given."<<endl;
609                  cout << "Check for existing root files."<<endl;          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 581  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          return Tout;      R->SetBranchAddress("RunInfo", GetPointerToRun());
835        cout << "Run         : set branch address RunInfo"<<endl;
836        
837        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 694  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  //  //
922  //  //
923  //--------------------------------------  //--------------------------------------
924  /**  /**
925   * Check if a file contains required 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.2  
changed lines
  Added in v.1.6

  ViewVC Help
Powered by ViewVC 1.1.23