38#include <casu_utils.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"
60static int vircam_twilight_flat_combine_create(cpl_plugin *) ;
61static int vircam_twilight_flat_combine_exec(cpl_plugin *) ;
62static int vircam_twilight_flat_combine_destroy(cpl_plugin *) ;
63static int vircam_twilight_flat_combine(cpl_parameterlist *, cpl_frameset *) ;
64static int vircam_twilight_flat_combine_save(cpl_frameset *framelist,
65 cpl_parameterlist *parlist);
66static void vircam_twilight_flat_combine_dummy_products(
void);
67static void vircam_twilight_flat_combine_normal(
int jext);
68static int vircam_twilight_flat_combine_lastbit(
int jext,
69 cpl_frameset *framelist,
70 cpl_parameterlist *parlist);
71static void vircam_twilight_flat_combine_init(
void);
72static 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;
132static cpl_frame *product_frame_mean_twi = NULL;
133static cpl_frame *product_frame_conf = NULL;
134static cpl_frame *product_frame_ratioimg = NULL;
135static cpl_frame *product_frame_ratioimg_stats = NULL;
139static 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."
313int 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);
352static 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);
460static 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));
481static 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);
504static 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);
876static 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);
1189static 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))
1233static 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;
1335static 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);
1368static 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;
1401static 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_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)
casu_fits * casu_fits_load(cpl_frame *frame, cpl_type type, int nexten)
void casu_mask_force(casu_mask *m, int nx, int ny)
unsigned char * casu_mask_get_data(casu_mask *m)
int casu_mask_load(casu_mask *m, int nexten, int nx, int ny)
void casu_mask_clear(casu_mask *m)
casu_mask * casu_mask_define(cpl_frameset *framelist, cpl_size *labels, cpl_size nlab, const char *conftag, const char *bpmtag)
const char * casu_mask_get_filename(casu_mask *m)
int casu_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)
casu_tfits * casu_tfits_load(cpl_frame *table, int nexten)
cpl_table * casu_tfits_get_table(casu_tfits *p)
int casu_compare_tags(const cpl_frame *frame1, const cpl_frame *frame2)
Compare input tags.
void casu_merge_propertylists(cpl_propertylist *p1, cpl_propertylist *p2)
Merge two propertylists.
void casu_dummy_property(cpl_propertylist *p)
Set dummy property keyword.
cpl_frame * casu_frameset_subgroup_1(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
Extract a frame of a given label from a frameset.
cpl_image * casu_dummy_image(casu_fits *model)
Create a dummy image of zeros based on a model.
cpl_frameset * casu_frameset_subgroup(cpl_frameset *frameset, cpl_size *labels, cpl_size nlab, const char *tag)
Extract a frameset from another frameset.
int casu_removewcs(cpl_propertylist *p, int *status)
int vircam_lincor(casu_fits *infile, casu_tfits *lchantab, int kconst, int ndit, int *status)
Apply linearity curves to data.
int vircam_chantab_verify(cpl_table *intab)
int vircam_dfs_set_groups(cpl_frameset *set)
void vircam_dfs_set_product_primary_header(cpl_propertylist *plist, cpl_frame *frame, cpl_frameset *frameset, cpl_parameterlist *parlist, char *recipeid, const char *dict, cpl_frame *inherit, int synch)
void vircam_dfs_set_product_exten_header(cpl_propertylist *plist, cpl_frame *frame, cpl_frameset *frameset, cpl_parameterlist *parlist, char *recipeid, const char *dict, cpl_frame *inherit)
int vircam_pfits_get_ndit(const cpl_propertylist *plist, int *ndit)
Get the value of NDIT.
const char * vircam_get_license(void)
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)
void vircam_exten_range(int inexten, const cpl_frame *fr, int *out1, int *out2)