/***************************************************************************** * Project: RooFit * * Package: RooFitCore * * File: $Id: RooAbsPdf.h,v 1.90 2007/07/21 21:32:52 wouter Exp $ * Authors: * * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu * * DK, David Kirkby, UC Irvine, dkirkby@uci.edu * * * * Copyright (c) 2000-2005, Regents of the University of California * * and Stanford University. All rights reserved. * * * * Redistribution and use in source and binary forms, * * with or without modification, are permitted according to the terms * * listed in LICENSE (http://roofit.sourceforge.net/license.txt) * *****************************************************************************/ #ifndef ROO_ABS_PDF #define ROO_ABS_PDF #include "RooAbsReal.h" #include "RooRealIntegral.h" #include "RooNameSet.h" #include "RooObjCacheManager.h" #include "RooCmdArg.h" class RooDataSet; class RooArgSet ; class RooRealProxy ; class RooAbsGenContext ; class RooFitResult ; class RooExtendPdf ; class RooCategory ; class TPaveText; class TH1F; class TH2F; class TList ; class RooLinkedList ; class RooAbsPdf : public RooAbsReal { public: // Constructors, assignment etc RooAbsPdf() ; RooAbsPdf(const char *name, const char *title=0) ; RooAbsPdf(const char *name, const char *title, Double_t minVal, Double_t maxVal) ; // RooAbsPdf(const RooAbsPdf& other, const char* name=0); virtual ~RooAbsPdf(); // Toy MC generation RooDataSet *generate(const RooArgSet &whatVars, Int_t nEvents, const RooCmdArg& arg1, const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none()) ; RooDataSet *generate(const RooArgSet &whatVars, const RooCmdArg& arg1=RooCmdArg::none(),const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(),const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(),const RooCmdArg& arg6=RooCmdArg::none()) ; RooDataSet *generate(const RooArgSet &whatVars, Int_t nEvents = 0, Bool_t verbose=kFALSE) const; RooDataSet *generate(const RooArgSet &whatVars, const RooDataSet &prototype, Int_t nEvents= 0, Bool_t verbose=kFALSE, Bool_t randProtoOrder=kFALSE, Bool_t resampleProto=kFALSE) const; virtual RooPlot* plotOn(RooPlot* frame, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none(), const RooCmdArg& arg9=RooCmdArg::none(), const RooCmdArg& arg10=RooCmdArg::none() ) const { return RooAbsReal::plotOn(frame,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10) ; } virtual RooPlot* paramOn(RooPlot* frame, const RooCmdArg& arg1=RooCmdArg::none(), const RooCmdArg& arg2=RooCmdArg::none(), const RooCmdArg& arg3=RooCmdArg::none(), const RooCmdArg& arg4=RooCmdArg::none(), const RooCmdArg& arg5=RooCmdArg::none(), const RooCmdArg& arg6=RooCmdArg::none(), const RooCmdArg& arg7=RooCmdArg::none(), const RooCmdArg& arg8=RooCmdArg::none()) ; virtual RooPlot* paramOn(RooPlot* frame, const RooAbsData* data, const char *label= "", Int_t sigDigits = 2, Option_t *options = "NELU", Double_t xmin=0.50, Double_t xmax= 0.99,Double_t ymax=0.95) ; // Built-in generator support virtual Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const; virtual void initGenerator(Int_t code) ; virtual void generateEvent(Int_t code); virtual Bool_t isDirectGenSafe(const RooAbsArg& arg) const ; // Interactions with a dataset virtual RooFitResult* fitTo(RooAbsData& data, RooCmdArg arg1=RooCmdArg::none(), RooCmdArg arg2=RooCmdArg::none(), RooCmdArg arg3=RooCmdArg::none(), RooCmdArg arg4=RooCmdArg::none(), RooCmdArg arg5=RooCmdArg::none(), RooCmdArg arg6=RooCmdArg::none(), RooCmdArg arg7=RooCmdArg::none(), RooCmdArg arg8=RooCmdArg::none()) ; virtual RooFitResult* fitTo(RooAbsData& data, const RooLinkedList& cmdList) ; virtual RooFitResult* fitTo(RooAbsData& data, const RooArgSet& projDeps, Option_t *fitOpt = "", Option_t *optOpt = "c", const char* fitRange=0) ; virtual RooFitResult* fitTo(RooAbsData& data, Option_t *fitOpt, Option_t *optOpt = "c", const char* fitRange=0) ; virtual RooAbsReal* createNLL(RooAbsData& data, const RooLinkedList& cmdList) ; virtual RooAbsReal* createNLL(RooAbsData& data, RooCmdArg arg1=RooCmdArg::none(), RooCmdArg arg2=RooCmdArg::none(), RooCmdArg arg3=RooCmdArg::none(), RooCmdArg arg4=RooCmdArg::none(), RooCmdArg arg5=RooCmdArg::none(), RooCmdArg arg6=RooCmdArg::none(), RooCmdArg arg7=RooCmdArg::none(), RooCmdArg arg8=RooCmdArg::none()) ; // Constraint management virtual RooArgSet* getConstraints(const RooArgSet& /*observables*/, const RooArgSet& /*constrainedParams*/) const { // Interface to retrieve constraint terms on this pdf. Default implementation returns null return 0 ; } virtual RooArgSet* getAllConstraints(const RooArgSet& observables, const RooArgSet& constrainedParams) const ; // Project p.d.f into lower dimensional p.d.f virtual RooAbsPdf* createProjection(const RooArgSet& iset) ; // Create cumulative density function from p.d.f RooAbsReal* createCdf(const RooArgSet& iset, const RooArgSet& nset=RooArgSet()) ; RooAbsReal* createCdf(const RooArgSet& iset, const RooCmdArg arg1, const RooCmdArg arg2=RooCmdArg::none(), const RooCmdArg arg3=RooCmdArg::none(), const RooCmdArg arg4=RooCmdArg::none(), const RooCmdArg arg5=RooCmdArg::none(), const RooCmdArg arg6=RooCmdArg::none(), const RooCmdArg arg7=RooCmdArg::none(), const RooCmdArg arg8=RooCmdArg::none()) ; RooAbsReal* createScanCdf(const RooArgSet& iset, const RooArgSet& nset, Int_t numScanBins, Int_t intOrder) ; // Function evaluation support virtual Bool_t traceEvalHook(Double_t value) const ; virtual Double_t getVal(const RooArgSet* set=0) const ; virtual Double_t getLogVal(const RooArgSet* set=0) const ; Double_t getNorm(const RooArgSet& nset) const { // Get p.d.f normalization term needed for observables 'nset' return getNorm(&nset) ; } virtual Double_t getNorm(const RooArgSet* set=0) const ; virtual void resetErrorCounters(Int_t resetValue=10) ; void setTraceCounter(Int_t value, Bool_t allNodes=kFALSE) ; Bool_t traceEvalPdf(Double_t value) const ; Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ; virtual Bool_t selfNormalized() const { // If true, p.d.f is taken as self-normalized and no attempt is made to add a normalization term // This default implementation return false return kFALSE ; } // Support for extended maximum likelihood, switched off by default enum ExtendMode { CanNotBeExtended, CanBeExtended, MustBeExtended } ; virtual ExtendMode extendMode() const { // Returns ability of p.d.f to provided extended likelihood terms. Possible // answers are CanNotBeExtended, CanBeExtended or MustBeExtended. This // default implementation always return CanNotBeExtended return CanNotBeExtended ; } inline Bool_t canBeExtended() const { // If true p.d.f can provide extended likelihood term return (extendMode() != CanNotBeExtended) ; } inline Bool_t mustBeExtended() const { // If true p.d.f must extended likelihood term return (extendMode() == MustBeExtended) ; } virtual Double_t expectedEvents(const RooArgSet* nset) const ; virtual Double_t expectedEvents(const RooArgSet& nset) const { // Return expecteded number of p.d.fs to be used in calculated of extended likelihood return expectedEvents(&nset) ; } // Printing interface (human readable) virtual void printValue(ostream& os) const ; virtual void printMultiline(ostream& os, Int_t contents, Bool_t verbose=kFALSE, TString indent="") const ; static void verboseEval(Int_t stat) ; static int verboseEval() ; virtual Double_t extendedTerm(UInt_t observedEvents, const RooArgSet* nset=0) const ; static void clearEvalError() ; static Bool_t evalError() ; protected: public: virtual const RooAbsReal* getNormObj(const RooArgSet* set, const RooArgSet* iset, const TNamed* rangeName=0) const ; protected: // Implementation version virtual RooPlot* paramOn(RooPlot* frame, const RooArgSet& params, Bool_t showConstants=kFALSE, const char *label= "", Int_t sigDigits = 2, Option_t *options = "NELU", Double_t xmin=0.65, Double_t xmax= 0.99,Double_t ymax=0.95, const RooCmdArg* formatCmd=0) ; virtual RooPlot* plotOn(RooPlot* frame, RooLinkedList& cmdList) const ; void plotOnCompSelect(RooArgSet* selNodes) const ; virtual RooPlot *plotOn(RooPlot *frame, PlotOpt o) const; friend class RooEffGenContext ; friend class RooAddGenContext ; friend class RooProdGenContext ; friend class RooSimGenContext ; friend class RooConvGenContext ; friend class RooSimultaneous ; friend class RooAddGenContextOrig ; friend class RooMCStudy ; Int_t* randomizeProtoOrder(Int_t nProto,Int_t nGen,Bool_t resample=kFALSE) const ; virtual RooAbsGenContext* genContext(const RooArgSet &vars, const RooDataSet *prototype=0, const RooArgSet* auxProto=0, Bool_t verbose= kFALSE) const ; friend class RooExtendPdf ; // This also forces the definition of a copy ctor in derived classes RooAbsPdf(const RooAbsPdf& other, const char* name = 0); friend class RooRealIntegral ; static Int_t _verboseEval ; virtual Bool_t syncNormalization(const RooArgSet* dset, Bool_t adjustProxies=kTRUE) const ; friend class RooAbsAnaConvPdf ; mutable Double_t _rawValue ; mutable RooAbsReal* _norm ; //! Normalization integral (owned by _normMgr) mutable RooArgSet* _normSet ; //! Normalization set with for above integral class CacheElem : public RooAbsCacheElement { public: CacheElem(RooAbsReal& norm) : _norm(&norm) {} ; void operModeHook(RooAbsArg::OperMode) ; virtual ~CacheElem() ; virtual RooArgList containedArgs(Action) { return RooArgList(*_norm) ; } RooAbsReal* _norm ; } ; mutable RooObjCacheManager _normMgr ; // The cache manager friend class CacheElem ; // Cache needs to be able to clear _norm pointer virtual Bool_t redirectServersHook(const RooAbsCollection&, Bool_t, Bool_t, Bool_t) { // Hook function intercepting redirectServer calls. Discard current normalization // object if any server is redirected // Object is own by _normCacheManager that will delete object as soon as cache // is sterilized by server redirect _norm = 0 ; return kFALSE ; } ; mutable Int_t _errorCount ; // Number of errors remaining to print mutable Int_t _traceCount ; // Number of traces remaining to print mutable Int_t _negCount ; // Number of negative probablities remaining to print Bool_t _selectComp ; // Component selection flag for RooAbsPdf::plotCompOn static void raiseEvalError() ; static Bool_t _evalError ; ClassDef(RooAbsPdf,1) // Abstract PDF with normalization support }; #endif