]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/FLOW/Documentation/examples/runFlowTaskExample.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGCF / FLOW / Documentation / examples / runFlowTaskExample.C
CommitLineData
f25e893d 1// Analysis type can be ESD, AOD, MC, ESDMCkineESD, ESDMCkineMC
2// in this simple example only ESD is supported
3const TString type = "ESD";
4// tracks used to determine the Q vector (Global, Tracklet or FMD at the moment)
5const TString rptype = "Global";
6// Boolean to fill/not fill the QA histograms
7Bool_t QA = kTRUE;
8
9// Boolean to use/not use weights for the Q vector
10Bool_t WEIGHTS[] = {kFALSE,kFALSE,kFALSE}; //Phi, v'(pt), v'(eta)
11
12
13void runFlowTaskExample(Int_t nRuns = 2,
14 Bool_t DATA = kFALSE, const Char_t* dataDir="/Users/snelling/alice_data/Therminator_midcentral", Int_t offset = 0)
15{
16 TStopwatch timer;
17 timer.Start();
18
19 //--------------------------------------
20 // Load the needed libraries most of them already loaded by aliroot
21 //--------------------------------------
22 gSystem->Load("libTree");
23 gSystem->Load("libGeom");
24 gSystem->Load("libVMC");
25 gSystem->Load("libXMLIO");
26 gSystem->Load("libPhysics");
27 gSystem->Load("libSTEERBase");
28 gSystem->Load("libESD");
29 gSystem->Load("libAOD");
30 gSystem->Load("libANALYSIS");
31 gSystem->Load("libANALYSISalice");
32 gSystem->Load("libCORRFW");
2e311896 33 gSystem->Load("libPWGflowBase");
34 gSystem->Load("libPWGflowTasks");
f25e893d 35
36
37 if (type!="AOD") { TChain* chain = CreateESDChain(dataDir, nRuns, offset);}
38 else { TChain* chain = CreateAODChain(dataDir, nRuns, offset);}
39
40
41 // CORRFW correction framework cuts
42 //----------Event cuts----------
43
44 TObjArray* mcEventList = new TObjArray(0);
45 AliCFEventGenCuts* mcEventCuts = new AliCFEventGenCuts("mcEventCuts","MC-level event cuts");
46 mcEventList->AddLast(mcEventCuts);
47
48 TObjArray* recEventList = new TObjArray(0);
49 AliCFEventRecCuts* recEventCuts = new AliCFEventRecCuts("recEventCuts","rec-level event cuts");
50 recEventList->AddLast(recEventCuts);
51
52 //----------Cuts for RP----------
53 TObjArray* mcListRP = new TObjArray(0);
54 AliCFTrackKineCuts *mcKineCutsRP = new AliCFTrackKineCuts("mcKineCutsRP","MC-level kinematic cuts");
55 mcListRP->AddLast(mcKineCutsRP);
56 AliCFParticleGenCuts *mcGenCutsRP = new AliCFParticleGenCuts("mcGenCutsRP","MC particle generation cuts for RP");
57 mcGenCutsRP->SetRequireIsPrimary();
58 mcListRP->AddLast(mcGenCutsRP);
59
60 TObjArray* fPIDCutListRP = new TObjArray(0) ;
61 AliCFTrackCutPid* cutPidRP = NULL;
62 fPIDCutListRP->AddLast(cutPidRP);
63
64 TObjArray* recListRP = new TObjArray(0) ;
65 AliCFTrackKineCuts *recKineCutsRP = new AliCFTrackKineCuts("recKineCutsRP","rec-level kine cuts");
66 recListRP->AddLast(recKineCutsRP);
67 AliCFTrackQualityCuts *recQualityCutsRP = new AliCFTrackQualityCuts("recQualityCutsRP","rec-level quality cuts");
68 recQualityCutsRP->SetMinNClusterTPC(70);
69 recListRP->AddLast(recQualityCutsRP);
70 AliCFTrackIsPrimaryCuts *recIsPrimaryCutsRP = new AliCFTrackIsPrimaryCuts("recIsPrimaryCutsRP","rec-level isPrimary cuts");
71 recIsPrimaryCutsRP->UseSPDvertex(kTRUE);
72 recIsPrimaryCutsRP->UseTPCvertex(kTRUE);
73 recListRP->AddLast(recIsPrimaryCutsRP);
74
75 TObjArray* accListRP = new TObjArray(0) ;
76 AliCFAcceptanceCuts *mcAccCutsRP = new AliCFAcceptanceCuts("mcAccCutsRP","MC acceptance cuts");
77 mcAccCutsRP->SetMinNHitITS(2);
78 accListRP->AddLast(mcAccCutsRP);
79
80 //----------Cuts for POI----------
81 TObjArray* mcListPOI = new TObjArray(0);
82 AliCFTrackKineCuts *mcKineCutsPOI = new AliCFTrackKineCuts("mcKineCutsPOI","MC-level kinematic cuts");
83 mcListPOI->AddLast(mcKineCutsPOI);
84 AliCFParticleGenCuts *mcGenCutsPOI = new AliCFParticleGenCuts("mcGenCutsPOI","MC particle generation cuts for POI");
85 mcGenCutsPOI->SetRequireIsPrimary();
86 mcListPOI->AddLast(mcGenCutsPOI);
87
88 TObjArray* fPIDCutListPOI = new TObjArray(0) ;
89 AliCFTrackCutPid* cutPidPOI = NULL;
90 fPIDCutListPOI->AddLast(cutPidPOI);
91
92 TObjArray* recListPOI = new TObjArray(0) ;
93 AliCFTrackKineCuts *recKineCutsPOI = new AliCFTrackKineCuts("recKineCutsPOI","rec-level kine cuts");
94 recListPOI->AddLast(recKineCutsPOI);
95 AliCFTrackQualityCuts *recQualityCutsPOI = new AliCFTrackQualityCuts("recQualityCutsPOI","rec-level quality cuts");
96 recQualityCutsPOI->SetMinNClusterTPC(70);
97 recListPOI->AddLast(recQualityCutsPOI);
98 AliCFTrackIsPrimaryCuts *recIsPrimaryCutsPOI = new AliCFTrackIsPrimaryCuts("recIsPrimaryCutsPOI","rec-level isPrimary cuts");
99 recIsPrimaryCutsPOI->UseSPDvertex(kTRUE);
100 recIsPrimaryCutsPOI->UseTPCvertex(kTRUE);
101 recListPOI->AddLast(recIsPrimaryCutsPOI);
102
103 TObjArray* accListPOI = new TObjArray(0) ;
104 AliCFAcceptanceCuts *mcAccCutsPOI = new AliCFAcceptanceCuts("mcAccCutsPOI","MC acceptance cuts");
105 mcAccCutsPOI->SetMinNHitITS(2);
106 accListPOI->AddLast(mcAccCutsPOI);
107
108 //----------Add Cut Lists to the CF Manager----------
109 printf("CREATE INTERFACE AND CUTS\n");
110 AliCFManager* cfmgrRP = new AliCFManager();
111 cfmgrRP->SetNStepEvent(3);
112 cfmgrRP->SetEventCutsList(AliCFManager::kEvtGenCuts,mcEventList);
113 cfmgrRP->SetEventCutsList(AliCFManager::kEvtRecCuts,recEventList);
114 cfmgrRP->SetNStepParticle(4);
115 cfmgrRP->SetParticleCutsList(AliCFManager::kPartGenCuts,mcListRP);
116 cfmgrRP->SetParticleCutsList(AliCFManager::kPartAccCuts,accListRP);
117 cfmgrRP->SetParticleCutsList(AliCFManager::kPartRecCuts,recListRP);
118 cfmgrRP->SetParticleCutsList(AliCFManager::kPartSelCuts,fPIDCutListRP);
119
120 AliCFManager* cfmgrPOI = new AliCFManager();
121 cfmgrPOI->SetNStepEvent(3);
122 cfmgrPOI->SetEventCutsList(AliCFManager::kEvtGenCuts,mcEventList);
123 cfmgrPOI->SetEventCutsList(AliCFManager::kEvtRecCuts,recEventList);
124 cfmgrPOI->SetNStepParticle(4);
125 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartGenCuts,mcListPOI);
126 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartAccCuts,accListPOI);
127 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartRecCuts,recListPOI);
128 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartSelCuts,fPIDCutListPOI);
129
130
131 // Make the analysis manager
132 AliAnalysisManager *mgr = new AliAnalysisManager("FlowAnalysisManager");
133
134 AliVEventHandler* esdH = new AliESDInputHandler;
135 mgr->SetInputEventHandler(esdH);
136 AliMCEventHandler *mc = new AliMCEventHandler();
137 mgr->SetMCtruthEventHandler(mc);
138
139
63b6cbd0 140 // gROOT->LoadMacro("$ALICE_ROOT/OADB/macros/AddTaskPhysicsSelection.C");
f25e893d 141 // AliPhysicsSelectionTask* physicsSelTask = AddTaskPhysicsSelection();
142 // if (!DATA) {physicsSelTask->GetPhysicsSelection()->SetAnalyzeMC();}
143
144 // Add the task which makes the flowevent to the analysis manager
145 AliAnalysisTaskFlowEvent* taskFE = new AliAnalysisTaskFlowEvent("TaskFlowEvent",rptype,kFALSE,1);
146 taskFE->SetAnalysisType(type);
147 // taskFE->SelectCollisionCandidates();
148 mgr->AddTask(taskFE);
149
150 // Set the cuts for the flowevent
151 taskFE->SetCFManager1(cfmgrRP);
152 taskFE->SetCFManager2(cfmgrPOI);
153
154 // Instantiate the flow methods and add to the analysis manager
155 AliAnalysisTaskMCEventPlane *taskMCEP = new AliAnalysisTaskMCEventPlane("TaskMCEventPlane");
156 mgr->AddTask(taskMCEP);
157 AliAnalysisTaskQCumulants *taskQC = new AliAnalysisTaskQCumulants("TaskQCumulants",kFALSE);
158 mgr->AddTask(taskQC);
159
160 // Create the output container for the data produced by the task
161 // Connect to the input and output containers
162 //===========================================================================
163 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();
164
165 AliAnalysisDataContainer *coutputFE =
166 mgr->CreateContainer("cobjFlowEventSimple", AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);
167 mgr->ConnectInput(taskFE,0,cinput1);
168 mgr->ConnectOutput(taskFE,1,coutputFE);
169
170
171 TString outputMCEP = AliAnalysisManager::GetCommonFileName();
172 outputMCEP += ":outputMCEPanalysis";
173 outputMCEP+= type;
174
175 AliAnalysisDataContainer *coutputMCEP = mgr->CreateContainer("cobjMCEP", TList::Class(),AliAnalysisManager::kOutputContainer,outputMCEP);
176 mgr->ConnectInput(taskMCEP,0,coutputFE);
177 mgr->ConnectOutput(taskMCEP,1,coutputMCEP);
178
179
180 TString outputQC = AliAnalysisManager::GetCommonFileName();
181 outputQC += ":outputQCanalysis";
182 outputQC+= type;
183
184 AliAnalysisDataContainer *coutputQC = mgr->CreateContainer("cobjQC", TList::Class(),AliAnalysisManager::kOutputContainer,outputQC);
185 mgr->ConnectInput(taskQC,0,coutputFE);
186 mgr->ConnectOutput(taskQC,1,coutputQC);
187
188 // Run the analysis
189 if (!mgr->InitAnalysis()) return;
190 mgr->PrintStatus();
191 mgr->StartAnalysis("local",chain);
192
193 timer.Stop();
194 timer.Print();
195
196}
197
198// Helper macros for creating chains
199// from: CreateESDChain.C,v 1.10 jgrosseo Exp
200
201TChain* CreateESDChain(const char* aDataDir, Int_t aRuns, Int_t offset)
202{
203 // creates chain of files in a given directory or file containing a list.
204 // In case of directory the structure is expected as:
205 // <aDataDir>/<dir0>/AliESDs.root
206 // <aDataDir>/<dir1>/AliESDs.root
207 // ...
208
209 if (!aDataDir)
210 return 0;
211
212 Long_t id, size, flags, modtime;
213 if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
214 {
215 printf("%s not found.\n", aDataDir);
216 return 0;
217 }
218
219 TChain* chain = new TChain("esdTree");
220 TChain* chaingAlice = 0;
221
222 if (flags & 2)
223 {
224 TString execDir(gSystem->pwd());
225 TSystemDirectory* baseDir = new TSystemDirectory(".", aDataDir);
226 TList* dirList = baseDir->GetListOfFiles();
227 Int_t nDirs = dirList->GetEntries();
228 gSystem->cd(execDir);
229
230 Int_t count = 0;
231
232 for (Int_t iDir=0; iDir<nDirs; ++iDir)
233 {
234 TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
235 if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
236 continue;
237
238 if (offset > 0)
239 {
240 --offset;
241 continue;
242 }
243
244 if (count++ == aRuns)
245 break;
246
247 TString presentDirName(aDataDir);
248 presentDirName += "/";
249 presentDirName += presentDir->GetName();
250 chain->Add(presentDirName + "/AliESDs.root/esdTree");
251 // cerr<<presentDirName<<endl;
252 }
253
254 }
255 else
256 {
257 // Open the input stream
258 ifstream in;
259 in.open(aDataDir);
260
261 Int_t count = 0;
262
263 // Read the input list of files and add them to the chain
264 TString esdfile;
265 while(in.good()) {
266 in >> esdfile;
267 if (!esdfile.Contains("root")) continue; // protection
268
269 if (offset > 0)
270 {
271 --offset;
272 continue;
273 }
274
275 if (count++ == aRuns)
276 break;
277
278 // add esd file
279 chain->Add(esdfile);
280 }
281
282 in.close();
283 }
284
285 return chain;
286}
287
288
289// Helper macros for creating chains
290// from: CreateESDChain.C,v 1.10 jgrosseo Exp
291
292TChain* CreateAODChain(const char* aDataDir, Int_t aRuns, Int_t offset)
293{
294 // creates chain of files in a given directory or file containing a list.
295 // In case of directory the structure is expected as:
296 // <aDataDir>/<dir0>/AliAOD.root
297 // <aDataDir>/<dir1>/AliAOD.root
298 // ...
299
300 if (!aDataDir)
301 return 0;
302
303 Long_t id, size, flags, modtime;
304 if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
305 {
306 printf("%s not found.\n", aDataDir);
307 return 0;
308 }
309
310 TChain* chain = new TChain("aodTree");
311 TChain* chaingAlice = 0;
312
313 if (flags & 2)
314 {
315 TString execDir(gSystem->pwd());
316 TSystemDirectory* baseDir = new TSystemDirectory(".", aDataDir);
317 TList* dirList = baseDir->GetListOfFiles();
318 Int_t nDirs = dirList->GetEntries();
319 gSystem->cd(execDir);
320
321 Int_t count = 0;
322
323 for (Int_t iDir=0; iDir<nDirs; ++iDir)
324 {
325 TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
326 if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
327 continue;
328
329 if (offset > 0)
330 {
331 --offset;
332 continue;
333 }
334
335 if (count++ == aRuns)
336 break;
337
338 TString presentDirName(aDataDir);
339 presentDirName += "/";
340 presentDirName += presentDir->GetName();
341 chain->Add(presentDirName + "/AliAOD.root/aodTree");
342 // cerr<<presentDirName<<endl;
343 }
344
345 }
346 else
347 {
348 // Open the input stream
349 ifstream in;
350 in.open(aDataDir);
351
352 Int_t count = 0;
353
354 // Read the input list of files and add them to the chain
355 TString aodfile;
356 while(in.good()) {
357 in >> aodfile;
358 if (!aodfile.Contains("root")) continue; // protection
359
360 if (offset > 0)
361 {
362 --offset;
363 continue;
364 }
365
366 if (count++ == aRuns)
367 break;
368
369 // add aod file
370 chain->Add(aodfile);
371 }
372
373 in.close();
374 }
375
376 return chain;
377}
378