38 #include <casu_utils.h>
39 #include <casu_mask.h>
40 #include <casu_mods.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"
59 static int vircam_dome_flat_combine_create(cpl_plugin *) ;
60 static int vircam_dome_flat_combine_exec(cpl_plugin *) ;
61 static int vircam_dome_flat_combine_destroy(cpl_plugin *) ;
62 static int vircam_dome_flat_combine(cpl_parameterlist *, cpl_frameset *) ;
63 static int vircam_dome_flat_combine_save(cpl_frameset *framelist,
64 cpl_parameterlist *parlist);
65 static void vircam_dome_flat_combine_dummy_products(
void);
66 static void vircam_dome_flat_combine_normal(
int jext);
67 static int vircam_dome_flat_combine_lastbit(
int jext, cpl_frameset *framelist,
68 cpl_parameterlist *parlist);
69 static void vircam_dome_flat_combine_init(
void);
70 static 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;
123 static cpl_frame *product_frame_mean_dome = NULL;
124 static cpl_frame *product_frame_ratioimg = NULL;
125 static cpl_frame *product_frame_ratioimg_stats = NULL;
126 static int we_expect;
129 static 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."
294 int 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);
333 static 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);
441 static 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));
462 static 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);
485 static 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);
811 static 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);
1070 static 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))
1107 static 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;
1184 static 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);
1215 static 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;
1241 static 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(cpl_frame *frame, cpl_type type, int nexten)
casu_fits ** casu_fits_load_list(cpl_frameset *f, cpl_type type, int exten)
char * casu_fits_get_fullname(casu_fits *p)
int casu_fits_set_error(casu_fits *p, int status)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
void casu_mask_force(casu_mask *m, int nx, int ny)
unsigned char * casu_mask_get_data(casu_mask *m)
const char * casu_mask_get_filename(casu_mask *m)
int casu_mask_load(casu_mask *m, int nexten, int nx, int ny)
casu_mask * casu_mask_define(cpl_frameset *framelist, cpl_size *labels, cpl_size nlab, const char *conftag, const char *bpmtag)
void casu_mask_clear(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)
cpl_table * casu_tfits_get_table(casu_tfits *p)
casu_tfits * casu_tfits_load(cpl_frame *table, int nexten)
cpl_image * casu_dummy_image(casu_fits *model)
Create a dummy image of zeros based on a model.
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.
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_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.
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)
const char * vircam_get_license(void)
void vircam_exten_range(int inexten, const cpl_frame *fr, int *out1, int *out2)