]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/TPC/AliComparisonEff.cxx
move all TPC related classes
[u/mrichter/AliRoot.git] / PWG1 / TPC / 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,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