86 for (i=0;i<
fNin;i++) {
94 for (i=0;i<
fNin;i++) {
123 if (opt.
Contains(
"normal")) kernel = 2;
134 index =
new Int_t[nout];
147 if (index) {
delete [] index; index = 0;}
173 while ((x[imin] < xp[0] - cutoff) && (imin < n)) imin++;
180 for (
Int_t i=imin;i<
n;i++) {
181 if (x[i] < x0 - cutoff) imin = i;
182 if (x[i] > x0 + cutoff)
break;
184 if (kernel == 1) w = 1;
253 Int_t i, iiter, j, last, m1, m2, nleft, nright, ns;
254 Double_t alpha,
c1, c9, cmad, cut, d1, d2, denom,
r;
275 while (iiter <= iter+1) {
284 d1 = x[i] - x[nleft];
285 d2 = x[nright+1] - x[i];
298 Lowest(&x[1], &y[1], n, x[i], ys[i], nleft, nright,
299 res, iterg1, rw, ok);
300 if (!ok) ys[i] = y[i];
304 denom = x[i]-x[last];
307 for(j = last+1; j < i; j++) {
308 alpha = (x[j]-x[last])/denom;
309 ys[j] = alpha*ys[i] + (1.-alpha)*ys[last];
317 cut = x[last] + delta;
318 for (i = last+1; i <=
n; i++) {
321 if (x[i] == x[last]) {
333 res[i] = y[i+1] - ys[i+1];
348 cmad = 3.*(rw[m1]+rw[m2]);
355 for(i=0 ; i<
n ; i++) {
360 rw[i] = (1.-(r/cmad)*(r/cmad))*(1.-(r/cmad)*(r/cmad));
401 d = (r/
h)*(r/h)*(r/
h);
402 w[j] = (1.-
d)*(1.- d)*(1.-
d);
407 }
else if (x[j] > xs)
419 for(j=nleft ; j<=nrt ; j++)
424 for(j=nleft ; j<=nrt ; j++)
428 for(j=nleft ; j<=nrt ; j++)
429 c += w[j]*(x[j]-a)*(x[j]-
a);
433 for(j=nleft; j <= nrt; j++)
434 w[j] *= (b*(x[j]-a) + 1.);
438 for(j=nleft; j <= nrt; j++)
484 if (span < 0 || span > 1) {
485 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 == 0) weight[i] = 1;
512 else weight[i] = w[i];
516 Int_t nTmp = (fNin+1)*8;
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) {
631 BDRsmooth(n, &x[1], &y[1], &w[1], span, jper, vsmlsq,
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) {
657 sc[j + n*7] += (spans[2] - sc[j + n*7]) *
TMath::Power(d1, d2);
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]];
888 while ((i < fNin) && (rank[index[i]] == rank[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;
897 x[k] = xin[index[i-1]];
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);
1044 if (xout == 0) 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++) {
1138 if ((i > 0) && (a[index[i]] == a[index[i-1]])) {
1139 rank[index[i]] = i-1;
1142 rank[index[i]] = i-k;
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).
TGraph * SmoothKern(TGraph *grin, Option_t *option="normal", Double_t bandwidth=0.5, Int_t nout=100, Double_t *xout=0)
Smooth data with Kernel smoother.
virtual ~TGraphSmooth()
GraphSmooth destructor.
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.
Short_t Min(Short_t a, Short_t b)
void ToLower()
Change string to lower-case.
A helper class to smooth TGraph.
TGraph * SmoothSuper(TGraph *grin, Option_t *option="", Double_t bass=0, Double_t span=0, Bool_t isPeriodic=kFALSE, Double_t *w=0)
Smooth data with Super smoother.
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.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
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.
The TNamed class is the base class for all named ROOT classes.
std::map< std::string, std::string >::const_iterator iter
void Sort(Index n, const Element *a, Index *index, Bool_t down=kTRUE)
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.
static Int_t Rcmp(Double_t x, Double_t y)
Static function if (ISNAN(x)) return 1; if (ISNAN(y)) return -1;.
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 void Rank(Int_t n, Double_t *a, Int_t *index, Int_t *rank, Bool_t down=kTRUE)
static function
TGraph * Approx(TGraph *grin, Option_t *option="linear", Int_t nout=50, Double_t *xout=0, Double_t yleft=0, Double_t yright=0, Int_t rule=0, Double_t f=0, Option_t *ties="mean")
Approximate data points.
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
void Smoothin(TGraph *grin)
Sort input data points.
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...
Short_t Max(Short_t a, Short_t b)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
A Graph is a graphics object made of two arrays X and Y with npoints each.
A TGraphErrors is a TGraph with error bars.
Double_t Sqrt(Double_t x)
virtual void Set(Int_t n)
Set number of points in the graph Existing coordinates are preserved New coordinates above fNpoints a...
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.
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.