fors_remove_bias.c

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

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