118 if (opt.
Contains(
"normal")) kernel = 2;
124 if (xout ==
nullptr) {
135 if (xout ==
nullptr)
fGout->SetPoint(
i,
fMinX +
i*delta, 0);
168 while ((imin <
n) && (
x[imin] < xp[0] - cutoff))
177 if (
x[
i] < x0 - cutoff) imin =
i;
178 if (
x[
i] > x0 + cutoff)
break;
180 if (kernel == 1)
w = 1;
250 Int_t i, iiter, j, last, m1, m2, nleft, nright, ns;
251 Double_t alpha,
c1, c9, cmad, cut, d1, d2, denom,
r;
272 while (iiter <= iter+1) {
281 d1 =
x[
i] -
x[nleft];
282 d2 =
x[nright+1] -
x[
i];
296 res, iterg1, rw, ok);
297 if (!ok) ys[
i] =
y[
i];
301 denom =
x[
i]-
x[last];
304 for(j = last+1; j <
i; j++) {
305 alpha = (
x[j]-
x[last])/denom;
306 ys[j] = alpha*ys[
i] + (1.-alpha)*ys[last];
314 cut =
x[last] + delta;
315 for (
i = last+1;
i <=
n;
i++) {
318 if (
x[
i] ==
x[last]) {
330 res[
i] =
y[
i+1] - ys[
i+1];
345 cmad = 3.*(rw[m1]+rw[m2]);
352 for(
i=0 ;
i<
n ;
i++) {
357 rw[
i] = (1.-(
r/cmad)*(
r/cmad))*(1.-(
r/cmad)*(
r/cmad));
399 w[j] = (1.-
d)*(1.-
d)*(1.-
d);
404 }
else if (
x[j] > xs)
416 for(j=nleft ; j<=nrt ; j++)
421 for(j=nleft ; j<=nrt ; j++)
425 for(j=nleft ; j<=nrt ; j++)
426 c +=
w[j]*(
x[j]-
a)*(
x[j]-
a);
430 for(j=nleft; j <= nrt; j++)
431 w[j] *= (
b*(
x[j]-
a) + 1.);
435 for(j=nleft; j <= nrt; j++)
482 if (span < 0 || span > 1) {
483 std::cout <<
"Error: Span must be between 0 and 1" << std::endl;
495 std::cout <<
"Error: x must be between 0 and 1 for periodic smooth" << std::endl;
511 if (
w ==
nullptr) weight[
i] = 1;
512 else weight[
i] =
w[
i];
518 for (
i=0;
i<nTmp;
i++) {
583 Double_t spans[3] = { 0.05, 0.2, 0.5 };
606 if (sw > 0.0)
a = sy / sw;
607 for (j=1;j<=
n;++j) smo[j] =
a;
614 while (scale <= 0.0) {
624 if (iper == 2 && (
x[1] < 0.0 ||
x[
n] > 1.0)) {
627 if (jper < 1 || jper > 2) {
632 &smo[1], &sc[sc_offset]);
637 for (
i = 1;
i <= 3; ++
i) {
639 &sc[((
i<<1)-1)*
n + 1], &sc[
n*7 + 1]);
640 BDRsmooth(
n, &
x[1], &sc[
n*7 + 1], &
w[1], spans[1], -jper, vsmlsq,
641 &sc[(
i<<1)*
n + 1], &
h[1]);
644 for (j=1; j<=
n; ++j) {
646 for (
i=1;
i<=3; ++
i) {
647 if (sc[j + (
i<<1)*
n] < resmin) {
648 resmin = sc[j + (
i<<1)*
n];
649 sc[j +
n*7] = spans[
i-1];
653 if (alpha>0.0 && alpha<=10.0 && resmin<sc[j +
n*6] && resmin>0.0) {
661 BDRsmooth(
n, &
x[1], &sc[
n*7 + 1], &
w[1], spans[1], -jper, vsmlsq,
662 &sc[(
n<<1) + 1], &
h[1]);
664 for (j=1; j<=
n; ++j) {
665 if (sc[j + (
n<<1)] <= spans[0]) {
666 sc[j + (
n<<1)] = spans[0];
668 if (sc[j + (
n<<1)] >= spans[2]) {
669 sc[j + (
n<<1)] = spans[2];
671 f = sc[j + (
n<<1)] - spans[1];
673 f = -
f / (spans[1] - spans[0]);
674 sc[j + (
n<<2)] = (1.0 -
f) * sc[j +
n*3] +
f * sc[j +
n];
676 f /= spans[2] - spans[1];
677 sc[j + (
n<<2)] = (1.0 -
f) * sc[j +
n*3] +
f * sc[j +
n*5];
681 BDRsmooth(
n, &
x[1], &sc[(
n<<2) + 1], &
w[1], spans[0], -jper, vsmlsq,
697 Int_t i, j, j0, in, out, it, jper, ibw;
717 ibw = (
Int_t)(span * 0.5 *
n + 0.5);
723 for (
i=1;
i<=it; ++
i) {
737 xm = (fbo * xm + wt * xti) / fbw;
738 ym = (fbo * ym + wt *
y[j]) / fbw;
742 tmp = fbw * wt * (xti - xm) / fbo;
744 var += tmp * (xti - xm);
745 cvar += tmp * (
y[j] - ym);
748 for (j=1; j<=
n; ++j) {
751 if (!(jper != 2 && (out < 1 || in >
n))) {
770 tmp = fbo * wt * (xto - xm) / fbw;
772 var -= tmp * (xto - xm);
773 cvar -= tmp * (
y[out] - ym);
775 xm = (fbo * xm - wt * xto) / fbw;
776 ym = (fbo * ym - wt *
y[out]) / fbw;
782 xm = (fbo * xm + wt * xti) / fbw;
783 ym = (fbo * ym + wt *
y[in]) / fbw;
787 tmp = fbw * wt * (xti - xm) / fbo;
789 var += tmp * (xti - xm);
790 cvar += tmp * (
y[in] - ym);
797 smo[j] =
a * (
x[j] - xm) + ym;
831 if (
x[j + 1] >
x[j]) {
845 for (
i=j0;
i<=j; ++
i) {
887 vMin = vMean = vMax = yin[
index[
i-1]];
898 if (ndup == 1) {
y[k++] = yin[
index[
i-1]];}
932 ylow =
fGin->GetY()[0];
1003 if (opt.
Contains(
"linear")) iKind = 1;
1004 else if (opt.
Contains(
"constant")) iKind = 2;
1007 std::cout <<
"Error: Invalid f value" << std::endl;
1023 std::cout <<
"Error: Method not known: " << ties << std::endl;
1030 Approxin(grin, iKind, ylow, yhigh, rule, iTies);
1035 if (xout ==
nullptr) {
1044 if (xout ==
nullptr)
x =
fMinX +
i*delta;
1066 if(
v <
x[
i])
return ylow;
1067 if(
v >
x[j])
return yhigh;
1072 if(
v <
x[ij]) j = ij;
1077 if(
v ==
x[j])
return y[j];
1078 if(
v ==
x[
i])
return y[
i];
1081 return y[
i] + (
y[j] -
y[
i]) * ((
v -
x[
i])/(
x[j] -
x[
i]));
1083 return y[
i] * (1-
f) +
y[j] *
f;
1095 if (
x <
y)
return -1;
1096 if (
x >
y)
return 1;
1110 for (pL = 0, pR =
n - 1; pL < pR; ) {
1112 for(
i = pL, j = pR;
i <= j;) {
1115 if (
i <= j) {
w =
x[
i];
x[
i++] =
x[j];
x[j--] =
w; }
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void w
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t np
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
A TGraphErrors is a TGraph with error bars.
A helper class to smooth TGraph.
Double_t fMinX
Minimum value of array X.
TGraph * fGin
Input graph.
Double_t fMaxX
Maximum value of array X.
static Int_t Rcmp(Double_t x, Double_t y)
Static function if (ISNAN(x)) return 1; if (ISNAN(y)) return -1;.
TGraph * SmoothLowess(TGraph *grin, Option_t *option="", Double_t span=0.67, Int_t iter=3, Double_t delta=0)
Smooth data with Lowess smoother.
~TGraphSmooth() override
GraphSmooth destructor.
TGraph * SmoothSuper(TGraph *grin, Option_t *option="", Double_t bass=0, Double_t span=0, Bool_t isPeriodic=kFALSE, Double_t *w=nullptr)
static void Rank(Int_t n, Double_t *a, Int_t *index, Int_t *rank, Bool_t down=kTRUE)
static function
Int_t fNout
Number of output points.
static void BDRksmooth(Double_t *x, Double_t *y, Int_t n, Double_t *xp, Double_t *yp, Int_t np, Int_t kernel, Double_t bw)
Smooth data with specified kernel.
Int_t fNin
Number of input points.
void Smoothin(TGraph *grin)
Sort input data points.
TGraph * SmoothKern(TGraph *grin, Option_t *option="normal", Double_t bandwidth=0.5, Int_t nout=100, Double_t *xout=nullptr)
Smooth data with Kernel smoother.
TGraph * Approx(TGraph *grin, Option_t *option="linear", Int_t nout=50, Double_t *xout=nullptr, Double_t yleft=0, Double_t yright=0, Int_t rule=0, Double_t f=0, Option_t *ties="mean")
Approximate data points.
static void BDRsupsmu(Int_t n, Double_t *x, Double_t *y, Double_t *w, Int_t iper, Double_t span, Double_t alpha, Double_t *smo, Double_t *sc)
Friedmanns super smoother (Friedman, 1984).
static void Psort(Double_t *x, Int_t n, Int_t k)
Static function based on R function rPsort: adapted to C++ by Christian Stratowa (R source file: R_so...
TGraph * fGout
Output graph.
static void Lowest(Double_t *x, Double_t *y, Int_t n, Double_t &xs, Double_t &ys, Int_t nleft, Int_t nright, Double_t *w, Bool_t userw, Double_t *rw, Bool_t &ok)
Fit value at x[i] Based on R function lowest: Translated to C++ by C.
static void BDRsmooth(Int_t n, Double_t *x, Double_t *y, Double_t *w, Double_t span, Int_t iper, Double_t vsmlsq, Double_t *smo, Double_t *acvr)
Function for super smoother Based on R function supsmu: Translated to C++ by C.
static Double_t Approx1(Double_t v, Double_t f, Double_t *x, Double_t *y, Int_t n, Int_t iKind, Double_t Ylow, Double_t Yhigh)
Approximate one data point.
void Lowess(Double_t *x, Double_t *y, Int_t n, Double_t *ys, Double_t span, Int_t iter, Double_t delta)
Lowess regression smoother.
void Approxin(TGraph *grin, Int_t iKind, Double_t &Ylow, Double_t &Yhigh, Int_t rule, Int_t iTies)
Sort data points and eliminate double x values.
A TGraph is an object made of two arrays X and Y with npoints each.
void ToLower()
Change string to lower-case.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
Sort the n elements of the array a of generic templated type Element.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.