def exercise_groel_sampling(verbose): crystal_symmetry = crystal.symmetry( unit_cell="255.260 265.250 184.400 90.00 90.00", space_group_symbol="P 21 21 2") t00 = time.time() n_sites = [] for use_space_group_symmetry in [True,False]: for use_seminvariants in [True,False]: for all_twelve_neighbors in [False,True]: sampling_generator = close_packing.hexagonal_sampling( crystal_symmetry=crystal_symmetry, symmetry_flags=sgtbx.search_symmetry_flags( use_space_group_symmetry=use_space_group_symmetry, use_space_group_ltr=0, use_seminvariants=use_seminvariants, use_normalizer_k2l=False, use_normalizer_l2n=False), point_distance=2, buffer_thickness=-1, all_twelve_neighbors=all_twelve_neighbors) t0 = time.time() n_sites.append(sampling_generator.count_sites()) if (verbose): print n_sites[-1], "%.2f" % (time.time() - t0) assert n_sites == [41712, 45319, 304200, 315809, # depends an float_asu, ... 162240, 170797, 1195830, 1232774] print "time groel_sampling: %.2f seconds" % (time.time() - t00)
def exercise_groel_sampling(verbose): crystal_symmetry = crystal.symmetry( unit_cell="255.260 265.250 184.400 90.00 90.00", space_group_symbol="P 21 21 2") t00 = time.time() n_sites = [] for use_space_group_symmetry in [True, False]: for use_seminvariants in [True, False]: for all_twelve_neighbors in [False, True]: sampling_generator = close_packing.hexagonal_sampling( crystal_symmetry=crystal_symmetry, symmetry_flags=sgtbx.search_symmetry_flags( use_space_group_symmetry=use_space_group_symmetry, use_space_group_ltr=0, use_seminvariants=use_seminvariants, use_normalizer_k2l=False, use_normalizer_l2n=False), point_distance=2, buffer_thickness=-1, all_twelve_neighbors=all_twelve_neighbors) t0 = time.time() n_sites.append(sampling_generator.count_sites()) if (verbose): print(n_sites[-1], "%.2f" % (time.time() - t0)) assert n_sites == [ 41712, 45319, 304200, 315809, # depends an float_asu, ... 162240, 170797, 1195830, 1232774 ] print("time groel_sampling: %.2f seconds" % (time.time() - t00))
def __init__(self, xray_structure, solvent_radius, shrink_truncation_radius, ignore_hydrogen_atoms=False, crystal_gridding=None, grid_step=None, d_min=None, resolution_factor=1 / 4, atom_radii_table=None, use_space_group_symmetry=False): self.xray_structure = xray_structure if crystal_gridding is None: self.crystal_gridding = maptbx.crystal_gridding( unit_cell=xray_structure.unit_cell(), space_group_info=xray_structure.space_group_info(), step=grid_step, d_min=d_min, resolution_factor=resolution_factor, symmetry_flags=sgtbx.search_symmetry_flags( use_space_group_symmetry=use_space_group_symmetry)) else: self.crystal_gridding = crystal_gridding if use_space_group_symmetry: atom_radii = cctbx.masks.vdw_radii( xray_structure, table=atom_radii_table).atom_radii asu_mappings = xray_structure.asu_mappings( buffer_thickness=flex.max(atom_radii) + solvent_radius) scatterers_asu_plus_buffer = flex.xray_scatterer() frac = xray_structure.unit_cell().fractionalize for sc, mappings in zip(xray_structure.scatterers(), asu_mappings.mappings()): for mapping in mappings: scatterers_asu_plus_buffer.append( sc.customized_copy(site=frac(mapping.mapped_site()))) xs = xray.structure(crystal_symmetry=xray_structure, scatterers=scatterers_asu_plus_buffer) else: xs = xray_structure.expand_to_p1() self.vdw_radii = cctbx.masks.vdw_radii(xs, table=atom_radii_table) self.mask = cctbx.masks.around_atoms( unit_cell=xs.unit_cell(), space_group_order_z=xs.space_group().order_z(), sites_frac=xs.sites_frac(), atom_radii=self.vdw_radii.atom_radii, gridding_n_real=self.crystal_gridding.n_real(), solvent_radius=solvent_radius, shrink_truncation_radius=shrink_truncation_radius) if use_space_group_symmetry: tags = self.crystal_gridding.tags() tags.tags().apply_symmetry_to_mask(self.mask.data) self.flood_fill = cctbx.masks.flood_fill(self.mask.data, xray_structure.unit_cell()) self.exclude_void_flags = [False] * self.flood_fill.n_voids() self.solvent_accessible_volume = self.n_solvent_grid_points() \ / self.mask.data.size() * xray_structure.unit_cell().volume()
def __init__( self, xray_structure, solvent_radius, shrink_truncation_radius, ignore_hydrogen_atoms=False, crystal_gridding=None, grid_step=None, d_min=None, resolution_factor=1 / 4, atom_radii_table=None, use_space_group_symmetry=False, ): self.xray_structure = xray_structure if crystal_gridding is None: self.crystal_gridding = maptbx.crystal_gridding( unit_cell=xray_structure.unit_cell(), space_group_info=xray_structure.space_group_info(), step=grid_step, d_min=d_min, resolution_factor=resolution_factor, symmetry_flags=sgtbx.search_symmetry_flags(use_space_group_symmetry=use_space_group_symmetry), ) else: self.crystal_gridding = crystal_gridding if use_space_group_symmetry: atom_radii = cctbx.masks.vdw_radii(xray_structure, table=atom_radii_table).atom_radii asu_mappings = xray_structure.asu_mappings(buffer_thickness=flex.max(atom_radii) + solvent_radius) scatterers_asu_plus_buffer = flex.xray_scatterer() frac = xray_structure.unit_cell().fractionalize for sc, mappings in zip(xray_structure.scatterers(), asu_mappings.mappings()): for mapping in mappings: scatterers_asu_plus_buffer.append(sc.customized_copy(site=frac(mapping.mapped_site()))) xs = xray.structure(crystal_symmetry=xray_structure, scatterers=scatterers_asu_plus_buffer) else: xs = xray_structure.expand_to_p1() self.vdw_radii = cctbx.masks.vdw_radii(xs, table=atom_radii_table) self.mask = cctbx.masks.around_atoms( unit_cell=xs.unit_cell(), space_group_order_z=xs.space_group().order_z(), sites_frac=xs.sites_frac(), atom_radii=self.vdw_radii.atom_radii, gridding_n_real=self.crystal_gridding.n_real(), solvent_radius=solvent_radius, shrink_truncation_radius=shrink_truncation_radius, ) if use_space_group_symmetry: tags = self.crystal_gridding.tags() tags.tags().apply_symmetry_to_mask(self.mask.data) self.flood_fill = cctbx.masks.flood_fill(self.mask.data, xray_structure.unit_cell()) self.exclude_void_flags = [False] * self.flood_fill.n_voids() self.solvent_accessible_volume = ( self.n_solvent_grid_points() / self.mask.data.size() * xray_structure.unit_cell().volume() )
def exercise_gridding(): u = uctbx.unit_cell((4,6,7)) assert maptbx.ext.determine_gridding(u, 2, 1/3., (1,1,1), 5, True) \ == (8,9,12) f = sgtbx.search_symmetry_flags( use_space_group_symmetry=True, use_space_group_ltr=0, use_seminvariants=False, use_normalizer_k2l=True, use_normalizer_l2n=False) t = sgtbx.space_group_info("F 2 2 2").primitive_setting().type() assert maptbx.ext.determine_gridding(u, 2, 1/3., f, t, (1,1,1), 5, True) \ == (12, 12, 12)
def __init__(self, space_group_info, use_k2l, use_l2n): adopt_init_args(self, locals()) search_symmetry = sgtbx.search_symmetry( flags=sgtbx.search_symmetry_flags(use_space_group_symmetry=False, use_space_group_ltr=-1, use_seminvariants=True, use_normalizer_k2l=use_k2l, use_normalizer_l2n=use_l2n), space_group_type=space_group_info.type(), seminvariant=space_group_info.structure_seminvariants()) self.rt_mx = search_symmetry.subgroup() self.continuous_shifts = search_symmetry.continuous_shifts() assert search_symmetry.continuous_shifts_are_principal() self.continuous_shift_flags = search_symmetry.continuous_shift_flags()
def exercise_all_twelve_neighbors(): sites_cart = hexagonal_close_packing_sampling( crystal_symmetry=crystal.symmetry( unit_cell=(14.4225, 14.4225, 14.4225, 90, 90, 90), space_group_symbol="F m -3 m"), symmetry_flags=sgtbx.search_symmetry_flags( use_space_group_symmetry=True, use_space_group_ltr=0, use_seminvariants=True, use_normalizer_k2l=False, use_normalizer_l2n=False), point_distance=2, buffer_thickness=-1, all_twelve_neighbors=True) assert len(sites_cart) == 36 # depends an float_asu, which depends on cb_op,
def __init__(self, space_group_info, use_k2l, use_l2n): adopt_init_args(self, locals()) search_symmetry = sgtbx.search_symmetry( flags=sgtbx.search_symmetry_flags( use_space_group_symmetry=False, use_space_group_ltr=-1, use_seminvariants=True, use_normalizer_k2l=use_k2l, use_normalizer_l2n=use_l2n), space_group_type=space_group_info.type(), seminvariant=space_group_info.structure_seminvariants()) self.rt_mx = search_symmetry.subgroup() self.continuous_shifts = search_symmetry.continuous_shifts() assert search_symmetry.continuous_shifts_are_principal() self.continuous_shift_flags = search_symmetry.continuous_shift_flags()
def exercise_all_twelve_neighbors(): sites_cart = hexagonal_close_packing_sampling( crystal_symmetry=crystal.symmetry(unit_cell=(14.4225, 14.4225, 14.4225, 90, 90, 90), space_group_symbol="F m -3 m"), symmetry_flags=sgtbx.search_symmetry_flags( use_space_group_symmetry=True, use_space_group_ltr=0, use_seminvariants=True, use_normalizer_k2l=False, use_normalizer_l2n=False), point_distance=2, buffer_thickness=-1, all_twelve_neighbors=True) assert len( sites_cart) == 36 # depends an float_asu, which depends on cb_op,
def run_call_back(flags, space_group_info): crystal_symmetry = crystal.symmetry( unit_cell=space_group_info.any_compatible_unit_cell(volume=1000), space_group_info=space_group_info) if (flags.Verbose): print crystal_symmetry.unit_cell() symmetry_flags=sgtbx.search_symmetry_flags( use_space_group_symmetry=True, use_space_group_ltr=0, use_seminvariants=True, use_normalizer_k2l=False, use_normalizer_l2n=False) point_distance = 2 buffer_thickness = -1 all_twelve_neighbors = False if (flags.strictly_inside): buffer_thickness = 0 if (flags.all_twelve_neighbors): all_twelve_neighbors = True if (flags.Verbose): print "buffer_thickness:", buffer_thickness print "all_twelve_neighbors:", all_twelve_neighbors sites_cart = hexagonal_close_packing_sampling( crystal_symmetry=crystal_symmetry, symmetry_flags=symmetry_flags, point_distance=point_distance, buffer_thickness=buffer_thickness, all_twelve_neighbors=all_twelve_neighbors) if (1): check_distances( sites_cart=sites_cart, point_distance=point_distance, verbose=flags.Verbose) if (1): check_with_grid_tags( inp_symmetry=crystal_symmetry, symmetry_flags=symmetry_flags, sites_cart=sites_cart, point_distance=point_distance, strictly_inside=flags.strictly_inside, flag_write_pdb=flags.write_pdb, verbose=flags.Verbose) if (flags.write_pdb): dump_pdb( file_name="hex_sites.pdb", crystal_symmetry=crystal_symmetry, sites_cart=sites_cart)
def run_call_back(flags, space_group_info): crystal_symmetry = crystal.symmetry( unit_cell=space_group_info.any_compatible_unit_cell(volume=1000), space_group_info=space_group_info) if (flags.Verbose): print(crystal_symmetry.unit_cell()) symmetry_flags = sgtbx.search_symmetry_flags(use_space_group_symmetry=True, use_space_group_ltr=0, use_seminvariants=True, use_normalizer_k2l=False, use_normalizer_l2n=False) point_distance = 2 buffer_thickness = -1 all_twelve_neighbors = False if (flags.strictly_inside): buffer_thickness = 0 if (flags.all_twelve_neighbors): all_twelve_neighbors = True if (flags.Verbose): print("buffer_thickness:", buffer_thickness) print("all_twelve_neighbors:", all_twelve_neighbors) sites_cart = hexagonal_close_packing_sampling( crystal_symmetry=crystal_symmetry, symmetry_flags=symmetry_flags, point_distance=point_distance, buffer_thickness=buffer_thickness, all_twelve_neighbors=all_twelve_neighbors) if (1): check_distances(sites_cart=sites_cart, point_distance=point_distance, verbose=flags.Verbose) if (1): check_with_grid_tags(inp_symmetry=crystal_symmetry, symmetry_flags=symmetry_flags, sites_cart=sites_cart, point_distance=point_distance, strictly_inside=flags.strictly_inside, flag_write_pdb=flags.write_pdb, verbose=flags.Verbose) if (flags.write_pdb): dump_pdb(file_name="hex_sites.pdb", crystal_symmetry=crystal_symmetry, sites_cart=sites_cart)
def exercise_grid_tags(): t = maptbx.grid_tags((8,10,12)) assert not t.is_valid() assert t.tag_array().all() == (8,10,12) s = sgtbx.space_group_info("P 21") for i_flags in xrange(8): f = sgtbx.search_symmetry_flags( use_space_group_symmetry=i_flags % 2 != 0, use_space_group_ltr=0, use_seminvariants=(i_flags//4) % 2 != 0, use_normalizer_k2l=(i_flags//2) % 2 != 0, use_normalizer_l2n=False) t.build(s.type(), f) assert t.is_valid() assert t.space_group_type().group() == s.group() assert t.symmetry_flags() == f if (f.use_seminvariants()): assert [(vm.v, vm.m) for vm in t.grid_ss_continuous()] \ == [((0, 1, 0), 10)] assert t.n_grid_misses() == 0 assert t.n_independent() == (960, 480, 484, 242, 24, 14, 14, 14)[i_flags] assert t.n_independent() + t.n_dependent() == t.tag_array().size() for flex_type in flex_types(): d = flex_type(t.tag_array().accessor()) assert t.n_dependent() == 0 \ or approx_equal(t.dependent_correlation(d, 1.e-10).coefficient(),0) assert t.verify(d, 0) t.sum_sym_equiv_points(d) if (i_flags == 0): assert t.n_independent() == t.tag_array().size() else: assert t.n_independent() < t.tag_array().size() for flex_type in flex_types(): d = flex_type([random.random() for x in xrange(t.tag_array().size())]) d.resize(t.tag_array().accessor()) assert not t.verify(d) t.sum_sym_equiv_points(d) assert t.verify(d)
def exercise(space_group_info, redundancy_counter=0): n_real = (12,12,12) miller_max = (2,2,2) gt = maptbx.grid_tags(n_real) uc = space_group_info.any_compatible_unit_cell(volume=1000) fl = sgtbx.search_symmetry_flags(use_space_group_symmetry=True) gt.build(space_group_info.type(), fl) fft = fftpack.real_to_complex_3d(n_real) map0 = flex.double(flex.grid(fft.m_real()).set_focus(fft.n_real()), 0) weight_map = map0.deep_copy() map = map0.deep_copy() ta = gt.tag_array() order_z = space_group_info.group().order_z() problems_expected = (redundancy_counter != 0) for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): xyz = [i/n for i,n in zip(ijk, n_real)] ss = sgtbx.site_symmetry( unit_cell=uc, space_group=space_group_info.group(), original_site=xyz, min_distance_sym_equiv=1e-5) m = space_group_info.group().multiplicity( site=boost.rational.vector(ijk, n_real)) assert m == ss.multiplicity() w = m / order_z weight_map[ijk] = w map[ijk] = w elif (redundancy_counter != 0): redundancy_counter -= 1 ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t map[ijk] = map[ijk_asu] sf_map = fft.forward(map) del map mi = miller.index_generator( space_group_info.type(), False, miller_max).to_array() assert mi.size() != 0 from_map = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map, conjugate_flag=True) sf = [iround(abs(f)) for f in from_map.data()] if (sf != [0]*len(sf)): assert problems_expected return else: not problems_expected # map_p1 = map0.deep_copy() map_sw = map0.deep_copy() for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): v = random.random()*2-1 map_p1[ijk] = v map_sw[ijk] = v * weight_map[ijk] else: ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t assert map_p1[ijk_asu] != 0 map_p1[ijk] = map_p1[ijk_asu] # # fft followed by symmetry summation in reciprocal space sf_map_sw = fft.forward(map_sw) del map_sw sf_sw = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_sw, conjugate_flag=True).data() del sf_map_sw # # symmetry expansion in real space (done above already) followed fft sf_map_p1 = fft.forward(map_p1) del map_p1 sf_p1 = maptbx.structure_factors.from_map( space_group=sgtbx.space_group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_p1, conjugate_flag=True).data() del sf_map_p1 # corr = flex.linear_correlation(x=flex.abs(sf_sw), y=flex.abs(sf_p1)) assert corr.is_well_defined assert approx_equal(corr.coefficient(), 1)
class statistics(ext.statistics): def __init__(self, map): ext.statistics.__init__(self, map) class _(boost.python.injector, ext.statistics): def show_summary(self, f=None, prefix=""): if (f is None): f = sys.stdout print >> f, prefix + "max %.6g" % (self.max()) print >> f, prefix + "min %.6g" % (self.min()) print >> f, prefix + "mean %.6g" % (self.mean()) print >> f, prefix + "sigma %.6g" % (self.sigma()) use_space_group_symmetry = sgtbx.search_symmetry_flags( use_space_group_symmetry=True) class _(boost.python.injector, ext.histogram): """ Injector for extending cctbx.maptbx.histogram """ # XXX make a method of scitbx def get_percentile_cutoffs(self, map, vol_cutoff_plus_percent, vol_cutoff_minus_percent): """ For the double-step filtration in cctbx.miller (used as part of the procedure for replacing missing F-obs in maps), we need to calculate upper and lower cutoffs for the data based on percentile values. This can be done in just a few lines of code by using flex.sort_permutation over the
def exercise(space_group_info, redundancy_counter=0): n_real = (12, 12, 12) miller_max = (2, 2, 2) gt = maptbx.grid_tags(n_real) uc = space_group_info.any_compatible_unit_cell(volume=1000) fl = sgtbx.search_symmetry_flags(use_space_group_symmetry=True) gt.build(space_group_info.type(), fl) fft = fftpack.real_to_complex_3d(n_real) map0 = flex.double(flex.grid(fft.m_real()).set_focus(fft.n_real()), 0) weight_map = map0.deep_copy() map = map0.deep_copy() ta = gt.tag_array() order_z = space_group_info.group().order_z() problems_expected = (redundancy_counter != 0) for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): xyz = [i / n for i, n in zip(ijk, n_real)] ss = sgtbx.site_symmetry(unit_cell=uc, space_group=space_group_info.group(), original_site=xyz, min_distance_sym_equiv=1e-5) m = space_group_info.group().multiplicity( site=boost.rational.vector(ijk, n_real)) assert m == ss.multiplicity() w = m / order_z weight_map[ijk] = w map[ijk] = w elif (redundancy_counter != 0): redundancy_counter -= 1 ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t map[ijk] = map[ijk_asu] sf_map = fft.forward(map) del map mi = miller.index_generator(space_group_info.type(), False, miller_max).to_array() assert mi.size() != 0 from_map = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map, conjugate_flag=True) sf = [iround(abs(f)) for f in from_map.data()] if (sf != [0] * len(sf)): assert problems_expected return else: not problems_expected # map_p1 = map0.deep_copy() map_sw = map0.deep_copy() for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): v = random.random() * 2 - 1 map_p1[ijk] = v map_sw[ijk] = v * weight_map[ijk] else: ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t assert map_p1[ijk_asu] != 0 map_p1[ijk] = map_p1[ijk_asu] # # fft followed by symmetry summation in reciprocal space sf_map_sw = fft.forward(map_sw) del map_sw sf_sw = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_sw, conjugate_flag=True).data() del sf_map_sw # # symmetry expansion in real space (done above already) followed fft sf_map_p1 = fft.forward(map_p1) del map_p1 sf_p1 = maptbx.structure_factors.from_map(space_group=sgtbx.space_group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_p1, conjugate_flag=True).data() del sf_map_p1 # corr = flex.linear_correlation(x=flex.abs(sf_sw), y=flex.abs(sf_p1)) assert corr.is_well_defined assert approx_equal(corr.coefficient(), 1)
class statistics(ext.statistics): def __init__(self, map): ext.statistics.__init__(self, map) class _(boost.python.injector, ext.statistics): def show_summary(self, f=None, prefix=""): if (f is None): f = sys.stdout print >> f, prefix + "max %.6g" % (self.max()) print >> f, prefix + "min %.6g" % (self.min()) print >> f, prefix + "mean %.6g" % (self.mean()) print >> f, prefix + "sigma %.6g" % (self.sigma()) use_space_group_symmetry = sgtbx.search_symmetry_flags( use_space_group_symmetry=True) class _(boost.python.injector, ext.histogram) : """ Injector for extending cctbx.maptbx.histogram """ # XXX make a method of scitbx def get_percentile_cutoffs (self, map, vol_cutoff_plus_percent, vol_cutoff_minus_percent) : """ For the double-step filtration in cctbx.miller (used as part of the procedure for replacing missing F-obs in maps), we need to calculate upper and lower cutoffs for the data based on percentile values. This can be done in just a few lines of code by using flex.sort_permutation over the entire map, but this has a huge memory overhead (and possibly computational overhead as well). Since we are only interested in subsets of values at