CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SimpleJetCorrectionUncertainty.cc
Go to the documentation of this file.
4 #include <vector>
5 #include <string>
6 
9 {
11 }
14 {
15  mParameters = new JetCorrectorParameters(fDataFile);
16 }
19 {
20  mParameters = new JetCorrectorParameters(fParameters);
21 }
24 {
25  delete mParameters;
26 }
28 float SimpleJetCorrectionUncertainty::uncertainty(const std::vector<float>& fX, float fY, bool fDirection) const
29 {
30  float result = 1.;
31  int bin = mParameters->binIndex(fX);
32  if (bin<0) {
33  edm::LogError("SimpleJetCorrectionUncertainty")<<" bin variables out of range";
34  result = -999.0;
35  } else
36  result = uncertaintyBin((unsigned)bin,fY,fDirection);
37  return result;
38 }
40 float SimpleJetCorrectionUncertainty::uncertaintyBin(unsigned fBin, float fY, bool fDirection) const
41 {
42  if (fBin >= mParameters->size()) {
43  edm::LogError("SimpleJetCorrectionUncertainty")<<" wrong bin: "<<fBin<<": only "<<mParameters->size()<<" are available";
44  return -999.0;
45  }
46  const std::vector<float>& p = mParameters->record(fBin).parameters();
47  if ((p.size() % 3) != 0)
48  throw cms::Exception ("SimpleJetCorrectionUncertainty")<<"wrong # of parameters: multiple of 3 expected, "<<p.size()<< " got";
49  std::vector<float> yGrid,value;
50  unsigned int N = p.size()/3;
51  float result = -1.0;
52  for(unsigned i=0;i<N;i++)
53  {
54  unsigned ind = 3*i;
55  yGrid.push_back(p[ind]);
56  if (fDirection)// true = UP
57  value.push_back(p[ind+1]);
58  else // false = DOWN
59  value.push_back(p[ind+2]);
60  }
61  if (fY <= yGrid[0])
62  result = value[0];
63  else if (fY >= yGrid[N-1])
64  result = value[N-1];
65  else
66  {
67  int bin = findBin(yGrid,fY);
68  float vx[2],vy[2];
69  for(int i=0;i<2;i++)
70  {
71  vx[i] = yGrid[bin+i];
72  vy[i] = value[bin+i];
73  }
74  result = linearInterpolation(fY,vx,vy);
75  }
76  return result;
77 }
79 float SimpleJetCorrectionUncertainty::linearInterpolation(float fZ, const float fX[2], const float fY[2]) const
80 {
81  // Linear interpolation through the points (x[i],y[i]). First find the line that
82  // is defined by the points and then calculate the y(z).
83  float r = 0;
84  if (fX[0] == fX[1])
85  {
86  if (fY[0] == fY[1])
87  r = fY[0];
88  else {
89  edm::LogError("SimpleJetCorrectionUncertainty")<<" interpolation error";
90  return -999.0;
91  }
92  }
93  else
94  {
95  float a = (fY[1]-fY[0])/(fX[1]-fX[0]);
96  float b = (fY[0]*fX[1]-fY[1]*fX[0])/(fX[1]-fX[0]);
97  r = a*fZ+b;
98  }
99  return r;
100 }
102 int SimpleJetCorrectionUncertainty::findBin(const std::vector<float>& v, float x) const
103 {
104  int i;
105  int n = v.size()-1;
106  if (n<=0) return -1;
107  if (x<v[0] || x>=v[n])
108  return -1;
109  for(i=0;i<n;i++)
110  {
111  if (x>=v[i] && x<v[i+1])
112  return i;
113  }
114  return 0;
115 }
116 
117 
int i
Definition: DBlmapReader.cc:9
float uncertaintyBin(unsigned fBin, float fY, bool fDirection) const
std::vector< float > parameters() const
const Record & record(unsigned fBin) const
float linearInterpolation(float fZ, const float fX[2], const float fY[2]) const
T x() const
Cartesian x coordinate.
int findBin(const std::vector< float > &v, float x) const
int binIndex(const std::vector< float > &fX) const
tuple result
Definition: query.py:137
#define N
Definition: blowfish.cc:9
float uncertainty(const std::vector< float > &fX, float fY, bool fDirection) const
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121