]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/TPC/AliPerformancePtCalib.cxx
Corrected memory leaks and go back to old vertex selection
[u/mrichter/AliRoot.git] / PWG1 / TPC / AliPerformancePtCalib.cxx
CommitLineData
ba06aaec 1//------------------------------------------------------------------------------
2// Implementation of AliPerformancePtCalib class. It fills histograms with ESD or
3// TPC track information to study 1.pt spectra.
4// To analyse the output of AliPerformancePtCalib use AliPerfAnalyzeInvPt class:
5// Projection of 1/pt vs theta and vs phi resp. histoprams will be fitted with either
6// polynomial or gaussian fit function to extract minimum position of 1/pt.
7// Fit options and theta, phi bins can be set by user.
8// Attention: use the Set* functions of AliPerformancePtCalib.h when running
9// AliPerformancePtCalib::Analyse()
10// The result of the analysis (histograms/graphs) are stored in the folder which is
11// a data member of AliPerformancePtCalib*.
12//
13// Author: S.Schuchmann 11/13/2009
6bcacaf1 14// sschuchm@ikf.uni-frankfurt.de
ba06aaec 15//------------------------------------------------------------------------------
acb9d358 16
ba06aaec 17/*
18
19// after running comparison task, read the file, and get component
20gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
21LoadMyLibs();
acb9d358 22
ba06aaec 23TFile f("Output.root");
24AliPerformancePtCalib * compObj = (AliPerformancePtCalib*)coutput->FindObject("AliPerformancePtCalib");
25
26// analyse comparison data
27compObj->Analyse();
acb9d358 28
ba06aaec 29// the output histograms/graphs will be stored in the folder "folderRes"
30compObj->GetAnalysisFolder()->ls("*");
acb9d358 31
ba06aaec 32// user can save whole comparison object (or only folder with anlysed histograms)
33// in the seperate output file (e.g.)
34TFile fout("Analysed_InvPt.root","recreate");
35compObj->Write(); // compObj->GetAnalysisFolder()->Write();
36fout.Close();
acb9d358 37
ba06aaec 38*/
39#include "TH1F.h"
40#include "TH2F.h"
41#include "TList.h"
42#include "TMath.h"
43#include "TFolder.h"
44#include "AliESDEvent.h"
45#include "AliESDtrack.h"
46#include "AliESDfriendTrack.h"
47#include "AliESDfriend.h"
48#include "AliESDtrackCuts.h"
acb9d358 49
50#include "AliPerfAnalyzeInvPt.h"
acb9d358 51#include "AliPerformancePtCalib.h"
52
53using namespace std;
54
55ClassImp(AliPerformancePtCalib)
56
57//________________________________________________________________________
ba06aaec 58 AliPerformancePtCalib::AliPerformancePtCalib():
59 AliPerformanceObject("AliPerformancePtCalib"),
60
61 // option parameter for AliPerformancePtCalib::Analyse()
62 fNThetaBins(0),
63 fNPhiBins(0),
64 fRange(0),
65 fExclRange(0),
66 fFitGaus(0) ,
6bcacaf1 67 fDoRebin(0),
68 fRebin(0),
ba06aaec 69 // option for user defined charge/pt shift
70 fShift(0),
71 fDeltaInvP(0),
72
73 //options for cuts
74 fOptTPC(0),
75 fESDcuts(0),
76 fRefitTPC(0),
77 fRefitITS(0),
78 fDCAcut(0),
79 fEtaAcceptance(0),
80 fMinPt(0),
81 fMaxPt(0),
82 fMinNClustersTPC(0),
83 fMaxChi2PerClusterTPC(0),
84 fMaxDCAtoVertexXY(0),
85 fMaxDCAtoVertexZ(0),
86 fAcceptKinkDaughters(0),
87 fRequireSigmaToVertex(0),
88 fDCAToVertex2D(0),
89
90 fCutsRC(0),
91 fCutsMC(0),
92
93 fList(0),
94 // histograms
95 fHistInvPtTheta(0),
96 fHistInvPtPhi(0),
97 fHistPtTheta(0),
98 fHistPtPhi(0),
99
100 fHistPtShift0(0),
101 fHistPrimaryVertexPosX(0),
102 fHistPrimaryVertexPosY(0),
103 fHistPrimaryVertexPosZ(0),
104 fHistTrackMultiplicity(0),
105 fHistTrackMultiplicityCuts(0),
106
107 fHistTPCMomentaPosP(0),
108 fHistTPCMomentaNegP(0),
109 fHistTPCMomentaPosPt(0),
110 fHistTPCMomentaNegPt(0),
111 fHistUserPtShift(0),
112
113 //esd track cuts
114 fESDTrackCuts(0),
115
116 // analysis folder
117 fAnalysisFolder(0)
acb9d358 118{
119
ba06aaec 120 // Dummy constructor
acb9d358 121
ba06aaec 122 fShift = kFALSE; // shift in charge/pt yes/no
123 fDeltaInvP = 0.00; // shift value
124 //options for cuts
125 fOptTPC = kTRUE; // read TPC tracks yes/no
126 fESDcuts = kTRUE; // read ESD track cuts
127 fRefitTPC = kFALSE; // require TPC refit
128 fRefitITS = kFALSE; // require ITS refit
129 fDCAcut = kTRUE; // apply DCA cuts
130
131 fCutsRC = NULL;
132 fCutsMC = NULL;
133
134 //set options for esd track cuts
135 fEtaAcceptance = 0.8;
136 fMinPt=0.15; // GeV/c
137 fMaxPt=1.e10; // GeV/c
138 fMinNClustersTPC = 50;
139 fMaxChi2PerClusterTPC = 4.0;
140 fMaxDCAtoVertexXY = 2.4; // cm
141 fMaxDCAtoVertexZ = 3.2; // cm
142 fAcceptKinkDaughters = kFALSE;
143 fRequireSigmaToVertex = kFALSE;
144 fDCAToVertex2D = kTRUE;
145
146 // options for function AliPerformancePtCalibMC::Analyse()
147 fFitGaus = kFALSE;// use gaussian function for fitting charge/pt yes/no
148 fNThetaBins = 0; //number of theta bins
149 fNPhiBins = 0; //number of phi bins
150 fRange = 0; //fit range around 0
151 fExclRange =0; //range of rejection of points around 0
6bcacaf1 152 fDoRebin = kFALSE;
153 fRebin = 0;
154
ba06aaec 155 Init();
acb9d358 156}
157
158//________________________________________________________________________
ba06aaec 159AliPerformancePtCalib::AliPerformancePtCalib(Char_t * name="AliPerformancePtCalib",Char_t* title ="AliPerformancePtCalib")://,Int_t analysisMode=0,Bool_t hptGenerator=kFALSE) :
acb9d358 160 AliPerformanceObject(name,title),
161
ba06aaec 162 // option parameter for AliPerformancePtCalib::Analyse()
acb9d358 163 fNThetaBins(0),
164 fNPhiBins(0),
165 fRange(0),
166 fExclRange(0),
167 fFitGaus(0) ,
6bcacaf1 168 fDoRebin(0),
169 fRebin(0),
ba06aaec 170 fShift(0),
171 fDeltaInvP(0),
6bcacaf1 172 //options for cuts
acb9d358 173 fOptTPC(0),
ba06aaec 174 fESDcuts(0),
acb9d358 175 fRefitTPC(0),
ba06aaec 176 fRefitITS(0),
177 fDCAcut(0),
178 fEtaAcceptance(0),
179 fMinPt(0),
180 fMaxPt(0),
181 fMinNClustersTPC(0),
182 fMaxChi2PerClusterTPC(0),
183 fMaxDCAtoVertexXY(0),
184 fMaxDCAtoVertexZ(0),
185 fAcceptKinkDaughters(0),
186 fRequireSigmaToVertex(0),
187 fDCAToVertex2D(0),
188
189 fCutsRC(0),
190 fCutsMC(0),
acb9d358 191 fList(0),
192
193 // histograms
ba06aaec 194 fHistInvPtTheta(0),
195 fHistInvPtPhi(0),
196 fHistPtTheta(0),
197 fHistPtPhi(0),
198
199 fHistPtShift0(0),
200 fHistPrimaryVertexPosX(0),
201 fHistPrimaryVertexPosY(0),
202 fHistPrimaryVertexPosZ(0),
203 fHistTrackMultiplicity(0),
204 fHistTrackMultiplicityCuts(0),
205
206 fHistTPCMomentaPosP(0),
207 fHistTPCMomentaNegP(0),
208 fHistTPCMomentaPosPt(0),
209 fHistTPCMomentaNegPt(0),
acb9d358 210 fHistUserPtShift(0),
211 //esd track cuts
ba06aaec 212 fESDTrackCuts(0),
acb9d358 213
ba06aaec 214 // analysis folder
215 fAnalysisFolder(0)
acb9d358 216
217
218{
ba06aaec 219 // Constructor
220 fShift = kFALSE;
221 fDeltaInvP = 0.00;
222 //options for cuts
223 fOptTPC = kTRUE; // read TPC tracks yes/no
224 fESDcuts = kTRUE; // read ESD track cuts
225 fRefitTPC = kFALSE; // require TPC refit
226 fRefitITS = kFALSE; // require ITS refit
227 fDCAcut = kTRUE; // apply DCA cuts
acb9d358 228
ba06aaec 229 fCutsRC = NULL;
230 fCutsMC = NULL;
231
232 //esd track cut options
233 fEtaAcceptance = 0.8;
234 fMinPt=0.15; // GeV/c
235 fMaxPt=1.e10; // GeV/c
236 fMinNClustersTPC = 50;
237 fMaxChi2PerClusterTPC = 4.0;
238 fMaxDCAtoVertexXY = 2.4; // cm
239 fMaxDCAtoVertexZ = 3.2; // cm
240 fAcceptKinkDaughters = kFALSE;
241 fRequireSigmaToVertex = kFALSE;
242 fDCAToVertex2D = kTRUE;
243
244 // options for function AliPerformancePtCalibMC::Analyse()
245 fFitGaus = kFALSE;// use gaussian function for fitting charge/pt yes/no
246 fNThetaBins = 0; //number of theta bins
247 fNPhiBins = 0; //number of phi bins
248 fRange = 0; //fit range around 0
249 fExclRange =0; //range of rejection of points around 0
6bcacaf1 250 fDoRebin = kFALSE;
251 fRebin = 0;
acb9d358 252
ba06aaec 253 Init();
acb9d358 254}
255
256AliPerformancePtCalib::~AliPerformancePtCalib() {
ba06aaec 257 //
258 // destructor
259 //
260 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
acb9d358 261}
262
263//________________________________________________________________________
264void AliPerformancePtCalib::Init()
265{
ba06aaec 266 // Create histograms
267 // Called once
acb9d358 268
269 fList = new TList();
ba06aaec 270 // init folder
271 fAnalysisFolder = CreateFolder("folderPt_TPC","Analysis Pt Resolution Folder");
272 fList->Add(fAnalysisFolder);
273 // Primary Vertex:
274 fHistPrimaryVertexPosX = new TH1F("fHistPrimaryVertexPosX", "Primary Vertex Position X;Primary Vertex Position X (cm);Events",100,-0.5,0.5);
275 fList->Add(fHistPrimaryVertexPosX);
276 fHistPrimaryVertexPosY = new TH1F("fHistPrimaryVertexPosY", "Primary Vertex Position Y;Primary Vertex Position Y (cm);Events",100,-0.5,0.5);
277 fList->Add(fHistPrimaryVertexPosY);
278 fHistPrimaryVertexPosZ = new TH1F("fHistPrimaryVertexPosZ", "Primary Vertex Position Z;Primary Vertex Position Z (cm);Events",200,-2.0,2.0);
279 fList->Add(fHistPrimaryVertexPosZ);
280 // Multiplicity:
281 fHistTrackMultiplicity = new TH1F("fHistTrackMultiplicity", "Multiplicity distribution;Number of tracks;Events", 250, 0, 250);
282 fList->Add(fHistTrackMultiplicity);
283 fHistTrackMultiplicityCuts = new TH1F("fHistTrackMultiplicityCuts", "Multiplicity distribution;Number of tracks after cuts;Events", 250, 0, 250);
284 fList->Add(fHistTrackMultiplicityCuts);
acb9d358 285
ba06aaec 286 // momentum histos
287 //pt shift 0 only needed if shift in 1/pt is applied
288 fHistPtShift0 = new TH1F("fHistPtShift0","1/pt dN/pt vs. pt of ESD track ",600,0.0,6.0);
289 fList->Add(fHistPtShift0);
290 fHistInvPtTheta = new TH2F("fHistInvPtTheta","#theta vs 1/pt ",900, -4.5, 4.5,300,0.0,3.0);
291 fList->Add(fHistInvPtTheta);
292 fHistInvPtPhi = new TH2F("fHistInvPtPhi","#phi vs 1/pt",900, -4.5, 4.5,325,0.0,6.5);
293 fList->Add(fHistInvPtPhi);
294 fHistPtTheta = new TH2F("fHistPtTheta"," #theta vs pt ",300, 0.0, 15.0,300,0.0,3.0);
295 fList->Add(fHistPtTheta);
296 fHistPtPhi = new TH2F("fHistPtPhi"," #phi vs pt ",300, 0.0,15.0,325,0.0,6.5);
297 fList->Add(fHistPtPhi);
acb9d358 298
299 // mom test histos
ba06aaec 300 fHistTPCMomentaPosP = new TH2F("fHistTPCMomentaPosP","TPC p vs global esd track p pos",300,0.0,15.0,300,0.0,15.0);
301 fList->Add(fHistTPCMomentaPosP);
302 fHistTPCMomentaNegP = new TH2F("fHistTPCMomentaNegP","TPC p vs global esd track p neg",300,0.0,15.0,300,0.0,15.0);
303 fList->Add(fHistTPCMomentaNegP);
304 fHistTPCMomentaPosPt = new TH2F("fHistTPCMomentaPosPt","TPC pt vs global esd track pt pos",300,0.0,15.0,300,0.0,15.0);
305 fList->Add(fHistTPCMomentaPosPt);
306 fHistTPCMomentaNegPt = new TH2F("fHistTPCMomentaNegPt","TPC pt vs global esd track pt neg",300,0.0,15.0,300,0.0,15.0);
307 fList->Add(fHistTPCMomentaNegPt);
308
309 //user pt shift check
acb9d358 310 fHistUserPtShift = new TH1F("fHistUserPtShift","user defined shift in 1/pt",100,-0.5,1.5);
311 fList->Add(fHistUserPtShift);
312
313
ba06aaec 314 // esd track cuts
315 fESDTrackCuts = new AliESDtrackCuts("AliESDtrackCuts");
acb9d358 316
ba06aaec 317 //fESDTrackCuts->DefineHistoqgrams(1);
318 fESDTrackCuts->SetRequireSigmaToVertex(fRequireSigmaToVertex);
319 fESDTrackCuts->SetRequireTPCRefit(fRefitTPC);
320 fESDTrackCuts->SetAcceptKinkDaughters(fAcceptKinkDaughters);
321 fESDTrackCuts->SetMinNClustersTPC((Int_t)fMinNClustersTPC);
322 fESDTrackCuts->SetMaxChi2PerClusterTPC(fMaxChi2PerClusterTPC);
323 fESDTrackCuts->SetMaxDCAToVertexXY(fMaxDCAtoVertexXY);
324 fESDTrackCuts->SetMaxDCAToVertexZ(fMaxDCAtoVertexZ);
325 fESDTrackCuts->SetDCAToVertex2D(fDCAToVertex2D);
326 fESDTrackCuts->SetPtRange(fMinPt,fMaxPt);
acb9d358 327}
328
329//________________________________________________________________________
ba06aaec 330void AliPerformancePtCalib::SetPtShift(const Double_t shiftVal ) {
331 //set user defined shift in charge/pt
332
333 if(shiftVal) { fShift=kTRUE; fDeltaInvP = shiftVal; }
acb9d358 334}
335
336//________________________________________________________________________
337void AliPerformancePtCalib::Exec(AliMCEvent*, AliESDEvent* const esdEvent, AliESDfriend*, Bool_t, Bool_t)
338{
339
ba06aaec 340 //exec: read esd or tpc tracks
341
342 if (!esdEvent) {
343 Printf("ERROR: Event not available");
344 return;
345 }
acb9d358 346
ba06aaec 347 if (!(esdEvent->GetNumberOfTracks())) {
348 Printf(" PtCalib task: There is no track in this event");
349 return;
350 }
acb9d358 351
046b4280 352 if (GetTriggerClass()){
353 Bool_t isEventTriggered = esdEvent->IsTriggerClassFired(GetTriggerClass());
354 if(!isEventTriggered) return;
355 }
6bcacaf1 356
ba06aaec 357 if(fShift) fHistUserPtShift->Fill(fDeltaInvP);
acb9d358 358
ba06aaec 359 fHistTrackMultiplicity->Fill(esdEvent->GetNumberOfTracks());
acb9d358 360
361
ba06aaec 362 // read primary vertex info
363 Double_t tPrimaryVtxPosition[3];
364 // Double_t tPrimaryVtxCov[3];
365 const AliESDVertex *primaryVtx = esdEvent->GetPrimaryVertexTPC();
acb9d358 366
ba06aaec 367 tPrimaryVtxPosition[0] = primaryVtx->GetXv();
368 tPrimaryVtxPosition[1] = primaryVtx->GetYv();
369 tPrimaryVtxPosition[2] = primaryVtx->GetZv();
acb9d358 370
ba06aaec 371 fHistPrimaryVertexPosX->Fill(tPrimaryVtxPosition[0]);
372 fHistPrimaryVertexPosY->Fill(tPrimaryVtxPosition[1]);
373 fHistPrimaryVertexPosZ->Fill(tPrimaryVtxPosition[2]);
acb9d358 374
375
ba06aaec 376 //_fill histos for pt spectra and shift of transverse momentum
377 Int_t count=0;
acb9d358 378
ba06aaec 379 for(Int_t j = 0;j<esdEvent->GetNumberOfTracks();j++){// track loop
380 AliESDtrack *esdTrack = esdEvent->GetTrack(j);
381 if(!esdTrack) continue;
acb9d358 382
383
ba06aaec 384 if(fESDcuts){
385 if(!fESDTrackCuts->AcceptTrack(esdTrack))continue;
386 }
acb9d358 387
ba06aaec 388 //track cuts
389 if(fRefitTPC) if(AddTPCcuts(esdTrack)) continue;
390 if(fRefitITS) if(AddITScuts(esdTrack)) continue;
391 if(fDCAcut) if(AddDCAcuts(esdTrack)) continue ;
acb9d358 392
ba06aaec 393 // fill histos
394 if(fOptTPC){ //TPC tracks
395 const AliExternalTrackParam *tpcTrack = esdTrack->GetTPCInnerParam();
396 if(!tpcTrack) continue;
397 if(fabs(tpcTrack->Eta())> fEtaAcceptance) continue;
acb9d358 398
ba06aaec 399 Double_t signedPt = tpcTrack->GetSignedPt();
400 Double_t invPt = 0.0;
401 if(signedPt) {
402 invPt = 1.0/signedPt;
acb9d358 403
ba06aaec 404 fHistPtShift0->Fill(fabs(signedPt));
acb9d358 405
ba06aaec 406 if(fShift){
407 invPt += fDeltaInvP; //shift momentum for tests
408 if(invPt) signedPt = 1.0/invPt;
409 else continue;
410 }
acb9d358 411
ba06aaec 412 fHistInvPtTheta->Fill(invPt,tpcTrack->Theta());
413 fHistInvPtPhi->Fill(invPt,tpcTrack->Phi());
414 fHistPtTheta->Fill(fabs(signedPt),tpcTrack->Theta());
415 fHistPtPhi->Fill(fabs(signedPt),tpcTrack->Phi());
acb9d358 416
417
ba06aaec 418 Double_t pTPC = tpcTrack->GetP();
419 Double_t pESD = esdTrack->GetP();
420 Double_t ptESD = esdTrack->GetSignedPt();
acb9d358 421
ba06aaec 422 if(esdTrack->GetSign()>0){
423 //compare momenta ESD track and TPC track
424 fHistTPCMomentaPosP->Fill(fabs(pESD),fabs(pTPC));
425 fHistTPCMomentaPosPt->Fill(fabs(ptESD),fabs(signedPt));
426 }
427 else{
428 fHistTPCMomentaNegP->Fill(fabs(pESD),fabs(pTPC));
429 fHistTPCMomentaNegPt->Fill(fabs(ptESD),fabs(signedPt));
430 }
431 count++;
432 }
433 else continue;
acb9d358 434 }
acb9d358 435
ba06aaec 436 else{// ESD tracks
437 Double_t invPt = 0.0;
438 Double_t signedPt = esdTrack->GetSignedPt();
439 if(signedPt){
440 invPt = 1.0/signedPt;
acb9d358 441
ba06aaec 442 fHistPtShift0->Fill(fabs(signedPt));
acb9d358 443
ba06aaec 444 if(fShift){
445 invPt += fDeltaInvP;//shift momentum for tests
446 if(invPt) signedPt = 1.0/invPt;
447 else continue;
448 }
449 fHistInvPtTheta->Fill(invPt,esdTrack->Theta());
450 fHistInvPtPhi->Fill(invPt,esdTrack->Phi());
451 fHistPtTheta->Fill(signedPt,esdTrack->Theta());
452 fHistPtPhi->Fill(signedPt,esdTrack->Phi());
acb9d358 453
ba06aaec 454 count++;
455 }
acb9d358 456 }
ba06aaec 457 }
acb9d358 458
ba06aaec 459 fHistTrackMultiplicityCuts->Fill(count);
acb9d358 460
461}
462
463
464
465//______________________________________________________________________________________________________________________
4c10f566 466Bool_t AliPerformancePtCalib::AddTPCcuts(const AliESDtrack *esdTrack){
ba06aaec 467 // apply TPC cuts
468
469 Bool_t cut = kFALSE;
acb9d358 470
ba06aaec 471 if (!(esdTrack->GetStatus()&AliESDtrack::kTPCrefit)) cut=kTRUE; // TPC refit
472 if (esdTrack->GetTPCNcls()<fMinNClustersTPC) cut=kTRUE; // min. nb. TPC clusters
473 if(cut) return kTRUE;
474 return kFALSE;
acb9d358 475}
476//______________________________________________________________________________________________________________________
4c10f566 477Bool_t AliPerformancePtCalib::AddDCAcuts(const AliESDtrack *esdTrack){
ba06aaec 478 //apply DCA cuts
479 Bool_t cut = kFALSE;
480
481 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z and impact parameters:
482 esdTrack->GetImpactParameters(dca,cov);
483 if(TMath::Abs(dca[0])>fMaxDCAtoVertexXY || TMath::Abs(dca[1])>fMaxDCAtoVertexZ) cut=kTRUE;
484 if(esdTrack->GetKinkIndex(0)>0) cut=kTRUE;
485 if(cut) return kTRUE;
486 return kFALSE;
acb9d358 487}
488
489//______________________________________________________________________________________________________________________
4c10f566 490Bool_t AliPerformancePtCalib::AddITScuts(const AliESDtrack *esdTrack){
ba06aaec 491 //apply ITS cuts
492 Bool_t cut = kFALSE;
acb9d358 493
ba06aaec 494 if (!(esdTrack->GetStatus()&AliESDtrack::kITSrefit)) cut=kTRUE; // ITS refit
495 Int_t clusterITS[200];
496 if(esdTrack->GetITSclusters(clusterITS)<2) cut=kTRUE; // min. nb. ITS clusters //3
acb9d358 497
ba06aaec 498 if(cut) return kTRUE;
499 return kFALSE;
acb9d358 500}
501
502//______________________________________________________________________________________________________________________
503
504void AliPerformancePtCalib::Analyse()
505{
ba06aaec 506 // analyse charge/pt spectra in bins of theta and phi. Bins can be set by user
507
acb9d358 508
ba06aaec 509 AliPerfAnalyzeInvPt *ana = new AliPerfAnalyzeInvPt("AliPerfAnalyzeInvPt","AliPerfAnalyzeInvPt");
acb9d358 510
511
ba06aaec 512 TH1::AddDirectory(kFALSE);
acb9d358 513
ba06aaec 514 ana->SetProjBinsTheta(fThetaBins,fNThetaBins);
515 ana->SetProjBinsPhi(fPhiBins,fNPhiBins);
516 ana->SetMakeFitOption(fFitGaus,fExclRange,fRange);
6bcacaf1 517 ana->SetDoRebin(fRebin);
ba06aaec 518 TObjArray *aFolderObj = new TObjArray;
519 ana->StartAnalysis(fHistInvPtTheta,fHistInvPtPhi, aFolderObj);
acb9d358 520
ba06aaec 521 // export objects to analysis folder
522 fAnalysisFolder = ExportToFolder(aFolderObj);
acb9d358 523
ba06aaec 524 // delete only TObjArray
525 if(aFolderObj) delete aFolderObj;
526 if(ana) delete ana;
acb9d358 527
528}
529
530//______________________________________________________________________________________________________________________
531TFolder* AliPerformancePtCalib::ExportToFolder(TObjArray * array)
532{
ba06aaec 533 // recreate folder every time and export objects to new one
534 //
535 AliPerformancePtCalib * comp=this;
536 TFolder *folder = comp->GetAnalysisFolder();
537
538 TString name, title;
539 TFolder *newFolder = 0;
540 Int_t i = 0;
541 Int_t size = array->GetSize();
542
543 if(folder) {
544 // get name and title from old folder
545 name = folder->GetName();
546 title = folder->GetTitle();
547
548 // delete old one
549 delete folder;
550
551 // create new one
552 newFolder = CreateFolder(name.Data(),title.Data());
553 newFolder->SetOwner();
554
555 // add objects to folder
556 while(i < size) {
557 newFolder->Add(array->At(i));
558 i++;
559 }
560 }
561
562 return newFolder;
acb9d358 563}
564
565//______________________________________________________________________________________________________________________
566Long64_t AliPerformancePtCalib::Merge(TCollection* const list)
567{
ba06aaec 568 // Merge list of objects (needed by PROOF)
569
570 if (!list)
571 return 0;
572
573 if (list->IsEmpty())
574 return 1;
575
576 TIterator* iter = list->MakeIterator();
577 TObject* obj = 0;
578
579 // collection of generated histograms
580 Int_t count=0;
581 while((obj = iter->Next()) != 0)
582 {
583 AliPerformancePtCalib* entry = dynamic_cast<AliPerformancePtCalib*>(obj);
584 if (entry == 0) continue;
585
586 fHistInvPtTheta->Add(entry->fHistInvPtTheta);
587 fHistInvPtPhi->Add(entry-> fHistInvPtPhi);
588 fHistPtTheta->Add(entry->fHistPtTheta);
589 fHistPtPhi->Add(entry->fHistPtPhi);
590
591 fHistPtShift0->Add(entry->fHistPtShift0);
592 fHistPrimaryVertexPosX->Add(entry->fHistPrimaryVertexPosX);
593 fHistPrimaryVertexPosY->Add(entry->fHistPrimaryVertexPosY);
594 fHistPrimaryVertexPosZ->Add(entry->fHistPrimaryVertexPosZ);
595 fHistTrackMultiplicity->Add(entry->fHistTrackMultiplicity);
596 fHistTrackMultiplicityCuts->Add(entry->fHistTrackMultiplicityCuts);
597
598 fHistTPCMomentaPosP->Add(entry->fHistTPCMomentaPosP);
599 fHistTPCMomentaNegP->Add(entry->fHistTPCMomentaNegP);
600 fHistTPCMomentaPosPt->Add(entry->fHistTPCMomentaPosPt);
601 fHistTPCMomentaNegPt->Add(entry->fHistTPCMomentaNegPt);
602
603 count++;
604 }
acb9d358 605
ba06aaec 606 return count;
acb9d358 607}
608
609//______________________________________________________________________________________________________________________
610TFolder* AliPerformancePtCalib::CreateFolder(TString name,TString title) {
ba06aaec 611 // create folder for analysed histograms
612 //
613 TFolder *folder = 0;
614 folder = new TFolder(name.Data(),title.Data());
acb9d358 615
ba06aaec 616 return folder;
acb9d358 617}
618//______________________________________________________________________________________________________________________
ba06aaec 619void AliPerformancePtCalib::SetProjBinsPhi(const Double_t *phiBinArray,const Int_t nphBins){
620 // set phi bins for Analyse()
621 //set phi bins as array and set number of this array which is equal to number of bins analysed
622 //the last analysed bin will always be the projection from first to last bin in the array
623 if(nphBins){
624 fNPhiBins = nphBins;
625
626 for(Int_t k = 0;k<fNPhiBins;k++){
627 fPhiBins[k] = phiBinArray[k];
628 }
629 Printf("AliPerformancePtCalib::SetProjBinsPhi: number of bins in phi set to %i",fNPhiBins);
acb9d358 630 }
ba06aaec 631 else Printf("Warning AliPerformancePtCalib::SetProjBinsPhi: number of bins in phi NOT set!!! Default values are taken.");
acb9d358 632}
633//____________________________________________________________________________________________________________________________________________
ba06aaec 634void AliPerformancePtCalib::SetProjBinsTheta(const Double_t *thetaBinArray, const Int_t nthBins){
635 // set theta bins for Analyse()
636 //set theta bins as array and set number of this array which is equal to number of bins analysed
637 //the last analysed bin will always be the projection from first to last bin in the array
638 if(nthBins){
639 fNThetaBins = nthBins;
640 for(Int_t k = 0;k<fNThetaBins;k++){
641 fThetaBins[k] = thetaBinArray[k];
642 }
643 Printf("AliPerformancePtCalib: number of bins in theta set to %i",fNThetaBins);
acb9d358 644 }
ba06aaec 645 else Printf("Warning AliPerformancePtCalib::SetProjBinsTheta: number of bins in theta NOT set!!! Default values are taken.");
acb9d358 646}
647//____________________________________________________________________________________________________________________________________________
648void AliPerformancePtCalib::SetMakeFitOption(const Bool_t setGausFit, const Double_t exclusionR,const Double_t fitR ){
ba06aaec 649 //set the fit options:
650 //for usage of gaussian function instead of polynomial (default) set setGausFit=kTRUE
651 //set the range of rejection of points around 0 via exclusionR
652 //set the fit range around 0 with fitR
acb9d358 653
654 fRange = fitR;
655 fFitGaus = setGausFit;
656 fExclRange = exclusionR;
657
658 if(fFitGaus) Printf("AliPerformancePtCalib: set MakeGausFit with fit range %2.3f and exclusion range in 1/pt: %2.3f",fRange,fExclRange);
659 else Printf("AliPerformancePtCalib: set standard polynomial fit with fit range %2.3f and exclusion range in 1/pt: %2.3f",fRange,fExclRange);
660
661}
ba06aaec 662//____________________________________________________________________________________________________________________________________________
663void AliPerformancePtCalib::SetESDcutValues(const Double_t * esdCutValues){
664 // set ESD cut values as an array of size 6
665
666 fMinPt = esdCutValues[0];
667 fMaxPt = esdCutValues[1];
668 fMinNClustersTPC = esdCutValues[2];
669 fMaxChi2PerClusterTPC = esdCutValues[3];
670 fMaxDCAtoVertexXY = esdCutValues[4];
671 fMaxDCAtoVertexZ = esdCutValues[5];
672}