221 #include "sinfo_vltPort.h"
231 #include "sinfo_function_1d.h"
232 #include "sinfo_wave_calibration.h"
233 #include "sinfo_solve_poly_root.h"
234 #include "sinfo_recipes.h"
235 #include "sinfo_globals.h"
236 #include "sinfo_svd.h"
237 #include "sinfo_msg.h"
255 FitParams ** sinfo_new_fit_params(
int n_params )
257 FitParams ** new_params =NULL;
258 FitParams * temp_params =NULL;
259 float * temp_fit_mem =NULL;
260 float * temp_derv_mem=NULL;
270 if (NULL==(new_params=(FitParams **) cpl_calloc ( n_params ,
271 sizeof (FitParams*) ) ) )
276 if ( NULL == (temp_params = cpl_calloc ( n_params ,
sizeof (FitParams) ) ) )
279 cpl_free(new_params);
282 if ( NULL == (temp_fit_mem = (
float *) cpl_calloc( n_params*MAXPAR,
286 cpl_free(temp_params);
287 cpl_free(new_params);
292 if ( NULL == (temp_derv_mem =
293 (
float *) cpl_calloc( n_params*MAXPAR,
sizeof (
float) ) ) )
296 cpl_free(temp_params);
297 cpl_free(new_params);
298 cpl_free(temp_fit_mem);
302 for ( i = 0 ; i < n_params ; i ++ )
304 new_params[i] = temp_params+i;
305 new_params[i] -> fit_par = temp_fit_mem+i*MAXPAR;
306 new_params[i] -> derv_par = temp_derv_mem+i*MAXPAR;
307 new_params[i] -> column = 0 ;
308 new_params[i] -> line = 0 ;
309 new_params[i] -> wavelength = 0. ;
310 new_params[i] -> n_params = n_params ;
323 void sinfo_new_destroy_fit_params ( FitParams *** params )
326 if ( *params == NULL )
331 cpl_free ( (*params)[0] -> fit_par ) ;
332 (*params)[0] -> fit_par=NULL;
333 cpl_free ( (*params)[0] -> derv_par ) ;
334 (*params)[0] -> derv_par=NULL;
335 cpl_free ( (*params)[0] ) ;
337 cpl_free ( (*params) ) ;
349 void sinfo_new_dump_fit_params_to_ascii ( FitParams ** params,
const char * filename )
354 if ( NULL == params )
360 if ( NULL == filename )
366 if ( NULL == (fp = fopen ( filename,
"w" ) ) )
372 for ( i = 0 ; i < params[0] -> n_params ; i++ )
374 fprintf(fp,
"%d %d %d %f %f %f %f %f %f %f %f %f\n",
378 params[i]->wavelength,
379 params[i]->fit_par[0],
380 params[i]->fit_par[1],
381 params[i]->fit_par[2],
382 params[i]->fit_par[3],
383 params[i]->derv_par[0],
384 params[i]->derv_par[1],
385 params[i]->derv_par[2],
386 params[i]->derv_par[3] ) ;
400 sinfo_new_dump_ascii_to_fit_params ( FitParams ** params,
char * filename )
405 if ( NULL == params )
411 if ( NULL == filename )
417 if ( NULL == (fp = fopen ( filename,
"r" ) ) )
423 for ( i = 0 ; i < params[0]->n_params ; i++ )
425 fscanf(fp,
"%d %d %d %f %f %f %f %f %f %f %f %f\n",
426 ¶ms[i]->n_params,
429 ¶ms[i]->wavelength,
430 ¶ms[i]->fit_par[0],
431 ¶ms[i]->fit_par[1],
432 ¶ms[i]->fit_par[2],
433 ¶ms[i]->fit_par[3],
434 ¶ms[i]->derv_par[0],
435 ¶ms[i]->derv_par[1],
436 ¶ms[i]->derv_par[2],
437 ¶ms[i]->derv_par[3] ) ;
480 int sinfo_new_find_lines(cpl_image * lineImage,
481 float * wave_position,
482 float * wave_intensity,
485 float ** wavelength_clean,
496 float ** wavelength ;
500 float * column, * tempcol ;
503 float * wave_buffer ;
518 if ( NULL == lineImage )
524 lx=cpl_image_get_size_x(lineImage);
525 ly=cpl_image_get_size_y(lineImage);
526 pdata=cpl_image_get_data_float(lineImage);
528 if ( n_lines <= 0 || NULL == wave_position )
533 if ( NULL == wave_intensity )
539 if ( dispersion1 == 0. )
545 if ( row_clean == NULL )
551 if ( wavelength_clean == NULL )
557 if ( beginWave <= 0. )
562 if ( mindiff < -100. )
568 if ( halfWidth <= 0 )
574 if ( n_found_lines == NULL )
580 if ( sigma <= 0. || sigma >= ly / 2)
587 row = (
int**) cpl_calloc( lx,
sizeof(
int*)) ;
588 wavelength = (
float**) cpl_calloc( lx,
sizeof(
float*)) ;
589 row_mem = cpl_calloc( n_lines*lx,
sizeof(
int) ) ;
590 wave_mem = cpl_calloc( n_lines*lx,
sizeof(
float) ) ;
591 for ( i = 0 ; i <lx ; i++ )
593 row[i] = row_mem + i*n_lines;
594 wavelength[i] = wave_mem + i*n_lines;
598 if ( wave_position[0] > 10000. )
603 else if ( wave_position[0] > 1000. && wave_position[0] < 10000. )
619 tempcol = (
float*) cpl_calloc(ly,
sizeof(
float)) ;
624 column = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
625 lines = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
626 conv_lines = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
627 wave_buffer = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
628 dummy_row = (
int*) cpl_calloc(n_lines,
sizeof(
int)) ;
630 for ( col = 0 ; col < lx ; col++ )
632 n_found_lines[col] = 0 ;
634 for ( i = 0 ; i < ly ; i++ )
636 if (isnan(pdata[col + i*lx]) )
642 sum = sum + pdata[col + i*lx] ;
643 tempcol[i] = pdata[col + i*lx];
647 colmedian = sinfo_new_median ( tempcol, ly);
649 if ( meanval - colmedian < mindiff )
652 "(mean: %f, diff: %f) in image column: "
653 "%d to correlate emission lines\n",
654 meanval, meanval - colmedian,col) ;
658 for ( i = 0 ; i < ly ; i++ )
663 for ( i = 0 ; i < n_lines ; i++ )
669 for ( i = 0 ; i < ly ; i++ )
671 if ( isnan(pdata[col+i*lx]) )
677 column[i] = pdata[col + i*lx] ;
682 lines[i] = (dispersion1 * (float) (i-ly/2) +
683 dispersion2 * (float) (i-ly/2) *
691 for ( j = 0 ; j < n_lines ; j ++ )
695 if ( (wave_position[j] >= (lines[i] -
696 fabs(dispersion1)/2.*angst)) &&
697 (wave_position[j] <= (lines[i] +
698 fabs(dispersion1)/2.*angst)) )
700 buf1 = wave_intensity[j] ;
702 buf2 = wave_position[j] ;
707 wave_buffer[i] = buf2 ;
713 if ( lines[i] != 0. )
716 gmin = sinfo_new_nint((
float) i - 2. * sigma) ;
717 gmax = sinfo_new_nint((
float) i + 2. * sigma) ;
728 for ( j = gmin ; j <= gmax ; j++ )
731 lines[i] * exp( (
double)( -0.5*((j - i)*(j - i)))/
732 (
double) (sigma*sigma) ) ;
739 int position = sinfo_new_correlation(column+5, conv_lines+5, ly-10 ) ;
740 if ( abs (position) > ly / 4 )
743 " image (%d) seems to be too high in column: %d",
751 for ( j = 0 ; j < n_lines ; j ++ ) {
757 for ( i = 0 ; i < ly ; i ++ )
759 if ( lines[i] != 0.0 )
761 if ( (i - position) >= 0 && (i - position) < ly )
763 row[col][j] = i - position ;
766 wavelength[col][j] = wave_buffer[i] / angst ;
779 for ( k = 1 ; k <= j && k<(lx-1); k ++ )
781 if (dummy_row[k-1] != -1)
783 dummy_row[k-1] = row[col][k-1] ;
785 if ( (row[col][k] - row[col][k-1]) <= 2*halfWidth )
787 dummy_row[k-1] = -1 ;
796 if ( (row[col][j] != -999) &&
797 (row[col][k+1] - row[col][k]) <= 2*halfWidth)
803 dummy_row[k+1] = -1 ;
809 for ( k = 0 ; k < j ; k ++ )
811 if ( dummy_row[k] != -1 && dummy_row[k] != 0 )
813 row_clean[col][m] = dummy_row[k] ;
814 wavelength_clean[col][m] = wavelength[col][k] ;
819 n_found_lines[col] = m ;
821 *sum_lines += n_found_lines[col] ;
825 cpl_free (conv_lines) ;
826 cpl_free (dummy_row) ;
827 cpl_free (wave_buffer) ;
829 cpl_free (wave_mem) ;
832 cpl_free (wavelength) ;
847 sinfo_new_read_list(
char * listname,
849 float * lineIntensity )
854 if ( NULL == lineCenter )
860 if ( NULL == lineIntensity )
866 if ( NULL == (fp = fopen ( listname,
"r" ) ) )
873 while ( fscanf( fp,
"%f %f", &lineCenter[i], &lineIntensity[i] ) != EOF )
915 int sinfo_new_line_fit ( cpl_image * mergedImage,
929 int iters, xdim, ndat ;
932 float maxval, tol, lab ;
937 if ( mergedImage == NULL )
942 lx=cpl_image_get_size_x(mergedImage);
943 ly=cpl_image_get_size_y(mergedImage);
944 pdata=cpl_image_get_data_float(mergedImage);
952 if ( column < 0 || column > lx )
957 if ( halfWidth < 0 || halfWidth > ly )
962 if ( lineRow < 0 || lineRow > ly )
967 if ( min_amplitude < 1. )
974 for ( i = 0 ; i < line -> n_elements ; i++)
979 par -> column = column ;
980 par -> line = lineInd ;
986 for ( i = lineRow-halfWidth ; i <= lineRow+halfWidth ; i++ )
988 if ( i < 0 || i >= ly )
995 line -> data[j] = pdata[column + i*lx] ;
1005 position = -INT32_MAX ;
1006 for ( i = 0 ; i < line -> n_elements ; i++ )
1010 if ( line -> data[i] >= maxval )
1012 maxval = line -> data[i] ;
1019 ndat = line -> n_elements ;
1024 par -> fit_par[1] = fwhm ;
1025 par -> fit_par[2] = (float) position ;
1026 par -> fit_par[3] = (float) (line -> data[0] +
1027 line -> data[line->n_elements - 1]) / 2.0 ;
1028 par -> fit_par[0] = maxval - (par -> fit_par[3]) ;
1031 if ( par->fit_par[0] < min_amplitude )
1033 cpl_msg_debug (
"sinfo_linefit:",
1034 " sorry, amplitude of line too low to fit: %f",
1039 for ( i = 0 ; i < MAXPAR ; i++ )
1041 par -> derv_par[i] = 0.0 ;
1046 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
1048 &ndat, par -> fit_par,
1049 par -> derv_par, mpar,
1050 &numpar, &tol, &its, &lab )) )
1052 cpl_msg_debug (
"sinfo_linefit:",
1053 " sinfo_new_lsqfit_c: least squares fit failed,"
1054 " error no.: %d\n", iters) ;
1060 par -> fit_par[2] = (float) (lineRow - halfWidth) + par -> fit_par[2] ;
1090 int sinfo_new_fit_lines ( cpl_image * line_image,
1091 FitParams ** allParams,
1095 float ** wavelength,
1097 float min_amplitude )
1103 float * xdat, * wdat;
1108 if ( line_image == NULL )
1113 lx=cpl_image_get_size_x(line_image);
1117 if ( n_lines == NULL )
1122 if ( row == NULL || width <= 0 )
1127 if ( wavelength == NULL )
1136 line = sinfo_new_vector (2*width + 1) ;
1138 xdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
1139 wdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
1140 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
1143 for ( i = 0 ; i < lx ; i++ )
1145 if ( n_lines[i] == 0 )
1150 for ( l = 0 ; l < n_lines[i] ; l++ )
1152 if ( row[i][l] <= 0 )
1162 if ( (result = sinfo_new_line_fit ( line_image,
1163 allParams[k], fwhm, l, i,
1165 min_amplitude,line,mpar,
1168 cpl_msg_debug (
"sinfo_fitLines:",
1169 " sinfo_linefit failed, error no.: %d,"
1170 " column: %d, row: %d, line: %d\n",
1171 result, i, row[i][l], l) ;
1174 if ( (allParams[k] -> fit_par[0] <= 0.) ||
1175 (allParams[k] -> fit_par[1] <= 0.)
1176 || (allParams[k] -> fit_par[2] <= 0.) )
1179 " line: %d\n", i, l) ;
1182 allParams[k] -> wavelength = wavelength[i][l] ;
1188 sinfo_new_destroy_vector(line);
1224 float sinfo_new_polyfit( FitParams ** par,
1235 float ** ucoefs, ** vcoefs, ** covar ;
1237 float * lambda, * posit ;
1238 float * weight, * resid ;
1239 float * newlam, * newpos, * newwet ;
1240 float * wcoefs=NULL ;
1247 for ( i = 0 ; i < n_fitcoefs ; i++ )
1270 if ( dispersion == 0. )
1276 offset = (float)(n_rows - 1)/2. ;
1280 mem = (
float*) cpl_calloc( n_lines*7,
sizeof (
float) ) ;
1282 posit = mem + n_lines;
1283 weight = mem + n_lines*2;
1284 resid = mem + n_lines*3;
1285 newlam = mem + n_lines*4;
1286 newpos = mem + n_lines*5;
1287 newwet = mem + n_lines*6;
1298 ucoefs = sinfo_matrix ( 1, n_lines, 1, n_fitcoefs ) ;
1299 vcoefs = sinfo_matrix ( 1, n_lines, 1, n_fitcoefs ) ;
1300 covar = sinfo_matrix ( 1, n_fitcoefs, 1, n_fitcoefs ) ;
1301 wcoefs=cpl_calloc(n_fitcoefs,
sizeof(
float)) ;
1305 for ( i = 0 ; i < (par[0] -> n_params) ; i ++ )
1309 for ( j = 0 ; j < n_lines ; j ++ )
1311 if ( (par[i] -> column == column) && (par[i] -> line == j) )
1321 if ( par[found] -> derv_par[2] != 0. &&
1322 par[found] -> fit_par[2] > 0. &&
1323 par[found] -> wavelength > 0. &&
1324 par[found] -> fit_par[1] > 0. &&
1325 par[found] -> fit_par[0] > 0. )
1332 posit[n] = par[found] -> fit_par[2] ;
1333 weight[n] = par[found] -> derv_par[2] ;
1334 lambda[n] = par[found] -> wavelength ;
1346 if ( num < n_fitcoefs )
1349 "determine the three coefficients.\n", column) ;
1350 for ( i = 0 ; i < n_fitcoefs ; i++ )
1355 sinfo_free_matrix ( ucoefs, 1, 1 ) ;
1356 sinfo_free_matrix ( vcoefs, 1, 1 ) ;
1357 sinfo_free_matrix ( covar, 1, 1 ) ;
1375 for ( i = 0 ; i < num ; i ++ )
1377 posit[i] = (posit[i] - offset)/offset ;
1378 weight[i] *= fabs(dispersion) ;
1382 sinfo_svd_fitting( posit - 1, lambda - 1,
1383 weight - 1, num, acoefs-1, n_fitcoefs,
1384 ucoefs, vcoefs, wcoefs-1, covar, &chisq, sinfo_fpol ) ;
1387 for ( i = 1 ; i < n_fitcoefs ; i++ )
1389 acoefs[i] /= pow(offset, i) ;
1396 for ( i = 0 ; i < num ; i++ )
1399 for ( k = 0 ; k < n_fitcoefs ; k++ )
1401 result += acoefs[k] * pow(posit[i], k) ;
1404 resid[i] = lambda[i] - result ;
1406 if ( fabs( resid[i] ) > max_residual)
1412 newlam[j] = lambda[i] ;
1413 newpos[j] = posit[i] ;
1414 newwet[j] = weight[i] ;
1420 if ( num >= n_fitcoefs )
1422 sinfo_svd_fitting( newpos - 1, newlam - 1,
1423 newwet - 1, num, acoefs-1, n_fitcoefs, ucoefs,
1424 vcoefs, wcoefs-1, covar, &chisq, sinfo_fpol ) ;
1427 for ( i = 0 ; i < n_fitcoefs ; i++ )
1429 acoefs[i] /= pow(offset, i) ;
1430 dacoefs[i] = sqrt( (
double) covar[i+1][i+1] ) / pow(offset, i) ;
1436 "due to high residuals, fit coefficients are set "
1437 "zero, in column: %d\n", *n_reject, column) ;
1438 for ( i = 0 ; i < n_fitcoefs ; i++ )
1445 sinfo_free_matrix ( ucoefs, 1, 1 ) ;
1446 sinfo_free_matrix ( vcoefs, 1, 1 ) ;
1447 sinfo_free_matrix ( covar, 1, 1 ) ;
1477 float sinfo_new_coefs_cross_fit (
int n_columns,
1482 float sigma_factor )
1485 float* sub_col_index=NULL ;
1486 float* sub_acoefs=NULL ;
1487 float* sub_dacoefs=NULL ;
1488 float* wcoefs=NULL ;
1489 float ** ucoefs, **vcoefs, **covar ;
1491 float * acoefsclean ;
1492 double sum, sumq, mean ;
1494 double cliphi, cliplo ;
1496 int i, n, num, ndata ;
1500 if ( n_columns < 1 )
1505 if ( acoefs == NULL || dacoefs == NULL )
1507 sinfo_msg_error(
" coeffs or errors of coefficients are not given\n") ;
1510 if ( bcoefs == NULL )
1516 if ( n_fitcoefs < 1 )
1521 if ( sigma_factor <= 0. )
1527 offset = (float)(n_columns - 1) / 2. ;
1534 wcoefs=cpl_calloc(n_fitcoefs,
sizeof(
float)) ;
1537 for ( i = 0 ; i < n_columns ; i++ )
1539 if ( isnan(acoefs[i]) || acoefs[i] == 0. || dacoefs[i] == 0. )
1548 acoefsclean = (
float*) cpl_calloc(nc ,
sizeof(
float)) ;
1550 for ( i = 0 ; i < n_columns ; i++ )
1552 if ( isnan(acoefs[i]) || acoefs[i] == 0. || dacoefs[i] == 0. )
1558 acoefsclean[nc] = acoefs[i] ;
1562 sinfo_pixel_qsort(acoefsclean, nc) ;
1568 for ( i = (
int)((
float)nc*LOW_REJECT) ;
1569 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
1571 sum += (double)acoefsclean[i] ;
1572 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
1575 mean = sum/(double)n ;
1576 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
1577 cliphi = mean + sigma * (double)sigma_factor ;
1578 cliplo = mean - sigma * (double)sigma_factor ;
1580 sub_col_index=cpl_calloc(n_columns,
sizeof(
float)) ;
1581 sub_acoefs=cpl_calloc(n_columns,
sizeof(
float));
1582 sub_dacoefs=cpl_calloc(n_columns,
sizeof(
float)) ;
1586 for ( i = 0 ; i < n_columns ; i++ )
1589 float col_index = (float) i ;
1592 if ( !isnan(acoefs[i]) &&
1593 (acoefs[i] <= cliphi) && (acoefs[i] >= cliplo) &&
1594 (dacoefs[i] != 0. ) && (acoefs[i] != 0.) )
1596 sub_acoefs[num] = acoefs[i] ;
1597 sub_dacoefs[num] = dacoefs[i] ;
1598 sub_col_index[num] = col_index ;
1604 if ( ndata < n_fitcoefs )
1607 "the fit coefficients.\n") ;
1609 cpl_free(sub_dacoefs) ;
1610 cpl_free(sub_col_index) ;
1611 cpl_free(sub_acoefs) ;
1616 ucoefs = sinfo_matrix(1, ndata, 1, n_fitcoefs) ;
1617 vcoefs = sinfo_matrix(1, ndata, 1, n_fitcoefs) ;
1618 covar = sinfo_matrix ( 1, n_fitcoefs, 1, n_fitcoefs ) ;
1621 for ( i = 0 ; i < ndata ; i++ )
1623 sub_col_index[i] = (sub_col_index[i] - offset) / offset ;
1627 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
1628 sub_dacoefs-1, ndata, bcoefs-1,
1629 n_fitcoefs, ucoefs, vcoefs,
1630 wcoefs-1, covar, &chisq, sinfo_fpol ) ;
1633 for ( i = 0 ; i < n_fitcoefs ; i ++ )
1635 bcoefs[i] /= pow(offset, i) ;
1639 cpl_free (acoefsclean) ;
1640 sinfo_free_matrix( ucoefs, 1, 1) ;
1641 sinfo_free_matrix( vcoefs, 1, 1) ;
1642 sinfo_free_matrix ( covar, 1, 1 ) ;
1644 cpl_free(sub_col_index) ;
1645 cpl_free(sub_acoefs) ;
1646 cpl_free(sub_dacoefs) ;
1672 cpl_image * sinfo_new_wave_map( cpl_image * lineImage,
1681 cpl_image * retImage ;
1682 float cenpos, cenpix ;
1683 float centreval, centrepix, wavelag ;
1686 int i, j, k, l, line, col, row, found, sign ;
1687 int var, maxlag, cmin, cmax, offset ;
1697 float* emline=NULL ;
1709 gsl_poly_complex_workspace * w ;
1711 if ( NULL == lineImage )
1716 ilx=cpl_image_get_size_x(lineImage);
1717 ily=cpl_image_get_size_y(lineImage);
1718 pidata=cpl_image_get_data_float(lineImage);
1720 if ( NULL == wavelength || n_lines <= 0 )
1726 if ( NULL == intensity )
1732 if ( NULL == bcoefs )
1738 if ( magFactor <= 1 )
1745 if ( NULL == ( retImage = cpl_image_new( ilx, ily,CPL_TYPE_FLOAT ) ))
1754 podata=cpl_image_get_data_float(retImage);
1757 var = (magFactor - 1)*(magFactor - 1) ;
1758 offset = ily * (magFactor/4 + 1) ;
1761 if ( wavelength[0] > 10000. )
1766 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
1777 z=cpl_calloc(2*(n_a_fitcoefs - 1),
sizeof(
double)) ;
1778 a=cpl_calloc(n_a_fitcoefs,
sizeof(
double));
1779 wave=cpl_calloc(n_lines,
sizeof(
double)) ;
1780 emline=cpl_calloc(2*magFactor*ily,
sizeof(
float));
1781 spec=cpl_calloc(2*magFactor*ily,
sizeof(
float)) ;
1784 for ( col = 0 ; col < ilx ; col++ )
1787 for ( i = 0 ; i < 2*magFactor*ily ; i++ )
1791 float col_off = (float)col - (
float)(ilx-1)/2. ;
1794 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
1798 if (i < n_a_fitcoefs-1)
1803 for ( j = 0 ; j < n_b_fitcoefs ; j++ )
1805 a[i] += bcoefs[i][j] * pow(col_off, j) ;
1808 float a_initial = a[0] ;
1811 for ( line = 0 ; line < n_lines ; line++ )
1814 wave[line] = wavelength[line]/angst ;
1820 a[0] = a_initial - wave[line] ;
1822 if(NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_a_fitcoefs)))
1825 cpl_image_delete(retImage) ;
1828 if (-1 == sinfo_gsl_poly_complex_solve(a, n_a_fitcoefs, w, z))
1831 cpl_image_delete(retImage) ;
1834 sinfo_gsl_poly_complex_workspace_free(w) ;
1839 for ( i = 0 ; i < n_a_fitcoefs - 1 ; i++ )
1842 if( z[2*i] > (-1.)*(
float) ily/2. &&
1843 z[2*i] < (
float)ily/2. && z[2*i+1] == 0. )
1856 "for line %d in column %d\n", line, col) ;
1861 cenpos = z[found] + (float) ily /2. ;
1866 "for line %d in column %d\n", line, col) ;
1873 cenpix = cenpos * (float) magFactor + (
float) offset ;
1877 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
1878 sinfo_new_nint(cenpix) - (var-1) : 0 ;
1879 cmax = (sinfo_new_nint(cenpix) + (var-1)) < 2*magFactor * ily ?
1880 sinfo_new_nint(cenpix) + (var-1) : 2*magFactor * ily ;
1883 for ( j = cmin ; j < cmax ; j++ )
1885 emline[j] += intensity[line] *
1886 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
1895 for ( k = 0 ; k < 2*magFactor * ily ; k++ )
1902 for ( row = 0 ; row < ily ; row++ )
1906 for ( l = 0 ; l < magFactor ; l++ )
1909 if (!isnan(pidata[col + row * ilx]) &&
1910 (pidata[col + row * ilx] > 0.))
1912 spec[offset + l + (row * magFactor)] =
1913 pidata[col + row * ilx] ;
1917 spec[offset + l + (row * magFactor)] = 0. ;
1923 if (NULL == (result = sinfo_new_xcorrel(spec, 2*magFactor * ily,
1924 emline, 2*magFactor * ily,
1925 magFactor * ily, &delta,
1926 &maxlag, &xcorr_max)) )
1929 " col: %d is set ZERO\n", col) ;
1930 for ( row = 0 ; row < ily ; row++ )
1932 podata[col + row * ilx] = ZERO ;
1937 if ( xcorr_max <= 0. )
1940 " col: %d is set ZERO\n", col) ;
1941 for ( row = 0 ; row < ily ; row++ )
1943 podata[col + row * ilx] = ZERO ;
1949 wavelag = (float) -delta / (
float) magFactor ;
1950 if ( fabs(wavelag) > (float)ily/20. )
1953 for ( row = 0 ; row < ily ; row++ )
1955 podata[col + row * ilx] = ZERO ;
1968 centreval = a_initial ;
1969 for ( i = 1 ; i < n_a_fitcoefs ; i++ )
1979 centreval += (float)sign * a[i]*pow(wavelag, i) ;
1983 for ( row = 0 ; row < ily ; row++ )
1985 centrepix = (float)row - ((
float)ily - 1.)/2. ;
1987 for ( i = 1 ; i < n_a_fitcoefs ; i++ )
1989 pixvalue += a[i]*pow(centrepix, i) ;
1991 podata[col + row * ilx] = centreval + pixvalue ;
2051 int sinfo_new_wavelength_calibration( cpl_image * image,
2057 float ** wavelength_clean,
2058 int * n_found_lines,
2067 float pixel_tolerance )
2085 if ( NULL == image )
2090 lx=cpl_image_get_size_x(image);
2091 ly=cpl_image_get_size_y(image);
2109 if ( row_clean == NULL )
2114 if ( wavelength_clean == NULL )
2120 if ( dispersion == 0. )
2126 if ( halfWidth <= 0 || halfWidth > ly/2 )
2131 if ( minAmplitude < 1. )
2137 if ( max_residual <= 0. || max_residual > 1. )
2143 if ( fwhm <= 0. || fwhm > 10. )
2150 if ( n_a_fitcoefs <= 0 || n_a_fitcoefs > 9 )
2156 if ( n_b_fitcoefs <= 0 || n_b_fitcoefs > 9 )
2161 if ( sigmaFactor <= 0. )
2173 if ( 0 > (n_fit = sinfo_new_fit_lines( image , par, fwhm,
2174 n_found_lines, row_clean,
2176 halfWidth, minAmplitude )) )
2179 "error code of sinfo_fitLines: %d\n", n_fit) ;
2184 if ( -1 == sinfo_new_check_for_fake_lines (par, dispersion,
2185 wavelength_clean, row_clean,
2187 lx, pixel_tolerance) )
2190 "error code of sinfo_fitLines: %d", n_fit) ;
2195 if (NULL == (acoefs = (
float*) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
2196 NULL == (dacoefs = (
float*)cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
2197 NULL == (abuf = (
float**) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
2198 NULL == (dabuf = (
float**) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) )
2204 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2206 if ( NULL == (abuf[i] = (
float*) cpl_calloc(lx,
sizeof(
float))) ||
2207 NULL == (dabuf[i] = (
float*) cpl_calloc(lx,
sizeof(
float))) )
2219 for ( i = 0 ; i < lx ; i++ )
2223 if ( FLT_MAX == (chisq_poly = sinfo_new_polyfit( par, i,
2226 max_residual, acoefs,
2233 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
2240 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
2242 if ( acoefs[0] <= 0. || acoefs[1] ==0. ||
2243 dacoefs[j] == 0. || isnan(acoefs[j]) )
2249 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
2253 abuf[j][i] = acoefs[j] ;
2254 dabuf[j][i] = dacoefs[j] ;
2259 dabuf[j][i] = ZERO ;
2265 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2268 if ( FLT_MAX == (chisq_cross = sinfo_new_coefs_cross_fit(lx,
2276 " across the columns, for the coefficient with"
2277 " index: %d\n", i) ;
2278 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2280 cpl_free (abuf[i]) ;
2281 cpl_free (dabuf[i]) ;
2283 cpl_free ( acoefs ) ;
2284 cpl_free ( dacoefs ) ;
2286 cpl_free ( dabuf ) ;
2292 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2294 cpl_free (abuf[i]) ;
2295 cpl_free (dabuf[i]) ;
2297 cpl_free ( acoefs ) ;
2298 cpl_free ( dacoefs ) ;
2300 cpl_free ( dabuf ) ;
2317 cpl_image * sinfo_new_convolve_image_by_gauss( cpl_image * lineImage,
2320 cpl_image * returnImage ;
2321 float* column_buffer=NULL ;
2333 if ( lineImage == NULL )
2338 ilx=cpl_image_get_size_x(lineImage);
2339 ily=cpl_image_get_size_y(lineImage);
2340 pidata=cpl_image_get_data_float(lineImage);
2349 if ( NULL == ( returnImage = cpl_image_new(ilx,ily,CPL_TYPE_FLOAT ) ))
2358 podata=cpl_image_get_data_float(returnImage);
2360 column_buffer=cpl_calloc(ily,
sizeof(
float)) ;
2363 for ( col = 0 ; col < ilx ; col++ )
2365 for ( row = 0 ; row < ily ; row++ )
2367 column_buffer[row] = pidata[col + row*ilx] ;
2374 filter = sinfo_function1d_filter_lowpass( column_buffer,
2378 for ( row = 0 ; row < ily ; row++ )
2380 podata[col + row*ilx] = filter[row] ;
2382 sinfo_function1d_del(filter) ;
2385 cpl_free(column_buffer);
2386 return returnImage ;
2428 cpl_image * sinfo_new_defined_resampling( cpl_image * image,
2429 cpl_image * calimage,
2432 double * dispersion,
2435 double * centralLambda,
2438 cpl_image * retImage ;
2440 float dif, lambda_renorm ;
2441 float * retimagecol = NULL;
2443 float* imagecol=NULL ;
2444 float* calcol=NULL ;
2445 float* x_renorm=NULL ;
2449 float disp, mindisp ;
2450 int *calcolpos=NULL;
2451 int i, col, row, testrow ;
2452 int half_width, firstpos ;
2457 float minLambda = 0. ;
2473 float* ptidata=NULL;
2474 float* ptcdata=NULL;
2476 if ( NULL == image )
2481 ilx=cpl_image_get_size_x(image);
2482 ily=cpl_image_get_size_y(image);
2483 pidata=cpl_image_get_data_float(image);
2486 if ( NULL == calimage )
2491 clx=cpl_image_get_size_x(calimage);
2492 cly=cpl_image_get_size_y(calimage);
2493 pcdata=cpl_image_get_data_float(calimage);
2498 "are not compatible in size\n") ;
2511 "parameters given, not tested !!!\n") ;
2514 imagecol=cpl_calloc(ily,
sizeof(
float)) ;
2515 calcol=cpl_calloc(cly,
sizeof(
float)) ;
2516 x_renorm=cpl_calloc(n_params,
sizeof(
float)) ;
2530 for ( col = 0 ; col < clx ; col++ )
2532 if ( isnan(pcdata[col]) || pcdata[col] <= 0. )
2536 if ((pcdata[col] - pcdata[col+(clx)*(cly-1)]) > 0. )
2540 else if ((pcdata[col] - pcdata[col+(clx)*(cly-1)]) < 0. )
2553 cpl_free(imagecol) ;
2555 cpl_free(x_renorm) ;
2565 cpl_image* tempCalImage=NULL;
2566 if ( NULL == ( tempCalImage = cpl_image_new(clx,cly,CPL_TYPE_FLOAT)))
2571 ptcdata=cpl_image_get_data_float(tempCalImage);
2572 cpl_image* tempImage=NULL;
2573 if ( NULL == ( tempImage = cpl_image_new( ilx, ily,CPL_TYPE_FLOAT)))
2576 cpl_image_delete(tempCalImage) ;
2579 ptidata=cpl_image_get_data_float(tempImage);
2581 for ( col = 0 ; col < clx ; col++ )
2584 for ( row = 0 ; row < cly ; row++ )
2586 ptcdata[col+row*clx] = pcdata[col+n*clx] ;
2587 ptidata[col+row*clx] = pidata[col+n*clx] ;
2592 for ( i = 0 ; i < (int) ilx*ily ; i++ )
2594 pidata[i] = ptidata[i] ;
2595 pcdata[i] = ptcdata[i] ;
2597 cpl_image_delete(tempCalImage) ;
2598 cpl_image_delete(tempImage) ;
2602 *maxval = -FLT_MAX ;
2605 for ( col = 0 ; col < clx ; col++ )
2607 if ( isnan(pcdata[col]) || pcdata[col] <= 0. )
2611 disp = (pcdata[col+(clx)*((cly)-1)]
2612 - pcdata[col]) / (float)cly ;
2613 if ( mindisp > disp )
2617 if ( *minval >= pcdata[col] )
2619 *minval = pcdata[col] ;
2621 if ( *maxval <= pcdata[col + (clx)*((cly)-1)] )
2623 *maxval = pcdata[col + (clx)*((cly)-1)] ;
2630 if ( cly > 1024 && cly < 3000)
2632 *dispersion = DISPERSION_K_DITH ;
2633 *centralLambda = CENTRALLAMBDA_K ;
2635 else if ( cly < 2000)
2637 *dispersion = DISPERSION_K ;
2638 *centralLambda = CENTRALLAMBDA_K ;
2642 *dispersion = DISPERSION_K_DITH/2 ;
2643 *centralLambda = CENTRALLAMBDA_K ;
2646 else if (*minval < 1.2 )
2650 *dispersion = DISPERSION_J_DITH ;
2651 *centralLambda = CENTRALLAMBDA_J ;
2655 *dispersion = DISPERSION_J ;
2656 *centralLambda = CENTRALLAMBDA_J ;
2661 if ( *maxval > 2.3 )
2665 *dispersion = DISPERSION_HK_DITH ;
2666 *centralLambda = CENTRALLAMBDA_HK ;
2670 *dispersion = DISPERSION_HK ;
2671 *centralLambda = CENTRALLAMBDA_HK ;
2678 *dispersion = DISPERSION_H_DITH ;
2679 *centralLambda = CENTRALLAMBDA_H ;
2683 *dispersion = DISPERSION_H ;
2684 *centralLambda = CENTRALLAMBDA_H ;
2694 if ( (*maxval - *minval) / *dispersion < (float)cly )
2696 sinfo_msg_error(
" must be something wrong with the wavelength map!\n");
2701 *n_rows = floor(floor(0.5+(*maxval - *minval) / *dispersion)/2+0.5)*2;
2702 *centralpix = *n_rows / 2 ;
2703 minLambda = *centralLambda - *dispersion * (float)*centralpix ;
2716 if ( NULL == ( retImage = cpl_image_new( ilx, *n_rows,CPL_TYPE_FLOAT ) ))
2721 podata=cpl_image_get_data_float(retImage);
2722 olx=cpl_image_get_size_x(retImage);
2723 oly=cpl_image_get_size_y(retImage);
2732 retimagecol = cpl_malloc(oly *
sizeof(retimagecol[0]));
2733 calcolpos = cpl_malloc(oly *
sizeof(calcolpos[0]));
2735 for ( col = 0 ; col < olx ; col++ )
2742 for ( row = 0 ; row < ily ; row++ )
2744 imagecol[row] = pidata[col + row*ilx] ;
2745 if (!isnan(imagecol[row]))
2747 sum += imagecol[row] ;
2749 calcol[row] = pcdata[col + row*clx] ;
2752 for ( row = 0 ; row < oly ; row++ )
2754 retimagecol[row] = 0. ;
2755 calcolpos[row] = -1;
2758 for ( row=0 ; row < cly ; row++)
2760 temprow = (calcol[row]- minLambda)/ *dispersion;
2761 if (temprow >= 0 && temprow < oly)
2762 calcolpos[(int) temprow] = row;
2768 for ( row = 0 ; row < oly ; row++ )
2770 lambda = minLambda + *dispersion * (float) row ;
2778 if ( isnan(calcol[row]) )
2784 if ( (lambda < calcol[0]) ||
2785 (lambda > calcol[(cly)-1]) || zeroind == 1 )
2787 retimagecol[row] = ZERO ;
2795 if (calcolpos[row]==-1) {
2796 if(row>= (*n_rows-1)) calcolpos[row] = calcolpos[row-1];
2797 if(row< (*n_rows-1)) calcolpos[row] = calcolpos[row+1];
2799 if(calcolpos[row]>0) {
2800 if (lambda-calcol[calcolpos[row]-1]==0.) {
2801 calcolpos[row]=calcolpos[row]-1;
2805 testrow = calcolpos[row];
2815 if ( n_params % 2 == 0 )
2817 half_width = (int)(n_params/2) - 1 ;
2821 half_width = (int)(n_params/2) ;
2825 if ( isnan(imagecol[testrow]) )
2827 for ( i = row-half_width ; i < row-half_width+n_params ; i++ )
2829 if (i < 0) continue ;
2830 if ( i >= oly ) continue ;
2831 retimagecol[i] = ZERO ;
2833 imagecol[testrow] = 0. ;
2840 for ( row = 0 ; row < oly ; row++ )
2842 if ( isnan(retimagecol[row]) )
2846 lambda = minLambda + *dispersion * (float) row ;
2852 if ( (lambda < calcol[0]) || (lambda > calcol[(cly)-1]) )
2854 retimagecol[row] = ZERO ;
2862 if (calcolpos[row]==-1) {
2863 if(row >= (*n_rows-1)) calcolpos[row] = calcolpos[row-1];
2864 if(row < (*n_rows-1)) calcolpos[row] = calcolpos[row+1];
2867 testrow = calcolpos[row];
2878 if ( n_params % 2 == 0 )
2880 half_width = (int)(n_params/2) - 1 ;
2884 half_width = (int)(n_params/2) ;
2887 firstpos = testrow - half_width ;
2892 else if ( firstpos > ((cly)-n_params) )
2894 firstpos = cly - n_params ;
2896 if ( isnan(imagecol[firstpos]) )
2898 retimagecol[row] = ZERO ;
2905 dif = calcol[firstpos+n_params-1] - calcol[firstpos] ;
2906 for ( i = 0 ; i < n_params ; i++ )
2908 x_renorm[i] = (calcol[firstpos + i] - calcol[firstpos]) / dif ;
2912 lambda_renorm = ( lambda - calcol[firstpos] ) / dif ;
2914 imageptr = &imagecol[firstpos] ;
2917 poly=sinfo_new_nev_ille(x_renorm, imageptr,
2918 n_params-1, lambda_renorm, &flag);
2921 retimagecol[row] = poly ;
2925 for ( row = 0 ; row < oly ; row++ )
2927 if ( new_sum == 0. ) new_sum = 1. ;
2928 if ( isnan(retimagecol[row]) )
2930 podata[col+row*olx] = ZERO ;
2936 podata[col+row*olx] = retimagecol[row] ;
2941 cpl_free(retimagecol);
2942 cpl_free(calcolpos);
2943 cpl_free(imagecol) ;
2945 cpl_free(x_renorm) ;
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.