FORS Pipeline Reference Manual 4.9.20
|
00001 /* $Id: fors_img_sky_flat_impl.c,v 1.25 2013/02/15 10:55:44 cgarcia Exp $ 00002 * 00003 * This file is part of the FORS Library 00004 * Copyright (C) 2002-2010 European Southern Observatory 00005 * 00006 * This program is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation; either version 2 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 00019 */ 00020 00021 /* 00022 * $Author: cgarcia $ 00023 * $Date: 2013/02/15 10:55:44 $ 00024 * $Revision: 1.25 $ 00025 * $Name: fors-4_9_20 $ 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 /* Raw */ 00101 cpl_frameset *sflat_frames = NULL; 00102 fors_image_list *sflats = NULL; 00103 00104 /* Calibration */ 00105 cpl_frameset *master_bias_frame = NULL; 00106 const fors_image *master_bias = NULL; 00107 00108 /* Products */ 00109 fors_image *master_sky_flat = NULL; 00110 cpl_propertylist *qc = cpl_propertylist_new(); 00111 double saturation; 00112 00113 /* Parameters */ 00114 stack_method *sm = NULL; 00115 00116 /* Other */ 00117 const char *context = cpl_sprintf("fors.%s", fors_img_sky_flat_name); 00118 fors_setting *setting = NULL; 00119 00120 /* QCs about sky level */ 00121 double skylevel, skylevmax, skylevmin; 00122 int first_frame; 00123 00124 /* Get parameters */ 00125 sm = fors_stack_method_new(parameters, context); 00126 assure( !cpl_error_get_code(), return, "Could not get stacking method"); 00127 00128 /* Eliminate irrelevant RAW frames (header would be inherited from them) */ 00129 cpl_frameset_erase(frames, "TEST"); 00130 00131 /* Find raw */ 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 /* Find calibration */ 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. %"CPL_SIZE_FORMAT" found", 00140 MASTER_BIAS, cpl_frameset_get_size(master_bias_frame)); 00141 00142 /* Get setting */ 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 /* Load raw frames, subtract bias */ 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 /* Normalize to median = 1. 00156 * 00157 * (The input sky flats generally have different normalization because of 00158 * the time dependent sky level. We must bring the input flats 00159 * to the same normalization before stacking.) 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 /* Stack */ 00194 master_sky_flat = fors_stack(sflats, sm); 00195 assure( !cpl_error_get_code(), return, "Sky flat stacking failed"); 00196 00197 /* QC */ 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 /* Save product */ 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