99 const char * filename,
100 cpl_frameset * allframes,
101 cpl_frameset * rawframes,
102 const cpl_parameterlist * parlist,
104 cpl_propertylist * main_qc_plist,
105 cpl_propertylist ** ext_plist,
106 const char * procatg,
109 cpl_table * idp_tab ;
110 const cpl_array * wlen_arr;
112 char * idp_filename ;
113 cpl_frame * out_frame ;
114 const cpl_frame * ref_frame ;
115 const char * ref_fname ;
116 cpl_propertylist * pri_head ;
117 cpl_propertylist * ext_head ;
118 double dit, exptime, texptime, mjd_start, mjd_end,
119 wmin, wmax, resol, spec_bin ;
120 const char * progid ;
121 const char * slitname ;
122 const char * setting ;
123 const char * poltype ;
124 int err, i, ndit, nframes, nraw, obid, nrows, ord ;
127 const cpl_parameter * param ;
128 int error_method = -1;
131 const char *nod_catg =
"OBS_NODDING_EXTRACT";
135 cpl_msg_info(__func__,
"Create IDPs for %s", filename) ;
137 idp_filename = cpl_sprintf(
"idp_%s", filename) ;
140 ref_frame = cpl_frameset_get_position_const(rawframes, 0) ;
141 ref_fname = cpl_frame_get_filename(ref_frame) ;
142 pri_head = cpl_propertylist_load(ref_fname, 0);
145 cr2res_qc_dup_mtrlgy_key(rawframes, pri_head);
148 ext_head = cpl_propertylist_new() ;
151 setting = cpl_propertylist_get_string(pri_head,
"ESO INS WLEN ID");
156 if (strncmp(procatg, nod_catg, strlen(nod_catg)) == 0)
159 param = cpl_parameterlist_find_const(parlist,
160 "cr2res.cr2res_obs_nodding.error_method");
161 if (strcmp(cpl_parameter_get_string(param),
"Horne") == 0)
162 error_method = CR2RES_EXTRACT_ERROR_HORNE;
164 error_method = CR2RES_EXTRACT_ERROR_POISSON;
167 if (strcmp(procatg, CR2RES_OBS_NODDING_EXTRACTC_IDP_PROCATG) == 0)
176 wlen_arr = cpl_table_get_array(idp_tab, CR2RES_IDP_COL_WAVE, 0);
177 nrows = cpl_array_get_size(wlen_arr);
178 wmin = cpl_array_get_double(wlen_arr, 0, &err) ;
179 wmax = cpl_array_get_double(wlen_arr, nrows-1, &err) ;
182 out_frame = cpl_frame_new();
183 cpl_frame_set_filename(out_frame, idp_filename);
184 cpl_frame_set_type(out_frame, CPL_FRAME_TYPE_ANY);
185 cpl_frame_set_group(out_frame, CPL_FRAME_GROUP_PRODUCT);
186 cpl_frame_set_level(out_frame, CPL_FRAME_LEVEL_FINAL);
189 cpl_frame_set_tag(out_frame, procatg);
190 cpl_propertylist_append_string(pri_head, CPL_DFS_PRO_CATG, procatg);
193 cpl_propertylist_append_string(pri_head, CR2RES_HEADER_DRS_TYPE,
194 CR2RES_EXTRACT_1D_IDP_DRSTYPE) ;
196 if (!strcmp(recipe,
"cr2res_obs_nodding")) {
197 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"NODDING") ;
199 else if (!strcmp(recipe,
"cr2res_obs_staring")) {
200 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"STARING") ;
202 else if (!strcmp(recipe,
"cr2res_obs_2d")) {
203 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"GENERIC_OFFSET") ;
205 else if (!strcmp(recipe,
"cr2res_obs_pol")) {
206 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"POLARIMETRY") ;
208 cpl_propertylist_set_comment(pri_head,
"OBSTECH",
209 "Technique of observation") ;
212 if (cpl_propertylist_has(pri_head,
"RADECSYS")) {
213 if (!cpl_propertylist_has(pri_head,
"RADESYS")) {
214 const cpl_property *_property =
215 cpl_propertylist_get_property_const(pri_head,
"RADECSYS");
216 cpl_property *
property = cpl_property_duplicate(_property);
217 cpl_property_set_name(property,
"RADESYS");
218 cpl_propertylist_append_property(pri_head, property);
219 cpl_property_delete(property);
221 cpl_propertylist_erase(pri_head,
"RADECSYS");
224 cpl_dfs_setup_product_header(pri_head, out_frame, allframes,
225 parlist, recipe, VERSION,
"PRO-1.16", ref_frame);
229 if (cpl_propertylist_has(pri_head,
"ESO INS FILT1 NAME")) {
230 cpl_propertylist_update_string(pri_head,
"FILTER",
231 cpl_propertylist_get_string(pri_head,
"ESO INS FILT1 ID")) ;
232 cpl_propertylist_set_comment(pri_head,
"FILTER",
240 nframes = cpl_frameset_get_size(rawframes);
243 cpl_errorstate tempes = cpl_errorstate_get();
245 for (i = 1; i <= nframes; i++) {
247 keyname = cpl_sprintf(
"ESO PRO REC1 RAW%d NAME", i);
248 fname = cpl_propertylist_get_string(pri_head, keyname);
251 keyname = cpl_sprintf(
"PROV%d", i);
252 cpl_propertylist_update_string(pri_head, keyname, fname);
258 cpl_errorstate_set(tempes);
261 if (ext_plist[0] != NULL)
262 cpl_propertylist_copy_property_regexp(ext_head, ext_plist[0],
"QC*", 0);
264 cpl_propertylist_update_int(pri_head,
"NCOMBINE", nraw);
265 exptime = dit * ndit * nraw;
266 cpl_propertylist_update_double(pri_head,
"EXPTIME", exptime);
267 cpl_propertylist_set_comment(pri_head,
"EXPTIME",
268 "[s] Total integration time per pixel");
271 cpl_propertylist_update_double(pri_head,
"TEXPTIME", texptime);
272 cpl_propertylist_set_comment(pri_head,
"TEXPTIME",
273 "[s] Total integration time of exposures");
276 if (mjd_start > 0.0) {
277 cpl_propertylist_update_double(pri_head,
"MJD-OBS", mjd_start) ;
278 cpl_propertylist_set_comment(pri_head,
"MJD-OBS",
279 "[d] Start of observations (days)");
282 cpl_propertylist_update_double(pri_head,
"MJD-END", mjd_end) ;
283 cpl_propertylist_set_comment(pri_head,
"MJD-END",
284 "[d] End of observations (days)");
287 if (mjd_end > 0 && mjd_start > 0) {
288 cpl_propertylist_update_double(ext_head,
"TELAPSE",
289 (mjd_end-mjd_start)*24*3600) ;
290 cpl_propertylist_set_comment(ext_head,
"TELAPSE",
291 "Total elapsed time in seconds [s]") ;
293 cpl_propertylist_update_double(ext_head,
"TMID",
294 (mjd_end+mjd_start)/2.0) ;
295 cpl_propertylist_set_comment(ext_head,
"TMID",
296 "Exposure midpoint [MJD]") ;
300 cpl_propertylist_update_string(pri_head,
"PROG_ID", progid) ;
301 cpl_propertylist_set_comment(pri_head,
"PROG_ID",
302 "ESO programme identification");
305 cpl_propertylist_update_int(pri_head,
"OBID1", obid);
306 cpl_propertylist_set_comment(pri_head,
"OBID1",
"Observation block ID");
308 if (!strcmp(recipe,
"cr2res_obs_2d"))
309 cpl_propertylist_update_bool(pri_head,
"EXT_OBJ", 1) ;
311 cpl_propertylist_update_bool(pri_head,
"EXT_OBJ", 0) ;
312 cpl_propertylist_set_comment(pri_head,
"EXT_OBJ",
313 "True for extended objects, cr2res_obs_2d was used") ;
315 cpl_propertylist_update_string(pri_head,
"FLUXCAL",
"UNCALIBRATED") ;
316 cpl_propertylist_set_comment(pri_head,
"FLUXCAL",
317 "Type of flux calibration");
319 cpl_propertylist_update_int(pri_head,
"FLUXERR", -1) ;
320 cpl_propertylist_set_comment(pri_head,
"FLUXERR",
321 "Fractional uncertainty [%%] on the flux scale");
323 cpl_propertylist_update_bool(pri_head,
"TOT_FLUX", 0) ;
324 cpl_propertylist_set_comment(pri_head,
"TOT_FLUX",
325 "True if flux data represent the total source flux.");
330 if ( cpl_frameset_find_const(allframes,
331 CR2RES_CAL_FLAT_EXTRACT_1D_PROCATG) != NULL) {
332 cpl_propertylist_update_bool(pri_head,
"CONTNORM", 0) ;
334 cpl_propertylist_update_bool(pri_head,
"CONTNORM", 0) ;
336 cpl_propertylist_set_comment(pri_head,
"CONTNORM",
337 "TRUE if the spectrum has been divided by the blaze") ;
340 cpl_propertylist_update_string(pri_head,
"SPECSYS",
"TOPOCENT") ;
341 cpl_propertylist_set_comment(pri_head,
"SPECSYS",
342 "Frame of reference for spectral coordinates");
344 cpl_propertylist_update_string(pri_head,
"PROCSOFT",
345 PACKAGE
"/" PACKAGE_VERSION) ;
346 cpl_propertylist_set_comment(pri_head,
"PROCSOFT",
"ESO pipeline version");
348 cpl_propertylist_update_string(pri_head,
"REFERENC",
"") ;
349 cpl_propertylist_set_comment(pri_head,
"REFERENC",
"Reference publication");
351 cpl_propertylist_update_string(pri_head,
"PRODCATG",
"SCIENCE.SPECTRUM") ;
352 cpl_propertylist_set_comment(pri_head,
"PRODCATG",
"Data product category");
355 cpl_propertylist_update_double(pri_head,
"WAVELMIN", wmin) ;
356 cpl_propertylist_set_comment(pri_head,
"WAVELMIN",
357 "Minimum Wavelength [nm]") ;
359 cpl_propertylist_update_double(pri_head,
"WAVELMAX", wmax) ;
360 cpl_propertylist_set_comment(pri_head,
"WAVELMAX",
361 "Maximum Wavelength [nm]") ;
363 cpl_propertylist_update_double(pri_head,
"SPEC_VAL", (wmax+wmin)/2.0) ;
364 cpl_propertylist_set_comment(pri_head,
"SPEC_VAL",
365 "Characteristic spectral coordinate value [nm]") ;
367 cpl_propertylist_update_double(pri_head,
"SPEC_BW", wmax-wmin) ;
368 cpl_propertylist_set_comment(pri_head,
"SPEC_BW",
369 "Width of the spectrum [nm]") ;
371 cpl_propertylist_update_string(pri_head,
"SPECSYS",
"TOPOCENT") ;
372 cpl_propertylist_set_comment(pri_head,
"SPECSYS",
375 tmp_arr = cpl_array_new(cpl_array_get_size(wlen_arr)-1, CPL_TYPE_DOUBLE);
376 for (i=1; i<cpl_array_get_size(wlen_arr);i++){
377 cpl_array_set_double(tmp_arr, i-1,
378 cpl_array_get_double(wlen_arr,i, NULL)-
379 cpl_array_get_double(wlen_arr,i-1, NULL)
382 spec_bin = cpl_array_get_median(tmp_arr);
383 cpl_array_delete(tmp_arr);
384 cpl_propertylist_update_double(pri_head,
"SPEC_BIN", spec_bin) ;
385 cpl_propertylist_set_comment(pri_head,
"SPEC_BIN",
386 "Median spectral bin width [nm]") ;
388 slitname = cpl_propertylist_get_string(pri_head,
"ESO INS SLIT1 ID");
389 if (!strcmp(slitname,
"w_0.2")) {
390 cpl_propertylist_update_double(ext_head,
"APERTURE", 5.5555555E-5) ;
391 cpl_propertylist_update_double(pri_head,
"SPEC_RES", SPEC_RESOL_SLIT02);
393 else if (!strcmp(slitname,
"w_0.4")) {
395 cpl_propertylist_update_double(ext_head,
"APERTURE", 1.1111111E-4) ;
396 cpl_propertylist_update_double(pri_head,
"SPEC_RES", SPEC_RESOL_SLIT04);
398 cpl_propertylist_set_comment(ext_head,
"APERTURE",
399 "Slit width in deg") ;
400 cpl_propertylist_set_comment(pri_head,
"SPEC_RES",
401 "Nominal resolving power for the given slit");
404 tmp_arr = cpl_array_new(12*CR2RES_NB_DETECTORS, CPL_TYPE_DOUBLE);
405 cpl_array * tmp_arr_sig = cpl_array_new(CR2RES_NB_DETECTORS, CPL_TYPE_DOUBLE);
406 for (i=0; i<CR2RES_NB_DETECTORS; i++){
407 resol = cpl_propertylist_get_double(ext_plist[i], CR2RES_HEADER_QC_SIGNAL);
411 cpl_array_set_double(tmp_arr_sig, i, resol);
413 for (ord=0; ord < 12; ord++){
414 keyname = cpl_sprintf(CR2RES_HEADER_QC_SNR, ord+1);
415 resol = cpl_propertylist_get_double(ext_plist[i], keyname);
425 double perr = cpl_array_get_double(tmp_arr_sig, i, NULL) / resol;
426 double corr = sqrt(pow(2.08*perr,2) + nab*25.2*25.2) / perr;
427 cpl_array_set_double(tmp_arr, ord + (i*12),resol/corr);
429 cpl_propertylist_update_double(ext_head, keyname, resol/corr) ;
435 cpl_propertylist_update_double(pri_head,
"SNR",
436 cpl_array_get_median(tmp_arr)) ;
437 cpl_propertylist_set_comment(pri_head,
"SNR",
438 "Median signal-to-noise in all detector-orders");
439 cpl_array_delete(tmp_arr);
441 if (!strcmp(recipe,
"cr2res_obs_pol")) {
444 tmp_string = cpl_sprintf(
"/I/%s/",poltype);
445 cpl_propertylist_update_string(pri_head,
"STOKES", tmp_string);
446 cpl_free(tmp_string);
450 cpl_propertylist_erase_regexp(pri_head,
"ASSO*", 0);
453 if (main_qc_plist != NULL) {
454 cpl_propertylist_copy_property_regexp(pri_head, main_qc_plist,
"QC*",
459 cpl_propertylist_save(pri_head, idp_filename, CPL_IO_CREATE);
463 cpl_propertylist_update_string(ext_head,
"EXTNAME",
"SPECTRUM") ;
465 cpl_propertylist_update_double(ext_head,
"RA",
466 cpl_propertylist_get_double(pri_head,
"RA"));
467 cpl_propertylist_set_comment(ext_head,
"RA",
468 cpl_propertylist_get_comment(pri_head,
"RA"));
469 cpl_propertylist_update_double(ext_head,
"DEC",
470 cpl_propertylist_get_double(pri_head,
"DEC"));
471 cpl_propertylist_set_comment(ext_head,
"DEC",
472 cpl_propertylist_get_comment(pri_head,
"DEC"));
473 cpl_propertylist_update_string(ext_head,
"OBJECT",
474 cpl_propertylist_get_string(pri_head,
"OBJECT"));
475 cpl_propertylist_set_comment(ext_head,
"OBJECT",
476 cpl_propertylist_get_comment(pri_head,
"OBJECT"));
477 tmp_string = cpl_sprintf(
"%s_%d_%s",
478 cpl_propertylist_get_string(pri_head,
"OBJECT"),
480 cpl_propertylist_get_string(pri_head,
"DATE-OBS"));
482 replace_spaces_with_underscores(tmp_string);
484 cpl_propertylist_update_string(ext_head,
"TITLE", tmp_string);
485 cpl_free(tmp_string);
486 cpl_propertylist_set_comment(ext_head,
"TITLE",
489 cpl_propertylist_update_double(ext_head,
"SPEC_VAL", (wmax+wmin)/2.0) ;
490 cpl_propertylist_set_comment(ext_head,
"SPEC_VAL",
491 "Characteristic spectral coordinate value [nm]") ;
492 cpl_propertylist_update_double(ext_head,
"SPEC_BW", wmax-wmin) ;
493 cpl_propertylist_set_comment(ext_head,
"SPEC_BW",
494 "Width of the spectrum [nm]") ;
496 cpl_propertylist_update_string(ext_head,
"VOPUB",
"ESO/SAF") ;
497 cpl_propertylist_set_comment(ext_head,
"VOPUB",
"VO Publishing Authority") ;
498 cpl_propertylist_update_string(ext_head,
"VOCLASS",
"SPECTRUM V1.0") ;
499 cpl_propertylist_set_comment(ext_head,
"VOCLASS",
500 "Data Model name and version") ;
501 cpl_propertylist_update_int(ext_head,
"NELEM", nrows) ;
502 cpl_propertylist_set_comment(ext_head,
"NELEM",
"Length of the data array");
504 cpl_propertylist_update_string(ext_head,
"TUTYP1",
505 "spec:Data.SpectralAxis.Value");
506 cpl_propertylist_update_string(ext_head,
"TUCD1",
"em.wl");
507 cpl_propertylist_update_double(ext_head,
"TDMIN1", wmin);
508 cpl_propertylist_update_double(ext_head,
"TDMAX1", wmax);
510 cpl_propertylist_update_string(ext_head,
"TUTYP2",
511 "spec:Data.FluxAxis.Value");
512 cpl_propertylist_update_string(ext_head,
"TUCD2",
513 "phot.flux.density;em.wl;stat.uncalib");
515 cpl_propertylist_update_string(ext_head,
"TUTYP3",
516 "spec:Data.FluxAxis.Accuracy.StatError");
517 cpl_propertylist_update_string(ext_head,
"TUCD3",
518 "stat.error;phot.flux.density;em.wl;stat.uncalib");
520 cpl_propertylist_update_string(ext_head,
"TUTYP4",
521 "spec:Data.FluxAxis.Accuracy.QualityStatus");
522 cpl_propertylist_update_string(ext_head,
"TUCD4",
525 cpl_propertylist_update_string(ext_head,
"TUTYP5",
527 cpl_propertylist_update_string(ext_head,
"TUCD5",
530 cpl_propertylist_update_string(ext_head,
"TUTYP6",
532 cpl_propertylist_update_string(ext_head,
"TUCD6",
533 "meta.number;instr.det");
535 if (!strcmp(recipe,
"cr2res_obs_pol")) {
536 cpl_propertylist_update_string(ext_head,
"TUTYP7",
"");
537 tmp_string = cpl_sprintf(
"phot.count;phys.polarization.stokes.%s",
539 cpl_propertylist_update_string(ext_head,
"TUCD7", tmp_string);
540 cpl_free(tmp_string);
542 cpl_propertylist_update_string(ext_head,
"TUTYP8",
"");
543 tmp_string = cpl_sprintf(
"stat.error;phys.polarization.stokes.%s",
545 cpl_propertylist_update_string(ext_head,
"TUCD8", tmp_string);
546 cpl_free(tmp_string);
548 cpl_propertylist_update_string(ext_head,
"TUTYP7",
550 cpl_propertylist_update_string(ext_head,
"TUCD7",
551 "pos.cartesian.x;instr.det");
553 cpl_propertylist_update_string(ext_head,
"TUTYP8",
555 cpl_propertylist_update_string(ext_head,
"TUCD8",
567 cpl_propertylist_erase(ext_head,
"CRDER3");
568 cpl_propertylist_erase(ext_head,
"CUNIT3");
569 cpl_propertylist_erase(ext_head,
"BUNIT");
570 cpl_propertylist_erase(ext_head,
"CTYPE1");
571 cpl_propertylist_erase(ext_head,
"CUNIT2");
572 cpl_propertylist_erase(ext_head,
"CSYER1");
573 cpl_propertylist_erase(ext_head,
"CSYER2");
574 cpl_propertylist_erase(ext_head,
"CDELT1");
575 cpl_propertylist_erase(ext_head,
"CRPIX1");
576 cpl_propertylist_erase(ext_head,
"CRVAL1");
577 cpl_propertylist_erase(ext_head,
"CUNIT1");
581 cpl_table_save(idp_tab, NULL, ext_head, idp_filename, CPL_IO_EXTEND) ;
584 cpl_frameset_insert(allframes, out_frame);
587 cpl_free(idp_filename) ;
588 cpl_table_delete(idp_tab) ;
589 cpl_propertylist_delete(pri_head) ;
590 cpl_propertylist_delete(ext_head) ;
605 const char * setting,
609 cpl_table * idp_tab ;
610 cpl_table * tmp_tab ;
611 cpl_array * col_names ;
612 const char * col_name ;
615 cpl_propertylist * sort_list ;
616 int order, trace_nb ;
617 cpl_size i, j, ntot, ncols, nrows, nb_selected ;
620 if (tables == NULL)
return NULL ;
624 for (i=0 ; i<CR2RES_NB_DETECTORS ; i++) {
625 if (tables[i] != NULL) {
626 col_names = cpl_table_get_column_names(tables[i]);
627 ncols = cpl_table_get_ncol(tables[i]) ;
628 if (strcmp(recipe,
"cr2res_obs_pol")) {
629 for (j=0 ; j<ncols ; j++) {
630 col_name = cpl_array_get_string(col_names, j);
633 if (col_kind != NULL &&
634 !strcmp(col_kind, CR2RES_COL_SPEC_SUFFIX)) {
636 ntot += cpl_table_get_nrow(tables[i]) ;
638 if (col_kind != NULL) cpl_free(col_kind) ;
641 for (j=0 ; j<ncols ; j++) {
642 col_name = cpl_array_get_string(col_names, j);
645 if (col_kind != NULL &&
646 !strcmp(col_kind, CR2RES_COL_POL_INTENS_SUFFIX)) {
648 ntot += cpl_table_get_nrow(tables[i]) ;
650 if (col_kind != NULL) cpl_free(col_kind) ;
653 cpl_array_delete(col_names) ;
656 cpl_msg_info(__func__,
"Found %lld total rows.", ntot);
659 tmp_tab = cpl_table_new(ntot) ;
660 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_WAVE, CPL_TYPE_DOUBLE);
661 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_FLUX, CPL_TYPE_DOUBLE);
662 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_ERR, CPL_TYPE_DOUBLE);
663 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_QUAL, CPL_TYPE_INT);
664 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_ORDER, CPL_TYPE_INT);
665 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_DETEC, CPL_TYPE_INT);
666 if (strcmp(recipe,
"cr2res_obs_pol")) {
667 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_XPOS, CPL_TYPE_INT);
668 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_TRACE, CPL_TYPE_INT);
670 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_STOKES, CPL_TYPE_DOUBLE);
671 cpl_table_new_column(tmp_tab,
672 CR2RES_IDP_COL_STOKESERR, CPL_TYPE_DOUBLE);
678 for (i=0 ; i<CR2RES_NB_DETECTORS ; i++) {
679 if (tables[i] != NULL) {
680 col_names = cpl_table_get_column_names(tables[i]);
681 ncols = cpl_table_get_ncol(tables[i]) ;
682 if (strcmp(recipe,
"cr2res_obs_pol")) {
683 for (j=0 ; j<ncols ; j++) {
684 col_name = cpl_array_get_string(col_names, j);
687 if (col_kind != NULL &&
688 !strcmp(col_kind, CR2RES_COL_SPEC_SUFFIX)) {
690 cr2res_idp_copy_spec(tmp_tab, tables[i], ntot, i+1,
691 order, trace_nb, setting, error_method, nab); ;
692 ntot += cpl_table_get_nrow(tables[i]) ;
694 if (col_kind != NULL) cpl_free(col_kind) ;
697 for (j=0 ; j<ncols ; j++) {
698 col_name = cpl_array_get_string(col_names, j);
700 if (col_kind != NULL &&
701 !strcmp(col_kind, CR2RES_COL_POL_INTENS_SUFFIX)) {
702 cr2res_idp_copy_pol(tmp_tab, tables[i], ntot, i + 1,
704 ntot += cpl_table_get_nrow(tables[i]) ;
706 if (col_kind != NULL) cpl_free(col_kind) ;
709 cpl_array_delete(col_names) ;
713 cpl_table_unselect_all(tmp_tab) ;
715 for (ii = 0; ii < ntot; ii++) {
717 wave = cpl_table_get_double(tmp_tab,CR2RES_IDP_COL_WAVE,ii, NULL) ;
719 cpl_table_select_row(tmp_tab, ii) ;
722 cpl_table_erase_selected(tmp_tab) ;
726 sort_list = cpl_propertylist_new() ;
727 cpl_propertylist_append_bool(sort_list, CR2RES_IDP_COL_WAVE, 0) ;
729 cpl_table_sort(tmp_tab, sort_list) ;
730 cpl_propertylist_delete(sort_list) ;
732 cpl_table_unselect_all(tmp_tab) ;
735 for (ii = 0; ii < ntot; ii++) {
736 cpl_table_get_double(tmp_tab,CR2RES_IDP_COL_WAVE,ii, &flag) ;
738 cpl_table_select_row(tmp_tab, ii);
742 for (i = ii+1; i < ntot; i++) {
743 double cur_val, pre_val;
745 pre_val = cpl_table_get_double(tmp_tab,CR2RES_IDP_COL_WAVE,i-1, NULL);
746 cur_val = cpl_table_get_double(tmp_tab,CR2RES_IDP_COL_WAVE,i, &flag) ;
747 if (fabs(pre_val-cur_val) < 1e-3 || flag) {
748 cpl_table_select_row(tmp_tab, i) ;
752 nb_selected = cpl_table_count_selected(tmp_tab) ;
753 if (nb_selected > 0) {
754 cpl_msg_info(__func__,
755 "IDP Creation - Double defined WLs : %"CPL_SIZE_FORMAT,
758 cpl_table_erase_selected(tmp_tab) ;
761 col_names = cpl_table_get_column_names(tmp_tab);
762 ncols = cpl_table_get_ncol(tmp_tab);
763 nrows = cpl_table_get_nrow(tmp_tab);
764 idp_tab = cpl_table_new(1);
765 for (j = 0; j < ncols; j++) {
767 col_name = cpl_array_get_string(col_names, j);
768 cpl_msg_debug(__func__,
"colname: %s", col_name);
769 col_type = cpl_table_get_column_type(tmp_tab, col_name);
770 tmp_arr = cpl_array_new(nrows, col_type);
771 if (col_type==CPL_TYPE_DOUBLE){
772 cpl_array_copy_data_double(tmp_arr,
773 cpl_table_get_data_double_const(tmp_tab, col_name));
774 }
else if (col_type==CPL_TYPE_INT){
775 cpl_array_copy_data_int(tmp_arr,
776 cpl_table_get_data_int_const(tmp_tab, col_name));
778 cpl_table_new_column_array(idp_tab, col_name, col_type, nrows);
779 cpl_table_set_array(idp_tab, col_name, 0, tmp_arr);
780 cpl_array_delete(tmp_arr);
782 cpl_array_delete(col_names) ;
783 cpl_table_delete(tmp_tab);
787 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_WAVE,
"nm") ;
788 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_DETEC,
" ") ;
789 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_ORDER,
" ") ;
790 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_QUAL,
" ") ;
791 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_FLUX,
"adu") ;
792 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_ERR,
"adu") ;
793 if (strcmp(recipe,
"cr2res_obs_pol")) {
794 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_TRACE,
" ") ;
795 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_XPOS,
"pixel") ;
797 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_STOKES,
" ") ;
798 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_STOKESERR,
" ") ;