Protected cases when the user forgot to load the library. Error poster if user forget...
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 16 Feb 2011 16:10:13 +0000 (16:10 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 16 Feb 2011 16:10:13 +0000 (16:10 +0000)
ANALYSIS/AliAnalysisManager.cxx
ANALYSIS/AliAnalysisManager.h
ANALYSIS/AliAnalysisSelector.cxx
ANALYSIS/AliAnalysisTask.cxx
ANALYSIS/AliAnalysisTask.h
ANALYSIS/AliAnalysisTaskSE.cxx
ANALYSIS/AliAnalysisTaskSE.h
ANALYSIS/macros/AnalysisTrainNewFilterAOD.C

index 5cd9de3..71e5049 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++;
    }
@@ -1429,6 +1435,25 @@ void AliAnalysisManager::CheckBranches(Bool_t load)
 }
 
 //______________________________________________________________________________
+Bool_t AliAnalysisManager::CheckTasks() const
+{
+// Check consistency of tasks.
+   // 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
 {
 // Print task hierarchy.
@@ -1495,6 +1520,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;
@@ -1591,6 +1617,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++;
index 7190b6a..c614d69 100644 (file)
@@ -165,6 +165,7 @@ enum EAliAnalysisFlags {
    void                 AddBranches(const char *branches);
    void                 AddStatisticsTask(UInt_t offlineMask=0);
    void                 CheckBranches(Bool_t load=kFALSE);
+   Bool_t               CheckTasks() const;
    void                 CountEvent(Int_t ninput, Int_t nprocessed, Int_t nfailed, Int_t naccepted);
    Bool_t               InitAnalysis();
    Bool_t               IsInitialized() const {return fInitOK;}
index 2738386..5896e7f 100644 (file)
@@ -136,6 +136,8 @@ Bool_t AliAnalysisSelector::Notify()
 Bool_t AliAnalysisSelector::Process(Long64_t entry)
 {
 // Event loop.
+   static Int_t count = 0;
+   count++;
    if (fAnalysis->GetDebugLevel() > 1) {
       cout << "->AliAnalysisSelector::Process()" << endl;
    }
index 17fb82b..1edcadc 100644 (file)
@@ -255,6 +255,19 @@ void AliAnalysisTask::CheckNotify(Bool_t init)
 }
 
 //______________________________________________________________________________
+Bool_t AliAnalysisTask::CheckPostData() const
+{
+// Checks if data was posted to all outputs defined by the task. If task does
+// not have output slots this returns always kTRUE.
+   AliAnalysisDataContainer *coutput;
+   for (Int_t islot=0; islot<fNoutputs; islot++) {
+      coutput = GetOutputSlot(islot)->GetContainer();
+      if (!coutput->GetData()) return kFALSE;
+   }
+   return kTRUE;
+}
+
+//______________________________________________________________________________
 Bool_t AliAnalysisTask::ConnectInput(Int_t islot, AliAnalysisDataContainer *cont)
 {
 // Connect an input slot to a data container.
index 7b8cc92..a02a493 100644 (file)
@@ -105,6 +105,7 @@ public:
   void                      CheckNotify(Bool_t init=kFALSE);
   // Check if there are illegal circular dependencies
   Bool_t                    CheckCircularDeps();
+  virtual Bool_t            CheckPostData() const;
   // Getters
   void                      GetBranches(const char *type, TString &result) const;
   Int_t                     GetNinputs() const  {return fNinputs;}
index abbe975..8734232 100644 (file)
@@ -26,6 +26,7 @@
 #include "AliAnalysisManager.h"
 #include "AliAnalysisCuts.h"
 #include "AliAnalysisDataSlot.h"
+#include "AliAnalysisDataContainer.h"
 
 #include "AliESDEvent.h"
 #include "AliESDfriend.h"
@@ -156,6 +157,18 @@ AliAnalysisTaskSE& AliAnalysisTaskSE::operator=(const AliAnalysisTaskSE& other)
     return *this;
 }
 
+//______________________________________________________________________________
+Bool_t AliAnalysisTaskSE::CheckPostData() const
+{
+// Checks if data was posted to all outputs defined by the task. If task does
+// not have output slots this returns always kTRUE.
+   AliAnalysisDataContainer *coutput;
+   for (Int_t islot=1; islot<fNoutputs; islot++) {
+      coutput = GetOutputSlot(islot)->GetContainer();
+      if (!coutput->GetData()) return kFALSE;
+   }
+   return kTRUE;
+}
 
 void AliAnalysisTaskSE::ConnectInputData(Option_t* /*option*/)
 {
index 89b7434..fd335ee 100644 (file)
@@ -34,6 +34,7 @@ class AliAnalysisTaskSE : public AliAnalysisTask
     AliAnalysisTaskSE& operator=(const AliAnalysisTaskSE& other);
     virtual ~AliAnalysisTaskSE() {;}
     // Implementation of interface methods
+    virtual Bool_t CheckPostData() const;
     virtual void   ConnectInputData(Option_t *option = "");
     virtual void   CreateOutputObjects();
     virtual void   Exec(Option_t* option);
index c670a09..d362115 100644 (file)
@@ -40,7 +40,7 @@ TString     proof_outdir       = "";
 Int_t       runOnData          = 1;       // Set to 1 if processing real data
 Int_t       iCollision         = 1;       // 0=pp, 1=Pb-Pb
 Bool_t      usePLUGIN          = kTRUE;   // do not change
-Bool_t      useProductionMode  = kFALSE;   // use the plugin in production mode
+Bool_t      useProductionMode  = kTRUE;   // use the plugin in production mode
 // Usage of par files ONLY in grid mode and ONLY if the code is not available
 // in the deployed AliRoot versions. Par file search path: local dir, if not there $ALICE_ROOT.
 // To refresh par files, remove the ones in the workdir, then do "make <target.par>" in 
@@ -1278,7 +1278,7 @@ AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode)
          if (run_numbers[i]==0) break;
          plugin->AddRunNumber(run_numbers[i]);
       }   
-   }   
+   }
 // Define alien work directory where all files will be copied. Relative to alien $HOME.
    plugin->SetGridWorkingDir(grid_workdir);
 // Declare alien output directory. Relative to working directory.