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
10 // Author: J.Otwinowski 04/02/2008
\r
11 //------------------------------------------------------------------------------
\r
15 // after running comparison task, read the file, and get component
\r
16 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
\r
18 TFile f("Output.root");
\r
19 //AliComparisonEff * compObj = (AliComparisonEff*)f.Get("AliComparisonEff");
\r
20 AliComparisonEff * compObj = (AliComparisonEff*)cOutput->FindObject("AliComparisonEff");
\r
22 // Analyse comparison data
\r
25 // the output histograms/graphs will be stored in the folder "folderEff"
\r
26 compObj->GetAnalysisFolder()->ls("*");
\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
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
51 using namespace std;
\r
53 ClassImp(AliComparisonEff)
\r
55 //_____________________________________________________________________________
\r
56 AliComparisonEff::AliComparisonEff():
\r
57 AliComparisonObject("AliComparisonEff"),
\r
67 // histogram folder
\r
70 // default consttructor
\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
84 // histogram folder
\r
87 // named constructor
\r
89 SetAnalysisMode(analysisMode);
\r
90 SetHptGenerator(hptGenerator);
\r
96 //_____________________________________________________________________________
\r
97 AliComparisonEff::~AliComparisonEff()
\r
101 if(fEffHisto) delete fEffHisto; fEffHisto=0;
\r
103 if(fCutsRC) delete fCutsRC; fCutsRC=0;
\r
104 if(fCutsMC) delete fCutsMC; fCutsMC=0;
\r
106 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
\r
109 //_____________________________________________________________________________
\r
110 void AliComparisonEff::Init()
\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
118 if(IsHptGenerator() == kTRUE) {
\r
120 ptMin = 0.; ptMax = 100.;
\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
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
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
142 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
\r
144 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
\r
147 fAnalysisFolder = CreateFolder("folderEff","Analysis Efficiency Folder");
\r
150 //_____________________________________________________________________________
\r
151 void AliComparisonEff::ProcessTPC(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)
\r
153 // Fill efficiency comparison information
\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
161 // distance to Prim. vertex
\r
162 const Double_t* dv = infoMC->GetVDist();
\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
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
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
178 // Only 5 charged particle species (e,mu,pi,K,p)
\r
179 if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return;
\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
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
191 if (infoRC->GetESDtrack() && infoRC->GetESDtrack()->GetTPCInnerParam())
\r
193 if ((track = new AliExternalTrackParam(*infoRC->GetESDtrack()->GetTPCInnerParam())) != 0)
\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
199 if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())
\r
209 Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable };
\r
210 fEffHisto->Fill(vEffHisto);
\r
213 //_____________________________________________________________________________
\r
214 void AliComparisonEff::ProcessTPCITS(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)
\r
216 // Fill efficiency comparison information
\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
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
226 // distance to Prim. vertex
\r
227 const Double_t* dv = infoMC->GetVDist();
\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
233 // Only 5 charged particle species (e,mu,pi,K,p)
\r
234 if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return;
\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
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
246 if(!infoRC->GetESDtrack()) return;
\r
247 if(infoRC->GetESDtrack()->GetITSclusters(clusterITS)>fCutsRC->GetMinNClustersITS())
\r
249 infoRC->GetESDtrack()->GetImpactParameters(dca,cov);
\r
250 if(TMath::Abs(dca[0]) < fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1]) < fCutsRC->GetMaxDCAToVertexZ())
\r
252 recStatus =(infoRC->GetStatus(1)==3);
\r
257 Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable };
\r
258 fEffHisto->Fill(vEffHisto);
\r
261 //_____________________________________________________________________________
\r
262 void AliComparisonEff::ProcessConstrained(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)
\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
271 // distance to Prim. vertex
\r
272 const Double_t* dv = infoMC->GetVDist();
\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
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
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
288 // Only 5 charged particle species (e,mu,pi,K,p)
\r
289 if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return;
\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
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
301 // constrained parameters resolution
\r
302 if (!infoRC->GetESDtrack()) return;
\r
303 const AliExternalTrackParam * cparam = infoRC->GetESDtrack()->GetConstrainedParam();
\r
304 if(!cparam) return;
\r
306 if ((track = new AliExternalTrackParam(*cparam)) != 0)
\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
312 if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ())
\r
314 recStatus = (infoRC->GetStatus(1)!=3);
\r
321 Double_t vEffHisto[7] = { mceta, mcphi, mcpt, pid, isPrim, recStatus, findable };
\r
322 fEffHisto->Fill(vEffHisto);
\r
325 //_____________________________________________________________________________
\r
326 void AliComparisonEff::Exec(AliMCInfo* const infoMC, AliESDRecInfo* const infoRC)
\r
328 // Process comparison information
\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
334 printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
\r
339 //_____________________________________________________________________________
\r
340 Long64_t AliComparisonEff::Merge(TCollection* const list)
\r
342 // Merge list of objects (needed by PROOF)
\r
347 if (list->IsEmpty())
\r
350 TIterator* iter = list->MakeIterator();
\r
353 // collection of generated histograms
\r
356 while((obj = iter->Next()) != 0)
\r
358 AliComparisonEff* entry = dynamic_cast<AliComparisonEff*>(obj);
\r
359 if (entry == 0) continue;
\r
361 fEffHisto->Add(entry->fEffHisto);
\r
368 //_____________________________________________________________________________
\r
369 void AliComparisonEff::Analyse()
\r
371 // Analyse comparison information and store output histograms
\r
372 // in the folder "folderEff"
\r
374 TH1::AddDirectory(kFALSE);
\r
375 TObjArray *aFolderObj = new TObjArray;
\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
381 // rec efficiency vs pt
\r
382 TH1D *ptAll = fEffHisto->Projection(2);
\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
389 aFolderObj->Add(ptRec);
\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
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
402 aFolderObj->Add(ptRecPi);
\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
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
413 aFolderObj->Add(ptRecK);
\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
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
424 aFolderObj->Add(ptRecP);
\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
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
438 aFolderObj->Add(ptRecF);
\r
441 // efficiency vs eta
\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
450 // rec efficiency vs eta
\r
451 TH1D *etaAll = fEffHisto->Projection(0);
\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
458 aFolderObj->Add(etaRec);
\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
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
470 aFolderObj->Add(etaRecPi);
\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
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
481 aFolderObj->Add(etaRecK);
\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
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
492 aFolderObj->Add(etaRecP);
\r
495 // findable efficiency
\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
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
508 aFolderObj->Add(etaRecF);
\r
510 // export objects to analysis folder
\r
511 fAnalysisFolder = ExportToFolder(aFolderObj);
\r
513 // delete only TObjArray
\r
514 if(aFolderObj) delete aFolderObj;
\r
517 //_____________________________________________________________________________
\r
518 TFolder* AliComparisonEff::ExportToFolder(TObjArray * array)
\r
520 // recreate folder avery time and export objects to new one
\r
522 AliComparisonEff * comp=this;
\r
523 TFolder *folder = comp->GetAnalysisFolder();
\r
525 TString name, title;
\r
526 TFolder *newFolder = 0;
\r
528 Int_t size = array->GetSize();
\r
531 // get name and title from old folder
\r
532 name = folder->GetName();
\r
533 title = folder->GetTitle();
\r
539 newFolder = CreateFolder(name.Data(),title.Data());
\r
540 newFolder->SetOwner();
\r
542 // add objects to folder
\r
544 newFolder->Add(array->At(i));
\r
553 //_____________________________________________________________________________
\r
554 TFolder* AliComparisonEff::CreateFolder(TString name,TString title) {
\r
555 // create folder for analysed histograms
\r
557 TFolder *folder = 0;
\r
558 folder = new TFolder(name.Data(),title.Data());
\r