uves_physmod_body.c

00001 /*                                                                              *
00002  *   This file is part of the ESO UVES Pipeline                                 *
00003  *   Copyright (C) 2004,2005 European Southern Observatory                      *
00004  *                                                                              *
00005  *   This library is free software; you can redistribute it and/or modify       *
00006  *   it under the terms of the GNU General Public License as published by       *
00007  *   the Free Software Foundation; either version 2 of the License, or          *
00008  *   (at your option) any later version.                                        *
00009  *                                                                              *
00010  *   This program is distributed in the hope that it will be useful,            *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of             *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
00013  *   GNU General Public License for more details.                               *
00014  *                                                                              *
00015  *   You should have received a copy of the GNU General Public License          *
00016  *   along with this program; if not, write to the Free Software                *
00017  *   Foundation, 51 Franklin St, Fifth Floor, Boston, MA  02111-1307  USA       *
00018  *                                                                              */
00019  
00020 /*
00021  * $Author: amodigli $
00022  * $Date: 2007/06/13 15:13:48 $
00023  * $Revision: 1.30 $
00024  * $Name: uves-3_3_1 $
00025  * $Log: uves_physmod_body.c,v $
00026  * Revision 1.30  2007/06/13 15:13:48  amodigli
00027  * fixed mem leaks in case of fiber mode data
00028  *
00029  * Revision 1.29  2007/06/06 08:17:33  amodigli
00030  * replace tab with 4 spaces
00031  *
00032  * Revision 1.28  2007/05/22 14:34:32  jmlarsen
00033  * Removed unnecessary includes
00034  *
00035  * Revision 1.27  2007/05/14 09:38:38  amodigli
00036  * removed call to irplib_error_dump
00037  *
00038  * Revision 1.26  2007/04/25 08:38:40  amodigli
00039  * chnaged interface uves_physmod_plotmod
00040  *
00041  * Revision 1.25  2007/04/24 14:08:53  jmlarsen
00042  * Log more QC parameters (DFS03805)
00043  *
00044  * Revision 1.24  2007/04/24 12:50:29  jmlarsen
00045  * Replaced cpl_propertylist -> uves_propertylist which is much faster
00046  *
00047  * Revision 1.23  2007/04/14 05:55:19  amodigli
00048  * warning of flames,iter demoted to debug message
00049  *
00050  * Revision 1.22  2007/04/12 12:03:10  jmlarsen
00051  * Fixed doc. typo
00052  *
00053  * Revision 1.21  2007/03/05 10:18:55  jmlarsen
00054  * Do QC-log INS.SLITi.WID
00055  *
00056  * Revision 1.20  2007/02/26 10:16:22  jmlarsen
00057  * Do not QC log slit width
00058  *
00059  * Revision 1.19  2007/01/15 14:28:44  jmlarsen
00060  * Write default stability QC-parameters, only when master frame is provided
00061  *
00062  * Revision 1.18  2007/01/15 08:43:15  jmlarsen
00063  * Fixed missing plots
00064  *
00065  * Revision 1.17  2007/01/13 09:52:22  amodigli
00066  * fixed some problems on flames QC log
00067  *
00068  * Revision 1.16  2007/01/09 17:46:03  amodigli
00069  * fixed a problem in echelle mode
00070  *
00071  * Revision 1.15  2007/01/08 16:59:18  amodigli
00072  * changes to make flames-uves iterations to recover physical model
00073  *
00074  * Revision 1.14  2006/12/07 08:26:04  jmlarsen
00075  * Added uves_pfits_get_readspeed
00076  *
00077  * Revision 1.13  2006/12/01 12:29:21  jmlarsen
00078  * Factored out FLAMES plate-id code
00079  *
00080  * Revision 1.12  2006/11/22 08:42:20  jmlarsen
00081  * Set traceid = 1, not 0 for UVES
00082  *
00083  * Revision 1.10  2006/11/22 08:22:29  jmlarsen
00084  * Set message level according to preprocessor symbol
00085  *
00086  * Revision 1.9  2006/11/16 14:12:21  jmlarsen
00087  * Changed undefined trace number from 0 to -1, to support zero as an actual trace number
00088  *
00089  * Revision 1.8  2006/11/16 09:49:25  jmlarsen
00090  * Fixed doxygen bug
00091  *
00092  * Revision 1.7  2006/11/15 15:02:14  jmlarsen
00093  * Implemented const safe workarounds for CPL functions
00094  *
00095  * Revision 1.5  2006/11/15 14:04:08  jmlarsen
00096  * Removed non-const version of parameterlist_get_first/last/next which is already
00097  * in CPL, added const-safe wrapper, unwrapper and deallocator functions
00098  *
00099  * Revision 1.4  2006/11/06 15:19:41  jmlarsen
00100  * Removed unused include directives
00101  *
00102  * Revision 1.3  2006/10/26 14:03:48  jmlarsen
00103  * Fixed position of const modifier
00104  *
00105  * Revision 1.2  2006/10/25 11:43:32  amodigli
00106  * fixed problem running physmod in debug mode
00107  *
00108  * Revision 1.1  2006/10/24 14:09:56  jmlarsen
00109  * Factored out common UVES/FLAMES code
00110  *
00111  * Revision 1.30  2006/10/19 13:53:25  jmlarsen
00112  * Changed guess line table tag to LINE_GUESS_TAB
00113  *
00114  * Revision 1.29  2006/10/17 12:33:02  jmlarsen
00115  * Added semicolon at UVES_RECIPE_DEFINE invocation
00116  *
00117  * Revision 1.28  2006/10/11 12:22:36  amodigli
00118  * now the stability check consist only i the msrawxy and the table comparison, as in MIDAS
00119  *
00120  * Revision 1.27  2006/10/09 13:01:13  jmlarsen
00121  * Use macro to define recipe interface functions
00122  *
00123  * Revision 1.26  2006/09/19 14:31:38  jmlarsen
00124  * uves_insert_frame(): use bitmap to specify which image statistics keywords must be computed
00125  *
00126  * Revision 1.25  2006/09/19 06:55:39  jmlarsen
00127  * Changed interface of uves_frameset to optionally write image statistics kewwords
00128  *
00129  * Revision 1.24  2006/08/24 11:36:37  jmlarsen
00130  * Write recipe start/stop time to header
00131  *
00132  * Revision 1.23  2006/08/18 13:35:42  jmlarsen
00133  * Fixed/changed QC parameter formats
00134  *
00135  * Revision 1.22  2006/08/17 13:56:53  jmlarsen
00136  * Reduced max line length
00137  *
00138  * Revision 1.21  2006/08/11 14:56:05  amodigli
00139  * removed Doxygen warnings
00140  *
00141  * Revision 1.20  2006/08/07 11:35:35  jmlarsen
00142  * Disabled parameter environment variable mode
00143  *
00144  * Revision 1.19  2006/08/01 14:42:34  amodigli
00145  * fixed bugs getting raw header from master formatcheck
00146  *
00147  * Revision 1.18  2006/07/31 06:29:26  amodigli
00148  * added QC on stability test
00149  *
00150  * Revision 1.17  2006/07/28 14:51:26  amodigli
00151  * fixed some bugs on improper table selection
00152  *
00153  * Revision 1.16  2006/07/14 12:19:28  jmlarsen
00154  * Support multiple QC tests per product
00155  *
00156  * Revision 1.15  2006/07/03 12:46:34  amodigli
00157  * updated description
00158  *
00159  * Revision 1.14  2006/06/28 13:28:29  amodigli
00160  * improved output
00161  *
00162  * Revision 1.13  2006/06/20 09:06:39  amodigli
00163  * correct input tag info in man page
00164  *
00165  * Revision 1.12  2006/06/16 08:25:45  jmlarsen
00166  * Manually propagate ESO.DET. keywords from 1st/2nd input header
00167  *
00168  * Revision 1.11  2006/06/13 11:57:02  jmlarsen
00169  * Check that calibration frames are from the same chip ID
00170  *
00171  * Revision 1.10  2006/06/07 13:06:28  jmlarsen
00172  * Changed doxygen tag addtogroup -> defgroup
00173  *
00174  * Revision 1.9  2006/06/07 09:01:28  amodigli
00175  * added some doc
00176  *
00177  * Revision 1.8  2006/05/08 15:42:16  amodigli
00178  * allow to specify order column label
00179  *
00180  * Revision 1.7  2006/04/20 10:47:39  amodigli
00181  * added qclog
00182  *
00183  * Revision 1.6  2006/04/07 07:11:12  jmlarsen
00184  * Minor doc. fix
00185  *
00186  * Revision 1.5  2006/04/06 09:48:15  amodigli
00187  * changed uves_frameset_insert interface to have QC log
00188  *
00189  * Revision 1.4  2006/04/06 08:42:19  jmlarsen
00190  * Changed indentation
00191  *
00192  * Revision 1.3  2006/03/03 13:54:11  jmlarsen
00193  * Changed syntax of check macro
00194  *
00195  * Revision 1.2  2006/02/28 09:15:22  jmlarsen
00196  * Minor update
00197  *
00198  * Revision 1.1  2006/02/03 07:46:30  jmlarsen
00199  * Moved recipe implementations to ./uves directory
00200  *
00201  * Revision 1.66  2006/01/25 10:09:18  jmlarsen
00202  * Added doxygen end marker
00203  *
00204  * Revision 1.65  2006/01/20 10:36:25  amodigli
00205  *
00206  * Fixed warings from doxigen
00207  *
00208  * Revision 1.64  2006/01/19 10:03:06  amodigli
00209  * Fixed leaks
00210  *
00211  * Revision 1.62  2006/01/16 13:52:58  jmlarsen
00212  * Removed memory leak
00213  *
00214  * Revision 1.61  2006/01/16 08:01:57  amodigli
00215  *
00216  * Added stability check
00217  *
00218  * Revision 1.60  2006/01/13 13:43:15  jmlarsen
00219  * Removed memory leak
00220  *
00221  * Revision 1.59  2006/01/13 09:54:42  amodigli
00222  * Fixed some bugs: improved agreement with MIDAS version
00223  *
00224  * Revision 1.58  2006/01/09 15:23:06  jmlarsen
00225  * Removed some warnings
00226  *
00227  * Revision 1.57  2006/01/09 14:05:42  amodigli
00228  * Fixed doxigen warnings
00229  *
00230  * Revision 1.56  2006/01/03 16:57:13  amodigli
00231  * Fixed bug
00232  *
00233  * Revision 1.55  2006/01/03 14:47:53  amodigli
00234  *
00235  * Added uves_physmod_chop_otab.h .c to match MIDAS
00236  *
00237  * Revision 1.54  2005/12/19 16:17:55  jmlarsen
00238  * Replaced bool -> int
00239  *
00240  */
00241 #ifdef HAVE_CONFIG_H
00242 #  include <config.h>
00243 #endif
00244 
00245 /*----------------------------------------------------------------------------*/
00249 /*----------------------------------------------------------------------------*/
00250 
00251 /*-----------------------------------------------------------------------------
00252                                 Includes
00253  -----------------------------------------------------------------------------*/
00254 
00255 /* Self */
00256 #include <uves_physmod_body.h>
00257 
00258 /* called related functions */
00259 #include <uves_physmod_plotmod.h>
00260 #include <uves_physmod_create_table.h>
00261 
00262 #include <uves_physmod_qc1pmtbl.h>
00263 #include <uves_physmod_calmap.h>
00264 #include <uves_physmod_msrawxy.h>
00265 #include <uves_physmod_chop_otab.h>
00266 #include <uves_physmod_stability_check.h>
00267 
00268 /* Utility functions */
00269 #include <uves_utils.h>
00270 #include <uves_utils_polynomial.h>
00271 #include <uves_utils_wrappers.h>
00272 #include <uves_pfits.h>
00273 #include <uves_dfs.h>
00274 #include <uves_parameters.h>
00275 #include <uves_qclog.h>
00276 #include <uves_recipe.h>
00277 #include <uves_error.h>
00278 #include <uves_msg.h>
00279 
00280 /* Library */
00281 #include <irplib_access.h>
00282 #include <cpl.h>
00283 #include <math.h>
00284 #include <stdbool.h>
00285 
00286 /*-----------------------------------------------------------------------------
00287                                 Defines
00288  -----------------------------------------------------------------------------*/
00289 /*-----------------------------------------------------------------------------
00290                             Functions prototypes
00291  ----------------------------------------------------------------------------*/
00292 
00293 static int uves_physmod_qclog(cpl_table* line_table,
00294                               cpl_table* order_table,
00295                               cpl_table* qclog,
00296                               const uves_propertylist *raw_header,
00297                               enum uves_chip chip,
00298                               bool flames,
00299                               const int iter,
00300                               const int plate_no);
00301 
00302 static int uves_physmod_qclog_sc(const double med_dx, 
00303                   const double med_dy,
00304                   const double avg_dx,
00305                   const double avg_dy,
00306                   const uves_propertylist *raw_header,
00307                   const uves_propertylist *ref_header,
00308                   enum uves_chip chip,
00309                   cpl_table* qclog);
00310 
00311 /*-----------------------------------------------------------------------------
00312                             Recipe standard code
00313  -----------------------------------------------------------------------------*/
00314 
00315 const char * const uves_physmod_desc_short = "Implements the UVES physical model";
00316 const char * const uves_physmod_desc =
00317 "This recipe implements the UVES physical model\n"
00318 "Input files are BLUE or RED arm formatcheck frames identified by the tag\n"
00319 "ARC_LAMP_FORM_xxxx, xxxx=BLUE or RED and a ThAr line reference table\n"
00320 "identified by the tag LINE_REFER_TABLE\n"
00321 "The recipe extracts from the input files FITS header data indicating the\n"
00322 "instrument setting and ambiental atmospheric conditions, then using the\n"
00323 "model predicts X,Y position of the lines listed in the LINE_REFER_TABLE\n"
00324 "table which are imaging on the detector and stores this information in an\n"
00325 "guess order and a guess line table.\n"
00326 "Output are a guess order table and a guess line table per chip.\n"
00327 "If the user provides in input also master format checks having tag\n"
00328 "MASTER_FORM_xxxx, xxxx=BLUE or REDL and REDU the recipe performs also a\n"
00329 "stability check\n";
00330 
00332 /*-----------------------------------------------------------------------------
00333                             Functions code
00334  -----------------------------------------------------------------------------*/
00335 
00336 /*----------------------------------------------------------------------------*/
00342 /*----------------------------------------------------------------------------*/
00343 int
00344 uves_physmod_define_parameters_body(cpl_parameterlist *parameters, 
00345                                     const char *recipe_id)
00346 {
00347     const char *subcontext = NULL;
00348 
00349     /*****************
00350      *    General    *
00351      *****************/
00352 
00353     if (uves_define_global_parameters(parameters) != CPL_ERROR_NONE)
00354     {
00355         return -1;
00356     }
00357     
00358     uves_par_new_range("mbox_x",
00359                  CPL_TYPE_INT,
00360                  "Match box X size",
00361                  40,1,100);
00362 
00363     uves_par_new_range("mbox_y",
00364                  CPL_TYPE_INT,
00365                  "Match box Y size",
00366                  40,1,100);
00367 
00368     uves_par_new_value("trans_x",
00369                  CPL_TYPE_DOUBLE,
00370                  "Detector translation along X",
00371                  0.);
00372 
00373     uves_par_new_value("trans_y",
00374                  CPL_TYPE_DOUBLE,
00375                  "Detector translation along Y",
00376                  0.);
00377 
00378     uves_par_new_value("ech_angle_off",
00379                  CPL_TYPE_DOUBLE,
00380                  "Offset on echelle angle",
00381                  0.);
00382 
00383     uves_par_new_value("cd_angle_off",
00384                  CPL_TYPE_DOUBLE,
00385                  "Offset on cross disperser angle",
00386                  0.);
00387 
00388     uves_par_new_value("ccd_rot_angle_off",
00389                  CPL_TYPE_DOUBLE,
00390                  "Offset on CCD rotation angle",
00391                  0.);
00392 
00393     uves_par_new_value("compute_regression_sw",
00394                  CPL_TYPE_BOOL,
00395                  "Compute regression?",
00396                  true);
00397 
00398     uves_par_new_value("x_axis_scale",
00399                  CPL_TYPE_DOUBLE,
00400                  "Scale X axis",
00401                  0.);
00402 
00403     uves_par_new_value("y_axis_scale",
00404                  CPL_TYPE_DOUBLE,
00405                  "Scale Y axis",
00406                  0.);
00407 
00408     uves_par_new_value("def_pol1",
00409                  CPL_TYPE_INT,
00410                  "Polynomial X deg",
00411                  4);
00412 
00413     uves_par_new_value("def_pol2",
00414                  CPL_TYPE_INT,
00415                  "Polynomial Y deg",
00416                  5);
00417 
00418     uves_par_new_value("kappa",
00419                  CPL_TYPE_DOUBLE,
00420                  "Kappa value in kappa sigma clipping "
00421                  "on RESIDUAL between YFIT and Y columns",
00422                  4.5);
00423 
00424     uves_par_new_value("tol",
00425                  CPL_TYPE_DOUBLE,
00426                  "Tolerance in kappa sigma clipping "
00427                  "on RESIDUAL between YFIT and Y columns",
00428                  2.0);
00429 
00430     return (int) cpl_error_get_code();
00431 }
00432 /*----------------------------------------------------------------------------*/
00460 /*----------------------------------------------------------------------------*/
00461 
00462 static cpl_table *
00463 uves_physmod_process_chip(const cpl_image *raw_image, 
00464                           const uves_propertylist *raw_header, 
00465                           const char *raw_filename, 
00466                           enum uves_chip chip,
00467               const char *recipe_id,
00468                           const int DEBUG, 
00469                           const cpl_parameterlist* parameters, 
00470                           cpl_table* line_refer,
00471                           const double physmod_shift_x,
00472                           const double physmod_shift_y,
00473                           cpl_table** tmp_mod_tbl,
00474                           cpl_table** lin_tbl,
00475                           cpl_table** ord_tbl,
00476                           cpl_table**  mline_tbl,
00477                           int* abs_ord_min,
00478                           int* abs_ord_max,
00479                           polynomial** absolute_order_poly2d,
00480                           const int stability_sw)
00481 {
00482 
00483     cpl_table *tmp_fsr_tbl = NULL;
00484     cpl_table *tmp_m_tbl = NULL;
00485     cpl_table *tmp_p_tbl = NULL;
00486     cpl_table *tmp_w_tbl = NULL;
00487     cpl_table *tmp_s_tbl = NULL;
00488     cpl_table *tmp_rline_tbl = NULL;
00489     cpl_table *tmp_npline_tbl = NULL;
00490 
00491 
00492     cpl_table * result=NULL;
00493 
00494     /* Start processing this chip */
00495     if(stability_sw != 1) {
00496       check( uves_physmod_create_table(raw_header, chip,
00497                          recipe_id,
00498                                        parameters, 
00499                                        line_refer, 
00500                                        physmod_shift_x,
00501                                        physmod_shift_y,
00502                                        tmp_mod_tbl,&tmp_fsr_tbl), 
00503                     "Could not run UVES physical model on the raw image %s", 
00504                                        raw_filename);
00505     }
00506  
00507     uves_free_table(&tmp_rline_tbl);
00508     check( uves_physmod_msrawxy(raw_image, 
00509                 raw_header, 
00510                 recipe_id,
00511                 parameters, 
00512                 *tmp_mod_tbl,
00513                 lin_tbl,
00514                 &tmp_m_tbl,
00515                 &tmp_p_tbl,
00516                 &tmp_rline_tbl,
00517                 mline_tbl,
00518                 &tmp_npline_tbl), 
00519        "Could not run uves_msrawxy on raw image %s", 
00520        raw_filename);
00521 
00522 
00523     check(uves_physmod_plotmod(tmp_rline_tbl,raw_header,recipe_id,
00524                                parameters,chip),
00525           "Could not run uves_physmod_plotmod");
00526 
00527     if(stability_sw != 1) {
00528       uves_free_table(&tmp_w_tbl);
00529       uves_free_table(&tmp_s_tbl);
00530       check(uves_physmod_calmap(raw_header,
00531                     chip,
00532                     recipe_id,
00533                     parameters, 
00534                     tmp_npline_tbl,
00535                     ord_tbl,
00536                     lin_tbl,
00537                     &tmp_w_tbl,
00538                     &tmp_s_tbl,
00539                     abs_ord_min,
00540                     abs_ord_max,
00541                     absolute_order_poly2d), 
00542         "Could not run uves_calmap on raw image %s", raw_filename);
00543 
00544       check(uves_physmod_qc1pmtbl(&tmp_rline_tbl,lin_tbl), 
00545        "Could not run uves_qc1pmtbl on raw image %s", raw_filename);
00546 
00547 
00548       check(uves_physmod_chop_otab(raw_header,chip,ord_tbl,"ORDER",
00549                    abs_ord_min,abs_ord_max),
00550             "Could not run uves_physmod_chop_otab on raw image %s",
00551             raw_filename);
00552     }
00553 
00554     if (DEBUG) {
00555     const char *product_filename = NULL;
00556         /* Temporary products (to DEBUG) */
00557 
00558     /* Basic info about orders */    
00559     product_filename = "arclampform";
00560         check( uves_save_image_local("Physical model table", 
00561                product_filename, raw_image, chip, -1, -1, raw_header),
00562               "Error saving arc lamp form image");
00563 
00564     product_filename = "pline";
00565         check( uves_save_table_local("Physical model table", 
00566                product_filename, *tmp_mod_tbl, chip, -1, -1, NULL, NULL),
00567               "Error saving physical model table");
00568 
00569       
00570     if(stability_sw != 1) {
00571       product_filename = "free_spectral_range";
00572       check( uves_save_table_local("FSR table",
00573                        product_filename, tmp_fsr_tbl,
00574                                        chip, -1, -1, NULL, NULL),
00575          "Error saving free spectral range table");
00576 
00577     }
00578         
00579     product_filename = "midduml";
00580         check( uves_save_table_local("midduml table", 
00581                product_filename, *lin_tbl, chip, -1, -1, NULL, NULL),
00582               "Error saving midduml table");
00583 
00584 
00585  
00586     product_filename = "middumm";
00587         check( uves_save_table_local("middumm table", 
00588                product_filename, tmp_m_tbl, chip, -1, -1, NULL, NULL),
00589               "Error saving middumm table");
00590 
00591 
00592     
00593     product_filename = "middumrline";
00594         check( uves_save_table_local("middumrline table", 
00595                product_filename, tmp_rline_tbl, chip, -1, -1, NULL, NULL),
00596               "Error saving middumrline table");
00597 
00598 
00599     product_filename = "middummline";
00600         check( uves_save_table_local("middummline table", 
00601                product_filename, *mline_tbl, chip, -1, -1, NULL, NULL),
00602               "Error saving middummline table");
00603 
00604 
00605     product_filename = "middump";
00606         check( uves_save_table_local("middump table", 
00607                product_filename, tmp_p_tbl, chip, -1, -1, NULL, NULL),
00608               "Error saving middump table");
00609 
00610        
00611     product_filename = "middumnpline";
00612         check( uves_save_table_local("middumnpline table", 
00613                product_filename, tmp_npline_tbl, chip, -1, -1, NULL, NULL),
00614               "Error saving middumnpline table");
00615       
00616        
00617     /* Calmap */
00618     if(stability_sw != 1) {
00619       product_filename = "middumw";
00620       check( uves_save_table_local("middumw table", 
00621                        product_filename, tmp_w_tbl, 
00622                                        chip, -1, -1, NULL, NULL),
00623          "Error saving middumw table");
00624      
00625       product_filename = "middums";
00626       check( uves_save_table_local("middums table", 
00627                        product_filename, tmp_s_tbl, 
00628                                        chip, -1, -1, NULL, NULL),
00629          "Error saving middums table");
00630      
00631        
00632       product_filename = "order";
00633       check( uves_save_table_local("order table", 
00634                        product_filename, *ord_tbl, 
00635                                        chip, -1, -1, NULL, NULL),
00636          "Error saving order table");
00637       uves_msg("Order table saved to file %s", 
00638            product_filename);
00639 
00640     }
00641     product_filename = "line";
00642         check( uves_save_table_local("line table", 
00643                product_filename, *lin_tbl, chip, -1, -1, NULL, NULL),
00644               "Error saving uves_line table");
00645         uves_msg("Line table saved to file %s", 
00646                                 product_filename);
00647     
00648      
00649     
00650     }
00651     
00652   cleanup:
00653     uves_free_table(&tmp_fsr_tbl);
00654     uves_free_table(&tmp_m_tbl);
00655     uves_free_table(&tmp_p_tbl);
00656     uves_free_table(&tmp_w_tbl);
00657     uves_free_table(&tmp_s_tbl);
00658     uves_free_table(&tmp_rline_tbl);
00659      uves_free_table(&tmp_npline_tbl);
00660      
00661     uves_msg_debug("end %s",__func__);
00662     return result;
00663 }
00664 
00665 /*----------------------------------------------------------------------------*/
00674 /*----------------------------------------------------------------------------*/
00675 void
00676 uves_physmod_exe_body(cpl_frameset *frames,
00677               bool flames,
00678               const char *recipe_id,
00679               const cpl_parameterlist *parameters,
00680               const char *starttime)
00681 {
00682     /* Input image */
00683     cpl_image        *raw_image[2]      = {NULL, NULL};
00684     uves_propertylist *raw_header[2]     = {NULL, NULL};
00685     uves_propertylist *rotated_header[2] = {NULL, NULL};
00686     uves_propertylist *master_formatcheck_header[2] = {NULL, NULL};
00687 
00688     /* Physical Model guess table products */
00689     cpl_table        *line_table     = NULL;
00690     cpl_table        *order_table     = NULL;
00691     cpl_table        *mline_table     = NULL;
00692     cpl_table        *m_mline_table     = NULL;
00693     cpl_table        *model_table = NULL;
00694 
00695     cpl_table        *r_mline_table     = NULL;
00696     cpl_table        *mst_line_table     = NULL;
00697     cpl_table        *mst_mline_table     = NULL;
00698     cpl_table        *mst_order_table     = NULL;
00699 
00700 
00701     uves_propertylist *product_header = NULL;
00702     uves_propertylist *table_header = NULL;
00703     cpl_table        *line_refer            = NULL;
00704     polynomial       *absolute_order_poly2d=NULL;      
00705     polynomial       *mst_absolute_order_poly2d=NULL;      
00706 
00707 
00708     /* Local variables */
00709     int      DEBUG=0;
00710     int abs_ord_min=0;
00711     int abs_ord_max=0;
00712     int mst_abs_ord_min=0;
00713     int mst_abs_ord_max=0;
00714     double avg_dx=0;
00715     double avg_dy=0;
00716 
00717     /* QC tables for TEST1, TEST2 and a NULL pointer */
00718     cpl_table* qclog[3] = {NULL, NULL, NULL};
00719 
00720     const char *raw_filename = "";
00721     char *product_filename = NULL;
00722     
00723     bool blue = false;
00724     enum uves_chip chip;    
00725     const char *line_refer_filename = "";
00726     const char *master_formatcheck_filename = "";
00727     cpl_image        *master_formatcheck    = NULL;
00728     int nordpred=0;
00729     int plate_no=0;
00730     int iter=1;
00731     int iter_max=1;
00732     double physmod_shift_x=0;
00733     double physmod_shift_y=0;
00734     const double max_shift_x=0.4;
00735     const double max_shift_y=0.2;
00736     double med_dx=2*max_shift_x;
00737     double med_dy=2*max_shift_y;
00738 
00739     if(flames) {
00740       iter_max=5;
00741     }
00742     check( uves_get_parameter(parameters, NULL, "uves", "debug",  
00743                   CPL_TYPE_BOOL, &DEBUG),
00744        "Could not read parameter");
00745     
00746     /* Load raw image and header, and identify input frame as red or blue */
00747     check( uves_load_formatcheck(frames, flames, &raw_filename, raw_image, 
00748                  raw_header, rotated_header, &blue), 
00749        "Error loading raw frame");
00750 
00751     /* Load reference line table */
00752     check( uves_load_linerefertable(frames, &line_refer_filename, 
00753            &line_refer, NULL), "Could not load line reference table");
00754     uves_msg("Using line reference table in '%s'", line_refer_filename);
00755 
00756 
00757     /* Loop over one or two chips */
00758     for (chip = uves_chip_get_first(blue); 
00759          chip != UVES_CHIP_INVALID; 
00760          chip = uves_chip_get_next(chip))
00761     {
00762         const char *chip_name = "";
00763         int raw_index = uves_chip_get_index(chip);
00764         
00765         uves_msg("Processing %s chip in '%s'", 
00766              uves_chip_tostring_upper(chip), raw_filename);
00767 
00768         check_nomsg( chip_name = uves_pfits_get_chipid(raw_header[raw_index], chip));
00769         /* In case of FLAMES-UVES starts a loop to make converge the
00770                physical model 
00771              */
00772 
00773 
00774         /* Init QC-Log: before starting the stability check as in 
00775                FLAMES-UVES one may have several iterations to be dumped 
00776                on the same table
00777         */
00778             uves_qclog_delete(&qclog[0]);
00779             qclog[0] = uves_qclog_init(raw_header[raw_index], chip);
00780         
00781 
00782         /* Initialize stability check QC table, only if needed */
00783         if (irplib_frameset_find(frames, UVES_MASTER_ARC_FORM(chip)) != NULL)
00784         {
00785             uves_qclog_delete(&qclog[1]);
00786             qclog[1] = uves_qclog_init(raw_header[raw_index], chip);
00787         }
00788             uves_msg("iter_max=%d",iter_max);
00789         for(iter=1; (iter <= iter_max) && 
00790                         (fabs(med_dx) > max_shift_x || 
00791                          fabs(med_dy) > max_shift_y ); iter++ ) {
00792 
00793 
00794           uves_msg("iter=%d",iter);
00795           uves_free_table(&model_table);
00796           uves_free_table(&line_table);
00797           uves_free_table(&order_table);
00798           uves_free_table(&mline_table);
00799           uves_polynomial_delete(&absolute_order_poly2d);
00800           check( uves_physmod_process_chip(raw_image[raw_index], 
00801                            raw_header[raw_index],
00802                          raw_filename, 
00803                          chip,
00804                          recipe_id,
00805                          DEBUG,
00806                          parameters,
00807                          line_refer,
00808                                              physmod_shift_x,
00809                                              physmod_shift_y,
00810                                              &model_table,
00811                          &line_table,
00812                          &order_table,
00813                                              &mline_table,
00814                                              &abs_ord_min,
00815                                              &abs_ord_max,
00816                                              &absolute_order_poly2d,0),
00817            "Error processing chip");
00818 
00819             nordpred=abs_ord_max-abs_ord_min+1;
00820         uves_msg("No of predicted orders %d",nordpred);
00821 
00822         if(flames) {
00823                check( plate_no = uves_flames_pfits_get_plateid(raw_header[raw_index]),
00824                    "Error reading plate id");
00825         }
00826 
00827                 /* add QC log */
00828                 ck0(uves_physmod_qclog(line_table,order_table,qclog[0],
00829                                        raw_header[raw_index], chip,
00830                        flames,iter,plate_no),"qc-log dump");
00831 
00832 
00833            
00834         /* Load master format check if provided, or set pointer to NULL. */
00835         uves_free_image(&master_formatcheck);
00836 
00837         if (irplib_frameset_find(frames, UVES_MASTER_ARC_FORM(chip)) != NULL)
00838         {
00839 
00840             uves_msg("Stability check");
00841         uves_free_propertylist(&master_formatcheck_header[raw_index]);
00842             check( uves_load_master_formatcheck(frames, 
00843                                       chip_name,
00844                       &master_formatcheck_filename, 
00845                       &master_formatcheck,
00846                       &master_formatcheck_header[raw_index],                  
00847                      chip),
00848                "Could not load master formatcheck frm");
00849             
00850             uves_msg("Using master format check frm '%s'", master_formatcheck_filename);
00851 
00852             
00853             
00854             
00855             uves_free_table(&mst_line_table);
00856             uves_free_table(&mst_order_table);
00857             uves_free_table(&mst_mline_table);
00858             uves_polynomial_delete(&mst_absolute_order_poly2d);
00859             check(uves_physmod_process_chip(master_formatcheck, 
00860                             master_formatcheck_header[raw_index], 
00861                             master_formatcheck_filename, 
00862                             chip,
00863                             recipe_id,
00864                             DEBUG,
00865                             parameters,
00866                             line_refer,
00867                             physmod_shift_x,
00868                             physmod_shift_y,
00869                             &model_table,
00870                             &mst_line_table,
00871                             &mst_order_table,
00872                             &mst_mline_table,
00873                             &mst_abs_ord_min,
00874                             &mst_abs_ord_max,
00875                             &mst_absolute_order_poly2d,
00876                                                     1),
00877                "Error processing chip");
00878             
00879             check_nomsg( uves_physmod_stability_check(
00880                      mline_table,mst_mline_table,
00881                      &med_dx,&med_dy,&avg_dx,&avg_dy) );
00882 
00883 
00884             
00885             uves_physmod_qclog_sc(med_dx,med_dy,avg_dx,avg_dy, 
00886                       raw_header[raw_index],
00887                                           master_formatcheck_header[raw_index],
00888                                           chip, 
00889                                           qclog[1]);
00890                     uves_msg("iter=%d med_dx=%g med_dy=%g max_shift_x=%g max_shift_y=%g",iter,fabs(med_dx),fabs(med_dy),max_shift_x,max_shift_y);
00891 
00892               physmod_shift_x+=med_dx;
00893               physmod_shift_y+=med_dy;
00894 
00895                     
00896            
00897 
00898         } /* end check if a formatcheck is present */
00899         else
00900         {
00901             uves_msg_low("No master format check frm in SOF. Stability check not done");
00902         }
00903            
00904         } /* end for loop to recover spectral format */
00905 
00906 
00907         
00908         /* Finished. Now save the products */
00909 
00910         cknull_nomsg(line_table);
00911         cknull_nomsg(order_table);
00912         cknull_nomsg(qclog[0]);
00913         
00914         uves_msg("Saving products...");
00915         {
00916         
00917         /* QC parameters should go here.
00918            Other mandatory keywords (FITS + dfs) are
00919            automatically added. */
00920 
00921         uves_free_propertylist(&product_header);
00922         uves_free_propertylist(&table_header);
00923         product_header = uves_propertylist_new();
00924         table_header = uves_propertylist_new();
00925         check( uves_pfits_set_traceid     ( table_header, 0),
00926                "Error writing trace ID to product header");
00927         check( uves_pfits_set_windownumber( table_header, 2),
00928                "Error window number to product header");
00929 
00930         check( uves_pfits_set_firstabsorder(table_header, abs_ord_min),
00931                "Error window number to product header");
00932 
00933         check( uves_pfits_set_lastabsorder(table_header, abs_ord_max),
00934                "Error window number to product header");
00935 
00936         check_nomsg(uves_pfits_set_ordpred(product_header,nordpred));
00937 
00938                 uves_check_rec_status(0);
00939 
00940         if (flames) {
00941             
00942             check_nomsg(uves_flames_pfits_set_newplateid(product_header, plate_no));
00943         }
00944 
00945 
00946         
00947 
00948 
00949         cpl_free(product_filename);
00950         
00951         check(( product_filename = uves_guess_line_table_filename(chip),
00952             uves_frameset_insert(frames,
00953                          line_table,
00954                          CPL_FRAME_GROUP_PRODUCT,
00955                          CPL_FRAME_TYPE_TABLE,
00956                          CPL_FRAME_LEVEL_INTERMEDIATE,
00957                          product_filename,
00958                          UVES_GUESS_LINE_TABLE(flames, chip),
00959                          raw_header[raw_index], 
00960                          product_header,
00961                          table_header,
00962                          parameters,
00963                          recipe_id,
00964                          PACKAGE "/" PACKAGE_VERSION,qclog,
00965                          starttime, true, 
00966                          0)),
00967                 "Could not add line guess table %s to frameset", 
00968                product_filename);
00969                uves_qclog_delete(&qclog[0]);
00970                 
00971         /* Save in next extension */
00972         
00973             check( uves_save_polynomial(absolute_order_poly2d, 
00974                                product_filename, table_header), 
00975         "Could not write polynomial to file '%s'", product_filename);
00976                
00977         
00978         check( uves_save_polynomial(absolute_order_poly2d, 
00979                          product_filename, table_header), 
00980         "Could not write polynomial to file '%s'", product_filename);
00981             
00982 
00983 
00984         uves_msg("Line table %s added to frameset", product_filename);
00985         
00986         /* Save guess order table, re-use product header */
00987 
00988         cpl_free(product_filename);        
00989         check(( product_filename = uves_guess_order_table_filename(chip),
00990             uves_frameset_insert(frames,
00991                          order_table,
00992                          CPL_FRAME_GROUP_PRODUCT,
00993                          CPL_FRAME_TYPE_TABLE,
00994                          CPL_FRAME_LEVEL_INTERMEDIATE,
00995                          product_filename,
00996                          UVES_GUESS_ORDER_TABLE(flames, chip),
00997                          raw_header[raw_index],
00998                          product_header,
00999                          NULL,
01000                          parameters,
01001                          recipe_id,
01002                          PACKAGE "/" PACKAGE_VERSION,NULL,
01003                          starttime, false, 0)), 
01004               "Could not add order guess table %s to frameset", 
01005               product_filename);
01006         
01007         uves_msg("Order guess table %s added to frameset", 
01008                  product_filename);
01009         }
01010 
01011     }/* For each chip */
01012 
01013   cleanup:
01014     uves_qclog_delete(&qclog[0]);
01015     uves_qclog_delete(&qclog[1]);
01016     uves_free_image (&raw_image[0]);
01017     uves_free_image (&raw_image[1]);
01018     uves_free_image (&master_formatcheck);
01019     uves_free_propertylist(&raw_header[0]);
01020     uves_free_propertylist(&raw_header[1]);
01021     uves_free_propertylist(&rotated_header[0]);
01022     uves_free_propertylist(&rotated_header[1]);
01023     uves_free_propertylist(&master_formatcheck_header[0]);
01024     uves_free_propertylist(&master_formatcheck_header[1]);
01025 
01026     uves_free_table(&model_table);
01027     uves_free_table(&line_table);
01028     uves_free_table(&mst_line_table);
01029     uves_free_table(&order_table);
01030     uves_free_table(&mst_order_table);
01031     uves_free_table(&line_refer);
01032 
01033     uves_free_table(&mline_table);
01034     uves_free_table(&m_mline_table);
01035     uves_free_table(&r_mline_table);
01036     uves_free_table(&mst_mline_table);
01037 
01038     uves_free_propertylist(&product_header);
01039     uves_free_propertylist(&table_header);
01040     uves_polynomial_delete(&absolute_order_poly2d);
01041     uves_polynomial_delete(&mst_absolute_order_poly2d);
01042     cpl_free(product_filename); 
01043           
01044     uves_msg_debug("end %s",__func__);
01045     return;
01046 }
01047 
01048 
01058 static int 
01059 uves_physmod_qclog(cpl_table* line_table,
01060                    cpl_table* order_table,
01061                    cpl_table* qclog,
01062                    const uves_propertylist *raw_header,
01063                    enum uves_chip chip,
01064                    bool flames,
01065                    const int iter,
01066                    const int plate_no)
01067 {
01068   int nlinsel=0;
01069   cpl_table *xline_table=NULL;
01070   char key_value[25];
01071 
01072 
01073   check_nomsg( uves_qclog_add_common_wave(raw_header,
01074                                           chip, qclog) );
01075 
01076 
01077   if(flames) {
01078      ck0_nomsg(uves_qclog_add_string(qclog,
01079                      "QC TEST1 ID",
01080                      "Fibre-Physical-Model-Prediction-Results",
01081                      "Name of QC test",
01082                      "%s"));
01083   } else {
01084      ck0_nomsg(uves_qclog_add_string(qclog,
01085                      "QC TEST1 ID",
01086                      "Physical-Model-Prediction-Results",
01087                      "Name of QC test",
01088                      "%s"));
01089   }
01090   ck0_nomsg(uves_qclog_add_string(qclog,
01091                   "QC MODEL ID",
01092                   "UVES_phys_mod/1.1.0",
01093                   "Physmod Model Id",
01094                   "%s"));
01095 
01096   ck0_nomsg(uves_qclog_add_string(qclog,
01097                   "QC MODEL DATE",
01098                   "2000:03:18T00:00:00.000",
01099                   "Physmod Model Parameters Last Change",
01100                   "%s"));
01101 
01102 
01103   if(flames) {
01104 
01105     sprintf(key_value,"%s%d","QC MODEL ITER",iter);
01106     ck0_nomsg(uves_qclog_add_int(qclog,
01107                  key_value,
01108                  iter,
01109                  "Model iteration",
01110                  "%d"));
01111 
01112     ck0_nomsg(uves_qclog_add_int(qclog,
01113                  "QC MODEL ORDMIN",
01114                  cpl_table_get_column_min(line_table,"Order"),
01115                  "minimum predicted order value",
01116                  "%d"));
01117 
01118     ck0_nomsg(uves_qclog_add_int(qclog,
01119                  "QC MODEL ORDMAX",
01120                  cpl_table_get_column_max(line_table,"Order"),
01121                  "maximum predicted order value",
01122                  "%d"));
01123 
01124 
01125     ck0_nomsg(uves_qclog_add_int(qclog,
01126                  "QC MODEL WLENMIN",
01127                  cpl_table_get_column_min(line_table,"WAVEC")/10.,
01128                  "minimum predicted order value",
01129                  "%f"));
01130 
01131 
01132     ck0_nomsg(uves_qclog_add_int(qclog,
01133                  "QC MODEL WLENMAX",
01134                  cpl_table_get_column_max(line_table,"WAVEC")/10.,
01135                  "maximum predicted order value",
01136                  "%f"));
01137 
01138   } /* in case of flames-uves */
01139 
01140 
01141   ck0_nomsg(uves_qclog_add_int(qclog,
01142                    "QC MODEL NLINALL",
01143                    cpl_table_get_nrow(line_table),
01144                    "Number of predicted lines",
01145                    "%d"));
01146 
01147   check_nomsg(nlinsel=cpl_table_and_selected_int(line_table,"SELPLOT",
01148                                                  CPL_EQUAL_TO,1));
01149   check_nomsg(xline_table=cpl_table_extract_selected(line_table));
01150 
01151   ck0_nomsg(uves_qclog_add_int(qclog,
01152                    "QC MODEL NLINSEL",
01153                    nlinsel,
01154                    "Number of lines selected",
01155                    "%d"));
01156 
01157 
01158   uves_msg_debug("flames=%d iter=%d",flames,iter);
01159 
01160 
01161   ck0_nomsg(uves_qclog_add_double(qclog,
01162                      "QC MODEL DIFFXRMS",
01163                      cpl_table_get_column_stdev(xline_table,"XDIF"),
01164                      "Std dev of X difference to physical model",
01165                      "%8.4f"));
01166 
01167      ck0_nomsg(uves_qclog_add_double(qclog,
01168                      "QC MODEL DIFFXAVG",
01169                      cpl_table_get_column_mean(xline_table,"XDIF"),
01170                      "Average of X difference to physical model",
01171                      "%8.4f"));
01172 
01173      ck0_nomsg(uves_qclog_add_double(qclog,"QC MODEL DIFFXMED",
01174                      cpl_table_get_column_median(xline_table,"XDIF"),
01175                      "Median of X difference to physical model",
01176                      "%8.4f"));
01177 
01178      ck0_nomsg(uves_qclog_add_double(qclog,
01179                      "QC MODEL DIFFYRMS",
01180                      cpl_table_get_column_stdev(xline_table,"YDIF"),
01181                      "Std dev of Y difference to physical model",
01182                      "%8.4f"));
01183 
01184      ck0_nomsg(uves_qclog_add_double(qclog,
01185                      "QC MODEL DIFFYAVG",
01186                      cpl_table_get_column_mean(xline_table,"YDIF"),
01187                      "Average of Y difference to physical model",
01188                      "%8.4f"));
01189 
01190      ck0_nomsg(uves_qclog_add_double(qclog,"QC MODEL DIFFYMED",
01191                      cpl_table_get_column_median(xline_table,"YDIF"),
01192                      "Median of Y difference to physical model",
01193                      "%8.4f"));
01194 
01195 
01196   if ( flames == 1 ) {
01197 
01198 
01199        sprintf(key_value,"%s%d","QC MODEL RESXRMS",iter);
01200        ck0_nomsg(uves_qclog_add_double(qclog,
01201                     key_value,
01202                     cpl_table_get_column_stdev(xline_table,"XDIF"),
01203                     "Std dev of X difference to physical model",
01204                     "%8.4f"));
01205 
01206 
01207        sprintf(key_value,"%s%d","QC MODEL RESXAVG",iter);
01208        ck0_nomsg(uves_qclog_add_double(qclog,
01209                     key_value,
01210                     cpl_table_get_column_mean(xline_table,"XDIF"),
01211                     "Average of X difference to physical model",
01212                     "%8.4f"));
01213 
01214        sprintf(key_value,"%s%d","QC MODEL RESXMED",iter);
01215        ck0_nomsg(uves_qclog_add_double(qclog,
01216                     key_value,
01217                     cpl_table_get_column_median(xline_table,"XDIF"),
01218                     "Median of X difference to physical model",
01219                     "%8.4f"));
01220 
01221 
01222 
01223        sprintf(key_value,"%s%d","QC MODEL RESYRMS",iter);
01224        ck0_nomsg(uves_qclog_add_double(qclog,
01225                     key_value,
01226                     cpl_table_get_column_stdev(xline_table,"YDIF"),
01227                     "Std dev of Y difference to physical model",
01228                     "%8.4f"));
01229 
01230 
01231        sprintf(key_value,"%s%d","QC MODEL RESYAVG",iter);
01232        ck0_nomsg(uves_qclog_add_double(qclog,
01233                     key_value,
01234                     cpl_table_get_column_mean(xline_table,"YDIF"),
01235                     "Average of Y difference to physical model",
01236                     "%8.4f"));
01237 
01238        sprintf(key_value,"%s%d","QC MODEL RESYMED",iter);
01239        ck0_nomsg(uves_qclog_add_double(qclog,
01240                     key_value,
01241                     cpl_table_get_column_median(xline_table,"YDIF"),
01242                     "Median of Y difference to physical model",
01243                     "%8.4f"));
01244 
01245 
01246   }
01247 
01248 
01249 
01250 
01251 
01252   cpl_table_unselect_all(line_table);
01253 
01254   /* we divide by 10 as line_table contains values in Angstrom and we want
01255      nanometers */
01256   ck0_nomsg(uves_qclog_add_double(qclog,
01257                   "QC MODEL WLENMIN",
01258                   cpl_table_get_column_min(xline_table,"WAVEC")/10.,
01259                   "minimum predicted wavelength value",
01260                   "%8.4f"));
01261 
01262 
01263  ck0_nomsg(uves_qclog_add_double(qclog,
01264                  "QC MODEL WLENMAX",
01265                  cpl_table_get_column_max(xline_table,"WAVEC")/10.,
01266                  "maximum predicted wavelength value",
01267                  "%8.4f"));
01268 
01269 
01270   ck0_nomsg(uves_qclog_add_int(qclog,
01271                    "QC MODEL ORDMIN",
01272                    (int)cpl_table_get_column_min(xline_table,"Order"),
01273                    "minimum predicted order value",
01274                    "%d"));
01275 
01276   ck0_nomsg(uves_qclog_add_int(qclog,
01277                    "QC MODEL ORDMAX",
01278                    (int)cpl_table_get_column_max(xline_table,"Order"),
01279                    "maximum predicted order value",
01280                    "%d"));
01281 
01282 
01283  
01284   /* we divide by 10 as line_table contains values in Angstrom and we want
01285      nanometers */
01286   ck0_nomsg(uves_qclog_add_double(qclog,
01287                   "QC WLENMIN",
01288                   cpl_table_get_column_min(line_table,"WAVEC")/10.,
01289                   "minimum wavelength",
01290                   "%8.4f"));
01291 
01292   ck0_nomsg(uves_qclog_add_double(qclog,
01293                   "QC WLENMAX",
01294                   cpl_table_get_column_max(line_table,"WAVEC")/10.,
01295                   "maximum wavelength",
01296                   "%8.4f"));
01297   
01298   ck0_nomsg(uves_qclog_add_int(qclog,
01299                    "QC ORDMIN",
01300                    cpl_table_get_column_min(order_table,"ORDER"),
01301                    "minimum order number",
01302                    "%d"));
01303 
01304   ck0_nomsg(uves_qclog_add_int(qclog,
01305                    "QC ORDMAX",
01306                    cpl_table_get_column_max(order_table,"ORDER"),
01307                    "maximum order number",
01308                    "%d"));
01309   
01310 
01311   if (flames) {
01312     /*
01313 stat/ima {wlc} {SESSOUTV}
01314 tot_int = outputr(7)
01315 exp_time = {{wlc},{h_dit1}}
01316 rel_int = tot_int / exp_time
01317     */
01318 
01319      ck0_nomsg(uves_qclog_add_int(qclog,
01320                   "QC FIB1 ABSTRANS",
01321                   cpl_table_get_column_max(order_table,"ORDER"),
01322                   "abs. trans. countrate",
01323                   "%f"));
01324      /*
01325 @p flames_check_sat_lev {wlc} {DRS_PTHRE_MIN} {DRS_PTHRE_MAX}
01326 sat_lev = {q1}
01327 n_hpix  = {q2}
01328      */
01329 
01330     ck0_nomsg(uves_qclog_add_int(qclog,
01331                  "QC NHOTPIX",
01332                  cpl_table_get_column_max(order_table,"ORDER"),
01333                  "no. of hot pixels",
01334                  "%d"));
01335 
01336 
01337     ck0_nomsg(uves_qclog_add_int(qclog,
01338                  "QC PLATENO",
01339                  plate_no,
01340                  "Plate Id.",
01341                  "%d"));
01342   }
01343 
01344   /* The number of orders predicted is already written to another
01345      keyword, and this is not need for QC logging, so it is commented out
01346   uves_qclog_add_int(qclog,"QC NORDGUE",???,"No of predicted orders","%d");
01347   */
01348 
01349  cleanup:
01350   uves_free_table(&xline_table);
01351 
01352   if (cpl_error_get_code() != CPL_ERROR_NONE) {
01353     return -1;
01354   } else {
01355     return 0;
01356   }
01357 
01358 
01359 
01360 }
01361 
01362 
01363 
01364 
01374 static int uves_physmod_qclog_sc(const double med_dx, 
01375                   const double med_dy,
01376                                   const double avg_dx,
01377                                   const double avg_dy,
01378                   const uves_propertylist *raw_header,
01379                   const uves_propertylist *ref_header,
01380                   enum uves_chip chip,
01381                   cpl_table* qclog)
01382 {
01383     ck0_nomsg(uves_qclog_add_string(qclog,
01384               "QC TEST2 ID",
01385               "Stability-Check-Results",
01386               "Name of QC test",
01387               "%s"));
01388     
01389     ck0_nomsg(uves_qclog_add_string(qclog,
01390               "QC MODEL ID",
01391               "UVES_phys_mod/1.1.0",
01392               "Physmod Model Id",
01393               "%s"));
01394     
01395     ck0_nomsg(uves_qclog_add_string(qclog,
01396               "QC MODEL DATE",
01397               "2000:03:18T00:00:00.000",
01398               "Physmod Model Parameters Last Change",
01399               "%s"));
01400 
01401     check_nomsg( uves_qclog_add_common_wave(raw_header,
01402                                             chip, qclog) );
01403     
01404 
01405     ck0_nomsg(uves_qclog_add_string(qclog,
01406               "QC REF PNAME",
01407               uves_pfits_get_arcfile(ref_header),
01408               "Reference file name",
01409               "%s"));
01410 
01411     ck0_nomsg(uves_qclog_add_double(qclog,
01412               "QC AMBI PRES",
01413               uves_pfits_get_ambipress(raw_header),
01414               "Ambient pressure [mm] Hg.",
01415               "%8.4f"));
01416 
01417     ck0_nomsg(uves_qclog_add_double(qclog,
01418               "QC SHFTXAVG",
01419               avg_dx,
01420               "mean shift in x",
01421               "%8.4f"));
01422 
01423     ck0_nomsg(uves_qclog_add_double(qclog,
01424               "QC SHFTXMED",
01425               med_dx,
01426               "median shift in x",
01427               "%8.4f"));
01428 
01429     ck0_nomsg(uves_qclog_add_double(qclog,
01430               "QC SHFTYAVG",
01431               avg_dy,
01432               "mean shift in y",
01433               "%8.4f"));
01434 
01435     ck0_nomsg(uves_qclog_add_double(qclog,
01436               "QC SHFTYMED",
01437               med_dy,
01438               "median shift in y",
01439               "%8.4f"));
01440  cleanup:
01441 
01442   if (cpl_error_get_code() != CPL_ERROR_NONE) {
01443     return -1;
01444   } else {
01445     return 0;
01446   }
01447 }
01448 
01449 

Generated on Tue Jun 19 14:39:16 2007 for UVES Pipeline Reference Manual by  doxygen 1.4.6