]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Added possibility to load AliAnalysisTaskCfg modules in the plugin.
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Aug 2011 09:54:46 +0000 (09:54 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Aug 2011 09:54:46 +0000 (09:54 +0000)
ANALYSIS/AliAnalysisAlien.cxx
ANALYSIS/AliAnalysisAlien.h
ANALYSIS/AliAnalysisTaskCfg.cxx
ANALYSIS/AliAnalysisTaskCfg.h

index 98f54a933d0c715d435bf61351dd56c49e35232f..41666963fde5e681aef063f741c27a84799922cf 100644 (file)
@@ -34,6 +34,7 @@
 #include "TChain.h"
 #include "TObjString.h"
 #include "TObjArray.h"
+#include "TMacro.h"
 #include "TGrid.h"
 #include "TGridResult.h"
 #include "TGridCollection.h"
@@ -42,6 +43,7 @@
 #include "TGridJobStatus.h"
 #include "TFileMerger.h"
 #include "AliAnalysisManager.h"
+#include "AliAnalysisTaskCfg.h"
 #include "AliVEventHandler.h"
 #include "AliAnalysisDataContainer.h"
 #include "AliMultiInputEventHandler.h"
@@ -129,6 +131,7 @@ AliAnalysisAlien::AliAnalysisAlien()
                   fMergeDirName(),
                   fInputFiles(0),
                   fPackages(0),
+                  fModules(0),
                   fProofParam()
 {
 // Dummy ctor.
@@ -200,6 +203,7 @@ AliAnalysisAlien::AliAnalysisAlien(const char *name)
                   fMergeDirName(),
                   fInputFiles(0),
                   fPackages(0),
+                  fModules(0),
                   fProofParam()
 {
 // Default ctor.
@@ -271,6 +275,7 @@ AliAnalysisAlien::AliAnalysisAlien(const AliAnalysisAlien& other)
                   fMergeDirName(other.fMergeDirName),
                   fInputFiles(0),
                   fPackages(0),
+                  fModules(0),
                   fProofParam()
 {
 // Copy ctor.
@@ -292,16 +297,27 @@ AliAnalysisAlien::AliAnalysisAlien(const AliAnalysisAlien& other)
       while ((obj=next())) fPackages->Add(new TObjString(obj->GetName()));
       fPackages->SetOwner();
    }   
+   if (other.fModules) {
+      fModules = new TObjArray();
+      fModules->SetOwner();
+      TIter next(other.fModules);
+      AliAnalysisTaskCfg *mod, *crt;
+      while ((crt=(AliAnalysisTaskCfg*)next())) {
+         mod = new AliAnalysisTaskCfg(*crt);
+         fModules->Add(mod);
+      }
+   }   
 }
 
 //______________________________________________________________________________
 AliAnalysisAlien::~AliAnalysisAlien()
 {
 // Destructor.
-   if (fGridJDL) delete fGridJDL;
-   if (fMergingJDL) delete fMergingJDL;
-   if (fInputFiles) delete fInputFiles;
-   if (fPackages) delete fPackages;
+   delete fGridJDL;
+   delete fMergingJDL;
+   delete fInputFiles;
+   delete fPackages;
+   delete fModules;
    fProofParam.DeleteAll();
 }   
 
@@ -385,10 +401,185 @@ AliAnalysisAlien &AliAnalysisAlien::operator=(const AliAnalysisAlien& other)
          while ((obj=next())) fPackages->Add(new TObjString(obj->GetName()));
          fPackages->SetOwner();
       }   
+      if (other.fModules) {
+         fModules = new TObjArray();
+         fModules->SetOwner();
+         TIter next(other.fModules);
+         AliAnalysisTaskCfg *mod, *crt;
+         while ((crt=(AliAnalysisTaskCfg*)next())) {
+            mod = new AliAnalysisTaskCfg(*crt);
+            fModules->Add(mod);
+         }
+      }   
    }
    return *this;
 }
 
+//______________________________________________________________________________
+void AliAnalysisAlien::AddModule(AliAnalysisTaskCfg *module)
+{
+// Adding a module. Checks if already existing. Becomes owned by this.
+   if (!module) return;
+   if (GetModule(module->GetName())) {
+      Error("AddModule", "A module having the same name %s already added", module->GetName());
+      return;
+   }
+   if (!fModules) {
+      fModules = new TObjArray();
+      fModules->SetOwner();
+   }
+   fModules->Add(module);
+}
+
+//______________________________________________________________________________
+void AliAnalysisAlien::AddModules(TObjArray *list)
+{
+// Adding a list of modules. Checks if already existing. Becomes owned by this.
+   TIter next(list);
+   AliAnalysisTaskCfg *module;
+   while ((module = (AliAnalysisTaskCfg*)next())) AddModule(module);
+}   
+
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::CheckDependencies()
+{
+// Check if all dependencies are satisfied. Reorder modules if needed.
+   Int_t nmodules = GetNmodules();
+   if (!nmodules) {
+      Warning("CheckDependencies", "No modules added yet to check their dependencies");
+      return kTRUE;
+   }   
+   AliAnalysisTaskCfg *mod = 0;
+   AliAnalysisTaskCfg *dep = 0;
+   TString depname;
+   Int_t i, j, k;
+   for (i=0; i<nmodules; i++) {
+      mod = (AliAnalysisTaskCfg*) fModules->At(i);
+      Int_t ndeps = mod->GetNdeps();
+      Int_t istart = i;
+      for (j=0; j<ndeps; j++) {
+         depname = mod->GetDependency(j);
+         dep = GetModule(depname);
+         if (!dep) {
+            Error("CheckDependencies","Dependency %s not added for module %s",
+                   depname.Data(), mod->GetName());
+            return kFALSE;
+         }
+         if (dep->NeedsDependency(mod->GetName())) {
+            Error("CheckDependencies","Modules %s and %s circularly depend on each other",
+                   mod->GetName(), dep->GetName());
+            return kFALSE;
+         }                  
+         Int_t idep = fModules->IndexOf(dep);
+         // The dependency task must come first
+         if (idep>i) {
+            // Remove at idep and move all objects below up one slot
+            // down to index i included.
+            fModules->RemoveAt(idep);
+            for (k=idep-1; k>=i; k++) fModules->AddAt(fModules->RemoveAt(k),k+1);
+            fModules->AddAt(dep, i++);
+         }
+         //Redo from istart if dependencies were inserted
+         if (i>istart) i=istart-1;
+      }
+   }
+   return kTRUE;
+}      
+
+//______________________________________________________________________________
+Int_t AliAnalysisAlien::GetNmodules() const
+{
+// Get number of modules.
+   if (!fModules) return 0;
+   return fModules->GetEntries();
+}
+
+//______________________________________________________________________________
+AliAnalysisTaskCfg *AliAnalysisAlien::GetModule(const char *name)
+{
+// Get a module by name.
+   if (!fModules) return 0;
+   return (AliAnalysisTaskCfg*)fModules->FindObject(name);
+}
+   
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::LoadModule(AliAnalysisTaskCfg *mod)
+{
+// Load a given module.
+   if (mod->IsLoaded()) return kTRUE;
+   Int_t ndeps = mod->GetNdeps();
+   TString depname;
+   for (Int_t j=0; j<ndeps; j++) {
+      depname = mod->GetDependency(j);
+      AliAnalysisTaskCfg *dep = GetModule(depname);
+      if (!dep) {
+         Error("LoadModule","Dependency %s not existing for module %s",
+                depname.Data(), mod->GetName());
+         return kFALSE;
+      }
+      if (!LoadModule(dep)) {
+         Error("LoadModule","Dependency %s for module %s could not be loaded",
+                depname.Data(), mod->GetName());
+         return kFALSE;
+      }
+   }
+   // Load libraries for the module
+   if (!mod->CheckLoadLibraries()) {
+      Error("LoadModule", "Cannot load all libraries for module %s", mod->GetName());
+      return kFALSE;
+   }
+   // Execute the macro
+   if (mod->ExecuteMacro()<0) {
+      Error("LoadModule", "Executing the macro %s with arguments: %s for module %s returned a negative value",
+             mod->GetMacroName(), mod->GetMacroArgs(), mod->GetName());
+      return kFALSE;
+   }
+   // Configure dependencies
+   if (mod->GetConfigMacro() && mod->ExecuteConfigMacro()<0) {
+      Error("LoadModule", "There was an error executing the deps config macro %s for module %s",
+            mod->GetConfigMacro()->GetTitle(), mod->GetName());
+      return kFALSE;
+   }
+   return kTRUE;
+}
+
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::GenerateTest(const char *modname)
+{
+// Generate test macros for a single module or for the full train.
+   if (strlen(modname)) {
+      return kTRUE;
+   }
+   return kTRUE;   
+}
+
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::LoadModules()
+{
+// Load all modules by executing the AddTask macros. Checks first the dependencies.
+   if (!CheckDependencies()) return kFALSE;
+   TIter next(fModules);
+   AliAnalysisTaskCfg *mod;
+   while ((mod=(AliAnalysisTaskCfg*)next())) {
+      if (!LoadModule(mod)) return kFALSE;
+   }
+   // All modules are loaded. Adjust the library list.
+   next.Reset();
+   fAdditionalLibs = "";
+   TString lib;
+   while ((mod=(AliAnalysisTaskCfg*)next())) {
+      Int_t nlibs = mod->GetNlibs();
+      for (Int_t i=0; i<nlibs; i++) {
+         lib = mod->GetLibrary(i);
+         if (fAdditionalLibs.Contains(lib)) continue;
+         lib = Form("lib%s.so", lib.Data());
+         if (!fAdditionalLibs.IsNull()) fAdditionalLibs += " ";
+         fAdditionalLibs += lib;
+      }
+   }      
+   return kTRUE;
+}      
+
 //______________________________________________________________________________
 void AliAnalysisAlien::SetRunPrefix(const char *prefix)
 {
index 4f4c2dafa0c233b965348d1ff5b4ed042e8bb706..99b4d89eea486ca3b126d26bba926989d59bc81e 100644 (file)
@@ -27,6 +27,7 @@
 #endif
 
 class AliAnalysisManager;
+class AliAnalysisTaskCfg;
 class TGridJDL;
 
 class AliAnalysisAlien : public AliAnalysisGrid {
@@ -97,6 +98,12 @@ public:
    TGridJDL           *GetMergingJDL() const {return fMergingJDL;}
    const char         *GetGridOutputDir() const                          {return fGridOutputDir;}
 //Utilities
+   void                AddModule(AliAnalysisTaskCfg *module);
+   void                AddModules(TObjArray *list);
+   Int_t               GetNmodules() const;
+   AliAnalysisTaskCfg *GetModule(const char *name);
+   Bool_t              LoadModules();
+   Bool_t              GenerateTest(const char *modname="");
    Bool_t              CheckFileCopy(const char *alienpath);
    virtual Bool_t      CreateDataset(const char *pattern);
    virtual Bool_t      CreateJDL();
@@ -150,6 +157,8 @@ protected:
    Bool_t              IsCollection(const char *lfn) const;
    virtual Bool_t      IsSingleOutput() const;
    Bool_t              IsUsingTags() const {return TObject::TestBit(AliAnalysisGrid::kUseTags);}
+   Bool_t              LoadModule(AliAnalysisTaskCfg *mod);
+   Bool_t              CheckDependencies();
 
 private:
    TGridJDL        *fGridJDL;         //! JDL maker
@@ -215,8 +224,9 @@ private:
    TString          fMergeDirName;    // Name of the directory that should be added to the output directory
    TObjArray       *fInputFiles;      // List of input files to be processed by the job
    TObjArray       *fPackages;        // List of packages to be used
+   TObjArray       *fModules;         // List of AliAnalysisTaskCfg modules
    TMap             fProofParam;      // Key-value pairs for proof mode
    
-   ClassDef(AliAnalysisAlien, 18)   // Class providing some AliEn utilities
+   ClassDef(AliAnalysisAlien, 19)   // Class providing some AliEn utilities
 };
 #endif
index 76100b17dd0c432bf440edb342f9bafd7acc485d..a3455708ab0a678418ff8f4bd076d26734d6be87 100644 (file)
@@ -178,7 +178,8 @@ Long64_t AliAnalysisTaskCfg::ExecuteMacro(const char *newargs)
 {
 // Execute AddTask macro. Opens first the macro pointed by fMacroName if not yet
 // done. Checks if the requested libraries are loaded, else loads them. Executes 
-// with stored fMacroArgs unless new arguments are provided.
+// with stored fMacroArgs unless new arguments are provided. The flag IsLoaded
+// is set once the macro was successfully executed.
    if (!fMacro && !OpenMacro()) {
       Error("ExecuteMacro", "Cannot execute this macro");
       return -1;
@@ -190,7 +191,9 @@ Long64_t AliAnalysisTaskCfg::ExecuteMacro(const char *newargs)
    
    TString args = newargs;
    if (args.IsNull()) args = fMacroArgs;
-   return fMacro->Exec(args);
+   Long64_t retval = fMacro->Exec(args);
+   if (retval >=0) SetBit(AliAnalysisTaskCfg::kLoaded, kTRUE);
+   return retval;
 }
 
 //______________________________________________________________________________
index 137139a71f6ea29eaaa8067c1df7ad6ed872b16b..6889b5c1f5e33345a9dab10e1c99db02ed69f8f5 100644 (file)
@@ -19,6 +19,10 @@ class TMacro;
 class TObjArray;
 
 class AliAnalysisTaskCfg : public TNamed {
+public:
+enum ETaskCfgFlags {
+  kLoaded      = BIT(14)
+}; 
 protected:
   TString                   fMacroName;     // Full path to AddTask macro
   TString                   fMacroArgs;     // Arguments to run the macro
@@ -75,6 +79,7 @@ public:
   // Extra utilities  
   Bool_t                    CheckLoadLibraries() const;
   static const char        *DecodeValue(TString &line);
+  Bool_t                    IsLoaded() const {return TestBit(kLoaded);}
   void                      Print(Option_t *option="") const;
   void                      SaveAs(const char *filename, Option_t *option = "") const;
   static TObjArray         *ExtractModulesFrom(const char *filename);