--- PamelaLevel2/src/PamLevel2.cpp 2007/01/18 08:51:16 1.18 +++ PamelaLevel2/src/PamLevel2.cpp 2010/05/11 07:26:27 1.86 @@ -1,627 +1,1683 @@ #include + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// + +void GPamela::Clear() { + Irun = 0; + Ievnt = 0; + Ipa = 0; + X0 = 0.; + Y0 = 0.; + Z0 = 0.; + Theta = 0.; + Phi = 0.; + P0 = 0.; + Nthtof = 0; + Nthcat = 0; + Nthcas = 0; + Nthspe = 0; + Nstrpx = 0; + Nstrpy = 0; + Nthcali = 0; + Nthcal = 0; + Nthnd = 0; + Nthcard = 0; +} + +void GPamela::Delete() { + + Clear(); + + delete[] Ipltof; + delete[] Ipaddle; + delete[] Ipartof; + delete[] Xintof; + delete[] Yintof; + delete[] Zintof; + delete[] Xouttof; + delete[] Youttof; + delete[] Zouttof; + delete[] Ereltof; + delete[] Timetof; + delete[] Pathtof; + delete[] P0tof; + delete[] Iparcat; + delete[] Icat; + delete[] Xincat; + delete[] Yincat; + delete[] Zincat; + delete[] Xoutcat; + delete[] Youtcat; + delete[] Zoutcat; + delete[] Erelcat; + delete[] Timecat; + delete[] Pathcat; + delete[] P0cat; + delete[] Iparcas; + delete[] Icas; + delete[] Xincas; + delete[] Yincas; + delete[] Zincas; + delete[] Xoutcas; + delete[] Youtcas; + delete[] Zoutcas; + delete[] Erelcas; + delete[] Timecas; + delete[] Pathcas; + delete[] P0cas; + delete[] Iparspe; + delete[] Itrpb; + delete[] Itrsl; + delete[] Itspa; + delete[] Xinspe; + delete[] Yinspe; + delete[] Zinspe; + delete[] Xoutspe; + delete[] Youtspe; + delete[] Zoutspe; + delete[] Xavspe; + delete[] Yavspe; + delete[] Zavspe; + delete[] Erelspe; + delete[] Pathspe; + delete[] P0spe; + delete[] Nxmult; + delete[] Nymult; + delete[] Npstripx; + delete[] Ntstripx; + delete[] Istripx; + delete[] Qstripx; + delete[] Xstripx; + delete[] Npstripy; + delete[] Ntstripy; + delete[] Istripy; + delete[] Qstripy; + delete[] Ystripy; + delete[] Icaplane; + delete[] Icastrip; + delete[] Icamod; + delete[] Enestrip; + delete[] Icapl; + delete[] Icasi; + delete[] Icast; + delete[] Xincal; + delete[] Yincal; + delete[] Zincal; + delete[] Erelcal; + delete[] Itubend; + delete[] Iparnd; + delete[] Xinnd; + delete[] Yinnd; + delete[] Zinnd; + delete[] Xoutnd; + delete[] Youtnd; + delete[] Zoutnd; + delete[] Erelnd; + delete[] Timend; + delete[] Pathnd; + delete[] P0nd; + delete[] Iparcard; + delete[] Icard; + delete[] Xincard; + delete[] Yincard; + delete[] Zincard; + delete[] Xoutcard; + delete[] Youtcard; + delete[] Zoutcard; + delete[] Erelcard; + delete[] Timecard; + delete[] Pathcard; + delete[] P0card; + +} +; + +void GPamela::SetBranchAddress(TChain* fhBookTree) { + + // cout << "fhBookTree "<SetBranchAddress("Irun", &Irun); + fhBookTree->SetBranchAddress("Ievnt", &Ievnt); + fhBookTree->SetBranchAddress("Ipa", &Ipa); + fhBookTree->SetBranchAddress("X0", &X0); + fhBookTree->SetBranchAddress("Y0", &Y0); + fhBookTree->SetBranchAddress("Z0", &Z0); + fhBookTree->SetBranchAddress("Theta", &Theta); + fhBookTree->SetBranchAddress("Phi", &Phi); + fhBookTree->SetBranchAddress("P0", &P0); + fhBookTree->SetBranchAddress("Nthtof", &Nthtof); + fhBookTree->SetBranchAddress("Ipltof", Ipltof); + fhBookTree->SetBranchAddress("Ipaddle", Ipaddle); + fhBookTree->SetBranchAddress("Ipartof", Ipartof); + fhBookTree->SetBranchAddress("Xintof", Xintof); + fhBookTree->SetBranchAddress("Yintof", Yintof); + fhBookTree->SetBranchAddress("Zintof", Zintof); + fhBookTree->SetBranchAddress("Xouttof", Xouttof); + fhBookTree->SetBranchAddress("Youttof", Youttof); + fhBookTree->SetBranchAddress("Zouttof", Zouttof); + fhBookTree->SetBranchAddress("Ereltof", Ereltof); + fhBookTree->SetBranchAddress("Timetof", Timetof); + fhBookTree->SetBranchAddress("Pathtof", Pathtof); + fhBookTree->SetBranchAddress("P0tof", P0tof); + fhBookTree->SetBranchAddress("Nthcat", &Nthcat); + fhBookTree->SetBranchAddress("Iparcat", Iparcat); + fhBookTree->SetBranchAddress("Icat", Icat); + fhBookTree->SetBranchAddress("Xincat", Xincat); + fhBookTree->SetBranchAddress("Yincat", Yincat); + fhBookTree->SetBranchAddress("Zincat", Zincat); + fhBookTree->SetBranchAddress("Xoutcat", Xoutcat); + fhBookTree->SetBranchAddress("Youtcat", Youtcat); + fhBookTree->SetBranchAddress("Zoutcat", Zoutcat); + fhBookTree->SetBranchAddress("Erelcat", Erelcat); + fhBookTree->SetBranchAddress("Timecat", Timecat); + fhBookTree->SetBranchAddress("Pathcat", Pathcat); + fhBookTree->SetBranchAddress("P0cat", P0cat); + fhBookTree->SetBranchAddress("Nthcas", &Nthcas); + fhBookTree->SetBranchAddress("Iparcas", Iparcas); + fhBookTree->SetBranchAddress("Icas", Icas); + fhBookTree->SetBranchAddress("Xincas", Xincas); + fhBookTree->SetBranchAddress("Yincas", Yincas); + fhBookTree->SetBranchAddress("Zincas", Zincas); + fhBookTree->SetBranchAddress("Xoutcas", Xoutcas); + fhBookTree->SetBranchAddress("Youtcas", Youtcas); + fhBookTree->SetBranchAddress("Zoutcas", Zoutcas); + fhBookTree->SetBranchAddress("Erelcas", Erelcas); + fhBookTree->SetBranchAddress("Timecas", Timecas); + fhBookTree->SetBranchAddress("Pathcas", Pathcas); + fhBookTree->SetBranchAddress("P0cas", P0cas); + fhBookTree->SetBranchAddress("Nthspe", &Nthspe); + fhBookTree->SetBranchAddress("Iparspe", Iparspe); + fhBookTree->SetBranchAddress("Itrpb", Itrpb); + fhBookTree->SetBranchAddress("Itrsl", Itrsl); + fhBookTree->SetBranchAddress("Itspa", Itspa); + fhBookTree->SetBranchAddress("Xinspe", Xinspe); + fhBookTree->SetBranchAddress("Yinspe", Yinspe); + fhBookTree->SetBranchAddress("Zinspe", Zinspe); + fhBookTree->SetBranchAddress("Xoutspe", Xoutspe); + fhBookTree->SetBranchAddress("Youtspe", Youtspe); + fhBookTree->SetBranchAddress("Zoutspe", Zoutspe); + fhBookTree->SetBranchAddress("Xavspe", Xavspe); + fhBookTree->SetBranchAddress("Yavspe", Yavspe); + fhBookTree->SetBranchAddress("Zavspe", Zavspe); + fhBookTree->SetBranchAddress("Erelspe", Erelspe); + fhBookTree->SetBranchAddress("Pathspe", Pathspe); + fhBookTree->SetBranchAddress("P0spe", P0spe); + fhBookTree->SetBranchAddress("Nxmult", Nxmult); + fhBookTree->SetBranchAddress("Nymult", Nymult); + fhBookTree->SetBranchAddress("Nstrpx", &Nstrpx); + fhBookTree->SetBranchAddress("Npstripx", Npstripx); + fhBookTree->SetBranchAddress("Ntstripx", Ntstripx); + fhBookTree->SetBranchAddress("Istripx", Istripx); + fhBookTree->SetBranchAddress("Qstripx", Qstripx); + fhBookTree->SetBranchAddress("Xstripx", Xstripx); + fhBookTree->SetBranchAddress("Nstrpy", &Nstrpy); + fhBookTree->SetBranchAddress("Npstripy", Npstripy); + fhBookTree->SetBranchAddress("Ntstripy", Ntstripy); + fhBookTree->SetBranchAddress("Istripy", Istripy); + fhBookTree->SetBranchAddress("Qstripy", Qstripy); + fhBookTree->SetBranchAddress("Ystripy", Ystripy); + fhBookTree->SetBranchAddress("Nthcali", &Nthcali); + fhBookTree->SetBranchAddress("Icaplane", Icaplane); + fhBookTree->SetBranchAddress("Icastrip", Icastrip); + fhBookTree->SetBranchAddress("Icamod", Icamod); + fhBookTree->SetBranchAddress("Enestrip", Enestrip); + fhBookTree->SetBranchAddress("Nthcal", &Nthcal); + fhBookTree->SetBranchAddress("Icapl", Icapl); + fhBookTree->SetBranchAddress("Icasi", Icasi); + fhBookTree->SetBranchAddress("Icast", Icast); + fhBookTree->SetBranchAddress("Xincal", Xincal); + fhBookTree->SetBranchAddress("Yincal", Yincal); + fhBookTree->SetBranchAddress("Zincal", Zincal); + fhBookTree->SetBranchAddress("Erelcal", Erelcal); + fhBookTree->SetBranchAddress("Nthnd", &Nthnd); + fhBookTree->SetBranchAddress("Itubend", Itubend); + fhBookTree->SetBranchAddress("Iparnd", Iparnd); + fhBookTree->SetBranchAddress("Xinnd", Xinnd); + fhBookTree->SetBranchAddress("Yinnd", Yinnd); + fhBookTree->SetBranchAddress("Zinnd", Zinnd); + fhBookTree->SetBranchAddress("Xoutnd", Xoutnd); + fhBookTree->SetBranchAddress("Youtnd", Youtnd); + fhBookTree->SetBranchAddress("Zoutnd", Zoutnd); + fhBookTree->SetBranchAddress("Erelnd", Erelnd); + fhBookTree->SetBranchAddress("Timend", Timend); + fhBookTree->SetBranchAddress("Pathnd", Pathnd); + fhBookTree->SetBranchAddress("P0nd", P0nd); + fhBookTree->SetBranchAddress("Nthcard", &Nthcard); + fhBookTree->SetBranchAddress("Iparcard", Iparcard); + fhBookTree->SetBranchAddress("Icard", Icard); + fhBookTree->SetBranchAddress("Xincard", Xincard); + fhBookTree->SetBranchAddress("Yincard", Yincard); + fhBookTree->SetBranchAddress("Zincard", Zincard); + fhBookTree->SetBranchAddress("Xoutcard", Xoutcard); + fhBookTree->SetBranchAddress("Youtcard", Youtcard); + fhBookTree->SetBranchAddress("Zoutcard", Zoutcard); + fhBookTree->SetBranchAddress("Erelcard", Erelcard); + fhBookTree->SetBranchAddress("Timecard", Timecard); + fhBookTree->SetBranchAddress("Pathcard", Pathcard); + fhBookTree->SetBranchAddress("P0card", P0card); + + // fhBookTree->SetBranchStatus("*",0); + +} + +ClassImp( GPamela); + +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// //-------------------------------------- // // //-------------------------------------- /** - * Default constructor + * Default constructor */ -PamTrack::PamTrack(){ - trk_track = 0; - calo_track = 0; - tof_track = 0; - candeleteobj = 0; -}; +PamTrack::PamTrack() { + trk_track = 0; + calo_track = 0; + tof_track = 0; + orb_track = 0; + candeleteobj = 0; + pscore = 0; + iscore = 0; +} +; //-------------------------------------- // // //-------------------------------------- /** - * Constructor + * Constructor */ -PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o){ +PamTrack::PamTrack(TrkTrack* t, CaloTrkVar* c, ToFTrkVar* o, OrbitalInfoTrkVar *r) { - trk_track = 0; - calo_track = 0; - tof_track = 0; -// if(t)trk_track = new TrkTrack(*t); -// if(c)calo_track = new CaloTrkVar(*c); -// if(o)tof_track = new ToFTrkVar(*o); - if(t)trk_track = t; - if(c)calo_track = c; - if(o)tof_track = o; - candeleteobj = 0; - -}; -PamTrack::PamTrack(const PamTrack& track){ - - TrkTrack *t = track.trk_track; - CaloTrkVar *c = track.calo_track; - ToFTrkVar *o = track.tof_track; + trk_track = 0; + calo_track = 0; + tof_track = 0; + orb_track = 0; + // if(t)trk_track = new TrkTrack(*t); + // if(c)calo_track = new CaloTrkVar(*c); + // if(o)tof_track = new ToFTrkVar(*o); + if (t) + trk_track = t; + if (c) + calo_track = c; + if (o) + tof_track = o; + if (r) + orb_track = r; + + candeleteobj = 0; + +} +; +PamTrack::PamTrack(const PamTrack& track) { - trk_track = 0; + TrkTrack *t = track.trk_track; + CaloTrkVar *c = track.calo_track; + ToFTrkVar *o = track.tof_track; + OrbitalInfoTrkVar *r = track.orb_track; + + trk_track = 0; + calo_track = 0; + tof_track = 0; + orb_track = 0; + if (t) + trk_track = new TrkTrack(*t); + if (c) + calo_track = new CaloTrkVar(*c); + if (o) + tof_track = new ToFTrkVar(*o); + if (r) + orb_track = new OrbitalInfoTrkVar(*r); + candeleteobj = 1; + +} +void PamTrack::Clear() { + + // cout << "PamTrack::Clear() "<TrkTrack::Clear(); + if (calo_track) + calo_track->CaloTrkVar::Clear();//??? + if (tof_track) + tof_track->ToFTrkVar::Clear();//??? + if (orb_track) + orb_track->OrbitalInfoTrkVar::Clear();//??? + } + else { + trk_track = 0; calo_track = 0; - tof_track = 0; - if(t)trk_track = new TrkTrack(*t); - if(c)calo_track = new CaloTrkVar(*c); - if(o)tof_track = new ToFTrkVar(*o); - candeleteobj = 1; - -} -void PamTrack::Clear(){ - -// cout << "PamTrack::Clear() "<TrkTrack::Clear(); - if(calo_track) calo_track->CaloTrkVar::Clear();//??? - if(tof_track) tof_track->ToFTrkVar::Clear();//??? - }else{ - trk_track = 0; - calo_track = 0; - tof_track = 0; - } -} -void PamTrack::Delete(){ -// cout << "PamTrack::Delete() "<TrkTrack::Clear(); - delete trk_track; - } - if(calo_track){ - calo_track->CaloTrkVar::Clear();//??? - delete calo_track; - } - if(tof_track){ - tof_track->ToFTrkVar::Clear();//??? - delete tof_track; - } - }else{ - Clear(); + tof_track = 0; + orb_track = 0; + } + pscore = 0; + iscore = 0; + +} +void PamTrack::Delete() { + // cout << "PamTrack::Delete() "<TrkTrack::Clear(); + delete trk_track; + } + if (calo_track) { + calo_track->CaloTrkVar::Clear();//??? + delete calo_track; + } + if (tof_track) { + tof_track->ToFTrkVar::Clear();//??? + delete tof_track; + } + if (orb_track) { + orb_track->OrbitalInfoTrkVar::Clear();//??? + delete orb_track; } + } + else { + Clear(); + } } //-------------------------------------- // // //-------------------------------------- /** - * Constructor - */ -PamLevel2::PamLevel2(){ - -// trk2_obj = TrkLevel2::GetTrkLevel2(); -// trk1_obj = TrkLevel1::GetTrkLevel1(); -// trkh_obj = TrkHough::GetTrkHough(); -// calo1_obj = CaloLevel1::GetCaloLevel1(); -// calo2_obj = CaloLevel2::GetCaloLevel2(); -// tof_obj = ToFLevel2::GetToFLevel2(); -// trig_obj = TrigLevel2::GetTrigLevel2(); -// s4_obj = S4Level2::GetS4Level2(); -// nd_obj = NDLevel2::GetNDLevel2(); -// ac_obj = AcLevel2::GetAcLevel2(); -// orb_obj = OrbitalInfo::GetOrbitalInfo(); - trk2_obj = 0; - trk1_obj = 0; - trkh_obj = 0; - calo1_obj = 0; - calo2_obj = 0; - tof_obj = 0; - trig_obj = 0; - s4_obj = 0; - nd_obj = 0; - ac_obj = 0; - orb_obj = 0; - - run_obj = 0;//new GL_RUN(); - soft_obj = 0;// Emiliano - irun = -1; - runfirstentry = 0ULL; - runlastentry = 0ULL; + * Default Constructor + */ +PamLevel2::PamLevel2() { + Initialize(); +} +; + +/** + * Constructor + * @param ddir Name of directory where level2 files are stored. + * @param list Name of an ascii file containing the list of file names + * @param detlist Options to chose what to load. + * Possible options are: + * +AUTO --> load all trees/branches in the input files + * +(-)ALL --> inlcude(exclude) all trees/branches + * +(-)TRK1+(-)TRK2+(-)CAL1+(-)CAL2+(-)TOF+(-)TRG+(-)ND+(-)S4+(-)ORB+(-)AC --> inlcude(exclude) trees and branches + * +(-)TRK0 --> include(exclude) tracker level0 tree + * +(-)GP --> include exclude GPAMELA output tree + * If no options are specified, the default is assumed. Default is: + * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB + */ +PamLevel2::PamLevel2(TString ddir, TString llist, TString detlist) { + Initialize(); + TList* listf = GetListOfLevel2Files(ddir, llist); + if (listf) + GetPamTree(listf, detlist); + if (listf) + GetRunTree(listf); +} +; - for(Int_t i=0; i<8; i++ )tree_clone[i]=NULL; +PamLevel2::PamLevel2(TString ddir, TList *llist, TString detlist) { + Initialize(); + GetPamTree(llist, detlist); + GetRunTree(llist); +} +; +/** + * Constructor + * @param ddir Name of directory where level2 files are stored. + * @param list Name of an ascii file containing the list of file names + * Default trees/branches are loaded. Default is: + * +TRK2+CAL2+CAL1+TOF+TRG+ND+AC+S4+ORB + */ +PamLevel2::PamLevel2(TString ddir, TString llist) { + Initialize(); + TList* listf = GetListOfLevel2Files(ddir, llist); + GetPamTree(listf, ""); + GetRunTree(listf); +} +; -// sorted_tracks = 0;//new TRefArray(); - - CAL1 = true; - CAL2 = true; - TRK2 = true; - TRK1 = false; - TRKh = false; - TRG = true; - TOF = true; - S4 = true; - ND = true; - AC = true; - ORB = true; - - RUN = true; +void PamLevel2::Initialize() { - tsorted=0; - timage=0; + h0_obj = 0; + trk0_obj = 0; + calo0_obj = 0; + + trk2_obj = 0; + trk1_obj = 0; + trkh_obj = 0; + calo1_obj = 0; + calo2_obj = 0; + tof_obj = 0; + trig_obj = 0; + s4_obj = 0; + nd_obj = 0; + ac_obj = 0; + orb_obj = 0; + gp_obj = 0; + + run_obj = 0;//new GL_RUN(); + soft_obj = 0;// Emiliano + irun = -1LL; + irunt = -1LL; + runfirstentry = 0LL; + runlastentry = 0LL; + gltsync = 0; // Emiliano + fUpdateRunInfo = true; // Emiliano + + l0_file = NULL; + l0_tree = NULL; + iroot = -1; + dbc = 0; + + prevshift = 0; + maxshift = 10; //EMILIANO + + run_tree = NULL; + run_tree_clone = NULL; + sel_tree = NULL; + sel_tree_clone = NULL; + + irunentry = -1LL; + pam_tree = NULL; + for (Int_t i = 0; i < NCLONES; i++) + pam_tree_clone[i] = NULL; + + totdltime[0] = 0LL; + totdltime[1] = 0LL; + totdltime[2] = 0LL; + + host = "mysql://localhost/pamelaprod"; + user = "anonymous"; + psw = ""; + const char *pamdbhost = gSystem->Getenv("PAM_DBHOST"); + const char *pamdbuser = gSystem->Getenv("PAM_DBUSER"); + const char *pamdbpsw = gSystem->Getenv("PAM_DBPSW"); + if (!pamdbhost) + pamdbhost = ""; + if (!pamdbuser) + pamdbuser = ""; + if (!pamdbpsw) + pamdbpsw = ""; + if (strcmp(pamdbhost, "")) + host = pamdbhost; + if (strcmp(pamdbuser, "")) + user = pamdbuser; + if (strcmp(pamdbpsw, "")) + psw = pamdbpsw; + + // sorted_tracks = 0;//new TRefArray(); + + CAL0 = false; + CAL1 = true; + CAL2 = true; + TRK2 = true; + TRK1 = false; + TRK0 = false; + TRKh = false; + TRG = true; + TOF = true; + TOF0 = false; + S4 = true; + ND = true; + AC = true; + ORB = true; + GP = false; + + RUN = true; + + SELLI = -1; + + ISGP = false; + + DBG = false; + + tsorted = 0; + timage = 0; + + howtosort = "+CAL+TOF"; + //howtosort = "+TOF"; + sortthr = 100.; -}; + issorted = false; + lastsorted = -1; + +} +; /** * Delete the event (act as Dtor) */ -void PamLevel2::Delete(){ - - if(run_obj)delete run_obj; - if(soft_obj)delete soft_obj; //Emiliano - -// cout << "void PamLevel2::Clear()"<Delete(); - delete tsorted; - } - if(timage){ - timage->Delete(); - delete timage; - } -}; +void PamLevel2::Delete() { + + if (run_obj) + delete run_obj; + if (soft_obj) + delete soft_obj; //Emiliano + + // cout << "void PamLevel2::Clear()"<Delete(); + delete tsorted; + } + if (timage) { + timage->Delete(); + delete timage; + } + + if (dbc) { + dbc->Close(); + delete dbc; + dbc=0; + } + + if (gltsync) + delete gltsync; + + if (l0_file) + l0_file->Close(); + // if(pam_tree)pam_tree->Delete();; + + if (pam_tree) { + // + // we have first to find which chains we have to delete, then delete the main chain and only after delete the friend chains. Any other order causes a segfault... + // + TList *temp = pam_tree->GetListOfFriends(); + TList *contents = new TList; // create chain friend list + contents->SetOwner(); + TIter next(temp); + TChain *questo = 0; + while ((questo = (TChain*) next())) { + TString name = questo->GetName(); + contents->Add((TChain*) gROOT->FindObject(name.Data()));// add object to the list + }; + // + // deleting the main chain + // + pam_tree->Delete(); + // + // deleting the friends... + // + TIter next2(contents); + TChain *questa = 0; + while ( (questa = (TChain*)next2()) ) { + TString name = questa->GetName(); + questa->Delete(); + questa = NULL; + }; + // + }; + pam_tree = NULL; + + if (run_tree) + run_tree->Delete();; + if (sel_tree) + sel_tree->Delete();; + for (Int_t i = 0; i < NCLONES; i++) + if (pam_tree_clone[i]) + pam_tree_clone[i]->Delete();; + if (run_tree_clone) + run_tree_clone->Delete();; + if (sel_tree_clone) + sel_tree_clone->Delete();; + + if (irunoffset) + delete[] irunoffset; + +} +; /** * Clear the event (NB! does not deallocate objects) */ -void PamLevel2::Clear(){ - -// cout << "void PamLevel2::Clear()"<Clear(); // Emiliano: Do not deallocate run_obj here, it will give segmentation fault! call clear instead + // if(soft_obj) soft_obj->Clear(); + + if (h0_obj) + h0_obj->Clear(); + // if(trk0_obj) trk0_obj->Clear(); + if (trk1_obj) + trk1_obj->Clear(); + if (trk2_obj) + trk2_obj->Clear(); + if (trkh_obj) + trkh_obj->Clear(); + if (calo0_obj) + calo0_obj->Clear(); + if (calo1_obj) + calo1_obj->Clear(); + if (calo2_obj) + calo2_obj->Clear(); + if (tof_obj) + tof_obj->Clear(); + if (trig_obj) + trig_obj->Clear(); + if (s4_obj) + s4_obj->Clear(); + if (nd_obj) + nd_obj->Clear(); + if (ac_obj) + ac_obj->Clear(); + if (orb_obj) + orb_obj->Clear(); + if (gp_obj) + gp_obj->Clear(); + + // if(sorted_tracks)sorted_tracks->Clear(); + // sorted_tracks.Clear(); + + if (tsorted) { + tsorted->Delete(); + } + if (timage) { + timage->Delete(); + } +} +; + +void PamLevel2::Reset() { + // + // First of all clear everything + // + Clear(); + // + // close and reset chains and pointers + // + if (pam_tree) { + // + // we have first to find which chains we have to delete, then delete the main chain and only after delete the friend chains. Any other order causes a segfault... + // + TList *temp = pam_tree->GetListOfFriends(); + TList *contents = new TList; // create chain friend list + contents->SetOwner(); + TIter next(temp); + TChain *questo = 0; + while ((questo = (TChain*) next())) { + TString name = questo->GetName(); + contents->Add((TChain*) gROOT->FindObject(name.Data()));// add object to the list + }; + // + // deleting the main chain + // + pam_tree->Delete(); + // + // deleting the friends... + // + TIter next2(contents); + TChain *questa = 0; + while ( (questa = (TChain*) next2()) ) { + TString name = questa->GetName(); + questa->Delete(); + questa = NULL; + }; + // + }; + pam_tree = NULL; + // + if (run_tree) + run_tree->Delete();; + run_tree = NULL; + if (sel_tree) + sel_tree->Delete();; + sel_tree = NULL; + // + // Close file + // + if (l0_file) + l0_file->Close("R"); + l0_file = NULL; + // + h0_obj = 0; + trk0_obj = 0; + calo0_obj = 0; + // + trk2_obj = 0; + trk1_obj = 0; + trkh_obj = 0; + calo1_obj = 0; + calo2_obj = 0; + tof_obj = 0; + trig_obj = 0; + s4_obj = 0; + nd_obj = 0; + ac_obj = 0; + orb_obj = 0; + gp_obj = 0; + // + // Reset run pointers + // + run_obj = 0;//new GL_RUN(); + soft_obj = 0;// Emiliano + irun = -1; + irunt = -1; + runfirstentry = 0ULL; + runlastentry = 0ULL; + // + totdltime[0] = 0LL; + totdltime[1] = 0LL; + totdltime[2] = 0LL; + // +} +; + +Bool_t PamLevel2::IsGood(Bool_t strict) { + Bool_t goodev = true; + // + if (calo2_obj && !calo2_obj->IsGood(strict)) + goodev = false; + // + if (strict) { + if (trk2_obj && trk2_obj->UnpackError() != 0) + goodev = false; + if (tof_obj && tof_obj->unpackError != 0) + goodev = false; + if (trig_obj && trig_obj->unpackError != 0) + goodev = false; + if (s4_obj && s4_obj->unpackError != 0) + goodev = false; + if (nd_obj && nd_obj->unpackError != 0) + goodev = false; + if (ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0] >> 2) & 1) || ((ac_obj->status[1] >> 2) & 1))) + goodev = false; + // if(orb_obj) + } + else { + if (nd_obj && nd_obj->unpackError != 0) + goodev = false; + if (ac_obj && (ac_obj->unpackError != 0 || ((ac_obj->status[0] >> 2) & 1) || ((ac_obj->status[1] >> 2) & 1))) + goodev = false; + }; + return (goodev); +} +; + +void PamLevel2::SkipRunInfoUpdate(){ + printf("\n\n ******** WARNING ******** \n Skip DB connections, DO NOT USE PamLevel2::GetRunInfo() method! \n\n"); + fUpdateRunInfo = false; + this->SetSELLI(2); + printf(" ===============> W A R N I N G <================ \n"); + printf(" in case PamLevel2::CreateCloneTrees() will be called \n"); + printf(" it will be reverted to PadmeAmidala level2 structure , i.e. NO SELECTIONLIST WILL BE CREATED IN THE NEW LEVEL2 FILE! \n\n"); + if ( run_tree_clone ){ + printf(" ===============> W A R N I N G <================ \n"); + printf(" PamLevel2::SkipRunIndoUpdate or PamLevel2::NoDBconnections() has been called together with PamLevel2::CreateCloneTrees() \n"); + printf(" TO AVOID CRASHES call PamLevel2::CreateCloneTrees() after PamLevel2::SkipRunIndoUpdate or PamLevel2::NoDBconnections() \n"); + }; +} +//-------------------------------------- // -// This method is called once for every entry but RunInfo and SoftInfo do not change until the next run so we cannot clear them here unless we don't -// want to load them for each event even if they are the same... // -// if(run_obj)delete run_obj; -// if(run_obj) run_obj->Clear(); // Emiliano: Do not deallocate run_obj here, it will give segmentation fault! call clear instead -// if(soft_obj) soft_obj->Clear(); +//-------------------------------------- +void *PamLevel2::GetPointerTo(const char* c) { - if(trk1_obj) trk1_obj->Clear(); - if(trk2_obj) trk2_obj->Clear(); - if(trkh_obj) trkh_obj->Clear(); - if(calo1_obj)calo1_obj->Clear(); - if(calo2_obj)calo2_obj->Clear(); - if(tof_obj) tof_obj->Clear(); - if(trig_obj) trig_obj->Clear(); - if(s4_obj) s4_obj->Clear(); - if(nd_obj) nd_obj->Clear(); - if(ac_obj) ac_obj->Clear(); - if(orb_obj) orb_obj->Clear(); - -// if(sorted_tracks)sorted_tracks->Clear(); -// sorted_tracks.Clear(); + TString objname = c; - if(tsorted){ - tsorted->Delete(); + if (!objname.CompareTo("TrkLevel1")) { + if (!trk1_obj) { + trk1_obj = new TrkLevel1(); + trk1_obj->Set(); + } + return &trk1_obj; + }; + if (!objname.CompareTo("TrkLevel2")) { + if (!trk2_obj) { + trk2_obj = new TrkLevel2(); + trk2_obj->Set(); + } + return &trk2_obj; + }; + if (!objname.CompareTo("TrkHough")) { + if (!trkh_obj) { + trkh_obj = new TrkHough(); + trkh_obj->Set(); + } + return &trkh_obj; + }; + if (!objname.CompareTo("CaloLevel1")) { + if (!calo1_obj) + calo1_obj = new CaloLevel1(); + return &calo1_obj; + }; + if (!objname.CompareTo("CaloLevel2")) { + if (!calo2_obj) { + calo2_obj = new CaloLevel2(); + calo2_obj->Set(); + }; + return &calo2_obj; + }; + if (!objname.CompareTo("ToFLevel2")) { + if (!tof_obj) { + tof_obj = new ToFLevel2(); + tof_obj->Set(); } - if(timage){ - timage->Delete(); + return &tof_obj; + }; + if (!objname.CompareTo("TrigLevel2")) { + if (!trig_obj) + trig_obj = new TrigLevel2(); + return &trig_obj; + }; + if (!objname.CompareTo("S4Level2")) { + if (!s4_obj) + s4_obj = new S4Level2(); + return &s4_obj; + }; + if (!objname.CompareTo("NDLevel2")) { + if (!nd_obj) + nd_obj = new NDLevel2(); + return &nd_obj; + }; + if (!objname.CompareTo("AcLevel2")) { + if (!ac_obj) + ac_obj = new AcLevel2(); + return &ac_obj; + }; + if (!objname.CompareTo("OrbitalInfo")) { + if (!orb_obj) { + orb_obj = new OrbitalInfo(); + orb_obj->Set(); } - -}; + return &orb_obj; + }; + // if(!objname.CompareTo("OrbitalInfo")){ + // if(!orb_obj) orb_obj = new OrbitalInfo(); + // return &orb_obj; + // }; + if (!objname.CompareTo("GPamela")) { + if (!gp_obj) + gp_obj = new GPamela(); + return &gp_obj; + }; + if (!objname.CompareTo("RunInfo")) + return &run_obj; + if (!objname.CompareTo("SoftInfo")) + return &soft_obj; // Emiliano + + return NULL; +} +; //-------------------------------------- // // //-------------------------------------- -void *PamLevel2::GetPointerTo(const char* c ){ +/** + * Retrieves the calorimeter track matching the seqno-th tracker stored track. + * (If seqno = -1 retrieves the self-trigger calorimeter track) + */ +CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno) { - TString objname = c; + if (!calo2_obj) + return 0; - if(!objname.CompareTo("TrkLevel1")) { - if(!trk1_obj){ - trk1_obj = new TrkLevel1(); - trk1_obj->Set(); - } - return &trk1_obj; - }; - if(!objname.CompareTo("TrkLevel2")) { - if(!trk2_obj){ - trk2_obj = new TrkLevel2(); - trk2_obj->Set(); - } - return &trk2_obj; - }; - if(!objname.CompareTo("TrkHough")) { - if(!trkh_obj) trkh_obj = new TrkHough(); - return &trkh_obj; - }; - if(!objname.CompareTo("CaloLevel1")) { - if(!calo1_obj) calo1_obj = new CaloLevel1(); - return &calo1_obj; - }; - if(!objname.CompareTo("CaloLevel2")) { - if(!calo2_obj){ - calo2_obj = new CaloLevel2(); - calo2_obj->Set(); - }; - return &calo2_obj; - }; - if(!objname.CompareTo("ToFLevel2")) { - if(!tof_obj){ - tof_obj = new ToFLevel2(); - tof_obj->Set(); - } - return &tof_obj; - }; - if(!objname.CompareTo("TrigLevel2")) { - if(!trig_obj) trig_obj = new TrigLevel2(); - return &trig_obj; - }; - if(!objname.CompareTo("S4Level2")) { - if(!s4_obj) s4_obj = new S4Level2(); - return &s4_obj; - }; - if(!objname.CompareTo("NDLevel2")) { - if(!nd_obj) nd_obj = new NDLevel2(); - return &nd_obj; - }; - if(!objname.CompareTo("AcLevel2")) { - if(!ac_obj) ac_obj = new AcLevel2(); - return &ac_obj; - }; - if(!objname.CompareTo("OrbitalInfo")){ - if(!orb_obj) orb_obj = new OrbitalInfo(); - return &orb_obj; - }; - - if(!objname.CompareTo("RunInfo"))return &run_obj; + if (calo2_obj->CaloLevel2::ntrk() == 0) { + cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo " << seqno + << " but no Calorimeter tracks are stored" << endl; + return NULL; + }; + + CaloTrkVar *c = 0; + Int_t it_calo = 0; + + do { + c = calo2_obj->CaloLevel2::GetCaloTrkVar(it_calo); + it_calo++; + } while (c && seqno != c->trkseqno && it_calo < calo2_obj->CaloLevel2::ntrk()); + + if (!c || seqno != c->trkseqno) { + c = 0; + if (seqno != -1) + cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo " << seqno + << " does not match Calorimeter stored tracks" << endl; + }; + return c; + +} +; +//-------------------------------------- +// +// +//-------------------------------------- +/** + * Retrieves the ToF track matching the seqno-th tracker stored track. + * (If seqno = -1 retrieves the tracker-independent tof track) + */ +ToFTrkVar *PamLevel2::GetToFStoredTrack(int seqno) { - if(!objname.CompareTo("SoftInfo"))return &soft_obj; // Emiliano + if (!tof_obj) + return 0; + if (tof_obj->ToFLevel2::ntrk() == 0) { + cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo " << seqno << " but no ToF tracks are stored" + << endl; return NULL; -}; + }; + + ToFTrkVar *c = 0; + Int_t it_tof = 0; + + do { + c = tof_obj->ToFLevel2::GetToFTrkVar(it_tof); + it_tof++; + } while (c && seqno != c->trkseqno && it_tof < tof_obj->ToFLevel2::ntrk()); + + if (!c || seqno != c->trkseqno) { + c = 0; + if (seqno != -1) + cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo " << seqno + << " does not match ToF stored tracks" << endl; + }; + return c; + +} +; + //-------------------------------------- // // //-------------------------------------- /** - * Retrieves the calorimeter track matching the seqno-th tracker stored track. - * (If seqno = -1 retrieves the self-trigger calorimeter track) + * Retrieves the OrbitalInfo track matching the seqno-th tracker stored track. + * (If seqno = -1 retrieves the tracker-independent tof related track) + */ +OrbitalInfoTrkVar *PamLevel2::GetOrbitalInfoStoredTrack(int seqno) { + + if (!orb_obj) + return 0; + + if (orb_obj->OrbitalInfo::ntrk() == 0) { + // // TRICK BEGIN + // OrbitalInfoTrkVar *r = new OrbitalInfoTrkVar(); // TEMPORARY TRICK + // Int_t nn = 0; + // TClonesArray &tor = *orb_obj->OrbitalInfoTrk; + // for(Int_t nt=0; nt < tof_obj->ToFLevel2::ntrk(); nt++){ + // // + // ToFTrkVar *ptt = tof_obj->ToFLevel2::GetToFTrkVar(nt); + // if ( ptt->trkseqno != -1 ){ + // // + // r->trkseqno = ptt->trkseqno; + // // + // r->Eij = 0; + // // + // r->Sij = 0; + // // + // r->pitch = -1000.; + // // + // r->cutoff = -1000.; + // // + // new(tor[nn]) OrbitalInfoTrkVar(*r); + // nn++; + // // + // r->Clear(); + // // + // }; + // }; + // delete r; + // OrbitalInfoTrkVar *c = 0; + // c = orb_obj->OrbitalInfo::GetOrbitalInfoTrkVar(0); + // return c; + // //TRICK END + cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo " << seqno + << " but no OrbitalInfo tracks are stored" << endl; + return NULL; + }; + + OrbitalInfoTrkVar *c = 0; + Int_t it_tof = 0; + + do { + c = orb_obj->OrbitalInfo::GetOrbitalInfoTrkVar(it_tof); + it_tof++; + } while (c && seqno != c->trkseqno && it_tof < orb_obj->OrbitalInfo::ntrk()); + + if (!c || seqno != c->trkseqno) { + c = 0; + if (seqno != -1) + cout << "PamLevel2::GetOrbitalInfoStoredTrack(int) : requested tracker SeqNo " << seqno + << " does not match OrbitalInfo stored tracks" << endl; + }; + return c; + +} +; + +//-------------------------------------- +// +// +//-------------------------------------- +/** + * Give the pamela track associated to a tracker track, retrieving related calorimeter, orbitalinfo and tof track information. */ - CaloTrkVar *PamLevel2::GetCaloStoredTrack(int seqno){ - - if( !calo2_obj )return 0; - - if( calo2_obj->CaloLevel2::ntrk()==0 ){ - cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no Calorimeter tracks are stored"<CaloLevel2::GetCaloTrkVar(it_calo); - it_calo++; - } while( c && seqno != c->trkseqno && it_calo < calo2_obj->CaloLevel2::ntrk()); - - if(!c || seqno != c->trkseqno){ - c = 0; - if(seqno!=-1)cout << "PamLevel2::GetCaloStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match Calorimeter stored tracks"<ToFLevel2::ntrk()==0 ){ - cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" but no ToF tracks are stored"<ToFLevel2::GetToFTrkVar(it_tof); - it_tof++; - } while( c && seqno != c->trkseqno && it_tof < tof_obj->ToFLevel2::ntrk()); - - if(!c || seqno != c->trkseqno){ - c = 0; - if(seqno!=-1)cout << "PamLevel2::GetToFStoredTrack(int) : requested tracker SeqNo "<< seqno <<" does not match ToF stored tracks"<GetSeqNo()); - if(TOF) o = GetToFStoredTrack(t->GetSeqNo()); - -// if(t && c && o)track = new PamTrack(t,c,o); - PamTrack *track = new PamTrack(t,c,o); - - return track; - - }; +PamTrack* PamLevel2::GetPamTrackAlong(TrkTrack* t) { + + cout << "PamLevel2::GetPamTrackAlong(TrkTrack* t) **obsolete** " << endl; + cout << "(if you use it, remember to delete the PamTrack object)" << endl; + + CaloTrkVar *c = 0; + ToFTrkVar *o = 0; + OrbitalInfoTrkVar *r = 0; + + if (CAL2) + c = GetCaloStoredTrack(t->GetSeqNo()); + if (TOF) + o = GetToFStoredTrack(t->GetSeqNo()); + if (ORB) + r = GetOrbitalInfoStoredTrack(t->GetSeqNo()); + + // if(t && c && o)track = new PamTrack(t,c,o); + PamTrack *track = new PamTrack(t, c, o, r); + + return track; + +} +; //-------------------------------------- // // //-------------------------------------- /** - * Retrieves the it-th stored track. - * It override TrkLevel2::GetTrack(int it). + * Retrieves the it-th stored track. + * It override TrkLevel2::GetTrack(int it). * @param itrk Track number, ranging from 0 to GetNTracks(). */ -PamTrack* PamLevel2::GetStoredTrack(Int_t itrk){ - - cout <<"PamLevel2::GetStoredTrack(Int_t itrk) **to-be-updated** "<=0 && itrk < trk2_obj->TrkLevel2::ntrk() ){ - - TrkTrack *t = trk2_obj->TrkLevel2::GetStoredTrack(itrk); - track = GetPamTrackAlong(t); - - +PamTrack* PamLevel2::GetStoredTrack(Int_t itrk) { + + cout << "PamLevel2::GetStoredTrack(Int_t itrk) **to-be-updated** " << endl; + cout + << "for the moment, better use separately the methods: TrkLevel2::GetStoredTrack(seqno) CaloLevel2::GetCaloTrkVar(Int_t notrack) ToFLevel2::GetToFTrkVar(Int_t notrack) OrbitalInfo::GetOrbitalInfoTrkVar(Int_t notrack)" + << endl; + cout << "(if you use it, remember to delete the PamTrack object)" << endl; + PamTrack *track = 0; + + if (itrk >= 0 && itrk < trk2_obj->TrkLevel2::ntrk()) { + + TrkTrack *t = trk2_obj->TrkLevel2::GetStoredTrack(itrk); + track = GetPamTrackAlong(t); + + } + else { + cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo " << itrk << " does not exist (GetNTracks() = " + << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl; + }; + + return track; - }else{ - cout << "PamLevel2::GetStoredTrack(int) : tracker track SeqNo "<< itrk <<" does not exist (GetNTracks() = "<TrkLevel2::GetNTracks()<<")"<GetNTracks()); + tsorted->Delete(); + TClonesArray &ttsorted = *tsorted; + + if (!timage) + timage = new TClonesArray("PamTrack", trk2_obj->GetNTracks()); + timage->Delete(); + TClonesArray &ttimage = *timage; + + //-------------------------------------------------- + // retrieve sorting method + //-------------------------------------------------- + Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase); + Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase); + Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase); + Bool_t use_S1 = how.Contains("S1", TString::kIgnoreCase); + Bool_t use_S2 = how.Contains("S2", TString::kIgnoreCase); + Bool_t use_S3 = how.Contains("S3", TString::kIgnoreCase); + Bool_t use_GP = how.Contains("GP", TString::kIgnoreCase); + + if (use_TOF) { + use_S1 = true; + use_S2 = true; + use_S3 = true; + }; + if (!CAL2 && use_CAL) + use_CAL = false; + if (!TOF) { + use_TOF = false; + use_S1 = false; + use_S2 = false; + use_S3 = false; + } + if (!GP) { + use_GP = false; + } + + if (!TRK2) { + cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl; + return; + }; + + // cout << "use_CAL "<TrkLevel2::GetNTracks(); i++) { + + TrkTrack *ts = 0; + CaloTrkVar *cs = 0; + ToFTrkVar *os = 0; + OrbitalInfoTrkVar *rs = 0; + + // get tracker tracks + TrkTrack *tp = trk2_obj->TrkLevel2::GetTrack(i); //tracker + CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo()); + ToFTrkVar *op = GetToFStoredTrack(tp->GetSeqNo()); + OrbitalInfoTrkVar *rp = GetOrbitalInfoStoredTrack(tp->GetSeqNo()); + + TrkTrack *ti = 0; //tracker (image) + CaloTrkVar *ci = 0; + ToFTrkVar *oi = 0; + OrbitalInfoTrkVar *ri = 0; + // cout << "trk track n. "<HasImage()) { + + ti = trk2_obj->TrkLevel2::GetTrackImage(i); //tracker (image) + ci = GetCaloStoredTrack(ti->GetSeqNo()); + oi = GetToFStoredTrack(ti->GetSeqNo()); + ri = GetOrbitalInfoStoredTrack(ti->GetSeqNo()); + + // cout << "its image "<npresh > ci->npresh && true) { + tp_score++; + totp_score++; + }; + if (cp->npresh < ci->npresh && true) { + ti_score++; + toti_score++; + }; + + // cout << "CALO "<npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih)); + if (pl == 2 || pl == 3 || pl == 4 || pl == 5) + sen += (op->dedx).At(ih); + }; + for (Int_t ih = 0; ih < oi->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih)); + if (pl == 2 || pl == 3 || pl == 4 || pl == 5) + sen += (oi->dedx).At(ih); + }; + // + if (sen >= sortthr && false) { // temporary disabled NUCLEI special algorithm since the new one should work for every particle (to be checked!) + //printf(" IS A NUCLEUS! en = %f \n",sen); + // + // is a nucleus use a different algorithm + // + Int_t nz = 6; + Float_t zin[6]; // << define TOF z-coordinates + for (Int_t ip = 0; ip < nz; ip++) + zin[ip] = tof_obj->ToFLevel2::GetZTOF(tof_obj->ToFLevel2::GetToFPlaneID(ip)); // << read ToF plane z-coordinates + Trajectory *tr = new Trajectory(nz, zin); + // + Int_t nphit_p = 0; + Int_t nphit_i = 0; + Float_t enhit_p = 0.; + Float_t enhit_i = 0.; + // + for (Int_t ih = 0; ih < op->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih)); + if (pl == 1 || pl == 2 || pl == 5) { + nphit_p++; + enhit_p += (op->dedx).At(ih); + }; + }; + // + tp->DoTrack2(tr); + // + if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) { + for (Int_t ih = 0; ih < op->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih)); + if (pl == 0) { + nphit_p++; + enhit_p += (op->dedx).At(ih); + }; + }; + }; + if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) { + for (Int_t ih = 0; ih < op->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih)); + if (pl == 3) { + nphit_p++; + enhit_p += (op->dedx).At(ih); + }; + }; + }; + if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) { + for (Int_t ih = 0; ih < op->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((op->pmtadc).At(ih)); + if (pl == 4) { + nphit_p++; + enhit_p += (op->dedx).At(ih); + }; + }; + }; + + for (Int_t ih = 0; ih < oi->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih)); + if (pl == 1 || pl == 2 || pl == 5) { + nphit_i++; + enhit_i += (op->dedx).At(ih); + }; + }; + // + ti->DoTrack2(tr); + // + if (fabs(tr->y[0] - oi->ytofpos[0]) < 2.) { + for (Int_t ih = 0; ih < oi->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih)); + if (pl == 0) { + nphit_i++; + enhit_i += (op->dedx).At(ih); + }; + }; + }; + if (fabs(tr->y[3] - oi->ytofpos[1]) < 2.) { + for (Int_t ih = 0; ih < oi->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih)); + if (pl == 3) { + nphit_i++; + enhit_i += (op->dedx).At(ih); + }; + }; + }; + if (fabs(tr->y[4] - oi->ytofpos[2]) < 2.) { + for (Int_t ih = 0; ih < oi->npmtadc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((oi->pmtadc).At(ih)); + if (pl == 4) { + nphit_i++; + enhit_i += (op->dedx).At(ih); + }; + }; + }; + + if ((use_TOF || use_S1 || use_S2 || use_S3) && (nphit_p + nphit_i) != 0 && true) { + + // printf(" seqno %i nphit_p %i nphit_i %i enhit_p %f enhit_i %f \n",trk2_obj->TrkLevel2::GetSeqNo(i),nphit_p,nphit_i,enhit_p,enhit_i); + // printf(" score p %i score i %i \n",tp_score,ti_score); + // if( enhit_p > enhit_i ) tp_score++; + // if( nphit_p >= nphit_i && enhit_p > enhit_i ) tp_score++; + if (nphit_p > nphit_i) + tp_score++; + if (nphit_p < nphit_i) + ti_score++; + if (nphit_p == nphit_i) { + if (enhit_p > enhit_i) + tp_score++; + else + ti_score++; + }; + // printf(" dopo score p %i score i %i \n",tp_score,ti_score); + }; + delete tr; + // + } + else { + // ------------- + // NOT a NUCLEUS + // ------------- + //printf(" NOT a NUCLEUS! en = %f \n",sen); + + Int_t nphit_p = 0; + Int_t nphit_i = 0; + + /* cout << "track: npmtadc "<< op->npmtadc << endl; + cout << "track: npmttdc "<< op->npmttdc << endl; + cout << "image: npmtadc "<< oi->npmtadc << endl; + cout << "image: npmttdc "<< oi->npmttdc << endl;*/ + + // for (Int_t ih=0; ih < op->npmtadc; ih++){ + // Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) ); + // if(pl == 1 || pl == 2 || pl == 5)nphit_p++; + // }; + + // for (Int_t ih=0; ih < oi->npmtadc; ih++){ + // Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) ); + // if(pl == 1 || pl == 2 || pl == 5)nphit_i++; + // }; + // --- modified to count tdc signals (more efficient?) + // --- and to implement check on tdcflag + for (Int_t ih = 0; ih < op->npmttdc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((op->pmttdc).At(ih)); + // if( (op->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_p++; + if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3)) + || (use_S3 && (pl == 4 || pl == 5))) { + if ((op->tdcflag).At(ih) == 0) + nphit_p++; + }; + }; + + for (Int_t ih = 0; ih < oi->npmttdc; ih++) { + Int_t pl = tof_obj->GetPlaneIndex((oi->pmttdc).At(ih)); + // if( (oi->tdcflag).At(ih)==0 && (pl == 1 || pl == 2 || pl == 5) )nphit_i++; + if ((use_S1 && (pl == 0 || pl == 1)) || (use_S2 && (pl == 2 || pl == 3)) + || (use_S3 && (pl == 4 || pl == 5))) { + if ((oi->tdcflag).At(ih) == 0) + nphit_i++; + }; + }; + + if ((nphit_p + nphit_i) != 0 && true) { + + if (nphit_p != nphit_i) { + totp_score += nphit_p; + toti_score += nphit_i; + tp_score += nphit_p; + ti_score += nphit_i; + }; + // if ( nphit_p > nphit_i) tp_score+=nphit_p; + // else if( nphit_p < nphit_i) ti_score+=nphit_i; + // else ;//niente + }; + }; + // cout << "TOF "<chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ; + // else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ; + + // CHECK 1 : number of points along X + if (tp->GetNX() >= ti->GetNX()) { + tp_score++; + totp_score++; + }; + if (tp->GetNX() <= ti->GetNX()) { + ti_score++; + toti_score++; + }; + // CHECK 2 : number of points along Y + if (tp->GetNY() >= ti->GetNY()) { + tp_score++; + totp_score++; + }; + if (tp->GetNY() <= ti->GetNY()) { + ti_score++; + toti_score++; + }; + + // cout << "TRK "<Nthspe; ih++) { + int ip = (Int_t) GetGPamela()->Itrpb[ih] - 1; + if (tp && tp->YGood(ip) && fabs(tp->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true) + ngphits_p++; + if (ti && ti->YGood(ip) && fabs(ti->ym[ip] - GetGPamela()->Yavspe[ih]) < toll && true) + ngphits_i++; + } + if (ngphits_p > ngphits_i && true) { + tp_score++; + totp_score++; + } + if (ngphits_p < ngphits_i && true) { + ti_score++; + toti_score++; + } + } + + // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + // the winner is.... + // *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* + if (tp_score > ti_score) { + + } + else if (tp_score < ti_score) { + + ts = ti;//its image!! + cs = ci; + os = oi; + rs = ri; + Int_t totis = toti_score; + + ti = tp;//its image!! + ci = cp; + oi = op; + ri = rp; + + tp = ts;//its image!! + cp = cs; + op = os; + rp = rs; + + toti_score = totp_score; + totp_score = totis; + + } + else { + + // cout << "Warning - track image ambiguity not solved" << endl; -// cout << "ObjectNumber "<Clear(); -// sorted_tracks.Clear(); + } + else { + totp_score = 1; + toti_score = 0; + + // ts = tp; + // cs = cp; + // os = op; + }; + + // cout <<" SortTracks() "<Add(ts);//save the track in the sorted array + // sorted_tracks.Add(ts);//save the track in the sorted array + // sorted_tracks.Add(tp);//save the track in the sorted array + // cout << "SortTracks:: sorted_tracks->Add(it) "<SetPScore(totp_score); + ((PamTrack*) (ttsorted[i]))->SetIScore(toti_score); + ((PamTrack*) (ttimage[i]))->SetPScore(totp_score); + ((PamTrack*) (ttimage[i]))->SetIScore(toti_score); + }; - if(!tsorted)tsorted = new TClonesArray("PamTrack",trk2_obj->GetNTracks()); + if (tsorted->GetEntries() != trk2_obj->GetNTracks()) { + cout << "void PamLevel2::SortTracks(): tsorted->GetEntries() " << tsorted->GetEntries() + << " != trk2_obj->GetNTracks() = " << trk2_obj->GetNTracks() << endl; tsorted->Delete(); - TClonesArray &ttsorted = *tsorted; - if(!timage)timage = new TClonesArray("PamTrack",trk2_obj->GetNTracks()); + tsorted = 0; timage->Delete(); - TClonesArray &ttimage = *timage; + timage = 0; + } + //Restore Object count + //To save space in the table keeping track of all referenced objects + //We reset the object count to what it was at the beginning of the event. + TProcessID::SetObjectCount(ObjectNumber); + + //Everything went fine so the current event can be tagged as sorted + issorted = true; + lastsorted = GetReadEntry(); - // loop over the tracks sorted by the tracker - Bool_t use_TRK = how.Contains("TRK", TString::kIgnoreCase); - Bool_t use_CAL = how.Contains("CAL", TString::kIgnoreCase); - Bool_t use_TOF = how.Contains("TOF", TString::kIgnoreCase); - - if( !CAL2 && use_CAL) use_CAL = false; - if( !TOF && use_TOF) use_TOF = false; - - if( !TRK2 ){ -// cout << "SortTracks() : without tracker does not work!!! (not yet)" << endl; - return; - }; - - // cout << "use_CAL "<TrkLevel2::GetNTracks(); i++){ - - TrkTrack *ts = 0; - CaloTrkVar *cs = 0; - ToFTrkVar *os = 0; - - // get tracker tracks - TrkTrack *tp = trk2_obj->TrkLevel2::GetTrack(i); //tracker - CaloTrkVar *cp = GetCaloStoredTrack(tp->GetSeqNo()); - ToFTrkVar *op = GetToFStoredTrack(tp->GetSeqNo()); - - TrkTrack *ti = 0; //tracker (image) - CaloTrkVar *ci = 0; - ToFTrkVar *oi = 0; -// cout << "trk track n. "<HasImage()){ - - ti = trk2_obj->TrkLevel2::GetTrackImage(i); //tracker (image) - ci = GetCaloStoredTrack(ti->GetSeqNo()); - oi = GetToFStoredTrack(ti->GetSeqNo()); - -// cout << "its image "<npcfit[1] > 15 && //no. of fit planes on Y view - calo2_obj->varcfit[1] < 1000. && //fit variance on Y view - true){ - - - Float_t resy_p = cp->tbar[0][1] - calo2_obj->cbar[0][1]; if(resy_p < 0)resy_p= - resy_p; - Float_t resy_i = ci->tbar[0][1] - calo2_obj->cbar[0][1]; if(resy_i < 0)resy_i= - resy_i; - - if(resy_p <= resy_i) tp_score++; - else ti_score++; - -// cout << "CALO "<npmtadc << endl; - cout << "track: npmttdc "<< op->npmttdc << endl; - cout << "image: npmtadc "<< oi->npmtadc << endl; - cout << "image: npmttdc "<< oi->npmttdc << endl;*/ - - for (Int_t ih=0; ih < op->npmtadc; ih++){ - Int_t pl = tof_obj->GetPlaneIndex( (op->pmtadc).At(ih) ); - if(pl == 1 || pl == 2 || pl == 5)nphit_p++; - }; - - for (Int_t ih=0; ih < oi->npmtadc; ih++){ - Int_t pl = tof_obj->GetPlaneIndex( (oi->pmtadc).At(ih) ); - if(pl == 1 || pl == 2 || pl == 5)nphit_i++; - }; - - if( - use_TOF && - (nphit_p+nphit_i) !=0 && - true){ - - if( nphit_p >= nphit_i) tp_score++; - else ti_score++; - }; -// cout << "TOF "<chi2 > 0 && tp->chi2 < ti->chi2 ) tp_score++ ; - else if( ti->chi2 > 0 && ti->chi2 < tp->chi2 ) ti_score++ ; -// cout << "TRK "< ti_score) { -// ts = tp;//the track sorted by the tracker!! -// cs = cp; -// os = op; - }else if (tp_score < ti_score) { - ts = ti;//its image!! - cs = ci; - os = oi; - - ti = tp;//its image!! - ci = cp; - oi = op; - - tp = ts;//its image!! - cp = cs; - op = os; - - - }else { -// ts = tp; -// cs = cp; -// os = op; -// cout << "Warning - track image ambiguity not solved" << endl; -// cout << ts->GetNtot() << " "<< ts->chi2 << " " << npcfit[1] << " "<< nphit_p << endl; - }; - - }else{ -// ts = tp; -// cs = cp; -// os = op; - }; - -// cout <<" SortTracks() "<Add(ts);//save the track in the sorted array -// sorted_tracks.Add(ts);//save the track in the sorted array -// sorted_tracks.Add(tp);//save the track in the sorted array -// cout << "SortTracks:: sorted_tracks->Add(it) "<GetEntries() != trk2_obj->GetNTracks() ){ - cout << "void PamLevel2::SortTracks(TString how): tsorted->GetEntries() "<GetEntries()<<" != trk2_obj->GetNTracks() = "<GetNTracks() <Delete(); tsorted=0; - timage->Delete(); timage=0; - } - - //Restore Object count - //To save space in the table keeping track of all referenced objects - //We reset the object count to what it was at the beginning of the event. - TProcessID::SetObjectCount(ObjectNumber); - -}; +} +; //-------------------------------------- // // @@ -638,127 +1694,113 @@ // // return sorted_tracks; // return &sorted_tracks; - + // }; -TClonesArray *PamLevel2::GetTracks(){ +TClonesArray *PamLevel2::GetTracks() { -// *-*-*-*-*-*-*-*-*-*-*-*-* - SortTracks("+CAL+TOF"); -// *-*-*-*-*-*-*-*-*-*-*-*-* + // *-*-*-*-*-*-*-*-*-*-*-*-* + SortTracks(); + // *-*-*-*-*-*-*-*-*-*-*-*-* - return tsorted; - - }; + return tsorted; + +} +; //-------------------------------------- - // - // +// +// //-------------------------------------- /** - * Retrieves the it-th Pamela "physical" track. - * It override TrkLevel2::GetTrack(int it). + * Retrieves the it-th Pamela "physical" track. + * It override TrkLevel2::GetTrack(int it). * @param it Track number, ranging from 0 to GetNTracks(). */ -PamTrack *PamLevel2::GetTrack(int it){ +PamTrack *PamLevel2::GetTrack(int it) { -// if(!trk2_obj) return 0; - -// // *-*-*-*-*-*-*-*-*-*-*-*-* -// SortTracks("+CAL+TOF"); -// // *-*-*-*-*-*-*-*-*-*-*-*-* -// // if(!sorted_tracks)return 0; -// if(sorted_tracks.IsEmpty())return 0; + // if(!trk2_obj) return 0; + + // // *-*-*-*+-*-*-*-*-*-*-*-*-* + // SortTracks("+CAL+TOF"); + // // *-*-*-*-*-*-*-*-*-*-*-*-* + // // if(!sorted_tracks)return 0; + // if(sorted_tracks.IsEmpty())return 0; + + // PamTrack *track = 0; + + // if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() && itGetEntries()) + return 0; + + PamTrack *track = 0; + + if (it >= 0 && it < trk2_obj->TrkLevel2::GetNTracks()) { + // TrkTrack *t = (TrkTrack*)sorted_tracks.At(it); + // track = GetPamTrackAlong(t); + //TClonesArray &t = *(tsorted); + //track = (PamTrack*)t[it]; + track = (PamTrack*)((*tsorted)[it]); + } + else { + cout << "PamLevel2::GetTrack(int) : tracker track SeqNo " << it << " does not exist (GetNTracks() = " + << trk2_obj->TrkLevel2::GetNTracks() << ")" << endl; + }; + + return track; -// PamTrack *track = 0; - -// if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() && itGetEntries())return 0; - - PamTrack *track = 0; - - if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks()){ -// TrkTrack *t = (TrkTrack*)sorted_tracks.At(it); -// track = GetPamTrackAlong(t); - TClonesArray &t = *(tsorted); - track = (PamTrack*)t[it]; - - }else{ - cout << "PamLevel2::GetTrack(int) : tracker track SeqNo "<< it <<" does not exist (GetNTracks() = "<TrkLevel2::GetNTracks()<<")"<=0 && it < trk2_obj->TrkLevel2::GetNTracks() ){ -// TrkTrack *temp = (TrkTrack*)sorted_tracks.At(it); -// if( temp->HasImage() ){ -// TrkTrack *t = trk2_obj->TrkLevel2::GetStoredTrack(temp->GetImageSeqNo()); -// image = GetPamTrackAlong(t); -// }else{ -// cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<GetEntries())return 0; - - PamTrack *image = 0; - - if( it >=0 && it < trk2_obj->TrkLevel2::GetNTracks() ){ - TClonesArray &t = *(tsorted); - PamTrack *temp = (PamTrack*)t[it]; - if( temp->GetTrkTrack()->HasImage() ){ - TClonesArray &t = *(timage); - image = (PamTrack*)t[it]; - }else{ -// cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<GetEntries()) + return 0; + + PamTrack *image = 0; + + if (it >= 0 && it < trk2_obj->TrkLevel2::GetNTracks()) { + TClonesArray &t = *(tsorted); + PamTrack *temp = (PamTrack*) t[it]; + if (temp->GetTrkTrack()->HasImage()) { + TClonesArray & t = *(timage); + image = (PamTrack*) t[it]; + } + else { + // cout <<"PamLevel2::GetTrackImage(int) : Track SeqNo "<GetName(); + if (!CheckLevel2File(fname)) + return NULL; + + // UInt_t *found=0; + + cout << "GetPamTree(TFile*,TString): detector list --> "; + if (TRK1) + cout << "TRK1 "; + if (TRK2) + cout << "TRK2 "; + if (TRKh) + cout << "TRKH "; + if (CAL1) + cout << "CAL1 "; + if (CAL2) + cout << "CAL2 "; + if (TOF) + cout << "TOF "; + if (TRG) + cout << "TRG "; + if (AC) + cout << "AC "; + if (ND) + cout << "ND "; + if (S4) + cout << "S4 "; + if (ORB) + cout << "ORB "; + if (GP) + cout << "GP "; + cout << endl; + if (SELLI && SELLI != 2) + cout << ">>> Found selection-list <<<" << endl; //EMILIANO + + f->cd(); + + // Tracker + TTree *T = (TTree*) f->Get("Tracker"); + if (T && (TRK2 || TRK1 || TRKh)) { + if (TRK2) + T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2")); + // else T->SetBranchStatus("TrkLevel2",0,found); + if (TRK2) + cout << "Tracker : set branch address TrkLevel2" << endl; + if (TRK1) + T->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1")); + // else T->SetBranchStatus("TrkLevel1",0,found); + if (TRK1) + cout << "Tracker : set branch address TrkLevel1" << endl; + if (TRKh) + T->SetBranchAddress("TrkHough", GetPointerTo("TrkHough")); + // else T->SetBranchStatus("TrkHough",0,found); + if (TRKh) + cout << "Tracker : set branch address TrkHough" << endl; + if (!Trout) + Trout = T; + else + Trout->AddFriend(T); + } + else { + cout << "Tracker : missing tree" << endl; + }; + // Calorimeter + TTree *C = (TTree*) f->Get("Calorimeter"); + if (C && (CAL2 || CAL1)) { + if (CAL2) + C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2")); + // else C->SetBranchStatus("CaloLevel2",0,found); + if (CAL2) + cout << "Calorimeter : set branch address CaloLevel2" << endl; + if (CAL1) + C->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1")); + // else C->SetBranchStatus("CaloLevel1",0,found); + if (CAL1) + cout << "Calorimeter : set branch address CaloLevel1" << endl; + if (!Trout) + Trout = C; + else + Trout->AddFriend(C); + } + else { + cout << "Calorimeter : missing tree" << endl; + }; + + // ToF + TTree *O = (TTree*) f->Get("ToF"); + if (O && TOF) { + O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2")); + cout << "ToF : set branch address ToFLevel2" << endl; + if (!Trout) + Trout = O; + else + Trout->AddFriend(O); + } + else { + cout << "ToF : missing tree" << endl; + }; + // Trigger + TTree *R = (TTree*) f->Get("Trigger"); + if (R && TRG) { + R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2")); + cout << "Trigger : set branch address TrigLevel2" << endl; + if (!Trout) + Trout = R; + else + Trout->AddFriend(R); + } + else { + cout << "Trigger : missing tree" << endl; + }; + // S4 + TTree *S = (TTree*) f->Get("S4"); + if (S && S4) { + S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2")); + cout << "S4 : set branch address S4Level2" << endl; + if (!Trout) + Trout = S; + else + Trout->AddFriend(S); + } + else { + cout << "S4 : missing tree" << endl; + }; + // Neutron Detector + TTree *N = (TTree*) f->Get("NeutronD"); + if (N && ND) { + N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2")); + cout << "NeutronD : set branch address NDLevel2" << endl; + if (!Trout) + Trout = N; + else + Trout->AddFriend(N); + } + else { + cout << "NeutronD : missing tree" << endl; + }; + // Anticounters + TTree *A = (TTree*) f->Get("Anticounter"); + if (A && AC) { + A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2")); + cout << "Anticounter : set branch address AcLevel2" << endl; + if (!Trout) + Trout = A; + else + Trout->AddFriend(A); + } + else { + cout << "Anticounter : missing tree" << endl; + }; + // Orbital Info + TTree *B = (TTree*) f->Get("OrbitalInfo"); + if (B && ORB) { + B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo")); + cout << "OrbitalInfo : set branch address OrbitalInfo" << endl; + if (!Trout) + Trout = B; + else + Trout->AddFriend(B); + } + else { + cout << "OrbitalInfo : missing tree" << endl; + }; + + // GPamela + TTree *G = (TTree*) f->Get("h20"); + if (G && GP) { + if (!gp_obj) + gp_obj = new GPamela(); + // ------------------------------------ + // ATTENZIONE!!! + // non so per quale arcano motivo, + // per l'albero di gpamela il branch address lo devo settare + // DOPO aver fatto friend + // FGRRRVZZZZUTSALKJMSLKJ!!! + // ------------------------------------ + // gp_obj->SetBranchAddress(G); //ho dovuto fare in maniera diversa dagli altri + // cout << "h20 : set branch address GPamela "<AddFriend(G); + } + else { + // cout << "h20 : missing tree"<Get("SelectionList"); + if (L && SELLI == 1) { + cout << " TTree *PamLevel2::GetPamTree(TFile, TString) >>> SelectionList not implemented!!!!" << endl; + sel_tree = 0; + } + else { + cout << "SelectionList : missing tree" << endl; + }; + + cout << endl << " Number of entries: " << Trout->GetEntries() << endl << endl; + + // ------------------------------------ + // ATTENZIONE!!! + // non so per quale arcano motivo, + // per l'albero di gpamela il branch address lo devo settare + // DOPO aver fatto friend + // FGRRRVZZZZUTSALKJMSLKJ!!! + // ------------------------------------ + if (G && GP) { + gp_obj->SetBranchAddress(Trout); //ho dovuto fare in maniera diversa dagli altri + cout << "h20 : set branch address GPamela " << endl; + } + else { + cout << "h20 : missing tree" << endl; + }; + + pam_tree = (TChain*) Trout; + + return Trout; -// if( !detlist.IsNull() ) SetWhichTrees(detlist); -// else GetWhichTrees(f); - SetWhichTrees(detlist); - - TTree *Trout =0; - - TString fname = f->GetName(); - if(!CheckLevel2File(fname))return NULL; - - UInt_t *found=0; - - cout<< "GetPamTree(TFile*,TString): detector list --> "; - if(TRK1)cout<<"TRK1 "; - if(TRK2)cout<<"TRK2 "; - if(TRKh)cout<<"TRKH "; - if(CAL1)cout<<"CAL1 "; - if(CAL2)cout<<"CAL2 "; - if(TOF)cout<<"TOF "; - if(TRG)cout<<"TRG "; - if(AC)cout<<"AC "; - if(ND)cout<<"ND "; - if(S4)cout<<"S4 "; - if(ORB)cout<<"ORB "; - cout << endl; - - f->cd(); - -// Tracker - TTree *T = (TTree*)f->Get("Tracker"); - if(T && (TRK2||TRK1||TRKh)) { - if(TRK2)T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2")); - else T->SetBranchStatus("TrkLevel2",0,found); - if(TRK2)cout << "Tracker : set branch address TrkLevel2"<SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1")); - else T->SetBranchStatus("TrkLevel1",0,found); - if(TRK1)cout << "Tracker : set branch address TrkLevel1"<SetBranchAddress("TrkHough", GetPointerTo("TrkHough")); - else T->SetBranchStatus("TrkHough",0,found); - if(TRKh)cout << "Tracker : set branch address TrkHough"<AddFriend(T); - }else{ - cout << "Tracker : missing tree"<Get("Calorimeter"); - if(C && (CAL2||CAL1)) { - if(CAL2)C->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2")); - else C->SetBranchStatus("CaloLevel2",0,found); - if(CAL2)cout << "Calorimeter : set branch address CaloLevel2"<SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1")); - else C->SetBranchStatus("CaloLevel1",0,found); - if(CAL1)cout << "Calorimeter : set branch address CaloLevel1"<AddFriend(C); - }else{ - cout << "Calorimeter : missing tree"<Get("ToF"); - if(O && TOF) { - O->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2")); - cout << "ToF : set branch address ToFLevel2"<AddFriend(O); - }else{ - cout << "ToF : missing tree"<Get("Trigger"); - if(R && TRG) { - R->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2")); - cout << "Trigger : set branch address TrigLevel2"<AddFriend(R); - }else{ - cout << "Trigger : missing tree"<Get("S4"); - if(S && S4) { - S->SetBranchAddress("S4Level2", GetPointerTo("S4Level2")); - cout << "S4 : set branch address S4Level2"<AddFriend(S); - }else{ - cout << "S4 : missing tree"<Get("NeutronD"); - if(N && ND) { - N->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2")); - cout << "NeutronD : set branch address NDLevel2"<AddFriend(N); - }else{ - cout << "NeutronD : missing tree"<Get("Anticounter"); - if(A && AC) { - A->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2")); - cout << "Anticounter : set branch address AcLevel2"<AddFriend(A); - }else{ - cout << "Anticounter : missing tree"<Get("OrbitalInfo"); - if(B && ORB) { - B->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo")); - cout << "OrbitalInfo : set branch address OrbitalInfo"<AddFriend(B); - }else{ - cout << "OrbitalInfo : missing tree"<GetEntries()<WorkingDirectory(); - - if(ddir=="")ddir = wdir; -// TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir); - cout << "Level2 data directory : "<< ddir << endl; - - TList *contents = new TList; // create output list - contents->SetOwner(); - -// char *fullpath; -// const char *fullpath; - - // if no input file list is given: - if ( flisttxt != "" ){ - -// if( !gSystem->IsFileInIncludePath(flisttxt,&fullpath) ){ -// if( !(fullpath = gSystem->FindFile("./",flisttxt)) ){ -// cout <<"File "<ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt)); - - if( !gSystem->ChangeDirectory(ddir) ){ - cout << "Cannot change directory : "<ChangeDirectory(wdir); // back to the working directory - return 0; - } - int line=0; - while (1) { - TString file; - in >> file; - if (!in.good()) break; - line++; -// cout <<"(1) " << file << endl; - if(file.IsNull()){ - cout << "-- list interrupted at line "<IsFileInIncludePath(file,&fullpath) ){ -// if( (fullpath = gSystem->FindFile(ddir,file)) ){ - char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir),gSystem->BaseName(file)); - contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath)));// add file to the list - delete fullpath; -// }else{ -// if(file.Data()!="")cout << "File: "< missing "<< endl; -// }; - }; - in.close(); - - }else{ - - cout << "No input file list given."<WorkingDirectory()<< endl; - - TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir),ddir); - TList *temp = datadir->GetListOfFiles(); -// temp->Print(); -// cout << "*************************************" << endl; - - TIter next(temp); - TSystemFile *questo = 0; - - - while ( (questo = (TSystemFile*) next()) ) { - TString name = questo-> GetName(); - if( name.EndsWith(".root") ){ -// const char *fullpath = gSystem->FindFile(ddir,name); -// char *fullpath; -// gSystem->IsFileInIncludePath(name,&fullpath); - char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir),gSystem->BaseName(name)); - contents->Add(new TSystemFile(fullpath,gSystem->DirName(fullpath))); - delete fullpath; - }; - } - delete temp; - delete datadir; - - }; - gSystem->ChangeDirectory(wdir); // back to the working directory -// cout << endl << "Selected files:" << endl; -// contents->Print(); - cout << contents->GetEntries()<<" files \n"; -// cout << endl; -// cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl; - return contents; -}; -//-------------------------------------- -// -// -//-------------------------------------- -/** - * Get the Pamela detector chains from a list of files and make them friends. - * @param fl Pointer to a TList of TSystemFiles - * @param detlist String to select trees to be included - * @return Pointer to a TChain - */ -TChain *PamLevel2::GetPamTree(TList *fl, TString detlist ){ - - TChain *Trout =0; - -// if( !detlist.IsNull() )SetWhichTrees(detlist); - SetWhichTrees(detlist); - - cout<< "GetPamTree(TList*,TString): input detector list --> "; - if(TRK1)cout<<"TRK1 "; - if(TRK2)cout<<"TRK2 "; - if(TRKh)cout<<"TRKH "; - if(CAL1)cout<<"CAL1 "; - if(CAL2)cout<<"CAL2 "; - if(TOF)cout<<"TOF "; - if(TRG)cout<<"TRG "; - if(AC)cout<<"AC "; - if(ND)cout<<"ND "; - if(S4)cout<<"S4 "; - if(ORB)cout<<"ORB "; - cout << endl; - - TChain *T = 0; - TChain *C = 0; - TChain *O = 0; - TChain *R = 0; - TChain *S = 0; - TChain *N = 0; - TChain *A = 0; - TChain *B = 0; - - if(TRK2||TRK1||TRKh) T = new TChain("Tracker"); - if(CAL2||CAL1) C = new TChain("Calorimeter"); - if(TOF) O = new TChain("ToF"); - if(TRG) R = new TChain("Trigger"); - if(S4) S = new TChain("S4"); - if(ND) N = new TChain("NeutronD"); - if(AC) A = new TChain("Anticounter"); - if(ORB) B = new TChain("OrbitalInfo"); - - // loop over files and create chains - TIter next(fl); - TSystemFile *questo = 0; - while ( (questo = (TSystemFile*) next()) ) { - TString name = questo->GetName(); - cout << "File: "<< name << endl; - if( CheckLevel2File(name) ){ - if(TRK2||TRK1||TRKh) T->Add(name); - if(CAL1||CAL2) C->Add(name); - if(TOF) O->Add(name); - if(TRG) R->Add(name); - if(S4) S->Add(name); - if(ND) N->Add(name); - if(AC) A->Add(name); - if(ORB) B->Add(name); - }; - } - - cout << "done chain \n"; - - UInt_t *found=0; -// Tracker - if(T && (TRK2||TRK1||TRKh)) { - if(TRK2)T->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2")); - else T->SetBranchStatus("TrkLevel2",0,found); - if(TRK2)cout << "Tracker : set branch address TrkLevel2"<SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1")); - else T->SetBranchStatus("TrkLevel1",0,found); - if(TRK1)cout << "Tracker : set branch address TrkLevel1"<SetBranchAddress("TrkHough", GetPointerTo("TrkHough")); - else T->SetBranchStatus("TrkHough",0,found); - if(TRKh)cout << "Tracker : set branch address TrkHough"<AddFriend("Tracker"); - }else{ - cout << "Tracker : missing tree"<SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2")); - else C->SetBranchStatus("CaloLevel2",0,found); - if(CAL2)cout << "Calorimeter : set branch address CaloLevel2"<SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1")); - else C->SetBranchStatus("CaloLevel1",0,found); - if(CAL1)cout << "Calorimeter : set branch address CaloLevel1"<AddFriend("Calorimeter"); - }else{ - cout << "Calorimeter : missing tree"<SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2")); - cout << "ToF : set branch address ToFLevel2"<AddFriend("ToF"); - }else{ - cout << "ToF : missing tree"<SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2")); - cout << "Trigger : set branch address TrigLevel2"<AddFriend("Trigger"); - }else{ - cout << "Trigger : missing tree"<SetBranchAddress("S4Level2", GetPointerTo("S4Level2")); - cout << "S4 : set branch address S4Level2"<AddFriend("S4"); - }else{ - cout << "S4 : missing tree"<SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2")); - cout << "NeutronD : set branch address NDLevel2"<AddFriend("NeutronD"); - }else{ - cout << "NeutronD : missing tree"<SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2")); - cout << "Anticounter : set branch address AcLevel2"<AddFriend("Anticounter"); - }else{ - cout << "Anticounter : missing tree"<SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo")); - cout << "OrbitalInfo : set branch address OrbitalInfo"<AddFriend("OrbitalInfo"); - }else{ - cout << "OrbitalInfo : missing tree"<GetEntries()<AddFriend("Tracker"); -// } -// // Calorimeter -// if(CAL2||CAL1) { -// if(!Tout)Tout=C; -// else Tout->AddFriend("Calorimeter"); -// }; -// // ToF -// if(TOF) { -// if(!Tout)Tout=O; -// else Tout->AddFriend("ToF"); -// }; -// // Trigger -// if(TRG) { -// if(!Tout)Tout=R; -// else Tout->AddFriend("Trigger"); -// }; -// // S4 -// if(S4) { -// if(!Tout)Tout=S; -// else Tout->AddFriend("S4"); -// }; -// // Neutron Detector -// if(ND) { -// if(!Tout)Tout=N; -// else Tout->AddFriend("NeutronD"); -// }; -// // Anticounters -// if(AC) { -// if(!Tout)Tout=A; -// else Tout->AddFriend("Anticounter"); -// }; -// // OrbitalInfo -// if(ORB) { -// if(!Tout)Tout=B; -// else Tout->AddFriend("OrbitalInfo"); -// }; - -// cout<GetEntries()<GetEntries() )PamLevel2::SetBranchAddress( Tout ); - - return Trout; -} +TList* PamLevel2::GetListOfLevel2Files(TString ddir, TString flisttxt = "") { + TString wdir = gSystem->WorkingDirectory(); + if (ddir != "") { + cout << "Level2 data directory : " << ddir << endl; + } + else { + cout << "Level2 data directory not given as input: trying to evaluate from list or taking working directory " + << endl; + }; + TList *contents = new TList; // create output list + contents->SetOwner(); + + // -------------------------------------- + // case 1 : input file/file-list provided + // -------------------------------------- + if (flisttxt != "") { + + // -------------------------------------- + // a list of files given as input + // -------------------------------------- + if (!flisttxt.EndsWith(".root")) { + + TString dir = gSystem->DirName(flisttxt); + // cout << " List directory "<ConcatFileName(wdir.Data(), gSystem->BaseName(flisttxt)); + // flisttxt = gSystem->ConcatFileName(gSystem->DirName(flisttxt),gSystem->BaseName(flisttxt)); + + if (!gSystem->ChangeDirectory(ddir)) { + cout << "Cannot change directory : " << ddir << endl; + return 0; + } + + cout << "Input file list : " << flisttxt << endl; + ifstream in; + in.open(flisttxt, ios::in); //open input file list + if (!in.good()) { + cout << " TList* PamLevel2::GetListOfLevel2Files(TString, TString) --> ERROR opening the file " << endl; + gSystem->ChangeDirectory(wdir); // back to the working directory + return 0; + } + int line = 0; + // ........................... + // loop over file-list records + // ........................... + while (1) { + TString file; + in >> file; + if (!in.good()) + break; + line++; + cout << "(*) " << file << endl; + if (file.IsNull()) { + cout << "-- list interrupted at line " << line << endl; + break; + } + if (file.Contains("#")) + file = file(0, file.First("#")); + // + // take only root files + // + if (file.EndsWith(".root")) { + TString filedir; + cout << ddir << endl; + if ( ddir != "" ) { + filedir = ddir; // take the input dir + } + else { + gSystem->ChangeDirectory(wdir); // back to the working directory + filedir = gSystem->DirName(file); // this will take the path if exist in the list otherwise it will return automatically the working dir + }; + filedir.Append("/"); + // char *fullpath = gSystem->ConcatFileName(gSystem->DirName(filedir), gSystem->BaseName(file)); + char *fullpath = gSystem->ConcatFileName(filedir.Data(), gSystem->BaseName(file)); + contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));// add file to the list + cout << fullpath << endl; + delete fullpath; + } + // }else{ + // if(file.Data()!="")cout << "File: "< missing "<< endl; + // }; + }; + in.close(); + // -------------------------------------- + // a single root file given as input + // -------------------------------------- + } + else { + if (flisttxt.Contains("#")) + flisttxt = flisttxt(0, flisttxt.First("#")); + char *fullpath = gSystem->ConcatFileName(gSystem->DirName(flisttxt), gSystem->BaseName(flisttxt)); + contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath)));// add file to the list + delete fullpath; + }; + // --------------------------------------------------------------------------------- + // case 2 : no input file/file-list provided --> read all files insede the directory + // --------------------------------------------------------------------------------- + } + else { + + cout << "No input file list given." << endl; + cout << "Check for existing root files." << endl; + // cout << "Warking directory: "<< gSystem->WorkingDirectory()<< endl; + if (ddir == "") { + ddir = wdir; + cout << "Level2 data directory : " << ddir << endl; + }; + + TSystemDirectory *datadir = new TSystemDirectory(gSystem->BaseName(ddir), ddir); + TList *temp = datadir->GetListOfFiles(); + if (!temp) + return 0; + // temp->Print(); + // cout << "*************************************" << endl; + TIter next(temp); + TSystemFile *questo = 0; + + while ((questo = (TSystemFile*) next())) { + TString name = questo-> GetName(); + if (name.EndsWith(".root")) { + // const char *fullpath = gSystem->FindFile(ddir,name); + // char *fullpath; + // gSystem->IsFileInIncludePath(name,&fullpath); + char *fullpath = gSystem->ConcatFileName(gSystem->DirName(ddir), gSystem->BaseName(name)); + contents->Add(new TSystemFile(fullpath, gSystem->DirName(fullpath))); + delete fullpath; + }; + } + delete temp; + delete datadir; + + }; + gSystem->ChangeDirectory(wdir); // back to the working directory + // cout << endl << "Selected files:" << endl; + // contents->Print(); + cout << contents->GetEntries() << " files \n"; + // cout << endl; + // cout << "Working directory: "<< gSystem->WorkingDirectory()<< endl; + return contents; +} +; //-------------------------------------- // // //-------------------------------------- /** - * Set branch addresses for Pamela friend trees + * Get the Pamela detector chains from a list of files and make them friends. + * @param fl Pointer to a TList of TSystemFiles + * @param detlist String to select trees to be included + * @return Pointer to a TChain */ -void PamLevel2::SetBranchAddress(TTree *t){ +TChain *PamLevel2::GetPamTree(TList *fl, TString detlist) { + // + // + // + if (pam_tree) { + printf("WARNING: TChain *PamLevel2::GetPamTree(TList *fl, TString detlist) -- pam_tree already exists!\n "); + return pam_tree; + }; + // + + TChain *Trout = 0; + + // ------------------------------------------- + // set flags to include/exclude trees/branches + // ------------------------------------------- + if (detlist.Contains("+AUTO", TString::kIgnoreCase)) { + if (fl->GetEntries() > 0) { + cout << "+AUTO" << endl; + TFile *fprimo = new TFile(fl->At(0)->GetName()); + GetWhichTrees(fprimo); + fprimo->Close();// AAAAARGGGGGHHHHH!!!!!!! non commentare questa riga, altrimenti si incasina il TChain + fprimo->Delete(); + } + }; + SetWhichTrees(detlist); - TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2"); - TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1"); - TRKh = TRKh & t->GetBranchStatus("TrkHough"); - CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2"); - CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1"); - TOF = TOF & t->GetBranchStatus("ToFLevel2"); - TRG = TRG & t->GetBranchStatus("TrigLevel2"); - S4 = S4 & t->GetBranchStatus("S4Level2"); - ND = ND & t->GetBranchStatus("NDLevel2"); - AC = AC & t->GetBranchStatus("AcLevel2"); - ORB = ORB & t->GetBranchStatus("OrbitalInfo"); - - - // Tracker - if(TRK1) { - t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel2")); - cout << "Tracker : set branch address TrkLevel1"<SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel1")); - cout << "Tracker : set branch address TrkLevel2"<SetBranchAddress("TrkHough", GetPointerTo("TrkHough")); - cout << "Tracker : set branch address TrkHough"<SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1")); - cout << "Calorimeter : set branch address CaloLevel1"<SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2")); - cout << "Calorimeter : set branch address CaloLevel2"<SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2")); - cout << "ToF : set branch address ToFLevel2"<SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2")); - cout << "Trigger : set branch address TrigLevel2"<SetBranchAddress("S4Level2", GetPointerTo("S4Level2")); - cout << "S4 : set branch address S4Level2"<SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2")); - cout << "NeutronD : set branch address NDLevel2"<SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2")); - cout << "Anticounter : set branch address AcLevel2"<SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo")); - cout << "OrbitalInfo : set branch address OrbitalInfo"<GetName(); + cout << "File: " << name << endl; + if (CheckLevel2File(name)) { + if (TRK2 || TRK1 || TRKh) + T->Add(name); + if (CAL1 || CAL2) + C->Add(name); + if (TOF) + O->Add(name); + if (TRG) + R->Add(name); + if (S4) + S->Add(name); + if (ND) + N->Add(name); + if (AC) + A->Add(name); + if (ORB) + B->Add(name); + if (GP) + G->Add(name); + if (SELLI == 1) + L->Add(name); }; - + }; + + cout << "done chains\n"; + cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; + + // ------------------------------------------- + // make friends + // ------------------------------------------- + + // Tracker + cout << "Friends: " << endl; + if (T && (TRK2 || TRK1 || TRKh)) { + if (!Trout) + Trout = T; + else + Trout->AddFriend("Tracker"); + // cout << "+Tacker"<AddFriend("Calorimeter"); + // cout << "+Calorimeter"<AddFriend("ToF"); + // cout << "+ToF"<AddFriend("Trigger"); + // cout << "+Trigger"<AddFriend("S4"); + // cout << "+S4"<AddFriend("NeutronD"); + // cout << "+NeutronD"<AddFriend("Anticounter"); + // cout << "+Anticounter"<AddFriend("OrbitalInfo"); + // cout << "+OrbitalInfo"<AddFriend("h20"); + // cout << "+h20"<>> Found selection-list <<<" << endl; + // L->SetBranchAddress("RunEntry",&irun); + L->SetBranchAddress("RunEntry", &irunt);//NEWNEW + cout << "SelectionList: set branch address RunEntry" << endl; + L->SetBranchAddress("EventEntry", &irunentry); + cout << "SelectionList: set branch address EventEntry" << endl; + sel_tree = L; + // if(!Trout)Trout=O; + // else Trout->AddFriend("SelectionList"); + cout << "+SelectionList" << endl; + cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; + } + else { + // cout << "SelectionList : missing tree"<Delete(); + }; + + // -------------------------------------------- + // return the pamela chain with all the friends + // -------------------------------------------- + + pam_tree = Trout; + + return Trout; } + +//-------------------------------------- +// +// +//-------------------------------------- /** * Set branch addresses for Pamela friend trees */ -void PamLevel2::SetBranchAddress(TChain *t){ +void PamLevel2::SetBranchAddress(TTree *t) { + + TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2"); + TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1"); + TRKh = TRKh & t->GetBranchStatus("TrkHough"); + CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2"); + CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1"); + TOF = TOF & t->GetBranchStatus("ToFLevel2"); + TRG = TRG & t->GetBranchStatus("TrigLevel2"); + S4 = S4 & t->GetBranchStatus("S4Level2"); + ND = ND & t->GetBranchStatus("NDLevel2"); + AC = AC & t->GetBranchStatus("AcLevel2"); + ORB = ORB & t->GetBranchStatus("OrbitalInfo"); + GP = GP & t->GetBranchStatus("h20"); + + // Tracker + if (TRK1) { + t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel2")); + cout << "Tracker : set branch address TrkLevel1" << endl; + }; + if (TRK2) { + t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel1")); + cout << "Tracker : set branch address TrkLevel2" << endl; + }; + if (TRKh) { + t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough")); + cout << "Tracker : set branch address TrkHough" << endl; + }; + + // Calorimeter + if (CAL1) { + t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1")); + cout << "Calorimeter : set branch address CaloLevel1" << endl; + }; + if (CAL2) { + t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2")); + cout << "Calorimeter : set branch address CaloLevel2" << endl; + }; + + // ToF + if (TOF) { + t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2")); + cout << "ToF : set branch address ToFLevel2" << endl; + }; + // Trigger + if (TRG) { + t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2")); + cout << "Trigger : set branch address TrigLevel2" << endl; + }; + // S4 + if (S4) { + t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2")); + cout << "S4 : set branch address S4Level2" << endl; + }; + // Neutron Detector + if (ND) { + t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2")); + cout << "NeutronD : set branch address NDLevel2" << endl; + }; + // Anticounters + if (AC) { + t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2")); + cout << "Anticounter : set branch address AcLevel2" << endl; + }; + // OrbitalInfo + if (ORB) { + t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo")); + cout << "OrbitalInfo : set branch address OrbitalInfo" << endl; + }; + // GPamela + if (GP) { + // GetPointerTo("GPamela"); + if (!gp_obj) + gp_obj = new GPamela(); + // gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri + // // t->SetBranchAddress("GPamela", GetPointerTo("GPamela")); + if (SELLI) + t->SetBranchAddress("GPamela", GetPointerTo("GPamela")); + else + gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri + + cout << "h20 : set branch address GPamela " << endl; + }; - TRK2 = TRK2 & t->GetBranchStatus("TrkLevel2"); - TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1"); - TRKh = TRKh & t->GetBranchStatus("TrkHough"); - CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1"); - CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2"); - TOF = TOF & t->GetBranchStatus("ToFLevel2"); - TRG = TRG & t->GetBranchStatus("TrigLevel2"); - S4 = S4 & t->GetBranchStatus("S4Level2"); - ND = ND & t->GetBranchStatus("NDLevel2"); - AC = AC & t->GetBranchStatus("AcLevel2"); - ORB = ORB & t->GetBranchStatus("OrbitalInfo"); - - // Tracker - if(TRK2) { - t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2")); - cout << "Tracker : set branch address TrkLevel2"<SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1")); - cout << "Tracker : set branch address TrkLevel1"<SetBranchAddress("TrkHough", GetPointerTo("TrkHough")); - cout << "Tracker : set branch address TrkHough"<SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2")); - cout << "Calorimeter : set branch address CaloLevel2"<SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1")); - cout << "Calorimeter : set branch address CaloLevel1"<SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2")); - cout << "ToF : set branch address ToFLevel2"<SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2")); - cout << "Trigger : set branch address TrigLevel2"<SetBranchAddress("S4Level2", GetPointerTo("S4Level2")); - cout << "S4 : set branch address S4Level2"<SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2")); - cout << "NeutronD : set branch address NDLevel2"<SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2")); - cout << "Anticounter : set branch address AcLevel2"<SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo")); - cout << "OrbitalInfo : set branch address OrbitalInfo"<GetBranchStatus("TrkLevel2"); + // TRK1 = TRK1 & t->GetBranchStatus("TrkLevel1"); + // TRKh = TRKh & t->GetBranchStatus("TrkHough"); + // CAL1 = CAL1 & t->GetBranchStatus("CaloLevel1"); + // CAL2 = CAL2 & t->GetBranchStatus("CaloLevel2"); + // TOF = TOF & t->GetBranchStatus("ToFLevel2"); + // TRG = TRG & t->GetBranchStatus("TrigLevel2"); + // S4 = S4 & t->GetBranchStatus("S4Level2"); + // ND = ND & t->GetBranchStatus("NDLevel2"); + // AC = AC & t->GetBranchStatus("AcLevel2"); + // ORB = ORB & t->GetBranchStatus("OrbitalInfo"); + // GP = GP & t->GetBranchStatus("h20"); + + // Tracker + if (TRK2) { + t->SetBranchAddress("TrkLevel2", GetPointerTo("TrkLevel2")); + cout << "Tracker : set branch address TrkLevel2" << endl; + }; + if (TRK1) { + t->SetBranchAddress("TrkLevel1", GetPointerTo("TrkLevel1")); + cout << "Tracker : set branch address TrkLevel1" << endl; + }; + if (TRKh) { + t->SetBranchAddress("TrkHough", GetPointerTo("TrkHough")); + cout << "Tracker : set branch address TrkHough" << endl; + }; + + // Calorimeter + if (CAL2) { + t->SetBranchAddress("CaloLevel2", GetPointerTo("CaloLevel2")); + cout << "Calorimeter : set branch address CaloLevel2" << endl; + }; + if (CAL1) { + t->SetBranchAddress("CaloLevel1", GetPointerTo("CaloLevel1")); + cout << "Calorimeter : set branch address CaloLevel1" << endl; + }; + + // ToF + if (TOF) { + t->SetBranchAddress("ToFLevel2", GetPointerTo("ToFLevel2")); + cout << "ToF : set branch address ToFLevel2" << endl; + }; + // Trigger + if (TRG) { + t->SetBranchAddress("TrigLevel2", GetPointerTo("TrigLevel2")); + cout << "Trigger : set branch address TrigLevel2" << endl; + }; + // S4 + if (S4) { + t->SetBranchAddress("S4Level2", GetPointerTo("S4Level2")); + cout << "S4 : set branch address S4Level2" << endl; + }; + // Neutron Detector + if (ND) { + t->SetBranchAddress("NDLevel2", GetPointerTo("NDLevel2")); + cout << "NeutronD : set branch address NDLevel2" << endl; + }; + // Anticounters + if (AC) { + t->SetBranchAddress("AcLevel2", GetPointerTo("AcLevel2")); + cout << "Anticounter : set branch address AcLevel2" << endl; + }; + // OrbitalInfo + if (ORB) { + t->SetBranchAddress("OrbitalInfo", GetPointerTo("OrbitalInfo")); + cout << "OrbitalInfo : set branch address OrbitalInfo" << endl; + }; + // GPamela + // cout <<"GP "<SetBranchAddress("GPamela", GetPointerTo("GPamela")); + else + gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri + // gp_obj->SetBranchAddress(t); //ho dovuto fare in maniera diversa dagli altri + cout << "h20 : set branch address GPamela " << endl; + }; + // SelectionList + // if(SELLI==1){ + // t->SetBranchAddress("RunEntry",&irunt);//NEWNEW + // cout << "SelectionList: set branch address RunEntry"<SetBranchAddress("EventEntry",&irunentry); + // cout << "SelectionList: set branch address EventEntry"<GetName(); -// cout << "File: "<< name << endl; - if( CheckLevel2File(name) ){ - R->Add(name); - }; - } - +TChain *PamLevel2::GetRunTree(TList *fl) { + // + // + // + if (run_tree) { + printf("WARNING: TChain *PamLevel2::GetRunTree(TList *fl) -- run_tree already exists!\n "); + return run_tree; + }; + // + + + TChain *R = new TChain("Run"); + + // loop over files and create chains + TIter next(fl); + TSystemFile *questo = 0; + while ((questo = (TSystemFile*) next())) { + TString name = questo->GetName(); + // cout << "File: "<< name << endl; + if (CheckLevel2File(name)) { + R->Add(name); + }; + } + + if (RUN && R->GetNtrees()) { + R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo")); - cout << "Run : set branch address RunInfo"<SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano - cout << "Software : set branch address SoftInfo"<GetNtrees()]; + if (DBG) { + cout << "----------------------------------------------------" << endl; + cout << "irun\t | "; + cout << "tree\t |"; + // cout << "offset\t |"; + cout << "RUN\t"; + cout << "FRAG\t"; + cout << "NEVENTS\t"; + cout << "absolute time\t\t\t"; + cout << "on-board time"; + cout << endl; + } + for (Int_t ii = 0; ii < R->GetEntries(); ii++) { + R->GetEntry(ii); + if (DBG) { + cout << ii << "\t | "; + cout << R->GetTreeNumber() << "\t |"; + // cout << R->GetChainOffset()<< "\t |"; + cout << GetRunInfo()->ID << "\t"; + cout << GetRunInfo()->ID_RUN_FRAG << "\t"; + cout << GetRunInfo()->NEVENTS << "\t"; + cout << GetRunInfo()->RUNHEADER_TIME << " <---> " << GetRunInfo()->RUNTRAILER_TIME << "\t"; + cout << GetRunInfo()->RUNHEADER_OBT << " <---> " << GetRunInfo()->RUNTRAILER_OBT << "\t"; + cout << endl; + } + irunoffset[R->GetTreeNumber()] = R->GetChainOffset(); + } + cout << "N.run = " << R->GetEntries() << endl; + cout << "----------------------------------------------------" << endl; + + } + else { + delete R; + R = 0; + } + + run_tree = R; + + return R; + } //-------------------------------------- // @@ -1408,63 +2705,509 @@ //-------------------------------------- /** * Get the Run tree from a file. - * @param f Pointer to a TFile + * @param f Pointer to a TFile * @return Pointer to a TTree */ -TTree *PamLevel2::GetRunTree(TFile *f){ +TTree *PamLevel2::GetRunTree(TFile *f) { + if (run_tree) { + printf("WARNING: TTree *PamLevel2::GetRunTree(TFile *f) -- run_tree already exists!\n "); + return run_tree; + }; + cout << "TTree *PamLevel2::GetRunTree(TFile *f) -- obsolte " << endl; + + TTree *T = (TTree*) f->Get("Run"); + + if (T) { + T->SetBranchAddress("RunInfo", GetPointerTo("RunInfo")); + cout << "Run : set branch address RunInfo" << endl; + T->SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano + cout << "Software : set branch address SoftInfo" << endl; // Emiliano + + } + + run_tree = (TChain*) T; + + return T; - TTree *R = (TTree*)f->Get("Run"); - - R->SetBranchAddress("RunInfo", GetPointerTo("RunInfo")); - cout << "Run : set branch address RunInfo"<SetBranchAddress("SoftInfo", GetPointerTo("SoftInfo")); // Emiliano - cout << "Software : set branch address SoftInfo"<GetEntries() <= 0 ) return(false); + cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, Long64_t iev) --- ATTENZIONE --- NON E` MANTENUTA!!!!!!!.... " + << endl; + if (!run) { + cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, ULong64_t iev) -- ERROR -- missing RunInfo tree " << endl; + return (false); + } + if (run->GetEntries() <= 0) + return (false); // - Int_t oldrun = irun; - if ( irun < 0 ){ - irun = 0; - run->GetEntry(0); - runfirstentry = 0ULL; - runlastentry += (ULong64_t)(this->GetRunInfo()->NEVENTS) - 1ULL; - }; - while ( iev > (runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS-1)) && irun < run->GetEntries() ){ - // printf(" iev %llu %u %llu \n",iev,this->GetRunInfo()->NEVENTS,(ULong64_t)(runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS))); - irun++; - run->GetEntry(irun); - runfirstentry = runlastentry+1ULL; - runlastentry += (ULong64_t)(this->GetRunInfo()->NEVENTS); + + // Int_t oldrun = irun; + Long64_t oldrun = irun; + + // -------------------------------------- + // if it is a full file (not preselected) + // -------------------------------------- + if (SELLI == 0) { + + // + // the absolute time is necessary to relate the event with the run + // + if (!GetOrbitalInfo() && !ISGP) { + cout << "Bool_t PamLevel2::UpdateRunInfo(TChain *run, ULong64_t iev) -- ERROR -- missing OrbitalInfo " << endl; + return (false); + } + + ULong64_t abstime = 0; + if (GetOrbitalInfo()) + abstime = GetOrbitalInfo()->absTime; + + // + // the first time the routine is called, set run search from the beginning + // + if (irun < 0LL) { + irun = 0LL; + run->GetEntry(irun); + runfirstentry = 0LL; + runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS); + if ((Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL) + runlastentry -= 1LL; + + if (ISGP && run->GetEntries() != 1) { + cout << "** WARNING ** simulated files are assumed to have 1 single run, not " << run->GetEntries() << endl; + cout << "** WARNING ** run will not be updated" << endl; + } + + }; + // + if (ISGP) + abstime = GetRunInfo()->RUNHEADER_TIME; // BARBATRUCCO + // + if (irun == run->GetEntries() - 1LL && !(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime + <= GetRunInfo()->RUNTRAILER_TIME)) { + irun = -1LL; + irunt = -1LL; + runfirstentry = 0LL; + runlastentry = -1LL; + }; + // modificato il controllo sull'aggiornamento del run, per evitare problemi + // dovuti agli eventi annidati (NB! NEVENTS conta anche questi!!) + // + bool fromfirst = true; + // + while (!(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime <= GetRunInfo()->RUNTRAILER_TIME) && irun + < run->GetEntries() - 1LL) { + // while ( iev > (runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS-1)) && irun < run->GetEntries() ){ + irun++; + run->GetEntry(irun); + runfirstentry = runlastentry; + if ((Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL) + runfirstentry += 1LL; + runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS); + // cout << " ))))) UPDATE RUN INFO ((((( @iev "<ID<<" irun "<GetRunInfo()->NEVENTS,(ULong64_t)(runfirstentry+(ULong64_t)(this->GetRunInfo()->NEVENTS))); + // printf(" abstime %u trailertime %u \n",abstime,GetRunInfo()->RUNTRAILER_TIME); + // printf(" IDRUN %u \n",GetRunInfo()->ID); + // + // prevshift = 0; + // + if (irun == (Long64_t)(run->GetEntries() - 1LL) && fromfirst && !(abstime >= GetRunInfo()->RUNHEADER_TIME + && abstime <= GetRunInfo()->RUNTRAILER_TIME)) { + printf(" resetting irun (it should NOT happen!!!)\n"); + fromfirst = false; + irun = 0; + run->GetEntry(irun); + runfirstentry = 0ULL; + runlastentry += (Long64_t)(this->GetRunInfo()->NEVENTS); + if ((Long64_t)(this->GetRunInfo()->NEVENTS) > 0LL) + runlastentry -= 1LL; + }; + // + }; + // + if (!(abstime >= GetRunInfo()->RUNHEADER_TIME && abstime <= GetRunInfo()->RUNTRAILER_TIME)) { + printf(" Something very wrong here: cannot find RUN containing absolute time %llu \n", abstime); + return false; + } + // + if (irun == oldrun || irun >= run->GetEntries()) + return (false); + // + // printf(" iev %llu irun %i nevents %u 1st %llu last %llu \n",iev,irun,this->GetRunInfo()->NEVENTS,(ULong64_t)runfirstentry,(ULong64_t)runlastentry); + // + prevshift = 0; + cout << " ))))) UPDATE RUN INFO ((((( @iev " << iev << " run " << GetRunInfo()->ID << " irun " << irun << endl; + // cout << "runfirstentry "<GetEntry(iev); + // cout << irun << " "<< irunentry << endl; + if (irun != oldrun) { + run->GetEntry(irun); + cout << " ))))) UPDATE RUN INFO ((((( @iev " << iev << " run " << GetRunInfo()->ID << " irun " << irun << endl; + prevshift = 0; + return true; + } + return false; + } + + return false; // - if ( irun == oldrun || irun >= run->GetEntries() ) return(false); - // - // printf(" iev %llu irun %i nevents %u 1st %llu last %llu \n",iev,irun,this->GetRunInfo()->NEVENTS,(ULong64_t)runfirstentry,(ULong64_t)runlastentry); - // - return(true); +} +; + +Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) { + + if (!run_tree) { + cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree not loaded" << endl; + return false; + } + if (run_tree->GetEntries() <= 0) { + cout << " Bool_t PamLevel2::UpdateRunInfo(ULong64_t iev) -- ERROR -- run tree is empty" << endl; + return (false); + } + + Int_t oldrun = irun; // store current run index + + // ----------------------------------------------------------------------- + // the first time the routine is called, set run search from the beginning + // ----------------------------------------------------------------------- + + if (irun < 0) { + irun = 0LL; + irunt = 0LL; + irunentry = 0; + prevshift = 0; + run_tree->GetEntry(irun); + if (!GetOrbitalInfo()) + cout << "** WARNING ** missing OrbitalInfo ---> run info might be not correctly updated " << endl; + if (gltsync) + delete gltsync; //Emiliano + if (!dbc || (dbc && !dbc->IsConnected())) + SetDBConnection(); //Emiliano + gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0, "ID", dbc, false); //Emiliano // the "false" means not to use level0 file (not necessary here) + if (dbc){ + dbc->Close();// Emiliano + dbc=0; + }; + }; + // --------------------------------------------------------------- + // retrieve OBT and absolute time of the event + // --------------------------------------------------------------- + ULong64_t abstime = 0LL; + // ULong64_t obt = 0LL; // Emiliano + Long64_t obt = 0LL; // Emiliano, Long64_t GL_TIMESYNC::DBobt(UInt_t obt) since depending on the situation OBT is lowered or boosted + if (GetOrbitalInfo()) { + abstime = GetOrbitalInfo()->absTime; + obt = gltsync->DBobt(GetOrbitalInfo()->OBT); // Emiliano + } + else { + abstime = GetRunInfo()->RUNHEADER_TIME; + obt = gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT); // Emiliano + } + + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + // if it is a full file (not preselected) + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + if (SELLI == 0 || SELLI == 2) { // Emiliano + + // --------------------------------------------------------------- + // increment dead and live-time counters + // (only when reading a file not preselected) + // --------------------------------------------------------------- + if (SELLI == 0) { + if (GetTrigLevel2()) { + totdltime[0] += GetTrigLevel2()->dltime[0]; + totdltime[1] += GetTrigLevel2()->dltime[1]; + } + totdltime[2]++; + } + + // + bool fromfirst = true; // first loop over runs + + + // ------------------------------------------------------ + // loop over runs to find the one that contains the event + // ------------------------------------------------------ + while (( + // ( + // !(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s) + // abstime <= GetRunInfo()->RUNTRAILER_TIME) && + // !(obt >= GetRunInfo()->RUNHEADER_OBT && // additional check on OBT (ms) + // obt <= GetRunInfo()->RUNTRAILER_OBT) + // ) + + !(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s) + abstime <= GetRunInfo()->RUNTRAILER_TIME) || !(obt >= gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) && // additional check on OBT (ms) // Emiliano + obt <= gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT)) // Emiliano + || GetRunInfo()->NEVENTS == 0 + // || !(irunentry < GetRunInfo()->NEVENTS-1-prevshift) // ERRORE!!! fa saltare i run con 1 evento + || !(irunentry <= GetRunInfo()->NEVENTS - 1 - prevshift)) && irun < run_tree->GetEntries()) { + + // if( !(abstime >= GetRunInfo()->RUNHEADER_TIME &&abstime <= GetRunInfo()->RUNTRAILER_TIME) )cout << "ABS TIME "<RUNTRAILER_TIME <= GetRunInfo()->RUNHEADER_OBT && obt <= GetRunInfo()->RUNTRAILER_OBT) )cout << "OBT TIME "<< obt <<" "<< GetRunInfo()->RUNTRAILER_OBT << endl; + // if( GetRunInfo()->NEVENTS==0 )cout <<"GetRunInfo()->NEVENTS==0 "<NEVENTS-1-prevshift) ) cout << "irunentry > "<NEVENTS-1-prevshift << endl; + // - - - - - - - - - - - - - + // irunentry = position of current entry, relative to the run + // prevshift = shift needed to synchronize l0 and l2 data (nested events) + // - - - - - - - - - - - - - + + // ----------------------------------------- + // store dead and live-time of previous run + // ----------------------------------------- + // if(SELLI==0){ + if (SELLI != 2) { + if (fromfirst) { + if (oldrun == irun) { + /// decrement counters + if (GetTrigLevel2()) { + totdltime[0] -= GetTrigLevel2()->dltime[0];//live-time + totdltime[1] -= GetTrigLevel2()->dltime[1];//dead-time + } + totdltime[2]--; //event counter + if (DBG) { + cout << endl; + cout << "n.events : " << totdltime[2] << endl; + cout << "RUN LIVE-TIME: " << totdltime[0] * 0.16 << " ms" << endl; + cout << "RUN DEAD-TIME: " << totdltime[1] * 0.01 << " ms" << endl; + } + } + else { + totdltime[0] = 0;//live-time + totdltime[1] = 0;//dead-time + totdltime[2] = 0; //event counter + if (DBG) + cout << " *** JUMP RUN *** irun " << irun << endl; + } + /// add an entry + if (run_tree_clone) + if (run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries()) + run_tree_clone->GetBranch("DeadLiveTime")->Fill(); + /// reset counters + if (GetTrigLevel2()) { + totdltime[0] = GetTrigLevel2()->dltime[0];//live-time + totdltime[1] = 0; //dead-time + } + totdltime[2] = 1; //event counter + } + } + // } + + irun++; + // ------------------------------------ + // if the end of run tree is reached... + // ------------------------------------ + if (irun == run_tree->GetEntries()) { + if (!fromfirst) { + // ----------------------------------------------------- + // if it happened already once and the run was not found + // ---> exit with error + // ----------------------------------------------------- + cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- ERROR -- event entry #" << iev + << " does not belong to any run (should not happen)" << endl; + return false; + } + // ----------------------------------------- + // ...otherwise repeat search from beginning + // ----------------------------------------- + cout + << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- reached end of run tree. searchin again from beginning " + << endl; + fromfirst = false; + irun = 0LL; + runfirstentry = 0LL; + } + // ------------------------------------------------------------------- + // save the index of the first entry of the run, relative to pam_tree, + // and read a new run + // ------------------------------------------------------------------- + if (irun > 0) + runfirstentry += (GetRunInfo()->NEVENTS) - prevshift; + irunentry = 0; + prevshift = 0; + run_tree->GetEntry(irun);//update runinfo + irunt = irun - irunoffset[run_tree->GetTreeNumber()]; + if (gltsync) + delete gltsync; // Emiliano + if (!dbc || (dbc && !dbc->IsConnected())) + SetDBConnection(); //Emiliano + gltsync = new GL_TIMESYNC(GetRunInfo()->ID_ROOT_L0, "ID", dbc, false); // Emiliano + if (dbc){ + dbc->Close(); // Emiliano + dbc=0; + }; + if (gltsync->DBobt(GetRunInfo()->RUNHEADER_OBT) > gltsync->DBobt(GetRunInfo()->RUNTRAILER_OBT)) { // Emiliano + cout << "Bool_t PamLevel2::UpdateRunInfo(Long64_t iev) -- WARNING -- irun " << irun + << " has RUNHEADER_OBT>=RUNTRAILER_OBT " << endl; + cout + << " (NB!! in this case some events are assigned to a wrong run)" + << endl; + } + // if(hasfrag && fragid != GetRunInfo()->ID){ + // cout << "... where is the next fragment ??"< exit with FALSE + // -------------------------------------- + if (irun == oldrun) + return (false); + + // -------------------------------------- + // ... otherwise + // -------------------------------------- + + + // -------------------------------------- + // ---> exit with TRUE + // -------------------------------------- + if (DBG) + cout << endl << " ))))) UPDATE RUN INFO ((((( @iev " << iev << " run " << GetRunInfo()->ID << " irun " << irun + << endl; + // ---------------------------------------------------- + // update the tracker parameters + // (non ho trovato nessun altro modo sicuro di farlo...) + // ---------------------------------------------------- + if (!dbc || (dbc && !dbc->IsConnected())) + SetDBConnection(); + TrkParams::Set(GetRunInfo(), dbc); + if (dbc){ + dbc->Close(); + dbc=0; + }; + + // ---------------------------------------------------- + // then check if the run has a fragment + // in this case we have to switch to the next fragment + // when the end of the first fragment is reached + // ---------------------------------------------------- + if (GetRunInfo()->ID_RUN_FRAG != 0 && + // GetRunInfo()->ID_RUN_FRAG != GetRunInfo()->ID && + DBG && true) { + cout << "* fragment *" << endl; + } + + return (true); + }; + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + // if it is a preselected file (there is SelectionList) + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + // irun = run entry relative to the chain + // irunt = run entry relative to the tree + if (SELLI == 1) { + sel_tree->GetEntry(iev);// read irunt from SelectionList + irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW + if (irun != oldrun) { + if (irun < run_tree->GetEntries()) + run_tree->GetEntry(irun); + // check if the time is ok (with merged files it is not...) + // if not loop over run and look for the proper entry + bool SECONDO_GIRO = false; + // Long64_t irun_start = irun; + int offset_start = irunoffset[sel_tree->GetTreeNumber()]; + while (((!(abstime >= GetRunInfo()->RUNHEADER_TIME && // check on absolute time (s) + abstime <= GetRunInfo()->RUNTRAILER_TIME) + // || + // !(obt >= GetRunInfo()->RUNHEADER_OBT && // additional check on OBT (ms) + // obt <= GetRunInfo()->RUNTRAILER_OBT) + ) || GetRunInfo()->NEVENTS == 0) + // && irun < run_tree->GetEntries() + ) { + + if (DBG) { + cout << " (test) "; + cout << " tree " << sel_tree->GetTreeNumber(); + cout << " irunt " << irunt; + cout << " offset " << irunoffset[sel_tree->GetTreeNumber()]; + cout << " abs " << abstime; + cout << " >> " << GetRunInfo()->RUNHEADER_TIME << " " << GetRunInfo()->RUNTRAILER_TIME; + cout << " obt " << obt; + cout << " >> " << GetRunInfo()->RUNHEADER_OBT << " " << GetRunInfo()->RUNTRAILER_OBT; + cout << " *** JUMP RUN *** irun " << irun; + cout << endl; + } + // irun++; + irunoffset[sel_tree->GetTreeNumber()]++; + irun = irunt + irunoffset[sel_tree->GetTreeNumber()];//NEWNEW + if (irun == run_tree->GetEntries() && SECONDO_GIRO) { + // if(irun == irun_start ){ + cout << " ...grrrvzzkhhhajsdkj!!!! " << endl; + irunoffset[sel_tree->GetTreeNumber()] = offset_start; + return false; + } + if (irun >= run_tree->GetEntries() || irun < 0) { + cout << "irun = " << irun << " >> search from the beginning... <<" << endl; + SECONDO_GIRO = true; + irun = 0; + irunoffset[sel_tree->GetTreeNumber()] = -irunt; + } + run_tree->GetEntry(irun); + } + + if (DBG) { + cout << " (test) "; + cout << " tree " << sel_tree->GetTreeNumber(); + cout << " irunt " << irunt; + cout << " offset " << irunoffset[sel_tree->GetTreeNumber()]; + cout << " abs " << abstime; + cout << " >> " << GetRunInfo()->RUNHEADER_TIME << " " << GetRunInfo()->RUNTRAILER_TIME; + cout << " obt " << obt; + cout << " >> " << GetRunInfo()->RUNHEADER_OBT << " " << GetRunInfo()->RUNTRAILER_OBT; + } + if (DBG) + cout << endl; + if (DBG) + cout << endl << " ))))) UPDATE RUN INFO ((((( @iev " << iev << " run " << GetRunInfo()->ID << " (run-entry " + << irun << ")" << endl; + // ---------------------------------------------------- + // update the tracker parameters + // (non ho trovato nessun altro modo sicuro di farlo...) + // ---------------------------------------------------- + if (!dbc || (dbc && !dbc->IsConnected())) + SetDBConnection(); + TrkParams::Set(GetRunInfo(), dbc); + if (dbc){ + dbc->Close(); + dbc=0; + }; + // cout << endl; + prevshift = 0; + return true; + } + return false; + } + + return false; // -}; +} +; /** * Update the runinfo informations (to be used to have Run infos event by event basis) - * @param run Pointer to the chain/tree which contains run infos + * @param run Pointer to the chain/tree which contains run infos * @return true if a new run has been read, false if it is still the same run */ -Bool_t PamLevel2::UpdateRunInfo(TTree *run, ULong64_t iev){ - return(UpdateRunInfo((TChain*)run,iev)); -}; +Bool_t PamLevel2::UpdateRunInfo(TTree *run, Long64_t iev) { + return (UpdateRunInfo((TChain*) run, iev)); +} +; //-------------------------------------- // @@ -1472,261 +3215,409 @@ //-------------------------------------- /** * Set which trees shoul be analysed - * @param detlist TString containing the sequence of trees required -*/ -void PamLevel2::SetWhichTrees(TString detlist){ - - if(detlist.IsNull() || detlist.Contains("+ALL", TString::kIgnoreCase)){ - CAL1 = true; - CAL2 = true; - TRK2 = true; - TRK1 = false; - TRKh = false; - TRG = true; - TOF = true; - S4 = true; - ND = true; - AC = true; - ORB = true; - }else if( detlist.Contains("-ALL", TString::kIgnoreCase) ){ - CAL1 = false; - CAL2 = false; - TRK2 = false; - TRK1 = false; - TRKh = false; - TRG = false; - TOF = false; - S4 = false; - ND = false; - AC = false; - ORB = false; - }; - -// ------------------------------------------------------------------------- - if( detlist.Contains("CAL1", TString::kIgnoreCase) ){ - if ( detlist.Contains("-CAL1", TString::kIgnoreCase) )CAL1=false; - if ( detlist.Contains("+CAL1", TString::kIgnoreCase) )CAL1=true; - }; - - if( detlist.Contains("CAL2", TString::kIgnoreCase)){ - if ( detlist.Contains("-CAL2", TString::kIgnoreCase) )CAL2=false; - if ( detlist.Contains("+CAL2", TString::kIgnoreCase) )CAL2=true; - }; - - if( detlist.Contains("+CAL", TString::kIgnoreCase) && !CAL1 && !CAL2 )CAL2=true; - if( detlist.Contains("-CAL", TString::kIgnoreCase) && CAL1 && CAL2 ){ - CAL2=false; - CAL1=false; - } -// ------------------------------------------------------------------------- - if( detlist.Contains("TRK1", TString::kIgnoreCase) ){ - if ( detlist.Contains("-TRK1", TString::kIgnoreCase) )TRK1=false; - if ( detlist.Contains("+TRK1", TString::kIgnoreCase) )TRK1=true; - }; - - if( detlist.Contains("TRK2", TString::kIgnoreCase)){ - if ( detlist.Contains("-TRK2", TString::kIgnoreCase) )TRK2=false; - if ( detlist.Contains("+TRK2", TString::kIgnoreCase) )TRK2=true; - }; - - if( detlist.Contains("TRKh", TString::kIgnoreCase)){ - if ( detlist.Contains("-TRKh", TString::kIgnoreCase) )TRKh=false; - if ( detlist.Contains("+TRKh", TString::kIgnoreCase) )TRKh=true; - }; - - if( detlist.Contains("+TRK", TString::kIgnoreCase) && !TRK1 && !TRK2 && !TRKh )TRK2=true; - if( detlist.Contains("-TRK", TString::kIgnoreCase) && TRK1 && TRK2 && TRKh){ - TRK2=false; - TRK1=false; - TRKh=false; - } -// ------------------------------------------------------------------------- - - if( detlist.Contains("-TRG", TString::kIgnoreCase) )TRG = false; - else if( detlist.Contains("+TRG", TString::kIgnoreCase) )TRG = true; - - if( detlist.Contains("-TOF", TString::kIgnoreCase) )TOF = false; - else if( detlist.Contains("+TOF", TString::kIgnoreCase) )TOF = true; - - if( detlist.Contains("-S4", TString::kIgnoreCase) )S4 = false; - else if( detlist.Contains("+S4", TString::kIgnoreCase) )S4 = true; - - if( detlist.Contains("-ND", TString::kIgnoreCase) )ND = false; - else if( detlist.Contains("+ND", TString::kIgnoreCase) )ND = true; - - if( detlist.Contains("-AC", TString::kIgnoreCase) )AC = false; - else if( detlist.Contains("+AC", TString::kIgnoreCase) )AC = true; - - if( detlist.Contains("-ORB", TString::kIgnoreCase) )ORB = false; - else if( detlist.Contains("+ORB", TString::kIgnoreCase) )ORB = true; - -// cout<< "Set detector list --> "; -// if(TRK1)cout<<"TRK1 "; -// if(TRK2)cout<<"TRK2 "; -// if(TRKh)cout<<"TRKH "; -// if(CAL1)cout<<"CAL1 "; -// if(CAL2)cout<<"CAL2 "; -// if(TOF)cout<<"TOF "; -// if(TRG)cout<<"TRG "; -// if(AC)cout<<"AC "; -// if(ND)cout<<"ND "; -// if(S4)cout<<"S4 "; -// if(ORB)cout<<"ORB "; -// cout << endl; - -}; + * @param detlist TString containing the sequence of trees required + */ +void PamLevel2::SetWhichTrees(TString detlist) { + + // if(detlist.IsNull() || detlist.Contains("+ALL", TString::kIgnoreCase)){ + if (detlist.Contains("+ALL", TString::kIgnoreCase)) { + cout << " ======================================================== " << endl; + cout << " (( WARNING )) " << endl; + cout << " The meaning of the option +ALL has changed!! " << endl; + cout << " Now it includes really all (level0+level1+level2+gpamela)" << endl; + cout << " and the file is discarded if it does not contain " << endl; + cout << " all trees or if level0 files are not available!! " << endl; + cout << " ======================================================== " << endl; + + CAL0 = true; + CAL1 = true; + CAL2 = true; + TRK2 = true; + TRK1 = true; + TRKh = true; + TRK0 = true; + TRG = true; + TOF = true; + TOF0 = true; + S4 = true; + ND = true; + AC = true; + ORB = true; + GP = true; + } + else if (detlist.Contains("-ALL", TString::kIgnoreCase)) { + CAL0 = false; + CAL1 = false; + CAL2 = false; + TRK2 = false; + TRK1 = false; + TRKh = false; + TRK0 = false; + TRG = false; + TOF = false; + TOF0 = false; + S4 = false; + ND = false; + AC = false; + ORB = false; + GP = false; + }; + + // ------------------------------------------------------------------------- + if (detlist.Contains("CAL1", TString::kIgnoreCase)) { + if (detlist.Contains("-CAL1", TString::kIgnoreCase)) + CAL1 = false; + if (detlist.Contains("+CAL1", TString::kIgnoreCase)) + CAL1 = true; + }; + + if (detlist.Contains("CAL0", TString::kIgnoreCase)) { + if (detlist.Contains("-CAL0", TString::kIgnoreCase)) + CAL0 = false; + if (detlist.Contains("+CAL0", TString::kIgnoreCase)) + CAL0 = true; + }; + + if (detlist.Contains("CAL2", TString::kIgnoreCase)) { + if (detlist.Contains("-CAL2", TString::kIgnoreCase)) + CAL2 = false; + if (detlist.Contains("+CAL2", TString::kIgnoreCase)) + CAL2 = true; + }; + + if (detlist.Contains("+CAL", TString::kIgnoreCase) && !CAL1 && !CAL2) + CAL2 = true; + if (detlist.Contains("-CAL", TString::kIgnoreCase) && CAL1 && CAL2) { + CAL2 = false; + CAL1 = false; + } + // ------------------------------------------------------------------------- + if (detlist.Contains("TRK0", TString::kIgnoreCase)) { + if (detlist.Contains("-TRK0", TString::kIgnoreCase)) + TRK0 = false; + if (detlist.Contains("+TRK0", TString::kIgnoreCase)) + TRK0 = true; + }; + + if (detlist.Contains("TRK1", TString::kIgnoreCase)) { + if (detlist.Contains("-TRK1", TString::kIgnoreCase)) + TRK1 = false; + if (detlist.Contains("+TRK1", TString::kIgnoreCase)) + TRK1 = true; + }; + + if (detlist.Contains("TRK2", TString::kIgnoreCase)) { + if (detlist.Contains("-TRK2", TString::kIgnoreCase)) + TRK2 = false; + if (detlist.Contains("+TRK2", TString::kIgnoreCase)) + TRK2 = true; + }; + + if (detlist.Contains("TRKh", TString::kIgnoreCase)) { + if (detlist.Contains("-TRKh", TString::kIgnoreCase)) + TRKh = false; + if (detlist.Contains("+TRKh", TString::kIgnoreCase)) + TRKh = true; + }; + + if (detlist.Contains("+TRK", TString::kIgnoreCase) && !TRK1 && !TRK2 && !TRKh) + TRK2 = true; + if (detlist.Contains("-TRK", TString::kIgnoreCase) && TRK1 && TRK2 && TRKh) { + TRK2 = false; + TRK1 = false; + TRKh = false; + } + // ------------------------------------------------------------------------- + + if (detlist.Contains("-TRG", TString::kIgnoreCase)) + TRG = false; + else if (detlist.Contains("+TRG", TString::kIgnoreCase)) + TRG = true; + + if (detlist.Contains("-TOF", TString::kIgnoreCase)) + TOF = false; + else if (detlist.Contains("+TOF", TString::kIgnoreCase)) + TOF = true; + + if (detlist.Contains("-TOF0", TString::kIgnoreCase)) + TOF0 = false; + else if (detlist.Contains("+TOF0", TString::kIgnoreCase)) + TOF0 = true; + + if (detlist.Contains("-S4", TString::kIgnoreCase)) + S4 = false; + else if (detlist.Contains("+S4", TString::kIgnoreCase)) + S4 = true; + + if (detlist.Contains("-ND", TString::kIgnoreCase)) + ND = false; + else if (detlist.Contains("+ND", TString::kIgnoreCase)) + ND = true; + + if (detlist.Contains("-AC", TString::kIgnoreCase)) + AC = false; + else if (detlist.Contains("+AC", TString::kIgnoreCase)) + AC = true; + + if (detlist.Contains("-ORB", TString::kIgnoreCase)) + ORB = false; + else if (detlist.Contains("+ORB", TString::kIgnoreCase)) + ORB = true; + + if (detlist.Contains("-GP", TString::kIgnoreCase)) + GP = false; + else if (detlist.Contains("+GP", TString::kIgnoreCase)) + GP = true; + + cout << "tree/branch list from input --> "; + if (TRK0) + cout << "TRK0 "; + if (TRK1) + cout << "TRK1 "; + if (TRK2) + cout << "TRK2 "; + if (TRKh) + cout << "TRKH "; + if (CAL0) + cout << "CAL0 "; + if (CAL1) + cout << "CAL1 "; + if (CAL2) + cout << "CAL2 "; + if (TOF) + cout << "TOF "; + if (TRG) + cout << "TRG "; + if (AC) + cout << "AC "; + if (ND) + cout << "ND "; + if (S4) + cout << "S4 "; + if (ORB) + cout << "ORB "; + if (GP) + cout << "GP "; + cout << endl; + // cout<< "Set detector list --> "; + // if(TRK1)cout<<"TRK1 "; + // if(TRK2)cout<<"TRK2 "; + // if(TRKh)cout<<"TRKH "; + // if(CAL1)cout<<"CAL1 "; + // if(CAL2)cout<<"CAL2 "; + // if(TOF0)cout<<"TOF0 "; + // if(TOF)cout<<"TOF "; + // if(TRG)cout<<"TRG "; + // if(AC)cout<<"AC "; + // if(ND)cout<<"ND "; + // if(S4)cout<<"S4 "; + // if(ORB)cout<<"ORB "; + // cout << endl; + +} +; /** * Set tree/branch detector flags from the content of a tree */ -void PamLevel2::GetWhichTrees(TFile* f){ - - // ----------- - // reset flags - // ----------- - CAL1 = false; - CAL2 = false; - TRK2 = false; - TRK1 = false; - TRKh = false; - TRG = false; - TOF = false; - S4 = false; - ND = false; - AC = false; - ORB = false; - - RUN = false; - - cout << "Checking file: "<GetName()<IsZombie() ){ - cout << "File: "<< f->GetName() <<" Non valid root file"<< endl; - return; - } - - TList *lk = f->GetListOfKeys(); - TIter next(lk); - TKey *key =0; - - Int_t nev = 0; - - while( (key = (TKey*)next()) ){ - - if( !strcmp(key->GetName(),"Run" ) )RUN = true; - - //========================================================= - if( !strcmp(key->GetName(),"Trigger" ) ){ - TRG = true; - Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" Trigger tree has "<GetName(),"ToF" ) ){ - TOF = true; - Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" ToF tree has "<GetName(),"S4" ) ){ - S4 = true; - Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" S4 tree has "<GetName(),"NeutronD" ) ){ - ND = true; - Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<"NeutronD tree has "<GetName(),"Anticounter") ){ - AC = true; - Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" Anticounter tree has "<GetName(),"OrbitalInfo") ){ - ORB = true; - Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" OrbitalInfo tree has "<GetName(),"Tracker" ) ){ - TTree *T = (TTree*)f->Get("Tracker"); - for(Int_t i=0; iGetListOfBranches()->GetEntries(); i++){ - TString name = T->GetListOfBranches()->At(i)->GetName(); - if( !name.CompareTo("TrkLevel1") )TRK1=true; - if( !name.CompareTo("TrkLevel2") )TRK2=true; - if( !name.CompareTo("TrkHough") )TRKh=true; - }; - Int_t nevt = T->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" Tracker tree has "<Delete(); - }; - //========================================================= - if( !strcmp(key->GetName(),"Calorimeter" ) ){ - TTree *T = (TTree*)f->Get("Calorimeter"); - for(Int_t i=0; iGetListOfBranches()->GetEntries(); i++){ - TString name = T->GetListOfBranches()->At(i)->GetName(); - if( !name.CompareTo("CaloLevel1") )CAL1=true; - if( !name.CompareTo("CaloLevel2") )CAL2=true; - }; - Int_t nevt = T->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" Calorimeter tree has "<Delete(); - }; - - }; - - delete lk; - -// cout<< "Get detector list from input file --> "; -// if(TRK1)cout<<"TRK1 "; -// if(TRK2)cout<<"TRK2 "; -// if(TRKh)cout<<"TRKH "; -// if(CAL1)cout<<"CAL1 "; -// if(CAL2)cout<<"CAL2 "; -// if(TOF)cout<<"TOF "; -// if(TRG)cout<<"TRG "; -// if(AC)cout<<"AC "; -// if(ND)cout<<"ND "; -// if(S4)cout<<"S4 "; -// if(ORB)cout<<"ORB "; -// cout << endl; - - return ; - -}; +void PamLevel2::GetWhichTrees(TFile* f) { + + // cout << "void PamLevel2::GetWhichTrees(TFile* f) --- WARNING!! --- ...potrebbe non funzionare "<GetName()<IsZombie()) { + cout << "File: " << f->GetName() << " Non valid root file" << endl; + return; + } + + TList *lk = f->GetListOfKeys(); + if (!lk) + return; + TIter next(lk); + TKey *key = 0; + + Int_t nev = 0; + + while ((key = (TKey*) next())) { + + if (!strcmp(key->GetName(), "Run")) + RUN = true; + + //========================================================= + if (!strcmp(key->GetName(), "Trigger")) { + TRG = true; + Int_t nevt = ((TTree*) f->Get("Trigger"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " Trigger tree has " << nevt << " events instead of " << nev << endl; + TRG = false; + } + else + nev = nevt; + } + //========================================================= + if (!strcmp(key->GetName(), "ToF")) { + TOF = true; + Int_t nevt = ((TTree*) f->Get("ToF"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " ToF tree has " << nevt << " events instead of " << nev << endl; + TOF = false; + } + else + nev = nevt; + } + //========================================================= + if (!strcmp(key->GetName(), "S4")) { + S4 = true; + Int_t nevt = ((TTree*) f->Get("S4"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " S4 tree has " << nevt << " events instead of " << nev << endl; + S4 = false; + } + else + nev = nevt; + } + //========================================================= + + if (!strcmp(key->GetName(), "NeutronD")) { + ND = true; + Int_t nevt = ((TTree*) f->Get("NeutronD"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << "NeutronD tree has " << nevt << " events instead of " << nev << endl; + ND = false; + } + else + nev = nevt; + } + //========================================================= + if (!strcmp(key->GetName(), "Anticounter")) { + AC = true; + Int_t nevt = ((TTree*) f->Get("Anticounter"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " Anticounter tree has " << nevt << " events instead of " << nev << endl; + AC = false; + } + else + nev = nevt; + } + //========================================================= + if (!strcmp(key->GetName(), "OrbitalInfo")) { + ORB = true; + Int_t nevt = ((TTree*) f->Get("OrbitalInfo"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " OrbitalInfo tree has " << nevt << " events instead of " << nev << endl; + ORB = false; + } + else + nev = nevt; + } + //========================================================= + if (!strcmp(key->GetName(), "Tracker")) { + TTree *T = (TTree*) f->Get("Tracker"); + for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) { + TString name = T->GetListOfBranches()->At(i)->GetName(); + if (!name.CompareTo("TrkLevel1")) + TRK1 = true; + if (!name.CompareTo("TrkLevel2")) + TRK2 = true; + if (!name.CompareTo("TrkHough")) + TRKh = true; + }; + Int_t nevt = T->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " Tracker tree has " << nevt << " events instead of " << nev << endl; + TRK1 = false; + TRK2 = false; + TRKh = false; + } + else + nev = nevt; + // T->Delete(); + }; + //========================================================= + if (!strcmp(key->GetName(), "Calorimeter")) { + TTree *T = (TTree*) f->Get("Calorimeter"); + for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) { + TString name = T->GetListOfBranches()->At(i)->GetName(); + if (!name.CompareTo("CaloLevel1")) + CAL1 = true; + if (!name.CompareTo("CaloLevel2")) + CAL2 = true; + }; + Int_t nevt = T->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " Calorimeter tree has " << nevt << " events instead of " << nev << endl; + CAL1 = false; + CAL2 = false; + } + else + nev = nevt; + // T->Delete(); + }; + //========================================================= + if (!strcmp(key->GetName(), "h20")) { + GP = true; + Int_t nevt = ((TTree*) f->Get("h20"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " h20 tree has " << nevt << " events instead of " << nev << endl; + GP = false; + } + else + nev = nevt; + } + + }; + // delete lk; + + cout << "tree/branch list from file --> "; + if (TRK1) + cout << "TRK1 "; + if (TRK2) + cout << "TRK2 "; + if (TRKh) + cout << "TRKH "; + if (CAL1) + cout << "CAL1 "; + if (CAL2) + cout << "CAL2 "; + if (TOF) + cout << "TOF "; + if (TRG) + cout << "TRG "; + if (AC) + cout << "AC "; + if (ND) + cout << "ND "; + if (S4) + cout << "S4 "; + if (ORB) + cout << "ORB "; + if (GP) + cout << "GP "; + cout << endl; + + return; + +} +; //-------------------------------------- // @@ -1737,584 +3628,976 @@ * @param name File name * @return true if the file is ok. */ -Bool_t PamLevel2::CheckLevel2File(TString name){ - - Bool_t CAL1__ok = false; - Bool_t CAL2__ok = false; - Bool_t TRK2__ok = false; - Bool_t TRK1__ok = false; - Bool_t TRKh__ok = false; - Bool_t TRG__ok = false; - Bool_t TOF__ok = false; - Bool_t S4__ok = false; - Bool_t ND__ok = false; - Bool_t AC__ok = false; - Bool_t ORB__ok = false; - - Bool_t RUN__ok = false; - - - - cout << "Checking file: "<IsZombie() ){ - cout << "File: "<< f->GetName() <<" discarded ---- Non valid root file"<< endl; return false; - } -// cout << "Get list of keys: "<GetListOfKeys(); -// lk->Print(); - TIter next(lk); - TKey *key =0; - - Int_t nev = 0; - - while( (key = (TKey*)next()) ){ - -// cout << key->GetName() << ""<GetClassName()<Get(key->GetName())<GetClassName()=="TTree" && nev_previous && nev != nev_previous ){ -// nev = ((TTree*)f->Get(key->GetName()))->GetEntries(); -// cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<GetName(),"Run" ) )RUN__ok = true; - - //========================================================= - if( !strcmp(key->GetName(),"Trigger" ) ){ - TRG__ok = true; - if(TRG){ - Int_t nevt = ((TTree*)f->Get("Trigger"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- Trigger tree has "<GetName(),"ToF" ) ){ - TOF__ok = true; - if(TOF){ - Int_t nevt = ((TTree*)f->Get("ToF"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- ToF tree has "<GetName(),"S4" ) ){ - S4__ok = true; - if(S4){ - Int_t nevt = ((TTree*)f->Get("S4"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- S4 tree has "<GetName(),"NeutronD" ) ){ - ND__ok = true; - if(ND){ - Int_t nevt = ((TTree*)f->Get("NeutronD"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- NeutronD tree has "<GetName(),"Anticounter") ){ - AC__ok = true; - if(AC){ - Int_t nevt = ((TTree*)f->Get("Anticounter"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- Anticounter tree has "<GetName(),"OrbitalInfo") ){ - ORB__ok = true; - if(ORB){ - Int_t nevt = ((TTree*)f->Get("OrbitalInfo"))->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- OrbitalInfo tree has "<GetName(),"Tracker" ) ){ - TTree *T = (TTree*)f->Get("Tracker"); - if(TRK1||TRK2||TRKh){ - Int_t nevt = T->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- Tracker tree has "<GetListOfBranches()->GetEntries(); i++){ - TString name = T->GetListOfBranches()->At(i)->GetName(); - if( !name.CompareTo("TrkLevel1") )TRK1__ok=true; - if( !name.CompareTo("TrkLevel2") )TRK2__ok=true; - if( !name.CompareTo("TrkHough") )TRKh__ok=true; - }; - T->Delete(); - }; - //========================================================= - if( !strcmp(key->GetName(),"Calorimeter" ) ){ - TTree *T = (TTree*)f->Get("Calorimeter"); - if(CAL1||CAL2){ - Int_t nevt = T->GetEntries(); - if( nev && nevt!=nev){ - cout << "File: "<< f->GetName() <<" discarded ---- Calorimeter tree has "<GetListOfBranches()->GetEntries(); i++){ - TString name = T->GetListOfBranches()->At(i)->GetName(); - if( !name.CompareTo("CaloLevel1") )CAL1__ok=true; - if( !name.CompareTo("CaloLevel2") )CAL2__ok=true; - }; - T->Delete(); - }; - - }; - -// cout<< "CheckLevel2File(TString): detector list --> "; -// if(TRK1__ok)cout<<"TRK1 "; -// if(TRK2__ok)cout<<"TRK2 "; -// if(TRKh__ok)cout<<"TRKH "; -// if(CAL1__ok)cout<<"CAL1 "; -// if(CAL2__ok)cout<<"CAL2 "; -// if(TOF__ok)cout<<"TOF "; -// if(TRG__ok)cout<<"TRG "; -// if(AC__ok)cout<<"AC "; -// if(ND__ok)cout<<"ND "; -// if(S4__ok)cout<<"S4 "; -// if(ORB__ok)cout<<"ORB "; -// cout << endl; - - - if(TRK2 && TRK1__ok)TRK1=1; -// ---------------------------------------------------------------------------- -// NOTA -// se c'e` il level1, lo devo necessarimente leggere. -// infatti (non ho capito perche`) i cluster vengono letti e allocati in memoria -// comunque, ma non vengono disallocati da PamLevel2::Clear() -// ---------------------------------------------------------------------------- - - - if(!RUN__ok) { - cout << "File: "<< f->GetName() <<" *WARNING* ---- Missing RunInfo tree"<< endl; -// return false; - }; - - if(CAL1 && !CAL1__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel1 branch"<< endl; - return false; - }; - if(CAL2 && !CAL2__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing CaloLevel2 branch"<< endl; - return false; - }; - if(TRK2 && !TRK2__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel2 branch"<< endl; - return false; - }; - if(TRK1 && !TRK1__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkLevel1 branch"<< endl; - return false; - }; - if(TRKh && !TRKh__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing TrkHough branch"<< endl; - return false; - }; - if(ORB && !ORB__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing ORB tree"<< endl; - return false; - }; - if(AC && !AC__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing AC tree"<< endl; - return false; - }; - if(S4 && !S4__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing S4 tree"<< endl; - return false; - }; - if(TOF && !TOF__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing ToF tree"<< endl; - return false; - }; - - if(ND && !ND__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing ND tree"<< endl; - return false; - }; - if(TRG && !TRG__ok){ - cout << "File: "<< f->GetName() <<" discarded ---- Missing Trigger tree"<< endl; - return false; - }; - - -// lk->Delete(); -// delete lk; - f->Close(); - -// cout<< "CheckLevel2File(TString): detector list --> "; -// if(TRK1)cout<<"TRK1 "; -// if(TRK2)cout<<"TRK2 "; -// if(TRKh)cout<<"TRKH "; -// if(CAL1)cout<<"CAL1 "; -// if(CAL2)cout<<"CAL2 "; -// if(TOF)cout<<"TOF "; -// if(TRG)cout<<"TRG "; -// if(AC)cout<<"AC "; -// if(ND)cout<<"ND "; -// if(S4)cout<<"S4 "; -// if(ORB)cout<<"ORB "; -// cout << endl; - - return true; - -}; +Bool_t PamLevel2::CheckLevel2File(TString name) { + + Bool_t CAL1__ok = false; + Bool_t CAL2__ok = false; + Bool_t TRK2__ok = false; + Bool_t TRK1__ok = false; + Bool_t TRKh__ok = false; + Bool_t TRG__ok = false; + Bool_t TOF__ok = false; + Bool_t S4__ok = false; + Bool_t ND__ok = false; + Bool_t AC__ok = false; + Bool_t ORB__ok = false; + Bool_t GP__ok = false; + + Bool_t RUN__ok = false; + + Bool_t SELLI__ok = false; + + // cout << "Checking file: "<IsZombie()) { + cout << "File: " << f->GetName() << " discarded ---- Non valid root file" << endl; + return false; + } + // cout << "Get list of keys: "<GetListOfKeys(); + // lk->Print(); + TIter next(lk); + TKey *key = 0; + + Int_t nev = 0; + + while ((key = (TKey*) next())) { + + // cout << key->GetName() << endl; + // cout << key->GetName() << ""<GetClassName()<Get(key->GetName())<GetClassName()=="TTree" && nev_previous && nev != nev_previous ){ + // nev = ((TTree*)f->Get(key->GetName()))->GetEntries(); + // cout << "File: "<< f->GetName() <<" discarded ---- "<< key->GetName() << " tree: n.entries does not match "<GetName(), "Run")) + RUN__ok = true; + + //========================================================= + if (!strcmp(key->GetName(), "SelectionList")) { + SELLI__ok = true; + if (SELLI == 1) { + Int_t nevt = ((TTree*) f->Get("SelectionList"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- SelectionList tree has " << nevt + << " events instead of " << nev << endl; + return false; + } + nev = nevt; + } + } + + //========================================================= + if (!strcmp(key->GetName(), "Trigger")) { + TRG__ok = true; + if (TRG) { + Int_t nevt = ((TTree*) f->Get("Trigger"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- Trigger tree has " << nevt << " events instead of " + << nev << endl; + return false; + } + nev = nevt; + } + } + //========================================================= + if (!strcmp(key->GetName(), "ToF")) { + TOF__ok = true; + if (TOF) { + Int_t nevt = ((TTree*) f->Get("ToF"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- ToF tree has " << nevt << " events instead of " << nev + << endl; + return false; + } + nev = nevt; + } + } + //========================================================= + if (!strcmp(key->GetName(), "S4")) { + S4__ok = true; + if (S4) { + Int_t nevt = ((TTree*) f->Get("S4"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- S4 tree has " << nevt << " events instead of " << nev + << endl; + return false; + } + nev = nevt; + } + } + //========================================================= + + if (!strcmp(key->GetName(), "NeutronD")) { + ND__ok = true; + if (ND) { + Int_t nevt = ((TTree*) f->Get("NeutronD"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- NeutronD tree has " << nevt << " events instead of " + << nev << endl; + return false; + } + nev = nevt; + } + } + //========================================================= + if (!strcmp(key->GetName(), "Anticounter")) { + AC__ok = true; + if (AC) { + Int_t nevt = ((TTree*) f->Get("Anticounter"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- Anticounter tree has " << nevt << " events instead of " + << nev << endl; + return false; + } + nev = nevt; + } + } + //========================================================= + if (!strcmp(key->GetName(), "OrbitalInfo")) { + ORB__ok = true; + if (ORB) { + Int_t nevt = ((TTree*) f->Get("OrbitalInfo"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- OrbitalInfo tree has " << nevt << " events instead of " + << nev << endl; + return false; + } + nev = nevt; + } + } + //========================================================= + if (!strcmp(key->GetName(), "Tracker")) { + TTree *T = (TTree*) f->Get("Tracker"); + if (TRK1 || TRK2 || TRKh) { + Int_t nevt = T->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- Tracker tree has " << nevt << " events instead of " + << nev << endl; + return false; + } + nev = nevt; + } + for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) { + TString name = T->GetListOfBranches()->At(i)->GetName(); + if (!name.CompareTo("TrkLevel1")) + TRK1__ok = true; + if (!name.CompareTo("TrkLevel2")) + TRK2__ok = true; + if (!name.CompareTo("TrkHough")) + TRKh__ok = true; + }; + T->Delete(); + }; + //========================================================= + if (!strcmp(key->GetName(), "Calorimeter")) { + TTree *T = (TTree*) f->Get("Calorimeter"); + if (CAL1 || CAL2) { + Int_t nevt = T->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- Calorimeter tree has " << nevt << " events instead of " + << nev << endl; + return false; + } + nev = nevt; + } + for (Int_t i = 0; i < T->GetListOfBranches()->GetEntries(); i++) { + TString name = T->GetListOfBranches()->At(i)->GetName(); + if (!name.CompareTo("CaloLevel1")) + CAL1__ok = true; + if (!name.CompareTo("CaloLevel2")) + CAL2__ok = true; + }; + T->Delete(); + }; + //========================================================= + if (!strcmp(key->GetName(), "h20")) { + ISGP = true; + GP__ok = true; + if (GP) { + Int_t nevt = ((TTree*) f->Get("h20"))->GetEntries(); + if (nev && nevt != nev) { + cout << "File: " << f->GetName() << " discarded ---- h20 tree has " << nevt << " events instead of " << nev + << endl; + return false; + } + nev = nevt; + } + } + + }; + + if (SELLI == -1) + SELLI = (Int_t) SELLI__ok; + if (SELLI == 0 && SELLI__ok) { + cout << "File: " << f->GetName() << " discarded ---- found SelectionList (it is not a full-event file)" << endl; + return false; + } + if (SELLI == 1 && !SELLI__ok) { + cout << "File: " << f->GetName() << " discarded ---- SelectionList missing" << endl; + return false; + } + + // cout << "SELLI "< "; + // if(TRK1__ok)cout<<"TRK1 "; + // if(TRK2__ok)cout<<"TRK2 "; + // if(TRKh__ok)cout<<"TRKH "; + // if(CAL1__ok)cout<<"CAL1 "; + // if(CAL2__ok)cout<<"CAL2 "; + // if(TOF__ok)cout<<"TOF "; + // if(TRG__ok)cout<<"TRG "; + // if(AC__ok)cout<<"AC "; + // if(ND__ok)cout<<"ND "; + // if(S4__ok)cout<<"S4 "; + // if(ORB__ok)cout<<"ORB "; + // cout << endl; + + + if (TRK2 && TRK1__ok) + TRK1 = 1; + // ---------------------------------------------------------------------------- + // NOTA + // se c'e` il level1, lo devo necessarimente leggere. + // infatti (non ho capito perche`) i cluster vengono letti e allocati in memoria + // comunque, ma non vengono disallocati da PamLevel2::Clear() + // ---------------------------------------------------------------------------- + + + if (!RUN__ok) { + cout << "File: " << f->GetName() << " *WARNING* ---- Missing RunInfo tree (NB: RUN infos will not be updated)" + << endl; + RUN = false; + }; + + if (CAL1 && !CAL1__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel1 branch" << endl; + return false; + }; + if (CAL2 && !CAL2__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing CaloLevel2 branch" << endl; + return false; + }; + if (TRK2 && !TRK2__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel2 branch" << endl; + return false; + }; + if (TRK1 && !TRK1__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing TrkLevel1 branch" << endl; + return false; + }; + if (TRKh && !TRKh__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing TrkHough branch" << endl; + return false; + }; + if (ORB && !ORB__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing ORB tree" << endl; + return false; + }; + if (AC && !AC__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing AC tree" << endl; + return false; + }; + if (S4 && !S4__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing S4 tree" << endl; + return false; + }; + if (TOF && !TOF__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing ToF tree" << endl; + return false; + }; + if (ND && !ND__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing ND tree" << endl; + return false; + }; + if (TRG && !TRG__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing Trigger tree" << endl; + return false; + }; + if (GP && !GP__ok) { + cout << "File: " << f->GetName() << " discarded ---- Missing h20 tree" << endl; + return false; + }; + + // lk->Delete(); + // delete lk; + f->Close(); + + // cout<< "CheckLevel2File(TString): detector list --> "; + // if(TRK1)cout<<"TRK1 "; + // if(TRK2)cout<<"TRK2 "; + // if(TRKh)cout<<"TRKH "; + // if(CAL1)cout<<"CAL1 "; + // if(CAL2)cout<<"CAL2 "; + // if(TOF)cout<<"TOF "; + // if(TRG)cout<<"TRG "; + // if(AC)cout<<"AC "; + // if(ND)cout<<"ND "; + // if(S4)cout<<"S4 "; + // if(ORB)cout<<"ORB "; + // if(GP)cout<<"GP "; + // cout << endl; + + return true; + +} +; /** * Create clone-trees */ -void PamLevel2::CreateCloneTrees0( TChain *fChain, TFile *ofile ){ +void PamLevel2::CreateCloneTrees0(TChain *fChain, TFile *ofile) { - cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <GetTree()->CloneTree(0); - TString name = tree_clone[i]->GetName(); + cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; + cout << "Create clones of PAMELA trees " << endl; + + Int_t i = 0; + pam_tree_clone[i] = fChain->GetTree()->CloneTree(0); + TString name = pam_tree_clone[i]->GetName(); + name.Append("_clone"); + // pam_tree_clone[i]->SetName(name.Data()); + cout << pam_tree_clone[i]->GetName() << endl; + i++; + + TList *li = fChain->GetListOfFriends(); + TIter next(li); + TFriendElement* T_friend = 0; + ofile->cd(); + while ((T_friend = (TFriendElement*) next())) { + // cout<IsA()->GetName()<<" "<GetName()<GetTree() << dec<GetTree()->GetName()<< endl; + pam_tree_clone[i] = T_friend->GetTree()->CloneTree(0); + pam_tree_clone[i]->SetAutoSave(1000000); + name = pam_tree_clone[i]->GetName(); name.Append("_clone"); -// tree_clone[i]->SetName(name.Data()); - cout << tree_clone[i]->GetName() <SetName(name.Data()); + cout << pam_tree_clone[i]->GetName() << endl; i++; + } - TList *li = fChain->GetListOfFriends(); - TIter next(li); - TFriendElement* T_friend=0; - ofile->cd(); - while( (T_friend = (TFriendElement*)next()) ){ -// cout<IsA()->GetName()<<" "<GetName()<GetTree() << dec<GetTree()->GetName()<< endl; - tree_clone[i] = T_friend->GetTree()->CloneTree(0); - tree_clone[i]->SetAutoSave(1000000); - name = tree_clone[i]->GetName(); - name.Append("_clone"); -// tree_clone[i]->SetName(name.Data()); - cout << tree_clone[i]->GetName() << endl; - i++; - } - - delete li; + delete li; - cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <cd(); + // if the pointer is null, create a default file + if (!run_tree) + return; + + if (!ofile) { + cout << "void PamLevel2::CreateCloneTrees(TFile*) -- WARNING -- Creating file: clone-tree.root " << endl; + ofile = new TFile("clone-tree.root", "recreate"); + } + + ofile->cd(); + + cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; + cout << "Create new PAMELA trees " << endl; + + run_tree_clone = new TTree("Run", "PAMELA Level2 data from the GL_RUN table "); + run_tree_clone->Branch("RunInfo", "GL_RUN", GetPointerTo("RunInfo")); + cout << "Run : branch RunInfo" << endl; + run_tree_clone->Branch("SoftInfo", "SoftInfo", GetPointerTo("SoftInfo")); + cout << "Run : branch SoftInfo" << endl; + // ------------------ + // replicate run tree + // ------------------ + // cout << "----------------------------------------------------"<GetEntries(); i++) { + run_tree->GetEntry(i); + // cout << i<< "\t | "<ID<<"\t "<NEVENTS<< "\t "<RUNHEADER_TIME<<" <---> "<RUNTRAILER_TIME<Fill(); + } + cout << "----------------------------------------------------" << endl; + + // ------------------------------------ + // add branch with dead and live times + // ------------------------------------ + if (SELLI != 2) { // EMILIANO + run_tree_clone->Branch("DeadLiveTime", totdltime, "dltime[3]/l"); + cout << "Run : branch DeadLiveTime" << endl; + + sel_tree_clone = new TTree("SelectionList", "List of selected events "); + // sel_tree_clone->Branch("RunEntry",&irun,"runentry/L"); + sel_tree_clone->Branch("RunEntry", &irunt, "runentry/L");//NEWNEW + sel_tree_clone->Branch("EventEntry", &irunentry, "eventry/L"); + }; - cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <Branch("TrkLevel1","TrkLevel1", GetPointerTo("TrkLevel1")); - tree_clone[i]->BranchRef(); - cout << "Tracker : branch TrkLevel1"<Branch("TrkLevel2", "TrkLevel2",GetPointerTo("TrkLevel2")); - cout << "Tracker : branch TrkLevel2"<Branch("TrkHough","TrkHough", GetPointerTo("TrkHough")); - cout << "Tracker : branch TrkHough"<Branch("CaloLevel1", "CaloLevel1", GetPointerTo("CaloLevel1")); - cout << "Calorimeter : branch CaloLevel1"<Branch("CaloLevel2","CaloLevel2", GetPointerTo("CaloLevel2")); - cout << "Calorimeter : branch CaloLevel2"<Branch("ToFLevel2","ToFLevel2", GetPointerTo("ToFLevel2")); - cout << "ToF : branch ToFLevel2"<Branch("TrigLevel2","TrigLevel2", GetPointerTo("TrigLevel2")); - cout << "Trigger : branch TrigLevel2"<Branch("S4Level2","S4Level2", GetPointerTo("S4Level2")); - cout << "S4 : branch S4Level2"<Branch("NDLevel2","NDLevel2", GetPointerTo("NDLevel2")); - cout << "NeutronD : branch NDLevel2"<Branch("AcLevel2","AcLevel2", GetPointerTo("AcLevel2")); - cout << "Anticounter : branch AcLevel2"<Branch("OrbitalInfo","OrbitalInfo", GetPointerTo("OrbitalInfo")); - cout << "OrbitalInfo : branch OrbitalInfo"<Branch("TrkLevel1", "TrkLevel1", GetPointerTo("TrkLevel1")); + pam_tree_clone[i]->BranchRef(); + cout << "Tracker : branch TrkLevel1" << endl; + // cout << "CreateCloneTrees " << GetTrkLevel1()<Branch("TrkLevel2", "TrkLevel2", GetPointerTo("TrkLevel2")); + cout << "Tracker : branch TrkLevel2" << endl; + }; + if (TRKh) { + pam_tree_clone[i]->Branch("TrkHough", "TrkHough", GetPointerTo("TrkHough")); + cout << "Tracker : branch TrkHough" << endl; }; - cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <Branch("CaloLevel1", "CaloLevel1", GetPointerTo("CaloLevel1")); + cout << "Calorimeter : branch CaloLevel1" << endl; + }; + if (CAL2) { + pam_tree_clone[i]->Branch("CaloLevel2", "CaloLevel2", GetPointerTo("CaloLevel2")); + cout << "Calorimeter : branch CaloLevel2" << endl; + }; + i++; + } + + // ToF + if (TOF) { + pam_tree_clone[i] = new TTree("ToF", "PAMELA ToF level2 data "); + pam_tree_clone[i]->Branch("ToFLevel2", "ToFLevel2", GetPointerTo("ToFLevel2")); + cout << "ToF : branch ToFLevel2" << endl; + i++; + }; + // Trigger + if (TRG) { + pam_tree_clone[i] = new TTree("Trigger", "PAMELA trigger level2 data "); + pam_tree_clone[i]->Branch("TrigLevel2", "TrigLevel2", GetPointerTo("TrigLevel2")); + cout << "Trigger : branch TrigLevel2" << endl; + i++; + }; + // S4 + if (S4) { + pam_tree_clone[i] = new TTree("S4", "PAMELA S4 level2 data "); + pam_tree_clone[i]->Branch("S4Level2", "S4Level2", GetPointerTo("S4Level2")); + cout << "S4 : branch S4Level2" << endl; + i++; + }; + // Neutron Detector + if (ND) { + pam_tree_clone[i] = new TTree("NeutronD", "PAMELA neutron detector level2 data "); + pam_tree_clone[i]->Branch("NDLevel2", "NDLevel2", GetPointerTo("NDLevel2")); + cout << "NeutronD : branch NDLevel2" << endl; + i++; + }; + // Anticounters + if (AC) { + pam_tree_clone[i] = new TTree("Anticounter", "PAMELA anticounter detector level2 data "); + pam_tree_clone[i]->Branch("AcLevel2", "AcLevel2", GetPointerTo("AcLevel2")); + cout << "Anticounter : branch AcLevel2" << endl; + i++; + }; + // OrbitalInfo + if (ORB) { + pam_tree_clone[i] = new TTree("OrbitalInfo", "PAMELA orbital info "); + pam_tree_clone[i]->Branch("OrbitalInfo", "OrbitalInfo", GetPointerTo("OrbitalInfo")); + cout << "OrbitalInfo : branch OrbitalInfo" << endl; + i++; + }; + // GPamela + if (GP) { + pam_tree_clone[i] = new TTree("h20", "GPAMELA info "); + pam_tree_clone[i]->Branch("GPamela", "GPamela", GetPointerTo("GPamela"), 32000, 1);//split + cout << "OrbitalInfo : branch OrbitalInfo" << endl; + i++; + }; + cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; +} /** * Fill tree (created with CreateCloneTrees) * */ //void PamLevel2::FillNewPamTree(TTree *T){ -void PamLevel2::FillCloneTrees(){ - - for(Int_t i=0; i<8; i++){ - if(tree_clone[i])tree_clone[i]->Fill(); +void PamLevel2::FillCloneTrees() { + + // cout << "PamLevel2::FillCloneTrees()" << irunentry << endl; + + for (Int_t i = 0; i < NCLONES; i++) { + if (pam_tree_clone[i]) + pam_tree_clone[i]->Fill(); + } + if (sel_tree_clone) + sel_tree_clone->Fill(); + +} + +TTree* PamLevel2::GetCloneTree(TString name) { + + for (Int_t i = 0; i < NCLONES; i++) { + if (pam_tree_clone[i]) { + TString na = pam_tree_clone[i]->GetName(); + if (!name.CompareTo(na)) + return pam_tree_clone[i]; + }; + } + if (run_tree_clone) { + TString na = run_tree_clone->GetName(); + if (!name.CompareTo(na)) + return run_tree_clone; + } + if (sel_tree_clone) { + TString na = sel_tree_clone->GetName(); + if (!name.CompareTo(na)) + return sel_tree_clone; + } + return NULL; + +} +void PamLevel2::WriteCloneTrees() { + cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; + cout << "Write clones of PAMELA trees " << endl; + cout << run_tree_clone->GetName() << endl; + if (SELLI != 2) {// Emiliano + if (run_tree_clone->GetBranch("DeadLiveTime")->GetEntries() < run_tree->GetEntries()) + run_tree_clone->GetBranch("DeadLiveTime")->Fill(); + }; + run_tree_clone->Write(); + if (SELLI != 2) { //Emiliano + cout << sel_tree_clone->GetName() << endl; + sel_tree_clone->Write(); + }; + for (Int_t i = 0; i < NCLONES; i++) { + if (pam_tree_clone[i]) { + cout << pam_tree_clone[i]->GetName() << endl; + pam_tree_clone[i]->Write(); + }; + } + cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" << endl; + +} + +/** + * Method to get level2-trees entry, the corresponding run entry and (if required) the level0 entry. + */ +//Int_t PamLevel2::GetEntry(Int_t iee){ +Int_t PamLevel2::GetEntry(Long64_t iee) { + + // cout << "-------------------------------------"<GetEntry(ii)) { + cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- error reading pam tree" << endl; + return 0; + } + // + // ... that's way I put it here. Notice that nothing change in the code (is backward compatible) since in any case you return with 0. + // in theory one would like to return 1 if run is not loaded but now I don't have the will to add that 2 lines of code and it is not + // a problem if you don't check the return code of getentry. + // + if (!RUN || !run_tree) { + if (TRK0 || CAL0 || TOF0 || RUN) { //forse cosi` va bene per tornare 1? + cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- run tree not loaded" << endl; + return 0; + } + else { + return 1; //cosi` se non c'e` run esce qua... + } + } + + //------------------------------- + ii = iee; + // Bool_t UPDATED = UpdateRunInfo(run_tree,ii); + // Bool_t UPDATED = UpdateRunInfo(ii); + if ( fUpdateRunInfo ) UpdateRunInfo(ii); // Emiliano + if (SELLI == 0 || SELLI == 2) + irunentry = iee - runfirstentry; + // if(UPDATED && run_tree_clone)run_tree_clone->Fill(); + + // cout << "PamLevel2::GetEntry("<NEVENTS<< endl; + + // if( TRK0 || CAL0 || TOF0 ){ + // if( !GetYodaEntry( ) ){ + // cout << " Int_t PamLevel2::GetEntry(Int_t) -- ERROR -- error reading level0 tree"<ID_ROOT_L0; + // cout << "iroot "<IsConnected())) + SetDBConnection(); + GL_ROOT glroot = GL_ROOT(); + if (glroot.Query_GL_ROOT(iroot, dbc)) { + cout << "TTree* PamLevel2::GetYodaTree( ) -- ERROR -- level0 file iroot = " << iroot << " does not exists" + << endl; + return NULL; + }; + TString filename = glroot.PATH + glroot.NAME; + if (l0_file) { + l0_file->Close(); + l0_file->Delete(); + } + cout << "Opening LEVEL0 file: " << filename << endl; + FileStat_t t; + if (gSystem->GetPathInfo(filename.Data(), t)) { + cout << " PamLevel2::GetYodaTree() -- ERROR opening file " << endl; + return NULL; + } + l0_file = new TFile(filename); + if (!l0_file) + return NULL; + l0_tree = (TTree*) l0_file->Get("Physics"); + if (!h0_obj) + h0_obj = new EventHeader(); + l0_tree->SetBranchAddress("Header", &h0_obj); + prevshift = 0; + //--------------------------------------------------- + // TRACKER: + if (TRK0) { + if (!trk0_obj) { + trk0_obj = new TrkLevel0(); + trk0_obj->Set(); + }; + l0_tree->SetBranchAddress("Tracker", trk0_obj->GetPointerToTrackerEvent()); } + //-------------------------------------------------- + // CALORIMETER: + if (CAL0) { + if (!calo0_obj) { + calo0_obj = new CaloLevel0(); + calo0_obj->Set(); + }; + l0_tree->SetBranchAddress("Calorimeter", calo0_obj->GetPointerToCalorimeterEvent()); + // cout << "PamLevel2::GetYodaTree() --- level0 calorimeter not implemented "<Close(); // EMILIANO, do not leave open connections, open only when needed + dbc=0; + + }; + + // if(!dbc || (dbc && !dbc->IsConnected())){ + // cout << " TTree* PamLevel2::GetYodaTree( ) -- no DB connected... hai fatto qualche cazzata "<IsConnected()))SetDBConnection(); // PERCHE` ERA COMMENTATA QUESTA RIGA? + TrkParams::SetCalib(run_obj, dbc); + TrkParams::LoadCalib(); + if (!TrkParams::CalibIsLoaded()) { + cout << " TTree* PamLevel2::GetYodaTree( ) -- WARNING -- Calibration not loaded" << endl; + }; + if(dbc){ + dbc->Close(); // EMILIANO, do not leave open connections, open only when needed + dbc=0; + }; + } + + // cout << l0_tree << endl; + return l0_tree; + } +/** + * Method to retrieve the level0 tree (YODA tree) that contains the current event. + */ +Int_t PamLevel2::GetYodaEntry() { -TTree* PamLevel2::GetCloneTree(TString name){ + // cout << "Int_t PamLevel2::GetYodaEntry()"<EV_FROM); + // cout << " irunentry "<EV_FROM<EV_FROM "<EV_FROM <<" quella giusta "<ID_ROOT_L0 "<ID_ROOT_L0<TRK_CALIB_USED<< endl; + + ULong64_t obt = 0; + ULong64_t pktn = 0; + if (GetOrbitalInfo()) { + obt = GetOrbitalInfo()->OBT; + pktn = GetOrbitalInfo()->pkt_num; + } + + if (!GetOrbitalInfo() && !ISGP) { + cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing OrbitalInfo " << endl; + return 0; + } + if (obt == 0 && pktn == 0 && !ISGP) { + cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- level2 event corrupted ?? " << endl; + return 0; + } + + // --------------------------------------------------------------------- + // ATTENTION!!! + // If data are not pre-processed with cleaner, the level0 tree may contain + // spurious nested physics packets. + // The GL_RUN variables EV_FROM, EV_TO and NEVENTS counts also these entries + // while level2 tree DOES NOT!! + // This means that "quellagiusta" in these cases is not correct. + // In order to retrieve the correct level0 event, I implemented a check + // of the OBT and pkt-number. In case of mismatch, the level0 entry number + // is shift forward until when the packets match. + // --------------------------------------------------------------------- + Int_t answer = 0; + Int_t shift = 0; + // printf(" siamo qui %i %i \n",shift,prevshift); + // Int_t maxshift = 50; // EMILIANO + do { + if (shift > 0) { + cout << " PKTNUM L2 --- " << pktn << " --- L0 --- " << GetEventHeader()->GetPscuHeader()->GetCounter() << endl; + if (DBG) + cout << " RUN: ID " << GetRunInfo()->ID << " ID_ROOT_L0 " << run_obj->ID_ROOT_L0 << " ID_RUN_FRAG " + << GetRunInfo()->ID_RUN_FRAG << " EV_FROM " << GetRunInfo()->EV_FROM << endl; + if (DBG) + cout << " L2 <--> L0 mismatch ( irun " << irun << " irunentry " << irunentry << " shift " << shift + << " prevshift " << prevshift << " )" << endl; + } + answer = l0_tree->GetEntry(quellagiusta + (Long64_t) shift + (Long64_t) prevshift); + shift++; + if (!GetEventHeader()) { + cout << "Int_t PamLevel2::GetYodaEntry() -- ERROR -- missing EventHeader " << endl; + return 0; + } - for(Int_t i=0; i<8; i++){ - if(tree_clone[i]){ - TString na = tree_clone[i]->GetName(); - if(!name.CompareTo(na))return tree_clone[i]; - }; + if (ISGP) { + obt = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()); //BARBATRUCCO + pktn = (UInt_t)(GetEventHeader()->GetPscuHeader()->GetCounter()); //BARBATRUCCO } + + // cout << "PKTNUM "<GetPscuHeader()->GetCounter()<GetPscuHeader()->GetOrbitalTime()<GetEntries()+1 )cout << ">>> end of level0 tree <<<"<GetPscuHeader()->GetOrbitalTime() "<< GetEventHeader()->GetPscuHeader()->GetOrbitalTime() << endl; + // cout << " pktn "<< pktn << endl; + // cout << " GetEventHeader()->GetPscuHeader()->GetCounter() "<< GetEventHeader()->GetPscuHeader()->GetCounter() << endl; + // printf(" IDRUN %u \n",GetRunInfo()->ID); + // + if (prevshift != 0 && (quellagiusta + (Long64_t) shift) == GetYodaTree()->GetEntries()) { + prevshift = 0; + shift = -1; + }; + + } while ((obt != (UInt_t)(GetEventHeader()->GetPscuHeader()->GetOrbitalTime()) || pktn != (UInt_t)( + GetEventHeader()->GetPscuHeader()->GetCounter())) && (quellagiusta + (Long64_t) shift) + < GetYodaTree()->GetEntries() && shift < maxshift); + + if ((quellagiusta + (Long64_t) shift + (Long64_t) prevshift) > GetYodaTree()->GetEntries() || shift == maxshift) { + cout << " Big trouble here, no such event in Level0 data! (NB maxshift set to " << maxshift << " )" << endl; + return 0; + } + // cout << "LA ENTRY GIUSTA E`: "<GetEntry(quellagiusta); + if (shift > 1) + prevshift += (shift - 1); + + return answer; + +} +/** + * \Brief Set DB connection + */ +Bool_t PamLevel2::SetDBConnection() { + + // cout << "PamLevel2::SetDBConnection()" << endl; + if (DBG) { + cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl; + cout << "Connecting to DB" << endl; + cout << "HOST " << host << endl; + cout << "USER " << user << endl; + cout << "PSW " << psw << endl; + } + Bool_t notconn = true; + Int_t trials = 0; + while ( notconn && trials < 10 ){ + // gSystem->Sleep(500); + dbc = TSQLServer::Connect(host.Data(), user.Data(), psw.Data()); + //dbc->Connect(host.Data(), user.Data(), psw.Data()); + if ( dbc ) notconn = false; + if (DBG) printf("<%i> test connection...\n ",trials); + if (!dbc){ + if (DBG) printf(" :( failed, no pointer \n"); + notconn = true; + // return false; + }; + if (dbc && !dbc->IsConnected()){ + if (DBG) printf(" :( failed, no connection \n"); + notconn = true; + // return false; + }; + trials++; + }; + if ( notconn ) return false; + // + if (DBG) printf("=connected!\n"); + stringstream myquery; // EMILIANO + myquery.str(""); // EMILIANO + myquery << "SET time_zone='+0:00'"; // EMILIANO + dbc->Query(myquery.str().c_str()); // EMILIANO + if ( DBG ) printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); + return true; + +} + +/** + * \Brief Add a friend to the pamela chain. + * @param cname name of the chain to be added + */ + +TChain* PamLevel2::AddFriend(TString cname) { + + if (!GetPamTree()) { + cout << " TChain* PamLevel2::AddFriend(TString cname) --- a pamela tree must be created first" << endl; return NULL; + } + + TChain *c = new TChain(cname.Data()); + + TIter next(GetPamTree()->GetListOfFiles()); + Int_t nf = 0; + TChainElement* element = 0; + while ((element = (TChainElement*) next())) { + c->Add(element->GetTitle()); + nf++; + } + GetPamTree()->AddFriend(cname.Data()); + + cout << "external chain created and added to pamela friends :" << cname << endl; + cout << "n.files " << nf << endl; + + return c; + +} + +/** + * Returns the current read entry. This method simply returns the result of the call to + * pam_tree->GetReadEntry(), so it is entirely handled by ROOT. + */ +Long64_t PamLevel2::GetReadEntry() { + return pam_tree->GetReadEntry(); } -void PamLevel2::WriteCloneTrees(){ - cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <GetName()<Write(); - }; - } - cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <Branch("TrkLevel1","TrkLevel1", &trk1_clone); -// T->BranchRef(); -// cout << "Tracker : branch TrkLevel1"<Branch("TrkLevel2", "TrkLevel2",&trk2_clone); -// cout << "Tracker : branch TrkLevel2"<Branch("TrkHough","TrkHough", &trkh_clone); -// cout << "Tracker : branch TrkHough"<AddFriend("Tracker_clone"); -// } - -// // Calorimeter -// if(CAL1||CAL2){ -// TTree *C = new TTree("Calorimeter_clone","PAMELA calorimeter level2 data "); -// if(CAL1) { -// calo1_clone = new CaloLevel1(); -// C->Branch("CaloLevel1", "CaloLevel1", &calo1_clone); -// cout << "Calorimeter : branch CaloLevel1"<Branch("CaloLevel2","CaloLevel2", &calo2_clone); -// cout << "Calorimeter : branch CaloLevel2"<AddFriend("Calorimeter_clone"); -// } - -// // ToF -// if(TOF) { -// TTree *O = new TTree("ToF_clone","PAMELA ToF level2 data "); -// tof_clone = new ToFLevel2(); -// O->Branch("ToFLevel2","ToFLevel2", &tof_clone); -// cout << "ToF : branch ToFLevel2"<AddFriend("ToF_clone"); -// }; -// // Trigger -// if(TRG) { -// TTree *R = new TTree("Trigger_clone","PAMELA trigger level2 data "); -// trig_clone = new TrigLevel2(); -// R->Branch("TrigLevel2","TrigLevel2", &trig_clone); -// cout << "Trigger : branch TrigLevel2"<AddFriend("Trigger_clone"); -// }; -// // S4 -// if(S4) { -// TTree *S = new TTree("S4_clone","PAMELA S4 level2 data "); -// s4_clone = new S4Level2(); -// S->Branch("S4Level2","S4Level2", &s4_clone); -// cout << "S4 : branch S4Level2"<AddFriend("S4_clone"); -// }; -// // Neutron Detector -// if(ND) { -// TTree *N = new TTree("NeutronD_clone","PAMELA neutron detector level2 data "); -// nd_clone = new NDLevel2(); -// N->Branch("NDLevel2","NDLevel2", &nd_clone); -// cout << "NeutronD : branch NDLevel2"<AddFriend("NeutronD_clone"); -// }; -// // Anticounters -// if(AC) { -// TTree *A = new TTree("Anticounter_clone","PAMELA anticounter detector level2 data "); -// ac_clone = new AcLevel2(); -// A->Branch("AcLevel2","AcLevel2", &ac_clone); -// cout << "Anticounter : branch AcLevel2"<AddFriend("Anticounter_clone"); -// }; -// // OrbitalInfo -// if(ORB) { -// TTree *B = new TTree("OrbitalInfo_clone","PAMELA oribital info "); -// orb_clone = new OrbitalInfo(); -// B->Branch("OrbitalInfo","OrbitalInfo", &orb_clone); -// cout << "OrbitalInfo : branch OrbitalInfo"<AddFriend("OrbitalInfo_clone"); -// }; -// cout << "+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+" <SetDirectory(0); - -// return Tout; -// } -// /** -// * Fill a tree (created with GetNewPamTree) -// * -// */ -// //void PamLevel2::FillNewPamTree(TTree *T){ -// void PamLevel2::FillNewPamTree(){ - - -// if(trk1_clone) *trk1_clone = *trk1_obj; -// if(trk2_clone){ -// trk2_clone->Clear(); -// trk2_obj->Copy(*trk2_clone); -// // *trk2_clone = *trk2_obj; -// } -// if(trkh_clone) *trkh_clone = *trkh_obj; -// if(calo1_clone){ -// // *calo1_clone = *calo1_obj; -// calo1_clone->Clear(); -// calo1_obj->Copy(*calo1_clone); -// } -// if(calo2_clone){ -// // *calo2_clone = *calo2_obj; -// calo2_clone->Clear(); -// calo2_obj->Copy(*calo2_clone); -// } -// if(tof_clone) *tof_clone = *tof_obj; -// if(trig_clone) *trig_clone = *trig_obj; -// if(s4_clone) *s4_clone = *s4_obj; -// if(nd_clone) *nd_clone = *nd_obj; -// if(ac_clone) *ac_clone = *ac_obj; -// if(orb_clone) *orb_clone = *orb_obj; - -// TTree *T = tree_clone; - -// T->Fill(); //fill main tree -// // cout<IsA()->GetName()<<" "<GetName()<GetListOfFriends(); -// TIter next(li); -// TFriendElement* T_friend=0; -// while( (T_friend = (TFriendElement*)next()) ){ -// // cout<IsA()->GetName()<<" "<GetName()<GetTree() << dec<GetTree()->Fill();//fill friends -// } -// } +/** + * Sets the sorting method. If the new method is different from the previous, the issorted + * flag is set to false, forcing a new sort the next time GetTrack is called. + * @see GetTrack + */ +void PamLevel2::SetSortingMethod(TString how) { + if (howtosort != how) { + issorted = false; + } + howtosort = how; +}