70 int ifirst,
int ilast,
const int decode_bp,
int *skymask);
77 cpl_frame *skymask_frame,
107 int ifirst,
int ilast,
const int decode_bp,
int *skymask)
110 int* nbgoodpixels = NULL;
128 for(i=ifirst; i<=ilast; i++){
129 if (skymask[i] == 0){
130 for( j=0 ; j<
ny ; j++) {
132 if ( (qual[j_nx] & decode_bp) == 0 ){
134 data[j] +=flux[j_nx];
149 if ( nbgoodpixels[j] != 0 ) {
150 data[j] =
data[j] / (float)(nbgoodpixels[j]);
171 if ( slit_limit_par == NULL ) {
182 for(i = slit0; i<slit1; i++) {
221 cpl_frame *skymask_frame,
227 cpl_frame *merge_frame = NULL;
228 cpl_frame *res_frame = NULL;
231 const char* rec_prefix =
"LOCALIZE";
241 if ( rec_frame != NULL){
242 const char* filename = NULL;
245 check( filename = cpl_frame_get_filename( merge_frame));
246 check( cpl_frame_set_level( merge_frame, CPL_FRAME_LEVEL_TEMPORARY));
265 if ( fname == NULL ) {
270 sprintf(filename,
"LOCALIZATION_TABLE_%s.fits",
274 sprintf(filename,fname);
291 double slit_cen, slit_up, slit_low;
344 cpl_frame *skymask_frame,
351 double* slit_center = NULL;
352 double* slit_upper = NULL;
353 double* slit_lower = NULL;
354 double* chunk_center = NULL;
355 cpl_vector* slit_center_v = NULL;
356 cpl_vector* slit_upper_v = NULL;
357 cpl_vector* slit_lower_v = NULL;
358 cpl_vector* chunk_center_v = NULL;
362 int skip_order_nb = 0;
363 int first_order_index = 0;
364 int slit_nod, slit_lim ;
369 int nslit, nlambda, chunk_size;
370 double* slit_tab = NULL;
374 int ichunk, skip_chunk=0, nb_chunk;
375 cpl_polynomial *cen_poly = NULL;
379 int islit, iter,
niter=5, nbrej=-1;
380 cpl_vector *dispslit = NULL;
381 cpl_vector *gausspos = NULL;
382 cpl_vector *gaussval = NULL;
383 int *sky_mask = NULL;
384 cpl_table *skymask_table = NULL;
385 const char* skymask_name = NULL;
402 check( skymask_name = cpl_frame_get_filename( skymask_frame));
417 check( flux = cpl_image_get_data_double( spectrum->
flux));
419 check( qual = cpl_image_get_data_int( spectrum->
qual));
431 float *skymask_data = NULL;
433 double fwhm =0.0, sky_min, sky_max;
434 int isky_min, isky_max, imask;
435 double width, resolution;
440 check( skymask_data = cpl_table_get_data_float( skymask_table,
442 check( nrow = cpl_table_get_nrow( skymask_table));
446 for( irow=0; irow < nrow; irow++){
449 fwhm = skymask_data[irow]/resolution;
450 sky_min = skymask_data[irow]-fwhm;
451 sky_max = skymask_data[irow]+fwhm;
454 for( imask=isky_min; imask <=isky_max; imask++){
459 FILE *mask_file = NULL;
463 sprintf( mask_name,
"skymask.reg");
464 mask_file = fopen( mask_name,
"w");
466 fprintf( mask_file,
"# Region file format: DS9 version 4.1\n");
467 fprintf( mask_file,
"global color=green dashlist=8 3 width=1 font=\"helvetica 10 normal\"\
468 select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1\n");
469 fprintf(mask_file,
"physical\n");
471 for(idbg=0; idbg< nlambda; idbg++){
473 if (sky_mask[idbg] == 1){
474 fprintf( mask_file,
"line(%d,%d,%d,%d)\n",idbg+1, nslit, idbg+1, 1);
501 slit_nod = loc_obj_par->
nod_step/arcsec ;
507 check( gaussval = cpl_vector_wrap( nslit, slit_tab));
508 check( gausspos = cpl_vector_new( nslit));
509 for( islit=0; islit < nslit; islit++){
510 cpl_vector_set( gausspos, islit, islit);
513 chunk_size = (nlambda-1) / (
double)(loc_obj_par->
loc_chunk_nb);
518 for( ichunk=0; ichunk< loc_obj_par->
loc_chunk_nb; ichunk++){
524 int ifirst=0,ilast=0,icenter=0;
525 double slit_cen=0, slit_low=0, slit_up=0;
527 int is_valid_chunk = 1;
529 ifirst = ichunk*chunk_size;
530 ilast = (ichunk+1)*chunk_size;
531 icenter = (int)((ifirst+ilast)/2);
536 chunk_coadd( slit_tab, flux, qual, nlambda, nslit, ifirst, ilast, decode_bp, sky_mask);
539 FILE *coadd_file = NULL;
540 char coadd_name[256];
542 const char* filename = cpl_frame_get_filename( merge_frame);
544 sprintf( coadd_name,
"%s_%d_%d.dat",filename,ifirst,ilast);
545 coadd_file = fopen( coadd_name,
"w");
547 for(icoadd=0; icoadd<nslit; icoadd++){
548 fprintf(coadd_file,
"%d %f\n",icoadd,slit_tab[icoadd]);
554 double cenpos=0,
sigma=0,area=0, offset=0;
558 cpl_vector_fit_gaussian( gausspos, NULL, gaussval, NULL, CPL_FIT_ALL, &cenpos,
560 &area, &offset, NULL,
562 if( cpl_error_get_code() == CPL_ERROR_CONTINUE ){
565 if( cpl_error_get_code() == CPL_ERROR_NONE ){
569 if (slit_low < 0) slit_low = 0;
570 if (slit_up >= nslit) slit_up = nslit-1;
591 slit_tab[ymin], ymax, slit_tab[ymax]);
593 threshold = slit_tab[ymin]+(slit_tab[ymax]-slit_tab[ymin])*
599 while( yup < nslit && (slit_tab[yup] >=
threshold)) {
605 while( ylow > 0 && (slit_tab[ylow] >=
threshold)) {
615 if ( is_valid_chunk == 1){
616 chunk_center[ichunk-skip_chunk] = lambda_min+
lambda_step*icenter;
617 slit_center[ichunk-skip_chunk] = slit_min+
slit_step*slit_cen;
618 slit_lower[ichunk-skip_chunk] = slit_min+
slit_step*slit_low;
619 slit_upper[ichunk-skip_chunk] = slit_min+
slit_step*slit_up;
629 "To fit a polynomial of deg n (loc_obj_par->loc_deg_poly) "\
630 "you need at least n+1 points. This condition has failed "\
631 "after clipping out other chunks not matching predefined criteria. "\
632 "This can be due to the data (not well defined order trace) and/or "\
633 "to a too high degree (localize-deg-lambda) of the polynomial fit");
635 check( chunk_center_v = cpl_vector_wrap(
636 nb_chunk, chunk_center));
637 check( slit_center_v = cpl_vector_wrap(
638 nb_chunk, slit_center));
649 while ( (loc_degree < (nb_chunk-nbrej)) && iter <
niter
655 dispslit = cpl_vector_new( nb_chunk);
657 for(ichunk = 0; ichunk < nb_chunk; ichunk++){
662 lambda = chunk_center[ichunk];
664 check( slit_fit = cpl_polynomial_eval_1d( cen_poly,
667 slit_diff = slit_center[ichunk]-slit_fit;
668 xsh_msg_dbg_low(
"slit_center %f FIT %f, DIFF %d %f", slit_center[ichunk], slit_fit, ichunk, slit_diff);
669 check( cpl_vector_set( dispslit, ichunk, slit_diff));
672 check( sigma_med = cpl_vector_get_stdev( dispslit));
675 for(ichunk = 0; ichunk < nb_chunk; ichunk++){
676 if ( fabs(cpl_vector_get( dispslit, ichunk)) > (
kappa * sigma_med) ){
680 chunk_center[ichunk-nbrej] = chunk_center[ichunk];
681 slit_center[ichunk-nbrej] = slit_center[ichunk];
682 slit_lower[ichunk-nbrej] = slit_lower[ichunk];
683 slit_upper[ichunk-nbrej] = slit_upper[ichunk];
696 check( chunk_center_v = cpl_vector_wrap(
697 nb_chunk, chunk_center));
698 check( slit_center_v = cpl_vector_wrap(
699 nb_chunk, slit_center));
710 FILE *debug_file = NULL;
711 char debug_name[256];
713 const char* filename = cpl_frame_get_filename( merge_frame);
715 sprintf( debug_name,
"%s_points.dat",filename);
716 debug_file = fopen( debug_name,
"w");
718 fprintf( debug_file,
"#chunk_pos slit_low slit_cen slit_up\n");
720 for(idebug=0; idebug<nb_chunk; idebug++){
721 fprintf( debug_file,
"%f %f %f %f\n",chunk_center[idebug],
722 slit_lower[idebug], slit_center[idebug], slit_upper[idebug]);
728 check( slit_lower_v = cpl_vector_wrap(
729 nb_chunk, slit_lower));
730 check( slit_upper_v = cpl_vector_wrap(
731 nb_chunk, slit_upper));
734 check(loc_list->
cenpoly = cpl_polynomial_duplicate( cen_poly));
914 cpl_frame *skymask_frame,
920 cpl_frameset *result_frameset = NULL;
927 check( result_frameset = cpl_frameset_new());
930 cpl_frame * loc_frame = NULL;
931 cpl_frame *rec_frame = NULL;
933 sprintf( fname ,
"LOCALIZE_TABLE_%s_IFU_%s.fits",
SlitletName[slitlet],
938 check( rec_frame = cpl_frameset_get_frame( rec_frameset, i));
941 locobj_par,slitlimit_par, fname));
942 check( cpl_frameset_insert( result_frameset, loc_frame));
946 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
949 return result_frameset;
962 double avg_seeing, seeing_start, seeing_end;
965 const char* filename = NULL;
966 cpl_propertylist *header = NULL;
970 check( filename = cpl_frame_get_filename( frame));
971 check( header = cpl_propertylist_load( filename, 0));
975 avg_seeing = 0.5*(seeing_start+seeing_end);
978 pow(avg_airmass,-0.6)*pow(avg_seeing,-1.0/3.0));
983 pow(avg_airmass,0.6)*k;
988 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
1019 cpl_frame *skymask_frame,
int smooth_hsize,
1020 int nscales,
int HF_skip,
const char* resname,
double cut_sigma_low,
1021 double cut_sigma_up,
double cut_snr_low,
double cut_snr_up,
1022 double slit_min,
double slit_max,
int deg,
int box_hsize,
1026 cpl_frame *result = NULL;
1033 double *flux = NULL;
1034 double *errs = NULL;
1038 double *slit_vect_data = NULL;
1039 double *sliterr_vect_data = NULL;
1040 double *slit_pos_data = NULL;
1042 cpl_vector *slit_vect = NULL;
1043 cpl_vector *sliterr_vect = NULL;
1044 cpl_vector *slit_pos = NULL;
1045 cpl_vector *smooth_vect = NULL;
1046 double *spos_data = NULL;
1047 double *errpos_data = NULL;
1048 double *wpos_data = NULL;
1049 double *sigma_data = NULL;
1050 double *snr_data = NULL;
1051 int data_size=0, ndata_size=0;
1052 cpl_vector *spos_vect = NULL;
1053 cpl_vector *wpos_vect = NULL;
1054 cpl_vector *sigma_vect = NULL;
1055 cpl_vector *snr_vect = NULL;
1056 cpl_vector *sigma_sort_vect = NULL;
1057 cpl_vector *snr_sort_vect = NULL;
1058 double *sposg_data = NULL;
1059 double *wposg_data = NULL;
1060 cpl_matrix *decomp = NULL;
1062 cpl_table *table = NULL;
1063 char tablename[256];
1064 cpl_propertylist *header = NULL;
1065 double n05, n95, snr_05, snr_95, sigma_05, sigma_95;
1068 int *sky_mask = NULL;
1069 cpl_table *skymask_table = NULL;
1070 const char* skymask_name = NULL;
1098if ( skymask_frame != NULL){
1099 check( skymask_name = cpl_frame_get_filename( skymask_frame));
1114 while( (smin+jmin*sstep) < slit_min){
1117 while( (smin+jmax*sstep) > slit_max){
1122 if ( jmin > jmax || jmax <= 0 || jmin >= ssize){
1127 jmin, jmax, 0, ssize);
1134 XSH_MALLOC( sliterr_vect_data,
double, ssize);
1147 if ( skymask_frame != NULL){
1148 float *skymask_data = NULL;
1150 double fwhm =0.0, sky_min, sky_max;
1151 int isky_min, isky_max, imask;
1152 double width, resolution;
1157 check( skymask_data = cpl_table_get_data_float( skymask_table,
1159 check( nrow = cpl_table_get_nrow( skymask_table));
1161 for( irow=0; irow < nrow; irow++){
1164 fwhm = skymask_data[irow]/resolution;
1165 sky_min = skymask_data[irow]-fwhm;
1166 sky_max = skymask_data[irow]+fwhm;
1172 if ( isky_max >= wsize){
1175 for( imask=isky_min; imask <=isky_max; imask++){
1176 sky_mask[imask] = 1;
1181 FILE *mask_file = NULL;
1182 char mask_name[256];
1185 sprintf( mask_name,
"skymask.reg");
1186 mask_file = fopen( mask_name,
"w");
1188 fprintf( mask_file,
"# Region file format: DS9 version 4.1\n");
1189 fprintf( mask_file,
"global color=green dashlist=8 3 width=1 font=\"helvetica 10 normal\"\
1190 select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1\n");
1191 fprintf(mask_file,
"physical\n");
1193 for(idbg=0; idbg< wsize; idbg++){
1195 if (sky_mask[idbg] == 1){
1196 fprintf( mask_file,
"line(%d,%d,%d,%d)\n",idbg+1, ssize, idbg+1, 1);
1206 for (i = 0; i < wsize; i++) {
1211 double a = 0, b = 0, c = 0;
1212 double frac_rej = 0;
1214 cpl_matrix *covariance = NULL;
1221 for (j = jmin; j < jmax; j++) {
1222 double val = 0, err = 0;
1224 int ngood = 0, nbad = 0;
1227 start = i - box_hsize;
1228 end = i + box_hsize;
1237 for (k = start; k <= end; k++) {
1239 val += flux[k + j * wsize];
1247 val += flux[i+j*wsize];
1248 err = errs[i+j*wsize];
1251 val *= (double)(nbad+ngood)/(double)ngood;
1253 slit_pos_data[slit_vect_size] = j;
1254 sliterr_vect_data[slit_vect_size] = err;
1255 slit_vect_data[slit_vect_size] = val;
1261 frac_rej = 1-((double)slit_vect_size/(
double)ssize);
1262 if ( frac_rej < 0.5){
1263 check( slit_pos = cpl_vector_wrap( slit_vect_size, slit_pos_data));
1264 check( slit_vect = cpl_vector_wrap( slit_vect_size, slit_vect_data));
1265 check( sliterr_vect = cpl_vector_wrap( slit_vect_size, sliterr_vect_data));
1267 check( smooth_vect = cpl_vector_filter_median_create( slit_vect,
1272 cpl_vector_fit_gaussian( slit_pos, NULL, slit_vect, sliterr_vect,
1273 CPL_FIT_ALL, &slitcen, &
sigma, &area, &offset, &mse, NULL, &covariance);
1275 fit_err = sqrt(cpl_matrix_get(covariance,0,0))*sstep;
1276 good_fit = (cpl_error_get_code() == CPL_ERROR_NONE);
1288 slitcen = init_par[4];
1289 sigma = init_par[5];
1290 offset = a+b*slitcen+c*slitcen*slitcen;
1291 fit_err = fit_errs[4]*sstep;
1292 good_fit= (status == 0);
1301 snr = (height+offset)/offset;
1304 if ( (area > 0) && (slitcen > 0) && (slitcen < ssize)
1305 && (
sigma < ssize) && (snr > 0)){
1306 spos_data[data_size] = smin+slitcen*sstep;
1307 errpos_data[data_size] = fit_err;
1308 wpos_data[data_size] = wmin+i*wstep;
1309 sigma_data[data_size] =
sigma*sstep;
1310 snr_data[data_size] = snr;
1313 if ( (wpos_data[data_size] >= (1500-wstep)) && (wpos_data[data_size] <= (1500+wstep))){
1314 char test_name[256];
1315 FILE* test_file = NULL;
1319 sprintf( test_name,
"data_w%f_%s.dat", wpos_data[data_size],resname);
1321 test_file = fopen( test_name,
"w+");
1322 fprintf( test_file,
"# pos slit\n");
1324 for( itest=0; itest < slit_vect_size; itest++){
1325 fprintf( test_file,
"%f %f\n", cpl_vector_get( slit_pos, itest), cpl_vector_get( slit_vect, itest));
1330 sprintf( test_name,
"gauss_w%f_%s.dat", wpos_data[data_size],resname);
1333 test_file = fopen( test_name,
"w+");
1334 fprintf( test_file,
"# pos gauss offset x0=%f_sig=%f_area=%f_offset=%f\n", slitcen,
sigma, area, offset);
1336 for( dtest=0; dtest < slit_vect_size; dtest+=0.1){
1340 off = a+b*dtest+c*dtest*dtest;
1342 gauss = height*exp(-(z*z))+off;
1344 fprintf( test_file,
"%f %f %f\n", dtest, gauss, off);
1366 check( sigma_vect = cpl_vector_wrap( data_size, sigma_data));
1367 check( snr_vect = cpl_vector_wrap( data_size, snr_data));
1368 check( sigma_sort_vect = cpl_vector_duplicate( sigma_vect));
1369 check( snr_sort_vect = cpl_vector_duplicate( snr_vect));
1371 check( cpl_vector_sort( sigma_sort_vect, 1));
1372 check( cpl_vector_sort( snr_sort_vect, 1));
1374 n05 = (data_size-1)*cut_sigma_low;
1376 sigma_05 = cpl_vector_get( sigma_sort_vect, i);
1377 n05 = (data_size-1)*cut_snr_low;
1379 snr_05 = cpl_vector_get( snr_sort_vect, i);
1382 n95 = (data_size-1)*cut_sigma_up;
1384 sigma_95 = cpl_vector_get( sigma_sort_vect, i);
1385 n95 = (data_size-1)*cut_snr_up;
1387 snr_95 = cpl_vector_get( snr_sort_vect, i);
1390 for( i=0; i< data_size; i++){
1393 sigma = sigma_data[i];
1395 if ( sigma_05 <=
sigma &&
sigma <= sigma_95 && snr_05 <= snr && snr <=snr_95){
1396 wpos_data[ndata_size] = wpos_data[i];
1397 spos_data[ndata_size] = spos_data[i];
1398 errpos_data[ndata_size] = errpos_data[i];
1402 xsh_msg_dbg_low(
"Filtering by snr [%f,%f] and sigma [%f,%f] from %d lines to %d lines",
1403 sigma_05, sigma_95, snr_05, snr_95, data_size, ndata_size);
1407 FILE *test_file = NULL;
1409 char test_name[256];
1411 sprintf( test_name,
"cpl_gaussian_fit_%s.dat", resname);
1413 sprintf( test_name,
"gsl_gaussian_fit_%s.dat", resname);
1415 test_file = fopen( test_name,
"w");
1416 fprintf( test_file,
"# wavelength slit_fit fit_err sigma\n");
1418 for(itest=0; itest<ndata_size; itest++){
1419 fprintf( test_file,
"%f %f %f %f\n", wpos_data[itest], spos_data[itest], errpos_data[itest],
1426 check( wpos_vect = cpl_vector_new( wsize));
1427 check( spos_vect = cpl_vector_new( wsize));
1428 check( sposg_data = cpl_vector_get_data( spos_vect));
1429 check( wposg_data = cpl_vector_get_data( wpos_vect));
1432 for(i=0; i< wsize; i++){
1436 wave = wmin+i*wstep;
1437 wkeep = wpos_data[j];
1438 check( cpl_vector_set( wpos_vect, i, wave));
1439 if ( fabs(wave -wkeep) < 0.0000001){
1440 slit = spos_data[j];
1441 if (j < (ndata_size-1)){
1448 check( cpl_vector_set( spos_vect, i, slit));
1453 nb_scales = nscales-HF_skip;
1456 for( i=0; i< wsize; i++){
1458 for(j=0; j<nb_scales; j++){
1459 sposg_data[i] += cpl_matrix_get( decomp, j, i);
1464 check( table = cpl_table_new( wsize));
1470 for( i=0; i< wsize; i++){
1476 sprintf( tablename, resname);
1477 header = cpl_propertylist_new();
1478 check( cpl_table_save( table, header, NULL, tablename, CPL_IO_DEFAULT));
1482 CPL_FRAME_TYPE_TABLE,
1483 CPL_FRAME_GROUP_PRODUCT,
1484 CPL_FRAME_LEVEL_TEMPORARY));
1528 cpl_frame *skymask_frame,
1533 cpl_frameset *result_frameset = NULL;
1538 double cut_sigma_low;
1539 double cut_sigma_up;
1542 double slit_min = -6.0;
1543 double slit_max = 6.0;
1544 cpl_frame *frame = NULL;
1545 const char *frame_name = NULL;
1546 cpl_propertylist *header = NULL;
1547 int deg = 2, skymask=0;
1549 cpl_frame *mask_frame = NULL;
1556 nscales = locifu_par->
nscales;
1557 HF_skip = locifu_par->
HF_skip;
1566 mask_frame = skymask_frame;
1569 check( frame = cpl_frameset_get_frame( merge2d_frameset, 0));
1570 check( frame_name = cpl_frame_get_filename( frame));
1571 check( header = cpl_propertylist_load( frame_name, 0));
1575 check( frame = cpl_frameset_get_frame( merge2d_frameset, 2));
1576 check( frame_name = cpl_frame_get_filename( frame));
1577 check( header = cpl_propertylist_load( frame_name, 0));
1586 check( result_frameset = cpl_frameset_new());
1589 cpl_frame * loc_frame = NULL;
1590 cpl_frame *merge2d_frame = NULL;
1592 sprintf( fname ,
"%s_LOCIFU_%s_%s.fits", prefix,
SlitletName[slitlet],
1595 xsh_msg(
"Localizing IFU in [%f,%f] slitlet %s, frame '%s'", slit_min, slit_max,
1598 check( merge2d_frame = cpl_frameset_get_frame( merge2d_frameset, i));
1602 smooth_hsize, nscales,
1603 HF_skip, fname, cut_sigma_low, cut_sigma_up, cut_snr_low, cut_snr_up,
1604 slit_min, slit_max, deg, box_hsize,
instrument));
1606 check( cpl_frameset_insert( result_frameset, loc_frame));
1610 if ( cpl_error_get_code() != CPL_ERROR_NONE ) {
1614 return result_frameset;
static xsh_instrument * instrument
cpl_frame * xsh_localization_save(xsh_localization *list, const char *filename, xsh_instrument *instrument)
save a localization to a frame
void xsh_localization_free(xsh_localization **list)
free memory associated to a localization_list
xsh_localization * xsh_localization_create(void)
Create an empty localization list.
int xsh_spectrum_get_size_lambda(xsh_spectrum *s)
Get lambda axis size of spectrum.
double xsh_spectrum_get_lambda_min(xsh_spectrum *s)
Get minimum lambda of spectrum.
xsh_spectrum * xsh_spectrum_load(cpl_frame *s1d_frame)
Load a 1D spectrum structure.
double * xsh_spectrum_get_errs(xsh_spectrum *s)
Get errs of spectrum.
double xsh_spectrum_get_lambda_step(xsh_spectrum *s)
Get bin in lambda of spectrum.
int * xsh_spectrum_get_qual(xsh_spectrum *s)
Get qual of spectrum.
double * xsh_spectrum_get_flux(xsh_spectrum *s)
Get flux of spectrum.
void xsh_spectrum_free(xsh_spectrum **s)
free memory associated to an 1D spectrum
int xsh_spectrum_get_size_slit(xsh_spectrum *s)
Get slit axis ize of spectrum.
#define XSH_REGDEBUG(...)
#define XSH_ASSURE_NOT_ILLEGAL(cond)
#define xsh_error_reset()
#define XSH_ASSURE_NOT_ILLEGAL_MSG(cond, msg)
#define XSH_ASSURE_NOT_NULL(pointer)
const char * xsh_instrument_arm_tostring(xsh_instrument *i)
Get the string associated with an arm.
double xsh_resolution_get(xsh_instrument *instrument, double slit)
Get the resoltion.
XSH_ARM xsh_instrument_get_arm(xsh_instrument *i)
Get an arm on instrument structure.
double xsh_convert_seeing(cpl_frame *frame)
Convert seeing keywork in mu sigma.
static void chunk_coadd(double *data, double *flux, int *qual, int nx, int ny, int ifirst, int ilast, const int decode_bp, int *skymask)
cpl_frameset * xsh_localize_ifu(cpl_frameset *merge2d_frameset, cpl_frame *skymask_frame, xsh_localize_ifu_param *locifu_par, xsh_instrument *instrument, const char *prefix)
Localize center of object on a merge 2D IFU slitlet.
static void tab_minmax_get_index(double *data, int size, xsh_slit_limit_param *slit_limit_par, int *min, int *max)
static xsh_localization * xsh_localize_obj_auto(cpl_frame *rec_frame, cpl_frame *skymask_frame, xsh_instrument *instrument, xsh_localize_obj_param *loc_obj_par, xsh_slit_limit_param *slit_limit_par, const int decode_bp)
Build localization table frame from the rectified table frame.
cpl_frame * xsh_localize_ifu_slitlet(cpl_frame *merge2d_slitlet, cpl_frame *skymask_frame, int smooth_hsize, int nscales, int HF_skip, const char *resname, double cut_sigma_low, double cut_sigma_up, double cut_snr_low, double cut_snr_up, double slit_min, double slit_max, int deg, int box_hsize, xsh_instrument *instrument)
Localize center of object on a merge 2D IFU slitlet.
cpl_frame * xsh_localize_obj(cpl_frame *rec_frame, cpl_frame *skymask_frame, xsh_instrument *instrument, xsh_localize_obj_param *loc_obj_par, xsh_slit_limit_param *slitlimit_par, const char *fname)
Build the localization table.
cpl_frameset * xsh_localize_obj_ifu(cpl_frameset *rec_frameset, cpl_frame *skymask_frame, xsh_instrument *instrument, xsh_localize_obj_param *locobj_par, xsh_slit_limit_param *slitlimit_par)
static xsh_localization * xsh_localize_obj_manual(xsh_instrument *instrument, xsh_localize_obj_param *loc_obj_par)
cpl_frame * xsh_merge_ord(cpl_frame *sci_frame, xsh_instrument *instrument, int merge, const char *rec_prefix)
Merge orders of the rectified frame using merge parameters.
#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(...)
double xsh_pfits_get_rectify_space_max(cpl_propertylist *plist)
find out the rectify SPACE max
double xsh_pfits_get_rectify_space_min(cpl_propertylist *plist)
find out the rectify space min
double xsh_pfits_get_seeing_start(const cpl_propertylist *plist)
find out the TEL AMBI START value (Seeing)
double xsh_pfits_get_slit_width(const cpl_propertylist *plist, xsh_instrument *instrument)
find out the INS OPTIx NAME value (the width of the slit)
double xsh_pfits_get_airm_mean(const cpl_propertylist *plist)
find out the mean airmass value
double xsh_pfits_get_seeing_end(const cpl_propertylist *plist)
find out the TEL AMBI END value (Seeing)
void xsh_unwrap_vector(cpl_vector **v)
Unwrap a vector and set the pointer to NULL.
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.
int xsh_debug_level_get(void)
get debug level
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.
cpl_error_code xsh_sort_table_1(cpl_table *t, const char *column, cpl_boolean reverse)
Sort a table by one column.
double xsh_data_interpolate(double wav, int nrow, double *pw, double *pe)
Interpolate data points.
void xsh_gsl_init_gaussian_fit(cpl_vector *xpos_vect, cpl_vector *ypos_vect, double *init_par)
long xsh_round_double(double x)
Computes round(x)
void xsh_free_matrix(cpl_matrix **m)
Deallocate a matrix and set the pointer to NULL.
void xsh_gsl_fit_gaussian(cpl_vector *xpos_vect, cpl_vector *ypos_vect, int deg, double *params, double *errs, int *status)
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.
void xsh_add_temporary_file(const char *name)
Add temporary file to temprary files list.
cpl_polynomial * edguppoly
cpl_polynomial * edglopoly
double slitlow_edges_mask
enum localize_method method
cpl_propertylist * flux_header
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_OBJPOS_UNIT_SLIT
#define XSH_OBJPOS_COLNAME_SLIT
#define XSH_OBJPOS_UNIT_WAVELENGTH
#define XSH_OBJPOS_COLNAME_WAVELENGTH
static const char * SlitletName[]
#define LOCALIZE_METHOD_PRINT(method)
#define XSH_TABLE_NEW_COL(TABLE, NAME, UNIT, TYPE)
#define XSH_FREE(POINTER)
#define XSH_MALLOC(POINTER, TYPE, SIZE)
#define XSH_CALLOC(POINTER, TYPE, SIZE)
cpl_matrix * xsh_atrous(cpl_vector *spec, int nscales)
Do a wavelet decomposition using atrous from IDL.
#define XSH_TABLE_LOAD(TABLE, NAME)
#define XSH_TABLE_FREE(TABLE)
cpl_polynomial * xsh_polynomial_fit_1d_create(const cpl_vector *x_pos, const cpl_vector *values, int degree, double *mse)