#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(),
fJDLName(),
fTerminateFiles(),
fMergeExcludes(),
+ fRegisterExcludes(),
fIncludePath(),
fCloseSE(),
fFriendChainName(),
fJDLName(other.fJDLName),
fTerminateFiles(other.fTerminateFiles),
fMergeExcludes(other.fMergeExcludes),
+ fRegisterExcludes(other.fRegisterExcludes),
fIncludePath(other.fIncludePath),
fCloseSE(other.fCloseSE),
fFriendChainName(other.fFriendChainName),
fJDLName = other.fJDLName;
fTerminateFiles = other.fTerminateFiles;
fMergeExcludes = other.fMergeExcludes;
+ fRegisterExcludes = other.fRegisterExcludes;
fIncludePath = other.fIncludePath;
fCloseSE = other.fCloseSE;
fFriendChainName = other.fFriendChainName;
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 ");
+// 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;
}
}
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";
}
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,*%s@disk=%d",files.Data(),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
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);
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("= 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);
}
// 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.
return atoi(jobId);
}
+//______________________________________________________________________________
+Bool_t AliAnalysisAlien::MergeInfo(const char *output, const char *collection)
+{
+// Merges a collection of output files using concatenation.
+ 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)
{
fname += inputFile;
listoffiles->Add(new TNamed(fname.Data(),""));
}
+ } else if (sbasedir.Contains(".txt")) {
+ // Assume lfn's on each line
+ TString line;
+ ifstream in;
+ in.open(sbasedir);
+ Int_t nfiles = 0;
+ while (in.good()) {
+ in >> line;
+ if (line.IsNull() || line.BeginsWith("#")) continue;
+ nfiles++;
+ listoffiles->Add(new TNamed(line.Data(),""));
+ }
+ 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(kFALSE);
+ fm = new TFileMerger(kTRUE);
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(kFALSE);
+ fm = new TFileMerger(kTRUE);
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) {
}
// 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,*%s@disk=%d",fOutputFiles.Data(),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;
}
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);
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");
}
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;
out << " while((str=(TObjString*)iter->Next())) {" << endl;
out << " outputFile = str->GetString();" << endl;
out << " if (outputFile.Contains(\"*\")) continue;" << endl;
out << " return;" << endl;
out << " }" << endl;
out << " }" << endl;
+ if (mgr && mgr->IsCollectThroughput()) {
+ 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;
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))
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;