6 #include "GaudiKernel/MsgStream.h"
8 #include "gsl/gsl_statistics.h"
9 #include "gsl/gsl_fit.h"
17 std::ostringstream oss;
18 oss <<
"Mean=" <<
fMean
21 <<
", Chi2=" <<
fChi2;
28 gsl_fit_linear_est(fX, fIntercept, fSlope, fCov[0][0], fCov[0][1], fCov[1][1], &fY, &fYerr);
33 std::ostringstream oss;
34 oss <<
"Y=" << fIntercept <<
"+X*" << fSlope
36 <<
", Cov=[[" << fCov[0][0] <<
"," << fCov[0][1] <<
"],["
37 << fCov[1][0] <<
"," << fCov[1][1] <<
"]]"
38 <<
", Chi2=" << fChi2;
46 double *
y =
new double[points.size()];
47 double *
w =
new double[points.size()];
48 for (
unsigned iPt = 0; iPt < points.size(); iPt++)
51 if (!points[iPt]->bExclude)
53 y[
stats.n] = points[iPt]->fY;
54 w[
stats.n] = points[iPt]->fW;
58 if (
stats.n == 0)
goto done;
61 if (
stats.n == 1)
goto done;
65 double fDiff =
y[
i] -
stats.fMean;
66 stats.fChi2 +=
w[
i] * fDiff * fDiff;
76 double *
y =
new double[points.size()];
77 double *
w =
new double[points.size()];
81 for (
unsigned iPt = 0; iPt < points.size(); iPt++)
84 if (!points[iPt]->bExclude)
86 y[
stats.n] = points[iPt]->fY;
87 w[
stats.n] = points[iPt]->fW;
92 if (
stats.n == 0)
goto done;
94 if (
stats.n == 1)
goto done;
97 int i = 0, iPtMax = 0;
98 for (
unsigned iPt = 0; iPt < points.size(); iPt++)
100 if (!points[iPt]->bExclude)
102 double fDiff =
y[
i] -
stats.fMean;
103 points[iPt]->fChi2 =
w[
i] * fDiff * fDiff;
104 stats.fChi2 += points[iPt]->fChi2;
105 if (fMaxChi2 < points[iPt]->fChi2)
107 fMaxChi2 = points[iPt]->fChi2;
115 <<
", chi2=" << points[iPt]->fChi2
123 if (fMaxChi2 < fExclChi2 ||
stats.n <= 2)
125 points[iPtMax]->bExclude =
true;
135 double *
x =
new double[points.size()];
136 double *
y =
new double[points.size()];
137 double *
w =
new double[points.size()];
141 for (
unsigned iPt = 0; iPt < points.size(); iPt++)
143 if (!points[iPt]->bExclude)
145 x[
stats.n] = points[iPt]->fX;
146 y[
stats.n] = points[iPt]->fY;
147 w[
stats.n] = points[iPt]->fW;
151 if (
stats.n < 2)
goto done;
153 gsl_fit_wlinear(
x, 1,
164 double fY, fYerr, fMaxChi2 = 0;
165 int i = 0, iPtMax = 0;
166 for (
unsigned iPt = 0; iPt < points.size(); iPt++)
168 if (!points[iPt]->bExclude)
171 double fDiff =
y[
i] - fY;
172 points[iPt]->fChi2 =
w[
i] * fDiff * fDiff;
173 if (fMaxChi2 < points[iPt]->fChi2)
175 fMaxChi2 = points[iPt]->fChi2;
185 <<
", chi2=" << points[iPt]->fChi2
191 if (fMaxChi2 < fExclChi2 ||
stats.n <= 2)
193 points[iPtMax]->bExclude =
true;