]>
Commit | Line | Data |
---|---|---|
7cc34f08 | 1 | //------------------------------------------------------------------------------\r |
2 | // Implementation of AliComparisonEff class. It keeps information from \r | |
3 | // comparison of reconstructed and MC particle tracks. In addtion, \r | |
4 | // it keeps selection cuts used during comparison. The comparison \r | |
5 | // information is stored in the ROOT histograms. Analysis of these \r | |
6 | // histograms can be done by using Analyse() class function. The result of \r | |
7 | // the analysis (histograms/graphs) are stored in the folder which is \r | |
8 | // a data member of AliComparisonEff.\r | |
9 | // \r | |
10 | // Author: J.Otwinowski 04/02/2008 \r | |
11 | //------------------------------------------------------------------------------\r | |
12 | \r | |
13 | /*\r | |
14 | \r | |
15 | // after running comparison task, read the file, and get component\r | |
16 | gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");\r | |
17 | LoadMyLibs();\r | |
18 | TFile f("Output.root");\r | |
19 | //AliComparisonEff * compObj = (AliComparisonEff*)f.Get("AliComparisonEff");\r | |
20 | AliComparisonEff * compObj = (AliComparisonEff*)cOutput->FindObject("AliComparisonEff");\r | |
21 | \r | |
22 | // Analyse comparison data\r | |
23 | compObj->Analyse();\r | |
24 | \r | |
25 | // the output histograms/graphs will be stored in the folder "folderEff" \r | |
26 | compObj->GetAnalysisFolder()->ls("*");\r | |
27 | \r | |
28 | // user can save whole comparison object (or only folder with anlysed histograms) \r | |
29 | // in the seperate output file (e.g.)\r | |
30 | TFile fout("Analysed_Eff.root","recreate");\r | |
31 | compObj->Write(); // compObj->GetAnalysisFolder()->Write();\r | |
32 | fout.Close();\r | |
33 | \r | |
34 | */\r | |
35 | \r | |
36 | #include <TAxis.h>\r | |
37 | #include <TH1D.h>\r | |
38 | \r | |
39 | // \r | |
40 | #include "AliESDtrack.h"\r | |
41 | #include "AliRecInfoCuts.h" \r | |
42 | #include "AliMCInfoCuts.h" \r | |
43 | #include "AliLog.h" \r | |
44 | #include "AliESDVertex.h" \r | |
45 | #include "AliExternalTrackParam.h" \r | |
46 | #include "AliTracker.h" \r | |
47 | #include "AliMCInfo.h" \r | |
48 | #include "AliESDRecInfo.h" \r | |
49 | #include "AliComparisonEff.h" \r | |
50 | \r | |
51 | using namespace std;\r | |
52 | \r | |
53 | ClassImp(AliComparisonEff)\r | |
54 | \r | |
55 | //_____________________________________________________________________________\r | |
56 | AliComparisonEff::AliComparisonEff():\r | |
57 | AliComparisonObject("AliComparisonEff"),\r | |
58 | \r | |
59 | // histograms\r | |
60 | \r | |
61 | fEffHisto(0),\r | |
62 | \r | |
63 | // Cuts \r | |
64 | fCutsRC(0), \r | |
65 | fCutsMC(0),\r | |
66 | \r | |
67 | // histogram folder \r | |
68 | fAnalysisFolder(0)\r | |
69 | {\r | |
70 | // default consttructor \r | |
71 | }\r | |
72 | \r | |
73 | //_____________________________________________________________________________\r | |
74 | AliComparisonEff::AliComparisonEff(Char_t* name="AliComparisonEff",Char_t*title="AliComparisonEff",Int_t analysisMode=0, Bool_t hptGenerator=kFALSE):\r | |
75 | AliComparisonObject(name,title),\r | |
76 | \r | |
77 | // histograms\r | |
78 | fEffHisto(0),\r | |
79 | \r | |
80 | // Cuts \r | |
81 | fCutsRC(0), \r | |
82 | fCutsMC(0),\r | |
83 | \r | |
84 | // histogram folder \r | |
85 | fAnalysisFolder(0)\r | |
86 | {\r | |
87 | // named constructor\r | |
88 | //\r | |
89 | SetAnalysisMode(analysisMode);\r | |
90 | SetHptGenerator(hptGenerator);\r | |
91 | \r | |
92 | Init();\r | |
93 | }\r | |
94 | \r | |
95 | \r | |
96 | //_____________________________________________________________________________\r | |
97 | AliComparisonEff::~AliComparisonEff()\r | |
98 | {\r | |
99 | // destructor\r | |
100 | \r | |
101 | if(fEffHisto) delete fEffHisto; fEffHisto=0;\r | |
102 | \r | |
103 | if(fCutsRC) delete fCutsRC; fCutsRC=0;\r | |
104 | if(fCutsMC) delete fCutsMC; fCutsMC=0;\r | |
105 | \r | |
106 | if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;\r | |
107 | }\r | |
108 | \r | |
109 | //_____________________________________________________________________________\r | |
110 | void AliComparisonEff::Init()\r | |
111 | {\r | |
112 | // Init histograms\r | |
113 | //\r | |
114 | Int_t nPtBins = 31;\r | |
115 | Double_t binsPt[32] = {0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.7,0.8,0.9,1.0,1.2,1.4,1.6,1.8,2.0,2.25,2.5,2.75,3.,3.5,4.,5.,6.,8.,10.};\r | |
116 | Double_t ptMin = 0., ptMax = 10.;\r | |
117 | \r | |
118 | if(IsHptGenerator() == kTRUE) {\r | |
119 | nPtBins = 100;\r | |
120 | ptMin = 0.; ptMax = 100.;\r | |
121 | }\r | |
122 | \r | |
123 | //mceta:mcphi:mcpt:pid:isPrim:recStatus:findable\r | |
124 | Int_t binsEffHisto[7]={30,90,nPtBins,5,2,2,2};\r | |
125 | Double_t minEffHisto[7]={-1.5,0.,ptMin,0.,0.,0.,0.};\r | |
126 | Double_t maxEffHisto[7]={ 1.5,2.*TMath::Pi(), ptMax,5.,2.,2.,2.};\r | |
127 | \r | |
128 | fEffHisto = new THnSparseF("fEffHisto","mceta:mcphi:mcpt:pid:isPrim:recStatus:findable",7,binsEffHisto,minEffHisto,maxEffHisto);\r | |
129 | if(!IsHptGenerator()) fEffHisto->SetBinEdges(2,binsPt);\r | |
130 | \r | |
131 | fEffHisto->GetAxis(0)->SetTitle("eta");\r | |
132 | fEffHisto->GetAxis(1)->SetTitle("phi (rad)");\r | |
133 | fEffHisto->GetAxis(2)->SetTitle("pt (GeV/c)");\r | |
134 | fEffHisto->GetAxis(3)->SetTitle("pid");\r | |
135 | fEffHisto->GetAxis(4)->SetTitle("isPrim");\r | |
136 | fEffHisto->GetAxis(5)->SetTitle("recStatus");\r | |
137 | fEffHisto->GetAxis(6)->SetTitle("findable");\r | |
138 | fEffHisto->Sumw2();\r | |
139 | \r | |
140 | // init cuts\r | |
141 | if(!fCutsMC) \r | |
142 | AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");\r | |
143 | if(!fCutsRC) \r | |
144 | AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");\r | |
145 | \r | |
146 | // init folder\r | |
147 | fAnalysisFolder = CreateFolder("folderEff","Analysis Efficiency Folder");\r | |
148 | }\r | |
149 | \r | |
150 | //_____________________________________________________________________________\r | |
151 | void AliComparisonEff::ProcessTPC(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r | |
152 | {\r | |
153 | // Fill efficiency comparison information\r | |
154 | \r | |
155 | AliExternalTrackParam *track = 0;\r | |
156 | //Double_t field = AliTracker::GetBz(); // nominal Bz field [kG]\r | |
157 | Double_t kMaxD = 123456.0; // max distance\r | |
158 | Double_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r | |
159 | AliESDVertex vertexMC; // MC primary vertex\r | |
160 | \r | |
161 | // distance to Prim. vertex \r | |
162 | const Double_t* dv = infoMC->GetVDist(); \r | |
163 | \r | |
164 | Float_t mcpt = infoMC->GetParticle().Pt();\r | |
165 | Float_t mceta = infoMC->GetParticle().Eta();\r | |
166 | Float_t mcphi = infoMC->GetParticle().Phi();\r | |
167 | if(mcphi<0) mcphi += 2.*TMath::Pi();\r | |
168 | \r | |
169 | Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r | |
170 | Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r | |
171 | Bool_t recStatus = kFALSE;\r | |
172 | \r | |
173 | // calculate and set prim. vertex\r | |
174 | vertexMC.SetXv( infoMC->GetParticle().Vx() - dv[0] );\r | |
175 | vertexMC.SetYv( infoMC->GetParticle().Vy() - dv[1] );\r | |
176 | vertexMC.SetZv( infoMC->GetParticle().Vz() - dv[2] );\r | |
177 | \r | |
178 | // Only 5 charged particle species (e,mu,pi,K,p)\r | |
179 | if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r | |
180 | \r | |
181 | // transform Pdg to Pid\r | |
182 | // Pdg convension is different for hadrons and leptons \r | |
183 | // (e.g. K+/K- = 321/-321; e+/e- = -11/11 ) \r | |
184 | Double_t pid = -1;\r | |
185 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0; \r | |
186 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1; \r | |
187 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2; \r | |
188 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r | |
189 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r | |
190 | \r | |
191 | if (infoRC->GetESDtrack() && infoRC->GetESDtrack()->GetTPCInnerParam()) \r | |
192 | {\r | |
193 | if ((track = new AliExternalTrackParam(*infoRC->GetESDtrack()->GetTPCInnerParam())) != 0)\r | |
194 | {\r | |
195 | //Bool_t bDCAStatus = track->PropagateToDCA(&vertexMC,field,kMaxD,dca,cov);\r | |
196 | Double_t field[3]; track->GetBxByBz(field); \r | |
197 | Bool_t bDCAStatus = track->PropagateToDCABxByBz(&vertexMC,field,kMaxD,dca,cov);\r | |
198 | if(bDCAStatus) {\r | |
199 | if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())\r | |
200 | {\r | |
201 | recStatus = kTRUE;\r | |
202 | }\r | |
203 | }\r | |
204 | delete track;\r | |
205 | }\r | |
206 | }\r | |
207 | \r | |
208 | // Fill histograms\r | |
209 | Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r | |
210 | fEffHisto->Fill(vEffHisto);\r | |
211 | }\r | |
212 | \r | |
213 | //_____________________________________________________________________________\r | |
214 | void AliComparisonEff::ProcessTPCITS(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r | |
215 | {\r | |
216 | // Fill efficiency comparison information\r | |
217 | \r | |
218 | Int_t clusterITS[200];\r | |
219 | Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r | |
220 | \r | |
221 | Float_t mcpt = infoMC->GetParticle().Pt();\r | |
222 | Float_t mceta = infoMC->GetParticle().Eta();\r | |
223 | Float_t mcphi = infoMC->GetParticle().Phi();\r | |
224 | if(mcphi<0) mcphi += 2.*TMath::Pi();\r | |
225 | \r | |
226 | // distance to Prim. vertex \r | |
227 | const Double_t* dv = infoMC->GetVDist(); \r | |
228 | \r | |
229 | Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r | |
230 | Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r | |
231 | Bool_t recStatus =kFALSE;\r | |
232 | \r | |
233 | // Only 5 charged particle species (e,mu,pi,K,p)\r | |
234 | if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r | |
235 | \r | |
236 | // transform Pdg to Pid\r | |
237 | // Pdg convension is different for hadrons and leptons \r | |
238 | // (e.g. K+/K- = 321/-321; e+/e- = -11/11 ) \r | |
239 | Double_t pid = -1;\r | |
240 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0; \r | |
241 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1; \r | |
242 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2; \r | |
243 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r | |
244 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r | |
245 | \r | |
246 | if(!infoRC->GetESDtrack()) return;\r | |
247 | if(infoRC->GetESDtrack()->GetITSclusters(clusterITS)>fCutsRC->GetMinNClustersITS())\r | |
248 | {\r | |
249 | infoRC->GetESDtrack()->GetImpactParameters(dca,cov);\r | |
250 | if(TMath::Abs(dca[0]) < fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1]) < fCutsRC->GetMaxDCAToVertexZ()) \r | |
251 | {\r | |
252 | recStatus =(infoRC->GetStatus(1)==3);\r | |
253 | } \r | |
254 | }\r | |
255 | \r | |
256 | // fill histograms\r | |
257 | Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r | |
258 | fEffHisto->Fill(vEffHisto);\r | |
259 | }\r | |
260 | \r | |
261 | //_____________________________________________________________________________\r | |
262 | void AliComparisonEff::ProcessConstrained(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r | |
263 | {\r | |
264 | // Fill efficiency comparison information\r | |
265 | AliExternalTrackParam *track = 0;\r | |
266 | //Double_t field = AliTracker::GetBz(); // nominal Bz field [kG]\r | |
267 | Double_t kMaxD = 123456.0; // max distance\r | |
268 | Double_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r | |
269 | AliESDVertex vertexMC; // MC primary vertex\r | |
270 | \r | |
271 | // distance to Prim. vertex \r | |
272 | const Double_t* dv = infoMC->GetVDist(); \r | |
273 | \r | |
274 | Float_t mcpt = infoMC->GetParticle().Pt();\r | |
275 | Float_t mceta = infoMC->GetParticle().Eta();\r | |
276 | Float_t mcphi = infoMC->GetParticle().Phi();\r | |
277 | if(mcphi<0) mcphi += 2.*TMath::Pi();\r | |
278 | \r | |
279 | Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r | |
280 | Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r | |
281 | Bool_t recStatus = kFALSE;\r | |
282 | \r | |
283 | // calculate and set prim. vertex\r | |
284 | vertexMC.SetXv( infoMC->GetParticle().Vx() - dv[0] );\r | |
285 | vertexMC.SetYv( infoMC->GetParticle().Vy() - dv[1] );\r | |
286 | vertexMC.SetZv( infoMC->GetParticle().Vz() - dv[2] );\r | |
287 | \r | |
288 | // Only 5 charged particle species (e,mu,pi,K,p)\r | |
289 | if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r | |
290 | \r | |
291 | // transform Pdg to Pid\r | |
292 | // Pdg convension is different for hadrons and leptons \r | |
293 | // (e.g. K+/K- = 321/-321; e+/e- = -11/11 ) \r | |
294 | Double_t pid = -1;\r | |
295 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0; \r | |
296 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1; \r | |
297 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2; \r | |
298 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r | |
299 | if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r | |
300 | \r | |
301 | // constrained parameters resolution\r | |
302 | if (!infoRC->GetESDtrack()) return;\r | |
303 | const AliExternalTrackParam * cparam = infoRC->GetESDtrack()->GetConstrainedParam();\r | |
304 | if(!cparam) return;\r | |
305 | \r | |
306 | if ((track = new AliExternalTrackParam(*cparam)) != 0)\r | |
307 | {\r | |
308 | //Bool_t bDCAStatus = track->PropagateToDCA(&vertexMC,field,kMaxD,dca,cov);\r | |
309 | Double_t field[3]; track->GetBxByBz(field); \r | |
310 | Bool_t bDCAStatus = track->PropagateToDCABxByBz(&vertexMC,field,kMaxD,dca,cov);\r | |
311 | if(bDCAStatus) {\r | |
312 | if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())\r | |
313 | {\r | |
314 | recStatus = (infoRC->GetStatus(1)!=3);\r | |
315 | }\r | |
316 | }\r | |
317 | delete track;\r | |
318 | }\r | |
319 | \r | |
320 | // Fill histograms\r | |
321 | Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r | |
322 | fEffHisto->Fill(vEffHisto);\r | |
323 | }\r | |
324 | \r | |
325 | //_____________________________________________________________________________\r | |
326 | void AliComparisonEff::Exec(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r | |
327 | {\r | |
328 | // Process comparison information\r | |
329 | \r | |
330 | if(GetAnalysisMode() == 0) ProcessTPC(infoMC,infoRC);\r | |
331 | else if(GetAnalysisMode() == 1) ProcessTPCITS(infoMC,infoRC);\r | |
332 | else if(GetAnalysisMode() == 2) ProcessConstrained(infoMC,infoRC);\r | |
333 | else {\r | |
334 | printf("ERROR: AnalysisMode %d \n",fAnalysisMode);\r | |
335 | return;\r | |
336 | }\r | |
337 | }\r | |
338 | \r | |
339 | //_____________________________________________________________________________\r | |
340 | Long64_t AliComparisonEff::Merge(TCollection* const list) \r | |
341 | {\r | |
342 | // Merge list of objects (needed by PROOF)\r | |
343 | \r | |
344 | if (!list)\r | |
345 | return 0;\r | |
346 | \r | |
347 | if (list->IsEmpty())\r | |
348 | return 1;\r | |
349 | \r | |
350 | TIterator* iter = list->MakeIterator();\r | |
351 | TObject* obj = 0;\r | |
352 | \r | |
353 | // collection of generated histograms\r | |
354 | \r | |
355 | Int_t count=0;\r | |
356 | while((obj = iter->Next()) != 0) \r | |
357 | {\r | |
358 | AliComparisonEff* entry = dynamic_cast<AliComparisonEff*>(obj);\r | |
359 | if (entry == 0) continue; \r | |
360 | \r | |
361 | fEffHisto->Add(entry->fEffHisto);\r | |
362 | count++;\r | |
363 | }\r | |
364 | \r | |
365 | return count;\r | |
366 | }\r | |
367 | \r | |
368 | //_____________________________________________________________________________\r | |
369 | void AliComparisonEff::Analyse() \r | |
370 | {\r | |
371 | // Analyse comparison information and store output histograms\r | |
372 | // in the folder "folderEff" \r | |
373 | //\r | |
374 | TH1::AddDirectory(kFALSE);\r | |
375 | TObjArray *aFolderObj = new TObjArray;\r | |
376 | \r | |
377 | // efficiency vs pt\r | |
378 | fEffHisto->GetAxis(0)->SetRangeUser(-0.9,0.9); // eta range\r | |
379 | fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // primary tracks\r | |
380 | \r | |
381 | // rec efficiency vs pt\r | |
382 | TH1D *ptAll = fEffHisto->Projection(2);\r | |
383 | \r | |
384 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed \r | |
385 | TH1D *ptRec = fEffHisto->Projection(2);\r | |
386 | ptRec->Divide(ptAll);\r | |
387 | ptRec->SetName("ptRecEff");\r | |
388 | \r | |
389 | aFolderObj->Add(ptRec);\r | |
390 | \r | |
391 | \r | |
392 | // rec efficiency vs pid vs pt\r | |
393 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
394 | fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r | |
395 | TH1D *ptAllPi = fEffHisto->Projection(2);\r | |
396 | \r | |
397 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r | |
398 | TH1D *ptRecPi = fEffHisto->Projection(2);\r | |
399 | ptRecPi->Divide(ptAllPi);\r | |
400 | ptRecPi->SetName("ptRecEffPi");\r | |
401 | \r | |
402 | aFolderObj->Add(ptRecPi);\r | |
403 | \r | |
404 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
405 | fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r | |
406 | TH1D *ptAllK = fEffHisto->Projection(2);\r | |
407 | \r | |
408 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r | |
409 | TH1D *ptRecK = fEffHisto->Projection(2);\r | |
410 | ptRecK->Divide(ptAllK);\r | |
411 | ptRecK->SetName("ptRecEffK");\r | |
412 | \r | |
413 | aFolderObj->Add(ptRecK);\r | |
414 | \r | |
415 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
416 | fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r | |
417 | TH1D *ptAllP = fEffHisto->Projection(2);\r | |
418 | \r | |
419 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r | |
420 | TH1D *ptRecP = fEffHisto->Projection(2);\r | |
421 | ptRecP->Divide(ptAllP);\r | |
422 | ptRecP->SetName("ptRecEffP");\r | |
423 | \r | |
424 | aFolderObj->Add(ptRecP);\r | |
425 | \r | |
426 | // findable efficiency \r | |
427 | fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r | |
428 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
429 | fEffHisto->GetAxis(6)->SetRangeUser(1.,1.); // findable\r | |
430 | TH1D *ptAllF = fEffHisto->Projection(2);\r | |
431 | \r | |
432 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r | |
433 | fEffHisto->GetAxis(6)->SetRangeUser(1.,1.);\r | |
434 | TH1D *ptRecF = fEffHisto->Projection(2); // rec findable\r | |
435 | ptRecF->Divide(ptAllF);\r | |
436 | ptRecF->SetName("ptRecFindableEff");\r | |
437 | \r | |
438 | aFolderObj->Add(ptRecF);\r | |
439 | \r | |
440 | //\r | |
441 | // efficiency vs eta\r | |
442 | //\r | |
443 | \r | |
444 | fEffHisto->GetAxis(0)->SetRangeUser(-1.5,1.5); // eta range\r | |
445 | fEffHisto->GetAxis(2)->SetRangeUser(0.2,10.); // pt range\r | |
446 | fEffHisto->GetAxis(4)->SetRangeUser(1.,1.); // primary tracks\r | |
447 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); // all\r | |
448 | fEffHisto->GetAxis(6)->SetRangeUser(0.,1.); // all\r | |
449 | \r | |
450 | // rec efficiency vs eta\r | |
451 | TH1D *etaAll = fEffHisto->Projection(0);\r | |
452 | \r | |
453 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed \r | |
454 | TH1D *etaRec = fEffHisto->Projection(0);\r | |
455 | etaRec->Divide(etaAll);\r | |
456 | etaRec->SetName("etaRecEff");\r | |
457 | \r | |
458 | aFolderObj->Add(etaRec);\r | |
459 | \r | |
460 | // rec efficiency vs pid vs eta\r | |
461 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
462 | fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r | |
463 | TH1D *etaAllPi = fEffHisto->Projection(0);\r | |
464 | \r | |
465 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r | |
466 | TH1D *etaRecPi = fEffHisto->Projection(0);\r | |
467 | etaRecPi->Divide(etaAllPi);\r | |
468 | etaRecPi->SetName("etaRecEffPi");\r | |
469 | \r | |
470 | aFolderObj->Add(etaRecPi);\r | |
471 | \r | |
472 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
473 | fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r | |
474 | TH1D *etaAllK = fEffHisto->Projection(0);\r | |
475 | \r | |
476 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r | |
477 | TH1D *etaRecK = fEffHisto->Projection(0);\r | |
478 | etaRecK->Divide(etaAllK);\r | |
479 | etaRecK->SetName("etaRecEffK");\r | |
480 | \r | |
481 | aFolderObj->Add(etaRecK);\r | |
482 | \r | |
483 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
484 | fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r | |
485 | TH1D *etaAllP = fEffHisto->Projection(0);\r | |
486 | \r | |
487 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r | |
488 | TH1D *etaRecP = fEffHisto->Projection(0);\r | |
489 | etaRecP->Divide(etaAllP);\r | |
490 | etaRecP->SetName("etaRecEffP");\r | |
491 | \r | |
492 | aFolderObj->Add(etaRecP);\r | |
493 | \r | |
494 | //\r | |
495 | // findable efficiency \r | |
496 | //\r | |
497 | fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r | |
498 | fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r | |
499 | fEffHisto->GetAxis(6)->SetRangeUser(1.,1.); // findable\r | |
500 | TH1D *etaAllF = fEffHisto->Projection(0);\r | |
501 | \r | |
502 | fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r | |
503 | fEffHisto->GetAxis(6)->SetRangeUser(1.,1.);\r | |
504 | TH1D *etaRecF = fEffHisto->Projection(0); // rec findable\r | |
505 | etaRecF->Divide(etaAllF);\r | |
506 | etaRecF->SetName("etaRecFindableEff");\r | |
507 | \r | |
508 | aFolderObj->Add(etaRecF);\r | |
509 | \r | |
510 | // export objects to analysis folder\r | |
511 | fAnalysisFolder = ExportToFolder(aFolderObj);\r | |
512 | \r | |
513 | // delete only TObjArray\r | |
514 | if(aFolderObj) delete aFolderObj;\r | |
515 | }\r | |
516 | \r | |
517 | //_____________________________________________________________________________\r | |
518 | TFolder* AliComparisonEff::ExportToFolder(TObjArray * array) \r | |
519 | {\r | |
520 | // recreate folder avery time and export objects to new one\r | |
521 | //\r | |
522 | AliComparisonEff * comp=this;\r | |
523 | TFolder *folder = comp->GetAnalysisFolder();\r | |
524 | \r | |
525 | TString name, title;\r | |
526 | TFolder *newFolder = 0;\r | |
527 | Int_t i = 0;\r | |
528 | Int_t size = array->GetSize();\r | |
529 | \r | |
530 | if(folder) { \r | |
531 | // get name and title from old folder\r | |
532 | name = folder->GetName(); \r | |
533 | title = folder->GetTitle(); \r | |
534 | \r | |
535 | // delete old one\r | |
536 | delete folder;\r | |
537 | \r | |
538 | // create new one\r | |
539 | newFolder = CreateFolder(name.Data(),title.Data());\r | |
540 | newFolder->SetOwner();\r | |
541 | \r | |
542 | // add objects to folder\r | |
543 | while(i < size) {\r | |
544 | newFolder->Add(array->At(i));\r | |
545 | i++;\r | |
546 | }\r | |
547 | }\r | |
548 | \r | |
549 | return newFolder;\r | |
550 | }\r | |
551 | \r | |
552 | \r | |
553 | //_____________________________________________________________________________\r | |
554 | TFolder* AliComparisonEff::CreateFolder(TString name,TString title) { \r | |
555 | // create folder for analysed histograms\r | |
556 | //\r | |
557 | TFolder *folder = 0;\r | |
558 | folder = new TFolder(name.Data(),title.Data());\r | |
559 | \r | |
560 | return folder;\r | |
561 | }\r |