// @(#)root/roostats:$Id:  cranmer $
// Author: George Lewis, Kyle Cranmer
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/


#ifndef ROO_PARAMHISTFUNC
#define ROO_PARAMHISTFUNC

#include <map>
#include "RooAbsReal.h"
#include "RooRealProxy.h"
#include "RooListProxy.h"
#include "RooObjCacheManager.h"
#include "RooDataHist.h"

// Forward Declarations
class RooRealVar;
class RooArgList ;
class RooWorkspace;
class RooBinning;

class ParamHistFunc : public RooAbsReal {
public:

  ParamHistFunc() ;
  ParamHistFunc(const char *name, const char *title, const RooArgList& vars, const RooArgList& paramSet );
  ParamHistFunc(const char *name, const char *title, const RooArgList& vars, const RooArgList& paramSet, const TH1* hist );
  virtual ~ParamHistFunc() ;

  ParamHistFunc(const ParamHistFunc& other, const char* name = 0);
  virtual TObject* clone(const char* newname) const { return new ParamHistFunc(*this, newname); }

  const RooArgList& paramList() const { return _paramSet ; }

  Int_t numBins() const { return _dataSet.numEntries(); } // Number of bins (called numEntries in RooDataHist)

  void setParamConst( Int_t, Bool_t=kTRUE );
  void setConstant(bool constant);

  void setShape(TH1* shape);

  RooRealVar& getParameter() const ;
  RooRealVar& getParameter( Int_t masterIdx ) const ;

  const RooArgSet* get(Int_t masterIdx) const { return _dataSet.get( masterIdx ) ; } 
  const RooArgSet* get(const RooArgSet& coord) const { return _dataSet.get( coord ) ; } 

  double binVolume() const { return _dataSet.binVolume(); }

  virtual Bool_t forceAnalyticalInt(const RooAbsArg&) const { return kTRUE ; }

  Int_t getAnalyticalIntegralWN(RooArgSet& allVars, RooArgSet& analVars, const RooArgSet* normSet,const char* rangeName=0) const ;
  Double_t analyticalIntegralWN(Int_t code, const RooArgSet* normSet, const char* rangeName=0) const ;

  static RooArgList createParamSet(RooWorkspace& w, const std::string&, const RooArgList& Vars);
  static RooArgList createParamSet(RooWorkspace& w, const std::string&, const RooArgList& Vars, Double_t, Double_t);
  static RooArgList createParamSet(const std::string&, Int_t, Double_t, Double_t);

  virtual std::list<Double_t>* binBoundaries(RooAbsRealLValue& /*obs*/, Double_t /*xlo*/, Double_t /*xhi*/) const ;
  virtual std::list<Double_t>* plotSamplingHint(RooAbsRealLValue& obs, Double_t xlo, Double_t xhi) const ; 
  virtual Bool_t isBinnedDistribution(const RooArgSet& /*obs*/) const {return kTRUE;}


protected:

  class CacheElem : public RooAbsCacheElement {
  public:
    CacheElem()  {} ;
    virtual ~CacheElem() {} ; 
    virtual RooArgList containedArgs(Action) { 
      RooArgList ret(_funcIntList) ; 
      ret.add(_lowIntList); 
      ret.add(_highIntList);
      return ret ; 
    }
    RooArgList _funcIntList ;
    RooArgList _lowIntList ;
    RooArgList _highIntList ;
    // will want std::vector<RooRealVar*> for low and high also
  } ;
  mutable RooObjCacheManager _normIntMgr ; // The integration cache manager

  // Turn into a RooListProxy
  //RooRealProxy _dataVar;       // The RooRealVar
  RooListProxy _dataVars;       // The RooRealVars
  RooListProxy _paramSet ;            // interpolation parameters
  //RooAbsBinning* _binning;  // Holds the binning of the dataVar (at construction time)

  Int_t _numBins;
  mutable std::map<Int_t, Int_t> _binMap;
  mutable RooDataHist _dataSet;
   //Bool_t _normalized;

  // std::vector< Double_t > _nominalVals; // The nominal vals when gamma = 1.0 ( = 1.0 by default)
  RooArgList   _ownedList ;       // List of owned components

  Int_t getCurrentBin() const ;
  Int_t addVarSet( const RooArgList& vars );
  Int_t addParamSet( const RooArgList& params );
  static Int_t GetNumBins( const RooArgSet& vars );
  Double_t evaluate() const;

  ClassDef(ParamHistFunc,5) // Sum of RooAbsReal objects
};

#endif
 ParamHistFunc.h:1
 ParamHistFunc.h:2
 ParamHistFunc.h:3
 ParamHistFunc.h:4
 ParamHistFunc.h:5
 ParamHistFunc.h:6
 ParamHistFunc.h:7
 ParamHistFunc.h:8
 ParamHistFunc.h:9
 ParamHistFunc.h:10
 ParamHistFunc.h:11
 ParamHistFunc.h:12
 ParamHistFunc.h:13
 ParamHistFunc.h:14
 ParamHistFunc.h:15
 ParamHistFunc.h:16
 ParamHistFunc.h:17
 ParamHistFunc.h:18
 ParamHistFunc.h:19
 ParamHistFunc.h:20
 ParamHistFunc.h:21
 ParamHistFunc.h:22
 ParamHistFunc.h:23
 ParamHistFunc.h:24
 ParamHistFunc.h:25
 ParamHistFunc.h:26
 ParamHistFunc.h:27
 ParamHistFunc.h:28
 ParamHistFunc.h:29
 ParamHistFunc.h:30
 ParamHistFunc.h:31
 ParamHistFunc.h:32
 ParamHistFunc.h:33
 ParamHistFunc.h:34
 ParamHistFunc.h:35
 ParamHistFunc.h:36
 ParamHistFunc.h:37
 ParamHistFunc.h:38
 ParamHistFunc.h:39
 ParamHistFunc.h:40
 ParamHistFunc.h:41
 ParamHistFunc.h:42
 ParamHistFunc.h:43
 ParamHistFunc.h:44
 ParamHistFunc.h:45
 ParamHistFunc.h:46
 ParamHistFunc.h:47
 ParamHistFunc.h:48
 ParamHistFunc.h:49
 ParamHistFunc.h:50
 ParamHistFunc.h:51
 ParamHistFunc.h:52
 ParamHistFunc.h:53
 ParamHistFunc.h:54
 ParamHistFunc.h:55
 ParamHistFunc.h:56
 ParamHistFunc.h:57
 ParamHistFunc.h:58
 ParamHistFunc.h:59
 ParamHistFunc.h:60
 ParamHistFunc.h:61
 ParamHistFunc.h:62
 ParamHistFunc.h:63
 ParamHistFunc.h:64
 ParamHistFunc.h:65
 ParamHistFunc.h:66
 ParamHistFunc.h:67
 ParamHistFunc.h:68
 ParamHistFunc.h:69
 ParamHistFunc.h:70
 ParamHistFunc.h:71
 ParamHistFunc.h:72
 ParamHistFunc.h:73
 ParamHistFunc.h:74
 ParamHistFunc.h:75
 ParamHistFunc.h:76
 ParamHistFunc.h:77
 ParamHistFunc.h:78
 ParamHistFunc.h:79
 ParamHistFunc.h:80
 ParamHistFunc.h:81
 ParamHistFunc.h:82
 ParamHistFunc.h:83
 ParamHistFunc.h:84
 ParamHistFunc.h:85
 ParamHistFunc.h:86
 ParamHistFunc.h:87
 ParamHistFunc.h:88
 ParamHistFunc.h:89
 ParamHistFunc.h:90
 ParamHistFunc.h:91
 ParamHistFunc.h:92
 ParamHistFunc.h:93
 ParamHistFunc.h:94
 ParamHistFunc.h:95
 ParamHistFunc.h:96
 ParamHistFunc.h:97
 ParamHistFunc.h:98
 ParamHistFunc.h:99
 ParamHistFunc.h:100
 ParamHistFunc.h:101
 ParamHistFunc.h:102
 ParamHistFunc.h:103
 ParamHistFunc.h:104
 ParamHistFunc.h:105
 ParamHistFunc.h:106
 ParamHistFunc.h:107
 ParamHistFunc.h:108
 ParamHistFunc.h:109
 ParamHistFunc.h:110
 ParamHistFunc.h:111
 ParamHistFunc.h:112