]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/AliComparisonEff.cxx
Moving the old macros to new directory
[u/mrichter/AliRoot.git] / PWG1 / AliComparisonEff.cxx
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,144,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       if(bDCAStatus) {\r
197         if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())\r
198         {\r
199           recStatus = kTRUE;\r
200         }\r
201       }\r
202     delete track;\r
203     }\r
204   }\r
205 \r
206   // Fill histograms\r
207   Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
208   fEffHisto->Fill(vEffHisto);\r
209 }\r
210 \r
211 //_____________________________________________________________________________\r
212 void AliComparisonEff::ProcessTPCITS(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
213 {\r
214   // Fill efficiency comparison information\r
215  \r
216   Int_t clusterITS[200];\r
217   Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r
218 \r
219   Float_t mcpt = infoMC->GetParticle().Pt();\r
220   Float_t mceta = infoMC->GetParticle().Eta();\r
221   Float_t mcphi = infoMC->GetParticle().Phi();\r
222   if(mcphi<0) mcphi += 2.*TMath::Pi();\r
223 \r
224   // distance to Prim. vertex \r
225   const Double_t* dv = infoMC->GetVDist(); \r
226 \r
227   Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r
228   Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
229   Bool_t recStatus =kFALSE;\r
230  \r
231   // Only 5 charged particle species (e,mu,pi,K,p)\r
232   if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r
233 \r
234   // transform Pdg to Pid\r
235   // Pdg convension is different for hadrons and leptons \r
236   // (e.g. K+/K- = 321/-321; e+/e- = -11/11 ) \r
237   Double_t pid = -1;\r
238   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0; \r
239   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1; \r
240   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2; \r
241   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r
242   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r
243 \r
244   if(!infoRC->GetESDtrack()) return;\r
245   if(infoRC->GetESDtrack()->GetITSclusters(clusterITS)>fCutsRC->GetMinNClustersITS())\r
246   {\r
247     infoRC->GetESDtrack()->GetImpactParameters(dca,cov);\r
248     if(TMath::Abs(dca[0]) < fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1]) < fCutsRC->GetMaxDCAToVertexZ()) \r
249     {\r
250        recStatus =(infoRC->GetStatus(1)==3);\r
251     } \r
252   }\r
253 \r
254   // fill histograms\r
255   Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
256   fEffHisto->Fill(vEffHisto);\r
257 }\r
258 \r
259 //_____________________________________________________________________________\r
260 void AliComparisonEff::ProcessConstrained(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
261 {\r
262   // Fill efficiency comparison information\r
263   AliExternalTrackParam *track = 0;\r
264   Double_t field      = AliTracker::GetBz(); // nominal Bz field [kG]\r
265   Double_t kMaxD      = 123456.0; // max distance\r
266   Double_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r
267   AliESDVertex vertexMC;  // MC primary vertex\r
268 \r
269   // distance to Prim. vertex \r
270   const Double_t* dv = infoMC->GetVDist(); \r
271 \r
272   Float_t mcpt = infoMC->GetParticle().Pt();\r
273   Float_t mceta = infoMC->GetParticle().Eta();\r
274   Float_t mcphi = infoMC->GetParticle().Phi();\r
275   if(mcphi<0) mcphi += 2.*TMath::Pi();\r
276 \r
277   Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r
278   Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
279   Bool_t recStatus = kFALSE;\r
280  \r
281   // calculate and set prim. vertex\r
282   vertexMC.SetXv( infoMC->GetParticle().Vx() - dv[0] );\r
283   vertexMC.SetYv( infoMC->GetParticle().Vy() - dv[1] );\r
284   vertexMC.SetZv( infoMC->GetParticle().Vz() - dv[2] );\r
285   \r
286   // Only 5 charged particle species (e,mu,pi,K,p)\r
287   if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r
288 \r
289   // transform Pdg to Pid\r
290   // Pdg convension is different for hadrons and leptons \r
291   // (e.g. K+/K- = 321/-321; e+/e- = -11/11 ) \r
292   Double_t pid = -1;\r
293   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0; \r
294   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1; \r
295   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2; \r
296   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3; \r
297   if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4; \r
298 \r
299   // constrained parameters resolution\r
300   if (!infoRC->GetESDtrack()) return;\r
301   const AliExternalTrackParam * cparam = infoRC->GetESDtrack()->GetConstrainedParam();\r
302   if(!cparam) return;\r
303 \r
304   if ((track = new AliExternalTrackParam(*cparam)) != 0)\r
305   {\r
306     Bool_t bDCAStatus = track->PropagateToDCA(&vertexMC,field,kMaxD,dca,cov);\r
307     if(bDCAStatus) {\r
308       if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())\r
309       {\r
310         recStatus =  (infoRC->GetStatus(1)!=3);\r
311       }\r
312     }\r
313   delete track;\r
314   }\r
315 \r
316   // Fill histograms\r
317   Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
318   fEffHisto->Fill(vEffHisto);\r
319 }\r
320 \r
321 //_____________________________________________________________________________\r
322 void AliComparisonEff::Exec(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
323 {\r
324   // Process comparison information\r
325 \r
326   if(GetAnalysisMode() == 0) ProcessTPC(infoMC,infoRC);\r
327   else if(GetAnalysisMode() == 1) ProcessTPCITS(infoMC,infoRC);\r
328   else if(GetAnalysisMode() == 2) ProcessConstrained(infoMC,infoRC);\r
329   else {\r
330     printf("ERROR: AnalysisMode %d \n",fAnalysisMode);\r
331     return;\r
332   }\r
333 }\r
334 \r
335 //_____________________________________________________________________________\r
336 Long64_t AliComparisonEff::Merge(TCollection* const list) \r
337 {\r
338   // Merge list of objects (needed by PROOF)\r
339 \r
340   if (!list)\r
341   return 0;\r
342 \r
343   if (list->IsEmpty())\r
344   return 1;\r
345 \r
346   TIterator* iter = list->MakeIterator();\r
347   TObject* obj = 0;\r
348 \r
349   // collection of generated histograms\r
350 \r
351   Int_t count=0;\r
352   while((obj = iter->Next()) != 0) \r
353   {\r
354     AliComparisonEff* entry = dynamic_cast<AliComparisonEff*>(obj);\r
355     if (entry == 0) continue; \r
356   \r
357      fEffHisto->Add(entry->fEffHisto);\r
358   count++;\r
359   }\r
360 \r
361 return count;\r
362 }\r
363  \r
364 //_____________________________________________________________________________\r
365 void AliComparisonEff::Analyse() \r
366 {\r
367   // Analyse comparison information and store output histograms\r
368   // in the folder "folderEff" \r
369   //\r
370   TH1::AddDirectory(kFALSE);\r
371   TObjArray *aFolderObj = new TObjArray;\r
372 \r
373   // efficiency vs pt\r
374   fEffHisto->GetAxis(0)->SetRangeUser(-0.9,0.9); // eta range\r
375   fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);    // primary tracks\r
376 \r
377   // rec efficiency vs pt\r
378   TH1D *ptAll = fEffHisto->Projection(2);\r
379 \r
380   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);  // reconstructed \r
381   TH1D *ptRec = fEffHisto->Projection(2);\r
382   ptRec->Divide(ptAll);\r
383   ptRec->SetName("ptRecEff");\r
384 \r
385   aFolderObj->Add(ptRec);\r
386 \r
387 \r
388   // rec efficiency vs pid vs pt\r
389   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
390   fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r
391   TH1D *ptAllPi = fEffHisto->Projection(2);\r
392 \r
393   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
394   TH1D *ptRecPi = fEffHisto->Projection(2);\r
395   ptRecPi->Divide(ptAllPi);\r
396   ptRecPi->SetName("ptRecEffPi");\r
397 \r
398   aFolderObj->Add(ptRecPi);\r
399 \r
400   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
401   fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
402   TH1D *ptAllK = fEffHisto->Projection(2);\r
403 \r
404   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
405   TH1D *ptRecK = fEffHisto->Projection(2);\r
406   ptRecK->Divide(ptAllK);\r
407   ptRecK->SetName("ptRecEffK");\r
408 \r
409   aFolderObj->Add(ptRecK);\r
410 \r
411   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
412   fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
413   TH1D *ptAllP = fEffHisto->Projection(2);\r
414 \r
415   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
416   TH1D *ptRecP = fEffHisto->Projection(2);\r
417   ptRecP->Divide(ptAllP);\r
418   ptRecP->SetName("ptRecEffP");\r
419 \r
420   aFolderObj->Add(ptRecP);\r
421   \r
422   // findable efficiency \r
423   fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r
424   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
425   fEffHisto->GetAxis(6)->SetRangeUser(1.,1.); // findable\r
426   TH1D *ptAllF = fEffHisto->Projection(2);\r
427 \r
428   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r
429   fEffHisto->GetAxis(6)->SetRangeUser(1.,1.);\r
430   TH1D *ptRecF = fEffHisto->Projection(2); // rec findable\r
431   ptRecF->Divide(ptAllF);\r
432   ptRecF->SetName("ptRecFindableEff");\r
433 \r
434   aFolderObj->Add(ptRecF);\r
435 \r
436   //\r
437   // efficiency vs eta\r
438   //\r
439 \r
440   fEffHisto->GetAxis(0)->SetRangeUser(-1.5,1.5); // eta range\r
441   fEffHisto->GetAxis(2)->SetRangeUser(0.2,10.); // pt range\r
442   fEffHisto->GetAxis(4)->SetRangeUser(1.,1.);   // primary tracks\r
443   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.);   // all\r
444   fEffHisto->GetAxis(6)->SetRangeUser(0.,1.);   // all\r
445 \r
446   // rec efficiency vs eta\r
447   TH1D *etaAll = fEffHisto->Projection(0);\r
448 \r
449   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);  // reconstructed \r
450   TH1D *etaRec = fEffHisto->Projection(0);\r
451   etaRec->Divide(etaAll);\r
452   etaRec->SetName("etaRecEff");\r
453 \r
454   aFolderObj->Add(etaRec);\r
455 \r
456   // rec efficiency vs pid vs eta\r
457   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
458   fEffHisto->GetAxis(3)->SetRangeUser(2.,2.); // pions\r
459   TH1D *etaAllPi = fEffHisto->Projection(0);\r
460 \r
461   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
462   TH1D *etaRecPi = fEffHisto->Projection(0);\r
463   etaRecPi->Divide(etaAllPi);\r
464   etaRecPi->SetName("etaRecEffPi");\r
465 \r
466   aFolderObj->Add(etaRecPi);\r
467 \r
468   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
469   fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
470   TH1D *etaAllK = fEffHisto->Projection(0);\r
471 \r
472   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
473   TH1D *etaRecK = fEffHisto->Projection(0);\r
474   etaRecK->Divide(etaAllK);\r
475   etaRecK->SetName("etaRecEffK");\r
476 \r
477   aFolderObj->Add(etaRecK);\r
478 \r
479   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
480   fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
481   TH1D *etaAllP = fEffHisto->Projection(0);\r
482 \r
483   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.); // reconstructed\r
484   TH1D *etaRecP = fEffHisto->Projection(0);\r
485   etaRecP->Divide(etaAllP);\r
486   etaRecP->SetName("etaRecEffP");\r
487 \r
488   aFolderObj->Add(etaRecP);\r
489   \r
490   //\r
491   // findable efficiency \r
492   //\r
493   fEffHisto->GetAxis(3)->SetRangeUser(0.,4.); \r
494   fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
495   fEffHisto->GetAxis(6)->SetRangeUser(1.,1.); // findable\r
496   TH1D *etaAllF = fEffHisto->Projection(0);\r
497 \r
498   fEffHisto->GetAxis(5)->SetRangeUser(1.,1.);\r
499   fEffHisto->GetAxis(6)->SetRangeUser(1.,1.);\r
500   TH1D *etaRecF = fEffHisto->Projection(0);   // rec findable\r
501   etaRecF->Divide(etaAllF);\r
502   etaRecF->SetName("etaRecFindableEff");\r
503 \r
504   aFolderObj->Add(etaRecF);\r
505 \r
506   // export objects to analysis folder\r
507   fAnalysisFolder = ExportToFolder(aFolderObj);\r
508 \r
509   // delete only TObjArray\r
510   if(aFolderObj) delete aFolderObj;\r
511 }\r
512 \r
513 //_____________________________________________________________________________\r
514 TFolder* AliComparisonEff::ExportToFolder(TObjArray * array) \r
515 {\r
516   // recreate folder avery time and export objects to new one\r
517   //\r
518   AliComparisonEff * comp=this;\r
519   TFolder *folder = comp->GetAnalysisFolder();\r
520 \r
521   TString name, title;\r
522   TFolder *newFolder = 0;\r
523   Int_t i = 0;\r
524   Int_t size = array->GetSize();\r
525 \r
526   if(folder) { \r
527      // get name and title from old folder\r
528      name = folder->GetName();  \r
529      title = folder->GetTitle();  \r
530 \r
531          // delete old one\r
532      delete folder;\r
533 \r
534          // create new one\r
535      newFolder = CreateFolder(name.Data(),title.Data());\r
536      newFolder->SetOwner();\r
537 \r
538          // add objects to folder\r
539      while(i < size) {\r
540            newFolder->Add(array->At(i));\r
541            i++;\r
542          }\r
543   }\r
544 \r
545 return newFolder;\r
546 }\r
547 \r
548 \r
549 //_____________________________________________________________________________\r
550 TFolder* AliComparisonEff::CreateFolder(TString name,TString title) { \r
551 // create folder for analysed histograms\r
552 //\r
553 TFolder *folder = 0;\r
554   folder = new TFolder(name.Data(),title.Data());\r
555 \r
556   return folder;\r
557 }\r