ERIS Pipeline Reference Manual 1.8.15
eris_ifu_distortion_static.h
1/* $Id$
2 *
3 * This file is part of the ERIS Pipeline
4 * Copyright (C) 2002,2003 European Southern Observatory
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#ifndef ERISP_ERIS_ERIS_IFU_DISTORTION_STATIC_H_
22#define ERISP_ERIS_ERIS_IFU_DISTORTION_STATIC_H_
23
24#ifdef HAVE_CONFIG_H
25#include <config.h>
26#endif
27
28#include <cpl.h>
29#include <hdrl.h>
30
31#include "eris_ifu_functions.h"
32#include "eris_ifu_vector.h"
33#include "eris_ifu_constants.h"
34
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"
43
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"
50
51#define ERIS_IFU_DIST_DBG_FN "eris_ifu_distortion_dbg_dist_row_est_cen_fit_cen.fits"
52
53struct arcstruct {
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;
59};
60
61cpl_vector* eris_ifu_dist_calc_centers_profile(const cpl_vector* profile,
62 cpl_boolean lowerCutLevel);
63
64cpl_error_code eris_ifu_dist_calc_centers_copy(const cpl_vector *fit_centers,
65 int y_index,
66 double y_value,
67 cpl_table **cen_array);
68
69cpl_table **eris_ifu_dist_calc_centers(const hdrl_image *fibre_div,
70 const hdrl_image *fibre_on,
71 int productDepth);
72
73cpl_vector* eris_ifu_dist_estimate_low_slitlet(const cpl_vector *est_centers);
74
75cpl_vector* eris_ifu_dist_calc_centers_fit(const cpl_vector *profile,
76 const cpl_vector *est_centers,
77 cpl_boolean do_fix_cnt);
78
79int eris_ifu_distortion_calc_y(int n, int i);
80
81int eris_ifu_distortion_target_left_edge(int i);
82
83int eris_ifu_distortion_target_right_edge(int i);
84
85int eris_ifu_distortion_get_narcs(int i, cpl_boolean triple_traces ,
86 cpl_boolean cut_off_left,
87 cpl_boolean cut_off_right);
88
89cpl_polynomial** eris_ifu_dist_calc_distortion(cpl_table **slit_edges,
90 cpl_table **centers,
91 int productDepth,
92 cpl_boolean cut_off_left,
93 cpl_boolean cut_off_right,
94 cpl_table **minmax_borders,
95 cpl_propertylist ***qc,
96 cpl_propertylist *pl,
97 cpl_frameset* frameset,
98 const cpl_parameterlist* parlist);
99
100cpl_polynomial** eris_ifu_dist_calc_distortion_full(cpl_table **slit_edges,
101 cpl_table **centers,
102 int productDepth,
103 cpl_boolean cut_off_left,
104 cpl_boolean cut_off_right);
105
106eris_ifu_vector *eris_ifu_dist_calc_distortion_fitedge(const cpl_table *slit_edges,
107 const char *col_name,
108 const eris_ifu_vector *y_arc,
109 int n_calib_arc,
110 int n_size,
111 int fit_order,
112 int slitlet,
113 cpl_table *dbg_tbl);
114
115cpl_error_code eris_ifu_dist_calc_distortion_fillgrid(cpl_bivector *grid,
116 const eris_ifu_vector *data,
117 cpl_vector *val_to_fit,
118 double x_pos,
119 int n_size,
120 int arc_cnt);
121
122cpl_polynomial* eris_ifu_dist_poly_fit_2d_create(cpl_bivector *xy_pos,
123 const cpl_vector *values,
124 double *msee);
125
126cpl_error_code eris_ifu_dist_save_distortion(cpl_polynomial **poly2d,
127 const cpl_table *minmax_borders,
128 const char *fn,
129 cpl_frameset *frameset,
130 const cpl_parameterlist *parlist,
131 cpl_propertylist **qc);
132
133hdrl_image *eris_ifu_dist_warp_image_full(const hdrl_image *hdrl_img_in,
134 cpl_polynomial **poly_u,
135 int productDepth);
136
137hdrl_image* eris_ifu_dist_warp_slitlet(const hdrl_image *imgIn,
138 const cpl_polynomial *poly_u,
139 const cpl_polynomial *poly_v,
140 double l_min,
141 double r_max,
142 int slitletNr);
143
144hdrl_image* eris_ifu_dist_warp_image(const hdrl_image *imgIn,
145 cpl_polynomial **poly_u,
146 const cpl_table *borders);
147
148hdrl_image* eris_ifu_dist_warp_bpm(const hdrl_image *bpmIn,
149 cpl_polynomial **poly_u,
150 const cpl_table *borders,
151 productDepthType productDepth);
152
153hdrl_imagelist* eris_ifu_stack_warped(const hdrl_image *imgIn,
154 const int *rowIndices);
155
156cpl_error_code eris_ifu_dist_warp_stats(const hdrl_image *hdrlWarpedImg,
157 cpl_propertylist *qc_list,
158 cpl_propertylist *pl,
159 cpl_frameset* frameset,
160 const cpl_parameterlist* parlist);
161
162cpl_error_code eris_ifu_image_add_slit(hdrl_image *imgFull,
163 const hdrl_image *imgSlit,
164 int offset);
165
166cpl_table **eris_ifu_dist_calc_slitpos(cpl_image **arcImg,
167 cpl_table **centers_array,
168 cpl_table *valid_arc_lines,
169 int productDepth,
170 cpl_boolean *cut_off_left,
171 cpl_boolean *cut_off_right,
172 const cpl_frameset* frameset,
173 const cpl_parameterlist* parlist);
174
175cpl_error_code eris_ifu_fit_gauss(const cpl_vector *x,
176 const cpl_vector *y,
177 double *x0,
178 double *sigma,
179 double *area,
180 double *offset);
181
182cpl_vector* eris_ifu_polyfit_edge(const eris_ifu_vector *x,
183 const eris_ifu_vector *y,
184 int fit_order);
185
186cpl_error_code eris_ifu_distortion_reduce_lines(cpl_table *tbl,
187 ifsBand band,
188 int nr_cols);
189
190cpl_error_code eris_ifu_distortion_reduce_identical_lines(cpl_table *tbl);
191
192cpl_table *eris_ifu_dist_wave(cpl_frameset *fs,
193 cpl_table **centers_fitted,
194 int productDepth,
195 cpl_image ***arcImgs,
196 int *arcImgCnt,
197 const cpl_parameterlist* parlist,
198 cpl_table** qclog);
199
200cpl_error_code eris_ifu_wavecal_processSof_dist(cpl_frameset* frames,
201 int exposureCorrectionMode,
202 int *arcImgCnt,
203 hdrl_imagelist **arcImages,
204 int **lampStates,
205 ifsBand *band,
206 ifsPreopticsScale *scale,
207 ifsInstrument *instrument,
208 double saturation_threshold,
209 cpl_table** qclog);
210
211#endif /* ERISP_ERIS_ERIS_IFU_DISTORTION_STATIC_H_ */
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.