Main Page   File List  

visir_img_combine.c

00001 /* $Id: visir_img_combine.c,v 1.60 2006/01/22 12:11:47 llundin Exp $
00002  *
00003  * This file is part of the VISIR Pipeline
00004  * Copyright (C) 2002,2003 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  02111-1307  USA
00019  */
00020 
00021 /*
00022  * $Author: llundin $
00023  * $Date: 2006/01/22 12:11:47 $
00024  * $Revision: 1.60 $
00025  * $Name:  $
00026  */
00027 
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031 
00032 /*-----------------------------------------------------------------------------
00033                                 Includes
00034  -----------------------------------------------------------------------------*/
00035 
00036 #include <assert.h>
00037 #include <cpl.h>
00038 
00039 #include "irplib_utils.h"
00040 
00041 #include "visir_utils.h"
00042 #include "visir_pfits.h"
00043 #include "visir_dfs.h"
00044 #include "visir_inputs.h"
00045 
00046 /*-----------------------------------------------------------------------------
00047                             Functions prototypes
00048  -----------------------------------------------------------------------------*/
00049 
00050 static int visir_img_combine_create(cpl_plugin *);
00051 static int visir_img_combine_exec(cpl_plugin *);
00052 static int visir_img_combine_destroy(cpl_plugin *);
00053 static int visir_img_combine(cpl_parameterlist *, cpl_frameset *);
00054 static int visir_img_combine_save(const cpl_image *, const cpl_image *,
00055                                   const cpl_parameterlist *, cpl_frameset *);
00056 
00057 /*-----------------------------------------------------------------------------
00058                             Static variables
00059  -----------------------------------------------------------------------------*/
00060 
00061 enum _visir_img_mode_ {
00062     visir_img_none = 0,
00063     visir_img_dj,
00064     visir_img_cj,
00065     visir_img_nj,
00066     visir_img_cnj
00067 };
00068 
00069 typedef enum _visir_img_mode_ visir_img_mode;
00070 
00071 static const char * recipename = "visir_img_combine";
00072 
00073 static struct {
00074     /* Inputs */
00075     visir_img_mode img_mode;
00076     char        offsets[512];
00077     char        objects[512];
00078     char        nodding[512];
00079     int         auto_bpm;
00080     int         rem_glitch;
00081     int         purge_bad;
00082     int         refine;
00083     int         sx;
00084     int         sy;
00085     int         mx;
00086     int         my;
00087     int         union_flag;
00088     int         rej_low;
00089     int         rej_high;
00090     int         plot;
00091 
00092     /* Outputs */
00093     double      bg_mean;
00094 } visir_img_combine_config;
00095 
00096 static char visir_img_combine_description[] =
00097 "This recipe recombines the data observed in chopping/nodding or\n"
00098 "chopping or nodding modes into one combined image using optionally\n"
00099 "cross-correlation methods.\n"
00100 "The files listed in the Set Of Frames (sof-file) must be tagged:\n"
00101 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CNJ " or\n"
00102 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_CJ " or\n"
00103 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_NJ " or\n"
00104 "VISIR-observation-file.fits " VISIR_IMG_COMBINE_DJ "\n"
00105 "\n"
00106 "The corresponding primary product will have a FITS card\n"
00107 "'HIERARCH ESO PRO CATG' with a value of\n"
00108 VISIR_IMG_COMBINE_COMBINED_PROCATG_CNJ " or\n"
00109 VISIR_IMG_COMBINE_COMBINED_PROCATG_CJ " or\n"
00110 VISIR_IMG_COMBINE_COMBINED_PROCATG_NJ " or\n"
00111 VISIR_IMG_COMBINE_COMBINED_PROCATG_DJ
00112 "\n";
00113 
00114 /*-----------------------------------------------------------------------------
00115                                 Functions code
00116  -----------------------------------------------------------------------------*/
00117 
00118 /*----------------------------------------------------------------------------*/
00127 /*----------------------------------------------------------------------------*/
00128 int cpl_plugin_get_info(cpl_pluginlist * list)
00129 {
00130     cpl_recipe  *   recipe = cpl_calloc(1, sizeof(*recipe));
00131     cpl_plugin  *   plugin = &recipe->interface;
00132 
00133 
00134     if (cpl_plugin_init(plugin,
00135                     CPL_PLUGIN_API,
00136                     VISIR_BINARY_VERSION,
00137                     CPL_PLUGIN_TYPE_RECIPE,
00138                     recipename,
00139                     "Images combination recipe",
00140                     visir_img_combine_description,
00141                     "Lars Lundin",
00142                     PACKAGE_BUGREPORT,
00143                     visir_get_license(),
00144                     visir_img_combine_create,
00145                     visir_img_combine_exec,
00146                     visir_img_combine_destroy)) return 1;
00147 
00148     if (cpl_pluginlist_append(list, plugin)) return 1;
00149     
00150     return 0;
00151 }
00152 
00153 /*----------------------------------------------------------------------------*/
00162 /*----------------------------------------------------------------------------*/
00163 static int visir_img_combine_create(cpl_plugin * plugin)
00164 {
00165     cpl_recipe * recipe = (cpl_recipe *)plugin;
00166 
00167     /* Verify plugin type */
00168     if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) return 1;
00169 
00170     /* Create the parameters list in the cpl_recipe object */
00171     recipe->parameters = cpl_parameterlist_new();
00172 
00173     /* Fill the parameters list */
00174     return visir_parameter_set(recipe->parameters, recipename,
00175                                VISIR_PARAM_REFINE | VISIR_PARAM_XCORR |
00176                                VISIR_PARAM_OFFSETS | VISIR_PARAM_OBJECTS |
00177                                VISIR_PARAM_NODPOS | VISIR_PARAM_AUTOBPM |
00178                                VISIR_PARAM_GLITCH | VISIR_PARAM_PURGE |
00179                                VISIR_PARAM_UNION  | VISIR_PARAM_REJECT |
00180                                VISIR_PARAM_PLOT);
00181 
00182 }
00183 
00184 /*----------------------------------------------------------------------------*/
00190 /*----------------------------------------------------------------------------*/
00191 static int visir_img_combine_exec(cpl_plugin * plugin)
00192 {
00193     cpl_recipe * recipe = (cpl_recipe *)plugin;
00194 
00195     /* Verify plugin type */
00196     if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) return 1;
00197 
00198     return visir_img_combine(recipe->parameters, recipe->frames);
00199 }
00200 
00201 /*----------------------------------------------------------------------------*/
00207 /*----------------------------------------------------------------------------*/
00208 static int visir_img_combine_destroy(cpl_plugin * plugin)
00209 {
00210     cpl_recipe  *   recipe = (cpl_recipe *)plugin;
00211 
00212     /* Verify plugin type */
00213     if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) return 1;
00214     cpl_parameterlist_delete(recipe->parameters);
00215     return  0;
00216 }
00217 
00218 /*----------------------------------------------------------------------------*/
00225 /*----------------------------------------------------------------------------*/
00226 static int visir_img_combine(
00227         cpl_parameterlist   *   parlist, 
00228         cpl_frameset        *   framelist)
00229 {
00230     cpl_parameter   *   par;
00231     const char      *   badpix;
00232     const char      *   flat;
00233     cpl_frameset    *   rawframes = NULL;
00234     cpl_image       **  combined = NULL;
00235     const char      *   sval;
00236     
00237 
00238     if (cpl_error_get_code()) return cpl_error_get_code();
00239 
00240     visir_img_combine_config.bg_mean = -1.0;
00241     
00242     /* Retrieve input parameters */
00243     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.offsets");
00244     strcpy(visir_img_combine_config.offsets, cpl_parameter_get_string(par));
00245     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.objects");
00246     strcpy(visir_img_combine_config.objects, cpl_parameter_get_string(par));
00247     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.nodding");
00248     strcpy(visir_img_combine_config.nodding, cpl_parameter_get_string(par));
00249     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.auto_bpm");
00250     visir_img_combine_config.auto_bpm = cpl_parameter_get_bool(par);
00251     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.rem_glitch");
00252     visir_img_combine_config.rem_glitch = cpl_parameter_get_bool(par);
00253     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.purge_bad");
00254     visir_img_combine_config.purge_bad = cpl_parameter_get_bool(par);
00255     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.refine");
00256     visir_img_combine_config.refine = cpl_parameter_get_bool(par);
00257     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.xcorr");
00258     sval = cpl_parameter_get_string(par);
00259     skip_if (sscanf(sval, "%d %d %d %d",
00260                     &visir_img_combine_config.sx,
00261                     &visir_img_combine_config.sy,
00262                     &visir_img_combine_config.mx,
00263                     &visir_img_combine_config.my) != 4);
00264 
00265     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.union");
00266     visir_img_combine_config.union_flag = cpl_parameter_get_bool(par);
00267     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.rej");
00268     sval = cpl_parameter_get_string(par);
00269     skip_if (sscanf(sval, "%d %d",
00270                     &visir_img_combine_config.rej_low,
00271                     &visir_img_combine_config.rej_high) !=2 );
00272 
00273     par = cpl_parameterlist_find(parlist, "visir.visir_img_combine.plot");
00274     visir_img_combine_config.plot = cpl_parameter_get_int(par);
00275    
00276     /* Identify the RAW and CALIB frames in the input frameset */
00277     skip_if (visir_dfs_set_groups(framelist));
00278 
00279     /* Objects observation */
00280     rawframes = irplib_frameset_extract_regexp(framelist, "^("
00281                                               VISIR_IMG_COMBINE_CNJ "|"
00282                                               VISIR_IMG_COMBINE_CJ  "|"
00283                                               VISIR_IMG_COMBINE_NJ  "|"
00284                                               VISIR_IMG_COMBINE_DJ ")$");
00285     skip_if (rawframes == NULL);
00286 
00287     skip_if(visir_dfs_check_frameset_tag(rawframes));
00288     
00289     /* Verify uniqueness of frame type */
00290     visir_img_combine_config.img_mode = visir_img_none;
00291     if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_DJ))
00292         visir_img_combine_config.img_mode = visir_img_dj;
00293     if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_NJ)) {
00294         skip_if (visir_img_combine_config.img_mode);
00295         visir_img_combine_config.img_mode = visir_img_nj;
00296     }
00297     if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_CJ)) {
00298         skip_if (visir_img_combine_config.img_mode);
00299         visir_img_combine_config.img_mode = visir_img_cj;
00300     }
00301     if (cpl_frameset_find(rawframes, VISIR_IMG_COMBINE_CNJ)) {
00302         skip_if (visir_img_combine_config.img_mode);
00303         visir_img_combine_config.img_mode = visir_img_cnj;
00304     }
00305 
00306     /* Bad pixels calibration file */
00307     badpix = irplib_frameset_find_file(framelist, VISIR_CALIB_BPM);
00308 
00309     /* Flatfield calibration file */
00310     flat = irplib_frameset_find_file(framelist, VISIR_CALIB_FLAT);
00311 
00312     /* Combine the frames */
00313     combined = visir_img_recombine(rawframes, badpix, flat,
00314                                    visir_img_combine_config.offsets,
00315                                    visir_img_combine_config.objects,
00316                                    visir_img_combine_config.nodding,
00317                                    visir_img_combine_config.auto_bpm,
00318                                    visir_img_combine_config.rem_glitch,
00319                                    visir_img_combine_config.purge_bad,
00320                                    visir_img_combine_config.refine,
00321                                    visir_img_combine_config.sx,
00322                                    visir_img_combine_config.sy,
00323                                    visir_img_combine_config.mx,
00324                                    visir_img_combine_config.my,
00325                                    visir_img_combine_config.rej_low,
00326                                    visir_img_combine_config.rej_high,
00327                                    visir_img_combine_config.union_flag,
00328                                    CPL_FALSE, 0, 0, 0,0,0,0,
00329                                    visir_img_combine_config.plot);
00330 
00331 
00332     if (combined == NULL) {
00333         cpl_msg_error(__func__, "Could not combine the input frames");
00334         skip_if(1);
00335     }
00336     
00337     /* Compute the background values of the HCYCLE frames */
00338     visir_img_combine_config.bg_mean = visir_hcycle_background(rawframes, 0, 0);
00339 
00340     skip_if (cpl_error_get_code());
00341     
00342     /* Save the combined image and contribution map */
00343     cpl_msg_info(__func__, "Save the combined image and contribution map");
00344     visir_img_combine_save(combined[0], combined[1], parlist, framelist);
00345 
00346     if (cpl_error_get_code()) {
00347         cpl_msg_error(__func__, "Cannot save products");
00348         skip_if(1);
00349     }
00350 
00351     end_skip;
00352 
00353     if (combined) {
00354         cpl_image_delete(combined[0]);
00355         cpl_image_delete(combined[1]);
00356         cpl_free(combined);
00357     }
00358 
00359     cpl_frameset_delete(rawframes);
00360 
00361     return cpl_error_get_code();
00362 }
00363 
00364 /*----------------------------------------------------------------------------*/
00373 /*----------------------------------------------------------------------------*/
00374 static int visir_img_combine_save(
00375         const cpl_image         * combined,
00376         const cpl_image         * contrib,
00377         const cpl_parameterlist * parlist,
00378         cpl_frameset            * set)
00379 {
00380     /* The filename of the reference frame */
00381     const char       * ref_file =
00382         cpl_frame_get_filename(irplib_frameset_get_first_from_group(set, 
00383                                                          CPL_FRAME_GROUP_RAW));
00384     cpl_propertylist * plist = cpl_propertylist_load(ref_file, 0);
00385     cpl_propertylist * qclist = cpl_propertylist_new();
00386     const char       * capa = visir_get_capa(plist);
00387     const char       * pafcopy = "^(DATE-OBS|ARCFILE|ESO TPL ID|ESO DET DIT"
00388                                   "|MJD-OBS|ESO INS PFOV)$";
00389     const char       * procatg_combine;
00390     const char       * procatg_contrib;
00391     FILE             * paf = NULL;
00392 
00393 
00394     /* This will catch ref_file == NULL or plist == NULL */
00395     skip_if (cpl_error_get_code());
00396 
00397     skip_if (cpl_propertylist_copy_property_regexp(qclist, plist, pafcopy));
00398 
00399     /* THE PAF FILE FOR QC PARAMETERS */
00400     skip_if (!(paf = visir_paf_init(recipename)));
00401 
00402     skip_if (irplib_propertylist_dump_paf(qclist, paf));
00403 
00404     /* Reuse the propertylist for QC parameters */
00405     cpl_propertylist_empty(qclist);
00406 
00407     cpl_propertylist_empty(plist); /* Just to reduce number of pointers */
00408 
00409     /* QC.BACKGD.MEAN */
00410     skip_if (cpl_propertylist_append_double(qclist, "ESO QC BACKGD MEAN",
00411                                             visir_img_combine_config.bg_mean));
00412 
00413     /* QC.CAPA */
00414     skip_if (capa != NULL && 
00415              cpl_propertylist_append_string(qclist, "ESO QC CAPA", capa));
00416 
00417     switch (visir_img_combine_config.img_mode) {
00418     case visir_img_dj:
00419         procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_DJ;
00420         procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_DJ;
00421         break;
00422     case visir_img_cj:
00423         procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_CJ;
00424         procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_CJ;
00425         break;
00426     case visir_img_nj:
00427         procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_NJ;
00428         procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_NJ;
00429         break;
00430     case visir_img_cnj:
00431         procatg_combine = VISIR_IMG_COMBINE_COMBINED_PROCATG_CNJ;
00432         procatg_contrib = VISIR_IMG_COMBINE_CONTRIB_PROCATG_CNJ;
00433         break;
00434     default:
00435         assert (0);
00436     }
00437 
00438     /* THE COMBINED IMAGE */
00439     skip_if (visir_image_save(parlist, set, combined, recipename,
00440                               procatg_combine,
00441                               qclist, NULL));
00442 
00443     /* THE CONTRIBUTION MAP */
00444     skip_if (visir_image_save(parlist, set, contrib, recipename,
00445                               procatg_contrib,
00446                               qclist, "_contrib"));
00447 
00448     skip_if (irplib_propertylist_dump_paf(qclist, paf));
00449 
00450     end_skip;
00451 
00452     visir_paf_end(paf);
00453 
00454     cpl_propertylist_delete(qclist);
00455     cpl_propertylist_delete(plist);
00456 
00457     return cpl_error_get_code();
00458 }

Generated on Mon Jan 23 12:16:36 2006 for VISIR Pipeline Reference Manual by doxygen1.2.18