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