70static int gravity_disp(cpl_frameset *,
const cpl_parameterlist *);
76static char gravity_disp_short[] =
"Calibrate the linearity and the dispersion of the differential delay lines.";
78 "This recipe is associated to the template GRAVI_all_disp. It measures the phases obtained on the internal source at the position of the Argon lines and various positions (= fiber stretch) of the Fibered Differential Delay Lines (FDDL). It deduces the linearity model and the dispersion model of the differential delay lines. These models are stored as polynomials versus wavelength.\n"
80 "* Reduce all the input DISP files (see gravity_vis), write each product\n"
81 "* Compute the dispersion parameters from this entire dataset\n"
113 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
114 cpl_plugin * plugin = &recipe->interface;
116 if (cpl_plugin_init(plugin,
118 GRAVI_BINARY_VERSION,
119 CPL_PLUGIN_TYPE_RECIPE,
123 "Nabih Azouaoui, Vincent Lapeyrere, JB. Le Bouquin",
129 cpl_msg_error(cpl_func,
"Plugin initialization failed");
130 (void)cpl_error_set_where(cpl_func);
134 if (cpl_pluginlist_append(list, plugin)) {
135 cpl_msg_error(cpl_func,
"Error adding plugin to list");
136 (void)cpl_error_set_where(cpl_func);
158 if (cpl_error_get_code() != CPL_ERROR_NONE) {
159 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
160 cpl_func, __LINE__, cpl_error_get_where());
161 return (
int)cpl_error_get_code();
164 if (plugin == NULL) {
165 cpl_msg_error(cpl_func,
"Null plugin");
166 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
170 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
171 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
172 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
176 recipe = (cpl_recipe *)plugin;
179 recipe->parameters = cpl_parameterlist_new();
180 if (recipe->parameters == NULL) {
181 cpl_msg_error(cpl_func,
"Parameter list allocation failed");
182 cpl_ensure_code(0, (
int)CPL_ERROR_ILLEGAL_OUTPUT);
224 cpl_errorstate initial_errorstate = cpl_errorstate_get();
227 if (cpl_error_get_code() != CPL_ERROR_NONE) {
228 cpl_msg_error(cpl_func,
"%s():%d: An error is already set: %s",
229 cpl_func, __LINE__, cpl_error_get_where());
230 return (
int)cpl_error_get_code();
233 if (plugin == NULL) {
234 cpl_msg_error(cpl_func,
"Null plugin");
235 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
239 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
240 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
241 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
245 recipe = (cpl_recipe *)plugin;
248 if (recipe->parameters == NULL) {
249 cpl_msg_error(cpl_func,
"Recipe invoked with NULL parameter list");
250 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
252 if (recipe->frames == NULL) {
253 cpl_msg_error(cpl_func,
"Recipe invoked with NULL frame set");
254 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
258 recipe_status =
gravity_disp(recipe->frames, recipe->parameters);
262 if (cpl_dfs_update_product_header(recipe->frames)) {
264 recipe_status = (int)cpl_error_get_code();
268 if (!cpl_errorstate_is_equal(initial_errorstate)) {
271 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
274 return recipe_status;
288 if (plugin == NULL) {
289 cpl_msg_error(cpl_func,
"Null plugin");
290 cpl_ensure_code(0, (
int)CPL_ERROR_NULL_INPUT);
294 if (cpl_plugin_get_type(plugin) != CPL_PLUGIN_TYPE_RECIPE) {
295 cpl_msg_error(cpl_func,
"Plugin is not a recipe");
296 cpl_ensure_code(0, (
int)CPL_ERROR_TYPE_MISMATCH);
300 recipe = (cpl_recipe *)plugin;
302 cpl_parameterlist_delete(recipe->parameters);
318 const cpl_parameterlist * parlist)
320 cpl_frameset * disp_frameset=NULL, * darkcalib_frameset=NULL,
321 * dark_frameset=NULL, * wavecalib_frameset=NULL,
322 * badcalib_frameset=NULL, * flatcalib_frameset=NULL, * dispvis_frameset=NULL,
323 * p2vmcalib_frameset=NULL, * wavelampcalib_frameset=NULL, *used_frameset=NULL,
324 * current_frameset=NULL, *static_param_frameset=NULL;
326 cpl_frame * frame=NULL;
328 gravi_data * disp_map = NULL, * data = NULL, * dark_map = NULL, * wave_map = NULL,
329 * profile_map = NULL, * badpix_map = NULL, * p2vmred_data = NULL, * preproc_data = NULL,
330 * p2vm_map = NULL, * vis_data = NULL, * tmpvis_data=NULL, * argon_data=NULL, * static_param_data=NULL;
341 cpl_error_get_code()) ;
347 used_frameset = cpl_frameset_new();
354 if (!cpl_frameset_is_empty (static_param_frameset)) {
355 frame = cpl_frameset_get_position (static_param_frameset, 0);
359 cpl_msg_info (cpl_func,
"There is no STATIC_PARAM in the frameset");
363 if (cpl_frameset_is_empty (dispvis_frameset)){
378 if ( cpl_frameset_is_empty(p2vmcalib_frameset) ||
379 cpl_frameset_is_empty(wavecalib_frameset) ||
380 cpl_frameset_is_empty(flatcalib_frameset) ||
381 cpl_frameset_is_empty(badcalib_frameset) ||
382 ( cpl_frameset_is_empty(dark_frameset) &&
383 cpl_frameset_is_empty(darkcalib_frameset) ) ||
384 cpl_frameset_is_empty(disp_frameset) ||
385 cpl_frameset_is_empty(wavelampcalib_frameset) ) {
387 cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
388 "Missing P2VM, DARK, BAD, WAVE, WAVELAMP, FLAT or DISP frames") ;
396 if (!cpl_frameset_is_empty (dark_frameset)) {
398 frame = cpl_frameset_get_position (dark_frameset, 0);
410 NULL, frame,
"gravi_single",
415 else if (!cpl_frameset_is_empty (darkcalib_frameset)) {
417 frame = cpl_frameset_get_position (darkcalib_frameset, 0);
423 cpl_msg_error (cpl_func,
"There is no DARK in the frame set");
426 frame = cpl_frameset_get_position (badcalib_frameset, 0);
430 frame = cpl_frameset_get_position (flatcalib_frameset, 0);
434 frame = cpl_frameset_get_position (wavecalib_frameset, 0);
438 frame = cpl_frameset_get_position (p2vmcalib_frameset, 0);
448 nb_frame = cpl_frameset_get_size (disp_frameset);
449 for (
int ivis = 0; ivis < nb_frame; ivis++) {
450 current_frameset = cpl_frameset_duplicate (used_frameset);
452 cpl_msg_info (cpl_func,
"*** Processing file %d over %d *** ", ivis+1, nb_frame);
454 frame = cpl_frameset_get_position (disp_frameset, ivis);
460 badpix_map, NULL, parlist,
482 current_frameset, frame,
"gravity_disp",
491 "gravi_single", parlist);
529 current_frameset, frame,
"gravity_disp",
537 cpl_size current_frame = 0;
538 while (current_frame >= 0)
553 current_frameset, frame,
"gravity_disp",
560 if (vis_data == NULL) {
561 vis_data = tmpvis_data; tmpvis_data = NULL;
577 parlist, current_frameset, frame,
584 FREE (cpl_frameset_delete, current_frameset);
594 frame = cpl_frameset_get_position (wavelampcalib_frameset, 0);
601 cpl_frameset_join (used_frameset, disp_frameset);
602 frame = cpl_frameset_get_position (disp_frameset, 0);
605 used_frameset, frame,
"gravity_disp",
615 FREE (cpl_frameset_delete, darkcalib_frameset);
616 FREE (cpl_frameset_delete, wavecalib_frameset);
617 FREE (cpl_frameset_delete, dark_frameset);
618 FREE (cpl_frameset_delete, flatcalib_frameset);
619 FREE (cpl_frameset_delete, badcalib_frameset);
620 FREE (cpl_frameset_delete, p2vmcalib_frameset);
621 FREE (cpl_frameset_delete, wavelampcalib_frameset);
626 frame = cpl_frameset_get_position (dispvis_frameset, 0);
631 disp_frameset = cpl_frameset_duplicate (dispvis_frameset);
645 frame = cpl_frameset_get_position (disp_frameset, 0);
649 used_frameset, frame,
"gravity_disp",
670 FREE (cpl_frameset_delete, disp_frameset);
671 FREE (cpl_frameset_delete, dispvis_frameset);
672 FREE (cpl_frameset_delete, darkcalib_frameset);
673 FREE (cpl_frameset_delete, dark_frameset);
674 FREE (cpl_frameset_delete, wavecalib_frameset);
675 FREE (cpl_frameset_delete, badcalib_frameset);
676 FREE (cpl_frameset_delete, flatcalib_frameset);
677 FREE (cpl_frameset_delete, p2vmcalib_frameset);
678 FREE (cpl_frameset_delete, wavelampcalib_frameset);
679 FREE (cpl_frameset_delete, used_frameset);
680 FREE (cpl_frameset_delete, current_frameset);
683 return (
int)cpl_error_get_code();
typedefCPL_BEGIN_DECLS struct _gravi_data_ gravi_data
#define GRAVI_RECIPE_OUTPUT
#define GRAVI_P2VMRED_SINGLE_CALIB
#define GRAVI_RECIPE_FLOW
#define GRAVI_ASTROREDUCED
#define GRAVI_WAVELAMP_MAP
#define GRAVI_RECIPE_INPUT
#define GRAVI_VIS_SINGLE_CALIB
cpl_msg_info(cpl_func, "Compute WAVE_SCAN for %s", GRAVI_TYPE(type_data))
#define GRAVI_ARRAY_GEOMETRY_EXT
#define GRAVI_METROLOGY_EXT
#define GRAVI_OPTICAL_TRAIN_EXT
#define CPLCHECK_CLEAN(msg)
#define gravi_msg_function_exit(flag)
#define FREE(function, variable)
#define gravi_msg_function_start(flag)
#define CPLCHECK_MSG(msg)
static char gravity_disp_description[]
int cpl_plugin_get_info(cpl_pluginlist *list)
Build the list of available plugins, for this module.
static int gravity_disp_exec(cpl_plugin *)
Execute the plugin instance given by the interface.
static int gravity_disp_create(cpl_plugin *)
Setup the recipe options
static int gravity_disp(cpl_frameset *, const cpl_parameterlist *)
The perpese of the recipe is to reduce the raw calibration file for dispersion calibration.
static int gravity_disp_destroy(cpl_plugin *)
Destroy what has been created by the 'create' function.
static char gravity_disp_short[]
gravi_data * gravi_compute_dark(gravi_data *raw_data)
Compute the DARK calibration map.
cpl_error_code gravi_data_clean_for_astro(gravi_data *data)
Clean the data to keep only OIFITS extensions related to SC.
gravi_data * gravi_data_load_frame(cpl_frame *frame, cpl_frameset *used_frameset)
Load a FITS file and create a gravi_data.
cpl_error_code gravi_data_detector_cleanup(gravi_data *data, const cpl_parameterlist *parlist)
Perform self-bias correction to the SC raw data.
gravi_data * gravi_data_load_rawframe(cpl_frame *frame, cpl_frameset *used_frameset)
Load a RAW FITS file and create a gravi_data.
cpl_error_code gravi_data_move_ext(gravi_data *output, gravi_data *input, const char *name)
Move extensions from one data to another.
cpl_error_code gravi_data_append(gravi_data *first, const gravi_data *second, int force)
Append a gravi_data into another existing one.
cpl_error_code gravi_data_save_new(gravi_data *self, cpl_frameset *allframes, const char *filename, const char *suffix, const cpl_parameterlist *parlist, cpl_frameset *usedframes, cpl_frame *frame, const char *recipe, cpl_propertylist *applist, const char *proCatg)
Save a gravi data in a CPL-complian FITS file.
cpl_error_code gravi_data_copy_ext(gravi_data *output, gravi_data *input, const char *name)
Copy extensions from one data to another.
void gravi_data_delete(gravi_data *self)
Delete a gravi data.
cpl_parameter * gravi_parameter_add_astro_file(cpl_parameterlist *self)
int gravi_param_get_bool(const cpl_parameterlist *parlist, const char *name)
cpl_parameter * gravi_parameter_add_static_name(cpl_parameterlist *self)
cpl_parameter * gravi_parameter_add_p2vmred_file(cpl_parameterlist *self)
cpl_parameter * gravi_parameter_add_metrology(cpl_parameterlist *self)
cpl_error_code gravi_parameter_add_rejection(cpl_parameterlist *self, int isCalib)
Add rejection parameters to the input parameter list.
cpl_error_code gravi_parameter_add_compute_snr(cpl_parameterlist *self)
cpl_parameter * gravi_parameter_add_extract(cpl_parameterlist *self)
cpl_parameter * gravi_parameter_add_vis_file(cpl_parameterlist *self)
cpl_frameset * gravi_frameset_extract_wave_map(cpl_frameset *frameset)
cpl_frameset * gravi_frameset_extract_disp_data(cpl_frameset *frameset)
cpl_frameset * gravi_frameset_extract_dispvis_data(cpl_frameset *frameset)
cpl_frameset * gravi_frameset_extract_bad_map(cpl_frameset *frameset)
cpl_parameter * gravi_parameter_add_spectrum_file(cpl_parameterlist *self)
cpl_frameset * gravi_frameset_extract_dark_map(cpl_frameset *frameset)
cpl_frameset * gravi_frameset_extract_wavelamp_map(cpl_frameset *frameset)
cpl_error_code gravi_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
cpl_parameter * gravi_parameter_add_preproc_file(cpl_parameterlist *self)
cpl_frameset * gravi_frameset_extract_p2vm_map(cpl_frameset *frameset)
cpl_frameset * gravi_frameset_extract_static_param(cpl_frameset *frameset)
cpl_error_code gravi_parameter_add_compute_vis(cpl_parameterlist *self, int isCalib)
cpl_parameter * gravi_parameter_add_biassub_file(cpl_parameterlist *self)
cpl_frameset * gravi_frameset_extract_flat_map(cpl_frameset *frameset)
void gravity_print_banner(void)
cpl_frameset * gravi_frameset_extract_dark_data(cpl_frameset *frameset)
Extract DARK_RAW frame from the input frameset.
cpl_error_code gravi_parameter_add_compute_signal(cpl_parameterlist *self)
gravi_data * gravi_compute_disp(gravi_data *vis_data)
Compute the DISP_MODEL calibration map.
cpl_error_code gravi_disp_cleanup(gravi_data *vis_data)
Cleanup a VIS gravi_data before calibrating the dispersion.
cpl_error_code gravi_metrology_reduce(gravi_data *data, gravi_data *eop_data, gravi_data *static_param_data, gravi_data *met_pos, const cpl_parameterlist *parlist)
Reduce the metrology.
cpl_error_code gravi_compute_opdc_state(gravi_data *p2vmred_data)
Compute the real-time tracking state from OPDC.
gravi_data * gravi_compute_p2vmred(gravi_data *preproc_data, gravi_data *p2vm_map, const char *mode, const cpl_parameterlist *parlist)
Converts preprocessed data into coherent fluxes using the P2VM.
cpl_error_code gravi_align_spectrum(gravi_data *spectrum_data, gravi_data *wave_map, gravi_data *p2vm_map, enum gravi_detector_type det_type)
Regrid the regions into a common wavelength (in-place)
gravi_data * gravi_extract_spectrum(gravi_data *raw_data, gravi_data *profile_map, gravi_data *dark_map, gravi_data *bad_map, gravi_data *sky_map, const cpl_parameterlist *parlist, enum gravi_detector_type det_type)
Create the SPECTRUM gravi_data with extracted spectrum per region.
cpl_error_code gravi_compute_snr(gravi_data *p2vmred_data, const cpl_parameterlist *parlist)
Compute real-time SNR and Group-Delay of the observation.
cpl_error_code gravi_compute_signals(gravi_data *p2vmred_data, gravi_data *disp_data, const cpl_parameterlist *parlist)
Create intermediate signal in the P2VMREDUCED file.
cpl_error_code gravi_compute_outliers(gravi_data *p2vmred_data, const cpl_parameterlist *parlist)
Compute the outliers flags.
cpl_error_code gravi_compute_rejection(gravi_data *p2vmred_data, const cpl_parameterlist *parlist)
Create rejection flags P2VMREDUCED file.
const char * gravi_get_license(void)
Get the pipeline copyright and license.
gravi_data * gravi_compute_vis(gravi_data *p2vmred_data, const cpl_parameterlist *parlist, cpl_size *current_frame)
The function average the individual frames of a P2VMREDUCED file into a final, single observation per...
cpl_error_code gravi_vis_mjd_to_time(gravi_data *vis_data)
Recompute the TIME column of all OIFITS extension from the MJD column, following the OIFITS standard ...
cpl_error_code gravi_compute_vis_qc(gravi_data *vis_data, cpl_frameset *frameset)
The function compute the QC parameters for a VIS (averaged) data.