]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisManager.cxx
New Trigger Emulation and Trigger access from data (Rachid Guernane)
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisManager.cxx
index 2299a52b8942f61a62ffd17c033133dbd1bc34f2..d89ca536a903868c38ddecdeff56f5a765a8c22a 100644 (file)
@@ -454,8 +454,11 @@ void AliAnalysisManager::PackOutput(TList *target)
             if (strlen(filename) && !isManagedByHandler) {
                // Backup current folder
                TDirectory *opwd = gDirectory;
-               // File resident outputs
-               TFile *file = AliAnalysisManager::OpenFile(output, "RECREATE", kTRUE);
+               // File resident outputs. 
+               // Check first if the file exists.
+               TString open_option = "RECREATE";
+               if (!gSystem->AccessPathName(output->GetFileName())) open_option = "UPDATE";
+               TFile *file = AliAnalysisManager::OpenFile(output, open_option, kTRUE);
                // Clear file list to release object ownership to user.
                file->Clear();
                // Save data to file, then close.
@@ -511,7 +514,8 @@ void AliAnalysisManager::PackOutput(TList *target)
             if (fDebug > 1) printf("PackOutput %s: special output\n", output->GetName());
             if (isManagedByHandler) {
                // Terminate IO for files managed by the output handler
-               if (file) file->Write();
+               // file->Write() moved to AOD handler (A.G. 11.01.10)
+//               if (file) file->Write();
                if (file && fDebug > 2) {
                   printf("   handled file %s listing content:\n", file->GetName());
                   file->ls();
@@ -746,7 +750,14 @@ void AliAnalysisManager::Terminate()
       }
    }   
    //
+   if (fInputEventHandler)   fInputEventHandler  ->TerminateIO();
+   if (fOutputEventHandler)  fOutputEventHandler ->TerminateIO();
+   if (fMCtruthEventHandler) fMCtruthEventHandler->TerminateIO();
    TIter next1(fOutputs);
+   TString handlerFile = "";
+   if (fOutputEventHandler) {
+      handlerFile = fOutputEventHandler->GetOutputFileName();
+   }
    while ((output=(AliAnalysisDataContainer*)next1())) {
       // Special outputs or grid files have the files already closed and written.
       if (fMode == kGridAnalysis) continue;
@@ -754,21 +765,19 @@ void AliAnalysisManager::Terminate()
         if (output->IsSpecialOutput() || output->IsRegisterDataset()) continue;
       }  
       const char *filename = output->GetFileName();
-      if (!(strcmp(filename, "default"))) {
-         if (fOutputEventHandler) filename = fOutputEventHandler->GetOutputFileName();
-         TFile *aodfile = (TFile*)gROOT->GetListOfFiles()->FindObject(filename);
-         if (aodfile) {
-            if (fDebug > 1) printf("Writing output handler file: %s\n", filename);
-            aodfile->Write();
-            continue;
-         }   
-      }      
+      TString open_option = "RECREATE";
+      if (!(strcmp(filename, "default"))) continue;
       if (!strlen(filename)) continue;
       if (!output->GetData()) continue;
       TDirectory *opwd = gDirectory;
       TFile *file = output->GetFile();
       if (!file) file = (TFile*)gROOT->GetListOfFiles()->FindObject(filename);
-      if (!file) file = new TFile(filename, "RECREATE");
+      if (!file) {
+             printf("Terminate : handlerFile = %s, filename = %s\n",handlerFile.Data(),filename);
+             //if (handlerFile == filename && !gSystem->AccessPathName(filename)) open_option = "UPDATE";
+         if (!gSystem->AccessPathName(filename)) open_option = "UPDATE";
+         file = new TFile(filename, open_option);
+      }
       if (file->IsZombie()) {
          Error("Terminate", "Cannot open output file %s", filename);
          continue;
@@ -817,10 +826,6 @@ void AliAnalysisManager::Terminate()
       if (opwd) opwd->cd();
    }   
 
-   if (fInputEventHandler)   fInputEventHandler  ->TerminateIO();
-   if (fOutputEventHandler)  fOutputEventHandler ->TerminateIO();
-   if (fMCtruthEventHandler) fMCtruthEventHandler->TerminateIO();
-
    Bool_t getsysInfo = ((fNSysInfo>0) && (fMode==kLocalAnalysis))?kTRUE:kFALSE;
    if (getsysInfo) {
       TDirectory *cdir = gDirectory;
@@ -1079,13 +1084,13 @@ void AliAnalysisManager::ResetAnalysis()
 }
 
 //______________________________________________________________________________
-void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t nentries, Long64_t firstentry)
+Long64_t AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t nentries, Long64_t firstentry)
 {
 // Start analysis for this manager. Analysis task can be: LOCAL, PROOF, GRID or
 // MIX. Process nentries starting from firstentry
    if (!fInitOK) {
       Error("StartAnalysis","Analysis manager was not initialized !");
-      return;
+      return -1;
    }
    if (fDebug > 0) printf("StartAnalysis %s\n",GetName());
    TString anaType = type;
@@ -1103,7 +1108,7 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
       if (!fGridHandler) {
          Error("StartAnalysis", "Cannot start grid analysis without a grid handler.");
          Info("===", "Add an AliAnalysisAlien object as plugin for this manager and configure it.");
-         return;
+         return -1;
       }
       // Write analysis manager in the analysis file
       cout << "===== RUNNING GRID ANALYSIS: " << GetName() << endl;
@@ -1115,21 +1120,21 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
       }
       if (!fGridHandler->StartAnalysis(nentries, firstentry)) {
          Info("StartAnalysis", "Grid analysis was stopped and cannot be terminated");
-         return;
+         return -1;
       }   
 
       // Terminate grid analysis
-      if (fSelector && fSelector->GetStatus() == -1) return;
-      if (fGridHandler->GetRunMode() == AliAnalysisGrid::kOffline) return;
+      if (fSelector && fSelector->GetStatus() == -1) return -1;
+      if (fGridHandler->GetRunMode() == AliAnalysisGrid::kOffline) return 0;
       cout << "===== MERGING OUTPUTS REGISTERED BY YOUR ANALYSIS JOB: " << GetName() << endl;
       if (!fGridHandler->MergeOutputs()) {
          // Return if outputs could not be merged or if it alien handler
          // was configured for offline mode or local testing.
-         return;
+         return 0;
       }
       ImportWrappers(NULL);
       Terminate();
-      return;
+      return 0;
    }
    char line[256];
    SetEventLoop(kFALSE);
@@ -1142,7 +1147,7 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
       chain = (TChain*)tree;
       if (!chain || !chain->GetListOfFiles()->First()) {
          Error("StartAnalysis", "Cannot process null or empty chain...");
-         return;
+         return -1;
       }   
       ttype = "TChain";
    }   
@@ -1169,11 +1174,11 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
             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;
+               return 0;
             }         
             ExecAnalysis();
             Terminate();
-            return;
+            return 0;
          } 
          // Run tree-based analysis via AliAnalysisSelector  
          cout << "===== RUNNING LOCAL ANALYSIS " << GetName() << " ON TREE " << tree->GetName() << endl;
@@ -1183,7 +1188,7 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
       case kProofAnalysis:
          if (!gROOT->GetListOfProofs() || !gROOT->GetListOfProofs()->GetEntries()) {
             Error("StartAnalysis", "No PROOF!!! Aborting.");
-            return;
+            return -1;
          }   
          sprintf(line, "gProof->AddInput((TObject*)0x%lx);", (ULong_t)this);
          gROOT->ProcessLine(line);
@@ -1193,7 +1198,7 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
             chain->Process("AliAnalysisSelector", "", nentries, firstentry);
          } else {
             Error("StartAnalysis", "No chain!!! Aborting.");
-            return;
+            return -1;
          }      
          break;
       case kGridAnalysis:
@@ -1203,7 +1208,7 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
          // Run event mixing analysis
          if (!fEventPool) {
             Error("StartAnalysis", "Cannot run event mixing without event pool");
-            return;
+            return -1;
          }
          cout << "===== RUNNING EVENT MIXING ANALYSIS " << GetName() << endl;
          fSelector = new AliAnalysisSelector(this);
@@ -1216,24 +1221,26 @@ void AliAnalysisManager::StartAnalysis(const char *type, TTree *tree, Long64_t n
          }
          PackOutput(fSelector->GetOutputList());
          Terminate();
-   }   
+   }
+   if (fSelector) return fSelector->GetStatus();
+   return 0;
 }   
 
 //______________________________________________________________________________
-void AliAnalysisManager::StartAnalysis(const char *type, const char *dataset, Long64_t nentries, Long64_t firstentry)
+Long64_t AliAnalysisManager::StartAnalysis(const char *type, const char *dataset, Long64_t nentries, Long64_t firstentry)
 {
 // Start analysis for this manager on a given dataset. Analysis task can be: 
 // LOCAL, PROOF or GRID. Process nentries starting from firstentry.
    if (!fInitOK) {
       Error("StartAnalysis","Analysis manager was not initialized !");
-      return;
+      return -1;
    }
    if (fDebug > 0) printf("StartAnalysis %s\n",GetName());
    TString anaType = type;
    anaType.ToLower();
    if (!anaType.Contains("proof")) {
       Error("StartAnalysis", "Cannot process datasets in %s mode. Try PROOF.", type);
-      return;
+      return -1;
    }   
    fMode = kProofAnalysis;
    char line[256];
@@ -1251,19 +1258,21 @@ void AliAnalysisManager::StartAnalysis(const char *type, const char *dataset, Lo
    
    if (!gROOT->GetListOfProofs() || !gROOT->GetListOfProofs()->GetEntries()) {
       Error("StartAnalysis", "No PROOF!!! Aborting.");
-      return;
+      return -1;
    }   
    sprintf(line, "gProof->AddInput((TObject*)0x%lx);", (ULong_t)this);
    gROOT->ProcessLine(line);
    sprintf(line, "gProof->GetDataSet(\"%s\");", dataset);
    if (!gROOT->ProcessLine(line)) {
       Error("StartAnalysis", "Dataset %s not found", dataset);
-      return;
+      return -1;
    }   
    sprintf(line, "gProof->Process(\"%s\", \"AliAnalysisSelector\", \"\", %lld, %lld);",
            dataset, nentries, firstentry);
    cout << "===== RUNNING PROOF ANALYSIS " << GetName() << " ON DATASET " << dataset << endl;
    gROOT->ProcessLine(line);
+   if (fSelector) return fSelector->GetStatus();
+   return 0;
 }   
 
 //______________________________________________________________________________
@@ -1291,7 +1300,7 @@ TFile *AliAnalysisManager::OpenFile(AliAnalysisDataContainer *cont, const char *
       TString opt(option);
       opt.ToUpper();
       if ((opt=="UPDATE") && (opt!=f->GetOption())) 
-        ::Fatal("AliAnalysisManager::OpenFile", "File %s already opened, but not in UPDATE mode!", cont->GetFileName());
+        ::Info("AliAnalysisManager::OpenFile", "File %s already opened in %s mode!", cont->GetFileName(), f->GetOption());
     } else {
       f = TFile::Open(filename, option);
     }    
@@ -1335,7 +1344,7 @@ TFile *AliAnalysisManager::OpenProofFile(AliAnalysisDataContainer *cont, const c
       TString opt(option);
       opt.ToUpper();
       if ((opt=="UPDATE") && (opt!=f->GetOption()))
-        Fatal("OpenProofFile", "File %s already opened, but not in UPDATE mode!", cont->GetFileName());
+        ::Info("OpenProofFile", "File %s already opened in %s mode!", cont->GetFileName(), f->GetOption());
     } else {
       f = new TFile(filename, option);
     }
@@ -1499,7 +1508,7 @@ void AliAnalysisManager::SetInputEventHandler(AliVEventHandler*  handler)
 // Set the input event handler and create a container for it.
    fInputEventHandler   = handler;
    fCommonInput = CreateContainer("cAUTO_INPUT", TChain::Class(), AliAnalysisManager::kInputContainer);
-   Warning("SetInputEventHandler", " An automatic input container for the input chain was created.\nPlease use: mgr->GetCommonInputContainer() to access it.");
+//   Warning("SetInputEventHandler", " An automatic input container for the input chain was created.\nPlease use: mgr->GetCommonInputContainer() to access it.");
 }
 
 //______________________________________________________________________________
@@ -1509,7 +1518,7 @@ void AliAnalysisManager::SetOutputEventHandler(AliVEventHandler*  handler)
    fOutputEventHandler   = handler;
    fCommonOutput = CreateContainer("cAUTO_OUTPUT", TTree::Class(), AliAnalysisManager::kOutputContainer, "default");
    fCommonOutput->SetSpecialOutput();
-   Warning("SetOutputEventHandler", " An automatic output container for the output tree was created.\nPlease use: mgr->GetCommonOutputContainer() to access it.");
+//   Warning("SetOutputEventHandler", " An automatic output container for the output tree was created.\nPlease use: mgr->GetCommonOutputContainer() to access it.");
 }
 
 //______________________________________________________________________________
@@ -1590,6 +1599,8 @@ Bool_t AliAnalysisManager::ValidateOutputFiles() const
       if (filename == "default") {
          if (!fOutputEventHandler) continue;
          filename = fOutputEventHandler->GetOutputFileName();
+         // Main AOD may not be there
+         if (gSystem->AccessPathName(filename)) continue;
       }
       // Check if the file is closed
       if (openedFiles.Contains(filename)) continue;;