98 #include <uves_response_utils.h>
100 #include <uves_utils.h>
101 #include <uves_utils_wrappers.h>
102 #include <uves_pfits.h>
103 #include <uves_error.h>
104 #include <uves_msg.h>
141 const cpl_table *flux_table,
147 cpl_image *response = NULL;
148 cpl_table *catalogue_flux = NULL;
151 nx = cpl_image_get_size_x(spectrum);
152 norders = cpl_image_get_size_y(spectrum);
154 response = cpl_image_new(nx, norders, CPL_TYPE_DOUBLE);
156 check( catalogue_flux =
uves_align(raw_header, flux_table, PACCURACY, ref_obj_id),
157 "Cannot read catalogue flux");
165 "Error reading bin width from header");
167 for (order = 1; order <= norders; order++)
178 "Error reading start wavelength from header");
183 "Error reading start wavelength from header");
186 for (x = 1; x <= nx; x++)
190 double flux, std_flux, resp;
193 lambda = lambda_start + (x-1) * dlambda;
195 check( flux = cpl_image_get(spectrum, x, order, &pis_rejected),
196 "Error reading flux");
202 lambda, catalogue_flux,
203 "LAMBDA",
"F_LAMBDA", &istart),
204 "Error interpolating catalogue flux");
208 resp = (flux == 0) ? 0 : std_flux / flux;
212 resp = (std_flux == 0) ? 0 : flux / std_flux;
215 check( cpl_image_set(response, x, order, resp),
216 "Error writing response image");
220 cpl_image_reject(response, x, order);
227 uves_free_table(&catalogue_flux);
228 if (cpl_error_get_code() != CPL_ERROR_NONE)
230 uves_free_image(&response);
259 char **ref_name_dynamic)
261 double obj_ra, obj_dec;
265 double std_ra = 0, std_dec = 0;
266 const char *ref_type = NULL;
268 cpl_table *result = NULL;
272 assure_nomsg( ref_name_dynamic != NULL, CPL_ERROR_NULL_INPUT );
273 *ref_name_dynamic = NULL;
278 uves_msg(
"Object RA, DEC = (%e, %e)", obj_ra, obj_dec);
281 for (i = 0; i < cpl_table_get_nrow(flux_table); i++)
283 double ref_ra, ref_dec;
286 check( ref_ra = cpl_table_get_double(flux_table,
"RA_DEG", i, NULL),
287 "Could not read catalogue star right ascension");
288 check( ref_dec = cpl_table_get_double(flux_table,
"DEC_DEG", i, NULL),
289 "Could not read catalogue star declination");
298 SIN_DEG(obj_dec)*SIN_DEG(ref_dec) +
299 COS_DEG(obj_dec)*COS_DEG(ref_dec)*COS_DEG(obj_ra - ref_ra);
301 dist = uves_max_double(dist, -1);
302 dist = uves_min_double(dist, 1);
304 dist = ACOS_DEG(dist) * 3600;
310 if (i == 0 || dist < min_dist)
329 assure( nident >= 1, CPL_ERROR_INCOMPATIBLE_INPUT,
330 "No catalogue object within %f arcsecs. "
331 "Nearest object is %f arcsecs away at (RA, DEC) = (%f, %f)",
332 accuracy, min_dist, std_ra, std_dec);
334 assure( nident <= 1, CPL_ERROR_INCOMPATIBLE_INPUT,
335 "%d matching catalogue objects found. Confused. "
336 "Decrease pointing accuracy (currently %f arcsecs) to get fewer matches",
339 check( *ref_name_dynamic = cpl_strdup(
340 cpl_table_get_string(flux_table,
"OBJECT", match_row)),
341 "Could not read reference object name");
343 check( ref_type = cpl_table_get_string(flux_table,
"TYPE", match_row),
344 "Could not read reference object type");
346 uves_msg(
"Object ID is '%s', type = '%s'. Residual between header/catalogue = %f arcsecs",
347 *ref_name_dynamic, ref_type, min_dist);
352 const char *columns[3] = {
"LAMBDA",
"BIN_WIDTH",
"F_LAMBDA"};
355 check( ndata = cpl_table_get_int(flux_table,
"NDATA", match_row, NULL),
356 "Error reading length of flux array");
358 result = cpl_table_new(ndata);
360 for(i = 0; i < 3; i++)
362 const cpl_array *data;
365 cpl_table_new_column(result, columns[i], CPL_TYPE_DOUBLE);
367 data = cpl_table_get_array(flux_table, columns[i], match_row);
371 uves_msg_debug(
"3d table array size = %" CPL_SIZE_FORMAT
", ndata = %d",
372 cpl_array_get_size(data), ndata);
374 assure( cpl_array_get_size(data) >= ndata,
375 CPL_ERROR_ILLEGAL_INPUT,
376 "Flux table row %d: column '%s' depth (%" CPL_SIZE_FORMAT
") "
377 "is less than NDATA (%d)",
378 match_row, columns[i], cpl_array_get_size(data), ndata);
380 for (indx = 0; indx < ndata; indx++)
383 cpl_table_set_double(result, columns[i], indx,
384 cpl_array_get_float(data, indx, NULL));
390 if (cpl_error_get_code() != CPL_ERROR_NONE)
392 uves_free_table(&result);
393 if (ref_name_dynamic != NULL)
395 cpl_free(*ref_name_dynamic);
396 *ref_name_dynamic = NULL;