39 #include "vircam_utils.h"
40 #include "vircam_mask.h"
41 #include "vircam_pfits.h"
42 #include "vircam_dfs.h"
43 #include "vircam_mods.h"
44 #include "vircam_fits.h"
45 #include "vircam_tfits.h"
46 #include "vircam_jmp_utils.h"
47 #include "vircam_paf.h"
51 static int vircam_jitter_microstep_process_create(cpl_plugin *);
52 static int vircam_jitter_microstep_process_exec(cpl_plugin *);
53 static int vircam_jitter_microstep_process_destroy(cpl_plugin *);
54 static int vircam_jitter_microstep_process(cpl_parameterlist *,
56 static cpl_propertylist *vircam_jitter_microstep_process_dummyqc(
int type);
59 static char vircam_jitter_microstep_process_description[] =
60 "vircam_jitter_microstep_process -- VIRCAM science product recipe.\n\n"
61 "Process a complete pawprint for VIRCAM data. Remove instrumental\n"
62 "signature, interleave microstep sequences (if done), combine jitters\n"
63 "photometrically and astrometrically calibrate the pawprint image\n\n"
64 "The program accepts the following files in the SOF:\n\n"
66 " -----------------------------------------------------------------------\n"
67 " %-21s A list of raw science images or\n"
68 " %-21s A list of raw science images (extended)\n"
69 " %-21s A list of offset sky exposures (optional)\n"
70 " %-21s A master dark frame\n"
71 " %-21s A master twilight flat frame\n"
72 " %-21s A master sky frame (optional)\n"
73 " %-21s A channel table\n"
74 " %-21s A photometric calibration table\n"
75 " %-21s A readnoise/gain file\n"
76 " %-21s A master confidence map or\n"
77 " %-21s A master bad pixel mask\n"
78 " %-21s A master standard star index\n"
79 "All of the above are required\n"
231 int cpl_plugin_get_info(cpl_pluginlist *list) {
232 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
233 cpl_plugin *plugin = &recipe->interface;
234 char alldesc[SZ_ALLDESC];
235 (void)snprintf(alldesc,SZ_ALLDESC,
236 vircam_jitter_microstep_process_description,
237 VIRCAM_SCI_OBJECT_RAW,VIRCAM_SCI_OBJECT_EXT_RAW,
238 VIRCAM_OFFSET_SKY_RAW,VIRCAM_CAL_DARK,
239 VIRCAM_CAL_TWILIGHT_FLAT,VIRCAM_CAL_SKY,VIRCAM_CAL_CHANTAB,
240 VIRCAM_CAL_PHOTTAB,VIRCAM_CAL_READGAINFILE,VIRCAM_CAL_CONF,
241 VIRCAM_CAL_BPM,VIRCAM_CAL_2MASS);
243 cpl_plugin_init(plugin,
245 VIRCAM_BINARY_VERSION,
246 CPL_PLUGIN_TYPE_RECIPE,
247 "vircam_jitter_microstep_process",
248 "VIRCAM jitter microstep recipe",
253 vircam_jitter_microstep_process_create,
254 vircam_jitter_microstep_process_exec,
255 vircam_jitter_microstep_process_destroy);
257 cpl_pluginlist_append(list,plugin);
273 static int vircam_jitter_microstep_process_create(cpl_plugin *plugin) {
279 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
280 recipe = (cpl_recipe *)plugin;
286 recipe->parameters = cpl_parameterlist_new();
290 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.ipix",
292 "Minimum pixel area for each detected object",
293 "vircam.vircam_jitter_microstep_process",5);
294 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ipix");
295 cpl_parameterlist_append(recipe->parameters,p);
299 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.thresh",
301 "Detection threshold in sigma above sky",
302 "vircam.vircam_jitter_microstep_process",2.0);
303 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thr");
304 cpl_parameterlist_append(recipe->parameters,p);
308 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.icrowd",
309 CPL_TYPE_BOOL,
"Use deblending?",
310 "vircam.vircam_jitter_microstep_process",1);
311 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"icrowd");
312 cpl_parameterlist_append(recipe->parameters,p);
316 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.rcore",
317 CPL_TYPE_DOUBLE,
"Value of Rcore in pixels",
318 "vircam.vircam_jitter_microstep_process",3.0);
319 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"rcore");
320 cpl_parameterlist_append(recipe->parameters,p);
324 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.nbsize",
325 CPL_TYPE_INT,
"Background smoothing box size",
326 "vircam.vircam_jitter_microstep_process",64);
327 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"nb");
328 cpl_parameterlist_append(recipe->parameters,p);
332 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.savecat",
333 CPL_TYPE_BOOL,
"Save catalogue?",
334 "vircam.vircam_jitter_microstep_process",1);
335 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"savecat");
336 cpl_parameterlist_append(recipe->parameters,p);
341 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.destripe",
342 CPL_TYPE_BOOL,
"Destripe images?",
343 "vircam.vircam_jitter_microstep_process",1);
344 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"destripe");
345 cpl_parameterlist_append(recipe->parameters,p);
349 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.skycor",
350 CPL_TYPE_BOOL,
"Do a sky subtraction?",
351 "vircam.vircam_jitter_microstep_process",1);
352 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"skycor");
353 cpl_parameterlist_append(recipe->parameters,p);
357 p = cpl_parameter_new_value(
"vircam.vircam_jitter_microstep_process.savesimple",
358 CPL_TYPE_BOOL,
"Save simple images?",
359 "vircam.vircam_jitter_microstep_process",0);
360 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"savesimple");
361 cpl_parameterlist_append(recipe->parameters,p);
365 p = cpl_parameter_new_range(
"vircam.vircam_jitter_microstep_process.extenum",
367 "Extension number to be done, 0 == all",
368 "vircam.vircam_jitter_microstep_process",
370 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
371 cpl_parameterlist_append(recipe->parameters,p);
387 static int vircam_jitter_microstep_process_exec(cpl_plugin *plugin) {
392 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
393 recipe = (cpl_recipe *)plugin;
397 return(vircam_jitter_microstep_process(recipe->parameters,recipe->frames));
408 static int vircam_jitter_microstep_process_destroy(cpl_plugin *plugin) {
413 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
414 recipe = (cpl_recipe *)plugin;
418 cpl_parameterlist_delete(recipe->parameters);
431 static int vircam_jitter_microstep_process(cpl_parameterlist *parlist,
432 cpl_frameset *framelist) {
433 const char *fctid=
"vircam_jitter_microstep_process";
435 int jst,jfn,status,j,i,retval,nusteps,isconf,live,ndit;
437 float readnoise,gain,gaincor_fac;
440 cpl_propertylist *pp;
444 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
445 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
452 cpl_msg_error(fctid,
"Input frameset is missing files. Check SOF");
459 (void)strncpy(vircam_recipename,fctid,VIRCAM_PATHSZ);
460 (void)snprintf(vircam_recipepaf,VIRCAM_PATHSZ,
"VIRCAM/%s",fctid);
465 p = cpl_parameterlist_find(parlist,
466 "vircam.vircam_jitter_microstep_process.ipix");
467 vircam_jmp_config.ipix = cpl_parameter_get_int(p);
468 p = cpl_parameterlist_find(parlist,
469 "vircam.vircam_jitter_microstep_process.thresh");
470 vircam_jmp_config.threshold = (float)cpl_parameter_get_double(p);
471 p = cpl_parameterlist_find(parlist,
472 "vircam.vircam_jitter_microstep_process.icrowd");
473 vircam_jmp_config.icrowd = cpl_parameter_get_bool(p);
474 p = cpl_parameterlist_find(parlist,
475 "vircam.vircam_jitter_microstep_process.rcore");
476 vircam_jmp_config.rcore = (float)cpl_parameter_get_double(p);
477 p = cpl_parameterlist_find(parlist,
478 "vircam.vircam_jitter_microstep_process.nbsize");
479 vircam_jmp_config.nbsize = cpl_parameter_get_int(p);
480 p = cpl_parameterlist_find(parlist,
481 "vircam.vircam_jitter_microstep_process.savecat");
482 vircam_jmp_config.savecat = cpl_parameter_get_bool(p);
483 p = cpl_parameterlist_find(parlist,
484 "vircam.vircam_jitter_microstep_process.destripe");
485 vircam_jmp_config.destripe = cpl_parameter_get_bool(p);
486 p = cpl_parameterlist_find(parlist,
487 "vircam.vircam_jitter_microstep_process.skycor");
488 vircam_jmp_config.skycor = cpl_parameter_get_bool(p);
489 p = cpl_parameterlist_find(parlist,
490 "vircam.vircam_jitter_microstep_process.savesimple");
491 vircam_jmp_config.savesimple = cpl_parameter_get_bool(p);
492 p = cpl_parameterlist_find(parlist,
493 "vircam.vircam_jitter_microstep_process.extenum");
494 vircam_jmp_config.extenum = cpl_parameter_get_int(p);
499 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
508 cpl_msg_error(fctid,
"Cannot labelise the input frames");
515 if ((ps.science_frames =
517 VIRCAM_SCI_OBJECT_RAW)) == NULL) {
518 if ((ps.science_frames =
520 VIRCAM_SCI_OBJECT_EXT_RAW)) == NULL) {
521 cpl_msg_error(fctid,
"No science images to process!");
530 VIRCAM_CAL_SKY)) == NULL) {
531 if ((ps.offset_skies =
533 VIRCAM_OFFSET_SKY_RAW)) == NULL)
543 if ((ps.master_dark =
545 VIRCAM_CAL_DARK)) == NULL) {
546 cpl_msg_error(fctid,
"No master dark found");
553 if ((ps.master_twilight_flat =
555 VIRCAM_CAL_TWILIGHT_FLAT)) == NULL) {
556 cpl_msg_error(fctid,
"No master twilight flat found");
565 &status) != VIR_OK) {
566 cpl_msg_error(fctid,
"Error calculating gain corrections");
573 if ((ps.readgain_file =
575 VIRCAM_CAL_READGAINFILE)) == NULL) {
576 cpl_msg_error(fctid,
"No master readnoise/gain file found");
586 if ((ps.master_conf =
588 VIRCAM_CAL_CONF)) == NULL) {
590 if ((ps.master_conf =
592 VIRCAM_CAL_BPM)) == NULL) {
593 cpl_msg_error(fctid,
"No master confidence map found");
603 VIRCAM_CAL_CHANTAB)) == NULL) {
604 cpl_msg_error(fctid,
"No channel table found");
612 VIRCAM_CAL_PHOTTAB)) == NULL) {
613 cpl_msg_error(fctid,
"No photometric table found");
617 if ((ps.tphottab = cpl_table_load(cpl_frame_get_filename(ps.phottab),1,0)) == NULL) {
618 cpl_msg_error(fctid,
"Unable to load photometric table");
626 VIRCAM_CAL_2MASS)) == NULL) {
627 cpl_msg_info(fctid,
"No 2MASS index found -- cannot continue");
634 if (
vircam_catpars(catindex,&(ps.catpath),&(ps.catname)) == VIR_FATAL) {
636 cpl_frame_delete(catindex);
639 cpl_frame_delete(catindex);
643 (void)strcpy(current_catpath,ps.catpath);
644 (void)strcpy(current_cat,ps.catname);
648 pp = cpl_propertylist_load(cpl_frame_get_filename(cpl_frameset_get_frame(ps.science_frames,0)),0);
650 cpl_msg_error(fctid,
"No value for NDIT available");
651 freepropertylist(pp);
655 cpl_propertylist_delete(pp);
662 (
const cpl_frame *)cpl_frameset_get_frame(ps.science_frames,0),
664 if (jst == -1 || jfn == -1) {
665 cpl_msg_error(fctid,
"Unable to continue");
673 for (j = jst; j <= jfn; j++) {
674 isfirst = (j == jst);
675 gaincor_fac = (ps.gaincors)[j-1];
676 cpl_msg_info(fctid,
"Beginning extension [%" CPL_SIZE_FORMAT
"]",
683 if (ps.fdark == NULL) {
685 "Error loading master dark %s[%" CPL_SIZE_FORMAT
"]\n%s",
686 cpl_frame_get_filename(ps.master_dark),(cpl_size)j,
687 cpl_error_get_message());
692 if (ps.fflat == NULL) {
694 "Error loading master flat %s[%" CPL_SIZE_FORMAT
"]\n%s",
695 cpl_frame_get_filename(ps.master_twilight_flat),
696 (cpl_size)j,cpl_error_get_message());
701 if (ps.fconf == NULL) {
703 "Error loading master conf %s[%" CPL_SIZE_FORMAT
"]\n%s",
704 cpl_frame_get_filename(ps.master_conf),(cpl_size)j,
705 cpl_error_get_message());
715 "Error loading mask from master conf %s[%" CPL_SIZE_FORMAT
"]\n%s",
716 cpl_frame_get_filename(ps.master_conf),(cpl_size)j,
717 cpl_error_get_message());
723 if (ps.fsky == NULL) {
725 "Error loading master sky %s[%" CPL_SIZE_FORMAT
"]\n%s",
726 cpl_frame_get_filename(ps.master_sky),(cpl_size)j,
727 cpl_error_get_message());
733 if (ps.fchantab == NULL) {
735 "Error loading channel table %s[%" CPL_SIZE_FORMAT
"]\n%s",
736 cpl_frame_get_filename(ps.chantab),(cpl_size)j,
737 cpl_error_get_message());
744 ps.nscience = cpl_frameset_get_size(ps.science_frames);
746 if (ps.sci_fits == NULL) {
748 "Error loading science frames extension %" CPL_SIZE_FORMAT
": %s",
749 (cpl_size)j,cpl_error_get_message());
761 ps.noffsets = cpl_frameset_get_size(ps.offset_skies);
764 if (ps.offsky_fits == NULL) {
766 "Error loading offset skies extension %" CPL_SIZE_FORMAT
": %s",
767 (cpl_size)j,cpl_error_get_message());
773 ps.offsky_fits = NULL;
780 for (i = 0; i < ps.nscience; i++) {
787 cpl_msg_error(fctid,
"Unable to correct CRVAL in %s",
793 for (i = 0; i < ps.noffsets; i++) {
794 ff = ps.offsky_fits[i];
807 cpl_msg_info(fctid,
"Doing stage1 corrections");
808 for (i = 0; i < ps.nscience; i++) {
813 "[e-] Readnoise used in processing");
816 "[e-/adu] Gain used in processing");
818 cpl_msg_info(fctid,
"Detector is flagged dead in %s",
830 for (i = 0; i < ps.noffsets; i++) {
831 ff = ps.offsky_fits[i];
833 cpl_msg_info(fctid,
"Detector is flagged dead in %s",
848 if (vircam_jmp_config.skycor) {
849 cpl_msg_info(fctid,
"Doing sky correction");
852 for (i = 0; i < ps.nscience; i++) {
854 cpl_propertylist_update_string(pp,
"ESO DRS SKYCOR",
"none");
855 cpl_propertylist_set_comment(pp,
"ESO DRS SKYCOR",
856 "Sky correction method");
862 if (vircam_jmp_config.destripe) {
863 for (i = 0; i < ps.nscience; i++) {
868 for (i = 0; i < ps.noffsets; i++) {
869 ff = ps.offsky_fits[i];
881 if (retval != VIR_OK) {
882 cpl_msg_warning(fctid,
"Unable to get nusteps from header.\nAssuming no microstepping");
892 cpl_msg_info(fctid,
"No interleaving will be done");
894 cpl_msg_warning(fctid,
"Illegal number of microsteps: %" CPL_SIZE_FORMAT
"\nNo interleaving will be done",
896 ps.dith_input = cpl_malloc(ps.nscience*
sizeof(vir_fits *));
897 ps.dithc_input = cpl_malloc(
sizeof(vir_fits *));
898 for (i = 0; i < ps.nscience; i++) {
900 ps.dith_input[ps.ndith++] = ps.sci_fits[i];
902 ps.dithc_input[0] = ps.fconf;
911 cpl_msg_info(fctid,
"Interleaving");
918 cpl_msg_info(fctid,
"Working out jitter offsets");
920 cpl_msg_info(fctid,
"Stacking jittered frame");
925 cpl_msg_info(fctid,
"Doing object extraction");
930 cpl_msg_info(fctid,
"Matching objects with 2mass standards");
935 cpl_msg_info(fctid,
"Fitting a WCS");
940 cpl_msg_info(fctid,
"Doing photometric zeropoint calculation");
945 if (vircam_jmp_config.savesimple) {
946 cpl_msg_info(fctid,
"Saving simple images");
953 if (vircam_jmp_config.savesimple) {
954 cpl_msg_info(fctid,
"Saving offset sky simple images");
960 cpl_msg_info(fctid,
"Saving mean offset sky image");
971 cpl_msg_info(fctid,
"Saving superframe images");
980 cpl_msg_info(fctid,
"Saving stacked image");
981 dummyqc = vircam_jitter_microstep_process_dummyqc(1);
984 freepropertylist(dummyqc);
987 freepropertylist(dummyqc);
988 if (vircam_jmp_config.savecat) {
989 cpl_msg_info(fctid,
"Saving stacked image catalogue");
990 dummyqc = vircam_jitter_microstep_process_dummyqc(2);
993 freepropertylist(dummyqc);
996 freepropertylist(dummyqc);
1010 static cpl_propertylist *vircam_jitter_microstep_process_dummyqc(
int type) {
1011 cpl_propertylist *p;
1015 p = cpl_propertylist_new();
1024 cpl_propertylist_update_double(p,
"ESO QC WCS_DCRVAL1",0.0);
1025 cpl_propertylist_set_comment(p,
"ESO QC WCS_DCRVAL1",
1026 "[deg] change in crval1");
1027 cpl_propertylist_update_double(p,
"ESO QC WCS_DCRVAL2",0.0);
1028 cpl_propertylist_set_comment(p,
"ESO QC WCS_DCRVAL2",
1029 "[deg] change in crval2");
1030 cpl_propertylist_update_double(p,
"ESO QC WCS_DTHETA",0.0);
1031 cpl_propertylist_set_comment(p,
"ESO QC WCS_DTHETA",
1032 "[deg] change in rotation");
1033 cpl_propertylist_update_double(p,
"ESO QC WCS_SCALE",0.0);
1034 cpl_propertylist_set_comment(p,
"ESO QC WCS_SCALE",
1035 "[arcsec] mean plate scale");
1036 cpl_propertylist_update_double(p,
"ESO QC WCS_SHEAR",0.0);
1037 cpl_propertylist_set_comment(p,
"ESO QC WCS_SHEAR",
1038 "[deg] abs(xrot) - abs(yrot)");
1039 cpl_propertylist_update_double(p,
"ESO QC WCS_RMS",0.0);
1040 cpl_propertylist_set_comment(p,
"ESO QC WCS_RMS",
1041 "[arcsec] Average error in WCS fit");
1042 cpl_propertylist_update_float(p,
"ESO QC MAGZPT",0.0);
1043 cpl_propertylist_set_comment(p,
"ESO QC MAGZPT",
1044 "[mag] photometric zeropoint");
1045 cpl_propertylist_update_float(p,
"ESO QC MAGZERR",0.0);
1046 cpl_propertylist_set_comment(p,
"ESO QC MAGZERR",
1047 "[mag] photometric zeropoint error");
1048 cpl_propertylist_update_int(p,
"ESO QC MAGNZPT",0);
1049 cpl_propertylist_set_comment(p,
"ESO QC MAGNZPT",
1050 "number of stars in magzpt calc");
1051 cpl_propertylist_update_int(p,
"ESO QC MAGNCUT",0);
1052 cpl_propertylist_set_comment(p,
"ESO QC MAGNCUT",
1053 "number of stars cut from magzpt calc");
1054 cpl_propertylist_update_float(p,
"ESO QC LIMITING_MAG",0.0);
1055 cpl_propertylist_set_comment(p,
"ESO QC LIMITING_MAG",
1056 "[mag] 5 sigma limiting mag");
1062 cpl_propertylist_update_float(p,
"ESO QC SATURATION",0.0);
1063 cpl_propertylist_set_comment(p,
"ESO QC SATURATION",
1064 "[adu] Saturation level");
1065 cpl_propertylist_update_float(p,
"ESO QC MEAN_SKY",0.0);
1066 cpl_propertylist_set_comment(p,
"ESO QC MEAN_SKY",
1067 "[adu] Median sky brightness");
1068 cpl_propertylist_update_float(p,
"ESO QC SKY_NOISE",0.0);
1069 cpl_propertylist_set_comment(p,
"ESO QC SKY_NOISE",
1070 "[adu] Pixel noise at sky level");
1071 cpl_propertylist_update_float(p,
"ESO QC IMAGE_SIZE",0.0);
1072 cpl_propertylist_set_comment(p,
"ESO QC IMAGE_SIZE",
1073 "[pixels] Average FWHM of stellar objects")
1075 cpl_propertylist_update_float(p,
"ESO QC ELLIPTICITY",0.0);
1076 cpl_propertylist_set_comment(p,
"ESO QC ELLIPTICITY",
1077 "Average stellar ellipticity (1-b/a)");
1078 cpl_propertylist_update_float(p,
"ESO QC APERTURE_CORR",0.0);
1079 cpl_propertylist_set_comment(p,
"ESO QC APERTURE_CORR",
1080 "Stellar ap-corr 1x core flux");
1081 cpl_propertylist_update_int(p,
"ESO QC NOISE_OBJ",0);
1082 cpl_propertylist_set_comment(p,
"ESO QC NOISE_OBJ",
1083 "Number of noise objects");