From fdbaa4cef762d630ceeb79e7731ddf13ba253de1 Mon Sep 17 00:00:00 2001 From: agheata Date: Tue, 26 Mar 2013 12:17:26 +0000 Subject: [PATCH] Patch allowing to run analysis on a chain with file names different than AliESDs.root of AliAOD.root. The input file name is detected from the chain. If this is needed earlier than AliAnalysisManager::StartAnalysis() it has to be explicitely set by hand via mgr->GetInputEventHandler()->SetInputFileName() --- ANALYSIS/AliAnalysisManager.cxx | 24 +++++++++++ ANALYSIS/AliAnalysisManager.h | 1 + ANALYSIS/AliAnalysisTaskMCParticleFilter.cxx | 10 ++++- STEER/AOD/AliAODHandler.cxx | 2 +- STEER/AOD/AliAODHandler.h | 2 +- STEER/AOD/AliAODInputHandler.cxx | 1 + STEER/STEERBase/AliInputEventHandler.cxx | 42 ++++++++++++++------ STEER/STEERBase/AliInputEventHandler.h | 7 +++- STEER/STEERBase/AliMCEventHandler.cxx | 26 +++++------- STEER/STEERBase/AliMCEventHandler.h | 2 +- STEER/STEERBase/AliVEventHandler.h | 5 ++- 11 files changed, 85 insertions(+), 37 deletions(-) diff --git a/ANALYSIS/AliAnalysisManager.cxx b/ANALYSIS/AliAnalysisManager.cxx index d89d299e365..4db5d2b48f5 100644 --- a/ANALYSIS/AliAnalysisManager.cxx +++ b/ANALYSIS/AliAnalysisManager.cxx @@ -1689,6 +1689,25 @@ void AliAnalysisManager::RunLocalInit() TObject::SetBit(kTasksInitialized, kTRUE); } +//______________________________________________________________________________ +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(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) { @@ -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; diff --git a/ANALYSIS/AliAnalysisManager.h b/ANALYSIS/AliAnalysisManager.h index 33e035034bc..8671e93f4bd 100644 --- a/ANALYSIS/AliAnalysisManager.h +++ b/ANALYSIS/AliAnalysisManager.h @@ -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); diff --git a/ANALYSIS/AliAnalysisTaskMCParticleFilter.cxx b/ANALYSIS/AliAnalysisTaskMCParticleFilter.cxx index 837b62de7f6..1dc4f80fd4b 100644 --- a/ANALYSIS/AliAnalysisTaskMCParticleFilter.cxx +++ b/ANALYSIS/AliAnalysisTaskMCParticleFilter.cxx @@ -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")){ diff --git a/STEER/AOD/AliAODHandler.cxx b/STEER/AOD/AliAODHandler.cxx index a1e96e65f2c..87a0c4c3fd7 100644 --- a/STEER/AOD/AliAODHandler.cxx +++ b/STEER/AOD/AliAODHandler.cxx @@ -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(); diff --git a/STEER/AOD/AliAODHandler.h b/STEER/AOD/AliAODHandler.h index b8139e1ea3c..a69c88e208a 100644 --- a/STEER/AOD/AliAODHandler.h +++ b/STEER/AOD/AliAODHandler.h @@ -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); diff --git a/STEER/AOD/AliAODInputHandler.cxx b/STEER/AOD/AliAODInputHandler.cxx index c15ce4a6d12..13178abba21 100644 --- a/STEER/AOD/AliAODInputHandler.cxx +++ b/STEER/AOD/AliAODInputHandler.cxx @@ -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()); diff --git a/STEER/STEERBase/AliInputEventHandler.cxx b/STEER/STEERBase/AliInputEventHandler.cxx index 936445c01fc..f0fb6b0c648 100644 --- a/STEER/STEERBase/AliInputEventHandler.cxx +++ b/STEER/STEERBase/AliInputEventHandler.cxx @@ -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; +} diff --git a/STEER/STEERBase/AliInputEventHandler.h b/STEER/STEERBase/AliInputEventHandler.h index aaafda237ed..ae65780c0f0 100644 --- a/STEER/STEERBase/AliInputEventHandler.h +++ b/STEER/STEERBase/AliInputEventHandler.h @@ -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 diff --git a/STEER/STEERBase/AliMCEventHandler.cxx b/STEER/STEERBase/AliMCEventHandler.cxx index 0e0f1a736a0..e64cbf6e3df 100644 --- a/STEER/STEERBase/AliMCEventHandler.cxx +++ b/STEER/STEERBase/AliMCEventHandler.cxx @@ -35,6 +35,7 @@ #include "AliLog.h" #include +#include #include #include #include @@ -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="); } diff --git a/STEER/STEERBase/AliMCEventHandler.h b/STEER/STEERBase/AliMCEventHandler.h index 5c1e6df58e7..65ceececf49 100644 --- a/STEER/STEERBase/AliMCEventHandler.h +++ b/STEER/STEERBase/AliMCEventHandler.h @@ -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;} diff --git a/STEER/STEERBase/AliVEventHandler.h b/STEER/STEERBase/AliVEventHandler.h index 2352aa43ac8..37772e03698 100644 --- a/STEER/STEERBase/AliVEventHandler.h +++ b/STEER/STEERBase/AliVEventHandler.h @@ -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 -- 2.43.0