20907a9a45b74f8ebde44607a17b37f07e7aaa1a
[u/mrichter/AliRoot.git] / PWGJE / FlavourJetTasks / macros / AnalysisTrainCorrJetsLocal.C
1 // runEMCalJetAnalysis.C
2 // =====================
3 // This macro can be used to run a jet analysis within the EMCal Jet Framework.
4 //
5 // Examples:
6 // -> Analyze ESDs from the pA pilot run on the AliEn grid with your task in AnaClass.cxx/.h
7 //     dataType = "ESD", useGrid = kTRUE, pattern = "*ESDs/pass2/*ESDs.root", addCXXs = "AnaClass.cxx", 
8 //     addHs = "AnaClass.h", gridDir = "/alice/data/2012/LHC12g", gridMode = "full", runNumbers = "188359 188362"
9 //     
10 // -> Analyze AODs (up to 96 files) locally given in files_aod.txt
11 //     dataType = "AOD", useGrid = kFALSE, numLocalFiles = 96
12 //
13 // MERGING ON ALIEN
14 // ++++++++++++++++
15 // If you run on the grid, you can monitor the jobs with alimonitor.cern.ch. When enough of them are in DONE state,
16 // you have to merge the output. This can be done automatically, if you just change the gridMode to "terminate" and
17 // give the EXACT name of the task whose output should be merged in uniqueName.
18 // 
19 //
20 // Authors: R. Haake, S. Aiola
21
22 #include <ctime>
23 #include "TGrid.h"
24
25 AliAnalysisGrid* CreateAlienHandler(const char* uniqueName, const char* gridDir, const char* gridMode, const char* runNumbers, const Int_t nrunspermaster, 
26                                      const char* pattern, TString additionalCode, TString additionalHeaders, Int_t maxFilesPerWorker, 
27                                      Int_t workerTTL, Bool_t isMC);
28                                     
29 //______________________________________________________________________________
30 void AnalysisTrainCorrJetsLocal (
31          const char*    dataType            = "AOD",                       // set the analysis type, AOD, ESD or sESD
32          Bool_t         useGrid             = kTRUE,                      // local or grid
33          TString localfilename = "/data/Work/jets/testEMCalJetFramework/ptJdistrAug2nd/setMCtasks/map/inheritDev/files_LHC10f7a.txt",
34          const char*    gridMode            = "test",                      // set the grid run mode (can be "full", "test", "offline", "submit" or "terminate")
35          const char*    pattern             = "*AOD136/*AliAOD.root", //"*/*/AliAOD.root" "*ESDs/pass1/AOD106/*AliAOD.root",    // file pattern (here one can specify subdirs like passX etc.) (used on grid)
36          const char*    gridDir             = "/alice/sim/LHC10f7a",   // /alice/data/2011/LHC11d /alice/sim/2012/LHC12f2b   dir on alien, where the files live (used on grid)
37          const char*    runNumbers          = /*114931 */" 115186 115193 115393 115401 115414 116102 116288 116402 116403 116562 116571 116574 116643 116645 117048 117050 117052 117053 117054 117059 117060 117063 117065 117077 117086 117092 117099 117109 117112 117116 117220 117222 119159 119161 119163 119841 119842 119844 119845 119846 119849 119853 119856 119859 119862 120067 120069 120072 120073 120076 120079 120244 120503 120504 120505 120616 120617 120671 120741 120750 120758 120820 120821 120822 120823 120824 120825 120829 122374 122375 124187 124191 124355 124358 124362 124367 124378 124380 124381 124604 124605 124606 124607 124608 124702 124746 124750 124751 125023 125085 125097 125100 125101 125133 125134 125139 125140 125156 125186 125296 125628 125630 125632 125633 125842 125843 125844 125847 125848 125849 125850 125851 125855 126004 126007 126008 126073 126078 126081 126082 126088 126090 126097 126158 126160 126167 126168 126283 126284 126285 126350 126351 126352 126359 126403 126404 126405 126406 126407 126408 126409 126422 126424 126425 126432 126437 127719 127724 127729 127730 127814 127819 127930 127940 128263 128778 128913 129536 129599 129639 129641 129654 129659 129666 129667 129723 129725 129726 129729 129735 129736 129738 129742 129744 129959 129960 129961 129962 129966 129983 130149 130151 130157 130158 130172 130178 130179 130342 130343 130354 130356 130358 130360 130375 130479 130480 130481 130517 130519 130520 130524 130526 130601 130608 130620 130621 130623 130628 130696 130704 130793 130795 130798 130799 130834 130840 130842 130844 130847 130848",             // considered run numbers (used on grid) /*LHC12g 188359 188362, LHC11a 146860 146859*/ /*LHC12f2b 158285 159582 */
38          const Int_t nrunspermaster= 100,
39          UInt_t         numLocalFiles       = 10,                          // number of files analyzed locally  
40          const char*    runPeriod           = "LHC10f7a",                    // set the run period (used on grid)
41          const char*    uniqueName          = "DJetNewCodeMCSandBchJ",     // sets base string for the name of the task on the grid
42          UInt_t         pSel                = AliVEvent::kAny,             // used event selection for every task except for the analysis tasks
43          Bool_t         useTender           = kFALSE,                      // trigger, if tender task should be used
44          Bool_t         isMC                = kTRUE,                      // trigger, if MC handler should be used
45          Bool_t         isReco                = kTRUE,
46          Bool_t         isMap                = kTRUE,
47          // Here you have to specify additional code files you want to use but that are not in aliroot
48          const char*    addCXXs             = "",
49          const char*    addHs               = "",
50
51          // These two settings depend on the dataset and your quotas on the AliEN services
52          Int_t          maxFilesPerWorker   = 20,
53          Int_t          workerTTL           = 86000,
54          Int_t          nfiletestmode       = 50
55          )
56 {
57
58   // Some pre-settings and constants
59
60   enum AlgoType {kKT, kANTIKT};
61   enum JetType  {kFULLJETS, kCHARGEDJETS, kNEUTRALJETS};
62   gSystem->SetFPEMask();
63   gSystem->Setenv("ETRAIN_ROOT", ".");
64   gSystem->Setenv("ETRAIN_PERIOD", runPeriod);
65   // change this objects to strings
66   TString usedData(dataType);
67   TString additionalCXXs(addCXXs);
68   TString additionalHs(addHs);
69   cout << dataType << " analysis chosen" << endl;
70   if (useGrid)  
71   {
72     cout << "-- using AliEn grid.\n";
73     if (usedData == "sESD") 
74     {
75       cout << "Skimmed ESD analysis not available on the grid!" << endl;
76       return;
77     }
78   }
79   else
80     cout << "-- using local analysis.\n";
81   
82
83   // Load necessary libraries
84   LoadLibs();
85
86   // Create analysis manager
87   AliAnalysisManager* mgr = new AliAnalysisManager(uniqueName);
88
89   // Check type of input and create handler for it
90   TString localFiles("-1");
91   if(usedData == "AOD")
92   {
93     localFiles = localfilename;
94     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/train/AddAODHandler.C");
95     AliAODInputHandler* aodH = AddAODHandler();
96   }
97   else if((usedData == "ESD") || (usedData == "sESD"))
98   {
99     if (usedData == "ESD")
100       localFiles = "files_esd.txt";
101     else
102       localFiles = "files_sesd.txt";
103     
104     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/train/AddESDHandler.C");
105     AliESDInputHandler* esdH = AddESDHandler();
106   }
107   else
108   {
109     cout << "Data type not recognized! You have to specify ESD, AOD, or sESD!\n";
110   }
111   
112   if(!useGrid)
113     cout << "Using " << localFiles.Data() << " as input file list.\n";
114
115   gROOT->LoadMacro("$ALICE_ROOT/PWGJE/FlavourJetTasks/macros/AddTasksFlavourJet.C");
116   //List of arguments:
117
118   // const Int_t iCandType = 1 /*0 = D0, 1=Dstar...*/,
119   //  const TString sCutFile = "cutsHF/D0toKpiCutsppRecVtxNoPileupRejNoEMCAL.root",
120   //  const Double_t dJetPtCut   = 1.,
121   //  const Double_t dJetAreaCut = 0.,
122   //  const char *acctype = "TPC",
123   //  const TString sRunPeriod = "LHC10b",
124   //  const Int_t    uBeamType = 0,
125   //  const UInt_t uTriggerMask = AliVEvent::kMB, /*for jets; the D mesons trigger is defined in the cut object*/
126   //  const Bool_t bIsMC = kFALSE,
127   //  const Bool_t bIsReco = kFALSE,
128   //  const Bool_t bIsMap = kFALSE,
129   //  TString sText=""/*completes the name of the candidate task lists*/
130
131   //AddTasksFlavourJet(1,"/data/Work/jets/testEMCalJetFramework/CutFilesMB/DStartoKpipiCuts_new.root",10.,0.,"TPC",runPeriod,0,pSel,isMC,isReco,isMap,"");
132   AddTasksFlavourJet(1,"/data/Work/jets/testEMCalJetFramework/CutFilesMB/DStartoKpipiCuts.root",5.,0.,"TPC",runPeriod,0,pSel,isMC,isReco,isMap,"");
133
134   // Set the physics selection for all given tasks
135   TObjArray *toptasks = mgr->GetTasks();
136   for (Int_t i=0; i<toptasks->GetEntries(); ++i) 
137   {
138     AliAnalysisTaskSE *task = dynamic_cast<AliAnalysisTaskSE*>(toptasks->At(i));
139     if (!task)
140       continue;
141     if (task->InheritsFrom("AliPhysicsSelectionTask"))
142       continue;
143     ::Info("setPSel", "Set physics selection for %s (%s)", task->GetName(), task->ClassName());
144     task->SelectCollisionCandidates(pSel);
145   }
146
147   if(gridMode=="full") mgr->SetUseProgressBar(1, 25);
148         
149   if (!mgr->InitAnalysis()) 
150     return;
151   mgr->PrintStatus();
152
153   if (useGrid) 
154   {  // GRID CALCULATION
155
156     AliAnalysisGrid *plugin = CreateAlienHandler(uniqueName, gridDir, gridMode, runNumbers, nrunspermaster, pattern, additionalCXXs, additionalHs, maxFilesPerWorker, workerTTL, isMC);
157     plugin->SetNtestFiles(nfiletestmode); 
158
159     mgr->SetGridHandler(plugin);
160
161     // start analysis
162     cout << "Starting GRID Analysis...";
163     if(gridMode=="test") mgr->SetDebugLevel(10);
164     else mgr->SetDebugLevel(0);
165     mgr->StartAnalysis("grid");
166   }
167   else
168   {  // LOCAL CALCULATION
169
170     TChain* chain = 0;
171     if (usedData == "AOD") 
172     {
173       Printf("Run Create AOD Chain");
174       gROOT->LoadMacro("/data/Work/jets/testEMCalJetFramework/AODchainWithFriend/CreateAODChain.C");
175       chain = CreateAODChain(localFiles.Data(), numLocalFiles,0,kTRUE,kTRUE);
176       //Printf("Chain Friend has %d entries", ((TTree*)chain->GetFriend())->GetEntriesFast());
177     }
178     else
179     {  // ESD or skimmed ESD
180       gROOT->LoadMacro("$ALICE_ROOT/PWG/EMCAL/macros/CreateESDChain.C");
181       chain = CreateESDChain(localFiles.Data(), numLocalFiles);
182     }
183     
184     // start analysis
185     cout << "Starting LOCAL Analysis...";
186     mgr->SetDebugLevel(10);
187     mgr->StartAnalysis("local", chain);
188   }
189 }
190
191 //______________________________________________________________________________
192 void LoadLibs()
193 {
194   // Load common libraries (better too many than too few)
195   gSystem->Load("libTree");
196   gSystem->Load("libVMC");
197   gSystem->Load("libGeom");
198   gSystem->Load("libGui");
199   gSystem->Load("libXMLParser");
200   gSystem->Load("libMinuit");
201   gSystem->Load("libMinuit2");
202   gSystem->Load("libProof");
203   gSystem->Load("libPhysics");
204   gSystem->Load("libSTEERBase");
205   gSystem->Load("libESD");
206   gSystem->Load("libAOD");
207   gSystem->Load("libOADB");
208   gSystem->Load("libANALYSIS");
209   gSystem->Load("libCDB");
210   gSystem->Load("libRAWDatabase");
211   gSystem->Load("libSTEER");
212   gSystem->Load("libEVGEN");
213   gSystem->Load("libANALYSISalice");
214   gSystem->Load("libCORRFW");
215   //gSystem->Load("libTOFbase");
216   //gSystem->Load("libTOFrec");
217   //gSystem->Load("libRAWDatabase.so");
218   //gSystem->Load("libRAWDatarec.so");
219   //gSystem->Load("libTPCbase.so");
220   //gSystem->Load("libTPCrec.so");
221   //gSystem->Load("libITSbase.so");
222   //gSystem->Load("libITSrec.so");
223   //gSystem->Load("libTRDbase.so");
224   //gSystem->Load("libTENDER.so");
225   //gSystem->Load("libSTAT.so");
226   //gSystem->Load("libTRDrec.so");
227   //gSystem->Load("libHMPIDbase.so");
228   gSystem->Load("libPWGTools.so");
229   //gSystem->Load("libPWGPP.so");
230   gSystem->Load("libPWGHFbase");
231   //gSystem->Load("libPWGDQdielectron");
232   //gSystem->Load("libPWGHFhfe");
233   gSystem->Load("libPWGflowBase.so");
234   gSystem->Load("libPWGflowTasks.so");
235   gSystem->Load("libPWGHFvertexingHF");
236   gSystem->Load("libEMCALUtils");
237   //gSystem->Load("libPHOSUtils");
238   //gSystem->Load("libPWGCaloTrackCorrBase");
239   gSystem->Load("libEMCALraw");
240   gSystem->Load("libEMCALbase");
241   //gSystem->Load("libEMCALrec");
242   //gSystem->Load("libTRDbase");
243   //gSystem->Load("libVZERObase");
244   //gSystem->Load("libVZEROrec");
245   gSystem->Load("libTENDER");
246   //gSystem->Load("libTENDERSupplies");
247   gSystem->Load("libPWGEMCAL");
248   gSystem->Load("libPWGGAEMCALTasks");
249   //gSystem->Load("libPWGCFCorrelationsBase");
250   //gSystem->Load("libPWGCFCorrelationsDPhi");
251
252   //load CGAL, Fastjet and SISCone
253   //gSystem->Load("libCGAL");
254   gSystem->Load("libfastjet");
255   gSystem->Load("libCDFConesPlugin");
256   gSystem->Load("libSISConePlugin");
257
258   gSystem->Load("libJETAN");
259   gSystem->Load("libFASTJETAN");
260   gSystem->Load("libPWGJEEMCALJetTasks");
261   gSystem->Load("libPWGJEFlavourJetTasks");
262
263
264   // include paths
265   gSystem->AddIncludePath("-Wno-deprecated");
266   gSystem->AddIncludePath("-I$ALICE_ROOT -I$ALICE_ROOT/include -I$ALICE_ROOT/EMCAL -I$ALICE_ROOT/PWG/EMCAL -I$ALICE_ROOT/PWGJE/EMCALJetTasks");
267   gSystem->AddIncludePath(" -I$ALICE_ROOT/PWGHF/ -I$ALICE_ROOT/PWGHF/base -I$ALICE_ROOT/PWGHF/vertexingHF -I$ALICE_ROOT/PWGJE/FlavourJetTasks");
268   gSystem->AddIncludePath("-I$ALICE_ROOT/PWGDQ/dielectron -I$ALICE_ROOT/PWGHF/hfe");
269   gSystem->AddIncludePath("-I$ALICE_ROOT/JETAN -I$ALICE_ROOT/JETAN/fastjet");
270 }
271
272 AliAnalysisGrid* CreateAlienHandler(const char* uniqueName, const char* gridDir, const char* gridMode, const char* runNumbers, const Int_t nrunspermaster,
273                                      const char* pattern, TString additionalCode, TString additionalHeaders, Int_t maxFilesPerWorker, 
274                                      Int_t workerTTL, Bool_t isMC)
275 {
276   TDatime currentTime;
277   TString tmpName(uniqueName);
278   /*
279   // Only add current date and time when not in terminate mode! In this case the exact name has to be supplied by the user
280   if(strcmp(gridMode, "terminate"))
281   {
282     tmpName += "_";
283     tmpName += currentTime.GetDate();
284     tmpName += "_";
285     tmpName += currentTime.GetTime();
286   }else tmpName +="_20130412_122423";
287   */
288   TString tmpAdditionalLibs("");
289   tmpAdditionalLibs = Form("libTree.so libVMC.so libGeom.so libGui.so libXMLParser.so libMinuit.so libMinuit2.so libProof.so libPhysics.so libSTEERBase.so libESD.so libESDfilter.so libAOD.so libOADB.so libANALYSIS.so libCDB.so libRAWDatabase.so libSTEER.so libANALYSISalice.so libCORRFW.so libPWGTools.so libPWGHFbase.so libPWGflowBase.so libPWGflowTasks.so libPWGHFvertexingHF.so libEMCALUtils.so libEMCALraw.so libEMCALbase.so libTENDER.so libPWGEMCAL.so libPWGGAEMCALTasks.so libPWGTools.so libCGAL.so libJETAN.so libfastjet.so libSISConePlugin.so libCDFConesPlugin.so libFASTJETAN.so libPWGJE.so libPWGmuon.so libPWGJEEMCALJetTasks.so libPWGJEFlavourJetTasks.so %s %s",additionalCode.Data(),additionalHeaders.Data());
290
291
292   TString macroName("");
293   TString execName("");
294   TString jdlName("");
295   macroName = Form("%s.C", tmpName.Data());
296   execName = Form("%s.sh", tmpName.Data());
297   jdlName = Form("%s.jdl", tmpName.Data());
298
299   AliAnalysisAlien *plugin = new AliAnalysisAlien();
300   plugin->SetOverwriteMode();
301   plugin->SetRunMode(gridMode);
302
303   // Here you can set the (Ali)ROOT version you want to use
304   plugin->SetAPIVersion("V1.1x");
305   plugin->SetROOTVersion("v5-34-08-4");
306   plugin->SetAliROOTVersion("v5-05-63-AN");
307
308   plugin->SetGridDataDir(gridDir); // e.g. "/alice/sim/LHC10a6"
309   plugin->SetDataPattern(pattern); //dir structure in run directory
310   plugin->SetFriendChainName("./AliAOD.VertexingHF.root");
311   if (!isMC)
312    plugin->SetRunPrefix("000");
313
314   plugin->AddRunList(runNumbers);
315   plugin->SetNrunsPerMaster(nrunspermaster);
316
317   plugin->SetGridWorkingDir(Form("%s",tmpName.Data()));
318   plugin->SetGridOutputDir("output"); 
319
320   plugin->SetAnalysisSource(additionalCode.Data());
321   plugin->SetAdditionalLibs(tmpAdditionalLibs.Data());
322   plugin->AddIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT -I$ALICE_ROOT/include -I$ALICE_ROOT/STEER/STEER -I$ALICE_ROOT/STEER/STEERBase -I$ALICE_ROOT/STEER/ESD -I$ALICE_ROOT/STEER/AOD -I$ALICE_ROOT/ANALYSIS  -I$ALICE_ROOT/OADB -I$ALICE_ROOT/PWGHF -I$ALICE_ROOT/PWGHF/base -I$ALICE_ROOT/PWGHF/vertexingHF -I$ALICE_ROOT/PWG/FLOW/Base -I$ALICE_ROOT/PWG/FLOW/Tasks  -I$ALICE_ROOT/PWGJE  -I$ALICE_ROOT/JETAN -I$ALICE_ROOT/PWGJE/EMCALJetTasks -I$ALICE_ROOT/PWGJE/FlavourJetTasks -g");
323   plugin->AddExternalPackage("boost::v1_43_0");
324   plugin->AddExternalPackage("cgal::v3.6");
325   plugin->AddExternalPackage("fastjet::v2.4.2");
326
327   plugin->SetDefaultOutputs(kTRUE);
328   // merging via jdl
329   plugin->SetMergeViaJDL(kTRUE);
330   plugin->SetOneStageMerging(kFALSE);
331   plugin->SetMaxMergeStages(2);
332
333   //plugin->SetMergeExcludes("");
334   plugin->SetAnalysisMacro(macroName.Data());
335   plugin->SetSplitMaxInputFileNumber(maxFilesPerWorker);
336   plugin->SetExecutable(execName.Data());
337   plugin->SetTTL(workerTTL);
338   plugin->SetInputFormat("xml-single");
339   plugin->SetJDLName(jdlName.Data());
340   plugin->SetPrice(1);      
341   plugin->SetSplitMode("se");
342
343   return plugin;
344 }