CMS 3D CMS Logo

/data/git/CMSSW_5_3_11_patch5/src/MuonAnalysis/MomentumScaleCalibration/interface/SigmaPtDiff.h

Go to the documentation of this file.
00001 #ifndef SigmaPtDiff_h
00002 #define SigmaPtDiff_h
00003 
00004 class SigmaPt
00005 {
00006  public:
00007   SigmaPt( const std::vector<double> & parameters_,
00008            const std::vector<double> & errors_ )
00009     {
00010       setParErr(parameters_, errors_);
00011     }
00012 
00013   SigmaPt() {};
00014   
00015   void setParErr( const std::vector<double> & parameters,
00016                   const std::vector<double> & errors )
00017   {
00018     b_0 = parameters[0];
00019     b_1 = parameters[5];
00020     b_2 = parameters[1];
00021     b_3 = parameters[7];
00022     b_4 = parameters[8];
00023     sb_0 = errors[0];
00024     sb_1 = errors[5];
00025     sb_2 = errors[1];
00026     sb_3 = errors[7];
00027     sb_4 = errors[8];
00028     c = b_2 + b_3*(b_0 - b_4)*(b_0 - b_4) - b_1*b_0*b_0;
00029   }
00030 
00031   double operator()(const double & eta)
00032   {
00033     if( fabs(eta) <= b_0 ) {
00034       return( c + b_1*eta*eta );
00035     }
00036     return( b_2 + b_3*(fabs(eta) - b_4)*(fabs(eta) - b_4) );
00037   }
00038   double sigma(const double & eta)
00039   {
00040     if( fabs(eta) <= b_0 ) {
00041       return sqrt( (eta*eta - b_0*b_0)*(eta*eta - b_0*b_0)*sb_1*sb_1 +
00042                    sb_2*sb_2 +
00043                    pow(b_0 - b_4, 4)*sb_3*sb_3 +
00044                    pow(-2*b_3*pow(b_0-b_4,2), 2)*sb_4*sb_4 +
00045                    pow(2*b_3*(b_0 - b_4) - 2*b_1*b_0, 2)*sb_0*sb_0 );
00046     }
00047     return sqrt( sb_2*sb_2 +
00048                  pow(fabs(eta) - b_4, 4)*sb_3*sb_3 +
00049                  pow(-2*b_3*pow(fabs(eta)-b_4,2), 2)*sb_4*sb_4 );
00050   }
00051 
00052  protected:
00053   double b_0;
00054   double b_1;
00055   double b_2;
00056   double b_3;
00057   double b_4;
00058   double c;
00059 
00060   double sb_0;
00061   double sb_1;
00062   double sb_2;
00063   double sb_3;
00064   double sb_4;
00065 };
00066 
00068 class SigmaPtDiff
00069 {
00070  public:
00071   SigmaPtDiff()
00072   {
00073     std::vector<double> parameters;
00074     std::vector<double> errors;
00075     parameters.push_back(1.66);
00076     parameters.push_back(0.021);
00077     parameters.push_back(0.);
00078     parameters.push_back(0.);
00079     parameters.push_back(0.);
00080     parameters.push_back(0.0058);
00081     parameters.push_back(0.);
00082     parameters.push_back(0.03);
00083     parameters.push_back(1.8);
00084     parameters.push_back(0.);
00085     parameters.push_back(0.);
00086     parameters.push_back(0.);
00087     parameters.push_back(0.);
00088     parameters.push_back(0.);
00089     parameters.push_back(0.);
00090     errors.push_back(0.09);
00091     errors.push_back(0.002);
00092     errors.push_back(0.);
00093     errors.push_back(0.);
00094     errors.push_back(0.);
00095     errors.push_back(0.0009);
00096     errors.push_back(0.);
00097     errors.push_back(0.03);
00098     errors.push_back(0.3);
00099     errors.push_back(0.);
00100     errors.push_back(0.);
00101     errors.push_back(0.);
00102     errors.push_back(0.);
00103     errors.push_back(0.);
00104     errors.push_back(0.);
00105 
00106     sigmaPt.setParErr( parameters, errors );
00107   }
00108   double etaByPoints(const double & eta)
00109   {
00110     if(      eta <= -2.2 ) return 0.0233989;
00111     else if( eta <= -2.0 ) return 0.0197057;
00112     else if( eta <= -1.8 ) return 0.014693;
00113     else if( eta <= -1.6 ) return 0.0146727;
00114     else if( eta <= -1.4 ) return 0.0141323;
00115     else if( eta <= -1.2 ) return 0.0159712;
00116     else if( eta <= -1.0 ) return 0.0117224;
00117     else if( eta <= -0.8 ) return 0.010726;
00118     else if( eta <= -0.6 ) return 0.0104777;
00119     else if( eta <= -0.4 ) return 0.00814458;
00120     else if( eta <= -0.2 ) return 0.00632501;
00121     else if( eta <=  0.0 ) return 0.00644172;
00122     else if( eta <=  0.2 ) return 0.00772645;
00123     else if( eta <=  0.4 ) return 0.010103;
00124     else if( eta <=  0.6 ) return 0.0099275;
00125     else if( eta <=  0.8 ) return 0.0100309;
00126     else if( eta <=  1.0 ) return 0.0125116;
00127     else if( eta <=  1.2 ) return 0.0147211;
00128     else if( eta <=  1.4 ) return 0.0151623;
00129     else if( eta <=  1.6 ) return 0.015259;
00130     else if( eta <=  1.8 ) return 0.014499;
00131     else if( eta <=  2.0 ) return 0.0165215;
00132     else if( eta <=  2.2 ) return 0.0212348;
00133     return 0.0227285;
00134   }
00135   // double squaredDiff(const double & eta, SigmaPt & sigmaPt)
00136   double squaredDiff(const double & eta)
00137   {
00138     double sigmaPtPlus = sigmaPt(eta) + sigmaPt.sigma(eta);
00139     double sigmaPtMinus = sigmaPt(eta) - sigmaPt.sigma(eta);
00140     if( fabs(sigmaPtPlus*sigmaPtPlus - etaByPoints(eta)*etaByPoints(eta)) > fabs(sigmaPtMinus*sigmaPtMinus - etaByPoints(eta)*etaByPoints(eta)) ) {
00141       return( fabs(sigmaPtPlus*sigmaPtPlus - etaByPoints(eta)*etaByPoints(eta)) );
00142     }
00143     return( fabs(sigmaPtMinus*sigmaPtMinus - etaByPoints(eta)*etaByPoints(eta)) );
00144   }
00145   SigmaPt sigmaPt;
00146 };
00147 
00148 #endif