49 cpl_frameset * frameset,
50 char * input_data_type)
52 cpl_propertylist * idp_plist = cpl_propertylist_new ();
58 cpl_table * oi_vis2_SC_allpol = NULL;
59 cpl_table * oi_T3_SC_allpol = NULL;
60 cpl_table * oi_wave_SC_allpol = NULL;
71 for (
int pol = 1; pol < npol_sc; pol++) {
77 for (
int pol = 0; pol < npol_sc; pol++) {
79 vis2err += this_pol_vis2err * this_pol_vis2err;
81 visphierr += this_pol_visphierr * this_pol_visphierr;
83 t3phierr += this_pol_t3phierr * this_pol_t3phierr;
87 sprintf (qc_name,
"VIS2ERR");
89 cpl_propertylist_set_comment (idp_plist, qc_name,
"Representative squared visibility error [%]");
91 sprintf (qc_name,
"VISPHERR");
93 cpl_propertylist_set_comment (idp_plist, qc_name,
"Representative visibility phase error [%]");
95 sprintf (qc_name,
"T3PHIERR");
97 cpl_propertylist_set_comment (idp_plist, qc_name,
"Representative closure phase error [deg]");
99 double min_uvcoord, max_uvcoord;
102 cpl_vector * baselines = cpl_vector_new(
GRAVI_NBASE*2);
103 for (cpl_size ibase=0; ibase <
GRAVI_NBASE; ibase++)
107 cpl_vector_set(baselines, 2*ibase, bl_start);
108 cpl_vector_set(baselines, 2*ibase + 1, bl_end);
110 double base_max = cpl_vector_get_max(baselines);
111 double base_min = cpl_vector_get_min(baselines);
112 cpl_vector_delete(baselines);
114 sprintf (qc_name,
"BASE_MAX");
116 cpl_propertylist_set_comment (idp_plist, qc_name,
"[m] Maximum baseline");
118 sprintf (qc_name,
"BASE_MIN");
120 cpl_propertylist_set_comment (idp_plist, qc_name,
"[m] Minimum baseline");
124 sprintf (qc_name,
"NUM_CHAN");
125 cpl_propertylist_update_int (idp_plist, qc_name, cpl_table_get_nrow(oi_wave_SC_allpol) / npol_sc );
126 cpl_propertylist_set_comment (idp_plist, qc_name,
"Number of wavelength channels");
129 double min_eff_wave = cpl_table_get_column_min(oi_wave_SC_allpol,
"EFF_WAVE");
130 double max_eff_wave = cpl_table_get_column_max(oi_wave_SC_allpol,
"EFF_WAVE");
132 sprintf (qc_name,
"WAVELMAX");
133 cpl_size max_eff_wave_pos;
134 cpl_table_get_column_maxpos(oi_wave_SC_allpol,
"EFF_WAVE", &max_eff_wave_pos);
135 double band_max_eff_wave = cpl_table_get_float(oi_wave_SC_allpol,
"EFF_BAND", max_eff_wave_pos, &null_flag);
137 cpl_propertylist_set_comment (idp_plist, qc_name,
"[nm] Maximum wavelength");
139 sprintf (qc_name,
"WAVELMIN");
140 cpl_size min_eff_wave_pos;
141 cpl_table_get_column_minpos(oi_wave_SC_allpol,
"EFF_WAVE", &min_eff_wave_pos);
142 double band_min_eff_wave = cpl_table_get_float(oi_wave_SC_allpol,
"EFF_BAND", min_eff_wave_pos, &null_flag);
144 cpl_propertylist_set_comment (idp_plist, qc_name,
"[nm] Minimum wavelength");
147 for (
int pol = 0; pol < npol_sc; pol++) {
149 double this_spec_bin = cpl_table_get_column_mean(this_wave_table,
"EFF_BAND");
150 if (this_spec_bin > spec_bin)
151 spec_bin = this_spec_bin;
153 sprintf (qc_name,
"SPEC_BIN");
155 cpl_propertylist_set_comment (idp_plist, qc_name,
"[nm] Average spectral coordinate bin size");
157 cpl_table_duplicate_column(oi_wave_SC_allpol,
"SPEC_RES", oi_wave_SC_allpol,
"EFF_WAVE");
158 cpl_table_divide_columns(oi_wave_SC_allpol,
"SPEC_RES",
"EFF_BAND");
160 sprintf (qc_name,
"SPEC_RES");
162 cpl_propertylist_set_comment (idp_plist, qc_name,
"Spectral resolution");
166 sprintf (qc_name,
"EXPTIME");
167 double mean_int_time = 0.0;
168 cpl_size valid_elem = 0;
169 cpl_size nrow = cpl_table_get_nrow (oi_vis2_SC_allpol);
170 double * inttime = cpl_table_get_data_double (oi_vis2_SC_allpol,
"INT_TIME");
171 for (cpl_size r=0; r<nrow;r++)
175 mean_int_time += inttime[r];
181 mean_int_time = mean_int_time / valid_elem;
183 cpl_propertylist_set_comment (idp_plist, qc_name,
"Exposure time");
187 if(!cpl_propertylist_has(
header,
"TEXPTIME"))
190 for (
int pol = 0; pol < npol_sc; pol++) {
192 double this_pol_texptime = 0;
193 cpl_size nsets = cpl_table_get_nrow(this_pol_table) /
GRAVI_NBASE ;
194 for (cpl_size set = 0 ; set < nsets ; set++)
198 this_pol_texptime += max_int_time;
199 cpl_table_delete(int_time_this_set);
201 texptime = fmax(texptime, this_pol_texptime);
204 sprintf (qc_name,
"TEXPTIME");
206 cpl_propertylist_set_comment (idp_plist, qc_name,
"Total exposure time");
211 cpl_propertylist_get_double(
header,
"TEXPTIME") );
212 cpl_propertylist_set_comment (idp_plist,
"TEXPTIME",
"Total exposure time");
217 cpl_propertylist_update_string (idp_plist,
"PRODCATG",
"SCIENCE.VISIBILITY");
218 cpl_propertylist_set_comment (idp_plist,
"PRODCATG",
"Data product category");
221 if(input_data_type != NULL)
223 if(strcmp(input_data_type,
"raw_science") == 0 || strcmp(input_data_type,
"raw_calibrator") == 0 )
225 cpl_propertylist_update_string (idp_plist,
"VISCAL",
"UNCALIBRATED");
226 cpl_propertylist_set_comment (idp_plist,
"VISCAL",
"Type of visibilities");
228 if(strcmp(input_data_type,
"vis_science") == 0 || strcmp(input_data_type,
"vis_calibrator") == 0 )
230 cpl_propertylist_update_string (idp_plist,
"VISCAL",
"CALIBRATED");
231 cpl_propertylist_set_comment (idp_plist,
"VISCAL",
"Type of visibilities");
236 double mjd_obs_first = DBL_MAX;
239 const cpl_frame *frame;
241 cpl_frameset_iterator *it = cpl_frameset_iterator_new(science_frames);
242 while ((frame = cpl_frameset_iterator_get(it)) != NULL) {
243 cpl_propertylist * this_frame_header = cpl_propertylist_load(cpl_frame_get_filename(frame), 0);
245 if (mjd_obs < mjd_obs_first)
246 mjd_obs_first = mjd_obs;
247 cpl_frameset_iterator_advance(it, 1);
248 cpl_propertylist_delete(this_frame_header);
250 cpl_frameset_delete(science_frames);
251 cpl_frameset_iterator_delete(it);
253 if (mjd_obs_first == DBL_MAX)
256 cpl_propertylist_set_comment (idp_plist,
"MJD-OBS",
"Start of observation");
259 double mjd_obs_last = 0;
260 double exptime_last = 0;
263 const cpl_frame *frame;
265 cpl_frameset_iterator *it = cpl_frameset_iterator_new(science_frames);
266 while ((frame = cpl_frameset_iterator_get(it)) != NULL) {
267 cpl_propertylist * this_frame_header = cpl_propertylist_load(cpl_frame_get_filename(frame), 0);
269 if (mjd_obs > mjd_obs_last)
271 mjd_obs_last = mjd_obs;
272 exptime_last = cpl_propertylist_get_double(this_frame_header,
"EXPTIME");
274 cpl_frameset_iterator_advance(it, 1);
275 cpl_propertylist_delete(this_frame_header);
277 cpl_frameset_delete(science_frames);
278 cpl_frameset_iterator_delete(it);
280 if (mjd_obs_last == 0)
282 if (exptime_last == 0)
284 if ( cpl_propertylist_has(
header,
"EXPTIME") )
285 exptime_last = cpl_propertylist_get_double(
header,
"EXPTIME");
287 exptime_last = cpl_propertylist_get_double(idp_plist,
"EXPTIME");
291 mjd_obs_last + exptime_last / 86400.);
292 cpl_propertylist_set_comment (idp_plist,
"MJD-END",
"End of observation");
295 cpl_propertylist_erase (
header,
"MJD-OBS");
298 cpl_propertylist_update_int (idp_plist,
"OBID1",
299 cpl_propertylist_get_int(
header,
"ESO OBS ID"));
300 cpl_propertylist_set_comment (idp_plist,
"OBID1",
"Obseration Block ID");
306 cpl_size nscience = cpl_frameset_get_size(science_frames);
307 cpl_frameset_delete(science_frames);
308 if(!cpl_propertylist_has(
header,
"NCOMBINE"))
312 cpl_propertylist_update_int (idp_plist,
"NCOMBINE", nscience);
313 cpl_propertylist_set_comment (idp_plist,
"NCOMBINE",
"Number of raw science combined");
318 cpl_propertylist_update_int (idp_plist,
"NCOMBINE",
319 cpl_propertylist_get_int(
header,
"NCOMBINE") );
320 cpl_propertylist_set_comment (idp_plist,
"NCOMBINE",
"Number of raw science combined");
327 if(cpl_propertylist_has(
header,
"ESO DPR TECH"))
329 cpl_propertylist_update_string (idp_plist,
"OBSTECH",
330 cpl_propertylist_get_string(
header,
"ESO DPR TECH") );
331 cpl_propertylist_set_comment (idp_plist,
"OBSTECH",
"Observation technique");
333 else if(cpl_propertylist_has(
header,
"OBSTECH"))
335 cpl_propertylist_update_string (idp_plist,
"OBSTECH",
336 cpl_propertylist_get_string(
header,
"OBSTECH") );
337 cpl_propertylist_set_comment (idp_plist,
"OBSTECH",
"Observation technique");
341 cpl_propertylist_update_string (idp_plist,
"SPECSYS",
"TOPOCENT");
342 cpl_propertylist_set_comment (idp_plist,
"SPECSYS",
"Frame of reference for spectral coordinates");
345 cpl_propertylist_update_string (idp_plist,
"TIMESYS",
"UTC");
346 cpl_propertylist_set_comment (idp_plist,
"TIMESYS",
"Time system");
353 if ( !strcmp (resolution,
"HIGH") )
355 if ( !strcmp (resolution,
"MED") )
357 if ( !strcmp (resolution,
"LOW") )
360 cpl_propertylist_set_comment (idp_plist,
"SPEC_ERR",
"Statistical error in spectral coordinate");
365 cpl_propertylist_set_comment (idp_plist,
"SPEC_SYE",
"Systematic error in spectral coordinate");
370 const cpl_frame *frame;
372 char prov_keyword[8];
373 cpl_frameset_iterator *it = cpl_frameset_iterator_new(frameset);
374 while ((frame = cpl_frameset_iterator_get(it)) != NULL) {
382 snprintf(prov_keyword, 7,
"PROV%zu",i_prov);
383 const char * filename = cpl_frame_get_filename(frame);
384 const char * filename_no_path = strrchr(filename,
'/');
385 if (filename_no_path == NULL)
386 filename_no_path = filename;
388 filename_no_path += 1;
389 cpl_propertylist_update_string(idp_plist, prov_keyword, filename_no_path);
392 cpl_frameset_iterator_advance(it, 1);
394 cpl_frameset_iterator_delete(it);
400 if(!cpl_table_has_column(oi_array,
"FOV"))
402 cpl_table_new_column(oi_array,
"FOV", CPL_TYPE_DOUBLE);
403 cpl_table_new_column(oi_array,
"FOVTYPE", CPL_TYPE_STRING);
406 if (telname == NULL) {
407 cpl_msg_warning(cpl_func,
"Cannot get TELNAME, FOV is not determined");
410 if (telname[0] ==
'U')
416 cpl_table_fill_column_window_double(oi_array,
"FOV", 0, cpl_table_get_nrow(oi_array), fov);
417 cpl_table_fill_column_window_string(oi_array,
"FOVTYPE", 0, cpl_table_get_nrow(oi_array),
"RADIUS");
418 cpl_table_set_column_unit(oi_array,
"FOV",
"arcsec");
423 cpl_table_delete(oi_vis2_SC_allpol);
424 cpl_table_delete(oi_T3_SC_allpol);
425 cpl_table_delete(oi_wave_SC_allpol);
typedefCPL_BEGIN_DECLS struct _gravi_data_ gravi_data
#define gravi_data_get_oi_t3(data, type, pol, npol)
#define gravi_data_get_oi_vis2(data, type, pol, npol)
#define gravi_data_get_oi_wave(data, type, pol, npol)
#define gravi_data_get_oi_vis(data, type, pol, npol)
#define GRAVI_SINGLE_SCIENCE_RAW
#define GRAVI_VIS_DUAL_SCIENCE
#define GRAVI_VIS_SINGLE_SCIENCE
#define GRAVI_DUAL_CALIB_RAW
#define GRAVI_SINGLE_CALIB_RAW
#define GRAVI_DUAL_SCIENCE_RAW
cpl_propertylist * gravi_idp_compute(gravi_data *vis_data, cpl_propertylist *header, cpl_frameset *frameset, char *input_data_type)
Create IDP keywords to satisfy standard.
cpl_propertylist * header
cpl_propertylist_update_double(header, "ESO QC MINWAVE SC", cpl_propertylist_get_double(plist, "ESO QC MINWAVE SC"))
#define GRAVI_OI_VIS2_EXT
#define GRAVI_OI_ARRAY_EXT
double gravi_table_get_column_flagged_mean(cpl_table *table, const char *name)
Function to compute the mean of a column table with arrays.
double gravi_table_get_column_flagged_max(cpl_table *table, const char *name)
Function to compute the maximum of a column table with arrays.
int gravi_data_has_extension(gravi_data *raw_calib, const char *ext_name)
Check if data has extension with given EXTNAME.
cpl_table * gravi_data_get_table(gravi_data *self, const char *extname)
Return a pointer on a table extension by its EXTNAME.
cpl_frameset * gravi_frameset_extract_fringe_data(cpl_frameset *frameset)
int gravi_pfits_get_pola_num(const cpl_propertylist *plist, int type_data)
double gravi_pfits_get_projected_baseline_end(const cpl_propertylist *plist, int tel1, int tel2)
double gravi_pfits_get_projected_baseline_start(const cpl_propertylist *plist, int tel1, int tel2)
double gravi_pfits_get_mjd(const cpl_propertylist *plist)
const char * gravi_pfits_get_resolution(const cpl_propertylist *plist)
const char * gravi_conf_get_telname(int gravi_beam, cpl_propertylist *header)
int GRAVI_BASE_TEL[GRAVI_NBASE][2]
cpl_error_code gravi_data_get_minmax_uvcoord(const cpl_table *oi_vis2, double *min_uvcoord, double *max_uvcoord)
Compute the minimum and maximum values of sqrt(ucoord**2 + vcoord**2)