/** @file PronyFitter.h @class PronyFitter @author Nikolay Karpushkin (nkarpushkin@mail.ru) @brief Class to fit waveform using Prony least squares method */ #ifndef PronyFitter_H #define PronyFitter_H #include // for std::vector #include // for uint16_t #include // for printf #include // for memcpy #include // for complex numbers #include #include // for reverse namespace PsdSignalFitting{ class PronyFitter { public: /** Default constructor **/ PronyFitter() {}; PronyFitter(int model_order, int exponent_number, int gate_beg, int gate_end); /** Default destructor **/ ~PronyFitter() {Clear();}; int CalcSignalBegin(float front_time_beg_03, float front_time_end); int ChooseBestSignalBeginHarmonics(int first_sample, int last_sample) ; int ChooseBestSignalBegin(int first_sample, int last_sample); void MakePileUpRejection(int time_max); void CalculateFitHarmonics(); void CalculateFitAmplitudes(); void SolveSLEGauss(float *x, float **r, float *b, int n); void SolveSLEGauss(std::complex *x, std::complex **r, std::complex *b, int n); void SolveSLECholesky(float *x, float **a, float *b, int n); void CovarianceQRmod(float &rho_f, std::vector &a_f, float &rho_b, std::vector &a_b); void CovarianceDirect(float &rho_f, std::vector &a_f, float &rho_b, std::vector &a_b); float LevelBy2Points(float X1, float Y1, float X2, float Y2, float Y0); // // Setters // void SetDebugMode(bool IsDebug) { fIsDebug = IsDebug; }; void SetWaveform(std::vector& uWfm, uint16_t uZeroLevel); void SetSignalBegin(int SignalBeg); void SetHarmonics(std::complex *z); void SetExternalHarmonics(std::complex z1, std::complex z2); // // Getters // std::complex *GetHarmonics(); std::complex *GetAmplitudes(); float GetIntegral(int gate_beg, int gate_end); uint16_t GetFitValue(int sample_number); float GetFitValue(float x); float GetZeroLevel(); float GetX(float level, int first_sample, int last_sample); float GetX(float level, int first_sample, int last_sample, float step); float GetRSquare(int gate_beg, int gate_end); float GetRSquareSignal(); float GetChiSquare(int gate_beg, int gate_end, int time_max); float GetDeltaInSample(int sample); float GetSignalBeginFromPhase(); float GetSignalMaxTime(); float GetMaxAmplitude(); int GetNumberPolRoots(); std::vector GetFitWfm(){ return fuFitWfm; } private: void Initialize(int model_order, int exponent_number, int gate_beg, int gate_end); void AllocData(); void DeleteData(); void Clear(); bool fIsDebug = false; int fModelOrder; int fExpNumber; int fGateBeg; int fGateEnd; int fSampleTotal; int fSignalBegin; int fTotalPolRoots; std::vector fuWfm; uint16_t fuZeroLevel; std::complex *fz; //! std::complex *fh; //! std::vector fuFitWfm; uint16_t fuFitZeroLevel; }; } #endif