wavecal_ini_by_cpl.c

00001 /*----------------------------------------------------------------------------
00002    
00003    File name    :   wavecal_ini_by_cpl.c
00004    Author       :   Andrea Modigliani
00005    Created on   :   May 21, 2004
00006    Description  :   wavelength calibration cpl input handling for SPIFFI
00007 
00008  ---------------------------------------------------------------------------*/
00009 
00010 
00011 
00012 /*---------------------------------------------------------------------------
00013                                 Includes
00014  ---------------------------------------------------------------------------*/
00015 
00016 #include "wavecal_ini_by_cpl.h"
00017 
00018 
00019 
00020 /*---------------------------------------------------------------------------
00021                     Functions private to this module
00022  ---------------------------------------------------------------------------*/
00023 
00024 static void    parse_section_frames    (wave_config *, cpl_frameset* sof, cpl_frameset** raw, int* status);
00025 
00026 static void     parse_section_findlines  (wave_config *, cpl_parameterlist* cpl_cfg);
00027 static void     parse_section_wavecalib  (wave_config *, cpl_parameterlist* cpl_cfg);
00028 static void     parse_section_wavemap    (wave_config *, cpl_parameterlist* cpl_cfg);
00029 static void     parse_section_qclog      (wave_config *, cpl_parameterlist* cpl_cfg);
00030 static void     parse_section_fitslits   (wave_config *, cpl_parameterlist* cpl_cfg);
00031 
00032 /*-------------------------------------------------------------------------*/
00049 /*--------------------------------------------------------------------------*/
00050 
00051 /* Removed  generateWave_ini_file */
00052 
00053 /*-------------------------------------------------------------------------*/
00064 /*--------------------------------------------------------------------------*/
00065 
00066 wave_config * parse_cpl_input_wave(cpl_parameterlist* cpl_cfg, cpl_frameset* sof, cpl_frameset** raw)
00067 {
00068 
00069    const char* _id = "parse_section_frames";
00070         int  status=0;
00071         wave_config   * cfg= wave_cfg_create();
00072         /*
00073          * Perform sanity checks, fill up the structure with what was
00074          * found in the ini file
00075          */
00076 
00077         parse_section_findlines (cfg, cpl_cfg);
00078         parse_section_wavecalib (cfg, cpl_cfg);
00079         parse_section_wavemap   (cfg, cpl_cfg); 
00080         parse_section_fitslits  (cfg, cpl_cfg); 
00081         parse_section_qclog     (cfg, cpl_cfg); 
00082         parse_section_frames    (cfg, sof, raw, &status);
00083 
00084         if (status > 0) {
00085                 cpl_msg_error(_id,"parsing cpl input");
00086                 wave_cfg_destroy(cfg);
00087                 cfg = NULL ;
00088                 return NULL ;
00089         }
00090         return cfg ;
00091 }
00092 
00093 
00094 /*---------------------------------------------------------------------------
00095    Functions:   parse_section_xxx()
00096    In           :       symbolic table read from ini file
00097    Out          :       void
00098    Job          :       update a wave_config structure from what can be
00099                             found in the ini file.
00100    Notice       :       all of these functions update a status integer to
00101                             indicate if an error occurred, or leave it as it is if
00102                                 everything went Ok.
00103 
00104         parse_section_general()
00105         parse_section_findlines()
00106         parse_section_wavecalib()
00107         parse_section_wavemap()
00108         parse_section_fitslits()
00109 
00110  ---------------------------------------------------------------------------*/
00111 
00112 
00113 
00114 static void
00115 parse_section_frames(wave_config * cfg,cpl_frameset* sof, cpl_frameset** raw, int* status)
00116 {
00117    const char* _id = "parse_section_frames";
00118    cpl_frame* frame   = NULL;
00119    char spat_res[FILE_NAME_SZ];
00120    char lamp_status[FILE_NAME_SZ];
00121    char band[FILE_NAME_SZ];
00122    int ins_set=0;
00123    int nraw=0;
00124    cpl_table* drs_tab=NULL;
00125    wcal* w=wcal_new();
00126    int check=0;
00127 
00128    sinfoni_extract_raw_frames_type(sof,raw,PRO_WAVE_LAMP_STACKED);
00129    nraw=cpl_frameset_get_size(*raw);
00130    if (nraw==0) {
00131       sinfoni_extract_raw_frames_type(sof,raw,PRO_WAVE_NS_STACKED);
00132    }   
00133    nraw=cpl_frameset_get_size(*raw);
00134    if (nraw==0) {
00135       sinfoni_extract_raw_frames_type(sof,raw,PRO_WAVE_SLITPOS_STACKED);
00136    }   
00137 
00138    nraw=cpl_frameset_get_size(*raw);
00139    if (nraw==0) {
00140        cpl_msg_info(_id,"Frame %s or %s or %s not found!", 
00141          PRO_WAVE_LAMP_STACKED,PRO_WAVE_NS_STACKED,PRO_WAVE_SLITPOS_STACKED);
00142        (*status)++;
00143        return   ;
00144    }
00145  
00146    frame = cpl_frameset_get_frame(*raw,0);
00147    sinfoni_get_spatial_res(frame,spat_res);
00148  
00149    switch(sinfoni_frame_is_on(frame)) 
00150      {
00151    case 0: 
00152       strcpy(lamp_status,"on");
00153       break;
00154     case 1: 
00155       strcpy(lamp_status,"off");
00156       break;
00157     case -1:
00158       strcpy(lamp_status,"undefined");
00159       break;
00160     default: 
00161       strcpy(lamp_status,"undefined");
00162       break;
00163 
00164 
00165      }
00166 
00167    sinfoni_get_band(frame,band);
00168    cpl_msg_info(_id,"spatial resolution: %s lamp status: %s band: %s \n",
00169                      spat_res,              lamp_status,    band);
00170 
00171 
00172    sinfoni_get_ins_set(band,&ins_set);
00173    if(NULL != cpl_frameset_find(sof,PRO_WAVE_LAMP_STACKED)) {
00174     frame = cpl_frameset_find(sof,PRO_WAVE_LAMP_STACKED);
00175         strcpy(cfg -> inFrame,cpl_frame_get_filename(frame));
00176    } else if(NULL != cpl_frameset_find(sof,PRO_WAVE_NS_STACKED)) {
00177     frame = cpl_frameset_find(sof,PRO_WAVE_NS_STACKED);
00178         strcpy(cfg -> inFrame,cpl_frame_get_filename(frame));
00179    } else if(NULL != cpl_frameset_find(sof,PRO_WAVE_SLITPOS_STACKED)) {
00180     frame = cpl_frameset_find(sof,PRO_WAVE_SLITPOS_STACKED);
00181         strcpy(cfg -> inFrame,cpl_frame_get_filename(frame));
00182    } else {
00183     cpl_msg_error(_id,"Frame %s or %s not found! Exit!", 
00184                       PRO_WAVE_LAMP_STACKED,PRO_WAVE_NS_STACKED);
00185         (*status)++;
00186         return;
00187    }
00188  
00189 
00190    if(NULL != cpl_frameset_find(sof,DRS_SETUP_WAVE)) {
00191     frame = cpl_frameset_find(sof,DRS_SETUP_WAVE);
00192         strcpy(cfg -> drs_setup,cpl_frame_get_filename(frame));
00193         drs_tab = cpl_table_load(cfg->drs_setup,1,0);
00194         w->wstart=cpl_table_get_double(drs_tab,"W_START",ins_set,&check);
00195         w->wgdisp1=cpl_table_get_double(drs_tab,"W_DISP1",ins_set,&check);
00196         w->wgdisp2=cpl_table_get_double(drs_tab,"W_DISP2",ins_set,&check);
00197         w->hw=cpl_table_get_int(drs_tab,"W_HW",ins_set,&check);
00198         w->fwhm=cpl_table_get_double(drs_tab,"W_FWHM",ins_set,&check);
00199         w->min_amp=cpl_table_get_double(drs_tab,"W_MIN_AMP",ins_set,&check);
00200     /*
00201         w->min_dif=cpl_table_get_double(drs_tab,"W_MIN_DIF",ins_set,&check);
00202         w->na_coef=cpl_table_get_int(drs_tab,"W_NA_COEFF",ins_set,&check);
00203         w->nb_coef=cpl_table_get_int(drs_tab,"W_NB_COEFF",ins_set,&check);
00204         w->pixel_tol=cpl_table_get_double(drs_tab,"W_PIX_TOL",ins_set,&check); 
00205         w->y_box=cpl_table_get_double(drs_tab,"W_Y_BOX",ins_set,&check);
00206         */
00207         w->low_pos=cpl_table_get_int(drs_tab,"W_LOW_POS",ins_set,&check);
00208         w->hig_pos=cpl_table_get_int(drs_tab,"W_HI_POS",ins_set,&check);
00209 
00210     cfg -> guessBeginWavelength = w->wstart;
00211     cfg -> guessDispersion1 =  w->wgdisp1;
00212     cfg -> guessDispersion2 =  w->wgdisp2;
00213     cfg -> halfWidth =         w->hw;
00214     cfg -> fwhm =              w->fwhm;
00215     cfg -> minAmplitude =      w->min_amp;
00216     /*
00217     cfg -> mindiff =           w->min_dif;
00218     cfg -> nrDispCoefficients = w->na_coef;
00219     cfg -> nrCoefCoefficients = w->nb_coef;
00220     cfg -> pixel_tolerance =    w->pixel_tol;
00221     cfg -> yBox =               w->y_box;
00222     */
00223     cfg -> loPos =              w->low_pos;
00224     cfg -> hiPos =              w->hig_pos;
00225     /* cfg -> pixel_tolerance =    w->pixel_tol; */
00226         cpl_msg_info(_id,"cfg -> guessBeginWavelength %g",cfg -> guessBeginWavelength);
00227         cpl_msg_info(_id,"cfg -> guessDispersion1 %g",cfg -> guessDispersion1);
00228         cpl_msg_info(_id,"cfg -> guessDispersion2 %g",cfg -> guessDispersion2);
00229         cpl_msg_info(_id,"cfg -> mindiff %g",cfg -> mindiff);
00230         cpl_msg_info(_id,"cfg -> halfWidth %d",cfg ->  halfWidth);
00231         cpl_msg_info(_id,"cfg -> fwhm %g",cfg -> fwhm);
00232         cpl_msg_info(_id,"cfg -> minAmplitude %g",cfg -> minAmplitude);
00233         cpl_msg_info(_id,"cfg -> nrDispCoefficients %d",cfg -> nrDispCoefficients);
00234         cpl_msg_info(_id,"cfg -> nrCoefCoefficients %d",cfg -> nrCoefCoefficients);
00235         cpl_msg_info(_id,"cfg -> pixel_tolerance  %g",cfg -> pixel_tolerance);
00236          cpl_msg_info(_id,"cfg -> loPos %d",cfg -> loPos);
00237         cpl_msg_info(_id,"cfg -> hiPos %d",cfg -> hiPos);
00238         cpl_msg_info(_id,"cfg -> yBox  %f",cfg -> yBox);
00239 
00240 
00241     wcal_delete(w);
00242         cpl_table_delete(drs_tab);
00243         if(-1 == check_rec_status(_id,0)) {
00244       (*status)++;
00245       return;
00246     }
00247 
00248    } else {
00249     cpl_msg_error(_id,"Frame %s not found! Exit!", DRS_SETUP_WAVE);
00250         (*status)++;
00251         return;
00252    }
00253 
00254  
00255    if(NULL != cpl_frameset_find(sof,REF_LINE_ARC)) {
00256     frame = cpl_frameset_find(sof,REF_LINE_ARC);
00257         strcpy(cfg -> lineList,cpl_frame_get_filename(frame));
00258    } else {
00259     cpl_msg_error(_id,"Frame %s not found! Exit!", REF_LINE_ARC);
00260         (*status)++;
00261         return;
00262    }
00263 
00264  
00265    if(NULL != cpl_frameset_find(sof,PRO_SLIT_POS_GUESS)) {
00266     frame = cpl_frameset_find(sof,PRO_SLIT_POS_GUESS);
00267         strcpy(cfg -> slitposGuessName,cpl_frame_get_filename(frame));
00268    } else {
00269     cpl_msg_info(_id,"Frame %s not found!", PRO_SLIT_POS_GUESS);
00270    }
00271  
00272    if(cfg -> writeParInd ==0) {
00273          if(NULL != cpl_frameset_find(sof,PRO_WAVE_PAR_LIST)) {
00274         frame = cpl_frameset_find(sof,PRO_WAVE_PAR_LIST);
00275             strcpy(cfg ->  paramsList,cpl_frame_get_filename(frame));
00276          } else {
00277         cpl_msg_info(_id,"Frame %s not found!", PRO_WAVE_PAR_LIST);
00278            (*status)++;
00279             return   ;
00280          }
00281 
00282    } else {
00283 
00284          strcpy(cfg -> paramsList, WAVECAL_FIT_PARAMS_OUT_FILENAME);
00285          cpl_msg_info(_id,"cfg -> paramsList %s not given\n",cfg -> paramsList);
00286 
00287    }
00288 
00289      
00290  
00291    if(cfg -> calibIndicator ==  0) {
00292          if(NULL != cpl_frameset_find(sof,PRO_WAVE_COEF_SLIT)) {
00293        frame = cpl_frameset_find(sof,PRO_WAVE_COEF_SLIT);
00294            strcpy(cfg -> coeffsName,cpl_frame_get_filename(frame));
00295          } else {
00296        cpl_msg_error(_id,"Frame %s not found! Exit!", PRO_WAVE_COEF_SLIT);
00297            (*status)++;
00298            return;
00299          }
00300    } else {
00301 
00302          strcpy(cfg -> coeffsName, WAVECAL_COEFF_SLIT_OUT_FILENAME);
00303          cpl_msg_info(_id,"cfg -> coeffsName %s not given\n",cfg -> coeffsName);
00304 
00305    }
00306 
00307    strcpy(cfg -> outName, WAVECAL_OUT_FILENAME);
00308    strcpy(cfg -> slitposName, WAVECAL_SLIT_POS_OUT_FILENAME);
00309 
00310    return;
00311 }
00312 
00313 
00314 static void     
00315 parse_section_findlines(wave_config * cfg,cpl_parameterlist* cpl_cfg)
00316 {
00317 
00318    cpl_parameter* p;
00319 
00320    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.calib_indicator");
00321    cfg -> calibIndicator = cpl_parameter_get_bool(p);
00322 
00323    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.min_diff");
00324    cfg -> mindiff =  cpl_parameter_get_double(p);
00325 
00326    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.half_width");
00327    cfg -> halfWidth = cpl_parameter_get_int(p);
00328 
00329    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.sigma");
00330    cfg -> sigma =  cpl_parameter_get_double(p);
00331 
00332    return ;
00333 }
00334 
00335 static void     
00336 parse_section_wavecalib(wave_config * cfg,cpl_parameterlist* cpl_cfg)
00337 {
00338    cpl_parameter* p;
00339 
00340    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.fwhm");
00341    cfg -> fwhm =  cpl_parameter_get_double(p);
00342 
00343    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.min_amplitude");
00344    cfg -> minAmplitude =  cpl_parameter_get_double(p);
00345 
00346    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.max_residual");
00347    cfg -> maxResidual =  cpl_parameter_get_double(p);
00348 
00349    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.n_a_coefficients");
00350    cfg -> nrDispCoefficients = cpl_parameter_get_int(p);
00351 
00352    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.n_b_coefficients");
00353    cfg -> nrCoefCoefficients = cpl_parameter_get_int(p);
00354 
00355    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.sigma_factor");
00356    cfg -> sigmaFactor =  cpl_parameter_get_double(p);
00357 
00358    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.write_coeffs_ind");
00359    cfg -> writeCoeffsInd = cpl_parameter_get_bool(p);
00360 
00361    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.write_par_ind");
00362    cfg -> writeParInd = cpl_parameter_get_bool(p);
00363 
00364    cfg -> nslitlets = NSLITLETS;
00365 
00366    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.pixel_dist");
00367    cfg -> pixeldist = cpl_parameter_get_int(p);
00368 
00369    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.pixel_tol");
00370    cfg -> pixel_tolerance = cpl_parameter_get_double(p);
00371 
00372 }
00373 
00374 static void     
00375 parse_section_wavemap(wave_config * cfg,cpl_parameterlist* cpl_cfg)
00376 {
00377    cpl_parameter* p;
00378 
00379    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.wave_map_ind");
00380    cfg -> wavemapInd = cpl_parameter_get_bool(p);
00381 
00382    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.mag_factor");
00383    cfg -> magFactor = cpl_parameter_get_int(p);
00384 
00385 
00386 }
00387 
00388 static void     
00389 parse_section_fitslits(wave_config * cfg,cpl_parameterlist* cpl_cfg)
00390 {
00391 
00392    cpl_parameter* p;
00393 
00394    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.slit_pos_indicator");
00395    cfg -> slitposIndicator = cpl_parameter_get_bool(p);
00396 
00397    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.fit_boltz_indicator");
00398    cfg -> fitBoltzIndicator = cpl_parameter_get_bool(p);
00399 
00400    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.fit_edge_indicator");
00401    cfg -> fitEdgeIndicator = cpl_parameter_get_bool(p);
00402 
00403    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.estimate_indicator");
00404    cfg -> estimateIndicator = cpl_parameter_get_bool(p);
00405 
00406    cfg -> loPos =  750;
00407    cfg -> hiPos =  1000;
00408 
00409    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.box_length");
00410    cfg -> boxLength = cpl_parameter_get_int(p);
00411 
00412    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.y_box");
00413    cfg -> yBox = cpl_parameter_get_double(p);
00414 
00415    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.diff_tol");
00416    cfg -> diffTol =  cpl_parameter_get_double(p);
00417 
00418    /* input CDB
00419    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.slit_pos_guess_name");
00420    strcpy(cfg -> slitposGuessName, cpl_parameter_get_default_string(p));
00421    printf("slit_pos_guess_name %s\n",cfg -> slitposGuessName);
00422    */
00423 
00424 }
00425 
00426 static void     
00427 parse_section_qclog      (wave_config * cfg, cpl_parameterlist* cpl_cfg)
00428 {
00429    cpl_parameter* p;
00430 
00431    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.qc_thresh_min");
00432    cfg ->  qc_thresh_min = cpl_parameter_get_int(p);
00433 
00434 
00435    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.wavecal.qc_thresh_max");
00436    cfg ->  qc_thresh_max = cpl_parameter_get_int(p);
00437 
00438 
00439 }
00440 
00441 void
00442 wavecal_free(wave_config * cfg)
00443 {  
00444 
00445   wave_cfg_destroy(cfg);
00446  
00447   return;
00448 
00449 }
00450 

Generated on Wed Oct 26 13:08:56 2005 for SINFONI Pipeline Reference Manual by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001