131 #include "sinfo_vltPort.h"
141 #include "sinfo_function_1d.h"
142 #include "sinfo_recipes.h"
143 #include "sinfo_wavecal.h"
144 #include "sinfo_wave_calibration.h"
145 #include "sinfo_solve_poly_root.h"
146 #include "sinfo_utils_wrappers.h"
147 #include "sinfo_error.h"
149 #include "sinfo_svd.h"
154 sinfo_new_b_coeffs(
int n_slitlets,
159 sinfo_new_destroy_b_coeffs ( Bcoeffs * bco ) ;
162 sinfo_new_coeffs_cross_slit_fit (
int n_columns,
173 sinfo_new_spred_coeffs_cross_slit_fit (
int n_columns,
181 float ** sinfo_slit_pos) ;
201 sinfo_new_b_coeffs(
int n_slitlets,
206 Bcoeffs * returnbco ;
208 if(NULL == (returnbco=(Bcoeffs*) cpl_calloc(n_slitlets,
sizeof(Bcoeffs))) )
213 returnbco -> n_slitlets = n_slitlets ;
214 returnbco -> n_acoeffs = n_acoeffs ;
215 returnbco -> n_bcoeffs = n_bcoeffs ;
216 for ( i = 0 ; i < n_slitlets ; i++ )
218 returnbco[i].slitlet = i ;
219 if ( NULL == (returnbco[i].b = (
float**)cpl_calloc(n_acoeffs,
225 for ( n = 0 ; n < n_acoeffs ; n++ )
227 if ( NULL == (returnbco[i].b[n] = (
float*)cpl_calloc(n_bcoeffs,
246 sinfo_new_destroy_b_coeffs ( Bcoeffs * bco )
250 for ( i = 0 ; i < bco->n_slitlets ; i++ )
252 for ( n = 0 ; n < bco->n_acoeffs ; n++ )
254 cpl_free (bco[i].b[n]) ;
288 sinfo_new_coeffs_cross_slit_fit (
int n_columns,
298 float ** ucoefs, **vcoefs, **covar ;
299 float * acoefsclean ;
300 double sum, sumq, mean ;
302 double cliphi, cliplo ;
305 float* sub_col_index=NULL ;
306 float* sub_acoefs=NULL;
307 float* sub_dacoefs=NULL ;
312 int i, n, num, ndata ;
322 if ( acoefs == NULL || dacoefs == NULL )
332 if ( sigma_factor <= 0. )
337 if ( dispersion == 0. )
349 edge=cpl_calloc(bco->n_slitlets,
sizeof(
int)) ;
350 wcoefs=cpl_calloc(bco->n_bcoeffs,
sizeof(
float)) ;
353 threshold = pixel_dist * fabs(dispersion) ;
354 for ( i = PIXEL ; i < n_columns - PIXEL ; )
356 if ( !isnan(acoefs[0][i+1]) &&
357 acoefs[0][i+1] != 0. &&
358 acoefs[0][i] != 0. &&
359 dacoefs[0][i+1] != 0.)
361 if ( isnan(acoefs[0][i]) || acoefs[0][i] == 0. )
363 if (fabs(acoefs[0][i+1] - acoefs[0][i-1]) >= threshold )
365 if( (i-last_i) < 60 && (i > 80) ) {
384 if ((fabs(acoefs[0][i+1] - acoefs[0][i]) >= threshold) ||
387 if( (i-last_i) < 60 && ((i> 80) || (i<PIXEL+2))) {
410 if( ( (i-last_i) > 63 ) &&
411 ( isnan(fabs(acoefs[0][i+1] - acoefs[0][i])) ||
412 isnan(fabs(acoefs[0][i+1] - acoefs[0][i-1])) ) )
430 if ( n != bco->n_slitlets - 1 )
433 "of slitlets, found: %d",n+1) ;
437 sub_col_index=cpl_calloc(n_columns,
sizeof(
float)) ;
438 sub_acoefs=cpl_calloc(n_columns,
sizeof(
float));
439 sub_dacoefs=cpl_calloc(n_columns,
sizeof(
float)) ;
442 for ( loc_index = 0 ; loc_index < bco->n_acoeffs ; loc_index++ )
445 for ( ns = 0 ; ns < bco->n_slitlets ; ns++ )
453 else if ( ns == bco->n_slitlets - 1 )
455 ed1 = edge[bco->n_slitlets - 2] ;
465 for ( i = ed1 ; i < ed2 ; i++ )
467 if ( isnan(acoefs[loc_index][i]) ||
468 acoefs[loc_index][i] == 0. ||
469 dacoefs[loc_index][i] == 0. )
478 if (NULL==(acoefsclean = (
float*) cpl_calloc(nc ,
sizeof(
float))) )
484 for ( i = ed1 ; i < ed2 ; i++ )
486 if ( isnan(acoefs[loc_index][i]) ||
487 acoefs[loc_index][i] == 0. ||
488 dacoefs[loc_index][i] == 0. )
494 acoefsclean[nc] = acoefs[loc_index][i] ;
503 sinfo_pixel_qsort(acoefsclean, nc) ;
510 for ( i = (
int)((
float)nc*LOW_REJECT) ;
511 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
513 sum += (double)acoefsclean[i] ;
514 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
517 mean = sum/(double)n ;
518 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
519 cliphi = mean + sigma * (double)sigma_factor ;
520 cliplo = mean - sigma * (double)sigma_factor ;
527 for ( i = ed1 ; i < ed2 ; i++ )
534 if ( !isnan(acoefs[loc_index][i]) &&
535 (acoefs[loc_index][i] <= cliphi) &&
536 (acoefs[loc_index][i] >= cliplo) &&
537 (dacoefs[loc_index][i] != 0. ) &&
538 (acoefs[loc_index][i] != 0.) )
540 sub_acoefs[num] = acoefs[loc_index][i] ;
541 sub_dacoefs[num] = dacoefs[loc_index][i] ;
542 sub_col_index[num] = col_index ;
548 offset = (float)(col_index-1) / 2. ;
551 if ( ndata < bco->n_bcoeffs )
554 "determine the fit coefficients.", ns) ;
555 cpl_free(acoefsclean) ;
560 ucoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
561 vcoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
562 covar = sinfo_matrix(1, bco->n_bcoeffs, 1, bco->n_bcoeffs) ;
565 for ( i = 0 ; i < ndata ; i++ )
567 sub_col_index[i] = (sub_col_index[i] - offset) / offset ;
571 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
572 sub_dacoefs-1, ndata, bco[ns].b[loc_index]-1,
573 bco->n_bcoeffs, ucoefs, vcoefs,
574 wcoefs-1, covar, &chisq[ns], sinfo_fpol ) ;
577 for ( i = 0 ; i < bco->n_bcoeffs ; i ++ )
579 bco[ns].b[loc_index][i] /= pow( offset, i ) ;
583 cpl_free (acoefsclean) ;
584 sinfo_free_matrix( ucoefs, 1, 1) ;
585 sinfo_free_matrix( vcoefs, 1, 1) ;
586 sinfo_free_matrix( covar, 1,
591 for ( i = ed1 ; i < ed2 ; i++ )
593 acoefs[loc_index][i] = 0. ;
594 for ( n = 0 ; n < bco->n_bcoeffs ; n++ )
596 acoefs[loc_index][i] += bco[ns].b[loc_index][n] *
597 pow(col_index - offset, n) ;
605 cpl_free(sub_col_index) ;
606 cpl_free(sub_acoefs) ;
607 cpl_free(sub_dacoefs) ;
629 cpl_image * sinfo_new_wave_map_slit (
float ** acoefs,
634 cpl_image * newIm=NULL ;
642 if ( NULL == acoefs )
649 if ( NULL == (newIm = cpl_image_new(n_columns , n_rows,CPL_TYPE_FLOAT)) )
654 podata=cpl_image_get_data_float(newIm);
657 offset = (float)(n_rows - 1) / 2. ;
660 for ( col = 0 ; col < n_columns ; col++ )
663 for ( row = 0 ; row < n_rows ; row++ )
666 row_index = (float)row - offset ;
667 for ( i = 0 ; i < n_acoefs ; i++ )
669 lambda += acoefs[i][col] * pow(row_index, i) ;
671 podata[col+row*n_columns] = lambda ;
724 cpl_image * sinfo_new_wave_cal( cpl_image * image,
729 float ** wavelength_clean,
740 float pixel_tolerance )
747 float * acoefs=NULL ;
748 float * dacoefs=NULL ;
749 float ** dabuf=NULL ;
751 float * chisq_cross=NULL ;
755 cpl_image * wavemap=NULL ;
766 check_nomsg(ilx=cpl_image_get_size_x(image));
767 check_nomsg(ily=cpl_image_get_size_y(image));
780 if ( n_slitlets <= 0 )
785 if ( row_clean == NULL )
790 if ( wavelength_clean == NULL )
796 if ( dispersion == 0. )
802 if ( halfWidth <= 0 || halfWidth > ily/2 )
807 if ( minAmplitude < 1. )
813 if ( max_residual <= 0. || max_residual > 1. )
818 if ( fwhm <= 0. || fwhm > 10. )
824 if ( n_a_fitcoefs <= 0 || n_a_fitcoefs > 9 )
830 if ( n_b_fitcoefs <= 0 || n_b_fitcoefs > 9 )
835 if ( sigmaFactor <= 0. )
848 if ( 0 > (n_fit = sinfo_new_fit_lines( image , par, fwhm, n_found_lines,
849 row_clean, wavelength_clean,
850 halfWidth, minAmplitude )) )
853 "sinfo_fitLines: %d", n_fit) ;
858 if ( -1 == sinfo_new_check_for_fake_lines (par, dispersion,
860 row_clean, n_found_lines,
861 ilx, pixel_tolerance) )
864 "sinfo_fitLines: %d", n_fit) ;
869 if (NULL == (acoefs = (
float*) cpl_calloc(n_a_fitcoefs,
sizeof(
float))) ||
870 NULL == (dacoefs = (
float*) cpl_calloc(n_a_fitcoefs,
sizeof(
float))) ||
871 NULL == (dabuf = (
float**) cpl_calloc(n_a_fitcoefs,
sizeof(
float*))) ||
872 NULL == (chisq_cross = (
float*) cpl_calloc(n_slitlets,
sizeof(
float))))
877 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
879 if ( NULL == (dabuf[i] = (
float*) cpl_calloc(ilx,
sizeof(
float))) )
882 sinfo_free_float (&acoefs ) ;
883 sinfo_free_float ( &dacoefs ) ;
884 sinfo_free_float ( &chisq_cross ) ;
885 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
893 for ( i = 0 ; i < ilx ; i++ )
896 if ( FLT_MAX == (chisq_poly = sinfo_new_polyfit( par, i,
899 max_residual, acoefs,
906 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
913 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
916 if ( acoefs[0] <= 0. || acoefs[1] ==0. ||
917 dacoefs[j] == 0. || isnan(acoefs[j]) )
922 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
926 abuf[j][i] = acoefs[j] ;
927 dabuf[j][i] = dacoefs[j] ;
938 if ( NULL == ( bco = sinfo_new_b_coeffs( n_slitlets,
939 n_a_fitcoefs, n_b_fitcoefs)) )
942 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
943 sinfo_free_float (&acoefs ) ;
944 sinfo_free_float (&dacoefs ) ;
945 sinfo_free_float (&chisq_cross ) ;
950 if ( -1 == ( crossInd = sinfo_new_coeffs_cross_slit_fit( ilx,
960 "coefficients across the columns") ;
961 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
962 sinfo_free_float (&acoefs ) ;
963 sinfo_free_float (&dacoefs ) ;
964 sinfo_free_float (&chisq_cross ) ;
969 if ( NULL == (wavemap = sinfo_new_wave_map_slit (abuf, n_a_fitcoefs,
973 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
974 sinfo_free_float (&acoefs ) ;
975 sinfo_free_float (&dacoefs ) ;
976 sinfo_free_float (&chisq_cross ) ;
977 sinfo_new_destroy_b_coeffs(bco) ;
982 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
983 sinfo_free_float (&acoefs ) ;
984 sinfo_free_float (&dacoefs ) ;
985 sinfo_free_float (&chisq_cross ) ;
986 sinfo_new_destroy_b_coeffs(bco) ;
990 sinfo_free_float (&acoefs ) ;
991 sinfo_free_float ( &dacoefs ) ;
992 sinfo_free_float ( &chisq_cross ) ;
993 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
994 sinfo_new_destroy_b_coeffs(bco) ;
1022 int sinfo_new_check_for_fake_lines ( FitParams ** par,
1024 float ** wavelength_clean,
1026 int * n_found_lines,
1028 float pixel_tolerance )
1042 if ( dispersion == 0. )
1047 if ( wavelength_clean == NULL )
1052 if ( row_clean == NULL )
1057 if ( n_found_lines == NULL )
1062 if ( n_columns < 200 )
1069 for ( col = 0 ; col < n_columns ; col++ )
1071 if ( n_found_lines[col] == 0 )
1075 if ( NULL == (beginWave = (
float*) cpl_calloc( n_found_lines[col],
1081 for ( k = 0 ; k < n_found_lines[col] ; k++ )
1083 beginWave[k] = wavelength_clean[col][k] -
1084 (float)row_clean[col][k] * dispersion ;
1088 if ( FLT_MAX == (firstWave = sinfo_new_clean_mean (beginWave,
1096 cpl_free (beginWave) ;
1099 for ( k = 0 ; k < n_found_lines[col] ; k++ )
1102 row = ( wavelength_clean[col][k] - firstWave ) / dispersion ;
1106 for ( i = 0 ; i < (par[0] -> n_params) ; i ++ )
1110 if ( (par[i] -> column == col) && (par[i] -> line == k) &&
1111 (par[i] -> wavelength == wavelength_clean[col][k]) )
1122 if ( fabs(row - par[found]->fit_par[2]) > pixel_tolerance )
1125 "%d line: %d in row: %f difference: %f",
1126 col, k, par[found]->fit_par[2],
1127 row - par[found]->fit_par[2]) ;
1128 par[found]->fit_par[2] = 0. ;
1134 "no %d not found!\n", col, k ) ;
1161 sinfo_new_create_shifted_slit_wavemap ( cpl_image * lineIm,
1169 cpl_image * wavemap ;
1170 float* emline=NULL ;
1175 float* derv_par=NULL ;
1179 float * filter_spec ;
1182 float cenpos, cenpix ;
1190 float * xdat, * wdat ;
1192 int iters, xdim, ndat ;
1195 int sign, found, line, width ;
1196 int var, maxlag, cmin, cmax ;
1197 gsl_poly_complex_workspace * w ;
1208 if ( lineIm == NULL )
1213 ilx=cpl_image_get_size_x(lineIm);
1214 ily=cpl_image_get_size_y(lineIm);
1215 pidata=cpl_image_get_data_float(lineIm);
1217 if ( coeffs == NULL )
1222 if ( n_fitcoeffs < 2 )
1227 if ( wavelength == NULL || intensity == NULL )
1239 if ( wavelength[0] > 10000. )
1244 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
1256 if ( NULL == (wavemap = cpl_image_new ( ilx, ily, CPL_TYPE_FLOAT)) )
1261 olx=cpl_image_get_size_x(wavemap);
1262 oly=cpl_image_get_size_y(wavemap);
1263 podata=cpl_image_get_data_float(wavemap);
1265 var = (magFactor-1)*(magFactor-1) ;
1269 emline=cpl_calloc(ily,
sizeof(
float)) ;
1270 spec=cpl_calloc(ily,
sizeof(
float)) ;
1271 wave=cpl_calloc(n_lines,
sizeof(
float)) ;
1272 par=cpl_calloc(MAXPAR,
sizeof(
float)) ;
1273 derv_par=cpl_calloc(MAXPAR,
sizeof(
float)) ;
1275 a=cpl_calloc(n_fitcoeffs,
sizeof(
double)) ;
1276 z=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
double)) ;
1280 for ( col = 0 ; col < ilx ; col++ )
1283 for ( i = 0 ; i < ily ; i++ )
1288 for ( i = 0 ; i < n_fitcoeffs ; i++ )
1291 if (i < n_fitcoeffs-1)
1296 a[i] = coeffs[i][col] ;
1299 a_initial = coeffs[0][col] ;
1301 for ( line = 0 ; line < n_lines ; line++ )
1304 wave[line] = wavelength[line]/angst ;
1310 a[0] = a_initial - wave[line] ;
1312 if(NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
1315 cpl_image_delete(wavemap) ;
1318 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, z))
1321 cpl_image_delete(wavemap) ;
1324 sinfo_gsl_poly_complex_workspace_free(w) ;
1328 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
1331 if( (z[2*i] > (-1.)*(
float) ily/2. &&
1332 z[2*i] < (
float)ily/2.) && z[2*i+1] == 0. )
1345 "column %d", line, col) ;
1350 cenpos = z[found] + (float) ily /2. ;
1355 "line %d in column %d", line, col) ;
1366 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
1367 sinfo_new_nint(cenpix) - (var-1) : 0 ;
1368 cmax = (sinfo_new_nint(cenpix) + (var-1)) < ily ?
1369 sinfo_new_nint(cenpix) + (var-1) : ily ;
1372 for ( j = cmin ; j < cmax ; j++ )
1374 emline[j] += intensity[line] *
1375 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
1384 for ( k = 0 ; k < ily ; k++ )
1391 for ( row = 0 ; row < ily ; row++ )
1394 if (!isnan(pidata[col + row*ilx]) &&
1395 (pidata[col + row*ilx] > 0.))
1397 spec[row] = pidata[col + row*ilx] ;
1405 filter_spec = sinfo_function1d_filter_lowpass(spec, ily,
1410 result = sinfo_new_xcorrel( filter_spec, ily, emline, ily,
1411 ily/2, &delta, &maxlag, &xcorr_max) ;
1413 if ( xcorr_max <= 0. )
1416 "col %d set to ZERO \n", col) ;
1417 for ( row = 0 ; row < ily ; row++ )
1419 podata[col + row*ilx] = ZERO ;
1421 sinfo_function1d_del(filter_spec) ;
1429 i = maxlag; j = i+1;
1430 while (result[j] < result[i])
1434 i = maxlag; k = i-1;
1435 while (result[k] < result[i])
1441 if ( NULL == (peak = sinfo_new_vector (width)) )
1444 sinfo_function1d_del(filter_spec) ;
1451 xdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1452 wdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1453 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
1458 for ( i = 0 ; i < width ; i++ )
1460 peak -> data[i] = result[k+i]/xcorr_max * 100. ;
1467 ndat = peak -> n_elements ;
1472 par[1] = width/2.0 ;
1473 par[2] = (float) (maxlag - k) ;
1474 par[3] = (peak -> data[0] + peak -> data[peak->n_elements - 1]) / 2.0 ;
1475 par[0] = result[maxlag]/xcorr_max * 100. - (par[3]) ;
1477 for ( i = 0 ; i < MAXPAR ; i++ )
1484 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
1486 &ndat, par, derv_par, mpar,
1487 &numpar, &tol, &its, &lab )) )
1490 "in col: %d, error no.: %d", col, iters) ;
1491 sinfo_new_destroy_vector ( peak ) ;
1495 sinfo_function1d_del(filter_spec) ;
1500 sinfo_new_destroy_vector ( peak ) ;
1504 sinfo_function1d_del(filter_spec) ;
1507 wavelag =((float)ily/2 - (
float)k - par[2]) ;
1509 if ( fabs(wavelag) > (float)ily/20. )
1512 for ( row = 0 ; row < ily ; row++ )
1514 podata[col + row*ilx] = ZERO ;
1526 centreval = a_initial ;
1527 for ( i = 1 ; i < n_fitcoeffs ; i++ )
1537 centreval += (float)sign * coeffs[i][col]*pow(wavelag, i) ;
1541 for ( row = 0 ; row < oly ; row++ )
1543 centrepix = (float)row - ((
float)oly - 1.)/2. ;
1545 for ( i = 1 ; i < n_fitcoeffs ; i++ )
1547 pixvalue += coeffs[i][col]*pow(centrepix, i) ;
1549 podata[col+row*olx] = centreval + pixvalue ;
1558 cpl_free(derv_par) ;
1592 cpl_image * sinfo_new_create_shifted_slit_wavemap2 ( cpl_image * lineIm,
1602 cpl_image * wavemap ;
1604 float * filter_spec ;
1607 float cenpos, cenpix ;
1617 float * xdat, * wdat ;
1619 int iters, xdim, ndat ;
1622 int sign, found, line, width ;
1623 int var, maxlag, cmin, cmax ;
1628 int edge[N_SLITLETS] ;
1630 float derv_par[MAXPAR] ;
1632 float* emline=NULL ;
1636 float* a0_clean=NULL ;
1639 float* sub_col_index=NULL ;
1640 float* sub_acoefs=NULL;
1641 float* sub_dacoefs=NULL ;
1645 float** bcoef=NULL ;
1646 float* wcoefs=NULL ;
1650 float * acoefsclean ;
1653 float ** ucoefs, **vcoefs, **covar ;
1654 double sum, sumq, mean ;
1656 double cliphi, cliplo ;
1659 gsl_poly_complex_workspace * w ;
1670 if ( lineIm == NULL )
1676 ilx=cpl_image_get_size_x(lineIm);
1677 ily=cpl_image_get_size_y(lineIm);
1678 pidata=cpl_image_get_data_float(lineIm);
1680 if ( coeffs == NULL )
1685 if ( n_fitcoeffs < 2 )
1687 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
1690 if ( wavelength == NULL || intensity == NULL )
1695 if ( n_lines < 1 || magFactor < 1 )
1700 var = (magFactor - 1)*(magFactor - 1) ;
1702 if ( wavelength[0] > 10000. )
1707 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
1718 bcoef=sinfo_new_2Dfloatarray(N_SLITLETS,n_fitcoeffs) ;
1719 wcoefs=cpl_calloc(n_fitcoeffs,
sizeof(
float)) ;
1721 emline=cpl_calloc(ily,
sizeof(
float)) ;
1722 spec=cpl_calloc(ily,
sizeof(
float)) ;
1723 wave=cpl_calloc(n_lines,
sizeof(
float)) ;
1724 a0=cpl_calloc(ilx,
sizeof(
float)) ;
1725 a0_clean=cpl_calloc(ilx,
sizeof(
float)) ;
1729 sub_col_index=cpl_calloc(ilx,
sizeof(
float)) ;
1730 sub_acoefs=cpl_calloc(ilx,
sizeof(
float));
1731 sub_dacoefs=cpl_calloc(ilx,
sizeof(
float)) ;
1733 a=cpl_calloc(n_fitcoeffs,
sizeof(
double)) ;
1734 z=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
double)) ;
1738 threshold = pixel_dist * fabs(dispersion) ;
1739 for ( i = PIXEL ; i < ilx - PIXEL ; )
1741 if (fabs(coeffs[0][i+1] - coeffs[0][i]) >= threshold )
1752 if ( NULL == (wavemap = cpl_image_new ( ilx, ily, CPL_TYPE_FLOAT)) )
1757 olx=cpl_image_get_size_x(wavemap);
1758 oly=cpl_image_get_size_y(wavemap);
1759 podata=cpl_image_get_data_float(wavemap);
1762 for ( col = 0 ; col < ilx ; col++ )
1765 for ( i = 0 ; i < ily ; i++ )
1770 for ( i = 0 ; i < n_fitcoeffs ; i++ )
1773 if (i < n_fitcoeffs-1)
1778 a[i] = coeffs[i][col] ;
1781 a_initial = coeffs[0][col] ;
1783 for ( line = 0 ; line < n_lines ; line++ )
1786 wave[line] = wavelength[line]/angst ;
1792 a[0] = a_initial - wave[line] ;
1794 if (NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
1797 cpl_image_delete(wavemap) ;
1800 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, z))
1803 cpl_image_delete(wavemap) ;
1806 sinfo_gsl_poly_complex_workspace_free(w) ;
1810 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
1813 if( (z[2*i] > (-1.)*(
float) ily/2. &&
1814 z[2*i] < (
float)ily/2.) && z[2*i+1] == 0. )
1827 "line %d in column %d\n", line, col) ;
1832 cenpos = z[found] + (float) ily/2. ;
1837 "for line %d in column %d", line, col) ;
1848 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
1849 sinfo_new_nint(cenpix) - (var-1) : 0 ;
1850 cmax = (sinfo_new_nint(cenpix) + (var-1)) < ily ?
1851 sinfo_new_nint(cenpix) + (var-1) : ily ;
1854 for ( j = cmin ; j < cmax ; j++ )
1856 emline[j] += intensity[line] *
1857 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
1866 for ( k = 0 ; k < ily ; k++ )
1873 for ( row = 0 ; row < ily ; row++ )
1876 if (!isnan(pidata[col + row*ilx]) &&
1877 (pidata[col + row*ilx] > 0.))
1879 spec[row] = pidata[col + row*ilx] ;
1887 filter_spec = sinfo_function1d_filter_lowpass(spec,ily,
1892 result = sinfo_new_xcorrel( filter_spec, ily, emline, ily,
1893 ily/2, &delta, &maxlag, &xcorr_max) ;
1895 if ( xcorr_max <= 0. )
1898 "sum , col %d set to ZERO \n", col) ;
1899 for ( row = 0 ; row < ily ; row++ )
1901 podata[col + row*ilx] = ZERO ;
1903 sinfo_function1d_del(filter_spec) ;
1911 i = maxlag; j = i+1;
1912 while (result[j] < result[i])
1916 i = maxlag; k = i-1;
1917 while (result[k] < result[i])
1923 if ( NULL == (peak = sinfo_new_vector (width)) )
1926 sinfo_function1d_del(filter_spec) ;
1933 xdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1934 wdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1935 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
1940 for ( i = 0 ; i < width ; i++ )
1942 peak -> data[i] = result[k+i]/xcorr_max * 100. ;
1949 ndat = peak -> n_elements ;
1954 par[1] = width/2.0 ;
1955 par[2] = (float) (maxlag - k) ;
1956 par[3] = (peak -> data[0] + peak -> data[peak->n_elements - 1]) / 2.0 ;
1957 par[0] = result[maxlag]/xcorr_max * 100. - (par[3]) ;
1959 for ( i = 0 ; i < MAXPAR ; i++ )
1966 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim, peak -> data,
1969 &numpar, &tol, &its, &lab )) )
1972 "failed in col: %d, error no.: %d", col, iters);
1973 sinfo_new_destroy_vector ( peak ) ;
1977 sinfo_function1d_del(filter_spec) ;
1982 sinfo_new_destroy_vector ( peak ) ;
1986 sinfo_function1d_del(filter_spec) ;
1989 wavelag =((float)ily/2 - (
float)k - par[2]) ;
1991 if ( fabs(wavelag) > (float)ily/20. )
1994 for ( row = 0 ; row < ily ; row++ )
1996 podata[col + row*ilx] = ZERO ;
2008 centreval = a_initial ;
2009 for ( i = 1 ; i < n_fitcoeffs ; i++ )
2019 centreval += (float)sign * coeffs[i][col]*pow(wavelag, i) ;
2021 a0[col] = centreval ;
2025 for ( ns = 0 ; ns < N_SLITLETS ; ns++ )
2033 else if ( ns == N_SLITLETS - 1 )
2035 ed1 = edge[N_SLITLETS - 2] ;
2045 for ( i = ed1 ; i < ed2 ; i++ )
2047 if ( isnan(a0[i]) || a0[i] == 0. )
2056 if ( NULL == (acoefsclean = (
float*) cpl_calloc(nc ,
sizeof(
float))) )
2062 for ( i = ed1 ; i < ed2 ; i++ )
2064 if ( isnan(a0[i]) || a0[i] == 0. )
2070 acoefsclean[nc] = a0[i] ;
2079 sinfo_pixel_qsort(acoefsclean, nc) ;
2085 for ( i = (
int)((
float)nc*LOW_REJECT) ;
2086 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
2088 sum += (double)acoefsclean[i] ;
2089 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
2092 mean = sum/(double)n ;
2093 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
2094 cliphi = mean + sigma * (double)3. ;
2095 cliplo = mean - sigma * (double)3. ;
2099 for ( i = ed1 ; i < ed2 ; i++ )
2102 if ( !isnan(a0[i]) && (a0[i] <= cliphi) && (a0[i] >= cliplo) &&
2105 sub_acoefs[num] = a0[i] ;
2106 sub_dacoefs[num] = 0.0000005 ;
2107 sub_col_index[num] = col_index ;
2113 offset2 = (float)(col_index-1) / 2. ;
2115 if ( ndata < n_fitcoeffs )
2118 to determine the fit coefficients.\n", ns) ;
2119 cpl_free(acoefsclean) ;
2125 ucoefs = sinfo_matrix(1, ndata, 1, n_fitcoeffs) ;
2126 vcoefs = sinfo_matrix(1, ndata, 1, n_fitcoeffs) ;
2127 covar = sinfo_matrix(1, n_fitcoeffs, 1, n_fitcoeffs) ;
2130 for ( i = 0 ; i < ndata ; i++ )
2132 sub_col_index[i] = (sub_col_index[i] - offset2) / offset2 ;
2136 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
2137 sub_dacoefs-1, ndata, bcoef[ns]-1,
2138 n_fitcoeffs, ucoefs, vcoefs, wcoefs-1,
2139 covar, &chisq, sinfo_fpol ) ;
2142 for ( i = 0 ; i < n_fitcoeffs ; i ++ )
2144 bcoef[ns][i] /= pow( offset2, i ) ;
2148 cpl_free (acoefsclean) ;
2149 sinfo_free_matrix( ucoefs, 1, 1) ;
2150 sinfo_free_matrix( vcoefs, 1, 1) ;
2151 sinfo_free_matrix( covar, 1, 1) ;
2155 for ( i = ed1 ; i < ed2 ; i++ )
2158 for ( n = 0 ; n < n_fitcoeffs ; n++ )
2160 a0_clean[i] += bcoef[ns][n] *
2161 pow((
float)col_index - offset2, n) ;
2168 for ( col = 0 ; col < ilx ; col++ )
2171 for ( row = 0 ; row < oly ; row++ )
2173 centrepix = (float)row - ((
float)oly - 1.)/2. ;
2175 for ( i = 1 ; i < n_fitcoeffs ; i++ )
2177 pixvalue += coeffs[i][col]*pow(centrepix, i) ;
2179 podata[col+row*olx] = a0_clean[col] + pixvalue ;
2188 cpl_free(a0_clean) ;
2191 cpl_free(sub_col_index) ;
2192 cpl_free(sub_acoefs);
2193 cpl_free(sub_dacoefs) ;
2198 sinfo_new_destroy_2Dfloatarray(&bcoef,n_fitcoeffs) ;
2227 cpl_image * sinfo_new_create_shifted_slit_wavemap3 ( cpl_image * lineIm,
2236 cpl_image * wavemap ;
2238 float * filter_spec ;
2241 float cenpos, cenpix ;
2243 float wavelag_mean ;
2251 float derv_par[MAXPAR] ;
2255 float * xdat, * wdat ;
2257 int iters, xdim, ndat ;
2260 int sign, found, line, width ;
2261 int var, maxlag, cmin, cmax ;
2263 float* emline=NULL ;
2265 float* wavelag=NULL ;
2270 gsl_poly_complex_workspace * w ;
2283 if ( lineIm == NULL )
2288 ilx=cpl_image_get_size_x(lineIm);
2289 ily=cpl_image_get_size_y(lineIm);
2290 pidata=cpl_image_get_data_float(lineIm);
2292 if ( coeffs == NULL )
2297 if ( n_fitcoeffs < 2 )
2299 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
2303 if ( wavelength == NULL || intensity == NULL )
2308 if ( n_lines < 1 || magFactor < 1 )
2314 var = (magFactor - 1)*(magFactor - 1) ;
2316 if ( wavelength[0] > 10000. )
2321 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
2335 if ( NULL == (wavemap = cpl_image_new ( ilx, ily,CPL_TYPE_FLOAT)) )
2340 podata=cpl_image_get_data_float(lineIm);
2344 emline=cpl_calloc(ily,
sizeof(
float)) ;
2345 spec=cpl_calloc(ily,
sizeof(
float)) ;
2346 wavelag=cpl_calloc(ilx,
sizeof(
float)) ;
2347 wave=cpl_calloc(n_lines,
sizeof(
float)) ;
2348 a=cpl_calloc(n_fitcoeffs,
sizeof(
double)) ;
2349 z=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
double)) ;
2353 for ( col = 0 ; col < ilx ; col++ )
2356 for ( i = 0 ; i < ily ; i++ )
2361 for ( i = 0 ; i < n_fitcoeffs ; i++ )
2364 if (i < n_fitcoeffs-1)
2369 a[i] = coeffs[i][col] ;
2372 a_initial = coeffs[0][col] ;
2374 for ( line = 0 ; line < n_lines ; line++ )
2377 wave[line] = wavelength[line]/angst ;
2383 a[0] = a_initial - wave[line] ;
2385 if (NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
2388 cpl_image_delete(wavemap) ;
2391 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, z))
2394 cpl_image_delete(wavemap) ;
2397 sinfo_gsl_poly_complex_workspace_free(w) ;
2401 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
2404 if( (z[2*i] > (-1.)*(
float) ily/2. &&
2405 z[2*i] < (
float)ily/2.) && z[2*i+1] == 0. )
2418 "in column %d\n", line, col) ;
2423 cenpos = z[found] + (float) ily /2. ;
2428 "line %d in column %d\n", line, col) ;
2439 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
2440 sinfo_new_nint(cenpix) - (var-1) : 0 ;
2441 cmax = (sinfo_new_nint(cenpix) + (var-1)) < ily ?
2442 sinfo_new_nint(cenpix) + (var-1) : ily ;
2445 for ( j = cmin ; j < cmax ; j++ )
2447 emline[j] += intensity[line] *
2448 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
2457 for ( k = 0 ; k < ily ; k++ )
2464 for ( row = 0 ; row < ily ; row++ )
2467 if (!isnan(pidata[col + row*ilx]) &&
2468 (pidata[col + row*ilx] > 0.))
2470 spec[row] = pidata[col + row*ilx] ;
2478 filter_spec = sinfo_function1d_filter_lowpass(spec, ily,
2483 result = sinfo_new_xcorrel( filter_spec, ily, emline, ily,
2484 ily/2, &delta, &maxlag, &xcorr_max) ;
2486 if ( xcorr_max <= 0. )
2489 "col %d set to ZERO \n", col) ;
2490 for ( row = 0 ; row < ily ; row++ )
2492 podata[col + row*ilx] = ZERO ;
2494 sinfo_function1d_del(filter_spec) ;
2502 i = maxlag; j = i+1;
2503 while (result[j] < result[i])
2507 i = maxlag; k = i-1;
2508 while (result[k] < result[i])
2514 if ( NULL == (peak = sinfo_new_vector (width)) )
2517 sinfo_function1d_del(filter_spec) ;
2524 xdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
2525 wdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
2526 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
2531 for ( i = 0 ; i < width ; i++ )
2533 peak -> data[i] = result[k+i]/xcorr_max * 100. ;
2540 ndat = peak -> n_elements ;
2545 par[1] = width/2.0 ;
2546 par[2] = (float) (maxlag - k) ;
2547 par[3] = (peak -> data[0] + peak -> data[peak->n_elements - 1]) / 2.0 ;
2548 par[0] = result[maxlag]/xcorr_max * 100. - (par[3]) ;
2550 for ( i = 0 ; i < MAXPAR ; i++ )
2557 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
2559 &ndat, par, derv_par, mpar,
2560 &numpar, &tol, &its, &lab )) )
2563 " failed in col: %d, error no.: %d\n",
2565 sinfo_new_destroy_vector ( peak ) ;
2569 sinfo_function1d_del(filter_spec) ;
2574 sinfo_new_destroy_vector ( peak ) ;
2578 sinfo_function1d_del(filter_spec) ;
2581 wavelag[col] =((float)ily/2 - (
float)k - par[2]) ;
2585 if (FLT_MAX==(wavelag_mean=sinfo_new_clean_mean(wavelag, ilx, 10., 10.)) )
2591 if ( fabs(wavelag_mean) > (
float)ily/20. )
2599 for ( col = 0 ; col < ilx ; col++ )
2608 a_initial = coeffs[0][col] ;
2609 centreval = a_initial ;
2610 for ( i = 1 ; i < n_fitcoeffs ; i++ )
2620 centreval += (float)sign * coeffs[i][col]*pow(wavelag_mean, i) ;
2625 for ( row = 0 ; row < oly ; row++ )
2627 centrepix = (float)row - ((
float)oly - 1.)/2. ;
2629 for ( i = 1 ; i < n_fitcoeffs ; i++ )
2631 pixvalue += coeffs[i][col]*pow(centrepix, i) ;
2633 podata[col+row*olx] = centreval + pixvalue ;
2672 float sinfo_new_check_line_positions ( cpl_image * lineIm,
2678 float wave_shift=0 ;
2680 float sort_amp[100] ;
2694 float* shift_col=NULL ;
2702 if ( lineIm == NULL )
2707 lx=cpl_image_get_size_x(lineIm);
2708 ly=cpl_image_get_size_y(lineIm);
2711 if ( coeffs == NULL )
2721 if ( n_fitcoeffs < 2 )
2723 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
2727 offset = (float) (ly -1.) / 2. ;
2728 n_lines = par[0]->n_params/lx ;
2730 shift_col=cpl_calloc(lx,
sizeof(
float)) ;
2731 foundit=cpl_calloc(par[0]->n_params,
sizeof(
int)) ;
2735 for ( col = 0 ; col < lx ; col++ )
2738 for ( i = 0 ; i < par[0]->n_params ; i++ )
2740 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
2741 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. )
2744 amp[n] = par[i]->fit_par[0] ;
2745 sort_amp[n] = amp[n] ;
2749 sinfo_pixel_qsort(sort_amp, n) ;
2761 for ( j = firstj ; j < n ; j++ )
2763 for ( m = 0 ; m < n ; m++ )
2765 if ( sort_amp[j] == amp[m] )
2767 position = par[foundit[m]]->fit_par[2] ;
2768 lambda = par[foundit[m]]->wavelength ;
2770 for ( k = 0 ; k < n_fitcoeffs ; k++ )
2772 wave += coeffs[k][col]*pow(position-offset, k) ;
2774 shift += lambda - wave ;
2779 if ( l == 0 ) continue ;
2780 shift_col[col] = shift/(float)l ;
2782 wave_shift = sinfo_new_clean_mean(shift_col, lx, 10., 10.) ;
2783 sinfo_msg(
"Overall positioning error: %3.2g [um] %3.2g [pix]",
2784 wave_shift,wave_shift/fabs(gdisp1)) ;
2788 for ( lin = 0 ; lin < n_lines ; lin++ )
2790 for ( col = 0 ; col < lx ; col++ )
2792 shift_col[col] = 0. ;
2794 for ( i = 0 ; i < par[0]->n_params ; i++ )
2796 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
2797 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. &&
2798 par[i]->line == lin )
2803 if (found == -1) break ;
2805 position = par[found]->fit_par[2] ;
2806 lambda = par[found]->wavelength ;
2808 for ( k = 0 ; k < n_fitcoeffs ; k++ )
2810 wave += coeffs[k][col]*pow(position-offset, k) ;
2812 shift_col[col] = lambda - wave ;
2816 sinfo_msg(
"shift: %3.2g [um] %3.2g (pix) at: %4.3f [um]",
2817 sinfo_new_clean_mean(shift_col,lx, 10., 10.),
2818 sinfo_new_clean_mean(shift_col,lx, 10., 10.)/fabs(gdisp1),
2822 cpl_free(shift_col) ;
2857 float sinfo_new_check_correlated_line_positions ( cpl_image * lineIm,
2865 float min_amplitude,
2869 float wave_shift=0 ;
2890 float* shift_col=NULL ;
2891 float* wave_cor=NULL ;
2893 double* zroot=NULL ;
2895 gsl_poly_complex_workspace * w=NULL ;
2896 Vector * vline=NULL;
2904 if ( lineIm == NULL )
2909 lx=cpl_image_get_size_x(lineIm);
2910 ly=cpl_image_get_size_y(lineIm);
2914 if ( coeffs == NULL )
2924 if ( n_fitcoeffs < 2 )
2926 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
2929 if ( wavelength == NULL || intensity == NULL )
2944 if ( min_amplitude <= 0 )
2951 if ( NULL == (vline = sinfo_new_vector (2*width + 1)) )
2957 xdat = (
float *) cpl_calloc( vline -> n_elements,
sizeof (
float) ) ;
2958 wdat = (
float *) cpl_calloc( vline -> n_elements,
sizeof (
float) ) ;
2959 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
2962 foundit=cpl_calloc(par[0]->n_params,
sizeof(
int)) ;
2963 shift_col=cpl_calloc(lx,
sizeof(
float)) ;
2964 wave_cor=cpl_calloc(n_lines,
sizeof(
float)) ;
2965 a=cpl_calloc(n_fitcoeffs,
sizeof(
float)) ;
2966 zroot=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
float)) ;
2973 if ( wavelength[0] > 10000. )
2978 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
2988 offset = ((float) ly -1.) / 2. ;
2991 for ( col = 10 ; col < 25 ; col++ )
2994 for ( i = 0 ; i < n_fitcoeffs ; i++ )
2997 if (i < n_fitcoeffs-1)
3002 a[i] = coeffs[i][col] ;
3007 for ( line = 0 ; line < n_lines ; line++ )
3010 wave_cor[line] = wavelength[line]/angst ;
3011 if (line > 0 && line < n_lines-1)
3013 if (fabs((wave_cor[line] - wave_cor[line-1]) /
3014 dispersion ) < 2*width ||
3015 fabs((wave_cor[line] - wave_cor[line+1]) /
3016 dispersion ) < 2*width )
3022 a[0] = a_initial - wave_cor[line] ;
3024 if (NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
3029 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, zroot))
3034 sinfo_gsl_poly_complex_workspace_free(w) ;
3038 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
3041 if( (zroot[2*i] > (-1.)*(
float) ly/2. &&
3042 zroot[2*i] < (
float)ly/2.) && zroot[2*i+1] == 0. )
3056 "in column %d\n", line, col) ;
3061 cenpos = zroot[found] + (float)ly / 2. ; ;
3066 line %d in column %d\n", line, col) ;
3080 if ( (result = sinfo_new_line_fit ( lineIm, par[k],
3082 width, cenpos, min_amplitude, vline,
3083 mpar, xdat, wdat ) ) < 0 )
3086 "column: %d, row: %f, line: %d\n",
3087 result, col, cenpos, line) ;
3090 if ( (par[k] -> fit_par[0] <= 0.) || (par[k] -> fit_par[1] <= 0.)
3091 || (par[k] -> fit_par[2] <= 0.) )
3094 "line: %d\n", col, line) ;
3097 par[k] -> wavelength = wavelength[line] ;
3104 sinfo_new_destroy_vector(vline);
3111 for ( col = 10 ; col < 25 ; col++ )
3114 for ( i = 0 ; i < k ; i++ )
3116 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
3117 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. )
3123 if ( n == 0 ) continue ;
3127 for ( j = 0 ; j < n ; j++ )
3129 position = par[foundit[j]]->fit_par[2] ;
3130 lambda = par[foundit[j]]->wavelength ;
3131 line = par[foundit[j]]->line ;
3132 if (line > 0 && line < n_lines-1)
3134 if (fabs((wave_cor[line] - wave_cor[line-1]) /
3135 dispersion ) < 2*width ||
3136 fabs((wave_cor[line] - wave_cor[line+1]) /
3137 dispersion ) < 2*width )
3143 for ( i = 0 ; i < n_fitcoeffs ; i++ )
3145 wave += coeffs[i][col]*pow(position-offset, i) ;
3147 shift += lambda - wave ;
3150 shift_col[c] = shift/(float)z ;
3155 wave_shift = sinfo_new_clean_mean(shift_col, c, 10., 10.) ;
3156 sinfo_msg(
"overall positioning error in microns: %g", wave_shift) ;
3160 for ( line = 0 ; line < n_lines ; line++ )
3162 if (line > 0 && line < n_lines-1)
3164 if (fabs((wave_cor[line] - wave_cor[line-1]) / dispersion ) <
3166 fabs((wave_cor[line] - wave_cor[line+1]) / dispersion ) <
3174 for ( col = 10 ; col < 25 ; col++ )
3178 for ( i = 0 ; i < k ; i++ )
3180 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
3181 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. &&
3182 par[i]->line == line )
3187 if (found == -1) break ;
3189 position = par[found]->fit_par[2] ;
3190 lambda = par[found]->wavelength ;
3192 for ( i = 0 ; i < n_fitcoeffs ; i++ )
3194 wave += coeffs[i][col]*pow(position-offset, i) ;
3196 shift_col[c] = lambda - wave ;
3199 if (found != -1 && c > 0 )
3201 sinfo_msg(
"shift in microns: %g at wavelength: %f\n",
3202 sinfo_new_clean_mean(shift_col, c, 20., 20.), lambda) ;
3209 cpl_free(shift_col) ;
3210 cpl_free(wave_cor) ;
3244 sinfo_new_spred_coeffs_cross_slit_fit (
int n_columns,
3252 float ** sinfo_slit_pos )
3257 float ** ucoefs, **vcoefs, **covar ;
3258 float * acoefsclean ;
3259 double sum, sumq, mean ;
3261 double cliphi, cliplo ;
3266 float* sub_col_index=NULL ;
3267 float* sub_acoefs=NULL;
3268 float* sub_dacoefs=NULL ;
3269 float* wcoefs=NULL ;
3273 int i, n, num, ndata ;
3279 if ( n_columns < 1 )
3284 if ( acoefs == NULL || dacoefs == NULL )
3294 if ( sigma_factor <= 0. )
3299 if ( dispersion == 0. )
3306 edge=cpl_calloc(bco->n_slitlets,
sizeof(
int)) ;
3307 sub_col_index=cpl_calloc(n_columns,
sizeof(
float)) ;
3308 sub_acoefs=cpl_calloc(n_columns,
sizeof(
float));
3309 sub_dacoefs=cpl_calloc(n_columns,
sizeof(
float)) ;
3311 wcoefs=cpl_calloc(bco->n_bcoeffs,
sizeof(
float)) ;
3319 threshold = pixel_dist * fabs(dispersion) ;
3320 sinfo_slit_pos[0][0]=0 ;
3323 for ( i = 0 ; i < n_columns - PIXEL ; )
3325 if ( !isnan(acoefs[0][i+1]) &&
3326 acoefs[0][i+1] != 0. &&
3328 && dacoefs[0][i+1] != 0.)
3330 if ( isnan(acoefs[0][i]) || acoefs[0][i] == 0. )
3332 if (fabs(acoefs[0][i+1] - acoefs[0][i-1]) >= threshold )
3336 sinfo_slit_pos[sl_index][1] = i ;
3337 sinfo_slit_pos[sl_index+1][0] = i + 1 ;
3346 if (fabs(acoefs[0][i+1] - acoefs[0][i]) >= threshold )
3350 sinfo_slit_pos[sl_index][1] = i ;
3351 sinfo_slit_pos[sl_index+1][0] = i + 1 ;
3362 if( ( (i-last_i) > 63 ) &&
3363 ( isnan(fabs(acoefs[0][i+1] - acoefs[0][i])) ||
3364 isnan(fabs(acoefs[0][i+1] - acoefs[0][i-1])) ) )
3367 sinfo_slit_pos[sl_index][1] = i ;
3368 sinfo_slit_pos[sl_index+1][0] = i + 1 ;
3380 sinfo_slit_pos[sl_index][1] = 2047;
3382 if ( n != bco->n_slitlets - 1 )
3385 "slitlets, found: %d\n",n+1) ;
3390 for ( loc_index = 0 ; loc_index < bco->n_acoeffs ; loc_index++ )
3393 for ( ns = 0 ; ns < bco->n_slitlets ; ns++ )
3401 else if ( ns == bco->n_slitlets - 1 )
3403 ed1 = edge[bco->n_slitlets - 2] ;
3413 for ( i = ed1 ; i < ed2 ; i++ )
3415 if ( isnan(acoefs[loc_index][i]) ||
3416 acoefs[loc_index][i] == 0. ||
3417 dacoefs[loc_index][i] == 0. )
3426 if (NULL==(acoefsclean=(
float*) cpl_calloc(nc ,
sizeof(
float))) )
3432 for ( i = ed1 ; i < ed2 ; i++ )
3434 if ( isnan(acoefs[loc_index][i]) ||
3435 acoefs[loc_index][i] == 0. ||
3436 dacoefs[loc_index][i] == 0. )
3442 acoefsclean[nc] = acoefs[loc_index][i] ;
3451 sinfo_pixel_qsort(acoefsclean, nc) ;
3458 for ( i = (
int)((
float)nc*LOW_REJECT) ;
3459 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
3461 sum += (double)acoefsclean[i] ;
3462 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
3465 mean = sum/(double)n ;
3466 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
3467 cliphi = mean + sigma * (double)sigma_factor ;
3468 cliplo = mean - sigma * (double)sigma_factor ;
3472 for ( i = ed1 ; i < ed2 ; i++ )
3475 if ( !isnan(acoefs[loc_index][i]) &&
3476 (acoefs[loc_index][i] <= cliphi) &&
3477 (acoefs[loc_index][i] >= cliplo) &&
3478 (dacoefs[loc_index][i] != 0. ) &&
3479 (acoefs[loc_index][i] != 0.) )
3481 sub_acoefs[num] = acoefs[loc_index][i] ;
3482 sub_dacoefs[num] = dacoefs[loc_index][i] ;
3483 sub_col_index[num] = col_index ;
3489 offset = (float)(col_index-1) / 2. ;
3491 if ( ndata < bco->n_bcoeffs )
3494 " to determine the fit coefficients.\n", ns) ;
3495 cpl_free(acoefsclean) ;
3500 ucoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
3501 vcoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
3502 covar = sinfo_matrix(1, bco->n_bcoeffs, 1, bco->n_bcoeffs) ;
3505 for ( i = 0 ; i < ndata ; i++ )
3507 sub_col_index[i] = (sub_col_index[i] - offset) / offset ;
3511 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
3512 sub_dacoefs-1, ndata, bco[ns].b[loc_index]-1,
3513 bco->n_bcoeffs, ucoefs, vcoefs, wcoefs-1,
3514 covar, &chisq[ns], sinfo_fpol ) ;
3517 for ( i = 0 ; i < bco->n_bcoeffs ; i ++ )
3519 bco[ns].b[loc_index][i] /= pow( offset, i ) ;
3523 cpl_free (acoefsclean) ;
3524 sinfo_free_matrix( ucoefs, 1, 1) ;
3525 sinfo_free_matrix( vcoefs, 1, 1) ;
3526 sinfo_free_matrix( covar, 1,
3531 for ( i = ed1 ; i < ed2 ; i++ )
3533 acoefs[loc_index][i] = 0. ;
3534 for ( n = 0 ; n < bco->n_bcoeffs ; n++ )
3536 acoefs[loc_index][i] += bco[ns].b[loc_index][n] *
3537 pow(col_index - offset, n) ;
3547 cpl_free(sub_col_index) ;
3548 cpl_free(sub_acoefs);
3549 cpl_free(sub_dacoefs) ;
3604 cpl_image * sinfo_new_spred_wave_cal( cpl_image * image,
3609 float ** wavelength_clean,
3610 int * n_found_lines,
3620 float pixel_tolerance,
3621 float ** sinfo_slit_pos)
3633 float * chisq_cross ;
3637 cpl_image * wavemap ;
3643 if ( NULL == image )
3648 ilx=cpl_image_get_size_x(image);
3649 ily=cpl_image_get_size_y(image);
3662 if ( n_slitlets <= 0 )
3667 if ( row_clean == NULL )
3672 if ( wavelength_clean == NULL )
3678 if ( dispersion == 0. )
3684 if ( halfWidth <= 0 || halfWidth > ily/2 )
3686 sinfo_msg_error(
" impossible half width of the fitting box given\n") ;
3689 if ( minAmplitude < 1. )
3695 if ( max_residual <= 0. || max_residual > 1. )
3700 if ( fwhm <= 0. || fwhm > 10. )
3706 if ( n_a_fitcoefs <= 0 || n_a_fitcoefs > 9 )
3712 if ( n_b_fitcoefs <= 0 || n_b_fitcoefs > 9 )
3717 if ( sigmaFactor <= 0. )
3729 if ( 0 > (n_fit = sinfo_new_fit_lines( image , par, fwhm, n_found_lines,
3730 row_clean, wavelength_clean,
3731 halfWidth, minAmplitude )) )
3734 "sinfo_fitLines: %d", n_fit) ;
3739 if ( -1 == sinfo_new_check_for_fake_lines (par,
3748 " sinfo_fitLines: %d\n", n_fit) ;
3754 if (NULL==(acoefs = (
float*) cpl_calloc (n_a_fitcoefs,
sizeof(
float))) ||
3755 NULL==(dacoefs = (
float*) cpl_calloc (n_a_fitcoefs,
sizeof(
float))) ||
3756 NULL==(dabuf = (
float**) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
3757 NULL==(chisq_cross = (
float*) cpl_calloc(n_slitlets,
sizeof(
float))) )
3762 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3764 if ( NULL == (dabuf[i] = (
float*) cpl_calloc(ilx,
sizeof(
float))) )
3767 cpl_free ( acoefs ) ;
3768 cpl_free ( dacoefs ) ;
3769 cpl_free ( chisq_cross ) ;
3777 for ( i = 0 ; i < ilx ; i++ )
3780 if ( FLT_MAX == (chisq_poly = sinfo_new_polyfit( par, i,
3783 max_residual, acoefs,
3788 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
3795 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
3798 if ( acoefs[0] <= 0. || acoefs[1] ==0. ||
3799 dacoefs[j] == 0. || isnan(acoefs[j]) )
3804 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
3808 abuf[j][i] = acoefs[j] ;
3809 dabuf[j][i] = dacoefs[j] ;
3814 dabuf[j][i] = ZERO ;
3820 if ( NULL == ( bco = sinfo_new_b_coeffs( n_slitlets,
3821 n_a_fitcoefs, n_b_fitcoefs)) )
3824 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3826 cpl_free (dabuf[i]) ;
3829 cpl_free ( acoefs ) ;
3830 cpl_free ( dacoefs ) ;
3831 cpl_free ( chisq_cross ) ;
3836 if ( -1 == ( crossInd = sinfo_new_spred_coeffs_cross_slit_fit( ilx, abuf,
3845 "coefficients across the columns\n") ;
3846 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3848 cpl_free (dabuf[i]) ;
3852 cpl_free ( acoefs ) ;
3853 cpl_free ( dacoefs ) ;
3854 sinfo_new_destroy_b_coeffs(bco) ;
3855 cpl_free ( chisq_cross ) ;
3859 if ( NULL == (wavemap = sinfo_new_wave_map_slit (abuf, n_a_fitcoefs,
3863 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3865 cpl_free (dabuf[i]) ;
3869 cpl_free ( acoefs ) ;
3870 cpl_free ( dacoefs ) ;
3871 sinfo_new_destroy_b_coeffs(bco) ;
3872 cpl_free ( chisq_cross ) ;
3877 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3879 cpl_free (dabuf[i]) ;
3882 cpl_free ( acoefs ) ;
3883 cpl_free ( dacoefs ) ;
3884 sinfo_new_destroy_b_coeffs(bco) ;
3885 cpl_free ( chisq_cross ) ;