def combine_files(self, input_files: [FileDescriptor], data_model: DataModel, filter_name: str, output_path: str, console: Console): """ Combine the given files, output to the given output file using the combination method defined in the data model. :param input_files: List of files to be combined :param data_model: Data model with options for this run :param filter_name: Human-readable filter name (for output file name and FITS comment) :param output_path: Path for output fiel to be created :param console: Redirectable console output object """ console.push_level( ) # Stack console indentation level to easily restore when done substituted_file_name = SharedUtils.substitute_date_time_filter_in_string( output_path) file_names = [d.get_absolute_path() for d in input_files] combine_method = data_model.get_master_combine_method() # Get info about any precalibration that is to be done calibrator = Calibrator(data_model) calibration_tag = calibrator.fits_comment_tag() assert len(input_files) > 0 binning: int = input_files[0].get_binning() (mean_exposure, mean_temperature ) = ImageMath.mean_exposure_and_temperature(input_files) if combine_method == Constants.COMBINE_MEAN: mean_data = ImageMath.combine_mean(file_names, calibrator, console, self._session_controller) self.check_cancellation() RmFitsUtil.create_combined_fits_file( substituted_file_name, mean_data, FileDescriptor.FILE_TYPE_FLAT, "Flat Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Flat MEAN combined {calibration_tag}") elif combine_method == Constants.COMBINE_MEDIAN: median_data = ImageMath.combine_median(file_names, calibrator, console, self._session_controller) self.check_cancellation() RmFitsUtil.create_combined_fits_file( substituted_file_name, median_data, FileDescriptor.FILE_TYPE_FLAT, "Flat Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Flat MEDIAN combined {calibration_tag}") elif combine_method == Constants.COMBINE_MINMAX: number_dropped_points = data_model.get_min_max_number_clipped_per_end( ) min_max_clipped_mean = ImageMath.combine_min_max_clip( file_names, number_dropped_points, calibrator, console, self._session_controller) self.check_cancellation() assert min_max_clipped_mean is not None RmFitsUtil.create_combined_fits_file( substituted_file_name, min_max_clipped_mean, FileDescriptor.FILE_TYPE_FLAT, "Flat Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Flat Min/Max Clipped " f"(drop {number_dropped_points}) Mean combined" f" {calibration_tag}") else: assert combine_method == Constants.COMBINE_SIGMA_CLIP sigma_threshold = data_model.get_sigma_clip_threshold() sigma_clipped_mean = ImageMath.combine_sigma_clip( file_names, sigma_threshold, calibrator, console, self._session_controller) self.check_cancellation() assert sigma_clipped_mean is not None RmFitsUtil.create_combined_fits_file( substituted_file_name, sigma_clipped_mean, FileDescriptor.FILE_TYPE_FLAT, "Flat Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Flat Sigma Clipped " f"(threshold {sigma_threshold}) Mean combined" f" {calibration_tag}") console.pop_level()
def combine_files(self, input_files: [FileDescriptor], data_model: DataModel, filter_name: str, output_path: str, console: Console): console.push_level() substituted_file_name = SharedUtils.substitute_date_time_filter_in_string( output_path) file_names = [d.get_absolute_path() for d in input_files] combine_method = data_model.get_master_combine_method() # Get info about any precalibration that is to be done calibrator = Calibrator(data_model) calibration_tag = calibrator.fits_comment_tag() assert len(input_files) > 0 binning: int = input_files[0].get_binning() (mean_exposure, mean_temperature ) = ImageMath.mean_exposure_and_temperature(input_files) if combine_method == Constants.COMBINE_MEAN: mean_data = ImageMath.combine_mean(file_names, calibrator, console, self._session_controller) self.check_cancellation() RmFitsUtil.create_combined_fits_file( substituted_file_name, mean_data, FileDescriptor.FILE_TYPE_DARK, "Dark Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Dark MEAN combined {calibration_tag}") elif combine_method == Constants.COMBINE_MEDIAN: median_data = ImageMath.combine_median(file_names, calibrator, console, self._session_controller) self.check_cancellation() RmFitsUtil.create_combined_fits_file( substituted_file_name, median_data, FileDescriptor.FILE_TYPE_DARK, "Dark Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Dark MEDIAN combined {calibration_tag}") elif combine_method == Constants.COMBINE_MINMAX: number_dropped_points = data_model.get_min_max_number_clipped_per_end( ) min_max_clipped_mean = ImageMath.combine_min_max_clip( file_names, number_dropped_points, calibrator, console, self._session_controller) self.check_cancellation() assert min_max_clipped_mean is not None RmFitsUtil.create_combined_fits_file( substituted_file_name, min_max_clipped_mean, FileDescriptor.FILE_TYPE_DARK, "Dark Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Dark Min/Max Clipped " f"(drop {number_dropped_points}) Mean combined" f" {calibration_tag}") else: assert combine_method == Constants.COMBINE_SIGMA_CLIP sigma_threshold = data_model.get_sigma_clip_threshold() sigma_clipped_mean = ImageMath.combine_sigma_clip( file_names, sigma_threshold, calibrator, console, self._session_controller) self.check_cancellation() assert sigma_clipped_mean is not None RmFitsUtil.create_combined_fits_file( substituted_file_name, sigma_clipped_mean, FileDescriptor.FILE_TYPE_DARK, "Dark Frame", mean_exposure, mean_temperature, filter_name, binning, f"Master Dark Sigma Clipped " f"(threshold {sigma_threshold}) Mean combined" f" {calibration_tag}") console.pop_level()