crires_util_extract.c

00001 /* $Id: crires_util_extract.c,v 1.64 2011/01/14 08:31:53 yjung Exp $
00002  *
00003  * This file is part of the crires 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  */
00020 
00021 /*
00022  * $Author: yjung $
00023  * $Date: 2011/01/14 08:31:53 $
00024  * $Revision: 1.64 $
00025  * $Name: crire-2_1_1 $
00026  */
00027 
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031 
00032 /*-----------------------------------------------------------------------------
00033                                 Includes
00034  -----------------------------------------------------------------------------*/
00035 
00036 #include "crires_recipe.h"
00037 
00038 #include "crires_extract.h"
00039 
00040 /*-----------------------------------------------------------------------------
00041                                 Define
00042  -----------------------------------------------------------------------------*/
00043 
00044 #define RECIPE_STRING "crires_util_extract"
00045 
00046 /*-----------------------------------------------------------------------------
00047                             Functions prototypes
00048  -----------------------------------------------------------------------------*/
00049 
00050 static int crires_util_extract_save(const cpl_table **, const cpl_imagelist *, 
00051         const cpl_imagelist *, const cpl_parameterlist *, cpl_frameset *) ;
00052 
00053 static char crires_util_extract_description[] = 
00054 "This recipe accepts 1 parameter (optionally a 2nd one):\n"
00055 "First parameter:   the combined image.\n" 
00056 "                   (PRO TYPE = "CRIRES_PROTYPE_COMBINED")\n"
00057 "Second parameter (optional):   the contribution map.\n" 
00058 "                   (PRO TYPE = "CRIRES_PROTYPE_CONTRIB")\n"
00059 "\n"
00060 "This recipe produces 3 files:\n"
00061 "First product:     the image of the profile of the spectrum\n"
00062 "                   (PRO TYPE = "CRIRES_PROTYPE_PROFILE")\n"
00063 "Second product:    the table of the extracted spectrum in pixels\n"
00064 "                   (PRO TYPE = "CRIRES_PROTYPE_SPEC_PIX")\n"
00065 "Third product:     the maps of the background\n"
00066 "                   (PRO TYPE = "CRIRES_PROTYPE_BGD_MAP")\n" ;
00067 
00068 CRIRES_RECIPE_DEFINE(crires_util_extract,
00069         CRIRES_PARAM_DISPLAY        |
00070         CRIRES_PARAM_EXTR_MODE      |
00071         CRIRES_PARAM_HOR_SIZE       |
00072         CRIRES_PARAM_SPEC_HSIZE     |
00073         CRIRES_PARAM_KAPPA          |
00074         CRIRES_PARAM_CLOSING_HSIZE  |
00075         CRIRES_PARAM_CLEAN_RATE     |
00076         CRIRES_PARAM_TOT_NDIT       |
00077         CRIRES_PARAM_WL_STARTY      |
00078         CRIRES_PARAM_WL_STOPY       |
00079         CRIRES_PARAM_SPEC_ZONE      |
00080         CRIRES_PARAM_REJECT,
00081         "Spectrum extraction routine",
00082         crires_util_extract_description) ;
00083 
00084 /*-----------------------------------------------------------------------------
00085                             Static variables
00086  -----------------------------------------------------------------------------*/
00087 
00088 static struct {
00089     /* Inputs */
00090     /* mode : 1=spec ; 2=lines-spec ; 3=lines */
00091     int                 mode ;
00092     double              kappa ;         /* mode = 1 */
00093     int                 closing_hs ;    /* mode = 1 */
00094     double              clean_rate ;    /* mode = 1 */
00095     double              tot_ndit ;      /* mode = 1 */
00096     int                 box_hor_size ;  /* mode = 1 or 2 */
00097     int                 spec_hsize ;    /* mode = 1 or 2 */
00098     int                 extr_spec_starty ;  /* mode = 1 or 2 */
00099     int                 extr_spec_stopy ;   /* mode = 1 or 2 */
00100     int                 starty ;        /* mode = 3 */
00101     int                 stopy ;         /* mode = 3 */
00102     int                 rej_right ;     /* All modes */
00103     int                 rej_left ;      /* All modes */
00104     int                 display ;       /* All modes */
00105     /* Outputs */
00106     crires_illum_period period ;
00107     int                 qc_specpos[CRIRES_NB_DETECTORS] ;
00108     int                 qc_specwrec[CRIRES_NB_DETECTORS] ;
00109     int                 qc_specwopt[CRIRES_NB_DETECTORS] ;
00110     double              qc_specoptmed[CRIRES_NB_DETECTORS] ;
00111     double              qc_s2nmed[CRIRES_NB_DETECTORS] ;
00112     double              qc_fwhm_comb_pix[CRIRES_NB_DETECTORS] ;
00113     double              qc_fwhm_comb_as[CRIRES_NB_DETECTORS] ;
00114     double              qc_fwhm_prof_pix[CRIRES_NB_DETECTORS] ;
00115     double              qc_fwhm_prof_as[CRIRES_NB_DETECTORS] ;
00116     double              qc_fwhm_diff[CRIRES_NB_DETECTORS] ;
00117 } crires_util_extract_config ;
00118 
00119 /*-----------------------------------------------------------------------------
00120                                 Functions code
00121  -----------------------------------------------------------------------------*/
00122 
00123 /*----------------------------------------------------------------------------*/
00130 /*----------------------------------------------------------------------------*/
00131 static int crires_util_extract(
00132         cpl_frameset            *   frameset,
00133         const cpl_parameterlist *   parlist) 
00134 {
00135     const char          *   sval ;
00136     cpl_imagelist       *   imlist ;
00137     cpl_propertylist    *   plist ;
00138     cpl_imagelist       *   contrib ;
00139     cpl_image           *   contribution_map ;
00140     cpl_frame           *   fr ;
00141     cpl_imagelist       *   profile ;
00142     cpl_image           *   prof[CRIRES_NB_DETECTORS] ;
00143     cpl_imagelist       *   bgmaps ;
00144     cpl_image           *   bgmap[CRIRES_NB_DETECTORS] ;
00145     cpl_table           *   ext[CRIRES_NB_DETECTORS] ;
00146     cpl_vector          *   ext_vec ;
00147     int                     ly, nexp ;
00148     int                     i, j ;
00149     
00150     /* Initialise */
00151     for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00152         crires_util_extract_config.qc_specpos[i] = -1 ;
00153         crires_util_extract_config.qc_specwrec[i] = -1 ;
00154         crires_util_extract_config.qc_specwopt[i] = -1 ;
00155         crires_util_extract_config.qc_specoptmed[i] = -1.0 ;
00156         crires_util_extract_config.qc_s2nmed[i] = -1.0 ;
00157         crires_util_extract_config.qc_fwhm_comb_pix[i] = -1.0 ;
00158         crires_util_extract_config.qc_fwhm_comb_as[i] = -1.0 ;
00159         crires_util_extract_config.qc_fwhm_prof_pix[i] = -1.0 ;
00160         crires_util_extract_config.qc_fwhm_prof_as[i] = -1.0 ;
00161         crires_util_extract_config.qc_fwhm_diff[i] = -1.0 ;
00162         prof[i] = NULL ;
00163         bgmap[i] = NULL ;
00164     }
00165     ly = -1 ;
00166     
00167     /* Retrieve input parameters */
00168     crires_util_extract_config.display = crires_parameterlist_get_int(parlist,
00169             RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
00170     crires_util_extract_config.mode = crires_parameterlist_get_int(parlist,
00171             RECIPE_STRING, CRIRES_PARAM_EXTR_MODE) ;
00172     crires_util_extract_config.box_hor_size = crires_parameterlist_get_int(
00173             parlist, RECIPE_STRING, CRIRES_PARAM_HOR_SIZE) ;
00174     crires_util_extract_config.spec_hsize = crires_parameterlist_get_int(
00175             parlist, RECIPE_STRING, CRIRES_PARAM_SPEC_HSIZE) ;
00176     crires_util_extract_config.kappa = crires_parameterlist_get_double(
00177             parlist, RECIPE_STRING, CRIRES_PARAM_KAPPA) ;
00178     crires_util_extract_config.closing_hs = crires_parameterlist_get_int(
00179             parlist, RECIPE_STRING, CRIRES_PARAM_CLOSING_HSIZE) ;
00180     crires_util_extract_config.clean_rate = crires_parameterlist_get_double(
00181             parlist, RECIPE_STRING, CRIRES_PARAM_CLEAN_RATE) ;
00182     crires_util_extract_config.tot_ndit = crires_parameterlist_get_double(
00183             parlist, RECIPE_STRING, CRIRES_PARAM_TOT_NDIT) ;
00184     crires_util_extract_config.starty = crires_parameterlist_get_int(
00185             parlist, RECIPE_STRING, CRIRES_PARAM_WL_STARTY) ;
00186     crires_util_extract_config.stopy = crires_parameterlist_get_int(
00187             parlist, RECIPE_STRING, CRIRES_PARAM_WL_STOPY) ;
00188     sval = crires_parameterlist_get_string(parlist, RECIPE_STRING,
00189             CRIRES_PARAM_SPEC_ZONE) ;
00190     if (sscanf(sval, "%d,%d",
00191                     &crires_util_extract_config.extr_spec_starty,
00192                     &crires_util_extract_config.extr_spec_stopy)!=2) {
00193         return -1 ;
00194     }
00195     sval = crires_parameterlist_get_string(parlist, RECIPE_STRING,
00196             CRIRES_PARAM_REJECT) ;
00197     if (sscanf(sval, "%d,%d",
00198                     &crires_util_extract_config.rej_left,
00199                     &crires_util_extract_config.rej_right)!=2) {
00200         return -1 ;
00201     }
00202  
00203     /* Identify the RAW and CALIB frames in the input frameset */
00204     if (crires_dfs_set_groups(frameset, NULL)) {
00205         cpl_msg_error(__func__, "Cannot identify RAW and CALIB frames") ;
00206         return -1 ;
00207     }
00208   
00209     /* Get the detector illumination period */
00210     fr = cpl_frameset_get_frame(frameset, 0);
00211     crires_util_extract_config.period =
00212         crires_get_detector_illum_period(cpl_frame_get_filename(fr)) ;
00213     if (crires_util_extract_config.period == CRIRES_ILLUM_UNKNOWN) {
00214         cpl_msg_error(__func__, 
00215                 "Cannot determine the detector illumination period") ;
00216         return -1 ;
00217     } else {
00218         crires_display_detector_illum(crires_util_extract_config.period) ;
00219     }
00220  
00221     /* Load the first file in an image list */
00222     cpl_msg_info(__func__, "Input image loading") ;
00223     imlist = crires_load_file(cpl_frame_get_filename(fr), 
00224             crires_util_extract_config.period, CPL_TYPE_FLOAT) ;
00225   
00226     /* Load the optional contribution map */
00227     if (cpl_frameset_get_size(frameset) >= 2) {
00228         fr = cpl_frameset_get_frame(frameset, 1);
00229         cpl_msg_info(__func__, "Contribution map specified: %s",
00230                 cpl_frame_get_filename(fr)) ;
00231         contrib = crires_load_file(cpl_frame_get_filename(fr), 
00232                 crires_util_extract_config.period, CPL_TYPE_INT) ;
00233     } else contrib = NULL ;
00234    
00235     if (crires_util_extract_config.mode == 1) {
00236         /* Get the total ndit */
00237         fr = cpl_frameset_get_frame(frameset, 0);
00238         if (crires_util_extract_config.tot_ndit < 0) {
00239             crires_util_extract_config.tot_ndit = 
00240                 crires_get_totndit(cpl_frame_get_filename(fr)) ;
00241             if (crires_util_extract_config.tot_ndit < 0) {
00242                 cpl_msg_error(__func__, "Cannot get the total number of NDIT*DIT") ;
00243                 cpl_imagelist_delete(imlist) ;
00244                 if (contrib != NULL) cpl_imagelist_delete(contrib) ;
00245                 return -1 ;
00246             }
00247         }
00248         /* Get the number of exposures used for the frames combination */
00249         plist=cpl_propertylist_load(cpl_frame_get_filename(fr), 0) ;
00250         nexp = crires_pfits_get_datancom(plist) ;
00251         cpl_propertylist_delete(plist) ;
00252         if (cpl_error_get_code() != CPL_ERROR_NONE) {
00253             cpl_msg_error(__func__, "No PRO DATANCOM information in the header");
00254             cpl_imagelist_delete(imlist) ;
00255             if (contrib != NULL) cpl_imagelist_delete(contrib) ;
00256             return -1 ;
00257         }
00258         crires_util_extract_config.tot_ndit *= nexp ;
00259     }
00260         
00261     /* Extract chips */
00262     cpl_msg_info(__func__, "Spectrum extraction") ;
00263     cpl_msg_indent_more() ;
00264     for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00265         cpl_msg_info(__func__, "Spectrum extraction from chip number %d", i+1) ;
00266         cpl_msg_indent_more() ;
00267         if (crires_util_extract_config.mode == 1) {
00268             /* Extract spectrum */
00269             if (contrib != NULL) 
00270                 contribution_map = cpl_imagelist_get(contrib, i) ;
00271             else
00272                 contribution_map = NULL ;
00273             ext[i] = crires_extract_spectrum(cpl_imagelist_get(imlist, i),
00274                     contribution_map,
00275                     crires_util_extract_config.box_hor_size, 
00276                     crires_util_extract_config.spec_hsize, 
00277                     crires_util_extract_config.kappa,
00278                     crires_util_extract_config.closing_hs,
00279                     crires_util_extract_config.clean_rate,
00280                     crires_util_extract_config.rej_left,
00281                     crires_util_extract_config.rej_right,
00282                     crires_util_extract_config.extr_spec_starty,
00283                     crires_util_extract_config.extr_spec_stopy,
00284                     i+1,
00285                     crires_util_extract_config.tot_ndit,
00286                     crires_util_extract_config.period,
00287                     &(crires_util_extract_config.qc_specpos[i]), 
00288                     &(crires_util_extract_config.qc_specwrec[i]), 
00289                     &(crires_util_extract_config.qc_specwopt[i]), 
00290                     &(crires_util_extract_config.qc_specoptmed[i]),
00291                     &(crires_util_extract_config.qc_s2nmed[i]),
00292                     &(prof[i]),
00293                     &(bgmap[i])) ;
00294             cpl_msg_info(__func__, "Chip number %d FWHM Computation", i+1) ;
00295             if (crires_extract_qc_fwhm(cpl_imagelist_get(imlist, i),
00296                         prof[i],
00297                         &(crires_util_extract_config.qc_fwhm_comb_pix[i]),
00298                         &(crires_util_extract_config.qc_fwhm_comb_as[i]),
00299                         &(crires_util_extract_config.qc_fwhm_prof_pix[i]),
00300                         &(crires_util_extract_config.qc_fwhm_prof_as[i]),
00301                         &(crires_util_extract_config.qc_fwhm_diff[i])) == -1) {
00302                 cpl_msg_warning(__func__, "Failed for FWHM computation") ;
00303                 crires_util_extract_config.qc_fwhm_comb_pix[i] = -1.0 ;
00304                 crires_util_extract_config.qc_fwhm_comb_as[i] = -1.0 ;
00305                 crires_util_extract_config.qc_fwhm_prof_pix[i] = -1.0 ;
00306                 crires_util_extract_config.qc_fwhm_prof_as[i] = -1.0 ;
00307                 crires_util_extract_config.qc_fwhm_diff[i] = -1.0 ;
00308             }
00309         } else if (crires_util_extract_config.mode == 2) {
00310             /* Extract lines - spectrum */
00311             ext_vec=crires_extract_lines_spectrum(cpl_imagelist_get(imlist, i),
00312                     crires_util_extract_config.period,
00313                     i+1,
00314                     crires_util_extract_config.box_hor_size, 
00315                     crires_util_extract_config.spec_hsize, 
00316                     crires_util_extract_config.rej_left,
00317                     crires_util_extract_config.rej_right,
00318                     crires_util_extract_config.extr_spec_starty,
00319                     crires_util_extract_config.extr_spec_stopy) ;
00320             if (ext_vec != NULL) {
00321                 ext[i] = crires_extract_gen_tab(ext_vec, NULL, NULL, NULL, 
00322                         NULL, NULL, NULL) ;     
00323                 cpl_vector_delete(ext_vec) ;
00324             } else ext[i] = NULL ;
00325         } else if (crires_util_extract_config.mode == 3) {
00326 
00327             /* Get the correction for the position */
00328             if (i+1 == 1) 
00329                 ly = crires_get_detector_ly1(crires_util_extract_config.period);
00330             if (i+1 == 2) 
00331                 ly = crires_get_detector_ly2(crires_util_extract_config.period);
00332             if (i+1 == 3) 
00333                 ly = crires_get_detector_ly3(crires_util_extract_config.period);
00334             if (i+1 == 4) 
00335                 ly = crires_get_detector_ly4(crires_util_extract_config.period);
00336 
00337             /* Extract lines */
00338             ext_vec = crires_extract_lines(cpl_imagelist_get(imlist, i),
00339                     crires_util_extract_config.starty-ly,
00340                     crires_util_extract_config.stopy-ly,
00341                     crires_util_extract_config.rej_left,
00342                     crires_util_extract_config.rej_right) ;
00343             if (ext_vec != NULL) {
00344                 ext[i] = crires_extract_gen_tab(ext_vec, NULL, NULL, NULL, 
00345                         NULL, NULL, NULL) ;     
00346                 cpl_vector_delete(ext_vec) ;
00347             } else ext[i] = NULL ;
00348         } else {
00349             cpl_msg_error(__func__, "Unsuported mode") ;
00350             ext[i] = NULL ;
00351         }
00352         if (ext[i] != NULL) {
00353             /* Plot the result if required */
00354             if (crires_util_extract_config.display == i+1) {
00355                 ext_vec = cpl_vector_wrap(cpl_table_get_nrow(ext[i]),
00356                 cpl_table_get_data_double(ext[i], CRIRES_COL_EXTRACT_INT_RECT));
00357                 irplib_vector_plot(
00358 "set grid;set xlabel 'Position (pixels)';set ylabel 'Intensity RECT (ADU/sec)';",
00359                 "t 'Extracted Spectrum RECT' w lines", "", ext_vec) ;
00360                 cpl_vector_unwrap(ext_vec) ;
00361  
00362                 ext_vec = cpl_vector_wrap(cpl_table_get_nrow(ext[i]),
00363                 cpl_table_get_data_double(ext[i], CRIRES_COL_EXTRACT_INT_OPT)) ;
00364                 irplib_vector_plot(
00365 "set grid;set xlabel 'Position (pixels)';set ylabel 'Intensity OPT (ADU/sec)';",
00366                 "t 'Extracted Spectrum OPT' w lines", "", ext_vec) ;
00367                 cpl_vector_unwrap(ext_vec) ;
00368             }
00369         } else {
00370             cpl_msg_warning(__func__, 
00371                     "Cannot extract spectrum from chip number %d", i+1) ;
00372         }
00373         cpl_msg_indent_less() ;
00374     }
00375     cpl_imagelist_delete(imlist) ;
00376     if (contrib != NULL) cpl_imagelist_delete(contrib) ;
00377     cpl_msg_indent_less() ;
00378  
00379     /* Test that the spectrum is at the same place in all detectors */
00380     for (i=1 ; i<CRIRES_NB_DETECTORS ; i++) {
00381         if (crires_util_extract_config.qc_specpos[i-1] > 0 && 
00382                 crires_util_extract_config.qc_specpos[i] > 0 &&
00383                 fabs(crires_util_extract_config.qc_specpos[i-1] - 
00384                     crires_util_extract_config.qc_specpos[i]) > 
00385                 CRIRES_SPEC_POS_TOLERANCE) {
00386             cpl_msg_warning(__func__, 
00387     "The spectrum positions in chip %d and chip %d are too different: %d -> %d",
00388                     i, i+1, crires_util_extract_config.qc_specpos[i-1], 
00389                     crires_util_extract_config.qc_specpos[i]) ;
00390         }
00391     }
00392  
00393     /* Create the profile */
00394     profile = cpl_imagelist_new() ;
00395     for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00396         if (prof[i] != NULL) cpl_imagelist_set(profile, prof[i], i) ;
00397         else {
00398             cpl_imagelist_delete(profile) ;
00399             profile = NULL ;
00400             for (j=i+1 ; j<CRIRES_NB_DETECTORS ; j++) 
00401                 if (prof[j] != NULL) cpl_image_delete(prof[j]) ;
00402             break ;
00403         }
00404     }
00405    
00406     /* Create the bg maps */
00407     bgmaps = cpl_imagelist_new() ;
00408     for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00409         if (bgmap[i] != NULL) cpl_imagelist_set(bgmaps, bgmap[i], i) ;
00410         else {
00411             cpl_imagelist_delete(bgmaps) ;
00412             bgmaps = NULL ;
00413             for (j=i+1 ; j<CRIRES_NB_DETECTORS ; j++) 
00414                 if (bgmap[j] != NULL) cpl_image_delete(bgmap[j]) ;
00415             break ;
00416         }
00417     }
00418         
00419     /* Save the result */
00420     cpl_msg_info(__func__, "Save the products") ;
00421     cpl_msg_indent_more() ;
00422     if (crires_util_extract_save((const cpl_table **)ext, profile, bgmaps, 
00423                 parlist, frameset) == -1) {
00424         cpl_msg_error(__func__, "Cannot save products") ;
00425         cpl_msg_indent_less() ;
00426         for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00427             if (ext[i] != NULL) cpl_table_delete(ext[i]) ;
00428         }
00429         if (profile != NULL) cpl_imagelist_delete(profile) ;
00430         if (bgmaps != NULL) cpl_imagelist_delete(bgmaps) ;
00431         return -1 ;
00432     }
00433     cpl_msg_indent_less() ;
00434    
00435     /* Deallocate */
00436     for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00437         if (ext[i] != NULL) cpl_table_delete(ext[i]) ;
00438     }
00439     if (profile != NULL) cpl_imagelist_delete(profile) ;
00440     if (bgmaps != NULL) cpl_imagelist_delete(bgmaps) ;
00441 
00442     /* Return */
00443     if (cpl_error_get_code()) return -1 ;
00444     else return 0 ;
00445 }
00446 
00447 /*----------------------------------------------------------------------------*/
00457 /*----------------------------------------------------------------------------*/
00458 static int crires_util_extract_save(
00459         const cpl_table             **  ext,
00460         const cpl_imagelist         *   profile,
00461         const cpl_imagelist         *   bgmaps,
00462         const cpl_parameterlist     *   parlist,
00463         cpl_frameset                *   set)
00464 {
00465     cpl_propertylist    **  qclists ;
00466     const cpl_frame     *   ref_frame ;
00467     cpl_propertylist    *   inputlist ;
00468     const char          *   recipe_name = "crires_util_extract" ;
00469     int                     i ;
00470 
00471     /* Get the reference frame */
00472     ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
00473 
00474     /* Create the QC lists */
00475     qclists = cpl_malloc(CRIRES_NB_DETECTORS * sizeof(cpl_propertylist*)) ;
00476     for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00477         qclists[i] = cpl_propertylist_new() ;
00478         cpl_propertylist_append_int(qclists[i], "ESO QC SPECPOS",
00479                 crires_util_extract_config.qc_specpos[i]) ;
00480         cpl_propertylist_append_int(qclists[i], "ESO QC SPECWREC",
00481                 crires_util_extract_config.qc_specwrec[i]) ;
00482         cpl_propertylist_append_int(qclists[i], "ESO QC SPECWOPT",
00483                 crires_util_extract_config.qc_specwopt[i]) ;
00484         cpl_propertylist_append_double(qclists[i], "ESO QC SIGNAL MED",
00485                 crires_util_extract_config.qc_specoptmed[i]) ;
00486         cpl_propertylist_append_double(qclists[i], "ESO QC S2NMED",
00487                 crires_util_extract_config.qc_s2nmed[i]) ;
00488         cpl_propertylist_append_double(qclists[i], "ESO QC FWHMPIX COMBINED",
00489                 crires_util_extract_config.qc_fwhm_comb_pix[i]) ;
00490         cpl_propertylist_append_double(qclists[i], "ESO QC FWHMARC COMBINED",
00491                 crires_util_extract_config.qc_fwhm_comb_as[i]) ;
00492         cpl_propertylist_append_double(qclists[i], "ESO QC FWHMPIX PROFILE",
00493                 crires_util_extract_config.qc_fwhm_prof_pix[i]) ;
00494         cpl_propertylist_append_double(qclists[i], "ESO QC FWHMARC PROFILE",
00495                 crires_util_extract_config.qc_fwhm_prof_as[i]) ;
00496         cpl_propertylist_append_double(qclists[i], "ESO QC FWHM DIFF",
00497                 crires_util_extract_config.qc_fwhm_diff[i]) ;
00498 
00499         /* Propagate some keywords from input raw frame extensions */
00500         inputlist = cpl_propertylist_load_regexp(
00501                 cpl_frame_get_filename(ref_frame), i+1,
00502                 CRIRES_HEADER_EXT_FORWARD, 0) ;
00503         cpl_propertylist_copy_property_regexp(qclists[i], inputlist, 
00504                 CRIRES_HEADER_EXT_FORWARD, 0) ;
00505         cpl_propertylist_delete(inputlist) ;
00506     }
00507 
00508     if (profile != NULL) {
00509         /* Write the image */
00510         crires_image_save(set,
00511                 parlist,
00512                 set,
00513                 profile,
00514                 recipe_name,
00515                 CRIRES_OBS_EXTRACT_PROFILE_IMA,
00516                 CRIRES_PROTYPE_PROFILE,
00517                 crires_util_extract_config.period,
00518                 NULL,
00519                 (const cpl_propertylist**)qclists,
00520                 PACKAGE "/" PACKAGE_VERSION,
00521                 "crires_util_extract_profile.fits") ;
00522     }
00523 
00524     if (bgmaps!= NULL) {
00525         /* Write the image */
00526         crires_image_save(set,
00527                 parlist,
00528                 set,
00529                 bgmaps,
00530                 recipe_name,
00531                 CRIRES_OBS_EXTRACT_BGMAP_IMA,
00532                 CRIRES_PROTYPE_BGD_MAP,
00533                 crires_util_extract_config.period,
00534                 NULL,
00535                 (const cpl_propertylist**)qclists,
00536                 PACKAGE "/" PACKAGE_VERSION,
00537                 "crires_util_extract_bgmap.fits") ;
00538     }
00539 
00540     /* Write the table */
00541     crires_table_save(set,
00542             parlist,
00543             set,
00544             ext,
00545             recipe_name,
00546             CRIRES_EXTRACT_PIX_TAB,
00547             CRIRES_PROTYPE_SPEC_PIX,
00548             NULL,
00549             (const cpl_propertylist**)qclists,
00550             PACKAGE "/" PACKAGE_VERSION,
00551             "crires_util_extract_extracted.fits") ;
00552 
00553     /* Free and return */
00554     for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00555         cpl_propertylist_delete(qclists[i]) ;
00556     }
00557     cpl_free(qclists) ;
00558     return  0;
00559 }
00560 

Generated on 22 Mar 2011 for CRIRES Pipeline Reference Manual by  doxygen 1.6.1