CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CondFormats/JetMETObjects/src/SimpleJetCorrectionUncertainty.cc

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)// true = UP
00053         value.push_back(p[ind+1]);
00054       else // false = DOWN
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   // Linear interpolation through the points (x[i],y[i]). First find the line that
00078   // is defined by the points and then calculate the y(z).
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