40 #include <uves_physmod_msrawxy.h>
42 #include <uves_physmod_center_gauss.h>
43 #include <uves_pfits.h>
44 #include <uves_utils_polynomial.h>
45 #include <uves_utils_wrappers.h>
47 #include <uves_error.h>
88 const char *recipe_id,
89 const cpl_parameterlist* parameters,
94 cpl_table** rline_tbl,
95 cpl_table** mline_tbl,
96 cpl_table** npline_tbl)
101 double X_AXIS_SCALE=0;
102 double Y_AXIS_SCALE=0;
110 double limit[4]={0.,0.,0.,0.};
123 double mean_err_xdif=0;
124 double mean_err_ydif=0;
131 double outputd[3][3];
134 cpl_table * tmp_tbl=NULL;
135 cpl_table * tmp_tbl1=NULL;
136 cpl_table * tmp_tbl2=NULL;
137 cpl_table * tmp_tbl3=NULL;
138 cpl_table * tmp_tbl4=NULL;
143 "Could not read x binning factor from input header");
146 "Could not read x binning factor from input header");
148 check( uves_get_parameter(parameters, NULL, recipe_id,
149 "mbox_x", CPL_TYPE_INT, &MBOX_X ) ,
150 "Could not read parameter");
152 check( uves_get_parameter(parameters, NULL, recipe_id,
153 "mbox_y", CPL_TYPE_INT, &MBOX_Y ) ,
154 "Could not read parameter");
181 check(cpl_table_and_selected_double(mod_tbl,
"IDENT",CPL_GREATER_THAN,0),
182 "Error selecting IDENT");
183 *l_tbl=cpl_table_extract_selected(mod_tbl);
185 uves_msg_debug(
"xs=%f ofx=%f bx=%f",(1.+X_AXIS_SCALE),OFFSET_X,mbox_x/2);
186 uves_msg_debug(
"ys=%f ofy=%f by=%f",(1.+Y_AXIS_SCALE),OFFSET_Y,mbox_y/2);
188 scl_fct=(1.+X_AXIS_SCALE);
189 cpl_table_erase_column(*l_tbl,
"XSTART");
190 cpl_table_duplicate_column(*l_tbl,
"XSTART",*l_tbl,
"XMOD");
191 cpl_table_multiply_scalar(*l_tbl,
"XSTART",scl_fct);
192 add_fct=OFFSET_X-(double)mbox_x/2;
195 cpl_table_add_scalar(*l_tbl,
"XSTART",add_fct);
197 cpl_table_erase_column(*l_tbl,
"XEND");
198 cpl_table_duplicate_column(*l_tbl,
"XEND",*l_tbl,
"XMOD");
199 cpl_table_multiply_scalar(*l_tbl,
"XEND",scl_fct);
200 add_fct=OFFSET_X+(double)mbox_x/2;
202 cpl_table_add_scalar(*l_tbl,
"XEND",add_fct);
204 scl_fct=(1.+Y_AXIS_SCALE);
205 cpl_table_erase_column(*l_tbl,
"YSTART");
206 cpl_table_duplicate_column(*l_tbl,
"YSTART",*l_tbl,
"YMOD");
207 cpl_table_multiply_scalar(*l_tbl,
"YSTART",scl_fct);
208 add_fct=OFFSET_Y-(double)mbox_y/2;
210 cpl_table_add_scalar(*l_tbl,
"YSTART",add_fct);
212 cpl_table_erase_column(*l_tbl,
"YEND");
213 cpl_table_duplicate_column(*l_tbl,
"YEND",*l_tbl,
"YMOD");
214 cpl_table_multiply_scalar(*l_tbl,
"YEND",scl_fct);
215 add_fct=OFFSET_Y+(double)mbox_y/2;
217 cpl_table_add_scalar(*l_tbl,
"YEND",add_fct);
222 check(tmp_tbl1=uves_extract_table_rows(*l_tbl,
"XSTART",CPL_GREATER_THAN,
223 limit[2]),
"Error selecting XSTART");
225 check_nomsg(limit[0] = cpl_image_get_size_x(raw_image)-mbox_x/2);
227 check(tmp_tbl2=uves_extract_table_rows(tmp_tbl1,
"XSTART",CPL_LESS_THAN,
228 limit[0]),
"Error selecting XSTART");
232 check(tmp_tbl3=uves_extract_table_rows(tmp_tbl2,
"YSTART",CPL_GREATER_THAN,
233 limit[3]),
"Error selecting YSTART");
235 check_nomsg(limit[1] = cpl_image_get_size_y(raw_image)-mbox_y/2);
237 check(tmp_tbl4=uves_extract_table_rows(tmp_tbl3,
"YSTART",CPL_LESS_THAN,
238 limit[1]),
"Error selecting YSTART");
241 limit[0],limit[1],limit[2],limit[3]);
242 check_nomsg(*m_tbl = cpl_table_extract_selected(tmp_tbl4));
243 check_nomsg(*rline_tbl = cpl_table_extract_selected(tmp_tbl4));
246 check_nomsg(tmp_tbl=cpl_table_extract_selected(*l_tbl));
247 uves_free_table(l_tbl);
248 *l_tbl=cpl_table_duplicate(tmp_tbl);
249 uves_free_table(&tmp_tbl);
252 assure( !cpl_table_has_invalid(*m_tbl,
"XMOD") &&
253 !cpl_table_has_invalid(*m_tbl,
"YMOD"),
254 CPL_ERROR_ILLEGAL_INPUT,
255 "Invalid content in table m_tbl");
258 cpl_image_get_min(raw_image),
259 cpl_image_get_max(raw_image),
260 cpl_image_get_stdev(raw_image));
269 (cpl_table_duplicate_column(*rline_tbl,
"XMES",*m_tbl,
"XCEN"),
270 cpl_table_duplicate_column(*rline_tbl,
"YMES",*m_tbl,
"YCEN"),
271 cpl_table_duplicate_column(*rline_tbl,
"STATUS",*m_tbl,
"STATUS")));
274 *mline_tbl=cpl_table_duplicate(*rline_tbl);
277 cpl_table_and_selected_int(*rline_tbl,
"STATUS",CPL_EQUAL_TO,0.));
280 check_nomsg( *p_tbl=cpl_table_extract_selected(*rline_tbl) );
282 uves_free_table(rline_tbl);
283 *rline_tbl=cpl_table_duplicate(*p_tbl);
285 uves_msg_debug(
"middump nraw=%" CPL_SIZE_FORMAT
"",cpl_table_get_nrow(*p_tbl));
287 cpl_table_select_all(*rline_tbl);
288 uves_free_table(rline_tbl);
289 *rline_tbl=cpl_table_duplicate(*p_tbl);
290 uves_msg_debug(
"rline nraw=%" CPL_SIZE_FORMAT
"",cpl_table_get_nrow(*rline_tbl));
293 check_nomsg( (cpl_table_duplicate_column(*rline_tbl,
"XDIF",*rline_tbl,
"XMES"),
294 cpl_table_subtract_columns(*rline_tbl,
"XDIF",
"XMOD")) );
295 uves_msg_debug(
"rline1 nraw=%" CPL_SIZE_FORMAT
"",cpl_table_get_nrow(*rline_tbl));
298 cpl_table_duplicate_column(*rline_tbl,
"YDIF",*rline_tbl,
"YMES");
299 cpl_table_subtract_columns(*rline_tbl,
"YDIF",
"YMOD");
301 uves_msg_debug(
"rline2 nraw=%" CPL_SIZE_FORMAT
"",cpl_table_get_nrow(*rline_tbl));
305 NULL,2,2,
"XDIFREG",NULL,NULL,
306 &mean_err_xdif,NULL,NULL,-1,-1),
307 "2D poly regression to fit XDIF failed. Try to increase mbox_x value, "
308 "and possibly the mbox_y value");
321 NULL,2,2,
"YDIFREG",NULL,NULL,
322 &mean_err_ydif,NULL,NULL,-1,-1),
323 "2D poly regression to fit YDIF failed. Try to increase mbox_y value");
337 uves_msg_debug(
"rline3 nraw=%" CPL_SIZE_FORMAT
"",cpl_table_get_nrow(*rline_tbl));
338 cpl_table_duplicate_column(*rline_tbl,
"XMODREG",*rline_tbl,
"XMOD");
339 cpl_table_add_columns(*rline_tbl,
"XMODREG",
"XDIFREG");
341 cpl_table_duplicate_column(*rline_tbl,
"YMODREG",*rline_tbl,
"YMOD");
342 cpl_table_add_columns(*rline_tbl,
"YMODREG",
"YDIFREG");
344 uves_msg_debug(
"rline4 nraw=%" CPL_SIZE_FORMAT
"",cpl_table_get_nrow(*rline_tbl));
351 *npline_tbl=cpl_table_extract_selected(mod_tbl);
354 cpl_table_select_all(mod_tbl);
358 uves_msg_debug(
"npline nraw=%" CPL_SIZE_FORMAT
"",cpl_table_get_nrow(*npline_tbl));
362 tmp_tbl=cpl_table_new(cpl_table_get_nrow(*rline_tbl));
363 cpl_table_duplicate_column(tmp_tbl,
"XDIF",*rline_tbl,
"XDIF");
364 cpl_table_duplicate_column(tmp_tbl,
"YDIF",*rline_tbl,
"YDIF");
366 cpl_table_set_size(tmp_tbl,cpl_table_get_nrow(*npline_tbl));
368 cpl_table_duplicate_column(*npline_tbl,
"XDIF",tmp_tbl,
"XDIF");
369 cpl_table_duplicate_column(*npline_tbl,
"YDIF",tmp_tbl,
"YDIF");
370 uves_free_table(&tmp_tbl);
372 cpl_table_new_column(*npline_tbl,
"XDIFREG",CPL_TYPE_DOUBLE);
373 cpl_table_new_column(*npline_tbl,
"YDIFREG",CPL_TYPE_DOUBLE);
375 for (k=0;k<cpl_table_get_nrow(*npline_tbl);k++) {
377 tmp_x=cpl_table_get_double(*npline_tbl,
"XMOD",k,&status);
378 tmp_y=cpl_table_get_double(*npline_tbl,
"YMOD",k,&status);
383 cpl_table_set_double(*npline_tbl,
"XDIFREG",k,tmp_val_x);
384 cpl_table_set_double(*npline_tbl,
"YDIFREG",k,tmp_val_y);
388 cpl_table_add_columns(*npline_tbl,
"XMOD",
"XDIFREG");
389 cpl_table_add_columns(*npline_tbl,
"YMOD",
"YDIFREG");
395 uves_free_table(&tmp_tbl);
396 uves_free_table(&tmp_tbl1);
397 uves_free_table(&tmp_tbl2);
398 uves_free_table(&tmp_tbl3);
399 uves_free_table(&tmp_tbl4);