00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_ABS_REAL
00017 #define ROO_ABS_REAL
00018
00019 #include "RooAbsArg.h"
00020 #include "RooCmdArg.h"
00021 #include "RooCurve.h"
00022 #include "RooArgSet.h"
00023 #include "RooArgList.h"
00024 #include "RooGlobalFunc.h"
00025
00026 class RooArgList ;
00027 class RooDataSet ;
00028 class RooPlot;
00029 class RooRealVar;
00030 class RooAbsFunc;
00031 class RooAbsCategoryLValue ;
00032 class RooCategory ;
00033 class RooLinkedList ;
00034 class RooNumIntConfig ;
00035 class RooDataHist ;
00036 class RooFunctor ;
00037 class RooGenFunction ;
00038 class RooMultiGenFunction ;
00039 class RooFitResult ;
00040 class RooMoment ;
00041 class RooDerivative ;
00042
00043 class TH1;
00044 class TH1F;
00045 class TH2F;
00046 class TH3F;
00047
00048 #include <list>
00049 #include <string>
00050 #include <iostream>
00051
00052
00053 class RooAbsReal : public RooAbsArg {
00054 public:
00055
00056 RooAbsReal() ;
00057 RooAbsReal(const char *name, const char *title, const char *unit= "") ;
00058 RooAbsReal(const char *name, const char *title, Double_t minVal, Double_t maxVal,
00059 const char *unit= "") ;
00060 RooAbsReal(const RooAbsReal& other, const char* name=0);
00061 virtual ~RooAbsReal();
00062
00063
00064 virtual Double_t getVal(const RooArgSet* set=0) const ;
00065 inline Double_t getVal(const RooArgSet& set) const {
00066
00067 return getVal(&set) ;
00068 }
00069
00070
00071 Double_t getPropagatedError(const RooFitResult& fr) ;
00072
00073 Bool_t operator==(Double_t value) const ;
00074 virtual Bool_t operator==(const RooAbsArg& other) ;
00075 inline const Text_t *getUnit() const {
00076
00077 return _unit.Data();
00078 }
00079 inline void setUnit(const char *unit) {
00080
00081 _unit= unit;
00082 }
00083 TString getTitle(Bool_t appendUnit= kFALSE) const;
00084
00085
00086 RooAbsFunc *bindVars(const RooArgSet &vars, const RooArgSet* nset=0, Bool_t clipInvalid=kFALSE) const;
00087
00088
00089 RooAbsArg *createFundamental(const char* newname=0) const;
00090
00091
00092 virtual Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, const RooArgSet* normSet, const char* rangeName=0) const ;
00093 virtual Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;
00094 virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const ;
00095 virtual Double_t analyticalIntegral(Int_t code, const char* rangeName=0) const ;
00096 virtual Bool_t forceAnalyticalInt(const RooAbsArg& ) const {
00097
00098
00099 return kFALSE ;
00100 }
00101 virtual void forceNumInt(Bool_t flag=kTRUE) {
00102
00103
00104 _forceNumInt = flag ;
00105 }
00106
00107
00108 virtual RooFitResult* chi2FitTo(RooDataHist& data, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
00109 const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
00110 const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
00111 virtual RooFitResult* chi2FitTo(RooDataHist& data, const RooLinkedList& cmdList) ;
00112
00113 virtual RooAbsReal* createChi2(RooDataHist& data, const RooLinkedList& cmdList) ;
00114 virtual RooAbsReal* createChi2(RooDataHist& data, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
00115 const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
00116 const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
00117
00118
00119 virtual RooFitResult* chi2FitTo(RooDataSet& xydata, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
00120 const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
00121 const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
00122 virtual RooFitResult* chi2FitTo(RooDataSet& xydata, const RooLinkedList& cmdList) ;
00123
00124 virtual RooAbsReal* createChi2(RooDataSet& data, const RooLinkedList& cmdList) ;
00125 virtual RooAbsReal* createChi2(RooDataSet& data, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
00126 const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),
00127 const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
00128
00129
00130 virtual RooAbsReal* createProfile(const RooArgSet& paramsOfInterest) ;
00131
00132
00133 RooAbsReal* createIntegral(const RooArgSet& iset, const RooCmdArg& arg1, const RooCmdArg& arg2=RooCmdArg::none(),
00134 const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(),
00135 const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(),
00136 const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) const ;
00137
00138 RooAbsReal* createIntegral(const RooArgSet& iset, const char* rangeName) const {
00139
00140 return createIntegral(iset,0,0,rangeName) ;
00141 }
00142 RooAbsReal* createIntegral(const RooArgSet& iset, const RooArgSet& nset, const char* rangeName=0) const {
00143
00144 return createIntegral(iset,&nset,0,rangeName) ;
00145 }
00146 RooAbsReal* createIntegral(const RooArgSet& iset, const RooArgSet& nset, const RooNumIntConfig& cfg, const char* rangeName=0) const {
00147
00148
00149 return createIntegral(iset,&nset,&cfg,rangeName) ;
00150 }
00151 RooAbsReal* createIntegral(const RooArgSet& iset, const RooNumIntConfig& cfg, const char* rangeName=0) const {
00152
00153 return createIntegral(iset,0,&cfg,rangeName) ;
00154 }
00155 virtual RooAbsReal* createIntegral(const RooArgSet& iset, const RooArgSet* nset=0, const RooNumIntConfig* cfg=0, const char* rangeName=0) const ;
00156
00157
00158 RooAbsReal* createRunningIntegral(const RooArgSet& iset, const RooArgSet& nset=RooArgSet()) ;
00159 RooAbsReal* createRunningIntegral(const RooArgSet& iset, const RooCmdArg& arg1, const RooCmdArg& arg2=RooCmdArg::none(),
00160 const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(),
00161 const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(),
00162 const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ;
00163 RooAbsReal* createIntRI(const RooArgSet& iset, const RooArgSet& nset=RooArgSet()) ;
00164 RooAbsReal* createScanRI(const RooArgSet& iset, const RooArgSet& nset, Int_t numScanBins, Int_t intOrder) ;
00165
00166
00167
00168 virtual Int_t getMaxVal(const RooArgSet& vars) const ;
00169 virtual Double_t maxVal(Int_t code) const ;
00170 virtual Int_t minTrialSamples(const RooArgSet& ) const { return 0 ; }
00171
00172
00173
00174 void setPlotLabel(const char *label);
00175 const char *getPlotLabel() const;
00176
00177 virtual Double_t defaultErrorLevel() const {
00178
00179 return 1.0 ;
00180 }
00181
00182 const RooNumIntConfig* getIntegratorConfig() const ;
00183 RooNumIntConfig* getIntegratorConfig() ;
00184 static RooNumIntConfig* defaultIntegratorConfig() ;
00185 RooNumIntConfig* specialIntegratorConfig() const ;
00186 RooNumIntConfig* specialIntegratorConfig(Bool_t createOnTheFly) ;
00187 void setIntegratorConfig() ;
00188 void setIntegratorConfig(const RooNumIntConfig& config) ;
00189
00190 virtual void fixAddCoefNormalization(const RooArgSet& addNormSet=RooArgSet(),Bool_t force=kTRUE) ;
00191 virtual void fixAddCoefRange(const char* rangeName=0,Bool_t force=kTRUE) ;
00192
00193 virtual void preferredObservableScanOrder(const RooArgSet& obs, RooArgSet& orderedObs) const ;
00194
00195
00196 virtual RooPlot* plotOn(RooPlot* frame,
00197 const RooCmdArg& arg1=RooCmdArg(), const RooCmdArg& arg2=RooCmdArg(),
00198 const RooCmdArg& arg3=RooCmdArg(), const RooCmdArg& arg4=RooCmdArg(),
00199 const RooCmdArg& arg5=RooCmdArg(), const RooCmdArg& arg6=RooCmdArg(),
00200 const RooCmdArg& arg7=RooCmdArg(), const RooCmdArg& arg8=RooCmdArg(),
00201 const RooCmdArg& arg9=RooCmdArg(), const RooCmdArg& arg10=RooCmdArg()
00202 ) const ;
00203
00204
00205 enum ScaleType { Raw, Relative, NumEvent, RelativeExpected } ;
00206
00207
00208 virtual RooPlot *plotSliceOn(RooPlot *frame, const RooArgSet& sliceSet, Option_t* drawOptions="L",
00209 Double_t scaleFactor=1.0, ScaleType stype=Relative, const RooAbsData* projData=0) const;
00210
00211
00212 TH1 *fillHistogram(TH1 *hist, const RooArgList &plotVars,
00213 Double_t scaleFactor= 1, const RooArgSet *projectedVars= 0, Bool_t scaling=kTRUE,
00214 const RooArgSet* condObs=0, Bool_t setError=kTRUE) const;
00215
00216
00217 TH1 *createHistogram(const char* varNameList, Int_t xbins=0, Int_t ybins=0, Int_t zbins=0) const ;
00218 TH1* createHistogram(const char *name, const RooAbsRealLValue& xvar, RooLinkedList& argList) const ;
00219 TH1 *createHistogram(const char *name, const RooAbsRealLValue& xvar,
00220 const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(),
00221 const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(),
00222 const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(),
00223 const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) const ;
00224
00225
00226 RooDataHist* fillDataHist(RooDataHist *hist, const RooArgSet* nset, Double_t scaleFactor,
00227 Bool_t correctForBinVolume=kFALSE, Bool_t showProgress=kFALSE) const ;
00228
00229
00230 virtual Bool_t readFromStream(istream& is, Bool_t compact, Bool_t verbose=kFALSE) ;
00231 virtual void writeToStream(ostream& os, Bool_t compact) const ;
00232
00233
00234 virtual void printValue(ostream& os) const ;
00235 virtual void printMultiline(ostream& os, Int_t contents, Bool_t verbose=kFALSE, TString indent="") const ;
00236
00237 static void setCacheCheck(Bool_t flag) ;
00238
00239
00240 class EvalError {
00241 public:
00242 EvalError() { _msg[0] = 0 ; _srvval[0] = 0 ; }
00243 EvalError(const EvalError& other) { strlcpy(_msg,other._msg,1024) ; strlcpy(_srvval,other._srvval,1024) ; } ;
00244 void setMessage(const char* tmp) ;
00245 void setServerValues(const char* tmp) ;
00246 char _msg[1024] ;
00247 char _srvval[1024] ;
00248 } ;
00249
00250 enum ErrorLoggingMode { PrintErrors, CollectErrors, CountErrors } ;
00251 static ErrorLoggingMode evalErrorLoggingMode() ;
00252 static void setEvalErrorLoggingMode(ErrorLoggingMode m) ;
00253 void logEvalError(const char* message, const char* serverValueString=0) const ;
00254 static void logEvalError(const RooAbsReal* originator, const char* origName, const char* message, const char* serverValueString=0) ;
00255 static void printEvalErrors(ostream&os=std::cout, Int_t maxPerNode=10000000) ;
00256 static Int_t numEvalErrors() ;
00257 static Int_t numEvalErrorItems() { return _evalErrorList.size() ; }
00258
00259
00260 typedef std::map<const RooAbsArg*,std::pair<std::string,std::list<EvalError> > >::const_iterator EvalErrorIter ;
00261 static EvalErrorIter evalErrorIter() { return _evalErrorList.begin() ; }
00262
00263 static void clearEvalErrorLog() ;
00264
00265 virtual std::list<Double_t>* plotSamplingHint(RooAbsRealLValue& , Double_t , Double_t ) const {
00266
00267
00268 return 0 ;
00269 }
00270
00271 RooGenFunction* iGenFunction(RooRealVar& x, const RooArgSet& nset=RooArgSet()) ;
00272 RooMultiGenFunction* iGenFunction(const RooArgSet& observables, const RooArgSet& nset=RooArgSet()) ;
00273
00274 RooFunctor* functor(const RooArgList& obs, const RooArgList& pars=RooArgList(), const RooArgSet& nset=RooArgSet()) const ;
00275 TF1* asTF(const RooArgList& obs, const RooArgList& pars=RooArgList(), const RooArgSet& nset=RooArgSet()) const ;
00276
00277 RooDerivative* derivative(RooRealVar& obs, Int_t order=1, Double_t eps=0.001) ;
00278 RooDerivative* derivative(RooRealVar& obs, const RooArgSet& normSet, Int_t order, Double_t eps=0.001) ;
00279
00280 RooMoment* moment(RooRealVar& obs, Int_t order, Bool_t central, Bool_t takeRoot) ;
00281 RooMoment* moment(RooRealVar& obs, const RooArgSet& normObs, Int_t order, Bool_t central, Bool_t takeRoot, Bool_t intNormObs) ;
00282
00283 RooMoment* mean(RooRealVar& obs) { return moment(obs,1,kFALSE,kFALSE) ; }
00284 RooMoment* mean(RooRealVar& obs, const RooArgSet& nset) { return moment(obs,nset,1,kFALSE,kFALSE,kTRUE) ; }
00285 RooMoment* sigma(RooRealVar& obs) { return moment(obs,2,kTRUE,kTRUE) ; }
00286 RooMoment* sigma(RooRealVar& obs, const RooArgSet& nset) { return moment(obs,nset,2,kTRUE,kTRUE,kTRUE) ; }
00287
00288 Double_t findRoot(RooRealVar& x, Double_t xmin, Double_t xmax, Double_t yval) ;
00289
00290
00291 protected:
00292
00293
00294 virtual RooPlot* plotOn(RooPlot* frame, RooLinkedList& cmdList) const ;
00295
00296
00297 virtual void selectNormalization(const RooArgSet* depSet=0, Bool_t force=kFALSE) ;
00298 virtual void selectNormalizationRange(const char* rangeName=0, Bool_t force=kFALSE) ;
00299
00300
00301 Bool_t plotSanityChecks(RooPlot* frame) const ;
00302 void makeProjectionSet(const RooAbsArg* plotVar, const RooArgSet* allVars,
00303 RooArgSet& projectedVars, Bool_t silent) const ;
00304
00305 TString integralNameSuffix(const RooArgSet& iset, const RooArgSet* nset=0, const char* rangeName=0, Bool_t omitEmpty=kFALSE) const ;
00306
00307
00308 Bool_t isSelectedComp() const ;
00309
00310
00311 public:
00312 const RooAbsReal* createPlotProjection(const RooArgSet& depVars, const RooArgSet& projVars) const ;
00313 const RooAbsReal* createPlotProjection(const RooArgSet& depVars, const RooArgSet& projVars, RooArgSet*& cloneSet) const ;
00314 const RooAbsReal *createPlotProjection(const RooArgSet &dependentVars, const RooArgSet *projectedVars,
00315 RooArgSet *&cloneSet, const char* rangeName=0, const RooArgSet* condObs=0) const;
00316 protected:
00317
00318 RooFitResult* chi2FitDriver(RooAbsReal& fcn, RooLinkedList& cmdList) ;
00319
00320 RooPlot* plotOnWithErrorBand(RooPlot* frame,const RooFitResult& fr, Double_t Z, const RooArgSet* params, const RooLinkedList& argList, Bool_t method1) const ;
00321
00322
00323
00324
00325 Bool_t matchArgs(const RooArgSet& allDeps, RooArgSet& numDeps,
00326 const RooArgProxy& a) const ;
00327 Bool_t matchArgs(const RooArgSet& allDeps, RooArgSet& numDeps,
00328 const RooArgProxy& a, const RooArgProxy& b) const ;
00329 Bool_t matchArgs(const RooArgSet& allDeps, RooArgSet& numDeps,
00330 const RooArgProxy& a, const RooArgProxy& b, const RooArgProxy& c) const ;
00331 Bool_t matchArgs(const RooArgSet& allDeps, RooArgSet& numDeps,
00332 const RooArgProxy& a, const RooArgProxy& b,
00333 const RooArgProxy& c, const RooArgProxy& d) const ;
00334
00335 Bool_t matchArgs(const RooArgSet& allDeps, RooArgSet& numDeps,
00336 const RooArgSet& set) const ;
00337
00338
00339 RooAbsReal* createIntObj(const RooArgSet& iset, const RooArgSet* nset, const RooNumIntConfig* cfg, const char* rangeName) const ;
00340 void findInnerMostIntegration(const RooArgSet& allObs, RooArgSet& innerObs, const char* rangeName) const ;
00341
00342
00343
00344 virtual Bool_t isValid() const ;
00345 virtual Bool_t isValidReal(Double_t value, Bool_t printError=kFALSE) const ;
00346
00347
00348 Double_t traceEval(const RooArgSet* set) const ;
00349 virtual Bool_t traceEvalHook(Double_t ) const {
00350
00351 return kFALSE ;
00352 }
00353 virtual Double_t evaluate() const = 0 ;
00354
00355
00356 friend class RooRealIntegral ;
00357 virtual void syncCache(const RooArgSet* set=0) { getVal(set) ; }
00358 virtual void copyCache(const RooAbsArg* source, Bool_t valueOnly=kFALSE) ;
00359 virtual void attachToTree(TTree& t, Int_t bufSize=32000) ;
00360 virtual void setTreeBranchStatus(TTree& t, Bool_t active) ;
00361 virtual void fillTreeBranch(TTree& t) ;
00362
00363 Double_t _plotMin ;
00364 Double_t _plotMax ;
00365 Int_t _plotBins ;
00366 mutable Double_t _value ;
00367 TString _unit ;
00368 TString _label ;
00369 Bool_t _forceNumInt ;
00370
00371 mutable Float_t _floatValue ;
00372 mutable Int_t _intValue ;
00373 mutable UChar_t _byteValue ;
00374 mutable Char_t _sbyteValue ;
00375 mutable UInt_t _uintValue ;
00376
00377 friend class RooAbsPdf ;
00378 friend class RooAbsAnaConvPdf ;
00379 friend class RooRealProxy ;
00380
00381 RooNumIntConfig* _specIntegratorConfig ;
00382
00383 Bool_t _treeVar ;
00384
00385 static Bool_t _cacheCheck ;
00386
00387 friend class RooDataProjBinding ;
00388 friend class RooAbsOptGoodnessOfFit ;
00389
00390 struct PlotOpt {
00391 PlotOpt() : drawOptions("L"), scaleFactor(1.0), stype(Relative), projData(0), binProjData(kFALSE), projSet(0), precision(1e-3),
00392 shiftToZero(kFALSE),projDataSet(0),normRangeName(0),rangeLo(0),rangeHi(0),postRangeFracScale(kFALSE),wmode(RooCurve::Extended),
00393 projectionRangeName(0),curveInvisible(kFALSE), curveName(0),addToCurveName(0),addToWgtSelf(1.),addToWgtOther(1.),
00394 numCPU(1),interleave(kTRUE),curveNameSuffix(""), numee(10), eeval(0), doeeval(kFALSE), progress(kFALSE) {} ;
00395 Option_t* drawOptions ;
00396 Double_t scaleFactor ;
00397 ScaleType stype ;
00398 const RooAbsData* projData ;
00399 Bool_t binProjData ;
00400 const RooArgSet* projSet ;
00401 Double_t precision ;
00402 Bool_t shiftToZero ;
00403 const RooArgSet* projDataSet ;
00404 const char* normRangeName ;
00405 Double_t rangeLo ;
00406 Double_t rangeHi ;
00407 Bool_t postRangeFracScale ;
00408 RooCurve::WingMode wmode ;
00409 const char* projectionRangeName ;
00410 Bool_t curveInvisible ;
00411 const char* curveName ;
00412 const char* addToCurveName ;
00413 Double_t addToWgtSelf ;
00414 Double_t addToWgtOther ;
00415 Int_t numCPU ;
00416 Bool_t interleave ;
00417 const char* curveNameSuffix ;
00418 Int_t numee ;
00419 Double_t eeval ;
00420 Bool_t doeeval ;
00421 Bool_t progress ;
00422 } ;
00423
00424
00425 virtual RooPlot *plotOn(RooPlot* frame, PlotOpt o) const;
00426 virtual RooPlot *plotAsymOn(RooPlot *frame, const RooAbsCategoryLValue& asymCat, PlotOpt o) const;
00427
00428
00429 private:
00430
00431 static ErrorLoggingMode _evalErrorMode ;
00432 static std::map<const RooAbsArg*,std::pair<std::string,std::list<EvalError> > > _evalErrorList ;
00433 static Int_t _evalErrorCount ;
00434
00435 Bool_t matchArgsByName(const RooArgSet &allArgs, RooArgSet &matchedArgs, const TList &nameList) const;
00436
00437 protected:
00438
00439
00440 friend class RooRealSumPdf ;
00441 friend class RooAddPdf ;
00442 friend class RooAddModel ;
00443 void selectComp(Bool_t flag) {
00444
00445 _selectComp = flag ;
00446 }
00447 static void globalSelectComp(Bool_t flag) ;
00448 Bool_t _selectComp ;
00449 static Bool_t _globalSelectComp ;
00450
00451 mutable RooArgSet* _lastNSet ;
00452
00453
00454 ClassDef(RooAbsReal,2)
00455 };
00456
00457 #endif