1 // Analysis type can be ESD, AOD, MC, ESDMCkineESD, ESDMCkineMC
2 // in this simple example only ESD is supported
3 const TString type = "ESD";
4 // tracks used to determine the Q vector (Global, Tracklet or FMD at the moment)
5 const TString rptype = "Global";
6 // Boolean to fill/not fill the QA histograms
9 // Boolean to use/not use weights for the Q vector
10 Bool_t WEIGHTS[] = {kFALSE,kFALSE,kFALSE}; //Phi, v'(pt), v'(eta)
13 void runFlowTaskExample(Int_t nRuns = 2,
14 Bool_t DATA = kFALSE, const Char_t* dataDir="/Users/snelling/alice_data/Therminator_midcentral", Int_t offset = 0)
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");
33 gSystem->Load("libPWGflowBase");
34 gSystem->Load("libPWGflowTasks");
37 if (type!="AOD") { TChain* chain = CreateESDChain(dataDir, nRuns, offset);}
38 else { TChain* chain = CreateAODChain(dataDir, nRuns, offset);}
41 // CORRFW correction framework cuts
42 //----------Event cuts----------
44 TObjArray* mcEventList = new TObjArray(0);
45 AliCFEventGenCuts* mcEventCuts = new AliCFEventGenCuts("mcEventCuts","MC-level event cuts");
46 mcEventList->AddLast(mcEventCuts);
48 TObjArray* recEventList = new TObjArray(0);
49 AliCFEventRecCuts* recEventCuts = new AliCFEventRecCuts("recEventCuts","rec-level event cuts");
50 recEventList->AddLast(recEventCuts);
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);
60 TObjArray* fPIDCutListRP = new TObjArray(0) ;
61 AliCFTrackCutPid* cutPidRP = NULL;
62 fPIDCutListRP->AddLast(cutPidRP);
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);
75 TObjArray* accListRP = new TObjArray(0) ;
76 AliCFAcceptanceCuts *mcAccCutsRP = new AliCFAcceptanceCuts("mcAccCutsRP","MC acceptance cuts");
77 mcAccCutsRP->SetMinNHitITS(2);
78 accListRP->AddLast(mcAccCutsRP);
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);
88 TObjArray* fPIDCutListPOI = new TObjArray(0) ;
89 AliCFTrackCutPid* cutPidPOI = NULL;
90 fPIDCutListPOI->AddLast(cutPidPOI);
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);
103 TObjArray* accListPOI = new TObjArray(0) ;
104 AliCFAcceptanceCuts *mcAccCutsPOI = new AliCFAcceptanceCuts("mcAccCutsPOI","MC acceptance cuts");
105 mcAccCutsPOI->SetMinNHitITS(2);
106 accListPOI->AddLast(mcAccCutsPOI);
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);
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);
131 // Make the analysis manager
132 AliAnalysisManager *mgr = new AliAnalysisManager("FlowAnalysisManager");
134 AliVEventHandler* esdH = new AliESDInputHandler;
135 mgr->SetInputEventHandler(esdH);
136 AliMCEventHandler *mc = new AliMCEventHandler();
137 mgr->SetMCtruthEventHandler(mc);
140 // gROOT->LoadMacro("$ALICE_ROOT/OADB/macros/AddTaskPhysicsSelection.C");
141 // AliPhysicsSelectionTask* physicsSelTask = AddTaskPhysicsSelection();
142 // if (!DATA) {physicsSelTask->GetPhysicsSelection()->SetAnalyzeMC();}
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);
150 // Set the cuts for the flowevent
151 taskFE->SetCFManager1(cfmgrRP);
152 taskFE->SetCFManager2(cfmgrPOI);
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);
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();
165 AliAnalysisDataContainer *coutputFE =
166 mgr->CreateContainer("cobjFlowEventSimple", AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);
167 mgr->ConnectInput(taskFE,0,cinput1);
168 mgr->ConnectOutput(taskFE,1,coutputFE);
171 TString outputMCEP = AliAnalysisManager::GetCommonFileName();
172 outputMCEP += ":outputMCEPanalysis";
175 AliAnalysisDataContainer *coutputMCEP = mgr->CreateContainer("cobjMCEP", TList::Class(),AliAnalysisManager::kOutputContainer,outputMCEP);
176 mgr->ConnectInput(taskMCEP,0,coutputFE);
177 mgr->ConnectOutput(taskMCEP,1,coutputMCEP);
180 TString outputQC = AliAnalysisManager::GetCommonFileName();
181 outputQC += ":outputQCanalysis";
184 AliAnalysisDataContainer *coutputQC = mgr->CreateContainer("cobjQC", TList::Class(),AliAnalysisManager::kOutputContainer,outputQC);
185 mgr->ConnectInput(taskQC,0,coutputFE);
186 mgr->ConnectOutput(taskQC,1,coutputQC);
189 if (!mgr->InitAnalysis()) return;
191 mgr->StartAnalysis("local",chain);
198 // Helper macros for creating chains
199 // from: CreateESDChain.C,v 1.10 jgrosseo Exp
201 TChain* CreateESDChain(const char* aDataDir, Int_t aRuns, Int_t offset)
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
212 Long_t id, size, flags, modtime;
213 if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
215 printf("%s not found.\n", aDataDir);
219 TChain* chain = new TChain("esdTree");
220 TChain* chaingAlice = 0;
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);
232 for (Int_t iDir=0; iDir<nDirs; ++iDir)
234 TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
235 if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
244 if (count++ == aRuns)
247 TString presentDirName(aDataDir);
248 presentDirName += "/";
249 presentDirName += presentDir->GetName();
250 chain->Add(presentDirName + "/AliESDs.root/esdTree");
251 // cerr<<presentDirName<<endl;
257 // Open the input stream
263 // Read the input list of files and add them to the chain
267 if (!esdfile.Contains("root")) continue; // protection
275 if (count++ == aRuns)
289 // Helper macros for creating chains
290 // from: CreateESDChain.C,v 1.10 jgrosseo Exp
292 TChain* CreateAODChain(const char* aDataDir, Int_t aRuns, Int_t offset)
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
303 Long_t id, size, flags, modtime;
304 if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
306 printf("%s not found.\n", aDataDir);
310 TChain* chain = new TChain("aodTree");
311 TChain* chaingAlice = 0;
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);
323 for (Int_t iDir=0; iDir<nDirs; ++iDir)
325 TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
326 if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
335 if (count++ == aRuns)
338 TString presentDirName(aDataDir);
339 presentDirName += "/";
340 presentDirName += presentDir->GetName();
341 chain->Add(presentDirName + "/AliAOD.root/aodTree");
342 // cerr<<presentDirName<<endl;
348 // Open the input stream
354 // Read the input list of files and add them to the chain
358 if (!aodfile.Contains("root")) continue; // protection
366 if (count++ == aRuns)