3 void AddAnalysisTasks();
4 class AliAnalysisAlien;
5 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode);
7 Bool_t doQAsym = 1; // output ok
8 Bool_t doVZERO = 1; // output ok but there is a 2nd file
9 Bool_t doVertex = 1; // output ok
10 Bool_t doSPD = 1; // output ok, needs RP
11 Bool_t doFMD = 1; // output ok
12 Bool_t doTPC = 1; // output ok
13 Bool_t doEventStat = 1; // output ok
14 Bool_t doSDD = 1; // outout ok needs RP
16 TString train_name = "QA001_PASS4";
17 TString job_tag = "QA001: PWG1 QA train";
18 TString root_version = "v5-26-00b";
19 TString aliroot_version = "v4-19-04-AN";
20 TString grid_datadir = "/alice/data/2009/LHC09d";
21 TString data_pattern = "*ESDs/pass4/*ESDs.root";
22 //TString alien_outdir = "";
23 TString alien_outdir = "/alice/data/2009/LHC09d/analysis/QA001_PASS4";
25 Bool_t useProductionMode = kTRUE;
27 void PilotAnalysis(const char *plugin_mode = "full")
29 TGrid::Connect("alien://");
30 if (!gGrid || !gGrid->IsConnected()) {
31 ::Error("PilotAnalysis", "No grid connection");
34 // Write configuration
35 TString cdir = gSystem->WorkingDirectory();
36 gSystem->MakeDirectory(train_name);
37 gSystem->ChangeDirectory(train_name);
39 out.open(Form("%sConfig.C",train_name.Data()), ios::out);
41 out << " train_name = " << "\"" << train_name.Data() << "\";" << endl;
42 out << " root_version = " << "\"" << root_version.Data() << "\";" << endl;
43 out << " aliroot_version = " << "\"" << aliroot_version.Data() << "\";" << endl;
44 out << " grid_datadir = " << "\"" << grid_datadir.Data() << "\";" << endl;
45 if (!alien_outdir.Length()) alien_outdir = Form("output_%s",train_name.Data());
46 out << " alien_outdir = " << "\"" << alien_outdir.Data() << "\";" << endl;
47 out << " doQAsim = " << doQAsym << ";" << endl;
48 out << " doVZERO = " << doVZERO << ";" << endl;
49 out << " doVertex = " << doVertex << ";" << endl;
50 out << " doSPD = " << doSPD << ";" << endl;
51 out << " doSDD = " << doSDD << ";" << endl;
52 out << " doFMD = " << doFMD << ";" << endl;
53 out << " doTPC = " << doTPC << ";" << endl;
54 out << " doEventStat = " << doEventStat << ";" << endl;
59 gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS");
62 AliAnalysisManager *mgr = new AliAnalysisManager("PilotAnalysis", "Production train");
65 AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
66 esdHandler->SetActiveBranches("ESDfriend");
67 mgr->SetInputEventHandler(esdHandler);
69 mgr->SetDebugLevel(3);
70 mgr->SetSaveCanvases(kTRUE);
75 AliAnalysisAlien *alienHandler = CreateAlienHandler(plugin_mode);
76 mgr->SetGridHandler(alienHandler);
77 if (mgr->InitAnalysis()) {
79 mgr->StartAnalysis("grid");
80 TString alien_workdir = gGrid->GetHomeDirectory();
81 alien_workdir += "analysisDATA";
82 TString configName = Form("%s/%sConfig.C", alien_workdir.Data(), train_name.Data());
83 if (strcmp(plugin_mode, "test")) {
84 printf("=== Registering configuration file <%s>===\n", configName.Data());
85 if (AliAnalysisAlien::FileExists(configName.Data())) gGrid->Rm(configName.Data());
86 TFile::Cp(Form("file:%sConfig.C",train_name.Data()), Form("alien://%s", configName.Data()));
93 gSystem->Load("libANALYSIS");
94 gSystem->Load("libANALYSISalice");
95 gSystem->Load("libTENDER");
96 gSystem->Load("libPWG0base.so");
97 gSystem->Load("libPWG0dep.so");
98 gSystem->Load("libPWG0selectors.so");
99 gSystem->Load("libPWG1.so");
100 gSystem->Load("libPWG2.so");
101 gSystem->Load("libPWG2forward.so");
104 TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSPD.cxx"), "AliAnalysisTaskSPD.cxx");
105 TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSPD.h"), "AliAnalysisTaskSPD.h");
106 gROOT->LoadMacro("AliAnalysisTaskSPD.cxx++g");
109 TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSDDRP.cxx"), "AliAnalysisTaskSDDRP.cxx");
110 TFile::Cp(gSystem->ExpandPathName("$ALICE_ROOT/PWG1/ITS/AliAnalysisTaskSDDRP.h"), "AliAnalysisTaskSDDRP.h");
111 // gROOT->LoadMacro("AliAnalysisTaskSDDRP.cxx++g");
115 void AddAnalysisTasks()
117 // Vertexing (A. Dainese)
120 gROOT->LoadMacro("$ALICE_ROOT/PWG1/macros/AddTaskVertexESD.C");
121 AliAnalysisTaskVertexESD* taskvertexesd = AddTaskVertexESD();
122 taskvertexesd->SelectCollisionCandidates();
125 // TPC QA (E. Sicking)
128 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskQAsym.C");
129 AliAnalysisTaskSE * taskqasim = AddTaskQAsym();
130 taskqasim->SelectCollisionCandidates();
133 // VZERO QA (C. Cheshkov)
136 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskVZEROQA.C");
137 AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
138 // taskv0qa->SelectCollisionCandidates();
140 // FMD (Hans Hjersing Dalsgaard)
143 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskFMD.C");
144 AliAnalysisTaskSE* taskfmd = AddTaskFMD();
145 taskfmd->SelectCollisionCandidates();
148 // TPC (Jacek Otwinowski)
151 gROOT->LoadMacro("$(ALICE_ROOT)/PWG1/TPC/macros/AddTaskPerformanceTPCQA.C");
152 AliPerformanceTask *tpcQA = AddTaskPerformanceTPCQA(kFALSE, kTRUE);
155 // SPD (A. Mastroserio)
158 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskSPDQA.C");
159 AliAnalysisTaskSE* taskspdqa = AddTaskSPDQA();
160 taskspdqa->SelectCollisionCandidates();
166 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddSDDPoints.C");
167 AliAnalysisTaskSE* tasksdd = AddSDDPoints();
168 tasksdd->SelectCollisionCandidates();
171 // Event Statistics (Jan Fiete)
175 gROOT->LoadMacro("$ALICE_ROOT/PWG1/PilotTrain/AddTaskPhysicsSelection.C");
176 AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection();
177 AliPhysicsSelection* physSel = physSelTask->GetPhysicsSelection();
178 physSel->AddBackgroundIdentification(new AliBackgroundSelection());
179 AliAnalysisManager::GetAnalysisManager()->RegisterExtraFile("event_stat.root");
183 //______________________________________________________________________________
184 AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode)
186 // Check if user has a valid token, otherwise make one. This has limitations.
187 // One can always follow the standard procedure of calling alien-token-init then
188 // source /tmp/gclient_env_$UID in the current shell.
189 if (!AliAnalysisGrid::CreateToken()) return NULL;
190 AliAnalysisAlien *plugin = new AliAnalysisAlien();
191 // Set the run mode (can be "full", "test", "offline", "submit" or "terminate")
192 plugin->SetRunMode(plugin_mode);
193 if (useProductionMode) plugin->SetProductionMode();
194 plugin->SetJobTag(job_tag);
195 plugin->SetNtestFiles(1);
196 // Set versions of used packages
197 plugin->SetAPIVersion("V1.1x");
198 plugin->SetROOTVersion(root_version);
199 plugin->SetAliROOTVersion(aliroot_version);
200 // Declare input data to be processed.
201 // Method 1: Create automatically XML collections using alien 'find' command.
202 // Define production directory LFN
203 plugin->SetGridDataDir(grid_datadir);
204 // Set data search pattern
205 plugin->SetDataPattern(data_pattern);
206 // ...then add run numbers to be considered
207 // if (!iAODanalysis) plugin->SetRunRange(run_range[0], run_range[1]);
208 plugin->SetRunPrefix("000");
209 plugin->SetOutputSingleFolder("output");
210 plugin->SetOutputToRunNo();
211 Int_t run_numbers[30] = {104065, 104155, 104157, 104159, 104160, 104315, 104316, 104320, 104321, 104439,
212 104792, 104793, 104799, 104800, 104801, 104802, 104803, 104821, 104824, 104825,
213 104841, 104845, 104849, 104852, 104865, 104867, 104876, 104892, 105143, 105160};
214 for (Int_t i=0; i<30; i++) {
215 plugin->AddRunNumber(run_numbers[i]);
217 // Define alien work directory where all files will be copied. Relative to alien $HOME.
218 plugin->SetGridWorkingDir("analysisDATA");
219 // Declare alien output directory. Relative to working directory.
220 if (alien_outdir.IsNull()) alien_outdir = Form("output_%s",train_name.Data());
221 plugin->SetGridOutputDir(alien_outdir);
223 // plugin->EnablePackage("");
225 // Declare the analysis source files names separated by blancs. To be compiled runtime
226 // using ACLiC on the worker nodes.
227 // Declare all libraries (other than the default ones for the framework. These will be
228 // loaded by the generated analysis macro. Add all extra files (task .cxx/.h) here.
229 plugin->AddIncludePath("-I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT/ITS");
230 plugin->SetAnalysisSource("AliAnalysisTaskSPD.cxx AliAnalysisTaskSDDRP.cxx");
231 plugin->SetAdditionalLibs("libTENDER.so libPWG0base.so libPWG0dep.so libPWG0selectors.so libPWG1.so libPWG2.so libPWG2forward.so AliAnalysisTaskSPD.h AliAnalysisTaskSPD.cxx AliAnalysisTaskSDDRP.h AliAnalysisTaskSDDRP.cxx");
233 // Declare the output file names separated by blancs.
234 // (can be like: file.root or file.root@ALICE::Niham::File)
235 plugin->SetDefaultOutputs();
236 // plugin->SetMergeExcludes(mergeExclude);
237 plugin->SetMaxMergeFiles(100);
238 plugin->SetNrunsPerMaster(1);
239 // Optionally define the files to be archived.
240 // plugin->SetOutputArchive("log_archive.zip:stdout,stderr@ALICE::NIHAM::File root_archive.zip:AliAOD.root,AOD.tag.root@ALICE::NIHAM::File");
242 // Put default output files to archive
243 TString listhists = "";
244 TString listaods = "";
245 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
246 TIter next(mgr->GetOutputs());
247 AliAnalysisDataContainer *output;
248 while ((output=(AliAnalysisDataContainer*)next())) {
249 const char *filename = output->GetFileName();
250 if (!(strcmp(filename, "default"))) {
251 if (!mgr->GetOutputEventHandler()) continue;
252 filename = mgr->GetOutputEventHandler()->GetOutputFileName();
253 if (listaods.Length()) listaods += ",";
254 listaods += filename;
256 if (listhists.Contains(filename)) continue;
257 if (listhists.Length()) listhists += ",";
258 listhists += filename;
261 if (mgr->GetExtraFiles().Length()) {
262 if (listhists.Length()) listhists += ",";
263 listhists += mgr->GetExtraFiles();
264 listhists.ReplaceAll(" ", ",");
266 if (listhists.Length()) listhists = Form("hist_archive.zip:%s", listhists.Data());
267 if (listaods.Length()) listaods = Form("aod_archive.zip:%s", listaods.Data());
268 if (!listhists.Length()) {
269 ::Fatal("AnalysisTrainNew", "No task output !");
271 TString outputArchive = "log_archive.zip:stdout,stderr@disk=4";
272 if (listaods.Length()) {
273 outputArchive += " ";
274 outputArchive += listaods;
275 outputArchive += "@disk=4";
277 if (listhists.Length()) {
278 outputArchive += " ";
279 outputArchive += listhists;
280 outputArchive += "@disk=4";
283 // if (iAODanalysis && iPWG3d2h)
284 // plugin->SetFriendChainName("AliAOD.VertexingHF.root");
285 plugin->SetOutputArchive(outputArchive);
286 // Optionally set a name for the generated analysis macro (default MyAnalysis.C)
287 plugin->SetAnalysisMacro(Form("%s.C", train_name.Data()));
288 // Optionally set maximum number of input files/subjob (default 100, put 0 to ignore)
289 plugin->SetSplitMaxInputFileNumber(1000);
290 // Optionally set number of failed jobs that will trigger killing waiting sub-jobs.
291 // plugin->SetMaxInitFailed(5);
292 // Optionally resubmit threshold.
293 // plugin->SetMasterResubmitThreshold(90);
294 // Optionally set time to live (default 30000 sec)
295 plugin->SetTTL(70000);
296 // Optionally set input format (default xml-single)
297 plugin->SetInputFormat("xml-single");
298 // Optionally modify the name of the generated JDL (default analysis.jdl)
299 plugin->SetJDLName(Form("%s.jdl", train_name.Data()));
300 // Optionally modify the executable name (default analysis.sh)
301 plugin->SetExecutable(Form("%s.sh", train_name.Data()));
302 // Optionally modify job price (default 1)
304 // Optionally modify split mode (default 'se')
305 plugin->SetSplitMode("se");
306 plugin->SetExecutableCommand("aliroot -b -q");