1 //____________________________________________________________________
3 * Run an FMD corrections job.
5 * @param runMode Running mode (full, test, terminate, submit, offline)
6 * @param anaType What to do (background, collector, sharing)
7 * @param dataDir Input data directory
8 * @param anaSource Analysis source (if any)
9 * @param anaName Analysis name
10 * @param colSys Collision system (p-p, Pb-Pb, A-A)
11 * @param cmsNNGeV Center of mass energy per nucleon in GeV
12 * @param bkG Magnetic field in kilo gaus
13 * @param aliceTag AliROOT tag to use
14 * @param rootTag ROOT tag to use
15 * @param apiTag API tag to use
18 runFMDjob(const TString& runMode = "",
19 const TString& anaType = "background",
20 const TString& dataDir = "",
21 const TString& anaSource = "",
22 const TString& anaName = "",
23 const TString& colSys = "p-p",
24 Float_t cmsNNGeV = 900,
26 const TString& aliceTag = "v4-21-04-AN",
27 const TString& rootTag = "v5-27-06b",
28 const TString& apiTag = "V1.1x")
30 // --- Load libraries needed -------------------------------------
31 gSystem->Load("libANALYSIS");
32 gSystem->Load("libANALYSISalice");
33 gSystem->Load("libPWGLFforward");
34 gSystem->AddIncludePath("-I$ALICE_ROOT/PWGLF/FORWARD/analysis");
36 // --- Some initial checks and setup -------------------------------
37 TString outFileName = anaName;
38 outFileName.ToLower();
39 outFileName += ".root";
41 // --- Manager setup -----------------------------------------------
42 // Create the analysis manager
43 AliAnalysisManager *mgr = new AliAnalysisManager(anaName.Data());
46 // --- ESD setup ---------------------------------------------------
47 // Connect the EDS's to the manager and switch off unused branches
48 AliESDInputHandler* esdH = new AliESDInputHandler();
49 esdH->SetInactiveBranches("AliESDACORDE "
50 "AliRawDataErrorLogs "
61 mgr->SetInputEventHandler(esdH);
63 // --- Task setup --------------------------------------------------
64 // Configure the analysis manager to the specific task
65 TString type = anaType.ToLower();
67 if (type.Contains("background"))
68 addLibs = AddBackgroundTask(outFileName);
69 else if (type.Contains("collector"))
70 addLibs = AddCollectorTask(outFileName, colSys, cmsNNGeV, bkG);
71 else if (type.Contains("sharing"))
72 addLibs = AddSharingTask(outFileName, colsys, cmsNNGeV, bkG);
74 Error("runFMDjob", "Unknown type '%s', please fix this macro",
79 // --- AliEN handler setup -----------------------------------------
80 // Create and configure the alien handler plugin, and connect to manager
81 if (!CreateAlienHandler(runMode,
90 Error("runFMDjob", "Failed to set up alien handler");
93 mgr->SetGridHandler(alienHandler);
95 // --- final job setup and execution -------------------------------
96 // Enable debug printouts
97 mgr->SetDebugLevel(2);
99 if (!mgr->InitAnalysis()) {
100 Error("runFMDjob", "Failed to initialise the train");
104 mgr->StartAnalysis("grid");
106 // --- We are done -------------------------------------------------
107 Info("runFMDjob", "Job is done");
111 //____________________________________________________________________
113 * Create a background correction task
117 * @return A list of additional files that should be uploaded
120 AddBackgroundTask(const TString& outFileName)
122 AliAnalysisManager* mgr = AliAnalysisManager::Instance();
124 // --- Make and configure task -------------------------------------
125 AliFMDAnalysisTaskGenerateCorrection *task =
126 new AliFMDAnalysisTaskGenerateCorrection("background");
127 task->SetNbinsEta(200);
130 // --- Add the MC handler ------------------------------------------
131 AliMCEventHandler* mcHandler = new AliMCEventHandler();
132 mgr->SetMCtruthEventHandler(mcHandler);
134 // --- Create and connect container for input ----------------------
135 AliAnalysisDataContainer *cin_esd = mgr->GetCommonInputContainer();
136 mgr->ConnectInput(task, 0, cin_esd);
138 // --- Create and connect containers for output --------------------
139 const char* outList[] = { "Hits", "Primaries", "vertex", "Correction", 0 };
140 const char** ptr = outList;
143 AliAnalysisDataContainer* outCont =
144 mgr->CreateContainer(*ptr, TList::Class(),
145 AliAnalysisManager::kOutputContainer,
147 mgr->ConnectOutput(task, i, outCont);
156 //_______________________________________________________________
158 * Create and add collector task.
160 * @param outFileName Output file name
161 * @param col Collision system (one of "p-p", "Pb-Pb", or "A-A")
162 * @param cmsNNGeV Center of mass energy per nucleon in GeV
163 * @param bkG Magnetic field in kilo gauss
165 * @return A list of additional files that should be uploaded
167 void AddCollectorTask(const TString& outFileName,
172 AliAnalysisManager* mgr = AliAnalysisManager::Instance();
174 // --- Initialize the analysis parameters --------------------------
175 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
176 pars->SetCollisionSystem(col);
177 pars->SetEnergy(cmsNNGeV);
178 pars->SetMagField(bkG);
179 pars->SetBackgroundPath("./");
180 pars->Init(kTRUE,AliFMDAnaParameters::kBackgroundCorrection);
181 TString bgFile = pars->GetPath(AliFMDAnaParameters::GetBackgroundID());
183 // --- Create and add our task -------------------------------------
184 AliFMDAnalysisTaskCollector *task =
185 new AliFMDAnalysisTaskCollector("collector");
188 // --- Add the MC handler ------------------------------------------
189 AliMCEventHandler* mcHandler = new AliMCEventHandler();
190 mgr->SetMCtruthEventHandler(mcHandler);
192 // --- Create containers for input/output --------------------------
193 AliAnalysisDataContainer *cin_esd = mgr->GetCommonInputContainer();
194 AliAnalysisDataContainer *cout_fmd1 =
195 mgr->CreateContainer("energyDist",
197 AliAnalysisManager::kOutputContainer,
200 // --- Connect input/output ----------------------------------------
201 mgr->ConnectInput(task, 0, cin_esd);
202 mgr->ConnectOutput(task, 1, cout_fmd1);
207 //_______________________________________________________________
209 * Create and add sharing task.
211 * @param outFileName Output file name
212 * @param col Collision system (one of "p-p", "Pb-Pb", or "A-A")
213 * @param cmsNNGeV Center of mass energy per nucleon in GeV
214 * @param bkG Magnetic field in kilo gauss
216 * @return A list of additional files that should be uploaded
219 AddSharingTask(const TString& outFileName,
224 AliAnalysisManager* mgr = AliAnalysisManager::Instance();
226 // --- Initialize the analysis parameters --------------------------
227 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
228 pars->SetCollisionSystem(col);
229 pars->SetEnergy(cmsNNGeV);
230 pars->SetMagField(bkG);
231 pars->SetBackgroundPath("./");
232 pars->SetEnergyPath("./");
233 pars->SetEventSelectionPath("./");
235 AliFMDAnaParameters::kBackgroundCorrection|
236 AliFMDAnaParameters::kEnergyDistributions|
237 AliFMDAnaParameters::kEventSelectionEfficiency);
239 files.Append(pars->GetPath(AliFMDAnaParameters::GetBackgroundID()));
241 files.Append(pars->GetPath(AliFMDAnaParameters::GetEdistID()));
243 files.Append(pars->GetPath(AliFMDAnaParameters::GetEventSelectionEffID()));
245 // --- Create and add our task -------------------------------------
246 AliFMDAnalysisTaskSE *task = new AliFMDAnalysisTaskSE("sharing");
249 // --- Add the MC handler ------------------------------------------
250 AliMCEventHandler* mcHandler = new AliMCEventHandler();
251 mgr->SetMCtruthEventHandler(mcHandler);
255 // --- Create and connect containers for output --------------------
256 AliAnalysisDataContainer *cout_fmd =
257 mgr->CreateContainer("BackgroundCorrected", TList::Class(),
258 AliAnalysisManager::kOutputContainer,outputfile);
260 mgr->ConnectInput(taskfmd, 0, mgr->GetCommonInputContainer());
261 mgr->ConnectOutput(taskfmd, 1, cout_fmd);
266 //____________________________________________________________________
268 * Create an AliAnalysisGrid parameter object
270 * @param runMode Running mode (full, test, terminate, submit, offline)
271 * @param dataDir Input data directory
272 * @param anaSource Possible source to compile on worker node
273 * (must also be compiled and addet to train on
275 * @param addLibs Extra libraries to add
276 * @param anaName Analysis name (i.e., script created)
277 * @param outFileName Output file name
279 * @return Valid object or null
282 CreateAlienHandler(const TString& runMode,
283 const TString& dataDir,
284 const TString& anaSource,
285 const TString& addLibs,
286 const TString& anaName,
287 const TString& outFileName,
288 const TString& aliceTag,
289 const TString& rootTag,
290 const TString& apiTag)
292 AliAnalysisAlien *plugin = new AliAnalysisAlien();
294 // Overwrite all generated files, datasets and output
295 // results from a previous session
296 plugin->SetOverwriteMode();
298 // Set the running mode
299 plugin->SetRunMode(runMode.Data());
301 // Add path to our headers
302 plugin->AddIncludePath("-I$ALICE_ROOT/PWGLF/FORWARD/analysis");
304 // Set versions of used packages
305 plugin->SetAPIVersion(apiTag);
306 plugin->SetROOTVersion(rootTag);
307 plugin->SetAliROOTVersion(aliceTag);
309 // Define production directory LFN
310 plugin->SetGridDataDir(dataDir.Data());
312 // Set data search pattern
313 plugin->SetDataPattern("AliESDs.root");
315 // Use ESD tags (same applies for AOD's)
316 //plugin->SetDataPattern("*tag.root");
318 // ...then add run numbers to be considered
319 // If not set all runs proccessed
320 //plugin->AddRunNumber(126437);
322 // Set events to run over for each file !!!
323 //plugin->SetRunRange(0, 10);
325 // Define alien work directory where all files will be copied.
326 // Relative to alien $HOME.
327 plugin->SetGridWorkingDir("work");
329 // Declare alien output directory. Relative to working directory.
330 TString outputDir = anaName;
332 plugin->SetGridOutputDir(outputDir.Data());
334 // Declare the analysis source files names separated by blancs.
335 // To be compiled runtime using ACLiC on the worker nodes.
336 if (!anaSource.IsNull())
337 plugin->SetAnalysisSource(anaSource.Data());
339 // Declare all libraries (other than the default ones for the framework.
340 // These will be loaded by the generated analysis macro.
341 // Add all extra files (task .cxx/.h) here.
342 if (!addLibs.IsNull())
343 plugin->SetAdditionalLibs(addLibs.Data());
345 // No need for output file names. Procedure is automatic.
346 // It's works better this way
347 plugin->SetDefaultOutputs(kFALSE);
348 plugin->SetOutputFiles(outFileName.Data());
350 // Set a name for the generated analysis macro (default MyAnalysis.C).
351 // Make this unique !!!
352 TString macroName = anaName;
353 macroName += "Task.C";
354 plugin->SetAnalysisMacro(macroName.Data());
356 // Optionally set maximum number of input files/subjob (default 100,
358 plugin->SetSplitMaxInputFileNumber(100);
360 // Optionally set number of failed jobs that will trigger killing
362 plugin->SetMaxInitFailed(5);
364 // Optionally resubmit threshold.
365 plugin->SetMasterResubmitThreshold(90);
367 // Optionally set time to live (default 30000 sec)
368 plugin->SetTTL(20000);
370 // Optionally set input format (default xml-single)
371 plugin->SetInputFormat("xml-single");
373 // Optionally modify the name of the generated JDL (default analysis.jdl)
374 TString jdlName = anaName;
376 plugin->SetJDLName(jdlName.Data());
378 // Optionally modify job price (default 1)
381 // Optionally modify split mode (default 'se')
382 plugin->SetSplitMode("se");
384 // connect to manager
385 AliAnalysisManager* mgr = AliAnalysisManager::Instance();
386 mgr->SetGridHandler(alienHandler);
390 //____________________________________________________________________