33#include "cr2res_idp.h"
34#include "cr2res_pfits.h"
35#include "cr2res_utils.h"
36#include "cr2res_dfs.h"
44static int cr2res_idp_copy_spec(
47 cpl_size out_start_idx,
51 const char * setting) ;
52static int cr2res_idp_copy_pol(
55 cpl_size out_start_idx,
58 const char * setting) ;
83 const char * filename,
84 cpl_frameset * allframes,
85 cpl_frameset * rawframes,
86 const cpl_parameterlist * parlist,
88 cpl_propertylist * main_qc_plist,
89 cpl_propertylist ** ext_plist,
94 const cpl_array * wlen_arr;
97 cpl_frame * out_frame ;
98 const cpl_frame * ref_frame ;
99 const char * ref_fname ;
100 cpl_propertylist * pri_head ;
101 cpl_propertylist * ext_head ;
102 double dit, exptime, texptime, mjd_start, mjd_end,
103 wmin, wmax, resol, spec_bin ;
104 const char * progid ;
105 const char * slitname ;
106 const char * setting ;
107 const char * poltype ;
108 int err, i, ndit, nframes, nraw, obid, nrows, ord ;
114 cpl_msg_info(__func__,
"Create IDPs for %s", filename) ;
116 idp_filename = cpl_sprintf(
"idp_%s", filename) ;
119 ref_frame = cpl_frameset_get_position_const(rawframes, 0) ;
120 ref_fname = cpl_frame_get_filename(ref_frame) ;
121 pri_head = cpl_propertylist_load(ref_fname, 0);
124 cr2res_qc_dup_mtrlgy_key(rawframes, pri_head);
127 ext_head = cpl_propertylist_new() ;
130 setting = cpl_propertylist_get_string(pri_head,
"ESO INS WLEN ID");
136 wlen_arr = cpl_table_get_array(idp_tab, CR2RES_IDP_COL_WAVE, 0);
137 nrows = cpl_array_get_size(wlen_arr);
138 wmin = cpl_array_get_double(wlen_arr, 0, &err) ;
139 wmax = cpl_array_get_double(wlen_arr, nrows-1, &err) ;
142 out_frame = cpl_frame_new();
143 cpl_frame_set_filename(out_frame, idp_filename);
144 cpl_frame_set_type(out_frame, CPL_FRAME_TYPE_ANY);
145 cpl_frame_set_group(out_frame, CPL_FRAME_GROUP_PRODUCT);
146 cpl_frame_set_level(out_frame, CPL_FRAME_LEVEL_FINAL);
149 cpl_frame_set_tag(out_frame, procatg);
150 cpl_propertylist_append_string(pri_head, CPL_DFS_PRO_CATG, procatg);
153 cpl_propertylist_append_string(pri_head, CR2RES_HEADER_DRS_TYPE,
154 CR2RES_EXTRACT_1D_IDP_DRSTYPE) ;
156 if (!strcmp(recipe,
"cr2res_obs_nodding")) {
157 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"NODDING") ;
159 else if (!strcmp(recipe,
"cr2res_obs_staring")) {
160 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"STARING") ;
162 else if (!strcmp(recipe,
"cr2res_obs_2d")) {
163 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"GENERIC_OFFSET") ;
165 else if (!strcmp(recipe,
"cr2res_obs_pol")) {
166 cpl_propertylist_update_string(pri_head,
"OBSTECH",
"POLARIMETRY") ;
168 cpl_propertylist_set_comment(pri_head,
"OBSTECH",
169 "Technique of observation") ;
172 if (cpl_propertylist_has(pri_head,
"RADECSYS")) {
173 if (!cpl_propertylist_has(pri_head,
"RADESYS")) {
174 const cpl_property *_property =
175 cpl_propertylist_get_property_const(pri_head,
"RADECSYS");
176 cpl_property *
property = cpl_property_duplicate(_property);
177 cpl_property_set_name(property,
"RADESYS");
178 cpl_propertylist_append_property(pri_head, property);
179 cpl_property_delete(property);
181 cpl_propertylist_erase(pri_head,
"RADECSYS");
184 cpl_dfs_setup_product_header(pri_head, out_frame, allframes,
185 parlist, recipe, VERSION,
"PRO-1.16", ref_frame);
189 if (cpl_propertylist_has(pri_head,
"ESO INS FILT1 NAME")) {
190 cpl_propertylist_update_string(pri_head,
"FILTER",
191 cpl_propertylist_get_string(pri_head,
"ESO INS FILT1 ID")) ;
192 cpl_propertylist_set_comment(pri_head,
"FILTER",
200 nframes = cpl_frameset_get_size(rawframes);
203 cpl_errorstate tempes = cpl_errorstate_get();
205 for (i = 1; i <= nframes; i++) {
207 keyname = cpl_sprintf(
"ESO PRO REC1 RAW%d NAME", i);
208 fname = cpl_propertylist_get_string(pri_head, keyname);
211 keyname = cpl_sprintf(
"PROV%d", i);
212 cpl_propertylist_update_string(pri_head, keyname, fname);
218 cpl_errorstate_set(tempes);
220 cpl_propertylist_update_int(pri_head,
"NCOMBINE", nraw);
221 exptime = dit * ndit * nraw;
222 cpl_propertylist_update_double(pri_head,
"EXPTIME", exptime);
223 cpl_propertylist_set_comment(pri_head,
"EXPTIME",
224 "[s] Total integration time per pixel");
227 cpl_propertylist_update_double(pri_head,
"TEXPTIME", texptime);
228 cpl_propertylist_set_comment(pri_head,
"TEXPTIME",
229 "[s] Total integration time of exposures");
232 if (mjd_start > 0.0) {
233 cpl_propertylist_update_double(pri_head,
"MJD-OBS", mjd_start) ;
234 cpl_propertylist_set_comment(pri_head,
"MJD-OBS",
235 "[d] Start of observations (days)");
238 cpl_propertylist_update_double(pri_head,
"MJD-END", mjd_end) ;
239 cpl_propertylist_set_comment(pri_head,
"MJD-END",
240 "[d] End of observations (days)");
243 if (mjd_end > 0 && mjd_start > 0) {
244 cpl_propertylist_update_double(ext_head,
"TELAPSE",
245 (mjd_end-mjd_start)*24*3600) ;
246 cpl_propertylist_set_comment(ext_head,
"TELAPSE",
247 "Total elapsed time in seconds [s]") ;
249 cpl_propertylist_update_double(ext_head,
"TMID",
250 (mjd_end+mjd_start)/2.0) ;
251 cpl_propertylist_set_comment(ext_head,
"TMID",
252 "Exposure midpoint [MJD]") ;
256 cpl_propertylist_update_string(pri_head,
"PROG_ID", progid) ;
257 cpl_propertylist_set_comment(pri_head,
"PROG_ID",
258 "ESO programme identification");
261 cpl_propertylist_update_int(pri_head,
"OBID1", obid);
262 cpl_propertylist_set_comment(pri_head,
"OBID1",
"Observation block ID");
264 if (!strcmp(recipe,
"cr2res_obs_2d"))
265 cpl_propertylist_update_bool(pri_head,
"EXT_OBJ", 1) ;
267 cpl_propertylist_update_bool(pri_head,
"EXT_OBJ", 0) ;
268 cpl_propertylist_set_comment(pri_head,
"EXT_OBJ",
269 "True for extended objects, cr2res_obs_2d was used") ;
271 cpl_propertylist_update_string(pri_head,
"FLUXCAL",
"UNCALIBRATED") ;
272 cpl_propertylist_set_comment(pri_head,
"FLUXCAL",
273 "Type of flux calibration");
275 cpl_propertylist_update_int(pri_head,
"FLUXERR", -1) ;
276 cpl_propertylist_set_comment(pri_head,
"FLUXERR",
277 "Fractional uncertainty [%%] on the flux scale");
279 cpl_propertylist_update_bool(pri_head,
"TOT_FLUX", 0) ;
280 cpl_propertylist_set_comment(pri_head,
"TOT_FLUX",
281 "True if flux data represent the total source flux.");
284 if ( cpl_frameset_find_const(allframes,
285 CR2RES_CAL_FLAT_EXTRACT_1D_PROCATG) != NULL) {
286 cpl_propertylist_update_bool(pri_head,
"CONTNORM", 1) ;
288 cpl_propertylist_update_bool(pri_head,
"CONTNORM", 0) ;
290 cpl_propertylist_set_comment(pri_head,
"CONTNORM",
291 "TRUE if the spectrum has been divided by the blaze") ;
294 cpl_propertylist_update_string(pri_head,
"SPECSYS",
"TOPOCENT") ;
295 cpl_propertylist_set_comment(pri_head,
"SPECSYS",
296 "Frame of reference for spectral coordinates");
298 cpl_propertylist_update_string(pri_head,
"PROCSOFT",
299 PACKAGE
"/" PACKAGE_VERSION) ;
300 cpl_propertylist_set_comment(pri_head,
"PROCSOFT",
"ESO pipeline version");
302 cpl_propertylist_update_string(pri_head,
"REFERENC",
"") ;
303 cpl_propertylist_set_comment(pri_head,
"REFERENC",
"Reference publication");
305 cpl_propertylist_update_string(pri_head,
"PRODCATG",
"SCIENCE.SPECTRUM") ;
306 cpl_propertylist_set_comment(pri_head,
"PRODCATG",
"Data product category");
309 cpl_propertylist_update_double(pri_head,
"WAVELMIN", wmin) ;
310 cpl_propertylist_set_comment(pri_head,
"WAVELMIN",
311 "Minimum Wavelength [nm]") ;
313 cpl_propertylist_update_double(pri_head,
"WAVELMAX", wmax) ;
314 cpl_propertylist_set_comment(pri_head,
"WAVELMAX",
315 "Maximum Wavelength [nm]") ;
317 cpl_propertylist_update_double(pri_head,
"SPEC_VAL", (wmax+wmin)/2.0) ;
318 cpl_propertylist_set_comment(pri_head,
"SPEC_VAL",
319 "Characteristic spectral coordinate value [nm]") ;
321 cpl_propertylist_update_double(pri_head,
"SPEC_BW", wmax-wmin) ;
322 cpl_propertylist_set_comment(pri_head,
"SPEC_BW",
323 "Width of the spectrum [nm]") ;
325 cpl_propertylist_update_string(pri_head,
"SPECSYS",
"TOPOCENT") ;
326 cpl_propertylist_set_comment(pri_head,
"SPECSYS",
329 tmp_arr = cpl_array_new(cpl_array_get_size(wlen_arr)-1, CPL_TYPE_DOUBLE);
330 for (i=1; i<cpl_array_get_size(wlen_arr);i++){
331 cpl_array_set_double(tmp_arr, i-1,
332 cpl_array_get_double(wlen_arr,i, NULL)-
333 cpl_array_get_double(wlen_arr,i-1, NULL)
336 spec_bin = cpl_array_get_median(tmp_arr);
337 cpl_array_delete(tmp_arr);
338 cpl_propertylist_update_double(pri_head,
"SPEC_BIN", spec_bin) ;
339 cpl_propertylist_set_comment(pri_head,
"SPEC_BIN",
340 "Median spectral bin width [nm]") ;
342 slitname = cpl_propertylist_get_string(pri_head,
"ESO INS SLIT1 ID");
343 if (!strcmp(slitname,
"w_0.2")) {
344 cpl_propertylist_update_double(ext_head,
"APERTURE", 5.5555555E-5) ;
345 cpl_propertylist_update_double(pri_head,
"SPEC_RES", SPEC_RESOL_SLIT02);
347 else if (!strcmp(slitname,
"w_0.4")) {
349 cpl_propertylist_update_double(ext_head,
"APERTURE", 1.1111111E-4) ;
350 cpl_propertylist_update_double(pri_head,
"SPEC_RES", SPEC_RESOL_SLIT04);
352 cpl_propertylist_set_comment(ext_head,
"APERTURE",
353 "Slit width in deg") ;
354 cpl_propertylist_set_comment(pri_head,
"SPEC_RES",
355 "Nominal resolving power for the given slit");
358 tmp_arr = cpl_array_new(12*CR2RES_NB_DETECTORS, CPL_TYPE_DOUBLE);
359 for (i=0; i<CR2RES_NB_DETECTORS; i++){
360 for (ord=0; ord < 12; ord++){
361 keyname = cpl_sprintf(CR2RES_HEADER_QC_SNR, ord+1);
362 resol = cpl_propertylist_get_double(ext_plist[i], keyname);
366 cpl_array_set_double(tmp_arr, ord + (i*12),resol);
371 cpl_propertylist_update_double(pri_head,
"SNR",
372 cpl_array_get_median(tmp_arr)) ;
373 cpl_propertylist_set_comment(pri_head,
"SNR",
374 "Median signal-to-noise in all detector-orders");
375 cpl_array_delete(tmp_arr);
377 if (!strcmp(recipe,
"cr2res_obs_pol")) {
380 tmp_string = cpl_sprintf(
"/I/%s/",poltype);
381 cpl_propertylist_update_string(pri_head,
"STOKES", tmp_string);
382 cpl_free(tmp_string);
386 cpl_propertylist_erase_regexp(pri_head,
"ASSO*", 0);
389 if (main_qc_plist != NULL) {
390 cpl_propertylist_copy_property_regexp(pri_head, main_qc_plist,
"QC*",
395 cpl_propertylist_save(pri_head, idp_filename, CPL_IO_CREATE);
399 cpl_propertylist_update_string(ext_head,
"EXTNAME",
"SPECTRUM") ;
401 cpl_propertylist_update_double(ext_head,
"RA",
402 cpl_propertylist_get_double(pri_head,
"RA"));
403 cpl_propertylist_set_comment(ext_head,
"RA",
404 cpl_propertylist_get_comment(pri_head,
"RA"));
405 cpl_propertylist_update_double(ext_head,
"DEC",
406 cpl_propertylist_get_double(pri_head,
"DEC"));
407 cpl_propertylist_set_comment(ext_head,
"DEC",
408 cpl_propertylist_get_comment(pri_head,
"DEC"));
409 cpl_propertylist_update_string(ext_head,
"OBJECT",
410 cpl_propertylist_get_string(pri_head,
"OBJECT"));
411 cpl_propertylist_set_comment(ext_head,
"OBJECT",
412 cpl_propertylist_get_comment(pri_head,
"OBJECT"));
413 tmp_string = cpl_sprintf(
"%s - %f",
414 cpl_propertylist_get_string(pri_head,
"OBJECT"), mjd_start);
416 cpl_propertylist_update_string(ext_head,
"TITLE", tmp_string);
417 cpl_free(tmp_string);
418 cpl_propertylist_set_comment(ext_head,
"TITLE",
419 "Title is OBJECT and MJD at start");
421 cpl_propertylist_update_double(ext_head,
"SPEC_VAL", (wmax+wmin)/2.0) ;
422 cpl_propertylist_set_comment(ext_head,
"SPEC_VAL",
423 "Characteristic spectral coordinate value [nm]") ;
424 cpl_propertylist_update_double(ext_head,
"SPEC_BW", wmax-wmin) ;
425 cpl_propertylist_set_comment(ext_head,
"SPEC_BW",
426 "Width of the spectrum [nm]") ;
428 cpl_propertylist_update_string(ext_head,
"VOPUB",
"ESO/SAF") ;
429 cpl_propertylist_set_comment(ext_head,
"VOPUB",
"VO Publishing Authority") ;
430 cpl_propertylist_update_string(ext_head,
"VOCLASS",
"SPECTRUM V1.0") ;
431 cpl_propertylist_set_comment(ext_head,
"VOCLASS",
432 "Data Model name and version") ;
433 cpl_propertylist_update_int(ext_head,
"NELEM", nrows) ;
434 cpl_propertylist_set_comment(ext_head,
"NELEM",
"Length of the data array");
436 cpl_propertylist_update_string(ext_head,
"TUTYP1",
437 "spec:Data.SpectralAxis.Value");
438 cpl_propertylist_update_string(ext_head,
"TUCD1",
"em.wl");
439 cpl_propertylist_update_double(ext_head,
"TDMIN1", wmin);
440 cpl_propertylist_update_double(ext_head,
"TDMAX1", wmax);
442 cpl_propertylist_update_string(ext_head,
"TUTYP2",
443 "spec:Data.FluxAxis.Value");
444 cpl_propertylist_update_string(ext_head,
"TUCD2",
445 "phot.flux.density;em.wl;stat.uncalib;arith.ratio");
447 cpl_propertylist_update_string(ext_head,
"TUTYP3",
448 "spec:Data.FluxAxis.Accuracy.StatError");
449 cpl_propertylist_update_string(ext_head,
"TUCD3",
450 "stat.error;phot.flux.density;em.ql;stat.uncalib;arith.ratio");
452 cpl_propertylist_update_string(ext_head,
"TUTYP4",
453 "spec:Data.FluxAxis.Accuracy.QualityStatus");
454 cpl_propertylist_update_string(ext_head,
"TUCD4",
457 cpl_propertylist_update_string(ext_head,
"TUTYP5",
459 cpl_propertylist_update_string(ext_head,
"TUCD5",
462 cpl_propertylist_update_string(ext_head,
"TUTYP6",
464 cpl_propertylist_update_string(ext_head,
"TUCD6",
465 "meta.number;instr.det");
467 if (!strcmp(recipe,
"cr2res_obs_pol")) {
468 cpl_propertylist_update_string(ext_head,
"TUTYP7",
"");
469 tmp_string = cpl_sprintf(
"phot.count;phys.polarization.stokes.%s",
471 cpl_propertylist_update_string(ext_head,
"TUCD7", tmp_string);
472 cpl_free(tmp_string);
474 cpl_propertylist_update_string(ext_head,
"TUTYP8",
"");
475 tmp_string = cpl_sprintf(
"stat.error;phys.polarization.stokes.%s",
477 cpl_propertylist_update_string(ext_head,
"TUCD8", tmp_string);
478 cpl_free(tmp_string);
480 cpl_propertylist_update_string(ext_head,
"TUTYP7",
482 cpl_propertylist_update_string(ext_head,
"TUCD7",
483 "pos.cartesian.x;instr.det");
485 cpl_propertylist_update_string(ext_head,
"TUTYP8",
487 cpl_propertylist_update_string(ext_head,
"TUCD8",
499 cpl_propertylist_erase(ext_head,
"CRDER3");
500 cpl_propertylist_erase(ext_head,
"CUNIT3");
501 cpl_propertylist_erase(ext_head,
"BUNIT");
502 cpl_propertylist_erase(ext_head,
"CTYPE1");
503 cpl_propertylist_erase(ext_head,
"CUNIT2");
504 cpl_propertylist_erase(ext_head,
"CSYER1");
505 cpl_propertylist_erase(ext_head,
"CSYER2");
506 cpl_propertylist_erase(ext_head,
"CDELT1");
507 cpl_propertylist_erase(ext_head,
"CRPIX1");
508 cpl_propertylist_erase(ext_head,
"CRVAL1");
509 cpl_propertylist_erase(ext_head,
"CUNIT1");
512 if (ext_plist[0] != NULL)
513 cpl_propertylist_copy_property_regexp(ext_head, ext_plist[0],
"QC*", 0);
516 cpl_table_save(idp_tab, NULL, ext_head, idp_filename, CPL_IO_EXTEND) ;
519 cpl_frameset_insert(allframes, out_frame);
522 cpl_free(idp_filename) ;
523 cpl_table_delete(idp_tab) ;
524 cpl_propertylist_delete(pri_head) ;
525 cpl_propertylist_delete(ext_head) ;
540 const char * setting)
542 cpl_table * idp_tab ;
543 cpl_table * tmp_tab ;
544 cpl_array * col_names ;
545 const char * col_name ;
548 cpl_propertylist * sort_list ;
549 int order, trace_nb ;
550 cpl_size i, j, ntot, ncols, nrows, nb_selected ;
553 if (tables == NULL)
return NULL ;
557 for (i=0 ; i<CR2RES_NB_DETECTORS ; i++) {
558 if (tables[i] != NULL) {
559 col_names = cpl_table_get_column_names(tables[i]);
560 ncols = cpl_table_get_ncol(tables[i]) ;
561 if (strcmp(recipe,
"cr2res_obs_pol")) {
562 for (j=0 ; j<ncols ; j++) {
563 col_name = cpl_array_get_string(col_names, j);
566 if (col_kind != NULL &&
567 !strcmp(col_kind, CR2RES_COL_SPEC_SUFFIX)) {
569 ntot += cpl_table_get_nrow(tables[i]) ;
571 if (col_kind != NULL) cpl_free(col_kind) ;
574 for (j=0 ; j<ncols ; j++) {
575 col_name = cpl_array_get_string(col_names, j);
578 if (col_kind != NULL &&
579 !strcmp(col_kind, CR2RES_COL_POL_INTENS_SUFFIX)) {
581 ntot += cpl_table_get_nrow(tables[i]) ;
583 if (col_kind != NULL) cpl_free(col_kind) ;
586 cpl_array_delete(col_names) ;
589 cpl_msg_info(__func__,
"Found %lld total rows.", ntot);
592 tmp_tab = cpl_table_new(ntot) ;
593 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_WAVE, CPL_TYPE_DOUBLE);
594 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_FLUX, CPL_TYPE_DOUBLE);
595 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_ERR, CPL_TYPE_DOUBLE);
596 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_QUAL, CPL_TYPE_INT);
597 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_ORDER, CPL_TYPE_INT);
598 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_DETEC, CPL_TYPE_INT);
599 if (strcmp(recipe,
"cr2res_obs_pol")) {
600 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_XPOS, CPL_TYPE_INT);
601 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_TRACE, CPL_TYPE_INT);
603 cpl_table_new_column(tmp_tab, CR2RES_IDP_COL_STOKES, CPL_TYPE_DOUBLE);
604 cpl_table_new_column(tmp_tab,
605 CR2RES_IDP_COL_STOKESERR, CPL_TYPE_DOUBLE);
611 for (i=0 ; i<CR2RES_NB_DETECTORS ; i++) {
612 if (tables[i] != NULL) {
613 col_names = cpl_table_get_column_names(tables[i]);
614 ncols = cpl_table_get_ncol(tables[i]) ;
615 if (strcmp(recipe,
"cr2res_obs_pol")) {
616 for (j=0 ; j<ncols ; j++) {
617 col_name = cpl_array_get_string(col_names, j);
620 if (col_kind != NULL &&
621 !strcmp(col_kind, CR2RES_COL_SPEC_SUFFIX)) {
623 cr2res_idp_copy_spec(tmp_tab, tables[i], ntot, i+1,
624 order, trace_nb, setting) ;
625 ntot += cpl_table_get_nrow(tables[i]) ;
627 if (col_kind != NULL) cpl_free(col_kind) ;
630 for (j=0 ; j<ncols ; j++) {
631 col_name = cpl_array_get_string(col_names, j);
633 if (col_kind != NULL &&
634 !strcmp(col_kind, CR2RES_COL_POL_INTENS_SUFFIX)) {
635 cr2res_idp_copy_pol(tmp_tab, tables[i], ntot, i + 1,
637 ntot += cpl_table_get_nrow(tables[i]) ;
639 if (col_kind != NULL) cpl_free(col_kind) ;
642 cpl_array_delete(col_names) ;
647 sort_list = cpl_propertylist_new() ;
648 cpl_propertylist_append_bool(sort_list, CR2RES_IDP_COL_WAVE, 0) ;
650 cpl_table_sort(tmp_tab, sort_list) ;
651 cpl_propertylist_delete(sort_list) ;
653 cpl_table_unselect_all(tmp_tab) ;
657 for (ii = 0; ii < ntot; ii++) {
658 cpl_table_get_double(tmp_tab,CR2RES_IDP_COL_WAVE,ii, &flag) ;
660 cpl_table_select_row(tmp_tab, ii);
664 for (i = ii+1; i < ntot; i++) {
665 double cur_val, pre_val;
667 pre_val = cpl_table_get_double(tmp_tab,CR2RES_IDP_COL_WAVE,i-1, NULL);
668 cur_val = cpl_table_get_double(tmp_tab,CR2RES_IDP_COL_WAVE,i, &flag) ;
669 if (fabs(pre_val-cur_val) < 1e-3 || flag) {
670 cpl_table_select_row(tmp_tab, i) ;
674 nb_selected = cpl_table_count_selected(tmp_tab) ;
675 if (nb_selected > 0) {
676 cpl_msg_info(__func__,
677 "IDP Creation - Double defined WLs : %"CPL_SIZE_FORMAT,
680 cpl_table_erase_selected(tmp_tab) ;
683 col_names = cpl_table_get_column_names(tmp_tab);
684 ncols = cpl_table_get_ncol(tmp_tab);
685 nrows = cpl_table_get_nrow(tmp_tab);
686 idp_tab = cpl_table_new(1);
687 for (j = 0; j < ncols; j++) {
689 col_name = cpl_array_get_string(col_names, j);
690 cpl_msg_debug(__func__,
"colname: %s", col_name);
691 col_type = cpl_table_get_column_type(tmp_tab, col_name);
692 tmp_arr = cpl_array_new(nrows, col_type);
693 if (col_type==CPL_TYPE_DOUBLE){
694 cpl_array_copy_data_double(tmp_arr,
695 cpl_table_get_data_double_const(tmp_tab, col_name));
696 }
else if (col_type==CPL_TYPE_INT){
697 cpl_array_copy_data_int(tmp_arr,
698 cpl_table_get_data_int_const(tmp_tab, col_name));
700 cpl_table_new_column_array(idp_tab, col_name, col_type, nrows);
701 cpl_table_set_array(idp_tab, col_name, 0, tmp_arr);
702 cpl_array_delete(tmp_arr);
704 cpl_array_delete(col_names) ;
705 cpl_table_delete(tmp_tab);
709 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_WAVE,
"nm") ;
710 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_DETEC,
" ") ;
711 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_ORDER,
" ") ;
712 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_QUAL,
" ") ;
713 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_FLUX,
" ") ;
714 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_ERR,
" ") ;
715 if (strcmp(recipe,
"cr2res_obs_pol")) {
716 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_TRACE,
" ") ;
717 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_XPOS,
"pixel") ;
719 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_STOKES,
" ") ;
720 cpl_table_set_column_unit(idp_tab, CR2RES_IDP_COL_STOKESERR,
" ") ;
739 cpl_frame * cur_frame ;
740 const char * cur_fname ;
741 cpl_propertylist * plist ;
742 double mjd_end_cur, mjd_end_max, mjd_obs, dit,
743 mjd_start_cur, mjd_start_min ;
744 int i, nframes, ndit ;
748 mjd_start_min = 1e10 ;
749 nframes = cpl_frameset_get_size(fset) ;
751 cpl_errorstate tempes = cpl_errorstate_get();
755 for (
int ifr = 0; ifr <= 1; ifr++) {
756 for (i = 0; i < nframes; i++) {
757 cur_frame = cpl_frameset_get_position(fset, i);
759 cpl_frame_get_group(cur_frame) != CPL_FRAME_GROUP_RAW)
761 cur_fname = cpl_frame_get_filename(cur_frame);
764 plist = cpl_propertylist_load(cur_fname, 0);
768 if (cpl_error_get_code() == CPL_ERROR_NONE) {
770 mjd_start_cur = mjd_obs;
771 mjd_end_cur = mjd_obs + (dit * ndit / (24 * 60 * 60));
775 mjd_start_cur = 1e11;
779 if (mjd_end_cur > mjd_end_max)
780 mjd_end_max = mjd_end_cur;
781 if (mjd_start_cur < mjd_start_min) {
782 mjd_start_min = mjd_start_cur;
784 cpl_propertylist_delete(plist);
786 if (mjd_start_min != 1e10)
790 cpl_errorstate_set(tempes);
792 if (mjd_start_min < 1e9) {
793 *mjd_start = mjd_start_min ;
797 if (mjd_end_max > 0.0) *mjd_end = mjd_end_max ;
798 else *mjd_end = -1.0 ;
817static int cr2res_idp_copy_spec(
819 const cpl_table * in,
820 cpl_size out_start_idx,
824 const char * setting)
829 const double * pspec ;
830 const double * pwave ;
831 const double * perr ;
832 cpl_size in_size, out_size, i, edgepix ;
835 if (out == NULL || in == NULL)
return -1 ;
836 in_size = cpl_table_get_nrow(in) ;
837 out_size = cpl_table_get_nrow(out) ;
841 if ((pspec = cpl_table_get_data_double_const(in, spec_name)) == NULL) {
842 cpl_msg_error(__func__,
"Cannot find the spectrum") ;
843 cpl_free(spec_name) ;
846 cpl_free(spec_name) ;
850 if ((pwave = cpl_table_get_data_double_const(in, wave_name)) == NULL) {
851 cpl_msg_error(__func__,
"Cannot find the wavelength") ;
852 cpl_free(wave_name) ;
855 cpl_free(wave_name) ;
859 if ((perr = cpl_table_get_data_double_const(in, err_name)) == NULL) {
860 cpl_msg_error(__func__,
"Cannot find the spectrum error") ;
867 for (i=0 ; i<in_size ; i++) {
868 if (out_start_idx + i <out_size) {
869 if (!isnan(pwave[i]))
870 cpl_table_set_double(out, CR2RES_IDP_COL_WAVE,
871 out_start_idx + i, pwave[i]) ;
872 if (!isnan(pspec[i]))
873 cpl_table_set_double(out, CR2RES_IDP_COL_FLUX,
874 out_start_idx + i, pspec[i]) ;
876 cpl_table_set_double(out, CR2RES_IDP_COL_ERR,
877 out_start_idx + i, perr[i]) ;
878 if (i<5 || (i>=CR2RES_DETECTOR_SIZE-5)) edgepix = 2;
880 cpl_table_set_int(out, CR2RES_IDP_COL_QUAL, out_start_idx + i,
881 edgepix + cr2res_wl_is_ghost(setting, pwave[i]));
882 cpl_table_set_int(out, CR2RES_IDP_COL_XPOS, out_start_idx + i,
884 cpl_table_set_int(out, CR2RES_IDP_COL_DETEC, out_start_idx + i,
886 cpl_table_set_int(out, CR2RES_IDP_COL_ORDER, out_start_idx + i,
888 cpl_table_set_int(out, CR2RES_IDP_COL_TRACE, out_start_idx + i,
907static int cr2res_idp_copy_pol(
909 const cpl_table * in,
910 cpl_size out_start_idx,
913 const char * setting)
919 char * stokeserr_name ;
920 const double * pspec ;
921 const double * pwave ;
922 const double * perr ;
923 const double * pstokes ;
924 const double * pstokeserr ;
925 cpl_size in_size, out_size, i, edgepix ;
928 if (out == NULL || in == NULL)
return -1 ;
929 in_size = cpl_table_get_nrow(in) ;
930 out_size = cpl_table_get_nrow(out) ;
934 if ((pspec = cpl_table_get_data_double_const(in, spec_name)) == NULL) {
935 cpl_msg_error(__func__,
"Cannot find the intensity spec") ;
936 cpl_free(spec_name) ;
939 cpl_free(spec_name) ;
943 if ((pwave = cpl_table_get_data_double_const(in, wave_name)) == NULL) {
944 cpl_msg_error(__func__,
"Cannot find the wavelength") ;
945 cpl_free(wave_name) ;
948 cpl_free(wave_name) ;
952 if ((perr = cpl_table_get_data_double_const(in, err_name)) == NULL) {
953 cpl_msg_error(__func__,
"Cannot find the intensity error") ;
961 if ((pstokes = cpl_table_get_data_double_const(in, stokes_name)) == NULL) {
962 cpl_msg_error(__func__,
"Cannot find the Stokes spectrum") ;
963 cpl_free(stokes_name) ;
966 cpl_free(stokes_name) ;
970 if ((pstokeserr = cpl_table_get_data_double_const(in, stokeserr_name)) == NULL) {
971 cpl_msg_error(__func__,
"Cannot find the Stokes error") ;
972 cpl_free(stokeserr_name) ;
975 cpl_free(stokeserr_name) ;
978 for (i=0 ; i<in_size ; i++) {
979 if (out_start_idx + i <out_size) {
980 if (!isnan(pwave[i]))
981 cpl_table_set_double(out, CR2RES_IDP_COL_WAVE,
982 out_start_idx + i, pwave[i]) ;
983 if (!isnan(pspec[i]))
984 cpl_table_set_double(out, CR2RES_IDP_COL_FLUX,
985 out_start_idx + i, pspec[i]) ;
987 cpl_table_set_double(out, CR2RES_IDP_COL_ERR,
988 out_start_idx + i, perr[i]) ;
989 if (!isnan(pstokes[i]))
990 cpl_table_set_double(out, CR2RES_IDP_COL_STOKES,
991 out_start_idx + i, pstokes[i]) ;
992 if (!isnan(pstokeserr[i]))
993 cpl_table_set_double(out, CR2RES_IDP_COL_STOKESERR,
994 out_start_idx + i, pstokeserr[i]) ;
996 if (i<5 || (i>=CR2RES_DETECTOR_SIZE-5)) edgepix = 2;
998 cpl_table_set_int(out, CR2RES_IDP_COL_QUAL, out_start_idx + i,
999 edgepix + cr2res_wl_is_ghost(setting, pwave[i]));
1000 cpl_table_set_int(out, CR2RES_IDP_COL_XPOS, out_start_idx + i,
1002 cpl_table_set_int(out, CR2RES_IDP_COL_DETEC, out_start_idx + i,
1004 cpl_table_set_int(out, CR2RES_IDP_COL_ORDER, out_start_idx + i,
1019int cr2res_wl_is_ghost(
const char * setting,
double wl){
1022 cpl_bivector * ghosts;
1026 ghosts = cr2res_get_ghosts(setting);
1029 start = cpl_bivector_get_x(ghosts);
1030 end = cpl_bivector_get_y(ghosts);
1031 nghosts = cpl_vector_get_size(start);
1033 for (i=0; i<nghosts; i++){
1034 if ( wl > cpl_vector_get(start,i) && wl < cpl_vector_get(end,i)) {
1035 cpl_bivector_delete(ghosts);
1039 cpl_bivector_delete(ghosts);
1049cpl_bivector * cr2res_get_ghosts(
const char * setting){
1054 if (!strcmp(setting,
"Y1029")) {
1056 start = cpl_vector_new(nghost);
1057 end = cpl_vector_new(nghost);
1058 cpl_vector_set(start, 0, 955.51); cpl_vector_set(end, 0, 956.59);
1059 cpl_vector_set(start, 1, 972.36); cpl_vector_set(end, 1, 973.46);
1060 cpl_vector_set(start, 2, 990.18); cpl_vector_set(end, 2, 990.81);
1061 cpl_vector_set(start, 3, 1008.18); cpl_vector_set(end, 3, 1008.82);
1062 cpl_vector_set(start, 4, 1026.81); cpl_vector_set(end, 4, 1027.47);
1063 cpl_vector_set(start, 5, 1046.15); cpl_vector_set(end, 5, 1046.90);
1064 cpl_vector_set(start, 6, 1066.29); cpl_vector_set(end, 6, 1067.05);
1065 cpl_vector_set(start, 7, 1087.15); cpl_vector_set(end, 7, 1087.93);
1066 cpl_vector_set(start, 8, 1108.83); cpl_vector_set(end, 8, 1109.63);
1067 }
else if (!strcmp(setting,
"Y1028")) {
1069 start = cpl_vector_new(nghost);
1070 end = cpl_vector_new(nghost);
1071 cpl_vector_set(start, 0, 954.15); cpl_vector_set(end, 0, 955.20);
1072 cpl_vector_set(start, 1, 971.25); cpl_vector_set(end, 1, 971.87);
1073 cpl_vector_set(start, 2, 988.65); cpl_vector_set(end, 2, 989.23);
1074 cpl_vector_set(start, 3, 1006.61); cpl_vector_set(end, 3, 1007.24);
1075 cpl_vector_set(start, 4, 1025.23); cpl_vector_set(end, 4, 1025.90);
1076 cpl_vector_set(start, 5, 1044.60); cpl_vector_set(end, 5, 1045.25);
1077 cpl_vector_set(start, 6, 1064.67); cpl_vector_set(end, 6, 1065.33);
1078 cpl_vector_set(start, 7, 1085.46); cpl_vector_set(end, 7, 1086.18);
1079 cpl_vector_set(start, 8, 1107.18); cpl_vector_set(end, 8, 1107.91);
1080 }
else if (!strcmp(setting,
"J1226")) {
1082 start = cpl_vector_new(nghost);
1083 end = cpl_vector_new(nghost);
1084 cpl_vector_set(start, 0, 1119.44); cpl_vector_set(end, 0, 1020.33);
1085 cpl_vector_set(start, 1, 1142.78); cpl_vector_set(end, 1, 1143.76);
1086 cpl_vector_set(start, 2, 1167.12); cpl_vector_set(end, 2, 1168.08);
1087 cpl_vector_set(start, 3, 1192.52); cpl_vector_set(end, 3, 1193.49);
1088 cpl_vector_set(start, 4, 1219.01); cpl_vector_set(end, 4, 1220.04);
1089 cpl_vector_set(start, 5, 1246.71); cpl_vector_set(end, 5, 1247.76);
1090 cpl_vector_set(start, 6, 1275.70); cpl_vector_set(end, 6, 1276.80);
1091 cpl_vector_set(start, 7, 1306.05); cpl_vector_set(end, 7, 1307.15);
1092 cpl_vector_set(start, 8, 1337.98); cpl_vector_set(end, 8, 1338.94);
1093 }
else if (!strcmp(setting,
"J1228")) {
1095 start = cpl_vector_new(nghost);
1096 end = cpl_vector_new(nghost);
1097 cpl_vector_set(start, 0, 1121.21); cpl_vector_set(end, 0, 1122.12);
1098 cpl_vector_set(start, 1, 1144.57); cpl_vector_set(end, 1, 1145.53);
1099 cpl_vector_set(start, 2, 1168.98); cpl_vector_set(end, 2, 1169.91);
1100 cpl_vector_set(start, 3, 1194.37); cpl_vector_set(end, 3, 1195.38);
1101 cpl_vector_set(start, 4, 1220.92); cpl_vector_set(end, 4, 1221.95);
1102 cpl_vector_set(start, 5, 1248.68); cpl_vector_set(end, 5, 1249.72);
1103 cpl_vector_set(start, 6, 1277.71); cpl_vector_set(end, 6, 1278.83);
1104 cpl_vector_set(start, 7, 1308.12); cpl_vector_set(end, 7, 1309.17);
1105 cpl_vector_set(start, 8, 1339.95); cpl_vector_set(end, 8, 1341.03);
1106 }
else if (!strcmp(setting,
"J1232")) {
1108 start = cpl_vector_new(nghost);
1109 end = cpl_vector_new(nghost);
1110 cpl_vector_set(start, 0, 1124.71); cpl_vector_set(end, 0, 1125.60);
1111 cpl_vector_set(start, 1, 1148.15); cpl_vector_set(end, 1, 1149.46);
1112 cpl_vector_set(start, 2, 1172.62); cpl_vector_set(end, 2, 1173.55);
1113 cpl_vector_set(start, 3, 1198.13); cpl_vector_set(end, 3, 1199.08);
1114 cpl_vector_set(start, 4, 1224.77); cpl_vector_set(end, 4, 1225.74);
1115 cpl_vector_set(start, 5, 1252.56); cpl_vector_set(end, 5, 1253.59);
1116 cpl_vector_set(start, 6, 1281.74); cpl_vector_set(end, 6, 1282.74);
1117 cpl_vector_set(start, 7, 1312.19); cpl_vector_set(end, 7, 1313.26);
1118 cpl_vector_set(start, 8, 1344.15); cpl_vector_set(end, 8, 1345.23);
1119 }
else if (!strcmp(setting,
"H1559")) {
1121 start = cpl_vector_new(nghost);
1122 end = cpl_vector_new(nghost);
1123 cpl_vector_set(start, 0, 1682.63); cpl_vector_set(end, 0, 1682.97);
1124 cpl_vector_set(start, 1, 1735.50); cpl_vector_set(end, 1, 1737.42);
1125 }
else if (!strcmp(setting,
"H1567")) {
1127 start = cpl_vector_new(nghost);
1128 end = cpl_vector_new(nghost);
1129 cpl_vector_set(start, 0, 1744.20); cpl_vector_set(end, 0, 1745.84);
1130 }
else if (!strcmp(setting,
"H1575")) {
1132 start = cpl_vector_new(nghost);
1133 end = cpl_vector_new(nghost);
1134 cpl_vector_set(start, 0, 1753.20); cpl_vector_set(end, 0, 1754.28);
1139 return cpl_bivector_wrap_vectors(start,end);
char * cr2res_dfs_POL_colname_parse(const char *colname, int *order_idx)
Parse a column name ORDER_TYPE format.
char * cr2res_dfs_POL_STOKES_ERROR_colname(int order_idx)
Get the POL_STOKES_ERROR column name for a given order.
char * cr2res_dfs_SPEC_ERR_colname(int order_idx, int trace)
Get the ERR column name for a given order/trace.
char * cr2res_dfs_POL_INTENS_ERROR_colname(int order_idx)
Get the POL_INTENS_ERROR column name for a given order.
char * cr2res_dfs_WAVELENGTH_colname(int order_idx, int trace)
Get the WAVELENGTH column name for a given order/trace.
char * cr2res_dfs_POL_STOKES_colname(int order_idx)
Get the POL_STOKES column name for a given order.
char * cr2res_dfs_SPEC_colname_parse(const char *colname, int *order_idx, int *trace)
Parse a column name ORDER_TRACE_TYPE format.
char * cr2res_dfs_POL_INTENS_colname(int order_idx)
Get the POL_INTENS column name for a given order.
char * cr2res_dfs_SPEC_colname(int order_idx, int trace)
Get the SPEC column name for a given order/trace.
char * cr2res_dfs_POL_WAVELENGTH_colname(int order_idx)
Get the POL_WAVELENGTH column name for a given order.
cpl_table * cr2res_idp_create_table(cpl_table **tables, const char *recipe, const char *setting)
Convert EXTRACT_1D tables into IDP table.
int cr2res_idp_save(const char *filename, cpl_frameset *allframes, cpl_frameset *rawframes, const cpl_parameterlist *parlist, cpl_table **tables, cpl_propertylist *main_qc_plist, cpl_propertylist **ext_plist, const char *procatg, const char *recipe)
Save an IDP file.
int cr2res_idp_compute_mjd(cpl_frameset *fset, double *mjd_start, double *mjd_end)
Compute mjd start and end.
const char * cr2res_pfits_get_progid(const cpl_propertylist *plist)
find out the PROG ID
double cr2res_pfits_get_dit(const cpl_propertylist *plist)
find out the DIT value
double cr2res_pfits_get_mjd_obs(const cpl_propertylist *plist)
find out the MJD-OBS value
int cr2res_pfits_get_ndit(const cpl_propertylist *plist)
find out the NDIT value
const char * cr2res_pfits_get_poltype(const cpl_propertylist *plist)
find out the POL TYPE value
int cr2res_pfits_get_obs_id(const cpl_propertylist *plist)
find out the OBS ID value