30#include <telluriccorr.h>
32#include "moo_molecfit.h"
34#include "moo_badpix.h"
36#include "moo_molectable.h"
37#include "moo_fibres_table.h"
39#include "moo_kernel.h"
54_molecfit_data_create(
double crpix1,
61 cpl_table *result = NULL;
62 int nx = cpl_image_get_size_x(data);
64 result = cpl_table_new(nx);
65 cpl_table_new_column(result,
"WAVE", CPL_TYPE_DOUBLE);
66 cpl_table_new_column(result,
"FLUX", CPL_TYPE_DOUBLE);
67 cpl_table_new_column(result,
"ERR", CPL_TYPE_DOUBLE);
68 cpl_table_new_column(result,
"mask", CPL_TYPE_INT);
70 for (
int i = 0; i < nx; i++) {
72 double w = (i - crpix1) * cd1_1 + crval1;
73 double f = cpl_image_get(data, i + 1, idrbn, &rej1);
74 double e = cpl_image_get(data_err, i + 1, idrbn, &rej1);
75 cpl_table_set_double(result,
"WAVE", i, w);
76 cpl_table_set_double(result,
"FLUX", i, f);
77 cpl_table_set_double(result,
"ERR", i, e);
78 cpl_table_set_int(result,
"mask", i, rej1);
84_moo_molecfit_update_mf_conf(mf_configuration *config,
85 moo_molecfit_model_params *params)
87 mf_parameters_inputs *inputs = &(config->parameters->inputs);
88 inputs->wlg_to_micron = 0.001;
89 cpl_free(inputs->column_dflux);
90 cpl_free(inputs->column_lambda);
91 cpl_free(inputs->column_flux);
92 cpl_free(inputs->wavelengths_frame);
93 inputs->column_dflux = cpl_strdup(
"ERR");
94 inputs->column_lambda = cpl_strdup(
"WAVE");
95 inputs->column_flux = cpl_strdup(
"FLUX");
96 inputs->wavelengths_frame = cpl_strdup(
"AIR");
97 inputs->transmission = CPL_TRUE;
98 inputs->clean_flux = CPL_FALSE;
99 inputs->silent_external_bins = CPL_TRUE;
104 mf_parameters_fitting *fitting = &(config->parameters->fitting);
105 fitting->ftol = 1E-10;
106 fitting->xtol = 1E-10;
107 fitting->flux_unit = 0;
108 fitting->fit_telescope_background.fit = CPL_TRUE;
109 fitting->fit_telescope_background.const_val = 0.1;
110 fitting->fit_continuum.fit = CPL_TRUE;
112 fitting->fit_continuum.const_val = params->continuum_const;
113 fitting->kern_mode = params->kern_mode;
114 fitting->kern_fac = params->kern_fac;
115 fitting->var_kern = params->var_kern;
118 fitting->fit_continuum.const_val = 1.;
119 fitting->kern_mode = CPL_FALSE;
120 fitting->kern_fac = 3;
121 fitting->var_kern = CPL_TRUE;
123 fitting->fit_wavelenght.fit = CPL_TRUE;
124 fitting->fit_wavelenght.n = 1;
125 fitting->fit_wavelenght.const_val = 0.0;
126 fitting->fit_gauss.fit = CPL_TRUE;
127 fitting->fit_gauss.const_val = 1.0;
129 fitting->fit_res_box.fit = CPL_FALSE;
130 fitting->fit_res_box.const_val = 0;
131 fitting->fit_lorentz.fit = CPL_FALSE;
132 fitting->fit_lorentz.const_val = 0;
134 fitting->fit_chips[0] = CPL_TRUE;
136 mf_parameters_instrumental *instrumental =
137 &(config->parameters->instrumental);
138 cpl_free(instrumental->slit_width.key);
139 cpl_free(instrumental->pixel_scale.key);
140 instrumental->slit_width.key = cpl_strdup(
"NONE");
141 instrumental->slit_width.value = 1.0;
142 instrumental->pixel_scale.key = cpl_strdup(
"NONE");
143 instrumental->pixel_scale.value = 0.015;
145 mf_parameters_atmospheric *atmospheric = &(config->parameters->atmospheric);
146 cpl_free(atmospheric->ref_atm);
147 atmospheric->ref_atm = cpl_strdup(
"equ.fits");
148 atmospheric->layers = CPL_TRUE;
149 atmospheric->emix = 5.;
150 atmospheric->pwv = -1;
152 mf_io_lnfl_config *lnfl = config->lnfl;
153 cpl_free(lnfl->line_db);
154 lnfl->line_db = cpl_strdup(
"aer_v_3.8.1.2");
155 lnfl->line_db_fmt = 100.0;
157 mf_io_lblrtm_config *lblrtm = config->lblrtm;
158 lblrtm->alfal0 = 0.0;
166 lblrtm->dptfac = 0.001;
167 lblrtm->dptmin = 2e-4;
168 lblrtm->h[0] = 2.635;
171 lblrtm->hspace = 120.;
184 lblrtm->sremis[0] = 0.;
185 lblrtm->sremis[1] = 0.;
186 lblrtm->sremis[2] = 0.;
187 lblrtm->srrefl[0] = 0.;
188 lblrtm->srrefl[1] = 0.;
189 lblrtm->srrefl[2] = 0.;
191 lblrtm->tdiff[0] = 5.;
192 lblrtm->tdiff[1] = 8.;
196 return CPL_ERROR_NONE;
200_moo_molecfit_update_mf_conf_with_propertylist(
201 mf_configuration *config,
202 cpl_propertylist *parameters_header)
204 cpl_ensure_code(config != NULL, CPL_ERROR_NULL_INPUT);
205 cpl_ensure_code(parameters_header != NULL, CPL_ERROR_NULL_INPUT);
218 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TELLURICCORR_PATH;
219 if (cpl_propertylist_has(parameters_header, p)) {
220 if (directories->telluric_path) cpl_free(directories->telluric_path);
221 directories->telluric_path = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
222 cpl_propertylist_update_string(pl, p, directories->telluric_path);
225 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TELLURICCORR_DATA_PATH;
226 if (cpl_propertylist_has(parameters_header, p)) {
227 if (directories->telluriccorr_data_path) cpl_free(directories->telluriccorr_data_path);
228 directories->telluriccorr_data_path = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
229 cpl_propertylist_update_string(pl, p, directories->telluriccorr_data_path);
232 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TMP_PATH;
233 if (cpl_propertylist_has(parameters_header, p)) {
234 if (directories->tmp_path) cpl_free(directories->tmp_path);
235 directories->tmp_path = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
236 cpl_propertylist_update_string(pl, p, directories->tmp_path);
261 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_SILENT_EXTERNAL_BINS;
262 if (cpl_propertylist_has(parameters_header, p)) {
263 inputs->silent_external_bins = cpl_propertylist_get_bool(parameters_header, p);
264 cpl_propertylist_update_bool(pl, p, inputs->silent_external_bins);
267 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TRANSMISSION;
268 if (cpl_propertylist_has(parameters_header, p)) {
269 inputs->transmission = cpl_propertylist_get_bool(parameters_header, p);
270 cpl_propertylist_update_bool(pl, p, inputs->transmission);
273 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_COLUMN_LAMBDA;
274 if (cpl_propertylist_has(parameters_header, p)) {
275 if (inputs->column_lambda) cpl_free(inputs->column_lambda);
276 inputs->column_lambda = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
277 cpl_propertylist_update_string(pl, p, inputs->column_lambda);
280 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_COLUMN_FLUX;
281 if (cpl_propertylist_has(parameters_header, p)) {
282 if (inputs->column_flux) cpl_free(inputs->column_flux);
283 inputs->column_flux = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
284 cpl_propertylist_update_string(pl, p, inputs->column_flux);
287 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_COLUMN_DFLUX;
288 if (cpl_propertylist_has(parameters_header, p)) {
289 if (inputs->column_dflux) cpl_free(inputs->column_dflux);
290 inputs->column_dflux = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
291 cpl_propertylist_update_string(pl, p, inputs->column_dflux);
294 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_COLUMN_MASK;
295 if (cpl_propertylist_has(parameters_header, p)) {
296 if (inputs->column_mask) cpl_free(inputs->column_mask);
297 inputs->column_mask = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
298 cpl_propertylist_update_string(pl, p, inputs->column_mask);
302 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_DEFAULT_ERROR;
303 if (cpl_propertylist_has(parameters_header, p)) {
304 inputs->default_error = cpl_propertylist_get_double(parameters_header, p);
305 cpl_propertylist_update_double(pl, p, inputs->default_error);
308 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_WLG_TO_MICRON;
309 if (cpl_propertylist_has(parameters_header, p)) {
310 inputs->wlg_to_micron = cpl_propertylist_get_double(parameters_header, p);
311 cpl_propertylist_update_double(pl, p, inputs->wlg_to_micron);
314 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_WAVELENGTH_FRAME;
315 if (cpl_propertylist_has(parameters_header, p)) {
316 if (inputs->wavelengths_frame) cpl_free(inputs->wavelengths_frame);
317 inputs->wavelengths_frame = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
318 cpl_propertylist_update_string(pl, p, inputs->wavelengths_frame);
321 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_OBSERVATORY_ERF_RV_KEYWORD;
322 if (cpl_propertylist_has(parameters_header, p)) {
323 if (inputs->observing_erv_rv.key) cpl_free(inputs->observing_erv_rv.key);
324 inputs->observing_erv_rv.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
325 cpl_propertylist_update_string(pl, p, inputs->observing_erv_rv.key);
327 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_OBSERVATORY_ERF_RV_VALUE;
328 if (cpl_propertylist_has(parameters_header, p)) {
329 inputs->observing_erv_rv.value = cpl_propertylist_get_double(parameters_header, p);
330 cpl_propertylist_update_double(pl, p, inputs->observing_erv_rv.value);
333 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_CLEAN_MODEL_FLUX;
334 if (cpl_propertylist_has(parameters_header, p)) {
335 inputs->clean_flux = cpl_propertylist_get_bool(parameters_header, p);
336 cpl_propertylist_update_bool(pl, p, inputs->clean_flux);
342 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FTOL;
343 if (cpl_propertylist_has(parameters_header, p)) {
344 fitting->ftol = cpl_propertylist_get_double(parameters_header, p);
345 cpl_propertylist_update_double(pl, p, fitting->ftol);
348 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_XTOL;
349 if (cpl_propertylist_has(parameters_header, p)) {
350 fitting->xtol = cpl_propertylist_get_double(parameters_header, p);
351 cpl_propertylist_update_double(pl, p, fitting->xtol);
354 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FLUX_UNIT;
355 if (cpl_propertylist_has(parameters_header, p)) {
356 fitting->flux_unit = cpl_propertylist_get_int(parameters_header, p);
357 cpl_propertylist_update_int(pl, p, fitting->flux_unit);
362 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FIT_TELESCOPE_BACK;
363 if (cpl_propertylist_has(parameters_header, p)) {
364 fitting->fit_telescope_background.fit = cpl_propertylist_get_bool(parameters_header, p);
365 cpl_propertylist_update_bool(pl, p, fitting->fit_telescope_background.fit);
368 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TELESCOPE_BACK_CONST;
369 if (cpl_propertylist_has(parameters_header, p)) {
370 fitting->fit_telescope_background.const_val = cpl_propertylist_get_double(parameters_header, p);
371 cpl_propertylist_update_int(pl, p, fitting->fit_telescope_background.const_val);
376 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FIT_CONTINUUM;
377 if (cpl_propertylist_has(parameters_header, p)) {
378 fitting->fit_continuum.fit = cpl_propertylist_get_bool(parameters_header, p);
379 cpl_propertylist_update_bool(pl, p, fitting->fit_continuum.fit);
382 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_CONTINUUM_N;
383 if (cpl_propertylist_has(parameters_header, p)) {
384 fitting->fit_continuum.n = cpl_propertylist_get_int(parameters_header, p);
385 cpl_propertylist_update_int(pl, p, fitting->fit_continuum.n);
388 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_CONTINUUM_CONST;
389 if (cpl_propertylist_has(parameters_header, p)) {
390 fitting->fit_continuum.const_val = cpl_propertylist_get_double(parameters_header, p);
391 cpl_propertylist_update_double(pl, p, fitting->fit_continuum.const_val);
403 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FIT_WLC;
404 if (cpl_propertylist_has(parameters_header, p)) {
405 fitting->fit_wavelenght.fit = cpl_propertylist_get_bool(parameters_header, p);
406 cpl_propertylist_update_bool(pl, p, fitting->fit_wavelenght.fit);
409 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_WLC_N;
410 if (cpl_propertylist_has(parameters_header, p)) {
411 fitting->fit_wavelenght.n = cpl_propertylist_get_int(parameters_header, p);
412 cpl_propertylist_update_int(pl, p, fitting->fit_wavelenght.n);
415 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_WLC_CONST;
416 if (cpl_propertylist_has(parameters_header, p)) {
417 fitting->fit_wavelenght.const_val = cpl_propertylist_get_double(parameters_header, p);
418 cpl_propertylist_update_double(pl, p, fitting->fit_wavelenght.const_val);
430 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FIT_RES_BOX;
431 if (cpl_propertylist_has(parameters_header, p)) {
432 fitting->fit_res_box.fit = cpl_propertylist_get_bool(parameters_header, p);
433 cpl_propertylist_update_bool(pl, p, fitting->fit_res_box.fit);
436 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_RES_BOX;
437 if (cpl_propertylist_has(parameters_header, p)) {
438 fitting->fit_res_box.const_val = cpl_propertylist_get_double(parameters_header, p);
439 cpl_propertylist_update_double(pl, p, fitting->fit_res_box.const_val);
444 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FIT_GAUSS;
445 if (cpl_propertylist_has(parameters_header, p)) {
446 fitting->fit_gauss.fit = cpl_propertylist_get_bool(parameters_header, p);
447 cpl_propertylist_update_bool(pl, p, fitting->fit_gauss.fit);
450 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_RES_GAUSS;
451 if (cpl_propertylist_has(parameters_header, p)) {
452 fitting->fit_gauss.const_val = cpl_propertylist_get_double(parameters_header, p);
453 cpl_propertylist_update_double(pl, p, fitting->fit_gauss.const_val);
458 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_FIT_LORENTZ;
459 if (cpl_propertylist_has(parameters_header, p)) {
460 fitting->fit_lorentz.fit = cpl_propertylist_get_bool(parameters_header, p);
461 cpl_propertylist_update_bool(pl, p, fitting->fit_lorentz.fit);
464 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_RES_LORENTZ;
465 if (cpl_propertylist_has(parameters_header, p)) {
466 fitting->fit_lorentz.const_val = cpl_propertylist_get_double(parameters_header, p);
467 cpl_propertylist_update_double(pl, p, fitting->fit_lorentz.const_val);
472 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_KERN_MODE;
473 if (cpl_propertylist_has(parameters_header, p)) {
474 fitting->kern_mode = cpl_propertylist_get_bool(parameters_header, p);
475 cpl_propertylist_update_bool(pl, p, fitting->kern_mode);
478 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_KERN_FAC;
479 if (cpl_propertylist_has(parameters_header, p)) {
480 fitting->kern_fac = cpl_propertylist_get_double(parameters_header, p);
481 cpl_propertylist_update_double(pl, p, fitting->kern_fac);
484 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_VAR_KERN;
485 if (cpl_propertylist_has(parameters_header, p)) {
486 fitting->var_kern = cpl_propertylist_get_bool(parameters_header, p);
487 cpl_propertylist_update_bool(pl, p, fitting->var_kern);
492 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_OBSERVING_DATE_KEYWORD;
493 if (cpl_propertylist_has(parameters_header, p)) {
494 if (ambient->observing_date.key) cpl_free(ambient->observing_date.key);
495 ambient->observing_date.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
496 cpl_propertylist_update_string(pl, p, ambient->observing_date.key);
498 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_OBSERVING_DATE_VALUE;
499 if (cpl_propertylist_has(parameters_header, p)) {
500 ambient->observing_date.value = cpl_propertylist_get_double(parameters_header, p);
501 cpl_propertylist_update_double(pl, p, ambient->observing_date.value);
504 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_UTC_KEYWORD;
505 if (cpl_propertylist_has(parameters_header, p)) {
506 if (ambient->utc.key) cpl_free(ambient->utc.key);
507 ambient->utc.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
508 cpl_propertylist_update_string(pl, p, ambient->utc.key);
510 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_UTC_VALUE;
511 if (cpl_propertylist_has(parameters_header, p)) {
512 ambient->utc.value = cpl_propertylist_get_double(parameters_header, p);
513 cpl_propertylist_update_double(pl, p, ambient->utc.value);
516 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TELESCOPE_ANGLE_KEYWORD;
517 if (cpl_propertylist_has(parameters_header, p)) {
518 if (ambient->telescope_angle.key) cpl_free(ambient->telescope_angle.key);
519 ambient->telescope_angle.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
520 cpl_propertylist_update_string(pl, p, ambient->telescope_angle.key);
522 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TELESCOPE_ANGLE_VALUE;
523 if (cpl_propertylist_has(parameters_header, p)) {
524 ambient->telescope_angle.value = cpl_propertylist_get_double(parameters_header, p);
525 cpl_propertylist_update_double(pl, p, ambient->telescope_angle.value);
528 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_RELATIVE_HUMIDITY_KEYWORD;
529 if (cpl_propertylist_has(parameters_header, p)) {
530 if (ambient->relative_humidity.key) cpl_free(ambient->relative_humidity.key);
531 ambient->relative_humidity.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
532 cpl_propertylist_update_string(pl, p, ambient->relative_humidity.key);
534 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_RELATIVE_HUMIDITY_VALUE;
535 if (cpl_propertylist_has(parameters_header, p)) {
536 ambient->relative_humidity.value = cpl_propertylist_get_double(parameters_header, p);
537 cpl_propertylist_update_double(pl, p, ambient->relative_humidity.value);
540 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_PRESSURE_KEYWORD;
541 if (cpl_propertylist_has(parameters_header, p)) {
542 if (ambient->pressure.key) cpl_free(ambient->pressure.key);
543 ambient->pressure.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
544 cpl_propertylist_update_string(pl, p, ambient->pressure.key);
546 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_PRESSURE_VALUE;
547 if (cpl_propertylist_has(parameters_header, p)) {
548 ambient->pressure.value = cpl_propertylist_get_double(parameters_header, p);
549 cpl_propertylist_update_double(pl, p, ambient->pressure.value);
552 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TEMPERATURE_KEYWORD;
553 if (cpl_propertylist_has(parameters_header, p)) {
554 if (ambient->temperature.key) cpl_free(ambient->temperature.key);
555 ambient->temperature.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
556 cpl_propertylist_update_string(pl, p, ambient->temperature.key);
558 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_TEMPERATURE_VALUE;
559 if (cpl_propertylist_has(parameters_header, p)) {
560 ambient->temperature.value = cpl_propertylist_get_double(parameters_header, p);
561 cpl_propertylist_update_double(pl, p, ambient->temperature.value);
564 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_MIRROR_TEMPERATURE_KEYWORD;
565 if (cpl_propertylist_has(parameters_header, p)) {
566 if (ambient->mirror_temperature.key) cpl_free(ambient->mirror_temperature.key);
567 ambient->mirror_temperature.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
568 cpl_propertylist_update_string(pl, p, ambient->mirror_temperature.key);
570 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_MIRROR_TEMPERATURE_VALUE;
571 if (cpl_propertylist_has(parameters_header, p)) {
572 ambient->mirror_temperature.value = cpl_propertylist_get_double(parameters_header, p);
573 cpl_propertylist_update_double(pl, p, ambient->mirror_temperature.value);
576 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_ELEVATION_KEYWORD;
577 if (cpl_propertylist_has(parameters_header, p)) {
578 if (ambient->elevation.key) cpl_free(ambient->elevation.key);
579 ambient->elevation.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
580 cpl_propertylist_update_string(pl, p, ambient->elevation.key);
582 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_ELEVATION_VALUE;
583 if (cpl_propertylist_has(parameters_header, p)) {
584 ambient->elevation.value = cpl_propertylist_get_double(parameters_header, p);
585 cpl_propertylist_update_double(pl, p, ambient->elevation.value);
588 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_LONGITUDE_KEYWORD;
589 if (cpl_propertylist_has(parameters_header, p)) {
590 if (ambient->longitude.key) cpl_free(ambient->longitude.key);
591 ambient->longitude.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
592 cpl_propertylist_update_string(pl, p, ambient->longitude.key);
594 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_LONGITUDE_VALUE;
595 if (cpl_propertylist_has(parameters_header, p)) {
596 ambient->longitude.value = cpl_propertylist_get_double(parameters_header, p);
597 cpl_propertylist_update_double(pl, p, ambient->longitude.value);
600 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_LATITUDE_KEYWORD;
601 if (cpl_propertylist_has(parameters_header, p)) {
602 if (ambient->latitude.key) cpl_free(ambient->latitude.key);
603 ambient->latitude.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
604 cpl_propertylist_update_string(pl, p, ambient->latitude.key);
606 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_LATITUDE_VALUE;
607 if (cpl_propertylist_has(parameters_header, p)) {
608 ambient->latitude.value = cpl_propertylist_get_double(parameters_header, p);
609 cpl_propertylist_update_double(pl, p, ambient->latitude.value);
614 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_SLIT_WIDTH_KEYWORD;
615 if (cpl_propertylist_has(parameters_header, p)) {
616 if (instrumental->slit_width.key) cpl_free(instrumental->slit_width.key);
617 instrumental->slit_width.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
618 cpl_propertylist_update_string(pl, p, instrumental->slit_width.key);
620 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_SLIT_WIDTH_VALUE;
621 if (cpl_propertylist_has(parameters_header, p)) {
622 instrumental->slit_width.value = cpl_propertylist_get_double(parameters_header, p);
623 cpl_propertylist_update_double(pl, p, instrumental->slit_width.value);
626 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_PIXEL_SCALE_KEYWORD;
627 if (cpl_propertylist_has(parameters_header, p)) {
628 if (instrumental->pixel_scale.key) cpl_free(instrumental->pixel_scale.key);
629 instrumental->pixel_scale.key = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
630 cpl_propertylist_update_string(pl, p, instrumental->pixel_scale.key);
632 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_PIXEL_SCALE_VALUE;
633 if (cpl_propertylist_has(parameters_header, p)) {
634 instrumental->pixel_scale.value = cpl_propertylist_get_double(parameters_header, p);
635 cpl_propertylist_update_double(pl, p, instrumental->pixel_scale.value);
640 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_REFERENCE_ATMOSPHERIC;
641 if (cpl_propertylist_has(parameters_header, p)) {
642 if (atmospheric->ref_atm) cpl_free(atmospheric->ref_atm);
643 atmospheric->ref_atm = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
644 cpl_propertylist_update_string(pl, p, atmospheric->ref_atm);
647 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_GDAS_PROFILE;
648 if (cpl_propertylist_has(parameters_header, p)) {
649 if (atmospheric->gdas_prof) cpl_free(atmospheric->gdas_prof);
650 atmospheric->gdas_prof = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
651 cpl_propertylist_update_string(pl, p, atmospheric->gdas_prof);
654 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_LAYERS;
655 if (cpl_propertylist_has(parameters_header, p)) {
656 atmospheric->layers = cpl_propertylist_get_bool(parameters_header, p);
657 cpl_propertylist_update_bool(pl, p, atmospheric->layers);
660 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_EMIX;
661 if (cpl_propertylist_has(parameters_header, p)) {
662 atmospheric->emix = cpl_propertylist_get_double(parameters_header, p);
663 cpl_propertylist_update_double(pl, p, atmospheric->emix);
666 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_PWV;
667 if (cpl_propertylist_has(parameters_header, p)) {
668 atmospheric->pwv = cpl_propertylist_get_double(parameters_header, p);
669 cpl_propertylist_update_double(pl, p, atmospheric->pwv);
674 mf_io_lnfl_config *lnfl = mf_config->lnfl;
676 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LNFL_LINE_DB;
677 if (cpl_propertylist_has(parameters_header, p)) {
678 if (lnfl->line_db) cpl_free(lnfl->line_db);
679 lnfl->line_db = cpl_strdup(cpl_propertylist_get_string(parameters_header, p));
680 cpl_propertylist_update_string(pl, p, lnfl->line_db);
683 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LNFL_LINE_DB_FMT;
684 if (cpl_propertylist_has(parameters_header, p)) {
685 lnfl->line_db_fmt = cpl_propertylist_get_double(parameters_header, p);
686 cpl_propertylist_update_double(pl, p, lnfl->line_db_fmt);
691 mf_io_lblrtm_config *lblrtm = mf_config->lblrtm;
693 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_ICNTNM;
694 if (cpl_propertylist_has(parameters_header, p)) {
695 lblrtm->icntnm = cpl_propertylist_get_int(parameters_header, p);
696 cpl_propertylist_update_int(pl, p, lblrtm->icntnm);
699 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_IAERSL;
700 if (cpl_propertylist_has(parameters_header, p)) {
701 lblrtm->iaersl = cpl_propertylist_get_int(parameters_header, p);
702 cpl_propertylist_update_int(pl, p, lblrtm->iaersl);
705 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_MPTS;
706 if (cpl_propertylist_has(parameters_header, p)) {
707 lblrtm->mpts = cpl_propertylist_get_int(parameters_header, p);
708 cpl_propertylist_update_int(pl, p, lblrtm->mpts);
711 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_NPTS;
712 if (cpl_propertylist_has(parameters_header, p)) {
713 lblrtm->npts = cpl_propertylist_get_int(parameters_header, p);
714 cpl_propertylist_update_int(pl, p, lblrtm->npts);
717 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_V1;
718 if (cpl_propertylist_has(parameters_header, p)) {
719 lblrtm->v[0] = cpl_propertylist_get_double(parameters_header, p);
720 cpl_propertylist_update_double(pl, p, lblrtm->v[0]);
722 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_V2;
723 if (cpl_propertylist_has(parameters_header, p)) {
724 lblrtm->v[1] = cpl_propertylist_get_double(parameters_header, p);
725 cpl_propertylist_update_double(pl, p, lblrtm->v[1]);
728 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_SAMPLE;
729 if (cpl_propertylist_has(parameters_header, p)) {
730 lblrtm->sample = cpl_propertylist_get_int(parameters_header, p);
731 cpl_propertylist_update_int(pl, p, lblrtm->sample);
734 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_ALFAL0;
735 if (cpl_propertylist_has(parameters_header, p)) {
736 lblrtm->alfal0 = cpl_propertylist_get_double(parameters_header, p);
737 cpl_propertylist_update_double(pl, p, lblrtm->alfal0);
740 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_AVMASS;
741 if (cpl_propertylist_has(parameters_header, p)) {
742 lblrtm->avmass = cpl_propertylist_get_double(parameters_header, p);
743 cpl_propertylist_update_double(pl, p, lblrtm->avmass);
746 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_DPTMIN;
747 if (cpl_propertylist_has(parameters_header, p)) {
748 lblrtm->dptmin = cpl_propertylist_get_double(parameters_header, p);
749 cpl_propertylist_update_double(pl, p, lblrtm->dptmin);
752 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_DPTFAC;
753 if (cpl_propertylist_has(parameters_header, p)) {
754 lblrtm->dptfac = cpl_propertylist_get_double(parameters_header, p);
755 cpl_propertylist_update_double(pl, p, lblrtm->dptfac);
758 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_TBOUND;
759 if (cpl_propertylist_has(parameters_header, p)) {
760 lblrtm->tbound = cpl_propertylist_get_double(parameters_header, p);
761 cpl_propertylist_update_double(pl, p, lblrtm->tbound);
764 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_SREMIS1;
765 if (cpl_propertylist_has(parameters_header, p)) {
766 lblrtm->sremis[0] = cpl_propertylist_get_double(parameters_header, p);
767 cpl_propertylist_update_double(pl, p, lblrtm->sremis[0]);
769 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_SREMIS2;
770 if (cpl_propertylist_has(parameters_header, p)) {
771 lblrtm->sremis[1] = cpl_propertylist_get_double(parameters_header, p);
772 cpl_propertylist_update_double(pl, p, lblrtm->sremis[1]);
774 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_SREMIS3;
775 if (cpl_propertylist_has(parameters_header, p)) {
776 lblrtm->sremis[2] = cpl_propertylist_get_double(parameters_header, p);
777 cpl_propertylist_update_double(pl, p, lblrtm->sremis[2]);
780 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_SRREFL1;
781 if (cpl_propertylist_has(parameters_header, p)) {
782 lblrtm->srrefl[0] = cpl_propertylist_get_double(parameters_header, p);
783 cpl_propertylist_update_double(pl, p, lblrtm->srrefl[0]);
785 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_SRREFL2;
786 if (cpl_propertylist_has(parameters_header, p)) {
787 lblrtm->srrefl[1] = cpl_propertylist_get_double(parameters_header, p);
788 cpl_propertylist_update_double(pl, p, lblrtm->srrefl[1]);
790 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_SRREFL3;
791 if (cpl_propertylist_has(parameters_header, p)) {
792 lblrtm->srrefl[2] = cpl_propertylist_get_double(parameters_header, p);
793 cpl_propertylist_update_double(pl, p, lblrtm->srrefl[2]);
796 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_MODEL;
797 if (cpl_propertylist_has(parameters_header, p)) {
798 lblrtm->model = cpl_propertylist_get_int(parameters_header, p);
799 cpl_propertylist_update_int(pl, p, lblrtm->model);
802 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_ITYPE;
803 if (cpl_propertylist_has(parameters_header, p)) {
804 lblrtm->itype = cpl_propertylist_get_int(parameters_header, p);
805 cpl_propertylist_update_int(pl, p, lblrtm->itype);
808 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_NOZERO;
809 if (cpl_propertylist_has(parameters_header, p)) {
810 lblrtm->nozero = cpl_propertylist_get_int(parameters_header, p);
811 cpl_propertylist_update_int(pl, p, lblrtm->nozero);
814 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_NOPRNT;
815 if (cpl_propertylist_has(parameters_header, p)) {
816 lblrtm->noprnt = cpl_propertylist_get_int(parameters_header, p);
817 cpl_propertylist_update_int(pl, p, lblrtm->noprnt);
820 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_IPUNCH;
821 if (cpl_propertylist_has(parameters_header, p)) {
822 lblrtm->ipunch = cpl_propertylist_get_int(parameters_header, p);
823 cpl_propertylist_update_int(pl, p, lblrtm->ipunch);
826 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_RE;
827 if (cpl_propertylist_has(parameters_header, p)) {
828 lblrtm->re = cpl_propertylist_get_double(parameters_header, p);
829 cpl_propertylist_update_double(pl, p, lblrtm->re);
832 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_HSPACE;
833 if (cpl_propertylist_has(parameters_header, p)) {
834 lblrtm->hspace = cpl_propertylist_get_double(parameters_header, p);
835 cpl_propertylist_update_double(pl, p, lblrtm->hspace);
838 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_LATITUDE_VALUE;
839 if (cpl_propertylist_has(parameters_header, p)) {
840 lblrtm->ref_lat = cpl_propertylist_get_double(parameters_header, p);
841 cpl_propertylist_update_double(pl, p, lblrtm->ref_lat);
844 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_PARAMETERS_ELEVATION_VALUE;
845 if (cpl_propertylist_has(parameters_header, p)) {
846 lblrtm->h[0] = ambient->elevation.value /1000.00 ;
849 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_H2;
850 if (cpl_propertylist_has(parameters_header, p)) {
851 lblrtm->h[1] = cpl_propertylist_get_double(parameters_header, p);
852 cpl_propertylist_update_double(pl, p, lblrtm->h[1]);
855 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_RANGE;
856 if (cpl_propertylist_has(parameters_header, p)) {
857 lblrtm->range = cpl_propertylist_get_double(parameters_header, p);
858 cpl_propertylist_update_double(pl, p, lblrtm->range);
861 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_BETA;
862 if (cpl_propertylist_has(parameters_header, p)) {
863 lblrtm->beta = cpl_propertylist_get_double(parameters_header, p);
864 cpl_propertylist_update_double(pl, p, lblrtm->beta);
867 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_LEN;
868 if (cpl_propertylist_has(parameters_header, p)) {
869 lblrtm->len = cpl_propertylist_get_int(parameters_header, p);
870 cpl_propertylist_update_int(pl, p, lblrtm->len);
873 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_HOBS;
874 if (cpl_propertylist_has(parameters_header, p)) {
875 lblrtm->hobs = cpl_propertylist_get_double(parameters_header, p);
876 cpl_propertylist_update_double(pl, p, lblrtm->hobs);
879 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_AVTRAT;
880 if (cpl_propertylist_has(parameters_header, p)) {
881 lblrtm->avtrat = cpl_propertylist_get_double(parameters_header, p);
882 cpl_propertylist_update_double(pl, p, lblrtm->avtrat);
885 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_TDIFF1;
886 if (cpl_propertylist_has(parameters_header, p)) {
887 lblrtm->tdiff[0] = cpl_propertylist_get_double(parameters_header, p);
888 cpl_propertylist_update_double(pl, p, lblrtm->tdiff[0]);
890 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_TDIFF2;
891 if (cpl_propertylist_has(parameters_header, p)) {
892 lblrtm->tdiff[1] = cpl_propertylist_get_double(parameters_header, p);
893 cpl_propertylist_update_double(pl, p, lblrtm->tdiff[1]);
896 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_ALTD1;
897 if (cpl_propertylist_has(parameters_header, p)) {
898 lblrtm->altd[0] = cpl_propertylist_get_double(parameters_header, p);
899 cpl_propertylist_update_double(pl, p, lblrtm->altd[0]);
901 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_ALTD2;
902 if (cpl_propertylist_has(parameters_header, p)) {
903 lblrtm->altd[1] = cpl_propertylist_get_double(parameters_header, p);
904 cpl_propertylist_update_double(pl, p, lblrtm->altd[1]);
907 p = MF_PARAMETERS_CONTEX_DEFAULT
" "MF_LBLRTM_DELV;
908 if (cpl_propertylist_has(parameters_header, p)) {
909 lblrtm->delv = cpl_propertylist_get_double(parameters_header, p);
910 cpl_propertylist_update_double(pl, p, lblrtm->delv);
915 cpl_error_code e = mf_parameters_config_update_with_header_keywords(mf_config->parameters, data_header);
918 cpl_msg_info(cpl_func,
"Columns : wave[%s], flux[%s], dflux[%s], mask[%s]", inputs->column_lambda, inputs->column_flux, inputs->column_dflux, inputs->column_mask);
922 if (!cpl_errorstate_is_equal(pre_state) || e != CPL_ERROR_NONE) {
923 mf_configuration_delete(mf_config);
924 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
925 "Error loading Molecfit default configuration");
929 return CPL_ERROR_NONE;
933_moo_molecfit_update_mf_conf_with_winc(mf_configuration *config,
934 cpl_table *inc_wranges)
938 mf_parameters_fitting *fitting = &(config->parameters->fitting);
939 int nrange = cpl_table_get_nrow(inc_wranges);
941 for (
int i = 0; i < nrange; i++) {
942 cpl_boolean flag = CPL_TRUE;
945 cpl_table_get_int(inc_wranges, MF_COL_WAVE_RANGE_CONT_FIT, i, NULL);
946 int order = cpl_table_get_int(inc_wranges, MF_COL_WAVE_RANGE_CONT_ORDER,
948 if (order > max_order) {
953 fitting->fit_ranges[i] = flag;
954 fitting->cont_poly_order[i] = order;
955 fitting->cont_coeffs[i][0] = fitting->fit_continuum.const_val;
956 fitting->cont_coeffs[i][1] = 1;
958 fitting->fit_continuum.n = max_order;
959 fitting->fit_chips[0] = CPL_TRUE;
961 return CPL_ERROR_NONE;
965_mf_parameters_fit_dump(
const char *name, mf_parameters_fit *fit, FILE *out)
967 fprintf(out,
"%s.fit : %d\n", name, fit->fit);
968 fprintf(out,
"%s.n : %lld\n", name, fit->n);
969 fprintf(out,
"%s.const_val : %e\n", name, fit->const_val);
973_mf_parameters_key_dump(
const char *name, mf_parameters_keyword *key, FILE *out)
975 fprintf(out,
"%s.key : %s\n", name, key->key);
976 fprintf(out,
"%s.value : %e\n", name, key->value);
980_moo_molecfit_mf_conf_dump(mf_configuration *config,
int nrange, FILE *out)
982 mf_parameters_inputs *inputs = &(config->parameters->inputs);
983 fprintf(out,
"---INPUTS\n");
984 fprintf(out,
"wlg_to_micron: %f\n", inputs->wlg_to_micron);
986 fprintf(out,
"column_lambda: %s\n", inputs->column_lambda);
987 fprintf(out,
"column_flux: %s\n", inputs->column_flux);
988 fprintf(out,
"column_dflux: %s\n", inputs->column_dflux);
989 fprintf(out,
"column_mask: %s\n", inputs->column_mask);
990 fprintf(out,
"default_error: %e\n", inputs->default_error);
991 fprintf(out,
"mask_binary: %d\n", inputs->mask_binary);
992 fprintf(out,
"mask_threshold: %d\n", inputs->mask_threshold);
993 fprintf(out,
"wavelengths_frame: %s\n", inputs->wavelengths_frame);
994 fprintf(out,
"transmission : %d\n", inputs->transmission);
995 fprintf(out,
"clean_flux : %d\n", inputs->clean_flux);
996 fprintf(out,
"silent_external_bins : %d\n",
997 inputs->silent_external_bins);
998 _mf_parameters_key_dump(
"observing_erv_rv", &(inputs->observing_erv_rv),
1001 fprintf(out,
"\n---DIRECTORIES\n");
1002 fprintf(out,
"telluric_path : %s\n",
1003 config->parameters->directories.telluric_path);
1004 fprintf(out,
"telluriccorr_data_path : %s\n",
1005 config->parameters->directories.telluriccorr_data_path);
1006 fprintf(out,
"tmp_path : %s\n",
1007 config->parameters->directories.tmp_path);
1009 mf_parameters_fitting *fitting = &(config->parameters->fitting);
1010 fprintf(out,
"\n---FITTING\n");
1011 fprintf(out,
"ftol : %e\n", fitting->ftol);
1012 fprintf(out,
"xtol : %e\n", fitting->xtol);
1013 fprintf(out,
"flux_unit : %d\n", fitting->flux_unit);
1014 _mf_parameters_fit_dump(
"fit_telescope_background",
1015 &(fitting->fit_telescope_background), out);
1016 _mf_parameters_fit_dump(
"fit_continuum", &(fitting->fit_continuum), out);
1017 _mf_parameters_fit_dump(
"fit_wavelength",
1018 &(fitting->fit_telescope_background), out);
1019 _mf_parameters_fit_dump(
"fit_gauss", &(fitting->fit_gauss), out);
1020 _mf_parameters_fit_dump(
"fit_res_box", &(fitting->fit_res_box), out);
1021 _mf_parameters_fit_dump(
"fit_lorentz", &(fitting->fit_lorentz), out);
1022 fprintf(out,
"kern_mode : %d\n", fitting->kern_mode);
1023 fprintf(out,
"kern_fac : %e\n", fitting->kern_fac);
1024 fprintf(out,
"var_kern : %d\n", fitting->var_kern);
1025 fprintf(out,
"expert_mode : %d\n", fitting->expert_mode);
1026 fprintf(out,
"fit_n_cflags : %d\n", fitting->fit_n_cflags);
1027 fprintf(out,
"fit_n_rflags : %d\n", fitting->fit_n_rflags);
1029 for (
int i = 0; i < nrange; i++) {
1030 fprintf(out,
"fit_ranges [%d] : %d\n", i, fitting->fit_ranges[i]);
1031 fprintf(out,
"fit_chips [%d] : %d\n", i, fitting->fit_chips[i]);
1032 fprintf(out,
"cont_poly_order[%d] : %d\n", i,
1033 fitting->cont_poly_order[i]);
1034 for (
int j = 0; j < fitting->cont_poly_order[i]; j++) {
1035 fprintf(out,
"cont_coeffs [%d][%d] : %f\n", i, j,
1036 fitting->cont_coeffs[i][j]);
1038 fprintf(out,
"wlc_poly_order [%d] : %d\n", i,
1039 fitting->wlc_poly_order[i]);
1040 fprintf(out,
"wlc_coeffs [%d][0] : %f\n", i,
1041 fitting->wlc_coeffs[i][0]);
1044 mf_parameters_instrumental *instrumental =
1045 &(config->parameters->instrumental);
1046 fprintf(out,
"\n---INSTRUMENTAL\n");
1047 _mf_parameters_key_dump(
"slit_width", &(instrumental->slit_width), out);
1048 _mf_parameters_key_dump(
"pixel_scale", &(instrumental->pixel_scale), out);
1050 mf_parameters_atmospheric *atmospheric = &(config->parameters->atmospheric);
1051 fprintf(out,
"\n---ATMOSPHERIC\n");
1053 fprintf(out,
"ref_atm : %s\n", atmospheric->ref_atm);
1054 fprintf(out,
"layers : %d\n", atmospheric->layers);
1055 fprintf(out,
"emix : %e\n", atmospheric->emix);
1056 fprintf(out,
"pwv : %e\n", atmospheric->pwv);
1057 fprintf(out,
"gdas_prof : %s\n", atmospheric->gdas_prof);
1059 mf_io_lnfl_config *lnfl = config->lnfl;
1060 fprintf(out,
"\n---LNLF\n");
1061 fprintf(out,
"line_db : %s\n", lnfl->line_db);
1062 fprintf(out,
"line_db_fmt : %d\n", lnfl->line_db_fmt);
1064 mf_io_lblrtm_config *lblrtm = config->lblrtm;
1097 fprintf(out,
"\n---LBLRTM\n");
1098 fprintf(out,
"alfal0 : %e\n", lblrtm->alfal0);
1099 fprintf(out,
"altd[0] : %e\n", lblrtm->altd[0]);
1100 fprintf(out,
"altd[1] : %e\n", lblrtm->altd[1]);
1101 fprintf(out,
"avmass : %e\n", lblrtm->avmass);
1102 fprintf(out,
"avtrat : %e\n", lblrtm->avtrat);
1103 fprintf(out,
"beta : %e\n", lblrtm->beta);
1104 fprintf(out,
"dptfac : %e\n", lblrtm->dptfac);
1105 fprintf(out,
"dptmin : %e\n", lblrtm->dptmin);
1106 fprintf(out,
"h[0] : %e\n", lblrtm->h[0]);
1107 fprintf(out,
"h[1] : %e\n", lblrtm->h[1]);
1108 fprintf(out,
"hobs : %e\n", lblrtm->hobs);
1109 fprintf(out,
"hspace : %e\n", lblrtm->hspace);
1110 fprintf(out,
"iaersl : %d\n", lblrtm->iaersl);
1111 fprintf(out,
"icntnm : %d\n", lblrtm->icntnm);
1112 fprintf(out,
"ipunch : %d\n", lblrtm->ipunch);
1113 fprintf(out,
"itype : %d\n", lblrtm->itype);
1114 fprintf(out,
"len : %d\n", lblrtm->len);
1115 fprintf(out,
"model : %d\n", lblrtm->mpts);
1116 fprintf(out,
"npprnt : %d\n", lblrtm->noprnt);
1117 fprintf(out,
"nozero : %d\n", lblrtm->nozero);
1118 fprintf(out,
"npts : %d\n", lblrtm->npts);
1119 fprintf(out,
"range : %e\n", lblrtm->range);
1120 fprintf(out,
"re : %e\n", lblrtm->re);
1121 fprintf(out,
"sample : %d\n", lblrtm->sample);
1122 fprintf(out,
"sremis[0] :%e\n", lblrtm->sremis[0]);
1123 fprintf(out,
"sremis[1] :%e\n", lblrtm->sremis[1]);
1124 fprintf(out,
"sremis[2] :%e\n", lblrtm->sremis[2]);
1125 fprintf(out,
"srrefl[0] :%e\n", lblrtm->srrefl[0]);
1126 fprintf(out,
"srrefl[1] :%e\n", lblrtm->srrefl[1]);
1127 fprintf(out,
"srrefl[2] :%e\n", lblrtm->srrefl[2]);
1128 fprintf(out,
"tbound :%e\n", lblrtm->tbound);
1129 fprintf(out,
"tdiff[0] :%e\n", lblrtm->tdiff[0]);
1130 fprintf(out,
"tdiff[1] :%e\n", lblrtm->tdiff[1]);
1131 fprintf(out,
"v[0] :%e\n", lblrtm->v[0]);
1132 fprintf(out,
"v[1] :%e\n", lblrtm->v[1]);
1134 return CPL_ERROR_NONE;
1159 const char *modename,
1160 const cpl_frame *molecule_frame,
1161 const cpl_frame *winc_frame,
1162 moo_molectable **pmt_atm_fitted,
1163 moo_molectable **best_fitted_model,
1164 moo_molecfit_model_params *params)
1166 mf_configuration *mf_config = NULL;
1167 moo_molectable *mt_molecules = NULL;
1168 moo_molectable *mt_winc = NULL;
1169 moo_molectable *mt_lblrtm_input = NULL;
1170 moo_molectable *mt_excprange_input = NULL;
1171 moo_molectable *mt_excwrange_input = NULL;
1173 moo_molectable *mt_gdas_interp = NULL;
1174 moo_molectable *mt_gdas_after = NULL;
1175 moo_molectable *mt_gdas_before = NULL;
1176 moo_molectable *mt_atm_combined = NULL;
1177 moo_molectable *mt_atm_fitted = NULL;
1178 moo_molectable *mt_atm_standard = NULL;
1179 moo_molectable *mt_best_fitted = NULL;
1180 moo_molectable *mt_best_model = NULL;
1182 cpl_table *molecules_table = NULL;
1183 cpl_table *winc_table = NULL;
1184 cpl_table *spec = NULL;
1185 cpl_table *gdas_user = NULL;
1186 cpl_table *atm_profile_standard = NULL;
1187 cpl_table *atm_profile_combined = NULL;
1188 cpl_error_code err = CPL_ERROR_NONE;
1189 moo_sci *sci = NULL;
1190 mf_model_results *results = NULL;
1191 cpl_table *mdata = NULL;
1193 cpl_errorstate prestate = cpl_errorstate_get();
1195 cpl_ensure(pmt_atm_fitted != NULL, CPL_ERROR_NULL_INPUT, NULL);
1197 cpl_msg_info(__func__,
"use molecfit model");
1198 mf_config = mf_configuration_create();
1217 mt_atm_fitted->primary_header = cpl_propertylist_new();
1218 mt_best_fitted->primary_header = cpl_propertylist_new();
1219 mt_best_model->primary_header = cpl_propertylist_new();
1222 for (
int type = 0; type < 3; type++) {
1226 if (sci_single != NULL && molecules_table != NULL &&
1227 winc_table != NULL) {
1228 cpl_msg_info(__func__,
"Do molecfit_model for %s",
1229 sci_single->extname);
1230 cpl_msg_indent_more();
1237 err = mf_parameters_config_update_with_header_keywords(
1238 mf_config->parameters, sci->primary_header);
1240 if (err != CPL_ERROR_NONE) {
1241 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
1242 "Error updating molecfit parameters with "
1243 "the raw primary header configuration");
1245 _moo_molecfit_update_mf_conf(mf_config, params);
1246 _moo_molecfit_update_mf_conf_with_winc(mf_config, winc_table);
1249 cpl_image *img = hdrl_image_get_image(hdata);
1250 cpl_image *ierr = hdrl_image_get_error(hdata);
1251 mdata = _molecfit_data_create(crpix1, crval1, cd1_1, img, ierr, 1);
1253 cpl_msg_info(cpl_func,
"MNB About to call mf_model, err=%d", err);
1257 cpl_table *exc_wranges = NULL;
1258 cpl_table *exc_pranges = NULL;
1259 cpl_propertylist *header_kernel = NULL;
1260 cpl_matrix *kernel = NULL;
1263 cpl_table *spec_telluriccorr_lblrtm =
1264 mf_spectrum_create(mf_config->parameters, mdata);
1265 spec = spec_telluriccorr_lblrtm;
1267#if MOO_DEBUG_MOLECFIT_MODEL
1269 if (atm_profile_standard != NULL) {
1271 cpl_sprintf(
"ATM_PROFILE_STANDARD_INPUT_%s.fits", arm);
1272 cpl_table_save(atm_profile_standard, NULL, NULL, testname,
1276 if (atm_profile_combined != NULL) {
1278 cpl_sprintf(
"ATM_PROFILE_COMBINED_INPUT_%s.fits", arm);
1279 cpl_table_save(atm_profile_combined, NULL, NULL, testname,
1283 if (gdas_user != NULL) {
1285 cpl_sprintf(
"GDAS_USER_INPUT_%s.fits", arm);
1286 cpl_table_save(gdas_user, NULL, NULL, testname,
1293 if (sci_single->header) {
1295 cpl_sprintf(
"HEADER_SPEC_INPUT_%s.txt", arm);
1296 FILE *f = fopen(testname,
"w");
1297 cpl_propertylist_dump(sci_single->header, f);
1301 if (header_kernel != NULL) {
1303 cpl_sprintf(
"HEADER_KERNEL_INPUT_%s.txt", arm);
1304 FILE *f = fopen(testname,
"w");
1305 cpl_propertylist_dump(header_kernel, f);
1309 if (kernel != NULL) {
1310 char *testname = cpl_sprintf(
"KERNEL_INPUT_%s.txt", arm);
1311 FILE *f = fopen(testname,
"w");
1312 cpl_matrix_dump(kernel, f);
1316 if (mf_config != NULL) {
1317 char *testname = cpl_sprintf(
"MF_CONFIG_INPUT_%s.txt", arm);
1318 cpl_msg_info(
"test",
"save config %s", testname);
1319 FILE *f = fopen(testname,
"w");
1320 _moo_molecfit_mf_conf_dump(mf_config, nrange, f);
1326 mf_config, molecules_table, sci_single->header,
1334 atm_profile_standard,
1335 atm_profile_combined);
1336 err = cpl_error_get_code();
1338 if (!err && results != NULL) {
1340 results->gdas_interpolate);
1342 results->gdas_before);
1344 results->gdas_after);
1346 results->atm_profile_standard);
1348 results->atm_profile_combined);
1350 results->atm_profile_fitted);
1355 if (results != NULL) {
1356 if (results->atm_profile_combined != NULL) {
1357 cpl_table_delete(results->atm_profile_combined);
1358 results->atm_profile_combined = NULL;
1360 if (results->atm_profile_standard != NULL) {
1361 cpl_table_delete(results->atm_profile_standard);
1362 results->atm_profile_standard = NULL;
1364 mf_model_results_delete(results);
1367 cpl_table_delete(exc_pranges);
1368 cpl_table_delete(exc_wranges);
1369 cpl_table_delete(spec);
1373 cpl_table_delete(mdata);
1378 if (!cpl_errorstate_is_equal(prestate)) {
1382 mt_best_fitted = NULL;
1383 mt_atm_fitted = NULL;
1384 mt_best_model = NULL;
1385 cpl_table_delete(mdata);
1386 mf_model_results_delete(results);
1388 *pmt_atm_fitted = mt_atm_fitted;
1389 *best_fitted_model = mt_best_model;
1400 mf_configuration_delete(mf_config);
1402 return mt_best_fitted;
1429 const char *modename,
1430 const cpl_frame *molecules_frame,
1431 const cpl_frame *atm_frame,
1432 const cpl_frame *best_fit_frame,
1433 const cpl_frame *kernel_lib_frame,
1434 moo_molecfit_calctrans_params *params)
1436 moo_rbn *rbn = NULL;
1438 mf_configuration *mf_config = NULL;
1439 moo_molectable *mt_molecules = NULL;
1440 moo_molectable *mt_atm = NULL;
1441 moo_molectable *mt_bfit = NULL;
1443 cpl_table *mdata = NULL;
1444 moo_molectable *mt_lblrtm_results = NULL;
1445 cpl_error_code err = CPL_ERROR_NONE;
1446 cpl_array *sel = NULL;
1447 moo_telluric *result = NULL;
1448 int filter_skyfibre = 1;
1449 cpl_ensure(rbn_frame != NULL, CPL_ERROR_NULL_INPUT, NULL);
1450 cpl_ensure(atm_frame != NULL, CPL_ERROR_NULL_INPUT, NULL);
1451 cpl_ensure(best_fit_frame != NULL, CPL_ERROR_NULL_INPUT, NULL);
1452 cpl_ensure(params != NULL, CPL_ERROR_NULL_INPUT, NULL);
1454 filter_skyfibre = params->filter_skyfibre;
1455 mf_config = mf_configuration_create();
1466 const char *snrcolnames[] = { MOO_FIBRES_TABLE_MEDSNR_RI_EXT,
1467 MOO_FIBRES_TABLE_MEDSNR_YJ_EXT,
1468 MOO_FIBRES_TABLE_MEDSNR_H_EXT };
1470 MOO_TELLURIC_EXT_H };
1472 result->primary_header = cpl_propertylist_new();
1473 result->telluric_table = cpl_table_new(0);
1475 cpl_table_new_column(result->telluric_table, MOO_TELLURIC_TABLE_INDEXRBN,
1477 cpl_table_new_column(result->telluric_table, MOO_TELLURIC_TABLE_SPECTRO,
1479 cpl_table_new_column(result->telluric_table, MOO_TELLURIC_TABLE_BAND,
1481 cpl_table_new_column(result->telluric_table, MOO_TELLURIC_TABLE_TELLURIC,
1484 for (
int type = 0; type < 3; type++) {
1486 cpl_table *molecules_table =
1491 cpl_table *best_fit_parameters_table =
1494 if (rbn_single != NULL && molecules_table != NULL &&
1495 atm_parameters_table != NULL && best_fit_parameters_table != NULL) {
1496 cpl_table *telluric_table = NULL;
1497 double min_snr = params->min_snr[type];
1498 const char *band = bandcolnames[type];
1499 cpl_table_unselect_all(fibre_table);
1501 for (
int i = 0; i < cpl_table_get_nrow(fibre_table); i++) {
1503 double val = cpl_table_get_float(fibre_table, snrcolnames[type],
1506 cpl_table_select_row(fibre_table, i);
1512 cpl_table_and_selected_int(fibre_table, MOO_FIBRES_TABLE_HEALTH,
1514 MOO_FIBRES_TABLE_HEALTH_BROKEN);
1515 if (filter_skyfibre) {
1516 size = cpl_table_and_selected_string(fibre_table,
1517 MOO_FIBRES_TABLE_TYPE,
1519 MOO_FIBRES_TABLE_TYPE_SKY);
1520 size = cpl_table_and_selected_string(
1521 fibre_table, MOO_FIBRES_TABLE_TYPE, CPL_NOT_EQUAL_TO,
1522 MOO_FIBRES_TABLE_TYPE_SKYCONTAM);
1524 size = cpl_table_and_selected_float(fibre_table, snrcolnames[type],
1525 CPL_GREATER_THAN, min_snr);
1527 sel = cpl_table_where_selected(fibre_table);
1529 cpl_msg_info(__func__,
1530 "Do molecfit_calctrans for %s (%d selected fibres)",
1531 rbn_single->extname, size);
1532 cpl_msg_indent_more();
1538 err = mf_parameters_config_update_with_header_keywords(
1539 mf_config->parameters, rbn->primary_header);
1541 if (err != CPL_ERROR_NONE) {
1542 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
1543 "Error updating molecfit parameters with "
1544 "the raw primary header configuration");
1547 _moo_molecfit_update_mf_conf(mf_config, NULL);
1550 cpl_image *img = hdrl_image_get_image(hdata);
1551 cpl_image *ierr = hdrl_image_get_error(hdata);
1552 int nx = cpl_image_get_size_x(img);
1553 telluric_table = cpl_table_new(size);
1555 cpl_table_new_column(telluric_table, MOO_TELLURIC_TABLE_INDEXRBN,
1557 cpl_table_new_column(telluric_table, MOO_TELLURIC_TABLE_SPECTRO,
1559 cpl_table_new_column(telluric_table, MOO_TELLURIC_TABLE_BAND,
1561 cpl_table_new_column(telluric_table, MOO_TELLURIC_TABLE_TELLURIC,
1564 cpl_propertylist *theader = cpl_propertylist_new();
1565 cpl_propertylist_copy_property(theader, header, MOO_PFITS_CD1_1);
1566 cpl_propertylist_copy_property(theader, header, MOO_PFITS_CRVAL1);
1567 cpl_propertylist_copy_property(theader, header, MOO_PFITS_CRPIX1);
1568 cpl_propertylist_copy_property(theader, header, MOO_PFITS_CUNIT1);
1569 result->data_header[type] = theader;
1571 cpl_image *im = cpl_image_new(nx, size, CPL_TYPE_DOUBLE);
1573 mf_calctrans_lblrtm_results *lblrtm_results = NULL;
1574 const double wl_start = -1.;
1575 const double wl_end = -1.;
1576 const cpl_propertylist *spec_telluriccorr_head = rbn_single->header;
1579 cpl_msg_info(__func__,
"Do LBLRTM for %s", rbn_single->extname);
1580 int idx = cpl_array_get_cplsize(sel, 0, NULL);
1582 cpl_table_get_int(fibre_table, MOO_FIBRES_TABLE_INDEXRBN,
1585 mdata = _molecfit_data_create(crpix1, crval1, cd1_1, img, ierr,
1589 cpl_table *spec_telluriccorr =
1590 mf_spectrum_create(mf_config->parameters, mdata);
1593 mf_calctrans_lblrtm(mf_config, spec_telluriccorr,
1594 molecules_table, wl_start, wl_end,
1595 atm_parameters_table,
1596 best_fit_parameters_table);
1597 cpl_table_delete(spec_telluriccorr);
1598 cpl_table_delete(mdata);
1601 if (!(lblrtm_results)) {
1602 err = cpl_error_set_message(
1603 cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
1604 "Unexpected error in the Molecfit call "
1605 "mf_calctrans_lblrtm(...)");
1608 cpl_size n_range = mf_config->parameters->internal.n_range;
1611 err = cpl_error_set_message(
1612 cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
1613 "Unexpected n_ranges in the "
1614 "mf_calctrans_lblrtm(...) Molecfit execution : "
1615 "n_ranges = %lld (Mandatory == 1)",
1619 err = cpl_error_get_code();
1622 for (
int i = 0; i < size; i++) {
1623 mf_calctrans_convolution_results *convolution_results =
1625 int idx = cpl_array_get_cplsize(sel, i, NULL);
1626 int idrbn = cpl_table_get_int(fibre_table,
1627 MOO_FIBRES_TABLE_INDEXRBN,
1630 cpl_table_get_int(fibre_table,
1631 MOO_FIBRES_TABLE_SPECTRO, idx,
1633 cpl_table_set_int(telluric_table,
1634 MOO_TELLURIC_TABLE_INDEXRBN, i,
1636 cpl_table_set_int(telluric_table,
1637 MOO_TELLURIC_TABLE_SPECTRO, i,
1639 cpl_table_set_string(telluric_table,
1640 MOO_TELLURIC_TABLE_BAND, i, band);
1641 cpl_table_set_int(telluric_table,
1642 MOO_TELLURIC_TABLE_TELLURIC, i,
1645 cpl_msg_info(__func__,
"Do convolution for %d:%d",
1646 idrbn, cpl_error_get_code());
1648 mdata = _molecfit_data_create(crpix1, crval1, cd1_1,
1651 cpl_table *spec_telluriccorr =
1652 mf_spectrum_create(mf_config->parameters, mdata);
1655 "Convolve input spectrum "
1656 "(ext_orig[ATM_PARAMETERS/BEST_FIT_PARAMETERS]");
1657 cpl_propertylist *header_kernel = NULL;
1658 cpl_matrix *kernel = NULL;
1664 convolution_results =
1665 mf_calctrans_convolution(mf_config->parameters,
1667 spec_telluriccorr_head,
1669 header_kernel, kernel,
1671 best_fit_parameters_table);
1672 if (!convolution_results) {
1673 err = cpl_error_set_message(
1674 cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
1675 "Unexpected error in the Molecfit call "
1676 "mf_calctrans_convolution(...)");
1679 cpl_table *telluric_data =
1680 convolution_results->spec_telluriccorr_format;
1681 for (
int k = 0; k < nx; k++) {
1682 double mt = cpl_table_get(telluric_data,
1684 cpl_image_set(im, k + 1, i + 1, mt);
1686#if MOO_DEBUG_MOLECFIT_CALCTRANS
1689 cpl_sprintf(
"TELLURICDATA_%s_%d.fits",
1690 rbn_single->extname, idrbn);
1691 cpl_table_save(telluric_data, NULL, NULL,
1692 testname, CPL_IO_CREATE);
1696 err = cpl_error_get_code();
1699 cpl_propertylist_delete(header_kernel);
1700 cpl_matrix_delete(kernel);
1701 mf_calctrans_convolution_results_delete(
1702 convolution_results);
1703 cpl_table_delete(spec_telluriccorr);
1704 cpl_table_delete(mdata);
1706 mf_calctrans_lblrtm_results_delete(lblrtm_results);
1710 int nrow = cpl_table_get_nrow(result->telluric_table);
1711 cpl_table_insert(result->telluric_table, telluric_table, nrow);
1713 cpl_table_delete(telluric_table);
1714 cpl_array_delete(sel);
1719 mf_configuration_delete(mf_config);
const char * moo_detector_get_name(moo_detector_type type)
Get the extension name of a detector.
void moo_kernel_delete(moo_kernel *self)
Delete a moo_kernel.
cpl_propertylist * moo_kernel_get_header(moo_kernel *self, moo_detector_type type, int ntas, int rbn)
Get the header of the kernel for given idrbn or NULL.
moo_kernel * moo_kernel_load(const cpl_frame *frame)
Load a new moo_kernel.
cpl_matrix * moo_kernel_get_matrix(moo_kernel *self, moo_detector_type type, int ntas, int rbn)
Get the mtarix of the kernel for given idrbn or NULL.
cpl_error_code moo_molectable_set_data(moo_molectable *self, moo_detector_type type, cpl_table *data)
Set table in molectable.
moo_molectable * moo_molectable_load(const cpl_frame *frame, const char *modename)
Load a moo_molectable.
cpl_table * moo_molectable_get_data(moo_molectable *self, moo_detector_type type)
Get table from molec_table.
void moo_molectable_delete(moo_molectable *self)
Delete a moo_molectable.
moo_molectable * moo_molectable_new(void)
Create a new moo_molectable.
hdrl_image * moo_rbn_single_get_image(moo_rbn_single *self)
Get image of RBN_SINGLE.
cpl_propertylist * moo_rbn_single_get_header(moo_rbn_single *self)
Get header of rbn single.
cpl_error_code moo_rbn_single_load(moo_rbn_single *self, unsigned int level)
load the data of a moo_rbn_single
void moo_rbn_delete(moo_rbn *self)
Delete a moo_rbn.
moo_rbn_single * moo_rbn_get_single(moo_rbn *self, moo_detector_type type)
Get a RBN single from RBN.
moo_rbn * moo_rbn_create(const cpl_frame *frame)
Create a new empty RBN filename.
cpl_table * moo_rbn_get_fibre_table(moo_rbn *self)
Get the FIBRE TABLE in RBN.
hdrl_image * moo_sci_single_get_image(moo_sci_single *self)
Get image of SCI_SINGLE.
cpl_error_code moo_sci_single_load(moo_sci_single *self, unsigned int level)
Load a moo_sci_single from the filename.
cpl_propertylist * moo_sci_single_get_header(moo_sci_single *self)
Get header of sci single.
void moo_sci_delete(moo_sci *self)
Delete a moo_sci.
moo_sci * moo_sci_create(const cpl_frame *frame)
Create a new empty SCI filename.
moo_sci_single * moo_sci_get_single(moo_sci *self, moo_detector_type type)
Get the type part in SCI and return it.
#define MOO_TELLURIC_EXT_RI
TELLURIC format.
cpl_error_code moo_telluric_set_image(moo_telluric *self, moo_detector_type type, cpl_image *im)
assign image in moo_telluric
moo_telluric * moo_telluric_new(void)
Create a new moo_telluric.
moo_telluric * moo_molecfit_calctrans(const cpl_frame *rbn_frame, const char *modename, const cpl_frame *molecules_frame, const cpl_frame *atm_frame, const cpl_frame *best_fit_frame, const cpl_frame *kernel_lib_frame, moo_molecfit_calctrans_params *params)
Apply the molcecfit calctrans to the RBN to compute telle telluric correction.
moo_molectable * moo_molecfit_model(const cpl_frame *sci_frame, const char *modename, const cpl_frame *molecule_frame, const cpl_frame *winc_frame, moo_molectable **pmt_atm_fitted, moo_molectable **best_fitted_model, moo_molecfit_model_params *params)
Apply the relative flux calibration to 1D rebinned spectra.
double moo_pfits_get_cd1_1(const cpl_propertylist *plist)
find out the CD1_1 value
double moo_pfits_get_crval1(const cpl_propertylist *plist)
find out the CRVAL1 value
double moo_pfits_get_crpix1(const cpl_propertylist *plist)
find out the CRPIX1 value