33 #include "sinfo_vltPort.h"
43 #include "sinfo_function_1d.h"
44 #include "sinfo_recipes.h"
45 #include "sinfo_wavecal.h"
46 #include "sinfo_wave_calibration.h"
47 #include "sinfo_solve_poly_root.h"
48 #include "sinfo_utils_wrappers.h"
49 #include "sinfo_error.h"
51 #include "sinfo_svd.h"
56 sinfo_new_b_coeffs(
int n_slitlets,
61 sinfo_new_destroy_b_coeffs ( Bcoeffs * bco ) ;
64 sinfo_new_coeffs_cross_slit_fit (
int n_columns,
75 sinfo_new_spred_coeffs_cross_slit_fit (
int n_columns,
83 float ** sinfo_slit_pos) ;
106 sinfo_new_b_coeffs(
int n_slitlets,
111 Bcoeffs * returnbco ;
113 if(NULL == (returnbco=(Bcoeffs*) cpl_calloc(n_slitlets,
sizeof(Bcoeffs))) )
118 returnbco -> n_slitlets = n_slitlets ;
119 returnbco -> n_acoeffs = n_acoeffs ;
120 returnbco -> n_bcoeffs = n_bcoeffs ;
121 for ( i = 0 ; i < n_slitlets ; i++ )
123 returnbco[i].slitlet = i ;
124 if ( NULL == (returnbco[i].b = (
float**)cpl_calloc(n_acoeffs,
130 for ( n = 0 ; n < n_acoeffs ; n++ )
132 if ( NULL == (returnbco[i].b[n] = (
float*)cpl_calloc(n_bcoeffs,
151 sinfo_new_destroy_b_coeffs ( Bcoeffs * bco )
155 for ( i = 0 ; i < bco->n_slitlets ; i++ )
157 for ( n = 0 ; n < bco->n_acoeffs ; n++ )
159 cpl_free (bco[i].b[n]) ;
194 sinfo_new_coeffs_cross_slit_fit (
int n_columns,
204 float ** ucoefs, **vcoefs, **covar ;
205 float * acoefsclean ;
206 double sum, sumq, mean ;
208 double cliphi, cliplo ;
211 float* sub_col_index=NULL ;
212 float* sub_acoefs=NULL;
213 float* sub_dacoefs=NULL ;
218 int i, n, num, ndata ;
228 if ( acoefs == NULL || dacoefs == NULL )
238 if ( sigma_factor <= 0. )
243 if ( dispersion == 0. )
255 edge=cpl_calloc(bco->n_slitlets,
sizeof(
int)) ;
256 wcoefs=cpl_calloc(bco->n_bcoeffs,
sizeof(
float)) ;
259 threshold = pixel_dist * fabs(dispersion) ;
260 for ( i = PIXEL ; i < n_columns - PIXEL ; )
262 if ( !isnan(acoefs[0][i+1]) &&
263 acoefs[0][i+1] != 0. &&
264 acoefs[0][i] != 0. &&
265 dacoefs[0][i+1] != 0.)
267 if ( isnan(acoefs[0][i]) || acoefs[0][i] == 0. )
269 if (fabs(acoefs[0][i+1] - acoefs[0][i-1]) >= threshold )
271 if( (i-last_i) < 60 && (i > 80) ) {
290 if ((fabs(acoefs[0][i+1] - acoefs[0][i]) >= threshold) ||
293 if( (i-last_i) < 60 && ((i> 80) || (i<PIXEL+2))) {
316 if( ( (i-last_i) > 63 ) &&
317 ( isnan(fabs(acoefs[0][i+1] - acoefs[0][i])) ||
318 isnan(fabs(acoefs[0][i+1] - acoefs[0][i-1])) ) )
336 if ( n != bco->n_slitlets - 1 )
339 "of slitlets, found: %d",n+1) ;
343 sub_col_index=cpl_calloc(n_columns,
sizeof(
float)) ;
344 sub_acoefs=cpl_calloc(n_columns,
sizeof(
float));
345 sub_dacoefs=cpl_calloc(n_columns,
sizeof(
float)) ;
348 for ( loc_index = 0 ; loc_index < bco->n_acoeffs ; loc_index++ )
351 for ( ns = 0 ; ns < bco->n_slitlets ; ns++ )
359 else if ( ns == bco->n_slitlets - 1 )
361 ed1 = edge[bco->n_slitlets - 2] ;
371 for ( i = ed1 ; i < ed2 ; i++ )
373 if ( isnan(acoefs[loc_index][i]) ||
374 acoefs[loc_index][i] == 0. ||
375 dacoefs[loc_index][i] == 0. )
384 if (NULL==(acoefsclean = (
float*) cpl_calloc(nc ,
sizeof(
float))) )
390 for ( i = ed1 ; i < ed2 ; i++ )
392 if ( isnan(acoefs[loc_index][i]) ||
393 acoefs[loc_index][i] == 0. ||
394 dacoefs[loc_index][i] == 0. )
400 acoefsclean[nc] = acoefs[loc_index][i] ;
409 sinfo_pixel_qsort(acoefsclean, nc) ;
416 for ( i = (
int)((
float)nc*LOW_REJECT) ;
417 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
419 sum += (double)acoefsclean[i] ;
420 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
423 mean = sum/(double)n ;
424 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
425 cliphi = mean + sigma * (double)sigma_factor ;
426 cliplo = mean - sigma * (double)sigma_factor ;
433 for ( i = ed1 ; i < ed2 ; i++ )
440 if ( !isnan(acoefs[loc_index][i]) &&
441 (acoefs[loc_index][i] <= cliphi) &&
442 (acoefs[loc_index][i] >= cliplo) &&
443 (dacoefs[loc_index][i] != 0. ) &&
444 (acoefs[loc_index][i] != 0.) )
446 sub_acoefs[num] = acoefs[loc_index][i] ;
447 sub_dacoefs[num] = dacoefs[loc_index][i] ;
448 sub_col_index[num] = col_index ;
454 offset = (float)(col_index-1) / 2. ;
457 if ( ndata < bco->n_bcoeffs )
460 "determine the fit coefficients.", ns) ;
461 cpl_free(acoefsclean) ;
466 ucoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
467 vcoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
468 covar = sinfo_matrix(1, bco->n_bcoeffs, 1, bco->n_bcoeffs) ;
471 for ( i = 0 ; i < ndata ; i++ )
473 sub_col_index[i] = (sub_col_index[i] - offset) / offset ;
477 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
478 sub_dacoefs-1, ndata, bco[ns].b[loc_index]-1,
479 bco->n_bcoeffs, ucoefs, vcoefs,
480 wcoefs-1, covar, &chisq[ns], sinfo_fpol ) ;
483 for ( i = 0 ; i < bco->n_bcoeffs ; i ++ )
485 bco[ns].b[loc_index][i] /= pow( offset, i ) ;
489 cpl_free (acoefsclean) ;
490 sinfo_free_matrix( ucoefs, 1, 1) ;
491 sinfo_free_matrix( vcoefs, 1, 1) ;
492 sinfo_free_matrix( covar, 1,
497 for ( i = ed1 ; i < ed2 ; i++ )
499 acoefs[loc_index][i] = 0. ;
500 for ( n = 0 ; n < bco->n_bcoeffs ; n++ )
502 acoefs[loc_index][i] += bco[ns].b[loc_index][n] *
503 pow(col_index - offset, n) ;
511 cpl_free(sub_col_index) ;
512 cpl_free(sub_acoefs) ;
513 cpl_free(sub_dacoefs) ;
536 cpl_image * sinfo_new_wave_map_slit (
float ** acoefs,
541 cpl_image * newIm=NULL ;
549 if ( NULL == acoefs )
556 if ( NULL == (newIm = cpl_image_new(n_columns , n_rows,CPL_TYPE_FLOAT)) )
561 podata=cpl_image_get_data_float(newIm);
564 offset = (float)(n_rows - 1) / 2. ;
567 for ( col = 0 ; col < n_columns ; col++ )
570 for ( row = 0 ; row < n_rows ; row++ )
573 row_index = (float)row - offset ;
574 for ( i = 0 ; i < n_acoefs ; i++ )
576 lambda += acoefs[i][col] * pow(row_index, i) ;
578 podata[col+row*n_columns] = lambda ;
635 cpl_image * sinfo_new_wave_cal( cpl_image * image,
640 float ** wavelength_clean,
651 float pixel_tolerance )
658 float * acoefs=NULL ;
659 float * dacoefs=NULL ;
660 float ** dabuf=NULL ;
662 float * chisq_cross=NULL ;
666 cpl_image * wavemap=NULL ;
677 check_nomsg(ilx=cpl_image_get_size_x(image));
678 check_nomsg(ily=cpl_image_get_size_y(image));
691 if ( n_slitlets <= 0 )
696 if ( row_clean == NULL )
701 if ( wavelength_clean == NULL )
707 if ( dispersion == 0. )
713 if ( halfWidth <= 0 || halfWidth > ily/2 )
718 if ( minAmplitude < 1. )
724 if ( max_residual <= 0. || max_residual > 1. )
729 if ( fwhm <= 0. || fwhm > 10. )
735 if ( n_a_fitcoefs <= 0 || n_a_fitcoefs > 9 )
741 if ( n_b_fitcoefs <= 0 || n_b_fitcoefs > 9 )
746 if ( sigmaFactor <= 0. )
759 if ( 0 > (n_fit = sinfo_new_fit_lines( image , par, fwhm, n_found_lines,
760 row_clean, wavelength_clean,
761 halfWidth, minAmplitude )) )
764 "sinfo_fitLines: %d", n_fit) ;
769 if ( -1 == sinfo_new_check_for_fake_lines (par, dispersion,
771 row_clean, n_found_lines,
772 ilx, pixel_tolerance) )
775 "sinfo_fitLines: %d", n_fit) ;
780 if (NULL == (acoefs = (
float*) cpl_calloc(n_a_fitcoefs,
sizeof(
float))) ||
781 NULL == (dacoefs = (
float*) cpl_calloc(n_a_fitcoefs,
sizeof(
float))) ||
782 NULL == (dabuf = (
float**) cpl_calloc(n_a_fitcoefs,
sizeof(
float*))) ||
783 NULL == (chisq_cross = (
float*) cpl_calloc(n_slitlets,
sizeof(
float))))
788 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
790 if ( NULL == (dabuf[i] = (
float*) cpl_calloc(ilx,
sizeof(
float))) )
793 sinfo_free_float (&acoefs ) ;
794 sinfo_free_float ( &dacoefs ) ;
795 sinfo_free_float ( &chisq_cross ) ;
796 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
804 for ( i = 0 ; i < ilx ; i++ )
807 if ( FLT_MAX == (chisq_poly = sinfo_new_polyfit( par, i,
810 max_residual, acoefs,
817 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
824 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
827 if ( acoefs[0] <= 0. || acoefs[1] ==0. ||
828 dacoefs[j] == 0. || isnan(acoefs[j]) )
833 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
837 abuf[j][i] = acoefs[j] ;
838 dabuf[j][i] = dacoefs[j] ;
849 if ( NULL == ( bco = sinfo_new_b_coeffs( n_slitlets,
850 n_a_fitcoefs, n_b_fitcoefs)) )
853 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
854 sinfo_free_float (&acoefs ) ;
855 sinfo_free_float (&dacoefs ) ;
856 sinfo_free_float (&chisq_cross ) ;
861 if ( -1 == ( crossInd = sinfo_new_coeffs_cross_slit_fit( ilx,
871 "coefficients across the columns") ;
872 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
873 sinfo_free_float (&acoefs ) ;
874 sinfo_free_float (&dacoefs ) ;
875 sinfo_free_float (&chisq_cross ) ;
880 if ( NULL == (wavemap = sinfo_new_wave_map_slit (abuf, n_a_fitcoefs,
884 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
885 sinfo_free_float (&acoefs ) ;
886 sinfo_free_float (&dacoefs ) ;
887 sinfo_free_float (&chisq_cross ) ;
888 sinfo_new_destroy_b_coeffs(bco) ;
893 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
894 sinfo_free_float (&acoefs ) ;
895 sinfo_free_float (&dacoefs ) ;
896 sinfo_free_float (&chisq_cross ) ;
897 sinfo_new_destroy_b_coeffs(bco) ;
901 sinfo_free_float (&acoefs ) ;
902 sinfo_free_float ( &dacoefs ) ;
903 sinfo_free_float ( &chisq_cross ) ;
904 sinfo_free_float_array(&dabuf,n_a_fitcoefs) ;
905 sinfo_new_destroy_b_coeffs(bco) ;
936 int sinfo_new_check_for_fake_lines ( FitParams ** par,
938 float ** wavelength_clean,
942 float pixel_tolerance )
956 if ( dispersion == 0. )
961 if ( wavelength_clean == NULL )
966 if ( row_clean == NULL )
971 if ( n_found_lines == NULL )
976 if ( n_columns < 200 )
983 for ( col = 0 ; col < n_columns ; col++ )
985 if ( n_found_lines[col] == 0 )
989 if ( NULL == (beginWave = (
float*) cpl_calloc( n_found_lines[col],
995 for ( k = 0 ; k < n_found_lines[col] ; k++ )
997 beginWave[k] = wavelength_clean[col][k] -
998 (float)row_clean[col][k] * dispersion ;
1002 if ( FLT_MAX == (firstWave = sinfo_new_clean_mean (beginWave,
1010 cpl_free (beginWave) ;
1013 for ( k = 0 ; k < n_found_lines[col] ; k++ )
1016 row = ( wavelength_clean[col][k] - firstWave ) / dispersion ;
1020 for ( i = 0 ; i < (par[0] -> n_params) ; i ++ )
1024 if ( (par[i] -> column == col) && (par[i] -> line == k) &&
1025 (par[i] -> wavelength == wavelength_clean[col][k]) )
1036 if ( fabs(row - par[found]->fit_par[2]) > pixel_tolerance )
1039 "%d line: %d in row: %f difference: %f",
1040 col, k, par[found]->fit_par[2],
1041 row - par[found]->fit_par[2]) ;
1042 par[found]->fit_par[2] = 0. ;
1048 "no %d not found!\n", col, k ) ;
1077 sinfo_new_create_shifted_slit_wavemap ( cpl_image * lineIm,
1085 cpl_image * wavemap ;
1086 float* emline=NULL ;
1091 float* derv_par=NULL ;
1095 float * filter_spec ;
1098 float cenpos, cenpix ;
1106 float * xdat, * wdat ;
1108 int iters, xdim, ndat ;
1111 int sign, found, line, width ;
1112 int var, maxlag, cmin, cmax ;
1113 gsl_poly_complex_workspace * w ;
1124 if ( lineIm == NULL )
1129 ilx=cpl_image_get_size_x(lineIm);
1130 ily=cpl_image_get_size_y(lineIm);
1131 pidata=cpl_image_get_data_float(lineIm);
1133 if ( coeffs == NULL )
1138 if ( n_fitcoeffs < 2 )
1143 if ( wavelength == NULL || intensity == NULL )
1155 if ( wavelength[0] > 10000. )
1160 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
1172 if ( NULL == (wavemap = cpl_image_new ( ilx, ily, CPL_TYPE_FLOAT)) )
1177 olx=cpl_image_get_size_x(wavemap);
1178 oly=cpl_image_get_size_y(wavemap);
1179 podata=cpl_image_get_data_float(wavemap);
1181 var = (magFactor-1)*(magFactor-1) ;
1185 emline=cpl_calloc(ily,
sizeof(
float)) ;
1186 spec=cpl_calloc(ily,
sizeof(
float)) ;
1187 wave=cpl_calloc(n_lines,
sizeof(
float)) ;
1188 par=cpl_calloc(MAXPAR,
sizeof(
float)) ;
1189 derv_par=cpl_calloc(MAXPAR,
sizeof(
float)) ;
1191 a=cpl_calloc(n_fitcoeffs,
sizeof(
double)) ;
1192 z=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
double)) ;
1196 for ( col = 0 ; col < ilx ; col++ )
1199 for ( i = 0 ; i < ily ; i++ )
1204 for ( i = 0 ; i < n_fitcoeffs ; i++ )
1207 if (i < n_fitcoeffs-1)
1212 a[i] = coeffs[i][col] ;
1215 float a_initial = coeffs[0][col] ;
1217 for ( line = 0 ; line < n_lines ; line++ )
1220 wave[line] = wavelength[line]/angst ;
1226 a[0] = a_initial - wave[line] ;
1228 if(NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
1231 cpl_image_delete(wavemap) ;
1234 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, z))
1237 cpl_image_delete(wavemap) ;
1240 sinfo_gsl_poly_complex_workspace_free(w) ;
1244 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
1247 if( (z[2*i] > (-1.)*(
float) ily/2. &&
1248 z[2*i] < (
float)ily/2.) && z[2*i+1] == 0. )
1261 "column %d", line, col) ;
1266 cenpos = z[found] + (float) ily /2. ;
1271 "line %d in column %d", line, col) ;
1282 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
1283 sinfo_new_nint(cenpix) - (var-1) : 0 ;
1284 cmax = (sinfo_new_nint(cenpix) + (var-1)) < ily ?
1285 sinfo_new_nint(cenpix) + (var-1) : ily ;
1288 for ( j = cmin ; j < cmax ; j++ )
1290 emline[j] += intensity[line] *
1291 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
1300 for ( k = 0 ; k < ily ; k++ )
1307 for ( row = 0 ; row < ily ; row++ )
1310 if (!isnan(pidata[col + row*ilx]) &&
1311 (pidata[col + row*ilx] > 0.))
1313 spec[row] = pidata[col + row*ilx] ;
1321 filter_spec = sinfo_function1d_filter_lowpass(spec, ily,
1326 result = sinfo_new_xcorrel( filter_spec, ily, emline, ily,
1327 ily/2, &delta, &maxlag, &xcorr_max) ;
1329 if ( xcorr_max <= 0. )
1332 "col %d set to ZERO \n", col) ;
1333 for ( row = 0 ; row < ily ; row++ )
1335 podata[col + row*ilx] = ZERO ;
1337 sinfo_function1d_del(filter_spec) ;
1345 i = maxlag; j = i+1;
1346 while (result[j] < result[i])
1350 i = maxlag; k = i-1;
1351 while (result[k] < result[i])
1357 if ( NULL == (peak = sinfo_new_vector (width)) )
1360 sinfo_function1d_del(filter_spec) ;
1367 xdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1368 wdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1369 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
1374 for ( i = 0 ; i < width ; i++ )
1376 peak -> data[i] = result[k+i]/xcorr_max * 100. ;
1383 ndat = peak -> n_elements ;
1388 par[1] = width/2.0 ;
1389 par[2] = (float) (maxlag - k) ;
1390 par[3] = (peak -> data[0] + peak -> data[peak->n_elements - 1]) / 2.0 ;
1391 par[0] = result[maxlag]/xcorr_max * 100. - (par[3]) ;
1393 for ( i = 0 ; i < MAXPAR ; i++ )
1400 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
1402 &ndat, par, derv_par, mpar,
1403 &numpar, &tol, &its, &lab )) )
1406 "in col: %d, error no.: %d", col, iters) ;
1407 sinfo_new_destroy_vector ( peak ) ;
1411 sinfo_function1d_del(filter_spec) ;
1416 sinfo_new_destroy_vector ( peak ) ;
1420 sinfo_function1d_del(filter_spec) ;
1423 wavelag =((float)ily/2 - (
float)k - par[2]) ;
1425 if ( fabs(wavelag) > (float)ily/20. )
1428 for ( row = 0 ; row < ily ; row++ )
1430 podata[col + row*ilx] = ZERO ;
1442 centreval = a_initial ;
1443 for ( i = 1 ; i < n_fitcoeffs ; i++ )
1453 centreval += (float)sign * coeffs[i][col]*pow(wavelag, i) ;
1457 for ( row = 0 ; row < oly ; row++ )
1459 centrepix = (float)row - ((
float)oly - 1.)/2. ;
1461 for ( i = 1 ; i < n_fitcoeffs ; i++ )
1463 pixvalue += coeffs[i][col]*pow(centrepix, i) ;
1465 podata[col+row*olx] = centreval + pixvalue ;
1474 cpl_free(derv_par) ;
1508 cpl_image * sinfo_new_create_shifted_slit_wavemap2 ( cpl_image * lineIm,
1518 cpl_image * wavemap ;
1520 float * filter_spec ;
1523 float cenpos, cenpix ;
1533 float * xdat, * wdat ;
1535 int iters, xdim, ndat ;
1538 int sign, found, line, width ;
1539 int var, maxlag, cmin, cmax ;
1544 int edge[N_SLITLETS] ;
1546 float derv_par[MAXPAR] ;
1548 float* emline=NULL ;
1552 float* a0_clean=NULL ;
1555 float* sub_col_index=NULL ;
1556 float* sub_acoefs=NULL;
1557 float* sub_dacoefs=NULL ;
1561 float** bcoef=NULL ;
1562 float* wcoefs=NULL ;
1566 float * acoefsclean ;
1569 float ** ucoefs, **vcoefs, **covar ;
1570 double sum, sumq, mean ;
1572 double cliphi, cliplo ;
1575 gsl_poly_complex_workspace * w ;
1586 if ( lineIm == NULL )
1592 ilx=cpl_image_get_size_x(lineIm);
1593 ily=cpl_image_get_size_y(lineIm);
1594 pidata=cpl_image_get_data_float(lineIm);
1596 if ( coeffs == NULL )
1601 if ( n_fitcoeffs < 2 )
1603 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
1606 if ( wavelength == NULL || intensity == NULL )
1611 if ( n_lines < 1 || magFactor < 1 )
1616 var = (magFactor - 1)*(magFactor - 1) ;
1618 if ( wavelength[0] > 10000. )
1623 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
1634 bcoef=sinfo_new_2Dfloatarray(N_SLITLETS,n_fitcoeffs) ;
1635 wcoefs=cpl_calloc(n_fitcoeffs,
sizeof(
float)) ;
1637 emline=cpl_calloc(ily,
sizeof(
float)) ;
1638 spec=cpl_calloc(ily,
sizeof(
float)) ;
1639 wave=cpl_calloc(n_lines,
sizeof(
float)) ;
1640 a0=cpl_calloc(ilx,
sizeof(
float)) ;
1641 a0_clean=cpl_calloc(ilx,
sizeof(
float)) ;
1645 sub_col_index=cpl_calloc(ilx,
sizeof(
float)) ;
1646 sub_acoefs=cpl_calloc(ilx,
sizeof(
float));
1647 sub_dacoefs=cpl_calloc(ilx,
sizeof(
float)) ;
1649 a=cpl_calloc(n_fitcoeffs,
sizeof(
double)) ;
1650 z=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
double)) ;
1654 threshold = pixel_dist * fabs(dispersion) ;
1655 for ( i = PIXEL ; i < ilx - PIXEL ; )
1657 if (fabs(coeffs[0][i+1] - coeffs[0][i]) >= threshold )
1668 if ( NULL == (wavemap = cpl_image_new ( ilx, ily, CPL_TYPE_FLOAT)) )
1675 cpl_free(sub_acoefs);
1676 cpl_free(sub_dacoefs) ;
1677 cpl_free(a0_clean) ;
1678 cpl_free(sub_col_index) ;
1683 olx=cpl_image_get_size_x(wavemap);
1684 oly=cpl_image_get_size_y(wavemap);
1685 podata=cpl_image_get_data_float(wavemap);
1688 for ( col = 0 ; col < ilx ; col++ )
1691 for ( i = 0 ; i < ily ; i++ )
1696 for ( i = 0 ; i < n_fitcoeffs ; i++ )
1699 if (i < n_fitcoeffs-1)
1704 a[i] = coeffs[i][col] ;
1707 float a_initial = coeffs[0][col] ;
1709 for ( line = 0 ; line < n_lines ; line++ )
1712 wave[line] = wavelength[line]/angst ;
1718 a[0] = a_initial - wave[line] ;
1720 if (NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
1723 cpl_image_delete(wavemap) ;
1726 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, z))
1729 cpl_image_delete(wavemap) ;
1732 sinfo_gsl_poly_complex_workspace_free(w) ;
1736 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
1739 if( (z[2*i] > (-1.)*(
float) ily/2. &&
1740 z[2*i] < (
float)ily/2.) && z[2*i+1] == 0. )
1753 "line %d in column %d\n", line, col) ;
1758 cenpos = z[found] + (float) ily/2. ;
1763 "for line %d in column %d", line, col) ;
1774 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
1775 sinfo_new_nint(cenpix) - (var-1) : 0 ;
1776 cmax = (sinfo_new_nint(cenpix) + (var-1)) < ily ?
1777 sinfo_new_nint(cenpix) + (var-1) : ily ;
1780 for ( j = cmin ; j < cmax ; j++ )
1782 emline[j] += intensity[line] *
1783 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
1792 for ( k = 0 ; k < ily ; k++ )
1799 for ( row = 0 ; row < ily ; row++ )
1802 if (!isnan(pidata[col + row*ilx]) &&
1803 (pidata[col + row*ilx] > 0.))
1805 spec[row] = pidata[col + row*ilx] ;
1813 filter_spec = sinfo_function1d_filter_lowpass(spec,ily,
1818 result = sinfo_new_xcorrel( filter_spec, ily, emline, ily,
1819 ily/2, &delta, &maxlag, &xcorr_max) ;
1821 if ( xcorr_max <= 0. )
1824 "sum , col %d set to ZERO \n", col) ;
1825 for ( row = 0 ; row < ily ; row++ )
1827 podata[col + row*ilx] = ZERO ;
1829 sinfo_function1d_del(filter_spec) ;
1837 i = maxlag; j = i+1;
1838 while (result[j] < result[i])
1842 i = maxlag; k = i-1;
1843 while (result[k] < result[i])
1849 if ( NULL == (peak = sinfo_new_vector (width)) )
1852 sinfo_function1d_del(filter_spec) ;
1859 xdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1860 wdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
1861 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
1866 for ( i = 0 ; i < width ; i++ )
1868 peak -> data[i] = result[k+i]/xcorr_max * 100. ;
1875 ndat = peak -> n_elements ;
1880 par[1] = width/2.0 ;
1881 par[2] = (float) (maxlag - k) ;
1882 par[3] = (peak -> data[0] + peak -> data[peak->n_elements - 1]) / 2.0 ;
1883 par[0] = result[maxlag]/xcorr_max * 100. - (par[3]) ;
1885 for ( i = 0 ; i < MAXPAR ; i++ )
1892 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim, peak -> data,
1895 &numpar, &tol, &its, &lab )) )
1898 "failed in col: %d, error no.: %d", col, iters);
1899 sinfo_new_destroy_vector ( peak ) ;
1903 sinfo_function1d_del(filter_spec) ;
1908 sinfo_new_destroy_vector ( peak ) ;
1912 sinfo_function1d_del(filter_spec) ;
1915 wavelag =((float)ily/2 - (
float)k - par[2]) ;
1917 if ( fabs(wavelag) > (float)ily/20. )
1920 for ( row = 0 ; row < ily ; row++ )
1922 podata[col + row*ilx] = ZERO ;
1934 centreval = a_initial ;
1935 for ( i = 1 ; i < n_fitcoeffs ; i++ )
1945 centreval += (float)sign * coeffs[i][col]*pow(wavelag, i) ;
1947 a0[col] = centreval ;
1951 for ( ns = 0 ; ns < N_SLITLETS ; ns++ )
1959 else if ( ns == N_SLITLETS - 1 )
1961 ed1 = edge[N_SLITLETS - 2] ;
1971 for ( i = ed1 ; i < ed2 ; i++ )
1973 if ( isnan(a0[i]) || a0[i] == 0. )
1982 if ( NULL == (acoefsclean = (
float*) cpl_calloc(nc ,
sizeof(
float))) )
1988 for ( i = ed1 ; i < ed2 ; i++ )
1990 if ( isnan(a0[i]) || a0[i] == 0. )
1996 acoefsclean[nc] = a0[i] ;
2005 sinfo_pixel_qsort(acoefsclean, nc) ;
2011 for ( i = (
int)((
float)nc*LOW_REJECT) ;
2012 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
2014 sum += (double)acoefsclean[i] ;
2015 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
2018 mean = sum/(double)n ;
2019 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
2020 cliphi = mean + sigma * (double)3. ;
2021 cliplo = mean - sigma * (double)3. ;
2025 for ( i = ed1 ; i < ed2 ; i++ )
2028 if ( !isnan(a0[i]) && (a0[i] <= cliphi) && (a0[i] >= cliplo) &&
2031 sub_acoefs[num] = a0[i] ;
2032 sub_dacoefs[num] = 0.0000005 ;
2033 sub_col_index[num] = col_index ;
2039 offset2 = (float)(col_index-1) / 2. ;
2041 if ( ndata < n_fitcoeffs )
2044 to determine the fit coefficients.\n", ns) ;
2045 cpl_free(acoefsclean) ;
2051 ucoefs = sinfo_matrix(1, ndata, 1, n_fitcoeffs) ;
2052 vcoefs = sinfo_matrix(1, ndata, 1, n_fitcoeffs) ;
2053 covar = sinfo_matrix(1, n_fitcoeffs, 1, n_fitcoeffs) ;
2056 for ( i = 0 ; i < ndata ; i++ )
2058 sub_col_index[i] = (sub_col_index[i] - offset2) / offset2 ;
2062 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
2063 sub_dacoefs-1, ndata, bcoef[ns]-1,
2064 n_fitcoeffs, ucoefs, vcoefs, wcoefs-1,
2065 covar, &chisq, sinfo_fpol ) ;
2068 for ( i = 0 ; i < n_fitcoeffs ; i ++ )
2070 bcoef[ns][i] /= pow( offset2, i ) ;
2074 cpl_free (acoefsclean) ;
2075 sinfo_free_matrix( ucoefs, 1, 1) ;
2076 sinfo_free_matrix( vcoefs, 1, 1) ;
2077 sinfo_free_matrix( covar, 1, 1) ;
2081 for ( i = ed1 ; i < ed2 ; i++ )
2084 for ( n = 0 ; n < n_fitcoeffs ; n++ )
2086 a0_clean[i] += bcoef[ns][n] *
2087 pow((
float)col_index - offset2, n) ;
2094 for ( col = 0 ; col < ilx ; col++ )
2097 for ( row = 0 ; row < oly ; row++ )
2099 centrepix = (float)row - ((
float)oly - 1.)/2. ;
2101 for ( i = 1 ; i < n_fitcoeffs ; i++ )
2103 pixvalue += coeffs[i][col]*pow(centrepix, i) ;
2105 podata[col+row*olx] = a0_clean[col] + pixvalue ;
2114 cpl_free(a0_clean) ;
2117 cpl_free(sub_col_index) ;
2118 cpl_free(sub_acoefs);
2119 cpl_free(sub_dacoefs) ;
2124 sinfo_new_destroy_2Dfloatarray(&bcoef,n_fitcoeffs) ;
2153 cpl_image * sinfo_new_create_shifted_slit_wavemap3 ( cpl_image * lineIm,
2162 cpl_image * wavemap ;
2164 float * filter_spec ;
2167 float cenpos, cenpix ;
2169 float wavelag_mean ;
2177 float derv_par[MAXPAR] ;
2181 float * xdat, * wdat ;
2183 int iters, xdim, ndat ;
2186 int sign, found, line, width ;
2187 int var, maxlag, cmin, cmax ;
2189 float* emline=NULL ;
2191 float* wavelag=NULL ;
2196 gsl_poly_complex_workspace * w ;
2209 if ( lineIm == NULL )
2214 ilx=cpl_image_get_size_x(lineIm);
2215 ily=cpl_image_get_size_y(lineIm);
2216 pidata=cpl_image_get_data_float(lineIm);
2218 if ( coeffs == NULL )
2223 if ( n_fitcoeffs < 2 )
2225 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
2229 if ( wavelength == NULL || intensity == NULL )
2234 if ( n_lines < 1 || magFactor < 1 )
2240 var = (magFactor - 1)*(magFactor - 1) ;
2242 if ( wavelength[0] > 10000. )
2247 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
2261 if ( NULL == (wavemap = cpl_image_new ( ilx, ily,CPL_TYPE_FLOAT)) )
2266 podata=cpl_image_get_data_float(lineIm);
2270 emline=cpl_calloc(ily,
sizeof(
float)) ;
2271 spec=cpl_calloc(ily,
sizeof(
float)) ;
2272 wavelag=cpl_calloc(ilx,
sizeof(
float)) ;
2273 wave=cpl_calloc(n_lines,
sizeof(
float)) ;
2274 a=cpl_calloc(n_fitcoeffs,
sizeof(
double)) ;
2275 z=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
double)) ;
2279 for ( col = 0 ; col < ilx ; col++ )
2282 for ( i = 0 ; i < ily ; i++ )
2287 for ( i = 0 ; i < n_fitcoeffs ; i++ )
2290 if (i < n_fitcoeffs-1)
2295 a[i] = coeffs[i][col] ;
2298 a_initial = coeffs[0][col] ;
2300 for ( line = 0 ; line < n_lines ; line++ )
2303 wave[line] = wavelength[line]/angst ;
2309 a[0] = a_initial - wave[line] ;
2311 if (NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
2314 cpl_image_delete(wavemap) ;
2317 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, z))
2320 cpl_image_delete(wavemap) ;
2323 sinfo_gsl_poly_complex_workspace_free(w) ;
2327 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
2330 if( (z[2*i] > (-1.)*(
float) ily/2. &&
2331 z[2*i] < (
float)ily/2.) && z[2*i+1] == 0. )
2344 "in column %d\n", line, col) ;
2349 cenpos = z[found] + (float) ily /2. ;
2354 "line %d in column %d\n", line, col) ;
2365 cmin = (sinfo_new_nint(cenpix) - (var-1)) > 0 ?
2366 sinfo_new_nint(cenpix) - (var-1) : 0 ;
2367 cmax = (sinfo_new_nint(cenpix) + (var-1)) < ily ?
2368 sinfo_new_nint(cenpix) + (var-1) : ily ;
2371 for ( j = cmin ; j < cmax ; j++ )
2373 emline[j] += intensity[line] *
2374 exp((
double)(-0.5*(j-cenpix)*(j-cenpix))/(
double)var) ;
2383 for ( k = 0 ; k < ily ; k++ )
2390 for ( row = 0 ; row < ily ; row++ )
2393 if (!isnan(pidata[col + row*ilx]) &&
2394 (pidata[col + row*ilx] > 0.))
2396 spec[row] = pidata[col + row*ilx] ;
2404 filter_spec = sinfo_function1d_filter_lowpass(spec, ily,
2409 result = sinfo_new_xcorrel( filter_spec, ily, emline, ily,
2410 ily/2, &delta, &maxlag, &xcorr_max) ;
2412 if ( xcorr_max <= 0. )
2415 "col %d set to ZERO \n", col) ;
2416 for ( row = 0 ; row < ily ; row++ )
2418 podata[col + row*ilx] = ZERO ;
2420 sinfo_function1d_del(filter_spec) ;
2428 i = maxlag; j = i+1;
2429 while (result[j] < result[i])
2433 i = maxlag; k = i-1;
2434 while (result[k] < result[i])
2440 if ( NULL == (peak = sinfo_new_vector (width)) )
2443 sinfo_function1d_del(filter_spec) ;
2450 xdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
2451 wdat = (
float *) cpl_calloc( peak -> n_elements,
sizeof (
float) ) ;
2452 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
2457 for ( i = 0 ; i < width ; i++ )
2459 peak -> data[i] = result[k+i]/xcorr_max * 100. ;
2466 ndat = peak -> n_elements ;
2471 par[1] = width/2.0 ;
2472 par[2] = (float) (maxlag - k) ;
2473 par[3] = (peak -> data[0] + peak -> data[peak->n_elements - 1]) / 2.0 ;
2474 par[0] = result[maxlag]/xcorr_max * 100. - (par[3]) ;
2476 for ( i = 0 ; i < MAXPAR ; i++ )
2483 if ( 0 > ( iters = sinfo_new_lsqfit_c( xdat, &xdim,
2485 &ndat, par, derv_par, mpar,
2486 &numpar, &tol, &its, &lab )) )
2489 " failed in col: %d, error no.: %d\n",
2491 sinfo_new_destroy_vector ( peak ) ;
2495 sinfo_function1d_del(filter_spec) ;
2500 sinfo_new_destroy_vector ( peak ) ;
2504 sinfo_function1d_del(filter_spec) ;
2507 wavelag[col] =((float)ily/2 - (
float)k - par[2]) ;
2511 if (FLT_MAX==(wavelag_mean=sinfo_new_clean_mean(wavelag, ilx, 10., 10.)) )
2517 if ( fabs(wavelag_mean) > (
float)ily/20. )
2525 for ( col = 0 ; col < ilx ; col++ )
2534 a_initial = coeffs[0][col] ;
2535 float centreval = a_initial ;
2536 for ( i = 1 ; i < n_fitcoeffs ; i++ )
2546 centreval += (float)sign * coeffs[i][col]*pow(wavelag_mean, i) ;
2551 for ( row = 0 ; row < oly ; row++ )
2553 centrepix = (float)row - ((
float)oly - 1.)/2. ;
2555 for ( i = 1 ; i < n_fitcoeffs ; i++ )
2557 pixvalue += coeffs[i][col]*pow(centrepix, i) ;
2559 podata[col+row*olx] = centreval + pixvalue ;
2598 float sinfo_new_check_line_positions ( cpl_image * lineIm,
2604 float wave_shift=0 ;
2606 float sort_amp[100] ;
2620 float* shift_col=NULL ;
2628 if ( lineIm == NULL )
2633 lx=cpl_image_get_size_x(lineIm);
2634 ly=cpl_image_get_size_y(lineIm);
2637 if ( coeffs == NULL )
2647 if ( n_fitcoeffs < 2 )
2649 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
2653 offset = (float) (ly -1.) / 2. ;
2654 n_lines = par[0]->n_params/lx ;
2656 shift_col=cpl_calloc(lx,
sizeof(
float)) ;
2657 foundit=cpl_calloc(par[0]->n_params,
sizeof(
int)) ;
2661 for ( col = 0 ; col < lx ; col++ )
2664 for ( i = 0 ; i < par[0]->n_params ; i++ )
2666 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
2667 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. )
2670 amp[n] = par[i]->fit_par[0] ;
2671 sort_amp[n] = amp[n] ;
2675 sinfo_pixel_qsort(sort_amp, n) ;
2687 for ( j = firstj ; j < n ; j++ )
2689 for ( m = 0 ; m < n ; m++ )
2691 if ( sort_amp[j] == amp[m] )
2693 position = par[foundit[m]]->fit_par[2] ;
2694 lambda = par[foundit[m]]->wavelength ;
2696 for ( k = 0 ; k < n_fitcoeffs ; k++ )
2698 wave += coeffs[k][col]*pow(position-offset, k) ;
2700 shift += lambda - wave ;
2705 if ( l == 0 ) continue ;
2706 shift_col[col] = shift/(float)l ;
2708 wave_shift = sinfo_new_clean_mean(shift_col, lx, 10., 10.) ;
2709 sinfo_msg(
"Overall positioning error: %3.2g [um] %3.2g [pix]",
2710 wave_shift,wave_shift/fabs(gdisp1)) ;
2714 for ( lin = 0 ; lin < n_lines ; lin++ )
2716 for ( col = 0 ; col < lx ; col++ )
2718 shift_col[col] = 0. ;
2720 for ( i = 0 ; i < par[0]->n_params ; i++ )
2722 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
2723 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. &&
2724 par[i]->line == lin )
2729 if (found == -1) break ;
2731 position = par[found]->fit_par[2] ;
2732 lambda = par[found]->wavelength ;
2734 for ( k = 0 ; k < n_fitcoeffs ; k++ )
2736 wave += coeffs[k][col]*pow(position-offset, k) ;
2738 shift_col[col] = lambda - wave ;
2742 sinfo_msg(
"shift: %3.2g [um] %3.2g (pix) at: %4.3f [um]",
2743 sinfo_new_clean_mean(shift_col,lx, 10., 10.),
2744 sinfo_new_clean_mean(shift_col,lx, 10., 10.)/fabs(gdisp1),
2748 cpl_free(shift_col) ;
2783 float sinfo_new_check_correlated_line_positions ( cpl_image * lineIm,
2791 float min_amplitude,
2795 float wave_shift=0 ;
2816 float* shift_col=NULL ;
2817 float* wave_cor=NULL ;
2819 double* zroot=NULL ;
2821 gsl_poly_complex_workspace * w=NULL ;
2822 Vector * vline=NULL;
2830 if ( lineIm == NULL )
2835 lx=cpl_image_get_size_x(lineIm);
2836 ly=cpl_image_get_size_y(lineIm);
2840 if ( coeffs == NULL )
2850 if ( n_fitcoeffs < 2 )
2852 sinfo_msg_error (
" wrong number of polynomial coefficients given!\n") ;
2855 if ( wavelength == NULL || intensity == NULL )
2870 if ( min_amplitude <= 0 )
2877 if ( NULL == (vline = sinfo_new_vector (2*width + 1)) )
2883 xdat = (
float *) cpl_calloc( vline -> n_elements,
sizeof (
float) ) ;
2884 wdat = (
float *) cpl_calloc( vline -> n_elements,
sizeof (
float) ) ;
2885 mpar = (
int *) cpl_calloc( MAXPAR,
sizeof (
int) ) ;
2888 foundit=cpl_calloc(par[0]->n_params,
sizeof(
int)) ;
2889 shift_col=cpl_calloc(lx,
sizeof(
float)) ;
2890 wave_cor=cpl_calloc(n_lines,
sizeof(
float)) ;
2891 a=cpl_calloc(n_fitcoeffs,
sizeof(
float)) ;
2892 zroot=cpl_calloc(2*(n_fitcoeffs - 1),
sizeof(
float)) ;
2899 if ( wavelength[0] > 10000. )
2904 else if ( wavelength[0] > 1000. && wavelength[0] < 10000. )
2914 offset = ((float) ly -1.) / 2. ;
2917 for ( col = 10 ; col < 25 ; col++ )
2920 for ( i = 0 ; i < n_fitcoeffs ; i++ )
2923 if (i < n_fitcoeffs-1)
2928 a[i] = coeffs[i][col] ;
2930 float a_initial = a[0] ;
2933 for ( line = 0 ; line < n_lines ; line++ )
2936 wave_cor[line] = wavelength[line]/angst ;
2937 if (line > 0 && line < n_lines-1)
2939 if (fabs((wave_cor[line] - wave_cor[line-1]) /
2940 dispersion ) < 2*width ||
2941 fabs((wave_cor[line] - wave_cor[line+1]) /
2942 dispersion ) < 2*width )
2948 a[0] = a_initial - wave_cor[line] ;
2950 if (NULL==(w=sinfo_gsl_poly_complex_workspace_alloc(n_fitcoeffs)))
2955 if (-1 == sinfo_gsl_poly_complex_solve(a, n_fitcoeffs, w, zroot))
2960 sinfo_gsl_poly_complex_workspace_free(w) ;
2964 for ( i = 0 ; i < n_fitcoeffs - 1 ; i++ )
2967 if( (zroot[2*i] > (-1.)*(
float) ly/2. &&
2968 zroot[2*i] < (
float)ly/2.) && zroot[2*i+1] == 0. )
2982 "in column %d\n", line, col) ;
2987 cenpos = zroot[found] + (float)ly / 2. ; ;
2992 line %d in column %d\n", line, col) ;
3006 if ( (result = sinfo_new_line_fit ( lineIm, par[k],
3008 width, cenpos, min_amplitude, vline,
3009 mpar, xdat, wdat ) ) < 0 )
3012 "column: %d, row: %f, line: %d\n",
3013 result, col, cenpos, line) ;
3016 if ( (par[k] -> fit_par[0] <= 0.) || (par[k] -> fit_par[1] <= 0.)
3017 || (par[k] -> fit_par[2] <= 0.) )
3020 "line: %d\n", col, line) ;
3023 par[k] -> wavelength = wavelength[line] ;
3030 sinfo_new_destroy_vector(vline);
3037 for ( col = 10 ; col < 25 ; col++ )
3040 for ( i = 0 ; i < k ; i++ )
3042 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
3043 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. )
3049 if ( n == 0 ) continue ;
3053 for ( j = 0 ; j < n ; j++ )
3055 position = par[foundit[j]]->fit_par[2] ;
3056 lambda = par[foundit[j]]->wavelength ;
3057 line = par[foundit[j]]->line ;
3058 if (line > 0 && line < n_lines-1)
3060 if (fabs((wave_cor[line] - wave_cor[line-1]) /
3061 dispersion ) < 2*width ||
3062 fabs((wave_cor[line] - wave_cor[line+1]) /
3063 dispersion ) < 2*width )
3069 for ( i = 0 ; i < n_fitcoeffs ; i++ )
3071 wave += coeffs[i][col]*pow(position-offset, i) ;
3073 shift += lambda - wave ;
3076 shift_col[c] = shift/(float)z ;
3081 wave_shift = sinfo_new_clean_mean(shift_col, c, 10., 10.) ;
3082 sinfo_msg(
"overall positioning error in microns: %g", wave_shift) ;
3086 for ( line = 0 ; line < n_lines ; line++ )
3088 if (line > 0 && line < n_lines-1)
3090 if (fabs((wave_cor[line] - wave_cor[line-1]) / dispersion ) <
3092 fabs((wave_cor[line] - wave_cor[line+1]) / dispersion ) <
3100 for ( col = 10 ; col < 25 ; col++ )
3104 for ( i = 0 ; i < k ; i++ )
3106 if (par[i]->column == col && par[i]->fit_par[2] != 0. &&
3107 par[i]->fit_par[1] > 1. && par[i]->fit_par[1] < 7. &&
3108 par[i]->line == line )
3113 if (found == -1) break ;
3115 position = par[found]->fit_par[2] ;
3116 lambda = par[found]->wavelength ;
3118 for ( i = 0 ; i < n_fitcoeffs ; i++ )
3120 wave += coeffs[i][col]*pow(position-offset, i) ;
3122 shift_col[c] = lambda - wave ;
3125 if (found != -1 && c > 0 )
3127 sinfo_msg(
"shift in microns: %g at wavelength: %f\n",
3128 sinfo_new_clean_mean(shift_col, c, 20., 20.), lambda) ;
3135 cpl_free(shift_col) ;
3136 cpl_free(wave_cor) ;
3170 sinfo_new_spred_coeffs_cross_slit_fit (
int n_columns,
3178 float ** sinfo_slit_pos )
3183 float ** ucoefs, **vcoefs, **covar ;
3184 float * acoefsclean ;
3185 double sum, sumq, mean ;
3187 double cliphi, cliplo ;
3192 float* sub_col_index=NULL ;
3193 float* sub_acoefs=NULL;
3194 float* sub_dacoefs=NULL ;
3195 float* wcoefs=NULL ;
3199 int i, n, num, ndata ;
3205 if ( n_columns < 1 )
3210 if ( acoefs == NULL || dacoefs == NULL )
3220 if ( sigma_factor <= 0. )
3225 if ( dispersion == 0. )
3232 edge=cpl_calloc(bco->n_slitlets,
sizeof(
int)) ;
3233 sub_col_index=cpl_calloc(n_columns,
sizeof(
float)) ;
3234 sub_acoefs=cpl_calloc(n_columns,
sizeof(
float));
3235 sub_dacoefs=cpl_calloc(n_columns,
sizeof(
float)) ;
3237 wcoefs=cpl_calloc(bco->n_bcoeffs,
sizeof(
float)) ;
3245 threshold = pixel_dist * fabs(dispersion) ;
3246 sinfo_slit_pos[0][0]=0 ;
3249 for ( i = 0 ; i < n_columns - PIXEL ; )
3251 if ( !isnan(acoefs[0][i+1]) &&
3252 acoefs[0][i+1] != 0. &&
3254 && dacoefs[0][i+1] != 0.)
3256 if ( isnan(acoefs[0][i]) || acoefs[0][i] == 0. )
3258 if (fabs(acoefs[0][i+1] - acoefs[0][i-1]) >= threshold )
3262 sinfo_slit_pos[sl_index][1] = i ;
3263 sinfo_slit_pos[sl_index+1][0] = i + 1 ;
3272 if (fabs(acoefs[0][i+1] - acoefs[0][i]) >= threshold )
3276 sinfo_slit_pos[sl_index][1] = i ;
3277 sinfo_slit_pos[sl_index+1][0] = i + 1 ;
3288 if( ( (i-last_i) > 63 ) &&
3289 ( isnan(fabs(acoefs[0][i+1] - acoefs[0][i])) ||
3290 isnan(fabs(acoefs[0][i+1] - acoefs[0][i-1])) ) )
3293 sinfo_slit_pos[sl_index][1] = i ;
3294 sinfo_slit_pos[sl_index+1][0] = i + 1 ;
3306 sinfo_slit_pos[sl_index][1] = 2047;
3308 if ( n != bco->n_slitlets - 1 )
3311 "slitlets, found: %d\n",n+1) ;
3316 for ( loc_index = 0 ; loc_index < bco->n_acoeffs ; loc_index++ )
3319 for ( ns = 0 ; ns < bco->n_slitlets ; ns++ )
3327 else if ( ns == bco->n_slitlets - 1 )
3329 ed1 = edge[bco->n_slitlets - 2] ;
3339 for ( i = ed1 ; i < ed2 ; i++ )
3341 if ( isnan(acoefs[loc_index][i]) ||
3342 acoefs[loc_index][i] == 0. ||
3343 dacoefs[loc_index][i] == 0. )
3352 if (NULL==(acoefsclean=(
float*) cpl_calloc(nc ,
sizeof(
float))) )
3358 for ( i = ed1 ; i < ed2 ; i++ )
3360 if ( isnan(acoefs[loc_index][i]) ||
3361 acoefs[loc_index][i] == 0. ||
3362 dacoefs[loc_index][i] == 0. )
3368 acoefsclean[nc] = acoefs[loc_index][i] ;
3377 sinfo_pixel_qsort(acoefsclean, nc) ;
3384 for ( i = (
int)((
float)nc*LOW_REJECT) ;
3385 i < (int)((
float)nc*HIGH_REJECT) ; i++ )
3387 sum += (double)acoefsclean[i] ;
3388 sumq += ((double)acoefsclean[i] * (
double)acoefsclean[i]) ;
3391 mean = sum/(double)n ;
3392 sigma = sqrt( sumq/(
double)n - (mean * mean) ) ;
3393 cliphi = mean + sigma * (double)sigma_factor ;
3394 cliplo = mean - sigma * (double)sigma_factor ;
3398 for ( i = ed1 ; i < ed2 ; i++ )
3401 if ( !isnan(acoefs[loc_index][i]) &&
3402 (acoefs[loc_index][i] <= cliphi) &&
3403 (acoefs[loc_index][i] >= cliplo) &&
3404 (dacoefs[loc_index][i] != 0. ) &&
3405 (acoefs[loc_index][i] != 0.) )
3407 sub_acoefs[num] = acoefs[loc_index][i] ;
3408 sub_dacoefs[num] = dacoefs[loc_index][i] ;
3409 sub_col_index[num] = col_index ;
3415 offset = (float)(col_index-1) / 2. ;
3417 if ( ndata < bco->n_bcoeffs )
3420 " to determine the fit coefficients.\n", ns) ;
3421 cpl_free(acoefsclean) ;
3426 ucoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
3427 vcoefs = sinfo_matrix(1, ndata, 1, bco->n_bcoeffs) ;
3428 covar = sinfo_matrix(1, bco->n_bcoeffs, 1, bco->n_bcoeffs) ;
3431 for ( i = 0 ; i < ndata ; i++ )
3433 sub_col_index[i] = (sub_col_index[i] - offset) / offset ;
3437 sinfo_svd_fitting ( sub_col_index-1, sub_acoefs-1,
3438 sub_dacoefs-1, ndata, bco[ns].b[loc_index]-1,
3439 bco->n_bcoeffs, ucoefs, vcoefs, wcoefs-1,
3440 covar, &chisq[ns], sinfo_fpol ) ;
3443 for ( i = 0 ; i < bco->n_bcoeffs ; i ++ )
3445 bco[ns].b[loc_index][i] /= pow( offset, i ) ;
3449 cpl_free (acoefsclean) ;
3450 sinfo_free_matrix( ucoefs, 1, 1) ;
3451 sinfo_free_matrix( vcoefs, 1, 1) ;
3452 sinfo_free_matrix( covar, 1,
3457 for ( i = ed1 ; i < ed2 ; i++ )
3459 acoefs[loc_index][i] = 0. ;
3460 for ( n = 0 ; n < bco->n_bcoeffs ; n++ )
3462 acoefs[loc_index][i] += bco[ns].b[loc_index][n] *
3463 pow(col_index - offset, n) ;
3473 cpl_free(sub_col_index) ;
3474 cpl_free(sub_acoefs);
3475 cpl_free(sub_dacoefs) ;
3530 cpl_image * sinfo_new_spred_wave_cal( cpl_image * image,
3535 float ** wavelength_clean,
3536 int * n_found_lines,
3546 float pixel_tolerance,
3547 float ** sinfo_slit_pos)
3559 float * chisq_cross ;
3563 cpl_image * wavemap ;
3569 if ( NULL == image )
3574 ilx=cpl_image_get_size_x(image);
3575 ily=cpl_image_get_size_y(image);
3588 if ( n_slitlets <= 0 )
3593 if ( row_clean == NULL )
3598 if ( wavelength_clean == NULL )
3604 if ( dispersion == 0. )
3610 if ( halfWidth <= 0 || halfWidth > ily/2 )
3612 sinfo_msg_error(
" impossible half width of the fitting box given\n") ;
3615 if ( minAmplitude < 1. )
3621 if ( max_residual <= 0. || max_residual > 1. )
3626 if ( fwhm <= 0. || fwhm > 10. )
3632 if ( n_a_fitcoefs <= 0 || n_a_fitcoefs > 9 )
3638 if ( n_b_fitcoefs <= 0 || n_b_fitcoefs > 9 )
3643 if ( sigmaFactor <= 0. )
3655 if ( 0 > (n_fit = sinfo_new_fit_lines( image , par, fwhm, n_found_lines,
3656 row_clean, wavelength_clean,
3657 halfWidth, minAmplitude )) )
3660 "sinfo_fitLines: %d", n_fit) ;
3665 if ( -1 == sinfo_new_check_for_fake_lines (par,
3674 " sinfo_fitLines: %d\n", n_fit) ;
3680 if (NULL==(acoefs = (
float*) cpl_calloc (n_a_fitcoefs,
sizeof(
float))) ||
3681 NULL==(dacoefs = (
float*) cpl_calloc (n_a_fitcoefs,
sizeof(
float))) ||
3682 NULL==(dabuf = (
float**) cpl_calloc (n_a_fitcoefs,
sizeof(
float*))) ||
3683 NULL==(chisq_cross = (
float*) cpl_calloc(n_slitlets,
sizeof(
float))) )
3688 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3690 if ( NULL == (dabuf[i] = (
float*) cpl_calloc(ilx,
sizeof(
float))) )
3693 cpl_free ( acoefs ) ;
3694 cpl_free ( dacoefs ) ;
3695 cpl_free ( chisq_cross ) ;
3703 for ( i = 0 ; i < ilx ; i++ )
3707 if ( FLT_MAX == (chisq_poly = sinfo_new_polyfit( par, i,
3710 max_residual, acoefs,
3715 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
3722 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
3725 if ( acoefs[0] <= 0. || acoefs[1] ==0. ||
3726 dacoefs[j] == 0. || isnan(acoefs[j]) )
3731 for ( j = 0 ; j < n_a_fitcoefs ; j++ )
3735 abuf[j][i] = acoefs[j] ;
3736 dabuf[j][i] = dacoefs[j] ;
3741 dabuf[j][i] = ZERO ;
3747 if ( NULL == ( bco = sinfo_new_b_coeffs( n_slitlets,
3748 n_a_fitcoefs, n_b_fitcoefs)) )
3751 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3753 cpl_free (dabuf[i]) ;
3756 cpl_free ( acoefs ) ;
3757 cpl_free ( dacoefs ) ;
3758 cpl_free ( chisq_cross ) ;
3763 if ( -1 == ( crossInd = sinfo_new_spred_coeffs_cross_slit_fit( ilx, abuf,
3772 "coefficients across the columns\n") ;
3773 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3775 cpl_free (dabuf[i]) ;
3779 cpl_free ( acoefs ) ;
3780 cpl_free ( dacoefs ) ;
3781 sinfo_new_destroy_b_coeffs(bco) ;
3782 cpl_free ( chisq_cross ) ;
3786 if ( NULL == (wavemap = sinfo_new_wave_map_slit (abuf, n_a_fitcoefs,
3790 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3792 cpl_free (dabuf[i]) ;
3796 cpl_free ( acoefs ) ;
3797 cpl_free ( dacoefs ) ;
3798 sinfo_new_destroy_b_coeffs(bco) ;
3799 cpl_free ( chisq_cross ) ;
3804 for ( i = 0 ; i < n_a_fitcoefs ; i++ )
3806 cpl_free (dabuf[i]) ;
3809 cpl_free ( acoefs ) ;
3810 cpl_free ( dacoefs ) ;
3811 sinfo_new_destroy_b_coeffs(bco) ;
3812 cpl_free ( chisq_cross ) ;
#define sinfo_msg_debug(...)
Print a debug message.
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.