3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
8 #include "AliL3Logging.h"
9 #include "AliL3Histogram.h"
15 //_____________________________________________________________
20 ClassImp(AliL3Histogram)
22 AliL3Histogram::AliL3Histogram()
45 AliL3Histogram::AliL3Histogram(Char_t *name,Char_t *id,
46 Int_t nxbin,Double_t xmin,Double_t xmax,
47 Int_t nybin,Double_t ymin,Double_t ymax)
53 fNcells = (nxbin+2)*(nybin+2);
58 fBinwidthX = (fXmax - fXmin) / fNxbins;
59 fBinwidthY = (fYmax - fYmin) / fNybins;
71 fContent = new Int_t[fNcells];
75 AliL3Histogram::~AliL3Histogram()
86 void AliL3Histogram::Reset()
89 for(Int_t i=0; i<fNcells; i++) fContent[i] = 0;
94 void AliL3Histogram::Fill(Double_t x,Double_t y,Int_t weight)
96 Int_t bin = FindBin(x,y);
102 AddBinContent(bin,weight);
105 void AliL3Histogram::Fill(Double_t x,Int_t ybin,Int_t weight)
107 Int_t xbin = FindXbin(x);
108 Int_t bin = GetBin(xbin,ybin);
114 AddBinContent(bin,weight);
117 void AliL3Histogram::Fill(Int_t xbin,Double_t y,Int_t weight)
119 Int_t ybin = FindYbin(y);
120 Int_t bin = GetBin(xbin,ybin);
126 AddBinContent(bin,weight);
129 void AliL3Histogram::Fill(Int_t xbin,Int_t ybin,Int_t weight)
131 Int_t bin = GetBin(xbin,ybin);
137 AddBinContent(bin,weight);
140 Int_t AliL3Histogram::FindBin(Double_t x,Double_t y) const
142 Int_t xbin = FindXbin(x);
143 Int_t ybin = FindYbin(y);
149 return GetBin(xbin,ybin);
152 Int_t AliL3Histogram::FindXbin(Double_t x) const
154 if(x < fXmin || x > fXmax)
157 return 1 + (Int_t)(fNxbins*(x-fXmin)/(fXmax-fXmin));
160 Int_t AliL3Histogram::FindYbin(Double_t y) const
162 if(y < fYmin || y > fYmax)
165 return 1 + (Int_t)(fNybins*(y-fYmin)/(fYmax-fYmin));
168 Int_t AliL3Histogram::GetBin(Int_t xbin,Int_t ybin) const
170 if(xbin < fFirstXbin || xbin > fLastXbin)
172 if(ybin < fFirstYbin || ybin > fLastYbin)
175 return xbin + ybin*(fNxbins+2);
178 Int_t AliL3Histogram::GetBinContent(Int_t bin) const
182 LOG(AliL3Log::kError,"AliL3Histogram::GetBinContent","array")<<AliL3Log::kDec<<
183 "bin out of range "<<bin<<ENDLOG;
187 if(fContent[bin] < fThreshold)
189 return fContent[bin];
192 void AliL3Histogram::SetBinContent(Int_t xbin,Int_t ybin,Int_t value)
194 Int_t bin = GetBin(xbin,ybin);
200 SetBinContent(bin,value);
203 void AliL3Histogram::SetBinContent(Int_t bin,Int_t value)
208 LOG(AliL3Log::kError,"AliL3Histogram::SetBinContent","array")<<AliL3Log::kDec<<
209 "bin out of range "<<bin<<ENDLOG;
218 void AliL3Histogram::AddBinContent(Int_t xbin,Int_t ybin,Int_t weight)
220 Int_t bin = GetBin(xbin,ybin);
226 AddBinContent(bin,weight);
229 void AliL3Histogram::AddBinContent(Int_t bin,Int_t weight)
231 if(bin < 0 || bin > fNcells)
233 LOG(AliL3Log::kError,"AliL3Histogram::AddBinContent","array")<<AliL3Log::kDec<<
234 "bin-value out of range "<<bin<<ENDLOG;
240 fContent[bin] += weight;
243 void AliL3Histogram::Add(AliL3Histogram *h1,Double_t weight)
245 //Adding two histograms. Should be identical.
249 LOG(AliL3Log::kError,"AliL3Histogram::Add","Pointer")<<
250 "Attempting to add a non-existing histogram"<<ENDLOG;
254 if(h1->GetNbinsX()!=fNxbins || h1->GetNbinsY()!=fNybins)
256 LOG(AliL3Log::kError,"AliL3Histogram::Add","array")<<
257 "Mismatch in the number of bins "<<ENDLOG;
261 if(h1->GetFirstXbin()!=fFirstXbin || h1->GetLastXbin()!=fLastXbin ||
262 h1->GetFirstYbin()!=fFirstYbin || h1->GetLastYbin()!=fLastYbin)
264 LOG(AliL3Log::kError,"AliL3Histogram::Add","array")<<
265 "Mismatch in the bin numbering "<<ENDLOG;
269 for(Int_t bin=0; bin<fNcells; bin++)
270 fContent[bin] += h1->GetBinContent(bin);
272 fEntries += h1->GetNEntries();
275 Double_t AliL3Histogram::GetBinCenterX(Int_t xbin) const
277 if(xbin < fFirstXbin || xbin > fLastXbin)
279 LOG(AliL3Log::kError,"AliL3Histogram::GetBinCenterX","xbin")
280 <<"Bin-value out of range "<<xbin<<ENDLOG;
284 return fXmin + (xbin-0.5) * fBinwidthX;
287 Double_t AliL3Histogram::GetBinCenterY(Int_t ybin) const
289 if(ybin < fFirstYbin || ybin > fLastYbin)
291 LOG(AliL3Log::kError,"AliL3Histogram::GetBinCenterY","ybin")
292 <<"Bin-value out of range "<<ybin<<ENDLOG;
296 return fYmin + (ybin-0.5) * fBinwidthY;
299 void AliL3Histogram::Draw(Char_t *option)
305 for(Int_t xbin=GetFirstXbin(); xbin<=GetLastXbin(); xbin++)
307 for(Int_t ybin=GetFirstYbin(); ybin<=GetLastYbin(); ybin++)
309 Int_t bin = GetBin(xbin,ybin);
310 fRootHisto->Fill(GetBinCenterX(xbin),GetBinCenterY(ybin),GetBinContent(bin));
314 //fRootHisto->SetStats(kFALSE);
315 fRootHisto->Draw(option);
318 cerr<<"AliL3Histogram::Draw : You need to compile with ROOT in order to draw histogram"<<endl;
322 void AliL3Histogram::CreateRootHisto()
325 fRootHisto = new TH2F(fName,"",fNxbins,fXmin,fXmax,fNybins,fYmin,fYmax);
328 cerr<<"AliL3Histogram::CreateRootHisto : You need to compile with ROOT in order to create ROOT histogram"<<endl;
331 ofstream& operator<<(ofstream &o, const AliL3Histogram &h)
333 for(Int_t xbin=h.GetFirstXbin(); xbin<=h.GetLastXbin(); xbin++)
335 for(Int_t ybin=h.GetFirstYbin(); ybin<=h.GetLastYbin(); ybin++)
337 Int_t bin = h.GetBin(xbin,ybin);
338 o << h.GetBinContent(bin) << " ";