class ObservationManager(object): """A class to maintain information about the reflections during optimisation of their scale factors.""" def __init__(self, reflections, experiment, params=None): if params is None: params = om_scope.extract() # initial filter reflections = reflections.select( reflections.get_flags(reflections.flags.integrated)) # create new column containing the reduced Miller index xl = experiment.crystal symm = cctbx.crystal.symmetry(xl.get_unit_cell(), space_group=xl.get_space_group()) hkl_set = cctbx.miller.set(symm, reflections['miller_index']) asu_set = hkl_set.map_to_asu() reflections['asu_miller_index'] = asu_set.indices() # sort table by reduced hkl reflections.sort('asu_miller_index') if params.observations.integration_type == 'mix': raise Sorry('integration_type=mix is not supported yet') else: ikey = 'intensity.' + params.observations.integration_type + '.value' vkey = 'intensity.' + params.observations.integration_type + '.variance' # filters sel = reflections[vkey] > 0 reflections = reflections.select(sel) if params.observations.i_over_sigma_cutoff > 0: ios = reflections[ikey] / flex.sqrt(reflections[vkey]) sel = ios >= params.observations.i_over_sigma_cutoff reflections = reflections.select(sel) if params.observations.min_multiplicity > 0: sel = minimum_multiplicity_selection( reflections['asu_miller_index'], params.observations.min_multiplicity) reflections = reflections.select(sel) # extract columns of interest gp_idx = reflections['asu_miller_index'] intensity = reflections[ikey] weight = 1. / reflections[vkey] phi = reflections['xyzcal.mm'].parts()[2] scale = flex.double(len(reflections), 1.0) # set up reflection grouping object self._go = GroupedObservations(gp_idx, intensity, weight, phi, scale) return @property def intensity(self): return self._go.get_intensity() @intensity.setter def intensity(self, intensity): self._go.set_intensity(intensity) @property def weight(self): return self._go.get_weight() @weight.setter def weight(self, weight): self._go.set_weight(weight) @property def scale(self): return self._go.get_scale() @scale.setter def scale(self, scale): self._go.set_scale(scale) @property def group_index(self): return self._go.get_group_index() @property def phi(self): return self._go.get_phi() @property def group_size(self): return self._go.get_group_size() def get_average_intensity(self): '''Calculate the weighted average intensity in reflection groups at the current scales using the formula of Hamilton, Rollett and Sparks (1965). Return as a vector for each observation''' # delegate to the GroupedObservations object return self._go.get_average_intensity()
class ObservationManager(object): """A class to maintain information about the reflections during optimisation of their scale factors.""" def __init__(self, reflections, experiment, params=None): if params is None: params = om_scope.extract() # initial filter reflections = reflections.select(reflections.get_flags( reflections.flags.integrated)) # create new column containing the reduced Miller index xl = experiment.crystal symm = cctbx.crystal.symmetry(xl.get_unit_cell(), space_group=xl.get_space_group()) hkl_set = cctbx.miller.set(symm, reflections['miller_index']) asu_set = hkl_set.map_to_asu() reflections['asu_miller_index'] = asu_set.indices() # sort table by reduced hkl reflections.sort('asu_miller_index') if params.observations.integration_type == 'mix': raise Sorry('integration_type=mix is not supported yet') else: ikey = 'intensity.' + params.observations.integration_type + '.value' vkey = 'intensity.' + params.observations.integration_type + '.variance' # filters sel = reflections[vkey] > 0 reflections = reflections.select(sel) if params.observations.i_over_sigma_cutoff > 0: ios = reflections[ikey] / flex.sqrt(reflections[vkey]) sel = ios >= params.observations.i_over_sigma_cutoff reflections = reflections.select(sel) if params.observations.min_multiplicity > 0: sel = minimum_multiplicity_selection(reflections['asu_miller_index'], params.observations.min_multiplicity) reflections = reflections.select(sel) # extract columns of interest gp_idx = reflections['asu_miller_index'] intensity = reflections[ikey] weight = 1. / reflections[vkey] phi = reflections['xyzcal.mm'].parts()[2] scale = flex.double(len(reflections), 1.0) # set up reflection grouping object self._go = GroupedObservations(gp_idx, intensity, weight, phi, scale) return @property def intensity(self): return self._go.get_intensity() @intensity.setter def intensity(self, intensity): self._go.set_intensity(intensity) @property def weight(self): return self._go.get_weight() @weight.setter def weight(self, weight): self._go.set_weight(weight) @property def scale(self): return self._go.get_scale() @scale.setter def scale(self, scale): self._go.set_scale(scale) @property def group_index(self): return self._go.get_group_index() @property def phi(self): return self._go.get_phi() @property def group_size(self): return self._go.get_group_size() def get_average_intensity(self): '''Calculate the weighted average intensity in reflection groups at the current scales using the formula of Hamilton, Rollett and Sparks (1965). Return as a vector for each observation''' # delegate to the GroupedObservations object return self._go.get_average_intensity()