Go to the documentation of this file.00001 #include "CondFormats/JetMETObjects/interface/SimpleJetCorrectionUncertainty.h"
00002 #include "CondFormats/JetMETObjects/interface/JetCorrectorParameters.h"
00003 #include "FWCore/Utilities/interface/Exception.h"
00004 #include <vector>
00005 #include <string>
00006
00008 SimpleJetCorrectionUncertainty::SimpleJetCorrectionUncertainty ()
00009 {
00010 mParameters = new JetCorrectorParameters();
00011 }
00013 SimpleJetCorrectionUncertainty::SimpleJetCorrectionUncertainty(const std::string& fDataFile)
00014 {
00015 mParameters = new JetCorrectorParameters(fDataFile);
00016 }
00018 SimpleJetCorrectionUncertainty::SimpleJetCorrectionUncertainty(const JetCorrectorParameters& fParameters)
00019 {
00020 mParameters = new JetCorrectorParameters(fParameters);
00021 }
00023 SimpleJetCorrectionUncertainty::~SimpleJetCorrectionUncertainty ()
00024 {
00025 delete mParameters;
00026 }
00028 float SimpleJetCorrectionUncertainty::uncertainty(std::vector<float> fX, float fY, bool fDirection) const
00029 {
00030 float result = 1.;
00031 int bin = mParameters->binIndex(fX);
00032 if (bin<0)
00033 throw cms::Exception("SimpleJetCorrectionUncertainty")<<" bin variables out of range";
00034 result = uncertaintyBin((unsigned)bin,fY,fDirection);
00035 return result;
00036 }
00038 float SimpleJetCorrectionUncertainty::uncertaintyBin(unsigned fBin, float fY, bool fDirection) const
00039 {
00040 if (fBin >= mParameters->size())
00041 throw cms::Exception("SimpleJetCorrectionUncertainty")<<" wrong bin: "<<fBin<<": only "<<mParameters->size()<<" are available";
00042 const std::vector<float>& p = mParameters->record(fBin).parameters();
00043 if ((p.size() % 3) != 0)
00044 throw cms::Exception ("SimpleJetCorrectionUncertainty")<<"wrong # of parameters: multiple of 3 expected, "<<p.size()<< " got";
00045 std::vector<float> yGrid,value;
00046 unsigned int N = p.size()/3;
00047 float result = -1.0;
00048 for(unsigned i=0;i<N;i++)
00049 {
00050 unsigned ind = 3*i;
00051 yGrid.push_back(p[ind]);
00052 if (fDirection)
00053 value.push_back(p[ind+1]);
00054 else
00055 value.push_back(p[ind+2]);
00056 }
00057 if (fY <= yGrid[0])
00058 result = value[0];
00059 else if (fY >= yGrid[N-1])
00060 result = value[N-1];
00061 else
00062 {
00063 int bin = findBin(yGrid,fY);
00064 float vx[2],vy[2];
00065 for(int i=0;i<2;i++)
00066 {
00067 vx[i] = yGrid[bin+i];
00068 vy[i] = value[bin+i];
00069 }
00070 result = linearInterpolation(fY,vx,vy);
00071 }
00072 return result;
00073 }
00075 float SimpleJetCorrectionUncertainty::linearInterpolation(float fZ, const float fX[2], const float fY[2]) const
00076 {
00077
00078
00079 float r = 0;
00080 if (fX[0] == fX[1])
00081 {
00082 if (fY[0] == fY[1])
00083 r = fY[0];
00084 else
00085 throw cms::Exception("SimpleJetCorrectionUncertainty")<<" interpolation error";
00086 }
00087 else
00088 {
00089 float a = (fY[1]-fY[0])/(fX[1]-fX[0]);
00090 float b = (fY[0]*fX[1]-fY[1]*fX[0])/(fX[1]-fX[0]);
00091 r = a*fZ+b;
00092 }
00093 return r;
00094 }
00096 int SimpleJetCorrectionUncertainty::findBin(std::vector<float> v, float x) const
00097 {
00098 int i;
00099 int n = v.size()-1;
00100 if (n<=0) return -1;
00101 if (x<v[0] || x>=v[n])
00102 return -1;
00103 for(i=0;i<n;i++)
00104 {
00105 if (x>=v[i] && x<v[i+1])
00106 return i;
00107 }
00108 return 0;
00109 }
00110
00111