X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ANALYSIS%2FAliAnalysisAlien.cxx;h=628834b5d35ddb4a0bda96085f1bccb35f4de787;hb=4573b9041cc6fdd6652739a934689c1a298a5a5a;hp=f79fa79ba515aec9a40186463a4f86203b5102a9;hpb=5fce53f485f8c7116c211ccd2f5620e55ef9d10d;p=u%2Fmrichter%2FAliRoot.git diff --git a/ANALYSIS/AliAnalysisAlien.cxx b/ANALYSIS/AliAnalysisAlien.cxx index f79fa79ba51..628834b5d35 100644 --- a/ANALYSIS/AliAnalysisAlien.cxx +++ b/ANALYSIS/AliAnalysisAlien.cxx @@ -54,12 +54,15 @@ AliAnalysisAlien::AliAnalysisAlien() fMaxMergeFiles(0), fNsubmitted(0), fProductionMode(0), + fOutputToRunNo(0), fRunNumbers(), fExecutable(), fExecutableCommand(), fArguments(), + fExecutableArgs(), fAnalysisMacro(), fAnalysisSource(), + fAdditionalRootLibs(), fAdditionalLibs(), fSplitMode(), fAPIVersion(), @@ -104,12 +107,15 @@ AliAnalysisAlien::AliAnalysisAlien(const char *name) fMaxMergeFiles(0), fNsubmitted(0), fProductionMode(0), + fOutputToRunNo(0), fRunNumbers(), fExecutable(), fExecutableCommand(), fArguments(), + fExecutableArgs(), fAnalysisMacro(), fAnalysisSource(), + fAdditionalRootLibs(), fAdditionalLibs(), fSplitMode(), fAPIVersion(), @@ -154,12 +160,15 @@ AliAnalysisAlien::AliAnalysisAlien(const AliAnalysisAlien& other) fMaxMergeFiles(other.fMaxMergeFiles), fNsubmitted(other.fNsubmitted), fProductionMode(other.fProductionMode), + fOutputToRunNo(other.fOutputToRunNo), fRunNumbers(other.fRunNumbers), fExecutable(other.fExecutable), fExecutableCommand(other.fExecutableCommand), fArguments(other.fArguments), + fExecutableArgs(other.fExecutableArgs), fAnalysisMacro(other.fAnalysisMacro), fAnalysisSource(other.fAnalysisSource), + fAdditionalRootLibs(other.fAdditionalRootLibs), fAdditionalLibs(other.fAdditionalLibs), fSplitMode(other.fSplitMode), fAPIVersion(other.fAPIVersion), @@ -232,12 +241,15 @@ AliAnalysisAlien &AliAnalysisAlien::operator=(const AliAnalysisAlien& other) fMaxMergeFiles = other.fMaxMergeFiles; fNsubmitted = other.fNsubmitted; fProductionMode = other.fProductionMode; + fOutputToRunNo = other.fOutputToRunNo; fRunNumbers = other.fRunNumbers; fExecutable = other.fExecutable; fExecutableCommand = other.fExecutableCommand; fArguments = other.fArguments; + fExecutableArgs = other.fExecutableArgs; fAnalysisMacro = other.fAnalysisMacro; fAnalysisSource = other.fAnalysisSource; + fAdditionalRootLibs = other.fAdditionalRootLibs; fAdditionalLibs = other.fAdditionalLibs; fSplitMode = other.fSplitMode; fAPIVersion = other.fAPIVersion; @@ -448,7 +460,7 @@ Bool_t AliAnalysisAlien::CheckInputData() TObjArray *arr; TObjString *os; Int_t nruns = 0; - TString schunk; + TString schunk, schunk2; TString path; if (!checked) { checked = kTRUE; @@ -511,11 +523,16 @@ Bool_t AliAnalysisAlien::CheckInputData() if (((nruns-1)%fNrunsPerMaster) == 0) { schunk = Form("%s%d", fRunPrefix.Data(),irun); } + schunk2 = Form("_%s%d.xml", fRunPrefix.Data(), irun); if ((nruns%fNrunsPerMaster)!=0 && irun != fRunRange[1]) continue; - schunk += Form("_%s%d.xml", fRunPrefix.Data(), irun); + schunk += schunk2; AddDataFile(schunk); } } + if (!fInputFiles) { + schunk += schunk2; + AddDataFile(schunk); + } } return kTRUE; } @@ -544,7 +561,7 @@ Bool_t AliAnalysisAlien::CreateDataset(const char *pattern) TString file; TString path; Int_t nruns = 0; - TString schunk; + TString schunk, schunk2; TGridCollection *cbase=0, *cadd=0; if (!fRunNumbers.Length() && !fRunRange[0]) { if (fInputFiles && fInputFiles->GetEntries()) return kTRUE; @@ -694,17 +711,18 @@ Bool_t AliAnalysisAlien::CreateDataset(const char *pattern) if (FileExists(fInputFiles->At(nchunk)->GetName())) continue; printf(" Merging collection <%s> into %d runs chunk...\n",file.Data(),fNrunsPerMaster); if (((nruns-1)%fNrunsPerMaster) == 0) { - schunk = Form("%d", irun); + schunk = Form("%s%d", fRunPrefix.Data(), irun); cbase = (TGridCollection*)gROOT->ProcessLine(Form("new TAlienCollection(\"%s\", 1000000);",file.Data())); } else { cadd = (TGridCollection*)gROOT->ProcessLine(Form("new TAlienCollection(\"%s\", 1000000);",file.Data())); cbase->Add(cadd); delete cadd; } - if ((nruns%fNrunsPerMaster)!=0 && irun!=fRunRange[1]) { + schunk2 = Form("%s_%s%d.xml", schunk.Data(), fRunPrefix.Data(), irun); + if ((nruns%fNrunsPerMaster)!=0 && irun!=fRunRange[1] && schunk2 != fInputFiles->Last()->GetName()) { continue; } - schunk += Form("_%d.xml", irun); + schunk = schunk2; if (FileExists(schunk)) { Info("CreateDataset", "\n##### Dataset %s exist. Skipping creation...", schunk.Data()); continue; @@ -778,6 +796,8 @@ Bool_t AliAnalysisAlien::CreateJDL() // Set JDL fields fGridJDL->SetValue("User", Form("\"%s\"", fUser.Data())); fGridJDL->SetExecutable(fExecutable); + if (!fArguments.IsNull()) + fGridJDL->SetArguments(fArguments, "Arguments for the executable command"); // fGridJDL->SetTTL((UInt_t)fTTL); fGridJDL->SetValue("TTL", Form("\"%d\"", fTTL)); if (fMaxInitFailed > 0) @@ -862,6 +882,22 @@ Bool_t AliAnalysisAlien::CreateJDL() } // Copy jdl to grid workspace if (copy) { + // Check if an output directory was defined and valid + if (!fGridOutputDir.Length()) { + Error("CreateJDL", "You must define AliEn output directory"); + return kFALSE; + } else { + if (!fGridOutputDir.Contains("/")) fGridOutputDir = Form("%s/%s", workdir.Data(), fGridOutputDir.Data()); + if (!DirectoryExists(fGridOutputDir)) { + if (gGrid->Mkdir(fGridOutputDir)) { + Info("CreateJDL", "\n##### Created alien output directory %s", fGridOutputDir.Data()); + } else { + Error("CreateJDL", "Could not create alien output directory %s", fGridOutputDir.Data()); + return kFALSE; + } + } + gGrid->Cd(workdir); + } if (TestBit(AliAnalysisGrid::kSubmit)) { Info("CreateJDL", "\n##### Copying JDL file <%s> to your AliEn output directory", fJDLName.Data()); TString locjdl = Form("%s/%s", fGridOutputDir.Data(),fJDLName.Data()); @@ -886,6 +922,7 @@ Bool_t AliAnalysisAlien::CreateJDL() TIter next(fPackages); TObject *obj; while ((obj=next())) { + if (FileExists(obj->GetName())) gGrid->Rm(obj->GetName()); Info("CreateJDL", "\n##### Copying dependency: <%s> to your alien workspace", obj->GetName()); TFile::Cp(Form("file:%s",obj->GetName()), Form("alien://%s/%s", workdir.Data(), obj->GetName())); } @@ -911,15 +948,18 @@ Bool_t AliAnalysisAlien::WriteJDL(Bool_t copy) while ((os=(TObjString*)next())) fGridJDL->AddToInputDataCollection(Form("LF:%s,nodownload", os->GetString().Data())); if (!fOutputSingle.IsNull()) - fGridJDL->SetOutputDirectory(Form("#alienfulldir#/%s",fOutputSingle.Data())); + fGridJDL->SetOutputDirectory(Form("#alienfulldir#/../%s",fOutputSingle.Data())); else fGridJDL->SetOutputDirectory(Form("%s/#alien_counter_03i#", fGridOutputDir.Data())); } 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())); - if (!fOutputSingle.IsNull()) - fGridJDL->SetOutputDirectory(Form("#alienfulldir#/%s",fOutputSingle.Data())); - fGridJDL->SetOutputDirectory(Form("%s/$2/#alien_counter_03i#", fGridOutputDir.Data())); + if (!fOutputSingle.IsNull()) { + if (!fOutputToRunNo) fGridJDL->SetOutputDirectory(Form("#alienfulldir#/%s",fOutputSingle.Data())); + else fGridJDL->SetOutputDirectory(Form("%s/$2",fGridOutputDir.Data())); + } else { + fGridJDL->SetOutputDirectory(Form("%s/$2/#alien_counter_03i#", fGridOutputDir.Data())); + } } @@ -1201,6 +1241,13 @@ Bool_t AliAnalysisAlien::IsCollection(const char *lfn) const return kFALSE; } +//______________________________________________________________________________ +Bool_t AliAnalysisAlien::IsSingleOutput() const +{ +// Check if single-ouput option is on. + return (!fOutputSingle.IsNull()); +} + //______________________________________________________________________________ void AliAnalysisAlien::Print(Option_t *) const { @@ -1244,9 +1291,12 @@ void AliAnalysisAlien::Print(Option_t *) const if (fNrunsPerMaster>0) printf("= Number of runs per master job: _______________ %d\n", fNrunsPerMaster); printf("= Number of files in one chunk to be merged: ___ %d\n", fMaxMergeFiles); - printf("= Name of the generated execution script: ______ %s\n",fExecutable.Data()); + printf("= Name of the generated execution script: ______ %s\n", fExecutable.Data()); + printf("= Executable command: __________________________ %s\n", fExecutableCommand.Data()); if (fArguments.Length()) printf("= Arguments for the execution script: __________ %s\n",fArguments.Data()); + if (fExecutableArgs.Length()) + printf("= Arguments after macro name in executable______ %s\n",fExecutableArgs.Data()); printf("= Name of the generated analysis macro: ________ %s\n",fAnalysisMacro.Data()); printf("= User analysis files to be deployed: __________ %s\n",fAnalysisSource.Data()); printf("= Additional libs to be loaded or souces to be compiled runtime: <%s>\n",fAdditionalLibs.Data()); @@ -1289,6 +1339,7 @@ void AliAnalysisAlien::SetDefaults() fExecutable = "analysis.sh"; fExecutableCommand = "root -b -q"; fArguments = ""; + fExecutableArgs = ""; fAnalysisMacro = "myAnalysis.C"; fAnalysisSource = ""; fAdditionalLibs = ""; @@ -1632,7 +1683,12 @@ void AliAnalysisAlien::SubmitNext() // Submit for a range of enumeration of runs. if (fNsubmitted>=nmasterjobs) {iscalled = kFALSE; return;} TString query; - query = Form("submit %s %s %03d", fJDLName.Data(), fInputFiles->At(fNsubmitted)->GetName(), fNsubmitted); + TString runOutDir = gSystem->BaseName(fInputFiles->At(fNsubmitted)->GetName()); + runOutDir.ReplaceAll(".xml", ""); + if (fOutputToRunNo) + query = Form("submit %s %s %s", fJDLName.Data(), fInputFiles->At(fNsubmitted)->GetName(), runOutDir.Data()); + else + query = Form("submit %s %s %03d", fJDLName.Data(), fInputFiles->At(fNsubmitted)->GetName(), fNsubmitted); printf("********* %s\n",query.Data()); res = gGrid->Command(query); if (res) { @@ -1681,8 +1737,14 @@ void AliAnalysisAlien::WriteAnalysisFile() TDirectory *cdir = gDirectory; TFile *file = TFile::Open(analysisFile, "RECREATE"); if (file) { + // Skip task Terminate calls for the grid job + mgr->SetSkipTerminate(kTRUE); + // Unless merging makes no sense + if (IsSingleOutput()) mgr->SetSkipTerminate(kFALSE); mgr->Write(); delete file; + // Enable termination for local jobs + mgr->SetSkipTerminate(kFALSE); } if (cdir) cdir->cd(); Info("WriteAnalysisFile", "\n##### Analysis manager: %s wrote to file <%s>\n", mgr->GetName(),analysisFile.Data()); @@ -1738,6 +1800,21 @@ void AliAnalysisAlien::WriteAnalysisMacro() out << " gSystem->Load(\"libVMC\");" << endl; out << " gSystem->Load(\"libPhysics\");" << endl << endl; out << " gSystem->Load(\"libMinuit\");" << endl << endl; + if (fAdditionalRootLibs.Length()) { + // in principle libtree /lib geom libvmc etc. can go into this list, too + out << "// Add aditional libraries" << endl; + TObjArray *list = fAdditionalRootLibs.Tokenize(" "); + TIter next(list); + TObjString *str; + while((str=(TObjString*)next())) { + if (str->GetString().Contains(".so")) + out << " gSystem->Load(\"" << str->GetString().Data() << "\");" << endl; + } + if (list) delete list; + } + out << "// include path" << endl; + if (fIncludePath.Length()) out << " gSystem->AddIncludePath(\"" << fIncludePath.Data() << "\");" << endl; + out << " gSystem->AddIncludePath(\"-I$ALICE_ROOT/include\");" << endl << endl; out << "// Load analysis framework libraries" << endl; if (!fPackages) { out << " gSystem->Load(\"libSTEERBase\");" << endl; @@ -1802,9 +1879,6 @@ void AliAnalysisAlien::WriteAnalysisMacro() out << " if (!SetupPar(\"" << obj->GetName() << "\")) return;" << endl; } } - out << "// include path" << endl; - if (fIncludePath.Length()) out << " gSystem->AddIncludePath(\"" << fIncludePath.Data() << "\");" << endl; - out << " gSystem->AddIncludePath(\"-I$ALICE_ROOT/include\");" << endl << endl; if (fAdditionalLibs.Length()) { out << "// Add aditional AliRoot libraries" << endl; TObjArray *list = fAdditionalLibs.Tokenize(" "); @@ -1862,6 +1936,13 @@ void AliAnalysisAlien::WriteAnalysisMacro() out << " return;" << endl; out << " }" << endl << endl; out << " mgr->PrintStatus();" << endl; + if (AliAnalysisManager::GetAnalysisManager()) { + if (AliAnalysisManager::GetAnalysisManager()->GetDebugLevel()>2) { + out << " gEnv->SetValue(\"XNet.Debug\", \"1\");" << endl; + } else { + out << " AliLog::SetGlobalLogLevel(AliLog::kError);" << endl; + } + } out << " mgr->StartAnalysis(\"localfile\", chain);" << endl; out << " timer.Stop();" << endl; out << " timer.Print();" << endl; @@ -2031,12 +2112,20 @@ void AliAnalysisAlien::WriteExecutable() out << "echo $ALICE_ROOT" << endl; out << "echo \"############## which aliroot : ##############\"" << endl; out << "which aliroot" << endl; + out << "echo \"############## system limits : ##############\"" << endl; + out << "ulimit -a" << endl; + out << "echo \"############## memory : ##############\"" << endl; + out << "free -m" << endl; out << "echo \"=========================================\"" << endl << endl; // Make sure we can properly compile par files if (TObject::TestBit(AliAnalysisGrid::kUsePars)) out << "export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH" << endl; out << fExecutableCommand << " "; - out << fAnalysisMacro.Data() << endl << endl; - out << "echo \"======== " << fAnalysisMacro.Data() << " finished ========\"" << endl; + out << fAnalysisMacro.Data() << " " << fExecutableArgs.Data() << endl << endl; + out << "echo \"======== " << fAnalysisMacro.Data() << " finished with exit code: $? ========\"" << endl; + out << "echo \"############## memory after: ##############\"" << endl; + out << "free -m" << endl; + out << "echo \"############## Last 10 lines from dmesg : ##############\"" << endl; + out << "dmesg | tail -n 10" << endl; } Bool_t copy = kTRUE; if (TestBit(AliAnalysisGrid::kOffline) || TestBit(AliAnalysisGrid::kTest)) copy = kFALSE; @@ -2073,9 +2162,15 @@ void AliAnalysisAlien::WriteProductionFile(const char *filename) const out << locjdl << " " << njobspermaster << endl; Int_t nmasterjobs = fInputFiles->GetEntries(); for (Int_t i=0; iAt(i)->GetName()) << " " << Form("%03d", i) << endl; + TString runOutDir = gSystem->BaseName(fInputFiles->At(i)->GetName()); + runOutDir.ReplaceAll(".xml", ""); + if (fOutputToRunNo) + out << Form("%s", fInputFiles->At(i)->GetName()) << " " << runOutDir << endl; + else + out << Form("%s", fInputFiles->At(i)->GetName()) << " " << Form("%03d", i) << endl; } Info("WriteProductionFile", "\n##### Copying production file <%s> to your work directory", filename); + if (FileExists(filename)) gGrid->Rm(filename); TFile::Cp(Form("file:%s",filename), Form("alien://%s/%s", workdir.Data(),filename)); }