Re: [ROOT] Propose to have TH1GetRandom() const call

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Feb 27 2004 - 06:16:42 MET


Hi Constantin,

Your proposal could not be implemented.
I have made this function "const", still being back compatible
and without requiring an extra argument. (in CVS)

Rene Brun

On Thu, 26 
Feb 2004, Constantin 
Loizides wrote:

> Hi Rene,
> 
> it happens quite often that I am passing a pointer of
> an histogram to another class or to a member function
> of another class. Most of the time I only
> want to Monte Carlo sample values from that histogram.
> So I would prefer to pass const TH1F pointers.
> Looking into the ROOT code it seems that it would be no
> problem to have something like the following.
> 
> virtual Axis_t TH1::GetRandom(Bool_t UseIfOutdated) const
> 
> with the following implementation
> 
> Axis_t TH1::GetRandom(Bool_t UseIfOutdated) const
> {
> // return a random number distributed according the histogram bin contents.
> // This function checks if the bins integral exists. If not, zero is
> // returned
> // if UseIfOutdated is true and If the number of entries
> // is not the same as when the integral was computed
> // the random value is still computed, otherwise (if UseIfOutdated 
> // is false, again zero is returned 
> // NB Only valid for 1-d histograms. Use GetRandom2 or 3 otherwise.
> 
>    if (fDimension > 1) {
>       Error("GetRandom","Function only valid for 1-d histograms");
>       return 0;
>    }
> 
>    if(!fIntegral) return 0;
>    Int_t nbinsx = GetNbinsX();
> 
>    if ((!UseIfOutdated) && (fIntegral[nbinsx+1] != fEntries))  
>    {
>       Error("GetRandom","Integral values must be computed, but GetRandom() 
> const was called!");
>       return 0;
>      }
> 
>    Double_t r1 = gRandom->Rndm();
>    Int_t ibin = TMath::BinarySearch(nbinsx,fIntegral,r1);
>    return GetBinLowEdge(ibin+1)
>       +GetBinWidth(ibin+1)*(r1-fIntegral[ibin])/(fIntegral[ibin+1] - 
> fIntegral[ibin]);
> }
> 
> Of course it would be nice to have the same for 2 and 3d,
> 
> what do you think?
> 
> Regards,
> Constantin
> 



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:06 MET