38 #include "vircam_utils.h"
39 #include "vircam_mask.h"
40 #include "vircam_dfs.h"
41 #include "vircam_mods.h"
42 #include "vircam_stats.h"
43 #include "vircam_fits.h"
44 #include "vircam_pfits.h"
45 #include "vircam_channel.h"
46 #include "vircam_paf.h"
47 #include "vircam_wcsutils.h"
58 static int vircam_twilight_flat_combine_create(cpl_plugin *) ;
59 static int vircam_twilight_flat_combine_exec(cpl_plugin *) ;
60 static int vircam_twilight_flat_combine_destroy(cpl_plugin *) ;
61 static int vircam_twilight_flat_combine(cpl_parameterlist *, cpl_frameset *) ;
62 static int vircam_twilight_flat_combine_save(cpl_frameset *framelist,
63 cpl_parameterlist *parlist);
64 static void vircam_twilight_flat_combine_dummy_products(
void);
65 static void vircam_twilight_flat_combine_normal(
int jext);
66 static int vircam_twilight_flat_combine_lastbit(
int jext,
67 cpl_frameset *framelist,
68 cpl_parameterlist *parlist);
69 static void vircam_twilight_flat_combine_init(
void);
70 static void vircam_twilight_flat_combine_tidy(
int level);
98 } vircam_twilight_flat_combine_config;
105 cpl_frameset *twilightlist;
106 cpl_frame *master_dark;
107 cpl_frame *master_twilight_flat;
108 vir_mask *master_mask;
113 vir_fits **twilights;
115 cpl_propertylist *drs;
116 cpl_propertylist *drs2;
117 unsigned char *rejmask;
118 unsigned char *rejplus;
121 cpl_table *ratioimstats;
124 cpl_propertylist *phupaf;
128 static cpl_frame *product_frame_mean_twi = NULL;
129 static cpl_frame *product_frame_conf = NULL;
130 static cpl_frame *product_frame_ratioimg = NULL;
131 static cpl_frame *product_frame_ratioimg_stats = NULL;
132 static int we_expect;
135 static char vircam_twilight_flat_combine_description[] =
136 "vircam_twilight_flat_combine -- VIRCAM twilight flat combine recipe.\n\n"
137 "Combine a list of twilight flat frames into a mean frame. Optionally\n"
138 "compare the output frame to a master twilight flat frame\n\n"
139 "The program accepts the following files in the SOF:\n\n"
141 " -----------------------------------------------------------------------\n"
142 " %-21s A list of raw twilight flat images\n"
143 " %-21s A master dark frame\n"
144 " %-21s Optional reference twilight flat frame\n"
145 " %-21s Optional channel table or\n"
146 " %-21s Optional initial channel table\n"
147 " %-21s Optional master bad pixel map or\n"
148 " %-21s Optional master confidence map\n"
149 "If no reference twilight flat is made available, then no comparison will be\n"
150 "done. This means there will be no output ratio image. If a master twilight\n"
151 "is available, but no channel table is, then a ratio image will be formed\n"
152 "but no stats will be written."
309 int cpl_plugin_get_info(cpl_pluginlist *list) {
310 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
311 cpl_plugin *plugin = &recipe->interface;
312 char alldesc[SZ_ALLDESC];
313 (void)snprintf(alldesc,SZ_ALLDESC,vircam_twilight_flat_combine_description,
314 VIRCAM_TWI_RAW,VIRCAM_CAL_DARK,VIRCAM_REF_TWILIGHT_FLAT,
315 VIRCAM_CAL_CHANTAB,VIRCAM_CAL_CHANTAB_INIT,VIRCAM_CAL_BPM,
318 cpl_plugin_init(plugin,
320 VIRCAM_BINARY_VERSION,
321 CPL_PLUGIN_TYPE_RECIPE,
322 "vircam_twilight_flat_combine",
323 "VIRCAM twilight combination recipe",
328 vircam_twilight_flat_combine_create,
329 vircam_twilight_flat_combine_exec,
330 vircam_twilight_flat_combine_destroy);
332 cpl_pluginlist_append(list,plugin);
348 static int vircam_twilight_flat_combine_create(cpl_plugin *plugin) {
354 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
355 recipe = (cpl_recipe *)plugin;
361 recipe->parameters = cpl_parameterlist_new();
365 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.lthr",
367 "Low rejection threshold for underexpsed images",
368 "vircam.vircam_twilight_flat_combine",
370 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"lthr");
371 cpl_parameterlist_append(recipe->parameters,p);
375 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.hthr",
377 "High rejection threshold for overexposed images",
378 "vircam.vircam_twilight_flat_combine",
380 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"hthr");
381 cpl_parameterlist_append(recipe->parameters,p);
385 p = cpl_parameter_new_range(
"vircam.vircam_twilight_flat_combine.combtype",
387 "1 == Median,\n 2 == Mean",
388 "vircam.vircam_twilight_flat_combine",
390 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"combtype");
391 cpl_parameterlist_append(recipe->parameters,p);
395 p = cpl_parameter_new_range(
"vircam.vircam_twilight_flat_combine.scaletype",
397 "0 == none,\n 1 == additive offset,\n 2 == multiplicative offset,\n 3 == exposure time scaling + additive offset",
398 "vircam.vircam_twilight_flat_combine",
400 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"scaletype");
401 cpl_parameterlist_append(recipe->parameters,p);
405 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.xrej",
407 "True if using extra rejection cycle",
408 "vircam.vircam_twilight_flat_combine",
410 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"xrej");
411 cpl_parameterlist_append(recipe->parameters,p);
415 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.thresh",
417 "Rejection threshold in sigma above background",
418 "vircam.vircam_twilight_flat_combine",5.0);
419 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thresh");
420 cpl_parameterlist_append(recipe->parameters,p);
424 p = cpl_parameter_new_enum(
"vircam.vircam_twilight_flat_combine.ncells",
426 "Number of cells for data channel stats",
427 "vircam.vircam_twilight_flat_combine",8,7,1,2,4,
429 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ncells");
430 cpl_parameterlist_append(recipe->parameters,p);
434 p = cpl_parameter_new_range(
"vircam.vircam_twilight_flat_combine.extenum",
436 "Extension number to be done, 0 == all",
437 "vircam.vircam_twilight_flat_combine",
439 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
440 cpl_parameterlist_append(recipe->parameters,p);
456 static int vircam_twilight_flat_combine_exec(cpl_plugin *plugin) {
461 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
462 recipe = (cpl_recipe *)plugin;
466 return(vircam_twilight_flat_combine(recipe->parameters,recipe->frames));
477 static int vircam_twilight_flat_combine_destroy(cpl_plugin *plugin) {
482 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
483 recipe = (cpl_recipe *)plugin;
487 cpl_parameterlist_delete(recipe->parameters);
500 static int vircam_twilight_flat_combine(cpl_parameterlist *parlist,
501 cpl_frameset *framelist) {
502 const char *fctid=
"vircam_twilight_flat_combine";
503 int j,jst,jfn,retval,status,live,nx,ny,ndit,npts;
508 cpl_propertylist *pp;
509 cpl_image *im1,*im2,*newim,*diffim;
510 double val1,val2,scl;
516 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
517 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
524 cpl_msg_error(fctid,
"Input frameset is missing files. Check SOF");
530 vircam_twilight_flat_combine_init();
531 we_expect = MEANTWI + CONFMAP;
535 p = cpl_parameterlist_find(parlist,
"vircam.vircam_twilight_flat_combine.lthr");
536 vircam_twilight_flat_combine_config.lthr =
537 (float)cpl_parameter_get_double(p);
538 p = cpl_parameterlist_find(parlist,
539 "vircam.vircam_twilight_flat_combine.hthr");
540 vircam_twilight_flat_combine_config.hthr =
541 (float)cpl_parameter_get_double(p);
542 p = cpl_parameterlist_find(parlist,
543 "vircam.vircam_twilight_flat_combine.combtype");
544 vircam_twilight_flat_combine_config.combtype = cpl_parameter_get_int(p);
545 p = cpl_parameterlist_find(parlist,
546 "vircam.vircam_twilight_flat_combine.scaletype");
547 vircam_twilight_flat_combine_config.scaletype = cpl_parameter_get_int(p);
548 p = cpl_parameterlist_find(parlist,
549 "vircam.vircam_twilight_flat_combine.xrej");
550 vircam_twilight_flat_combine_config.xrej = cpl_parameter_get_bool(p);
551 p = cpl_parameterlist_find(parlist,
552 "vircam.vircam_twilight_flat_combine.thresh");
553 vircam_twilight_flat_combine_config.thresh =
554 (float)cpl_parameter_get_double(p);
555 p = cpl_parameterlist_find(parlist,
556 "vircam.vircam_twilight_flat_combine.ncells");
557 vircam_twilight_flat_combine_config.ncells = cpl_parameter_get_int(p);
558 p = cpl_parameterlist_find(parlist,
559 "vircam.vircam_twilight_flat_combine.extenum");
560 vircam_twilight_flat_combine_config.extenum = cpl_parameter_get_int(p);
565 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
566 vircam_twilight_flat_combine_tidy(2);
574 cpl_msg_error(fctid,
"Cannot labelise the input frames");
575 vircam_twilight_flat_combine_tidy(2);
579 VIRCAM_TWI_RAW)) == NULL) {
580 cpl_msg_error(fctid,
"Cannot find twilight frames in input frameset");
581 vircam_twilight_flat_combine_tidy(2);
584 ps.ntwilights = cpl_frameset_get_size(ps.twilightlist);
589 VIRCAM_CAL_DARK)) == NULL) {
590 cpl_msg_error(fctid,
"No master dark found");
591 vircam_twilight_flat_combine_tidy(2);
598 ps.labels,nlab,VIRCAM_REF_TWILIGHT_FLAT)) == NULL)
599 cpl_msg_info(fctid,
"No master twilight flat found -- no ratio image will be formed");
611 VIRCAM_CAL_CHANTAB)) == NULL) {
613 VIRCAM_CAL_CHANTAB_INIT)) == NULL) {
614 cpl_msg_info(fctid,
"No channel table found -- no ratio image stats and no linearisation will be done");
616 cpl_msg_info(fctid,
"Channel table is labelled INIT -- no linearisation will be done");
617 if (we_expect & RATIMG)
618 we_expect |= STATS_TAB;
620 }
else if (we_expect & RATIMG) {
621 we_expect |= STATS_TAB;
626 pp = cpl_propertylist_load(cpl_frame_get_filename(cpl_frameset_get_frame(ps.twilightlist,0)),0);
628 cpl_msg_error(fctid,
"No value for NDIT available");
629 freepropertylist(pp);
630 vircam_twilight_flat_combine_tidy(2);
633 cpl_propertylist_delete(pp);
640 (
const cpl_frame *)cpl_frameset_get_frame(ps.twilightlist,0),
642 if (jst == -1 || jfn == -1) {
643 cpl_msg_error(fctid,
"Unable to continue");
644 vircam_twilight_flat_combine_tidy(2);
650 ps.good = cpl_malloc(ps.ntwilights*
sizeof(vir_fits *));
654 for (j = jst; j <= jfn; j++) {
657 isfirst = (j == jst);
662 if (ps.twilights == NULL) {
664 "Extension %" CPL_SIZE_FORMAT
" twilights wouldn't load",
666 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
675 for (i = 0; i < ps.ntwilights; i++) {
676 ff = ps.twilights[i];
679 cpl_msg_info(fctid,
"Detector flagged dead %s",
683 ps.good[ps.ngood] = ff;
692 cpl_msg_info(fctid,
"All images flagged bad for this extension");
693 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
702 vircam_twilight_flat_combine_config.lthr,
703 vircam_twilight_flat_combine_config.hthr,0,
704 &(vircam_twilight_flat_combine_config.minv),
705 &(vircam_twilight_flat_combine_config.maxv),
706 &(vircam_twilight_flat_combine_config.avev));
712 cpl_msg_info(fctid,
"All images either under or overexposed");
713 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
725 "Unable to load mask image %s[%" CPL_SIZE_FORMAT
"]",
728 cpl_msg_info(fctid,
"Forcing all pixels to be good from now on");
739 val1 = cpl_image_get_median_window(im1,500,500,1000,1000);
740 val2 = cpl_image_get_median_window(im2,500,500,1000,1000);
741 val1 /= (double)ndit;
742 val2 /= (double)ndit;
744 newim = cpl_image_multiply_scalar_create(im2,scl);
745 diffim = cpl_image_subtract_create(im1,newim);
746 cpl_image_delete(newim);
747 data = cpl_image_get_data_float(diffim);
751 mad *= 1.48/CPL_MATH_SQRT2;
752 vircam_twilight_flat_combine_config.photnoise = mad;
753 vircam_twilight_flat_combine_config.snratio =
754 val1*sqrt((
double)(ps.ngood))/mad;
755 cpl_image_delete(diffim);
757 vircam_twilight_flat_combine_config.photnoise = 0.0;
758 vircam_twilight_flat_combine_config.snratio = 0.0;
765 if (ps.mdark == NULL) {
767 "Can't load master dark for extension %" CPL_SIZE_FORMAT,
769 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
775 "Can't master dark extension %" CPL_SIZE_FORMAT
" is a dummy",
777 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
785 cpl_msg_info(fctid,
"Dark correcting extension %" CPL_SIZE_FORMAT,
787 for (i = 0; i < ps.ngood; i++)
793 if (ps.chantab != NULL) {
795 if (ps.ctable == NULL) {
797 "Channel table extension %" CPL_SIZE_FORMAT
" won't load",
801 "Channel table extension %" CPL_SIZE_FORMAT
" has errors",
803 freetfits(ps.ctable);
805 pp = cpl_propertylist_load(cpl_frame_get_filename(ps.chantab),
809 "Channel table extensions %" CPL_SIZE_FORMAT
" is a dummy",
811 freetfits(ps.ctable);
813 freepropertylist(pp);
821 if (ps.ctable != NULL) {
823 "Linearising extension %" CPL_SIZE_FORMAT,
825 for (i = 0; i < ps.ngood; i++)
831 for (i = 0; i < ps.ngood; i++)
837 "Doing combination for extension %" CPL_SIZE_FORMAT,
840 vircam_twilight_flat_combine_config.combtype,
841 vircam_twilight_flat_combine_config.scaletype,
842 vircam_twilight_flat_combine_config.xrej,
843 vircam_twilight_flat_combine_config.thresh,
844 &(ps.outimage),&(ps.rejmask),&(ps.rejplus),
850 if (status == VIR_OK) {
852 vircam_twilight_flat_combine_normal(j);
854 cpl_msg_info(fctid,
"A processing step failed");
859 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
864 vircam_twilight_flat_combine_tidy(2);
878 static int vircam_twilight_flat_combine_save(cpl_frameset *framelist,
879 cpl_parameterlist *parlist) {
880 cpl_propertylist *plist,*elist,*p,*pafprop;
883 const char *fctid =
"vircam_twilight_flat_combine_save";
884 const char *outfile =
"twilightcomb.fits";
885 const char *outdiff =
"twilightratio.fits";
886 const char *outdimst =
"twilightratiotab.fits";
887 const char *outconf =
"twilightconf.fits";
888 const char *outfilepaf =
"twilightcomb";
889 const char *outdiffpaf =
"twilightratio";
890 const char *recipeid =
"vircam_twilight_flat_combine";
899 product_frame_mean_twi = cpl_frame_new();
900 cpl_frame_set_filename(product_frame_mean_twi,outfile);
901 cpl_frame_set_tag(product_frame_mean_twi,VIRCAM_PRO_TWILIGHT_FLAT);
902 cpl_frame_set_type(product_frame_mean_twi,CPL_FRAME_TYPE_IMAGE);
903 cpl_frame_set_group(product_frame_mean_twi,CPL_FRAME_GROUP_PRODUCT);
904 cpl_frame_set_level(product_frame_mean_twi,CPL_FRAME_LEVEL_FINAL);
909 ps.phupaf = vircam_paf_phu_items(plist);
910 if (ps.master_twilight_flat != NULL) {
911 cpl_propertylist_update_string(ps.phupaf,
"REF_TWILIGHT",
912 cpl_frame_get_filename(ps.master_twilight_flat));
913 cpl_propertylist_set_comment(ps.phupaf,
"REF_TWILIGHT",
914 "Reference twilight flat used");
923 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
924 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
925 cpl_msg_error(fctid,
"Cannot save product PHU");
926 cpl_frame_delete(product_frame_mean_twi);
929 cpl_frameset_insert(framelist,product_frame_mean_twi);
934 product_frame_conf = cpl_frame_new();
935 cpl_frame_set_filename(product_frame_conf,outconf);
936 cpl_frame_set_tag(product_frame_conf,VIRCAM_PRO_CONF);
937 cpl_frame_set_type(product_frame_conf,CPL_FRAME_TYPE_IMAGE);
938 cpl_frame_set_group(product_frame_conf,CPL_FRAME_GROUP_PRODUCT);
939 cpl_frame_set_level(product_frame_conf,CPL_FRAME_LEVEL_FINAL);
946 (
char *)recipeid,
"PRO-1.15",
951 if (cpl_image_save(NULL,outconf,CPL_TYPE_UCHAR,plist,
952 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
953 cpl_msg_error(fctid,
"Cannot save product PHU");
954 cpl_frame_delete(product_frame_conf);
957 cpl_frameset_insert(framelist,product_frame_conf);
961 if (we_expect & RATIMG) {
962 product_frame_ratioimg = cpl_frame_new();
963 cpl_frame_set_filename(product_frame_ratioimg,outdiff);
964 cpl_frame_set_tag(product_frame_ratioimg,
965 VIRCAM_PRO_RATIOIMG_TWILIGHT_FLAT);
966 cpl_frame_set_type(product_frame_ratioimg,CPL_FRAME_TYPE_IMAGE);
967 cpl_frame_set_group(product_frame_ratioimg,
968 CPL_FRAME_GROUP_PRODUCT);
969 cpl_frame_set_level(product_frame_ratioimg,CPL_FRAME_LEVEL_FINAL);
976 (
char *)recipeid,
"PRO-1.15",
981 if (cpl_image_save(NULL,outdiff,CPL_TYPE_CHAR,plist,
982 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
983 cpl_msg_error(fctid,
"Cannot save product PHU");
984 cpl_frame_delete(product_frame_ratioimg);
987 cpl_frameset_insert(framelist,product_frame_ratioimg);
993 if (we_expect & STATS_TAB) {
994 product_frame_ratioimg_stats = cpl_frame_new();
995 cpl_frame_set_filename(product_frame_ratioimg_stats,outdimst);
996 cpl_frame_set_tag(product_frame_ratioimg_stats,
997 VIRCAM_PRO_RATIOIMG_TWILIGHT_FLAT_STATS);
998 cpl_frame_set_type(product_frame_ratioimg_stats,
999 CPL_FRAME_TYPE_TABLE);
1000 cpl_frame_set_group(product_frame_ratioimg_stats,
1001 CPL_FRAME_GROUP_PRODUCT);
1002 cpl_frame_set_level(product_frame_ratioimg_stats,
1003 CPL_FRAME_LEVEL_FINAL);
1009 product_frame_ratioimg_stats,
1011 (
char *)recipeid,
"PRO-1.15",
1017 p = cpl_propertylist_duplicate(elist);
1019 if (! (we_get & STATS_TAB))
1030 if (cpl_table_save(ps.ratioimstats,plist,p,outdimst,
1031 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
1032 cpl_msg_error(fctid,
"Cannot save product table extension");
1033 cpl_propertylist_delete(p);
1036 cpl_propertylist_delete(p);
1037 cpl_frameset_insert(framelist,product_frame_ratioimg_stats);
1045 cpl_propertylist_update_int(plist,
"ESO PRO DATANCOM",ps.ngood);
1049 p = cpl_propertylist_duplicate(plist);
1050 if (! (we_get & MEANTWI))
1053 parlist,(
char *)recipeid,
1058 cpl_propertylist_update_float(p,
"ESO QC FLATRMS",
1059 vircam_twilight_flat_combine_config.flatrms);
1060 cpl_propertylist_set_comment(p,
"ESO QC FLATRMS",
"RMS of output flat");
1061 cpl_propertylist_update_float(p,
"ESO QC FLATMIN",
1062 vircam_twilight_flat_combine_config.minv);
1063 cpl_propertylist_set_comment(p,
"ESO QC FLATMIN",
"Ensemble minimum");
1064 cpl_propertylist_update_float(p,
"ESO QC FLATMAX",
1065 vircam_twilight_flat_combine_config.maxv);
1066 cpl_propertylist_set_comment(p,
"ESO QC FLATMAX",
"Ensemble maximum");
1067 cpl_propertylist_update_float(p,
"ESO QC FLATAVG",
1068 vircam_twilight_flat_combine_config.avev);
1069 cpl_propertylist_set_comment(p,
"ESO QC FLATAVG",
"Ensemble average");
1070 val = vircam_twilight_flat_combine_config.maxv -
1071 vircam_twilight_flat_combine_config.minv;
1072 cpl_propertylist_update_float(p,
"ESO QC FLATRNG",val);
1073 cpl_propertylist_set_comment(p,
"ESO QC FLATRNG",
"Ensemble range");
1074 cpl_propertylist_update_float(p,
"ESO QC TWIPHOT",
1075 vircam_twilight_flat_combine_config.photnoise);
1076 cpl_propertylist_set_comment(p,
"ESO QC TWIPHOT",
1077 "[adu] Estimated photon noise");
1078 cpl_propertylist_update_float(p,
"ESO QC TWISNRATIO",
1079 vircam_twilight_flat_combine_config.snratio);
1080 cpl_propertylist_set_comment(p,
"ESO QC TWISNRATIO",
"Estimated S/N ratio");
1081 if (cpl_image_save(ps.outimage,outfile,CPL_TYPE_FLOAT,p,
1082 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1083 cpl_msg_error(fctid,
"Cannot save product image extension");
1084 cpl_propertylist_delete(p);
1090 pafprop = vircam_paf_req_items(p);
1093 "ESO INS FILT1 NAME");
1094 vircam_paf_append(pafprop,p,
"ESO PRO CATG");
1095 vircam_paf_append(pafprop,p,
"ESO PRO DATANCOM");
1096 vircam_paf_append(pafprop,p,
"ESO DET NDIT");
1097 if (vircam_paf_print((
char *)outfilepaf,
1098 "VIRCAM/vircam_twilight_flat_combine",
1099 "QC file",pafprop) != VIR_OK)
1100 cpl_msg_warning(fctid,
"Unable to save PAF for mean twilight");
1101 cpl_propertylist_delete(pafprop);
1102 cpl_propertylist_delete(p);
1106 if (we_expect & RATIMG) {
1107 p = cpl_propertylist_duplicate(plist);
1108 if (! (we_get & RATIMG))
1110 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_MED",
1111 vircam_twilight_flat_combine_config.flatratio_med);
1112 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_MED",
1113 "Median of ratio map");
1114 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_RMS",
1115 vircam_twilight_flat_combine_config.flatratio_rms);
1116 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_RMS",
1117 "RMS of ratio map");
1119 framelist,parlist,(
char *)recipeid,
1121 if (cpl_image_save(ps.ratioimg,outdiff,CPL_TYPE_FLOAT,p,
1122 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1123 cpl_propertylist_delete(p);
1124 cpl_msg_error(fctid,
"Cannot save product image extension");
1130 pafprop = vircam_paf_req_items(p);
1133 "ESO INS FILT1 NAME");
1134 vircam_paf_append(pafprop,p,
"ESO PRO CATG");
1135 if (vircam_paf_print((
char *)outdiffpaf,
1136 "VIRCAM/vircam_twilight_flat_combine",
1137 "QC file",pafprop) != VIR_OK)
1138 cpl_msg_warning(fctid,
"Unable to save PAF for twilight ratio image");
1139 cpl_propertylist_delete(pafprop);
1140 cpl_propertylist_delete(p);
1145 if (! isfirst && (we_expect & STATS_TAB)) {
1146 p = cpl_propertylist_duplicate(plist);
1147 if (! (we_get & STATS_TAB))
1150 framelist,parlist,(
char *)recipeid,
1154 if (cpl_table_save(ps.ratioimstats,NULL,p,outdimst,CPL_IO_EXTEND)
1155 != CPL_ERROR_NONE) {
1156 cpl_msg_error(fctid,
"Cannot save product table extension");
1157 cpl_propertylist_delete(p);
1160 cpl_propertylist_delete(p);
1166 p = cpl_propertylist_duplicate(plist);
1167 if (! (we_get & CONFMAP))
1173 parlist,(
char *)recipeid,
"PRO-1.15",
1175 if (cpl_image_save(ps.outconf,outconf,CPL_TYPE_SHORT,p,
1176 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1177 cpl_msg_error(fctid,
"Cannot save product image extension");
1178 cpl_propertylist_delete(p);
1181 cpl_propertylist_delete(p);
1194 static void vircam_twilight_flat_combine_dummy_products(
void) {
1198 if (we_get == we_expect)
1203 if (! (we_get & MEANTWI)) {
1205 vircam_twilight_flat_combine_config.flatrms = 0.0;
1210 if (! (we_get & CONFMAP)) {
1212 vircam_twilight_flat_combine_config.flatrms = 0.0;
1217 if ((we_expect & RATIMG) && ! (we_get & RATIMG)) {
1218 vircam_twilight_flat_combine_config.flatratio_med = 0.0;
1219 vircam_twilight_flat_combine_config.flatratio_rms = 0.0;
1225 if ((we_expect & STATS_TAB) && ! (we_get & STATS_TAB))
1238 static void vircam_twilight_flat_combine_normal(
int jext) {
1239 int nx,ny,ncells,status;
1242 float *idata,med,sig,gdiff,grms;
1243 const char *fctid=
"vircam_twilight_flat_combine_normal";
1247 nx = (int)cpl_image_get_size_x(ps.outimage);
1248 ny = (int)cpl_image_get_size_y(ps.outimage);
1256 (void)
vircam_mkconf(ps.outimage,(
char *)
"None Available",ps.master_mask,
1257 &(ps.outconf),&(ps.drs2),&status);
1258 if (status == VIR_OK)
1262 "Confidence map creation failed extension %" CPL_SIZE_FORMAT,
1269 idata = cpl_image_get_data(ps.outimage);
1274 for (i = 0; i < npi; i++)
1280 cpl_propertylist_update_float(ps.drs,
"ESO DRS MEDFLAT",med);
1281 cpl_propertylist_set_comment(ps.drs,
"ESO DRS MEDFLAT",
1282 "Median value before normalisation");
1283 cpl_image_divide_scalar(ps.outimage,med);
1286 vircam_twilight_flat_combine_config.flatrms = sig;
1290 if (ps.master_twilight_flat != NULL) {
1291 ps.mfimage =
vircam_fits_load(ps.master_twilight_flat,CPL_TYPE_FLOAT,jext);
1292 if (ps.mfimage == NULL) {
1294 "Master twilight extension %" CPL_SIZE_FORMAT
" won't load",
1298 "Master twilight extension %" CPL_SIZE_FORMAT
" is a dummy",
1300 freefits(ps.mfimage);
1312 vircam_twilight_flat_combine_config.flatratio_med = 0.0;
1313 vircam_twilight_flat_combine_config.flatratio_rms = 0.0;
1314 ncells = vircam_twilight_flat_combine_config.ncells;
1317 &gdiff,&grms,&(ps.ratioimg),
1318 &(ps.ratioimstats));
1320 vircam_twilight_flat_combine_config.flatratio_med = gdiff;
1321 vircam_twilight_flat_combine_config.flatratio_rms = grms;
1322 if (ps.ratioimg != NULL)
1324 if (ps.ratioimstats != NULL)
1325 we_get |= STATS_TAB;
1340 static int vircam_twilight_flat_combine_lastbit(
int jext,
1341 cpl_frameset *framelist,
1342 cpl_parameterlist *parlist) {
1344 const char *fctid=
"vircam_twilight_flat_combine_lastbit";
1348 vircam_twilight_flat_combine_dummy_products();
1353 "Saving products for extension %" CPL_SIZE_FORMAT,
1355 retval = vircam_twilight_flat_combine_save(framelist,parlist);
1357 vircam_twilight_flat_combine_tidy(2);
1363 vircam_twilight_flat_combine_tidy(1);
1373 static void vircam_twilight_flat_combine_init(
void) {
1375 ps.twilightlist = NULL;
1376 ps.twilights = NULL;
1378 ps.master_dark = NULL;
1379 ps.master_twilight_flat = NULL;
1380 ps.master_mask = NULL;
1391 ps.ratioimstats = NULL;
1401 static void vircam_twilight_flat_combine_tidy(
int level) {
1402 freeimage(ps.outimage);
1403 freeimage(ps.outconf);
1404 freefitslist(ps.twilights,ps.ntwilights);
1405 freepropertylist(ps.drs);
1406 freepropertylist(ps.drs2);
1407 freespace(ps.rejmask);
1408 freespace(ps.rejplus);
1409 freefits(ps.mfimage);
1410 freeimage(ps.ratioimg);
1411 freetable(ps.ratioimstats);
1412 freetfits(ps.ctable);
1418 freespace(ps.labels);
1419 freeframeset(ps.twilightlist);
1420 freeframe(ps.master_dark);
1421 freeframe(ps.master_twilight_flat);
1422 freemask(ps.master_mask);
1423 freeframe(ps.chantab);
1424 freepropertylist(ps.phupaf);