Belle II Software  release-05-02-19
SVDSimulationTools.h
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 #pragma once
12 #ifndef _SVD_SIMULATION_SIMULATIONTOOLS_H
13 #define _SVD_SIMULATION_SIMULATIONTOOLS_H
14 
15 #include <cmath>
16 #include <array>
17 #include <algorithm>
18 #include <functional>
19 #include <sstream>
20 #include <framework/gearbox/Unit.h>
21 
22 namespace Belle2 {
27  namespace SVD {
28 
29 // ==============================================================================
30 // APV25 sample data
31 // ------------------------------------------------------------------------------
32 // Constants:
34  const std::size_t nAPVSamples = 6;
35 
37  const double dt_APV = 31.44 * Unit::ns;
38 
40  typedef double apvSampleBaseType;
41  typedef std::array<apvSampleBaseType, nAPVSamples> apvSamples;
45  {{ -dt_APV, 0.0, dt_APV, 2 * dt_APV, 3 * dt_APV, 4 * dt_APV}};
46 
47 // ==============================================================================
48 // APV25 waveforms
49 // ------------------------------------------------------------------------------
50 
56  typedef std::function<double(double)> waveFunction;
57 
63  inline double w_expo(double t)
64  {
65  if (t < 0.0) return 0.0;
66  else return t * exp(1.0 - t);
67  }
68 
75  inline double w_poly3(double t)
76  {
77  if (t < 0.0 || t > 1.0)
78  return 0.0;
79  else
80  return 6.75 * t * (1.0 - t) * (1.0 - t);
81  }
82 
89  inline double w_betaprime(double t)
90  {
91  if (t < 0.0)
92  return 0.0;
93  else
94  return 149.012 * pow(t, 2) * pow(1.0 + t, -10);
95  }
96 
103  public:
106  m_samples( {{0, 0, 0, 0, 0, 0}}), m_wave(wave)
107  {}
109  void setWaveFunction(waveFunction wave) { m_wave = wave; }
111  const apvSamples& operator()(double t0, double tau)
112  {
113  std::transform(
114  apvTimeBase.begin(), apvTimeBase.end(),
115  m_samples.begin(),
116  [this, t0, tau](double t)->double { return m_wave((t - t0) / tau); }
117  );
118  return m_samples;
119  }
120  private:
123  };
124 
125 
126  // ==============================================================================
127  // The 3-samples filter
128  // ------------------------------------------------------------------------------
129 
131  template<typename T>
132  inline void zeroSuppress(T& a, double thr)
133  {
134  std::replace_if(a.begin(), a.end(), std::bind2nd(std::less<double>(), thr), 0.0);
135  }
136 
137 // ==============================================================================
138 // The 3-samples filter
139 // ------------------------------------------------------------------------------
140 
142  template<typename T>
143  inline bool pass3Samples(const T& a, double thr)
144  {
145  return (search_n(a.begin(), a.end(), 3, thr, std::greater<double>()) != a.end());
146  }
147 
148 // ==============================================================================
149 // Tau (scale) conversion and encoding
150 // ------------------------------------------------------------------------------
151 
155  inline double tau_raw2real(double raw_tau) { return 7.32313 * raw_tau; }
156 
162  class TauEncoder {
163  public:
170  TauEncoder(double min_amplitude, double max_amplitude,
171  double min_tau, double max_tau):
172  m_minAmplitude(min_amplitude), m_maxAmplitude(max_amplitude),
173  m_minTau(min_tau), m_maxTau(max_tau)
174  {
176  }
179  TauEncoder(): TauEncoder(0, 100, 0, 100) {}
180 
187  void setBounds(double min_amplitude, double max_amplitude,
188  double min_tau, double max_tau)
189  {
190  m_minAmplitude = min_amplitude;
191  m_maxAmplitude = max_amplitude;
192  m_minTau = min_tau;
193  m_maxTau = max_tau;
194  // Re-initialize the range ratio setting
196  }
197 
202  double encodeTau(double tau) const
203  { return m_minAmplitude + m_ATRatio * (tau - m_minTau); }
208  double decodeTau(double scaledTau) const
209  { return m_minTau + 1.0 / m_ATRatio * (scaledTau - m_minAmplitude); }
210 
212  void print(std::ostringstream& os) const
213  {
214  os << "TauEncoder object, "
215  << "Amplitude range: " << m_minAmplitude << " to " << m_maxAmplitude
216  << " Tau range: " << m_minTau << " to " << m_maxTau
217  << " ATRatio: " << m_ATRatio << std::endl;
218  }
219 
220  private:
221  double m_minAmplitude;
222  double m_maxAmplitude;
223  double m_minTau;
224  double m_maxTau;
225  double m_ATRatio;
226  };
227 // ------------------------------------------------------------------------------
228 
229  } // namespace SVD
231 } // namespace Belle2
232 
233 #endif
Belle2::Unit::ns
static const double ns
Standard of [time].
Definition: Unit.h:58
Belle2::SVD::TauEncoder::setBounds
void setBounds(double min_amplitude, double max_amplitude, double min_tau, double max_tau)
Set encoder baounds (e.g.
Definition: SVDSimulationTools.h:187
Belle2::SVD::waveFunction
std::function< double(double)> waveFunction
Wavefrom function type.
Definition: SVDSimulationTools.h:56
Belle2::SVD::TauEncoder
Encoder/decoder for neural network tau values.
Definition: SVDSimulationTools.h:162
Belle2::SVD::WaveGenerator::m_samples
apvSamples m_samples
for storage of computed data
Definition: SVDSimulationTools.h:121
Belle2::SVD::TauEncoder::decodeTau
double decodeTau(double scaledTau) const
Scale back a previously scaled tau value.
Definition: SVDSimulationTools.h:208
Belle2::SVD::TauEncoder::m_maxTau
double m_maxTau
upper bound of tau range
Definition: SVDSimulationTools.h:224
Belle2::SVD::TauEncoder::m_minTau
double m_minTau
lower bound of tau range
Definition: SVDSimulationTools.h:223
Belle2::SVD::apvTimeBase
const apvSamples apvTimeBase
APV time base - times for the 6 signals.
Definition: SVDSimulationTools.h:44
Belle2::SVD::WaveGenerator
Waveform generator This is a functor to calculate signal values.
Definition: SVDSimulationTools.h:102
Belle2::SVD::WaveGenerator::operator()
const apvSamples & operator()(double t0, double tau)
Operator () returns 6 APV samples.
Definition: SVDSimulationTools.h:111
Belle2::SVD::TauEncoder::encodeTau
double encodeTau(double tau) const
Return encoded value for a waveform width tau value.
Definition: SVDSimulationTools.h:202
Belle2::SVD::TauEncoder::print
void print(std::ostringstream &os) const
print tool
Definition: SVDSimulationTools.h:212
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::WaveGenerator::m_wave
waveFunction m_wave
the wave function
Definition: SVDSimulationTools.h:122
Belle2::SVD::pass3Samples
bool pass3Samples(const T &a, double thr)
pass 3-samples
Definition: SVDSimulationTools.h:143
Belle2::SVD::TauEncoder::m_ATRatio
double m_ATRatio
ratio of amplitude to tau ranges
Definition: SVDSimulationTools.h:225
Belle2::SVD::TauEncoder::TauEncoder
TauEncoder()
Default constructor Parameterless constructor to default-construct the class.
Definition: SVDSimulationTools.h:179
Belle2::SVD::TauEncoder::m_maxAmplitude
double m_maxAmplitude
upper bound of amplitdue range
Definition: SVDSimulationTools.h:222
Belle2::SVD::nAPVSamples
const std::size_t nAPVSamples
Number of APV samples.
Definition: SVDSimulationTools.h:34
Belle2::SVD::w_poly3
double w_poly3(double t)
Polynomial waveform, x.
Definition: SVDSimulationTools.h:75
Belle2::SVD::tau_raw2real
double tau_raw2real(double raw_tau)
Convert Hao's raw tau (integral, in latency units) to correct betaprime scale.
Definition: SVDSimulationTools.h:155
Belle2::SVD::w_betaprime
double w_betaprime(double t)
Beta-prime wave function, x^alpha/(1+x)^beta.
Definition: SVDSimulationTools.h:89
Belle2::SVD::TauEncoder::TauEncoder
TauEncoder(double min_amplitude, double max_amplitude, double min_tau, double max_tau)
Constructor takes amplitude and tau ranges, typically from a network xml file.
Definition: SVDSimulationTools.h:170
Belle2::SVD::zeroSuppress
void zeroSuppress(T &a, double thr)
pass zero suppression
Definition: SVDSimulationTools.h:132
Belle2::SVD::dt_APV
const double dt_APV
APV sampling time.
Definition: SVDSimulationTools.h:37
Belle2::SVD::WaveGenerator::WaveGenerator
WaveGenerator(waveFunction wave=w_betaprime)
Constructor takes waveform function.
Definition: SVDSimulationTools.h:105
Belle2::SVD::TauEncoder::m_minAmplitude
double m_minAmplitude
lower bound of amplitude range
Definition: SVDSimulationTools.h:221
Belle2::SVD::WaveGenerator::setWaveFunction
void setWaveFunction(waveFunction wave)
Set wave function.
Definition: SVDSimulationTools.h:109
Belle2::SVD::apvSampleBaseType
double apvSampleBaseType
Vector of input samples in float form.
Definition: SVDSimulationTools.h:40
Belle2::SVD::w_expo
double w_expo(double t)
Gamma waveform, x.exp(-x) This is only historically useful.
Definition: SVDSimulationTools.h:63