]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/AliComparisonEff.cxx
PreReading of MC information on demand.
[u/mrichter/AliRoot.git] / PWG1 / AliComparisonEff.cxx
CommitLineData
6d1c79ca 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
3baa4bfd 7// the analysis (histograms/graphs) are stored in the folder which is \r
8// a data member of AliComparisonEff.\r
9// \r
6d1c79ca 10// Author: J.Otwinowski 04/02/2008 \r
11//------------------------------------------------------------------------------\r
12\r
13/*\r
3baa4bfd 14 \r
15 // after running comparison task, read the file, and get component\r
b4126c69 16 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");\r
17 LoadMyLibs();\r
6d1c79ca 18 TFile f("Output.root");\r
35771050 19 //AliComparisonEff * compObj = (AliComparisonEff*)f.Get("AliComparisonEff");\r
20 AliComparisonEff * compObj = (AliComparisonEff*)cOutput->FindObject("AliComparisonEff");\r
6d1c79ca 21\r
b4126c69 22 // Analyse comparison data\r
3baa4bfd 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
6d1c79ca 33\r
6d1c79ca 34*/\r
35\r
7b392278 36#include <TAxis.h>\r
37#include <TH1D.h>\r
38\r
6d1c79ca 39// \r
71a14197 40#include "AliESDtrack.h"\r
6d1c79ca 41#include "AliRecInfoCuts.h" \r
42#include "AliMCInfoCuts.h" \r
43#include "AliLog.h" \r
6d1c79ca 44#include "AliESDVertex.h" \r
45#include "AliExternalTrackParam.h" \r
46#include "AliTracker.h" \r
6d1c79ca 47#include "AliMCInfo.h" \r
48#include "AliESDRecInfo.h" \r
49#include "AliComparisonEff.h" \r
50\r
51using namespace std;\r
52\r
6d1c79ca 53ClassImp(AliComparisonEff)\r
54\r
55//_____________________________________________________________________________\r
56AliComparisonEff::AliComparisonEff():\r
3baa4bfd 57 AliComparisonObject("AliComparisonEff"),\r
6d1c79ca 58\r
59 // histograms\r
60 \r
71a14197 61 fEffHisto(0),\r
6d1c79ca 62\r
63 // Cuts \r
64 fCutsRC(0), \r
65 fCutsMC(0),\r
66\r
3baa4bfd 67 // histogram folder \r
68 fAnalysisFolder(0)\r
6d1c79ca 69{\r
71a14197 70 // default consttructor \r
71}\r
6d1c79ca 72\r
71a14197 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
6d1c79ca 76\r
71a14197 77 // histograms\r
78 fEffHisto(0),\r
6d1c79ca 79\r
71a14197 80 // Cuts \r
81 fCutsRC(0), \r
82 fCutsMC(0),\r
6d1c79ca 83\r
71a14197 84 // histogram folder \r
85 fAnalysisFolder(0)\r
86{\r
87 // named constructor\r
88 //\r
89 SetAnalysisMode(analysisMode);\r
90 SetHptGenerator(hptGenerator);\r
b4126c69 91\r
3baa4bfd 92 Init();\r
6d1c79ca 93}\r
94\r
6d1c79ca 95\r
71a14197 96//_____________________________________________________________________________\r
97AliComparisonEff::~AliComparisonEff()\r
98{\r
99// destructor\r
6d1c79ca 100\r
71a14197 101 if(fEffHisto) delete fEffHisto; fEffHisto=0;\r
6d1c79ca 102\r
71a14197 103 if(fCutsRC) delete fCutsRC; fCutsRC=0;\r
104 if(fCutsMC) delete fCutsMC; fCutsMC=0;\r
3baa4bfd 105\r
106 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;\r
6d1c79ca 107}\r
108\r
109//_____________________________________________________________________________\r
71a14197 110void AliComparisonEff::Init()\r
111{\r
6d1c79ca 112 // Init histograms\r
113 //\r
71a14197 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
6d1c79ca 117\r
71a14197 118 if(IsHptGenerator() == kTRUE) {\r
119 nPtBins = 100;\r
120 ptMin = 0.; ptMax = 100.;\r
121 }\r
6d1c79ca 122\r
71a14197 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
6d1c79ca 127\r
71a14197 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
6d1c79ca 130\r
71a14197 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
6d1c79ca 139\r
3baa4bfd 140 // init cuts\r
6d1c79ca 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
3baa4bfd 145\r
146 // init folder\r
147 fAnalysisFolder = CreateFolder("folderEff","Analysis Efficiency Folder");\r
6d1c79ca 148}\r
149\r
150//_____________________________________________________________________________\r
71a14197 151void AliComparisonEff::ProcessTPC(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
6d1c79ca 152{\r
153 // Fill efficiency comparison information\r
71a14197 154\r
6d1c79ca 155 AliExternalTrackParam *track = 0;\r
ff0f1307 156 //Double_t field = AliTracker::GetBz(); // nominal Bz field [kG]\r
6d1c79ca 157 Double_t kMaxD = 123456.0; // max distance\r
6d1c79ca 158 Double_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z\r
71a14197 159 AliESDVertex vertexMC; // MC primary vertex\r
6d1c79ca 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
71a14197 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
6d1c79ca 169 Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();\r
71a14197 170 Bool_t findable = (infoMC->GetRowsWithDigits()>fCutsMC->GetMinRowsWithDigits());\r
171 Bool_t recStatus = kFALSE;\r
6d1c79ca 172 \r
173 // calculate and set prim. vertex\r
71a14197 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
6d1c79ca 177 \r
71a14197 178 // Only 5 charged particle species (e,mu,pi,K,p)\r
6d1c79ca 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
71a14197 191 if (infoRC->GetESDtrack() && infoRC->GetESDtrack()->GetTPCInnerParam()) \r
6d1c79ca 192 {\r
71a14197 193 if ((track = new AliExternalTrackParam(*infoRC->GetESDtrack()->GetTPCInnerParam())) != 0)\r
6d1c79ca 194 {\r
ff0f1307 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
71a14197 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
6d1c79ca 232 \r
71a14197 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
6d1c79ca 254 }\r
255\r
71a14197 256 // fill histograms\r
257 Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
258 fEffHisto->Fill(vEffHisto);\r
259}\r
6d1c79ca 260\r
71a14197 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
ff0f1307 266 //Double_t field = AliTracker::GetBz(); // nominal Bz field [kG]\r
71a14197 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
6d1c79ca 270\r
71a14197 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
35771050 287 \r
71a14197 288 // Only 5 charged particle species (e,mu,pi,K,p)\r
289 if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return; \r
6d1c79ca 290\r
71a14197 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
35771050 300\r
71a14197 301 // constrained parameters resolution\r
302 if (!infoRC->GetESDtrack()) return;\r
303 const AliExternalTrackParam * cparam = infoRC->GetESDtrack()->GetConstrainedParam();\r
304 if(!cparam) return;\r
6d1c79ca 305\r
71a14197 306 if ((track = new AliExternalTrackParam(*cparam)) != 0)\r
307 {\r
ff0f1307 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
71a14197 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
6d1c79ca 318 }\r
71a14197 319\r
320 // Fill histograms\r
321 Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable }; \r
322 fEffHisto->Fill(vEffHisto);\r
6d1c79ca 323}\r
324\r
325//_____________________________________________________________________________\r
71a14197 326void AliComparisonEff::Exec(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)\r
6d1c79ca 327{\r
328 // Process comparison information\r
71a14197 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
6d1c79ca 337}\r
338\r
339//_____________________________________________________________________________\r
71a14197 340Long64_t AliComparisonEff::Merge(TCollection* const list) \r
6d1c79ca 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
3baa4bfd 359 if (entry == 0) continue; \r
6d1c79ca 360 \r
71a14197 361 fEffHisto->Add(entry->fEffHisto);\r
6d1c79ca 362 count++;\r
363 }\r
364\r
365return count;\r
366}\r
367 \r
368//_____________________________________________________________________________\r
369void AliComparisonEff::Analyse() \r
370{\r
3baa4bfd 371 // Analyse comparison information and store output histograms\r
372 // in the folder "folderEff" \r
373 //\r
3baa4bfd 374 TH1::AddDirectory(kFALSE);\r
b4126c69 375 TObjArray *aFolderObj = new TObjArray;\r
6d1c79ca 376\r
71a14197 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
6d1c79ca 380\r
71a14197 381 // rec efficiency vs pt\r
382 TH1D *ptAll = fEffHisto->Projection(2);\r
6d1c79ca 383\r
71a14197 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
6d1c79ca 388\r
71a14197 389 aFolderObj->Add(ptRec);\r
6d1c79ca 390\r
6d1c79ca 391\r
71a14197 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
6d1c79ca 396\r
71a14197 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
6d1c79ca 401\r
71a14197 402 aFolderObj->Add(ptRecPi);\r
6d1c79ca 403\r
71a14197 404 fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
405 fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
406 TH1D *ptAllK = fEffHisto->Projection(2);\r
6d1c79ca 407\r
71a14197 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
6d1c79ca 412\r
71a14197 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
6d1c79ca 418\r
71a14197 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
6d1c79ca 439\r
6d1c79ca 440 //\r
71a14197 441 // efficiency vs eta\r
6d1c79ca 442 //\r
6d1c79ca 443\r
71a14197 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
b4126c69 449\r
71a14197 450 // rec efficiency vs eta\r
451 TH1D *etaAll = fEffHisto->Projection(0);\r
b4126c69 452\r
71a14197 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
3baa4bfd 457\r
71a14197 458 aFolderObj->Add(etaRec);\r
6d1c79ca 459\r
71a14197 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
6d1c79ca 464\r
71a14197 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
b4126c69 469\r
71a14197 470 aFolderObj->Add(etaRecPi);\r
3baa4bfd 471\r
71a14197 472 fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
473 fEffHisto->GetAxis(3)->SetRangeUser(3.,3.); // kaons\r
474 TH1D *etaAllK = fEffHisto->Projection(0);\r
6d1c79ca 475\r
71a14197 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
6d1c79ca 480\r
71a14197 481 aFolderObj->Add(etaRecK);\r
b4126c69 482\r
71a14197 483 fEffHisto->GetAxis(5)->SetRangeUser(0.,1.); \r
484 fEffHisto->GetAxis(3)->SetRangeUser(4.,4.); // protons\r
485 TH1D *etaAllP = fEffHisto->Projection(0);\r
3baa4bfd 486\r
71a14197 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
6d1c79ca 509\r
b4126c69 510 // export objects to analysis folder\r
511 fAnalysisFolder = ExportToFolder(aFolderObj);\r
3baa4bfd 512\r
b4126c69 513 // delete only TObjArray\r
514 if(aFolderObj) delete aFolderObj;\r
3baa4bfd 515}\r
516\r
b4126c69 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
3baa4bfd 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
6d1c79ca 561}\r