35#include <casu_utils.h>
36#include <casu_stats.h>
38#include <eris_nix_scired.h>
39#include <eris_nix_dfs.h>
40#include <eris_nix_utils.h>
41#include <eris_nix_catalogue.h>
42#include <eris_nix_gain_linearity.h>
43#include <eris_nix_master_dark.h>
44#include <eris_nix_master_bpm.h>
45#include <eris_nix_master_flat.h>
46#include <eris_nix_casu_match.h>
47#include <eris_nix_casu_utils.h>
48#include <eris_nix_match.h>
49#include <eris_utils.h>
69cpl_error_code eris_nix_pixel_coord_diagnostic_param_set(
71 cpl_parameterlist* parlist) {
75 char* param_name = NULL;
77 param_name = cpl_sprintf(
"%s.x_probe", context);
78 p = cpl_parameter_new_value(param_name, CPL_TYPE_INT,
79 "x coord of diagnostic pixel", context, -1);
80 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"x-probe");
81 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
82 cpl_parameterlist_append(parlist, p);
85 param_name = cpl_sprintf(
"%s.y_probe", context);
86 p = cpl_parameter_new_value(param_name, CPL_TYPE_INT,
87 "y coord of diagnostic pixel", context, -1);
88 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"y-probe");
89 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
92 cpl_parameterlist_append(parlist, p);
93 return cpl_error_get_code();
96cpl_error_code eris_nix_skysub_param_set(
const char* context,
97 cpl_parameterlist* parlist) {
101 char* param_name = NULL;
103 param_name = cpl_sprintf(
"%s.sky-source", context);
104 p = cpl_parameter_new_enum(param_name, CPL_TYPE_STRING,
105 "data to be used for calculation of sky "
106 "background", context,
107 "auto", 3,
"auto",
"target",
"offset");
108 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-source");
109 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
110 cpl_parameterlist_append(parlist, p);
111 cpl_free(param_name);
113 param_name = cpl_sprintf(
"%s.sky-selector", context);
114 p = cpl_parameter_new_enum(param_name, CPL_TYPE_STRING,
115 "method for selecting sky frames",
116 context,
"bracket", 1,
"bracket");
117 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-selector");
118 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
119 cpl_parameterlist_append(parlist, p);
120 cpl_free(param_name);
122 param_name = cpl_sprintf(
"%s.sky-method", context);
123 p = cpl_parameter_new_enum(param_name, CPL_TYPE_STRING,
124 "method for combining sky frames",
125 context,
"median-median", 2,
126 "collapse-median",
"median-median");
127 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-method");
128 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
129 cpl_parameterlist_append(parlist, p);
130 cpl_free(param_name);
132 param_name = cpl_sprintf(
"%s.sky-bracket-time", context);
133 p = cpl_parameter_new_range(param_name, CPL_TYPE_DOUBLE,
134 "2 * max.time between target and sky measurement",
135 context, 1800.0, 60.0, 18000.0);
136 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"sky-bracket-time");
137 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
138 cpl_parameterlist_append(parlist, p);
139 cpl_free(param_name);
141 param_name = cpl_sprintf(
"%s.debug-data", context);
142 p = cpl_parameter_new_value(param_name,
143 CPL_TYPE_BOOL,
"true to save interim results",
145 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"debug-data");
146 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
147 cpl_parameterlist_append(parlist, p);
148 cpl_free(param_name);
150 return cpl_error_get_code();
167eris_nix_catalogue_param_set(
const char* context,
168 cpl_parameterlist* parlist,
169 int obj_min_pixels,
double obj_threshold, cpl_boolean obj_deblending,
170 double obj_core_radius, cpl_boolean bkg_estimate,
int bkg_mesh_size,
171 double bkg_smooth_fwhm,
double det_eff_gain,
double det_saturation,
172 hdrl_catalogue_options resulttype)
176 cpl_parameter * p = NULL;
177 hdrl_parameter * catalogue_defaults = NULL;
178 cpl_parameterlist * catalogue_parlist = NULL;
181 obj_threshold, obj_deblending, obj_core_radius, bkg_estimate,
182 bkg_mesh_size, bkg_smooth_fwhm, det_eff_gain, det_saturation,
185 "catalogue", catalogue_defaults);
188 for (p = cpl_parameterlist_get_first(catalogue_parlist);
190 p = cpl_parameterlist_get_next(catalogue_parlist)) {
192 const char * pname = cpl_parameter_get_name(p);
193 if (strstr(pname,
"min-pixels") ||
194 strstr(pname,
"threshold") ||
195 strstr(pname,
"mesh-size") ||
196 strstr(pname,
"threshold") ||
197 strstr(pname,
"smooth-gauss-fwhm")) {
198 cpl_parameter * duplicate = cpl_parameter_duplicate(p);
199 cpl_parameterlist_append(parlist, duplicate);
205 char * pname = cpl_sprintf(
"%s.catalogue.ao-params", context);
206 p = cpl_parameter_new_enum(pname,
208 "Default catalogue.core-radius and "
209 "catalogue.mesh-size depending on "
212 "auto", 2,
"auto",
"user");
213 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"catalogue.ao-params");
214 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
215 cpl_parameterlist_append(parlist, p);
219 cpl_parameterlist_delete(catalogue_parlist);
220 return cpl_error_get_code();
224eris_nix_astrometric_param_set(
const char* context,
225 cpl_parameterlist* parlist)
229 char* param_name = NULL;
236 param_name = cpl_sprintf(
"%s.cdssearch_astrom", context);
237 p = cpl_parameter_new_enum(param_name,
239 "CDS astrometric catalogue",
241 "none", 3,
"none",
"2mass",
"gaiadr3");
242 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"cdssearch-astrom");
243 cpl_parameterlist_append(parlist, p);
244 cpl_free(param_name);
246 param_name = cpl_sprintf(
"%s.debug-data", context);
247 p = cpl_parameter_new_value(param_name,
248 CPL_TYPE_BOOL,
"true to save interim results",
250 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"debug-data");
251 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
252 cpl_parameterlist_append(parlist, p);
253 cpl_free(param_name);
255 return cpl_error_get_code();
260eris_nix_photom_param_set(
const char* context,
261 cpl_parameterlist* parlist)
264 char* param_name = NULL;
267 param_name = cpl_sprintf(
"%s.cdssearch_photom", context);
268 p = cpl_parameter_new_enum(param_name,
270 "CDS photometric catalogue",
272 "2MASS", 1,
"2MASS");
273 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"cdssearch_photom");
274 cpl_parameterlist_append(parlist, p);
275 cpl_free(param_name);
277 param_name = cpl_sprintf(
"%s.pixel_radius", context);
278 p = cpl_parameter_new_value(param_name,
280 "Max. distance between object and catalogue "
281 "entry for association (pixels)",
283 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"pixel-radius");
284 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
285 cpl_parameterlist_append(parlist, p);
286 cpl_free(param_name);
288 param_name = cpl_sprintf(
"%s.minphotom", context);
289 p = cpl_parameter_new_range(param_name,
291 "Min number of matched stars for photometric "
292 "calibration", context, 1, 1, 100000);
293 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"minphotom");
294 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
295 cpl_parameterlist_append(parlist, p);
296 cpl_free(param_name);
298 param_name = cpl_sprintf(
"%s.magerrcut", context);
299 p = cpl_parameter_new_value(param_name,
301 "Matched stars with magnitude error above "
302 "this cutoff will not be used.",
304 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"magerrcut");
305 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
306 cpl_parameterlist_append(parlist, p);
307 cpl_free(param_name);
309 param_name = cpl_sprintf(
"%s.debug-data", context);
310 p = cpl_parameter_new_value(param_name,
311 CPL_TYPE_BOOL,
"true to save interim results",
313 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"debug-data");
314 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
315 cpl_parameterlist_append(parlist, p);
316 cpl_free(param_name);
318 return cpl_error_get_code();
323cpl_error_code eris_nix_hdrl_stack_param_set(
const char* context,
324 cpl_parameterlist* parlist) {
326 char* param_name = NULL;
329 param_name = cpl_sprintf(
"%s.interpolation_method", context);
330 p = cpl_parameter_new_enum(param_name,
331 CPL_TYPE_STRING,
"The interpolation method",
332 context,
"lanczos", 6,
"nearest",
333 "linear",
"quadratic",
"renka",
"drizzle",
335 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
336 "interpolation-method");
337 cpl_parameterlist_append(parlist, p);
338 cpl_free(param_name);
342 param_name = cpl_sprintf(
"%s.loop_distance", context);
343 p = cpl_parameter_new_value(param_name, CPL_TYPE_INT,
344 "maximum pixel offset taken into account",
346 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"loop-distance");
347 cpl_parameterlist_append(parlist, p);
348 cpl_free(param_name);
351 param_name = cpl_sprintf(
"%s.kernel_size", context);
352 p = cpl_parameter_new_value(param_name, CPL_TYPE_INT,
353 "(Lanczos method) size of kernel in pixels",
355 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"kernel-size");
356 cpl_parameterlist_append(parlist, p);
357 cpl_free(param_name);
360 param_name = cpl_sprintf(
"%s.critical_radius", context);
361 p = cpl_parameter_new_value(param_name, CPL_TYPE_DOUBLE,
362 "(Renka method) distance beyond which weights "
365 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"critical-radius");
366 cpl_parameterlist_append(parlist, p);
367 cpl_free(param_name);
370 param_name = cpl_sprintf(
"%s.pix_frac_x", context);
371 p = cpl_parameter_new_value(param_name, CPL_TYPE_DOUBLE,
372 "(Drizzle method) percentage of flux "
373 "to drizzle from original to target pixel",
375 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"pix-frac-x");
376 cpl_parameterlist_append(parlist, p);
377 cpl_free(param_name);
379 param_name = cpl_sprintf(
"%s.pix_frac_y", context);
380 p = cpl_parameter_new_value(param_name, CPL_TYPE_DOUBLE,
381 "(Drizzle method) percentage of flux "
382 "to drizzle from original to target pixel",
384 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"pix-frac-y");
385 cpl_parameterlist_append(parlist, p);
386 cpl_free(param_name);
390 return cpl_error_get_code();
404static cpl_error_code eris_nix_cal_det_save(
405 located_image * limage,
406 const char * procatg,
407 cpl_frameset * frameset,
408 const cpl_parameterlist * parlist,
409 const cpl_frameset * calib_frames,
410 const char* recipe_name) {
414 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
415 cpl_ensure_code(limage, CPL_ERROR_NONE);
416 cpl_ensure_code(procatg, CPL_ERROR_NULL_INPUT);
417 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
418 cpl_ensure_code(calib_frames, CPL_ERROR_NULL_INPUT);
423 cpl_frameset * provenance = cpl_frameset_new();
424 cpl_frameset_insert(provenance, cpl_frame_duplicate(limage->frame));
428 cpl_propertylist * applist = cpl_propertylist_new();
429 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, procatg);
430 cpl_propertylist_copy_property(applist, limage->plist,
"BUNIT");
431 cpl_propertylist_update_int(applist,
"NCOMBINE", 1);
433 int ndit = cpl_propertylist_get_int(limage->plist,
"ESO DET NDIT");
434 cpl_propertylist_update_double(applist,
"TEXPTIME", ndit * dit);
437 cpl_propertylist_update_double(applist,
"EXPTIME", ndit * dit);
438 double mjd_obs = cpl_propertylist_get_double(limage->plist,
"MJD-OBS");
439 double mjd_end = mjd_obs + (ndit * dit) / (3600.0 * 24.0);
440 cpl_propertylist_update_double(applist,
"MJD-END", mjd_end);
441 if(cpl_propertylist_has(limage->plist,
"PSF_FWHM")) {
442 cpl_propertylist_copy_property(applist, limage->plist,
"PSF_FWHM");
444 cpl_propertylist_copy_property(applist, limage->plist,
445 "ESO DETMON SATURATION");
446 cpl_propertylist_copy_property(applist, limage->plist,
448 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
453 int naxis = cpl_propertylist_get_int(limage->plist,
"NAXIS");
456 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(limage->plist);
461 cpl_propertylist_update_double(applist,
"RA", ra);
462 cpl_propertylist_update_double(applist,
"DEC", dec);
469 char * out_fname =
enu_repreface(cpl_frame_get_filename(limage->frame),
482 PACKAGE
"/" PACKAGE_VERSION,
486 cpl_frameset_delete(provenance);
487 cpl_propertylist_delete(applist);
488 return cpl_error_get_code();
493eris_nix_update_pupil_pro_catg(
const char* pro_catg, located_image * limage)
495 char* new_pro_catg=NULL;
497 const char* nxpw = NULL;
498 if(cpl_propertylist_has(limage->plist,
"ESO INS2 NXPW NAME")) {
499 nxpw = cpl_propertylist_get_string(limage->plist,
"ESO INS2 NXPW NAME");
502 if(strcmp(nxpw,
"Open1") == 0){
503 suffix = cpl_sprintf(
"OPEN");
504 }
else if (strcmp(nxpw,
"JHK-pupil") == 0){
505 suffix = cpl_sprintf(
"JHK");
506 }
else if (strcmp(nxpw,
"Crosshairs") == 0){
507 suffix = cpl_sprintf(
"CROSS");
508 }
else if (strcmp(nxpw,
"APP") == 0){
509 suffix = cpl_sprintf(
"APP");
510 }
else if (strcmp(nxpw,
"LM-pupil") == 0){
511 suffix = cpl_sprintf(
"LM");
512 }
else if (strcmp(nxpw,
"Lyot") == 0){
513 suffix = cpl_sprintf(
"LYOT");
514 }
else if (strcmp(nxpw,
"Lyot-ND") == 0){
515 suffix = cpl_sprintf(
"LYOTND");
516 }
else if (strstr(nxpw,
"SAM")){
517 suffix = cpl_sprintf(
"SAM");
518 }
else if (strstr(nxpw,
"Spider")){
519 suffix = cpl_sprintf(
"SPIDER");
521 cpl_msg_warning(cpl_func,
"%s",nxpw);
522 suffix = cpl_sprintf(
"NOT_SUPPORTED");
526 if(strcmp(nxpw,
"Open1") == 0 || strcmp(nxpw,
"ND") == 0) {
527 new_pro_catg = cpl_sprintf(
"%s_%s", pro_catg, suffix);
529 new_pro_catg = cpl_sprintf(
"%s_%s", pro_catg, suffix);
553 const cpl_parameterlist * parlist,
554 const char* recipe_name,
555 const char* context) {
557 cpl_frameset * base_frames = NULL;
558 gain_linearity * gain_lin = NULL;
559 located_image * limage = NULL;
560 master_bpm * master_bpm_used = NULL;
561 master_bpm * master_bpm_lamp = NULL;
562 master_bpm * master_bpm_sky = NULL;
563 master_dark * master_drk = NULL;
564 master_flat * master_flat_hifreq = NULL;
565 master_flat * master_flat_lofreq = NULL;
566 const cpl_parameter * p = NULL;
567 char * param_name = NULL;
568 cpl_table * refine_wcs = NULL;
569 cpl_image * copyconf = NULL;
571 enu_check_error_code(
"%s():%d: An error is already set: %s",
572 cpl_func, __LINE__, cpl_error_get_where());
576 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
577 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
582 return CPL_ERROR_BAD_FILE_FORMAT;
585 cpl_msg_set_level_from_env();
588 const int nfile_tags = 4;
589 const char* required_tags[4] = {ERIS_NIX_NL_BPM_PRO_CATG,
590 ERIS_NIX_COEFFS_CUBE_PRO_CATG,
591 ERIS_NIX_GAIN_PRO_CATG,
593 ERIS_NIX_MASTER_DARK_IMG_PRO_CATG
601 cpl_ensure_code(CPL_ERROR_NONE ==
602 eris_dfs_check_input_tags(frameset, required_tags, nfile_tags, 1),
603 CPL_ERROR_ILLEGAL_INPUT);
607 param_name = cpl_sprintf(
"%s.fill-rejected", context);
608 p = cpl_parameterlist_find_const(parlist, param_name);
609 const char * fill_rejected = cpl_parameter_get_string(p);
610 cpl_free(param_name);
612 param_name = cpl_sprintf(
"%s.fill-value", context);
613 p = cpl_parameterlist_find_const(parlist, param_name);
614 const double fill_value = cpl_parameter_get_double(p);
615 cpl_free(param_name);
617 param_name = cpl_sprintf(
"%s.cd_matrix_modify", context);
618 p = cpl_parameterlist_find_const(parlist, param_name);
619 const int cd_matrix_modify = cpl_parameter_get_bool(p);
620 cpl_free(param_name);
622 param_name = cpl_sprintf(
"%s.x_probe", context);
623 p = cpl_parameterlist_find_const(parlist, param_name);
624 cpl_size x_probe = (cpl_size) cpl_parameter_get_int(p);
625 cpl_free(param_name);
627 param_name = cpl_sprintf(
"%s.y_probe", context);
628 p = cpl_parameterlist_find_const(parlist, param_name);
629 cpl_size y_probe = (cpl_size) cpl_parameter_get_int(p);
630 cpl_free(param_name);
632 param_name = cpl_sprintf(
"%s.collapse_cube", context);
633 p = cpl_parameterlist_find_const(parlist, param_name);
634 cpl_size collapse_cube = (cpl_size) cpl_parameter_get_int(p);
635 cpl_free(param_name);
637 enu_check_error_code(
"Could not retrieve input parameters");
642 enu_check_error_code(
"Could not identify RAW and CALIB frames");
644 base_frames = cpl_frameset_new();
651 int required = CPL_TRUE;
652 gain_lin = engl_gain_linearity_load_from_frameset(frameset,
653 ERIS_NIX_GAIN_PRO_CATG, ERIS_NIX_COEFFS_CUBE_PRO_CATG,
654 ERIS_NIX_NL_BPM_PRO_CATG, required, base_frames);
655 enu_check_error_code(
"failed to read gain/linearity information from SoF");
660 ERIS_NIX_MASTER_DARK_IMG_PRO_CATG, base_frames);
661 enu_check_error_code(
"failed to read master dark from SoF");
667 master_bpm_lamp = en_master_bpm_load_from_frameset(frameset,
668 ERIS_NIX_MASTER_BPM_LAMP_PRO_CATG,
669 base_frames, CPL_FALSE);
670 if (!master_bpm_lamp) {
671 master_bpm_sky = en_master_bpm_load_from_frameset(frameset,
672 ERIS_NIX_MASTER_BPM_SKY_PRO_CATG, base_frames,
676 enu_check_error_code(
"failed to read master BPM from SoF");
677 enu_check(master_bpm_lamp || master_bpm_sky, CPL_ERROR_ILLEGAL_INPUT,
678 "SoF contains neither lamp nor sky BPM");
679 enu_check(!(master_bpm_lamp && master_bpm_sky), CPL_ERROR_ILLEGAL_INPUT,
680 "SoF contains both lamp and sky BPM");
681 if (master_bpm_lamp) {
682 cpl_msg_info(cpl_func,
"lamp bpm read");
683 master_bpm_used = master_bpm_lamp;
685 if (master_bpm_sky) {
686 cpl_msg_info(cpl_func,
"sky bpm read");
687 master_bpm_used = master_bpm_sky;
692 if (master_bpm_lamp) {
693 master_flat_hifreq = en_master_flat_load_from_frameset(frameset,
694 ERIS_NIX_MASTER_FLAT_LAMP_HIFREQ_PRO_CATG,
695 base_frames, CPL_FALSE);
696 if (master_flat_hifreq) {
697 cpl_msg_info(cpl_func,
"lamp hifreq flat read");
700 master_flat_hifreq = en_master_flat_load_from_frameset(frameset,
701 ERIS_NIX_MASTER_FLAT_SKY_HIFREQ_PRO_CATG,
702 base_frames, CPL_FALSE);
703 if (master_flat_hifreq) {
704 cpl_msg_info(cpl_func,
"sky hifreq flat read");
708 if (master_bpm_lamp) {
711 master_flat_lofreq = en_master_flat_load_from_frameset(frameset,
712 ERIS_NIX_MASTER_FLAT_TWILIGHT_LOFREQ_PRO_CATG,
713 base_frames, CPL_FALSE);
714 if(master_flat_lofreq) {
715 cpl_msg_info(cpl_func,
"twilight lofreq flat read");
717 master_flat_lofreq = en_master_flat_load_from_frameset(frameset,
718 ERIS_NIX_MASTER_FLAT_LAMP_LOFREQ_PRO_CATG,
719 base_frames, CPL_FALSE);
720 if(master_flat_lofreq) {
721 cpl_msg_info(cpl_func,
"lamp lofreq flat read");
725 if (master_bpm_sky) {
726 master_flat_lofreq = en_master_flat_load_from_frameset(frameset,
727 ERIS_NIX_MASTER_FLAT_SKY_LOFREQ_PRO_CATG,
728 base_frames, CPL_FALSE);
729 if(master_flat_lofreq) {
730 cpl_msg_info(cpl_func,
"sky lofreq flat read");
736 if (cd_matrix_modify) {
737 const cpl_frame * target_frame = cpl_frameset_find_const(
739 ERIS_NIX_WCS_REFINE_PRO_CATG);
740 enu_check(target_frame != NULL, CPL_ERROR_DATA_NOT_FOUND,
741 "SoF has no file tagged %s", ERIS_NIX_WCS_REFINE_PRO_CATG);
743 refine_wcs = cpl_table_load(cpl_frame_get_filename(target_frame),
746 cpl_msg_info(cpl_func,
"wcs refinement table read:");
747 cpl_table_dump(refine_wcs, 0, 100, NULL);
751 const char * datatags[] = {
752 ERIS_NIX_RAW_OBJECT_JITTER_DO_CATG,
753 ERIS_NIX_RAW_SKY_JITTER_DO_CATG,
754 ERIS_NIX_RAW_STD_JITTER_DO_CATG,
755 ERIS_NIX_RAW_OBJECT_LSS_JITTER_DO_CATG,
756 ERIS_NIX_RAW_SKY_LSS_JITTER_DO_CATG,
757 ERIS_NIX_RAW_STD_LSS_JITTER_DO_CATG,
758 ERIS_NIX_RAW_STD_APP_DO_CATG,
759 ERIS_NIX_RAW_STD_FPC_DO_CATG,
760 ERIS_NIX_RAW_STD_SAM_DO_CATG,
761 ERIS_NIX_RAW_OBJECT_APP_DO_CATG,
762 ERIS_NIX_RAW_OBJECT_FPC_DO_CATG,
763 ERIS_NIX_RAW_OBJECT_SAM_DO_CATG,
764 ERIS_NIX_RAW_SKY_FPC_DO_CATG,
765 ERIS_NIX_RAW_SKY_APP_DO_CATG,
766 ERIS_NIX_RAW_PUPIL_LAMP_DO_CATG,
767 ERIS_NIX_RAW_PUPIL_SKY_DO_CATG,
768 ERIS_NIX_RAW_PUPIL_BKG_DO_CATG,
769 ERIS_NIX_RAW_PUPIL_DARK_DO_CATG
771 cpl_size ntags =
sizeof(datatags) /
sizeof(
const char *);
772 const char * protags[] = {
773 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG,
774 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG,
775 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG,
776 ERIS_NIX_CAL_DET_OBJECT_LSS_JITTER_PRO_CATG,
777 ERIS_NIX_CAL_DET_SKY_LSS_JITTER_PRO_CATG,
778 ERIS_NIX_CAL_DET_STD_LSS_JITTER_PRO_CATG,
779 ERIS_NIX_CAL_DET_STD_APP_PRO_CATG,
780 ERIS_NIX_CAL_DET_STD_FPC_PRO_CATG,
781 ERIS_NIX_CAL_DET_STD_SAM_PRO_CATG,
782 ERIS_NIX_CAL_DET_OBJECT_APP_PRO_CATG,
783 ERIS_NIX_CAL_DET_OBJECT_FPC_PRO_CATG,
784 ERIS_NIX_CAL_DET_OBJECT_SAM_PRO_CATG,
785 ERIS_NIX_CAL_DET_SKY_APP_PRO_CATG,
786 ERIS_NIX_CAL_DET_SKY_FPC_PRO_CATG,
787 ERIS_NIX_CAL_DET_PUPIL_LAMP_PRO_CATG,
788 ERIS_NIX_CAL_DET_PUPIL_SKY_PRO_CATG,
789 ERIS_NIX_CAL_DET_PUPIL_BKG_PRO_CATG,
790 ERIS_NIX_CAL_DET_PUPIL_DARK_PRO_CATG
792 cpl_size nprotags =
sizeof(protags) /
sizeof(
const char *);
793 cpl_msg_debug(cpl_func,
"ntags: %lld nprotags: %lld",ntags,nprotags);
794 enu_check(ntags == nprotags, CPL_ERROR_UNSPECIFIED,
"programming error");
798 for (cpl_size itag = 0; itag < ntags; itag++) {
803 cpl_frameset_iterator * frameset_iter = cpl_frameset_iterator_new(frameset);
804 for (cpl_size iframe = 0; iframe < cpl_frameset_get_size(frameset);
807 cpl_frame * frame = cpl_frameset_iterator_get(frameset_iter);
808 if (!strcmp(datatags[itag], cpl_frame_get_tag(frame))) {
809 cpl_msg_info(cpl_func,
"processing %s", cpl_frame_get_filename(frame));
812 enu_check_error_code(
"failed to read data to calibrate");
813 if (limage && limage->confidence) {
814 cpl_image_delete(copyconf);
815 copyconf = cpl_image_duplicate(limage->confidence);
822 if(strcmp(cpl_frame_get_tag(frame),
"PUPIL_LAMP") ){
829 int remove_read_offsets = CPL_TRUE;
831 flag_mask = ~flag_mask;
846 enu_check_error_code(
"error performing detector calibration of frames");
849 char* pro_catg = NULL;
851 if(strstr(protags[itag],
"PUPIL")) {
852 pro_catg = eris_nix_update_pupil_pro_catg(protags[itag],limage);
854 pro_catg = cpl_sprintf(
"%s",protags[itag]);
858 eris_nix_cal_det_save(limage,
865 enu_check_error_code(
"error saving frame");
873 cpl_frameset_iterator_advance(frameset_iter, 1);
875 cpl_frameset_iterator_delete(frameset_iter);
879 cpl_image_delete(copyconf);
880 cpl_frameset_delete(base_frames);
881 engl_gain_linearity_delete(gain_lin);
886 en_master_flat_delete(master_flat_hifreq);
887 en_master_flat_delete(master_flat_lofreq);
888 cpl_table_delete(refine_wcs);
890 return cpl_error_get_code();
912static cpl_error_code eris_nix_img_sky_objmask(
913 const char* recipe_name,
915 const located_imagelist * jitters,
916 const char * sky_selector,
917 const double sky_time_range,
918 const char * sky_method,
919 const int debug_data,
920 const char * debug_preface,
921 cpl_frameset * frameset,
922 const cpl_parameterlist * parlist,
923 const cpl_frameset * used_frameset,
924 const cpl_size x_probe,
925 const cpl_size y_probe,
926 located_imagelist ** objmask_jitters) {
928 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
930 located_imagelist * jitters1 = NULL;
931 located_imagelist * jitters2 = NULL;
932 const cpl_parameter * p = NULL;
933 char* param_name = NULL;
938 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
939 p = cpl_parameterlist_find_const(parlist, param_name);
940 int obj_min_pixels = cpl_parameter_get_int(p);
941 cpl_free(param_name);
943 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
944 p = cpl_parameterlist_find_const(parlist, param_name);
945 double obj_threshold = cpl_parameter_get_double(p);
946 cpl_free(param_name);
951 double obj_core_radius = -1.0;
952 int bkg_mesh_size = -1;
955 jitters->limages[0]->plist,
959 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm", context);
960 p = cpl_parameterlist_find_const(parlist, param_name);
961 double bkg_smooth_fwhm = cpl_parameter_get_double(p);
962 cpl_free(param_name);
967 cpl_msg_info(cpl_func,
"Estimating sky background with no source blanking ...");
969 jitters1, x_probe, y_probe, jitters1);
970 enu_check_error_code(
"error in sky_objmask: sky estimation");
975 bkg_smooth_fwhm, jitters1);
976 enu_check_error_code(
"error in sky_objmask: deriving object mask");
980 char * preface = cpl_sprintf(
"%s_%s", debug_preface,
"sky1");
982 frameset, parlist, used_frameset);
984 enu_check_error_code(
"error in sky_objmask: saving debug data");
989 for (cpl_size j = 0; j < jitters2->size; j++) {
990 jitters2->limages[j]->object_mask = cpl_mask_duplicate(jitters1->
991 limages[j]->object_mask);
997 if (cpl_error_get_code() == CPL_ERROR_NONE) {
998 *objmask_jitters = jitters2;
1003 return cpl_error_get_code();
1024 const cpl_parameterlist * parlist,
1025 const char* recipe_name,
1026 const char* context) {
1028 located_imagelist * object_jitters = NULL;
1029 located_imagelist * objmask_jitters = NULL;
1030 located_imagelist * objmask_sky_jitters = NULL;
1031 const char * out_tag = NULL;
1032 const cpl_parameter * p = NULL;
1033 located_imagelist * result_jitters = NULL;
1034 located_imagelist * skysub_jitters = NULL;
1035 located_imagelist * sky_jitters = NULL;
1036 located_imagelist * std_jitters = NULL;
1037 located_imagelist * target_jitters = NULL;
1038 cpl_frameset * used_frameset = NULL;
1039 char * param_name = NULL;
1041 enu_check_error_code(
"%s():%d: An error is already set: %s",
1042 cpl_func, __LINE__, cpl_error_get_where());
1046 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
1047 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
1052 cpl_msg_set_level_from_env();
1053 cpl_msg_severity severity = cpl_msg_get_level();
1054 cpl_msg_info(cpl_func,
"level %d", (
int) severity);
1058 return CPL_ERROR_BAD_FILE_FORMAT;
1062 param_name = cpl_sprintf(
"%s.sky-source", context);
1063 p = cpl_parameterlist_find_const(parlist, param_name);
1064 const char * sky_source = cpl_parameter_get_string(p);
1065 cpl_free(param_name);
1067 param_name = cpl_sprintf(
"%s.sky-selector", context);
1068 p = cpl_parameterlist_find_const(parlist, param_name);
1069 const char * sky_selector = cpl_parameter_get_string(p);
1070 cpl_free(param_name);
1072 param_name = cpl_sprintf(
"%s.sky-method", context);
1073 p = cpl_parameterlist_find_const(parlist, param_name);
1074 const char * sky_method = cpl_parameter_get_string(p);
1075 cpl_free(param_name);
1077 param_name = cpl_sprintf(
"%s.sky-bracket-time", context);
1078 p = cpl_parameterlist_find_const(parlist, param_name);
1079 const double sky_time_range = cpl_parameter_get_double(p);
1080 cpl_free(param_name);
1082 param_name = cpl_sprintf(
"%s.debug-data", context);
1083 p = cpl_parameterlist_find_const(parlist, param_name);
1084 const int debug_data = cpl_parameter_get_bool(p);
1085 cpl_free(param_name);
1087 param_name = cpl_sprintf(
"%s.x_probe", context);
1088 p = cpl_parameterlist_find_const(parlist, param_name);
1089 cpl_size x_probe = (cpl_size) cpl_parameter_get_int(p);
1090 cpl_free(param_name);
1092 param_name = cpl_sprintf(
"%s.y_probe", context);
1093 p = cpl_parameterlist_find_const(parlist, param_name);
1094 cpl_size y_probe = (cpl_size) cpl_parameter_get_int(p);
1095 cpl_free(param_name);
1097 enu_check_error_code(
"Could not retrieve input parameters");
1102 enu_check_error_code(
"Could not identify RAW and CALIB frames");
1104 used_frameset = cpl_frameset_new();
1110 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG, used_frameset);
1111 enu_check_error_code(
"Could not load "
1112 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" frames");
1114 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG, used_frameset);
1115 enu_check_error_code(
"Could not load "
1116 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG
" frames");
1118 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG, used_frameset);
1119 enu_check_error_code(
"Could not load "
1120 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames");
1122 cpl_msg_info(cpl_func,
"%d "
1123 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" frames read",
1124 (
int) object_jitters->size);
1125 cpl_msg_info(cpl_func,
"%d "
1126 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG
" frames read",
1127 (
int) sky_jitters->size);
1128 cpl_msg_info(cpl_func,
"%d "
1129 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames read",
1130 (
int) std_jitters->size);
1133 if (object_jitters->size > 0 || std_jitters->size) {
1134 if(!strcmp(sky_source,
"auto")) {
1137 if (sky_jitters->size > 0 || !strcmp(sky_source,
"target")) {
1140 cpl_msg_error(cpl_func,
"sky_source: %s, but missing input sky frames. Exit!", sky_source);
1141 return CPL_ERROR_DATA_NOT_FOUND;
1145 cpl_msg_error(cpl_func,
"Missing input object frames. Exit!");
1146 return CPL_ERROR_DATA_NOT_FOUND;
1149 enu_check(!(object_jitters->size == 0 && std_jitters->size == 0),
1150 CPL_ERROR_DATA_NOT_FOUND,
"SoF contains no "
1151 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" or "
1152 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames");
1153 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
1154 CPL_ERROR_ILLEGAL_INPUT,
"SoF contains both "
1155 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" and "
1156 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames");
1157 enu_check(!(!strcmp(sky_source,
"offset") && sky_jitters->size==0),
1158 CPL_ERROR_INCOMPATIBLE_INPUT,
1159 "offset sky position requested but no"
1160 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG
" in sof");
1164 if (object_jitters->size > 0) {
1165 target_jitters = object_jitters;
1166 out_tag = ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG;
1169 }
else if (std_jitters->size > 0) {
1170 target_jitters = std_jitters;
1171 out_tag = ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG;
1173 object_jitters = NULL;
1176 for (cpl_size j=0; j<target_jitters->size; j++) {
1177 double temp = cpl_propertylist_get_double(target_jitters->limages[j]->plist,
"RA");
1178 const char * nm = cpl_frame_get_filename(target_jitters->limages[j]->frame);
1179 cpl_msg_info(cpl_func,
"%s %f %s", nm, temp, cpl_error_get_message());
1185 if (!strcmp(sky_source,
"auto")) {
1186 if (sky_jitters->size > 0) {
1187 sky_source =
"offset";
1189 sky_source =
"target";
1191 cpl_msg_info(cpl_func,
"sky-source=='auto', resetting to '%s'",
1195 if (!strcmp(sky_source,
"offset")) {
1196 if (sky_jitters->size > 1) {
1200 eris_nix_img_sky_objmask(recipe_name, context, sky_jitters,
1201 sky_selector, sky_time_range,
1203 debug_data,
"offset",
1204 frameset, parlist, used_frameset,
1206 &objmask_sky_jitters);
1211 cpl_msg_info(cpl_func,
1212 "Estimating sky background with source blanking ...");
1214 sky_time_range, objmask_sky_jitters,
1217 enu_check_error_code(
"error in sky background subtraction");
1219 char * preface = cpl_sprintf(
"%s_%s",
"offset",
"sky2");
1221 recipe_name, frameset, parlist,
1224 result_jitters = target_jitters;
1232 cpl_msg_info(cpl_func,
1233 "Using sky-offset image as background ...");
1235 sky_time_range, sky_jitters,
1238 enu_check_error_code(
"error in sky background subtraction");
1240 char * preface = cpl_sprintf(
"%s_%s",
"offset",
"sky2");
1242 recipe_name, frameset, parlist,
1245 result_jitters = target_jitters;
1248 }
else if (!strcmp(sky_source,
"target")) {
1253 eris_nix_img_sky_objmask(recipe_name, context, target_jitters,
1254 sky_selector, sky_time_range,
1256 debug_data,
"target",
1257 frameset, parlist, used_frameset,
1264 cpl_msg_info(cpl_func,
"Estimating sky background with source blanking ...");
1266 objmask_jitters, x_probe, y_probe,
1268 enu_check_error_code(
"error in sky background subtraction");
1270 char * preface = cpl_sprintf(
"%s_%s",
"target",
"sky2");
1272 recipe_name, frameset, parlist,
1275 result_jitters = objmask_jitters;
1278 enu_check_error_code(
"failed to remove sky background");
1282 for (cpl_size i = 0; i < result_jitters->size; i++) {
1286 cpl_propertylist * applist = cpl_propertylist_new();
1287 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, out_tag);
1288 cpl_propertylist_update_string(applist,
"PRODCATG",
1290 cpl_propertylist_copy_property_regexp(applist,
1291 result_jitters->limages[i]->plist,
1299 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
1300 result_jitters->limages[i]->plist);
1305 cpl_propertylist_update_double(applist,
"RA", ra);
1306 cpl_propertylist_update_double(applist,
"DEC", dec);
1308 cpl_wcs_delete(wcs);
1314 result_jitters->limages[i]->
1322 result_jitters->limages[i],
1324 result_jitters->limages[i]->frame,
1326 PACKAGE
"/" PACKAGE_VERSION,
1329 cpl_free(out_fname);
1330 cpl_propertylist_delete(applist);
1339 cpl_frameset_delete(used_frameset);
1341 return (
int) cpl_error_get_code();
1344static cpl_error_code
1345eris_nix_scired_get_split_param_int(
const cpl_parameterlist * parlist,
1346 const char* context,
const char* pname,
const int min_x,
const int min_y,
1347 const int max_x,
const int max_y,
1348 cpl_size* txmin, cpl_size* tymin, cpl_size* txmax, cpl_size* tymax)
1351 const cpl_parameter* par = NULL;
1355 const char* pname_string_value;
1356 param_name = cpl_sprintf(
"%s.%s", context, pname);
1357 par = cpl_parameterlist_find_const(parlist, param_name);
1358 pname_string_value = cpl_parameter_get_string(par);
1359 cpl_free(param_name);
1367 cpl_msg_warning(cpl_func,
"param value: %s", pname_string_value);
1368 nFields = sscanf(pname_string_value,
"%lld,%lld,%lld,%lld%n", txmin, tymin, txmax, tymax, &end);
1369 cpl_msg_warning(cpl_func,
"nFields:%d", nFields);
1370 cpl_msg_warning(cpl_func,
"end:%d", end);
1371 if (nFields != 4 || end != strlen(pname_string_value)) {
1372 cpl_msg_error(cpl_func,
"The %s parameter must be "
1373 "a list of four integers separated by a comma", pname);
1374 printf(
"Error reading sky-box-center string\n");
1377 if (*txmin < min_x) {
1378 cpl_msg_warning(cpl_func,
"%s_x: %lld set it to 1",pname, *txmin);
1381 if (*tymin < min_y) {
1382 cpl_msg_warning(cpl_func,
"%s_y: %lld set it to 1",pname, *tymin);
1385 if (*txmax > max_x) {
1386 cpl_msg_warning(cpl_func,
"%s_x: %lld set it to 1",pname, *txmax);
1389 if (*tymax > max_y) {
1390 cpl_msg_warning(cpl_func,
"%s_y: %lld set it to 1", pname, *tymax);
1394 cpl_msg_debug(cpl_func,
"%s_x: %lld, %s_y: %lld, %s_x: %lld, %s_y: %lld",
1395 pname, *txmin, pname, *tymin, pname, *txmax, pname, *tymax);
1398 return cpl_error_get_code();
1413static cpl_error_code eris_nix_calculate_overlaps(
1414 const located_imagelist * jitters,
1415 cpl_matrix ** overlaps) {
1420 double pixsize = fabs(cpl_propertylist_get_double(jitters->limages[0]->
1421 plist,
"CD1_1") * 3600.0);
1423 cpl_size nrow = cpl_matrix_get_nrow(*overlaps);
1425 for (cpl_size row=0; row < nrow; row++) {
1426 double ra_centre = cpl_propertylist_get_double(
1427 jitters->limages[row]->plist,
1429 double dec_centre = cpl_propertylist_get_double(
1430 jitters->limages[row]->plist,
1433 for (cpl_size col = 0; col <= row; col++) {
1434 double ra = cpl_propertylist_get_double(
1435 jitters->limages[col]->plist,
1437 double dec = cpl_propertylist_get_double(
1438 jitters->limages[col]->plist,
1442 if (cpl_propertylist_has(jitters->limages[col]->plist,
1443 "ESO DET SEQ1 WIN NX")) {
1444 nx = cpl_propertylist_get_int(
1445 jitters->limages[col]->plist,
1446 "ESO DET SEQ1 WIN NX");
1449 if (cpl_propertylist_has(jitters->limages[col]->plist,
1450 "ESO DET SEQ1 WIN NY")) {
1451 ny = cpl_propertylist_get_int(
1452 jitters->limages[col]->plist,
1453 "ESO DET SEQ1 WIN NY");
1460 double ra_size = nx * pixsize;
1461 double ra_shift = fabs(ra - ra_centre) * 3600.0;
1462 double ra_overlap = (ra_size - ra_shift) / ra_size;
1464 double dec_size = ny * pixsize;
1465 double dec_shift = fabs(dec - dec_centre) * 3600.0;
1466 double dec_overlap = (dec_size - dec_shift) / dec_size;
1468 double overlap = -1.0;
1469 if (ra_overlap > 0.0 && dec_overlap > 0.0) {
1470 overlap = ra_overlap * dec_overlap;
1473 cpl_matrix_set(*overlaps, row, col, overlap);
1474 cpl_matrix_set(*overlaps, col, row, overlap);
1478 return cpl_error_get_code();
1496static cpl_error_code eris_nix_report_table(
1498 const located_imagelist * jitters,
1499 cpl_table ** report) {
1504 cpl_table_new_column(*report,
"Index", CPL_TYPE_INT);
1505 cpl_table_new_column(*report,
"RA offset", CPL_TYPE_DOUBLE);
1506 cpl_table_new_column(*report,
"Dec offset", CPL_TYPE_DOUBLE);
1507 cpl_table_new_column(*report,
"Reference", CPL_TYPE_INT);
1508 cpl_table_new_column(*report,
"Overlap", CPL_TYPE_DOUBLE);
1509 cpl_table_new_column(*report,
"WCS_METHOD", CPL_TYPE_STRING);
1510 cpl_table_new_column(*report,
"Catalogue/File", CPL_TYPE_STRING);
1511 cpl_table_new_column(*report,
"# matches", CPL_TYPE_INT);
1513 double ra_centre = cpl_propertylist_get_double(
1514 jitters->limages[ref]->plist,
1516 double dec_centre = cpl_propertylist_get_double(
1517 jitters->limages[ref]->plist,
1520 for (cpl_size i = 0; i < jitters->size; i++) {
1521 double ra = cpl_propertylist_get_double(jitters->limages[i]->plist,
1523 double dec = cpl_propertylist_get_double(jitters->limages[i]->plist,
1525 cpl_table_set_int(*report,
"Index", i, (
int) i);
1526 cpl_table_set_double(*report,
"RA offset", i,
1527 (ra - ra_centre) * 3600.0);
1528 cpl_table_set_double(*report,
"Dec offset", i,
1529 (dec - dec_centre) * 3600.0);
1532 return cpl_error_get_code();
1556static cpl_error_code eris_nix_match_and_correct(
1557 located_image * limage,
1558 const char * wcs_method,
1559 cpl_table * reference,
1560 const cpl_propertylist * ref_qclist,
1561 const char * reference_name,
1562 const double match_radius,
1563 cpl_size * nmatches,
1564 cpl_frameset * frameset,
1565 const cpl_parameterlist * parlist,
1566 const char * recipe_name,
1567 hdrl_parameter * cat_params) {
1569 cpl_table * matched_stds = NULL;
1571 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
1575 if (limage->objects && limage->objects->catalogue) {
1576 cpl_matrix * ignore = NULL;
1584 cpl_matrix_delete(ignore);
1585 enu_check_error_code(
"error correcting jitter wcs");
1590 *nmatches = cpl_table_get_nrow(matched_stds);
1605 PACKAGE
"/" PACKAGE_VERSION,
1607 ERIS_NIX_CAL_WCS_REF_CATALOGUE_PRO_CATG);
1616 "matched standards",
1618 PACKAGE
"/" PACKAGE_VERSION,
1620 ERIS_NIX_CAL_WCS_MATCH_CATALOGUE_PRO_CATG);
1624 cpl_wcs * iwcs = cpl_wcs_new_from_propertylist(limage->plist);
1630 cpl_wcs_delete(iwcs);
1635 limage->objects->catalogue,
1636 limage->objects->qclist,
1637 cpl_frame_get_filename(limage->frame),
1639 PACKAGE
"/" PACKAGE_VERSION,
1641 ERIS_NIX_CAL_WCS_CATALOGUE_PRO_CATG);
1644 cpl_msg_info(cpl_func,
"cannot match jitters %s",
1645 cpl_error_get_message());
1649 cpl_table_delete(matched_stds);
1650 return cpl_error_get_code();
1669 const cpl_parameterlist * parlist,
1670 const char* recipe_name,
1671 const char* context) {
1673 cpl_table * astrom_refcat = NULL;
1674 hdrl_parameter * cat_params = NULL;
1675 const char * cdssearch_astrom = NULL;
1676 cpl_table * ref_jitter_match = NULL;
1677 located_imagelist * jitters = NULL;
1678 cpl_matrix * jitter_overlaps = NULL;
1679 char * jitter_ref_name = NULL;
1680 cpl_table * matched_stds = NULL;
1682 located_imagelist * object_jitters = NULL;
1683 const char * out_tag = NULL;
1684 const cpl_parameter * p = NULL;
1685 cpl_vector * plan_ref = NULL;
1686 cpl_vector * plan_cal = NULL;
1687 cpl_table * report = NULL;
1688 cpl_matrix * jitter_ref_shift = NULL;
1689 located_imagelist * std_jitters = NULL;
1690 cpl_frameset * used = NULL;
1691 cpl_table * wcs_match_list = NULL;
1692 char * param_name = NULL;
1694 enu_check_error_code(
"%s():%d: An error is already set: %s",
1695 cpl_func, __LINE__, cpl_error_get_where());
1699 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
1700 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
1705 cpl_msg_set_level_from_env();
1706 cpl_msg_severity severity = cpl_msg_get_level();
1707 cpl_msg_info(cpl_func,
"level %d", (
int) severity);
1711 return CPL_ERROR_BAD_FILE_FORMAT;
1716 param_name = cpl_sprintf(
"%s.cdssearch_astrom", context);
1717 p = cpl_parameterlist_find_const(parlist, param_name);
1718 cdssearch_astrom = cpl_parameter_get_string(p);
1719 cpl_free(param_name);
1721 param_name = cpl_sprintf(
"%s.debug-data", context);
1722 p = cpl_parameterlist_find_const(parlist, param_name);
1724 cpl_free(param_name);
1726 enu_check_error_code(
"Error retrieving input parameters");
1742 enu_check_error_code(
"Could not identify RAW and CALIB frames");
1744 used = cpl_frameset_new();
1749 ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG, used);
1751 ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG, used);
1752 enu_check_error_code(
"Could not load data frames");
1754 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) object_jitters->size,
1755 ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG);
1756 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) std_jitters->size,
1757 ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG);
1761 enu_check(object_jitters->size > 0 || std_jitters->size > 0,
1762 CPL_ERROR_DATA_NOT_FOUND,
"no input frames found");
1763 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
1764 CPL_ERROR_ILLEGAL_INPUT,
"SoF contains both "
1765 ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG
" and "
1766 ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG
" frames");
1770 if (object_jitters->size > 0) {
1771 jitters = object_jitters;
1772 out_tag = ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG;
1775 }
else if (std_jitters->size > 0) {
1776 jitters = std_jitters;
1777 out_tag = ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG;
1779 object_jitters = NULL;
1786 param_name = cpl_sprintf(
"%s.catalogue.det.effective-gain", context);
1787 p = cpl_parameterlist_find_const(parlist, param_name);
1788 double gain = cpl_parameter_get_double(p);
1789 cpl_free(param_name);
1791 if (cpl_propertylist_has(jitters->limages[0]->plist,
"ESO DARK GAIN")) {
1792 gain = cpl_propertylist_get_double(jitters->limages[0]->plist,
1794 cpl_msg_info(cpl_func,
"catalogue params - reading detector gain "
1795 "from first jitter %4.1f", gain);
1797 param_name = cpl_sprintf(
"%s.catalogue.det.saturation", context);
1798 p = cpl_parameterlist_find_const(parlist, param_name);
1799 double saturation = cpl_parameter_get_double(p);
1800 cpl_free(param_name);
1802 if (cpl_propertylist_has(jitters->limages[0]->plist,
1803 "ESO DETMON SATURATION")) {
1804 saturation = cpl_propertylist_get_double(jitters->limages[0]->plist,
1805 "ESO DETMON SATURATION");
1806 cpl_msg_info(cpl_func,
"catalogue params - reading detector "
1807 "saturation level from first jitter %6.1f", saturation);
1810 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
1811 p = cpl_parameterlist_find_const(parlist, param_name);
1812 int minpixels = cpl_parameter_get_int(p);
1813 cpl_free(param_name);
1815 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
1816 p = cpl_parameterlist_find_const(parlist, param_name);
1817 double threshold = cpl_parameter_get_double(p);
1818 cpl_free(param_name);
1820 param_name = cpl_sprintf(
"%s.catalogue.obj.deblending", context);
1821 p = cpl_parameterlist_find_const(parlist, param_name);
1822 cpl_boolean deblending = cpl_parameter_get_bool(p);
1823 cpl_free(param_name);
1828 double core_radius = -1.0;
1832 jitters->limages[0]->plist,
1836 param_name = cpl_sprintf(
"%s.catalogue.bkg.estimate", context);
1837 p = cpl_parameterlist_find_const(parlist, param_name);
1838 cpl_boolean estimate = cpl_parameter_get_bool(p);
1839 cpl_free(param_name);
1841 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm", context);
1842 p = cpl_parameterlist_find_const(parlist, param_name);
1843 double smooth_gauss_fwhm = cpl_parameter_get_double(p);
1844 cpl_free(param_name);
1855 HDRL_CATALOGUE_ALL);
1857 enu_check_error_code(
"Error setting catalogue params");
1861 for (cpl_size i=0; i < jitters->size; i++) {
1862 cpl_propertylist_update_string(jitters->limages[i]->plist,
1864 ERIS_NIX_WCS_TEL_POINTING);
1865 cpl_propertylist_update_string(jitters->limages[i]->plist,
1872 for (cpl_size i = 0; i < jitters->size; i++) {
1873 diff[i] = cpl_propertylist_get_double(jitters->limages[i]->plist,
1876 float ra_centre = casu_med(diff, NULL, jitters->size);
1877 for (cpl_size i = 0; i < jitters->size; i++) {
1878 diff[i] = cpl_propertylist_get_double(jitters->limages[i]->plist,
1881 float dec_centre = casu_med(diff, NULL, jitters->size);
1882 cpl_msg_info(cpl_func,
"Jitter pattern centre at RA=%10.7f Dec=%10.7f",
1883 ra_centre, dec_centre);
1888 cpl_size jitter_ref = -1;
1889 double minr2 = 1.0e6;
1890 for (cpl_size i = 0; i < jitters->size; i++) {
1891 double ra = cpl_propertylist_get_double(jitters->limages[i]->plist,
1893 double dec = cpl_propertylist_get_double(jitters->limages[i]->plist,
1895 double r2 = pow(ra - ra_centre, 2) + pow(dec - dec_centre, 2);
1901 cpl_msg_info(cpl_func,
"Nearest jitter to centre is %d", (
int) jitter_ref);
1902 char * refname = cpl_strdup(cpl_frame_get_filename(jitters->
1903 limages[jitter_ref]->frame));
1904 cpl_msg_info(cpl_func,
"..filename %s", basename(refname));
1916 eris_nix_scired_get_split_param_int(parlist, context,
"edges-trim", 1, 1,
1917 sx, sy, &txmin, &tymin, &txmax, &tymax);
1919 cpl_msg_info(cpl_func,
"trim edge params: %lld %lld %lld %lld", txmin, tymin, txmax, tymax);
1920 cpl_image* image_edge = cpl_image_new(sx, sy, CPL_TYPE_INT);
1922 cpl_image_fill_window(image_edge,1, 1, txmin, sy, 1);
1926 cpl_image_fill_window(image_edge,sx - txmax, 1, sx, sy, 1);
1930 cpl_image_fill_window(image_edge,1, 1, sx, tymin, 1);
1934 cpl_image_fill_window(image_edge,1, sy - tymax, sx, sy, 1);
1936 cpl_mask* mask_edge = cpl_mask_threshold_image_create(image_edge,0.9, 1.1);
1937 cpl_image_delete(image_edge);
1938 cpl_mask_save(mask_edge,
"mask_edge.fits", NULL, CPL_IO_DEFAULT);
1942 cpl_mask_delete(mask_edge);
1948 jitter_overlaps = cpl_matrix_new(jitters->size, jitters->size);
1949 eris_nix_calculate_overlaps(jitters, &jitter_overlaps);
1950 cpl_msg_info(cpl_func,
" ");
1951 cpl_msg_info(cpl_func,
"Jitter overlaps matrix:");
1952 cpl_matrix_dump(jitter_overlaps, NULL);
1956 cpl_vector * matched = cpl_vector_new(jitters->size);
1957 plan_ref = cpl_vector_new(jitters->size);
1958 plan_cal = cpl_vector_new(jitters->size);
1959 for (cpl_size j=0; j<cpl_vector_get_size(matched); j++) {
1960 cpl_vector_set(matched, j, 0.0);
1961 cpl_vector_set(plan_ref, j, -1.0);
1962 cpl_vector_set(plan_cal, j, -1.0);
1966 cpl_vector_set(matched, jitter_ref, 1.0);
1967 cpl_msg_info(cpl_func,
" ");
1968 cpl_msg_info(cpl_func,
"WCS calibration plan:");
1969 cpl_msg_info(cpl_func,
"ref Gaia calibrates %d", (
int)jitter_ref);
1974 int matching = CPL_TRUE;
1977 cpl_size row_next = -1;
1978 cpl_size col_next = -1;
1979 cpl_matrix * overlaps_copy = cpl_matrix_duplicate(jitter_overlaps);
1983 for (cpl_size col=0; col<jitters->size; col++) {
1984 if (cpl_vector_get(matched, col) < 1.0) {
1985 for (cpl_size row=0; row<jitters->size; row++) {
1986 cpl_matrix_set(overlaps_copy, row, col, -1.0);
1990 for (cpl_size row=0; row<jitters->size; row++) {
1991 if (cpl_vector_get(matched, row) > 0.0) {
1992 for (cpl_size col=0; col<jitters->size; col++) {
1993 cpl_matrix_set(overlaps_copy, row, col, -1.0);
2001 if (cpl_matrix_get_max(overlaps_copy) > 0.0) {
2002 cpl_matrix_get_maxpos(overlaps_copy, &row_next, &col_next);
2003 double overlap_next = cpl_matrix_get(overlaps_copy, row_next,
2005 cpl_msg_info(cpl_func,
"ref %d -> %d overlap %4.2f", (
int)col_next,
2006 (
int)row_next, overlap_next);
2007 cpl_vector_set(matched, row_next, 1.0);
2009 cpl_vector_set(plan_ref, iplan, col_next);
2010 cpl_vector_set(plan_cal, iplan, row_next);
2013 matching = CPL_FALSE;
2015 cpl_matrix_delete(overlaps_copy);
2017 cpl_vector_delete(matched);
2022 report = cpl_table_new(jitters->size);
2023 eris_nix_report_table(jitter_ref, jitters, &report);
2030 cpl_frame * wcs_matched_frame = cpl_frameset_find (frameset,
2031 ERIS_NIX_WCS_MATCHED_CATALOGUE_PRO_CATG);
2032 const char * wcs_match_list_name = NULL;
2033 if (wcs_matched_frame) {
2034 wcs_match_list_name = cpl_frame_get_filename (wcs_matched_frame);
2038 cpl_msg_info(cpl_func,
"found manual matching list %s",
2039 wcs_match_list_name);
2040 wcs_match_list = cpl_table_load(wcs_match_list_name, 1, 0);
2041 enu_check_error_code(
"failed to read match list");
2045 const char * ref_jitter_name = cpl_frame_get_filename(
2046 jitters->limages[jitter_ref]->frame);
2047 cpl_msg_info(cpl_func,
"..reference jitter %s", ref_jitter_name);
2048 cpl_table_unselect_all(wcs_match_list);
2049 for (cpl_size row = 0; row < cpl_table_get_nrow(wcs_match_list);
2051 if (strstr(ref_jitter_name, cpl_table_get_string(wcs_match_list,
2052 "Filename", row))) {
2053 cpl_table_select_row(wcs_match_list, row);
2054 ref_jitter_match = cpl_table_extract_selected(wcs_match_list);
2055 cpl_msg_info(cpl_func,
"..found entry for reference jitter");
2060 if (!ref_jitter_match) {
2061 cpl_msg_info(cpl_func,
"..reference jitter not found in manual "
2064 cpl_msg_info(cpl_func,
"..calculating WCS correction for "
2065 "reference jitter");
2071 cpl_table_new_column(ref_jitter_match,
"xpredict", CPL_TYPE_FLOAT);
2072 cpl_table_new_column(ref_jitter_match,
"ypredict", CPL_TYPE_FLOAT);
2073 double * ra = cpl_table_get_data_double(ref_jitter_match,
"RA");
2074 double * dec = cpl_table_get_data_double(ref_jitter_match,
"DEC");
2075 cpl_matrix * celestial = cpl_matrix_new(1, 2);
2076 cpl_matrix_set(celestial, 0, 0, ra[0]);
2077 cpl_matrix_set(celestial, 0, 1, dec[0]);
2078 cpl_wcs * iwcs = cpl_wcs_new_from_propertylist(
2079 jitters->limages[jitter_ref]->plist);
2080 cpl_matrix * predicted = NULL;
2081 cpl_array * status = NULL;
2082 cpl_wcs_convert(iwcs, celestial, &predicted, &status,
2083 CPL_WCS_WORLD2PHYS);
2084 cpl_wcs_delete(iwcs);
2091 double * x_coordinate = cpl_table_get_data_double(ref_jitter_match,
2093 double * y_coordinate = cpl_table_get_data_double(ref_jitter_match,
2095 cpl_matrix * xy = cpl_matrix_new(1, 2);
2096 cpl_matrix_set(xy, 0, 0, x_coordinate[0]);
2097 cpl_matrix_set(xy, 0, 1, y_coordinate[0]);
2098 cpl_matrix_subtract(xy, predicted);
2099 jitter_ref_shift = xy;
2100 cpl_msg_info(cpl_func,
"..reference jitter shift is");
2101 cpl_matrix_dump(jitter_ref_shift, NULL);
2103 cpl_msg_info(cpl_func,
"..applying WCS correction to reference "
2106 double crpix1 = cpl_propertylist_get_double(
2107 jitters->limages[jitter_ref]->plist,
"CRPIX1");
2108 cpl_propertylist_update_double(jitters->limages[jitter_ref]->plist,
2110 cpl_matrix_get(jitter_ref_shift, 0, 0));
2111 double crpix2 = cpl_propertylist_get_double(
2112 jitters->limages[jitter_ref]->plist,
"CRPIX2");
2113 cpl_propertylist_update_double(jitters->limages[jitter_ref]->plist,
2115 cpl_matrix_get(jitter_ref_shift, 0, 1));
2119 cpl_propertylist_update_string(jitters->limages[jitter_ref]->plist,
2121 ERIS_NIX_WCS_CATALOGUE_MATCH);
2122 cpl_propertylist_update_string(jitters->limages[jitter_ref]->plist,
2124 cpl_table_get_string(ref_jitter_match,
2126 enu_check_error_code(
"failure to set corrected wcs");
2131 jitters->limages[jitter_ref]->plist);
2133 jitters->limages[jitter_ref]->frame,
2137 cpl_table_get_string(ref_jitter_match,
2140 PACKAGE
"/" PACKAGE_VERSION,
2142 ERIS_NIX_CAL_WCS_REF_CATALOGUE_PRO_CATG);
2148 jitters->limages[jitter_ref]->frame,
2152 cpl_table_get_string(ref_jitter_match,
2155 PACKAGE
"/" PACKAGE_VERSION,
2157 ERIS_NIX_CAL_WCS_MATCH_CATALOGUE_PRO_CATG);
2161 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
2162 jitters->limages[jitter_ref]->plist);
2163 cpl_msg_info(cpl_func,
"cataloguing reference jitter");
2165 jitters->limages[jitter_ref]->himage,
2166 jitters->limages[jitter_ref]->confidence,
2169 cpl_wcs_delete(wcs);
2171 jitters->limages[jitter_ref]->frame,
2173 jitters->limages[jitter_ref]->objects->catalogue,
2174 jitters->limages[jitter_ref]->objects->qclist,
2175 cpl_frame_get_filename(jitters->
2176 limages[jitter_ref]->
2179 PACKAGE
"/" PACKAGE_VERSION,
2181 ERIS_NIX_CAL_WCS_CATALOGUE_PRO_CATG);
2183 cpl_msg_info(cpl_func,
"..");
2186 if (jitter_ref_shift == NULL) {
2191 if (strcmp(cdssearch_astrom,
"none")) {
2193 cpl_msg_info(cpl_func,
" ");
2194 cpl_msg_info(cpl_func,
"Try to match sources in reference jitter "
2195 "with %s", cdssearch_astrom);
2203 astrom_refcat = NULL;
2204 int casu_status = CASU_OK;
2205 char * catname = cpl_strdup(cdssearch_astrom);
2206 int cdschoice = casu_get_cdschoice(cdssearch_astrom);
2207 casu_getstds(jitters->limages[jitter_ref]->plist,
2208 CPL_FALSE, NULL, catname, cdschoice, NULL,
2209 &astrom_refcat, NULL, &casu_status);
2211 if (astrom_refcat) {
2215 cpl_size nstds = cpl_table_get_nrow(astrom_refcat);
2216 enu_check(nstds >= minstds, CPL_ERROR_INCOMPATIBLE_INPUT,
2217 "nstds = %d, need at least %d", (
int)nstds, minstds);
2222 if (cpl_table_has_column(astrom_refcat,
"Dec") &&
2223 !cpl_table_has_column(astrom_refcat,
"DEC")) {
2224 cpl_table_duplicate_column(astrom_refcat,
"DEC",
2225 astrom_refcat,
"Dec");
2226 cpl_table_erase_column(astrom_refcat,
"Dec");
2229 cpl_msg_info(cpl_func,
"cataloguing reference jitter %d",
2231 cpl_wcs * iwcs = cpl_wcs_new_from_propertylist
2232 (jitters->limages[jitter_ref]->plist);
2234 jitters->limages[jitter_ref]->himage,
2235 jitters->limages[jitter_ref]->confidence,
2238 cpl_wcs_delete(iwcs);
2241 double match_rad = 10.0;
2242 cpl_size nmatches = 0;
2243 eris_nix_match_and_correct(jitters->limages[jitter_ref],
2244 ERIS_NIX_WCS_CATALOGUE_MATCH,
2255 cpl_table_set_int(report,
"Reference", jitter_ref, -1);
2256 cpl_table_set_double(report,
"Overlap", jitter_ref,
2257 cpl_matrix_get(jitter_overlaps,
2258 jitter_ref, jitter_ref));
2259 cpl_table_set_string(report,
"WCS_METHOD", jitter_ref,
2260 ERIS_NIX_WCS_CATALOGUE_MATCH);
2261 cpl_table_set_string(report,
"Catalogue/File", jitter_ref,
2263 cpl_table_set_int(report,
"# matches", jitter_ref, nmatches);
2265 cpl_msg_info(cpl_func,
"..");
2266 enu_check_error_code(
"error correcting wcs of reference jitter");
2278 if (!(jitters->limages[jitter_ref]->objects)) {
2279 cpl_msg_warning(cpl_func,
"Unable to absolute correct jitters "
2280 "because no sources found in reference jitter");
2283 for (cpl_size i = 0; i < jitters->size; i++) {
2284 cpl_size jref = cpl_vector_get(plan_ref, i);
2285 cpl_size jcal = cpl_vector_get(plan_cal, i);
2287 if (jref >= 0 && jitters->limages[jref]->objects != NULL) {
2288 cpl_msg_info(cpl_func,
" ");
2289 cpl_msg_info(cpl_func,
"using jitter %d to correct %d",
2290 (
int)jref, (
int)jcal);
2296 char * fname = cpl_strdup(cpl_frame_get_filename(
2297 jitters->limages[jref]->frame));
2298 char * jref_name = cpl_strdup(basename(fname));
2303 double match_rad = 2.0;
2304 cpl_size nmatches = 0;
2305 eris_nix_match_and_correct(jitters->limages[jcal],
2306 ERIS_NIX_WCS_JITTER_RELATIVE,
2307 jitters->limages[jref]->
2309 jitters->limages[jref]->
2320 cpl_table_set_int(report,
"Reference", jcal, jref);
2321 cpl_table_set_double(report,
"Overlap", jcal,
2322 cpl_matrix_get(jitter_overlaps, jref, jcal));
2323 cpl_table_set_string(report,
"WCS_METHOD", jcal,
2324 ERIS_NIX_WCS_JITTER_RELATIVE);
2325 cpl_table_set_string(report,
"Catalogue/File", jcal, jref_name);
2326 cpl_table_set_int(report,
"# matches", jcal, nmatches);
2327 cpl_free(jref_name);
2330 cpl_msg_info(cpl_func,
"..");
2334 for (cpl_size i = 0; i < jitters->size; i++) {
2338 char * out_fname =
enu_repreface(cpl_frame_get_filename(jitters->
2342 cpl_propertylist * applist = cpl_propertylist_new();
2343 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, out_tag);
2344 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
2345 cpl_propertylist_copy_property(applist, jitters->limages[i]->plist,
2347 cpl_propertylist_copy_property(applist, jitters->limages[i]->plist,
2354 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
2355 jitters->limages[i]->plist);
2360 cpl_propertylist_update_double(applist,
"RA", ra);
2361 cpl_propertylist_update_double(applist,
"DEC", dec);
2363 cpl_wcs_delete(wcs);
2367 cpl_frameset * provenance = cpl_frameset_new();
2368 cpl_frameset_insert(provenance, cpl_frame_duplicate(
2369 jitters->limages[i]->frame));
2370 if (i != jitter_ref) {
2371 cpl_frameset_insert(provenance, cpl_frame_duplicate(
2372 jitters->limages[jitter_ref]->frame));
2378 jitters->limages[i],
2380 jitters->limages[i]->frame,
2382 PACKAGE
"/" PACKAGE_VERSION,
2385 cpl_free(out_fname);
2386 cpl_frameset_delete(provenance);
2387 cpl_propertylist_delete(applist);
2390 cpl_table_dump(report, 0, 100, NULL);
2392 char * in_fname = cpl_strdup(cpl_frame_get_filename(jitters->limages[0]->
2394 char * out_fname = cpl_sprintf(
"cal_wcs_report.%s", basename(in_fname));
2396 cpl_propertylist * report_plist = cpl_propertylist_new();
2397 cpl_propertylist_update_string(report_plist, CPL_DFS_PRO_CATG,
2398 ERIS_NIX_CAL_WCS_REPORT_PRO_CATG);
2399 cpl_table_save (report, report_plist, NULL, out_fname, CPL_IO_CREATE);
2400 cpl_propertylist_delete(report_plist);
2402 cpl_free(out_fname);
2405 cpl_table_delete(astrom_refcat);
2407 cpl_table_delete(ref_jitter_match);
2408 cpl_free(jitter_ref_name);
2409 cpl_matrix_delete(jitter_ref_shift);
2410 cpl_matrix_delete(jitter_overlaps);
2411 cpl_table_delete(matched_stds);
2412 cpl_vector_delete(plan_ref);
2413 cpl_vector_delete(plan_cal);
2415 cpl_table_delete(report);
2417 cpl_frameset_delete(used);
2418 cpl_table_delete(wcs_match_list);
2420 return (
int) cpl_error_get_code();
2431static cpl_error_code cal_phot_cast_columns_to_float(cpl_table * table) {
2433 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
2437 if (table == NULL)
return CPL_ERROR_NONE;
2439 cpl_array * colnames = cpl_table_get_column_names(table);
2440 for (cpl_size icol=0; icol < cpl_array_get_size(colnames); icol++) {
2441 const char * colname = cpl_array_get_string(colnames, icol);
2442 if (cpl_table_get_column_type(table, colname) == CPL_TYPE_DOUBLE ||
2443 cpl_table_get_column_type(table, colname) == CPL_TYPE_LONG_LONG) {
2444 cpl_table_cast_column(table, colname, colname, CPL_TYPE_FLOAT);
2447 cpl_array_delete(colnames);
2449 return cpl_error_get_code();
2466static cpl_error_code eris_nix_img_cal_phot_save(
2467 located_image * limage,
2469 cpl_frameset * frameset,
2470 const cpl_parameterlist * parlist,
2471 const char * recipe_name) {
2473 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
2481 double cd1_1 = cpl_propertylist_get_double(limage->plist,
"CD1_1");
2482 double cd2_1 = cpl_propertylist_get_double(limage->plist,
"CD2_1");
2483 double pixsize = sqrt(pow(cd1_1, 2) + pow(cd2_1, 2)) * 3600.0;
2485 double fwhm_pix = -1.0;
2486 if (limage->objects &&
2487 limage->objects->qclist &&
2488 cpl_propertylist_has(limage->objects->qclist,
"ESO QC IMAGE_SIZE")) {
2490 fwhm_pix = cpl_propertylist_get_double(limage->objects->qclist,
2491 "ESO QC IMAGE_SIZE");
2494 if (fwhm_pix != -1.0) {
2495 cpl_propertylist_update_double(limage->plist,
"PSF_FWHM",
2496 fwhm_pix * pixsize);
2497 cpl_propertylist_set_comment(limage->plist,
"PSF_FWHM",
2498 "Average FWHM of stellar objects[arcsec]");
2500 double fwhm = cpl_propertylist_get_double(limage->plist,
"PSF_FWHM");
2501 fwhm_pix = fwhm / pixsize;
2504 double photzp = cpl_propertylist_get_double(limage->plist,
"PHOTZP");
2505 double abmaglim = -1.0;
2506 if(!isfinite(photzp)) {
2513 cpl_propertylist * applist = cpl_propertylist_new();
2515 cpl_propertylist_copy_property(applist, limage->plist,
"FLUXCAL");
2517 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"ESO QC MAGZPT"))) {
2518 cpl_propertylist_update_double(applist,
"ESO QC MAGZPT", -999);
2519 cpl_propertylist_update_double(limage->plist,
"ESO QC MAGZPT", -999);
2521 cpl_propertylist_copy_property(applist, limage->plist,
"ESO QC MAGZPT");
2524 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"ESO QC MAGZERR"))) {
2525 cpl_propertylist_update_double(applist,
"ESO QC MAGZERR", -999);
2526 cpl_propertylist_update_double(limage->plist,
"ESO QC MAGZERR", -999);
2528 cpl_propertylist_copy_property(applist, limage->plist,
"ESO QC MAGZERR");
2532 cpl_propertylist_update_double(applist,
"ABMAGLIM", abmaglim);
2533 cpl_propertylist_set_comment(applist,
"ABMAGLIM",
"5-sigma "
2534 "limiting AB magnitude");
2539 double saturation = cpl_propertylist_get_double(limage->plist,
2540 "ESO DETMON SATURATION");
2542 double satlev = saturation / dit;
2543 double abmagsat = cpl_propertylist_get_double(limage->plist,
"ABMAGSAT");
2544 abmagsat = abmagsat + 2.5 * log10(65000 / satlev);
2545 cpl_propertylist_copy_property(applist, limage->plist,
"ABMAGSAT");
2547 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"ABMAGSAT"))) {
2548 cpl_propertylist_update_double(applist,
"ABMAGSAT", -999);
2549 cpl_propertylist_update_double(limage->plist,
"ABMAGSAT", -999);
2551 cpl_propertylist_update_double(applist,
"ABMAGSAT", abmagsat);
2554 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"PHOTZP"))) {
2555 cpl_propertylist_append_double(applist,
"PHOTZP", -999);
2556 cpl_propertylist_set_double(limage->plist,
"PHOTZP", -999);
2558 cpl_propertylist_copy_property(applist, limage->plist,
"PHOTZP");
2561 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"PHOTZPER"))) {
2562 cpl_propertylist_append_double(applist,
"PHOTZPER", -999);
2563 cpl_propertylist_set_double(limage->plist,
"PHOTZPER", -999);
2565 cpl_propertylist_copy_property(applist, limage->plist,
"PHOTZPER");
2567 cpl_propertylist_copy_property(applist, limage->plist,
"ZPMETHOD");
2568 if (cpl_propertylist_has(limage->plist,
"ZP_CAT")) {
2569 cpl_propertylist_copy_property(applist, limage->plist,
"ZP_CAT");
2571 cpl_propertylist_copy_property(applist, limage->plist,
"ESO DRS EXTCOEF");
2575 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, tag);
2576 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
2582 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(limage->plist);
2587 cpl_propertylist_update_double(applist,
"RA", ra);
2588 cpl_propertylist_update_double(applist,
"DEC", dec);
2590 cpl_wcs_delete(wcs);
2595 cpl_frameset * provenance = cpl_frameset_new();
2596 cpl_frameset_insert(provenance, cpl_frame_duplicate(limage->frame));
2600 char * out_fname =
enu_repreface(cpl_frame_get_filename(limage->frame),
2611 PACKAGE
"/" PACKAGE_VERSION,
2614 cpl_free(out_fname);
2615 cpl_frameset_delete(provenance);
2616 cpl_propertylist_delete(applist);
2618 return cpl_error_get_code();
2631static cpl_error_code eris_nix_img_cal_phot_default(
2632 cpl_frameset * frameset,
2633 located_image * jitter) {
2635 cpl_table * phot_data = NULL;
2636 cpl_table * selected = NULL;
2640 cpl_frame * phot_data_frame = cpl_frameset_find (frameset,
2641 ERIS_NIX_PHOT_DATA_PRO_CATG);
2642 const char * phot_data_file = cpl_frame_get_filename (phot_data_frame);
2643 enu_check_error_code(
"Failed to read NIX photometry file name");
2645 cpl_msg_info(cpl_func,
"..transferring default photometric calibration "
2646 "from %s", phot_data_file);
2651 const char * pcat =
"2MASS";
2652 cpl_size phot_ext = cpl_fits_find_extension(phot_data_file, pcat);
2653 enu_check(phot_ext > 0, CPL_ERROR_INCOMPATIBLE_INPUT,
2654 "photometry information for '%s' not found in %s",
2655 pcat, phot_data_file);
2657 phot_data = cpl_table_load(phot_data_file, phot_ext, 0);
2663 enu_check(filter != NULL, CPL_ERROR_INCOMPATIBLE_INPUT,
2664 "Failure to find filter name");
2667 char * comparison = cpl_sprintf(
"^%s$", filter);
2668 cpl_size nsel = cpl_table_and_selected_string(phot_data,
"filter_name",
2669 CPL_EQUAL_TO, comparison);
2670 cpl_free(comparison);
2672 cpl_msg_info(cpl_func,
"Filter %s located in %s", filter,
2674 selected = cpl_table_extract_selected(phot_data);
2675 cpl_table_dump(selected, 0, 1, NULL);
2676 cpl_table_delete(phot_data);
2677 phot_data = selected;
2679 cpl_error_set_message(cpl_func, CPL_ERROR_INCOMPATIBLE_INPUT,
2680 "No entry for filter %s in %s", filter,
2683 enu_check_error_code(
"Failure to read photometry data for filter %s",
2687 double default_zp = cpl_table_get_double(phot_data,
"default_zp", 0,
2689 double default_zp_err = cpl_table_get_double(phot_data,
2690 "default_zp_err", 0,
2692 double extcoef = cpl_table_get_double(phot_data,
"atm_extcoef", 0,
2703 const double extinct = extcoef * (airmass - 1.0);
2704 const double exptime = 1.0;
2705 cpl_msg_info(cpl_func,
"default %f %f %f", default_zp, exptime, extinct);
2706 const double photzp = default_zp + 2.5*log10(exptime) - extinct;
2710 const char * zp_method =
"DEFAULT";
2711 const char * zp_method_comment =
"ZP taken from filter default value";
2712 const char * magzpt_comment =
"[mag] photometric zeropoint";
2713 const char * magzerr_comment =
"[mag] photometric zeropoint error";
2714 const char * photzp_comment =
"[mag] photometric zeropoint";
2715 const char * photzper_comment =
"[mag] uncertainty on PHOTZP";
2716 const char * extcoef_comment =
"[mag] Assumed extinction coefficient";
2720 cpl_propertylist_update_string(jitter->plist,
"FLUXCAL",
"ABSOLUTE");
2721 cpl_propertylist_set_comment(jitter->plist,
"FLUXCAL",
2722 "quality of flux calibration");
2723 cpl_propertylist_update_double(jitter->plist,
"ESO QC MAGZPT",
2725 cpl_propertylist_set_comment(jitter->plist,
"ESO QC MAGZPT",
2727 cpl_propertylist_update_double(jitter->plist,
"ESO QC MAGZERR",
2729 cpl_propertylist_set_comment(jitter->plist,
"ESO QC MAGZERR",
2731 cpl_propertylist_update_double(jitter->plist,
"PHOTZP", photzp);
2732 cpl_propertylist_set_comment(jitter->plist,
"PHOTZP", photzp_comment);
2733 cpl_propertylist_update_double(jitter->plist,
"PHOTZPER", default_zp_err);
2734 cpl_propertylist_set_comment(jitter->plist,
"PHOTZPER", photzper_comment);
2735 cpl_propertylist_update_string(jitter->plist,
"ZPMETHOD", zp_method);
2736 cpl_propertylist_set_comment(jitter->plist,
"ZPMETHOD",
2738 cpl_propertylist_update_double(jitter->plist,
"ESO DRS EXTCOEF", extcoef);
2739 cpl_propertylist_set_comment(jitter->plist,
"ESO DRS EXTCOEF",
2744 if (jitter->objects && jitter->objects->qclist) {
2745 cpl_propertylist_update_double(jitter->objects->qclist,
2746 "ESO QC MAGZPT", default_zp);
2747 cpl_propertylist_set_comment(jitter->objects->qclist,
2748 "ESO QC MAGZPT", magzpt_comment);
2749 cpl_propertylist_update_double(jitter->objects->qclist,
2750 "ESO QC MAGZERR", default_zp_err);
2751 cpl_propertylist_set_comment(jitter->objects->qclist,
2752 "ESO QC MAGZERR", magzerr_comment);
2753 cpl_propertylist_update_double(jitter->objects->qclist,
"PHOTZP",
2755 cpl_propertylist_set_comment(jitter->objects->qclist,
"PHOTZP",
2757 cpl_propertylist_update_string(jitter->objects->qclist,
2758 "ZPMETHOD", zp_method);
2759 cpl_propertylist_set_comment(jitter->objects->qclist,
2760 "ZPMETHOD", zp_method_comment);
2761 cpl_propertylist_update_double(jitter->plist,
"ESO DRS EXTCOEF",
2763 cpl_propertylist_set_comment(jitter->plist,
"ESO DRS EXTCOEF",
2769 cpl_table_delete(phot_data);
2770 return cpl_error_get_code();
2785static cpl_error_code eris_nix_img_cal_phot_external(
2786 cpl_frameset * frameset,
2787 const cpl_parameterlist * parlist,
2788 located_imagelist * standards,
2789 located_imagelist * jitters,
2790 const char * out_catg,
2791 const char * recipe_name) {
2793 cpl_msg_info(cpl_func,
"..transferring photometric calibration from %s",
2794 cpl_frame_get_filename(standards->limages[0]->frame));
2799 const char * filter =
enu_get_filter(jitters->limages[0]->plist);
2800 const char * std_filter = cpl_propertylist_get_string(
2801 standards->limages[0]->plist,
2803 enu_check(!strcmp(filter, std_filter), CPL_ERROR_INCOMPATIBLE_INPUT,
2804 "Standard field filter (%s) does not match "
2805 "target (%s)", std_filter, filter);
2810 const double magzpt = cpl_propertylist_get_double(
2811 standards->limages[0]->plist,
"ESO QC MAGZPT");
2812 const char * magzpt_comment = cpl_propertylist_get_comment(
2813 standards->limages[0]->plist,
2815 const double magzerr = cpl_propertylist_get_double(
2816 standards->limages[0]->plist,
"ESO QC MAGZERR");
2817 const char * magzerr_comment = cpl_propertylist_get_comment(
2818 standards->limages[0]->plist,
2820 const char * photzp_comment = cpl_propertylist_get_comment(
2821 standards->limages[0]->plist,
"PHOTZP");
2826 const double extcoef = cpl_propertylist_get_double(
2827 standards->limages[0]->plist,
2829 const char * extcoef_comment =
"[mag] Assumed extinction coefficient";
2837 for (cpl_size j = 0; j < jitters->size; j++) {
2844 const double extinct = extcoef * (airmass - 1.0);
2845 const double exptime = 1.0;
2846 const double photzp = magzpt + 2.5*log10(exptime) - extinct;
2850 cpl_propertylist_update_string(jitters->limages[j]->plist,
2851 "FLUXCAL",
"ABSOLUTE");
2852 cpl_propertylist_set_comment(jitters->limages[j]->plist,
"FLUXCAL",
2853 "quality of flux calibration");
2854 cpl_propertylist_update_double(jitters->limages[j]->plist,
2855 "ESO QC MAGZPT", magzpt);
2856 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2857 "ESO QC MAGZPT", magzpt_comment);
2858 cpl_propertylist_update_double(jitters->limages[j]->plist,
2859 "ESO QC MAGZERR", magzerr);
2860 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2861 "ESO QC MAGZERR", magzerr_comment);
2862 cpl_propertylist_update_double(jitters->limages[j]->plist,
2864 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2865 "PHOTZP", photzp_comment);
2866 cpl_propertylist_update_double(jitters->limages[j]->plist,
2867 "ESO DRS EXTCOEF", extcoef);
2868 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2869 "ESO DRS EXTCOEF", extcoef_comment);
2873 if (jitters->limages[j]->objects) {
2874 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2875 "ESO QC MAGZPT", magzpt);
2876 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2877 "ESO QC MAGZPT", magzpt_comment);
2878 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2879 "ESO QC MAGZERR", magzerr);
2880 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2881 "ESO QC MAGZERR", magzerr_comment);
2882 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2884 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2885 "PHOTZP", photzp_comment);
2886 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2887 "ESO DRS EXTCOEF", extcoef);
2888 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2889 "ESO DRS EXTCOEF", extcoef_comment);
2894 const char * zp_method =
"separate_STD_star";
2895 const char * zp_method_comment =
2896 "photometric cal method: "
2897 "separate_STD_star = transfer from other image, "
2898 "science_field_standards = using stds in field, "
2899 "default = default value from phot data file";
2900 cpl_propertylist_update_string(jitters->limages[j]->plist,
2901 "ZPMETHOD", zp_method);
2902 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2903 "ZPMETHOD", zp_method_comment);
2904 if (jitters->limages[j]->objects) {
2905 cpl_propertylist_update_string(jitters->limages[j]->objects->qclist,
2906 "ZPMETHOD", zp_method);
2907 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2908 "ZPMETHOD", zp_method_comment);
2913 eris_nix_img_cal_phot_save(jitters->limages[j],
2918 enu_check_error_code(
"failure writing result");
2923 return cpl_error_get_code();
2938static cpl_error_code eris_nix_img_cal_phot_internal(
2939 cpl_frameset * frameset,
2940 const cpl_parameterlist * parlist,
2941 located_imagelist * jitters,
2942 const char * out_catg,
2943 const char * recipe_name,
2944 const char* context) {
2946 int casu_status = CASU_OK;
2947 hdrl_parameter * cat_params = NULL;
2948 casu_fits ** in_image_data = NULL;
2949 casu_fits ** in_image_conf = NULL;
2950 casu_fits ** in_image_var = NULL;
2951 casu_tfits ** in_cats = NULL;
2952 casu_tfits ** in_mstds = NULL;
2953 const cpl_parameter * p = NULL;
2954 cpl_table * phot_data = NULL;
2955 cpl_table ** phot_refcat = NULL;
2956 char * param_name = NULL;
2958 cpl_msg_info(cpl_func,
"Calibrating using standard stars in field");
2962 param_name = cpl_sprintf(
"%s.cdssearch_photom", context);
2963 p = cpl_parameterlist_find_const(parlist, param_name);
2964 const char * cdssearch_photom = cpl_parameter_get_string(p);
2965 cpl_msg_info(cpl_func,
"cdssearch_photom: %s",cdssearch_photom);
2966 cpl_free(param_name);
2968 param_name = cpl_sprintf(
"%s.pixel_radius", context);
2969 p = cpl_parameterlist_find_const(parlist, param_name);
2970 const double pixel_radius = cpl_parameter_get_double(p);
2971 cpl_free(param_name);
2973 param_name = cpl_sprintf(
"%s.minphotom", context);
2974 p = cpl_parameterlist_find_const(parlist, param_name);
2975 const int minphotom = cpl_parameter_get_int(p);
2976 cpl_free(param_name);
2978 param_name = cpl_sprintf(
"%s.magerrcut", context);
2979 p = cpl_parameterlist_find_const(parlist, param_name);
2980 const double magerrcut = cpl_parameter_get_double(p);
2981 cpl_free(param_name);
2988 param_name = cpl_sprintf(
"%s.catalogue.det.effective-gain", context);
2989 p = cpl_parameterlist_find_const(parlist, param_name);
2990 double gain = cpl_parameter_get_double(p);
2991 cpl_free(param_name);
2993 if (cpl_propertylist_has(jitters->limages[0]->plist,
"ESO DARK GAIN")) {
2994 cpl_msg_info(cpl_func,
"reading detector gain from first jitter");
2995 gain = cpl_propertylist_get_double(jitters->limages[0]->plist,
2999 param_name = cpl_sprintf(
"%s.catalogue.det.saturation", context);
3000 p = cpl_parameterlist_find_const(parlist, param_name);
3001 double saturation = cpl_parameter_get_double(p);
3002 cpl_free(param_name);
3005 if (cpl_propertylist_has(jitters->limages[0]->plist,
3006 "ESO DETMON SATURATION")) {
3007 cpl_msg_info(cpl_func,
3008 "reading detector saturation level from first jitter");
3009 double saturation_adu = cpl_propertylist_get_double(
3010 jitters->limages[0]->plist,
3011 "ESO DETMON SATURATION");
3012 double dit =
enu_get_dit(jitters->limages[0]->plist);
3013 saturation = saturation_adu / dit;
3014 cpl_msg_info(cpl_func,
3015 "saturation(adu)=%5.3e dit=%5.3e saturation(adu/s)=%5.3e",
3016 saturation_adu, dit, saturation);
3020 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
3021 p = cpl_parameterlist_find_const(parlist, param_name);
3022 int minpixels = cpl_parameter_get_int(p);
3023 cpl_free(param_name);
3025 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
3026 p = cpl_parameterlist_find_const(parlist, param_name);
3027 double threshold = cpl_parameter_get_double(p);
3028 cpl_free(param_name);
3030 param_name = cpl_sprintf(
"%s.catalogue.obj.deblending", context);
3031 p = cpl_parameterlist_find_const(parlist, param_name);
3032 cpl_boolean deblending = cpl_parameter_get_bool(p);
3033 cpl_free(param_name);
3038 double core_radius = -1.0;
3042 jitters->limages[0]->plist,
3046 param_name = cpl_sprintf(
"%s.catalogue.bkg.estimate", context);
3047 p = cpl_parameterlist_find_const(parlist, param_name);
3048 cpl_boolean estimate = cpl_parameter_get_bool(p);
3049 cpl_free(param_name);
3051 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm",
3053 p = cpl_parameterlist_find_const(parlist, param_name);
3054 double smooth_gauss_fwhm = cpl_parameter_get_double(p);
3055 cpl_free(param_name);
3066 HDRL_CATALOGUE_ALL);
3068 cpl_msg_info(cpl_func,
"gain=%4.2f saturation=%6.2f", gain, saturation);
3070 enu_check_error_code(
"Could not retrieve input parameters");
3071 enu_check(strcmp(cdssearch_photom,
"none"), CPL_ERROR_ILLEGAL_INPUT,
3072 "photometric catalogue not specified");
3076 cpl_frame * phot_data_frame = cpl_frameset_find (frameset,
3077 ERIS_NIX_PHOT_DATA_PRO_CATG);
3078 const char * phot_data_file = cpl_frame_get_filename (phot_data_frame);
3079 enu_check_error_code(
"Failed to read NIX photometry file name");
3081 cpl_msg_info(cpl_func,
"..reading instrument photometric properties "
3082 "from %s", phot_data_file);
3083 cpl_size phot_ext = cpl_fits_find_extension(phot_data_file,
3085 enu_check(phot_ext > 0, CPL_ERROR_INCOMPATIBLE_INPUT,
3086 "photometry information for '%s' not found in %s",
3087 cdssearch_photom, phot_data_file);
3088 phot_data = cpl_table_load(phot_data_file, phot_ext, 0);
3092 cal_phot_cast_columns_to_float(phot_data);
3097 const char * filter =
enu_get_filter(jitters->limages[0]->plist);
3098 enu_check_error_code(
"Failed to read filter name from file");
3101 char * comparison = cpl_sprintf(
"^%s$", filter);
3102 cpl_size nsel = cpl_table_and_selected_string(phot_data,
"filter_name",
3103 CPL_EQUAL_TO, comparison);
3104 cpl_free(comparison);
3106 cpl_msg_info(cpl_func,
"Filter %s located in %s", filter,
3108 cpl_table * selected = cpl_table_extract_selected(phot_data);
3109 cpl_table_dump(selected, 0, 10, NULL);
3110 cpl_table_delete(selected);
3111 cpl_table_select_all(phot_data);
3113 cpl_error_set_message(cpl_func, CPL_ERROR_INCOMPATIBLE_INPUT,
3114 "No entry for filter %s in %s", filter,
3117 enu_check_error_code(
"Failure to read photometry data for filter %s",
3126 for (cpl_size j = 0; j < jitters->size; j++) {
3130 cpl_propertylist_update_double(jitters->limages[j]->plist,
3133 if (jitters->limages[j]->objects) {
3134 cpl_propertylist * phu = jitters->limages[j]->plist;
3135 cpl_propertylist * ehu = jitters->limages[j]->objects->qclist;
3142 double cd1_1 = cpl_propertylist_get_double(phu,
"CD1_1");
3143 double cd2_1 = cpl_propertylist_get_double(phu,
"CD2_1");
3144 double pixsize = sqrt(cd1_1 * cd1_1 + cd2_1 * cd2_1) * 3600.0;
3145 cpl_propertylist_update_float(phu,
"ESO QC WCS_SCALE",
3149 double val = cpl_propertylist_get_double(ehu,
"ESO QC SKY_NOISE");
3150 cpl_propertylist_update_float(ehu,
"ESO DRS SKYNOISE", (
float) val);
3153 val = cpl_propertylist_get_double(ehu,
"ESO QC MEAN_SKY");
3156 cpl_propertylist_update_double(ehu,
"ESO DRS SKYLEVEL",
3162 double fwhm_pix = cpl_propertylist_get_double(
3163 ehu,
"ESO QC IMAGE_SIZE");
3167 double fwhm = fwhm_pix * pixsize;
3168 cpl_propertylist_update_double(ehu,
"PSF_FWHM", (
float)fwhm);
3169 cpl_propertylist_set_comment(ehu,
"PSF_FWHM",
"[arcsec] Average "
3170 "FWHM of stellar objects");
3174 if (jitters->limages[j]->objects->catalogue) {
3175 cal_phot_cast_columns_to_float(jitters->limages[j]->objects->
3189 in_cats = cpl_malloc(jitters->size *
sizeof(casu_tfits *));
3190 in_mstds = cpl_malloc(jitters->size *
sizeof(casu_tfits *));
3191 phot_refcat = cpl_malloc(jitters->size *
sizeof(cpl_table *));
3193 for (cpl_size j = 0; j < jitters->size; j++) {
3194 in_mstds[j] = cpl_malloc(
sizeof(casu_tfits));
3195 in_mstds[j]->table = NULL;
3196 in_mstds[j]->phu = NULL;
3197 in_mstds[j]->ehu = NULL;
3198 in_mstds[j]->fname = NULL;
3199 in_mstds[j]->extname = NULL;
3200 in_mstds[j]->fullname = NULL;
3201 in_mstds[j]->nexten = -1;
3202 in_mstds[j]->status = CASU_OK;
3204 in_cats[j] = cpl_malloc(
sizeof(casu_tfits));
3205 in_cats[j]->table = NULL;
3206 in_cats[j]->phu = NULL;
3207 in_cats[j]->ehu = NULL;
3208 in_cats[j]->fname = NULL;
3209 in_cats[j]->extname = NULL;
3210 in_cats[j]->fullname = NULL;
3211 in_cats[j]->nexten = -1;
3212 in_cats[j]->status = CASU_OK;
3214 phot_refcat[j] = NULL;
3220 for (cpl_size j = 0; j < jitters->size; j++) {
3221 cpl_msg_info(cpl_func,
"processing jitter %d", (
int)j);
3225 if (jitters->limages[j]->objects) {
3226 in_cats[j]->table = cpl_table_duplicate(jitters->limages[j]->
3227 objects->catalogue);
3228 in_cats[j]->phu = cpl_propertylist_duplicate(jitters->limages[j]->
3230 in_cats[j]->ehu = cpl_propertylist_duplicate(jitters->limages[j]->
3232 in_cats[j]->fname = cpl_strdup(cpl_frame_get_filename(
3233 jitters->limages[j]->frame));
3243 enu_check_error_code(
"error before calling casu_getstds");
3244 phot_refcat[j] = NULL;
3245 casu_status = CASU_OK;
3246 casu_getstds(jitters->limages[j]->plist, CPL_FALSE,
3249 1, NULL, &phot_refcat[j], NULL,
3252 if (phot_refcat[j] == NULL) {
3253 cpl_msg_info(cpl_func,
"...no phot standards found");
3255 en_catalogue_name_conformance(phot_refcat[j]);
3256 cpl_size nstds = cpl_table_get_nrow(phot_refcat[j]);
3257 cpl_msg_info(cpl_func,
"...%d phot standards read", (
int)nstds);
3263 const int strict = 0;
3265 phot_refcat[j], pixel_radius, strict,
3266 &(in_mstds[j]->table));
3267 enu_check_error_code(
"Failure trying to match standards: %s",
3268 cpl_error_get_message());
3272 cal_phot_cast_columns_to_float(in_mstds[j]->table);
3273 in_mstds[j]->phu = cpl_propertylist_new();
3274 in_mstds[j]->ehu = cpl_propertylist_new();
3275 enu_check(casu_status == CASU_OK, CPL_ERROR_ILLEGAL_INPUT,
3276 "casu_matchstds failure status : %d", casu_status);
3285 cpl_msg_info(cpl_func,
".no objects detected in field");
3286 in_cats[j]->phu = cpl_propertylist_new();
3287 in_cats[j]->ehu = cpl_propertylist_new();
3297 if (in_mstds[j]->table == NULL) {
3298 in_mstds[j]->table = cpl_table_new(0);
3299 in_mstds[j]->phu = cpl_propertylist_new();
3300 in_mstds[j]->ehu = cpl_propertylist_new();
3306 cpl_msg_info(cpl_func,
"performing photometric calibration");
3307 casu_status = CASU_OK;
3308 char * filter_copy = cpl_strdup(filter);
3309 casu_photcal_extinct(in_image_data,
3318 "ESO TEL AIRM START",
3321 cpl_free(filter_copy);
3322 enu_check_error_code(
"Failure in casu_photcal_extinct: %s",
3323 cpl_error_get_message());
3328 for (cpl_size j = 0; j < jitters->size; j++) {
3330 const char * fluxcal = cpl_propertylist_get_string(
3331 in_image_data[j]->phu,
3334 if (!strcmp(fluxcal,
"UNCALIBRATED")) {
3340 cpl_msg_warning(cpl_func,
"casu_photcal_extinct has returned "
3341 "a bad result, applying default");
3342 eris_nix_img_cal_phot_default(frameset, jitters->limages[j]);
3353 cpl_propertylist_delete(jitters->limages[j]->plist);
3354 jitters->limages[j]->plist = cpl_propertylist_duplicate(
3355 in_image_data[j]->ehu);
3356 cpl_propertylist_set_string(jitters->limages[j]->plist,
"FLUXCAL",
3361 cpl_propertylist_update_string(jitters->limages[j]->plist,
3369 const int zpfudged = cpl_propertylist_get_bool(
3370 jitters->limages[j]->plist,
"ZPFUDGED");
3372 const char * zp_method = NULL;
3373 const char * zp_comment = NULL;
3375 zp_method =
"DEFAULT";
3376 zp_comment =
"ZP taken from filter default value";
3378 zp_method =
"2MASS";
3379 zp_comment =
"ZP computed from 2MASS sources in the field";
3381 cpl_propertylist_update_string(jitters->limages[j]->plist,
3382 "ZPMETHOD", zp_method);
3383 cpl_propertylist_set_comment(jitters->limages[j]->plist,
3384 "ZPMETHOD", zp_comment);
3385 cpl_msg_info(cpl_func,
"set ZPMETHOD %s", zp_method);
3387 if (!strcmp(zp_method,
"2MASS")) {
3388 cpl_propertylist_update_string(jitters->limages[j]->plist,
3389 "ZP_CAT", cdssearch_photom);
3394 if (jitters->limages[j]->objects &&
3395 jitters->limages[j]->objects->qclist) {
3396 cpl_propertylist_delete(jitters->limages[j]->objects->qclist);
3397 jitters->limages[j]->objects->qclist =
3398 cpl_propertylist_duplicate(
3400 cpl_propertylist_update_string(
3401 jitters->limages[j]->objects->qclist,
3402 "ZPMETHOD", zp_method);
3403 cpl_propertylist_update_string(
3404 jitters->limages[j]->objects->qclist,
3412 in_mstds[j]->table &&
3413 cpl_table_get_nrow(in_mstds[j]->table) > 0) {
3414 jitters->limages[j]->matchstd_phot = cpl_calloc(
3415 sizeof(hdrl_catalogue_result), 1);
3416 jitters->limages[j]->matchstd_phot->catalogue =
3417 cpl_table_duplicate(in_mstds[j]->table);
3418 jitters->limages[j]->matchstd_phot->qclist =
3419 cpl_propertylist_duplicate(
3421 cpl_propertylist_update_string(jitters->limages[j]->
3422 matchstd_phot->qclist,
3425 if (!strcmp(zp_method,
"science_field_standards")) {
3426 cpl_propertylist_update_string(jitters->limages[j]->
3427 matchstd_phot->qclist,
"ZP_CAT",
3435 eris_nix_img_cal_phot_save(jitters->limages[j],
3440 enu_check_error_code(
"failure writing result");
3444 if (phot_refcat[j]) {
3446 jitters->limages[j]->frame,
3452 PACKAGE
"/" PACKAGE_VERSION,
3454 ERIS_NIX_CAL_PHOT_REF_CATALOGUE_PRO_CATG);
3459 if (jitters->limages[j]->matchstd_phot &&
3460 jitters->limages[j]->matchstd_phot->catalogue) {
3463 jitters->limages[j]->frame,
3465 jitters->limages[j]->matchstd_phot->catalogue,
3466 jitters->limages[j]->matchstd_phot->qclist,
3469 PACKAGE
"/" PACKAGE_VERSION,
3470 "matchcat.cal_phot",
3471 ERIS_NIX_CAL_PHOT_MATCH_CATALOGUE_PRO_CATG);
3476 if (jitters->limages[j]->objects &&
3477 jitters->limages[j]->objects->catalogue) {
3480 jitters->limages[j]->frame,
3482 jitters->limages[j]->objects->catalogue,
3483 jitters->limages[j]->objects->qclist,
3484 cpl_frame_get_filename(jitters->
3488 PACKAGE
"/" PACKAGE_VERSION,
3490 ERIS_NIX_CAL_PHOT_CATALOGUE_PRO_CATG);
3497 if (in_image_data) {
3498 for (cpl_size j = 0; j < jitters->size; j++) {
3499 if (in_image_data[j]) casu_fits_unwrap(in_image_data[j]);
3501 cpl_free(in_image_data);
3504 for (cpl_size j = 0; j < jitters->size; j++) {
3505 if (in_image_var[j]) casu_fits_unwrap(in_image_var[j]);
3507 cpl_free(in_image_var);
3509 if (in_image_conf) {
3510 for (cpl_size j = 0; j < jitters->size; j++) {
3511 if (in_image_conf[j]) casu_fits_unwrap(in_image_conf[j]);
3513 cpl_free(in_image_conf);
3515 casu_tfits_delete_list(in_cats, (
int)jitters->size);
3516 casu_tfits_delete_list(in_mstds, jitters->size);
3517 if (phot_refcat != NULL) {
3518 for (cpl_size j = 0; j < jitters->size; j++) {
3519 cpl_table_delete(phot_refcat[j]);
3523 cpl_table_delete(phot_data);
3524 cpl_free(phot_refcat);
3526 return cpl_error_get_code();
3544 const cpl_parameterlist * parlist,
3545 const char * recipe_name,
3546 const char* context) {
3548 located_imagelist * jitters = NULL;
3549 located_imagelist * object_jitters = NULL;
3550 located_imagelist * standards = NULL;
3551 located_imagelist * std_jitters = NULL;
3552 cpl_frameset * used = NULL;
3554 enu_check_error_code(
"%s():%d: An error is already set: %s",
3555 cpl_func, __LINE__, cpl_error_get_where());
3557 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
3558 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
3563 cpl_msg_set_level_from_env();
3564 cpl_msg_severity severity = cpl_msg_get_level();
3565 cpl_msg_info(cpl_func,
"level %d", (
int) severity);
3569 return CPL_ERROR_BAD_FILE_FORMAT;
3572 const int ntags = 1;
3573 const char* required_tags[1] = {
3574 ERIS_NIX_PHOT_DATA_PRO_CATG
3578 cpl_ensure_code(CPL_ERROR_NONE ==
3579 eris_dfs_check_input_tags(frameset, required_tags, ntags, 1),
3580 CPL_ERROR_ILLEGAL_INPUT);
3582 const int ntags_opt = 3;
3583 const char* optional_tags[3] = {
3584 ERIS_NIX_CAL_WCS_MATCH_CATALOGUE_PRO_CATG,
3585 ERIS_NIX_CAL_WCS_REF_CATALOGUE_PRO_CATG,
3586 ERIS_NIX_CAL_WCS_CATALOGUE_PRO_CATG
3590 cpl_ensure_code(CPL_ERROR_NONE ==
3591 eris_dfs_check_input_tags(frameset, optional_tags, ntags_opt, 0),
3592 CPL_ERROR_ILLEGAL_INPUT);
3596 used = cpl_frameset_new();
3601 enu_check_error_code(
"Could not identify RAW and CALIB frames");
3606 ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG, used);
3607 enu_check_error_code(
"Failed to read object jitter data");
3609 ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG, used);
3610 enu_check_error_code(
"Failed to read STD jitter data");
3612 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) object_jitters->size,
3613 ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG);
3614 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) std_jitters->size,
3615 ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG);
3619 enu_check(object_jitters->size > 0 || std_jitters->size > 0,
3620 CPL_ERROR_DATA_NOT_FOUND,
"no input frames found");
3621 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
3622 CPL_ERROR_ILLEGAL_INPUT,
"SoF contains both "
3623 ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG
" and "
3624 ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG
" frames");
3628 const char * out_catg = NULL;
3629 if (object_jitters->size > 0) {
3630 jitters = object_jitters;
3631 out_catg = ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG;
3635 jitters = std_jitters;
3636 out_catg = ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG;
3638 object_jitters = NULL;
3647 ERIS_NIX_IMG_STD_COMBINED_PRO_CATG, used);
3648 enu_check_error_code(
"Failed to read external standard");
3649 if (standards->size > 0) {
3650 cpl_msg_info(cpl_func,
"%d "
3651 ERIS_NIX_IMG_STD_COMBINED_PRO_CATG
" frames read",
3652 (
int) standards->size);
3655 if (standards->size == 0) {
3660 int absolute_wcs = CPL_FALSE;
3662 for (cpl_size j = 0; j < jitters->size; j++) {
3664 const char * wcs_method;
3665 if (cpl_propertylist_has(jitters->limages[j]->plist,
"ESO WCS_METHOD")) {
3666 wcs_method = cpl_propertylist_get_string(
3667 jitters->limages[j]->plist,
3671 wcs_method = cpl_propertylist_get_string(
3672 jitters->limages[j]->plist,
3676 cpl_msg_info(cpl_func,
"jitter %d wcs_method: %s", (
int)j, wcs_method);
3677 if (!strcmp(wcs_method, ERIS_NIX_WCS_CATALOGUE_MATCH)) {
3678 absolute_wcs = CPL_TRUE;
3681 enu_check_error_code(
"failed to determine type of wcs calibration");
3687 eris_nix_img_cal_phot_internal(frameset,
3691 recipe_name, context);
3692 enu_check_error_code(
"error attempting internal photometric "
3696 for (cpl_size j = 0; j < jitters->size; j++) {
3700 cpl_msg_info(cpl_func,
"..astrometry calibration is not absolute");
3701 eris_nix_img_cal_phot_default(frameset,
3702 jitters->limages[j]);
3703 enu_check_error_code(
"error setting default photometric "
3708 eris_nix_img_cal_phot_save(jitters->limages[j],
3713 enu_check_error_code(
"failure writing result");
3717 }
else if (standards->size == 1){
3721 eris_nix_img_cal_phot_external(frameset,
3727 enu_check_error_code(
"error attempting external photometric "
3730 cpl_error_set_message(cpl_func, CPL_ERROR_INCOMPATIBLE_INPUT,
3732 ERIS_NIX_IMG_STD_COMBINED_PRO_CATG
3733 " file is allowed, found %d",
3734 (
int) standards->size);
3741 cpl_frameset_delete(used);
3743 return (
int) cpl_error_get_code();
3764 const cpl_parameterlist * parlist,
3765 const char* recipe_name,
3766 const char* context) {
3768 cpl_propertylist * applist = NULL;
3769 cpl_property * bunit = NULL;
3770 hdrl_parameter * cat_params = NULL;
3771 cpl_property * fluxcal_0 = NULL;
3772 const char * funcid =
"eris_nix_img_hdrl_stack";
3773 cpl_frame * inherit = NULL;
3774 located_imagelist * jitters = NULL;
3775 cpl_property * jitter_psf_fwhm = NULL;
3776 hdrl_parameter * method = NULL;
3777 located_imagelist * object_jitters = NULL;
3778 cpl_vector * obsid = NULL;
3779 hdrl_parameter * outgrid = NULL;
3780 char * photsys_0 = NULL;
3781 char * proto_copy = NULL;
3782 cpl_frameset * provenance = NULL;
3783 cpl_table * restable = NULL;
3784 hdrl_resample_result * result = NULL;
3785 cpl_image * stack_conf = NULL;
3786 cpl_propertylist * stack_header = NULL;
3787 hdrl_image * stack_himage = NULL;
3788 located_image * stacked = NULL;
3789 located_imagelist * std_jitters = NULL;
3790 cpl_propertylist * tablelist = NULL;
3791 cpl_wcs * template_wcs = NULL;
3792 cpl_frameset * used = NULL;
3793 cpl_property * zp_method_0 = NULL;
3794 const cpl_parameter * p = NULL;
3795 char * param_name = NULL;
3797 enu_check_error_code(
"%s():%d: An error is already set: %s",
3798 cpl_func, __LINE__, cpl_error_get_where());
3802 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
3803 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
3805 cpl_msg_set_level_from_env();
3809 return CPL_ERROR_BAD_FILE_FORMAT;
3814 param_name = cpl_sprintf(
"%s.interpolation_method", context);
3815 p = cpl_parameterlist_find_const(parlist, param_name);
3816 const char * interpolation_method = cpl_parameter_get_string(p);
3817 cpl_free(param_name);
3819 param_name = cpl_sprintf(
"%s.loop_distance", context);
3820 p = cpl_parameterlist_find_const(parlist, param_name);
3821 const int loop_distance = cpl_parameter_get_int(p);
3822 cpl_free(param_name);
3825 const cpl_boolean use_errorweights = CPL_FALSE;
3827 param_name = cpl_sprintf(
"%s.kernel_size", context);
3828 p = cpl_parameterlist_find_const(parlist, param_name);
3829 const int kernel_size = cpl_parameter_get_int(p);
3830 cpl_free(param_name);
3832 param_name = cpl_sprintf(
"%s.critical_radius", context);
3833 p = cpl_parameterlist_find_const(parlist, param_name);
3834 const double critical_radius = cpl_parameter_get_double(p);
3835 cpl_free(param_name);
3837 param_name = cpl_sprintf(
"%s.pix_frac_x", context);
3838 p = cpl_parameterlist_find_const(parlist, param_name);
3839 const double pix_frac_x = cpl_parameter_get_double(p);
3840 cpl_free(param_name);
3842 param_name = cpl_sprintf(
"%s.pix_frac_y", context);
3843 p = cpl_parameterlist_find_const(parlist, param_name);
3844 const double pix_frac_y = cpl_parameter_get_double(p);
3845 cpl_free(param_name);
3847 const double pix_frac_lambda = 100.0;
3849 enu_check_error_code(
"Could not retrieve input parameters");
3852 if (!strcmp(interpolation_method,
"nearest")) {
3854 }
else if (!strcmp(interpolation_method,
"linear")) {
3857 }
else if (!strcmp(interpolation_method,
"quadratic")) {
3860 }
else if (!strcmp(interpolation_method,
"renka")) {
3864 }
else if (!strcmp(interpolation_method,
"drizzle")) {
3870 }
else if (!strcmp(interpolation_method,
"lanczos")) {
3875 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
3876 "bad interpolation method: %s",
3877 interpolation_method);
3879 enu_check_error_code(
"Error constructing interpolation method");
3884 enu_check_error_code(
"Could not identify RAW and CALIB frames");
3888 used = cpl_frameset_new();
3890 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG, used);
3891 enu_check_error_code(
"Could not read %s frames",
3892 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG);
3893 cpl_msg_info(funcid,
"%d %s frames read", (
int) object_jitters->size,
3894 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG);
3896 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG, used);
3897 enu_check_error_code(
"Could not read %s frames",
3898 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG);
3899 cpl_msg_info(funcid,
"%d %s frames read", (
int) std_jitters->size,
3900 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG);
3904 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
3905 CPL_ERROR_ILLEGAL_INPUT,
3906 "SoF cannot contain data for both target and standard");
3907 enu_check(!(object_jitters->size == 0 && std_jitters->size == 0),
3908 CPL_ERROR_DATA_NOT_FOUND,
3909 "SoF contains no data");
3910 const char * out_catg = NULL;
3911 if(object_jitters->size > 0) {
3912 jitters = object_jitters;
3913 out_catg = ERIS_NIX_IMG_OBS_COMBINED_PRO_CATG;
3917 jitters = std_jitters;
3918 out_catg = ERIS_NIX_IMG_STD_COMBINED_PRO_CATG;
3920 object_jitters = NULL;
3928 for (cpl_size i = 0; i < jitters->size; i++) {
3929 diff[i] = cpl_propertylist_get_double(jitters->limages[i]->plist,
3932 float ra_centre = casu_med(diff, NULL, jitters->size);
3933 for (cpl_size i = 0; i < jitters->size; i++) {
3934 diff[i] = cpl_propertylist_get_double(jitters->limages[i]->plist,
3937 float dec_centre = casu_med(diff, NULL, jitters->size);
3938 cpl_msg_info(cpl_func,
"Jitter pattern centre at RA=%10.7f Dec=%10.7f",
3939 ra_centre, dec_centre);
3943 cpl_size jitter_ref = -1;
3944 double minr2 = 1.0e6;
3945 for (cpl_size i = 0; i < jitters->size; i++) {
3946 double ra = cpl_propertylist_get_double(jitters->limages[i]->plist,
3948 double dec = cpl_propertylist_get_double(jitters->limages[i]->plist,
3950 double r2 = pow(ra - ra_centre, 2) + pow(dec - dec_centre, 2);
3956 cpl_msg_info(cpl_func,
"Nearest jitter to centre is %d", (
int) jitter_ref);
3957 char * refname = cpl_strdup(cpl_frame_get_filename(jitters->
3958 limages[jitter_ref]->frame));
3959 cpl_msg_info(cpl_func,
"..filename %s", basename(refname));
3971 eris_nix_scired_get_split_param_int(parlist, context,
"edges-trim", 1, 1,
3972 sx, sy, &txmin, &tymin, &txmax, &tymax);
3974 cpl_msg_info(cpl_func,
"trim edge params: %lld %lld %lld %lld", txmin, tymin, txmax, tymax);
3975 cpl_image* image_edge = cpl_image_new(sx, sy, CPL_TYPE_INT);
3976 if(txmin > 1 && txmin < sx/2) {
3977 cpl_image_fill_window(image_edge,1, 1, txmin, sy, 1);
3980 if(txmax > 1 && txmax < sx/2) {
3981 cpl_image_fill_window(image_edge,sx - txmax, 1, sx, sy, 1);
3984 if(tymin > 1 && tymin < sy/2) {
3985 cpl_image_fill_window(image_edge,1, 1, sx, tymin, 1);
3988 if(tymax > 1 && tymax < sy/2) {
3989 cpl_image_fill_window(image_edge,1, sy - tymax, sx, sy, 1);
3991 cpl_mask* mask_edge = cpl_mask_threshold_image_create(image_edge,0.9, 1.1);
3992 cpl_image_delete(image_edge);
3993 cpl_mask_save(mask_edge,
"mask_edge.fits", NULL, CPL_IO_DEFAULT);
3996 for(cpl_size k = 0; k < jitters->size; k++) {
3998 cpl_image_reject_from_mask(jitters->limages[k]->confidence, mask_edge);
4004 cpl_mask_delete(mask_edge);
4014 cpl_size njitters = jitters->size;
4015 const char * proto = cpl_frame_get_filename((jitters->limages[0])->
4017 proto_copy = cpl_strdup(proto);
4019 inherit = cpl_frame_duplicate(jitters->limages[0]->frame);
4023 obsid = cpl_vector_new(jitters->size);
4024 cpl_vector_fill(obsid, -1.0);
4026 double total_exptime = 0.0;
4027 double mjd_start = 1000000.0;
4028 double mjd_end = 0.0;
4032 double cd1_1 = cpl_propertylist_get_double(jitters->limages[0]->plist,
4034 double cd2_1 = cpl_propertylist_get_double(jitters->limages[0]->plist,
4036 double pixsize = sqrt(cd1_1 * cd1_1 + cd2_1 * cd2_1) * 3600.0;
4037 cpl_msg_info(cpl_func,
"pixel scale: %6.4f arcsec", pixsize);
4038 template_wcs = cpl_wcs_new_from_propertylist(jitters->limages[0]->plist);
4039 enu_check_error_code(
"error set after loading template wcs");
4046 param_name = cpl_sprintf(
"%s.catalogue.det.effective-gain", context);
4047 p = cpl_parameterlist_find_const(parlist, param_name);
4048 double gain = cpl_parameter_get_double(p);
4049 cpl_free(param_name);
4051 if (cpl_propertylist_has(jitters->limages[0]->plist,
"ESO DARK GAIN")) {
4052 cpl_msg_info(cpl_func,
"reading detector gain from first jitter");
4053 gain = cpl_propertylist_get_double(jitters->limages[0]->plist,
4057 param_name = cpl_sprintf(
"%s.catalogue.det.saturation", context);
4058 p = cpl_parameterlist_find_const(parlist, param_name);
4059 double saturation = cpl_parameter_get_double(p);
4060 cpl_free(param_name);
4063 if (cpl_propertylist_has(jitters->limages[0]->plist,
4064 "ESO DETMON SATURATION")) {
4065 cpl_msg_info(cpl_func,
4066 "reading detector saturation level from first jitter");
4067 double saturation_adu = cpl_propertylist_get_double(
4068 jitters->limages[0]->plist,
4069 "ESO DETMON SATURATION");
4070 double dit =
enu_get_dit(jitters->limages[0]->plist);
4071 saturation = saturation_adu / dit;
4072 cpl_msg_info(cpl_func,
4073 "saturation(adu)=%5.3e dit=%5.3e saturation(adu/s)=%5.3e",
4074 saturation_adu, dit, saturation);
4078 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
4079 p = cpl_parameterlist_find_const(parlist, param_name);
4080 int minpixels = cpl_parameter_get_int(p);
4081 cpl_free(param_name);
4083 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
4084 p = cpl_parameterlist_find_const(parlist, param_name);
4085 double threshold = cpl_parameter_get_double(p);
4086 cpl_free(param_name);
4088 param_name = cpl_sprintf(
"%s.catalogue.obj.deblending", context);
4089 p = cpl_parameterlist_find_const(parlist, param_name);
4090 cpl_boolean deblending = cpl_parameter_get_bool(p);
4091 cpl_free(param_name);
4096 double core_radius = -1.0;
4100 jitters->limages[0]->plist,
4104 param_name = cpl_sprintf(
"%s.catalogue.bkg.estimate", context);
4105 p = cpl_parameterlist_find_const(parlist, param_name);
4106 cpl_boolean estimate = cpl_parameter_get_bool(p);
4107 cpl_free(param_name);
4109 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm",
4111 p = cpl_parameterlist_find_const(parlist, param_name);
4112 double smooth_gauss_fwhm = cpl_parameter_get_double(p);
4113 cpl_free(param_name);
4124 HDRL_CATALOGUE_ALL);
4125 enu_check_error_code(
"error set after setting catalogue params");
4127 cpl_msg_info(cpl_func,
"gain=%4.2f saturation=%6.2f", gain, saturation);
4129 provenance = cpl_frameset_new();
4131 cpl_msg_info(cpl_func,
"assembling information on combined exposures");
4133 for (cpl_size j = 0; j < jitters->size; j++) {
4138 cpl_frameset_insert(provenance, cpl_frame_duplicate(
4139 jitters->limages[j]->frame));
4145 bunit = cpl_property_duplicate(cpl_propertylist_get_property(
4146 jitters->limages[j]->plist,
4150 if (!jitter_psf_fwhm) {
4151 jitter_psf_fwhm = cpl_property_duplicate(
4152 cpl_propertylist_get_property(
4153 jitters->limages[j]->plist,
4163 double dit =
enu_get_dit(jitters->limages[j]->plist);
4164 double exptime = dit * cpl_propertylist_get_int(
4165 jitters->limages[j]->plist,
"ESO DET NDIT");
4166 total_exptime += exptime;
4170 double jitter_start = cpl_propertylist_get_double(
4171 jitters->limages[j]->plist,
"MJD-OBS");
4172 if (jitter_start < mjd_start) {
4173 mjd_start = jitter_start;
4175 double jitter_end = cpl_propertylist_get_double(
4176 jitters->limages[j]->plist,
"MJD-END");
4177 if (jitter_end > mjd_end) {
4178 mjd_end = jitter_end;
4180 cpl_msg_info(cpl_func,
"..combined mjd start: %15.8f end: %15.8f",
4181 mjd_start, mjd_end);
4185 int obs_id = cpl_propertylist_get_int(jitters->limages[j]->plist,
4187 for (cpl_size jj = 0; jj < cpl_vector_get_size(obsid); jj++) {
4188 if ((
int) cpl_vector_get(obsid, jj) == obs_id) {
4190 }
else if (cpl_vector_get(obsid, jj) < 0.0) {
4191 cpl_vector_set(obsid, jj, obs_id);
4202 double photzp_0 = 0.0;
4203 double photzper_0 = 0.0;
4204 double extcoef_0 = 0.0;
4206 cpl_msg_info(cpl_func,
"stacking image data");
4209 for (cpl_size j = 0; j < jitters->size; j++) {
4210 cpl_msg_info(cpl_func,
"ingesting jitter %d", (
int)j);
4214 const cpl_property * fluxcal_j = cpl_propertylist_get_property(
4215 jitters->limages[j]->plist,
"FLUXCAL");
4216 const char * photsys_j = cpl_propertylist_get_string(
4217 jitters->limages[j]->plist,
"PHOTSYS");
4218 const cpl_property * zp_method_j = cpl_propertylist_get_property(
4219 jitters->limages[j]->plist,
4221 double photzp_j = cpl_propertylist_get_double(
4222 jitters->limages[j]->plist,
"PHOTZP");
4223 double photzper_j = cpl_propertylist_get_double(
4224 jitters->limages[j]->plist,
"PHOTZPER");
4225 double extcoef_j = cpl_propertylist_get_double(
4226 jitters->limages[j]->plist,
4229 cpl_msg_info(cpl_func,
"..fluxcal: %s",
4230 cpl_property_get_string(fluxcal_j));
4231 cpl_msg_info(cpl_func,
"..photsys: %s", photsys_j);
4232 cpl_msg_info(cpl_func,
"..extcoef: %f", extcoef_j);
4233 cpl_msg_info(cpl_func,
"..zp_method: %s",
4234 cpl_property_get_string(zp_method_j));
4235 cpl_msg_info(cpl_func,
"..photzp: %f photzper: %f", photzp_j,
4239 photzp_0 = photzp_j;
4240 photzper_0 = photzper_j;
4241 fluxcal_0 = cpl_property_duplicate(fluxcal_j);
4242 photsys_0 = cpl_strdup(photsys_j);
4243 zp_method_0 = cpl_property_duplicate(zp_method_j);
4244 extcoef_0 = extcoef_j;
4247 if (!strcmp(cpl_property_get_string(fluxcal_j),
"CALIBRATED")) {
4248 cpl_msg_warning(cpl_func,
"jitter is not calbrated");
4250 if (strcmp(photsys_j,
"VEGA")) {
4251 cpl_msg_warning(cpl_func,
"PHOTSYS is not recognized");
4253 if (extcoef_j != extcoef_0) {
4254 cpl_msg_warning(cpl_func,
4255 "..inconsistent extcoef: %d %5.3e %5.3e",
4256 (
int) j, extcoef_0, extcoef_j);
4265 double factor = pow(10.0, (photzp_0 - photzp_j) / 2.5);
4266 cpl_msg_info(cpl_func,
"..scaling jitter %d by %5.3e", (
int)j,
4269 (hdrl_value){factor, 0.0});
4300 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
4301 jitters->limages[j]->plist);
4303 jitters->limages[j]->himage,
4305 cpl_wcs_delete(wcs);
4307 if (restable == NULL) {
4308 restable = jitter_table;
4310 cpl_size nrow = cpl_table_get_nrow(restable);
4311 cpl_table_insert(restable, jitter_table, nrow+1);
4312 cpl_table_delete(jitter_table);
4316 enu_check_error_code(
"error set after loading jitters");
4321 object_jitters = std_jitters = NULL;
4325 cpl_msg_info(cpl_func,
"calling hdrl_resample_compute");
4331 cpl_table_delete(restable); restable = NULL;
4332 enu_check_error_code(
"error set computing resample_compute");
4339 result->himlist, 0));
4340 stack_header = cpl_propertylist_duplicate(result->header);
4344 cpl_msg_info(cpl_func,
"stacking the confidence");
4349 cpl_frameset * ignore = cpl_frameset_new();
4351 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG,
4354 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG,
4356 if(object_jitters->size > 0) {
4357 jitters = object_jitters;
4360 jitters = std_jitters;
4366 for (cpl_size j = 0; j < jitters->size; j++) {
4367 cpl_msg_info(cpl_func,
"ingesting jitter %d", (
int)j);
4369 double photzp_j = cpl_propertylist_get_double(
4370 jitters->limages[j]->plist,
"PHOTZP");
4372 double factor = pow(10.0, (photzp_0 - photzp_j) / 2.5);
4373 cpl_msg_info(cpl_func,
"..scaling by %5.3e", factor);
4375 (hdrl_value){factor, 0.0});
4381 cpl_image * inverse_conf = cpl_image_duplicate(
4382 jitters->limages[j]->confidence);
4383 double * ic_data = cpl_image_get_data_double(inverse_conf);
4384 const cpl_size nx = cpl_image_get_size_x(inverse_conf);
4385 const cpl_size ny = cpl_image_get_size_y(inverse_conf);
4386 for (cpl_size i=0; i<nx*ny; i++) {
4387 if (ic_data[i] > 0.0) {
4388 ic_data[i] = sqrt(1.0 / ic_data[i]);
4393 jitters->limages[j]->himage),
4395 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
4396 jitters->limages[j]->plist);
4400 cpl_wcs_delete(wcs);
4401 cpl_image_delete(inverse_conf);
4404 if (restable == NULL) {
4405 restable = jitter_table;
4407 cpl_size nrow = cpl_table_get_nrow(restable);
4408 cpl_table_insert(restable, jitter_table, nrow+1);
4409 cpl_table_delete(jitter_table);
4414 object_jitters = std_jitters = NULL;
4415 enu_check_error_code(
"error set after loading error image of jitters");
4417 cpl_msg_info(cpl_func,
"calling hdrl_resample_compute");
4419 cpl_table_delete(restable); restable = NULL;
4420 enu_check_error_code(
"error after resample_compute of image confidence");
4425 stack_conf = cpl_image_duplicate(
4428 result->himlist, 0)));
4429 cpl_image * sc_copy = cpl_image_duplicate(stack_conf);
4430 cpl_image_divide(stack_conf, sc_copy);
4431 cpl_image_divide(stack_conf, sc_copy);
4432 cpl_image_divide(stack_conf, sc_copy);
4433 cpl_image_delete(sc_copy);
4454 enu_check_error_code(
"error set after image stacking");
4458 cpl_wcs * result_wcs = cpl_wcs_new_from_propertylist(stacked->plist);
4460 stacked->confidence,
4463 cpl_wcs_delete(result_wcs);
4464 enu_check_error_code(
"error in target reduction: catalogue");
4468 applist = cpl_propertylist_new();
4472 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, out_catg);
4473 cpl_propertylist_update_string(applist,
"PRODCATG",
"SCIENCE.IMAGE");
4474 cpl_propertylist_update_string(applist,
"BUNIT", cpl_property_get_string(bunit));
4475 cpl_propertylist_set_comment(applist,
"BUNIT", cpl_property_get_comment(bunit));
4476 cpl_propertylist_update_int(applist,
"NCOMBINE", ncombine);
4477 cpl_propertylist_update_double(applist,
"TEXPTIME", total_exptime);
4478 cpl_propertylist_update_double(applist,
"EXPTIME", total_exptime);
4479 cpl_propertylist_update_double(applist,
"MJD-OBS", mjd_start);
4480 cpl_propertylist_update_double(applist,
"MJD-END", mjd_end);
4481 for (cpl_size j = 0; j < njitters; ++j) {
4482 if (cpl_vector_get(obsid, j) > 0.0) {
4483 char * pname = cpl_sprintf(
"OBID%.0i", (
int)(j+1));
4484 cpl_propertylist_update_int(applist, pname,
4485 (
int)cpl_vector_get(obsid, j));
4492 cpl_propertylist_update_string(applist,
"PHOTSYS", photsys_0);
4493 cpl_propertylist_update_double(applist,
"PHOTZP", photzp_0);
4494 cpl_propertylist_set_comment(applist,
"PHOTZP",
4495 "MAG=-2.5*log(data)+PHOTZP+APCOR");
4496 cpl_propertylist_update_string(applist,
"FLUXCAL",
4497 cpl_property_get_string(fluxcal_0));
4498 cpl_propertylist_set_comment(applist,
"FLUXCAL",
4499 cpl_property_get_comment(fluxcal_0));
4500 cpl_propertylist_update_double(applist,
"PHOTZPER", photzper_0);
4501 cpl_propertylist_update_string(applist,
"ZPMETHOD",
4502 cpl_property_get_string(zp_method_0));
4503 cpl_propertylist_set_comment(applist,
"ZPMETHOD",
4504 cpl_property_get_comment(zp_method_0));
4505 cpl_propertylist_update_double(applist,
"ESO DRS EXTCOEF", extcoef_0);
4506 cpl_propertylist_set_comment(applist,
"ESO DRS EXTCOEF",
4507 "[mag] Assumed extinction coefficient");
4512 double fwhm_pix = -1.0;
4513 if (stacked->objects &&
4514 stacked->objects->qclist &&
4515 cpl_propertylist_has(stacked->objects->qclist,
"ESO QC IMAGE_SIZE")) {
4517 fwhm_pix = cpl_propertylist_get_double(stacked->objects->qclist,
4518 "ESO QC IMAGE_SIZE");
4521 if (fwhm_pix != -1.0) {
4522 cpl_propertylist_update_double(applist,
"PSF_FWHM",
4523 fwhm_pix * pixsize);
4524 cpl_propertylist_set_comment(applist,
"PSF_FWHM",
4525 "Average FWHM of stellar objects[arcsec]");
4527 cpl_propertylist_update_double(applist,
"PSF_FWHM",
4528 cpl_property_get_double(jitter_psf_fwhm));
4529 cpl_propertylist_set_comment(applist,
"PSF_FWHM",
4530 cpl_property_get_comment(jitter_psf_fwhm));
4531 fwhm_pix = cpl_property_get_double(jitter_psf_fwhm) / pixsize;
4534 double abmaglim = -1.0;
4536 cpl_propertylist_update_double(applist,
"ABMAGLIM", abmaglim);
4537 cpl_propertylist_set_comment(applist,
"ABMAGLIM",
"5-sigma "
4538 "limiting AB magnitude");
4543 double mean_sky = 0.0;
4544 if (cpl_propertylist_has(stacked->objects->qclist,
"ESO QC MEAN_SKY")) {
4545 mean_sky = cpl_propertylist_get_double(stacked->objects->qclist,
4548 cpl_msg_warning(cpl_func,
"ESO QC MEAN_SKY not found, mean "
4551 double exptime = 1.0;
4552 double abmagsat = -1.0;
4553 if ((CPL_MATH_PI_4 * CPL_MATH_LN2 * (saturation - mean_sky) *
4554 pow(fwhm_pix, 2.0) / exptime) > 0.0) {
4555 abmagsat = photzp_0 - 2.5 * log10(CPL_MATH_PI_4 * CPL_MATH_LN2 *
4556 (saturation - mean_sky) * pow(fwhm_pix, 2.0) / exptime);
4558 cpl_msg_debug(cpl_func,
"abmagsat stack %5.3e %5.3e %5.3e %5.3e %5.3e",
4559 photzp_0, saturation, mean_sky, fwhm_pix, exptime);
4560 cpl_propertylist_update_double(applist,
"ABMAGSAT", abmagsat);
4561 cpl_propertylist_set_comment(applist,
"ABMAGSAT",
"Saturation "
4562 "limit for point sources (AB mag)");
4568 cpl_wcs * stack_wcs = cpl_wcs_new_from_propertylist(stacked->plist);
4573 cpl_propertylist_update_double(applist,
"RA", ra);
4574 cpl_propertylist_update_double(applist,
"DEC", dec);
4576 cpl_wcs_delete(stack_wcs);
4578 enu_check_error_code(
"error set after setting header keywords");
4592 PACKAGE
"/" PACKAGE_VERSION,
4597 cpl_frame * stack_frame = cpl_frame_new();
4598 cpl_frame_set_filename(stack_frame, stack_fname);
4599 cpl_frame_set_tag(stack_frame, ERIS_NIX_IMG_CATALOGUE_PRO_CATG);
4600 cpl_frame_set_type(stack_frame, CPL_FRAME_TYPE_ANY);
4601 cpl_frame_set_group(stack_frame, CPL_FRAME_GROUP_PRODUCT);
4602 cpl_frame_set_level(stack_frame, CPL_FRAME_LEVEL_FINAL);
4603 cpl_frameset_insert(used, stack_frame);
4604 cpl_free(stack_fname);
4609 tablelist = cpl_propertylist_duplicate(stacked->objects->qclist);
4610 cpl_propertylist_copy_property_regexp(tablelist,
4612 "ABMAGLIM|ABMAGSAT|PSF_FWHM|PHOTSYS|"
4618 stacked->objects->catalogue,
4620 "image source catalogue",
4622 PACKAGE
"/" PACKAGE_VERSION,
4624 ERIS_NIX_IMG_CATALOGUE_PRO_CATG);
4629 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
4638 PACKAGE
"/" PACKAGE_VERSION,
4639 "stack_cat_debug.fits");
4643 cpl_propertylist_delete(applist);
4644 cpl_property_delete(bunit);
4646 cpl_property_delete(fluxcal_0);
4647 cpl_frame_delete(inherit);
4648 cpl_property_delete(jitter_psf_fwhm);
4651 cpl_vector_delete(obsid);
4653 cpl_free(photsys_0);
4654 cpl_free(proto_copy);
4655 cpl_frameset_delete(provenance);
4656 cpl_table_delete(restable);
4660 cpl_propertylist_delete(tablelist);
4661 cpl_wcs_delete(template_wcs);
4662 cpl_frameset_delete(used);
4663 cpl_property_delete(zp_method_0);
4665 return (
int)cpl_error_get_code();
cpl_error_code encu_limlist_to_casu_fits(located_imagelist *limlist, casu_fits ***indata, casu_fits ***inconf, casu_fits ***invar)
Translate a located_imagelist to arrays of casu_fits structs.
cpl_error_code enu_dfs_save_limage(cpl_frameset *allframes, const cpl_parameterlist *parlist, const cpl_frameset *provenance, const cpl_boolean prov_raw, const located_image *limage, const char *recipe, const cpl_frame *inherit, cpl_propertylist *applist, const char *pipe_id, const char *filename)
Save a located image structure to a MEF.
cpl_error_code eris_nix_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
cpl_error_code enu_dfs_save_catalogue(cpl_frameset *frameset, cpl_frame *image, const cpl_parameterlist *parlist, const cpl_table *catalogue, const cpl_propertylist *tablelist, const char *cat_name, const char *recipe, const char *pipe_id, const char *preface, const char *procat)
Save a catalogue as DFS product.
void en_master_bpm_delete(master_bpm *target)
Delete a 'master_bpm' struct.
master_dark * en_master_dark_load_from_frameset(const cpl_frameset *frameset, const char *tag, cpl_frameset *used)
Load a 'master_dark' struct from a frameset.
void en_master_dark_delete(master_dark *target)
Delete a 'master_dark' struct.
cpl_error_code enm_associate_std(cpl_table *objtab, cpl_table *stdtab, const float assoc, const int strict_classification, cpl_table **associated_std)
Associate image catalogue objects with standards.
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.
void enu_located_imagelist_delete(located_imagelist *limlist)
Delete a located_imagelist and its contents.
located_image * enu_load_limage_from_frame(const cpl_frame *frame, cpl_image **pcopyconf, const cpl_boolean collapse_cube)
Load components of a located_image from a frame.
located_imagelist * enu_located_imagelist_duplicate(const located_imagelist *limlist)
Make a deep copy of a located_imagelist and its contents.
cpl_error_code enu_calc_maglim(const located_image *limage, const double photzp, const double fwhm_pix, double *abmaglim)
Calculate magnitude limit of image.
cpl_error_code enu_get_ra_dec(const cpl_wcs *wcs, double *ra, double *dec)
Get RA and Dec at centre of image with given wcs.
cpl_error_code enu_basic_calibrate(located_image *limage, const int read_offsets, const cpl_table *refine_wcs, const master_dark *mdark, const gain_linearity *gain_lin, const master_flat *flatfield_1, const master_flat *flatfield_2, const master_bpm *mbad_pix_map, const int flag_mask, const char *fill_rejected, const double fill_value, const cpl_size x_probe, const cpl_size y_probe)
Do basic calibration of located_image (single or cube)
cpl_error_code enu_catalogue_limlist(located_imagelist *limlist, hdrl_parameter *params)
Calculate object catalogues for a list of images.
cpl_error_code enu_sky_subtract_limlist(const char *method, const char *select_method, const double timerange, const located_imagelist *sky_data, const cpl_size x_probe, const cpl_size y_probe, located_imagelist *target_data)
Estimate and subtract sky backgrounds for a list of target images.
cpl_error_code enu_debug_limlist_save(const int debug, const located_imagelist *limlist, const char *nameroot, const char *recipename, cpl_frameset *frameset, const cpl_parameterlist *parlist, const cpl_frameset *used)
Save a list of intermediate image results for use in debugging.
located_image * enu_located_image_new(hdrl_image *himage, hdrl_imagelist *himagelist, cpl_image *confidence, hdrl_image *bkg, cpl_image *bkg_confidence, cpl_propertylist *plist, hdrl_catalogue_result *objects, cpl_mask *object_mask, hdrl_catalogue_result *wcs, hdrl_catalogue_result *photom, cpl_frame *frame)
Create a located_image structure and initialise the contents.
double enu_get_airmass(const cpl_propertylist *plist)
Get the mean airmass of an observation.
cpl_error_code enu_calc_pixel_coords(cpl_table *catalogue, const cpl_propertylist *wcs_plist)
Calculate predicted positions of catalogue objects for given wcs.
located_imagelist * enu_limlist_load_from_frameset(cpl_frameset *frameset, const char *tag, cpl_frameset *used)
Load tagged data from a frameset into a located_imagelist.
void enu_located_image_delete(located_image *limage)
Delete a located_image and its contents.
cpl_error_code enu_normalise_confidence(cpl_image *confidence)
Normalise confidence array so that mean of good pixels is 100.
cpl_error_code enu_correct_wcs(const cpl_table *refcat, const char *wcs_method, const char *catalogue, located_image *limage, const double match_rad, cpl_table **matched_stds, cpl_matrix **xy_shift)
Correct the wcs of an image.
char * enu_repreface(const char *filename, const char *preface)
Preface a raw filename with a string.
const char * enu_get_filter(const cpl_propertylist *plist)
Get the filter used in an observation.
cpl_error_code enu_get_rcore_and_mesh_size(const char *context, const cpl_parameterlist *parlist, const cpl_propertylist *plist, double *obj_core_radius, int *bkg_mesh_size)
Get catalogue core-radius and mesh-size appropriate to AO mode.
hdrl_catalogue_result * enu_catalogue_compute(const hdrl_image *himage, const cpl_image *confidence, const cpl_wcs *wcs, hdrl_parameter *params)
Wrapper for hdrl_catalogue_compute.
cpl_error_code enu_opm_limlist(const int obj_min_pixels, const double obj_threshold, const int bkg_mesh_size, const double bkg_smooth_fwhm, located_imagelist *limlist)
Calculate object masks for images in a located_imagelist.
double enu_get_dit(const cpl_propertylist *plist)
Get the DIT of an integration.
cpl_error_code eris_files_dont_exist(cpl_frameset *frameset)
Check if all SOF files exist.
cpl_error_code eris_check_error_code(const char *func_id)
handle CPL errors
void hdrl_catalogue_result_delete(hdrl_catalogue_result *result)
delete hdrl parameter result object
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.
cpl_error_code hdrl_image_reject_from_mask(hdrl_image *self, const cpl_mask *map)
set bpm of hdrl_image
cpl_error_code hdrl_image_mul_scalar(hdrl_image *self, hdrl_value value)
Elementwise multiplication of an image with a scalar.
hdrl_image * hdrl_image_duplicate(const hdrl_image *himg)
copy hdrl_image
cpl_image * hdrl_image_get_error(hdrl_image *himg)
get error as cpl image
cpl_size hdrl_image_get_size_y(const hdrl_image *self)
return size of Y dimension of image
cpl_size hdrl_image_get_size_x(const hdrl_image *self)
return size of X dimension of image
hdrl_image * hdrl_image_create(const cpl_image *image, const cpl_image *error)
create a new hdrl_image from to existing images by copying them
cpl_image * hdrl_image_get_image(hdrl_image *himg)
get data as cpl image
void hdrl_image_delete(hdrl_image *himg)
delete hdrl_image
hdrl_image * hdrl_imagelist_get(const hdrl_imagelist *himlist, cpl_size inum)
Get an image from a list of images.
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter
hdrl_parameter * hdrl_resample_parameter_create_nearest(void)
Creates a resample nearest neighbor hdrl parameter object. The algorithm does not use any weighting f...
hdrl_parameter * hdrl_resample_parameter_create_renka(const int loop_distance, cpl_boolean use_errorweights, const double critical_radius)
Creates a resample renka hdrl parameter object. The algorithm uses a modified Shepard-like distance w...
hdrl_parameter * hdrl_resample_parameter_create_lanczos(const int loop_distance, cpl_boolean use_errorweights, const int kernel_size)
Creates a resample Lanczos hdrl parameter object. The algorithm uses a restricted SINC distance weigh...
hdrl_parameter * hdrl_resample_parameter_create_drizzle(const int loop_distance, cpl_boolean use_errorweights, const double pix_frac_x, const double pix_frac_y, const double pix_frac_lambda)
Creates a resample drizzle hdrl parameter object. The algorithm uses a drizzle-like distance weightin...
hdrl_parameter * hdrl_resample_parameter_create_quadratic(const int loop_distance, cpl_boolean use_errorweights)
Creates a resample quadratic hdrl parameter object. The algorithm uses a quadratic inverse distance w...
hdrl_parameter * hdrl_resample_parameter_create_linear(const int loop_distance, cpl_boolean use_errorweights)
Creates a resample linear hdrl parameter object. The algorithm uses a linear inverse distance weighti...
hdrl_parameter * hdrl_resample_parameter_create_outgrid2D(const double delta_ra, const double delta_dec)
Creates a resample_outgrid hdrl parameter object for a 2 dimensional interpolation,...
hdrl_resample_result * hdrl_resample_compute(const cpl_table *ResTable, hdrl_parameter *method, hdrl_parameter *outputgrid, const cpl_wcs *wcs)
High level resampling function.
void hdrl_resample_result_delete(hdrl_resample_result *aCube)
Deallocates the memory associated to a hdrl_resample_result object.
cpl_table * hdrl_resample_image_to_table(const hdrl_image *hima, const cpl_wcs *wcs)
Convert a hdrl image into a cpl table that can be given as input to hdrl_resample_compute()