CLHEP VERSION Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // -*- C++ -*- 00002 // $Id: BivariateGaussian.cc,v 1.8 2010/06/16 18:22:01 garren Exp $ 00003 #include "CLHEP/GenericFunctions/defs.h" 00004 #include "CLHEP/GenericFunctions/BivariateGaussian.hh" 00005 #include <assert.h> 00006 #include <cmath> // for exp() 00007 00008 #if (defined __STRICT_ANSI__) || (defined _WIN32) 00009 #ifndef M_PI 00010 #define M_PI 3.14159265358979323846 00011 #endif // M_PI 00012 #endif // __STRICT_ANSI__ 00013 00014 namespace Genfun { 00015 FUNCTION_OBJECT_IMP(BivariateGaussian) 00016 00017 BivariateGaussian::BivariateGaussian(): 00018 _mean0("Mean0", 0.0,-10,10), 00019 _mean1("Mean1", 0.0,-10,10), 00020 _sigma0("Sigma0",1.0,0, 10), 00021 _sigma1("Sigma1",1.0,0, 10), 00022 _corr01("Corr01", 0.0, -1.0, 1.0) 00023 {} 00024 00025 BivariateGaussian::~BivariateGaussian() { 00026 } 00027 00028 BivariateGaussian::BivariateGaussian(const BivariateGaussian & right): 00029 AbsFunction(right), 00030 _mean0(right._mean0), 00031 _mean1(right._mean1), 00032 _sigma0(right._sigma0), 00033 _sigma1(right._sigma1), 00034 _corr01(right._corr01) 00035 { 00036 } 00037 00038 double BivariateGaussian::operator() (const Argument & a) const { 00039 assert (a.dimension()==2); 00040 double x = a[0]; 00041 double y = a[1]; 00042 00043 double x0 = _mean0.getValue(); 00044 double y0 = _mean1.getValue(); 00045 double dx = x-x0; 00046 double dy = y-y0; 00047 00048 double sx = _sigma0.getValue(); 00049 double sy = _sigma1.getValue(); 00050 00051 double sxs = sx*sx; 00052 double sys = sy*sy; 00053 double rho = _corr01.getValue(); 00054 double dt = (1.0+rho)*(1.0-rho); 00055 00056 return (1.0/(2*M_PI*sx*sy*sqrt(dt))) * 00057 exp(-1.0/(2.0*dt)*(dx*dx/sxs+dy*dy/sys-2.0*rho*dx*dy/sx/sy)); 00058 } 00059 00060 Parameter & BivariateGaussian::mean0() { 00061 return _mean0; 00062 } 00063 00064 Parameter & BivariateGaussian::sigma0() { 00065 return _sigma0; 00066 } 00067 00068 const Parameter & BivariateGaussian::mean0() const { 00069 return _mean0; 00070 } 00071 00072 const Parameter & BivariateGaussian::sigma0() const { 00073 return _sigma0; 00074 } 00075 00076 Parameter & BivariateGaussian::mean1() { 00077 return _mean1; 00078 } 00079 00080 Parameter & BivariateGaussian::sigma1() { 00081 return _sigma1; 00082 } 00083 00084 const Parameter & BivariateGaussian::mean1() const { 00085 return _mean1; 00086 } 00087 00088 const Parameter & BivariateGaussian::sigma1() const { 00089 return _sigma1; 00090 } 00091 00092 00093 00094 Parameter & BivariateGaussian::corr01() { 00095 return _corr01; 00096 } 00097 00098 const Parameter & BivariateGaussian::corr01() const { 00099 return _corr01; 00100 } 00101 00102 00103 unsigned int BivariateGaussian::dimensionality() const { 00104 return 2; 00105 } 00106 00107 double BivariateGaussian::operator ()(double) const 00108 { 00109 std::cerr 00110 << "Warning. bivariate Gaussian called with scalar argument" 00111 << std::endl; 00112 assert(0); 00113 return 0; 00114 } 00115 00116 } // namespace Genfun