Belle II Software  release-05-01-25
WaveFitter.h
1 #ifndef WAVEFITTER_H
2 #define WAVEFITTER_H
3 
4 #include <array>
5 #include <vector>
6 #include <algorithm>
7 #include <functional>
8 #include <cmath>
9 
10 namespace Belle2 {
15  namespace SVD {
16 
18  class DefaultWave {
19  public:
20 
24  DefaultWave(double tau = s_default_tau) : m_tau(tau) {}
25 
26  static double s_default_tau;
34  inline double getValue(double t) const
35  {
36  if (t < 0)
37  return 0.0;
38  else {
39  double z = t / m_tau;
40  return z * std::exp(1.0 - z);
41  }
42  }
43 
45  double getTau() const { return m_tau; }
46 
47  private:
48  double m_tau;
49  };
50 
51 
53  class WaveFitter {
54  public:
55 
57  typedef std::function<double(double)> wave_function_type;
59  typedef std::vector< std::array<double, 6> > strip_data_type;
60 
65  WaveFitter(wave_function_type wave, std::array<double, 6> times):
66  m_hasFit(false), m_times(times), m_wave(wave), m_fittedTime(0), m_fittedTimeError(), m_fittedLik(1.0e10), m_ndf(0)
67  {
68  m_dt = m_times[1] - m_times[0];
69  }
70 
75  void addData(const std::array<double, 6>& inpData, double rmsNoise)
76  {
77  std::array<double, 6> v;
78  std::copy(inpData.begin(), inpData.end(), v.begin());
79  m_data.push_back(v);
80  m_noises.push_back(rmsNoise);
81  m_hasFit = false;
82  m_ndf = 6 * m_data.size() - m_data.size() - 2;
83  }
84 
86  void reset()
87  {
88  m_data.clear();
89  m_noises.clear();
90  m_fittedData.clear();
91  m_fittedAmplitudes.clear();
93  m_ndf = 0;
94  m_hasFit = false;
95  }
96 
100  double getFittedTime()
101  {
102  if (!m_hasFit) doFit();
103  return m_fittedTime;
104  }
105 
110  {
111  if (!m_hasFit) doFit();
112  return m_fittedTimeError;
113  }
114 
118  const std::vector<double>& getFittedAmplitudes()
119  {
120  if (!m_hasFit) doFit();
121  return m_fittedAmplitudes;
122  }
123 
127  const std::vector<double>& getFittedAmplitudeErrors()
128  {
129  if (!m_hasFit) doFit();
131  }
132 
137  {
138  if (!m_hasFit) doFit();
139  return m_fittedLik;
140  }
141 
145  const strip_data_type& getData() const { return m_data; }
146 
151  {
152  if (!m_hasFit) doFit();
153  return m_fittedData;
154  }
155 
157  double getDt() const { return m_dt; }
159  const std::array<double, 6>& getTimes() const { return m_times; }
160 
165  double Chi(double t);
170  double negLogLikelihood(double t);
173  double pSignal();
179  double lrSignal(double a, double b);
180 
182  double wave(double t) const { return m_wave(t); }
184  static void setPrecision(int ndigits);
185 
186  private:
187 
190 
192  void doFit();
194  void calculateAmplitudes();
198  void calculateFitErrors();
200  void calculateFittedData();
202  double integral12(double lower, double upper, std::function<double(double)> f);
204  double integral20(double lower, double upper, std::function<double(double)> f);
205  bool m_hasFit;
206  double m_dt;
208  std::vector<double> m_noises;
209  std::array<double, 6> m_times;
211  double m_fittedTime;
213  std::vector<double> m_fittedAmplitudes;
214  std::vector<double> m_fittedAmplitudeErrors;
215  double m_fittedLik;
216  int m_ndf;
218  };
219 
220  } // namespace SVD
222 } // namespace Belle2
223 #endif // WAVEFITTER_H
Belle2::SVD::WaveFitter::strip_data_type
std::vector< std::array< double, 6 > > strip_data_type
Function type for cluster data.
Definition: WaveFitter.h:59
Belle2::SVD::WaveFitter::m_fittedTime
double m_fittedTime
Time from interval (-dt,+dt).
Definition: WaveFitter.h:211
Belle2::SVD::WaveFitter::getFittedAmplitudes
const std::vector< double > & getFittedAmplitudes()
Retrieve strip amplitudes after a fit.
Definition: WaveFitter.h:118
Belle2::SVD::WaveFitter::calculateFitErrors
void calculateFitErrors()
Calculate fit errors.
Definition: WaveFitter.cc:127
Belle2::SVD::WaveFitter::wave
double wave(double t) const
Get unit waveform value at a given time.
Definition: WaveFitter.h:182
Belle2::SVD::WaveFitter::getData
const strip_data_type & getData() const
Get original fitted data.
Definition: WaveFitter.h:145
Belle2::SVD::WaveFitter::m_data
strip_data_type m_data
Vector of sextets of APV samples.
Definition: WaveFitter.h:207
Belle2::SVD::WaveFitter::calculateAmplitudes
void calculateAmplitudes()
Calculate amplitudes.
Definition: WaveFitter.cc:108
Belle2::SVD::WaveFitter::getDt
double getDt() const
Get sampling interval.
Definition: WaveFitter.h:157
Belle2::SVD::WaveFitter::integral12
double integral12(double lower, double upper, std::function< double(double)> f)
High-order Gauss-Legendre quadrature for likelihood integrals.
Definition: WaveFitter.cc:164
Belle2::SVD::WaveFitter::getFittedTime
double getFittedTime()
Retrieve fitted time shift value after a fit.
Definition: WaveFitter.h:100
Belle2::SVD::WaveFitter::s_minimizer_precision
static int s_minimizer_precision
minimizer precision
Definition: WaveFitter.h:189
Belle2::SVD::DefaultWave::s_default_tau
static double s_default_tau
Default waveform decay time.
Definition: WaveFitter.h:26
Belle2::SVD::WaveFitter::addData
void addData(const std::array< double, 6 > &inpData, double rmsNoise)
Add strip data to the fitter.
Definition: WaveFitter.h:75
Belle2::SVD::WaveFitter::doFit
void doFit()
Perform fit on the data.
Definition: WaveFitter.cc:66
Belle2::SVD::WaveFitter::getTimes
const std::array< double, 6 > & getTimes() const
Get sample times.
Definition: WaveFitter.h:159
Belle2::SVD::WaveFitter::getFitLikelihood
double getFitLikelihood()
Return negative log-likelihood for the fit.
Definition: WaveFitter.h:136
Belle2::SVD::WaveFitter::pSignal
double pSignal()
Calculate probability of the hit being a signal, with given priors for signal and background.
Definition: WaveFitter.cc:232
Belle2::SVD::WaveFitter::getFittedTimeError
double getFittedTimeError()
Retrieve error of time shift value after a fit.
Definition: WaveFitter.h:109
Belle2::SVD::DefaultWave::getValue
double getValue(double t) const
getValue() returns the value at desired time and time shift.
Definition: WaveFitter.h:34
Belle2::SVD::WaveFitter
Waveform fitter class.
Definition: WaveFitter.h:53
Belle2::SVD::WaveFitter::getFittedAmplitudeErrors
const std::vector< double > & getFittedAmplitudeErrors()
Retrieve errors of strip amplitudes after a fit.
Definition: WaveFitter.h:127
Belle2::SVD::WaveFitter::m_wave
wave_function_type m_wave
Waveform function.
Definition: WaveFitter.h:210
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::SVD::WaveFitter::m_hasFit
bool m_hasFit
Are fit results available?
Definition: WaveFitter.h:205
Belle2::SVD::WaveFitter::WaveFitter
WaveFitter(wave_function_type wave, std::array< double, 6 > times)
Constructor creates an empty fitter with default settings.
Definition: WaveFitter.h:65
Belle2::SVD::WaveFitter::m_times
std::array< double, 6 > m_times
Vector of sample times.
Definition: WaveFitter.h:209
Belle2::SVD::WaveFitter::wave_function_type
std::function< double(double)> wave_function_type
Function type for waveform.
Definition: WaveFitter.h:57
Belle2::SVD::WaveFitter::m_fittedTimeError
double m_fittedTimeError
Error estimate of the fitted time.
Definition: WaveFitter.h:212
Belle2::SVD::WaveFitter::getFitData
const strip_data_type & getFitData()
Get fitted values for all samples.
Definition: WaveFitter.h:150
Belle2::SVD::WaveFitter::negLogLikelihood
double negLogLikelihood(double t)
Get negative profile log-likelihood for a given time shift.
Definition: WaveFitter.cc:45
Belle2::SVD::WaveFitter::m_fittedData
strip_data_type m_fittedData
Fitted values from current fit.
Definition: WaveFitter.h:217
Belle2::SVD::DefaultWave::getTau
double getTau() const
return the decay time
Definition: WaveFitter.h:45
Belle2::SVD::DefaultWave::DefaultWave
DefaultWave(double tau=s_default_tau)
Constructor takes waveform decay time as parameter.
Definition: WaveFitter.h:24
Belle2::SVD::WaveFitter::m_noises
std::vector< double > m_noises
RMS noise for strips.
Definition: WaveFitter.h:208
Belle2::SVD::WaveFitter::m_dt
double m_dt
Time interval between samples.
Definition: WaveFitter.h:206
Belle2::SVD::WaveFitter::calculateFittedData
void calculateFittedData()
Calculate fitted data.
Definition: WaveFitter.cc:154
Belle2::SVD::WaveFitter::lrSignal
double lrSignal(double a, double b)
Calculate likelihood ratio Lsignal/Lbackground for acceptance (signal) window given as arguments.
Definition: WaveFitter.cc:250
Belle2::SVD::WaveFitter::Chi
double Chi(double t)
Get standardized chi2 for a given time shift.
Definition: WaveFitter.cc:17
Belle2::SVD::WaveFitter::setPrecision
static void setPrecision(int ndigits)
Set precision of the minimzer.
Definition: WaveFitter.cc:15
Belle2::SVD::WaveFitter::reset
void reset()
Reset fitter data.
Definition: WaveFitter.h:86
Belle2::SVD::DefaultWave::m_tau
double m_tau
Waveform decay time.
Definition: WaveFitter.h:48
Belle2::SVD::WaveFitter::m_fittedLik
double m_fittedLik
Chi2 from the current fit.
Definition: WaveFitter.h:215
Belle2::SVD::WaveFitter::integral20
double integral20(double lower, double upper, std::function< double(double)> f)
High-order Gauss-Legendre quadrature for likelihood integrals.
Definition: WaveFitter.cc:194
Belle2::SVD::DefaultWave
A functor to provide a simple model of APV25 strip response.
Definition: WaveFitter.h:18
Belle2::SVD::WaveFitter::m_fittedAmplitudeErrors
std::vector< double > m_fittedAmplitudeErrors
Fitted amplitude errors.
Definition: WaveFitter.h:214
Belle2::SVD::WaveFitter::m_ndf
int m_ndf
Degrees of freedom of the fit.
Definition: WaveFitter.h:216
Belle2::SVD::WaveFitter::m_fittedAmplitudes
std::vector< double > m_fittedAmplitudes
Fitted amplitudes of the sample.
Definition: WaveFitter.h:213