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);
420 return cpl_error_get_code();
434static cpl_error_code eris_nix_cal_det_save(
435 located_image * limage,
436 const char * procatg,
437 cpl_frameset * frameset,
438 const cpl_parameterlist * parlist,
439 const cpl_frameset * calib_frames,
440 const char* recipe_name) {
444 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
445 cpl_ensure_code(limage, CPL_ERROR_NONE);
446 cpl_ensure_code(procatg, CPL_ERROR_NULL_INPUT);
447 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
448 cpl_ensure_code(calib_frames, CPL_ERROR_NULL_INPUT);
453 cpl_frameset * provenance = cpl_frameset_new();
454 cpl_frameset_insert(provenance, cpl_frame_duplicate(limage->frame));
458 cpl_propertylist * applist = cpl_propertylist_new();
459 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, procatg);
460 cpl_propertylist_copy_property(applist, limage->plist,
"BUNIT");
461 cpl_propertylist_update_int(applist,
"NCOMBINE", 1);
463 int ndit = cpl_propertylist_get_int(limage->plist,
"ESO DET NDIT");
464 cpl_propertylist_update_double(applist,
"TEXPTIME", ndit * dit);
467 cpl_propertylist_update_double(applist,
"EXPTIME", ndit * dit);
468 double mjd_obs = cpl_propertylist_get_double(limage->plist,
"MJD-OBS");
469 double mjd_end = mjd_obs + (ndit * dit) / (3600.0 * 24.0);
470 cpl_propertylist_update_double(applist,
"MJD-END", mjd_end);
471 if(cpl_propertylist_has(limage->plist,
"PSF_FWHM")) {
472 cpl_propertylist_copy_property(applist, limage->plist,
"PSF_FWHM");
474 cpl_propertylist_copy_property(applist, limage->plist,
475 "ESO DETMON SATURATION");
476 cpl_propertylist_copy_property(applist, limage->plist,
478 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
483 int naxis = cpl_propertylist_get_int(limage->plist,
"NAXIS");
486 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(limage->plist);
491 cpl_propertylist_update_double(applist,
"RA", ra);
492 cpl_propertylist_update_double(applist,
"DEC", dec);
499 char * out_fname =
enu_repreface(cpl_frame_get_filename(limage->frame),
512 PACKAGE
"/" PACKAGE_VERSION,
516 cpl_frameset_delete(provenance);
517 cpl_propertylist_delete(applist);
518 return cpl_error_get_code();
523eris_nix_update_pupil_pro_catg(
const char* pro_catg, located_image * limage)
525 char* new_pro_catg=NULL;
527 const char* nxpw = NULL;
528 if(cpl_propertylist_has(limage->plist,
"ESO INS2 NXPW NAME")) {
529 nxpw = cpl_propertylist_get_string(limage->plist,
"ESO INS2 NXPW NAME");
532 if(strcmp(nxpw,
"Open1") == 0){
533 suffix = cpl_sprintf(
"OPEN");
534 }
else if (strcmp(nxpw,
"JHK-pupil") == 0){
535 suffix = cpl_sprintf(
"JHK");
536 }
else if (strcmp(nxpw,
"Crosshairs") == 0){
537 suffix = cpl_sprintf(
"CROSS");
538 }
else if (strcmp(nxpw,
"APP") == 0){
539 suffix = cpl_sprintf(
"APP");
540 }
else if (strcmp(nxpw,
"LM-pupil") == 0){
541 suffix = cpl_sprintf(
"LM");
542 }
else if (strcmp(nxpw,
"Lyot") == 0){
543 suffix = cpl_sprintf(
"LYOT");
544 }
else if (strcmp(nxpw,
"Lyot-ND") == 0){
545 suffix = cpl_sprintf(
"LYOTND");
546 }
else if (strstr(nxpw,
"SAM")){
547 suffix = cpl_sprintf(
"SAM");
548 }
else if (strstr(nxpw,
"Spider")){
549 suffix = cpl_sprintf(
"SPIDER");
551 cpl_msg_warning(cpl_func,
"%s",nxpw);
552 suffix = cpl_sprintf(
"NOT_SUPPORTED");
555 if(strcmp(nxpw,
"Open1") == 0 || strcmp(nxpw,
"ND") == 0) {
556 new_pro_catg = cpl_sprintf(
"%s_%s", pro_catg, suffix);
558 new_pro_catg = cpl_sprintf(
"%s_%s", pro_catg, suffix);
582 const cpl_parameterlist * parlist,
583 const char* recipe_name,
584 const char* context) {
586 cpl_frameset * base_frames = NULL;
587 gain_linearity * gain_lin = NULL;
588 located_image * limage = NULL;
589 master_bpm * master_bpm_used = NULL;
590 master_bpm * master_bpm_lamp = NULL;
591 master_bpm * master_bpm_sky = NULL;
592 master_dark * master_drk = NULL;
593 master_flat * master_flat_hifreq = NULL;
594 master_flat * master_flat_lofreq = NULL;
595 const cpl_parameter * p = NULL;
596 char * param_name = NULL;
597 cpl_table * refine_wcs = NULL;
598 cpl_image * copyconf = NULL;
600 enu_check_error_code(
"%s():%d: An error is already set: %s",
601 cpl_func, __LINE__, cpl_error_get_where());
605 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
606 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
611 return CPL_ERROR_BAD_FILE_FORMAT;
614 cpl_msg_set_level_from_env();
617 const int nfile_tags = 4;
618 const char* required_tags[4] = {ERIS_NIX_NL_BPM_PRO_CATG,
619 ERIS_NIX_COEFFS_CUBE_PRO_CATG,
620 ERIS_NIX_GAIN_PRO_CATG,
622 ERIS_NIX_MASTER_DARK_IMG_PRO_CATG
630 cpl_ensure_code(CPL_ERROR_NONE ==
631 eris_dfs_check_input_tags(frameset, required_tags, nfile_tags, 1),
632 CPL_ERROR_ILLEGAL_INPUT);
636 param_name = cpl_sprintf(
"%s.fill-rejected", context);
637 p = cpl_parameterlist_find_const(parlist, param_name);
638 const char * fill_rejected = cpl_parameter_get_string(p);
639 cpl_free(param_name);
641 param_name = cpl_sprintf(
"%s.fill-value", context);
642 p = cpl_parameterlist_find_const(parlist, param_name);
643 const double fill_value = cpl_parameter_get_double(p);
644 cpl_free(param_name);
646 param_name = cpl_sprintf(
"%s.cd_matrix_modify", context);
647 p = cpl_parameterlist_find_const(parlist, param_name);
648 const int cd_matrix_modify = cpl_parameter_get_bool(p);
649 cpl_free(param_name);
651 param_name = cpl_sprintf(
"%s.x_probe", context);
652 p = cpl_parameterlist_find_const(parlist, param_name);
653 cpl_size x_probe = (cpl_size) cpl_parameter_get_int(p);
654 cpl_free(param_name);
656 param_name = cpl_sprintf(
"%s.y_probe", context);
657 p = cpl_parameterlist_find_const(parlist, param_name);
658 cpl_size y_probe = (cpl_size) cpl_parameter_get_int(p);
659 cpl_free(param_name);
661 param_name = cpl_sprintf(
"%s.collapse_cube", context);
662 p = cpl_parameterlist_find_const(parlist, param_name);
663 cpl_size collapse_cube = (cpl_size) cpl_parameter_get_int(p);
664 cpl_free(param_name);
666 enu_check_error_code(
"Could not retrieve input parameters");
671 enu_check_error_code(
"Could not identify RAW and CALIB frames");
673 base_frames = cpl_frameset_new();
680 int required = CPL_TRUE;
681 gain_lin = engl_gain_linearity_load_from_frameset(frameset,
682 ERIS_NIX_GAIN_PRO_CATG, ERIS_NIX_COEFFS_CUBE_PRO_CATG,
683 ERIS_NIX_NL_BPM_PRO_CATG, required, base_frames);
684 enu_check_error_code(
"failed to read gain/linearity information from SoF");
689 ERIS_NIX_MASTER_DARK_IMG_PRO_CATG, base_frames);
690 enu_check_error_code(
"failed to read master dark from SoF");
696 master_bpm_lamp = en_master_bpm_load_from_frameset(frameset,
697 ERIS_NIX_MASTER_BPM_LAMP_PRO_CATG,
698 base_frames, CPL_FALSE);
699 if (!master_bpm_lamp) {
700 master_bpm_sky = en_master_bpm_load_from_frameset(frameset,
701 ERIS_NIX_MASTER_BPM_SKY_PRO_CATG, base_frames,
705 enu_check_error_code(
"failed to read master BPM from SoF");
706 enu_check(master_bpm_lamp || master_bpm_sky, CPL_ERROR_ILLEGAL_INPUT,
707 "SoF contains neither lamp nor sky BPM");
708 enu_check(!(master_bpm_lamp && master_bpm_sky), CPL_ERROR_ILLEGAL_INPUT,
709 "SoF contains both lamp and sky BPM");
710 if (master_bpm_lamp) {
711 cpl_msg_info(cpl_func,
"lamp bpm read");
712 master_bpm_used = master_bpm_lamp;
714 if (master_bpm_sky) {
715 cpl_msg_info(cpl_func,
"sky bpm read");
716 master_bpm_used = master_bpm_sky;
721 if (master_bpm_lamp) {
722 master_flat_hifreq = en_master_flat_load_from_frameset(frameset,
723 ERIS_NIX_MASTER_FLAT_LAMP_HIFREQ_PRO_CATG,
724 base_frames, CPL_FALSE);
725 if (master_flat_hifreq) {
726 cpl_msg_info(cpl_func,
"lamp hifreq flat read");
729 master_flat_hifreq = en_master_flat_load_from_frameset(frameset,
730 ERIS_NIX_MASTER_FLAT_SKY_HIFREQ_PRO_CATG,
731 base_frames, CPL_FALSE);
732 if (master_flat_hifreq) {
733 cpl_msg_info(cpl_func,
"sky hifreq flat read");
737 if (master_bpm_lamp) {
740 master_flat_lofreq = en_master_flat_load_from_frameset(frameset,
741 ERIS_NIX_MASTER_FLAT_TWILIGHT_LOFREQ_PRO_CATG,
742 base_frames, CPL_FALSE);
743 if(master_flat_lofreq) {
744 cpl_msg_info(cpl_func,
"twilight lofreq flat read");
746 master_flat_lofreq = en_master_flat_load_from_frameset(frameset,
747 ERIS_NIX_MASTER_FLAT_LAMP_LOFREQ_PRO_CATG,
748 base_frames, CPL_FALSE);
749 if(master_flat_lofreq) {
750 cpl_msg_info(cpl_func,
"lamp lofreq flat read");
754 if (master_bpm_sky) {
755 master_flat_lofreq = en_master_flat_load_from_frameset(frameset,
756 ERIS_NIX_MASTER_FLAT_SKY_LOFREQ_PRO_CATG,
757 base_frames, CPL_FALSE);
758 if(master_flat_lofreq) {
759 cpl_msg_info(cpl_func,
"sky lofreq flat read");
765 if (cd_matrix_modify) {
766 const cpl_frame * target_frame = cpl_frameset_find_const(
768 ERIS_NIX_WCS_REFINE_PRO_CATG);
769 enu_check(target_frame != NULL, CPL_ERROR_DATA_NOT_FOUND,
770 "SoF has no file tagged %s", ERIS_NIX_WCS_REFINE_PRO_CATG);
772 refine_wcs = cpl_table_load(cpl_frame_get_filename(target_frame),
775 cpl_msg_info(cpl_func,
"wcs refinement table read:");
776 cpl_table_dump(refine_wcs, 0, 100, NULL);
780 const char * datatags[] = {ERIS_NIX_RAW_OBJECT_JITTER_DO_CATG,
781 ERIS_NIX_RAW_SKY_JITTER_DO_CATG,
782 ERIS_NIX_RAW_STD_JITTER_DO_CATG,
783 ERIS_NIX_RAW_OBJECT_LSS_JITTER_DO_CATG,
784 ERIS_NIX_RAW_SKY_LSS_JITTER_DO_CATG,
785 ERIS_NIX_RAW_STD_LSS_JITTER_DO_CATG,
786 ERIS_NIX_RAW_STD_APP_DO_CATG,
787 ERIS_NIX_RAW_STD_FPC_DO_CATG,
788 ERIS_NIX_RAW_STD_SAM_DO_CATG,
789 ERIS_NIX_RAW_OBJECT_APP_DO_CATG,
790 ERIS_NIX_RAW_OBJECT_FPC_DO_CATG,
791 ERIS_NIX_RAW_OBJECT_SAM_DO_CATG,
792 ERIS_NIX_RAW_SKY_FPC_DO_CATG,
793 ERIS_NIX_RAW_SKY_APP_DO_CATG,
794 ERIS_NIX_RAW_PUPIL_LAMP_DO_CATG,
797 ERIS_NIX_RAW_PUPIL_SKY_DO_CATG,
800 ERIS_NIX_RAW_PUPIL_BKG_DO_CATG,
802 ERIS_NIX_RAW_PUPIL_DARK_DO_CATG
806 cpl_size ntags =
sizeof(datatags) /
sizeof(
const char *);
807 const char * protags[] = {ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG,
808 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG,
809 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG,
810 ERIS_NIX_CAL_DET_OBJECT_LSS_JITTER_PRO_CATG,
811 ERIS_NIX_CAL_DET_SKY_LSS_JITTER_PRO_CATG,
812 ERIS_NIX_CAL_DET_STD_LSS_JITTER_PRO_CATG,
813 ERIS_NIX_CAL_DET_STD_APP_PRO_CATG,
814 ERIS_NIX_CAL_DET_STD_FPC_PRO_CATG,
815 ERIS_NIX_CAL_DET_STD_SAM_PRO_CATG,
816 ERIS_NIX_CAL_DET_OBJECT_APP_PRO_CATG,
817 ERIS_NIX_CAL_DET_OBJECT_FPC_PRO_CATG,
818 ERIS_NIX_CAL_DET_OBJECT_SAM_PRO_CATG,
819 ERIS_NIX_CAL_DET_SKY_APP_PRO_CATG,
820 ERIS_NIX_CAL_DET_SKY_FPC_PRO_CATG,
821 ERIS_NIX_CAL_DET_PUPIL_LAMP_PRO_CATG,
824 ERIS_NIX_CAL_DET_PUPIL_SKY_PRO_CATG,
827 ERIS_NIX_CAL_DET_PUPIL_BKG_PRO_CATG,
829 ERIS_NIX_CAL_DET_PUPIL_DARK_PRO_CATG
833 cpl_size nprotags =
sizeof(protags) /
sizeof(
const char *);
834 cpl_msg_debug(cpl_func,
"ntags: %lld nprotags: %lld",ntags,nprotags);
835 enu_check(ntags == nprotags, CPL_ERROR_UNSPECIFIED,
"programming error");
839 for (cpl_size itag = 0; itag < ntags; itag++) {
844 cpl_frameset_iterator * frameset_iter = cpl_frameset_iterator_new(frameset);
845 for (cpl_size iframe = 0; iframe < cpl_frameset_get_size(frameset);
848 cpl_frame * frame = cpl_frameset_iterator_get(frameset_iter);
849 if (!strcmp(datatags[itag], cpl_frame_get_tag(frame))) {
850 cpl_msg_info(cpl_func,
"processing %s", cpl_frame_get_filename(frame));
853 enu_check_error_code(
"failed to read data to calibrate");
854 if (limage && limage->confidence) {
855 cpl_image_delete(copyconf);
856 copyconf = cpl_image_duplicate(limage->confidence);
863 if(strcmp(cpl_frame_get_tag(frame),
"PUPIL_LAMP") ){
870 int remove_read_offsets = CPL_TRUE;
872 flag_mask = ~flag_mask;
887 enu_check_error_code(
"error performing detector calibration of frames");
890 char* pro_catg = NULL;
892 if(strstr(protags[itag],
"PUPIL")) {
893 pro_catg = eris_nix_update_pupil_pro_catg(protags[itag],limage);
895 pro_catg = cpl_sprintf(
"%s",protags[itag]);
899 eris_nix_cal_det_save(limage,
906 enu_check_error_code(
"error saving frame");
914 cpl_frameset_iterator_advance(frameset_iter, 1);
916 cpl_frameset_iterator_delete(frameset_iter);
920 cpl_image_delete(copyconf);
921 cpl_frameset_delete(base_frames);
922 engl_gain_linearity_delete(gain_lin);
927 en_master_flat_delete(master_flat_hifreq);
928 en_master_flat_delete(master_flat_lofreq);
929 cpl_table_delete(refine_wcs);
931 return cpl_error_get_code();
953static cpl_error_code eris_nix_img_sky_objmask(
954 const char* recipe_name,
956 const located_imagelist * jitters,
957 const char * sky_selector,
958 const double sky_time_range,
959 const char * sky_method,
960 const int debug_data,
961 const char * debug_preface,
962 cpl_frameset * frameset,
963 const cpl_parameterlist * parlist,
964 const cpl_frameset * used_frameset,
965 const cpl_size x_probe,
966 const cpl_size y_probe,
967 located_imagelist ** objmask_jitters) {
969 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
971 located_imagelist * jitters1 = NULL;
972 located_imagelist * jitters2 = NULL;
973 const cpl_parameter * p = NULL;
974 char* param_name = NULL;
979 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
980 p = cpl_parameterlist_find_const(parlist, param_name);
981 int obj_min_pixels = cpl_parameter_get_int(p);
982 cpl_free(param_name);
984 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
985 p = cpl_parameterlist_find_const(parlist, param_name);
986 double obj_threshold = cpl_parameter_get_double(p);
987 cpl_free(param_name);
992 double obj_core_radius = -1.0;
993 int bkg_mesh_size = -1;
996 jitters->limages[0]->plist,
1000 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm", context);
1001 p = cpl_parameterlist_find_const(parlist, param_name);
1002 double bkg_smooth_fwhm = cpl_parameter_get_double(p);
1003 cpl_free(param_name);
1008 cpl_msg_info(cpl_func,
"Estimating sky background with no source blanking ...");
1010 jitters1, x_probe, y_probe, jitters1);
1011 enu_check_error_code(
"error in sky_objmask: sky estimation");
1016 bkg_smooth_fwhm, jitters1);
1017 enu_check_error_code(
"error in sky_objmask: deriving object mask");
1021 char * preface = cpl_sprintf(
"%s_%s", debug_preface,
"sky1");
1023 frameset, parlist, used_frameset);
1025 enu_check_error_code(
"error in sky_objmask: saving debug data");
1030 for (cpl_size j = 0; j < jitters2->size; j++) {
1031 jitters2->limages[j]->object_mask = cpl_mask_duplicate(jitters1->
1032 limages[j]->object_mask);
1038 if (cpl_error_get_code() == CPL_ERROR_NONE) {
1039 *objmask_jitters = jitters2;
1044 return cpl_error_get_code();
1065 const cpl_parameterlist * parlist,
1066 const char* recipe_name,
1067 const char* context) {
1069 located_imagelist * object_jitters = NULL;
1070 located_imagelist * objmask_jitters = NULL;
1071 located_imagelist * objmask_sky_jitters = NULL;
1072 const char * out_tag = NULL;
1073 const cpl_parameter * p = NULL;
1074 located_imagelist * result_jitters = NULL;
1075 located_imagelist * skysub_jitters = NULL;
1076 located_imagelist * sky_jitters = NULL;
1077 located_imagelist * std_jitters = NULL;
1078 located_imagelist * target_jitters = NULL;
1079 cpl_frameset * used_frameset = NULL;
1080 char * param_name = NULL;
1082 enu_check_error_code(
"%s():%d: An error is already set: %s",
1083 cpl_func, __LINE__, cpl_error_get_where());
1087 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
1088 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
1093 cpl_msg_set_level_from_env();
1094 cpl_msg_severity severity = cpl_msg_get_level();
1095 cpl_msg_info(cpl_func,
"level %d", (
int) severity);
1099 return CPL_ERROR_BAD_FILE_FORMAT;
1103 param_name = cpl_sprintf(
"%s.sky-source", context);
1104 p = cpl_parameterlist_find_const(parlist, param_name);
1105 const char * sky_source = cpl_parameter_get_string(p);
1106 cpl_free(param_name);
1108 param_name = cpl_sprintf(
"%s.sky-selector", context);
1109 p = cpl_parameterlist_find_const(parlist, param_name);
1110 const char * sky_selector = cpl_parameter_get_string(p);
1111 cpl_free(param_name);
1113 param_name = cpl_sprintf(
"%s.sky-method", context);
1114 p = cpl_parameterlist_find_const(parlist, param_name);
1115 const char * sky_method = cpl_parameter_get_string(p);
1116 cpl_free(param_name);
1118 param_name = cpl_sprintf(
"%s.sky-bracket-time", context);
1119 p = cpl_parameterlist_find_const(parlist, param_name);
1120 const double sky_time_range = cpl_parameter_get_double(p);
1121 cpl_free(param_name);
1123 param_name = cpl_sprintf(
"%s.debug-data", context);
1124 p = cpl_parameterlist_find_const(parlist, param_name);
1125 const int debug_data = cpl_parameter_get_bool(p);
1126 cpl_free(param_name);
1128 param_name = cpl_sprintf(
"%s.x_probe", context);
1129 p = cpl_parameterlist_find_const(parlist, param_name);
1130 cpl_size x_probe = (cpl_size) cpl_parameter_get_int(p);
1131 cpl_free(param_name);
1133 param_name = cpl_sprintf(
"%s.y_probe", context);
1134 p = cpl_parameterlist_find_const(parlist, param_name);
1135 cpl_size y_probe = (cpl_size) cpl_parameter_get_int(p);
1136 cpl_free(param_name);
1138 enu_check_error_code(
"Could not retrieve input parameters");
1143 enu_check_error_code(
"Could not identify RAW and CALIB frames");
1145 used_frameset = cpl_frameset_new();
1151 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG, used_frameset);
1152 enu_check_error_code(
"Could not load "
1153 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" frames");
1155 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG, used_frameset);
1156 enu_check_error_code(
"Could not load "
1157 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG
" frames");
1159 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG, used_frameset);
1160 enu_check_error_code(
"Could not load "
1161 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames");
1163 cpl_msg_info(cpl_func,
"%d "
1164 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" frames read",
1165 (
int) object_jitters->size);
1166 cpl_msg_info(cpl_func,
"%d "
1167 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG
" frames read",
1168 (
int) sky_jitters->size);
1169 cpl_msg_info(cpl_func,
"%d "
1170 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames read",
1171 (
int) std_jitters->size);
1174 if (object_jitters->size > 0 || std_jitters->size) {
1175 if(!strcmp(sky_source,
"auto")) {
1178 if (sky_jitters->size > 0 || !strcmp(sky_source,
"target")) {
1181 cpl_msg_error(cpl_func,
"sky_source: %s, but missing input sky frames. Exit!", sky_source);
1182 return CPL_ERROR_DATA_NOT_FOUND;
1186 cpl_msg_error(cpl_func,
"Missing input object frames. Exit!");
1187 return CPL_ERROR_DATA_NOT_FOUND;
1190 enu_check(!(object_jitters->size == 0 && std_jitters->size == 0),
1191 CPL_ERROR_DATA_NOT_FOUND,
"SoF contains no "
1192 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" or "
1193 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames");
1194 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
1195 CPL_ERROR_ILLEGAL_INPUT,
"SoF contains both "
1196 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG
" and "
1197 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG
" frames");
1198 enu_check(!(!strcmp(sky_source,
"offset") && sky_jitters->size==0),
1199 CPL_ERROR_INCOMPATIBLE_INPUT,
1200 "offset sky position requested but no"
1201 ERIS_NIX_CAL_DET_SKY_JITTER_PRO_CATG
" in sof");
1205 if (object_jitters->size > 0) {
1206 target_jitters = object_jitters;
1207 out_tag = ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG;
1210 }
else if (std_jitters->size > 0) {
1211 target_jitters = std_jitters;
1212 out_tag = ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG;
1214 object_jitters = NULL;
1217 for (cpl_size j=0; j<target_jitters->size; j++) {
1218 double temp = cpl_propertylist_get_double(target_jitters->limages[j]->plist,
"RA");
1219 const char * nm = cpl_frame_get_filename(target_jitters->limages[j]->frame);
1220 cpl_msg_info(cpl_func,
"%s %f %s", nm, temp, cpl_error_get_message());
1226 if (!strcmp(sky_source,
"auto")) {
1227 if (sky_jitters->size > 0) {
1228 sky_source =
"offset";
1230 sky_source =
"target";
1232 cpl_msg_info(cpl_func,
"sky-source=='auto', resetting to '%s'",
1236 if (!strcmp(sky_source,
"offset")) {
1237 if (sky_jitters->size > 1) {
1241 eris_nix_img_sky_objmask(recipe_name, context, sky_jitters,
1242 sky_selector, sky_time_range,
1244 debug_data,
"offset",
1245 frameset, parlist, used_frameset,
1247 &objmask_sky_jitters);
1252 cpl_msg_info(cpl_func,
1253 "Estimating sky background with source blanking ...");
1255 sky_time_range, objmask_sky_jitters,
1258 enu_check_error_code(
"error in sky background subtraction");
1260 char * preface = cpl_sprintf(
"%s_%s",
"offset",
"sky2");
1262 recipe_name, frameset, parlist,
1265 result_jitters = target_jitters;
1273 cpl_msg_info(cpl_func,
1274 "Using sky-offset image as background ...");
1276 sky_time_range, sky_jitters,
1279 enu_check_error_code(
"error in sky background subtraction");
1281 char * preface = cpl_sprintf(
"%s_%s",
"offset",
"sky2");
1283 recipe_name, frameset, parlist,
1286 result_jitters = target_jitters;
1289 }
else if (!strcmp(sky_source,
"target")) {
1294 eris_nix_img_sky_objmask(recipe_name, context, target_jitters,
1295 sky_selector, sky_time_range,
1297 debug_data,
"target",
1298 frameset, parlist, used_frameset,
1305 cpl_msg_info(cpl_func,
"Estimating sky background with source blanking ...");
1307 objmask_jitters, x_probe, y_probe,
1309 enu_check_error_code(
"error in sky background subtraction");
1311 char * preface = cpl_sprintf(
"%s_%s",
"target",
"sky2");
1313 recipe_name, frameset, parlist,
1316 result_jitters = objmask_jitters;
1319 enu_check_error_code(
"failed to remove sky background");
1323 for (cpl_size i = 0; i < result_jitters->size; i++) {
1327 cpl_propertylist * applist = cpl_propertylist_new();
1328 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, out_tag);
1329 cpl_propertylist_update_string(applist,
"PRODCATG",
1331 cpl_propertylist_copy_property_regexp(applist,
1332 result_jitters->limages[i]->plist,
1340 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
1341 result_jitters->limages[i]->plist);
1346 cpl_propertylist_update_double(applist,
"RA", ra);
1347 cpl_propertylist_update_double(applist,
"DEC", dec);
1349 cpl_wcs_delete(wcs);
1355 result_jitters->limages[i]->
1363 result_jitters->limages[i],
1365 result_jitters->limages[i]->frame,
1367 PACKAGE
"/" PACKAGE_VERSION,
1370 cpl_free(out_fname);
1371 cpl_propertylist_delete(applist);
1380 cpl_frameset_delete(used_frameset);
1382 return (
int) cpl_error_get_code();
1385static cpl_error_code
1386eris_nix_scired_get_split_param_int(
const cpl_parameterlist * parlist,
1387 const char* context,
const char* pname,
const int min_x,
const int min_y,
1388 const int max_x,
const int max_y,
1389 cpl_size* txmin, cpl_size* tymin, cpl_size* txmax, cpl_size* tymax)
1392 const cpl_parameter* par = NULL;
1396 const char* pname_string_value;
1397 param_name = cpl_sprintf(
"%s.%s", context, pname);
1398 par = cpl_parameterlist_find_const(parlist, param_name);
1399 pname_string_value = cpl_parameter_get_string(par);
1400 cpl_free(param_name);
1408 cpl_msg_warning(cpl_func,
"param value: %s", pname_string_value);
1409 nFields = sscanf(pname_string_value,
"%lld,%lld,%lld,%lld%n", txmin, tymin, txmax, tymax, &end);
1410 cpl_msg_warning(cpl_func,
"nFields:%d", nFields);
1411 cpl_msg_warning(cpl_func,
"end:%d", end);
1412 if (nFields != 4 || end != strlen(pname_string_value)) {
1413 cpl_msg_error(cpl_func,
"The %s parameter must be "
1414 "a list of four integers separated by a comma", pname);
1415 printf(
"Error reading sky-box-center string\n");
1418 if (*txmin < min_x) {
1419 cpl_msg_warning(cpl_func,
"%s_x: %lld set it to 1",pname, *txmin);
1422 if (*tymin < min_y) {
1423 cpl_msg_warning(cpl_func,
"%s_y: %lld set it to 1",pname, *tymin);
1426 if (*txmax > max_x) {
1427 cpl_msg_warning(cpl_func,
"%s_x: %lld set it to 1",pname, *txmax);
1430 if (*tymax > max_y) {
1431 cpl_msg_warning(cpl_func,
"%s_y: %lld set it to 1", pname, *tymax);
1435 cpl_msg_debug(cpl_func,
"%s_x: %lld, %s_y: %lld, %s_x: %lld, %s_y: %lld",
1436 pname, *txmin, pname, *tymin, pname, *txmax, pname, *tymax);
1439 return cpl_error_get_code();
1454static cpl_error_code eris_nix_calculate_overlaps(
1455 const located_imagelist * jitters,
1456 cpl_matrix ** overlaps) {
1461 double pixsize = fabs(cpl_propertylist_get_double(jitters->limages[0]->
1462 plist,
"CD1_1") * 3600.0);
1464 cpl_size nrow = cpl_matrix_get_nrow(*overlaps);
1466 for (cpl_size row=0; row < nrow; row++) {
1467 double ra_centre = cpl_propertylist_get_double(
1468 jitters->limages[row]->plist,
1470 double dec_centre = cpl_propertylist_get_double(
1471 jitters->limages[row]->plist,
1474 for (cpl_size col = 0; col <= row; col++) {
1475 double ra = cpl_propertylist_get_double(
1476 jitters->limages[col]->plist,
1478 double dec = cpl_propertylist_get_double(
1479 jitters->limages[col]->plist,
1483 if (cpl_propertylist_has(jitters->limages[col]->plist,
1484 "ESO DET SEQ1 WIN NX")) {
1485 nx = cpl_propertylist_get_int(
1486 jitters->limages[col]->plist,
1487 "ESO DET SEQ1 WIN NX");
1490 if (cpl_propertylist_has(jitters->limages[col]->plist,
1491 "ESO DET SEQ1 WIN NY")) {
1492 ny = cpl_propertylist_get_int(
1493 jitters->limages[col]->plist,
1494 "ESO DET SEQ1 WIN NY");
1501 double ra_size = nx * pixsize;
1502 double ra_shift = fabs(ra - ra_centre) * 3600.0;
1503 double ra_overlap = (ra_size - ra_shift) / ra_size;
1505 double dec_size = ny * pixsize;
1506 double dec_shift = fabs(dec - dec_centre) * 3600.0;
1507 double dec_overlap = (dec_size - dec_shift) / dec_size;
1509 double overlap = -1.0;
1510 if (ra_overlap > 0.0 && dec_overlap > 0.0) {
1511 overlap = ra_overlap * dec_overlap;
1514 cpl_matrix_set(*overlaps, row, col, overlap);
1515 cpl_matrix_set(*overlaps, col, row, overlap);
1519 return cpl_error_get_code();
1537static cpl_error_code eris_nix_report_table(
1539 const located_imagelist * jitters,
1540 cpl_table ** report) {
1545 cpl_table_new_column(*report,
"Index", CPL_TYPE_INT);
1546 cpl_table_new_column(*report,
"RA offset", CPL_TYPE_DOUBLE);
1547 cpl_table_new_column(*report,
"Dec offset", CPL_TYPE_DOUBLE);
1548 cpl_table_new_column(*report,
"Reference", CPL_TYPE_INT);
1549 cpl_table_new_column(*report,
"Overlap", CPL_TYPE_DOUBLE);
1550 cpl_table_new_column(*report,
"WCS_METHOD", CPL_TYPE_STRING);
1551 cpl_table_new_column(*report,
"Catalogue/File", CPL_TYPE_STRING);
1552 cpl_table_new_column(*report,
"# matches", CPL_TYPE_INT);
1554 double ra_centre = cpl_propertylist_get_double(
1555 jitters->limages[ref]->plist,
1557 double dec_centre = cpl_propertylist_get_double(
1558 jitters->limages[ref]->plist,
1561 for (cpl_size i = 0; i < jitters->size; i++) {
1562 double ra = cpl_propertylist_get_double(jitters->limages[i]->plist,
1564 double dec = cpl_propertylist_get_double(jitters->limages[i]->plist,
1566 cpl_table_set_int(*report,
"Index", i, (
int) i);
1567 cpl_table_set_double(*report,
"RA offset", i,
1568 (ra - ra_centre) * 3600.0);
1569 cpl_table_set_double(*report,
"Dec offset", i,
1570 (dec - dec_centre) * 3600.0);
1573 return cpl_error_get_code();
1597static cpl_error_code eris_nix_match_and_correct(
1598 located_image * limage,
1599 const char * wcs_method,
1600 cpl_table * reference,
1601 const cpl_propertylist * ref_qclist,
1602 const char * reference_name,
1603 const double match_radius,
1604 cpl_size * nmatches,
1605 cpl_frameset * frameset,
1606 const cpl_parameterlist * parlist,
1607 const char * recipe_name,
1608 hdrl_parameter * cat_params) {
1610 cpl_table * matched_stds = NULL;
1612 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
1616 if (limage->objects && limage->objects->catalogue) {
1617 cpl_matrix * ignore = NULL;
1625 cpl_matrix_delete(ignore);
1626 enu_check_error_code(
"error correcting jitter wcs");
1631 *nmatches = cpl_table_get_nrow(matched_stds);
1646 PACKAGE
"/" PACKAGE_VERSION,
1648 ERIS_NIX_CAL_WCS_REF_CATALOGUE_PRO_CATG);
1657 "matched standards",
1659 PACKAGE
"/" PACKAGE_VERSION,
1661 ERIS_NIX_CAL_WCS_MATCH_CATALOGUE_PRO_CATG);
1665 cpl_wcs * iwcs = cpl_wcs_new_from_propertylist(limage->plist);
1671 cpl_wcs_delete(iwcs);
1676 limage->objects->catalogue,
1677 limage->objects->qclist,
1678 cpl_frame_get_filename(limage->frame),
1680 PACKAGE
"/" PACKAGE_VERSION,
1682 ERIS_NIX_CAL_WCS_CATALOGUE_PRO_CATG);
1685 cpl_msg_info(cpl_func,
"cannot match jitters %s",
1686 cpl_error_get_message());
1690 cpl_table_delete(matched_stds);
1691 return cpl_error_get_code();
1710 const cpl_parameterlist * parlist,
1711 const char* recipe_name,
1712 const char* context) {
1714 cpl_table * astrom_refcat = NULL;
1715 hdrl_parameter * cat_params = NULL;
1716 const char * cdssearch_astrom = NULL;
1717 cpl_table * ref_jitter_match = NULL;
1718 located_imagelist * jitters = NULL;
1719 cpl_matrix * jitter_overlaps = NULL;
1720 char * jitter_ref_name = NULL;
1721 cpl_table * matched_stds = NULL;
1723 located_imagelist * object_jitters = NULL;
1724 const char * out_tag = NULL;
1725 const cpl_parameter * p = NULL;
1726 cpl_vector * plan_ref = NULL;
1727 cpl_vector * plan_cal = NULL;
1728 cpl_table * report = NULL;
1729 cpl_matrix * jitter_ref_shift = NULL;
1730 located_imagelist * std_jitters = NULL;
1731 cpl_frameset * used = NULL;
1732 cpl_table * wcs_match_list = NULL;
1733 char * param_name = NULL;
1735 enu_check_error_code(
"%s():%d: An error is already set: %s",
1736 cpl_func, __LINE__, cpl_error_get_where());
1740 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
1741 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
1746 cpl_msg_set_level_from_env();
1747 cpl_msg_severity severity = cpl_msg_get_level();
1748 cpl_msg_info(cpl_func,
"level %d", (
int) severity);
1752 return CPL_ERROR_BAD_FILE_FORMAT;
1757 param_name = cpl_sprintf(
"%s.cdssearch_astrom", context);
1758 p = cpl_parameterlist_find_const(parlist, param_name);
1759 cdssearch_astrom = cpl_parameter_get_string(p);
1760 cpl_free(param_name);
1762 param_name = cpl_sprintf(
"%s.debug-data", context);
1763 p = cpl_parameterlist_find_const(parlist, param_name);
1765 cpl_free(param_name);
1767 enu_check_error_code(
"Error retrieving input parameters");
1783 enu_check_error_code(
"Could not identify RAW and CALIB frames");
1785 used = cpl_frameset_new();
1790 ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG, used);
1792 ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG, used);
1793 enu_check_error_code(
"Could not load data frames");
1795 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) object_jitters->size,
1796 ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG);
1797 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) std_jitters->size,
1798 ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG);
1802 enu_check(object_jitters->size > 0 || std_jitters->size > 0,
1803 CPL_ERROR_DATA_NOT_FOUND,
"no input frames found");
1804 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
1805 CPL_ERROR_ILLEGAL_INPUT,
"SoF contains both "
1806 ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG
" and "
1807 ERIS_NIX_SKYSUB_STD_JITTER_PRO_CATG
" frames");
1811 if (object_jitters->size > 0) {
1812 jitters = object_jitters;
1813 out_tag = ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG;
1816 }
else if (std_jitters->size > 0) {
1817 jitters = std_jitters;
1818 out_tag = ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG;
1820 object_jitters = NULL;
1827 param_name = cpl_sprintf(
"%s.catalogue.det.effective-gain", context);
1828 p = cpl_parameterlist_find_const(parlist, param_name);
1829 double gain = cpl_parameter_get_double(p);
1830 cpl_free(param_name);
1832 if (cpl_propertylist_has(jitters->limages[0]->plist,
"ESO DARK GAIN")) {
1833 gain = cpl_propertylist_get_double(jitters->limages[0]->plist,
1835 cpl_msg_info(cpl_func,
"catalogue params - reading detector gain "
1836 "from first jitter %4.1f", gain);
1838 param_name = cpl_sprintf(
"%s.catalogue.det.saturation", context);
1839 p = cpl_parameterlist_find_const(parlist, param_name);
1840 double saturation = cpl_parameter_get_double(p);
1841 cpl_free(param_name);
1843 if (cpl_propertylist_has(jitters->limages[0]->plist,
1844 "ESO DETMON SATURATION")) {
1845 saturation = cpl_propertylist_get_double(jitters->limages[0]->plist,
1846 "ESO DETMON SATURATION");
1847 cpl_msg_info(cpl_func,
"catalogue params - reading detector "
1848 "saturation level from first jitter %6.1f", saturation);
1851 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
1852 p = cpl_parameterlist_find_const(parlist, param_name);
1853 int minpixels = cpl_parameter_get_int(p);
1854 cpl_free(param_name);
1856 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
1857 p = cpl_parameterlist_find_const(parlist, param_name);
1858 double threshold = cpl_parameter_get_double(p);
1859 cpl_free(param_name);
1861 param_name = cpl_sprintf(
"%s.catalogue.obj.deblending", context);
1862 p = cpl_parameterlist_find_const(parlist, param_name);
1863 cpl_boolean deblending = cpl_parameter_get_bool(p);
1864 cpl_free(param_name);
1869 double core_radius = -1.0;
1873 jitters->limages[0]->plist,
1877 param_name = cpl_sprintf(
"%s.catalogue.bkg.estimate", context);
1878 p = cpl_parameterlist_find_const(parlist, param_name);
1879 cpl_boolean estimate = cpl_parameter_get_bool(p);
1880 cpl_free(param_name);
1882 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm", context);
1883 p = cpl_parameterlist_find_const(parlist, param_name);
1884 double smooth_gauss_fwhm = cpl_parameter_get_double(p);
1885 cpl_free(param_name);
1896 HDRL_CATALOGUE_ALL);
1898 enu_check_error_code(
"Error setting catalogue params");
1902 for (cpl_size i=0; i < jitters->size; i++) {
1903 cpl_propertylist_update_string(jitters->limages[i]->plist,
1905 ERIS_NIX_WCS_TEL_POINTING);
1906 cpl_propertylist_update_string(jitters->limages[i]->plist,
1913 for (cpl_size i = 0; i < jitters->size; i++) {
1914 diff[i] = cpl_propertylist_get_double(jitters->limages[i]->plist,
1917 float ra_centre = casu_med(diff, NULL, jitters->size);
1918 for (cpl_size i = 0; i < jitters->size; i++) {
1919 diff[i] = cpl_propertylist_get_double(jitters->limages[i]->plist,
1922 float dec_centre = casu_med(diff, NULL, jitters->size);
1923 cpl_msg_info(cpl_func,
"Jitter pattern centre at RA=%10.7f Dec=%10.7f",
1924 ra_centre, dec_centre);
1929 cpl_size jitter_ref = -1;
1930 double minr2 = 1.0e6;
1931 for (cpl_size i = 0; i < jitters->size; i++) {
1932 double ra = cpl_propertylist_get_double(jitters->limages[i]->plist,
1934 double dec = cpl_propertylist_get_double(jitters->limages[i]->plist,
1936 double r2 = pow(ra - ra_centre, 2) + pow(dec - dec_centre, 2);
1942 cpl_msg_info(cpl_func,
"Nearest jitter to centre is %d", (
int) jitter_ref);
1943 char * refname = cpl_strdup(cpl_frame_get_filename(jitters->
1944 limages[jitter_ref]->frame));
1945 cpl_msg_info(cpl_func,
"..filename %s", basename(refname));
1957 eris_nix_scired_get_split_param_int(parlist, context,
"edges-trim", 1, 1,
1958 sx, sy, &txmin, &tymin, &txmax, &tymax);
1960 cpl_msg_info(cpl_func,
"trim edge params: %lld %lld %lld %lld", txmin, tymin, txmax, tymax);
1961 cpl_image* image_edge = cpl_image_new(sx, sy, CPL_TYPE_INT);
1963 cpl_image_fill_window(image_edge,1, 1, txmin, sy, 1);
1967 cpl_image_fill_window(image_edge,sx - txmax, 1, sx, sy, 1);
1971 cpl_image_fill_window(image_edge,1, 1, sx, tymin, 1);
1975 cpl_image_fill_window(image_edge,1, sy - tymax, sx, sy, 1);
1977 cpl_mask* mask_edge = cpl_mask_threshold_image_create(image_edge,0.9, 1.1);
1978 cpl_image_delete(image_edge);
1979 cpl_mask_save(mask_edge,
"mask_edge.fits", NULL, CPL_IO_DEFAULT);
1983 cpl_mask_delete(mask_edge);
1989 jitter_overlaps = cpl_matrix_new(jitters->size, jitters->size);
1990 eris_nix_calculate_overlaps(jitters, &jitter_overlaps);
1991 cpl_msg_info(cpl_func,
" ");
1992 cpl_msg_info(cpl_func,
"Jitter overlaps matrix:");
1993 cpl_matrix_dump(jitter_overlaps, NULL);
1997 cpl_vector * matched = cpl_vector_new(jitters->size);
1998 plan_ref = cpl_vector_new(jitters->size);
1999 plan_cal = cpl_vector_new(jitters->size);
2000 for (cpl_size j=0; j<cpl_vector_get_size(matched); j++) {
2001 cpl_vector_set(matched, j, 0.0);
2002 cpl_vector_set(plan_ref, j, -1.0);
2003 cpl_vector_set(plan_cal, j, -1.0);
2007 cpl_vector_set(matched, jitter_ref, 1.0);
2008 cpl_msg_info(cpl_func,
" ");
2009 cpl_msg_info(cpl_func,
"WCS calibration plan:");
2010 cpl_msg_info(cpl_func,
"ref Gaia calibrates %d", (
int)jitter_ref);
2015 int matching = CPL_TRUE;
2018 cpl_size row_next = -1;
2019 cpl_size col_next = -1;
2020 cpl_matrix * overlaps_copy = cpl_matrix_duplicate(jitter_overlaps);
2024 for (cpl_size col=0; col<jitters->size; col++) {
2025 if (cpl_vector_get(matched, col) < 1.0) {
2026 for (cpl_size row=0; row<jitters->size; row++) {
2027 cpl_matrix_set(overlaps_copy, row, col, -1.0);
2031 for (cpl_size row=0; row<jitters->size; row++) {
2032 if (cpl_vector_get(matched, row) > 0.0) {
2033 for (cpl_size col=0; col<jitters->size; col++) {
2034 cpl_matrix_set(overlaps_copy, row, col, -1.0);
2042 if (cpl_matrix_get_max(overlaps_copy) > 0.0) {
2043 cpl_matrix_get_maxpos(overlaps_copy, &row_next, &col_next);
2044 double overlap_next = cpl_matrix_get(overlaps_copy, row_next,
2046 cpl_msg_info(cpl_func,
"ref %d -> %d overlap %4.2f", (
int)col_next,
2047 (
int)row_next, overlap_next);
2048 cpl_vector_set(matched, row_next, 1.0);
2050 cpl_vector_set(plan_ref, iplan, col_next);
2051 cpl_vector_set(plan_cal, iplan, row_next);
2054 matching = CPL_FALSE;
2056 cpl_matrix_delete(overlaps_copy);
2058 cpl_vector_delete(matched);
2063 report = cpl_table_new(jitters->size);
2064 eris_nix_report_table(jitter_ref, jitters, &report);
2071 cpl_frame * wcs_matched_frame = cpl_frameset_find (frameset,
2072 ERIS_NIX_WCS_MATCHED_CATALOGUE_PRO_CATG);
2073 const char * wcs_match_list_name = NULL;
2074 if (wcs_matched_frame) {
2075 wcs_match_list_name = cpl_frame_get_filename (wcs_matched_frame);
2079 cpl_msg_info(cpl_func,
"found manual matching list %s",
2080 wcs_match_list_name);
2081 wcs_match_list = cpl_table_load(wcs_match_list_name, 1, 0);
2082 enu_check_error_code(
"failed to read match list");
2086 const char * ref_jitter_name = cpl_frame_get_filename(
2087 jitters->limages[jitter_ref]->frame);
2088 cpl_msg_info(cpl_func,
"..reference jitter %s", ref_jitter_name);
2089 cpl_table_unselect_all(wcs_match_list);
2090 for (cpl_size row = 0; row < cpl_table_get_nrow(wcs_match_list);
2092 if (strstr(ref_jitter_name, cpl_table_get_string(wcs_match_list,
2093 "Filename", row))) {
2094 cpl_table_select_row(wcs_match_list, row);
2095 ref_jitter_match = cpl_table_extract_selected(wcs_match_list);
2096 cpl_msg_info(cpl_func,
"..found entry for reference jitter");
2101 if (!ref_jitter_match) {
2102 cpl_msg_info(cpl_func,
"..reference jitter not found in manual "
2105 cpl_msg_info(cpl_func,
"..calculating WCS correction for "
2106 "reference jitter");
2112 cpl_table_new_column(ref_jitter_match,
"xpredict", CPL_TYPE_FLOAT);
2113 cpl_table_new_column(ref_jitter_match,
"ypredict", CPL_TYPE_FLOAT);
2114 double * ra = cpl_table_get_data_double(ref_jitter_match,
"RA");
2115 double * dec = cpl_table_get_data_double(ref_jitter_match,
"DEC");
2116 cpl_matrix * celestial = cpl_matrix_new(1, 2);
2117 cpl_matrix_set(celestial, 0, 0, ra[0]);
2118 cpl_matrix_set(celestial, 0, 1, dec[0]);
2119 cpl_wcs * iwcs = cpl_wcs_new_from_propertylist(
2120 jitters->limages[jitter_ref]->plist);
2121 cpl_matrix * predicted = NULL;
2122 cpl_array * status = NULL;
2123 cpl_wcs_convert(iwcs, celestial, &predicted, &status,
2124 CPL_WCS_WORLD2PHYS);
2125 cpl_wcs_delete(iwcs);
2132 double * x_coordinate = cpl_table_get_data_double(ref_jitter_match,
2134 double * y_coordinate = cpl_table_get_data_double(ref_jitter_match,
2136 cpl_matrix * xy = cpl_matrix_new(1, 2);
2137 cpl_matrix_set(xy, 0, 0, x_coordinate[0]);
2138 cpl_matrix_set(xy, 0, 1, y_coordinate[0]);
2139 cpl_matrix_subtract(xy, predicted);
2140 jitter_ref_shift = xy;
2141 cpl_msg_info(cpl_func,
"..reference jitter shift is");
2142 cpl_matrix_dump(jitter_ref_shift, NULL);
2144 cpl_msg_info(cpl_func,
"..applying WCS correction to reference "
2147 double crpix1 = cpl_propertylist_get_double(
2148 jitters->limages[jitter_ref]->plist,
"CRPIX1");
2149 cpl_propertylist_update_double(jitters->limages[jitter_ref]->plist,
2151 cpl_matrix_get(jitter_ref_shift, 0, 0));
2152 double crpix2 = cpl_propertylist_get_double(
2153 jitters->limages[jitter_ref]->plist,
"CRPIX2");
2154 cpl_propertylist_update_double(jitters->limages[jitter_ref]->plist,
2156 cpl_matrix_get(jitter_ref_shift, 0, 1));
2160 cpl_propertylist_update_string(jitters->limages[jitter_ref]->plist,
2162 ERIS_NIX_WCS_CATALOGUE_MATCH);
2163 cpl_propertylist_update_string(jitters->limages[jitter_ref]->plist,
2165 cpl_table_get_string(ref_jitter_match,
2167 enu_check_error_code(
"failure to set corrected wcs");
2172 jitters->limages[jitter_ref]->plist);
2174 jitters->limages[jitter_ref]->frame,
2178 cpl_table_get_string(ref_jitter_match,
2181 PACKAGE
"/" PACKAGE_VERSION,
2183 ERIS_NIX_CAL_WCS_REF_CATALOGUE_PRO_CATG);
2189 jitters->limages[jitter_ref]->frame,
2193 cpl_table_get_string(ref_jitter_match,
2196 PACKAGE
"/" PACKAGE_VERSION,
2198 ERIS_NIX_CAL_WCS_MATCH_CATALOGUE_PRO_CATG);
2202 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
2203 jitters->limages[jitter_ref]->plist);
2204 cpl_msg_info(cpl_func,
"cataloguing reference jitter");
2206 jitters->limages[jitter_ref]->himage,
2207 jitters->limages[jitter_ref]->confidence,
2210 cpl_wcs_delete(wcs);
2212 jitters->limages[jitter_ref]->frame,
2214 jitters->limages[jitter_ref]->objects->catalogue,
2215 jitters->limages[jitter_ref]->objects->qclist,
2216 cpl_frame_get_filename(jitters->
2217 limages[jitter_ref]->
2220 PACKAGE
"/" PACKAGE_VERSION,
2222 ERIS_NIX_CAL_WCS_CATALOGUE_PRO_CATG);
2224 cpl_msg_info(cpl_func,
"..");
2227 if (jitter_ref_shift == NULL) {
2232 if (strcmp(cdssearch_astrom,
"none")) {
2234 cpl_msg_info(cpl_func,
" ");
2235 cpl_msg_info(cpl_func,
"Try to match sources in reference jitter "
2236 "with %s", cdssearch_astrom);
2244 astrom_refcat = NULL;
2245 int casu_status = CASU_OK;
2246 char * catname = cpl_strdup(cdssearch_astrom);
2247 int cdschoice = casu_get_cdschoice(cdssearch_astrom);
2248 casu_getstds(jitters->limages[jitter_ref]->plist,
2249 CPL_FALSE, NULL, catname, cdschoice, NULL,
2250 &astrom_refcat, NULL, &casu_status);
2252 if (astrom_refcat) {
2256 cpl_size nstds = cpl_table_get_nrow(astrom_refcat);
2257 enu_check(nstds >= minstds, CPL_ERROR_INCOMPATIBLE_INPUT,
2258 "nstds = %d, need at least %d", (
int)nstds, minstds);
2263 if (cpl_table_has_column(astrom_refcat,
"Dec") &&
2264 !cpl_table_has_column(astrom_refcat,
"DEC")) {
2265 cpl_table_duplicate_column(astrom_refcat,
"DEC",
2266 astrom_refcat,
"Dec");
2267 cpl_table_erase_column(astrom_refcat,
"Dec");
2270 cpl_msg_info(cpl_func,
"cataloguing reference jitter %d",
2272 cpl_wcs * iwcs = cpl_wcs_new_from_propertylist
2273 (jitters->limages[jitter_ref]->plist);
2275 jitters->limages[jitter_ref]->himage,
2276 jitters->limages[jitter_ref]->confidence,
2279 cpl_wcs_delete(iwcs);
2282 double match_rad = 10.0;
2283 cpl_size nmatches = 0;
2284 eris_nix_match_and_correct(jitters->limages[jitter_ref],
2285 ERIS_NIX_WCS_CATALOGUE_MATCH,
2296 cpl_table_set_int(report,
"Reference", jitter_ref, -1);
2297 cpl_table_set_double(report,
"Overlap", jitter_ref,
2298 cpl_matrix_get(jitter_overlaps,
2299 jitter_ref, jitter_ref));
2300 cpl_table_set_string(report,
"WCS_METHOD", jitter_ref,
2301 ERIS_NIX_WCS_CATALOGUE_MATCH);
2302 cpl_table_set_string(report,
"Catalogue/File", jitter_ref,
2304 cpl_table_set_int(report,
"# matches", jitter_ref, nmatches);
2306 cpl_msg_info(cpl_func,
"..");
2307 enu_check_error_code(
"error correcting wcs of reference jitter");
2319 if (!(jitters->limages[jitter_ref]->objects)) {
2320 cpl_msg_warning(cpl_func,
"Unable to absolute correct jitters "
2321 "because no sources found in reference jitter");
2324 for (cpl_size i = 0; i < jitters->size; i++) {
2325 cpl_size jref = cpl_vector_get(plan_ref, i);
2326 cpl_size jcal = cpl_vector_get(plan_cal, i);
2328 if (jref >= 0 && jitters->limages[jref]->objects != NULL) {
2329 cpl_msg_info(cpl_func,
" ");
2330 cpl_msg_info(cpl_func,
"using jitter %d to correct %d",
2331 (
int)jref, (
int)jcal);
2337 char * fname = cpl_strdup(cpl_frame_get_filename(
2338 jitters->limages[jref]->frame));
2339 char * jref_name = cpl_strdup(basename(fname));
2344 double match_rad = 2.0;
2345 cpl_size nmatches = 0;
2346 eris_nix_match_and_correct(jitters->limages[jcal],
2347 ERIS_NIX_WCS_JITTER_RELATIVE,
2348 jitters->limages[jref]->
2350 jitters->limages[jref]->
2361 cpl_table_set_int(report,
"Reference", jcal, jref);
2362 cpl_table_set_double(report,
"Overlap", jcal,
2363 cpl_matrix_get(jitter_overlaps, jref, jcal));
2364 cpl_table_set_string(report,
"WCS_METHOD", jcal,
2365 ERIS_NIX_WCS_JITTER_RELATIVE);
2366 cpl_table_set_string(report,
"Catalogue/File", jcal, jref_name);
2367 cpl_table_set_int(report,
"# matches", jcal, nmatches);
2368 cpl_free(jref_name);
2371 cpl_msg_info(cpl_func,
"..");
2375 for (cpl_size i = 0; i < jitters->size; i++) {
2379 char * out_fname =
enu_repreface(cpl_frame_get_filename(jitters->
2383 cpl_propertylist * applist = cpl_propertylist_new();
2384 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, out_tag);
2385 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
2386 cpl_propertylist_copy_property(applist, jitters->limages[i]->plist,
2388 cpl_propertylist_copy_property(applist, jitters->limages[i]->plist,
2395 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
2396 jitters->limages[i]->plist);
2401 cpl_propertylist_update_double(applist,
"RA", ra);
2402 cpl_propertylist_update_double(applist,
"DEC", dec);
2404 cpl_wcs_delete(wcs);
2408 cpl_frameset * provenance = cpl_frameset_new();
2409 cpl_frameset_insert(provenance, cpl_frame_duplicate(
2410 jitters->limages[i]->frame));
2411 if (i != jitter_ref) {
2412 cpl_frameset_insert(provenance, cpl_frame_duplicate(
2413 jitters->limages[jitter_ref]->frame));
2419 jitters->limages[i],
2421 jitters->limages[i]->frame,
2423 PACKAGE
"/" PACKAGE_VERSION,
2426 cpl_free(out_fname);
2427 cpl_frameset_delete(provenance);
2428 cpl_propertylist_delete(applist);
2431 cpl_table_dump(report, 0, 100, NULL);
2433 char * in_fname = cpl_strdup(cpl_frame_get_filename(jitters->limages[0]->
2435 char * out_fname = cpl_sprintf(
"cal_wcs_report.%s", basename(in_fname));
2437 cpl_propertylist * report_plist = cpl_propertylist_new();
2438 cpl_propertylist_update_string(report_plist, CPL_DFS_PRO_CATG,
2439 ERIS_NIX_CAL_WCS_REPORT_PRO_CATG);
2440 cpl_table_save (report, report_plist, NULL, out_fname, CPL_IO_CREATE);
2441 cpl_propertylist_delete(report_plist);
2443 cpl_free(out_fname);
2446 cpl_table_delete(astrom_refcat);
2448 cpl_table_delete(ref_jitter_match);
2449 cpl_free(jitter_ref_name);
2450 cpl_matrix_delete(jitter_ref_shift);
2451 cpl_matrix_delete(jitter_overlaps);
2452 cpl_table_delete(matched_stds);
2453 cpl_vector_delete(plan_ref);
2454 cpl_vector_delete(plan_cal);
2456 cpl_table_delete(report);
2458 cpl_frameset_delete(used);
2459 cpl_table_delete(wcs_match_list);
2461 return (
int) cpl_error_get_code();
2472static cpl_error_code cal_phot_cast_columns_to_float(cpl_table * table) {
2474 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
2478 if (table == NULL)
return CPL_ERROR_NONE;
2480 cpl_array * colnames = cpl_table_get_column_names(table);
2481 for (cpl_size icol=0; icol < cpl_array_get_size(colnames); icol++) {
2482 const char * colname = cpl_array_get_string(colnames, icol);
2483 if (cpl_table_get_column_type(table, colname) == CPL_TYPE_DOUBLE ||
2484 cpl_table_get_column_type(table, colname) == CPL_TYPE_LONG_LONG) {
2485 cpl_table_cast_column(table, colname, colname, CPL_TYPE_FLOAT);
2488 cpl_array_delete(colnames);
2490 return cpl_error_get_code();
2507static cpl_error_code eris_nix_img_cal_phot_save(
2508 located_image * limage,
2510 cpl_frameset * frameset,
2511 const cpl_parameterlist * parlist,
2512 const char * recipe_name) {
2514 if (cpl_error_get_code() != CPL_ERROR_NONE)
return cpl_error_get_code();
2522 double cd1_1 = cpl_propertylist_get_double(limage->plist,
"CD1_1");
2523 double cd2_1 = cpl_propertylist_get_double(limage->plist,
"CD2_1");
2524 double pixsize = sqrt(pow(cd1_1, 2) + pow(cd2_1, 2)) * 3600.0;
2526 double fwhm_pix = -1.0;
2527 if (limage->objects &&
2528 limage->objects->qclist &&
2529 cpl_propertylist_has(limage->objects->qclist,
"ESO QC IMAGE_SIZE")) {
2531 fwhm_pix = cpl_propertylist_get_double(limage->objects->qclist,
2532 "ESO QC IMAGE_SIZE");
2535 if (fwhm_pix != -1.0) {
2536 cpl_propertylist_update_double(limage->plist,
"PSF_FWHM",
2537 fwhm_pix * pixsize);
2538 cpl_propertylist_set_comment(limage->plist,
"PSF_FWHM",
2539 "Average FWHM of stellar objects[arcsec]");
2541 double fwhm = cpl_propertylist_get_double(limage->plist,
"PSF_FWHM");
2542 fwhm_pix = fwhm / pixsize;
2545 double photzp = cpl_propertylist_get_double(limage->plist,
"PHOTZP");
2546 double abmaglim = -1.0;
2547 if(!isfinite(photzp)) {
2554 cpl_propertylist * applist = cpl_propertylist_new();
2556 cpl_propertylist_copy_property(applist, limage->plist,
"FLUXCAL");
2558 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"ESO QC MAGZPT"))) {
2559 cpl_propertylist_update_double(applist,
"ESO QC MAGZPT", -999);
2560 cpl_propertylist_update_double(limage->plist,
"ESO QC MAGZPT", -999);
2562 cpl_propertylist_copy_property(applist, limage->plist,
"ESO QC MAGZPT");
2565 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"ESO QC MAGZERR"))) {
2566 cpl_propertylist_update_double(applist,
"ESO QC MAGZERR", -999);
2567 cpl_propertylist_update_double(limage->plist,
"ESO QC MAGZERR", -999);
2569 cpl_propertylist_copy_property(applist, limage->plist,
"ESO QC MAGZERR");
2573 cpl_propertylist_update_double(applist,
"ABMAGLIM", abmaglim);
2574 cpl_propertylist_set_comment(applist,
"ABMAGLIM",
"5-sigma "
2575 "limiting AB magnitude");
2580 double saturation = cpl_propertylist_get_double(limage->plist,
2581 "ESO DETMON SATURATION");
2583 double satlev = saturation / dit;
2584 double abmagsat = cpl_propertylist_get_double(limage->plist,
"ABMAGSAT");
2585 abmagsat = abmagsat + 2.5 * log10(65000 / satlev);
2586 cpl_propertylist_copy_property(applist, limage->plist,
"ABMAGSAT");
2588 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"ABMAGSAT"))) {
2589 cpl_propertylist_update_double(applist,
"ABMAGSAT", -999);
2590 cpl_propertylist_update_double(limage->plist,
"ABMAGSAT", -999);
2592 cpl_propertylist_update_double(applist,
"ABMAGSAT", abmagsat);
2595 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"PHOTZP"))) {
2596 cpl_propertylist_append_double(applist,
"PHOTZP", -999);
2597 cpl_propertylist_set_double(limage->plist,
"PHOTZP", -999);
2599 cpl_propertylist_copy_property(applist, limage->plist,
"PHOTZP");
2602 if(!isfinite(cpl_propertylist_get_double(limage->plist,
"PHOTZPER"))) {
2603 cpl_propertylist_append_double(applist,
"PHOTZPER", -999);
2604 cpl_propertylist_set_double(limage->plist,
"PHOTZPER", -999);
2606 cpl_propertylist_copy_property(applist, limage->plist,
"PHOTZPER");
2608 cpl_propertylist_copy_property(applist, limage->plist,
"ZPMETHOD");
2609 if (cpl_propertylist_has(limage->plist,
"ZP_CAT")) {
2610 cpl_propertylist_copy_property(applist, limage->plist,
"ZP_CAT");
2612 cpl_propertylist_copy_property(applist, limage->plist,
"ESO DRS EXTCOEF");
2616 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, tag);
2617 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
2623 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(limage->plist);
2628 cpl_propertylist_update_double(applist,
"RA", ra);
2629 cpl_propertylist_update_double(applist,
"DEC", dec);
2631 cpl_wcs_delete(wcs);
2636 cpl_frameset * provenance = cpl_frameset_new();
2637 cpl_frameset_insert(provenance, cpl_frame_duplicate(limage->frame));
2641 char * out_fname =
enu_repreface(cpl_frame_get_filename(limage->frame),
2652 PACKAGE
"/" PACKAGE_VERSION,
2655 cpl_free(out_fname);
2656 cpl_frameset_delete(provenance);
2657 cpl_propertylist_delete(applist);
2659 return cpl_error_get_code();
2672static cpl_error_code eris_nix_img_cal_phot_default(
2673 cpl_frameset * frameset,
2674 located_image * jitter) {
2676 cpl_table * phot_data = NULL;
2677 cpl_table * selected = NULL;
2681 cpl_frame * phot_data_frame = cpl_frameset_find (frameset,
2682 ERIS_NIX_PHOT_DATA_PRO_CATG);
2683 const char * phot_data_file = cpl_frame_get_filename (phot_data_frame);
2684 enu_check_error_code(
"Failed to read NIX photometry file name");
2686 cpl_msg_info(cpl_func,
"..transferring default photometric calibration "
2687 "from %s", phot_data_file);
2692 const char * pcat =
"2MASS";
2693 cpl_size phot_ext = cpl_fits_find_extension(phot_data_file, pcat);
2694 enu_check(phot_ext > 0, CPL_ERROR_INCOMPATIBLE_INPUT,
2695 "photometry information for '%s' not found in %s",
2696 pcat, phot_data_file);
2698 phot_data = cpl_table_load(phot_data_file, phot_ext, 0);
2704 enu_check(filter != NULL, CPL_ERROR_INCOMPATIBLE_INPUT,
2705 "Failure to find filter name");
2708 char * comparison = cpl_sprintf(
"^%s$", filter);
2709 cpl_size nsel = cpl_table_and_selected_string(phot_data,
"filter_name",
2710 CPL_EQUAL_TO, comparison);
2711 cpl_free(comparison);
2713 cpl_msg_info(cpl_func,
"Filter %s located in %s", filter,
2715 selected = cpl_table_extract_selected(phot_data);
2716 cpl_table_dump(selected, 0, 1, NULL);
2717 cpl_table_delete(phot_data);
2718 phot_data = selected;
2720 cpl_error_set_message(cpl_func, CPL_ERROR_INCOMPATIBLE_INPUT,
2721 "No entry for filter %s in %s", filter,
2724 enu_check_error_code(
"Failure to read photometry data for filter %s",
2728 double default_zp = cpl_table_get_double(phot_data,
"default_zp", 0,
2730 double default_zp_err = cpl_table_get_double(phot_data,
2731 "default_zp_err", 0,
2733 double extcoef = cpl_table_get_double(phot_data,
"atm_extcoef", 0,
2744 const double extinct = extcoef * (airmass - 1.0);
2745 const double exptime = 1.0;
2746 cpl_msg_info(cpl_func,
"default %f %f %f", default_zp, exptime, extinct);
2747 const double photzp = default_zp + 2.5*log10(exptime) - extinct;
2751 const char * zp_method =
"DEFAULT";
2752 const char * zp_method_comment =
"ZP taken from filter default value";
2753 const char * magzpt_comment =
"[mag] photometric zeropoint";
2754 const char * magzerr_comment =
"[mag] photometric zeropoint error";
2755 const char * photzp_comment =
"[mag] photometric zeropoint";
2756 const char * photzper_comment =
"[mag] uncertainty on PHOTZP";
2757 const char * extcoef_comment =
"[mag] Assumed extinction coefficient";
2761 cpl_propertylist_update_string(jitter->plist,
"FLUXCAL",
"ABSOLUTE");
2762 cpl_propertylist_set_comment(jitter->plist,
"FLUXCAL",
2763 "quality of flux calibration");
2764 cpl_propertylist_update_double(jitter->plist,
"ESO QC MAGZPT",
2766 cpl_propertylist_set_comment(jitter->plist,
"ESO QC MAGZPT",
2768 cpl_propertylist_update_double(jitter->plist,
"ESO QC MAGZERR",
2770 cpl_propertylist_set_comment(jitter->plist,
"ESO QC MAGZERR",
2772 cpl_propertylist_update_double(jitter->plist,
"PHOTZP", photzp);
2773 cpl_propertylist_set_comment(jitter->plist,
"PHOTZP", photzp_comment);
2774 cpl_propertylist_update_double(jitter->plist,
"PHOTZPER", default_zp_err);
2775 cpl_propertylist_set_comment(jitter->plist,
"PHOTZPER", photzper_comment);
2776 cpl_propertylist_update_string(jitter->plist,
"ZPMETHOD", zp_method);
2777 cpl_propertylist_set_comment(jitter->plist,
"ZPMETHOD",
2779 cpl_propertylist_update_double(jitter->plist,
"ESO DRS EXTCOEF", extcoef);
2780 cpl_propertylist_set_comment(jitter->plist,
"ESO DRS EXTCOEF",
2785 if (jitter->objects && jitter->objects->qclist) {
2786 cpl_propertylist_update_double(jitter->objects->qclist,
2787 "ESO QC MAGZPT", default_zp);
2788 cpl_propertylist_set_comment(jitter->objects->qclist,
2789 "ESO QC MAGZPT", magzpt_comment);
2790 cpl_propertylist_update_double(jitter->objects->qclist,
2791 "ESO QC MAGZERR", default_zp_err);
2792 cpl_propertylist_set_comment(jitter->objects->qclist,
2793 "ESO QC MAGZERR", magzerr_comment);
2794 cpl_propertylist_update_double(jitter->objects->qclist,
"PHOTZP",
2796 cpl_propertylist_set_comment(jitter->objects->qclist,
"PHOTZP",
2798 cpl_propertylist_update_string(jitter->objects->qclist,
2799 "ZPMETHOD", zp_method);
2800 cpl_propertylist_set_comment(jitter->objects->qclist,
2801 "ZPMETHOD", zp_method_comment);
2802 cpl_propertylist_update_double(jitter->plist,
"ESO DRS EXTCOEF",
2804 cpl_propertylist_set_comment(jitter->plist,
"ESO DRS EXTCOEF",
2810 cpl_table_delete(phot_data);
2811 return cpl_error_get_code();
2826static cpl_error_code eris_nix_img_cal_phot_external(
2827 cpl_frameset * frameset,
2828 const cpl_parameterlist * parlist,
2829 located_imagelist * standards,
2830 located_imagelist * jitters,
2831 const char * out_catg,
2832 const char * recipe_name) {
2834 cpl_msg_info(cpl_func,
"..transferring photometric calibration from %s",
2835 cpl_frame_get_filename(standards->limages[0]->frame));
2840 const char * filter =
enu_get_filter(jitters->limages[0]->plist);
2841 const char * std_filter = cpl_propertylist_get_string(
2842 standards->limages[0]->plist,
2844 enu_check(!strcmp(filter, std_filter), CPL_ERROR_INCOMPATIBLE_INPUT,
2845 "Standard field filter (%s) does not match "
2846 "target (%s)", std_filter, filter);
2851 const double magzpt = cpl_propertylist_get_double(
2852 standards->limages[0]->plist,
"ESO QC MAGZPT");
2853 const char * magzpt_comment = cpl_propertylist_get_comment(
2854 standards->limages[0]->plist,
2856 const double magzerr = cpl_propertylist_get_double(
2857 standards->limages[0]->plist,
"ESO QC MAGZERR");
2858 const char * magzerr_comment = cpl_propertylist_get_comment(
2859 standards->limages[0]->plist,
2861 const char * photzp_comment = cpl_propertylist_get_comment(
2862 standards->limages[0]->plist,
"PHOTZP");
2867 const double extcoef = cpl_propertylist_get_double(
2868 standards->limages[0]->plist,
2870 const char * extcoef_comment =
"[mag] Assumed extinction coefficient";
2878 for (cpl_size j = 0; j < jitters->size; j++) {
2885 const double extinct = extcoef * (airmass - 1.0);
2886 const double exptime = 1.0;
2887 const double photzp = magzpt + 2.5*log10(exptime) - extinct;
2891 cpl_propertylist_update_string(jitters->limages[j]->plist,
2892 "FLUXCAL",
"ABSOLUTE");
2893 cpl_propertylist_set_comment(jitters->limages[j]->plist,
"FLUXCAL",
2894 "quality of flux calibration");
2895 cpl_propertylist_update_double(jitters->limages[j]->plist,
2896 "ESO QC MAGZPT", magzpt);
2897 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2898 "ESO QC MAGZPT", magzpt_comment);
2899 cpl_propertylist_update_double(jitters->limages[j]->plist,
2900 "ESO QC MAGZERR", magzerr);
2901 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2902 "ESO QC MAGZERR", magzerr_comment);
2903 cpl_propertylist_update_double(jitters->limages[j]->plist,
2905 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2906 "PHOTZP", photzp_comment);
2907 cpl_propertylist_update_double(jitters->limages[j]->plist,
2908 "ESO DRS EXTCOEF", extcoef);
2909 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2910 "ESO DRS EXTCOEF", extcoef_comment);
2914 if (jitters->limages[j]->objects) {
2915 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2916 "ESO QC MAGZPT", magzpt);
2917 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2918 "ESO QC MAGZPT", magzpt_comment);
2919 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2920 "ESO QC MAGZERR", magzerr);
2921 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2922 "ESO QC MAGZERR", magzerr_comment);
2923 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2925 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2926 "PHOTZP", photzp_comment);
2927 cpl_propertylist_update_double(jitters->limages[j]->objects->qclist,
2928 "ESO DRS EXTCOEF", extcoef);
2929 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2930 "ESO DRS EXTCOEF", extcoef_comment);
2935 const char * zp_method =
"separate_STD_star";
2936 const char * zp_method_comment =
2937 "photometric cal method: "
2938 "separate_STD_star = transfer from other image, "
2939 "science_field_standards = using stds in field, "
2940 "default = default value from phot data file";
2941 cpl_propertylist_update_string(jitters->limages[j]->plist,
2942 "ZPMETHOD", zp_method);
2943 cpl_propertylist_set_comment(jitters->limages[j]->plist,
2944 "ZPMETHOD", zp_method_comment);
2945 if (jitters->limages[j]->objects) {
2946 cpl_propertylist_update_string(jitters->limages[j]->objects->qclist,
2947 "ZPMETHOD", zp_method);
2948 cpl_propertylist_set_comment(jitters->limages[j]->objects->qclist,
2949 "ZPMETHOD", zp_method_comment);
2954 eris_nix_img_cal_phot_save(jitters->limages[j],
2959 enu_check_error_code(
"failure writing result");
2964 return cpl_error_get_code();
2979static cpl_error_code eris_nix_img_cal_phot_internal(
2980 cpl_frameset * frameset,
2981 const cpl_parameterlist * parlist,
2982 located_imagelist * jitters,
2983 const char * out_catg,
2984 const char * recipe_name,
2985 const char* context) {
2987 int casu_status = CASU_OK;
2988 hdrl_parameter * cat_params = NULL;
2989 casu_fits ** in_image_data = NULL;
2990 casu_fits ** in_image_conf = NULL;
2991 casu_fits ** in_image_var = NULL;
2992 casu_tfits ** in_cats = NULL;
2993 casu_tfits ** in_mstds = NULL;
2994 const cpl_parameter * p = NULL;
2995 cpl_table * phot_data = NULL;
2996 cpl_table ** phot_refcat = NULL;
2997 char * param_name = NULL;
2999 cpl_msg_info(cpl_func,
"Calibrating using standard stars in field");
3003 param_name = cpl_sprintf(
"%s.cdssearch_photom", context);
3004 p = cpl_parameterlist_find_const(parlist, param_name);
3005 const char * cdssearch_photom = cpl_parameter_get_string(p);
3006 cpl_msg_info(cpl_func,
"cdssearch_photom: %s",cdssearch_photom);
3007 cpl_free(param_name);
3009 param_name = cpl_sprintf(
"%s.pixel_radius", context);
3010 p = cpl_parameterlist_find_const(parlist, param_name);
3011 const double pixel_radius = cpl_parameter_get_double(p);
3012 cpl_free(param_name);
3014 param_name = cpl_sprintf(
"%s.minphotom", context);
3015 p = cpl_parameterlist_find_const(parlist, param_name);
3016 const int minphotom = cpl_parameter_get_int(p);
3017 cpl_free(param_name);
3019 param_name = cpl_sprintf(
"%s.magerrcut", context);
3020 p = cpl_parameterlist_find_const(parlist, param_name);
3021 const double magerrcut = cpl_parameter_get_double(p);
3022 cpl_free(param_name);
3029 param_name = cpl_sprintf(
"%s.catalogue.det.effective-gain", context);
3030 p = cpl_parameterlist_find_const(parlist, param_name);
3031 double gain = cpl_parameter_get_double(p);
3032 cpl_free(param_name);
3034 if (cpl_propertylist_has(jitters->limages[0]->plist,
"ESO DARK GAIN")) {
3035 cpl_msg_info(cpl_func,
"reading detector gain from first jitter");
3036 gain = cpl_propertylist_get_double(jitters->limages[0]->plist,
3040 param_name = cpl_sprintf(
"%s.catalogue.det.saturation", context);
3041 p = cpl_parameterlist_find_const(parlist, param_name);
3042 double saturation = cpl_parameter_get_double(p);
3043 cpl_free(param_name);
3046 if (cpl_propertylist_has(jitters->limages[0]->plist,
3047 "ESO DETMON SATURATION")) {
3048 cpl_msg_info(cpl_func,
3049 "reading detector saturation level from first jitter");
3050 double saturation_adu = cpl_propertylist_get_double(
3051 jitters->limages[0]->plist,
3052 "ESO DETMON SATURATION");
3053 double dit =
enu_get_dit(jitters->limages[0]->plist);
3054 saturation = saturation_adu / dit;
3055 cpl_msg_info(cpl_func,
3056 "saturation(adu)=%5.3e dit=%5.3e saturation(adu/s)=%5.3e",
3057 saturation_adu, dit, saturation);
3061 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
3062 p = cpl_parameterlist_find_const(parlist, param_name);
3063 int minpixels = cpl_parameter_get_int(p);
3064 cpl_free(param_name);
3066 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
3067 p = cpl_parameterlist_find_const(parlist, param_name);
3068 double threshold = cpl_parameter_get_double(p);
3069 cpl_free(param_name);
3071 param_name = cpl_sprintf(
"%s.catalogue.obj.deblending", context);
3072 p = cpl_parameterlist_find_const(parlist, param_name);
3073 cpl_boolean deblending = cpl_parameter_get_bool(p);
3074 cpl_free(param_name);
3079 double core_radius = -1.0;
3083 jitters->limages[0]->plist,
3087 param_name = cpl_sprintf(
"%s.catalogue.bkg.estimate", context);
3088 p = cpl_parameterlist_find_const(parlist, param_name);
3089 cpl_boolean estimate = cpl_parameter_get_bool(p);
3090 cpl_free(param_name);
3092 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm",
3094 p = cpl_parameterlist_find_const(parlist, param_name);
3095 double smooth_gauss_fwhm = cpl_parameter_get_double(p);
3096 cpl_free(param_name);
3107 HDRL_CATALOGUE_ALL);
3109 cpl_msg_info(cpl_func,
"gain=%4.2f saturation=%6.2f", gain, saturation);
3111 enu_check_error_code(
"Could not retrieve input parameters");
3112 enu_check(strcmp(cdssearch_photom,
"none"), CPL_ERROR_ILLEGAL_INPUT,
3113 "photometric catalogue not specified");
3117 cpl_frame * phot_data_frame = cpl_frameset_find (frameset,
3118 ERIS_NIX_PHOT_DATA_PRO_CATG);
3119 const char * phot_data_file = cpl_frame_get_filename (phot_data_frame);
3120 enu_check_error_code(
"Failed to read NIX photometry file name");
3122 cpl_msg_info(cpl_func,
"..reading instrument photometric properties "
3123 "from %s", phot_data_file);
3124 cpl_size phot_ext = cpl_fits_find_extension(phot_data_file,
3126 enu_check(phot_ext > 0, CPL_ERROR_INCOMPATIBLE_INPUT,
3127 "photometry information for '%s' not found in %s",
3128 cdssearch_photom, phot_data_file);
3129 phot_data = cpl_table_load(phot_data_file, phot_ext, 0);
3133 cal_phot_cast_columns_to_float(phot_data);
3138 const char * filter =
enu_get_filter(jitters->limages[0]->plist);
3139 enu_check_error_code(
"Failed to read filter name from file");
3142 char * comparison = cpl_sprintf(
"^%s$", filter);
3143 cpl_size nsel = cpl_table_and_selected_string(phot_data,
"filter_name",
3144 CPL_EQUAL_TO, comparison);
3145 cpl_free(comparison);
3147 cpl_msg_info(cpl_func,
"Filter %s located in %s", filter,
3149 cpl_table * selected = cpl_table_extract_selected(phot_data);
3150 cpl_table_dump(selected, 0, 10, NULL);
3151 cpl_table_delete(selected);
3152 cpl_table_select_all(phot_data);
3154 cpl_error_set_message(cpl_func, CPL_ERROR_INCOMPATIBLE_INPUT,
3155 "No entry for filter %s in %s", filter,
3158 enu_check_error_code(
"Failure to read photometry data for filter %s",
3167 for (cpl_size j = 0; j < jitters->size; j++) {
3171 cpl_propertylist_update_double(jitters->limages[j]->plist,
3174 if (jitters->limages[j]->objects) {
3175 cpl_propertylist * phu = jitters->limages[j]->plist;
3176 cpl_propertylist * ehu = jitters->limages[j]->objects->qclist;
3183 double cd1_1 = cpl_propertylist_get_double(phu,
"CD1_1");
3184 double cd2_1 = cpl_propertylist_get_double(phu,
"CD2_1");
3185 double pixsize = sqrt(cd1_1 * cd1_1 + cd2_1 * cd2_1) * 3600.0;
3186 cpl_propertylist_update_float(phu,
"ESO QC WCS_SCALE",
3190 double val = cpl_propertylist_get_double(ehu,
"ESO QC SKY_NOISE");
3191 cpl_propertylist_update_float(ehu,
"ESO DRS SKYNOISE", (
float) val);
3194 val = cpl_propertylist_get_double(ehu,
"ESO QC MEAN_SKY");
3197 cpl_propertylist_update_double(ehu,
"ESO DRS SKYLEVEL",
3203 double fwhm_pix = cpl_propertylist_get_double(
3204 ehu,
"ESO QC IMAGE_SIZE");
3208 double fwhm = fwhm_pix * pixsize;
3209 cpl_propertylist_update_double(ehu,
"PSF_FWHM", (
float)fwhm);
3210 cpl_propertylist_set_comment(ehu,
"PSF_FWHM",
"[arcsec] Average "
3211 "FWHM of stellar objects");
3215 if (jitters->limages[j]->objects->catalogue) {
3216 cal_phot_cast_columns_to_float(jitters->limages[j]->objects->
3230 in_cats = cpl_malloc(jitters->size *
sizeof(casu_tfits *));
3231 in_mstds = cpl_malloc(jitters->size *
sizeof(casu_tfits *));
3232 phot_refcat = cpl_malloc(jitters->size *
sizeof(cpl_table *));
3234 for (cpl_size j = 0; j < jitters->size; j++) {
3235 in_mstds[j] = cpl_malloc(
sizeof(casu_tfits));
3236 in_mstds[j]->table = NULL;
3237 in_mstds[j]->phu = NULL;
3238 in_mstds[j]->ehu = NULL;
3239 in_mstds[j]->fname = NULL;
3240 in_mstds[j]->extname = NULL;
3241 in_mstds[j]->fullname = NULL;
3242 in_mstds[j]->nexten = -1;
3243 in_mstds[j]->status = CASU_OK;
3245 in_cats[j] = cpl_malloc(
sizeof(casu_tfits));
3246 in_cats[j]->table = NULL;
3247 in_cats[j]->phu = NULL;
3248 in_cats[j]->ehu = NULL;
3249 in_cats[j]->fname = NULL;
3250 in_cats[j]->extname = NULL;
3251 in_cats[j]->fullname = NULL;
3252 in_cats[j]->nexten = -1;
3253 in_cats[j]->status = CASU_OK;
3255 phot_refcat[j] = NULL;
3261 for (cpl_size j = 0; j < jitters->size; j++) {
3262 cpl_msg_info(cpl_func,
"processing jitter %d", (
int)j);
3266 if (jitters->limages[j]->objects) {
3267 in_cats[j]->table = cpl_table_duplicate(jitters->limages[j]->
3268 objects->catalogue);
3269 in_cats[j]->phu = cpl_propertylist_duplicate(jitters->limages[j]->
3271 in_cats[j]->ehu = cpl_propertylist_duplicate(jitters->limages[j]->
3273 in_cats[j]->fname = cpl_strdup(cpl_frame_get_filename(
3274 jitters->limages[j]->frame));
3284 enu_check_error_code(
"error before calling casu_getstds");
3285 phot_refcat[j] = NULL;
3286 casu_status = CASU_OK;
3287 casu_getstds(jitters->limages[j]->plist, CPL_FALSE,
3290 1, NULL, &phot_refcat[j], NULL,
3293 if (phot_refcat[j] == NULL) {
3294 cpl_msg_info(cpl_func,
"...no phot standards found");
3296 en_catalogue_name_conformance(phot_refcat[j]);
3297 cpl_size nstds = cpl_table_get_nrow(phot_refcat[j]);
3298 cpl_msg_info(cpl_func,
"...%d phot standards read", (
int)nstds);
3304 const int strict = 0;
3306 phot_refcat[j], pixel_radius, strict,
3307 &(in_mstds[j]->table));
3308 enu_check_error_code(
"Failure trying to match standards: %s",
3309 cpl_error_get_message());
3313 cal_phot_cast_columns_to_float(in_mstds[j]->table);
3314 in_mstds[j]->phu = cpl_propertylist_new();
3315 in_mstds[j]->ehu = cpl_propertylist_new();
3316 enu_check(casu_status == CASU_OK, CPL_ERROR_ILLEGAL_INPUT,
3317 "casu_matchstds failure status : %d", casu_status);
3326 cpl_msg_info(cpl_func,
".no objects detected in field");
3327 in_cats[j]->phu = cpl_propertylist_new();
3328 in_cats[j]->ehu = cpl_propertylist_new();
3338 if (in_mstds[j]->table == NULL) {
3339 in_mstds[j]->table = cpl_table_new(0);
3340 in_mstds[j]->phu = cpl_propertylist_new();
3341 in_mstds[j]->ehu = cpl_propertylist_new();
3347 cpl_msg_info(cpl_func,
"performing photometric calibration");
3348 casu_status = CASU_OK;
3349 char * filter_copy = cpl_strdup(filter);
3350 casu_photcal_extinct(in_image_data,
3359 "ESO TEL AIRM START",
3362 cpl_free(filter_copy);
3363 enu_check_error_code(
"Failure in casu_photcal_extinct: %s",
3364 cpl_error_get_message());
3369 for (cpl_size j = 0; j < jitters->size; j++) {
3371 const char * fluxcal = cpl_propertylist_get_string(
3372 in_image_data[j]->phu,
3375 if (!strcmp(fluxcal,
"UNCALIBRATED")) {
3381 cpl_msg_warning(cpl_func,
"casu_photcal_extinct has returned "
3382 "a bad result, applying default");
3383 eris_nix_img_cal_phot_default(frameset, jitters->limages[j]);
3394 cpl_propertylist_delete(jitters->limages[j]->plist);
3395 jitters->limages[j]->plist = cpl_propertylist_duplicate(
3396 in_image_data[j]->ehu);
3397 cpl_propertylist_set_string(jitters->limages[j]->plist,
"FLUXCAL",
3402 cpl_propertylist_update_string(jitters->limages[j]->plist,
3410 const int zpfudged = cpl_propertylist_get_bool(
3411 jitters->limages[j]->plist,
"ZPFUDGED");
3413 const char * zp_method = NULL;
3414 const char * zp_comment = NULL;
3416 zp_method =
"DEFAULT";
3417 zp_comment =
"ZP taken from filter default value";
3419 zp_method =
"2MASS";
3420 zp_comment =
"ZP computed from 2MASS sources in the field";
3422 cpl_propertylist_update_string(jitters->limages[j]->plist,
3423 "ZPMETHOD", zp_method);
3424 cpl_propertylist_set_comment(jitters->limages[j]->plist,
3425 "ZPMETHOD", zp_comment);
3426 cpl_msg_info(cpl_func,
"set ZPMETHOD %s", zp_method);
3428 if (!strcmp(zp_method,
"2MASS")) {
3429 cpl_propertylist_update_string(jitters->limages[j]->plist,
3430 "ZP_CAT", cdssearch_photom);
3435 if (jitters->limages[j]->objects &&
3436 jitters->limages[j]->objects->qclist) {
3437 cpl_propertylist_delete(jitters->limages[j]->objects->qclist);
3438 jitters->limages[j]->objects->qclist =
3439 cpl_propertylist_duplicate(
3441 cpl_propertylist_update_string(
3442 jitters->limages[j]->objects->qclist,
3443 "ZPMETHOD", zp_method);
3444 cpl_propertylist_update_string(
3445 jitters->limages[j]->objects->qclist,
3453 in_mstds[j]->table &&
3454 cpl_table_get_nrow(in_mstds[j]->table) > 0) {
3455 jitters->limages[j]->matchstd_phot = cpl_calloc(
3456 sizeof(hdrl_catalogue_result), 1);
3457 jitters->limages[j]->matchstd_phot->catalogue =
3458 cpl_table_duplicate(in_mstds[j]->table);
3459 jitters->limages[j]->matchstd_phot->qclist =
3460 cpl_propertylist_duplicate(
3462 cpl_propertylist_update_string(jitters->limages[j]->
3463 matchstd_phot->qclist,
3466 if (!strcmp(zp_method,
"science_field_standards")) {
3467 cpl_propertylist_update_string(jitters->limages[j]->
3468 matchstd_phot->qclist,
"ZP_CAT",
3476 eris_nix_img_cal_phot_save(jitters->limages[j],
3481 enu_check_error_code(
"failure writing result");
3485 if (phot_refcat[j]) {
3487 jitters->limages[j]->frame,
3493 PACKAGE
"/" PACKAGE_VERSION,
3495 ERIS_NIX_CAL_PHOT_REF_CATALOGUE_PRO_CATG);
3500 if (jitters->limages[j]->matchstd_phot &&
3501 jitters->limages[j]->matchstd_phot->catalogue) {
3504 jitters->limages[j]->frame,
3506 jitters->limages[j]->matchstd_phot->catalogue,
3507 jitters->limages[j]->matchstd_phot->qclist,
3510 PACKAGE
"/" PACKAGE_VERSION,
3511 "matchcat.cal_phot",
3512 ERIS_NIX_CAL_PHOT_MATCH_CATALOGUE_PRO_CATG);
3517 if (jitters->limages[j]->objects &&
3518 jitters->limages[j]->objects->catalogue) {
3521 jitters->limages[j]->frame,
3523 jitters->limages[j]->objects->catalogue,
3524 jitters->limages[j]->objects->qclist,
3525 cpl_frame_get_filename(jitters->
3529 PACKAGE
"/" PACKAGE_VERSION,
3531 ERIS_NIX_CAL_PHOT_CATALOGUE_PRO_CATG);
3538 if (in_image_data) {
3539 for (cpl_size j = 0; j < jitters->size; j++) {
3540 if (in_image_data[j]) casu_fits_unwrap(in_image_data[j]);
3542 cpl_free(in_image_data);
3545 for (cpl_size j = 0; j < jitters->size; j++) {
3546 if (in_image_var[j]) casu_fits_unwrap(in_image_var[j]);
3548 cpl_free(in_image_var);
3550 if (in_image_conf) {
3551 for (cpl_size j = 0; j < jitters->size; j++) {
3552 if (in_image_conf[j]) casu_fits_unwrap(in_image_conf[j]);
3554 cpl_free(in_image_conf);
3556 casu_tfits_delete_list(in_cats, (
int)jitters->size);
3557 casu_tfits_delete_list(in_mstds, jitters->size);
3558 if (phot_refcat != NULL) {
3559 for (cpl_size j = 0; j < jitters->size; j++) {
3560 cpl_table_delete(phot_refcat[j]);
3564 cpl_table_delete(phot_data);
3565 cpl_free(phot_refcat);
3567 return cpl_error_get_code();
3585 const cpl_parameterlist * parlist,
3586 const char * recipe_name,
3587 const char* context) {
3589 located_imagelist * jitters = NULL;
3590 located_imagelist * object_jitters = NULL;
3591 located_imagelist * standards = NULL;
3592 located_imagelist * std_jitters = NULL;
3593 cpl_frameset * used = NULL;
3595 enu_check_error_code(
"%s():%d: An error is already set: %s",
3596 cpl_func, __LINE__, cpl_error_get_where());
3598 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
3599 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
3604 cpl_msg_set_level_from_env();
3605 cpl_msg_severity severity = cpl_msg_get_level();
3606 cpl_msg_info(cpl_func,
"level %d", (
int) severity);
3610 return CPL_ERROR_BAD_FILE_FORMAT;
3613 const int ntags = 1;
3614 const char* required_tags[1] = {
3615 ERIS_NIX_PHOT_DATA_PRO_CATG
3619 cpl_ensure_code(CPL_ERROR_NONE ==
3620 eris_dfs_check_input_tags(frameset, required_tags, ntags, 1),
3621 CPL_ERROR_ILLEGAL_INPUT);
3623 const int ntags_opt = 3;
3624 const char* optional_tags[3] = {
3625 ERIS_NIX_CAL_WCS_MATCH_CATALOGUE_PRO_CATG,
3626 ERIS_NIX_CAL_WCS_REF_CATALOGUE_PRO_CATG,
3627 ERIS_NIX_CAL_WCS_CATALOGUE_PRO_CATG
3631 cpl_ensure_code(CPL_ERROR_NONE ==
3632 eris_dfs_check_input_tags(frameset, optional_tags, ntags_opt, 0),
3633 CPL_ERROR_ILLEGAL_INPUT);
3637 used = cpl_frameset_new();
3642 enu_check_error_code(
"Could not identify RAW and CALIB frames");
3647 ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG, used);
3648 enu_check_error_code(
"Failed to read object jitter data");
3650 ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG, used);
3651 enu_check_error_code(
"Failed to read STD jitter data");
3653 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) object_jitters->size,
3654 ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG);
3655 cpl_msg_info(cpl_func,
"%d %s frames read", (
int) std_jitters->size,
3656 ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG);
3660 enu_check(object_jitters->size > 0 || std_jitters->size > 0,
3661 CPL_ERROR_DATA_NOT_FOUND,
"no input frames found");
3662 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
3663 CPL_ERROR_ILLEGAL_INPUT,
"SoF contains both "
3664 ERIS_NIX_CAL_WCS_OBJECT_JITTER_PRO_CATG
" and "
3665 ERIS_NIX_CAL_WCS_STD_JITTER_PRO_CATG
" frames");
3669 const char * out_catg = NULL;
3670 if (object_jitters->size > 0) {
3671 jitters = object_jitters;
3672 out_catg = ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG;
3676 jitters = std_jitters;
3677 out_catg = ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG;
3679 object_jitters = NULL;
3688 ERIS_NIX_IMG_STD_COMBINED_PRO_CATG, used);
3689 enu_check_error_code(
"Failed to read external standard");
3690 if (standards->size > 0) {
3691 cpl_msg_info(cpl_func,
"%d "
3692 ERIS_NIX_IMG_STD_COMBINED_PRO_CATG
" frames read",
3693 (
int) standards->size);
3696 if (standards->size == 0) {
3701 int absolute_wcs = CPL_FALSE;
3703 for (cpl_size j = 0; j < jitters->size; j++) {
3705 const char * wcs_method;
3706 if (cpl_propertylist_has(jitters->limages[j]->plist,
"ESO WCS_METHOD")) {
3707 wcs_method = cpl_propertylist_get_string(
3708 jitters->limages[j]->plist,
3712 wcs_method = cpl_propertylist_get_string(
3713 jitters->limages[j]->plist,
3717 cpl_msg_info(cpl_func,
"jitter %d wcs_method: %s", (
int)j, wcs_method);
3718 if (!strcmp(wcs_method, ERIS_NIX_WCS_CATALOGUE_MATCH)) {
3719 absolute_wcs = CPL_TRUE;
3722 enu_check_error_code(
"failed to determine type of wcs calibration");
3728 eris_nix_img_cal_phot_internal(frameset,
3732 recipe_name, context);
3733 enu_check_error_code(
"error attempting internal photometric "
3737 for (cpl_size j = 0; j < jitters->size; j++) {
3741 cpl_msg_info(cpl_func,
"..astrometry calibration is not absolute");
3742 eris_nix_img_cal_phot_default(frameset,
3743 jitters->limages[j]);
3744 enu_check_error_code(
"error setting default photometric "
3749 eris_nix_img_cal_phot_save(jitters->limages[j],
3754 enu_check_error_code(
"failure writing result");
3758 }
else if (standards->size == 1){
3762 eris_nix_img_cal_phot_external(frameset,
3768 enu_check_error_code(
"error attempting external photometric "
3771 cpl_error_set_message(cpl_func, CPL_ERROR_INCOMPATIBLE_INPUT,
3773 ERIS_NIX_IMG_STD_COMBINED_PRO_CATG
3774 " file is allowed, found %d",
3775 (
int) standards->size);
3782 cpl_frameset_delete(used);
3784 return (
int) cpl_error_get_code();
3805 const cpl_parameterlist * parlist,
3806 const char* recipe_name,
3807 const char* context) {
3809 cpl_propertylist * applist = NULL;
3810 cpl_property * bunit = NULL;
3811 hdrl_parameter * cat_params = NULL;
3812 cpl_property * fluxcal_0 = NULL;
3813 const char * funcid =
"eris_nix_img_hdrl_stack";
3814 cpl_frame * inherit = NULL;
3815 located_imagelist * jitters = NULL;
3816 cpl_property * jitter_psf_fwhm = NULL;
3817 hdrl_parameter * method = NULL;
3818 located_imagelist * object_jitters = NULL;
3819 cpl_vector * obsid = NULL;
3820 hdrl_parameter * outgrid = NULL;
3821 char * photsys_0 = NULL;
3822 char * proto_copy = NULL;
3823 cpl_frameset * provenance = NULL;
3824 cpl_table * restable = NULL;
3825 hdrl_resample_result * result = NULL;
3826 cpl_image * stack_conf = NULL;
3827 cpl_propertylist * stack_header = NULL;
3828 hdrl_image * stack_himage = NULL;
3829 located_image * stacked = NULL;
3830 located_imagelist * std_jitters = NULL;
3831 cpl_propertylist * tablelist = NULL;
3832 cpl_wcs * template_wcs = NULL;
3833 cpl_frameset * used = NULL;
3834 cpl_property * zp_method_0 = NULL;
3835 const cpl_parameter * p = NULL;
3836 char * param_name = NULL;
3838 enu_check_error_code(
"%s():%d: An error is already set: %s",
3839 cpl_func, __LINE__, cpl_error_get_where());
3843 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
3844 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
3846 cpl_msg_set_level_from_env();
3850 return CPL_ERROR_BAD_FILE_FORMAT;
3855 param_name = cpl_sprintf(
"%s.interpolation_method", context);
3856 p = cpl_parameterlist_find_const(parlist, param_name);
3857 const char * interpolation_method = cpl_parameter_get_string(p);
3858 cpl_free(param_name);
3860 param_name = cpl_sprintf(
"%s.loop_distance", context);
3861 p = cpl_parameterlist_find_const(parlist, param_name);
3862 const int loop_distance = cpl_parameter_get_int(p);
3863 cpl_free(param_name);
3866 const cpl_boolean use_errorweights = CPL_FALSE;
3868 param_name = cpl_sprintf(
"%s.kernel_size", context);
3869 p = cpl_parameterlist_find_const(parlist, param_name);
3870 const int kernel_size = cpl_parameter_get_int(p);
3871 cpl_free(param_name);
3873 param_name = cpl_sprintf(
"%s.critical_radius", context);
3874 p = cpl_parameterlist_find_const(parlist, param_name);
3875 const double critical_radius = cpl_parameter_get_double(p);
3876 cpl_free(param_name);
3878 param_name = cpl_sprintf(
"%s.pix_frac_x", context);
3879 p = cpl_parameterlist_find_const(parlist, param_name);
3880 const double pix_frac_x = cpl_parameter_get_double(p);
3881 cpl_free(param_name);
3883 param_name = cpl_sprintf(
"%s.pix_frac_y", context);
3884 p = cpl_parameterlist_find_const(parlist, param_name);
3885 const double pix_frac_y = cpl_parameter_get_double(p);
3886 cpl_free(param_name);
3888 const double pix_frac_lambda = 100.0;
3890 enu_check_error_code(
"Could not retrieve input parameters");
3893 if (!strcmp(interpolation_method,
"nearest")) {
3895 }
else if (!strcmp(interpolation_method,
"linear")) {
3898 }
else if (!strcmp(interpolation_method,
"quadratic")) {
3901 }
else if (!strcmp(interpolation_method,
"renka")) {
3905 }
else if (!strcmp(interpolation_method,
"drizzle")) {
3911 }
else if (!strcmp(interpolation_method,
"lanczos")) {
3916 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_INPUT,
3917 "bad interpolation method: %s",
3918 interpolation_method);
3920 enu_check_error_code(
"Error constructing interpolation method");
3925 enu_check_error_code(
"Could not identify RAW and CALIB frames");
3929 used = cpl_frameset_new();
3931 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG, used);
3932 enu_check_error_code(
"Could not read %s frames",
3933 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG);
3934 cpl_msg_info(funcid,
"%d %s frames read", (
int) object_jitters->size,
3935 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG);
3937 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG, used);
3938 enu_check_error_code(
"Could not read %s frames",
3939 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG);
3940 cpl_msg_info(funcid,
"%d %s frames read", (
int) std_jitters->size,
3941 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG);
3945 enu_check(!(object_jitters->size > 0 && std_jitters->size > 0),
3946 CPL_ERROR_ILLEGAL_INPUT,
3947 "SoF cannot contain data for both target and standard");
3948 enu_check(!(object_jitters->size == 0 && std_jitters->size == 0),
3949 CPL_ERROR_DATA_NOT_FOUND,
3950 "SoF contains no data");
3951 const char * out_catg = NULL;
3952 if(object_jitters->size > 0) {
3953 jitters = object_jitters;
3954 out_catg = ERIS_NIX_IMG_OBS_COMBINED_PRO_CATG;
3958 jitters = std_jitters;
3959 out_catg = ERIS_NIX_IMG_STD_COMBINED_PRO_CATG;
3961 object_jitters = NULL;
3967 cpl_size njitters = jitters->size;
3968 const char * proto = cpl_frame_get_filename((jitters->limages[0])->
3970 proto_copy = cpl_strdup(proto);
3972 inherit = cpl_frame_duplicate(jitters->limages[0]->frame);
3976 obsid = cpl_vector_new(jitters->size);
3977 cpl_vector_fill(obsid, -1.0);
3979 double total_exptime = 0.0;
3980 double mjd_start = 1000000.0;
3981 double mjd_end = 0.0;
3985 double cd1_1 = cpl_propertylist_get_double(jitters->limages[0]->plist,
3987 double cd2_1 = cpl_propertylist_get_double(jitters->limages[0]->plist,
3989 double pixsize = sqrt(cd1_1 * cd1_1 + cd2_1 * cd2_1) * 3600.0;
3990 cpl_msg_info(cpl_func,
"pixel scale: %6.4f arcsec", pixsize);
3991 template_wcs = cpl_wcs_new_from_propertylist(jitters->limages[0]->plist);
3992 enu_check_error_code(
"error set after loading template wcs");
3999 param_name = cpl_sprintf(
"%s.catalogue.det.effective-gain", context);
4000 p = cpl_parameterlist_find_const(parlist, param_name);
4001 double gain = cpl_parameter_get_double(p);
4002 cpl_free(param_name);
4004 if (cpl_propertylist_has(jitters->limages[0]->plist,
"ESO DARK GAIN")) {
4005 cpl_msg_info(cpl_func,
"reading detector gain from first jitter");
4006 gain = cpl_propertylist_get_double(jitters->limages[0]->plist,
4010 param_name = cpl_sprintf(
"%s.catalogue.det.saturation", context);
4011 p = cpl_parameterlist_find_const(parlist, param_name);
4012 double saturation = cpl_parameter_get_double(p);
4013 cpl_free(param_name);
4016 if (cpl_propertylist_has(jitters->limages[0]->plist,
4017 "ESO DETMON SATURATION")) {
4018 cpl_msg_info(cpl_func,
4019 "reading detector saturation level from first jitter");
4020 double saturation_adu = cpl_propertylist_get_double(
4021 jitters->limages[0]->plist,
4022 "ESO DETMON SATURATION");
4023 double dit =
enu_get_dit(jitters->limages[0]->plist);
4024 saturation = saturation_adu / dit;
4025 cpl_msg_info(cpl_func,
4026 "saturation(adu)=%5.3e dit=%5.3e saturation(adu/s)=%5.3e",
4027 saturation_adu, dit, saturation);
4031 param_name = cpl_sprintf(
"%s.catalogue.obj.min-pixels", context);
4032 p = cpl_parameterlist_find_const(parlist, param_name);
4033 int minpixels = cpl_parameter_get_int(p);
4034 cpl_free(param_name);
4036 param_name = cpl_sprintf(
"%s.catalogue.obj.threshold", context);
4037 p = cpl_parameterlist_find_const(parlist, param_name);
4038 double threshold = cpl_parameter_get_double(p);
4039 cpl_free(param_name);
4041 param_name = cpl_sprintf(
"%s.catalogue.obj.deblending", context);
4042 p = cpl_parameterlist_find_const(parlist, param_name);
4043 cpl_boolean deblending = cpl_parameter_get_bool(p);
4044 cpl_free(param_name);
4049 double core_radius = -1.0;
4053 jitters->limages[0]->plist,
4057 param_name = cpl_sprintf(
"%s.catalogue.bkg.estimate", context);
4058 p = cpl_parameterlist_find_const(parlist, param_name);
4059 cpl_boolean estimate = cpl_parameter_get_bool(p);
4060 cpl_free(param_name);
4062 param_name = cpl_sprintf(
"%s.catalogue.bkg.smooth-gauss-fwhm",
4064 p = cpl_parameterlist_find_const(parlist, param_name);
4065 double smooth_gauss_fwhm = cpl_parameter_get_double(p);
4066 cpl_free(param_name);
4077 HDRL_CATALOGUE_ALL);
4078 enu_check_error_code(
"error set after setting catalogue params");
4080 cpl_msg_info(cpl_func,
"gain=%4.2f saturation=%6.2f", gain, saturation);
4082 provenance = cpl_frameset_new();
4084 cpl_msg_info(cpl_func,
"assembling information on combined exposures");
4086 for (cpl_size j = 0; j < jitters->size; j++) {
4091 cpl_frameset_insert(provenance, cpl_frame_duplicate(
4092 jitters->limages[j]->frame));
4098 bunit = cpl_property_duplicate(cpl_propertylist_get_property(
4099 jitters->limages[j]->plist,
4103 if (!jitter_psf_fwhm) {
4104 jitter_psf_fwhm = cpl_property_duplicate(
4105 cpl_propertylist_get_property(
4106 jitters->limages[j]->plist,
4116 double dit =
enu_get_dit(jitters->limages[j]->plist);
4117 double exptime = dit * cpl_propertylist_get_int(
4118 jitters->limages[j]->plist,
"ESO DET NDIT");
4119 total_exptime += exptime;
4123 double jitter_start = cpl_propertylist_get_double(
4124 jitters->limages[j]->plist,
"MJD-OBS");
4125 if (jitter_start < mjd_start) {
4126 mjd_start = jitter_start;
4128 double jitter_end = cpl_propertylist_get_double(
4129 jitters->limages[j]->plist,
"MJD-END");
4130 if (jitter_end > mjd_end) {
4131 mjd_end = jitter_end;
4133 cpl_msg_info(cpl_func,
"..combined mjd start: %15.8f end: %15.8f",
4134 mjd_start, mjd_end);
4138 int obs_id = cpl_propertylist_get_int(jitters->limages[j]->plist,
4140 for (cpl_size jj = 0; jj < cpl_vector_get_size(obsid); jj++) {
4141 if ((
int) cpl_vector_get(obsid, jj) == obs_id) {
4143 }
else if (cpl_vector_get(obsid, jj) < 0.0) {
4144 cpl_vector_set(obsid, jj, obs_id);
4155 double photzp_0 = 0.0;
4156 double photzper_0 = 0.0;
4157 double extcoef_0 = 0.0;
4159 cpl_msg_info(cpl_func,
"stacking image data");
4162 for (cpl_size j = 0; j < jitters->size; j++) {
4163 cpl_msg_info(cpl_func,
"ingesting jitter %d", (
int)j);
4167 const cpl_property * fluxcal_j = cpl_propertylist_get_property(
4168 jitters->limages[j]->plist,
"FLUXCAL");
4169 const char * photsys_j = cpl_propertylist_get_string(
4170 jitters->limages[j]->plist,
"PHOTSYS");
4171 const cpl_property * zp_method_j = cpl_propertylist_get_property(
4172 jitters->limages[j]->plist,
4174 double photzp_j = cpl_propertylist_get_double(
4175 jitters->limages[j]->plist,
"PHOTZP");
4176 double photzper_j = cpl_propertylist_get_double(
4177 jitters->limages[j]->plist,
"PHOTZPER");
4178 double extcoef_j = cpl_propertylist_get_double(
4179 jitters->limages[j]->plist,
4182 cpl_msg_info(cpl_func,
"..fluxcal: %s",
4183 cpl_property_get_string(fluxcal_j));
4184 cpl_msg_info(cpl_func,
"..photsys: %s", photsys_j);
4185 cpl_msg_info(cpl_func,
"..extcoef: %f", extcoef_j);
4186 cpl_msg_info(cpl_func,
"..zp_method: %s",
4187 cpl_property_get_string(zp_method_j));
4188 cpl_msg_info(cpl_func,
"..photzp: %f photzper: %f", photzp_j,
4192 photzp_0 = photzp_j;
4193 photzper_0 = photzper_j;
4194 fluxcal_0 = cpl_property_duplicate(fluxcal_j);
4195 photsys_0 = cpl_strdup(photsys_j);
4196 zp_method_0 = cpl_property_duplicate(zp_method_j);
4197 extcoef_0 = extcoef_j;
4200 if (!strcmp(cpl_property_get_string(fluxcal_j),
"CALIBRATED")) {
4201 cpl_msg_warning(cpl_func,
"jitter is not calbrated");
4203 if (strcmp(photsys_j,
"VEGA")) {
4204 cpl_msg_warning(cpl_func,
"PHOTSYS is not recognized");
4206 if (extcoef_j != extcoef_0) {
4207 cpl_msg_warning(cpl_func,
4208 "..inconsistent extcoef: %d %5.3e %5.3e",
4209 (
int) j, extcoef_0, extcoef_j);
4218 double factor = pow(10.0, (photzp_0 - photzp_j) / 2.5);
4219 cpl_msg_info(cpl_func,
"..scaling jitter %d by %5.3e", (
int)j,
4222 (hdrl_value){factor, 0.0});
4253 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
4254 jitters->limages[j]->plist);
4256 jitters->limages[j]->himage,
4258 cpl_wcs_delete(wcs);
4260 if (restable == NULL) {
4261 restable = jitter_table;
4263 cpl_size nrow = cpl_table_get_nrow(restable);
4264 cpl_table_insert(restable, jitter_table, nrow+1);
4265 cpl_table_delete(jitter_table);
4269 enu_check_error_code(
"error set after loading jitters");
4274 object_jitters = std_jitters = NULL;
4278 cpl_msg_info(cpl_func,
"calling hdrl_resample_compute");
4284 cpl_table_delete(restable); restable = NULL;
4285 enu_check_error_code(
"error set computing resample_compute");
4292 result->himlist, 0));
4293 stack_header = cpl_propertylist_duplicate(result->header);
4297 cpl_msg_info(cpl_func,
"stacking the confidence");
4302 cpl_frameset * ignore = cpl_frameset_new();
4304 ERIS_NIX_CAL_PHOT_OBJECT_JITTER_PRO_CATG,
4307 ERIS_NIX_CAL_PHOT_STD_JITTER_PRO_CATG,
4309 if(object_jitters->size > 0) {
4310 jitters = object_jitters;
4313 jitters = std_jitters;
4319 for (cpl_size j = 0; j < jitters->size; j++) {
4320 cpl_msg_info(cpl_func,
"ingesting jitter %d", (
int)j);
4322 double photzp_j = cpl_propertylist_get_double(
4323 jitters->limages[j]->plist,
"PHOTZP");
4325 double factor = pow(10.0, (photzp_0 - photzp_j) / 2.5);
4326 cpl_msg_info(cpl_func,
"..scaling by %5.3e", factor);
4328 (hdrl_value){factor, 0.0});
4334 cpl_image * inverse_conf = cpl_image_duplicate(
4335 jitters->limages[j]->confidence);
4336 double * ic_data = cpl_image_get_data_double(inverse_conf);
4337 const cpl_size nx = cpl_image_get_size_x(inverse_conf);
4338 const cpl_size ny = cpl_image_get_size_y(inverse_conf);
4339 for (cpl_size i=0; i<nx*ny; i++) {
4340 if (ic_data[i] > 0.0) {
4341 ic_data[i] = sqrt(1.0 / ic_data[i]);
4346 jitters->limages[j]->himage),
4348 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
4349 jitters->limages[j]->plist);
4353 cpl_wcs_delete(wcs);
4354 cpl_image_delete(inverse_conf);
4357 if (restable == NULL) {
4358 restable = jitter_table;
4360 cpl_size nrow = cpl_table_get_nrow(restable);
4361 cpl_table_insert(restable, jitter_table, nrow+1);
4362 cpl_table_delete(jitter_table);
4367 object_jitters = std_jitters = NULL;
4368 enu_check_error_code(
"error set after loading error image of jitters");
4370 cpl_msg_info(cpl_func,
"calling hdrl_resample_compute");
4372 cpl_table_delete(restable); restable = NULL;
4373 enu_check_error_code(
"error after resample_compute of image confidence");
4378 stack_conf = cpl_image_duplicate(
4381 result->himlist, 0)));
4382 cpl_image * sc_copy = cpl_image_duplicate(stack_conf);
4383 cpl_image_divide(stack_conf, sc_copy);
4384 cpl_image_divide(stack_conf, sc_copy);
4385 cpl_image_divide(stack_conf, sc_copy);
4386 cpl_image_delete(sc_copy);
4407 enu_check_error_code(
"error set after image stacking");
4411 cpl_wcs * result_wcs = cpl_wcs_new_from_propertylist(stacked->plist);
4413 stacked->confidence,
4416 cpl_wcs_delete(result_wcs);
4417 enu_check_error_code(
"error in target reduction: catalogue");
4421 applist = cpl_propertylist_new();
4425 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, out_catg);
4426 cpl_propertylist_update_string(applist,
"PRODCATG",
"SCIENCE.IMAGE");
4427 cpl_propertylist_update_string(applist,
"BUNIT", cpl_property_get_string(bunit));
4428 cpl_propertylist_set_comment(applist,
"BUNIT", cpl_property_get_comment(bunit));
4429 cpl_propertylist_update_int(applist,
"NCOMBINE", ncombine);
4430 cpl_propertylist_update_double(applist,
"TEXPTIME", total_exptime);
4431 cpl_propertylist_update_double(applist,
"EXPTIME", total_exptime);
4432 cpl_propertylist_update_double(applist,
"MJD-OBS", mjd_start);
4433 cpl_propertylist_update_double(applist,
"MJD-END", mjd_end);
4434 for (cpl_size j = 0; j < njitters; ++j) {
4435 if (cpl_vector_get(obsid, j) > 0.0) {
4436 char * pname = cpl_sprintf(
"OBID%.0i", (
int)(j+1));
4437 cpl_propertylist_update_int(applist, pname,
4438 (
int)cpl_vector_get(obsid, j));
4445 cpl_propertylist_update_string(applist,
"PHOTSYS", photsys_0);
4446 cpl_propertylist_update_double(applist,
"PHOTZP", photzp_0);
4447 cpl_propertylist_set_comment(applist,
"PHOTZP",
4448 "MAG=-2.5*log(data)+PHOTZP+APCOR");
4449 cpl_propertylist_update_string(applist,
"FLUXCAL",
4450 cpl_property_get_string(fluxcal_0));
4451 cpl_propertylist_set_comment(applist,
"FLUXCAL",
4452 cpl_property_get_comment(fluxcal_0));
4453 cpl_propertylist_update_double(applist,
"PHOTZPER", photzper_0);
4454 cpl_propertylist_update_string(applist,
"ZPMETHOD",
4455 cpl_property_get_string(zp_method_0));
4456 cpl_propertylist_set_comment(applist,
"ZPMETHOD",
4457 cpl_property_get_comment(zp_method_0));
4458 cpl_propertylist_update_double(applist,
"ESO DRS EXTCOEF", extcoef_0);
4459 cpl_propertylist_set_comment(applist,
"ESO DRS EXTCOEF",
4460 "[mag] Assumed extinction coefficient");
4465 double fwhm_pix = -1.0;
4466 if (stacked->objects &&
4467 stacked->objects->qclist &&
4468 cpl_propertylist_has(stacked->objects->qclist,
"ESO QC IMAGE_SIZE")) {
4470 fwhm_pix = cpl_propertylist_get_double(stacked->objects->qclist,
4471 "ESO QC IMAGE_SIZE");
4474 if (fwhm_pix != -1.0) {
4475 cpl_propertylist_update_double(applist,
"PSF_FWHM",
4476 fwhm_pix * pixsize);
4477 cpl_propertylist_set_comment(applist,
"PSF_FWHM",
4478 "Average FWHM of stellar objects[arcsec]");
4480 cpl_propertylist_update_double(applist,
"PSF_FWHM",
4481 cpl_property_get_double(jitter_psf_fwhm));
4482 cpl_propertylist_set_comment(applist,
"PSF_FWHM",
4483 cpl_property_get_comment(jitter_psf_fwhm));
4484 fwhm_pix = cpl_property_get_double(jitter_psf_fwhm) / pixsize;
4487 double abmaglim = -1.0;
4489 cpl_propertylist_update_double(applist,
"ABMAGLIM", abmaglim);
4490 cpl_propertylist_set_comment(applist,
"ABMAGLIM",
"5-sigma "
4491 "limiting AB magnitude");
4496 double mean_sky = 0.0;
4497 if (cpl_propertylist_has(stacked->objects->qclist,
"ESO QC MEAN_SKY")) {
4498 mean_sky = cpl_propertylist_get_double(stacked->objects->qclist,
4501 cpl_msg_warning(cpl_func,
"ESO QC MEAN_SKY not found, mean "
4504 double exptime = 1.0;
4505 double abmagsat = -1.0;
4506 if ((CPL_MATH_PI_4 * CPL_MATH_LN2 * (saturation - mean_sky) *
4507 pow(fwhm_pix, 2.0) / exptime) > 0.0) {
4508 abmagsat = photzp_0 - 2.5 * log10(CPL_MATH_PI_4 * CPL_MATH_LN2 *
4509 (saturation - mean_sky) * pow(fwhm_pix, 2.0) / exptime);
4511 cpl_msg_debug(cpl_func,
"abmagsat stack %5.3e %5.3e %5.3e %5.3e %5.3e",
4512 photzp_0, saturation, mean_sky, fwhm_pix, exptime);
4513 cpl_propertylist_update_double(applist,
"ABMAGSAT", abmagsat);
4514 cpl_propertylist_set_comment(applist,
"ABMAGSAT",
"Saturation "
4515 "limit for point sources (AB mag)");
4521 cpl_wcs * stack_wcs = cpl_wcs_new_from_propertylist(stacked->plist);
4526 cpl_propertylist_update_double(applist,
"RA", ra);
4527 cpl_propertylist_update_double(applist,
"DEC", dec);
4529 cpl_wcs_delete(stack_wcs);
4531 enu_check_error_code(
"error set after setting header keywords");
4545 PACKAGE
"/" PACKAGE_VERSION,
4550 cpl_frame * stack_frame = cpl_frame_new();
4551 cpl_frame_set_filename(stack_frame, stack_fname);
4552 cpl_frame_set_tag(stack_frame, ERIS_NIX_IMG_CATALOGUE_PRO_CATG);
4553 cpl_frame_set_type(stack_frame, CPL_FRAME_TYPE_ANY);
4554 cpl_frame_set_group(stack_frame, CPL_FRAME_GROUP_PRODUCT);
4555 cpl_frame_set_level(stack_frame, CPL_FRAME_LEVEL_FINAL);
4556 cpl_frameset_insert(used, stack_frame);
4557 cpl_free(stack_fname);
4562 tablelist = cpl_propertylist_duplicate(stacked->objects->qclist);
4563 cpl_propertylist_copy_property_regexp(tablelist,
4565 "ABMAGLIM|ABMAGSAT|PSF_FWHM|PHOTSYS|"
4571 stacked->objects->catalogue,
4573 "image source catalogue",
4575 PACKAGE
"/" PACKAGE_VERSION,
4577 ERIS_NIX_IMG_CATALOGUE_PRO_CATG);
4582 cpl_propertylist_update_string(applist,
"PRODCATG",
"ANCILLARY.IMAGE");
4591 PACKAGE
"/" PACKAGE_VERSION,
4592 "stack_cat_debug.fits");
4596 cpl_propertylist_delete(applist);
4597 cpl_property_delete(bunit);
4599 cpl_property_delete(fluxcal_0);
4600 cpl_frame_delete(inherit);
4601 cpl_property_delete(jitter_psf_fwhm);
4604 cpl_vector_delete(obsid);
4606 cpl_free(photsys_0);
4607 cpl_free(proto_copy);
4608 cpl_frameset_delete(provenance);
4609 cpl_table_delete(restable);
4613 cpl_propertylist_delete(tablelist);
4614 cpl_wcs_delete(template_wcs);
4615 cpl_frameset_delete(used);
4616 cpl_property_delete(zp_method_0);
4618 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()