28 typedef RooArgList* pRooArgList ;
 
   29 typedef RooLinkedList* pRooLinkedList ;
 
   31 class RooProdPdf : 
public RooAbsPdf {
 
   34   RooProdPdf(
const char *name, 
const char *title, Double_t cutOff=0);
 
   35   RooProdPdf(
const char *name, 
const char *title,
 
   36        RooAbsPdf& pdf1, RooAbsPdf& pdf2, Double_t cutOff=0) ;
 
   37   RooProdPdf(
const char* name, 
const char* title, 
const RooArgList& pdfList, Double_t cutOff=0) ;
 
   38   RooProdPdf(
const char* name, 
const char* title, 
const RooArgSet& fullPdfSet, 
const RooLinkedList& cmdArgList) ;
 
   40   RooProdPdf(
const char* name, 
const char* title, 
const RooArgSet& fullPdfSet,
 
   41            const RooCmdArg& arg1            , 
const RooCmdArg& arg2=RooCmdArg(),
 
   42              const RooCmdArg& arg3=RooCmdArg(), 
const RooCmdArg& arg4=RooCmdArg(),
 
   43              const RooCmdArg& arg5=RooCmdArg(), 
const RooCmdArg& arg6=RooCmdArg(),
 
   44              const RooCmdArg& arg7=RooCmdArg(), 
const RooCmdArg& arg8=RooCmdArg()) ;
 
   46   RooProdPdf(
const char* name, 
const char* title, 
 
   47              const RooCmdArg& arg1,             
const RooCmdArg& arg2=RooCmdArg(),
 
   48              const RooCmdArg& arg3=RooCmdArg(), 
const RooCmdArg& arg4=RooCmdArg(),
 
   49              const RooCmdArg& arg5=RooCmdArg(), 
const RooCmdArg& arg6=RooCmdArg(),
 
   50              const RooCmdArg& arg7=RooCmdArg(), 
const RooCmdArg& arg8=RooCmdArg()) ;
 
   52   RooProdPdf(
const RooProdPdf& other, 
const char* name=0) ;
 
   53   virtual TObject* clone(
const char* newname)
 const { 
return new RooProdPdf(*
this,newname) ; }
 
   54   virtual ~RooProdPdf() ;
 
   56   virtual Double_t getValV(
const RooArgSet* set=0) 
const ;
 
   57   virtual Bool_t checkObservables(
const RooArgSet* nset) 
const ;  
 
   59   virtual Bool_t forceAnalyticalInt(
const RooAbsArg& dep) 
const ; 
 
   60   Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& numVars, 
const RooArgSet* normSet, 
const char* rangeName=0) 
const ;
 
   61   Double_t analyticalIntegralWN(Int_t code, 
const RooArgSet* normSet, 
const char* rangeName=0) 
const ;
 
   62   virtual Bool_t selfNormalized()
 const { 
return _selfNorm ; }
 
   64   virtual ExtendMode extendMode() 
const ;
 
   65   virtual Double_t expectedEvents(
const RooArgSet* nset) 
const ; 
 
   66   virtual Double_t expectedEvents(
const RooArgSet& nset)
 const { 
return expectedEvents(&nset) ; }
 
   68   const RooArgList& pdfList()
 const { 
return _pdfList ; }
 
   70   virtual Int_t getGenerator(
const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) 
const;
 
   71   virtual void initGenerator(Int_t code) ;
 
   72   virtual void generateEvent(Int_t code);  
 
   73   virtual Bool_t isDirectGenSafe(
const RooAbsArg& arg) 
const ; 
 
   76   virtual RooArgSet* getConstraints(
const RooArgSet& observables, RooArgSet& constrainedParams, Bool_t stripDisconnected) 
const ;
 
   78   virtual std::list<Double_t>* plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) 
const ; 
 
   79   virtual std::list<Double_t>* binBoundaries(RooAbsRealLValue& , Double_t , Double_t ) 
const ;
 
   80   Bool_t isBinnedDistribution(
const RooArgSet& obs) 
const  ;
 
   82   void printMetaArgs(std::ostream& os) 
const ;
 
   84   virtual void selectNormalizationRange(
const char* rangeName=0, Bool_t force=kFALSE) ;
 
   85   void fixRefRange(
const char* rangeName) ;
 
   87   void setSelfNormalized(Bool_t flag) { _selfNorm = flag ; }
 
   88   void setDefNormSet(
const RooArgSet& nset) { _defNormSet.removeAll() ; _defNormSet.addClone(nset) ; }
 
   91   Bool_t redirectServersHook(
const RooAbsCollection& , Bool_t , Bool_t , Bool_t ) ;
 
   93   RooArgSet* getConnectedParameters(
const RooArgSet& observables) 
const ;
 
   95   RooArgSet* findPdfNSet(RooAbsPdf& pdf) 
const ; 
 
  100   Double_t evaluate() 
const ;
 
  101   virtual RooSpan<double> evaluateBatch(std::size_t begin, std::size_t size) 
const;
 
  103   RooAbsReal* makeCondPdfRatioCorr(RooAbsReal& term, 
const RooArgSet& termNset, 
const RooArgSet& termImpSet, 
const char* normRange, 
const char* refRange) 
const ;
 
  105   virtual void getParametersHook(
const RooArgSet* , RooArgSet* , Bool_t stripDisconnected) 
const ;
 
  107   void initializeFromCmdArgList(
const RooArgSet& fullPdfSet, 
const RooLinkedList& l) ;
 
  109   void factorizeProduct(
const RooArgSet& normSet, 
const RooArgSet& intSet, 
 
  110                         RooLinkedList& termList,   RooLinkedList& normList, 
 
  111                         RooLinkedList& impDepList, RooLinkedList& crossDepList,
 
  112                         RooLinkedList& intList) 
const;
 
  113   std::string makeRGPPName(
const char* pfx, 
const RooArgSet& term, 
const RooArgSet& iset, 
const RooArgSet& nset, 
const char* isetRangeName) 
const ;
 
  114   void groupProductTerms(RooLinkedList& groupedTerms, RooArgSet& outerIntDeps,
 
  115                          const RooLinkedList& terms, 
const RooLinkedList& norms, 
 
  116                          const RooLinkedList& imps, 
const RooLinkedList& ints, 
const RooLinkedList& cross) 
const ;
 
  120   Int_t getPartIntList(
const RooArgSet* nset, 
const RooArgSet* iset, 
const char* isetRangeName=0) 
const ;
 
  122   std::vector<RooAbsReal*> processProductTerm(
const RooArgSet* nset, 
const RooArgSet* iset, 
const char* isetRangeName,
 
  123                      const RooArgSet* term,
const RooArgSet& termNSet, 
const RooArgSet& termISet, 
 
  124                      Bool_t& isOwned, Bool_t forceWrap=kFALSE) 
const ;
 
  127   virtual CacheMode canNodeBeCached()
 const { 
return RooAbsArg::NotAdvised ; } ;
 
  128   virtual void setCacheAndTrackHints(RooArgSet&) ;
 
  131   class CacheElem : 
public RooAbsCacheElement {
 
  133     CacheElem() : _isRearranged(kFALSE) { } 
 
  134     virtual ~CacheElem() = 
default;
 
  136     RooArgList _partList ;
 
  137     RooArgList _numList ;
 
  138     RooArgList _denList ;
 
  139     RooArgList _ownedList ;
 
  140     std::vector<std::unique_ptr<RooArgSet>> _normList;
 
  141     Bool_t _isRearranged ;
 
  142     std::unique_ptr<RooAbsReal> _rearrangedNum{};
 
  143     std::unique_ptr<RooAbsReal> _rearrangedDen{};
 
  145     virtual RooArgList containedArgs(Action) ;
 
  146     virtual void printCompactTreeHook(std::ostream&, 
const char *, Int_t, Int_t) ;
 
  148     CacheElem(
const CacheElem&) ;
 
  150   mutable RooObjCacheManager _cacheMgr ; 
 
  152   void rearrangeProduct(CacheElem&) 
const;
 
  153   RooAbsReal* specializeIntegral(RooAbsReal& orig, 
const char* targetRangeName) 
const ;
 
  154   RooAbsReal* specializeRatio(RooFormulaVar& input, 
const char* targetRangeName) 
const ;
 
  155   Double_t calculate(
const RooProdPdf::CacheElem& cache, Bool_t verbose=kFALSE) 
const ;
 
  158   friend class RooProdGenContext ;
 
  159   virtual RooAbsGenContext* genContext(
const RooArgSet &vars, 
const RooDataSet *prototype=0, 
 
  160                                   const RooArgSet *auxProto=0, Bool_t verbose= kFALSE) 
const ;
 
  163   mutable RooAICRegistry _genCode ; 
 
  165   mutable RooArgSet* _curNormSet = 
nullptr; 
 
  167   RooListProxy _pdfList ;  
 
  168   RooLinkedList _pdfNSetList ; 
 
  169   Int_t _extendedIndex ;   
 
  171   void useDefaultGen(Bool_t flag=kTRUE) { _useDefaultGen = flag ; }
 
  172   Bool_t _useDefaultGen ; 
 
  174   mutable TNamed* _refRangeName ; 
 
  177   RooArgSet _defNormSet ; 
 
  181   ClassDef(RooProdPdf,4)