46#define PI_NUMB (3.1415926535897932384626433832795)
51 return y1+(y2-y1)/(x2-x1)*(
x-x1);
104 cpl_propertylist_erase_regexp(*plist,
"^CTYPE1",0);
105 cpl_propertylist_insert_after_string(*plist,
"EXPTIME",
"CTYPE1",
"RA---TAN");
106 cpl_propertylist_set_comment(*plist,
"CTYPE1",
"Projected Rectascension");
107 cpl_propertylist_erase_regexp(*plist,
"^CRPIX1",0);
108 cpl_propertylist_insert_after_double(*plist,
"CTYPE1",
"CRPIX1", crpix1) ;
109 cpl_propertylist_set_comment(*plist,
"CRPIX1",
"Reference pixel in RA" ) ;
111 cpl_propertylist_erase_regexp(*plist,
"^CRVAL1",0);
112 cpl_propertylist_insert_after_double(*plist,
"CRPIX1",
"CRVAL1", crval1 ) ;
113 cpl_propertylist_set_comment(*plist,
"CRVAL1",
"Reference RA" ) ;
115 cpl_propertylist_erase_regexp(*plist,
"^CDELT1",0);
116 cpl_propertylist_insert_after_double(*plist,
"CRVAL1",
"CDELT1",cdelt1 ) ;
117 cpl_propertylist_set_comment(*plist,
"CDELT1",
"pixel scale" ) ;
119 cpl_propertylist_erase_regexp(*plist,
"^CUNIT1",0);
120 cpl_propertylist_insert_after_string(*plist,
"CDELT1",
"CUNIT1",
"deg" ) ;
121 cpl_propertylist_set_comment(*plist,
"CUNIT1",
"RA-UNIT" ) ;
141 cpl_propertylist_erase_regexp(*plist,
"^CTYPE2",0);
142 cpl_propertylist_insert_after_string(*plist,
"CUNIT1",
"CTYPE2",
"DEC--TAN");
143 cpl_propertylist_set_comment(*plist,
"CTYPE2",
"Projected Declination") ;
145 cpl_propertylist_erase_regexp(*plist,
"^CRPIX2",0);
146 cpl_propertylist_insert_after_double(*plist,
"CTYPE2",
"CRPIX2",crpix2 ) ;
147 cpl_propertylist_set_comment(*plist,
"CRPIX2",
"Reference pixel in DEC") ;
149 cpl_propertylist_erase_regexp(*plist,
"^CRVAL2",0);
150 cpl_propertylist_insert_after_double(*plist,
"CRPIX2",
"CRVAL2",crval2) ;
151 cpl_propertylist_set_comment(*plist,
"CRVAL2",
"Reference DEC") ;
153 cpl_propertylist_erase_regexp(*plist,
"^CDELT2",0);
154 cpl_propertylist_insert_after_double(*plist,
"CRVAL2",
"CDELT2",cdelt2 ) ;
155 cpl_propertylist_set_comment(*plist,
"CDELT2",
"pixel scale") ;
157 cpl_propertylist_erase_regexp(*plist,
"^CUNIT2",0);
158 cpl_propertylist_insert_after_string(*plist,
"CDELT2",
"CUNIT2",
"deg" ) ;
159 cpl_propertylist_set_comment(*plist,
"CUNIT2",
"DEC-UNIT") ;
180 cpl_propertylist_erase_regexp(*plist,
"^CTYPE3",0);
181 cpl_propertylist_insert_after_string(*plist,
"EXPTIME",
"CTYPE3",
"WAVE" ) ;
182 cpl_propertylist_set_comment(*plist,
"CTYPE3",
"wavelength axis in nm") ;
185 cpl_propertylist_erase_regexp(*plist,
"^CRPIX3",0);
186 cpl_propertylist_insert_after_double(*plist,
"CTYPE3",
"CRPIX3", (
double)crpix3 ) ;
187 cpl_propertylist_set_comment(*plist,
"CRPIX3",
"Reference pixel in z") ;
189 cpl_propertylist_erase_regexp(*plist,
"^CRVAL3",0);
190 cpl_propertylist_insert_after_double(*plist,
"CRPIX3",
"CRVAL3", crval3) ;
191 cpl_propertylist_set_comment(*plist,
"CRVAL3",
"central wavelength") ;
193 cpl_propertylist_erase_regexp(*plist,
"^CDELT3",0);
195 cpl_propertylist_insert_after_double(*plist,
"CRVAL3",
"CDELT3",cdelt3) ;
196 cpl_propertylist_set_comment(*plist,
"CDELT3",
"nm per pixel") ;
198 cpl_propertylist_erase_regexp(*plist,
"^CUNIT3",0);
199 cpl_propertylist_insert_after_string(*plist,
"CDELT3",
"CUNIT3",
"nm" ) ;
200 cpl_propertylist_set_comment(*plist,
"CUNIT3",
"spectral unit" ) ;
202 cpl_propertylist_erase_regexp(*plist,
"^SPECSYS",0);
203 cpl_propertylist_insert_after_string(*plist,
"CUNIT3",
"SPECSYS",
"TOPOCENT" ) ;
204 cpl_propertylist_set_comment(*plist,
"SPECSYS",
"Coordinate reference frame" ) ;
227 check(cpl_propertylist_erase_regexp(*plist,
"^CD1_1",0));
228 check(cpl_propertylist_insert_after_double(*plist,
"EXPTIME",
230 check(cpl_propertylist_set_comment(*plist,
"CD1_1",
231 "CD rotation matrix" )) ;
233 check(cpl_propertylist_erase_regexp(*plist,
"^CD1_2",0));
234 check(cpl_propertylist_insert_after_double(*plist,
"CD1_1",
236 check(cpl_propertylist_set_comment(*plist,
"CD1_2",
237 "CD rotation matrix" )) ;
239 check(cpl_propertylist_erase_regexp(*plist,
"^CD2_1",0));
240 check(cpl_propertylist_insert_after_double(*plist,
"CD1_2",
242 check(cpl_propertylist_set_comment(*plist,
"CD2_1",
243 "CD rotation matrix" )) ;
245 check(cpl_propertylist_erase_regexp(*plist,
"^CD2_2",0));
246 check(cpl_propertylist_insert_after_double(*plist,
"CD2_1",
248 check(cpl_propertylist_set_comment(*plist,
"CD2_2",
249 "CD rotation matrix" )) ;
280 check(cpl_propertylist_erase_regexp(*plist,
"^CD1_3",0));
281 check(cpl_propertylist_insert_after_double(*plist,
"EXPTIME",
283 check(cpl_propertylist_set_comment(*plist,
"CD1_3",
284 "CD rotation matrix" )) ;
287 check(cpl_propertylist_erase_regexp(*plist,
"^CD2_3",0));
288 check(cpl_propertylist_insert_after_double(*plist,
"CD1_3",
290 check(cpl_propertylist_set_comment(*plist,
"CD2_3",
291 "CD rotation matrix" )) ;
295 check(cpl_propertylist_erase_regexp(*plist,
"^CD3_1",0));
296 check(cpl_propertylist_insert_after_double(*plist,
"CD2_3",
298 check(cpl_propertylist_set_comment(*plist,
"CD3_1",
299 "CD rotation matrix" )) ;
301 check(cpl_propertylist_erase_regexp(*plist,
"^CD3_2",0));
302 check(cpl_propertylist_insert_after_double(*plist,
"CD3_1",
304 check(cpl_propertylist_set_comment(*plist,
"CD3_2",
305 "CD rotation matrix" )) ;
307 check(cpl_propertylist_erase_regexp(*plist,
"^CD3_3",0));
308 check(cpl_propertylist_insert_after_double(*plist,
"CD3_2",
310 check(cpl_propertylist_set_comment(*plist,
"CD3_3",
311 "CD rotation matrix" )) ;
346 double cd1_1, cd1_2, cd2_1, cd2_2 ;
350 double cdelt1=disp_x;
351 double cdelt2=disp_y;
352 double cdelt3=disp_z;
354 double crpix1=center_x;
355 double crpix2=center_y;
360 double crval3=cenLambda;
381 if(cpl_error_get_code() != CPL_ERROR_NONE) {
384 cdelt1=sign_swap*disp_x / 3600.;
385 cdelt2= +disp_y / 3600.;
388 radangle = angle *
PI_NUMB / 180. ;
389 cd1_1 = +cdelt1*cos(radangle);
390 cd1_2 = -cdelt2*sin(radangle);
391 cd2_1 = +cdelt1*sin(radangle);
392 cd2_2 = +cdelt2*cos(radangle);
402 return cpl_error_get_code();
477 p_obj_cen[row]=x_centroid;
478 x_ceil=ceil(x_centroid);
479 x_floor=floor(x_centroid);
481 s_ceil =p_slit[
lly*
nx+x_ceil];
482 s_floor=p_slit[
lly*
nx+x_floor];
484 w_ceil =p_wave[
lly*
nx+x_ceil];
485 w_floor=p_wave[
lly*
nx+x_floor];
487 p_obj_cen_s[row]=
xsh_interpol(x_centroid,x_floor,x_ceil,s_floor,s_ceil);
488 p_obj_cen_w[row]=
xsh_interpol(x_centroid,x_floor,x_ceil,w_floor,w_ceil);
507 cpl_table_duplicate_column(*tab,
"OBJ_LOW_S_TMP",*tab,
"OBJ_LOW_S");
508 cpl_table_duplicate_column(*tab,
"OBJ_UPP_S_TMP",*tab,
"OBJ_UPP_S");
510 cpl_table_erase_column(*tab,
"OBJ_LOW_S");
511 cpl_table_erase_column(*tab,
"OBJ_UPP_S");
513 cpl_table_duplicate_column(*tab,
"OBJ_UPP_S",*tab,
"OBJ_LOW_S_TMP");
514 cpl_table_duplicate_column(*tab,
"OBJ_LOW_S",*tab,
"OBJ_UPP_S_TMP");
516 cpl_table_erase_column(*tab,
"OBJ_LOW_S_TMP");
517 cpl_table_erase_column(*tab,
"OBJ_UPP_S_TMP");
519 cpl_table_duplicate_column(*tab,
"OBJ_LOW_W_TMP",*tab,
"OBJ_LOW_W");
520 cpl_table_duplicate_column(*tab,
"OBJ_UPP_W_TMP",*tab,
"OBJ_UPP_W");
522 cpl_table_erase_column(*tab,
"OBJ_LOW_W");
523 cpl_table_erase_column(*tab,
"OBJ_UPP_W");
525 cpl_table_duplicate_column(*tab,
"OBJ_UPP_W",*tab,
"OBJ_LOW_W_TMP");
526 cpl_table_duplicate_column(*tab,
"OBJ_LOW_W",*tab,
"OBJ_UPP_W_TMP");
528 cpl_table_erase_column(*tab,
"OBJ_LOW_W_TMP");
529 cpl_table_erase_column(*tab,
"OBJ_UPP_W_TMP");
532 return cpl_error_get_code();
552 check(tab=cpl_table_load(name,2,0));
554 nrow=cpl_table_get_nrow(tab);
556 cpl_table_new_column(tab,
"OBJ_LOW_X",CPL_TYPE_DOUBLE);
557 cpl_table_new_column(tab,
"OBJ_CEN_X",CPL_TYPE_DOUBLE);
558 cpl_table_new_column(tab,
"OBJ_UPP_X",CPL_TYPE_DOUBLE);
560 cpl_table_fill_column_window(tab,
"OBJ_LOW_X",0,nrow,-1);
561 cpl_table_fill_column_window(tab,
"OBJ_CEN_X",0,nrow,-1);
562 cpl_table_fill_column_window(tab,
"OBJ_UPP_X",0,nrow,-1);
564 cpl_table_new_column(tab,
"OBJ_LOW_S",CPL_TYPE_DOUBLE);
565 cpl_table_new_column(tab,
"OBJ_LOW_W",CPL_TYPE_DOUBLE);
566 cpl_table_new_column(tab,
"OBJ_CEN_S",CPL_TYPE_DOUBLE);
567 cpl_table_new_column(tab,
"OBJ_CEN_W",CPL_TYPE_DOUBLE);
568 cpl_table_new_column(tab,
"OBJ_UPP_S",CPL_TYPE_DOUBLE);
569 cpl_table_new_column(tab,
"OBJ_UPP_W",CPL_TYPE_DOUBLE);
571 cpl_table_fill_column_window(tab,
"OBJ_LOW_S",0,nrow,-1);
572 cpl_table_fill_column_window(tab,
"OBJ_LOW_W",0,nrow,-1);
573 cpl_table_fill_column_window(tab,
"OBJ_CEN_S",0,nrow,-1);
574 cpl_table_fill_column_window(tab,
"OBJ_CEN_W",0,nrow,-1);
575 cpl_table_fill_column_window(tab,
"OBJ_UPP_S",0,nrow,-1);
576 cpl_table_fill_column_window(tab,
"OBJ_UPP_W",0,nrow,-1);
702 const char* order_tab_edges_ifu_name,
703 const char* slit_map_name,
704 const char* wave_map_name)
706 cpl_image* ifu_object_ff_ima=NULL;
707 cpl_image* wave_map_ima=NULL;
708 cpl_image* slit_map_ima=NULL;
709 cpl_image* ratio_ima=NULL;
717 double* p_edge_lo_x=NULL;
718 double* p_edge_up_x=NULL;
720 double* p_slice_lo_x=NULL;
721 double* p_slice_up_x=NULL;
723 double* p_center_y=NULL;
725 double* p_obj_low=NULL;
726 double* p_obj_cen=NULL;
727 double* p_obj_upp=NULL;
729 double* p_obj_low_s=NULL;
730 double* p_obj_low_w=NULL;
731 double* p_obj_cen_s=NULL;
732 double* p_obj_cen_w=NULL;
733 double* p_obj_upp_s=NULL;
734 double* p_obj_upp_w=NULL;
758 cpl_propertylist* plist=NULL;
760 const char* pcatg=NULL;
773 typedef enum {centroid, gaussian} xsh_fit_method;
774 xsh_fit_method fit_method = centroid;
777 check(ifu_object_ff_ima=cpl_image_load(ifu_object_ff_name,CPL_TYPE_DOUBLE,0,0));
778 plist=cpl_propertylist_load(ifu_object_ff_name,0);
783 if(strstr(pcatg,
"UVB") != NULL) {
792 }
else if(strstr(pcatg,
"VIS") != NULL) {
801 }
else if(strstr(pcatg,
"NIR") != NULL) {
814 check(slit_map_ima=cpl_image_load(slit_map_name,CPL_TYPE_DOUBLE,0,0));
815 check(wave_map_ima=cpl_image_load(wave_map_name,CPL_TYPE_DOUBLE,0,0));
820 nrow=cpl_table_get_nrow(tab);
822 p_edge_lo_x=cpl_table_get_data_double(tab,
"EDG_LO_X");
823 p_slice_lo_x=cpl_table_get_data_double(tab,
"SLIC_LO_X");
824 p_obj_low=cpl_table_get_data_double(tab,
"OBJ_LOW_X");
825 p_obj_low_s=cpl_table_get_data_double(tab,
"OBJ_LOW_S");
826 p_obj_low_w=cpl_table_get_data_double(tab,
"OBJ_LOW_W");
828 p_edge_up_x=cpl_table_get_data_double(tab,
"EDG_UP_X");
829 p_slice_up_x=cpl_table_get_data_double(tab,
"SLIC_UP_X");
830 p_obj_upp=cpl_table_get_data_double(tab,
"OBJ_UPP_X");
831 p_obj_upp_s=cpl_table_get_data_double(tab,
"OBJ_UPP_S");
832 p_obj_upp_w=cpl_table_get_data_double(tab,
"OBJ_UPP_W");
834 p_center_y=cpl_table_get_data_double(tab,
"CENTER_Y");
835 p_obj_cen=cpl_table_get_data_double(tab,
"OBJ_CEN_X");
836 p_obj_cen_s=cpl_table_get_data_double(tab,
"OBJ_CEN_S");
837 p_obj_cen_w=cpl_table_get_data_double(tab,
"OBJ_CEN_W");
839 p_slit=cpl_image_get_data_double(slit_map_ima);
840 p_wave=cpl_image_get_data_double(wave_map_ima);
841 nx=cpl_image_get_size_x(wave_map_ima);
842 ny=cpl_image_get_size_y(wave_map_ima);
844 for(row=0;row<nrow;row++) {
853 llx=floor(p_slice_lo_x[row]);
854 urx=ceil(p_slice_up_x[row]);
856 check(cpl_image_get_maxpos_window(ifu_object_ff_ima,
860 if(fit_method==centroid) {
861 x_centroid=cpl_image_get_centroid_x_window(ifu_object_ff_ima,
870 p_obj_cen[row]=x_centroid;
874 lly,
nx,row,p_obj_cen_s,p_obj_cen_w));
878 llx=floor(p_edge_lo_x[row]);
879 urx=ceil(p_slice_lo_x[row]);
880 cpl_image_get_maxpos_window(ifu_object_ff_ima,
884 if(fit_method==centroid) {
885 check(x_centroid=cpl_image_get_centroid_x_window(ifu_object_ff_ima,
896 lly,
nx,row,p_obj_low_s,p_obj_low_w));
900 llx=floor(p_slice_up_x[row]);
901 urx=ceil(p_edge_up_x[row]);
902 cpl_image_get_maxpos_window(ifu_object_ff_ima,
906 if(fit_method==centroid) {
907 x_centroid=cpl_image_get_centroid_x_window(ifu_object_ff_ima,
914 p_obj_upp[row]=x_centroid;
918 lly,
nx,row,p_obj_upp_s,p_obj_upp_w));
926 cpl_table_duplicate_column(tab,
"OBJ_CEN_PLUS_UPP_S",tab,
"OBJ_CEN_S");
928 cpl_table_duplicate_column(tab,
"OBJ_CEN_PLUS_LOW_S",tab,
"OBJ_CEN_S");
930 cpl_table_add_columns(tab,
"OBJ_CEN_PLUS_UPP_S",
"OBJ_UPP_S");
931 cpl_table_add_columns(tab,
"OBJ_CEN_PLUS_LOW_S",
"OBJ_LOW_S");
956 sprintf(name,
"%s.fits",tag);
958 check(cpl_table_save(tab,plist,NULL,name,CPL_IO_DEFAULT));
968 return cpl_error_get_code();
985 cpl_frame* sci_frame,
989 cpl_propertylist* afc_plist=NULL;
990 cpl_propertylist* sci_plist=NULL;
991 const char* name=NULL;
992 const char* sci_obs_targ_name=NULL;
993 const char* afc_obs_targ_name=NULL;
994 const char* afc_slit_value=NULL;
999 check(name=cpl_frame_get_filename(model_config_frame));
1000 check(afc_plist=cpl_propertylist_load(name,0));
1002 check(name=cpl_frame_get_filename(sci_frame));
1003 check(sci_plist=cpl_propertylist_load(name,0));
1009 if(strstr(afc_slit_value,
"Pin_0.5") == NULL) {
1010 xsh_msg_error(
"You have used uncorrect AFC corrected model cfg frame");
1011 xsh_msg_error(
"IFU AFC corrected model CFG must have INS.OPTIi.NAME='Pin_0.5'");
1012 cpl_error_set(cpl_func,CPL_ERROR_ILLEGAL_INPUT);
1018 if(strcmp(sci_obs_targ_name,afc_obs_targ_name) != 0) {
1019 xsh_msg_error(
"Improper AFC corrected model cfg frame to reduce sci frame");
1021 cpl_error_set(cpl_func,CPL_ERROR_ILLEGAL_INPUT);
1028 if(sci_obs_id != afc_obs_id) {
1029 xsh_msg_error(
"Improper AFC corrected model cfg frame to reduce sci frame");
1031 cpl_error_set(cpl_func,CPL_ERROR_ILLEGAL_INPUT);
1039 return cpl_error_get_code();
1055 cpl_propertylist* plist=NULL;
1056 const char* name=NULL;
1057 const char* raw1_catg=NULL;
1059 check(name=cpl_frame_get_filename(model_config_frame));
1060 check(plist=cpl_propertylist_load(name,0));
1062 if(strstr(raw1_catg,
"AFC_ATT") == NULL) {
1063 xsh_msg_error(
"model cfg frame seems not to be AFC corrected");
1064 xsh_msg_error(
"Their PRO.REC1.RAW1..NAME values must contain AFC_ATT");
1065 cpl_error_set(cpl_func,CPL_ERROR_ILLEGAL_INPUT);
1072 return cpl_error_get_code();
1076static cpl_error_code
1078 const char* prefix,
const int row,
1079 const char* col12,
const char* col32)
1089 sprintf(key_name,
"%s_%s",prefix,
"T1");
1090 check(coeff_t1=cpl_propertylist_get_double(plist,key_name));
1092 sprintf(key_name,
"%s_%s",prefix,
"T2");
1093 coeff_t2=cpl_propertylist_get_double(plist,key_name);
1095 sprintf(key_name,
"%s_%s",prefix,
"T3");
1096 coeff_t3=cpl_propertylist_get_double(plist,key_name);
1097 diff_c12=coeff_t1-coeff_t2;
1098 diff_c32=coeff_t3-coeff_t2;
1100 cpl_table_set_double(*table,col12 ,row, diff_c12);
1101 cpl_table_set_double(*table,col32 ,row, diff_c32);
1105 return cpl_error_get_code();
1113 cpl_propertylist* plist=NULL;
1114 const char* fname=NULL;
1115 cpl_table* table=NULL;
1116 cpl_frame* result=NULL;
1120 fname=cpl_frame_get_filename(qc_trace_merged_frame);
1121 plist=cpl_propertylist_load(fname,0);
1123 table=cpl_table_new(3);
1124 check(cpl_table_new_column(table,
"DIFF_T12", CPL_TYPE_DOUBLE));
1125 check(cpl_table_new_column(table,
"DIFF_T32", CPL_TYPE_DOUBLE));
1129 "DIFF_T12",
"DIFF_T32"));
1132 "DIFF_T12",
"DIFF_T32"));
1135 "DIFF_T12",
"DIFF_T32"));
1138 sprintf(pname,
"%s.fits",ptag);
1139 xsh_msg(
"tag=%s name=%s",ptag,pname);
1141 check(cpl_table_save(table,plist,NULL,pname,CPL_IO_DEFAULT));
1143 CPL_FRAME_GROUP_PRODUCT,CPL_FRAME_LEVEL_FINAL);
1158 cpl_frame* result = NULL;
1160 cpl_image* ima_slit = NULL;
1161 cpl_image* ima_sky = NULL;
1162 float* pslit = NULL;
1165 const char* name = NULL;
1166 cpl_propertylist* plist = NULL;
1172 check(name = cpl_frame_get_filename(slitmap_frame));
1173 cpl_frame_dump(slitmap_frame, stdout);
1174 check(ima_slit = cpl_image_load(name, CPL_TYPE_FLOAT, 0, 0));
1175 check(plist = cpl_propertylist_load(name, 0));
1176 pslit = cpl_image_get_data_float(ima_slit);
1178 sx = cpl_image_get_size_x(ima_slit);
1179 sy = cpl_image_get_size_y(ima_slit);
1180 ima_sky = cpl_image_new(sx, sy, CPL_TYPE_FLOAT);
1181 psky = cpl_image_get_data_float(ima_sky);
1182 for (j = 1; j < sy - 1; j++) {
1183 for (i = 1; i < sx - 1; i++) {
1185 psky[j * sx + i] = 0.25 * (pslit[j * sx + i + 1] - pslit[j * sx + i - 1])
1186 * (pslit[(j + 1) * sx + i] - pslit[(j - 1) * sx + i]);
1191 sprintf(name_o,
"%s.fits", tag);
1194 result = cpl_frame_duplicate(slitmap_frame);
1195 cpl_frame_set_filename(result, name_o);
1196 cpl_frame_set_tag(result, tag);
1210 cpl_frame* result=NULL;
1212 cpl_image* ima = NULL;
1213 const char* name = NULL;
1214 cpl_propertylist* plist = NULL;
1216 check(name = cpl_frame_get_filename(slitmap_frame));
1218 check(plist = cpl_propertylist_load(name, 0));
1220 check(cpl_image_add_scalar(ima,value));
1221 sprintf(name_o,
"%s.fits",tag);
1224 result = cpl_frame_duplicate(slitmap_frame);
1225 cpl_frame_set_filename(result, name_o);
1226 cpl_frame_set_tag(result, tag);
1249 cpl_frame* wavemap_frame,
1250 cpl_frame* slitmap_frame,
1254 cpl_frame* map = NULL;
1255 cpl_frame* ra_map = NULL;
1256 cpl_frame* dec_map = NULL;
1257 cpl_frame* sky_area = NULL;
1262 cpl_image* ima = NULL;
1263 const char* name = NULL;
1264 cpl_propertylist* plist = NULL;
1268 name = cpl_frame_get_filename(div_frame);
1269 plist = cpl_propertylist_load(name, 0);
1272 sprintf(name_o,
"%s.fits",tag_o);
1321 CPL_FRAME_GROUP_PRODUCT, CPL_FRAME_LEVEL_FINAL);
1334static cpl_error_code
1336 cpl_imagelist* errs,
1337 cpl_imagelist* qual,
1338 cpl_propertylist* phead,
1339 const double wave_s,
1340 const double wave_e,
1360 cpl_imagelist* data_swap=NULL;
1361 cpl_imagelist* errs_swap=NULL;
1363 cpl_image* data_mean_ima=NULL;
1364 cpl_image* errs_mean_ima=NULL;
1371 naxis3=(int)cpl_imagelist_get_size(
data);
1375 zstart=((ws - crval3)/cdelt3+0.5);
1376 zend= ((we - crval3)/cdelt3-0.5);
1381 we=crval3+(naxis3-1.)*cdelt3;
1386 zstart=(zstart < naxis3) ? zstart: naxis3;
1387 zend=(zend < naxis3) ? zend: naxis3;
1388 zstart=(zstart < zend) ? zstart: zend-1;
1391 data_swap=cpl_imagelist_swap_axis_create(
data,CPL_SWAP_AXIS_YZ);
1392 errs_swap=cpl_imagelist_swap_axis_create(errs,CPL_SWAP_AXIS_YZ);
1395 data_mean_ima=cpl_imagelist_collapse_create(data_swap);
1396 errs_mean_ima=cpl_imagelist_collapse_create(errs_swap);
1403 check(flux=cpl_image_get_mean_window(data_mean_ima,j,zstart,j,zend));
1409 sprintf(comment,
"Flux in slic %d, %4.0f-%4.0f nm",j,ws,we);
1411 check(cpl_propertylist_append_double(phead,qc_key,flux));
1412 check(cpl_propertylist_set_comment(phead,qc_key,comment));
1413 err=cpl_image_get_mean_window(errs_mean_ima,j,zstart,j,zend);
1419 sprintf(comment,
"Err Flux in slic %d, %4.0f-%4.0f nm",j,ws,we);
1420 cpl_propertylist_update_double(phead,qc_key,err);
1421 cpl_propertylist_set_comment(phead,qc_key,comment);
1427 sprintf(comment,
"SNR in slic %d, %4.0f-%4.0f nm",j,ws,we);
1429 sn = (fabs(err) > 1.e-37) ? flux/err : -999;
1431 cpl_propertylist_append_double(phead,qc_key,sn);
1432 cpl_propertylist_set_comment(phead,qc_key,comment);
1438 return cpl_error_get_code();
1457static cpl_error_code
1459 cpl_imagelist* errs,
1460 cpl_imagelist* qual,
1462 cpl_propertylist* phead)
1466 cpl_ensure(
data != NULL, CPL_ERROR_NULL_INPUT,CPL_ERROR_NULL_INPUT);
1467 cpl_ensure(errs != NULL, CPL_ERROR_NULL_INPUT,CPL_ERROR_NULL_INPUT);
1468 cpl_ensure(qual != NULL, CPL_ERROR_NULL_INPUT,CPL_ERROR_NULL_INPUT);
1469 cpl_ensure(
instrument != NULL, CPL_ERROR_NULL_INPUT,CPL_ERROR_NULL_INPUT);
1470 cpl_ensure(phead != NULL, CPL_ERROR_NULL_INPUT,CPL_ERROR_NULL_INPUT);
1496 return cpl_error_get_code();
1524 cpl_frame* ifu_cfg_tab_frame,
1525 cpl_frame* ifu_cfg_cor_frame,
1526 cpl_frame* spectral_format_frame,
1527 cpl_frame* model_config_frame,
1528 cpl_frame* wavesol_frame,
1530 cpl_frameset* frameset,
1531 cpl_parameterlist* parameters,
1533 const char* recipe_id,
1534 const char* rec_prefix,
1535 const int frame_is_object)
1541 cpl_image* data_img=NULL;
1542 cpl_image* errs_img=NULL;
1543 cpl_image* qual_img=NULL;
1545 cpl_image* data_tmp=NULL;
1546 cpl_image* errs_tmp=NULL;
1547 cpl_image* qual_tmp=NULL;
1548 cpl_image* mask_tmp=NULL;
1549 cpl_frame* qc_trace_frame=NULL;
1550 cpl_frame* qc_trace_merged_frame=NULL;
1551 cpl_frame* frame_data_cube=NULL;
1552 cpl_frame* frame_errs_cube=NULL;
1553 cpl_frame* frame_qual_cube=NULL;
1554 cpl_frame* frame_merged_cube=NULL;
1564 cpl_table* ifu_cfg_tab=NULL;
1565 cpl_table* sp_fmt_tab=NULL;
1566 cpl_vector* profile=NULL;
1567 cpl_imagelist* data_cube=NULL;
1568 cpl_imagelist* errs_cube=NULL;
1569 cpl_imagelist* qual_cube=NULL;
1571 cpl_imagelist* data_cube_merge=NULL;
1572 cpl_imagelist* errs_cube_merge=NULL;
1573 cpl_imagelist* qual_cube_merge=NULL;
1574 cpl_imagelist* mask_data_merge=NULL;
1575 cpl_imagelist* mask_errs_merge=NULL;
1576 cpl_imagelist* mask_qual_merge=NULL;
1584 int save_size_uvb=4;
1585 int save_size_vis=2;
1586 int save_size_nir=2;
1588 const int peack_search_hsize=5;
1593 cpl_propertylist* data_plist=NULL;
1594 cpl_propertylist* errs_plist=NULL;
1595 cpl_propertylist* qual_plist=NULL;
1598 const char* sci_name=NULL;
1599 const char* sp_fmt_name=NULL;
1600 const char* ifu_cfg_name=NULL;
1603 char data_extid[40];
1604 char errs_extid[40];
1605 char qual_extid[40];
1619 double cube_wave_min=0;
1620 double cube_wave_max=0;
1624 double cube_wstep=0;
1625 double cube_sstep=0;
1638 double wave_min_old=0;
1656 double confidence=0;
1668 double w_low_coeff1=0;
1669 double w_low_coeff2=0;
1671 double w_upp_coeff1=0;
1672 double w_upp_coeff2=0;
1674 double w_low_coeff1_uvb=-0.002972;
1675 double w_low_coeff2_uvb=2.26497e-6+0.2e-6;
1676 double w_upp_coeff1_uvb=8.3355331e-5;
1677 double w_upp_coeff2_uvb=-1.0682e-6;
1681 double w_low_coeff1_vis=-0.0016549569;
1682 double w_low_coeff2_vis=1.183805e-6+0.04e-6;
1683 double w_upp_coeff1_vis=-0.0016610719;
1684 double w_upp_coeff2_vis=1.0823013e-6+0.02e-6;
1686 double w_low_coeff1_nir=-0.00010;
1687 double w_low_coeff2_nir=-5.0e-9;
1689 double w_upp_coeff1_nir=0;
1690 double w_upp_coeff2_nir=0;
1693 double s_upp_off_uvb=4.0514429+0.16;
1694 double s_upp_off_vis=5.2504895+0.16-0.703;
1695 double s_upp_off_nir=3.5452+0.31;
1698 double s_low_off_uvb=-3.4636662+0.16;
1700 double s_low_off_vis=-2.9428071+0.16-0.645;
1701 double s_low_off_nir=-4.451682+0.21+0.31;
1711 cpl_frame* trace_corr_tab=NULL;
1718 int cut_uvb_spectrum=0;
1722 if(frame_is_object) {
1723 sprintf(qualifier,
"OBJ");
1725 sprintf(qualifier,
"SKY");
1753 check(sci_name=cpl_frame_get_filename(div_frame));
1754 check(data_plist=cpl_propertylist_load(sci_name,0));
1755 errs_plist=cpl_propertylist_duplicate(data_plist);
1756 qual_plist=cpl_propertylist_duplicate(data_plist);
1771 s_low_off=s_low_off_uvb;
1772 s_upp_off=s_upp_off_uvb;
1773 w_low_coeff1=w_low_coeff1_uvb;
1774 w_low_coeff2=w_low_coeff2_uvb;
1776 w_upp_coeff1=w_upp_coeff1_uvb;
1777 w_upp_coeff2=w_upp_coeff2_uvb;
1778 save_size=save_size_uvb;
1791 s_low_off=s_low_off_vis;
1792 s_upp_off=s_upp_off_vis;
1794 w_low_coeff1=w_low_coeff1_vis;
1795 w_low_coeff2=w_low_coeff2_vis;
1797 w_upp_coeff1=w_upp_coeff1_vis;
1798 w_upp_coeff2=w_upp_coeff2_vis;
1799 save_size=save_size_vis;
1808 s_low_off=s_low_off_nir;
1809 s_upp_off=s_upp_off_nir;
1812 w_low_coeff1=w_low_coeff1_nir;
1813 w_low_coeff2=w_low_coeff2_nir;
1815 w_upp_coeff1=w_upp_coeff1_nir;
1816 w_upp_coeff2=w_upp_coeff2_nir;
1817 save_size=save_size_nir;
1823 if(ifu_cfg_tab_frame) {
1825 ifu_cfg_name=cpl_frame_get_filename(ifu_cfg_tab_frame);
1826 ifu_cfg_tab=cpl_table_load(ifu_cfg_name,1,0);
1827 s_upp_off=cpl_table_get_double(ifu_cfg_tab,
"S_UPP_OFF",arm,&status);
1828 s_low_off=cpl_table_get_double(ifu_cfg_tab,
"S_LOW_OFF",arm,&status);
1830 w_upp_coeff1=cpl_table_get_double(ifu_cfg_tab,
"W_UPP_COEF1",arm,&status);
1831 w_low_coeff1=cpl_table_get_double(ifu_cfg_tab,
"W_LOW_COEF1",arm,&status);
1832 w_upp_coeff2=cpl_table_get_double(ifu_cfg_tab,
"W_UPP_COEF2",arm,&status);
1833 w_low_coeff2=cpl_table_get_double(ifu_cfg_tab,
"W_LOW_COEF2",arm,&status);
1835 w_step_fct=cpl_table_get_int(ifu_cfg_tab,
"W_STEP_FCT",arm,&status);
1836 xsh_msg(
"s_upp_off=%10.8g",s_upp_off);
1837 xsh_msg(
"s_low_off=%10.8g",s_low_off);
1840 xsh_msg(
"w_upp_coeff1=%10.8g",w_upp_coeff1);
1841 xsh_msg(
"w_upp_coeff2=%10.8g",w_upp_coeff2);
1842 xsh_msg(
"w_low_coeff1=%10.8g",w_low_coeff1);
1843 xsh_msg(
"w_low_coeff2=%10.8g",w_low_coeff2);
1845 xsh_msg(
"w_step_fct=%d",w_step_fct);
1849 if(ifu_cfg_cor_frame) {
1850 ifu_cfg_name=cpl_frame_get_filename(ifu_cfg_cor_frame);
1851 ifu_cfg_tab=cpl_table_load(ifu_cfg_name,1,0);
1852 s_upp_d0=cpl_table_get_double(ifu_cfg_tab,
"DIFF_T12",0,&status);
1853 s_low_d0=cpl_table_get_double(ifu_cfg_tab,
"DIFF_T32",0,&status);
1854 s_upp_d1=cpl_table_get_double(ifu_cfg_tab,
"DIFF_T12",1,&status);
1855 s_low_d1=cpl_table_get_double(ifu_cfg_tab,
"DIFF_T32",1,&status);
1856 s_upp_d2=cpl_table_get_double(ifu_cfg_tab,
"DIFF_T12",2,&status);
1857 s_low_d2=cpl_table_get_double(ifu_cfg_tab,
"DIFF_T32",2,&status);
1858 xsh_msg(
"upp_d0=%g upp_d1=%g upp_d2=%g low_d0=%g low_d1=%g low_d2=%g",
1859 s_upp_d0,s_upp_d1,s_upp_d2,s_low_d0,s_low_d1,s_low_d2);
1863 cube_wstep*=w_step_fct;
1864 if(model_config_frame!=NULL) {
1871 check( profile = cpl_vector_new( CPL_KERNEL_DEF_SAMPLES));
1875 check(sci_name=cpl_frame_get_filename(div_frame));
1879 int nx=cpl_image_get_size_x(data_img);
1880 int ny=cpl_image_get_size_y(data_img);
1881 int* pqual_img=cpl_image_get_data_int(qual_img);
1882 cpl_image* var_img=cpl_image_duplicate(data_img);
1883 cpl_image_power(var_img,2.);
1884 cpl_vector* profile2=cpl_vector_duplicate(profile);
1885 cpl_vector_power(profile2,2.);
1886 check(sp_fmt_name=cpl_frame_get_filename(spectral_format_frame));
1887 check(sp_fmt_tab=cpl_table_load(sp_fmt_name,1,0));
1888 check(ord_min=cpl_table_get_column_min(sp_fmt_tab,
"ORDER"));
1889 check(ord_max=cpl_table_get_column_max(sp_fmt_tab,
"ORDER"));
1890 nord=ord_max-ord_min+1;
1892 check(cube_wave_min=cpl_table_get(sp_fmt_tab,
"WLMIN",nord-1,&status));
1893 check(cube_wave_max=cpl_table_get(sp_fmt_tab,
"WLMAX",0,&status));
1896 xsh_msg_debug(
"cube_wave_min=%10.8g cube_wave_max=%10.8g",cube_wave_min,cube_wave_max);
1901 wave_step= cube_wstep;
1903 naxis2=(int)((s_max-s_min)/s_step+0.5)+1;
1913 data_cube_merge=cpl_imagelist_new();
1914 errs_cube_merge=cpl_imagelist_new();
1915 qual_cube_merge=cpl_imagelist_new();
1916 mask_data_merge=cpl_imagelist_new();
1917 mask_errs_merge=cpl_imagelist_new();
1918 mask_qual_merge=cpl_imagelist_new();
1928 for( ord = ord_max; ord >= ord_min; ord-- ) {
1934 data_cube=cpl_imagelist_new();
1935 errs_cube=cpl_imagelist_new();
1936 qual_cube=cpl_imagelist_new();
1944 check(pima=cpl_image_get_data_float(data_tmp));
1945 check(perr=cpl_image_get_data_float(errs_tmp));
1946 check(pqua=cpl_image_get_data_int(qual_tmp));
1947 check(pmsk=cpl_image_get_data_int(mask_tmp));
1951 check(wave_min=cpl_table_get(sp_fmt_tab,
"WLMIN",ord-ord_min,&status));
1952 check(wave_max=cpl_table_get(sp_fmt_tab,
"WLMAX",ord-ord_min,&status));
1954 naxis3=(wave_max-wave_min)/wave_step+1;
1956 xsh_msg_debug(
"order=%d naxis1=%d,naxis2=%d naxis3=%d, wave_min=%g wave_max=%g",
1957 ord,naxis1,naxis2,naxis3,wave_min,wave_max);
1961 nstep_off=(int)((wave_min-wave_min_old)/wave_step+0.5);
1962 wave_min=wave_min_old+nstep_off*wave_step;
1966 for( wave = wave_min; wave <= wave_max; wave+=wave_step) {
1968 for(
s = s_min;
s <= s_max;
s+=s_step ) {
1973 s_upp=-
s+s_upp_off+w_upp_coeff1*wave+w_upp_coeff2*wave*wave;
1974 s_upp-=(s_upp_d0+s_upp_d1*wave+s_upp_d2*wave*wave)*s_step;
1986 check(flux_upp=cpl_image_get_interpolated(data_img,
x,
y,
1991 if (confidence <= 0) {
1992 pima[is*naxis1+0]=0;
1993 perr[is*naxis1+0]=1;
1995 pmsk[is*naxis1+0]=1;
1999 check(errs_upp=cpl_image_get_interpolated(errs_img,
x,
y,
2011 int ix=(int)(
x+0.5);
2012 int iy=(int)(
x+0.5);
2014 int jj_min= ( iy - radius >= 0 ) ? iy - radius: 0;
2015 int jj_max= ( iy + radius <
ny ) ? iy + radius: 0;
2018 for(
int jj=jj_min;jj<jj_max;jj++) {
2020 for(
int ii=ix-radius;ii<ix+radius-1;ii++) {
2021 qual_upp |= pqual_img[jj_nx+ii];
2025 pima[is*naxis1+0]=flux_upp;
2026 perr[is*naxis1+0]=errs_upp;
2027 pqua[is*naxis1+0]=qual_upp;
2028 pmsk[is*naxis1+0]=1;
2040 check(flux_cen=cpl_image_get_interpolated(data_img,
x,
y,
2045 if (confidence <= 0) {
2046 pima[is*naxis1+1]=0;
2047 perr[is*naxis1+1]=1;
2049 pmsk[is*naxis1+1]=1;
2053 check(errs_cen=cpl_image_get_interpolated(errs_img,
x,
y,
2066 int ix=(int)(
x+0.5);
2067 int iy=(int)(
x+0.5);
2069 int jj_min= ( iy - radius >= 0 ) ? iy - radius: 0;
2070 int jj_max= ( iy + radius <
ny ) ? iy + radius: 0;
2073 for(
int jj=jj_min;jj<jj_max;jj++) {
2075 for(
int ii=ix-radius;ii<ix+radius-1;ii++) {
2076 qual_cen |= pqual_img[jj_nx+ii];
2080 pima[is*naxis1+1]=flux_cen;
2081 perr[is*naxis1+1]=errs_cen;
2082 pqua[is*naxis1+1]=qual_cen;
2083 pmsk[is*naxis1+1]=1;
2086 s_low=-
s+s_low_off+w_low_coeff1*wave+w_low_coeff2*wave*wave;
2087 s_low-=(s_low_d0+s_low_d1*wave+s_low_d2*wave*wave)*s_step;
2097 check(flux_low=cpl_image_get_interpolated(data_img,
x,
y,
2102 if (confidence <= 0 ) {
2103 pima[is*naxis1+2]=0;
2104 perr[is*naxis1+2]=1;
2106 pmsk[is*naxis1+2]=1;
2110 check(errs_low=cpl_image_get_interpolated(errs_img,
x,
y,
2123 int ix=(int)(
x+0.5);
2124 int iy=(int)(
x+0.5);
2126 int jj_min= ( iy - radius >= 0 ) ? iy - radius: 0;
2127 int jj_max= ( iy + radius <
ny ) ? iy + radius: 0;
2130 for(
int jj=jj_min;jj<jj_max;jj++) {
2132 for(
int ii=ix-radius;ii<ix+radius-1;ii++) {
2133 qual_low |= pqual_img[jj_nx+ii];
2137 pima[is*naxis1+2]=flux_low;
2138 perr[is*naxis1+2]=errs_low;
2139 pqua[is*naxis1+2]=qual_low;
2140 pmsk[is*naxis1+2]=1;
2146 wave_min_old=wave_min;
2148 check(cpl_imagelist_set(data_cube,cpl_image_duplicate(data_tmp),ik));
2149 check(cpl_imagelist_set(errs_cube,cpl_image_duplicate(errs_tmp),ik));
2150 check(cpl_imagelist_set(qual_cube,cpl_image_duplicate(qual_tmp),ik));
2161 data_tmp, errs_tmp, qual_tmp, mk,
2167 mk=(int)((wave-cube_wave_min)/wave_step+0.5);
2171 sprintf(tag,
"%s_ORDER3D_DATA_%s_%s",rec_prefix,qualifier,
2173 sprintf(name,
"%s.fits",tag);
2174 if(frame_is_object==0) {
2178 0.6,s_step,wave_step,
2182 0.6,s_step,wave_step,
2186 0.6,s_step,wave_step,
2189 sprintf(data_extid,
"ORD%2.2d_FLUX",ord);
2191 sprintf(errs_extid,
"ORD%2.2d_ERRS",ord);
2193 sprintf(qual_extid,
"ORD%2.2d_QUAL",ord);
2197 data_extid,errs_extid,qual_extid,0);
2200 data_extid,errs_extid,qual_extid,1);
2203 data_extid,errs_extid,qual_extid,2);
2209 frame_data_cube=
xsh_frame_product(name,tag,CPL_FRAME_TYPE_IMAGE,CPL_FRAME_GROUP_PRODUCT,CPL_FRAME_LEVEL_FINAL);
2220 sprintf(name,
"QC%s_%2.2d.fits",tag,ord);
2229 sprintf(tag,
"%s_MERGE3D_DATA_%s_%s",rec_prefix,qualifier,
2231 sprintf(name,
"%s.fits",tag);
2233 0.6,s_step,wave_step,
2237 0.6,s_step,wave_step,
2241 0.6,s_step,wave_step,
2244 sprintf(data_extid,
"FLUX");
2246 sprintf(errs_extid,
"ERRS");
2248 sprintf(qual_extid,
"QUAL");
2252 data_extid,errs_extid,qual_extid,0);
2254 data_extid,errs_extid,qual_extid,1);
2256 data_extid,errs_extid,qual_extid,2);
2259 if(cut_uvb_spectrum) {
2261 qual_cube_merge,data_plist));
2264 if( model_config_frame != NULL) {
2276 xsh_msg_debug(
"merge cube size=%" CPL_SIZE_FORMAT
"",cpl_imagelist_get_size(data_cube_merge));
2279 CPL_FRAME_GROUP_PRODUCT,CPL_FRAME_LEVEL_FINAL);
2286 if(frame_is_object) {
2288 sprintf(tag,
"%s_MERGE3D_%s",rec_prefix,qualifier);
2292 "MERGE3D",rec_prefix,
2304 sprintf(tag,
"%s_ORDER3D_DATA_%s",rec_prefix,qualifier);
2317 if(trace_corr_tab) {
2367 return cpl_error_get_code();
2381 cpl_matrix *decomp = NULL;
2382 cpl_vector *
filter = NULL;
2383 double orig_filter[3] = {3./8., 1./4., 1./16.};
2384 double *new_filter = NULL;
2385 int filter_size = 3;
2388 cpl_vector *sp = NULL;
2389 cpl_vector *
smooth = NULL;
2391 cpl_vector *tmp_filter = NULL;
2398 check( spec_size = cpl_vector_get_size( spec));
2399 check( decomp = cpl_matrix_new( nscales+1, spec_size));
2400 sp = cpl_vector_duplicate( spec);
2401 smooth = cpl_vector_duplicate( spec);
2402 check(
filter = cpl_vector_wrap( filter_size, orig_filter));
2405 for(k=0; k< nscales; k++){
2411 for(i=0; i<spec_size; i++){
2412 double sp_val, smooth_val;
2414 check( sp_val = cpl_vector_get( sp, i));
2416 check( cpl_matrix_set( decomp, nscales-k, i, sp_val-smooth_val));
2424 check( tmp_filter = cpl_vector_duplicate(
filter));
2426 filter_size = cpl_vector_get_size( tmp_filter);
2427 XSH_CALLOC( new_filter,
double , filter_size*2-1);
2429 for(i=0; i<filter_size; i++){
2430 new_filter[2*i] = cpl_vector_get( tmp_filter, i);
2434 check(
filter = cpl_vector_wrap( filter_size*2-1, new_filter));
2435 filter_size = filter_size*2-1;
2440 for(i=0; i<spec_size; i++){
2443 check( val = cpl_vector_get( sp, i));
2444 check( cpl_matrix_set( decomp, 0, i, val));
2448 if ( cpl_error_get_code() != CPL_ERROR_NONE){
2468 double offset_low,
double offset_up)
2470 cpl_frameset *result = NULL;
2471 cpl_frame *lo_frame = NULL;
2472 const char *lo_name = NULL;
2473 cpl_table *lo_table = NULL;
2474 double *lo_data = NULL;
2475 cpl_frame *up_frame = NULL;
2476 const char *up_name = NULL;
2477 cpl_table *up_table = NULL;
2478 double *up_data = NULL;
2480 cpl_propertylist *lo_header = NULL;
2481 cpl_propertylist *up_header = NULL;
2482 cpl_frame *prod_frame = NULL;
2484 lo_frame = cpl_frameset_get_frame(shiftifu_frameset,0);
2485 lo_name = cpl_frame_get_filename(lo_frame);
2488 check( lo_data = cpl_table_get_data_double( lo_table,
2491 up_frame = cpl_frameset_get_frame(shiftifu_frameset,2);
2492 up_name = cpl_frame_get_filename(up_frame);
2495 check( up_data = cpl_table_get_data_double( up_table,
2498 size = cpl_table_get_nrow( lo_table);
2500 for( i=0; i<
size; i++){
2501 lo_data[i] += offset_low;
2502 up_data[i] += offset_up;
2505 lo_header = cpl_propertylist_load( lo_name,0);
2506 check( cpl_table_save( lo_table, lo_header, NULL,
"tmp_OFFSET_TAB_LOW.fits", CPL_IO_DEFAULT));
2507 up_header = cpl_propertylist_load( up_name,0);
2508 check( cpl_table_save( up_table, up_header, NULL,
"tmp_OFFSET_TAB_UP.fits", CPL_IO_DEFAULT));
2510 result = cpl_frameset_new();
2513 CPL_FRAME_TYPE_TABLE,
2514 CPL_FRAME_GROUP_PRODUCT,
2515 CPL_FRAME_LEVEL_TEMPORARY));
2516 cpl_frameset_insert( result, prod_frame);
2518 check(prod_frame = cpl_frame_duplicate( cpl_frameset_get_frame(shiftifu_frameset,1)));
2519 cpl_frameset_insert( result, prod_frame);
2523 CPL_FRAME_TYPE_TABLE,
2524 CPL_FRAME_GROUP_PRODUCT,
2525 CPL_FRAME_LEVEL_TEMPORARY));
2526 cpl_frameset_insert( result, prod_frame);
2529 if ( cpl_error_get_code() != CPL_ERROR_NONE){
static xsh_instrument * instrument
void xsh_rec_list_free(xsh_rec_list **list)
free memory associated to a rec_list
xsh_rec_list * xsh_rec_list_create(xsh_instrument *instr)
Create an empty order list.
xsh_wavesol * xsh_wavesol_load(cpl_frame *frame, xsh_instrument *instrument)
load a wavelength solution
double xsh_wavesol_eval_poly(xsh_wavesol *sol, double lambda, double order, double slit)
eval the polynomial solution in Y
double xsh_wavesol_eval_polx(xsh_wavesol *sol, double lambda, double order, double slit)
eval the polynomial solution in X
#define XSH_ASSURE_NOT_ILLEGAL(cond)
#define XSH_ASSURE_NOT_NULL(pointer)
const char * xsh_instrument_arm_tostring(xsh_instrument *i)
Get the string associated with an arm.
const char * xsh_arm_tostring(XSH_ARM arm)
Get the string associated with an arm.
XSH_ARM xsh_instrument_get_arm(xsh_instrument *i)
Get an arm on instrument structure.
cpl_error_code xsh_model_config_load_best(cpl_frame *config_frame, xsh_xs_3 *p_xs_3)
Load the config model table and fill the struct.
void xsh_model_get_xy(xsh_xs_3 *p_xs_3, xsh_instrument *instr, double lambda_nm, int morder, double ent_slit_pos, double *x, double *y)
Compute the detector location (floating point pixels) of a given wavelength/entrance slit position.
void xsh_model_binxy(xsh_xs_3 *p_xs_3, int bin_X, int bin_Y)
corrects model for detector's binning
#define xsh_msg_dbg_medium(...)
#define xsh_msg_debug(...)
Print a debug message.
#define xsh_msg_error(...)
Print an error message.
#define xsh_msg(...)
Print a message on info level.
const char * xsh_pfits_get_raw1catg(const cpl_propertylist *plist)
find out the ESO.RAW1.CATG
cpl_error_code xsh_plist_set_extra_keys(cpl_propertylist *plist, const char *hduclas1, const char *hduclas2, const char *hduclas3, const char *scidata, const char *errdata, const char *qualdata, const int type)
set hdu keys
void xsh_pfits_set_pcatg(cpl_propertylist *plist, const char *value)
Write the PCATG value.
double xsh_pfits_get_cdelt3(const cpl_propertylist *plist)
find out the cdelt3
int xsh_pfits_get_binx(const cpl_propertylist *plist)
find out the BINX value
void xsh_pfits_set_extname(cpl_propertylist *plist, const char *value)
Write the EXTNAME value.
double xsh_pfits_get_tel_targ_delta(const cpl_propertylist *plist)
Get the TEL TARG DELTA.
const char * xsh_pfits_get_pcatg(const cpl_propertylist *plist)
find out the pcatg
double xsh_pfits_get_dec(const cpl_propertylist *plist)
Get the Right Ascension.
double xsh_pfits_get_tel_targ_alpha(const cpl_propertylist *plist)
Get the TEL TARG ALPHA.
const char * xsh_pfits_get_obs_targ_name(const cpl_propertylist *plist)
find out the ESO.OBS.TARG.NAME
int xsh_pfits_get_biny(const cpl_propertylist *plist)
find out the BINY value
int xsh_pfits_get_obs_id(cpl_propertylist *plist)
find out the OBS ID
double xsh_pfits_get_ra(const cpl_propertylist *plist)
Get the Right Ascension.
char * xsh_pfits_get_slit_value(const cpl_propertylist *plist, xsh_instrument *instrument)
find out the INS OPTIx NAME value (the width of the slit)
double xsh_pfits_get_posangle(const cpl_propertylist *plist)
find out the value of the CUMOFFSETX keyword in a header
double xsh_pfits_get_crval3(const cpl_propertylist *plist)
find out the crval3
void xsh_unwrap_vector(cpl_vector **v)
Unwrap a vector and set the pointer to NULL.
void xsh_free_vector(cpl_vector **v)
Deallocate a vector and set the pointer to NULL.
void xsh_free_image(cpl_image **i)
Deallocate an image and set the pointer to NULL.
void xsh_free_frame(cpl_frame **f)
Deallocate a frame and set the pointer to NULL.
void xsh_free_frameset(cpl_frameset **f)
Deallocate a frame set and set the pointer to NULL.
double xsh_hms2deg(const double hms)
Convert a double from hours minute seconds to deg:
double xsh_sess2deg(const double sess)
Convert a double from ssessagesimal to deg: 203049.197= 20:30:49.197 = 20.5136658333.
void xsh_free_matrix(cpl_matrix **m)
Deallocate a matrix and set the pointer to NULL.
void xsh_free_table(cpl_table **t)
Deallocate a table and set the pointer to NULL.
void xsh_free_propertylist(cpl_propertylist **p)
Deallocate a property list and set the pointer to NULL.
void xsh_free_imagelist(cpl_imagelist **i)
Deallocate an image list and set the pointer to NULL.
void xsh_add_temporary_file(const char *name)
Add temporary file to temprary files list.
#define QFLAG_MISSING_DATA
#define XSH_PRE_DATA_TYPE
#define XSH_PRE_QUAL_TYPE
#define XSH_PRE_ERRS_TYPE
#define XSH_SPECTRUM_DATA_BPP
#define XSH_SPECTRUM_QUAL_BPP
#define XSH_SPECTRUM_ERRS_BPP
void xsh_add_product_imagelist(cpl_frame *frame, cpl_frameset *frameset, const cpl_parameterlist *parameters, const char *recipe_id, xsh_instrument *instrument, const char *final_prefix)
void xsh_add_product_table(cpl_frame *frame, cpl_frameset *frameset, const cpl_parameterlist *parameters, const char *recipe_id, xsh_instrument *instrument, const char *final_prefix)
Save Table product (input frame has several extensions, 1 table per extension)
cpl_frame * xsh_frame_product(const char *fname, const char *tag, cpl_frame_type type, cpl_frame_group group, cpl_frame_level level)
Creates a frame with given characteristics.
#define XSH_SHIFTIFU_COLNAME_SHIFTSLIT
void smooth(double vec[], long n, int w, double svec[])
int xsh_parameters_cut_uvb_spectrum_get(const char *recipe_id, const cpl_parameterlist *list)
#define XSH_QC_TRACE_FIT_C0
#define XSH_QC_TRACE_FIT_C2
#define XSH_QC_TRACE_FIT_C1
#define XSH_FREE(POINTER)
#define XSH_CALLOC(POINTER, TYPE, SIZE)
static void xsh_plist_set_cd_matrix3(cpl_propertylist **plist, const double cd1_3, const double cd2_3, const double cd3_1, const double cd3_2, const double cd3_3)
set world coordinate system: CD matrix
static cpl_frame * xsh_frame_build_sky_area(cpl_frame *slitmap_frame, const char *tag)
static cpl_error_code xsh_monitor_spectrum3D_flux(cpl_imagelist *data, cpl_imagelist *errs, cpl_imagelist *qual, xsh_instrument *instrument, cpl_propertylist *phead)
Computes flux, err, SNR on IFU cube over full range and sub intervals.
cpl_error_code xsh_cube_set_wcs(cpl_propertylist *plist, float cenLambda, float disp_x, float disp_y, float disp_z, float center_x, float center_y, int center_z)
static double xsh_interpol(double x, double x1, double x2, double y1, double y2)
static cpl_error_code xsh_add_correct_coeff(cpl_table **table, cpl_propertylist *plist, const char *prefix, const int row, const char *col12, const char *col32)
cpl_error_code xsh_table_edges_swap_low_upp(cpl_table **tab)
swap lower and upper edge columns
static cpl_error_code xsh_monitor_spectrum3D_flux_qc(cpl_imagelist *data, cpl_imagelist *errs, cpl_imagelist *qual, cpl_propertylist *phead, const double wave_s, const double wave_e, const int index)
cpl_error_code xsh_build_ifu_cube(cpl_frame *div_frame, cpl_frame *ifu_cfg_tab_frame, cpl_frame *ifu_cfg_cor_frame, cpl_frame *spectral_format_frame, cpl_frame *model_config_frame, cpl_frame *wavesol_frame, xsh_instrument *instrument, cpl_frameset *frameset, cpl_parameterlist *parameters, xsh_rectify_param *rectify_par, const char *recipe_id, const char *rec_prefix, const int frame_is_object)
Reconstruct IFU cube.
void xsh_edge_check(const int px, const int nx, const int rad_x, int *llx, int *urx)
check edge values (llx,urx) fit in image size (1,nx)
cpl_matrix * xsh_atrous(cpl_vector *spec, int nscales)
Do a wavelet decomposition using atrous from IDL.
static void xsh_plist_set_coord3(cpl_propertylist **plist, const int crpix3, const double crval3, const double cdelt3)
set world coordinate system
static void xsh_plist_set_coord2(cpl_propertylist **plist, const double crpix2, const double crval2, const double cdelt2)
set world coordinate system
static void xsh_plist_set_cd_matrix2(cpl_propertylist **plist, const double cd1_1, const double cd1_2, const double cd2_1, const double cd2_2)
set world coordinate system: CD matrix
cpl_table * xsh_table_edge_prepare(const char *name)
Add to edges table columns to store LOW/CEN/UPP object positions.
cpl_frameset * xsh_shift_offsettab(cpl_frameset *shiftifu_frameset, double offset_low, double offset_up)
Do a wavelet decomposition using atrous from IDL.
cpl_error_code xsh_frame_check_model_cfg_is_proper_for_sci(cpl_frame *model_config_frame, cpl_frame *sci_frame, xsh_instrument *instrument)
Check if a model configuration frame has been corrected for flexures.
static void xsh_plist_set_coord1(cpl_propertylist **plist, const double crpix1, const double crval1, const double cdelt1)
set world coordinate system
cpl_error_code xsh_frame_check_model_cfg_is_afc_corrected(cpl_frame *model_config_frame)
utility to check if a frame has been corrected for flexures
cpl_frame * xsh_build_ifu_map(cpl_frame *div_frame, cpl_frame *wavemap_frame, cpl_frame *slitmap_frame, xsh_instrument *instrument)
Reconstruct IFU cube.
static cpl_frame * xsh_frame_build_sky_map(cpl_frame *slitmap_frame, const double value, const char *tag)
cpl_error_code xsh_ifu_trace_object_calibrate(const char *ifu_object_ff_name, const char *order_tab_edges_ifu_name, const char *slit_map_name, const char *wave_map_name)
Function to calibrate object traces in IFU mode.
void xsh_convert_xy_to_ws(double x_centroid, double *p_obj_cen, double *p_slit, double *p_wave, const int lly, const int nx, const int row, double *p_obj_cen_s, double *p_obj_cen_w)
convert X-Y coordinates to Wavelengt Slit space
static cpl_frame * xsh_crea_correct_coeff(cpl_frame *qc_trace_merged_frame, xsh_instrument *inst)
double xsh_image_fit_gaussian_max_pos_x_window(const cpl_image *ima, const int llx, const int urx, const int ypos)
cpl_error_code xsh_frame_image_save2ext(cpl_frame *frm, const char *name_o, const int ext_i, const int ext_o)
cpl_frame * xsh_cube_qc_trace_window(cpl_frame *frm_cube, xsh_instrument *instrument, const char *suffix, const char *rec_prefix, const int win_min, const int win_max, const int hsize, const int method, const int compute_qc)
Trace object position in a cube.
cpl_error_code xsh_iml_merge_wgt(cpl_imagelist **data, cpl_imagelist **errs, cpl_imagelist **qual, const cpl_image *flux_b, const cpl_image *errs_b, const cpl_image *qual_b, const int mk, const int decode_bp)
merge imagelist via average
cpl_error_code xsh_imagelist_cut_dichroic_uvb(cpl_imagelist *org_data_iml, cpl_imagelist *org_errs_iml, cpl_imagelist *org_qual_iml, cpl_propertylist *phead)
#define XSH_TABLE_LOAD(TABLE, NAME)
#define XSH_TABLE_FREE(TABLE)