3 #include "AlidNdEtaCorrection.h"
9 //____________________________________________________________________
10 ClassImp(AlidNdEtaCorrection)
12 //____________________________________________________________________
13 AlidNdEtaCorrection::AlidNdEtaCorrection()
15 fTrack2ParticleCorrection(0),
16 fVertexRecoCorrection(0),
17 fTriggerCorrection(0),
18 fTriggerBiasCorrection(0),
22 // default constructor
25 //____________________________________________________________________
26 AlidNdEtaCorrection::AlidNdEtaCorrection(const Char_t* name, const Char_t* title)
27 : TNamed(name, title),
28 fTrack2ParticleCorrection(0),
29 fVertexRecoCorrection(0),
30 fTriggerCorrection(0),
31 fTriggerBiasCorrection(0),
38 Float_t binLimitsPt[] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.5, 2.0, 10.0, 100.0};
40 fTrack2ParticleCorrection = new AliCorrectionMatrix3D("nTrackToNPart", "nTrackToNPart", 40, -20, 20, 60, -6, 6, 14, binLimitsPt);
42 Float_t binLimitsN[] = {-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5,
43 10.5, 12.5, 14.5, 16.5, 18.5, 20.5, 25.5, 30.5, 40.5, 50.5, 100.5, 300.5};
44 Float_t binLimitsVtx[] = {-20,-15,-10,-6,-3,0,3,6,10,15,20};
46 fVertexRecoCorrection = new AliCorrectionMatrix2D("vtxReco", "vtxReco",10,binLimitsVtx ,22,binLimitsN);
47 fTriggerCorrection = new AliCorrectionMatrix2D("trigger", "trigger",10,binLimitsVtx ,22,binLimitsN);
49 fTriggerBiasCorrection = new AliCorrectionMatrix2D("triggerBias", "triggerBias",120,-6,6,100, 0, 10);
51 fTrack2ParticleCorrection ->SetAxisTitles("vtx z [cm]", "#eta", "p_{T} [GeV/c]");
52 fVertexRecoCorrection ->SetAxisTitles("vtx z [cm]", "Ntracks");
53 fTriggerCorrection ->SetAxisTitles("vtx z [cm]", "Ntracks");
55 fTriggerBiasCorrection ->SetAxisTitles("#eta", "p_{T} [GeV/c]");
58 //____________________________________________________________________
59 AlidNdEtaCorrection::~AlidNdEtaCorrection()
63 if (fTrack2ParticleCorrection)
65 delete fTrack2ParticleCorrection;
66 fTrack2ParticleCorrection = 0;
69 if (fVertexRecoCorrection)
71 delete fVertexRecoCorrection;
72 fVertexRecoCorrection = 0;
75 if (fTriggerCorrection)
77 delete fTriggerCorrection;
78 fTriggerCorrection = 0;
81 if (fTriggerBiasCorrection)
83 delete fTriggerBiasCorrection;
84 fTriggerBiasCorrection = 0;
88 //____________________________________________________________________
90 AlidNdEtaCorrection::Finish() {
94 // divide the histograms in the AliCorrectionMatrix2D objects to get the corrections
96 fTrack2ParticleCorrection->Divide();
98 TH3F* hist = fTrack2ParticleCorrection->GetCorrectionHistogram();
100 for (Int_t x=hist->GetXaxis()->FindBin(-10); x<=hist->GetXaxis()->FindBin(10); ++x)
101 for (Int_t y=hist->GetYaxis()->FindBin(-0.8); y<=hist->GetYaxis()->FindBin(0.8); ++y)
102 for (Int_t z=hist->GetZaxis()->FindBin(0.3); z<=hist->GetZaxis()->FindBin(9.9); ++z)
103 if (hist->GetBinContent(x, y, z) == 0)
105 printf("Empty bin in fTrack2ParticleCorrection at vtx = %f, eta = %f, pt = %f\n", hist->GetXaxis()->GetBinCenter(x), hist->GetYaxis()->GetBinCenter(y), hist->GetZaxis()->GetBinCenter(z));
109 printf("INFO: In the central region fTrack2ParticleCorrection has %d empty bins\n", emptyBins);
111 fVertexRecoCorrection->Divide();
112 fTriggerCorrection->Divide();
116 printf("ERROR: fNEvents is empty. Cannot scale histogram. Skipping processing of fTriggerBiasCorrection\n");
119 fTriggerBiasCorrection->GetMeasuredHistogram()->Scale(Double_t(fNTriggeredEvents)/Double_t(fNEvents));
120 fTriggerBiasCorrection->Divide();
123 //____________________________________________________________________
125 AlidNdEtaCorrection::Merge(TCollection* list) {
126 // Merge a list of dNdEtaCorrection objects with this (needed for
128 // Returns the number of merged objects (including this).
136 TIterator* iter = list->MakeIterator();
139 // collections of measured and generated histograms
140 TList* collectionNtrackToNparticle = new TList;
141 TList* collectionVertexReco = new TList;
142 TList* collectionTriggerBias = new TList;
145 while ((obj = iter->Next())) {
147 AlidNdEtaCorrection* entry = dynamic_cast<AlidNdEtaCorrection*> (obj);
151 collectionNtrackToNparticle ->Add(entry->GetTrack2ParticleCorrection());
152 collectionVertexReco ->Add(entry->GetVertexRecoCorrection());
153 collectionTriggerBias ->Add(entry->GetTriggerBiasCorrection());
157 fNEvents += entry->fNEvents;
158 fNTriggeredEvents += entry->fNTriggeredEvents;
160 fTrack2ParticleCorrection ->Merge(collectionNtrackToNparticle);
161 fVertexRecoCorrection ->Merge(collectionVertexReco);
162 fTriggerBiasCorrection ->Merge(collectionTriggerBias);
164 delete collectionNtrackToNparticle;
165 delete collectionVertexReco;
166 delete collectionTriggerBias;
173 //____________________________________________________________________
175 AlidNdEtaCorrection::LoadHistograms(const Char_t* fileName, const Char_t* dir) {
177 // loads the histograms
180 fTrack2ParticleCorrection ->LoadHistograms(fileName, dir);
181 fVertexRecoCorrection ->LoadHistograms(fileName, dir);
182 fTriggerCorrection ->LoadHistograms(fileName, dir);
183 fTriggerBiasCorrection ->LoadHistograms(fileName, dir);
189 //____________________________________________________________________
191 AlidNdEtaCorrection::SaveHistograms() {
193 // save the histograms
196 gDirectory->mkdir(fName.Data());
197 gDirectory->cd(fName.Data());
199 fTrack2ParticleCorrection->SaveHistograms();
200 fVertexRecoCorrection->SaveHistograms();
201 fTriggerCorrection->SaveHistograms();
202 fTriggerBiasCorrection->SaveHistograms();
204 gDirectory->cd("../");
207 //____________________________________________________________________
208 void AlidNdEtaCorrection::DrawHistograms()
211 // call the draw histogram method of the two AliCorrectionMatrix2D objects
213 fTrack2ParticleCorrection ->DrawHistograms();
214 fVertexRecoCorrection ->DrawHistograms();
215 fTriggerCorrection ->DrawHistograms();
216 fTriggerBiasCorrection ->DrawHistograms();
220 //____________________________________________________________________
221 Float_t AlidNdEtaCorrection::GetMeasuredFraction(Float_t ptCutOff, Float_t eta, Bool_t debug)
223 // calculates the fraction of particles measured (some are missed due to the pt cut off)
224 // uses the generated particle histogram from fTrack2ParticleCorrection
226 const TH3F* generated = fTrack2ParticleCorrection->GetGeneratedHistogram();
228 // find eta borders, if eta is negative assume -0.8 ... 0.8
233 etaBegin = generated->GetYaxis()->FindBin(-0.8);
234 etaEnd = generated->GetYaxis()->FindBin(0.8);
238 etaBegin = generated->GetYaxis()->FindBin(eta);
242 Int_t vertexBegin = generated->GetXaxis()->FindBin(-10);
243 Int_t vertexEnd = generated->GetXaxis()->FindBin(10);
245 TH1D* ptProj = dynamic_cast<TH1D*> (generated->ProjectionZ(Form("%s_pt", generated->GetName()), vertexBegin, vertexEnd, etaBegin, etaEnd));
246 ptProj->GetXaxis()->SetTitle(generated->GetZaxis()->GetTitle());
248 Int_t ptBin = ptProj->FindBin(ptCutOff);
249 Float_t abovePtCut = ptProj->Integral(ptBin, ptProj->GetNbinsX());
250 Float_t all = ptProj->Integral();
255 Float_t fraction = abovePtCut / all;
268 void AlidNdEtaCorrection::ReduceInformation()
270 // this function deletes the measured and generated histograms from the corrections to reduce the amount of data
273 // these are needed for GetMeasuredFraction(): fTrack2ParticleCorrection->ReduceInformation();
274 fVertexRecoCorrection->ReduceInformation();
275 fTriggerCorrection->ReduceInformation();
276 fTriggerBiasCorrection->ReduceInformation();