def random_site(special_position_settings, existing_sites, min_hetero_distance=1.5, general_position_only=False, grid=None, t_centre_of_inversion=None, max_trials=100): for trial in xrange(max_trials): if (grid is None): site = (random.random(), random.random(), random.random()) else: site = [random.randrange(g) / float(g) for g in grid] site_symmetry = special_position_settings.site_symmetry(site) if (general_position_only and not site_symmetry.is_point_group_1()): continue sym_equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) if (not have_suitable_hetero_distance( existing_sites, sym_equiv_sites, min_hetero_distance)): continue site = site_symmetry.exact_site() if (t_centre_of_inversion is None): return site site_inv = [-x+t for x,t in zip(site, t_centre_of_inversion)] site_symmetry_inv = special_position_settings.site_symmetry(site_inv) if (general_position_only and not site_symmetry_inv.is_point_group_1()): continue sym_equiv_sites_inv = sgtbx.sym_equiv_sites(site_symmetry_inv) if (not have_suitable_hetero_distance( existing_sites + [site], sym_equiv_sites_inv, min_hetero_distance)): continue return site, site_symmetry_inv.exact_site() return None
def random_site(special_position_settings, existing_sites, min_hetero_distance=1.5, general_position_only=False, grid=None, t_centre_of_inversion=None, max_trials=100): for trial in xrange(max_trials): if (grid is None): site = (random.random(), random.random(), random.random()) else: site = [random.randrange(g) / float(g) for g in grid] site_symmetry = special_position_settings.site_symmetry(site) if (general_position_only and not site_symmetry.is_point_group_1()): continue sym_equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) if (not have_suitable_hetero_distance(existing_sites, sym_equiv_sites, min_hetero_distance)): continue site = site_symmetry.exact_site() if (t_centre_of_inversion is None): return site site_inv = [-x + t for x, t in zip(site, t_centre_of_inversion)] site_symmetry_inv = special_position_settings.site_symmetry(site_inv) if (general_position_only and not site_symmetry_inv.is_point_group_1()): continue sym_equiv_sites_inv = sgtbx.sym_equiv_sites(site_symmetry_inv) if (not have_suitable_hetero_distance(existing_sites + [site], sym_equiv_sites_inv, min_hetero_distance)): continue return site, site_symmetry_inv.exact_site() return None
def loop(self): for i_position in xrange(self.wyckoff_table.size()): site_symmetry_i = self.wyckoff_table.random_site_symmetry( special_position_settings=self.special_position_settings, i_position=i_position) equiv_sites_i = sgtbx.sym_equiv_sites(site_symmetry_i) for j_position in xrange(self.wyckoff_table.size()): for n_trial in xrange(self.max_trials_per_position): site_j = self.wyckoff_table.random_site_symmetry( special_position_settings=self. special_position_settings, i_position=j_position).exact_site() dist_info = sgtbx.min_sym_equiv_distance_info( equiv_sites_i, site_j) if (dist_info.dist() > self.min_cross_distance): structure = xray.structure( special_position_settings=self. special_position_settings, scatterers=flex.xray_scatterer([ xray.scatterer( scattering_type=self.scattering_type, site=site) for site in [site_symmetry_i.exact_site(), site_j] ])) yield structure, dist_info.dist() break
def show_patterson_peaks(self, min_relative_peak_height=0.1, show_at_least=3): print("Patterson peaks for %s:" % str(self.input.info())) reciprocal_map = self.input if (reciprocal_map.anomalous_flag()): reciprocal_map = reciprocal_map.average_bijvoet_mates() patterson_map = reciprocal_map.patterson_map( symmetry_flags=maptbx.use_space_group_symmetry) patterson_map.apply_sigma_scaling() peak_list = patterson_map.tags().peak_search( map=patterson_map.real_map(), parameters=maptbx.peak_search_parameters()) max_height = peak_list.heights()[0] sym_equiv_origin = sgtbx.sym_equiv_sites( unit_cell=patterson_map.unit_cell(), space_group=patterson_map.space_group(), original_site=(0, 0, 0)) print(" Fractional coordinates Height Distance from origin") for i_peak in range(peak_list.size()): height = peak_list.heights()[i_peak] if (height < max_height * min_relative_peak_height and i_peak > show_at_least): break site = peak_list.sites()[i_peak] dist_info = sgtbx.min_sym_equiv_distance_info( sym_equiv_origin, site) print(" %8.4f %8.4f %8.4f" % (dist_info.sym_op() * site), end=' ') print(" %8.3f %8.3f" % (height, dist_info.dist())) print()
def random_symmetry_mates(self): new_positions = [] for pos in self.positions(): equiv = sgtbx.sym_equiv_sites(self.site_symmetry(pos.site)) i = random.randrange(equiv.coordinates().size()) new_positions.append(emma.position(pos.label, equiv.coordinates()[i])) return self.create_new_test_model(new_positions)
def peak_cluster_reduction(crystal_symmetry, peak_list, min_peak_distance, max_reduced_peaks): special_position_settings = crystal.special_position_settings( crystal_symmetry=crystal_symmetry, min_distance_sym_equiv=min_peak_distance) peaks = [] for i,site in enumerate(peak_list.sites()): peaks.append(dicts.easy( site=special_position_settings.site_symmetry(site).exact_site(), height=peak_list.heights()[i])) reduced_peaks = [] for peak in peaks: site_symmetry = special_position_settings.site_symmetry(peak.site) equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) keep = True for reduced_peak in reduced_peaks: dist = sgtbx.min_sym_equiv_distance_info( equiv_sites, reduced_peak.site).dist() if (dist < min_peak_distance): keep = False break if (keep == True): reduced_peaks.append(peak) if (len(reduced_peaks) == max_reduced_peaks): break return reduced_peaks
def verify_match(model1, model2, tolerance, match_rt, pairs): adj_tolerance = tolerance * (1 + 1.e-6) for pair in pairs: c1 = model1[pair[0]].site c2 = match_rt * model2[pair[1]].site equiv_c2 = sgtbx.sym_equiv_sites(model1.site_symmetry(c2.elems)) dist_info = sgtbx.min_sym_equiv_distance_info(equiv_c2, c1) assert dist_info.dist() < adj_tolerance, str(model1.space_group_info())
def check_peaks(structure, peak_sites, max_min_dist): for scatterer in structure.scatterers(): site_symmetry = structure.site_symmetry(scatterer.site) equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) min_dist = None for peak_site in peak_sites: dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites, peak_site) if (min_dist is None): min_dist = dist_info.dist() else: min_dist = min(min_dist, dist_info.dist()) assert min_dist <= max_min_dist, (min_dist, max_min_dist)
def check_peaks(structure, peak_sites, max_min_dist): for scatterer in structure.scatterers(): site_symmetry = structure.site_symmetry(scatterer.site) equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) min_dist = None for peak_site in peak_sites: dist_info = sgtbx.min_sym_equiv_distance_info( equiv_sites, peak_site) if (min_dist is None): min_dist = dist_info.dist() else: min_dist = min(min_dist, dist_info.dist()) assert min_dist <= max_min_dist, (min_dist, max_min_dist)
def expand_to_p1(self): new_model = model( crystal.special_position_settings( crystal.symmetry.cell_equivalent_p1(self))) for pos in self._positions: site_symmetry = self.site_symmetry(pos.site) equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) i = 0 for site in equiv_sites.coordinates(): i += 1 new_model.add_position( position(label=pos.label + "_%03d" % i, site=site)) return new_model
def expand_to_p1(self): new_model = model( crystal.special_position_settings( crystal.symmetry.cell_equivalent_p1(self))) for pos in self._positions: site_symmetry = self.site_symmetry(pos.site) equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) i = 0 for site in equiv_sites.coordinates(): i += 1 new_model.add_position(position( label=pos.label+"_%03d"%i, site=site)) return new_model
def run(): uc = (10, 12, 14, 90, 90, 90) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 1") assert harker.planes_cartesian(cs).count() == 0 assert harker.planes_cartesian(cs).min_distance((0, 0, 0)) is None cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 2 2 2") assert harker.planes_cartesian(cs).count() == 3 assert ae(harker.planes_cartesian(cs).min_distance((0.123, 0.234, 0)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.123, 0, 0.234)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0, 0.123, 0.234)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.234, 0.345)), 1) assert ae( harker.planes_cartesian(cs).min_distance((0.234, 0.1, 0.345)), 1.2) assert ae( harker.planes_cartesian(cs).min_distance((0.234, 0.345, 0.1)), 1.4) assert ae(harker.planes_cartesian(cs).min_distance((0.2, 0.2, 0.1)), 1.4) assert ae(harker.planes_cartesian(cs).min_distance((0.2, 0.1, 0.1)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 0.2)), 1) assert ae(harker.planes_cartesian(cs).min_distance((-0.2, 0.1, 0.1)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((0.2, -0.1, 0.1)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((0.2, 0.1, -0.1)), 1.2) assert ae( harker.planes_cartesian(cs).min_distance((-0.2, -0.1, -0.1)), 1.2) uc = (10, 10, 12, 90, 90, 120) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 3") assert harker.planes_cartesian(cs).count() == 1 assert ae(harker.planes_cartesian(cs).min_distance((0, 0, 0)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 3.)), 4) assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 2.)), 6) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 31") assert harker.planes_cartesian(cs).count() == 1 assert ae(harker.planes_cartesian(cs).min_distance((0, 0, 0)), 4) assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 3.)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 2.)), 2) uc = (10, 10, 12, 90, 90, 90) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4 2 2") assert harker.planes_cartesian(cs).count() == 5 cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 41 2 2") assert harker.planes_cartesian(cs).count() == 6 ps = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4/m m m") for x, d, t in (((0.1, 0.2, 0.3), 0.6, "1"), ((0.1, 0.2, 0.75), 0, "1"), ((0.1, 0.0, 0.3), 0, "m")): ss = crystal.special_position_settings(ps).site_symmetry(x) assert ss.point_group_type() == t eq = sgtbx.sym_equiv_sites(ss) for x in eq.coordinates(): assert ae(harker.planes_cartesian(cs).min_distance(x), d) print("OK")
def run(): uc = (10,12,14,90,90,90) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 1") assert harker.planes_cartesian(cs).count() == 0 assert harker.planes_cartesian(cs).min_distance((0,0,0)) is None cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 2 2 2") assert harker.planes_cartesian(cs).count() == 3 assert ae(harker.planes_cartesian(cs).min_distance((0.123,0.234,0)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.123,0,0.234)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0,0.123,0.234)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.234,0.345)), 1) assert ae(harker.planes_cartesian(cs).min_distance((0.234,0.1,0.345)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((0.234,0.345,0.1)), 1.4) assert ae(harker.planes_cartesian(cs).min_distance((0.2,0.2,0.1)), 1.4) assert ae(harker.planes_cartesian(cs).min_distance((0.2,0.1,0.1)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,0.2)), 1) assert ae(harker.planes_cartesian(cs).min_distance((-0.2,0.1,0.1)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((0.2,-0.1,0.1)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((0.2,0.1,-0.1)), 1.2) assert ae(harker.planes_cartesian(cs).min_distance((-0.2,-0.1,-0.1)), 1.2) uc = (10,10,12,90,90,120) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 3") assert harker.planes_cartesian(cs).count() == 1 assert ae(harker.planes_cartesian(cs).min_distance((0,0,0)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/3.)), 4) assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/2.)), 6) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 31") assert harker.planes_cartesian(cs).count() == 1 assert ae(harker.planes_cartesian(cs).min_distance((0,0,0)), 4) assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/3.)), 0) assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/2.)), 2) uc = (10,10,12,90,90,90) cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4 2 2") assert harker.planes_cartesian(cs).count() == 5 cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 41 2 2") assert harker.planes_cartesian(cs).count() == 6 ps = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4/m m m") for x,d,t in (((0.1,0.2,0.3),0.6,"1"), ((0.1,0.2,0.75),0,"1"), ((0.1,0.0,0.3),0,"m")): ss = crystal.special_position_settings(ps).site_symmetry(x) assert ss.point_group_type() == t eq = sgtbx.sym_equiv_sites(ss) for x in eq.coordinates(): assert ae(harker.planes_cartesian(cs).min_distance(x), d) print "OK"
def next_with_effective_resolution(self): while 1: peak_list_index = self._peak_list_index if (peak_list_index >= self._peak_list.size()): return None self._peak_list_index += 1 if (self._is_processed is not None): if (self._is_processed[peak_list_index]): continue self._is_processed[peak_list_index] = True grid_index = self._peak_list.grid_indices(peak_list_index) grid_height = self._peak_list.grid_heights()[peak_list_index] site = self._peak_list.sites()[peak_list_index] height = self._peak_list.heights()[peak_list_index] site_symmetry = self._special_position_settings.site_symmetry(site) if ( self._general_positions_only and not site_symmetry.is_point_group_1()): continue site = site_symmetry.exact_site() equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) keep = True if (self._sites.size() > 250): import warnings warnings.warn( message="This function should not be used for" " processing a large number of peaks.", category=RuntimeWarning) for s in self._sites: dist = sgtbx.min_sym_equiv_distance_info(equiv_sites, s).dist() if (dist < self._min_cross_distance): keep = False break if (keep == True): if ( self._effective_resolution is not None and ( self._heights.size() == 0 or height < self._heights[0] * self._significant_height_fraction)): site, height = self._accumulate_significant( site, height, site_symmetry, equiv_sites) self._peak_list_indices.append(peak_list_index) self._sites.append(site) self._heights.append(height) return cluster_site_info( peak_list_index=peak_list_index, grid_index=grid_index, grid_height=grid_height, site=site, height=height)
def next_with_effective_resolution(self): while 1: peak_list_index = self._peak_list_index if (peak_list_index >= self._peak_list.size()): return None self._peak_list_index += 1 if (self._is_processed is not None): if (self._is_processed[peak_list_index]): continue self._is_processed[peak_list_index] = True grid_index = self._peak_list.grid_indices(peak_list_index) grid_height = self._peak_list.grid_heights()[peak_list_index] site = self._peak_list.sites()[peak_list_index] height = self._peak_list.heights()[peak_list_index] site_symmetry = self._special_position_settings.site_symmetry(site) if (self._general_positions_only and not site_symmetry.is_point_group_1()): continue site = site_symmetry.exact_site() equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) keep = True if (self._sites.size() > 250): import warnings warnings.warn(message="This function should not be used for" " processing a large number of peaks.", category=RuntimeWarning) for s in self._sites: dist = sgtbx.min_sym_equiv_distance_info(equiv_sites, s).dist() if (dist < self._min_cross_distance): keep = False break if (keep == True): if (self._effective_resolution is not None and (self._heights.size() == 0 or height < self._heights[0] * self._significant_height_fraction)): site, height = self._accumulate_significant( site, height, site_symmetry, equiv_sites) self._peak_list_indices.append(peak_list_index) self._sites.append(site) self._heights.append(height) return cluster_site_info(peak_list_index=peak_list_index, grid_index=grid_index, grid_height=grid_height, site=site, height=height)
def loop(self): for i_position in xrange(self.wyckoff_table.size()): site_symmetry_i = self.wyckoff_table.random_site_symmetry( special_position_settings=self.special_position_settings, i_position=i_position) equiv_sites_i = sgtbx.sym_equiv_sites(site_symmetry_i) for j_position in xrange(self.wyckoff_table.size()): for n_trial in xrange(self.max_trials_per_position): site_j = self.wyckoff_table.random_site_symmetry( special_position_settings=self.special_position_settings, i_position=j_position).exact_site() dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites_i, site_j) if (dist_info.dist() > self.min_cross_distance): structure = xray.structure( special_position_settings=self.special_position_settings, scatterers=flex.xray_scatterer( [xray.scatterer(scattering_type=self.scattering_type, site=site) for site in [site_symmetry_i.exact_site(), site_j]])) yield structure, dist_info.dist() break
def match_sites_by_symmetry(ref_sites, query_sites, unit_cell, space_group, cutoff=5): """Pair sites in query_sites to sites in ref_sites, allowing for symmetry""" pairings = numpy.zeros((len(ref_sites), len(query_sites)), dtype=numpy.int) for i_ref, ref in enumerate(ref_sites): ref_frac = unit_cell.fractionalize(ref) sym_sites_ref = sgtbx.sym_equiv_sites(space_group=space_group, unit_cell=unit_cell, original_site=ref_frac) for i_query, query in enumerate(query_sites): query_frac = unit_cell.fractionalize(query) min_dist = sgtbx.min_sym_equiv_distance_info( sym_sites_ref, query_frac).dist() if min_dist < cutoff: pairings[i_ref, i_query] = 1 return pairings
def structure_factors(self, d_min): print "WARNING: RESULTS NOT VERIFIED" # XXX miller_set = miller.build_set( crystal_symmetry=self, anomalous_flag=True, # XXX always True? d_min=d_min) f_calc = flex.complex_double() for h in miller_set.indices(): fc = 0j for scatterer in self.scatterers(): site_symmetry = self.site_symmetry(scatterer.site) equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) sum_exp_j_two_pi_hx = 0j for i_symop,x in enumerate(equiv_sites.coordinates()): sum_hx = 0 for i in xrange(3): sum_hx += h[i] * x[i] phase = 2 * math.pi * sum_hx exp_j_two_pi_hx = complex(math.cos(phase), math.sin(phase)) if (scatterer.anisotropic_flag): r = self.space_group()(i_symop).r() hr = h dw = adptbx.debye_waller_factor_u_star(hr, scatterer.u_star) exp_j_two_pi_hx *= dw sum_exp_j_two_pi_hx += exp_j_two_pi_hx b_j = scatterer.scattering_info.bound_coh_scatt_length() fc_site = scatterer.weight() * b_j * sum_exp_j_two_pi_hx if (not scatterer.anisotropic_flag): d_star_sq = self.unit_cell().d_star_sq(h) dw = adptbx.debye_waller_factor_u_iso(d_star_sq/4, scatterer.u_iso) fc_site *= dw fc += fc_site f_calc.append(fc) return miller.array( miller_set=miller_set, data=f_calc)
def show_patterson_peaks(self, min_relative_peak_height=0.1, show_at_least=3): print "Patterson peaks for %s:" % str(self.input.info()) reciprocal_map = self.input if reciprocal_map.anomalous_flag(): reciprocal_map = reciprocal_map.average_bijvoet_mates() patterson_map = reciprocal_map.patterson_map(symmetry_flags=maptbx.use_space_group_symmetry) patterson_map.apply_sigma_scaling() peak_list = patterson_map.tags().peak_search( map=patterson_map.real_map(), parameters=maptbx.peak_search_parameters() ) max_height = peak_list.heights()[0] sym_equiv_origin = sgtbx.sym_equiv_sites( unit_cell=patterson_map.unit_cell(), space_group=patterson_map.space_group(), original_site=(0, 0, 0) ) print " Fractional coordinates Height Distance from origin" for i_peak in xrange(peak_list.size()): height = peak_list.heights()[i_peak] if height < max_height * min_relative_peak_height and i_peak > show_at_least: break site = peak_list.sites()[i_peak] dist_info = sgtbx.min_sym_equiv_distance_info(sym_equiv_origin, site) print " %8.4f %8.4f %8.4f" % (dist_info.sym_op() * site), print " %8.3f %8.3f" % (height, dist_info.dist()) print
def structure_factors(self, d_min): print "WARNING: RESULTS NOT VERIFIED" # XXX miller_set = miller.build_set( crystal_symmetry=self, anomalous_flag=True, # XXX always True? d_min=d_min) f_calc = flex.complex_double() for h in miller_set.indices(): fc = 0j for scatterer in self.scatterers(): site_symmetry = self.site_symmetry(scatterer.site) equiv_sites = sgtbx.sym_equiv_sites(site_symmetry) sum_exp_j_two_pi_hx = 0j for i_symop, x in enumerate(equiv_sites.coordinates()): sum_hx = 0 for i in xrange(3): sum_hx += h[i] * x[i] phase = 2 * math.pi * sum_hx exp_j_two_pi_hx = complex(math.cos(phase), math.sin(phase)) if (scatterer.anisotropic_flag): r = self.space_group()(i_symop).r() hr = h dw = adptbx.debye_waller_factor_u_star( hr, scatterer.u_star) exp_j_two_pi_hx *= dw sum_exp_j_two_pi_hx += exp_j_two_pi_hx b_j = scatterer.scattering_info.bound_coh_scatt_length() fc_site = scatterer.weight() * b_j * sum_exp_j_two_pi_hx if (not scatterer.anisotropic_flag): d_star_sq = self.unit_cell().d_star_sq(h) dw = adptbx.debye_waller_factor_u_iso( d_star_sq / 4, scatterer.u_iso) fc_site *= dw fc += fc_site f_calc.append(fc) return miller.array(miller_set=miller_set, data=f_calc)
def run_call_back(flags, space_group_info): verbose = flags.Verbose if (flags.StaticModels): model1 = (test_model() .add_random_positions(2, "A") .shuffle_positions() .random_symmetry_mates() .apply_random_eucl_op() ) model2 = (test_model() .add_random_positions(3, "B") .shuffle_positions() .random_symmetry_mates() .apply_random_eucl_op() .shake_positions() .random_hand() ) for i in (0,1): m1 = model1 if (i): m1 = model1.transform_to_reference_setting().reset_cb_op() for j in (0,1): m2 = model2 if (j): m2 = model2.transform_to_reference_setting().reset_cb_op() if (0 or verbose): m1.show("Model1(%d)" % (i,)) m2.show("Model2(%d)" % (j,)) model_matches = emma.model_matches(m1, m2, rms_penalty_per_site=0) analyze_refined_matches(m1, m2, model_matches.refined_matches, verbose) return False model_core = test_model(space_group_info) model1 = (model_core .add_random_positions(2, "A") ) model2 = (model_core .add_random_positions(3, "B") .shuffle_positions() .random_symmetry_mates() .apply_random_eucl_op() .shake_positions() .random_hand() ) if (0 or verbose): model_core.show("Core") model1.show("Model1") model2.show("Model2") model_matches = emma.model_matches(model1, model2, rms_penalty_per_site=0) analyze_refined_matches( model1, model2, model_matches.refined_matches, verbose) assert model_matches.consensus_model().size() >= model1.size()-2 assert model_matches.consensus_model(i_model=2).size() >= model2.size()-3 model1.expand_to_p1() model2.as_xray_structure() for i1,i2,m1,m2 in [(1,2,model1,model2),(2,1,model2,model1)]: m2_t = model_matches.transform_model(i_model=i2) assert m1.unit_cell().is_similar_to(m2_t.unit_cell()) assert m1.space_group() == m2_t.space_group() for pair in model_matches.refined_matches[0].pairs: site1 = m1.positions()[pair[i1-1]].site site2 = m2_t.positions()[pair[i2-1]].site equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1)) dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites1, site2) assert dist_info.dist() < model_matches.tolerance + 1.e-6 site2_closest = dist_info.sym_op() * site2 assert approx_equal( m1.unit_cell().distance(site1, site2_closest), dist_info.dist()) if (i1 == 1): singles = model_matches.refined_matches[0].singles2 else: singles = model_matches.refined_matches[0].singles1 for i_site2 in singles: site2 = m2_t.positions()[i_site2].site for i_site1 in xrange(len(model1.positions())): site1 = m1.positions()[i_site1].site equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1)) dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites1, site2) if (dist_info.dist() < model_matches.tolerance - 1.e-6): ok = False for pair in model_matches.refined_matches[0].pairs: if (pair[i1-1] == i_site1): ok = True assert ok
def run_call_back(flags, space_group_info): verbose = flags.Verbose if (flags.StaticModels): model1 = (test_model().add_random_positions(2, "A").shuffle_positions( ).random_symmetry_mates().apply_random_eucl_op()) model2 = (test_model().add_random_positions( 3, "B").shuffle_positions().random_symmetry_mates(). apply_random_eucl_op().shake_positions().random_hand()) for i in (0, 1): m1 = model1 if (i): m1 = model1.transform_to_reference_setting().reset_cb_op() for j in (0, 1): m2 = model2 if (j): m2 = model2.transform_to_reference_setting().reset_cb_op() if (0 or verbose): m1.show("Model1(%d)" % (i, )) m2.show("Model2(%d)" % (j, )) model_matches = emma.model_matches(m1, m2, rms_penalty_per_site=0) analyze_refined_matches(m1, m2, model_matches.refined_matches, verbose) return False model_core = test_model(space_group_info) model1 = (model_core.add_random_positions(2, "A")) model2 = (model_core.add_random_positions( 3, "B").shuffle_positions().random_symmetry_mates(). apply_random_eucl_op().shake_positions().random_hand()) if (0 or verbose): model_core.show("Core") model1.show("Model1") model2.show("Model2") model_matches = emma.model_matches(model1, model2, rms_penalty_per_site=0) analyze_refined_matches(model1, model2, model_matches.refined_matches, verbose) assert model_matches.consensus_model().size() >= model1.size() - 2 assert model_matches.consensus_model(i_model=2).size() >= model2.size() - 3 model1.expand_to_p1() model2.as_xray_structure() for i1, i2, m1, m2 in [(1, 2, model1, model2), (2, 1, model2, model1)]: m2_t = model_matches.transform_model(i_model=i2) assert m1.unit_cell().is_similar_to(m2_t.unit_cell()) assert m1.space_group() == m2_t.space_group() for pair in model_matches.refined_matches[0].pairs: site1 = m1.positions()[pair[i1 - 1]].site site2 = m2_t.positions()[pair[i2 - 1]].site equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1)) dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites1, site2) assert dist_info.dist() < model_matches.tolerance + 1.e-6 site2_closest = dist_info.sym_op() * site2 assert approx_equal(m1.unit_cell().distance(site1, site2_closest), dist_info.dist()) if (i1 == 1): singles = model_matches.refined_matches[0].singles2 else: singles = model_matches.refined_matches[0].singles1 for i_site2 in singles: site2 = m2_t.positions()[i_site2].site for i_site1 in range(len(model1.positions())): site1 = m1.positions()[i_site1].site equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1)) dist_info = sgtbx.min_sym_equiv_distance_info( equiv_sites1, site2) if (dist_info.dist() < model_matches.tolerance - 1.e-6): ok = False for pair in model_matches.refined_matches[0].pairs: if (pair[i1 - 1] == i_site1): ok = True assert ok
def check_with_grid_tags(inp_symmetry, symmetry_flags, sites_cart, point_distance, strictly_inside, flag_write_pdb, verbose): cb_op_inp_ref = inp_symmetry.change_of_basis_op_to_reference_setting() if (verbose): print "cb_op_inp_ref.c():", cb_op_inp_ref.c() ref_symmetry = inp_symmetry.change_basis(cb_op_inp_ref) search_symmetry = sgtbx.search_symmetry( flags=symmetry_flags, space_group_type=ref_symmetry.space_group_info().type(), seminvariant=ref_symmetry.space_group_info().structure_seminvariants()) assert search_symmetry.continuous_shifts_are_principal() continuous_shift_flags = search_symmetry.continuous_shift_flags() if (flag_write_pdb): tag_sites_frac = flex.vec3_double() else: tag_sites_frac = None if (strictly_inside): inp_tags = inp_symmetry.gridding( step=point_distance*.7, symmetry_flags=symmetry_flags).tags() if (tag_sites_frac is not None): for point in flex.nested_loop(inp_tags.n_real()): if (inp_tags.tags().tag_array()[point] < 0): point_frac_inp=[float(n)/d for n,d in zip(point, inp_tags.n_real())] tag_sites_frac.append(point_frac_inp) if (inp_tags.tags().n_independent() < sites_cart.size()): print "FAIL:", inp_symmetry.space_group_info(), \ inp_tags.tags().n_independent(), sites_cart.size() raise AssertionError else: inp_tags = inp_symmetry.gridding( step=point_distance/2., symmetry_flags=symmetry_flags).tags() sites_frac_inp = inp_symmetry.unit_cell().fractionalize( sites_cart=sites_cart) rt = cb_op_inp_ref.c().as_double_array() sites_frac_ref = rt[:9] * sites_frac_inp sites_frac_ref += rt[9:] max_distance = 2 * ((.5 * math.sqrt(3) * point_distance) * 2/3.) if (verbose): print "max_distance:", max_distance for point in flex.nested_loop(inp_tags.n_real()): if (inp_tags.tags().tag_array()[point] < 0): point_frac_inp = [float(n)/d for n,d in zip(point, inp_tags.n_real())] if (tag_sites_frac is not None): tag_sites_frac.append(point_frac_inp) point_frac_ref = cb_op_inp_ref.c() * point_frac_inp equiv_points = sgtbx.sym_equiv_sites( unit_cell=ref_symmetry.unit_cell(), space_group=search_symmetry.subgroup(), original_site=point_frac_ref, minimum_distance=2.e-6, tolerance=1.e-6) min_dist = sgtbx.min_sym_equiv_distance_info( reference_sites=equiv_points, others=sites_frac_ref, principal_continuous_allowed_origin_shift_flags =continuous_shift_flags).dist() if (min_dist > max_distance): print "FAIL:", inp_symmetry.space_group_info(), \ point_frac_ref, min_dist raise AssertionError if (inp_tags.tags().n_independent()+10 < sites_cart.size()): print "FAIL:", inp_symmetry.space_group_info(), \ inp_tags.tags().n_independent(), sites_cart.size() raise AssertionError if (tag_sites_frac is not None): dump_pdb( file_name="tag_sites.pdb", crystal_symmetry=inp_symmetry, sites_cart=inp_symmetry.unit_cell().orthogonalize( sites_frac=tag_sites_frac))
def check_with_grid_tags(inp_symmetry, symmetry_flags, sites_cart, point_distance, strictly_inside, flag_write_pdb, verbose): cb_op_inp_ref = inp_symmetry.change_of_basis_op_to_reference_setting() if (verbose): print("cb_op_inp_ref.c():", cb_op_inp_ref.c()) ref_symmetry = inp_symmetry.change_basis(cb_op_inp_ref) search_symmetry = sgtbx.search_symmetry( flags=symmetry_flags, space_group_type=ref_symmetry.space_group_info().type(), seminvariant=ref_symmetry.space_group_info().structure_seminvariants()) assert search_symmetry.continuous_shifts_are_principal() continuous_shift_flags = search_symmetry.continuous_shift_flags() if (flag_write_pdb): tag_sites_frac = flex.vec3_double() else: tag_sites_frac = None if (strictly_inside): inp_tags = inp_symmetry.gridding(step=point_distance * .7, symmetry_flags=symmetry_flags).tags() if (tag_sites_frac is not None): for point in flex.nested_loop(inp_tags.n_real()): if (inp_tags.tags().tag_array()[point] < 0): point_frac_inp = [ float(n) / d for n, d in zip(point, inp_tags.n_real()) ] tag_sites_frac.append(point_frac_inp) if (inp_tags.tags().n_independent() < sites_cart.size()): print("FAIL:", inp_symmetry.space_group_info(), \ inp_tags.tags().n_independent(), sites_cart.size()) raise AssertionError else: inp_tags = inp_symmetry.gridding(step=point_distance / 2., symmetry_flags=symmetry_flags).tags() sites_frac_inp = inp_symmetry.unit_cell().fractionalize( sites_cart=sites_cart) rt = cb_op_inp_ref.c().as_double_array() sites_frac_ref = rt[:9] * sites_frac_inp sites_frac_ref += rt[9:] max_distance = 2 * ((.5 * math.sqrt(3) * point_distance) * 2 / 3.) if (verbose): print("max_distance:", max_distance) for point in flex.nested_loop(inp_tags.n_real()): if (inp_tags.tags().tag_array()[point] < 0): point_frac_inp = [ float(n) / d for n, d in zip(point, inp_tags.n_real()) ] if (tag_sites_frac is not None): tag_sites_frac.append(point_frac_inp) point_frac_ref = cb_op_inp_ref.c() * point_frac_inp equiv_points = sgtbx.sym_equiv_sites( unit_cell=ref_symmetry.unit_cell(), space_group=search_symmetry.subgroup(), original_site=point_frac_ref, minimum_distance=2.e-6, tolerance=1.e-6) min_dist = sgtbx.min_sym_equiv_distance_info( reference_sites=equiv_points, others=sites_frac_ref, principal_continuous_allowed_origin_shift_flags= continuous_shift_flags).dist() if (min_dist > max_distance): print("FAIL:", inp_symmetry.space_group_info(), \ point_frac_ref, min_dist) raise AssertionError if (inp_tags.tags().n_independent() + 10 < sites_cart.size()): print("FAIL:", inp_symmetry.space_group_info(), \ inp_tags.tags().n_independent(), sites_cart.size()) raise AssertionError if (tag_sites_frac is not None): dump_pdb(file_name="tag_sites.pdb", crystal_symmetry=inp_symmetry, sites_cart=inp_symmetry.unit_cell().orthogonalize( sites_frac=tag_sites_frac))