All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FlashUtilities.cxx
Go to the documentation of this file.
1 /*!
2  * Title: FlashUtilities Class
3  * Author: Wes Ketchum (wketchum@lanl.gov)
4  *
5  * Description:
6  * Class that contains utility functions for flash and flash hypotheses:
7  * --- compare a flash hypothesis to a truth or reco vector
8  * --- get an extent of a flash (central point, width)
9  * These classes should operate using simple objects, and will need other
10  * classes/functions to fill those vectors properly.
11 */
12 
13 #include <limits>
14 #include <numeric>
15 #include <cmath>
16 #include <stdexcept>
17 
18 #include "FlashHypothesis.h"
19 #include "FlashUtilities.h"
20 
22  const std::vector<float>& compare_vector,
23  std::vector<float>& result_vector)
24 {
25  if(compare_vector.size()!=fh.GetVectorSize())
26  throw std::runtime_error("ERROR in FlashUtilities Compare: Mismatching vector sizes.");
27 
28  result_vector.resize(fh.GetVectorSize());
29 
30  float result_total = 0;
31 
32  std::vector<float> const& NPEs_Vector(fh.GetHypothesisVector());
33  std::vector<float> const& NPEs_ErrorVector(fh.GetHypothesisErrorVector());
34 
35  for(size_t i=0; i<fh.GetVectorSize(); i++){
36  result_total += compare_vector[i];
37  float diff = NPEs_Vector[i]-compare_vector[i];
38  if( std::abs(diff)<std::numeric_limits<float>::epsilon())
39  result_vector[i]=0;
40  else if(NPEs_ErrorVector[i] < std::numeric_limits<float>::epsilon())
41  result_vector[i] = diff / std::numeric_limits<float>::epsilon();
42  else
43  result_vector[i] = diff / NPEs_ErrorVector[i];
44  }
45 
46  float total_error = fh.GetTotalPEsError();
47  float total_diff = fh.GetTotalPEs() - result_total;
48  if( std::abs(total_diff) < std::numeric_limits<float>::epsilon() )
49  result_total = 0;
50  else if( total_error < std::numeric_limits<float>::epsilon() )
51  result_total = total_diff / std::numeric_limits<float>::epsilon();
52  else
53  result_total = total_diff / total_error;
54 
55  return result_total;
56 }
57 
59  const std::vector<float>& compare_vector,
60  std::vector<float>& result_vector)
61 {
62  return CompareByFraction(fh.GetHypothesisVector(),compare_vector,result_vector);
63 }
64 
65 float opdet::FlashUtilities::CompareByFraction(const std::vector<float>& NPEs_Vector,
66  const std::vector<float>& compare_vector,
67  std::vector<float>& result_vector)
68 {
69  if(compare_vector.size()!=NPEs_Vector.size())
70  throw std::runtime_error("ERROR in FlashUtilities Compare: Mismatching vector sizes.");
71 
72  result_vector.resize(NPEs_Vector.size());
73 
74  float total_comp = 0;
75  float total_hyp = 0;
76  for(size_t i=0; i<NPEs_Vector.size(); i++){
77  total_comp += compare_vector[i];
78  total_hyp += NPEs_Vector[i];
79  float diff = NPEs_Vector[i]-compare_vector[i];
80  if( std::abs(diff)<std::numeric_limits<float>::epsilon())
81  result_vector[i]=0;
82  else if(compare_vector[i] < std::numeric_limits<float>::epsilon())
83  result_vector[i] = diff / std::numeric_limits<float>::epsilon();
84  else
85  result_vector[i] = diff / compare_vector[i];
86  }
87 
88  float result_total=0.0;
89  float total_diff = total_hyp - total_comp;
90  if( std::abs(total_diff) < std::numeric_limits<float>::epsilon() )
91  result_total = 0;
92  else if( total_comp < std::numeric_limits<float>::epsilon() )
93  result_total = total_diff / std::numeric_limits<float>::epsilon();
94  else
95  result_total = total_diff / total_comp;
96 
97  return result_total;
98 }
99 
100 void opdet::FlashUtilities::GetPosition(const std::vector<float>& pe_vector,
101  const std::vector<float>& pos_vector,
102  float& mean, float& rms)
103 {
104  if(pe_vector.size()!=pos_vector.size())
105  throw std::runtime_error("ERROR in FlashUtilities GetPosition: Mismatchin vector sizes.");
106 
107  float sum = std::accumulate(pe_vector.begin(),pe_vector.end(),0.0);
108 
109  if(sum < std::numeric_limits<float>::epsilon()){
110  mean=0; rms=0; return;
111  }
112 
113  mean = std::inner_product(pe_vector.begin(),pe_vector.end(),pos_vector.begin(),0.0) / sum;
114 
115  rms=0;
116  for(size_t i=0; i<pe_vector.size(); i++)
117  rms += pe_vector[i]*(pos_vector[i] - mean)*(pos_vector[i] - mean);
118 
119  rms = std::sqrt(rms)/sum;
120 }
121 
122 void opdet::FlashUtilities::GetPosition(const std::vector<float>& pe_vector,
123  const std::vector<float>& pos_vector,
124  double& mean, double& rms)
125 {
126  float fmean,frms;
127  GetPosition(pe_vector,pos_vector,fmean,frms);
128  mean = double(fmean);
129  rms = double(frms);
130 }
Class def header for a class FlashHypothesis.
size_t GetVectorSize() const
float GetTotalPEsError() const
std::vector< float > const & GetHypothesisErrorVector() const
float CompareByFraction(const FlashHypothesis &, const std::vector< float > &, std::vector< float > &)
float GetTotalPEs() const
T abs(T value)
void GetPosition(const std::vector< float > &, const std::vector< float > &, float &, float &)
float CompareByError(const FlashHypothesis &, const std::vector< float > &, std::vector< float > &)
double mean(const std::vector< short > &wf, size_t start, size_t nsample)
Definition: UtilFunc.cxx:13
std::vector< float > const & GetHypothesisVector() const