86 for (i=0;i<
fNin;i++) {
94 for (i=0;i<
fNin;i++) {
123 if (opt.
Contains(
"normal")) kernel = 2;
173 while ((imin <
n) && (
x[imin] < xp[0] - cutoff))
181 for (
Int_t i=imin;i<
n;i++) {
182 if (
x[i] < x0 - cutoff) imin = i;
183 if (
x[i] > x0 + cutoff)
break;
185 if (kernel == 1)
w = 1;
255 Int_t i, iiter, j, last, m1, m2, nleft, nright, ns;
256 Double_t alpha,
c1, c9, cmad, cut, d1, d2, denom,
r;
277 while (iiter <= iter+1) {
286 d1 =
x[i] -
x[nleft];
287 d2 =
x[nright+1] -
x[i];
300 Lowest(&
x[1], &
y[1],
n,
x[i], ys[i], nleft, nright,
301 res, iterg1, rw, ok);
302 if (!ok) ys[i] =
y[i];
306 denom =
x[i]-
x[last];
309 for(j = last+1; j < i; j++) {
310 alpha = (
x[j]-
x[last])/denom;
311 ys[j] = alpha*ys[i] + (1.-alpha)*ys[last];
319 cut =
x[last] + delta;
320 for (i = last+1; i <=
n; i++) {
323 if (
x[i] ==
x[last]) {
335 res[i] =
y[i+1] - ys[i+1];
350 cmad = 3.*(rw[m1]+rw[m2]);
357 for(i=0 ; i<
n ; i++) {
362 rw[i] = (1.-(
r/cmad)*(
r/cmad))*(1.-(
r/cmad)*(
r/cmad));
404 w[j] = (1.-
d)*(1.-
d)*(1.-
d);
409 }
else if (
x[j] > xs)
421 for(j=nleft ; j<=nrt ; j++)
426 for(j=nleft ; j<=nrt ; j++)
430 for(j=nleft ; j<=nrt ; j++)
431 c +=
w[j]*(
x[j]-
a)*(
x[j]-
a);
435 for(j=nleft; j <= nrt; j++)
436 w[j] *= (
b*(
x[j]-
a) + 1.);
440 for(j=nleft; j <= nrt; j++)
487 if (span < 0 || span > 1) {
488 std::cout <<
"Error: Span must be between 0 and 1" << std::endl;
499 if (fMinX < 0 || fMaxX > 1) {
500 std::cout <<
"Error: x must be between 0 and 1 for periodic smooth" << std::endl;
509 for (i=0; i<
fNout; i++) {
515 for (i=0; i<
fNin; i++) {
516 if (
w == 0) weight[i] = 1;
517 else weight[i] =
w[i];
523 for (i=0; i<nTmp; i++) {
588 Double_t spans[3] = { 0.05, 0.2, 0.5 };
611 if (sw > 0.0)
a = sy / sw;
612 for (j=1;j<=
n;++j) smo[j] =
a;
619 while (scale <= 0.0) {
629 if (iper == 2 && (
x[1] < 0.0 ||
x[
n] > 1.0)) {
632 if (jper < 1 || jper > 2) {
637 &smo[1], &sc[sc_offset]);
642 for (i = 1; i <= 3; ++i) {
643 BDRsmooth(
n, &
x[1], &
y[1], &
w[1], spans[i - 1], jper, vsmlsq,
644 &sc[((i<<1)-1)*
n + 1], &sc[
n*7 + 1]);
645 BDRsmooth(
n, &
x[1], &sc[
n*7 + 1], &
w[1], spans[1], -jper, vsmlsq,
646 &sc[(i<<1)*
n + 1], &
h[1]);
649 for (j=1; j<=
n; ++j) {
651 for (i=1; i<=3; ++i) {
652 if (sc[j + (i<<1)*
n] < resmin) {
653 resmin = sc[j + (i<<1)*
n];
654 sc[j +
n*7] = spans[i-1];
658 if (alpha>0.0 && alpha<=10.0 && resmin<sc[j +
n*6] && resmin>0.0) {
666 BDRsmooth(
n, &
x[1], &sc[
n*7 + 1], &
w[1], spans[1], -jper, vsmlsq,
667 &sc[(
n<<1) + 1], &
h[1]);
669 for (j=1; j<=
n; ++j) {
670 if (sc[j + (
n<<1)] <= spans[0]) {
671 sc[j + (
n<<1)] = spans[0];
673 if (sc[j + (
n<<1)] >= spans[2]) {
674 sc[j + (
n<<1)] = spans[2];
676 f = sc[j + (
n<<1)] - spans[1];
678 f = -
f / (spans[1] - spans[0]);
679 sc[j + (
n<<2)] = (1.0 -
f) * sc[j +
n*3] +
f * sc[j +
n];
681 f /= spans[2] - spans[1];
682 sc[j + (
n<<2)] = (1.0 -
f) * sc[j +
n*3] +
f * sc[j +
n*5];
686 BDRsmooth(
n, &
x[1], &sc[(
n<<2) + 1], &
w[1], spans[0], -jper, vsmlsq,
702 Int_t i, j, j0, in, out, it, jper, ibw;
722 ibw = (
Int_t)(span * 0.5 *
n + 0.5);
728 for (i=1; i<=it; ++i) {
742 xm = (fbo * xm + wt * xti) / fbw;
743 ym = (fbo * ym + wt *
y[j]) / fbw;
747 tmp = fbw * wt * (xti - xm) / fbo;
749 var += tmp * (xti - xm);
750 cvar += tmp * (
y[j] - ym);
753 for (j=1; j<=
n; ++j) {
756 if (!(jper != 2 && (out < 1 || in >
n))) {
775 tmp = fbo * wt * (xto - xm) / fbw;
777 var -= tmp * (xto - xm);
778 cvar -= tmp * (
y[out] - ym);
780 xm = (fbo * xm - wt * xto) / fbw;
781 ym = (fbo * ym - wt *
y[out]) / fbw;
787 xm = (fbo * xm + wt * xti) / fbw;
788 ym = (fbo * ym + wt *
y[in]) / fbw;
792 tmp = fbw * wt * (xti - xm) / fbo;
794 var += tmp * (xti - xm);
795 cvar += tmp * (
y[in] - ym);
802 smo[j] =
a * (
x[j] - xm) + ym;
836 if (
x[j + 1] >
x[j]) {
850 for (i=j0; i<=j; ++i) {
873 for (i=0;i<
fNin;i++) {
890 for (i=1;i<
fNin+1;i++) {
892 vMin = vMean = vMax = yin[
index[i-1]];
894 vMean += yin[
index[i]];
895 vMax = (vMax < yin[
index[i]]) ? yin[
index[i]] : vMax;
896 vMin = (vMin > yin[
index[i]]) ? yin[
index[i]] : vMin;
903 if (ndup == 1) {
y[k++] = yin[
index[i-1]];}
923 for (i=0;i<
fNin;i++) {
1008 if (opt.
Contains(
"linear")) iKind = 1;
1009 else if (opt.
Contains(
"constant")) iKind = 2;
1011 if (f < 0 || f > 1) {
1012 std::cout <<
"Error: Invalid f value" << std::endl;
1028 std::cout <<
"Error: Method not known: " << ties << std::endl;
1035 Approxin(grin, iKind, ylow, yhigh, rule, iTies);
1049 if (xout == 0)
x =
fMinX + i*delta;
1071 if(
v <
x[i])
return ylow;
1072 if(
v >
x[j])
return yhigh;
1076 Int_t ij = (i + j)/2;
1077 if(
v <
x[ij]) j = ij;
1082 if(
v ==
x[j])
return y[j];
1083 if(
v ==
x[i])
return y[i];
1086 return y[i] + (
y[j] -
y[i]) * ((
v -
x[i])/(
x[j] -
x[i]));
1088 return y[i] * (1-
f) +
y[j] *
f;
1100 if (
x <
y)
return -1;
1101 if (
x >
y)
return 1;
1115 for (pL = 0, pR =
n - 1; pL < pR; ) {
1117 for(i = pL, j = pR; i <= j;) {
1120 if (i <= j) {
w =
x[i];
x[i++] =
x[j];
x[j--] =
w; }
1142 for (
Int_t i=0;i<
n;i++) {
1144 rank[
index[i]] = i-1;
1147 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.