]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG0/dNdEta/AlidNdEtaCorrection.cxx
Changed selector to fit with the new AlidNdEtaCorrection scheme.
[u/mrichter/AliRoot.git] / PWG0 / dNdEta / AlidNdEtaCorrection.cxx
1 /* $Id$ */
2
3 #include "AlidNdEtaCorrection.h"
4
5 #include <AliLog.h>
6 #include <TCanvas.h>
7 #include <TH3F.h>
8 #include <TH1D.h>
9 #include <AliCorrection.h>
10 #include <AliCorrectionMatrix2D.h>
11 #include <AliCorrectionMatrix3D.h>
12
13 //____________________________________________________________________
14 ClassImp(AlidNdEtaCorrection)
15
16 //____________________________________________________________________
17 AlidNdEtaCorrection::AlidNdEtaCorrection()
18   : TNamed(),
19   fTrack2ParticleCorrection(0),
20   fVertexRecoCorrection(0),
21   fTriggerBiasCorrectionMBToINEL(0),
22   fTriggerBiasCorrectionMBToNSD(0),
23   fTriggerBiasCorrectionMBToND(0)
24 {
25   // default constructor
26 }
27
28 //____________________________________________________________________
29 AlidNdEtaCorrection::AlidNdEtaCorrection(const Char_t* name, const Char_t* title)
30   : TNamed(name, title),
31   fTrack2ParticleCorrection(0),
32   fVertexRecoCorrection(0),
33   fTriggerBiasCorrectionMBToINEL(0),
34   fTriggerBiasCorrectionMBToNSD(0),
35   fTriggerBiasCorrectionMBToND(0)
36 {
37   //
38   // constructor
39   //
40
41   fTrack2ParticleCorrection = new AliCorrection("Track2Particle", "Track2Particle");
42   fVertexRecoCorrection     = new AliCorrection("VertexReconstruction", "VertexReconstruction");
43
44   fTriggerBiasCorrectionMBToINEL = new AliCorrection("TriggerBias_MBToINEL", "TriggerBias_MBToINEL");
45   fTriggerBiasCorrectionMBToNSD  = new AliCorrection("TriggerBias_MBToNSD", "TriggerBias_MBToNSD");
46   fTriggerBiasCorrectionMBToND   = new AliCorrection("TriggerBias_MBToND", "TriggerBias_MBToND");
47 }
48
49 //____________________________________________________________________
50 AlidNdEtaCorrection::~AlidNdEtaCorrection()
51 {
52   // destructor
53
54   if (fTrack2ParticleCorrection) {
55     delete fTrack2ParticleCorrection;
56     fTrack2ParticleCorrection = 0;
57   }
58
59   if (fVertexRecoCorrection) {
60     delete fVertexRecoCorrection;
61     fVertexRecoCorrection = 0;
62   }
63
64   if (fTriggerBiasCorrectionMBToINEL) {
65     delete fTriggerBiasCorrectionMBToINEL;
66     fTriggerBiasCorrectionMBToINEL = 0;
67   }
68
69   if (fTriggerBiasCorrectionMBToNSD) {
70     delete fTriggerBiasCorrectionMBToNSD;
71     fTriggerBiasCorrectionMBToNSD = 0;
72   }
73
74   if (fTriggerBiasCorrectionMBToND) {
75     delete fTriggerBiasCorrectionMBToND;
76     fTriggerBiasCorrectionMBToND = 0;
77   }
78 }
79
80 //____________________________________________________________________
81 void
82 AlidNdEtaCorrection::Finish() {
83   //
84   // finish method
85   //
86   // divide the histograms in the AliCorrectionMatrix2D objects to get the corrections
87
88   fTrack2ParticleCorrection->Divide();
89   fVertexRecoCorrection->Divide();
90   fTriggerBiasCorrectionMBToINEL->Divide();
91   fTriggerBiasCorrectionMBToNSD->Divide();
92   fTriggerBiasCorrectionMBToND->Divide();
93 }
94
95 //____________________________________________________________________
96 Long64_t AlidNdEtaCorrection::Merge(TCollection* list)
97 {
98   // Merge a list of dNdEtaCorrection objects with this (needed for
99   // PROOF).
100   // Returns the number of merged objects (including this).
101
102   if (!list)
103     return 0;
104
105   if (list->IsEmpty())
106     return 1;
107
108   TIterator* iter = list->MakeIterator();
109   TObject* obj;
110
111   // collections of measured and generated histograms
112   TList* collectionNtrackToNparticle    = new TList;
113   TList* collectionVertexReco           = new TList;
114   TList* collectionTriggerBiasMBToINEL  = new TList;
115   TList* collectionTriggerBiasMBToNSD   = new TList;
116   TList* collectionTriggerBiasMBToND    = new TList;
117
118   Int_t count = 0;
119   while ((obj = iter->Next())) {
120
121     AlidNdEtaCorrection* entry = dynamic_cast<AlidNdEtaCorrection*> (obj);
122     if (entry == 0)
123       continue;
124
125     collectionNtrackToNparticle  ->Add(entry->fTrack2ParticleCorrection);
126     collectionVertexReco         ->Add(entry->fVertexRecoCorrection);
127     collectionTriggerBiasMBToINEL->Add(entry->fTriggerBiasCorrectionMBToINEL);
128     collectionTriggerBiasMBToNSD ->Add(entry->fTriggerBiasCorrectionMBToNSD);
129     collectionTriggerBiasMBToND  ->Add(entry->fTriggerBiasCorrectionMBToND);
130
131     count++;
132   }
133   fTrack2ParticleCorrection      ->Merge(collectionNtrackToNparticle);
134   fVertexRecoCorrection          ->Merge(collectionVertexReco);
135   fTriggerBiasCorrectionMBToINEL ->Merge(collectionTriggerBiasMBToINEL);
136   fTriggerBiasCorrectionMBToNSD  ->Merge(collectionTriggerBiasMBToNSD);
137   fTriggerBiasCorrectionMBToND   ->Merge(collectionTriggerBiasMBToND);
138
139   delete collectionNtrackToNparticle;
140   delete collectionVertexReco;
141   delete collectionTriggerBiasMBToINEL;
142   delete collectionTriggerBiasMBToNSD;
143   delete collectionTriggerBiasMBToND;
144
145   return count+1;
146 }
147
148 //____________________________________________________________________
149 Bool_t AlidNdEtaCorrection::LoadHistograms(const Char_t* dir)
150 {
151   //
152   // loads the histograms
153   // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
154   //
155
156   if (!dir)
157     dir = GetName();
158
159   if (!gDirectory->cd(dir))
160     return kFALSE;
161
162   fTrack2ParticleCorrection      ->LoadHistograms();
163   fVertexRecoCorrection          ->LoadHistograms();
164   fTriggerBiasCorrectionMBToINEL ->LoadHistograms();
165   fTriggerBiasCorrectionMBToNSD  ->LoadHistograms();
166   fTriggerBiasCorrectionMBToND   ->LoadHistograms();
167
168   gDirectory->cd("..");
169
170   return kTRUE;
171 }
172
173 //____________________________________________________________________
174 void AlidNdEtaCorrection::SaveHistograms()
175 {
176   //
177   // save the histograms
178   //
179
180   gDirectory->mkdir(fName.Data());
181   gDirectory->cd(fName.Data());
182
183   fTrack2ParticleCorrection     ->SaveHistograms();
184   fVertexRecoCorrection         ->SaveHistograms();
185   fTriggerBiasCorrectionMBToINEL->SaveHistograms();
186   fTriggerBiasCorrectionMBToNSD ->SaveHistograms();
187   fTriggerBiasCorrectionMBToND  ->SaveHistograms();
188
189   gDirectory->cd("..");
190 }
191
192 //____________________________________________________________________
193 void AlidNdEtaCorrection::DrawHistograms()
194 {
195   //
196   // call the draw histogram method of the correction
197   //
198
199   fTrack2ParticleCorrection     ->DrawHistograms();
200   fVertexRecoCorrection         ->DrawHistograms();
201   fTriggerBiasCorrectionMBToINEL->DrawHistograms();
202   fTriggerBiasCorrectionMBToNSD ->DrawHistograms();
203   fTriggerBiasCorrectionMBToND  ->DrawHistograms();
204 }
205
206 //____________________________________________________________________
207 void AlidNdEtaCorrection::FillMCParticle(Float_t vtx, Float_t eta, Float_t pt, Bool_t trigger, Bool_t vertex, Int_t processType)
208 {
209   // fills a particle in the corrections
210   // it is filled in generated or measured depending of the flags
211
212   fTriggerBiasCorrectionMBToINEL->GetTrackCorrection()->FillGene(vtx, eta, pt);
213
214   if (processType != 92 && processType != 93)
215     fTriggerBiasCorrectionMBToNSD->GetTrackCorrection()->FillGene(vtx, eta, pt);
216
217   if (processType!=92 && processType!=93 && processType!=94)
218     fTriggerBiasCorrectionMBToND->GetTrackCorrection()->FillGene(vtx, eta, pt);
219
220   if (!trigger)
221     return;
222
223   fTriggerBiasCorrectionMBToINEL->GetTrackCorrection()->FillMeas(vtx, eta, pt);
224   fTriggerBiasCorrectionMBToNSD->GetTrackCorrection()->FillMeas(vtx, eta, pt);
225   fTriggerBiasCorrectionMBToND->GetTrackCorrection()->FillMeas(vtx, eta, pt);
226   fVertexRecoCorrection->GetTrackCorrection()->FillGene(vtx, eta, pt);
227
228   if (!vertex)
229     return;
230
231   fVertexRecoCorrection->GetTrackCorrection()->FillMeas(vtx, eta, pt);
232   fTrack2ParticleCorrection->GetTrackCorrection()->FillGene(vtx, eta, pt);
233 }
234
235 //____________________________________________________________________
236 void AlidNdEtaCorrection::FillTrackedParticle(Float_t vtx, Float_t eta, Float_t pt)
237 {
238   // fills a tracked particle in the corrections
239
240   fTrack2ParticleCorrection->GetTrackCorrection()->FillMeas(vtx, eta, pt);
241 }
242
243 //____________________________________________________________________
244 void AlidNdEtaCorrection::FillEvent(Float_t vtx, Float_t n, Bool_t trigger, Bool_t vertex, Int_t processType)
245 {
246   // fills an event int he correction
247   // it is filled in generated or measured depending of the flags
248
249   fTriggerBiasCorrectionMBToINEL->GetEventCorrection()->FillGene(vtx, n);
250
251   if (processType != 92 && processType != 93)
252     fTriggerBiasCorrectionMBToNSD->GetEventCorrection()->FillGene(vtx, n);
253
254   if (processType!=92 && processType!=93 && processType!=94)
255     fTriggerBiasCorrectionMBToND->GetEventCorrection()->FillGene(vtx, n);
256
257   if (!trigger)
258     return;
259
260   fTriggerBiasCorrectionMBToINEL->GetEventCorrection()->FillMeas(vtx, n);
261   fTriggerBiasCorrectionMBToNSD->GetEventCorrection()->FillMeas(vtx, n);
262   fTriggerBiasCorrectionMBToND->GetEventCorrection()->FillMeas(vtx, n);
263   fVertexRecoCorrection->GetEventCorrection()->FillGene(vtx, n);
264
265   if (!vertex)
266     return;
267
268   fVertexRecoCorrection->GetEventCorrection()->FillMeas(vtx, n);
269 }
270
271 //____________________________________________________________________
272 Float_t AlidNdEtaCorrection::GetMeasuredFraction(CorrectionType correctionType, Float_t ptCutOff, Float_t eta, Bool_t debug)
273 {
274   // calculates the fraction of particles measured (some are missed due to the pt cut off)
275   //
276   // uses the generated particle histogram from the correction passed, e.g. pass GetTrack2ParticleCorrection()
277
278   const TH3F* generated = 0;
279
280   switch (correctionType)
281   {
282     case kNone : return -1;
283     case kTrack2Particle : generated = fTrack2ParticleCorrection->GetTrackCorrection()->GetGeneratedHistogram(); break;
284     case kVertexReco : generated = fVertexRecoCorrection->GetTrackCorrection()->GetGeneratedHistogram(); break;
285     case kINEL : generated = fTriggerBiasCorrectionMBToINEL->GetTrackCorrection()->GetGeneratedHistogram(); break;
286     case kNSD: generated = fTriggerBiasCorrectionMBToNSD->GetTrackCorrection()->GetGeneratedHistogram(); break;
287     case kND: generated = fTriggerBiasCorrectionMBToND->GetTrackCorrection()->GetGeneratedHistogram(); break;
288   }
289   
290   // find eta borders, if eta is negative assume -0.8 ... 0.8
291   Int_t etaBegin = 0;
292   Int_t etaEnd = 0;
293   if (eta < -99)
294   {
295     etaBegin = generated->GetYaxis()->FindBin(-0.8);
296     etaEnd = generated->GetYaxis()->FindBin(0.8);
297   }
298   else
299   {
300     etaBegin = generated->GetYaxis()->FindBin(eta);
301     etaEnd = etaBegin;
302   }
303
304   Int_t vertexBegin = generated->GetXaxis()->FindBin(-4.99);
305   Int_t vertexEnd = generated->GetXaxis()->FindBin(4.99);
306
307   TH1D* ptProj = dynamic_cast<TH1D*> (generated->ProjectionZ(Form("%s_pt", generated->GetName()), vertexBegin, vertexEnd, etaBegin, etaEnd));
308   //printf("GetMeasuredFraction: bin range %d %d %d %d\n", vertexBegin, vertexEnd, etaBegin, etaEnd);
309   ptProj->GetXaxis()->SetTitle(generated->GetZaxis()->GetTitle());
310
311   Int_t ptBin = ptProj->FindBin(ptCutOff);
312   //printf("GetMeasuredFraction: bin range %d %d\n", ptBin, ptProj->GetNbinsX());
313   Float_t abovePtCut = ptProj->Integral(ptBin, ptProj->GetNbinsX());
314   Float_t all = ptProj->Integral();
315
316   if (all == 0)
317     return -1;
318
319   Float_t fraction = abovePtCut / all;
320
321   //printf("GetMeasuredFraction: all %f above %f fraction %f\n", all, abovePtCut, fraction);
322
323   if (debug)
324   {
325     new TCanvas;
326     ptProj->Draw();
327   }
328   else
329     delete ptProj;
330
331   if (debug)
332     printf("AlidNdEtaCorrection::GetMeasuredFraction: pt cut off = %f, eta = %f, => fraction = %f\n", ptCutOff, eta, fraction);
333
334   return fraction;
335 }
336
337 //____________________________________________________________________
338 void AlidNdEtaCorrection::ReduceInformation()
339 {
340   // this function deletes the measured and generated histograms from the corrections to reduce the amount of data
341   // in memory
342
343   // these are needed for GetMeasuredFraction(): fTrack2ParticleCorrection->ReduceInformation();
344   fVertexRecoCorrection          ->ReduceInformation();
345   fTriggerBiasCorrectionMBToINEL ->ReduceInformation();
346   fTriggerBiasCorrectionMBToNSD  ->ReduceInformation();
347   fTriggerBiasCorrectionMBToND   ->ReduceInformation();
348 }
349