1 #include <utl/Probability.h>
3 #include <utl/Vector.h>
4 #include <utl/CoordinateSystemPtr.h>
5 #include <utl/CoordinateSystem.h>
34 return std::numeric_limits<double>::min();
35 return x / (sigma * sigma) * exp(- x * x / (2 * sigma * sigma));
44 return 1 - exp(- x * x / (2 * sigma * sigma));
45 return std::numeric_limits<double>::min();
52 return 1. /
sqrt(2 * M_PI * sigma * sigma) *
53 exp(-1. * (x - mu) * (x - mu) / (2 * sigma * sigma));
62 return exp(kappa * cos(x - mu)) / (2 * M_PI * TMath::BesselI0(kappa));
69 const double tmp = kappa * sin(x) / (2 * sinh(kappa)) * exp(kappa * cos(x));
70 return (tmp == 0) ? std::numeric_limits<double>::min() : tmp;
76 const double tmp = (exp(kappa) - exp(kappa * cos(x))) / (2 * sinh(kappa));
77 return (tmp == 0) ? std::numeric_limits<double>::min() : tmp;
84 return sqrt(-2 * sigma * sigma * log(1-
fRand.Uniform()));
91 return acos(1 + 1 / k * log(1 -
fRand.Uniform() * (1 - exp(-2 * k))));
107 const TVector3 md(meanDirection.
GetX(cs), meanDirection.
GetY(cs), meanDirection.
GetZ(cs));
109 TVector3 rotAxis = md.Cross(rotDirection);
110 rotAxis = rotAxis.Unit();
113 rot.Rotate(alpha, rotAxis);
116 const TVector3 vnew = rot * md;
117 return Vector(vnew.X(), vnew.Y(), vnew.Z(), cs);
124 const double z =
fRand.Uniform(-1, 1);
125 const double t =
fRand.Uniform(-M_PI, M_PI);
126 const double r =
sqrt(1 - z * z);
127 return TVector3(r * cos(t), r * sin(t), z);
double GetRandomFisher(const double k)
returns a Fisher distributed random variable
static double GetRayleighCDF(const double x, const double sigma)
evaluates the Rayleigh CDF of sigma at position x
static double GetNormalPDF(const double x, const double mu, const double sigma)
utl::Vector GetFisher(const utl::Vector &meanDirection, const double alpha)
returns a random vector that has an angle alpha wrt the given vector
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
double GetX(const CoordinateSystemPtr &coordinateSystem) const
TVector3 GetRandomVectorOnSphere()
static double GetFisherPDF(const double x, const double kappa)
double GetY(const CoordinateSystemPtr &coordinateSystem) const
double GetRandomRayleigh(const double sigma)
returns a Rayleigh distributed random variable
static double GetFisherCDF(const double x, const double kappa)
static double GetRayleighPDF(const double x, const double sigma)
evaluates the Rayleigh PDF of sigma at position x
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
void SetSeed(const unsigned int seed)
static long double GetVonMisesPDF(const double x, const double mu, const double kappa)