Belle II Software  release-05-02-19
NNWaveFitTool.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Peter Kvasnicka *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <svd/reconstruction/NNWaveFitTool.h>
12 #include <memory>
13 
14 using namespace std;
15 using namespace Belle2;
16 using namespace Belle2::SVD;
17 
18 tuple<double, double> NNWaveFitTool::getTimeShift(const nnFitterBinData& p)
19 {
20  // calculate time estimate and error
21  double timeShift = inner_product(p.begin(), p.end(), m_binCenters.begin(), 0.0);
22  // use altBinData storage to sum squared residuals
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);
27 }
28 
29 tuple<double, double, double> NNWaveFitTool::getAmplitudeChi2(const apvSamples& samples,
30  double timeShift, double tau)
31 {
32  // Amplitude
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;
38  if (waveNorm > 0.0) {
39  amplitude = inner_product(samples.begin(), samples.end(),
40  tw.begin(), 0.0) / waveNorm;
41  amplitudeError = 1.0 / sqrt(waveNorm);
42  }
43  // Chi2
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); }
48  ) - 2;
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);
52 }
53 
54 void NNWaveFitTool::shiftInTime(nnFitterBins& p, double timeShift)
55 {
56  // Calculate at bin boundaries shifted by timeShift, new p's are differences.
57  EmpiricalDistributionFunction edf(p, m_bins);
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;
63  lowEdf = highEdf;
64  }
65  normalize(p);
66 }
67 
68 shared_ptr<nnFitterBinData> NNWaveFitTool::pFromInterval(double left, double right)
69 {
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);
74  };
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]);
77  return result;
78 }
79 
80 double NNWaveFitTool::pLessThan(nnFitterBinData p1, nnFitterBinData p2)
81 {
82  // The formula is integral(P1(x)F2(x)dx.
83  // We do sum(F1[i]P[i]
84  EmpiricalDistributionFunction edf1(p1, m_bins);
85  double result = 0;
86  for (size_t i2 = 1; i2 < m_binCenters.size(); ++i2)
87  result += edf1(m_binCenters[i2 - 1]) * p2[i2];
88  return result;
89 }
Belle2::SVD::EmpiricalDistributionFunction
Empirical distribution function object is basic for mainpulation of probabilities.
Definition: NNWaveFitTool.h:41
Belle2::SVD::nnFitterBins
std::vector< double > nnFitterBins
Vector of bin edges, nnFitterBinData.size() + 1.
Definition: NNWaveFitTool.h:35
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::SVD::apvSamples
std::array< apvSampleBaseType, nAPVSamples > apvSamples
vector od apvSample BaseType objects
Definition: SVDSimulationTools.h:41
Belle2::SVD
Namespace to encapsulate code needed for simulation and reconstrucion of the SVD.
Definition: GeoSVDCreator.h:35
Belle2::SVD::nnFitterBinData
std::vector< double > nnFitterBinData
Vector of values defined for bins, such as bin times or bin probabilities.
Definition: NNWaveFitTool.h:32