33#include "kmclipm_math.h"
35#include "kmo_constants.h"
36#include "kmo_cpl_extensions.h"
38#include "kmo_functions.h"
39#include "kmo_priv_std_star.h"
40#include "kmo_priv_fit_profile.h"
41#include "kmo_priv_extract_spec.h"
42#include "kmo_priv_functions.h"
46#include "kmo_priv_reconstruct.h"
48const int nr_lines_h = 10;
49const double lines_center_h[] = {
61const double lines_width_h[] = {
73const int nr_lines_k = 2;
74const double lines_center_k[] = {
78const double lines_width_k[] = {
82const int nr_lines_hk = 12;
83const double lines_center_hk[] = {
97const double lines_width_hk[] = {
111const int nr_lines_iz = 12;
112const double lines_center_iz[] = {
126const double lines_width_iz[] = {
140const int nr_lines_yj = 7;
141const double lines_center_yj[] = {
150const double lines_width_yj[] = {
164static int kmos_std_star_compute_ifu(
165 cpl_propertylist * sub_header_orig,
166 cpl_frame * obj_frame,
167 cpl_frame * sky_frame,
168 cpl_frame * flat_frame,
169 cpl_frame * xcal_frame,
170 cpl_frame * ycal_frame,
171 cpl_frame * lcal_frame,
172 cpl_frame * illum_frame,
173 cpl_frame * atmos_frame,
174 cpl_frame * solar_frame,
176 cpl_propertylist * main_header_tel,
180 const char * fmethod,
182 int xcal_interpolation,
183 const char * mask_method,
184 const char * cmethod,
193 const char * filter_id,
196 int is_stdstarscipatt,
197 skySkyStruct sky_sky_struct,
199 cpl_vector ** spec_qc,
200 cpl_propertylist ** out_sub_tel_data_header,
201 cpl_propertylist ** out_sub_psf_header,
202 cpl_propertylist ** out_sub_cube_data_header,
203 cpl_imagelist ** out_data_cube,
204 cpl_imagelist ** out_noise_cube,
205 cpl_image ** out_psf_data,
206 cpl_image ** out_mask,
207 cpl_vector ** out_starspec_data,
208 cpl_vector ** out_starspec_noise,
209 cpl_vector ** out_noisespec,
210 cpl_vector ** out_telluric_data,
211 cpl_vector ** out_telluric_noise) ;
212static int kmos_std_star_check_inputs(
213 cpl_frameset * frameset,
214 const char * magnitude_txt,
215 int * is_stdstarscipatt,
218 double * magnitude2) ;
219static int kmos_std_star_plot(
void) ;
220static int kmos_std_star_adjust_double(
221 cpl_propertylist * header,
225static int kmos_std_star_adjust_string(
226 cpl_propertylist * header,
230static cpl_frameset * kmos_std_star_extract_same_grat_stds(
232 int * same_gratings) ;
234static int kmos_std_star_create(cpl_plugin *);
235static int kmos_std_star_exec(cpl_plugin *);
236static int kmos_std_star_destroy(cpl_plugin *);
237static int kmos_std_star(cpl_parameterlist *, cpl_frameset *);
243static char kmos_std_star_description[] =
244"This recipe creates a telluric frame and a PSF frames.\n"
245"Since there cannot be 1 std star per IFU in one exposure, we use several\n"
246"exposures in order to have at least one standard star and one sky\n"
247"in each IFU. The frames are organised following this logic:\n"
248"1. For each IFU the first standard star in the list of frames is\n"
249" taken. All subsequent standard star exposures for this IFU are ignored\n"
250"2. A closest in time sky exposure is uѕed\n"
251"3. IFUs not containing a standard star and a sky will be empty in the result\n"
253"NOISE_SPEC contains the shot noise [sqrt(counts*gain)/gain]\n"
254"If the exposures have been taken with KMOS_spec_cal_stdstarscipatt, an\n"
255"additional noise component is added: All existing sky exposures for an IFU\n"
256"are subtracted pairwise, spectra are extracted and the std deviation is \n"
259"-------------------------------------------------------------------------------\n"
263" category Type Explanation Required #Frames\n"
264" -------- ----- ----------- -------- -------\n"
265" STD RAW Std. star & sky exposures Y >=1 \n"
266" XCAL F2D x calibration frame Y 1 \n"
267" YCAL F2D y calibration frame Y 1 \n"
268" LCAL F2D Wavelength calib. frame Y 1 \n"
269" MASTER_FLAT F2D Master flat frame Y 1 \n"
270" WAVE_BAND F2L Table with start-/end-wl Y 1 \n"
271" ILLUM_CORR F2I Illumination correction N 0,1 \n"
272" SOLAR_SPEC F1S Solar spectrum N 0,1 \n"
273" (only for G stars) \n"
274" ATMOS_MODEL F1S Model atmospheric transmisson N 0,1 \n"
275" (only for OBAF stars in K band) \n"
276" SPEC_TYPE_LOOKUP F2L LUT eff. stellar temperature N 0,1 \n"
281" category Type Explanation \n"
282" -------- ----- ----------- \n"
283" TELLURIC F1I The normalised telluric spectrum \n"
284" (including errors) \n"
285" STAR_SPEC F1I The extracted star spectrum \n"
286" (including errors) \n"
287" STD_IMAGE F2I The standard star PSF images \n"
288" STD_MASK F2I The mask used to extract the star spec \n"
289" NOISE_SPEC F1I The extracted noise spectrum \n"
290"---------------------------------------------------------------------------\n"
317 cpl_recipe *recipe = cpl_calloc(1,
sizeof *recipe);
318 cpl_plugin *plugin = &recipe->interface;
320 cpl_plugin_init(plugin,
323 CPL_PLUGIN_TYPE_RECIPE,
325 "Create the telluric correction frame.",
326 kmos_std_star_description,
327 "Alex Agudo Berbel, Y. Jung",
328 "https://support.eso.org/",
330 kmos_std_star_create,
332 kmos_std_star_destroy);
333 cpl_pluginlist_append(list, plugin);
347static int kmos_std_star_create(cpl_plugin *plugin)
353 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
354 recipe = (cpl_recipe *)plugin;
359 recipe->parameters = cpl_parameterlist_new();
362 p = cpl_parameter_new_value(
"kmos.kmos_std_star.startype", CPL_TYPE_STRING,
363 "The spectral type of the star (O, B, A, F, G) e.g. G4V",
364 "kmos.kmos_std_star",
"");
365 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"startype");
366 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
367 cpl_parameterlist_append(recipe->parameters, p);
370 p = cpl_parameter_new_value(
"kmos.kmos_std_star.imethod", CPL_TYPE_STRING,
371 "Method to use for interpolation. "
372 "[\"NN\" (nearest neighbour), "
373 "\"lwNN\" (linear weighted nearest neighbor), "
374 "\"swNN\" (square weighted nearest neighbor), "
375 "\"MS\" (Modified Shepard's method), "
376 "\"CS\" (Cubic spline)]",
377 "kmos.kmos_std_star",
"CS");
378 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"imethod");
379 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
380 cpl_parameterlist_append(recipe->parameters, p);
383 p = cpl_parameter_new_value(
"kmos.kmos_std_star.fmethod", CPL_TYPE_STRING,
384 "Fitting method (gauss, moffat, profile",
"kmos.kmos_std_star",
386 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"fmethod");
387 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
388 cpl_parameterlist_append(recipe->parameters, p);
391 p = cpl_parameter_new_value(
"kmos.kmos_std_star.neighborhoodRange",
393 "Defines the range to search for neighbors in pixels",
394 "kmos.kmos_std_star", 1.001);
395 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"neighborhoodRange");
396 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
397 cpl_parameterlist_append(recipe->parameters, p);
400 p = cpl_parameter_new_value(
"kmos.kmos_std_star.magnitude", CPL_TYPE_STRING,
401 "Star magnitude (2 values in HK, eg. 12.1,13.2)",
402 "kmos.kmos_std_star",
"");
403 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"magnitude");
404 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
405 cpl_parameterlist_append(recipe->parameters, p);
408 p = cpl_parameter_new_value(
"kmos.kmos_std_star.flux", CPL_TYPE_BOOL,
409 "TRUE: Apply flux conservation. FALSE: otherwise",
410 "kmos.kmos_std_star", TRUE);
411 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"flux");
412 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
413 cpl_parameterlist_append(recipe->parameters, p);
416 p = cpl_parameter_new_value(
"kmos.kmos_std_star.save_cubes", CPL_TYPE_BOOL,
417 "Flag to save reconstructed cubes",
"kmos.kmos_std_star", FALSE);
418 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"save_cubes");
419 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
420 cpl_parameterlist_append(recipe->parameters, p);
423 p = cpl_parameter_new_value(
"kmos.kmos_std_star.no_noise", CPL_TYPE_BOOL,
424 "Skip the noise computation on sky exposures",
"kmos.kmos_std_star",
426 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"no_noise");
427 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
428 cpl_parameterlist_append(recipe->parameters, p);
431 p = cpl_parameter_new_value(
"kmos.kmos_std_star.xcal_interpolation",
432 CPL_TYPE_BOOL,
"Flag to Interpolate xcal between rotator angles",
433 "kmos.kmos_std_star", TRUE);
434 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"xcal_interpolation");
435 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
436 cpl_parameterlist_append(recipe->parameters, p);
439 p = cpl_parameter_new_value(
"kmos.kmos_std_star.suppress_extension",
440 CPL_TYPE_BOOL,
"Flag to Suppress filename extension",
441 "kmos.kmos_std_star", FALSE);
442 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"suppress_extension");
443 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
444 cpl_parameterlist_append(recipe->parameters, p);
447 kmos_band_pars_create(recipe->parameters,
"kmos.kmos_std_star");
450 p = cpl_parameter_new_value(
"kmos.kmos_std_star.mask_method",
451 CPL_TYPE_STRING,
"Method used : mask, integrated or optimal",
452 "kmos.kmos_std_star",
"optimal");
453 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"mask_method");
454 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
455 cpl_parameterlist_append(recipe->parameters, p);
458 p = cpl_parameter_new_value(
"kmos.kmos_std_star.centre",
459 CPL_TYPE_STRING,
"The centre of the circular mask (pixel)",
460 "kmos.kmos_std_star",
"7.5,7.5");
461 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"centre");
462 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
463 cpl_parameterlist_append(recipe->parameters, p);
466 p = cpl_parameter_new_value(
"kmos.kmos_std_star.radius",
467 CPL_TYPE_DOUBLE,
"The radius of the circular mask (pixel)",
468 "kmos.kmos_std_star", 3.0);
469 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"radius");
470 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
471 cpl_parameterlist_append(recipe->parameters, p);
474 p = cpl_parameter_new_value(
"kmos.kmos_std_star.extra_outputs",
475 CPL_TYPE_BOOL,
"Flag to save extra outputs",
476 "kmos.kmos_std_star", FALSE);
477 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"extra_outputs");
478 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
479 cpl_parameterlist_append(recipe->parameters, p);
482 return kmos_combine_pars_create(recipe->parameters,
"kmos.kmos_std_star",
483 DEF_REJ_METHOD, FALSE);
493static int kmos_std_star_exec(cpl_plugin *plugin)
498 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
499 recipe = (cpl_recipe *)plugin;
502 return kmos_std_star(recipe->parameters, recipe->frames);
512static int kmos_std_star_destroy(cpl_plugin *plugin)
517 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
518 recipe = (cpl_recipe *)plugin;
521 cpl_parameterlist_delete(recipe->parameters);
539static int kmos_std_star(cpl_parameterlist *parlist, cpl_frameset *frameset)
541 const cpl_parameter * par ;
544 const char * imethod ;
545 const char * cmethod ;
546 const char * fmethod ;
547 const char * mask_method ;
548 const char * centre_txt ;
549 cpl_vector * centre ;
550 const char * spec_type ;
551 const char * magnitude_txt ;
552 double cpos_rej, cneg_rej, neighborhoodRange;
553 double cen_x = 0., cen_y = 0., radius = 0.;
554 int flux, save_cubes, no_noise, citer, cmin, cmax,
555 xcal_interpolation, suppress_extension,
562 const char * filter_id ;
563 cpl_array ** unused_ifus_before ;
564 cpl_array ** unused_ifus_after ;
565 const int * punused_ifus ;
567 cpl_propertylist * tmp_header ;
568 cpl_propertylist * main_header_tel ;
569 cpl_propertylist * sub_header_orig ;
570 cpl_propertylist * main_header_psf ;
572 objSkyStruct * obj_sky_struct ;
573 skySkyStruct * sky_sky_struct ;
575 cpl_imagelist ** stored_data_cube ;
576 cpl_imagelist ** stored_noise_cube ;
577 cpl_image ** stored_psf_data ;
578 cpl_image ** stored_mask ;
579 cpl_vector ** stored_telluric_data ;
580 cpl_vector ** stored_telluric_noise ;
581 cpl_vector ** stored_starspec_data ;
582 cpl_vector ** stored_starspec_noise ;
583 cpl_vector ** stored_noisespec ;
584 double * stored_qc_throughput ;
585 cpl_propertylist ** stored_sub_tel_data_headers ;
586 cpl_propertylist ** stored_sub_tel_noise_headers ;
587 cpl_propertylist ** stored_sub_cube_data_headers ;
588 cpl_propertylist ** stored_sub_cube_noise_headers ;
589 cpl_propertylist ** stored_sub_psf_headers ;
590 char filename_telluric[256],
591 filename_starspec[256],
595 filename_noise[256] ;
596 cpl_frame * obj_frame ;
597 cpl_frame * sky_frame ;
598 cpl_frame * xcal_frame ;
599 cpl_frame * ycal_frame ;
600 cpl_frame * lcal_frame ;
601 cpl_frame * flat_frame ;
602 cpl_frame * illum_frame ;
603 cpl_frame * solar_frame ;
604 cpl_frame * atmos_frame ;
605 cpl_table * band_table ;
606 cpl_frameset * frameset_std ;
607 cpl_vector * spec_qc ;
608 int is_stdstarscipatt, compute_qcs,
609 ifu_nr, nifus, nr_std_stars ;
610 double magnitude1, magnitude2, star_temp, exptime,
611 throughput_mean, throughput_sdv, cdelt1, crpix1,
612 crval1, zeropoint, tmp_data, tmp_noise, counts1,
616 kmclipm_vector * ddd ;
620 if (kmos_check_and_set_groups(frameset) != CPL_ERROR_NONE) {
621 return cpl_error_get_code();
626 zeropoint = throughput_mean = throughput_sdv = -1.0 ;
627 magnitude1 = magnitude2 = -1.0 ;
630 par = cpl_parameterlist_find_const(parlist,
631 "kmos.kmos_std_star.extra_outputs");
632 extra_outputs = cpl_parameter_get_bool(par);
633 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.imethod");
634 imethod = cpl_parameter_get_string(par) ;
635 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.startype");
636 spec_type = cpl_parameter_get_string(par) ;
637 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.fmethod");
638 fmethod = cpl_parameter_get_string(par) ;
639 par = cpl_parameterlist_find_const(parlist,
640 "kmos.kmos_std_star.neighborhoodRange");
641 neighborhoodRange = cpl_parameter_get_double(par) ;
642 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.magnitude");
643 magnitude_txt = cpl_parameter_get_string(par) ;
644 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.flux");
645 flux = cpl_parameter_get_bool(par);
646 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.save_cubes");
647 save_cubes = cpl_parameter_get_bool(par);
648 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.no_noise");
649 no_noise = cpl_parameter_get_bool(par);
650 par = cpl_parameterlist_find_const(parlist,
651 "kmos.kmos_std_star.xcal_interpolation");
652 xcal_interpolation = cpl_parameter_get_bool(par);
653 par = cpl_parameterlist_find_const(parlist,
654 "kmos.kmos_std_star.suppress_extension");
655 suppress_extension = cpl_parameter_get_bool(par);
656 kmos_band_pars_load(parlist,
"kmos.kmos_std_star");
657 par = cpl_parameterlist_find_const(parlist,
658 "kmos.kmos_std_star.mask_method");
659 mask_method = cpl_parameter_get_string(par) ;
660 if (!strcmp(mask_method,
"integrated")) {
661 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.centre");
662 centre_txt = cpl_parameter_get_string(par) ;
663 centre = kmo_identify_ranges(centre_txt);
664 if (cpl_vector_get_size(centre) != 2) {
665 cpl_msg_error(__func__,
"centre must have 2 values like a,b") ;
666 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
669 cen_x = cpl_vector_get(centre, 0);
670 cen_y = cpl_vector_get(centre, 1);
671 cpl_vector_delete(centre);
672 par = cpl_parameterlist_find_const(parlist,
"kmos.kmos_std_star.radius");
673 radius = cpl_parameter_get_double(par) ;
675 cpl_msg_error(__func__,
"radius must be greater than 0.0") ;
676 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
679 }
else if (strcmp(mask_method,
"optimal")) {
680 cpl_msg_error(__func__,
"Unsupported mask method: %s", mask_method) ;
681 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
684 kmos_combine_pars_load(parlist,
"kmos.kmos_std_star", &cmethod,
685 &cpos_rej, &cneg_rej, &citer, &cmin, &cmax, FALSE);
688 if (strcmp(cmethod,
"average") && strcmp(cmethod,
"median") &&
689 strcmp(cmethod,
"sum") && strcmp(cmethod,
"min_max") &&
690 strcmp(cmethod,
"ksigma")) {
691 cpl_msg_error(__func__,
692 "cmethod must be average median sum min_max or ksigma") ;
693 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
696 if (strcmp(imethod,
"NN") && strcmp(imethod,
"lwNN") &&
697 strcmp(imethod,
"swNN") && strcmp(imethod,
"MS") &&
698 strcmp(imethod,
"CS")) {
699 cpl_msg_error(__func__,
"imethod must be NN,lwNN,swNN,MS or CS") ;
700 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
703 if (strcmp(fmethod,
"gauss") && strcmp(fmethod,
"moffat")) {
704 cpl_msg_error(__func__,
"fmethod must be gauss or moffat") ;
705 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
708 if (neighborhoodRange <= 0.0) {
709 cpl_msg_error(__func__,
"neighborhoodRange must be greater than 0.0") ;
710 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
715 if (kmos_std_star_check_inputs(frameset, magnitude_txt, &is_stdstarscipatt,
716 &compute_qcs, &magnitude1, &magnitude2) != 1) {
717 cpl_msg_error(__func__,
"Input frameset is not consistent") ;
718 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
723 suffix = kmo_dfs_get_suffix(kmo_dfs_get_frame(frameset, STD), TRUE, FALSE);
724 cpl_msg_info(
"",
"Detected instrument setup: %s", suffix+1);
727 unused_ifus_before = kmo_get_unused_ifus(frameset, 0, 0);
728 unused_ifus_after = kmo_duplicate_unused_ifus(unused_ifus_before);
729 kmo_print_unused_ifus(unused_ifus_before, FALSE);
730 kmo_free_unused_ifus(unused_ifus_before);
733 kmclipm_setup_grid(&gd, imethod, neighborhoodRange, KMOS_PIX_RESOLUTION,0.);
736 tmp_header = kmo_dfs_load_primary_header(frameset, XCAL);
737 bounds = kmclipm_extract_bounds(tmp_header);
738 cpl_propertylist_delete(tmp_header);
741 frameset_std = kmos_std_star_extract_same_grat_stds(frameset, &i) ;
744 obj_sky_struct = kmo_create_objSkyStruct(frameset_std, STD, FALSE);
745 kmo_print_objSkyStruct(obj_sky_struct);
748 if (obj_sky_struct->size == 0) {
751 kmo_free_unused_ifus(unused_ifus_after);
752 cpl_frameset_delete(frameset_std) ;
753 cpl_msg_error(cpl_func,
"No Object found");
754 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
759 sky_sky_struct = kmo_create_skySkyStruct(frameset_std);
762 illum_frame = kmo_dfs_get_frame(frameset, ILLUM_CORR);
763 flat_frame = kmo_dfs_get_frame(frameset, MASTER_FLAT);
764 xcal_frame = kmo_dfs_get_frame(frameset, XCAL) ;
765 ycal_frame = kmo_dfs_get_frame(frameset, YCAL) ;
766 lcal_frame = kmo_dfs_get_frame(frameset, LCAL) ;
767 atmos_frame = kmo_dfs_get_frame(frameset, ATMOS_MODEL);
768 solar_frame = kmo_dfs_get_frame(frameset, SOLAR_SPEC);
771 nifus = KMOS_NR_DETECTORS * KMOS_IFUS_PER_DETECTOR ;
772 stored_telluric_data = (cpl_vector**)cpl_calloc(nifus,
sizeof(cpl_vector*));
773 stored_telluric_noise = (cpl_vector**)cpl_calloc(nifus,
sizeof(cpl_vector*));
774 stored_starspec_data = (cpl_vector**)cpl_calloc(nifus,
sizeof(cpl_vector*));
775 stored_starspec_noise = (cpl_vector**)cpl_calloc(nifus,
sizeof(cpl_vector*));
776 stored_psf_data = (cpl_image**)cpl_calloc(nifus,
sizeof(cpl_image*));
777 stored_mask = (cpl_image**)cpl_calloc(nifus,
sizeof(cpl_image*));
778 stored_data_cube =(cpl_imagelist**)cpl_calloc(nifus,
sizeof(cpl_imagelist*));
779 stored_noise_cube=(cpl_imagelist**)cpl_calloc(nifus,
sizeof(cpl_imagelist*));
780 stored_qc_throughput = (
double*)cpl_calloc(nifus,
sizeof(
double));
781 stored_sub_psf_headers = (cpl_propertylist**)cpl_calloc(nifus,
782 sizeof(cpl_propertylist*));
783 stored_sub_tel_data_headers = (cpl_propertylist**)cpl_calloc(nifus,
784 sizeof(cpl_propertylist*));
785 stored_sub_tel_noise_headers = (cpl_propertylist**)cpl_calloc(nifus,
786 sizeof(cpl_propertylist*));
787 stored_sub_cube_data_headers = (cpl_propertylist**)cpl_calloc(nifus,
788 sizeof(cpl_propertylist*));
789 stored_sub_cube_noise_headers=(cpl_propertylist**)cpl_calloc(nifus,
790 sizeof(cpl_propertylist*));
791 stored_noisespec = (cpl_vector**)cpl_calloc(nifus,
sizeof(cpl_vector*));
793 strcpy(filename_telluric, TELLURIC);
794 strcpy(filename_starspec, STAR_SPEC);
795 strcpy(filename_psf, STD_IMAGE);
796 strcpy(filename_mask, STD_MASK);
797 strcpy(filename_cubes, STD_CUBE);
798 strcpy(filename_noise, NOISE_SPEC);
826 obj_frame = obj_sky_struct->table[0].objFrame;
827 main_header_tel = kmclipm_propertylist_load(
828 cpl_frame_get_filename(obj_frame), 0);
829 exptime = cpl_propertylist_get_double(main_header_tel, EXPTIME);
832 star_temp = kmos_get_temperature(frameset, spec_type, &star_type) ;
835 for (i = 1; i <= KMOS_NR_DETECTORS ; i++) {
836 print_cal_angle_msg_once = FALSE;
837 print_xcal_angle_msg_once = FALSE;
839 print_cal_angle_msg_once = TRUE;
840 print_xcal_angle_msg_once = TRUE;
844 keyword = cpl_sprintf(
"%s%d%s", IFU_FILTID_PREFIX, i,
846 filter_id = cpl_propertylist_get_string(main_header_tel, keyword);
849 band_table = kmo_dfs_load_table(frameset, WAVE_BAND, 1, 0);
850 kmclipm_setup_grid_band_lcal(&gd, filter_id, band_table);
851 cpl_table_delete(band_table);
854 sub_header_orig = kmclipm_propertylist_load(
855 cpl_frame_get_filename(obj_frame), i);
860 for (j = 0; j < KMOS_IFUS_PER_DETECTOR; j++) {
861 ifu_nr = (i-1)*KMOS_IFUS_PER_DETECTOR + j + 1;
866 kmo_collapse_objSkyStruct(obj_sky_struct, ifu_nr, &obj_frame,
868 punused_ifus = cpl_array_get_data_int_const(unused_ifus_after[i-1]);
871 keyword = cpl_sprintf(
"%s%d%s", IFU_VALID_PREFIX, ifu_nr,
873 cpl_propertylist_get_string(main_header_tel, keyword);
876 if ((cpl_error_get_code() == CPL_ERROR_DATA_NOT_FOUND) &&
877 (bounds[2*(ifu_nr-1)] != -1) &&
878 (bounds[2*(ifu_nr-1)+1] != -1) &&
879 (sky_frame != NULL) && (punused_ifus[j] == 0)) {
884 if (kmos_std_star_compute_ifu(sub_header_orig, obj_frame,
885 sky_frame, flat_frame, xcal_frame, ycal_frame,
886 lcal_frame, illum_frame, atmos_frame, solar_frame,
887 ifu_nr, main_header_tel, gd, bounds[2*(ifu_nr-1)],
888 bounds[2*(ifu_nr-1)+1], fmethod, flux,
889 xcal_interpolation, mask_method, cmethod, cpos_rej,
890 cneg_rej, citer, cmax, cmin, cen_x, cen_y, radius,
891 filter_id, star_type, no_noise, is_stdstarscipatt,
892 sky_sky_struct[ifu_nr-1], star_temp,
894 &stored_sub_tel_data_headers[ifu_nr-1],
895 &stored_sub_psf_headers[ifu_nr-1],
896 &stored_sub_cube_data_headers[ifu_nr-1],
897 &stored_data_cube[ifu_nr-1],
898 &stored_noise_cube[ifu_nr-1],
899 &stored_psf_data[ifu_nr-1],
900 &stored_mask[ifu_nr-1],
901 &stored_starspec_data[ifu_nr-1],
902 &stored_starspec_noise[ifu_nr-1],
903 &stored_noisespec[ifu_nr-1],
904 &stored_telluric_data[ifu_nr-1],
905 &stored_telluric_noise[ifu_nr-1]) == -1) {
906 stored_telluric_data[ifu_nr-1] = NULL ;
907 stored_telluric_noise[ifu_nr-1] = NULL ;
908 stored_starspec_data[ifu_nr-1] = NULL ;
909 stored_starspec_noise[ifu_nr-1] = NULL ;
910 stored_psf_data[ifu_nr-1] = NULL ;
911 stored_mask[ifu_nr-1] = NULL ;
912 stored_data_cube[ifu_nr-1] = NULL ;
913 stored_noise_cube[ifu_nr-1] = NULL ;
914 stored_noisespec[ifu_nr-1] = NULL ;
916 stored_sub_tel_data_headers[ifu_nr-1] =
917 cpl_propertylist_duplicate(sub_header_orig);
918 stored_sub_tel_noise_headers[ifu_nr-1] =
919 cpl_propertylist_duplicate(sub_header_orig);
920 stored_sub_psf_headers[ifu_nr-1] =
921 cpl_propertylist_duplicate(sub_header_orig);
922 stored_sub_cube_data_headers[ifu_nr-1] =
923 cpl_propertylist_duplicate(sub_header_orig);
924 stored_sub_cube_noise_headers[ifu_nr-1] =
925 cpl_propertylist_duplicate(sub_header_orig);
930 gain = cpl_propertylist_get_double(
931 stored_sub_tel_data_headers[ifu_nr-1], GAIN);
932 crpix1=cpl_propertylist_get_double(
933 stored_sub_tel_data_headers[ifu_nr-1], CRPIX1);
934 crval1=cpl_propertylist_get_double(
935 stored_sub_tel_data_headers[ifu_nr-1], CRVAL1);
936 cdelt1=cpl_propertylist_get_double(
937 stored_sub_tel_data_headers[ifu_nr-1], CDELT1);
938 kmo_calc_counts(spec_qc, filter_id, crpix1, crval1,
939 cdelt1, &counts1, &counts2);
942 stored_qc_throughput[ifu_nr-1] =
943 kmo_calc_throughput(magnitude1, magnitude2,
944 counts1, counts2, gain, filter_id);
945 if (kmclipm_is_nan_or_inf(
946 stored_qc_throughput[ifu_nr-1]))
947 stored_qc_throughput[ifu_nr-1] = -1;
948 kmclipm_update_property_double(
949 stored_sub_tel_data_headers[ifu_nr-1],
951 stored_qc_throughput[ifu_nr-1],
952 "[] IFU throughput");
955 zeropoint = kmo_calc_zeropoint(magnitude1, magnitude2,
956 counts1, counts2, cdelt1, filter_id);
957 if (kmclipm_is_nan_or_inf(zeropoint)) zeropoint = -1;
958 kmclipm_update_property_double(
959 stored_sub_tel_data_headers[ifu_nr-1],
960 QC_ZEROPOINT, zeropoint,
"[mag] IFU zeropoint");
963 cpl_image * sat_im = kmclipm_image_load(cpl_frame_get_filename(obj_frame), CPL_TYPE_FLOAT, 0, 1);
964 cpl_mask * sat_mask = cpl_mask_threshold_image_create(sat_im,
965 QC_SAT_LEVEL_VAL, INFINITY);
966 cpl_msg_info(__func__,
"calculating SAT_NB new - %lld, %lld", cpl_mask_get_size_x(sat_mask), cpl_mask_get_size_y(sat_mask) );
967 sat_nb = (cpl_mask_count(sat_mask) >= sat_nb)? cpl_mask_count(sat_mask): sat_nb;
968 cpl_msg_info(__func__,
"%f", sat_nb);
970 cpl_mask_delete(sat_mask);
971 cpl_image_delete(sat_im);
976 cpl_vector_delete(spec_qc) ;
981 stored_telluric_data[ifu_nr-1] = NULL ;
982 stored_telluric_noise[ifu_nr-1] = NULL ;
983 stored_starspec_data[ifu_nr-1] = NULL ;
984 stored_starspec_noise[ifu_nr-1] = NULL ;
985 stored_psf_data[ifu_nr-1] = NULL ;
986 stored_mask[ifu_nr-1] = NULL ;
987 stored_data_cube[ifu_nr-1] = NULL ;
988 stored_noise_cube[ifu_nr-1] = NULL ;
989 stored_noisespec[ifu_nr-1] = NULL ;
991 stored_sub_tel_data_headers[ifu_nr-1] =
992 cpl_propertylist_duplicate(sub_header_orig);
993 stored_sub_tel_noise_headers[ifu_nr-1] =
994 cpl_propertylist_duplicate(sub_header_orig);
995 stored_sub_psf_headers[ifu_nr-1] =
996 cpl_propertylist_duplicate(sub_header_orig);
997 stored_sub_cube_data_headers[ifu_nr-1] =
998 cpl_propertylist_duplicate(sub_header_orig);
999 stored_sub_cube_noise_headers[ifu_nr-1] =
1000 cpl_propertylist_duplicate(sub_header_orig);
1004 extname = kmo_extname_creator(ifu_frame, ifu_nr, EXT_DATA);
1005 kmclipm_update_property_string(
1006 stored_sub_tel_data_headers[ifu_nr-1], EXTNAME, extname,
1007 "FITS extension name");
1008 kmclipm_update_property_string(
1009 stored_sub_psf_headers[ifu_nr-1], EXTNAME, extname,
1010 "FITS extension name");
1011 kmclipm_update_property_string(
1012 stored_sub_cube_data_headers[ifu_nr-1], EXTNAME,
1013 extname,
"FITS extension name");
1017 if (stored_sub_tel_noise_headers[ifu_nr-1] == NULL) {
1018 stored_sub_tel_noise_headers[ifu_nr-1] =
1019 cpl_propertylist_duplicate(
1020 stored_sub_tel_data_headers[ifu_nr-1]);
1022 extname = kmo_extname_creator(ifu_frame, ifu_nr, EXT_NOISE);
1023 kmclipm_update_property_string(
1024 stored_sub_tel_noise_headers[ifu_nr-1], EXTNAME,
1025 extname,
"FITS extension name");
1026 if (stored_sub_cube_noise_headers[ifu_nr-1] == NULL)
1027 stored_sub_cube_noise_headers[ifu_nr-1] =
1028 cpl_propertylist_duplicate(
1029 stored_sub_cube_data_headers[ifu_nr-1]);
1030 kmclipm_update_property_string(
1031 stored_sub_cube_noise_headers[ifu_nr-1], EXTNAME,
1032 extname,
"FITS extension name");
1035 cpl_propertylist_delete(sub_header_orig);
1040 kmclipm_update_property_int(main_header_tel, QC_NR_STD_STARS,
1041 nr_std_stars,
"[] Nr. of std stars");
1042 kmclipm_update_property_double(main_header_tel, QC_SAT_LEVEL,
1043 QC_SAT_LEVEL_VAL,
"[] Sat. Level ADU");
1044 kmclipm_update_property_double(main_header_tel, QC_SAT_NB,
1045 sat_nb,
"Largest number of sat pixels per detector.");
1048 kmo_print_unused_ifus(unused_ifus_after, TRUE);
1049 kmo_set_unused_ifus(unused_ifus_after, main_header_tel,
"kmos_std_star");
1050 kmo_free_unused_ifus(unused_ifus_after);
1052 main_header_psf = cpl_propertylist_duplicate(main_header_tel);
1057 kmo_calc_mean_throughput(stored_qc_throughput, nifus, &throughput_mean,
1059 kmclipm_update_property_double(main_header_tel, QC_THROUGHPUT_MEAN,
1060 throughput_mean,
"[] mean throughput for all detectors");
1061 kmclipm_update_property_double(main_header_tel, QC_THROUGHPUT_SDV,
1062 throughput_sdv,
"[] stdev throughput for all detectors");
1064 cpl_free(stored_qc_throughput);
1067 if (!suppress_extension) fn_suffix = cpl_sprintf(
"%s", suffix);
1068 else fn_suffix = cpl_sprintf(
"%s",
"");
1072 kmo_dfs_save_main_header(frameset, filename_telluric, fn_suffix,
1073 obj_frame, main_header_tel, parlist, cpl_func);
1074 kmo_dfs_save_main_header(frameset, filename_starspec, fn_suffix,
1075 obj_frame, main_header_tel, parlist, cpl_func);
1076 kmo_dfs_save_main_header(frameset, filename_mask, fn_suffix,
1077 obj_frame, main_header_psf, parlist, cpl_func);
1078 kmo_dfs_save_main_header(frameset, filename_psf, fn_suffix,
1079 obj_frame, main_header_psf, parlist, cpl_func) ;
1080 if (!no_noise && is_stdstarscipatt) {
1081 kmo_dfs_save_main_header(frameset, filename_noise, fn_suffix,
1082 obj_frame, main_header_tel, parlist, cpl_func);
1084 cpl_propertylist_delete(main_header_tel);
1087 kmo_dfs_save_main_header(frameset, filename_cubes, fn_suffix,
1088 obj_frame, main_header_psf, parlist, cpl_func);
1090 cpl_propertylist_delete(main_header_psf);
1093 for (i = 1; i <= KMOS_NR_DETECTORS ; i++) {
1094 for (j = 0; j < KMOS_IFUS_PER_DETECTOR; j++) {
1095 ifu_nr = (i-1)*KMOS_IFUS_PER_DETECTOR + j + 1;
1098 if (stored_telluric_data[ifu_nr-1] != NULL) {
1099 ddd = kmclipm_vector_create(cpl_vector_duplicate(
1100 stored_telluric_data[ifu_nr-1]));
1101 kmo_dfs_save_vector(ddd, filename_telluric, fn_suffix,
1102 stored_sub_tel_data_headers[ifu_nr-1], 0./0.);
1103 kmclipm_vector_delete(ddd) ;
1105 kmo_dfs_save_vector(NULL, filename_telluric, fn_suffix,
1106 stored_sub_tel_data_headers[ifu_nr-1], 0./0.);
1108 if (stored_telluric_noise[ifu_nr-1] != NULL) {
1109 ddd = kmclipm_vector_create(cpl_vector_duplicate(
1110 stored_telluric_noise[ifu_nr-1]));
1111 kmo_dfs_save_vector(ddd, filename_telluric, fn_suffix,
1112 stored_sub_tel_noise_headers[ifu_nr-1], 0./0.);
1113 kmclipm_vector_delete(ddd) ;
1115 kmo_dfs_save_vector(NULL, filename_telluric, fn_suffix,
1116 stored_sub_tel_noise_headers[ifu_nr-1], 0./0.);
1120 if (stored_starspec_data[ifu_nr-1] != NULL) {
1121 ddd = kmclipm_vector_create(cpl_vector_duplicate(
1122 stored_starspec_data[ifu_nr-1]));
1123 kmo_dfs_save_vector(ddd, filename_starspec, fn_suffix,
1124 stored_sub_tel_data_headers[ifu_nr-1], 0./0.);
1125 kmclipm_vector_delete(ddd);
1127 kmo_dfs_save_vector(NULL, filename_starspec, fn_suffix,
1128 stored_sub_tel_data_headers[ifu_nr-1], 0./0.);
1130 if (stored_starspec_noise[ifu_nr-1] != NULL) {
1131 ddd = kmclipm_vector_create(cpl_vector_duplicate(
1132 stored_starspec_noise[ifu_nr-1]));
1133 kmo_dfs_save_vector(ddd, filename_starspec, fn_suffix,
1134 stored_sub_tel_noise_headers[ifu_nr-1], 0./0.);
1135 kmclipm_vector_delete(ddd);
1137 kmo_dfs_save_vector(NULL, filename_starspec, fn_suffix,
1138 stored_sub_tel_noise_headers[ifu_nr-1], 0./0.);
1142 kmo_dfs_save_image(stored_psf_data[ifu_nr-1], filename_psf,
1143 fn_suffix, stored_sub_psf_headers[ifu_nr-1], 0./0.);
1146 kmo_dfs_save_image(stored_mask[ifu_nr-1], filename_mask,
1147 fn_suffix, stored_sub_psf_headers[ifu_nr-1], 0./0.);
1150 if (!no_noise && is_stdstarscipatt && stored_noisespec != NULL &&
1151 stored_noisespec[ifu_nr-1] != NULL &&
1152 stored_starspec_data[ifu_nr-1] != NULL) {
1154 kmo_calc_band_mean(stored_sub_tel_data_headers[ifu_nr-1],
1155 filter_id, stored_starspec_data[ifu_nr-1], NULL,
1157 kmo_calc_band_mean(stored_sub_tel_data_headers[ifu_nr-1],
1158 filter_id, stored_noisespec[ifu_nr-1], NULL,
1160 kmclipm_update_property_double(
1161 stored_sub_tel_data_headers[ifu_nr-1], QC_SNR,
1162 tmp_data/tmp_noise,
"[] SNR");
1165 if (!no_noise && is_stdstarscipatt) {
1166 if ((stored_noisespec != NULL) &&
1167 stored_noisespec[ifu_nr-1] != NULL) {
1168 ddd = kmclipm_vector_create(cpl_vector_duplicate(
1169 stored_noisespec[ifu_nr-1]));
1170 kmo_dfs_save_vector(ddd, filename_noise, fn_suffix,
1171 stored_sub_tel_data_headers[ifu_nr-1], 0./0.);
1172 kmclipm_vector_delete(ddd);
1174 kmo_dfs_save_vector(NULL, filename_noise, fn_suffix,
1175 stored_sub_tel_data_headers[ifu_nr-1], 0./0.);
1181 kmo_dfs_save_cube(stored_data_cube[ifu_nr-1],
1182 filename_cubes, fn_suffix,
1183 stored_sub_cube_data_headers[ifu_nr-1], 0./0.);
1184 kmo_dfs_save_cube(stored_noise_cube[ifu_nr-1],
1185 filename_cubes, fn_suffix,
1186 stored_sub_cube_noise_headers[ifu_nr-1], 0./0.);
1192 if (extra_outputs) {
1193 char * tell_name = cpl_sprintf(
"%s%s", filename_telluric, fn_suffix) ;
1194 kmos_idp_save_extra_outputs(frameset, parlist, cpl_func, tell_name) ;
1195 cpl_free(tell_name);
1196 char * spec_name = cpl_sprintf(
"%s%s", filename_starspec, fn_suffix) ;
1197 kmos_idp_save_extra_outputs(frameset, parlist, cpl_func, spec_name) ;
1198 cpl_free(spec_name);
1200 cpl_free(fn_suffix);
1204 kmo_delete_objSkyStruct(obj_sky_struct);
1205 kmo_delete_skySkyStruct(sky_sky_struct);
1206 cpl_frameset_delete(frameset_std);
1208 for (i = 0; i < nifus ; i++) {
1209 cpl_vector_delete(stored_telluric_data[i]);
1210 cpl_vector_delete(stored_telluric_noise[i]);
1211 cpl_vector_delete(stored_starspec_data[i]);
1212 cpl_vector_delete(stored_starspec_noise[i]);
1213 cpl_image_delete(stored_psf_data[i]);
1214 cpl_propertylist_delete(stored_sub_tel_data_headers[i]);
1215 cpl_propertylist_delete(stored_sub_tel_noise_headers[i]);
1216 cpl_vector_delete(stored_noisespec[i]);
1217 cpl_propertylist_delete(stored_sub_cube_data_headers[i]);
1218 cpl_propertylist_delete(stored_sub_cube_noise_headers[i]);
1219 cpl_propertylist_delete(stored_sub_psf_headers[i]);
1220 cpl_image_delete(stored_mask[i]);
1221 cpl_imagelist_delete(stored_data_cube[i]);
1222 cpl_imagelist_delete(stored_noise_cube[i]);
1224 cpl_free(stored_telluric_data);
1225 cpl_free(stored_telluric_noise);
1226 cpl_free(stored_starspec_data);
1227 cpl_free(stored_starspec_noise);
1228 cpl_free(stored_psf_data);
1229 cpl_free(stored_sub_tel_data_headers);
1230 cpl_free(stored_sub_tel_noise_headers);
1231 cpl_free(stored_noisespec);
1232 cpl_free(stored_sub_cube_data_headers);
1233 cpl_free(stored_sub_cube_noise_headers);
1234 cpl_free(stored_sub_psf_headers);
1235 cpl_free(stored_mask);
1236 cpl_free(stored_data_cube);
1237 cpl_free(stored_noise_cube);
1250static int kmos_std_star_compute_ifu(
1251 cpl_propertylist * sub_header_orig,
1252 cpl_frame * obj_frame,
1253 cpl_frame * sky_frame,
1254 cpl_frame * flat_frame,
1255 cpl_frame * xcal_frame,
1256 cpl_frame * ycal_frame,
1257 cpl_frame * lcal_frame,
1258 cpl_frame * illum_frame,
1259 cpl_frame * atmos_frame,
1260 cpl_frame * solar_frame,
1262 cpl_propertylist * main_header_tel,
1266 const char * fmethod,
1268 int xcal_interpolation,
1269 const char * mask_method,
1270 const char * cmethod,
1279 const char * filter_id,
1282 int is_stdstarscipatt,
1283 skySkyStruct sky_sky_struct,
1285 cpl_vector ** spec_qc,
1286 cpl_propertylist ** out_sub_tel_data_header,
1287 cpl_propertylist ** out_sub_psf_header,
1288 cpl_propertylist ** out_sub_cube_data_header,
1289 cpl_imagelist ** out_data_cube,
1290 cpl_imagelist ** out_noise_cube,
1291 cpl_image ** out_psf_data,
1292 cpl_image ** out_mask,
1293 cpl_vector ** out_starspec_data,
1294 cpl_vector ** out_starspec_noise,
1295 cpl_vector ** out_noisespec,
1296 cpl_vector ** out_telluric_data,
1297 cpl_vector ** out_telluric_noise)
1300 cpl_propertylist * tmp_head ;
1301 cpl_image * illum_corr ;
1302 cpl_propertylist * pl_psf ;
1303 cpl_propertylist * plist ;
1304 double std_trace, factor_fwhm, spat_res, x_lo, y_lo, x_hi,
1305 y_hi, loc_cen_x, loc_cen_y, r ;
1306 cpl_size auto_cen_x, auto_cen_y, nx, ny ;
1307 cpl_vector * tmp_vec ;
1308 cpl_vector * tmp_spec_data ;
1309 cpl_vector * tmp_spec_noise ;
1310 cpl_vector * shot_noise ;
1311 cpl_vector * solar_spec ;
1313 double gain, mean_data, mean_data2, flux_scale_factor,
1315 double ** pvec_array ;
1317 double * pstored_noisespec ;
1318 cpl_vector ** vec_array ;
1319 const double * ptmp_spec_data ;
1320 double * ptmp_spec_noise ;
1322 cpl_imagelist * tmp_cube ;
1323 cpl_vector * lambda_x ;
1324 cpl_vector * atmos_model ;
1325 int i, j, k, nr_sky_pairs, npix, x, y ;
1333 if (sky_frame != NO_CORRESPONDING_SKYFRAME) {
1334 cpl_msg_info(cpl_func,
"Processing standard star in IFU %d", ifu_nr);
1335 cpl_msg_info(cpl_func,
" (obj: %s, sky: %s)",
1336 cpl_frame_get_filename(obj_frame),
1337 cpl_frame_get_filename(sky_frame));
1340 cpl_msg_warning(cpl_func,
1341 "Processing standard star in IFU %d", ifu_nr);
1342 cpl_msg_warning(cpl_func,
1343 " (obj: %s, no corresponding sky frame)",
1344 cpl_frame_get_filename(obj_frame));
1347 keyword = cpl_sprintf(
"%s%d", PRO_STD, ifu_nr);
1348 cpl_propertylist_update_int(main_header_tel, keyword, 1);
1352 tmp_head=cpl_propertylist_duplicate(sub_header_orig);
1353 kmo_calc_wcs_gd(main_header_tel, tmp_head, ifu_nr,gd);
1354 *out_sub_tel_data_header = cpl_propertylist_duplicate(tmp_head);
1355 *out_sub_psf_header = cpl_propertylist_duplicate(tmp_head);
1356 *out_sub_cube_data_header = cpl_propertylist_duplicate(tmp_head);
1357 cpl_propertylist_delete(tmp_head);
1360 kmos_std_star_adjust_double(*out_sub_tel_data_header, CRVAL1,CRVAL2,CRVAL3);
1361 kmos_std_star_adjust_double(*out_sub_tel_data_header, CRPIX1,CRPIX2,CRPIX3);
1362 kmos_std_star_adjust_double(*out_sub_tel_data_header, CDELT1,CDELT2,CDELT3);
1363 kmos_std_star_adjust_string(*out_sub_tel_data_header, CTYPE1,CTYPE2,CTYPE3);
1364 kmos_std_star_adjust_string(*out_sub_tel_data_header, CUNIT1,CUNIT2,CUNIT3);
1367 cpl_propertylist_erase(*out_sub_tel_data_header, CD1_1);
1368 cpl_propertylist_erase(*out_sub_tel_data_header, CD1_2);
1369 cpl_propertylist_erase(*out_sub_tel_data_header, CD1_3);
1370 cpl_propertylist_erase(*out_sub_tel_data_header, CD2_1);
1371 cpl_propertylist_erase(*out_sub_tel_data_header, CD2_2);
1372 cpl_propertylist_erase(*out_sub_tel_data_header, CD2_3);
1373 cpl_propertylist_erase(*out_sub_tel_data_header, CD3_1);
1374 cpl_propertylist_erase(*out_sub_tel_data_header, CD3_2);
1375 cpl_propertylist_erase(*out_sub_tel_data_header, CD3_3);
1378 cpl_propertylist_erase(*out_sub_psf_header, CRPIX3);
1379 cpl_propertylist_erase(*out_sub_psf_header, CRPIX3);
1380 cpl_propertylist_erase(*out_sub_psf_header, CDELT3);
1381 cpl_propertylist_erase(*out_sub_psf_header, CRVAL3);
1382 cpl_propertylist_erase(*out_sub_psf_header, CTYPE3);
1383 cpl_propertylist_erase(*out_sub_psf_header, CUNIT3);
1384 cpl_propertylist_erase(*out_sub_psf_header, CD1_3);
1385 cpl_propertylist_erase(*out_sub_psf_header, CD2_3);
1386 cpl_propertylist_erase(*out_sub_psf_header, CD3_1);
1387 cpl_propertylist_erase(*out_sub_psf_header, CD3_2);
1388 cpl_propertylist_erase(*out_sub_psf_header, CD3_3);
1391 kmo_reconstruct_sci(ifu_nr, low_bound, high_bound, obj_frame, STD,
1392 sky_frame, STD, flat_frame, NULL, xcal_frame, ycal_frame,
1393 lcal_frame, NULL, NULL, &gd, out_data_cube, out_noise_cube, flux,
1394 FALSE, xcal_interpolation,
"");
1398 if (illum_frame != NULL) {
1399 plist = kmclipm_propertylist_load(cpl_frame_get_filename(obj_frame), 0);
1400 angle = kmo_dfs_get_property_double(plist, ROTANGLE);
1401 cpl_propertylist_delete(plist);
1403 illum_corr = kmos_illum_load(cpl_frame_get_filename(illum_frame),
1404 CPL_TYPE_FLOAT, ifu_nr, angle, &dummy1) ;
1405 if (illum_corr != NULL) {
1406 cpl_imagelist_divide_image(*out_data_cube, illum_corr);
1407 cpl_image_delete(illum_corr);
1412 kmo_calculate_std_trace(*out_data_cube, fmethod, &std_trace);
1413 kmclipm_update_property_double(*out_sub_psf_header, QC_STD_TRACE, std_trace,
1414 "[pix] distance PSF - IFU center");
1417 kmclipm_make_image(*out_data_cube, NULL, out_psf_data, NULL, NULL,
1418 cmethod, cpos_rej, cneg_rej, citer, cmax, cmin);
1421 tmp_vec = kmo_fit_profile_2D(*out_psf_data, NULL, fmethod,out_mask,&pl_psf);
1423 if (!strcmp(mask_method,
"integrated")) {
1424 if (cen_x < 1.0 || cen_y < 1.0) {
1425 cpl_image_get_maxpos(*out_psf_data,&auto_cen_x,&auto_cen_y);
1426 loc_cen_x = (double)auto_cen_x - 1.0 ;
1427 loc_cen_y = (double)auto_cen_y - 1.0 ;
1429 loc_cen_x = cen_x - 1.0 ;
1430 loc_cen_y = cen_y - 1.0 ;
1432 kmo_image_fill(*out_mask,0.0);
1433 pmask = cpl_image_get_data_float(*out_mask);
1434 nx = cpl_image_get_size_x(*out_mask);
1435 ny = cpl_image_get_size_y(*out_mask);
1438 x_lo = floor(loc_cen_x - radius);
1439 if (x_lo < 0) x_lo = 0;
1440 y_lo = floor(loc_cen_y - radius);
1441 if (y_lo < 0) y_lo = 0;
1442 x_hi = ceil(loc_cen_x + radius);
1443 if (x_hi > nx) x_hi = nx;
1444 y_hi = ceil(loc_cen_y + radius);
1445 if (y_hi > ny) y_hi = ny;
1446 for (x = x_lo; x < x_hi; x++) {
1447 for (y = y_lo; y < y_hi; y++) {
1448 r = sqrt(pow(x - loc_cen_x,2) + pow(y - loc_cen_y,2));
1449 if (r <= radius) pmask[x + y * nx] = 1.0;
1454 cpl_image_divide_scalar(*out_mask, cpl_image_get_max(*out_mask));
1455 for (i = 1; i <= cpl_image_get_size_x(*out_mask); i++) {
1456 for (j = 1; j <= cpl_image_get_size_y(*out_mask); j++) {
1457 if (cpl_image_get(*out_mask, i, j, &k) < 0.5)
1458 cpl_image_set(*out_mask, i, j, 0.);
1460 cpl_image_set(*out_mask, i, j, 1.);
1466 cpl_propertylist_append(*out_sub_tel_data_header, pl_psf);
1467 cpl_propertylist_delete(pl_psf);
1470 factor_fwhm = 2*sqrt(2*log(2));
1471 spat_res = pow(cpl_vector_get(tmp_vec, 4) * factor_fwhm, 2);
1472 spat_res += pow(cpl_vector_get(tmp_vec, 5)* factor_fwhm, 2);
1474 kmclipm_update_property_double(*out_sub_psf_header, QC_SPAT_RES,
1475 sqrt(spat_res)*KMOS_PIX_RESOLUTION,
1476 "[arcsec] mean fwhm resolution of PSF");
1477 cpl_vector_delete(tmp_vec);
1481 tmp_spec_data = tmp_spec_noise = NULL ;
1482 kmo_priv_extract_spec(*out_data_cube, *out_noise_cube, *out_mask,
1483 &tmp_spec_data, &tmp_spec_noise);
1484 cpl_vector_multiply_scalar(tmp_spec_data, cpl_image_get_flux(*out_mask));
1485 if (tmp_spec_noise != NULL) {
1486 cpl_vector_multiply_scalar(tmp_spec_noise,
1487 cpl_image_get_flux(*out_mask));
1492 tmp_vec = *spec_qc = NULL ;
1493 kmo_priv_extract_spec(*out_data_cube, *out_noise_cube, NULL, spec_qc,
1495 npix = cpl_image_get_size_x(cpl_imagelist_get(*out_data_cube, 0)) *
1496 cpl_image_get_size_y(cpl_imagelist_get(*out_data_cube, 0)) ;
1497 cpl_vector_multiply_scalar(*spec_qc, npix);
1498 if (tmp_vec != NULL) cpl_vector_multiply_scalar(tmp_vec, npix);
1501 gain = cpl_propertylist_get_double(*out_sub_tel_data_header, GAIN);
1505 shot_noise = cpl_vector_duplicate(tmp_spec_data);
1506 cpl_vector_multiply_scalar(shot_noise, gain);
1507 ppp = cpl_vector_get_data(shot_noise);
1508 for (i = 0; i < cpl_vector_get_size(shot_noise); i++) {
1509 if ((ppp[i] < 0.0) || kmclipm_is_nan_or_inf(ppp[i]))
1512 cpl_vector_sqrt(shot_noise);
1513 cpl_vector_divide_scalar(shot_noise, gain);
1517 kmo_calc_band_mean(*out_sub_tel_data_header, filter_id, tmp_spec_data,
1518 tmp_spec_noise, &mean_data, NULL);
1519 kmo_calc_band_mean(*out_sub_tel_data_header, filter_id, *spec_qc, tmp_vec,
1521 cpl_vector_delete(tmp_vec) ;
1523 flux_scale_factor = mean_data2/mean_data;
1525 cpl_vector_multiply_scalar(shot_noise, flux_scale_factor);
1526 cpl_vector_multiply_scalar(tmp_spec_data,flux_scale_factor);
1527 if ((tmp_spec_noise != NULL) && (fabs(mean_data) > 1e-8))
1528 cpl_vector_multiply_scalar(tmp_spec_noise, flux_scale_factor);
1531 *out_starspec_data = cpl_vector_duplicate(tmp_spec_data);
1532 if (tmp_spec_noise != NULL)
1533 *out_starspec_noise = cpl_vector_duplicate(tmp_spec_noise);
1535 *out_starspec_noise = NULL ;
1538 if (!no_noise && is_stdstarscipatt) {
1539 nr_sky_pairs = sky_sky_struct.nrSkyPairs;
1540 if (nr_sky_pairs > 2) {
1541 cpl_msg_info(__func__,
"Get noise spec on sky for IFU %d", ifu_nr);
1542 vec_array = cpl_calloc(nr_sky_pairs,
sizeof(cpl_vector*));
1543 pvec_array = cpl_calloc(nr_sky_pairs,
sizeof(
double*));
1545 for (i = 0; i < nr_sky_pairs; i++) {
1547 kmo_reconstruct_sci(ifu_nr, low_bound, high_bound,
1548 sky_sky_struct.skyPairs[i].skyFrame1, STD,
1549 sky_sky_struct.skyPairs[i].skyFrame2, STD, flat_frame,
1550 NULL, xcal_frame, ycal_frame, lcal_frame, NULL, NULL,
1551 &gd, &tmp_cube, NULL, FALSE, FALSE,
1552 xcal_interpolation,
"");
1556 kmo_priv_extract_spec(tmp_cube, NULL, *out_mask,
1557 &(vec_array[i]), NULL);
1558 cpl_vector_multiply_scalar(vec_array[i],
1559 cpl_image_get_flux(*out_mask));
1563 cpl_vector_multiply_scalar(vec_array[i], flux_scale_factor);
1564 pvec_array[i] = cpl_vector_get_data(vec_array[i]);
1565 cpl_imagelist_delete(tmp_cube);
1569 *out_noisespec = cpl_vector_new(gd.l.dim);
1570 pstored_noisespec = cpl_vector_get_data(*out_noisespec);
1571 tmp_vec = cpl_vector_new(nr_sky_pairs);
1572 ptmp_vec = cpl_vector_get_data(tmp_vec);
1573 for (i = 0; i < gd.l.dim; i++) {
1574 for (j = 0; j < nr_sky_pairs; j++)
1575 ptmp_vec[j] = pvec_array[j][i];
1576 pstored_noisespec[i] = cpl_vector_get_stdev(tmp_vec);
1578 for (i = 0; i < nr_sky_pairs; i++) cpl_vector_delete(vec_array[i]);
1579 cpl_free(vec_array);
1580 cpl_free(pvec_array);
1581 cpl_vector_delete(tmp_vec);
1585 cpl_vector_power(*out_noisespec, 2.);
1586 cpl_vector_power(shot_noise, 2.);
1587 cpl_vector_add(*out_noisespec, shot_noise);
1588 ppp = cpl_vector_get_data(*out_noisespec);
1589 for (i = 0; i < cpl_vector_get_size(*out_noisespec); i++) {
1590 if ((ppp[i] < 0.0) || kmclipm_is_nan_or_inf(ppp[i])) ppp[i]=0.0;
1592 cpl_vector_sqrt(*out_noisespec);
1593 cpl_vector_delete(shot_noise);
1595 cpl_msg_warning(__func__,
"Omit noise-spectra (<2 sky pairs)");
1596 *out_noisespec = shot_noise;
1599 *out_noisespec = shot_noise;
1604 lambda_x = kmo_create_lambda_vec(gd.l.dim, 1, gd.l.start, gd.l.delta);
1606 if (star_type==
'O' || star_type==
'B' || star_type==
'A' || star_type==
'F') {
1610 if (atmos_frame != NULL) {
1612 atmos_model = kmo_interpolate_vector_wcs(atmos_frame, lambda_x);
1615 if (!strcmp(filter_id,
"H"))
1616 for (i = 0; i < nr_lines_h; i++)
1617 kmo_remove_line(tmp_spec_data, lambda_x, atmos_model,
1618 lines_center_h[i], lines_width_h[i]);
1619 else if (!strcmp(filter_id,
"HK"))
1620 for (i = 0; i < nr_lines_hk; i++)
1621 kmo_remove_line(tmp_spec_data, lambda_x, atmos_model,
1622 lines_center_hk[i], lines_width_hk[i]);
1623 else if (!strcmp(filter_id,
"K"))
1624 for (i = 0; i < nr_lines_k; i++)
1625 kmo_remove_line(tmp_spec_data, lambda_x, atmos_model,
1626 lines_center_k[i], lines_width_k[i]);
1627 else if (!strcmp(filter_id,
"IZ")) {
1642 for (i = 0; i < nr_lines_iz; i++)
1643 kmo_remove_line(tmp_spec_data, lambda_x, atmos_model,
1644 lines_center_iz[i], lines_width_iz[i]);
1645 }
else if (strcmp(filter_id,
"YJ") == 0)
1646 for (i = 0; i < nr_lines_yj; i++)
1647 kmo_remove_line(tmp_spec_data, lambda_x, atmos_model,
1648 lines_center_yj[i], lines_width_yj[i]);
1650 if (0) kmos_std_star_plot() ;
1651 cpl_vector_delete(atmos_model);
1653 cpl_msg_warning(__func__,
"Missing ATMOS_MODEL");
1655 }
else if (star_type ==
'G') {
1657 if (solar_frame != NULL) {
1659 solar_spec = kmo_interpolate_vector_wcs(solar_frame,
1663 cpl_vector_divide(tmp_spec_data, solar_spec);
1664 cpl_vector_delete(solar_spec);
1666 cpl_msg_warning(__func__,
"Missing SOLAR_SPEC");
1670 if (star_temp > 0.0) {
1672 kmo_divide_blackbody(tmp_spec_data, lambda_x, star_temp);
1674 cpl_vector_delete(lambda_x);
1678 kmo_calc_band_mean(*out_sub_tel_data_header, filter_id, tmp_spec_data,
1679 tmp_spec_noise, &mean_data, NULL);
1680 cpl_vector_divide_scalar(tmp_spec_data, mean_data);
1682 if (tmp_spec_noise != NULL) {
1684 cpl_vector_divide_scalar(tmp_spec_noise, mean_data);
1687 ptmp_spec_data = cpl_vector_get_data_const(tmp_spec_data);
1688 ptmp_spec_noise = cpl_vector_get_data(tmp_spec_noise);
1689 for (i = 0; i < cpl_vector_get_size(tmp_spec_data);i++)
1690 if (ptmp_spec_data[i]==0.0) ptmp_spec_noise[i]=0.0;
1694 *out_telluric_data = tmp_spec_data;
1695 *out_telluric_noise = tmp_spec_noise;
1710static int kmos_std_star_check_inputs(
1711 cpl_frameset * frameset,
1712 const char * magnitude_txt,
1713 int * is_stdstarscipatt,
1715 double * magnitude1,
1716 double * magnitude2)
1718 int nb_std, nb_illum, nb_xcal, nb_ycal, nb_lcal,
1720 cpl_frame * tmp_frame ;
1721 cpl_frameset * frameset_std ;
1722 cpl_propertylist * tmp_head ;
1723 const char * my_mag_txt ;
1728 const char * tmp_str ;
1731 if (frameset == NULL || is_stdstarscipatt == NULL || compute_qcs == NULL ||
1732 magnitude1 == NULL || magnitude2 == NULL)
return -1;
1735 nb_std = cpl_frameset_count_tags(frameset, STD) ;
1736 nb_illum = cpl_frameset_count_tags(frameset, ILLUM_CORR) ;
1737 nb_xcal = cpl_frameset_count_tags(frameset, XCAL) ;
1738 nb_ycal = cpl_frameset_count_tags(frameset, YCAL) ;
1739 nb_lcal = cpl_frameset_count_tags(frameset, LCAL) ;
1740 nb_flat = cpl_frameset_count_tags(frameset, MASTER_FLAT) ;
1741 nb_wave = cpl_frameset_count_tags(frameset, WAVE_BAND) ;
1745 cpl_msg_error(__func__,
"At least one STD frame is required") ;
1746 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1750 cpl_msg_warning(__func__,
"2 STD frames needed for sky subtraction") ;
1752 if (nb_illum < 0 || nb_illum > 1) {
1753 cpl_msg_error(__func__,
"0 or 1 ILLUM frame expected") ;
1754 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1757 if (nb_xcal != 1 || nb_ycal != 1 || nb_lcal != 1) {
1758 cpl_msg_error(__func__,
"1 X/Y/LCAL required") ;
1759 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1763 cpl_msg_error(__func__,
"1 MASTER_FLAT required") ;
1764 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1768 cpl_msg_error(__func__,
"1 WAVE_BAND required") ;
1769 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1774 frameset_std=kmos_std_star_extract_same_grat_stds(frameset,&same_gratings) ;
1777 tmp_frame = kmo_dfs_get_frame(frameset_std, STD);
1778 tmp_head=kmclipm_propertylist_load(cpl_frame_get_filename(tmp_frame),0);
1779 grat_id = cpl_sprintf(
"%s", cpl_propertylist_get_string(tmp_head,
1780 "ESO INS GRAT1 ID"));
1781 if (!strcmp(cpl_propertylist_get_string(tmp_head, TPL_ID),
1782 "KMOS_spec_cal_stdstarscipatt")) *is_stdstarscipatt = TRUE ;
1783 else *is_stdstarscipatt = FALSE ;
1784 cpl_propertylist_delete(tmp_head);
1785 cpl_frameset_delete(frameset_std) ;
1788 if (same_gratings) {
1789 *compute_qcs = TRUE ;
1791 tmp_frame = kmo_dfs_get_frame(frameset, STD);
1792 tmp_head=kmclipm_propertylist_load(cpl_frame_get_filename(tmp_frame),0);
1794 if (!strcmp(magnitude_txt,
"")) {
1796 if ((cpl_propertylist_has(tmp_head, STDSTAR_MAG)) &&
1797 (cpl_propertylist_get_type(tmp_head, STDSTAR_MAG) ==
1799 my_mag_txt = cpl_propertylist_get_string(tmp_head, STDSTAR_MAG);
1800 split_mag = kmo_strsplit(my_mag_txt,
",", &nr_split_mag);
1803 if (nr_split_mag == 2 && !strcmp(grat_id,
"HK")) {
1804 *magnitude1 = atof(split_mag[0]);
1805 *magnitude2 = atof(split_mag[1]);
1806 cpl_msg_info(
"",
"Magnitude in H: %g", *magnitude1);
1807 cpl_msg_info(
"",
"Magnitude in K: %g", *magnitude2);
1808 }
else if (nr_split_mag >= 1 && (!strcmp(grat_id,
"K") ||
1809 !strcmp(grat_id,
"H") || !strcmp(grat_id,
"IZ") ||
1810 !strcmp(grat_id,
"YJ"))) {
1811 *magnitude1 = atof(split_mag[0]);
1812 cpl_msg_info(
"",
"Magnitude in %s: %g",grat_id,*magnitude1);
1815 *compute_qcs = FALSE;
1816 cpl_msg_warning(cpl_func,
"Wrong Mag, QCs not computed") ;
1818 kmo_strfreev(split_mag);
1821 *compute_qcs = FALSE;
1822 cpl_msg_warning(cpl_func,
"%s is not set, QCs not computed",
1827 cpl_msg_info(cpl_func,
"Magnitude entered by user, ignore header");
1829 split_mag = kmo_strsplit(magnitude_txt,
",", &nr_split_mag);
1830 switch (nr_split_mag) {
1832 *magnitude1 = atof(split_mag[0]);
1833 cpl_msg_info(cpl_func,
"Magnitude in %s: %g", grat_id,
1837 *magnitude1 = atof(split_mag[0]);
1838 *magnitude2 = atof(split_mag[1]);
1839 cpl_msg_info(
"",
"Magnitude in H: %g", *magnitude1);
1840 cpl_msg_info(
"",
"Magnitude in K: %g", *magnitude2);
1843 kmo_strfreev(split_mag);
1844 cpl_propertylist_delete(tmp_head);
1845 cpl_msg_error(__func__,
"Wrong Magnitude Specified") ;
1846 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1849 kmo_strfreev(split_mag);
1851 cpl_propertylist_delete(tmp_head);
1853 *compute_qcs = FALSE ;
1857 tmp_frame = kmo_dfs_get_frame(frameset, SOLAR_SPEC);
1858 if (tmp_frame != NULL) {
1859 tmp_head=kmclipm_propertylist_load(cpl_frame_get_filename(tmp_frame),0);
1860 tmp_str = cpl_propertylist_get_string(tmp_head, FILT_ID);
1861 if (strcmp(tmp_str, grat_id)) {
1862 cpl_propertylist_delete(tmp_head) ;
1863 cpl_msg_error(__func__,
"Wrong SOLAR_SPEC grating") ;
1864 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1867 cpl_propertylist_delete(tmp_head) ;
1871 tmp_frame = kmo_dfs_get_frame(frameset, ATMOS_MODEL);
1872 if (tmp_frame != NULL) {
1873 tmp_head=kmclipm_propertylist_load(cpl_frame_get_filename(tmp_frame),0);
1874 tmp_str = cpl_propertylist_get_string(tmp_head, FILT_ID);
1875 if (strcmp(tmp_str, grat_id)) {
1876 cpl_propertylist_delete(tmp_head) ;
1877 cpl_msg_error(__func__,
"Wrong ATMOS_MODEL grating") ;
1878 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
1881 cpl_propertylist_delete(tmp_head) ;
1886 kmo_check_frameset_setup(frameset, XCAL, FALSE, FALSE, TRUE);
1887 kmo_check_frame_setup(frameset, XCAL, YCAL, TRUE, FALSE, TRUE);
1888 kmo_check_frame_setup(frameset, XCAL, LCAL, TRUE, FALSE, TRUE);
1889 kmo_check_frame_setup(frameset, XCAL, MASTER_FLAT, TRUE, FALSE, TRUE);
1890 kmo_check_frame_setup(frameset, XCAL, STD, FALSE, FALSE, TRUE);
1892 kmo_check_frame_setup(frameset, XCAL, ILLUM_CORR, TRUE, FALSE, FALSE);
1893 kmo_check_frame_setup_md5_xycal(frameset);
1894 kmo_check_frame_setup_md5(frameset);
1905static int kmos_std_star_plot(
void)
1982static int kmos_std_star_adjust_double(
1983 cpl_propertylist * header,
1988 if (header==NULL || key1==NULL || key2==NULL || key3==NULL)
return -1 ;
1989 cpl_propertylist_update_double(header, key1,
1990 cpl_propertylist_get_double(header, key3));
1991 cpl_propertylist_erase(header, key2) ;
1992 cpl_propertylist_erase(header, key3) ;
2003static int kmos_std_star_adjust_string(
2004 cpl_propertylist * header,
2009 if (header==NULL || key1==NULL || key2==NULL || key3==NULL)
return -1 ;
2010 cpl_propertylist_update_string(header, key1,
2011 cpl_propertylist_get_string(header, key3));
2012 cpl_propertylist_erase(header, key2) ;
2013 cpl_propertylist_erase(header, key3) ;
2026static cpl_frameset * kmos_std_star_extract_same_grat_stds(
2028 int * same_gratings)
2030 cpl_frameset * frameset_std ;
2031 cpl_frame * tmp_frame ;
2032 cpl_propertylist * tmp_header ;
2036 if (in == NULL || same_gratings== NULL)
return NULL ;
2039 frameset_std = cpl_frameset_new();
2041 tmp_frame = kmo_dfs_get_frame(in, STD);
2042 tmp_header = kmclipm_propertylist_load(cpl_frame_get_filename(tmp_frame),0);
2043 grat_id = cpl_sprintf(
"%s", cpl_propertylist_get_string(tmp_header,
2044 "ESO INS GRAT1 ID"));
2045 cpl_propertylist_delete(tmp_header);
2046 cpl_frameset_insert(frameset_std, cpl_frame_duplicate(tmp_frame));
2048 tmp_frame = kmo_dfs_get_frame(in, NULL);
2049 *same_gratings = TRUE ;
2050 while (tmp_frame != NULL ) {
2051 tmp_header=kmclipm_propertylist_load(cpl_frame_get_filename(tmp_frame),
2053 if (!strcmp(grat_id, cpl_propertylist_get_string(tmp_header,
2054 "ESO INS GRAT1 ID"))) {
2055 cpl_frameset_insert(frameset_std, cpl_frame_duplicate(tmp_frame));
2057 *same_gratings = FALSE;
2059 cpl_propertylist_delete(tmp_header);
2061 tmp_frame = kmo_dfs_get_frame(in, NULL);
2064 return frameset_std ;
int cpl_plugin_get_info(cpl_pluginlist *list)
Build the list of available plugins, for this module.