BmnRoot
Loading...
Searching...
No Matches
PronyFitter.h
Go to the documentation of this file.
1/* Copyright (C) 2020-2021 Institute for Nuclear Research, Moscow
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Nikolay Karpushkin [committer] */
4
11#ifndef PronyFitter_H
12#define PronyFitter_H
13
14#include <algorithm> // for reverse
15#include <complex> // for complex numbers
16#include <cstring> // for memcpy
17#include <iostream>
18#include <vector> // for std::vector
19#include <numeric>
20
21#include <stdint.h> // for uint16_t
22#include <stdio.h> // for printf
23
24namespace PsdSignalFitting {
26
27public:
30 PronyFitter(int model_order, int exponent_number, int gate_beg, int gate_end);
31
32 void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end);
33
35 ~PronyFitter() { Clear(); };
36
37 float GoToLevel(float Level, int *point, int iterator, int iLastPoint);
39 int CalcSignalBegin(float front_time_beg_03, float front_time_end);
40 int ChooseBestSignalBeginHarmonics(int first_sample, int last_sample);
41 int ChooseBestSignalBegin(int first_sample, int last_sample);
42 void MakePileUpRejection(int time_max);
45 void MakeInvHarmoMatrix(int signal_length, std::complex<float> **output);
46 void MakeZpowerMatrix(int signal_length, std::complex<float> **output);
47 void ResetAmplitudes();
48 void CalculateFitAmplitudesFast(int signal_length, std::complex<float> **InvHarmoMatrix);
49 int ChooseBestSignalBeginFast(int first_sample, int last_sample, int signal_length, std::complex<float> **InvHarmoMatrix);
50 int SearchSignalBeginByHarmo(int first_sample, int last_sample, int signal_length, std::complex<float> **Zpower);
51 void SolveSLEGauss(float *x, float **r, float *b, int n);
52 void SolveSLEGauss(std::complex<float> *x, std::complex<float> **r,
53 std::complex<float> *b, int n);
54 void SolveSLECholesky(float *x, float **a, float *b, int n);
55 void CovarianceQRmod(float &rho_f, std::vector<float> &a_f, float &rho_b,
56 std::vector<float> &a_b);
57 void CovarianceDirect(float &rho_f, std::vector<float> &a_f, float &rho_b,
58 std::vector<float> &a_b);
59 float LevelBy2Points(float X1, float Y1, float X2, float Y2, float Y0);
60 //
61 // Setters
62 //
63 void SetDebugMode(bool IsDebug) { fIsDebug = IsDebug; };
64 void SetWaveform(std::vector<float> &Wfm, float ZeroLevel);
65 void SetSignalBegin(int SignalBeg);
66 void SetHarmonics(std::complex<float> *z);
67 void SetExternalHarmonics(std::vector<std::complex<float>> harmonics);
68 //
69 // Getters
70 //
71 std::complex<float> *GetHarmonics();
72 std::complex<float> *GetAmplitudes();
73 float GetIntegral(int gate_beg, int gate_end);
74 float GetFitValue(int sample_number);
75 float GetFitValue(float x);
76 float GetZeroLevel();
77 float GetX(float level, int first_sample, int last_sample);
78 float GetX(float level, int first_sample, int last_sample, float step);
79 float GetRSquare(int gate_beg, int gate_end);
80 float GetRSquareSignal();
81 float GetChiSquare(int gate_beg, int gate_end, int time_max);
82 float GetDeltaInSample(int sample);
84 float GetSignalMaxTime();
85 float GetMaxAmplitude();
87 std::vector<float> GetFitWfm() { return fFitWfm; }
88
89private:
90
91 void AllocData();
92 void DeleteData();
93 void Clear();
94
95 bool fIsDebug = false;
96 int fModelOrder;
97 int fExpNumber;
98 int fGateBeg;
99 int fGateEnd;
100 int fSampleTotal;
101
102 int fSignalBegin;
103 int fTotalPolRoots;
104
105 std::vector<float> fWfm;
106 float fZeroLevel;
107 std::complex<float> *fz = nullptr;
108 std::complex<float> *fh = nullptr;
109 std::vector<float> fFitWfm;
110 float fFitZeroLevel;
111};
112} // namespace PsdSignalFitting
113
114#endif
void CovarianceDirect(float &rho_f, std::vector< float > &a_f, float &rho_b, std::vector< float > &a_b)
void SetSignalBegin(int SignalBeg)
int SearchSignalBeginByHarmo(int first_sample, int last_sample, int signal_length, std::complex< float > **Zpower)
void SolveSLEGauss(float *x, float **r, float *b, int n)
void CalculateFitAmplitudesFast(int signal_length, std::complex< float > **InvHarmoMatrix)
void SetExternalHarmonics(std::vector< std::complex< float > > harmonics)
void CovarianceQRmod(float &rho_f, std::vector< float > &a_f, float &rho_b, std::vector< float > &a_b)
float GetRSquare(int gate_beg, int gate_end)
float GoToLevel(float Level, int *point, int iterator, int iLastPoint)
void SetHarmonics(std::complex< float > *z)
void SetWaveform(std::vector< float > &Wfm, float ZeroLevel)
int CalcSignalBegin(float front_time_beg_03, float front_time_end)
std::complex< float > * GetHarmonics()
int ChooseBestSignalBeginHarmonics(int first_sample, int last_sample)
void SetDebugMode(bool IsDebug)
Definition PronyFitter.h:63
int ChooseBestSignalBeginFast(int first_sample, int last_sample, int signal_length, std::complex< float > **InvHarmoMatrix)
std::complex< float > * GetAmplitudes()
float GetFitValue(int sample_number)
int ChooseBestSignalBegin(int first_sample, int last_sample)
float GetDeltaInSample(int sample)
float GetChiSquare(int gate_beg, int gate_end, int time_max)
std::vector< float > GetFitWfm()
Definition PronyFitter.h:87
float GetX(float level, int first_sample, int last_sample)
void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end)
float LevelBy2Points(float X1, float Y1, float X2, float Y2, float Y0)
void MakePileUpRejection(int time_max)
float GetIntegral(int gate_beg, int gate_end)
void MakeInvHarmoMatrix(int signal_length, std::complex< float > **output)
void MakeZpowerMatrix(int signal_length, std::complex< float > **output)
void SolveSLECholesky(float *x, float **a, float *b, int n)