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