38 #include <casu_utils.h>
39 #include <casu_mods.h>
40 #include <casu_mask.h>
41 #include <casu_wcsutils.h>
42 #include <casu_stats.h>
44 #include "vircam_utils.h"
45 #include "vircam_dfs.h"
46 #include "vircam_mods.h"
47 #include "vircam_pfits.h"
48 #include "vircam_channel.h"
49 #include "vircam_paf.h"
60 static int vircam_twilight_flat_combine_create(cpl_plugin *) ;
61 static int vircam_twilight_flat_combine_exec(cpl_plugin *) ;
62 static int vircam_twilight_flat_combine_destroy(cpl_plugin *) ;
63 static int vircam_twilight_flat_combine(cpl_parameterlist *, cpl_frameset *) ;
64 static int vircam_twilight_flat_combine_save(cpl_frameset *framelist,
65 cpl_parameterlist *parlist);
66 static void vircam_twilight_flat_combine_dummy_products(
void);
67 static void vircam_twilight_flat_combine_normal(
int jext);
68 static int vircam_twilight_flat_combine_lastbit(
int jext,
69 cpl_frameset *framelist,
70 cpl_parameterlist *parlist);
71 static void vircam_twilight_flat_combine_init(
void);
72 static void vircam_twilight_flat_combine_tidy(
int level);
100 } vircam_twilight_flat_combine_config;
105 cpl_frameset *twilightlist;
106 cpl_frameset *twilightlist_cull;
107 cpl_frame *master_dark;
108 cpl_frame *master_twilight_flat;
109 casu_mask *master_mask;
117 casu_fits **twilights;
119 cpl_propertylist *drs;
120 cpl_propertylist *drs2;
121 unsigned char *rejmask;
122 unsigned char *rejplus;
125 cpl_table *ratioimstats;
128 cpl_propertylist *phupaf;
132 static cpl_frame *product_frame_mean_twi = NULL;
133 static cpl_frame *product_frame_conf = NULL;
134 static cpl_frame *product_frame_ratioimg = NULL;
135 static cpl_frame *product_frame_ratioimg_stats = NULL;
136 static int we_expect;
139 static char vircam_twilight_flat_combine_description[] =
140 "vircam_twilight_flat_combine -- VIRCAM twilight flat combine recipe.\n\n"
141 "Combine a list of twilight flat frames into a mean frame. Optionally\n"
142 "compare the output frame to a master twilight flat frame\n\n"
143 "The program accepts the following files in the SOF:\n\n"
145 " -----------------------------------------------------------------------\n"
146 " %-21s A list of raw twilight flat images\n"
147 " %-21s A master dark frame\n"
148 " %-21s Optional reference twilight flat frame\n"
149 " %-21s Optional channel table or\n"
150 " %-21s Optional initial channel table\n"
151 " %-21s Optional master bad pixel map or\n"
152 " %-21s Optional master confidence map\n"
153 "If no reference twilight flat is made available, then no comparison will be\n"
154 "done. This means there will be no output ratio image. If a master twilight\n"
155 "is available, but no channel table is, then a ratio image will be formed\n"
156 "but no stats will be written."
313 int cpl_plugin_get_info(cpl_pluginlist *list) {
314 cpl_recipe *recipe = cpl_calloc(1,
sizeof(*recipe));
315 cpl_plugin *plugin = &recipe->interface;
316 char alldesc[SZ_ALLDESC];
317 (void)snprintf(alldesc,SZ_ALLDESC,vircam_twilight_flat_combine_description,
318 VIRCAM_TWI_RAW,VIRCAM_CAL_DARK,VIRCAM_REF_TWILIGHT_FLAT,
319 VIRCAM_CAL_CHANTAB,VIRCAM_CAL_CHANTAB_INIT,VIRCAM_CAL_BPM,
322 cpl_plugin_init(plugin,
324 VIRCAM_BINARY_VERSION,
325 CPL_PLUGIN_TYPE_RECIPE,
326 "vircam_twilight_flat_combine",
327 "VIRCAM twilight combination recipe",
332 vircam_twilight_flat_combine_create,
333 vircam_twilight_flat_combine_exec,
334 vircam_twilight_flat_combine_destroy);
336 cpl_pluginlist_append(list,plugin);
352 static int vircam_twilight_flat_combine_create(cpl_plugin *plugin) {
358 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
359 recipe = (cpl_recipe *)plugin;
365 recipe->parameters = cpl_parameterlist_new();
369 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.lthr",
371 "Low rejection threshold for underexpsed images",
372 "vircam.vircam_twilight_flat_combine",
374 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"lthr");
375 cpl_parameterlist_append(recipe->parameters,p);
379 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.hthr",
381 "High rejection threshold for overexposed images",
382 "vircam.vircam_twilight_flat_combine",
384 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"hthr");
385 cpl_parameterlist_append(recipe->parameters,p);
389 p = cpl_parameter_new_range(
"vircam.vircam_twilight_flat_combine.combtype",
391 "1 == Median,\n 2 == Mean",
392 "vircam.vircam_twilight_flat_combine",
394 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"combtype");
395 cpl_parameterlist_append(recipe->parameters,p);
399 p = cpl_parameter_new_range(
"vircam.vircam_twilight_flat_combine.scaletype",
401 "0 == none,\n 1 == additive offset,\n 2 == multiplicative offset,\n 3 == exposure time scaling + additive offset",
402 "vircam.vircam_twilight_flat_combine",
404 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"scaletype");
405 cpl_parameterlist_append(recipe->parameters,p);
409 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.xrej",
411 "True if using extra rejection cycle",
412 "vircam.vircam_twilight_flat_combine",
414 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"xrej");
415 cpl_parameterlist_append(recipe->parameters,p);
419 p = cpl_parameter_new_value(
"vircam.vircam_twilight_flat_combine.thresh",
421 "Rejection threshold in sigma above background",
422 "vircam.vircam_twilight_flat_combine",5.0);
423 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"thresh");
424 cpl_parameterlist_append(recipe->parameters,p);
428 p = cpl_parameter_new_enum(
"vircam.vircam_twilight_flat_combine.ncells",
430 "Number of cells for data channel stats",
431 "vircam.vircam_twilight_flat_combine",8,7,1,2,4,
433 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ncells");
434 cpl_parameterlist_append(recipe->parameters,p);
438 p = cpl_parameter_new_range(
"vircam.vircam_twilight_flat_combine.extenum",
440 "Extension number to be done, 0 == all",
441 "vircam.vircam_twilight_flat_combine",
443 cpl_parameter_set_alias(p,CPL_PARAMETER_MODE_CLI,
"ext");
444 cpl_parameterlist_append(recipe->parameters,p);
460 static int vircam_twilight_flat_combine_exec(cpl_plugin *plugin) {
465 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
466 recipe = (cpl_recipe *)plugin;
470 return(vircam_twilight_flat_combine(recipe->parameters,recipe->frames));
481 static int vircam_twilight_flat_combine_destroy(cpl_plugin *plugin) {
486 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
487 recipe = (cpl_recipe *)plugin;
491 cpl_parameterlist_delete(recipe->parameters);
504 static int vircam_twilight_flat_combine(cpl_parameterlist *parlist,
505 cpl_frameset *framelist) {
506 const char *fctid=
"vircam_twilight_flat_combine";
507 int j = 1,jst,jfn,retval,status,nx,ny,ndit,npts,cstat;
511 cpl_propertylist *pp;
512 cpl_image *im1,*im2,*newim,*diffim;
513 double val1,val2,scl;
519 if (framelist == NULL || cpl_frameset_get_size(framelist) <= 0) {
520 cpl_msg_error(fctid,
"Input framelist NULL or has no input data");
526 vircam_twilight_flat_combine_init();
527 we_expect = MEANTWI + CONFMAP;
531 p = cpl_parameterlist_find(parlist,
"vircam.vircam_twilight_flat_combine.lthr");
532 vircam_twilight_flat_combine_config.lthr =
533 (float)cpl_parameter_get_double(p);
534 p = cpl_parameterlist_find(parlist,
535 "vircam.vircam_twilight_flat_combine.hthr");
536 vircam_twilight_flat_combine_config.hthr =
537 (float)cpl_parameter_get_double(p);
538 p = cpl_parameterlist_find(parlist,
539 "vircam.vircam_twilight_flat_combine.combtype");
540 vircam_twilight_flat_combine_config.combtype = cpl_parameter_get_int(p);
541 p = cpl_parameterlist_find(parlist,
542 "vircam.vircam_twilight_flat_combine.scaletype");
543 vircam_twilight_flat_combine_config.scaletype = cpl_parameter_get_int(p);
544 p = cpl_parameterlist_find(parlist,
545 "vircam.vircam_twilight_flat_combine.xrej");
546 vircam_twilight_flat_combine_config.xrej = cpl_parameter_get_bool(p);
547 p = cpl_parameterlist_find(parlist,
548 "vircam.vircam_twilight_flat_combine.thresh");
549 vircam_twilight_flat_combine_config.thresh =
550 (float)cpl_parameter_get_double(p);
551 p = cpl_parameterlist_find(parlist,
552 "vircam.vircam_twilight_flat_combine.ncells");
553 vircam_twilight_flat_combine_config.ncells = cpl_parameter_get_int(p);
554 p = cpl_parameterlist_find(parlist,
555 "vircam.vircam_twilight_flat_combine.extenum");
556 vircam_twilight_flat_combine_config.extenum = cpl_parameter_get_int(p);
561 cpl_msg_error(fctid,
"Cannot identify RAW and CALIB frames");
562 vircam_twilight_flat_combine_tidy(2);
570 cpl_msg_error(fctid,
"Cannot labelise the input frames");
571 vircam_twilight_flat_combine_tidy(2);
575 VIRCAM_TWI_RAW)) == NULL) {
576 cpl_msg_error(fctid,
"Cannot find twilight frames in input frameset");
577 vircam_twilight_flat_combine_tidy(2);
580 ps.ntwilights = cpl_frameset_get_size(ps.twilightlist);
585 VIRCAM_CAL_DARK)) == NULL) {
586 cpl_msg_error(fctid,
"No master dark found");
587 vircam_twilight_flat_combine_tidy(2);
594 ps.labels,nlab,VIRCAM_REF_TWILIGHT_FLAT)) == NULL)
595 cpl_msg_info(fctid,
"No master twilight flat found -- no ratio image will be formed");
608 VIRCAM_CAL_CHANTAB)) == NULL) {
610 VIRCAM_CAL_CHANTAB_INIT)) == NULL) {
611 cpl_msg_info(fctid,
"No channel table found -- no ratio image stats and no linearisation will be done");
613 cpl_msg_info(fctid,
"Channel table is labelled INIT -- no linearisation will be done");
614 if (we_expect & RATIMG)
615 we_expect |= STATS_TAB;
617 }
else if (we_expect & RATIMG) {
618 we_expect |= STATS_TAB;
623 pp = cpl_propertylist_load(cpl_frame_get_filename(cpl_frameset_get_position(ps.twilightlist,0)),0);
625 cpl_msg_error(fctid,
"No value for NDIT available");
626 freepropertylist(pp);
627 vircam_twilight_flat_combine_tidy(2);
630 cpl_propertylist_delete(pp);
637 (
const cpl_frame *)cpl_frameset_get_position(ps.twilightlist,0),
639 if (jst == -1 || jfn == -1) {
640 cpl_msg_error(fctid,
"Unable to continue");
641 vircam_twilight_flat_combine_tidy(2);
648 vircam_cull(ps.twilightlist,vircam_twilight_flat_combine_config.lthr,
649 vircam_twilight_flat_combine_config.hthr,ndit,jst,jfn,
650 &(ps.mins),&(ps.maxs),&(ps.aves),&(ps.twilightlist_cull),
652 ps.ntwilights = cpl_frameset_get_size(ps.twilightlist_cull);
658 cpl_msg_info(fctid,
"Detector is flagged as dead");
662 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
665 vircam_twilight_flat_combine_tidy(2);
673 cpl_msg_info(fctid,
"All images either under or overexposed");
674 for (j = jst; j <= jfn; j++) {
676 isfirst = (j == jst);
679 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
683 vircam_twilight_flat_combine_tidy(2);
689 for (j = jst; j <= jfn; j++) {
692 isfirst = (j == jst);
698 if (ps.twilights == NULL) {
700 "Extension %" CPL_SIZE_FORMAT
" twilights wouldn't load",
702 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
714 "Unable to load mask image %s[%" CPL_SIZE_FORMAT
"]",
717 cpl_msg_info(fctid,
"Forcing all pixels to be good from now on");
723 vircam_twilight_flat_combine_config.minv = cpl_array_get(ps.mins,j-jst,
725 vircam_twilight_flat_combine_config.maxv = cpl_array_get(ps.maxs,j-jst,
727 vircam_twilight_flat_combine_config.avev = cpl_array_get(ps.aves,j-jst,
733 if (ps.ntwilights > 1) {
734 i = ps.ntwilights/2 - 1;
737 val1 = cpl_image_get_median_window(im1,500,500,1000,1000);
738 val2 = cpl_image_get_median_window(im2,500,500,1000,1000);
739 val1 /= (double)ndit;
740 val2 /= (double)ndit;
742 newim = cpl_image_multiply_scalar_create(im2,scl);
743 diffim = cpl_image_subtract_create(im1,newim);
744 cpl_image_delete(newim);
745 data = cpl_image_get_data_float(diffim);
749 mad *= 1.48/CPL_MATH_SQRT2;
750 vircam_twilight_flat_combine_config.photnoise = mad;
751 vircam_twilight_flat_combine_config.snratio =
752 val1*sqrt((
double)(ps.ntwilights))/mad;
753 cpl_image_delete(diffim);
755 vircam_twilight_flat_combine_config.photnoise = 0.0;
756 vircam_twilight_flat_combine_config.snratio = 0.0;
763 if (ps.mdark == NULL) {
765 "Can't load master dark for extension %" CPL_SIZE_FORMAT,
767 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
773 "Can't master dark extension %" CPL_SIZE_FORMAT
" is a dummy",
775 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
783 cpl_msg_info(fctid,
"Dark correcting extension %" CPL_SIZE_FORMAT,
785 for (i = 0; i < ps.ntwilights; i++)
791 if (ps.chantab != NULL) {
793 if (ps.ctable == NULL) {
795 "Channel table extension %" CPL_SIZE_FORMAT
" won't load",
799 "Channel table extension %" CPL_SIZE_FORMAT
" has errors",
801 freetfits(ps.ctable);
803 pp = cpl_propertylist_load(cpl_frame_get_filename(ps.chantab),
807 "Channel table extensions %" CPL_SIZE_FORMAT
" is a dummy",
809 freetfits(ps.ctable);
811 freepropertylist(pp);
819 if (ps.ctable != NULL) {
821 "Linearising extension %" CPL_SIZE_FORMAT,
823 for (i = 0; i < ps.ntwilights; i++)
824 (
void)
vircam_lincor((ps.twilights)[i],ps.ctable,1,ndit,&status);
829 for (i = 0; i < ps.ntwilights; i++)
830 (
void)
casu_nditcor((ps.twilights)[i],ndit,
"EXPTIME",&status);
835 "Doing combination for extension %" CPL_SIZE_FORMAT,
838 vircam_twilight_flat_combine_config.combtype,
839 vircam_twilight_flat_combine_config.scaletype,
840 vircam_twilight_flat_combine_config.xrej,
841 vircam_twilight_flat_combine_config.thresh,
842 "EXPTIME",&(ps.outimage),NULL,&(ps.rejmask),
843 &(ps.rejplus),&(ps.drs),&status);
848 if (status == CASU_OK) {
850 vircam_twilight_flat_combine_normal(j);
852 cpl_msg_info(fctid,
"A processing step failed");
857 retval = vircam_twilight_flat_combine_lastbit(j,framelist,parlist);
862 vircam_twilight_flat_combine_tidy(2);
876 static int vircam_twilight_flat_combine_save(cpl_frameset *framelist,
877 cpl_parameterlist *parlist) {
878 cpl_propertylist *plist,*elist,*p,*pafprop;
880 const char *fctid =
"vircam_twilight_flat_combine_save";
881 const char *outfile =
"twilightcomb.fits";
882 const char *outdiff =
"twilightratio.fits";
883 const char *outdimst =
"twilightratiotab.fits";
884 const char *outconf =
"twilightconf.fits";
885 const char *outfilepaf =
"twilightcomb";
886 const char *outdiffpaf =
"twilightratio";
887 const char *recipeid =
"vircam_twilight_flat_combine";
896 product_frame_mean_twi = cpl_frame_new();
897 cpl_frame_set_filename(product_frame_mean_twi,outfile);
898 cpl_frame_set_tag(product_frame_mean_twi,VIRCAM_PRO_TWILIGHT_FLAT);
899 cpl_frame_set_type(product_frame_mean_twi,CPL_FRAME_TYPE_IMAGE);
900 cpl_frame_set_group(product_frame_mean_twi,CPL_FRAME_GROUP_PRODUCT);
901 cpl_frame_set_level(product_frame_mean_twi,CPL_FRAME_LEVEL_FINAL);
906 ps.phupaf = vircam_paf_phu_items(plist);
907 if (ps.master_twilight_flat != NULL) {
908 cpl_propertylist_update_string(ps.phupaf,
"REF_TWILIGHT",
909 cpl_frame_get_filename(ps.master_twilight_flat));
910 cpl_propertylist_set_comment(ps.phupaf,
"REF_TWILIGHT",
911 "Reference twilight flat used");
920 if (cpl_image_save(NULL,outfile,CPL_TYPE_UCHAR,plist,
921 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
922 cpl_msg_error(fctid,
"Cannot save product PHU");
923 cpl_frame_delete(product_frame_mean_twi);
926 cpl_frameset_insert(framelist,product_frame_mean_twi);
931 product_frame_conf = cpl_frame_new();
932 cpl_frame_set_filename(product_frame_conf,outconf);
933 cpl_frame_set_tag(product_frame_conf,VIRCAM_PRO_CONF);
934 cpl_frame_set_type(product_frame_conf,CPL_FRAME_TYPE_IMAGE);
935 cpl_frame_set_group(product_frame_conf,CPL_FRAME_GROUP_PRODUCT);
936 cpl_frame_set_level(product_frame_conf,CPL_FRAME_LEVEL_FINAL);
943 (
char *)recipeid,
"PRO-1.15",
948 if (cpl_image_save(NULL,outconf,CPL_TYPE_UCHAR,plist,
949 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
950 cpl_msg_error(fctid,
"Cannot save product PHU");
951 cpl_frame_delete(product_frame_conf);
954 cpl_frameset_insert(framelist,product_frame_conf);
958 if (we_expect & RATIMG) {
959 product_frame_ratioimg = cpl_frame_new();
960 cpl_frame_set_filename(product_frame_ratioimg,outdiff);
961 cpl_frame_set_tag(product_frame_ratioimg,
962 VIRCAM_PRO_RATIOIMG_TWILIGHT_FLAT);
963 cpl_frame_set_type(product_frame_ratioimg,CPL_FRAME_TYPE_IMAGE);
964 cpl_frame_set_group(product_frame_ratioimg,
965 CPL_FRAME_GROUP_PRODUCT);
966 cpl_frame_set_level(product_frame_ratioimg,CPL_FRAME_LEVEL_FINAL);
973 (
char *)recipeid,
"PRO-1.15",
978 if (cpl_image_save(NULL,outdiff,CPL_TYPE_CHAR,plist,
979 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
980 cpl_msg_error(fctid,
"Cannot save product PHU");
981 cpl_frame_delete(product_frame_ratioimg);
984 cpl_frameset_insert(framelist,product_frame_ratioimg);
990 if (we_expect & STATS_TAB) {
991 product_frame_ratioimg_stats = cpl_frame_new();
992 cpl_frame_set_filename(product_frame_ratioimg_stats,outdimst);
993 cpl_frame_set_tag(product_frame_ratioimg_stats,
994 VIRCAM_PRO_RATIOIMG_TWILIGHT_FLAT_STATS);
995 cpl_frame_set_type(product_frame_ratioimg_stats,
996 CPL_FRAME_TYPE_TABLE);
997 cpl_frame_set_group(product_frame_ratioimg_stats,
998 CPL_FRAME_GROUP_PRODUCT);
999 cpl_frame_set_level(product_frame_ratioimg_stats,
1000 CPL_FRAME_LEVEL_FINAL);
1006 product_frame_ratioimg_stats,
1008 (
char *)recipeid,
"PRO-1.15",
1014 p = cpl_propertylist_duplicate(elist);
1016 if (! (we_get & STATS_TAB))
1026 if (cpl_table_save(ps.ratioimstats,plist,p,outdimst,
1027 CPL_IO_DEFAULT) != CPL_ERROR_NONE) {
1028 cpl_msg_error(fctid,
"Cannot save product table extension");
1029 cpl_propertylist_delete(p);
1032 cpl_propertylist_delete(p);
1033 cpl_frameset_insert(framelist,product_frame_ratioimg_stats);
1041 cpl_propertylist_update_int(plist,
"ESO PRO DATANCOM",ps.ntwilights);
1045 p = cpl_propertylist_duplicate(plist);
1046 if (! (we_get & MEANTWI))
1049 parlist,(
char *)recipeid,
1054 cpl_propertylist_update_float(p,
"ESO QC FLATRMS",
1055 vircam_twilight_flat_combine_config.flatrms);
1056 cpl_propertylist_set_comment(p,
"ESO QC FLATRMS",
"RMS of output flat");
1057 cpl_propertylist_update_float(p,
"ESO QC FLATMIN",
1058 vircam_twilight_flat_combine_config.minv);
1059 cpl_propertylist_set_comment(p,
"ESO QC FLATMIN",
"Ensemble minimum");
1060 cpl_propertylist_update_float(p,
"ESO QC FLATMAX",
1061 vircam_twilight_flat_combine_config.maxv);
1062 cpl_propertylist_set_comment(p,
"ESO QC FLATMAX",
"Ensemble maximum");
1063 cpl_propertylist_update_float(p,
"ESO QC FLATAVG",
1064 vircam_twilight_flat_combine_config.avev);
1065 cpl_propertylist_set_comment(p,
"ESO QC FLATAVG",
"Ensemble average");
1066 val = vircam_twilight_flat_combine_config.maxv -
1067 vircam_twilight_flat_combine_config.minv;
1068 cpl_propertylist_update_float(p,
"ESO QC FLATRNG",val);
1069 cpl_propertylist_set_comment(p,
"ESO QC FLATRNG",
"Ensemble range");
1070 cpl_propertylist_update_float(p,
"ESO QC TWIPHOT",
1071 vircam_twilight_flat_combine_config.photnoise);
1072 cpl_propertylist_set_comment(p,
"ESO QC TWIPHOT",
1073 "[adu] Estimated photon noise");
1074 cpl_propertylist_update_float(p,
"ESO QC TWISNRATIO",
1075 vircam_twilight_flat_combine_config.snratio);
1076 cpl_propertylist_set_comment(p,
"ESO QC TWISNRATIO",
"Estimated S/N ratio");
1077 if (cpl_image_save(ps.outimage,outfile,CPL_TYPE_FLOAT,p,
1078 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1079 cpl_msg_error(fctid,
"Cannot save product image extension");
1080 cpl_propertylist_delete(p);
1086 pafprop = vircam_paf_req_items(p);
1089 "ESO INS FILT1 NAME");
1090 vircam_paf_append(pafprop,p,
"ESO PRO CATG");
1091 vircam_paf_append(pafprop,p,
"ESO PRO DATANCOM");
1092 vircam_paf_append(pafprop,p,
"ESO DET NDIT");
1093 if (vircam_paf_print((
char *)outfilepaf,
1094 "VIRCAM/vircam_twilight_flat_combine",
1095 "QC file",pafprop) != CASU_OK)
1096 cpl_msg_warning(fctid,
"Unable to save PAF for mean twilight");
1097 cpl_propertylist_delete(pafprop);
1098 cpl_propertylist_delete(p);
1102 if (we_expect & RATIMG) {
1103 p = cpl_propertylist_duplicate(plist);
1104 if (! (we_get & RATIMG))
1106 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_MED",
1107 vircam_twilight_flat_combine_config.flatratio_med);
1108 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_MED",
1109 "Median of ratio map");
1110 cpl_propertylist_update_float(p,
"ESO QC FLATRATIO_RMS",
1111 vircam_twilight_flat_combine_config.flatratio_rms);
1112 cpl_propertylist_set_comment(p,
"ESO QC FLATRATIO_RMS",
1113 "RMS of ratio map");
1115 framelist,parlist,(
char *)recipeid,
1117 if (cpl_image_save(ps.ratioimg,outdiff,CPL_TYPE_FLOAT,p,
1118 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1119 cpl_propertylist_delete(p);
1120 cpl_msg_error(fctid,
"Cannot save product image extension");
1126 pafprop = vircam_paf_req_items(p);
1129 "ESO INS FILT1 NAME");
1130 vircam_paf_append(pafprop,p,
"ESO PRO CATG");
1131 if (vircam_paf_print((
char *)outdiffpaf,
1132 "VIRCAM/vircam_twilight_flat_combine",
1133 "QC file",pafprop) != CASU_OK)
1134 cpl_msg_warning(fctid,
"Unable to save PAF for twilight ratio image");
1135 cpl_propertylist_delete(pafprop);
1136 cpl_propertylist_delete(p);
1141 if (! isfirst && (we_expect & STATS_TAB)) {
1142 p = cpl_propertylist_duplicate(plist);
1143 if (! (we_get & STATS_TAB))
1147 framelist,parlist,(
char *)recipeid,
1149 if (cpl_table_save(ps.ratioimstats,NULL,p,outdimst,CPL_IO_EXTEND)
1150 != CPL_ERROR_NONE) {
1151 cpl_msg_error(fctid,
"Cannot save product table extension");
1152 cpl_propertylist_delete(p);
1155 cpl_propertylist_delete(p);
1161 p = cpl_propertylist_duplicate(plist);
1162 if (! (we_get & CONFMAP))
1168 parlist,(
char *)recipeid,
"PRO-1.15",
1170 if (cpl_image_save(ps.outconf,outconf,CPL_TYPE_SHORT,p,
1171 CPL_IO_EXTEND) != CPL_ERROR_NONE) {
1172 cpl_msg_error(fctid,
"Cannot save product image extension");
1173 cpl_propertylist_delete(p);
1176 cpl_propertylist_delete(p);
1189 static void vircam_twilight_flat_combine_dummy_products(
void) {
1193 if (we_get == we_expect)
1198 if (! (we_get & MEANTWI)) {
1200 vircam_twilight_flat_combine_config.flatrms = 0.0;
1205 if (! (we_get & CONFMAP)) {
1207 vircam_twilight_flat_combine_config.flatrms = 0.0;
1212 if ((we_expect & RATIMG) && ! (we_get & RATIMG)) {
1213 vircam_twilight_flat_combine_config.flatratio_med = 0.0;
1214 vircam_twilight_flat_combine_config.flatratio_rms = 0.0;
1220 if ((we_expect & STATS_TAB) && ! (we_get & STATS_TAB))
1233 static void vircam_twilight_flat_combine_normal(
int jext) {
1234 int nx,ny,ncells,status;
1237 float *idata,med,sig,gdiff,grms;
1238 const char *fctid=
"vircam_twilight_flat_combine_normal";
1242 nx = (int)cpl_image_get_size_x(ps.outimage);
1243 ny = (int)cpl_image_get_size_y(ps.outimage);
1251 (void)
casu_mkconf(ps.outimage,(
char *)
"None Available",ps.master_mask,
1252 &(ps.outconf),&(ps.drs2),&status);
1253 if (status == CASU_OK)
1257 "Confidence map creation failed extension %" CPL_SIZE_FORMAT,
1264 idata = cpl_image_get_data(ps.outimage);
1269 for (i = 0; i < npi; i++)
1275 cpl_propertylist_update_float(ps.drs,
"ESO DRS MEDFLAT",med);
1276 cpl_propertylist_set_comment(ps.drs,
"ESO DRS MEDFLAT",
1277 "Median value before normalisation");
1278 cpl_image_divide_scalar(ps.outimage,med);
1281 vircam_twilight_flat_combine_config.flatrms = sig;
1285 if (ps.master_twilight_flat != NULL) {
1286 ps.mfimage =
casu_fits_load(ps.master_twilight_flat,CPL_TYPE_FLOAT,jext);
1287 if (ps.mfimage == NULL) {
1289 "Master twilight extension %" CPL_SIZE_FORMAT
" won't load",
1293 "Master twilight extension %" CPL_SIZE_FORMAT
" is a dummy",
1295 freefits(ps.mfimage);
1307 vircam_twilight_flat_combine_config.flatratio_med = 0.0;
1308 vircam_twilight_flat_combine_config.flatratio_rms = 0.0;
1309 ncells = vircam_twilight_flat_combine_config.ncells;
1312 &gdiff,&grms,&(ps.ratioimg),
1313 &(ps.ratioimstats));
1315 vircam_twilight_flat_combine_config.flatratio_med = gdiff;
1316 vircam_twilight_flat_combine_config.flatratio_rms = grms;
1317 if (ps.ratioimg != NULL)
1319 if (ps.ratioimstats != NULL)
1320 we_get |= STATS_TAB;
1335 static int vircam_twilight_flat_combine_lastbit(
int jext,
1336 cpl_frameset *framelist,
1337 cpl_parameterlist *parlist) {
1339 const char *fctid=
"vircam_twilight_flat_combine_lastbit";
1343 vircam_twilight_flat_combine_dummy_products();
1348 "Saving products for extension %" CPL_SIZE_FORMAT,
1350 retval = vircam_twilight_flat_combine_save(framelist,parlist);
1352 vircam_twilight_flat_combine_tidy(2);
1358 vircam_twilight_flat_combine_tidy(1);
1368 static void vircam_twilight_flat_combine_init(
void) {
1370 ps.twilightlist = NULL;
1371 ps.twilightlist_cull = NULL;
1372 ps.master_dark = NULL;
1373 ps.master_twilight_flat = NULL;
1374 ps.master_mask = NULL;
1383 ps.twilights = NULL;
1390 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);
1417 freespace(ps.labels);
1418 freeframeset(ps.twilightlist);
1419 freeframeset(ps.twilightlist_cull);
1420 freeframe(ps.master_dark);
1421 freeframe(ps.master_twilight_flat);
1422 freemask(ps.master_mask);
1423 freeframe(ps.chantab);
1424 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)
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_mkconf(cpl_image *flat, char *flatfile, casu_mask *bpm, cpl_image **outconf, cpl_propertylist **drs, int *status)
Create a confidence map.
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_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.
void vircam_cull(cpl_frameset *in, float lthr, float hthr, int ndit, int jst, int jfn, cpl_array **mins, cpl_array **maxs, cpl_array **aves, cpl_frameset **out, int *status)
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)