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