81 for (i=0;i<
fNin;i++) {
89 for (i=0;i<
fNin;i++) {
118 if (opt.
Contains(
"normal")) kernel = 2;
124 if (xout ==
nullptr) {
168 while ((imin <
n) && (
x[imin] < xp[0] - cutoff))
176 for (
Int_t i=imin;i<
n;i++) {
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];
295 Lowest(&
x[1], &
y[1],
n,
x[i], ys[i], nleft, nright,
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;
494 if (fMinX < 0 || fMaxX > 1) {
495 std::cout <<
"Error: x must be between 0 and 1 for periodic smooth" << std::endl;
504 for (i=0; i<
fNout; i++) {
510 for (i=0; i<
fNin; i++) {
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) {
638 BDRsmooth(
n, &
x[1], &
y[1], &
w[1], spans[i - 1], jper, vsmlsq,
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) {
868 for (i=0;i<
fNin;i++) {
885 for (i=1;i<
fNin+1;i++) {
887 vMin = vMean = vMax = yin[
index[i-1]];
889 vMean += yin[
index[i]];
890 vMax = (vMax < yin[
index[i]]) ? yin[
index[i]] : vMax;
891 vMin = (vMin > yin[
index[i]]) ? yin[
index[i]] : vMin;
898 if (ndup == 1) {
y[k++] = yin[
index[i-1]];}
918 for (i=0;i<
fNin;i++) {
1003 if (opt.
Contains(
"linear")) iKind = 1;
1004 else if (opt.
Contains(
"constant")) iKind = 2;
1006 if (f < 0 || f > 1) {
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;
1071 Int_t ij = (i + j)/2;
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; }
1137 for (
Int_t i=0;i<
n;i++) {
1139 rank[
index[i]] = i-1;
1142 rank[
index[i]] = i-k;
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)
Smooth data with Super smoother.
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.
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
virtual void Set(Int_t n)
Set number of points in the graph Existing coordinates are preserved New coordinates above fNpoints a...
The TNamed class is the base class for all named ROOT classes.
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.