7#include "eris_ifu_skycorr.h"
8#include "eris_ifu_error.h"
9#include "eris_ifu_lambda_corr.h"
10#include "eris_ifu_error.h"
24cpl_table* eris_ifu_skycorr_extract_spectrum(
const hdrl_imagelist *cube,
25 const cpl_propertylist *header,
29 cpl_table *table = NULL;
30 cpl_vector *lambda = NULL;
31 cpl_image *img_data = NULL,
33 hdrl_image *hdrl_img = NULL;
34 double *plambda = NULL,
44 cpl_ensure(cube != NULL, CPL_ERROR_NULL_INPUT, NULL);
45 cpl_ensure(header != NULL, CPL_ERROR_NULL_INPUT, NULL);
46 cpl_ensure(x > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
47 cpl_ensure(y > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
53 plambda = cpl_vector_get_data(lambda));
54 nz = cpl_vector_get_size(lambda);
57 table = cpl_table_new(nz));
60 pdata = cpl_malloc(nz*
sizeof(
double)));
62 perror = cpl_malloc(nz*
sizeof(
double)));
64 pmask = cpl_malloc(nz*
sizeof(
int)));
66 pmask_i = cpl_malloc(nz*
sizeof(
int)));
68 pweight = cpl_malloc(nz*
sizeof(
double)));
71 for (cpl_size z = 0; z < nz; z++) {
79 val = cpl_image_get(img_data, x, y, &rej);
89 perror[z] = cpl_image_get(img_err, x, y, &rej);
92 pweight[z] = 1./perror[z];
97 cpl_table_wrap_double(table, plambda,
"lambda"));
99 cpl_table_wrap_double(table, pdata,
"flux"));
101 cpl_table_wrap_double(table, perror,
"dflux"));
103 cpl_table_wrap_int(table, pmask,
"mask"));
105 cpl_table_wrap_double(table, pweight,
"weight"));
107 cpl_table_wrap_int(table, pmask_i,
"mask_I"));
119cpl_table* eris_ifu_skycorr_create_nan_spectrum(
const hdrl_imagelist *cube)
122 cpl_table *table = NULL;
123 double *pscflux = NULL,
127 cpl_ensure(cube != NULL, CPL_ERROR_NULL_INPUT, NULL);
133 table = cpl_table_new(nz));
136 pscflux = cpl_malloc(nz*
sizeof(
double)));
138 pscdflux = cpl_malloc(nz*
sizeof(
double)));
140 pscmask = cpl_malloc(nz*
sizeof(
int)));
143 for (cpl_size z = 0; z < nz; z++) {
150 cpl_table_wrap_double(table, pscflux,
"scflux"));
152 cpl_table_wrap_double(table, pscdflux,
"scdflux"));
154 cpl_table_wrap_int(table, pscmask,
"scmask"));
172cpl_error_code eris_ifu_skycorr_insert_spectrum(hdrl_imagelist *cube,
177 cpl_image *img_data = NULL,
179 hdrl_image *hdrl_img = NULL;
180 const double *scflux = NULL,
182 const int *scmask = NULL;
184 cpl_mask *img_mask = NULL;
185 cpl_error_code ret = CPL_ERROR_NONE;
187 cpl_ensure_code(cube != NULL, CPL_ERROR_NULL_INPUT);
188 cpl_ensure_code(scspec != NULL, CPL_ERROR_NULL_INPUT);
189 cpl_ensure_code(x > 0, CPL_ERROR_ILLEGAL_INPUT);
190 cpl_ensure_code(y > 0, CPL_ERROR_ILLEGAL_INPUT);
196 scflux = cpl_table_get_data_double_const(scspec,
"scflux"));
198 scdflux = cpl_table_get_data_double_const(scspec,
"scdflux"));
200 scmask = cpl_table_get_data_int_const(scspec,
"scmask"));
203 for (cpl_size z = 0; z < nz; z++) {
214 if (scmask[z] != 0) {
217 cpl_mask_set(img_mask, x, y, GOOD_PIX));
219 cpl_image_set(img_data, x, y, scflux[z]));
221 cpl_image_set(img_err, x, y, scdflux[z]));
224 cpl_mask_set(img_mask, x, y+1, GOOD_PIX));
226 cpl_image_set(img_data, x, y+1, scflux[z]));
228 cpl_image_set(img_err, x, y+1, scdflux[z]));
234 cpl_mask_set(img_mask, x, y, BAD_PIX));
236 cpl_image_set(img_data, x, y, NAN));
238 cpl_image_set(img_err, x, y, NAN));
241 cpl_mask_set(img_mask, x, y+1, BAD_PIX));
243 cpl_image_set(img_data, x, y+1, NAN));
245 cpl_image_set(img_err, x, y+1, NAN));
250 ret = cpl_error_get_code();
265cpl_error_code eris_ifu_skycorr_flatten_outliers(cpl_table *objspec,
281 cpl_error_code ret = CPL_ERROR_NONE;
283 cpl_ensure_code(objspec != NULL, CPL_ERROR_NULL_INPUT);
284 cpl_ensure_code(skyspec != NULL, CPL_ERROR_NULL_INPUT);
285 cpl_ensure_code(f > 0, CPL_ERROR_ILLEGAL_INPUT);
288 mean_of = cpl_table_get_column_mean(objspec,
"flux");
289 mean_sf = cpl_table_get_column_mean(skyspec,
"flux");
290 mean_odf = cpl_table_get_column_mean(objspec,
"dflux");
291 mean_sdf = cpl_table_get_column_mean(skyspec,
"dflux");
293 limit_of = mean_of * f;
294 limit_sf = mean_sf * f;
295 limit_odf = mean_odf * f;
296 limit_sdf = mean_sdf * f;
298 data_of = cpl_table_get_data_double(objspec,
"flux");
299 data_sf = cpl_table_get_data_double(skyspec,
"flux");
300 data_odf = cpl_table_get_data_double(objspec,
"dflux");
301 data_sdf = cpl_table_get_data_double(skyspec,
"dflux");
305 for (
int i = 0; i < cpl_table_get_nrow(objspec); i++) {
306 if (data_of[i] > limit_of) {
307 data_of[i] = mean_of;
309 if (data_sf[i] > limit_sf) {
310 data_sf[i] = mean_sf;
312 if (data_odf[i] > limit_odf) {
313 data_odf[i] = mean_odf;
315 if (data_sdf[i] > limit_sdf) {
316 data_sdf[i] = mean_sdf;
320 ret = cpl_error_get_code();
335cpl_error_code eris_ifu_skycorr_flatten_outliers2(cpl_table *objspec,
339 cpl_error_code ret = CPL_ERROR_NONE;
341 cpl_bivector *spectrum = NULL;
343 cpl_array *positions = NULL;
344 double *pobjlambda = NULL,
351 *pbiveclambda = NULL,
354 int *pobjmask = NULL,
360 cpl_ensure_code(objspec != NULL, CPL_ERROR_NULL_INPUT);
361 cpl_ensure_code(skyspec != NULL, CPL_ERROR_NULL_INPUT);
362 cpl_ensure_code((min_frac > 0) && (min_frac <= 1.0), CPL_ERROR_ILLEGAL_INPUT);
366 nz = cpl_table_get_nrow(objspec);
368 spectrum = cpl_bivector_new(nz));
371 pobjlambda = cpl_table_get_data_double(objspec,
"lambda"));
374 pobjflux = cpl_table_get_data_double(objspec,
"flux"));
376 pobjdflux = cpl_table_get_data_double(objspec,
"dflux"));
378 pobjmask = cpl_table_get_data_int(objspec,
"mask"));
380 pobjweight = cpl_table_get_data_double(objspec,
"weight"));
382 pobjmaskI = cpl_table_get_data_int(objspec,
"mask_I"));
385 pskyflux = cpl_table_get_data_double(skyspec,
"flux"));
387 pskydflux = cpl_table_get_data_double(skyspec,
"dflux"));
389 pskymask = cpl_table_get_data_int(skyspec,
"mask"));
391 pskyweight = cpl_table_get_data_double(skyspec,
"weight"));
393 pskymaskI = cpl_table_get_data_int(skyspec,
"mask_I"));
396 pbiveclambda = cpl_bivector_get_x_data(spectrum));
398 pbivecflux = cpl_bivector_get_y_data(spectrum));
400 for (cpl_size z = 0; z < nz; z++) {
401 pbiveclambda[z] = pobjlambda[z];
402 pbivecflux[z] = pobjflux[z];
408 ppositions = cpl_array_get_data_int(positions));
411 for (cpl_size o = 0; o < cpl_array_get_size(positions); o++) {
412 int pos = ppositions[o];
416 pobjweight[pos] = 0.;
422 pskyweight[pos] = 0.;
426 ret = cpl_error_get_code();
429 cpl_array_delete(positions);
441cpl_parameterlist* eris_ifu_skycorr_create_parlist(
const cpl_propertylist *sky_header)
443 cpl_parameterlist *parlist = NULL;
444 cpl_parameter *p = NULL;
445 const cpl_property *prop = NULL;
449 parlist = cpl_parameterlist_new());
451 prop = cpl_propertylist_get_property_const(sky_header,
"MJD-OBS");
452 double mjd = cpl_property_get_double(prop);
454 prop = cpl_propertylist_get_property_const(sky_header,
"UTC");
455 double utc = cpl_property_get_double(prop);
456 prop = cpl_propertylist_get_property_const(sky_header,
"ESO TEL ALT");
457 double telalt = cpl_property_get_double(prop);
461 p = cpl_parameter_new_value(
"inst_dir", CPL_TYPE_STRING,
"",
"",
".");
462 cpl_parameterlist_append(parlist, p);
464 p = cpl_parameter_new_value(
"data_dir", CPL_TYPE_STRING,
"",
"",
"sysdata/");
465 cpl_parameterlist_append(parlist, p);
467 p = cpl_parameter_new_value(
"config_dir", CPL_TYPE_STRING,
"",
"",
"config/");
468 cpl_parameterlist_append(parlist, p);
470 p = cpl_parameter_new_value(
"spectype", CPL_TYPE_STRING,
"",
"",
"SKY");
471 cpl_parameterlist_append(parlist, p);
473 p = cpl_parameter_new_value(
"scispec", CPL_TYPE_STRING,
"",
"",
"eris-obj-spec.fits");
474 cpl_parameterlist_append(parlist, p);
476 p = cpl_parameter_new_value(
"skyspec", CPL_TYPE_STRING,
"",
"",
"eris-sky-spec.fits");
477 cpl_parameterlist_append(parlist, p);
479 p = cpl_parameter_new_value(
"output_dir", CPL_TYPE_STRING,
"",
"",
".");
480 cpl_parameterlist_append(parlist, p);
482 p = cpl_parameter_new_value(
"output_name", CPL_TYPE_STRING,
"",
"",
"TEST-ERIS");
483 cpl_parameterlist_append(parlist, p);
487 p = cpl_parameter_new_value(
"col_lam", CPL_TYPE_STRING,
"",
"",
"lambda");
488 cpl_parameterlist_append(parlist, p);
489 p = cpl_parameter_new_value(
"col_flux", CPL_TYPE_STRING,
"",
"",
"flux");
490 cpl_parameterlist_append(parlist, p);
491 p = cpl_parameter_new_value(
"col_dflux", CPL_TYPE_STRING,
"",
"",
"dflux");
492 cpl_parameterlist_append(parlist, p);
493 p = cpl_parameter_new_value(
"col_mask", CPL_TYPE_STRING,
"",
"",
"mask");
494 cpl_parameterlist_append(parlist, p);
496 p = cpl_parameter_new_value(
"default_error", CPL_TYPE_DOUBLE,
"",
"", 0.01);
497 cpl_parameterlist_append(parlist, p);
499 p = cpl_parameter_new_value(
"wlgtomicron", CPL_TYPE_DOUBLE,
"",
"", 1.);
500 cpl_parameterlist_append(parlist, p);
502 p = cpl_parameter_new_value(
"vac_air", CPL_TYPE_STRING,
"",
"",
"vac");
503 cpl_parameterlist_append(parlist, p);
507 p = cpl_parameter_new_value(
"date_key", CPL_TYPE_STRING,
"",
"",
"MJD-OBS");
508 cpl_parameterlist_append(parlist, p);
510 p = cpl_parameter_new_value(
"date_val", CPL_TYPE_DOUBLE,
"",
"", val);
511 cpl_parameterlist_append(parlist, p);
513 p = cpl_parameter_new_value(
"mjd", CPL_TYPE_DOUBLE,
"",
"", mjd);
514 cpl_parameterlist_append(parlist, p);
516 p = cpl_parameter_new_value(
"time_key", CPL_TYPE_STRING,
"",
"",
"UTC");
517 cpl_parameterlist_append(parlist, p);
519 p = cpl_parameter_new_value(
"time_val", CPL_TYPE_DOUBLE,
"",
"", utc);
520 cpl_parameterlist_append(parlist, p);
522 p = cpl_parameter_new_value(
"telalt_key", CPL_TYPE_STRING,
"",
"",
"ESO TEL ALT");
523 cpl_parameterlist_append(parlist, p);
525 p = cpl_parameter_new_value(
"telalt_val", CPL_TYPE_DOUBLE,
"",
"", telalt);
526 cpl_parameterlist_append(parlist, p);
530 p = cpl_parameter_new_value(
"linetabname", CPL_TYPE_STRING,
"",
"",
"airglow_groups.dat");
531 cpl_parameterlist_append(parlist, p);
533 p = cpl_parameter_new_value(
"vardatname", CPL_TYPE_STRING,
"",
"",
"airglow_var.dat");
534 cpl_parameterlist_append(parlist, p);
536 p = cpl_parameter_new_value(
"soldaturl", CPL_TYPE_STRING,
"",
"",
"ftp://ftp.seismo.nrcan.gc.ca/spaceweather/solar_flux/monthly_averages");
537 cpl_parameterlist_append(parlist, p);
539 p = cpl_parameter_new_value(
"soldatname", CPL_TYPE_STRING,
"",
"",
"solflux_monthly_average.txt");
540 cpl_parameterlist_append(parlist, p);
542 p = cpl_parameter_new_value(
"soldatsource", CPL_TYPE_STRING,
"",
"",
"NONE");
543 cpl_parameterlist_append(parlist, p);
545 p = cpl_parameter_new_value(
"solflux", CPL_TYPE_DOUBLE,
"",
"", -1.);
546 cpl_parameterlist_append(parlist, p);
550 p = cpl_parameter_new_value(
"fwhm", CPL_TYPE_DOUBLE,
"",
"", 5.);
551 cpl_parameterlist_append(parlist, p);
553 p = cpl_parameter_new_range(
"varfwhm", CPL_TYPE_INT,
"",
"", 0, 0, 0);
554 cpl_parameterlist_append(parlist, p);
556 p = cpl_parameter_new_value(
"meanlam", CPL_TYPE_DOUBLE,
"",
"", 1.);
557 cpl_parameterlist_append(parlist, p);
559 p = cpl_parameter_new_value(
"ltol", CPL_TYPE_DOUBLE,
"",
"", 0.01);
560 cpl_parameterlist_append(parlist, p);
562 p = cpl_parameter_new_value(
"min_line_width_fac", CPL_TYPE_DOUBLE,
"",
"", 0.);
563 cpl_parameterlist_append(parlist, p);
565 p = cpl_parameter_new_value(
"min_line_dist_fac", CPL_TYPE_DOUBLE,
"",
"", 2.5);
566 cpl_parameterlist_append(parlist, p);
568 p = cpl_parameter_new_value(
"min_line_flux_fac", CPL_TYPE_DOUBLE,
"",
"", 0.);
569 cpl_parameterlist_append(parlist, p);
571 p = cpl_parameter_new_value(
"fluxlim", CPL_TYPE_DOUBLE,
"",
"", -1.);
572 cpl_parameterlist_append(parlist, p);
574 p = cpl_parameter_new_value(
"iteration",CPL_TYPE_INT,
"",
"", 0);
575 cpl_parameterlist_append(parlist, p);
579 p = cpl_parameter_new_value(
"ftol", CPL_TYPE_DOUBLE,
"",
"", 1e-3);
580 cpl_parameterlist_append(parlist, p);
582 p = cpl_parameter_new_value(
"xtol", CPL_TYPE_DOUBLE,
"",
"", 1e-3);
583 cpl_parameterlist_append(parlist, p);
585 p = cpl_parameter_new_value(
"wtol", CPL_TYPE_DOUBLE,
"",
"", 1e-3);
586 cpl_parameterlist_append(parlist, p);
588 p = cpl_parameter_new_value(
"cheby_max", CPL_TYPE_INT,
"",
"", 7);
589 cpl_parameterlist_append(parlist, p);
591 p = cpl_parameter_new_value(
"cheby_min", CPL_TYPE_INT,
"",
"", 3);
592 cpl_parameterlist_append(parlist, p);
594 p = cpl_parameter_new_value(
"cheby_const", CPL_TYPE_DOUBLE,
"",
"", 0.);
595 cpl_parameterlist_append(parlist, p);
597 p = cpl_parameter_new_value(
"rebintype", CPL_TYPE_INT,
"",
"", 1);
598 cpl_parameterlist_append(parlist, p);
600 p = cpl_parameter_new_value(
"weightlim", CPL_TYPE_DOUBLE,
"",
"", 0.67);
601 cpl_parameterlist_append(parlist, p);
603 p = cpl_parameter_new_value(
"siglim", CPL_TYPE_DOUBLE,
"",
"", 15.);
604 cpl_parameterlist_append(parlist, p);
606 p = cpl_parameter_new_value(
"fitlim", CPL_TYPE_DOUBLE,
"",
"", 0.);
607 cpl_parameterlist_append(parlist, p);
#define BRK_IF_ERROR(function)
If function is or returns an error != CPL_ERROR_NONE, then the try-block is exited.
#define CHECK_ERROR_STATE(void)
Check the CPL error state, and exit the try-block if not CPL_ERROR_NONE.
#define TRY
Beginning of a TRY-block.
#define CATCH
End of a TRY-block, beginning of a CATCH-block.
#define BRK_IF_NULL(function)
If function is or returns a NULL pointer, then the try-block is exited.
cpl_vector * eris_ifu_lcorr_create_lambda_vector(const cpl_propertylist *header)
Create wavelength vector from FITS header WCS keywords.
cpl_array * eris_ifu_lcorr_get_peak_positions(const cpl_bivector *spectrum, double min_frac, cpl_vector *range)
Detect emission line peak positions in a spectrum.
void eris_ifu_free_table(cpl_table **item)
Free memory and set pointer to null.
void eris_ifu_free_parameterlist(cpl_parameterlist **item)
Free memory and set pointer to null.
void eris_ifu_free_bivector(cpl_bivector **item)
Free memory and set pointer to null.
cpl_mask * hdrl_image_get_mask(hdrl_image *himg)
get cpl bad pixel mask from image
cpl_image * hdrl_image_get_error(hdrl_image *himg)
get error as cpl image
cpl_image * hdrl_image_get_image(hdrl_image *himg)
get data as cpl image
cpl_size hdrl_imagelist_get_size(const hdrl_imagelist *himlist)
Get the number of images in the imagelist.
hdrl_image * hdrl_imagelist_get(const hdrl_imagelist *himlist, cpl_size inum)
Get an image from a list of images.
double sc_basic_mjd2fracyear(double mjd)