Added method AliAnalysisManager::AddStatisticsMsg() to add user messages regarding...
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Nov 2010 15:55:04 +0000 (15:55 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 5 Nov 2010 15:55:04 +0000 (15:55 +0000)
The analysis manager dumps all messages in a file called <nevents>.stat (nevents in format %09d) that is written after processing on the slave but also during Terminate (client)
Nevents is the total number of events processed by the manager.

ANALYSIS/AliAnalysisAlien.cxx
ANALYSIS/AliAnalysisManager.cxx
ANALYSIS/AliAnalysisManager.h
ANALYSIS/AliPhysicsSelection.cxx
ANALYSIS/AliPhysicsSelectionTask.cxx
ANALYSIS/AliPhysicsSelectionTask.h

index 6887ef0..7534776 100644 (file)
@@ -1094,7 +1094,7 @@ Bool_t AliAnalysisAlien::CreateJDL()
                delete arr;
             }
             files.ReplaceAll(".root", "*.root");
-            outputArchive += Form("root_archive.zip:%s@disk=%d",files.Data(),fNreplicas);
+            outputArchive += Form("root_archive.zip:%s,*.stat@disk=%d",files.Data(),fNreplicas);
          } else {
             TString files = fOutputArchive;
             files.ReplaceAll(".root", "*.root"); // nreplicas etc should be already atttached by use
index c4ad654..3ebb33e 100644 (file)
@@ -84,7 +84,9 @@ AliAnalysisManager::AliAnalysisManager(const char *name, const char *title)
                     fExtraFiles(""),
                     fAutoBranchHandling(kTRUE), 
                     fTable(),
-                    fRunFromPath(0)
+                    fRunFromPath(0),
+                    fNcalls(0),
+                    fStatisticsMsg()
 {
 // Default constructor.
    fgAnalysisManager = this;
@@ -129,7 +131,9 @@ AliAnalysisManager::AliAnalysisManager(const AliAnalysisManager& other)
                     fExtraFiles(),
                     fAutoBranchHandling(other.fAutoBranchHandling), 
                     fTable(),
-                    fRunFromPath(0)
+                    fRunFromPath(0),
+                    fNcalls(other.fNcalls),
+                    fStatisticsMsg(other.fStatisticsMsg)
 {
 // Copy constructor.
    fTasks      = new TObjArray(*other.fTasks);
@@ -178,6 +182,8 @@ AliAnalysisManager& AliAnalysisManager::operator=(const AliAnalysisManager& othe
       fAutoBranchHandling = other.fAutoBranchHandling;
       fTable.Clear("nodelete");
       fRunFromPath = other.fRunFromPath;
+      fNcalls     = other. fNcalls;
+      fStatisticsMsg = other.fStatisticsMsg;
    }
    return *this;
 }
@@ -509,7 +515,9 @@ void AliAnalysisManager::PackOutput(TList *target)
          gROOT->cd();
          if (fDebug > 1) printf("<-FinishTaskOutput: task %s\n", task->GetName());
       }
-   }      
+   }
+   // Write statistics message on the workers.
+   WriteStatisticsMsg(fNcalls);
    
    if (fMode == kProofAnalysis) {
       TIter next(fOutputs);
@@ -956,7 +964,8 @@ void AliAnalysisManager::Terminate()
       if (opwd) opwd->cd();
    }   
    delete allOutputs;
-
+   //Write statistics information on the client
+   WriteStatisticsMsg(fNcalls);
    if (getsysInfo) {
       TDirectory *crtdir = gDirectory;
       TFile f("syswatch.root", "RECREATE");
@@ -1835,34 +1844,33 @@ TFile *AliAnalysisManager::OpenProofFile(AliAnalysisDataContainer *cont, const c
 void AliAnalysisManager::ExecAnalysis(Option_t *option)
 {
 // Execute analysis.
-   static Long64_t ncalls = 0;
    static Long64_t nentries = 0;
    static TTree *lastTree = 0;
    static TStopwatch *timer = new TStopwatch();
-   if (fDebug > 0) printf("MGR: Processing event #%lld\n", ncalls);
+   if (fDebug > 0) printf("MGR: Processing event #%d\n", fNcalls);
    else {
       if (fTree && (fTree != lastTree)) {
          nentries += fTree->GetEntries();
          lastTree = fTree;
       }   
-      if (!ncalls) timer->Start();
-      if (!fIsRemote && TObject::TestBit(kUseProgressBar)) ProgressBar("Processing event", ncalls, nentries, timer, kFALSE);
+      if (!fNcalls) timer->Start();
+      if (!fIsRemote && TObject::TestBit(kUseProgressBar)) ProgressBar("Processing event", fNcalls, nentries, timer, kFALSE);
    }
    gROOT->cd();
    TDirectory *cdir = gDirectory;
    Bool_t getsysInfo = ((fNSysInfo>0) && (fMode==kLocalAnalysis))?kTRUE:kFALSE;
-   if (getsysInfo && ((ncalls%fNSysInfo)==0)) AliSysInfo::AddStamp("Exec_start", (Int_t)ncalls);
-   ncalls++;
+   if (getsysInfo && ((fNcalls%fNSysInfo)==0)) AliSysInfo::AddStamp("Exec_start", (Int_t)fNcalls);
    if (!fInitOK) {
       Error("ExecAnalysis", "Analysis manager was not initialized !");
       cdir->cd();
       return;
    }
+   fNcalls++;
    AliAnalysisTask *task;
    // Check if the top tree is active.
    if (fTree) {
-      if (getsysInfo && ((ncalls%fNSysInfo)==0)) 
-         AliSysInfo::AddStamp("Handlers_BeginEventGroup",(Int_t)ncalls, 1002, 0);
+      if (getsysInfo && ((fNcalls%fNSysInfo)==0)) 
+         AliSysInfo::AddStamp("Handlers_BeginEventGroup",fNcalls, 1002, 0);
       TIter next(fTasks);
    // De-activate all tasks
       while ((task=(AliAnalysisTask*)next())) task->SetActive(kFALSE);
@@ -1881,8 +1889,8 @@ void AliAnalysisManager::ExecAnalysis(Option_t *option)
       if (fOutputEventHandler)  fOutputEventHandler ->BeginEvent(entry);
       if (fMCtruthEventHandler) fMCtruthEventHandler->BeginEvent(entry);
       gROOT->cd();
-      if (getsysInfo && ((ncalls%fNSysInfo)==0)) 
-         AliSysInfo::AddStamp("Handlers_BeginEvent",(Int_t)ncalls, 1000, 0);
+      if (getsysInfo && ((fNcalls%fNSysInfo)==0)) 
+         AliSysInfo::AddStamp("Handlers_BeginEvent",fNcalls, 1000, 0);
 //
 //    Execute the tasks
 //      TIter next1(cont->GetConsumers());
@@ -1894,8 +1902,8 @@ void AliAnalysisManager::ExecAnalysis(Option_t *option)
          }      
          task->ExecuteTask(option);
          gROOT->cd();
-         if (getsysInfo && ((ncalls%fNSysInfo)==0)) 
-            AliSysInfo::AddStamp(task->ClassName(),(Int_t)ncalls, itask, 1);
+         if (getsysInfo && ((fNcalls%fNSysInfo)==0)) 
+            AliSysInfo::AddStamp(task->ClassName(), fNcalls, itask, 1);
          itask++;   
       }
 //
@@ -1904,8 +1912,8 @@ void AliAnalysisManager::ExecAnalysis(Option_t *option)
       if (fOutputEventHandler)  fOutputEventHandler ->FinishEvent();
       if (fMCtruthEventHandler) fMCtruthEventHandler->FinishEvent();
       // Gather system information if requested
-      if (getsysInfo && ((ncalls%fNSysInfo)==0)) 
-         AliSysInfo::AddStamp("Handlers_FinishEvent",(Int_t)ncalls, 1001, 1);
+      if (getsysInfo && ((fNcalls%fNSysInfo)==0)) 
+         AliSysInfo::AddStamp("Handlers_FinishEvent",fNcalls, 1001, 1);
       cdir->cd();   
       return;
    }   
@@ -1916,8 +1924,8 @@ void AliAnalysisManager::ExecAnalysis(Option_t *option)
    if (fOutputEventHandler)  fOutputEventHandler ->BeginEvent(-1);
    if (fMCtruthEventHandler) fMCtruthEventHandler->BeginEvent(-1);
    gROOT->cd();
-   if (getsysInfo && ((ncalls%fNSysInfo)==0)) 
-      AliSysInfo::AddStamp("Handlers_BeginEvent",(Int_t)ncalls, 1000, 0);
+   if (getsysInfo && ((fNcalls%fNSysInfo)==0)) 
+      AliSysInfo::AddStamp("Handlers_BeginEvent",fNcalls, 1000, 0);
    TIter next2(fTopTasks);
    while ((task=(AliAnalysisTask*)next2())) {
       task->SetActive(kTRUE);
@@ -1932,8 +1940,8 @@ void AliAnalysisManager::ExecAnalysis(Option_t *option)
    if (fInputEventHandler)   fInputEventHandler  ->FinishEvent();
    if (fOutputEventHandler)  fOutputEventHandler ->FinishEvent();
    if (fMCtruthEventHandler) fMCtruthEventHandler->FinishEvent();
-   if (getsysInfo && ((ncalls%fNSysInfo)==0)) 
-      AliSysInfo::AddStamp("Handlers_FinishEvent",(Int_t)ncalls, 1000, 1);
+   if (getsysInfo && ((fNcalls%fNSysInfo)==0)) 
+      AliSysInfo::AddStamp("Handlers_FinishEvent",fNcalls, 1000, 1);
    cdir->cd();   
 }
 
@@ -2169,3 +2177,25 @@ void AliAnalysisManager::DoLoadBranch(const char *name)
     return;
   br->GetEntry(GetCurrentEntry());
 }
+
+//______________________________________________________________________________
+void AliAnalysisManager::AddStatisticsMsg(const char *line)
+{
+// Add a line in the statistics message. If available, the statistics message is written
+// at the end of the SlaveTerminate phase on workers AND at the end of Terminate
+// on the client.
+   if (!strlen(line)) return;
+   if (!fStatisticsMsg.IsNull()) fStatisticsMsg += "\n";
+   fStatisticsMsg += line;
+}
+
+//______________________________________________________________________________
+void AliAnalysisManager::WriteStatisticsMsg(Int_t nevents)
+{
+// Write the statistics message in a file named <nevents.stat>
+   if (!nevents) return;
+   ofstream out;
+   out.open(Form("%09d.stat", nevents), ios::out);
+   if (!fStatisticsMsg.IsNull()) out << fStatisticsMsg << endl;
+   out.close();
+}
index 3824ff5..468c90e 100644 (file)
@@ -167,6 +167,10 @@ enum EAliAnalysisFlags {
    void                 ProfileTask(const char *name, const char *option="VM") const;
    void                 ProfileTask(Int_t itop, const char *option="VM") const;
    static void          ProgressBar(const char *opname, Long64_t current, Long64_t size, TStopwatch * const watch=0, Bool_t last=kFALSE, Bool_t refresh=kFALSE);
+   void                 AddStatisticsMsg(const char *line);
+   const char          *GetStatisticsMsg() const {return fStatisticsMsg.Data();}
+   void                 WriteStatisticsMsg(Int_t nevents);
+   Int_t                GetNcalls() const {return fNcalls;}
    Bool_t               ValidateOutputFiles() const;
 
 protected:
@@ -202,9 +206,10 @@ private:
    Bool_t                  fAutoBranchHandling;  // def=kTRUE, turn off if you use LoadBranch
    THashTable              fTable;               // keep branch ptrs in case of manual branch loading
    Int_t                   fRunFromPath;         // Run number retrieved from path to input data
-
+   Int_t                   fNcalls;              // Total number of calls (events) of ExecAnalysis
+   TString                 fStatisticsMsg;       // Statistics user message
    static TString          fgCommonFileName;     //! Common output file name (not streamed)
    static AliAnalysisManager *fgAnalysisManager; //! static pointer to object instance
-   ClassDef(AliAnalysisManager,9)  // Analysis manager class
+   ClassDef(AliAnalysisManager,10)  // Analysis manager class
 };   
 #endif
index 4cdc311..a416f7b 100644 (file)
@@ -927,11 +927,12 @@ TH2F * AliPhysicsSelection::BookHistStatistics(const char * tag) {
   return h;
 }
 
-void AliPhysicsSelection::Print(Option_t* /* option */) const
+void AliPhysicsSelection::Print(Option_t *option) const
 {
   // print the configuration
-  
+  TString msg;
   Printf("Configuration initialized for run %d (MC: %d):", fCurrentRun, fMC);
+  msg += Form("Configuration initialized for run %d (MC: %d):\n", fCurrentRun, fMC);
   
   Printf("Collision trigger classes:");
   for (Int_t i=0; i < fCollTrigClasses.GetEntries(); i++)
@@ -958,15 +959,19 @@ void AliPhysicsSelection::Print(Option_t* /* option */) const
     for (Int_t i=0; i<fCollTrigClasses.GetEntries(); i++)
     {
       Printf("\nSelection statistics for collision trigger %s:", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
+      msg += Form("\nSelection statistics for collision trigger %s:\n", ((TObjString*) fCollTrigClasses.At(i))->String().Data());
       
       Printf("Total events with correct trigger class: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1));
+      msg += Form("Total events with correct trigger class: %d\n", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(1, i+1));
       Printf("Selected collision candidates: %d", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1));
+      msg += Form("Selected collision candidates: %d\n", (Int_t) fHistStatistics[kStatIdxAll]->GetBinContent(fHistStatistics[kStatIdxAll]->GetXaxis()->FindBin("Accepted"), i+1));
     }
   }
   
   if (fHistBunchCrossing)
   {
     Printf("\nBunch crossing statistics:");
+    msg += "\nBunch crossing statistics:\n";
     
     for (Int_t i=1; i<=fHistBunchCrossing->GetNbinsY(); i++)
     {
@@ -976,8 +981,10 @@ void AliPhysicsSelection::Print(Option_t* /* option */) const
       for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
         if (fHistBunchCrossing->GetBinContent(j, i) > 0)
           str += Form("%d, ", (Int_t) fHistBunchCrossing->GetXaxis()->GetBinCenter(j));
-       
+             
       Printf("%s", str.Data());
+      msg += str;
+      msg += "\n";
     }
     
     for (Int_t j=1; j<=fHistBunchCrossing->GetNbinsX(); j++)
@@ -1007,7 +1014,12 @@ void AliPhysicsSelection::Print(Option_t* /* option */) const
     Printf("WARNING: Ignoring V0 information in selection");
   if(!fBin0CallBack) 
     Printf("WARNING: Callback not set: will not fill the statistics for the bin 0");
-
+  TString opt(option);
+  opt.ToUpper();
+  if (opt == "STAT") {
+     AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+     if (mgr) mgr->AddStatisticsMsg(msg);
+  }
 }
 
 Long64_t AliPhysicsSelection::Merge(TCollection* list)
index 64e287c..21ff1c1 100644 (file)
@@ -92,6 +92,14 @@ void AliPhysicsSelectionTask::UserExec(Option_t*)
   PostData(1, fOutput);
 }
 
+void AliPhysicsSelectionTask::FinishTaskOutput()
+{
+// This gets called at the end of the processing on the worker. It allows dumping
+// statistics printed by the physics selection object to the statistics message
+// handled by the analysis manager.
+   if (fPhysicsSelection) fPhysicsSelection->Print("STAT");
+}
+
 void AliPhysicsSelectionTask::Terminate(Option_t *)
 {
   // The Terminate() function is the last function to be called during
index e611f6b..0860f5b 100644 (file)
@@ -20,6 +20,7 @@ class AliPhysicsSelectionTask : public AliAnalysisTaskSE {
 
     virtual void   UserCreateOutputObjects();
     virtual void   UserExec(Option_t*);
+    virtual void   FinishTaskOutput();
     virtual void   Terminate(Option_t*);
 
     void SetOption(const char* opt) { fOption = opt; }