CMS 3D CMS Logo

LinearFitErrorsIn2Coord.cc
Go to the documentation of this file.
3 #include <cmath>
4 
6  const std::vector<float> & x, const std::vector<float> & y, int ndat,
7  const std::vector<float> & sigx, const std::vector<float> & sigy) const
8 {
9 
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 
32 
34  const std::vector<float> & x, const std::vector<float> & y, int ndat,
35  const std::vector<float> & sigx, const std::vector<float> & sigy) const
36 {
37 
38  float fs = slope(x, y, ndat, sigx, sigy);
39  float fi = 0;
40  float sumWi = 0;
41  for (int i = 0; i != ndat; i++) {
42  float wi = 1./(sigy[i] + fs*fs*sigx[i]);
43  fi += wi*(y[i] - fs*x[i]);
44  sumWi += wi;
45  }
46 
47  return fi / sumWi;
48 
49 }
50 
51 
52 float
53 LinearFitErrorsIn2Coord::variance(const std::vector<float> & x, int ndat) const
54 {
55  double m1 = 0., m2 = 0.;
56  for (int i = 0; i != ndat; i++) {
57  m1 += x[i];
58  m2 += x[i]*x[i];
59  }
60  m1 /= ndat;
61  m2 /= ndat;
62 
63  return float(m2 - m1*m1);
64 
65 }
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:18
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