Belle II Software  release-05-01-25
TOPTemplateFitter.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2010 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Tobias Weber *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <top/utilities/TOPTemplateFitter.h>
12 #include <top/geometry/TOPGeometryPar.h>
13 #include <framework/logging/Logger.h>
14 
15 #include <algorithm>
16 
17 using namespace Belle2;
18 using namespace Belle2::TOP;
19 
20 using namespace std;
21 
26 std::vector<double> TOPTemplateFitter::s_templateSamples;
29 
31  const TOPSampleTimes& sampleTimes,
32  const double averageRMS)
33  : m_wf(wf), m_sampleTimes(sampleTimes), m_averageRMS(averageRMS)
34 {
35  m_chisq = -1.;
38  }
39 }
40 
42 {
43  s_templateParameters = params;
45 }
46 
48 {
49  s_totalTemplateSamples = nSamples;
51 
52 }
53 
55 {
56  s_templateResolution = resolution;
57  s_fineOffsetRange = resolution * 5;
59 }
60 
62 {
63  s_templateSamples.clear();
65  B2FATAL("rising edge of template function invalid!");
66  }
67 
68  const auto* geo = TOPGeometryPar::Instance()->getGeometry();
69  const auto& signalShape = geo->getSignalShape();
70  const auto& tdc = geo->getNominalTDC();
71  const double dt = tdc.getSampleWidth();
72 
73  for (double x = 0; x < s_totalTemplateSamples; x += 1. / s_templateResolution) {
74  s_templateSamples.push_back(s_templateParameters.amplitude * signalShape.getValue((x - s_templateParameters.risingEdge)*dt));
75  }
76 
77  s_templateReInitialize = false;
78 }
79 
80 void TOPTemplateFitter::performTemplateFit(const double risingEdgeStart,
81  const double fitRange)
82 {
85  }//do this here to make sure nobody changed template settings? -> thread safety?
86 
87  //access time base correction and calculate correction to waveform sample number
88  vector<short> pedestals(m_wf.getSize(), m_averageRMS);//for now assume constant pedestals for TOP
89  vector<float> timingCorrection(m_wf.getSize(),
90  0.);//timing correction, should be relative to each sample in in units of samples -> pick correct template sample
91 
92  //perform template fit
93  m_chisq_vec.clear();
94  m_chisq = 1e6;
95  PerformTemplateFitMinimize(m_wf.getWaveform(), pedestals, timingCorrection, risingEdgeStart, fitRange);
96 
97  //use paraboic shape of chi^2 distribution to improve fit result
98  if (s_useParabola) {
99  auto it = std::min_element(std::begin(m_chisq_vec), std::end(m_chisq_vec));
100  int minidx = std::distance(std::begin(m_chisq_vec), it);
101  if (minidx > 0 && minidx < (int)m_chisq_vec.size() - 1) {
102  Point vertex;
103  CalculateParabolaVertex({ -1, m_chisq_vec[minidx - 1]}, {0, m_chisq_vec[minidx]}, {1, m_chisq_vec[minidx + 1]}, vertex);
104  m_chisq = vertex.second;
105  m_result.risingEdge += vertex.first / s_templateResolution;
106  }
107  }
108 }
109 
110 void TOPTemplateFitter::CalculateParabolaVertex(const Point& p1, const Point& p2, const Point& p3, Point& vertex)
111 {
112  double denom = (p1.first - p2.first) * (p1.first - p3.first) * (p2.first - p3.first);
113  double a = (p3.first * (p2.second - p1.second) + p2.first * (p1.second - p3.second) + p1.first *
114  (p3.second - p2.second)) / denom;
115  double b = (p3.first * p3.first * (p1.second - p2.second) + p2.first * p2.first * (p3.second - p1.second)
116  + p1.first * p1.first * (p2.second - p3.second)) / denom;
117  double c = (p2.first * p3.first * (p2.first - p3.first) * p1.second + p3.first * p1.first * (p3.first - p1.first) * p2.second
118  + p1.first * p2.first * (p1.first - p2.first) * p3.second) / denom;
119 
120  vertex.first = -b / (2 * a);
121  vertex.second = c - b * b / (4 * a);
122 }
123 
124 void TOPTemplateFitter::PerformTemplateFitMinimize(const std::vector<short>& samples, const std::vector<short>& pedestals,
125  const std::vector<float>& timingCorrection, const double risingEdgeCFD, const double fitRange)
126 {
127  if (samples.size() != pedestals.size() || samples.size() != timingCorrection.size()) {
128  B2FATAL("Size of sample, pedestal and timing correction vectors has to be equal!");
129  }
130 
131 
132  MinimizationSums sums;
133  FitResult result;
134  int initialOffset = risingEdgeCFD - s_templateParameters.risingEdge;
135  //offset search loop
136  for (int fineOffset = -s_fineOffsetRange; fineOffset < s_fineOffsetRange; ++fineOffset) {
137  sums.clear();
138  int totalTemplateOffset = initialOffset * s_templateResolution + fineOffset;
139  for (int signalSampleIndex = risingEdgeCFD - fitRange; signalSampleIndex < risingEdgeCFD + fitRange; ++signalSampleIndex) {
140  if (signalSampleIndex < 0 || signalSampleIndex > (int)samples.size() - 1) continue;
141  int templateIndex = signalSampleIndex * s_templateResolution - totalTemplateOffset + timingCorrection[signalSampleIndex];
142  if (templateIndex < 0 || templateIndex > (int) s_templateSamples.size() - 1) continue;
143  double weight = 1. / (pedestals[signalSampleIndex] * pedestals[signalSampleIndex]);
144  double Sx = weight * s_templateSamples[templateIndex];
145  double Sy = weight * samples[signalSampleIndex];
146  sums.S1 += weight;
147  sums.Sx += Sx;
148  sums.Sy += Sy;
149  sums.Sxx += Sx * s_templateSamples[templateIndex];
150  sums.Sxy += Sy * s_templateSamples[templateIndex];
151  sums.Syy += Sy * samples[signalSampleIndex];
152  }
153  double chisq = ComputeMinimizedParametersAndChisq(sums, result);
154  m_chisq_vec.push_back(chisq);
155  if (chisq < m_chisq) { //save minimal chisq result
156  m_chisq = chisq;
157  m_result = result;
158  m_result.risingEdge = totalTemplateOffset;
159  }
160  }
161  //template offset back to sample space and scale amplitude
165 }
166 
168 {
169  const double determinant = sums.S1 * sums.Sxx - sums.Sx * sums.Sx;
170  result.amplitude = (-sums.Sx * sums.Sy + sums.S1 * sums.Sxy) / determinant;
171  result.backgroundOffset = (sums.Sxx * sums.Sy - sums.Sx * sums.Sxy) / determinant;
172  result.amplitudeError = sums.S1 / determinant;
173  result.backgroundOffsetError = sums.Sxx / determinant;
174  return sums.Syy - result.backgroundOffset * sums.Sy - result.amplitude * sums.Sxy;
175 }
Belle2::TOP::TOPTemplateFitter::MinimizationSums::clear
void clear()
set sums used during template fit to initial values
Definition: TOPTemplateFitter.h:91
Belle2::TOP::TOPTemplateFitter::MinimizationSums::Sx
double Sx
sum of template*weight
Definition: TOPTemplateFitter.h:82
Belle2::TOP::TOPTemplateFitter::FitResult::risingEdge
double risingEdge
fitted rising edge
Definition: TOPTemplateFitter.h:62
Belle2::TOP::TOPTemplateFitter::TOPTemplateFitter
TOPTemplateFitter(const TOPRawWaveform &wf, const TOPSampleTimes &sampleTimes, const double averageRMS)
full constructor
Definition: TOPTemplateFitter.cc:30
Belle2::TOP::TOPTemplateFitter::s_templateSamples
static std::vector< double > s_templateSamples
precomputed template samples
Definition: TOPTemplateFitter.h:234
Belle2::TOP::TOPTemplateFitter::performTemplateFit
void performTemplateFit(const double risingEdgeStart, const double fitRange)
Prepares data and performs the template fit in sample space.
Definition: TOPTemplateFitter.cc:80
Belle2::TOP::TOPTemplateFitter::ComputeMinimizedParametersAndChisq
double ComputeMinimizedParametersAndChisq(const MinimizationSums &sums, FitResult &result)
Compute the minimized parameters and chi square value.
Definition: TOPTemplateFitter.cc:167
Belle2::TOP::TOPTemplateFitter::s_totalTemplateSamples
static int s_totalTemplateSamples
number of samples used for template
Definition: TOPTemplateFitter.h:231
Belle2::TOP::TOPTemplateFitter::setTemplateSamples
static void setTemplateSamples(int nSamples)
Set the total number of template samples.
Definition: TOPTemplateFitter.cc:47
Belle2::TOP::TOPTemplateFitter::TemplateParameters::risingEdge
double risingEdge
rising edge position of template in samples
Definition: TOPTemplateFitter.h:51
Belle2::TOP::TOPTemplateFitter::MinimizationSums
Variables used during template fit minimization.
Definition: TOPTemplateFitter.h:80
Belle2::TOP::TOPTemplateFitter::FitResult::amplitudeError
double amplitudeError
fitted amplitude error
Definition: TOPTemplateFitter.h:59
Belle2::TOPRawWaveform::getSize
unsigned getSize() const
Returns waveform size.
Definition: TOPRawWaveform.h:225
Belle2::TOP::TOPTemplateFitter::TemplateParameters::amplitude
double amplitude
amplitude of template function
Definition: TOPTemplateFitter.h:50
Belle2::TOPGeometry::getSignalShape
const TOPSignalShape & getSignalShape() const
Returns single photon signal shape.
Definition: TOPGeometry.h:234
Belle2::TOP::TOPTemplateFitter::MinimizationSums::Syy
double Syy
sum of signal sample * signal sample * weight
Definition: TOPTemplateFitter.h:86
Belle2::TOP::TOPTemplateFitter::CalculateParabolaVertex
void CalculateParabolaVertex(const Point &p1, const Point &p2, const Point &p3, Point &vertex)
Calculate vertex coordinates of parabola given three data points.
Definition: TOPTemplateFitter.cc:110
Belle2::TOP::TOPTemplateFitter::MinimizationSums::Sxy
double Sxy
sum of signal sample *template*weight
Definition: TOPTemplateFitter.h:85
Belle2::TOPRawWaveform::getWaveform
const std::vector< short > & getWaveform() const
Returns waveform.
Definition: TOPRawWaveform.h:231
Belle2::TOP::TOPTemplateFitter::MinimizationSums::Sxx
double Sxx
sum of template*template*weight
Definition: TOPTemplateFitter.h:83
Belle2::TOP::TOPTemplateFitter::MinimizationSums::S1
double S1
sum of sample weights
Definition: TOPTemplateFitter.h:81
Belle2::TOPRawWaveform
Class to store raw data waveforms.
Definition: TOPRawWaveform.h:34
Belle2::TOP::TOPTemplateFitter::m_wf
const TOPRawWaveform m_wf
raw sampled waveforms
Definition: TOPTemplateFitter.h:227
Belle2::TOP::TOPTemplateFitter::FitResult
structure holding values from template fit
Definition: TOPTemplateFitter.h:57
Belle2::TOP::TOPTemplateFitter::s_templateResolution
static int s_templateResolution
resolution of template with respect to normal sample spacing
Definition: TOPTemplateFitter.h:232
Belle2::TOP::TOPGeometryPar::Instance
static TOPGeometryPar * Instance()
Static method to obtain the pointer to its instance.
Definition: TOPGeometryPar.cc:45
Belle2::TOP::TOPTemplateFitter::PerformTemplateFitMinimize
void PerformTemplateFitMinimize(const std::vector< short > &samples, const std::vector< short > &pedestals, const std::vector< float > &timingCorrection, const double risingEdgeCFD, const double fitRange)
performs the template fit
Definition: TOPTemplateFitter.cc:124
Belle2::TOP::TOPTemplateFitter::InitializeTemplateFit
static void InitializeTemplateFit()
Intializes the template fit using default values.
Definition: TOPTemplateFitter.cc:61
Belle2::TOPSampleTimes
Calibration constants of a singe ASIC channel: time axis (sample times)
Definition: TOPSampleTimes.h:34
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TOP::TOPTemplateFitter::m_averageRMS
const double m_averageRMS
average RMS of waveform samples, no database for this
Definition: TOPTemplateFitter.h:229
Belle2::TOP::TOPTemplateFitter::FitResult::amplitude
double amplitude
fitted amplitude
Definition: TOPTemplateFitter.h:58
Belle2::TOP::TOPTemplateFitter::setTemplateParameters
static void setTemplateParameters(const TemplateParameters &params)
Sets the template parameters.
Definition: TOPTemplateFitter.cc:41
Belle2::TOP::TOPTemplateFitter::s_useParabola
static bool s_useParabola
try improving fit by making use of parabolic shape of chisq values
Definition: TOPTemplateFitter.h:237
Belle2::TOP::TOPTemplateFitter::s_templateParameters
static TemplateParameters s_templateParameters
parameters used for the template calculation
Definition: TOPTemplateFitter.h:233
Belle2::TOP::TOPTemplateFitter::s_fineOffsetRange
static int s_fineOffsetRange
range for offset between template and signal
Definition: TOPTemplateFitter.h:235
Belle2::TOP::TOPTemplateFitter::m_result
FitResult m_result
fit result from template fit
Definition: TOPTemplateFitter.h:240
Belle2::TOP::TOPTemplateFitter::TemplateParameters
Parameters of the template function.
Definition: TOPTemplateFitter.h:49
Belle2::TOP::TOPTemplateFitter::setTemplateResolution
static void setTemplateResolution(int resolution)
Set the template resolution.
Definition: TOPTemplateFitter.cc:54
Belle2::TOP::TOPGeometryPar::getGeometry
const TOPGeometry * getGeometry() const
Returns pointer to geometry object using Basf2 units.
Definition: TOPGeometryPar.cc:167
Belle2::TOP::TOPTemplateFitter::s_templateReInitialize
static bool s_templateReInitialize
flag showing that the template samples have to be recomputed
Definition: TOPTemplateFitter.h:236
Belle2::TOP::TOPTemplateFitter::MinimizationSums::Sy
double Sy
sum of signal sample * weight
Definition: TOPTemplateFitter.h:84
Belle2::TOP::TOPTemplateFitter::m_chisq_vec
std::vector< double > m_chisq_vec
all computed chi square values from template fit
Definition: TOPTemplateFitter.h:242
Belle2::TOP::TOPTemplateFitter::m_chisq
double m_chisq
chi square value from template fit
Definition: TOPTemplateFitter.h:241