33 class RooAbsCategoryLValue ;
36 class RooNumIntConfig ;
39 class RooGenFunction ;
40 class RooMultiGenFunction ;
44 class RooVectorDataStore ;
45 namespace RooHelpers {
46 class BatchInterfaceAccessor;
59 class RooAbsReal :
public RooAbsArg {
63 RooAbsReal(
const char *name,
const char *title,
const char *unit=
"") ;
64 RooAbsReal(
const char *name,
const char *title, Double_t minVal, Double_t maxVal,
65 const char *unit=
"") ;
66 RooAbsReal(
const RooAbsReal& other,
const char* name=0);
67 RooAbsReal& operator=(
const RooAbsReal& other);
68 virtual ~RooAbsReal();
87 inline Double_t getVal(
const RooArgSet* normalisationSet =
nullptr)
const {
88 #ifdef ROOFIT_CHECK_CACHED_VALUES
89 return _DEBUG_getVal(normalisationSet);
93 return (_fast && !_inhibitDirty) ? _value : getValV(normalisationSet) ;
95 return (_fast && !inhibitDirty()) ? _value : getValV(normalisationSet) ;
102 inline Double_t getVal(
const RooArgSet& normalisationSet)
const {
return _fast ? _value : getValV(&normalisationSet) ; }
104 virtual Double_t getValV(
const RooArgSet* normalisationSet =
nullptr)
const ;
106 virtual RooSpan<const double> getValBatch(std::size_t begin, std::size_t maxSize,
const RooArgSet* normSet =
nullptr)
const;
108 Double_t getPropagatedError(
const RooFitResult &fr,
const RooArgSet &nset = RooArgSet())
const;
110 Bool_t operator==(Double_t value)
const ;
111 virtual Bool_t operator==(
const RooAbsArg& other) ;
112 virtual Bool_t isIdentical(
const RooAbsArg& other, Bool_t assumeSameType=kFALSE) ;
115 inline const Text_t *getUnit()
const {
119 inline void setUnit(
const char *unit) {
123 TString getTitle(Bool_t appendUnit= kFALSE)
const;
126 RooAbsFunc *bindVars(
const RooArgSet &vars,
const RooArgSet* nset=0, Bool_t clipInvalid=kFALSE)
const;
129 RooAbsArg *createFundamental(
const char* newname=0)
const;
132 virtual Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars,
const RooArgSet* normSet,
const char* rangeName=0)
const ;
133 virtual Double_t analyticalIntegralWN(Int_t code,
const RooArgSet* normSet,
const char* rangeName=0)
const ;
134 virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* rangeName=0)
const ;
135 virtual Double_t analyticalIntegral(Int_t code,
const char* rangeName=0)
const ;
136 virtual Bool_t forceAnalyticalInt(
const RooAbsArg& )
const {
141 virtual void forceNumInt(Bool_t flag=kTRUE) {
144 _forceNumInt = flag ;
146 Bool_t getForceNumInt()
const {
return _forceNumInt ; }
149 virtual RooFitResult* chi2FitTo(RooDataHist& data,
const RooCmdArg& arg1=RooCmdArg::none(),
const RooCmdArg& arg2=RooCmdArg::none(),
150 const RooCmdArg& arg3=RooCmdArg::none(),
const RooCmdArg& arg4=RooCmdArg::none(),
const RooCmdArg& arg5=RooCmdArg::none(),
151 const RooCmdArg& arg6=RooCmdArg::none(),
const RooCmdArg& arg7=RooCmdArg::none(),
const RooCmdArg& arg8=RooCmdArg::none()) ;
152 virtual RooFitResult* chi2FitTo(RooDataHist& data,
const RooLinkedList& cmdList) ;
154 virtual RooAbsReal* createChi2(RooDataHist& data,
const RooLinkedList& cmdList) ;
155 virtual RooAbsReal* createChi2(RooDataHist& data,
const RooCmdArg& arg1=RooCmdArg::none(),
const RooCmdArg& arg2=RooCmdArg::none(),
156 const RooCmdArg& arg3=RooCmdArg::none(),
const RooCmdArg& arg4=RooCmdArg::none(),
const RooCmdArg& arg5=RooCmdArg::none(),
157 const RooCmdArg& arg6=RooCmdArg::none(),
const RooCmdArg& arg7=RooCmdArg::none(),
const RooCmdArg& arg8=RooCmdArg::none()) ;
160 virtual RooFitResult* chi2FitTo(RooDataSet& xydata,
const RooCmdArg& arg1=RooCmdArg::none(),
const RooCmdArg& arg2=RooCmdArg::none(),
161 const RooCmdArg& arg3=RooCmdArg::none(),
const RooCmdArg& arg4=RooCmdArg::none(),
const RooCmdArg& arg5=RooCmdArg::none(),
162 const RooCmdArg& arg6=RooCmdArg::none(),
const RooCmdArg& arg7=RooCmdArg::none(),
const RooCmdArg& arg8=RooCmdArg::none()) ;
163 virtual RooFitResult* chi2FitTo(RooDataSet& xydata,
const RooLinkedList& cmdList) ;
165 virtual RooAbsReal* createChi2(RooDataSet& data,
const RooLinkedList& cmdList) ;
166 virtual RooAbsReal* createChi2(RooDataSet& data,
const RooCmdArg& arg1=RooCmdArg::none(),
const RooCmdArg& arg2=RooCmdArg::none(),
167 const RooCmdArg& arg3=RooCmdArg::none(),
const RooCmdArg& arg4=RooCmdArg::none(),
const RooCmdArg& arg5=RooCmdArg::none(),
168 const RooCmdArg& arg6=RooCmdArg::none(),
const RooCmdArg& arg7=RooCmdArg::none(),
const RooCmdArg& arg8=RooCmdArg::none()) ;
171 virtual RooAbsReal* createProfile(
const RooArgSet& paramsOfInterest) ;
174 RooAbsReal* createIntegral(
const RooArgSet& iset,
const RooCmdArg& arg1,
const RooCmdArg& arg2=RooCmdArg::none(),
175 const RooCmdArg& arg3=RooCmdArg::none(),
const RooCmdArg& arg4=RooCmdArg::none(),
176 const RooCmdArg& arg5=RooCmdArg::none(),
const RooCmdArg& arg6=RooCmdArg::none(),
177 const RooCmdArg& arg7=RooCmdArg::none(),
const RooCmdArg& arg8=RooCmdArg::none())
const ;
180 RooAbsReal* createIntegral(
const RooArgSet& iset,
const char* rangeName)
const {
181 return createIntegral(iset,0,0,rangeName) ;
184 RooAbsReal* createIntegral(
const RooArgSet& iset,
const RooArgSet& nset,
const char* rangeName=0)
const {
185 return createIntegral(iset,&nset,0,rangeName) ;
189 RooAbsReal* createIntegral(
const RooArgSet& iset,
const RooArgSet& nset,
const RooNumIntConfig& cfg,
const char* rangeName=0)
const {
190 return createIntegral(iset,&nset,&cfg,rangeName) ;
193 RooAbsReal* createIntegral(
const RooArgSet& iset,
const RooNumIntConfig& cfg,
const char* rangeName=0)
const {
194 return createIntegral(iset,0,&cfg,rangeName) ;
196 virtual RooAbsReal* createIntegral(
const RooArgSet& iset,
const RooArgSet* nset=0,
const RooNumIntConfig* cfg=0,
const char* rangeName=0)
const ;
199 void setParameterizeIntegral(
const RooArgSet& paramVars) ;
202 RooAbsReal* createRunningIntegral(
const RooArgSet& iset,
const RooArgSet& nset=RooArgSet()) ;
203 RooAbsReal* createRunningIntegral(
const RooArgSet& iset,
const RooCmdArg& arg1,
const RooCmdArg& arg2=RooCmdArg::none(),
204 const RooCmdArg& arg3=RooCmdArg::none(),
const RooCmdArg& arg4=RooCmdArg::none(),
205 const RooCmdArg& arg5=RooCmdArg::none(),
const RooCmdArg& arg6=RooCmdArg::none(),
206 const RooCmdArg& arg7=RooCmdArg::none(),
const RooCmdArg& arg8=RooCmdArg::none()) ;
207 RooAbsReal* createIntRI(
const RooArgSet& iset,
const RooArgSet& nset=RooArgSet()) ;
208 RooAbsReal* createScanRI(
const RooArgSet& iset,
const RooArgSet& nset, Int_t numScanBins, Int_t intOrder) ;
212 virtual Int_t getMaxVal(
const RooArgSet& vars)
const ;
213 virtual Double_t maxVal(Int_t code)
const ;
214 virtual Int_t minTrialSamples(
const RooArgSet& )
const {
return 0 ; }
218 void setPlotLabel(
const char *label);
219 const char *getPlotLabel()
const;
221 virtual Double_t defaultErrorLevel()
const {
226 const RooNumIntConfig* getIntegratorConfig()
const ;
227 RooNumIntConfig* getIntegratorConfig() ;
228 static RooNumIntConfig* defaultIntegratorConfig() ;
229 RooNumIntConfig* specialIntegratorConfig()
const ;
230 RooNumIntConfig* specialIntegratorConfig(Bool_t createOnTheFly) ;
231 void setIntegratorConfig() ;
232 void setIntegratorConfig(
const RooNumIntConfig& config) ;
234 virtual void fixAddCoefNormalization(
const RooArgSet& addNormSet=RooArgSet(),Bool_t force=kTRUE) ;
235 virtual void fixAddCoefRange(
const char* rangeName=0,Bool_t force=kTRUE) ;
237 virtual void preferredObservableScanOrder(
const RooArgSet& obs, RooArgSet& orderedObs)
const ;
240 virtual RooPlot* plotOn(RooPlot* frame,
241 const RooCmdArg& arg1=RooCmdArg(),
const RooCmdArg& arg2=RooCmdArg(),
242 const RooCmdArg& arg3=RooCmdArg(),
const RooCmdArg& arg4=RooCmdArg(),
243 const RooCmdArg& arg5=RooCmdArg(),
const RooCmdArg& arg6=RooCmdArg(),
244 const RooCmdArg& arg7=RooCmdArg(),
const RooCmdArg& arg8=RooCmdArg(),
245 const RooCmdArg& arg9=RooCmdArg(),
const RooCmdArg& arg10=RooCmdArg()
249 enum ScaleType { Raw, Relative, NumEvent, RelativeExpected } ;
252 virtual RooPlot *plotSliceOn(RooPlot *frame,
const RooArgSet& sliceSet, Option_t* drawOptions=
"L",
253 Double_t scaleFactor=1.0, ScaleType stype=Relative,
const RooAbsData* projData=0)
const;
256 TH1 *fillHistogram(TH1 *hist,
const RooArgList &plotVars,
257 Double_t scaleFactor= 1,
const RooArgSet *projectedVars= 0, Bool_t scaling=kTRUE,
258 const RooArgSet* condObs=0, Bool_t setError=kTRUE)
const;
261 TH1 *createHistogram(
const char* varNameList, Int_t xbins=0, Int_t ybins=0, Int_t zbins=0)
const ;
262 TH1* createHistogram(
const char *name,
const RooAbsRealLValue& xvar, RooLinkedList& argList)
const ;
263 TH1 *createHistogram(
const char *name,
const RooAbsRealLValue& xvar,
264 const RooCmdArg& arg1=RooCmdArg::none(),
const RooCmdArg& arg2=RooCmdArg::none(),
265 const RooCmdArg& arg3=RooCmdArg::none(),
const RooCmdArg& arg4=RooCmdArg::none(),
266 const RooCmdArg& arg5=RooCmdArg::none(),
const RooCmdArg& arg6=RooCmdArg::none(),
267 const RooCmdArg& arg7=RooCmdArg::none(),
const RooCmdArg& arg8=RooCmdArg::none())
const ;
270 RooDataHist* fillDataHist(RooDataHist *hist,
const RooArgSet* nset, Double_t scaleFactor,
271 Bool_t correctForBinVolume=kFALSE, Bool_t showProgress=kFALSE)
const ;
274 virtual Bool_t readFromStream(std::istream& is, Bool_t compact, Bool_t verbose=kFALSE) ;
275 virtual void writeToStream(std::ostream& os, Bool_t compact)
const ;
278 virtual void printValue(std::ostream& os)
const ;
279 virtual void printMultiline(std::ostream& os, Int_t contents, Bool_t verbose=kFALSE, TString indent=
"")
const ;
281 static void setCacheCheck(Bool_t flag) ;
287 EvalError(
const EvalError& other) : _msg(other._msg), _srvval(other._srvval) { }
288 void setMessage(
const char* tmp) { std::string s(tmp); s.swap(_msg); }
289 void setServerValues(
const char* tmp) { std::string s(tmp); s.swap(_srvval); }
294 enum ErrorLoggingMode { PrintErrors, CollectErrors, CountErrors, Ignore } ;
295 static ErrorLoggingMode evalErrorLoggingMode() ;
296 static void setEvalErrorLoggingMode(ErrorLoggingMode m) ;
297 void logEvalError(
const char* message,
const char* serverValueString=0)
const ;
298 static void logEvalError(
const RooAbsReal* originator,
const char* origName,
const char* message,
const char* serverValueString=0) ;
299 static void printEvalErrors(std::ostream&os=std::cout, Int_t maxPerNode=10000000) ;
300 static Int_t numEvalErrors() ;
301 static Int_t numEvalErrorItems() ;
304 typedef std::map<const RooAbsArg*,std::pair<std::string,std::list<EvalError> > >::const_iterator EvalErrorIter ;
305 static EvalErrorIter evalErrorIter() ;
307 static void clearEvalErrorLog() ;
309 virtual Bool_t isBinnedDistribution(
const RooArgSet& )
const {
return kFALSE ; }
310 virtual std::list<Double_t>* binBoundaries(RooAbsRealLValue& , Double_t , Double_t )
const {
return 0 ; }
311 virtual std::list<Double_t>* plotSamplingHint(RooAbsRealLValue& , Double_t , Double_t )
const {
317 RooGenFunction* iGenFunction(RooRealVar& x,
const RooArgSet& nset=RooArgSet()) ;
318 RooMultiGenFunction* iGenFunction(
const RooArgSet& observables,
const RooArgSet& nset=RooArgSet()) ;
320 RooFunctor* functor(
const RooArgList& obs,
const RooArgList& pars=RooArgList(),
const RooArgSet& nset=RooArgSet())
const ;
321 TF1* asTF(
const RooArgList& obs,
const RooArgList& pars=RooArgList(),
const RooArgSet& nset=RooArgSet())
const ;
323 RooDerivative* derivative(RooRealVar& obs, Int_t order=1, Double_t eps=0.001) ;
324 RooDerivative* derivative(RooRealVar& obs,
const RooArgSet& normSet, Int_t order, Double_t eps=0.001) ;
326 RooAbsMoment* moment(RooRealVar& obs, Int_t order, Bool_t central, Bool_t takeRoot) ;
327 RooAbsMoment* moment(RooRealVar& obs,
const RooArgSet& normObs, Int_t order, Bool_t central, Bool_t takeRoot, Bool_t intNormObs) ;
329 RooAbsMoment* mean(RooRealVar& obs) {
return moment(obs,1,kFALSE,kFALSE) ; }
330 RooAbsMoment* mean(RooRealVar& obs,
const RooArgSet& nset) {
return moment(obs,nset,1,kFALSE,kFALSE,kTRUE) ; }
331 RooAbsMoment* sigma(RooRealVar& obs) {
return moment(obs,2,kTRUE,kTRUE) ; }
332 RooAbsMoment* sigma(RooRealVar& obs,
const RooArgSet& nset) {
return moment(obs,nset,2,kTRUE,kTRUE,kTRUE) ; }
334 Double_t findRoot(RooRealVar& x, Double_t xmin, Double_t xmax, Double_t yval) ;
337 virtual Bool_t setData(RooAbsData& , Bool_t =kTRUE) {
return kTRUE ; }
339 virtual void enableOffsetting(Bool_t) {} ;
340 virtual Bool_t isOffsetting()
const {
return kFALSE ; }
341 virtual Double_t offset()
const {
return 0 ; }
343 static void setHideOffset(Bool_t flag);
344 static Bool_t hideOffset() ;
348 virtual void selectNormalization(
const RooArgSet* depSet=0, Bool_t force=kFALSE) ;
349 virtual void selectNormalizationRange(
const char* rangeName=0, Bool_t force=kFALSE) ;
352 Bool_t plotSanityChecks(RooPlot* frame)
const ;
353 void makeProjectionSet(
const RooAbsArg* plotVar,
const RooArgSet* allVars,
354 RooArgSet& projectedVars, Bool_t silent)
const ;
356 TString integralNameSuffix(
const RooArgSet& iset,
const RooArgSet* nset=0,
const char* rangeName=0, Bool_t omitEmpty=kFALSE)
const ;
359 Bool_t isSelectedComp()
const ;
363 const RooAbsReal* createPlotProjection(
const RooArgSet& depVars,
const RooArgSet& projVars)
const ;
364 const RooAbsReal* createPlotProjection(
const RooArgSet& depVars,
const RooArgSet& projVars, RooArgSet*& cloneSet)
const ;
365 const RooAbsReal *createPlotProjection(
const RooArgSet &dependentVars,
const RooArgSet *projectedVars,
366 RooArgSet *&cloneSet,
const char* rangeName=0,
const RooArgSet* condObs=0)
const;
369 RooFitResult* chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList) ;
371 void plotOnCompSelect(RooArgSet* selNodes)
const ;
372 RooPlot* plotOnWithErrorBand(RooPlot* frame,
const RooFitResult& fr, Double_t Z,
const RooArgSet* params,
const RooLinkedList& argList, Bool_t method1)
const ;
377 Bool_t matchArgs(
const RooArgSet& allDeps, RooArgSet& numDeps,
378 const RooArgProxy& a)
const ;
379 Bool_t matchArgs(
const RooArgSet& allDeps, RooArgSet& numDeps,
380 const RooArgProxy& a,
const RooArgProxy& b)
const ;
381 Bool_t matchArgs(
const RooArgSet& allDeps, RooArgSet& numDeps,
382 const RooArgProxy& a,
const RooArgProxy& b,
const RooArgProxy& c)
const ;
383 Bool_t matchArgs(
const RooArgSet& allDeps, RooArgSet& numDeps,
384 const RooArgProxy& a,
const RooArgProxy& b,
385 const RooArgProxy& c,
const RooArgProxy& d)
const ;
387 Bool_t matchArgs(
const RooArgSet& allDeps, RooArgSet& numDeps,
388 const RooArgSet& set)
const ;
391 RooAbsReal* createIntObj(
const RooArgSet& iset,
const RooArgSet* nset,
const RooNumIntConfig* cfg,
const char* rangeName)
const ;
392 void findInnerMostIntegration(
const RooArgSet& allObs, RooArgSet& innerObs,
const char* rangeName)
const ;
396 virtual Bool_t isValid()
const ;
397 virtual Bool_t isValidReal(Double_t value, Bool_t printError=kFALSE)
const ;
400 Double_t traceEval(
const RooArgSet* set)
const ;
403 virtual Double_t evaluate()
const = 0;
404 virtual RooSpan<double> evaluateBatch(std::size_t begin, std::size_t maxSize)
const;
408 friend class RooHelpers::BatchInterfaceAccessor;
409 void clearBatchMemory() {
411 for (
auto arg : _serverList) {
413 auto absReal =
dynamic_cast<RooAbsReal*
>(arg);
415 absReal->clearBatchMemory();
420 void checkBatchComputation(std::size_t evtNo,
const RooArgSet* normSet =
nullptr,
double relAccuracy = 1.E-13)
const;
422 const BatchHelpers::BatchData& batchData()
const {
427 Double_t _DEBUG_getVal(
const RooArgSet* normalisationSet)
const;
433 friend class RooRealIntegral ;
434 friend class RooVectorDataStore ;
435 virtual void syncCache(
const RooArgSet* set=0) { getVal(set) ; }
436 virtual void copyCache(
const RooAbsArg* source, Bool_t valueOnly=kFALSE, Bool_t setValDirty=kTRUE) ;
437 virtual void attachToTree(TTree& t, Int_t bufSize=32000) ;
438 virtual void attachToVStore(RooVectorDataStore& vstore) ;
439 virtual void setTreeBranchStatus(TTree& t, Bool_t active) ;
440 virtual void fillTreeBranch(TTree& t) ;
442 friend class RooRealBinding ;
446 mutable Double_t _value ;
447 mutable BatchHelpers::BatchData _batchData;
450 Bool_t _forceNumInt ;
452 mutable Float_t _floatValue{0.};
453 mutable Int_t _intValue{0};
454 mutable Bool_t _boolValue{
false};
455 mutable UChar_t _byteValue{
'\0'};
456 mutable Char_t _sbyteValue{
'\0'};
457 mutable UInt_t _uintValue{0u};
459 friend class RooAbsPdf ;
460 friend class RooAbsAnaConvPdf ;
462 RooNumIntConfig* _specIntegratorConfig ;
466 friend class RooDataProjBinding ;
467 friend class RooAbsOptGoodnessOfFit ;
470 PlotOpt() : drawOptions(
"L"), scaleFactor(1.0), stype(Relative), projData(0), binProjData(kFALSE), projSet(0), precision(1e-3),
471 shiftToZero(kFALSE),projDataSet(0),normRangeName(0),rangeLo(0),rangeHi(0),postRangeFracScale(kFALSE),wmode(RooCurve::Extended),
472 projectionRangeName(0),curveInvisible(kFALSE), curveName(0),addToCurveName(0),addToWgtSelf(1.),addToWgtOther(1.),
473 numCPU(1),interleave(RooFit::Interleave),curveNameSuffix(
""), numee(10), eeval(0), doeeval(kFALSE), progress(kFALSE), errorFR(0) {} ;
474 Option_t* drawOptions ;
475 Double_t scaleFactor ;
477 const RooAbsData* projData ;
479 const RooArgSet* projSet ;
482 const RooArgSet* projDataSet ;
483 const char* normRangeName ;
486 Bool_t postRangeFracScale ;
487 RooCurve::WingMode wmode ;
488 const char* projectionRangeName ;
489 Bool_t curveInvisible ;
490 const char* curveName ;
491 const char* addToCurveName ;
492 Double_t addToWgtSelf ;
493 Double_t addToWgtOther ;
495 RooFit::MPSplit interleave ;
496 const char* curveNameSuffix ;
501 const RooFitResult* errorFR ;
505 virtual RooPlot *plotOn(RooPlot* frame, PlotOpt o)
const;
509 virtual RooPlot* plotOn(RooPlot* frame, RooLinkedList& cmdList)
const ;
512 virtual RooPlot *plotAsymOn(RooPlot *frame,
const RooAbsCategoryLValue& asymCat, PlotOpt o)
const;
517 static ErrorLoggingMode _evalErrorMode ;
518 static std::map<const RooAbsArg*,std::pair<std::string,std::list<EvalError> > > _evalErrorList ;
519 static Int_t _evalErrorCount ;
521 Bool_t matchArgsByName(
const RooArgSet &allArgs, RooArgSet &matchedArgs,
const TList &nameList)
const;
526 friend class RooRealSumPdf ;
527 friend class RooRealSumFunc;
528 friend class RooAddPdf ;
529 friend class RooAddModel ;
530 void selectComp(Bool_t flag) {
534 static void globalSelectComp(Bool_t flag) ;
536 static Bool_t _globalSelectComp ;
539 struct GlobalSelectComponentRAII {
540 GlobalSelectComponentRAII(
bool state) :
541 _oldState{_globalSelectComp} {
542 if (state != RooAbsReal::_globalSelectComp)
543 RooAbsReal::_globalSelectComp = state;
546 ~GlobalSelectComponentRAII() {
547 if (RooAbsReal::_globalSelectComp != _oldState)
548 RooAbsReal::_globalSelectComp = _oldState;
555 mutable RooArgSet* _lastNSet ;
556 static Bool_t _hideOffset ;
558 ClassDef(RooAbsReal,2)