38 #define POSIX_SOURCE 1
39 #include "sinfo_vltPort.h"
49 #include "sinfo_coltilt.h"
50 #include "sinfo_new_resampling.h"
51 #include "sinfo_fit_curve.h"
52 #include "sinfo_functions.h"
88 sinfo_new_slope_of_spectrum( cpl_image * ns_image,
95 int xdim, ndat, its, numpar ;
98 float* col_value=NULL ;
99 float* column_value=NULL ;
100 pixelvalue* col_position=NULL ;
101 int* column_position=NULL ;
102 float* x_position=NULL ;
109 FitParams ** dec_par ;
118 float a, b, siga, sigb, chi2, q ;
124 if ( ns_image == NULL )
129 lx=cpl_image_get_size_x(ns_image);
130 ly=cpl_image_get_size_x(ns_image);
133 if ( box_length <= 1 || box_length >= (
int) sqrt(lx) )
138 if ( fwhm < 1. || fwhm > 10. )
151 col_value=cpl_calloc(ly,
sizeof(
float)) ;
152 column_value=cpl_calloc(ly,
sizeof(
float)) ;
153 col_position=(pixelvalue*)cpl_calloc(ly,
sizeof(pixelvalue)) ;
154 column_position=cpl_calloc(ly,
sizeof(
int)) ;
155 x_position=cpl_calloc(ly,
sizeof(
float)) ;
159 x=cpl_calloc(lx,
sizeof(
float));
160 y=cpl_calloc(lx,
sizeof(
float));
161 sig=cpl_calloc(lx,
sizeof(
float)) ;
162 pdata=cpl_image_get_data_float(ns_image);
164 for ( row = 0 ; row < ly ; row++ )
166 col_value[row] = -FLT_MAX ;
167 col_position[row] = -1. ;
169 for ( col = 0 ; col < lx ; col++ )
171 if ( pdata[col+row*lx] > col_value[row] )
173 col_value[row] = pdata[col+row*lx] ;
174 col_position[row] = (pixelvalue)col ;
181 col_median = (int)sinfo_new_median(col_position, ly) ;
182 sinfo_msg (
"sinfo_new_median column position of brightest spectrum %d\n",
186 for ( row = 0 ; row < ly ; row++ )
188 x_position[row] = 0. ;
189 column_value[row] = -FLT_MAX ;
190 column_position[row] = -1 ;
191 for ( col = col_median - box_length ;
192 col <= col_median + box_length ; col++ )
194 if ( pdata[col+row*lx] > column_value[row] )
196 column_value[row] = pdata[col+row*lx] ;
197 column_position[row] = col ;
202 if ( NULL == (line = sinfo_new_vector (2*box_length + 1)) )
209 float* xdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
210 float* wdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
211 int* mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
212 dec_par = sinfo_new_fit_params(1) ;
213 FitParams * par = dec_par[0];
218 for ( col = column_position[row] - box_length ;
219 col <= column_position[row] + box_length ; col++ )
221 if ( col < 0 || col >= lx )
224 "given in row: %d", row) ;
228 sinfo_new_destroy_fit_params(&dec_par) ;
229 sinfo_new_destroy_vector( line ) ;
232 else if ( isnan(pdata[col+row*lx]) )
238 line -> data[counter] = pdata[col + row*lx] ;
247 "box in row: %d", row) ;
251 sinfo_new_destroy_fit_params(&dec_par) ;
252 sinfo_new_destroy_vector( line ) ;
261 position = -INT32_MAX ;
262 for ( i = 0 ; i < counter ; i++ )
266 if ( line -> data[i] >= maxval )
268 maxval = line -> data[i] ;
275 ndat = line -> n_elements ;
280 (*par).fit_par[1] = fwhm ;
281 (*par).fit_par[2] = (float) position ;
282 (*par).fit_par[3] = (float) (line -> data[0] +
283 line -> data[line->n_elements - 1]) / 2.0 ;
285 (*par).fit_par[0] = maxval - ((*par).fit_par[3]) ;
287 if ( (*par).fit_par[0] < minDiff )
290 "too low to fit in row: %d", row) ;
294 sinfo_new_destroy_fit_params(&dec_par) ;
295 sinfo_new_destroy_vector( line ) ;
299 for ( k = 0 ; k < MAXPAR ; k++ )
301 (*par).derv_par[k] = 0.0 ;
306 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
308 &ndat, (*par).fit_par,
309 (*par).derv_par, mpar,
310 &numpar, &tol, &its, &lab )) )
313 "failed in row: %d, error no.: %d",row,iters) ;
317 sinfo_new_destroy_fit_params(&dec_par) ;
318 sinfo_new_destroy_vector( line ) ;
323 if ( (*par).fit_par[0] <= 0. || (*par).fit_par[1] <= 0. ||
324 (*par).fit_par[2] <= 0. )
327 "not used! in row: %d", row) ;
331 sinfo_new_destroy_fit_params(&dec_par) ;
332 sinfo_new_destroy_vector( line ) ;
338 x_position[row] = (float) (column_position[row] - box_length) +
343 sig[row] = (*par).derv_par[2] ;
346 sinfo_new_destroy_fit_params(&dec_par) ;
347 sinfo_new_destroy_vector ( line ) ;
360 for ( row = 0 ; row < lx ; row++ )
362 if ( x_position[row] == 0. || sig[row] == 0. )
368 y[ndata] = x_position[row] ;
369 x[ndata] = (float)row ;
370 sig[ndata] = sig[row] ;
382 sinfo_my_fit(x, y, ndata, sig, mwt, &a, &b, &siga, &sigb, &chi2, &q) ;
384 cpl_free(col_value) ;
385 cpl_free(column_value) ;
386 cpl_free(col_position) ;
387 cpl_free(column_position) ;
388 cpl_free(x_position) ;
414 sinfo_new_shift_rows( cpl_image * image,
418 cpl_image * returnImage=NULL ;
425 float* row_data=NULL ;
426 float* corrected_row_data=NULL ;
429 float * imageptr=NULL ;
463 returnImage = cpl_image_duplicate( image ) ;
464 ilx=cpl_image_get_size_x(image);
465 ily=cpl_image_get_size_y(image);
470 pidata=cpl_image_get_data_float(image);
471 podata=cpl_image_get_data_float(returnImage);
474 n_points = n_order + 1 ;
475 if ( n_points % 2 == 0 )
477 firstpos = (int)(n_points/2) - 1 ;
481 firstpos = (int)(n_points/2) ;
485 xnum=cpl_calloc(n_order + 1,
sizeof(
float)) ;
486 row_data=cpl_calloc(ilx,
sizeof(
float)) ;
487 corrected_row_data=cpl_calloc(ilx,
sizeof(
float)) ;
490 for ( i = 0 ; i < n_points ; i++ )
496 for ( row = 0 ; row < ily ; row++ )
499 float xshift = slope * (float)( (ily / 2) - row ) ;
501 int intshift = sinfo_new_nint(xshift) ;
502 xshift = xshift - (float)intshift ;
504 for ( col = 0 ; col < ilx ; col++ )
506 corrected_row_data[col] = 0. ;
510 for ( col = 0 ; col < ilx ; col++ )
515 if ( col - intshift < ilx )
517 row_data[col] = pidata[col-intshift+row*ilx] ;
524 else if ( intshift > 0 )
526 if ( col - intshift >= 0 )
528 row_data[col] = pidata[col-intshift+row*ilx] ;
537 row_data[col] = pidata[col+row*ilx] ;
541 if ( col != 0 && col != ilx - 1 && !isnan(row_data[col]) )
543 sum += row_data[col] ;
545 if (isnan(row_data[col]))
548 for (i = col - firstpos ; i < col - firstpos + n_points ; i++ )
550 if ( i < 0 ) continue ;
551 if ( i >= ilx) continue ;
552 corrected_row_data[i] = ZERO ;
563 for ( col = 0 ; col < ilx ; col++ )
571 if ( isnan(corrected_row_data[col]) )
575 if ( col - firstpos < 0 )
577 imageptr = &row_data[0] ;
578 eval = (float)col - xshift ;
580 else if ( col - firstpos + n_points >= ilx )
582 imageptr = &row_data[ilx - n_points] ;
583 eval = (float)(col + n_points - ilx) - xshift ;
587 imageptr = &row_data[col-firstpos] ;
588 eval = (float)firstpos - xshift ;
592 corrected_row_data[col]=sinfo_new_nev_ille(xnum,imageptr,
599 if (col != 0 && col != ilx - 1 && !isnan(corrected_row_data[col]) )
601 new_sum += corrected_row_data[col] ;
609 for ( col = 0 ; col < ilx ; col++ )
611 if ( isnan(corrected_row_data[col]))
613 podata[col+row*ilx] = ZERO ;
623 podata[col+row*ilx] = corrected_row_data[col] ;
630 cpl_free(corrected_row_data);
649 sinfo_new_parameter_to_ascii (
float * parameter,
656 if ( parameter == NULL || filename == NULL || n <= 0 )
662 if ( NULL == (fp = fopen ( filename,
"w" ) ) )
668 for ( i = 0 ; i < n ; i++ )
670 fprintf (fp,
"%le\n", parameter[i] ) ;
704 sinfo_new_curvature_of_spectrum( cpl_image * ns_image,
726 float* col_value=NULL ;
727 float* column_value=NULL ;
728 pixelvalue* col_position=NULL ;
729 int* column_position=NULL ;
730 float* x_position=NULL ;
737 FitParams ** dec_par=NULL ;
743 double * coeffs=NULL ;
749 if ( ns_image == NULL )
754 lx=cpl_image_get_size_x(ns_image);
755 ly=cpl_image_get_size_y(ns_image);
757 if ( box_length <= 1 || box_length >= right_pos - left_pos )
762 if ( fwhm < 1. || fwhm > 10. )
767 if ( left_pos < 0 || right_pos <= left_pos || right_pos > lx )
780 col_value=cpl_calloc(ly,
sizeof(
float)) ;
781 column_value=cpl_calloc(ly,
sizeof(
float)) ;
782 col_position=(pixelvalue*)cpl_calloc(ly,
sizeof(pixelvalue)) ;
783 column_position=cpl_calloc(ly,
sizeof(
int)) ;
784 x_position=cpl_calloc(ly,
sizeof(
float)) ;
785 pdata=cpl_image_get_data_float(ns_image);
787 for ( row = 0 ; row < ly ; row++ )
789 col_value[row] = -FLT_MAX ;
790 col_position[row] = -1. ;
792 for ( col = left_pos ; col < right_pos ; col++ )
794 if ( pdata[col+row*lx] > col_value[row] )
796 col_value[row] = pdata[col+row*lx] ;
797 col_position[row] = (pixelvalue)col ;
804 col_median = (int)sinfo_new_median(col_position, right_pos - left_pos) ;
807 for ( row = 0 ; row < ly ; row++ )
809 x_position[row] = 0. ;
810 column_value[row] = -FLT_MAX ;
811 column_position[row] = -1 ;
812 for ( col = col_median - box_length ;
813 col <= col_median + box_length ; col++ )
815 if ( pdata[col+row*lx] > column_value[row] )
817 column_value[row] = pdata[col+row*lx] ;
818 column_position[row] = col ;
823 if ( NULL == (line = sinfo_new_vector (2*box_length + 1)) )
830 float* xdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
831 float* wdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
832 int* mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
833 dec_par = sinfo_new_fit_params(1) ;
834 FitParams * par = dec_par[0];
839 for ( col = column_position[row] - box_length ;
840 col <= column_position[row] + box_length ; col++ )
842 if ( col < 0 || col >= lx )
845 "given in row: %d", row) ;
849 sinfo_new_destroy_fit_params(&dec_par) ;
850 sinfo_new_destroy_vector( line ) ;
853 else if ( isnan(pdata[col+row*lx]) )
859 line -> data[counter] = pdata[col + row*lx] ;
872 sinfo_new_destroy_fit_params(&dec_par) ;
873 sinfo_new_destroy_vector( line ) ;
882 position = -INT32_MAX ;
883 for ( i = 0 ; i < counter ; i++ )
887 if ( line -> data[i] >= maxval )
889 maxval = line -> data[i] ;
896 ndat = line -> n_elements ;
901 (*par).fit_par[1] = fwhm ;
902 (*par).fit_par[2] = (float) position ;
903 (*par).fit_par[3] = (float) (line -> data[0] +
904 line -> data[line->n_elements - 1]) / 2.0;
906 (*par).fit_par[0] = maxval - ((*par).fit_par[3]) ;
908 if ( (*par).fit_par[0] < minDiff )
911 "too low to fit in row: %d", row) ;
915 sinfo_new_destroy_fit_params(&dec_par) ;
916 sinfo_new_destroy_vector( line ) ;
920 for ( k = 0 ; k < MAXPAR ; k++ )
922 (*par).derv_par[k] = 0.0 ;
927 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
929 &ndat, (*par).fit_par,
930 (*par).derv_par, mpar,
931 &numpar, &tol, &its, &lab )) )
934 "%d, error no.: %d", row, iters) ;
938 sinfo_new_destroy_fit_params(&dec_par) ;
939 sinfo_new_destroy_vector( line ) ;
944 if ( (*par).fit_par[0] <= 0. || (*par).fit_par[1] <= 1. ||
945 (*par).fit_par[2] <= 0. )
948 "not used! in row: %d", row) ;
952 sinfo_new_destroy_fit_params(&dec_par) ;
953 sinfo_new_destroy_vector( line ) ;
959 x_position[row] = (float) (column_position[row] - box_length) +
961 printf(
"%d %f %f\n",row, (*par).fit_par[1], x_position[row] ) ;
964 sinfo_new_destroy_fit_params(&dec_par) ;
965 sinfo_new_destroy_vector ( line ) ;
971 if ( NULL == ( list = (dpoint*) cpl_calloc (ly,
sizeof (dpoint)) ) )
982 offset = (double) ly/2. ;
984 for ( row = 0 ; row < ly ; row++ )
986 if ( x_position[row] == 0. )
992 list[ndata].y = (double)x_position[row] ;
993 list[ndata].x = (double)row - offset ;
999 if ( NULL == (coeffs = sinfo_fit_1d_poly(order, list, ndata, NULL)) )
1001 sinfo_msg_error(
"eclipse function sinfo_fit_1d_poly() did not work!") ;
1008 cpl_free(col_value) ;
1009 cpl_free(column_value) ;
1010 cpl_free(col_position) ;
1011 cpl_free(column_position) ;
1012 cpl_free(x_position) ;
1028 sinfo_new_image_warp_fits( cpl_image * image,
1032 cpl_image * warped=NULL;
1034 cpl_polynomial * poly_u=NULL;
1035 cpl_polynomial * poly_v=NULL;
1037 cpl_vector * profile=NULL ;
1038 cpl_size local_pow[2];
1044 poly_u = cpl_polynomial_new(2);
1045 if (poly_u == NULL) {
1050 if (poly_u != NULL) {
1053 if(sinfo_is_fits_file(poly_table) != 1) {
1057 cpl_table* poly_tbl=NULL;
1058 if(NULL==(poly_tbl = cpl_table_load(poly_table,1,0))) {
1060 cpl_polynomial_delete(poly_u) ;
1064 for (
int i=0 ; i<cpl_table_get_nrow(poly_tbl) ; i++) {
1065 local_pow[0] = cpl_table_get_int(poly_tbl,
"degx", i, NULL) ;
1066 local_pow[1] = cpl_table_get_int(poly_tbl,
"degy", i, NULL) ;
1067 cpl_polynomial_set_coeff(poly_u, local_pow,
1068 cpl_table_get_double(poly_tbl,
"coeff", i, NULL)) ;
1071 cpl_table_delete(poly_tbl) ;
1073 sinfo_msg(
"Use the ID polynomial for the arc dist") ;
1076 cpl_polynomial_set_coeff(poly_u, local_pow, 1.0) ;
1079 poly_v=cpl_polynomial_new(2);
1083 cpl_polynomial_set_coeff(poly_v,local_pow,1.0);
1084 profile = cpl_vector_new(CPL_KERNEL_DEF_SAMPLES) ;
1085 cpl_vector_fill_kernel_profile(profile, CPL_KERNEL_TANH,
1086 CPL_KERNEL_DEF_WIDTH) ;
1087 warped=sinfo_new_warp_image_generic(image,kernel_type,poly_u,poly_v);
1106 cpl_vector_delete(profile) ;
1107 if (poly_u!=NULL) cpl_polynomial_delete(poly_u);
1108 if (poly_v!=NULL) cpl_polynomial_delete(poly_v);
#define sinfo_msg_debug(...)
Print a debug message.
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.