From fcb3aec81fefa3a384031e1d37db84eabe66d4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Sun, 16 Feb 2025 15:22:38 +0100 Subject: [PATCH] Remove startfit --- CMakeLists.txt | 7 +- README | 4 +- starfit.cpp | 299 ------------------------------------------------- starfit.h | 39 ------- 4 files changed, 4 insertions(+), 345 deletions(-) delete mode 100644 starfit.cpp delete mode 100644 starfit.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4673dc7..cfc5273 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,8 +18,6 @@ if(SANITIZE_ADDRESS_LEAK) endif(SANITIZE_ADDRESS_LEAK) find_package(Qt6 COMPONENTS Widgets Sql OpenGLWidgets Qml REQUIRED) -find_library(GSL_LIB gsl REQUIRED) -find_library(GSLCBLAS_LIB gslcblas REQUIRED) find_library(EXIF_LIB exif REQUIRED) find_library(FITS_LIB cfitsio REQUIRED) find_library(RAW_LIB NAMES raw_r REQUIRED) @@ -52,7 +50,6 @@ set(TENMON_SRC rawimage_sse.cpp scriptengine.cpp scriptengine.h settingsdialog.cpp settingsdialog.h - starfit.cpp starfit.h statusbar.cpp statusbar.h stfslider.cpp stfslider.h stretchtoolbar.cpp stretchtoolbar.h @@ -87,7 +84,7 @@ find_path(STELLARSOLVER_INCLUDE stellarsolver.h PATH_SUFFIXES libstellarsolver) if(STELLARSOLVER_INCLUDE AND STELLARSOLVER_LIB) target_include_directories(tenmon PRIVATE ${STELLARSOLVER_INCLUDE}) if(MXE) - target_link_libraries(tenmon PRIVATE ${STELLARSOLVER_LIB} ${GSL_LIB} ${GSLCBLAS_LIB} boost_regex-mt-x64) + target_link_libraries(tenmon PRIVATE ${STELLARSOLVER_LIB} boost_regex-mt-x64) else(MXE) target_link_libraries(tenmon PRIVATE ${STELLARSOLVER_LIB}) endif(MXE) @@ -100,7 +97,7 @@ if(STELLARSOLVER_INCLUDE AND STELLARSOLVER_LIB) message(STATUS "Found stellarsolver ${STELLARSOLVER_INCLUDE} ${STELLARSOLVER_LIB}") endif(STELLARSOLVER_INCLUDE AND STELLARSOLVER_LIB) -target_link_libraries(tenmon PRIVATE Qt6::Widgets Qt6::Sql Qt6::OpenGLWidgets Qt6::Qml ${GSL_LIB} ${GSLCBLAS_LIB} ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} ${LCMS2_LIB} XISF) +target_link_libraries(tenmon PRIVATE Qt6::Widgets Qt6::Sql Qt6::OpenGLWidgets Qt6::Qml ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} ${LCMS2_LIB} XISF) if(APPLE) target_link_libraries(tenmon PRIVATE Qt6::DBus "-framework CoreFoundation") elseif(UNIX) diff --git a/README b/README index d659aee..29bfc89 100644 --- a/README +++ b/README @@ -2,11 +2,11 @@ FITS/XISF image viewer with multithreaded image loading To get all dependencies install these packages - sudo apt install qt6-base-dev qt6-declarative-dev libqt6opengl6-dev libraw-dev libexif-dev libcfitsio-dev libgsl-dev wcslib-dev cmake libzstd-dev libqt6sql6-sqlite + sudo apt install qt6-base-dev qt6-declarative-dev libqt6opengl6-dev libraw-dev libexif-dev libcfitsio-dev wcslib-dev cmake libzstd-dev libqt6sql6-sqlite on OpenSUSE - sudo zypper install gsl-devel libexif-devel libraw-devel wcslib-devel qt6-base-devel qt6-qml-devel libzstd-devel + sudo zypper install libexif-devel libraw-devel wcslib-devel qt6-base-devel qt6-qml-devel libzstd-devel MacOS X diff --git a/starfit.cpp b/starfit.cpp deleted file mode 100644 index e251374..0000000 --- a/starfit.cpp +++ /dev/null @@ -1,299 +0,0 @@ -#include "starfit.h" -#include -#include -#include - -const int PARAM_AM = 0; -const int PARAM_X0 = 1; -const int PARAM_Y0 = 2; -const int PARAM_SX = 3; -const int PARAM_SY = 4; -const int PARAM_TH = 5; - -const int MAX_ITER = 20; -const double TOL = 1.0e-3; - -struct StarData -{ - size_t size; - std::vector val; -}; - -// a * exp(-0.5*((x-x0)/sx)^2 + ((y-y0)/sy)^2) -double gauss_model(double a, double x0, double y0, double sx, double sy, double x, double y) -{ - double _x = (x-x0)/sx; - double _y = (y-y0)/sy; - return a*exp(-0.5*(_x*_x + _y*_y)); -} - -int func_f(const gsl_vector *X, void *params, gsl_vector *f) -{ - StarData *d = static_cast(params); - double am = gsl_vector_get(X, PARAM_AM); - double x0 = gsl_vector_get(X, PARAM_X0); - double y0 = gsl_vector_get(X, PARAM_Y0); - double sx = gsl_vector_get(X, PARAM_SX); - double sy = gsl_vector_get(X, PARAM_SY); - - int i = 0; - for(size_t y=0;ysize;y++) - { - for(size_t x=0;xsize;x++) - { - double v = gauss_model(am, x0, y0, sx, sy, x, y); - gsl_vector_set(f, i, d->val[i] - v); - i++; - } - } - - return GSL_SUCCESS; -} - -int func_df(const gsl_vector *X, void *params, gsl_matrix *J) -{ - StarData *d = static_cast(params); - double am = gsl_vector_get(X, PARAM_AM); - double x0 = gsl_vector_get(X, PARAM_X0); - double y0 = gsl_vector_get(X, PARAM_Y0); - double sx = gsl_vector_get(X, PARAM_SX); - double sy = gsl_vector_get(X, PARAM_SY); - - int i = 0; - for(size_t y=0;ysize;y++) - { - for(size_t x=0;xsize;x++) - { - double tx = x-x0; - double ty = y-y0; - double e = gauss_model(am, x0, y0, sx, sy, x, y); - - gsl_matrix_set(J, i, PARAM_AM, -e/am); - gsl_matrix_set(J, i, PARAM_X0, -e*(tx/(sx*sx))); - gsl_matrix_set(J, i, PARAM_Y0, -e*(ty/(sy*sy))); - gsl_matrix_set(J, i, PARAM_SX, -e*(tx*tx/(sx*sx*sx))); - gsl_matrix_set(J, i, PARAM_SY, -e*(ty*ty/(sy*sy*sy))); - i++; - } - } - - return GSL_SUCCESS; -} - -int func_f_an(const gsl_vector *X, void *params, gsl_vector *f) -{ - StarData *d = static_cast(params); - double am = gsl_vector_get(X, PARAM_AM); - double x0 = gsl_vector_get(X, PARAM_X0); - double y0 = gsl_vector_get(X, PARAM_Y0); - double sx = gsl_vector_get(X, PARAM_SX); - double sy = gsl_vector_get(X, PARAM_SY); - double th = gsl_vector_get(X, PARAM_TH); - - int i = 0; - double a = sin(th); - double b = cos(th); - for(size_t y=0;ysize;y++) - { - for(size_t x=0;xsize;x++) - { - double v = gauss_model(am, x0, y0, sx, sy, x*b-y*a, x*a+y*b); - gsl_vector_set(f, i, d->val[i] - v); - i++; - } - } - - return GSL_SUCCESS; -} - -int func_df_af(const gsl_vector *X, void *params, gsl_matrix *J) -{ - StarData *d = static_cast(params); - double am = gsl_vector_get(X, PARAM_AM); - double x0 = gsl_vector_get(X, PARAM_X0); - double y0 = gsl_vector_get(X, PARAM_Y0); - double sx = gsl_vector_get(X, PARAM_SX); - double sy = gsl_vector_get(X, PARAM_SY); - - int i = 0; - for(size_t y=0;ysize;y++) - { - for(size_t x=0;xsize;x++) - { - double tx = x-x0; - double ty = y-y0; - double e = gauss_model(am, x0, y0, sx, sy, x, y); - - gsl_matrix_set(J, i, PARAM_AM, -e/am); - gsl_matrix_set(J, i, PARAM_X0, -e*(tx/(sx*sx))); - gsl_matrix_set(J, i, PARAM_Y0, -e*(ty/(sy*sy))); - gsl_matrix_set(J, i, PARAM_SX, -e*(tx*tx/(sx*sx*sx))); - gsl_matrix_set(J, i, PARAM_SY, -e*(ty*ty/(sy*sy*sy))); - i++; - } - } - - return GSL_SUCCESS; -} - -//int func_fvv(const gsl_vector *x, const gsl_vector * v, void *params, gsl_vector *fvv) -//{ -// return GSL_SUCCESS; -//} - -void callback(const size_t iter, void *, const gsl_multifit_nlinear_workspace *w) -{ - double rcond; - gsl_vector *x = gsl_multifit_nlinear_position(w); - gsl_multifit_nlinear_rcond(&rcond, w); - QString r = "Iter: " + QString::number(iter) - + " Am: " + QString::number(gsl_vector_get(x, PARAM_AM)) - + " X0: " + QString::number(gsl_vector_get(x, PARAM_X0)) - + " Y0: " + QString::number(gsl_vector_get(x, PARAM_Y0)) - + " SX: " + QString::number(gsl_vector_get(x, PARAM_SX)) - + " SY: " + QString::number(gsl_vector_get(x, PARAM_SY)) - + " J(X) :" + QString::number(1.0/rcond) - + " av: " + QString::number(gsl_multifit_nlinear_avratio(w)); - std::cout << r.toStdString() << std::endl; -} - -void callback_an(const size_t iter, void *, const gsl_multifit_nlinear_workspace *w) -{ - double rcond; - gsl_vector *x = gsl_multifit_nlinear_position(w); - gsl_multifit_nlinear_rcond(&rcond, w); - qDebug() << "Iter:" << iter << "Am:" << gsl_vector_get(x, PARAM_AM) - << "X0:" << gsl_vector_get(x, PARAM_X0) - << "Y0:" << gsl_vector_get(x, PARAM_Y0) - << "SX:" << gsl_vector_get(x, PARAM_SX) - << "SY:" << gsl_vector_get(x, PARAM_SY) - << "TH:" << gsl_vector_get(x, PARAM_TH) - << "J(X):" << 1.0/rcond - << "av:" << gsl_multifit_nlinear_avratio(w); -} - -Star::Star() -{ - m_am = m_x = m_y = m_sx = m_sy = NAN; -} - -bool Star::valid() const -{ - return !isnan(m_am); -} - -//half width at half maximum = sqrt(2*ln(2)) -double Star::hwhmX() const -{ - return 1.177410023*m_sx; -} - -double Star::hwhmY() const -{ - return 1.177410023*m_sy; -} - -// half width at 1/20 maximum -double Star::hw20X() const -{ - return 2.447746831*m_sx; -} - -double Star::hw20Y() const -{ - return 2.447746831*m_sy; -} - -// full width at half maximum -double Star::fwhmX() const -{ - return 2.354820045*m_sx; -} - -double Star::fwhmY() const -{ - return 2.354820045*m_sy; -} - -bool Star::operator<(const Star &d) const -{ - return m_am < d.m_am; -} - -StarFit::StarFit(int size) -{ - m_size = size; - m_fdf_params = gsl_multifit_nlinear_default_parameters(); - m_fdf_params.trs = gsl_multifit_nlinear_trs_lmaccel; - - m_fdf.f = func_f; - m_fdf.df = func_df; - m_fdf.fvv = nullptr; - m_fdf.n = size*size; - m_fdf.p = 5;//number of model parameters amplitude, x, y, fwhm_x, fwhm_y - - m_fdf_an.f = func_f_an; - m_fdf_an.df = nullptr; - m_fdf_an.fvv = nullptr; - m_fdf_an.n = size*size; - m_fdf_an.p = 6;//number of model parameters amplitude, x, y, sigma_x, sigma_y, angle - - gsl_set_error_handler_off(); -} - -StarFit::~StarFit() -{ -} - -Star StarFit::fitStar(const std::vector &data, bool angle) -{ - gsl_multifit_nlinear_fdf *fdf = angle ? &m_fdf_an : &m_fdf; - Star star; - StarData d; - d.val = data; - d.size = m_size; - d.val = data; - fdf->params = &d; - int info; - - double min = *std::min_element(data.begin(), data.end()); - double max = *std::max_element(data.begin(), data.end()) - min; - for(double &v : d.val) - { - v -= min; - } - - gsl_vector *start = gsl_vector_alloc(fdf->p); - gsl_vector_set(start, PARAM_AM, max); - gsl_vector_set(start, PARAM_X0, m_size/2); - gsl_vector_set(start, PARAM_Y0, m_size/2); - gsl_vector_set(start, PARAM_SX, 1.0); - gsl_vector_set(start, PARAM_SY, 1.0); - if(angle) - gsl_vector_set(start, PARAM_TH, 0.0); - - gsl_multifit_nlinear_workspace *workspace = gsl_multifit_nlinear_alloc(gsl_multifit_nlinear_trust, &m_fdf_params, fdf->n, fdf->p); - - int ret = gsl_multifit_nlinear_init(start, fdf, workspace); - if(ret)return star; - - ret = gsl_multifit_nlinear_driver(MAX_ITER, TOL, TOL, TOL, nullptr, nullptr, &info, workspace); - - if(ret==0) - { - gsl_vector *y = gsl_multifit_nlinear_position(workspace); - star.m_am = gsl_vector_get(y, PARAM_AM); - star.m_x = gsl_vector_get(y, PARAM_X0); - star.m_y = gsl_vector_get(y, PARAM_Y0); - star.m_sx = gsl_vector_get(y, PARAM_SX); - star.m_sy = gsl_vector_get(y, PARAM_SY); - if(angle) - star.m_theta = gsl_vector_get(y, PARAM_TH); - //qDebug() << "finished" << star.m_am << star.m_sx << star.m_sy; - } - - gsl_vector_free(start); - gsl_multifit_nlinear_free(workspace); - - return star; -} diff --git a/starfit.h b/starfit.h deleted file mode 100644 index 8bde7e6..0000000 --- a/starfit.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef STARFIT_H -#define STARFIT_H - -#include "rawimage.h" -#include - -double gauss_model(double a, double x0, double y0, double sx, double sy, double x, double y); - -struct Star -{ - double m_am; - double m_x,m_y; - double m_sx,m_sy; - double m_theta; - Star(); - bool valid() const; - double hwhmX() const; - double hwhmY() const; - double hw20X() const; - double hw20Y() const; - double fwhmX() const; - double fwhmY() const; - bool operator<(const Star &d) const; -}; - -class StarFit -{ - int m_size; - gsl_multifit_nlinear_fdf m_fdf; - gsl_multifit_nlinear_fdf m_fdf_an; - gsl_multifit_nlinear_parameters m_fdf_params; - gsl_vector *m_vector; -public: - StarFit(int size); - ~StarFit(); - Star fitStar(const std::vector &data, bool angle); -}; - -#endif // STARFIT_H