147 #include "sinfo_vltPort.h"
156 #include "sinfo_absolute.h"
157 #include "sinfo_recipes.h"
161 static float sqrarg ;
162 #define SQR(a) (sqrarg = (a) , sqrarg*sqrarg)
169 #define LABMAXA 1.0e+10
170 #define LABMINA 1.0e-10
179 static double labda ;
180 static double vec[NPAR] ;
181 static double matrix1[NPAR][NPAR] ;
182 static double matrix2[NPAR][NPAR] ;
184 static int parptr[NPAR] ;
185 static float slopewidth ;
191 static int sinfo_new_inv_mat_edge (
void) ;
193 static void sinfo_new_get_mat_edge (
float * xdat,
202 static int sinfo_new_get_vec_edge (
float * xdat,
211 sinfo_new_hat2 (
float * xdat,
float * parlist );
214 sinfo_new_hat1 (
float * xdat,
float * parlist );
217 sinfo_new_hat_deriv2(
float * xdat,
float * parlist,
221 sinfo_new_hat_deriv1(
float * xdat,
float * parlist,
225 sinfo_new_fit_slits1( cpl_image * lineImage,
227 float ** sinfo_slit_pos,
232 sinfo_new_fit_slits( cpl_image * lineImage,
234 float ** sinfo_slit_pos,
242 sinfo_new_fit_slits2( cpl_image * lineImage,
244 float ** sinfo_slit_pos,
271 sinfo_new_edge (
float * xdat,
float * parlist )
277 slope1 = ( parlist[3] - parlist[2] ) / ( parlist[1] - parlist[0] ) ;
280 if ( xdat[0] <= parlist[0] )
282 return_value = parlist[2] ;
284 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
286 return_value = (xdat[0] - parlist[0]) * slope1 + parlist[2] ;
288 else if ( xdat[0] > parlist[1] )
290 return_value = parlist[3] ;
297 return return_value ;
330 sinfo_new_hat2 (
float * xdat,
float * parlist )
333 float slope1, slope2, slope3 ;
336 slope1 = ( parlist[6] - parlist[4] ) / ( parlist[1] - parlist[0] ) ;
337 slope2 = ( parlist[7] - parlist[5] ) / ( parlist[3] - parlist[2] ) ;
338 slope3 = ( parlist[7] - parlist[6] ) / ( parlist[2] - parlist[1] ) ;
341 if ( xdat[0] <= parlist[0] )
343 return_value = parlist[4] ;
345 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
347 return_value = (xdat[0] - parlist[0]) * slope1 + parlist[4] ;
349 else if ( xdat[0] > parlist[1] && xdat[0] <= parlist[2] )
351 return_value = (xdat[0] - parlist[1]) * slope3 + parlist[6] ;
353 else if ( xdat[0] > parlist[2] && xdat[0] <= parlist[3] )
355 return_value = (parlist[3] - xdat[0]) * slope2 + parlist[5] ;
357 else if ( xdat[0] > parlist[3] )
359 return_value = parlist[5] ;
366 return return_value ;
400 sinfo_new_hat1 (
float * xdat,
float * parlist )
402 float return_value=0 ;
403 float slope1, slope2 ;
408 slope1 = (parlist[4] - parlist[2]) / slopewidth ;
409 slope2 = (parlist[4] - parlist[3]) / slopewidth ;
412 if ( xdat[0] <= parlist[0] )
414 return_value = parlist[2] ;
416 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[0] + slopewidth )
418 return_value = (xdat[0] - parlist[0]) * slope1 + parlist[2] ;
420 else if ( xdat[0] > parlist[0] + slopewidth &&
421 xdat[0] <= parlist[1] - slopewidth )
423 return_value = parlist[4] ;
425 else if ( xdat[0] > parlist[1] - slopewidth && xdat[0] <= parlist[1] )
427 return_value = (parlist[1] - xdat[0]) * slope2 + parlist[3] ;
429 else if ( xdat[0] > parlist[1] )
431 return_value = parlist[3] ;
434 return return_value ;
465 sinfo_new_edge_deriv(
float * xdat,
float * parlist,
468 float deriv1_slope1 ;
471 deriv1_slope1 =( parlist[3] - parlist[2] ) / SQR(parlist[1] - parlist[0]) ;
474 if ( xdat[0] <= parlist[0] )
481 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
483 dervs[0] = ( xdat[0] - parlist[1] ) * deriv1_slope1 ;
484 dervs[1] = ( parlist[0] - xdat[0] ) * deriv1_slope1 ;
485 dervs[2] = ( parlist[0] - xdat[0] ) / ( parlist[1] - parlist[0] ) + 1.;
486 dervs[3] = ( xdat[0] - parlist[0] ) / ( parlist[1] - parlist[0] ) ;
488 else if ( xdat[0] > parlist[1] )
531 sinfo_new_hat_deriv2(
float * xdat,
float * parlist,
534 float deriv1_slope1 ;
535 float deriv1_slope2 ;
536 float deriv1_slope3 ;
539 deriv1_slope1 = ( parlist[6] - parlist[4] ) / SQR(parlist[1] - parlist[0]);
540 deriv1_slope2 = ( parlist[7] - parlist[5] ) / SQR(parlist[3] - parlist[2]);
541 deriv1_slope3 = ( parlist[7] - parlist[6] ) / SQR(parlist[2] - parlist[1]);
544 if ( xdat[0] <= parlist[0] )
555 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[1] )
557 dervs[0] = ( xdat[0] - parlist[1] ) * deriv1_slope1 ;
558 dervs[1] = ( parlist[0] - xdat[0] ) * deriv1_slope1 ;
561 dervs[4] = ( parlist[0] - xdat[0] ) / ( parlist[1] - parlist[0] ) + 1.;
563 dervs[6] = ( xdat[0] - parlist[0] ) / ( parlist[1] - parlist[0] ) ;
566 else if ( xdat[0] > parlist[1] && xdat[0] <= parlist[2] )
569 dervs[1] = (xdat[0] - parlist[2]) * deriv1_slope3 ;
570 dervs[2] = (parlist[1] - xdat[0]) * deriv1_slope3 ;
574 dervs[6] = (parlist[1] - xdat[0]) / (parlist[2] - parlist[1]) + 1. ;
575 dervs[7] = (xdat[0] - parlist[1]) / (parlist[2] - parlist[1]) ;
577 else if ( xdat[0] > parlist[2] && xdat[0] <= parlist[3] )
581 dervs[2] = ( parlist[3] - xdat[0] ) * deriv1_slope2 ;
582 dervs[3] = ( xdat[0] - parlist[2] ) * deriv1_slope2 ;
584 dervs[5] = ( xdat[0] - parlist[3] ) / ( parlist[3] - parlist[2] ) + 1.;
586 dervs[7] = ( parlist[3] - xdat[0] ) / ( parlist[3] - parlist[2] ) ;
588 else if ( xdat[0] > parlist[3] )
630 sinfo_new_hat_deriv1(
float * xdat,
float * parlist,
634 if ( xdat[0] <= parlist[0] )
642 else if ( xdat[0] > parlist[0] && xdat[0] <= parlist[0] + slopewidth )
644 dervs[0] = ( parlist[2] - parlist[4] ) / slopewidth ;
646 dervs[2] = (( parlist[0] - xdat[0] ) / slopewidth ) + 1. ;
648 dervs[4] = ( xdat[0] - parlist[0] ) / slopewidth ;
650 else if ( xdat[0] > parlist[0] + slopewidth && xdat[0] <=
651 parlist[1] - slopewidth )
659 else if ( xdat[0] > parlist[1] - slopewidth && xdat[0] <= parlist[1] )
662 dervs[1] = ( parlist[4] - parlist[3] ) / slopewidth ;
664 dervs[3] = (( xdat[0] - parlist[1] ) / slopewidth ) + 1. ;
665 dervs[4] = ( parlist[1] - xdat[0] ) / slopewidth ;
667 else if ( xdat[0] > parlist[1] )
689 sinfo_new_inv_mat_edge (
void)
700 for ( i = 0 ; i < nfree ; i++ )
705 for ( j = 0 ; j < nfree ; j++ )
708 rowmax = fabs ( matrix2[j][j] ) ;
711 for ( i = j + 1 ; i < nfree ; i++ )
713 if ( fabs ( matrix2[i][j] ) > rowmax )
715 rowmax = fabs( matrix2[i][j] ) ;
721 if ( matrix2[row][j] == 0.0 )
729 for ( k = 0 ; k < nfree ; k++ )
731 even = matrix2[j][k] ;
732 matrix2[j][k] = matrix2[row][k] ;
733 matrix2[row][k] = even ;
742 even = 1.0 / matrix2[j][j] ;
743 for ( i = 0 ; i < nfree ; i++ )
745 matrix2[i][j] *= even ;
747 matrix2[j][j] = even ;
749 for ( k = 0 ; k < j ; k++ )
751 mjk = matrix2[j][k] ;
752 for ( i = 0 ; i < j ; i++ )
754 matrix2[i][k] -= matrix2[i][j] * mjk ;
756 for ( i = j + 1 ; i < nfree ; i++ )
758 matrix2[i][k] -= matrix2[i][j] * mjk ;
760 matrix2[j][k] = -even * mjk ;
763 for ( k = j + 1 ; k < nfree ; k++ )
765 mjk = matrix2[j][k] ;
766 for ( i = 0 ; i < j ; i++ )
768 matrix2[i][k] -= matrix2[i][j] * mjk ;
770 for ( i = j + 1 ; i < nfree ; i++ )
772 matrix2[i][k] -= matrix2[i][j] * mjk ;
774 matrix2[j][k] = -even * mjk ;
779 for ( i = 0 ; i < nfree ; i++ )
781 for ( k = 0 ; k < nfree ; k++ )
783 hv[per[k]] = matrix2[i][k] ;
785 for ( k = 0 ; k < nfree ; k++ )
787 matrix2[i][k] = hv[k] ;
814 sinfo_new_get_mat_edge (
float * xdat,
828 for ( j = 0 ; j < nfree ; j++ )
831 for ( i = 0 ; i<= j ; i++ )
834 matrix1[j][i] = 0.0 ;
840 for ( n = 0 ; n < (*ndat) ; n++ )
845 yd = ydat[n] - sinfo_new_edge( &xdat[(*xdim) * n],
847 sinfo_new_edge_deriv( &xdat[(*xdim) * n], fpar, epar) ;
848 chi2 += yd * yd * wn ;
849 for ( j = 0 ; j < nfree ; j++ )
851 wd = epar[parptr[j]] * wn ;
853 for ( i = 0 ; i <= j ; i++ )
855 matrix1[j][i] += epar[parptr[i]] * wd ;
894 sinfo_new_get_vec_edge (
float * xdat,
912 for ( j = 0 ; j < nfree ; j++ )
914 mjj = matrix1[j][j] ;
920 for ( i = 0 ; i < j ; i++ )
922 mji = matrix1[j][i] / mjj / sqrt( matrix1[i][i] ) ;
923 matrix2[i][j] = matrix2[j][i] = mji ;
925 matrix2[j][j] = 1.0 + labda ;
928 if ( (r = sinfo_new_inv_mat_edge()) )
933 for ( i = 0 ; i < (*npar) ; i ++ )
939 for ( j = 0 ; j < nfree ; j++ )
942 mjj = matrix1[j][j] ;
948 for ( i = 0 ; i < nfree ; i++ )
950 mii = matrix1[i][i] ;
956 dj += vec[i] * matrix2[j][i] / mjj / mii ;
958 epar[parptr[j]] += dj ;
963 for ( n = 0 ; n < (*ndat) ; n++ )
968 dy = ydat[n] - sinfo_new_edge( &xdat[(*xdim) * n], epar
970 chi1 += wdat[n] * dy * dy ;
1031 sinfo_new_lsqfit_edge (
float * xdat,
1055 if ( *tol < (FLT_EPSILON * 10.0 ) )
1057 tolerance = FLT_EPSILON * 10.0 ;
1064 labda = fabs( *lab ) * LABFACA ;
1065 for ( i = 0 ; i < (*npar) ; i++ )
1073 parptr[nfree++] = i ;
1082 for ( n = 0 ; n < (*ndat) ; n++ )
1084 if ( wdat[n] > 0.0 )
1090 if ( nfree >= nuse )
1097 for ( i = 0 ; i < nfree ; fpar[parptr[i++]] = 0.0 ) ;
1098 sinfo_new_get_mat_edge(xdat,xdim,ydat,wdat,ndat,fpar,epar) ;
1099 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat, ndat,
1100 fpar, epar, npar ) ;
1105 for ( i = 0 ; i < (*npar) ; i++ )
1110 chi1 = sqrt( chi1 / (
double) (nuse - nfree) ) ;
1111 for ( i = 0 ; i < nfree ; i++ )
1113 if ( (matrix1[i][i] <= 0.0 ) || (matrix2[i][i] <= 0.0) )
1117 epar[parptr[i]] = chi1 * sqrt( matrix2[i][i] ) /
1118 sqrt( matrix1[i][i] ) ;
1139 if ( itc++ == (*its) )
1143 sinfo_new_get_mat_edge( xdat, xdim, ydat, wdat, ndat,
1150 if ( labda > LABMINA )
1152 labda = labda / LABFACA ;
1154 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat, ndat,
1155 fpar, epar, npar ) ;
1156 if ( (
int)fpar[1] - (
int)fpar[0] <= 0 && fpar[1] / fpar[0] > 0. )
1166 while ( chi1 >= chi2 )
1174 if ( labda > LABMAXA )
1178 labda = labda * LABFACA ;
1179 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat,
1180 ndat, fpar, epar, npar ) ;
1181 if ( (
int)fpar[1] - (
int)fpar[0] <= 0 &&
1182 fpar[1] / fpar[0] > 0. )
1193 if ( labda <= LABMAXA )
1195 for ( i = 0 ; i < *npar ; i++ )
1200 if ( (fabs( chi2 - chi1 ) <= (tolerance * chi1)) ||
1210 sinfo_new_get_mat_edge ( xdat, xdim, ydat, wdat, ndat,
1212 r = sinfo_new_get_vec_edge ( xdat, xdim, ydat, wdat,
1213 ndat, fpar, epar, npar ) ;
1219 for ( i = 0 ; i < (*npar) ; i++ )
1223 chi2 = sqrt ( chi2 / (
double) (nuse - nfree) ) ;
1225 for ( i = 0 ; i < nfree ; i++ )
1227 if ( (matrix1[i][i] <= 0.0) || (matrix2[i][i] <= 0.0) )
1231 epar[parptr[i]] = chi2 * sqrt( matrix2[i][i] ) /
1232 sqrt( matrix1[i][i] ) ;
1269 sinfo_new_fit_slits1( cpl_image * lineImage,
1271 float ** sinfo_slit_pos,
1275 float* position=NULL ;
1276 int * sinfo_edge, * edgeclean ;
1278 int * pos_row, * pos_rowclean ;
1279 Vector * box_buffer ;
1280 float max_intensity ;
1283 int i, j, k, m, n, ed ;
1295 int iters, xdim, ndat ;
1298 float * xdat, * wdat ;
1300 float fitpar[2*NPAR] ;
1301 float dervpar[NPAR] ;
1302 float minval, maxval ;
1308 if ( NULL == lineImage )
1313 ilx=cpl_image_get_size_x(lineImage);
1315 pidata=cpl_image_get_data_float(lineImage);
1317 slit_length = (int) sqrt (ilx) ;
1324 if ( NULL == sinfo_slit_pos )
1330 if ( box_length < slit_length ||
1331 box_length >= 3*slit_length )
1337 if ( y_box <= 0. || y_box > 3. )
1344 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1345 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1346 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
1347 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1348 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
1356 while( agreed == -1 )
1359 max_intensity = -FLT_MAX ;
1360 for ( col = 0 ; col < box_length ; col++ )
1362 for ( i = 0 ; i < par[0]->n_params ; i++ )
1364 if ( par[i]->column == col && par[i]->line != bad_line )
1366 if ( par[i]->fit_par[0] > max_intensity )
1368 if ( par[i]->fit_par[1] > 0. )
1370 max_intensity = par[i]->fit_par[0] ;
1382 line = par[found]->line ;
1383 column = par[found]->column ;
1384 row_pos = par[found]->fit_par[2] ;
1385 if ( found >= 0 && max_intensity > 0. )
1387 for ( i = 0 ; i < par[0]->n_params ; i++ )
1389 if ( par[i]->line == line-1 &&
1390 par[i]->column == column + slit_length )
1392 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
1393 par[i]->fit_par[2] >= (row_pos - y_box) )
1399 if ( bad_line != line )
1415 sinfo_msg_error(
"no emission line found in the first image columns") ;
1424 position=cpl_calloc(ilx,
sizeof(
float));
1425 for ( col = 0 ; col < ilx ; col++ )
1427 for ( i = 0 ; i < par[0]->n_params ; i++ )
1429 if ( par[i]->column == col && par[i] -> line == line )
1431 if ( par[i]->fit_par[0] > 0. && par[i]->fit_par[1] > 0. )
1433 position[n] = par[i]->fit_par[2] ;
1434 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
1436 sinfo_edge[ed] = col ;
1437 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
1439 if ( col >= ilx - slit_length - 5 )
1441 pos_row[ed] = sinfo_new_nint( position[n] ) ;
1449 if ( ed < (slit_length - 1) )
1456 for ( i = 1 ; i <= ed ; i ++ )
1458 if (dummyedge[i-1] != -1)
1460 dummyedge[i-1] = sinfo_edge[i-1] ;
1462 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
1463 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
1467 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
1468 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
1470 dummyedge[i+1] = -1 ;
1475 for ( i = 0 ; i < ed ; i++ )
1477 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
1479 edgeclean[k] = dummyedge[i] ;
1480 pos_rowclean[k] = pos_row[i] ;
1482 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
1484 pos_rowclean[k] = pos_row[ed] ;
1489 if ( k != slit_length - 1 )
1496 margin = ( box_length - slit_length ) / 2 ;
1500 for ( j = 0 ; j < k ; j++ )
1505 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
1506 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
1508 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[0]] ;
1513 fitpar[2] = (float) edgeclean[0] - 1. ;
1514 fitpar[3] = (float) edgeclean[0] + 1. ;
1517 else if ( j < k - 1 )
1519 box_buffer = sinfo_new_vector( edgeclean[j] -
1520 edgeclean[j-1] + 2*margin ) ;
1521 for ( col = edgeclean[j - 1] - margin ;
1522 col < edgeclean[j] + margin ; col++ )
1524 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[j]] ;
1527 fitpar[0] = (float) margin - 1. ;
1528 fitpar[1] = (float) margin + 1. ;
1529 fitpar[2] = (float) (edgeclean[j] - edgeclean[j-1] + margin) - 1. ;
1530 fitpar[3] = (float) (edgeclean[j] - edgeclean[j-1] + margin) + 1. ;
1535 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
1536 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
1538 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[k]] ;
1541 fitpar[0] = (float) margin - 1. ;
1542 fitpar[1] = (float) margin + 1. ;
1543 fitpar[2] = (float) (ilx - edgeclean[k-1] + margin) - 3. ;
1544 fitpar[3] = (float) (ilx - edgeclean[k-1] + margin) - 1. ;
1547 xdat = (
float *) cpl_calloc(box_buffer -> n_elements,
sizeof (
float) ) ;
1548 wdat = (
float *) cpl_calloc(box_buffer -> n_elements,
sizeof (
float) ) ;
1549 mpar = (
int *) cpl_calloc(NPAR,
sizeof (
int) ) ;
1554 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1558 if ( box_buffer -> data[i] < minval )
1560 minval = box_buffer -> data[i] ;
1562 if ( box_buffer -> data[i] > maxval )
1564 maxval = box_buffer -> data[i] ;
1568 fitpar[4] = minval ;
1569 fitpar[5] = minval ;
1570 fitpar[6] = maxval ;
1571 fitpar[7] = maxval ;
1579 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1581 if ( box_buffer -> data[i] >= ( maxval - minval ) / 2. )
1588 for ( i = box_buffer->n_elements - 1 ; i >= 0 ; i-- )
1590 if ( box_buffer -> data[i] >= ( maxval + minval ) / 2. )
1609 for ( i = 0 ; i < NPAR ; i++ )
1616 ndat = box_buffer -> n_elements ;
1623 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
1625 wdat, &ndat, fitpar,
1640 sinfo_slit_pos[0][0] = (fitpar[0] + fitpar[1]) / 2. ;
1641 sinfo_slit_pos[0][1] = (fitpar[2] + fitpar[3]) / 2. ;
1645 sinfo_slit_pos[j][0] = (fitpar[0] + fitpar[1]) / 2. +
1646 (
float)edgeclean[j-1] - (float)margin ;
1647 sinfo_slit_pos[j][1] = (fitpar[2] + fitpar[3]) / 2. +
1648 (
float)edgeclean[j-1] - (float)margin ;
1651 sinfo_slit_pos[k][0] = (fitpar[0] + fitpar[1]) / 2. +
1652 (
float)edgeclean[k-1] - (float)margin ;
1653 sinfo_slit_pos[k][1] = (fitpar[2] + fitpar[3]) / 2. +
1654 (
float)edgeclean[k-1] - (float)margin ;
1656 sinfo_new_destroy_vector ( box_buffer ) ;
1662 cpl_free( sinfo_edge ) ;
1663 cpl_free( pos_row ) ;
1664 cpl_free( edgeclean ) ;
1665 cpl_free( dummyedge ) ;
1666 cpl_free( pos_rowclean ) ;
1667 cpl_free( position );
1704 sinfo_new_fit_slits( cpl_image * lineImage,
1706 float ** sinfo_slit_pos,
1711 float* position=NULL ;
1713 int * sinfo_edge, * edgeclean ;
1715 int * pos_row, * pos_rowclean ;
1716 Vector * box_buffer ;
1717 float max_intensity ;
1720 int i, j, k, m, n, ed ;
1728 int iters, xdim, ndat ;
1731 float * xdat, * wdat ;
1733 float fitpar[NPAR] ;
1734 float dervpar[NPAR] ;
1735 float minval, maxval ;
1741 if ( NULL == lineImage )
1746 ilx=cpl_image_get_size_x(lineImage);
1748 pidata=cpl_image_get_data_float(lineImage);
1750 slit_length = (int) sqrt (ilx) ;
1757 if ( NULL == sinfo_slit_pos )
1763 if ( box_length < slit_length ||
1764 box_length >= 3*slit_length )
1770 if ( y_box <= 0. || y_box > 3. )
1776 if ( slope_width <= 0. )
1783 slopewidth = slope_width ;
1786 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1787 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1788 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
1789 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
1790 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
1798 while( agreed == -1 )
1801 max_intensity = -FLT_MAX ;
1802 for ( col = 0 ; col < box_length ; col++ )
1804 for ( i = 0 ; i < par[0]->n_params ; i++ )
1806 if ( par[i]->column == col && par[i]->line != bad_line )
1808 if ( par[i]->fit_par[0] > max_intensity )
1810 if ( par[i]->fit_par[1] > 0. )
1812 max_intensity = par[i]->fit_par[0] ;
1824 line = par[found]->line ;
1825 column = par[found]->column ;
1826 row_pos = par[found]->fit_par[2] ;
1827 if ( found >= 0 && max_intensity > 0. )
1829 for ( i = 0 ; i < par[0]->n_params ; i++ )
1831 if ( par[i]->line == line-1 &&
1832 par[i]->column == column + slit_length )
1834 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
1835 par[i]->fit_par[2] >= (row_pos - y_box) )
1841 if ( bad_line != line )
1857 sinfo_msg_error(
"no emission line found in the first image columns") ;
1864 position=cpl_calloc(ilx,
sizeof(
float)) ;
1866 for ( col = 0 ; col < ilx ; col++ )
1868 for ( i = 0 ; i < par[0]->n_params ; i++ )
1870 if ( par[i]->column == col && par[i] -> line == line )
1872 if ( par[i]->fit_par[0] > 0. && par[i]->fit_par[1] > 0. )
1874 position[n] = par[i]->fit_par[2] ;
1875 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
1877 sinfo_edge[ed] = col ;
1878 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
1880 if ( col >= ilx - slit_length - 5 )
1882 pos_row[ed] = sinfo_new_nint( position[n] ) ;
1890 if ( ed < (slit_length - 1) )
1897 for ( i = 1 ; i <= ed ; i ++ )
1899 if (dummyedge[i-1] != -1)
1901 dummyedge[i-1] = sinfo_edge[i-1] ;
1903 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
1904 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
1908 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
1909 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
1911 dummyedge[i+1] = -1 ;
1916 for ( i = 0 ; i < ed ; i++ )
1918 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
1920 edgeclean[k] = dummyedge[i] ;
1921 pos_rowclean[k] = pos_row[i] ;
1923 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
1925 pos_rowclean[k] = pos_row[ed] ;
1930 if ( k != slit_length - 1 )
1937 margin = ( box_length - slit_length ) / 2 ;
1941 for ( j = 0 ; j < k ; j++ )
1946 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
1947 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
1949 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[0]] ;
1954 fitpar[1] = (float)edgeclean[0] ;
1957 else if ( j < k - 1 )
1959 box_buffer = sinfo_new_vector( edgeclean[j] -
1960 edgeclean[j-1] + 2*margin ) ;
1961 for ( col = edgeclean[j - 1] - margin ;
1962 col < edgeclean[j] + margin ; col++ )
1964 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[j]] ;
1968 fitpar[0] = (float)margin ;
1969 fitpar[1] = (float)(edgeclean[j] - edgeclean[j-1] + margin ) ;
1974 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
1975 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
1977 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[k]] ;
1981 fitpar[0] = (float)margin ;
1982 fitpar[1] = (float)(m - 1) ;
1985 xdat=(
float *) cpl_calloc( box_buffer -> n_elements,
sizeof (
float) ) ;
1986 wdat=(
float *) cpl_calloc( box_buffer -> n_elements,
sizeof (
float) ) ;
1987 mpar=(
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
1992 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
1996 if ( box_buffer -> data[i] < minval )
1998 minval = box_buffer -> data[i] ;
2000 if ( box_buffer -> data[i] > maxval )
2002 maxval = box_buffer -> data[i] ;
2006 for ( i = 0 ; i < NPAR ; i++ )
2013 ndat = box_buffer -> n_elements ;
2019 fitpar[2] = minval ;
2020 fitpar[3] = minval ;
2021 fitpar[4] = maxval ;
2024 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
2026 wdat, &ndat, fitpar,
2027 dervpar, mpar, &numpar,
2028 &tol, &its, &lab )) )
2040 sinfo_slit_pos[0][0] = fitpar[0] + slopewidth/2. ;
2041 sinfo_slit_pos[0][1] = fitpar[1] - slopewidth/2. ;
2045 sinfo_slit_pos[j][0] = fitpar[0] + slopewidth/2. +
2046 (float)edgeclean[j-1] - (
float)margin ;
2047 sinfo_slit_pos[j][1] = fitpar[1] - slopewidth/2. +
2048 (float)edgeclean[j-1] - (
float)margin ;
2051 sinfo_slit_pos[k][0] = fitpar[0] + slopewidth/2. +
2052 (float)edgeclean[k-1] - (
float)margin ;
2053 sinfo_slit_pos[k][1] = fitpar[1] - slopewidth/2. +
2054 (float)edgeclean[k-1] - (
float)margin ;
2056 sinfo_new_destroy_vector ( box_buffer ) ;
2063 cpl_free( sinfo_edge ) ;
2064 cpl_free( pos_row ) ;
2065 cpl_free( edgeclean ) ;
2066 cpl_free( dummyedge ) ;
2067 cpl_free( pos_rowclean ) ;
2068 cpl_free( position );
2117 sinfo_new_fit_slits2( cpl_image * lineImage,
2119 float ** sinfo_slit_pos,
2124 float* position=NULL ;
2125 int * sinfo_edge, * edgeclean ;
2127 int * pos_row, * pos_rowclean ;
2128 Vector * box_buffer ;
2129 Vector * half_buffer ;
2130 float max_intensity ;
2133 int i, j, k, m, n, ed ;
2136 int nel, n_right, left_right ;
2142 int iters, xdim, ndat ;
2145 float * xdat, * wdat ;
2147 float fitpar[NPAR] ;
2148 float dervpar[NPAR] ;
2149 float minval, maxval ;
2150 float pos, last_pos ;
2156 if ( NULL == lineImage )
2161 ilx=cpl_image_get_size_x(lineImage);
2163 pidata=cpl_image_get_data_float(lineImage);
2165 slit_length = (int) sqrt (ilx) ;
2173 if ( NULL == sinfo_slit_pos )
2179 if ( box_length < slit_length ||
2180 box_length >= 3*slit_length )
2186 if ( y_box <= 0. || y_box > 3. )
2192 if ( diff_tol < 1. )
2199 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2200 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2201 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
2202 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2203 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
2211 while( agreed == -1 )
2214 max_intensity = -FLT_MAX ;
2215 for ( col = 0 ; col < box_length ; col++ )
2217 for ( i = 0 ; i < par[0]->n_params ; i++ )
2219 if ( par[i]->column == col && par[i]->line != bad_line )
2221 if ( par[i]->fit_par[0] > max_intensity )
2223 if ( par[i]->fit_par[1] > 0. )
2225 max_intensity = par[i]->fit_par[0] ;
2237 line = par[found]->line ;
2238 column = par[found]->column ;
2239 row_pos = par[found]->fit_par[2] ;
2240 if ( found >= 0 && max_intensity > 0. )
2242 for ( i = 0 ; i < par[0]->n_params ; i++ )
2244 if ( par[i]->line == line-1 &&
2245 par[i]->column == column + slit_length )
2247 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
2248 par[i]->fit_par[2] >= (row_pos - y_box) )
2254 if ( bad_line != line )
2270 sinfo_msg_error(
"no emission line found in the first image columns") ;
2277 position=cpl_calloc(ilx,
sizeof(
float)) ;
2279 for ( col = 0 ; col < ilx ; col++ )
2281 for ( i = 0 ; i < par[0]->n_params ; i++ )
2283 if ( par[i]->column == col && par[i]->line == line )
2285 if ( par[i]->fit_par[0] > 0. && par[i]->fit_par[1] > 0. )
2287 position[n] = par[i]->fit_par[2] ;
2288 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
2290 sinfo_edge[ed] = col ;
2291 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
2293 if ( col >= ilx - slit_length - 5 )
2295 pos_row[ed] = sinfo_new_nint( position[n] ) ;
2303 if ( ed < (slit_length - 1) )
2310 for ( i = 1 ; i <= ed ; i ++ )
2312 if (dummyedge[i-1] != -1)
2314 dummyedge[i-1] = sinfo_edge[i-1] ;
2316 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
2317 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
2321 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
2322 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
2324 dummyedge[i+1] = -1 ;
2329 for ( i = 0 ; i < ed ; i++ )
2331 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
2333 edgeclean[k] = dummyedge[i] ;
2334 pos_rowclean[k] = pos_row[i] ;
2336 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
2338 pos_rowclean[k] = pos_row[ed] ;
2343 if ( k != slit_length - 1 )
2350 margin = ( box_length - slit_length ) / 2 ;
2354 for ( j = 0 ; j <= k ; j++ )
2359 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
2360 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
2362 box_buffer->data[m] = pidata[col +ilx*pos_rowclean[0]] ;
2368 box_buffer = sinfo_new_vector( edgeclean[j] -
2369 edgeclean[j-1] + 2*margin ) ;
2370 for ( col = edgeclean[j - 1] - margin ;
2371 col < edgeclean[j] + margin ; col++ )
2373 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[j]] ;
2379 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
2380 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
2382 box_buffer->data[m] = pidata[col + ilx*pos_rowclean[k]] ;
2387 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
2390 if ( left_right == 0 )
2392 nel = box_buffer -> n_elements / 2 ;
2396 if ( box_buffer -> n_elements % 2 == 0 )
2398 nel = box_buffer -> n_elements / 2 ;
2402 nel = box_buffer -> n_elements / 2 + 1 ;
2408 half_buffer = sinfo_new_vector( nel ) ;
2409 if ( left_right == 0 )
2411 for ( i = 0 ; i < nel ; i++ )
2413 half_buffer -> data[i] = box_buffer -> data[i] ;
2419 for ( i = box_buffer -> n_elements - 1 ;
2420 i >= box_buffer -> n_elements - nel ; i-- )
2422 half_buffer -> data[n_right] = box_buffer -> data[i] ;
2427 xdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
2428 wdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
2429 mpar = (
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
2434 for ( i = 0 ; i < nel ; i++ )
2438 if ( half_buffer -> data[i] < minval )
2440 minval = half_buffer -> data[i] ;
2442 if ( half_buffer -> data[i] > maxval )
2444 maxval = half_buffer -> data[i] ;
2448 fitpar[2] = minval ;
2449 fitpar[3] = maxval ;
2454 for ( i = 0 ; i < nel ; i++ )
2456 if ( half_buffer -> data[i] >= ( maxval + minval ) / 2. )
2466 fitpar[0] = ((float)init1 - 1.) ;
2467 fitpar[1] = ((float)init1 + 1.) ;
2470 for ( i = 0 ; i < NPAR ; i++ )
2484 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
2485 half_buffer -> data,
2486 wdat, &ndat, fitpar,
2487 dervpar, mpar, &numpar,
2488 &tol, &its, &lab )) )
2492 " no.: %d in slitlet: %d\n", iters, j) ;
2493 fitpar[0] = ((float)init1 - 1.) ;
2494 fitpar[1] = ((float)init1 + 1.) ;
2497 pos = (fitpar[0] + fitpar[1]) / 2. ;
2506 if ( left_right == 0 )
2512 if ( fabs(pos - ((
float)edgeclean[0] - 1. -
2513 (float)slit_length)) < diff_tol )
2515 sinfo_slit_pos[0][0] = pos ;
2520 " position of slitlet 0") ;
2521 if ( (
float) edgeclean[0] - 1. -
2522 (
float)slit_length < 0. )
2524 sinfo_slit_pos[0][0] = 0. ;
2528 sinfo_slit_pos[0][0] = (float)edgeclean[0] - 1. -
2529 (
float)slit_length ;
2535 if ( fabs( pos - (
float)margin ) < diff_tol )
2537 sinfo_slit_pos[j][0] = pos + (float)edgeclean[j-1] -
2543 " position of slitlet %d", j) ;
2544 sinfo_slit_pos[j][0] = (float)edgeclean[j-1] - 1. ;
2549 if ( fabs( pos - (
float)margin ) < diff_tol )
2551 sinfo_slit_pos[k][0] = pos + (float)edgeclean[k-1] -
2557 " position of slitlet %d", j) ;
2558 sinfo_slit_pos[k][0] = (float)edgeclean[k-1] - 1. ;
2568 if ( fabs( (
float)box_buffer->n_elements - pos -
2569 (
float)edgeclean[0] ) < diff_tol )
2571 sinfo_slit_pos[0][1] = (float)(box_buffer->n_elements -
2577 "right position of slitlet 0") ;
2578 sinfo_slit_pos[0][1] = (float)edgeclean[0] - 1. ;
2583 if ( fabs( (
float)box_buffer->n_elements - pos
2584 + (
float)edgeclean[j-1] - (
float)margin -
2585 (
float)edgeclean[j] ) < diff_tol )
2587 sinfo_slit_pos[j][1] = (float)(box_buffer->n_elements -
2589 + (float)edgeclean[j-1] - (
float)margin ;
2594 "position of slitlet %d", j) ;
2595 sinfo_slit_pos[j][1] = (float)edgeclean[j] - 1. ;
2600 if ( edgeclean[k-1] + slit_length > ilx )
2602 last_pos = (float)(ilx - 1) ;
2606 last_pos = (float)(edgeclean[k-1] - 1 + slit_length) ;
2608 if ( fabs( (
float)(box_buffer->n_elements - 1) - pos
2609 + (
float)edgeclean[k-1] - (float)margin -
2610 last_pos ) < diff_tol )
2612 sinfo_slit_pos[k][1] = (float)(box_buffer->n_elements -
2614 + (float)edgeclean[k-1] - (
float)margin ;
2619 "position of slitlet %d\n", j) ;
2620 sinfo_slit_pos[k][1] = last_pos ;
2625 sinfo_new_destroy_vector ( half_buffer ) ;
2630 sinfo_new_destroy_vector ( box_buffer ) ;
2633 cpl_free( sinfo_edge ) ;
2634 cpl_free( pos_row ) ;
2635 cpl_free( edgeclean ) ;
2636 cpl_free( dummyedge ) ;
2637 cpl_free( pos_rowclean ) ;
2677 sinfo_new_fit_slits_edge( cpl_image * lineImage,
2679 float ** sinfo_slit_pos,
2684 float* position=NULL ;
2685 int * sinfo_edge, * edgeclean ;
2687 int * pos_row, * pos_rowclean ;
2688 Vector * box_buffer ;
2689 Vector * half_buffer ;
2690 float max_intensity ;
2693 int i, j, k, m, n, ed ;
2696 int nel, n_right, left_right ;
2702 int iters, xdim, ndat ;
2705 float * xdat, * wdat ;
2707 float fitpar[NPAR] ;
2708 float dervpar[NPAR] ;
2709 float minval, maxval ;
2710 float pos, last_pos ;
2716 if ( NULL == lineImage )
2721 ilx=cpl_image_get_size_x(lineImage);
2723 pidata=cpl_image_get_data_float(lineImage);
2725 slit_length = (int) sqrt (ilx) ;
2733 if ( NULL == sinfo_slit_pos )
2739 if ( box_length < 4 ||
2740 box_length >= 2*slit_length )
2748 if ( y_box <= 0. || y_box > 3. )
2755 if ( diff_tol < 1. )
2762 sinfo_edge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2763 dummyedge = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2764 edgeclean = (
int*) cpl_calloc( slit_length-1,
sizeof(
int) ) ;
2765 pos_row = (
int*) cpl_calloc( 3*slit_length,
sizeof(
int) ) ;
2766 pos_rowclean = (
int*) cpl_calloc( slit_length,
sizeof(
int) ) ;
2774 while( agreed == -1 )
2777 max_intensity = -FLT_MAX ;
2778 for ( col = 0 ; col < slit_length ; col++ )
2780 for ( i = 0 ; i < par[0]->n_params ; i++ )
2782 if ( par[i]->column == col && par[i] -> line != bad_line )
2784 if ( par[i]->fit_par[0] > max_intensity )
2786 if ( par[i]->fit_par[1] >= 1. &&
2787 par[i]->fit_par[2] > 0. )
2789 max_intensity = par[i]->fit_par[0] ;
2801 line = par[found]->line ;
2802 column = par[found]->column ;
2803 row_pos = par[found]->fit_par[2] ;
2804 if ( found >= 0 && max_intensity > 0. )
2806 for ( i = 0 ; i < par[0]->n_params ; i++ )
2808 if ( par[i]->line == line-1 &&
2809 par[i]->column == column + slit_length )
2811 if ( par[i]->fit_par[2] <= (row_pos + y_box) &&
2812 par[i]->fit_par[2] >= (row_pos - y_box) )
2818 if ( bad_line != line )
2827 "the first image columns") ;
2828 cpl_free( sinfo_edge ) ;
2829 cpl_free( pos_row ) ;
2830 cpl_free( edgeclean ) ;
2831 cpl_free( dummyedge ) ;
2832 cpl_free( pos_rowclean ) ;
2840 sinfo_msg_error(
" no emission line found in the first image columns") ;
2841 cpl_free( sinfo_edge ) ;
2842 cpl_free( pos_row ) ;
2843 cpl_free( edgeclean ) ;
2844 cpl_free( dummyedge ) ;
2845 cpl_free( pos_rowclean ) ;
2852 position=cpl_calloc(ilx,
sizeof(
float)) ;
2854 for ( col = 0 ; col < ilx ; col++ )
2856 for ( i = 0 ; i < par[0]->n_params ; i++ )
2858 if ( par[i]->column == col && par[i]->line == line )
2860 if ( par[i]->fit_par[0] > 0. &&
2861 par[i]->fit_par[1] >= 1. &&
2862 par[i]->fit_par[2] > 0. )
2864 position[n] = par[i]->fit_par[2] ;
2865 if ( n > 0 && fabs(position[n] - position[n-1]) > y_box )
2867 sinfo_edge[ed] = col ;
2868 pos_row[ed] = sinfo_new_nint( position[n-1] ) ;
2870 if ( col >= ilx - slit_length - 5 )
2872 pos_row[ed] = sinfo_new_nint( position[n] ) ;
2880 if ( ed < (slit_length - 1) )
2883 cpl_free( sinfo_edge ) ;
2884 cpl_free( pos_row ) ;
2885 cpl_free( edgeclean ) ;
2886 cpl_free( dummyedge ) ;
2887 cpl_free( pos_rowclean ) ;
2892 for ( i = 1 ; i <= ed ; i ++ )
2896 if ( (sinfo_edge[i-1] - sinfo_edge[i-2]) < slit_length - 3 ||
2897 (sinfo_edge[i-1] - sinfo_edge[i-2]) > slit_length + 3 )
2899 dummyedge[i-1] = -1 ;
2903 if (dummyedge[i-1] != -1)
2905 dummyedge[i-1] = sinfo_edge[i-1] ;
2913 if ( (sinfo_edge[i] - sinfo_edge[i-1]) < slit_length - 3 ||
2914 (sinfo_edge[i] - sinfo_edge[i-1]) > slit_length + 3 )
2919 if ( i + 1 < ed && dummyedge[i] != -1 )
2921 if ( (sinfo_edge[i+1] - sinfo_edge[i]) < slit_length - 3 ||
2922 (sinfo_edge[i+1] - sinfo_edge[i]) > slit_length + 3 )
2924 dummyedge[i+1] = -1 ;
2930 for ( i = 0 ; i < ed ; i++ )
2932 if ( dummyedge[i] != -1 && dummyedge[i] != 0 )
2934 edgeclean[k] = dummyedge[i] ;
2935 pos_rowclean[k] = pos_row[i] ;
2937 if( edgeclean[k-1] > (ilx - slit_length - 6 ) )
2939 pos_rowclean[k] = pos_row[ed] ;
2944 if ( k != slit_length - 1 )
2947 cpl_free( sinfo_edge ) ;
2948 cpl_free( pos_row ) ;
2949 cpl_free( edgeclean ) ;
2950 cpl_free( dummyedge ) ;
2951 cpl_free( pos_rowclean ) ;
2956 margin = box_length / 2 ;
2963 for ( j = 0 ; j <= k ; j++ )
2968 box_buffer = sinfo_new_vector( edgeclean[0] + margin ) ;
2969 for( col = 0 ; col < edgeclean[0] + margin ; col++ )
2972 for ( row = pos_rowclean[0] - sinfo_new_nint(y_box) ;
2973 row <= pos_rowclean[0] + sinfo_new_nint(y_box) ; row++ )
2975 if ( maxval < pidata[col + ilx*row] )
2977 maxval = pidata[col + ilx*row] ;
2980 box_buffer->data[m] = maxval ;
2986 box_buffer = sinfo_new_vector( edgeclean[j] -
2987 edgeclean[j-1] + 2*margin ) ;
2988 for ( col = edgeclean[j - 1] - margin ;
2989 col < edgeclean[j] + margin ; col++ )
2992 for ( row = pos_rowclean[j] - sinfo_new_nint(y_box) ;
2993 row <= pos_rowclean[j] + sinfo_new_nint(y_box) ; row++ )
2995 if ( maxval < pidata[col + ilx*row] )
2997 maxval = pidata[col + ilx*row] ;
3000 box_buffer->data[m] = maxval ;
3006 box_buffer = sinfo_new_vector( ilx - edgeclean[k-1] + margin ) ;
3007 for ( col = edgeclean[k - 1] - margin ; col < ilx ; col++ )
3010 for ( row = pos_rowclean[k] - sinfo_new_nint(y_box) ;
3011 row <= pos_rowclean[k] + sinfo_new_nint(y_box) ; row++ )
3013 if ( maxval < pidata[col + ilx*row] )
3015 maxval = pidata[col + ilx*row] ;
3018 box_buffer->data[m] = maxval ;
3023 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
3026 if ( left_right == 0 )
3028 nel = box_buffer -> n_elements / 2 ;
3032 if ( box_buffer -> n_elements % 2 == 0 )
3034 nel = box_buffer -> n_elements / 2 ;
3038 nel = box_buffer -> n_elements / 2 + 1 ;
3044 half_buffer = sinfo_new_vector( nel ) ;
3045 if ( left_right == 0 )
3047 for ( i = 0 ; i < nel ; i++ )
3049 half_buffer -> data[i] = box_buffer -> data[i] ;
3055 for ( i = box_buffer -> n_elements - 1 ;
3056 i >= box_buffer -> n_elements - nel ; i-- )
3058 half_buffer -> data[n_right] = box_buffer -> data[i] ;
3063 xdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
3064 wdat = (
float *) cpl_calloc( nel,
sizeof (
float) ) ;
3065 mpar = (
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
3070 for ( i = 0 ; i < nel ; i++ )
3074 if ( half_buffer -> data[i] < minval )
3076 minval = half_buffer -> data[i] ;
3078 if ( half_buffer -> data[i] > maxval )
3080 maxval = half_buffer -> data[i] ;
3084 fitpar[2] = minval ;
3085 fitpar[3] = maxval ;
3090 for ( i = 0 ; i < nel ; i++ )
3092 if ( half_buffer -> data[i] >= ( maxval + minval ) / 2. )
3102 fitpar[0] = ((float)init1 - 1.) ;
3103 fitpar[1] = ((float)init1 + 1.) ;
3106 for ( i = 0 ; i < NPAR ; i++ )
3120 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
3121 half_buffer -> data,
3122 wdat, &ndat, fitpar,
3123 dervpar, mpar, &numpar,
3124 &tol, &its, &lab )) )
3128 "no.: %d in slitlet: %d", iters, j) ;
3129 fitpar[0] = ((float)init1 - 1.) ;
3130 fitpar[1] = ((float)init1 + 1.) ;
3133 pos = (fitpar[0] + fitpar[1]) / 2. ;
3142 if ( left_right == 0 )
3148 if ( fabs(pos - ((
float)edgeclean[0] - 1. -
3149 (float)slit_length)) < diff_tol )
3151 sinfo_slit_pos[0][0] = pos ;
3156 "left position of slitlet 0") ;
3157 if ((
float) edgeclean[0] - 1. -
3158 (
float)slit_length < 0. )
3160 sinfo_slit_pos[0][0] = 0. ;
3164 sinfo_slit_pos[0][0] = (float)edgeclean[0] - 1. -
3165 (
float)slit_length ;
3171 if ( fabs( pos - (
float)margin ) < diff_tol )
3173 sinfo_slit_pos[j][0] = pos + (float)edgeclean[j-1] -
3179 "left position of slitlet %d", j) ;
3180 sinfo_slit_pos[j][0] = (float)edgeclean[j-1] - 1. ;
3185 if ( fabs( pos - (
float)margin ) < diff_tol )
3187 sinfo_slit_pos[k][0] = pos + (float)edgeclean[k-1] -
3193 "position of slitlet %d", j) ;
3194 sinfo_slit_pos[k][0] = (float)edgeclean[k-1] - 1. ;
3204 if ( fabs( (
float)box_buffer->n_elements - pos -
3205 (
float)edgeclean[0] ) < diff_tol )
3207 sinfo_slit_pos[0][1] = (float)(box_buffer->n_elements -
3213 "right position of slitlet 0") ;
3214 sinfo_slit_pos[0][1] = (float)edgeclean[0] - 1. ;
3219 if ( fabs( (
float)box_buffer->n_elements - pos
3220 + (
float)edgeclean[j-1] - (
float)margin -
3221 (
float)edgeclean[j] ) < diff_tol )
3223 sinfo_slit_pos[j][1] = (float)(box_buffer->n_elements -
3225 + (float)edgeclean[j-1] - (
float)margin;
3230 "right position of slitlet %d", j) ;
3231 sinfo_slit_pos[j][1] = (float)edgeclean[j] - 1. ;
3236 if ( edgeclean[k-1] + slit_length > ilx )
3238 last_pos = (float)(ilx - 1) ;
3242 last_pos = (float)(edgeclean[k-1] - 1 + slit_length) ;
3244 if ( fabs( (
float)(box_buffer->n_elements - 1) - pos
3245 + (
float)edgeclean[k-1] - (float)margin -
3246 last_pos ) < diff_tol )
3248 sinfo_slit_pos[k][1] = (float)(box_buffer->n_elements -
3250 + (float)edgeclean[k-1] - (
float)margin ;
3255 "right position of slitlet %d", j) ;
3256 sinfo_slit_pos[k][1] = last_pos ;
3261 sinfo_new_destroy_vector ( half_buffer ) ;
3266 sinfo_new_destroy_vector ( box_buffer ) ;
3269 cpl_free( sinfo_edge ) ;
3270 cpl_free( pos_row ) ;
3271 cpl_free( edgeclean ) ;
3272 cpl_free( dummyedge ) ;
3273 cpl_free( pos_rowclean ) ;
3274 cpl_free( position );
3301 sinfo_new_fit_slits_edge_with_estimate ( cpl_image * lineImage,
3302 float ** sinfo_slit_pos,
3309 int* position=NULL ;
3310 Vector * box_buffer ;
3311 Vector * in_buffer ;
3314 int col_first, col_last ;
3315 int row_first, row_last ;
3321 int iters, xdim, ndat ;
3324 float * xdat, * wdat ;
3326 float fitpar[NPAR] ;
3327 float dervpar[NPAR] ;
3328 float minval, maxval ;
3331 int slitposition[SLITLENGTH] ;
3332 pixelvalue rowpos[SLITLENGTH] ;
3337 slit_length = SLITLENGTH ;
3338 slit_length = N_SLITLETS ;
3341 if ( NULL == lineImage )
3346 ilx=cpl_image_get_size_x(lineImage);
3347 ily=cpl_image_get_size_y(lineImage);
3348 pidata=cpl_image_get_data_float(lineImage);
3350 if ( NULL == sinfo_slit_pos )
3356 if ( box_length < 4 ||
3357 box_length > 2*slit_length )
3367 if ( y_box <= 0. || y_box > 6. )
3370 sinfo_msg_error(
"You have chosen y_box=%f not in range (0,6]!",y_box);
3373 if ( diff_tol <= 0. )
3379 if ( low_pos >= high_pos || low_pos < 0 ||
3380 high_pos <= 0 || high_pos > ily )
3387 position=cpl_calloc(ilx,
sizeof(
int)) ;
3389 for ( col = 0 ; col < ilx ; col++ )
3393 for ( row = low_pos ; row <= high_pos ; row++ )
3395 if ( maxval < pidata[col+row*ilx] )
3397 maxval = pidata[col+row*ilx] ;
3401 if ( maxval > -FLT_MAX && found_row > low_pos )
3403 position[col] = found_row ;
3416 for ( j = 0 ; j < slit_length ; j++ )
3422 for ( col = sinfo_new_nint(sinfo_slit_pos[j][0])+ 1 ;
3423 col < sinfo_new_nint(sinfo_slit_pos[j][1]) -1 ; col++ )
3425 rowpos[n] = (pixelvalue)position[col] ;
3428 slitposition[j] = (int)sinfo_new_median(rowpos, n) ;
3429 for ( left_right = 0 ; left_right <= 1 ; left_right++ )
3433 col_first = sinfo_new_nint( sinfo_slit_pos[j][left_right] ) -
3435 col_last = sinfo_new_nint( sinfo_slit_pos[j][left_right] ) +
3437 if ( col_first < 0 )
3442 if ( col_last > ilx )
3447 if ( col_last - col_first <= 0 )
3452 box_buffer = sinfo_new_vector( col_last - col_first ) ;
3454 if ( left_right == 0 )
3456 for( col = col_first ; col < col_last ; col++ )
3458 row_first = slitposition[j] - sinfo_new_nint(y_box) ;
3459 row_last = slitposition[j] + sinfo_new_nint(y_box) ;
3460 if ( row_first < 0 )
3464 if ( row_last >= ily )
3466 row_last = ily - 1 ;
3469 for ( row = row_first ; row <= row_last ; row++ )
3471 if ( maxval < pidata[col + ilx*row] )
3473 maxval = pidata[col + ilx*row] ;
3476 box_buffer->data[m] = maxval ;
3482 for( col = col_last-1 ; col >= col_first ; col-- )
3484 row_first = slitposition[j] - sinfo_new_nint(y_box) ;
3485 row_last = slitposition[j] + sinfo_new_nint(y_box) ;
3486 if ( row_first < 0 )
3490 if ( row_last >= ily )
3492 row_last = ily - 1 ;
3495 for ( row = row_first ; row <= row_last ; row++ )
3497 if ( maxval < pidata[col + ilx*row] )
3499 maxval = pidata[col + ilx*row] ;
3502 box_buffer->data[m] = maxval ;
3507 xdat=(
float *)cpl_calloc( box_buffer->n_elements, sizeof (
float));
3508 wdat=(
float *)cpl_calloc( box_buffer->n_elements, sizeof (
float));
3509 mpar=(
int *) cpl_calloc( NPAR,
sizeof (
int) ) ;
3514 for ( i = 0 ; i < box_buffer->n_elements ; i++ )
3518 if ( box_buffer -> data[i] < minval )
3520 minval = box_buffer -> data[i] ;
3522 if ( box_buffer -> data[i] > maxval )
3524 maxval = box_buffer -> data[i] ;
3527 fitpar[2] = minval ;
3528 fitpar[3] = maxval ;
3537 n_buf = box_buffer->n_elements + box_length/2 ;
3538 in_buffer = sinfo_new_vector( n_buf ) ;
3539 for ( i = 0 ; i < box_length/2 ; i++ )
3541 in_buffer -> data[i] = minval ;
3544 for ( i = box_length/2 ; i < n_buf ; i++ )
3546 in_buffer -> data[i] = box_buffer -> data[shift] ;
3549 sinfo_new_destroy_vector ( box_buffer ) ;
3550 box_buffer = sinfo_new_vector ( n_buf ) ;
3551 for ( i = 0 ; i < n_buf ; i++ )
3553 box_buffer -> data[i] = in_buffer -> data[i] ;
3555 sinfo_new_destroy_vector ( in_buffer ) ;
3558 fitpar[0] = (float)box_buffer->n_elements/2. - 1. ;
3559 fitpar[1] = (
float)box_buffer->n_elements/2. + 1. ;
3561 for ( i = 0 ; i < NPAR ; i++ )
3568 ndat = box_buffer->n_elements ;
3575 if ( 0 > ( iters = sinfo_new_lsqfit_edge( xdat, &xdim,
3577 wdat, &ndat, fitpar,
3578 dervpar, mpar, &numpar,
3579 &tol, &its, &lab )) )
3582 "no.: %d in slitlet: %d\n", iters, j) ;
3583 sinfo_new_destroy_vector(box_buffer) ;
3589 if ( fitpar[1] <= fitpar[0] )
3592 "sinfo_new_edge function in slitlet: %d",j);
3593 sinfo_new_destroy_vector(box_buffer) ;
3600 pos = (fitpar[0] + fitpar[1])/2. ;
3603 pos -= (float)box_length/2. ;
3613 if ( left_right == 0 )
3615 new_pos = (float)col_first + pos ;
3619 new_pos = (float)col_last-1 - pos ;
3621 if ( fabs(new_pos - sinfo_slit_pos[j][left_right]) < diff_tol )
3623 sinfo_slit_pos[j][left_right] = new_pos ;
3628 " take the estimated slitlet positiona"
3629 " in slitlet: %d\n", j) ;
3636 sinfo_new_destroy_vector ( box_buffer ) ;