visir_spc_obs_ech.c

00001 /* $Id: visir_spc_obs_ech.c,v 1.85 2010/08/09 13:04:23 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: 2010/08/09 13:04:23 $
00024  * $Revision: 1.85 $
00025  * $Name: visir-3_5_0 $
00026  */
00027 
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031 
00032 /*-----------------------------------------------------------------------------
00033                                 Includes
00034  -----------------------------------------------------------------------------*/
00035 
00036 #include "visir_recipe.h"
00037 #include "visir_spectro.h"
00038 #include "visir_spc_distortion.h"
00039 
00040 /*-----------------------------------------------------------------------------
00041                                 Defines
00042  -----------------------------------------------------------------------------*/
00043 
00044 #define RECIPE_STRING   "visir_spc_obs_ech"
00045 
00046 /* FITS keys to be loaded for all raw files */
00047 #define RECIPE_KEYS_REGEXP_ALL            \
00048         VISIR_PFITS_REGEXP_IMG_RECOMBINE  \
00049     "|" VISIR_PFITS_REGEXP_SPC_GET_RES_WL
00050 
00051 /* FITS keys to be loaded for first raw file */
00052 #define RECIPE_KEYS_REGEXP               \
00053         RECIPE_KEYS_REGEXP_ALL           \
00054     "|" VISIR_PFITS_REGEXP_CAPA          \
00055     "|" VISIR_PFITS_REGEXP_SPC_WCAL_PAF
00056 
00057 /* FITS keys to be loaded for first raw file, in case WCS is used */
00058 #define RECIPE_KEYS_REGEXP_WCS \
00059         RECIPE_KEYS_REGEXP \
00060     "|" IRPLIB_PFITS_WCS_REGEXP
00061 
00062 /*-----------------------------------------------------------------------------
00063                             Private Functions prototypes
00064  -----------------------------------------------------------------------------*/
00065 
00066 static cpl_error_code visir_spc_obs_ech_save(cpl_frameset *,
00067                                              const cpl_parameterlist *,
00068                                              const cpl_propertylist *,
00069                                              const cpl_propertylist *,
00070                                              const cpl_image *,
00071                                              const cpl_image *,
00072                                              const cpl_table *);
00073 
00074 VISIR_RECIPE_DEFINE(visir_spc_obs_ech,
00075                     VISIR_PARAM_ZERODIST | VISIR_PARAM_ORDEROFF |
00076                     VISIR_PARAM_REFINE | VISIR_PARAM_XCORR |
00077                     VISIR_PARAM_OFFSETS | VISIR_PARAM_OBJECTS |
00078                     VISIR_PARAM_NODPOS | VISIR_PARAM_AUTOBPM |
00079                     VISIR_PARAM_GLITCH | VISIR_PARAM_PURGE |
00080                     VISIR_PARAM_UNION  | VISIR_PARAM_REJECT |
00081                     VISIR_PARAM_STRIPITE | VISIR_PARAM_STRIPMOR |
00082                     VISIR_PARAM_PLOT   | VISIR_PARAM_SLITSKEW |
00083                     VISIR_PARAM_SPECSKEW | VISIR_PARAM_VERTARC |
00084                     VISIR_PARAM_REJLEFT | VISIR_PARAM_REJRIGHT |
00085                     VISIR_PARAM_HORIARC | VISIR_PARAM_FIXCOMBI,
00086                     "Spectroscopic observation recipe in Echelle mode",
00087                     "This recipe estimates the dispersion relation using the "
00088                     "atmospheric spectrum\n"
00089                     "in a grism spectroscopy half-cycle frame.\n"
00090                     "It also extracts the spectrum of an observed object using "
00091                     "a combined frame.\n"
00092                     "The files listed in the Set Of Frames (sof-file) "
00093                     "must be tagged:\n"
00094                     "VISIR-Echelle-Spectroscopy-file.fits "
00095                     VISIR_SPC_OBS_ECH_RAW "\n"
00096                     "VISIR-Quantum-Efficiency-Calibration-file.fits "
00097                     VISIR_CALIB_QEFF_SPC "\n"
00098                     "VISIR-Atmospheric-Emission-Lines-Calibration-file.fits "
00099                     VISIR_CALIB_LINES_SPC
00100                     "\n"
00101                     MAN_VISIR_CALIB_BPM_SPC);
00102 
00103 /*-----------------------------------------------------------------------------
00104                             Static variables
00105  -----------------------------------------------------------------------------*/
00106 
00107 static struct {
00108     /* Inputs */
00109     int         plot;
00110     int         orderoffset;
00111     double      phi;
00112     double      ksi;
00113     double      eps;
00114     double      delta;
00115 
00116 } visir_spc_obs_ech_config;
00117 
00118 /*----------------------------------------------------------------------------*/
00122 /*----------------------------------------------------------------------------*/
00123 
00124 /*-----------------------------------------------------------------------------
00125                                 Functions code
00126  -----------------------------------------------------------------------------*/
00127 
00128 /*----------------------------------------------------------------------------*/
00135 /*----------------------------------------------------------------------------*/
00136 static int visir_spc_obs_ech(cpl_frameset            * framelist,
00137                              const cpl_parameterlist * parlist)
00138 {
00139     irplib_framelist * allframes = NULL;
00140     irplib_framelist * rawframes = NULL;
00141     cpl_propertylist * qclist    = cpl_propertylist_new();
00142     cpl_propertylist * paflist   = cpl_propertylist_new();
00143     const char      *   badpix;
00144     const char      *   spc_cal_qeff;
00145     const char      *   spc_cal_lines;
00146     const char      *   flat;
00147     cpl_image       *   combined = NULL;
00148     cpl_image       *   comorder = NULL;
00149     cpl_imagelist   *   hcycle = NULL;
00150     cpl_image       *   order = NULL;
00151     cpl_table       *   spc_table = NULL;
00152     cpl_image       *   weight2d  = NULL;
00153     cpl_image       *   imhcycle = NULL;
00154     cpl_image      **   combinedpair;
00155     int                 icol1, icol2;
00156     int                 jcol1, jcol2;
00157     double              wlen, slitw, temp, fwhm;
00158     visir_spc_resol     resol;
00159     cpl_boolean         do_fixcombi;
00160     cpl_boolean        drop_wcs;
00161     const char       * keys_regexp = "^(" RECIPE_KEYS_REGEXP_WCS ")$";
00162 
00163 
00164     /* Retrieve input parameters */
00165     visir_spc_obs_ech_config.plot =
00166         visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_PLOT);
00167 
00168     visir_spc_obs_ech_config.phi = 
00169         visir_parameterlist_get_double(parlist,RECIPE_STRING,VISIR_PARAM_SLITSKEW);
00170     visir_spc_obs_ech_config.ksi = 
00171         visir_parameterlist_get_double(parlist,RECIPE_STRING,VISIR_PARAM_SPECSKEW);
00172     visir_spc_obs_ech_config.eps = 
00173         visir_parameterlist_get_double(parlist, RECIPE_STRING,VISIR_PARAM_VERTARC);
00174     visir_spc_obs_ech_config.delta = 
00175         visir_parameterlist_get_double(parlist, RECIPE_STRING,VISIR_PARAM_HORIARC);
00176 
00177     visir_spc_obs_ech_config.orderoffset = 
00178         visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_ORDEROFF);
00179 
00180     do_fixcombi = visir_parameterlist_get_bool(parlist, RECIPE_STRING,
00181                                                VISIR_PARAM_FIXCOMBI);
00182 
00183     jcol1 = visir_parameterlist_get_int(parlist, RECIPE_STRING,
00184                                         VISIR_PARAM_REJLEFT);
00185     jcol2 = visir_parameterlist_get_int(parlist, RECIPE_STRING,
00186                                         VISIR_PARAM_REJRIGHT);
00187 
00188     skip_if (0);
00189 
00190     /* Identify the RAW and CALIB frames in the input frameset */
00191     skip_if (visir_dfs_set_groups(framelist));
00192 
00193     /* Objects observation */
00194     allframes = irplib_framelist_cast(framelist);
00195     skip_if(allframes == NULL);
00196     rawframes = irplib_framelist_extract(allframes, VISIR_SPC_OBS_ECH_RAW);
00197     skip_if (rawframes == NULL);
00198 
00199     irplib_framelist_empty(allframes);
00200 
00201     skip_if(irplib_framelist_load_propertylist(rawframes, 0, 0, keys_regexp,
00202                                                CPL_FALSE));
00203 
00204     skip_if(irplib_framelist_load_propertylist_all(rawframes, 0, "^("
00205                                                    RECIPE_KEYS_REGEXP_ALL
00206                                                    ")$", CPL_FALSE));
00207 
00208     skip_if(visir_dfs_check_framelist_tag(rawframes));
00209     
00210     /* Quantum efficiency file */
00211     spc_cal_qeff = irplib_frameset_find_file(framelist, VISIR_CALIB_QEFF_SPC);
00212 
00213     /* Spectral lines calibration file */
00214     spc_cal_lines = irplib_frameset_find_file(framelist, VISIR_CALIB_LINES_SPC);
00215 
00216     /* Bad pixels calibration file */
00217     badpix = irplib_frameset_find_file(framelist, VISIR_CALIB_BPM);
00218 
00219     /* Flatfield calibration file */
00220     flat = irplib_frameset_find_file(framelist, VISIR_CALIB_FLAT);
00221 
00222     /* Get Resolution and Central Wavelength */
00223     resol = visir_spc_get_res_wl(rawframes, &wlen, &slitw, &temp, &fwhm);
00224    
00225     skip_if (0);
00226 
00227     if (resol != VISIR_SPC_R_GHR) {
00228         if (visir_spc_obs_ech_config.orderoffset == 0) {
00229             cpl_msg_warning(cpl_func,"Reducing non-HR Grism data as main order");
00230         } else {
00231             cpl_msg_error(cpl_func, "This recipe cannot reduce non-HR Grism "
00232                           "data with an order-offset of %d",
00233                           visir_spc_obs_ech_config.orderoffset);
00234             visir_error_set(CPL_ERROR_TYPE_MISMATCH);
00235             skip_if(1);
00236         }
00237     }
00238    
00239     /* Combine the frames */
00240     combinedpair = visir_img_recombine(RECIPE_STRING, parlist, rawframes, badpix,
00241                                        flat, CPL_GEOM_FIRST, &drop_wcs,
00242                                        !do_fixcombi, wlen, resol);
00243 
00244     if (combinedpair == NULL) {
00245         cpl_msg_error(cpl_func, "Could not combine the input frames");
00246         skip_if (1);
00247     }
00248 
00249     cpl_image_delete(combinedpair[1]);
00250     combined = cpl_image_cast(combinedpair[0], CPL_TYPE_DOUBLE);
00251     cpl_image_delete(combinedpair[0]);
00252     cpl_free(combinedpair);
00253 
00254     skip_if (0);
00255 
00256     skip_if (do_fixcombi && visir_spc_det_fix(&combined, 1, CPL_TRUE,
00257                                wlen, resol,
00258                                visir_spc_obs_ech_config.phi,
00259                                visir_spc_obs_ech_config.ksi,
00260                                visir_spc_obs_ech_config.eps,
00261                                visir_spc_obs_ech_config.delta,
00262                                visir_spc_obs_ech_config.plot));
00263 
00264     /* Get the hcycle image from the reference file */
00265     hcycle = visir_load_hcycle(rawframes, 0);
00266     skip_if (0);
00267 
00268     imhcycle = cpl_imagelist_get(hcycle, 0);
00269 
00270     skip_if (visir_spc_det_fix(&imhcycle, 1, CPL_FALSE,
00271                                wlen, resol,
00272                                visir_spc_obs_ech_config.phi,
00273                                visir_spc_obs_ech_config.ksi,
00274                                visir_spc_obs_ech_config.eps,
00275                                visir_spc_obs_ech_config.delta,
00276                                visir_spc_obs_ech_config.plot));
00277 
00278     skip_if (visir_spc_echelle_limit(&icol1, &icol2, wlen,
00279                                 visir_spc_obs_ech_config.orderoffset,
00280                                 1, cpl_image_get_size_y(combined)));
00281 
00282     skip_if (visir_qc_append_background(qclist, rawframes, icol1, icol2));
00283 
00284     if (jcol1 != 0) {
00285         cpl_msg_info(cpl_func, "Ignoring %d leftmost columns from %d to %d",
00286                      jcol1, icol1, icol1 + jcol1);
00287         icol1 += jcol1;
00288     }
00289     if (jcol2 != 0) {
00290         cpl_msg_info(cpl_func, "Ignoring %d rightmost columns from %d to %d",
00291                      jcol2, icol2 - jcol2, icol2);
00292         icol2 -= jcol2;
00293     }
00294 
00295     if (icol1 != 1 || icol2 != cpl_image_get_size_x(imhcycle)) {
00296 
00297         order = visir_spc_column_extract(imhcycle, icol1, icol2,
00298                                           visir_spc_obs_ech_config.plot);
00299         skip_if (0);
00300 
00301         comorder = visir_spc_column_extract(combined, icol1, icol2,
00302                                              visir_spc_obs_ech_config.plot);
00303         skip_if (0);
00304 
00305     } else {
00306         /* Cannot really succeed from here... */
00307         order = imhcycle;
00308         comorder = combined;
00309     }
00310 
00311     skip_if (visir_spc_extract_wcal(comorder, order, wlen, slitw, temp, fwhm,
00312                                     resol, visir_spc_obs_ech_config.orderoffset,
00313                                     spc_cal_lines, spc_cal_qeff,
00314                                     &spc_table, &weight2d, qclist,
00315                                     visir_spc_obs_ech_config.plot));
00316 
00317     /* This column is not part of the product */
00318     skip_if (cpl_table_erase_column(spc_table, "SPC_EMISSIVITY"));
00319 
00320     bug_if (visir_spectro_qc(qclist, paflist, drop_wcs, rawframes, NULL,
00321                              "^(" VISIR_PFITS_REGEXP_SPC_WCAL_PAF ")$"));
00322     irplib_framelist_empty(rawframes);
00323    
00324     /* Save the spectrum */
00325     cpl_msg_info(cpl_func, "Saving the produced spectrum");
00326 
00327     /* PRO.CATG */
00328     bug_if (cpl_propertylist_append_string(paflist, CPL_DFS_PRO_CATG,
00329                                            VISIR_SPC_OBS_ECH_COMBINED_PROCATG));
00330 
00331     skip_if (visir_spc_obs_ech_save(framelist, parlist, qclist, paflist,
00332                                     combined, weight2d, spc_table));
00333 
00334     end_skip;
00335 
00336     cpl_propertylist_delete(qclist);
00337     cpl_propertylist_delete(paflist);
00338     irplib_framelist_delete(allframes);
00339     irplib_framelist_delete(rawframes);
00340     cpl_image_delete(combined);
00341     if (comorder != combined) cpl_image_delete(comorder);
00342     cpl_table_delete(spc_table);
00343     cpl_image_delete(weight2d);
00344     cpl_imagelist_delete(hcycle);
00345     if (order != imhcycle) cpl_image_delete(order);
00346 
00347     return cpl_error_get_code();
00348 }
00349 
00350 /*----------------------------------------------------------------------------*/
00362 /*----------------------------------------------------------------------------*/
00363 static cpl_error_code visir_spc_obs_ech_save(cpl_frameset            * set,
00364                                              const cpl_parameterlist * parlist,
00365                                              const cpl_propertylist  * qclist,
00366                                              const cpl_propertylist  * paflist,
00367                                              const cpl_image         * combined,
00368                                              const cpl_image         * weight2d,
00369                                              const cpl_table         * table)
00370 {
00371 
00372     bug_if (0);
00373 
00374     /* THE TABLE */
00375     skip_if (irplib_dfs_save_table(set, parlist, set, table, NULL, RECIPE_STRING,
00376                                VISIR_SPC_OBS_ECH_TAB_PROCATG,
00377                                qclist, NULL, visir_pipe_id,
00378                                RECIPE_STRING "_spectrum_tab" CPL_DFS_FITS));
00379 
00380     /* THE COMBINED IMAGE */
00381     skip_if (irplib_dfs_save_image(set, parlist, set, combined, CPL_BPP_IEEE_FLOAT,
00382                                RECIPE_STRING, VISIR_SPC_OBS_ECH_COMBINED_PROCATG,
00383                                qclist, NULL, visir_pipe_id,
00384                                RECIPE_STRING CPL_DFS_FITS));
00385 
00386     /* THE WEIGHT IMAGE */
00387     skip_if (irplib_dfs_save_image(set, parlist, set, weight2d, CPL_BPP_IEEE_FLOAT,
00388                                RECIPE_STRING, VISIR_SPC_OBS_ECH_WEIGHT_PROCATG,
00389                                qclist, NULL, visir_pipe_id,
00390                                RECIPE_STRING "_weight" CPL_DFS_FITS));
00391 
00392 #ifdef VISIR_SAVE_PAF
00393     /* THE PAF FILE FOR QC PARAMETERS */
00394     skip_if (cpl_dfs_save_paf("VISIR", RECIPE_STRING, paflist,
00395                              RECIPE_STRING CPL_DFS_PAF));
00396 #else
00397     bug_if(paflist == NULL);
00398 #endif
00399 
00400     end_skip;
00401 
00402     return cpl_error_get_code();
00403 
00404 }

Generated on Mon Feb 6 15:23:49 2012 for VISIR Pipeline Reference Manual by  doxygen 1.5.8