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",
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();
{
// 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)
+Bool_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 kFALSE;
}
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);
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;
+ }
}
}
gSystem->ChangeDirectory(cdir);
delete res;
+ if (additionalArchives)
+ delete additionalArchives;
return kTRUE;
}
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()),"");
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;
+ TChain *chain = new TChain(treeName);
+ TChain *chainFriend = 0;
+ if (!fFriendChainName.IsNull()) chainFriend = new TChain(treeName);
+ while (in.good())
+ {
in >> line;
if (line.IsNull()) 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()) {
+ esdFile.ReplaceAll("AliAOD.root", fFriendChainName.Data());
+ esdFile.ReplaceAll("AliAODs.root", fFriendChainName.Data());
+ 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);
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) {
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 (IsLocalTest()) {
out << " AliAnalysisAlien *plugin = new AliAnalysisAlien();" << endl;
out << " plugin->SetRunMode(\"test\");" << endl;
- out << " plugin->SetFileForTestMode(\"data.txt\");" << endl;
+ if (fFileForTestMode.IsNull())
+ out << " plugin->SetFileForTestMode(\"data.txt\");" << endl;
+ else
+ out << " plugin->SetFileForTestMode(\"" << fFileForTestMode << "\");" << endl;
+ out << " plugin->SetNtestFiles(" << fNtestFiles << ");" << endl;
out << " mgr->SetGridHandler(plugin);" << endl;
- out << " mgr->SetDebugLevel(10);" << endl;
- out << " mgr->SetNSysInfo(100);" << endl;
+ if (AliAnalysisManager::GetAnalysisManager()) {
+ out << " mgr->SetDebugLevel(" << AliAnalysisManager::GetAnalysisManager()->GetDebugLevel() << ");" << endl;
+ out << " mgr->SetNSysInfo(" << AliAnalysisManager::GetAnalysisManager()->GetNsysInfo() << ");" << endl;
+ } else {
+ out << " mgr->SetDebugLevel(10);" << endl;
+ out << " mgr->SetNSysInfo(100);" << endl;
+ }
}
out << " mgr->PrintStatus();" << endl;
if (AliAnalysisManager::GetAnalysisManager()) {
}
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 << " 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 << "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;