62#include <gsl/gsl_sf_erf.h>
67#define SLIT_USEFUL_WINDOW_FACTOR 0.80
68#define FIT_FWHM_LIMIT 30
69#define OPT_EXTRACT_SLIT_SIZE 80
74#define REGDEBUG_PIXELSIZE 0
75#define REGDEBUG_INTEGRATE 0
82 int deg_poly,
int oversample,
83 cpl_polynomial** center, cpl_polynomial** height,
84 cpl_polynomial**
width, cpl_polynomial** offset);
87 cpl_polynomial* centerp, cpl_polynomial* heightp, cpl_polynomial* widthp,
88 cpl_polynomial* offsetp);
91 double *x_data,
double *y_data,
double kappa,
int niter,
double frac_min);
94 cpl_vector *ref_pos,
double step,
95 cpl_vector *ref_values, cpl_vector *err_values, cpl_vector *qual_values,
97 cpl_vector **spectrum_err, cpl_vector **spectrum_qual);
106 cpl_vector *init_pos,
107 cpl_vector *std_flux, cpl_vector *std_err, cpl_vector *std_qual,
108 cpl_vector *opt_flux, cpl_vector *opt_err, cpl_vector *opt_qual,
109 cpl_vector **res_pos,
110 cpl_vector **res_std_flux, cpl_vector **res_std_err, cpl_vector **res_std_qual,
111 cpl_vector **res_opt_flux, cpl_vector **res_opt_err, cpl_vector **res_opt_qual)
115 double lambda_min, lambda_max;
116 double binlambda_min, binlambda_max;
117 int mult_min, mult_max;
135 check( init_size = cpl_vector_get_size( init_pos));
137 check( lambda_min = cpl_vector_get( init_pos, 0));
138 check( lambda_max = cpl_vector_get( init_pos, init_size-1));
147 xsh_msg(
"lambda_min %f lambda_max %f TEST %f %f : step %f", lambda_min, lambda_max, binlambda_min, binlambda_max,
lambda_step);
149 res_size = mult_max-mult_min+1;
151 check( *res_pos = cpl_vector_new( res_size));
153 for( i=0; i< res_size; i++){
159 std_flux, std_err, std_qual, *res_pos, res_std_err, res_std_qual));
162 opt_flux, opt_err, opt_qual, *res_pos, res_opt_err, res_opt_qual));
165 if (cpl_error_get_code() != CPL_ERROR_NONE){
179 int method,
int chunk_ovsamp_size,
int deg_poly,
int oversample,
180 double *extract_x_data,
double *extract_y_data,
int abs_order,
183 cpl_polynomial *center_gauss_poly = NULL;
184 cpl_polynomial *height_gauss_poly = NULL;
185 cpl_polynomial *offset_gauss_poly = NULL;
186 cpl_polynomial *width_gauss_poly = NULL;
187 cpl_image *model_img = NULL;
188 int model_x, model_y, ix, iy;
189 double *model_data = NULL;
199 deg_poly, oversample,
200 ¢er_gauss_poly, &height_gauss_poly, &width_gauss_poly,
201 &offset_gauss_poly));
205 height_gauss_poly, width_gauss_poly, offset_gauss_poly));
210 FILE* poly_file = NULL;
211 int nx = cpl_image_get_size_x( model_img);
214 sprintf( poly_name,
"gaussian_center_poly_%d.dat", abs_order);
215 poly_file = fopen( poly_name,
"w");
217 for(i=0; i<
nx; i++){
218 fprintf( poly_file,
"%d %d\n", i+1,
219 (
int) cpl_polynomial_eval_1d( center_gauss_poly, i, NULL)+1);
223 sprintf( poly_name,
"gaussian_sigma_poly_%d.dat", abs_order);
224 poly_file = fopen( poly_name,
"w");
226 for(i=0; i<
nx; i++){
227 fprintf( poly_file,
"%d %d\n", i+1,
228 (
int) cpl_polynomial_eval_1d( width_gauss_poly, i, NULL)+1);
236 extract_x_data, extract_y_data,
kappa,
niter, frac_min));
240 model_x = cpl_image_get_size_x( model_img);
241 model_y = cpl_image_get_size_y( model_img);
242 model_data = cpl_image_get_data_double( model_img);
244 for( ix=0; ix < model_x; ix++){
247 for( iy=0; iy < model_y; iy++){
248 int ipos = iy*model_x+ix;
250 if ( model_data[ipos] < 0){
251 model_data[ipos] = 0;
253 psum += model_data[ipos];
256 for( iy=0; iy < model_y; iy++){
257 int ipos = iy*model_x+ix;
259 model_data[ipos] /= psum;
264 if (cpl_error_get_code() != CPL_ERROR_NONE){
280 cpl_frame *loc_frame,
int oversample,
int box_hsize,
281 int nlambdas,
int ny_extract,
double *extract_x_data,
282 double *extract_y_data,
int *ymin,
int *ymax)
286 cpl_image *slitmap = NULL;
287 float *slit_data = NULL;
289 int ny_extract_min =-1, ny_extract_max=-1, ny_extract_cen=-1;
291 double diff_s_min = 50.0;
302 check( slitmap = cpl_image_load( cpl_frame_get_filename( slitmap_frame),
303 CPL_TYPE_FLOAT, 0, 0));
306 check( slit_nx = cpl_image_get_size_x( slitmap));
307 check( slit_data = cpl_image_get_data_float( slitmap));
309 check( scen = cpl_polynomial_eval_1d( loc->
cenpoly, 0, NULL));
311 mid_lambda = 0.5*nlambdas;
313 for( u=1; u < ny_extract; u++){
318 x = (int) (extract_x_data[u*nlambdas+mid_lambda]+0.5);
319 y = (int) (extract_y_data[u*nlambdas+mid_lambda]+0.5);
320 s = slit_data[
x+
y*slit_nx];
324 if (diff < diff_s_min){
331 ref_ov += floor(0.5*(oversample-1));
333 ny_extract_min= ny_extract_cen -box_hsize-ref_ov;
334 ny_extract_max= ny_extract_cen +box_hsize+ref_ov;
336 if ( ny_extract_min < 0){
339 if ( ny_extract_max >= ny_extract){
340 ny_extract_max = ny_extract-1;
342 *ymin = ny_extract_min;
343 *ymax = ny_extract_max;
353 int nx,
int ny,
float pos_x,
354 float pos_y,
double *flux,
double *err,
int* qual,
int mode){
356 float f00=0.0, f10=0.0, f01=0.0, f11=0.0;
357 float e00=0.0, e10=0.0, e01=0.0, e11=0.0;
359 float fx=0.0, fy=0.0;
362 double A1, A2, A3, A4;
372 int pix=intx+inty*
nx;
373 int pix_plus_1=pix+1;
377 qual_comb = qualtab[pix];
379 if ( (intx +1) <
nx){
380 f10 = fluxtab[pix_plus_1];
381 e10 = errtab[pix_plus_1];
383 qual_comb |= qualtab[pix_plus_1];
385 if ( (inty +1) <
ny){
386 f01 = fluxtab[pix+
nx];
387 e01 = errtab[pix+
nx];
389 qual_comb |= qualtab[pix+
nx];
391 if ( ((intx +1) <
nx) && ((inty +1) <
ny)){
392 f11 = fluxtab[pix_plus_1+
nx];
393 e11 = errtab[pix_plus_1+
nx];
394 qual_comb |= qualtab[pix_plus_1+
nx];
398 ( f00 == 0.0 || f10 == 0.0 || f01 == 0 || f11 == 0)){
400 "(%d,%d)%f, (%d,%d)%f (%d,%d)%f, (%d,%d)%f", pos_x, pos_y,
401 intx, inty, f00, intx+1, inty, f10, intx, inty+1, f01,
402 intx+1, inty+1, f11);
410 *flux = f00*A1 + f10*A2 + f01*A3 + f11*A4;
412 *err = sqrt( A1*A1*e00*e00+A2*A2*e10*e10+A3*A3*e01*e01+A4*A4*e11*e11);
456 cpl_frame *slitmap_frame,
460 double *lambdastab,
double *slitstab,
int* sizetab,
xsh_instrument *instr)
462 cpl_image* wavemap = NULL;
463 cpl_image *slitmap = NULL;
465 float *wavemap_data = NULL;
466 float *slitmap_data = NULL;
467 int i,
nx=0,
ny=0, qual_val=0;
468 double lambda=0.0, lambda_next=0.0, lambda_old=0, err=0;
469 double lambda_sf_max=0;
471 float y_ovs=0,
x=0,
y=0;
475 double lambda_min=0, lambda_max=0;
476 const char* wave_filename = NULL;
477 const char* slitmap_name = NULL;
487 check( wave_filename = cpl_frame_get_filename( wavemap_frame));
488 check( slitmap_name = cpl_frame_get_filename( slitmap_frame));
492 check( wavemap = cpl_image_load( wave_filename,
493 CPL_TYPE_FLOAT, 0, 0));
494 check( slitmap = cpl_image_load( slitmap_name,
495 CPL_TYPE_FLOAT, 0, 0));
497 check(
nx = cpl_image_get_size_x( wavemap));
498 check(
ny = cpl_image_get_size_y( wavemap));
501 check( wavemap_data = cpl_image_get_data_float( wavemap));
502 check( slitmap_data = cpl_image_get_data_float( slitmap));
505 spectralformat,
order));
507 spectralformat,
order));
509 xsh_msg_dbg_high(
"SPECTRAL FORMAT lambda min %f max %f", lambda_min, lambda_sf_max);
511 lambda_max = lambda_sf_max;
520 while( !((lambda >= lambda_min) && (lambda_next > lambda)) ){
534 nx,
ny, start_x_next-1, ycen, &lambda_next, &err, &qual_val,
WAVEMAP_MODE));
536 y_ovs=ycen*oversample+1;
544 while( !((lambda >= lambda_min) && (lambda_next > lambda)) ){
558 nx,
ny, start_x_next-1, ycen-2, &lambda_next, &err, &qual_val,
WAVEMAP_MODE));
560 y_ovs=ycen*oversample-1;
569 xsh_msg_dbg_high(
"first X,Y %f,%f lambda %f in [%f,%f]",
x,
y, lambda, lambda_min, lambda_max);
573 while( (lambda >= lambda_min) && (lambda > lambda_old) &&
574 (lambda <= lambda_max) &&
575 ( y_ovs <= (
endy * oversample)) ){
579 lambdastab[
size] = lambda;
584 y = (float) (y_ovs) / (float) oversample;
595 while( (lambda >= lambda_min) &&
596 (lambda <= lambda_max) &&
597 ( y_ovs >= (
starty * oversample)) ){
601 lambdastab[
size] = lambda;
606 y = (float) (y_ovs) / (float) oversample;
621 for (i=0; i<
size; i++){
673 check(
size = cpl_vector_get_size( vector));
675 for( i=0; i<
size; i++){
678 check( val = cpl_polynomial_eval_1d( poly,
679 (
double)i/oversample+shift, NULL));
681 check( val = cpl_polynomial_eval_1d( poly,
682 (
double)(
size-1-i)/oversample+shift, NULL));
685 check( val = cpl_polynomial_eval_1d( poly,
686 (
double)i/oversample+shift, NULL));
688 check( flux = cpl_vector_get( vector, i));
689 check( cpl_vector_set( vector, i, flux/val));
721 int deg_poly,
int oversample,
722 cpl_polynomial** center, cpl_polynomial** height,
723 cpl_polynomial**
width, cpl_polynomial** offset)
726 int nx,
ny, nb_chunk, i;
727 cpl_vector *center_gauss = NULL;
728 cpl_vector *height_gauss = NULL;
729 cpl_vector *width_gauss = NULL;
730 cpl_vector *offset_gauss = NULL;
731 cpl_vector *xpos_gauss = NULL;
732 cpl_vector *chunk_vector = NULL;
733 cpl_vector *chunk_pos_vector = NULL;
734 cpl_vector *median_vect = NULL;
736 double *center_gauss_data = NULL;
737 double *height_gauss_data = NULL;
738 double *width_gauss_data = NULL;
739 double *offset_gauss_data = NULL;
740 double *xpos_gauss_data = NULL;
741 double *median_data = NULL;
753 check(
nx = cpl_image_get_size_x( img));
754 check(
ny = cpl_image_get_size_y( img));
755 check(
data = cpl_image_get_data_double( img));
757 if ( (chunk_size >=
nx) || (chunk_size == 0)){
761 nb_chunk =
nx / chunk_size;
763 XSH_MALLOC( center_gauss_data,
double, nb_chunk*2);
764 XSH_MALLOC( height_gauss_data,
double, nb_chunk*2);
765 XSH_MALLOC( width_gauss_data,
double, nb_chunk*2);
766 XSH_MALLOC( offset_gauss_data,
double, nb_chunk*2);
767 XSH_MALLOC( xpos_gauss_data,
double, nb_chunk*2);
770 check( chunk_vector = cpl_vector_new(
ny));
771 check( chunk_pos_vector = cpl_vector_new(
ny));
776 for( i=0; i< nb_chunk; i++){
777 double x0,
sigma, area, offset_val, height_val, fwhm;
783 ilast = ideb+chunk_size;
785 for( j=0; j<
ny; j++){
788 for( l=ideb; l< ilast; l++){
790 median_data[l-ideb] =
data[j*
nx+l];
792 check( median_vect = cpl_vector_wrap( val_nb, median_data));
793 check( med = cpl_vector_get_median( median_vect));
794 check( cpl_vector_set( chunk_vector, j, med));
795 check( cpl_vector_set( chunk_pos_vector, j, j));
797#if REGDEBUG_OPTEXTRACT
801 FILE* regdebug = NULL;
804 sprintf(filename,
"gaussian_points_%d.dat",i);
805 regdebug = fopen(filename,
"w");
806 for( j=0; j<
ny; j++){
809 pos = cpl_vector_get( chunk_pos_vector,j);
810 val = cpl_vector_get( chunk_vector,j);
812 fprintf(regdebug,
"%f %f\n", pos, val);
818 cpl_vector_fit_gaussian( chunk_pos_vector, NULL, chunk_vector, NULL,
819 CPL_FIT_ALL, &x0, &
sigma, &area, &offset_val, NULL, NULL, NULL);
821 if ( cpl_error_get_code() == CPL_ERROR_NONE){
822 height_val = area / sqrt(2*CPL_MATH_PI*
sigma*
sigma);
823 fwhm = CPL_MATH_FWHM_SIG*
sigma;
825 center_gauss_data[nbfit] = x0;
826 height_gauss_data[nbfit] = height_val;
827 width_gauss_data[nbfit] =
sigma;
828 xpos_gauss_data[nbfit] = ideb;
829 offset_gauss_data[nbfit] = offset_val;
831 center_gauss_data[nbfit] = x0;
832 height_gauss_data[nbfit] = height_val;
833 width_gauss_data[nbfit] =
sigma;
834 xpos_gauss_data[nbfit] = ilast;
835 offset_gauss_data[nbfit] = offset_val;
839 xsh_msg(
"WARNING chunk %d-%d so big FWHM %f expected < %d",
844 xsh_msg(
"WARNING chunk %d-%d don't converge with gaussian fit",
852 xsh_msg(
"WARNING nbfit == 0 force poly degree to 0");
855 xpos_gauss_data[0] = 0;
856 center_gauss_data[0] =
ny/2.0;
857 height_gauss_data[0] = 1;
858 width_gauss_data[0] =
ny;
859 offset_gauss_data[0] = 0.0;
861 else if ( nbfit <= deg_poly){
862 xsh_msg(
"WARNING %d (nbfit) < %d (poly degree) force poly degree to %d",
863 nbfit, deg_poly, nbfit-1);
867 check(xpos_gauss = cpl_vector_wrap( nbfit, xpos_gauss_data));
868 check( center_gauss = cpl_vector_wrap( nbfit, center_gauss_data));
869 check( height_gauss = cpl_vector_wrap( nbfit, height_gauss_data));
870 check( width_gauss = cpl_vector_wrap( nbfit, width_gauss_data));
871 check( offset_gauss = cpl_vector_wrap( nbfit, offset_gauss_data));
874 center_gauss, deg_poly, NULL));
876 height_gauss, deg_poly, NULL));
878 width_gauss, deg_poly, NULL));
880 offset_gauss, deg_poly, NULL));
883 if ( cpl_error_get_code() != CPL_ERROR_NONE){
908 double *x_data,
double *y_data,
double kappa,
int niter,
double frac_min)
910 cpl_image *result = NULL;
914 double *src_data = NULL;
917 cpl_vector *pos_vect = NULL;
918 cpl_vector *line_vect = NULL;
920 cpl_polynomial *fit = NULL;
924 check(
nx = cpl_image_get_size_x( src_img));
925 check(
ny = cpl_image_get_size_y( src_img));
926 check( result = cpl_image_new(
nx,
ny, CPL_TYPE_DOUBLE));
927 check(
data = cpl_image_get_data_double( result));
928 check( src_data = cpl_image_get_data_double( src_img));
931 double before=cpl_test_get_walltime();
943 diffx = x_data[pix]-(int)x_data[pix];
945 diffy = y_data[pix]-(int)y_data[pix];
949 line[
size] = src_data[pix];
954 check( pos_vect = cpl_vector_wrap(
size, pos));
955 check( line_vect = cpl_vector_wrap(
size, line));
958 frac_min, 3, &fit, &chisq, &flags));
961 check( val = cpl_polynomial_eval_1d( fit, i, NULL));
962 data[i+j_nx] = fabs(val);
969 double after=cpl_test_get_walltime();
971 xsh_msg(
"Time spent %g %g %g",before,after,after-before);
974 if ( cpl_error_get_code() != CPL_ERROR_NONE){
986 cpl_polynomial* centerp, cpl_polynomial* heightp, cpl_polynomial* widthp,
987 cpl_polynomial* offsetp)
989 cpl_image *result = NULL;
1001 check(
nx = cpl_image_get_size_x( src));
1002 check(
ny = cpl_image_get_size_y( src));
1003 check( result = cpl_image_new(
nx,
ny, CPL_TYPE_DOUBLE));
1004 check(
data = cpl_image_get_data_double( result));
1006 for(i=0; i<
nx; i++){
1007 double x0, height,
width, offset, z;
1011 check( x0 = cpl_polynomial_eval_1d( centerp, i, NULL));
1012 check( height = cpl_polynomial_eval_1d( heightp, i, NULL));
1013 check(
width = cpl_polynomial_eval_1d( widthp, i, NULL));
1014 check( offset = cpl_polynomial_eval_1d( offsetp, i, NULL));
1017 double inv_fct=1.0/fct;
1021 for(j=0; j<
ny; j++){
1025 data[i+j*
nx] = height*exp(-(z*z))+offset;
1036 if ( cpl_error_get_code() != CPL_ERROR_NONE){
1061 cpl_image *err_img, cpl_image *qual_img,
1062 cpl_vector **err_v, cpl_vector **qual_v)
1064 cpl_vector *result = NULL;
1066 double *
data = NULL;
1081 check (
nx = cpl_image_get_size_x( img));
1082 check (
ny = cpl_image_get_size_y( img));
1083 check(
data = cpl_image_get_data_double( img));
1084 check( err = cpl_image_get_data_double( err_img));
1085 check( qual = cpl_image_get_data_int( qual_img));
1088 check( result = cpl_vector_new(
nx));
1089 check( *err_v = cpl_vector_new(
nx));
1090 check( *qual_v = cpl_vector_new(
nx));
1091 pres=cpl_vector_get_data(result);
1092 perr=cpl_vector_get_data(*err_v);
1093 pqua=cpl_vector_get_data(*qual_v);
1095 for( i=0; i<
nx; i++){
1097 double pix_val = 0.0, err_val = 0.0;
1100 for( j=0; j<
ny; j++){
1102 pix_val +=
data[pix];
1103 err_val += err[pix]*err[pix];
1104 qual_val |= qual[pix];
1108 perr[i]=sqrt(err_val);
1109 pqua[i]=(double)qual_val;
1114 if ( cpl_error_get_code() != CPL_ERROR_NONE){
1142 cpl_vector *s1D, cpl_vector *err_s1D, cpl_image **err_2dby1D_img)
1144 cpl_image *result = NULL;
1146 double *
data = NULL;
1148 double *data_res= NULL;
1149 double *err_res = NULL;
1158 check(
size = cpl_vector_get_size( s1D));
1159 check(
nx = cpl_image_get_size_x( image));
1160 check(
ny = cpl_image_get_size_y( image));
1163 check(
data = cpl_image_get_data_double( image));
1164 check( err = cpl_image_get_data_double( err_img));
1165 check( result = cpl_image_new(
nx,
ny, CPL_TYPE_DOUBLE));
1166 check( *err_2dby1D_img = cpl_image_new(
nx,
ny, CPL_TYPE_DOUBLE));
1167 check( data_res = cpl_image_get_data_double( result));
1168 check( err_res = cpl_image_get_data_double( *err_2dby1D_img));
1170 for(i=0; i<
nx; i++){
1171 double d, d2, e2, d1, e1;
1173 check( d2 = cpl_vector_get( s1D, i));
1174 check( e2 = cpl_vector_get( err_s1D, i));
1177 if (i > 0 && i < (
nx-1)){
1178 d2 = 0.5*(cpl_vector_get( s1D, i-1)+cpl_vector_get( s1D, i+1));
1179 e2 = 0.5*sqrt(cpl_vector_get( err_s1D, i-1)+cpl_vector_get( err_s1D, i+1));
1182 for( j=0; j <
ny; j++){
1189 err_res[pix] = d * sqrt( (e1*e1)/(d1*d1) + (e2*e2)/(d2*d2) );
1194 if ( cpl_error_get_code() != CPL_ERROR_NONE){
1232 cpl_image *model_img,
const int decode_bp,
1233 cpl_image** corr_img, cpl_vector **err_v, cpl_vector **qual_v)
1235 int nb_rejected =-1, iter=1, clip_niter = 1, nbtotal_rejected=0;
1236 double clip_kappa = 3, clip_frac=0, clip_frac_rej =0.4;
1237 int *rejected = NULL;
1239 cpl_vector *median_vect = NULL;
1241 cpl_vector *result = NULL;
1243 double *
data = NULL;
1244 double *errs = NULL;
1245 int *qual_data = NULL;
1246 cpl_image *corr_image = NULL;
1247 double *corr_data = NULL;
1248 double *model_data = NULL;
1266 check (
nx = cpl_image_get_size_x( img));
1267 check (
ny = cpl_image_get_size_y( img));
1268 check(
data = cpl_image_get_data_double( img));
1269 check( errs = cpl_image_get_data_double( errs_img));
1270 check( qual_data = cpl_image_get_data_int( qual_img));
1272 check( corr_image = cpl_image_new(
nx,
ny, CPL_TYPE_DOUBLE));
1273 check( corr_data = cpl_image_get_data_double( corr_image));
1274 check( model_data = cpl_image_get_data_double( model_img));
1277 check( result = cpl_vector_new(
nx));
1278 check( *err_v = cpl_vector_new(
nx));
1279 check( *qual_v = cpl_vector_new(
nx));
1285 for( i=0; i<
nx; i++){
1287 double pix_val = 0.0;
1290 double f_denom = 0.0;
1291 double sum_MP = 0.0;
1298 double sum, sum_err;
1301 for( j=0; j<
ny; j++){
1312 for( j=0; j<
ny; j++){
1314 double flux = 0.0, err_val = 0.0;
1315 double model_flux = 0.0;
1318 err_val = errs[i+j*
nx];
1319 qual = qual_data[i+j*
nx];
1320 model_flux = model_data[i+j*
nx];
1322 if ( ((qual & decode_bp ) == 0) && model_flux != 0){
1324 ab[count] = flux/model_flux;
1332 sum_err += err_val*err_val;
1336 clip_frac = nbtotal_rejected/(double)
ny;
1340 check( median_vect = cpl_vector_wrap( count, ab));
1341 check( med_flux = cpl_vector_get_median( median_vect));
1346 sum_err = sqrt( sum_err);
1353 while( iter <= clip_niter && nb_rejected != 0 && count != 0
1354 && clip_frac <= clip_frac_rej){
1362 for( j=0; j<
ny; j++){
1364 double model_flux = 0.0;
1367 model_flux = model_data[i+j*
nx];
1371 if ( rejected[j] == 1){
1372 diff = flux-med_flux*model_flux;
1377 check( median_vect = cpl_vector_wrap( nbdiff, ab));
1378 check(
sigma = cpl_vector_get_stdev( median_vect));
1383 for( j=0; j<
ny; j++){
1385 double model_flux = 0.0;
1388 model_flux = model_data[i+j*
nx];
1390 diff = flux-med_flux*model_flux;
1392 if ( rejected[j] == 1 && fabs( diff) > clip_kappa*
sigma){
1398 nbtotal_rejected += nb_rejected;
1402 for( j=0; j<
ny; j++){
1404 double model_flux = 0.0;
1407 model_flux = model_data[i+j*
nx];
1409 if ( rejected[j] == 1 && model_flux != 0){
1410 ab[count] = flux/model_flux;
1415 check( median_vect = cpl_vector_wrap( count, ab));
1416 check( med_flux = cpl_vector_get_median( median_vect));
1419 clip_frac = nbtotal_rejected/(double)
ny;
1425 for( j=0; j<
ny; j++){
1428 qual = qual_data[i+j*
nx];
1429 if ( ( (qual & decode_bp) == 0 ) && rejected[j] == 1 ){
1433 corr_data[i+j*
nx] = 0;
1438 if ( clip_frac < 1){
1439 for( j=0; j<
ny; j++){
1443 p = model_data[i+j*
nx];
1445 variance = errs[i+j*
nx]*errs[i+j*
nx];
1447 sum_MP += rejected[j]*p;
1449 f_err += rejected[j]*p/variance;
1451 f_num += (double)rejected[j]*p*corr_data[i+j*
nx]/variance;
1452 f_denom += (double)rejected[j]*p2/variance;
1454 pix_val = f_num / f_denom;
1455 err_val = sqrt( sum_MP / f_denom);
1461 check( cpl_vector_set( result, i, pix_val));
1462 check( cpl_vector_set( *err_v, i, err_val));
1463 check( cpl_vector_set( *qual_v, i, (
double)qual_val));
1469 char std_spectrum_name[256];
1470 FILE* std_spectrum_file = NULL;
1472 sprintf( std_spectrum_name,
"n.dat");
1473 std_spectrum_file = fopen( std_spectrum_name,
"w");
1475 fprintf( std_spectrum_file,
"#index n\n");
1477 for(i=0; i<
nx; i++){
1478 fprintf(std_spectrum_file,
"%d %f\n", i,
n[i]);
1480 fclose( std_spectrum_file);
1482 sprintf( std_spectrum_name,
"rejfrac.dat");
1483 std_spectrum_file = fopen( std_spectrum_name,
"w");
1485 fprintf( std_spectrum_file,
"#index rejfrac\n");
1487 for(i=0; i<
nx; i++){
1488 fprintf(std_spectrum_file,
"%d %f\n", i, rej[i]);
1490 fclose( std_spectrum_file);
1493 *corr_img = corr_image;
1496 if ( cpl_error_get_code() != CPL_ERROR_NONE){
1536 int oversample,
int absorder,
1537 cpl_vector *ref_pos,
double step,
1538 cpl_vector *ref_values, cpl_vector *err_values, cpl_vector *qual_values,
1539 cpl_vector *new_pos,
1540 cpl_vector **spectrum_err, cpl_vector **spectrum_qual)
1543 int new_pos_size, ref_pos_size, pixel_pos_size;
1545 cpl_vector *result=NULL;
1546 cpl_vector *pixel_pos_vect = NULL, *pixel_size_vect = NULL;
1547 cpl_polynomial *pixel_size_poly = NULL;
1549 double lambda_bin_factor =0.0;
1559 check( new_pos_size = cpl_vector_get_size( new_pos));
1560 check( ref_pos_size = cpl_vector_get_size( ref_pos));
1561 check( result = cpl_vector_new( new_pos_size));
1563 check( *spectrum_err = cpl_vector_new( new_pos_size));
1564 check( *spectrum_qual = cpl_vector_new( new_pos_size));
1567 pixel_pos_size = ref_pos_size-2*oversample;
1568 check( pixel_pos_vect = cpl_vector_new( pixel_pos_size));
1569 check( pixel_size_vect = cpl_vector_new( pixel_pos_size));
1571 for( j=oversample; j< ref_pos_size-oversample; j++){
1573 double sizeAB, sizeBC,
size;
1575 check( xA = cpl_vector_get( ref_pos, j-oversample));
1576 check( xB = cpl_vector_get( ref_pos, j));
1577 check( xC = cpl_vector_get( ref_pos, j+oversample));
1580 size = (sizeAB+sizeBC)/2.0;
1581 check( cpl_vector_set( pixel_pos_vect, j-oversample, xB));
1582 check( cpl_vector_set( pixel_size_vect, j-oversample,
size));
1586 pixel_size_vect, 1, NULL));
1591 for( i=0; i< new_pos_size; i++){
1592 double xA=0, xB=0, xC=0;
1593 double deltaA1=0, deltaA2=0;
1596 double size_min=0, pos_min=0, frac_min=0, sigy_min=0, flux_min=0;
1597 double size_max=0, pos_max=0, frac_max=0, sigy_max=0, flux_max=0;
1599 double sig_min=0, sig_max=0;
1600 int qual_min=0, qual_max=0, qual=0;
1603 double y=0, ymin=0, ymax=0;
1605 double xmin=0, xmax=0;
1607 double x=0, sig_y = 26;
1608 int j_start=0, j_end=0, k=0;
1611 double flux=0, err=0, pixel_size_comp=0;
1614 check(
x= cpl_vector_get( new_pos, i));
1617 check( xA = cpl_vector_get( ref_pos, j-1));
1618 check( xB = cpl_vector_get( ref_pos, j));
1619 deltaA2 = (xB-xA)/2.0;
1622 check( xC = cpl_vector_get( ref_pos, j-2));
1623 deltaA1 = (xA-xC)/2.0;
1629 while( !(xmin >= (xA-deltaA1) && xmin <= (xA+deltaA2)) ){
1631 check( xA = cpl_vector_get( ref_pos, j-1));
1632 check( xB = cpl_vector_get( ref_pos, j));
1633 check( xC = cpl_vector_get( ref_pos, j-2));
1634 deltaA1 = (xA-xC)/2.0;
1635 deltaA2 = (xB-xA)/2.0;
1639 size_min = deltaA1+deltaA2;
1640 pos_min = xA+deltaA2;
1641 frac_min = (pos_min-xmin)/size_min;
1642 check( ymin = cpl_vector_get( ref_values, j_start));
1643 check( sigy_min = cpl_vector_get( err_values, j_start));
1644 check( qual_min = cpl_vector_get( qual_values, j_start));
1646 flux_min = frac_min*ymin;
1647 sig_min = frac_min*frac_min*sigy_min*sigy_min;
1649 while( !(xmax >= (xA-deltaA1) && xmax <= (xA+deltaA2)) ){
1651 check( xA = cpl_vector_get( ref_pos, j-1));
1652 check( xC = cpl_vector_get( ref_pos, j-2));
1654 deltaA1 = (xA-xC)/2.0;
1656 if ( j < ref_pos_size){
1657 check( xB = cpl_vector_get( ref_pos, j));
1658 deltaA2 = (xB-xA)/2.0;
1668 if ( j_start == j_end){
1671 frac_max = (xmax-xmin)/size_min;
1674 size_max = deltaA1+deltaA2;
1675 pos_max = xA-deltaA1;
1676 frac_max = (xmax-pos_max)/size_max;
1678 check( ymax = cpl_vector_get( ref_values, j_end));
1679 check( sigy_max = cpl_vector_get( err_values, j_end));
1680 check( qual_max = cpl_vector_get( qual_values, j_end));
1682 flux_max = frac_max*ymax;
1683 sig_max = frac_max*frac_max*sigy_max*sigy_max;
1685 xsh_msg_dbg_high(
"xmin %f pos_min %f diff %f size %f frac*size %f", xmin , pos_min, pos_min-xmin, size_min, frac_min*size_min);
1686 xsh_msg_dbg_high(
"xmax %f pos_max %f diff %f size %f frac*size %f", xmax , pos_max, xmax-pos_max, size_max, frac_max*size_max);
1688 nb_x = j_end-j_start-1;
1690 nb_x += frac_min+frac_max;
1693 nb_x = frac_min+frac_max;;
1698 flux = flux_min+flux_max;
1699 err = sig_min+sig_max;
1701 xsh_msg_dbg_high(
"nb_x %f size %f %f cont_min %f max_cont %f", nb_x, size_min, size_max, frac_min, frac_max);
1703 for( k=j_start+1; k <= j_end-1; k++){
1704 check(
y = cpl_vector_get( ref_values, k));
1705 check( sig_y = cpl_vector_get( err_values, k));
1713 check( pixel_size_comp = cpl_polynomial_eval_1d( pixel_size_poly,
x, NULL));
1715 lambda_bin_factor = 1.0/(
step*
biny);
1717 flux *= pixel_size_comp*lambda_bin_factor;
1718 err *= pixel_size_comp*lambda_bin_factor;
1720 check( cpl_vector_set( result, i, flux));
1721 check( cpl_vector_set( *spectrum_err, i, err));
1722 check( cpl_vector_set( *spectrum_qual, i, qual));
1725#if REGDEBUG_PIXELSIZE
1727 FILE* debug_file = NULL;
1728 char debug_name[256];
1730 sprintf( debug_name,
"pixel_size_%d.dat", absorder);
1731 xsh_msg(
"Create %s", debug_name);
1733 debug_file = fopen( debug_name,
"w");
1735 fprintf( debug_file,
"# wavelength size fit\n");
1737 for( j=0; j< pixel_pos_size; j++){
1738 double pos,
size, pol;
1740 check( pos = cpl_vector_get( pixel_pos_vect, j));
1741 check(
size = cpl_vector_get( pixel_size_vect, j));
1742 check( pol = cpl_polynomial_eval_1d( pixel_size_poly, pos, NULL));
1743 fprintf( debug_file ,
"%f %f %f\n", pos,
size, pol);
1745 fclose( debug_file);
1749#if REGDEBUG_INTEGRATE
1751 FILE* debug_file = NULL;
1752 char debug_name[256];
1754 sprintf( debug_name,
"integrate_flux_%d.dat", absorder);
1755 xsh_msg(
"Create %s", debug_name);
1757 debug_file = fopen( debug_name,
"w");
1759 fprintf( debug_file,
"# wavelength flux err qual\n");
1761 for( j=0; j< new_pos_size; j++){
1762 double xA, yA, sig_yA, qual_yA;
1764 check( xA = cpl_vector_get( new_pos, j));
1765 check( yA = cpl_vector_get( result, j));
1766 check( sig_yA = cpl_vector_get( *spectrum_err, j));
1767 check( qual_yA = cpl_vector_get( *spectrum_qual, j));
1768 fprintf( debug_file ,
"%f %f %f %f\n", xA, yA, sig_yA, qual_yA);
1771 fclose( debug_file);
1780 if( cpl_error_get_code() != CPL_ERROR_NONE){
1833 cpl_frame *wavesol_frame, cpl_frame *model_frame, cpl_frame *wavemap_frame,
1834 cpl_frame *slitmap_frame, cpl_frame *loc_frame,
1835 cpl_frame *spectralformat_frame, cpl_frame *masterflat_frame,
1837 const char* rec_prefix, cpl_frame** orderext1d_frame,
1838 cpl_frame** orderoxt1d_frame, cpl_frame** orderoxt1d_eso_frame,
1839 cpl_frame** qc_subextract_frame, cpl_frame** qc_s2ddiv1d_frame,
1840 cpl_frame** qc_model_frame, cpl_frame** qc_weight_frame)
1846 model_frame, wavemap_frame, slitmap_frame, loc_frame,spectralformat_frame,
1847 masterflat_frame,
instrument, opt_extract_par, 0, 100, rec_prefix,
1848 orderext1d_frame, orderoxt1d_frame, orderoxt1d_eso_frame, qc_subextract_frame,
1849 qc_s2ddiv1d_frame, qc_model_frame, qc_weight_frame));
1900 cpl_frame *orderlist_frame,
1901 cpl_frame *wavesol_frame,
1902 cpl_frame *model_frame,
1903 cpl_frame *wavemap_frame,
1904 cpl_frame *slitmap_frame,
1905 cpl_frame *loc_frame,
1906 cpl_frame *spectralformat_frame,
1907 cpl_frame *masterflat_frame,
1910 int min_index,
int max_index,
1911 const char* rec_prefix,
1912 cpl_frame** orderext1d_frame,
1913 cpl_frame** orderoxt1d_frame,
1914 cpl_frame** res_frame_ext,
1915 cpl_frame** qc_subextract_frame,
1916 cpl_frame** qc_s2ddiv1d_frame,
1917 cpl_frame** qc_model_frame,
1918 cpl_frame** qc_weight_frame)
1922 cpl_image *blaze_img = NULL;
1923 float *sci_pre_data = NULL;
1924 float *sci_pre_errs = NULL;
1925 int *sci_pre_qual = NULL;
1930 double *slits_cen = NULL;
1931 double *lambdas = NULL;
1932 double *pos_cen_x = NULL;
1933 double *pos_cen_y = NULL;
1935 cpl_vector *extract_lambda_vect = NULL;
1936 cpl_vector *result_lambda_vect = NULL;
1937 int result_lambda_vect_size;
1939 cpl_vector *div_flux_vect = NULL;
1940 cpl_vector *div_err_vect = NULL;
1942 cpl_vector *std_flux_vect = NULL;
1943 cpl_vector *std_err_vect = NULL;
1944 cpl_vector *std_qual_vect = NULL;
1946 cpl_vector *opt_flux_vect = NULL;
1947 cpl_vector *opt_err_vect = NULL;
1948 cpl_vector *opt_qual_vect = NULL;
1950 cpl_image *extract_img = NULL;
1951 cpl_image *extract_errs_img = NULL;
1952 cpl_image *extract_qual_img = NULL;
1954 cpl_image *x_img = NULL;
1955 cpl_image *y_img = NULL;
1957 cpl_image *sub_extract_img = NULL;
1958 cpl_image *sub_extract_errs_img = NULL;
1959 cpl_image *sub_extract_qual_img = NULL;
1961 cpl_image *sub_x_img = NULL;
1962 cpl_image *sub_y_img = NULL;
1964 cpl_image *s2Dby1D_img = NULL;
1965 cpl_image *s2Dby1D_err_img = NULL;
1966 cpl_image *weight_img = NULL;
1967 double *extract_data = NULL;
1968 double *extract_errs = NULL;
1969 int *extract_qual = NULL;
1970 double *extract_x_data = NULL;
1971 double *extract_y_data = NULL;
1973 int nx_extract, ny_extract;
1976 int chunk_ovsamp_size;
1977 int extract_slit_hsize=0;
1979 cpl_vector* std_extract_vect = NULL;
1980 cpl_vector* std_err_extract_vect = NULL;
1981 cpl_vector* std_qual_extract_vect = NULL;
1983 cpl_vector *opt_extract_vect = NULL;
1984 cpl_vector *opt_err_extract_vect = NULL;
1985 cpl_vector *opt_qual_extract_vect = NULL;
1994 char filename_drl[256];
1996 cpl_image *model_img = NULL;
1997 int rec_min_index, rec_max_index;
1998 double slit_down, slit_up;
1999 double lambda_min, lambda_max;
2003 double square_oversample;
2008 char qc_extname[256];
2009 cpl_propertylist *qc_header = NULL;
2010 char qc_subextract_name[256];
2011 char qc_s2ddiv1d_name[256];
2012 char qc_model_name[256];
2013 char qc_weight_name[256];
2014 int mode = CPL_IO_DEFAULT;
2037 conad = sci_pre->
conad;
2041 if (model_frame == NULL){
2053 check( sci_pre_data = cpl_image_get_data_float( sci_pre->
data));
2054 check( sci_pre_errs = cpl_image_get_data_float( sci_pre->
errs));
2055 check( sci_pre_qual = cpl_image_get_data_int( sci_pre->
qual));
2069 XSH_MALLOC( extract_data,
double, nx_extract*ny_extract);
2070 XSH_MALLOC( extract_errs,
double, nx_extract*ny_extract);
2071 XSH_MALLOC( extract_qual,
int, nx_extract*ny_extract);
2073 XSH_MALLOC( extract_x_data,
double, nx_extract*ny_extract);
2074 XSH_MALLOC( extract_y_data,
double, nx_extract*ny_extract);
2079 xsh_msg(
"Create and multiply by blaze function");
2090 cpl_frame *norm_frame = NULL;
2093 "OPTEXT_MULT_BLAZE",1));
2102 if (min_index >= 0){
2103 rec_min_index = min_index;
2108 if ( max_index < orderext1d->
size){
2109 rec_max_index = max_index;
2112 rec_max_index = orderext1d->
size-1;
2121 for( iorder= rec_min_index; iorder <= rec_max_index; iorder++) {
2122 int abs_order,start_y, end_y;
2123 double cos_tilt=0, sin_tilt=0;
2124 int ny_extract_min=-1, ny_extract_max = -1;
2131 xsh_msg(
"Extracting order %d", abs_order);
2132 xsh_msg_dbg_low(
"---opt_extract : order %d [%d --> %d]", abs_order, start_y, end_y);
2135 opt_extract_par->
oversample, order_list, iorder,
2136 pos_cen_x, pos_cen_y, abs_order, spectralformat_list, lambdas, slits_cen,
2139#if REGDEBUG_OPTEXTRACT
2143 char test_name[256];
2144 float x,
y, lambda, slit;
2145 double x_slit_min=0, y_slit_min=0;
2146 double x_slit_max=0, y_slit_max=0;
2147 double x_slit_cen=0, y_slit_cen=0;
2148 double diffx, diffy;
2150 if (model_frame == NULL){
2151 sprintf( test_name,
"poly%dx%d_lambda_range_%d.dat",
binx,
biny, abs_order);
2154 sprintf( test_name,
"model%dx%d_lambda_range_%d.dat",
binx,
biny, abs_order);
2156 xsh_msg(
"Write %s", test_name);
2157 test_file = fopen( test_name,
"w");
2158 fprintf( test_file,
"# x y lambda slit slit_min slit_max x_slit_min y_slit_min x_slit_cen y_slit_cen x_slit_max y_slit_max diffx diffy\n");
2160 for(i=0; i< nlambdas; i++){
2163 lambda = lambdas[i];
2164 slit = slits_cen[i];
2166 if (model_frame == NULL){
2182 slit_down, &x_slit_min, &y_slit_min));
2184 slit_up, &x_slit_max, &y_slit_max));
2186 slit, &x_slit_cen, &y_slit_cen));
2188 diffx =
x-x_slit_cen;
2189 diffy =
y-y_slit_cen;
2191 fprintf( test_file,
"%f %f %f %f %f %f %f %f %f %f %f %f %f %f\n",
x,
y, lambda, slit, slit_down, slit_up,
2192 x_slit_min, y_slit_min, x_slit_cen, y_slit_cen, x_slit_max, y_slit_max, diffx, diffy);
2200 xsh_msg_dbg_low(
"---opt_extract : (%f --> %f) in %d", lambdas[0], lambdas[nlambdas-1],
2203 xsh_msg_dbg_low(
"---opt_extract : s (%f --> %f)", slit_down, slit_up);
2205 for(i=0; i< nlambdas; i++){
2206 float x,
y, lambda, slit;
2207 double x_slit_min=0, y_slit_min=0;
2208 double x_slit_max=0, y_slit_max=0;
2215 lambda = lambdas[i];
2216 slit = slits_cen[i];
2220 xsh_msg_dbg_high(
"evaluate tilt lambda order %f %f", lambda, (
double) abs_order);
2222 if (model_frame == NULL){
2235 slit_down, &x_slit_min, &y_slit_min));
2237 slit_up, &x_slit_max, &y_slit_max));
2239 if ( x_slit_min < x_slit_max){
2247 if ( y_slit_min < y_slit_max){
2257 if ( x_min >= 1 && x_max <= sci_pre->
nx && (x_min <=
x) &&
2259 y_min >= 1 && y_max <= sci_pre->
ny){
2260 double tilt_x, tilt_y;
2261 double hypotenuse_tilt;
2263 if ((y_min >=
y) || (
y >= y_max)){
2266 tilt_x = x_slit_max-x_slit_min;
2267 tilt_y = y_slit_max-y_slit_min;
2270 if ( extract_slit_hsize <= 0){
2272 ny_extract = extract_slit_hsize*opt_extract_par->
oversample*2+1;
2273 xsh_msg_dbg_high(
"SLIT hsize %d global %d", extract_slit_hsize,ny_extract);
2275 hypotenuse_tilt = sqrt( tilt_y*tilt_y+tilt_x*tilt_x);
2276 cos_tilt = tilt_x/hypotenuse_tilt;
2277 sin_tilt = tilt_y/hypotenuse_tilt;
2281 for (l=0; l< ny_extract; l++){
2283 double flux=-1, err=-1;
2286 xs = (float)l/(
float)opt_extract_par->
oversample-
2290 fy = xs*sin_tilt+
y-1;
2292 if ( (fy >= 0) && (fy < sci_pre->
ny) ){
2293 int pixel=i+l*nlambdas;
2295 fx = xs*cos_tilt+
x-1;
2298 sci_pre->
ny, fx, fy, &flux, &err, &qual_val,
FLUX_MODE));
2300 extract_x_data[pixel] = fx;
2301 extract_y_data[pixel] = fy;
2304 flux *= conad/square_oversample;
2305 extract_data[pixel] = flux;
2306 extract_errs[pixel] = err * conad /
2308 extract_qual[pixel] = qual_val;
2319 box_hsize, nlambdas,
2320 ny_extract, extract_x_data,
2321 extract_y_data, &ny_extract_min, &ny_extract_max));
2323 check( extract_img = cpl_image_wrap_double( nlambdas,
2324 ny_extract, extract_data));
2325 check( extract_errs_img = cpl_image_wrap_double( nlambdas,
2326 ny_extract, extract_errs));
2327 check( extract_qual_img = cpl_image_wrap_int( nlambdas,
2328 ny_extract, extract_qual));
2332 sprintf( name,
"extract_%d.fits", abs_order);
2333 cpl_image_save( extract_img, name, CPL_BPP_IEEE_DOUBLE,
2334 NULL,CPL_IO_DEFAULT);
2335 xsh_msg(
"EXTRACT save %s",name);
2336 sprintf( name,
"extract_errs_%d.fits", abs_order);
2337 cpl_image_save( extract_errs_img, name, CPL_BPP_IEEE_DOUBLE,
2338 NULL,CPL_IO_DEFAULT);
2339 sprintf( name,
"extract_qual_%d.fits", abs_order);
2341 NULL,CPL_IO_DEFAULT);
2346 check( x_img = cpl_image_wrap_double( nlambdas,
2347 ny_extract, extract_x_data));
2348 check( y_img = cpl_image_wrap_double( nlambdas,
2349 ny_extract, extract_y_data));
2351#if REGDEBUG_EXTRACT_XY
2354 sprintf( name,
"extract_x_%d.fits", abs_order);
2355 xsh_msg(
"EXTRACT_XY save %s",name);
2356 cpl_image_save( x_img, name, CPL_BPP_IEEE_DOUBLE, NULL,CPL_IO_DEFAULT);
2357 sprintf( name,
"extract_y_%d.fits", abs_order);
2358 xsh_msg(
"EXTRACT_XY save %s",name);
2359 cpl_image_save( y_img, name, CPL_BPP_IEEE_DOUBLE, NULL,CPL_IO_DEFAULT);
2364 check( sub_extract_img = cpl_image_extract( extract_img, 1,
2365 ny_extract_min+1, nlambdas, ny_extract_max+1));
2366 check( sub_extract_errs_img = cpl_image_extract( extract_errs_img, 1,
2367 ny_extract_min+1, nlambdas, ny_extract_max+1));
2368 check( sub_extract_qual_img = cpl_image_extract( extract_qual_img, 1,
2369 ny_extract_min+1, nlambdas, ny_extract_max+1));
2373 sprintf( qc_subextract_name,
"sub_extract.fits");
2375 sprintf( qc_extname,
"ORD%d_FLUX", abs_order);
2377 cpl_image_save( sub_extract_img, qc_subextract_name, CPL_BPP_IEEE_DOUBLE,
2380 sprintf( qc_extname,
"ORD%d_ERRS", abs_order);
2382 cpl_image_save( sub_extract_errs_img, qc_subextract_name, CPL_BPP_IEEE_DOUBLE,
2383 qc_header, CPL_IO_EXTEND);
2385 sprintf( qc_extname,
"ORD%d_QUAL", abs_order);
2387 cpl_image_save( sub_extract_qual_img, qc_subextract_name,
XSH_PRE_QUAL_BPP,
2388 qc_header, CPL_IO_EXTEND);
2392 check( sub_x_img = cpl_image_extract( x_img, 1,
2393 ny_extract_min+1, nlambdas, ny_extract_max+1));
2394 check( sub_y_img = cpl_image_extract( y_img, 1,
2395 ny_extract_min+1, nlambdas, ny_extract_max+1));
2398#if REGDEBUG_SUBEXTRACT_XY
2401 sprintf( name,
"sub_x_%d.fits", abs_order);
2402 xsh_msg(
"EXTRACT_XY save %s",name);
2403 cpl_image_save( sub_x_img, name, CPL_BPP_IEEE_DOUBLE, NULL,CPL_IO_DEFAULT);
2404 sprintf( name,
"sub_y_%d.fits", abs_order);
2405 xsh_msg(
"EXTRACT_XY save %s",name);
2406 cpl_image_save( sub_y_img, name, CPL_BPP_IEEE_DOUBLE, NULL,CPL_IO_DEFAULT);
2410 check( extract_lambda_vect = cpl_vector_wrap( nlambdas, lambdas));
2414 sub_extract_errs_img, sub_extract_qual_img, &std_err_extract_vect,
2415 &std_qual_extract_vect));
2417#if REGDEBUG_EXTRACT_STD
2419 char std_spectrum_name[256];
2420 FILE* std_spectrum_file = NULL;
2421 int nx = cpl_vector_get_size( std_extract_vect);
2423 sprintf( std_spectrum_name,
"extract_std_%d.dat", abs_order);
2424 std_spectrum_file = fopen( std_spectrum_name,
"w");
2426 fprintf(std_spectrum_file,
"#index lambda flux err qual\n");
2428 for(i=0; i<
nx; i++){
2434 lambdav = cpl_vector_get( extract_lambda_vect, i);
2435 fluxv = cpl_vector_get( std_extract_vect, i);
2436 lambda_err = cpl_vector_get( std_err_extract_vect, i);
2437 qual_v = cpl_vector_get( std_qual_extract_vect, i);
2438 fprintf(std_spectrum_file,
"%d %f %f %f %f\n", i, lambdav, fluxv,
2439 lambda_err, qual_v);
2441 fclose( std_spectrum_file);
2446 div_flux_vect = std_extract_vect;
2447 div_err_vect = std_err_extract_vect;
2449 for( iiter=1; iiter <=
niter; iiter++){
2450 double kappa = 3.0, frac_min=0.7;
2461 sub_extract_errs_img, div_flux_vect, div_err_vect,
2464 sprintf( qc_s2ddiv1d_name,
"s2Dby1D.fits");
2465 sprintf( qc_extname,
"ORD%d_FLUX", abs_order);
2467 cpl_image_save( s2Dby1D_img, qc_s2ddiv1d_name, CPL_BPP_IEEE_DOUBLE, qc_header,
2469 sprintf( qc_extname,
"ORD%d_ERRS", abs_order);
2470 cpl_image_save( s2Dby1D_err_img, qc_s2ddiv1d_name, CPL_BPP_IEEE_DOUBLE, qc_header,
2474 opt_extract_par->
method, chunk_ovsamp_size, deg_poly,
2475 opt_extract_par->
oversample, extract_x_data, extract_y_data,
2478 sprintf( qc_model_name,
"model.fits");
2479 sprintf( qc_extname,
"ORD%d_FLUX", abs_order);
2481 cpl_image_save( model_img, qc_model_name, CPL_BPP_IEEE_DOUBLE, qc_header,
mode);
2488 sub_extract_errs_img, sub_extract_qual_img, opt_extract_par,
2489 model_img, decode_bp,&weight_img, &opt_err_extract_vect, &opt_qual_extract_vect));
2490 div_flux_vect = opt_extract_vect;
2491 div_err_vect = opt_err_extract_vect;
2494 sprintf( qc_weight_name,
"weight.fits");
2495 sprintf( qc_extname,
"ORD%d_FLUX", abs_order);
2497 cpl_image_save( weight_img, qc_weight_name, CPL_BPP_IEEE_DOUBLE, qc_header,
2502 blaze_shift = (int)pos_cen_y[0];
2505 int nx = cpl_vector_get_size( std_extract_vect);
2507 blaze_shift = (int)pos_cen_y[
nx-1];
2520 char std_spectrum_name[256];
2521 FILE* std_spectrum_file = NULL;
2522 int nx = cpl_vector_get_size( std_extract_vect);
2524 sprintf( std_spectrum_name,
"spectrum_divbyblaze_std_%d.dat", abs_order);
2525 std_spectrum_file = fopen( std_spectrum_name,
"w");
2527 fprintf( std_spectrum_file,
"#index lambda flux err qual\n");
2528 for(i=0; i<
nx; i++){
2530 double fluxv, flux_err, qual_v;
2532 lambdav = cpl_vector_get( extract_lambda_vect, i);
2533 fluxv = cpl_vector_get( std_extract_vect, i);
2534 flux_err = cpl_vector_get( std_err_extract_vect, i);
2535 qual_v = cpl_vector_get( std_qual_extract_vect, i);
2536 fprintf(std_spectrum_file,
"%d %f %f %f %f\n", i, lambdav, fluxv,
2539 fclose( std_spectrum_file);
2554 extract_lambda_vect,
2555 std_extract_vect, std_err_extract_vect, std_qual_extract_vect,
2556 opt_extract_vect, opt_err_extract_vect, opt_qual_extract_vect,
2557 &result_lambda_vect,
2558 &std_flux_vect, &std_err_vect, &std_qual_vect,
2559 &opt_flux_vect, &opt_err_vect, &opt_qual_vect));
2561 result_lambda_vect_size = cpl_vector_get_size( result_lambda_vect);
2565 char std_spectrum_name[256];
2566 FILE* std_spectrum_file = NULL;
2568 sprintf( std_spectrum_name,
"spectrum_std_%d.dat", abs_order);
2569 std_spectrum_file = fopen( std_spectrum_name,
"w");
2571 fprintf(std_spectrum_file,
"#lambda flux err qual sn %d\n",
2573 for(i=0; i< result_lambda_vect_size; i++){
2574 double lambdav, flux, err;
2577 lambdav = cpl_vector_get( result_lambda_vect, i);
2578 flux = cpl_vector_get( std_flux_vect, i);
2579 err = cpl_vector_get( std_err_vect, i);
2580 qual = cpl_vector_get( std_qual_vect, i);
2581 fprintf(std_spectrum_file,
"%f %f %f %f %f\n", lambdav, flux / conad,
2582 err / conad, qual, flux/err);
2584 fclose( std_spectrum_file);
2586 sprintf( std_spectrum_name,
"spectrum_opt_%d.dat", abs_order);
2587 std_spectrum_file = fopen( std_spectrum_name,
"w");
2589 fprintf(std_spectrum_file,
"#lambda flux err qual sn %d\n",
2591 for(i=0; i< result_lambda_vect_size; i++){
2592 double lambdav, flux, err;
2595 lambdav = cpl_vector_get( result_lambda_vect, i);
2596 flux = cpl_vector_get( opt_flux_vect, i);
2597 err = cpl_vector_get( opt_err_vect, i);
2598 qual = cpl_vector_get( opt_qual_vect, i);
2600 fprintf(std_spectrum_file,
"%f %f %f %f %f\n", lambdav, flux / conad,
2601 err / conad, qual, flux/err);
2603 fclose( std_spectrum_file);
2607 result_lambda_vect_size, 1);
2609 result_lambda_vect_size, 1);
2610 for(i=0; i< result_lambda_vect_size; i++){
2611 double lambdav, extflux,oxtflux;
2612 double exterr, oxterr;
2613 int extqual, oxtqual;
2615 lambdav = cpl_vector_get( result_lambda_vect, i);
2616 extflux = cpl_vector_get( std_flux_vect, i);
2617 oxtflux = cpl_vector_get( opt_flux_vect, i);
2619 exterr = cpl_vector_get( std_err_vect, i);
2620 oxterr = cpl_vector_get( opt_err_vect, i);
2622 extqual = (int) cpl_vector_get( std_qual_vect, i);
2623 oxtqual = (int) cpl_vector_get( opt_qual_vect, i);
2625 orderext1d->
list[iorder].
lambda[i] = lambdav;
2626 orderoxt1d->
list[iorder].
lambda[i] = lambdav;
2629 orderext1d->
list[iorder].
data1[i] = extflux / conad;
2630 orderoxt1d->
list[iorder].
data1[i] = oxtflux / conad;
2632 orderext1d->
list[iorder].
errs1[i] = exterr / conad;
2633 orderoxt1d->
list[iorder].
errs1[i] = oxterr / conad;
2635 orderext1d->
list[iorder].
qual1[i] = extqual;
2636 orderoxt1d->
list[iorder].
qual1[i] = oxtqual;
2637 mode = CPL_IO_EXTEND;
2690 sprintf(filename,
"%s.fits",tag);
2692 filename, tag, CPL_TRUE));
2706 sprintf(tag_drl,
"%s_DRL",tag);
2711 sprintf(filename,
"%s.fits",tag);
2712 sprintf(filename_drl,
"DRL_%s.fits",filename);
2727 *qc_subextract_frame = cpl_frame_new();
2729 sprintf(tag,
"%s_OXT_SUBEXTRACT",rec_prefix);
2730 check ((cpl_frame_set_filename ( *qc_subextract_frame, qc_subextract_name),
2731 cpl_frame_set_tag( *qc_subextract_frame, tag),
2732 cpl_frame_set_type ( *qc_subextract_frame, CPL_FRAME_TYPE_IMAGE) )) ;
2734 *qc_s2ddiv1d_frame = cpl_frame_new();
2735 sprintf(tag,
"%s_OXT_S2DDIV1D",rec_prefix);
2736 check ((cpl_frame_set_filename ( *qc_s2ddiv1d_frame, qc_s2ddiv1d_name),
2737 cpl_frame_set_tag( *qc_s2ddiv1d_frame, tag),
2738 cpl_frame_set_type ( *qc_s2ddiv1d_frame, CPL_FRAME_TYPE_IMAGE) )) ;
2740 *qc_model_frame = cpl_frame_new();
2741 sprintf(tag,
"%s_OXT_MODEL",rec_prefix);
2742 check ((cpl_frame_set_filename ( *qc_model_frame, qc_model_name),
2743 cpl_frame_set_tag( *qc_model_frame, tag),
2744 cpl_frame_set_type ( *qc_model_frame, CPL_FRAME_TYPE_IMAGE) ));
2746 *qc_weight_frame = cpl_frame_new();
2747 sprintf(tag,
"%s_OXT_WEIGHT",rec_prefix);
2748 check ((cpl_frame_set_filename ( *qc_weight_frame, qc_weight_name),
2749 cpl_frame_set_tag( *qc_weight_frame, tag),
2750 cpl_frame_set_type ( *qc_weight_frame, CPL_FRAME_TYPE_IMAGE) ));
2758 if ( cpl_error_get_code() != CPL_ERROR_NONE) {
static xsh_instrument * instrument
cpl_image * xsh_create_blaze(cpl_frame *masterflat_frame, xsh_order_list *order_list, xsh_instrument *instrument)
Normalize a master flat frame order by order.
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
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.
xsh_pre * xsh_pre_load(cpl_frame *frame, xsh_instrument *instr)
Load a xsh_pre structure from a frame.
void xsh_pre_multiply_image(const xsh_pre *pre, cpl_image *img)
multiply a frame in PRE format by an image
void xsh_pre_free(xsh_pre **pre)
Free a xsh_pre structure.
cpl_frame * xsh_pre_save(const xsh_pre *pre, const char *filename, const char *tag, int temp)
Save PRE on disk.
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
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.
double xsh_rec_list_get_lambda_max(xsh_rec_list *list)
double xsh_rec_list_get_lambda_min(xsh_rec_list *list)
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.
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_ASSURE_NOT_ILLEGAL(cond)
#define xsh_error_reset()
#define XSH_ASSURE_NOT_NULL(pointer)
XSH_ARM xsh_instrument_get_arm(xsh_instrument *i)
Get an arm 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.
void xsh_model_binxy(xsh_xs_3 *p_xs_3, int bin_X, int bin_Y)
corrects model for detector's binning
#define xsh_msg_warning(...)
Print an warning message.
#define xsh_msg_dbg_medium(...)
#define xsh_msg_debug(...)
Print a debug message.
#define xsh_msg(...)
Print a message on info level.
#define xsh_msg_dbg_low(...)
#define xsh_msg_dbg_high(...)
void xsh_pfits_set_pcatg(cpl_propertylist *plist, const char *value)
Write the PCATG value.
void xsh_pfits_set_rectify_bin_lambda(cpl_propertylist *plist, double value)
WRITE the lambda binning.
void xsh_pfits_set_rectify_lambda_max(cpl_propertylist *plist, double value)
WRITE the lambda max value.
void xsh_pfits_set_rectify_space_max(cpl_propertylist *plist, double value)
WRITE the space (slit) max value.
void xsh_pfits_set_extname(cpl_propertylist *plist, const char *value)
Write the EXTNAME value.
void xsh_pfits_set_rectify_space_min(cpl_propertylist *plist, double value)
WRITE the space (slit) min value.
void xsh_pfits_set_rectify_bin_space(cpl_propertylist *plist, double value)
WRITE the space (slit) binning.
void xsh_pfits_set_rectify_lambda_min(cpl_propertylist *plist, double value)
WRITE the lambda min 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_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.
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
void xsh_free_frame(cpl_frame **f)
Deallocate a frame and set the pointer to NULL.
void xsh_array_clip_poly1d(cpl_vector *pos_vect, cpl_vector *val_vect, double kappa, int niter, double frac_min, int deg, cpl_polynomial **polyp, double *chisq, int **flagsp)
clip outliers from a 1D poly fit
long xsh_round_double(double x)
Computes round(x)
void xsh_unwrap_image(cpl_image **i)
Unwrap an image 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 * blazepoly
cpl_propertylist * data_header
cpl_propertylist * header
#define QFLAG_COSMIC_RAY_REMOVED
#define XSH_GET_TAG_FROM_ARM(TAG, instr)
#define XSH_NEW_PROPERTYLIST(POINTER)
#define XSH_FREE(POINTER)
#define XSH_MALLOC(POINTER, TYPE, SIZE)
#define XSH_CALLOC(POINTER, TYPE, SIZE)
cpl_polynomial * xsh_polynomial_fit_1d_create(const cpl_vector *x_pos, const cpl_vector *values, int degree, double *mse)