BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
Loading...
Searching...
No Matches
WfmProcessor.cxx
Go to the documentation of this file.
1
#include "
WfmProcessor.h
"
2
3
void
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);
37
if
(
fdigiPars
.isWriteWfm)
38
digi->
fWfm
= wfm;
39
40
// Prony fitting procedure
41
if
(
fdigiPars
.isfit) {
42
LOG(debug4) <<
"WfmProcessor : Filling "
<< digi->
GetClassName
() <<
". Fitting"
;
43
PsdSignalFitting::PronyFitter
Pfitter;
44
Pfitter.
Initialize
(
fdigiPars
.harmonics.size(),
fdigiPars
.harmonics.size(),
fdigiPars
.gateBegin,
45
fdigiPars
.gateEnd);
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;
56
Pfitter.
SetExternalHarmonics
(
fdigiPars
.harmonics);
57
Pfitter.
SetSignalBegin
(SignalBeg);
58
Pfitter.
CalculateFitAmplitudesFast
(
fSignalLength
,
fAZik
);
59
60
digi->
fFitIntegral
= Pfitter.
GetIntegral
(
fdigiPars
.gateBegin,
fdigiPars
.gateEnd);
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
67
if
(
fdigiPars
.isWriteWfm)
68
digi->
fFitWfm
= Pfitter.
GetFitWfm
();
69
}
70
}
71
72
void
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
94
WfmProcessor::~WfmProcessor
()
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
}
i
int i
Definition
P4_F32vec4.h:22
BmnDigiContainerTemplate
Data class for Bmn digi container template.
Definition
BmnDigiContainerTemplate.h:30
BmnDigiContainerTemplate::fFitWfm
std::vector< float > fFitWfm
Definition
BmnDigiContainerTemplate.h:104
BmnDigiContainerTemplate::fWfm
std::vector< float > fWfm
Time of maximum in fit of waveform [adc samples].
Definition
BmnDigiContainerTemplate.h:103
BmnDigiContainerTemplate::fFitTimeMax
float fFitTimeMax
Quality of waveform fit [] – good near 0.
Definition
BmnDigiContainerTemplate.h:101
BmnDigiContainerTemplate::fFitZL
float fFitZL
Amplitude from fit of waveform [adc counts].
Definition
BmnDigiContainerTemplate.h:98
BmnDigiContainerTemplate::fFitR2
float fFitR2
Energy deposition from fit of waveform [adc counts].
Definition
BmnDigiContainerTemplate.h:100
BmnDigiContainerTemplate::fAmpl
int fAmpl
Definition
BmnDigiContainerTemplate.h:91
BmnDigiContainerTemplate::fZL
int fZL
Amplitude from waveform [adc counts].
Definition
BmnDigiContainerTemplate.h:92
BmnDigiContainerTemplate::fFitIntegral
float fFitIntegral
ZeroLevel from fit of waveform [adc counts].
Definition
BmnDigiContainerTemplate.h:99
BmnDigiContainerTemplate::fFitAmpl
float fFitAmpl
Time over threshold [adc samples].
Definition
BmnDigiContainerTemplate.h:97
BmnDigiContainerTemplate::fTimeMax
int fTimeMax
Energy deposition from waveform [adc counts].
Definition
BmnDigiContainerTemplate.h:94
BmnDigiContainerTemplate::fIntegral
int fIntegral
ZeroLevel from waveform [adc counts].
Definition
BmnDigiContainerTemplate.h:93
BmnDigiContainerTemplate::GetClassName
virtual const char * GetClassName()
Class name (static).
Definition
BmnDigiContainerTemplate.h:74
PsdSignalFitting::PronyFitter
Definition
PronyFitter.h:26
PsdSignalFitting::PronyFitter::SetSignalBegin
void SetSignalBegin(int SignalBeg)
Definition
PronyFitter.cxx:89
PsdSignalFitting::PronyFitter::GetSignalMaxTime
float GetSignalMaxTime()
Definition
PronyFitter.cxx:781
PsdSignalFitting::PronyFitter::CalculateFitAmplitudesFast
void CalculateFitAmplitudesFast(int signal_length, std::complex< float > **InvHarmoMatrix)
Definition
PronyFitter.cxx:657
PsdSignalFitting::PronyFitter::SetExternalHarmonics
void SetExternalHarmonics(std::vector< std::complex< float > > harmonics)
Definition
PronyFitter.cxx:476
PsdSignalFitting::PronyFitter::GetZeroLevel
float GetZeroLevel()
Definition
PronyFitter.cxx:776
PsdSignalFitting::PronyFitter::GetRSquare
float GetRSquare(int gate_beg, int gate_end)
Definition
PronyFitter.cxx:858
PsdSignalFitting::PronyFitter::SetWaveform
void SetWaveform(std::vector< float > &Wfm, float ZeroLevel)
Definition
PronyFitter.cxx:40
PsdSignalFitting::PronyFitter::GetMaxAmplitude
float GetMaxAmplitude()
Definition
PronyFitter.cxx:803
PsdSignalFitting::PronyFitter::SetDebugMode
void SetDebugMode(bool IsDebug)
Definition
PronyFitter.h:64
PsdSignalFitting::PronyFitter::CalcSignalBeginStraight
int CalcSignalBeginStraight()
Definition
PronyFitter.cxx:66
PsdSignalFitting::PronyFitter::GetFitWfm
std::vector< float > GetFitWfm()
Definition
PronyFitter.h:88
PsdSignalFitting::PronyFitter::Initialize
void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end)
Definition
PronyFitter.cxx:21
PsdSignalFitting::PronyFitter::GetIntegral
float GetIntegral(int gate_beg, int gate_end)
Definition
PronyFitter.cxx:749
WfmProcessor::~WfmProcessor
virtual ~WfmProcessor()
Definition
WfmProcessor.cxx:94
WfmProcessor::fAZik
std::complex< float > ** fAZik
Definition
WfmProcessor.h:39
WfmProcessor::fdigiPars
struct WfmProcessor::digiPars fdigiPars
WfmProcessor::ProcessWfm
void ProcessWfm(std::vector< float > &wfm, BmnDigiContainerTemplate *digi)
Definition
WfmProcessor.cxx:3
WfmProcessor::fSignalLength
int fSignalLength
Definition
WfmProcessor.h:38
WfmProcessor::MeanRMScalc
void MeanRMScalc(std::vector< float > wfm, float *Mean, float *RMS, int begin, int end, int step=1)
Definition
WfmProcessor.cxx:72
WfmProcessor.h
sqrt
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
n
*brief user defined string literal for JSON values *sa std::size_t n
Definition
json.hpp:20362
TMath::Abs
Double_t Abs(Double_t d)
decoder
WfmProcessor.cxx
Generated on
for BmnRoot by
1.17.0