Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
LArDiscreteProbabilityHelper.cc
Go to the documentation of this file.
1
9
11
12namespace lar_content
13{
14
15template <typename T>
17 const T &t1, const T &t2, std::mt19937 &randomNumberGenerator, const unsigned int nPermutations)
18{
19 if (1 > nPermutations)
20 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
21
23
24 unsigned int nExtreme(0);
25 for (unsigned int iPermutation = 0; iPermutation < nPermutations; ++iPermutation)
26 {
29 LArDiscreteProbabilityHelper::MakeRandomisedSample(t2, randomNumberGenerator)));
30
31 if ((rRandomised - rNominal) > std::numeric_limits<float>::epsilon())
32 nExtreme++;
33 }
34
35 return static_cast<float>(nExtreme) / static_cast<float>(nPermutations);
36}
37
38//------------------------------------------------------------------------------------------------------------------------------------------
39
40template <typename T>
42 const T &t1, const T &t2, const unsigned int nIntegrationSteps, const float upperLimit)
43{
45 const float dof(static_cast<float>(LArDiscreteProbabilityHelper::GetSize(t1)) - 2.f);
46
47 if (0 > dof)
48 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
49
50 const float tTestStatisticDenominator(1.f - correlation - correlation);
51
52 if (tTestStatisticDenominator < std::numeric_limits<float>::epsilon())
53 throw pandora::StatusCodeException(pandora::STATUS_CODE_FAILURE);
54
55 const float tTestStatistic(correlation * std::sqrt(dof) / (std::sqrt(tTestStatisticDenominator)));
56 const float tDistCoeff(std::tgamma(0.5f * (dof + 1.f)) / std::tgamma(0.5f * dof) / (std::sqrt(dof * M_PI)));
57
58 const float dx((upperLimit - tTestStatistic) / static_cast<float>(nIntegrationSteps));
59 float integral(tDistCoeff * std::pow(1.f + tTestStatistic * tTestStatistic / dof, -0.5f * (dof + 1.f)) +
60 tDistCoeff * std::pow(1.f + upperLimit * upperLimit / dof, -0.5f * (dof + 1.f)));
61 for (unsigned int iStep = 1; iStep < nIntegrationSteps; ++iStep)
62 {
63 integral += 2.f * tDistCoeff *
64 std::pow(1.f + (tTestStatistic + static_cast<float>(iStep) * dx) * (tTestStatistic + static_cast<float>(iStep) * dx) / dof,
65 -0.5f * (dof + 1.f));
66 }
67
68 return integral * dx / 2.f;
69}
70
71//------------------------------------------------------------------------------------------------------------------------------------------
72
73template <typename T>
75{
76 const unsigned int size1(LArDiscreteProbabilityHelper::GetSize(t1));
77 const unsigned int size2(LArDiscreteProbabilityHelper::GetSize(t2));
78 if (size1 != size2)
79 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
80
81 if (2 > size1)
82 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
83
86
87 float variance1(0.f), variance2(0.f), covariance(0.f);
88
89 for (unsigned int iElement = 0; iElement < size1; ++iElement)
90 {
91 const float diff1(LArDiscreteProbabilityHelper::GetElement(t1, iElement) - mean1);
92 const float diff2(LArDiscreteProbabilityHelper::GetElement(t2, iElement) - mean2);
93
94 variance1 += diff1 * diff1;
95 variance2 += diff2 * diff2;
96 covariance += diff1 * diff2;
97 }
98
99 if (variance1 < std::numeric_limits<float>::epsilon() || variance2 < std::numeric_limits<float>::epsilon())
100 throw pandora::StatusCodeException(pandora::STATUS_CODE_FAILURE);
101
102 const float sqrtVars(std::sqrt(variance1 * variance2));
103 if (sqrtVars < std::numeric_limits<float>::epsilon())
104 throw pandora::StatusCodeException(pandora::STATUS_CODE_FAILURE);
105
106 return covariance / sqrtVars;
107}
108
109//------------------------------------------------------------------------------------------------------------------------------------------
110
111template <typename T>
113{
114 const unsigned int size(LArDiscreteProbabilityHelper::GetSize(t));
115 if (1 > size)
116 throw pandora::StatusCodeException(pandora::STATUS_CODE_NOT_INITIALIZED);
117
118 float mean(0.f);
119 for (unsigned int iElement = 0; iElement < size; ++iElement)
120 mean += LArDiscreteProbabilityHelper::GetElement(t, iElement);
121
122 return mean / static_cast<float>(size);
123}
124
125//------------------------------------------------------------------------------------------------------------------------------------------
126
128 const DiscreteProbabilityVector &, const DiscreteProbabilityVector &, std::mt19937 &, const unsigned int);
130 const pandora::FloatVector &, const pandora::FloatVector &, std::mt19937 &, const unsigned int);
131
133 const DiscreteProbabilityVector &, const DiscreteProbabilityVector &, const unsigned int, const float);
135 const pandora::FloatVector &, const pandora::FloatVector &, const unsigned int, const float);
136
139
142
143} // namespace lar_content
Header file for the discrete probability helper class.
Header file defining relevant internal typedefs, sort and string conversion functions.
static float CalculateCorrelationCoefficientPValueFromPermutationTest(const T &t1, const T &t2, std::mt19937 &randomNumberGenerator, const unsigned int nPermutations)
Calculate P value for measured correlation coefficient between two datasets via a permutation test.
static T MakeRandomisedSample(const T &t, std::mt19937 &randomNumberGenerator)
Make a randomised copy of a dataset.
static unsigned int GetSize(const T &t)
Get the size the size of a dataset.
static float CalculateCorrelationCoefficientPValueFromStudentTDistribution(const T &t1, const T &t2, const unsigned int nIntegrationSteps, const float upperLimit)
Calculate P value for measured correlation coefficient between two datasets via a integrating the stu...
static float GetElement(const T &t, const unsigned int index)
Get an element in a dataset.
static float CalculateCorrelationCoefficient(const T &t1, const T &t2)
Calculate the correlation coefficient between two datasets.
static float CalculateMean(const T &t)
Calculate the mean of a dataset.
StatusCodeException class.
std::vector< float > FloatVector