22 #include <irplib_stdstar.h>
25 #include "sinfo_dfs.h"
28 #include "sinfo_tpl_utils.h"
30 #include "sinfo_utilities_scired.h"
31 #include "sinfo_functions.h"
32 #include "sinfo_pfits.h"
33 #include "sinfo_spiffi_types.h"
34 #include "sinfo_utils_wrappers.h"
35 #include "sinfo_error.h"
38 sinfo_sess2deg(
const double sess);
41 sinfo_set_spect_coord1(cpl_propertylist** plist,
47 sinfo_set_spect_coord2(cpl_propertylist** plist,
54 sinfo_set_coord1(cpl_propertylist** plist,
59 sinfo_set_coord2(cpl_propertylist** plist,
64 sinfo_set_coord3(cpl_propertylist** plist,
71 sinfo_set_cd_matrix2(cpl_propertylist** plist,
79 sinfo_set_cd_matrix3(cpl_propertylist** plist,
88 sinfo_new_change_plist_cube (cpl_propertylist * plist,
97 sinfo_new_change_plist_image (cpl_propertylist * plist,
103 sinfo_new_change_plist_spectrum (cpl_propertylist * plist,
109 sinfo_new_image_getvig(
110 cpl_image * image_in,
131 sinfo_check_input_data(object_config* cfg)
142 if(sinfo_is_fits_file(cfg->wavemap) != 1) {
148 if (cfg->halocorrectInd == 1)
150 if(sinfo_is_fits_file(cfg->halospectrum) != 1) {
157 if (cfg->northsouthInd == 0) {
158 if (sinfo_is_fits_file(cfg->poslist) != 1)
161 cfg->poslist,PRO_SLIT_POS);
166 if (sinfo_is_fits_file(cfg->distlist) != 1)
169 cfg->distlist,PRO_SLITLETS_DISTANCE);
187 sinfo_hms2deg(
const double hms)
205 hrs=(int)(rest/10000.);
208 rest=rest-(double)(hrs*10000.);
209 min=(int)(rest/100.);
212 sec=rest-(double)(min*100.);
215 deg=hrs*15+(double)(min/4.)+(double)(sec/240.);
233 sinfo_sess2deg(
const double sess)
251 grad=(int)(rest/10000.);
254 rest=rest-(double)(grad*10000.);
255 min=(int)(rest/100.);
258 sec=rest-(double)(min*100.);
261 deg=grad+(double)(min/60.)+(double)(sec/3600.);
285 sinfo_auto_size_cube(
float* offsetx,
302 sinfo_msg (
"Computation of output cube size") ;
303 for ( n = 0 ; n < nframes ; n++ ) {
313 if(offx > max_offx) max_offx=offx;
314 if(offy > max_offy) max_offy=offy;
315 if(offx < min_offx) min_offx=offx;
316 if(offy < min_offy) min_offy=offy;
323 *ref_offx=(min_offx+max_offx)/2;
324 *ref_offy=(min_offy+max_offy)/2;
325 *size_x+=2*floor(max_offx-min_offx+0.5);
326 *size_y+=2*floor(max_offy-min_offy+0.5);
327 sinfo_msg(
"Output cube size: %d x %d",*size_x,*size_y);
328 sinfo_msg(
"Ref offset. x: %f y: %f",*ref_offx,*ref_offy);
343 sinfo_auto_size_cube5(object_config * cfg,
344 float* ref_offx,
float* ref_offy,
345 float* min_offx,
float* min_offy,
346 float* max_offx,
float* max_offy)
354 cpl_propertylist * plist=NULL;
355 sinfo_msg (
"Automatic computation of output cube size") ;
356 for ( n = 0 ; n < cfg->nframes ; n++ ) {
357 name = cfg->framelist[n] ;
358 plist=cpl_propertylist_load(name,0);
359 offx = sinfo_pfits_get_cumoffsetx(plist);
360 if(cpl_error_get_code() != CPL_ERROR_NONE) {
368 offy = sinfo_pfits_get_cumoffsety(plist);
369 sinfo_free_propertylist(&plist);
370 if(cpl_error_get_code() != CPL_ERROR_NONE) {
385 if(offx > *max_offx) *max_offx=offx;
386 if(offy > *max_offy) *max_offy=offy;
387 if(offx < *min_offx) *min_offx=offx;
388 if(offy < *min_offy) *min_offy=offy;
391 *ref_offx=(*min_offx+*max_offx)/2;
392 *ref_offy=(*min_offy+*max_offy)/2;
394 if(cfg->size_x == 0) cfg->size_x=2*floor(*max_offx-*min_offx+0.5)+64 ;
404 if(cfg->size_y == 0) cfg->size_y=2*floor(*max_offy-*min_offy+0.5)+64 ;
406 sinfo_msg(
"Output cube size: %d x %d",cfg->size_x,cfg->size_y);
407 sinfo_msg(
"Ref offset. x: %f y: %f",*ref_offx,*ref_offy);
408 sinfo_msg(
"Max offset. x: %f y: %f",*max_offx,*max_offy);
409 sinfo_msg(
"Min offset. x: %f y: %f",*min_offx,*min_offy);
425 sinfo_read_distances(
const int nslits,
const char* distlist)
429 float * distances = NULL;
431 char tbl_distances_name[FILE_NAME_SZ];
432 cpl_table* tbl_distances = NULL;
434 sinfo_msg(
"Read distances");
435 distances = (
float*) cpl_calloc (nslits - 1,
sizeof (
float));
437 if ( NULL == distances )
444 if(cpl_error_get_code() != CPL_ERROR_NONE) {
449 strcpy(tbl_distances_name,distlist);
450 tbl_distances = cpl_table_load(tbl_distances_name,1,0);
451 if(cpl_error_get_code() != CPL_ERROR_NONE) {
457 for (i =0 ; i< nslits-1; i++){
458 tmp_float=cpl_table_get_float(tbl_distances,
"slitlet_distance",i,status);
459 if(cpl_error_get_code() != CPL_ERROR_NONE) {
465 sinfo_new_array_set_value(distances,tmp_float,i);
467 cpl_table_delete(tbl_distances);
482 sinfo_read_slitlets_edges(
const int nslits,
const char* poslist)
486 char tbl_slitpos_name[FILE_NAME_SZ];
487 cpl_table* tbl_slitpos=NULL;
493 float ** slit_edges = NULL;
495 slit_edges = sinfo_new_2Dfloatarray(nslits, 2) ;
497 strcpy(tbl_slitpos_name,poslist);
498 tbl_slitpos = cpl_table_load(tbl_slitpos_name,1,0);
499 if(cpl_error_get_code() != CPL_ERROR_NONE) {
504 n = cpl_table_get_nrow(tbl_slitpos);
510 for (i =0 ; i< nslits; i++){
511 edge_x=cpl_table_get_double(tbl_slitpos,
"pos1",i,status);
512 edge_y=cpl_table_get_double(tbl_slitpos,
"pos2",i,status);
513 if(cpl_error_get_code() != CPL_ERROR_NONE) {
518 sinfo_new_array2D_set_value(slit_edges,edge_x,i,0);
519 sinfo_new_array2D_set_value(slit_edges,edge_y,i,1);
521 cpl_table_delete(tbl_slitpos);
522 if(cpl_error_get_code() != CPL_ERROR_NONE) {
557 cpl_imagelist * sinfo_new_cube_getvig(
558 cpl_imagelist * cube_in,
564 cpl_imagelist * cube_out ;
574 cpl_image* i_img=NULL;
575 cpl_image* o_img=NULL;
577 if (cube_in==NULL)
return NULL ;
583 if ((loleft_x>upright_x) ||
584 (loleft_y>upright_y)) {
597 cube_out = cpl_imagelist_new() ;
599 for (i=0 ; i<cpl_imagelist_get_size(cube_in) ; i++) {
601 i_img=cpl_imagelist_get(cube_in,i);
603 o_img = sinfo_new_image_getvig(i_img,
605 upright_x, upright_y) ;
606 cpl_imagelist_set(cube_out,o_img,i);
630 sinfo_new_image_getvig(
631 cpl_image * image_in,
637 cpl_image * slit_img ;
649 if (image_in==NULL)
return NULL ;
651 ilx=cpl_image_get_size_x(image_in);
652 ily=cpl_image_get_size_y(image_in);
653 pidata=cpl_image_get_data_float(image_in);
655 if ((loleft_x<1) || (loleft_x>ilx) ||
656 (loleft_y<1) || (loleft_y>ily) ||
657 (upright_x<1) || (upright_x>ilx) ||
658 (upright_y<1) || (upright_y>ily) ||
659 (loleft_x>upright_x) || (loleft_y>upright_y)) {
661 "cannot extract such zone: aborting slit extraction",
662 loleft_x, loleft_y, upright_x, upright_y) ;
666 outlx = upright_x - loleft_x + 1 ;
667 outly = upright_y - loleft_y + 1 ;
668 slit_img = cpl_image_new(outlx, outly,CPL_TYPE_FLOAT) ;
669 podata=cpl_image_get_data_float(slit_img);
671 for (j=0 ; j<outly ; j++) {
672 inpt = pidata+loleft_x-1 + (j+loleft_y-1)*ilx ;
673 outpt = podata + j*outlx ;
674 for (i=0 ; i<outlx ; i++) {
693 sinfo_new_set_wcs_cube(cpl_imagelist* cub,
const char* name,
double clambda,
694 double dis,
double cpix,
double cx,
double cy)
696 cpl_propertylist* plist=NULL;
698 if ((cpl_error_code)((plist = cpl_propertylist_load(name, 0)) == NULL)) {
700 cpl_propertylist_delete(plist) ;
704 sinfo_new_change_plist_cube(plist, clambda, dis, cpix, cx, cy) ;
705 sinfo_plist_set_extra_keys(plist,
"IMAGE",
"DATA",
"RMSE",
706 "DATA",
"ERRS",
"QUAL",0);
707 if (cpl_imagelist_save(cub, name, CPL_BPP_IEEE_FLOAT,
708 plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
710 cpl_propertylist_delete(plist) ;
713 cpl_propertylist_delete(plist) ;
726 sinfo_new_set_wcs_image(cpl_image* img,
731 cpl_propertylist* plist=NULL;
733 if ((cpl_error_code)((plist = cpl_propertylist_load(name, 0)) == NULL)) {
735 cpl_propertylist_delete(plist) ;
738 sinfo_new_change_plist_image(plist, cx, cy) ;
740 if (cpl_image_save(img, name, CPL_BPP_IEEE_FLOAT,
741 plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
743 cpl_propertylist_delete(plist) ;
746 cpl_propertylist_delete(plist) ;
762 sinfo_new_set_wcs_spectrum(cpl_image* img,
const char* name,
double clambda,
763 double dis,
double cpix)
765 cpl_propertylist* plist=NULL;
767 if ((cpl_error_code)((plist = cpl_propertylist_load(name, 0)) == NULL)) {
769 cpl_propertylist_delete(plist) ;
772 sinfo_new_change_plist_spectrum(plist, clambda, dis,cpix) ;
774 if (cpl_image_save(img, name, CPL_BPP_IEEE_FLOAT,
775 plist,CPL_IO_DEFAULT)!=CPL_ERROR_NONE) {
777 cpl_propertylist_delete(plist) ;
780 cpl_propertylist_delete(plist) ;
796 sinfo_new_change_plist_cube (cpl_propertylist * plist,
809 double cd1_1, cd1_2, cd2_1, cd2_2 ;
811 char firsttext[2*FILE_NAME_SZ] ;
815 double cdelt3=dispersion;
817 double crpix1=center_x;
818 double crpix2=center_y;
823 double crval3=cenLambda;
826 strcpy(firsttext,
"sinfo_rec_objnod -f \0") ;
828 pixelscale = sinfo_pfits_get_pixscale(plist)/2. ;
829 ra = sinfo_pfits_get_ra(plist) ;
830 dec = sinfo_pfits_get_DEC(plist) ;
833 ra=sinfo_pfits_get_targ_alpha(plist);
834 dec=sinfo_pfits_get_targ_delta(plist);
837 ra=sinfo_hms2deg(ra);
838 dec=sinfo_sess2deg(dec);
845 angle = sinfo_pfits_get_posangle(plist) ;
847 if(cpl_error_get_code() != CPL_ERROR_NONE) {
850 cdelt1=sign_swap*pixelscale / 3600.;
851 cdelt2= +pixelscale / 3600.;
854 radangle = angle * PI_NUMB / 180. ;
855 cd1_1 = +cdelt1*cos(radangle);
856 cd1_2 = -cdelt2*sin(radangle);
857 cd2_1 = +cdelt1*sin(radangle);
858 cd2_2 = +cdelt2*cos(radangle);
861 sinfo_set_coord1(&plist,crpix1,crval1,cdelt1);
862 sinfo_set_coord2(&plist,crpix2,crval2,cdelt2);
863 sinfo_set_coord3(&plist,crpix3,crval3,cdelt3);
864 sinfo_set_cd_matrix2(&plist,cd1_1,cd1_2,cd2_1,cd2_2);
865 sinfo_set_cd_matrix3(&plist,0,0,0,0,dispersion);
882 sinfo_set_coord1(cpl_propertylist** plist,
887 cpl_propertylist_erase_regexp(*plist,
"^CTYPE1",0);
888 cpl_propertylist_insert_after_string(*plist,
"EXPTIME",
"CTYPE1",
"RA---TAN");
889 cpl_propertylist_set_comment(*plist,
"CTYPE1",
"Projected Rectascension");
890 cpl_propertylist_erase_regexp(*plist,
"^CRPIX1",0);
891 cpl_propertylist_insert_after_double(*plist,
"CTYPE1",
"CRPIX1", crpix1) ;
892 cpl_propertylist_set_comment(*plist,
"CRPIX1",
"Reference pixel in RA" ) ;
894 cpl_propertylist_erase_regexp(*plist,
"^CRVAL1",0);
895 cpl_propertylist_insert_after_double(*plist,
"CRPIX1",
"CRVAL1", crval1 ) ;
896 cpl_propertylist_set_comment(*plist,
"CRVAL1",
"Reference RA" ) ;
898 cpl_propertylist_erase_regexp(*plist,
"^CDELT1",0);
899 cpl_propertylist_insert_after_double(*plist,
"CRVAL1",
"CDELT1",cdelt1 ) ;
900 cpl_propertylist_set_comment(*plist,
"CDELT1",
"pixel scale" ) ;
902 cpl_propertylist_erase_regexp(*plist,
"^CUNIT1",0);
903 cpl_propertylist_insert_after_string(*plist,
"CDELT1",
"CUNIT1",
"deg" ) ;
904 cpl_propertylist_set_comment(*plist,
"CUNIT1",
"RA-UNIT" ) ;
919 sinfo_set_coord2(cpl_propertylist** plist,
924 cpl_propertylist_erase_regexp(*plist,
"^CTYPE2",0);
925 cpl_propertylist_insert_after_string(*plist,
"CUNIT1",
"CTYPE2",
"DEC--TAN");
926 cpl_propertylist_set_comment(*plist,
"CTYPE2",
"Projected Declination") ;
928 cpl_propertylist_erase_regexp(*plist,
"^CRPIX2",0);
929 cpl_propertylist_insert_after_double(*plist,
"CTYPE2",
"CRPIX2",crpix2 ) ;
930 cpl_propertylist_set_comment(*plist,
"CRPIX2",
"Reference pixel in DEC") ;
932 cpl_propertylist_erase_regexp(*plist,
"^CRVAL2",0);
933 cpl_propertylist_insert_after_double(*plist,
"CRPIX2",
"CRVAL2",crval2) ;
934 cpl_propertylist_set_comment(*plist,
"CRVAL2",
"Reference DEC") ;
936 cpl_propertylist_erase_regexp(*plist,
"^CDELT2",0);
937 cpl_propertylist_insert_after_double(*plist,
"CRVAL2",
"CDELT2",cdelt2 ) ;
938 cpl_propertylist_set_comment(*plist,
"CDELT2",
"pixel scale") ;
940 cpl_propertylist_erase_regexp(*plist,
"^CUNIT2",0);
941 cpl_propertylist_insert_after_string(*plist,
"CDELT2",
"CUNIT2",
"deg" ) ;
942 cpl_propertylist_set_comment(*plist,
"CUNIT2",
"DEC-UNIT") ;
958 sinfo_set_coord3(cpl_propertylist** plist,
963 cpl_propertylist_erase_regexp(*plist,
"^CTYPE3",0);
964 cpl_propertylist_insert_after_string(*plist,
"EXPTIME",
"CTYPE3",
"WAVE" ) ;
965 cpl_propertylist_set_comment(*plist,
"CTYPE3",
"wavelength axis in microns") ;
967 cpl_propertylist_erase_regexp(*plist,
"^CRPIX3",0);
968 cpl_propertylist_insert_after_double(*plist,
"CTYPE3",
"CRPIX3", (
double)crpix3 ) ;
969 cpl_propertylist_set_comment(*plist,
"CRPIX3",
"Reference pixel in z") ;
971 cpl_propertylist_erase_regexp(*plist,
"^CRVAL3",0);
972 cpl_propertylist_insert_after_double(*plist,
"CRPIX3",
"CRVAL3", crval3) ;
973 cpl_propertylist_set_comment(*plist,
"CRVAL3",
"central wavelength") ;
975 cpl_propertylist_erase_regexp(*plist,
"^CDELT3",0);
977 cpl_propertylist_insert_after_double(*plist,
"CRVAL3",
"CDELT3",cdelt3) ;
978 cpl_propertylist_set_comment(*plist,
"CDELT3",
"microns per pixel") ;
980 cpl_propertylist_erase_regexp(*plist,
"^CUNIT3",0);
981 cpl_propertylist_insert_after_string(*plist,
"CDELT3",
"CUNIT3",
"um" ) ;
982 cpl_propertylist_set_comment(*plist,
"CUNIT3",
"spectral unit" ) ;
984 cpl_propertylist_erase_regexp(*plist,
"^SPECSYS",0);
985 cpl_propertylist_insert_after_string(*plist,
"CUNIT3",
"SPECSYS",
"TOPOCENT" ) ;
986 cpl_propertylist_set_comment(*plist,
"SPECSYS",
"Coordinate reference frame" ) ;
1001 sinfo_set_cd_matrix2(cpl_propertylist** plist,
1008 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD1_1",0));
1009 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"EXPTIME",
1011 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD1_1",
1012 "CD rotation matrix" )) ;
1014 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD1_2",0));
1015 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"CD1_1",
1017 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD1_2",
1018 "CD rotation matrix" )) ;
1020 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD2_1",0));
1021 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"CD1_2",
1023 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD2_1",
1024 "CD rotation matrix" )) ;
1026 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD2_2",0));
1027 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"CD2_1",
1029 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD2_2",
1030 "CD rotation matrix" )) ;
1052 sinfo_set_cd_matrix3(cpl_propertylist** plist,
1061 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD1_3",0));
1062 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"EXPTIME",
1064 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD1_3",
1065 "CD rotation matrix" )) ;
1068 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD2_3",0));
1069 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"CD1_3",
1071 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD2_3",
1072 "CD rotation matrix" )) ;
1076 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD3_1",0));
1077 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"CD2_3",
1079 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD3_1",
1080 "CD rotation matrix" )) ;
1082 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD3_2",0));
1083 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"CD3_1",
1085 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD3_2",
1086 "CD rotation matrix" )) ;
1088 check_nomsg(cpl_propertylist_erase_regexp(*plist,
"^CD3_3",0));
1089 check_nomsg(cpl_propertylist_insert_after_double(*plist,
"CD3_2",
1091 check_nomsg(cpl_propertylist_set_comment(*plist,
"CD3_3",
1092 "CD rotation matrix" )) ;
1110 sinfo_set_spect_coord1(cpl_propertylist** plist,
1112 const double crval1,
1113 const double cdelt1)
1116 cpl_propertylist_erase_regexp(*plist,
"^CTYPE1",0);
1117 cpl_propertylist_insert_after_string(*plist,
"EXPTIME",
"CTYPE1",
"PIXEL");
1118 cpl_propertylist_set_comment(*plist,
"CTYPE1",
"Pixel coordinate system.");
1120 cpl_propertylist_erase_regexp(*plist,
"^CRPIX1",0);
1121 cpl_propertylist_insert_after_double(*plist,
"CTYPE1",
"CRPIX1", (
double)crpix1 ) ;
1122 cpl_propertylist_set_comment(*plist,
"CRPIX1",
"Reference pixel in x") ;
1124 cpl_propertylist_erase_regexp(*plist,
"^CRVAL1",0);
1125 cpl_propertylist_insert_after_double(*plist,
"CRPIX1",
"CRVAL1", crval1 ) ;
1126 cpl_propertylist_set_comment(*plist,
"CRVAL1",
"value of ref pixel.") ;
1128 cpl_propertylist_erase_regexp(*plist,
"^CDELT1",0);
1129 cpl_propertylist_insert_after_double(*plist,
"CRVAL1",
"CDELT1", cdelt1 ) ;
1130 cpl_propertylist_set_comment(*plist,
"CDELT1",
"pixel scale") ;
1133 cpl_propertylist_erase_regexp(*plist,
"^CUNIT1",0);
1134 cpl_propertylist_insert_after_string(*plist,
"CDELT1",
"CUNIT1",
"Pixel" );
1135 cpl_propertylist_set_comment(*plist,
"CUNIT1",
"spectral unit" );
1152 sinfo_set_spect_coord2(cpl_propertylist** plist,
1154 const double crval2,
1155 const double cdelt2)
1158 cpl_propertylist_erase_regexp(*plist,
"^CTYPE2",0);
1159 cpl_propertylist_insert_after_string(*plist,
"EXPTIME",
"CTYPE2",
"WAVE" );
1160 cpl_propertylist_set_comment(*plist,
"CTYPE2",
"wavelength axis in microns");
1162 cpl_propertylist_erase_regexp(*plist,
"^CRPIX2",0);
1163 cpl_propertylist_insert_after_double(*plist,
"CTYPE2",
"CRPIX2",(
double)crpix2 ) ;
1164 cpl_propertylist_set_comment(*plist,
"CRPIX2",
"Reference pixel in x") ;
1166 cpl_propertylist_erase_regexp(*plist,
"^CRVAL2",0);
1167 cpl_propertylist_insert_after_double(*plist,
"CRPIX2",
"CRVAL2",crval2 ) ;
1168 cpl_propertylist_set_comment(*plist,
"CRVAL2",
"central wavelength") ;
1170 cpl_propertylist_erase_regexp(*plist,
"^CDELT2",0);
1171 cpl_propertylist_insert_after_double(*plist,
"CRVAL2",
"CDELT2",cdelt2);
1172 cpl_propertylist_set_comment(*plist,
"CDELT2",
"microns per pixel");
1174 cpl_propertylist_erase_regexp(*plist,
"^CUNIT2",0);
1175 cpl_propertylist_insert_after_string(*plist,
"CDELT2",
"CUNIT2",
"um");
1176 cpl_propertylist_set_comment(*plist,
"CUNIT2",
"spectral unit" );
1190 sinfo_new_change_plist_spectrum (cpl_propertylist * plist,
1201 double crval2=cenLambda;
1202 double cdelt2=dispersion;
1206 cpl_propertylist_erase_regexp(plist,
"^CTYPE3",0);
1207 cpl_propertylist_erase_regexp(plist,
"^CRPIX3",0);
1208 cpl_propertylist_erase_regexp(plist,
"^CRVAL3",0);
1209 cpl_propertylist_erase_regexp(plist,
"^CDELT3",0);
1210 cpl_propertylist_erase_regexp(plist,
"^CUNIT3",0);
1212 cpl_propertylist_erase_regexp(plist,
"^CTYPE2",0);
1213 cpl_propertylist_erase_regexp(plist,
"^CRPIX2",0);
1214 cpl_propertylist_erase_regexp(plist,
"^CRVAL2",0);
1215 cpl_propertylist_erase_regexp(plist,
"^CDELT2",0);
1216 cpl_propertylist_erase_regexp(plist,
"^CUNIT2",0);
1219 cpl_propertylist_erase_regexp(plist,
"^CD1_1",0);
1220 cpl_propertylist_erase_regexp(plist,
"^CD1_2",0);
1221 cpl_propertylist_erase_regexp(plist,
"^CD2_1",0);
1222 cpl_propertylist_erase_regexp(plist,
"^CD2_2",0);
1227 sinfo_set_spect_coord1(&plist,crpix1,crval1,cdelt1);
1228 sinfo_set_spect_coord2(&plist,crpix2,crval2,cdelt2);
1243 sinfo_new_change_plist_image (cpl_propertylist * plist,
1253 float cd1_1, cd1_2, cd2_1, cd2_2 ;
1254 char firsttext[2*FILE_NAME_SZ] ;
1261 double crpix1=center_x;
1262 double crpix2=center_y;
1270 strcpy(firsttext,
"sinfo_rec_objnod -f \0") ;
1272 pixelscale = sinfo_pfits_get_pixscale(plist)/2. ;
1273 ra = sinfo_pfits_get_ra(plist) ;
1274 dec = sinfo_pfits_get_DEC(plist) ;
1279 ra=sinfo_pfits_get_targ_alpha(plist);
1280 dec=sinfo_pfits_get_targ_delta(plist);
1281 ra=sinfo_hms2deg(ra);
1282 dec=sinfo_sess2deg(dec);
1289 angle = sinfo_pfits_get_posangle(plist) ;
1291 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1295 radangle = angle * PI_NUMB / 180. ;
1297 cdelt1=sign_swap * pixelscale / 3600. ;
1298 cdelt2= pixelscale / 3600. ;
1301 cd1_1 = +cdelt1*cos(radangle) ;
1302 cd1_2 = -cdelt2*sin(radangle) ;
1303 cd2_1 = +cdelt1*sin(radangle) ;
1304 cd2_2 = +cdelt2*cos(radangle) ;
1310 check_nomsg(sinfo_set_coord1(&plist,crpix1,crval1,cdelt1));
1311 check_nomsg(sinfo_set_coord2(&plist,crpix2,crval2,cdelt2));
1312 check_nomsg(sinfo_set_cd_matrix2(&plist,cd1_1,cd1_2,cd2_1,cd2_2));
1327 sinfo_new_sinfoni_correct_median(cpl_imagelist** cubes,
const int n_cubes)
1330 cpl_imagelist** cubes_cor=NULL;
1331 double local_median=0;
1333 cpl_image* i_img=NULL;
1334 cpl_image* o_img=NULL;
1337 if ( cubes == NULL ) {
1341 if ( n_cubes <= 0 ) {
1346 cubes_cor = (cpl_imagelist**) cpl_calloc (n_cubes,
sizeof (cpl_imagelist*)) ;
1348 for ( i = 0 ; i < n_cubes ; i++ ) {
1349 cubes_cor[i] = cpl_imagelist_new();
1350 for(z=0;z< cpl_imagelist_get_size(cubes[i]); z++) {
1351 i_img=cpl_imagelist_get(cubes[i],z);
1352 local_median=cpl_image_get_median(i_img);;
1353 o_img=cpl_image_duplicate(i_img);
1354 if(!isnan(local_median)) {
1355 cpl_image_subtract_scalar(o_img,local_median);
1357 cpl_imagelist_set(cubes_cor[i],o_img,z);
1370 int sinfo_new_sinfoni_correct_median_it(cpl_imagelist** inp)
1373 double local_median=0;
1375 cpl_image* img=NULL;
1377 for(z=0;z< cpl_imagelist_get_size((*inp)); z++) {
1378 img=cpl_imagelist_get((*inp),z);
1379 local_median=sinfo_new_my_median_image(img);
1380 if(!isnan(local_median)) {
1381 cpl_image_subtract_scalar(img,local_median);
1385 cpl_imagelist_set((*inp),img,z);
1400 cpl_imagelist** sinfo_new_sinfoni_correct_sky(cpl_imagelist** cubes,
1402 cpl_imagelist* sky_cube)
1405 cpl_imagelist** cubes_sky=NULL;
1418 double val_msk_sum=0;
1419 cpl_vector* val=NULL;
1420 cpl_vector* msk=NULL;
1430 float* p_sky_data=NULL;
1431 cpl_image* i_img=NULL;
1432 cpl_image* sky_img=NULL;
1435 if ( cubes == NULL ) {
1439 ilx=cpl_image_get_size_x(cpl_imagelist_get(cubes[0],0));
1440 ily=cpl_image_get_size_y(cpl_imagelist_get(cubes[0],0));
1441 inp=cpl_imagelist_get_size(cubes[0]);
1444 sky_lx=cpl_image_get_size_x(cpl_imagelist_get(sky_cube,0));
1451 cubes_sky = (cpl_imagelist**) cpl_calloc (nc,
sizeof (cpl_imagelist*)) ;
1452 for(z=0;z< inp; z++) {
1453 sky_img=cpl_imagelist_get(sky_cube,z);
1454 p_sky_data=cpl_image_get_data_float(sky_img);
1455 for(y=0;y< ily; y++) {
1456 for(x=0;x< ilx; x++) {
1458 msk=cpl_vector_new(nc);
1459 for (i=0;i<nc;i++) {
1460 cpl_vector_set(msk,i,1);
1463 for (ks=0;ks<nc;ks++) {
1467 val=cpl_vector_new(nc-nclip);
1469 for ( i = 0 ; i < nc ; i++ ) {
1470 i_img=cpl_imagelist_get(cubes[i],z);
1471 pidata=cpl_image_get_data_float(i_img);
1472 if ((!isnan(pidata[x+y*ilx])) &&
1473 (cpl_vector_get(msk,i) != 0) ) {
1474 cpl_vector_set(val,ovr,(
double)pidata[x+y*ilx]);
1480 avg=cpl_vector_get_mean(val);
1481 med=cpl_vector_get_median_const(val);
1483 sig=cpl_vector_get_stdev(val);
1488 avg=cpl_vector_get(val,0);
1493 cpl_vector_delete(val);
1494 for ( i = 0 ; i < nc ; i++ ) {
1495 i_img=cpl_imagelist_get(cubes[i],z);
1496 pidata=cpl_image_get_data_float(i_img);
1498 if ((!isnan(pidata[x+y*ilx])) &&
1499 (cpl_vector_get(msk,i) != 0)) {
1500 if(abs((pidata[x+y*ilx]-med))> k*sig) {
1501 cpl_vector_set(msk,i,0);
1509 for ( i = 0 ; i < nc ; i++ ) {
1511 if (!isnan(pidata[x+y*ilx])) {
1512 msk_sum+=cpl_vector_get(msk,i);
1513 val_msk_sum+=pidata[x+y*ilx]*
1514 cpl_vector_get(msk,i);
1517 p_sky_data[x+y*sky_lx]=val_msk_sum/msk_sum;
1518 cpl_vector_delete(msk);
1522 for ( i = 0 ; i < nc ; i++ ) {
1523 cubes_sky[i]=cpl_imagelist_duplicate(cubes[i]);
1525 cpl_imagelist_subtract(cubes_sky[i],sky_cube);
1547 cpl_imagelist** sinfo_new_sinfoni_correct_sky2(cpl_imagelist** cubes,
1549 cpl_imagelist* sky_cube,
1550 cpl_imagelist* med_cube,
1551 cpl_imagelist* msk_cube,
1552 cpl_imagelist* avg_cube,
1553 cpl_imagelist* sig_cube,
1554 cpl_imagelist* ovr_cube)
1556 cpl_imagelist** cubes_sky=NULL;
1569 double val_msk_sum=0;
1570 cpl_vector* val=NULL;
1571 cpl_vector* msk=NULL;
1585 float* p_ovr_data=NULL;
1586 float* p_msk_data=NULL;
1587 float* p_avg_data=NULL;
1588 float* p_sig_data=NULL;
1589 float* p_sky_data=NULL;
1590 float* p_med_data=NULL;
1594 if ( cubes == NULL ) {
1599 ilx=cpl_image_get_size_x(cpl_imagelist_get(cubes[0],0));
1600 ily=cpl_image_get_size_y(cpl_imagelist_get(cubes[0],0));
1601 inp=cpl_imagelist_get_size(cubes[0]);
1608 cubes_sky = (cpl_imagelist**) cpl_calloc (nc,
sizeof (cpl_imagelist*)) ;
1617 for(z=0;z< inp; z++) {
1618 p_ovr_data=cpl_image_get_data_float(cpl_imagelist_get(ovr_cube,z));
1619 p_msk_data=cpl_image_get_data_float(cpl_imagelist_get(msk_cube,z));
1620 p_avg_data=cpl_image_get_data_float(cpl_imagelist_get(avg_cube,z));
1621 p_sig_data=cpl_image_get_data_float(cpl_imagelist_get(sig_cube,z));
1622 p_sky_data=cpl_image_get_data_float(cpl_imagelist_get(sky_cube,z));
1623 p_med_data=cpl_image_get_data_float(cpl_imagelist_get(med_cube,z));
1626 for(y=0;y< ily; y++) {
1627 for(x=0;x< ilx; x++) {
1629 msk=cpl_vector_new(nc);
1630 for (i=0;i<nc;i++) {
1631 cpl_vector_set(msk,i,1);
1633 p_ovr_data[x+y*ovr_lx]=nc;
1634 p_msk_data[x+y*msk_lx]=nc;
1636 for (ks=0;ks<nc;ks++) {
1640 val=cpl_vector_new(nc-nclip);
1642 for ( i = 0 ; i < nc ; i++ ) {
1643 pidata=cpl_image_get_data_float(cpl_imagelist_get(cubes[i],z));
1644 if ((!isnan(pidata[x+y*ilx])) &&
1645 (cpl_vector_get(msk,i) != 0) ) {
1646 cpl_vector_set(val,ovr,(
double)pidata[x+y*ilx]);
1652 avg=cpl_vector_get_mean(val);
1653 med=cpl_vector_get_median_const(val);
1654 sig=cpl_vector_get_stdev(val);
1656 avg=cpl_vector_get(val,0);
1661 p_med_data[x+y*med_lx]=med;
1662 p_avg_data[x+y*avg_lx]=avg;
1663 p_sig_data[x+y*sig_lx]=sig;
1664 cpl_vector_delete(val);
1665 for ( i = 0 ; i < nc ; i++ ) {
1666 pidata=cpl_image_get_data_float(cpl_imagelist_get(cubes[i],z));
1668 if ((!isnan(pidata[x+y*ilx])) &&
1669 (cpl_vector_get(msk,i) != 0)) {
1670 if(abs((pidata[x+y*ilx]-med))> k*sig) {
1672 p_msk_data[x+y*msk_lx]-=1;
1673 cpl_vector_set(msk,i,0);
1681 for ( i = 0 ; i < nc ; i++ ) {
1682 pidata=cpl_image_get_data_float(cpl_imagelist_get(cubes[i],z));
1684 if (!isnan(pidata[x+y*ilx])) {
1690 msk_sum+=cpl_vector_get(msk,i);
1691 val_msk_sum+=pidata[x+y*ilx]*
1692 cpl_vector_get(msk,i);
1695 p_sky_data[x+y*sky_lx]=val_msk_sum/msk_sum;
1696 cpl_vector_delete(msk);
1700 for ( i = 0 ; i < nc ; i++ ) {
1701 cubes_sky[i]=cpl_imagelist_duplicate(cubes[i]);
1703 cpl_imagelist_subtract(cubes_sky[i],sky_cube);
1724 sinfo_new_assign_offset(
const int n,
1728 const float ref_offx,
1729 const float ref_offy)
1747 cpl_propertylist * plist=NULL;
1750 if ((cpl_error_code)((plist = cpl_propertylist_load(name, 0)) == NULL)) {
1752 cpl_propertylist_delete(plist) ;
1756 offx = sinfo_pfits_get_cumoffsetx(plist) - ref_offx ;
1757 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1765 offy = sinfo_pfits_get_cumoffsety(plist) - ref_offy ;
1766 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1775 if (sinfo_propertylist_has(plist, KEY_NAME_MJD_OBS)) {
1776 mjd_obs=cpl_propertylist_get_double(plist, KEY_NAME_MJD_OBS);
1779 cpl_propertylist_delete(plist) ;
1783 cpl_propertylist_delete(plist) ;
1785 if (mjd_obs > 53825. ) {
1788 sinfo_new_array_set_value(offsetx,2*offx,n);
1789 sinfo_new_array_set_value(offsety,2*offy,n);
1790 }
else if ((mjd_obs > 53421.58210082 ) && (mjd_obs <= 53825.)){
1796 sinfo_new_array_set_value(offsetx,-2*offx,n);
1797 sinfo_new_array_set_value(offsety,2*offy,n);
1804 sinfo_new_array_set_value(offsetx,2*offx,n);
1805 sinfo_new_array_set_value(offsety,-2*offy,n);
1830 sinfo_new_assign_offset2(
const int n,
1834 const float ref_offx,
1835 const float ref_offy)
1842 cpl_propertylist * plist=NULL;
1844 offx = offsetx[n] - ref_offx ;
1845 offy = offsety[n] - ref_offy ;
1850 if ((cpl_error_code)((plist = cpl_propertylist_load(name, 0)) == NULL)) {
1852 cpl_propertylist_delete(plist) ;
1856 if (sinfo_propertylist_has(plist, KEY_NAME_MJD_OBS)) {
1857 mjd_obs=cpl_propertylist_get_double(plist, KEY_NAME_MJD_OBS);
1860 cpl_propertylist_delete(plist) ;
1863 cpl_propertylist_delete(plist) ;
1868 if (mjd_obs > 53825. ) {
1871 sinfo_new_array_set_value(offsetx,2*offx,n);
1872 sinfo_new_array_set_value(offsety,2*offy,n);
1873 }
else if ((mjd_obs > 53421.58210082 ) && (mjd_obs <= 53825.)){
1879 sinfo_new_array_set_value(offsetx,-2*offx,n);
1880 sinfo_new_array_set_value(offsety,2*offy,n);
1887 sinfo_new_array_set_value(offsetx,2*offx,n);
1888 sinfo_new_array_set_value(offsety,-2*offy,n);
1911 sinfo_new_object_assign_offset(
const char* name,
1922 cpl_propertylist * plist=NULL;
1925 if ((cpl_error_code)((plist = cpl_propertylist_load(name, 0)) == NULL)) {
1927 cpl_propertylist_delete(plist) ;
1932 *ref_offx = sinfo_pfits_get_cumoffsetx(plist) ;
1933 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1939 *ref_offy = sinfo_pfits_get_cumoffsety(plist) ;
1940 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1952 offx = sinfo_pfits_get_cumoffsetx(plist) - *ref_offx ;
1953 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1959 offy = sinfo_pfits_get_cumoffsety(plist) - *ref_offy ;
1960 if(cpl_error_get_code() != CPL_ERROR_NONE) {
1980 if (sinfo_propertylist_has(plist, KEY_NAME_MJD_OBS)) {
1981 mjd_obs=cpl_propertylist_get_double(plist, KEY_NAME_MJD_OBS);
1984 cpl_propertylist_delete(plist) ;
1988 cpl_propertylist_delete(plist) ;
1990 if (mjd_obs > 53825. ) {
1993 sinfo_new_array_set_value(*offsetx,2*offx,n);
1994 sinfo_new_array_set_value(*offsety,2*offy,n);
1995 }
else if ((mjd_obs > 53421.58210082 ) && (mjd_obs <= 53825.)){
1997 sinfo_new_array_set_value(*offsetx,-offx*2,n);
1998 sinfo_new_array_set_value(*offsety,+offy*2,n);
2001 sinfo_new_array_set_value(*offsetx,+offx*2,n);
2002 sinfo_new_array_set_value(*offsety,-offy*2,n);
2020 sinfo_new_fine_tune(cpl_imagelist* cube,
2021 float* correct_dist,
2026 cpl_imagelist* outcube2=NULL;
2027 float* neg_dist=NULL;
2028 sinfo_msg(
"Finetuning, method=%s",method);
2030 if (strcmp(method,
"P")==0)
2032 outcube2 = sinfo_new_fine_tune_cube( cube, correct_dist, order ) ;
2033 if (outcube2 == NULL)
2039 else if (strcmp(method,
"F")==0)
2041 neg_dist=cpl_calloc(nslits,
sizeof(
float));
2042 for ( i = 0 ; i < nslits ; i++ )
2044 neg_dist[i] = -correct_dist[i] ;
2046 outcube2 = sinfo_new_fine_tune_cube_by_FFT( cube, neg_dist ) ;
2048 if ( outcube2 == NULL )
2054 else if (strcmp(method,
"S")==0)
2056 outcube2 = sinfo_new_fine_tune_cube_by_spline( cube, correct_dist ) ;
2057 if ( outcube2 == NULL )
2082 sinfo_band sinfo_get_associated_filter(
const char * f)
2084 if (!strcmp(f,
"J"))
return SINFO_BAND_J ;
2085 if (!strcmp(f,
"Js"))
return SINFO_BAND_JS ;
2086 if (!strcmp(f,
"Z"))
return SINFO_BAND_Z ;
2087 if (!strcmp(f,
"SZ"))
return SINFO_BAND_SZ ;
2088 if (!strcmp(f,
"SH"))
return SINFO_BAND_SH ;
2089 if (!strcmp(f,
"H"))
return SINFO_BAND_H ;
2090 if (!strcmp(f,
"Ks"))
return SINFO_BAND_KS ;
2091 if (!strcmp(f,
"K"))
return SINFO_BAND_K ;
2092 if (!strcmp(f,
"SK"))
return SINFO_BAND_SK ;
2093 if (!strcmp(f,
"L"))
return SINFO_BAND_L ;
2094 if (!strcmp(f,
"SL"))
return SINFO_BAND_SL ;
2095 if (!strcmp(f,
"M"))
return SINFO_BAND_M ;
2096 if (!strcmp(f,
"M_NB"))
return SINFO_BAND_M ;
2097 if (!strcmp(f,
"NB_1.06"))
return SINFO_BAND_J ;
2098 if (!strcmp(f,
"NB_1.08"))
return SINFO_BAND_J ;
2099 if (!strcmp(f,
"NB_1.19"))
return SINFO_BAND_J ;
2100 if (!strcmp(f,
"NB_1.21"))
return SINFO_BAND_J ;
2101 if (!strcmp(f,
"NB_1.26"))
return SINFO_BAND_J ;
2102 if (!strcmp(f,
"NB_1.28"))
return SINFO_BAND_J ;
2103 if (!strcmp(f,
"NB_1.64"))
return SINFO_BAND_H ;
2104 if (!strcmp(f,
"NB_1.71"))
return SINFO_BAND_H ;
2105 if (!strcmp(f,
"NB_2.07"))
return SINFO_BAND_KS ;
2106 if (!strcmp(f,
"NB_2.09"))
return SINFO_BAND_KS ;
2107 if (!strcmp(f,
"NB_2.13"))
return SINFO_BAND_KS ;
2108 if (!strcmp(f,
"NB_2.17"))
return SINFO_BAND_KS ;
2109 if (!strcmp(f,
"NB_2.19"))
return SINFO_BAND_KS ;
2110 if (!strcmp(f,
"NB_2.25"))
return SINFO_BAND_KS ;
2111 if (!strcmp(f,
"NB_2.29"))
return SINFO_BAND_KS ;
2112 if (!strcmp(f,
"NB_2.34"))
return SINFO_BAND_KS ;
2113 if (!strcmp(f,
"NB_3.21"))
return SINFO_BAND_L ;
2114 if (!strcmp(f,
"NB_3.28"))
return SINFO_BAND_L ;
2115 if (!strcmp(f,
"NB_3.80"))
return SINFO_BAND_L ;
2116 if (!strcmp(f,
"NB_4.07"))
return SINFO_BAND_L ;
2117 return SINFO_BAND_UNKNOWN ;
2129 sinfo_band sinfo_get_bbfilter(
const char * f)
2131 if (!strcmp(f,
"J"))
return SINFO_BAND_J ;
2132 if (!strcmp(f,
"J+Block"))
return SINFO_BAND_J ;
2133 if (!strcmp(f,
"Js"))
return SINFO_BAND_J ;
2134 if (!strcmp(f,
"Z"))
return SINFO_BAND_J ;
2135 if (!strcmp(f,
"SZ"))
return SINFO_BAND_J ;
2136 if (!strcmp(f,
"SH"))
return SINFO_BAND_H ;
2137 if (!strcmp(f,
"H"))
return SINFO_BAND_H ;
2138 if (!strcmp(f,
"Ks"))
return SINFO_BAND_KS ;
2139 if (!strcmp(f,
"K"))
return SINFO_BAND_K ;
2140 if (!strcmp(f,
"SK"))
return SINFO_BAND_K ;
2141 if (!strcmp(f,
"L"))
return SINFO_BAND_L ;
2142 if (!strcmp(f,
"SL"))
return SINFO_BAND_L ;
2143 if (!strcmp(f,
"M"))
return SINFO_BAND_M ;
2144 if (!strcmp(f,
"M_NB"))
return SINFO_BAND_M ;
2145 if (!strcmp(f,
"NB_1.06"))
return SINFO_BAND_J ;
2146 if (!strcmp(f,
"NB_1.08"))
return SINFO_BAND_J ;
2147 if (!strcmp(f,
"NB_1.19"))
return SINFO_BAND_J ;
2148 if (!strcmp(f,
"NB_1.21"))
return SINFO_BAND_J ;
2149 if (!strcmp(f,
"NB_1.26"))
return SINFO_BAND_J ;
2150 if (!strcmp(f,
"NB_1.28"))
return SINFO_BAND_J ;
2151 if (!strcmp(f,
"NB_1.64"))
return SINFO_BAND_H ;
2152 if (!strcmp(f,
"NB_1.71"))
return SINFO_BAND_H ;
2153 if (!strcmp(f,
"NB_2.07"))
return SINFO_BAND_KS ;
2154 if (!strcmp(f,
"NB_2.09"))
return SINFO_BAND_KS ;
2155 if (!strcmp(f,
"NB_2.13"))
return SINFO_BAND_KS ;
2156 if (!strcmp(f,
"NB_2.17"))
return SINFO_BAND_KS ;
2157 if (!strcmp(f,
"NB_2.19"))
return SINFO_BAND_KS ;
2158 if (!strcmp(f,
"NB_2.25"))
return SINFO_BAND_KS ;
2159 if (!strcmp(f,
"NB_2.29"))
return SINFO_BAND_KS ;
2160 if (!strcmp(f,
"NB_2.34"))
return SINFO_BAND_KS ;
2161 if (!strcmp(f,
"NB_3.21"))
return SINFO_BAND_L ;
2162 if (!strcmp(f,
"NB_3.28"))
return SINFO_BAND_L ;
2163 if (!strcmp(f,
"NB_3.80"))
return SINFO_BAND_L ;
2164 if (!strcmp(f,
"NB_4.07"))
return SINFO_BAND_L ;
2165 return SINFO_BAND_UNKNOWN ;