]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/FORWARD/analysis2/AliFMDCorrector.cxx
Fix coding violations
[u/mrichter/AliRoot.git] / PWG2 / 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 <iostream>
19 #include <iomanip>
20
21 ClassImp(AliFMDCorrector)
22 #if 0
23 ; // For Emacs
24 #endif 
25
26 //____________________________________________________________________
27 AliFMDCorrector::AliFMDCorrector()
28   : TNamed(), 
29     fRingHistos(),
30     fUseSecondaryMap(true),
31     fUseVertexBias(false),
32     fUseAcceptance(true),
33     fUseMergingEfficiency(false),
34     fDebug(0)
35 {
36   // Constructor
37 }
38
39 //____________________________________________________________________
40 AliFMDCorrector::AliFMDCorrector(const char* title)
41   : TNamed("fmdCorrector", title), 
42     fRingHistos(), 
43     fUseSecondaryMap(true),
44     fUseVertexBias(false),
45     fUseAcceptance(true),
46     fUseMergingEfficiency(false),
47     fDebug(0)
48 {
49   // Constructor 
50   // 
51   // Parameters: 
52   //   title   Title
53   fRingHistos.SetName(GetName());
54   fRingHistos.Add(new RingHistos(1, 'I'));
55   fRingHistos.Add(new RingHistos(2, 'I'));
56   fRingHistos.Add(new RingHistos(2, 'O'));
57   fRingHistos.Add(new RingHistos(3, 'I'));
58   fRingHistos.Add(new RingHistos(3, 'O'));
59 }
60
61 //____________________________________________________________________
62 AliFMDCorrector::AliFMDCorrector(const AliFMDCorrector& o)
63   : TNamed(o), 
64     fRingHistos(), 
65     fUseSecondaryMap(o.fUseSecondaryMap),
66     fUseVertexBias(o.fUseVertexBias),
67     fUseAcceptance(o.fUseAcceptance),
68     fUseMergingEfficiency(o.fUseMergingEfficiency),
69     fDebug(o.fDebug)
70 {
71   // Copy constructor 
72   // 
73   // Parameters: 
74   //  o  Object to copy from 
75   TIter    next(&o.fRingHistos);
76   TObject* obj = 0;
77   while ((obj = next())) fRingHistos.Add(obj);
78 }
79
80 //____________________________________________________________________
81 AliFMDCorrector::~AliFMDCorrector()
82 {
83   // Destructor 
84   // 
85   // 
86   fRingHistos.Delete();
87 }
88
89 //____________________________________________________________________
90 AliFMDCorrector&
91 AliFMDCorrector::operator=(const AliFMDCorrector& o)
92 {
93   // Assignment operator 
94   // 
95   // Parameters:
96   //   o   Object to assign from 
97   TNamed::operator=(o);
98
99   fDebug   = o.fDebug;
100   fRingHistos.Delete();
101   fUseSecondaryMap = o.fUseSecondaryMap;
102   fUseVertexBias = o.fUseVertexBias;
103   fUseAcceptance = o.fUseAcceptance;
104   fUseMergingEfficiency = o.fUseMergingEfficiency;
105   TIter    next(&o.fRingHistos);
106   TObject* obj = 0;
107   while ((obj = next())) fRingHistos.Add(obj);
108   
109   return *this;
110 }
111
112 //____________________________________________________________________
113 void
114 AliFMDCorrector::Init(const TAxis&)
115 {
116   //
117   // Initialize this object
118   //
119   // Parameters:
120   //    etaAxis Eta axis to use
121   //
122   if (!fUseSecondaryMap)
123     AliWarning("Secondary maps not used - BE CAREFUL");
124   if (!fUseVertexBias)
125     AliWarning("Vertex bias not used");
126   if (!fUseAcceptance)
127     AliWarning("Acceptance from dead-channels not used");
128 }
129
130 //____________________________________________________________________
131 AliFMDCorrector::RingHistos*
132 AliFMDCorrector::GetRingHistos(UShort_t d, Char_t r) const
133 {
134   // 
135   // Get the ring histogram container 
136   // Parameters:
137   //    d Detector
138   //    r Ring 
139   // 
140   // Return:
141   //    Ring histogram container 
142   //
143   Int_t idx = -1;
144   switch (d) { 
145   case 1: idx = 0; break;
146   case 2: idx = 1 + (r == 'I' || r == 'i' ? 0 : 1); break;
147   case 3: idx = 3 + (r == 'I' || r == 'i' ? 0 : 1); break;
148   }
149   if (idx < 0 || idx >= fRingHistos.GetEntries()) return 0;
150   
151   return static_cast<RingHistos*>(fRingHistos.At(idx));
152 }
153     
154 //____________________________________________________________________
155 Bool_t
156 AliFMDCorrector::Correct(AliForwardUtil::Histos& hists,
157                          UShort_t                vtxbin)
158 {
159   // 
160   // Do the calculations 
161   // Parameters:
162   //    hists    Cache of histograms 
163   //    vtxBin   Vertex bin 
164   // 
165   // Return:
166   //    true on successs 
167   //
168   AliForwardCorrectionManager& fcm = AliForwardCorrectionManager::Instance();
169
170   UShort_t uvb = vtxbin;
171   for (UShort_t d=1; d<=3; d++) { 
172     UShort_t nr = (d == 1 ? 1 : 2);
173     for (UShort_t q=0; q<nr; q++) { 
174       Char_t      r  = (q == 0 ? 'I' : 'O');
175       TH2D*       h  = hists.Get(d,r);
176       RingHistos* rh = GetRingHistos(d,r);
177
178       if (fUseSecondaryMap) {
179         TH2D*  bg = fcm.GetSecondaryMap()->GetCorrection(d, r, uvb);
180         if (!bg) {
181           AliWarning(Form("No secondary correction for FMDM%d%c in vertex bin %d",
182                           d, r, uvb));
183           continue;
184         }
185         // Divide by primary/total ratio
186         h->Divide(bg);
187       }
188       if (fUseVertexBias) {
189         TH2D*  ef = fcm.GetVertexBias()->GetCorrection(r, uvb);
190         if (!ef) {
191           AliWarning(Form("No event %s vertex bias correction in vertex bin %d",
192                           (r == 'I' || r == 'i' ? "inner" : "outer"), uvb));
193           continue;
194         }
195         // Divide by the event selection efficiency
196         h->Divide(ef);
197       }
198       if (fUseAcceptance) {
199         TH2D*  ac = fcm.GetAcceptance()->GetCorrection(d, r, uvb);
200         if (!ac) {
201           AliWarning(Form("No acceptance correction for FMD%d%c in vertex bin %d",
202                         d, r, uvb));
203           continue;
204         }
205         // Divide by the acceptance correction
206         h->Divide(ac);
207       }
208
209
210
211       
212
213       if (fUseMergingEfficiency) {
214         if (!fcm.GetMergingEfficiency()) { 
215           AliWarning("No merging efficiencies");
216           continue;
217         }
218         TH1D* sf = fcm.GetMergingEfficiency()->GetCorrection(d,r,uvb);
219         if (!fcm.GetMergingEfficiency()->GetCorrection(d,r,uvb)) { 
220           AliWarning(Form("No merging efficiency for FMD%d%c at vertex bin %d",
221                           d, r, uvb));
222           continue;
223         }
224         
225       
226         for (Int_t ieta = 1; ieta <= h->GetNbinsX(); ieta++) {
227           Float_t c  = sf->GetBinContent(ieta);
228           Float_t ec = sf->GetBinError(ieta);
229           
230           if (c == 0) continue;
231           
232           for (Int_t iphi = 1; iphi <= h->GetNbinsY(); iphi++) { 
233             Double_t m  = h->GetBinContent(ieta, iphi) / c;
234             Double_t em = h->GetBinError(ieta, iphi);
235           
236             Double_t e  = TMath::Sqrt(em * em + (m * ec) * (m * ec));
237             
238             h->SetBinContent(ieta,iphi,m);
239             h->SetBinError(ieta,iphi,e);
240           }
241         }
242       }
243       rh->fDensity->Add(h);
244     }
245   }
246   
247   return kTRUE;
248 }
249
250 //____________________________________________________________________
251 void
252 AliFMDCorrector::ScaleHistograms(const TList* dir, Int_t nEvents)
253 {
254   // 
255   // Scale the histograms to the total number of events 
256   // Parameters:
257   //    dir     Where the output is stored
258   //    nEvents Number of events 
259   //
260   if (nEvents <= 0) return;
261   TList* d = static_cast<TList*>(dir->FindObject(GetName()));
262   if (!d) return;
263
264   TIter    next(&fRingHistos);
265   RingHistos* o = 0;
266   while ((o = static_cast<RingHistos*>(next())))
267     o->ScaleHistograms(d, nEvents);
268 }
269 //____________________________________________________________________
270 void
271 AliFMDCorrector::DefineOutput(TList* dir)
272 {
273   // 
274   // Output diagnostic histograms to directory 
275   // 
276   // Parameters:
277   //    dir List to write in
278   //  
279   TList* d = new TList;
280   d->SetName(GetName());
281   dir->Add(d);
282   TIter    next(&fRingHistos);
283   RingHistos* o = 0;
284   while ((o = static_cast<RingHistos*>(next()))) {
285     o->Output(d);
286   }
287 }
288
289 //____________________________________________________________________
290 void
291 AliFMDCorrector::Print(Option_t* /* option */) const
292 {
293   // 
294   // Print information
295   // Parameters:
296   //    option Not used 
297   //
298   char ind[gROOT->GetDirLevel()+1];
299   for (Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] = ' ';
300   ind[gROOT->GetDirLevel()] = '\0';
301   std::cout << ind << "AliFMDCorrector: " << GetName() <<  "\n"
302             << std::boolalpha
303             << ind << " Use secondary maps:     " << fUseSecondaryMap << "\n"
304             << ind << " Use vertex bias:        " << fUseVertexBias << "\n"
305             << ind << " Use acceptance:         " << fUseAcceptance << "\n"
306             << ind << " Use merging efficiency: " << fUseMergingEfficiency
307             << std::noboolalpha << std::endl;
308 }
309
310 //====================================================================
311 AliFMDCorrector::RingHistos::RingHistos()
312   : AliForwardUtil::RingHistos(), 
313     fDensity(0)
314 {
315   // Constructor 
316   //
317   // 
318 }
319
320 //____________________________________________________________________
321 AliFMDCorrector::RingHistos::RingHistos(UShort_t d, Char_t r)
322   : AliForwardUtil::RingHistos(d,r), 
323     fDensity(0)
324 {
325   // 
326   // Constructor
327   // Parameters:
328   //    d detector
329   //    r ring 
330   //
331   fDensity = new TH2D(Form("FMD%d%c_Primary_Density", d, r), 
332                       Form("in FMD%d%c", d, r), 
333                       200, -4, 6, (r == 'I' || r == 'i' ? 20 : 40), 
334                       0, 2*TMath::Pi());
335   fDensity->SetDirectory(0);
336   fDensity->SetXTitle("#eta");
337   fDensity->SetYTitle("#phi [radians]");
338   fDensity->SetZTitle("Primary N_{ch} density");
339 }
340 //____________________________________________________________________
341 AliFMDCorrector::RingHistos::RingHistos(const RingHistos& o)
342   : AliForwardUtil::RingHistos(o), 
343     fDensity(o.fDensity)
344 {
345   // 
346   // Copy constructor 
347   // Parameters:
348   //    o Object to copy from 
349   //
350 }
351
352 //____________________________________________________________________
353 AliFMDCorrector::RingHistos&
354 AliFMDCorrector::RingHistos::operator=(const RingHistos& o)
355 {
356   // 
357   // Assignment operator 
358   // Parameters:
359   //    o Object to assign from 
360   // 
361   // Return:
362   //    Reference to this 
363   //
364   AliForwardUtil::RingHistos::operator=(o);
365   
366   if (fDensity) delete fDensity;
367   
368   fDensity = static_cast<TH2D*>(o.fDensity->Clone());
369   
370   return *this;
371 }
372 //____________________________________________________________________
373 AliFMDCorrector::RingHistos::~RingHistos()
374 {
375   // 
376   // Destructor 
377   //
378   if (fDensity) delete fDensity;
379 }
380
381 //____________________________________________________________________
382 void
383 AliFMDCorrector::RingHistos::Output(TList* dir)
384 {
385   // 
386   // Make output 
387   // Parameters:
388   //    dir Where to put it 
389   //
390   TList* d = DefineOutputList(dir);
391   d->Add(fDensity);
392 }
393
394 //____________________________________________________________________
395 void
396 AliFMDCorrector::RingHistos::ScaleHistograms(TList* dir, Int_t nEvents)
397
398   // 
399   // Scale the histograms to the total number of events 
400   // Parameters:
401   //    dir     where the output is stored
402   //    nEvents Number of events 
403   //
404   TList* l = GetOutputList(dir);
405   if (!l) return; 
406
407   TH1* density = GetOutputHist(l,Form("%s_Primary_Density", fName.Data()));
408   if (density) density->Scale(1./nEvents);
409 }
410
411 //____________________________________________________________________
412 //
413 // EOF
414 //
415           
416
417