00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032 #include <fors_img_sky_flat_impl.h>
00033
00034 #include <fors_stack.h>
00035 #include <fors_dfs.h>
00036 #include <fors_qc.h>
00037 #include <fors_utils.h>
00038
00039 #include <cpl.h>
00040
00047 const char *const fors_img_sky_flat_name = "fors_img_sky_flat";
00048 const char *const fors_img_sky_flat_description_short = "Compute master img_sky_flat frame";
00049 const char *const fors_img_sky_flat_author = "Jonas M. Larsen";
00050 const char *const fors_img_sky_flat_email = PACKAGE_BUGREPORT;
00051 const char *const fors_img_sky_flat_description =
00052 "Input files:\n"
00053 " DO category: Type: Explanation: Number:\n"
00054 " SKY_FLAT_IMG Raw Jittered sky flat fields 1+\n"
00055 " MASTER_BIAS FITS image Master bias 1\n"
00056 "\n"
00057 "Output files:\n"
00058 " DO category: Data type: Explanation:\n"
00059 " MASTER_SKY_FLAT_IMG FITS image Master sky flat field\n";
00065 void fors_img_sky_flat_define_parameters(cpl_parameterlist *parameters)
00066 {
00067 const char *context = cpl_sprintf("fors.%s", fors_img_sky_flat_name);
00068
00069 fors_stack_define_parameters(parameters, context, "median");
00070
00071 cpl_free((void *)context);
00072
00073 return;
00074 }
00075
00076 #undef cleanup
00077 #define cleanup \
00078 do { \
00079 cpl_frameset_delete(sflat_frames); \
00080 cpl_frameset_delete(master_bias_frame); \
00081 fors_stack_method_delete(&sm); \
00082 cpl_free((void *)context); \
00083 fors_image_delete_const(&master_bias); \
00084 fors_image_delete(&master_sky_flat); \
00085 fors_image_list_delete(&sflats, fors_image_delete); \
00086 cpl_propertylist_delete(qc); \
00087 fors_setting_delete(&setting); \
00088 } while (0)
00089
00098 void fors_img_sky_flat(cpl_frameset *frames, const cpl_parameterlist *parameters)
00099 {
00100
00101 cpl_frameset *sflat_frames = NULL;
00102 fors_image_list *sflats = NULL;
00103
00104
00105 cpl_frameset *master_bias_frame = NULL;
00106 const fors_image *master_bias = NULL;
00107
00108
00109 fors_image *master_sky_flat = NULL;
00110 cpl_propertylist *qc = cpl_propertylist_new();
00111 double saturation;
00112
00113
00114 stack_method *sm = NULL;
00115
00116
00117 const char *context = cpl_sprintf("fors.%s", fors_img_sky_flat_name);
00118 fors_setting *setting = NULL;
00119
00120
00121 double skylevel, skylevmax, skylevmin;
00122 int first_frame;
00123
00124
00125 sm = fors_stack_method_new(parameters, context);
00126 assure( !cpl_error_get_code(), return, "Could not get stacking method");
00127
00128
00129 cpl_frameset_erase(frames, "TEST");
00130
00131
00132 sflat_frames = fors_frameset_extract(frames, SKY_FLAT_IMG);
00133 assure( cpl_frameset_get_size(sflat_frames) > 0, return,
00134 "No %s provided", SKY_FLAT_IMG);
00135
00136
00137 master_bias_frame = fors_frameset_extract(frames, MASTER_BIAS);
00138 assure( cpl_frameset_get_size(master_bias_frame) == 1, return,
00139 "One %s required. %d found",
00140 MASTER_BIAS, cpl_frameset_get_size(master_bias_frame));
00141
00142
00143 setting = fors_setting_new(cpl_frameset_get_first_const(sflat_frames));
00144 assure( !cpl_error_get_code(), return, "Could not get instrument setting" );
00145
00146 master_bias = fors_image_load(cpl_frameset_get_first(master_bias_frame),
00147 NULL, setting, NULL);
00148 assure( !cpl_error_get_code(), return,
00149 "Could not load master bias");
00150
00151
00152 sflats = fors_image_load_list(sflat_frames, master_bias, setting, &saturation);
00153 assure( !cpl_error_get_code(), return, "Could not load sky flat images");
00154
00155
00156
00157
00158
00159
00160
00161 {
00162 fors_image *image;
00163
00164 skylevel = skylevmax = skylevmin = 0.0;
00165
00166 first_frame = 1;
00167
00168 for (image = fors_image_list_first(sflats);
00169 image != NULL;
00170 image = fors_image_list_next(sflats)) {
00171
00172 skylevel = fors_image_get_median(image, NULL);
00173
00174 fors_image_divide_scalar(image, skylevel, -1.0);
00175
00176 assure( !cpl_error_get_code(), return,
00177 "Raw sky flat normalization failed");
00178
00179 if (first_frame) {
00180 first_frame = 0;
00181 skylevmax = skylevmin = skylevel;
00182 }
00183 else {
00184 if (skylevmax < skylevel)
00185 skylevmax = skylevel;
00186 if (skylevmin > skylevel)
00187 skylevmin = skylevel;
00188 }
00189 }
00190 }
00191
00192
00193
00194 master_sky_flat = fors_stack(sflats, sm);
00195 assure( !cpl_error_get_code(), return, "Sky flat stacking failed");
00196
00197
00198 fors_qc_start_group(qc, fors_qc_dic_version, setting->instrument);
00199
00200 fors_qc_write_group_heading(cpl_frameset_get_first(sflat_frames),
00201 MASTER_SKY_FLAT_IMG,
00202 setting->instrument);
00203 assure( !cpl_error_get_code(), return, "Could not write %s QC parameters",
00204 MASTER_SKY_FLAT_IMG);
00205
00206 fors_qc_write_qc_double(qc,
00207 saturation,
00208 "QC.OVEREXPO",
00209 "%",
00210 "Percentage of overexposed pixels",
00211 setting->instrument);
00212
00213 fors_qc_write_qc_double(qc,
00214 skylevmin,
00215 "QC.SKYFLAT.FLUX.MIN",
00216 "ADU",
00217 "Median level of dimmest input flat",
00218 setting->instrument);
00219
00220 fors_qc_write_qc_double(qc,
00221 skylevmax,
00222 "QC.SKYFLAT.FLUX.MAX",
00223 "ADU",
00224 "Median level of brightest input flat",
00225 setting->instrument);
00226 fors_qc_end_group();
00227
00228
00229 fors_dfs_save_image(frames, master_sky_flat, MASTER_SKY_FLAT_IMG,
00230 qc, parameters, fors_img_sky_flat_name,
00231 cpl_frameset_get_first(sflat_frames));
00232 assure( !cpl_error_get_code(), return, "Saving %s failed",
00233 MASTER_SKY_FLAT_IMG);
00234
00235 cleanup;
00236 return;
00237 }
00238
00239