CLHEP 2.0.4.7 Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // -*- C++ -*- 00002 // $Id: BivariateGaussian.cc,v 1.5.4.1.2.1 2009/11/10 20:43:12 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 _mean0(right._mean0), 00030 _mean1(right._mean1), 00031 _sigma0(right._sigma0), 00032 _sigma1(right._sigma1), 00033 _corr01(right._corr01) 00034 { 00035 } 00036 00037 double BivariateGaussian::operator() (const Argument & a) const { 00038 assert (a.dimension()==2); 00039 double x = a[0]; 00040 double y = a[1]; 00041 00042 double x0 = _mean0.getValue(); 00043 double y0 = _mean1.getValue(); 00044 double dx = x-x0; 00045 double dy = y-y0; 00046 00047 double sx = _sigma0.getValue(); 00048 double sy = _sigma1.getValue(); 00049 00050 double sxs = sx*sx; 00051 double sys = sy*sy; 00052 double rho = _corr01.getValue(); 00053 double dt = (1.0+rho)*(1.0-rho); 00054 00055 return (1.0/(2*M_PI*sx*sy*sqrt(dt))) * 00056 exp(-1.0/(2.0*dt)*(dx*dx/sxs+dy*dy/sys-2.0*rho*dx*dy/sx/sy)); 00057 } 00058 00059 Parameter & BivariateGaussian::mean0() { 00060 return _mean0; 00061 } 00062 00063 Parameter & BivariateGaussian::sigma0() { 00064 return _sigma0; 00065 } 00066 00067 const Parameter & BivariateGaussian::mean0() const { 00068 return _mean0; 00069 } 00070 00071 const Parameter & BivariateGaussian::sigma0() const { 00072 return _sigma0; 00073 } 00074 00075 Parameter & BivariateGaussian::mean1() { 00076 return _mean1; 00077 } 00078 00079 Parameter & BivariateGaussian::sigma1() { 00080 return _sigma1; 00081 } 00082 00083 const Parameter & BivariateGaussian::mean1() const { 00084 return _mean1; 00085 } 00086 00087 const Parameter & BivariateGaussian::sigma1() const { 00088 return _sigma1; 00089 } 00090 00091 00092 00093 Parameter & BivariateGaussian::corr01() { 00094 return _corr01; 00095 } 00096 00097 const Parameter & BivariateGaussian::corr01() const { 00098 return _corr01; 00099 } 00100 00101 00102 unsigned int BivariateGaussian::dimensionality() const { 00103 return 2; 00104 } 00105 00106 double BivariateGaussian::operator ()(double x) const 00107 { 00108 std::cerr 00109 << "Warning. bivariate Gaussian called with scalar argument" 00110 << std::endl; 00111 assert(0); 00112 return 0; 00113 } 00114 00115 } // namespace Genfun