46 #include "sinfo_vltPort.h"
48 #include "sinfo_absolute.h"
49 #include "sinfo_recipes.h"
54 #define SQR(a) (sqrarg = (a) , sqrarg*sqrarg)
61 #define LABMAXA 1.0e+10
62 #define LABMINA 1.0e-10
72 static double vec[NPAR] ;
73 static double matrix1[NPAR][NPAR] ;
74 static double matrix2[NPAR][NPAR] ;
76 static int parptr[NPAR] ;
77 static float slopewidth ;
83 static int sinfo_new_inv_mat_edge (
void) ;
85 static void sinfo_new_get_mat_edge (
float * xdat,
94 static int sinfo_new_get_vec_edge (
float * xdat,
103 sinfo_new_hat2 (
float * xdat,
float * parlist );
106 sinfo_new_hat1 (
float * xdat,
float * parlist );
109 sinfo_new_hat_deriv2(
float * xdat,
float * parlist,
113 sinfo_new_hat_deriv1(
float * xdat,
float * parlist,
117 sinfo_new_fit_slits1( cpl_image * lineImage,
119 float ** sinfo_slit_pos,
124 sinfo_new_fit_slits( cpl_image * lineImage,
126 float ** sinfo_slit_pos,
134 sinfo_new_fit_slits2( cpl_image * lineImage,
136 float ** sinfo_slit_pos,
182 sinfo_new_edge (
float * xdat,
float * parlist )
188 slope1 = ( parlist[3] - parlist[2] ) / ( parlist[1] - parlist[0] ) ;
191 if ( xdat[0] <= parlist[0] )
193 return_value = parlist[2] ;
195 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
197 return_value = (xdat[0] - parlist[0]) * slope1 + parlist[2] ;
199 else if ( xdat[0] > parlist[1] )
201 return_value = parlist[3] ;
208 return return_value ;
253 sinfo_new_hat2 (
float * xdat,
float * parlist )
256 float slope1, slope2, slope3 ;
259 slope1 = ( parlist[6] - parlist[4] ) / ( parlist[1] - parlist[0] ) ;
260 slope2 = ( parlist[7] - parlist[5] ) / ( parlist[3] - parlist[2] ) ;
261 slope3 = ( parlist[7] - parlist[6] ) / ( parlist[2] - parlist[1] ) ;
264 if ( xdat[0] <= parlist[0] )
266 return_value = parlist[4] ;
268 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
270 return_value = (xdat[0] - parlist[0]) * slope1 + parlist[4] ;
272 else if ( xdat[0] > parlist[1] && xdat[0] <= parlist[2] )
274 return_value = (xdat[0] - parlist[1]) * slope3 + parlist[6] ;
276 else if ( xdat[0] > parlist[2] && xdat[0] <= parlist[3] )
278 return_value = (parlist[3] - xdat[0]) * slope2 + parlist[5] ;
280 else if ( xdat[0] > parlist[3] )
282 return_value = parlist[5] ;
289 return return_value ;
336 sinfo_new_hat1 (
float * xdat,
float * parlist )
338 float return_value=0 ;
339 float slope1, slope2 ;
344 slope1 = (parlist[4] - parlist[2]) / slopewidth ;
345 slope2 = (parlist[4] - parlist[3]) / slopewidth ;
348 if ( xdat[0] <= parlist[0] )
350 return_value = parlist[2] ;
352 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[0] + slopewidth )
354 return_value = (xdat[0] - parlist[0]) * slope1 + parlist[2] ;
356 else if ( xdat[0] > parlist[0] + slopewidth &&
357 xdat[0] <= parlist[1] - slopewidth )
359 return_value = parlist[4] ;
361 else if ( xdat[0] > parlist[1] - slopewidth && xdat[0] <= parlist[1] )
363 return_value = (parlist[1] - xdat[0]) * slope2 + parlist[3] ;
365 else if ( xdat[0] > parlist[1] )
367 return_value = parlist[3] ;
370 return return_value ;
415 sinfo_new_edge_deriv(
float * xdat,
float * parlist,
418 float deriv1_slope1 ;
421 deriv1_slope1 =( parlist[3] - parlist[2] ) / SQR(parlist[1] - parlist[0]) ;
424 if ( xdat[0] <= parlist[0] )
431 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
433 dervs[0] = ( xdat[0] - parlist[1] ) * deriv1_slope1 ;
434 dervs[1] = ( parlist[0] - xdat[0] ) * deriv1_slope1 ;
435 dervs[2] = ( parlist[0] - xdat[0] ) / ( parlist[1] - parlist[0] ) + 1.;
436 dervs[3] = ( xdat[0] - parlist[0] ) / ( parlist[1] - parlist[0] ) ;
438 else if ( xdat[0] > parlist[1] )
493 sinfo_new_hat_deriv2(
float * xdat,
float * parlist,
496 float deriv1_slope1 ;
497 float deriv1_slope2 ;
498 float deriv1_slope3 ;
501 deriv1_slope1 = ( parlist[6] - parlist[4] ) / SQR(parlist[1] - parlist[0]);
502 deriv1_slope2 = ( parlist[7] - parlist[5] ) / SQR(parlist[3] - parlist[2]);
503 deriv1_slope3 = ( parlist[7] - parlist[6] ) / SQR(parlist[2] - parlist[1]);
506 if ( xdat[0] <= parlist[0] )
517 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
519 dervs[0] = ( xdat[0] - parlist[1] ) * deriv1_slope1 ;
520 dervs[1] = ( parlist[0] - xdat[0] ) * deriv1_slope1 ;
523 dervs[4] = ( parlist[0] - xdat[0] ) / ( parlist[1] - parlist[0] ) + 1.;
525 dervs[6] = ( xdat[0] - parlist[0] ) / ( parlist[1] - parlist[0] ) ;
528 else if ( xdat[0] > parlist[1] && xdat[0] <= parlist[2] )
531 dervs[1] = (xdat[0] - parlist[2]) * deriv1_slope3 ;
532 dervs[2] = (parlist[1] - xdat[0]) * deriv1_slope3 ;
536 dervs[6] = (parlist[1] - xdat[0]) / (parlist[2] - parlist[1]) + 1. ;
537 dervs[7] = (xdat[0] - parlist[1]) / (parlist[2] - parlist[1]) ;
539 else if ( xdat[0] > parlist[2] && xdat[0] <= parlist[3] )
543 dervs[2] = ( parlist[3] - xdat[0] ) * deriv1_slope2 ;
544 dervs[3] = ( xdat[0] - parlist[2] ) * deriv1_slope2 ;
546 dervs[5] = ( xdat[0] - parlist[3] ) / ( parlist[3] - parlist[2] ) + 1.;
548 dervs[7] = ( parlist[3] - xdat[0] ) / ( parlist[3] - parlist[2] ) ;
550 else if ( xdat[0] > parlist[3] )
603 sinfo_new_hat_deriv1(
float * xdat,
float * parlist,
607 if ( xdat[0] <= parlist[0] )
615 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[0] + slopewidth )
617 dervs[0] = ( parlist[2] - parlist[4] ) / slopewidth ;
619 dervs[2] = (( parlist[0] - xdat[0] ) / slopewidth ) + 1. ;
621 dervs[4] = ( xdat[0] - parlist[0] ) / slopewidth ;
623 else if ( xdat[0] > parlist[0] + slopewidth && xdat[0] <=
624 parlist[1] - slopewidth )
632 else if ( xdat[0] > parlist[1] - slopewidth && xdat[0] <= parlist[1] )
635 dervs[1] = ( parlist[4] - parlist[3] ) / slopewidth ;
637 dervs[3] = (( xdat[0] - parlist[1] ) / slopewidth ) + 1. ;
638 dervs[4] = ( parlist[1] - xdat[0] ) / slopewidth ;
640 else if ( xdat[0] > parlist[1] )
662 sinfo_new_inv_mat_edge (
void)
672 for ( i = 0 ; i < nfree ; i++ )
677 for ( j = 0 ; j < nfree ; j++ )
682 rowmax = fabs ( matrix2[j][j] ) ;
685 for ( i = j + 1 ; i < nfree ; i++ )
687 if ( fabs ( matrix2[i][j] ) > rowmax )
689 rowmax = fabs( matrix2[i][j] ) ;
695 if ( matrix2[row][j] == 0.0 )
703 for ( k = 0 ; k < nfree ; k++ )
705 even = matrix2[j][k] ;
706 matrix2[j][k] = matrix2[row][k] ;
707 matrix2[row][k] = even ;
716 even = 1.0 / matrix2[j][j] ;
717 for ( i = 0 ; i < nfree ; i++ )
719 matrix2[i][j] *= even ;
721 matrix2[j][j] = even ;
723 for ( k = 0 ; k < j ; k++ )
725 mjk = matrix2[j][k] ;
726 for ( i = 0 ; i < j ; i++ )
728 matrix2[i][k] -= matrix2[i][j] * mjk ;
730 for ( i = j + 1 ; i < nfree ; i++ )
732 matrix2[i][k] -= matrix2[i][j] * mjk ;
734 matrix2[j][k] = -even * mjk ;
737 for ( k = j + 1 ; k < nfree ; k++ )
739 mjk = matrix2[j][k] ;
740 for ( i = 0 ; i < j ; i++ )
742 matrix2[i][k] -= matrix2[i][j] * mjk ;
744 for ( i = j + 1 ; i < nfree ; i++ )
746 matrix2[i][k] -= matrix2[i][j] * mjk ;
748 matrix2[j][k] = -even * mjk ;
753 for ( i = 0 ; i < nfree ; i++ )
755 for ( k = 0 ; k < nfree ; k++ )
757 hv[per[k]] = matrix2[i][k] ;
759 for ( k = 0 ; k < nfree ; k++ )
761 matrix2[i][k] = hv[k] ;
788 sinfo_new_get_mat_edge (
float * xdat,
801 for ( j = 0 ; j < nfree ; j++ )
804 for ( i = 0 ; i<= j ; i++ )
807 matrix1[j][i] = 0.0 ;
813 for ( n = 0 ; n < (*ndat) ; n++ )
815 double wn = wdat[n] ;
818 yd = ydat[n] - sinfo_new_edge( &xdat[(*xdim) * n],
820 sinfo_new_edge_deriv( &xdat[(*xdim) * n], fpar, epar) ;
821 chi2 += yd * yd * wn ;
822 for ( j = 0 ; j < nfree ; j++ )
824 wd = epar[parptr[j]] * wn ;
826 for ( i = 0 ; i <= j ; i++ )
828 matrix1[j][i] += epar[parptr[i]] * wd ;
865 sinfo_new_get_vec_edge (
float * xdat,
883 for ( j = 0 ; j < nfree ; j++ )
885 mjj = matrix1[j][j] ;
891 for ( i = 0 ; i < j ; i++ )
893 mji = matrix1[j][i] / mjj / sqrt( matrix1[i][i] ) ;
894 matrix2[i][j] = matrix2[j][i] = mji ;
896 matrix2[j][j] = 1.0 + labda ;
899 if ( (r = sinfo_new_inv_mat_edge()) )
904 for ( i = 0 ; i < (*npar) ; i ++ )
910 for ( j = 0 ; j < nfree ; j++ )
913 mjj = matrix1[j][j] ;
919 for ( i = 0 ; i < nfree ; i++ )
921 mii = matrix1[i][i] ;
927 dj += vec[i] * matrix2[j][i] / mjj / mii ;
929 epar[parptr[j]] += dj ;
934 for ( n = 0 ; n < (*ndat) ; n++ )
936 double wn = wdat[n] ;
939 dy = ydat[n] - sinfo_new_edge( &xdat[(*xdim) * n], epar
941 chi1 += wdat[n] * dy * dy ;
1002 sinfo_new_lsqfit_edge (
float * xdat,
1026 if ( *tol < (FLT_EPSILON * 10.0 ) )
1028 tolerance = FLT_EPSILON * 10.0 ;
1035 labda = fabs( *lab ) * LABFACA ;
1036 for ( i = 0 ; i < (*npar) ; i++ )
1044 parptr[nfree++] = i ;
1053 for ( n = 0 ; n < (*ndat) ; n++ )
1055 if ( wdat[n] > 0.0 )
1061 if ( nfree >= nuse )
1068 for ( i = 0 ; i < nfree ; fpar[parptr[i++]] = 0.0 ) ;
1069 sinfo_new_get_mat_edge(xdat,xdim,ydat,wdat,ndat,fpar,epar) ;
1070 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat, ndat,
1071 fpar, epar, npar ) ;
1076 for ( i = 0 ; i < (*npar) ; i++ )
1081 chi1 = sqrt( chi1 / (
double) (nuse - nfree) ) ;
1082 for ( i = 0 ; i < nfree ; i++ )
1084 if ( (matrix1[i][i] <= 0.0 ) || (matrix2[i][i] <= 0.0) )
1088 epar[parptr[i]] = chi1 * sqrt( matrix2[i][i] ) /
1089 sqrt( matrix1[i][i] ) ;
1110 if ( itc++ == (*its) )
1114 sinfo_new_get_mat_edge( xdat, xdim, ydat, wdat, ndat,
1121 if ( labda > LABMINA )
1123 labda = labda / LABFACA ;
1125 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat, ndat,
1126 fpar, epar, npar ) ;
1127 if ( (
int)fpar[1] - (
int)fpar[0] <= 0 && fpar[1] / fpar[0] > 0. )
1137 while ( chi1 >= chi2 )
1145 if ( labda > LABMAXA )
1149 labda = labda * LABFACA ;
1150 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat,
1151 ndat, fpar, epar, npar ) ;
1152 if ( (
int)fpar[1] - (
int)fpar[0] <= 0 &&
1153 fpar[1] / fpar[0] > 0. )
1164 if ( labda <= LABMAXA )
1166 for ( i = 0 ; i < *npar ; i++ )
1171 if ( (fabs( chi2 - chi1 ) <= (tolerance * chi1)) ||
1181 sinfo_new_get_mat_edge ( xdat, xdim, ydat, wdat, ndat,
1183 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat,
1184 ndat, fpar, epar, npar ) ;
1190 for ( i = 0 ; i < (*npar) ; i++ )
1194 chi2 = sqrt ( chi2 / (
double) (nuse - nfree) ) ;
1196 for ( i = 0 ; i < nfree ; i++ )
1198 if ( (matrix1[i][i] <= 0.0) || (matrix2[i][i] <= 0.0) )
1202 epar[parptr[i]] = chi2 * sqrt( matrix2[i][i] ) /
1203 sqrt( matrix1[i][i] ) ;
1240 sinfo_new_fit_slits1( cpl_image * lineImage,
1242 float ** sinfo_slit_pos,
1246 float* position=NULL ;
1247 int * sinfo_edge, * edgeclean ;
1249 int * pos_row, * pos_rowclean ;
1250 Vector * box_buffer ;
1252 int i, j, k, n, ed ;
1266 float fitpar[2*NPAR] ;
1267 float dervpar[NPAR] ;
1273 if ( NULL == lineImage )
1278 ilx=cpl_image_get_size_x(lineImage);
1280 pidata=cpl_image_get_data_float(lineImage);
1282 slit_length = (int) sqrt (ilx) ;
1289 if ( NULL == sinfo_slit_pos )
1295 if ( box_length < slit_length ||
1296 box_length >= 3*slit_length )
1302 if ( y_box <= 0. || y_box > 3. )
1309 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1310 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1311 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
1312 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1313 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
1321 while( agreed == -1 )
1324 float max_intensity = -FLT_MAX ;
1325 for ( col = 0 ; col < box_length ; col++ )
1327 for ( i = 0 ; i < par[0]->n_params ; i++ )
1329 if ( par[i]->column == col && par[i]->line != bad_line )
1331 if ( par[i]->fit_par[0] > max_intensity )
1333 if ( par[i]->fit_par[1] > 0. )
1335 max_intensity = par[i]->fit_par[0] ;
1349 line = par[found]->line ;
1350 column = par[found]->column ;
1351 row_pos = par[found]->fit_par[2] ;
1352 if ( found >= 0 && max_intensity > 0. )
1354 for ( i = 0 ; i < par[0]->n_params ; i++ )
1356 if ( par[i]->line == line-1 &&
1357 par[i]->column == column + slit_length )
1359 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
1360 par[i]->fit_par[2] >= (row_pos - y_box) )
1366 if ( bad_line != line )
1375 cpl_free( sinfo_edge ) ;
1376 cpl_free( pos_row ) ;
1377 cpl_free( edgeclean ) ;
1378 cpl_free( dummyedge ) ;
1379 cpl_free( pos_rowclean ) ;
1387 sinfo_msg_error(
"no emission line found in the first image columns") ;
1396 position=cpl_calloc(ilx,
sizeof(
float));
1397 for ( col = 0 ; col < ilx ; col++ )
1399 for ( i = 0 ; i < par[0]->n_params ; i++ )
1401 if ( par[i]->column == col && par[i] -> line == line )
1403 if ( par[i]->fit_par[0] > 0. && par[i]->fit_par[1] > 0. )
1405 position[n] = par[i]->fit_par[2] ;
1406 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
1408 sinfo_edge[ed] = col ;
1409 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
1411 if ( col >= ilx - slit_length - 5 )
1413 pos_row[ed] = sinfo_new_nint( position[n] ) ;
1421 if ( ed < (slit_length - 1) )
1424 cpl_free( position );
1429 for ( i = 1 ; i <= ed ; i ++ )
1431 if (dummyedge[i-1] != -1)
1433 dummyedge[i-1] = sinfo_edge[i-1] ;
1435 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
1436 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
1440 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
1441 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
1443 dummyedge[i+1] = -1 ;
1448 for ( i = 0 ; i < ed ; i++ )
1450 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
1452 edgeclean[k] = dummyedge[i] ;
1453 pos_rowclean[k] = pos_row[i] ;
1455 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
1457 pos_rowclean[k] = pos_row[ed] ;
1462 if ( k != slit_length - 1 )
1469 margin = ( box_length - slit_length ) / 2 ;
1474 for ( j = 0 ; j < k ; j++ )
1479 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
1480 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
1482 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[0]] ;
1487 fitpar[2] = (float) edgeclean[0] - 1. ;
1488 fitpar[3] = (float) edgeclean[0] + 1. ;
1491 else if ( j < k - 1 )
1493 box_buffer = sinfo_new_vector( edgeclean[j] -
1494 edgeclean[j-1] + 2*margin ) ;
1495 for ( col = edgeclean[j - 1] - margin ;
1496 col < edgeclean[j] + margin ; col++ )
1498 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[j]] ;
1501 fitpar[0] = (float) margin - 1. ;
1502 fitpar[1] = (float) margin + 1. ;
1503 fitpar[2] = (float) (edgeclean[j] - edgeclean[j-1] + margin) - 1. ;
1504 fitpar[3] = (float) (edgeclean[j] - edgeclean[j-1] + margin) + 1. ;
1509 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
1510 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
1512 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[k]] ;
1515 fitpar[0] = (float) margin - 1. ;
1516 fitpar[1] = (float) margin + 1. ;
1517 fitpar[2] = (float) (ilx - edgeclean[k-1] + margin) - 3. ;
1518 fitpar[3] = (float) (ilx - edgeclean[k-1] + margin) - 1. ;
1521 float* xdat = (
float *) cpl_calloc(box_buffer -> n_elements,
sizeof (
float) ) ;
1522 float* wdat = (
float *) cpl_calloc(box_buffer -> n_elements,
sizeof (
float) ) ;
1523 int* mpar = (
int *) cpl_calloc(NPAR,
sizeof (
int) ) ;
1526 float minval = FLT_MAX ;
1527 float maxval = -FLT_MAX ;
1528 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1532 if ( box_buffer -> data[i] < minval )
1534 minval = box_buffer -> data[i] ;
1536 if ( box_buffer -> data[i] > maxval )
1538 maxval = box_buffer -> data[i] ;
1542 fitpar[4] = minval ;
1543 fitpar[5] = minval ;
1544 fitpar[6] = maxval ;
1545 fitpar[7] = maxval ;
1553 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1555 if ( box_buffer -> data[i] >= ( maxval - minval ) / 2. )
1562 for ( i = box_buffer->n_elements - 1 ; i >= 0 ; i-- )
1564 if ( box_buffer -> data[i] >= ( maxval + minval ) / 2. )
1583 for ( i = 0 ; i < NPAR ; i++ )
1590 ndat = box_buffer -> n_elements ;
1598 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
1600 wdat, &ndat, fitpar,
1615 sinfo_slit_pos[0][0] = (fitpar[0] + fitpar[1]) / 2. ;
1616 sinfo_slit_pos[0][1] = (fitpar[2] + fitpar[3]) / 2. ;
1620 sinfo_slit_pos[j][0] = (fitpar[0] + fitpar[1]) / 2. +
1621 (
float)edgeclean[j-1] - (float)margin ;
1622 sinfo_slit_pos[j][1] = (fitpar[2] + fitpar[3]) / 2. +
1623 (
float)edgeclean[j-1] - (float)margin ;
1626 sinfo_slit_pos[k][0] = (fitpar[0] + fitpar[1]) / 2. +
1627 (
float)edgeclean[k-1] - (float)margin ;
1628 sinfo_slit_pos[k][1] = (fitpar[2] + fitpar[3]) / 2. +
1629 (
float)edgeclean[k-1] - (float)margin ;
1631 sinfo_new_destroy_vector ( box_buffer ) ;
1637 cpl_free( sinfo_edge ) ;
1638 cpl_free( pos_row ) ;
1639 cpl_free( edgeclean ) ;
1640 cpl_free( dummyedge ) ;
1641 cpl_free( pos_rowclean ) ;
1642 cpl_free( position );
1679 sinfo_new_fit_slits( cpl_image * lineImage,
1681 float ** sinfo_slit_pos,
1686 float* position=NULL ;
1688 int * sinfo_edge, * edgeclean ;
1690 int * pos_row, * pos_rowclean ;
1691 Vector * box_buffer ;
1693 int i, j, k, n, ed ;
1704 float fitpar[NPAR+1] ;
1705 float dervpar[NPAR] ;
1712 if ( NULL == lineImage )
1717 ilx=cpl_image_get_size_x(lineImage);
1719 pidata=cpl_image_get_data_float(lineImage);
1721 slit_length = (int) sqrt (ilx) ;
1728 if ( NULL == sinfo_slit_pos )
1734 if ( box_length < slit_length ||
1735 box_length >= 3*slit_length )
1741 if ( y_box <= 0. || y_box > 3. )
1747 if ( slope_width <= 0. )
1754 slopewidth = slope_width ;
1757 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1758 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1759 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
1760 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1761 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
1769 while( agreed == -1 )
1772 float max_intensity = -FLT_MAX ;
1773 for ( col = 0 ; col < box_length ; col++ )
1775 for ( i = 0 ; i < par[0]->n_params ; i++ )
1777 if ( par[i]->column == col && par[i]->line != bad_line )
1779 if ( par[i]->fit_par[0] > max_intensity )
1781 if ( par[i]->fit_par[1] > 0. )
1783 max_intensity = par[i]->fit_par[0] ;
1797 line = par[found]->line ;
1798 column = par[found]->column ;
1799 row_pos = par[found]->fit_par[2] ;
1800 if ( found >= 0 && max_intensity > 0. )
1802 for ( i = 0 ; i < par[0]->n_params ; i++ )
1804 if ( par[i]->line == line-1 &&
1805 par[i]->column == column + slit_length )
1807 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
1808 par[i]->fit_par[2] >= (row_pos - y_box) )
1814 if ( bad_line != line )
1823 cpl_free( sinfo_edge ) ;
1824 cpl_free( pos_row ) ;
1825 cpl_free( edgeclean ) ;
1826 cpl_free( dummyedge ) ;
1827 cpl_free( pos_rowclean ) ;
1835 sinfo_msg_error(
"no emission line found in the first image columns") ;
1842 position=cpl_calloc(ilx,
sizeof(
float)) ;
1844 for ( col = 0 ; col < ilx ; col++ )
1846 for ( i = 0 ; i < par[0]->n_params ; i++ )
1848 if ( par[i]->column == col && par[i] -> line == line )
1850 if ( par[i]->fit_par[0] > 0. && par[i]->fit_par[1] > 0. )
1852 position[n] = par[i]->fit_par[2] ;
1853 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
1855 sinfo_edge[ed] = col ;
1856 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
1858 if ( col >= ilx - slit_length - 5 )
1860 pos_row[ed] = sinfo_new_nint( position[n] ) ;
1868 if ( ed < (slit_length - 1) )
1871 cpl_free( position );
1876 for ( i = 1 ; i <= ed ; i ++ )
1878 if (dummyedge[i-1] != -1)
1880 dummyedge[i-1] = sinfo_edge[i-1] ;
1882 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
1883 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
1887 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
1888 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
1890 dummyedge[i+1] = -1 ;
1895 for ( i = 0 ; i < ed ; i++ )
1897 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
1899 edgeclean[k] = dummyedge[i] ;
1900 pos_rowclean[k] = pos_row[i] ;
1902 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
1904 pos_rowclean[k] = pos_row[ed] ;
1909 if ( k != slit_length - 1 )
1916 margin = ( box_length - slit_length ) / 2 ;
1921 for ( j = 0 ; j < k ; j++ )
1926 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
1927 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
1929 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[0]] ;
1934 fitpar[1] = (float)edgeclean[0] ;
1937 else if ( j < k - 1 )
1939 box_buffer = sinfo_new_vector( edgeclean[j] -
1940 edgeclean[j-1] + 2*margin ) ;
1941 for ( col = edgeclean[j - 1] - margin ;
1942 col < edgeclean[j] + margin ; col++ )
1944 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[j]] ;
1948 fitpar[0] = (float)margin ;
1949 fitpar[1] = (float)(edgeclean[j] - edgeclean[j-1] + margin ) ;
1954 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
1955 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
1957 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[k]] ;
1961 fitpar[0] = (float)margin ;
1962 fitpar[1] = (float)(m - 1) ;
1965 float* xdat=(
float *) cpl_calloc( box_buffer -> n_elements,
sizeof (
float) ) ;
1966 float* wdat=(
float *) cpl_calloc( box_buffer -> n_elements,
sizeof (
float) ) ;
1967 int* mpar=(
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
1970 float minval, maxval ;
1973 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1977 if ( box_buffer -> data[i] < minval )
1979 minval = box_buffer -> data[i] ;
1981 if ( box_buffer -> data[i] > maxval )
1983 maxval = box_buffer -> data[i] ;
1987 for ( i = 0 ; i < NPAR ; i++ )
1994 ndat = box_buffer -> n_elements ;
2000 fitpar[2] = minval ;
2001 fitpar[3] = minval ;
2002 fitpar[4] = maxval ;
2006 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
2008 wdat, &ndat, fitpar,
2009 dervpar, mpar, &numpar,
2010 &tol, &its, &lab )) )
2022 sinfo_slit_pos[0][0] = fitpar[0] + slopewidth/2. ;
2023 sinfo_slit_pos[0][1] = fitpar[1] - slopewidth/2. ;
2027 sinfo_slit_pos[j][0] = fitpar[0] + slopewidth/2. +
2028 (float)edgeclean[j-1] - (
float)margin ;
2029 sinfo_slit_pos[j][1] = fitpar[1] - slopewidth/2. +
2030 (float)edgeclean[j-1] - (
float)margin ;
2033 sinfo_slit_pos[k][0] = fitpar[0] + slopewidth/2. +
2034 (float)edgeclean[k-1] - (
float)margin ;
2035 sinfo_slit_pos[k][1] = fitpar[1] - slopewidth/2. +
2036 (float)edgeclean[k-1] - (
float)margin ;
2038 sinfo_new_destroy_vector ( box_buffer ) ;
2045 cpl_free( sinfo_edge ) ;
2046 cpl_free( pos_row ) ;
2047 cpl_free( edgeclean ) ;
2048 cpl_free( dummyedge ) ;
2049 cpl_free( pos_rowclean ) ;
2050 cpl_free( position );
2099 sinfo_new_fit_slits2( cpl_image * lineImage,
2101 float ** sinfo_slit_pos,
2106 float* position=NULL ;
2107 int * sinfo_edge, * edgeclean ;
2109 int * pos_row, * pos_rowclean ;
2110 Vector * box_buffer ;
2111 Vector * half_buffer ;
2115 int i, j, k, n, ed ;
2118 int nel, n_right, left_right ;
2124 int iters, xdim, ndat ;
2127 float * xdat, * wdat ;
2129 float fitpar[NPAR] ;
2130 float dervpar[NPAR] ;
2131 float minval, maxval ;
2132 float pos, last_pos ;
2138 if ( NULL == lineImage )
2143 ilx=cpl_image_get_size_x(lineImage);
2145 pidata=cpl_image_get_data_float(lineImage);
2147 slit_length = (int) sqrt (ilx) ;
2155 if ( NULL == sinfo_slit_pos )
2161 if ( box_length < slit_length ||
2162 box_length >= 3*slit_length )
2168 if ( y_box <= 0. || y_box > 3. )
2174 if ( diff_tol < 1. )
2181 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2182 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2183 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
2184 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2185 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
2194 while( agreed == -1 )
2197 float max_intensity = -FLT_MAX ;
2198 for ( col = 0 ; col < box_length ; col++ )
2200 for ( i = 0 ; i < par[0]->n_params ; i++ )
2202 if ( par[i]->column == col && par[i]->line != bad_line )
2204 if ( par[i]->fit_par[0] > max_intensity )
2206 if ( par[i]->fit_par[1] > 0. )
2208 max_intensity = par[i]->fit_par[0] ;
2221 line = par[found]->line ;
2222 column = par[found]->column ;
2223 float row_pos = par[found]->fit_par[2] ;
2224 if ( found >= 0 && max_intensity > 0. )
2226 for ( i = 0 ; i < par[0]->n_params ; i++ )
2228 if ( par[i]->line == line-1 &&
2229 par[i]->column == column + slit_length )
2231 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
2232 par[i]->fit_par[2] >= (row_pos - y_box) )
2238 if ( bad_line != line )
2247 cpl_free( sinfo_edge ) ;
2248 cpl_free( pos_row ) ;
2249 cpl_free( edgeclean ) ;
2250 cpl_free( dummyedge ) ;
2251 cpl_free( pos_rowclean ) ;
2259 sinfo_msg_error(
"no emission line found in the first image columns") ;
2266 position=cpl_calloc(ilx,
sizeof(
float)) ;
2268 for ( col = 0 ; col < ilx ; col++ )
2270 for ( i = 0 ; i < par[0]->n_params ; i++ )
2272 if ( par[i]->column == col && par[i]->line == line )
2274 if ( par[i]->fit_par[0] > 0. && par[i]->fit_par[1] > 0. )
2276 position[n] = par[i]->fit_par[2] ;
2277 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
2279 sinfo_edge[ed] = col ;
2280 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
2282 if ( col >= ilx - slit_length - 5 )
2284 pos_row[ed] = sinfo_new_nint( position[n] ) ;
2292 if ( ed < (slit_length - 1) )
2300 for ( i = 1 ; i <= ed ; i ++ )
2302 if (dummyedge[i-1] != -1)
2304 dummyedge[i-1] = sinfo_edge[i-1] ;
2306 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
2307 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
2311 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
2312 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
2314 dummyedge[i+1] = -1 ;
2319 for ( i = 0 ; i < ed ; i++ )
2321 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
2323 edgeclean[k] = dummyedge[i] ;
2324 pos_rowclean[k] = pos_row[i] ;
2326 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
2328 pos_rowclean[k] = pos_row[ed] ;
2333 if ( k != slit_length - 1 )
2340 margin = ( box_length - slit_length ) / 2 ;
2344 for ( j = 0 ; j <= k ; j++ )
2349 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
2350 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
2352 box_buffer->data[m] = pidata[col +ilx*pos_rowclean[0]] ;
2358 box_buffer = sinfo_new_vector( edgeclean[j] -
2359 edgeclean[j-1] + 2*margin ) ;
2360 for ( col = edgeclean[j - 1] - margin ;
2361 col < edgeclean[j] + margin ; col++ )
2363 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[j]] ;
2369 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
2370 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
2372 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[k]] ;
2377 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
2380 if ( left_right == 0 )
2382 nel = box_buffer -> n_elements / 2 ;
2386 if ( box_buffer -> n_elements % 2 == 0 )
2388 nel = box_buffer -> n_elements / 2 ;
2392 nel = box_buffer -> n_elements / 2 + 1 ;
2398 half_buffer = sinfo_new_vector( nel ) ;
2399 if ( left_right == 0 )
2401 for ( i = 0 ; i < nel ; i++ )
2403 half_buffer -> data[i] = box_buffer -> data[i] ;
2409 for ( i = box_buffer -> n_elements - 1 ;
2410 i >= box_buffer -> n_elements - nel ; i-- )
2412 half_buffer -> data[n_right] = box_buffer -> data[i] ;
2417 xdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
2418 wdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
2419 mpar = (
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
2424 for ( i = 0 ; i < nel ; i++ )
2428 if ( half_buffer -> data[i] < minval )
2430 minval = half_buffer -> data[i] ;
2432 if ( half_buffer -> data[i] > maxval )
2434 maxval = half_buffer -> data[i] ;
2438 fitpar[2] = minval ;
2439 fitpar[3] = maxval ;
2444 for ( i = 0 ; i < nel ; i++ )
2446 if ( half_buffer -> data[i] >= ( maxval + minval ) / 2. )
2456 fitpar[0] = ((float)init1 - 1.) ;
2457 fitpar[1] = ((float)init1 + 1.) ;
2460 for ( i = 0 ; i < NPAR ; i++ )
2474 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
2475 half_buffer -> data,
2476 wdat, &ndat, fitpar,
2477 dervpar, mpar, &numpar,
2478 &tol, &its, &lab )) )
2482 " no.: %d in slitlet: %d\n", iters, j) ;
2483 fitpar[0] = ((float)init1 - 1.) ;
2484 fitpar[1] = ((float)init1 + 1.) ;
2487 pos = (fitpar[0] + fitpar[1]) / 2. ;
2496 if ( left_right == 0 )
2502 if ( fabs(pos - ((
float)edgeclean[0] - 1. -
2503 (float)slit_length)) < diff_tol )
2505 sinfo_slit_pos[0][0] = pos ;
2510 " position of slitlet 0") ;
2511 if ( (
float) edgeclean[0] - 1. -
2512 (
float)slit_length < 0. )
2514 sinfo_slit_pos[0][0] = 0. ;
2518 sinfo_slit_pos[0][0] = (float)edgeclean[0] - 1. -
2519 (
float)slit_length ;
2525 if ( fabs( pos - (
float)margin ) < diff_tol )
2527 sinfo_slit_pos[j][0] = pos + (float)edgeclean[j-1] -
2533 " position of slitlet %d", j) ;
2534 sinfo_slit_pos[j][0] = (float)edgeclean[j-1] - 1. ;
2539 if ( fabs( pos - (
float)margin ) < diff_tol )
2541 sinfo_slit_pos[k][0] = pos + (float)edgeclean[k-1] -
2547 " position of slitlet %d", j) ;
2548 sinfo_slit_pos[k][0] = (float)edgeclean[k-1] - 1. ;
2558 if ( fabs( (
float)box_buffer->n_elements - pos -
2559 (
float)edgeclean[0] ) < diff_tol )
2561 sinfo_slit_pos[0][1] = (float)(box_buffer->n_elements -
2567 "right position of slitlet 0") ;
2568 sinfo_slit_pos[0][1] = (float)edgeclean[0] - 1. ;
2573 if ( fabs( (
float)box_buffer->n_elements - pos
2574 + (
float)edgeclean[j-1] - (
float)margin -
2575 (
float)edgeclean[j] ) < diff_tol )
2577 sinfo_slit_pos[j][1] = (float)(box_buffer->n_elements -
2579 + (float)edgeclean[j-1] - (
float)margin ;
2584 "position of slitlet %d", j) ;
2585 sinfo_slit_pos[j][1] = (float)edgeclean[j] - 1. ;
2590 if ( edgeclean[k-1] + slit_length > ilx )
2592 last_pos = (float)(ilx - 1) ;
2596 last_pos = (float)(edgeclean[k-1] - 1 + slit_length) ;
2598 if ( fabs( (
float)(box_buffer->n_elements - 1) - pos
2599 + (
float)edgeclean[k-1] - (float)margin -
2600 last_pos ) < diff_tol )
2602 sinfo_slit_pos[k][1] = (float)(box_buffer->n_elements -
2604 + (float)edgeclean[k-1] - (
float)margin ;
2609 "position of slitlet %d\n", j) ;
2610 sinfo_slit_pos[k][1] = last_pos ;
2615 sinfo_new_destroy_vector ( half_buffer ) ;
2620 sinfo_new_destroy_vector ( box_buffer ) ;
2623 cpl_free( sinfo_edge ) ;
2624 cpl_free( pos_row ) ;
2625 cpl_free( edgeclean ) ;
2626 cpl_free( dummyedge ) ;
2627 cpl_free( pos_rowclean ) ;
2668 sinfo_new_fit_slits_edge( cpl_image * lineImage,
2670 float ** sinfo_slit_pos,
2675 float* position=NULL ;
2676 int * sinfo_edge, * edgeclean ;
2678 int * pos_row, * pos_rowclean ;
2679 Vector * box_buffer ;
2680 Vector * half_buffer ;
2684 int i, j, k, n, ed ;
2687 int nel, n_right, left_right ;
2693 int iters, xdim, ndat ;
2696 float * xdat, * wdat ;
2698 float fitpar[NPAR] ;
2699 float dervpar[NPAR] ;
2700 float minval, maxval ;
2701 float pos, last_pos ;
2707 if ( NULL == lineImage )
2712 ilx=cpl_image_get_size_x(lineImage);
2714 pidata=cpl_image_get_data_float(lineImage);
2716 slit_length = (int) sqrt (ilx) ;
2724 if ( NULL == sinfo_slit_pos )
2730 if ( box_length < 4 ||
2731 box_length >= 2*slit_length )
2739 if ( y_box <= 0. || y_box > 3. )
2746 if ( diff_tol < 1. )
2753 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2754 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2755 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
2756 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2757 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
2766 while( agreed == -1 )
2769 float max_intensity = -FLT_MAX ;
2770 for ( col = 0 ; col < slit_length ; col++ )
2772 for ( i = 0 ; i < par[0]->n_params ; i++ )
2774 if ( par[i]->column == col && par[i] -> line != bad_line )
2776 if ( par[i]->fit_par[0] > max_intensity )
2778 if ( par[i]->fit_par[1] >= 1. &&
2779 par[i]->fit_par[2] > 0. )
2781 max_intensity = par[i]->fit_par[0] ;
2793 line = par[found]->line ;
2794 int column = par[found]->column ;
2795 float row_pos = par[found]->fit_par[2] ;
2796 if ( found >= 0 && max_intensity > 0. )
2798 for ( i = 0 ; i < par[0]->n_params ; i++ )
2800 if ( par[i]->line == line-1 &&
2801 par[i]->column == column + slit_length )
2803 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
2804 par[i]->fit_par[2] >= (row_pos - y_box) )
2810 if ( bad_line != line )
2819 "the first image columns") ;
2820 cpl_free( sinfo_edge ) ;
2821 cpl_free( pos_row ) ;
2822 cpl_free( edgeclean ) ;
2823 cpl_free( dummyedge ) ;
2824 cpl_free( pos_rowclean ) ;
2832 sinfo_msg_error(
" no emission line found in the first image columns") ;
2833 cpl_free( sinfo_edge ) ;
2834 cpl_free( pos_row ) ;
2835 cpl_free( edgeclean ) ;
2836 cpl_free( dummyedge ) ;
2837 cpl_free( pos_rowclean ) ;
2844 position=cpl_calloc(ilx,
sizeof(
float)) ;
2846 for ( col = 0 ; col < ilx ; col++ )
2848 for ( i = 0 ; i < par[0]->n_params ; i++ )
2850 if ( par[i]->column == col && par[i]->line == line )
2852 if ( par[i]->fit_par[0] > 0. &&
2853 par[i]->fit_par[1] >= 1. &&
2854 par[i]->fit_par[2] > 0. )
2856 position[n] = par[i]->fit_par[2] ;
2857 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
2859 sinfo_edge[ed] = col ;
2860 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
2862 if ( col >= ilx - slit_length - 5 )
2864 pos_row[ed] = sinfo_new_nint( position[n] ) ;
2872 if ( ed < (slit_length - 1) )
2875 cpl_free( sinfo_edge ) ;
2876 cpl_free( pos_row ) ;
2877 cpl_free( edgeclean ) ;
2878 cpl_free( dummyedge ) ;
2879 cpl_free( pos_rowclean ) ;
2880 cpl_free( position );
2885 for ( i = 1 ; i <= ed ; i ++ )
2889 if ( (sinfo_edge[i-1] - sinfo_edge[i-2]) < slit_length - 3 ||
2890 (sinfo_edge[i-1] - sinfo_edge[i-2]) > slit_length + 3 )
2892 dummyedge[i-1] = -1 ;
2896 if (dummyedge[i-1] != -1)
2898 dummyedge[i-1] = sinfo_edge[i-1] ;
2906 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
2907 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
2912 if ( i + 1 < ed && dummyedge[i] != -1 )
2914 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
2915 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
2917 dummyedge[i+1] = -1 ;
2923 for ( i = 0 ; i < ed ; i++ )
2925 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
2927 edgeclean[k] = dummyedge[i] ;
2928 pos_rowclean[k] = pos_row[i] ;
2930 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
2932 pos_rowclean[k] = pos_row[ed] ;
2937 if ( k != slit_length - 1 )
2940 cpl_free( sinfo_edge ) ;
2941 cpl_free( pos_row ) ;
2942 cpl_free( edgeclean ) ;
2943 cpl_free( dummyedge ) ;
2944 cpl_free( pos_rowclean ) ;
2949 margin = box_length / 2 ;
2956 for ( j = 0 ; j <= k ; j++ )
2961 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
2962 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
2965 for ( row = pos_rowclean[0] - sinfo_new_nint(y_box) ;
2966 row <= pos_rowclean[0] + sinfo_new_nint(y_box) ; row++ )
2968 if ( maxval < pidata[col + ilx*row] )
2970 maxval = pidata[col + ilx*row] ;
2973 box_buffer->data[m] = maxval ;
2979 box_buffer = sinfo_new_vector( edgeclean[j] -
2980 edgeclean[j-1] + 2*margin ) ;
2981 for ( col = edgeclean[j - 1] - margin ;
2982 col < edgeclean[j] + margin ; col++ )
2985 for ( row = pos_rowclean[j] - sinfo_new_nint(y_box) ;
2986 row <= pos_rowclean[j] + sinfo_new_nint(y_box) ; row++ )
2988 if ( maxval < pidata[col + ilx*row] )
2990 maxval = pidata[col + ilx*row] ;
2993 box_buffer->data[m] = maxval ;
2999 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
3000 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
3003 for ( row = pos_rowclean[k] - sinfo_new_nint(y_box) ;
3004 row <= pos_rowclean[k] + sinfo_new_nint(y_box) ; row++ )
3006 if ( maxval < pidata[col + ilx*row] )
3008 maxval = pidata[col + ilx*row] ;
3011 box_buffer->data[m] = maxval ;
3016 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
3019 if ( left_right == 0 )
3021 nel = box_buffer -> n_elements / 2 ;
3025 if ( box_buffer -> n_elements % 2 == 0 )
3027 nel = box_buffer -> n_elements / 2 ;
3031 nel = box_buffer -> n_elements / 2 + 1 ;
3037 half_buffer = sinfo_new_vector( nel ) ;
3038 if ( left_right == 0 )
3040 for ( i = 0 ; i < nel ; i++ )
3042 half_buffer -> data[i] = box_buffer -> data[i] ;
3048 for ( i = box_buffer -> n_elements - 1 ;
3049 i >= box_buffer -> n_elements - nel ; i-- )
3051 half_buffer -> data[n_right] = box_buffer -> data[i] ;
3056 xdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
3057 wdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
3058 mpar = (
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
3063 for ( i = 0 ; i < nel ; i++ )
3067 if ( half_buffer -> data[i] < minval )
3069 minval = half_buffer -> data[i] ;
3071 if ( half_buffer -> data[i] > maxval )
3073 maxval = half_buffer -> data[i] ;
3077 fitpar[2] = minval ;
3078 fitpar[3] = maxval ;
3083 for ( i = 0 ; i < nel ; i++ )
3085 if ( half_buffer -> data[i] >= ( maxval + minval ) / 2. )
3095 fitpar[0] = ((float)init1 - 1.) ;
3096 fitpar[1] = ((float)init1 + 1.) ;
3099 for ( i = 0 ; i < NPAR ; i++ )
3113 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
3114 half_buffer -> data,
3115 wdat, &ndat, fitpar,
3116 dervpar, mpar, &numpar,
3117 &tol, &its, &lab )) )
3121 "no.: %d in slitlet: %d", iters, j) ;
3122 fitpar[0] = ((float)init1 - 1.) ;
3123 fitpar[1] = ((float)init1 + 1.) ;
3126 pos = (fitpar[0] + fitpar[1]) / 2. ;
3135 if ( left_right == 0 )
3141 if ( fabs(pos - ((
float)edgeclean[0] - 1. -
3142 (float)slit_length)) < diff_tol )
3144 sinfo_slit_pos[0][0] = pos ;
3149 "left position of slitlet 0") ;
3150 if ((
float) edgeclean[0] - 1. -
3151 (
float)slit_length < 0. )
3153 sinfo_slit_pos[0][0] = 0. ;
3157 sinfo_slit_pos[0][0] = (float)edgeclean[0] - 1. -
3158 (
float)slit_length ;
3164 if ( fabs( pos - (
float)margin ) < diff_tol )
3166 sinfo_slit_pos[j][0] = pos + (float)edgeclean[j-1] -
3172 "left position of slitlet %d", j) ;
3173 sinfo_slit_pos[j][0] = (float)edgeclean[j-1] - 1. ;
3178 if ( fabs( pos - (
float)margin ) < diff_tol )
3180 sinfo_slit_pos[k][0] = pos + (float)edgeclean[k-1] -
3186 "position of slitlet %d", j) ;
3187 sinfo_slit_pos[k][0] = (float)edgeclean[k-1] - 1. ;
3197 if ( fabs( (
float)box_buffer->n_elements - pos -
3198 (
float)edgeclean[0] ) < diff_tol )
3200 sinfo_slit_pos[0][1] = (float)(box_buffer->n_elements -
3206 "right position of slitlet 0") ;
3207 sinfo_slit_pos[0][1] = (float)edgeclean[0] - 1. ;
3212 if ( fabs( (
float)box_buffer->n_elements - pos
3213 + (
float)edgeclean[j-1] - (
float)margin -
3214 (
float)edgeclean[j] ) < diff_tol )
3216 sinfo_slit_pos[j][1] = (float)(box_buffer->n_elements -
3218 + (float)edgeclean[j-1] - (
float)margin;
3223 "right position of slitlet %d", j) ;
3224 sinfo_slit_pos[j][1] = (float)edgeclean[j] - 1. ;
3229 if ( edgeclean[k-1] + slit_length > ilx )
3231 last_pos = (float)(ilx - 1) ;
3235 last_pos = (float)(edgeclean[k-1] - 1 + slit_length) ;
3237 if ( fabs( (
float)(box_buffer->n_elements - 1) - pos
3238 + (
float)edgeclean[k-1] - (float)margin -
3239 last_pos ) < diff_tol )
3241 sinfo_slit_pos[k][1] = (float)(box_buffer->n_elements -
3243 + (float)edgeclean[k-1] - (
float)margin ;
3248 "right position of slitlet %d", j) ;
3249 sinfo_slit_pos[k][1] = last_pos ;
3254 sinfo_new_destroy_vector ( half_buffer ) ;
3259 sinfo_new_destroy_vector ( box_buffer ) ;
3262 cpl_free( sinfo_edge ) ;
3263 cpl_free( pos_row ) ;
3264 cpl_free( edgeclean ) ;
3265 cpl_free( dummyedge ) ;
3266 cpl_free( pos_rowclean ) ;
3267 cpl_free( position );
3304 sinfo_new_fit_slits_edge_with_estimate ( cpl_image * lineImage,
3305 float ** sinfo_slit_pos,
3312 int* position=NULL ;
3313 Vector * box_buffer ;
3314 Vector * in_buffer ;
3317 int col_first, col_last ;
3318 int row_first, row_last ;
3324 int iters, xdim, ndat ;
3327 float * xdat, * wdat ;
3329 float fitpar[NPAR] ;
3330 float dervpar[NPAR] ;
3334 int slitposition[SLITLENGTH] ;
3335 pixelvalue rowpos[SLITLENGTH] ;
3341 slit_length = N_SLITLETS ;
3344 if ( NULL == lineImage )
3349 ilx=cpl_image_get_size_x(lineImage);
3350 ily=cpl_image_get_size_y(lineImage);
3351 pidata=cpl_image_get_data_float(lineImage);
3353 if ( NULL == sinfo_slit_pos )
3359 if ( box_length < 4 ||
3360 box_length > 2*slit_length )
3370 if ( y_box <= 0. || y_box > 6. )
3373 sinfo_msg_error(
"You have chosen y_box=%f not in range (0,6]!",y_box);
3376 if ( diff_tol <= 0. )
3382 if ( low_pos >= high_pos || low_pos < 0 ||
3383 high_pos <= 0 || high_pos > ily )
3390 position=cpl_calloc(ilx,
sizeof(
int)) ;
3391 float maxval,minval;
3392 for ( col = 0 ; col < ilx ; col++ )
3394 int found_row = -1 ;
3396 for ( row = low_pos ; row <= high_pos ; row++ )
3398 if ( maxval < pidata[col+row*ilx] )
3400 maxval = pidata[col+row*ilx] ;
3404 if ( maxval > -FLT_MAX && found_row > low_pos )
3406 position[col] = found_row ;
3419 for ( j = 0 ; j < slit_length ; j++ )
3425 for ( col = sinfo_new_nint(sinfo_slit_pos[j][0])+ 1 ;
3426 col < sinfo_new_nint(sinfo_slit_pos[j][1]) -1 ; col++ )
3428 rowpos[n] = (pixelvalue)position[col] ;
3431 slitposition[j] = (int)sinfo_new_median(rowpos, n) ;
3432 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
3436 col_first = sinfo_new_nint( sinfo_slit_pos[j][left_right] ) -
3438 col_last = sinfo_new_nint( sinfo_slit_pos[j][left_right] ) +
3440 if ( col_first < 0 )
3445 if ( col_last > ilx )
3450 if ( col_last - col_first <= 0 )
3455 box_buffer = sinfo_new_vector( col_last - col_first ) ;
3457 if ( left_right == 0 )
3459 for( col = col_first ; col < col_last ; col++ )
3461 row_first = slitposition[j] - sinfo_new_nint(y_box) ;
3462 row_last = slitposition[j] + sinfo_new_nint(y_box) ;
3463 if ( row_first < 0 )
3467 if ( row_last >= ily )
3469 row_last = ily - 1 ;
3472 for ( row = row_first ; row <= row_last ; row++ )
3474 if ( maxval < pidata[col + ilx*row] )
3476 maxval = pidata[col + ilx*row] ;
3479 box_buffer->data[m] = maxval ;
3485 for( col = col_last-1 ; col >= col_first ; col-- )
3487 row_first = slitposition[j] - sinfo_new_nint(y_box) ;
3488 row_last = slitposition[j] + sinfo_new_nint(y_box) ;
3489 if ( row_first < 0 )
3493 if ( row_last >= ily )
3495 row_last = ily - 1 ;
3498 for ( row = row_first ; row <= row_last ; row++ )
3500 if ( maxval < pidata[col + ilx*row] )
3502 maxval = pidata[col + ilx*row] ;
3505 box_buffer->data[m] = maxval ;
3510 xdat=(
float *)cpl_calloc( box_buffer->n_elements, sizeof (
float));
3511 wdat=(
float *)cpl_calloc( box_buffer->n_elements, sizeof (
float));
3512 mpar=(
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
3517 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
3521 if ( box_buffer -> data[i] < minval )
3523 minval = box_buffer -> data[i] ;
3525 if ( box_buffer -> data[i] > maxval )
3527 maxval = box_buffer -> data[i] ;
3530 fitpar[2] = minval ;
3531 fitpar[3] = maxval ;
3540 n_buf = box_buffer->n_elements + box_length/2 ;
3541 in_buffer = sinfo_new_vector( n_buf ) ;
3542 for ( i = 0 ; i < box_length/2 ; i++ )
3544 in_buffer -> data[i] = minval ;
3547 for ( i = box_length/2 ; i < n_buf ; i++ )
3549 in_buffer -> data[i] = box_buffer -> data[shift] ;
3552 sinfo_new_destroy_vector ( box_buffer ) ;
3553 box_buffer = sinfo_new_vector ( n_buf ) ;
3554 for ( i = 0 ; i < n_buf ; i++ )
3556 box_buffer -> data[i] = in_buffer -> data[i] ;
3558 sinfo_new_destroy_vector ( in_buffer ) ;
3561 fitpar[0] = (float)box_buffer->n_elements/2. - 1. ;
3562 fitpar[1] = (
float)box_buffer->n_elements/2. + 1. ;
3564 for ( i = 0 ; i < NPAR ; i++ )
3571 ndat = box_buffer->n_elements ;
3578 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
3580 wdat, &ndat, fitpar,
3581 dervpar, mpar, &numpar,
3582 &tol, &its, &lab )) )
3585 "no.: %d in slitlet: %d\n", iters, j) ;
3586 sinfo_new_destroy_vector(box_buffer) ;
3592 if ( fitpar[1] <= fitpar[0] )
3595 "sinfo_new_edge function in slitlet: %d",j);
3596 sinfo_new_destroy_vector(box_buffer) ;
3603 pos = (fitpar[0] + fitpar[1])/2. ;
3606 pos -= (float)box_length/2. ;
3616 if ( left_right == 0 )
3618 new_pos = (float)col_first + pos ;
3622 new_pos = (float)col_last-1 - pos ;
3624 if ( fabs(new_pos - sinfo_slit_pos[j][left_right]) < diff_tol )
3626 sinfo_slit_pos[j][left_right] = new_pos ;
3631 " take the estimated slitlet positiona"
3632 " in slitlet: %d\n", j) ;
3639 sinfo_new_destroy_vector ( box_buffer ) ;
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.