00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "finddist_ini_by_cpl.h"
00018
00019
00020
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
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
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
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
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
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
00270
00271
00272
00273
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
00286
00287
00288
00289
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 }