1 //AddTask macro for higher harmonic flow analysis with QC method only.
3 class AliAnalysisDataContainer;
4 class AliFlowTrackCuts;
5 class AliFlowEventCuts;
8 void AddTaskPIDFlowQC(Int_t triggerSelectionString=AliVEvent::kMB,
11 TString fileNameBase="AnalysisResults",
12 TString uniqueStr="Pion_02",
13 Int_t AODfilterBitRP = 272,
14 Int_t AODfilterBitPOI = 272,
16 Int_t MinTPCdedx = 10,
17 Int_t ncentrality = 6,
20 AliPID::EParticleType particleType=AliPID::kPion,
21 AliFlowTrackCuts::PIDsource sourcePID=AliFlowTrackCuts::kTOFbayesian) {
23 // Define a range of the detector to exclude
24 Bool_t ExcludeRegion = kFALSE;
25 Double_t excludeEtaMin = -0.;
26 Double_t excludeEtaMax = 0.;
27 Double_t excludePhiMin = 0.;
28 Double_t excludePhiMax = 0.;
30 int centrMin[9] = {0,5,10,20,30,40,50,60,70};
31 int centrMax[9] = {5,10,20,30,40,50,60,70,80};
32 const int ncentr = ncentrality;
35 //---------Data selection----------
36 //kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet
37 AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;
38 AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;
40 //---------Parameter mixing--------
41 //kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt
42 AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;
43 AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;
45 const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);
46 const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype);
49 //===========================================================================
51 AliFlowEventCuts* cutsEvent[ncentr];
52 AliFlowTrackCuts* cutsRP[ncentr];
53 AliFlowTrackCuts* cutsPOI[ncentr];
54 TString outputSlotName[ncentr][4];
55 TString suffixName[ncentr];
57 for(int icentr=0;icentr<ncentr;icentr++){
58 cutsEvent[icentr] = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
59 //cutsEvent[icentr]->SetUsedDataset(is2011);
60 cutsEvent[icentr]->SetCentralityPercentileRange(centrMin[icentr],centrMax[icentr]);
61 cutsEvent[icentr]->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);
62 // cutsEvent->SetRefMultMethod(AliFlowEventCuts::kVZERO);
63 //cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);
64 //cutsEvent->SetNContributorsRange(2);
65 cutsEvent[icentr]->SetPrimaryVertexZrange(-10.,10.);
66 cutsEvent[icentr]->SetQA(doQA);
67 cutsEvent[icentr]->SetCutTPCmultiplicityOutliers();
71 cutsRP[icentr] = new AliFlowTrackCuts(Form("TPConlyRP_%d",icentr));
72 cutsRP[icentr]->SetParamType(rptype);
73 cutsRP[icentr]->SetParamMix(rpmix);
74 cutsRP[icentr]->SetPtRange(0.2,5.);
75 cutsRP[icentr]->SetEtaRange(etamin,etamax);
76 cutsRP[icentr]->SetMinNClustersTPC(70);
77 // cutsRP->SetMinChi2PerClusterTPC(0.1);//
78 // cutsRP->SetMaxChi2PerClusterTPC(4.0);//
79 cutsRP[icentr]->SetMaxDCAToVertexXY(3.0);
80 cutsRP[icentr]->SetMaxDCAToVertexZ(3.0);
81 cutsRP[icentr]->SetAcceptKinkDaughters(kFALSE);
82 cutsRP[icentr]->SetMinimalTPCdedx(MinTPCdedx);
83 cutsRP[icentr]->SetAODfilterBit(AODfilterBitRP);
84 cutsRP[icentr]->SetQA(doQA);
87 //POIs for SP and QC method
88 //===========================================================================
89 AliFlowTrackCuts *SP_POI[ncentr];
90 //half window for POIs
91 //=======================SP POI Cuts
92 SP_POI[icentr] = DefinePOIcuts(icentr);
94 SP_POI[icentr]->GetBayesianResponse()->ForceOldDedx(); // for 2010 data to use old TPC PID Response instead of the official one
95 SP_POI[icentr]->SetParamType(poitype);
96 SP_POI[icentr]->SetParamMix(poimix);
97 SP_POI[icentr]->SetPtRange(0.2,5.);//
98 SP_POI[icentr]->SetMinNClustersTPC(70);
99 SP_POI[icentr]->SetEtaRange( etamin,etamax );
101 // SP_POI->SetMinChi2PerClusterTPC(0.1); //
102 // SP_POI->SetMaxChi2PerClusterTPC(4.0); //
103 // SP_POI->SetRequireITSRefit(kTRUE);
104 // SP_POI->SetRequireTPCRefit(kTRUE);
105 // SP_POI->SetMinNClustersITS(2);
106 // SP_POI->SetMaxChi2PerClusterITS(1.e+09);
107 SP_POI[icentr]->SetMaxDCAToVertexXY(3.0);
108 SP_POI[icentr]->SetMaxDCAToVertexZ(3.0);
109 //SP_POI->SetDCAToVertex2D(kTRUE);
110 //SP_POI->SetMaxNsigmaToVertex(1.e+10);
111 //SP_POI->SetRequireSigmaToVertex(kFALSE);
112 SP_POI[icentr]->SetAcceptKinkDaughters(kFALSE);
113 if(isPID) SP_POI[icentr]->SetPID(particleType, sourcePID);//particleType, sourcePID
114 if (charge!=0) SP_POI[icentr]->SetCharge(charge);
115 //SP_POI->SetAllowTOFmismatch(kFALSE);
116 SP_POI[icentr]->SetRequireStrictTOFTPCagreement(kTRUE);
117 SP_POI[icentr]->SetMinimalTPCdedx(MinTPCdedx);
118 SP_POI[icentr]->SetAODfilterBit(AODfilterBitPOI);
119 SP_POI[icentr]->SetQA(doQA);
120 SP_POI[icentr]->SetPriors((centrMin[icentr]+centrMax[icentr])*0.5);
125 //=====================================================================
127 suffixName[icentr] = "highharmflow";
128 suffixName[icentr] += Form("%i_", centrMin[icentr]);
129 suffixName[icentr] += Form("%i_", centrMax[icentr]);
132 suffixName[icentr]+=AliFlowTrackCuts::PIDsourceName(sourcePID);
133 suffixName[icentr]+="_";
134 suffixName[icentr]+=AliPID::ParticleName(particleType);//particleType
137 suffixName[icentr]+="AllCharged";
139 if (charge<0) suffixName[icentr]+="-";
140 if (charge>0) suffixName[icentr]+="+";
143 for(int harmonic=2;harmonic<6;harmonic++){ //for v2,v3,v4 and v5
144 outputSlotName[icentr][harmonic-2] = "";
145 outputSlotName[icentr][harmonic-2]+=uniqueStr;
146 outputSlotName[icentr][harmonic-2]+=Form("_v%i_",harmonic);
147 outputSlotName[icentr][harmonic-2]+=cutsRP[icentr]->GetName();
148 outputSlotName[icentr][harmonic-2]+="_";
149 outputSlotName[icentr][harmonic-2]+=SP_POI[icentr]->GetName();
150 outputSlotName[icentr][harmonic-2]+=Form("_%i-",centrMin[icentr]);
151 outputSlotName[icentr][harmonic-2]+=Form("%i_",centrMax[icentr]);
155 outputSlotName[icentr][harmonic-2]+=AliFlowTrackCuts::PIDsourceName(sourcePID);//sourcePID
156 outputSlotName[icentr][harmonic-2]+="_";
157 outputSlotName[icentr][harmonic-2]+=AliPID::ParticleName(particleType);//particleType
160 outputSlotName[icentr][harmonic-2]+="AllCharged";
162 if (charge<0) outputSlotName[icentr][harmonic-2]+="-";
163 if (charge>0) outputSlotName[icentr][harmonic-2]+="+";
168 TString fileName(fileNameBase);
169 fileName.Append(".root");
173 //====================================FLOWPACKAGE TASKS=========================//
174 AliAnalysisDataContainer *cinput1[ncentr];
175 AliAnalysisDataContainer *coutputFE[ncentr];
176 AliAnalysisDataContainer* coutputFEQA[ncentr];
177 AliAnalysisTaskFlowEvent *taskFE[ncentr];
180 AliAnalysisDataContainer *coutputQC[ncentr][4];
181 AliAnalysisTaskQCumulants *taskQC[ncentr][4];
183 TString outputQA[ncentr];
185 for (int icentr=0; icentr<ncentr; icentr++) {
187 // Get the pointer to the existing analysis manager via the static access method.
188 //==============================================================================
189 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
191 Error("AddTaskFlowEvent", "No analysis manager to connect to.");
195 // Check the analysis type using the event handlers connected to the analysis
196 // manager. The availability of MC handler can also be checked here.
197 //==============================================================================
198 if (!mgr->GetInputEventHandler()) {
199 ::Error("AddTaskFlowEvent", "This task requires an input event handler");
203 taskFE[icentr] = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent_%s",suffixName[icentr].Data()),"",doQA);
204 taskFE[icentr]->SelectCollisionCandidates(triggerSelectionString);
205 mgr->AddTask(taskFE[icentr]);
207 // Pass cuts for RPs and POIs to the task:
208 taskFE[icentr]->SetCutsEvent(cutsEvent[icentr]);
209 taskFE[icentr]->SetCutsRP(cutsRP[icentr]);
210 taskFE[icentr]->SetCutsPOI(SP_POI[icentr]);
211 if (cutsRP[icentr]->GetParamType()==AliFlowTrackCuts::kVZERO)
213 //TODO: since this is set in a static object all analyses in an analysis train
215 taskFE[icentr]->SetHistWeightvsPhiMin(0.);
216 taskFE[icentr]->SetHistWeightvsPhiMax(200.);
219 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
221 cinput1[icentr] = mgr->GetCommonInputContainer();
223 coutputFE[icentr] = mgr->CreateContainer(Form("FlowEvent_%s",suffixName[icentr].Data()),AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);
225 mgr->ConnectInput(taskFE[icentr],0,cinput1[icentr]);
226 mgr->ConnectOutput(taskFE[icentr],1,coutputFE[icentr]);
227 //==========================================================
229 for(int harm=2;harm<6;harm++){
231 taskQC[icentr][harm-2] = new AliAnalysisTaskQCumulants(Form("TaskQCumulants_%s",outputSlotName[icentr][harm-2].Data()),kFALSE);
232 taskQC[icentr][harm-2]->SelectCollisionCandidates(triggerSelectionString);
233 // taskQC[icentr][harm-2]->SetUsePhiWeights(WEIGHTS[0]);
234 // taskQC[icentr][harm-2]->SetUsePtWeights(WEIGHTS[1]);
235 // taskQC[icentr][harm-2]->SetUseEtaWeights(WEIGHTS[2]);
236 taskQC[icentr][harm-2]->SetCalculateCumulantsVsM(kFALSE);
237 taskQC[icentr][harm-2]->SetnBinsMult(10000);
238 taskQC[icentr][harm-2]->SetMinMult(0.);
239 taskQC[icentr][harm-2]->SetMaxMult(10000.);
240 taskQC[icentr][harm-2]->SetHarmonic(harm);
241 taskQC[icentr][harm-2]->SetApplyCorrectionForNUA(kFALSE);
242 taskQC[icentr][harm-2]->SetFillMultipleControlHistograms(kFALSE);
243 mgr->AddTask(taskQC[icentr][harm-2]);
245 TString outputQC = fileName;
246 outputQC += ":outputQCanalysis";
247 outputQC+= rptypestr;
249 coutputQC[icentr][harm-2] = mgr->CreateContainer(Form("QC_%s",outputSlotName[icentr][harm-2].Data()),
250 TList::Class(),AliAnalysisManager::kOutputContainer,outputQC);
251 mgr->ConnectInput(taskQC[icentr][harm-2],0,coutputFE[icentr]);
252 mgr->ConnectOutput(taskQC[icentr][harm-2],1,coutputQC[icentr][harm-2]);
257 if (taskFE[icentr]->GetQAOn()) {
258 outputQA[icentr] = fileName;
259 outputQA[icentr] += ":QA";
260 coutputFEQA[icentr] = mgr->CreateContainer(Form("QA_%s",suffixName[icentr].Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputQA[icentr]);
261 mgr->ConnectOutput(taskFE[icentr],2,coutputFEQA[icentr]);
269 //===========================================================================
271 AliFlowEventCuts* DefinecutsEvent(Int_t icentr){
272 AliFlowEventCuts* cutsEvent = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
275 AliFlowTrackCuts* DefineRPcuts(Int_t icentr){
276 AliFlowTrackCuts* cutsRP = new AliFlowTrackCuts(Form("TPConlyRP_%d",icentr));
279 AliFlowTrackCuts* DefinePOIcuts(Int_t icentr){
280 AliFlowTrackCuts* cutsPOI = new AliFlowTrackCuts(Form("TPConlyPOI_%d",icentr));