Patch allowing to run analysis on a chain with file names different than AliESDs...
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 26 Mar 2013 12:17:26 +0000 (12:17 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 26 Mar 2013 12:17:26 +0000 (12:17 +0000)
ANALYSIS/AliAnalysisManager.cxx
ANALYSIS/AliAnalysisManager.h
ANALYSIS/AliAnalysisTaskMCParticleFilter.cxx
STEER/AOD/AliAODHandler.cxx
STEER/AOD/AliAODHandler.h
STEER/AOD/AliAODInputHandler.cxx
STEER/STEERBase/AliInputEventHandler.cxx
STEER/STEERBase/AliInputEventHandler.h
STEER/STEERBase/AliMCEventHandler.cxx
STEER/STEERBase/AliMCEventHandler.h
STEER/STEERBase/AliVEventHandler.h

index d89d299..4db5d2b 100644 (file)
@@ -1690,6 +1690,25 @@ void AliAnalysisManager::RunLocalInit()
 }   
 
 //______________________________________________________________________________
+void AliAnalysisManager::InputFileFromTree(TTree * const tree, TString &fname)
+{
+// Retrieves name of the file from tree
+   fname = "";
+   if (!tree) return;
+   TFile *file = tree->GetCurrentFile();
+   TString basename;
+   if (!file) {
+      TChain *chain = dynamic_cast<TChain*>(tree);
+      if (!chain || !chain->GetNtrees()) return;
+      basename = gSystem->BaseName(chain->GetListOfFiles()->First()->GetTitle());
+   } else {   
+      basename = gSystem->BaseName(file->GetName());
+   }   
+   Int_t index = basename.Index("#");
+   fname = basename(index+1, basename.Length());
+}   
+
+//______________________________________________________________________________
 Long64_t AliAnalysisManager::StartAnalysis(const char *type, Long64_t nentries, Long64_t firstentry)
 {
 // Start analysis having a grid handler.
@@ -1730,6 +1749,11 @@ Long64_t AliAnalysisManager::StartAnalysis(const char *type, TTree * const tree,
    if (anaType.Contains("proof"))     fMode = kProofAnalysis;
    else if (anaType.Contains("grid")) fMode = kGridAnalysis;
    else if (anaType.Contains("mix"))  fMode = kMixingAnalysis;
+   if (fInputEventHandler) {
+      TString fname;
+      InputFileFromTree(tree, fname);
+      if (fname.Length()) fInputEventHandler->SetInputFileName(fname);
+   }
 
    if (fMode == kGridAnalysis) {
       fIsRemote = kTRUE;
index 33e0350..8671e93 100644 (file)
@@ -227,6 +227,7 @@ enum EAliAnalysisFlags {
 protected:
    void                 CreateReadCache();
    void                 ImportWrappers(TList *source);
+   void                 InputFileFromTree(TTree * const tree, TString &fname);
    void                 SetEventLoop(Bool_t flag=kTRUE) {TObject::SetBit(kEventLoop,flag);}
    void                 DoLoadBranch(const char *name);
 
index 837b62d..1dc4f80 100644 (file)
@@ -35,6 +35,7 @@
 #include "AliStack.h"
 #include "AliMCEvent.h"
 #include "AliMCEventHandler.h"
+#include "AliESDInputHandler.h"
 #include "AliAODEvent.h"
 #include "AliAODHeader.h"
 #include "AliAODMCHeader.h"
@@ -70,7 +71,8 @@ Bool_t AliAnalysisTaskMCParticleFilter::Notify()
   // Implemented Notify() to read the cross sections
   // from pyxsec.root
   // 
-  TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+  TTree *tree = mgr->GetTree();
   Double_t xsection = 0;
   UInt_t   ntrials  = 0;
   if(tree){
@@ -81,7 +83,11 @@ Bool_t AliAnalysisTaskMCParticleFilter::Notify()
     }
 
     TString fileName(curfile->GetName());
-    if(fileName.Contains("AliESDs.root")){
+    TString datafile = mgr->GetInputEventHandler()->GetInputFileName();
+    if (fileName.Contains(datafile)) {
+        fileName.ReplaceAll(datafile, "pyxsec.root");
+    }
+    else if(fileName.Contains("AliESDs.root")){
         fileName.ReplaceAll("AliESDs.root", "pyxsec.root");
     }
     else if(fileName.Contains("AliAOD.root")){
index a1e96e6..87a0c4c 100644 (file)
@@ -705,7 +705,7 @@ void AliAODHandler::SetOutputFileName(const char* fname)
 }
 
 //______________________________________________________________________________
-const char *AliAODHandler::GetOutputFileName()
+const char *AliAODHandler::GetOutputFileName() const
 {
 // Get file name.
    return fFileName.Data();
index b8139e1..a69c88e 100644 (file)
@@ -30,7 +30,7 @@ class AliAODHandler : public AliVEventHandler {
     AliAODHandler(const char* name, const char* title);
     virtual ~AliAODHandler();
     virtual void         SetOutputFileName(const char* fname);
-    virtual const char*  GetOutputFileName();
+    virtual const char*  GetOutputFileName() const;
     // Extra outputs as a string separated by commas
     virtual const char*  GetExtraOutputs() const;
     virtual Bool_t       Init(Option_t* option);
index c15ce4a..13178ab 100644 (file)
@@ -252,6 +252,7 @@ void AliAODInputHandler::ConnectFriends()
        
        while((obj = (TNamed*)next())) {
            aodFriendTreeFName = aodTreeFName;
+       if (strlen(GetInputFileName())) aodFriendTreeFName.ReplaceAll(GetInputFileName(),obj->GetName());
            aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
            aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
            ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
index 936445c..f0fb6b0 100644 (file)
@@ -33,8 +33,9 @@ ClassImp(AliInputEventHandler)
 AliInputEventHandler::AliInputEventHandler() :
     AliVEventHandler(),
     fTree(0),
-    fBranches(""),
-    fBranchesOn(""),
+    fBranches(),
+    fBranchesOn(),
+    fInputFileName(),
     fNewEvent(kTRUE),
     fEventCuts(0),
     fIsSelectedResult(0),
@@ -53,20 +54,22 @@ AliInputEventHandler::~AliInputEventHandler()
 
 //______________________________________________________________________________
 AliInputEventHandler::AliInputEventHandler(const char* name, const char* title):
-  AliVEventHandler(name, title),
-  fTree(0),
-  fBranches(""),
-  fBranchesOn(""),
-  fNewEvent(kTRUE),
-  fEventCuts(0),
-  fIsSelectedResult(0),
-  fMixingHandler(0),
-  fParentHandler(0),
-  fUserInfo(0)
+    AliVEventHandler(name, title),
+    fTree(0),
+    fBranches(),
+    fBranchesOn(),
+    fInputFileName(),
+    fNewEvent(kTRUE),
+    fEventCuts(0),
+    fIsSelectedResult(0),
+    fMixingHandler(0),
+    fParentHandler(0),
+    fUserInfo(0)
 {
 // Named constructor.
 }
 
+//______________________________________________________________________________
 void AliInputEventHandler::SwitchOffBranches() const {
   //
   // Switch of branches on user request
@@ -82,6 +85,7 @@ void AliInputEventHandler::SwitchOffBranches() const {
   delete tokens;
 }
 
+//______________________________________________________________________________
 void AliInputEventHandler::SwitchOnBranches() const {
   //
   // Switch of branches on user request
@@ -98,6 +102,7 @@ void AliInputEventHandler::SwitchOnBranches() const {
   delete tokens;
 }
 
+//______________________________________________________________________________
 TObject *AliInputEventHandler::GetStatistics(Option_t *) const
 {
 // Returns the statistics object(s) (TH2F histogram) produced by the physics
@@ -110,3 +115,16 @@ Long64_t AliInputEventHandler::GetReadEntry() const
   // Get the current entry.
   return fTree->GetReadEntry();
 }
+
+//______________________________________________________________________________
+void AliInputEventHandler::SetInputFileName(const char* fname)
+{
+// Set the input file name to be analyzed. Done automatically by the manager, but
+// in case this needs to be done at an earlier stage has to be done manually.
+   if (!strlen(fname)) return;
+   if (fInputFileName.Length()) {
+      Error("SetInputFileName", "Input file name already set to: %s\n", fInputFileName.Data());
+      return;
+   }
+   fInputFileName  = fname;
+}
index aaafda2..ae65780 100644 (file)
@@ -30,8 +30,10 @@ class AliInputEventHandler : public AliVEventHandler {
     AliInputEventHandler();
     AliInputEventHandler(const char* name, const char* title);
     virtual ~AliInputEventHandler();
+    virtual void         SetInputFileName(const char* fname);
+    virtual const char  *GetInputFileName() const                     {return fInputFileName;}
     virtual void         SetOutputFileName(const char* /*fname*/) {;}
-    virtual const char  *GetOutputFileName()                          {return 0;}
+    virtual const char  *GetOutputFileName() const                    {return 0;}
     virtual Bool_t       Init(Option_t* opt) {if(fMixingHandler) fMixingHandler->Init(opt);return kTRUE;}
     virtual Bool_t       Init(TTree* tree, Option_t* opt) {if(fMixingHandler) fMixingHandler->Init(tree,opt);return kTRUE;}
     virtual Bool_t       GetEntry() {if(fMixingHandler) fMixingHandler->GetEntry(); return kTRUE;}
@@ -89,13 +91,14 @@ class AliInputEventHandler : public AliVEventHandler {
     TTree          *fTree;         //! Pointer to the tree
     TString         fBranches;     //  List of branches to be switched off (separated by space)
     TString         fBranchesOn;   //  List of branches to be switched on  (separated by space)
+    TString         fInputFileName; // Name of the input file
     Bool_t          fNewEvent;     //  New event flag 
     AliVCuts*       fEventCuts;    //  Cuts on the event level
     UInt_t          fIsSelectedResult; //  Selection result
     AliInputEventHandler* fMixingHandler; // Optionla plugin for mixing
     AliInputEventHandler* fParentHandler; // optional pointer to parent handlers (used in AliMultiInputEventHandler)
     TList           *fUserInfo;     //! transient user info for current tree
-    ClassDef(AliInputEventHandler, 6);
+    ClassDef(AliInputEventHandler, 7);
 };
 
 #endif
index 0e0f1a7..e64cbf6 100644 (file)
@@ -35,6 +35,7 @@
 #include "AliLog.h"
 
 #include <TTree.h>
+#include <TSystem.h>
 #include <TTreeCache.h>
 #include <TFile.h>
 #include <TList.h>
@@ -457,23 +458,14 @@ Bool_t AliMCEventHandler::Notify(const char *path)
   // The directory is taken from the 'path' argument
   // Reconnect trees
     TString fileName(path);
-    if(fileName.Contains("AliESDs.root")){
-       fileName.ReplaceAll("AliESDs.root", "");
-    }
-    else if(fileName.Contains("AliESDs_wSDD.root")){
-       fileName.ReplaceAll("AliESDs_wSDD.root", "");
-    }
-    else if(fileName.Contains("AliESDs_nob.root")){
-       fileName.ReplaceAll("AliESDs_nob.root", "");
-    }
-    else if(fileName.Contains("AliAOD.root")){
-       fileName.ReplaceAll("AliAOD.root", "");
-    }
-    else if(fileName.Contains("galice.root")){
-       // for running with galice and kinematics alone...
-       fileName.ReplaceAll("galice.root", "");
-    }
-    else if (fileName.BeginsWith("root:")) {
+    TString dirname = gSystem->DirName(fileName);
+    TString basename = gSystem->BaseName(fileName);
+    Int_t index = basename.Index("#");
+    basename = basename(0, index+1);
+    fileName = dirname;
+    fileName += "/";
+    fileName += basename;
+    if (fileName.BeginsWith("root:")) {
       fileName.Append("?ZIP=");
     }
 
index 5c1e6df..65ceece 100644 (file)
@@ -43,7 +43,7 @@ public:
     AliMCEventHandler(const char* name, const char* title);
     virtual ~AliMCEventHandler();
     virtual void         SetOutputFileName(const char* /* fname */) {;}
-    virtual const char*  GetOutputFileName() {return 0;}
+    virtual const char*  GetOutputFileName() const {return 0;}
     virtual void         SetInputPath(const char* fname); 
     virtual void         SetInputTree(TTree* /*tree*/) {;}
     virtual TString*     GetInputPath() const {return fPathName;}
index 2352aa4..37772e0 100644 (file)
@@ -28,9 +28,12 @@ enum EEventHandlerFlags {
     virtual Option_t    *GetDataType() const { return NULL; }
     virtual void         SetFillAOD(Bool_t) {}
     virtual void         SetFillExtension(Bool_t) {}
+    // Input
+    virtual void         SetInputFileName(const char*) {}
+    virtual const char*  GetInputFileName() const {return 0;}
     // Output
     virtual void         SetOutputFileName(const char* fname)   = 0;
-    virtual const char*  GetOutputFileName()              = 0;
+    virtual const char*  GetOutputFileName() const        = 0;
     // Extra outputs as a string separated by commas
     virtual const char*  GetExtraOutputs() const {return NULL;}
     // Input