78#define SLIT_FRAC_STEP 50
84 cpl_frame *loc0_frame);
88 double **ref_ra,
double **ref_dec,
int flag);
92 const char *fname,
double slit_shift, cpl_frame** res_frame_ext);
95 cpl_frame *shift_frame);
164xsh_fill_gauss(
const int j,
const float A,
const float sigma,
const float bkg,
181 gauss = (A * expf(-0.5 * arg) + bkg);
189 xsh_pre *sci_pre,cpl_image* var_img,
190 double fx,
double fy,
double radius, cpl_vector *profile,
191 cpl_vector* profile2,
195 float *rec_flux = NULL;
196 float *rec_errs = NULL;
197 int *rec_qual = NULL;
223 xfirst=ceil(fx-radius);
224 xlast=floor(fx+radius);
226 yfirst=ceil(fy-radius);
227 ylast=floor(fy+radius);
229 xfirst = (xfirst > 0) ? xfirst : 0;
230 xlast = (xlast <
nx) ? xlast :
nx;
231 yfirst = (yfirst > 0) ? yfirst : 0;
232 ylast = (ylast <
ny) ? ylast :
ny;
236 if ( ix <0 || ix >=
nx || iy < 0 || iy >=
ny ) {
245 cpl_image *sci_img = NULL;
246 cpl_image *err_img = NULL;
247 cpl_image *qua_img = NULL;
256 check(
data = cpl_image_get_data_float( sci_img));
257 check( errs = cpl_image_get_data_float( err_img));
258 check( qual = cpl_image_get_data_int( qua_img));
260 int ix_iynx=ix+iy*
nx;
264 rec_flux[irec] =
data[ix_iynx];
265 rec_errs[irec] = errs[ix_iynx];
266 rec_qual[irec] = qual[ix_iynx];
273 double flux_val=0, confidence=0 ;
274 check( flux_val = cpl_image_get_interpolated( sci_img, fx, fy,
275 profile, radius, profile, radius, &confidence));
279 check( err_val = cpl_image_get_interpolated( var_img, fx, fy,
280 profile2, radius, profile2, radius, &confidence));
284 for(j=yfirst;j<ylast-1;j++) {
286 for(i=xfirst;i<xlast-1;i++) {
287 qual_val |= qual[j_nx+i];
292 rec_flux[irec] = flux_val;
293 rec_errs[irec] = sqrt(err_val);
294 if (confidence < 1) {
298 rec_qual[irec] = qual_val;
303 double flux_val=0, confidence=0 ;
304 check( flux_val = cpl_image_get_interpolated( sci_img, fx, fy,
305 profile, radius, profile, radius, &confidence));
307 if (confidence < 1) {
309 rec_flux[irec] = flux_val;
318 check( err_val = cpl_image_get_interpolated( var_img, fx, fy,
319 profile2, radius, profile2, radius, &confidence));
323 for(j=yfirst;j<ylast-1;j++) {
325 for(i=xfirst;i<xlast-1;i++) {
326 qual_val |= qual[j_nx+i];
331 rec_flux[irec] = flux_val;
332 rec_errs[irec] = sqrt(err_val);
333 rec_qual[irec] = qual_val;
339 rec_flux[irec] *= mult;
340 rec_errs[irec] *= mult;
385 cpl_frame *slit_shiftab_frame)
390 float * slit = NULL ;
391 double * lambda = NULL ;
395 int order, last_slit, last_lambda;
396 double *x_data = NULL;
397 double *y_data = NULL;
399 double *slit_shift_data = NULL;
400 const char *slit_shifttab_name = NULL;
401 cpl_table *shift_tab = NULL;
403 double *slit_shifttab_data = NULL;
404 double *wave_shifttab_data = NULL;
405 cpl_image* var_img=NULL;
419 cpl_image_multiply(var_img,var_img);
426 "rectify-radius must be positive");
439 last_lambda = nlambda-1;
445 for( ns = 0 ; ns < nslit ; ns++ ) {
450 rec_list->
list[idx].
slit[ns] = slit_min +
454 for( nl = 0 ; nl < nlambda ; nl++ ) {
462 rec_list->
list[idx].
slit[last_slit], nslit,
464 rec_list->
list[idx].
lambda[last_lambda], nlambda);
467 XSH_CALLOC( slit_shift_data,
double, nlambda);
468 if( slit_shiftab_frame != NULL){
469 check( slit_shifttab_name = cpl_frame_get_filename( slit_shiftab_frame));
472 check( wave_shifttab_data = cpl_table_get_data_double( shift_tab,
474 check( slit_shifttab_data = cpl_table_get_data_double( shift_tab,
476 shift_size = cpl_table_get_nrow( shift_tab);
478 for( nl = 0 ; nl < nlambda ; nl++ ) {
479 double wave = lambda[nl];
483 slit_shift_data[nl] = cshift;
487 FILE *shift_file = NULL;
488 char shift_name[256];
490 sprintf( shift_name,
"shift_%d_%.1f_%.1f.dat",
order, slit_min, slit_max);
491 shift_file = fopen( shift_name,
"w+");
493 fprintf( shift_file,
"# wave delta_s\n");
495 for( nl = 0 ; nl < nlambda ; nl++ ) {
496 fprintf ( shift_file,
"%f %f\n", lambda[nl], slit_shift_data[nl]);
504 if ( wavesol != NULL){
505 for( ns = skip_low ; ns < (nslit - skip_up) ; ns++ ) {
506 double xslit = slit[ns]+slit_shift;
508 for( nl = 0 ; nl < nlambda ; nl++ ) {
510 double xlambda = lambda[nl];
514 xslitrec = xslit+slit_shift_data[nl];
525 for( ns = skip_low ; ns < (nslit - skip_up) ; ns++ ) {
526 double xslit = slit[ns]+slit_shift;
527 int ns_nl=ns*nlambda;
528 for( nl = 0 ; nl < nlambda ; nl++ ) {
530 double pm_x=0, pm_y=0;
531 double xlambda = lambda[nl];
535 xslitrec = xslit+slit_shift_data[nl];
546 FILE *rec_file = NULL;
547 char recfile_name[256];
549 sprintf( recfile_name,
"rec_%d_%.1f_%.1f.dat",
order, slit_min ,slit_max);
550 rec_file = fopen( recfile_name,
"w+");
552 fprintf( rec_file,
"#irec wave slit x y\n");
554 for( ns = skip_low ; ns < (nslit - skip_up) ; ns++ ) {
555 double xslit = slit[ns]+slit_shift;
557 for( nl = 0 ; nl < nlambda ; nl++ ) {
559 double xlambda = lambda[nl];
563 xslitrec = xslit+slit_shift_data[nl];
564 fprintf ( rec_file,
"%d %f %f %f %f\n", irec, xlambda, xslitrec, x_data[irec],
571 if (disp_list == NULL) {
573 for( ns = skip_low ; ns < (nslit - skip_up) ; ns++ ) {
574 int ns_nl=ns*nlambda;
575 for( nl = 0 ; nl < nlambda ; nl++ ) {
590 cpl_polynomial *plambdadx = NULL, *plambdady = NULL;
591 cpl_polynomial *pslitdx = NULL, *pslitdy = NULL;
592 cpl_vector *val = NULL;
595 check( plambdadx = cpl_polynomial_duplicate(
597 check( plambdady = cpl_polynomial_duplicate(
599 check( pslitdx = cpl_polynomial_duplicate(
601 check( pslitdy = cpl_polynomial_duplicate(
606 check( cpl_polynomial_derivative( plambdadx, 0));
607 check( cpl_polynomial_derivative( plambdady, 1));
608 check( cpl_polynomial_derivative( pslitdx, 0));
609 check( cpl_polynomial_derivative( pslitdy, 1));
611 check( val = cpl_vector_new(2));
613 double ldx, ldy, sdx, sdy, abs_determinant;
617 for( ns = skip_low ; ns < (nslit - skip_up) ; ns++ ) {
618 ns_nlambda=ns*nlambda;
619 for( nl = 0 ; nl < nlambda ; nl++ ) {
625 check( cpl_vector_set( val, 0, fx));
626 check( cpl_vector_set( val, 1, fy));
628 check( ldx = cpl_polynomial_eval( plambdadx, val));
629 check( ldy = cpl_polynomial_eval( plambdady, val));
630 check( sdx = cpl_polynomial_eval( pslitdx, val));
631 check( sdy = cpl_polynomial_eval( pslitdy, val));
632 abs_determinant = bin_size/(fabs(ldx*sdy-sdx*ldy));
674 const char *slitmap_name = NULL;
675 cpl_propertylist *slitmap_header = NULL;
677 if ( slitmap_frame != NULL) {
681 check( slitmap_name = cpl_frame_get_filename( slitmap_frame));
682 check( slitmap_header = cpl_propertylist_load( slitmap_name, 0));
685 if ( cpl_error_get_code() != CPL_ERROR_NONE){
687 "Keyword 'MEDIAN EDGLO SLIT' not found in SLIT_MAP %s. Using default value %f",
693 if ( cpl_error_get_code() != CPL_ERROR_NONE){
695 "Keyword 'MEDIAN EDGUP SLIT' not found in SLIT_MAP %s. Using default value %f",
703 if ( cpl_error_get_code() != CPL_ERROR_NONE){
705 "Keyword 'MEDIAN SLICLO SLIT' not found in SLIT_MAP %s. Using default value %f",
710 if ( cpl_error_get_code() != CPL_ERROR_NONE){
712 "Keyword 'MEDIAN SLICUP SLIT' not found in SLIT_MAP %s. Using default value %f",
719 xsh_msg_warning(
"No provided SLIT_MAP. Using default values: 'MEDIAN EDGLO SLIT' %f - 'MEDIAN EDGUP SLIT' %f",
724 xsh_msg_warning(
"Using default values: 'MEDIAN SLICLO SLIT' %f - 'MEDIAN SLICUP SLIT' %f",
735 xsh_msg(
"IFU limits: slitlet DOWN [%f %f], size: %f arcsec",
736 *sdown, *sldown, *sldown-*sdown);
737 xsh_msg(
"IFU limits: slitlet CEN [%f %f], size: %f arcsec",
738 *sldown, *slup, *slup-*sldown);
739 xsh_msg(
"IFU limits: slitlet UP [%f %f], size: %f arcsec",
740 *slup, *sup, *sup-*slup);
743 xsh_msg(
"SLIT limits: [%f %f], total size: %f arcsec", *sdown, *sup, *sup-*sdown);
778 xsh_msg(
"SLIT : (%.3f,%.3f) used only (%.3f,%.3f) in %d elts",
797 for ( i = 0 ; i<spec_list->
size ; i++ ) {
803 imin = ceil( min/
step) ;
804 min = (double)imin *
step;
807 xsh_msg_dbg_high(
"--- test lambdamin - %d : %.4lf -> %.4lf, %lf -> %lf", i,
868 cpl_frame * orderlist_frame,
869 cpl_frame *wavesol_frame,
870 cpl_frame * model_frame,
873 cpl_frame *spectralformat_frame,
874 cpl_frame *disp_tab_frame,
875 const char * res_name,
876 cpl_frame** res_frame_ext,
877 cpl_frame** res_frame_tab,
878 const char* rec_prefix)
880 cpl_frame *result = NULL;
890 sprintf(tag,
"%s_%s",rec_prefix,
896 wavesol_frame, model_frame,
instrument, rectify_par, spectralformat_frame,
897 disp_tab_frame, res_name, tag,
898 res_frame_ext, res_frame_tab,
899 0, 100, slit_min, nslit,0, NULL));
929 cpl_frame * orderlist_frame,
930 cpl_frame *wavesol_frame,
931 cpl_frame * model_frame,
934 cpl_frame *spectralformat_frame,
935 cpl_frame * loc_frame,
936 cpl_frame * loc0_frame,
938 cpl_frame *disp_tab_frame,
939 const char * res_name,
940 cpl_frame** res_frame_ext,
941 cpl_frame** res_frame_tab)
943 cpl_frame *result = NULL, *shift_rec = NULL;
944 cpl_frame * shift_rec_ext = NULL;
949 const char *tag = NULL;
950 cpl_propertylist *header = NULL;
952 double shift_arcsec=0, shift_pix=0, shift_bin_arcsec=0;
953 double rectify_shift;
956 cpl_frame * result0 = NULL;
957 char * res0_name = NULL ;
959 xsh_msg(
"===> xsh_rectify_and_shift" ) ;
970 if ( throw_shift == NULL) {
971 if ( loc0_frame != NULL){
973 xsh_msg(
"Compute shift with localization");
977 xsh_msg(
"Fixed shift with localization to 0");
982 shift_arcsec = *throw_shift;
983 xsh_msg(
"Use throw shift %f", shift_arcsec);
987 shift_bin_arcsec = shift_pix*bin_space;
988 rectify_shift = shift_bin_arcsec-shift_arcsec;
990 xsh_msg(
" Mesured Shift for rectify : %f", rectify_shift);
994 rectify_par, spectralformat_frame,
995 disp_tab_frame, res_name, tag,
996 &shift_rec_ext, res_frame_tab,
997 0, 100, slit_min, nslit, rectify_shift,
1015 cpl_frame *orderlist_frame, cpl_frameset *wavesol_frameset,
1016 cpl_frameset *shiftifu_frameset,
1019 cpl_frame * slitmap_frame,
1020 cpl_frameset** rec_frameset_ext,
1021 cpl_frameset** rec_frameset_tab,
1022 const char* rec_prefix )
1024 cpl_frameset *result = NULL;
1031 XSH_REGDEBUG(
"TODO : ADD disp_tab frameset, res_frame_ext frameset");
1034 wavesol_frameset, shiftifu_frameset, model_frame,
instrument, rectify_par,
1035 spectralformat_frame,
1036 slitmap_frame,rec_frameset_ext,rec_frameset_tab, 0, 100, rec_prefix));
1081 cpl_frame *wavesol_frame,
1082 cpl_frame *model_frame,
1085 cpl_frame *spectralformat_frame,
1086 cpl_frame *disp_tab_frame,
1087 const char *res_name,
1089 cpl_frame** res_frame_ext,
1090 cpl_frame** res_frame_tab,
1096 cpl_frame *slitshift_tab)
1101 int solution_type = 0;
1103 cpl_frame * res_frame = NULL ;
1105 int i, nlambda,
order ;
1109 char res_name_drl[256];
1112 int rec_min_index, rec_max_index;
1113 const char* solution_type_name[2] = {
"POLY",
"MODEL"};
1114 int found_line=
true;
1126 assure( disp_tab_frame != NULL,CPL_ERROR_ILLEGAL_INPUT,
1127 "If -rectify-conserve-flux=TRUE "
1128 "you must provide an input dispersion table "
1129 "tagged as DISP_TAB_%s or DISP_TAB_AFC_%s .",
1146 if ( model_frame != NULL) {
1152 else if ( wavesol_frame != NULL ) {
1158 "Undefined solution type (POLY or MODEL). See your input sof");
1161 xsh_msg(
"===== Solution type %s", solution_type_name[solution_type]);
1177 rec_list->
nslit = nslit;
1182 if (min_index >= 0){
1183 rec_min_index = min_index;
1188 if ( max_index < rec_list->
size){
1189 rec_max_index = max_index;
1192 rec_max_index = rec_list->
size-1;
1201 cpl_image_reject_from_mask(pre_sci->
data,mask);
1206 for( i = rec_min_index; i <= rec_max_index; i++ ) {
1207 double lambda_min, lambda_max ;
1218 assure(nlambda>0,CPL_ERROR_ILLEGAL_INPUT,
1219 "Number of wavelength sampling points is %d. Must be > 0. "
1220 "You may have to decrease rectify-bin-lambda param value.",
1223 assure(nslit>0,CPL_ERROR_ILLEGAL_INPUT,
1224 "Number of spatial sampling points is %d. Must be > 0. "
1225 "You may have to decrease rectify-bin-slit param value.",
1239 lambda_min, lambda_max , slit_min, slit_max);
1248 slit_min, slit_max, lambda_min, 0, 0, rectify_par,
1249 slit_shift, slitshift_tab));
1257 sprintf( tag_drl ,
"%s_DRL", tag);
1258 sprintf( res_name_drl ,
"DRL_%s", res_name);
1263 if ( slitshift_tab != NULL){
1270 if ( res_frame_ext != NULL){
1273 sprintf( tag_drl ,
"%s_TAB", tag);
1274 sprintf( res_name_drl ,
"TAB_%s", res_name);
1292 double *down,
double *cen,
double *up)
1294 cpl_frame *offsetdown_frame = NULL;
1295 cpl_frame *offsetcen_frame = NULL;
1296 cpl_frame *offsetup_frame = NULL;
1297 const char *offsetdown_name = NULL;
1298 const char *offsetcen_name = NULL;
1299 const char *offsetup_name = NULL;
1300 cpl_propertylist *offsetdown_list = NULL;
1301 cpl_propertylist *offsetcen_list = NULL;
1302 cpl_propertylist *offsetup_list = NULL;
1308 check( offsetdown_frame = cpl_frameset_get_frame( set, 0));
1309 check( offsetcen_frame = cpl_frameset_get_frame( set, 1));
1310 check( offsetup_frame = cpl_frameset_get_frame( set, 2));
1311 check( offsetdown_name = cpl_frame_get_filename( offsetdown_frame));
1312 check( offsetcen_name = cpl_frame_get_filename( offsetcen_frame));
1313 check( offsetup_name = cpl_frame_get_filename( offsetup_frame));
1314 check( offsetdown_list = cpl_propertylist_load( offsetdown_name, 0));
1315 check( offsetcen_list = cpl_propertylist_load( offsetcen_name, 0));
1316 check( offsetup_list = cpl_propertylist_load( offsetup_name, 0));
1333 cpl_frame *shift_frame)
1335 cpl_propertylist *shift_header = NULL;
1336 const char *shift_name = NULL;
1337 double waveref, slitref;
1342 check( shift_name = cpl_frame_get_filename( shift_frame));
1343 check( shift_header = cpl_propertylist_load( shift_name, 0));
1373 double sldown,
double slup,
double sup,
double slit_bin,
1374 double *slitmin_tab,
int *nslit_tab,
double *slitcen_tab)
1376 double offset_down=0, offset_cen=0, offset_up=0;
1377 double cen_slitlet_down_size;
1378 double cen_slitlet_up_size=0;
1379 double down_slitlet_down_size;
1380 double down_slitlet_up_size;
1381 double up_slitlet_down_size;
1382 double up_slitlet_up_size=0;
1383 double slitlet_up_size;
1384 double slitlet_down_size;
1385 double cen_ref_down, cen_ref_up;
1386 double cen_pixpos = 0.0;
1400 xsh_msg(
"Shift reference: down %f arcsec, center %f arcsec, up %f arcsec",
1401 offset_down, offset_cen, offset_up);
1403 slitcen_tab[0] = offset_down;
1404 slitcen_tab[1] = offset_cen;
1405 slitcen_tab[2] =offset_up;
1407 down_slitlet_down_size = offset_down-sdown;
1408 down_slitlet_up_size = sldown-offset_down;
1411 down_slitlet_down_size, down_slitlet_up_size);
1413 cen_slitlet_down_size = offset_cen-sldown;
1414 cen_slitlet_up_size = slup-offset_cen;
1417 cen_slitlet_down_size, cen_slitlet_up_size);
1419 up_slitlet_down_size = offset_up-slup;
1420 up_slitlet_up_size = sup-offset_up;
1423 up_slitlet_down_size, up_slitlet_up_size);
1426 if ( cen_slitlet_down_size < up_slitlet_up_size){
1427 slitlet_down_size = cen_slitlet_down_size;
1430 slitlet_down_size = up_slitlet_up_size;
1432 if ( slitlet_down_size > down_slitlet_up_size){
1433 slitlet_down_size = down_slitlet_up_size;
1436 if ( cen_slitlet_up_size < up_slitlet_down_size){
1437 slitlet_up_size = cen_slitlet_up_size;
1440 slitlet_up_size = up_slitlet_down_size;
1442 if ( slitlet_up_size > down_slitlet_down_size){
1443 slitlet_up_size = down_slitlet_down_size;
1446 xsh_msg_dbg_medium(
"Slitlet size DOWN %f UP %f", slitlet_down_size, slitlet_up_size);
1449 cen_ref_down = offset_cen-slitlet_down_size;
1450 cen_ref_up = offset_cen+slitlet_up_size;
1451 if (cen_ref_down > 0){
1452 down_nslit = ceil( cen_ref_down/slit_bin);
1455 down_nslit = floor( cen_ref_down/slit_bin);
1457 if ( cen_ref_up > 0){
1458 up_nslit = ceil( cen_ref_up/slit_bin);
1461 up_nslit = floor( cen_ref_up/slit_bin);
1464 xsh_msg(
"Adjust central reference slitlet [%f %f] with bin %f arcsec: [%f %f]",
1465 cen_ref_down, cen_ref_up, slit_bin, down_nslit*slit_bin, up_nslit*slit_bin);
1467 cen_pixpos = (offset_cen-down_nslit*slit_bin)/slit_bin;
1468 ref_slit_size = up_nslit-down_nslit+1;
1469 xsh_msg(
"Center position in pixel %f (Total %d pix)", cen_pixpos, ref_slit_size);
1470 slitmin_tab[1] = down_nslit*slit_bin;
1471 nslit_tab[1] = ref_slit_size;
1473 slitmin_tab[0] = offset_down-(ref_slit_size-1-cen_pixpos)*slit_bin;
1474 nslit_tab[0] = ref_slit_size;
1476 slitmin_tab[2] = offset_up-(ref_slit_size-1-cen_pixpos)*slit_bin;
1477 nslit_tab[2] = ref_slit_size;
1479 xsh_msg(
"Prepare the cube bin %f arcsec", slit_bin);
1480 xsh_msg(
"DOWN [%f, %f]", slitmin_tab[0], slitmin_tab[0]+nslit_tab[0]*slit_bin);
1481 xsh_msg(
"CEN [%f, %f]", slitmin_tab[1], slitmin_tab[1]+nslit_tab[1]*slit_bin);
1482 xsh_msg(
"UP [%f, %f]", slitmin_tab[2], slitmin_tab[2]+nslit_tab[2]*slit_bin);
1516 cpl_frameset *wavesol_frameset,
1517 cpl_frameset *shift_frameset,
1518 cpl_frame *model_frame,
1521 cpl_frame *spectralformat_frame,
1522 cpl_frame * slitmap_frame,
1523 cpl_frameset ** res_frameset_ext,
1524 cpl_frameset ** res_frameset_tab,
1527 const char* rec_prefix)
1529 cpl_frameset *res_frameset = NULL ;
1531 cpl_frame *wavesolup_frame = NULL;
1532 cpl_frame *wavesolcen_frame = NULL;
1533 cpl_frame *wavesoldown_frame = NULL;
1534 cpl_frame *shiftup_frame = NULL;
1535 cpl_frame *shiftcen_frame = NULL;
1536 cpl_frame *shiftdown_frame = NULL;
1539 double sdown=0, sldown=0, slup=0, sup=0;
1541 double slitlet_down_u=0;
1543 double slitlet_cen_l=0, slitlet_cen_u=0;
1544 double slitlet_cen_u_bin=0;
1546 double down_offset=0.0;
1551 double slitmin_tab[3];
1552 double slitcen_tab[3];
1566 if ( wavesol_frameset != NULL){
1567 check( wavesoldown_frame = cpl_frameset_get_frame( wavesol_frameset, 0));
1568 check( wavesolcen_frame = cpl_frameset_get_frame( wavesol_frameset, 1));
1569 check( wavesolup_frame = cpl_frameset_get_frame( wavesol_frameset, 2));
1572 if ( shift_frameset != NULL){
1573 check( shiftdown_frame = cpl_frameset_get_frame( shift_frameset, 0));
1574 check( shiftcen_frame = cpl_frameset_get_frame( shift_frameset, 1));
1575 check( shiftup_frame = cpl_frameset_get_frame( shift_frameset, 2));
1579 check( res_frameset = cpl_frameset_new());
1584 if ( shift_frameset != NULL){
1586 sldown, slup, sup, bin_space,
1587 slitmin_tab, nslit_tab, slitcen_tab));
1590 slitlet_cen_l = sldown;
1591 slitlet_cen_u = slup;
1594 slitlet_down_u = slitlet_cen_l;
1598 slitmin_tab[1] = slitlet_cen_l;
1599 nslit_tab[1] = ceil((slitlet_cen_u-slitlet_cen_l)/rectify_par->
rectif_bin_space);
1600 slitlet_cen_u_bin = slitmin_tab[1]+nslit_tab[1]*rectify_par->
rectif_bin_space;
1603 nslit_tab[0] = nslit_tab[1];
1604 slitmin_tab[0] = slitlet_down_u-down_offset-
1608 slitmin_tab[2] = slitlet_cen_u_bin;
1609 nslit_tab[2] = nslit_tab[1];
1615 cpl_frame *wavesol_frame = NULL;
1616 cpl_frame *shift_frame = NULL;
1617 cpl_frame *res_frame = NULL;
1618 cpl_frame *resext_frame = NULL;
1619 cpl_frame *restab_frame = NULL;
1620 double slitlet_slit_min = 0.0;
1623 double rec_shift=0.0;
1625 const char *slitlet_name = NULL;
1630 slitlet_name =
"DOWN";
1631 nslit = nslit_tab[0];
1632 slitlet_slit_min = slitmin_tab[0];
1633 wavesol_frame = wavesoldown_frame;
1634 shift_frame = shiftdown_frame;
1635 sprintf(tag,
"%s_%s",rec_prefix,
1637 sprintf(res_name,
"%s.fits",tag);
1641 slitlet_name =
"CEN";
1642 slitlet_slit_min = slitmin_tab[1];
1643 nslit = nslit_tab[1];
1644 wavesol_frame = wavesolcen_frame;
1645 shift_frame = shiftcen_frame;
1646 sprintf(tag,
"%s_%s",rec_prefix,
1648 sprintf(res_name,
"%s.fits",tag);
1652 slitlet_name =
"UP";
1653 slitlet_slit_min = slitmin_tab[2];
1654 nslit = nslit_tab[2];
1656 wavesol_frame = wavesolup_frame;
1657 shift_frame = shiftup_frame;
1658 sprintf(tag,
"%s_%s",rec_prefix,
1660 sprintf(res_name,
"%s.fits",tag);
1664 rec_min = slitlet_slit_min;
1667 xsh_msg(
"Cut edges with %d pix", cut_edges);
1669 nslit -= cut_edges*2;
1674 xsh_msg(
"%s [%f %f] in %d pix of %f arcsec" ,slitlet_name,
1680 wavesol_frame, model_frame,
instrument, rectify_par,
1681 spectralformat_frame, NULL, res_name, tag, &resext_frame, &restab_frame,
1682 min_index, max_index, rec_min, nslit, rec_shift,shift_frame));
1684 check( cpl_frameset_insert( res_frameset, res_frame));
1686 if(res_frameset_ext !=NULL && res_frameset_tab !=NULL) {
1687 check( cpl_frameset_insert(*res_frameset_ext, resext_frame));
1688 check( cpl_frameset_insert(*res_frameset_tab, restab_frame));
1693 return res_frameset ;
1709 cpl_frame *loc0_frame)
1711 double shift_a=0, shift_b=0, shift=0;
1721 check( shift_a = cpl_polynomial_eval_1d( loc0->cenpoly, 0., NULL));
1722 check( shift_b = cpl_polynomial_eval_1d( loc->
cenpoly, 0., NULL));
1725 shift = shift_b-shift_a;
1727 xsh_msg(
"Shift (localization) = %lf", shift);
1893 double ref_ra_cumoff, ref_dec_cumoff;
1894 double ra_cumoff, dec_cumoff;
1895 double ra_reloff, dec_reloff, ra_off, dec_off;
1898 double shift_arcsec=0;
1907 posang = posang/180.0*
M_PI;
1909 if ( *ref_ra != NULL){
1910 ref_ra_cumoff = **ref_ra;
1915 **ref_ra = ref_ra_cumoff;
1917 if ( *ref_dec != NULL){
1918 ref_dec_cumoff = **ref_dec;
1923 **ref_dec = ref_dec_cumoff;
1939 xsh_msg(
"POSANG %f (rad) REF CUM_(RA DEC) : %f %f ", posang, ref_ra_cumoff,
1941 xsh_msg(
"OBJ CUM_(RA DEC) : %f %f ", ra_cumoff, dec_cumoff);
1942 xsh_msg(
"REL_(RA DEC) : %f %f", ra_reloff, dec_reloff);
1944 ra_off = ra_cumoff-ref_ra_cumoff;
1945 dec_off = dec_cumoff-ref_dec_cumoff;
1947 xsh_msg(
"COMPUTE OFF_(RA DEC) : %f %f", ra_off, dec_off);
1949 shift_arcsec = cos(-posang)*dec_off+sin(-posang)*ra_off;
1951 xsh_msg(
"COMPUTE shift in arcsec %f :", shift_arcsec);
1954 return shift_arcsec;
1978 cpl_frame** res_frame_ext,
1983 cpl_frame *result = NULL ;
1985 double bin_space, shift_arcsec;
1986 const char *filename = NULL;
1987 cpl_propertylist* header = NULL;
1997 check( filename = cpl_frame_get_filename( rec_frame));
1998 check( header = cpl_propertylist_load( filename, 0));
2003 rectify_par, ref_ra, ref_dec, flag));
2008 shift_arcsec = shift_pix*bin_space;
2010 xsh_msg(
"SHIFT A-->B : %f in arcsec", shift_arcsec);
2016 if ( cpl_error_get_code() !=CPL_ERROR_NONE){
2031 cpl_frame** res_frame_ext)
2034 cpl_frame *result = NULL ;
2035 int nb_orders,
order = 0 ;
2036 float *slit = NULL ;
2038 char* fname_drl=NULL;
2050 nb_orders = rec_list->
size ;
2058 for( ns = 0 ; ns < nslit ; ns++ ) {
2059 slit[ns]+=slit_shift;
2063 rec_list->
slit_max = slit[nslit-1];
2078 tag_drl, CPL_TRUE));
2082 if ( cpl_error_get_code() !=CPL_ERROR_NONE){
2109 cpl_frame * loc_frame,
2110 cpl_frame * loc0_frame,
2111 const char * file_name,
2115 cpl_frame** res_frame_ext )
2117 cpl_frame * result = NULL ;
2118 double *ra = NULL, *dec = NULL;
2120 xsh_msg(
"===> xsh_shift_rectified" ) ;
2126 rectif_par, file_name, res_frame_ext, &ra, &dec, 1));
static xsh_instrument * instrument
cpl_mask * xsh_qual_to_cpl_mask(cpl_image *qual, const int decode_bp)
void xsh_baryvel(const cpl_propertylist *raw_header, double *bary_corr, double *helio_corr)
Compute velocity correction.
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.
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_order_list * xsh_order_list_load(cpl_frame *frame, xsh_instrument *instr)
load an order list from a frame
void xsh_order_list_free(xsh_order_list **list)
free memory associated to an order_list
cpl_image * xsh_pre_get_data(xsh_pre *pre)
Get data.
xsh_pre * xsh_pre_load(cpl_frame *frame, xsh_instrument *instr)
Load a xsh_pre structure from a frame.
cpl_image * xsh_pre_get_qual(xsh_pre *pre)
Get qual.
int xsh_pre_get_ny(const xsh_pre *pre)
Get ny of pre structure.
void xsh_pre_free(xsh_pre **pre)
Free a xsh_pre structure.
int xsh_pre_get_nx(const xsh_pre *pre)
Get nx of pre structure.
cpl_image * xsh_pre_get_errs(xsh_pre *pre)
Get errs.
int xsh_rec_list_get_nslit(xsh_rec_list *list, int idx)
double * xsh_rec_list_get_lambda(xsh_rec_list *list, int idx)
xsh_rec_list * xsh_rec_list_load(cpl_frame *frame, xsh_instrument *instrument)
load an rec list from a frame
float * xsh_rec_list_get_data1(xsh_rec_list *list, int idx)
cpl_frame * xsh_rec_list_save(xsh_rec_list *list, const char *filename, const char *tag, int is_temp)
Save a rec list in a frame.
cpl_frame * xsh_rec_list_save2(xsh_rec_list *list, const char *filename, const char *tag)
save an rec list to a frame
float * xsh_rec_list_get_errs1(xsh_rec_list *list, int idx)
void xsh_rec_list_update_header(xsh_rec_list *rec_list, xsh_pre *pre, xsh_rectify_param *rec_par, const char *pro_catg)
Update header of rectified list writing mandatory KW.
int xsh_rec_list_get_order(xsh_rec_list *list, int idx)
void xsh_rec_list_set_data_size(xsh_rec_list *list, int idx, int absorder, int nlambda, int ns)
Allocate memory for the order idx of the rectify list.
int * xsh_rec_list_get_qual1(xsh_rec_list *list, int idx)
float * xsh_rec_list_get_slit(xsh_rec_list *list, int idx)
int xsh_rec_list_get_nlambda(xsh_rec_list *list, int idx)
void xsh_rec_list_free(xsh_rec_list **list)
free memory associated to a rec_list
xsh_rec_list * xsh_rec_list_create(xsh_instrument *instr)
Create an empty order list.
cpl_frame * xsh_rec_list_save_table(xsh_rec_list *list, const char *filename, const char *tag, int is_temp)
Save a rec list in a frame.
xsh_wavesol * xsh_wavesol_load(cpl_frame *frame, xsh_instrument *instrument)
load a wavelength solution
double xsh_wavesol_eval_poly(xsh_wavesol *sol, double lambda, double order, double slit)
eval the polynomial solution in Y
void xsh_wavesol_free(xsh_wavesol **w)
free wavelength solution structure
double xsh_wavesol_eval_polx(xsh_wavesol *sol, double lambda, double order, double slit)
eval the polynomial solution in X
#define XSH_REGDEBUG(...)
#define XSH_ASSURE_NOT_ILLEGAL(cond)
#define assure(CONDITION, ERROR_CODE,...)
#define XSH_CMP_INT(A, OPERATOR, B, SUFFIX,...)
#define xsh_error_reset()
#define xsh_error_msg(...)
#define XSH_ASSURE_NOT_NULL(pointer)
const char * xsh_instrument_arm_tostring(xsh_instrument *i)
Get the string associated with an arm.
XSH_MODE xsh_instrument_get_mode(xsh_instrument *i)
Get a mode on instrument structure.
cpl_error_code xsh_model_config_load_best(cpl_frame *config_frame, xsh_xs_3 *p_xs_3)
Load the config model table and fill the struct.
void xsh_model_get_xy(xsh_xs_3 *p_xs_3, xsh_instrument *instr, double lambda_nm, int morder, double ent_slit_pos, double *x, double *y)
Compute the detector location (floating point pixels) of a given wavelength/entrance slit position.
#define xsh_msg_warning(...)
Print an warning message.
#define xsh_msg_dbg_medium(...)
#define xsh_msg(...)
Print a message on info level.
#define xsh_msg_dbg_low(...)
#define xsh_msg_dbg_high(...)
double xsh_pfits_get_ra_cumoffset(const cpl_propertylist *plist)
double xsh_pfits_get_b_ra_reloffset(const cpl_propertylist *plist)
double xsh_pfits_get_shiftifu_lambdaref(cpl_propertylist *plist)
double xsh_pfits_get_slitmap_median_edglo(const cpl_propertylist *plist)
void xsh_pfits_set_shiftifu_lambdaref(cpl_propertylist *plist, double value)
void xsh_pfits_set_rectify_space_max(cpl_propertylist *plist, double value)
WRITE the space (slit) max value.
double xsh_pfits_get_rectify_bin_space(cpl_propertylist *plist)
find out the rectify space (slit) binning
double xsh_pfits_get_b_ra_cumoffset(const cpl_propertylist *plist)
void xsh_pfits_set_shiftifu_slitref(cpl_propertylist *plist, double value)
double xsh_pfits_get_shiftifu_slitref(cpl_propertylist *plist)
void xsh_pfits_set_rectify_space_min(cpl_propertylist *plist, double value)
WRITE the space (slit) min value.
double xsh_pfits_get_posang(const cpl_propertylist *plist)
double xsh_pfits_get_dec_cumoffset(const cpl_propertylist *plist)
double xsh_pfits_get_slitmap_median_slicup(const cpl_propertylist *plist)
double xsh_pfits_get_slitmap_median_edgup(const cpl_propertylist *plist)
double xsh_pfits_get_slitmap_median_sliclo(const cpl_propertylist *plist)
double xsh_pfits_get_b_dec_cumoffset(const cpl_propertylist *plist)
double xsh_pfits_get_b_dec_reloffset(const cpl_propertylist *plist)
static double compute_shift_with_localization(cpl_frame *loc_frame, cpl_frame *loc0_frame)
cpl_frame * xsh_rectify_and_shift(cpl_frame *sci_frame, cpl_frame *orderlist_frame, cpl_frame *wavesol_frame, cpl_frame *model_frame, xsh_instrument *instrument, xsh_rectify_param *rectify_par, cpl_frame *spectralformat_frame, cpl_frame *loc_frame, cpl_frame *loc0_frame, double *throw_shift, cpl_frame *disp_tab_frame, const char *res_name, cpl_frame **res_frame_ext, cpl_frame **res_frame_tab)
cpl_frameset * xsh_rectify_orders_ifu(cpl_frame *sci_frame, xsh_order_list *orderlist, cpl_frameset *wavesol_frameset, cpl_frameset *shift_frameset, cpl_frame *model_frame, xsh_instrument *instrument, xsh_rectify_param *rectify_par, cpl_frame *spectralformat_frame, cpl_frame *slitmap_frame, cpl_frameset **res_frameset_ext, cpl_frameset **res_frameset_tab, int min_index, int max_index, const char *rec_prefix)
cpl_frame * shift_with_kw(cpl_frame *rec_frame, xsh_instrument *instrument, xsh_rectify_param *rectify_par, const char *fname, cpl_frame **res_frame_ext, double **ref_ra, double **ref_dec, int flag)
This function creates a structure containing for each order the shift to be applied.
cpl_frame * xsh_rectify_orders(cpl_frame *sci_frame, xsh_order_list *orderlist, cpl_frame *wavesol_frame, cpl_frame *model_frame, xsh_instrument *instrument, xsh_rectify_param *rectify_par, cpl_frame *spectralformat_frame, cpl_frame *disp_tab_frame, const char *res_name, const char *tag, cpl_frame **res_frame_ext, cpl_frame **res_frame_tab, int min_index, int max_index, double slit_min, int nslit, double slit_shift, cpl_frame *slitshift_tab)
Create a grid in wavelength with the step in lambda and slit. Steps are defined in the parameters....
void xsh_compute_slitlet_limits(cpl_frameset *shift_set, double sdown, double sldown, double slup, double sup, double slit_bin, double *slitmin_tab, int *nslit_tab, double *slitcen_tab)
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_rec_slit_size(xsh_rectify_param *rectify_par, double *slit_min, int *nslit, XSH_MODE mode)
rectify frame
cpl_frame * xsh_rectify(cpl_frame *sci_frame, cpl_frame *orderlist_frame, cpl_frame *wavesol_frame, cpl_frame *model_frame, xsh_instrument *instrument, xsh_rectify_param *rectify_par, cpl_frame *spectralformat_frame, cpl_frame *disp_tab_frame, const char *res_name, cpl_frame **res_frame_ext, cpl_frame **res_frame_tab, const char *rec_prefix)
Create a grid in wavelength with the step in lambda and slit. Steps are defined in the parameters....
static void xsh_rec_list_rectify(xsh_rec_list *rec_list, int iorder, int irec, xsh_pre *sci_pre, cpl_image *var_img, double fx, double fy, double radius, cpl_vector *profile, cpl_vector *profile2, double mult)
static void adjust_lambdas(xsh_spectralformat_list *spec_list, xsh_rectify_param *rectify_par)
static cpl_vector * rec_profile
static cpl_frame * xsh_shift(cpl_frame *rec_frame, xsh_instrument *instrument, const char *fname, double slit_shift, cpl_frame **res_frame_ext)
static void fill_rectified(xsh_pre *pre_sci, xsh_rec_list *rec_list, int idx, xsh_wavesol *wavesol, xsh_xs_3 *model_config, xsh_instrument *instrument, xsh_dispersol_list *disp_list, float slit_min, float slit_max, double lambda_min, int skip_low, int skip_up, xsh_rectify_param *rectify_par, double slit_shift, cpl_frame *slit_shiftab_frame)
Fill the rectified structure for one order with the corresponding flux, using the wavelength solution...
static void xsh_frame_set_shiftifu_ref(cpl_propertylist *header, cpl_frame *shift_frame)
cpl_frameset * xsh_rectify_ifu(cpl_frame *sci_frame, cpl_frame *orderlist_frame, cpl_frameset *wavesol_frameset, cpl_frameset *shiftifu_frameset, cpl_frame *model_frame, xsh_instrument *instrument, xsh_rectify_param *rectify_par, cpl_frame *spectralformat_frame, cpl_frame *slitmap_frame, cpl_frameset **rec_frameset_ext, cpl_frameset **rec_frameset_tab, const char *rec_prefix)
cpl_frame * xsh_shift_rectified(cpl_frame *rec_frame, cpl_frame *loc_frame, cpl_frame *loc0_frame, const char *file_name, xsh_combine_nod_param *combine_nod_param, xsh_rectify_param *rectif_par, xsh_instrument *instrument, cpl_frame **res_frame_ext)
static double compute_shift_with_kw(cpl_propertylist *header, xsh_rectify_param *rectify_par, double **ref_ra, double **ref_dec, int flag)
static cpl_vector * err_profile
static void xsh_get_shift_ref(cpl_frameset *set, double *down, double *cen, double *up)
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.
int xsh_debug_level_get(void)
get debug level
double convert_data_to_bin(double data, int binning)
void xsh_free_frame(cpl_frame **f)
Deallocate a frame and set the pointer to NULL.
double xsh_data_interpolate(double wav, int nrow, double *pw, double *pe)
Interpolate data points.
void xsh_free_mask(cpl_mask **m)
Deallocate an image mask and set the pointer to NULL.
char * xsh_stringcat_any(const char *s,...)
Concatenate an arbitrary number of strings.
long xsh_round_double(double x)
Computes round(x)
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_polynomial * slit_poly
cpl_polynomial * lambda_poly
cpl_propertylist * data_header
cpl_propertylist * header
#define QFLAG_OUTSIDE_DATA_RANGE
#define QFLAG_MISSING_DATA
#define XSH_GET_TAG_FROM_ARM(TAG, instr)
#define XSH_RECTIFY_TYPE_MODEL
#define XSH_SHIFTIFU_COLNAME_WAVELENGTH
#define XSH_SHIFTIFU_COLNAME_SHIFTSLIT
#define XSH_RECTIFY_TYPE_POLY
#define SLITLET_CEN_CENTER
cpl_error_code xsh_model_temperature_update_frame(cpl_frame **model_config_frame, cpl_frame *ref_frame, xsh_instrument *instrument, int *found_temp)
#define XSH_QC_VRAD_HELICOR_C
#define XSH_QC_VRAD_HELICOR
#define XSH_QC_VRAD_BARYCOR
#define XSH_QC_VRAD_BARYCOR_C
#define XSH_FREE(POINTER)
#define XSH_MALLOC(POINTER, TYPE, SIZE)
#define XSH_CALLOC(POINTER, TYPE, SIZE)
#define XSH_TABLE_LOAD(TABLE, NAME)
#define XSH_TABLE_FREE(TABLE)