//-----------------------------------------------------------------
//ROOT
+#include <Riostream.h>
#include <TSystem.h>
#include <TChain.h>
#include <TFile.h>
ftagresult(0x0),
fTagDirName(),
fChain(0x0),
- fAnalysisType()
-{
+ fAnalysisType(),
+ fGlobalList(0) {
//Default constructor for a AliTagAnalysis
}
ftagresult(0x0),
fTagDirName(),
fChain(0x0),
- fAnalysisType(type)
-{
+ fAnalysisType(type),
+ fGlobalList(0) {
//constructor for a AliTagAnalysis
}
//___________________________________________________________________________
AliTagAnalysis::~AliTagAnalysis() {
-//Default destructor for a AliTagAnalysis
+ //Default destructor for a AliTagAnalysis
+ if(ftagresult) delete ftagresult;
+ if(fChain) delete fChain;
+ if(fGlobalList) delete fGlobalList;
}
//___________________________________________________________________________
Bool_t AliTagAnalysis::AddTagsFile(const char *alienUrl) {
-
// Add a single tags file to the chain
Bool_t rv = kTRUE ;
fTagFilename += name;
fChain->Add(fTagFilename);
+ printf("Tag file %s\n", fTagFilename.Data());
+
}//pattern check
}//directory loop
AliInfo(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
ftagresult = 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, AliLHCTagCuts *lhcTagCuts, AliDetectorTagCuts *detTagCuts, 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;
- if(fAnalysisType == "ESD") fAliceFile = "esdTree";
- else if(fAnalysisType == "AOD") fAliceFile = "aodTree";
+ Bool_t aod = kFALSE;
+ TString aliceFile;
+ if(fAnalysisType == "ESD") aliceFile = "esdTree";
+ else if(fAnalysisType == "AOD") {
+ aliceFile = "aodTree";
+ aod = kTRUE;
+ }
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 = new AliEventTag;
fChain->SetBranchAddress("AliTAG",&tag);
- TString guid = 0;
- TString turl = 0;
- TString path = 0;
+ TString guid;
+ TString turl;
+ TString path;
+
+ TTree* cTree = 0;
+ TEntryList* localList = 0;
Int_t iAccepted = 0;
+ Int_t iev = 0;
+ Int_t ientry = 0;
+ Int_t cEntries = 0;
+
for(Int_t iTagFiles = 0; iTagFiles < fChain->GetEntries(); iTagFiles++) {
fChain->GetEntry(iTagFiles);
+ TTree* tree = fChain->GetTree();
+ if (cTree != tree) {
+ // Fix for aod tags: for each tree in the chain, merge the entries
+ cTree = tree;
+ cEntries = tree->GetEntries();
+ iev = 0;
+ ientry = 0;
+ }
+
if(runTagCuts->IsAccepted(tag)) {
if(lhcTagCuts->IsAccepted(tag->GetLHCTag())) {
if(detTagCuts->IsAccepted(tag->GetDetectorTags())) {
- TEntryList *fLocalList = new TEntryList();
+ if ((iev == 0) || !aod) localList = new TEntryList();
Int_t iEvents = tag->GetNEvents();
const TClonesArray *tagList = tag->GetEventTags();
for(Int_t i = 0; i < iEvents; i++) {
guid = evTag->GetGUID();
turl = evTag->GetTURL();
path = evTag->GetPath();
- fLocalList->SetTreeName(fAliceFile.Data());
- if(turl!="") fLocalList->SetFileName(turl.Data());
- else fLocalList->SetFileName(path.Data());
- if(evTagCuts->IsAccepted(evTag)) fLocalList->Enter(i);
+ localList->SetTreeName(aliceFile.Data());
+ if(turl!="") localList->SetFileName(turl.Data());
+ else localList->SetFileName(path.Data());
+
+ if(evTagCuts->IsAccepted(evTag)) {
+ if(aod) localList->Enter(iev);
+ else localList->Enter(i);
+ }
+ iev++;
}//event loop
-
- if(path != "") fESDchain->AddFile(path);
- else if(turl != "") fESDchain->AddFile(turl);
- fGlobalList->Add(fLocalList);
- iAccepted += fLocalList->GetN();
+ if ((ientry == cEntries-1) || !aod) {
+ iAccepted += localList->GetN();
+ if(path != "") esdChain->AddFile(path);
+ else if(turl != "") esdChain->AddFile(turl);
+ fGlobalList->Add(localList);
+ }
}//detector tag cuts
}//lhc tag cuts
}//run tags cut
+ tag->Clear();
+ ientry++;
}//tag file loop
AliInfo(Form("Accepted events: %d",iAccepted));
- fESDchain->SetEntryList(fGlobalList,"ne");
+ esdChain->ls();
+ esdChain->SetEntryList(fGlobalList,"ne");
- return fESDchain;
+ return esdChain;
}
//___________________________________________________________________________
-TChain *AliTagAnalysis::QueryTags(const char *fRunCut, const char *fLHCCut, const char *fDetectorCut, 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;
- if(fAnalysisType == "ESD") fAliceFile = "esdTree";
- else if(fAnalysisType == "AOD") fAliceFile = "aodTree";
+ Bool_t aod = kFALSE;
+ TString aliceFile;
+ if(fAnalysisType == "ESD") aliceFile = "esdTree";
+ else if(fAnalysisType == "AOD") {
+ aliceFile = "aodTree";
+ aod = kTRUE;
+ }
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;
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 *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 = 0;
+
+ Int_t iev = 0;
+ Int_t ientry = 0;
+ Int_t cEntries = 0;
+ 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();
+ // Fix for aod tags: for each tree in the chain, merge the entries
+ cEntries = (fChain->GetTree())->GetEntries();
+ iev = 0;
+ ientry = 0;
+ //
current = fChain->GetTreeNumber();
}
if(fRunFormula->EvalInstance(iTagFiles) == 1) {
if(fLHCFormula->EvalInstance(iTagFiles) == 1) {
- if(fDetectorFormula->EvalInstance(iTagFiles) == 1) {
- TEntryList *fLocalList = new TEntryList();
+ if(fDetectorFormula->EvalInstance(iTagFiles) == 1) {
+ if ((iev == 0) || !aod) localList = new TEntryList();
Int_t iEvents = fEventFormula->GetNdata();
const TClonesArray *tagList = tag->GetEventTags();
for(Int_t i = 0; i < iEvents; 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);
+ localList->SetTreeName(aliceFile.Data());
+ localList->SetFileName(turl.Data());
+ if(fEventFormula->EvalInstance(i) == 1) {
+ if(aod) localList->Enter(iev);
+ else localList->Enter(i);
+ }
+ iev++;
}//event loop
- iAccepted += fLocalList->GetN();
-
- if(path != "") fESDchain->AddFile(path);
- else if(turl != "") fESDchain->AddFile(turl);
- fGlobalList->Add(fLocalList);
- iAccepted += fLocalList->GetN();
+
+ if ((ientry == cEntries-1) || !aod) {
+ 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();
+ ientry++;
}//tag file loop
AliInfo(Form("Accepted events: %d",iAccepted));
- fESDchain->SetEntryList(fGlobalList,"ne");
+ esdChain->SetEntryList(fGlobalList,"ne");
- return fESDchain;
+ return esdChain;
}
//___________________________________________________________________________
-Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, AliRunTagCuts *runTagCuts, AliLHCTagCuts *lhcTagCuts, AliDetectorTagCuts *detTagCuts, AliEventTagCuts *evTagCuts) {
+Bool_t AliTagAnalysis::CreateXMLCollection(const char* name,
+ 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 XML collection
AliInfo(Form("Creating the collection........"));
+ Bool_t aod = kFALSE;
+ if(fAnalysisType == "AOD") aod = kTRUE;
+
+
AliXMLCollection *collection = new AliXMLCollection();
collection->SetCollectionName(name);
collection->WriteHeader();
- TString guid = 0x0;
- TString turl = 0x0;
- TString lfn = 0x0;
+ TString guid;
+ TString turl;
+ TString lfn;
+ TTree* cTree = 0;
+ TEntryList* localList = 0;
+ Int_t iAccepted = 0;
+ Int_t iev = 0;
+ Int_t ientry = 0;
+ Int_t cEntries = 0;
+
//Defining tag objects
AliRunTag *tag = new AliRunTag;
AliEventTag *evTag = new AliEventTag;
fChain->SetBranchAddress("AliTAG",&tag);
for(Int_t iTagFiles = 0; iTagFiles < fChain->GetEntries(); iTagFiles++) {
- //Event list
- TEntryList *fList = new TEntryList();
+
fChain->GetEntry(iTagFiles);
+ TTree* tree = fChain->GetTree();
+ if (cTree != tree) {
+ // Fix for aod tags: for each tree in the chain, merge the entries
+ cTree = tree;
+ cEntries = tree->GetEntries();
+ iev = 0;
+ ientry = 0;
+ }
+ //Event list
+ if ((iev == 0) || !aod) localList = new TEntryList();
if(runTagCuts->IsAccepted(tag)) {
if(lhcTagCuts->IsAccepted(tag->GetLHCTag())) {
if(detTagCuts->IsAccepted(tag->GetDetectorTags())) {
guid = evTag->GetGUID();
turl = evTag->GetTURL();
lfn = turl(8,turl.Length());
- if(evTagCuts->IsAccepted(evTag)) fList->Enter(i);
+ if(evTagCuts->IsAccepted(evTag)) {
+ if(aod) localList->Enter(iev);
+ else localList->Enter(i);
+ }
+ iev++;
}//event loop
- collection->WriteBody(iTagFiles+1,guid,lfn,turl,fList);
+ if ((ientry == cEntries-1) || !aod) {
+ collection->WriteBody(iTagFiles+1,guid,lfn,turl,localList);
+ iAccepted += localList->GetN();
+ }
}//detector tag cuts
}//lhc tag cuts
}//run tag cuts
+ tag->Clear();
+ ientry++;
}//tag file loop
collection->Export();
}
//___________________________________________________________________________
-Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, const char *fRunCut, const char *fLHCCut, const char *fDetectorCut, 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........"));
+ Bool_t aod = kFALSE;
+ if(fAnalysisType == "AOD") aod = kTRUE;
+
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 = 0;
+
+ Int_t iAccepted = 0;
+ Int_t iev = 0;
+ Int_t ientry = 0;
+ Int_t cEntries = 0;
+
//Defining tag objects
AliRunTag *tag = new AliRunTag;
AliEventTag *evTag = new AliEventTag;
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();
+ // Fix for aod tags: for each tree in the chain, merge the entries
+ cEntries = (fChain->GetTree())->GetEntries();
+ iev = 0;
+ ientry = 0;
+ //
current = fChain->GetTreeNumber();
}
+ //Event list
+ if ((iev == 0) || !aod) localList = new TEntryList();
if(fRunFormula->EvalInstance(iTagFiles) == 1) {
if(fLHCFormula->EvalInstance(iTagFiles) == 1) {
if(fDetectorFormula->EvalInstance(iTagFiles) == 1) {
guid = evTag->GetGUID();
turl = evTag->GetTURL();
lfn = turl(8,turl.Length());
- if(fEventFormula->EvalInstance(i) == 1) fList->Enter(i);
+ if(fEventFormula->EvalInstance(i) == 1) {
+ if(aod) localList->Enter(iev);
+ else localList->Enter(i);
+ }
+ iev++;
}//event loop
- collection->WriteBody(iTagFiles+1,guid,lfn,turl,fList);
+ if ((ientry == cEntries-1) || !aod) {
+ collection->WriteBody(iTagFiles+1,guid,lfn,turl,localList);
+ iAccepted += localList->GetN();
+ }
}//detector tag cuts
}//lhc tag cuts
}//run tag cuts
+ ientry++;
}//tag file loop
collection->Export();
-
return kTRUE;
}
TString fsystem = system;
Int_t iAccepted = 0;
- TChain *fAnalysisChain = new TChain();
- if(fAnalysisType == "ESD") fAnalysisChain->SetName("esdTree");
- else if(fAnalysisType == "AOD") fAnalysisChain->SetName("aodTree");
+ 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
}
//___________________________________________________________________________
-TChain *AliTagAnalysis::GetChainFromCollection(const char* collectionname, const char* treename) {
+TChain *AliTagAnalysis::GetChainFromCollection(const char* collectionname,
+ const char* treename) {
//returns the TChain+TEntryList object- used in batch sessions
- TString fAliceFile = treename;
+ TString aliceFile = treename;
Int_t iAccepted = 0;
- TChain *fAnalysisChain = new TChain();
- if(fAliceFile == "esdTree") fAnalysisChain->SetName("esdTree");
- else if(fAliceFile == "aodTree") fAnalysisChain->SetName("aodTree");
+ TChain *fAnalysisChain = 0;
+ if(aliceFile == "esdTree") fAnalysisChain = new TChain("esdTree");
+ else if(aliceFile == "aodTree") fAnalysisChain = new TChain("aodTree");
else AliFatal("Inconsistent tree name - use esdTree or aodTree!");
//Event list
- TEntryList *fGlobalList = new TEntryList();
+ fGlobalList = new TEntryList();
AliXMLCollection *collection = AliXMLCollection::Open(collectionname);
collection->Reset();
AliInfo(Form("Adding: %s",collection->GetTURL("")));
fAnalysisChain->Add(collection->GetTURL(""));
TEntryList *list = (TEntryList *)collection->GetEventList("");
- list->SetTreeName(fAliceFile.Data());
+ list->SetTreeName(aliceFile.Data());
list->SetFileName(collection->GetTURL(""));
fGlobalList->Add(list);
iAccepted += list->GetN();