X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ANALYSIS%2FAliTagAnalysis.cxx;h=77bd1081ac493549e1c67537feea4d490b8381d2;hb=26173bc833094c02f45c7e467139818d1828a457;hp=dcd64bdb44b35c9a4092aed4609521600124bb99;hpb=b97856f98f0dc920852b997b836f7b4dabb6441d;p=u%2Fmrichter%2FAliRoot.git diff --git a/ANALYSIS/AliTagAnalysis.cxx b/ANALYSIS/AliTagAnalysis.cxx index dcd64bdb44b..77bd1081ac4 100644 --- a/ANALYSIS/AliTagAnalysis.cxx +++ b/ANALYSIS/AliTagAnalysis.cxx @@ -20,12 +20,14 @@ //----------------------------------------------------------------- //ROOT +#include #include #include #include #include #include #include +#include //ROOT-AliEn #include @@ -36,6 +38,8 @@ #include "AliEventTag.h" #include "AliTagAnalysis.h" #include "AliEventTagCuts.h" +#include "AliDetectorTagCuts.h" +#include "AliLHCTagCuts.h" #include "AliRunTagCuts.h" #include "AliXMLCollection.h" @@ -48,34 +52,52 @@ AliTagAnalysis::AliTagAnalysis(): TObject(), ftagresult(0x0), fTagDirName(), - fChain(0x0) -{ + fChain(0x0), + fAnalysisType(), + fGlobalList(0) { //Default constructor for a AliTagAnalysis } //___________________________________________________________________________ -AliTagAnalysis::~AliTagAnalysis() { -//Default destructor for a AliTagAnalysis +AliTagAnalysis::AliTagAnalysis(const char* type): + TObject(), + ftagresult(0x0), + fTagDirName(), + fChain(0x0), + fAnalysisType(type), + fGlobalList(0) { + //constructor for a AliTagAnalysis } //___________________________________________________________________________ -Bool_t AliTagAnalysis::AddTagsFile(const char *alienUrl) { - - // Add a single tags file to the chain - - Bool_t rv = kTRUE ; - - if (! fChain) fChain = new TChain("T"); +AliTagAnalysis::~AliTagAnalysis() { + //Default destructor for a AliTagAnalysis + if(ftagresult) delete ftagresult; + if(fChain) delete fChain; + if(fGlobalList) delete fGlobalList; +} - TFile *f = TFile::Open(alienUrl,"READ"); - fChain->Add(alienUrl); - AliInfo(Form("Chained tag files: %d ",fChain->GetEntries())); - delete f; +//___________________________________________________________________________ +Bool_t +AliTagAnalysis::AddTagsFile(const char* alienUrl, Bool_t checkFile) +{ + /// Add a single tags file to the chain + /// + /// If checkFile=kTRUE (default) the file is opened to check + /// it can be and that it contains data. + /// It's safer but a lot longer... + + if (!fChain) fChain = new TChain("T"); - if (fChain->GetEntries() == 0 ) - rv = kFALSE ; + if ( checkFile ) + { + return ( fChain->AddFile(alienUrl,-1) > 0 ); + } + else + { + return ( fChain->AddFile(alienUrl) > 0 ); + } - return rv ; } //___________________________________________________________________________ @@ -86,29 +108,37 @@ void AliTagAnalysis::ChainLocalTags(const char *dirname) { TString fTagFilename; if (! fChain) fChain = new TChain("T"); - - const char * tagPattern = "tag.root"; + const char * tagPattern = 0x0; + if(fAnalysisType == "ESD") tagPattern = "ESD.tag.root"; + else if(fAnalysisType == "AOD") tagPattern = "AOD.tag.root"; + else AliFatal("Only ESD and AOD type is implemented!!!"); + // Open the working directory void * dirp = gSystem->OpenDirectory(fTagDirName); const char * name = 0x0; // Add all files matching *pattern* to the chain while((name = gSystem->GetDirEntry(dirp))) { - if (strstr(name,tagPattern)) { + if (tagPattern && strstr(name,tagPattern)) { fTagFilename = fTagDirName; fTagFilename += "/"; fTagFilename += name; fChain->Add(fTagFilename); + printf("Tag file %s\n", fTagFilename.Data()); + }//pattern check }//directory loop - AliInfo(Form("Chained tag files: %d ",fChain->GetEntries())); + //AliInfo(Form("Chained tag files: %d ",fChain->GetEntries())); + // AliDebug(Form("Chained tag files: %d ",fChain->GetEntries())); + fChain->ls(); + } //___________________________________________________________________________ -void AliTagAnalysis::ChainGridTags(TGridResult *res) { +TChain * AliTagAnalysis::ChainGridTags(TGridResult *res) { //Loops overs the entries of the TGridResult - //Chains the tags that are stored in the GRID + //Chains the tags that are stored in the GRID ftagresult = res; Int_t nEntries = ftagresult->GetEntries(); @@ -120,214 +150,429 @@ void AliTagAnalysis::ChainGridTags(TGridResult *res) { for(Int_t i = 0; i < nEntries; i++) { alienUrl = ftagresult->GetKey(i,"turl"); fChain->Add(alienUrl); - }//grid result loop + }//grid result loop + return fChain; } //___________________________________________________________________________ -TChain *AliTagAnalysis::QueryTags(AliRunTagCuts *RunTagCuts, AliEventTagCuts *EvTagCuts) { +TChain *AliTagAnalysis::QueryTags(AliRunTagCuts *runTagCuts, + AliLHCTagCuts *lhcTagCuts, + AliDetectorTagCuts *detTagCuts, + AliEventTagCuts *evTagCuts) { //Queries the tag chain using the defined //event tag cuts from the AliEventTagCuts object //and returns a TChain along with the associated TEventList AliInfo(Form("Querying the tags........")); - TString fAliceFile = "esdTree"; + TString aliceFile; + if(fAnalysisType == "ESD") aliceFile = "esdTree"; + else if(fAnalysisType == "AOD") aliceFile = "aodTree"; + else AliFatal("Only ESD and AOD type is implemented!!!"); //ESD file chain - TChain *fESDchain = new TChain(fAliceFile.Data()); + TChain *esdChain = new TChain(aliceFile.Data()); //global entry list - TEntryList *fGlobalList = new TEntryList(); + fGlobalList = new TEntryList(); //Defining tag objects - AliRunTag *tag = new AliRunTag; - AliEventTag *evTag = new AliEventTag; + AliRunTag *tag = new AliRunTag; + // AliEventTag *evTag = 0x0; + AliFileTag *flTag = 0x0; + fChain->SetBranchAddress("AliTAG",&tag); - TString guid = 0; - TString turl = 0; - TString path = 0; + TString guid; + TString turl; + TString path; + + TEntryList* localList = new TEntryList(); Int_t iAccepted = 0; - for(Int_t iTagFiles = 0; iTagFiles < fChain->GetEntries(); iTagFiles++) { - fChain->GetEntry(iTagFiles); - if(RunTagCuts->IsAccepted(tag)) { - TEntryList *fLocalList = new TEntryList(); - Int_t iEvents = tag->GetNEvents(); - const TClonesArray *tagList = tag->GetEventTags(); - for(Int_t i = 0; i < iEvents; i++) { - evTag = (AliEventTag *) tagList->At(i); - guid = evTag->GetGUID(); - turl = evTag->GetTURL(); - path = evTag->GetPath(); - fLocalList->SetTreeName(fAliceFile.Data()); - fLocalList->SetFileName(turl.Data()); - if(EvTagCuts->IsAccepted(evTag)) fLocalList->Enter(i); - }//event loop - - if(path != "") fESDchain->AddFile(path); - else if(turl != "") fESDchain->AddFile(turl); - fGlobalList->Add(fLocalList); - iAccepted += fLocalList->GetN(); + + for(Int_t iEntry = 0; iEntry < fChain->GetEntries(); iEntry++) { + fChain->GetEntry(iEntry); + evTagCuts->InitializeTriggerClasses(tag->GetActiveTriggerClasses()); + + if(runTagCuts->IsAccepted(tag)) { + if(lhcTagCuts->IsAccepted(tag->GetLHCTag())) { + if(detTagCuts->IsAccepted(tag->GetDetectorTags())) { + localList->Reset(); + Int_t iEvents = tag->GetNEvents(); + + for (int i = 0; i < iEvents; i++) { + // evTag = tag->GetEventTag(i); + flTag = tag->GetFileTagForEvent(i); + guid = flTag->GetGUID(); + turl = flTag->GetTURL(); + path = flTag->GetPath(); + localList->SetTreeName(aliceFile.Data()); + if(turl!="") localList->SetFileName(turl.Data()); + else localList->SetFileName(path.Data()); + + if(evTagCuts->IsAccepted(tag->GetEventTag(i))) localList->Enter(i); + } + +// const TClonesArray *tagList = tag->GetEventTags(); +// for(Int_t i = 0; i < iEvents; i++) { +// evTag = (AliEventTag *) tagList->At(i); +// guid = evTag->GetGUID(); +// turl = evTag->GetTURL(); +// path = evTag->GetPath(); +// localList->SetTreeName(aliceFile.Data()); +// if(turl!="") localList->SetFileName(turl.Data()); +// else localList->SetFileName(path.Data()); + +// if(evTagCuts->IsAccepted(evTag)) localList->Enter(i); +// }//event loop + iAccepted += localList->GetN(); + if(turl != "") esdChain->AddFile(turl); + else if(path != "") esdChain->AddFile(path); + fGlobalList->Add(localList); + }//detector tag cuts + }//lhc tag cuts }//run tags cut + tag->Clear(); }//tag file loop - AliInfo(Form("Accepted events: %d",iAccepted)); - fESDchain->SetEntryList(fGlobalList,"ne"); - - return fESDchain; + AliInfo(Form("Accepted events: %d", iAccepted)); + esdChain->ls(); + esdChain->SetEntryList(fGlobalList,"ne"); + delete tag; + delete localList; + + return esdChain; } //___________________________________________________________________________ -TChain *AliTagAnalysis::QueryTags(const char *fRunCut, const char *fEventCut) { +TChain *AliTagAnalysis::QueryTags(const char *fRunCut, + const char *fLHCCut, + const char *fDetectorCut, + const char *fEventCut) { //Queries the tag chain using the defined //event tag cuts from the AliEventTagCuts object //and returns a TChain along with the associated TEventList AliInfo(Form("Querying the tags........")); - - TString fAliceFile = "esdTree"; + + TString aliceFile; + if(fAnalysisType == "ESD") aliceFile = "esdTree"; + else if(fAnalysisType == "AOD") aliceFile = "aodTree"; + else AliFatal("Only ESD and AOD type is implemented!!!"); + //ESD file chain - TChain *fESDchain = new TChain(fAliceFile.Data()); + TChain *esdChain = new TChain(aliceFile.Data()); //global entry list - TEntryList *fGlobalList = new TEntryList(); + fGlobalList = new TEntryList(); //Defining tag objects - AliRunTag *tag = new AliRunTag; - AliEventTag *evTag = new AliEventTag; + AliRunTag *tag = new AliRunTag; + // AliEventTag *evTag = 0x0; fChain->SetBranchAddress("AliTAG",&tag); - TString guid = 0; - TString turl = 0; - TString path = 0; + TString guid; + TString turl; + TString path; TTreeFormula *fRunFormula = new TTreeFormula("fRun",fRunCut,fChain); - TTreeFormula *fEventFormula = new TTreeFormula("fEvent",fEventCut,fChain); + TTreeFormula *fLHCFormula = new TTreeFormula("fLHC",fLHCCut,fChain); + TTreeFormula *fDetectorFormula = new TTreeFormula("fDetector",fDetectorCut,fChain); + TTreeFormula *fEventFormula = new TTreeFormula("fEvent",fEventCut,fChain); - Int_t current = -1; + TEntryList* localList = new TEntryList(); + + Int_t current = -1; Int_t iAccepted = 0; - for(Int_t iTagFiles = 0; iTagFiles < fChain->GetEntries(); iTagFiles++) { + + for(Int_t iTagFiles = 0; iTagFiles < fChain->GetEntries(); iTagFiles++) { fChain->GetEntry(iTagFiles); if (current != fChain->GetTreeNumber()) { fRunFormula->UpdateFormulaLeaves(); + fLHCFormula->UpdateFormulaLeaves(); + fDetectorFormula->UpdateFormulaLeaves(); fEventFormula->UpdateFormulaLeaves(); current = fChain->GetTreeNumber(); } + if(fRunFormula->EvalInstance(iTagFiles) == 1) { - TEntryList *fLocalList = new TEntryList(); - Int_t iEvents = fEventFormula->GetNdata(); - const TClonesArray *tagList = tag->GetEventTags(); - for(Int_t i = 0; i < iEvents; i++) { - evTag = (AliEventTag *) tagList->At(i); - guid = evTag->GetGUID(); - turl = evTag->GetTURL(); - path = evTag->GetPath(); - fLocalList->SetTreeName(fAliceFile.Data()); - fLocalList->SetFileName(turl.Data()); - if(fEventFormula->EvalInstance(i) == 1) fLocalList->Enter(i); - }//event loop - iAccepted += fLocalList->GetN(); - - if(path != "") fESDchain->AddFile(path); - else if(turl != "") fESDchain->AddFile(turl); - fGlobalList->Add(fLocalList); - iAccepted += fLocalList->GetN(); + if(fLHCFormula->EvalInstance(iTagFiles) == 1) { + if(fDetectorFormula->EvalInstance(iTagFiles) == 1) { + localList->Reset(); + // Int_t iEvents = fEventFormula->GetNdata(); + // *** FIXME *** + +// const TClonesArray *tagList = tag->GetEventTags(); +// for(Int_t i = 0; i < iEvents; i++) { +// evTag = (AliEventTag *) tagList->At(i); +// guid = evTag->GetGUID(); +// turl = evTag->GetTURL(); +// path = evTag->GetPath(); +// localList->SetTreeName(aliceFile.Data()); +// localList->SetFileName(turl.Data()); +// if(fEventFormula->EvalInstance(i) == 1) localList->Enter(i); +// }//event loop + + if(path != "") esdChain->AddFile(path); + else if(turl != "") esdChain->AddFile(turl); + fGlobalList->Add(localList); + iAccepted += localList->GetN(); + }//detector tag cuts + }//lhc tag cuts }//run tag cut + tag->Clear(); }//tag file loop - AliInfo(Form("Accepted events: %d",iAccepted)); - fESDchain->SetEntryList(fGlobalList,"ne"); - - return fESDchain; + AliInfo(Form("Accepted events: %d", iAccepted)); + esdChain->SetEntryList(fGlobalList,"ne"); + + delete tag; + delete localList; + return esdChain; } //___________________________________________________________________________ -Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, AliRunTagCuts *RunTagCuts, AliEventTagCuts *EvTagCuts) { - //Queries the tag chain using the defined - //event tag cuts from the AliEventTagCuts object - //and returns a XML collection +Bool_t +AliTagAnalysis::CreateXMLCollection(const char* name, + AliRunTagCuts *runTagCuts, + AliLHCTagCuts *lhcTagCuts, + AliDetectorTagCuts *detTagCuts, + AliEventTagCuts *evTagCuts) +{ + /// Queries the tag chain using the defined run, lhc, detector and event tag objects + /// and create a XML collection named "name.xml" + /// if any of the runTagCuts, lhcTagCuts, detTagCuts or evTagCuts is NULL + /// check on that object will be skipped. + AliInfo(Form("Creating the collection........")); - - AliXMLCollection *collection = new AliXMLCollection(); - collection->SetCollectionName(name); - collection->WriteHeader(); - - TString guid = 0x0; - TString turl = 0x0; - TString lfn = 0x0; + + if (!fChain) + { + AliError("fChain is NULL. Cannot make a collection from that !"); + return kFALSE; + } + + AliXMLCollection collection; + collection.SetCollectionName(name); + collection.WriteHeader(); + + TString guid; + TString turl; + TString lfn; + + TEntryList localList; + Int_t iAccepted = 0; + + Int_t iRejectedRun = 0; + Int_t iRejectedLHC = 0; + Int_t iRejectedDet = 0; + Int_t iRejectedEvt = 0; + + Int_t iTotalEvents = 0; + + Int_t iAcceptedEvtInFile = 0; + Int_t iRejectedEvtInFile = 0; //Defining tag objects - AliRunTag *tag = new AliRunTag; - AliEventTag *evTag = new AliEventTag; + AliRunTag* tag = new AliRunTag; fChain->SetBranchAddress("AliTAG",&tag); - for(Int_t iTagFiles = 0; iTagFiles < fChain->GetEntries(); iTagFiles++) { - //Event list - TEntryList *fList = new TEntryList(); - fChain->GetEntry(iTagFiles); - if(RunTagCuts->IsAccepted(tag)) { - Int_t iEvents = tag->GetNEvents(); - const TClonesArray *tagList = tag->GetEventTags(); - for(Int_t i = 0; i < iEvents; i++) { - evTag = (AliEventTag *) tagList->At(i); - guid = evTag->GetGUID(); - turl = evTag->GetTURL(); - lfn = turl(8,turl.Length()); - if(EvTagCuts->IsAccepted(evTag)) fList->Enter(i); - }//event loop - collection->WriteBody(iTagFiles+1,guid,lfn,turl,fList); - }//run tag cuts - }//tag file loop - collection->Export(); + Int_t iTagFiles = 0; + + // AliEventTag *evTag = 0x0; + AliFileTag *flTag = 0x0; + // for(Int_t iTagFiles = 0; iTagFiles < fChain->GetListOfFiles()->GetEntries(); ++iTagFiles) + for(Int_t iRunTags = 0; iRunTags < fChain->GetEntries(); ++iRunTags) + { + fChain->GetEntry(iRunTags); + //Event list + iTotalEvents += tag->GetNEvents(); + localList.Reset(); + + evTagCuts->InitializeTriggerClasses(tag->GetActiveTriggerClasses()); + + if ( !runTagCuts || ( runTagCuts && runTagCuts->IsAccepted(tag) ) ) + { + if ( !lhcTagCuts || ( lhcTagCuts && lhcTagCuts->IsAccepted(tag->GetLHCTag())) ) + { + if ( !detTagCuts || ( detTagCuts && detTagCuts->IsAccepted(tag->GetDetectorTags())) ) + { + for (int iChunk = 0; iChunk < tag->GetNFiles(); iChunk++, iTagFiles++) + { + iRejectedEvtInFile = 0; + iAcceptedEvtInFile = 0; + + localList.Reset(); + + flTag = tag->GetFileTag(iChunk); + guid = flTag->GetGUID(); + turl = flTag->GetTURL(); + lfn = turl(8,turl.Length()); + + for (int i = 0; iGetNEvents(); i++) + { + // evTag = flTag->GetEventTag(i); + + if( !evTagCuts || ( evTagCuts && evTagCuts->IsAccepted(flTag->GetEventTag(i))) ) + { + localList.Enter(i); + iAcceptedEvtInFile++; + } + else + { + ++iRejectedEvt; + ++iRejectedEvtInFile; + } + } + // *** FIXME *** +// Int_t i(0); + +// TIter next(tag->GetEventTags()); +// AliEventTag* evTag(0x0); +// iRejectedEvtInFile = 0; +// iAcceptedEvtInFile = 0; +// while ( ( evTag = static_cast(next()) ) ) +// { +// guid = evTag->GetGUID(); +// turl = evTag->GetTURL(); +// lfn = turl(8,turl.Length()); +// if( !evTagCuts || ( evTagCuts && evTagCuts->IsAccepted(evTag)) ) +// { +// localList.Enter(i); +// iAcceptedEvtInFile++; +// } +// else +// { +// ++iRejectedEvt; +// ++iRejectedEvtInFile; +// } +// ++i; +// }//event loop + iAccepted += localList.GetN(); + collection.WriteBody(iTagFiles+1,guid,lfn,turl,&localList,iAcceptedEvtInFile,iRejectedEvtInFile); + } // chunk loop + }//detector tag cuts + else { + iRejectedDet += tag->GetNEvents(); + } + }//lhc tag cuts + else { + iRejectedLHC += tag->GetNEvents(); + } + }//run tag cuts + else { + iRejectedRun += tag->GetNEvents(); + } + tag->Clear(); + } //tag file loop + + collection.WriteSummary(iTotalEvents, iAccepted, iRejectedRun, iRejectedLHC, iRejectedDet, iRejectedEvt); + collection.Export(); + return kTRUE; } //___________________________________________________________________________ -Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, const char *fRunCut, const char *fEventCut) { +Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, + const char *fRunCut, + const char *fLHCCut, + const char *fDetectorCut, + const char *fEventCut) { //Queries the tag chain using the defined //event tag cuts from the AliEventTagCuts object //and returns a XML collection AliInfo(Form("Creating the collection........")); + AliXMLCollection *collection = new AliXMLCollection(); collection->SetCollectionName(name); collection->WriteHeader(); - TString guid = 0x0; - TString turl = 0x0; - TString lfn = 0x0; + TString guid; + TString turl; + TString lfn; + TEntryList* localList = new TEntryList(); + Int_t iAccepted = 0; + + Int_t iRejectedRun = 0; + Int_t iRejectedLHC = 0; + Int_t iRejectedDet = 0; + Int_t iRejectedEvt = 0; + + Int_t iTotalEvents = 0; + + Int_t iAcceptedEvtInFile = 0; + Int_t iRejectedEvtInFile = 0; + //Defining tag objects - AliRunTag *tag = new AliRunTag; - AliEventTag *evTag = new AliEventTag; + AliRunTag *tag = new AliRunTag; + // AliEventTag *evTag = 0x0; fChain->SetBranchAddress("AliTAG",&tag); TTreeFormula *fRunFormula = new TTreeFormula("fRun",fRunCut,fChain); + TTreeFormula *fLHCFormula = new TTreeFormula("fLHC",fLHCCut,fChain); + TTreeFormula *fDetectorFormula = new TTreeFormula("fDetector",fDetectorCut,fChain); TTreeFormula *fEventFormula = new TTreeFormula("fEvent",fEventCut,fChain); - + Int_t current = -1; + for(Int_t iTagFiles = 0; iTagFiles < fChain->GetEntries(); iTagFiles++) { - //Event list - TEntryList *fList = new TEntryList(); + fChain->GetEntry(iTagFiles); if (current != fChain->GetTreeNumber()) { fRunFormula->UpdateFormulaLeaves(); + fLHCFormula->UpdateFormulaLeaves(); + fDetectorFormula->UpdateFormulaLeaves(); fEventFormula->UpdateFormulaLeaves(); current = fChain->GetTreeNumber(); - } + } + + //Event list + iTotalEvents += tag->GetNEvents(); + localList->Reset(); if(fRunFormula->EvalInstance(iTagFiles) == 1) { - Int_t iEvents = fEventFormula->GetNdata(); - const TClonesArray *tagList = tag->GetEventTags(); - for(Int_t i = 0; i < iEvents; i++) { - evTag = (AliEventTag *) tagList->At(i); - guid = evTag->GetGUID(); - turl = evTag->GetTURL(); - lfn = turl(8,turl.Length()); - if(fEventFormula->EvalInstance(i) == 1) fList->Enter(i); - }//event loop - collection->WriteBody(iTagFiles+1,guid,lfn,turl,fList); + if(fLHCFormula->EvalInstance(iTagFiles) == 1) { + if(fDetectorFormula->EvalInstance(iTagFiles) == 1) { + // Int_t iEvents = fEventFormula->GetNdata(); + // *** FIXME *** + + +// const TClonesArray *tagList = tag->GetEventTags(); +// iRejectedEvtInFile = 0; +// iAcceptedEvtInFile = 0; +// for(Int_t i = 0; i < iEvents; i++) { +// evTag = (AliEventTag *) tagList->At(i); +// guid = evTag->GetGUID(); +// turl = evTag->GetTURL(); +// lfn = turl(8,turl.Length()); +// if(fEventFormula->EvalInstance(i) == 1) { +// localList->Enter(i); +// iAcceptedEvtInFile++; +// } +// else { +// iRejectedEvt++; +// iRejectedEvtInFile++; +// } +// }//event loop + + collection->WriteBody(iTagFiles+1,guid,lfn,turl,localList,iAcceptedEvtInFile, iRejectedEvtInFile); + iAccepted += localList->GetN(); + }//detector tag cuts + else { + iRejectedDet += tag->GetNEvents(); + } + }//lhc tag cuts + else { + iRejectedLHC += tag->GetNEvents(); + } }//run tag cuts + else { + iRejectedRun += tag->GetNEvents(); + } }//tag file loop + collection->WriteSummary(iTotalEvents, iAccepted, iRejectedRun, iRejectedLHC, iRejectedDet, iRejectedEvt); collection->Export(); - + + delete tag; return kTRUE; } @@ -338,8 +583,12 @@ TChain *AliTagAnalysis::GetInputChain(const char* system, const char *wn) { // improvements are committed TString fsystem = system; Int_t iAccepted = 0; - //ESD file chain - TChain *fESDchain = new TChain("esdTree"); + + TChain *fAnalysisChain = 0; + if(fAnalysisType == "ESD") fAnalysisChain = new TChain("esdTree"); + else if(fAnalysisType == "AOD") fAnalysisChain = new TChain("aodTree"); + else AliFatal("Only ESD and AOD type is implemented!!!"); + //Event list TEventList *fEventList = new TEventList(); AliXMLCollection *collection = AliXMLCollection::Open(wn); @@ -347,7 +596,7 @@ TChain *AliTagAnalysis::GetInputChain(const char* system, const char *wn) { collection->Reset(); while (collection->Next()) { AliInfo(Form("Adding: %s",collection->GetTURL(""))); - fESDchain->Add(collection->GetTURL("")); + if (fAnalysisChain) fAnalysisChain->Add(collection->GetTURL("")); TEntryList *list = (TEntryList *)collection->GetEventList(""); for(Int_t i = 0; i < list->GetN(); i++) fEventList->Enter(iAccepted+list->GetEntry(i)); @@ -355,46 +604,99 @@ TChain *AliTagAnalysis::GetInputChain(const char* system, const char *wn) { else if(fsystem == "PbPb") iAccepted += 1; } - fESDchain->SetEventList(fEventList); + if (fAnalysisChain) fAnalysisChain->SetEventList(fEventList); AliInfo(Form("Number of selected events: %d",fEventList->GetN())); - return fESDchain; + return fAnalysisChain; } //___________________________________________________________________________ -TChain *AliTagAnalysis::GetChainFromCollection(const char* collectionname, const char* treename) { - //returns the TChain+TEntryList object- used in batch sessions - TString fAliceFile = treename; - Int_t iAccepted = 0; - TChain *fAnalysisChain = new TChain(); - if(fAliceFile == "esdTree") { - //ESD file chain - fAnalysisChain->SetName("esdTree"); - } else if(fAliceFile == "aodTree") { - //AOD file chain - fAnalysisChain->SetName("aodTree"); - AliFatal("AOD case not yet implemented!!!"); +TChain* +AliTagAnalysis::CreateChainFromCollection(const char* collectionname, const char* treename) +{ + /// Build a TChain (with its TEntryList object attached) from an XML collection. + /// Returned chain must be deleted by the client. + + TString streename(treename); + if ( streename != "esdTree" && streename != "aodTree" ) + { + AliErrorClass("Only esdTree and aodTree implemented so far..."); + return 0x0; } - else AliFatal("Inconsistent tree name - use esdTree or aodTree!"); - //Event list - TEntryList *fGlobalList = new TEntryList(); - AliXMLCollection *collection = AliXMLCollection::Open(collectionname); + + TChain* chain = new TChain(streename.Data()); + // create the event list for the chain. Will be attached to the chain + // which thus becomes the owner of it. + TEntryList* elist = new TEntryList; + + AliXMLCollection* collection = AliXMLCollection::Open(collectionname); + + // Tag selection summary per file + TMap* tagCutSummary = new TMap(); + tagCutSummary->SetName("TagCutSumm"); + + Int_t iAccepted = 0; + collection->Reset(); - while (collection->Next()) { - AliInfo(Form("Adding: %s",collection->GetTURL(""))); - fAnalysisChain->Add(collection->GetTURL("")); - TEntryList *list = (TEntryList *)collection->GetEventList(""); - list->SetTreeName(fAliceFile.Data()); + + while (collection->Next()) + { + AliDebugClass(1,Form("Adding: %s",collection->GetTURL(""))); + chain->Add(collection->GetTURL("")); + TEntryList *list = collection->GetEventList(""); + list->SetTreeName(streename.Data()); list->SetFileName(collection->GetTURL("")); - fGlobalList->Add(list); + elist->Add(list); iAccepted += list->GetN(); + if (collection->GetCutSumm()) + { + tagCutSummary->Add(new TObjString(collection->GetTURL("")), new TObjString(collection->GetCutSumm())); + } } - fAnalysisChain->SetEntryList(fGlobalList,"ne"); + chain->SetEntryList(elist,"ne"); // ne => do not expand tree name and/or file names - AliInfo(Form("Number of selected events: %d",iAccepted)); + AliDebugClass(1,Form("Number of selected events: %d",iAccepted)); - return fAnalysisChain; + TList *aUserInfo = chain->GetUserInfo(); + aUserInfo->Add(tagCutSummary); + + Int_t iAccEv; + Int_t iTotalEvents; + Int_t iRejRun; + Int_t iRejLHC; + Int_t iRejDet; + Int_t iRejEvt; + + collection->GetCollectionSummary(&iTotalEvents, &iAccEv, &iRejRun, &iRejLHC, &iRejDet, &iRejEvt); + + char nstr[2000]; + + snprintf(nstr, 2000, "TotalEvents=%i", iTotalEvents); + TObjString *iTotStr = new TObjString(nstr); + aUserInfo->Add(iTotStr); + + snprintf(nstr, 2000, "AcceptedEvents=%i", iAccepted); + TObjString *iAccStr = new TObjString(nstr); + aUserInfo->Add(iAccStr); + + snprintf(nstr, 2000, "RejectedRun=%i", iRejRun); + TObjString *iRejRunStr = new TObjString(nstr); + aUserInfo->Add(iRejRunStr); + + snprintf(nstr, 2000, "RejectedLHC=%i", iRejLHC); + TObjString *iRejLHCStr = new TObjString(nstr); + aUserInfo->Add(iRejLHCStr); + + snprintf(nstr, 2000, "RejectedDet=%i", iRejDet); + TObjString *iRejDetStr = new TObjString(nstr); + aUserInfo->Add(iRejDetStr); + + snprintf(nstr, 2000, "RejectedEvt=%i", iRejEvt); + TObjString *iRejEvtStr = new TObjString(nstr); + aUserInfo->Add(iRejEvtStr); + + return chain; }