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) ) ) )
281 if ( NULL == (temp_fit_mem = (
float *) cpl_calloc( n_params*MAXPAR,
289 if ( NULL == (temp_derv_mem =
290 (
float *) cpl_calloc( n_params*MAXPAR,
sizeof (
float) ) ) )
296 for ( i = 0 ; i < n_params ; i ++ )
298 new_params[i] = temp_params+i;
299 new_params[i] -> fit_par = temp_fit_mem+i*MAXPAR;
300 new_params[i] -> derv_par = temp_derv_mem+i*MAXPAR;
301 new_params[i] -> column = 0 ;
302 new_params[i] -> line = 0 ;
303 new_params[i] -> wavelength = 0. ;
304 new_params[i] -> n_params = n_params ;
317 void sinfo_new_destroy_fit_params ( FitParams *** params )
320 if ( *params == NULL )
325 cpl_free ( (*params)[0] -> fit_par ) ;
326 (*params)[0] -> fit_par=NULL;
327 cpl_free ( (*params)[0] -> derv_par ) ;
328 (*params)[0] -> derv_par=NULL;
329 cpl_free ( (*params)[0] ) ;
331 cpl_free ( (*params) ) ;
343 void sinfo_new_dump_fit_params_to_ascii ( FitParams ** params,
const char * filename )
348 if ( NULL == params )
354 if ( NULL == filename )
360 if ( NULL == (fp = fopen ( filename,
"w" ) ) )
366 for ( i = 0 ; i < params[0] -> n_params ; i++ )
368 fprintf(fp,
"%d %d %d %f %f %f %f %f %f %f %f %f\n",
372 params[i]->wavelength,
373 params[i]->fit_par[0],
374 params[i]->fit_par[1],
375 params[i]->fit_par[2],
376 params[i]->fit_par[3],
377 params[i]->derv_par[0],
378 params[i]->derv_par[1],
379 params[i]->derv_par[2],
380 params[i]->derv_par[3] ) ;
394 sinfo_new_dump_ascii_to_fit_params ( FitParams ** params,
char * filename )
399 if ( NULL == params )
405 if ( NULL == filename )
411 if ( NULL == (fp = fopen ( filename,
"r" ) ) )
417 for ( i = 0 ; i < params[0]->n_params ; i++ )
419 fscanf(fp,
"%d %d %d %f %f %f %f %f %f %f %f %f\n",
420 ¶ms[i]->n_params,
423 ¶ms[i]->wavelength,
424 ¶ms[i]->fit_par[0],
425 ¶ms[i]->fit_par[1],
426 ¶ms[i]->fit_par[2],
427 ¶ms[i]->fit_par[3],
428 ¶ms[i]->derv_par[0],
429 ¶ms[i]->derv_par[1],
430 ¶ms[i]->derv_par[2],
431 ¶ms[i]->derv_par[3] ) ;
474 int sinfo_new_find_lines(cpl_image * lineImage,
475 float * wave_position,
476 float * wave_intensity,
479 float ** wavelength_clean,
490 float ** wavelength ;
494 float * column, * tempcol ;
497 float * wave_buffer ;
512 if ( NULL == lineImage )
518 lx=cpl_image_get_size_x(lineImage);
519 ly=cpl_image_get_size_y(lineImage);
520 pdata=cpl_image_get_data_float(lineImage);
522 if ( n_lines <= 0 || NULL == wave_position )
527 if ( NULL == wave_intensity )
533 if ( dispersion1 == 0. )
539 if ( row_clean == NULL )
545 if ( wavelength_clean == NULL )
551 if ( beginWave <= 0. )
556 if ( mindiff < -100. )
562 if ( halfWidth <= 0 )
568 if ( n_found_lines == NULL )
574 if ( sigma <= 0. || sigma >= ly / 2)
581 row = (
int**) cpl_calloc( lx,
sizeof(
int*)) ;
582 wavelength = (
float**) cpl_calloc( lx,
sizeof(
float*)) ;
583 row_mem = cpl_calloc( n_lines*lx,
sizeof(
int) ) ;
584 wave_mem = cpl_calloc( n_lines*lx,
sizeof(
float) ) ;
585 for ( i = 0 ; i <lx ; i++ )
587 row[i] = row_mem + i*n_lines;
588 wavelength[i] = wave_mem + i*n_lines;
592 if ( wave_position[0] > 10000. )
597 else if ( wave_position[0] > 1000. && wave_position[0] < 10000. )
613 tempcol = (
float*) cpl_calloc(ly,
sizeof(
float)) ;
618 column = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
619 lines = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
620 conv_lines = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
621 wave_buffer = (
float*) cpl_calloc(ly,
sizeof (
float)) ;
622 dummy_row = (
int*) cpl_calloc(n_lines,
sizeof(
int)) ;
624 for ( col = 0 ; col < lx ; col++ )
626 n_found_lines[col] = 0 ;
628 for ( i = 0 ; i < ly ; i++ )
630 if (isnan(pdata[col + i*lx]) )
636 sum = sum + pdata[col + i*lx] ;
637 tempcol[i] = pdata[col + i*lx];
641 colmedian = sinfo_new_median ( tempcol, ly);
643 if ( meanval - colmedian < mindiff )
646 "(mean: %f, diff: %f) in image column: "
647 "%d to correlate emission lines\n",
648 meanval, meanval - colmedian,col) ;
652 for ( i = 0 ; i < ly ; i++ )
657 for ( i = 0 ; i < n_lines ; i++ )
663 for ( i = 0 ; i < ly ; i++ )
665 if ( isnan(pdata[col+i*lx]) )
671 column[i] = pdata[col + i*lx] ;
676 lines[i] = (dispersion1 * (float) (i-ly/2) +
677 dispersion2 * (float) (i-ly/2) *
685 for ( j = 0 ; j < n_lines ; j ++ )
689 if ( (wave_position[j] >= (lines[i] -
690 fabs(dispersion1)/2.*angst)) &&
691 (wave_position[j] <= (lines[i] +
692 fabs(dispersion1)/2.*angst)) )
694 buf1 = wave_intensity[j] ;
696 buf2 = wave_position[j] ;
701 wave_buffer[i] = buf2 ;
707 if ( lines[i] != 0. )
710 gmin = sinfo_new_nint((
float) i - 2. * sigma) ;
711 gmax = sinfo_new_nint((
float) i + 2. * sigma) ;
722 for ( j = gmin ; j <= gmax ; j++ )
725 lines[i] * exp( (
double)( -0.5*((j - i)*(j - i)))/
726 (
double) (sigma*sigma) ) ;
732 position = INT32_MAX ;
733 position = sinfo_new_correlation(column+5, conv_lines+5, ly-10 ) ;
734 if ( abs (position) > ly / 4 )
737 " image (%d) seems to be too high in column: %d",
745 for ( j = 0 ; j < n_lines ; j ++ ) {
751 for ( i = 0 ; i < ly ; i ++ )
753 if ( lines[i] != 0.0 )
755 if ( (i - position) >= 0 && (i - position) < ly )
757 row[col][j] = i - position ;
760 wavelength[col][j] = wave_buffer[i] / angst ;
773 for ( k = 1 ; k <= j && k<(lx-1); k ++ )
775 if (dummy_row[k-1] != -1)
777 dummy_row[k-1] = row[col][k-1] ;
779 if ( (row[col][k] - row[col][k-1]) <= 2*halfWidth )
781 dummy_row[k-1] = -1 ;
790 if ( (row[col][j] != -999) &&
791 (row[col][k+1] - row[col][k]) <= 2*halfWidth)
797 dummy_row[k+1] = -1 ;
803 for ( k = 0 ; k < j ; k ++ )
805 if ( dummy_row[k] != -1 && dummy_row[k] != 0 )
807 row_clean[col][m] = dummy_row[k] ;
808 wavelength_clean[col][m] = wavelength[col][k] ;
813 n_found_lines[col] = m ;
815 *sum_lines += n_found_lines[col] ;
819 cpl_free (conv_lines) ;
820 cpl_free (dummy_row) ;
821 cpl_free (wave_buffer) ;
823 cpl_free (wave_mem) ;
826 cpl_free (wavelength) ;
841 sinfo_new_read_list(
char * listname,
843 float * lineIntensity )
848 if ( NULL == lineCenter )
854 if ( NULL == lineIntensity )
860 if ( NULL == (fp = fopen ( listname,
"r" ) ) )
867 while ( fscanf( fp,
"%f %f", &lineCenter[i], &lineIntensity[i] ) != EOF )
909 int sinfo_new_line_fit ( cpl_image * mergedImage,
923 int iters, xdim, ndat ;
926 float maxval, tol, lab ;
931 if ( mergedImage == NULL )
936 lx=cpl_image_get_size_x(mergedImage);
937 ly=cpl_image_get_size_y(mergedImage);
938 pdata=cpl_image_get_data_float(mergedImage);
946 if ( column < 0 || column > lx )
951 if ( halfWidth < 0 || halfWidth > ly )
956 if ( lineRow < 0 || lineRow > ly )
961 if ( min_amplitude < 1. )
968 for ( i = 0 ; i < line -> n_elements ; i++)
973 par -> column = column ;
974 par -> line = lineInd ;
980 for ( i = lineRow-halfWidth ; i <= lineRow+halfWidth ; i++ )
982 if ( i < 0 || i >= ly )
989 line -> data[j] = pdata[column + i*lx] ;
999 position = -INT32_MAX ;
1000 for ( i = 0 ; i < line -> n_elements ; i++ )
1004 if ( line -> data[i] >= maxval )
1006 maxval = line -> data[i] ;
1013 ndat = line -> n_elements ;
1018 par -> fit_par[1] = fwhm ;
1019 par -> fit_par[2] = (float) position ;
1020 par -> fit_par[3] = (float) (line -> data[0] +
1021 line -> data[line->n_elements - 1]) / 2.0 ;
1022 par -> fit_par[0] = maxval - (par -> fit_par[3]) ;
1025 if ( par->fit_par[0] < min_amplitude )
1027 cpl_msg_debug (
"sinfo_linefit:",
1028 " sorry, amplitude of line too low to fit: %f",
1033 for ( i = 0 ; i < MAXPAR ; i++ )
1035 par -> derv_par[i] = 0.0 ;
1040 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
1042 &ndat, par -> fit_par,
1043 par -> derv_par, mpar,
1044 &numpar, &tol, &its, &lab )) )
1046 cpl_msg_debug (
"sinfo_linefit:",
1047 " sinfo_new_lsqfit_c: least squares fit failed,"
1048 " error no.: %d\n", iters) ;
1054 par -> fit_par[2] = (float) (lineRow - halfWidth) + par -> fit_par[2] ;
1084 int sinfo_new_fit_lines ( cpl_image * line_image,
1085 FitParams ** allParams,
1089 float ** wavelength,
1091 float min_amplitude )
1097 float * xdat, * wdat;
1102 if ( line_image == NULL )
1107 lx=cpl_image_get_size_x(line_image);
1111 if ( n_lines == NULL )
1116 if ( row == NULL || width <= 0 )
1121 if ( wavelength == NULL )
1130 line = sinfo_new_vector (2*width + 1) ;
1132 xdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
1133 wdat = (
float *) cpl_calloc( line -> n_elements,
sizeof (
float) ) ;
1134 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
1137 for ( i = 0 ; i < lx ; i++ )
1139 if ( n_lines[i] == 0 )
1144 for ( l = 0 ; l < n_lines[i] ; l++ )
1146 if ( row[i][l] <= 0 )
1156 if ( (result = sinfo_new_line_fit ( line_image,
1157 allParams[k], fwhm, l, i,
1159 min_amplitude,line,mpar,
1162 cpl_msg_debug (
"sinfo_fitLines:",
1163 " sinfo_linefit failed, error no.: %d,"
1164 " column: %d, row: %d, line: %d\n",
1165 result, i, row[i][l], l) ;
1168 if ( (allParams[k] -> fit_par[0] <= 0.) ||
1169 (allParams[k] -> fit_par[1] <= 0.)
1170 || (allParams[k] -> fit_par[2] <= 0.) )
1173 " line: %d\n", i, l) ;
1176 allParams[k] -> wavelength = wavelength[i][l] ;
1182 sinfo_new_destroy_vector(line);
1218 float sinfo_new_polyfit( FitParams ** par,
1229 float ** ucoefs, ** vcoefs, ** covar ;
1231 float * lambda, * posit ;
1232 float * weight, * resid ;
1233 float * newlam, * newpos, * newwet ;
1234 float * wcoefs=NULL ;
1235 float chisq, result ;
1241 for ( i = 0 ; i < n_fitcoefs ; i++ )
1264 if ( dispersion == 0. )
1270 offset = (float)(n_rows - 1)/2. ;
1274 mem = (
float*) cpl_calloc( n_lines*7,
sizeof (
float) ) ;
1276 posit = mem + n_lines;
1277 weight = mem + n_lines*2;
1278 resid = mem + n_lines*3;
1279 newlam = mem + n_lines*4;
1280 newpos = mem + n_lines*5;
1281 newwet = mem + n_lines*6;
1292 ucoefs = sinfo_matrix ( 1, n_lines, 1, n_fitcoefs ) ;
1293 vcoefs = sinfo_matrix ( 1, n_lines, 1, n_fitcoefs ) ;
1294 covar = sinfo_matrix ( 1, n_fitcoefs, 1, n_fitcoefs ) ;
1295 wcoefs=cpl_calloc(n_fitcoefs,
sizeof(
float)) ;
1299 for ( i = 0 ; i < (par[0] -> n_params) ; i ++ )
1303 for ( j = 0 ; j < n_lines ; j ++ )
1305 if ( (par[i] -> column == column) && (par[i] -> line == j) )
1315 if ( par[found] -> derv_par[2] != 0. &&
1316 par[found] -> fit_par[2] > 0. &&
1317 par[found] -> wavelength > 0. &&
1318 par[found] -> fit_par[1] > 0. &&
1319 par[found] -> fit_par[0] > 0. )
1326 posit[n] = par[found] -> fit_par[2] ;
1327 weight[n] = par[found] -> derv_par[2] ;
1328 lambda[n] = par[found] -> wavelength ;
1340 if ( num < n_fitcoefs )
1343 "determine the three coefficients.\n", column) ;
1344 for ( i = 0 ; i < n_fitcoefs ; i++ )
1349 sinfo_free_matrix ( ucoefs, 1, 1 ) ;
1350 sinfo_free_matrix ( vcoefs, 1, 1 ) ;
1351 sinfo_free_matrix ( covar, 1, 1 ) ;
1369 for ( i = 0 ; i < num ; i ++ )
1371 posit[i] = (posit[i] - offset)/offset ;
1372 weight[i] *= fabs(dispersion) ;
1376 sinfo_svd_fitting( posit - 1, lambda - 1,
1377 weight - 1, num, acoefs-1, n_fitcoefs,
1378 ucoefs, vcoefs, wcoefs-1, covar, &chisq, sinfo_fpol ) ;
1381 for ( i = 1 ; i < n_fitcoefs ; i++ )
1383 acoefs[i] /= pow(offset, i) ;
1390 for ( i = 0 ; i < num ; i++ )
1393 for ( k = 0 ; k < n_fitcoefs ; k++ )
1395 result += acoefs[k] * pow(posit[i], k) ;
1398 resid[i] = lambda[i] - result ;
1400 if ( fabs( resid[i] ) > max_residual)
1406 newlam[j] = lambda[i] ;
1407 newpos[j] = posit[i] ;
1408 newwet[j] = weight[i] ;
1414 if ( num >= n_fitcoefs )
1416 sinfo_svd_fitting( newpos - 1, newlam - 1,
1417 newwet - 1, num, acoefs-1, n_fitcoefs, ucoefs,
1418 vcoefs, wcoefs-1, covar, &chisq, sinfo_fpol ) ;
1421 for ( i = 0 ; i < n_fitcoefs ; i++ )
1423 acoefs[i] /= pow(offset, i) ;
1424 dacoefs[i] = sqrt( (
double) covar[i+1][i+1] ) / pow(offset, i) ;
1430 "due to high residuals, fit coefficients are set "
1431 "zero, in column: %d\n", *n_reject, column) ;
1432 for ( i = 0 ; i < n_fitcoefs ; i++ )
1439 sinfo_free_matrix ( ucoefs, 1, 1 ) ;
1440 sinfo_free_matrix ( vcoefs, 1, 1 ) ;
1441 sinfo_free_matrix ( covar, 1, 1 ) ;
1471 float sinfo_new_coefs_cross_fit (
int n_columns,
1476 float sigma_factor )
1479 float* sub_col_index=NULL ;
1480 float* sub_acoefs=NULL ;
1481 float* sub_dacoefs=NULL ;
1482 float* wcoefs=NULL ;
1483 float ** ucoefs, **vcoefs, **covar ;
1485 float * acoefsclean ;
1486 double sum, sumq, mean ;
1488 double cliphi, cliplo ;
1490 int i, n, num, ndata ;
1494 if ( n_columns < 1 )
1499 if ( acoefs == NULL || dacoefs == NULL )
1501 sinfo_msg_error(
" coeffs or errors of coefficients are not given\n") ;
1504 if ( bcoefs == NULL )
1510 if ( n_fitcoefs < 1 )
1515 if ( sigma_factor <= 0. )
1521 offset = (float)(n_columns - 1) / 2. ;
1528 wcoefs=cpl_calloc(n_fitcoefs,
sizeof(
float)) ;
1531 for ( i = 0 ; i < n_columns ; i++ )
1533 if ( isnan(acoefs[i]) || acoefs[i] == 0. || dacoefs[i] == 0. )
1542 acoefsclean = (
float*) cpl_calloc(nc ,
sizeof(
float)) ;
1544 for ( i = 0 ; i < n_columns ; i++ )
1546 if ( isnan(acoefs[i]) || acoefs[i] == 0. || dacoefs[i] == 0. )
1552 acoefsclean[nc] = acoefs[i] ;
1556 sinfo_pixel_qsort(acoefsclean, nc) ;
1562 for ( i = (
int)((
float)nc*LOW_REJECT) ;
1563 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
1565 sum += (double)acoefsclean[i] ;
1566 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
1569 mean = sum/(double)n ;
1570 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
1571 cliphi = mean + sigma * (double)sigma_factor ;
1572 cliplo = mean - sigma * (double)sigma_factor ;
1574 sub_col_index=cpl_calloc(n_columns,
sizeof(
float)) ;
1575 sub_acoefs=cpl_calloc(n_columns,
sizeof(
float));
1576 sub_dacoefs=cpl_calloc(n_columns,
sizeof(
float)) ;
1580 for ( i = 0 ; i < n_columns ; i++ )
1583 col_index = (float) i ;
1586 if ( !isnan(acoefs[i]) &&
1587 (acoefs[i] <= cliphi) && (acoefs[i] >= cliplo) &&
1588 (dacoefs[i] != 0. ) && (acoefs[i] != 0.) )
1590 sub_acoefs[num] = acoefs[i] ;
1591 sub_dacoefs[num] = dacoefs[i] ;
1592 sub_col_index[num] = col_index ;
1598 if ( ndata < n_fitcoefs )
1601 "the fit coefficients.\n") ;
1607 ucoefs = sinfo_matrix(1, ndata, 1, n_fitcoefs) ;
1608 vcoefs = sinfo_matrix(1, ndata, 1, n_fitcoefs) ;
1609 covar = sinfo_matrix ( 1, n_fitcoefs, 1, n_fitcoefs ) ;
1612 for ( i = 0 ; i < ndata ; i++ )
1614 sub_col_index[i] = (sub_col_index[i] - offset) / offset ;
1618 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
1619 sub_dacoefs-1, ndata, bcoefs-1,
1620 n_fitcoefs, ucoefs, vcoefs,
1621 wcoefs-1, covar, &chisq, sinfo_fpol ) ;
1624 for ( i = 0 ; i < n_fitcoefs ; i ++ )
1626 bcoefs[i] /= pow(offset, i) ;
1630 cpl_free (acoefsclean) ;
1631 sinfo_free_matrix( ucoefs, 1, 1) ;
1632 sinfo_free_matrix( vcoefs, 1, 1) ;
1633 sinfo_free_matrix ( covar, 1, 1 ) ;
1635 cpl_free(sub_col_index) ;
1636 cpl_free(sub_acoefs) ;
1637 cpl_free(sub_dacoefs) ;
1663 cpl_image * sinfo_new_wave_map( cpl_image * lineImage,
1672 cpl_image * retImage ;
1673 float cenpos, cenpix ;
1674 float centreval, centrepix, wavelag ;
1677 int i, j, k, l, line, col, row, found, sign ;
1678 int var, maxlag, cmin, cmax, offset ;
1688 float* emline=NULL ;
1700 gsl_poly_complex_workspace * w ;
1702 if ( NULL == lineImage )
1707 ilx=cpl_image_get_size_x(lineImage);
1708 ily=cpl_image_get_size_y(lineImage);
1709 pidata=cpl_image_get_data_float(lineImage);
1711 if ( NULL == wavelength || n_lines <= 0 )
1717 if ( NULL == intensity )
1723 if ( NULL == bcoefs )
1729 if ( magFactor <= 1 )
1736 if ( NULL == ( retImage = cpl_image_new( ilx, ily,CPL_TYPE_FLOAT ) ))
1745 podata=cpl_image_get_data_float(retImage);
1748 var = (magFactor - 1)*(magFactor - 1) ;
1749 offset = ily * (magFactor/4 + 1) ;
1752 if ( wavelength[0] > 10000. )
1757 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
1768 z=cpl_calloc(2*(n_a_fitcoefs - 1),
sizeof(
double)) ;
1769 a=cpl_calloc(n_a_fitcoefs,
sizeof(
double));
1770 wave=cpl_calloc(n_lines,
sizeof(
double)) ;
1771 emline=cpl_calloc(2*magFactor*ily,
sizeof(
float));
1772 spec=cpl_calloc(2*magFactor*ily,
sizeof(
float)) ;
1775 for ( col = 0 ; col < ilx ; col++ )
1778 for ( i = 0 ; i < 2*magFactor*ily ; i++ )
1782 col_off = (float)col - (
float)(ilx-1)/2. ;
1785 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
1789 if (i < n_a_fitcoefs-1)
1794 for ( j = 0 ; j < n_b_fitcoefs ; j++ )
1796 a[i] += bcoefs[i][j] * pow(col_off, j) ;
1802 for ( line = 0 ; line < n_lines ; line++ )
1805 wave[line] = wavelength[line]/angst ;
1811 a[0] = a_initial - wave[line] ;
1813 if(NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_a_fitcoefs)))
1816 cpl_image_delete(retImage) ;
1819 if (-1 == sinfo_gsl_poly_complex_solve(a, n_a_fitcoefs, w, z))
1822 cpl_image_delete(retImage) ;
1825 sinfo_gsl_poly_complex_workspace_free(w) ;
1830 for ( i = 0 ; i < n_a_fitcoefs - 1 ; i++ )
1833 if( z[2*i] > (-1.)*(
float) ily/2. &&
1834 z[2*i] < (
float)ily/2. && z[2*i+1] == 0. )
1847 "for line %d in column %d\n", line, col) ;
1852 cenpos = z[found] + (float) ily /2. ;
1857 "for line %d in column %d\n", line, col) ;
1864 cenpix = cenpos * (float) magFactor + (
float) offset ;
1868 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
1869 sinfo_new_nint(cenpix) - (var-1) : 0 ;
1870 cmax = (sinfo_new_nint(cenpix) + (var-1)) < 2*magFactor * ily ?
1871 sinfo_new_nint(cenpix) + (var-1) : 2*magFactor * ily ;
1874 for ( j = cmin ; j < cmax ; j++ )
1876 emline[j] += intensity[line] *
1877 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
1886 for ( k = 0 ; k < 2*magFactor * ily ; k++ )
1893 for ( row = 0 ; row < ily ; row++ )
1897 for ( l = 0 ; l < magFactor ; l++ )
1900 if (!isnan(pidata[col + row * ilx]) &&
1901 (pidata[col + row * ilx] > 0.))
1903 spec[offset + l + (row * magFactor)] =
1904 pidata[col + row * ilx] ;
1908 spec[offset + l + (row * magFactor)] = 0. ;
1914 if (NULL == (result = sinfo_new_xcorrel(spec, 2*magFactor * ily,
1915 emline, 2*magFactor * ily,
1916 magFactor * ily, &delta,
1917 &maxlag, &xcorr_max)) )
1920 " col: %d is set ZERO\n", col) ;
1921 for ( row = 0 ; row < ily ; row++ )
1923 podata[col + row * ilx] = ZERO ;
1928 if ( xcorr_max <= 0. )
1931 " col: %d is set ZERO\n", col) ;
1932 for ( row = 0 ; row < ily ; row++ )
1934 podata[col + row * ilx] = ZERO ;
1940 wavelag = (float) -delta / (
float) magFactor ;
1941 if ( fabs(wavelag) > (float)ily/20. )
1944 for ( row = 0 ; row < ily ; row++ )
1946 podata[col + row * ilx] = ZERO ;
1959 centreval = a_initial ;
1960 for ( i = 1 ; i < n_a_fitcoefs ; i++ )
1970 centreval += (float)sign * a[i]*pow(wavelag, i) ;
1974 for ( row = 0 ; row < ily ; row++ )
1976 centrepix = (float)row - ((
float)ily - 1.)/2. ;
1978 for ( i = 1 ; i < n_a_fitcoefs ; i++ )
1980 pixvalue += a[i]*pow(centrepix, i) ;
1982 podata[col + row * ilx] = centreval + pixvalue ;
2042 int sinfo_new_wavelength_calibration( cpl_image * image,
2048 float ** wavelength_clean,
2049 int * n_found_lines,
2058 float pixel_tolerance )
2069 float chisq_poly, chisq_cross ;
2076 if ( NULL == image )
2081 lx=cpl_image_get_size_x(image);
2082 ly=cpl_image_get_size_y(image);
2100 if ( row_clean == NULL )
2105 if ( wavelength_clean == NULL )
2111 if ( dispersion == 0. )
2117 if ( halfWidth <= 0 || halfWidth > ly/2 )
2122 if ( minAmplitude < 1. )
2128 if ( max_residual <= 0. || max_residual > 1. )
2134 if ( fwhm <= 0. || fwhm > 10. )
2141 if ( n_a_fitcoefs <= 0 || n_a_fitcoefs > 9 )
2147 if ( n_b_fitcoefs <= 0 || n_b_fitcoefs > 9 )
2152 if ( sigmaFactor <= 0. )
2164 if ( 0 > (n_fit = sinfo_new_fit_lines( image , par, fwhm,
2165 n_found_lines, row_clean,
2167 halfWidth, minAmplitude )) )
2170 "error code of sinfo_fitLines: %d\n", n_fit) ;
2175 if ( -1 == sinfo_new_check_for_fake_lines (par, dispersion,
2176 wavelength_clean, row_clean,
2178 lx, pixel_tolerance) )
2181 "error code of sinfo_fitLines: %d", n_fit) ;
2186 if (NULL == (acoefs = (
float*) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
2187 NULL == (dacoefs = (
float*)cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
2188 NULL == (abuf = (
float**) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
2189 NULL == (dabuf = (
float**) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) )
2195 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2197 if ( NULL == (abuf[i] = (
float*) cpl_calloc(lx,
sizeof(
float))) ||
2198 NULL == (dabuf[i] = (
float*) cpl_calloc(lx,
sizeof(
float))) )
2210 for ( i = 0 ; i < lx ; i++ )
2213 if ( FLT_MAX == (chisq_poly = sinfo_new_polyfit( par, i,
2216 max_residual, acoefs,
2223 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
2230 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
2232 if ( acoefs[0] <= 0. || acoefs[1] ==0. ||
2233 dacoefs[j] == 0. || isnan(acoefs[j]) )
2239 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
2243 abuf[j][i] = acoefs[j] ;
2244 dabuf[j][i] = dacoefs[j] ;
2249 dabuf[j][i] = ZERO ;
2255 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2257 if ( FLT_MAX == (chisq_cross = sinfo_new_coefs_cross_fit(lx,
2265 " across the columns, for the coefficient with"
2266 " index: %d\n", i) ;
2267 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2269 cpl_free (abuf[i]) ;
2270 cpl_free (dabuf[i]) ;
2272 cpl_free ( acoefs ) ;
2273 cpl_free ( dacoefs ) ;
2275 cpl_free ( dabuf ) ;
2281 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
2283 cpl_free (abuf[i]) ;
2284 cpl_free (dabuf[i]) ;
2286 cpl_free ( acoefs ) ;
2287 cpl_free ( dacoefs ) ;
2289 cpl_free ( dabuf ) ;
2306 cpl_image * sinfo_new_convolve_image_by_gauss( cpl_image * lineImage,
2309 cpl_image * returnImage ;
2310 float* column_buffer=NULL ;
2322 if ( lineImage == NULL )
2327 ilx=cpl_image_get_size_x(lineImage);
2328 ily=cpl_image_get_size_y(lineImage);
2329 pidata=cpl_image_get_data_float(lineImage);
2338 if ( NULL == ( returnImage = cpl_image_new(ilx,ily,CPL_TYPE_FLOAT ) ))
2347 podata=cpl_image_get_data_float(returnImage);
2349 column_buffer=cpl_calloc(ily,
sizeof(
float)) ;
2352 for ( col = 0 ; col < ilx ; col++ )
2354 for ( row = 0 ; row < ily ; row++ )
2356 column_buffer[row] = pidata[col + row*ilx] ;
2363 filter = sinfo_function1d_filter_lowpass( column_buffer,
2367 for ( row = 0 ; row < ily ; row++ )
2369 podata[col + row*ilx] = filter[row] ;
2371 sinfo_function1d_del(filter) ;
2374 cpl_free(column_buffer);
2375 return returnImage ;
2417 cpl_image * sinfo_new_defined_resampling( cpl_image * image,
2418 cpl_image * calimage,
2421 double * dispersion,
2424 double * centralLambda,
2427 cpl_image * retImage ;
2428 cpl_image * tempCalImage ;
2429 cpl_image * tempImage ;
2431 float dif, lambda_renorm ;
2432 float * retimagecol = NULL;
2434 float* imagecol=NULL ;
2435 float* calcol=NULL ;
2436 float* x_renorm=NULL ;
2439 float sum, new_sum ;
2440 float disp, mindisp ;
2441 int *calcolpos=NULL;
2442 int i, col, row, testrow ;
2443 int half_width, firstpos ;
2448 float minLambda = 0. ;
2464 float* ptidata=NULL;
2465 float* ptcdata=NULL;
2467 if ( NULL == image )
2472 ilx=cpl_image_get_size_x(image);
2473 ily=cpl_image_get_size_y(image);
2474 pidata=cpl_image_get_data_float(image);
2477 if ( NULL == calimage )
2482 clx=cpl_image_get_size_x(calimage);
2483 cly=cpl_image_get_size_y(calimage);
2484 pcdata=cpl_image_get_data_float(calimage);
2489 "are not compatible in size\n") ;
2502 "parameters given, not tested !!!\n") ;
2505 imagecol=cpl_calloc(ily,
sizeof(
float)) ;
2506 calcol=cpl_calloc(cly,
sizeof(
float)) ;
2507 x_renorm=cpl_calloc(n_params,
sizeof(
float)) ;
2521 for ( col = 0 ; col < clx ; col++ )
2523 if ( isnan(pcdata[col]) || pcdata[col] <= 0. )
2527 if ((pcdata[col] - pcdata[col+(clx)*(cly-1)]) > 0. )
2531 else if ((pcdata[col] - pcdata[col+(clx)*(cly-1)]) < 0. )
2553 if ( NULL == ( tempCalImage = cpl_image_new(clx,cly,CPL_TYPE_FLOAT)))
2558 ptcdata=cpl_image_get_data_float(tempCalImage);
2559 if ( NULL == ( tempImage = cpl_image_new( ilx, ily,CPL_TYPE_FLOAT)))
2562 cpl_image_delete(tempCalImage) ;
2565 ptidata=cpl_image_get_data_float(tempImage);
2567 for ( col = 0 ; col < clx ; col++ )
2570 for ( row = 0 ; row < cly ; row++ )
2572 ptcdata[col+row*clx] = pcdata[col+n*clx] ;
2573 ptidata[col+row*clx] = pidata[col+n*clx] ;
2578 for ( i = 0 ; i < (int) ilx*ily ; i++ )
2580 pidata[i] = ptidata[i] ;
2581 pcdata[i] = ptcdata[i] ;
2583 cpl_image_delete(tempCalImage) ;
2584 cpl_image_delete(tempImage) ;
2588 *maxval = -FLT_MAX ;
2591 for ( col = 0 ; col < clx ; col++ )
2593 if ( isnan(pcdata[col]) || pcdata[col] <= 0. )
2597 disp = (pcdata[col+(clx)*((cly)-1)]
2598 - pcdata[col]) / (float)cly ;
2599 if ( mindisp > disp )
2603 if ( *minval >= pcdata[col] )
2605 *minval = pcdata[col] ;
2607 if ( *maxval <= pcdata[col + (clx)*((cly)-1)] )
2609 *maxval = pcdata[col + (clx)*((cly)-1)] ;
2616 if ( cly > 1024 && cly < 3000)
2618 *dispersion = DISPERSION_K_DITH ;
2619 *centralLambda = CENTRALLAMBDA_K ;
2621 else if ( cly < 2000)
2623 *dispersion = DISPERSION_K ;
2624 *centralLambda = CENTRALLAMBDA_K ;
2628 *dispersion = DISPERSION_K_DITH/2 ;
2629 *centralLambda = CENTRALLAMBDA_K ;
2632 else if (*minval < 1.2 )
2636 *dispersion = DISPERSION_J_DITH ;
2637 *centralLambda = CENTRALLAMBDA_J ;
2641 *dispersion = DISPERSION_J ;
2642 *centralLambda = CENTRALLAMBDA_J ;
2647 if ( *maxval > 2.3 )
2651 *dispersion = DISPERSION_HK_DITH ;
2652 *centralLambda = CENTRALLAMBDA_HK ;
2656 *dispersion = DISPERSION_HK ;
2657 *centralLambda = CENTRALLAMBDA_HK ;
2664 *dispersion = DISPERSION_H_DITH ;
2665 *centralLambda = CENTRALLAMBDA_H ;
2669 *dispersion = DISPERSION_H ;
2670 *centralLambda = CENTRALLAMBDA_H ;
2680 if ( (*maxval - *minval) / *dispersion < (float)cly )
2682 sinfo_msg_error(
" must be something wrong with the wavelength map!\n");
2687 *n_rows = floor(floor(0.5+(*maxval - *minval) / *dispersion)/2+0.5)*2;
2688 *centralpix = *n_rows / 2 ;
2689 minLambda = *centralLambda - *dispersion * (float)*centralpix ;
2702 if ( NULL == ( retImage = cpl_image_new( ilx, *n_rows,CPL_TYPE_FLOAT ) ))
2707 podata=cpl_image_get_data_float(retImage);
2708 olx=cpl_image_get_size_x(retImage);
2709 oly=cpl_image_get_size_y(retImage);
2711 retimagecol = cpl_malloc(*n_rows *
sizeof(retimagecol[0]));
2712 calcolpos = cpl_malloc(*n_rows *
sizeof(calcolpos[0]));
2713 for ( col = 0 ; col < olx ; col++ )
2720 for ( row = 0 ; row < ily ; row++ )
2722 imagecol[row] = pidata[col + row*ilx] ;
2723 if (!isnan(imagecol[row]))
2725 sum += imagecol[row] ;
2727 calcol[row] = pcdata[col + row*clx] ;
2730 for ( row = 0 ; row < oly ; row++ )
2732 retimagecol[row] = 0. ;
2733 calcolpos[row] = -1;
2736 for ( row=0 ; row < cly ; row++)
2738 temprow = (calcol[row]- minLambda)/ *dispersion;
2739 if (temprow >= 0 && temprow < oly)
2740 calcolpos[(int) temprow] = row;
2746 for ( row = 0 ; row < oly ; row++ )
2748 lambda = minLambda + *dispersion * (float) row ;
2756 if ( isnan(calcol[row]) )
2762 if ( (lambda < calcol[0]) ||
2763 (lambda > calcol[(cly)-1]) || zeroind == 1 )
2765 retimagecol[row] = ZERO ;
2773 if (calcolpos[row]==-1) {
2774 if(row>= (*n_rows-1)) calcolpos[row] = calcolpos[row-1];
2775 if(row< (*n_rows-1)) calcolpos[row] = calcolpos[row+1];
2777 if(calcolpos[row]>0) {
2778 if (lambda-calcol[calcolpos[row]-1]==0.) {
2779 calcolpos[row]=calcolpos[row]-1;
2782 testrow = calcolpos[row];
2793 if ( n_params % 2 == 0 )
2795 half_width = (int)(n_params/2) - 1 ;
2799 half_width = (int)(n_params/2) ;
2803 if ( isnan(imagecol[testrow]) )
2805 for ( i = row-half_width ; i < row-half_width+n_params ; i++ )
2807 if (i < 0) continue ;
2808 if ( i >= oly ) continue ;
2809 retimagecol[i] = ZERO ;
2811 imagecol[testrow] = 0. ;
2818 for ( row = 0 ; row < oly ; row++ )
2820 if ( isnan(retimagecol[row]) )
2824 lambda = minLambda + *dispersion * (float) row ;
2830 if ( (lambda < calcol[0]) || (lambda > calcol[(cly)-1]) )
2832 retimagecol[row] = ZERO ;
2840 if (calcolpos[row]==-1) {
2841 if(row >= (*n_rows-1)) calcolpos[row] = calcolpos[row-1];
2842 if(row < (*n_rows-1)) calcolpos[row] = calcolpos[row+1];
2845 testrow = calcolpos[row];
2856 if ( n_params % 2 == 0 )
2858 half_width = (int)(n_params/2) - 1 ;
2862 half_width = (int)(n_params/2) ;
2865 firstpos = testrow - half_width ;
2870 else if ( firstpos > ((cly)-n_params) )
2872 firstpos = cly - n_params ;
2874 if ( isnan(imagecol[firstpos]) )
2876 retimagecol[row] = ZERO ;
2883 dif = calcol[firstpos+n_params-1] - calcol[firstpos] ;
2884 for ( i = 0 ; i < n_params ; i++ )
2886 x_renorm[i] = (calcol[firstpos + i] - calcol[firstpos]) / dif ;
2890 lambda_renorm = ( lambda - calcol[firstpos] ) / dif ;
2892 imageptr = &imagecol[firstpos] ;
2895 poly=sinfo_new_nev_ille(x_renorm, imageptr,
2896 n_params-1, lambda_renorm, &flag);
2899 retimagecol[row] = poly ;
2903 for ( row = 0 ; row < oly ; row++ )
2905 if ( new_sum == 0. ) new_sum = 1. ;
2906 if ( isnan(retimagecol[row]) )
2908 podata[col+row*olx] = ZERO ;
2914 podata[col+row*olx] = retimagecol[row] ;
2919 cpl_free(retimagecol);
2920 cpl_free(calcolpos);
2921 cpl_free(imagecol) ;
2923 cpl_free(x_renorm) ;