From c5a87c56d074f75bc8015664b7606834585d47f4 Mon Sep 17 00:00:00 2001 From: agheata Date: Thu, 3 May 2007 11:52:02 +0000 Subject: [PATCH] This method has to be called INSIDE the user redefined CreateOutputObjects method, before creating each object corresponding to the output containers that are to be written to a file. This need to be done in general for the big output objects that may not fit memory during processing. - 'option' is the file opening option. ======================================================================== NOTE !: The method call will be ignored in PROOF mode, in which case the results have to be streamed back to the client and written just before Terminate() ======================================================================== Example: void MyAnaTask::CreateOutputObjects() { OpenFile(0); // Will open the file for the object to be written at output #0 fAOD = new TTree("AOD for D0toKPi"); OpenFile(1); // now some histos that should go in the file of the second output container fHist1 = new TH1F("my quality check hist1",...); fHist2 = new TH2F("my quality check hist2",...); } --- ANALYSIS/AliAnalysisDataContainer.cxx | 2 ++ ANALYSIS/AliAnalysisDataContainer.h | 5 ++++ ANALYSIS/AliAnalysisManager.cxx | 11 +++++++-- ANALYSIS/AliAnalysisTask.cxx | 35 ++++++++++++++++++++++++++- ANALYSIS/AliAnalysisTask.h | 12 ++++++--- 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/ANALYSIS/AliAnalysisDataContainer.cxx b/ANALYSIS/AliAnalysisDataContainer.cxx index 004491f031b..a3597c23273 100644 --- a/ANALYSIS/AliAnalysisDataContainer.cxx +++ b/ANALYSIS/AliAnalysisDataContainer.cxx @@ -66,6 +66,7 @@ AliAnalysisDataContainer::AliAnalysisDataContainer() : TNamed(), fConsumers(NULL) { // Dummy ctor. + TObject::SetBit(kContEvtByEvt, kTRUE); } //______________________________________________________________________________ @@ -81,6 +82,7 @@ AliAnalysisDataContainer::AliAnalysisDataContainer(const char *name, TClass *typ { // Default constructor. SetTitle(fType->GetName()); + TObject::SetBit(kContEvtByEvt, kTRUE); } //______________________________________________________________________________ diff --git a/ANALYSIS/AliAnalysisDataContainer.h b/ANALYSIS/AliAnalysisDataContainer.h index 5e583830c4e..011ff4b5f15 100644 --- a/ANALYSIS/AliAnalysisDataContainer.h +++ b/ANALYSIS/AliAnalysisDataContainer.h @@ -38,6 +38,9 @@ enum ENotifyMessage { kSaveData, kFileChange }; +enum EAnalysisContainerFlags { + kContEvtByEvt +}; AliAnalysisDataContainer(); AliAnalysisDataContainer(const AliAnalysisDataContainer &cont); AliAnalysisDataContainer(const char *name, TClass *type); @@ -56,6 +59,7 @@ enum ENotifyMessage { void ResetDataReady() {fDataReady = kFALSE;} virtual Bool_t SetData(TObject *data, Option_t *option=""); void SetDataOwned(Bool_t flag) {fOwnedData = flag;} + void SetEventByEvent(Bool_t flag=kTRUE) {TObject::SetBit(kContEvtByEvt,flag);} void SetFileName(const char *filename) {fFileName = filename;} void SetProducer(AliAnalysisTask *prod, Int_t islot); void AddConsumer(AliAnalysisTask *cons, Int_t islot); @@ -65,6 +69,7 @@ enum ENotifyMessage { void ImportData(AliAnalysisDataWrapper *pack); // Container status checking Bool_t IsDataReady() const {return fDataReady;} + Bool_t IsEventByEvent() const {return TObject::TestBit(kContEvtByEvt);} Bool_t IsOwnedData() const {return fOwnedData;} Bool_t ClientsExecuted() const; Bool_t HasConsumers() const {return (fConsumers != 0);} diff --git a/ANALYSIS/AliAnalysisManager.cxx b/ANALYSIS/AliAnalysisManager.cxx index f235c35d636..9bb0f221d08 100644 --- a/ANALYSIS/AliAnalysisManager.cxx +++ b/ANALYSIS/AliAnalysisManager.cxx @@ -208,8 +208,11 @@ void AliAnalysisManager::SlaveBegin(TTree *tree) TIter next(fTasks); AliAnalysisTask *task; // Call CreateOutputObjects for all tasks - while ((task=(AliAnalysisTask*)next())) + while ((task=(AliAnalysisTask*)next())) { + TDirectory *curdir = gDirectory; task->CreateOutputObjects(); + if (curdir) curdir->cd(); + } if (fMode == kLocalAnalysis) Init(tree); if (fDebug > 1) { cout << "<-AliAnalysisManager::SlaveBegin()" << endl; @@ -594,7 +597,11 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree) TIter next(fTasks); AliAnalysisTask *task; // Call CreateOutputObjects for all tasks - while ((task=(AliAnalysisTask*)next())) task->CreateOutputObjects(); + while ((task=(AliAnalysisTask*)next())) { + TDirectory *curdir = gDirectory; + task->CreateOutputObjects(); + if (curdir) curdir->cd(); + } ExecAnalysis(); Terminate(); return; diff --git a/ANALYSIS/AliAnalysisTask.cxx b/ANALYSIS/AliAnalysisTask.cxx index 2f8db1be3d1..e901b9ddb70 100644 --- a/ANALYSIS/AliAnalysisTask.cxx +++ b/ANALYSIS/AliAnalysisTask.cxx @@ -98,12 +98,13 @@ //============================================================================== #include -#include +#include #include #include "AliAnalysisTask.h" #include "AliAnalysisDataSlot.h" #include "AliAnalysisDataContainer.h" +#include "AliAnalysisManager.h" ClassImp(AliAnalysisTask) @@ -119,6 +120,7 @@ AliAnalysisTask::AliAnalysisTask() fOutputs(NULL) { // Default constructor. + TObject::SetBit(kTaskEvtByEvt, kTRUE); } //______________________________________________________________________________ @@ -134,6 +136,7 @@ AliAnalysisTask::AliAnalysisTask(const char *name, const char *title) fOutputs(NULL) { // Constructor. + TObject::SetBit(kTaskEvtByEvt, kTRUE); fInputs = new TObjArray(2); fOutputs = new TObjArray(2); } @@ -400,6 +403,36 @@ void AliAnalysisTask::CreateOutputObjects() // task initialization and/or create your output objects here. } +//______________________________________________________________________________ +void AliAnalysisTask::OpenFile(Int_t iout, Option_t *option) const +{ +// This method has to be called INSIDE the user redefined CreateOutputObjects +// method, before creating each object corresponding to the output containers +// that are to be written to a file. This need to be done in general for the big output +// objects that may not fit memory during processing. +// - 'option' is the file opening option. +//========================================================================= +// NOTE !: The method call will be ignored in PROOF mode, in which case the +// results have to be streamed back to the client and written just before Terminate() +//========================================================================= +// +// Example: +// void MyAnaTask::CreateOutputObjects() { +// OpenFile(0); // Will open the file for the object to be written at output #0 +// fAOD = new TTree("AOD for D0toKPi"); +// OpenFile(1); +// now some histos that should go in the file of the second output container +// fHist1 = new TH1F("my quality check hist1",...); +// fHist2 = new TH2F("my quality check hist2",...); +// } + + if (iout<0 || iout>=fNoutputs) return; + AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); + if (!mgr || mgr->GetAnalysisType()==AliAnalysisManager::kProofAnalysis) return; + AliAnalysisDataContainer *cont = GetOutputSlot(iout)->GetContainer(); + if (strlen(cont->GetFileName())) new TFile(cont->GetFileName(), option); +} + //______________________________________________________________________________ Bool_t AliAnalysisTask::Notify() { diff --git a/ANALYSIS/AliAnalysisTask.h b/ANALYSIS/AliAnalysisTask.h index 34c4c2c38d0..d92f9186e27 100644 --- a/ANALYSIS/AliAnalysisTask.h +++ b/ANALYSIS/AliAnalysisTask.h @@ -29,8 +29,9 @@ class AliAnalysisTask : public TTask { enum EAnalysisTaskFlags { kTaskUsed = BIT(14), kTaskZombie = BIT(15), - kTaskChecked = BIT(16) - }; + kTaskChecked = BIT(16), + kTaskEvtByEvt = BIT(17) + }; protected: Bool_t fReady; // Flag if the task is ready @@ -65,8 +66,9 @@ class AliAnalysisTask : public TTask { // === CALL THIS AFTERWARDS IN Init() IF THE BRANCH ADDRESS IS NOT YET SET Bool_t SetBranchAddress(Int_t islot, const char *branch, void *address) const; //===================================================================== - // === CALL THIS IN CreateOutputObjects IF THE OUTPUT IS TO BE WRITTEN AT OUTPUT IOUT -// void OpenFile(Int_t iout, const char *name, Option_t *option) const; + // === CALL THIS IN CreateOutputObjects BEFORE CREATING THE OBJECT FOR EACH + // OUTPUT IOUT THAT HAS TO BE WRITTEN TO A FILE + void OpenFile(Int_t iout, Option_t *option="") const; public: AliAnalysisTask(); @@ -105,6 +107,7 @@ public: TObject *GetOutputData(Int_t islot) const; Bool_t IsOutputReady(Int_t islot) const {return fOutputReady[islot];} Bool_t IsChecked() const {return TObject::TestBit(kTaskChecked);} + Bool_t IsExecPerEvent() const {return TObject::TestBit(kTaskEvtByEvt);} Bool_t IsInitialized() const {return fInitialized;} Bool_t IsReady() const {return fReady;} Bool_t IsUsed() const {return TObject::TestBit(kTaskUsed);} @@ -112,6 +115,7 @@ public: void PrintTask(Option_t *option="all", Int_t indent=0) const; void PrintContainers(Option_t *option="all", Int_t indent=0) const; void SetChecked(Bool_t flag=kTRUE) {TObject::SetBit(kTaskChecked,flag);} + void SetExecPerEvent(Bool_t flag=kTRUE) {TObject::SetBit(kTaskEvtByEvt,flag);} void SetUsed(Bool_t flag=kTRUE); void SetZombie(Bool_t flag=kTRUE) {TObject::SetBit(kTaskZombie,flag);} // Main task execution -- 2.39.3