[ROOT] Rebinning histograms

From: Gerco Onderwater (onderwat@nialas.npl.uiuc.edu)
Date: Sat Jun 03 2000 - 00:29:18 MEST


Hi Rooters,

When rebinning my histograms I ran into the following interesting
behaviour:

root [0] h = new TH1F("h","h",4695,0,700425)
(class TH1F*)0x886f260
root [1] h->GetBinWidth(1)                  
(Axis_t)1.49185303514376983e+02
root [2] h->Rebin(2)                        
(class TH1*)0x886f260
root [3] h->GetBinWidth(1)/2.               
(double)1.49217085641244154e+02

In other words: the binwidth and thus the x-scale changes by as much as
213 parts-per-million, which is rather annoying if you try to measure a
frequency to less than 1 ppm!!! 

I traced this down to TH1::Rebin (not so difficult) where I found:

   Int_t nbins   = fXaxis.GetNbins();
   Float_t xmin  = fXaxis.GetXmin();
   Float_t xmax  = fXaxis.GetXmax();
   .....
   Int_t newbins = nbins/ngroup;
   .....
   hnew->SetBins(newbins,xmin,xmax);

This of course only works if nbins/ngroup is integer to begin with!!!!
The fix for this would be to add the line

   xmax = fXaxis.GetBinUpEdge(newbins*ngroup);

just before hnew->SetBins(newbins,xmin,xmax). And then it would be more
elegant to not ignore the underflows and overflows, where the latter also
contains the content of those bins that were lost in the rebinning.

Greetings,

-- Gerco

Dr. C.J.G. Onderwater
Nuclear Physics Laboratory
312 Loomis Laboratory of Physics
University of Illinois at Urbana-Champaign
1110 West Green Street
Urbana, IL 61801-3080     
Phone : (217) 244-7363
Fax   : (217) 333-1215  
E-mail: onderwat@uiuc.edu



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:27 MET