// @(#)root/roostats:$Id:  cranmer $
// Author: Kyle Cranmer, Akira Shibata
/*************************************************************************
 * 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 ROOSTATS_FLEXIBLEINTERPVAR
#define ROOSTATS_FLEXIBLEINTERPVAR

#include "RooAbsPdf.h"
#include "RooRealProxy.h"
#include "RooListProxy.h"
#include <vector>

class RooRealVar;
class RooArgList ;

namespace RooStats{
namespace HistFactory{

  class FlexibleInterpVar : public RooAbsReal {
  public:

    FlexibleInterpVar() ;
    FlexibleInterpVar(const char *name, const char *title,
		      const RooArgList& _paramList, 
		      Double_t nominal, const RooArgList& low, const RooArgList& high);

    FlexibleInterpVar(const char *name, const char *title,
		      const RooArgList& _paramList, 
		      double nominal, std::vector<double> low, std::vector<double> high);

    FlexibleInterpVar(const char *name, const char *title,
		      const RooArgList& _paramList, double nominal, std::vector<double> low, 
		      std::vector<double> high,std::vector<int> code);

    FlexibleInterpVar(const char *name, const char *title);
    FlexibleInterpVar(const FlexibleInterpVar&, const char*);

    void setInterpCode(RooAbsReal& param, int code);
    void setAllInterpCodes(int code);
    void setGlobalBoundary(double boundary) {_interpBoundary = boundary;}
    void setNominal(Double_t newNominal);
    void setLow(RooAbsReal& param, Double_t newLow);
    void setHigh(RooAbsReal& param, Double_t newHigh);

    void printAllInterpCodes();

    virtual TObject* clone(const char* newname) const { return new FlexibleInterpVar(*this, newname); }
    virtual ~FlexibleInterpVar() ;

    virtual void printMultiline(std::ostream& os, Int_t contents, Bool_t verbose = kFALSE, TString indent = "") const;
    virtual void printFlexibleInterpVars(std::ostream& os) const;

  private:

    double PolyInterpValue(int i, double x) const;

  protected:

    RooListProxy _paramList ;
    Double_t _nominal;
    std::vector<double> _low;
    std::vector<double> _high;
    std::vector<int> _interpCode;
    Double_t _interpBoundary;

    TIterator* _paramIter ;  //! do not persist

    mutable Bool_t         _logInit ;            //! flag used for chaching polynomial coefficients
    mutable std::vector< double>  _polCoeff;     //! cached polynomial coefficients

    Double_t evaluate() const;

    ClassDef(RooStats::HistFactory::FlexibleInterpVar,2) // flexible interpolation
  };
}
}

#endif
 FlexibleInterpVar.h:1
 FlexibleInterpVar.h:2
 FlexibleInterpVar.h:3
 FlexibleInterpVar.h:4
 FlexibleInterpVar.h:5
 FlexibleInterpVar.h:6
 FlexibleInterpVar.h:7
 FlexibleInterpVar.h:8
 FlexibleInterpVar.h:9
 FlexibleInterpVar.h:10
 FlexibleInterpVar.h:11
 FlexibleInterpVar.h:12
 FlexibleInterpVar.h:13
 FlexibleInterpVar.h:14
 FlexibleInterpVar.h:15
 FlexibleInterpVar.h:16
 FlexibleInterpVar.h:17
 FlexibleInterpVar.h:18
 FlexibleInterpVar.h:19
 FlexibleInterpVar.h:20
 FlexibleInterpVar.h:21
 FlexibleInterpVar.h:22
 FlexibleInterpVar.h:23
 FlexibleInterpVar.h:24
 FlexibleInterpVar.h:25
 FlexibleInterpVar.h:26
 FlexibleInterpVar.h:27
 FlexibleInterpVar.h:28
 FlexibleInterpVar.h:29
 FlexibleInterpVar.h:30
 FlexibleInterpVar.h:31
 FlexibleInterpVar.h:32
 FlexibleInterpVar.h:33
 FlexibleInterpVar.h:34
 FlexibleInterpVar.h:35
 FlexibleInterpVar.h:36
 FlexibleInterpVar.h:37
 FlexibleInterpVar.h:38
 FlexibleInterpVar.h:39
 FlexibleInterpVar.h:40
 FlexibleInterpVar.h:41
 FlexibleInterpVar.h:42
 FlexibleInterpVar.h:43
 FlexibleInterpVar.h:44
 FlexibleInterpVar.h:45
 FlexibleInterpVar.h:46
 FlexibleInterpVar.h:47
 FlexibleInterpVar.h:48
 FlexibleInterpVar.h:49
 FlexibleInterpVar.h:50
 FlexibleInterpVar.h:51
 FlexibleInterpVar.h:52
 FlexibleInterpVar.h:53
 FlexibleInterpVar.h:54
 FlexibleInterpVar.h:55
 FlexibleInterpVar.h:56
 FlexibleInterpVar.h:57
 FlexibleInterpVar.h:58
 FlexibleInterpVar.h:59
 FlexibleInterpVar.h:60
 FlexibleInterpVar.h:61
 FlexibleInterpVar.h:62
 FlexibleInterpVar.h:63
 FlexibleInterpVar.h:64
 FlexibleInterpVar.h:65
 FlexibleInterpVar.h:66
 FlexibleInterpVar.h:67
 FlexibleInterpVar.h:68
 FlexibleInterpVar.h:69
 FlexibleInterpVar.h:70
 FlexibleInterpVar.h:71
 FlexibleInterpVar.h:72
 FlexibleInterpVar.h:73
 FlexibleInterpVar.h:74
 FlexibleInterpVar.h:75
 FlexibleInterpVar.h:76
 FlexibleInterpVar.h:77
 FlexibleInterpVar.h:78
 FlexibleInterpVar.h:79
 FlexibleInterpVar.h:80
 FlexibleInterpVar.h:81
 FlexibleInterpVar.h:82
 FlexibleInterpVar.h:83
 FlexibleInterpVar.h:84