TSpline.h

Go to the documentation of this file.
00001 // @(#)root/hist:$Id: TSpline.h 34074 2010-06-23 09:08:49Z brun $
00002 // Author: Federico Carminati   28/02/2000
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #ifndef ROOT_TSpline
00013 #define ROOT_TSpline
00014 
00015 #ifndef ROOT_TGraph
00016 #include "TGraph.h"
00017 #endif
00018 
00019 class TH1;
00020 class TF1;
00021 
00022 class TSpline : public TNamed, public TAttLine,
00023                 public TAttFill, public TAttMarker
00024 {
00025 protected:
00026    Double_t  fDelta;     // Distance between equidistant knots
00027    Double_t  fXmin;      // Minimum value of abscissa
00028    Double_t  fXmax;      // Maximum value of abscissa
00029    Int_t     fNp;        // Number of knots
00030    Bool_t    fKstep;     // True of equidistant knots
00031    TH1F     *fHistogram; // Temporary histogram
00032    TGraph   *fGraph;     // Graph for drawing the knots
00033    Int_t     fNpx;       // Number of points used for graphical representation
00034 
00035    TSpline(const TSpline&);
00036    TSpline& operator=(const TSpline&);
00037    virtual void     BuildCoeff()=0;
00038 
00039 public:
00040    TSpline() : fDelta(-1), fXmin(0), fXmax(0),
00041       fNp(0), fKstep(kFALSE), fHistogram(0), fGraph(0), fNpx(100) {}
00042    TSpline(const char *title, Double_t delta, Double_t xmin,
00043       Double_t xmax, Int_t np, Bool_t step) :
00044       TNamed("Spline",title), TAttFill(0,1),
00045       fDelta(delta), fXmin(xmin),
00046       fXmax(xmax), fNp(np), fKstep(step),
00047       fHistogram(0), fGraph(0), fNpx(100) {}
00048    virtual ~TSpline();
00049 
00050    virtual void     GetKnot(Int_t i, Double_t &x, Double_t &y) const =0;
00051    virtual Int_t    DistancetoPrimitive(Int_t px, Int_t py);
00052    virtual void     Draw(Option_t *option="");
00053    virtual void     ExecuteEvent(Int_t event, Int_t px, Int_t py);
00054    virtual Double_t GetDelta() const {return fDelta;}
00055    TH1F            *GetHistogram() const {return fHistogram;}
00056    virtual Int_t    GetNp()    const {return fNp;}
00057    virtual Int_t    GetNpx()   const {return fNpx;}
00058    virtual Double_t GetXmin()  const {return fXmin;}
00059    virtual Double_t GetXmax()  const {return fXmax;}
00060    virtual void     Paint(Option_t *option="");
00061    virtual Double_t Eval(Double_t x) const=0;
00062    virtual void     SaveAs(const char * /*filename*/,Option_t * /*option*/) const {;}
00063    void             SetNpx(Int_t n) {fNpx=n;}
00064 
00065    ClassDef (TSpline,2) // Spline base class
00066 };
00067 
00068 
00069 //______________________________________________________________________________
00070 class TSplinePoly : public TObject
00071 {
00072 protected:
00073    Double_t fX;     // abscissa
00074    Double_t fY;     // constant term
00075 
00076 public:
00077    TSplinePoly() :
00078       fX(0), fY(0) {}
00079    TSplinePoly(Double_t x, Double_t y) :
00080       fX(x), fY(y) {}
00081    TSplinePoly(TSplinePoly const &other);
00082    TSplinePoly &operator=(TSplinePoly const &other);
00083 
00084    Double_t &X() {return fX;}
00085    Double_t &Y() {return fY;}
00086    void GetKnot(Double_t &x, Double_t &y) const {x=fX; y=fY;}
00087 
00088    virtual Double_t Eval(Double_t) const {return fY;}
00089 
00090    private:
00091    void CopyPoly(TSplinePoly const &other);
00092    
00093    ClassDef(TSplinePoly,2) // Spline polynomial terms
00094 };
00095 
00096 inline TSplinePoly::TSplinePoly(TSplinePoly const &other)
00097 :
00098    TObject(other), fX(0), fY(0)
00099 {
00100   CopyPoly(other);
00101 }
00102 
00103 
00104 //______________________________________________________________________________
00105 class TSplinePoly3 : public TSplinePoly
00106 {
00107 private:
00108    Double_t fB; // first order expansion coefficient :  fB*1! is the first derivative at x
00109    Double_t fC; // second order expansion coefficient : fC*2! is the second derivative at x
00110    Double_t fD; // third order expansion coefficient :  fD*3! is the third derivative at x
00111 
00112 public:
00113    TSplinePoly3() :
00114       fB(0), fC(0), fD(0) {}
00115    TSplinePoly3(Double_t x, Double_t y, Double_t b, Double_t c, Double_t d) :
00116       TSplinePoly(x,y), fB(b), fC(c), fD(d) {}
00117    TSplinePoly3(TSplinePoly3 const &other);
00118    TSplinePoly3 &operator=(TSplinePoly3 const &other);
00119 
00120    Double_t &B() {return fB;}
00121    Double_t &C() {return fC;}
00122    Double_t &D() {return fD;}
00123    Double_t Eval(Double_t x) const {
00124       Double_t dx=x-fX;
00125       return (fY+dx*(fB+dx*(fC+dx*fD)));
00126    }
00127    Double_t Derivative(Double_t x) const {
00128       Double_t dx=x-fX;
00129       return (fB+2*fC*dx+3*fD*dx*dx);
00130    }
00131 
00132 private:
00133    void CopyPoly(TSplinePoly3 const &other);
00134    
00135    ClassDef(TSplinePoly3,1)  // Third spline polynomial terms
00136 };
00137 
00138 inline TSplinePoly3::TSplinePoly3(TSplinePoly3 const &other)
00139 :
00140                     TSplinePoly(other), fB(0), fC(0), fD(0)
00141 {
00142   CopyPoly(other);
00143 }
00144 
00145 //______________________________________________________________________________
00146 class TSplinePoly5 : public TSplinePoly
00147 {
00148 private:
00149    Double_t fB; // first order expansion coefficient :  fB*1! is the first derivative at x
00150    Double_t fC; // second order expansion coefficient : fC*2! is the second derivative at x
00151    Double_t fD; // third order expansion coefficient :  fD*3! is the third derivative at x
00152    Double_t fE; // fourth order expansion coefficient : fE*4! is the fourth derivative at x
00153    Double_t fF; // fifth order expansion coefficient :  fF*5! is the fifth derivative at x
00154 
00155 public:
00156    TSplinePoly5() :
00157       fB(0), fC(0), fD(0), fE(0), fF(0) {}
00158    TSplinePoly5(Double_t x, Double_t y, Double_t b, Double_t c,
00159       Double_t d, Double_t e, Double_t f) :
00160       TSplinePoly(x,y), fB(b), fC(c), fD(d), fE(e), fF(f) {}
00161    TSplinePoly5(TSplinePoly5 const &other);
00162    TSplinePoly5 &operator=(TSplinePoly5 const &other);
00163 
00164    Double_t &B() {return fB;}
00165    Double_t &C() {return fC;}
00166    Double_t &D() {return fD;}
00167    Double_t &E() {return fE;}
00168    Double_t &F() {return fF;}
00169    Double_t Eval(Double_t x) const {
00170       Double_t dx=x-fX;
00171       return (fY+dx*(fB+dx*(fC+dx*(fD+dx*(fE+dx*fF)))));
00172    }
00173    Double_t Derivative(Double_t x) const{
00174       Double_t dx=x-fX;
00175       return (fB+2*fC*dx+3*fD*dx*dx+4*fE*dx*dx*dx+5*fF*dx*dx*dx*dx);
00176    }
00177 
00178 private:
00179    void CopyPoly(TSplinePoly5 const &other);
00180 
00181    ClassDef(TSplinePoly5,1)  // Quintic spline polynomial terms
00182 };
00183 
00184 inline TSplinePoly5::TSplinePoly5(TSplinePoly5 const &other)
00185 :
00186     TSplinePoly(other), fB(0), fC(0), fD(0), fE(0), fF(0)
00187 {
00188   CopyPoly(other);
00189 }
00190 
00191 
00192 //______________________________________________________________________________
00193 class TSpline3 : public TSpline
00194 {
00195 protected:
00196    TSplinePoly3  *fPoly;       //[fNp] Array of polynomial terms
00197    Double_t       fValBeg;     // Initial value of first or second derivative
00198    Double_t       fValEnd;     // End value of first or second derivative
00199    Int_t          fBegCond;    // 0=no beg cond, 1=first derivative, 2=second derivative
00200    Int_t          fEndCond;    // 0=no end cond, 1=first derivative, 2=second derivative
00201 
00202    void   BuildCoeff();
00203    void   SetCond(const char *opt);
00204 
00205 public:
00206    TSpline3() : TSpline() , fPoly(0), fValBeg(0), fValEnd(0),
00207       fBegCond(-1), fEndCond(-1) {}
00208    TSpline3(const char *title,
00209             Double_t x[], Double_t y[], Int_t n, const char *opt=0,
00210             Double_t valbeg=0, Double_t valend=0);
00211    TSpline3(const char *title,
00212             Double_t xmin, Double_t xmax,
00213             Double_t y[], Int_t n, const char *opt=0,
00214             Double_t valbeg=0, Double_t valend=0);
00215    TSpline3(const char *title,
00216             Double_t x[], const TF1 *func, Int_t n, const char *opt=0,
00217             Double_t valbeg=0, Double_t valend=0);
00218    TSpline3(const char *title,
00219             Double_t xmin, Double_t xmax,
00220             const TF1 *func, Int_t n, const char *opt=0,
00221             Double_t valbeg=0, Double_t valend=0);
00222    TSpline3(const char *title,
00223             const TGraph *g, const char *opt=0,
00224             Double_t valbeg=0, Double_t valend=0);
00225    TSpline3(const TH1 *h, const char *opt=0,
00226             Double_t valbeg=0, Double_t valend=0);
00227    TSpline3(const TSpline3&);
00228    TSpline3& operator=(const TSpline3&);
00229    Int_t    FindX(Double_t x) const;
00230    Double_t Eval(Double_t x) const;
00231    Double_t Derivative(Double_t x) const;
00232    virtual ~TSpline3() {if (fPoly) delete [] fPoly;}
00233    void GetCoeff(Int_t i, Double_t &x, Double_t &y, Double_t &b,
00234                  Double_t &c, Double_t &d) {x=fPoly[i].X();y=fPoly[i].Y();
00235                   b=fPoly[i].B();c=fPoly[i].C();d=fPoly[i].D();}
00236    void GetKnot(Int_t i, Double_t &x, Double_t &y) const
00237       {x=fPoly[i].X(); y=fPoly[i].Y();}
00238    virtual  void     SaveAs(const char *filename,Option_t *option="") const;
00239    virtual  void     SavePrimitive(ostream &out, Option_t *option = "");
00240    virtual  void     SetPoint(Int_t i, Double_t x, Double_t y);
00241    virtual  void     SetPointCoeff(Int_t i, Double_t b, Double_t c, Double_t d);
00242    static void Test();
00243 
00244    ClassDef (TSpline3,2)  // Class to create third natural splines
00245 };
00246 
00247 
00248 //______________________________________________________________________________
00249 class TSpline5 : public TSpline
00250 {
00251 protected:
00252    TSplinePoly5  *fPoly;     //[fNp] Array of polynomial terms
00253 
00254    void BuildCoeff();
00255    void BoundaryConditions(const char *opt, Int_t &beg, Int_t &end,
00256                            const char *&cb1, const char *&ce1, const char *&cb2,
00257                            const char *&ce2);
00258    void SetBoundaries(Double_t b1, Double_t e1, Double_t b2, Double_t e2,
00259                       const char *cb1, const char *ce1, const char *cb2,
00260                       const char *ce2);
00261 public:
00262    TSpline5() : TSpline() , fPoly(0) {}
00263    TSpline5(const char *title,
00264             Double_t x[], Double_t y[], Int_t n,
00265             const char *opt=0, Double_t b1=0, Double_t e1=0,
00266             Double_t b2=0, Double_t e2=0);
00267    TSpline5(const char *title,
00268             Double_t xmin, Double_t xmax,
00269             Double_t y[], Int_t n,
00270             const char *opt=0, Double_t b1=0, Double_t e1=0,
00271             Double_t b2=0, Double_t e2=0);
00272    TSpline5(const char *title,
00273             Double_t x[], const TF1 *func, Int_t n,
00274             const char *opt=0, Double_t b1=0, Double_t e1=0,
00275             Double_t b2=0, Double_t e2=0);
00276    TSpline5(const char *title,
00277             Double_t xmin, Double_t xmax,
00278             const TF1 *func, Int_t n,
00279             const char *opt=0, Double_t b1=0, Double_t e1=0,
00280             Double_t b2=0, Double_t e2=0);
00281    TSpline5(const char *title,
00282             const TGraph *g,
00283             const char *opt=0, Double_t b1=0, Double_t e1=0,
00284             Double_t b2=0, Double_t e2=0);
00285    TSpline5(const TH1 *h,
00286             const char *opt=0, Double_t b1=0, Double_t e1=0,
00287             Double_t b2=0, Double_t e2=0);
00288    TSpline5(const TSpline5&);
00289    TSpline5& operator=(const TSpline5&);
00290    Int_t    FindX(Double_t x) const;
00291    Double_t Eval(Double_t x) const;
00292    Double_t Derivative(Double_t x) const;
00293    virtual ~TSpline5() {if (fPoly) delete [] fPoly;}
00294    void GetCoeff(Int_t i, Double_t &x, Double_t &y, Double_t &b,
00295                  Double_t &c, Double_t &d, Double_t &e, Double_t &f)
00296       {x=fPoly[i].X();y=fPoly[i].Y();b=fPoly[i].B();
00297       c=fPoly[i].C();d=fPoly[i].D();
00298       e=fPoly[i].E();f=fPoly[i].F();}
00299    void GetKnot(Int_t i, Double_t &x, Double_t &y) const
00300       {x=fPoly[i].X(); y=fPoly[i].Y();}
00301    virtual  void     SaveAs(const char *filename,Option_t *option="") const;
00302    virtual  void     SavePrimitive(ostream &out, Option_t *option = "");
00303    virtual  void     SetPoint(Int_t i, Double_t x, Double_t y);
00304    virtual  void     SetPointCoeff(Int_t i, Double_t b, Double_t c, Double_t d,
00305                                    Double_t e, Double_t f);
00306    static void Test();
00307 
00308    ClassDef (TSpline5,2) // Class to create quintic natural splines
00309 };
00310 
00311 #endif

Generated on Tue Jul 5 14:22:58 2011 for ROOT_528-00b_version by  doxygen 1.5.1