3 #include "AlidNdEtaCorrection.h"
9 //____________________________________________________________________
10 ClassImp(AlidNdEtaCorrection)
12 //____________________________________________________________________
13 AlidNdEtaCorrection::AlidNdEtaCorrection()
15 fTrack2ParticleCorrection(0),
16 fVertexRecoCorrection(0),
17 fTriggerBiasCorrectionMBToINEL(0),
18 fTriggerBiasCorrectionMBToNSD(0),
19 fTriggerBiasCorrectionMBToND(0)
21 // default constructor
24 //____________________________________________________________________
25 AlidNdEtaCorrection::AlidNdEtaCorrection(const Char_t* name, const Char_t* title)
26 : TNamed(name, title),
27 fTrack2ParticleCorrection(0),
28 fVertexRecoCorrection(0),
29 fTriggerBiasCorrectionMBToINEL(0),
30 fTriggerBiasCorrectionMBToNSD(0),
31 fTriggerBiasCorrectionMBToND(0)
36 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, 5.0, 10.0, 100.0};
39 matrixName.Form("%s_nTrackToNPart", name);
41 fTrack2ParticleCorrection = new AliCorrectionMatrix3D(matrixName, matrixName, 40, -20, 20, 20, -2, 2, 15, binLimitsPt);
43 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,
44 10.5, 12.5, 14.5, 16.5, 18.5, 20.5, 25.5, 30.5, 40.5, 50.5, 100.5, 300.5};
45 Float_t binLimitsVtx[] = {-20,-15,-10,-6,-3,0,3,6,10,15,20};
47 matrixName.Form("%s_vtxReco", name);
48 fVertexRecoCorrection = new AliCorrectionMatrix2D(matrixName, matrixName, 10,binLimitsVtx ,22,binLimitsN);
50 matrixName.Form("%s_triggerBias_MBToINEL", name);
51 fTriggerBiasCorrectionMBToINEL = new AliCorrectionMatrix2D(matrixName, matrixName, 10,binLimitsVtx ,22,binLimitsN);
52 matrixName.Form("%s_triggerBias_MBToNSD", name);
53 fTriggerBiasCorrectionMBToNSD = new AliCorrectionMatrix2D(matrixName, matrixName, 10,binLimitsVtx ,22,binLimitsN);
54 matrixName.Form("%s_triggerBias_MBToND", name);
55 fTriggerBiasCorrectionMBToND = new AliCorrectionMatrix2D(matrixName, matrixName, 10,binLimitsVtx ,22,binLimitsN);
57 fTrack2ParticleCorrection ->SetAxisTitles("vtx z [cm]", "#eta", "p_{T} [GeV/c]");
58 fVertexRecoCorrection ->SetAxisTitles("vtx z [cm]", "Ntracks");
59 fTriggerBiasCorrectionMBToINEL ->SetAxisTitles("vtx z [cm]", "Ntracks");
60 fTriggerBiasCorrectionMBToNSD ->SetAxisTitles("vtx z [cm]", "Ntracks");
61 fTriggerBiasCorrectionMBToND ->SetAxisTitles("vtx z [cm]", "Ntracks");
64 //____________________________________________________________________
65 AlidNdEtaCorrection::~AlidNdEtaCorrection()
69 if (fTrack2ParticleCorrection) {
70 delete fTrack2ParticleCorrection;
71 fTrack2ParticleCorrection = 0;
74 if (fVertexRecoCorrection) {
75 delete fVertexRecoCorrection;
76 fVertexRecoCorrection = 0;
79 if (fTriggerBiasCorrectionMBToINEL) {
80 delete fTriggerBiasCorrectionMBToINEL;
81 fTriggerBiasCorrectionMBToINEL = 0;
84 if (fTriggerBiasCorrectionMBToNSD) {
85 delete fTriggerBiasCorrectionMBToNSD;
86 fTriggerBiasCorrectionMBToNSD = 0;
89 if (fTriggerBiasCorrectionMBToND) {
90 delete fTriggerBiasCorrectionMBToND;
91 fTriggerBiasCorrectionMBToND = 0;
95 //____________________________________________________________________
97 AlidNdEtaCorrection::Finish() {
101 // divide the histograms in the AliCorrectionMatrix2D objects to get the corrections
103 fTrack2ParticleCorrection->Divide();
105 TH3F* hist = fTrack2ParticleCorrection->GetCorrectionHistogram();
107 for (Int_t x=hist->GetXaxis()->FindBin(-10); x<=hist->GetXaxis()->FindBin(10); ++x)
108 for (Int_t y=hist->GetYaxis()->FindBin(-0.8); y<=hist->GetYaxis()->FindBin(0.8); ++y)
109 for (Int_t z=hist->GetZaxis()->FindBin(0.3); z<=hist->GetZaxis()->FindBin(9.9); ++z)
110 if (hist->GetBinContent(x, y, z) == 0)
112 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));
116 printf("INFO: In the central region fTrack2ParticleCorrection has %d empty bins\n", emptyBins);
118 fVertexRecoCorrection->Divide();
119 fTriggerBiasCorrectionMBToINEL->Divide();
120 fTriggerBiasCorrectionMBToNSD->Divide();
121 fTriggerBiasCorrectionMBToND->Divide();
124 //____________________________________________________________________
126 AlidNdEtaCorrection::Merge(TCollection* list) {
127 // Merge a list of dNdEtaCorrection objects with this (needed for
129 // Returns the number of merged objects (including this).
137 TIterator* iter = list->MakeIterator();
140 // collections of measured and generated histograms
141 TList* collectionNtrackToNparticle = new TList;
142 TList* collectionVertexReco = new TList;
143 TList* collectionTriggerBiasMBToINEL = new TList;
144 TList* collectionTriggerBiasMBToNSD = new TList;
145 TList* collectionTriggerBiasMBToND = new TList;
148 while ((obj = iter->Next())) {
150 AlidNdEtaCorrection* entry = dynamic_cast<AlidNdEtaCorrection*> (obj);
154 collectionNtrackToNparticle ->Add(entry->GetTrack2ParticleCorrection());
155 collectionVertexReco ->Add(entry->GetVertexRecoCorrection());
156 collectionTriggerBiasMBToINEL->Add(entry->GetTriggerBiasCorrection("INEL"));
157 collectionTriggerBiasMBToNSD ->Add(entry->GetTriggerBiasCorrection("NSD"));
158 collectionTriggerBiasMBToND ->Add(entry->GetTriggerBiasCorrection("ND"));
162 //fNEvents += entry->fNEvents;
163 //fNTriggeredEvents += entry->fNTriggeredEvents;
165 fTrack2ParticleCorrection ->Merge(collectionNtrackToNparticle);
166 fVertexRecoCorrection ->Merge(collectionVertexReco);
167 fTriggerBiasCorrectionMBToINEL ->Merge(collectionTriggerBiasMBToINEL);
168 fTriggerBiasCorrectionMBToNSD ->Merge(collectionTriggerBiasMBToNSD);
169 fTriggerBiasCorrectionMBToND ->Merge(collectionTriggerBiasMBToND);
171 delete collectionNtrackToNparticle;
172 delete collectionVertexReco;
173 delete collectionTriggerBiasMBToINEL;
174 delete collectionTriggerBiasMBToNSD;
175 delete collectionTriggerBiasMBToND;
182 //____________________________________________________________________
184 AlidNdEtaCorrection::LoadHistograms(const Char_t* fileName, const Char_t* dir) {
186 // loads the histograms
189 fTrack2ParticleCorrection ->LoadHistograms(fileName, dir);
190 fVertexRecoCorrection ->LoadHistograms(fileName, dir);
191 fTriggerBiasCorrectionMBToINEL ->LoadHistograms(fileName, dir);
192 fTriggerBiasCorrectionMBToNSD ->LoadHistograms(fileName, dir);
193 fTriggerBiasCorrectionMBToND ->LoadHistograms(fileName, dir);
200 //____________________________________________________________________
202 AlidNdEtaCorrection::SaveHistograms() {
204 // save the histograms
207 gDirectory->mkdir(fName.Data());
208 gDirectory->cd(fName.Data());
210 fTrack2ParticleCorrection ->SaveHistograms();
211 fVertexRecoCorrection ->SaveHistograms();
212 fTriggerBiasCorrectionMBToINEL->SaveHistograms();
213 fTriggerBiasCorrectionMBToNSD ->SaveHistograms();
214 fTriggerBiasCorrectionMBToND ->SaveHistograms();
216 gDirectory->cd("../");
219 //____________________________________________________________________
220 void AlidNdEtaCorrection::DrawHistograms()
223 // call the draw histogram method of the two AliCorrectionMatrix2D objects
225 fTrack2ParticleCorrection ->DrawHistograms();
226 fVertexRecoCorrection ->DrawHistograms();
227 fTriggerBiasCorrectionMBToINEL->DrawHistograms();
228 fTriggerBiasCorrectionMBToNSD ->DrawHistograms();
229 fTriggerBiasCorrectionMBToND ->DrawHistograms();
233 //____________________________________________________________________
234 void AlidNdEtaCorrection::FillEventWithTrigger(Float_t vtx, Float_t n)
236 // fill events with trigger.
237 // used to calculate vertex reco and trigger bias corrections
239 fVertexRecoCorrection->FillGene(vtx, n);
240 fTriggerBiasCorrectionMBToINEL ->FillMeas(vtx, n);
241 fTriggerBiasCorrectionMBToNSD ->FillMeas(vtx, n);
242 fTriggerBiasCorrectionMBToND ->FillMeas(vtx, n);
245 //____________________________________________________________________
246 void AlidNdEtaCorrection::FillEventAll(Float_t vtx, Float_t n, Char_t* opt)
249 // used to calculate trigger bias corrections
251 if (strcmp(opt,"INEL")==0)
252 fTriggerBiasCorrectionMBToINEL->FillGene(vtx, n);
253 else if (strcmp(opt,"NSD")==0)
254 fTriggerBiasCorrectionMBToNSD->FillGene(vtx, n);
255 else if (strcmp(opt,"ND")==0)
256 fTriggerBiasCorrectionMBToND->FillGene(vtx, n);
258 AliDebug(AliLog::kWarning, Form(" event type %s unknown (use INEL, NSD or ND)",opt));
261 //____________________________________________________________________
262 AliCorrectionMatrix2D* AlidNdEtaCorrection::GetTriggerBiasCorrection(Char_t* opt)
264 // returning the trigger bias correction matrix
265 // option can be used to specify to which collision process (INEL, NSD or ND)
266 if (strcmp(opt,"INEL")==0)
267 return fTriggerBiasCorrectionMBToINEL;
268 else if (strcmp(opt,"NSD")==0)
269 return fTriggerBiasCorrectionMBToNSD;
270 else if (strcmp(opt,"ND")==0)
271 return fTriggerBiasCorrectionMBToND;
274 AliDebug(AliLog::kWarning, Form(" %s is unknown (use INEL, NSD or ND). returning INEL ",opt));
275 return fTriggerBiasCorrectionMBToINEL;
279 //____________________________________________________________________
280 Float_t AlidNdEtaCorrection::GetTriggerBiasCorrection(Float_t vtx, Float_t n, Char_t* opt)
282 // returning the trigger bias correction matrix
283 // 3rd option can be used to specify to which collision process (INEL, NSD or ND)
285 if (strcmp(opt,"INEL")==0)
286 return fTriggerBiasCorrectionMBToINEL->GetCorrection(vtx, n);
287 else if (strcmp(opt,"NSD")==0)
288 return fTriggerBiasCorrectionMBToNSD->GetCorrection(vtx, n);
289 else if (strcmp(opt,"ND")==0)
290 return fTriggerBiasCorrectionMBToND->GetCorrection(vtx, n);
292 AliDebug(AliLog::kWarning, Form(" %s unknown (use INEL, NSD or ND). returning corr for INEL",opt));
293 return fTriggerBiasCorrectionMBToINEL->GetCorrection(vtx, n);
298 //____________________________________________________________________
299 Float_t AlidNdEtaCorrection::GetMeasuredFraction(Float_t ptCutOff, Float_t eta, Bool_t debug)
301 // calculates the fraction of particles measured (some are missed due to the pt cut off)
302 // uses the generated particle histogram from fTrack2ParticleCorrection
304 const TH3F* generated = fTrack2ParticleCorrection->GetGeneratedHistogram();
306 // find eta borders, if eta is negative assume -0.8 ... 0.8
311 etaBegin = generated->GetYaxis()->FindBin(-0.8);
312 etaEnd = generated->GetYaxis()->FindBin(0.8);
316 etaBegin = generated->GetYaxis()->FindBin(eta);
320 Int_t vertexBegin = generated->GetXaxis()->FindBin(-10);
321 Int_t vertexEnd = generated->GetXaxis()->FindBin(10);
323 TH1D* ptProj = dynamic_cast<TH1D*> (generated->ProjectionZ(Form("%s_pt", generated->GetName()), vertexBegin, vertexEnd, etaBegin, etaEnd));
324 ptProj->GetXaxis()->SetTitle(generated->GetZaxis()->GetTitle());
326 Int_t ptBin = ptProj->FindBin(ptCutOff);
327 Float_t abovePtCut = ptProj->Integral(ptBin, ptProj->GetNbinsX());
328 Float_t all = ptProj->Integral();
333 Float_t fraction = abovePtCut / all;
344 printf("AlidNdEtaCorrection::GetMeasuredFraction: pt cut off = %f, eta = %f, => fraction = %f\n", ptCutOff, eta, fraction);
349 void AlidNdEtaCorrection::ReduceInformation()
351 // this function deletes the measured and generated histograms from the corrections to reduce the amount of data
354 // these are needed for GetMeasuredFraction(): fTrack2ParticleCorrection->ReduceInformation();
355 fVertexRecoCorrection ->ReduceInformation();
356 fTriggerBiasCorrectionMBToINEL ->ReduceInformation();
357 fTriggerBiasCorrectionMBToNSD ->ReduceInformation();
358 fTriggerBiasCorrectionMBToND ->ReduceInformation();