fors_img_sky_flat_impl.c

00001 /* $Id: fors_img_sky_flat_impl.c,v 1.24 2010/09/14 07:49:30 cizzo 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: cizzo $
00023  * $Date: 2010/09/14 07:49:30 $
00024  * $Revision: 1.24 $
00025  * $Name: fors-4_8_6 $
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. %d 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 

Generated on Fri Mar 4 09:46:00 2011 for FORS Pipeline Reference Manual by  doxygen 1.4.7