Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
LArDiscreteProbabilityVector.h
Go to the documentation of this file.
1
8#ifndef LAR_DISCRETE_PROBABILITY_VECTOR_H
9#define LAR_DISCRETE_PROBABILITY_VECTOR_H 1
10
12#include "Pandora/StatusCodes.h"
13
14#include <limits>
15#include <random>
16#include <utility>
17#include <vector>
18
19namespace lar_content
20{
21
26{
27public:
28 template <typename TX, typename TY>
29 using InputDatum = std::pair<TX, TY>;
30
31 template <typename TX, typename TY>
32 using InputData = std::vector<InputDatum<TX, TY>>;
33
35
37
45 template <typename TX, typename TY>
46 DiscreteProbabilityVector(const InputData<TX, TY> &inputData, const TX xUpperBound, const bool useWidths);
47
54 DiscreteProbabilityVector(const DiscreteProbabilityVector &discreteProbabilityVector, const ResamplingPoints &resamplingPoints);
55
62 DiscreteProbabilityVector(const DiscreteProbabilityVector &discreteProbabilityVector, std::mt19937 &randomNumberGenerator);
63
71 float EvaluateCumulativeProbability(const float x) const;
72
78 unsigned int GetSize() const;
79
87 float GetX(const unsigned int index) const;
88
96 float GetProbability(const unsigned int index) const;
97
105 float GetProbabilityDensity(const unsigned int index) const;
106
114 float GetCumulativeProbability(const unsigned int index) const;
115
123 float GetWidth(const unsigned int index) const;
124
134 void GetAllAtIndex(const unsigned int index, float &x, float &probabilityDensity, float &cumulativeProbability, float &width) const;
135
136private:
141 {
142 public:
151 DiscreteProbabilityDatum(const float x, const float densityDatum, const float cumulativeDatum, const float width);
152
158 float GetX() const;
159
165 float GetDensityDatum() const;
166
172 float GetCumulativeDatum() const;
173
179 float GetWidth() const;
180
181 private:
182 float m_x;
185 float m_width;
186 };
187
188 typedef std::vector<DiscreteProbabilityDatum> DiscreteProbabilityData;
189
197 template <typename TX, typename TY>
199
209 const DiscreteProbabilityVector &discreteProbabilityVector, const ResamplingPoints &resamplingPoints) const;
210
221 const DiscreteProbabilityVector &discreteProbabilityVector, std::mt19937 &randomNumberGenerator) const;
222
231 template <typename TX, typename TY>
232 static bool SortInputDataByX(const InputDatum<TX, TY> &lhs, const InputDatum<TX, TY> &rhs);
233
241 template <typename TX, typename TY>
242 float CalculateNormalisation(const InputData<TX, TY> &inputData) const;
243
247 void VerifyCompleteData() const;
248
254 void VerifyElementRequest(const unsigned int index) const;
255
259};
260
261//------------------------------------------------------------------------------------------------------------------------------------------
262
263inline unsigned int DiscreteProbabilityVector::GetSize() const
264{
265 return m_discreteProbabilityData.size();
266}
267
268//------------------------------------------------------------------------------------------------------------------------------------------
269
270inline float DiscreteProbabilityVector::GetX(const unsigned int index) const
271{
272 this->VerifyElementRequest(index);
273
274 return m_discreteProbabilityData.at(index).GetX();
275}
276
277//------------------------------------------------------------------------------------------------------------------------------------------
278
279inline float DiscreteProbabilityVector::GetProbability(const unsigned int index) const
280{
281 this->VerifyElementRequest(index);
282
283 return m_discreteProbabilityData.at(index).GetDensityDatum() * (m_useWidths ? m_discreteProbabilityData.at(index).GetWidth() : 1.f);
284}
285
286//------------------------------------------------------------------------------------------------------------------------------------------
287
288inline float DiscreteProbabilityVector::GetProbabilityDensity(const unsigned int index) const
289{
290 this->VerifyElementRequest(index);
291
292 return m_discreteProbabilityData.at(index).GetDensityDatum();
293}
294
295//------------------------------------------------------------------------------------------------------------------------------------------
296
297inline float DiscreteProbabilityVector::GetCumulativeProbability(const unsigned int index) const
298{
299 this->VerifyElementRequest(index);
300
301 return m_discreteProbabilityData.at(index).GetCumulativeDatum();
302}
303
304//------------------------------------------------------------------------------------------------------------------------------------------
305
306inline float DiscreteProbabilityVector::GetWidth(const unsigned int index) const
307{
308 this->VerifyElementRequest(index);
309
310 return m_discreteProbabilityData.at(index).GetWidth();
311}
312
313//------------------------------------------------------------------------------------------------------------------------------------------
314
316 const unsigned int index, float &x, float &probabilityDensity, float &cumulativeProbability, float &width) const
317{
318 this->VerifyElementRequest(index);
319
320 const DiscreteProbabilityDatum &theDatum(m_discreteProbabilityData.at(index));
321 x = theDatum.GetX();
322 probabilityDensity = theDatum.GetDensityDatum();
323 cumulativeProbability = theDatum.GetCumulativeDatum();
324 width = theDatum.GetWidth();
325}
326
327//------------------------------------------------------------------------------------------------------------------------------------------
328
330 const float x, const float densityDatum, const float cumulativeDatum, const float width) :
331 m_x(x),
332 m_densityDatum(densityDatum),
333 m_cumulativeDatum(cumulativeDatum),
334 m_width(width)
335{
336}
337
338//------------------------------------------------------------------------------------------------------------------------------------------
339
341{
342 return m_x;
343}
344
345//------------------------------------------------------------------------------------------------------------------------------------------
346
348{
349 return m_densityDatum;
350}
351
352//------------------------------------------------------------------------------------------------------------------------------------------
353
355{
356 return m_cumulativeDatum;
357}
358
359//------------------------------------------------------------------------------------------------------------------------------------------
360
362{
363 return m_width;
364}
365
366//------------------------------------------------------------------------------------------------------------------------------------------
367
369{
370 if (2 > m_discreteProbabilityData.size())
371 throw pandora::StatusCodeException(pandora::STATUS_CODE_NOT_INITIALIZED);
372
373 if (m_discreteProbabilityData.back().GetX() - m_xUpperBound > std::numeric_limits<float>::epsilon())
374 throw pandora::StatusCodeException(pandora::STATUS_CODE_INVALID_PARAMETER);
375
376 return;
377}
378
379//------------------------------------------------------------------------------------------------------------------------------------------
380
381inline void DiscreteProbabilityVector::VerifyElementRequest(const unsigned int index) const
382{
383 if (this->GetSize() < index)
384 throw pandora::StatusCodeException(pandora::STATUS_CODE_OUT_OF_RANGE);
385
386 return;
387}
388
389} // namespace lar_content
390
391#endif // #ifndef LAR_DISCRETE_PROBABILITY_VECTOR_H
Header file defining relevant internal typedefs, sort and string conversion functions.
Header file defining status codes and relevant preprocessor macros.
DiscreteProbabilityDatum(const float x, const float densityDatum, const float cumulativeDatum, const float width)
Constructor.
float GetDensityDatum() const
Get the probability density for the datum.
float GetCumulativeDatum() const
Get the cumulative probability for the datum.
void VerifyCompleteData() const
Verify the integrity of the complete probability vector.
DiscreteProbabilityData InitialiseDiscreteProbabilityData(InputData< TX, TY > inputData) const
Get a initialised probability data vector from the input data.
float GetCumulativeProbability(const unsigned int index) const
Get the cumulative probability value of the element in the vector.
float GetProbability(const unsigned int index) const
Get the probability value of the element in the vector.
float m_xUpperBound
the upper bound of the probability vector
DiscreteProbabilityData ResampleDiscreteProbabilityData(const DiscreteProbabilityVector &discreteProbabilityVector, const ResamplingPoints &resamplingPoints) const
Get a resampled probability data vector by resampling another probability data vector.
float GetWidth(const unsigned int index) const
Get the width of the element in the vectorr.
bool m_useWidths
controls whether bin widths are used in calculations
float CalculateNormalisation(const InputData< TX, TY > &inputData) const
Calculate the probability normalisation.
DiscreteProbabilityData RandomiseDiscreteProbabilityData(const DiscreteProbabilityVector &discreteProbabilityVector, std::mt19937 &randomNumberGenerator) const
Get a randomised probability data vector in which the x values are unchanged, the probability density...
void GetAllAtIndex(const unsigned int index, float &x, float &probabilityDensity, float &cumulativeProbability, float &width) const
Get all information stored at a particular index.
unsigned int GetSize() const
Get the size of the probability vector.
float EvaluateCumulativeProbability(const float x) const
Evaluate the cumulative probability at arbitrary x.
float GetProbabilityDensity(const unsigned int index) const
Get the probability density value of the element in the vector.
float GetX(const unsigned int index) const
Get the x value of the element in the vector.
static bool SortInputDataByX(const InputDatum< TX, TY > &lhs, const InputDatum< TX, TY > &rhs)
Sort the input data according to their x value.
std::vector< InputDatum< TX, TY > > InputData
std::vector< DiscreteProbabilityDatum > DiscreteProbabilityData
DiscreteProbabilityData m_discreteProbabilityData
the probability data
void VerifyElementRequest(const unsigned int index) const
Verify the integrity of the element request.
StatusCodeException class.
std::vector< float > FloatVector