42 const char* kBasicN =
"basic";
43 const char* kEmptyN =
"empty";
44 const char* kTotalN =
"total";
45 const char* kBasicT =
"Basic number of hits";
46 const char* kEmptyT =
"Empty number of bins/region";
47 const char* kTotalT =
"Total number of bins/region";
73 :
TNamed(
"poissonCalculator",
"Calculate N_ch using Poisson stat"),
127 if (&o ==
this)
return *
this;
128 TNamed::operator=(o);
159 const Double_t* xBins = xaxis.GetXbins()->GetArray();
160 const Double_t* yBins = yaxis.GetXbins()->GetArray();
161 Int_t nX = xaxis.GetNbins();
162 Int_t nY = yaxis.GetNbins();
169 if (yBins)
fBasic =
new TH2D(kBasicN, kBasicT, nX, xBins, nY, yBins);
170 else fBasic =
new TH2D(kBasicN, kBasicT, nX, xBins, nY, lY, hY);
173 if (yBins)
fBasic =
new TH2D(kBasicN, kBasicT, nX, lX, hX, nY, yBins);
174 else fBasic =
new TH2D(kBasicN, kBasicT, nX, lX, hX, nY, lY, hY);
176 fBasic->SetXTitle(xaxis.GetTitle());
177 fBasic->SetYTitle(yaxis.GetTitle());
186 "# of empty # bins vs total # bins",
187 n, -.5, n-.5, n, -.5, n-.5);
195 fMean =
new TH1D(
"poissonMean",
"Mean N_{ch} as calculated by Poisson",
197 fMean->SetXTitle(
"#bar{N_{ch}}=log(empty/total)");
198 fMean->SetYTitle(
"Events");
199 fMean->SetFillColor(kRed+1);
200 fMean->SetFillStyle(3001);
201 fMean->SetLineColor(kBlack);
202 fMean->SetDirectory(0);
204 fOcc =
new TH1D(
"occupancy",
"Occupancy = #int_{1}^{#infty}dN P(N)",
206 fOcc->SetXTitle(
"#int_{1}^{#infty}dN P(N) [%]");
207 fOcc->SetYTitle(
"Events");
208 fOcc->SetFillColor(kBlue+1);
209 fOcc->SetFillStyle(3001);
210 fOcc->SetLineColor(kBlack);
211 fOcc->SetDirectory(0);
213 fCorr =
new TH2D(
"correction",
"Correction as function of mean N_{ch}",
214 10*n+1, -.1, n+.1, 100, 0, 10);
215 fCorr->SetXTitle(
"#bar{N_{ch}}");
216 fCorr->SetYTitle(
"Correction 1/(1-e^{#bar{N_{c}}})");
217 fCorr->SetZTitle(
"Events");
218 fCorr->SetOption(
"colz");
219 fCorr->SetDirectory(0);
249 if ((nBins % lumping) == 0)
return lumping;
253 }
while (l > 0 && ((nBins % l) != 0));
254 Warning(
"CheckLumping",
"%c lumping %d is not a divisor of %d, set to %d",
255 which, lumping, nBins, l);
275 Int_t nXF = base->GetNbinsX();
276 Double_t xMin = base->GetXaxis()->GetXmin();
277 Double_t xMax = base->GetXaxis()->GetXmax();
278 Int_t nYF = base->GetNbinsY();
289 fBasic =
static_cast<TH2D*
>(base->Clone(kBasicN));
290 fBasic->SetTitle(kBasicT);
295 fTotal =
new TH2D(kTotalN, kTotalT, nX, xMin, xMax, nY, yMin, yMax);
302 fEmpty->SetTitle(kEmptyT);
321 if (hit)
fBasic->Fill(x, y, weight);
329 if (total <= 0)
return 0;
330 if (empty < .001) empty = .001;
331 return -TMath::Log(empty/total);
337 if (total <= 0)
return 0;
338 if (TMath::Abs(empty-total) < .001) empty = total - .001;
339 return 1 / (1 - empty / total);
355 return fEmpty->GetXaxis()->FindBin(x);
370 return fEmpty->GetYaxis()->FindBin(y);
388 for (
Int_t ix = 1; ix <=
fBasic->GetNbinsX(); ix++) {
391 for (
Int_t iy = 1; iy <=
fBasic->GetNbinsY(); iy++) {
401 Double_t poissonV = hits * poissonM * poissonC;
402 Double_t poissonE = TMath::Sqrt(poissonV);
403 if(poissonV > 0) poissonE = TMath::Sqrt(poissonV);
405 fBasic->SetBinContent(ix,iy,poissonV);
406 fBasic->SetBinError(ix,iy,poissonE);
416 for (
Int_t ix = 1; ix <=
fEmpty->GetNbinsX(); ix++) {
417 for (
Int_t iy = 1; iy <=
fEmpty->GetNbinsY(); iy++) {
424 if (total > 1e-6)
fOcc->Fill(100 * (1 - empty/total));
426 fCorr->Fill(mean, corr);
440 char ind[gROOT->GetDirLevel()+3];
441 for (
Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] =
' ';
442 ind[gROOT->GetDirLevel()] =
'\0';
443 std::cout << ind << ClassName() <<
": " << GetName() <<
'\n' 445 << ind <<
" X lumping: " <<
fXLumping <<
'\n' 446 << ind <<
" Y lumping: " <<
fYLumping <<
'\n' 447 << std::noboolalpha << std::endl;
Double_t CalculateCorrection(Double_t empty, Double_t total) const
void Reset(const TH2D *base)
void Define(const TAxis &xaxis, const TAxis &yaxis)
void SetLumping(UShort_t nx, UShort_t ny)
TH2D * Result(Bool_t correct=true)
void Print(const Option_t *option="") const
Int_t GetReducedXBin(Int_t ix) const
void Init(Int_t xLumping=-1, Int_t yLumping=-1)
virtual ~AliPoissonCalculator()
void Fill(UShort_t strip, UShort_t sec, Bool_t hit, Double_t weight=1)
Int_t CheckLumping(char which, Int_t nBins, Int_t lumping) const
Double_t CalculateMean(Double_t empty, Double_t total) const
Int_t GetReducedYBin(Int_t iy) const
AliPoissonCalculator & operator=(const AliPoissonCalculator &o)