]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisManager.cxx
AliAODEvent: corrected copy constructor and assignment operator. This do not work...
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisManager.cxx
index 8f94c6d0d69e3d44903d1d18441544c1754fde5c..9f790ce6912e7176722dc2d30451d7949a5f73ba 100644 (file)
@@ -36,6 +36,7 @@
 #include <TSystem.h>
 #include <TROOT.h>
 #include <TCanvas.h>
+#include <TStopwatch.h>
 
 #include "AliAnalysisSelector.h"
 #include "AliAnalysisGrid.h"
@@ -88,6 +89,7 @@ AliAnalysisManager::AliAnalysisManager(const char *name, const char *title)
    fInputs     = new TObjArray();
    fOutputs    = new TObjArray();
    SetEventLoop(kTRUE);
+   TObject::SetObjectStat(kFALSE);
 }
 
 //______________________________________________________________________________
@@ -125,6 +127,7 @@ AliAnalysisManager::AliAnalysisManager(const AliAnalysisManager& other)
    fOutputs    = new TObjArray(*other.fOutputs);
    fgCommonFileName  = "AnalysisResults.root";
    fgAnalysisManager = this;
+   TObject::SetObjectStat(kFALSE);
 }
    
 //______________________________________________________________________________
@@ -172,6 +175,7 @@ AliAnalysisManager::~AliAnalysisManager()
    if (fOutputs) delete fOutputs;
    if (fGridHandler) delete fGridHandler;
    if (fgAnalysisManager==this) fgAnalysisManager = NULL;
+   TObject::SetObjectStat(kTRUE);
 }
 
 //______________________________________________________________________________
@@ -606,6 +610,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) {
@@ -712,16 +717,42 @@ void AliAnalysisManager::Terminate()
   // the results graphically.
    if (fDebug > 0) printf("->AliAnalysisManager::Terminate()\n");
    AliAnalysisTask *task;
+   AliAnalysisDataContainer *output;
    TIter next(fTasks);
+   TStopwatch timer;
    // Call Terminate() for tasks
-   while ((task=(AliAnalysisTask*)next())) task->Terminate();
+   while (!IsSkipTerminate() && (task=(AliAnalysisTask*)next())) {
+      // Save all the canvases produced by the Terminate
+      TString pictname = Form("%s_%s", task->GetName(), task->ClassName());
+      task->Terminate();
+      if (TObject::TestBit(kSaveCanvases)) {
+         if (!gROOT->IsBatch()) {
+            Warning("Terminate", "Waiting 5 sec for %s::Terminate() to finish drawing", task->ClassName());
+            timer.Start();
+            while (timer.CpuTime()<5) {
+               timer.Continue();
+               gSystem->ProcessEvents();
+            }
+         }
+         Int_t iend = gROOT->GetListOfCanvases()->GetEntries();
+         if (iend==0) continue;
+         TCanvas *canvas;
+         for (Int_t ipict=0; ipict<iend; ipict++) {
+            canvas = (TCanvas*)gROOT->GetListOfCanvases()->At(ipict);
+            if (!canvas) continue;         
+            canvas->SaveAs(Form("%s_%02d.gif", pictname.Data(),ipict));
+         } 
+         gROOT->GetListOfCanvases()->Delete(); 
+      }
+   }   
    //
    TIter next1(fOutputs);
-   AliAnalysisDataContainer *output;
    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();
@@ -1061,7 +1092,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;
@@ -1133,6 +1167,11 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
                task->CreateOutputObjects();
                if (curdir) curdir->cd();
             }   
+            if (IsExternalLoop()) {
+               Info("StartAnalysis", "Initialization done. Event loop is controlled externally.\
+                     \nSetData for top container, call ExecAnalysis in a loop and then Terminate manually");
+               return;
+            }         
             ExecAnalysis();
             Terminate();
             return;
@@ -1323,6 +1362,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 
@@ -1331,7 +1373,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", cont->GetTitle());
+      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);
@@ -1343,7 +1394,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)) {
@@ -1535,6 +1586,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;