30 #include "sinfo_vltPort.h"
40 #include "sinfo_absolute.h"
41 #include "sinfo_recipes.h"
52 #define LABMAXA 1.0e+10
53 #define LABMINA 1.0e-10
63 static double vec[NPAR] ;
64 static double matrix1[NPAR][NPAR] ;
65 static double matrix2[NPAR][NPAR] ;
67 static int parptr[NPAR] ;
73 static int sinfo_new_inv_mat (
void) ;
75 static void sinfo_new_get_mat (
float * xdat,
84 static int sinfo_new_get_vec (
float * xdat,
125 float sinfo_new_boltz (
float * xdat,
float * parlist )
131 (parlist[0] - parlist[1]) / (1 + exp(( xdat[0] - parlist[2] ) /
132 parlist[3])) + parlist[1] ;
134 return return_value ;
159 void sinfo_new_boltz_deriv(
float * xdat,
float * parlist,
float * dervs )
163 subst = (xdat[0] - parlist[2]) / parlist[3] ;
165 dervs[0] = 1. / ( 1. + exp(subst) ) ;
167 dervs[1] = -1. / ( 1. + exp(subst) ) + 1. ;
169 dervs[2] = ( (parlist[0] - parlist[1]) / parlist[3] * exp(subst) ) /
170 ( (1. + exp(subst)) * (1. + exp(subst)) ) ;
172 dervs[3] = ( (parlist[0] - parlist[1]) * (xdat[0] - parlist[2]) /
173 (parlist[3]*parlist[3]) * exp(subst) ) /
174 ( (1. + exp(subst)) * (1. + exp(subst)) ) ;
188 static int sinfo_new_inv_mat (
void)
199 for ( i = 0 ; i < nfree ; i++ )
204 for ( j = 0 ; j < nfree ; j++ )
207 double rowmax = fabs ( matrix2[j][j] ) ;
210 for ( i = j + 1 ; i < nfree ; i++ )
212 if ( fabs ( matrix2[i][j] ) > rowmax )
214 rowmax = fabs( matrix2[i][j] ) ;
220 if ( matrix2[row][j] == 0.0 )
228 for ( k = 0 ; k < nfree ; k++ )
230 even = matrix2[j][k] ;
231 matrix2[j][k] = matrix2[row][k] ;
232 matrix2[row][k] = even ;
241 even = 1.0 / matrix2[j][j] ;
242 for ( i = 0 ; i < nfree ; i++ )
244 matrix2[i][j] *= even ;
246 matrix2[j][j] = even ;
248 for ( k = 0 ; k < j ; k++ )
250 mjk = matrix2[j][k] ;
251 for ( i = 0 ; i < j ; i++ )
253 matrix2[i][k] -= matrix2[i][j] * mjk ;
255 for ( i = j + 1 ; i < nfree ; i++ )
257 matrix2[i][k] -= matrix2[i][j] * mjk ;
259 matrix2[j][k] = -even * mjk ;
262 for ( k = j + 1 ; k < nfree ; k++ )
264 mjk = matrix2[j][k] ;
265 for ( i = 0 ; i < j ; i++ )
267 matrix2[i][k] -= matrix2[i][j] * mjk ;
269 for ( i = j + 1 ; i < nfree ; i++ )
271 matrix2[i][k] -= matrix2[i][j] * mjk ;
273 matrix2[j][k] = -even * mjk ;
278 for ( i = 0 ; i < nfree ; i++ )
280 for ( k = 0 ; k < nfree ; k++ )
282 hv[per[k]] = matrix2[i][k] ;
284 for ( k = 0 ; k < nfree ; k++ )
286 matrix2[i][k] = hv[k] ;
309 static void sinfo_new_get_mat (
float * xdat,
322 for ( j = 0 ; j < nfree ; j++ )
325 for ( i = 0 ; i<= j ; i++ )
328 matrix1[j][i] = 0.0 ;
334 for ( n = 0 ; n < (*ndat) ; n++ )
336 double wn = wdat[n] ;
339 yd = ydat[n] - sinfo_new_boltz( &xdat[(*xdim) * n], fpar ) ;
340 sinfo_new_boltz_deriv( &xdat[(*xdim) * n], fpar, epar ) ;
341 chi2 += yd * yd * wn ;
342 for ( j = 0 ; j < nfree ; j++ )
344 wd = epar[parptr[j]] * wn ;
346 for ( i = 0 ; i <= j ; i++ )
348 matrix1[j][i] += epar[parptr[i]] * wd ;
379 static int sinfo_new_get_vec (
float * xdat,
397 for ( j = 0 ; j < nfree ; j++ )
399 mjj = matrix1[j][j] ;
405 for ( i = 0 ; i < j ; i++ )
407 mji = matrix1[j][i] / mjj / sqrt( matrix1[i][i] ) ;
408 matrix2[i][j] = matrix2[j][i] = mji ;
410 matrix2[j][j] = 1.0 + labda ;
413 if ( (r = sinfo_new_inv_mat()) )
418 for ( i = 0 ; i < (*npar) ; i ++ )
424 for ( j = 0 ; j < nfree ; j++ )
427 mjj = matrix1[j][j] ;
433 for ( i = 0 ; i < nfree ; i++ )
435 mii = matrix1[i][i] ;
441 dj += vec[i] * matrix2[j][i] / mjj / mii ;
443 epar[parptr[j]] += dj ;
448 for ( n = 0 ; n < (*ndat) ; n++ )
450 double wn = wdat[n] ;
453 dy = ydat[n] - sinfo_new_boltz( &xdat[(*xdim) * n], epar) ;
454 chi1 += wdat[n] * dy * dy ;
516 int sinfo_new_lsqfit (
float * xdat,
540 if ( *tol < (FLT_EPSILON * 10.0 ) )
542 tolerance = FLT_EPSILON * 10.0 ;
549 labda = fabs( *lab ) * LABFACA ;
550 for ( i = 0 ; i < (*npar) ; i++ )
558 parptr[nfree++] = i ;
567 for ( n = 0 ; n < (*ndat) ; n++ )
582 for ( i = 0 ; i < nfree ; fpar[parptr[i++]] = 0.0 ) ;
583 sinfo_new_get_mat(xdat,xdim,ydat,wdat,ndat,fpar,epar ) ;
584 r = sinfo_new_get_vec(xdat,xdim,ydat,wdat,ndat,fpar,epar,npar) ;
589 for ( i = 0 ; i < (*npar) ; i++ )
594 chi1 = sqrt( chi1 / (
double) (nuse - nfree) ) ;
595 for ( i = 0 ; i < nfree ; i++ )
597 if ( (matrix1[i][i] <= 0.0 ) || (matrix2[i][i] <= 0.0) )
601 epar[parptr[i]] = chi1 * sqrt( matrix2[i][i] ) /
602 sqrt( matrix1[i][i] ) ;
624 if ( itc++ == (*its) )
628 sinfo_new_get_mat(xdat,xdim,ydat,wdat,ndat,fpar,epar) ;
634 if ( labda > LABMINA )
636 labda = labda / LABFACA ;
638 r = sinfo_new_get_vec ( xdat, xdim, ydat, wdat,
639 ndat, fpar, epar, npar ) ;
646 while ( chi1 >= chi2 )
654 if ( labda > LABMAXA )
658 labda = labda * LABFACA ;
659 r = sinfo_new_get_vec ( xdat, xdim, ydat, wdat,
660 ndat, fpar, epar, npar ) ;
668 if ( labda <= LABMAXA )
670 for ( i = 0 ; i < *npar ; i++ )
675 if ( (fabs( chi2 - chi1 ) <= (tolerance * chi1)) ||
685 sinfo_new_get_mat(xdat,xdim,ydat,wdat,ndat,fpar,epar);
686 r = sinfo_new_get_vec(xdat,xdim,ydat,wdat,ndat,fpar,epar,npar);
692 for ( i = 0 ; i < (*npar) ; i++ )
696 chi2 = sqrt ( chi2 / (
double) (nuse - nfree) ) ;
698 for ( i = 0 ; i < nfree ; i++ )
700 if ( (matrix1[i][i] <= 0.0) || (matrix2[i][i] <= 0.0) )
704 epar[parptr[i]] = chi2 * sqrt( matrix2[i][i] ) /
705 sqrt( matrix1[i][i] ) ;
757 int sinfo_new_fit_slits_boltz ( cpl_image * lineImage,
764 float* position=NULL ;
765 int * sinfo_edge, * edgeclean ;
767 int * pos_row, * pos_rowclean ;
768 Vector * box_buffer ;
769 Vector * half_buffer ;
777 int nel, n_right, left_right ;
778 int n_buf, edge_ind, shift ;
784 int iters, xdim, ndat ;
787 float * xdat, * wdat ;
790 float dervpar[NPAR] ;
791 float minval, maxval ;
793 float pos, last_pos ;
801 slit_length = SLITLENGTH ;
802 if ( NULL == lineImage )
814 if ( NULL == slit_pos )
820 if ( box_length < 4 ||
821 box_length > 2*slit_length )
827 if ( y_box <= 0. || y_box > 6. )
840 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
841 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
842 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
843 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
844 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
853 while( agreed == -1 )
856 float max_intensity = -FLT_MAX ;
857 for ( col = 0 ; col < slit_length ; col++ )
859 for ( i = 0 ; i < par[0]->n_params ; i++ )
861 if ( par[i]->column == col && par[i]->line != bad_line )
863 if ( par[i]->fit_par[0] > max_intensity )
865 if ( par[i]->fit_par[1] >= 1. &&
866 par[i]->fit_par[2] > 0. )
868 max_intensity = par[i]->fit_par[0] ;
880 line = par[found]->line ;
881 int column = par[found]->column ;
882 double row_pos = par[found]->fit_par[2] ;
883 if ( found >= 0 && max_intensity > 0. )
885 for ( i = 0 ; i < par[0]->n_params ; i++ )
887 if ( par[i]->line == line-1 &&
888 par[i]->column == column + slit_length )
890 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
891 par[i]->fit_par[2] >= (row_pos - y_box) )
897 if ( bad_line != line )
906 cpl_free( sinfo_edge ) ;
907 cpl_free( pos_row ) ;
908 cpl_free( edgeclean ) ;
909 cpl_free( dummyedge ) ;
910 cpl_free( pos_rowclean ) ;
919 sinfo_msg_error(
" no emission line found in the first image columns") ;
920 cpl_free( sinfo_edge ) ;
921 cpl_free( pos_row ) ;
922 cpl_free( edgeclean ) ;
923 cpl_free( dummyedge ) ;
924 cpl_free( pos_rowclean ) ;
928 ilx=cpl_image_get_size_x(lineImage);
929 ily=cpl_image_get_size_y(lineImage);
930 pidata=cpl_image_get_data_float(lineImage);
935 position=cpl_calloc(ilx,
sizeof(
float)) ;
938 for ( col = slit_length/2 ; col < ilx - slit_length/2 ; col++ )
940 for ( i = 0 ; i < par[0]->n_params ; i++ )
946 if ( par[i]->column == col && par[i]->line == line )
948 if ( par[i]->fit_par[0] > 0. &&
949 par[i]->fit_par[1] >= 1. &&
950 par[i]->fit_par[2] > 0. )
952 position[n] = par[i]->fit_par[2] ;
955 fabs(position[n] - position[n-1]) > y_box &&
956 (col-old_col) > (slit_length-SLIT_POS_ERR) )
960 sinfo_edge[ed] = col ;
961 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
965 if ( col >= ilx - slit_length - SLIT_POS_ERR ) {
966 pos_row[ed] = sinfo_new_nint( position[n] ) ;
968 }
else if ( ((col-old_col) >
969 (slit_length+SLIT_POS_ERR)) &&
972 sinfo_edge[ed] = col ;
973 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
975 ed,sinfo_edge[ed],pos_row[ed]);
977 if ( col >= ilx - slit_length - SLIT_POS_ERR ) {
978 pos_row[ed] = sinfo_new_nint( position[n] ) ;
983 }
else if ( ((col-old_col) > (slit_length+SLIT_POS_ERR)) &&
989 position[n] = old_pos ;
991 old_col+=slit_length;
992 sinfo_edge[ed] = old_col; ;
993 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
997 ed,sinfo_edge[ed],pos_row[ed]);
999 if ( old_col >= ilx - slit_length - SLIT_POS_ERR ) {
1000 pos_row[ed] = old_pos ;
1008 if ( ed < (N_SLITLETS - 1) )
1011 cpl_free( sinfo_edge ) ;
1012 cpl_free( pos_row ) ;
1013 cpl_free( edgeclean ) ;
1014 cpl_free( dummyedge ) ;
1015 cpl_free( pos_rowclean ) ;
1016 cpl_free( position );
1022 for ( i = 1 ; i <= ed ; i ++ )
1026 if ( (sinfo_edge[i-1] - sinfo_edge[i-2]) <
1027 slit_length - SLIT_LEN_ERR ||
1028 (sinfo_edge[i-1] - sinfo_edge[i-2]) >
1029 slit_length + SLIT_LEN_ERR )
1033 dummyedge[i-1] = -1 ;
1036 if (dummyedge[i-1] != -1)
1038 dummyedge[i-1] = sinfo_edge[i-1] ;
1046 if ( (sinfo_edge[i] - sinfo_edge[i-1]) <
1047 slit_length - SLIT_LEN_ERR ||
1048 (sinfo_edge[i] - sinfo_edge[i-1]) >
1049 slit_length + SLIT_LEN_ERR )
1055 if ( i+1 < ed && dummyedge[i] != -1 )
1057 if ( (sinfo_edge[i+1] - sinfo_edge[i]) <
1058 slit_length - SLIT_LEN_ERR ||
1059 (sinfo_edge[i+1] - sinfo_edge[i]) >
1060 slit_length + SLIT_LEN_ERR )
1063 dummyedge[i+1] = -1 ;
1069 for ( i = 0 ; i < ed ; i++ )
1071 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
1073 edgeclean[k] = dummyedge[i] ;
1074 pos_rowclean[k] = pos_row[i] ;
1076 if( edgeclean[k-1] > (ilx - slit_length -2*SLIT_LEN_ERR ) )
1078 pos_rowclean[k] = pos_row[ed] ;
1088 if ( k != N_SLITLETS - 1 )
1091 cpl_free( sinfo_edge ) ;
1092 cpl_free( pos_row ) ;
1093 cpl_free( edgeclean ) ;
1094 cpl_free( dummyedge ) ;
1095 cpl_free( pos_rowclean ) ;
1100 margin = box_length / 2 ;
1108 ( (pos_rowclean[0]-sinfo_new_nint(y_box)) < 0 ) ||
1109 ( (pos_rowclean[0]+sinfo_new_nint(y_box)) >ily )
1113 cpl_free( sinfo_edge ) ;
1114 cpl_free( pos_row ) ;
1115 cpl_free( edgeclean ) ;
1116 cpl_free( dummyedge ) ;
1117 cpl_free( pos_rowclean ) ;
1122 for ( j = 0 ; j <= k ; j++ )
1127 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
1128 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
1131 for ( row = pos_rowclean[0] - sinfo_new_nint(y_box) ;
1132 row <= pos_rowclean[0] + sinfo_new_nint(y_box) ; row++ )
1134 if ( maxval < pidata[col + ilx*row] )
1136 maxval = pidata[col + ilx*row] ;
1139 box_buffer->data[m] = maxval ;
1145 box_buffer = sinfo_new_vector( edgeclean[j] -
1146 edgeclean[j-1] + 2*margin ) ;
1147 for ( col = edgeclean[j - 1] - margin ;
1148 col < edgeclean[j] + margin ; col++ )
1151 for ( row = pos_rowclean[j] - sinfo_new_nint(y_box) ;
1152 row <= pos_rowclean[j] + sinfo_new_nint(y_box) ; row++ )
1154 if ( maxval < pidata[col + ilx*row] )
1156 maxval = pidata[col + ilx*row] ;
1159 box_buffer->data[m] = maxval ;
1165 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
1166 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
1169 for ( row = pos_rowclean[k-2] - sinfo_new_nint(y_box) ;
1170 row <= pos_rowclean[k-2] + sinfo_new_nint(y_box) ; row++ )
1172 if ( maxval < pidata[col + ilx*row] )
1174 maxval = pidata[col + ilx*row] ;
1177 if(maxval>0) box_buffer->data[m] = maxval ;
1178 else box_buffer->data[m] = 0;
1185 double min = FLT_MAX ;
1186 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1188 if ( box_buffer -> data[i] < min )
1190 min = box_buffer -> data[i] ;
1194 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
1197 if ( left_right == 0 )
1199 nel = box_buffer -> n_elements / 2 ;
1203 if ( box_buffer -> n_elements % 2 == 0 )
1205 nel = box_buffer -> n_elements / 2 ;
1209 nel = box_buffer -> n_elements / 2 + 1 ;
1215 half_buffer = sinfo_new_vector( nel ) ;
1216 if ( left_right == 0 )
1218 for ( i = 0 ; i < nel ; i++ )
1220 half_buffer -> data[i] = box_buffer -> data[i] ;
1226 for ( i = box_buffer -> n_elements - 1 ;
1227 i >= box_buffer -> n_elements - nel ; i-- )
1229 half_buffer -> data[n_right] = box_buffer -> data[i] ;
1234 xdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
1235 wdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
1236 mpar = (
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
1241 for ( i = 0 ; i < nel ; i++ )
1245 if ( half_buffer -> data[i] < minval )
1247 minval = half_buffer -> data[i] ;
1249 if ( half_buffer -> data[i] > maxval )
1251 maxval = half_buffer -> data[i] ;
1255 fitpar[0] = minval ;
1256 fitpar[1] = maxval ;
1261 for ( i = 0 ; i < nel ; i++ )
1263 if ( half_buffer -> data[i] >= ( maxval + minval ) / 2. )
1279 n_buf = half_buffer->n_elements + margin ;
1280 in_buffer = sinfo_new_vector( n_buf ) ;
1281 for ( i = 0 ; i < margin ; i++ )
1283 in_buffer -> data[i] = min ;
1286 for ( i = margin ; i < n_buf ; i++ )
1288 in_buffer -> data[i] = half_buffer -> data[shift] ;
1291 sinfo_new_destroy_vector ( half_buffer ) ;
1292 half_buffer = sinfo_new_vector ( n_buf ) ;
1293 for ( i = 0 ; i < n_buf ; i++ )
1295 half_buffer -> data[i] = in_buffer -> data[i] ;
1299 sinfo_new_destroy_vector ( in_buffer ) ;
1305 fitpar[2] = (float)init1 ;
1309 for ( i = 0 ; i < NPAR ; i++ )
1323 if ( 0 > ( iters = sinfo_new_lsqfit( xdat, &xdim,
1324 half_buffer -> data,
1325 wdat, &ndat, fitpar,
1326 dervpar, mpar, &numpar,
1327 &tol, &its, &lab )) )
1331 " error no.: %d in slitlet: %d", iters, j) ;
1332 fitpar[2] = (float)init1 ;
1336 if ( edge_ind == 1 )
1338 pos -= (float)margin ;
1348 if ( left_right == 0 )
1354 if ( fabs(pos - ((
float)edgeclean[0] - 1. -
1355 (
float)slit_length)) < diff_tol )
1357 slit_pos[0][0] = pos ;
1362 "left position of slitlet 0") ;
1363 if ( (
float) edgeclean[0] - 1. -
1364 (
float)slit_length < 0. )
1366 slit_pos[0][0] = 0. ;
1370 slit_pos[0][0] = (float)edgeclean[0] - 1. -
1371 (
float)slit_length ;
1377 if ( fabs( pos - (
float)margin ) < diff_tol )
1379 slit_pos[j][0] = pos + (float)edgeclean[j-1] -
1385 "left position of slitlet %d", j) ;
1386 slit_pos[j][0] = (float)edgeclean[j-1] - 1. ;
1391 if ( fabs( pos - (
float)margin ) < diff_tol )
1393 slit_pos[k][0] = pos + (float)edgeclean[k-1] -
1399 "left position of slitlet %d", j) ;
1400 slit_pos[k][0] = (float)edgeclean[k-1] - 1. ;
1410 if ( fabs( (
float)box_buffer->n_elements - pos -
1411 (
float)edgeclean[0] ) < diff_tol )
1413 slit_pos[0][1] = (float)(box_buffer->n_elements - 1) -
1419 "right position of slitlet 0") ;
1420 slit_pos[0][1] = (float)edgeclean[0] - 1. ;
1425 if ( fabs( (
float)box_buffer->n_elements - pos
1426 + (
float)edgeclean[j-1] - (
float)margin -
1427 (
float)edgeclean[j] ) < diff_tol )
1429 slit_pos[j][1] = (float)(box_buffer->n_elements - 1) -
1431 + (float)edgeclean[j-1] - (
float)margin ;
1436 "right position of slitlet %d", j) ;
1437 slit_pos[j][1] = (float)edgeclean[j] - 1. ;
1442 if ( edgeclean[k-1] + slit_length > ilx )
1444 last_pos = (float)(ilx - 1) ;
1448 last_pos = (float)(edgeclean[k-1] - 1 + slit_length) ;
1450 if ( fabs( (
float)(box_buffer->n_elements - 1) - pos
1451 + (
float)edgeclean[k-1] - (float)margin -
1452 last_pos ) < diff_tol )
1454 slit_pos[k][1] = (float)(box_buffer->n_elements - 1) -
1456 + (float)edgeclean[k-1] - (
float)margin ;
1461 "right position of slitlet %d", j) ;
1462 slit_pos[k][1] = last_pos ;
1467 sinfo_new_destroy_vector ( half_buffer ) ;
1472 sinfo_new_destroy_vector ( box_buffer ) ;
1476 cpl_free( sinfo_edge ) ;
1477 cpl_free( pos_row ) ;
1478 cpl_free( edgeclean ) ;
1479 cpl_free( dummyedge ) ;
1480 cpl_free( pos_rowclean ) ;
1481 cpl_free( position);
1515 sinfo_new_fit_slits_boltz_single_line ( cpl_image * lineImage,
1522 int* position=NULL ;
1523 int * sinfo_edge, * edgeclean ;
1525 int * pos_row, * pos_rowclean ;
1526 Vector * box_buffer ;
1527 Vector * half_buffer ;
1528 Vector * in_buffer ;
1533 int nel, n_right, left_right ;
1534 int n_buf, edge_ind, shift ;
1537 int iters, xdim, ndat ;
1540 float * xdat, * wdat ;
1542 float fitpar[NPAR] ;
1543 float dervpar[NPAR] ;
1544 float minval, maxval ;
1552 slit_length = SLITLENGTH ;
1554 if ( NULL == lineImage )
1560 if ( NULL == slit_pos )
1566 if ( box_length < 4 ||
1567 box_length > 2*slit_length )
1573 if ( y_box <= 0. || y_box > 6. )
1579 ilx=cpl_image_get_size_x(lineImage);
1581 pidata=cpl_image_get_data_float(lineImage);
1583 if ( low_pos >= high_pos || low_pos < 0 ||
1584 high_pos <= 0 || high_pos >= ilx )
1591 sinfo_edge = (
int*) cpl_calloc( ilx/2,
sizeof(
int) ) ;
1592 dummyedge = (
int*) cpl_calloc( ilx/2,
sizeof(
int) ) ;
1593 edgeclean = (
int*) cpl_calloc( ilx/2,
sizeof(
int) ) ;
1594 pos_row = (
int*) cpl_calloc( ilx/2,
sizeof(
int) ) ;
1595 pos_rowclean = (
int*) cpl_calloc( ilx/2,
sizeof(
int) ) ;
1598 position=cpl_calloc(ilx,
sizeof(
int)); ;
1600 for ( col = 0 ; col < ilx ; col++ )
1602 int found_row = -1 ;
1604 for ( row = low_pos ; row <= high_pos ; row++ )
1606 if ( maxval < pidata[col+row*ilx] )
1608 maxval = pidata[col+row*ilx] ;
1612 if ( maxval > -FLT_MAX && found_row > low_pos )
1614 position[col] = found_row ;
1624 for ( col = 0 ; col < (ilx) - 1 ; col++ )
1626 if ( position[col] > 0 && position[col+1] > 0 &&
1627 abs(position[col+1] - position[col]) > 10 )
1629 sinfo_edge[ed] = col ;
1630 pos_row[ed] = position[col] ;
1638 cpl_free( sinfo_edge ) ;
1639 cpl_free( pos_row ) ;
1640 cpl_free( edgeclean ) ;
1641 cpl_free( dummyedge ) ;
1642 cpl_free( pos_rowclean ) ;
1643 cpl_free( position );
1648 for ( i = 1 ; i <= ed ; i ++ )
1652 if ( (sinfo_edge[i-1] - sinfo_edge[i-2]) <
1653 slit_length - SLIT_LEN_ERR ||
1654 (sinfo_edge[i-1] - sinfo_edge[i-2]) >
1655 slit_length + SLIT_LEN_ERR )
1657 dummyedge[i-1] = -1 ;
1660 if (dummyedge[i-1] != -1)
1662 dummyedge[i-1] = sinfo_edge[i-1] ;
1670 if ( (sinfo_edge[i] - sinfo_edge[i-1]) <
1671 slit_length - SLIT_LEN_ERR ||
1672 (sinfo_edge[i] - sinfo_edge[i-1]) >
1673 slit_length + SLIT_LEN_ERR )
1678 if ( i+1 < ed && dummyedge[i] != -1 )
1680 if ( (sinfo_edge[i+1] - sinfo_edge[i]) <
1681 slit_length - SLIT_LEN_ERR ||
1682 (sinfo_edge[i+1] - sinfo_edge[i]) >
1683 slit_length + SLIT_LEN_ERR )
1685 dummyedge[i+1] = -1 ;
1691 for ( i = 0 ; i < ed ; i++ )
1693 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
1695 edgeclean[k] = dummyedge[i] ;
1696 pos_rowclean[k] = pos_row[i] ;
1698 if( edgeclean[k-1] > (ilx - slit_length - 2*SLIT_LEN_ERR ) )
1700 pos_rowclean[k] = pos_row[ed] ;
1706 margin = box_length / 2 ;
1713 for ( j = 0 ; j <= k ; j++ )
1718 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
1719 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
1722 for ( row = pos_rowclean[0] - sinfo_new_nint(y_box) ;
1723 row <= pos_rowclean[0] + sinfo_new_nint(y_box) ; row++ )
1725 if ( maxval < pidata[col + ilx*row] )
1727 maxval = pidata[col + ilx*row] ;
1730 box_buffer->data[m] = maxval ;
1736 box_buffer = sinfo_new_vector( edgeclean[j] -
1737 edgeclean[j-1] + 2*margin ) ;
1738 for ( col = edgeclean[j - 1] - margin ;
1739 col < edgeclean[j] + margin ; col++ )
1742 for ( row = pos_rowclean[j] - sinfo_new_nint(y_box) ;
1743 row <= pos_rowclean[j] + sinfo_new_nint(y_box) ; row++ )
1745 if ( maxval < pidata[col + ilx*row] )
1747 maxval = pidata[col + ilx*row] ;
1750 box_buffer->data[m] = maxval ;
1756 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
1757 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
1765 for ( row = pos_rowclean[k] - sinfo_new_nint(y_box) ;
1766 row <= pos_rowclean[k] + sinfo_new_nint(y_box) ; row++ )
1772 if ( maxval < pidata[col + row * ilx] )
1774 maxval = pidata[col + row * ilx] ;
1777 box_buffer->data[m] = maxval ;
1785 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1787 if ( box_buffer -> data[i] < min )
1789 min = box_buffer -> data[i] ;
1793 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
1796 if ( left_right == 0 )
1798 nel = box_buffer -> n_elements / 2 ;
1802 if ( box_buffer -> n_elements % 2 == 0 )
1804 nel = box_buffer -> n_elements / 2 ;
1808 nel = box_buffer -> n_elements / 2 + 1 ;
1814 half_buffer = sinfo_new_vector( nel ) ;
1815 if ( left_right == 0 )
1817 for ( i = 0 ; i < nel ; i++ )
1819 half_buffer -> data[i] = box_buffer -> data[i] ;
1825 for ( i = box_buffer -> n_elements - 1 ;
1826 i >= box_buffer -> n_elements - nel ; i-- )
1828 half_buffer -> data[n_right] = box_buffer -> data[i] ;
1833 xdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
1834 wdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
1835 mpar = (
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
1840 for ( i = 0 ; i < nel ; i++ )
1844 if ( half_buffer -> data[i] < minval )
1846 minval = half_buffer -> data[i] ;
1848 if ( half_buffer -> data[i] > maxval )
1850 maxval = half_buffer -> data[i] ;
1853 fitpar[0] = minval ;
1854 fitpar[1] = maxval ;
1859 for ( i = 0 ; i < nel ; i++ )
1861 if ( half_buffer -> data[i] >= ( maxval + minval ) / 2. )
1877 n_buf = half_buffer->n_elements + margin ;
1878 in_buffer = sinfo_new_vector( n_buf ) ;
1879 for ( i = 0 ; i < margin ; i++ )
1881 in_buffer -> data[i] = min ;
1884 for ( i = margin ; i < n_buf ; i++ )
1886 in_buffer -> data[i] = half_buffer -> data[shift] ;
1889 sinfo_new_destroy_vector ( half_buffer ) ;
1890 half_buffer = sinfo_new_vector ( n_buf ) ;
1891 for ( i = 0 ; i < n_buf ; i++ )
1893 half_buffer -> data[i] = in_buffer -> data[i] ;
1897 sinfo_new_destroy_vector ( in_buffer ) ;
1903 fitpar[2] = (float)init1 ;
1907 for ( i = 0 ; i < NPAR ; i++ )
1921 if ( 0 > ( iters = sinfo_new_lsqfit( xdat, &xdim,
1922 half_buffer -> data,
1923 wdat, &ndat, fitpar,
1924 dervpar, mpar, &numpar,
1925 &tol, &its, &lab )) )
1928 "no.: %d in slitlet: %d", iters, j) ;
1931 if ( fitpar[3] <=0. )
1934 " of boltzmann function in slitlet: %d", j) ;
1939 if ( edge_ind == 1 )
1941 pos -= (float)margin ;
1951 if ( left_right == 0 )
1957 slit_pos[0][0] = pos ;
1958 if ( slit_pos[0][0] - (
int) slit_pos[0][0] == 0.)
1960 slit_pos[0][0] = 0. ;
1965 slit_pos[j][0] = pos + (float)edgeclean[j-1] -
1967 if ( slit_pos[j][0] - (
int) slit_pos[j][0] == 0.)
1969 slit_pos[j][0] = 0. ;
1974 slit_pos[k][0] = pos + (float)edgeclean[k-1] -
1976 if ( slit_pos[k][0] - (
int) slit_pos[k][0] == 0.)
1978 slit_pos[k][0] = 0. ;
1988 slit_pos[0][1] = (float)(box_buffer->n_elements - 1) - pos;
1989 if ( slit_pos[0][1] - (
int) slit_pos[0][1] == 0.)
1991 slit_pos[0][1] = 0. ;
1996 slit_pos[j][1] = (float)(box_buffer->n_elements - 1) - pos
1997 + (float)edgeclean[j-1] - (
float)margin ;
1998 if ( slit_pos[j][1] - (
int) slit_pos[j][1] == 0.)
2000 slit_pos[j][1] = 0. ;
2006 slit_pos[k][1] = (float)(box_buffer->n_elements - 1) - pos
2007 + (float)edgeclean[k-1] - (
float)margin ;
2008 if ( slit_pos[k][1] - (
int) slit_pos[k][1] == 0.)
2010 slit_pos[k][1] = 0. ;
2015 sinfo_new_destroy_vector ( half_buffer ) ;
2020 sinfo_new_destroy_vector ( box_buffer ) ;
2023 cpl_free( sinfo_edge ) ;
2024 cpl_free( pos_row ) ;
2025 cpl_free( edgeclean ) ;
2026 cpl_free( dummyedge ) ;
2027 cpl_free( pos_rowclean ) ;
2028 cpl_free( position );
2063 sinfo_new_fit_slits_boltz_with_estimate ( cpl_image * lineImage,
2071 int* position=NULL ;
2072 Vector * box_buffer ;
2073 Vector * in_buffer ;
2076 int col_first, col_last ;
2077 int row_first, row_last ;
2083 int iters, xdim, ndat ;
2086 float * xdat, * wdat ;
2088 float fitpar[NPAR] ;
2089 float dervpar[NPAR] ;
2090 float minval, maxval ;
2093 int slitposition[SLITLENGTH] ;
2094 pixelvalue rowpos[SLITLENGTH] ;
2101 slit_length = N_SLITLETS ;
2103 if ( NULL == lineImage )
2109 if ( NULL == slit_pos )
2115 if ( box_length < 4 ||
2116 box_length > 2*slit_length )
2122 if ( y_box <= 0. || y_box > 6. )
2127 if ( diff_tol <= 0. )
2133 ilx=cpl_image_get_size_x(lineImage);
2134 ily=cpl_image_get_size_y(lineImage);
2135 pidata=cpl_image_get_data_float(lineImage);
2137 if ( low_pos >= high_pos || low_pos < 0 ||
2138 high_pos <= 0 || high_pos > ily )
2145 position=cpl_calloc(ilx,
sizeof(
int)) ;
2146 for ( col = 0 ; col < ilx ; col++ )
2148 int found_row = -1 ;
2150 for ( row = low_pos ; row <= high_pos ; row++ )
2152 if ( maxval < pidata[col+row*ilx] )
2154 maxval = pidata[col+row*ilx] ;
2158 if ( maxval > -FLT_MAX && found_row > low_pos )
2160 position[col] = found_row ;
2173 for ( j = 0 ; j < slit_length ; j++ )
2180 for ( col = sinfo_new_nint(slit_pos[j][0])+ 1 ;
2181 col < sinfo_new_nint(slit_pos[j][1]) -1 ; col++ )
2183 rowpos[n] = (pixelvalue)position[col] ;
2187 slitposition[j] = (int)sinfo_new_median(rowpos, n) ;
2188 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
2191 col_first = sinfo_new_nint( slit_pos[j][left_right] ) -
2193 col_last = sinfo_new_nint( slit_pos[j][left_right] ) +
2195 if ( col_first < 0 )
2200 if ( col_last > ilx )
2205 if ( col_last - col_first <= 0 )
2210 box_buffer = sinfo_new_vector( col_last - col_first ) ;
2214 if ( left_right == 0 )
2216 for( col = col_first ; col < col_last ; col++ )
2218 row_first = slitposition[j] - sinfo_new_nint(y_box) ;
2219 row_last = slitposition[j] + sinfo_new_nint(y_box) ;
2220 if ( row_first < 0 )
2224 if ( row_last >= ily )
2226 row_last = ily - 1 ;
2229 for ( row = row_first ; row <= row_last ; row++ )
2231 if ( maxval < pidata[col + ilx*row] )
2233 maxval = pidata[col + ilx*row] ;
2236 box_buffer->data[m] = maxval ;
2244 for( col = col_last-1 ; col >= col_first ; col-- )
2246 row_first = slitposition[j] - sinfo_new_nint(y_box) ;
2247 row_last = slitposition[j] + sinfo_new_nint(y_box) ;
2248 if ( row_first < 0 )
2252 if ( row_last >= ily )
2254 row_last = ily - 1 ;
2257 for ( row = row_first ; row <= row_last ; row++ )
2259 if ( maxval < pidata[col + ilx*row] )
2261 maxval = pidata[col + ilx*row] ;
2264 box_buffer->data[m] = maxval ;
2270 xdat=(
float *) cpl_calloc(box_buffer->n_elements, sizeof (
float) );
2271 wdat=(
float *) cpl_calloc(box_buffer->n_elements, sizeof (
float) );
2272 mpar=(
int *) cpl_calloc(NPAR,
sizeof (
int) ) ;
2278 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
2282 if ( box_buffer -> data[i] < minval )
2284 minval = box_buffer -> data[i] ;
2286 if ( box_buffer -> data[i] > maxval )
2288 maxval = box_buffer -> data[i] ;
2291 fitpar[0] = minval ;
2292 fitpar[1] = maxval ;
2303 n_buf = box_buffer->n_elements + box_length/2 ;
2304 in_buffer = sinfo_new_vector( n_buf ) ;
2305 for ( i = 0 ; i < box_length/2 ; i++ )
2307 in_buffer -> data[i] = minval ;
2310 for ( i = box_length/2 ; i < n_buf ; i++ )
2312 in_buffer -> data[i] = box_buffer -> data[shift] ;
2315 sinfo_new_destroy_vector ( box_buffer ) ;
2316 box_buffer = sinfo_new_vector ( n_buf ) ;
2317 for ( i = 0 ; i < n_buf ; i++ )
2319 box_buffer -> data[i] = in_buffer -> data[i] ;
2321 sinfo_new_destroy_vector ( in_buffer ) ;
2325 fitpar[2] = (float)box_buffer->n_elements/2. ;
2328 for ( i = 0 ; i < NPAR ; i++ )
2335 ndat = box_buffer->n_elements ;
2342 if ( 0 > ( iters = sinfo_new_lsqfit( xdat, &xdim,
2344 wdat, &ndat, fitpar,
2345 dervpar, mpar, &numpar,
2346 &tol, &its, &lab )) )
2349 "no.: %d in slitlet: %d\n", iters, j) ;
2350 sinfo_new_destroy_vector(box_buffer) ;
2357 if ( fitpar[3] <=0. )
2360 "boltzmann function in slitlet: %d\n", j) ;
2361 sinfo_new_destroy_vector(box_buffer) ;
2370 pos -= (float)box_length/2. ;
2380 if ( left_right == 0 )
2382 new_pos = (float)col_first + pos ;
2386 new_pos = (float)col_last-1 - pos ;
2388 if ( fabs(new_pos - slit_pos[j][left_right]) < diff_tol )
2390 slit_pos[j][left_right] = new_pos ;
2395 " take the estimated slitlet position "
2396 " in slitlet: %d\n", j) ;
2403 sinfo_new_destroy_vector ( box_buffer ) ;
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.