What's new in CPL 6.1
===================== - New functions and functionality cpl_apertures_extract_mask() cpl_fits_get_mode() cpl_fits_set_mode() cpl_imagelist_unwrap() - The release fixes the following bugs cpl_apertures_new_from_image(): segfault on complex input cpl_flux_get_noise_window(): Incorrect error propagation cpl_image_move(): No support of complex pixels The caching of FITS files opened for reading did not support multi-threading cpl_plot_columns(), cpl_plot_vectors(): NULL-options not supported - The release fixes the following documentation errors Dropped documentation for the cpl_errorstate module Some internal and thus unavailable functions appeared in the documentation Usage example of cpl_error_set_message() clarified CPL_TYPE_COMPLEX was incorrecly documented from CPL 5.1.0 What's new in CPL 6.0 ===================== - New functions and functionality cpl_apertures_get_maxpos_x cpl_apertures_get_maxpos_y cpl_apertures_get_minpos_x cpl_apertures_get_minpos_y cpl_apertures_get_pos_x cpl_apertures_get_pos_y cpl_mask_load cpl_mask_load_window cpl_mask_save cpl_mask_threshold_image cpl_init Now supports a new, experimental and faster FITS I/O mode, which is enabled at run-time via the environment variable CPL_IO_MODE. Refer to the documentation of cpl_init() for more details. - Deprecated types and identifiers cpl_apertures_get_max_x Replace with cpl_apertures_get_pos_x cpl_apertures_get_max_y Replace with cpl_apertures_get_pos_y cpl_type_bpp Replace with cpl_type CPL_BPP_8_UNSIGNED Replace with CPL_TYPE_UCHAR CPL_BPP_16_SIGNED Replace with CPL_TYPE_SHORT CPL_BPP_16_UNSIGNED Replace with CPL_TYPE_USHORT CPL_BPP_32_SIGNED Replace with CPL_TYPE_INT CPL_BPP_IEEE_FLOAT Replace with CPL_TYPE_FLOAT CPL_BPP_IEEE_DOUBLE Replace with CPL_TYPE_DOUBLE No CPL_BPP macro should be used in a direct call to CFITSIO, this will no longer work. - Deprecated functions cpl_apertures_get_fwhm Replace with a loop over cpl_image_get_fwhm - No-cast image saving. cpl_image_save() and cpl_imagelist_save() now supports CPL_TYPE_UNSPECIFIED as file type, this ensures that the saving incurs no loss of information. - A new type - cpl_size - to be used for all size-related parameters in CPL. cpl_size is the largest possible signed integer type. The new type has its own format specifier, the string literal CPL_SIZE_FORMAT. - Functions with changed API (Parameter redeclaration to cpl_size*) Any call to one of the below functions must be modified accordingly cpl_apertures_extract cpl_apertures_extract_window cpl_array_get_maxpos cpl_array_get_minpos cpl_flux_get_bias_window cpl_flux_get_noise_window cpl_frameset_labelise cpl_frameset_extract cpl_geom_img_offset_combine cpl_image_get_maxpos cpl_image_get_maxpos_window cpl_image_get_minpos cpl_image_get_minpos_window cpl_image_labelise_mask_create cpl_image_move cpl_mask_move cpl_matrix_get_maxpos cpl_matrix_get_minpos cpl_polynomial_fit cpl_polynomial_get_coeff cpl_polynomial_set_coeff cpl_table_get_column_maxpos cpl_table_get_column_minpos - Functions with changed API (Parameter redeclaration to cpl_array*) Any call to one of the below functions must be modified accordingly (If a call passes NULL as the optional permutation parameter, then no change is required). cpl_matrix_decomp_lu cpl_matrix_solve_lu - Functions with changed API (Function or parameter redeclaration to cpl_size) Any call to one of the below functions must at least be recompiled, or better modified according to the new API cpl_apertures_get_bottom cpl_apertures_get_bottom_x cpl_apertures_get_centroid_x cpl_apertures_get_centroid_y cpl_apertures_get_flux cpl_apertures_get_left cpl_apertures_get_left_y cpl_apertures_get_max cpl_apertures_get_max_x cpl_apertures_get_max_y cpl_apertures_get_mean cpl_apertures_get_median cpl_apertures_get_min cpl_apertures_get_npix cpl_apertures_get_right cpl_apertures_get_right_y cpl_apertures_get_size cpl_apertures_get_stdev cpl_apertures_get_top cpl_apertures_get_top_x cpl_array_count_invalid cpl_array_dump cpl_array_erase_window cpl_array_extract cpl_array_fill_window cpl_array_fill_window_complex cpl_array_fill_window_double cpl_array_fill_window_double_complex cpl_array_fill_window_float cpl_array_fill_window_float_complex cpl_array_fill_window_int cpl_array_fill_window_invalid cpl_array_fill_window_string cpl_array_get cpl_array_get_complex cpl_array_get_double cpl_array_get_double_complex cpl_array_get_float cpl_array_get_float_complex cpl_array_get_int cpl_array_get_size cpl_array_get_string cpl_array_insert cpl_array_insert_window cpl_array_is_valid cpl_array_new cpl_array_set cpl_array_set_complex cpl_array_set_double cpl_array_set_double_complex cpl_array_set_float cpl_array_set_float_complex cpl_array_set_int cpl_array_set_invalid cpl_array_set_size cpl_array_set_string cpl_array_wrap_double cpl_array_wrap_double_complex cpl_array_wrap_float cpl_array_wrap_float_complex cpl_array_wrap_int cpl_array_wrap_string cpl_bivector_get_size cpl_bivector_new cpl_fit_image_gaussian cpl_fit_imagelist_polynomial cpl_fit_imagelist_polynomial_window cpl_fits_count_extensions cpl_fits_find_extension cpl_flux_get_noise_ring cpl_frame_get_nextensions cpl_frame_get_nplanes cpl_framedata_create cpl_framedata_get_min_count cpl_framedata_get_max_count cpl_framedata_set_min_count cpl_framedata_set_max_count cpl_framedata_set cpl_frameset_erase cpl_frameset_get_frame_const cpl_frameset_get_frame cpl_frameset_get_size cpl_geom_img_offset_fine cpl_geom_img_offset_saa cpl_image_accept cpl_image_collapse_median_create cpl_image_collapse_window_create cpl_image_copy cpl_image_count_rejected cpl_image_dump_window cpl_image_extract cpl_image_extract_subsample cpl_image_fill_test_create cpl_image_fit_gaussian cpl_image_get cpl_image_get_absflux_window cpl_image_get_centroid_x_window cpl_image_get_centroid_y_window cpl_image_get_complex cpl_image_get_flux_window cpl_image_get_fwhm cpl_image_get_max_window cpl_image_get_mean_window cpl_image_get_median_dev_window cpl_image_get_median_window cpl_image_get_min_window cpl_image_get_size_x cpl_image_get_size_y cpl_image_get_sqflux_window cpl_image_get_stdev_window cpl_image_iqe cpl_image_is_rejected cpl_imagelist_collapse_minmax_create cpl_imagelist_dump_window cpl_imagelist_get cpl_imagelist_get_const cpl_imagelist_get_size cpl_imagelist_load cpl_imagelist_load_frameset cpl_imagelist_load_window cpl_imagelist_set cpl_imagelist_unset cpl_image_load cpl_image_load_window cpl_image_new cpl_image_rebin cpl_image_reject cpl_image_set cpl_image_set_complex cpl_image_shift cpl_image_wrap cpl_image_wrap_double cpl_image_wrap_double_complex cpl_image_wrap_float cpl_image_wrap_float_complex cpl_image_wrap_int cpl_mask_copy cpl_mask_count cpl_mask_count_window cpl_mask_dump_window cpl_mask_extract cpl_mask_extract_subsample cpl_mask_get cpl_mask_get_size_x cpl_mask_get_size_y cpl_mask_is_empty_window cpl_mask_load cpl_mask_load_window cpl_mask_new cpl_mask_set cpl_mask_shift cpl_mask_wrap cpl_matrix_copy cpl_matrix_erase_columns cpl_matrix_erase_rows cpl_matrix_extract cpl_matrix_extract_column cpl_matrix_extract_diagonal cpl_matrix_extract_row cpl_matrix_fill_column cpl_matrix_fill_diagonal cpl_matrix_fill_row cpl_matrix_fill_window cpl_matrix_get cpl_matrix_get_ncol cpl_matrix_get_nrow cpl_matrix_new cpl_matrix_resize cpl_matrix_set cpl_matrix_set_size cpl_matrix_shift cpl_matrix_swap_columns cpl_matrix_swap_rowcolumn cpl_matrix_swap_rows cpl_matrix_wrap cpl_parameterlist_get_size cpl_plot_bivectors cpl_plot_columns cpl_plot_image_col cpl_plot_image_row cpl_plot_vectors cpl_polynomial_derivative cpl_polynomial_extract cpl_polynomial_fit_1d_create cpl_polynomial_fit_2d_create cpl_polynomial_get_degree cpl_polynomial_get_dimension cpl_polynomial_new cpl_polynomial_shift_1d cpl_polynomial_solve_1d cpl_property_get_size cpl_propertylist_load cpl_propertylist_load_regexp cpl_property_new_array cpl_recipeconfig_get_min_count cpl_recipeconfig_get_max_count cpl_recipeconfig_set_tag cpl_recipeconfig_set_input cpl_stats_get_max_x cpl_stats_get_max_y cpl_stats_get_min_x cpl_stats_get_min_y cpl_stats_get_npix cpl_stats_new_from_image_window cpl_table_and_selected cpl_table_and_selected_double cpl_table_and_selected_double_complex cpl_table_and_selected_float cpl_table_and_selected_float_complex cpl_table_and_selected_int cpl_table_and_selected_invalid cpl_table_and_selected_string cpl_table_and_selected_window cpl_table_count_invalid cpl_table_count_selected cpl_table_dump cpl_table_erase_window cpl_table_extract cpl_table_fill_column_window cpl_table_fill_column_window_array cpl_table_fill_column_window_complex cpl_table_fill_column_window_double cpl_table_fill_column_window_double_complex cpl_table_fill_column_window_float cpl_table_fill_column_window_float_complex cpl_table_fill_column_window_int cpl_table_fill_column_window_string cpl_table_get cpl_table_get_array cpl_table_get_column_depth cpl_table_get_column_dimension cpl_table_get_column_dimensions cpl_table_get_complex cpl_table_get_double cpl_table_get_double_complex cpl_table_get_float cpl_table_get_float_complex cpl_table_get_int cpl_table_get_ncol cpl_table_get_nrow cpl_table_get_string cpl_table_insert cpl_table_insert_window cpl_table_is_selected cpl_table_is_valid cpl_table_load_window cpl_table_new cpl_table_new_column_array cpl_table_not_selected cpl_table_or_selected cpl_table_or_selected_double cpl_table_or_selected_double_complex cpl_table_or_selected_float cpl_table_or_selected_float_complex cpl_table_or_selected_int cpl_table_or_selected_invalid cpl_table_or_selected_string cpl_table_or_selected_window cpl_table_select_row cpl_table_set cpl_table_set_array cpl_table_set_column_depth cpl_table_set_column_invalid cpl_table_set_complex cpl_table_set_double cpl_table_set_double_complex cpl_table_set_float cpl_table_set_float_complex cpl_table_set_int cpl_table_set_invalid cpl_table_set_size cpl_table_set_string cpl_table_shift_column cpl_table_unselect_row cpl_table_where_selected cpl_test_end cpl_test_eq_macro cpl_test_macro cpl_test_noneq_macro cpl_vector_correlate cpl_vector_extract cpl_vector_filter_lowpass_create cpl_vector_filter_median_create cpl_vector_find cpl_vector_get cpl_vector_get_size cpl_vector_load cpl_vector_new cpl_vector_new_from_image_column cpl_vector_new_from_image_row cpl_vector_set cpl_vector_set_size cpl_vector_wrap - Functions with changed API (Parameter redeclaration to cpl_type) Any call to one of the below functions must at least be recompiled, or better modified according to the new API cpl_dfs_save_image cpl_dfs_save_imagelist cpl_image_save cpl_imagelist_save - The release fixes the following bugs The use of an unnamed OpenMP critical section cpl_init() segfaults with OpenMP if OMP_NUM_THREADS is undefined cpl_fit_imagelist_polynomial() SIGABRT on complex input cpl_image_filter(), cpl_image_filter_mask(): Error handling bug cpl_imagelist_collapse_sigclip_create(): Nothing is rejected cpl_image_get_complex(): NULL input dereferenced cpl_geom_img_offset_combine(): Input imagelist is now const - The release fixes the following documentation errors Missing doxygen for cpl_stats modes, CPL_STATS_* cpl_dfs_save_propertylist: applist is no longer optional cpl_dfs_save_imagelist: applist is no longer optional cpl_dfs_save_table: applist is no longer optional What's new in CPL 5.2 ============================================ - New functions in CPL 5.2: cpl_array_cast() cpl_mask_filter() cpl_plot_mask() cpl_image_unset_bpm() - New functionality: cpl_table_cast_column() allows casting from array columns of depth one to plain columns, and viceversa. - Bug fixes: Casting table columns of type array to columns of type array. cpl_table_save() returns in case of ILLEGAL_OUTPUT caused by zero depth integer array columns; allocate empty integer arrays in case they must be written to file. cpl_image_new_from_accepted(): Older versions would force the creation of an empty bad pixel map in any image in the input image list, that did not already have one. cpl_detector_interpolate_rejected(): Older versions would use wrong interpolation values at the image border. cpl_wcs_platesol(): All previous versions computes a wrong solution. cpl_bivector_interpolate_linear(): Versions from 4.2.0 interpolates the first value wrongly. cpl_stats_dump(): Older versions do not dump median deviation cpl_geom_img_offset_combine(): Older versions would use the error code CPL_ERROR_ILLEGAL_OUTPUT instead of CPL_ERROR_DATA_NOT_FOUND. cpl_dfs_update_product_header(): Older versions would not work if the system macro L2_CACHE_BYTES was defined to 0. cpl_end(): Free any memory allocated internally by FFTW. cpl_vector_find(): Fail on non-sorted vector elements. - Deprecated functions cpl_mask_closing(): Use cpl_mask_filter() instead cpl_mask_opening(): Use cpl_mask_filter() instead cpl_mask_erosion(): Use cpl_mask_filter() instead cpl_mask_dilation(): Use cpl_mask_filter() instead - Doc fixes: Specify that all arrays in a column must have same length Complete doc of cpl_table_set_array() Fix wrong LaTex code in cpl_fit_image_gaussian() doc. Document that cpl_geom_img_offset_saa() handles bad pixels. The pixel indexing convention ((1,1) for lower left) is documented. The deprecated CPL functions are clearly documented as such. What's new in CPL 5.1 ============================================ - New functions in CPL 5.1 cpl_array_is_valid cpl_array_dump_structure cpl_array_dump cpl_fit_image_gaussian cpl_flux_get_bias_window cpl_mask_dump_window cpl_propertylist_append_property cpl_propertylist_prepend_property cpl_propertylist_insert_property cpl_propertylist_insert_after_property cpl_test_array_abs cpl_test_eq_error cpl_test_eq_ptr cpl_test_get_cputime cpl_test_get_walltime cpl_test_imagelist_abs cpl_test_noneq_ptr cpl_test_vector_abs - New function modes in CPL 5.1. CPL_IO_APPEND - Deprecated functions cpl_image_fit_gaussian: Use cpl_fit_image_gaussian instead. - Other Changes CPL functions with complex types in their API are only available (declared) when the CPL-based application #include's <complex.h>. The functions effected by this are: cpl_image_wrap_double_complex cpl_image_wrap_float_complex cpl_image_get_complex cpl_image_set_complex cpl_image_get_data_double_complex cpl_image_get_data_double_complex_const cpl_image_get_data_float_complex cpl_image_get_data_float_complex_const - Bug fixes The filtering mode CPL_FILTER_STDEV had a bug which could cause wrong outputs. This has been fixed. - Known Problems CPL release 5.1 (and all releases back to and including 4.1) has a documentation bug in both cpl_image_turn() and cpl_mask_turn(). The orientation of the rotation is opposite of what is stated in the documentation. Given a rotation of 1, the function will rotate by 90 degrees clockwise and given a rotation of -1 the function will rotate by 90 degrees counterclockwise. The documentation of rotation by any odd number is similarly wrong. The documentation of rotation by any even number is unaffected by the error. What's new in CPL 5.0 ============================================ - Deprecated functions. A number of functions are now deprecated. The deprecated functions will remain in CPL 5.X. The deprecated functions are: cpl_fits_get_nb_extensions cpl_fits_get_extension_nb cpl_image_filter_median cpl_image_filter_linear cpl_image_filter_stdev cpl_image_filter_morpho cpl_msg_progress cpl_polynomial_fit_1d_create cpl_polynomial_fit_2d_create cpl_vector_new_lss_kernel cpl_vector_convolve_symmetric - Warnings of use of deprecated functions. Using gcc to compile code using the above mentioned functions will lead to compiler warnings. These warnings can be suppressed with -Wno-deprecated-declarations. This gcc option can be applied with ./configure CFLAGS=-Wno-deprecated-declarations . - Functions with changed API cpl_dfs_save_image cpl_dfs_save_table cpl_dfs_save_propertylist cpl_dfs_save_imagelist cpl_dfs_setup_product_header cpl_geom_img_offset_saa cpl_propertylist_erase_regexp cpl_image_get_bpm_const cpl_polynomial_shift_1d cpl_imagelist_collapse_sigclip_create - How to replace deprecated functions cpl_fits_get_nb_extensions: Replace with cpl_fits_count_extensions cpl_fits_get_extension_nb: Replace with cpl_fits_find_extension cpl_image_filter_median: cpl_image * a = cpl_image_filter_median(b, k) can be replaced by int nx = cpl_image_get_size_x(b); int ny = cpl_image_get_size_y(b); int type = cpl_image_type(b); cpl_image * a = cpl_image_new(nx, ny, type); cpl_image_filter_mask(a, b, m, CPL_FILTER_MEDIAN, CPL_BORDER_FILTER); - where m is a cpl_mask with a CPL_BINARY_1 whereever k has a 1.0. cpl_image_filter_stdev: Same as for cpl_image_filter_median, but with CPL_FILTER_STDEV cpl_image_filter_linear: cpl_image * a = cpl_image_filter_linear(b, k) can be replaced by int nx = cpl_image_get_size_x(b); int ny = cpl_image_get_size_y(b); int type = cpl_image_type(b); cpl_image * a = cpl_image_new(nx, ny, type); cpl_image_filter(a, b, k, CPL_FILTER_LINEAR, CPL_BORDER_FILTER); - where m is the cpl_matrix with the weights. cpl_image_filter_morpho: Same as for cpl_image_filter_linear, but with CPL_FILTER_MORPHO cpl_polynomial_fit_1d_create: cpl_polynomial * fit1d = cpl_polynomial_fit_1d_create(x_pos, values, degree, mse); can be replaced by cpl_polynomial * fit1d = cpl_polynomial_new(1); cpl_matrix * samppos = cpl_matrix_wrap(1, cpl_vector_get_size(x_pos), cpl_vector_get_data(x_pos)); cpl_vector * fitresidual = cpl_vector_new(cpl_vector_get_size(x_pos)); cpl_polynomial_fit(fit1d, samppos, NULL, values, NULL, CPL_FALSE, NULL, °ree); cpl_vector_fill_polynomial_fit_residual(fitresidual, values, NULL, fit1d, samppos, NULL); cpl_matrix_unwrap(samppos); mse = cpl_vector_product(fitresidual, fitresidual) / cpl_vector_get_size(fitresidual); cpl_vector_delete(fitresidual); cpl_polynomial_fit_2d_create: Similar to 1D, and the samppos matrix must have two rows with copies of the two vectors in the x_pos bivector. cpl_msg_progress: This function has no CPL 5.X equivalent cpl_vector_new_lss_kernel: This function has no CPL 5.X equivalent cpl_vector_convolve_symmetric: This function has no CPL 5.X equivalent - How to change the calls to functions with new prototypes cpl_dfs_save_image(allframes, parlist, usedframes, image, bpp, recipe, procat, applist, remregexp, pipe_id, filename); can be replaced with: cpl_propertylist * prolist = applist ? cpl_propertylist_duplicate(applist) : cpl_propertylist_new(); cpl_propertylist_append_string(prolist, CPL_DFS_PRO_CATG, procat); cpl_dfs_save_image(allframes, NULL, parlist, usedframes, NULL, image, bpp, recipe, prolist, remregexp, pipe_id, filename); cpl_propertylist_delete(prolist); cpl_dfs_save_table: See cpl_dfs_save_image cpl_dfs_save_propertylist: See cpl_dfs_save_image cpl_dfs_save_imagelist: See cpl_dfs_save_image cpl_dfs_setup_product_header: Append a NULL pointer to the argument list, cpl_geom_img_offset_saa: : Append two NULL pointers to the argument list, cpl_propertylist_erase_regexp: In case of error, the return value is now -1 instead of 0. cpl_image_get_bpm_const: The function will now return NULL if the image does not have a bad pixel map, meaning no pixels are bad. If the input image is guaranteed to have a bad pixel map, then no change is needed. Otherwise, if the bad pixel map must be modified the call should be replaced with cpl_image_get_bpm(). If the bad pixel map will not be modified i.e. only read, then a NULL value indicates that no pixels are bad. This can be used both to determine if a pixel map exists for the image, and to choose faster methods when no pixels are bad. cpl_polynomial_shift_1d: Insert a 0 between the current two parameters. cpl_imagelist_collapse_sigclip_create: Extend the argument list with 0.0, 1.0, 1, NULL. - New functions in CPL cpl_image_filter_xyz cpl_fits_count_extensions cpl_fits_find_extension cpl_array_get_max cpl_array_get_min cpl_array_get_maxpos cpl_array_get_minpos cpl_array_get_mean cpl_array_get_median cpl_array_get_stdev cpl_array_extract cpl_array_insert_window cpl_array_erase_window cpl_array_insert cpl_array_add cpl_array_subtract cpl_array_multiply cpl_array_divide cpl_array_add_scalar cpl_array_subtract_scalar cpl_array_multiply_scalar cpl_array_divide_scalar cpl_array_set_size cpl_image_rebin cpl_image_fill_jacobian cpl_image_fill_jacobian_polynomial cpl_array_power cpl_array_abs cpl_array_logarithm cpl_array_exponential cpl_table_where_selected cpl_table_set_column_savetype cpl_image_wrap_double_complex cpl_image_wrap_float_complex cpl_image_get_data_double_complex cpl_image_get_data_double_complex_const cpl_image_get_data_float_complex cpl_image_get_data_float_complex_const cpl_image_get_complex cpl_image_set_complex - New types CPL_TYPE_DOUBLE_COMPLEX and CPL_TYPE_FLOAT_COMPLEX These 2 types are now supported for a limited set of image functions: cpl_image_new cpl_image_add cpl_image_subtract cpl_image_multiply cpl_image_divide cpl_image_add_create cpl_image_subtract_create cpl_image_multiply_create cpl_image_divide_create cpl_image_cast cpl_image_fill_rejected cpl_image_dump_window cpl_image_extract The purpose of the inclusion of these new types is to ease operations with the FFTW library on CPL images. With these new types, there is no need to remap the input pixel buffer before calling FFTW. Example (with FFTW 2.1.5): cpl_image * in = cpl_image_new(nx, ny, CPL_TYPE_FLOAT); cpl_image * out = cpl_image_new(nx, ny, CPL_TYPE_FLOAT_COMPLEX); float * in_b = cpl_image_get_data_float(in); float complex * out_b = cpl_image_get_data_float_complex(out); fftwnd_plan rp = rfftw2d_create_plan(nx, ny, FFTW_FORWARD, FFTW_ESTIMATE); cpl_image_fill_noise_uniform(in, 0.0, 10.0); rfftwnd_real_to_complex(rp, 1, (fftw_real *)in_b, 1, nx * ny, (fftw_complex *)out_b, 1, nx * ny); my_frequency_processing(out); |