49 ClassImp(RooXYChi2Var);
56 RooXYChi2Var::RooXYChi2Var()
59 _rrvIter = _rrvArgs.createIterator() ;
78 RooXYChi2Var::RooXYChi2Var(
const char *name,
const char* title, RooAbsReal& func, RooDataSet& xydata, Bool_t integrate) :
79 RooAbsOptTestStatistic(name,title,func,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0),
81 _integrate(integrate),
82 _intConfig(*defaultIntegratorConfig()),
106 RooXYChi2Var::RooXYChi2Var(
const char *name,
const char* title, RooAbsReal& func, RooDataSet& xydata, RooRealVar& yvar, Bool_t integrate) :
107 RooAbsOptTestStatistic(name,title,func,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0),
109 _integrate(integrate),
110 _intConfig(*defaultIntegratorConfig()),
114 _yvar = (RooRealVar*) _dataClone->get()->find(yvar.GetName()) ;
137 RooXYChi2Var::RooXYChi2Var(
const char *name,
const char* title, RooAbsPdf& extPdf, RooDataSet& xydata, Bool_t integrate) :
138 RooAbsOptTestStatistic(name,title,extPdf,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0),
140 _integrate(integrate),
141 _intConfig(*defaultIntegratorConfig()),
144 if (!extPdf.canBeExtended()) {
145 throw(
string(Form(
"RooXYChi2Var::ctor(%s) ERROR: Input p.d.f. must be an extendible",GetName()))) ;
171 RooXYChi2Var::RooXYChi2Var(
const char *name,
const char* title, RooAbsPdf& extPdf, RooDataSet& xydata, RooRealVar& yvar, Bool_t integrate) :
172 RooAbsOptTestStatistic(name,title,extPdf,xydata,RooArgSet(),0,0,1,RooFit::Interleave,0,0),
174 _integrate(integrate),
175 _intConfig(*defaultIntegratorConfig()),
178 if (!extPdf.canBeExtended()) {
179 throw(
string(Form(
"RooXYChi2Var::ctor(%s) ERROR: Input p.d.f. must be an extendible",GetName()))) ;
181 _yvar = (RooRealVar*) _dataClone->get()->find(yvar.GetName()) ;
191 RooXYChi2Var::RooXYChi2Var(
const RooXYChi2Var& other,
const char* name) :
192 RooAbsOptTestStatistic(other,name),
193 _extended(other._extended),
194 _integrate(other._integrate),
195 _intConfig(other._intConfig),
198 _yvar = other._yvar ? (RooRealVar*) _dataClone->get()->find(other._yvar->GetName()) : 0 ;
209 void RooXYChi2Var::initialize()
211 TIterator* iter = _funcObsSet->createIterator() ;
213 while((arg=(RooAbsArg*)iter->Next())) {
214 RooRealVar* var =
dynamic_cast<RooRealVar*
>(arg) ;
220 _rrvArgs.add(*_yvar) ;
223 _rrvIter = _rrvArgs.createIterator() ;
228 _intConfig.setEpsRel(1e-7) ;
229 _intConfig.setEpsAbs(1e-7) ;
230 #ifdef R__HAS_MATHMORE
231 _intConfig.method1D().setLabel(
"RooGaussKronrodIntegrator1D") ;
233 _intConfig.methodND().setLabel(
"RooAdaptiveIntegratorND") ;
244 void RooXYChi2Var::initIntegrator()
247 _funcInt = _funcClone->createIntegral(_rrvArgs,_rrvArgs,_intConfig,
"bin") ;
250 while((x=(RooRealVar*)_rrvIter->Next())) {
251 _binList.push_back(&x->getBinning(
"bin",kFALSE,kTRUE)) ;
262 RooXYChi2Var::~RooXYChi2Var()
265 if (_funcInt)
delete _funcInt ;
275 Double_t RooXYChi2Var::xErrorContribution(Double_t ydata)
const
281 while((var=(RooRealVar*)_rrvIter->Next())) {
283 if (var->hasAsymError()) {
286 Double_t cxval = var->getVal() ;
287 Double_t xerrLo = -var->getAsymErrorLo() ;
288 Double_t xerrHi = var->getAsymErrorHi() ;
289 Double_t xerr = (xerrLo+xerrHi)/2 ;
292 var->setVal(cxval - xerr/100) ;
293 Double_t fxmin = fy() ;
296 var->setVal(cxval + xerr/100) ;
297 Double_t fxmax = fy() ;
300 Double_t slope = (fxmax-fxmin)/(2*xerr/100.) ;
305 if ((ydata>cxval && fxmax>fxmin) || (ydata<=cxval && fxmax<=fxmin)) {
307 ret += pow(xerrHi*slope,2) ;
310 ret += pow(xerrLo*slope,2) ;
313 }
else if (var->hasError()) {
316 Double_t cxval = var->getVal() ;
317 Double_t xerr = var->getError() ;
320 var->setVal(cxval - xerr/100) ;
321 Double_t fxmin = fy() ;
324 var->setVal(cxval + xerr/100) ;
325 Double_t fxmax = fy() ;
328 Double_t slope = (fxmax-fxmin)/(2*xerr/100.) ;
336 ret += pow(xerr*slope,2) ;
356 Double_t RooXYChi2Var::fy()
const
361 yfunc = _funcClone->getVal(_dataClone->get()) ;
365 for (list<RooAbsBinning*>::const_iterator iter = _binList.begin() ; iter != _binList.end() ; ++iter) {
366 RooRealVar* x = (RooRealVar*) _rrvIter->Next() ;
367 Double_t xmin = x->getVal() + x->getErrorLo() ;
368 Double_t xmax = x->getVal() + x->getErrorHi() ;
369 (*iter)->setRange(xmin,xmax) ;
371 volume *= (xmax - xmin) ;
373 Double_t ret = _funcInt->getVal() ;
374 return ret / volume ;
377 RooAbsPdf* pdf = (RooAbsPdf*) _funcClone ;
379 yfunc *= pdf->expectedEvents(_dataClone->get()) ;
389 Double_t RooXYChi2Var::evaluatePartition(std::size_t firstEvent, std::size_t lastEvent, std::size_t stepSize)
const
391 Double_t result(0), carry(0);
394 RooDataSet* xydata = (RooDataSet*) _dataClone ;
396 _dataClone->store()->recalculateCache( _projDeps, firstEvent, lastEvent, stepSize,kFALSE ) ;
398 for (
auto i=firstEvent ; i<lastEvent ; i+=stepSize) {
403 if (!xydata->valid()) {
412 Double_t yfunc = fy() ;
418 ydata = _yvar->getVal() ;
419 eylo = -1*_yvar->getErrorLo() ;
420 eyhi = _yvar->getErrorHi() ;
422 ydata = xydata->weight() ;
423 xydata->weightError(eylo,eyhi) ;
427 Double_t eExt = yfunc-ydata ;
430 Double_t eInt = (eExt>0) ? eyhi : eylo ;
433 Double_t eIntX2 = _integrate ? 0 : xErrorContribution(ydata) ;
439 coutE(Eval) <<
"RooXYChi2Var::RooXYChi2Var(" << GetName() <<
") INFINITY ERROR: data point " << i
440 <<
" has zero error, but function is not zero (f=" << yfunc <<
")" << endl ;
445 Double_t term = eExt*eExt/(eInt*eInt+ eIntX2);
446 Double_t y = term - carry;
447 Double_t t = result + y;
448 carry = (t - result) - y;
458 RooArgSet RooXYChi2Var::requiredExtraObservables()
const
461 if (_yvar)
return RooArgSet(*_yvar) ;