00001
00002
00003
00004
00005
00006
00007
00008
00009
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;
00027 Double_t fXmin;
00028 Double_t fXmax;
00029 Int_t fNp;
00030 Bool_t fKstep;
00031 TH1F *fHistogram;
00032 TGraph *fGraph;
00033 Int_t fNpx;
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 * ,Option_t * ) const {;}
00063 void SetNpx(Int_t n) {fNpx=n;}
00064
00065 ClassDef (TSpline,2)
00066 };
00067
00068
00069
00070 class TSplinePoly : public TObject
00071 {
00072 protected:
00073 Double_t fX;
00074 Double_t fY;
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)
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;
00109 Double_t fC;
00110 Double_t fD;
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)
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;
00150 Double_t fC;
00151 Double_t fD;
00152 Double_t fE;
00153 Double_t fF;
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)
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;
00197 Double_t fValBeg;
00198 Double_t fValEnd;
00199 Int_t fBegCond;
00200 Int_t fEndCond;
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)
00245 };
00246
00247
00248
00249 class TSpline5 : public TSpline
00250 {
00251 protected:
00252 TSplinePoly5 *fPoly;
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)
00309 };
00310
00311 #endif