79 for (i=0;i<
fNin;i++) {
87 for (i=0;i<
fNin;i++) {
116 if (opt.
Contains(
"normal")) kernel = 2;
122 if (xout ==
nullptr) {
175 while ((imin <
n) && (
x[imin] < xp[0] - cutoff))
183 for (
Int_t i=imin;i<
n;i++) {
184 if (
x[i] < x0 - cutoff) imin = i;
185 if (
x[i] > x0 + cutoff)
break;
187 if (kernel == 1)
w = 1;
257 Int_t i, iiter, j, last, m1, m2, nleft, nright, ns;
258 Double_t alpha,
c1, c9, cmad, cut, d1, d2, denom,
r;
279 while (iiter <= iter+1) {
288 d1 =
x[i] -
x[nleft];
289 d2 =
x[nright+1] -
x[i];
302 Lowest(&
x[1], &
y[1],
n,
x[i], ys[i], nleft, nright,
303 res, iterg1, rw, ok);
304 if (!ok) ys[i] =
y[i];
308 denom =
x[i]-
x[last];
311 for(j = last+1; j < i; j++) {
312 alpha = (
x[j]-
x[last])/denom;
313 ys[j] = alpha*ys[i] + (1.-alpha)*ys[last];
321 cut =
x[last] + delta;
322 for (i = last+1; i <=
n; i++) {
325 if (
x[i] ==
x[last]) {
337 res[i] =
y[i+1] - ys[i+1];
352 cmad = 3.*(rw[m1]+rw[m2]);
359 for(i=0 ; i<
n ; i++) {
364 rw[i] = (1.-(
r/cmad)*(
r/cmad))*(1.-(
r/cmad)*(
r/cmad));
406 w[j] = (1.-
d)*(1.-
d)*(1.-
d);
411 }
else if (
x[j] > xs)
423 for(j=nleft ; j<=nrt ; j++)
428 for(j=nleft ; j<=nrt ; j++)
432 for(j=nleft ; j<=nrt ; j++)
433 c +=
w[j]*(
x[j]-
a)*(
x[j]-
a);
437 for(j=nleft; j <= nrt; j++)
438 w[j] *= (
b*(
x[j]-
a) + 1.);
442 for(j=nleft; j <= nrt; j++)
489 if (span < 0 || span > 1) {
490 std::cout <<
"Error: Span must be between 0 and 1" << std::endl;
501 if (fMinX < 0 || fMaxX > 1) {
502 std::cout <<
"Error: x must be between 0 and 1 for periodic smooth" << std::endl;
511 for (i=0; i<
fNout; i++) {
517 for (i=0; i<
fNin; i++) {
518 if (
w ==
nullptr) weight[i] = 1;
519 else weight[i] =
w[i];
525 for (i=0; i<nTmp; i++) {
590 Double_t spans[3] = { 0.05, 0.2, 0.5 };
613 if (sw > 0.0)
a = sy / sw;
614 for (j=1;j<=
n;++j) smo[j] =
a;
621 while (scale <= 0.0) {
631 if (iper == 2 && (
x[1] < 0.0 ||
x[
n] > 1.0)) {
634 if (jper < 1 || jper > 2) {
639 &smo[1], &sc[sc_offset]);
644 for (i = 1; i <= 3; ++i) {
645 BDRsmooth(
n, &
x[1], &
y[1], &
w[1], spans[i - 1], jper, vsmlsq,
646 &sc[((i<<1)-1)*
n + 1], &sc[
n*7 + 1]);
647 BDRsmooth(
n, &
x[1], &sc[
n*7 + 1], &
w[1], spans[1], -jper, vsmlsq,
648 &sc[(i<<1)*
n + 1], &
h[1]);
651 for (j=1; j<=
n; ++j) {
653 for (i=1; i<=3; ++i) {
654 if (sc[j + (i<<1)*
n] < resmin) {
655 resmin = sc[j + (i<<1)*
n];
656 sc[j +
n*7] = spans[i-1];
660 if (alpha>0.0 && alpha<=10.0 && resmin<sc[j +
n*6] && resmin>0.0) {
668 BDRsmooth(
n, &
x[1], &sc[
n*7 + 1], &
w[1], spans[1], -jper, vsmlsq,
669 &sc[(
n<<1) + 1], &
h[1]);
671 for (j=1; j<=
n; ++j) {
672 if (sc[j + (
n<<1)] <= spans[0]) {
673 sc[j + (
n<<1)] = spans[0];
675 if (sc[j + (
n<<1)] >= spans[2]) {
676 sc[j + (
n<<1)] = spans[2];
678 f = sc[j + (
n<<1)] - spans[1];
680 f = -
f / (spans[1] - spans[0]);
681 sc[j + (
n<<2)] = (1.0 -
f) * sc[j +
n*3] +
f * sc[j +
n];
683 f /= spans[2] - spans[1];
684 sc[j + (
n<<2)] = (1.0 -
f) * sc[j +
n*3] +
f * sc[j +
n*5];
688 BDRsmooth(
n, &
x[1], &sc[(
n<<2) + 1], &
w[1], spans[0], -jper, vsmlsq,
704 Int_t i, j, j0, in, out, it, jper, ibw;
724 ibw = (
Int_t)(span * 0.5 *
n + 0.5);
730 for (i=1; i<=it; ++i) {
744 xm = (fbo * xm + wt * xti) / fbw;
745 ym = (fbo * ym + wt *
y[j]) / fbw;
749 tmp = fbw * wt * (xti - xm) / fbo;
751 var += tmp * (xti - xm);
752 cvar += tmp * (
y[j] - ym);
755 for (j=1; j<=
n; ++j) {
758 if (!(jper != 2 && (out < 1 || in >
n))) {
777 tmp = fbo * wt * (xto - xm) / fbw;
779 var -= tmp * (xto - xm);
780 cvar -= tmp * (
y[out] - ym);
782 xm = (fbo * xm - wt * xto) / fbw;
783 ym = (fbo * ym - wt *
y[out]) / fbw;
789 xm = (fbo * xm + wt * xti) / fbw;
790 ym = (fbo * ym + wt *
y[in]) / fbw;
794 tmp = fbw * wt * (xti - xm) / fbo;
796 var += tmp * (xti - xm);
797 cvar += tmp * (
y[in] - ym);
804 smo[j] =
a * (
x[j] - xm) + ym;
838 if (
x[j + 1] >
x[j]) {
852 for (i=j0; i<=j; ++i) {
875 for (i=0;i<
fNin;i++) {
892 for (i=1;i<
fNin+1;i++) {
894 vMin = vMean = vMax = yin[
index[i-1]];
896 vMean += yin[
index[i]];
897 vMax = (vMax < yin[
index[i]]) ? yin[
index[i]] : vMax;
898 vMin = (vMin > yin[
index[i]]) ? yin[
index[i]] : vMin;
905 if (ndup == 1) {
y[k++] = yin[
index[i-1]];}
925 for (i=0;i<
fNin;i++) {
1010 if (opt.
Contains(
"linear")) iKind = 1;
1011 else if (opt.
Contains(
"constant")) iKind = 2;
1013 if (f < 0 || f > 1) {
1014 std::cout <<
"Error: Invalid f value" << std::endl;
1030 std::cout <<
"Error: Method not known: " << ties << std::endl;
1037 Approxin(grin, iKind, ylow, yhigh, rule, iTies);
1042 if (xout ==
nullptr) {
1051 if (xout ==
nullptr)
x =
fMinX + i*delta;
1057 if (xout ==
nullptr)
x =
fMaxX + delta*(i + 1 -
fNout);
1079 if(
v <
x[i])
return ylow;
1080 if(
v >
x[j])
return yhigh;
1084 Int_t ij = (i + j)/2;
1085 if(
v <
x[ij]) j = ij;
1090 if(
v ==
x[j])
return y[j];
1091 if(
v ==
x[i])
return y[i];
1094 return y[i] + (
y[j] -
y[i]) * ((
v -
x[i])/(
x[j] -
x[i]));
1096 return y[i] * (1-
f) +
y[j] *
f;
1108 if (
x <
y)
return -1;
1109 if (
x >
y)
return 1;
1123 for (pL = 0, pR =
n - 1; pL < pR; ) {
1125 for(i = pL, j = pR; i <= j;) {
1128 if (i <= j) {
w =
x[i];
x[i++] =
x[j];
x[j--] =
w; }
1150 for (
Int_t i=0;i<
n;i++) {
1152 rank[
index[i]] = i-1;
1155 rank[
index[i]] = i-k;
int Int_t
Signed integer 4 bytes (int)
const char Option_t
Option string (const char)
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.
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.