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