fors_flat.c

00001 /* $Id: fors_flat.c,v 1.7 2010/09/14 07:38:16 cizzo Exp $
00002  *
00003  * This file is part of the FORS Data Reduction Pipeline
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:38:16 $
00024  * $Revision: 1.7 $
00025  * $Name: fors-4_8_6 $
00026  */
00027 
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031 
00032 
00033 #include <math.h>
00034 #include <cpl.h>
00035 #include <moses.h>
00036 #include <fors_dfs.h>
00037 
00038 static int fors_flat_create(cpl_plugin *);
00039 static int fors_flat_exec(cpl_plugin *);
00040 static int fors_flat_destroy(cpl_plugin *);
00041 static int fors_flat(cpl_parameterlist *, cpl_frameset *);
00042 
00043 static char fors_flat_description[] =
00044 "This recipe is used to subtract the master bias, produced by the recipe\n"
00045 "fors_bias, from a set of raw flat field frames. The input raw frames are\n"
00046 "summed, the master bias frame is rescaled accordingly, and subtracted\n"
00047 "from the result. The overscan regions, if present, are used to compensate\n"
00048 "for variations of the bias level between master bias and input raw frames.\n"
00049 "The overscan regions are then trimmed from the result.\n"
00050 "In the table below the MXU acronym can be alternatively read as MOS and\n"
00051 "LSS.\n\n"
00052 "Input files:\n\n"
00053 "  DO category:               Type:       Explanation:         Required:\n"
00054 "  SCREEN_FLAT_MXU            Raw         Raw data frame          Y\n"
00055 "  MASTER_BIAS                Calib       Master bias frame       Y\n\n"
00056 "Output files:\n\n"
00057 "  DO category:               Data type:  Explanation:\n"
00058 "  MASTER_SCREEN_FLAT_MXU     FITS image  Bias subtracted sum frame\n\n";
00059 
00060 #define fors_flat_exit(message)               \
00061 {                                             \
00062 if (message) cpl_msg_error(recipe, message);  \
00063 cpl_image_delete(flat);                       \
00064 cpl_image_delete(master_flat);                \
00065 cpl_image_delete(master_bias);                \
00066 cpl_propertylist_delete(header);              \
00067 cpl_table_delete(overscans);                  \
00068 cpl_msg_indent_less();                        \
00069 return -1;                                    \
00070 }
00071 
00072 #define fors_flat_exit_memcheck(message)        \
00073 {                                               \
00074 if (message) cpl_msg_info(recipe, message);     \
00075 printf("free flat (%p)\n", flat);               \
00076 cpl_image_delete(flat);                         \
00077 printf("free master_flat (%p)\n", master_flat); \
00078 cpl_image_delete(master_flat);                  \
00079 printf("free master_bias (%p)\n", master_bias); \
00080 cpl_image_delete(master_bias);                  \
00081 printf("free header (%p)\n", header);           \
00082 cpl_propertylist_delete(header);                \
00083 printf("free overscans (%p)\n", overscans);     \
00084 cpl_table_delete(overscans);                    \
00085 cpl_msg_indent_less();                          \
00086 return 0;                                       \
00087 }
00088 
00089 
00101 int cpl_plugin_get_info(cpl_pluginlist *list)
00102 {
00103     cpl_recipe *recipe = cpl_calloc(1, sizeof *recipe );
00104     cpl_plugin *plugin = &recipe->interface;
00105 
00106     cpl_plugin_init(plugin,
00107                     CPL_PLUGIN_API,
00108                     FORS_BINARY_VERSION,
00109                     CPL_PLUGIN_TYPE_RECIPE,
00110                     "fors_flat",
00111                     "Sum input flat field frames and remove bias",
00112                     fors_flat_description,
00113                     "Carlo Izzo",
00114                     PACKAGE_BUGREPORT,
00115     "This file is currently part of the FORS Instrument Pipeline\n"
00116     "Copyright (C) 2002-2010 European Southern Observatory\n\n"
00117     "This program is free software; you can redistribute it and/or modify\n"
00118     "it under the terms of the GNU General Public License as published by\n"
00119     "the Free Software Foundation; either version 2 of the License, or\n"
00120     "(at your option) any later version.\n\n"
00121     "This program is distributed in the hope that it will be useful,\n"
00122     "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
00123     "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
00124     "GNU General Public License for more details.\n\n"
00125     "You should have received a copy of the GNU General Public License\n"
00126     "along with this program; if not, write to the Free Software Foundation,\n"
00127     "Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n",
00128                     fors_flat_create,
00129                     fors_flat_exec,
00130                     fors_flat_destroy);
00131 
00132     cpl_pluginlist_append(list, plugin);
00133     
00134     return 0;
00135 }
00136 
00137 
00148 static int fors_flat_create(cpl_plugin *plugin)
00149 {
00150     cpl_recipe    *recipe;
00151 /* Uncomment in case parameters are defined
00152     cpl_parameter *p;
00153 */
00154 
00155     /* 
00156      * Check that the plugin is part of a valid recipe 
00157      */
00158 
00159     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE) 
00160         recipe = (cpl_recipe *)plugin;
00161     else 
00162         return -1;
00163 
00164     /* 
00165      * Create the (empty) parameters list in the cpl_recipe object 
00166      */
00167 
00168     recipe->parameters = cpl_parameterlist_new(); 
00169 
00170     return 0;
00171 }
00172 
00173 
00182 static int fors_flat_exec(cpl_plugin *plugin)
00183 {
00184     cpl_recipe *recipe;
00185     
00186     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE) 
00187         recipe = (cpl_recipe *)plugin;
00188     else 
00189         return -1;
00190 
00191     return fors_flat(recipe->parameters, recipe->frames);
00192 }
00193 
00194 
00203 static int fors_flat_destroy(cpl_plugin *plugin)
00204 {
00205     cpl_recipe *recipe;
00206     
00207     if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE) 
00208         recipe = (cpl_recipe *)plugin;
00209     else 
00210         return -1;
00211 
00212     cpl_parameterlist_delete(recipe->parameters); 
00213 
00214     return 0;
00215 }
00216 
00217 
00227 static int fors_flat(cpl_parameterlist *parlist, cpl_frameset *frameset)
00228 {
00229 
00230     const char *recipe = "fors_flat";
00231 
00232 
00233     /*
00234      * CPL objects
00235      */
00236 
00237     cpl_image        *flat        = NULL;
00238     cpl_image        *master_flat = NULL;
00239     cpl_image        *master_bias = NULL;
00240     cpl_image        *multi_bias  = NULL;
00241     cpl_image        *dummy       = NULL;
00242     cpl_table        *overscans   = NULL;
00243     cpl_propertylist *header      = NULL;
00244 
00245     /*
00246      * Auxiliary variables
00247      */
00248 
00249     char        version[80];
00250     const char *master_bias_tag = "MASTER_BIAS";
00251     const char *flat_tag;
00252     const char *pro_tag;
00253     char       *instrume = NULL;
00254     int         flat_mxu;
00255     int         flat_mos;
00256     int         flat_lss;
00257     int         nbias, nflat;
00258     int         i;
00259 
00260 
00261     cpl_msg_set_indentation(2);
00262 
00263     if (dfs_files_dont_exist(frameset))
00264         fors_flat_exit(NULL);
00265 
00266 
00267     cpl_msg_info(recipe, "Check input set-of-frames:");
00268     cpl_msg_indent_more();
00269 
00270     nbias = cpl_frameset_count_tags(frameset, master_bias_tag);
00271     if (nbias == 0) {
00272         cpl_msg_error(recipe, "Missing required input: %s", master_bias_tag);
00273         fors_flat_exit(NULL);
00274     }
00275     if (nbias > 1) {
00276         cpl_msg_error(recipe, "Too many in input (%d > 1): %s", 
00277                       nbias, master_bias_tag);
00278         fors_flat_exit(NULL);
00279     }
00280 
00281     nflat  = flat_mxu = cpl_frameset_count_tags(frameset, "SCREEN_FLAT_MXU");
00282     nflat += flat_mos = cpl_frameset_count_tags(frameset, "SCREEN_FLAT_MOS");
00283     nflat += flat_lss = cpl_frameset_count_tags(frameset, "SCREEN_FLAT_LSS");
00284 
00285     if (nflat == 0) {
00286         fors_flat_exit("Missing required input raw frames");
00287     }
00288 
00289     if (flat_mxu) {
00290         flat_tag = "SCREEN_FLAT_MXU";
00291         pro_tag = "MASTER_SCREEN_FLAT_MXU";
00292     }
00293     else if (flat_mos) {
00294         flat_tag = "SCREEN_FLAT_MOS";
00295         pro_tag = "MASTER_SCREEN_FLAT_MOS";
00296     }
00297     else if (flat_lss) {
00298         flat_tag = "SCREEN_FLAT_LSS";
00299         pro_tag = "MASTER_SCREEN_FLAT_LSS";
00300     }
00301 
00302     if (!dfs_equal_keyword(frameset, "ESO INS GRIS1 ID"))
00303         fors_flat_exit("Input frames are not from the same grism");
00304 
00305     if (!dfs_equal_keyword(frameset, "ESO INS FILT1 ID"))
00306         fors_flat_exit("Input frames are not from the same filter");
00307 
00308     if (!dfs_equal_keyword(frameset, "ESO DET CHIP1 ID")) 
00309         fors_flat_exit("Input frames are not from the same chip");
00310 
00311     header = dfs_load_header(frameset, flat_tag, 0);
00312 
00313     if (header == NULL) {
00314         cpl_msg_error(recipe, "Cannot load header of %s frame", flat_tag);
00315         fors_flat_exit(NULL);
00316     }
00317 
00318     instrume = (char *)cpl_propertylist_get_string(header, "INSTRUME");
00319     if (instrume == NULL) {
00320         cpl_msg_error(recipe, "Missing keyword INSTRUME in %s header", 
00321                       flat_tag);
00322         fors_flat_exit(NULL);
00323     }
00324 
00325     if (instrume[4] == '1')
00326         snprintf(version, 80, "%s/%s", "fors1", VERSION);
00327     if (instrume[4] == '2')
00328         snprintf(version, 80, "%s/%s", "fors2", VERSION);
00329 
00330 
00331     cpl_msg_indent_less();
00332     cpl_msg_info(recipe, "Load input frames:");
00333     cpl_msg_indent_more();
00334 
00335     master_flat = dfs_load_image(frameset, flat_tag, CPL_TYPE_FLOAT, 0, 0);
00336 
00337     if (master_flat == NULL)
00338         fors_flat_exit("Cannot load flat field");
00339 
00340     for (i = 1; i < nflat; i++) {
00341         flat = dfs_load_image(frameset, NULL, CPL_TYPE_FLOAT, 0, 0);
00342         if (flat) {
00343             cpl_image_add(master_flat, flat);
00344             cpl_image_delete(flat); flat = NULL;
00345         }
00346         else
00347             fors_flat_exit("Cannot load flat field");
00348     }
00349 
00350     master_bias = dfs_load_image(frameset, 
00351                                  master_bias_tag, CPL_TYPE_FLOAT, 0, 1);
00352     if (master_bias == NULL)
00353         fors_flat_exit("Cannot load master bias");
00354 
00355     cpl_msg_indent_less();
00356     cpl_msg_info(recipe, "Subtract the master bias from sum flat frame...");
00357     cpl_msg_indent_more();
00358 
00359     overscans = mos_load_overscans_vimos(header, 1);
00360 
00361     if (nflat > 1) {
00362         multi_bias = cpl_image_multiply_scalar_create(master_bias, nflat);
00363         dummy = mos_remove_bias(master_flat, multi_bias, overscans);
00364         cpl_image_delete(multi_bias);
00365     }
00366     else {
00367         dummy = mos_remove_bias(master_flat, master_bias, overscans);
00368     }
00369 
00370     cpl_table_delete(overscans); overscans = NULL;
00371     cpl_image_delete(master_bias); master_bias = NULL;
00372     cpl_image_delete(master_flat); master_flat = dummy;
00373 
00374     if (master_flat == NULL) {
00375         cpl_msg_error(recipe, "Cannot remove bias from sum flat frame");
00376         fors_flat_exit(NULL);
00377     }
00378 
00379     cpl_msg_indent_less();
00380 
00381     cpl_propertylist_update_int(header, "ESO PRO DATANCOM", nflat);
00382 
00383     if (dfs_save_image(frameset, master_flat, pro_tag,
00384                        header, parlist, recipe, version))
00385         fors_flat_exit(NULL);
00386 
00387     cpl_image_delete(master_flat); master_flat = NULL;
00388     cpl_propertylist_delete(header); header = NULL;
00389 
00390     return 0;
00391 }

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