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