b943398ac15ae34cbc6d03e4e0c09ccef75ffaf5
1 // run.C\r
2 //\r
3 // Template run macro for AliBasicTask.cxx/.h with example layout of\r
4 // physics selections and options, in macro and task.\r
5 //\r
6 // Author: Arvinder Palaha\r
7 //\r
8 class AliAnalysisGrid;\r
10 class AliBalance;\r
11 \r
12 //Centrality stuff\r
13 Int_t binfirst = 0;  //where do we start numbering bins\r
14 Int_t binlast = 8;  //where do we stop numbering bins\r
15 const Int_t numberOfCentralityBins = 9;\r
16 Float_t centralityArray[numberOfCentralityBins+1] = {0.,5.,10.,20.,30.,40.,50.,60.,70.,80.}; // in centrality percentile\r
17 \r
18 //Systematic studies\r
19 const Int_t numberOfSyst = 13;\r
20 Float_t vZ[numberOfSyst]     = {10.,12.,6.,8.,10.,10.,10.,10.,10.,10.,10.,10.,10.};     // global Vertex Z cut\r
21 Float_t DCAxy[numberOfSyst]  = {-1.,2.4,2.4,2.4,2.2,2.0,1.8,2.4,2.4,2.4,2.4,2.4,2.4};   // DCA xy cut (afterburner, -1 = w/o additional cut)\r
22 Float_t DCAz[numberOfSyst]   = {-1.,3.2,3.2,3.2,3.0,2.8,2.6,3.2,3.2,3.2,3.2,3.2,3.2};   // DCA z cut (afterburner, -1 = w/o additional cut)\r
23 Float_t ptMin[numberOfSyst]  = {0.3,0.3,0.3,0.3,0.3,0.3,0.3,1.5,5.0,0.3,0.3,0.3,0.3};   // pt cuts\r
24 Float_t ptMax[numberOfSyst]  = {1.5,1.5,1.5,1.5,1.5,1.5,1.5,5.0,10.0,10.0,1.5,1.5,1.5}; // pt cuts\r
25 Float_t etaMin[numberOfSyst] = {-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-0.8,-1.0,-0.6,-0.4}; // eta cuts\r
26 Float_t etaMax[numberOfSyst] = {0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,0.8,1.0,0.6,0.4};   // eta cuts\r
27 \r
28 //______________________________________________________________________________\r
29 void runBalanceFunction(\r
30          const char* runtype = "local", // local, proof or grid\r
31          const char *gridmode = "test", // Set the run mode (can be "full", "test", "offline", "submit" or "terminate"). Full & Test work for proof\r
32          const Int_t bunchN = 0,\r
33          const bool bAOD = 1, // 1 = AOD ANALYSIS, 0 = ESD ANALYSIS\r
34          const bool bMCtruth = 0, // 1 = MCEvent handler is on (MC truth), 0 = MCEvent handler is off (MC reconstructed/real data)\r
35          const bool bMCphyssel = 0, // 1 = looking at MC truth or reconstructed, 0 = looking at real data\r
36          const Long64_t nentries = 50000, // for local and proof mode, ignored in grid mode. Set to 1234567890 for all events.\r
37          const Long64_t firstentry = 0, // for local and proof mode, ignored in grid mode\r
38          TString proofdataset = "bunchPROOF", // path to dataset on proof cluster, for proof analysis\r
39          const char *proofcluster = "miweber@alice-caf.cern.ch", // which proof cluster to use in proof mode\r
40          const char *taskname = "BF_Syst_Test" // sets name of grid generated macros\r
41          )\r
42 {\r
43     // check run type\r
44     if(runtype != "local" && runtype != "proof" && runtype != "grid"){\r
45         Printf("\n\tIncorrect run option, check first argument of run macro");\r
46         Printf("\tint runtype = local, proof or grid\n");\r
47         return;\r
48     }\r
49     Printf("%s analysis chosen",runtype);\r
50   \r
63 \r
65 \r
66     // compile standalone stuff\r
69 \r
70     // add aliroot indlude path\r
71     //gROOT->ProcessLine(".include \$PWD/.");\r
72     //gROOT->ProcessLine(Form(".include %s/include",gSystem->ExpandPathName("\$ALICE_ROOT")));\r
73 \r
74     gROOT->SetStyle("Plain");\r
75 \r
76     // analysis manager\r
77     AliAnalysisManager* mgr = new AliAnalysisManager(Form("%s%i",taskname,bunchN));\r
78     \r
79     // create the alien handler and attach it to the manager\r
80     AliAnalysisGrid *plugin = CreateAlienHandler(bAOD,bunchN,Form("%s%i",taskname,bunchN), gridmode, proofcluster, Form("%s_%d.txt",proofdataset.Data(),bunchN)); \r
81     mgr->SetGridHandler(plugin);\r
82     \r
83 \r
84     // input handler (ESD or AOD)\r
85     AliVEventHandler* inputH = NULL;\r
86     if(!bAOD){\r
87       inputH = new AliESDInputHandler();\r
88     }\r
89     else{\r
90       inputH = new AliAODInputHandler();\r
91     }\r
92     mgr->SetInputEventHandler(inputH);\r
93     \r
94     // mc event handler\r
95     if(bMCtruth) {\r
96         AliMCEventHandler* mchandler = new AliMCEventHandler();\r
97         // Not reading track references\r
99         mgr->SetMCtruthEventHandler(mchandler);\r
100     }   \r
101 \r
102     // AOD output handler\r
103     //AliAODHandler* aodoutHandler = new AliAODHandler();\r
104     //aodoutHandler->SetOutputFileName("aod.root");\r
105     //mgr->SetOutputEventHandler(aodoutHandler); \r
106     \r
107     // === Physics Selection Task ===\r
108     //\r
109     // In SelectCollisionCandidate(), default is kMB, so the task UserExec() \r
110     // function is only called for these events.\r
111     // Options are:\r
112     //    kMB             Minimum Bias trigger\r
113     //    kMBNoTRD        Minimum bias trigger where the TRD is not read out\r
114     //    kMUON           Muon trigger\r
115     //    kHighMult       High-Multiplicity Trigger\r
116     //    kUserDefined    For manually defined trigger selection\r
117     //\r
118     // Multiple options possible with the standard AND/OR operators && and ||\r
119     // These all have the usual offline SPD or V0 selections performed.\r
120     //\r
121     // With a pointer to the physics selection object using physSelTask->GetPhysicsSelection(),\r
122     // one can manually set the selected and background classes using:\r
125     //\r
126     // One can also specify multiple classes at once, or require a class to NOT\r
127     // trigger, for e.g.\r
129     //\r
130     // NOTE that manually setting the physics selection overrides the standard\r
131     // selection, so it must be done in completeness.\r
132     //\r
133     // ALTERNATIVELY, one can make the physics selection inside the task\r
134     // UserExec().\r
135     // For this case, comment out the task->SelectCol.... line, \r
136     // and see AliBasicTask.cxx UserExec() function for details on this.\r
137 \r
143                 \r
145 \r
147     // (only on ESD level, in AODs centrality is already in header and events are selected)\r
148     if(!bAOD){\r
151 \r
155 \r
156     }\r
157 \r
161     \r
162     // enable debug printouts\r
163     //mgr->SetDebugLevel(2);\r
164     //mgr->SetUseProgressBar(1,100);\r
165     if (!mgr->InitAnalysis()) return;\r
166     mgr->PrintStatus();\r
167   \r
168     // start analysis\r
169     Printf("Starting Analysis....");\r
170     mgr->StartAnalysis(runtype,nentries,firstentry);\r
171 }\r
172 \r
173 //______________________________________________________________________________\r
174 AliAnalysisGrid* CreateAlienHandler(Bool_t bAOD, Int_t bunchN, const char *taskname, const char *gridmode, const char *proofcluster, const char *proofdataset)\r
175 {\r
176     AliAnalysisAlien *plugin = new AliAnalysisAlien();\r
177     // Set the run mode (can be "full", "test", "offline", "submit" or "terminate")\r
178     plugin->SetRunMode(gridmode);\r
179 \r
180     // Set versions of used packages\r
181     plugin->SetAPIVersion("V1.1x");\r
182     plugin->SetROOTVersion("v5-28-00d");\r
183     plugin->SetAliROOTVersion("v5-02-05-AN");\r
184 \r
185     // Declare input data to be processed.\r
186 \r
187     // Method 1: Create automatically XML collections using alien 'find' command.\r
188     // Define production directory LFN\r
190     // On real reconstructed data:\r
192 \r
193     // Set data search pattern\r
194     //plugin->SetDataPattern("*ESDs.root"); // THIS CHOOSES ALL PASSES\r
195     // Data pattern for reconstructed data\r
196     if(!bAOD){\r
197       plugin->SetDataPattern("*ESDs/pass2/*ESDs.root"); // CHECK LATEST PASS OF DATA SET IN ALIENSH\r
198     } \r
199     else{\r
200       plugin->SetDataPattern("*ESDs/pass2/AOD049/*/AliAOD.root");\r
201     }\r
202 \r
203     plugin->SetRunPrefix("000");   // real data\r
204     // ...then add run numbers to be considered\r
205     //plugin->SetRunRange(114917,115322);\r
206 \r
207     if(bunchN==0){\r
209     }\r
210     \r
211     //bunch1\r
212     else if(bunchN == 1){\r
223     }\r
224 \r
225     //bunch2\r
226     else if(bunchN == 2){\r
247     }\r
248 \r
249     else if(bunchN == 3){\r
260     }\r
261 \r
262     else if(bunchN == 4){\r
263       \r
274     }\r
275 \r
276     else if(bunchN == 5){\r
277 \r
288     }\r
289 \r
290     else if(bunchN == 6){\r
291 \r
302 \r
303     }\r
304 \r
305     else if(bunchN == 7){\r
306 \r
317 \r
318     }\r
319 \r
320     else if(bunchN == 8){\r
321 \r
333     }\r
334 \r
335     else{\r
336 \r
337       stderr<<"BUNCH NOT THERE"<<endl;\r
338       return NULL;\r
339 \r
340     }\r
341 \r
342 \r
343     //plugin->AddRunList("139510, 139507, 139505, 139503, 139465, 139438, 139437, 139360, 139329, 139328, 139314, 139310, 139309, 139173, 139107, 139105, 139038, 139037, 139036, 139029, 139028, 138872, 138871, 138870, 138837, 138732, 138730, 138666, 138662, 138653, 138652, 138638, 138624, 138621, 138583, 138582, 138579, 138578, 138534, 138469, 138442, 138439, 138438, 138396, 138364, 138275, 138225, 138201, 138197, 138192, 138190, 137848, 137844, 137752, 137751, 137724, 137722, 137718, 137704, 137693, 137692, 137691, 137686, 137685, 137639, 137638, 137608, 137595, 137549, 137546, 137544, 137541, 137539, 137531, 137530, 137443, 137441, 137440, 137439, 137434, 137432, 137431, 137430, 137366, 137243, 137236, 137235, 137232, 137231, 137162, 137161");\r
344 \r
345 \r
346 \r
347 \r
348 \r
349     plugin->SetNrunsPerMaster(1);\r
350     plugin->SetOutputToRunNo();\r
351     // comment out the next line when using the "terminate" option, unless\r
352     // you want separate merged files for each run\r
353     plugin->SetMergeViaJDL();\r
354 \r
355     // Method 2: Declare existing data files (raw collections, xml collections, root file)\r
356     // If no path mentioned data is supposed to be in the work directory (see SetGridWorkingDir())\r
357     // XML collections added via this method can be combined with the first method if\r
358     // the content is compatible (using or not tags)\r
361 \r
362     // Define alien work directory where all files will be copied. Relative to alien \$HOME.\r
364 \r
365     // Declare alien output directory. Relative to working directory.\r
366     plugin->SetGridOutputDir("out"); // In this case will be \$HOME/taskname/out\r
367 \r
368    // Declare the analysis source files names separated by blancs. To be compiled runtime\r
369     // using ACLiC on the worker nodes.\r
371 \r
372     // Declare all libraries (other than the default ones for the framework. These will be\r
377 \r
378      // Declare the output file names separated by blancs.\r
379     // (can be like: file.root or file.root@ALICE::Niham::File)\r
380     // To only save certain files, use SetDefaultOutputs(kFALSE), and then\r
381     // SetOutputFiles("list.root other.filename") to choose which files to save\r
382     plugin->SetDefaultOutputs();\r
383     //plugin->SetOutputFiles("list.root");\r
384 \r
385     // Optionally set a name for the generated analysis macro (default MyAnalysis.C)\r
387 \r
388     // Optionally set maximum number of input files/subjob (default 100, put 0 to ignore)\r
389     plugin->SetSplitMaxInputFileNumber(100);\r
390 \r
391     // Optionally modify the executable name (default analysis.sh)\r
393 \r
394     // set number of test files to use in "test" mode\r
395     plugin->SetNtestFiles(1);\r
396 \r
397     // Optionally resubmit threshold.\r
398     plugin->SetMasterResubmitThreshold(90);\r
399 \r
400     // Optionally set time to live (default 30000 sec)\r
401     plugin->SetTTL(90000);\r
402 \r
403     // Optionally set input format (default xml-single)\r
404     plugin->SetInputFormat("xml-single");\r
405 \r
406     // Optionally modify the name of the generated JDL (default analysis.jdl)\r
408 \r
409     // Optionally modify job price (default 1)\r
410     plugin->SetPrice(1);      \r
411 \r
412     // Optionally modify split mode (default 'se')    \r
413     plugin->SetSplitMode("se");\r
414 \r
415     //plugin->SetUseSubmitPolicy();\r
416     //plugin->SetKeepLogs();\r
417     \r
418     //----------------------------------------------------------\r
419     //---      PROOF MODE SPECIFIC SETTINGS         ------------\r
420     //---------------------------------------------------------- \r
421     // Proof cluster\r
422     plugin->SetProofCluster(proofcluster);\r
423     // Dataset to be used   \r
424     plugin->SetProofDataSet(proofdataset);\r
425     // May need to reset proof. Supported modes: 0-no reset, 1-soft, 2-hard\r
426     plugin->SetProofReset(0);\r
427     // May limit number of workers\r
428     plugin->SetNproofWorkers(0);\r
429     // May limit the number of workers per slave\r
430     plugin->SetNproofWorkersPerSlave(1);   \r
431     // May use a specific version of root installed in proof\r
432     plugin->SetRootVersionForProof("current");\r
433     // May set the aliroot mode. Check http://aaf.cern.ch/node/83 \r
434     plugin->SetAliRootMode("default"); // Loads AF libs by default\r
435     // May request ClearPackages (individual ClearPackage not supported)\r
436     plugin->SetClearPackages(kFALSE);\r
437     // Plugin test mode works only providing a file containing test file locations, used in "local" mode also\r
438     plugin->SetFileForTestMode("files.txt"); // file should contain path name to a local directory containg *ESDs.root etc\r
439     // Request connection to alien upon connection to grid\r
440     plugin->SetProofConnectGrid(kFALSE);\r
441 \r
442     plugin->Print();\r
443 \r
444     return plugin;\r
445 }\r
446 \r