41 #include <irplib_utils.h>
43 #include <sinfo_tpl_utils.h>
44 #include <sinfo_pfits.h>
45 #include <sinfo_tpl_dfs.h>
46 #include <sinfo_msg.h>
47 #include <sinfo_error.h>
48 #include <sinfo_utils_wrappers.h>
49 #include <sinfo_image_ops.h>
50 #include <sinfo_wave_calibration.h>
51 #include <sinfo_pro_save.h>
52 #include <sinfo_raw_types.h>
53 #include <sinfo_pro_types.h>
54 #include <sinfo_coltilt.h>
55 #include <sinfo_utilities_scired.h>
60 static int sinfo_utl_cube_create_create(cpl_plugin *) ;
61 static int sinfo_utl_cube_create_exec(cpl_plugin *) ;
62 static int sinfo_utl_cube_create_destroy(cpl_plugin *) ;
65 sinfo_cube_create(cpl_parameterlist * parameters, cpl_frameset * frames);
71 static char sinfo_utl_cube_create_description[] =
72 "This recipe perform cubes creation.\n"
73 "The input files are:\n"
74 "A raw frame on tagged as RAW_ON\n"
75 "[optional] A raw frame off RAW_OFF\n"
76 "A wavelength map, tagged as WAVE_MAP\n"
77 "A wavelength map, tagged as WAVE_MAP\n"
78 "A distortion table, tagged as DISTORTION\n"
79 "A slitlets position table, tagged as SLIT_POS\n"
103 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe ) ;
104 cpl_plugin * plugin = &recipe->interface ;
106 cpl_plugin_init(plugin,
108 SINFONI_BINARY_VERSION,
109 CPL_PLUGIN_TYPE_RECIPE,
110 "sinfo_utl_cube_create",
112 sinfo_utl_cube_create_description,
114 "Andrea.Modigliani@eso.org",
116 sinfo_utl_cube_create_create,
117 sinfo_utl_cube_create_exec,
118 sinfo_utl_cube_create_destroy) ;
120 cpl_pluginlist_append(list, plugin) ;
135 static int sinfo_utl_cube_create_create(cpl_plugin * plugin)
137 cpl_recipe * recipe ;
139 cpl_parameterlist * list ;
142 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
143 recipe = (cpl_recipe *)plugin ;
149 recipe->parameters = cpl_parameterlist_new() ;
151 list=recipe->parameters;
156 p = cpl_parameter_new_value(
"sinfoni.objnod.jitter_index",
158 "jitter mode indicator: "
159 "TRUE: Auto-Jitter, "
160 "FALSE: user defined jitter. "
161 "The size_x size_y kernel_type parameters "
162 "are only used if jitterInd is set to yes, "
163 "that means in auto-jittering mode.",
167 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"objnod-jit_ind");
168 cpl_parameterlist_append(list, p);
185 p = cpl_parameter_new_enum(
"sinfoni.objnod.kernel_type",
188 "the name of the interpolation kernel to shift "
189 "the single cubes to the correct places inside "
190 "the big combined cube",
194 "NULL",
"default",
"tanh",
"sinc2",
195 "lanczos",
"hamming",
"hann");
197 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"objnod-kernel_typ");
198 cpl_parameterlist_append(list, p);
202 p = cpl_parameter_new_value(
"sinfoni.objnod.n_coeffs",
204 "number of coefficients for the polynomial "
209 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"objnod-no_coeffs");
210 cpl_parameterlist_append(list, p);
216 p = cpl_parameter_new_value(
"sinfoni.objnod.nord_south_index",
218 "Nord South Index Switch: "
219 "indicates if the slitlet distances are "
220 "determined by a north-south-test (TRUE) "
221 "or slitlet edge fits (FALSE)",
226 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"objnod-ns_ind");
227 cpl_parameterlist_append(list, p);
234 p = cpl_parameter_new_value(
"sinfoni.objnod.flux_cor",
241 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"objnod-flux_cor");
242 cpl_parameterlist_append(list, p);
249 p = cpl_parameter_new_enum(
"sinfoni.objnod.fine_tuning_method",
251 "Fine Tuning Method: "
252 "indicator for the shifting method to use "
253 "(P: polynomial interpolation, "
255 " S: cubic spline interpolation)",
261 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"objnod-fine_tune_mtd");
262 cpl_parameterlist_append(list, p);
264 p = cpl_parameter_new_value(
"sinfoni.objnod.order",
266 "Fine Tuning polynomial order: "
267 "order of the polynomial if the polynomial "
268 "interpolation shifting method is used.",
272 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"objnod-order");
273 cpl_parameterlist_append(list, p);
290 static int sinfo_utl_cube_create_exec(cpl_plugin * plugin)
292 cpl_recipe * recipe ;
294 cpl_errorstate initial_errorstate = cpl_errorstate_get();
297 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
298 recipe = (cpl_recipe *)plugin ;
300 sinfo_msg(
"Welcome to SINFONI Pipeline release %d.%d.%d",
301 SINFONI_MAJOR_VERSION,SINFONI_MINOR_VERSION,SINFONI_MICRO_VERSION);
303 result=sinfo_cube_create(recipe->parameters, recipe->frames) ;
304 if (!cpl_errorstate_is_equal(initial_errorstate)) {
307 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
319 static int sinfo_utl_cube_create_destroy(cpl_plugin * plugin)
321 cpl_recipe * recipe ;
324 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
325 recipe = (cpl_recipe *)plugin ;
328 cpl_parameterlist_delete(recipe->parameters) ;
342 sinfo_cube_create(cpl_parameterlist * parameters, cpl_frameset * frames)
345 cpl_frame* frm_raw_on=NULL;
346 cpl_frame* frm_raw_off=NULL;
347 cpl_frame* frm_wav_map=NULL;
348 cpl_frame* frm_mflat=NULL;
349 cpl_frame* frm_distortion=NULL;
350 cpl_frame* frm_slit_pos=NULL;
351 cpl_frame* frm_slitlets_distance=NULL;
353 cpl_image* ima_raw_on=NULL;
354 cpl_image* ima_raw_off=NULL;
355 cpl_image* ima_wav_map=NULL;
356 cpl_image* ima_mflat=NULL;
357 cpl_image* ima_mflat_dist=NULL;
358 cpl_image* ima_obj_mflat=NULL;
359 cpl_image* ima_obj_dist=NULL;
360 cpl_image* ima_obj_res=NULL;
361 cpl_image* ima_wav_res=NULL;
362 cpl_image* ima_wav_dif=NULL;
364 cpl_imagelist* cube=NULL;
365 cpl_imagelist* outcube=NULL;
366 cpl_imagelist* outcube2=NULL;
383 float** slit_edges=NULL;
384 float* distances=NULL;
385 float* correct_dist=NULL;
395 cpl_parameter* p=NULL;
398 const char* fine_tuning_method=NULL;
399 int fine_tuning_pol_order=0;
404 check(sinfo_dfs_set_groups(frames),
405 "Cannot identify RAW and CALIB frames") ;
407 check_nomsg(p=cpl_parameterlist_find(parameters,
408 "sinfoni.objnod.flux_cor"));
409 check_nomsg(flux_cor=cpl_parameter_get_bool(p));
411 check_nomsg(p=cpl_parameterlist_find(parameters,
412 "sinfoni.objnod.kernel_type"));
413 check_nomsg(strcpy(kernel,cpl_parameter_get_string(p)));
415 check_nomsg(p=cpl_parameterlist_find(parameters,
"sinfoni.objnod.n_coeffs"));
416 check_nomsg(n_coeffs=cpl_parameter_get_int(p));
419 check_nomsg(p=cpl_parameterlist_find(parameters,
420 "sinfoni.objnod.nord_south_index"));
421 check_nomsg(ns_index=cpl_parameter_get_bool(p));
424 check_nomsg(p=cpl_parameterlist_find(parameters,
425 "sinfoni.objnod.fine_tuning_method"));
426 check_nomsg(fine_tuning_method=cpl_parameter_get_string(p));
428 check_nomsg(p=cpl_parameterlist_find(parameters,
429 "sinfoni.objnod.order"));
430 check_nomsg(fine_tuning_pol_order=cpl_parameter_get_int(p));
433 cknull(frm_raw_on=cpl_frameset_find(frames,RAW_ON),
434 "Missing required input %s",RAW_ON);
435 cknull(frm_raw_off=cpl_frameset_find(frames,RAW_OFF),
436 "Missing required input %s",RAW_OFF);
437 cknull(frm_wav_map=cpl_frameset_find(frames,PRO_WAVE_MAP),
438 "Missing required input %s",PRO_WAVE_MAP);
439 cknull(frm_mflat=cpl_frameset_find(frames,PRO_MASTER_FLAT_LAMP),
440 "Missing required input %s",PRO_WAVE_MAP);
442 check_nomsg(frm_distortion=cpl_frameset_find(frames,PRO_DISTORTION));
443 check_nomsg(frm_slit_pos=cpl_frameset_find(frames,PRO_SLIT_POS));
444 check_nomsg(frm_slitlets_distance=
445 cpl_frameset_find(frames,PRO_SLITLETS_DISTANCE));
447 strcpy(pos_list,cpl_frame_get_filename(frm_slit_pos));
448 strcpy(dist_list,cpl_frame_get_filename(frm_slitlets_distance));
449 strcpy(poly_file,cpl_frame_get_filename(frm_distortion));
452 check_nomsg(ima_raw_on=cpl_image_load(cpl_frame_get_filename(frm_raw_on),
453 CPL_TYPE_FLOAT,0,0));
455 check_nomsg(ima_raw_off=cpl_image_load(cpl_frame_get_filename(frm_raw_off),
456 CPL_TYPE_FLOAT,0,0));
459 check_nomsg(ima_wav_map=cpl_image_load(cpl_frame_get_filename(frm_wav_map),
460 CPL_TYPE_FLOAT,0,0));
462 check_nomsg(ima_mflat=cpl_image_load(cpl_frame_get_filename(frm_mflat),
463 CPL_TYPE_FLOAT,0,0));
467 check_nomsg(cpl_image_subtract(ima_raw_on,ima_raw_off));
468 cpl_image_save(ima_raw_on,
"ima_sub.fits", CPL_BPP_IEEE_FLOAT,
469 NULL,CPL_IO_DEFAULT);
471 cknull_nomsg(ima_obj_mflat=sinfo_new_div_images_robust(ima_raw_on,
473 cpl_image_save(ima_obj_mflat,
"ima_obj_mflat.fits", CPL_BPP_IEEE_FLOAT,
474 NULL,CPL_IO_DEFAULT);
478 cknull_nomsg(ima_mflat_dist=sinfo_new_image_warp_fits(ima_mflat,kernel,
481 cpl_image_save(ima_mflat_dist,
"ima_mflat_dist.fits", CPL_BPP_IEEE_FLOAT,
482 NULL,CPL_IO_DEFAULT);
484 cknull_nomsg(ima_obj_dist=sinfo_new_image_warp_fits(ima_obj_mflat,
488 cpl_image_save(ima_obj_dist,
"ima_obj_dist.fits", CPL_BPP_IEEE_FLOAT,
489 NULL,CPL_IO_DEFAULT);
491 cknull(ima_obj_res = sinfo_new_defined_resampling(ima_obj_dist,
500 " sinfo_definedResampling() failed" ) ;
504 cpl_image_save(ima_obj_res,
"ima_obj_res.fits", CPL_BPP_IEEE_FLOAT,
505 NULL,CPL_IO_DEFAULT);
509 nx=cpl_image_get_size_x(ima_wav_map);
510 ny=cpl_image_get_size_y(ima_wav_map);
512 check_nomsg(ima_wav_dif=cpl_image_new(nx,ny,CPL_TYPE_FLOAT));
513 pw=cpl_image_get_data(ima_wav_map);
514 pd=cpl_image_get_data(ima_wav_dif);
517 for(i=1;i<nx-1;i++) {
518 for(j=1;j<ny-1;j++) {
519 if(!isnan(pd[nx*j+i])) {
520 pd[nx*j+i]=2.0*dis/(pw[nx*(j+1)+i]-pw[nx*(j-1)+i]);
524 pd[i]=dis/(pw[nx+i]-pw[i]);
526 if(!isnan(pd[nx*(ny-1)+i])) {
527 pd[nx*(ny-1)+i]=dis/(pw[nx*(ny-1)+i]-pw[nx*(ny-2)+i]);
537 cknull(ima_wav_res = sinfo_new_defined_resampling(ima_wav_dif,
546 " sinfo_definedResampling() failed" ) ;
549 sinfo_msg(
"Apply flux correction");
550 cpl_image_divide(ima_obj_res,ima_wav_res);
559 cpl_image_save(ima_wav_res,
"ima_wav_res.fits", CPL_BPP_IEEE_FLOAT,
560 NULL,CPL_IO_DEFAULT);
570 sinfo_msg(
"Apply flux correction");
571 cpl_image_divide(ima_obj_res,ima_wav_res);
579 sinfo_msg(
"cfg->northsouthInd == 0");
580 cknull(slit_edges=sinfo_read_slitlets_edges(nslits,pos_list),
581 "error reading slitlets edges");
583 sinfo_msg(
"cfg->northsouthInd != 0");
584 cknull(distances = sinfo_read_distances(nslits,dist_list),
585 "error reading distances");
588 cknull(correct_dist = (
float*) cpl_calloc(nslits,
sizeof (
float)),
589 " could not allocate memory!") ;
591 sinfo_msg(
"Create cube object");
594 cknull(cube = sinfo_new_make_cube_spi(ima_obj_res,slit_edges,
596 "could not construct data cube!") ;
599 cknull(cube = sinfo_new_make_cube_dist(ima_obj_res,fcol,distances,
601 "could not construct a data cube!") ;
603 sinfo_free_image(&ima_obj_res);
606 cknull(outcube2=sinfo_new_fine_tune(cube,
609 fine_tuning_pol_order,
611 " could not fine tune the data cube") ;
613 sinfo_msg(
"Stretch output cube along Y direction");
614 cknull(outcube = sinfo_new_bin_cube(outcube2,1,2,0,63,0,63),
615 "Error binning cube");
616 sinfo_free_imagelist(&cube);
618 ck0(sinfo_pro_save_ims(outcube,frames,frames,
"out_cube.fits",
"CUBE",NULL,
619 "sinfo_utl_cube_create",parameters),
620 "cannot save cube %s",
"out_cube.fits");
623 check_nomsg(center_x = cpl_image_get_size_x(
624 cpl_imagelist_get(outcube,0))/2.+0.5) ;
625 check_nomsg(center_y = cpl_image_get_size_y(
626 cpl_imagelist_get(outcube,0))/2.+0.5 );
628 sinfo_new_set_wcs_cube(outcube,
"out_cube.fits", cwav, dis,
629 cpix, center_x, center_y);
635 if(slit_edges != NULL) {
636 sinfo_new_destroy_2Dfloatarray(&slit_edges,nslits);
639 if (distances != NULL ) {
640 sinfo_new_destroy_array(&distances);
647 sinfo_free_float(&correct_dist) ;
648 sinfo_free_imagelist(&cube);
649 sinfo_free_imagelist(&outcube);
650 sinfo_free_imagelist(&outcube2);
651 sinfo_free_image(&ima_raw_on);
652 sinfo_free_image(&ima_raw_off);
653 sinfo_free_image(&ima_wav_map);
654 sinfo_free_image(&ima_mflat);
655 sinfo_free_image(&ima_mflat_dist);
656 sinfo_free_image(&ima_obj_res);
657 sinfo_free_image(&ima_obj_mflat);
658 sinfo_free_image(&ima_obj_dist);
659 sinfo_free_image(&ima_obj_res);
660 sinfo_free_image(&ima_wav_res);
661 sinfo_free_image(&ima_wav_dif);