73 cpl_frame *order_tab_frame, cpl_frame *slitmap_frame,
74 cpl_frameset *rec_frameset,
75 double slicedist_lambda,
78 cpl_frame * result = NULL ;
79 cpl_frame *loc_frame = NULL;
80 cpl_frame *rec_frame = NULL;
84 double slit_down, slit_cen, slit_up;
85 double sdown, sldown, slup, sup;
86 double dist_up, dist_down;
95 xsh_msg(
"Get Localization table for slitlet %s",
97 check( loc_frame = cpl_frameset_get_frame( loc_frame_set, 0));
98 xsh_msg(
" '%s'", cpl_frame_get_filename( loc_frame ) ) ;
101 xsh_msg(
"Get Localization table for slitlet %s",
103 check( loc_frame = cpl_frameset_get_frame( loc_frame_set, 1));
104 xsh_msg(
" '%s'", cpl_frame_get_filename( loc_frame ) ) ;
107 xsh_msg(
"Get Localization table for slitlet %s",
109 check( loc_frame = cpl_frameset_get_frame( loc_frame_set, 2));
110 xsh_msg(
" '%s'", cpl_frame_get_filename( loc_frame ));
113 check( rec_frame = cpl_frameset_get_frame( rec_frameset, 0));
118 if ( slicedist_lambda < 0){
122 lambda = slicedist_lambda;
124 xsh_msg(
" Evaluate at lambda %f", lambda);
125 check( slit_down = cpl_polynomial_eval_1d(loc_down->
cenpoly,
127 check( slit_cen = cpl_polynomial_eval_1d(loc_cen->cenpoly,
129 check( slit_up = cpl_polynomial_eval_1d(loc_up->cenpoly,
132 xsh_msg(
"SLIT center from localization [%f,%f,%f]", slit_down, slit_cen,
136 slitmap_frame, &sdown, &sldown, &slup, &sup,
instrument));
138 xsh_msg(
"EDGES form order tab [%f,[%f %f],%f]",sdown, sldown,
141 dist_up = 2*slup-slit_cen-slit_up;
142 dist_down = 2*sldown-slit_cen-slit_down;
143 xsh_msg(
"DISTANCES edgU-->Up = %f edgU-->cen %f ==> %f", slup-slit_up,
144 slup-slit_cen, dist_up);
145 xsh_msg(
"DISTANCES edgD-->Down = %f edgD-->cen %f ==> %f", sldown-slit_down,
146 sldown-slit_cen, dist_down);
151 sprintf( fname,
"SLICE_OFFSET_%s.fits",
162 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
183 cpl_frame *shiftifu_frame,
double lambdaref_hsize,
const char* resname)
185 cpl_frame *result = NULL;
186 const char *objpos_name = NULL;
187 cpl_table *objpos_tab = NULL;
188 double *wave_pos_data = NULL;
189 double *slit_pos_data = NULL;
192 cpl_table *res_tab = NULL;
195 cpl_propertylist *header = NULL;
197 const char *shiftifu_name = NULL;
198 cpl_table *shiftifu_tab = NULL;
200 double *slit_shiftifu_data = NULL;
202 cpl_vector *median_slitref_vect = NULL;
205 int median_slitref_size = 0;
211 check( objpos_name = cpl_frame_get_filename( objpos_frame));
214 check( wave_pos_data = cpl_table_get_data_double( objpos_tab,
216 check( slit_pos_data = cpl_table_get_data_double( objpos_tab,
219 pos_size = cpl_table_get_nrow( objpos_tab);
223 while( lambda <= (lambda_ref-lambdaref_hsize) && istart< pos_size){
224 lambda = wave_pos_data[istart];
229 while( lambda <= (lambda_ref+lambdaref_hsize) && iend< pos_size){
230 lambda = wave_pos_data[iend];
233 median_slitref_size = iend-istart+1;
235 median_slitref_vect = cpl_vector_new( median_slitref_size);
237 for(i=istart; i<=iend; i++){
238 double resslit = slit_pos_data[i];
240 cpl_vector_set( median_slitref_vect, i-istart, resslit);
246 wave_pos_data, slit_pos_data);
249 lambda_ref, slitref);
251 slitref = cpl_vector_get_median( median_slitref_vect);
254 lambda_ref, slitref);
256 check( res_tab = cpl_table_new( pos_size));
263 if ( shiftifu_frame != NULL){
264 check( shiftifu_name = cpl_frame_get_filename( shiftifu_frame));
270 check( slit_shiftifu_data = cpl_table_get_data_double( shiftifu_tab,
272 shiftifu_size = cpl_table_get_nrow( shiftifu_tab);
274 for( i=0; i< pos_size; i++){
275 double reswave, resslit;
277 reswave = wave_pos_data[i];
278 resslit = slit_pos_data[i]-slitref+slit_shiftifu_data[i];
287 for( i=0; i< pos_size; i++){
288 double reswave, resslit;
290 reswave = wave_pos_data[i];
291 resslit = slit_pos_data[i]-slitref;
299 sprintf( tablename, resname);
300 header = cpl_propertylist_new();
306 check( cpl_table_save( res_tab, header, NULL, tablename, CPL_IO_DEFAULT));
311 CPL_FRAME_TYPE_TABLE,
312 CPL_FRAME_GROUP_PRODUCT,
313 CPL_FRAME_LEVEL_TEMPORARY));
346 cpl_frameset *objpos_frameset,
350 cpl_frameset *result_frameset = NULL;
356 check( result_frameset = cpl_frameset_new());
359 cpl_frame *comp_shift_frame = NULL;
360 cpl_frame *objpos_frame = NULL;
361 cpl_frame *shift_frame = NULL;
364 sprintf( fname ,
"%s_SHIFTIFU_%s_%s.fits", prefix,
SlitletName[slitlet],
367 xsh_msg(
"Compute IFU shift for slitlet %s, frame '%s'",
370 check( objpos_frame = cpl_frameset_get_frame( objpos_frameset, i));
372 if ( shiftifu_frameset != NULL){
373 check( shift_frame = cpl_frameset_get_frame( shiftifu_frameset, i));
376 objpos_frame, shift_frame, lambdaref_hsize, fname));
378 sprintf( tag,
"OFFSET_TAB_%s_IFU_%s",
SlitletName[slitlet],
380 check( cpl_frame_set_tag( comp_shift_frame, tag));
381 check( cpl_frameset_insert( result_frameset, comp_shift_frame));
385 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
388 return result_frameset;
static xsh_instrument * instrument
cpl_frameset * xsh_compute_shift_ifu(double lambda_ref, double lambdaref_hsize, cpl_frameset *objpos_frameset, cpl_frameset *shiftifu_frameset, xsh_instrument *instrument, const char *prefix)
Compute the shift in slit between reference wavelength and others for all the slitlets.
cpl_frame * xsh_compute_shift_ifu_slitlet(double lambda_ref, cpl_frame *objpos_frame, cpl_frame *shiftifu_frame, double lambdaref_hsize, const char *resname)
Compute the shift in slit between reference wavelength and others.
cpl_frame * xsh_compute_slice_dist(cpl_frameset *loc_frame_set, cpl_frame *order_tab_frame, cpl_frame *slitmap_frame, cpl_frameset *rec_frameset, double slicedist_lambda, xsh_instrument *instrument)
xsh_localization * xsh_localization_load(cpl_frame *frame)
Load a localization list from a frame.
void xsh_localization_free(xsh_localization **list)
free memory associated to a localization_list
xsh_rec_list * xsh_rec_list_load(cpl_frame *frame, xsh_instrument *instrument)
load an rec list from a frame
double xsh_rec_list_get_lambda_max(xsh_rec_list *list)
void xsh_rec_list_free(xsh_rec_list **list)
free memory associated to a rec_list
xsh_slice_offset * xsh_slice_offset_create(void)
Create an empty slice_offset.
cpl_frame * xsh_slice_offset_save(xsh_slice_offset *list, const char *filename, xsh_instrument *instrument)
Save an slice_offset list to a frame.
void xsh_slice_offset_free(xsh_slice_offset **list)
Free memory associated to a slice_offset.
#define XSH_ASSURE_NOT_ILLEGAL(cond)
#define XSH_ASSURE_NOT_NULL(pointer)
const char * xsh_instrument_arm_tostring(xsh_instrument *i)
Get the string associated with an arm.
#define xsh_msg(...)
Print a message on info level.
#define xsh_msg_dbg_low(...)
void xsh_pfits_set_shiftifu_lambdaref(cpl_propertylist *plist, double value)
void xsh_pfits_set_shiftifu_slitref(cpl_propertylist *plist, double value)
void xsh_get_slit_edges(cpl_frame *slitmap_frame, double *sdown, double *sup, double *sldown, double *slup, xsh_instrument *instrument)
Trace slit edges in a master flat.
void xsh_free_vector(cpl_vector **v)
Deallocate a vector and set the pointer to NULL.
void xsh_free_frame(cpl_frame **f)
Deallocate a frame and set the pointer to NULL.
void xsh_free_frameset(cpl_frameset **f)
Deallocate a frame set and set the pointer to NULL.
double xsh_data_interpolate(double wav, int nrow, double *pw, double *pe)
Interpolate data points.
void xsh_free_propertylist(cpl_propertylist **p)
Deallocate a property list and set the pointer to NULL.
void xsh_add_temporary_file(const char *name)
Add temporary file to temprary files list.
cpl_frame * xsh_frame_product(const char *fname, const char *tag, cpl_frame_type type, cpl_frame_group group, cpl_frame_level level)
Creates a frame with given characteristics.
#define XSH_SHIFTIFU_UNIT_SHIFTSLIT
#define XSH_SHIFTIFU_COLNAME_WAVELENGTH
#define XSH_OBJPOS_COLNAME_SLIT
#define XSH_SHIFTIFU_COLNAME_SHIFTSLIT
#define XSH_SHIFTIFU_UNIT_WAVELENGTH
#define XSH_OBJPOS_COLNAME_WAVELENGTH
static const char * SlitletName[]
#define XSH_TABLE_NEW_COL(TABLE, NAME, UNIT, TYPE)
#define XSH_TABLE_LOAD(TABLE, NAME)
#define XSH_TABLE_FREE(TABLE)