]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliAnalysisAlien.cxx
Corrected ctor call.
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisAlien.cxx
index 4fa300eb109a8babea28ece0fdb54118cd2d4516..8c2eed0011487de6b762855659dc0d299a529a8e 100644 (file)
@@ -56,6 +56,7 @@ AliAnalysisAlien::AliAnalysisAlien()
                   fProductionMode(0),
                   fRunNumbers(),
                   fExecutable(),
+                  fExecutableCommand(),
                   fArguments(),
                   fAnalysisMacro(),
                   fAnalysisSource(),
@@ -102,6 +103,7 @@ AliAnalysisAlien::AliAnalysisAlien(const char *name)
                   fProductionMode(0),
                   fRunNumbers(),
                   fExecutable(),
+                  fExecutableCommand(),
                   fArguments(),
                   fAnalysisMacro(),
                   fAnalysisSource(),
@@ -148,6 +150,7 @@ AliAnalysisAlien::AliAnalysisAlien(const AliAnalysisAlien& other)
                   fProductionMode(other.fProductionMode),
                   fRunNumbers(other.fRunNumbers),
                   fExecutable(other.fExecutable),
+                  fExecutableCommand(other.fExecutableCommand),
                   fArguments(other.fArguments),
                   fAnalysisMacro(other.fAnalysisMacro),
                   fAnalysisSource(other.fAnalysisSource),
@@ -222,6 +225,7 @@ AliAnalysisAlien &AliAnalysisAlien::operator=(const AliAnalysisAlien& other)
       fProductionMode          = other.fProductionMode;
       fRunNumbers              = other.fRunNumbers;
       fExecutable              = other.fExecutable;
+      fExecutableCommand       = other.fExecutableCommand;
       fArguments               = other.fArguments;
       fAnalysisMacro           = other.fAnalysisMacro;
       fAnalysisSource          = other.fAnalysisSource;
@@ -280,6 +284,14 @@ void AliAnalysisAlien::AddRunNumber(Int_t run)
    fRunNumbers += Form("%d", run);
 }   
 
+//______________________________________________________________________________
+void AliAnalysisAlien::AddRunNumber(const char* run)
+{
+// Add a run number to the list of runs to be processed.
+   if (fRunNumbers.Length()) fRunNumbers += " ";
+   fRunNumbers += run;
+}   
+
 //______________________________________________________________________________
 void AliAnalysisAlien::AddDataFile(const char *lfn)
 {
@@ -322,17 +334,20 @@ void AliAnalysisAlien::CdWork()
    } 
    TString homedir = gGrid->GetHomeDirectory();
    TString workdir = homedir + fGridWorkingDir;
-   if (!gGrid->Cd(workdir)) {
-      gGrid->Cd(homedir);
-      if (gGrid->Mkdir(workdir)) {
-         gGrid->Cd(fGridWorkingDir);
-         Info("CreateJDL", "\n#####   Created alien working directory %s", fGridWorkingDir.Data());
-      } else {
-         Warning("CreateJDL", "Working directory %s cannot be created.\n Using %s instead.",
-                 workdir.Data(), homedir.Data());
-         fGridWorkingDir = "";
-      }          
-   }      
+   if (DirectoryExists(workdir)) {
+      gGrid->Cd(workdir);
+      return;
+   }   
+   // Work directory not existing - create it
+   gGrid->Cd(homedir);
+   if (gGrid->Mkdir(workdir)) {
+      gGrid->Cd(fGridWorkingDir);
+      Info("CreateJDL", "\n#####   Created alien working directory %s", fGridWorkingDir.Data());
+   } else {
+      Warning("CreateJDL", "Working directory %s cannot be created.\n Using %s instead.",
+              workdir.Data(), homedir.Data());
+      fGridWorkingDir = "";
+   }          
 }
 
 //______________________________________________________________________________
@@ -396,7 +411,7 @@ Bool_t AliAnalysisAlien::CheckInputData()
       Error("CkeckInputData", "AliEn path to base data directory must be set.\n = Use: SetGridDataDir()");
       return kFALSE;
    }
-   if (!gGrid->Cd(fGridDataDir)) {
+   if (!DirectoryExists(fGridDataDir)) {
       Error("CheckInputData", "Data directory %s not existing.", fGridDataDir.Data());
       return kFALSE;
    }
@@ -430,8 +445,8 @@ Bool_t AliAnalysisAlien::CheckInputData()
       TIter next(arr);
       while ((os=(TObjString*)next())) {
          path = Form("%s/%s ", fGridDataDir.Data(), os->GetString().Data());
-         if (!gGrid->Cd(path)) {
-            Warning("CheckInputData", "Run number %s not found in path: %s", os->GetString().Data(), path.Data());
+         if (!DirectoryExists(path)) {
+            Warning("CheckInputData", "Run number %s not found in path: <%s>", os->GetString().Data(), path.Data());
             continue;
          }
          path = Form("%s/%s.xml", workdir.Data(),os->GetString().Data());
@@ -458,8 +473,8 @@ Bool_t AliAnalysisAlien::CheckInputData()
       Info("CheckDataType", "Using run range [%d, %d]", fRunRange[0], fRunRange[1]);
       for (Int_t irun=fRunRange[0]; irun<=fRunRange[1]; irun++) {
          path = Form("%s/%d ", fGridDataDir.Data(), irun);
-         if (!gGrid->Cd(path)) {
-            Warning("CheckInputData", "Run number %d not found in path: %s", irun, path.Data());
+         if (!DirectoryExists(path)) {
+//            Warning("CheckInputData", "Run number %d not found in path: <%s>", irun, path.Data());
             continue;
          }
          path = Form("%s/%d.xml", workdir.Data(),irun);
@@ -515,14 +530,14 @@ Bool_t AliAnalysisAlien::CreateDataset(const char *pattern)
       if (fInputFiles && fInputFiles->GetEntries()) return kTRUE;
       // Make a single data collection from data directory.
       path = fGridDataDir;
-      if (!gGrid->Cd(path)) {
+      if (!DirectoryExists(path)) {
          Error("CreateDataset", "Path to data directory %s not valid",fGridDataDir.Data());
          return kFALSE;
       }   
-      CdWork();
+//      CdWork();
       if (TestBit(AliAnalysisGrid::kTest)) file = "wn.xml";
       else file = Form("%s.xml", gSystem->BaseName(path));
-      if (gSystem->AccessPathName(file)) {
+      if (gSystem->AccessPathName(file) || TestBit(AliAnalysisGrid::kTest)) {
          command = "find ";
          command += options;
          command += path;
@@ -554,8 +569,8 @@ Bool_t AliAnalysisAlien::CreateDataset(const char *pattern)
       TIter next(arr);
       while ((os=(TObjString*)next())) {
          path = Form("%s/%s ", fGridDataDir.Data(), os->GetString().Data());
-         if (!gGrid->Cd(path)) continue;
-         CdWork();
+         if (!DirectoryExists(path)) continue;
+//         CdWork();
          if (TestBit(AliAnalysisGrid::kTest)) file = "wn.xml";
          else file = Form("%s.xml", os->GetString().Data());
          // If local collection file does not exist, create it via 'find' command.
@@ -603,9 +618,9 @@ Bool_t AliAnalysisAlien::CreateDataset(const char *pattern)
                Info("CreateDataset", "\n#####   Dataset %s exist. Skipping creation...", schunk.Data());
                continue;
             }        
-            printf("Exporting merged collection <%s> and copying to AliEn.\n", schunk.Data());
+            printf("Exporting merged collection <%s> and copying to AliEn\n", schunk.Data());
             cbase->ExportXML(Form("file://%s", schunk.Data()),kFALSE,kFALSE, schunk, "Merged runs");
-            TFile::Cp(Form("file:%s",file.Data()), Form("alien://%s/%s",workdir.Data(), file.Data()));
+            TFile::Cp(Form("file:%s",schunk.Data()), Form("alien://%s/%s",workdir.Data(), schunk.Data()));
             if (!FileExists(schunk)) {
                Error("CreateDataset", "Copy command did NOT succeed for %s", schunk.Data());
                delete arr;
@@ -618,8 +633,8 @@ Bool_t AliAnalysisAlien::CreateDataset(const char *pattern)
       // Process a full run range.
       for (Int_t irun=fRunRange[0]; irun<=fRunRange[1]; irun++) {
          path = Form("%s/%d ", fGridDataDir.Data(), irun);
-         if (!gGrid->Cd(path)) continue;
-         CdWork();
+         if (!DirectoryExists(path)) continue;
+//         CdWork();
          if (TestBit(AliAnalysisGrid::kTest)) file = "wn.xml";
          else file = Form("%d.xml", irun);
          if (FileExists(file) && fNrunsPerMaster<2 && !TestBit(AliAnalysisGrid::kTest)) {
@@ -728,7 +743,7 @@ Bool_t AliAnalysisAlien::CreateJDL()
          error = kTRUE;
       } else {
          if (!fGridOutputDir.Contains("/")) fGridOutputDir = Form("%s/%s", workdir.Data(), fGridOutputDir.Data());
-         if (!gGrid->Cd(fGridOutputDir)) {
+         if (!DirectoryExists(fGridOutputDir)) {
             if (gGrid->Mkdir(fGridOutputDir)) {
                Info("CreateJDL", "\n#####   Created alien output directory %s", fGridOutputDir.Data());
             } else {
@@ -761,7 +776,9 @@ Bool_t AliAnalysisAlien::CreateJDL()
       fGridJDL->SetInputDataListFormat(fInputFormat);
       fGridJDL->SetInputDataList("wn.xml");
       fGridJDL->AddToInputSandbox(Form("LF:%s/%s", workdir.Data(), fAnalysisMacro.Data()));
-      fGridJDL->AddToInputSandbox(Form("LF:%s/analysis.root", workdir.Data()));
+      TString analysisFile = fExecutable;
+      analysisFile.ReplaceAll(".sh", ".root");
+      fGridJDL->AddToInputSandbox(Form("LF:%s/%s", workdir.Data(),analysisFile.Data()));
       if (IsUsingTags() && !gSystem->AccessPathName("ConfigureCuts.C"))
          fGridJDL->AddToInputSandbox(Form("LF:%s/ConfigureCuts.C", workdir.Data()));
       if (fAdditionalLibs.Length()) {
@@ -792,6 +809,10 @@ Bool_t AliAnalysisAlien::CreateJDL()
       arr = fOutputFiles.Tokenize(" ");
       TIter next(arr);
       while ((os=(TObjString*)next())) {
+         // Ignore ouputs in jdl that are also in outputarchive
+         TString sout = os->GetString();
+         if (sout.Index("@")>0) sout.Remove(sout.Index("@"));
+         if (fOutputArchive.Contains(sout)) continue;
          if (!os->GetString().Contains("@") && fCloseSE.Length())
             fGridJDL->AddToOutputSandbox(Form("%s@%s",os->GetString().Data(), fCloseSE.Data())); 
          else
@@ -800,7 +821,9 @@ Bool_t AliAnalysisAlien::CreateJDL()
       delete arr;
 //      fGridJDL->SetPrice((UInt_t)fPrice);
       fGridJDL->SetValue("Price", Form("\"%d\"", fPrice));
-      fGridJDL->SetValidationCommand(Form("%s/validate.sh", workdir.Data()));
+      TString validationScript = fExecutable;
+      validationScript.ReplaceAll(".sh", "_validation.sh");
+      fGridJDL->SetValidationCommand(Form("%s/%s", workdir.Data(),validationScript.Data()));
       if (fMasterResubmitThreshold) fGridJDL->SetValue("MasterResubmitThreshold", Form("\"%d%%\"", fMasterResubmitThreshold));
       // Write a jdl with 2 input parameters: collection name and output dir name.
       WriteJDL(copy);
@@ -851,7 +874,7 @@ Bool_t AliAnalysisAlien::WriteJDL(Bool_t copy)
    } else {
       // One jdl to be submitted with 2 input parameters: data collection name and output dir prefix
       fGridJDL->AddToInputDataCollection(Form("LF:%s/$1,nodownload", workdir.Data()));
-      fGridJDL->SetOutputDirectory(Form("%s/$2#alien_counter_03i#", fGridOutputDir.Data()));
+      fGridJDL->SetOutputDirectory(Form("%s/$2/#alien_counter_03i#", fGridOutputDir.Data()));
    }
       
 
@@ -951,6 +974,35 @@ Bool_t AliAnalysisAlien::FileExists(const char *lfn)
    return kTRUE;
 }
 
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::DirectoryExists(const char *dirname)
+{
+// Returns true if directory exists. Can be also a path.
+   if (!gGrid) return kFALSE;
+   // Check if dirname is a path
+   TString dirstripped = dirname;
+   dirstripped = dirstripped.Strip();
+   dirstripped = dirstripped.Strip(TString::kTrailing, '/');
+   TString dir = gSystem->BaseName(dirstripped);
+   dir += "/";
+   TString path = gSystem->DirName(dirstripped);
+   TGridResult *res = gGrid->Ls(path, "-F");
+   if (!res) return kFALSE;
+   TIter next(res);
+   TMap *map;
+   TObject *obj;
+   while ((map=dynamic_cast<TMap*>(next()))) {
+      obj = map->GetValue("name");
+      if (!obj) break;
+      if (dir == obj->GetName()) {
+         delete res;
+         return kTRUE;
+      }
+   }
+   delete res;
+   return kFALSE;
+}      
+
 //______________________________________________________________________________
 void AliAnalysisAlien::CheckDataType(const char *lfn, Bool_t &is_collection, Bool_t &is_xml, Bool_t &use_tags)
 {
@@ -1190,6 +1242,7 @@ void AliAnalysisAlien::SetDefaults()
    fMaxMergeFiles              = 100;
    fRunNumbers                 = "";
    fExecutable                 = "analysis.sh";
+   fExecutableCommand          = "root -b -q";
    fArguments                  = "";
    fAnalysisMacro              = "myAnalysis.C";
    fAnalysisSource             = "";
@@ -1224,7 +1277,7 @@ Bool_t AliAnalysisAlien::MergeOutputs()
    }   
    // Get the output path
    if (!fGridOutputDir.Contains("/")) fGridOutputDir = Form("/%s/%s/%s", gGrid->GetHomeDirectory(), fGridWorkingDir.Data(), fGridOutputDir.Data());
-   if (!gGrid->Cd(fGridOutputDir)) {
+   if (!DirectoryExists(fGridOutputDir)) {
       Error("MergeOutputs", "Grid output directory %s not found. Terminate() will NOT be executed", fGridOutputDir.Data());
       return kFALSE;
    }
@@ -1377,6 +1430,7 @@ Bool_t AliAnalysisAlien::StartAnalysis(Long64_t /*nentries*/, Long64_t /*firstEn
             if (!mgr->GetOutputEventHandler()) continue;
             filename = mgr->GetOutputEventHandler()->GetOutputFileName();
          }
+         if (fOutputFiles.Contains(filename)) continue;
          if (fOutputFiles.Length()) fOutputFiles += " ";
          fOutputFiles += filename;
       }
@@ -1384,7 +1438,7 @@ Bool_t AliAnalysisAlien::StartAnalysis(Long64_t /*nentries*/, Long64_t /*firstEn
       if (mgr->GetExtraFiles().Length()) {
          if (fOutputFiles.Length()) fOutputFiles += " ";
          fOutputFiles += mgr->GetExtraFiles();
-      }   
+      }
    }
 //   if (!fCloseSE.Length()) fCloseSE = gSystem->Getenv("alien_CLOSE_SE");
    if (TestBit(AliAnalysisGrid::kOffline)) {
@@ -1437,7 +1491,9 @@ Bool_t AliAnalysisAlien::StartAnalysis(Long64_t /*nentries*/, Long64_t /*firstEn
       }
       delete list;
       gSystem->Exec(Form("bash %s 2>stderr", fExecutable.Data()));
-      gSystem->Exec("bash validate.sh");
+      TString validationScript = fExecutable;
+      validationScript.ReplaceAll(".sh", "_validation.sh");
+      gSystem->Exec(Form("bash %s",validationScript.Data()));
 //      gSystem->Exec("cat stdout");
       return kFALSE;
    }
@@ -1560,7 +1616,9 @@ void AliAnalysisAlien::SubmitNext()
 //______________________________________________________________________________
 void AliAnalysisAlien::WriteAnalysisFile()
 {
-// Write current analysis manager into the file analysis.root
+// Write current analysis manager into the file <analysisFile>
+   TString analysisFile = fExecutable;
+   analysisFile.ReplaceAll(".sh", ".root");
    if (!TestBit(AliAnalysisGrid::kSubmit)) {  
       AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
       if (!mgr || !mgr->IsInitialized()) {
@@ -1576,13 +1634,13 @@ void AliAnalysisAlien::WriteAnalysisFile()
          if (handler->InheritsFrom("AliAODInputHandler")) TObject::SetBit(AliAnalysisGrid::kUseAOD);
       }
       TDirectory *cdir = gDirectory;
-      TFile *file = TFile::Open("analysis.root", "RECREATE");
+      TFile *file = TFile::Open(analysisFile, "RECREATE");
       if (file) {
          mgr->Write();
          delete file;
       }
       if (cdir) cdir->cd();
-      Info("WriteAnalysisFile", "\n#####   Analysis manager: %s wrote to file <analysis.root>\n", mgr->GetName());
+      Info("WriteAnalysisFile", "\n#####   Analysis manager: %s wrote to file <%s>\n", mgr->GetName(),analysisFile.Data());
    }   
    Bool_t copy = kTRUE;
    if (TestBit(AliAnalysisGrid::kOffline) || TestBit(AliAnalysisGrid::kTest)) copy = kFALSE;
@@ -1590,9 +1648,9 @@ void AliAnalysisAlien::WriteAnalysisFile()
       CdWork();
       TString workdir = gGrid->GetHomeDirectory();
       workdir += fGridWorkingDir;
-      Info("CreateJDL", "\n#####   Copying file <analysis.root> containing your initialized analysis manager to your alien workspace");
-      if (FileExists("analysis.root")) gGrid->Rm("analysis.root");
-      TFile::Cp("file:analysis.root", Form("alien://%s/analysis.root", workdir.Data()));
+      Info("CreateJDL", "\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()));
    }   
 }
 
@@ -1742,7 +1800,9 @@ void AliAnalysisAlien::WriteAnalysisMacro()
          }  
       }   
       out << "// read the analysis manager from file" << endl;
-      out << "   TFile *file = TFile::Open(\"analysis.root\");" << endl;
+      TString analysisFile = fExecutable;
+      analysisFile.ReplaceAll(".sh", ".root");
+      out << "   TFile *file = TFile::Open(\"" << analysisFile << "\");" << endl;
       out << "   if (!file) return;" << endl; 
       out << "   TIter nextkey(file->GetListOfKeys());" << endl;
       out << "   AliAnalysisManager *mgr = 0;" << endl;
@@ -1752,7 +1812,7 @@ void AliAnalysisAlien::WriteAnalysisMacro()
       out << "         mgr = (AliAnalysisManager*)file->Get(key->GetName());" << endl;
       out << "   };" << endl;
       out << "   if (!mgr) {" << endl;
-      out << "      ::Error(\"" << func.Data() << "\", \"No analysis manager found in file analysis.root\");" << endl;
+      out << "      ::Error(\"" << func.Data() << "\", \"No analysis manager found in file" << analysisFile <<"\");" << endl;
       out << "      return;" << endl;
       out << "   }" << endl << endl;
       out << "   mgr->PrintStatus();" << endl;
@@ -1912,7 +1972,6 @@ void AliAnalysisAlien::WriteExecutable()
          return;
       }
       out << "#!/bin/bash" << endl;
-      out << "export GCLIENT_SERVER_LIST=\"pcapiserv04.cern.ch:10000|pcapiserv05.cern.ch:10000|pcapiserv06.cern.ch:10000|pcapiserv07.cern.ch:10000\"" << endl;
       out << "echo \"=========================================\"" << endl; 
       out << "echo \"############## PATH : ##############\"" << endl;
       out << "echo $PATH" << endl;
@@ -1928,7 +1987,7 @@ void AliAnalysisAlien::WriteExecutable()
       out << "which aliroot" << endl;
       out << "echo \"=========================================\"" << endl << endl;
 //      if (TestBit(AliAnalysisGrid::kTest)) out << "root ";
-      out << "root -b -q "; 
+      out << fExecutableCommand << " "; 
       out << fAnalysisMacro.Data() << endl << endl;
       out << "echo \"======== " << fAnalysisMacro.Data() << " finished ========\"" << endl;
    }   
@@ -1937,6 +1996,8 @@ void AliAnalysisAlien::WriteExecutable()
    if (copy) {
       CdWork();
       TString workdir = gGrid->GetHomeDirectory();
+      TString bindir = Form("%s/bin", workdir.Data());
+      if (!DirectoryExists(bindir)) gGrid->Mkdir(bindir);
       workdir += fGridWorkingDir;
       TString executable = Form("%s/bin/%s", gGrid->GetHomeDirectory(), fExecutable.Data());
       if (FileExists(executable)) gGrid->Rm(executable);
@@ -1977,6 +2038,8 @@ void AliAnalysisAlien::WriteValidationScript()
 // Generate the alien validation script.
    // Generate the validation script
    TObjString *os;
+   TString validationScript = fExecutable;
+   validationScript.ReplaceAll(".sh", "_validation.sh");
    if (!Connect()) {
       Error("WriteValidationScript", "Alien connection required");
       return;
@@ -1985,7 +2048,7 @@ void AliAnalysisAlien::WriteValidationScript()
    if (!TestBit(AliAnalysisGrid::kTest)) out_stream = " >> stdout";
    if (!TestBit(AliAnalysisGrid::kSubmit)) {  
       ofstream out;
-      out.open("validate.sh", ios::out);
+      out.open(validationScript, ios::out);
       out << "#!/bin/bash" << endl;
       out << "##################################################" << endl;
       out << "validateout=`dirname $0`" << endl;
@@ -2058,6 +2121,12 @@ void AliAnalysisAlien::WriteValidationScript()
          out << "fi" << endl;
       }   
       delete arr;
+      out << "if ! [ -f outputs_valid ] ; then" << endl;
+      out << "   error=1" << endl;
+      out << "   echo \"Output files were not validated by the analysis manager\" >> stdout" << endl;
+      out << "   echo \"Output files were not validated by the analysis manager\" >> stderr" << endl;
+      out << "fi" << endl;
+      
       out << "if [ $error = 0 ] ; then" << endl;
       out << "   echo \"* ----------------   Job Validated  ------------------*\""  << out_stream << endl;
       out << "fi" << endl;
@@ -2073,8 +2142,8 @@ void AliAnalysisAlien::WriteValidationScript()
       CdWork();
       TString workdir = gGrid->GetHomeDirectory();
       workdir += fGridWorkingDir;
-      Info("CreateJDL", "\n#####   Copying validation script <validate.sh> to your AliEn working space");
-      if (FileExists("validate.sh")) gGrid->Rm("validate.sh");
-      TFile::Cp("file:validate.sh", Form("alien://%s/validate.sh", workdir.Data()));
+      Info("CreateJDL", "\n#####   Copying validation script <%s> to your AliEn working space", validationScript.Data());
+      if (FileExists(validationScript)) gGrid->Rm(validationScript);
+      TFile::Cp(Form("file:%s",validationScript.Data()), Form("alien://%s/%s", workdir.Data(),validationScript.Data()));
    } 
 }