BmnRoot 26.10.0-19-g6979a6c6
Software framework of the BM@N experiment
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
5/** @file PronyFitter.h
6 @class PronyFitter
7 @author Nikolay Karpushkin (nkarpushkin@mail.ru)
8 @brief Class to fit waveform using Prony least squares method
9*/
10
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 <numeric>
19#include <stdint.h> // for uint16_t
20#include <stdio.h> // for printf
21#include <vector> // for std::vector
22
23namespace PsdSignalFitting
24{
26{
27
28 public:
29 /** Default constructor **/
31 PronyFitter(int model_order, int exponent_number, int gate_beg, int gate_end);
32
33 void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end);
34
35 /** Default destructor **/
37
38 float GoToLevel(float Level, int* point, int iterator, int iLastPoint);
40 int CalcSignalBegin(float front_time_beg_03, float front_time_end);
41 int ChooseBestSignalBeginHarmonics(int first_sample, int last_sample);
42 int ChooseBestSignalBegin(int first_sample, int last_sample);
43 void MakePileUpRejection(int time_max);
46 void MakeInvHarmoMatrix(int signal_length, std::complex<float>** output);
47 void MakeZpowerMatrix(int signal_length, std::complex<float>** output);
48 void ResetAmplitudes();
49 void CalculateFitAmplitudesFast(int signal_length, std::complex<float>** InvHarmoMatrix);
50 int ChooseBestSignalBeginFast(int first_sample,
51 int last_sample,
52 int signal_length,
53 std::complex<float>** InvHarmoMatrix);
54 int SearchSignalBeginByHarmo(int first_sample, int last_sample, int signal_length, std::complex<float>** Zpower);
55 void SolveSLEGauss(float* x, float** r, float* b, int n);
56 void SolveSLEGauss(std::complex<float>* x, std::complex<float>** r, std::complex<float>* b, int n);
57 void SolveSLECholesky(float* x, float** a, float* b, int n);
58 void CovarianceQRmod(float& rho_f, std::vector<float>& a_f, float& rho_b, std::vector<float>& a_b);
59 void CovarianceDirect(float& rho_f, std::vector<float>& a_f, float& rho_b, std::vector<float>& a_b);
60 float LevelBy2Points(float X1, float Y1, float X2, float Y2, float Y0);
61 //
62 // Setters
63 //
64 void SetDebugMode(bool IsDebug) { fIsDebug = IsDebug; };
65 void SetWaveform(std::vector<float>& Wfm, float ZeroLevel);
66 void SetSignalBegin(int SignalBeg);
67 void SetHarmonics(std::complex<float>* z);
68 void SetExternalHarmonics(std::vector<std::complex<float>> harmonics);
69 //
70 // Getters
71 //
72 std::complex<float>* GetHarmonics();
73 std::complex<float>* GetAmplitudes();
74 float GetIntegral(int gate_beg, int gate_end);
75 float GetFitValue(int sample_number);
76 float GetFitValue(float x);
77 float GetZeroLevel();
78 float GetX(float level, int first_sample, int last_sample);
79 float GetX(float level, int first_sample, int last_sample, float step);
80 float GetRSquare(int gate_beg, int gate_end);
81 float GetRSquareSignal();
82 float GetChiSquare(int gate_beg, int gate_end, int time_max);
83 float GetDeltaInSample(int sample);
85 float GetSignalMaxTime();
86 float GetMaxAmplitude();
88 std::vector<float> GetFitWfm() { return fFitWfm; }
89
90 private:
91 void AllocData();
92 void DeleteData();
93 void Clear();
94
95 bool fIsDebug = false;
101
104
105 std::vector<float> fWfm;
107 std::complex<float>* fz = nullptr; //!
108 std::complex<float>* fh = nullptr; //!
109 std::vector<float> fFitWfm;
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)
std::complex< float > * fz
std::vector< float > fFitWfm
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)
~PronyFitter()
Default destructor.
Definition PronyFitter.h:36
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:64
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:88
float GetX(float level, int first_sample, int last_sample)
void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end)
std::complex< float > * fh
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)
PronyFitter()
Default constructor.
Definition PronyFitter.h:30
std::vector< float > fWfm
void MakeZpowerMatrix(int signal_length, std::complex< float > **output)
void SolveSLECholesky(float *x, float **a, float *b, int n)