]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/FLOW/macros/AddTaskFlowCentralityPIDQC.C
Redmer Bertens and Carlos Perez: Update for VZERO porting into Flow package
[u/mrichter/AliRoot.git] / PWGCF / FLOW / macros / AddTaskFlowCentralityPIDQC.C
CommitLineData
31e0a55e 1/////////////////////////////////////////////////////////////////////////////////////////////\r
2//\r
3// AddTask* macro for flow analysis\r
4// Creates a Flow Event task and adds it to the analysis manager.\r
5// Sets the cuts using the correction framework (CORRFW) classes.\r
6// Also creates Flow Analysis tasks and connects them to the output of the flow event task.\r
7//\r
8/////////////////////////////////////////////////////////////////////////////////////////////\r
9\r
6ea349ad 10void AddTaskFlowCentralityPIDQC(Int_t centralitysel,\r
11 Float_t centrMin=10.,\r
31e0a55e 12 Float_t centrMax=20.,\r
13 TString fileNameBase="output",\r
14 Bool_t isPID = kTRUE,\r
15 AliPID::EParticleType particleType=AliPID::kPion,\r
16 AliFlowTrackCuts::PIDsource sourcePID = AliFlowTrackCuts::kTOFbayesian,\r
17 Int_t charge=0,\r
18 Int_t harmonic=2,\r
19 Bool_t doQA=kFALSE,\r
a2a4ff0f 20 Float_t etamin=-0.8,\r
21 Float_t etamax=0.8, \r
31e0a55e 22 TString uniqueStr="" )\r
23{\r
24 // Define the range for eta subevents (for SP method)\r
25 Double_t minA = -5;\r
26 Double_t maxA = -1.5;\r
27 Double_t minB = 1.5;\r
28 Double_t maxB = 5;\r
29\r
30 // AFTERBURNER\r
31 Bool_t useAfterBurner=kFALSE;\r
32 Double_t v1=0.0;\r
33 Double_t v2=0.0;\r
34 Double_t v3=0.0;\r
35 Double_t v4=0.0;\r
36 Int_t numberOfTrackClones=0; //non-flow\r
37\r
38 // Define a range of the detector to exclude\r
39 Bool_t ExcludeRegion = kFALSE;\r
40 Double_t excludeEtaMin = -0.;\r
41 Double_t excludeEtaMax = 0.;\r
42 Double_t excludePhiMin = 0.;\r
43 Double_t excludePhiMax = 0.;\r
44\r
45 // use physics selection class\r
46 Bool_t UsePhysicsSelection = kTRUE;\r
47\r
48 // QA\r
49 Bool_t runQAtask=kFALSE;\r
50 Bool_t FillQAntuple=kFALSE;\r
51 Bool_t DoQAcorrelations=kFALSE;\r
52\r
53 // RUN SETTINGS\r
54 // Flow analysis method can be:(set to kTRUE or kFALSE)\r
55 Bool_t SP = kFALSE; // scalar product method (similar to eventplane method)\r
56 Bool_t QC = kTRUE; // cumulants using Q vectors\r
57 \r
58 //these are OBSOLETE, use at own peril\r
59 Bool_t GFC = kFALSE; // cumulants based on generating function\r
60 Bool_t MCEP = kFALSE; // correlation with Monte Carlo reaction plane\r
61 Bool_t FQD = kFALSE; // fit of the distribution of the Q vector (only integrated v)\r
62 Bool_t LYZ1SUM = kFALSE; // Lee Yang Zeroes using sum generating function (integrated v)\r
63 Bool_t LYZ1PROD = kFALSE; // Lee Yang Zeroes using product generating function (integrated v)\r
64 Bool_t LYZ2SUM = kFALSE; // Lee Yang Zeroes using sum generating function (second pass differential v)\r
65 Bool_t LYZ2PROD = kFALSE; // Lee Yang Zeroes using product generating function (second pass differential v)\r
66 Bool_t LYZEP = kFALSE; // Lee Yang Zeroes Event plane using sum generating function (gives eventplane + weight)\r
67 Bool_t MH = kFALSE; // azimuthal correlators in mixed harmonics \r
68 Bool_t NL = kFALSE; // nested loops (for instance distribution of phi1-phi2 for all distinct pairs)\r
69\r
70 Bool_t METHODS[] = {SP,LYZ1SUM,LYZ1PROD,LYZ2SUM,LYZ2PROD,LYZEP,GFC,QC,FQD,MCEP,MH,NL};\r
71\r
72 // Boolean to use/not use weights for the Q vector\r
73 Bool_t WEIGHTS[] = {kFALSE,kFALSE,kFALSE}; //Phi, v'(pt), v'(eta)\r
74\r
75 // SETTING THE CUTS\r
76\r
77 //---------Data selection----------\r
78 //kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet\r
79 AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;\r
80 AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;\r
81\r
82 //---------Parameter mixing--------\r
83 //kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt\r
84 AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;\r
85 AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;\r
86\r
87\r
88 const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);\r
89 const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype);\r
90\r
91 //===========================================================================\r
92 // EVENTS CUTS:\r
93 AliFlowEventCuts* cutsEvent = new AliFlowEventCuts("event cuts");\r
94 cutsEvent->SetCentralityPercentileRange(centrMin,centrMax);\r
3d3a73c7 95 cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kVZERO);\r
96// cutsEvent->SetRefMultMethod(AliFlowEventCuts::kVZERO);\r
31e0a55e 97 //cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);\r
98// cutsEvent->SetNContributorsRange(2);\r
99 cutsEvent->SetPrimaryVertexZrange(-10.,10.);\r
100 cutsEvent->SetQA(doQA);\r
05b8872b 101 cutsEvent->SetCutTPCmultiplicityOutliers();\r
31e0a55e 102 \r
103 // RP TRACK CUTS:\r
104 AliFlowTrackCuts* cutsRP2 = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts();\r
105 AliFlowTrackCuts* cutsRP = new AliFlowTrackCuts("TPConlyRP");\r
106 cutsRP->SetParamType(rptype);\r
107 cutsRP->SetParamMix(rpmix);\r
108 cutsRP->SetPtRange(0.2,5.);\r
a2a4ff0f 109 cutsRP->SetEtaRange(etamin,etamax);\r
31e0a55e 110 cutsRP->SetMinNClustersTPC(70);\r
111// cutsRP->SetMinChi2PerClusterTPC(0.1);\r
112// cutsRP->SetMaxChi2PerClusterTPC(4.0);\r
113 cutsRP->SetMaxDCAToVertexXY(3.0);\r
114 cutsRP->SetMaxDCAToVertexZ(3.0);\r
115 cutsRP->SetAcceptKinkDaughters(kFALSE);\r
116 cutsRP->SetMinimalTPCdedx(10.);\r
94f72045 117 cutsRP->SetAODfilterBit(1); \r
31e0a55e 118 cutsRP->SetQA(doQA);\r
119\r
120 // POI TRACK CUTS:\r
05b8872b 121 AliFlowTrackCuts* cutsPOI = new AliFlowTrackCuts("TPConlyPOI");\r
342431d5 122 cutsPOI->GetBayesianResponse()->ForceOldDedx(); // for 2010 data to use old TPC PID Response instead of the official one\r
31e0a55e 123 cutsPOI->SetParamType(poitype);\r
124 cutsPOI->SetParamMix(poimix);\r
125 cutsPOI->SetPtRange(0.0,10.);\r
a2a4ff0f 126 cutsPOI->SetEtaRange(etamin,etamax);\r
31e0a55e 127 //cutsPOI->SetRequireCharge(kTRUE);\r
128 //cutsPOI->SetPID(PdgRP);\r
129 cutsPOI->SetMinNClustersTPC(70);\r
130// cutsPOI->SetMinChi2PerClusterTPC(0.1);\r
131// cutsPOI->SetMaxChi2PerClusterTPC(4.0);\r
132// cutsPOI->SetRequireITSRefit(kTRUE);\r
133// cutsPOI->SetRequireTPCRefit(kTRUE);\r
134// cutsPOI->SetMinNClustersITS(2);\r
135 //cutsPOI->SetMaxChi2PerClusterITS(1.e+09);\r
136 cutsPOI->SetMaxDCAToVertexXY(3.0);\r
137 cutsPOI->SetMaxDCAToVertexZ(3.0);\r
138 //cutsPOI->SetDCAToVertex2D(kTRUE);\r
139 //cutsPOI->SetMaxNsigmaToVertex(1.e+10);\r
140 //cutsPOI->SetRequireSigmaToVertex(kFALSE);\r
141 cutsPOI->SetAcceptKinkDaughters(kFALSE);\r
142 if(isPID) cutsPOI->SetPID(particleType, sourcePID);\r
143 if (charge!=0) cutsPOI->SetCharge(charge);\r
144 //cutsPOI->SetAllowTOFmismatch(kFALSE);\r
145 cutsPOI->SetRequireStrictTOFTPCagreement(kTRUE);\r
146 //iexample: francesco's tunig TPC Bethe Bloch for data:\r
147 //cutsPOI->GetESDpid().GetTPCResponse().SetBetheBlochParameters(4.36414e-02,1.75977e+01,1.14385e-08,2.27907e+00,3.36699e+00);\r
148 //cutsPOI->GetESDpid().GetTPCResponse().SetMip(49);\r
149 cutsPOI->SetMinimalTPCdedx(10.);\r
05b8872b 150 cutsPOI->SetAODfilterBit(1);\r
31e0a55e 151 cutsPOI->SetQA(doQA);\r
152 cutsPOI->SetPriors((centrMin+centrMax)*0.5); // set priors and PID as a function of the centrality\r
153\r
154 TString outputSlotName("");\r
155 outputSlotName+=uniqueStr;\r
156 outputSlotName+=Form("QC(%i) ",harmonic);\r
157 outputSlotName+=cutsRP->GetName();\r
158 outputSlotName+=" ";\r
159 outputSlotName+=cutsPOI->GetName();\r
160 outputSlotName+=Form(" %.0f-",centrMin);\r
161 outputSlotName+=Form("%.0f ",centrMax);\r
162 if(isPID){\r
163 outputSlotName+=AliFlowTrackCuts::PIDsourceName(sourcePID);\r
164 outputSlotName+=" ";\r
165 outputSlotName+=AliPID::ParticleName(particleType);\r
166 }\r
167 else{\r
168 outputSlotName+="AllCharged";\r
169 }\r
170 if (charge<0) outputSlotName+="-";\r
171 if (charge>0) outputSlotName+="+";\r
172\r
173 TString fileName(fileNameBase);\r
174 fileName.Append(".root");\r
175\r
176 Bool_t useWeights = WEIGHTS[0] || WEIGHTS[1] || WEIGHTS[2];\r
177 if (useWeights) cout<<"Weights are used"<<endl;\r
178 else cout<<"Weights are not used"<<endl;\r
179 \r
180 // Get the pointer to the existing analysis manager via the static access method.\r
181 //==============================================================================\r
182 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();\r
183 if (!mgr) {\r
184 Error("AddTaskFlowEvent", "No analysis manager to connect to.");\r
185 return NULL;\r
186 }\r
187 \r
188 // Check the analysis type using the event handlers connected to the analysis\r
189 // manager. The availability of MC handler can also be checked here.\r
190 //==============================================================================\r
191 if (!mgr->GetInputEventHandler()) {\r
192 ::Error("AddTaskFlowEvent", "This task requires an input event handler");\r
193 return NULL;\r
194 } \r
195\r
196 // Open external input files\r
197 //===========================================================================\r
198 //weights: \r
199 TFile *weightsFile = NULL;\r
200 TList *weightsList = NULL;\r
201\r
202 if(useWeights) {\r
203 //open the file with the weights:\r
204 weightsFile = TFile::Open("weights.root","READ");\r
205 if(weightsFile) {\r
206 //access the list which holds the histos with weigths:\r
207 weightsList = (TList*)weightsFile->Get("weights");\r
208 }\r
209 else {\r
210 cout<<" WARNING: the file <weights.root> with weights from the previous run was not available."<<endl;\r
211 break;\r
212 } \r
213 }\r
214 \r
215 //LYZ2\r
216 if (LYZ2SUM || LYZ2PROD) {\r
217 //read the outputfile of the first run\r
218 TString outputFileName = "AnalysisResults1.root";\r
219 TString pwd(gSystem->pwd());\r
220 pwd+="/";\r
221 pwd+=outputFileName.Data();\r
222 TFile *outputFile = NULL;\r
223 if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {\r
224 cout<<"WARNING: You do not have an output file:"<<endl;\r
225 cout<<" "<<pwd.Data()<<endl;\r
226 exit(0);\r
227 } else { outputFile = TFile::Open(pwd.Data(),"READ");}\r
228 \r
229 if (LYZ2SUM){ \r
230 // read the output directory from LYZ1SUM \r
231 TString inputFileNameLYZ2SUM = "outputLYZ1SUManalysis" ;\r
232 inputFileNameLYZ2SUM += rptypestr;\r
233 cout<<"The input directory is "<<inputFileNameLYZ2SUM.Data()<<endl;\r
234 TFile* fInputFileLYZ2SUM = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2SUM.Data());\r
235 if(!fInputFileLYZ2SUM || fInputFileLYZ2SUM->IsZombie()) { \r
236 cerr << " ERROR: To run LYZ2SUM you need the output file from LYZ1SUM. This file is not there! Please run LYZ1SUM first." << endl ; \r
237 break;\r
238 }\r
239 else {\r
240 TList* fInputListLYZ2SUM = (TList*)fInputFileLYZ2SUM->Get("LYZ1SUM");\r
241 if (!fInputListLYZ2SUM) {cout<<"list is NULL pointer!"<<endl;}\r
242 }\r
243 cout<<"LYZ2SUM input file/list read..."<<endl;\r
244 }\r
245\r
246 if (LYZ2PROD){ \r
247 // read the output directory from LYZ1PROD \r
248 TString inputFileNameLYZ2PROD = "outputLYZ1PRODanalysis" ;\r
249 inputFileNameLYZ2PROD += rptypestr;\r
250 cout<<"The input directory is "<<inputFileNameLYZ2PROD.Data()<<endl;\r
251 TFile* fInputFileLYZ2PROD = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2PROD.Data());\r
252 if(!fInputFileLYZ2PROD || fInputFileLYZ2PROD->IsZombie()) { \r
253 cerr << " ERROR: To run LYZ2PROD you need the output file from LYZ1PROD. This file is not there! Please run LYZ1PROD first." << endl ; \r
254 break;\r
255 }\r
256 else {\r
257 TList* fInputListLYZ2PROD = (TList*)fInputFileLYZ2PROD->Get("LYZ1PROD");\r
258 if (!fInputListLYZ2PROD) {cout<<"list is NULL pointer!"<<endl;}\r
259 }\r
260 cout<<"LYZ2PROD input file/list read..."<<endl;\r
261 }\r
262 }\r
263\r
264 if (LYZEP) {\r
265 //read the outputfile of the second run\r
266 TString outputFileName = "AnalysisResults2.root";\r
267 TString pwd(gSystem->pwd());\r
268 pwd+="/";\r
269 pwd+=outputFileName.Data();\r
270 TFile *outputFile = NULL;\r
271 if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {\r
272 cout<<"WARNING: You do not have an output file:"<<endl;\r
273 cout<<" "<<pwd.Data()<<endl;\r
274 exit(0);\r
275 } else {\r
276 outputFile = TFile::Open(pwd.Data(),"READ");\r
277 }\r
278 \r
279 // read the output file from LYZ2SUM\r
280 TString inputFileNameLYZEP = "outputLYZ2SUManalysis" ;\r
281 inputFileNameLYZEP += rptypestr;\r
282 cout<<"The input file is "<<inputFileNameLYZEP.Data()<<endl;\r
283 TFile* fInputFileLYZEP = (TFile*)outputFile->FindObjectAny(inputFileNameLYZEP.Data());\r
284 if(!fInputFileLYZEP || fInputFileLYZEP->IsZombie()) { \r
285 cerr << " ERROR: To run LYZEP you need the output file from LYZ2SUM. This file is not there! Please run LYZ2SUM first." << endl ; \r
286 break;\r
287 }\r
288 else {\r
289 TList* fInputListLYZEP = (TList*)fInputFileLYZEP->Get("LYZ2SUM");\r
290 if (!fInputListLYZEP) {cout<<"list is NULL pointer!"<<endl;}\r
291 }\r
292 cout<<"LYZEP input file/list read..."<<endl;\r
293 }\r
294 \r
295 \r
296 // Create the FMD task and add it to the manager\r
297 //===========================================================================\r
298 if (rptypestr == "FMD") {\r
299 AliFMDAnalysisTaskSE *taskfmd = NULL;\r
300 if (rptypestr == "FMD") {\r
301 taskfmd = new AliFMDAnalysisTaskSE("TaskFMD");\r
6ea349ad 302 taskfmd->SelectCollisionCandidates(centralitysel);\r
31e0a55e 303 mgr->AddTask(taskfmd);\r
304 \r
305 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();\r
306 pars->Init();\r
307 pars->SetProcessPrimary(kTRUE); //for MC only\r
308 pars->SetProcessHits(kFALSE);\r
309 \r
310 //pars->SetRealData(kTRUE); //for real data\r
311 //pars->SetProcessPrimary(kFALSE); //for real data\r
312 }\r
313 }\r
314 \r
315 // Create the flow event task, add it to the manager.\r
316 //===========================================================================\r
317 AliAnalysisTaskFlowEvent *taskFE = NULL;\r
318\r
319 if(useAfterBurner)\r
320 { \r
321 taskFE = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent %s",outputSlotName.Data()),"",doQA,1);\r
322 taskFE->SetFlow(v1,v2,v3,v4); \r
323 taskFE->SetNonFlowNumberOfTrackClones(numberOfTrackClones);\r
324 taskFE->SetAfterburnerOn();\r
6ea349ad 325 taskFE->SelectCollisionCandidates(centralitysel);\r
31e0a55e 326 }\r
6ea349ad 327 else {taskFE = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent %s",outputSlotName.Data()),"",doQA); \r
328 taskFE->SelectCollisionCandidates(centralitysel);}\r
31e0a55e 329 if (ExcludeRegion) {\r
330 taskFE->DefineDeadZone(excludeEtaMin, excludeEtaMax, excludePhiMin, excludePhiMax); \r
331 }\r
332 taskFE->SetSubeventEtaRange(minA, maxA, minB, maxB);\r
333 if (UsePhysicsSelection) {\r
334 taskFE->SelectCollisionCandidates(AliVEvent::kMB);\r
335 cout<<"Using Physics Selection"<<endl;\r
336 }\r
337 mgr->AddTask(taskFE);\r
338 \r
339 // Pass cuts for RPs and POIs to the task:\r
340 taskFE->SetCutsEvent(cutsEvent);\r
341 taskFE->SetCutsRP(cutsRP);\r
342 taskFE->SetCutsPOI(cutsPOI);\r
3d3a73c7 343 if (cutsRP->GetParamType()==AliFlowTrackCuts::kVZERO)\r
31e0a55e 344 { \r
345 //TODO: since this is set in a static object all analyses in an analysis train\r
346 //will be affected.\r
347 taskFE->SetHistWeightvsPhiMin(0.);\r
348 taskFE->SetHistWeightvsPhiMax(200.);\r
349 }\r
350\r
351 // Create the analysis tasks, add them to the manager.\r
352 //===========================================================================\r
353 if (SP){\r
354 AliAnalysisTaskScalarProduct *taskSP = new AliAnalysisTaskScalarProduct(Form("TaskScalarProduct %s",outputSlotName.Data()),WEIGHTS[0]);\r
6ea349ad 355 taskSP->SelectCollisionCandidates(centralitysel);\r
31e0a55e 356 taskSP->SetRelDiffMsub(1.0);\r
357 taskSP->SetApplyCorrectionForNUA(kTRUE);\r
358 mgr->AddTask(taskSP);\r
359 }\r
360 if (LYZ1SUM){\r
361 AliAnalysisTaskLeeYangZeros *taskLYZ1SUM = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosSUM %s",outputSlotName.Data()),kTRUE);\r
6ea349ad 362 taskLYZ1SUM->SelectCollisionCandidates(centralitysel);\r
31e0a55e 363 taskLYZ1SUM->SetFirstRunLYZ(kTRUE);\r
364 taskLYZ1SUM->SetUseSumLYZ(kTRUE);\r
365 mgr->AddTask(taskLYZ1SUM);\r
366 }\r
367 if (LYZ1PROD){\r
368 AliAnalysisTaskLeeYangZeros *taskLYZ1PROD = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosPROD %s",outputSlotName.Data()),kTRUE);\r
6ea349ad 369 taskLYZ1PROD->SelectCollisionCandidates(centralitysel);\r
31e0a55e 370 taskLYZ1PROD->SetFirstRunLYZ(kTRUE);\r
371 taskLYZ1PROD->SetUseSumLYZ(kFALSE);\r
372 mgr->AddTask(taskLYZ1PROD);\r
373 }\r
374 if (LYZ2SUM){\r
375 AliAnalysisTaskLeeYangZeros *taskLYZ2SUM = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosSUM %s",outputSlotName.Data()),kFALSE);\r
6ea349ad 376 taskLYZ2SUM->SelectCollisionCandidates(centralitysel);\r
31e0a55e 377 taskLYZ2SUM->SetFirstRunLYZ(kFALSE);\r
378 taskLYZ2SUM->SetUseSumLYZ(kTRUE);\r
379 mgr->AddTask(taskLYZ2SUM);\r
380 }\r
381 if (LYZ2PROD){\r
382 AliAnalysisTaskLeeYangZeros *taskLYZ2PROD = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosPROD %s",outputSlotName.Data()),kFALSE);\r
6ea349ad 383 taskLYZ2PROD->SelectCollisionCandidates(centralitysel);\r
31e0a55e 384 taskLYZ2PROD->SetFirstRunLYZ(kFALSE);\r
385 taskLYZ2PROD->SetUseSumLYZ(kFALSE);\r
386 mgr->AddTask(taskLYZ2PROD);\r
387 }\r
388 if (LYZEP){\r
389 AliAnalysisTaskLYZEventPlane *taskLYZEP = new AliAnalysisTaskLYZEventPlane(Form("TaskLYZEventPlane %s",outputSlotName.Data()));\r
6ea349ad 390 taskLYZEP->SelectCollisionCandidates(centralitysel);\r
31e0a55e 391 mgr->AddTask(taskLYZEP);\r
392 }\r
393 if (GFC){\r
394 AliAnalysisTaskCumulants *taskGFC = new AliAnalysisTaskCumulants(Form("TaskCumulants %s",outputSlotName.Data()),useWeights);\r
6ea349ad 395 taskGFC->SelectCollisionCandidates(centralitysel);\r
31e0a55e 396 taskGFC->SetUsePhiWeights(WEIGHTS[0]); \r
397 taskGFC->SetUsePtWeights(WEIGHTS[1]);\r
398 taskGFC->SetUseEtaWeights(WEIGHTS[2]); \r
399 mgr->AddTask(taskGFC);\r
400 }\r
401 if (QC){\r
402 AliAnalysisTaskQCumulants *taskQC = new AliAnalysisTaskQCumulants(Form("TaskQCumulants %s",outputSlotName.Data()),useWeights);\r
6ea349ad 403 taskQC->SelectCollisionCandidates(centralitysel);\r
31e0a55e 404 taskQC->SetUsePhiWeights(WEIGHTS[0]); \r
405 taskQC->SetUsePtWeights(WEIGHTS[1]);\r
406 taskQC->SetUseEtaWeights(WEIGHTS[2]); \r
407 taskQC->SetCalculateCumulantsVsM(kFALSE);\r
408 taskQC->SetnBinsMult(10000);\r
409 taskQC->SetMinMult(0.);\r
410 taskQC->SetMaxMult(10000.);\r
411 taskQC->SetHarmonic(harmonic);\r
412 taskQC->SetApplyCorrectionForNUA(kFALSE);\r
413 taskQC->SetFillMultipleControlHistograms(kFALSE); \r
414 mgr->AddTask(taskQC);\r
415 }\r
416 if (FQD){\r
417 AliAnalysisTaskFittingQDistribution *taskFQD = new AliAnalysisTaskFittingQDistribution(Form("TaskFittingQDistribution %s",outputSlotName.Data()),kFALSE);\r
6ea349ad 418 taskFQD->SelectCollisionCandidates(centralitysel);\r
31e0a55e 419 taskFQD->SetUsePhiWeights(WEIGHTS[0]); \r
420 taskFQD->SetqMin(0.);\r
421 taskFQD->SetqMax(1000.);\r
422 taskFQD->SetqNbins(10000);\r
423 mgr->AddTask(taskFQD);\r
424 }\r
425 if (MCEP){\r
426 AliAnalysisTaskMCEventPlane *taskMCEP = new AliAnalysisTaskMCEventPlane(Form("TaskMCEventPlane %s",outputSlotName.Data()));\r
6ea349ad 427 taskMCEP->SelectCollisionCandidates(centralitysel);\r
31e0a55e 428 mgr->AddTask(taskMCEP);\r
429 }\r
430 if (MH){\r
431 AliAnalysisTaskMixedHarmonics *taskMH = new AliAnalysisTaskMixedHarmonics(Form("TaskMixedHarmonics %s",outputSlotName.Data()),useWeights);\r
6ea349ad 432 taskMH->SelectCollisionCandidates(centralitysel);\r
31e0a55e 433 taskMH->SetHarmonic(1); // n in cos[n(phi1+phi2-2phi3)] and cos[n(psi1+psi2-2phi3)]\r
434 taskMH->SetNoOfMultipicityBins(10000);\r
435 taskMH->SetMultipicityBinWidth(1.);\r
436 taskMH->SetMinMultiplicity(1.);\r
437 taskMH->SetCorrectForDetectorEffects(kTRUE);\r
438 taskMH->SetEvaluateDifferential3pCorrelator(kFALSE); // evaluate <<cos[n(psi1+psi2-2phi3)]>> (Remark: two nested loops) \r
439 taskMH->SetOppositeChargesPOI(kFALSE); // POIs psi1 and psi2 in cos[n(psi1+psi2-2phi3)] will have opposite charges \r
440 mgr->AddTask(taskMH);\r
441 } \r
442 if (NL){\r
443 AliAnalysisTaskNestedLoops *taskNL = new AliAnalysisTaskNestedLoops(Form("TaskNestedLoops %s",outputSlotName.Data()),useWeights);\r
6ea349ad 444 taskNL->SelectCollisionCandidates(centralitysel);\r
31e0a55e 445 taskNL->SetHarmonic(1); // n in cos[n(phi1+phi2-2phi3)] and cos[n(psi1+psi2-2phi3)]\r
446 taskNL->SetEvaluateNestedLoopsForRAD(kTRUE); // RAD = Relative Angle Distribution\r
447 taskNL->SetEvaluateNestedLoopsForMH(kTRUE); // evalaute <<cos[n(phi1+phi2-2phi3)]>> (Remark: three nested loops) \r
448 taskNL->SetEvaluateDifferential3pCorrelator(kFALSE); // evaluate <<cos[n(psi1+psi2-2phi3)]>> (Remark: three nested loops) \r
449 taskNL->SetOppositeChargesPOI(kFALSE); // POIs psi1 and psi2 in cos[n(psi1+psi2-2phi3)] will have opposite charges \r
450 mgr->AddTask(taskNL);\r
451 }\r
452\r
453 // Create the output container for the data produced by the task\r
454 // Connect to the input and output containers\r
455 //===========================================================================\r
456 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();\r
457 \r
458 if (rptypestr == "FMD") {\r
459 AliAnalysisDataContainer *coutputFMD = \r
460 mgr->CreateContainer(Form("BackgroundCorrected %s",outputSlotName.Data()), TList::Class(), AliAnalysisManager::kExchangeContainer);\r
461 //input and output taskFMD \r
462 mgr->ConnectInput(taskfmd, 0, cinput1);\r
463 mgr->ConnectOutput(taskfmd, 1, coutputFMD);\r
464 //input into taskFE\r
465 mgr->ConnectInput(taskFE,1,coutputFMD);\r
466 }\r
467 \r
468 AliAnalysisDataContainer *coutputFE = \r
469 mgr->CreateContainer(Form("FlowEventSimple %s",outputSlotName.Data()),AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);\r
470 mgr->ConnectInput(taskFE,0,cinput1); \r
471 mgr->ConnectOutput(taskFE,1,coutputFE);\r
472 \r
473 if (taskFE->GetQAOn())\r
474 {\r
475 TString outputQA = fileName;\r
476 outputQA += ":QA";\r
477 AliAnalysisDataContainer* coutputFEQA = \r
478 mgr->CreateContainer(Form("QA %s",outputSlotName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputQA);\r
479 mgr->ConnectOutput(taskFE,2,coutputFEQA);\r
480 }\r
481\r
482 // Create the output containers for the data produced by the analysis tasks\r
483 // Connect to the input and output containers\r
484 //===========================================================================\r
485 if (useWeights) { \r
486 AliAnalysisDataContainer *cinputWeights = mgr->CreateContainer(Form("Weights %s",outputSlotName.Data()),\r
487 TList::Class(),AliAnalysisManager::kInputContainer); \r
488 }\r
489\r
490 if(SP) {\r
491 TString outputSP = fileName;\r
492 outputSP += ":outputSPanalysis";\r
493 outputSP+= rptypestr;\r
494 AliAnalysisDataContainer *coutputSP = mgr->CreateContainer(Form("SP %s",outputSlotName.Data()), \r
495 TList::Class(),AliAnalysisManager::kOutputContainer,outputSP); \r
496 mgr->ConnectInput(taskSP,0,coutputFE); \r
497 mgr->ConnectOutput(taskSP,1,coutputSP); \r
498 if (WEIGHTS[0]) {\r
499 mgr->ConnectInput(taskSP,1,cinputWeights);\r
500 cinputWeights->SetData(weightsList);\r
501 }\r
502 }\r
503 if(LYZ1SUM) {\r
504 TString outputLYZ1SUM = fileName;\r
505 outputLYZ1SUM += ":outputLYZ1SUManalysis";\r
506 outputLYZ1SUM+= rptypestr;\r
507 AliAnalysisDataContainer *coutputLYZ1SUM = mgr->CreateContainer(Form("LYZ1SUM %s",outputSlotName.Data()), \r
508 TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1SUM); \r
509 mgr->ConnectInput(taskLYZ1SUM,0,coutputFE);\r
510 mgr->ConnectOutput(taskLYZ1SUM,1,coutputLYZ1SUM);\r
511 }\r
512 if(LYZ1PROD) {\r
513 TString outputLYZ1PROD = fileName;\r
514 outputLYZ1PROD += ":outputLYZ1PRODanalysis";\r
515 outputLYZ1PROD+= rptypestr;\r
516 AliAnalysisDataContainer *coutputLYZ1PROD = mgr->CreateContainer(Form("LYZ1PROD %s",outputSlotName.Data()), \r
517 TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1PROD); \r
518 mgr->ConnectInput(taskLYZ1PROD,0,coutputFE); \r
519 mgr->ConnectOutput(taskLYZ1PROD,1,coutputLYZ1PROD);\r
520 }\r
521 if(LYZ2SUM) {\r
522 AliAnalysisDataContainer *cinputLYZ2SUM = mgr->CreateContainer(Form("LYZ2SUMin %s",outputSlotName.Data()),\r
523 TList::Class(),AliAnalysisManager::kInputContainer);\r
524 TString outputLYZ2SUM = fileName;\r
525 outputLYZ2SUM += ":outputLYZ2SUManalysis";\r
526 outputLYZ2SUM+= rptypestr;\r
527 \r
528 AliAnalysisDataContainer *coutputLYZ2SUM = mgr->CreateContainer(Form("LYZ2SUM %s",outputSlotName.Data()), \r
529 TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2SUM); \r
530 mgr->ConnectInput(taskLYZ2SUM,0,coutputFE); \r
531 mgr->ConnectInput(taskLYZ2SUM,1,cinputLYZ2SUM);\r
532 mgr->ConnectOutput(taskLYZ2SUM,1,coutputLYZ2SUM); \r
533 cinputLYZ2SUM->SetData(fInputListLYZ2SUM);\r
534 }\r
535 if(LYZ2PROD) {\r
536 AliAnalysisDataContainer *cinputLYZ2PROD = mgr->CreateContainer(Form("LYZ2PRODin %s",outputSlotName.Data()),\r
537 TList::Class(),AliAnalysisManager::kInputContainer);\r
538 TString outputLYZ2PROD = fileName;\r
539 outputLYZ2PROD += ":outputLYZ2PRODanalysis";\r
540 outputLYZ2PROD+= rptypestr;\r
541 \r
542 AliAnalysisDataContainer *coutputLYZ2PROD = mgr->CreateContainer(Form("LYZ2PROD %s",outputSlotName.Data()), \r
543 TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2PROD); \r
544 mgr->ConnectInput(taskLYZ2PROD,0,coutputFE); \r
545 mgr->ConnectInput(taskLYZ2PROD,1,cinputLYZ2PROD);\r
546 mgr->ConnectOutput(taskLYZ2PROD,1,coutputLYZ2PROD); \r
547 cinputLYZ2PROD->SetData(fInputListLYZ2PROD);\r
548 }\r
549 if(LYZEP) {\r
550 AliAnalysisDataContainer *cinputLYZEP = mgr->CreateContainer(Form("LYZEPin %s",outputSlotName.Data()),\r
551 TList::Class(),AliAnalysisManager::kInputContainer);\r
552 TString outputLYZEP = fileName;\r
553 outputLYZEP += ":outputLYZEPanalysis";\r
554 outputLYZEP+= rptypestr;\r
555 \r
556 AliAnalysisDataContainer *coutputLYZEP = mgr->CreateContainer(Form("LYZEP %s",outputSlotName.Data()), \r
557 TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZEP); \r
558 mgr->ConnectInput(taskLYZEP,0,coutputFE); \r
559 mgr->ConnectInput(taskLYZEP,1,cinputLYZEP);\r
560 mgr->ConnectOutput(taskLYZEP,1,coutputLYZEP); \r
561 cinputLYZEP->SetData(fInputListLYZEP);\r
562 }\r
563 if(GFC) {\r
564 TString outputGFC = fileName;\r
565 outputGFC += ":outputGFCanalysis";\r
566 outputGFC+= rptypestr;\r
567 \r
568 AliAnalysisDataContainer *coutputGFC = mgr->CreateContainer(Form("GFC %s",outputSlotName.Data()), \r
569 TList::Class(),AliAnalysisManager::kOutputContainer,outputGFC); \r
570 mgr->ConnectInput(taskGFC,0,coutputFE); \r
571 mgr->ConnectOutput(taskGFC,1,coutputGFC);\r
572 if (useWeights) {\r
573 mgr->ConnectInput(taskGFC,1,cinputWeights);\r
574 cinputWeights->SetData(weightsList);\r
575 } \r
576 }\r
577 if(QC) {\r
578 TString outputQC = fileName;\r
579 outputQC += ":outputQCanalysis";\r
580 outputQC+= rptypestr;\r
581\r
582 AliAnalysisDataContainer *coutputQC = mgr->CreateContainer(Form("QC %s",outputSlotName.Data()), \r
583 TList::Class(),AliAnalysisManager::kOutputContainer,outputQC); \r
584 mgr->ConnectInput(taskQC,0,coutputFE); \r
585 mgr->ConnectOutput(taskQC,1,coutputQC);\r
586 if (useWeights) {\r
587 mgr->ConnectInput(taskQC,1,cinputWeights);\r
588 cinputWeights->SetData(weightsList);\r
589 }\r
590 }\r
591 if(FQD) {\r
592 TString outputFQD = fileName;\r
593 outputFQD += ":outputFQDanalysis";\r
594 outputFQD+= rptypestr;\r
595 \r
596 AliAnalysisDataContainer *coutputFQD = mgr->CreateContainer(Form("FQD %s",outputSlotName.Data()), \r
597 TList::Class(),AliAnalysisManager::kOutputContainer,outputFQD); \r
598 mgr->ConnectInput(taskFQD,0,coutputFE); \r
599 mgr->ConnectOutput(taskFQD,1,coutputFQD);\r
600 if(useWeights) {\r
601 mgr->ConnectInput(taskFQD,1,cinputWeights);\r
602 cinputWeights->SetData(weightsList);\r
603 } \r
604 }\r
605 if(MCEP) {\r
606 TString outputMCEP = fileName;\r
607 outputMCEP += ":outputMCEPanalysis";\r
608 outputMCEP+= rptypestr;\r
609 \r
610 AliAnalysisDataContainer *coutputMCEP = mgr->CreateContainer(Form("MCEP %s",outputSlotName.Data()), \r
611 TList::Class(),AliAnalysisManager::kOutputContainer,outputMCEP); \r
612 mgr->ConnectInput(taskMCEP,0,coutputFE);\r
613 mgr->ConnectOutput(taskMCEP,1,coutputMCEP); \r
614 }\r
615 if(MH) {\r
616 TString outputMH = fileName;\r
617 outputMH += ":outputMHanalysis";\r
618 outputMH += rptypestr;\r
619 \r
620 AliAnalysisDataContainer *coutputMH = mgr->CreateContainer(Form("MH %s",outputSlotName.Data()), \r
621 TList::Class(),AliAnalysisManager::kOutputContainer,outputMH); \r
622 mgr->ConnectInput(taskMH,0,coutputFE); \r
623 mgr->ConnectOutput(taskMH,1,coutputMH); \r
624 //if (useWeights) {\r
625 // mgr->ConnectInput(taskMH,1,cinputWeights);\r
626 // cinputWeights->SetData(weightsList);\r
627 //} \r
628 }\r
629 if(NL) {\r
630 TString outputNL = fileName;\r
631 outputNL += ":outputNLanalysis";\r
632 outputNL += rptypestr;\r
633\r
634 AliAnalysisDataContainer *coutputNL = mgr->CreateContainer(Form("NL %s",outputSlotName.Data()), \r
635 TList::Class(),AliAnalysisManager::kOutputContainer,outputNL); \r
636 mgr->ConnectInput(taskNL,0,coutputFE);\r
637 mgr->ConnectOutput(taskNL,1,coutputNL);\r
638 //if (useWeights) {\r
639 // mgr->ConnectInput(taskNL,1,cinputWeights);\r
640 // cinputWeights->SetData(weightsList);\r
641 //} \r
642 }\r
643\r
644 ///////////////////////////////////////////////////////////////////////////////////////////\r
645 if (runQAtask)\r
646 {\r
647 AliAnalysisTaskQAflow* taskQAflow = new AliAnalysisTaskQAflow(Form("TaskQAflow %s",outputSlotName.Data()));\r
6ea349ad 648 taskQAflow->SelectCollisionCandidates(centralitysel);\r
31e0a55e 649 taskQAflow->SetEventCuts(cutsEvent);\r
650 taskQAflow->SetTrackCuts(cutsRP);\r
651 taskQAflow->SetFillNTuple(FillQAntuple);\r
652 taskQAflow->SetDoCorrelations(DoQAcorrelations);\r
653 mgr->AddTask(taskQAflow);\r
654 \r
655 Printf("outputSlotName %s",outputSlotName.Data());\r
656 TString taskQAoutputFileName(fileNameBase);\r
657 taskQAoutputFileName.Append("_QA.root");\r
658 AliAnalysisDataContainer* coutputQAtask = mgr->CreateContainer(Form("flowQA %s",outputSlotName.Data()),\r
659 TObjArray::Class(),\r
660 AliAnalysisManager::kOutputContainer,\r
661 taskQAoutputFileName);\r
662 AliAnalysisDataContainer* coutputQAtaskTree = mgr->CreateContainer(Form("flowQAntuple %s",outputSlotName.Data()),\r
663 TNtuple::Class(),\r
664 AliAnalysisManager::kOutputContainer,\r
665 taskQAoutputFileName);\r
666 mgr->ConnectInput(taskQAflow,0,mgr->GetCommonInputContainer());\r
667 mgr->ConnectInput(taskQAflow,1,coutputFE);\r
668 mgr->ConnectOutput(taskQAflow,1,coutputQAtask);\r
669 if (FillQAntuple) mgr->ConnectOutput(taskQAflow,2,coutputQAtaskTree);\r
670 }\r
671}\r
672\r
673\r
674\r
675\r
676\r