21#ifndef ERISP_ERIS_ERIS_IFU_DISTORTION_STATIC_H_
22#define ERISP_ERIS_ERIS_IFU_DISTORTION_STATIC_H_
31#include "eris_ifu_functions.h"
32#include "eris_ifu_vector.h"
33#include "eris_ifu_constants.h"
35#define NS_EST_SLIT_DIST 60
36#define NS_FIT_DEGREE 3
37#define ERIS_IFU_DIST_SLIT "slit_width"
38#define ERIS_IFU_DIST_YPOS "y_pos"
39#define ERIS_IFU_DIST_EDGE_L "edge_left"
40#define ERIS_IFU_DIST_EDGE_R "edge_right"
41#define ERIS_IFU_POLY_EDGE_L "l_min"
42#define ERIS_IFU_POLY_EDGE_R "r_max"
44#define ERIS_IFU_DIST_DBG_SLITLET "slitlet"
45#define ERIS_IFU_DIST_DBG_EDGE_LEFT "edge_left"
46#define ERIS_IFU_DIST_DBG_EDGE_RIGHT "edge_right"
47#define ERIS_IFU_DIST_DBG_CENTER "x"
48#define ERIS_IFU_DIST_DBG_CENTER_LEFT "x_l"
49#define ERIS_IFU_DIST_DBG_CENTER_RIGHT "x_r"
51#define ERIS_IFU_DIST_DBG_FN "eris_ifu_distortion_dbg_dist_row_est_cen_fit_cen.fits"
54 eris_ifu_vector *fit_l;
55 eris_ifu_vector *fit_c_l;
56 eris_ifu_vector *fit_c;
57 eris_ifu_vector *fit_c_r;
58 eris_ifu_vector *fit_r;
62 cpl_boolean lowerCutLevel);
67 cpl_table **cen_array);
70 const hdrl_image *fibre_on,
76 const cpl_vector *est_centers,
77 cpl_boolean do_fix_cnt);
79int eris_ifu_distortion_calc_y(
int n,
int i);
81int eris_ifu_distortion_target_left_edge(
int i);
83int eris_ifu_distortion_target_right_edge(
int i);
86 cpl_boolean cut_off_left,
87 cpl_boolean cut_off_right);
92 cpl_boolean cut_off_left,
93 cpl_boolean cut_off_right,
94 cpl_table **minmax_borders,
95 cpl_propertylist ***qc,
97 cpl_frameset* frameset,
98 const cpl_parameterlist* parlist);
103 cpl_boolean cut_off_left,
104 cpl_boolean cut_off_right);
107 const char *col_name,
108 const eris_ifu_vector *y_arc,
116 const eris_ifu_vector *data,
117 cpl_vector *val_to_fit,
123 const cpl_vector *values,
127 const cpl_table *minmax_borders,
129 cpl_frameset *frameset,
130 const cpl_parameterlist *parlist,
131 cpl_propertylist **qc);
134 cpl_polynomial **poly_u,
138 const cpl_polynomial *poly_u,
139 const cpl_polynomial *poly_v,
145 cpl_polynomial **poly_u,
146 const cpl_table *borders);
149 cpl_polynomial **poly_u,
150 const cpl_table *borders,
151 productDepthType productDepth);
154 const int *rowIndices);
157 cpl_propertylist *qc_list,
158 cpl_propertylist *pl,
159 cpl_frameset* frameset,
160 const cpl_parameterlist* parlist);
163 const hdrl_image *imgSlit,
167 cpl_table **centers_array,
168 cpl_table *valid_arc_lines,
170 cpl_boolean *cut_off_left,
171 cpl_boolean *cut_off_right,
172 const cpl_frameset* frameset,
173 const cpl_parameterlist* parlist);
183 const eris_ifu_vector *y,
193 cpl_table **centers_fitted,
195 cpl_image ***arcImgs,
197 const cpl_parameterlist* parlist,
201 int exposureCorrectionMode,
203 hdrl_imagelist **arcImages,
206 ifsPreopticsScale *scale,
207 ifsInstrument *instrument,
208 double saturation_threshold,
cpl_error_code eris_ifu_dist_warp_stats(const hdrl_image *hdrlWarpedImg, cpl_propertylist *qc_list, cpl_propertylist *pl, cpl_frameset *frameset, const cpl_parameterlist *parlist)
Compute QC statistics on warped image.
cpl_error_code eris_ifu_wavecal_processSof_dist(cpl_frameset *frames, int exposureCorrectionMode, int *arcImgCnt, hdrl_imagelist **arcImages, int **lampStates, ifsBand *band, ifsPreopticsScale *scale, ifsInstrument *instrument, double saturation_threshold, cpl_table **qclog)
Process arc lamp images for distortion calibration.
hdrl_image * eris_ifu_dist_warp_image_full(const hdrl_image *hdrl_img_in, cpl_polynomial **poly_u, int productDepth)
Warp full image using distortion polynomials (alternative method)
cpl_vector * eris_ifu_polyfit_edge(const eris_ifu_vector *x, const eris_ifu_vector *y, int fit_order)
Iterative polynomial fitting with outlier rejection.
cpl_vector * eris_ifu_dist_estimate_low_slitlet(const cpl_vector *est_centers)
Estimate position of missing low slitlet.
hdrl_image * eris_ifu_dist_warp_bpm(const hdrl_image *bpmIn, cpl_polynomial **poly_u, const cpl_table *borders, productDepthType productDepth)
Warp bad pixel mask using distortion polynomials.
hdrl_image * eris_ifu_dist_warp_slitlet(const hdrl_image *imgIn, const cpl_polynomial *poly_u, const cpl_polynomial *poly_v, double l_min, double r_max, int slitletNr)
Warp single slitlet.
cpl_table ** eris_ifu_dist_calc_centers(const hdrl_image *fibre_div, const hdrl_image *fibre_on, int productDepth)
Calculate slitlet centers across the detector.
hdrl_image * eris_ifu_dist_warp_image(const hdrl_image *imgIn, cpl_polynomial **poly_u, const cpl_table *borders)
Warp full detector image by warping each slitlet.
cpl_polynomial * eris_ifu_dist_poly_fit_2d_create(cpl_bivector *xy_pos, const cpl_vector *values, double *msee)
Create 2D polynomial fit from grid data.
cpl_error_code eris_ifu_dist_calc_distortion_fillgrid(cpl_bivector *grid, const eris_ifu_vector *data, cpl_vector *val_to_fit, double x_pos, int n_size, int arc_cnt)
Fill grid with distortion mapping data.
cpl_error_code eris_ifu_dist_save_distortion(cpl_polynomial **poly2d, const cpl_table *minmax_borders, const char *fn, cpl_frameset *frameset, const cpl_parameterlist *parlist, cpl_propertylist **qc)
Save distortion polynomials to FITS file.
cpl_table ** eris_ifu_dist_calc_slitpos(cpl_image **arcImg, cpl_table **centers_array, cpl_table *valid_arc_lines, int productDepth, cpl_boolean *cut_off_left, cpl_boolean *cut_off_right, const cpl_frameset *frameset, const cpl_parameterlist *parlist)
Calculate slitlet edge positions from arc lamp images.
cpl_polynomial ** eris_ifu_dist_calc_distortion(cpl_table **slit_edges, cpl_table **centers, int productDepth, cpl_boolean cut_off_left, cpl_boolean cut_off_right, cpl_table **minmax_borders, cpl_propertylist ***qc, cpl_propertylist *pl, cpl_frameset *frameset, const cpl_parameterlist *parlist)
Calculate distortion polynomials for all slitlets.
cpl_error_code eris_ifu_distortion_reduce_identical_lines(cpl_table *tbl)
Remove duplicate or overlapping arc lines.
eris_ifu_vector * eris_ifu_dist_calc_distortion_fitedge(const cpl_table *slit_edges, const char *col_name, const eris_ifu_vector *y_arc, int n_calib_arc, int n_size, int fit_order, int slitlet, cpl_table *dbg_tbl)
Fit polynomial to single edge as function of Y.
cpl_error_code eris_ifu_fit_gauss(const cpl_vector *x, const cpl_vector *y, double *x0, double *sigma, double *area, double *offset)
Fit Gaussian to find peak center and width.
int eris_ifu_distortion_get_narcs(int i, cpl_boolean triple_traces, cpl_boolean cut_off_left, cpl_boolean cut_off_right)
Determine number of arc traces to process for a slitlet.
cpl_error_code eris_ifu_distortion_reduce_lines(cpl_table *tbl, ifsBand band, int nr_cols)
Filter valid arc lines by intensity and fit quality.
cpl_table * eris_ifu_dist_wave(cpl_frameset *fs, cpl_table **centers_fitted, int productDepth, cpl_image ***arcImgs, int *arcImgCnt, const cpl_parameterlist *parlist, cpl_table **qclog)
Perform wavelength calibration to identify valid arc lines.
hdrl_imagelist * eris_ifu_stack_warped(const hdrl_image *imgIn, const int *rowIndices)
Stack warped image into cube format.
cpl_polynomial ** eris_ifu_dist_calc_distortion_full(cpl_table **slit_edges, cpl_table **centers, int productDepth, cpl_boolean cut_off_left, cpl_boolean cut_off_right)
Calculate distortion polynomials (alternative method)
cpl_vector * eris_ifu_dist_calc_centers_fit(const cpl_vector *profile, const cpl_vector *est_centers, cpl_boolean do_fix_cnt)
Fit Gaussian profiles to refine center positions.
cpl_vector * eris_ifu_dist_calc_centers_profile(const cpl_vector *profile, cpl_boolean lowerCutLevel)
Detect peak positions from a collapsed profile.
cpl_error_code eris_ifu_image_add_slit(hdrl_image *imgFull, const hdrl_image *imgSlit, int offset)
Paste slitlet image into full detector image.
cpl_error_code eris_ifu_dist_calc_centers_copy(const cpl_vector *fit_centers, int y_index, double y_value, cpl_table **cen_array)
Copy fitted centers to the output table array.