30 #include "muse_instrument.h"
32 #include "muse_optimize.h"
45 const cpl_array *aPar,
52 cpl_array *linesLambda;
56 } muse_lsf_fit_struct;
69 muse_lsf_slice_eval(
void *aData, cpl_array *aPar, cpl_array *aRetval) {
71 muse_lsf_fit_struct *data = aData;
72 cpl_size size = cpl_array_get_size(aRetval);
76 aPar, data->fit_params);
77 cpl_array *linesFlux = data->linesFlux;
78 if (data->linesFlux == NULL) {
79 linesFlux = cpl_array_extract(aPar, cpl_array_get_size(aPar)
80 - cpl_array_get_size(data->linesLambda),
81 cpl_array_get_size(data->linesLambda));
88 if (data->linesFlux == NULL) {
89 cpl_array_delete(linesFlux);
93 cpl_array_subtract(simulated, data->values);
94 cpl_array_divide(simulated, data->stat);
96 cpl_array_fill_window_double(aRetval, 0, size, 0.0);
97 memcpy(cpl_array_get_data_double(aRetval),
98 cpl_array_get_data_double_const(simulated),
99 size *
sizeof(
double));
103 double *d = cpl_array_get_data_double(aRetval);
104 for (i = 0; i < size; i++) {
110 cpl_array_delete(simulated);
111 return CPL_ERROR_NONE;
132 const cpl_array *aStat,
133 const cpl_table *aLines,
141 int debug = getenv(
"MUSE_DEBUG_LSF_FIT")
142 && atoi(getenv(
"MUSE_DEBUG_LSF_FIT")) > 0;
152 cpl_size reduction = 2;
153 cpl_size size = cpl_array_get_size(aLambda)/reduction;
154 cpl_array *lambda = cpl_array_new(size, CPL_TYPE_DOUBLE);
155 cpl_array *data = cpl_array_new(size, CPL_TYPE_DOUBLE);
156 cpl_array *stat = cpl_array_new(size, CPL_TYPE_DOUBLE);
159 for (i = 0; i < size; i++) {
160 cpl_array_set(lambda, i, cpl_array_get(aLambda, reduction * i, NULL));
161 cpl_array_set(data, i, cpl_array_get(aData, reduction * i, NULL));
162 cpl_array_set(stat, i, sqrt(cpl_array_get(aStat, reduction * i, NULL)));
178 aFitParams->lsf_width,
185 muse_lsf_fit_struct fit_data = {
195 cpl_array *pars = (aFirstGuess == NULL)?
201 cpl_array *linesFlux = cpl_array_cast(lf, CPL_TYPE_DOUBLE);
202 cpl_array_unwrap(lf);
203 cpl_array_insert(pars, linesFlux, cpl_array_get_size(pars));
207 muse_lsf_slice_eval, &ctrl);
209 if (r != CPL_ERROR_NONE) {
210 cpl_array_delete(pars);
211 pars = (aFirstGuess == NULL)?
214 cpl_array_insert(pars, linesFlux, cpl_array_get_size(pars));
221 fit_data.fit_params = aFitParams;
222 cpl_array_delete(linesFlux);
223 linesFlux = cpl_array_extract(pars, cpl_array_get_size(pars)
224 - cpl_array_get_size(linesLambda),
225 cpl_array_get_size(linesLambda));
226 fit_data.linesFlux = linesFlux;
229 pars, slice_fit_params0);
231 cpl_array_delete(pars);
235 if (r != CPL_ERROR_NONE) {
236 cpl_array_delete(pars);
237 pars = (aFirstGuess == NULL)?
240 cpl_array_insert(pars, linesFlux, cpl_array_get_size(pars));
246 cpl_msg_debug(__func__,
"Slit width: %f (%s), bin width: %f (%s)",
247 lsfParam->
slit_width, aFitParams->slit_width?
"fit":
"fixed",
248 lsfParam->
bin_width, aFitParams->bin_width?
"fit":
"fixed");
251 linesFlux, lsfParam);
252 cpl_array_delete(linesFlux);
253 cpl_array_subtract(aData, simulated);
254 cpl_array_delete(simulated);
256 cpl_array_delete(pars);
257 cpl_array_unwrap(fit_data.linesLambda);
258 cpl_array_delete(fit_data.lambda);
259 cpl_array_delete(fit_data.values);
260 cpl_array_delete(fit_data.stat);
262 if (aFirstGuess == NULL) {
void muse_lsf_params_delete_one(muse_lsf_params *aParams)
Delete an allocated muse_lsf_params structure.
cpl_error_code muse_cpl_optimize_lvmq(void *aData, cpl_array *aPar, int aSize, muse_cpl_evaluate_func *aFunction, muse_cpl_optimize_control_t *aCtrl)
Minimize a function with the Levenberg-Marquardt algorithm.
muse_lsf_params * muse_lsf_params_fit(const cpl_array *aLambda, cpl_array *aData, const cpl_array *aStat, const cpl_table *aLines, muse_lsf_params *aFirstGuess, int aMaxIter, const muse_sky_fit_params *aFitParams)
Fit all entries of one slice.
cpl_array * muse_sky_slice_lsf_firstguess(const muse_sky_fit_params *aFitParams)
Return the parametrization values of the first guess.
Structure to define which slice parameters are fit.
void muse_sky_fit_params_delete(muse_sky_fit_params *)
Delete the fit parameter structure.
cpl_array * muse_lsf_spectrum_get_lines(const cpl_array *aLambda, const cpl_array *aLinesLambda, const cpl_array *aLinesFlux, const muse_lsf_params *aLsf)
Set the lines spectrum from the lines table and the detector LSF.
double bin_width
Bin width.
muse_lsf_params * muse_lsf_params_new(cpl_size n_sensit, cpl_size n_lsf_width, cpl_size n_hermit)
Create a new lsf_params structure.
double slit_width
Slit width.
cpl_array * muse_cpltable_extract_column(cpl_table *aTable, const char *aColumn)
Create an array from a section of a column.
Optimization control parameters.
muse_lsf_params * muse_sky_slice_apply_lsf_parametrization(const muse_lsf_params *template, const cpl_array *aPar, const muse_sky_fit_params *aFitParams)
Convert a parametrization to LSF parameters.
muse_sky_fit_params * muse_sky_fit_params_new(cpl_boolean, cpl_boolean, cpl_size, cpl_size, cpl_size, cpl_size, cpl_size, cpl_size, cpl_size, cpl_size)
Create a new fit parameter structure.
Structure definition of detector (slice) parameters.
cpl_array * muse_sky_slice_lsf_set_param(muse_lsf_params *aLsf, const muse_sky_fit_params *aFitParams)
Return the parametrization values for the specific LSF params.