finddist_ini_by_cpl.c

00001 /*----------------------------------------------------------------------------
00002    
00003    File name    :   finddist_ini_by_cpl.c
00004    Author       :   Andrea Modigliani
00005    Created on   :   Aug 12, 2004
00006    Description  :   distortion, slitlet distances, first column CPL input 
00007                     handling for SINFONI
00008 
00009  ---------------------------------------------------------------------------*/
00010 
00011 
00012 
00013 /*---------------------------------------------------------------------------
00014                                 Includes
00015  ---------------------------------------------------------------------------*/
00016 
00017 #include "finddist_ini_by_cpl.h"
00018 
00019 /*---------------------------------------------------------------------------
00020                     Functions private to this module
00021  ---------------------------------------------------------------------------*/
00022 static void     parse_section_frames(finddist_config *, cpl_parameterlist* cpl_cfg, 
00023  cpl_frameset* sof, cpl_frameset** raw, int* status);
00024 static void     parse_section_findlines(finddist_config *, cpl_parameterlist* cpl_cfg);
00025 static void     parse_section_wavecalib(finddist_config *, cpl_parameterlist* cpl_cfg);
00026 static void     parse_section_wavemap(finddist_config *, cpl_parameterlist* cpl_cfg);
00027 static void     parse_section_fitslits(finddist_config *, cpl_parameterlist* cpl_cfg);
00028 static void     parse_section_northsouthtest(finddist_config *, cpl_parameterlist* cpl_cfg);
00029 static void     parse_section_qclog      (finddist_config * cfg, cpl_parameterlist* cpl_cfg);
00030 
00031 /*-------------------------------------------------------------------------*/
00042 /*--------------------------------------------------------------------------*/
00043 
00044 /*-------------------------------------------------------------------------*/
00056 /*--------------------------------------------------------------------------*/
00057 
00058 finddist_config * parse_cpl_input_finddist(cpl_parameterlist * cpl_cfg, 
00059 cpl_frameset* sof, cpl_frameset** raw)
00060 {
00061         const cxchar * _id = "parse_cpl_input_finddist";
00062         finddist_config   *       cfg ;
00063         int                   status =0;
00064 
00065         cfg = finddist_cfg_create();
00066 
00067         parse_section_findlines (cfg, cpl_cfg);
00068         parse_section_wavecalib (cfg, cpl_cfg);
00069         parse_section_wavemap   (cfg, cpl_cfg); 
00070         parse_section_fitslits  (cfg, cpl_cfg); 
00071         parse_section_northsouthtest (cfg, cpl_cfg);
00072         parse_section_qclog(cfg,cpl_cfg);
00073         parse_section_frames   (cfg, cpl_cfg, sof, raw, &status);
00074 
00075     /*
00076    printf("tol =%g \n",cfg -> pixel_tolerance);
00077    printf("cfg -> guessBeginWavelength =%g \n",cfg -> guessBeginWavelength);
00078    printf("cfg -> guessDispersion1 =%g \n",cfg -> guessDispersion1);
00079    printf("cfg -> guessDispersion2 =%g \n",cfg -> guessDispersion2);
00080    printf("cfg -> mindiff =%g \n",cfg -> mindiff);
00081    printf("cfg -> halfWidth =%d \n",cfg -> halfWidth);
00082    printf("cfg -> sigma =%g \n",cfg -> sigma);
00083    printf("cfg -> fwhm = %g \n",cfg -> fwhm);
00084    printf("cfg -> minAmplitude =%g \n",cfg -> minAmplitude);
00085    printf("cfg -> maxResidual =%g \n",cfg -> maxResidual);
00086    printf("cfg -> nrDispCoefficients =%d \n",cfg -> nrDispCoefficients);
00087    printf("cfg -> nrCoefCoefficients =%d \n",cfg -> nrCoefCoefficients);
00088    printf("cfg -> sigmaFactor =%g \n",cfg -> sigmaFactor);
00089    printf("cfg -> nslitlets =%d \n",cfg -> nslitlets);
00090    printf("cfg -> pixeldist =%d \n",cfg -> pixeldist);
00091    printf("cfg -> pixel_tolerance =%g \n",cfg -> pixel_tolerance);
00092    printf("cfg -> magFactor =%d \n",cfg -> magFactor);
00093    printf("cfg -> loPos =%d \n",cfg -> loPos);
00094    printf("cfg -> hiPos =%d \n",cfg -> hiPos);
00095    printf("cfg -> boxLength =%d \n",cfg -> boxLength);
00096    printf("cfg -> yBox = %g \n",cfg -> yBox);
00097    printf("cfg -> diffTol =%g \n",cfg -> diffTol);
00098    printf("cfg -> nslits = %d \n",cfg -> nslits);
00099    printf("cfg -> nshalfWidth =%d \n",cfg -> nshalfWidth);
00100    printf("cfg -> nsfwhm = %g \n",cfg -> nsfwhm);
00101    printf("cfg -> minDiff = %g \n",cfg -> minDiff);
00102    printf("cfg -> estimated_dist = %g \n",cfg -> estimated_dist);
00103    printf("cfg -> devtol = %g \n",cfg -> devtol);
00104     */
00105         if (status > 0) {
00106                 cpl_msg_error(_id,"parsing cpl input");
00107                 finddist_cfg_destroy(cfg);
00108                 cfg = NULL ;
00109                 return NULL ;
00110         }
00111         return cfg ;
00112 }
00113 
00114 
00115 /*---------------------------------------------------------------------------
00116    Functions:   parse_section_xxx()
00117    In           :       symbolic table read from ini file
00118    Out          :       void
00119    Job          :       update a wave_config structure from what can be
00120                             found in the ini file.
00121    Notice       :       all of these functions update a status integer to
00122                             indicate if an error occurred, or leave it as it is if
00123                                 everything went Ok.
00124 
00125         parse_section_general()
00126         parse_section_findlines()
00127         parse_section_wavecalib()
00128         parse_section_wavemap()
00129         parse_section_fitslits()
00130 
00131  ---------------------------------------------------------------------------*/
00132 
00133 
00134 static void     
00135 parse_section_frames(finddist_config * cfg,
00136              cpl_parameterlist * cpl_cfg,
00137              cpl_frameset * sof,
00138                      cpl_frameset** raw,
00139                      int* status)
00140 {
00141 
00142    const char* _id = "parse_section_frames";
00143 
00144 
00145    int nframes=0;
00146    int nraw=0;
00147    cpl_frame* frame   = NULL;
00148    cpl_parameter *p; 
00149 
00150 
00151    char spat_res[FILE_NAME_SZ];
00152    char lamp_status[FILE_NAME_SZ];
00153    char band[FILE_NAME_SZ];
00154    int ins_set=0;
00155    cpl_table* drs_tab=NULL;
00156    wcal* w=NULL;
00157    int check=0;
00158    nstpar* nstp=NULL;
00159    distpar* d=NULL;
00160 
00161    d=distpar_new();
00162    w=wcal_new();
00163 
00164    nframes = cpl_frameset_get_size(sof);
00165 
00166     /* Get the raw and the calibration files */
00167 
00168 
00169    sinfoni_extract_raw_frames_type(sof,raw,PRO_FIBRE_NS_STACKED);
00170    
00171 
00172    nraw=cpl_frameset_get_size(*raw);
00173    if (nraw < 1) {
00174       cpl_msg_error(_id,"Too few (%d) raw frames (%s) present in"
00175             "frameset!Aborting...",nraw,PRO_FIBRE_NS_STACKED);
00176         distpar_delete(d);
00177     wcal_delete(w);
00178           (*status)++;
00179           return;
00180    }
00181 
00182 
00183    if(NULL != cpl_frameset_find(sof,PRO_WAVE_LAMP_STACKED)) {
00184       frame = cpl_frameset_find(sof,PRO_WAVE_LAMP_STACKED);
00185       strcpy(cfg -> inFrame,cpl_frame_get_filename(frame));
00186    } else {
00187       cpl_msg_error(_id,"Frame %s not found! Exit!", PRO_WAVE_LAMP_STACKED);
00188         distpar_delete(d);
00189     wcal_delete(w);
00190         (*status)++;
00191       return;
00192    }
00193 
00194    strcpy(cfg -> outName, DISTORTION_OUT_FILENAME);
00195 
00196 
00197    if(NULL != cpl_frameset_find(sof,REF_LINE_ARC)) {
00198       frame = cpl_frameset_find(sof,REF_LINE_ARC);
00199       strcpy(cfg -> lineList,cpl_frame_get_filename(frame));
00200    } else {
00201       cpl_msg_error(_id,"Frame %s not found! Exit!", REF_LINE_ARC);
00202         distpar_delete(d);
00203     wcal_delete(w);
00204         (*status)++;
00205       return;
00206    }
00207 
00208    if(NULL != cpl_frameset_find(sof,PRO_FIBRE_NS_STACKED)) {
00209       frame = cpl_frameset_find(sof,PRO_FIBRE_NS_STACKED);
00210       strcpy(cfg -> nsFrame,cpl_frame_get_filename(frame));
00211    } else {
00212       cpl_msg_error(_id,"Frame %s not found! Exit!", PRO_FIBRE_NS_STACKED);
00213         distpar_delete(d);
00214     wcal_delete(w);
00215         (*status)++;
00216       return;
00217    }
00218 
00219 
00220    if(NULL != cpl_frameset_find(sof,PRO_BP_MAP_DI)) {
00221       frame = cpl_frameset_find(sof,PRO_BP_MAP_DI);
00222       strcpy(cfg -> mask,cpl_frame_get_filename(frame));
00223    } else {
00224       cpl_msg_error(_id,"Frame %s not found! Exit!", PRO_BP_MAP_DI);
00225         distpar_delete(d);
00226     wcal_delete(w);
00227         (*status)++;
00228       return;
00229    }
00230 
00231 
00232   
00233    frame = cpl_frameset_get_frame(*raw,0);
00234    sinfoni_get_spatial_res(frame,spat_res);
00235  
00236    switch(sinfoni_frame_is_on(frame)) 
00237      {
00238    case 0: 
00239       strcpy(lamp_status,"on");
00240       break;
00241     case 1: 
00242       strcpy(lamp_status,"off");
00243       break;
00244     case -1:
00245       strcpy(lamp_status,"undefined");
00246       break;
00247     default: 
00248       strcpy(lamp_status,"undefined");
00249       break;
00250      }
00251 
00252    sinfoni_get_band(frame,band);
00253    cpl_msg_info(_id,"stat_res: %s lamp_status: %s band: %s \n",
00254                      spat_res,    lamp_status,    band);
00255 
00256 
00257    sinfoni_get_ins_set(band,&ins_set);
00258     if(NULL != cpl_frameset_find(sof,DRS_SETUP_WAVE)) {
00259     frame = cpl_frameset_find(sof,DRS_SETUP_WAVE);
00260         strcpy(cfg -> drs_setup,cpl_frame_get_filename(frame));
00261         drs_tab = cpl_table_load(cfg->drs_setup,1,0);
00262         w->wstart=cpl_table_get_double(drs_tab,"W_START",ins_set,&check);
00263         w->wgdisp1=cpl_table_get_double(drs_tab,"W_DISP1",ins_set,&check);
00264         w->wgdisp2=cpl_table_get_double(drs_tab,"W_DISP2",ins_set,&check);
00265         w->hw=cpl_table_get_int(drs_tab,"W_HW",ins_set,&check);
00266         w->fwhm=cpl_table_get_double(drs_tab,"W_FWHM",ins_set,&check);
00267         w->min_amp=cpl_table_get_double(drs_tab,"W_MIN_AMP",ins_set,&check);
00268     /*
00269         w->min_dif=cpl_table_get_double(drs_tab,"W_MIN_DIF",ins_set,&check);
00270         w->na_coef=cpl_table_get_int(drs_tab,"W_NA_COEFF",ins_set,&check);
00271         w->nb_coef=cpl_table_get_int(drs_tab,"W_NB_COEFF",ins_set,&check);
00272         w->pixel_tol=cpl_table_get_double(drs_tab,"W_PIX_TOL",ins_set,&check);
00273         w->y_box=cpl_table_get_double(drs_tab,"W_Y_BOX",ins_set,&check);
00274     */
00275         w->low_pos=cpl_table_get_int(drs_tab,"W_LOW_POS",ins_set,&check);
00276         w->hig_pos=cpl_table_get_int(drs_tab,"W_HI_POS",ins_set,&check);
00277 
00278     cfg -> guessBeginWavelength = w->wstart;
00279     cfg -> guessDispersion1 =  w->wgdisp1;
00280     cfg -> guessDispersion2 =  w->wgdisp2;
00281     cfg -> halfWidth =         w->hw;
00282     cfg -> fwhm =              w->fwhm;
00283     cfg -> minAmplitude =      w->min_amp;
00284     /*
00285     cfg -> mindiff =           w->min_dif;
00286     cfg -> nrDispCoefficients = w->na_coef;
00287     cfg -> nrCoefCoefficients = w->nb_coef;
00288     cfg -> pixel_tolerance =    w->pixel_tol;
00289     cfg -> yBox =               w->y_box;
00290     */
00291     cfg -> loPos =              DISTORTION_LOPOS;
00292     cfg -> hiPos =              DISTORTION_HIPOS;
00293     cfg -> pixel_tolerance =    w->pixel_tol;
00294         cfg-> diffTol = d->diff_tol[ins_set];
00295         cpl_msg_info(_id,"cfg -> guessBeginWavelength %g",cfg -> guessBeginWavelength);
00296         cpl_msg_info(_id,"cfg -> guessDispersion1 %g",cfg -> guessDispersion1);
00297         cpl_msg_info(_id,"cfg -> guessDispersion2 %g",cfg -> guessDispersion2);
00298         cpl_msg_info(_id,"cfg -> mindiff %g",cfg -> mindiff);
00299         cpl_msg_info(_id,"cfg -> halfWidth %d",cfg ->  halfWidth);
00300         cpl_msg_info(_id,"cfg -> fwhm %g",cfg -> fwhm);
00301         cpl_msg_info(_id,"cfg -> minAmplitude %g",cfg -> minAmplitude);
00302         cpl_msg_info(_id,"cfg -> nrDispCoefficients %d",cfg -> nrDispCoefficients);
00303         cpl_msg_info(_id,"cfg -> nrCoefCoefficients %d",cfg -> nrCoefCoefficients);
00304         cpl_msg_info(_id,"cfg -> pixel_tolerance  %g",cfg -> pixel_tolerance);
00305          cpl_msg_info(_id,"cfg -> loPos %d",cfg -> loPos);
00306         cpl_msg_info(_id,"cfg -> hiPos %d",cfg -> hiPos);
00307         cpl_msg_info(_id,"cfg -> yBox  %f",cfg -> yBox);
00308 
00309         distpar_delete(d);
00310     wcal_delete(w);
00311         cpl_table_delete(drs_tab);
00312         if(-1 == check_rec_status(_id,0)) {
00313       (*status)++;
00314       return;
00315     }
00316 
00317    } else {
00318     cpl_msg_error(_id,"Frame %s not found! Exit!", DRS_SETUP_WAVE);
00319         distpar_delete(d);
00320     wcal_delete(w);
00321         (*status)++;
00322         return;
00323    }
00324 
00325 
00326    nstp=nstpar_new();  
00327    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.ns_fwhm");
00328    if(cpl_parameter_get_default_flag(p) == 0) {
00329       cfg->nsfwhm=nstp->fwhm[ins_set];
00330    } else {
00331       cfg->nsfwhm=cpl_parameter_get_double(p);
00332    }
00333 
00334    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.min_diff");
00335    if(cpl_parameter_get_default_flag(p) == 0) {
00336      cfg->minDiff=nstp->min_dif[ins_set];
00337    } else {
00338      cfg->minDiff=cpl_parameter_get_double(p);
00339    }
00340    nstpar_delete(nstp);
00341    cpl_msg_info(_id,"cfg -> nsfwhm  %f",cfg -> nsfwhm);
00342    cpl_msg_info(_id,"cfg -> minDiff  %f",cfg -> minDiff);
00343 
00344 
00345    return;
00346 
00347 }
00348 
00349 
00350 
00351 static void     parse_section_findlines(finddist_config * cfg,cpl_parameterlist * cpl_cfg)
00352 {
00353 
00354    cpl_parameter* p;
00355 
00356    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.min_diff_mean_med_col_int");
00357    cfg -> mindiff =  cpl_parameter_get_double(p);
00358 
00359    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.half_width");
00360    cfg -> halfWidth = cpl_parameter_get_int(p);
00361 
00362    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.sigma");
00363    cfg -> sigma =  cpl_parameter_get_double(p);
00364 
00365    return ;
00366 
00367 }
00368 
00369 static void     parse_section_wavecalib(finddist_config * cfg,cpl_parameterlist * cpl_cfg)
00370 {
00371 
00372 
00373    cpl_parameter* p;
00374 
00375    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.fwhm");
00376    cfg -> fwhm =  cpl_parameter_get_double(p);
00377 
00378    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.min_amplitude");
00379    cfg -> minAmplitude =  cpl_parameter_get_double(p);
00380 
00381    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.max_residual");
00382    cfg -> maxResidual =  cpl_parameter_get_double(p);
00383 
00384    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.n_a_coefficients");
00385    cfg -> nrDispCoefficients = cpl_parameter_get_int(p);
00386 
00387    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.n_b_coefficients");
00388    cfg -> nrCoefCoefficients = cpl_parameter_get_int(p);
00389 
00390    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.sigma_factor");
00391    cfg -> sigmaFactor =  cpl_parameter_get_double(p);
00392 
00393 
00394    cfg -> nslitlets = NSLITLETS;
00395 
00396    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.pixel_dist");
00397    cfg -> pixeldist = cpl_parameter_get_int(p);
00398 
00399    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.pixel_tol");
00400    cfg -> pixel_tolerance = cpl_parameter_get_double(p);
00401 
00402 
00403 
00404 }
00405 
00406 static void     parse_section_wavemap(finddist_config * cfg,cpl_parameterlist * cpl_cfg)
00407 {
00408    cpl_parameter* p;
00409 
00410    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.mag_factor");
00411    cfg -> magFactor = cpl_parameter_get_int(p);
00412 
00413 }
00414 
00415 static void     parse_section_fitslits(finddist_config * cfg,cpl_parameterlist * cpl_cfg)
00416 {
00417 
00418    cpl_parameter* p;
00419 
00420    cfg -> loPos =  DISTORTION_LOPOS;
00421    cfg -> hiPos =  DISTORTION_HIPOS;
00422 
00423    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.box_length");
00424    cfg -> boxLength = cpl_parameter_get_int(p);
00425 
00426    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.y_box");
00427    cfg -> yBox = cpl_parameter_get_double(p);
00428 
00429    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.diff_tol");
00430    cfg -> diffTol =  cpl_parameter_get_double(p);
00431 
00432 }
00433 
00434 static void     
00435 parse_section_qclog      (finddist_config * cfg, cpl_parameterlist* cpl_cfg)
00436 {
00437    cpl_parameter* p;
00438 
00439    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.qc_thresh_min");
00440    cfg ->  qc_thresh_min = cpl_parameter_get_int(p);
00441 
00442 
00443    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.qc_thresh_max");
00444    cfg ->  qc_thresh_max = cpl_parameter_get_int(p);
00445 
00446 
00447 }
00448 
00449 
00450 static void     parse_section_northsouthtest(finddist_config * cfg,cpl_parameterlist * cpl_cfg)
00451 {
00452 
00453    cpl_parameter *p;   
00454    strcat(cfg -> fitsname, DISTORTION_NS_OUT_FILENAME);
00455 
00456    cfg -> nslits = NSLITLETS;
00457 
00458    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.ns_half_width");
00459    cfg -> nshalfWidth = cpl_parameter_get_int(p);
00460 
00461    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.ns_fwhm");
00462    cfg -> nsfwhm = cpl_parameter_get_double(p);
00463 
00464    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.min_diff");
00465    cfg -> minDiff = cpl_parameter_get_double(p);
00466 
00467    cfg -> estimated_dist = ESTIMATED_SLITLETS_DISTANCE;
00468 
00469    p = cpl_parameterlist_find(cpl_cfg, "sinfoni.distortion.dev_tol");
00470    cfg -> devtol = cpl_parameter_get_double(p);
00471 
00472    return ;
00473 
00474 }
00475 
00476 
00477 
00478 void
00479 finddist_free(finddist_config * cfg)
00480 {  
00481 
00482   finddist_cfg_destroy(cfg);
00483  
00484   return;
00485 
00486 }

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