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;
331 cpl_propertylist ** p2vm_qcs = NULL;
342 cpl_error_get_code()) ;
348 used_frameset = cpl_frameset_new();
355 if (!cpl_frameset_is_empty (static_param_frameset)) {
356 frame = cpl_frameset_get_position (static_param_frameset, 0);
360 cpl_msg_info (cpl_func,
"There is no STATIC_PARAM in the frameset");
364 if (cpl_frameset_is_empty (dispvis_frameset)){
379 if ( cpl_frameset_is_empty(p2vmcalib_frameset) ||
380 cpl_frameset_is_empty(wavecalib_frameset) ||
381 cpl_frameset_is_empty(flatcalib_frameset) ||
382 cpl_frameset_is_empty(badcalib_frameset) ||
383 ( cpl_frameset_is_empty(dark_frameset) &&
384 cpl_frameset_is_empty(darkcalib_frameset) ) ||
385 cpl_frameset_is_empty(disp_frameset) ||
386 cpl_frameset_is_empty(wavelampcalib_frameset) ) {
388 cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
389 "Missing P2VM, DARK, BAD, WAVE, WAVELAMP, FLAT or DISP frames") ;
397 if (!cpl_frameset_is_empty (dark_frameset)) {
399 frame = cpl_frameset_get_position (dark_frameset, 0);
411 NULL, frame,
"gravi_single",
416 else if (!cpl_frameset_is_empty (darkcalib_frameset)) {
418 frame = cpl_frameset_get_position (darkcalib_frameset, 0);
424 cpl_msg_error (cpl_func,
"There is no DARK in the frame set");
427 frame = cpl_frameset_get_position (badcalib_frameset, 0);
431 frame = cpl_frameset_get_position (flatcalib_frameset, 0);
435 frame = cpl_frameset_get_position (wavecalib_frameset, 0);
439 frame = cpl_frameset_get_position (p2vmcalib_frameset, 0);
449 nb_frame = cpl_frameset_get_size (disp_frameset);
450 p2vm_qcs = cpl_malloc(
sizeof(cpl_propertylist*) * nb_frame);
452 for (
int ivis = 0; ivis < nb_frame; ivis++) {
453 current_frameset = cpl_frameset_duplicate (used_frameset);
454 p2vm_qcs[ivis] = cpl_propertylist_new();
456 cpl_msg_info (cpl_func,
"*** Processing file %d over %d *** ", ivis+1, nb_frame);
458 frame = cpl_frameset_get_position (disp_frameset, ivis);
464 badpix_map, NULL, parlist,
486 current_frameset, frame,
"gravity_disp",
495 "gravi_single", parlist);
537 current_frameset, frame,
"gravity_disp",
545 cpl_size current_frame = 0;
546 while (current_frame >= 0)
561 current_frameset, frame,
"gravity_disp",
568 if (vis_data == NULL) {
569 vis_data = tmpvis_data; tmpvis_data = NULL;
585 parlist, current_frameset, frame,
592 FREE (cpl_frameset_delete, current_frameset);
605 frame = cpl_frameset_get_position (wavelampcalib_frameset, 0);
612 cpl_frameset_join (used_frameset, disp_frameset);
613 frame = cpl_frameset_get_position (disp_frameset, 0);
616 used_frameset, frame,
"gravity_disp",
626 FREE (cpl_frameset_delete, darkcalib_frameset);
627 FREE (cpl_frameset_delete, wavecalib_frameset);
628 FREE (cpl_frameset_delete, dark_frameset);
629 FREE (cpl_frameset_delete, flatcalib_frameset);
630 FREE (cpl_frameset_delete, badcalib_frameset);
631 FREE (cpl_frameset_delete, p2vmcalib_frameset);
632 FREE (cpl_frameset_delete, wavelampcalib_frameset);
633 FREELOOP(cpl_propertylist_delete, p2vm_qcs, nb_frame);
638 frame = cpl_frameset_get_position (dispvis_frameset, 0);
643 disp_frameset = cpl_frameset_duplicate (dispvis_frameset);
657 frame = cpl_frameset_get_position (disp_frameset, 0);
661 used_frameset, frame,
"gravity_disp",
682 FREE (cpl_frameset_delete, disp_frameset);
683 FREE (cpl_frameset_delete, dispvis_frameset);
684 FREE (cpl_frameset_delete, darkcalib_frameset);
685 FREE (cpl_frameset_delete, dark_frameset);
686 FREE (cpl_frameset_delete, wavecalib_frameset);
687 FREE (cpl_frameset_delete, badcalib_frameset);
688 FREE (cpl_frameset_delete, flatcalib_frameset);
689 FREE (cpl_frameset_delete, p2vmcalib_frameset);
690 FREE (cpl_frameset_delete, wavelampcalib_frameset);
691 FREE (cpl_frameset_delete, used_frameset);
692 FREE (cpl_frameset_delete, current_frameset);
693 FREELOOP(cpl_propertylist_delete, p2vm_qcs, nb_frame);
696 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)
#define FREELOOP(function, variable, n)
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.
cpl_error_code gravi_copy_p2vm_qcs(gravi_data *p2vmred_data, cpl_propertylist *plist)
Copy PFACTOR and VFACTOR QCs so that they may be aggregated over all frames.
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, cpl_propertylist **frame_qcs, cpl_size nb_frame)
Compute the QC parameters for a VIS (averaged) data.