]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisManager.cxx
- Fix for a recently introduced bug
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisManager.cxx
index f235c35d636787ef11e3eeb9af96280fcc969d0c..02566ad4a0e393576316bcfb596f6c5fe93a66b3 100644 (file)
@@ -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;
@@ -357,7 +360,18 @@ void AliAnalysisManager::UnpackOutput(TList *source)
          callEnv.SetParam((Long_t) file);
          callEnv.Execute(output->GetData());
       }
-      output->GetData()->Write();      
+      output->GetData()->Write();
+      // Check if there are client tasks that run in single-shot mode.
+      if (!output->HasConsumers()) continue;
+      output->SetEventByEvent(kFALSE);
+      TObjArray *list = output->GetConsumers();
+      Int_t ncons = list->GetEntriesFast();
+      for (Int_t i=0; i<ncons; i++) {
+         AliAnalysisTask *task = (AliAnalysisTask*)list->At(i);
+         task->CheckNotify(kTRUE);
+         // If task is active, execute it
+         if (task->IsActive()) task->ExecuteTask();         
+      }
    }
    if (fDebug > 1) {
       cout << "<-AliAnalysisManager::UnpackOutput()" << endl;
@@ -578,29 +592,53 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree)
       Warning("StartAnalysis", "GRID analysis mode not implemented. Running local.");
       fMode = kLocalAnalysis;
    }
-   char line[128];   
-   // Disable by default all branches
-   if (tree) tree->SetBranchStatus("*",0);
+   char line[128];
+   SetEventLoop(kFALSE);
+   // Disable by default all branches and set event loop mode
+   if (tree) {
+//      tree->SetBranchStatus("*",0);
+      SetEventLoop(kTRUE);
+   }   
+   AliAnalysisDataContainer *cont = 0;
+   TIter nextc(fInputs);
+   // Force top containers have the same event loop type as the analysis
+   while ((cont=(AliAnalysisDataContainer*)nextc())) cont->SetEventByEvent(IsEventLoop());
+   AliAnalysisDataContainer *cont_top = (AliAnalysisDataContainer*)fInputs->First();
+
    TChain *chain = dynamic_cast<TChain*>(tree);
 
    // Initialize locally all tasks
    TIter next(fTasks);
    AliAnalysisTask *task;
-   while ((task=(AliAnalysisTask*)next())) task->LocalInit();
-
+   while ((task=(AliAnalysisTask*)next())) {
+      for (Int_t islot=0; islot<task->GetNinputs(); islot++) {
+         cont = task->GetInputSlot(islot)->GetContainer();
+         if (cont==cont_top) break;
+         cont = 0;
+      }
+      // All tasks feeding from the top containers must have the same event loop type
+//      if (cont) task->SetExecPerEvent(IsEventLoop());
+//      else task->SetExecPerEvent(task->IsExecPerEvent());         
+      task->LocalInit();
+   }
+   
    switch (fMode) {
       case kLocalAnalysis:
          if (!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;
          } 
          // Run tree-based analysis via AliAnalysisSelector  
-         gROOT->ProcessLine(".L AliAnalysisSelector.cxx+");
+         gROOT->ProcessLine(".L $ALICE_ROOT/ANALYSIS/AliAnalysisSelector.cxx+");
          cout << "===== RUNNING LOCAL ANALYSIS " << GetName() << " ON TREE " << tree->GetName() << endl;
          sprintf(line, "AliAnalysisSelector *selector = new AliAnalysisSelector((AliAnalysisManager*)0x%lx);",(ULong_t)this);
          gROOT->ProcessLine(line);