#ifndef ROOT_TF1
#define ROOT_TF1
#ifndef ROOT_TFormula
#include "TFormula.h"
#endif
#ifndef ROOT_TAttLine
#include "TAttLine.h"
#endif
#ifndef ROOT_TAttFill
#include "TAttFill.h"
#endif
#ifndef ROOT_TAttMarker
#include "TAttMarker.h"
#endif
#ifndef ROOT_Math_ParamFunctor
#include "Math/ParamFunctor.h"
#endif
class TF1;
class TH1;
class TAxis;
class TMethodCall;
namespace ROOT {
namespace Fit {
class FitResult;
}
}
class TF1 : public TFormula, public TAttLine, public TAttFill, public TAttMarker {
protected:
Double_t fXmin;
Double_t fXmax;
Int_t fNpx;
Int_t fType;
Int_t fNpfits;
Int_t fNDF;
Int_t fNsave;
Double_t fChisquare;
Double_t *fIntegral;
Double_t *fParErrors;
Double_t *fParMin;
Double_t *fParMax;
Double_t *fSave;
Double_t *fAlpha;
Double_t *fBeta;
Double_t *fGamma;
TObject *fParent;
TH1 *fHistogram;
Double_t fMaximum;
Double_t fMinimum;
TMethodCall *fMethodCall;
void *fCintFunc;
ROOT::Math::ParamFunctor fFunctor;
static Bool_t fgAbsValue;
static Bool_t fgRejectPoint;
static TF1 *fgCurrent;
void CreateFromFunctor(const char *name, Int_t npar);
void CreateFromCintClass(const char *name, void * ptr, Double_t xmin, Double_t xmax, Int_t npar, const char * cname, const char * fname);
public:
enum {
kNotDraw = BIT(9)
};
TF1();
TF1(const char *name, const char *formula, Double_t xmin=0, Double_t xmax=1);
TF1(const char *name, Double_t xmin, Double_t xmax, Int_t npar);
TF1(const char *name, void *fcn, Double_t xmin, Double_t xmax, Int_t npar);
#ifndef __CINT__
TF1(const char *name, Double_t (*fcn)(Double_t *, Double_t *), Double_t xmin=0, Double_t xmax=1, Int_t npar=0);
TF1(const char *name, Double_t (*fcn)(const Double_t *, const Double_t *), Double_t xmin=0, Double_t xmax=1, Int_t npar=0);
#endif
TF1(const char *name, ROOT::Math::ParamFunctor f, Double_t xmin = 0, Double_t xmax = 1, Int_t npar = 0);
template <typename Func>
TF1(const char *name, Func f, Double_t xmin, Double_t xmax, Int_t npar, const char * = 0 ) :
TFormula(),
TAttLine(),
TAttFill(),
TAttMarker(),
fXmin ( xmin ),
fXmax ( xmax ),
fNpx ( 100 ),
fType ( 1 ),
fNpfits ( 0 ),
fNDF ( 0 ),
fNsave ( 0 ),
fChisquare ( 0 ),
fIntegral ( 0 ),
fParErrors ( 0 ),
fParMin ( 0 ),
fParMax ( 0 ),
fSave ( 0 ),
fAlpha ( 0 ),
fBeta ( 0 ),
fGamma ( 0 ),
fParent ( 0 ),
fHistogram ( 0 ),
fMaximum ( -1111 ),
fMinimum ( -1111 ),
fMethodCall ( 0),
fCintFunc ( 0 ),
fFunctor( ROOT::Math::ParamFunctor(f) )
{
CreateFromFunctor(name, npar);
}
template <class PtrObj, typename MemFn>
TF1(const char *name, const PtrObj& p, MemFn memFn, Double_t xmin, Double_t xmax, Int_t npar, const char * = 0, const char * = 0) :
TFormula(),
TAttLine(),
TAttFill(),
TAttMarker(),
fXmin ( xmin ),
fXmax ( xmax ),
fNpx ( 100 ),
fType ( 1 ),
fNpfits ( 0 ),
fNDF ( 0 ),
fNsave ( 0 ),
fChisquare ( 0 ),
fIntegral ( 0 ),
fParErrors ( 0 ),
fParMin ( 0 ),
fParMax ( 0 ),
fSave ( 0 ),
fAlpha ( 0 ),
fBeta ( 0 ),
fGamma ( 0 ),
fParent ( 0 ),
fHistogram ( 0 ),
fMaximum ( -1111 ),
fMinimum ( -1111 ),
fMethodCall( 0 ),
fCintFunc ( 0 ),
fFunctor ( ROOT::Math::ParamFunctor(p,memFn) )
{
CreateFromFunctor(name, npar);
}
TF1(const char *name, void *ptr, Double_t xmin, Double_t xmax, Int_t npar, const char *className );
TF1(const char *name, void *ptr, void *,Double_t xmin, Double_t xmax, Int_t npar, const char *className, const char *methodName = 0);
TF1(const TF1 &f1);
TF1& operator=(const TF1 &rhs);
virtual ~TF1();
virtual void Browse(TBrowser *b);
virtual void Copy(TObject &f1) const;
virtual Double_t Derivative (Double_t x, Double_t *params=0, Double_t epsilon=0.001) const;
virtual Double_t Derivative2(Double_t x, Double_t *params=0, Double_t epsilon=0.001) const;
virtual Double_t Derivative3(Double_t x, Double_t *params=0, Double_t epsilon=0.001) const;
static Double_t DerivativeError();
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py);
virtual void Draw(Option_t *option="");
virtual TF1 *DrawCopy(Option_t *option="") const;
virtual TObject *DrawDerivative(Option_t *option="al");
virtual TObject *DrawIntegral(Option_t *option="al");
virtual void DrawF1(const char *formula, Double_t xmin, Double_t xmax, Option_t *option="");
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const;
virtual Double_t EvalPar(const Double_t *x, const Double_t *params=0);
virtual Double_t operator()(Double_t x, Double_t y=0, Double_t z = 0, Double_t t = 0) const;
virtual Double_t operator()(const Double_t *x, const Double_t *params=0);
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py);
virtual void FixParameter(Int_t ipar, Double_t value);
Double_t GetChisquare() const {return fChisquare;}
TH1 *GetHistogram() const;
virtual Double_t GetMaximum(Double_t xmin=0, Double_t xmax=0, Double_t epsilon = 1.E-10, Int_t maxiter = 100, Bool_t logx = false) const;
virtual Double_t GetMinimum(Double_t xmin=0, Double_t xmax=0, Double_t epsilon = 1.E-10, Int_t maxiter = 100, Bool_t logx = false) const;
virtual Double_t GetMaximumX(Double_t xmin=0, Double_t xmax=0, Double_t epsilon = 1.E-10, Int_t maxiter = 100, Bool_t logx = false) const;
virtual Double_t GetMinimumX(Double_t xmin=0, Double_t xmax=0, Double_t epsilon = 1.E-10, Int_t maxiter = 100, Bool_t logx = false) const;
virtual Double_t GetMaximumStored() const {return fMaximum;}
virtual Double_t GetMinimumStored() const {return fMinimum;}
virtual Int_t GetNDF() const;
virtual Int_t GetNpx() const {return fNpx;}
TMethodCall *GetMethodCall() const {return fMethodCall;}
virtual Int_t GetNumberFreeParameters() const;
virtual Int_t GetNumberFitPoints() const {return fNpfits;}
virtual char *GetObjectInfo(Int_t px, Int_t py) const;
TObject *GetParent() const {return fParent;}
virtual Double_t GetParError(Int_t ipar) const;
virtual Double_t *GetParErrors() const {return fParErrors;}
virtual void GetParLimits(Int_t ipar, Double_t &parmin, Double_t &parmax) const;
virtual Double_t GetProb() const;
virtual Int_t GetQuantiles(Int_t nprobSum, Double_t *q, const Double_t *probSum);
virtual Double_t GetRandom();
virtual Double_t GetRandom(Double_t xmin, Double_t xmax);
virtual void GetRange(Double_t &xmin, Double_t &xmax) const;
virtual void GetRange(Double_t &xmin, Double_t &ymin, Double_t &xmax, Double_t &ymax) const;
virtual void GetRange(Double_t &xmin, Double_t &ymin, Double_t &zmin, Double_t &xmax, Double_t &ymax, Double_t &zmax) const;
virtual Double_t GetSave(const Double_t *x);
virtual Double_t GetX(Double_t y, Double_t xmin=0, Double_t xmax=0, Double_t epsilon = 1.E-10, Int_t maxiter = 100, Bool_t logx = false) const;
virtual Double_t GetXmin() const {return fXmin;}
virtual Double_t GetXmax() const {return fXmax;}
TAxis *GetXaxis() const ;
TAxis *GetYaxis() const ;
TAxis *GetZaxis() const ;
virtual Double_t GradientPar(Int_t ipar, const Double_t *x, Double_t eps=0.01);
virtual void GradientPar(const Double_t *x, Double_t *grad, Double_t eps=0.01);
virtual void InitArgs(const Double_t *x, const Double_t *params);
static void InitStandardFunctions();
virtual Double_t Integral(Double_t a, Double_t b, const Double_t *params=0, Double_t epsilon=1e-12);
virtual Double_t Integral(Double_t ax, Double_t bx, Double_t ay, Double_t by, Double_t epsilon=1e-12);
virtual Double_t Integral(Double_t ax, Double_t bx, Double_t ay, Double_t by, Double_t az, Double_t bz, Double_t epsilon=1e-12);
virtual Double_t IntegralError(Double_t a, Double_t b, const Double_t *params=0, const Double_t *covmat=0, Double_t epsilon=1e-12);
virtual Double_t IntegralError(Int_t n, const Double_t * a, const Double_t * b, const Double_t *params=0, const Double_t *covmat=0, Double_t epsilon=1e-12);
virtual Double_t IntegralFast(Int_t num, Double_t *x, Double_t *w, Double_t a, Double_t b, Double_t *params=0, Double_t epsilon=1e-12);
virtual Double_t IntegralMultiple(Int_t n, const Double_t *a, const Double_t *b, Int_t minpts, Int_t maxpts, Double_t epsilon, Double_t &relerr,Int_t &nfnevl, Int_t &ifail);
virtual Double_t IntegralMultiple(Int_t n, const Double_t *a, const Double_t *b, Double_t epsilon, Double_t &relerr);
virtual Bool_t IsInside(const Double_t *x) const;
virtual void Paint(Option_t *option="");
virtual void Print(Option_t *option="") const;
virtual void ReleaseParameter(Int_t ipar);
virtual void Save(Double_t xmin, Double_t xmax, Double_t ymin, Double_t ymax, Double_t zmin, Double_t zmax);
virtual void SavePrimitive(ostream &out, Option_t *option = "");
virtual void SetChisquare(Double_t chi2) {fChisquare = chi2;}
virtual void SetFitResult(const ROOT::Fit::FitResult & result, const Int_t * indpar = 0);
template <class PtrObj, typename MemFn>
void SetFunction( PtrObj& p, MemFn memFn );
template <typename Func>
void SetFunction( Func f );
virtual void SetMaximum(Double_t maximum=-1111);
virtual void SetMinimum(Double_t minimum=-1111);
virtual void SetNDF(Int_t ndf);
virtual void SetNumberFitPoints(Int_t npfits) {fNpfits = npfits;}
virtual void SetNpx(Int_t npx=100);
virtual void SetParError(Int_t ipar, Double_t error);
virtual void SetParErrors(const Double_t *errors);
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax);
virtual void SetParent(TObject *p=0) {fParent = p;}
virtual void SetRange(Double_t xmin, Double_t xmax);
virtual void SetRange(Double_t xmin, Double_t ymin, Double_t xmax, Double_t ymax);
virtual void SetRange(Double_t xmin, Double_t ymin, Double_t zmin, Double_t xmax, Double_t ymax, Double_t zmax);
virtual void SetSavedPoint(Int_t point, Double_t value);
virtual void SetTitle(const char *title="");
virtual void Update();
static TF1 *GetCurrent();
static void AbsValue(Bool_t reject=kTRUE);
static void RejectPoint(Bool_t reject=kTRUE);
static Bool_t RejectedPoint();
static void SetCurrent(TF1 *f1);
virtual Double_t Moment(Double_t n, Double_t a, Double_t b, const Double_t *params=0, Double_t epsilon=0.000001);
virtual Double_t CentralMoment(Double_t n, Double_t a, Double_t b, const Double_t *params=0, Double_t epsilon=0.000001);
virtual Double_t Mean(Double_t a, Double_t b, const Double_t *params=0, Double_t epsilon=0.000001) {return Moment(1,a,b,params,epsilon);}
virtual Double_t Variance(Double_t a, Double_t b, const Double_t *params=0, Double_t epsilon=0.000001) {return CentralMoment(2,a,b,params,epsilon);}
static void CalcGaussLegendreSamplingPoints(Int_t num, Double_t *x, Double_t *w, Double_t eps=3.0e-11);
ClassDef(TF1,7)
};
inline Double_t TF1::operator()(Double_t x, Double_t y, Double_t z, Double_t t) const
{ return Eval(x,y,z,t); }
inline Double_t TF1::operator()(const Double_t *x, const Double_t *params)
{
if (fMethodCall) InitArgs(x,params);
return EvalPar(x,params);
}
inline void TF1::SetRange(Double_t xmin, Double_t, Double_t xmax, Double_t)
{ TF1::SetRange(xmin, xmax); }
inline void TF1::SetRange(Double_t xmin, Double_t, Double_t, Double_t xmax, Double_t, Double_t)
{ TF1::SetRange(xmin, xmax); }
template <typename Func>
void TF1::SetFunction( Func f ) {
fType = 1;
fFunctor = ROOT::Math::ParamFunctor(f);
}
template <class PtrObj, typename MemFn>
void TF1::SetFunction( PtrObj& p, MemFn memFn ) {
fType = 1;
fFunctor = ROOT::Math::ParamFunctor(p,memFn);
}
#endif