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