96 if ( cpl_error_get_code() != CPL_ERROR_NONE) {
118 const char* tablename = NULL;
119 cpl_table* table = NULL;
130 check( tablename = cpl_frame_get_filename(frame));
133 check( rows = cpl_table_get_nrow( table));
138 CPL_TYPE_INT, 0, °x));
141 CPL_TYPE_INT, 0, °y));
145 for(i=0; i< rows/2; i++){
146 cpl_polynomial *lambda_poly = NULL;
147 cpl_polynomial *slit_poly = NULL;
149 int k,l, absorder = 0;
153 CPL_TYPE_INT, j, &absorder));
154 check( lambda_poly = cpl_polynomial_new( 2));
155 check( slit_poly = cpl_polynomial_new( 2));
156 for( k=0; k<= degx; k++){
157 for( l=0; l<= degy; l++){
158 double coef_lambda = 0.0, coef_slit = 0.0;
159 sprintf(coefname,
"C%d%d",k,l);
166 check( cpl_polynomial_set_coeff( lambda_poly, pows, coef_lambda));
167 check( cpl_polynomial_set_coeff( slit_poly, pows, coef_slit));
175 if ( cpl_error_get_code() != CPL_ERROR_NONE) {
199 int absorder, cpl_polynomial *lambda_poly,
200 cpl_polynomial *slit_poly)
231 for( i = 0; i < (*list)->size; i++){
236 cpl_free( (*list)->list);
263 cpl_frame *order_frame,
269 cpl_frame *result = NULL;
270 cpl_image *image = NULL;
273 cpl_vector* pos = NULL;
277 cpl_propertylist *wavemap_header = NULL;
289 pos = cpl_vector_new(2);
292 check( image = cpl_image_new(
nx,
ny, CPL_TYPE_DOUBLE));
293 check(
data = cpl_image_get_data_double( image));
294 check( wavemap_header = cpl_propertylist_new());
297 for( i=0; i < list->
size; i++) {
299 double lambda_min, lambda_max;
300 double lambda_starty_lo, lambda_starty_up, lambda_endy_lo, lambda_endy_up;
301 double dxmin, dxmax ;
323 xmax = floor( dxmax);
324 for (
x=xmin ;
x<=xmax &&
x<
nx;
x++){
327 cpl_vector_set(pos, 0, (
double)
x);
328 cpl_vector_set(pos, 1, (
double)
y);
348 xmax = floor( dxmax);
350 cpl_vector_set(pos, 0, (
double)xmin);
351 cpl_vector_set(pos, 1, (
double)
starty);
355 cpl_vector_set(pos, 0, (
double)xmax);
366 xmax = floor( dxmax);
368 cpl_vector_set(pos, 0, (
double)xmin);
369 cpl_vector_set(pos, 1, (
double)
endy);
373 cpl_vector_set(pos, 0, (
double)xmax);
377 if ( lambda_starty_lo < lambda_endy_lo
378 && lambda_starty_up < lambda_endy_up){
379 if ( lambda_starty_lo > lambda_starty_up){
380 lambda_min = lambda_starty_lo;
383 lambda_min = lambda_starty_up;
385 if ( lambda_endy_lo > lambda_endy_up){
386 lambda_max = lambda_endy_up;
389 lambda_max = lambda_endy_lo;
392 else if ( lambda_starty_lo > lambda_endy_lo
393 && lambda_starty_up > lambda_endy_up){
394 if ( lambda_starty_lo > lambda_starty_up){
395 lambda_max = lambda_starty_up;
398 lambda_max = lambda_starty_lo;
400 if ( lambda_endy_lo > lambda_endy_up){
401 lambda_min = lambda_endy_lo;
404 lambda_min = lambda_endy_up;
409 "wavelength variation differs between upper(%f %f) and lower edges( %f %f)",
410 lambda_starty_up, lambda_endy_up, lambda_endy_up, lambda_endy_lo);
417 wavemap_header, absorder, lambda_min));
419 wavemap_header, absorder, lambda_max));
422 sprintf(filename,
"%s.fits",tag);
425 check( cpl_image_save( image, filename, CPL_BPP_IEEE_FLOAT,
426 wavemap_header, CPL_IO_DEFAULT));
429 CPL_FRAME_TYPE_IMAGE, CPL_FRAME_GROUP_PRODUCT,
430 CPL_FRAME_LEVEL_TEMPORARY));
433 if (cpl_error_get_code() != CPL_ERROR_NONE){
464 cpl_frame *order_frame,
469 cpl_frame *result = NULL;
470 cpl_image *image = NULL;
471 cpl_image *ifu_map = NULL;
474 cpl_vector* pos = NULL;
486 cpl_vector *med_low_vect = NULL, *med_up_vect = NULL, *med_cen_vect = NULL;
487 cpl_vector *med_sliclo_vect = NULL, *med_slicup_vect = NULL;
489 double slit_up, slit_low, slit_cen;
490 cpl_propertylist *slitmap_header = NULL;
507 pos = cpl_vector_new(2);
509 check( image = cpl_image_new(
nx,
ny, CPL_TYPE_DOUBLE));
510 check(
data = cpl_image_get_data_double( image));
511 check( ifu_map = cpl_image_new(
nx,
ny, CPL_TYPE_INT));
512 check( imap = cpl_image_get_data_int( ifu_map));
513 check( slitmap_header = cpl_propertylist_new());
515 nb_orders = list->
size;
517 med_low_vect = cpl_vector_new( nb_orders);
518 med_cen_vect = cpl_vector_new( nb_orders);
519 med_up_vect = cpl_vector_new( nb_orders);
521 med_sliclo_vect = cpl_vector_new( nb_orders);
522 med_slicup_vect = cpl_vector_new( nb_orders);
526 for( i=0; i < nb_orders; i++) {
529 cpl_vector *low_vect = NULL, *up_vect = NULL, *cen_vect = NULL;
530 cpl_vector *sliclo_vect = NULL, *slicup_vect = NULL;
539 vect_size = ymax-
starty+1;
549 low_vect = cpl_vector_new( vect_size);
550 cen_vect = cpl_vector_new( vect_size);
551 up_vect = cpl_vector_new( vect_size);
554 sliclo_vect = cpl_vector_new( vect_size);
555 slicup_vect = cpl_vector_new( vect_size);
560 double dxmin, dxmax, xcen;
577 xmax = floor( dxmax);
580 cpl_vector_set(pos, 1, ypos);
582 for (
x=xmin ;
x<=xmax &&
x<
nx;
x++){
586 cpl_vector_set(pos, 0, xpos);
587 cpl_vector_set(pos, 1, ypos);
593 imap[
x-1+(
y-1)*
nx] = 1;
596 cpl_vector_set(pos, 0, xmin);
597 cpl_vector_set(pos, 1, ypos);
599 cpl_vector_set( low_vect,
y-
starty, slit);
601 cpl_vector_set(pos, 0, xmax);
602 cpl_vector_set(pos, 1, ypos);
604 cpl_vector_set( up_vect,
y-
starty, slit);
606 cpl_vector_set(pos, 0, xcen);
607 cpl_vector_set(pos, 1, ypos);
609 cpl_vector_set( cen_vect,
y-
starty, slit);
618 cpl_vector_set(pos, 0, xmin);
619 cpl_vector_set(pos, 1, ypos);
621 cpl_vector_set( sliclo_vect,
y-
starty, slit);
623 cpl_vector_set(pos, 0, xmax);
624 cpl_vector_set(pos, 1, ypos);
626 cpl_vector_set( slicup_vect,
y-
starty, slit);
631 check( slit_up = cpl_vector_get_median( up_vect));
632 check( slit_low = cpl_vector_get_median( low_vect));
633 check( slit_cen = cpl_vector_get_median( cen_vect));
638 check( cpl_vector_set( med_cen_vect, i, slit_cen));
640 if ( slit_up > slit_low){
643 check( cpl_vector_set( med_low_vect, i, slit_low));
644 check( cpl_vector_set( med_up_vect, i, slit_up));
649 check( cpl_vector_set( med_low_vect, i, slit_up));
650 check( cpl_vector_set( med_up_vect, i, slit_low));
654 check( slit_up = cpl_vector_get_median( slicup_vect));
655 check( slit_low = cpl_vector_get_median( sliclo_vect));
656 if ( slit_up > slit_low){
659 check( cpl_vector_set( med_sliclo_vect, i, slit_low));
660 check( cpl_vector_set( med_slicup_vect, i, slit_up));
665 check( cpl_vector_set( med_sliclo_vect, i, slit_up));
666 check( cpl_vector_set( med_slicup_vect, i, slit_low));
676 check( slit_cen = cpl_vector_get_median( med_cen_vect));
677 check( slit_up = cpl_vector_get_median( med_up_vect));
678 check( slit_low = cpl_vector_get_median( med_low_vect));
685 check( slit_up = cpl_vector_get_median( med_slicup_vect));
686 check( slit_low = cpl_vector_get_median( med_sliclo_vect));
691 sprintf(filename,
"%s.fits",tag);
696 check( cpl_image_save( image, filename, CPL_BPP_IEEE_FLOAT,
697 slitmap_header, CPL_IO_DEFAULT));
700 check( cpl_image_save( ifu_map, filename, CPL_BPP_32_SIGNED,
701 NULL, CPL_IO_EXTEND));
704 CPL_FRAME_TYPE_IMAGE, CPL_FRAME_GROUP_PRODUCT,
705 CPL_FRAME_LEVEL_TEMPORARY));
708 if (cpl_error_get_code() != CPL_ERROR_NONE){
743 cpl_polynomial *poly,
747 double y_bin, y_no_bin;
748 double x_bin, x_no_bin;
754 check( x_bin = cpl_vector_get(pos, 0));
755 check( y_bin = cpl_vector_get(pos, 1));
760 check( cpl_vector_set(pos, 0, x_no_bin));
761 check( cpl_vector_set(pos, 1, y_no_bin));
763 check( result = cpl_polynomial_eval( poly, pos));
782 cpl_frame *result = NULL;
783 cpl_table *table = NULL;
793 nbcoefs = (list->
degx+1)*(list->
degy+1);
796 check(cpl_table_set_size(table, list->
size*2));
811 for(i=0; i<= list->
degx; i++){
812 for(j = 0; j<= list->
degy; j++){
813 sprintf(coefname,
"C%d%d",i,j);
814 check( cpl_table_new_column( table, coefname, CPL_TYPE_DOUBLE));
818 for(i=0; i< list->
size; i++){
836 for( j=0; j<= list->
degx; j++){
837 for( k=0; k<= list->
degy; k++){
838 double coef_lambda = 0.0, coef_slit = 0.0;
839 sprintf(coefname,
"C%d%d",j,k);
844 check(cpl_table_set_double( table, coefname, i2, coef_lambda));
847 check(cpl_table_set_double( table, coefname, i2+1, coef_slit));
852 sprintf(filename,
"%s.fits",tag);
855 filename, CPL_IO_DEFAULT));
858 CPL_FRAME_TYPE_TABLE,
859 CPL_FRAME_GROUP_PRODUCT,
860 CPL_FRAME_LEVEL_TEMPORARY));
864 if ( cpl_error_get_code() != CPL_ERROR_NONE) {
static xsh_instrument * instrument
cpl_frame * xsh_dispersol_list_save(xsh_dispersol_list *list, const char *tag)
Save a dispersion list on the disk.
void xsh_dispersol_list_add(xsh_dispersol_list *list, int idx, int absorder, cpl_polynomial *lambda_poly, cpl_polynomial *slit_poly)
Add a dispersion solution in the list.
xsh_dispersol_list * xsh_dispersol_list_load(cpl_frame *frame, xsh_instrument *instrument)
Load a dispersion list from a frame.
void xsh_dispersol_list_free(xsh_dispersol_list **list)
Free the dispersion list.
cpl_frame * xsh_dispersol_list_to_slitmap(xsh_dispersol_list *list, cpl_frame *order_frame, xsh_pre *pre, xsh_instrument *instr, const char *tag)
Save a SLIT MAP image.
double xsh_dispersol_list_eval(xsh_dispersol_list *list, cpl_polynomial *poly, cpl_vector *pos)
Evaluate the polynomial according the binning.
xsh_dispersol_list * xsh_dispersol_list_new(int size, int degx, int degy, xsh_instrument *instrument)
Create a new dispersion solution list.
cpl_frame * xsh_dispersol_list_to_wavemap(xsh_dispersol_list *list, cpl_frame *order_frame, xsh_pre *pre, xsh_instrument *instr, const char *tag)
Save a WAVE MAP image.
xsh_order_list * xsh_order_list_load(cpl_frame *frame, xsh_instrument *instr)
load an order list from a frame
int xsh_order_list_get_starty(xsh_order_list *list, int i)
get position on Y axis of first pixel detected on order
int xsh_order_list_get_endy(xsh_order_list *list, int i)
get position on Y axis of last pixel detected on order
void xsh_order_list_free(xsh_order_list **list)
free memory associated to an order_list
double xsh_order_list_eval(xsh_order_list *list, cpl_polynomial *poly, double y)
Evaluate an order list poly.
#define XSH_ASSURE_NOT_ILLEGAL(cond)
#define XSH_ASSURE_NOT_NULL(pointer)
int xsh_instrument_get_binx(xsh_instrument *instrument)
XSH_MODE xsh_instrument_get_mode(xsh_instrument *i)
Get a mode on instrument structure.
int xsh_instrument_get_biny(xsh_instrument *instrument)
#define xsh_msg_warning(...)
Print an warning message.
void xsh_pfits_set_pcatg(cpl_propertylist *plist, const char *value)
Write the PCATG value.
void xsh_pfits_set_slitmap_median_cen(cpl_propertylist *plist, double value)
void xsh_pfits_set_slitmap_median_slicup(cpl_propertylist *plist, double value)
void xsh_pfits_set_slitmap_order_cen(cpl_propertylist *plist, int absorder, double value)
cpl_error_code xsh_pfits_set_wcs(cpl_propertylist *header, const double crpix1, const double crval1, const double cdelt1, const double crpix2, const double crval2, const double cdelt2)
void xsh_pfits_set_slitmap_median_edglo(cpl_propertylist *plist, double value)
void xsh_pfits_set_slitmap_order_edgup(cpl_propertylist *plist, int absorder, double value)
void xsh_pfits_set_slitmap_median_edgup(cpl_propertylist *plist, double value)
void xsh_pfits_set_wavemap_order_lambda_max(cpl_propertylist *plist, int absorder, double value)
void xsh_pfits_set_slitmap_order_slicup(cpl_propertylist *plist, int absorder, double value)
void xsh_pfits_set_slitmap_median_sliclo(cpl_propertylist *plist, double value)
void xsh_pfits_set_slitmap_order_edglo(cpl_propertylist *plist, int absorder, double value)
void xsh_pfits_set_slitmap_order_sliclo(cpl_propertylist *plist, int absorder, double value)
void xsh_pfits_set_wavemap_order_lambda_min(cpl_propertylist *plist, int absorder, double value)
void xsh_free_polynomial(cpl_polynomial **p)
Deallocate a polynomial and set the pointer to NULL.
void xsh_free_vector(cpl_vector **v)
Deallocate a vector and set the pointer to NULL.
void xsh_free_image(cpl_image **i)
Deallocate an image and set the pointer to NULL.
void xsh_free_frame(cpl_frame **f)
Deallocate a frame and set the pointer to NULL.
double convert_bin_to_data(double bin_data, int binning)
void xsh_free_table(cpl_table **t)
Deallocate a table and set the pointer to NULL.
void xsh_free_propertylist(cpl_propertylist **p)
Deallocate a property list and set the pointer to NULL.
cpl_error_code xsh_get_table_value(const cpl_table *table, const char *colname, cpl_type coltype, int i, void *result)
Read a table value from a fits table.
cpl_propertylist * header
cpl_polynomial * slit_poly
cpl_polynomial * lambda_poly
cpl_polynomial * edguppoly
cpl_polynomial * edglopoly
cpl_polynomial * slicuppoly
cpl_polynomial * sliclopoly
#define XSH_DISPERSOL_TABLE_COLNAME_DEGY
#define XSH_DISPERSOL_AXIS_SLIT
#define XSH_DISPERSOL_TABLE_NBCOL
#define XSH_DISPERSOL_TABLE_COLNAME_DEGX
#define XSH_DISPERSOL_TABLE_COLNAME_ORDER
#define XSH_DISPERSOL_AXIS_LAMBDA
#define XSH_DISPERSOL_TABLE_COLNAME_AXIS
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_NEW_PROPERTYLIST(POINTER)
#define XSH_CALLOC(POINTER, TYPE, SIZE)
#define XSH_TABLE_LOAD(TABLE, NAME)