]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/EvTrkSelection/macros/AddSingleTrackEfficiencyTask.C
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGPP / EvTrkSelection / macros / AddSingleTrackEfficiencyTask.C
CommitLineData
c0757458 1//
2// Particle cuts
3//
4const Double_t etamin = -0.9;
5const Double_t etamax = 0.9;
6const Double_t ptmin = 0.0;
7const Double_t ptmax = 24.0;
8const Double_t phimin = -2*TMath::Pi();
9const Double_t phimax = 2*TMath::Pi();
10const Double_t thetamin = 0;
11const Double_t thetamax = TMath::Pi();
12const Double_t zvtxmin = -10.0;
13const Double_t zvtxmax = 10.0;
14//
15const Int_t mintrackrefsTPC = 5;
16const Int_t mintrackrefsITS = 4;
17const Int_t mintrackrefsTOF = 0;
18const Int_t mintrackrefsMUON = 0;
19const Int_t minclustersTPC = 70;
20const Int_t minclustersITS = 2;
21const Bool_t TPCRefit = kTRUE;
22const Bool_t ITSRefit = kFALSE;
305e50f1 23const Bool_t ischarged = kTRUE;
c0757458 24const Int_t fBit = 0;
2d9f660a 25const TString centralityEstimator = "V0M";
c0757458 26
27//
28// Container settings
29//
30// Container mutliplicity bins
31const Float_t multmin_0_20 = 0;
32const Float_t multmax_0_20 = 20;
33const Float_t multmin_20_50 = 20;
34const Float_t multmax_20_50 = 50;
35const Float_t multmin_50_102 = 50;
36const Float_t multmax_50_102 = 102;
37// Container Pt bins
38Double_t ptmin_0_2 = 0.0;
39Double_t ptmax_0_2 = 2.0;
40Double_t ptmin_2_6 = 2.0;
41Double_t ptmax_2_6 = 6.0;
42Double_t ptmin_6_8 = 6.0;
43Double_t ptmax_6_8 = 8.0;
44Double_t ptmin_8_16 = 8.0;
45Double_t ptmax_8_16 = 16.0;
46Double_t ptmin_16_24 = 16.0;
47Double_t ptmax_16_24 = 24.0;
2d9f660a 48// Container centrality bins
49const Float_t centmin_0_10 = 0.;
50const Float_t centmax_0_10 = 10.;
51const Float_t centmin_10_60 = 10.;
52const Float_t centmax_10_60 = 60.;
53const Float_t centmin_60_100 = 60.;
54const Float_t centmax_60_100 = 100.;
c0757458 55
56
57AliCFSingleTrackEfficiencyTask *AddSingleTrackEfficiencyTask(const Bool_t readAOD = 0, // Flag to read AOD:1 or ESD:0
58 TString suffix="", // suffix for the output directory
2d9f660a 59 AliPID::EParticleType specie=AliPID::kPion, Int_t pdgcode=0, //particle specie
60 ULong64_t triggerMask=AliVEvent::kAnyINT,
61 Bool_t useCentrality = kFALSE
c0757458 62 )
63{
64
65 Info("AliCFSingleTrackEfficiencyTask","SETUP CONTAINER");
66
67 //
68 // Setting up the container
69 //
70 // Variables
2d9f660a 71 const Int_t nvar = 7; // number of variables on the grid: pt, y, phi, theta, zvtx, multiplicity, centrality
c0757458 72 UInt_t nstep = 8; // number of container steps
73 const UInt_t ipt = 0;
74 const UInt_t iy = 1;
75 const UInt_t iphi = 2;
76 const UInt_t itheta = 3;
77 const UInt_t izvtx = 4;
78 const UInt_t imult = 5;
2d9f660a 79 const UInt_t imult = 5;
80 const UInt_t icent = 6;
c0757458 81 //
82 // Containter bining
83 // A1. Bins variation by hand for pt
84 const Int_t nbinpt_0_2 = 8; //bins in pt from 0 to 2 GeV
85 const Int_t nbinpt_2_6 = 8; //bins in pt from 2 to 6 GeV
86 const Int_t nbinpt_6_8 = 2; //bins in pt from 6 to 8 GeV
87 const Int_t nbinpt_8_16 = 4; //bins in pt from 8 to 16 GeV
88 const Int_t nbinpt_16_24 = 1; //bins in pt from 16 to 24 GeV
89 // A2. Bins variation by hand for other variables
90 const Int_t nbin2 = 9; //bins in eta
91 const Int_t nbin3 = 9; //bins in phi
92 const Int_t nbin4 = 9; //bins in theta
93 const Int_t nbin5 = 10; //bins in zvtx
94 // A3. Bins for multiplicity
95 const Int_t nbinmult = 48; //bins in multiplicity (total number)
96 const Int_t nbinmult_0_20 = 20; //bins in multiplicity between 0 and 20
97 const Int_t nbinmult_20_50 = 15; //bins in multiplicity between 20 and 50
98 const Int_t nbinmult_50_102 = 13; //bins in multiplicity between 50 and 102
2d9f660a 99 // A4. Bins for centrality
100 const Int_t nbincent = 28; //bins in centrality
101 const Int_t nbincent_0_10 = 4; //bins in centrality between 0 and 10
102 const Int_t nbincent_10_60 = 20; //bins in centrality between 10 and 60
103 const Int_t nbincent_60_100 = 4; //bins in centrality between 60 and 100
c0757458 104
105 //arrays for the number of bins in each dimension
106 Int_t iBin[nvar];
107 iBin[0]=nbinpt_0_2+nbinpt_2_6+nbinpt_6_8+nbinpt_8_16+nbinpt_16_24;
108 iBin[1]=nbin2;
109 iBin[2]=nbin3;
110 iBin[3]=nbin4;
111 iBin[4]=nbin5;
112 iBin[5]=nbinmult;
2d9f660a 113 iBin[6]=nbincent;
c0757458 114
115 //arrays for lower bounds :
116 Double_t *binLimpT = new Double_t[iBin[0]+1];
117 Double_t *binLim2 = new Double_t[iBin[1]+1];
118 Double_t *binLim3 = new Double_t[iBin[2]+1];
119 Double_t *binLim4 = new Double_t[iBin[3]+1];
120 Double_t *binLim5 = new Double_t[iBin[4]+1];
121 Double_t *binLimmult = new Double_t[iBin[5]+1];
2d9f660a 122 Double_t *binLimcent = new Double_t[iBin[6]+1];
c0757458 123
124 // set the pt bins
125 for(Int_t i=0; i<=nbinpt_0_2; i++) binLimpT[i]=(Double_t)ptmin_0_2 + (ptmax_0_2-ptmin_0_2)/nbinpt_0_2*(Double_t)i ;
126 for(Int_t i=0; i<=nbinpt_2_6; i++) binLimpT[i+nbinpt_0_2]=(Double_t)ptmin_2_6 + (ptmax_2_6-ptmin_2_6)/nbinpt_2_6*(Double_t)i ;
127 for(Int_t i=0; i<=nbinpt_6_8; i++) binLimpT[i+nbinpt_0_2+nbinpt_2_6]=(Double_t)ptmin_6_8 + (ptmax_6_8-ptmin_6_8)/nbinpt_6_8*(Double_t)i ;
128 for(Int_t i=0; i<=nbinpt_8_16; i++) binLimpT[i+nbinpt_0_2+nbinpt_2_6+nbinpt_6_8]=(Double_t)ptmin_8_16 + (ptmax_8_16-ptmin_8_16)/nbinpt_8_16*(Double_t)i ;
129 for(Int_t i=0; i<=nbinpt_16_24; i++) binLimpT[i+nbinpt_0_2+nbinpt_2_6+nbinpt_6_8+nbinpt_8_16]=(Double_t)ptmin_16_24 + (ptmax_16_24-ptmin_16_24)/nbinpt_16_24*(Double_t)i;
130
131 // Other Variables
132 for(Int_t i=0; i<=nbin2; i++) binLim2[i]=(Double_t)etamin + (etamax-etamin)/nbin2*(Double_t)i ;
133 for(Int_t i=0; i<=nbin3; i++) binLim3[i]=(Double_t)phimin + (phimax-phimin)/nbin3*(Double_t)i ;
134 for(Int_t i=0; i<=nbin4; i++) binLim4[i]=(Double_t)thetamin + (thetamax-thetamin)/nbin4*(Double_t)i ;
135 for(Int_t i=0; i<=nbin5; i++) binLim5[i]=(Double_t)zvtxmin + (zvtxmax-zvtxmin)/nbin5*(Double_t)i ;
136
137 // multiplicity bining..
138 for(Int_t i=0; i<=nbinmult_0_20; i++) binLimmult[i]=(Double_t)multmin_0_20 + (multmax_0_20-multmin_0_20)/nbinmult_0_20*(Double_t)i ;
139 for(Int_t i=0; i<=nbinmult_20_50; i++) binLimmult[i+nbinmult_0_20]=(Double_t)multmin_20_50 + (multmax_20_50-multmin_20_50)/nbinmult_20_50*(Double_t)i ;
140 for(Int_t i=0; i<=nbinmult_50_102; i++) binLimmult[i+nbinmult_0_20+nbinmult_20_50]=(Double_t)multmin_50_102 + (multmax_50_102-multmin_50_102)/nbinmult_50_102*(Double_t)i ;
141
2d9f660a 142 // centrality bining
143 for(Int_t i=0; i<=nbincent_0_10; i++) binLimcent[i]=(Double_t)centmin_0_10 + (centmax_0_10-centmin_0_10)/nbincent_0_10*(Double_t)i;
144 for(Int_t i=0; i<=nbincent_10_60; i++) binLimcent[i+nbincent_0_10]=(Double_t)centmin_10_60 + (centmax_10_60-centmin_10_60)/nbincent_10_60*(Double_t)i;
145 for(Int_t i=0; i<=nbincent_60_100; i++) binLimcent[i+nbincent_0_10+nbincent_10_60]=(Double_t)centmin_60_100 + (centmax_60_100-centmin_60_100)/nbincent_60_100*(Double_t)i;
c0757458 146
147 // Container
148 AliCFContainer* container = new AliCFContainer("container","container for tracks",nstep,nvar,iBin);
149 container -> SetBinLimits(ipt,binLimpT); // pt
150 container -> SetBinLimits(iy,binLim2); // eta
151 container -> SetBinLimits(iphi,binLim3); // phi
152 container -> SetBinLimits(itheta,binLim4); // theta
153 container -> SetBinLimits(izvtx,binLim5); // Zvtx
154 container -> SetBinLimits(imult,binLimmult);// multiplicity
2d9f660a 155 container -> SetBinLimits(icent,binLimcent);// centrality
c0757458 156
157 // Variable Titles
158 container -> SetVarTitle(ipt,"pt");
159 container -> SetVarTitle(iy, "y");
160 container -> SetVarTitle(iphi,"phi");
161 container -> SetVarTitle(itheta, "theata");
162 container -> SetVarTitle(izvtx, "Zvtx");
163 container -> SetVarTitle(imult, "Multiplicity");
2d9f660a 164 container -> SetVarTitle(icent, "Centrality");
c0757458 165
166 // Step Titles
167 container -> SetStepTitle(0, " MC Particle with Generated Cuts");
168 container -> SetStepTitle(1, " MC Particle with Kine Acceptance Cuts");
169 container -> SetStepTitle(2, " MC Particle with Track Ref Acceptance Cuts");
170 container -> SetStepTitle(3, " Total Reconstructed Particle ");
171 container -> SetStepTitle(4, " Reco Particle With Kine Acceptance Cuts");
172 container -> SetStepTitle(5, " Reco Particle to MC True pt particles ");
173 container -> SetStepTitle(6, " Reco Particle With Quality Cuts");
174 container -> SetStepTitle(7, " Reco PID With Quality Cuts");
175
176
177 // SET TLIST FOR QA HISTOS
178 TList* qaList = new TList();
179 TObjArray* emptyList = new TObjArray(0);
180
181 //CREATE THE INTERFACE TO CORRECTION FRAMEWORK USED IN THE TASK
182 printf("CREATE INTERFACE AND CUTS\n");
183 AliCFManager* man = new AliCFManager();
184
185 man->SetNStepEvent(2);
186 man->SetEventContainer(container);
187 man->SetEventCutsList(0,emptyList);//evtmcList);
188 man->SetEventCutsList(1,emptyList);//evtrecoList);
189
190 man->SetParticleContainer(container);
191 man->SetParticleCutsList(0,emptyList);//mcGenList);
192 man->SetParticleCutsList(1,emptyList);//mcKineList);
193 man->SetParticleCutsList(2,emptyList);//mcaccList);
194 man->SetParticleCutsList(3,emptyList);//evtrecoPureList);
195 man->SetParticleCutsList(4,emptyList);//recKineList);
196 man->SetParticleCutsList(5,emptyList);
197 man->SetParticleCutsList(6,emptyList);
198 man->SetParticleCutsList(7,emptyList);
199
200 // Simulated particle & event cuts
201 AliSingleTrackEffCuts* cuts = new AliSingleTrackEffCuts();
202 cuts->SetPtRange(ptmin,ptmax);
203 cuts->SetEtaRange(etamin,etamax);
305e50f1 204 cuts->SetIsCharged(ischarged);
c0757458 205 cuts->SetMinVtxContr(1);
206 cuts->SetMaxVtxZ(zvtxmax);
207 cuts->SetNumberOfClusters(mintrackrefsITS,mintrackrefsTPC,mintrackrefsTOF,mintrackrefsMUON);
2d9f660a 208 cuts->SetTriggerMask(triggerMask);
c0757458 209 cuts->SetIsAOD(readAOD);
210 //
211 // Pid selection here
212 //
213 if(pdgcode>0){
214 cuts->SetUsePid(true);
215 cuts->SetParticleSpecie(specie);
216 cuts->SetPdgCode(pdgcode);
217 //
218 const Int_t nlims=1;
219 Float_t plims[nlims+1]={0.,999.}; //TPC limits in momentum [GeV/c]
220 Float_t sigmas[nlims]={3.};
221 cuts->SetUseTPCPid();
222 cuts->SetTPCSigmaPtBins(nlims,plims,sigmas);
223 cuts->SetMaximumPTPC(4.);
224 //
225 const Int_t nlims2=1;
226 Float_t plims2[nlims2+1]={0.,999.}; //TPC limits in momentum [GeV/c]
227 Float_t sigmas2[nlims2]={3.};
228 cuts->SetUseTOFPid();
229 cuts->SetTOFSigmaPtBins(nlims2,plims2,sigmas2);
230 cuts->SetMaximumPTOF(4.);
231 }
232
233 //
234 // Track Quality cuts via ESD track cuts
235 //
236 AliESDtrackCuts* QualityCuts = new AliESDtrackCuts();
237 QualityCuts->SetRequireSigmaToVertex(kFALSE);
238 QualityCuts->SetMinNClustersTPC(minclustersTPC);
239 QualityCuts->SetMinNClustersITS(minclustersITS);
240 QualityCuts->SetRequireTPCRefit(TPCRefit);
241 QualityCuts->SetRequireITSRefit(ITSRefit);
242 QualityCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
243 QualityCuts->SetMinDCAToVertexXY(0.);
244 QualityCuts->SetEtaRange(etamin,etamax);
245 QualityCuts->SetPtRange(ptmin,ptmax);
246
247
248 //CREATE THE TASK
249 printf("CREATE CF Single track task\n");
250
251 AliCFSingleTrackEfficiencyTask *task = new AliCFSingleTrackEfficiencyTask("AliCFSingleTrackEfficiencyTask",QualityCuts,cuts);
d07c54b9 252 if(readAOD) task->SetFilterBit(kTRUE);
253 else task->SetFilterBit(kFALSE);
c0757458 254 task->SetFilterType(fBit);
2d9f660a 255 // task->SelectCollisionCandidates(triggerMask);//AliVEvent::kMB);
256 if(useCentrality) task->SetUseCentrality(useCentrality,centralityEstimator);
c0757458 257 task->SetCFManager(man); //here is set the CF manager
258
259 //
260 // Get the pointer to the existing analysis manager via the static access method.
261 //==============================================================================
262 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
263 if (!mgr) {
264 ::Error("AddTask", "No analysis manager to connect to.");
265 return NULL;
266 }
267
268 // This task requires an ESD or AOD input handler and an AOD output handler.
269 // Check this using the analysis manager.
270 //===============================================================================
271 TString type = mgr->GetInputEventHandler()->GetDataType();
272 if (!type.Contains("ESD") && !type.Contains("AOD")) {
273 ::Error("AddSingleTrackEfficiencyTask", "AliCFSingleTrackEfficiency task needs the manager to have an ESD or AOD input handler.");
274 return NULL;
275 }
276
277 mgr->AddTask(task);
278 printf(" Create the output container\n");
279
280 //
281 // Create and connect containers for input/output
282 //
283 // ----- output data -----
284 TString outputfile = AliAnalysisManager::GetCommonFileName();
285 TString input1name="cchain0";
286 TString output2name="HistEventsProcessed", output3name="container",output4name="list",output5name="ESDtrackCuts",output6name="MCtrackCuts";
287 outputfile += ":PWGPP_CFSingleTrack";
288 outputfile += suffix;
289 output2name += suffix;
290 output3name += suffix;
291 output4name += suffix;
292 output5name += suffix;
293 output6name += suffix;
294
295
296 // ------ input data ------
297 AliAnalysisDataContainer *cinput0 = mgr->GetCommonInputContainer();
298 // ----- output data -----
299 // output TH1I for event counting
300 AliAnalysisDataContainer *coutput1 = mgr->CreateContainer(output2name, TH1I::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
301 // output Correction Framework Container (for acceptance & efficiency calculations)
302 AliAnalysisDataContainer *coutput2 = mgr->CreateContainer(output3name, AliCFContainer::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
303 // output QA histograms
304 AliAnalysisDataContainer *coutput3 = mgr->CreateContainer(output4name, TList::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
305 // output ESD track cuts for book keeping
306 AliAnalysisDataContainer *coutput4 = mgr->CreateContainer(output5name, AliESDtrackCuts::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
307 // output event and particle selection cuts for book keeping
308 AliAnalysisDataContainer *coutput5 = mgr->CreateContainer(output6name, AliSingleTrackEffCuts::Class(),AliAnalysisManager::kOutputContainer,outputfile.Data());
309
310 mgr->ConnectInput(task,0,mgr->GetCommonInputContainer());
311 mgr->ConnectOutput(task,1,coutput1);
312 mgr->ConnectOutput(task,2,coutput2);
313 mgr->ConnectOutput(task,3,coutput3);
314 mgr->ConnectOutput(task,4,coutput4);
315 mgr->ConnectOutput(task,5,coutput5);
316
317 return task;
318}