97 #define POSIX_SOURCE 1
98 #include "sinfo_vltPort.h"
108 #include "sinfo_coltilt.h"
109 #include "sinfo_new_resampling.h"
110 #include "sinfo_fit_curve.h"
111 #include "sinfo_functions.h"
144 sinfo_new_slope_of_spectrum( cpl_image * ns_image,
151 int xdim, ndat, its, numpar ;
154 float* col_value=NULL ;
155 float* column_value=NULL ;
156 pixelvalue* col_position=NULL ;
157 int* column_position=NULL ;
158 float* x_position=NULL ;
162 float * xdat, * wdat ;
165 FitParams ** dec_par ;
174 float a, b, siga, sigb, chi2, q ;
180 if ( ns_image == NULL )
185 lx=cpl_image_get_size_x(ns_image);
186 ly=cpl_image_get_size_x(ns_image);
189 if ( box_length <= 1 || box_length >= (
int) sqrt(lx) )
194 if ( fwhm < 1. || fwhm > 10. )
207 col_value=cpl_calloc(ly,
sizeof(
float)) ;
208 column_value=cpl_calloc(ly,
sizeof(
float)) ;
209 col_position=(pixelvalue*)cpl_calloc(ly,
sizeof(pixelvalue)) ;
210 column_position=cpl_calloc(ly,
sizeof(
int)) ;
211 x_position=cpl_calloc(ly,
sizeof(
float)) ;
215 x=cpl_calloc(lx,
sizeof(
float));
216 y=cpl_calloc(lx,
sizeof(
float));
217 sig=cpl_calloc(lx,
sizeof(
float)) ;
218 pdata=cpl_image_get_data_float(ns_image);
220 for ( row = 0 ; row < ly ; row++ )
222 col_value[row] = -FLT_MAX ;
223 col_position[row] = -1. ;
225 for ( col = 0 ; col < lx ; col++ )
227 if ( pdata[col+row*lx] > col_value[row] )
229 col_value[row] = pdata[col+row*lx] ;
230 col_position[row] = (pixelvalue)col ;
237 col_median = (int)sinfo_new_median(col_position, ly) ;
238 sinfo_msg (
"sinfo_new_median column position of brightest spectrum %d\n",
242 for ( row = 0 ; row < ly ; row++ )
244 x_position[row] = 0. ;
245 column_value[row] = -FLT_MAX ;
246 column_position[row] = -1 ;
247 for ( col = col_median - box_length ;
248 col <= col_median + box_length ; col++ )
250 if ( pdata[col+row*lx] > column_value[row] )
252 column_value[row] = pdata[col+row*lx] ;
253 column_position[row] = col ;
258 if ( NULL == (line = sinfo_new_vector (2*box_length + 1)) )
265 xdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
266 wdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
267 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
268 dec_par = sinfo_new_fit_params(1) ;
274 for ( col = column_position[row] - box_length ;
275 col <= column_position[row] + box_length ; col++ )
277 if ( col < 0 || col >= lx )
280 "given in row: %d", row) ;
284 sinfo_new_destroy_fit_params(&dec_par) ;
285 sinfo_new_destroy_vector( line ) ;
288 else if ( isnan(pdata[col+row*lx]) )
294 line -> data[counter] = pdata[col + row*lx] ;
303 "box in row: %d", row) ;
307 sinfo_new_destroy_fit_params(&dec_par) ;
308 sinfo_new_destroy_vector( line ) ;
317 position = -INT32_MAX ;
318 for ( i = 0 ; i < counter ; i++ )
322 if ( line -> data[i] >= maxval )
324 maxval = line -> data[i] ;
331 ndat = line -> n_elements ;
336 (*par).fit_par[1] = fwhm ;
337 (*par).fit_par[2] = (float) position ;
338 (*par).fit_par[3] = (float) (line -> data[0] +
339 line -> data[line->n_elements - 1]) / 2.0 ;
341 (*par).fit_par[0] = maxval - ((*par).fit_par[3]) ;
343 if ( (*par).fit_par[0] < minDiff )
346 "too low to fit in row: %d", row) ;
350 sinfo_new_destroy_fit_params(&dec_par) ;
351 sinfo_new_destroy_vector( line ) ;
355 for ( k = 0 ; k < MAXPAR ; k++ )
357 (*par).derv_par[k] = 0.0 ;
362 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
364 &ndat, (*par).fit_par,
365 (*par).derv_par, mpar,
366 &numpar, &tol, &its, &lab )) )
369 "failed in row: %d, error no.: %d",row,iters) ;
373 sinfo_new_destroy_fit_params(&dec_par) ;
374 sinfo_new_destroy_vector( line ) ;
379 if ( (*par).fit_par[0] <= 0. || (*par).fit_par[1] <= 0. ||
380 (*par).fit_par[2] <= 0. )
383 "not used! in row: %d", row) ;
387 sinfo_new_destroy_fit_params(&dec_par) ;
388 sinfo_new_destroy_vector( line ) ;
394 x_position[row] = (float) (column_position[row] - box_length) +
399 sig[row] = (*par).derv_par[2] ;
402 sinfo_new_destroy_fit_params(&dec_par) ;
403 sinfo_new_destroy_vector ( line ) ;
416 for ( row = 0 ; row < lx ; row++ )
418 if ( x_position[row] == 0. || sig[row] == 0. )
424 y[ndata] = x_position[row] ;
425 x[ndata] = (float)row ;
426 sig[ndata] = sig[row] ;
438 sinfo_my_fit(x, y, ndata, sig, mwt, &a, &b, &siga, &sigb, &chi2, &q) ;
440 cpl_free(col_value) ;
441 cpl_free(column_value) ;
442 cpl_free(col_position) ;
443 cpl_free(column_position) ;
444 cpl_free(x_position) ;
466 sinfo_new_shift_rows( cpl_image * image,
470 cpl_image * returnImage=NULL ;
477 float* row_data=NULL ;
478 float* corrected_row_data=NULL ;
481 float * imageptr=NULL ;
515 returnImage = cpl_image_duplicate( image ) ;
516 ilx=cpl_image_get_size_x(image);
517 ily=cpl_image_get_size_y(image);
522 pidata=cpl_image_get_data_float(image);
523 podata=cpl_image_get_data_float(returnImage);
526 n_points = n_order + 1 ;
527 if ( n_points % 2 == 0 )
529 firstpos = (int)(n_points/2) - 1 ;
533 firstpos = (int)(n_points/2) ;
537 xnum=cpl_calloc(n_order + 1,
sizeof(
float)) ;
538 row_data=cpl_calloc(ilx,
sizeof(
float)) ;
539 corrected_row_data=cpl_calloc(ilx,
sizeof(
float)) ;
542 for ( i = 0 ; i < n_points ; i++ )
548 for ( row = 0 ; row < ily ; row++ )
551 xshift = slope * (float)( (ily / 2) - row ) ;
553 intshift = sinfo_new_nint(xshift) ;
554 xshift = xshift - (float)intshift ;
556 for ( col = 0 ; col < ilx ; col++ )
558 corrected_row_data[col] = 0. ;
562 for ( col = 0 ; col < ilx ; col++ )
567 if ( col - intshift < ilx )
569 row_data[col] = pidata[col-intshift+row*ilx] ;
576 else if ( intshift > 0 )
578 if ( col - intshift >= 0 )
580 row_data[col] = pidata[col-intshift+row*ilx] ;
589 row_data[col] = pidata[col+row*ilx] ;
593 if ( col != 0 && col != ilx - 1 && !isnan(row_data[col]) )
595 sum += row_data[col] ;
597 if (isnan(row_data[col]))
600 for (i = col - firstpos ; i < col - firstpos + n_points ; i++ )
602 if ( i < 0 ) continue ;
603 if ( i >= ilx) continue ;
604 corrected_row_data[i] = ZERO ;
615 for ( col = 0 ; col < ilx ; col++ )
623 if ( isnan(corrected_row_data[col]) )
627 if ( col - firstpos < 0 )
629 imageptr = &row_data[0] ;
630 eval = (float)col - xshift ;
632 else if ( col - firstpos + n_points >= ilx )
634 imageptr = &row_data[ilx - n_points] ;
635 eval = (float)(col + n_points - ilx) - xshift ;
639 imageptr = &row_data[col-firstpos] ;
640 eval = (float)firstpos - xshift ;
644 corrected_row_data[col]=sinfo_new_nev_ille(xnum,imageptr,
651 if (col != 0 && col != ilx - 1 && !isnan(corrected_row_data[col]) )
653 new_sum += corrected_row_data[col] ;
661 for ( col = 0 ; col < ilx ; col++ )
663 if ( isnan(corrected_row_data[col]))
665 podata[col+row*ilx] = ZERO ;
675 podata[col+row*ilx] = corrected_row_data[col] ;
682 cpl_free(corrected_row_data);
699 sinfo_new_parameter_to_ascii (
float * parameter,
706 if ( parameter == NULL || filename == NULL || n <= 0 )
712 if ( NULL == (fp = fopen ( filename,
"w" ) ) )
718 for ( i = 0 ; i < n ; i++ )
720 fprintf (fp,
"%le\n", parameter[i] ) ;
733 sinfo_new_ascii_to_parameter (
char * filename,
737 float * parameter=NULL ;
740 if ( filename == NULL || n == NULL )
746 if ( NULL == (fp = fopen ( filename,
"r" ) ) )
754 if (NULL == ( parameter = (
float*) cpl_calloc (ESTIMATE,
sizeof(
float)) ) )
762 while ( fscanf(fp,
"%g\n", ¶meter[i]) != EOF )
797 sinfo_new_curvature_of_spectrum( cpl_image * ns_image,
819 float* col_value=NULL ;
820 float* column_value=NULL ;
821 pixelvalue* col_position=NULL ;
822 int* column_position=NULL ;
823 float* x_position=NULL ;
830 FitParams ** dec_par=NULL ;
831 FitParams * par=NULL ;
836 double * coeffs=NULL ;
842 if ( ns_image == NULL )
847 lx=cpl_image_get_size_x(ns_image);
848 ly=cpl_image_get_size_y(ns_image);
850 if ( box_length <= 1 || box_length >= right_pos - left_pos )
855 if ( fwhm < 1. || fwhm > 10. )
860 if ( left_pos < 0 || right_pos <= left_pos || right_pos > lx )
873 col_value=cpl_calloc(ly,
sizeof(
float)) ;
874 column_value=cpl_calloc(ly,
sizeof(
float)) ;
875 col_position=(pixelvalue*)cpl_calloc(ly,
sizeof(pixelvalue)) ;
876 column_position=cpl_calloc(ly,
sizeof(
int)) ;
877 x_position=cpl_calloc(ly,
sizeof(
float)) ;
880 for ( row = 0 ; row < ly ; row++ )
882 col_value[row] = -FLT_MAX ;
883 col_position[row] = -1. ;
885 for ( col = left_pos ; col < right_pos ; col++ )
887 if ( pdata[col+row*lx] > col_value[row] )
889 col_value[row] = pdata[col+row*lx] ;
890 col_position[row] = (pixelvalue)col ;
897 col_median = (int)sinfo_new_median(col_position, right_pos - left_pos) ;
900 for ( row = 0 ; row < ly ; row++ )
902 x_position[row] = 0. ;
903 column_value[row] = -FLT_MAX ;
904 column_position[row] = -1 ;
905 for ( col = col_median - box_length ;
906 col <= col_median + box_length ; col++ )
908 if ( pdata[col+row*lx] > column_value[row] )
910 column_value[row] = pdata[col+row*lx] ;
911 column_position[row] = col ;
916 if ( NULL == (line = sinfo_new_vector (2*box_length + 1)) )
923 xdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
924 wdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
925 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
926 dec_par = sinfo_new_fit_params(1) ;
932 for ( col = column_position[row] - box_length ;
933 col <= column_position[row] + box_length ; col++ )
935 if ( col < 0 || col >= lx )
938 "given in row: %d", row) ;
942 sinfo_new_destroy_fit_params(&dec_par) ;
943 sinfo_new_destroy_vector( line ) ;
946 else if ( isnan(pdata[col+row*lx]) )
952 line -> data[counter] = pdata[col + row*lx] ;
965 sinfo_new_destroy_fit_params(&dec_par) ;
966 sinfo_new_destroy_vector( line ) ;
975 position = -INT32_MAX ;
976 for ( i = 0 ; i < counter ; i++ )
980 if ( line -> data[i] >= maxval )
982 maxval = line -> data[i] ;
989 ndat = line -> n_elements ;
994 (*par).fit_par[1] = fwhm ;
995 (*par).fit_par[2] = (float) position ;
996 (*par).fit_par[3] = (float) (line -> data[0] +
997 line -> data[line->n_elements - 1]) / 2.0;
999 (*par).fit_par[0] = maxval - ((*par).fit_par[3]) ;
1001 if ( (*par).fit_par[0] < minDiff )
1004 "too low to fit in row: %d", row) ;
1008 sinfo_new_destroy_fit_params(&dec_par) ;
1009 sinfo_new_destroy_vector( line ) ;
1013 for ( k = 0 ; k < MAXPAR ; k++ )
1015 (*par).derv_par[k] = 0.0 ;
1020 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
1022 &ndat, (*par).fit_par,
1023 (*par).derv_par, mpar,
1024 &numpar, &tol, &its, &lab )) )
1027 "%d, error no.: %d", row, iters) ;
1031 sinfo_new_destroy_fit_params(&dec_par) ;
1032 sinfo_new_destroy_vector( line ) ;
1037 if ( (*par).fit_par[0] <= 0. || (*par).fit_par[1] <= 1. ||
1038 (*par).fit_par[2] <= 0. )
1041 "not used! in row: %d", row) ;
1045 sinfo_new_destroy_fit_params(&dec_par) ;
1046 sinfo_new_destroy_vector( line ) ;
1052 x_position[row] = (float) (column_position[row] - box_length) +
1054 printf(
"%d %f %f\n",row, (*par).fit_par[1], x_position[row] ) ;
1057 sinfo_new_destroy_fit_params(&dec_par) ;
1058 sinfo_new_destroy_vector ( line ) ;
1064 if ( NULL == ( list = (dpoint*) cpl_calloc (ly,
sizeof (dpoint)) ) )
1075 offset = (double) ly/2. ;
1077 for ( row = 0 ; row < ly ; row++ )
1079 if ( x_position[row] == 0. )
1085 list[ndata].y = (double)x_position[row] ;
1086 list[ndata].x = (double)row - offset ;
1092 if ( NULL == (coeffs = sinfo_fit_1d_poly(order, list, ndata, NULL)) )
1094 sinfo_msg_error(
"eclipse function sinfo_fit_1d_poly() did not work!") ;
1101 cpl_free(col_value) ;
1102 cpl_free(column_value) ;
1103 cpl_free(col_position) ;
1104 cpl_free(column_position) ;
1105 cpl_free(x_position) ;
1119 sinfo_new_image_warp_fits( cpl_image * image,
1123 cpl_image * warped=NULL;
1125 cpl_polynomial * poly_u=NULL;
1126 cpl_polynomial * poly_v=NULL;
1127 cpl_table* poly_tbl=NULL;
1128 cpl_vector * profile=NULL ;
1129 cpl_size local_pow[2];
1135 poly_u = cpl_polynomial_new(2);
1136 if (poly_u == NULL) {
1141 if (poly_u != NULL) {
1144 if(sinfo_is_fits_file(poly_table) != 1) {
1149 if(NULL==(poly_tbl = cpl_table_load(poly_table,1,0))) {
1151 cpl_polynomial_delete(poly_u) ;
1155 for (i=0 ; i<cpl_table_get_nrow(poly_tbl) ; i++) {
1156 local_pow[0] = cpl_table_get_int(poly_tbl,
"degx", i, NULL) ;
1157 local_pow[1] = cpl_table_get_int(poly_tbl,
"degy", i, NULL) ;
1158 cpl_polynomial_set_coeff(poly_u, local_pow,
1159 cpl_table_get_double(poly_tbl,
"coeff", i, NULL)) ;
1162 cpl_table_delete(poly_tbl) ;
1164 sinfo_msg(
"Use the ID polynomial for the arc dist") ;
1167 cpl_polynomial_set_coeff(poly_u, local_pow, 1.0) ;
1170 poly_v=cpl_polynomial_new(2);
1174 cpl_polynomial_set_coeff(poly_v,local_pow,1.0);
1175 profile = cpl_vector_new(CPL_KERNEL_DEF_SAMPLES) ;
1176 cpl_vector_fill_kernel_profile(profile, CPL_KERNEL_TANH,
1177 CPL_KERNEL_DEF_WIDTH) ;
1178 warped=sinfo_new_warp_image_generic(image,kernel_type,poly_u,poly_v);
1197 cpl_vector_delete(profile) ;
1198 if (poly_u!=NULL) cpl_polynomial_delete(poly_u);
1199 if (poly_v!=NULL) cpl_polynomial_delete(poly_v);