1 /////////////////////////////////////////////////////////////////////////////////////////////
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.
8 /////////////////////////////////////////////////////////////////////////////////////////////
10 // Define the range for eta subevents (for SP method)
16 // use physics selection class
17 Bool_t UsePhysicsSelection = kTRUE;
21 //----------Event selection----------
22 Bool_t UseMultCutforESD = kTRUE;
23 //Bool_t UseMultCutforESD = kFALSE;
24 const Int_t multminESD = 1; //used for CORRFW cuts
25 const Int_t multmaxESD = 1000000; //used for CORRFW cuts
27 Bool_t requireVtxCuts = kTRUE;
28 Double_t vertexXmin = -1.0;
29 Double_t vertexXmax = 1.0;
30 Double_t vertexYmin = -1.0;
31 Double_t vertexYmax = 1.0;
32 Double_t vertexZmin = -15.0; //-1.e99;
33 Double_t vertexZmax = 15.0; //1.e99;
35 //Bool_t UseMultCut = kFALSE;
36 Bool_t UseMultCut = kTRUE;
37 const Int_t multmin = 1; //used for AliFlowEventSimple (to set the centrality)
38 const Int_t multmax = 10000; //used for AliFlowEventSimple (to set the centrality)
39 //const Int_t multmin = 10; //used for AliFlowEventSimple (to set the centrality)
40 //const Int_t multmax = 1000000; //used for AliFlowEventSimple (to set the centrality)
43 //----------For RP selection----------
44 //KINEMATICS (on generated and reconstructed tracks)
45 Bool_t UseKineforRP = kTRUE;
46 const Double_t ptminRP = 0.0;
47 const Double_t ptmaxRP = 10.0;
48 const Double_t etaminRP = -0.9;
49 const Double_t etamaxRP = 0.9;
50 const Int_t chargeRP = 1; //not used
52 //PID (on generated and reconstructed tracks)
53 Bool_t UsePIDforRP = kFALSE;
54 const Int_t PdgRP = 211;
56 //TRACK QUALITY (on reconstructed tracks only)
57 //see /CORRFW/AliCFTrackQualityCuts class
58 Bool_t UseTrackQualityforRP = kTRUE;
59 const Int_t minClustersTpcRP = 80; //default = -1;
60 const Double_t maxChi2PerClusterTpcRP = 3.5; //default = 1.e+09;
61 const UShort_t minDedxClusterTpcRP = 0;
62 const Int_t minClustersItsRP = 2; //panos
63 const Double_t maxChi2PerClusterItsRP = 1.e+09;
64 const Int_t minClustersTrdRP = -1;
65 const Int_t minTrackletTrdRP = -1;
66 const Int_t minTrackletTrdPidRP = -1;
67 const Double_t maxChi2PerClusterTrdRP = 1.e+09;
68 const ULong_t statusRP = AliESDtrack::kTPCrefit; //AliESDtrack::kTPCrefit & AliESDtrack::kITSrefit
70 //PRIMARY (on reconstructed tracks only)
71 //see /CORRFW/AliCFTrackIsPrimaryCuts class
72 Bool_t UsePrimariesforRP = kTRUE;
73 const Bool_t spdVertexRP = kFALSE;
74 const Bool_t tpcVertexRP = kFALSE;
75 const Float_t minDcaToVertexXyRP = 0.;
76 const Float_t minDcaToVertexZRP = 0.;
77 const Float_t maxDcaToVertexXyRP = 2.4; //default = 1.e+10; //2.4;
78 const Float_t maxDcaToVertexZRP = 3.2; //default = 1.e+10; //3.2;
79 const Bool_t dcaToVertex2dRP = kFALSE; //default = kFALSE;
80 const Bool_t absDcaToVertexRP = kTRUE; //default = kTRUE;
81 const Double_t minNSigmaToVertexRP = 0.;
82 const Double_t maxNSigmaToVertexRP = 1.e+10; //3.; //1.e+10
83 const Double_t maxSigmaDcaXySP = 1.e+10;
84 const Double_t maxSigmaDcaZSP = 1.e+10;
85 const Bool_t requireSigmaToVertexSP = kFALSE;
86 const Bool_t acceptKinkDaughtersSP = kFALSE; //default = kTRUE;
88 //ACCEPTANCE (on generated tracks only : AliMCParticle)
89 //see /CORRFW/AliCFAcceptanceCuts class
90 Bool_t UseAcceptanceforRP = kFALSE;
91 const Int_t minTrackrefsItsRP = 0;//3;
92 const Int_t minTrackrefsTpcRP = 0;//2;
93 const Int_t minTrackrefsTrdRP = 0;
94 const Int_t minTrackrefsTofRP = 0;
95 const Int_t minTrackrefsMuonRP = 0;
96 //default for all is 0
98 //----------For POI selection----------
99 //KINEMATICS (on generated and reconstructed tracks)
100 Bool_t UseKineforPOI = kTRUE;
101 const Double_t ptminPOI = 0.0;
102 const Double_t ptmaxPOI = 10.0;
103 const Double_t etaminPOI = -0.9;
104 const Double_t etamaxPOI = 0.9;
105 const Int_t chargePOI = 1; //not used
107 //PID (on generated and reconstructed tracks)
108 Bool_t UsePIDforPOI = kFALSE;
109 const Int_t PdgPOI = 321;
111 //TRACK QUALITY (on reconstructed tracks only)
112 //see /CORRFW/AliCFTrackQualityCuts class
113 Bool_t UseTrackQualityforPOI = kTRUE;
114 const Int_t minClustersTpcPOI = 80;
115 const Double_t maxChi2PerClusterTpcPOI = 3.5;
116 const UShort_t minDedxClusterTpcPOI = 0;
117 const Int_t minClustersItsPOI = 2;
118 const Double_t maxChi2PerClusterItsPOI = 1.e+09;
119 const Int_t minClustersTrdPOI = -1;
120 const Int_t minTrackletTrdPOI = -1;
121 const Int_t minTrackletTrdPidPOI = -1;
122 const Double_t maxChi2PerClusterTrdPOI = 1.e+09;
123 const ULong_t statusPOI = AliESDtrack::kTPCrefit;
125 //PRIMARY (on reconstructed tracks only)
126 //see /CORRFW/AliCFTrackIsPrimaryCuts class
127 Bool_t UsePrimariesforPOI = kTRUE;
128 const Bool_t spdVertexPOI = kFALSE;
129 const Bool_t tpcVertexPOI = kFALSE;
130 const Float_t minDcaToVertexXyPOI = 0.;
131 const Float_t minDcaToVertexZPOI = 0.;
132 const Float_t maxDcaToVertexXyPOI = 2.4;
133 const Float_t maxDcaToVertexZPOI = 3.2;
134 const Bool_t dcaToVertex2dPOI = kFALSE;
135 const Bool_t absDcaToVertexPOI = kTRUE;
136 const Double_t minNSigmaToVertexPOI = 0.;
137 const Double_t maxNSigmaToVertexPOI = 1.e+10;
138 const Double_t maxSigmaDcaXyPOI = 1.e+10;
139 const Double_t maxSigmaDcaZPOI = 1.e+10;
140 const Bool_t requireSigmaToVertexPOI = kFALSE;
141 const Bool_t acceptKinkDaughtersPOI = kFALSE;
143 //ACCEPTANCE (on generated tracks only : AliMCParticle)
144 //see /CORRFW/AliCFAcceptanceCuts class
145 Bool_t UseAcceptanceforPOI = kFALSE;
146 const Int_t minTrackrefsItsPOI = 3;
147 const Int_t minTrackrefsTpcPOI = 2;
148 const Int_t minTrackrefsTrdPOI = 0;
149 const Int_t minTrackrefsTofPOI = 0;
150 const Int_t minTrackrefsMuonPOI = 0;
153 //----------For Adding Flow to the Event----------
154 const Bool_t AddToEvent = kFALSE;
155 Double_t ellipticFlow = 0.05;
158 AliAnalysisTaskFlowEvent* AddTaskFlow(TString type, Bool_t* METHODS, Bool_t QA, Bool_t* WEIGHTS)
160 //boleans for the methods
161 Bool_t SP = METHODS[0];
162 Bool_t LYZ1SUM = METHODS[1];
163 Bool_t LYZ1PROD = METHODS[2];
164 Bool_t LYZ2SUM = METHODS[3];
165 Bool_t LYZ2PROD = METHODS[4];
166 Bool_t LYZEP = METHODS[5];
167 Bool_t GFC = METHODS[6];
168 Bool_t QC = METHODS[7];
169 Bool_t FQD = METHODS[8];
170 Bool_t MCEP = METHODS[9];
171 Bool_t MH = METHODS[10];
172 Bool_t NL = METHODS[11];
174 Bool_t useWeights = WEIGHTS[0] || WEIGHTS[1] || WEIGHTS[2];
175 if (useWeights) cout<<"Weights are used"<<endl;
176 else cout<<"Weights are not used"<<endl;
179 // Get the pointer to the existing analysis manager via the static access method.
180 //==============================================================================
181 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
183 Error("AddTaskFlowEvent", "No analysis manager to connect to.");
187 // Check the analysis type using the event handlers connected to the analysis
188 // manager. The availability of MC handler cann also be checked here.
189 //==============================================================================
190 if (!mgr->GetInputEventHandler()) {
191 ::Error("AddTaskFlowEvent", "This task requires an input event handler");
195 // Open external input files
196 //===========================================================================
198 TFile *weightsFile = NULL;
199 TList *weightsList = NULL;
202 //open the file with the weights:
203 weightsFile = TFile::Open("weights.root","READ");
205 //access the list which holds the histos with weigths:
206 weightsList = (TList*)weightsFile->Get("weights");
209 cout<<" WARNING: the file <weights.root> with weights from the previous run was not available."<<endl;
215 if (LYZ2SUM || LYZ2PROD) {
216 //read the outputfile of the first run
217 TString outputFileName = "AnalysisResults1.root";
218 TString pwd(gSystem->pwd());
220 pwd+=outputFileName.Data();
221 TFile *outputFile = NULL;
222 if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {
223 cout<<"WARNING: You do not have an output file:"<<endl;
224 cout<<" "<<pwd.Data()<<endl;
227 outputFile = TFile::Open(pwd.Data(),"READ");
231 // read the output directory from LYZ1SUM
232 TString inputFileNameLYZ2SUM = "outputLYZ1SUManalysis" ;
233 inputFileNameLYZ2SUM += type;
234 cout<<"The input directory is "<<inputFileNameLYZ2SUM.Data()<<endl;
235 TFile* fInputFileLYZ2SUM = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2SUM.Data());
236 if(!fInputFileLYZ2SUM || fInputFileLYZ2SUM->IsZombie()) {
237 cerr << " ERROR: To run LYZ2SUM you need the output file from LYZ1SUM. This file is not there! Please run LYZ1SUM first." << endl ;
241 TList* fInputListLYZ2SUM = (TList*)fInputFileLYZ2SUM->Get("cobjLYZ1SUM");
242 if (!fInputListLYZ2SUM) {cout<<"list is NULL pointer!"<<endl;}
244 cout<<"LYZ2SUM input file/list read..."<<endl;
248 // read the output directory from LYZ1PROD
249 TString inputFileNameLYZ2PROD = "outputLYZ1PRODanalysis" ;
250 inputFileNameLYZ2PROD += type;
251 cout<<"The input directory is "<<inputFileNameLYZ2PROD.Data()<<endl;
252 TFile* fInputFileLYZ2PROD = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2PROD.Data());
253 if(!fInputFileLYZ2PROD || fInputFileLYZ2PROD->IsZombie()) {
254 cerr << " ERROR: To run LYZ2PROD you need the output file from LYZ1PROD. This file is not there! Please run LYZ1PROD first." << endl ;
258 TList* fInputListLYZ2PROD = (TList*)fInputFileLYZ2PROD->Get("cobjLYZ1PROD");
259 if (!fInputListLYZ2PROD) {cout<<"list is NULL pointer!"<<endl;}
261 cout<<"LYZ2PROD input file/list read..."<<endl;
267 //read the outputfile of the second run
268 TString outputFileName = "AnalysisResults2.root";
269 TString pwd(gSystem->pwd());
271 pwd+=outputFileName.Data();
272 TFile *outputFile = NULL;
273 if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {
274 cout<<"WARNING: You do not have an output file:"<<endl;
275 cout<<" "<<pwd.Data()<<endl;
278 outputFile = TFile::Open(pwd.Data(),"READ");
281 // read the output file from LYZ2SUM
282 TString inputFileNameLYZEP = "outputLYZ2SUManalysis" ;
283 inputFileNameLYZEP += type;
284 cout<<"The input file is "<<inputFileNameLYZEP.Data()<<endl;
285 TFile* fInputFileLYZEP = (TFile*)outputFile->FindObjectAny(inputFileNameLYZEP.Data());
286 if(!fInputFileLYZEP || fInputFileLYZEP->IsZombie()) {
287 cerr << " ERROR: To run LYZEP you need the output file from LYZ2SUM. This file is not there! Please run LYZ2SUM first." << endl ;
291 TList* fInputListLYZEP = (TList*)fInputFileLYZEP->Get("cobjLYZ2SUM");
292 if (!fInputListLYZEP) {cout<<"list is NULL pointer!"<<endl;}
294 cout<<"LYZEP input file/list read..."<<endl;
299 // Create the task, add it to the manager.
300 //===========================================================================
301 AliAnalysisTaskFlowEvent *taskFE = NULL;
304 taskFE = new AliAnalysisTaskFlowEvent("TaskFlowEvent",kTRUE,1);
305 taskFE->SetEllipticFlowValue(ellipticFlow); } //TEST
306 else {taskFE = new AliAnalysisTaskFlowEvent("TaskFlowEvent",kTRUE); }
307 taskFE->SetAnalysisType(type);
309 taskFE->SetMinMult(multmin);
310 taskFE->SetMaxMult(multmax);
312 taskFE->SetSubeventEtaRange(minA, maxA, minB, maxB);
313 if (UsePhysicsSelection) {
314 taskFE->SelectCollisionCandidates();
315 cout<<"Using Physics Selection"<<endl;
317 mgr->AddTask(taskFE);
321 taskFE = new AliAnalysisTaskFlowEvent("TaskFlowEvent",kFALSE,1);
322 taskFE->SetEllipticFlowValue(ellipticFlow); } //TEST
323 else {taskFE = new AliAnalysisTaskFlowEvent("TaskFlowEvent",kFALSE); }
324 taskFE->SetAnalysisType(type);
326 taskFE->SetMinMult(multmin);
327 taskFE->SetMaxMult(multmax);
329 taskFE->SetSubeventEtaRange(minA, maxA, minB, maxB);
330 if (UsePhysicsSelection) {
331 taskFE->SelectCollisionCandidates();
332 cout<<"Using Physics Selection"<<endl;
334 mgr->AddTask(taskFE);
337 // Create cuts using the correction framework (CORRFW)
338 //===========================================================================
340 //Set TList for the QA histograms
341 TList* qaRP = new TList();
342 TList* qaPOI = new TList();
345 //----------Event cuts----------
346 AliCFEventGenCuts* mcEventCuts = new AliCFEventGenCuts("mcEventCuts","MC-level event cuts");
347 mcEventCuts->SetNTracksCut(multminESD,multmaxESD);
348 mcEventCuts->SetRequireVtxCuts(requireVtxCuts);
349 mcEventCuts->SetVertexXCut(vertexXmin, vertexXmax);
350 mcEventCuts->SetVertexYCut(vertexYmin, vertexYmax);
351 mcEventCuts->SetVertexZCut(vertexZmin, vertexZmax);
353 mcEventCuts->SetQAOn(qaRP);
355 AliCFEventRecCuts* recEventCuts = new AliCFEventRecCuts("recEventCuts","rec-level event cuts");
356 recEventCuts->SetNTracksCut(multminESD,multmaxESD);
357 recEventCuts->SetRequireVtxCuts(requireVtxCuts);
358 recEventCuts->SetVertexXCut(vertexXmin, vertexXmax);
359 recEventCuts->SetVertexYCut(vertexYmin, vertexYmax);
360 recEventCuts->SetVertexZCut(vertexZmin, vertexZmax);
362 recEventCuts->SetQAOn(qaRP);
365 //----------Cuts for RP----------
366 //KINEMATICS (MC and reconstructed)
367 AliCFTrackKineCuts* mcKineCutsRP = new AliCFTrackKineCuts("mcKineCutsRP","MC-level kinematic cuts");
368 mcKineCutsRP->SetPtRange(ptminRP,ptmaxRP);
369 mcKineCutsRP->SetEtaRange(etaminRP,etamaxRP);
370 //mcKineCutsRP->SetChargeMC(chargeRP);
372 mcKineCutsRP->SetQAOn(qaRP);
375 AliCFTrackKineCuts *recKineCutsRP = new AliCFTrackKineCuts("recKineCutsRP","rec-level kine cuts");
376 recKineCutsRP->SetPtRange(ptminRP,ptmaxRP);
377 recKineCutsRP->SetEtaRange(etaminRP,etamaxRP);
378 //recKineCutsRP->SetChargeRec(chargeRP);
380 recKineCutsRP->SetQAOn(qaRP);
383 //PID (MC and reconstructed)
384 AliCFParticleGenCuts* mcGenCutsRP = new AliCFParticleGenCuts("mcGenCutsRP","MC particle generation cuts for RP");
385 mcGenCutsRP->SetRequireIsPrimary();
386 if (UsePIDforRP) {mcGenCutsRP->SetRequirePdgCode(PdgRP);}
388 mcGenCutsRP->SetQAOn(qaRP);
391 int n_species = AliPID::kSPECIES ;
392 Double_t* prior = new Double_t[n_species];
394 prior[0] = 0.0244519 ;
395 prior[1] = 0.0143988 ;
396 prior[2] = 0.805747 ;
397 prior[3] = 0.0928785 ;
398 prior[4] = 0.0625243 ;
400 AliCFTrackCutPid* cutPidRP = NULL;
402 cutPidRP = new AliCFTrackCutPid("cutPidRP","ESD_PID for RP") ;
403 cutPidRP->SetPriors(prior);
404 cutPidRP->SetProbabilityCut(0.0);
405 cutPidRP->SetDetectors("TPC TOF");
406 switch(TMath::Abs(PDG1)) {
407 case 11 : cutPidRP->SetParticleType(AliPID::kElectron, kTRUE); break;
408 case 13 : cutPidRP->SetParticleType(AliPID::kMuon , kTRUE); break;
409 case 211 : cutPidRP->SetParticleType(AliPID::kPion , kTRUE); break;
410 case 321 : cutPidRP->SetParticleType(AliPID::kKaon , kTRUE); break;
411 case 2212 : cutPidRP->SetParticleType(AliPID::kProton , kTRUE); break;
412 default : printf("UNDEFINED PID\n"); break;
415 cutPidRP->SetQAOn(qaRP);
420 AliCFTrackQualityCuts *recQualityCutsRP = new AliCFTrackQualityCuts("recQualityCutsRP","rec-level quality cuts");
421 recQualityCutsRP->SetMinNClusterTPC(minClustersTpcRP);
422 //recQualityCutsRP->SetMinFoundClusterTPC(minFoundClustersTpcRP); //only for internal TPC QA
423 recQualityCutsRP->SetMaxChi2PerClusterTPC(maxChi2PerClusterTpcRP);
424 recQualityCutsRP->SetMinNdEdxClusterTPC(minDedxClusterTpcRP); //to reject secondaries
426 recQualityCutsRP->SetMinNClusterITS(minClustersItsRP);
427 recQualityCutsRP->SetMaxChi2PerClusterITS(maxChi2PerClusterItsRP);
429 recQualityCutsRP->SetMinNClusterTRD(minClustersTrdRP);
430 recQualityCutsRP->SetMinNTrackletTRD(minTrackletTrdRP);
431 recQualityCutsRP->SetMinNTrackletTRDpid(minTrackletTrdPidRP);
432 recQualityCutsRP->SetMaxChi2PerTrackletTRD(maxChi2PerClusterTrdRP);
433 recQualityCutsRP->SetStatus(statusRP);
435 recQualityCutsRP->SetQAOn(qaRP);
440 void SetMaxCovDiagonalElements(Float_t c1=1.e+09, Float_t c2=1.e+09, Float_t c3=1.e+09, Float_t c4=1.e+09, Float_t c5=1.e+09)
441 {fCovariance11Max=c1;fCovariance22Max=c2;fCovariance33Max=c3;fCovariance44Max=c4;fCovariance55Max=c5;}
445 AliCFTrackIsPrimaryCuts *recIsPrimaryCutsRP = new AliCFTrackIsPrimaryCuts("recIsPrimaryCutsRP","rec-level isPrimary cuts");
446 recIsPrimaryCutsRP->UseSPDvertex(spdVertexRP);
447 recIsPrimaryCutsRP->UseTPCvertex(tpcVertexRP);
448 recIsPrimaryCutsRP->SetMinDCAToVertexXY(minDcaToVertexXyRP);
449 recIsPrimaryCutsRP->SetMinDCAToVertexZ(minDcaToVertexZRP);
450 recIsPrimaryCutsRP->SetMaxDCAToVertexXY(maxDcaToVertexXyRP);
451 recIsPrimaryCutsRP->SetMaxDCAToVertexZ(maxDcaToVertexZRP);
452 recIsPrimaryCutsRP->SetDCAToVertex2D(dcaToVertex2dRP);
453 recIsPrimaryCutsRP->SetAbsDCAToVertex(absDcaToVertexRP);
454 recIsPrimaryCutsRP->SetMinNSigmaToVertex(minNSigmaToVertexRP);
455 recIsPrimaryCutsRP->SetMaxNSigmaToVertex(maxNSigmaToVertexRP);
456 recIsPrimaryCutsRP->SetMaxSigmaDCAxy(maxSigmaDcaXySP);
457 recIsPrimaryCutsRP->SetMaxSigmaDCAz(maxSigmaDcaZSP);
458 recIsPrimaryCutsRP->SetRequireSigmaToVertex(requireSigmaToVertexSP);
459 recIsPrimaryCutsRP->SetAcceptKinkDaughters(acceptKinkDaughtersSP);
461 recIsPrimaryCutsRP->SetQAOn(qaRP);
465 AliCFAcceptanceCuts *mcAccCutsRP = new AliCFAcceptanceCuts("mcAccCutsRP","MC acceptance cuts");
466 mcAccCutsRP->SetMinNHitITS(minTrackrefsItsRP);
467 mcAccCutsRP->SetMinNHitTPC(minTrackrefsTpcRP);
468 mcAccCutsRP->SetMinNHitTRD(minTrackrefsTrdRP);
469 mcAccCutsRP->SetMinNHitTOF(minTrackrefsTofRP);
470 mcAccCutsRP->SetMinNHitMUON(minTrackrefsMuonRP);
472 mcAccCutsRP->SetQAOn(qaRP);
476 //----------Cuts for POI----------
477 //KINEMATICS (MC and reconstructed)
478 AliCFTrackKineCuts* mcKineCutsPOI = new AliCFTrackKineCuts("mcKineCutsPOI","MC-level kinematic cuts");
479 mcKineCutsPOI->SetPtRange(ptminPOI,ptmaxPOI);
480 mcKineCutsPOI->SetEtaRange(etaminPOI,etamaxPOI);
481 //mcKineCutsPOI->SetChargeMC(chargePOI);
483 mcKineCutsPOI->SetQAOn(qaPOI);
486 AliCFTrackKineCuts *recKineCutsPOI = new AliCFTrackKineCuts("recKineCutsPOI","rec-level kine cuts");
487 recKineCutsPOI->SetPtRange(ptminPOI,ptmaxPOI);
488 recKineCutsPOI->SetEtaRange(etaminPOI,etamaxPOI);
489 //recKineCutsPOI->SetChargeRec(chargePOI);
491 recKineCutsPOI->SetQAOn(qaPOI);
494 //PID (MC and reconstructed)
495 AliCFParticleGenCuts* mcGenCutsPOI = new AliCFParticleGenCuts("mcGenCutsPOI","MC particle generation cuts for POI");
496 mcGenCutsPOI->SetRequireIsPrimary();
497 if (UsePIDforPOI) {mcGenCutsPOI->SetRequirePdgCode(PdgPOI);}
499 mcGenCutsPOI->SetQAOn(qaPOI);
502 AliCFTrackCutPid* cutPidPOI = NULL;
504 cutPidPOI = new AliCFTrackCutPid("cutPidPOI","ESD_PID for POI") ;
505 cutPidPOI->SetPriors(prior);
506 cutPidPOI->SetProbabilityCut(0.0);
507 cutPidPOI->SetDetectors("TPC TOF");
508 switch(TMath::Abs(PDG2)) {
509 case 11 : cutPidPOI->SetParticleType(AliPID::kElectron, kTRUE); break;
510 case 13 : cutPidPOI->SetParticleType(AliPID::kMuon , kTRUE); break;
511 case 211 : cutPidPOI->SetParticleType(AliPID::kPion , kTRUE); break;
512 case 321 : cutPidPOI->SetParticleType(AliPID::kKaon , kTRUE); break;
513 case 2212 : cutPidPOI->SetParticleType(AliPID::kProton , kTRUE); break;
514 default : printf("UNDEFINED PID\n"); break;
517 cutPidPOI->SetQAOn(qaPOI);
522 AliCFTrackQualityCuts *recQualityCutsPOI = new AliCFTrackQualityCuts("recQualityCutsPOI","rec-level quality cuts");
523 recQualityCutsPOI->SetMinNClusterTPC(minClustersTpcPOI);
524 //recQualityCutsPOI->SetMinFoundClusterTPC(minFoundClustersTpcPOI); //only for internal TPC QA
525 recQualityCutsPOI->SetMaxChi2PerClusterTPC(maxChi2PerClusterTpcPOI);
526 recQualityCutsPOI->SetMinNdEdxClusterTPC(minDedxClusterTpcPOI); //to reject secondaries
528 recQualityCutsPOI->SetMinNClusterITS(minClustersItsPOI);
529 recQualityCutsPOI->SetMaxChi2PerClusterITS(maxChi2PerClusterItsPOI);
531 recQualityCutsPOI->SetMinNClusterTRD(minClustersTrdPOI);
532 recQualityCutsPOI->SetMinNTrackletTRD(minTrackletTrdPOI);
533 recQualityCutsPOI->SetMinNTrackletTRDpid(minTrackletTrdPidPOI);
534 recQualityCutsPOI->SetMaxChi2PerTrackletTRD(maxChi2PerClusterTrdPOI);
535 recQualityCutsPOI->SetStatus(statusPOI);
537 recQualityCutsPOI->SetQAOn(qaPOI);
541 AliCFTrackIsPrimaryCuts *recIsPrimaryCutsPOI = new AliCFTrackIsPrimaryCuts("recIsPrimaryCutsPOI","rec-level isPrimary cuts");
542 recIsPrimaryCutsPOI->UseSPDvertex(spdVertexPOI);
543 recIsPrimaryCutsPOI->UseTPCvertex(tpcVertexPOI);
544 recIsPrimaryCutsPOI->SetMinDCAToVertexXY(minDcaToVertexXyPOI);
545 recIsPrimaryCutsPOI->SetMinDCAToVertexZ(minDcaToVertexZPOI);
546 recIsPrimaryCutsPOI->SetMaxDCAToVertexXY(maxDcaToVertexXyPOI);
547 recIsPrimaryCutsPOI->SetMaxDCAToVertexZ(maxDcaToVertexZPOI);
548 recIsPrimaryCutsPOI->SetDCAToVertex2D(dcaToVertex2dPOI);
549 recIsPrimaryCutsPOI->SetAbsDCAToVertex(absDcaToVertexPOI);
550 recIsPrimaryCutsPOI->SetMinNSigmaToVertex(minNSigmaToVertexPOI);
551 recIsPrimaryCutsPOI->SetMaxNSigmaToVertex(maxNSigmaToVertexPOI);
552 recIsPrimaryCutsPOI->SetMaxSigmaDCAxy(maxSigmaDcaXyPOI);
553 recIsPrimaryCutsPOI->SetMaxSigmaDCAz(maxSigmaDcaZPOI);
554 recIsPrimaryCutsPOI->SetRequireSigmaToVertex(requireSigmaToVertexPOI);
555 recIsPrimaryCutsPOI->SetAcceptKinkDaughters(acceptKinkDaughtersPOI);
557 recIsPrimaryCutsPOI->SetQAOn(qaPOI);
561 AliCFAcceptanceCuts *mcAccCutsPOI = new AliCFAcceptanceCuts("mcAccCutsPOI","MC acceptance cuts");
562 mcAccCutsPOI->SetMinNHitITS(minTrackrefsItsPOI);
563 mcAccCutsPOI->SetMinNHitTPC(minTrackrefsTpcPOI);
564 mcAccCutsPOI->SetMinNHitTRD(minTrackrefsTrdPOI);
565 mcAccCutsPOI->SetMinNHitTOF(minTrackrefsTofPOI);
566 mcAccCutsPOI->SetMinNHitMUON(minTrackrefsMuonPOI);
568 mcAccCutsPOI->SetQAOn(qaPOI);
573 //----------Create Cut Lists----------
574 printf("CREATE EVENT CUTS\n");
575 TObjArray* mcEventList = new TObjArray(0);
576 if (UseMultCutforESD) mcEventList->AddLast(mcEventCuts);//cut on mult and vertex
578 TObjArray* recEventList = new TObjArray(0);
579 if (UseMultCutforESD) recEventList->AddLast(recEventCuts);//cut on mult and vertex
581 printf("CREATE MC KINE CUTS\n");
582 TObjArray* mcListRP = new TObjArray(0);
583 if (UseKineforRP) mcListRP->AddLast(mcKineCutsRP); //cut on pt/eta/phi
584 mcListRP->AddLast(mcGenCutsRP); //cut on primary and if (UsePIDforRP) MC PID
586 TObjArray* mcListPOI = new TObjArray(0);
587 if (UseKineforPOI) mcListPOI->AddLast(mcKineCutsPOI); //cut on pt/eta/phi
588 mcListPOI->AddLast(mcGenCutsPOI); //cut on primary and if (UsePIDforPOI) MC PID
590 printf("CREATE MC ACCEPTANCE CUTS\n");
591 TObjArray* accListRP = new TObjArray(0) ;
592 if (UseAcceptanceforRP) accListRP->AddLast(mcAccCutsRP); //cut on number of track references
594 TObjArray* accListPOI = new TObjArray(0) ;
595 if (UseAcceptanceforPOI) accListPOI->AddLast(mcAccCutsPOI); //cut on number of track references
597 printf("CREATE ESD RECONSTRUCTION CUTS\n");
598 TObjArray* recListRP = new TObjArray(0) ;
599 if (UseKineforRP) recListRP->AddLast(recKineCutsRP); //cut on pt/eta/phi
600 if (UseTrackQualityforRP) recListRP->AddLast(recQualityCutsRP);
601 if (UsePrimariesforRP) recListRP->AddLast(recIsPrimaryCutsRP); //cut if it is a primary
603 TObjArray* recListPOI = new TObjArray(0) ;
604 if (UseKineforPOI) recListPOI->AddLast(recKineCutsPOI); //cut on pt/eta/phi
605 if (UseTrackQualityforPOI) recListPOI->AddLast(recQualityCutsPOI);
606 if (UsePrimariesforPOI) recListPOI->AddLast(recIsPrimaryCutsPOI); //cut if it is a primary
608 printf("CREATE ESD PID CUTS\n");
609 TObjArray* fPIDCutListRP = new TObjArray(0) ;
610 if(UsePIDforRP) {fPIDCutListRP->AddLast(cutPidRP);} //cut on ESD PID
612 TObjArray* fPIDCutListPOI = new TObjArray(0) ;
613 if (UsePIDforPOI) {fPIDCutListPOI->AddLast(cutPidPOI);} //cut on ESD PID
616 //----------Add Cut Lists to the CF Manager----------
617 printf("CREATE INTERFACE AND CUTS\n");
618 AliCFManager* cfmgrRP = new AliCFManager();
619 cfmgrRP->SetNStepEvent(3);
620 cfmgrRP->SetEventCutsList(AliCFManager::kEvtGenCuts,mcEventList);
621 cfmgrRP->SetEventCutsList(AliCFManager::kEvtRecCuts,recEventList);
622 cfmgrRP->SetNStepParticle(4);
623 cfmgrRP->SetParticleCutsList(AliCFManager::kPartGenCuts,mcListRP);
624 cfmgrRP->SetParticleCutsList(AliCFManager::kPartAccCuts,accListRP);
625 cfmgrRP->SetParticleCutsList(AliCFManager::kPartRecCuts,recListRP);
626 cfmgrRP->SetParticleCutsList(AliCFManager::kPartSelCuts,fPIDCutListRP);
628 AliCFManager* cfmgrPOI = new AliCFManager();
629 cfmgrPOI->SetNStepEvent(3);
630 cfmgrPOI->SetEventCutsList(AliCFManager::kEvtGenCuts,mcEventList);
631 cfmgrPOI->SetEventCutsList(AliCFManager::kEvtRecCuts,recEventList);
632 cfmgrPOI->SetNStepParticle(4);
633 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartGenCuts,mcListPOI);
634 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartAccCuts,accListPOI);
635 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartRecCuts,recListPOI);
636 cfmgrPOI->SetParticleCutsList(AliCFManager::kPartSelCuts,fPIDCutListPOI);
639 taskFE->SetQAList1(qaRP);
640 taskFE->SetQAList2(qaPOI);
642 taskFE->SetCFManager1(cfmgrRP);
643 taskFE->SetCFManager2(cfmgrPOI);
647 // Create the analysis tasks, add them to the manager.
648 //===========================================================================
650 AliAnalysisTaskScalarProduct *taskSP = new AliAnalysisTaskScalarProduct("TaskScalarProduct",WEIGHTS[0]);
651 mgr->AddTask(taskSP);
654 AliAnalysisTaskLeeYangZeros *taskLYZ1SUM = new AliAnalysisTaskLeeYangZeros("TaskLeeYangZerosSUM",kTRUE);
655 taskLYZ1SUM->SetFirstRunLYZ(kTRUE);
656 taskLYZ1SUM->SetUseSumLYZ(kTRUE);
657 mgr->AddTask(taskLYZ1SUM);
660 AliAnalysisTaskLeeYangZeros *taskLYZ1PROD = new AliAnalysisTaskLeeYangZeros("TaskLeeYangZerosPROD",kTRUE);
661 taskLYZ1PROD->SetFirstRunLYZ(kTRUE);
662 taskLYZ1PROD->SetUseSumLYZ(kFALSE);
663 mgr->AddTask(taskLYZ1PROD);
666 AliAnalysisTaskLeeYangZeros *taskLYZ2SUM = new AliAnalysisTaskLeeYangZeros("TaskLeeYangZerosSUM",kFALSE);
667 taskLYZ2SUM->SetFirstRunLYZ(kFALSE);
668 taskLYZ2SUM->SetUseSumLYZ(kTRUE);
669 mgr->AddTask(taskLYZ2SUM);
672 AliAnalysisTaskLeeYangZeros *taskLYZ2PROD = new AliAnalysisTaskLeeYangZeros("TaskLeeYangZerosPROD",kFALSE);
673 taskLYZ2PROD->SetFirstRunLYZ(kFALSE);
674 taskLYZ2PROD->SetUseSumLYZ(kFALSE);
675 mgr->AddTask(taskLYZ2PROD);
678 AliAnalysisTaskLYZEventPlane *taskLYZEP = new AliAnalysisTaskLYZEventPlane("TaskLYZEventPlane");
679 mgr->AddTask(taskLYZEP);
682 AliAnalysisTaskCumulants *taskGFC = new AliAnalysisTaskCumulants("TaskCumulants",useWeights);
683 taskGFC->SetUsePhiWeights(WEIGHTS[0]);
684 taskGFC->SetUsePtWeights(WEIGHTS[1]);
685 taskGFC->SetUseEtaWeights(WEIGHTS[2]);
686 mgr->AddTask(taskGFC);
689 AliAnalysisTaskQCumulants *taskQC = new AliAnalysisTaskQCumulants("TaskQCumulants",useWeights);
690 taskQC->SetUsePhiWeights(WEIGHTS[0]);
691 taskQC->SetUsePtWeights(WEIGHTS[1]);
692 taskQC->SetUseEtaWeights(WEIGHTS[2]);
693 mgr->AddTask(taskQC);
696 AliAnalysisTaskFittingQDistribution *taskFQD = new AliAnalysisTaskFittingQDistribution("TaskFittingQDistribution",kFALSE);
697 taskFQD->SetUsePhiWeights(WEIGHTS[0]);
698 mgr->AddTask(taskFQD);
701 AliAnalysisTaskMCEventPlane *taskMCEP = new AliAnalysisTaskMCEventPlane("TaskMCEventPlane");
702 mgr->AddTask(taskMCEP);
705 AliAnalysisTaskMixedHarmonics *taskMH = new AliAnalysisTaskMixedHarmonics("TaskMixedHarmonics",useWeights);
706 taskMH->SetCorrelatorInteger(1);
707 taskMH->SetNoOfMultipicityBins(10);
708 taskMH->SetMultipicityBinWidth(2);
709 taskMH->SetMinMultiplicity(3);
710 taskMH->SetCorrectForDetectorEffects(kTRUE);
711 //taskMH->SetUsePhiWeights(WEIGHTS[0]);
712 //taskMH->SetUsePtWeights(WEIGHTS[1]);
713 //taskMH->SetUseEtaWeights(WEIGHTS[2]);
714 mgr->AddTask(taskMH);
717 AliAnalysisTaskNestedLoops *taskNL = new AliAnalysisTaskNestedLoops("TaskNestedLoops",useWeights);
718 //taskNL->SetUsePhiWeights(WEIGHTS[0]);
719 //taskNL->SetUsePtWeights(WEIGHTS[1]);
720 //taskNL->SetUseEtaWeights(WEIGHTS[2]);
721 mgr->AddTask(taskNL);
724 // Create the output container for the data produced by the task
725 // Connect to the input and output containers
726 //===========================================================================
727 AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();
728 AliAnalysisDataContainer *coutputFE = mgr->CreateContainer("cobjFlowEventSimple", AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);
729 mgr->ConnectInput(taskFE,0,cinput1);
730 mgr->ConnectOutput(taskFE,1,coutputFE);
733 TString qaNameRPFE = AliAnalysisManager::GetCommonFileName();
734 qaNameRPFE += ":QAforRP_FE_";
737 AliAnalysisDataContainer *coutputQA1FE =
738 mgr->CreateContainer("QARPFE", TList::Class(),AliAnalysisManager::kOutputContainer,qaNameRPFE);
740 TString qaNamePOIFE = AliAnalysisManager::GetCommonFileName();
741 qaNamePOIFE += ":QAforPOI_FE_";
744 AliAnalysisDataContainer *coutputQA2FE =
745 mgr->CreateContainer("QAPOIFE", TList::Class(),AliAnalysisManager::kOutputContainer,qaNamePOIFE);
747 mgr->ConnectOutput(taskFE,2,coutputQA1FE);
748 mgr->ConnectOutput(taskFE,3,coutputQA2FE);
751 // Create the output containers for the data produced by the analysis tasks
752 // Connect to the input and output containers
753 //===========================================================================
755 AliAnalysisDataContainer *cinputWeights = mgr->CreateContainer("cobjWeights",TList::Class(),AliAnalysisManager::kInputContainer);
759 TString outputSP = AliAnalysisManager::GetCommonFileName();
760 outputSP += ":outputSPanalysis";
763 AliAnalysisDataContainer *coutputSP = mgr->CreateContainer("cobjSP", TList::Class(),AliAnalysisManager::kOutputContainer,outputSP);
764 mgr->ConnectInput(taskSP,0,coutputFE);
765 mgr->ConnectOutput(taskSP,1,coutputSP);
767 mgr->ConnectInput(taskSP,1,cinputWeights);
768 cinputWeights->SetData(weightsList);
772 TString outputLYZ1SUM = AliAnalysisManager::GetCommonFileName();
773 outputLYZ1SUM += ":outputLYZ1SUManalysis";
774 outputLYZ1SUM+= type;
776 AliAnalysisDataContainer *coutputLYZ1SUM = mgr->CreateContainer("cobjLYZ1SUM", TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1SUM);
777 mgr->ConnectInput(taskLYZ1SUM,0,coutputFE);
778 mgr->ConnectOutput(taskLYZ1SUM,1,coutputLYZ1SUM);
781 TString outputLYZ1PROD = AliAnalysisManager::GetCommonFileName();
782 outputLYZ1PROD += ":outputLYZ1PRODanalysis";
783 outputLYZ1PROD+= type;
785 AliAnalysisDataContainer *coutputLYZ1PROD = mgr->CreateContainer("cobjLYZ1PROD", TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1PROD);
786 mgr->ConnectInput(taskLYZ1PROD,0,coutputFE);
787 mgr->ConnectOutput(taskLYZ1PROD,1,coutputLYZ1PROD);
790 AliAnalysisDataContainer *cinputLYZ2SUM = mgr->CreateContainer("cobjLYZ2SUMin",TList::Class(),AliAnalysisManager::kInputContainer);
791 TString outputLYZ2SUM = AliAnalysisManager::GetCommonFileName();
792 outputLYZ2SUM += ":outputLYZ2SUManalysis";
793 outputLYZ2SUM+= type;
795 AliAnalysisDataContainer *coutputLYZ2SUM = mgr->CreateContainer("cobjLYZ2SUM", TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2SUM);
796 mgr->ConnectInput(taskLYZ2SUM,0,coutputFE);
797 mgr->ConnectInput(taskLYZ2SUM,1,cinputLYZ2SUM);
798 mgr->ConnectOutput(taskLYZ2SUM,1,coutputLYZ2SUM);
799 cinputLYZ2SUM->SetData(fInputListLYZ2SUM);
802 AliAnalysisDataContainer *cinputLYZ2PROD = mgr->CreateContainer("cobjLYZ2PRODin",TList::Class(),AliAnalysisManager::kInputContainer);
803 TString outputLYZ2PROD = AliAnalysisManager::GetCommonFileName();
804 outputLYZ2PROD += ":outputLYZ2PRODanalysis";
805 outputLYZ2PROD+= type;
807 AliAnalysisDataContainer *coutputLYZ2PROD = mgr->CreateContainer("cobjLYZ2PROD", TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2PROD);
808 mgr->ConnectInput(taskLYZ2PROD,0,coutputFE);
809 mgr->ConnectInput(taskLYZ2PROD,1,cinputLYZ2PROD);
810 mgr->ConnectOutput(taskLYZ2PROD,1,coutputLYZ2PROD);
811 cinputLYZ2PROD->SetData(fInputListLYZ2PROD);
814 AliAnalysisDataContainer *cinputLYZEP = mgr->CreateContainer("cobjLYZEPin",TList::Class(),AliAnalysisManager::kInputContainer);
815 TString outputLYZEP = AliAnalysisManager::GetCommonFileName();
816 outputLYZEP += ":outputLYZEPanalysis";
819 AliAnalysisDataContainer *coutputLYZEP = mgr->CreateContainer("cobjLYZEP", TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZEP);
820 mgr->ConnectInput(taskLYZEP,0,coutputFE);
821 mgr->ConnectInput(taskLYZEP,1,cinputLYZEP);
822 mgr->ConnectOutput(taskLYZEP,1,coutputLYZEP);
823 cinputLYZEP->SetData(fInputListLYZEP);
826 TString outputGFC = AliAnalysisManager::GetCommonFileName();
827 outputGFC += ":outputGFCanalysis";
830 AliAnalysisDataContainer *coutputGFC = mgr->CreateContainer("cobjGFC", TList::Class(),AliAnalysisManager::kOutputContainer,outputGFC);
831 mgr->ConnectInput(taskGFC,0,coutputFE);
832 mgr->ConnectOutput(taskGFC,1,coutputGFC);
834 mgr->ConnectInput(taskGFC,1,cinputWeights);
835 cinputWeights->SetData(weightsList);
839 TString outputQC = AliAnalysisManager::GetCommonFileName();
840 outputQC += ":outputQCanalysis";
843 AliAnalysisDataContainer *coutputQC = mgr->CreateContainer("cobjQC", TList::Class(),AliAnalysisManager::kOutputContainer,outputQC);
844 mgr->ConnectInput(taskQC,0,coutputFE);
845 mgr->ConnectOutput(taskQC,1,coutputQC);
847 mgr->ConnectInput(taskQC,1,cinputWeights);
848 cinputWeights->SetData(weightsList);
852 TString outputFQD = AliAnalysisManager::GetCommonFileName();
853 outputFQD += ":outputFQDanalysis";
856 AliAnalysisDataContainer *coutputFQD = mgr->CreateContainer("cobjFQD", TList::Class(),AliAnalysisManager::kOutputContainer,outputFQD);
857 mgr->ConnectInput(taskFQD,0,coutputFE);
858 mgr->ConnectOutput(taskFQD,1,coutputFQD);
860 mgr->ConnectInput(taskFQD,1,cinputWeights);
861 cinputWeights->SetData(weightsList);
865 TString outputMCEP = AliAnalysisManager::GetCommonFileName();
866 outputMCEP += ":outputMCEPanalysis";
869 AliAnalysisDataContainer *coutputMCEP = mgr->CreateContainer("cobjMCEP", TList::Class(),AliAnalysisManager::kOutputContainer,outputMCEP);
870 mgr->ConnectInput(taskMCEP,0,coutputFE);
871 mgr->ConnectOutput(taskMCEP,1,coutputMCEP);
874 TString outputMH = AliAnalysisManager::GetCommonFileName();
875 outputMH += ":outputMHanalysis";
878 AliAnalysisDataContainer *coutputMH = mgr->CreateContainer("cobjMH", TList::Class(),AliAnalysisManager::kOutputContainer,outputMH);
879 mgr->ConnectInput(taskMH,0,coutputFE);
880 mgr->ConnectOutput(taskMH,1,coutputMH);
882 // mgr->ConnectInput(taskMH,1,cinputWeights);
883 // cinputWeights->SetData(weightsList);
887 TString outputNL = AliAnalysisManager::GetCommonFileName();
888 outputNL += ":outputNLanalysis";
891 AliAnalysisDataContainer *coutputNL = mgr->CreateContainer("cobjNL", TList::Class(),AliAnalysisManager::kOutputContainer,outputNL);
892 mgr->ConnectInput(taskNL,0,coutputFE);
893 mgr->ConnectOutput(taskNL,1,coutputNL);
895 // mgr->ConnectInput(taskNL,1,cinputWeights);
896 // cinputWeights->SetData(weightsList);
900 // Return analysis task
901 //===========================================================================