Probability.cc
Go to the documentation of this file.
1 #include <utl/Probability.h>
2 
3 #include <utl/Vector.h>
4 #include <utl/CoordinateSystemPtr.h>
5 #include <utl/CoordinateSystem.h>
6 
7 #include <TRandom3.h>
8 #include <TVector3.h>
9 #include <TRotation.h>
10 #include <TMath.h>
11 
12 #include <cmath>
13 
14 
15 namespace utl {
16 
18  fRand(0)
19  { }
20 
21 
22  void
23  Probability::SetSeed(const unsigned int seed)
24  {
25  fRand.SetSeed(seed);
26  }
27 
28 
30  double
31  Probability::GetRayleighPDF(const double x, const double sigma)
32  {
33  if (x < 0)
34  return std::numeric_limits<double>::min();
35  return x / (sigma * sigma) * exp(- x * x / (2 * sigma * sigma));
36  }
37 
38 
40  double
41  Probability::GetRayleighCDF(const double x, const double sigma)
42  {
43  if (x > 0)
44  return 1 - exp(- x * x / (2 * sigma * sigma));
45  return std::numeric_limits<double>::min();
46  }
47 
48 
49  double
50  Probability::GetNormalPDF(const double x, const double mu, const double sigma)
51  {
52  return 1. / sqrt(2 * M_PI * sigma * sigma) *
53  exp(-1. * (x - mu) * (x - mu) / (2 * sigma * sigma));
54  }
55 
56 
57  long double
58  Probability::GetVonMisesPDF(const double x, const double mu, const double kappa)
59  {
60  if (kappa > 709)
61  return GetNormalPDF(x, mu, sqrt(1./kappa));
62  return exp(kappa * cos(x - mu)) / (2 * M_PI * TMath::BesselI0(kappa));
63  }
64 
65 
66  double
67  Probability::GetFisherPDF(const double x, const double kappa)
68  {
69  const double tmp = kappa * sin(x) / (2 * sinh(kappa)) * exp(kappa * cos(x));
70  return (tmp == 0) ? std::numeric_limits<double>::min() : tmp;
71  }
72 
73  double
74  Probability::GetFisherCDF(const double x, const double kappa)
75  {
76  const double tmp = (exp(kappa) - exp(kappa * cos(x))) / (2 * sinh(kappa));
77  return (tmp == 0) ? std::numeric_limits<double>::min() : tmp;
78  }
79 
80 
81  double
82  Probability::GetRandomRayleigh(const double sigma)
83  {
84  return sqrt(-2 * sigma * sigma * log(1- fRand.Uniform()));
85  }
86 
87 
88  double
90  {
91  return acos(1 + 1 / k * log(1 - fRand.Uniform() * (1 - exp(-2 * k))));
92  }
93 
94 
95  Vector
96  Probability::GetRandomFisher(const Vector& meanDirection, const double k)
97  {
98  const double alpha = GetRandomFisher(k);
99  return GetFisher(meanDirection, alpha);
100  }
101 
102 
103  Vector
104  Probability::GetFisher(const Vector& meanDirection, const double alpha)
105  {
106  const CoordinateSystemPtr cs = CoordinateSystem::GetRootCoordinateSystem();
107  const TVector3 md(meanDirection.GetX(cs), meanDirection.GetY(cs), meanDirection.GetZ(cs));
108  const TVector3 rotDirection = GetRandomVectorOnSphere();
109  TVector3 rotAxis = md.Cross(rotDirection);
110  rotAxis = rotAxis.Unit();
111 
112  TRotation rot;
113  rot.Rotate(alpha, rotAxis);
114 
115  //RotationMatrix M(rotAxis, alpha);
116  const TVector3 vnew = rot * md;
117  return Vector(vnew.X(), vnew.Y(), vnew.Z(), cs);
118  }
119 
120 
121  TVector3
123  {
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);
128  }
129 
130 }
TRandom3 fRand
Definition: Probability.h:81
double GetRandomFisher(const double k)
returns a Fisher distributed random variable
Definition: Probability.cc:89
static double GetRayleighCDF(const double x, const double sigma)
evaluates the Rayleigh CDF of sigma at position x
Definition: Probability.cc:41
static double GetNormalPDF(const double x, const double mu, const double sigma)
Definition: Probability.cc:50
utl::Vector GetFisher(const utl::Vector &meanDirection, const double alpha)
returns a random vector that has an angle alpha wrt the given vector
Definition: Probability.cc:104
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
double GetX(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:206
TVector3 GetRandomVectorOnSphere()
Definition: Probability.cc:122
static double GetFisherPDF(const double x, const double kappa)
Definition: Probability.cc:67
double GetY(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:209
double GetRandomRayleigh(const double sigma)
returns a Rayleigh distributed random variable
Definition: Probability.cc:82
Vector object.
Definition: Vector.h:30
static double GetFisherCDF(const double x, const double kappa)
Definition: Probability.cc:74
static double GetRayleighPDF(const double x, const double sigma)
evaluates the Rayleigh PDF of sigma at position x
Definition: Probability.cc:31
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:212
void SetSeed(const unsigned int seed)
Definition: Probability.cc:23
static long double GetVonMisesPDF(const double x, const double mu, const double kappa)
Definition: Probability.cc:58

, generated on Tue Sep 26 2023.