]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliTagAnalysis.cxx
Fixing bugs in FMD reconstruction. Everything should work now
[u/mrichter/AliRoot.git] / ANALYSIS / AliTagAnalysis.cxx
index 530808d15ace3702f9070c931f82990944793aa8..2d16ec1a7a0979f148c5bf0f655e7033e84d4bb5 100644 (file)
@@ -20,6 +20,7 @@
 //-----------------------------------------------------------------
 
 //ROOT
+#include <Riostream.h>
 #include <TSystem.h>
 #include <TChain.h>
 #include <TFile.h>
@@ -51,8 +52,8 @@ AliTagAnalysis::AliTagAnalysis():
   ftagresult(0x0),
   fTagDirName(),
   fChain(0x0),
-  fAnalysisType()
-{
+  fAnalysisType(),
+  fGlobalList(0) {
   //Default constructor for a AliTagAnalysis
 }
 
@@ -62,19 +63,21 @@ AliTagAnalysis::AliTagAnalysis(const char* type):
   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 ;
@@ -116,14 +119,18 @@ void AliTagAnalysis::ChainLocalTags(const char *dirname) {
       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;
@@ -137,43 +144,67 @@ 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, 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++) {
@@ -181,72 +212,99 @@ TChain *AliTagAnalysis::QueryTags(AliRunTagCuts *runTagCuts, AliLHCTagCuts *lhcT
            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++) {   
@@ -254,50 +312,81 @@ TChain *AliTagAnalysis::QueryTags(const char *fRunCut, const char *fLHCCut, cons
            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())) {
@@ -308,12 +397,21 @@ Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, AliRunTagCuts *runT
            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();
 
@@ -321,20 +419,34 @@ Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, AliRunTagCuts *runT
 }
 
 //___________________________________________________________________________
-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;
@@ -347,16 +459,22 @@ Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, const char *fRunCut
 
   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) {     
@@ -367,15 +485,22 @@ Bool_t AliTagAnalysis::CreateXMLCollection(const char* name, const char *fRunCut
            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;
 }
 
@@ -387,9 +512,9 @@ TChain *AliTagAnalysis::GetInputChain(const char* system, const char *wn) {
   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
@@ -415,17 +540,18 @@ TChain *AliTagAnalysis::GetInputChain(const char* system, const char *wn) {
 }
 
 //___________________________________________________________________________
-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();
@@ -433,7 +559,7 @@ TChain *AliTagAnalysis::GetChainFromCollection(const char* collectionname, const
     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();