Implemented possibility to register datasets in proof using new TProofOutputFile...
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Nov 2009 14:42:08 +0000 (14:42 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 23 Nov 2009 14:42:08 +0000 (14:42 +0000)
One has just to call: AliAnalysisDataContainer::SetRegisterDataset() for the desired container. The dataset will be named as the file without the extension .root.
Still under testing.

ANALYSIS/AliAnalysisDataContainer.h
ANALYSIS/AliAnalysisManager.cxx
ANALYSIS/AliAnalysisManager.h

index 81c0ce5..7297a3a 100644 (file)
@@ -40,7 +40,8 @@ enum ENotifyMessage {
 };   
 enum EAnalysisContainerFlags {
    kPostEventLoop = BIT(14),
-   kSpecialOutput = BIT(15)
+   kSpecialOutput = BIT(15),
+   kRegisterDataset = BIT(16)
 };     
    AliAnalysisDataContainer();
    AliAnalysisDataContainer(const AliAnalysisDataContainer &cont);
@@ -64,6 +65,7 @@ enum EAnalysisContainerFlags {
    void                      SetDataOwned(Bool_t flag) {fOwnedData = flag;}
    void                      SetPostEventLoop(Bool_t flag=kTRUE) {TObject::SetBit(kPostEventLoop,flag);}
    void                      SetSpecialOutput(Bool_t flag=kTRUE) {TObject::SetBit(kSpecialOutput,flag);}
+   void                      SetRegisterDataset(Bool_t flag=kTRUE) {TObject::SetBit(kRegisterDataset,flag);}
    void                      SetFileName(const char *filename);
    void                      SetFile(TFile *f) {fFile = f;}
    void                      SetProducer(AliAnalysisTask *prod, Int_t islot);
@@ -76,6 +78,7 @@ enum EAnalysisContainerFlags {
    Bool_t                    IsDataReady() const  {return fDataReady;}
    Bool_t                    IsPostEventLoop() const {return TObject::TestBit(kPostEventLoop);}
    Bool_t                    IsSpecialOutput() const {return TObject::TestBit(kSpecialOutput);}
+   Bool_t                    IsRegisterDataset() const {return TObject::TestBit(kRegisterDataset);}
    Bool_t                    IsOwnedData() const  {return fOwnedData;}
    Bool_t                    ClientsExecuted() const;
    Bool_t                    HasConsumers() const {return (fConsumers != 0);}
index 752eb9b..2c46101 100644 (file)
@@ -607,6 +607,7 @@ void AliAnalysisManager::ImportWrappers(TList *source)
    while ((cont=(AliAnalysisDataContainer*)next())) {
       wrap = 0;
       if (cont->GetProducer()->IsPostEventLoop() && !inGrid) continue;
+      if (cont->IsRegisterDataset()) continue;
       const char *filename = cont->GetFileName();
       Bool_t isManagedByHandler = kFALSE;
       if (!(strcmp(filename, "default")) && fOutputEventHandler) {
@@ -717,7 +718,7 @@ void AliAnalysisManager::Terminate()
    TIter next(fTasks);
    TStopwatch timer;
    // Call Terminate() for tasks
-   while ((task=(AliAnalysisTask*)next())) {
+   while (!IsSkipTerminate() && (task=(AliAnalysisTask*)next())) {
       // Save all the canvases produced by the Terminate
       TString pictname = Form("%s_%s", task->GetName(), task->ClassName());
       task->Terminate();
@@ -746,7 +747,9 @@ void AliAnalysisManager::Terminate()
    while ((output=(AliAnalysisDataContainer*)next1())) {
       // Special outputs or grid files have the files already closed and written.
       if (fMode == kGridAnalysis) continue;
-      if (output->IsSpecialOutput()&&(fMode == kProofAnalysis)) continue;
+      if (fMode == kProofAnalysis) {
+        if (output->IsSpecialOutput() || output->IsRegisterDataset()) continue;
+      }  
       const char *filename = output->GetFileName();
       if (!(strcmp(filename, "default"))) {
          if (fOutputEventHandler) filename = fOutputEventHandler->GetOutputFileName();
@@ -1086,7 +1089,10 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
    anaType.ToLower();
    fMode = kLocalAnalysis;
    Bool_t runlocalinit = kTRUE;
-   if (anaType.Contains("file")) runlocalinit = kFALSE;
+   if (anaType.Contains("file")) {
+      runlocalinit = kFALSE;
+      SetSkipTerminate(kTRUE);
+   }   
    if (anaType.Contains("proof"))     fMode = kProofAnalysis;
    else if (anaType.Contains("grid")) fMode = kGridAnalysis;
    else if (anaType.Contains("mix"))  fMode = kMixingAnalysis;
@@ -1353,6 +1359,9 @@ TFile *AliAnalysisManager::OpenProofFile(AliAnalysisDataContainer *cont, const c
     // Get the actual file
     line = Form("((TProofOutputFile*)0x%lx)->GetFileName();", (ULong_t)pof);
     filename = (const char*)gROOT->ProcessLine(line);
+    if (fDebug>1) {
+      printf("File: %s already booked via TProofOutputFile\n", filename.Data());
+    }  
     f = (TFile*)gROOT->GetListOfFiles()->FindObject(filename);
     if (!f) Fatal("OpenProofFile", "Proof output file found but no file opened for %s", filename.Data());
     // Check if option "UPDATE" was preserved 
@@ -1361,7 +1370,16 @@ TFile *AliAnalysisManager::OpenProofFile(AliAnalysisDataContainer *cont, const c
     if ((opt=="UPDATE") && (opt!=f->GetOption())) 
       Fatal("OpenProofFile", "File %s already opened, but not in UPDATE mode!", cont->GetFileName());
   } else {
-    line = Form("TProofOutputFile *pf = new TProofOutputFile(\"%s\");", filename.Data());
+    if (cont->IsRegisterDataset()) {
+      TString dset_name = filename;
+      dset_name.ReplaceAll(".root", "");
+      dset_name.ReplaceAll(":","_");
+      if (fDebug>1) printf("Booking dataset: %s\n", dset_name.Data());
+      line = Form("TProofOutputFile *pf = new TProofOutputFile(\"%s\", \"DROV\", \"%s\");", filename.Data(), dset_name.Data());
+    } else {
+      if (fDebug>1) printf("Booking TProofOutputFile: %s to be merged\n", filename.Data());
+      line = Form("TProofOutputFile *pf = new TProofOutputFile(\"%s\");", filename.Data());
+    }
     if (fDebug > 1) printf("=== %s\n", line.Data());
     gROOT->ProcessLine(line);
     line = Form("pf->OpenFile(\"%s\");", option);
@@ -1373,7 +1391,7 @@ TFile *AliAnalysisManager::OpenProofFile(AliAnalysisDataContainer *cont, const c
     }   
     // Add to proof output list
     line = Form("((TList*)0x%lx)->Add(pf);",(ULong_t)fSelector->GetOutputList());
-    if (fDebug > 1) printf("=== %s", line.Data());
+    if (fDebug > 1) printf("=== %s\n", line.Data());
     gROOT->ProcessLine(line);
   }
   if (f && !f->IsZombie() && !f->TestBit(TFile::kRecovered)) {
@@ -1565,6 +1583,7 @@ Bool_t AliAnalysisManager::ValidateOutputFiles() const
    TDirectory *cdir = gDirectory;
    TString openedFiles;
    while ((output=(AliAnalysisDataContainer*)next())) {
+      if (output->IsRegisterDataset()) continue;
       TString filename = output->GetFileName();
       if (filename == "default") {
          if (!fOutputEventHandler) continue;
index 3ed32d6..2fe2989 100644 (file)
@@ -50,7 +50,8 @@ enum EAliAnalysisFlags {
    kDisableBranches  = BIT(15),
    kUseDataSet       = BIT(16),
    kSaveCanvases     = BIT(17),
-   kExternalLoop     = BIT(18)
+   kExternalLoop     = BIT(18),
+   kSkipTerminate    = BIT(19)
 };   
 
    AliAnalysisManager(const char *name = "mgr", const char *title="");
@@ -101,7 +102,6 @@ enum EAliAnalysisFlags {
    TObjArray          *GetTopTasks() const        {return fTopTasks;}
    TTree              *GetTree() const            {return fTree;}
    TObjArray          *GetZombieTasks() const     {return fZombies;}
-   Bool_t              IsExternalLoop() const     {return TObject::TestBit(kExternalLoop);}
    Bool_t              IsUsingDataSet() const     {return TObject::TestBit(kUseDataSet);}
    void                SetAnalysisType(EAliAnalysisExecMode mode) {fMode = mode;}
    void                SetCurrentEntry(Long64_t entry)            {fCurrentEntry = entry;}
@@ -118,6 +118,7 @@ enum EAliAnalysisFlags {
    void                SetOutputEventHandler(AliVEventHandler*  handler);
    void                SetSelector(AliAnalysisSelector *sel)      {fSelector = sel;}
    void                SetSaveCanvases(Bool_t flag=kTRUE)         {TObject::SetBit(kSaveCanvases,flag);}
+   void                SetSkipTerminate(Bool_t flag)              {TObject::SetBit(kSkipTerminate,flag);}
    void                SetSpecialOutputLocation(const char *loc)  {fSpecialOutputLocation = loc;}
 
    // Container handling
@@ -140,7 +141,9 @@ enum EAliAnalysisFlags {
    // Analysis initialization and execution, status
    Bool_t               InitAnalysis();
    Bool_t               IsInitialized() const {return fInitOK;}
+   Bool_t               IsExternalLoop() const {return TObject::TestBit(kExternalLoop);}
    Bool_t               IsEventLoop() const {return TObject::TestBit(kEventLoop);}
+   Bool_t               IsSkipTerminate() const {return TObject::TestBit(kSkipTerminate);}
    void                 ResetAnalysis();
    void                 ExecAnalysis(Option_t *option="");
    void                 FinishAnalysis();