Go to the documentation of this file.00001 #ifndef ElectroWeakAnalysis_ZMuMu_ZMuMuBackNorm_h
00002 #define ElectroWeakAnalysis_ZMuMu_ZMuMuBackNorm_h
00003
00004 #include "PhysicsTools/Utilities/interface/Exponential.h"
00005 #include "PhysicsTools/Utilities/interface/Polynomial.h"
00006 #include <boost/shared_ptr.hpp>
00007 #include <cmath>
00008
00009 namespace function {
00010 class ZMuMuBackNorm {
00011 public:
00012 enum{ arguments = 2 };
00013 enum{ parameters = 3 };
00014 ZMuMuBackNorm(boost::shared_ptr<double> l, boost::shared_ptr<double> a, boost::shared_ptr<double> b):
00015 lambda(l), a1(a), a2(b),
00016 expo_(-(*l)),
00017 pol_(-pow(*l, 2)- (*l) * (*a) - 2 * (*b), -pow(*l, 2) * (*a) - 2 * (*l) * (*b), -pow(*l, 2) * (*b)) {}
00018 ZMuMuBackNorm(double l, double a, double b):
00019 lambda(new double(l)), a1(new double(a)), a2(new double(b)),
00020 expo_(-l), pol_(-pow(l, 2)-l*a-2*b, -pow(l, 2)*a-2*l*b, -pow(l, 2)*b) {}
00021 ZMuMuBackNorm(const Exponential & expo, const Polynomial<2> & pol) : expo_(expo), pol_(pol) { }
00022 double operator()(const int x_min, const int x_max) const {
00023 double l = - (*(expo_.lambda));
00024 double l3inv = 1/(l*l*l);
00025 double N1 = expo_(x_max)*l3inv * pol_(x_max);
00026 double N2 = expo_(x_min)*l3inv * pol_(x_min);
00027 return 1/(N1 - N2);
00028 }
00029 void setParameters(double l, double a, double b) {
00030 expo_.setParameters(-l);
00031 double l2 = l*l;
00032 pol_.setParameters(-l2-l*a-2*b, -l2*a-2*l*b, -l2*b);
00033 }
00034 boost::shared_ptr<double> lambda, a1, a2;
00035 private:
00036 Exponential expo_;
00037 Polynomial<2> pol_;
00038 };
00039 }
00040
00041 #endif