#include "AliAnalysisDataContainer.h"
#include "AliMultiInputEventHandler.h"
+using std::ofstream;
+using std::ifstream;
+using std::ios;
+using std::endl;
ClassImp(AliAnalysisAlien)
#if 0
;
fJDLName(),
fTerminateFiles(),
fMergeExcludes(),
+ fRegisterExcludes(),
fIncludePath(),
fCloseSE(),
fFriendChainName(),
fProofCluster(),
fProofDataSet(),
fFileForTestMode(),
- fRootVersionForProof(),
fAliRootMode(),
+ fProofProcessOpt(),
fMergeDirName(),
fInputFiles(0),
fPackages(0),
fModules(0),
- fProofParam()
+ fProofParam(),
+ fDropToShell(true),
+ fGridJobIDs(""),
+ fGridStages("")
{
// Dummy ctor.
SetDefaults();
fJDLName(),
fTerminateFiles(),
fMergeExcludes(),
+ fRegisterExcludes(),
fIncludePath(),
fCloseSE(),
fFriendChainName(),
fProofCluster(),
fProofDataSet(),
fFileForTestMode(),
- fRootVersionForProof(),
fAliRootMode(),
+ fProofProcessOpt(),
fMergeDirName(),
fInputFiles(0),
fPackages(0),
fModules(0),
- fProofParam()
+ fProofParam(),
+ fDropToShell(true),
+ fGridJobIDs(""),
+ fGridStages("")
{
// Default ctor.
SetDefaults();
fJDLName(other.fJDLName),
fTerminateFiles(other.fTerminateFiles),
fMergeExcludes(other.fMergeExcludes),
+ fRegisterExcludes(other.fRegisterExcludes),
fIncludePath(other.fIncludePath),
fCloseSE(other.fCloseSE),
fFriendChainName(other.fFriendChainName),
fProofCluster(other.fProofCluster),
fProofDataSet(other.fProofDataSet),
fFileForTestMode(other.fFileForTestMode),
- fRootVersionForProof(other.fRootVersionForProof),
fAliRootMode(other.fAliRootMode),
+ fProofProcessOpt(other.fProofProcessOpt),
fMergeDirName(other.fMergeDirName),
fInputFiles(0),
fPackages(0),
fModules(0),
- fProofParam()
+ fProofParam(),
+ fDropToShell(other.fDropToShell),
+ fGridJobIDs(other.fGridJobIDs),
+ fGridStages(other.fGridStages)
{
// Copy ctor.
fGridJDL = (TGridJDL*)gROOT->ProcessLine("new TAlienJDL()");
fJDLName = other.fJDLName;
fTerminateFiles = other.fTerminateFiles;
fMergeExcludes = other.fMergeExcludes;
+ fRegisterExcludes = other.fRegisterExcludes;
fIncludePath = other.fIncludePath;
fCloseSE = other.fCloseSE;
fFriendChainName = other.fFriendChainName;
fProofCluster = other.fProofCluster;
fProofDataSet = other.fProofDataSet;
fFileForTestMode = other.fFileForTestMode;
- fRootVersionForProof = other.fRootVersionForProof;
fAliRootMode = other.fAliRootMode;
+ fProofProcessOpt = other.fProofProcessOpt;
fMergeDirName = other.fMergeDirName;
+ fDropToShell = other.fDropToShell;
+ fGridJobIDs = other.fGridJobIDs;
+ fGridStages = other.fGridStages;
if (other.fInputFiles) {
fInputFiles = new TObjArray();
TIter next(other.fInputFiles);
return *this;
}
+//______________________________________________________________________________
+void AliAnalysisAlien::AddAdditionalLibrary(const char *name)
+{
+// Add a single additional library to be loaded. Extension must be present.
+ TString lib(name);
+ if (!lib.Contains(".")) {
+ Error("AddAdditionalLibrary", "Extension not defined for %s", name);
+ return;
+ }
+ if (fAdditionalLibs.Contains(name)) {
+ Warning("AddAdditionalLibrary", "Library %s already added.", name);
+ return;
+ }
+ if (!fAdditionalLibs.IsNull()) fAdditionalLibs += " ";
+ fAdditionalLibs += lib;
+}
+
//______________________________________________________________________________
void AliAnalysisAlien::AddModule(AliAnalysisTaskCfg *module)
{
{
// Load a given module.
if (mod->IsLoaded()) return kTRUE;
+ AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+ if (!mgr) {
+ Error("LoadModule", "No analysis manager created yet. Use CreateAnalysisManager first.");
+ return kFALSE;
+ }
Int_t ndeps = mod->GetNdeps();
TString depname;
for (Int_t j=0; j<ndeps; j++) {
Error("LoadModule", "Cannot load all libraries for module %s", mod->GetName());
return kFALSE;
}
+ // Check if a custom file name was requested
+ if (strlen(mod->GetOutputFileName())) mgr->SetCommonFileName(mod->GetOutputFileName());
+
+ // Check if a custom terminate file name was requested
+ if (strlen(mod->GetTerminateFileName())) {
+ if (!fTerminateFiles.IsNull()) fTerminateFiles += ",";
+ fTerminateFiles += mod->GetTerminateFileName();
+ }
+
// Execute the macro
if (mod->ExecuteMacro()<0) {
Error("LoadModule", "Executing the macro %s with arguments: %s for module %s returned a negative value",
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.Contains(lib)) continue;
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->RunLocalInit();
+ 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)
{
} else if (!LoadModules()) return kFALSE;
AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
if (!mgr->InitAnalysis()) return kFALSE;
+ mgr->RunLocalInit();
mgr->PrintStatus();
SetLocalTest(kTRUE);
Int_t productionMode = fProductionMode;
TString execCommand = fExecutableCommand;
SetAnalysisMacro(Form("%s.C", name));
SetExecutable(Form("%s.sh", name));
- SetExecutableCommand("aliroot -b -q ");
+ fOutputFiles = GetListOfFiles("outaod");
+ // Add extra files registered to the analysis manager
+ TString extra = GetListOfFiles("ext");
+ if (!extra.IsNull()) {
+ extra.ReplaceAll(".root", "*.root");
+ if (!fOutputFiles.IsNull()) fOutputFiles += ",";
+ fOutputFiles += extra;
+ }
+// SetExecutableCommand("aliroot -b -q ");
SetValidationScript(Form("%s_validation.sh", name));
WriteAnalysisFile();
WriteAnalysisMacro();
WriteExecutable();
WriteValidationScript();
+ WriteMergingMacro();
+ WriteMergeExecutable();
+ WriteValidationScript(kTRUE);
SetLocalTest(kFALSE);
SetProductionMode(productionMode);
fAnalysisMacro = macro;
{
// Check if file copying is possible.
if (fProductionMode) return kTRUE;
+ TString salienpath(alienpath);
+ if (salienpath.Contains(" ")) {
+ Error("CheckFileCopy", "path: <%s> contains blancs - FIX IT !",alienpath);
+ return kFALSE;
+ }
if (!Connect()) {
Error("CheckFileCopy", "Not connected to AliEn. File copying cannot be tested.");
return kFALSE;
Error("CheckFileCopy", "Alien path %s does not seem to exist", alienpath);
return kFALSE;
}
- TFile f("plugin_test_copy", "RECREATE");
+ TString stest = "plugin_test_copy";
+ TFile f(stest, "RECREATE");
// User may not have write permissions to current directory
if (f.IsZombie()) {
Error("CheckFileCopy", "Cannot create local test file. Do you have write access to current directory: <%s> ?",
return kFALSE;
}
f.Close();
- if (FileExists(Form("alien://%s/%s",alienpath, f.GetName()))) gGrid->Rm(Form("alien://%s/%s",alienpath, f.GetName()));
- if (!TFile::Cp(f.GetName(), Form("alien://%s/%s",alienpath, f.GetName()))) {
+ if (FileExists(Form("alien://%s/%s",alienpath, stest.Data()))) gGrid->Rm(Form("alien://%s/%s",alienpath, stest.Data()));
+ if (!TFile::Cp(stest.Data(), Form("alien://%s/%s",alienpath, stest.Data()))) {
Error("CheckFileCopy", "Cannot copy files to Alien destination: <%s> This may be temporary, or: \
\n# 1. Make sure you have write permissions there. If this is the case: \
\n# 2. Check the storage availability at: http://alimonitor.cern.ch/stats?page=SE/table \
\n# Do: export alien_CLOSE_SE=\"working_disk_SE\" \
\n# To make this permanent put in in your .bashrc (in .alienshrc is not enough) \
\n# Redo token: rm /tmp/x509up_u$UID then: alien-token-init <username>", alienpath);
- gSystem->Unlink(f.GetName());
+ gSystem->Unlink(stest.Data());
return kFALSE;
}
- gSystem->Unlink(f.GetName());
- gGrid->Rm(Form("%s%s",alienpath,f.GetName()));
+ gSystem->Unlink(stest.Data());
+ gGrid->Rm(Form("%s/%s",alienpath,stest.Data()));
Info("CheckFileCopy", "### ...SUCCESS ###");
return kTRUE;
}
}
//______________________________________________________________________________
-Bool_t AliAnalysisAlien::CopyLocalDataset(const char *griddir, const char *pattern, Int_t nfiles, const char *output, const char *anchorfile)
+Int_t AliAnalysisAlien::CopyLocalDataset(const char *griddir, const char *pattern, Int_t nfiles, const char *output, const char *archivefile, const char *outputdir)
{
// Copy data from the given grid directory according a pattern and make a local
// dataset.
+// archivefile (optional) results in that the archive containing the file <pattern> is copied. archivefile can contain a list of files (semicolon-separated) which are all copied
if (!Connect()) {
Error("CopyLocalDataset", "Cannot copy local dataset with no grid connection");
- return kFALSE;
+ return 0;
}
if (!DirectoryExists(griddir)) {
Error("CopyLocalDataset", "Data directory %s not existing.", griddir);
- return kFALSE;
+ return 0;
}
TString command = Form("find -z -l %d %s %s", nfiles, griddir, pattern);
printf("Running command: %s\n", command.Data());
Int_t nfound = res->GetEntries();
if (!nfound) {
Error("CopyLocalDataset", "No file found in <%s> having pattern <%s>", griddir, pattern);
- return kFALSE;
+ return 0;
}
printf("... found %d files. Copying locally ...\n", nfound);
+
+ // archives
+ TObjArray* additionalArchives = 0;
+ if (strlen(archivefile) > 0 && TString(archivefile).Contains(";")) {
+ additionalArchives = TString(archivefile).Tokenize(";");
+ archivefile = additionalArchives->At(0)->GetName();
+ additionalArchives->RemoveAt(0);
+ additionalArchives->Compress();
+ }
+
// Copy files locally
ofstream out;
out.open(output, ios::out);
TMap *map;
TString turl, dirname, filename, temp;
TString cdir = gSystem->WorkingDirectory();
- gSystem->MakeDirectory("data");
- gSystem->ChangeDirectory("data");
+ gSystem->MakeDirectory(outputdir);
+ gSystem->ChangeDirectory(outputdir);
+ Int_t ncopied = 0;
for (Int_t i=0; i<nfound; i++) {
map = (TMap*)res->At(i);
turl = map->GetValue("turl")->GetName();
dirname = gSystem->DirName(turl.Data());
dirname = gSystem->BaseName(dirname.Data());
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;
+
+ TString source(turl);
+ TString targetFileName(filename);
+
+ if (strlen(archivefile) > 0) {
+// TODO here the archive in which the file resides should be determined
+// however whereis returns only a guid, and guid2lfn does not work
+// Therefore we use the one provided as argument for now
+ source = Form("%s/%s", gSystem->DirName(source.Data()), archivefile);
+ targetFileName = archivefile;
+ }
+ if (TFile::Cp(source, Form("file:./%s/%s", dirname.Data(), targetFileName.Data()))) {
+ Bool_t success = kTRUE;
+ if (additionalArchives) {
+ for (Int_t j=0; j<additionalArchives->GetEntriesFast(); j++) {
+ TString target;
+ target.Form("./%s/%s", dirname.Data(), additionalArchives->At(j)->GetName());
+ gSystem->MakeDirectory(gSystem->DirName(target));
+ success &= TFile::Cp(Form("%s/%s", gSystem->DirName(source.Data()), additionalArchives->At(j)->GetName()), Form("file:%s", target.Data()));
+ }
+ }
+
+ if (success) {
+ if (strlen(archivefile) > 0) targetFileName = Form("%s#%s", targetFileName.Data(), gSystem->BaseName(turl.Data()));
+ out << cdir << Form("/%s/%s/%s", outputdir, dirname.Data(), targetFileName.Data()) << endl;
+ ncopied++;
+ }
}
}
gSystem->ChangeDirectory(cdir);
delete res;
- return kTRUE;
+ delete additionalArchives;
+ return ncopied;
}
//______________________________________________________________________________
{
// Generate a JDL file according to current settings. The name of the file is
// specified by fJDLName.
+ AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
Bool_t error = kFALSE;
TObjArray *arr = 0;
Bool_t copy = kTRUE;
fMergingJDL->AddToInputSandbox(Form("LF:%s/%s", workdir.Data(), obj->GetName()));
}
}
+ const char *comment = "List of output files and archives";
if (fOutputArchive.Length()) {
- arr = fOutputArchive.Tokenize(" ");
+ TString outputArchive = fOutputArchive;
+ if (!fRegisterExcludes.IsNull()) {
+ arr = fRegisterExcludes.Tokenize(" ");
+ TIter next1(arr);
+ while ((os=(TObjString*)next1())) {
+ outputArchive.ReplaceAll(Form("%s,",os->GetString().Data()),"");
+ outputArchive.ReplaceAll(os->GetString(),"");
+ }
+ delete arr;
+ }
+ arr = outputArchive.Tokenize(" ");
TIter next(arr);
Bool_t first = kTRUE;
- const char *comment = "Files to be archived";
- const char *comment1 = comment;
while ((os=(TObjString*)next())) {
- if (!first) comment = NULL;
if (!os->GetString().Contains("@") && fCloseSE.Length())
- fGridJDL->AddToOutputArchive(Form("%s@%s",os->GetString().Data(), fCloseSE.Data()), comment);
+ fGridJDL->AddToSet("Output", Form("%s@%s",os->GetString().Data(), fCloseSE.Data()));
else
- fGridJDL->AddToOutputArchive(os->GetString(), comment);
+ fGridJDL->AddToSet("Output", os->GetString());
+ if (first) fGridJDL->AddToSetDescription("Output", comment);
first = kFALSE;
}
delete arr;
// Output archive for the merging jdl
- TString outputArchive;
if (TestBit(AliAnalysisGrid::kDefaultOutputs)) {
outputArchive = "log_archive.zip:std*@disk=1 ";
// Add normal output files, extra files + terminate files
TString files = GetListOfFiles("outextter");
- // Do not register merge excludes
- if (!fMergeExcludes.IsNull()) {
- arr = fMergeExcludes.Tokenize(" ");
+ // Do not register files in fRegisterExcludes
+ if (!fRegisterExcludes.IsNull()) {
+ arr = fRegisterExcludes.Tokenize(" ");
TIter next1(arr);
while ((os=(TObjString*)next1())) {
files.ReplaceAll(Form("%s,",os->GetString().Data()),"");
delete arr;
}
files.ReplaceAll(".root", "*.root");
- outputArchive += Form("root_archive.zip:%s,*.stat@disk=%d",files.Data(),fNreplicas);
+
+ if (mgr->IsCollectThroughput())
+ outputArchive += Form("root_archive.zip:%s,*.stat@disk=%d %s@disk=%d",files.Data(),fNreplicas, mgr->GetFileInfoLog(),fNreplicas);
+ else
+ outputArchive += Form("root_archive.zip:%s,*.stat@disk=%d",files.Data(),fNreplicas);
} else {
TString files = fOutputArchive;
files.ReplaceAll(".root", "*.root"); // nreplicas etc should be already atttached by use
}
arr = outputArchive.Tokenize(" ");
TIter next2(arr);
- comment = comment1;
first = kTRUE;
while ((os=(TObjString*)next2())) {
- if (!first) comment = NULL;
TString currentfile = os->GetString();
if (!currentfile.Contains("@") && fCloseSE.Length())
- fMergingJDL->AddToOutputArchive(Form("%s@%s",currentfile.Data(), fCloseSE.Data()), comment);
+ fMergingJDL->AddToSet("Output", Form("%s@%s",currentfile.Data(), fCloseSE.Data()));
else
- fMergingJDL->AddToOutputArchive(currentfile, comment);
+ fMergingJDL->AddToSet("Output", currentfile);
+ if (first) fMergingJDL->AddToSetDescription("Output", comment);
first = kFALSE;
}
delete arr;
arr = fOutputFiles.Tokenize(",");
TIter next(arr);
Bool_t first = kTRUE;
- const char *comment = "Files to be saved";
while ((os=(TObjString*)next())) {
// Ignore ouputs in jdl that are also in outputarchive
TString sout = os->GetString();
sout.ReplaceAll(".root", "");
if (sout.Index("@")>0) sout.Remove(sout.Index("@"));
if (fOutputArchive.Contains(sout)) continue;
+ // Ignore fRegisterExcludes
+ if (fRegisterExcludes.Contains(sout)) continue;
if (!first) comment = NULL;
if (!os->GetString().Contains("@") && fCloseSE.Length())
- fGridJDL->AddToOutputSandbox(Form("%s@%s",os->GetString().Data(), fCloseSE.Data()), comment);
+ fGridJDL->AddToSet("Output", Form("%s@%s",os->GetString().Data(), fCloseSE.Data()));
else
- fGridJDL->AddToOutputSandbox(os->GetString(), comment);
- first = kFALSE;
+ fGridJDL->AddToSet("Output", os->GetString());
+ if (first) fGridJDL->AddToSetDescription("Output", comment);
if (fMergeExcludes.Contains(sout)) continue;
if (!os->GetString().Contains("@") && fCloseSE.Length())
- fMergingJDL->AddToOutputSandbox(Form("%s@%s",os->GetString().Data(), fCloseSE.Data()), comment);
+ fMergingJDL->AddToSet("Output", Form("%s@%s",os->GetString().Data(), fCloseSE.Data()));
else
- fMergingJDL->AddToOutputSandbox(os->GetString(), comment);
+ fMergingJDL->AddToSet("Output", os->GetString());
+ if (first) fMergingJDL->AddToSetDescription("Output", comment);
+ first = kFALSE;
}
delete arr;
fGridJDL->SetPrice((UInt_t)fPrice, "AliEn price for this job");
}
TString sjdl2 = fMergingJDL->Generate();
Int_t index, index1;
- sjdl.ReplaceAll("\"LF:", "\n \"LF:");
+ sjdl.ReplaceAll("\",\"", "\",\n \"");
sjdl.ReplaceAll("(member", "\n (member");
sjdl.ReplaceAll("\",\"VO_", "\",\n \"VO_");
sjdl.ReplaceAll("{", "{\n ");
sjdl.ReplaceAll("{\n \n", "{\n");
sjdl.ReplaceAll("\n\n", "\n");
sjdl.ReplaceAll("OutputDirectory", "OutputDir");
- sjdl1.ReplaceAll("\"LF:", "\n \"LF:");
+ sjdl1.ReplaceAll("\",\"", "\",\n \"");
sjdl1.ReplaceAll("(member", "\n (member");
sjdl1.ReplaceAll("\",\"VO_", "\",\n \"VO_");
sjdl1.ReplaceAll("{", "{\n ");
sjdl1.ReplaceAll("{\n \n", "{\n");
sjdl1.ReplaceAll("\n\n", "\n");
sjdl1.ReplaceAll("OutputDirectory", "OutputDir");
- sjdl2.ReplaceAll("\"LF:", "\n \"LF:");
+ sjdl2.ReplaceAll("\",\"", "\",\n \"");
sjdl2.ReplaceAll("(member", "\n (member");
sjdl2.ReplaceAll("\",\"VO_", "\",\n \"VO_");
sjdl2.ReplaceAll("{", "{\n ");
in.open(fFileForTestMode);
Int_t count = 0;
// Read the input list of files and add them to the chain
- TString line;
- TChain *chain = new TChain(treeName);
- while (in.good())
- {
+ TString line;
+ TString streeName(treeName);
+ if (IsUseMCchain()) streeName = "TE";
+ TChain *chain = new TChain(streeName);
+ TChain *chainFriend = 0;
+ if (!fFriendChainName.IsNull()) chainFriend = new TChain(streeName);
+ while (in.good())
+ {
in >> line;
- if (line.IsNull()) continue;
+ if (line.IsNull() || line.BeginsWith("#")) continue;
if (count++ == fNtestFiles) break;
TString esdFile(line);
TFile *file = TFile::Open(esdFile);
- if (file) {
- if (!file->IsZombie()) chain->Add(esdFile);
+ if (file && !file->IsZombie()) {
+ chain->Add(esdFile);
file->Close();
+ if (!fFriendChainName.IsNull()) {
+ if (esdFile.Index("#") > -1)
+ esdFile.Remove(esdFile.Index("#"));
+ esdFile = gSystem->DirName(esdFile);
+ esdFile += "/" + fFriendChainName;
+ file = TFile::Open(esdFile);
+ if (file && !file->IsZombie()) {
+ file->Close();
+ chainFriend->Add(esdFile);
+ } else {
+ Fatal("GetChainForTestMode", "Cannot open friend file: %s", esdFile.Data());
+ return 0;
+ }
+ }
} else {
Error("GetChainforTestMode", "Skipping un-openable file: %s", esdFile.Data());
}
- }
- in.close();
- if (!chain->GetListOfFiles()->GetEntries()) {
+ }
+ in.close();
+ if (!chain->GetListOfFiles()->GetEntries()) {
Error("GetChainForTestMode", "No file from %s could be opened", fFileForTestMode.Data());
delete chain;
+ delete chainFriend;
return NULL;
- }
+ }
// chain->ls();
- return chain;
+ if (!fFriendChainName.IsNull()) chain->AddFriend(chainFriend);
+ return chain;
}
//______________________________________________________________________________
printf("= Soft reset signal will be send to master______ CHANGE BEHAVIOR AFTER COMPLETION\n");
if (fProofReset>1)
printf("= Hard reset signal will be send to master______ CHANGE BEHAVIOR AFTER COMPLETION\n");
- if (!fRootVersionForProof.IsNull())
- printf("= ROOT version requested________________________ %s\n", fRootVersionForProof.Data());
+ if (!fROOTVersion.IsNull())
+ printf("= ROOT version requested________________________ %s\n", fROOTVersion.Data());
else
printf("= ROOT version requested________________________ default\n");
printf("= AliRoot version requested_____________________ %s\n", fAliROOTVersion.Data());
printf("= List of output files to be registered: _______ %s\n", fOutputFiles.Data());
printf("= List of outputs going to be archived: ________ %s\n", fOutputArchive.Data());
printf("= List of outputs that should not be merged: ___ %s\n", fMergeExcludes.Data());
+ printf("= List of outputs that should not be registered: %s\n", fRegisterExcludes.Data());
printf("= List of outputs produced during Terminate: ___ %s\n", fTerminateFiles.Data());
printf("=====================================================================\n");
printf("= Job price: ___________________________________ %d\n", fPrice);
fMaxMergeFiles = 100;
fRunNumbers = "";
fExecutable = "analysis.sh";
- fExecutableCommand = "root -b -q";
+ fExecutableCommand = "root -b -q -x";
fArguments = "";
fExecutableArgs = "";
fAnalysisMacro = "myAnalysis.C";
fOverwriteMode = 1;
}
+//______________________________________________________________________________
+void AliAnalysisAlien::SetRootVersionForProof(const char *version)
+{
+// Obsolete method. Use SetROOTVersion instead
+ Warning("SetRootVersionForProof", "Obsolete. Use SetROOTVersion instead");
+ if (fROOTVersion.IsNull()) SetROOTVersion(version);
+ else Error("SetRootVersionForProof", "ROOT version already set to %s", fROOTVersion.Data());
+}
+
//______________________________________________________________________________
Bool_t AliAnalysisAlien::CheckMergedFiles(const char *filename, const char *aliendir, Int_t nperchunk, const char *jdl)
{
// Check if this is the last stage to be done.
Bool_t laststage = (nfiles<nperchunk);
if (fMaxMergeStages && stage>=fMaxMergeStages) laststage = kTRUE;
+ Int_t jobId = 0;
if (laststage) {
printf("### Submiting final merging stage %d\n", stage);
TString finalJDL = jdl;
finalJDL.ReplaceAll(".jdl", "_final.jdl");
TString query = Form("submit %s %s %d", finalJDL.Data(), aliendir, stage);
- Int_t jobId = SubmitSingleJob(query);
- if (!jobId) return kFALSE;
+ jobId = SubmitSingleJob(query);
} else {
printf("### Submiting merging stage %d\n", stage);
TString query = Form("submit %s %s %d", jdl, aliendir, stage);
- Int_t jobId = SubmitSingleJob(query);
- if (!jobId) return kFALSE;
+ jobId = SubmitSingleJob(query);
}
+ if (!jobId) return kFALSE;
+
+ if (!fGridJobIDs.IsNull()) fGridJobIDs.Append(" ");
+ fGridJobIDs.Append(Form("%d", jobId));
+ if (!fGridStages.IsNull()) fGridStages.Append(" ");
+ fGridStages.Append(Form("%s_merge_stage%d",
+ laststage ? "final" : "partial", stage));
+
return kTRUE;
}
::Error("SubmitSingleJob", "Your query %s could not be submitted", query);
return 0;
}
- printf(" Job id: %s\n", jobId.Data());
- return atoi(jobId);
+ Int_t ijobId = jobId.Atoi();
+ printf(" Job id: '%s' (%d)\n", jobId.Data(), ijobId);
+ return ijobId;
}
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::MergeInfo(const char *output, const char *collection)
+{
+// Merges a collection of output files using concatenation.
+ TString scoll(collection);
+ if (!scoll.Contains(".xml")) return kFALSE;
+ TGridCollection *coll = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\");", collection));
+ if (!coll) {
+ ::Error("MergeInfo", "Input XML %s collection empty.", collection);
+ return kFALSE;
+ }
+ // Iterate grid collection
+ TString outtmp;
+ Bool_t merged = kFALSE;
+ Int_t ifile = 0;
+ while (coll->Next()) {
+ TString fname = gSystem->DirName(coll->GetTURL());
+ fname += "/";
+ fname += output;
+ outtmp = Form("%d_%s", ifile, output);
+ if (!TFile::Cp(fname, outtmp)) {
+ ::Error("MergeInfo", "Could not copy %s", fname.Data());
+ continue;
+ }
+ ifile++;
+ if (ifile<2) {
+ gSystem->Exec(Form("cp %s lastmerged", outtmp.Data()));
+ continue;
+ }
+ gSystem->Exec(Form("cat lastmerged %s > tempmerged", outtmp.Data()));
+ gSystem->Exec("cp tempmerged lastmerged");
+ }
+ if (ifile) {
+ gSystem->Exec(Form("cp lastmerged %s", output));
+ gSystem->Exec(Form("rm tempmerged lastmerged *_%s", output));
+ merged = kTRUE;
+ }
+ return merged;
+}
+
//______________________________________________________________________________
Bool_t AliAnalysisAlien::MergeOutput(const char *output, const char *basedir, Int_t nmaxmerge, Int_t stage)
{
Int_t countChunk = 0;
Int_t countZero = nmaxmerge;
Bool_t merged = kTRUE;
+ Bool_t isGrid = kTRUE;
Int_t index = outputFile.Index("@");
if (index > 0) outputFile.Remove(index);
TString inputFile = outputFile;
fname += inputFile;
listoffiles->Add(new TNamed(fname.Data(),""));
}
+ } else if (sbasedir.Contains(".txt")) {
+ // The file having the .txt extension is expected to contain a list of
+ // folders where the output files will be looked. For alien folders,
+ // the full folder LFN is expected (starting with alien://)
+ // Assume lfn's on each line
+ TString line;
+ ifstream in;
+ in.open(sbasedir);
+ if (in.fail()) {
+ ::Error("MergeOutput", "File %s cannot be opened. Merging stopped." ,sbasedir.Data());
+ return kTRUE;
+ }
+ Int_t nfiles = 0;
+ while (in.good()) {
+ in >> line;
+ if (line.IsNull() || line.BeginsWith("#")) continue;
+ line.Strip();
+ if (!line.Contains("alien:")) isGrid = kFALSE;
+ line += "/";
+ line += outputFile;
+ nfiles++;
+ listoffiles->Add(new TNamed(line.Data(),""));
+ }
+ in.close();
+ if (!nfiles) {
+ ::Error("MergeOutput","Input file %s contains no files to be merged\n", sbasedir.Data());
+ delete listoffiles;
+ return kFALSE;
+ }
} else {
command = Form("find %s/ *%s", basedir, inputFile.Data());
printf("command: %s\n", command.Data());
// 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(kTRUE);
+ fm = new TFileMerger(isGrid);
fm->SetFastMethod(kTRUE);
if (previousChunk.Length()) fm->AddFile(previousChunk.Data());
outputChunk = outputFile;
}
// Merging stage different than 0.
// Move to the begining of the requested chunk.
- fm = new TFileMerger(kTRUE);
+ fm = new TFileMerger(isGrid);
fm->SetFastMethod(kTRUE);
while ((nextfile=next())) fm->AddFile(nextfile->GetName());
delete listoffiles;
gSystem->Exec(Form("rm -f %s", outputChunk.Data()));
}
}
- if (fMergeExcludes.Length() &&
- fMergeExcludes.Contains(outputFile.Data())) continue;
+ if (fMergeExcludes.Contains(outputFile.Data()) ||
+ fRegisterExcludes.Contains(outputFile.Data())) continue;
// Perform a 'find' command in the output directory, looking for registered outputs
merged = MergeOutput(outputFile, fGridOutputDir, fMaxMergeFiles);
if (!merged) {
Error("MergeOutputs", "Terminate() will NOT be executed");
- return kFALSE;
+ delete list;
+ return kFALSE;
}
TFile *fileOpened = (TFile*)gROOT->GetListOfFiles()->FindObject(outputFile);
if (fileOpened) fileOpened->Close();
}
+ delete list;
return kTRUE;
}
}
}
// Do we need to change the ROOT version ? The success of this cannot be checked.
- if (!fRootVersionForProof.IsNull() && !testMode) {
- gROOT->ProcessLine(Form("TProof::Mgr(\"%s\")->SetROOTVersion(\"%s\");",
- fProofCluster.Data(), fRootVersionForProof.Data()));
+ if (!fROOTVersion.IsNull() && !testMode) {
+ gROOT->ProcessLine(Form("TProof::Mgr(\"%s\")->SetROOTVersion(\"VO_ALICE@ROOT::%s\");",
+ fProofCluster.Data(), fROOTVersion.Data()));
}
// Connect to PROOF and check the status
Long_t proof = 0;
}
// Compose the output archive.
fOutputArchive = "log_archive.zip:std*@disk=1 ";
- fOutputArchive += Form("root_archive.zip:%s,*.stat@disk=%d",fOutputFiles.Data(),fNreplicas);
+ if (mgr->IsCollectThroughput())
+ fOutputArchive += Form("root_archive.zip:%s,*.stat@disk=%d %s@disk=%d",fOutputFiles.Data(),fNreplicas, mgr->GetFileInfoLog(),fNreplicas);
+ else
+ fOutputArchive += Form("root_archive.zip:%s,*.stat@disk=%d",fOutputFiles.Data(),fNreplicas);
}
// if (!fCloseSE.Length()) fCloseSE = gSystem->Getenv("alien_CLOSE_SE");
if (TestBit(AliAnalysisGrid::kOffline)) {
}
// Check if submitting is managed by LPM manager
if (fProductionMode) {
- TString prodfile = fJDLName;
- prodfile.ReplaceAll(".jdl", ".prod");
- WriteProductionFile(prodfile);
+ //TString prodfile = fJDLName;
+ //prodfile.ReplaceAll(".jdl", ".prod");
+ //WriteProductionFile(prodfile);
Info("StartAnalysis", "Job submitting is managed by LPM. Rerun in terminate mode after jobs finished.");
return kFALSE;
}
gGrid->Cd(fGridOutputDir);
TGridResult *res;
TString jobID = "";
+ fGridJobIDs = "";
+ fGridStages = "";
if (!fRunNumbers.Length() && !fRunRange[0]) {
// Submit a given xml or a set of runs
res = gGrid->Command(Form("submit %s", fJDLName.Data()));
\n_______________________________________________________________________",
fJDLName.Data(), cjobId);
jobID = cjobId;
+ if (jobID.Atoi()) {
+ if (!fGridJobIDs.IsNull()) fGridJobIDs.Append(" ");
+ fGridJobIDs.Append(jobID);
+ if (!fGridStages.IsNull()) fGridStages.Append(" ");
+ fGridStages.Append("full");
+ }
}
delete res;
} else {
} else {
// Submit for a range of enumeration of runs.
if (!Submit()) return kFALSE;
+ jobID = fGridJobIDs;
}
- Info("StartAnalysis", "\n#### STARTING AN ALIEN SHELL FOR YOU. EXIT WHEN YOUR JOB %s HAS FINISHED. #### \
- \n You may exit at any time and terminate the job later using the option <terminate> \
- \n ##################################################################################", jobID.Data());
- gSystem->Exec("aliensh");
+ if (fDropToShell) {
+ Info("StartAnalysis", "\n#### STARTING AN ALIEN SHELL FOR YOU. EXIT WHEN YOUR JOB %s HAS FINISHED. #### \
+ \n You may exit at any time and terminate the job later using the option <terminate> \
+ \n ##################################################################################", jobID.Data());
+ gSystem->Exec("aliensh");
+ } else {
+ Info("StartAnalysis", "\n#### SUBMITTED JOB %s TO ALIEN QUEUE #### \
+ \n Remember to terminate the job later using the option <terminate> \
+ \n ##################################################################################", jobID.Data());
+ }
return kTRUE;
}
outputFile = str->GetString();
Int_t index = outputFile.Index("@");
if (index > 0) outputFile.Remove(index);
- if (!fMergeExcludes.Contains(outputFile)) break;
+ if (!fMergeExcludes.Contains(outputFile) &&
+ !fRegisterExcludes.Contains(outputFile)) break;
}
delete list;
Bool_t done = CheckMergedFiles(outputFile, runOutDir, fMaxMergeFiles, mergeJDLName);
if (!fRunNumbers.Length() && !fRunRange[0]) break;
}
if (!ntosubmit) return kTRUE;
- Info("StartAnalysis", "\n #### STARTING AN ALIEN SHELL FOR YOU. You can exit any time or inspect your jobs in a different shell.##########\
- \n Make sure your jobs are in a final state (you can resubmit failed ones via 'masterjob <id> resubmit ERROR_ALL')\
- \n Rerun in 'terminate' mode to submit all merging stages, each AFTER the previous one completed. The final merged \
- \n output will be written to your alien output directory, while separate stages in <Stage_n>. \
- \n ################################################################################################################");
- gSystem->Exec("aliensh");
+ if (fDropToShell) {
+ Info("StartAnalysis", "\n #### STARTING AN ALIEN SHELL FOR YOU. You can exit any time or inspect your jobs in a different shell.##########\
+ \n Make sure your jobs are in a final state (you can resubmit failed ones via 'masterjob <id> resubmit ERROR_ALL')\
+ \n Rerun in 'terminate' mode to submit all merging stages, each AFTER the previous one completed. The final merged \
+ \n output will be written to your alien output directory, while separate stages in <Stage_n>. \
+ \n ################################################################################################################");
+ gSystem->Exec("aliensh");
+ } else {
+ Info("StartAnalysis", "\n #### STARTED MERGING JOBS FOR YOU #### \
+ \n Make sure your jobs are in a final state (you can resubmit failed ones via 'masterjob <id> resubmit ERROR_ALL') \
+ \n Rerun in 'terminate' mode to submit all merging stages, each AFTER the previous one completed. The final merged \
+ \n output will be written to your alien output directory, while separate stages in <Stage_n>. \
+ \n ################################################################################################################");
+ }
return kTRUE;
}
\n##### Your JDL %s submitted (%d to go). \nTHE JOB ID IS: %s \
\n_______________________________________________________________________",
fJDLName.Data(), nmasterjobs-fNsubmitted-1, cjobId1.Data());
+ if (!fGridJobIDs.IsNull()) fGridJobIDs.Append(" ");
+ fGridJobIDs.Append(cjobId1);
+ if (!fGridStages.IsNull()) fGridStages.Append(" ");
+ fGridStages.Append("full");
jobID += cjobId1;
jobID += " ";
lastmaster = cjobId1.Atoi();
out << " TStopwatch timer;" << endl;
out << " timer.Start();" << endl << endl;
// Change temp directory to current one
+ if (!IsLocalTest()) {
+ out << "// connect to AliEn and make the chain" << endl;
+ out << " if (!TGrid::Connect(\"alien://\")) return;" << endl;
+ }
out << "// Set temporary merging directory to current one" << endl;
out << " gSystem->Setenv(\"TMPDIR\", gSystem->pwd());" << endl << endl;
out << "// Set temporary compilation directory to current one" << endl;
out << " gEnv->SetValue(\"XNet.ReconnectTimeout\",50);" << endl;
out << " gEnv->SetValue(\"XNet.FirstConnectMaxCnt\",1);" << endl << endl;
}
- if (!IsLocalTest()) {
- out << "// connect to AliEn and make the chain" << endl;
- out << " if (!TGrid::Connect(\"alien://\")) return;" << endl;
- }
out << "// read the analysis manager from file" << endl;
TString analysisFile = fExecutable;
analysisFile.ReplaceAll(".sh", ".root");
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;
+ if (!fFriendChainName.IsNull())
+ out << " plugin->SetFriendChainName(\"" << fFriendChainName << "\");" << endl;
+ if (IsUseMCchain())
+ out << " plugin->SetUseMCchain();" << 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()) {
out << " chain->Add(filename);" << endl;
if(fFriendChainName!="") {
out << " TString fileFriend=coll->GetTURL(\"\");" << endl;
- out << " fileFriend.ReplaceAll(\"AliAOD.root\",\""<<fFriendChainName.Data()<<"\");" << endl;
- out << " fileFriend.ReplaceAll(\"AliAODs.root\",\""<<fFriendChainName.Data()<<"\");" << endl;
- out << " chainFriend->Add(fileFriend.Data());" << endl;
+ out << " if (fileFriend.Index(\"#\") > -1) fileFriend.Remove(fileFriend.Index(\"#\"));" << endl;
+ out << " fileFriend = gSystem->DirName(fileFriend);" << endl;
+ out << " fileFriend += \"/\";" << endl;
+ out << " fileFriend += \"" << fFriendChainName << "\";";
+ out << " TFile *file = TFile::Open(fileFriend);" << endl;
+ out << " if (file) {" << endl;
+ out << " file->Close();" << endl;
+ out << " chainFriend->Add(fileFriend.Data());" << endl;
+ out << " } else {" << endl;
+ out << " ::Fatal(\"CreateChain\", \"Cannot open friend file: %s\", fileFriend.Data());" << endl;
+ out << " return 0;" << endl;
+ out << " }" << endl;
}
out << " }" << endl;
out << " if (!chain->GetNtrees()) {" << endl;
Error("WriteMergingMacro", "No output file names defined. Are you running the right AliAnalysisAlien configuration ?");
return;
}
+ AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
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);
out << " gEnv->SetValue(\"XNet.FirstConnectMaxCnt\",1);" << endl << endl;
}
// Change temp directory to current one
+ out << "// Connect to AliEn" << endl;
+ out << " if (!TGrid::Connect(\"alien://\")) return;" << endl;
out << "// Set temporary merging directory to current one" << endl;
out << " gSystem->Setenv(\"TMPDIR\", gSystem->pwd());" << endl << endl;
out << "// Set temporary compilation directory to current one" << endl;
out << " gSystem->SetBuildDir(gSystem->pwd(), kTRUE);" << endl << endl;
- out << "// Connect to AliEn" << endl;
- out << " if (!TGrid::Connect(\"alien://\")) return;" << endl;
out << " TString outputDir = dir;" << endl;
out << " TString outputFiles = \"" << GetListOfFiles("out") << "\";" << endl;
- out << " TString mergeExcludes = \"" << fMergeExcludes << "\";" << endl;
+ out << " TString mergeExcludes = \"" << fMergeExcludes << " " << fRegisterExcludes << "\";" << endl;
out << " TObjArray *list = outputFiles.Tokenize(\",\");" << endl;
out << " TIter *iter = new TIter(list);" << endl;
out << " TObjString *str;" << endl;
out << " TString outputFile;" << endl;
out << " Bool_t merged = kTRUE;" << endl;
+ TString analysisFile = fExecutable;
+ analysisFile.ReplaceAll(".sh", ".root");
+ out << " AliAnalysisManager *mgr = AliAnalysisAlien::LoadAnalysisManager(\""
+ << analysisFile << "\");" << endl;
+ out << " if (!mgr) {" << endl;
+ out << " printf(\"ERROR: Analysis manager could not be extracted from file \");" << endl;
+ out << " return;" << endl;
+ out << " }" << endl;
+ if (IsLocalTest()) {
+ out << " printf(\"===================================\n\");" << endl;
+ out << " printf(\"Testing merging...\\n\");" << endl;
+ out << " printf(\"===================================\n\");" << endl;
+ }
out << " while((str=(TObjString*)iter->Next())) {" << endl;
out << " outputFile = str->GetString();" << endl;
out << " if (outputFile.Contains(\"*\")) continue;" << endl;
out << " if (index > 0) outputFile.Remove(index);" << endl;
out << " // Skip already merged outputs" << endl;
out << " if (!gSystem->AccessPathName(outputFile)) {" << endl;
- out << " printf(\"Output file <%s> found. Not merging again.\",outputFile.Data());" << endl;
+ out << " printf(\"Output file <%s> found. Not merging again.\\n\",outputFile.Data());" << endl;
out << " continue;" << endl;
out << " }" << endl;
out << " if (mergeExcludes.Contains(outputFile.Data())) continue;" << endl;
out << " return;" << endl;
out << " }" << endl;
out << " }" << endl;
+ if (mgr && mgr->IsCollectThroughput() && !IsLocalTest()) {
+ out << " TString infolog = \"" << mgr->GetFileInfoLog() << "\";" << endl;
+ out << " AliAnalysisAlien::MergeInfo(infolog, outputDir);" << endl;
+ }
out << " // all outputs merged, validate" << endl;
out << " ofstream out;" << endl;
out << " out.open(\"outputs_valid\", ios::out);" << endl;
out << " out.close();" << endl;
out << " // read the analysis manager from file" << endl;
- TString analysisFile = fExecutable;
- analysisFile.ReplaceAll(".sh", ".root");
- out << " if (!outputDir.Contains(\"Stage\")) return;" << endl;
- out << " AliAnalysisManager *mgr = AliAnalysisAlien::LoadAnalysisManager(\""
- << analysisFile << "\");" << endl;
- out << " if (!mgr) return;" << endl;
+ if (IsLocalTest()) {
+ out << " printf(\"===================================\n\");" << endl;
+ out << " printf(\"Testing Terminate()...\\n\");" << endl;
+ out << " printf(\"===================================\n\");" << endl;
+ } else {
+ out << " if (!outputDir.Contains(\"Stage\")) return;" << endl;
+ }
out << " mgr->SetRunFromPath(mgr->GetRunFromAlienPath(dir));" << endl;
out << " mgr->SetSkipTerminate(kFALSE);" << endl;
out << " mgr->PrintStatus();" << endl;
- if (AliAnalysisManager::GetAnalysisManager()) {
- if (AliAnalysisManager::GetAnalysisManager()->GetDebugLevel()>3) {
+ if (mgr) {
+ if (mgr->GetDebugLevel()>3) {
out << " gEnv->SetValue(\"XNet.Debug\", \"1\");" << endl;
} else {
if (TestBit(AliAnalysisGrid::kTest))
void AliAnalysisAlien::WriteExecutable()
{
// Generate the alien executable script.
+ // Patch executable with -x to catch error code
+ if (fExecutableCommand.Contains("root") &&
+ fExecutableCommand.Contains("-q") &&
+ !fExecutableCommand.Contains("-x")) fExecutableCommand += " -x";
if (!TestBit(AliAnalysisGrid::kSubmit)) {
ofstream out;
out.open(fExecutable.Data(), ios::out);
out << "free -m" << endl;
out << "echo \"=========================================\"" << endl << endl;
out << fExecutableCommand << " ";
- out << fAnalysisMacro.Data() << " " << fExecutableArgs.Data() << endl << endl;
- out << "echo \"======== " << fAnalysisMacro.Data() << " finished with exit code: $? ========\"" << endl;
+ out << fAnalysisMacro.Data() << " " << fExecutableArgs.Data() << endl;
+ out << "RET=$?" << endl;
+ out << "if [ \"$RET\" != \"0\" ];then" << endl;
+ out << " echo \"======== ERROR : " << fAnalysisMacro.Data() << " finished with NON zero code: $RET ========\"" << endl;
+ out << " if [ \"$RET\" -gt 128 ] && [ \"$RET\" -lt 160 ]; then"<<endl;
+ out << " let sig=\"$RET - 128\""<<endl;
+ out << " sigs='HUP INT QUIT ILL TRAP ABRT BUS FPE"<<endl;
+ out << " KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT"<<endl;
+ out << " CHLD CONT STOP TSTP TTIN TTOU URG XCPU"<<endl;
+ out << " XFSZ VTALRM PROF WINCH IO PWR SYS'"<<endl;
+ out << " sig=SIG`echo $sigs | awk '{ print $'\"$sig\"' }'`"<<endl;
+ out << " echo \"======== it appears to have been killed with signal: $sig ========\""<<endl;
+ out << " fi"<<endl;
+ out << " exit $RET"<< endl;
+ out << "fi" << endl << endl ;
+ out << "echo \"======== " << fAnalysisMacro.Data() << " finished with exit code: $RET ========\"" << endl;
out << "echo \"############## memory after: ##############\"" << endl;
out << "free -m" << endl;
}
else
out << "export ARG=\"" << mergeMacro << "(\\\"$1\\\",$2)\"" << endl;
out << fExecutableCommand << " " << "$ARG" << endl;
+ out << "RET=$?" << endl;
+ out << "if [ \"$RET\" != \"0\" ];then" << endl;
+ out << " echo \"======== ERROR : " << fAnalysisMacro.Data() << " finished with NON zero code: $RET ========\"" << endl;
+ out << " if [ \"$RET\" -gt 128 ] && [ \"$RET\" -lt 160 ]; then"<<endl;
+ out << " let sig=\"$RET - 128\""<<endl;
+ out << " sigs='HUP INT QUIT ILL TRAP ABRT BUS FPE"<<endl;
+ out << " KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT"<<endl;
+ out << " CHLD CONT STOP TSTP TTIN TTOU URG XCPU"<<endl;
+ out << " XFSZ VTALRM PROF WINCH IO PWR SYS'"<<endl;
+ out << " sig=SIG`echo $sigs | awk '{ print $'\"$sig\"' }'`"<<endl;
+ out << " echo \"======== it appears to have been killed with signal: $sig ========\""<<endl;
+ out << " fi"<<endl;
+ out << " exit $RET"<< endl;
+ out << "fi" << endl << endl ;
out << "echo \"======== " << mergeMacro.Data() << " finished with exit code: $? ========\"" << endl;
out << "echo \"############## memory after: ##############\"" << endl;
out << "free -m" << endl;