38#include <eris_utils.h>
46#include "eris_nix_dfs.h"
51#include "eris_nix_scired.h"
58static const char eris_nix_img_scired_description[] =
59"This recipe removes the detector signature from "
60ERIS_NIX_RAW_OBJECT_JITTER_DO_CATG
",\n"
61ERIS_NIX_RAW_SKY_JITTER_DO_CATG
" and "
62ERIS_NIX_RAW_STD_JITTER_DO_CATG
" frames."
63"This comprises dark subtraction,\n"
64"linearization, flat-fielding, and association with the master \n"
69" DO CATG Explanation Req. #Frames\n"
70" ------- ----------- --- -------\n"
71" "ERIS_NIX_RAW_OBJECT_JITTER_DO_CATG
72 " object jitter frames N 0-n\n"
73" "ERIS_NIX_RAW_SKY_JITTER_DO_CATG
74 " offset sky jitter N 0-n\n"
76" "ERIS_NIX_RAW_STD_JITTER_DO_CATG
77 " standard jitter N 0-n\n"
79" "ERIS_NIX_RAW_OBJECT_LSS_JITTER_DO_CATG
80 " object LSS jitter N 0-n\n"
82" "ERIS_NIX_RAW_SKY_LSS_JITTER_DO_CATG
83 " sky LSS jitter N 0-n\n"
85" "ERIS_NIX_RAW_STD_LSS_JITTER_DO_CATG
86 " standard LSS jitter N 0-n\n"
88" "ERIS_NIX_MASTER_DARK_IMG_PRO_CATG
89 " a MASTER_DARK with Y 1\n"
90" matching detector \n"
92" "ERIS_NIX_MASTER_BPM_LAMP_PRO_CATG
93 " a lamp MASTER_BPM Y 1\n"
95" "ERIS_NIX_MASTER_BPM_SKY_PRO_CATG
96 " a sky MASTER_BPM Y 1\n"
97" "ERIS_NIX_MASTER_FLAT_LAMP_HIFREQ_PRO_CATG
98 " a lamp hifreq flat N 0 or 1\n"
99" matching observing \n"
101" "ERIS_NIX_MASTER_FLAT_SKY_HIFREQ_PRO_CATG
102 " a sky hifreq flat N 0 or 1\n"
103" matching observing \n"
105" "ERIS_NIX_MASTER_FLAT_LAMP_LOFREQ_PRO_CATG
106 " a lamp hifreq flat N 0 or 1\n"
107" matching observing \n"
109" "ERIS_NIX_MASTER_FLAT_SKY_LOFREQ_PRO_CATG
110 " a sky hifreq flat N 0 or 1\n"
111" matching observing \n"
113" "ERIS_NIX_MASTER_FLAT_TWILIGHT_LOFREQ_PRO_CATG
"\n"
114" a twilight lofreq flat N 0 or 1\n"
115" matching observing \n"
116" configuration (preferred\n"
117" over the LAMP version\n"
119" "ERIS_NIX_GAIN_PRO_CATG
120 " DETMON gain information N 0 or 1\n"
122" detmon_ir_lg_gain_table.fits\n"
123" "ERIS_NIX_COEFFS_CUBE_PRO_CATG
124 " DETMON linearity curves N 0 or 1\n"
126" detmon_ir_coeffs_cube.fits\n"
127" "ERIS_NIX_NL_BPM_PRO_CATG
128 " DETMON non-linear bpm N 0 or 1\n"
130" detmon_ir_lg_bpm.fits\n"
134" DO CATG Explanation \n"
135" ------- ----------- \n"
136" "ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
137 " Calibrated results.\n"
138" or "ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG
"\n"
139" or "ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
"\n"
140" or "ERIS_NIX_CAL_DET_OBJECT_LSS_JITTER_PRO_CATG
"\n"
141" or "ERIS_NIX_CAL_DET_SKY_LSS_JITTER_PRO_CATG
"\n"
142" or "ERIS_NIX_CAL_DET_STD_LSS_JITTER_PRO_CATG
"\n"
144" The output will be a FITS file named 'cal_det_<inputname>.fits',\n"
146" - DATA the result data.\n"
147" - ERR the result error plane.\n"
148" - DQ the result data quality plane.\n"
149" - CONFIDENCE the result confidence plane.\n"
152#define RECIPE_NAME "eris_nix_img_scired"
153#define CONTEXT "eris."RECIPE_NAME
158cpl_recipe_define(eris_nix_img_scired, ERIS_BINARY_VERSION,
160 PACKAGE_BUGREPORT,
"2017",
161 "Remove detector signature from frames",
162 eris_nix_img_scired_description);
178static cpl_error_code eris_nix_img_scired_fill_parameterlist(
179 cpl_parameterlist * self) {
181 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
184 hdrl_parameter * catalogue_defaults = NULL;
185 cpl_parameterlist * catalogue_parlist = NULL;
191 p = cpl_parameter_new_enum(CONTEXT
".fill-rejected",
193 "how to treat reject pixel",
199 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fill-rejected");
200 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
201 cpl_parameterlist_append(self, p);
203 p = cpl_parameter_new_value(CONTEXT
".fill-value",
205 "value to use in 'set_value' case",
207 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fill-value");
208 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
209 cpl_parameterlist_append(self, p);
213 p = cpl_parameter_new_value(CONTEXT
".cd_matrix_modify",
215 "TRUE to insert corrected CD-matrix",
217 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"cd-matrix-modify");
218 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
219 cpl_parameterlist_append(self, p);
223 p = cpl_parameter_new_value(CONTEXT
".x_probe", CPL_TYPE_INT,
224 "x coord of diagnostic pixel",
226 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"x-probe");
227 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
228 cpl_parameterlist_append(self, p);
230 p = cpl_parameter_new_value(CONTEXT
".y_probe", CPL_TYPE_INT,
231 "y coord of diagnostic pixel",
233 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"y-probe");
234 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
235 cpl_parameterlist_append(self, p);
237 p = cpl_parameter_new_range(CONTEXT
".collapse_cube", CPL_TYPE_INT,
238 "Collapse cube if DET.FRAM.FORMAT is cube. Possible values: "
239 "0, no collapse; 1, mean collapse; 2, median collapse",
241 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"collapse-cube");
242 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
243 cpl_parameterlist_append(self, p);
251 10.0, CPL_TRUE, 64, 2.0, 3.0,
252 ERIS_NIX_SATURATION_DEFAULT, HDRL_CATALOGUE_ALL);
254 "catalogue", catalogue_defaults);
258 for (p = cpl_parameterlist_get_first(catalogue_parlist);
260 p = cpl_parameterlist_get_next(catalogue_parlist)) {
262 const char * pname = cpl_parameter_get_name(p);
263 if (strstr(pname,
"min-pixels") ||
264 strstr(pname,
"threshold") ||
265 strstr(pname,
"mesh-size") ||
266 strstr(pname,
"threshold") ||
267 strstr(pname,
"smooth-gauss-fwhm")) {
268 cpl_parameter * duplicate = cpl_parameter_duplicate(p);
269 cpl_parameterlist_append(self, duplicate);
280 eris_nix_catalogue_param_set(CONTEXT, self, 20, 3.0, CPL_TRUE,
281 5.0, CPL_TRUE, 64, 2.0, 3.0, ERIS_NIX_SATURATION_DEFAULT, HDRL_CATALOGUE_ALL);
283 p = cpl_parameter_new_enum(CONTEXT
".sky-source", CPL_TYPE_STRING,
284 "data to be used for calculation of sky "
285 "background", CONTEXT,
286 "auto", 3,
"auto",
"target",
"offset");
287 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-source");
288 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
289 cpl_parameterlist_append(self, p);
291 p = cpl_parameter_new_enum(CONTEXT
".sky-selector", CPL_TYPE_STRING,
292 "method for selecting sky frames",
293 CONTEXT,
"bracket", 1,
"bracket");
294 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-selector");
295 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
296 cpl_parameterlist_append(self, p);
298 p = cpl_parameter_new_enum(CONTEXT
".sky-method", CPL_TYPE_STRING,
299 "method for combining sky frames",
300 CONTEXT,
"collapse-median", 2,
301 "collapse-median",
"median-median");
302 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-method");
303 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
304 cpl_parameterlist_append(self, p);
306 p = cpl_parameter_new_range(CONTEXT
".sky-bracket-time", CPL_TYPE_DOUBLE,
307 "2 * max.time between target and sky measurement",
308 CONTEXT, 1800.0, 60.0, 18000.0);
309 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-bracket-time");
310 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
311 cpl_parameterlist_append(self, p);
314 p = cpl_parameter_new_value(CONTEXT
".esoformat",
316 "TRUE to output MEF file conforming to ESO standard",
318 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"esoformat");
319 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
320 cpl_parameterlist_append(self, p);
324 p = cpl_parameter_new_value(CONTEXT
".x_probe", CPL_TYPE_INT,
325 "x coord of diagnostic pixel",
327 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"x-probe");
328 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
329 cpl_parameterlist_append(self, p);
331 p = cpl_parameter_new_value(CONTEXT
".y_probe", CPL_TYPE_INT,
332 "y coord of diagnostic pixel",
334 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"y-probe");
335 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
336 cpl_parameterlist_append(self, p);
349 for (p = cpl_parameterlist_get_first(catalogue_parlist);
351 p = cpl_parameterlist_get_next(catalogue_parlist)) {
353 const char * pname = cpl_parameter_get_name(p);
354 if (strstr(pname,
"minmax") == NULL) {
355 cpl_parameter * duplicate = cpl_parameter_duplicate(p);
356 cpl_parameterlist_append(self, duplicate);
365 p = cpl_parameter_new_enum(CONTEXT
".cdssearch_astrom",
367 "CDS astrometric catalogue",
369 "none", 3,
"none",
"2MASS",
"gaiaedr3");
370 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"cdssearch-astrom");
371 cpl_parameterlist_append(self, p);
373 p = cpl_parameter_new_value(CONTEXT
".pixel_radius",
375 "Max. distance between object and catalogue "
376 "entry for association (pixels)",
378 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"pixel-radius");
379 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
380 cpl_parameterlist_append(self, p);
382 p = cpl_parameter_new_value(CONTEXT
".strict_classification",
384 "TRUE if objects to match must be classified "
387 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"strict-classification");
388 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
389 cpl_parameterlist_append(self, p);
393 p = cpl_parameter_new_value(CONTEXT
".edges-trim",
395 "Trim image edges in the source detection: "
396 "[txmin,tymin,txmax,tymax]. t means trim "
397 "the user can trim differently from the min and "
398 "max image edge values along X and Y axes",
399 CONTEXT,
"30,30,30,30");
400 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"edges-trim");
401 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
402 cpl_parameterlist_append(self, p);
411 p = cpl_parameter_new_enum(CONTEXT
".cdssearch_photom",
413 "CDS photometric catalogue",
415 "none", 2,
"none",
"2mass");
416 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"cdssearch_photom");
417 cpl_parameterlist_append(self, p);
422 cpl_parameterlist_delete(catalogue_parlist);
424 10.0, CPL_TRUE, 64, 2.0, 3.0,
425 ERIS_NIX_SATURATION_DEFAULT, HDRL_CATALOGUE_ALL);
427 "catalogue", catalogue_defaults);
428 for (p = cpl_parameterlist_get_first(catalogue_parlist);
430 p = cpl_parameterlist_get_next(catalogue_parlist)) {
432 const char * pname = cpl_parameter_get_name(p);
433 if (strstr(pname,
"minmax") == NULL) {
434 cpl_parameter * duplicate = cpl_parameter_duplicate(p);
435 cpl_parameterlist_append(self, duplicate);
464 p = cpl_parameter_new_value(CONTEXT
".pixel_radius",
466 "Max. distance between object and catalogue "
467 "entry for association (pixels)",
469 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"pixel-radius");
470 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
471 cpl_parameterlist_append(self, p);
473 p = cpl_parameter_new_range(CONTEXT
".minphotom",
475 "Min number of matched stars for photometric "
476 "calibration", CONTEXT, 1, 1, 100000);
477 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"minphotom");
478 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
479 cpl_parameterlist_append(self, p);
481 p = cpl_parameter_new_value(CONTEXT
".magerrcut",
483 "Matched stars with magnitude error above "
484 "this cutoff will not be used.",
486 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"magerrcut");
487 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
488 cpl_parameterlist_append(self, p);
491 p = cpl_parameter_new_value(CONTEXT
".esoformat",
493 "TRUE to output MEF file conforming to ESO standard",
494 "background, catalogue components",
496 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"esoformat");
497 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
498 cpl_parameterlist_append(self, p);
522 p = cpl_parameter_new_enum(CONTEXT
".interpolation_method",
523 CPL_TYPE_STRING,
"The interpolation method",
524 CONTEXT,
"lanczos", 6,
"nearest",
525 "linear",
"quadratic",
"renka",
"drizzle",
527 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
528 "interpolation-method");
529 cpl_parameterlist_append(self, p);
533 p = cpl_parameter_new_value(CONTEXT
".loop_distance", CPL_TYPE_INT,
534 "maximum pixel offset taken into account",
536 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"loop-distance");
537 cpl_parameterlist_append(self, p);
541 p = cpl_parameter_new_value(CONTEXT
".kernel_size", CPL_TYPE_INT,
542 "(Lanczos method) size of kernel in pixels",
544 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"kernel-size");
545 cpl_parameterlist_append(self, p);
549 p = cpl_parameter_new_value(CONTEXT
".critical_radius", CPL_TYPE_DOUBLE,
550 "(Renka method) distance beyond which weights "
553 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"critical-radius");
554 cpl_parameterlist_append(self, p);
558 p = cpl_parameter_new_value(CONTEXT
".pix_frac_x", CPL_TYPE_DOUBLE,
559 "(Drizzle method) percentage of flux "
560 "to drizzle from original to target pixel",
562 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"pix-frac-x");
563 cpl_parameterlist_append(self, p);
564 p = cpl_parameter_new_value(CONTEXT
".pix_frac_y", CPL_TYPE_DOUBLE,
565 "(Drizzle method) percentage of flux "
566 "to drizzle from original to target pixel",
568 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"pix-frac-y");
569 cpl_parameterlist_append(self, p);
574 cpl_parameterlist_delete(catalogue_parlist);
576 10.0, CPL_TRUE, 64, 2.0, 3.0,
577 ERIS_NIX_SATURATION_DEFAULT, HDRL_CATALOGUE_ALL);
579 "catalogue", catalogue_defaults);
583 for (p = cpl_parameterlist_get_first(catalogue_parlist);
585 p = cpl_parameterlist_get_next(catalogue_parlist)) {
587 const char * pname = cpl_parameter_get_name(p);
588 if (strstr(pname,
"minmax") == NULL) {
589 cpl_parameter * duplicate = cpl_parameter_duplicate(p);
590 cpl_parameterlist_append(self, duplicate);
594 p = cpl_parameter_new_value(CONTEXT
".debug-data",
595 CPL_TYPE_BOOL,
"true to save interim results",
597 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"debug-data");
598 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
599 cpl_parameterlist_append(self, p);
605 cpl_parameterlist_delete(catalogue_parlist);
621static int eris_nix_img_scired(cpl_frameset * frameset,
622 const cpl_parameterlist * parlist) {
626 cpl_frame* frame = NULL;
627 frame = cpl_frameset_find(frameset,ERIS_NIX_RAW_OBJECT_JITTER_DO_CATG);
628 cpl_boolean is_format_single = CPL_TRUE;
630 cpl_propertylist* plist = NULL;
631 const char* fname = cpl_frame_get_filename(frame);
633 plist = cpl_propertylist_load(fname, 0);
634 const char* key =
"ESO DET FRAM FORMAT";
635 if (cpl_propertylist_has(plist, key)) {
636 const char* format = cpl_propertylist_get_string(plist, key);
637 if(strcmp(format,
"cube") == 0) {
638 is_format_single = CPL_FALSE;
645 if(is_format_single) {
652 return (
int) cpl_error_get_code();
cpl_error_code eris_nix_scired_hdrl_stack(cpl_frameset *frameset, const cpl_parameterlist *parlist, const char *recipe_name, const char *context)
This rebin and stack a set of calibrated ERIS/NIX jitter frames.
cpl_error_code eris_nix_scired_cal_phot(cpl_frameset *frameset, const cpl_parameterlist *parlist, const char *recipe_name, const char *context)
This recipe calibrates the photometry of ERIS/NIX frames.
cpl_error_code eris_nix_scired_cal_det(cpl_frameset *frameset, const cpl_parameterlist *parlist, const char *recipe_name, const char *context)
This function removes the detector signature from science frames.
cpl_error_code eris_nix_scired_skysub(cpl_frameset *frameset, const cpl_parameterlist *parlist, const char *recipe_name, const char *context)
This recipe estimates and subtracts the sky background from a set of science frames.
cpl_error_code eris_nix_scired_cal_wcs(cpl_frameset *frameset, const cpl_parameterlist *parlist, const char *recipe_name, const char *context)
This recipe calibrates the astrometry of ERIS/NIX frames.
hdrl_parameter * hdrl_catalogue_parameter_create(int obj_min_pixels, double obj_threshold, cpl_boolean obj_deblending, double obj_core_radius, cpl_boolean bkg_estimate, int bkg_mesh_size, double bkg_smooth_fwhm, double det_eff_gain, double det_saturation, hdrl_catalogue_options resulttype)
Creates catalogue Parameters object.
cpl_parameterlist * hdrl_catalogue_parameter_create_parlist(const char *base_context, const char *prefix, hdrl_parameter *defaults)
Create parameter list for the catalogue computation.
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter