CMS 3D CMS Logo

LinearFit.h
Go to the documentation of this file.
1 #ifndef LinearFit_H
2 #define LinearFit_H
3 
4 #include <vector>
5 
9 class LinearFit {
10 
11 public:
12 
18  void fit(const std::vector<float> & x, const std::vector<float> & y, int ndat,
19  const std::vector<float> & sigy, float& slope, float& intercept,
20  float& covss, float& covii, float& covsi) const;
21 
22 };
23 
24 // template version, no std (error alrady double...)
25 template<typename T>
26 void linearFit( T const * __restrict__ x, T const * __restrict__ y, int ndat,
27  T const * __restrict__ sigy2,
28  T & slope, T & intercept,
29  T & covss, T & covii, T & covsi) {
30  T g1 = 0, g2 = 0;
31  T s11 = 0, s12 = 0, s22 = 0;
32  for (int i = 0; i != ndat; i++) {
33  T sy2 = T(1)/sigy2[i];
34  g1 += y[i] *sy2;
35  g2 += x[i]*y[i] * sy2;
36  s11 += sy2;
37  s12 += x[i] * sy2;
38  s22 += x[i]*x[i] * sy2;
39  }
40 
41  T d = T(1)/(s11*s22 - s12*s12);
42  intercept = (g1*s22 - g2*s12) * d;
43  slope = (g2*s11 - g1*s12) * d;
44 
45  covii = s22 * d;
46  covss = s11 * d;
47  covsi = -s12 * d;
48 }
49 
50 
51 #endif
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
static const double slope[3]
void linearFit(T const *__restrict__ x, T const *__restrict__ y, int ndat, T const *__restrict__ sigy2, T &slope, T &intercept, T &covss, T &covii, T &covsi)
Definition: LinearFit.h:26
long double T