Belle II Software  release-05-01-25
fitter_test.cc
1 #include <iostream>
2 #include <iterator>
3 #include <string>
4 #include <vector>
5 #include <tuple>
6 #include <algorithm>
7 #include <random>
8 #include <chrono>
9 
10 #include <svd/reconstruction/NNWaveFitter.h>
11 #include <svd/reconstruction/NNWaveFitTool.h>
12 #include <svd/simulation/SVDSimulationTools.h>
13 
14 using namespace std;
15 using namespace Belle2::SVD;
16 
17 int main()
18 {
19  // Initialize random seed generation
20  typedef chrono::high_resolution_clock myclock;
21  myclock::time_point beginning = myclock::now();
22 
23 // Create fitter
24  NNWaveFitter fitter("svd/data/SVDTimeNet.xml");
25  auto fitTool = fitter.getFitTool();
26 
27  // Initialize random generators
28  myclock::duration d = myclock::now() - beginning;
29  unsigned seed = d.count();
30  default_random_engine randn(seed);
31  normal_distribution<double> gaussian(0.0, 1.0);
32 
33  // Generate samples
34  auto generator = WaveGenerator();
35  size_t n_amplitudes = 3;
36  vector< tuple<double, double, double> > components(n_amplitudes);
37  components = {{6, -20, 300}, {6, -20, 300}, {6, -20, 300}};
38  vector<apvSamples> samples_arr(n_amplitudes);
39  vector<shared_ptr<nnFitterBinData> > parr(n_amplitudes);
40  nnFitterBinData p(fitter.getBinCenters().size());
41  fill(p.begin(), p.end(), double(1.0));
42  double amplitude, t0, width;
43  double t0_fit, t0_err;
44  double a_fit, a_err, chi2;
45  cout << " >>>>>>>>>> SEPARRATE COMPONENTS <<<<<<<<<< " << endl;
46  for (size_t icomp = 0; icomp < n_amplitudes; ++icomp) {
47  tie(amplitude, t0, width) = components[icomp];
48  apvSamples u = generator(t0, width);
49  do {
50  transform(u.begin(), u.end(), samples_arr[icomp].begin(),
51  [&](double x)->double {
52  double w = amplitude * x + gaussian(randn);
53  return (int(w) > 3 ? int(w) : 0.0);
54  });
55  } while (!pass3Samples(samples_arr[icomp], 3));
56  copy(samples_arr[icomp].begin(), samples_arr[icomp].end(), ostream_iterator<double>(cout, " "));
57  cout << endl;
58  parr[icomp] = fitter.getFit(samples_arr[icomp], width);
59  copy(parr[icomp]->begin(), parr[icomp]->end(), ostream_iterator<double>(cout, " "));
60  cout << endl;
61  fitTool.multiply(p, *(parr[icomp]));
62  tie(t0_fit, t0_err) = fitTool.getTimeShift(*(parr[icomp]));
63  tie(a_fit, a_err, chi2) = fitTool.getAmplitudeChi2(u, t0_fit, width);
64  cout << "Component: " << icomp << endl;
65  cout << "Time: " << t0_fit << " +/- " << t0_err << endl;
66  cout << "Amplitude: " << a_fit << " +/- " << a_err << endl;
67  cout << "Chi-square " << chi2 << endl;
68  }
69  cout << " >>>>>>>>>> POOLED COMPONENTS <<<<<<<<<< " << endl;
70  tie(t0_fit, t0_err) = fitTool.getTimeShift(p);
71  cout << "Time: " << t0_fit << " +/- " << t0_err << endl;
72  for (size_t icomp = 0; icomp < n_amplitudes; ++icomp) {
73  tie(a_fit, a_err, chi2) = fitTool.getAmplitudeChi2(samples_arr[icomp], t0_fit, width);
74  cout << "Component: " << icomp << endl;
75  cout << "Amplitude: " << a_fit << " +/- " << a_err << endl;
76  cout << "Chi-square " << chi2 << endl;
77  }
78  cout << " >>>>>>>>>> SUM OF SIGNALS COMPONENTS <<<<<<<<<< " << endl;
79  width = 300;
80  apvSamples u_sum;
81  fill(u_sum.begin(), u_sum.end(), double(0.0));
82  for (size_t i = 0; i < nAPVSamples; ++i)
83  for (size_t j = 0; j < n_amplitudes; ++j)
84  u_sum[i] += samples_arr[j][i];
85  shared_ptr<nnFitterBinData> p_sum = fitter.getFit(u_sum, width);
86  tie(t0_fit, t0_err) = fitTool.getTimeShift(*p_sum);
87  cout << "Time: " << t0_fit << " +/- " << t0_err << endl;
88  for (size_t icomp = 0; icomp < n_amplitudes; ++icomp) {
89  tie(a_fit, a_err, chi2) = fitTool.getAmplitudeChi2(samples_arr[icomp], t0_fit, width);
90  cout << "Component: " << icomp << endl;
91  cout << "Amplitude: " << a_fit << " +/- " << a_err << endl;
92  cout << "Chi-square " << chi2 << endl;
93  }
94  return 0;
95 }
Belle2::SVD::WaveGenerator
Waveform generator This is a functor to calculate signal values.
Definition: SVDSimulationTools.h:102
Belle2::SVD::NNWaveFitter
The class uses a neural network to find a probability distribution of arrival times for a sextet of A...
Definition: NNWaveFitter.h:63
main
int main(int argc, char **argv)
Run all tests.
Definition: test_main.cc:77
Belle2::SVD::apvSamples
std::array< apvSampleBaseType, nAPVSamples > apvSamples
vector od apvSample BaseType objects
Definition: SVDSimulationTools.h:41
Belle2::SVD::pass3Samples
bool pass3Samples(const T &a, double thr)
pass 3-samples
Definition: SVDSimulationTools.h:143
Belle2::SVD
Namespace to encapsulate code needed for simulation and reconstrucion of the SVD.
Definition: GeoSVDCreator.h:35
Belle2::SVD::nAPVSamples
const std::size_t nAPVSamples
Number of APV samples.
Definition: SVDSimulationTools.h:34
prepareAsicCrosstalkSimDB.u
u
merged u1 and u2
Definition: prepareAsicCrosstalkSimDB.py:46
Belle2::SVD::nnFitterBinData
std::vector< double > nnFitterBinData
Vector of values defined for bins, such as bin times or bin probabilities.
Definition: NNWaveFitTool.h:32