Electric Tiger DAQ  1.0.0
Data Acquisition Software for the Electric Tiger Experiment
algorithm.h
1 #ifndef ALGORITHM_H
2 #define ALGORITHM_H
3 
4 //C System-Headers
5 //
6 //C++ System headers
7 #include <string>
8 //Qt Headers
9 //
10 //OpenCV Headers
11 //
12 //Boost Headers
13 #include <boost/algorithm/string.hpp>//split(), is_any_of, trim
14 #include <boost/lexical_cast.hpp>
15 //Project specific headers
16 //
17 
18 namespace etig {
19 
20 void remove_newlines( std::string& str );
21 
22 template < typename T >
23 T mean( const std::vector<T>& vect ) {
24  uint size_T = static_cast<T>( vect.size() );
25  T sum = static_cast<T>( 0 );
26 
27  std::for_each( vect.begin(), vect.end(), [&] (T x) {
28  sum += x;
29  });
30 
31  return sum / size_T;
32 }
33 
34 template < typename T >
35 struct Rebin {
36 
37  Rebin() {}
38 
50  void operator()( const std::vector< T >& time_series, T f_res, T time_int ) {
51 
52  uint sig_size = time_series.size();
53  T delta_f = static_cast<T>( 1 )/( time_int );
54 
55  T f_axion = f_res*1e6 / ( static_cast<T>( 1e6 ) * static_cast<T>( 2 ) );
56 
57  overbin_size = static_cast< uint >( std::floor( f_axion / delta_f ) );
58 
59  if( overbin_size == 0 ) {
60  std::string err_str =
61  "Frequency seperation between signal elements is larger than 1/2 expected Axion signal width\n";
62  err_str += "Axion signal is ";
63  err_str += boost::lexical_cast< std::string >( f_axion / delta_f );
64  err_str += " times larger than frequency seperation.";
65  throw std::invalid_argument( err_str );
66  }
67 
68  uint tail = sig_size % overbin_size;
69 
70  uint rebin_size = ( tail == 0 )?( sig_size / overbin_size ):( ( sig_size - tail ) / overbin_size );
71 
72  rebinned_signal.reserve( rebin_size );
73 
74  for( uint i = 0 ; i < sig_size - tail ; i += overbin_size ) {
75 
76  std::vector<T> sub_vector( time_series.begin() + i, time_series.begin() + ( i + 1 ) );
77  rebinned_signal.push_back( mean( sub_vector ) );
78  }
79 
80  std::vector<T> remainder( time_series.end() - tail, time_series.end() );
81  rebinned_signal.push_back( mean( remainder ) );
82 
83  }
84 
93  void operator()( const std::vector< T >& time_series, uint overbin_size ) {
94 
95  uint sig_size = time_series.size();
96 
97  if( overbin_size == 0 ) {
98  std::string err_str =
99  "Requested rebin size is greater than signal size.\n";
100  err_str += "Signal contains ";
101  err_str += boost::lexical_cast< std::string >( sig_size );
102  err_str += " rebin size was ";
103  err_str += boost::lexical_cast< std::string >( overbin_size );
104  throw std::invalid_argument( err_str );
105  }
106 
107  uint tail = sig_size % overbin_size;
108  uint rebin_size = ( tail == 0 )?( sig_size / overbin_size ):( ( sig_size - tail ) / overbin_size );
109 
110  rebinned_signal.reserve( rebin_size );
111 
112  for( uint i = 0 ; i < sig_size - tail ; i += overbin_size ) {
113 
114  std::vector<T> sub_vector( time_series.begin() + i, time_series.begin() + ( i + 1 ) );
115  rebinned_signal.push_back( mean( sub_vector ) );
116  }
117 
118  std::vector<T> remainder( time_series.end() - tail, time_series.end() );
119  rebinned_signal.push_back( mean( remainder ) );
120 
121  }
122 
123  std::vector< T > RebinnedSignal() {
124  return rebinned_signal;
125  }
126 
127  uint RebinSize() {
128  return overbin_size;
129  }
130 
131  private:
132  std::vector<T> rebinned_signal;
133  uint overbin_size;
134 
135 };
136 
137 }
138 
139 #endif /* ALGORITHM_H */
Definition: algorithm.h:35
void operator()(const std::vector< T > &time_series, T f_res, T time_int)
operator ()
Definition: algorithm.h:50
void operator()(const std::vector< T > &time_series, uint overbin_size)
operator ()
Definition: algorithm.h:93
Definition: algorithm.cpp:16