]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisAlien.cxx
Fix for savannah bug report 87728 (Laurent) + fix invalid read found with valgrind...
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisAlien.cxx
index cbf0ccb499bab12f7a47975bd86e32330cca85af..537ebbff144c23ab306ae0432cbe82e0ca02ce4e 100644 (file)
@@ -556,13 +556,52 @@ Bool_t AliAnalysisAlien::LoadModule(AliAnalysisTaskCfg *mod)
             mod->GetConfigMacro()->GetTitle(), mod->GetName());
       return kFALSE;
    }
+   // Adjust extra libraries
+   Int_t nlibs = mod->GetNlibs();
+   TString lib;
+   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;
 }
 
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::GenerateTrain(const char *name)
+{
+// Generate the full train.
+   fAdditionalLibs = "";
+   if (!LoadModules()) return kFALSE;
+   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+   if (!mgr->InitAnalysis()) return kFALSE;
+   mgr->PrintStatus();
+   Int_t productionMode = fProductionMode;
+   SetProductionMode();
+   TString macro = fAnalysisMacro;
+   TString executable = fExecutable;
+   TString validation = fValidationScript;
+   TString execCommand = fExecutableCommand;
+   SetAnalysisMacro(Form("%s.C", name));
+   SetExecutable(Form("%s.sh", name));
+   SetExecutableCommand("aliroot -b -q ");
+   SetValidationScript(Form("%s_validation.sh", name));
+   StartAnalysis();
+   SetProductionMode(productionMode);
+   fAnalysisMacro = macro;
+   fExecutable = executable;
+   fExecutableCommand = execCommand;
+   fValidationScript = validation;
+   return kTRUE;   
+}   
+
 //______________________________________________________________________________
 Bool_t AliAnalysisAlien::GenerateTest(const char *name, const char *modname)
 {
 // Generate test macros for a single module or for the full train.
+   fAdditionalLibs = "";
    if (strlen(modname)) {
       if (!CheckDependencies()) return kFALSE;
       AliAnalysisTaskCfg *mod = GetModule(modname);
@@ -603,6 +642,7 @@ Bool_t AliAnalysisAlien::GenerateTest(const char *name, const char *modname)
 Bool_t AliAnalysisAlien::LoadModules()
 {
 // Load all modules by executing the AddTask macros. Checks first the dependencies.
+   fAdditionalLibs = "";
    Int_t nmodules = GetNmodules();
    if (!nmodules) {
       Warning("LoadModules", "No module to be loaded");
@@ -620,20 +660,6 @@ Bool_t AliAnalysisAlien::LoadModules()
       mod = (AliAnalysisTaskCfg*)fModules->At(imod);
       if (!LoadModule(mod)) return kFALSE;
    }
-   // All modules are loaded. Adjust the library list.
-   fAdditionalLibs = "";
-   TString lib;
-   for (Int_t imod=0; imod<nmodules; imod++) {
-      mod = (AliAnalysisTaskCfg*)fModules->At(imod);
-      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;
 }      
 
@@ -971,7 +997,7 @@ Bool_t AliAnalysisAlien::CheckInputData()
 }   
 
 //______________________________________________________________________________
-Bool_t AliAnalysisAlien::CopyLocalDataset(const char *griddir, const char *pattern, Int_t nfiles, const char *output, const char *anchorfile)
+Bool_t AliAnalysisAlien::CopyLocalDataset(const char *griddir, const char *pattern, Int_t nfiles, const char *output, const char *anchorfile, const char *outputdir)
 {
 // Copy data from the given grid directory according a pattern and make a local
 // dataset.
@@ -998,8 +1024,8 @@ Bool_t AliAnalysisAlien::CopyLocalDataset(const char *griddir, const char *patte
    TMap *map;
    TString turl, dirname, filename, temp;
    TString cdir = gSystem->WorkingDirectory();
-   gSystem->MakeDirectory("data");
-   gSystem->ChangeDirectory("data");
+   gSystem->MakeDirectory(outputdir);
+   gSystem->ChangeDirectory(outputdir);
    for (Int_t i=0; i<nfound; i++) {
       map = (TMap*)res->At(i);
       turl = map->GetValue("turl")->GetName();
@@ -1009,7 +1035,7 @@ Bool_t AliAnalysisAlien::CopyLocalDataset(const char *griddir, const char *patte
       gSystem->MakeDirectory(dirname);
       if (TFile::Cp(turl, Form("file:./%s/%s", dirname.Data(), filename.Data()))) {
          if (strlen(anchorfile)) filename = Form("%s#%s", filename.Data(), anchorfile);
-         out << cdir << "/data/" << Form("%s/%s", dirname.Data(), filename.Data()) << endl;
+         out << cdir << Form("/%s/%s/%s", outputdir, dirname.Data(), filename.Data()) << endl;
       }
    }
    gSystem->ChangeDirectory(cdir);
@@ -2424,7 +2450,7 @@ Bool_t AliAnalysisAlien::CheckMergedFiles(const char *filename, const char *alie
    }   
    // Copy the file in the output directory
    printf("===> Copying collection %s in the output directory %s\n", Form("Stage_%d.xml",stage), aliendir);
-   TFile::Cp(Form("Stage_%d.xml",stage), Form("alien://%s/Stage_%d.xml",aliendir,stage));
+//   TFile::Cp(Form("Stage_%d.xml",stage), Form("alien://%s/Stage_%d.xml",aliendir,stage));
    if (!copyLocal2Alien("CheckMergedFiles", Form("Stage_%d.xml",stage), 
         Form("%s/Stage_%d.xml",aliendir,stage))) Fatal("","Terminating");
    // Check if this is the last stage to be done.
@@ -2618,7 +2644,7 @@ Bool_t AliAnalysisAlien::MergeOutput(const char *output, const char *basedir, In
          // Loop 'find' results and get next LFN
          if (countZero == nmaxmerge) {
             // First file in chunk - create file merger and add previous chunk if any.
-            fm = new TFileMerger(kFALSE);
+            fm = new TFileMerger(kTRUE);
             fm->SetFastMethod(kTRUE);
             if (previousChunk.Length()) fm->AddFile(previousChunk.Data());
             outputChunk = outputFile;
@@ -2658,7 +2684,7 @@ Bool_t AliAnalysisAlien::MergeOutput(const char *output, const char *basedir, In
    }
    // Merging stage different than 0.
    // Move to the begining of the requested chunk.
-   fm = new TFileMerger(kFALSE);
+   fm = new TFileMerger(kTRUE);
    fm->SetFastMethod(kTRUE);
    while ((nextfile=next())) fm->AddFile(nextfile->GetName());
    delete listoffiles;
@@ -3550,7 +3576,6 @@ void AliAnalysisAlien::WriteAnalysisFile()
       workdir += fGridWorkingDir;
       Info("WriteAnalysisFile", "\n#####   Copying file <%s> containing your initialized analysis manager to your alien workspace", analysisFile.Data());
       if (FileExists(analysisFile)) gGrid->Rm(analysisFile);
-      TFile::Cp(Form("file:%s",analysisFile.Data()), Form("alien://%s/%s", workdir.Data(),analysisFile.Data()));
       if (!copyLocal2Alien("WriteAnalysisFile",analysisFile.Data(), 
           Form("%s/%s", workdir.Data(),analysisFile.Data()))) Fatal("","Terminating");
    }   
@@ -3764,10 +3789,19 @@ void AliAnalysisAlien::WriteAnalysisMacro()
       if (IsLocalTest()) {
          out << "   AliAnalysisAlien *plugin = new AliAnalysisAlien();" << endl;
          out << "   plugin->SetRunMode(\"test\");" << endl;
-         out << "   plugin->SetFileForTestMode(\"data.txt\");" << endl;
+         if (fFileForTestMode.IsNull())
+            out << "   plugin->SetFileForTestMode(\"data.txt\");" << endl;
+         else   
+            out << "   plugin->SetFileForTestMode(\"" << fFileForTestMode << "\");" << endl;
+         out << "   plugin->SetNtestFiles(" << fNtestFiles << ");" << endl;
          out << "   mgr->SetGridHandler(plugin);" << endl;
-         out << "   mgr->SetDebugLevel(10);" << endl;
-         out << "   mgr->SetNSysInfo(100);" << endl;
+         if (AliAnalysisManager::GetAnalysisManager()) {
+            out << "   mgr->SetDebugLevel(" << AliAnalysisManager::GetAnalysisManager()->GetDebugLevel() << ");" << endl;
+            out << "   mgr->SetNSysInfo(" << AliAnalysisManager::GetAnalysisManager()->GetNsysInfo() << ");" << endl;
+         } else {
+            out << "   mgr->SetDebugLevel(10);" << endl;
+            out << "   mgr->SetNSysInfo(100);" << endl;
+         }
       }
       out << "   mgr->PrintStatus();" << endl;
       if (AliAnalysisManager::GetAnalysisManager()) {
@@ -3913,7 +3947,7 @@ void AliAnalysisAlien::WriteMergingMacro()
    }   
    TString mergingMacro = fExecutable;
    mergingMacro.ReplaceAll(".sh","_merge.C");
-   if (!fGridOutputDir.Contains("/")) fGridOutputDir = Form("%s/%s/%s", gGrid->GetHomeDirectory(), fGridWorkingDir.Data(), fGridOutputDir.Data());
+   if (gGrid && !fGridOutputDir.Contains("/")) fGridOutputDir = Form("%s/%s/%s", gGrid->GetHomeDirectory(), fGridWorkingDir.Data(), fGridOutputDir.Data());
    if (!TestBit(AliAnalysisGrid::kSubmit)) {  
       ofstream out;
       out.open(mergingMacro.Data(), ios::out);