/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Generator/Mcgpj/Mcgpj-00-01-04/src/code/inc/TRadSpline.h

Go to the documentation of this file.
00001 #ifndef ROOT_TRadSpline
00002 #define ROOT_TRadSpline
00003 
00004 class TRadSpline {
00005 protected:
00006   double  fDelta;     // Distance between equidistant knots
00007   double  fXmin;      // Minimum value of abscissa
00008   double  fXmax;      // Maximum value of abscissa
00009   int     fNp;        // Number of knots
00010   bool    fKstep;     // True of equidistant knots
00011   int     fNpx;       // Number of points used for graphical representation
00012   
00013   virtual void BuildCoeff()=0;
00014   
00015 public:
00016   TRadSpline() : fDelta(-1), fXmin(0), fXmax(0),
00017               fNp(0), fKstep(false), fNpx(100) {}
00018   TRadSpline(const char *title, double delta, double xmin,
00019           double xmax, int np, bool step) :
00020     fDelta(delta), fXmin(xmin),
00021     fXmax(xmax), fNp(np), fKstep(step),
00022     fNpx(100) {}
00023   virtual ~TRadSpline() {}
00024   virtual  void     GetKnot(int i, double &x, double &y) const =0;
00025   //  virtual  void     Draw(const char *option="");
00026   virtual  int    GetNpx() const {return fNpx;}
00027   //  virtual  void     Paint(const char *option="");
00028   virtual double  Eval(double x) const=0;
00029   virtual  void     SaveAs(const char * /*filename*/) const {;}
00030            void     SetNpx(int n) {fNpx=n;}
00031 
00032 };
00033 
00034 
00035 //________________________________________________________________________
00036 class TRadSplinePoly {
00037 protected:
00038   double fX;     // abscissa
00039   double fY;     // constant term
00040 public:
00041   TRadSplinePoly() :
00042     fX(0), fY(0) {}
00043   TRadSplinePoly(double x, double y) :
00044     fX(x), fY(y) {}
00045   virtual ~TRadSplinePoly() {}
00046   double &X() {return fX;}
00047   double &Y() {return fY;}
00048   void GetKnot(double &x, double &y) const {x=fX; y=fY;}
00049 
00050   virtual double Eval(double) const {return fY;}
00051 
00052 };
00053 
00054 
00055 //________________________________________________________________________
00056 class TRadSplinePoly3 : public TRadSplinePoly {
00057 private:
00058   double fB; // first order expansion coefficient :  fB*1! is the first derivative at x
00059   double fC; // second order expansion coefficient : fC*2! is the second derivative at x
00060   double fD; // third order expansion coefficient :  fD*3! is the third derivative at x
00061 public:
00062   TRadSplinePoly3() :
00063     fB(0), fC(0), fD(0) {}
00064   TRadSplinePoly3(double x, double y, double b, double c, double d) :
00065     TRadSplinePoly(x,y), fB(b), fC(c), fD(d) {}
00066   double &B() {return fB;}
00067   double &C() {return fC;}
00068   double &D() {return fD;}
00069   double Eval(double x) const {
00070     double dx=x-fX;
00071     return (fY+dx*(fB+dx*(fC+dx*fD)));
00072   }
00073   double Derivative(double x) const {
00074     double dx=x-fX;
00075     return (fB+2*fC*dx+3*fD*dx*dx);
00076   }
00077 
00078 };
00079 
00080 
00081 //________________________________________________________________________
00082 class TRadSplinePoly5 : public TRadSplinePoly {
00083 private:
00084   double fB; // first order expansion coefficient :  fB*1! is the first derivative at x
00085   double fC; // second order expansion coefficient : fC*2! is the second derivative at x
00086   double fD; // third order expansion coefficient :  fD*3! is the third derivative at x
00087   double fE; // fourth order expansion coefficient : fE*4! is the fourth derivative at x
00088   double fF; // fifth order expansion coefficient :  fF*5! is the fifth derivative at x
00089 public:
00090   TRadSplinePoly5() :
00091     fB(0), fC(0), fD(0), fE(0), fF(0) {}
00092   TRadSplinePoly5(double x, double y, double b, double c,
00093          double d, double e, double f) :
00094     TRadSplinePoly(x,y), fB(b), fC(c), fD(d), fE(e), fF(f) {}
00095   double &B() {return fB;}
00096   double &C() {return fC;}
00097   double &D() {return fD;}
00098   double &E() {return fE;}
00099   double &F() {return fF;}
00100   double Eval(double x) const {
00101     double dx=x-fX;
00102     return (fY+dx*(fB+dx*(fC+dx*(fD+dx*(fE+dx*fF)))));
00103   }
00104   double Derivative(double x) const{
00105     double dx=x-fX;
00106     return (fB+2*fC*dx+3*fD*dx*dx+4*fE*dx*dx*dx+5*fF*dx*dx*dx*dx);
00107   }
00108 
00109 };
00110 
00111 
00112 //________________________________________________________________________
00113 class TRadSpline3 : public TRadSpline {
00114 private:
00115   TRadSplinePoly3  *fPoly;       //[fNp] Array of polynomial terms
00116   double       fValBeg;     // Initial value of first or second derivative
00117   double       fValEnd;     // End value of first or second derivative
00118   int          fBegCond;    // 0=no beg cond, 1=first derivative, 2=second derivative
00119   int          fEndCond;    // 0=no end cond, 1=first derivative, 2=second derivative
00120 
00121   void BuildCoeff();
00122   void SetCond(const char *opt);
00123 
00124 public:
00125   TRadSpline3() : fPoly(0), fValBeg(0), fValEnd(0),
00126     fBegCond(-1), fEndCond(-1) {}
00127   TRadSpline3(const char *title,
00128            double x[], double y[], int n, const char *opt=0,
00129            double valbeg=0, double valend=0);
00130   TRadSpline3(const char *title,
00131            double xmin, double xmax,
00132            double y[], int n, const char *opt=0,
00133            double valbeg=0, double valend=0);
00134   TRadSpline3(const char *title,
00135               double xmin, double xmax,
00136               double (*func)(const double&), int n, const char *opt=0,
00137               double valbeg=0, double valend=0);
00138   int    FindX(double x) const;
00139   double Eval(double x) const;
00140   double Derivative(double x) const;
00141   virtual ~TRadSpline3() {if (fPoly) delete [] fPoly;}
00142   void GetCoeff(int i, double &x, double &y, double &b,
00143                 double &c, double &d) {x=fPoly[i].X();y=fPoly[i].Y();
00144                 b=fPoly[i].B();c=fPoly[i].C();d=fPoly[i].D();}
00145   void GetKnot(int i, double &x, double &y) const
00146     {x=fPoly[i].X(); y=fPoly[i].Y();}
00147   virtual  void     SaveAs(const char *filename) const;
00148   static void Test();
00149 
00150 };
00151 
00152 
00153 //________________________________________________________________________
00154 class TRadSpline5 : public TRadSpline {
00155 private:
00156   TRadSplinePoly5  *fPoly;     //[fNp] Array of polynomial terms
00157 
00158   void BuildCoeff();
00159   void BoundaryConditions(const char *opt, int &beg, int &end,
00160                           const char *&cb1, const char *&ce1, const char *&cb2,
00161                           const char *&ce2);
00162   void SetBoundaries(double b1, double e1, double b2, double e2,
00163                      const char *cb1, const char *ce1, const char *cb2,
00164                      const char *ce2);
00165 
00166 public:
00167   TRadSpline5() : fPoly(0) {}
00168   TRadSpline5(const char *title,
00169            double x[], double y[], int n,
00170            const char *opt=0, double b1=0, double e1=0,
00171            double b2=0, double e2=0);
00172   TRadSpline5(const char *title,
00173            double xmin, double xmax,
00174            double y[], int n,
00175            const char *opt=0, double b1=0, double e1=0,
00176            double b2=0, double e2=0);
00177   TRadSpline5(const char *title,
00178               double xmin, double xmax,
00179               double(*func)(const double&), 
00180               int n, const char *opt=0,
00181               double b1=0, double e1=0,
00182               double b2=0, double e2=0);
00183   int    FindX(double x) const;
00184   double Eval(double x) const;
00185   double Derivative(double x) const;
00186   ~TRadSpline5() {if (fPoly) delete [] fPoly;}
00187   void GetCoeff(int i, double &x, double &y, double &b,
00188                 double &c, double &d, double &e, double &f)
00189     {x=fPoly[i].X();y=fPoly[i].Y();b=fPoly[i].B();
00190     c=fPoly[i].C();d=fPoly[i].D();
00191     e=fPoly[i].E();f=fPoly[i].F();}
00192   void GetKnot(int i, double &x, double &y) const
00193     {x=fPoly[i].X(); y=fPoly[i].Y();}
00194   virtual  void     SaveAs(const char *filename) const;
00195   static void Test();
00196 
00197 };
00198 
00199 #endif

Generated on Tue Nov 29 23:12:41 2016 for BOSS_7.0.2 by  doxygen 1.4.7