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