11 #include <svd/reconstruction/NNWaveFitTool.h>
21 double timeShift = inner_product(p.begin(), p.end(), m_binCenters.begin(), 0.0);
23 transform(m_binCenters.begin(), m_binCenters.end(), m_altBinData.begin(),
24 [timeShift](
double t)->double { return (t - timeShift) * (t - timeShift);});
25 double timeShiftError = sqrt(inner_product(p.begin(), p.end(), m_altBinData.begin(), 0.0));
26 return make_tuple(timeShift, timeShiftError);
29 tuple<double, double, double> NNWaveFitTool::getAmplitudeChi2(
const apvSamples& samples,
30 double timeShift,
double tau)
33 auto tw = m_waveGenerator(timeShift, tau);
34 double waveNorm = inner_product(
35 tw.begin(), tw.end(), tw.begin(), 0.0);
36 double amplitude = 0.0;
37 double amplitudeError = 100.0;
39 amplitude = inner_product(samples.begin(), samples.end(),
40 tw.begin(), 0.0) / waveNorm;
41 amplitudeError = 1.0 / sqrt(waveNorm);
44 transform(samples.begin(), samples.end(), tw.begin(), m_altSamples.begin(),
45 [amplitude](
double s,
double w)->double { return s - w* amplitude;});
46 size_t ndf = accumulate(samples.begin(), samples.end(),
size_t(0),
47 [](
size_t sum,
double x)->size_t { return ((x > 3) ? sum + 1 : sum); }
49 double chi2 = sqrt(1.0 / ndf * inner_product(m_altSamples.begin(), m_altSamples.end(),
50 m_altSamples.begin(), 0.0));
51 return make_tuple(amplitude, amplitudeError, chi2);
58 auto ibin = m_bins.begin();
59 double lowEdf = edf(-timeShift + *ibin++);
60 for (
auto& prob : p) {
61 double highEdf = edf(-timeShift + *ibin++);
62 prob = highEdf - lowEdf;
68 shared_ptr<nnFitterBinData> NNWaveFitTool::pFromInterval(
double left,
double right)
70 auto uniCdf = [left, right](
double x)->
double {
71 if (x < left)
return 0.0;
72 if (x > right)
return 1.0;
73 return (x - left) / (right - left);
75 auto result = shared_ptr<nnFitterBinData>(
new nnFitterBinData(m_binCenters.size()));
76 for (
size_t i = 1; i < m_bins.size(); ++i)(*result)[i - 1] = uniCdf(m_bins[i] - m_bins[i - 1]);
86 for (
size_t i2 = 1; i2 < m_binCenters.size(); ++i2)
87 result += edf1(m_binCenters[i2 - 1]) * p2[i2];