BmnRoot
Loading...
Searching...
No Matches
WfmProcessor.cxx
Go to the documentation of this file.
1#include "WfmProcessor.h"
2
3void WfmProcessor::ProcessWfm(std::vector<float>& wfm, BmnDigiContainerTemplate* digi)
4{
5 assert(fdigiPars.gateBegin > 0 && fdigiPars.gateEnd > 0);
6 if (fdigiPars.gateBegin >= (int)wfm.size()) {
7 LOG(error) << "WfmProcessor : Filling " << digi->GetClassName() << ". waveform too short: accessing "
8 << fdigiPars.gateBegin << "/" << wfm.size() << ". Check calibration file ";
9 fdigiPars.gateBegin = wfm.size() - 1;
10 }
11 if (fdigiPars.gateEnd >= (int)wfm.size()) {
12 LOG(error) << "WfmProcessor : Filling " << digi->GetClassName() << ". waveform too short: accessing "
13 << fdigiPars.gateEnd << "/" << wfm.size() << ". Check calibration file ";
14 fdigiPars.gateEnd = wfm.size() - 1;
15 }
16
17 // Invert
18 if (fdigiPars.doInvert) {
19 LOG(debug4) << "WfmProcessor : Filling " << digi->GetClassName() << ". Inverting";
20 float myconstant{-1.0};
21 std::transform(wfm.begin(), wfm.end(), wfm.begin(),
22 std::bind(std::multiplies<float>(), myconstant, std::placeholders::_1));
23 }
24
25 // Zero level calculation
26 LOG(debug4) << "WfmProcessor : Filling " << digi->GetClassName() << ". ZL calc";
27 float ZL = std::accumulate(wfm.begin(), wfm.begin() + fdigiPars.gateBegin, 0.0) / fdigiPars.gateBegin;
28 std::transform(wfm.begin(), wfm.end(), wfm.begin(), [ZL](float value) { return value - ZL; });
29 digi->fZL = (int)ZL;
30
31 // MAX and Integral calculation including borders. ZL removed
32 LOG(debug4) << "WfmProcessor : Filling " << digi->GetClassName() << ". MAX & INT search";
33 digi->fIntegral = (int)std::accumulate(wfm.begin() + fdigiPars.gateBegin, wfm.begin() + fdigiPars.gateEnd + 1, 0.0);
34 auto const max_iter = std::max_element(wfm.begin() + fdigiPars.gateBegin, wfm.begin() + fdigiPars.gateEnd + 1);
35 digi->fAmpl = (int)*max_iter;
36 digi->fTimeMax = (int)std::distance(wfm.begin(), max_iter);
38 digi->fWfm = wfm;
39
40 // Prony fitting procedure
41 if (fdigiPars.isfit) {
42 LOG(debug4) << "WfmProcessor : Filling " << digi->GetClassName() << ". Fitting";
46 Pfitter.SetDebugMode(0);
47 Pfitter.SetWaveform(wfm, 0.0);
48 // Pfitter.ResetAmplitudes();
49 int SignalBeg = Pfitter.CalcSignalBeginStraight();
50 if (SignalBeg < 0)
51 return;
52 if (static_cast<std::size_t>(SignalBeg) > wfm.size())
53 return;
54 if (static_cast<std::size_t>(SignalBeg + fSignalLength) > wfm.size())
55 SignalBeg = fdigiPars.gateBegin;
57 Pfitter.SetSignalBegin(SignalBeg);
59
61 digi->fFitAmpl = Pfitter.GetMaxAmplitude() - Pfitter.GetZeroLevel();
62 float fit_R2 = Pfitter.GetRSquare(fdigiPars.gateBegin, fdigiPars.gateEnd);
63 digi->fFitR2 = (fit_R2 > 2.0) ? 2.0 : fit_R2;
64 digi->fFitZL = Pfitter.GetZeroLevel();
65 digi->fFitTimeMax = Pfitter.GetSignalMaxTime();
66
68 digi->fFitWfm = Pfitter.GetFitWfm();
69 }
70}
71
72void WfmProcessor::MeanRMScalc(std::vector<float> wfm, float* Mean, float* RMS, int begin, int end, int step)
73{
74 begin = (begin < 0) ? 0 : begin;
75 if (begin > end) {
76 float swap = end;
77 end = begin;
78 begin = swap;
79 };
80 step = TMath::Abs(step);
81 *Mean = *RMS = 0.;
82 int Delta = 0;
83 for (int n = begin; n <= end; n += step) {
84 *Mean += wfm[n];
85 Delta++;
86 }
87 *Mean /= (float)Delta;
88 for (int n = begin; n <= end; n += step)
89 *RMS += (wfm[n] - *Mean) * (wfm[n] - *Mean);
90 *RMS = sqrt(*RMS / ((float)Delta));
91 // printf("AMPL %.2f, RMS %.2f\n",*Mean,*RMS);
92}
93
95{
96 if (fdigiPars.isfit && fAZik) {
97 int model_order = fdigiPars.harmonics.size() + 1;
98 for (int i = 0; i < model_order; i++)
99 delete[] fAZik[i];
100 delete[] fAZik;
101 }
102}
friend F32vec4 sqrt(const F32vec4 &a)
Definition P4_F32vec4.h:34
int i
Definition P4_F32vec4.h:22
Data class for Bmn digi container template.
std::vector< float > fWfm
Time of maximum in fit of waveform [adc samples].
float fFitTimeMax
Quality of waveform fit [] – good near 0.
float fFitZL
Amplitude from fit of waveform [adc counts].
float fFitR2
Energy deposition from fit of waveform [adc counts].
int fZL
Amplitude from waveform [adc counts].
float fFitIntegral
ZeroLevel from fit of waveform [adc counts].
float fFitAmpl
Time over threshold [adc samples].
int fTimeMax
Energy deposition from waveform [adc counts].
int fIntegral
ZeroLevel from waveform [adc counts].
virtual const char * GetClassName()
Class name (static)
void SetSignalBegin(int SignalBeg)
void CalculateFitAmplitudesFast(int signal_length, std::complex< float > **InvHarmoMatrix)
void SetExternalHarmonics(std::vector< std::complex< float > > harmonics)
float GetRSquare(int gate_beg, int gate_end)
void SetWaveform(std::vector< float > &Wfm, float ZeroLevel)
void SetDebugMode(bool IsDebug)
Definition PronyFitter.h:63
std::vector< float > GetFitWfm()
Definition PronyFitter.h:87
void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end)
float GetIntegral(int gate_beg, int gate_end)
virtual ~WfmProcessor()
std::complex< float > ** fAZik
struct WfmProcessor::digiPars fdigiPars
void ProcessWfm(std::vector< float > &wfm, BmnDigiContainerTemplate *digi)
std::vector< std::complex< float > > harmonics