33 #include "sinfo_vltPort.h"
43 #include "sinfo_recipes.h"
44 #include "sinfo_globals.h"
53 static double sinfo_chi2 ;
55 static double vec[MAXPAR] ;
56 static double matrix1[MAXPAR][MAXPAR] ;
57 static double matrix2[MAXPAR][MAXPAR] ;
59 static int parptr[MAXPAR] ;
65 #define SQR(a) (sqrarg = (a) , sqrarg*sqrarg)
72 static int new_inv_mat (
void) ;
74 static void new_get_mat (
float * xdat,
83 static int new_get_vec (
float * xdat,
93 new_gaussian (
float * xdat,
float * parlist );
95 new_gaussian_deriv(
float * xdat,
float * parlist,
112 float sinfo_new_f_median(
float * array,
int n)
114 pixelvalue p_array[100];
118 p_array[i]= (pixelvalue) array[i];
120 return (
float) sinfo_new_median(p_array, n);
140 float sinfo_new_clean_mean(
float * array,
143 float throwaway_high )
155 if ( n_elements <= 0 )
161 if ( throwaway_low < 0. || throwaway_high < 0. ||
162 throwaway_low + throwaway_high >= 100. )
168 lo_n = (int) (throwaway_low * (
float)n_elements / 100.) ;
169 hi_n = (int) (throwaway_high * (
float)n_elements / 100.) ;
172 sinfo_pixel_qsort( array, n_elements ) ;
176 for ( i = lo_n ; i < n_elements - hi_n ; i++ )
178 if ( !isnan(array[i]) )
190 return sum/(float)n ;
207 pixelvalue sinfo_new_median(pixelvalue * array,
int n)
211 if ( array == NULL || n <= 0 )
222 sinfo_pixel_qsort((
float*) array, n) ;
229 med = (array[n/2] + array[n/2 - 1])/2. ;
285 int sinfo_new_lsqfit_c (
float * xdat,
309 if ( *tol < (FLT_EPSILON * 10.0 ) )
311 tolerance = FLT_EPSILON * 10.0 ;
318 labda = fabs( *lab ) * LABFAC ;
319 for ( i = 0 ; i < (*npar) ; i++ )
323 if ( nfree > MAXPAR )
327 parptr[nfree++] = i ;
336 for ( n = 0 ; n < (*ndat) ; n++ )
351 for ( i = 0 ; i < nfree ; fpar[parptr[i++]] = 0.0 ) ;
352 new_get_mat ( xdat, xdim, ydat, wdat, ndat, fpar, epar ) ;
353 r = new_get_vec ( xdat, xdim, ydat, wdat, ndat, fpar, epar, npar ) ;
358 for ( i = 0 ; i < (*npar) ; i++ )
363 chi1 = sqrt( chi1 / (
double) (nuse - nfree) ) ;
364 for ( i = 0 ; i < nfree ; i++ )
366 if ( (matrix1[i][i] <= 0.0 ) || (matrix2[i][i] <= 0.0) )
370 epar[parptr[i]] = chi1 * sqrt( matrix2[i][i] ) /
371 sqrt( matrix1[i][i] ) ;
391 if ( itc++ == (*its) )
395 new_get_mat( xdat, xdim, ydat, wdat, ndat, fpar, epar) ;
401 if ( labda > LABMIN )
403 labda = labda / LABFAC ;
405 r = new_get_vec( xdat, xdim, ydat, wdat, ndat, fpar, epar, npar ) ;
411 while ( chi1 >= sinfo_chi2 )
419 if ( labda > LABMAX )
423 labda = labda * LABFAC ;
424 r = new_get_vec(xdat,xdim,ydat,wdat,ndat,fpar,epar,npar) ;
431 if ( labda <= LABMAX )
433 for ( i = 0 ; i < *npar ; i++ )
438 if ( (fabs( sinfo_chi2 - chi1 ) <= (tolerance * chi1)) ||
448 new_get_mat(xdat,xdim,ydat,wdat,ndat,fpar,epar) ;
449 r = new_get_vec(xdat,xdim,ydat,wdat,ndat,fpar,epar,npar) ;
455 for ( i = 0 ; i < (*npar) ; i++ )
459 sinfo_chi2 = sqrt ( sinfo_chi2 / (
double) (nuse - nfree) ) ;
461 for ( i = 0 ; i < nfree ; i++ )
463 if ( (matrix1[i][i] <= 0.0) || (matrix2[i][i] <= 0.0) )
467 epar[parptr[i]] = sinfo_chi2 * sqrt( matrix2[i][i] ) /
468 sqrt( matrix1[i][i] ) ;
485 void sinfo_new_convert_ZEROs_to_0_for_images(cpl_image * im)
497 ilx=cpl_image_get_size_x(im);
498 ily=cpl_image_get_size_y(im);
499 pidata=cpl_image_get_data(im);
500 for ( i = 0 ; i < (int) ilx*ily ; i++ )
502 if( isnan(pidata[i]) )
518 void sinfo_new_convert_ZEROs_to_0_for_cubes(cpl_imagelist * cube)
528 inp=cpl_imagelist_get_size(cube);
530 for ( i = 0 ; i < inp ; i++ )
532 cpl_image* i_img=cpl_imagelist_get(cube,i);
533 sinfo_new_convert_ZEROs_to_0_for_images(i_img) ;
534 cpl_imagelist_set(cube,i_img,i);
549 sinfo_new_convert_ZEROs_to_0_for_cubes_range(cpl_imagelist * cube,
550 const int z_min,
const int z_max)
559 for ( i = z_min ; i < z_max ; i++ )
561 cpl_image* i_img=cpl_imagelist_get(cube,i);
562 sinfo_new_convert_ZEROs_to_0_for_images(i_img) ;
563 cpl_imagelist_set(cube,i_img,i);
573 void sinfo_new_convert_0_to_ZEROs_for_images(cpl_image * im)
585 ilx=cpl_image_get_size_x(im);
586 ily=cpl_image_get_size_y(im);
587 pidata=cpl_image_get_data(im);
588 for ( i = 0 ; i < (int) ilx*ily ; i++ )
590 if( pidata[i] == 0. )
604 void sinfo_new_convert_0_to_ZERO_for_cubes(cpl_imagelist * cube)
614 inp=cpl_imagelist_get_size(cube);
615 for ( i = 0 ; i < inp ; i++ )
617 cpl_image* i_img=cpl_imagelist_get(cube,i);
618 sinfo_new_convert_0_to_ZEROs_for_images(i_img) ;
619 cpl_imagelist_set(cube,i_img,i);
634 sinfo_new_convert_0_to_ZERO_for_cubes_range(cpl_imagelist * cube,
635 const int z_min,
const int z_max)
646 for ( i = z_min ; i < z_max ; i++ )
648 cpl_image* i_img=cpl_imagelist_get(cube,i);
649 sinfo_new_convert_0_to_ZEROs_for_images(i_img) ;
650 cpl_imagelist_set(cube,i_img,i);
660 void sinfo_new_invert(cpl_image * im)
667 ilx=cpl_image_get_size_x(im);
668 ily=cpl_image_get_size_y(im);
669 pidata=cpl_image_get_data(im);
671 for ( i = 0 ; i < (int) ilx*ily ; i++ )
673 pidata[i] = -pidata[i] ;
685 int sinfo_new_nint (
double x )
692 if ( (x - (
double) k) <= 0.5 )
703 if ( (x - (
double) k) <= -0.5 )
728 #define STEP_MIN (-half_search)
729 #define STEP_MAX (half_search)
731 double * sinfo_new_xcorrel(
744 double mean_i, mean_t ;
745 double rms_i, rms_t ;
756 for (i=0 ; i<width_i ; i++) {
757 sum += (double)line_i[i] ;
758 sqsum += (double)line_i[i] * (
double)line_i[i];
760 mean_i = sum / (double)width_i ;
761 sqsum /= (double)width_i ;
762 rms_i = sqsum - mean_i*mean_i ;
765 for (i=0 ; i<width_t ; i++) {
766 sum += (double)line_t[i] ;
767 sqsum += (double)line_t[i] * (
double)line_t[i];
769 mean_t = sum / (double)width_t ;
770 sqsum /= (double)width_t ;
771 rms_t = sqsum - mean_t*mean_t ;
773 norm = 1.00 / sqrt(rms_i * rms_t);
775 nsteps = (STEP_MAX - STEP_MIN) ;
776 xcorr = cpl_malloc(nsteps *
sizeof(
double));
777 for (step=STEP_MIN ; step<STEP_MAX ; step++) {
778 xcorr[step-STEP_MIN] = 0.00 ;
780 for (i=0 ; i<width_t ; i++) {
782 (i+step < width_i)) {
783 xcorr[step-STEP_MIN] += ((double)line_t[i] - mean_t) *
784 ((double)line_i[i+step] - mean_i) *
789 xcorr[step-STEP_MIN] /= (double)nval ;
791 *xcorr_max = xcorr[0] ;
793 for (i=0 ; i<nsteps ; i++) {
794 if (xcorr[i]>*xcorr_max) {
796 *xcorr_max = xcorr[i];
799 (*delta) = + (STEP_MIN + *maxpos);
826 double sinfo_nev_ille(
double x[],
double f[],
int n,
double z,
int* flag)
863 for (k = 1; k <= n; k++)
866 for (m = 1; m <= k; m++)
868 factor = (z - x[k]) / (x[k] - x[k-m]);
869 p[m] = p[m-1] + factor * (p[m-1] - q[m-1]);
873 for (m = 0; m <= k; m++)
885 float sinfo_new_nev_ille(
float x[],
float f[],
int n,
float z,
int* flag)
922 for (k = 1; k <= n; k++)
925 for (m = 1; m <= k; m++)
927 factor = (z - x[k]) / (x[k] - x[k-m]);
928 p[m] = p[m-1] + factor * (p[m-1] - q[m-1]);
932 for (m = 0; m <= k; m++)
967 static int new_get_vec (
float * xdat,
983 for ( j = 0 ; j < nfree ; j++ )
985 mjj = matrix1[j][j] ;
991 for ( i = 0 ; i < j ; i++ )
993 mji = matrix1[j][i] / mjj / sqrt( matrix1[i][i] ) ;
994 matrix2[i][j] = matrix2[j][i] = mji ;
996 matrix2[j][j] = 1.0 + labda ;
999 if ( (r = new_inv_mat()) )
1004 for ( i = 0 ; i < (*npar) ; i ++ )
1010 for ( j = 0 ; j < nfree ; j++ )
1013 mjj = matrix1[j][j] ;
1018 mjj = sqrt ( mjj ) ;
1019 for ( i = 0 ; i < nfree ; i++ )
1021 mii = matrix1[i][i] ;
1027 dj += vec[i] * matrix2[j][i] / mjj / mii ;
1029 epar[parptr[j]] += dj ;
1034 for ( n = 0 ; n < (*ndat) ; n++ )
1036 double wn = wdat[n] ;
1039 dy = ydat[n] - new_gaussian( &xdat[(*xdim) * n], epar ) ;
1040 chi1 += wdat[n] * dy * dy ;
1062 static void new_get_mat (
float * xdat,
1072 for (
int j = 0 ; j < nfree ; j++ )
1075 for (
int i = 0 ; i<= j ; i++ )
1078 matrix1[j][i] = 0.0 ;
1084 for (
int n = 0 ; n < (*ndat) ; n++ )
1086 double wn = wdat[n] ;
1089 double yd = ydat[n] - new_gaussian( &xdat[(*xdim) * n], fpar ) ;
1090 new_gaussian_deriv( &xdat[(*xdim) * n], fpar, epar ) ;
1091 sinfo_chi2 += yd * yd * wn ;
1092 for (
int j = 0 ; j < nfree ; j++ )
1094 double wd = epar[parptr[j]] * wn ;
1096 for (
int i = 0 ; i <= j ; i++ )
1098 matrix1[j][i] += epar[parptr[i]] * wd ;
1118 static int new_inv_mat (
void)
1128 for ( i = 0 ; i < nfree ; i++ )
1133 for ( j = 0 ; j < nfree ; j++ )
1136 double rowmax = fabs ( matrix2[j][j] ) ;
1139 for ( i = j + 1 ; i < nfree ; i++ )
1141 if ( fabs ( matrix2[i][j] ) > rowmax )
1143 rowmax = fabs( matrix2[i][j] ) ;
1149 if ( matrix2[row][j] == 0.0 )
1157 for ( k = 0 ; k < nfree ; k++ )
1159 even = matrix2[j][k] ;
1160 matrix2[j][k] = matrix2[row][k] ;
1161 matrix2[row][k] = even ;
1170 even = 1.0 / matrix2[j][j] ;
1171 for ( i = 0 ; i < nfree ; i++ )
1173 matrix2[i][j] *= even ;
1175 matrix2[j][j] = even ;
1177 for ( k = 0 ; k < j ; k++ )
1179 mjk = matrix2[j][k] ;
1180 for ( i = 0 ; i < j ; i++ )
1182 matrix2[i][k] -= matrix2[i][j] * mjk ;
1184 for ( i = j + 1 ; i < nfree ; i++ )
1186 matrix2[i][k] -= matrix2[i][j] * mjk ;
1188 matrix2[j][k] = -even * mjk ;
1191 for ( k = j + 1 ; k < nfree ; k++ )
1193 mjk = matrix2[j][k] ;
1194 for ( i = 0 ; i < j ; i++ )
1196 matrix2[i][k] -= matrix2[i][j] * mjk ;
1198 for ( i = j + 1 ; i < nfree ; i++ )
1200 matrix2[i][k] -= matrix2[i][j] * mjk ;
1202 matrix2[j][k] = -even * mjk ;
1207 for ( i = 0 ; i < nfree ; i++ )
1209 for ( k = 0 ; k < nfree ; k++ )
1211 hv[per[k]] = matrix2[i][k] ;
1213 for ( k = 0 ; k < nfree ; k++ )
1215 matrix2[i][k] = hv[k] ;
1246 float new_gaussian (
float * xdat,
float * parlist )
1251 xd = fabs((
double) parlist[1]) ;
1252 x = (double) xdat[0] - (
double) parlist[2] ;
1254 (double) parlist[0] * exp( -4.0 * log(2.0) * (x/xd) * (x/xd) )
1255 + (
double) parlist[3] ) ;
1284 new_gaussian_deriv(
float * xdat,
float * parlist,
float * dervs )
1289 xd = fabs( (
double) parlist[1] ) ;
1292 x = (double) xdat[0] - (
double) parlist[2] ;
1295 expon = -4.0 * log(2.0) * (x/xd) * (x/xd) ;
1296 expon = exp( expon ) ;
1299 dervs[0] = (float) expon ;
1302 expon = (double) parlist[0] * expon ;
1305 dervs[1] = (float) ( expon * 8.0 * log(2.0) * x*x / (xd*xd*xd) ) ;
1308 dervs[2] = (float) (expon * 8.0 * log(2.0) * x/(xd*xd) ) ;
1338 sinfo_my_fit(
float x[],
float y[],
int ndata,
float sig[],
int mwt,
float *a,
1339 float *b,
float *siga,
float *sigb,
float *chi2,
float *q)
1342 float t, sxoss, sx=0., sy=0., st2=0., ss ;
1348 for ( i = 0 ; i < ndata ; i++ )
1350 float wt = 1./SQR(sig[i]) ;
1358 for ( i = 0 ; i < ndata ; i++ )
1369 for ( i = 0 ; i < ndata ; i ++ )
1371 t = (x[i] - sxoss)/sig[i] ;
1373 *b += t*y[i]/sig[i] ;
1378 for ( i = 0 ; i < ndata ; i++ )
1387 *a = (sy - sx*(*b))/ss ;
1388 *siga = sqrt ((1.0 + sx*sx/(ss*st2))/ss) ;
1389 *sigb = sqrt (1.0/st2) ;
1393 for ( i = 0 ; i < ndata ; i++ )
1395 *chi2 += SQR (y[i] - (*a) - (*b)*x[i]) ;
1403 float sigdat = sqrt ((*chi2)/(ndata - 2)) ;
1409 for (i = 0 ; i < ndata ; i++)
1411 *chi2 += SQR ((y[i] - (*a) - (*b) * x[i])/sig[i]) ;
1431 int sinfo_new_correlation (
float * data1,
float * data2,
int ndata )
1436 float* corsum=NULL ;
1438 int i, j, k, position, shift ;
1445 if ( NULL == data1 || NULL == data2 || ndata <= 1 )
1452 help=cpl_calloc(ndata+300,
sizeof(
float));
1453 for ( i = 0 ; i < ndata3 ; i++ )
1459 for ( i = 0 ; i < ndata ; i++ )
1461 help[(300/2) + i] = data2[i] ;
1465 corsum=cpl_calloc(ndata+300,
sizeof(
float));
1466 for ( j = 0 ; j < ndata3 ; j++ )
1468 if ( ndata3-j <= ndata)
1473 for ( k = 0 ; k < limit ; k++ )
1479 corsum[j] += data1[k] * help[k + j] ;
1486 for ( i = 0 ; i < ndata3 ; i++ )
1488 if ( maxval < corsum[i] )
1490 maxval = corsum[i] ;
1496 shift = position - 300/2 ;
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.