40 ClassImp(RooNumRunningInt);
52 RooNumRunningInt::RooNumRunningInt(
const char *name,
const char *title, RooAbsReal& _func, RooRealVar& _x,
const char* bname) :
53 RooAbsCachedReal(name,title),
54 func(
"func",
"func",this,_func),
56 _binningName(bname?bname:
"cache")
58 setInterpolationOrder(2) ;
67 RooNumRunningInt::RooNumRunningInt(
const RooNumRunningInt& other,
const char* name) :
68 RooAbsCachedReal(other,name),
69 func(
"func",this,other.func),
71 _binningName(other._binningName)
80 RooNumRunningInt::~RooNumRunningInt()
89 const char* RooNumRunningInt::inputBaseName()
const
92 ret = func.arg().GetName() ;
102 RooNumRunningInt::RICacheElem::RICacheElem(
const RooNumRunningInt&
self,
const RooArgSet* nset) :
103 FuncCacheElem(self,nset), _self(&const_cast<RooNumRunningInt&>(self))
106 _ax =
new Double_t[hist()->numEntries()] ;
107 _ay =
new Double_t[hist()->numEntries()] ;
110 _xx = (RooRealVar*) hist()->get()->find(
self.x.arg().GetName()) ;
111 for (
int i=0 ; i<hist()->numEntries() ; i++) {
113 _ax[i] = _xx->getVal() ;
123 RooNumRunningInt::RICacheElem::~RICacheElem()
134 RooArgList RooNumRunningInt::RICacheElem::containedArgs(Action action)
137 ret.add(FuncCacheElem::containedArgs(action)) ;
150 void RooNumRunningInt::RICacheElem::calculate(Bool_t cdfmode)
153 Int_t nbins = hist()->numEntries() ;
155 Double_t xsave = _self->x ;
158 Int_t nInitRange=32 ;
159 for (
int i=1 ; i<=nInitRange ; i++) {
160 Int_t hi = (i*nbins)/nInitRange -1 ;
162 addRange(lo,hi,nbins) ;
167 for (
int i=1 ; i<nbins ; i++) {
172 Double_t binv = (_self->x.max()-_self->x.min())/nbins ;
173 for (
int i=0 ; i<nbins ; i++) {
176 hist()->set(_ay[i]/_ay[nbins-1]) ;
178 hist()->set(_ay[i]*binv) ;
183 func()->setCdfBoundaries(kTRUE) ;
198 void RooNumRunningInt::RICacheElem::addRange(Int_t ixlo, Int_t ixhi, Int_t nbins)
220 Int_t ixmid = (ixlo+ixhi)/2 ;
224 Double_t yInt = _ay[ixlo] + (_ay[ixhi]-_ay[ixlo])*(ixmid-ixlo)/(ixhi-ixlo) ;
227 if (fabs(yInt-_ay[ixmid])*(_ax[nbins-1]-_ax[0])>1e-6) {
228 addRange(ixlo,ixmid,nbins) ;
229 addRange(ixmid,ixhi,nbins) ;
231 for (Int_t j=ixlo+1 ; j<ixmid ; j++) {
232 _ay[j] = _ay[ixlo] + (_ay[ixmid]-_ay[ixlo])*(j-ixlo)/(ixmid-ixlo) ;
234 for (Int_t j=ixmid+1 ; j<ixhi ; j++) {
235 _ay[j] = _ay[ixmid] + (_ay[ixhi]-_ay[ixmid])*(j-ixmid)/(ixhi-ixmid) ;
245 void RooNumRunningInt::RICacheElem::addPoint(Int_t ix)
248 _self->x = _xx->getVal() ;
249 _ay[ix] = _self->func.arg().getVal(*_xx) ;
258 void RooNumRunningInt::fillCacheObject(RooAbsCachedReal::FuncCacheElem& cache)
const
260 RICacheElem& riCache =
static_cast<RICacheElem&
>(cache) ;
261 riCache.calculate(kFALSE) ;
270 RooArgSet* RooNumRunningInt::actualObservables(
const RooArgSet& )
const
272 RooArgSet* ret =
new RooArgSet ;
284 RooArgSet* RooNumRunningInt::actualParameters(
const RooArgSet& )
const
286 RooArgSet* ret = func.arg().getParameters(RooArgSet()) ;
287 ret->remove(x.arg(),kTRUE,kTRUE) ;
295 RooAbsCachedReal::FuncCacheElem* RooNumRunningInt::createCache(
const RooArgSet* nset)
const
297 return new RICacheElem(*const_cast<RooNumRunningInt*>(
this),nset) ;
304 Double_t RooNumRunningInt::evaluate()
const
306 cout <<
"RooNumRunningInt::evaluate(" << GetName() <<
")" << endl ;