135 pmin =
gPad->PadtoX(
gPad->GetUxmin());
136 pmax =
gPad->PadtoX(
gPad->GetUxmax());
140 if (xmax < pmin)
return;
141 if (xmin > pmax)
return;
142 if (xmin < pmin) xmin = pmin;
143 if (xmax > pmax) xmax = pmax;
160 if (xmin > 0 &&
gPad->GetLogx()) {
165 for (i=0;i<=
fNpx;i++) {
166 xbins[i] =
gPad->PadtoX(xlogmin+ i*dlogx);
177 for (i=1;i<=
fNpx;i++) {
195 char *o = (
char *) opt.
Data();
200 if(o[i]==
'p') graph=
kTRUE ;
else o[j++]=o[i];
227 void TSpline::Streamer(
TBuffer &R__b)
237 TNamed::Streamer(R__b);
238 TAttLine::Streamer(R__b);
239 TAttFill::Streamer(R__b);
240 TAttMarker::Streamer(R__b);
358 fValBeg(valbeg), fValEnd(valend), fBegCond(0), fEndCond(0)
368 for (
Int_t i=0; i<
n; ++i) {
398 for (
Int_t i=0; i<
n; ++i) {
427 for (
Int_t i=0; i<
n; ++i) {
443 const TF1 *func,
Int_t n,
const char *opt,
460 for (
Int_t i=0; i<
n; ++i) {
476 const TGraph *
g,
const char *opt,
572 const char *b1 = strstr(opt,
"b1");
573 const char *e1 = strstr(opt,
"e1");
574 const char *b2 = strstr(opt,
"b2");
575 const char *e2 = strstr(opt,
"e2");
577 Error(
"SetCond",
"Cannot specify first and second derivative at first point");
579 Error(
"SetCond",
"Cannot specify first and second derivative at last point");
619 printf(
"1 TEST OF TSpline3 WITH NONEQUIDISTANT KNOTS\n");
634 printf(
"\n-N = %3d M =%2d\n",n,m);
636 for (i = 0; i <
n; ++i)
637 spline->
GetCoeff(i,hx, a[i],a[i+200],a[i+400],a[i+600]);
639 for (i = 0; i < mm1; ++i) diff[i] = com[i] = 0;
640 for (k = 0; k <
n; ++k) {
641 for (i = 0; i <
mm; ++i) c[i] = a[k+i*200];
642 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
643 printf(
"%12.8f\n",x[k]);
645 printf(
"%16.8f\n",c[0]);
647 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
649 for (i = 0; i < mm1; ++i)
650 if ((z=
TMath::Abs(a[k+i*200])) > com[i]) com[i] =
z;
652 for (i = 1; i <
mm; ++i)
653 for (jj = i; jj <
mm; ++jj) {
655 c[j-2] = c[j-1]*z+c[j-2];
657 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
659 for (i = 0; i < mm1; ++i)
660 if (!(k >= n-2 && i != 0))
662 > diff[i]) diff[i] =
z;
665 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
666 for (i = 0; i < mm1; ++i) printf(
"%18.9E",diff[i]);
668 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
671 for (i = 0; i < mm1; ++i) printf(
"%16.8f",com[i]);
674 for (n = 10; n <= 100; n += 10) {
678 for (i = 0; i < nm1; i += 2) {
688 printf(
"\n-N = %3d M =%2d\n",n,m);
689 spline =
new TSpline3(
"Test",x,y,n);
690 for (i = 0; i <
n; ++i)
691 spline->
GetCoeff(i,hx,a[i],a[i+200],a[i+400],a[i+600]);
693 for (i = 0; i < mm1; ++i)
694 diff[i] = com[i] = 0;
695 for (k = 0; k <
n; ++k) {
696 for (i = 0; i <
mm; ++i)
699 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
700 printf(
"%12.8f\n",x[k]);
701 if (k == n-1) printf(
"%16.8f\n",c[0]);
705 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
708 for (i = 0; i < mm1; ++i)
712 for (i = 1; i <
mm; ++i)
713 for (jj = i; jj <
mm; ++jj) {
715 c[j-2] = c[j-1]*z+c[j-2];
718 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
721 for (i = 0; i < mm1; ++i)
722 if (!(k >= n-2 && i != 0))
724 > diff[i]) diff[i] =
z;
726 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
727 for (i = 0; i < mm1; ++i) printf(
"%18.9E",diff[i]);
729 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
732 for (i = 0; i < mm1; ++i) printf(
"%16.8E",com[i]);
747 else if(x>=
fXmax) klow=khig;
754 if (x <
fPoly[klow].X())
756 else if (klow < khig) {
757 if (x >
fPoly[klow+1].X()) ++klow;
764 if(x>
fPoly[khalf=(klow+khig)/2].X())
770 if(!(
fPoly[klow].X()<=x && x<=
fPoly[klow+1].X()))
772 "Binary search failed x(%d) = %f < x= %f < x(%d) = %f\n",
773 klow,
fPoly[klow].X(),x,klow+1,
fPoly[klow+1].X());
785 if (klow >=
fNp-1 &&
fNp > 1) klow =
fNp-2;
795 if (klow >=
fNp-1) klow =
fNp-2;
806 std::ofstream *
f =
new std::ofstream(filename,std::ios::out);
808 Error(
"SaveAs",
"Cannot open file:%s\n",filename);
814 Int_t nch = strlen(filename);
815 snprintf(buffer,512,
"double %s",filename);
816 char *dot = strstr(buffer,
".");
818 strlcat(buffer,
"(double x) {\n",512);
819 nch = strlen(buffer); f->write(buffer,nch);
821 nch = strlen(buffer); f->write(buffer,nch);
823 nch = strlen(buffer); f->write(buffer,nch);
827 snprintf(buffer,512,
" const double fX[%d] = {",
fNp);
828 nch = strlen(buffer); f->write(buffer,nch);
832 for (i=0;i<
fNp;i++) {
835 if (i == fNp-1) numb[nch-1]=0;
836 strlcat(buffer,numb,512);
837 if (i%5 == 4 || i == fNp-1) {
838 nch = strlen(buffer); f->write(buffer,nch);
839 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
843 nch = strlen(buffer); f->write(buffer,nch);
845 snprintf(buffer,512,
" const double fY[%d] = {",fNp);
846 nch = strlen(buffer); f->write(buffer,nch);
848 for (i=0;i<
fNp;i++) {
851 if (i == fNp-1) numb[nch-1]=0;
852 strlcat(buffer,numb,512);
853 if (i%5 == 4 || i == fNp-1) {
854 nch = strlen(buffer); f->write(buffer,nch);
855 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
859 nch = strlen(buffer); f->write(buffer,nch);
861 snprintf(buffer,512,
" const double fB[%d] = {",fNp);
862 nch = strlen(buffer); f->write(buffer,nch);
864 for (i=0;i<
fNp;i++) {
867 if (i == fNp-1) numb[nch-1]=0;
868 strlcat(buffer,numb,512);
869 if (i%5 == 4 || i == fNp-1) {
870 nch = strlen(buffer); f->write(buffer,nch);
871 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
875 nch = strlen(buffer); f->write(buffer,nch);
877 snprintf(buffer,512,
" const double fC[%d] = {",fNp);
878 nch = strlen(buffer); f->write(buffer,nch);
880 for (i=0;i<
fNp;i++) {
883 if (i == fNp-1) numb[nch-1]=0;
884 strlcat(buffer,numb,512);
885 if (i%5 == 4 || i == fNp-1) {
886 nch = strlen(buffer); f->write(buffer,nch);
887 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
891 nch = strlen(buffer); f->write(buffer,nch);
893 snprintf(buffer,512,
" const double fD[%d] = {",fNp);
894 nch = strlen(buffer); f->write(buffer,nch);
896 for (i=0;i<
fNp;i++) {
899 if (i == fNp-1) numb[nch-1]=0;
900 strlcat(buffer,numb,512);
901 if (i%5 == 4 || i == fNp-1) {
902 nch = strlen(buffer); f->write(buffer,nch);
903 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
907 nch = strlen(buffer); f->write(buffer,nch);
910 snprintf(buffer,512,
" int klow=0;\n");
911 nch = strlen(buffer); f->write(buffer,nch);
913 snprintf(buffer,512,
" // If out of boundaries, extrapolate. It may be badly wrong\n");
914 snprintf(buffer,512,
" if(x<=fXmin) klow=0;\n");
915 nch = strlen(buffer); f->write(buffer,nch);
916 snprintf(buffer,512,
" else if(x>=fXmax) klow=fNp-1;\n");
917 nch = strlen(buffer); f->write(buffer,nch);
919 nch = strlen(buffer); f->write(buffer,nch);
920 snprintf(buffer,512,
" if(fKstep) {\n");
921 nch = strlen(buffer); f->write(buffer,nch);
923 snprintf(buffer,512,
" // Equidistant knots, use histogramming\n");
924 nch = strlen(buffer); f->write(buffer,nch);
925 snprintf(buffer,512,
" klow = int((x-fXmin)/fDelta);\n");
926 nch = strlen(buffer); f->write(buffer,nch);
927 snprintf(buffer,512,
" if (klow < fNp-1) klow = fNp-1;\n");
928 nch = strlen(buffer); f->write(buffer,nch);
930 nch = strlen(buffer); f->write(buffer,nch);
931 snprintf(buffer,512,
" int khig=fNp-1, khalf;\n");
932 nch = strlen(buffer); f->write(buffer,nch);
934 snprintf(buffer,512,
" // Non equidistant knots, binary search\n");
935 nch = strlen(buffer); f->write(buffer,nch);
936 snprintf(buffer,512,
" while(khig-klow>1)\n");
937 nch = strlen(buffer); f->write(buffer,nch);
938 snprintf(buffer,512,
" if(x>fX[khalf=(klow+khig)/2]) klow=khalf;\n");
939 nch = strlen(buffer); f->write(buffer,nch);
940 snprintf(buffer,512,
" else khig=khalf;\n");
941 nch = strlen(buffer); f->write(buffer,nch);
943 nch = strlen(buffer); f->write(buffer,nch);
945 nch = strlen(buffer); f->write(buffer,nch);
946 snprintf(buffer,512,
" // Evaluate now\n");
947 nch = strlen(buffer); f->write(buffer,nch);
948 snprintf(buffer,512,
" double dx=x-fX[klow];\n");
949 nch = strlen(buffer); f->write(buffer,nch);
950 snprintf(buffer,512,
" return (fY[klow]+dx*(fB[klow]+dx*(fC[klow]+dx*fD[klow])));\n");
951 nch = strlen(buffer); f->write(buffer,nch);
956 if (f) { f->close();
delete f;}
971 out<<
"spline3 = new TSpline3("<<quote<<
GetTitle()<<quote<<
"," 972 <<
fXmin<<
","<<
fXmax<<
",(TF1*)0,"<<
fNp<<
","<<quote<<quote<<
"," 974 out<<
" spline3->SetName("<<quote<<
GetName()<<quote<<
");"<<std::endl;
979 if (
fNpx != 100) out<<
" spline3->SetNpx("<<
fNpx<<
");"<<std::endl;
982 out<<
" spline3->SetPoint("<<i<<
","<<
fPoly[i].
X()<<
","<<
fPoly[i].
Y()<<
");"<<std::endl;
983 out<<
" spline3->SetPointCoeff("<<i<<
","<<
fPoly[i].
B()<<
","<<
fPoly[i].
C()<<
","<<
fPoly[i].
D()<<
");"<<std::endl;
985 out<<
" spline3->Draw("<<quote<<option<<quote<<
");"<<std::endl;
993 if (i < 0 || i >=
fNp)
return;
1003 if (i < 0 || i >=
fNp)
return;
1055 for (m=1; m<
fNp ; ++
m) {
1088 for (m=1; m<
l; ++
m) {
1112 g = -1./
fPoly[fNp-2].
D();
1121 g = -1./
fPoly[fNp-2].
D();
1130 g = -1./
fPoly[fNp-2].
D();
1143 g = -1./
fPoly[fNp-2].
D();
1157 for (i=1; i<
fNp; ++i) {
1161 fPoly[i-1].
C() = (divdf1 -
fPoly[i-1].
B() - divdf3)/dtau;
1162 fPoly[i-1].
D() = (divdf3/dtau)/dtau;
1169 void TSpline3::Streamer(
TBuffer &R__b)
1179 TSpline::Streamer(R__b);
1183 fPoly[i].Streamer(R__b);
1216 const char *cb1, *ce1, *cb2, *ce2;
1225 for (
Int_t i=0; i<
n; ++i) {
1250 const char *cb1, *ce1, *cb2, *ce2;
1259 for (
Int_t i=0; i<
n; ++i) {
1283 const char *cb1, *ce1, *cb2, *ce2;
1292 for (
Int_t i=0; i<
n; i++) {
1294 fPoly[i+beg].
Y() = ((
TF1*)func)->Eval(x[i]);
1317 const char *cb1, *ce1, *cb2, *ce2;
1326 for (
Int_t i=0; i<
n; ++i) {
1329 if (func)
fPoly[i+beg].
Y() = ((
TF1*)func)->Eval(x);
1352 const char *cb1, *ce1, *cb2, *ce2;
1386 const char *cb1, *ce1, *cb2, *ce2;
1443 const char *&cb1,
const char *&ce1,
1444 const char *&cb2,
const char *&ce2)
1449 cb1 = strstr(opt,
"b1");
1450 ce1 = strstr(opt,
"e1");
1451 cb2 = strstr(opt,
"b2");
1452 ce2 = strstr(opt,
"e2");
1474 const char *cb1,
const char *ce1,
const char *cb2,
1528 if(x<=
fXmin) klow=0;
1540 if(x>
fPoly[khalf=(klow+khig)/2].X())
1547 if(!(
fPoly[klow].X()<=x && x<=
fPoly[klow+1].X()))
1549 "Binary search failed x(%d) = %f < x(%d) = %f\n",
1550 klow,
fPoly[klow].X(),klow+1,
fPoly[klow+1].X());
1580 std::ofstream *
f =
new std::ofstream(filename,std::ios::out);
1582 Error(
"SaveAs",
"Cannot open file:%s\n",filename);
1588 Int_t nch = strlen(filename);
1589 snprintf(buffer,512,
"double %s",filename);
1590 char *dot = strstr(buffer,
".");
1592 strlcat(buffer,
"(double x) {\n",512);
1593 nch = strlen(buffer); f->write(buffer,nch);
1595 nch = strlen(buffer); f->write(buffer,nch);
1597 nch = strlen(buffer); f->write(buffer,nch);
1601 snprintf(buffer,512,
" const double fX[%d] = {",
fNp);
1602 nch = strlen(buffer); f->write(buffer,nch);
1606 for (i=0;i<
fNp;i++) {
1609 if (i == fNp-1) numb[nch-1]=0;
1610 strlcat(buffer,numb,512);
1611 if (i%5 == 4 || i == fNp-1) {
1612 nch = strlen(buffer); f->write(buffer,nch);
1613 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
1617 nch = strlen(buffer); f->write(buffer,nch);
1619 snprintf(buffer,512,
" const double fY[%d] = {",fNp);
1620 nch = strlen(buffer); f->write(buffer,nch);
1622 for (i=0;i<
fNp;i++) {
1625 if (i == fNp-1) numb[nch-1]=0;
1626 strlcat(buffer,numb,512);
1627 if (i%5 == 4 || i == fNp-1) {
1628 nch = strlen(buffer); f->write(buffer,nch);
1629 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
1633 nch = strlen(buffer); f->write(buffer,nch);
1635 snprintf(buffer,512,
" const double fB[%d] = {",fNp);
1636 nch = strlen(buffer); f->write(buffer,nch);
1638 for (i=0;i<
fNp;i++) {
1641 if (i == fNp-1) numb[nch-1]=0;
1642 strlcat(buffer,numb,512);
1643 if (i%5 == 4 || i == fNp-1) {
1644 nch = strlen(buffer); f->write(buffer,nch);
1645 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
1649 nch = strlen(buffer); f->write(buffer,nch);
1651 snprintf(buffer,512,
" const double fC[%d] = {",fNp);
1652 nch = strlen(buffer); f->write(buffer,nch);
1654 for (i=0;i<
fNp;i++) {
1657 if (i == fNp-1) numb[nch-1]=0;
1658 strlcat(buffer,numb,512);
1659 if (i%5 == 4 || i == fNp-1) {
1660 nch = strlen(buffer); f->write(buffer,nch);
1661 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
1665 nch = strlen(buffer); f->write(buffer,nch);
1667 snprintf(buffer,512,
" const double fD[%d] = {",fNp);
1668 nch = strlen(buffer); f->write(buffer,nch);
1670 for (i=0;i<
fNp;i++) {
1673 if (i == fNp-1) numb[nch-1]=0;
1674 strlcat(buffer,numb,512);
1675 if (i%5 == 4 || i == fNp-1) {
1676 nch = strlen(buffer); f->write(buffer,nch);
1677 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
1681 nch = strlen(buffer); f->write(buffer,nch);
1683 snprintf(buffer,512,
" const double fE[%d] = {",fNp);
1684 nch = strlen(buffer); f->write(buffer,nch);
1686 for (i=0;i<
fNp;i++) {
1689 if (i == fNp-1) numb[nch-1]=0;
1690 strlcat(buffer,numb,512);
1691 if (i%5 == 4 || i == fNp-1) {
1692 nch = strlen(buffer); f->write(buffer,nch);
1693 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
1697 nch = strlen(buffer); f->write(buffer,nch);
1699 snprintf(buffer,512,
" const double fF[%d] = {",fNp);
1700 nch = strlen(buffer); f->write(buffer,nch);
1702 for (i=0;i<
fNp;i++) {
1705 if (i == fNp-1) numb[nch-1]=0;
1706 strlcat(buffer,numb,512);
1707 if (i%5 == 4 || i == fNp-1) {
1708 nch = strlen(buffer); f->write(buffer,nch);
1709 if (i != fNp-1)
snprintf(buffer,512,
"\n ");
1713 nch = strlen(buffer); f->write(buffer,nch);
1716 snprintf(buffer,512,
" int klow=0;\n");
1717 nch = strlen(buffer); f->write(buffer,nch);
1719 snprintf(buffer,512,
" // If out of boundaries, extrapolate. It may be badly wrong\n");
1720 snprintf(buffer,512,
" if(x<=fXmin) klow=0;\n");
1721 nch = strlen(buffer); f->write(buffer,nch);
1722 snprintf(buffer,512,
" else if(x>=fXmax) klow=fNp-1;\n");
1723 nch = strlen(buffer); f->write(buffer,nch);
1725 nch = strlen(buffer); f->write(buffer,nch);
1726 snprintf(buffer,512,
" if(fKstep) {\n");
1727 nch = strlen(buffer); f->write(buffer,nch);
1729 snprintf(buffer,512,
" // Equidistant knots, use histogramming\n");
1730 nch = strlen(buffer); f->write(buffer,nch);
1731 snprintf(buffer,512,
" klow = int((x-fXmin)/fDelta);\n");
1732 nch = strlen(buffer); f->write(buffer,nch);
1733 snprintf(buffer,512,
" if (klow < fNp-1) klow = fNp-1;\n");
1734 nch = strlen(buffer); f->write(buffer,nch);
1735 snprintf(buffer,512,
" } else {\n");
1736 nch = strlen(buffer); f->write(buffer,nch);
1737 snprintf(buffer,512,
" int khig=fNp-1, khalf;\n");
1738 nch = strlen(buffer); f->write(buffer,nch);
1740 snprintf(buffer,512,
" // Non equidistant knots, binary search\n");
1741 nch = strlen(buffer); f->write(buffer,nch);
1742 snprintf(buffer,512,
" while(khig-klow>1)\n");
1743 nch = strlen(buffer); f->write(buffer,nch);
1744 snprintf(buffer,512,
" if(x>fX[khalf=(klow+khig)/2]) klow=khalf;\n");
1745 nch = strlen(buffer); f->write(buffer,nch);
1746 snprintf(buffer,512,
" else khig=khalf;\n");
1747 nch = strlen(buffer); f->write(buffer,nch);
1749 nch = strlen(buffer); f->write(buffer,nch);
1751 nch = strlen(buffer); f->write(buffer,nch);
1752 snprintf(buffer,512,
" // Evaluate now\n");
1753 nch = strlen(buffer); f->write(buffer,nch);
1754 snprintf(buffer,512,
" double dx=x-fX[klow];\n");
1755 nch = strlen(buffer); f->write(buffer,nch);
1756 snprintf(buffer,512,
" return (fY[klow]+dx*(fB[klow]+dx*(fC[klow]+dx*(fD[klow]+dx*(fE[klow]+dx*fF[klow])))));\n");
1757 nch = strlen(buffer); f->write(buffer,nch);
1762 if (f) { f->close();
delete f;}
1771 out<<
" "<<std::endl;
1781 out<<
"spline5 = new TSpline5("<<quote<<
GetTitle()<<quote<<
"," 1782 <<
fXmin<<
","<<
fXmax<<
",(TF1*)0,"<<
fNp<<
","<<quote<<quote<<
"," 1783 <<b1<<
","<<e1<<
","<<b2<<
","<<e2<<
");"<<std::endl;
1784 out<<
" spline5->SetName("<<quote<<
GetName()<<quote<<
");"<<std::endl;
1789 if (
fNpx != 100) out<<
" spline5->SetNpx("<<
fNpx<<
");"<<std::endl;
1792 out<<
" spline5->SetPoint("<<i<<
","<<
fPoly[i].
X()<<
","<<
fPoly[i].
Y()<<
");"<<std::endl;
1793 out<<
" spline5->SetPointCoeff("<<i<<
","<<
fPoly[i].
B()<<
","<<
fPoly[i].
C()<<
","<<
fPoly[i].
D()<<
","<<
fPoly[i].
E()<<
","<<
fPoly[i].
F()<<
");"<<std::endl;
1795 out<<
" spline5->Draw("<<quote<<option<<quote<<
");"<<std::endl;
1804 if (i < 0 || i >=
fNp)
return;
1815 if (i < 0 || i >=
fNp)
return;
1904 b1,
p2,
p3, q2, q3, r2, pq, pr, qr;
1919 if (q)
fPoly[1].
D() = q*6.*q2/(qr*qr);
1923 for (i = 1; i <
m; ++i) {
1936 fPoly[i+1].
D() = q3*6./(qr*qr);
1937 fPoly[i].
D() += (q+
q)*(pr*15.*pr+(p+r)*q
1938 *(pr* 20.+q2*7.)+q2*
1939 ((p2+r2)*8.+pr*21.+q2+q2))/(pqqr*pqqr);
1940 fPoly[i-1].
D() += q3*6./(pq*pq);
1941 fPoly[i].
E() = q2*(p*qr+pq*3.*(qr+r+
r))/(pqqr*qr);
1942 fPoly[i-1].
E() += q2*(r*pq+qr*3.*(pq+p+p))/(pqqr*pq);
1943 fPoly[i-1].
F() = q3/pqqr;
1948 if (r)
fPoly[m-1].
D() += r*6.*r2/(qr*qr);
1953 for (i = 1; i <
fNp; ++i) {
1962 for (i = 2; i <
fNp; ++i) {
1980 for (i = 2; i <
m; ++i) {
1993 for (i=fNp-3; i > 0; --i)
2011 for (i = 1; i <
m; ++i) {
2032 p3-(v+
fPoly[i].
E())*q3)/pq;
2089 printf(
"1 TEST OF TSpline5 WITH NONEQUIDISTANT KNOTS\n");
2104 printf(
"\n-N = %3d M =%2d\n",n,m);
2106 for (i = 0; i <
n; ++i)
2107 spline->
GetCoeff(i,hx, a[i],a[i+200],a[i+400],
2108 a[i+600],a[i+800],a[i+1000]);
2110 for (i = 0; i < mm1; ++i) diff[i] = com[i] = 0;
2111 for (k = 0; k <
n; ++k) {
2112 for (i = 0; i <
mm; ++i) c[i] = a[k+i*200];
2113 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
2114 printf(
"%12.8f\n",x[k]);
2116 printf(
"%16.8f\n",c[0]);
2118 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2120 for (i = 0; i < mm1; ++i)
2121 if ((z=
TMath::Abs(a[k+i*200])) > com[i]) com[i] =
z;
2123 for (i = 1; i <
mm; ++i)
2124 for (jj = i; jj <
mm; ++jj) {
2126 c[j-2] = c[j-1]*z+c[j-2];
2128 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2130 for (i = 0; i < mm1; ++i)
2131 if (!(k >= n-2 && i != 0))
2133 > diff[i]) diff[i] =
z;
2136 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
2137 for (i = 0; i < mm1; ++i) printf(
"%18.9E",diff[i]);
2139 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
2142 for (i = 0; i < mm1; ++i) printf(
"%16.8f",com[i]);
2145 for (n = 10; n <= 100; n += 10) {
2149 for (i = 0; i < nm1; i += 2) {
2159 printf(
"\n-N = %3d M =%2d\n",n,m);
2160 spline =
new TSpline5(
"Test",x,y,n);
2161 for (i = 0; i <
n; ++i)
2162 spline->
GetCoeff(i,hx,a[i],a[i+200],a[i+400],
2163 a[i+600],a[i+800],a[i+1000]);
2165 for (i = 0; i < mm1; ++i)
2166 diff[i] = com[i] = 0;
2167 for (k = 0; k <
n; ++k) {
2168 for (i = 0; i <
mm; ++i)
2171 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
2172 printf(
"%12.8f\n",x[k]);
2173 if (k == n-1) printf(
"%16.8f\n",c[0]);
2175 if (k == n-1)
break;
2177 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2180 for (i = 0; i < mm1; ++i)
2184 for (i = 1; i <
mm; ++i)
2185 for (jj = i; jj <
mm; ++jj) {
2187 c[j-2] = c[j-1]*z+c[j-2];
2190 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2193 for (i = 0; i < mm1; ++i)
2194 if (!(k >= n-2 && i != 0))
2196 > diff[i]) diff[i] =
z;
2198 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
2199 for (i = 0; i < mm1; ++i) printf(
"%18.9E",diff[i]);
2201 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
2204 for (i = 0; i < mm1; ++i) printf(
"%16.8E",com[i]);
2209 printf(
"1 TEST OF TSpline5 WITH NONEQUIDISTANT DOUBLE KNOTS\n");
2235 printf(
"-N = %3d M =%2d\n",n,m);
2236 spline =
new TSpline5(
"Test",x,y,nn);
2237 for (i = 0; i < nn; ++i)
2238 spline->
GetCoeff(i,hx,a[i],a[i+200],a[i+400],
2239 a[i+600],a[i+800],a[i+1000]);
2241 for (i = 0; i < mm1; ++i)
2242 diff[i] = com[i] = 0;
2243 for (k = 0; k < nn; ++k) {
2244 for (i = 0; i <
mm; ++i)
2246 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
2247 printf(
"%12.8f\n",x[k]);
2249 printf(
"%16.8f\n",c[0]);
2252 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2254 for (i = 0; i < mm1; ++i)
2255 if ((z=
TMath::Abs(a[k+i*200])) > com[i]) com[i] =
z;
2257 for (i = 1; i <
mm; ++i)
2258 for (jj = i; jj <
mm; ++jj) {
2260 c[j-2] = c[j-1]*z+c[j-2];
2262 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2264 for (i = 0; i < mm1; ++i)
2265 if (!(k >= nn-2 && i != 0))
2267 > diff[i]) diff[i] =
z;
2269 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
2270 for (i = 1; i <= mm1; ++i) {
2271 printf(
"%18.9E",diff[i-1]);
2276 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
2277 for (i = 0; i < mm1; ++i) printf(
"%16.8f",com[i]);
2280 for (n = 10; n <= 100; n += 10) {
2285 for (i = 0; i <
n; ++i) {
2292 printf(
"-N = %3d M =%2d\n",n,m);
2293 spline =
new TSpline5(
"Test",x,y,nn);
2294 for (i = 0; i < nn; ++i)
2295 spline->
GetCoeff(i,hx,a[i],a[i+200],a[i+400],
2296 a[i+600],a[i+800],a[i+1000]);
2298 for (i = 0; i < mm1; ++i)
2299 diff[i] = com[i] = 0;
2300 for (k = 0; k < nn; ++k) {
2301 for (i = 0; i <
mm; ++i)
2304 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
2305 printf(
"%12.8f\n",x[k]);
2306 if (k == nn-1) printf(
"%16.8f\n",c[0]);
2308 if (k == nn-1)
break;
2310 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2313 for (i = 0; i < mm1; ++i)
2314 if ((z=
TMath::Abs(a[k+i*200])) > com[i]) com[i] =
z;
2316 for (i = 1; i <
mm; ++i) {
2317 for (jj = i; jj <
mm; ++jj) {
2319 c[j-2] = c[j-1]*z+c[j-2];
2323 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2326 for (i = 0; i < mm1; ++i)
2327 if (!(k >= nn-2 && i != 0))
2329 > diff[i]) diff[i] =
z;
2331 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
2332 for (i = 0; i < mm1; ++i) printf(
"%18.9E",diff[i]);
2334 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
2337 for (i = 0; i < mm1; ++i) printf(
"%18.9E",com[i]);
2343 printf(
"1 TEST OF TSpline5 WITH NONEQUIDISTANT KNOTS,\n");
2344 printf(
" ONE DOUBLE, ONE TRIPLE KNOT\n");
2365 printf(
"-N = %3d M =%2d\n",n,m);
2367 for (i = 0; i <
n; ++i)
2368 spline->
GetCoeff(i,hx,a[i],a[i+200],a[i+400],
2369 a[i+600],a[i+800],a[i+1000]);
2371 for (i = 0; i < mm1; ++i)
2372 diff[i] = com[i] = 0;
2373 for (k = 0; k <
n; ++k) {
2374 for (i = 0; i <
mm; ++i)
2376 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
2377 printf(
"%12.8f\n",x[k]);
2379 printf(
"%16.8f\n",c[0]);
2382 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2384 for (i = 0; i < mm1; ++i)
2385 if ((z=
TMath::Abs(a[k+i*200])) > com[i]) com[i] =
z;
2387 for (i = 1; i <
mm; ++i)
2388 for (jj = i; jj <
mm; ++jj) {
2390 c[j-2] = c[j-1]*z+c[j-2];
2392 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2394 for (i = 0; i < mm1; ++i)
2395 if (!(k >= n-2 && i != 0))
2397 > diff[i]) diff[i] =
z;
2399 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
2400 for (i = 0; i < mm1; ++i) printf(
"%18.9E",diff[i]);
2402 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
2405 for (i = 0; i < mm1; ++i) printf(
"%16.8f",com[i]);
2410 printf(
"1 TEST OF TSpline5 WITH NONEQUIDISTANT KNOTS,\n");
2411 printf(
" TWO DOUBLE, ONE TRIPLE KNOT\n");
2436 printf(
"-N = %3d M =%2d\n",n,m);
2437 spline =
new TSpline5(
"Test",x,y,n);
2438 for (i = 0; i <
n; ++i)
2439 spline->
GetCoeff(i,hx,a[i],a[i+200],a[i+400],
2440 a[i+600],a[i+800],a[i+1000]);
2442 for (i = 0; i < mm1; ++i)
2443 diff[i] = com[i] = 0;
2444 for (k = 0; k <
n; ++k) {
2445 for (i = 0; i <
mm; ++i)
2447 printf(
" ---------------------------------------%3d --------------------------------------------\n",k+1);
2448 printf(
"%12.8f\n",x[k]);
2450 printf(
"%16.8f\n",c[0]);
2453 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2455 for (i = 0; i < mm1; ++i)
2456 if ((z=
TMath::Abs(a[k+i*200])) > com[i]) com[i] =
z;
2458 for (i = 1; i <
mm; ++i)
2459 for (jj = i; jj <
mm; ++jj) {
2461 c[j-2] = c[j-1]*z+c[j-2];
2463 for (i = 0; i <
mm; ++i) printf(
"%16.8f",c[i]);
2465 for (i = 0; i < mm1; ++i)
2466 if (!(k >= n-2 && i != 0))
2468 > diff[i]) diff[i] =
z;
2470 printf(
" MAXIMUM ABSOLUTE VALUES OF DIFFERENCES \n");
2471 for (i = 0; i < mm1; ++i) printf(
"%18.9E",diff[i]);
2473 printf(
" MAXIMUM ABSOLUTE VALUES OF COEFFICIENTS \n");
2476 for (i = 0; i < mm1; ++i) printf(
"%16.8f",com[i]);
2483 void TSpline5::Streamer(
TBuffer &R__b)
2493 TSpline::Streamer(R__b);
2497 fPoly[i].Streamer(R__b);
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set point number i.
virtual const char * GetName() const
Returns name of object.
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
TSplinePoly3 & operator=(TSplinePoly3 const &other)
Assignment operator.
virtual void Paint(Option_t *option="")
Control routine to paint any kind of histograms.
TSplinePoly & operator=(TSplinePoly const &other)
Assignment operator.
static void Test()
Test method for TSpline5.
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
virtual void SaveAs(const char *filename, Option_t *option="") const
Write this spline as a C++ function that can be executed without ROOT the name of the function is the...
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py)
Execute action corresponding to one event.
static double p3(double t, double a, double b, double c, double d)
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save primitive as a C++ statement(s) on output stream out.
virtual void SetLimits(Double_t xmin, Double_t xmax)
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py)
Compute distance from point px,py to a spline.
void BoundaryConditions(const char *opt, Int_t &beg, Int_t &end, const char *&cb1, const char *&ce1, const char *&cb2, const char *&ce2)
Check the boundary conditions and the amount of extra double knots needed.
Int_t FindX(Double_t x) const
Find X.
THist< 1, float, THistStatContent, THistStatUncertainty > TH1F
Base class for spline implementation containing the Draw/Paint methods.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Buffer base class used for serializing objects.
void CopyPoly(TSplinePoly3 const &other)
Utility called by the copy constructors and = operator.
virtual Int_t CheckByteCount(UInt_t startpos, UInt_t bcnt, const TClass *clss)=0
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
virtual void SetFillStyle(Style_t fstyle)
Set the fill area style.
Int_t FloorNint(Double_t x)
static constexpr double mm
virtual Width_t GetLineWidth() const
Return the line width.
static void Test()
Test method for TSpline5.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Class to create third splines to interpolate knots Arbitrary conditions can be introduced for first a...
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
virtual Style_t GetMarkerStyle() const
Return the marker style.
virtual Style_t GetLineStyle() const
Return the line style.
Double_t Eval(Double_t x) const
Eval this spline at x.
Fill Area Attributes class.
virtual void Paint(Option_t *chopt="")
Draw this graph with its current attributes.
virtual void SaveLineAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t widdef=1)
Save line attributes as C++ statement(s) on output stream out.
The TNamed class is the base class for all named ROOT classes.
Double_t Log10(Double_t x)
static double p2(double t, double a, double b, double c)
Base class for TSpline knot.
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
void CopyPoly(TSplinePoly const &other)
Utility called by the copy constructors and = operator.
virtual void SetMarkerColor(Color_t mcolor=1)
Set the marker color.
TSpline & operator=(const TSpline &)
Assignment operator.
virtual Size_t GetMarkerSize() const
Return the marker size.
TObject & operator=(const TObject &rhs)
TObject assignment operator.
virtual void SaveMarkerAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t sizdef=1)
Save line attributes as C++ statement(s) on output stream out.
TSpline5 & operator=(const TSpline5 &)
Assignment operator.
Double_t Derivative(Double_t x) const
virtual Int_t DistancetoPrimitive(Int_t px, Int_t py)
Compute distance from point px,py to a line.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py)
Execute action corresponding to one event.
TSplinePoly5 & operator=(TSplinePoly5 const &other)
Assignment operator.
TNamed & operator=(const TNamed &rhs)
TNamed assignment operator.
virtual Int_t GetPoint(Int_t i, Double_t &x, Double_t &y) const
Get x and y values for point number i.
R__EXTERN TSystem * gSystem
Double_t Derivative(Double_t x) const
Double_t Derivative(Double_t x) const
Derivative.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save primitive as a C++ statement(s) on output stream out.
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
void SetCond(const char *opt)
Check the boundary conditions.
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual void SaveFillAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1001)
Save fill attributes as C++ statement(s) on output stream out.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void SetPointCoeff(Int_t i, Double_t b, Double_t c, Double_t d)
Set point coefficient number i.
Double_t Eval(Double_t x) const
virtual void SetMarkerStyle(Style_t mstyle=1)
Set the marker style.
virtual Double_t Eval(Double_t x) const =0
void BuildCoeff()
Build coefficients.
TSpline3 & operator=(const TSpline3 &)
Assignment operator.
virtual void SaveAs(const char *filename, Option_t *option="") const
Write this spline as a C++ function that can be executed without ROOT the name of the function is the...
virtual void SetMarkerSize(Size_t msize=1)
Set the marker size.
constexpr Double_t E()
Base of natural log: .
void SetBoundaries(Double_t b1, Double_t e1, Double_t b2, Double_t e2, const char *cb1, const char *ce1, const char *cb2, const char *ce2)
Set the boundary conditions at double/triple knots.
virtual void GetKnot(Int_t i, Double_t &x, Double_t &y) const =0
virtual ~TSpline()
Destructor.
virtual Color_t GetLineColor() const
Return the line color.
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=0)=0
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set point number i.
virtual void Draw(Option_t *option="")
Draw this function with its current attributes.
virtual Color_t GetFillColor() const
Return the fill area color.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
static constexpr double s
you should not use this method at all Int_t Int_t Double_t Double_t Double_t e
virtual void SetPointCoeff(Int_t i, Double_t b, Double_t c, Double_t d, Double_t e, Double_t f)
Set point coefficient number i.
virtual void SetLineStyle(Style_t lstyle)
Set the line style.
Binding & operator=(OUT(*fun)(void))
you should not use this method at all Int_t Int_t z
void GetCoeff(Int_t i, Double_t &x, Double_t &y, Double_t &b, Double_t &c, Double_t &d, Double_t &e, Double_t &f)
void GetCoeff(Int_t i, Double_t &x, Double_t &y, Double_t &b, Double_t &c, Double_t &d)
void BuildCoeff()
Algorithm 600, collected algorithms from acm.
Short_t Max(Short_t a, Short_t b)
A Graph is a graphics object made of two arrays X and Y with npoints each.
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
Class to create quintic natural splines to interpolate knots Arbitrary conditions can be introduced f...
virtual void Paint(Option_t *option="")
Paint this function with its current attributes.
virtual Color_t GetMarkerColor() const
Return the marker color.
void CopyPoly(TSplinePoly5 const &other)
Utility called by the copy constructors and = operator.
virtual Style_t GetFillStyle() const
Return the fill area style.
Int_t FindX(Double_t x) const
Find X.
Double_t Derivative(Double_t x) const
Derivative.
Double_t Eval(Double_t x) const
Eval this spline at x.
TAxis * GetXaxis()
Get the behaviour adopted by the object about the statoverflows. See EStatOverflows for more informat...
virtual Version_t ReadVersion(UInt_t *start=0, UInt_t *bcnt=0, const TClass *cl=0)=0
virtual const char * GetTitle() const
Returns title of object.
Double_t Eval(Double_t x) const
const char * Data() const