00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "wavecal_ini_by_cpl.h"
00017
00018
00019
00020
00021
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
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
00074
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
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
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
00202
00203
00204
00205
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
00218
00219
00220
00221
00222
00223 cfg -> loPos = w->low_pos;
00224 cfg -> hiPos = w->hig_pos;
00225
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
00419
00420
00421
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