38 #include "vircam_utils.h"
39 #include "vircam_mask.h"
40 #include "vircam_pfits.h"
41 #include "vircam_dfs.h"
42 #include "vircam_mods.h"
43 #include "vircam_stats.h"
44 #include "vircam_fits.h"
45 #include "vircam_tfits.h"
46 #include "vircam_channel.h"
47 #include "vircam_paf.h"
48 #include "vircam_wcsutils.h"
58 static int vircam_dome_flat_combine_create(cpl_plugin *) ;
59 static int vircam_dome_flat_combine_exec(cpl_plugin *) ;
60 static int vircam_dome_flat_combine_destroy(cpl_plugin *) ;
61 static int vircam_dome_flat_combine(cpl_parameterlist *, cpl_frameset *) ;
62 static int vircam_dome_flat_combine_save(cpl_frameset *framelist,
63 cpl_parameterlist *parlist);
64 static void vircam_dome_flat_combine_dummy_products(
void);
65 static void vircam_dome_flat_combine_normal(
int jext);
66 static int vircam_dome_flat_combine_lastbit(
int jext, cpl_frameset *framelist,
67 cpl_parameterlist *parlist);
68 static void vircam_dome_flat_combine_init(
void);
69 static void vircam_dome_flat_combine_tidy(
int level);
95 } vircam_dome_flat_combine_config;
100 cpl_frameset *domelist;
101 cpl_frame *master_dark;
102 cpl_frame *master_dome_flat;
106 vir_mask *master_mask;
110 cpl_propertylist *drs;
111 unsigned char *rejmask;
112 unsigned char *rejplus;
117 cpl_table *ratioimstats;
118 cpl_propertylist *phupaf;
122 static cpl_frame *product_frame_mean_dome = NULL;
123 static cpl_frame *product_frame_ratioimg = NULL;
124 static cpl_frame *product_frame_ratioimg_stats = NULL;
125 static int we_expect;
128 static char vircam_dome_flat_combine_description[] =
129 "vircam_dome_flat_combine -- VIRCAM dome flat combine recipe.\n\n"
130 "Combine a list of dome flat frames into a mean frame. Optionally compare \n"
131 "the output frame to a master dome flat frame\n\n"
132 "The program accepts the following files in the SOF:\n\n"
134 " -----------------------------------------------------------------------\n"
135 " %-21s A list of raw dome flat images\n"
136 " %-21s A master dark frame\n"
137 " %-21s Optional reference dome flat frame\n"
138 " %-21s Optional channel table or\n"
139 " %-21s Optional initial channel table\n"
140 " %-21s Optional master bad pixel map or\n"
141 " %-21s Optional master confidence map\n"
142 "If no master dome flat is made available, then no comparison will be done\n"
143 "This means there will be no output ratio image. If a master dome is\n"
144 "available, but no channel table is, then a ratio image will be formed\n"
145 "but no stats will be written."
293 int cpl_plugin_get_info(cpl_pluginlist *list) {
294 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
295 cpl_plugin *plugin = &recipe->interface;
296 char alldesc[SZ_ALLDESC];
297 (void)snprintf(alldesc,SZ_ALLDESC,vircam_dome_flat_combine_description,
298 VIRCAM_DOME_RAW,VIRCAM_CAL_DARK,VIRCAM_REF_DOME_FLAT,
299 VIRCAM_CAL_CHANTAB,VIRCAM_CAL_CHANTAB_INIT,VIRCAM_CAL_BPM,
302 cpl_plugin_init(plugin,
304 VIRCAM_BINARY_VERSION,
305 CPL_PLUGIN_TYPE_RECIPE,
306 "vircam_dome_flat_combine",
307 "VIRCAM dome flat combination recipe",
312 vircam_dome_flat_combine_create,
313 vircam_dome_flat_combine_exec,
314 vircam_dome_flat_combine_destroy);
316 cpl_pluginlist_append(list,plugin);
332 static int vircam_dome_flat_combine_create(cpl_plugin *plugin) {
338 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
339 recipe = (cpl_recipe *)plugin;
345 recipe->parameters = cpl_parameterlist_new();
349 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.lthr",
351 "Low rejection threshold for underexpsed images",
352 "vircam.vircam_dome_flat_combine",
354 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"lthr");
355 cpl_parameterlist_append(recipe->parameters,p);
359 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.hthr",
361 "High rejection threshold for overexposed images",
362 "vircam.vircam_dome_flat_combine",
364 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"hthr");
365 cpl_parameterlist_append(recipe->parameters,p);
369 p = cpl_parameter_new_range(
"vircam.vircam_dome_flat_combine.combtype",
371 "1 == Median,\n 2 == Mean",
372 "vircam.vircam_dome_flat_combine",
374 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"combtype");
375 cpl_parameterlist_append(recipe->parameters,p);
379 p = cpl_parameter_new_range(
"vircam.vircam_dome_flat_combine.scaletype",
381 "0 == none,\n 1 == additive offset,\n 2 == multiplicative offset,\n 3 == exposure time scaling + additive offset",
382 "vircam.vircam_dome_flat_combine",
384 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"scaletype");
385 cpl_parameterlist_append(recipe->parameters,p);
389 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.xrej",
391 "True if using extra rejection cycle",
392 "vircam.vircam_dome_flat_combine",
394 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"xrej");
395 cpl_parameterlist_append(recipe->parameters,p);
399 p = cpl_parameter_new_value(
"vircam.vircam_dome_flat_combine.thresh",
401 "Rejection threshold in sigma above background",
402 "vircam.vircam_dome_flat_combine",5.0);
403 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thresh");
404 cpl_parameterlist_append(recipe->parameters,p);
408 p = cpl_parameter_new_enum(
"vircam.vircam_dome_flat_combine.ncells",
410 "Number of cells for data channel stats",
411 "vircam.vircam_dome_flat_combine",8,7,1,2,4,8,
413 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ncells");
414 cpl_parameterlist_append(recipe->parameters,p);
418 p = cpl_parameter_new_range(
"vircam.vircam_dome_flat_combine.extenum",
420 "Extension number to be done, 0 == all",
421 "vircam.vircam_dome_flat_combine",
423 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
424 cpl_parameterlist_append(recipe->parameters,p);
440 static int vircam_dome_flat_combine_exec(cpl_plugin *plugin) {
445 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
446 recipe = (cpl_recipe *)plugin;
450 return(vircam_dome_flat_combine(recipe->parameters,recipe->frames));
461 static int vircam_dome_flat_combine_destroy(cpl_plugin *plugin) {
466 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
467 recipe = (cpl_recipe *)plugin;
471 cpl_parameterlist_delete(recipe->parameters);
484 static int vircam_dome_flat_combine(cpl_parameterlist *parlist,
485 cpl_frameset *framelist) {
486 const char *fctid=
"vircam_dome_flat_combine";
487 int j,jst,jfn,retval,status,live,nx,ny,ndit;
491 cpl_propertylist *pp;
496 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
497 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
504 cpl_msg_error(fctid,
"Input frameset is missing files. Check SOF");
510 vircam_dome_flat_combine_init();
511 we_expect = MEANDOME;
515 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.lthr");
516 vircam_dome_flat_combine_config.lthr = (float)cpl_parameter_get_double(p);
517 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.hthr");
518 vircam_dome_flat_combine_config.hthr = (float)cpl_parameter_get_double(p);
519 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.combtype");
520 vircam_dome_flat_combine_config.combtype = cpl_parameter_get_int(p);
521 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.scaletype");
522 vircam_dome_flat_combine_config.scaletype = cpl_parameter_get_int(p);
523 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.xrej");
524 vircam_dome_flat_combine_config.xrej = cpl_parameter_get_bool(p);
525 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.thresh");
526 vircam_dome_flat_combine_config.thresh = (float)cpl_parameter_get_double(p);
527 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.ncells");
528 vircam_dome_flat_combine_config.ncells = cpl_parameter_get_int(p);
529 p = cpl_parameterlist_find(parlist,
"vircam.vircam_dome_flat_combine.extenum");
530 vircam_dome_flat_combine_config.extenum = cpl_parameter_get_int(p);
535 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
536 vircam_dome_flat_combine_tidy(2);
544 cpl_msg_error(fctid,
"Cannot labelise the input frames");
545 vircam_dome_flat_combine_tidy(2);
549 VIRCAM_DOME_RAW)) == NULL) {
550 cpl_msg_error(fctid,
"Cannot find dome frames in input frameset");
551 vircam_dome_flat_combine_tidy(2);
554 ps.ndomes = cpl_frameset_get_size(ps.domelist);
559 VIRCAM_CAL_DARK)) == NULL) {
560 cpl_msg_error(fctid,
"No master dark found");
561 vircam_dome_flat_combine_tidy(2);
568 nlab,VIRCAM_REF_DOME_FLAT)) == NULL)
569 cpl_msg_info(fctid,
"No master dome flat found -- no ratio image will be formed");
581 VIRCAM_CAL_CHANTAB)) == NULL) {
583 VIRCAM_CAL_CHANTAB_INIT)) == NULL) {
584 cpl_msg_info(fctid,
"No channel table found -- no ratio image stats and no linearisation will be done");
586 cpl_msg_info(fctid,
"Channel table is labelled INIT -- no linearisation will be done");
587 if (we_expect & RATIMG)
588 we_expect |= STATS_TAB;
590 }
else if (we_expect & RATIMG) {
591 we_expect |= STATS_TAB;
599 (
const cpl_frame *)cpl_frameset_get_frame(ps.domelist,0),
601 if (jst == -1 || jfn == -1) {
602 cpl_msg_error(fctid,
"Unable to continue");
603 vircam_dome_flat_combine_tidy(2);
609 pp = cpl_propertylist_load(cpl_frame_get_filename(cpl_frameset_get_frame(ps.domelist,0)),0);
611 cpl_msg_error(fctid,
"No value for NDIT available");
612 freepropertylist(pp);
613 vircam_dome_flat_combine_tidy(2);
616 cpl_propertylist_delete(pp);
620 ps.good = cpl_malloc(ps.ndomes*
sizeof(vir_fits *));
624 for (j = jst; j <= jfn; j++) {
627 isfirst = (j == jst);
632 if (ps.domes == NULL) {
634 "Extension %" CPL_SIZE_FORMAT
" domes wouldn't load",
636 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
645 for (i = 0; i < ps.ndomes; i++) {
649 cpl_msg_info(fctid,
"Detector flagged dead %s",
653 ps.good[ps.ngood] = ff;
662 cpl_msg_info(fctid,
"All images flagged bad for this extension");
663 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
675 "Unable to load mask image %s[%" CPL_SIZE_FORMAT
"]",
677 cpl_msg_info(fctid,
"Forcing all pixels to be good from now on");
684 vircam_dome_flat_combine_config.lthr,
685 vircam_dome_flat_combine_config.hthr,0,
686 &(vircam_dome_flat_combine_config.minv),
687 &(vircam_dome_flat_combine_config.maxv),
688 &(vircam_dome_flat_combine_config.avev));
694 cpl_msg_info(fctid,
"All images either under or overexposed");
695 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
705 if (ps.mdark == NULL) {
707 "Can't load master dark for extension %" CPL_SIZE_FORMAT,
709 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
715 "Can't master dark extension %" CPL_SIZE_FORMAT
" is a dummy",
717 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
725 cpl_msg_info(fctid,
"Dark correcting extension %" CPL_SIZE_FORMAT,
727 for (i = 0; i < ps.ngood; i++)
733 if (ps.chantab != NULL) {
735 if (ps.ctable == NULL) {
737 "Channel table extension %" CPL_SIZE_FORMAT
" won't load",
741 "Channel table extension %" CPL_SIZE_FORMAT
" has errors",
743 freetfits(ps.ctable);
745 pp = cpl_propertylist_load(cpl_frame_get_filename(ps.chantab),
749 "Channel table extensions %" CPL_SIZE_FORMAT
" is a dummy",
751 freetfits(ps.ctable);
753 freepropertylist(pp);
761 if (ps.ctable != NULL) {
762 cpl_msg_info(fctid,
"Linearising extension %" CPL_SIZE_FORMAT,
764 for (i = 0; i < ps.ngood; i++)
770 for (i = 0; i < ps.ngood; i++)
775 cpl_msg_info(fctid,
"Doing combination for extension %" CPL_SIZE_FORMAT,
778 vircam_dome_flat_combine_config.combtype,
779 vircam_dome_flat_combine_config.scaletype,
780 vircam_dome_flat_combine_config.xrej,
781 vircam_dome_flat_combine_config.thresh,
782 &(ps.outimage),&(ps.rejmask),&(ps.rejplus),
788 if (status == VIR_OK) {
790 vircam_dome_flat_combine_normal(j);
792 cpl_msg_info(fctid,
"A processing step failed");
797 retval = vircam_dome_flat_combine_lastbit(j,framelist,parlist);
802 vircam_dome_flat_combine_tidy(2);
816 static int vircam_dome_flat_combine_save(cpl_frameset *framelist,
817 cpl_parameterlist *parlist) {
818 cpl_propertylist *plist,*elist,*p,*paf;
821 const char *fctid =
"vircam_dome_flat_combine_save";
822 const char *outfile =
"domecomb.fits";
823 const char *outdiff =
"domeratio.fits";
824 const char *outdimst =
"domeratiotab.fits";
825 const char *outpaf =
"domecomb";
826 const char *outdpaf =
"domeratio";
827 const char *recipeid =
"vircam_dome_flat_combine";
836 product_frame_mean_dome = cpl_frame_new();
837 cpl_frame_set_filename(product_frame_mean_dome,outfile);
838 cpl_frame_set_tag(product_frame_mean_dome,VIRCAM_PRO_DOME_FLAT);
839 cpl_frame_set_type(product_frame_mean_dome,CPL_FRAME_TYPE_IMAGE);
840 cpl_frame_set_group(product_frame_mean_dome,CPL_FRAME_GROUP_PRODUCT);
841 cpl_frame_set_level(product_frame_mean_dome,CPL_FRAME_LEVEL_FINAL);
846 ps.phupaf = vircam_paf_phu_items(plist);
847 if (ps.master_dome_flat != NULL) {
848 cpl_propertylist_update_string(ps.phupaf,
"REF_DOME",
849 cpl_frame_get_filename(ps.master_dome_flat));
850 cpl_propertylist_set_comment(ps.phupaf,
"REF_DOME",
851 "Reference dome flat used");
860 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
861 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
862 cpl_msg_error(fctid,
"Cannot save product PHU");
863 cpl_frame_delete(product_frame_mean_dome);
866 cpl_frameset_insert(framelist,product_frame_mean_dome);
870 if (we_expect & RATIMG) {
871 product_frame_ratioimg = cpl_frame_new();
872 cpl_frame_set_filename(product_frame_ratioimg,outdiff);
873 cpl_frame_set_tag(product_frame_ratioimg,
874 VIRCAM_PRO_RATIOIMG_DOME_FLAT);
875 cpl_frame_set_type(product_frame_ratioimg,CPL_FRAME_TYPE_IMAGE);
876 cpl_frame_set_group(product_frame_ratioimg,
877 CPL_FRAME_GROUP_PRODUCT);
878 cpl_frame_set_level(product_frame_ratioimg,CPL_FRAME_LEVEL_FINAL);
890 if (cpl_image_save(NULL,outdiff,CPL_TYPE_UCHAR,plist,
891 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
892 cpl_msg_error(fctid,
"Cannot save product PHU");
893 cpl_frame_delete(product_frame_ratioimg);
896 cpl_frameset_insert(framelist,product_frame_ratioimg);
902 if (we_expect & STATS_TAB) {
903 product_frame_ratioimg_stats = cpl_frame_new();
904 cpl_frame_set_filename(product_frame_ratioimg_stats,outdimst);
905 cpl_frame_set_tag(product_frame_ratioimg_stats,
906 VIRCAM_PRO_RATIOIMG_DOME_FLAT_STATS);
907 cpl_frame_set_type(product_frame_ratioimg_stats,
908 CPL_FRAME_TYPE_TABLE);
909 cpl_frame_set_group(product_frame_ratioimg_stats,
910 CPL_FRAME_GROUP_PRODUCT);
911 cpl_frame_set_level(product_frame_ratioimg_stats,
912 CPL_FRAME_LEVEL_FINAL);
918 product_frame_ratioimg_stats,
926 p = cpl_propertylist_duplicate(elist);
929 "ESO INS FILT1 NAME");
930 if (! (we_get & STATS_TAB))
941 if (cpl_table_save(ps.ratioimstats,plist,p,outdimst,
942 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
943 cpl_msg_error(fctid,
"Cannot save product table extension");
944 cpl_propertylist_delete(p);
947 cpl_propertylist_delete(p);
948 cpl_frameset_insert(framelist,product_frame_ratioimg_stats);
955 cpl_propertylist_update_int(plist,
"ESO PRO DATANCOM",ps.ngood);
960 p = cpl_propertylist_duplicate(plist);
961 if (! (we_get & MEANDOME))
970 cpl_propertylist_update_float(p,
"ESO QC FLATRMS",
971 vircam_dome_flat_combine_config.flatrms);
972 cpl_propertylist_set_comment(p,
"ESO QC FLATRMS",
"RMS of output flat");
973 cpl_propertylist_update_float(p,
"ESO QC FLATMIN",
974 vircam_dome_flat_combine_config.minv);
975 cpl_propertylist_set_comment(p,
"ESO QC FLATMIN",
"Ensemble minimum");
976 cpl_propertylist_update_float(p,
"ESO QC FLATMAX",
977 vircam_dome_flat_combine_config.maxv);
978 cpl_propertylist_set_comment(p,
"ESO QC FLATMAX",
"Ensemble maximum");
979 cpl_propertylist_update_float(p,
"ESO QC FLATAVG",
980 vircam_dome_flat_combine_config.avev);
981 cpl_propertylist_set_comment(p,
"ESO QC FLATAVG",
"Ensemble average");
982 val = vircam_dome_flat_combine_config.maxv -
983 vircam_dome_flat_combine_config.minv;
984 cpl_propertylist_update_float(p,
"ESO QC FLATRNG",val);
985 cpl_propertylist_set_comment(p,
"ESO QC FLATRNG",
"Ensemble range");
986 if (cpl_image_save(ps.outimage,outfile,CPL_TYPE_FLOAT,p,
987 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
988 cpl_propertylist_delete(p);
989 cpl_msg_error(fctid,
"Cannot save product image extension");
995 paf = vircam_paf_req_items(p);
998 "ESO INS FILT1 NAME");
999 vircam_paf_append(paf,p,
"ESO PRO CATG");
1000 vircam_paf_append(paf,p,
"ESO PRO DATANCOM");
1001 if (vircam_paf_print((
char *)outpaf,
"VIRCAM/vircam_dome_flat_combine",
1002 "QC file",paf) != VIR_OK)
1003 cpl_msg_warning(fctid,
"Unable to save PAF for mean dome");
1004 cpl_propertylist_delete(paf);
1005 cpl_propertylist_delete(p);
1009 if (we_expect & RATIMG) {
1010 p = cpl_propertylist_duplicate(plist);
1011 if (! (we_get & RATIMG))
1013 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_MED",
1014 vircam_dome_flat_combine_config.flatratio_med);
1015 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_MED",
1016 "Median of ratio map");
1017 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_RMS",
1018 vircam_dome_flat_combine_config.flatratio_rms);
1019 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_RMS",
1020 "RMS of ratio map");
1025 if (cpl_image_save(ps.ratioimg,outdiff,CPL_TYPE_FLOAT,p,
1026 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1027 cpl_propertylist_delete(p);
1028 cpl_msg_error(fctid,
"Cannot save product image extension");
1034 paf = vircam_paf_req_items(p);
1037 "ESO INS FILT1 NAME");
1038 vircam_paf_append(paf,p,
"ESO PRO CATG");
1039 if (vircam_paf_print((
char *)outdpaf,
"VIRCAM/vircam_dome_flat_combine",
1040 "QC file",paf) != VIR_OK)
1041 cpl_msg_warning(fctid,
"Unable to save PAF for ratio image");
1042 cpl_propertylist_delete(paf);
1043 cpl_propertylist_delete(p);
1048 if (! isfirst && (we_expect & STATS_TAB)) {
1049 p = cpl_propertylist_duplicate(plist);
1050 if (! (we_get & STATS_TAB))
1058 if (cpl_table_save(ps.ratioimstats,NULL,p,outdimst,CPL_IO_EXTEND)
1059 != CPL_ERROR_NONE) {
1060 cpl_propertylist_delete(p);
1061 cpl_msg_error(fctid,
"Cannot save product table extension");
1064 cpl_propertylist_delete(p);
1078 static void vircam_dome_flat_combine_dummy_products(
void) {
1082 if (we_get == we_expect)
1087 if (! (we_get & MEANDOME)) {
1089 vircam_dome_flat_combine_config.flatrms = 0.0;
1094 if ((we_expect & RATIMG) && ! (we_get & RATIMG)) {
1095 vircam_dome_flat_combine_config.flatratio_med = 0.0;
1096 vircam_dome_flat_combine_config.flatratio_rms = 0.0;
1102 if ((we_expect & STATS_TAB) && ! (we_get & STATS_TAB))
1115 static void vircam_dome_flat_combine_normal(
int jext) {
1119 float *idata,med,sig,gdiff,grms;
1120 const char *fctid=
"vircam_dome_flat_combine_normal";
1124 nx = (int)cpl_image_get_size_x(ps.outimage);
1125 ny = (int)cpl_image_get_size_y(ps.outimage);
1131 idata = cpl_image_get_data(ps.outimage);
1136 cpl_image_divide_scalar(ps.outimage,med);
1139 vircam_dome_flat_combine_config.flatrms = sig;
1143 if (ps.master_dome_flat != NULL) {
1145 if (ps.mfimage == NULL) {
1146 cpl_msg_error(fctid,
1147 "Master dome extension %" CPL_SIZE_FORMAT
" won't load",
1150 cpl_msg_error(fctid,
1151 "Master dome extension %" CPL_SIZE_FORMAT
" is a dummy",
1153 freefits(ps.mfimage);
1165 vircam_dome_flat_combine_config.flatratio_med = 0.0;
1166 vircam_dome_flat_combine_config.flatratio_rms = 0.0;
1167 ncells = vircam_dome_flat_combine_config.ncells;
1170 &gdiff,&grms,&(ps.ratioimg),
1171 &(ps.ratioimstats));
1173 vircam_dome_flat_combine_config.flatratio_med = gdiff;
1174 vircam_dome_flat_combine_config.flatratio_rms = grms;
1175 if (ps.ratioimg != NULL)
1177 if (ps.ratioimstats != NULL)
1178 we_get |= STATS_TAB;
1192 static int vircam_dome_flat_combine_lastbit(
int jext, cpl_frameset *framelist,
1193 cpl_parameterlist *parlist) {
1195 const char *fctid=
"vircam_dome_flat_combine_lastbit";
1199 vircam_dome_flat_combine_dummy_products();
1203 cpl_msg_info(fctid,
"Saving products for extension %" CPL_SIZE_FORMAT,
1205 retval = vircam_dome_flat_combine_save(framelist,parlist);
1207 vircam_dome_flat_combine_tidy(2);
1213 vircam_dome_flat_combine_tidy(1);
1223 static void vircam_dome_flat_combine_init(
void) {
1228 ps.master_dark = NULL;
1229 ps.master_dome_flat = NULL;
1230 ps.master_mask = NULL;
1239 ps.ratioimstats = NULL;
1249 static void vircam_dome_flat_combine_tidy(
int level) {
1250 freeimage(ps.outimage);
1251 freefitslist(ps.domes,ps.ndomes);
1252 freepropertylist(ps.drs);
1253 freespace(ps.rejmask);
1254 freespace(ps.rejplus);
1255 freetfits(ps.ctable);
1256 freefits(ps.mfimage);
1258 freeimage(ps.ratioimg);
1259 freetable(ps.ratioimstats);
1263 freespace(ps.labels);
1264 freeframeset(ps.domelist);
1265 freeframe(ps.master_dark);
1266 freeframe(ps.master_dome_flat);
1267 freeframe(ps.chantab);
1269 freemask(ps.master_mask);
1270 freepropertylist(ps.phupaf);
const char * vircam_get_license(void)
void vircam_mask_force(vir_mask *m, int nx, int ny)
cpl_table * vircam_tfits_get_table(vir_tfits *p)
int vircam_compare_tags(const cpl_frame *frame1, const cpl_frame *frame2)
int vircam_chantab_verify(cpl_table *intab)
int vircam_is_dummy(cpl_propertylist *p)
void vircam_merge_propertylists(cpl_propertylist *p1, cpl_propertylist *p2)
vir_fits ** vircam_fits_load_list(cpl_frameset *f, cpl_type type, int exten)
void vircam_medsig(float *data, unsigned char *bpm, long np, float *med, float *sig)
cpl_frame * vircam_frameset_subgroup_1(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
void vircam_mask_clear(vir_mask *m)
cpl_image * vircam_dummy_image(vir_fits *model)
int vircam_lincor(vir_fits *infile, vir_tfits *lchantab, int kconst, int ndit, int *status)
Apply linearity curves to data.
int vircam_mask_load(vir_mask *m, int nexten, int nx, int ny)
char * vircam_fits_get_fullname(vir_fits *p)
unsigned char * vircam_mask_get_data(vir_mask *m)
cpl_image * vircam_fits_get_image(vir_fits *p)
int vircam_darkcor(vir_fits *infile, vir_fits *darksrc, float darkscl, int *status)
Correct input data for dark current.
cpl_table * vircam_create_diffimg_stats(int nrows)
cpl_frameset * vircam_frameset_subgroup(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
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)
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)
int vircam_fits_set_error(vir_fits *p, int status)
void vircam_medmad(float *data, unsigned char *bpm, long np, float *med, float *mad)
int vircam_pfits_get_ndit(const cpl_propertylist *plist, int *ndit)
Get the value of NDIT.
void vircam_dummy_property(cpl_propertylist *p)
cpl_propertylist * vircam_fits_get_phu(vir_fits *p)
vir_fits * vircam_fits_load(cpl_frame *frame, cpl_type type, int nexten)
vir_tfits * vircam_tfits_load(cpl_frame *table, int nexten)
int vircam_nditcor(vir_fits *infile, int ndit, int *status)
Correct input data for dark current.
cpl_propertylist * vircam_fits_get_ehu(vir_fits *p)
void vircam_overexp(vir_fits **fitslist, int *n, int ndit, float lthr, float hthr, int ditch, float *minv, float *maxv, float *avev)
int vircam_frameset_fexists(cpl_frameset *frameset)
const char * vircam_mask_get_filename(vir_mask *m)
vir_mask * vircam_mask_define(cpl_frameset *framelist, cpl_size *labels, cpl_size nlab)
int vircam_pfits_get_detlive(const cpl_propertylist *plist, int *detlive)
Get the value of DET_LIVE.
int vircam_imcombine(vir_fits **fset, int nfits, int combtype, int scaletype, int xrej, float thresh, cpl_image **outimage, unsigned char **rejmask, unsigned char **rejplus, cpl_propertylist **drs, int *status)
Stack images into a mean or median image with rejection.
void vircam_exten_range(int inexten, const cpl_frame *fr, int *out1, int *out2)
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_removewcs(cpl_propertylist *p, int *status)
int vircam_dfs_set_groups(cpl_frameset *set)