42#define TEST_NAME "Test-XSH_DFS_SDP"
45#define RECIPE_ID "test_recipe"
46#define RAW_FILE_NAME "input_raw_file.fits"
47#define RAW_FRAME_TAG XSH_WAVE_VIS
48#define PRODUCT_FILE_NAME "OBJECT_SLIT_STARE_VIS.fits"
49#define PRODUCT_FRAME_TAG XSH_OBJECT_SLIT_STARE_VIS
50#define OUTPUT_FILE_NAME "SDP_"PRODUCT_FILE_NAME
51#define OUTPUT_FRAME_TAG "SCIENCE.SPECTRUM"
53#define TARGET_NAME "SUN,centre,P2"
54#define OBJECT_VALUE "STD,TELLURIC"
55#define SLIT_STRING_VALUE "0.9x11"
56#define MJDOBS_VALUE 10.1
57#define DATEOBS_VALUE "2014-01-01T00:00:00.000"
58#define RA_VALUE 60.605358
59#define DEC_VALUE -70.27194
60#define ORIGIN_VALUE "ESO"
61#define TELESCOP_VALUE "ESO-VLT-U2"
62#define EQUINOX_VALUE 2000
63#if defined CPL_VERSION_CODE && CPL_VERSION_CODE <= CPL_VERSION(6, 0, 6)
64#define RADECSYS_VALUE "FK5"
66#define INSTRUME_VALUE "XSHOOTER"
67#define EXPTIME_VALUE 15.
68#define PROG_ID_VALUE "abc"
69#define OBS_ID_VALUE 123
70#define PRO_TECH_VALUE "ECHELLE,SLIT,STARE"
71#define CONAD_VALUE 4.0
73#define CSYER1_VALUE 1.2
74#define BUINT_VALUE "ADU"
78#define EXPECTED_ORIGIN ORIGIN_VALUE
79#define EXPECTED_DISPELEM "VIS"
80#define EXPECTED_OBJECT TARGET_NAME
81#if defined CPL_VERSION_CODE && CPL_VERSION_CODE <= CPL_VERSION(6, 0, 6)
82#define EXPECTED_RADECSYS RADECSYS_VALUE
84#define EXPECTED_EQUINOX EQUINOX_VALUE
85#define EXPECTED_RA RA_VALUE
86#define EXPECTED_DEC DEC_VALUE
87#define EXPECTED_EXPTIME EXPTIME_VALUE
88#define EXPECTED_MJDOBS MJDOBS_VALUE
89#define EXPECTED_MJDEND MJDOBS_VALUE + EXPTIME_VALUE/86400.
90#define EXPECTED_PROG_ID PROG_ID_VALUE
91#define EXPECTED_OBS_ID OBS_ID_VALUE
92#define EXPECTED_OBSTECH PRO_TECH_VALUE
93#define EXPECTED_PRODCATG OUTPUT_FRAME_TAG
94#define EXPECTED_PRODLVL 2
95#define EXPECTED_FLUXCAL "UNCALIBRATED"
96#define EXPECTED_WAVELMIN 500.
97#define EXPECTED_WAVELMAX 600.
98#define EXPECTED_SPEC_BIN 10.
99#define EXPECTED_TOT_FLUX CPL_FALSE
100#define EXPECTED_FLUXERR -2
101#define EXPECTED_SNR SNR_VALUE
102#define EXPECTED_DETRON RON_VALUE
103#define EXPECTED_EFFRON RON_VALUE
104#define EXPECTED_PROV1 RAW_FILE_NAME
105#define EXPECTED_NCOMBINE 1
106#define EXPECTED_TITLE "SUN,centre_123_2014-01-01T00:00:00.000"
107#define EXPECTED_APERTURE 0.9/3600.
108#define EXPECTED_TELAPSE EXPTIME_VALUE
109#define EXPECTED_TMID MJDOBS_VALUE + EXPTIME_VALUE/(2.0 * 86400.)
110#define EXPECTED_SPEC_VAL 550.
111#define EXPECTED_SPEC_BW 100.
112#define EXPECTED_TDMIN1 EXPECTED_WAVELMIN
113#define EXPECTED_TDMAX1 EXPECTED_WAVELMAX
114#define EXPECTED_TFIELDS 5
115#define EXPECTED_TFIELDS_UNCAL 7
116#define EXPECTED_NELEM 11
117#define EXPECTED_EXTNAME "SPECTRUM"
118#define EXPECTED_INHERIT CPL_TRUE
121#define EQUINOX_KEYWORD "EQUINOX"
122#if defined CPL_VERSION_CODE && CPL_VERSION_CODE <= CPL_VERSION(6, 0, 6)
123#define RADECSYS_KEYWORD "RADECSYS"
125#define INSTRUME_KEYWORD "INSTRUME"
126#define SIMPLE_KEYWORD "SIMPLE"
127#define BITPIX_KEYWORD "BITPIX"
128#define EXTEND_KEYWORD "EXTEND"
129#define DATE_KEYWORD "DATE"
130#define CHECKSUM_KEYWORD "CHECKSUM"
131#define DATASUM_KEYWORD "DATASUM"
132#define TFIELDS_KEYWORD "TFIELDS"
134#define test_success(expr) cpl_test_assert((expr) == EXIT_SUCCESS)
147static int getlen(
const char* str);
152 const cpl_parameterlist* params,
165 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
171 cpl_test_assert( system(
"test -d workspace_"TEST_NAME
173 cpl_test_assert( chdir(
"workspace_"TEST_NAME) == 0 );
182 printf(
"I'm inside the main of xsh_dfs_sdp");
185 cpl_parameterlist* params = cpl_parameterlist_new();
186 cpl_test_assert(params != NULL);
187 cpl_parameter* p = cpl_parameter_new_value(
188 "xsh."RECIPE_ID".dummy-association-keys",
189 CPL_TYPE_INT,
"test param",
RECIPE_ID, 2);
190 cpl_test_assert(p != NULL);
191 cpl_test_assert(cpl_parameterlist_append(params, p) == CPL_ERROR_NONE);
194 cpl_frameset* frames = cpl_frameset_new();
195 cpl_test_assert(frames != NULL);
212 cpl_test_assert(product_frame != NULL);
218 cpl_test_error(CPL_ERROR_NONE);
221 cpl_test_assert(cpl_test_get_failed() == 0);
226 cpl_test_error(CPL_ERROR_NONE);
229 cpl_test_assert(cpl_test_get_failed() == 0);
234 cpl_test_error(CPL_ERROR_NONE);
237 cpl_test_assert(cpl_test_get_failed() == 0);
241 while (! cpl_frameset_is_empty(frames)) {
242 cpl_frame* frame = cpl_frameset_get_position(frames, 0);
243 cpl_test_assert(frame != NULL);
244 cpl_test_assert(cpl_frameset_erase_frame(frames, frame) == CPL_ERROR_NONE);
246 cpl_frameset_delete(frames);
247 cpl_parameterlist_delete(params);
250 if (cpl_test_get_failed() == 0) {
255 cpl_test_assert( chdir(
"..") == 0 );
256 cpl_test_assert( system(
"test -d workspace_"TEST_NAME
257 "&& rm -r -f workspace_"TEST_NAME) == 0 );
260 return cpl_test_end(0);
280 cpl_propertylist* props = cpl_propertylist_new();
281 cpl_test_assert(props != NULL);
282 cpl_test_assert(cpl_propertylist_append_string(props, CPL_DFS_PRO_CATG,
288 cpl_test_assert(cpl_propertylist_append_string(props,
XSH_DPR_TYPE,
294 cpl_test_assert(cpl_propertylist_append_string(props,
XSH_SLIT_VIS,
297 cpl_test_assert(cpl_propertylist_append_double(props,
XSH_MJDOBS,
300 cpl_test_assert(cpl_propertylist_append_string(props,
XSH_DATE_OBS,
303 cpl_test_assert(cpl_propertylist_append_double(props,
XSH_RA,
RA_VALUE)
310 cpl_test_assert(cpl_propertylist_append_string(props,
XSH_TELESCOP,
319#if defined CPL_VERSION_CODE && CPL_VERSION_CODE <= CPL_VERSION(6, 0, 6)
320 cpl_test_assert(cpl_propertylist_append_string(props, RADECSYS_KEYWORD,
324 cpl_test_assert(cpl_propertylist_append_double(props,
XSH_EXPTIME,
332 cpl_test_assert(cpl_propertylist_append_string(props,
XSH_PRO_TECH,
341 cpl_image* image = cpl_image_new(10, 10, CPL_TYPE_FLOAT);
342 cpl_test_assert(image != NULL);
343 cpl_test_assert(cpl_image_save(image,
RAW_FILE_NAME, CPL_TYPE_FLOAT, props,
348 cpl_frame* frame = cpl_frame_new();
349 cpl_test_assert(frame != NULL);
354 cpl_test_assert(cpl_frame_set_type(frame, CPL_FRAME_TYPE_IMAGE)
356 cpl_test_assert(cpl_frame_set_group(frame, CPL_FRAME_GROUP_RAW)
358 cpl_test_assert(cpl_frame_set_level(frame, CPL_FRAME_LEVEL_FINAL)
360 cpl_test_assert(cpl_frameset_insert(frames, frame) == CPL_ERROR_NONE);
362 cpl_image_delete(image);
363 cpl_propertylist_delete(props);
386 const cpl_parameterlist* params,
392 cpl_test_assert(spectrum != NULL);
393 cpl_test_assert(cpl_image_set(spectrum->
flux, 4, 1, 7) == CPL_ERROR_NONE);
394 cpl_test_assert(cpl_image_set(spectrum->
flux, 5, 1, 21) == CPL_ERROR_NONE);
395 cpl_test_assert(cpl_image_set(spectrum->
flux, 6, 1, 12) == CPL_ERROR_NONE);
396 cpl_test_assert(cpl_image_set(spectrum->
errs, 4, 1, 0.25) == CPL_ERROR_NONE);
397 cpl_test_assert(cpl_image_set(spectrum->
errs, 5, 1, 0.5) == CPL_ERROR_NONE);
398 cpl_test_assert(cpl_image_set(spectrum->
errs, 6, 1, 0.25) == CPL_ERROR_NONE);
399 cpl_test_assert(cpl_image_set(spectrum->
qual, 1, 1, 16) == CPL_ERROR_NONE);
400 cpl_test_assert(cpl_image_set(spectrum->
qual, 10, 1, 33) == CPL_ERROR_NONE);
401 cpl_test_assert(cpl_propertylist_append_double(spectrum->
flux_header,
404 cpl_test_assert(cpl_propertylist_append_double(spectrum->
flux_header,
407 cpl_test_assert(cpl_propertylist_append_double(spectrum->
flux_header,
410 cpl_test_assert(cpl_propertylist_append_string(spectrum->
flux_header,
413 cpl_test_assert(cpl_propertylist_append_string(spectrum->
flux_header,
416 cpl_test_assert(cpl_propertylist_append_string(spectrum->
errs_header,
421 cpl_test_assert(frame != NULL);
422 cpl_test_error(CPL_ERROR_NONE);
427 cpl_test_assert(cpl_frame_set_type(frame, CPL_FRAME_TYPE_IMAGE)
429 cpl_test_assert(cpl_frame_set_group(frame, CPL_FRAME_GROUP_PRODUCT)
431 cpl_test_assert(cpl_frame_set_level(frame, CPL_FRAME_LEVEL_FINAL)
436 cpl_test_error(CPL_ERROR_NONE);
438 cpl_frame_delete(frame);
451 if (str == NULL)
return -1;
472 cpl_test_assert(props != NULL);
474 cpl_test_assert(table != NULL);
476 cpl_test_assert(tableprops != NULL);
480 cpl_test_eq(cpl_propertylist_get_bool(props,
SIMPLE_KEYWORD), CPL_TRUE);
482 cpl_test_eq(cpl_propertylist_get_int(props,
XSH_NAXIS), 0);
483 cpl_test_eq(cpl_propertylist_get_bool(props,
EXTEND_KEYWORD), CPL_TRUE);
489 cpl_test_eq_string(cpl_propertylist_get_string(props,
492 cpl_test(
getlen(cpl_propertylist_get_string(props,
498#if defined CPL_VERSION_CODE && CPL_VERSION_CODE <= CPL_VERSION(6, 0, 6)
499 cpl_test_eq_string(cpl_propertylist_get_string(props, RADECSYS_KEYWORD),
506 cpl_test_abs(cpl_propertylist_get_double(props,
XSH_EXPTIME),
512 cpl_test(cpl_propertylist_get_double(props,
XSH_MJDOBS)
513 < cpl_propertylist_get_double(props,
XSH_MJDEND));
514 cpl_test_eq_string(cpl_propertylist_get_string(props,
521 cpl_test_eq_string(cpl_propertylist_get_string(props,
524 cpl_test_eq_string(cpl_propertylist_get_string(props,
529 cpl_test_eq_string(cpl_propertylist_get_string(props,
544 cpl_test_eq(
getlen(cpl_propertylist_get_string(props,
547 cpl_test_abs(cpl_propertylist_get_double(props,
XSH_SNR),
560 cpl_test_eq_string(cpl_propertylist_get_string(props,
566 cpl_test(cpl_propertylist_has(props,
"ASSON1"));
567 cpl_test(cpl_propertylist_has(props,
"ASSOC1"));
568 cpl_test(cpl_propertylist_has(props,
"ASSOM1"));
569 cpl_test(cpl_propertylist_has(props,
"ASSON2"));
570 cpl_test(cpl_propertylist_has(props,
"ASSOC2"));
571 cpl_test(cpl_propertylist_has(props,
"ASSOM2"));
572 cpl_test(! cpl_propertylist_has(props,
"ASSON3"));
573 cpl_test(! cpl_propertylist_has(props,
"ASSOC3"));
574 cpl_test(! cpl_propertylist_has(props,
"ASSOM3"));
576 if (cpl_version_get_binary_version() >= CPL_VERSION(6, 4, 2)) {
582 cpl_test_eq(cpl_propertylist_get_int(tableprops,
BITPIX_KEYWORD), 8);
583 cpl_test_eq(cpl_propertylist_get_int(tableprops,
XSH_NAXIS), 2);
584 cpl_test_eq_string(cpl_propertylist_get_string(tableprops,
587 cpl_test_eq_string(cpl_propertylist_get_string(tableprops,
594 cpl_test_abs(cpl_propertylist_get_double(tableprops,
601 cpl_test_abs(cpl_propertylist_get_double(tableprops,
606 cpl_test_abs(cpl_propertylist_get_double(tableprops,
609 cpl_test_abs(cpl_propertylist_get_double(tableprops,
616 cpl_test_eq_string(cpl_propertylist_get_string(tableprops,
XSH_EXTNAME),
627 for (i = 1; i <= expected_TFIELDS; ++i) {
628 char* field = cpl_sprintf(
"TTYPE%"CPL_SIZE_FORMAT, i);
629 cpl_test(
getlen(cpl_propertylist_get_string(tableprops, field)) > 1);
631 field = cpl_sprintf(
"TFORM%"CPL_SIZE_FORMAT, i);
632 cpl_test(
getlen(cpl_propertylist_get_string(tableprops, field)) > 1);
634 field = cpl_sprintf(
"TUNIT%"CPL_SIZE_FORMAT, i);
637 cpl_test_eq_string(cpl_propertylist_get_string(tableprops, field),
644 cpl_test_eq_string(cpl_propertylist_get_string(tableprops, field),
649 cpl_test(
getlen(cpl_propertylist_get_string(tableprops, field)) == 0);
652 cpl_test(
getlen(cpl_propertylist_get_string(tableprops, field)) > 1);
656 field = cpl_sprintf(
"TUTYP%"CPL_SIZE_FORMAT, i);
657 cpl_test(
getlen(cpl_propertylist_get_string(tableprops, field)) > 1);
659 field = cpl_sprintf(
"TUCD%"CPL_SIZE_FORMAT, i);
660 cpl_test(
getlen(cpl_propertylist_get_string(tableprops, field)) > 1);
665 cpl_test_eq(cpl_table_get_nrow(table), 1);
666 cpl_test_eq(cpl_table_get_ncol(table), expected_TFIELDS);
667 double expected_wave[] = {
668 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600
670 double expected_flux[] = { 0, 0, 0, 7 , 21 , 12 , 0, 0, 0, 0, 0};
671 double expected_errs[] = { 0, 0, 0, 0.25, 0.5, 0.25, 0, 0, 0, 0, 0};
672 int expected_qual[] = {16, 0, 0, 0 , 0 , 0 , 0, 0, 0, 33, 0};
673 double expected_snr[] = { 0, 0, 0, 28 , 42 , 48 , 0, 0, 0, 0, 0};
674 const cpl_array * wave_array = cpl_table_get_array(table,
676 cpl_test_nonnull(wave_array);
677 const cpl_array * flux_array = cpl_table_get_array(table,
679 cpl_test_nonnull(flux_array);
680 const cpl_array * errs_array = cpl_table_get_array(table,
682 cpl_test_nonnull(errs_array);
683 const cpl_array * qual_array = cpl_table_get_array(table,
685 cpl_test_nonnull(qual_array);
686 const cpl_array * snr_array = cpl_table_get_array(table,
688 cpl_test_nonnull(snr_array);
689 const double* calculated_wave = NULL;
690 if (wave_array != NULL) {
691 calculated_wave = cpl_array_get_data_double_const(wave_array);
692 cpl_test_nonnull(calculated_wave);
694 const double* calculated_flux = NULL;
695 if (flux_array != NULL) {
696 calculated_flux = cpl_array_get_data_double_const(flux_array);
697 cpl_test_nonnull(calculated_flux);
699 const double* calculated_errs = NULL;
700 if (errs_array != NULL) {
701 calculated_errs = cpl_array_get_data_double_const(errs_array);
702 cpl_test_nonnull(calculated_errs);
704 const int* calculated_qual = NULL;
705 if (qual_array != NULL) {
706 calculated_qual = cpl_array_get_data_int_const(qual_array);
707 cpl_test_nonnull(calculated_qual);
709 const double* calculated_snr = NULL;
710 if (snr_array != NULL) {
711 calculated_snr = cpl_array_get_data_double_const(snr_array);
712 cpl_test_nonnull(calculated_snr);
714 if (calculated_wave != NULL && calculated_flux != NULL &&
715 calculated_errs != NULL && calculated_qual != NULL &&
716 calculated_snr != NULL)
718 for (i = 0; i < 11; ++i) {
719 cpl_test_abs(calculated_wave[i], expected_wave[i], FLT_EPSILON);
720 cpl_test_abs(calculated_flux[i], expected_flux[i], FLT_EPSILON);
721 cpl_test_abs(calculated_errs[i], expected_errs[i], FLT_EPSILON);
722 cpl_test_eq(calculated_qual[i], expected_qual[i]);
723 cpl_test_abs(calculated_snr[i], expected_snr[i], FLT_EPSILON);
728 if (expect_uncalib) {
730 cpl_test_nonnull(flux_array);
732 cpl_test_nonnull(errs_array);
733 calculated_flux = NULL;
734 if (flux_array != NULL) {
735 calculated_flux = cpl_array_get_data_double_const(flux_array);
736 cpl_test_nonnull(calculated_flux);
738 calculated_errs = NULL;
739 if (errs_array != NULL) {
740 calculated_errs = cpl_array_get_data_double_const(errs_array);
741 cpl_test_nonnull(calculated_errs);
743 if (calculated_flux != NULL && calculated_errs != NULL)
745 for (i = 0; i < 11; ++i) {
746 cpl_test_abs(calculated_flux[i], expected_flux[i], FLT_EPSILON);
747 cpl_test_abs(calculated_errs[i], expected_errs[i], FLT_EPSILON);
753 cpl_table_delete(table);
754 cpl_propertylist_delete(tableprops);
755 cpl_propertylist_delete(props);
static xsh_instrument * instrument
cpl_frame * xsh_spectrum_save(xsh_spectrum *s, const char *filename, const char *tag)
save a spectrum
xsh_spectrum * xsh_spectrum_1D_create(double lambda_min, double lambda_max, double lambda_step)
Create a 1D spectrum structure.
void xsh_spectrum_free(xsh_spectrum **s)
free memory associated to an 1D spectrum
void xsh_instrument_set_mode(xsh_instrument *i, XSH_MODE mode)
Set a mode on instrument structure.
void xsh_instrument_set_recipe_id(xsh_instrument *instrument, const char *recipe_id)
Set the recipe_id into the instrument structure.
void xsh_instrument_set_arm(xsh_instrument *i, XSH_ARM arm)
Set an arm on instrument structure.
void xsh_instrument_set_lamp(xsh_instrument *i, XSH_LAMP lamp)
Set a lamp on instrument structure.
void xsh_instrument_free(xsh_instrument **instrument)
free an instrument structure
xsh_instrument * xsh_instrument_new(void)
create new instrument structure
void xsh_free_temporary_files(void)
Free temprary files list.
void xsh_free_product_files(void)
Free temprary files list.
cpl_propertylist * errs_header
cpl_propertylist * flux_header
#define EXPECTED_NCOMBINE
#define EXPECTED_TOT_FLUX
#define PRODUCT_FRAME_TAG
#define PRODUCT_FILE_NAME
#define EXPECTED_WAVELMAX
#define EXPECTED_WAVELMIN
static int check_output_file(cpl_boolean expect_uncalib)
Checks that the generated output file is valid.
int main(void)
Unit tests of the Science Data Product DFS functions.
static int create_dummy_raw_frame(cpl_frameset *frames)
Creates an input FITS file representing a dummy raw data file.
#define SLIT_STRING_VALUE
#define EXPECTED_SPEC_VAL
#define EXPECTED_TFIELDS_UNCAL
#define EXPECTED_PRODCATG
static int create_input_product_frame(cpl_frameset *frames, const cpl_parameterlist *params, xsh_instrument *instrument)
Creates a 1D spectrum product FITS file in X-Shooter native format.
#define EXPECTED_DISPELEM
#define EXPECTED_APERTURE
static int getlen(const char *str)
#define test_success(expr)
#define EXPECTED_SPEC_BIN
void xsh_add_product_spectrum(cpl_frame *frame, cpl_frameset *frameset, const cpl_parameterlist *parameters, const char *recipe_id, xsh_instrument *instr, cpl_frame **result_frame, cpl_propertylist *qclist)
void xsh_add_sdp_product_spectrum(const cpl_frame *flux_cal_frame, const cpl_frame *uncal_frame, cpl_frameset *frameset, const cpl_frameset *usedframes, const cpl_parameterlist *parameters, const char *recipe_id, xsh_instrument *instrument, cpl_propertylist *qclist)
Creates a 1D spectrum product in the Science Data Product format.
#define XSH_SDP_KEYWORD_NCOMBINE
#define XSH_SDP_KEYWORD_PRODCATG
#define XSH_SDP_KEYWORD_TELAPSE
#define XSH_SDP_KEYWORD_FLUXERR
#define XSH_SDP_COLUMN_FLUX
#define XSH_SDP_KEYWORD_INHERIT
#define XSH_SDP_KEYWORD_LAMNLIN
#define XSH_SDP_KEYWORD_WAVELMIN
#define XSH_SDP_COLUMN_WAVE
#define XSH_SDP_COLUMN_ERR_REDUCED
#define XSH_SDP_KEYWORD_LAMRMS
#define XSH_SDP_KEYWORD_OBSTECH
#define XSH_SDP_KEYWORD_TDMAX(n)
#define XSH_SDP_KEYWORD_OBJECT
#define XSH_SDP_KEYWORD_ORIGIN
#define XSH_SDP_COLUMN_QUAL
#define XSH_SDP_KEYWORD_WAVELMAX
#define XSH_SDP_KEYWORD_APERTURE
#define XSH_SDP_COLUMN_FLUX_REDUCED
#define XSH_SDP_COLUMN_SNR
#define XSH_SDP_KEYWORD_SPEC_RES
#define XSH_SDP_COLUMN_ERR
#define XSH_SDP_KEYWORD_PRODLVL
#define XSH_SDP_KEYWORD_PROCSOFT
#define XSH_SDP_KEYWORD_SPEC_ERR
#define XSH_SDP_KEYWORD_TDMIN(n)
#define XSH_SDP_KEYWORD_NELEM
#define XSH_SDP_KEYWORD_M_EPOCH
#define XSH_SDP_KEYWORD_DISPELEM
#define XSH_SDP_KEYWORD_PROV(n)
#define XSH_SDP_KEYWORD_SPECSYS
#define XSH_SDP_KEYWORD_OBID1
#define XSH_SDP_KEYWORD_SPEC_BW
#define XSH_SDP_KEYWORD_DETRON
#define XSH_SDP_KEYWORD_FLUXCAL
#define XSH_SDP_KEYWORD_TOT_FLUX
#define XSH_SDP_KEYWORD_REFERENC
#define XSH_SDP_KEYWORD_TITLE
#define XSH_SDP_KEYWORD_SPEC_VAL
#define XSH_OBS_TARG_NAME
#define XSH_SDP_KEYWORD_PROG_ID
#define XSH_SDP_KEYWORD_TMID
#define XSH_SDP_KEYWORD_CONTNORM
#define XSH_SDP_KEYWORD_SPEC_BIN
#define XSH_SDP_KEYWORD_SPEC_SYE
#define XSH_SDP_KEYWORD_EFFRON