188 #define POSIX_SOURCE 1
189 #include "sinfo_vltPort.h"
198 #include "sinfo_pfits.h"
199 #include "sinfo_spectrum_ops.h"
200 #include "sinfo_resampling.h"
201 #include "sinfo_utilities.h"
202 #include "sinfo_utils_wrappers.h"
224 int sinfo_stectrum_ima2table(
225 const cpl_image* spc,
226 const char* filename,
229 const float* pidata=NULL;
241 cpl_propertylist* plist=NULL;
248 pidata = cpl_image_get_data_const(spc);
249 nx=cpl_image_get_size_x(spc);
250 ny=cpl_image_get_size_y(spc);
252 if((nx == 0) || (ny == 0)) {
256 if((nx > 1) && (ny > 1)) {
263 *tbl = cpl_table_new(nraw);
264 cpl_table_new_column(*tbl,
"WAVE",CPL_TYPE_DOUBLE);
265 cpl_table_new_column(*tbl,
"INT",CPL_TYPE_DOUBLE);
268 if ((cpl_error_code)((plist = cpl_propertylist_load(filename, 0)) == NULL)) {
270 cpl_propertylist_delete(plist) ;
276 step=sinfo_pfits_get_cdelt1(plist);
277 wc=sinfo_pfits_get_crval1(plist);
280 step=sinfo_pfits_get_cdelt2(plist);
281 wc=sinfo_pfits_get_crval2(plist);
287 sinfo_msg(
"ws=%f we=%f step=%f",ws,we,step);
288 cpl_table_set_double(*tbl,
"WAVE",0,wav);
289 cpl_table_set_double(*tbl,
"INT",0,pidata[i]);
291 for(i=1;i<nraw;i++) {
293 amp=(double)pidata[i];
294 cpl_table_set_double(*tbl,
"WAVE",i,wav);
295 cpl_table_set_double(*tbl,
"INT",i,amp);
297 cpl_propertylist_delete(plist);
314 Vector * sinfo_new_vector( ulong32 n_elements )
316 Vector * local_new_vector ;
318 if ( n_elements <= 0 )
325 local_new_vector = (Vector *) cpl_malloc (
sizeof (Vector)) ;
326 local_new_vector -> n_elements = n_elements ;
327 local_new_vector -> data = (pixelvalue *) cpl_calloc (n_elements,
328 sizeof (pixelvalue)) ;
330 return local_new_vector ;
340 void sinfo_free_svector( Vector **svector )
342 if ( *svector != NULL )
345 if((*svector) -> data != NULL) {
346 cpl_free ( (*svector) -> data ) ;
347 (*svector)->data = NULL;
349 cpl_free ( *svector ) ;
362 void sinfo_new_destroy_vector( Vector *sinfo_vector )
364 if ( sinfo_vector == NULL )
370 cpl_free ( sinfo_vector -> data ) ;
371 cpl_free ( sinfo_vector ) ;
382 cpl_image * sinfo_new_vector_to_image( Vector * spectrum )
384 cpl_image * returnIm ;
390 if ( spectrum == NULL )
397 if ( NULL == (returnIm = cpl_image_new(1, spectrum->n_elements,
401 sinfo_new_destroy_vector(spectrum) ;
405 podata=cpl_image_get_data_float(returnIm);
406 for ( i = 0 ; i < spectrum->n_elements ; i++ )
408 podata[i] = spectrum -> data[i] ;
411 sinfo_new_destroy_vector (spectrum) ;
423 Vector * sinfo_new_image_to_vector( cpl_image * spectrum )
425 Vector * returnVector ;
432 if ( spectrum == NULL )
437 ilx=cpl_image_get_size_x(spectrum);
438 ily=cpl_image_get_size_y(spectrum);
441 if ( NULL == (returnVector = sinfo_new_vector(ilx*ily)) )
444 cpl_image_delete(spectrum) ;
448 pidata=cpl_image_get_data_float(spectrum);
449 for ( i = 0 ; i < (int) ilx*ily ; i++ )
451 returnVector -> data[i] = pidata[i] ;
454 cpl_image_delete (spectrum) ;
455 return returnVector ;
471 sinfo_new_extract_spectrum_from_resampled_flat( cpl_image * resflat,
487 if ( resflat == NULL )
492 ilx=cpl_image_get_size_x(resflat);
493 ily=cpl_image_get_size_y(resflat);
496 if ( NullVector == (spectrum = sinfo_new_vector(ily) ) )
502 array=cpl_calloc(ily,
sizeof(
float)) ;
504 pidata=cpl_image_get_data_float(resflat);
505 for ( row = 0 ; row < ily ; row++ )
508 for ( col = 0 ; col < ilx ; col++ )
510 if ( !isnan(pidata[col + row*ilx]) )
512 array[n] = pidata[col+row*ilx] ;
523 if ( FLT_MAX == (cleanMean = sinfo_new_clean_mean(array, n,
528 sinfo_new_destroy_vector(spectrum) ;
532 spectrum->data[row] = cleanMean ;
534 if ( NULL == ( retIm = sinfo_new_vector_to_image( spectrum ) ) )
537 sinfo_new_destroy_vector(spectrum) ;
559 sinfo_new_multiply_image_with_spectrum( cpl_image * image,
560 cpl_image * spectrum )
563 cpl_image * retImage ;
581 ilx=cpl_image_get_size_x(image);
582 ily=cpl_image_get_size_y(image);
584 if ( spectrum == NULL )
590 sly=cpl_image_get_size_y(spectrum);
598 if ( NULL == (retImage = cpl_image_duplicate(image)) )
604 pidata=cpl_image_get_data_float(image);
605 psdata=cpl_image_get_data_float(spectrum);
606 podata=cpl_image_get_data_float(retImage);
608 for ( col = 0 ; col < ilx ; col++ )
610 for ( row = 0 ; row < ily ; row++ )
612 if ( !isnan(pidata[col+row*ilx]) &&
613 !isnan(psdata[col+row*ilx]))
615 podata[col+row*ilx] = pidata[col+row*ilx] * psdata[row] ;
661 cpl_image * sinfo_new_optimal_extraction_from_cube( cpl_imagelist * cube,
672 cpl_table** spectrum,
677 cpl_image * averagedIm ;
683 double gderv_par[7] ;
688 double** weight=NULL ;
689 double** sinfo_psf=NULL ;
699 int first_col, last_col ;
700 int first_row, last_row ;
706 float dispersion = 0;
708 float lambda_start=0;
717 cpl_propertylist* plist=NULL;
718 cpl_image* i_img=NULL;
731 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
732 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
733 inp=cpl_imagelist_get_size(cube);
735 if ( llx < 0 || llx + 2*halfbox_x >= ilx ||
736 lly < 0 || lly + 2*halfbox_y >= ily )
738 sinfo_msg(
"llx=%d, lly=%d, llx + 2*halfbox_x=%d, "
739 "lly + 2*halfbox_y=%d",
740 llx,lly,llx + 2*halfbox_x,lly + 2*halfbox_y);
741 sinfo_msg(
"tresh_min_x=%d, tresh_min_y=%d, "
742 "tresh_max_x=%d, tresh_max_y=%d",0,0,ilx,ily);
746 if ( halfbox_x <= 0 || halfbox_y <= 0 ||
747 2*halfbox_x > ilx || 2*halfbox_y > ily )
752 if ( fwhm_factor <= 0. )
757 if ( backvariance < 0. )
762 if ( exptime <= 0. || exptime == FLAG )
769 if ( NULL == (retIm = cpl_image_new(1, inp,CPL_TYPE_FLOAT)) )
776 if ( NULL == (averagedIm = sinfo_new_average_cube_to_image(cube)) )
779 cpl_image_delete(retIm) ;
784 for ( i = 0 ; i < 7 ; i++ )
789 if ( -1 == (fitInd = sinfo_new_fit_2d_gaussian(averagedIm,
800 cpl_image_delete(retIm) ;
801 cpl_image_delete(averagedIm) ;
806 sinfo_psf=sinfo_new_2Ddoublearray(ilx,ily) ;
808 for ( row = 0 ; row < ily ; row++ )
810 for ( col = 0 ; col < ilx ; col++ )
812 xdat[0] = (double) col ;
813 xdat[1] = (double) row ;
814 sinfo_psf[col][row] = sinfo_new_gaussian_ellipse(xdat,fit_par) -
816 sum += sinfo_psf[col][row] ;
825 weight=sinfo_new_2Ddoublearray(ilx,ily) ;
827 padata=cpl_image_get_data_float(averagedIm);
828 for ( row = 0 ; row < ily ; row++ )
830 for ( col = 0 ; col < ilx ; col++ )
832 sinfo_psf[col][row] /= sum ;
833 sum_psf += sinfo_psf[col][row];
834 if ( !isnan(padata[col+row*ilx]) )
840 variance = padata[col+row*ilx] / gain ;
845 weight[col][row] = 0. ;
849 weight[col][row] = 0. ;
854 weight[col][row] = sinfo_psf[col][row]/variance ;
856 norm += weight[col][row] * weight[col][row] * variance ;
864 for ( row = 0 ; row < ily ; row++ )
866 for ( col = 0 ; col < ilx ; col++ )
868 weight[col][row] /= norm;
869 sum_wgt += weight[col][row]*sinfo_psf[col][row];
873 cpl_image_delete(averagedIm) ;
877 cpl_image_delete(retIm) ;
890 if(fabs(fit_par[6]) > PI_NUMB/4) {
893 first_col = (int) (fit_par[0] -
894 fwhm_factor*fit_par[4]*cos((
double)fit_par[6])) ;
895 first_col = (first_col > 2 ) ? first_col : 2;
897 last_col = (int) (fit_par[0] +
898 fwhm_factor*fit_par[4]*cos((
double)fit_par[6])) ;
899 last_col = (last_col < 63 ) ? last_col : 63;
901 first_row = (int) (fit_par[1] -
902 fwhm_factor*fit_par[5]*cos((
double)fit_par[6])) ;
903 first_row = (first_row > 2 ) ? first_row : 2;
904 last_row = (int) (fit_par[1] +
905 fwhm_factor*fit_par[5]*cos((
double)fit_par[6])) ;
906 last_row = (last_row < 63 ) ? last_row : 63;
909 if(first_col > last_col) {
915 if(first_row > last_row) {
920 if(abs(first_col- last_col) < 1) {
924 if(abs(first_row- last_row) < 1) {
929 if ( first_col < 0 || first_row < 0 || last_col >= ilx || last_row >= ily )
932 cpl_image_delete(retIm) ;
937 cpl_table_new_column(*spectrum,
"wavelength", CPL_TYPE_FLOAT);
939 cpl_table_new_column(*spectrum,
"counts_tot" , CPL_TYPE_FLOAT);
940 cpl_table_new_column(*spectrum,
"counts_bkg" , CPL_TYPE_FLOAT);
941 cpl_table_new_column(*spectrum,
"bkg_tot" , CPL_TYPE_FLOAT);
944 cpl_table_new_column(*spectrum,
"AMP" , CPL_TYPE_FLOAT);
945 cpl_table_new_column(*spectrum,
"XC" , CPL_TYPE_FLOAT);
946 cpl_table_new_column(*spectrum,
"YC" , CPL_TYPE_FLOAT);
947 cpl_table_new_column(*spectrum,
"BKG" , CPL_TYPE_FLOAT);
948 cpl_table_new_column(*spectrum,
"FWHMX" , CPL_TYPE_FLOAT);
949 cpl_table_new_column(*spectrum,
"FWHMY" , CPL_TYPE_FLOAT);
950 cpl_table_new_column(*spectrum,
"ANGLE" , CPL_TYPE_FLOAT);
952 plist=cpl_propertylist_load(name,0);
953 cenpix = sinfo_pfits_get_crpix3(plist);
954 cenLambda = sinfo_pfits_get_crval3(plist);
955 dispersion = sinfo_pfits_get_cdelt3(plist);
956 cpl_propertylist_delete(plist);
957 lambda_start=cenLambda-cenpix*dispersion;
960 first_row, last_row, first_col, last_col);
962 podata=cpl_image_get_data_float(retIm);
963 for ( z = 0 ; z < inp ; z++ )
965 i_img=cpl_imagelist_get(cube,z);
966 pidata=cpl_image_get_data_float(i_img);
974 sinfo_new_fit_2d_gaussian(i_img,gfit_par,
975 gderv_par,gmpar,llx,lly,
976 halfbox_x,halfbox_y,check2);
979 for ( row = first_row ; row <= last_row ; row++ )
981 for ( col = first_col ; col < last_col ; col++ )
983 if ( !isnan(pidata[col+row*ilx]) )
986 weighted_sum += weight[col][row] * (pidata[col+row*ilx] -
989 counts_bkg += (pidata[col+row*ilx] - fit_par[3]);
990 counts_tot += (pidata[col+row*ilx]);
991 bkg_tot += fit_par[3];
997 if (weighted_sum == 0.)
999 weighted_sum = ZERO ;
1014 podata[z] = weighted_sum ;
1015 lambda=lambda_start+z*dispersion;
1016 cpl_table_set_float(*spectrum,
"wavelength" ,z,lambda);
1018 cpl_table_set_float(*spectrum,
"counts_tot" ,z,counts_tot);
1019 cpl_table_set_float(*spectrum,
"counts_bkg" ,z,counts_bkg);
1020 cpl_table_set_float(*spectrum,
"bkg_tot" ,z,bkg_tot);
1022 lambda,counts_tot,counts_bkg,bkg_tot);
1024 cpl_table_set_float(*spectrum,
"AMP" ,z,gfit_par[0]);
1025 cpl_table_set_float(*spectrum,
"XC" ,z,gfit_par[1]);
1026 cpl_table_set_float(*spectrum,
"YC" ,z,gfit_par[2]);
1027 cpl_table_set_float(*spectrum,
"BKG" ,z,gfit_par[3]);
1028 cpl_table_set_float(*spectrum,
"FWHMX" ,z,gfit_par[4]);
1029 cpl_table_set_float(*spectrum,
"FWHMY" ,z,gfit_par[5]);
1030 cpl_table_set_float(*spectrum,
"ANGLE" ,z,gfit_par[6]);
1035 sinfo_new_destroy_2Ddoublearray(&sinfo_psf,ilx) ;
1036 sinfo_new_destroy_2Ddoublearray(&weight,ilx) ;
1064 Vector * sinfo_new_extract_sky_from_cube( cpl_imagelist * cube,
1075 int x_low , x_high ;
1076 int y_low , y_high ;
1078 float * to_average ;
1085 cpl_image* i_img=NULL;
1088 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
1089 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
1090 inp=cpl_imagelist_get_size(cube);
1097 if ( loReject < 0. || hiReject < 0. || loReject + hiReject >= 90. )
1099 sinfo_msg_error(
"wrong or unrealistic loReject and hiReject values!") ;
1102 if ( position == NULL)
1107 if ( position[0] < 0 || position[1] < 0 ||
1108 position[0] > ilx || position[1] > ily )
1113 if ( tolerance < 0 || tolerance >= ilx )
1118 if ( posindicator == 0 )
1125 switch(posindicator)
1129 x_low = position[0] + tolerance ;
1132 y_high = position[1] - tolerance ;
1136 x_low = position[0] + tolerance ;
1138 y_low = position[1] + tolerance ;
1144 x_high = position[0] - tolerance ;
1145 y_low = position [1] + tolerance ;
1153 if ( x_low >= ilx || x_high < 1 || y_low >= ily || y_high < 1 )
1158 if ( x_high - x_low != y_high - y_low )
1166 n_sky = (x_high - x_low) * (x_high - x_low - 1) / 2 ;
1178 if ( NullVector == (spectrum = sinfo_new_vector(inp)) )
1185 for ( z = 0 ; z < inp ; z++ )
1187 i_img=cpl_imagelist_get(cube,z);
1188 pidata=cpl_image_get_data_float(i_img);
1190 if (NULL == (to_average = (
float*) cpl_calloc(n_sky,
sizeof (
float))))
1193 sinfo_new_destroy_vector(spectrum) ;
1197 switch(posindicator)
1202 for ( y = y_low ; y < y_high - 1 ; y++ )
1205 for ( x = lo_x ; x < x_high ; x++ )
1207 to_average[n] = pidata[x+y*ilx] ;
1215 for ( y = y_low ; y < y_high - 1 ; y++ )
1218 for ( x = x_low ; x < hi_x ; x++ )
1220 to_average[n] = pidata[x+y*ilx] ;
1228 for ( y = y_low+1 ; y < y_high ; y++ )
1231 for ( x = lo_x ; x < x_high ; x++ )
1233 to_average[n] = pidata[x+y*ilx] ;
1241 for ( y = y_low+1 ; y < y_high ; y++ )
1244 for ( x = x_low ; x < hi_x ; x++ )
1246 to_average[n] = pidata[x+y*ilx] ;
1259 "not equal number of computed sky pixels!") ;
1263 cleanMean = sinfo_new_clean_mean (to_average, n, loReject, hiReject) ;
1264 if (cleanMean == FLT_MAX)
1267 sinfo_new_destroy_vector(spectrum) ;
1268 cpl_free(to_average) ;
1271 spectrum->data[z] = cleanMean ;
1272 cpl_free (to_average) ;
1291 Vector * sinfo_new_sum_rectangle_of_cube_spectra( cpl_imagelist * cube,
1298 pixelvalue *local_rectangle ;
1305 cpl_image* i_img=NULL;
1308 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
1309 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
1310 inp=cpl_imagelist_get_size(cube);
1312 if ( cube == NULL || inp < 1 )
1318 if ((llx<0) || (llx>=ilx) ||
1319 (urx<0) || (urx>=ilx) ||
1320 (lly<0) || (lly>=ily) ||
1321 (ury<0) || (ury>=ily) ||
1322 (llx>=urx) || (lly>=ury))
1326 llx, lly, urx, ury) ;
1330 recsize = (urx - llx + 1) * (ury - lly + 1) ;
1333 if (NULL == (sum = sinfo_new_vector (inp)) )
1343 for ( i = 0 ; i < inp ; i++ )
1345 i_img=cpl_imagelist_get(cube,i);
1346 pidata=cpl_image_get_data_float(i_img);
1348 local_rectangle = (pixelvalue *) cpl_calloc (recsize,
1349 sizeof (pixelvalue*));
1351 for ( j = lly ; j <= ury ; j++ )
1353 for ( k = llx ; k <= urx ; k++ )
1355 local_rectangle[m] = pidata[k + j * ilx] ;
1359 for ( l = 0 ; l < recsize ; l++ )
1361 if ( isnan(local_rectangle[l]) )
1365 sum -> data[i] += local_rectangle[l] ;
1367 cpl_free ( local_rectangle ) ;
1383 Vector * sinfo_new_sum_circle_of_cube_spectra( cpl_imagelist * cube,
1389 pixelvalue * circle ;
1390 int i, j, k, l, m, n ;
1396 cpl_image* i_img=NULL;
1399 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
1400 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
1401 inp=cpl_imagelist_get_size(cube);
1403 if ( cube == NULL || inp < 1 )
1409 if ((centerx+radius>=ilx) ||
1410 (centery+radius>=ily) ||
1411 (centerx-radius<0) ||
1419 for ( j = centery - radius ; j <= centery + radius ; j++ )
1421 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
1423 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
1438 if (NULL == (sum = sinfo_new_vector (inp)) )
1448 for ( i = 0 ; i < inp ; i++ )
1450 i_img=cpl_imagelist_get(cube,i);
1451 pidata=cpl_image_get_data_float(i_img);
1453 circle = (pixelvalue *) cpl_calloc (circsize,
sizeof (pixelvalue*));
1455 for ( j = centery - radius ; j <= centery + radius ; j++ )
1457 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
1459 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
1462 circle[m] = pidata[k + j * ilx] ;
1468 for ( l = 0 ; l < circsize ; l++ )
1470 if ( isnan(circle[l]) )
1474 sum -> data[i] += circle[l] ;
1494 Vector * sinfo_new_mean_rectangle_of_cube_spectra( cpl_imagelist * cube,
1501 pixelvalue *local_rectangle ;
1508 cpl_image* i_img=NULL;
1511 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
1512 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
1513 inp=cpl_imagelist_get_size(cube);
1515 if ( cube == NULL || inp < 1 )
1521 if ((llx<0) || (llx>=ilx) ||
1522 (urx<0) || (urx>=ilx) ||
1523 (lly<0) || (lly>=ily) ||
1524 (ury<0) || (ury>=ily) ||
1525 (llx>=urx) || (lly>=ury))
1529 llx, lly, urx, ury) ;
1533 recsize = (urx - llx + 1) * (ury - lly + 1) ;
1536 if (NULL == (mean = sinfo_new_vector (inp)) )
1546 for ( i = 0 ; i < inp ; i++ )
1548 i_img=cpl_imagelist_get(cube,i);
1549 pidata=cpl_image_get_data_float(i_img);
1551 local_rectangle = (pixelvalue *) cpl_calloc (recsize,
1552 sizeof (pixelvalue*));
1554 for ( j = lly ; j <= ury ; j++ )
1556 for ( k = llx ; k <= urx ; k++ )
1558 local_rectangle[m] = pidata[k + j * ilx] ;
1563 for ( l = 0 ; l < recsize ; l++ )
1565 if ( isnan(local_rectangle[l]) )
1569 mean -> data[i] += local_rectangle[l] ;
1574 mean -> data[i] = ZERO ;
1578 mean -> data[i] /= nv ;
1580 cpl_free ( local_rectangle ) ;
1597 sinfo_new_mean_circle_of_cube_spectra( cpl_imagelist * cube,
1603 pixelvalue * circle ;
1604 int i, j, k, l, m, n ;
1610 cpl_image* i_img=NULL;
1613 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
1614 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
1615 inp=cpl_imagelist_get_size(cube);
1617 if ( cube == NULL || inp < 1 )
1623 if ((centerx+radius>=ilx) ||
1624 (centery+radius>=ily) ||
1625 (centerx-radius<0) ||
1633 for ( j = centery - radius ; j <= centery + radius ; j++ )
1635 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
1637 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
1652 if (NULL == (mean = sinfo_new_vector (inp)) )
1662 for ( i = 0 ; i < inp ; i++ )
1664 i_img=cpl_imagelist_get(cube,i);
1665 pidata=cpl_image_get_data_float(i_img);
1667 circle = (pixelvalue *) cpl_calloc (circsize,
sizeof (pixelvalue*));
1669 for ( j = centery - radius ; j <= centery + radius ; j++ )
1671 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
1673 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
1676 circle[m] = pidata[k + j * ilx] ;
1683 for ( l = 0 ; l < circsize ; l++ )
1685 if ( isnan(circle[l]) )
1689 mean -> data[i] += circle[l] ;
1694 mean -> data[i] = ZERO ;
1698 mean -> data[i] /= nv ;
1715 Vector * sinfo_new_blackbody_spectrum(
char * templateSpec,
double temp )
1722 double firstLambda ;
1728 cpl_propertylist* plist=NULL;
1730 if ( NULL == templateSpec )
1741 if ((cpl_error_code)((plist=cpl_propertylist_load(templateSpec,0))==NULL)){
1743 cpl_propertylist_delete(plist) ;
1748 cenpix = sinfo_pfits_get_crpix2(plist);
1749 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1751 sinfo_free_propertylist(&plist) ;
1755 cenLambda = sinfo_pfits_get_crval2(plist);
1756 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1758 sinfo_free_propertylist(&plist) ;
1761 disp = sinfo_pfits_get_cdelt2(plist);
1762 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1764 sinfo_free_propertylist(&plist) ;
1767 npix = sinfo_pfits_get_naxis2(plist);
1768 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1770 sinfo_free_propertylist(&plist) ;
1773 sinfo_free_propertylist(&plist) ;
1776 if (NULL == (retSpec = sinfo_new_vector (npix)))
1785 firstLambda = cenLambda - cenpix * disp ;
1786 for ( n = 0 ; n < npix ; n++ )
1788 lambda = firstLambda + disp * (double)n ;
1796 denom = 1./(expm1(PLANCK*SPEED_OF_LIGHT/(lambda*BOLTZMANN*temp))) ;
1797 intens = 2.*PI_NUMB*PLANCK*SPEED_OF_LIGHT*SPEED_OF_LIGHT /
1798 pow(lambda, 5) * denom ;
1799 retSpec->data[n] = intens ;
1801 norm = retSpec->data[npix/2] ;
1802 for ( n = 0 ; n < npix ; n++ )
1804 retSpec->data[n] /= norm ;
1824 Vector * sinfo_new_median_rectangle_of_cube_spectra( cpl_imagelist * cube,
1831 pixelvalue *local_rectangle ;
1838 cpl_image* i_img=NULL;
1841 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
1842 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
1843 inp=cpl_imagelist_get_size(cube);
1845 if ( cube == NULL || inp < 1 )
1851 if ((llx<0) || (llx>=ilx) ||
1852 (urx<0) || (urx>=ilx) ||
1853 (lly<0) || (lly>=ily) ||
1854 (ury<0) || (ury>=ily) ||
1855 (llx>=urx) || (lly>=ury))
1859 llx, lly, urx, ury) ;
1863 recsize = (urx - llx + 1) * (ury - lly + 1) ;
1866 if (NULL == (med = sinfo_new_vector (inp)) )
1876 for ( i = 0 ; i < inp ; i++ )
1879 i_img=cpl_imagelist_get(cube,i);
1880 pidata=cpl_image_get_data_float(i_img);
1882 local_rectangle=(pixelvalue *)cpl_calloc(recsize,
sizeof (pixelvalue*));
1884 for ( j = lly ; j <= ury ; j++ )
1886 for ( k = llx ; k <= urx ; k++ )
1888 if ( isnan(pidata[k+j*ilx]) )
1894 local_rectangle[m] = pidata[k + j * ilx] ;
1905 med->data[i] = sinfo_new_median(local_rectangle, m) ;
1907 cpl_free ( local_rectangle ) ;
1923 Vector * sinfo_new_median_circle_of_cube_spectra( cpl_imagelist * cube,
1929 pixelvalue * circle ;
1930 int i, j, k, l, m, n ;
1936 cpl_image* i_img=NULL;
1939 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
1940 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
1941 inp=cpl_imagelist_get_size(cube);
1943 if ( cube == NULL || inp < 1 )
1949 if ((centerx+radius>=ilx) ||
1950 (centery+radius>=ily) ||
1951 (centerx-radius<0) ||
1959 for ( j = centery - radius ; j <= centery + radius ; j++ )
1961 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
1963 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
1978 if (NULL == (med = sinfo_new_vector (inp)) )
1988 for ( i = 0 ; i < inp ; i++ )
1990 i_img=cpl_imagelist_get(cube,i);
1991 pidata=cpl_image_get_data_float(i_img);
1993 circle = (pixelvalue *) cpl_calloc (circsize,
sizeof (pixelvalue*));
1995 for ( j = centery - radius ; j <= centery + radius ; j++ )
1997 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
1999 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
2002 circle[m] = pidata[k + j * ilx] ;
2009 for ( l = 0 ; l < circsize ; l++ )
2011 if ( isnan(circle[l]) )
2015 med -> data[i] += circle[l] ;
2024 med->data[i] = sinfo_new_median(circle, nv) ;
2045 sinfo_new_cleanmean_rectangle_of_cube_spectra( cpl_imagelist * cube,
2054 pixelvalue *local_rectangle ;
2061 cpl_image* i_img=NULL;
2064 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
2065 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
2066 inp=cpl_imagelist_get_size(cube);
2068 if ( cube == NULL || inp < 1 )
2074 if ((llx<0) || (llx>=ilx) ||
2075 (urx<0) || (urx>=ilx) ||
2076 (lly<0) || (lly>=ily) ||
2077 (ury<0) || (ury>=ily) ||
2078 (llx>=urx) || (lly>=ury))
2082 llx, lly, urx, ury) ;
2086 recsize = (urx - llx + 1) * (ury - lly + 1) ;
2089 if (NULL == (clean = sinfo_new_vector (inp)) )
2099 for ( i = 0 ; i < inp ; i++ )
2101 i_img=cpl_imagelist_get(cube,i);
2102 pidata=cpl_image_get_data_float(i_img);
2104 local_rectangle=(pixelvalue *) cpl_calloc(recsize,
sizeof (pixelvalue*));
2106 for ( j = lly ; j <= ury ; j++ )
2108 for ( k = llx ; k <= urx ; k++ )
2110 if ( isnan(pidata[k+j*ilx]) )
2116 local_rectangle[m] = pidata[k + j * ilx] ;
2123 clean->data[i] = 0. ;
2127 clean->data[i] = sinfo_new_clean_mean(local_rectangle, m,
2128 lo_reject, hi_reject) ;
2130 cpl_free ( local_rectangle ) ;
2147 sinfo_new_cleanmean_circle_of_cube_spectra( cpl_imagelist * cube,
2155 pixelvalue * circle ;
2156 int i, j, k, l, m, n ;
2162 cpl_image* i_img=NULL;
2164 ilx=cpl_image_get_size_x(cpl_imagelist_get(cube,0));
2165 ily=cpl_image_get_size_y(cpl_imagelist_get(cube,0));
2166 inp=cpl_imagelist_get_size(cube);
2168 if ( cube == NULL || inp < 1 )
2174 if ((centerx+radius>=ilx) ||
2175 (centery+radius>=ily) ||
2176 (centerx-radius<0) ||
2184 for ( j = centery - radius ; j <= centery + radius ; j++ )
2186 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
2188 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
2203 if (NULL == (clean = sinfo_new_vector (inp)) )
2213 for ( i = 0 ; i < inp ; i++ )
2215 i_img=cpl_imagelist_get(cube,i);
2216 pidata=cpl_image_get_data_float(i_img);
2218 circle = (pixelvalue *) cpl_calloc (circsize,
sizeof (pixelvalue*));
2220 for ( j = centery - radius ; j <= centery + radius ; j++ )
2222 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
2224 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
2227 circle[m] = pidata[k + j * ilx] ;
2234 for ( l = 0 ; l < circsize ; l++ )
2236 if ( isnan(circle[l]) )
2240 clean -> data[i] += circle[l] ;
2245 clean->data[i] = 0. ;
2249 clean->data[i] = sinfo_new_clean_mean(circle, nv,
2250 lo_reject, hi_reject) ;
2269 sinfo_new_shift_array (
float * input,
int n_elements,
2270 float shift,
double * ker )
2273 int samples = KERNEL_SAMPLES ;
2281 register float * pix ;
2293 sinfo_msg_error(
" wrong number of elements in input array given!\n") ;
2297 shifted = (
float*) cpl_calloc(n_elements,
sizeof(
float)) ;
2300 if ((fabs(shift)<1e-2))
2302 for (i = 0 ; i < n_elements ; i++ )
2304 shifted[i] = input[i] ;
2309 mid = (int)samples/(
int)2 ;
2311 for (i=1 ; i< n_elements-2 ; i++)
2313 fx = (float)i+shift ;
2314 px = sinfo_new_nint(fx) ;
2315 rx = fx - (float)px ;
2318 if ((px>=1) && (px<(n_elements-2)))
2320 tabx = (int)(fabs((
float)mid * rx)) ;
2328 if (isnan(pix[i-1]))
2332 if (isnan(pix[i+1]))
2336 if (isnan(pix[i+2]))
2345 value = pix[i-1] * ker[mid+tabx] +
2346 pix[i] * ker[tabx] +
2347 pix[i+1] * ker[mid-tabx] +
2348 pix[i+2] * ker[samples-tabx-1] ;
2353 norm = ker[mid+tabx] +
2356 ker[samples-tabx-1] ;
2357 if (fabs(norm) > 1e-4)
2373 shifted[i] = value ;
2394 sinfo_new_div_image_by_spectrum( cpl_image * image, cpl_image * spectrum )
2397 cpl_image * retImage ;
2408 if ( image == NULL )
2413 ilx=cpl_image_get_size_x(image);
2414 ily=cpl_image_get_size_y(image);
2417 if ( spectrum == NULL )
2423 sly=cpl_image_get_size_y(spectrum);
2430 if ( NULL == (retImage = cpl_image_duplicate(image)) )
2435 pidata=cpl_image_get_data_float(image);
2436 psdata=cpl_image_get_data_float(spectrum);
2437 podata=cpl_image_get_data_float(retImage);
2439 for ( col = 0 ; col < ilx ; col++ )
2441 for ( row = 0 ; row < ily ; row++ )
2443 if ( !isnan(pidata[col+row*ilx]) &&
2444 !isnan(psdata[col+row*ilx]))
2446 podata[col+row*ilx] = pidata[col+row*ilx] / psdata[row] ;
2464 Vector * sinfo_new_clean_mean_circle_of_cube_spectra(cpl_imagelist * cube,
2472 pixelvalue * circle ;
2473 int i, j, k, l, m, n ;
2479 cpl_image* img=NULL;
2481 lz=cpl_imagelist_get_size(cube);
2483 if ( cube == NULL || lz < 1 )
2488 img=cpl_imagelist_get(cube,0);
2489 lx=cpl_image_get_size_x(img);
2490 ly=cpl_image_get_size_y(img);
2492 if ((centerx+radius>=lx) ||
2493 (centery+radius>=ly) ||
2494 (centerx-radius<0) ||
2502 for ( j = centery - radius ; j <= centery + radius ; j++ )
2504 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
2506 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
2521 if (NULL == (clean = sinfo_new_vector (lz)) )
2531 for ( i = 0 ; i < lz ; i++ )
2533 img=cpl_imagelist_get(cube,i);
2534 pidata=cpl_image_get_data(img);
2536 circle = (pixelvalue *) cpl_calloc (circsize,
sizeof (pixelvalue*));
2538 for ( j = centery - radius ; j <= centery + radius ; j++ )
2540 for ( k = centerx - radius ; k <= centerx + radius ; k++ )
2542 if ( (k-centerx)*(k-centerx)+(j-centery)*(j-centery) <=
2545 circle[m] = pidata[k + j * lx] ;
2552 for ( l = 0 ; l < circsize ; l++ )
2554 if ( isnan(circle[l]) )
2558 clean -> data[i] += circle[l] ;
2563 clean->data[i] = 0. ;
2567 clean->data[i] = sinfo_new_clean_mean(circle, nv,
2568 lo_reject, hi_reject) ;
2588 Vector * sinfo_new_clean_mean_rectangle_of_cube_spectra( cpl_imagelist * cube,
2597 pixelvalue *rectangle ;
2604 cpl_image* img=NULL;
2606 lz=cpl_imagelist_get_size(cube);
2608 if ( cube == NULL || lz < 1 )
2613 img=cpl_imagelist_get(cube,0);
2614 lx=cpl_image_get_size_x(img);
2615 ly=cpl_image_get_size_y(img);
2617 if ((llx<0) || (llx>=lx) ||
2618 (urx<0) || (urx>=lx) ||
2619 (lly<0) || (lly>=ly) ||
2620 (ury<0) || (ury>=ly) ||
2621 (llx>=urx) || (lly>=ury))
2625 llx, lly, urx, ury) ;
2629 recsize = (urx - llx + 1) * (ury - lly + 1) ;
2632 if (NULL == (clean = sinfo_new_vector (lz)) )
2642 for ( i = 0 ; i < lz ; i++ )
2645 rectangle = (pixelvalue *) cpl_calloc (recsize,
sizeof (pixelvalue*));
2646 img=cpl_imagelist_get(cube,i);
2647 pidata=cpl_image_get_data(img);
2648 for ( j = lly ; j <= ury ; j++ )
2650 for ( k = llx ; k <= urx ; k++ )
2652 if ( isnan(pidata[k+j*lx]) )
2658 rectangle[m] = pidata[k + j * lx] ;
2665 clean->data[i] = 0. ;
2669 clean->data[i] = sinfo_new_clean_mean(rectangle, m,
2670 lo_reject, hi_reject) ;
2672 cpl_free ( rectangle ) ;