11 #include <top/dbobjects/TOPSignalShape.h>
12 #include <framework/logging/Logger.h>
23 TOPSignalShape::TOPSignalShape(std::vector<double> shape,
double timeBin,
double tau,
24 double pole1,
double pole2):
25 m_shape(shape), m_tau(tau), m_pole1(pole1), m_pole2(pole2)
32 for (
unsigned i = 0; i < shape.size(); i++) {
33 if (shape[i] > shape[samplePeak]) samplePeak = i;
36 TSpline5 spline(
"spline",
m_tmin,
m_tmax, shape.data(), shape.size());
37 double t1 =
m_tmin + (samplePeak - 1) * timeBin;
38 double t2 =
m_tmin + (samplePeak + 1) * timeBin;
39 for (
int i = 0; i < 20; i++) {
40 double t = (t1 + t2) / 2;
41 if (spline.Derivative(t) > 0) {
47 double vPeak = spline.Eval((t1 + t2) / 2);
51 for (
auto& value :
m_shape) value /= vPeak;
55 auto sampleRise = samplePeak;
56 while (sampleRise >= 0 and
m_shape[sampleRise] > 0.5) sampleRise--;
57 t1 =
m_tmin + sampleRise * timeBin;
58 t2 =
m_tmin + (sampleRise + 1) * timeBin;
59 for (
int i = 0; i < 20; i++) {
60 double t = (t1 + t2) / 2;
61 if (spline.Eval(t) < vPeak / 2) {
67 double crossingTime = (t1 + t2) / 2;
80 B2ERROR(
"TOPSignalShape::getValue: object not initialized");
86 std::vector<double> shape(
m_shape);
88 shape.data(), shape.size());