| 1 | 
#include <PamLevel2.h> | 
| 2 | 
//-------------------------------------- | 
| 3 | 
// | 
| 4 | 
// | 
| 5 | 
//-------------------------------------- | 
| 6 | 
/** | 
| 7 | 
 * Default constructor  | 
| 8 | 
 */ | 
| 9 | 
PamTrack::PamTrack(){ | 
| 10 | 
    trk_track  = this->TrkTrack::GetTrkTrack(); | 
| 11 | 
    calo_track = this->CaloTrkVar::GetCaloTrkVar(); | 
| 12 | 
    tof_track  = this->ToFTrkVar::GetToFTrkVar(); | 
| 13 | 
}; | 
| 14 | 
//-------------------------------------- | 
| 15 | 
// | 
| 16 | 
// | 
| 17 | 
//-------------------------------------- | 
| 18 | 
/** | 
| 19 | 
 * Constructor  | 
| 20 | 
 */ | 
| 21 | 
PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o){  | 
| 22 | 
    trk_track  = this->TrkTrack::GetTrkTrack(); | 
| 23 | 
    calo_track = this->CaloTrkVar::GetCaloTrkVar(); | 
| 24 | 
    tof_track  = this->ToFTrkVar::GetToFTrkVar(); | 
| 25 | 
    if(t) *trk_track  = *t; | 
| 26 | 
    if(c) *calo_track = *c; | 
| 27 | 
    if(o) *tof_track  = *o;      | 
| 28 | 
}; | 
| 29 | 
 | 
| 30 | 
//-------------------------------------- | 
| 31 | 
// | 
| 32 | 
// | 
| 33 | 
//-------------------------------------- | 
| 34 | 
/** | 
| 35 | 
 * Constructor  | 
| 36 | 
 */ | 
| 37 | 
PamLevel2::PamLevel2(){ | 
| 38 | 
         | 
| 39 | 
    trk_l1_obj  = this->TrkLevel1::GetTrkLevel1();       | 
| 40 | 
        trk_obj     = this->TrkLevel2::GetTrkLevel2(); | 
| 41 | 
        calo_obj    = this->CaloLevel2::GetCaloLevel2(); | 
| 42 | 
    tof_obj     = this->ToFLevel2::GetToFLevel2(); | 
| 43 | 
    trig_obj    = this->TrigLevel2::GetTrigLevel2(); | 
| 44 | 
    s4_obj      = this->S4Level2::GetS4Level2(); | 
| 45 | 
    nd_obj      = this->NDLevel2::GetNDLevel2(); | 
| 46 | 
    ac_obj      = this->AcLevel2::GetAcLevel2(); | 
| 47 | 
        orb_obj     = this->OrbitalInfo::GetOrbitalInfo(); | 
| 48 | 
 | 
| 49 | 
        run_obj     = new GL_RUN(); | 
| 50 | 
         | 
| 51 | 
        sorted_tracks = new TRefArray(); | 
| 52 | 
 | 
| 53 | 
        CAL = true; | 
| 54 | 
        TRK = true; | 
| 55 | 
        TRG = true; | 
| 56 | 
        TOF = true; | 
| 57 | 
        S4  = true; | 
| 58 | 
        ND  = true; | 
| 59 | 
        AC  = true; | 
| 60 | 
        ORB = true; | 
| 61 | 
 | 
| 62 | 
        TRK_L1 = false; | 
| 63 | 
 | 
| 64 | 
        Tout  = NULL; | 
| 65 | 
}; | 
| 66 | 
/** | 
| 67 | 
 * Destructor  | 
| 68 | 
 */ | 
| 69 | 
PamLevel2::~PamLevel2(){ | 
| 70 | 
                 | 
| 71 | 
        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 | 
| 92 | 
 */ | 
| 93 | 
void PamLevel2::Clear(){ | 
| 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 | 
 | 
| 111 | 
//-------------------------------------- | 
| 112 | 
// | 
| 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( seqno != c->trkseqno && it_calo < CaloLevel2::ntrk());         | 
| 133 | 
         | 
| 134 | 
         if(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( seqno != c->trkseqno && it_tof < ToFLevel2::ntrk());   | 
| 163 | 
         | 
| 164 | 
         if(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.  | 
| 199 | 
 * It override TrkLevel2::GetTrack(int it).  | 
| 200 | 
 * @param itrk Track number, ranging from 0 to GetNTracks(). | 
| 201 | 
 */ | 
| 202 | 
 | 
| 203 | 
PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){ | 
| 204 | 
     | 
| 205 | 
        PamTrack *track = 0; | 
| 206 | 
 | 
| 207 | 
        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 the TRefArray (of TrkTrack objects) which pointer is  PamLevel2::sorted_tracks. | 
| 225 | 
 * @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(TString how){ | 
| 235 | 
 | 
| 236 | 
  //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 | 
| 242 | 
        Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase); | 
| 243 | 
        Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase); | 
| 244 | 
        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 | 
| 259 | 
                TrkTrack   *tp = TrkLevel2::GetTrack(i);                    //tracker | 
| 260 | 
//              CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo()); | 
| 261 | 
//              ToFTrkVar  *op = GetToFStoredTrack(tp->GetSeqNo()); | 
| 262 | 
                CaloTrkVar *cp = 0; | 
| 263 | 
                ToFTrkVar  *op = 0; | 
| 264 | 
 | 
| 265 | 
        // if track has an image, check image selection | 
| 266 | 
                if(tp->HasImage()){ | 
| 267 | 
                         | 
| 268 | 
                        TrkTrack   *ti = TrkLevel2::GetTrackImage(i);              //tracker (image) | 
| 269 | 
//                      CaloTrkVar *ci = GetCaloStoredTrack(ti->GetSeqNo()); | 
| 270 | 
//                      ToFTrkVar  *oi = GetToFStoredTrack(ti->GetSeqNo()); | 
| 271 | 
                        CaloTrkVar *ci = 0; | 
| 272 | 
                        ToFTrkVar  *oi = 0; | 
| 273 | 
 | 
| 274 | 
            //assign starting scores | 
| 275 | 
                        Int_t tp_score = 0;  //main track sorted by the tracker | 
| 276 | 
                        Int_t ti_score = 0;  //image track | 
| 277 | 
                                                 | 
| 278 | 
            // ------------------------ | 
| 279 | 
            // calorimeter check | 
| 280 | 
            // ------------------------ | 
| 281 | 
                // check the Y spatial residual on the first calorimeter plane | 
| 282 | 
                // (cut on calorimeter variables from Emiliano) | 
| 283 | 
                        if( | 
| 284 | 
                                use_CAL            && | 
| 285 | 
                                npcfit[1] > 15     &&   //no. of fit planes on Y view | 
| 286 | 
                                varcfit[1] < 1000. &&  //fit variance on Y view | 
| 287 | 
                                true){ | 
| 288 | 
 | 
| 289 | 
                                cp = GetCaloStoredTrack(tp->GetSeqNo()); | 
| 290 | 
                                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 | 
| 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.... | 
| 349 | 
            // ------------------------      | 
| 350 | 
                        if      (tp_score > ti_score) ts = tp;//the track sorted by the tracker!! | 
| 351 | 
                        else if (tp_score < ti_score) ts = ti;//its image!! | 
| 352 | 
                        else { | 
| 353 | 
                                ts = tp; | 
| 354 | 
//                              cout << "Warning - track image ambiguity not solved" << endl; | 
| 355 | 
//                              cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl; | 
| 356 | 
                        }; | 
| 357 | 
 | 
| 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 | 
// | 
| 376 | 
// | 
| 377 | 
//-------------------------------------- | 
| 378 | 
/** | 
| 379 | 
 * This method overrides TrkLevel2::GetTracks(), where sorting is done by decreasing number of fit points and increasing chi^2. | 
| 380 | 
 * 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(){ | 
| 383 | 
         // | 
| 384 | 
//      SortTracks("+CAL+TOF"); | 
| 385 | 
         SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!! | 
| 386 | 
        // | 
| 387 | 
        return sorted_tracks; | 
| 388 | 
 }; | 
| 389 | 
//-------------------------------------- | 
| 390 | 
 // | 
| 391 | 
 // | 
| 392 | 
//-------------------------------------- | 
| 393 | 
/** | 
| 394 | 
 * Retrieves the it-th Pamela "physical" track.  | 
| 395 | 
 * It override TrkLevel2::GetTrack(int it).  | 
| 396 | 
 * @param it Track number, ranging from 0 to GetNTracks(). | 
| 397 | 
 */ | 
| 398 | 
PamTrack *PamLevel2::GetTrack(int it){ | 
| 399 | 
         | 
| 400 | 
//  *-*-*-*-*-*-* | 
| 401 | 
//      SortTracks("+CAL+TOF"); | 
| 402 | 
        SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!! | 
| 403 | 
//  *-*-*-*-*-*-* | 
| 404 | 
 | 
| 405 | 
        PamTrack *track = 0; | 
| 406 | 
         | 
| 407 | 
        if( it >=0 && it < TrkLevel2::GetNTracks() ){ | 
| 408 | 
                TrkTrack   *t = (TrkTrack*)sorted_tracks->At(it); | 
| 409 | 
//              cout << "GetTrack(int it):: sorted_tracks->At(it) "<<it<<" "<<t<<endl; | 
| 410 | 
                track = GetPamTrackAlong(t); | 
| 411 | 
        }else{ | 
| 412 | 
                cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl; | 
| 413 | 
        }; | 
| 414 | 
         | 
| 415 | 
        return track; | 
| 416 | 
 | 
| 417 | 
}; | 
| 418 | 
 | 
| 419 | 
//-------------------------------------- | 
| 420 | 
// | 
| 421 | 
// | 
| 422 | 
//-------------------------------------- | 
| 423 | 
/** | 
| 424 | 
 * Retrieves (if present) the image of the it-th Pamela "physical" track, sorted by the method PamLevel2::SortTracks().  | 
| 425 | 
 * @param it Track number, ranging from 0 to GetNTracks(). | 
| 426 | 
 */ | 
| 427 | 
PamTrack *PamLevel2::GetTrackImage(int it){ | 
| 428 | 
 | 
| 429 | 
//      SortTracks("+CAL+TOF"); | 
| 430 | 
        SortTracks("+CAL+TRK");//TEMP!!!!!!!!!!!!! | 
| 431 | 
         | 
| 432 | 
        PamTrack *image = 0; | 
| 433 | 
 | 
| 434 | 
        if( it >=0 && it < TrkLevel2::GetNTracks() ){ | 
| 435 | 
                TrkTrack *temp = (TrkTrack*)sorted_tracks->At(it); | 
| 436 | 
                if( temp->HasImage() ){ | 
| 437 | 
                        TrkTrack   *t = TrkLevel2::GetStoredTrack(temp->GetImageSeqNo()); | 
| 438 | 
                        image = GetPamTrackAlong(t); | 
| 439 | 
                }else{ | 
| 440 | 
                        cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<<it<<" does not have image"<<endl; | 
| 441 | 
                }; | 
| 442 | 
        }else{ | 
| 443 | 
                cout << "PamLevel2::GetTrackImage(int) : Tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<<TrkLevel2::GetNTracks()<<")"<<endl; | 
| 444 | 
        }; | 
| 445 | 
     | 
| 446 | 
        return image; | 
| 447 | 
} | 
| 448 | 
 | 
| 449 | 
//-------------------------------------- | 
| 450 | 
// | 
| 451 | 
// | 
| 452 | 
//-------------------------------------- | 
| 453 | 
/** | 
| 454 | 
 * Get the Pamela detector trees in a single file and make them friends. | 
| 455 | 
 * @param f TFile pointer | 
| 456 | 
 * @param detlist String to select trees to be included | 
| 457 | 
 * @return Pointer to a TTree | 
| 458 | 
 */ | 
| 459 | 
TTree *PamLevel2::GetPamTree(TFile *f, TString detlist="+ALL"){ | 
| 460 | 
 | 
| 461 | 
//      cout << "WARNING!!! -- obsolete method -- \n"; | 
| 462 | 
//      cout << "better use TChain *PamLevel2::GetPamTree(TList*, TString) \n"; | 
| 463 | 
         | 
| 464 | 
        TTree *Trout =0; | 
| 465 | 
         | 
| 466 | 
        SetWhichTrees(detlist); | 
| 467 | 
// Tracker | 
| 468 | 
    TTree *T = (TTree*)f->Get("Tracker"); | 
| 469 | 
    if(T && TRK) { | 
| 470 | 
                if(TRK_L1){ | 
| 471 | 
                        T->SetBranchAddress("TrkLevel1", GetPointerToTrk(1)); | 
| 472 | 
                        cout << "Tracker      : set branch address TrkLevel1"<<endl; | 
| 473 | 
                }; | 
| 474 | 
                T->SetBranchAddress("TrkLevel2", GetPointerToTrk(2)); | 
| 475 | 
                cout << "Tracker      : set branch address TrkLevel2"<<endl; | 
| 476 | 
                Trout=T; | 
| 477 | 
    }else{ | 
| 478 | 
        cout << "Tracker      : missing tree"<<endl; | 
| 479 | 
    }; | 
| 480 | 
    // Calorimeter | 
| 481 | 
    TTree *C = (TTree*)f->Get("Calorimeter"); | 
| 482 | 
    if(C && CAL) { | 
| 483 | 
        C->SetBranchAddress("CaloLevel2", GetPointerToCalo()); | 
| 484 | 
        cout << "Calorimeter  : set branch address CaloLevel2"<<endl; | 
| 485 | 
        if(!Trout)Trout=C; | 
| 486 | 
        else Trout->AddFriend(C); | 
| 487 | 
    }else{ | 
| 488 | 
        cout << "Calorimeter  : missing tree"<<endl; | 
| 489 | 
    }; | 
| 490 | 
    // ToF     | 
| 491 | 
    TTree *O = (TTree*)f->Get("ToF"); | 
| 492 | 
    if(O && TOF) { | 
| 493 | 
        O->SetBranchAddress("ToFLevel2", GetPointerToToF()); | 
| 494 | 
        cout << "ToF          : set branch address ToFLevel2"<<endl; | 
| 495 | 
        if(!Trout)Trout=O; | 
| 496 | 
        else Trout->AddFriend(O); | 
| 497 | 
    }else{ | 
| 498 | 
        cout << "ToF         : missing tree"<<endl; | 
| 499 | 
    }; | 
| 500 | 
    // Trigger | 
| 501 | 
    TTree *R = (TTree*)f->Get("Trigger"); | 
| 502 | 
    if(R && TRG) { | 
| 503 | 
        R->SetBranchAddress("TrigLevel2", GetPointerToTrig()); | 
| 504 | 
        cout << "Trigger      : set branch address TrigLevel2"<<endl; | 
| 505 | 
        if(!Trout)Trout=O; | 
| 506 | 
        else Trout->AddFriend(R); | 
| 507 | 
    }else{ | 
| 508 | 
        cout << "Trigger      : missing tree"<<endl; | 
| 509 | 
    }; | 
| 510 | 
    // S4 | 
| 511 | 
    TTree *S = (TTree*)f->Get("S4"); | 
| 512 | 
    if(S && S4) { | 
| 513 | 
        S->SetBranchAddress("S4Level2", GetPointerToS4()); | 
| 514 | 
        cout << "S4           : set branch address S4Level2"<<endl; | 
| 515 | 
        if(!Trout)Trout=O; | 
| 516 | 
        else Trout->AddFriend(S); | 
| 517 | 
    }else{ | 
| 518 | 
        cout << "S4           : missing tree"<<endl; | 
| 519 | 
    }; | 
| 520 | 
    // Neutron Detector | 
| 521 | 
    TTree *N = (TTree*)f->Get("NeutronD"); | 
| 522 | 
    if(N && ND) { | 
| 523 | 
        N->SetBranchAddress("NDLevel2", GetPointerToND()); | 
| 524 | 
        cout << "NeutronD     : set branch address NDLevel2"<<endl; | 
| 525 | 
        if(!Trout)Trout=O; | 
| 526 | 
        else Trout->AddFriend(N); | 
| 527 | 
    }else{ | 
| 528 | 
        cout << "NeutronD     : missing tree"<<endl; | 
| 529 | 
    }; | 
| 530 | 
    // Anticounters | 
| 531 | 
    TTree *A = (TTree*)f->Get("Anticounter"); | 
| 532 | 
    if(A && AC) { | 
| 533 | 
        A->SetBranchAddress("AcLevel2", GetPointerToAc()); | 
| 534 | 
        cout << "Anticounter  : set branch address AcLevel2"<<endl; | 
| 535 | 
        if(!Trout)Trout=O; | 
| 536 | 
        else Trout->AddFriend(A); | 
| 537 | 
    }else{ | 
| 538 | 
        cout << "Anticounter  : missing tree"<<endl; | 
| 539 | 
    }; | 
| 540 | 
    // Orbital Info | 
| 541 | 
        TTree *B = (TTree*)f->Get("OrbitalInfo"); | 
| 542 | 
        if(B && ORB) { | 
| 543 | 
                B->SetBranchAddress("OrbitalInfo", GetPointerToOrb()); | 
| 544 | 
                cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl; | 
| 545 | 
                if(!Trout)Trout=O; | 
| 546 | 
                else Trout->AddFriend(B); | 
| 547 | 
        }else{ | 
| 548 | 
                cout << "OrbitalInfo  : missing tree"<<endl; | 
| 549 | 
        }; | 
| 550 | 
     | 
| 551 | 
        cout<<endl<<" Number of entries: "<<Trout->GetEntries()<<endl<<endl; | 
| 552 | 
         | 
| 553 | 
        return Trout; | 
| 554 | 
     | 
| 555 | 
} | 
| 556 | 
//-------------------------------------- | 
| 557 | 
// | 
| 558 | 
// | 
| 559 | 
//-------------------------------------- | 
| 560 | 
/** | 
| 561 | 
 * Get list of Level2 files. | 
| 562 | 
 * @param ddir Level2 data directory. | 
| 563 | 
 * @param flisttxt Name of txt file containing file list. | 
| 564 | 
 * @return Pointer to a TList of TSystemFiles | 
| 565 | 
 * If no input file list is given , all the Level2 files inside the directory are processed. | 
| 566 | 
 */ | 
| 567 | 
TList*  PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = ""){ | 
| 568 | 
         | 
| 569 | 
        TString wdir = gSystem->WorkingDirectory();      | 
| 570 | 
         | 
| 571 | 
        if(ddir=="")ddir = wdir; | 
| 572 | 
//      TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir); | 
| 573 | 
        cout << "Level2 data directory : "<<  ddir << endl; | 
| 574 | 
                 | 
| 575 | 
        TList *contents  = new TList; // create output list | 
| 576 | 
        contents->SetOwner(); | 
| 577 | 
         | 
| 578 | 
        char *fullpath; | 
| 579 | 
                 | 
| 580 | 
        // if no input file list is given:       | 
| 581 | 
        if ( flisttxt != "" ){ | 
| 582 | 
                                 | 
| 583 | 
                if( !gSystem->IsFileInIncludePath(flisttxt,&fullpath) )return 0; | 
| 584 | 
                 | 
| 585 | 
//              flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt)); | 
| 586 | 
                flisttxt = fullpath; | 
| 587 | 
                 | 
| 588 | 
                if( !gSystem->ChangeDirectory(ddir) )return 0;  | 
| 589 | 
         | 
| 590 | 
                cout <<"Input file list : " << flisttxt <<endl; | 
| 591 | 
                ifstream in;  | 
| 592 | 
                in.open(flisttxt, ios::in); //open input file list | 
| 593 | 
                while (1) { | 
| 594 | 
                        TString file; | 
| 595 | 
                        in >> file; | 
| 596 | 
                        if (!in.good()) break; | 
| 597 | 
                        if( gSystem->IsFileInIncludePath(file,&fullpath) ){ | 
| 598 | 
//                              contents->Add(new TSystemDirectory(fullpath,ddir)); // add file to the list | 
| 599 | 
//                              contents->Add(new TSystemFile(fullpath,ddir)); // add file to the list | 
| 600 | 
                                contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list | 
| 601 | 
                        }else{ | 
| 602 | 
                                cout << "warning! --- File "<<file<<" does not exists"<< endl; | 
| 603 | 
                        }; | 
| 604 | 
                }; | 
| 605 | 
                in.close(); | 
| 606 | 
                 | 
| 607 | 
        }else{ | 
| 608 | 
         | 
| 609 | 
                cout << "No input file list given."<<endl; | 
| 610 | 
                cout << "Check for existing root files."<<endl; | 
| 611 | 
//              cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl; | 
| 612 | 
                 | 
| 613 | 
                TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir); | 
| 614 | 
                TList *temp = datadir->GetListOfFiles(); | 
| 615 | 
//              temp->Print(); | 
| 616 | 
//              cout << "*************************************" << endl; | 
| 617 | 
                 | 
| 618 | 
                TIter next(temp); | 
| 619 | 
                TSystemFile *questo = 0; | 
| 620 | 
                 | 
| 621 | 
                 | 
| 622 | 
                while ( (questo = (TSystemFile*) next()) ) { | 
| 623 | 
                        TString name =  questo-> GetName(); | 
| 624 | 
                        if( name.EndsWith(".root") ){ | 
| 625 | 
                                char *fullpath; | 
| 626 | 
                                gSystem->IsFileInIncludePath(name,&fullpath); | 
| 627 | 
                                contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath))); | 
| 628 | 
                        }; | 
| 629 | 
                } | 
| 630 | 
                delete temp; | 
| 631 | 
                delete datadir; | 
| 632 | 
         | 
| 633 | 
        }; | 
| 634 | 
        gSystem->ChangeDirectory(wdir); // back to the working directory | 
| 635 | 
//      cout << endl << "Selected files:" << endl; | 
| 636 | 
//      contents->Print(); | 
| 637 | 
        cout << contents->GetEntries()<<" files selected\n"; | 
| 638 | 
//      cout << endl; | 
| 639 | 
//      cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl; | 
| 640 | 
        return contents; | 
| 641 | 
}; | 
| 642 | 
//-------------------------------------- | 
| 643 | 
// | 
| 644 | 
// | 
| 645 | 
//-------------------------------------- | 
| 646 | 
/** | 
| 647 | 
 * Get the Pamela detector chains from a list of files and make them friends. | 
| 648 | 
 * @param fl Pointer to a TList of TSystemFiles  | 
| 649 | 
 * @param detlist String to select trees to be included | 
| 650 | 
 * @return Pointer to a TChain | 
| 651 | 
 */ | 
| 652 | 
TChain *PamLevel2::GetPamTree(TList *fl, TString detlist="+ALL"){ | 
| 653 | 
 | 
| 654 | 
//      TChain *Tout=0; | 
| 655 | 
        if(Tout)Tout->Delete(); | 
| 656 | 
        Tout = NULL; | 
| 657 | 
         | 
| 658 | 
        SetWhichTrees(detlist); | 
| 659 | 
         | 
| 660 | 
        TChain *T = 0;   | 
| 661 | 
        TChain *C = 0; | 
| 662 | 
        TChain *O = 0; | 
| 663 | 
        TChain *R = 0; | 
| 664 | 
        TChain *S = 0; | 
| 665 | 
        TChain *N = 0; | 
| 666 | 
        TChain *A = 0; | 
| 667 | 
        TChain *B = 0; | 
| 668 | 
         | 
| 669 | 
        if(TRK) T = new TChain("Tracker");       | 
| 670 | 
        if(CAL) C = new TChain("Calorimeter"); | 
| 671 | 
        if(TOF) O = new TChain("ToF"); | 
| 672 | 
        if(TRG) R = new TChain("Trigger"); | 
| 673 | 
        if(S4)  S = new TChain("S4"); | 
| 674 | 
        if(ND)  N = new TChain("NeutronD"); | 
| 675 | 
        if(AC)  A = new TChain("Anticounter"); | 
| 676 | 
        if(ORB) B = new TChain("OrbitalInfo"); | 
| 677 | 
         | 
| 678 | 
        // loop over files and create chains     | 
| 679 | 
        TIter next(fl); | 
| 680 | 
        TSystemFile *questo = 0; | 
| 681 | 
        while ( (questo = (TSystemFile*) next()) ) { | 
| 682 | 
                TString name =  questo->GetName(); | 
| 683 | 
//              cout << "File: "<< name << endl; | 
| 684 | 
                if( CheckLevel2File(name) ){ | 
| 685 | 
                        if(TRK) T->Add(name); | 
| 686 | 
                        if(CAL) C->Add(name); | 
| 687 | 
                        if(TOF) O->Add(name); | 
| 688 | 
                        if(TRG) R->Add(name); | 
| 689 | 
                        if(S4)  S->Add(name); | 
| 690 | 
                        if(ND)  N->Add(name); | 
| 691 | 
                        if(AC)  A->Add(name); | 
| 692 | 
                        if(ORB) B->Add(name); | 
| 693 | 
                }; | 
| 694 | 
        } | 
| 695 | 
                 | 
| 696 | 
            // Tracker | 
| 697 | 
        if(TRK) if(!Tout)Tout=T; | 
| 698 | 
             | 
| 699 | 
        // Calorimeter | 
| 700 | 
        if(CAL) {                | 
| 701 | 
                if(!Tout)Tout=C; | 
| 702 | 
                else Tout->AddFriend("Calorimeter"); | 
| 703 | 
        }; | 
| 704 | 
         | 
| 705 | 
    // ToF     | 
| 706 | 
        if(TOF) { | 
| 707 | 
                if(!Tout)Tout=O; | 
| 708 | 
                else Tout->AddFriend("ToF"); | 
| 709 | 
        }; | 
| 710 | 
    // Trigger | 
| 711 | 
        if(TRG) { | 
| 712 | 
                if(!Tout)Tout=O; | 
| 713 | 
                else Tout->AddFriend("Trigger"); | 
| 714 | 
        }; | 
| 715 | 
    // S4 | 
| 716 | 
        if(S4) { | 
| 717 | 
                if(!Tout)Tout=O; | 
| 718 | 
                else Tout->AddFriend("S4"); | 
| 719 | 
        }; | 
| 720 | 
    // Neutron Detector | 
| 721 | 
        if(ND) { | 
| 722 | 
                if(!Tout)Tout=O; | 
| 723 | 
                else Tout->AddFriend("NeutronD"); | 
| 724 | 
        }; | 
| 725 | 
    // Anticounters | 
| 726 | 
        if(AC) { | 
| 727 | 
                if(!Tout)Tout=O; | 
| 728 | 
                else Tout->AddFriend("Anticounter"); | 
| 729 | 
        }; | 
| 730 | 
    // OrbitalInfo | 
| 731 | 
        if(ORB) { | 
| 732 | 
                if(!Tout)Tout=O; | 
| 733 | 
                else Tout->AddFriend("OrbitalInfo"); | 
| 734 | 
        }; | 
| 735 | 
         | 
| 736 | 
        cout<<endl<<" Number of entries: "<<Tout->GetEntries()<<endl<<endl; | 
| 737 | 
         | 
| 738 | 
        PamLevel2::SetBranchAddress(); | 
| 739 | 
         | 
| 740 | 
        return Tout; | 
| 741 | 
} | 
| 742 | 
//-------------------------------------- | 
| 743 | 
// | 
| 744 | 
// | 
| 745 | 
//-------------------------------------- | 
| 746 | 
/** | 
| 747 | 
 * Set branch addresses for Pamela friend trees | 
| 748 | 
 */ | 
| 749 | 
void PamLevel2::SetBranchAddress(){ | 
| 750 | 
    // Tracker | 
| 751 | 
        if(TRK) { | 
| 752 | 
                if(TRK_L1){ | 
| 753 | 
                        Tout->SetBranchAddress("TrkLevel1", GetPointerToTrk(1)); | 
| 754 | 
                        cout << "Tracker      : set branch address TrkLevel1"<<endl; | 
| 755 | 
                }; | 
| 756 | 
                Tout->SetBranchAddress("TrkLevel2", GetPointerToTrk(2)); | 
| 757 | 
                cout << "Tracker      : set branch address TrkLevel2"<<endl; | 
| 758 | 
        }; | 
| 759 | 
             | 
| 760 | 
        // Calorimeter | 
| 761 | 
        if(CAL) { | 
| 762 | 
                Tout->SetBranchAddress("CaloLevel2", GetPointerToCalo()); | 
| 763 | 
                cout << "Calorimeter  : set branch address CaloLevel2"<<endl; | 
| 764 | 
        }; | 
| 765 | 
         | 
| 766 | 
    // ToF     | 
| 767 | 
        if(TOF) { | 
| 768 | 
                Tout->SetBranchAddress("ToFLevel2", GetPointerToToF()); | 
| 769 | 
                cout << "ToF          : set branch address ToFLevel2"<<endl; | 
| 770 | 
        }; | 
| 771 | 
    // Trigger | 
| 772 | 
        if(TRG) { | 
| 773 | 
                Tout->SetBranchAddress("TrigLevel2", GetPointerToTrig()); | 
| 774 | 
                cout << "Trigger      : set branch address TrigLevel2"<<endl; | 
| 775 | 
        }; | 
| 776 | 
    // S4 | 
| 777 | 
        if(S4) { | 
| 778 | 
                Tout->SetBranchAddress("S4Level2", GetPointerToS4()); | 
| 779 | 
                cout << "S4           : set branch address S4Level2"<<endl; | 
| 780 | 
        }; | 
| 781 | 
    // Neutron Detector | 
| 782 | 
        if(ND) { | 
| 783 | 
                Tout->SetBranchAddress("NDLevel2", GetPointerToND()); | 
| 784 | 
                cout << "NeutronD     : set branch address NDLevel2"<<endl; | 
| 785 | 
        }; | 
| 786 | 
    // Anticounters | 
| 787 | 
        if(AC) { | 
| 788 | 
                Tout->SetBranchAddress("AcLevel2", GetPointerToAc()); | 
| 789 | 
                cout << "Anticounter  : set branch address AcLevel2"<<endl; | 
| 790 | 
        }; | 
| 791 | 
    // OrbitalInfo | 
| 792 | 
        if(ORB) { | 
| 793 | 
                Tout->SetBranchAddress("OrbitalInfo", GetPointerToOrb()); | 
| 794 | 
                cout << "OrbitalInfo  : set branch address OrbitalInfo"<<endl; | 
| 795 | 
        }; | 
| 796 | 
         | 
| 797 | 
} | 
| 798 | 
 | 
| 799 | 
//-------------------------------------- | 
| 800 | 
// | 
| 801 | 
// | 
| 802 | 
//-------------------------------------- | 
| 803 | 
void *PamLevel2::GetPointerTo(const char* c ){ | 
| 804 | 
//      cout << "objname "<< objname << endl; | 
| 805 | 
        TString objname = c; | 
| 806 | 
        if(!objname.CompareTo("TrkLevel1"))return &trk_l1_obj; | 
| 807 | 
        if(!objname.CompareTo("TrkLevel2"))return &trk_obj; | 
| 808 | 
         | 
| 809 | 
        return NULL; | 
| 810 | 
}; | 
| 811 | 
//-------------------------------------- | 
| 812 | 
// | 
| 813 | 
// | 
| 814 | 
//-------------------------------------- | 
| 815 | 
/** | 
| 816 | 
 * Get the Run tree chain from a list of files. | 
| 817 | 
 * @param fl Pointer to a TList of TSystemFiles  | 
| 818 | 
 * @return Pointer to a TChain | 
| 819 | 
 */ | 
| 820 | 
TChain *PamLevel2::GetRunTree(TList *fl){ | 
| 821 | 
         | 
| 822 | 
        TChain *R = new TChain("Run"); | 
| 823 | 
 | 
| 824 | 
        // loop over files and create chains     | 
| 825 | 
        TIter next(fl); | 
| 826 | 
        TSystemFile *questo = 0; | 
| 827 | 
        while ( (questo = (TSystemFile*) next()) ) { | 
| 828 | 
                TString name =  questo->GetName(); | 
| 829 | 
//              cout << "File: "<< name << endl; | 
| 830 | 
                if( CheckLevel2File(name) ){ | 
| 831 | 
                        R->Add(name); | 
| 832 | 
                }; | 
| 833 | 
        } | 
| 834 | 
         | 
| 835 | 
        R->SetBranchAddress("RunInfo", GetPointerToRun()); | 
| 836 | 
        cout << "Run         : set branch address RunInfo"<<endl; | 
| 837 | 
     | 
| 838 | 
        return R; | 
| 839 | 
     | 
| 840 | 
} | 
| 841 | 
//-------------------------------------- | 
| 842 | 
// | 
| 843 | 
// | 
| 844 | 
//-------------------------------------- | 
| 845 | 
/** | 
| 846 | 
 * Get the Run tree  from a file. | 
| 847 | 
 * @param f Pointer to a TFile  | 
| 848 | 
 * @return Pointer to a TTree | 
| 849 | 
 */ | 
| 850 | 
TTree *PamLevel2::GetRunTree(TFile *f){ | 
| 851 | 
 | 
| 852 | 
 | 
| 853 | 
        TTree *R = (TTree*)f->Get("Run"); | 
| 854 | 
 | 
| 855 | 
        R->SetBranchAddress("RunInfo", GetPointerToRun()); | 
| 856 | 
        cout << "Run         : set branch address RunInfo"<<endl; | 
| 857 | 
     | 
| 858 | 
        return R; | 
| 859 | 
     | 
| 860 | 
} | 
| 861 | 
//-------------------------------------- | 
| 862 | 
// | 
| 863 | 
// | 
| 864 | 
//-------------------------------------- | 
| 865 | 
/** | 
| 866 | 
 * Set which trees should be analysed | 
| 867 | 
 * @param detlist TString containing the sequence of trees required  | 
| 868 | 
*/ | 
| 869 | 
void PamLevel2::SetWhichTrees(TString detlist){ | 
| 870 | 
         | 
| 871 | 
        if(detlist.Contains("+ALL", TString::kIgnoreCase)){ | 
| 872 | 
                CAL = true; | 
| 873 | 
                TRK = true; | 
| 874 | 
                TRK_L1 = false; | 
| 875 | 
                TRG = true; | 
| 876 | 
                TOF = true; | 
| 877 | 
                S4  = true; | 
| 878 | 
                ND  = true; | 
| 879 | 
                AC  = true; | 
| 880 | 
                ORB = true; | 
| 881 | 
        }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){ | 
| 882 | 
                CAL = false; | 
| 883 | 
                TRK = false; | 
| 884 | 
                TRK_L1 = false; | 
| 885 | 
                TRG = false; | 
| 886 | 
                TOF = false; | 
| 887 | 
                S4  = false; | 
| 888 | 
                ND  = false; | 
| 889 | 
                AC  = false; | 
| 890 | 
                ORB = false; | 
| 891 | 
        }; | 
| 892 | 
         | 
| 893 | 
        if( detlist.Contains("-CAL", TString::kIgnoreCase) )CAL = false; | 
| 894 | 
        else if( detlist.Contains("+CAL", TString::kIgnoreCase) )CAL = true; | 
| 895 | 
         | 
| 896 | 
        if( detlist.Contains("-TRK", TString::kIgnoreCase) )TRK = false; | 
| 897 | 
        else if( detlist.Contains("+TRK", TString::kIgnoreCase) )TRK = true; | 
| 898 | 
         | 
| 899 | 
        if( detlist.Contains("-TRK1", TString::kIgnoreCase) )TRK_L1 = false; | 
| 900 | 
        else if( detlist.Contains("+TRK1", TString::kIgnoreCase) )TRK_L1 = true; | 
| 901 | 
         | 
| 902 | 
        if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false; | 
| 903 | 
        else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true; | 
| 904 | 
         | 
| 905 | 
        if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false; | 
| 906 | 
        else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true; | 
| 907 | 
         | 
| 908 | 
        if( detlist.Contains("-S4",  TString::kIgnoreCase) )S4  = false; | 
| 909 | 
        else if( detlist.Contains("+S4",  TString::kIgnoreCase) )S4  = true; | 
| 910 | 
         | 
| 911 | 
        if( detlist.Contains("-ND",  TString::kIgnoreCase) )ND  = false; | 
| 912 | 
        else if( detlist.Contains("+ND",  TString::kIgnoreCase) )ND  = true; | 
| 913 | 
         | 
| 914 | 
        if( detlist.Contains("-AC",  TString::kIgnoreCase) )AC  = false; | 
| 915 | 
        else if( detlist.Contains("+AC",  TString::kIgnoreCase) )AC  = true; | 
| 916 | 
         | 
| 917 | 
        if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false; | 
| 918 | 
        else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true; | 
| 919 | 
         | 
| 920 | 
}; | 
| 921 | 
//-------------------------------------- | 
| 922 | 
// | 
| 923 | 
// | 
| 924 | 
//-------------------------------------- | 
| 925 | 
/** | 
| 926 | 
 * Check if a file contains selected Pamela Level2 trees. | 
| 927 | 
 * @param name File name | 
| 928 | 
 * @return true if the file is ok. | 
| 929 | 
 */ | 
| 930 | 
Bool_t  PamLevel2::CheckLevel2File(TString name){ | 
| 931 | 
         | 
| 932 | 
        Bool_t CAL__ok = false; | 
| 933 | 
        Bool_t TRK__ok = false; | 
| 934 | 
        Bool_t TRK_L1__ok = false; | 
| 935 | 
        Bool_t TRG__ok = false; | 
| 936 | 
        Bool_t TOF__ok = false; | 
| 937 | 
        Bool_t S4__ok  = false; | 
| 938 | 
        Bool_t ND__ok  = false; | 
| 939 | 
        Bool_t AC__ok  = false; | 
| 940 | 
        Bool_t ORB__ok = false; | 
| 941 | 
         | 
| 942 | 
        Bool_t RUN__ok = false; | 
| 943 | 
         | 
| 944 | 
        TFile *f = new TFile(name.Data()); | 
| 945 | 
        TList *lk = f->GetListOfKeys(); | 
| 946 | 
//      lk->Print(); | 
| 947 | 
        TIter next(lk); | 
| 948 | 
        TKey *key =0; | 
| 949 | 
        while( (key = (TKey*)next()) ){ | 
| 950 | 
//              cout << key->GetName() << endl; | 
| 951 | 
                if( !strcmp(key->GetName(),"Calorimeter") )CAL__ok = true; | 
| 952 | 
//              if( !strcmp(key->GetName(),"Tracker"    ) )TRK__ok = true; | 
| 953 | 
                if( !strcmp(key->GetName(),"Trigger"    ) )TRG__ok = true; | 
| 954 | 
                if( !strcmp(key->GetName(),"ToF"        ) )TOF__ok = true; | 
| 955 | 
                if( !strcmp(key->GetName(),"S4"         ) )S4__ok = true; | 
| 956 | 
                if( !strcmp(key->GetName(),"NeutronD"   ) )ND__ok = true; | 
| 957 | 
                if( !strcmp(key->GetName(),"Anticounter") )AC__ok = true; | 
| 958 | 
                if( !strcmp(key->GetName(),"OrbitalInfo") )ORB__ok = true; | 
| 959 | 
                if( !strcmp(key->GetName(),"Run"        ) )RUN__ok = true; | 
| 960 | 
                 | 
| 961 | 
                if( !strcmp(key->GetName(),"Tracker"    ) ){ | 
| 962 | 
                        TRK__ok = true; | 
| 963 | 
                        TTree *T = (TTree*)f->Get("Tracker"); | 
| 964 | 
                        for(Int_t i=0; i<T->GetListOfBranches()->GetEntries(); i++){ | 
| 965 | 
                                TString name = T->GetListOfBranches()->At(i)->GetName(); | 
| 966 | 
                                if( !name.CompareTo("TrkLevel1") )TRK_L1__ok=true; | 
| 967 | 
                        }; | 
| 968 | 
                }; | 
| 969 | 
 | 
| 970 | 
        }; | 
| 971 | 
                 | 
| 972 | 
        lk->Delete(); | 
| 973 | 
        f->Close(); | 
| 974 | 
         | 
| 975 | 
        Bool_t FLAG = true; | 
| 976 | 
        if(!RUN__ok) { | 
| 977 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing RunInfo tree"<< endl; | 
| 978 | 
                FLAG = false; | 
| 979 | 
        }; | 
| 980 | 
        if(CAL && !CAL__ok){ | 
| 981 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing Calorimeter tree"<< endl; | 
| 982 | 
                FLAG = false; | 
| 983 | 
        }; | 
| 984 | 
        if(TRK && !TRK__ok){ | 
| 985 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing Tracker tree"<< endl; | 
| 986 | 
                FLAG = false; | 
| 987 | 
        }; | 
| 988 | 
        if(TRK_L1 && !TRK_L1__ok){ | 
| 989 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing Tracker Level1 Branch"<< endl; | 
| 990 | 
                FLAG = false; | 
| 991 | 
        }; | 
| 992 | 
        if(TRG && !TRG__ok){ | 
| 993 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl; | 
| 994 | 
                FLAG = false; | 
| 995 | 
        }; | 
| 996 | 
        if(TOF && !TOF__ok){ | 
| 997 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl; | 
| 998 | 
                FLAG = false; | 
| 999 | 
        }; | 
| 1000 | 
        if(S4 && !S4__ok){ | 
| 1001 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl; | 
| 1002 | 
                FLAG = false; | 
| 1003 | 
        }; | 
| 1004 | 
        if(ND && !ND__ok){ | 
| 1005 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl; | 
| 1006 | 
                FLAG = false; | 
| 1007 | 
        }; | 
| 1008 | 
        if(AC && !AC__ok){ | 
| 1009 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl; | 
| 1010 | 
                FLAG = false; | 
| 1011 | 
        }; | 
| 1012 | 
        if(ORB && !ORB__ok){ | 
| 1013 | 
                cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl; | 
| 1014 | 
                FLAG = false; | 
| 1015 | 
        }; | 
| 1016 | 
         | 
| 1017 | 
        return FLAG; | 
| 1018 | 
         | 
| 1019 | 
}; | 
| 1020 | 
 | 
| 1021 | 
 |