]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/AliFMDCorrector.cxx
Many changes in one.
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliFMDCorrector.cxx
1 //
2 // This class calculates the exclusive charged particle density
3 // in each for the 5 FMD rings. 
4 //
5 #include "AliFMDCorrector.h"
6 #include <AliESDFMD.h>
7 #include <TAxis.h>
8 #include <TList.h>
9 #include <TMath.h>
10 #include "AliForwardCorrectionManager.h"
11 // #include "AliFMDCorrDoubleHit.h"
12 #include "AliFMDCorrVertexBias.h"
13 #include "AliFMDCorrMergingEfficiency.h"
14 #include "AliFMDCorrAcceptance.h"
15 #include "AliLog.h"
16 #include <TH2D.h>
17 #include <TROOT.h>
18 #include <THStack.h>
19 #include <iostream>
20 #include <iomanip>
21
22 ClassImp(AliFMDCorrector)
23 #if 0
24 ; // For Emacs
25 #endif 
26
27 //____________________________________________________________________
28 AliFMDCorrector::AliFMDCorrector()
29   : TNamed(), 
30     fRingHistos(),
31     fUseSecondaryMap(true),
32     fUseVertexBias(false),
33     fUseAcceptance(true),
34     fUseMergingEfficiency(false),
35     fDebug(0)
36 {
37   // Constructor
38   DGUARD(fDebug, 3, "Default CTOR of AliFMDCorrector");
39 }
40
41 //____________________________________________________________________
42 AliFMDCorrector::AliFMDCorrector(const char* title)
43   : TNamed("fmdCorrector", title), 
44     fRingHistos(), 
45     fUseSecondaryMap(true),
46     fUseVertexBias(false),
47     fUseAcceptance(true),
48     fUseMergingEfficiency(false),
49     fDebug(0)
50 {
51   // Constructor 
52   // 
53   // Parameters: 
54   //   title   Title
55   DGUARD(fDebug, 3, "Named CTOR of AliFMDCorrector: %s", title);
56   fRingHistos.SetName(GetName());
57   fRingHistos.Add(new RingHistos(1, 'I'));
58   fRingHistos.Add(new RingHistos(2, 'I'));
59   fRingHistos.Add(new RingHistos(2, 'O'));
60   fRingHistos.Add(new RingHistos(3, 'I'));
61   fRingHistos.Add(new RingHistos(3, 'O'));
62 }
63
64 //____________________________________________________________________
65 AliFMDCorrector::AliFMDCorrector(const AliFMDCorrector& o)
66   : TNamed(o), 
67     fRingHistos(), 
68     fUseSecondaryMap(o.fUseSecondaryMap),
69     fUseVertexBias(o.fUseVertexBias),
70     fUseAcceptance(o.fUseAcceptance),
71     fUseMergingEfficiency(o.fUseMergingEfficiency),
72     fDebug(o.fDebug)
73 {
74   // Copy constructor 
75   // 
76   // Parameters: 
77   //  o  Object to copy from 
78   DGUARD(fDebug, 3, "Copy CTOR of AliFMDCorrector");
79   TIter    next(&o.fRingHistos);
80   TObject* obj = 0;
81   while ((obj = next())) fRingHistos.Add(obj);
82 }
83
84 //____________________________________________________________________
85 AliFMDCorrector::~AliFMDCorrector()
86 {
87   // Destructor 
88   // 
89   // 
90   DGUARD(fDebug, 3, "DTOR of AliFMDCorrector");
91   fRingHistos.Delete();
92 }
93
94 //____________________________________________________________________
95 AliFMDCorrector&
96 AliFMDCorrector::operator=(const AliFMDCorrector& o)
97 {
98   // Assignment operator 
99   // 
100   // Parameters:
101   //   o   Object to assign from 
102   DGUARD(fDebug, 3, "Assignment of AliFMDCorrector");
103   if (&o == this) return *this; 
104   TNamed::operator=(o);
105
106   fDebug   = o.fDebug;
107   fRingHistos.Delete();
108   fUseSecondaryMap = o.fUseSecondaryMap;
109   fUseVertexBias = o.fUseVertexBias;
110   fUseAcceptance = o.fUseAcceptance;
111   fUseMergingEfficiency = o.fUseMergingEfficiency;
112   TIter    next(&o.fRingHistos);
113   TObject* obj = 0;
114   while ((obj = next())) fRingHistos.Add(obj);
115   
116   return *this;
117 }
118
119 //____________________________________________________________________
120 void
121 AliFMDCorrector::Init(const TAxis&)
122 {
123   //
124   // Initialize this object
125   //
126   // Parameters:
127   //    etaAxis Eta axis to use
128   //
129   DGUARD(fDebug, 1, "Initialization of AliFMDCorrector");
130   if (!fUseSecondaryMap)
131     AliWarning("Secondary maps not used - BE CAREFUL");
132   if (!fUseVertexBias)
133     AliWarning("Vertex bias not used");
134   if (!fUseAcceptance)
135     AliWarning("Acceptance from dead-channels not used");
136 }
137
138 //____________________________________________________________________
139 AliFMDCorrector::RingHistos*
140 AliFMDCorrector::GetRingHistos(UShort_t d, Char_t r) const
141 {
142   // 
143   // Get the ring histogram container 
144   // Parameters:
145   //    d Detector
146   //    r Ring 
147   // 
148   // Return:
149   //    Ring histogram container 
150   //
151   Int_t idx = -1;
152   switch (d) { 
153   case 1: idx = 0; break;
154   case 2: idx = 1 + (r == 'I' || r == 'i' ? 0 : 1); break;
155   case 3: idx = 3 + (r == 'I' || r == 'i' ? 0 : 1); break;
156   }
157   if (idx < 0 || idx >= fRingHistos.GetEntries()) return 0;
158   
159   return static_cast<RingHistos*>(fRingHistos.At(idx));
160 }
161     
162 //____________________________________________________________________
163 void
164 AliFMDCorrector::DivideMap(TH2* num, const TH2* denom,
165                            Bool_t alsoUnderOver) const
166 {
167   // 
168   // Implement TH1::Divide but 
169   // - Assume compatible histograms 
170   // - Unless third argument is true, do not divide over/under flow bins
171   // 
172   if (!num || !denom) return;
173
174   Int_t first = (alsoUnderOver ? 0 : 1);
175   Int_t lastX = num->GetNbinsX() + (alsoUnderOver ? 1 : 0);
176   Int_t lastY = num->GetNbinsY() + (alsoUnderOver ? 1 : 0);
177   
178   for (Int_t ix = first; ix <= lastX; ix++) {
179     for (Int_t iy = first; iy <= lastY; iy++) { 
180       Int_t    bin = num->GetBin(ix,iy);
181       Double_t c0  = num->GetBinContent(bin);
182       Double_t c1  = denom->GetBinContent(bin);
183       if (!c1) { 
184         num->SetBinContent(bin,0);
185         num->SetBinError(bin, 0);
186         continue;
187       }
188       Double_t w   = c0 / c1;
189       Double_t e0  = num->GetBinError(bin);
190       Double_t e1  = denom->GetBinError(bin);
191       Double_t c12 = c1*c1;
192       Double_t e2  = (e0*e0*c1*c1 + e1*e1*c0*c0)/(c12*c12);
193       
194       num->SetBinContent(bin, w);
195       num->SetBinError(bin, TMath::Sqrt(e2));
196     }
197   }
198 }
199 //____________________________________________________________________
200 Bool_t
201 AliFMDCorrector::Correct(AliForwardUtil::Histos& hists,
202                          UShort_t                vtxbin)
203 {
204   // 
205   // Do the calculations 
206   // Parameters:
207   //    hists    Cache of histograms 
208   //    vtxBin   Vertex bin 
209   // 
210   // Return:
211   //    true on successs 
212   //
213   DGUARD(fDebug, 1, "Correct histograms of AliFMDCorrector");
214   AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
215
216   UShort_t uvb = vtxbin;
217   for (UShort_t d=1; d<=3; d++) { 
218     UShort_t nr = (d == 1 ? 1 : 2);
219     for (UShort_t q=0; q<nr; q++) { 
220       Char_t      r  = (q == 0 ? 'I' : 'O');
221       TH2D*       h  = hists.Get(d,r);
222       RingHistos* rh = GetRingHistos(d,r);
223
224       if (fUseSecondaryMap) {
225         TH2D*  bg = fcm.GetSecondaryMap()->GetCorrection(d, r, uvb);
226         if (!bg) {
227           AliWarning(Form("No secondary correction for FMDM%d%c "
228                           "in vertex bin %d", d, r, uvb));
229           continue;
230         }
231         // Divide by primary/total ratio
232         DivideMap(h, bg, false);
233       }
234       if (fUseVertexBias) {
235         TH2D*  ef = fcm.GetVertexBias()->GetCorrection(r, uvb);
236         if (!ef) {
237           AliWarning(Form("No event %s vertex bias correction in vertex bin %d",
238                           (r == 'I' || r == 'i' ? "inner" : "outer"), uvb));
239           continue;
240         }
241         // Divide by the event selection efficiency
242         DivideMap(h, ef, false);
243       }
244       if (fUseAcceptance) {
245         TH2D*  ac = fcm.GetAcceptance()->GetCorrection(d, r, uvb);
246         if (!ac) {
247           AliWarning(Form("No acceptance correction for FMD%d%c in "
248                           "vertex bin %d", d, r, uvb));
249           continue;
250         }
251         // Fill overflow bin with ones 
252         for (Int_t i = 1; i <= h->GetNbinsX(); i++) 
253           h->SetBinContent(i, h->GetNbinsY()+1, 1);
254
255         // Divide by the acceptance correction - 
256         DivideMap(h, ac, fcm.GetAcceptance()->HasOverflow());
257       }
258
259       if (fUseMergingEfficiency) {
260         if (!fcm.GetMergingEfficiency()) { 
261           AliWarning("No merging efficiencies");
262           continue;
263         }
264         TH1D* sf = fcm.GetMergingEfficiency()->GetCorrection(d,r,uvb);
265         if (!fcm.GetMergingEfficiency()->GetCorrection(d,r,uvb)) { 
266           AliWarning(Form("No merging efficiency for FMD%d%c at vertex bin %d",
267                           d, r, uvb));
268           continue;
269         }
270         
271       
272         for (Int_t ieta = 1; ieta <= h->GetNbinsX(); ieta++) {
273           Float_t c  = sf->GetBinContent(ieta);
274           Float_t ec = sf->GetBinError(ieta);
275                   
276           for (Int_t iphi = 1; iphi <= h->GetNbinsY(); iphi++) { 
277             if (c == 0) {
278               h->SetBinContent(ieta,iphi,0);
279               h->SetBinError(ieta,iphi,0);
280               continue;
281             }
282
283             Double_t m  = h->GetBinContent(ieta, iphi) / c;
284             Double_t em = h->GetBinError(ieta, iphi);
285           
286             Double_t e  = TMath::Sqrt(em * em + (m * ec) * (m * ec));
287             
288             h->SetBinContent(ieta,iphi,m);
289             h->SetBinError(ieta,iphi,e);
290           }
291         }
292       }
293       
294       rh->fDensity->Add(h);
295     }
296   }
297   
298   return kTRUE;
299 }
300
301 //____________________________________________________________________
302 void
303 AliFMDCorrector::ScaleHistograms(const TList* dir, Int_t nEvents)
304 {
305   // 
306   // Scale the histograms to the total number of events 
307   // Parameters:
308   //    dir     Where the output is stored
309   //    nEvents Number of events 
310   //
311   DGUARD(fDebug, 1, "Scale histograms of AliFMDCorrector");
312   if (nEvents <= 0) return;
313   TList* d = static_cast<TList*>(dir->FindObject(GetName()));
314   if (!d) return;
315
316   TIter    next(&fRingHistos);
317   RingHistos* o = 0;
318   THStack* sums = new THStack("sums", "Sums of ring results");
319   while ((o = static_cast<RingHistos*>(next()))) {
320     o->ScaleHistograms(d, nEvents);
321     TH1D* sum = o->fDensity->ProjectionX(o->GetName(), 1, 
322                                          o->fDensity->GetNbinsY(),"e");
323     sum->Scale(1., "width");
324     sum->SetTitle(o->GetName());
325     sum->SetDirectory(0);
326     sum->SetYTitle("#sum N_{ch,primary}");
327     sums->Add(sum);
328   }
329   d->Add(sums);
330
331 }
332 //____________________________________________________________________
333 void
334 AliFMDCorrector::DefineOutput(TList* dir)
335 {
336   // 
337   // Output diagnostic histograms to directory 
338   // 
339   // Parameters:
340   //    dir List to write in
341   //  
342   DGUARD(fDebug, 1, "Define output of AliFMDCorrector");
343   TList* d = new TList;
344   d->SetName(GetName());
345   dir->Add(d);
346
347   d->Add(AliForwardUtil::MakeParameter("secondary", fUseSecondaryMap));
348   d->Add(AliForwardUtil::MakeParameter("vertexBias", fUseVertexBias));
349   d->Add(AliForwardUtil::MakeParameter("acceptance", fUseAcceptance));
350   d->Add(AliForwardUtil::MakeParameter("merging", fUseMergingEfficiency));
351   
352
353   TIter    next(&fRingHistos);
354   RingHistos* o = 0;
355   while ((o = static_cast<RingHistos*>(next()))) {
356     o->Output(d);
357   }
358 }
359
360 //____________________________________________________________________
361 void
362 AliFMDCorrector::Print(Option_t* /* option */) const
363 {
364   // 
365   // Print information
366   // Parameters:
367   //    option Not used 
368   //
369   char ind[gROOT->GetDirLevel()+1];
370   for (Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] = ' ';
371   ind[gROOT->GetDirLevel()] = '\0';
372   std::cout << ind << ClassName() << ": " << GetName() <<  "\n"
373             << std::boolalpha
374             << ind << " Use secondary maps:     " << fUseSecondaryMap << "\n"
375             << ind << " Use vertex bias:        " << fUseVertexBias << "\n"
376             << ind << " Use acceptance:         " << fUseAcceptance << "\n"
377             << ind << " Use merging efficiency: " << fUseMergingEfficiency
378             << std::noboolalpha << std::endl;
379 }
380
381 //====================================================================
382 AliFMDCorrector::RingHistos::RingHistos()
383   : AliForwardUtil::RingHistos(), 
384     fDensity(0)
385 {
386   // Constructor 
387   //
388   // 
389 }
390
391 //____________________________________________________________________
392 AliFMDCorrector::RingHistos::RingHistos(UShort_t d, Char_t r)
393   : AliForwardUtil::RingHistos(d,r), 
394     fDensity(0)
395 {
396   // 
397   // Constructor
398   // Parameters:
399   //    d detector
400   //    r ring 
401   //
402   fDensity = new TH2D("primaryDensity", 
403                       "#sum N_{ch,primary}/(#Delta#eta#Delta#phi)", 
404                       200, -4, 6, (r == 'I' || r == 'i' ? 20 : 40), 
405                       0, 2*TMath::Pi());
406   fDensity->SetDirectory(0);
407   fDensity->SetMarkerColor(Color());
408   fDensity->Sumw2();
409   fDensity->SetXTitle("#eta");
410   fDensity->SetYTitle("#phi [radians]");
411   fDensity->SetZTitle("Primary N_{ch} density");
412 }
413 //____________________________________________________________________
414 AliFMDCorrector::RingHistos::RingHistos(const RingHistos& o)
415   : AliForwardUtil::RingHistos(o), 
416     fDensity(o.fDensity)
417 {
418   // 
419   // Copy constructor 
420   // Parameters:
421   //    o Object to copy from 
422   //
423 }
424
425 //____________________________________________________________________
426 AliFMDCorrector::RingHistos&
427 AliFMDCorrector::RingHistos::operator=(const RingHistos& o)
428 {
429   // 
430   // Assignment operator 
431   // Parameters:
432   //    o Object to assign from 
433   // 
434   // Return:
435   //    Reference to this 
436   //
437   if (&o == this) return *this; 
438   AliForwardUtil::RingHistos::operator=(o);
439   
440   if (fDensity) delete fDensity;
441   
442   fDensity = static_cast<TH2D*>(o.fDensity->Clone());
443   
444   return *this;
445 }
446 //____________________________________________________________________
447 AliFMDCorrector::RingHistos::~RingHistos()
448 {
449   // 
450   // Destructor 
451   //
452   // if (fDensity) delete fDensity;
453 }
454
455 //____________________________________________________________________
456 void
457 AliFMDCorrector::RingHistos::Output(TList* dir)
458 {
459   // 
460   // Make output 
461   // Parameters:
462   //    dir Where to put it 
463   //
464   TList* d = DefineOutputList(dir);
465   d->Add(fDensity);
466 }
467
468 //____________________________________________________________________
469 void
470 AliFMDCorrector::RingHistos::ScaleHistograms(TList* dir, Int_t nEvents)
471
472   // 
473   // Scale the histograms to the total number of events 
474   // Parameters:
475   //    dir     where the output is stored
476   //    nEvents Number of events 
477   //
478   TList* l = GetOutputList(dir);
479   if (!l) return; 
480
481   TH1* density = GetOutputHist(l,"primaryDensity");
482   if (density) density->Scale(1./nEvents);
483 }
484
485 //____________________________________________________________________
486 //
487 // EOF
488 //
489           
490
491