#include #include #include #include #include #include #include #include #include #include #include "cauchy.hpp" const double PI = 4.0 * atan(1.0); template inline constexpr T sqr(T x) { return x*x; } inline CauchyPoint gsl_to_cauchy_point(const gsl_vector *fit_params) { return {0.0, 0.0, // E,r don't matter to fitting routine gsl_vector_get(fit_params, 0), // cx std::abs(gsl_vector_get(fit_params, 1)), // ax std::abs(gsl_vector_get(fit_params, 2)), // ay gsl_vector_get(fit_params, 3), // beta 0.0, 0.0, 0.0, //dxds/dyds_min/max std::abs(gsl_vector_get(fit_params, 4)), // amp 0.0, CauchyStatus::OK}; // chi2, npts, stat } int asym_cauchy_fit_function(const gsl_vector *fit_params, void *data_points, gsl_vector *fit_residuals) { // Computes fit function minus bin count for each // bin passed in through data_points, and stores the // results in fit_residuals std::vector& bins = * (std::vector *) data_points; auto p = gsl_to_cauchy_point(fit_params); size_t num_pts = bins.size(); for (size_t i=0; ix); switch (status) { case GSL_EMAXITER: //std::cerr << "Iteration limit reached for cauchy fit at pc_out = " // << pc_out*1e-6 << " MeV, r = " << r*1e2 << " cm\n"; result.stat = CauchyStatus::MAXITER; break; case GSL_ENOPROG: result.stat = CauchyStatus::NOPROG; break; default: result.stat = CauchyStatus::OK; } // Fill in the rest of the parameters to result result.ax = std::sqrt(result.ax); result.ay = std::sqrt(result.ay); result.E = data.E; result.r = data.r; // bins are sorted by increasing dxds, then increasing dyds result.dxds_min = data.bins.front().x; result.dxds_max = data.bins.back().x; result.dyds_max = data.bins.back().y; result.chi2 = sqrt(chisq)/(num_pts - num_fit_params); gsl_multifit_nlinear_free(w); return result; }