def merging_stats_from_scaled_array( scaled_miller_array, n_bins=20, use_internal_variance=False, anomalous=True ): """Calculate the normal and anomalous merging statistics.""" if scaled_miller_array.is_unique_set_under_symmetry(): raise DialsMergingStatisticsError( "Dataset contains no equivalent reflections, merging statistics " "cannot be calculated." ) try: result = iotbx.merging_statistics.dataset_statistics( i_obs=scaled_miller_array, n_bins=n_bins, anomalous=False, sigma_filtering=None, eliminate_sys_absent=False, use_internal_variance=use_internal_variance, cc_one_half_significance_level=0.01, ) except (RuntimeError, Sorry) as e: raise DialsMergingStatisticsError( f"Error encountered during merging statistics calculation:\n{e}" ) anom_result = None if anomalous: intensities_anom = scaled_miller_array.as_anomalous_array() intensities_anom = intensities_anom.map_to_asu().customized_copy( info=scaled_miller_array.info() ) if intensities_anom.is_unique_set_under_symmetry(): logger.warning( "Anomalous dataset contains no equivalent reflections, anomalous " "merging statistics cannot be calculated." ) else: try: anom_result = iotbx.merging_statistics.dataset_statistics( i_obs=intensities_anom, n_bins=n_bins, anomalous=True, sigma_filtering=None, cc_one_half_significance_level=0.01, eliminate_sys_absent=False, use_internal_variance=use_internal_variance, ) except (RuntimeError, Sorry) as e: logger.warning( "Error encountered during anomalous merging statistics " "calculation:\n%s", e, exc_info=True, ) return result, anom_result
def merging_stats_from_scaled_array( scaled_miller_array, n_bins=20, use_internal_variance=False ): """Calculate the normal and anomalous merging statistics.""" if scaled_miller_array.is_unique_set_under_symmetry(): raise DialsMergingStatisticsError( "Dataset contains no equivalent reflections, merging statistics cannot be calculated." ) try: result = iotbx.merging_statistics.dataset_statistics( i_obs=scaled_miller_array, n_bins=n_bins, anomalous=False, sigma_filtering=None, eliminate_sys_absent=False, use_internal_variance=use_internal_variance, cc_one_half_significance_level=0.01, ) intensities_anom = scaled_miller_array.as_anomalous_array() intensities_anom = intensities_anom.map_to_asu().customized_copy( info=scaled_miller_array.info() ) anom_result = iotbx.merging_statistics.dataset_statistics( i_obs=intensities_anom, n_bins=n_bins, anomalous=True, sigma_filtering=None, cc_one_half_significance_level=0.01, eliminate_sys_absent=False, use_internal_variance=use_internal_variance, ) except RuntimeError: raise DialsMergingStatisticsError( "Failure during merging statistics calculation" ) else: return result, anom_result
def _test_Imid_combinations(self): rows = [] results = {} for Imid in self.Imids: combined_intensities = flex.double([]) combined_sigmas = flex.double([]) combined_scales = flex.double([]) combined_indices = flex.miller_index([]) for dataset in self.datasets: Int, Var = _get_Is_from_Imidval(dataset, Imid) Int *= dataset["prescaling_correction"] sigma = (Var**0.5) * dataset["prescaling_correction"] combined_intensities.extend(Int) combined_sigmas.extend(sigma) combined_scales.extend(dataset["inverse_scale_factor"]) combined_indices.extend(dataset["miller_index"]) # apply scale factor before determining merging stats miller_set = miller.set( crystal_symmetry=self.experiment.crystal.get_crystal_symmetry( ), indices=combined_indices, anomalous_flag=False, ) i_obs = miller.array(miller_set, data=combined_intensities / combined_scales) i_obs.set_observation_type_xray_intensity() i_obs.set_sigmas(combined_sigmas / combined_scales) try: rmeas, cchalf = fast_merging_stats(array=i_obs) logger.debug("Imid: %s, Rmeas %s, cchalf %s", Imid, rmeas, cchalf) except RuntimeError: raise DialsMergingStatisticsError( "Unable to merge for intensity combination") # record the results results[Imid] = rmeas res_str = {0: "prf only", 1: "sum only"} if not Imid in res_str: res_str[Imid] = "Imid = " + str(round(Imid, 2)) rows.append( [res_str[Imid], str(round(cchalf, 5)), str(round(rmeas, 5))]) return rows, results
def _test_Imid_combinations(self): """Test the different combinations, returning the rows and results dict.""" rows = [] results = {} for Imid in self.Imids: Int, Var = _get_Is_from_Imidval(self.dataset, Imid) miller_set = miller.set( crystal_symmetry=self.experiment.crystal.get_crystal_symmetry( assert_is_compatible_unit_cell=False ), indices=self.dataset["miller_index"], anomalous_flag=False, ) i_obs = miller.array( miller_set, data=( Int * self.dataset["prescaling_correction"] / self.dataset["inverse_scale_factor"] ), ) i_obs.set_observation_type_xray_intensity() i_obs.set_sigmas( flex.sqrt(Var) * self.dataset["prescaling_correction"] / self.dataset["inverse_scale_factor"] ) try: rmeas, cchalf = fast_merging_stats(array=i_obs) logger.debug("Imid: %s, Rmeas %s, cchalf %s", Imid, rmeas, cchalf) except RuntimeError: raise DialsMergingStatisticsError( "Unable to merge for intensity combination" ) # record the results results[Imid] = rmeas res_str = {0: "prf only", 1: "sum only"} if Imid not in res_str: res_str[Imid] = "Imid = " + str(round(Imid, 2)) rows.append([res_str[Imid], str(round(cchalf, 5)), str(round(rmeas, 5))]) return rows, results