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