]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisManager.cxx
Coverity: Concerned function ScanSingleNameArgument was actually not used anywhere...
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisManager.cxx
index 538740f00b16525c86b5f12baab0adf3ffc61d2e..7e372cca18e64645255547f8a830e2d1f2b8fe4e 100644 (file)
@@ -345,6 +345,7 @@ void AliAnalysisManager::SlaveBegin(TTree *tree)
   // When running with PROOF SlaveBegin() is called on each slave server.
   // The tree argument is deprecated (on PROOF 0 is passed).
    if (fDebug > 1) printf("->AliAnalysisManager::SlaveBegin()\n");
+   if (!CheckTasks()) Fatal("SlaveBegin", "Not all needed libraries were loaded");
    static Bool_t isCalled = kFALSE;
    Bool_t init = kFALSE;
    Bool_t initOK = kTRUE;
@@ -409,6 +410,11 @@ void AliAnalysisManager::SlaveBegin(TTree *tree)
       // Start with memory as current dir and make sure by default histograms do not get attached to files.
       TH1::AddDirectory(kFALSE);
       task->CreateOutputObjects();
+      if (!task->CheckPostData()) {
+         Error("SlaveBegin","####### IMPORTANT! ####### \n\n\n\
+                Task %s (%s) did not call PostData() for all its outputs in (User)CreateOutputObjects()\n\n\
+                ####### FIX YOUR CODE, THIS WILL PRODUCE A FATAL ERROR IN FUTURE! ##########", task->GetName(), task->ClassName());
+      }
       if (getsysInfo) AliSysInfo::AddStamp(Form("%s_CREATEOUTOBJ",task->ClassName()), 0, itask, 0);
       itask++;
    }
@@ -529,7 +535,7 @@ void AliAnalysisManager::PackOutput(TList *target)
       }
    }
    // Write statistics message on the workers.
-   WriteStatisticsMsg(fNcalls);
+   if (fStatistics) WriteStatisticsMsg(fNcalls);
    
    if (fMode == kProofAnalysis) {
       TIter next(fOutputs);
@@ -977,7 +983,7 @@ void AliAnalysisManager::Terminate()
    }   
    delete allOutputs;
    //Write statistics information on the client
-   WriteStatisticsMsg(fNcalls);
+   if (fStatistics) WriteStatisticsMsg(fNcalls);
    if (getsysInfo) {
       TDirectory *crtdir = gDirectory;
       TFile f("syswatch.root", "RECREATE");
@@ -1070,7 +1076,7 @@ void AliAnalysisManager::Terminate()
       if (crtdir) crtdir->cd();
    }
    // Validate the output files
-   if (ValidateOutputFiles()) {
+   if (ValidateOutputFiles() && fIsRemote && fMode!=kProofAnalysis) {
       ofstream out;
       out.open("outputs_valid", ios::out);
       out.close();
@@ -1402,7 +1408,7 @@ void AliAnalysisManager::AddBranches(const char *branches)
          fRequestedBranches += obj->GetName();
       }
    }
-   if (arr) delete arr;
+  delete arr;
 }   
 
 //______________________________________________________________________________
@@ -1425,8 +1431,33 @@ void AliAnalysisManager::CheckBranches(Bool_t load)
       fTable.Add(br);
       if (load && br->GetReadEntry()!=GetCurrentEntry()) br->GetEntry(GetCurrentEntry());
    }
+  delete arr;
 }
 
+//______________________________________________________________________________
+Bool_t AliAnalysisManager::CheckTasks() const
+{
+// Check consistency of tasks.
+   Int_t ntasks = fTasks->GetEntries();
+   if (!ntasks) {
+      Error("CheckTasks", "No tasks connected to the manager. This may be due to forgetting to compile the task or to load their library.");
+      return kFALSE;
+   }
+   // Get the pointer to AliAnalysisTaskSE::Class()
+   TClass *badptr = (TClass*)gROOT->ProcessLine("AliAnalysisTaskSE::Class()");
+   // Loop all tasks to check if their corresponding library was loaded
+   TIter next(fTasks);
+   TObject *obj;
+   while ((obj=next())) {
+      if (obj->IsA() == badptr) {
+         Error("CheckTasks", "##################\n \
+         Class for task %s NOT loaded. You probably forgot to load the library for this task (or compile it dynamically).\n###########################\n",obj->GetName());
+         return kFALSE;
+      }
+   }
+   return kTRUE;      
+}   
+
 //______________________________________________________________________________
 void AliAnalysisManager::PrintStatus(Option_t *option) const
 {
@@ -1442,8 +1473,22 @@ void AliAnalysisManager::PrintStatus(Option_t *option) const
    AliAnalysisTask *task;
    while ((task=(AliAnalysisTask*)next()))
       task->PrintTask(option);
+  
    if (!fAutoBranchHandling && !fRequestedBranches.IsNull()) 
       printf("Requested input branches:\n%s\n", fRequestedBranches.Data());
+  
+  TString sopt(option);
+  sopt.ToUpper();
+  
+  if (sopt.Contains("ALL"))
+  {
+    if ( fOutputEventHandler )
+    {
+      cout << TString('_',78) << endl;
+      cout << "OutputEventHandler:" << endl;
+      fOutputEventHandler->Print("   ");
+    }
+  }
 }
 
 //______________________________________________________________________________
@@ -1480,6 +1525,7 @@ Long64_t AliAnalysisManager::StartAnalysis(const char *type, TTree * const tree,
       cdir->cd();
       return -1;
    }
+   if (!CheckTasks()) Fatal("StartAnalysis", "Not all needed libraries were loaded");
    if (fDebug > 1) printf("StartAnalysis %s\n",GetName());
    fMaxEntries = nentries;
    fIsRemote = kFALSE;
@@ -1576,6 +1622,11 @@ Long64_t AliAnalysisManager::StartAnalysis(const char *type, TTree * const tree,
             while ((task=(AliAnalysisTask*)nextT())) {
                TH1::AddDirectory(kFALSE);
                task->CreateOutputObjects();
+               if (!task->CheckPostData()) {
+                  Error("SlaveBegin","####### IMPORTANT! ####### \n\n\n\
+                        Task %s (%s) did not call PostData() for all its outputs in (User)CreateOutputObjects()\n\n\
+                        ########### FIX YOUR CODE, THIS WILL PRODUCE A FATAL ERROR IN FUTURE! ###########", task->GetName(), task->ClassName());
+               }
                if (getsysInfo) AliSysInfo::AddStamp(Form("%s_CREATEOUTOBJ",task->ClassName()), 0, itask, 0);
                gROOT->cd();
                itask++;
@@ -1624,7 +1675,7 @@ Long64_t AliAnalysisManager::StartAnalysis(const char *type, TTree * const tree,
             cdir->cd();
             return -1;
          }   
-         line = Form("gProof->AddInput((TObject*)0x%lx);", (ULong_t)this);
+         line = Form("gProof->AddInput((TObject*)%p);", this);
          gROOT->ProcessLine(line);
          if (chain) {
             chain->SetProof();
@@ -1721,7 +1772,6 @@ Long64_t AliAnalysisManager::StartAnalysis(const char *type, const char *dataset
    // Set the dataset flag
    TObject::SetBit(kUseDataSet);
    fTree = 0;
-   TChain *chain = 0;
    if (fGridHandler) {
       // Start proof analysis using the grid handler
       if (!fGridHandler->StartAnalysis(nentries, firstentry)) {
@@ -1748,19 +1798,13 @@ Long64_t AliAnalysisManager::StartAnalysis(const char *type, const char *dataset
       task->LocalInit();
    }
    
-   line = Form("gProof->AddInput((TObject*)0x%lx);", (ULong_t)this);
+   line = Form("gProof->AddInput((TObject*)%p);", this);
    gROOT->ProcessLine(line);
    Long_t retv;
-   if (chain) {
-//      chain->SetProof();
-      cout << "===== RUNNING PROOF ANALYSIS " << GetName() << " ON TEST CHAIN " << chain->GetName() << endl;
-      retv = chain->Process("AliAnalysisSelector", "", nentries, firstentry);
-   } else {   
-      line = Form("gProof->Process(\"%s\", \"AliAnalysisSelector\", \"\", %lld, %lld);",
-                  dataset, nentries, firstentry);
-      cout << "===== RUNNING PROOF ANALYSIS " << GetName() << " ON DATASET " << dataset << endl;
-      retv = (Long_t)gROOT->ProcessLine(line);
-   }   
+   line = Form("gProof->Process(\"%s\", \"AliAnalysisSelector\", \"\", %lld, %lld);",
+               dataset, nentries, firstentry);
+   cout << "===== RUNNING PROOF ANALYSIS " << GetName() << " ON DATASET " << dataset << endl;
+   retv = (Long_t)gROOT->ProcessLine(line);
    return retv;
 }   
 
@@ -2260,7 +2304,7 @@ void AliAnalysisManager::ProgressBar(const char *opname, Long64_t current, Long6
      Int_t full   = Int_t(ocurrent > 0 ? 
                          time * (float(osize)/ocurrent) + .5 : 
                          99*3600+59*60+59); 
-     Int_t remain = full - time;
+     Int_t remain = Int_t(full - time);
      Int_t rsec   = remain % 60;
      Int_t rmin   = (remain / 60) % 60;
      Int_t rhour  = (remain / 60 / 60);
@@ -2351,28 +2395,22 @@ void AliAnalysisManager::AddStatisticsMsg(const char *line)
 }
 
 //______________________________________________________________________________
-void AliAnalysisManager::WriteStatisticsMsg(Int_t nevents)
+void AliAnalysisManager::WriteStatisticsMsg(Int_t)
 {
-// Write the statistics message in a file named <nevents.stat>.
 // If fStatistics is present, write the file in the format ninput_nprocessed_nfailed_naccepted.stat
    static Bool_t done = kFALSE;
    if (done) return;
    done = kTRUE;
+   if (!fStatistics) return;
    ofstream out;
-   if (fStatistics) {
-      AddStatisticsMsg(Form("Number of input events:        %lld",fStatistics->GetNinput()));
-      AddStatisticsMsg(Form("Number of processed events:    %lld",fStatistics->GetNprocessed()));      
-      AddStatisticsMsg(Form("Number of failed events (I/O): %lld",fStatistics->GetNfailed()));
-      AddStatisticsMsg(Form("Number of accepted events for mask %s: %lld", AliAnalysisStatistics::GetMaskAsString(fStatistics->GetOfflineMask()), fStatistics->GetNaccepted()));
-      out.open(Form("%lld_%lld_%lld_%lld.stat",fStatistics->GetNinput(),
-                    fStatistics->GetNprocessed(),fStatistics->GetNfailed(),
-                    fStatistics->GetNaccepted()), ios::out);      
-      out << fStatisticsMsg << endl;
-   } else {
-      if (!nevents) return;
-      out.open(Form("%09d.stat", nevents), ios::out);
-      if (!fStatisticsMsg.IsNull()) out << fStatisticsMsg << endl;
-   }   
+   AddStatisticsMsg(Form("Number of input events:        %lld",fStatistics->GetNinput()));
+   AddStatisticsMsg(Form("Number of processed events:    %lld",fStatistics->GetNprocessed()));      
+   AddStatisticsMsg(Form("Number of failed events (I/O): %lld",fStatistics->GetNfailed()));
+   AddStatisticsMsg(Form("Number of accepted events for mask %s: %lld", AliAnalysisStatistics::GetMaskAsString(fStatistics->GetOfflineMask()), fStatistics->GetNaccepted()));
+   out.open(Form("%lld_%lld_%lld_%lld.stat",fStatistics->GetNinput(),
+                 fStatistics->GetNprocessed(),fStatistics->GetNfailed(),
+                 fStatistics->GetNaccepted()), ios::out);      
+   out << fStatisticsMsg << endl;
    out.close();
 }
 
@@ -2389,7 +2427,7 @@ const char* AliAnalysisManager::GetOADBPath()
    else if (gSystem->Getenv("ALICE_ROOT"))
       oadbPath.Form("%s/OADB", gSystem->Getenv("ALICE_ROOT"));
    else
-      cout << "ERROR: Cannot figure out AODB path. Define ALICE_ROOT or OADB_PATH!" << endl;
+      ::Fatal("AliAnalysisManager::GetOADBPath", "Cannot figure out AODB path. Define ALICE_ROOT or OADB_PATH!");
       
    return oadbPath;
 }