37 #include "sinfo_utl_cube2spectrum.h"
38 #include "sinfo_functions.h"
39 #include "sinfo_spectrum_ops.h"
40 #include "sinfo_key_names.h"
41 #include "sinfo_pro_save.h"
42 #include "sinfo_utilities_scired.h"
43 #include "sinfo_globals.h"
44 #include "sinfo_error.h"
45 #include "sinfo_utils_wrappers.h"
55 sinfo_change_header(
const char * name);
68 sinfo_change_header(
const char * name) {
72 cpl_propertylist* plist=NULL;
74 plist=cpl_propertylist_load(name,0);
75 cenpix = sinfo_pfits_get_crpix3(plist);
76 cenLambda = sinfo_pfits_get_crval3(plist);
77 dispersion = sinfo_pfits_get_cdelt3(plist);
80 check(cpl_propertylist_set_string(plist,
"CTYPE2",
"WAVE"),
"Setting CTYPE2");
81 check_nomsg(cpl_propertylist_set_comment(plist,
"CTYPE2",
82 "wavelength axis in microns"));
84 check(cpl_propertylist_set_double(plist,
"CRPIX2",(
double)cenpix),
86 check_nomsg(cpl_propertylist_set_comment(plist,
"CRPIX2",
"Reference pixel"));
88 check(cpl_propertylist_set_double(plist,
"CRVAL2",cenLambda),
90 check_nomsg(cpl_propertylist_set_comment(plist,
"CRVAL2",
91 "central wavelength"));
93 check(cpl_propertylist_set_double(plist,
"CDELT2",dispersion),
95 check_nomsg(cpl_propertylist_set_comment(plist,
"CDELT2",
96 "microns per pixel"));
98 check(cpl_propertylist_set_string(plist,
"CUNIT2",
"um"),
"Setting CUNIT2");
99 check_nomsg(cpl_propertylist_set_comment(plist,
"CUNIT2",
"spectral unit"));
101 check(cpl_propertylist_set_string(plist,
"CTYPE1",
"ONESPEC"),
103 check_nomsg(cpl_propertylist_set_comment(plist,
"CTYPE1",
104 "one spectrum in y-direction"));
106 if(cpl_propertylist_has(plist,
"CRPIX1")==1) {
107 check(cpl_propertylist_erase_regexp(plist,
"CRPIX1",0),
"Erasing CRPIX1");
110 if(cpl_propertylist_has(plist,
"CRVAL1")==1) {
111 check(cpl_propertylist_erase_regexp(plist,
"CRVAL1",0),
"Erasing CRVAL1");
114 if(cpl_propertylist_has(plist,
"CDELT1")==1) {
115 check(cpl_propertylist_erase_regexp(plist,
"CDELT1",0),
"Erasing CDELT1");
119 if(cpl_propertylist_has(plist,
"CUNIT1")==1) {
120 check(cpl_propertylist_erase_regexp(plist,
"CUNIT1",0),
"Erasing CUNIT1");
124 if(cpl_propertylist_has(plist,
"CTYPE3")==1) {
125 check(cpl_propertylist_erase_regexp(plist,
"CTYPE3",0),
"Erasing CTYPE3");
129 if(cpl_propertylist_has(plist,
"CRPIX3")==1) {
130 check(cpl_propertylist_erase_regexp(plist,
"CRPIX3",0),
"Erasing CRPIX3");
133 if(cpl_propertylist_has(plist,
"CRVAL3")==1) {
134 check(cpl_propertylist_erase_regexp(plist,
"CRVAL3",0),
"Erasing CRVAL3");
137 if(cpl_propertylist_has(plist,
"CDELT3")==1) {
138 check(cpl_propertylist_erase_regexp(plist,
"CDELT3",0),
"Erasing CDELT3");
141 if(cpl_propertylist_has(plist,
"CUNIT3")==1) {
142 check(cpl_propertylist_erase_regexp(plist,
"CUNIT3",0),
"Erasing CUNIT3");
146 if(cpl_propertylist_has(plist,
"CD1_1")==1) {
147 check(cpl_propertylist_erase_regexp(plist,
"CD1_1",0),
"Erasing CD1_1");
151 if(cpl_propertylist_has(plist,
"CD1_2")==1) {
152 check(cpl_propertylist_erase_regexp(plist,
"CD1_2",0),
"Erasing CD1_2");
155 if(cpl_propertylist_has(plist,
"CD2_1")==1) {
156 check(cpl_propertylist_erase_regexp(plist,
"CD2_1",0),
"Erasing CD2_1");
159 if(cpl_propertylist_has(plist,
"CD2_2")==1) {
160 check(cpl_propertylist_erase_regexp(plist,
"CD2_2",0),
"Erasing CD2_2");
164 sinfo_free_propertylist(&plist);
167 if (cpl_error_get_code())
183 int sinfo_utl_cube2spectrum(
184 cpl_parameterlist * parlist,
185 cpl_frameset * framelist,
188 cpl_parameter * param =NULL;
189 const char * operation =NULL;
190 const char * aperture =NULL;
191 char name_i [MAX_NAME_SIZE];
208 cpl_frame * frm_cub=NULL;
210 char ima_o[MAX_NAME_SIZE];
211 char tbl_o[MAX_NAME_SIZE];
212 char tag_i[MAX_NAME_SIZE];
213 char tag_o[MAX_NAME_SIZE];
214 cpl_propertylist * plist =NULL;
215 cpl_image * image =NULL;
216 cpl_frame * product_frame=NULL;
218 cpl_image * im_spec=NULL;
219 cpl_table * tbl_spec=NULL;
220 cpl_image * img=NULL;
221 cpl_imagelist * cube=NULL;
227 check_nomsg(param=cpl_parameterlist_find(parlist,
228 "sinfoni.sinfo_utl_cube2spectrum.op"));
229 check_nomsg(operation=cpl_parameter_get_string(param));
232 check_nomsg(param=cpl_parameterlist_find(parlist,
233 "sinfoni.sinfo_utl_cube2spectrum.ap"));
234 check_nomsg(aperture=cpl_parameter_get_string(param));
239 strcpy(ima_o,
"out_spec_ima.fits");
240 strcpy(tbl_o,
"out_spec_tbl.fits");
241 strcpy(tag_i,SI_UTL_CUBE2SPECTRUM_CUBE);
242 strcpy(tag_o,SI_UTL_CUBE2SPECTRUM_PROIMA);
244 snprintf(ima_o,MAX_NAME_SIZE-1,
"%s%s",tag,
"_spec_ima.fits");
245 snprintf(tbl_o,MAX_NAME_SIZE-1,
"%s%s",tag,
"_spec_tbl.fits");
246 snprintf(tag_o,MAX_NAME_SIZE-1,
"%s%s",tag,
"_SPCT");
252 check_nomsg(param=cpl_parameterlist_find(parlist,
253 "sinfoni.sinfo_utl_cube2spectrum.llx"));
254 check_nomsg(llx=cpl_parameter_get_int(param));
257 check_nomsg(param=cpl_parameterlist_find(parlist,
258 "sinfoni.sinfo_utl_cube2spectrum.lly"));
259 check_nomsg(lly=cpl_parameter_get_int(param));
262 check_nomsg(param=cpl_parameterlist_find(parlist,
263 "sinfoni.sinfo_utl_cube2spectrum.urx"));
264 check_nomsg(urx=cpl_parameter_get_int(param));
267 check_nomsg(param=cpl_parameterlist_find(parlist,
268 "sinfoni.sinfo_utl_cube2spectrum.ury"));
269 check_nomsg(ury=cpl_parameter_get_int(param));
272 check_nomsg(param=cpl_parameterlist_find(parlist,
273 "sinfoni.sinfo_utl_cube2spectrum.lo_rej"));
274 check_nomsg(lo_rej=cpl_parameter_get_int(param));
277 check_nomsg(param=cpl_parameterlist_find(parlist,
278 "sinfoni.sinfo_utl_cube2spectrum.hi_rej"));
279 check_nomsg(hi_rej=cpl_parameter_get_int(param));
282 check_nomsg(param=cpl_parameterlist_find(parlist,
283 "sinfoni.sinfo_utl_cube2spectrum.centerx"));
284 check_nomsg(centerx=cpl_parameter_get_int(param));
287 check_nomsg(param=cpl_parameterlist_find(parlist,
288 "sinfoni.sinfo_utl_cube2spectrum.centery"));
289 check_nomsg(centery=cpl_parameter_get_int(param));
292 check_nomsg(param=cpl_parameterlist_find(parlist,
293 "sinfoni.sinfo_utl_cube2spectrum.radius"));
294 check_nomsg(radius=cpl_parameter_get_int(param));
297 if (sinfo_dfs_set_groups(framelist)) {
303 cknull(frm_cub=cpl_frameset_find(framelist,tag_i),
304 "SOF does not have a file tagged as %s",tag_i);
308 check_nomsg(strcpy(name_i,cpl_frame_get_filename(frm_cub)));
309 check_nomsg(cube = cpl_imagelist_load((
char*)name_i,CPL_TYPE_FLOAT,0));
311 check_nomsg(img=cpl_imagelist_get(cube,0));
312 check_nomsg(clx=cpl_image_get_size_x(img));
313 check_nomsg(cly=cpl_image_get_size_y(img));
314 check(plist=cpl_propertylist_load(name_i,0),
315 "Cannot read the FITS header") ;
317 cpix = (double) sinfo_pfits_get_crpix3(plist);
318 clam = (double) sinfo_pfits_get_crval3(plist);
319 disp = (double) sinfo_pfits_get_cdelt3(plist);
320 sinfo_free_propertylist(&plist);
321 if(strcmp(aperture,
"rectangle") ==0) {
349 if(strcmp(aperture,
"circle") ==0) {
350 if((centerx-radius) < 0) {
355 if((centery-radius) < 0) {
360 if((centerx+radius) >= clx) {
361 sinfo_msg_error(
"It is not possible to set centerx+radius >= cube x sixe");
365 if((centery+radius) >= cly) {
366 sinfo_msg_error(
"It is not possible to set centery+radius >= cube y size.");
377 if(strcmp(operation,
"average") ==0) {
378 if (strcmp(aperture,
"rectangle") ==0) {
379 spec = sinfo_new_mean_rectangle_of_cube_spectra(cube,llx,lly,urx,ury);
380 }
else if (strcmp(aperture,
"circle")==0) {
381 spec = sinfo_new_mean_circle_of_cube_spectra(cube,centerx,
385 sinfo_msg(
"Supported apertures are only:");
386 sinfo_msg(
"rectangle, circle:");
389 }
else if (strcmp(operation,
"clean_mean") ==0) {
390 if (strcmp(aperture,
"rectangle") == 0) {
391 spec = sinfo_new_clean_mean_rectangle_of_cube_spectra(cube,llx,lly,
394 }
else if (strcmp(aperture,
"circle")==0) {
395 spec = sinfo_new_clean_mean_circle_of_cube_spectra(cube,centerx,
400 sinfo_msg(
"Supported apertures are only:");
401 sinfo_msg(
"rectangle, circle:");
404 }
else if (strcmp(operation,
"median") ==0) {
405 if (strcmp(aperture,
"rectangle")==0) {
406 spec = sinfo_new_median_rectangle_of_cube_spectra(cube,llx,lly,
408 }
else if (strcmp(aperture,
"circle")==0) {
409 spec = sinfo_new_median_circle_of_cube_spectra(cube,centerx,
413 sinfo_msg(
"Supported apertures are only:");
414 sinfo_msg(
"rectangle, circle:");
417 }
else if (strcmp(operation,
"sum") ==0) {
418 if (strcmp(aperture,
"rectangle")==0) {
419 spec = sinfo_new_sum_rectangle_of_cube_spectra(cube,llx,lly,urx,ury);
420 }
else if (strcmp(aperture,
"circle")==0) {
421 spec = sinfo_new_sum_circle_of_cube_spectra(cube,centerx,
425 sinfo_msg(
"Supported apertures are only:");
426 sinfo_msg(
"rectangle, circle:");
429 }
else if (strcmp(operation,
"extract") == 0) {
430 if (strcmp(aperture,
"rectangle")==0) {
431 spec = sinfo_new_median_rectangle_of_cube_spectra(cube,llx,lly,
433 }
else if (strcmp(aperture,
"circle")==0) {
434 spec = sinfo_new_median_circle_of_cube_spectra(cube,centerx,
438 sinfo_msg(
"Supported apertures are only:");
439 sinfo_msg(
"rectangle, circle:");
444 sinfo_msg(
"Supported operations are only:");
445 sinfo_msg(
"average, clean_mean, median, sum, extract :");
448 im_spec = sinfo_new_vector_to_image(spec);
450 sinfo_msg(
"name_i=%s",name_i);
451 ck0_nomsg(sinfo_change_header(name_i));
457 ck0(sinfo_pro_save_ima(im_spec,framelist,framelist,ima_o,
458 tag_o,NULL,cpl_func,parlist),
"failed to save ima");
461 sinfo_new_set_wcs_spectrum (im_spec,ima_o,clam, disp, cpix);
463 sinfo_stectrum_ima2table(im_spec,ima_o,&tbl_spec);
464 ck0(sinfo_pro_save_tbl(tbl_spec,framelist,framelist,tbl_o,
465 tag_o,NULL,cpl_func,parlist),
466 "failed to save spectrum");
469 sinfo_free_propertylist(&plist) ;
470 sinfo_free_frame(&product_frame) ;
471 sinfo_free_image(&image) ;
472 sinfo_free_imagelist(&cube);
473 sinfo_free_image(&im_spec);
477 sinfo_free_table(&tbl_spec);
481 if (cpl_error_get_code())
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.