38#include <casu_utils.h>
41#include <casu_stats.h>
42#include <casu_wcsutils.h>
44#include "vircam_utils.h"
45#include "vircam_pfits.h"
46#include "vircam_dfs.h"
47#include "vircam_mods.h"
48#include "vircam_channel.h"
49#include "vircam_paf.h"
59static int vircam_dome_flat_combine_create(cpl_plugin *) ;
60static int vircam_dome_flat_combine_exec(cpl_plugin *) ;
61static int vircam_dome_flat_combine_destroy(cpl_plugin *) ;
62static int vircam_dome_flat_combine(cpl_parameterlist *, cpl_frameset *) ;
63static int vircam_dome_flat_combine_save(cpl_frameset *framelist,
64 cpl_parameterlist *parlist);
65static void vircam_dome_flat_combine_dummy_products(
void);
66static void vircam_dome_flat_combine_normal(
int jext);
67static int vircam_dome_flat_combine_lastbit(
int jext, cpl_frameset *framelist,
68 cpl_parameterlist *parlist);
69static void vircam_dome_flat_combine_init(
void);
70static void vircam_dome_flat_combine_tidy(
int level);
96} vircam_dome_flat_combine_config;
101 cpl_frameset *domelist;
102 cpl_frame *master_dark;
103 cpl_frame *master_dome_flat;
107 casu_mask *master_mask;
111 cpl_propertylist *drs;
112 unsigned char *rejmask;
113 unsigned char *rejplus;
118 cpl_table *ratioimstats;
119 cpl_propertylist *phupaf;
123static cpl_frame *product_frame_mean_dome = NULL;
124static cpl_frame *product_frame_ratioimg = NULL;
125static cpl_frame *product_frame_ratioimg_stats = NULL;
129static char vircam_dome_flat_combine_description[] =
130"vircam_dome_flat_combine -- VIRCAM dome flat combine recipe.\n\n"
131"Combine a list of dome flat frames into a mean frame. Optionally compare \n"
132"the output frame to a master dome flat frame\n\n"
133"The program accepts the following files in the SOF:\n\n"
135" -----------------------------------------------------------------------\n"
136" %-21s A list of raw dome flat images\n"
137" %-21s A master dark frame\n"
138" %-21s Optional reference dome flat frame\n"
139" %-21s Optional channel table or\n"
140" %-21s Optional initial channel table\n"
141" %-21s Optional master bad pixel map or\n"
142" %-21s Optional master confidence map\n"
143"If no master dome flat is made available, then no comparison will be done\n"
144"This means there will be no output ratio image. If a master dome is\n"
145"available, but no channel table is, then a ratio image will be formed\n"
146"but no stats will be written."
294int cpl_plugin_get_info(cpl_pluginlist *list) {
295 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
296 cpl_plugin *plugin = &recipe->interface;
297 char alldesc[SZ_ALLDESC];
298 (void)snprintf(alldesc,SZ_ALLDESC,vircam_dome_flat_combine_description,
299 VIRCAM_DOME_RAW,VIRCAM_CAL_DARK,VIRCAM_REF_DOME_FLAT,
300 VIRCAM_CAL_CHANTAB,VIRCAM_CAL_CHANTAB_INIT,VIRCAM_CAL_BPM,
303 cpl_plugin_init(plugin,
305 VIRCAM_BINARY_VERSION,
306 CPL_PLUGIN_TYPE_RECIPE,
307 "vircam_dome_flat_combine",
308 "VIRCAM dome flat combination recipe",
313 vircam_dome_flat_combine_create,
314 vircam_dome_flat_combine_exec,
315 vircam_dome_flat_combine_destroy);
317 cpl_pluginlist_append(list,plugin);
333static int vircam_dome_flat_combine_create(cpl_plugin *plugin) {
339 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
340 recipe = (cpl_recipe *)plugin;
346 recipe->parameters = cpl_parameterlist_new();
350 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.lthr",
352 "Low rejection threshold for underexpsed images",
353 "vircam.vircam_dome_flat_combine",
355 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"lthr");
356 cpl_parameterlist_append(recipe->parameters,p);
360 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.hthr",
362 "High rejection threshold for overexposed images",
363 "vircam.vircam_dome_flat_combine",
365 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"hthr");
366 cpl_parameterlist_append(recipe->parameters,p);
370 p = cpl_parameter_new_range(
"vircam.vircam_dome_flat_combine.combtype",
372 "1 == Median,\n 2 == Mean",
373 "vircam.vircam_dome_flat_combine",
375 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"combtype");
376 cpl_parameterlist_append(recipe->parameters,p);
380 p = cpl_parameter_new_range(
"vircam.vircam_dome_flat_combine.scaletype",
382 "0 == none,\n 1 == additive offset,\n 2 == multiplicative offset,\n 3 == exposure time scaling + additive offset",
383 "vircam.vircam_dome_flat_combine",
385 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"scaletype");
386 cpl_parameterlist_append(recipe->parameters,p);
390 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.xrej",
392 "True if using extra rejection cycle",
393 "vircam.vircam_dome_flat_combine",
395 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"xrej");
396 cpl_parameterlist_append(recipe->parameters,p);
400 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.thresh",
402 "Rejection threshold in sigma above background",
403 "vircam.vircam_dome_flat_combine",5.0);
404 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thresh");
405 cpl_parameterlist_append(recipe->parameters,p);
409 p = cpl_parameter_new_enum(
"vircam.vircam_dome_flat_combine.ncells",
411 "Number of cells for data channel stats",
412 "vircam.vircam_dome_flat_combine",8,7,1,2,4,8,
414 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ncells");
415 cpl_parameterlist_append(recipe->parameters,p);
419 p = cpl_parameter_new_range(
"vircam.vircam_dome_flat_combine.extenum",
421 "Extension number to be done, 0 == all",
422 "vircam.vircam_dome_flat_combine",
424 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
425 cpl_parameterlist_append(recipe->parameters,p);
441static int vircam_dome_flat_combine_exec(cpl_plugin *plugin) {
446 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
447 recipe = (cpl_recipe *)plugin;
451 return(vircam_dome_flat_combine(recipe->parameters,recipe->frames));
462static int vircam_dome_flat_combine_destroy(cpl_plugin *plugin) {
467 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
468 recipe = (cpl_recipe *)plugin;
472 cpl_parameterlist_delete(recipe->parameters);
485static int vircam_dome_flat_combine(cpl_parameterlist *parlist,
486 cpl_frameset *framelist) {
487 const char *fctid=
"vircam_dome_flat_combine";
488 int j,jst,jfn,retval,status,live,nx,ny,ndit;
492 cpl_propertylist *pp;
497 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
498 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
504 vircam_dome_flat_combine_init();
505 we_expect = MEANDOME;
509 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.lthr");
510 vircam_dome_flat_combine_config.lthr = (float)cpl_parameter_get_double(p);
511 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.hthr");
512 vircam_dome_flat_combine_config.hthr = (float)cpl_parameter_get_double(p);
513 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.combtype");
514 vircam_dome_flat_combine_config.combtype = cpl_parameter_get_int(p);
515 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.scaletype");
516 vircam_dome_flat_combine_config.scaletype = cpl_parameter_get_int(p);
517 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.xrej");
518 vircam_dome_flat_combine_config.xrej = cpl_parameter_get_bool(p);
519 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.thresh");
520 vircam_dome_flat_combine_config.thresh = (float)cpl_parameter_get_double(p);
521 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.ncells");
522 vircam_dome_flat_combine_config.ncells = cpl_parameter_get_int(p);
523 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.extenum");
524 vircam_dome_flat_combine_config.extenum = cpl_parameter_get_int(p);
529 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
530 vircam_dome_flat_combine_tidy(2);
538 cpl_msg_error(fctid,
"Cannot labelise the input frames");
539 vircam_dome_flat_combine_tidy(2);
543 VIRCAM_DOME_RAW)) == NULL) {
544 cpl_msg_error(fctid,
"Cannot find dome frames in input frameset");
545 vircam_dome_flat_combine_tidy(2);
548 ps.ndomes = cpl_frameset_get_size(ps.domelist);
553 VIRCAM_CAL_DARK)) == NULL) {
554 cpl_msg_error(fctid,
"No master dark found");
555 vircam_dome_flat_combine_tidy(2);
562 nlab,VIRCAM_REF_DOME_FLAT)) == NULL)
563 cpl_msg_info(fctid,
"No master dome flat found -- no ratio image will be formed");
576 VIRCAM_CAL_CHANTAB)) == NULL) {
578 VIRCAM_CAL_CHANTAB_INIT)) == NULL) {
579 cpl_msg_info(fctid,
"No channel table found -- no ratio image stats and no linearisation will be done");
581 cpl_msg_info(fctid,
"Channel table is labelled INIT -- no linearisation will be done");
582 if (we_expect & RATIMG)
583 we_expect |= STATS_TAB;
585 }
else if (we_expect & RATIMG) {
586 we_expect |= STATS_TAB;
594 (
const cpl_frame *)cpl_frameset_get_position(ps.domelist,0),
596 if (jst == -1 || jfn == -1) {
597 cpl_msg_error(fctid,
"Unable to continue");
598 vircam_dome_flat_combine_tidy(2);
604 pp = cpl_propertylist_load(cpl_frame_get_filename(cpl_frameset_get_position(ps.domelist,0)),0);
606 cpl_msg_error(fctid,
"No value for NDIT available");
607 freepropertylist(pp);
608 vircam_dome_flat_combine_tidy(2);
611 cpl_propertylist_delete(pp);
615 ps.good = cpl_malloc(ps.ndomes*
sizeof(casu_fits *));
619 for (j = jst; j <= jfn; j++) {
622 isfirst = (j == jst);
627 if (ps.domes == NULL) {
629 "Extension %" CPL_SIZE_FORMAT
" domes wouldn't load",
631 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
640 for (i = 0; i < ps.ndomes; i++) {
644 cpl_msg_info(fctid,
"Detector flagged dead %s",
648 ps.good[ps.ngood] = ff;
657 cpl_msg_info(fctid,
"All images flagged bad for this extension");
658 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
670 "Unable to load mask image %s[%" CPL_SIZE_FORMAT
"]",
672 cpl_msg_info(fctid,
"Forcing all pixels to be good from now on");
679 vircam_dome_flat_combine_config.lthr,
680 vircam_dome_flat_combine_config.hthr,0,
681 &(vircam_dome_flat_combine_config.minv),
682 &(vircam_dome_flat_combine_config.maxv),
683 &(vircam_dome_flat_combine_config.avev));
689 cpl_msg_info(fctid,
"All images either under or overexposed");
690 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
700 if (ps.mdark == NULL) {
702 "Can't load master dark for extension %" CPL_SIZE_FORMAT,
704 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
710 "Can't master dark extension %" CPL_SIZE_FORMAT
" is a dummy",
712 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
720 cpl_msg_info(fctid,
"Dark correcting extension %" CPL_SIZE_FORMAT,
722 for (i = 0; i < ps.ngood; i++)
728 if (ps.chantab != NULL) {
730 if (ps.ctable == NULL) {
732 "Channel table extension %" CPL_SIZE_FORMAT
" won't load",
736 "Channel table extension %" CPL_SIZE_FORMAT
" has errors",
738 freetfits(ps.ctable);
740 pp = cpl_propertylist_load(cpl_frame_get_filename(ps.chantab),
744 "Channel table extensions %" CPL_SIZE_FORMAT
" is a dummy",
746 freetfits(ps.ctable);
748 freepropertylist(pp);
756 if (ps.ctable != NULL) {
757 cpl_msg_info(fctid,
"Linearising extension %" CPL_SIZE_FORMAT,
759 for (i = 0; i < ps.ngood; i++)
765 for (i = 0; i < ps.ngood; i++)
766 (
void)
casu_nditcor((ps.good)[i],ndit,
"EXPTIME",&status);
770 cpl_msg_info(fctid,
"Doing combination for extension %" CPL_SIZE_FORMAT,
773 vircam_dome_flat_combine_config.combtype,
774 vircam_dome_flat_combine_config.scaletype,
775 vircam_dome_flat_combine_config.xrej,
776 vircam_dome_flat_combine_config.thresh,
"EXPTIME",
777 &(ps.outimage),NULL,&(ps.rejmask),&(ps.rejplus),
783 if (status == CASU_OK) {
785 vircam_dome_flat_combine_normal(j);
787 cpl_msg_info(fctid,
"A processing step failed");
792 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
797 vircam_dome_flat_combine_tidy(2);
811static int vircam_dome_flat_combine_save(cpl_frameset *framelist,
812 cpl_parameterlist *parlist) {
813 cpl_propertylist *plist,*elist,*p,*paf;
815 const char *fctid =
"vircam_dome_flat_combine_save";
816 const char *outfile =
"domecomb.fits";
817 const char *outdiff =
"domeratio.fits";
818 const char *outdimst =
"domeratiotab.fits";
819 const char *outpaf =
"domecomb";
820 const char *outdpaf =
"domeratio";
821 const char *recipeid =
"vircam_dome_flat_combine";
830 product_frame_mean_dome = cpl_frame_new();
831 cpl_frame_set_filename(product_frame_mean_dome,outfile);
832 cpl_frame_set_tag(product_frame_mean_dome,VIRCAM_PRO_DOME_FLAT);
833 cpl_frame_set_type(product_frame_mean_dome,CPL_FRAME_TYPE_IMAGE);
834 cpl_frame_set_group(product_frame_mean_dome,CPL_FRAME_GROUP_PRODUCT);
835 cpl_frame_set_level(product_frame_mean_dome,CPL_FRAME_LEVEL_FINAL);
840 ps.phupaf = vircam_paf_phu_items(plist);
841 if (ps.master_dome_flat != NULL) {
842 cpl_propertylist_update_string(ps.phupaf,
"REF_DOME",
843 cpl_frame_get_filename(ps.master_dome_flat));
844 cpl_propertylist_set_comment(ps.phupaf,
"REF_DOME",
845 "Reference dome flat used");
854 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
855 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
856 cpl_msg_error(fctid,
"Cannot save product PHU");
857 cpl_frame_delete(product_frame_mean_dome);
860 cpl_frameset_insert(framelist,product_frame_mean_dome);
864 if (we_expect & RATIMG) {
865 product_frame_ratioimg = cpl_frame_new();
866 cpl_frame_set_filename(product_frame_ratioimg,outdiff);
867 cpl_frame_set_tag(product_frame_ratioimg,
868 VIRCAM_PRO_RATIOIMG_DOME_FLAT);
869 cpl_frame_set_type(product_frame_ratioimg,CPL_FRAME_TYPE_IMAGE);
870 cpl_frame_set_group(product_frame_ratioimg,
871 CPL_FRAME_GROUP_PRODUCT);
872 cpl_frame_set_level(product_frame_ratioimg,CPL_FRAME_LEVEL_FINAL);
884 if (cpl_image_save(NULL,outdiff,CPL_TYPE_UCHAR,plist,
885 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
886 cpl_msg_error(fctid,
"Cannot save product PHU");
887 cpl_frame_delete(product_frame_ratioimg);
890 cpl_frameset_insert(framelist,product_frame_ratioimg);
896 if (we_expect & STATS_TAB) {
897 product_frame_ratioimg_stats = cpl_frame_new();
898 cpl_frame_set_filename(product_frame_ratioimg_stats,outdimst);
899 cpl_frame_set_tag(product_frame_ratioimg_stats,
900 VIRCAM_PRO_RATIOIMG_DOME_FLAT_STATS);
901 cpl_frame_set_type(product_frame_ratioimg_stats,
902 CPL_FRAME_TYPE_TABLE);
903 cpl_frame_set_group(product_frame_ratioimg_stats,
904 CPL_FRAME_GROUP_PRODUCT);
905 cpl_frame_set_level(product_frame_ratioimg_stats,
906 CPL_FRAME_LEVEL_FINAL);
912 product_frame_ratioimg_stats,
920 p = cpl_propertylist_duplicate(elist);
923 "ESO INS FILT1 NAME");
924 if (! (we_get & STATS_TAB))
934 if (cpl_table_save(ps.ratioimstats,plist,p,outdimst,
935 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
936 cpl_msg_error(fctid,
"Cannot save product table extension");
937 cpl_propertylist_delete(p);
940 cpl_propertylist_delete(p);
941 cpl_frameset_insert(framelist,product_frame_ratioimg_stats);
948 cpl_propertylist_update_int(plist,
"ESO PRO DATANCOM",ps.ngood);
953 p = cpl_propertylist_duplicate(plist);
954 if (! (we_get & MEANDOME))
963 cpl_propertylist_update_float(p,
"ESO QC FLATRMS",
964 vircam_dome_flat_combine_config.flatrms);
965 cpl_propertylist_set_comment(p,
"ESO QC FLATRMS",
"RMS of output flat");
966 cpl_propertylist_update_float(p,
"ESO QC FLATMIN",
967 vircam_dome_flat_combine_config.minv);
968 cpl_propertylist_set_comment(p,
"ESO QC FLATMIN",
"Ensemble minimum");
969 cpl_propertylist_update_float(p,
"ESO QC FLATMAX",
970 vircam_dome_flat_combine_config.maxv);
971 cpl_propertylist_set_comment(p,
"ESO QC FLATMAX",
"Ensemble maximum");
972 cpl_propertylist_update_float(p,
"ESO QC FLATAVG",
973 vircam_dome_flat_combine_config.avev);
974 cpl_propertylist_set_comment(p,
"ESO QC FLATAVG",
"Ensemble average");
975 val = vircam_dome_flat_combine_config.maxv -
976 vircam_dome_flat_combine_config.minv;
977 cpl_propertylist_update_float(p,
"ESO QC FLATRNG",val);
978 cpl_propertylist_set_comment(p,
"ESO QC FLATRNG",
"Ensemble range");
979 if (cpl_image_save(ps.outimage,outfile,CPL_TYPE_FLOAT,p,
980 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
981 cpl_propertylist_delete(p);
982 cpl_msg_error(fctid,
"Cannot save product image extension");
988 paf = vircam_paf_req_items(p);
991 "ESO INS FILT1 NAME");
992 vircam_paf_append(paf,p,
"ESO PRO CATG");
993 vircam_paf_append(paf,p,
"ESO PRO DATANCOM");
994 if (vircam_paf_print((
char *)outpaf,
"VIRCAM/vircam_dome_flat_combine",
995 "QC file",paf) != CASU_OK)
996 cpl_msg_warning(fctid,
"Unable to save PAF for mean dome");
997 cpl_propertylist_delete(paf);
998 cpl_propertylist_delete(p);
1002 if (we_expect & RATIMG) {
1003 p = cpl_propertylist_duplicate(plist);
1004 if (! (we_get & RATIMG))
1006 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_MED",
1007 vircam_dome_flat_combine_config.flatratio_med);
1008 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_MED",
1009 "Median of ratio map");
1010 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_RMS",
1011 vircam_dome_flat_combine_config.flatratio_rms);
1012 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_RMS",
1013 "RMS of ratio map");
1018 if (cpl_image_save(ps.ratioimg,outdiff,CPL_TYPE_FLOAT,p,
1019 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1020 cpl_propertylist_delete(p);
1021 cpl_msg_error(fctid,
"Cannot save product image extension");
1027 paf = vircam_paf_req_items(p);
1030 "ESO INS FILT1 NAME");
1031 vircam_paf_append(paf,p,
"ESO PRO CATG");
1032 if (vircam_paf_print((
char *)outdpaf,
"VIRCAM/vircam_dome_flat_combine",
1033 "QC file",paf) != CASU_OK)
1034 cpl_msg_warning(fctid,
"Unable to save PAF for ratio image");
1035 cpl_propertylist_delete(paf);
1036 cpl_propertylist_delete(p);
1041 if (! isfirst && (we_expect & STATS_TAB)) {
1042 p = cpl_propertylist_duplicate(plist);
1043 if (! (we_get & STATS_TAB))
1050 if (cpl_table_save(ps.ratioimstats,NULL,p,outdimst,CPL_IO_EXTEND)
1051 != CPL_ERROR_NONE) {
1052 cpl_propertylist_delete(p);
1053 cpl_msg_error(fctid,
"Cannot save product table extension");
1056 cpl_propertylist_delete(p);
1070static void vircam_dome_flat_combine_dummy_products(
void) {
1074 if (we_get == we_expect)
1079 if (! (we_get & MEANDOME)) {
1081 vircam_dome_flat_combine_config.flatrms = 0.0;
1086 if ((we_expect & RATIMG) && ! (we_get & RATIMG)) {
1087 vircam_dome_flat_combine_config.flatratio_med = 0.0;
1088 vircam_dome_flat_combine_config.flatratio_rms = 0.0;
1094 if ((we_expect & STATS_TAB) && ! (we_get & STATS_TAB))
1107static void vircam_dome_flat_combine_normal(
int jext) {
1111 float *idata,med,sig,gdiff,grms;
1112 const char *fctid=
"vircam_dome_flat_combine_normal";
1116 nx = (int)cpl_image_get_size_x(ps.outimage);
1117 ny = (int)cpl_image_get_size_y(ps.outimage);
1123 idata = cpl_image_get_data(ps.outimage);
1128 cpl_image_divide_scalar(ps.outimage,med);
1131 vircam_dome_flat_combine_config.flatrms = sig;
1135 if (ps.master_dome_flat != NULL) {
1136 ps.mfimage =
casu_fits_load(ps.master_dome_flat,CPL_TYPE_FLOAT,jext);
1137 if (ps.mfimage == NULL) {
1138 cpl_msg_error(fctid,
1139 "Master dome extension %" CPL_SIZE_FORMAT
" won't load",
1142 cpl_msg_error(fctid,
1143 "Master dome extension %" CPL_SIZE_FORMAT
" is a dummy",
1145 freefits(ps.mfimage);
1157 vircam_dome_flat_combine_config.flatratio_med = 0.0;
1158 vircam_dome_flat_combine_config.flatratio_rms = 0.0;
1159 ncells = vircam_dome_flat_combine_config.ncells;
1162 &gdiff,&grms,&(ps.ratioimg),
1163 &(ps.ratioimstats));
1165 vircam_dome_flat_combine_config.flatratio_med = gdiff;
1166 vircam_dome_flat_combine_config.flatratio_rms = grms;
1167 if (ps.ratioimg != NULL)
1169 if (ps.ratioimstats != NULL)
1170 we_get |= STATS_TAB;
1184static int vircam_dome_flat_combine_lastbit(
int jext, cpl_frameset *framelist,
1185 cpl_parameterlist *parlist) {
1187 const char *fctid=
"vircam_dome_flat_combine_lastbit";
1191 vircam_dome_flat_combine_dummy_products();
1195 cpl_msg_info(fctid,
"Saving products for extension %" CPL_SIZE_FORMAT,
1197 retval = vircam_dome_flat_combine_save(framelist,parlist);
1199 vircam_dome_flat_combine_tidy(2);
1205 vircam_dome_flat_combine_tidy(1);
1215static void vircam_dome_flat_combine_init(
void) {
1220 ps.master_dark = NULL;
1221 ps.master_dome_flat = NULL;
1222 ps.master_mask = NULL;
1231 ps.ratioimstats = NULL;
1241static void vircam_dome_flat_combine_tidy(
int level) {
1242 freeimage(ps.outimage);
1243 freefitslist(ps.domes,ps.ndomes);
1244 freepropertylist(ps.drs);
1245 freespace(ps.rejmask);
1246 freespace(ps.rejplus);
1247 freetfits(ps.ctable);
1248 freefits(ps.mfimage);
1250 freeimage(ps.ratioimg);
1251 freetable(ps.ratioimstats);
1255 freespace(ps.labels);
1256 freeframeset(ps.domelist);
1257 freeframe(ps.master_dark);
1258 freeframe(ps.master_dome_flat);
1259 freeframe(ps.chantab);
1261 freemask(ps.master_mask);
1262 freepropertylist(ps.phupaf);
cpl_image * casu_fits_get_image(casu_fits *p)
casu_fits ** casu_fits_load_list(cpl_frameset *f, cpl_type type, int exten)
int casu_fits_set_error(casu_fits *p, int status)
char * casu_fits_get_fullname(casu_fits *p)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
casu_fits * casu_fits_load(cpl_frame *frame, cpl_type type, int nexten)
void casu_mask_force(casu_mask *m, int nx, int ny)
unsigned char * casu_mask_get_data(casu_mask *m)
int casu_mask_load(casu_mask *m, int nexten, int nx, int ny)
void casu_mask_clear(casu_mask *m)
casu_mask * casu_mask_define(cpl_frameset *framelist, cpl_size *labels, cpl_size nlab, const char *conftag, const char *bpmtag)
const char * casu_mask_get_filename(casu_mask *m)
int casu_imcombine(casu_fits **fset, casu_fits **fsetv, int nfits, int combtype, int scaletype, int xrej, float thresh, const char *expkey, cpl_image **outimage, cpl_image **outvimage, unsigned char **rejmask, unsigned char **rejplus, cpl_propertylist **drs, int *status)
Stack images into a mean or median image with rejection.
int casu_nditcor(casu_fits *infile, int ndit, const char *expkey, int *status)
Correct input data for number of dits.
int casu_darkcor(casu_fits *infile, casu_fits *darksrc, float darkscl, int *status)
Correct input data for dark current.
void casu_medmad(float *data, unsigned char *bpm, long np, float *med, float *mad)
void casu_medsig(float *data, unsigned char *bpm, long np, float *med, float *sig)
casu_tfits * casu_tfits_load(cpl_frame *table, int nexten)
cpl_table * casu_tfits_get_table(casu_tfits *p)
int casu_compare_tags(const cpl_frame *frame1, const cpl_frame *frame2)
Compare input tags.
void casu_merge_propertylists(cpl_propertylist *p1, cpl_propertylist *p2)
Merge two propertylists.
void casu_overexp(casu_fits **fitslist, int *n, int ndit, float lthr, float hthr, int ditch, float *minv, float *maxv, float *avev)
Remove over- or under-exposed images from a list.
void casu_dummy_property(cpl_propertylist *p)
Set dummy property keyword.
cpl_frame * casu_frameset_subgroup_1(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
Extract a frame of a given label from a frameset.
cpl_image * casu_dummy_image(casu_fits *model)
Create a dummy image of zeros based on a model.
cpl_frameset * casu_frameset_subgroup(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
Extract a frameset from another frameset.
int casu_removewcs(cpl_propertylist *p, int *status)
int vircam_lincor(casu_fits *infile, casu_tfits *lchantab, int kconst, int ndit, int *status)
Apply linearity curves to data.
int vircam_chantab_verify(cpl_table *intab)
int vircam_dfs_set_groups(cpl_frameset *set)
void vircam_dfs_set_product_primary_header(cpl_propertylist *plist, cpl_frame *frame, cpl_frameset *frameset, cpl_parameterlist *parlist, char *recipeid, const char *dict, cpl_frame *inherit, int synch)
void vircam_dfs_set_product_exten_header(cpl_propertylist *plist, cpl_frame *frame, cpl_frameset *frameset, cpl_parameterlist *parlist, char *recipeid, const char *dict, cpl_frame *inherit)
int vircam_pfits_get_ndit(const cpl_propertylist *plist, int *ndit)
Get the value of NDIT.
int vircam_pfits_get_detlive(const cpl_propertylist *plist, int *detlive)
Get the value of DET_LIVE.
const char * vircam_get_license(void)
cpl_table * vircam_create_diffimg_stats(int nrows)
void vircam_difference_image(cpl_image *master, cpl_image *prog, unsigned char *bpm, cpl_table *chantab, int ncells, int oper, float *global_diff, float *global_rms, cpl_image **diffim, cpl_table **diffimstats)
int vircam_is_dummy(cpl_propertylist *p)
void vircam_exten_range(int inexten, const cpl_frame *fr, int *out1, int *out2)