1 #include "AliFMDDensityCalculator.h"
6 #include "AliFMDAnaParameters.h"
10 ClassImp(AliFMDDensityCalculator)
15 //____________________________________________________________________
16 AliFMDDensityCalculator::AliFMDDensityCalculator()
22 //____________________________________________________________________
23 AliFMDDensityCalculator::AliFMDDensityCalculator(const char* title)
24 : TNamed("fmdDensityCalculator", title),
28 fRingHistos.SetName(GetName());
29 fRingHistos.Add(new RingHistos(1, 'I'));
30 fRingHistos.Add(new RingHistos(2, 'I'));
31 fRingHistos.Add(new RingHistos(2, 'O'));
32 fRingHistos.Add(new RingHistos(3, 'I'));
33 fRingHistos.Add(new RingHistos(3, 'O'));
36 //____________________________________________________________________
37 AliFMDDensityCalculator::AliFMDDensityCalculator(const
38 AliFMDDensityCalculator& o)
43 TIter next(&o.fRingHistos);
45 while ((obj = next())) fRingHistos.Add(obj);
48 //____________________________________________________________________
49 AliFMDDensityCalculator::~AliFMDDensityCalculator()
54 //____________________________________________________________________
55 AliFMDDensityCalculator&
56 AliFMDDensityCalculator::operator=(const AliFMDDensityCalculator& o)
59 SetTitle(o.GetTitle());
61 fMultCut = o.fMultCut;
64 TIter next(&o.fRingHistos);
66 while ((obj = next())) fRingHistos.Add(obj);
71 //____________________________________________________________________
72 AliFMDDensityCalculator::RingHistos*
73 AliFMDDensityCalculator::GetRingHistos(UShort_t d, Char_t r) const
77 case 1: idx = 0; break;
78 case 2: idx = 1 + (r == 'I' || r == 'i' ? 0 : 1); break;
79 case 3: idx = 3 + (r == 'I' || r == 'i' ? 0 : 1); break;
81 if (idx < 0 || idx >= fRingHistos.GetEntries()) return 0;
83 return static_cast<RingHistos*>(fRingHistos.At(idx));
86 //____________________________________________________________________
88 AliFMDDensityCalculator::Calculate(const AliESDFMD& fmd,
89 AliForwardUtil::Histos& hists,
93 for (UShort_t d=1; d<=3; d++) {
94 UShort_t nr = (d == 1 ? 1 : 2);
95 for (UShort_t q=0; q<nr; q++) {
96 Char_t r = (q == 0 ? 'I' : 'O');
97 UShort_t ns= (q == 0 ? 20 : 40);
98 UShort_t nt= (q == 0 ? 512 : 256);
99 TH2D* h = hists.Get(d,r);
100 RingHistos* rh= GetRingHistos(d,r);
102 for (UShort_t s=0; s<ns; s++) {
103 for (UShort_t t=0; t<nt; t++) {
104 Float_t mult = fmd.Multiplicity(d,r,s,t);
106 if (mult == 0 || mult > 20) continue;
108 Float_t phi = fmd.Phi(d,r,s,t) / 180 * TMath::Pi();
109 Float_t eta = fmd.Eta(d,r,s,t);
111 Float_t n = NParticles(mult,d,r,s,t,vtxbin,eta,lowFlux);
112 rh->fEvsN->Fill(mult,n);
114 Float_t c = Correction(d,r,s,t,vtxbin,eta,lowFlux);
116 rh->fEvsM->Fill(mult,n);
119 rh->fDensity->Fill(eta,phi,n);
128 //_____________________________________________________________________
130 AliFMDDensityCalculator::NParticles(Float_t mult,
137 Bool_t lowFlux) const
139 if (mult <= fMultCut) return 0;
140 if (lowFlux) return 1;
142 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
144 Float_t mpv = pars->GetMPV(d,r,eta);
145 Float_t w = pars->GetSigma(d,r,eta);
146 Float_t w2 = pars->Get2MIPWeight(d,r,eta);
147 Float_t w3 = pars->Get3MIPWeight(d,r,eta);
148 Float_t mpv2 = 2*mpv+2*w*TMath::Log(2);
149 Float_t mpv3 = 3*mpv+3*w*TMath::Log(3);
151 Float_t sum = (TMath::Landau(mult,mpv,w,kTRUE) +
152 w2 * TMath::Landau(mult,mpv2,2*w,kTRUE) +
153 w3 * TMath::Landau(mult,mpv3,3*w,kTRUE));
154 Float_t wsum = (TMath::Landau(mult,mpv,w,kTRUE) +
155 2*w2 * TMath::Landau(mult,mpv2,2*w,kTRUE) +
156 3*w3 * TMath::Landau(mult,mpv3,3*w,kTRUE));
158 return (sum > 0) ? wsum / sum : 1;
161 //_____________________________________________________________________
163 AliFMDDensityCalculator::Correction(UShort_t d, Char_t r, UShort_t /*s*/,
164 UShort_t t, Int_t v, Float_t eta,
165 Bool_t lowFlux) const
167 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
169 Float_t correction = AcceptanceCorrection(r,t);
171 TH1F* dblHitCor = pars->GetDoubleHitCorrection(d,r);
173 Float_t dblC = dblHitCor->GetBinContent(dblHitCor->FindBin(eta));
178 AliWarning(Form("Missing double hit correction for FMD%d%c",d,r));
181 TH1F* deadCor = pars->GetFMDDeadCorrection(v);
183 Float_t deadC = deadCor->GetBinContent(deadCor->FindBin(eta));
192 //_____________________________________________________________________
194 AliFMDDensityCalculator::AcceptanceCorrection(Char_t r, UShort_t t) const
196 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
198 //AliFMDRing fmdring(ring);
200 Float_t rad = pars->GetMaxR(r)-pars->GetMinR(r);
201 Float_t slen = pars->GetStripLength(r,t);
202 Float_t sblen = pars->GetBaseStripLength(r,t);
203 Float_t nstrips = (r == 'I' ? 512 : 256);
204 Float_t segment = rad / nstrips;
205 Float_t radius = pars->GetMinR(r) + segment*t;
207 Float_t basearea1 = 0.5*sblen*TMath::Power(radius,2);
208 Float_t basearea2 = 0.5*sblen*TMath::Power((radius-segment),2);
209 Float_t basearea = basearea1 - basearea2;
211 Float_t area1 = 0.5*slen*TMath::Power(radius,2);
212 Float_t area2 = 0.5*slen*TMath::Power((radius-segment),2);
213 Float_t area = area1 - area2;
215 return area/basearea;
218 //____________________________________________________________________
220 AliFMDDensityCalculator::ScaleHistograms(Int_t nEvents)
222 if (nEvents <= 0) return;
224 TIter next(&fRingHistos);
226 while ((o = static_cast<RingHistos*>(next()))) {
227 o->fDensity->Scale(1. / nEvents);
231 //____________________________________________________________________
233 AliFMDDensityCalculator::Output(TList* dir)
235 TList* d = new TList;
236 d->SetName(GetName());
238 TIter next(&fRingHistos);
240 while ((o = static_cast<RingHistos*>(next()))) {
245 //====================================================================
246 AliFMDDensityCalculator::RingHistos::RingHistos()
254 //____________________________________________________________________
255 AliFMDDensityCalculator::RingHistos::RingHistos(UShort_t d, Char_t r)
262 fEvsN = new TH2D(Form("FMD%d%c_Eloss_N_nocorr", d, r),
263 Form("Energy loss vs uncorrected inclusive "
264 "N_{ch} in FMD%d%c", d, r),
265 100, -.5, 24.5, 100, -.5, 24.5);
266 fEvsM = new TH2D(Form("FMD%d%c_Eloss_N_corr", d, r),
267 Form("Energy loss vs corrected inclusive N_{ch} in FMD%d%c",
268 d, r), 100, -.5, 24.5, 100, -.5, 24.5);
269 fEvsN->SetXTitle("#Delta E/#Delta E_{mip}");
270 fEvsN->SetYTitle("Inclusive N_{ch} (uncorrected)");
272 fEvsN->SetDirectory(0);
273 fEvsN->SetXTitle("#Delta E/#Delta E_{mip}");
274 fEvsN->SetYTitle("Inclusive N_{ch} (corrected)");
276 fEvsM->SetDirectory(0);
278 fDensity = new TH2D(Form("FMD%d%c_Incl_Density", d, r),
279 Form("in FMD%d%c", d, r),
280 200, -4, 6, (r == 'I' || r == 'i' ? 20 : 40),
282 fDensity->SetDirectory(0);
283 fDensity->SetXTitle("#eta");
284 fDensity->SetYTitle("#phi [radians]");
285 fDensity->SetZTitle("Inclusive N_{ch} density");
287 //____________________________________________________________________
288 AliFMDDensityCalculator::RingHistos::RingHistos(const RingHistos& o)
297 //____________________________________________________________________
298 AliFMDDensityCalculator::RingHistos&
299 AliFMDDensityCalculator::RingHistos::operator=(const RingHistos& o)
304 if (fEvsN) delete fEvsN;
305 if (fEvsM) delete fEvsM;
306 if (fDensity) delete fDensity;
308 fEvsN = static_cast<TH2D*>(o.fEvsN->Clone());
309 fEvsM = static_cast<TH2D*>(o.fEvsM->Clone());
310 fDensity = static_cast<TH2D*>(o.fDensity->Clone());
314 //____________________________________________________________________
315 AliFMDDensityCalculator::RingHistos::~RingHistos()
317 if (fEvsN) delete fEvsN;
318 if (fEvsM) delete fEvsM;
319 if (fDensity) delete fDensity;
322 //____________________________________________________________________
324 AliFMDDensityCalculator::RingHistos::Output(TList* dir)
326 TList* d = new TList;
327 d->SetName(Form("FMD%d%c", fDet, fRing));
334 //____________________________________________________________________