1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
20 /// Implementation of class AliH2F
22 /// \author Marian Ivanov
24 #include <TClonesArray.h>
34 //***********************************************************************
35 //***********************************************************************
36 //***********************************************************************
37 //***********************************************************************
38 AliH2F::AliH2F():TH2F()
43 AliH2F::AliH2F(const Text_t *name,const Text_t *title,
44 Int_t nbinsx,Axis_t xlow,Axis_t xup
45 ,Int_t nbinsy,Axis_t ylow,Axis_t yup):
46 TH2F(name,title,nbinsx,xlow,xup
59 AliH2F::AliH2F(const AliH2F &his) :
66 AliH2F & AliH2F::operator = (const AliH2F & /*his*/)
74 TClonesArray * AliH2F::FindPeaks(Float_t threshold, Float_t noise)
76 //find peaks and write it in form of AliTPCcluster to array
78 //firstly we need to create object for cluster finding
79 //and fill it with contents of histogram
80 AliTPCClusterFinder cfinder;
81 cfinder.SetThreshold(threshold);
82 cfinder.SetNoise(noise);
83 cfinder.GetHisto(this);
84 return cfinder.FindPeaks3();
88 void AliH2F::ClearSpectrum()
92 Int_t dimx = fXaxis.GetNbins();
93 Int_t dimy = fYaxis.GetNbins();
94 for (Int_t i = 0 ;i<dimx;i++)
95 for (Int_t j = 0 ;j<dimy;j++)
97 SetBinContent(GetBin(i,j),0);
98 SetBinError(GetBin(i,j),0);
103 void AliH2F::AddNoise(Float_t sn)
105 /// add gauss noise with sigma sn
107 Int_t dimx = fXaxis.GetNbins();
108 Int_t dimy = fYaxis.GetNbins();
109 for (Int_t i = 0 ;i<dimx;i++)
110 for (Int_t j = 0 ;j<dimy;j++)
112 Float_t noise = gRandom->Gaus(0,sn);
113 Float_t oldv =GetBinContent(GetBin(i,j));
114 Float_t olds =GetBinError(GetBin(i,j));
117 SetBinContent(GetBin(i,j),noise+oldv);
118 SetBinError(GetBin(i,j),TMath::Sqrt((noise*noise+olds*olds)));
122 void AliH2F::AddGauss(Float_t x, Float_t y,
123 Float_t sx, Float_t sy, Float_t max)
125 /// transform to histogram coordinata
127 Int_t dimx = fXaxis.GetNbins();
128 Int_t dimy = fYaxis.GetNbins();
129 Float_t dx =(GetXaxis()->GetXmax()-GetXaxis()->GetXmin())/Float_t(dimx);
130 Float_t dy =(GetYaxis()->GetXmax()-GetYaxis()->GetXmin())/Float_t(dimy);
131 // x=(x-GetXaxis()->GetXmin())/dx;
132 //y=(y-GetYaxis()->GetXmin())/dy;
137 for (Int_t i = 0 ;i<dimx;i++)
138 for (Int_t j = 0 ;j<dimy;j++)
140 Float_t x2 =GetXaxis()->GetBinCenter(i+1);
141 Float_t y2 =GetYaxis()->GetBinCenter(j+1);
142 Float_t dx2 = (x2-x)*(x2-x);
143 Float_t dy2 = (y2-y)*(y2-y);
144 Float_t amp =max*exp(-(dx2/(2*sx*sx)+dy2/(2*sy*sy)));
145 //Float_t oldv =GetBinContent(GetBin(i+1,j+1));
146 // SetBinContent(GetBin(i+1,j+1),amp+oldv);
151 void AliH2F::ClearUnderTh(Int_t threshold)
153 /// clear histogram for bin under threshold
155 Int_t dimx = fXaxis.GetNbins();
156 Int_t dimy = fYaxis.GetNbins();
157 for (Int_t i = 0 ;i<=dimx;i++)
158 for (Int_t j = 0 ;j<=dimy;j++)
160 Float_t oldv =GetBinContent(GetBin(i,j));
162 SetBinContent(GetBin(i,j),0);
168 /// round float to integer
170 Int_t dimx = fXaxis.GetNbins();
171 Int_t dimy = fYaxis.GetNbins();
172 for (Int_t i = 0 ;i<=dimx;i++)
173 for (Int_t j = 0 ;j<=dimy;j++)
175 Float_t oldv =GetBinContent(GetBin(i,j));
177 SetBinContent(GetBin(i,j),oldv);
183 AliH2F *AliH2F::GetSubrange2d(Float_t xmin, Float_t xmax,
184 Float_t ymin, Float_t ymax)
186 /// this function return pointer to the new created
187 /// histogram which is subhistogram of the
189 /// subhistogram range must be inside histogram
192 xmin=fXaxis.GetXmin();
193 xmax=fXaxis.GetXmax();
196 ymin=fYaxis.GetXmin();
197 ymax=fYaxis.GetXmax();
200 Int_t nx = Int_t((xmax-xmin)/(fXaxis.GetXmax()-fXaxis.GetXmin()) *
201 Float_t(fXaxis.GetNbins()));
202 Int_t ny = Int_t((ymax-ymin)/(fYaxis.GetXmax()-fYaxis.GetXmin()) *
203 Float_t(fYaxis.GetNbins()));
205 TString t2 = fTitle ;
208 const Text_t *ktt1 = t1;
209 const Text_t *ktt2 = t2;
211 AliH2F * sub = new AliH2F(ktt1,ktt2,nx,xmin,xmax,ny,ymin,ymax);
213 Int_t i1 = Int_t( Float_t(fXaxis.GetNbins())*(xmin-fXaxis.GetXmin())/
214 (fXaxis.GetXmax()-fXaxis.GetXmin()) ) ;
215 Int_t i2 = Int_t( Float_t(fYaxis.GetNbins())*(ymin-fYaxis.GetXmin())/
216 (fYaxis.GetXmax()-fYaxis.GetXmin()) ) ;
217 for (Int_t i=0;i<nx;i++)
218 for (Int_t j=0;j<ny;j++)
220 Int_t index1 = GetBin(i1+i,i2+j);
221 // Int_t index2 = sub->GetBin(i,j);
222 Float_t val = GetBinContent(index1);
223 // sub->SetBinContent(index2,val);
224 // Float_t err = GetBinError(index1);
225 //sub->SetBinError(index2,GetBinError(index1));
226 sub->SetBinContent(GetBin(i,j),val);
231 TH1F *AliH2F::GetAmplitudes(Float_t zmin, Float_t zmax, Float_t th, Float_t xmin, Float_t xmax,
232 Float_t ymin, Float_t ymax)
234 /// this function return pointer to the new created
235 /// histogram which is subhistogram of the
237 /// subhistogram range must be inside histogram
240 xmin=fXaxis.GetXmin();
241 xmax=fXaxis.GetXmax();
244 ymin=fYaxis.GetXmin();
245 ymax=fYaxis.GetXmax();
247 Int_t nx = Int_t((xmax-xmin)/(fXaxis.GetXmax()-fXaxis.GetXmin()) *
248 Float_t(fXaxis.GetNbins()));
249 Int_t ny = Int_t((ymax-ymin)/(fYaxis.GetXmax()-fYaxis.GetXmin()) *
250 Float_t(fYaxis.GetNbins()));
252 TString t2 = fTitle ;
255 const Text_t *ktt1 = t1;
256 const Text_t *ktt2 = t2;
258 TH1F * h = new TH1F(ktt1,ktt2,100,zmin,zmax);
260 Int_t i1 = Int_t( Float_t(fXaxis.GetNbins())*(xmin-fXaxis.GetXmin())/
261 (fXaxis.GetXmax()-fXaxis.GetXmin()) ) ;
262 Int_t i2 = Int_t( Float_t(fYaxis.GetNbins())*(ymin-fYaxis.GetXmin())/
263 (fYaxis.GetXmax()-fYaxis.GetXmin()) ) ;
264 for (Int_t i=0;i<nx;i++)
265 for (Int_t j=0;j<ny;j++)
267 Int_t index1 = GetBin(i1+i,i2+j);
268 Float_t val = GetBinContent(index1);
269 if (val>th) h->Fill(val);
274 Float_t AliH2F::GetOccupancy(Float_t th , Float_t xmin, Float_t xmax,
275 Float_t ymin, Float_t ymax)
277 /// this function return pointer to the new created
278 /// histogram which is subhistogram of the
280 /// subhistogram range must be inside histogram
283 xmin=fXaxis.GetXmin();
284 xmax=fXaxis.GetXmax();
287 ymin=fYaxis.GetXmin();
288 ymax=fYaxis.GetXmax();
290 Int_t nx = Int_t((xmax-xmin)/(fXaxis.GetXmax()-fXaxis.GetXmin()) *
291 Float_t(fXaxis.GetNbins()));
292 Int_t ny = Int_t((ymax-ymin)/(fYaxis.GetXmax()-fYaxis.GetXmin()) *
293 Float_t(fYaxis.GetNbins()));
296 Int_t i1 = Int_t( Float_t(fXaxis.GetNbins())*(xmin-fXaxis.GetXmin())/
297 (fXaxis.GetXmax()-fXaxis.GetXmin()) ) ;
298 Int_t i2 = Int_t( Float_t(fYaxis.GetNbins())*(ymin-fYaxis.GetXmin())/
299 (fYaxis.GetXmax()-fYaxis.GetXmin()) ) ;
300 for (Int_t i=0;i<nx;i++)
301 for (Int_t j=0;j<ny;j++)
303 Int_t index1 = GetBin(i1+i,i2+j);
304 Float_t val = GetBinContent(index1);
308 if (all>0) return Float_t(over)/Float_t(all);