43 ClassImp(RooRealBinding);
57 RooRealBinding::RooRealBinding(
const RooAbsReal& func,
const RooArgSet &vars,
const RooArgSet* nset, Bool_t clipInvalid,
const TNamed* rangeName) :
58 RooAbsFunc(vars.getSize()), _func(&func), _vars(0), _nset(nset), _clipInvalid(clipInvalid), _xsave(0), _rangeName(rangeName), _funcSave(0)
61 _vars=
new RooAbsRealLValue*[getDimension()];
68 TIterator* iter = vars.createIterator() ;
70 while((var=(RooAbsArg*)iter->Next())) {
71 _vars[index]=
dynamic_cast<RooAbsRealLValue*
>(var);
72 if(0 == _vars[index]) {
73 oocoutE((TObject*)0,InputArguments) <<
"RooRealBinding: cannot bind to " << var->GetName() << endl ;
93 RooRealBinding::RooRealBinding(
const RooRealBinding& other,
const RooArgSet* nset) :
94 RooAbsFunc(other), _func(other._func), _nset(nset?nset:other._nset), _xvecValid(other._xvecValid),
95 _clipInvalid(other._clipInvalid), _xsave(0), _rangeName(other._rangeName), _funcSave(other._funcSave)
98 _vars=
new RooAbsRealLValue*[getDimension()];
100 for(
unsigned int index=0 ; index<getDimension() ; index++) {
101 _vars[index]= other._vars[index] ;
109 RooRealBinding::~RooRealBinding()
111 if(0 != _vars)
delete[] _vars;
112 if (_xsave)
delete[] _xsave ;
120 void RooRealBinding::saveXVec()
const
123 _xsave =
new Double_t[getDimension()] ;
124 RooArgSet* comps = _func->getComponents() ;
125 RooFIter iter = comps->fwdIterator() ;
127 while ((arg=iter.next())) {
128 if (dynamic_cast<RooAbsReal*>(arg)) {
129 _compList.push_back((RooAbsReal*)(arg)) ;
130 _compSave.push_back(0) ;
135 _funcSave = _func->_value ;
138 list<RooAbsReal*>::iterator ci = _compList.begin() ;
139 list<Double_t>::iterator si = _compSave.begin() ;
140 while(ci!=_compList.end()) {
141 *si = (*ci)->_value ;
145 for (UInt_t i=0 ; i<getDimension() ; i++) {
146 _xsave[i] = _vars[i]->getVal() ;
154 void RooRealBinding::restoreXVec()
const
159 _func->_value = _funcSave ;
162 list<RooAbsReal*>::iterator ci = _compList.begin() ;
163 list<Double_t>::iterator si = _compSave.begin() ;
164 while (ci!=_compList.end()) {
165 (*ci)->_value = *si ;
169 for (UInt_t i=0 ; i<getDimension() ; i++) {
170 _vars[i]->setVal(_xsave[i]) ;
180 void RooRealBinding::loadValues(
const Double_t xvector[])
const
183 const char* range = RooNameReg::instance().constStr(_rangeName) ;
184 for(UInt_t index= 0; index < _dimension; index++) {
185 if (_clipInvalid && !_vars[index]->isValidReal(xvector[index])) {
186 _xvecValid = kFALSE ;
188 _vars[index]->setVal(xvector[index],range);
198 Double_t RooRealBinding::operator()(
const Double_t xvector[])
const
204 return _xvecValid ? _func->getVal(_nset) : 0. ;
211 Double_t RooRealBinding::getMinLimit(UInt_t index)
const
215 return _vars[index]->getMin(RooNameReg::str(_rangeName));
222 Double_t RooRealBinding::getMaxLimit(UInt_t index)
const
225 return _vars[index]->getMax(RooNameReg::str(_rangeName));
232 const char* RooRealBinding::getName()
const
234 return _func->GetName() ;
240 std::list<Double_t>* RooRealBinding::plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi)
const
242 return _func->plotSamplingHint(obs,xlo,xhi) ;
248 std::list<Double_t>* RooRealBinding::binBoundaries(Int_t index)
const
250 return _func->binBoundaries(*_vars[index],getMinLimit(index),getMaxLimit(index));