From 685fea75e491c19fcff59b7efe8595801064fe55 Mon Sep 17 00:00:00 2001 From: prino Date: Wed, 19 Sep 2012 16:09:26 +0000 Subject: [PATCH] support for par files, multiple tasks, and collection of local AODs (Matthias) --- PWGHF/correlationHF/macros/run-single-task.C | 91 ++++++++++++++++---- PWGHF/correlationHF/macros/setupDxHFE.C | 31 ++++--- 2 files changed, 93 insertions(+), 29 deletions(-) diff --git a/PWGHF/correlationHF/macros/run-single-task.C b/PWGHF/correlationHF/macros/run-single-task.C index f3a19c12e91..34ea92b8951 100644 --- a/PWGHF/correlationHF/macros/run-single-task.C +++ b/PWGHF/correlationHF/macros/run-single-task.C @@ -85,7 +85,7 @@ void ErrorConfigurationFile(const char* fileName); void run_single_task(const char* mode, const char* input, - const char* taskname, + const char* tasknames, const char* analysisName=defaultAnalysisName, Bool_t useMC=kFALSE, int nevents=-1, @@ -221,25 +221,58 @@ void run_single_task(const char* mode, delete pTokens; } - bool bCreateAndAddTask=true; - TString taskSource=taskname; - TString taskHeader=taskname; + TString taskNames=tasknames; + TString taskClasses=""; + TString taskSources=""; + TString taskHeaders=""; + TString addTaskMacros=""; + TString parPackages=""; + TObjArray* pTaskNames=taskNames.Tokenize(" "); + if (pTaskNames) { + for (int iTaskName=0; iTaskNameGetEntriesFast(); iTaskName++) { + TString taskSource=pTaskNames->At(iTaskName)->GetName(); + TString taskHeader=pTaskNames->At(iTaskName)->GetName(); + bool bIsAddTask=false; if (taskSource.EndsWith(".C")) { // suppose that's an 'AddTask' macro taskHeader=""; - bCreateAndAddTask=false; + bIsAddTask=true; + } else if (taskSource.EndsWith(".par")) { + // par file + if (gSystem->AccessPathName(taskSource)!=0) { + ::Error("run_single_task", Form("par file '%s' not found in current directory, you might want to set a symbolic link", taskSource.Data())); + return; + } + parPackages+=" "; + parPackages+=taskSource; + continue; } else if (taskSource.EndsWith(".h")) { - taskSource.ReplaceAll(".h", ".cxx"); + taskSource.ReplaceAll(".h", ""); + taskClasses+=" "; + taskClasses+=taskSource; + taskSource+=".cxx"; } else if (taskSource.EndsWith(".cxx")) { - taskHeader.ReplaceAll(".cxx", ".h"); + taskHeader.ReplaceAll(".cxx", ""); + taskClasses+=" "; + taskClasses+=taskHeader; + taskHeader+=".h"; } else { + taskClasses+=" "; + taskClasses+=taskSource; taskSource+=".cxx"; taskHeader+=".h"; } TString dependencyHeader; TString dependencySource; + if (gSystem->AccessPathName(taskHeader)==0) { GetIncludeHeaders(taskHeader, dependencyHeader, libraries); + taskHeaders+=" "; taskHeaders+=taskHeader; + } + if (gSystem->AccessPathName(taskSource)==0) { GetIncludeHeaders(taskSource, dependencyHeader, libraries); + if (!bIsAddTask) {taskSources+=" "; taskSources+=taskSource;} + else {addTaskMacros+=" "; addTaskMacros+=taskSource;} + } TObjArray* pTokens=dependencyHeader.Tokenize(" "); if (pTokens) { for (int i=0; iGetEntriesFast(); i++) { @@ -255,10 +288,15 @@ void run_single_task(const char* mode, } dependencySource.ReplaceAll(taskSource, ""); dependencyHeader.ReplaceAll(taskHeader, ""); - cout << "Task files: " << taskSource << " " << taskHeader << endl; + } + delete pTaskNames; + } + cout << "Tasks: " << taskClasses << endl; + cout << "Task files: " << taskSources << addTaskMacros << taskHeaders << endl; cout << "Dependency classes: " << dependencySource << endl; cout << "Dependency headers: " << dependencyHeader << endl; cout << "Dependency libraries: " << libraries << endl; + cout << "Packages: " << parPackages << endl; /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -347,6 +385,14 @@ void run_single_task(const char* mode, alienHandler->SetDataPattern(dataPattern); alienHandler->SetFriendChainName(friendDataPattern); + TObjArray* packageTokens=parPackages.Tokenize(" " ); + if (packageTokens) { + for (int iPackageToken=0; iPackageTokenGetEntriesFast(); iPackageToken++) { + alienHandler->EnablePackage(packageTokens->At(iPackageToken)->GetName()); + } + delete packageTokens; + } + if (!useMC) alienHandler->SetRunPrefix("000"); // real data @@ -377,8 +423,8 @@ void run_single_task(const char* mode, alienHandler->AddIncludePath(strIncludePath); // Note: there is no extra source or header file to be transferred if 'AddTask' macros are used - alienHandler->SetAnalysisSource(Form("%s %s %s %s", dependencySource.Data(), dependencyHeader.Data(), (bCreateAndAddTask)?taskSource.Data():"", taskHeader.Data())); - alienHandler->SetAdditionalLibs(Form("%s %s %s", libraries.Data(), taskHeader.Data(), dependencyHeader.Data())); + alienHandler->SetAnalysisSource(Form("%s %s %s %s", dependencySource.Data(), dependencyHeader.Data(), taskSources.Data(), taskHeaders.Data())); + alienHandler->SetAdditionalLibs(Form("%s %s %s", libraries.Data(), taskHeaders.Data(), dependencyHeader.Data())); alienHandler->SetOutputFiles(ofile); @@ -436,16 +482,20 @@ void run_single_task(const char* mode, // // create task from the name, create output container, connect slots // - AliAnalysisTaskSE *pTask=NULL; - if (bCreateAndAddTask) { - TClass* pCl=TClass::GetClass(taskname); + TObjArray* taskClassTokens=taskClasses.Tokenize(" "); + if (taskClassTokens) { + for (int iTaskClassToken=0; iTaskClassTokenGetEntriesFast(); iTaskClassToken++) { + AliAnalysisTaskSE *pTask=NULL; + TString taskName=taskClassTokens->At(iTaskClassToken)->GetName(); + taskName.ReplaceAll(".cxx", ""); + TClass* pCl=TClass::GetClass(taskName); if (!pCl) { - cerr << "can not load class " << taskname << endl; + cerr << "can not load class " << taskName << endl; return -1; } TObject* p=pCl->New(); if (!p) { - cerr << "failed to instantiate class " << taskname << endl; + cerr << "failed to instantiate class " << taskName << endl; return -1; } pTask=reinterpret_cast(p); @@ -453,12 +503,19 @@ void run_single_task(const char* mode, AliAnalysisDataContainer *pContainer=pManager->CreateContainer(analysisName ,TObject::Class(), AliAnalysisManager::kOutputContainer, ofile); pManager->ConnectInput(pTask,0,pManager->GetCommonInputContainer()); pManager->ConnectOutput(pTask,1,pContainer); - } else { + } + delete taskClassTokens; + } + TObjArray* taskMacroTokens=addTaskMacros.Tokenize(" "); + if (taskMacroTokens) { + for (int iTaskMacroToken=0; iTaskMacroTokenGetEntriesFast(); iTaskMacroToken++) { taskSource+="+g"; TString configuration; configuration.Form("name=%s file=%s %s", analysisName, ofile.Data(), useMC?"mc":""); if (gDirectory) gDirectory->Add(new TNamed("run_single_task_configuration", configuration.Data())); - gROOT->Macro(taskSource); + gROOT->Macro(taskMacroTokens->At(iTaskMacroToken)->GetName()); + } + delete taskMacroTokens; } /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/PWGHF/correlationHF/macros/setupDxHFE.C b/PWGHF/correlationHF/macros/setupDxHFE.C index b4f3de39bc7..fda1a7f3d4c 100644 --- a/PWGHF/correlationHF/macros/setupDxHFE.C +++ b/PWGHF/correlationHF/macros/setupDxHFE.C @@ -20,13 +20,14 @@ /// object is created /// - setting a default analysis name via a configuration object /// - the optional parameter 'localAodDir' allows to create an input chain from -/// locakl AODs +/// local AODs; either a single AliAOD.root, or a folder containing directories +/// named "1, 2, ..." /////////////////////////////////////////////////////////////////////////////////////////////////// // // environment specific for DxHFE // -const char* includePath="-I$ALICE_ROOT/PWGHF/vertexingHF -I$ALICE_ROOT/PWGHF/hfe"; +const char* includePath="-I$ALICE_ROOT/PWGHF/correlationHF -I$ALICE_ROOT/PWGHF/vertexingHF -I$ALICE_ROOT/PWGHF/hfe"; const char* libraryDependencies= "libSTEERBase " "libESD " @@ -38,6 +39,7 @@ const char* libraryDependencies= "libCORRFW.so " "libPWGHFvertexingHF.so " "libPWGHFhfe.so " + "libPWGHFcorrelationHF.so " ; void setupDxHFE(const char* aodDirectory=NULL) @@ -63,16 +65,21 @@ void setupDxHFE(const char* aodDirectory=NULL) // create AOD tree from local files // the created object is added automatically to gDirectory and can be fetched // from there later - // TODO: decide depending on running mode and input to be used gROOT->LoadMacro("$ALICE_ROOT/PWGHF/vertexingHF/MakeAODInputChain.C"); - // Create a chain with one set of AliAOD.root and AliAOD.VertexingHF.root. The set needs - // to be located in the same folder as you run from (physically or linked) - TChain* chain = MakeAODInputChain(aodDirectory ,1, -1); - // If you have several folders containing different AODs, use below. - // From the MakeAODInputChain.C: The AODs need to be in folders named 1, 2,... - //if(useMC)chain =MakeAODInputChain("/scratch/Data/2010/MC/LHC10f7a/130375/AOD051/",1,2);//73 - //chain =MakeAODInputChain("/scratch/Data/2010/MC/LHC10f6a/126437/AOD041/",1,10);//84 - //else chain =MakeAODInputChain("/scratch/Data/2010/LHC10d/000126437/ESDs/pass2/AOD057/",1,10);//LHC10f7a/130375/AOD051/",1,20); - cout << "local AOD chain: " << chain->GetEntries() << " entries" << endl; + TString aodPathName(aodDirectory); + if (!aodPathName.EndsWith("/")) aodPathName+="/"; + aodPathName+="AliAOD.root"; + if (gSystem->AccessPathName(aodPathName)==0) { + // Create a chain with one set of AliAOD.root and AliAOD.VertexingHF.root. The set needs + // to be located in the same folder as you run from (physically or linked) + ::Info("setupDxHFE.C", Form("make chain from single chunk %s", aodPathName)); + TChain* chain = MakeAODInputChain(aodDirectory ,1, -1); + } else { + // Assume several folders containing different AODs. + // The AODs need to be in folders named 1, 2,... + ::Info("setupDxHFE.C", Form("make chain from directory %s", aodDirectory)); + chain=MakeAODInputChain(aodDirectory, 1, 10); + } + ::Info("setupDxHFE.C", Form("local AOD chain: %d entries", chain->GetEntries())); } } -- 2.39.3