CMS 3D CMS Logo

LinearFitErrorsIn2Coord.cc
Go to the documentation of this file.
3 #include <cmath>
4 
5 float LinearFitErrorsIn2Coord::slope(const std::vector<float>& x,
6  const std::vector<float>& y,
7  int ndat,
8  const std::vector<float>& sigx,
9  const std::vector<float>& sigy) const {
10  // scale y and sigy, compute scaled errors
11  float scale = sqrt(variance(x, ndat) / variance(y, ndat));
12  std::vector<float> yScaled = y;
13  std::vector<float> sigyScaled = sigy;
14  std::vector<float> sig(ndat);
15  for (int i = 0; i != ndat; i++) {
16  yScaled[i] *= scale;
17  sigyScaled[i] *= scale;
18  sig[i] = sqrt(sigx[i] * sigx[i] + sigyScaled[i] * sigyScaled[i]);
19  }
20 
21  // usual linear fit
22  LinearFit lf;
23  float fs, fi, covss, covii, covsi;
24  lf.fit(x, yScaled, ndat, sig, fs, fi, covss, covii, covsi);
25 
26  // unscale result
27  fs /= scale;
28  return fs;
29 }
30 
31 float LinearFitErrorsIn2Coord::intercept(const std::vector<float>& x,
32  const std::vector<float>& y,
33  int ndat,
34  const std::vector<float>& sigx,
35  const std::vector<float>& sigy) const {
36  float fs = slope(x, y, ndat, sigx, sigy);
37  float fi = 0;
38  float sumWi = 0;
39  for (int i = 0; i != ndat; i++) {
40  float wi = 1. / (sigy[i] + fs * fs * sigx[i]);
41  fi += wi * (y[i] - fs * x[i]);
42  sumWi += wi;
43  }
44 
45  return fi / sumWi;
46 }
47 
48 float LinearFitErrorsIn2Coord::variance(const std::vector<float>& x, int ndat) const {
49  double m1 = 0., m2 = 0.;
50  for (int i = 0; i != ndat; i++) {
51  m1 += x[i];
52  m2 += x[i] * x[i];
53  }
54  m1 /= ndat;
55  m2 /= ndat;
56 
57  return float(m2 - m1 * m1);
58 }
void fit(const std::vector< float > &x, const std::vector< float > &y, int ndat, const std::vector< float > &sigy, float &slope, float &intercept, float &covss, float &covii, float &covsi) const
Definition: LinearFit.cc:3
float slope(const std::vector< float > &x, const std::vector< float > &y, int ndat, const std::vector< float > &sigx, const std::vector< float > &sigy) const
T sqrt(T t)
Definition: SSEVec.h:19
float variance(const std::vector< float > &x, int ndat) const
float intercept(const std::vector< float > &x, const std::vector< float > &y, int ndat, const std::vector< float > &sigx, const std::vector< float > &sigy) const