]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/TPC/AliComparisonEff.cxx
Fix for coverity
[u/mrichter/AliRoot.git] / PWG1 / TPC / AliComparisonEff.cxx
CommitLineData
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
51using namespace std;\r
52\r
53ClassImp(AliComparisonEff)\r
54\r
55//_____________________________________________________________________________\r
56AliComparisonEff::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
74AliComparisonEff::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
97AliComparisonEff::~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
110void 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
151void 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
214void 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
262void 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
326void 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
340Long64_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
365return count;\r
366}\r
367 \r
368//_____________________________________________________________________________\r
369void 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
518TFolder* 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
549return newFolder;\r
550}\r
551\r
552\r
553//_____________________________________________________________________________\r
554TFolder* AliComparisonEff::CreateFolder(TString name,TString title) { \r
555// create folder for analysed histograms\r
556//\r
557TFolder *folder = 0;\r
558 folder = new TFolder(name.Data(),title.Data());\r
559\r
560 return folder;\r
561}\r