CRIRES Pipeline Reference Manual  2.3.2
crires_util_plot.c
00001 /* $Id: crires_util_plot.c,v 1.33 2012-09-19 14:10:27 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: 2012-09-19 14:10:27 $
00024  * $Revision: 1.33 $
00025  * $Name: not supported by cvs2svn $
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 "irplib_wlxcorr.h"
00039 
00040 /*-----------------------------------------------------------------------------
00041                                 Define
00042  -----------------------------------------------------------------------------*/
00043 
00044 #define RECIPE_STRING "crires_util_plot"
00045 
00046 /*-----------------------------------------------------------------------------
00047                             Functions prototypes
00048  -----------------------------------------------------------------------------*/
00049 
00050 static int crires_util_plot_diff(const cpl_table *,const char *, const char *) ;
00051 static int crires_util_plot_spec_pix(cpl_table *, cpl_table *, int) ;
00052 static int crires_util_plot_spec_pix_one(cpl_table *, cpl_table *, int, 
00053         const char *, const char *, const char *) ;
00054 static int crires_util_plot_spec_wl(cpl_table *, cpl_table *, 
00055         const char *, int) ;
00056 static int crires_util_plot_convers(cpl_table *, cpl_table *, 
00057         const char *, int) ;
00058 static int crires_util_plot_sensit(cpl_table *, cpl_table *, 
00059         const char *, int) ;
00060 static int crires_util_plot_spec_wl_one(cpl_table *, cpl_table *, 
00061         const char *, int, const char *, const char *, const char *) ;
00062 
00063 static char crires_util_plot_description[] = "Plot the CRIRES tables.\n" 
00064 "For MEF, specify the extension with --display=extension_number.\n"
00065 "This recipe accepts possibly 2 parameter:\n"
00066 "First parameter:       the table to plot.\n"
00067 "                       (PRO TYPE = "CRIRES_PROTYPE_CATALOG") or\n"
00068 "                       (PRO TYPE = "CRIRES_PROTYPE_PHO_FLUX") or\n"
00069 "                       (PRO TYPE = "CRIRES_PROTYPE_SPEC_PIX") or\n"
00070 "                       (PRO TYPE = "CRIRES_PROTYPE_SPEC_WL") or\n"
00071 "                       (PRO TYPE = "CRIRES_PROTYPE_XCORR") or\n"
00072 "                       (PRO TYPE = "CRIRES_PROTYPE_CONVERS") or\n"
00073 "                       (PRO TYPE = "CRIRES_PROTYPE_SENSIT") or\n"
00074 "                       (PRO TYPE = "CRIRES_PROTYPE_FWHM")\n" 
00075 "Second parameter is optional and must be of the same type and same\n"
00076 "                 table length as the first one. If provided, the two\n"
00077 "                 signals are overplotted. In this case, --adjust can \n"
00078 "                 be used to adjust the second plot average level to \n"
00079 "                 the first one.\n" ;
00080 
00081 CRIRES_RECIPE_DEFINE(crires_util_plot,
00082         CRIRES_PARAM_PMIN       |
00083         CRIRES_PARAM_PMAX       |
00084         CRIRES_PARAM_DISPLAY    |
00085         CRIRES_PARAM_WL_MODEL   |
00086         CRIRES_PARAM_ADJUST,
00087         "Plotting tool for the CRIRES tables",
00088         crires_util_plot_description) ;
00089 
00090 /*-----------------------------------------------------------------------------
00091                             Static variables
00092  -----------------------------------------------------------------------------*/
00093 
00094 static struct {
00095     /* Inputs */
00096     int             pmin ;
00097     int             pmax ;
00098     int             chip ;
00099     int             use_model ;
00100     int             adjust_level ;
00101 } crires_util_plot_config ;
00102 
00103 /*-----------------------------------------------------------------------------
00104                                 Functions code
00105  -----------------------------------------------------------------------------*/
00106 
00107 /*----------------------------------------------------------------------------*/
00114 /*----------------------------------------------------------------------------*/
00115 static int crires_util_plot(
00116         cpl_frameset            *   frameset,
00117         const cpl_parameterlist *   parlist)
00118 {
00119     const char          *   fname ;
00120     const char          *   fname_opt ;
00121     const char          *   title ;
00122     const char          *   sval ;
00123     cpl_propertylist    *   plist ;
00124     cpl_table           *   tab ;
00125     cpl_table           *   tab_opt ;
00126     cpl_array           *   wave ;
00127     cpl_array           *   flux ;
00128     cpl_vector          *   wave_vec ;
00129     cpl_vector          *   flux_vec ;
00130     cpl_bivector        *   flux_biv ;
00131     const char          *   wave_col ;
00132     int                     i ;
00133    
00134     /* Retrieve input parameters */
00135     crires_util_plot_config.pmin = crires_parameterlist_get_int(parlist,
00136             RECIPE_STRING, CRIRES_PARAM_PMIN) ;
00137     crires_util_plot_config.pmax = crires_parameterlist_get_int(parlist,
00138             RECIPE_STRING, CRIRES_PARAM_PMAX) ;
00139     crires_util_plot_config.chip = crires_parameterlist_get_int(parlist,
00140             RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
00141     crires_util_plot_config.use_model = crires_parameterlist_get_bool(parlist, 
00142             RECIPE_STRING, CRIRES_PARAM_WL_MODEL) ;
00143     crires_util_plot_config.adjust_level=crires_parameterlist_get_bool(parlist, 
00144             RECIPE_STRING, CRIRES_PARAM_ADJUST) ;
00145 
00146     /* Initialise */
00147     if (crires_util_plot_config.use_model)  
00148         wave_col = CRIRES_COL_WAVELENGTH_MODEL ;
00149     else
00150         wave_col = CRIRES_COL_WAVELENGTH ;
00151     
00152     /* Identify the RAW and CALIB frames in the input frameset */
00153     if (crires_dfs_set_groups(frameset, NULL)) {
00154         cpl_msg_error(__func__, "Cannot identify RAW and CALIB frames") ;
00155         return -1 ;
00156     }
00157 
00158     /* Retrieve raw frames */
00159     fname = cpl_frame_get_filename(cpl_frameset_get_position(frameset, 0)) ;
00160     if (cpl_frameset_get_size(frameset) > 1) {
00161         fname_opt = cpl_frame_get_filename(
00162                 cpl_frameset_get_position(frameset, 1)) ;
00163     } else {
00164         fname_opt = NULL ;
00165     }
00166 
00167     /* CRIRES_PROTYPE_CATALOG */
00168     tab = crires_load_table_check(fname, 1, CRIRES_PROTYPE_CATALOG, 
00169             crires_util_plot_config.pmin,
00170             crires_util_plot_config.pmax,
00171             crires_util_plot_config.use_model) ;
00172     if (tab != NULL) {
00173         plist = cpl_propertylist_load(fname, 0) ;
00174         sval = crires_pfits_get_procatg(plist) ;
00175         /* CRIRES_CALPRO_THAR_CAT */
00176         if (!strcmp(sval, CRIRES_CALPRO_THAR_CAT))
00177             title = "t 'Thorium/Argon lines' w lines" ;
00178         /* CRIRES_CALPRO_N2O_CAT */
00179         else if (!strcmp(sval, CRIRES_CALPRO_N2O_CAT))  
00180             title = "t 'N2O gas cell lines' w lines" ;
00181         /* CRIRES_CALPRO_OH_CAT */
00182         else if (!strcmp(sval, CRIRES_CALPRO_OH_CAT))  
00183             title = "t 'OH lines' w lines" ;
00184         /* CRIRES_CALPRO_HITRAN_CAT */
00185         else if (!strcmp(sval, CRIRES_CALPRO_HITRAN_CAT))  
00186             title = "t 'Hitran Spectrum' w lines" ;
00187         /* Default */
00188         else        
00189             title = "t 'signal' w lines" ;
00190         cpl_propertylist_delete(plist) ;
00191 
00192         /* Plot */
00193         cpl_plot_column(
00194                 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Emission';",
00195                 title, "", tab, CRIRES_COL_WAVELENGTH, CRIRES_COL_EMISSION) ;
00196         cpl_table_delete(tab) ;
00197     }
00198  
00199     /* CRIRES_PROTYPE_PHO_FLUX */
00200     tab = crires_load_table_check(fname, 1, CRIRES_PROTYPE_PHO_FLUX, 
00201             crires_util_plot_config.pmin,
00202             crires_util_plot_config.pmax,
00203             crires_util_plot_config.use_model) ;
00204     if (tab != NULL) {
00205         for (i=1 ; i<cpl_table_get_nrow(tab) ; i++) {
00206             wave=cpl_array_duplicate(
00207                     cpl_table_get_array(tab, CRIRES_COL_PHOTOFLUX, 0));
00208             wave_vec = cpl_vector_wrap(cpl_array_get_size(wave),
00209                     cpl_array_get_data_double(wave)) ;
00210             cpl_array_unwrap(wave) ;
00211             flux=cpl_array_duplicate(
00212                     cpl_table_get_array(tab, CRIRES_COL_PHOTOFLUX, i));
00213             flux_vec = cpl_vector_wrap(cpl_array_get_size(flux),
00214                     cpl_array_get_data_double(flux)) ;
00215             cpl_array_unwrap(flux) ;
00216             flux_biv=cpl_bivector_wrap_vectors(wave_vec, flux_vec) ;
00217 
00218             cpl_plot_bivector(
00219                 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Flux (Jy)';",
00220                 "t 'Photspheric flux' w lines", "", flux_biv) ;
00221             cpl_bivector_delete(flux_biv) ;
00222         }
00223         cpl_table_delete(tab) ;
00224     }
00225     /* CRIRES_PROTYPE_SPEC_PIX */
00226     tab = crires_load_table_check(fname, crires_util_plot_config.chip, 
00227             CRIRES_PROTYPE_SPEC_PIX, crires_util_plot_config.pmin, 
00228             crires_util_plot_config.pmax, crires_util_plot_config.use_model) ;
00229     if (fname_opt != NULL) {
00230         tab_opt = crires_load_table_check(fname_opt, 
00231                 crires_util_plot_config.chip, CRIRES_PROTYPE_SPEC_PIX, 
00232                 crires_util_plot_config.pmin, crires_util_plot_config.pmax, 
00233                 crires_util_plot_config.use_model);
00234     } else {
00235         tab_opt = NULL ;
00236     }
00237     if (tab != NULL) {
00238         crires_util_plot_spec_pix(tab, tab_opt,
00239                 crires_util_plot_config.adjust_level) ;
00240         cpl_table_delete(tab) ;
00241         if (tab_opt != NULL) cpl_table_delete(tab_opt) ;
00242     } 
00243 
00244     /* CRIRES_PROTYPE_SPEC_WL */
00245     tab = crires_load_table_check(fname, crires_util_plot_config.chip, 
00246             CRIRES_PROTYPE_SPEC_WL, crires_util_plot_config.pmin, 
00247             crires_util_plot_config.pmax, crires_util_plot_config.use_model) ;
00248     if (fname_opt != NULL) {
00249         tab_opt = crires_load_table_check(fname_opt, 
00250                 crires_util_plot_config.chip, CRIRES_PROTYPE_SPEC_WL, 
00251                 crires_util_plot_config.pmin, crires_util_plot_config.pmax, 
00252                 crires_util_plot_config.use_model);
00253     } else {
00254         tab_opt = NULL ;
00255     }
00256     if (tab != NULL) {
00257         crires_util_plot_spec_wl(tab, tab_opt, wave_col,
00258                 crires_util_plot_config.adjust_level) ;
00259         cpl_table_delete(tab) ;
00260         if (tab_opt != NULL) cpl_table_delete(tab_opt) ;
00261     }
00262 
00263    /* CRIRES_PROTYPE_XCORR */
00264     tab = crires_load_table_check(fname, crires_util_plot_config.chip, 
00265             CRIRES_PROTYPE_XCORR, 
00266             crires_util_plot_config.pmin,
00267             crires_util_plot_config.pmax,
00268             crires_util_plot_config.use_model) ;
00269     if (tab != NULL) {
00270         irplib_wlxcorr_plot_spc_table(tab, "", 1, 5) ;
00271     }
00272 
00273     /* CRIRES_PROTYPE_CONVERS */
00274     tab = crires_load_table_check(fname, crires_util_plot_config.chip, 
00275             CRIRES_PROTYPE_CONVERS, crires_util_plot_config.pmin, 
00276             crires_util_plot_config.pmax, crires_util_plot_config.use_model) ;
00277     if (fname_opt != NULL) {
00278         tab_opt = crires_load_table_check(fname_opt, 
00279                 crires_util_plot_config.chip, CRIRES_PROTYPE_CONVERS, 
00280                 crires_util_plot_config.pmin, crires_util_plot_config.pmax, 
00281                 crires_util_plot_config.use_model);
00282     } else {
00283         tab_opt = NULL ;
00284     }
00285     if (tab != NULL) {
00286         crires_util_plot_convers(tab, tab_opt, wave_col,
00287                 crires_util_plot_config.adjust_level) ;
00288         cpl_table_delete(tab) ;
00289         if (tab_opt != NULL) cpl_table_delete(tab_opt) ;
00290     }
00291 
00292     /* CRIRES_PROTYPE_SENSIT */
00293     tab = crires_load_table_check(fname, crires_util_plot_config.chip, 
00294             CRIRES_PROTYPE_SENSIT, crires_util_plot_config.pmin, 
00295             crires_util_plot_config.pmax, crires_util_plot_config.use_model) ;
00296     if (fname_opt != NULL) {
00297         tab_opt = crires_load_table_check(fname_opt, 
00298                 crires_util_plot_config.chip, CRIRES_PROTYPE_SENSIT, 
00299                 crires_util_plot_config.pmin, crires_util_plot_config.pmax, 
00300                 crires_util_plot_config.use_model);
00301     } else {
00302         tab_opt = NULL ;
00303     }
00304     if (tab != NULL) {
00305         crires_util_plot_sensit(tab, tab_opt, wave_col,
00306                 crires_util_plot_config.adjust_level) ;
00307         cpl_table_delete(tab) ;
00308         if (tab_opt != NULL) cpl_table_delete(tab_opt) ;
00309     }
00310 
00311     /* CRIRES_PROTYPE_FWHM */
00312     tab = crires_load_table_check(fname, crires_util_plot_config.chip, 
00313             CRIRES_PROTYPE_FWHM, crires_util_plot_config.pmin, 
00314             crires_util_plot_config.pmax, crires_util_plot_config.use_model) ;
00315     if (tab != NULL) {
00316         cpl_plot_column(
00317         "set grid;set xlabel 'Position (pixels)';set ylabel 'FWHM (pixels)';",
00318                 "t 'FWHM' w lines", "", tab,
00319                 CRIRES_COL_WL_DETPOSX, CRIRES_COL_FWHM) ;
00320         cpl_plot_column(
00321     "set grid;set xlabel 'Position (pixels)';set ylabel 'Y position (pixels)';",
00322                 "t 'Y position' w lines", "", tab,
00323                 CRIRES_COL_WL_DETPOSX, CRIRES_COL_DETPOSY) ;
00324         cpl_table_delete(tab) ;
00325     }
00326  
00327     /* Return */
00328     if (cpl_error_get_code()) 
00329         return -1 ;
00330     else 
00331         return 0 ;
00332 }
00333 
00334 static int crires_util_plot_diff(
00335         const cpl_table *       tab,
00336         const char      *       col1,
00337         const char      *       col2)
00338 {
00339     cpl_bivector    *   toplot ;
00340     cpl_vector      *   vec_x ;
00341     cpl_vector      *   vec_tmp ;
00342     cpl_vector      *   vec_y ;
00343     int                 nrows ;
00344     double              val ;
00345     int                 i ;
00346 
00347     /* Check entries */
00348     if (tab == NULL) return -1 ;
00349     if (!cpl_table_has_column(tab, col1)) return -1 ;
00350     if (!cpl_table_has_column(tab, col2)) return -1 ;
00351 
00352     /* Initialise */
00353     nrows = cpl_table_get_nrow(tab) ;
00354 
00355     /* Get access */
00356     vec_x = cpl_vector_wrap(nrows,
00357             cpl_table_get_data_double((cpl_table*)tab, col1)) ;
00358     vec_tmp = cpl_vector_wrap(nrows,
00359             cpl_table_get_data_double((cpl_table*)tab, col2)) ;
00360 
00361     /* Compute difference */
00362     vec_y = cpl_vector_duplicate(vec_x) ;
00363     cpl_vector_subtract(vec_y, vec_tmp) ;
00364     cpl_vector_unwrap(vec_tmp) ;
00365 
00366     /* Handle special case 0s */
00367     for (i=0 ; i<cpl_vector_get_size(vec_y) ; i++) {
00368         if (fabs(cpl_vector_get(vec_y, i)) > 100) {
00369             if (i==0) val = cpl_vector_get(vec_y, 10) ;
00370             else val = cpl_vector_get(vec_y, i-1) ;
00371             cpl_vector_set(vec_y, i, val) ; 
00372         }
00373     }
00374 
00375     toplot = cpl_bivector_wrap_vectors(vec_x, vec_y) ;
00376 
00377     /* Plot */
00378     cpl_plot_bivector(
00379         "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Wave diff (nm)';",
00380         "t 'Wavelength difference XC-model' w lines", "", toplot) ;
00381 
00382     /* Free and return */
00383     cpl_bivector_unwrap_vectors(toplot) ;
00384     cpl_vector_unwrap(vec_x) ;
00385     cpl_vector_delete(vec_y) ;
00386 
00387     return 0 ;
00388 }
00389 
00390 static int crires_util_plot_spec_pix(
00391         cpl_table   *       tab,
00392         cpl_table   *       tab_opt,
00393         int                 adjust_level)
00394 {
00395     /* Protect empty chips in windowing mode */
00396     if (cpl_table_get_nrow(tab) == 0) {
00397         return 0 ;
00398     }
00399 
00400     /* CRIRES_COL_EXTRACT_INT_OPT */
00401     crires_util_plot_spec_pix_one(tab, tab_opt, adjust_level, 
00402             CRIRES_COL_EXTRACT_INT_OPT,
00403 "set grid;set xlabel 'Position (pixels)';set ylabel 'Intensity OPT (ADU/sec)';",
00404             "t 'Extracted Spectrum OPT' w lines") ;
00405 
00406     /* CRIRES_COL_EXTRACT_INT_RECT */
00407     crires_util_plot_spec_pix_one(tab, tab_opt, adjust_level, 
00408             CRIRES_COL_EXTRACT_INT_RECT,
00409 "set grid;set xlabel 'Position (pixels)';set ylabel 'Intensity RECT (ADU/sec)';",
00410             "t 'Extracted Spectrum RECT' w lines") ;
00411 
00412     /* CRIRES_COL_EXTRACT_ERR_OPT */
00413     crires_util_plot_spec_pix_one(tab, tab_opt, adjust_level, 
00414             CRIRES_COL_EXTRACT_ERR_OPT,
00415 "set grid;set xlabel 'Position (pixels)';set ylabel 'Error OPT (ADU/sec)';",
00416             "t 'Error OPT' w lines") ;
00417 
00418     /* CRIRES_COL_EXTRACT_ERR_RECT */
00419     crires_util_plot_spec_pix_one(tab, tab_opt, adjust_level, 
00420             CRIRES_COL_EXTRACT_ERR_RECT,
00421 "set grid;set xlabel 'Position (pixels)';set ylabel 'Error RECT (ADU/sec)';",
00422             "t 'Error RECT' w lines") ;
00423 
00424     /* CRIRES_COL_EXTRACT_WN_OPT */
00425     crires_util_plot_spec_pix_one(tab, tab_opt, adjust_level, 
00426             CRIRES_COL_EXTRACT_WN_OPT,
00427 "set grid;set xlabel 'Position (pixels)';set ylabel 'Weight Norm OPT';", 
00428             "t 'Weight norm OPT' w lines") ;
00429 
00430     /* CRIRES_COL_EXTRACT_WN_RECT */
00431     crires_util_plot_spec_pix_one(tab, tab_opt, adjust_level, 
00432             CRIRES_COL_EXTRACT_WN_RECT,
00433 "set grid;set xlabel 'position (pixels)';set ylabel 'weight norm rect';", 
00434             "t 'weight norm rect' w lines") ;
00435 
00436     /* CRIRES_COL_EXTRACT_BG_NOISE */
00437     crires_util_plot_spec_pix_one(tab, tab_opt, adjust_level, 
00438             CRIRES_COL_EXTRACT_BG_NOISE,
00439 "set grid;set xlabel 'Position (pixels)';set ylabel 'Background noise';", 
00440             "t 'Background noise' w lines") ;
00441 
00442     return 0 ;
00443 }
00444  
00445 static int crires_util_plot_spec_pix_one(
00446         cpl_table   *       tab,
00447         cpl_table   *       tab_opt,
00448         int                 adjust_level,
00449         const char  *       y_col,
00450         const char  *       options,
00451         const char  *       title)
00452 {
00453     double                  mean1, mean2 ;
00454     int                     nrows ;
00455     cpl_vector          **  vectors ;
00456 
00457     /* Check inputs */
00458     if (tab == NULL) return -1 ;
00459     nrows = cpl_table_get_nrow(tab) ;
00460     if (tab_opt != NULL) {
00461         if (cpl_table_get_nrow(tab_opt) != nrows) {
00462             cpl_msg_error(__func__, 
00463                     "The two tables must have the same number of rows") ;
00464             return -1 ;
00465         }
00466     }
00467     
00468     vectors = cpl_malloc(3*sizeof(cpl_vector*)) ;
00469     vectors[0] = NULL ;
00470     vectors[1] = cpl_vector_wrap(nrows, cpl_table_get_data_double(tab, y_col)) ;
00471     if (tab_opt != NULL) {
00472         vectors[2] = cpl_vector_wrap(nrows,
00473                 cpl_table_get_data_double(tab_opt, y_col));
00474         if (adjust_level) {
00475             mean1 = cpl_vector_get_mean(vectors[1]) ;
00476             mean2 = cpl_vector_get_mean(vectors[2]) ;
00477             cpl_vector_multiply_scalar(vectors[2], fabs(mean1/mean2)) ;
00478         }
00479         cpl_plot_vectors(options, title, "", (const cpl_vector **)vectors, 3);
00480         cpl_vector_unwrap(vectors[2]) ;
00481     } else {
00482         cpl_plot_vector(options, title, "", vectors[1]) ;
00483     }
00484     cpl_vector_unwrap(vectors[1]) ;
00485     cpl_free(vectors) ;
00486     return 0 ;
00487 }
00488 
00489 static int crires_util_plot_spec_wl(
00490         cpl_table   *       tab,
00491         cpl_table   *       tab_opt,
00492         const char  *       wave_col,
00493         int                 adjust_level)
00494 {
00495     /* Protect empty chips in windowing mode */
00496     if (cpl_table_get_nrow(tab) == 0) {
00497         return 0 ;
00498     }
00499 
00500     /* CRIRES_COL_EXTRACT_INT_OPT */
00501     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00502             CRIRES_COL_EXTRACT_INT_OPT,
00503 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Intensity OPT (ADU/sec)';",
00504             "t 'Extracted Spectrum OPT' w lines") ;
00505 
00506     /* CRIRES_COL_EXTRACT_INT_RECT */
00507     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00508             CRIRES_COL_EXTRACT_INT_RECT,
00509 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Intensity RECT (ADU/sec)';",
00510             "t 'Extracted Spectrum RECT' w lines") ;
00511 
00512     /* CRIRES_COL_EXTRACT_ERR_OPT */
00513     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00514             CRIRES_COL_EXTRACT_ERR_OPT,
00515 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Error OPT (ADU/sec)';",
00516             "t 'Error OPT' w lines") ;
00517 
00518     /* CRIRES_COL_EXTRACT_ERR_RECT */
00519     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00520             CRIRES_COL_EXTRACT_ERR_RECT,
00521 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Error RECT (ADU/sec)';",
00522             "t 'Error RECT' w lines") ;
00523 
00524     /* CRIRES_COL_EXTRACT_WN_OPT */
00525     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00526             CRIRES_COL_EXTRACT_WN_OPT,
00527 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Weight Norm OPT';",
00528             "t 'Weight Norm OPT' w lines") ;
00529 
00530     /* CRIRES_COL_EXTRACT_WN_RECT */
00531     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00532             CRIRES_COL_EXTRACT_WN_RECT,
00533 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Weight Norm RECT';",
00534             "t 'Weight Norm RECT' w lines") ;
00535 
00536     /* CRIRES_COL_EXTRACT_BG_NOISE */
00537     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00538             CRIRES_COL_EXTRACT_BG_NOISE,
00539 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Background noise';",
00540             "t 'Background noise' w lines") ;
00541 
00542     /* Wavelengths difference */
00543     crires_util_plot_diff(tab, CRIRES_COL_WAVELENGTH,
00544             CRIRES_COL_WAVELENGTH_MODEL) ;
00545     
00546     return 0 ;
00547 }
00548  
00549 static int crires_util_plot_spec_wl_one(
00550         cpl_table   *       tab,
00551         cpl_table   *       tab_opt,
00552         const char  *       wave_col,
00553         int                 adjust_level,
00554         const char  *       y_col,
00555         const char  *       options,
00556         const char  *       title)
00557 {
00558     double                  mean1, mean2 ;
00559     int                     nrows ;
00560     cpl_vector          **  vectors ;
00561 
00562     /* Check inputs */
00563     if (tab == NULL) return -1 ;
00564     nrows = cpl_table_get_nrow(tab) ;
00565     if (tab_opt != NULL) {
00566         if (cpl_table_get_nrow(tab_opt) != nrows) {
00567             cpl_msg_error(__func__, 
00568                     "The two tables must have the same number of rows") ;
00569             return -1 ;
00570         }
00571     }
00572 
00573     if (tab_opt != NULL) {
00574         vectors = cpl_malloc(3*sizeof(cpl_vector*)) ;
00575         vectors[0]=cpl_vector_wrap(nrows,cpl_table_get_data_double(tab, 
00576                     wave_col));
00577         vectors[1] = cpl_vector_wrap(nrows, 
00578                 cpl_table_get_data_double(tab, y_col)) ;
00579         vectors[2] = cpl_vector_wrap(nrows,
00580                 cpl_table_get_data_double(tab_opt, y_col));
00581         if (adjust_level) {
00582             mean1 = cpl_vector_get_mean(vectors[1]) ;
00583             mean2 = cpl_vector_get_mean(vectors[2]) ;
00584             cpl_vector_multiply_scalar(vectors[2], fabs(mean1/mean2)) ;
00585         }
00586         cpl_plot_vectors(options, title, "", (const cpl_vector **)vectors, 3);
00587         cpl_vector_unwrap(vectors[0]) ;
00588         cpl_vector_unwrap(vectors[1]) ;
00589         cpl_vector_unwrap(vectors[2]) ;
00590         cpl_free(vectors) ;
00591     } else {
00592         cpl_plot_column(options, title, "", tab, wave_col, y_col) ;
00593     }
00594     return 0 ;
00595 }
00596 
00597 static int crires_util_plot_convers(
00598         cpl_table   *       tab,
00599         cpl_table   *       tab_opt,
00600         const char  *       wave_col,
00601         int                 adjust_level)
00602 {
00603     /* Protect empty chips in windowing mode */
00604     if (cpl_table_get_nrow(tab) == 0) {
00605         return 0 ;
00606     }
00607 
00608     /* Start with the same as for CRIRES_PROTYPE_SPEC_WL */
00609     if (crires_util_plot_spec_wl(tab, tab_opt, wave_col, adjust_level) == -1) 
00610         return -1 ;
00611     
00612     /* CRIRES_COL_CONVERSION_OPT  */
00613     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00614             CRIRES_COL_CONVERSION_OPT,
00615 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Conversion OPT (ADU/sec/Jy)';",
00616         "t 'Conversion factor OPT' w lines") ;
00617 
00618     /* CRIRES_COL_CONVERSION_RECT */
00619     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00620             CRIRES_COL_CONVERSION_RECT,
00621 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Conversion RECT (ADU/sec/Jy)';",
00622         "t 'Conversion factor RECT' w lines") ;
00623 
00624     /* CRIRES_COL_THROUGHPUT */
00625     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00626             CRIRES_COL_THROUGHPUT,
00627 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Throughput (e-/phot)';",
00628         "t 'Throughput' w lines") ;
00629     return 0 ;
00630 }
00631 
00632 static int crires_util_plot_sensit(
00633         cpl_table   *       tab,
00634         cpl_table   *       tab_opt,
00635         const char  *       wave_col,
00636         int                 adjust_level)
00637 {
00638     /* Protect empty chips in windowing mode */
00639     if (cpl_table_get_nrow(tab) == 0) {
00640         return 0 ;
00641     }
00642 
00643     /* Start with the same as for CRIRES_PROTYPE_CONVERS */
00644     if (crires_util_plot_convers(tab, tab_opt, wave_col, adjust_level) == -1) 
00645         return -1 ;
00646     
00647     /* CRIRES_COL_SENSITIVITY */
00648     crires_util_plot_spec_wl_one(tab, tab_opt, wave_col, adjust_level, 
00649             CRIRES_COL_SENSITIVITY,
00650 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Sensitivity (Jy/10sig/hour)';",
00651                 "t 'Sensitivity' w lines") ;
00652     return 0 ;
00653 }
00654