def exercise_is_simple_interaction(): for space_group_symbol in ["P1", "P41"]: for shifts in flex.nested_loop((-2,-2,-2),(2,2,2),False): shifts = matrix.col(shifts) structure = xray.structure( crystal_symmetry=crystal.symmetry( unit_cell=(10,10,20,90,90,90), space_group_symbol=space_group_symbol), scatterers=flex.xray_scatterer([ xray.scatterer(label="O", site=shifts+matrix.col((0,0,0))), xray.scatterer(label="N", site=shifts+matrix.col((0.5,0.5,0))), xray.scatterer(label="C", site=shifts+matrix.col((0.25,0.25,0)))])) asu_mappings = structure.asu_mappings(buffer_thickness=7) pair_generator = crystal.neighbors_simple_pair_generator( asu_mappings=asu_mappings, distance_cutoff=7) simple_interactions = {} for i_pair,pair in enumerate(pair_generator): if (asu_mappings.is_simple_interaction(pair)): assert asu_mappings_is_simple_interaction_emulation( asu_mappings, pair) key = (pair.i_seq,pair.j_seq) assert simple_interactions.get(key, None) is None simple_interactions[key] = 1 else: assert not asu_mappings_is_simple_interaction_emulation( asu_mappings, pair) assert len(simple_interactions) == 2 assert simple_interactions[(0,2)] == 1 assert simple_interactions[(1,2)] == 1
def exercise_is_simple_interaction(): for space_group_symbol in ["P1", "P41"]: for shifts in flex.nested_loop((-2, -2, -2), (2, 2, 2), False): shifts = matrix.col(shifts) structure = xray.structure( crystal_symmetry=crystal.symmetry( unit_cell=(10, 10, 20, 90, 90, 90), space_group_symbol=space_group_symbol), scatterers=flex.xray_scatterer([ xray.scatterer(label="O", site=shifts + matrix.col((0, 0, 0))), xray.scatterer(label="N", site=shifts + matrix.col((0.5, 0.5, 0))), xray.scatterer(label="C", site=shifts + matrix.col((0.25, 0.25, 0))) ])) asu_mappings = structure.asu_mappings(buffer_thickness=7) pair_generator = crystal.neighbors_simple_pair_generator( asu_mappings=asu_mappings, distance_cutoff=7) simple_interactions = {} for i_pair, pair in enumerate(pair_generator): if (asu_mappings.is_simple_interaction(pair)): assert asu_mappings_is_simple_interaction_emulation( asu_mappings, pair) key = (pair.i_seq, pair.j_seq) assert simple_interactions.get(key, None) is None simple_interactions[key] = 1 else: assert not asu_mappings_is_simple_interaction_emulation( asu_mappings, pair) assert len(simple_interactions) == 2 assert simple_interactions[(0, 2)] == 1 assert simple_interactions[(1, 2)] == 1
def run(): for elements in flex.nested_loop([-1] * 9, [1 + 1] * 9): r = sgtbx.rot_mx(elements) if (r.determinant() != 1): continue if (not r.multiply(r).is_unit_mx()): continue if (r.is_unit_mx()): continue print(elements, r.info().ev(), r.transpose().info().ev()) print("OK")
def run(): for elements in flex.nested_loop([-1]*9,[1+1]*9): r = sgtbx.rot_mx(elements) if (r.determinant() != 1): continue if (not r.multiply(r).is_unit_mx()): continue if (r.is_unit_mx()): continue print elements, r.info().ev(), r.transpose().info().ev() print "OK"
def enumerate_reduced_cell_two_folds(): result = [] for elements in flex.nested_loop([-1]*9,[1+1]*9): r = sgtbx.rot_mx(elements) if (r.determinant() != 1): continue if (r.inverse() != r): continue if (r.is_unit_mx()): continue result.append(r) return result
def enumerate_reduced_cell_two_folds(): result = [] for elements in flex.nested_loop([-1] * 9, [1 + 1] * 9): r = sgtbx.rot_mx(elements) if (r.determinant() != 1): continue if (r.inverse() != r): continue if (r.is_unit_mx()): continue result.append(r) return result
def exercise_float_asu(space_group_info, n_grid=6): unit_cell = space_group_info.any_compatible_unit_cell(volume=1000) ref_asu = reference_table.get_asu(space_group_info.type().number()) exercise_cut_planes(ref_asu.cuts) inp_asu = space_group_info.direct_space_asu() assert sgtbx.space_group(inp_asu.hall_symbol) == space_group_info.group() exercise_cut_planes(inp_asu.cuts) exercise_shape_vertices(inp_asu, unit_cell) float_asu = inp_asu.add_buffer(unit_cell=unit_cell, thickness=0.001) cb_mx_ref_inp = space_group_info.type().cb_op().c_inv().as_rational() n = n_grid for ref_n in flex.nested_loop((-n // 2, -n // 2, -n // 2), (n, n, n), False): # check correctness of space_group_info.direct_space_asu() ref_r = matrix.col([rational.int(g, n) for g in ref_n]) inp_r = cb_mx_ref_inp * ref_r assert ref_asu.is_inside(ref_r.elems) == inp_asu.is_inside(inp_r.elems) # check correctness of cut_plane.add_buffer() inp_r = inp_r.elems inp_f = [float(r) for r in inp_r] for cut in inp_asu.cuts: r_cut = cut.strip() r_inside = r_cut.is_inside(inp_r) for buffer_thickness in [0.001, 1, -1][:1]: f_cut = cut.as_float_cut_plane().add_buffer( unit_cell=unit_cell, thickness=buffer_thickness) f_inside = f_cut.is_inside(inp_f) if (buffer_thickness < 0): if (r_inside != f_inside): assert r_inside elif (buffer_thickness < 0.01): assert r_inside == f_inside elif (r_inside != f_inside): assert f_inside # check correctness of float_asu.add_buffer() assert float_asu.is_inside(inp_f) == inp_asu.shape_only().is_inside( inp_r) asu_with_metric = inp_asu.define_metric(unit_cell) assert asu_with_metric.hall_symbol is inp_asu.hall_symbol assert len(asu_with_metric.cuts) == len(inp_asu.cuts) assert asu_with_metric.unit_cell is unit_cell asu_tight = asu_with_metric.as_float_asu() asu_buffer = asu_with_metric.add_buffer(thickness=2) asu_shrunk = asu_with_metric.add_buffer(relative_thickness=-1.e-5) vertices = facet_analysis.shape_vertices(inp_asu) for vertex in vertices: assert inp_asu.shape_only().is_inside(vertex) for vertex in vertices: assert asu_tight.is_inside(matrix.col(vertex).as_float().elems) for vertex in vertices: assert asu_buffer.is_inside(matrix.col(vertex).as_float().elems) for vertex in vertices: assert not asu_shrunk.is_inside(matrix.col(vertex).as_float().elems)
def exercise_float_asu(space_group_info, n_grid=6): unit_cell = space_group_info.any_compatible_unit_cell(volume=1000) ref_asu = reference_table.get_asu(space_group_info.type().number()) exercise_cut_planes(ref_asu.cuts) inp_asu = space_group_info.direct_space_asu() assert sgtbx.space_group(inp_asu.hall_symbol) == space_group_info.group() exercise_cut_planes(inp_asu.cuts) exercise_shape_vertices(inp_asu, unit_cell) float_asu = inp_asu.add_buffer(unit_cell=unit_cell, thickness=0.001) cb_mx_ref_inp = space_group_info.type().cb_op().c_inv().as_rational() n = n_grid for ref_n in flex.nested_loop((-n//2,-n//2,-n//2),(n,n,n),False): # check correctness of space_group_info.direct_space_asu() ref_r = matrix.col([rational.int(g,n) for g in ref_n]) inp_r = cb_mx_ref_inp * ref_r assert ref_asu.is_inside(ref_r.elems) == inp_asu.is_inside(inp_r.elems) # check correctness of cut_plane.add_buffer() inp_r = inp_r.elems inp_f = [float(r) for r in inp_r] for cut in inp_asu.cuts: r_cut = cut.strip() r_inside = r_cut.is_inside(inp_r) for buffer_thickness in [0.001, 1, -1][:1]: f_cut = cut.as_float_cut_plane().add_buffer( unit_cell=unit_cell, thickness=buffer_thickness) f_inside = f_cut.is_inside(inp_f) if (buffer_thickness < 0): if (r_inside != f_inside): assert r_inside elif (buffer_thickness < 0.01): assert r_inside == f_inside elif (r_inside != f_inside): assert f_inside # check correctness of float_asu.add_buffer() assert float_asu.is_inside(inp_f) == inp_asu.shape_only().is_inside(inp_r) asu_with_metric = inp_asu.define_metric(unit_cell) assert asu_with_metric.hall_symbol is inp_asu.hall_symbol assert len(asu_with_metric.cuts) == len(inp_asu.cuts) assert asu_with_metric.unit_cell is unit_cell asu_tight = asu_with_metric.as_float_asu() asu_buffer = asu_with_metric.add_buffer(thickness=2) asu_shrunk = asu_with_metric.add_buffer(relative_thickness=-1.e-5) vertices = facet_analysis.shape_vertices(inp_asu) for vertex in vertices: assert inp_asu.shape_only().is_inside(vertex) for vertex in vertices: assert asu_tight.is_inside(matrix.col(vertex).as_float().elems) for vertex in vertices: assert asu_buffer.is_inside(matrix.col(vertex).as_float().elems) for vertex in vertices: assert not asu_shrunk.is_inside(matrix.col(vertex).as_float().elems)
def exercise_asu_eight_point_interpolation(): map = flex.double(flex.grid(2,3,5), 10) cs = crystal.symmetry( unit_cell=(1,1,1,90,90,90), space_group="P1") asu_mappings=cs.asu_mappings(buffer_thickness=0) for shift in [0,1,-1]: for index in flex.nested_loop(map.focus()): x_frac = [float(i)/n+shift for i,n in zip(index, map.focus())] assert approx_equal( maptbx.asu_eight_point_interpolation(map, asu_mappings, x_frac), 10) assert approx_equal( maptbx.asu_eight_point_interpolation(map, asu_mappings, (10,11,12)), 10)
def exercise_eight_point_interpolation(): map = flex.double(flex.grid(2,3,5), 10) for shift in [0,1,-1]: for index in flex.nested_loop(map.focus()): x_frac = [float(i)/n+shift for i,n in zip(index, map.focus())] assert approx_equal(maptbx.eight_point_interpolation(map, x_frac), 10) assert approx_equal( maptbx.eight_point_interpolation_with_gradients(map, x_frac,[1,1,1])[0], 10) assert maptbx.closest_grid_point(map.accessor(), x_frac) == index for i in xrange(100): x_frac = [3*random.random()-1 for i in xrange(3)] assert approx_equal(map.eight_point_interpolation(x_frac), 10) assert approx_equal( map.eight_point_interpolation_with_gradients(x_frac,[1,1,1])[0], 10) map = flex.double(range(30)) map.resize(flex.grid(2,3,5)) for shift in [0,1,-1]: v = 0 for index in flex.nested_loop(map.focus()): x_frac = [float(i)/n+shift for i,n in zip(index, map.focus())] assert approx_equal(map.eight_point_interpolation(x_frac), v) assert approx_equal( map[maptbx.closest_grid_point(map.accessor(), x_frac)], v) assert approx_equal(map.value_at_closest_grid_point(x_frac), v) v += 1 map = flex.double() for i in xrange(48): map.append(i%2) map.resize(flex.grid(2,4,6)) for shift in [0,1,-1]: for offs in [.0,.5,.25,.75]: v = offs for index in flex.nested_loop(map.focus()): x_frac = [(i+offs)/n+shift for i,n in zip(index, map.focus())] assert approx_equal(map.eight_point_interpolation(x_frac), v) if (offs != .5): assert maptbx.closest_grid_point(map.accessor(), x_frac) == tuple( [int(i+offs+.5)%n for i,n in zip(index,map.focus())]) v = 1-v
def exercise_comprehensive(args): if ("--verbose" in args): out = sys.stdout else: out = StringIO() if ("--paranoid" in args): cb_range = 2 else: cb_range = 1 for symbol in bravais_types.acentric: print("bravais type:", symbol) sym = sgtbx.space_group_info(symbol=symbol) \ .any_compatible_crystal_symmetry(volume=1000) \ .niggli_cell() abc = list(sym.unit_cell().parameters()[:3]) abc.sort() for cb_elements in flex.nested_loop([-cb_range] * 9, [cb_range + 1] * 9): r = sgtbx.rot_mx(cb_elements) if (r.determinant() != 1): continue cb_op = sgtbx.change_of_basis_op(sgtbx.rt_mx(r)) sym_cb = sym.change_basis(cb_op) abc_cb = list(sym_cb.unit_cell().parameters()[:3]) abc_cb.sort() for x, y in zip(abc, abc_cb): assert y - x > -1.e-6 if (y - x > 1.e-4): break else: print("cb_ob:", cb_op.c(), cb_elements, file=out) assert min(cb_elements) >= -1 assert max(cb_elements) <= 1 for s in sym_cb.space_group(): assert s.r().den() == 1 r_num = s.r().num() print("r:", r_num, file=out) assert min(r_num) >= -1 assert max(r_num) <= 1 for enforce in [False, True]: lattice_group = sgtbx.lattice_symmetry.group( reduced_cell=sym_cb.unit_cell(), max_delta=1.4, enforce_max_delta_for_generated_two_folds=enforce) assert lattice_group == sym_cb.space_group() sys.stdout.flush() print(file=out)
def exercise_comprehensive(args): if ("--verbose" in args): out = sys.stdout else: out = StringIO() if ("--paranoid" in args): cb_range = 2 else: cb_range = 1 for symbol in bravais_types.acentric: print "bravais type:", symbol sym = sgtbx.space_group_info(symbol=symbol) \ .any_compatible_crystal_symmetry(volume=1000) \ .niggli_cell() abc = list(sym.unit_cell().parameters()[:3]) abc.sort() for cb_elements in flex.nested_loop([-cb_range]*9,[cb_range+1]*9): r = sgtbx.rot_mx(cb_elements) if (r.determinant() != 1): continue cb_op = sgtbx.change_of_basis_op(sgtbx.rt_mx(r)) sym_cb = sym.change_basis(cb_op) abc_cb = list(sym_cb.unit_cell().parameters()[:3]) abc_cb.sort() for x,y in zip(abc, abc_cb): assert y-x > -1.e-6 if (y-x > 1.e-4): break else: print >> out, "cb_ob:", cb_op.c(), cb_elements assert min(cb_elements) >= -1 assert max(cb_elements) <= 1 for s in sym_cb.space_group(): assert s.r().den() == 1 r_num = s.r().num() print >> out, "r:", r_num assert min(r_num) >= -1 assert max(r_num) <= 1 for enforce in [False, True]: lattice_group = sgtbx.lattice_symmetry.group( reduced_cell=sym_cb.unit_cell(), max_delta=1.4, enforce_max_delta_for_generated_two_folds=enforce) assert lattice_group == sym_cb.space_group() sys.stdout.flush() print >> out
# Actual data via member; no work done here. rmap = sampled_density.real_map() # Convert the cctbx flex array to EMData. Better done in C++, or # work with EMData after getting the `coords` above. from EMAN2_cppwrap import * ed = EMData() # .focus() is logical array size # .all() is the allocated size (padding etc.) n = rmap.focus() ed.set_size(n[2],n[1],n[0]) print "Entering slow loop...", # should be implemented in C++ sys.stdout.flush() for i in flex.nested_loop(rmap.focus()): ee[i[2],i[1],i[0]] = rmap[i] print "done." sys.stdout.flush() # Save. drop_image(ed, image_file_name) # #* Example from Pawel Afonine # Also see # $SPXROOT/cctbx/cctbx_sources/cctbx/cctbx/xray/structure.py from cctbx.array_family import flex from iotbx import pdb
# Actual data via member; no work done here. rmap = sampled_density.real_map() # Convert the cctbx flex array to EMData. Better done in C++, or # work with EMData after getting the `coords` above. from EMAN2_cppwrap import * ed = EMData() # .focus() is logical array size # .all() is the allocated size (padding etc.) n = rmap.focus() ed.set_size(n[2], n[1], n[0]) print("Entering slow loop...", end=' ') # should be implemented in C++ sys.stdout.flush() for i in flex.nested_loop(rmap.focus()): ee[i[2], i[1], i[0]] = rmap[i] print("done.") sys.stdout.flush() # Save. drop_image(ed, image_file_name) # #* Example from Pawel Afonine # Also see # $SPXROOT/cctbx/cctbx_sources/cctbx/cctbx/xray/structure.py from cctbx.array_family import flex from iotbx import pdb
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 rho_stats(xray_structure, d_min, resolution_factor, electron_sum_radius, zero_out_f000): n_real = [] n_half_plus = [] n_half_minus = [] s2 = d_min * resolution_factor * 2 for l in xray_structure.unit_cell().parameters()[:3]: nh = ifloor(l / s2) n_real.append(2 * nh + 1) n_half_plus.append(nh) n_half_minus.append(-nh) n_real = tuple(n_real) n_real_product = matrix.col(n_real).product() crystal_gridding = maptbx.crystal_gridding( unit_cell=xray_structure.unit_cell(), space_group_info=xray_structure.space_group_info(), pre_determined_n_real=n_real) miller_indices = flex.miller_index() miller_indices.reserve(n_real_product) for h in flex.nested_loop(n_half_minus, n_half_plus, open_range=False): miller_indices.append(h) assert miller_indices.size() == n_real_product # miller_set = miller.set(crystal_symmetry=xray_structure, anomalous_flag=True, indices=miller_indices).sort(by_value="resolution") assert miller_set.indices()[0] == (0, 0, 0) f_calc = miller_set.structure_factors_from_scatterers( xray_structure=xray_structure, algorithm="direct", cos_sin_table=False).f_calc() if (zero_out_f000): f_calc.data()[0] = 0j # unit_cell_volume = xray_structure.unit_cell().volume() voxel_volume = unit_cell_volume / n_real_product number_of_miller_indices = [] rho_max = [] electron_sums_around_atoms = [] densities_along_x = [] for f in [f_calc, f_calc.resolution_filter(d_min=d_min)]: assert f.indices()[0] == (0, 0, 0) number_of_miller_indices.append(f.indices().size()) fft_map = miller.fft_map(crystal_gridding=crystal_gridding, fourier_coefficients=f) assert fft_map.n_real() == n_real rho = fft_map.real_map_unpadded() / unit_cell_volume assert approx_equal(voxel_volume * flex.sum(rho), f_calc.data()[0]) if (xray_structure.scatterers().size() == 1): assert flex.max_index(rho) == 0 rho_max.append(rho[0]) else: rho_max.append(flex.max(rho)) site_cart = xray_structure.sites_cart()[0] gias = maptbx.grid_indices_around_sites( unit_cell=xray_structure.unit_cell(), fft_n_real=n_real, fft_m_real=n_real, sites_cart=flex.vec3_double([site_cart]), site_radii=flex.double([electron_sum_radius])) electron_sums_around_atoms.append( flex.sum(rho.as_1d().select(gias)) * voxel_volume) # a = xray_structure.unit_cell().parameters()[0] nx = n_real[0] nxh = nx // 2 x = [] y = [] for ix in range(-nxh, nxh + 1): x.append(a * ix / nx) y.append(rho[(ix % nx, 0, 0)]) densities_along_x.append((x, y)) # print( "%3.1f %4.2f %-12s %5d %5d | %6.3f %6.3f | %6.3f %6.3f | %4.2f %5.1f" % (d_min, resolution_factor, n_real, number_of_miller_indices[0], number_of_miller_indices[1], electron_sums_around_atoms[0], electron_sums_around_atoms[1], rho_max[0], rho_max[1], f_calc.data()[0].real, u_as_b(xray_structure.scatterers()[0].u_iso))) # return densities_along_x
def hcp_fill_box(cb_op_original_to_sampling, float_asu, continuous_shift_flags, point_distance, buffer_thickness=-1, all_twelve_neighbors=False, exercise_cpp=True): if (exercise_cpp): cpp = close_packing.hexagonal_sampling_generator( cb_op_original_to_sampling=cb_op_original_to_sampling, float_asu=float_asu, continuous_shift_flags=continuous_shift_flags, point_distance=point_distance, buffer_thickness=buffer_thickness, all_twelve_neighbors=all_twelve_neighbors) assert point_distance > 0 if (buffer_thickness < 0): buffer_thickness = point_distance * (2/3. * (.5 * math.sqrt(3))) if (exercise_cpp): assert cpp.cb_op_original_to_sampling().c()==cb_op_original_to_sampling.c() assert cpp.float_asu().unit_cell().is_similar_to(float_asu.unit_cell()) assert cpp.continuous_shift_flags() == continuous_shift_flags assert approx_equal(cpp.point_distance(), point_distance) assert approx_equal(cpp.buffer_thickness(), buffer_thickness) assert cpp.all_twelve_neighbors() == all_twelve_neighbors float_asu_buffer = float_asu.add_buffer(thickness=buffer_thickness) hex_cell = hexagonal_sampling_cell(point_distance=point_distance) hex_box = hexagonal_box( hex_cell=hex_cell, vertices_cart=float_asu.shape_vertices(cartesian=True)) hex_box_buffer = hexagonal_box( hex_cell=hex_cell, vertices_cart=float_asu_buffer.shape_vertices(cartesian=True)) box_lower = [] box_upper = [] for i in xrange(3): if (continuous_shift_flags[i]): box_lower.append(0) box_upper.append(0) else: n = iceil(abs(hex_box.max[i]-hex_box.pivot[i])) box_lower.append(min(-2,ifloor(hex_box_buffer.min[i]-hex_box.pivot[i]))) box_upper.append(n+max(2,iceil(hex_box_buffer.max[i]-hex_box.max[i]))) if (exercise_cpp): assert list(cpp.box_lower()) == box_lower assert list(cpp.box_upper()) == box_upper hex_to_frac_matrix = ( matrix.sqr(float_asu.unit_cell().fractionalization_matrix()) * matrix.sqr(hex_cell.orthogonalization_matrix())) sites_frac = flex.vec3_double() for point in flex.nested_loop(begin=box_lower, end=box_upper, open_range=False): site_hex = matrix.col(hex_box.pivot) \ + matrix.col(hex_indices_as_site(point)) site_frac = hex_to_frac_matrix * site_hex if (float_asu_buffer.is_inside(site_frac)): sites_frac.append(site_frac) elif (all_twelve_neighbors): for offset in [(1,0,0),(1,1,0),(0,1,0),(-1,0,0),(-1,-1,0),(0,-1,0), (0,0,1),(-1,-1,1),(0,-1,1), (0,0,-1),(-1,-1,-1),(0,-1,-1)]: offset_hex = hex_indices_as_site(offset, layer=point[2]) offset_frac = hex_to_frac_matrix * matrix.col(offset_hex) other_site_frac = site_frac + offset_frac if (float_asu.is_inside(other_site_frac)): sites_frac.append(site_frac) break assert sites_frac.size() > 0 rt = cb_op_original_to_sampling.c_inv().as_double_array() sites_frac = rt[:9] * sites_frac sites_frac += rt[9:] if (exercise_cpp): assert not cpp.at_end() cpp_sites_frac = cpp.all_sites_frac() assert cpp.at_end() assert cpp_sites_frac.size() == sites_frac.size() assert approx_equal(cpp_sites_frac, sites_frac) cpp.restart() assert not cpp.at_end() assert approx_equal(cpp.next_site_frac(), sites_frac[0]) assert cpp.count_sites() == sites_frac.size()-1 assert cpp.at_end() cpp.restart() n = 0 for site in cpp: n += 1 assert n == sites_frac.size() return sites_frac
def exercise_copy(): for flex_type in flex_types(): m = flex_type((1,2,3,4)) m.resize(flex.grid(2,2)) c = maptbx.copy(map=m, result_grid=m.accessor()) assert tuple(m) == tuple(c) c = maptbx.copy(map=m, result_grid=flex.grid(2,3).set_focus(2,2)) assert approx_equal(tuple(c), (1,2,0,3,4,0)) n = maptbx.copy(c, result_grid=m.accessor()) assert approx_equal(tuple(m), tuple(n)) c = maptbx.copy(m, flex.grid(3,2).set_focus(2,2)) assert approx_equal(tuple(c), (1,2,3,4,0,0)) n = maptbx.copy(c, m.accessor()) assert approx_equal(tuple(m), tuple(n)) m = flex_type((1,2,3,4,5,6)) m.resize(flex.grid((1,2),(3,5))) c = maptbx.copy(m, m.accessor()) assert approx_equal(tuple(m), tuple(c)) c = maptbx.copy(m, flex.grid((1,2),(3,6)).set_focus(3,5)) assert approx_equal(tuple(c), (1,2,3,0,4,5,6,0)) n = maptbx.copy(c, m.accessor()) assert approx_equal(tuple(m), tuple(n)) c = maptbx.copy(m, flex.grid((1,2),(4,5)).set_focus(3,5)) assert approx_equal(tuple(c), (1,2,3,4,5,6,0,0,0)) n = maptbx.copy(c, m.accessor()) assert approx_equal(tuple(m), tuple(n)) # m = flex_type() for i in xrange(2): for j in xrange(3): for k in xrange(5): m.append(i*100+j*10+k) m.resize(flex.grid(2,3,5).set_focus((2,3,4))) for i in xrange(-5,5): for j in xrange(-5,5): for k in xrange(-5,5): c = maptbx.copy(map_unit_cell=m, first=(i,j,k), last=(i,j,k)) assert c.size() == 1 assert c[(i,j,k)] == m[(i%2,j%3,k%4)] c = maptbx.copy(map_unit_cell=m, first=(-1,1,-2), last=(1,2,0)) assert list(c) == [112, 113, 110, 122, 123, 120, 12, 13, 10, 22, 23, 20, 112, 113, 110, 122, 123, 120] # m2 = m.deep_copy() grid = flex.grid( (-1,-1,-1), (1,2,4) ).set_focus( (1,2,3) ) m2.resize(grid) for i in xrange(-1,1): for j in xrange(-1,2): for k in xrange(-1,3): # aperiodic copy c = maptbx.copy_box(map=m2, first=(i,j,k), last=(i,j,k)) assert c.size() == 1 ind = ((i+1)%2-1,(j+1)%3-1,(k+1)%4-1) assert c[(i,j,k)] == m2[ind] c = maptbx.copy_box(map=m2, first=(-1,0,-1), last=(0,1,2)) assert list(c) == [10, 11, 12, 13, 20, 21, 22, 23, 110, 111, 112, 113, 120, 121, 122, 123] # for n0 in xrange(4): for n1 in xrange(4): for n2 in xrange(4): for d2 in xrange(3): g = flex.grid((n0,n1,n2+d2)).set_focus((n0,n1,n2)) map1 = flex_type(range(1,1+g.size_1d())) map1.resize(g) map2 = map1.deep_copy() maptbx.unpad_in_place(map=map2) assert map2.all() == (n0,n1,n2) assert not map2.is_padded() if (n0*n1*n2 != 0): for i in flex.nested_loop((n0,n1,n2)): assert map2[i] == map1[i] n0,n1,n2,d2 = 2,3,4,1 g = flex.grid((n0,n1,n2+d2)).set_focus((n0,n1,n2)) map1 = flex_type(range(1,1+g.size_1d())) map1.resize(g) map2 = map1.deep_copy() maptbx.unpad_in_place(map=map2) assert map2.all() == (n0,n1,n2) assert not map2.is_padded() assert list(map2) == [ 1, 2, 3, 4, 6, 7, 8, 9, 11,12,13,14, 16,17,18,19, 21,22,23,24, 26,27,28,29]
def rho_stats( xray_structure, d_min, resolution_factor, electron_sum_radius, zero_out_f000): n_real = [] n_half_plus = [] n_half_minus = [] s2 = d_min * resolution_factor * 2 for l in xray_structure.unit_cell().parameters()[:3]: nh = ifloor(l / s2) n_real.append(2*nh+1) n_half_plus.append(nh) n_half_minus.append(-nh) n_real = tuple(n_real) n_real_product = matrix.col(n_real).product() crystal_gridding = maptbx.crystal_gridding( unit_cell=xray_structure.unit_cell(), space_group_info=xray_structure.space_group_info(), pre_determined_n_real=n_real) miller_indices = flex.miller_index() miller_indices.reserve(n_real_product) for h in flex.nested_loop(n_half_minus, n_half_plus, open_range=False): miller_indices.append(h) assert miller_indices.size() == n_real_product # miller_set = miller.set( crystal_symmetry=xray_structure, anomalous_flag=True, indices=miller_indices).sort(by_value="resolution") assert miller_set.indices()[0] == (0,0,0) f_calc = miller_set.structure_factors_from_scatterers( xray_structure=xray_structure, algorithm="direct", cos_sin_table=False).f_calc() if (zero_out_f000): f_calc.data()[0] = 0j # unit_cell_volume = xray_structure.unit_cell().volume() voxel_volume = unit_cell_volume / n_real_product number_of_miller_indices = [] rho_max = [] electron_sums_around_atoms = [] densities_along_x = [] for f in [f_calc, f_calc.resolution_filter(d_min=d_min)]: assert f.indices()[0] == (0,0,0) number_of_miller_indices.append(f.indices().size()) fft_map = miller.fft_map( crystal_gridding=crystal_gridding, fourier_coefficients=f) assert fft_map.n_real() == n_real rho = fft_map.real_map_unpadded() / unit_cell_volume assert approx_equal(voxel_volume*flex.sum(rho), f_calc.data()[0]) if (xray_structure.scatterers().size() == 1): assert flex.max_index(rho) == 0 rho_max.append(rho[0]) else: rho_max.append(flex.max(rho)) site_cart = xray_structure.sites_cart()[0] gias = maptbx.grid_indices_around_sites( unit_cell=xray_structure.unit_cell(), fft_n_real=n_real, fft_m_real=n_real, sites_cart=flex.vec3_double([site_cart]), site_radii=flex.double([electron_sum_radius])) electron_sums_around_atoms.append( flex.sum(rho.as_1d().select(gias))*voxel_volume) # a = xray_structure.unit_cell().parameters()[0] nx = n_real[0] nxh = nx//2 x = [] y = [] for ix in xrange(-nxh,nxh+1): x.append(a*ix/nx) y.append(rho[(ix%nx,0,0)]) densities_along_x.append((x,y)) # print \ "%3.1f %4.2f %-12s %5d %5d | %6.3f %6.3f | %6.3f %6.3f | %4.2f %5.1f" % ( d_min, resolution_factor, n_real, number_of_miller_indices[0], number_of_miller_indices[1], electron_sums_around_atoms[0], electron_sums_around_atoms[1], rho_max[0], rho_max[1], f_calc.data()[0].real, u_as_b(xray_structure.scatterers()[0].u_iso)) # return densities_along_x
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 hcp_fill_box(cb_op_original_to_sampling, float_asu, continuous_shift_flags, point_distance, buffer_thickness=-1, all_twelve_neighbors=False, exercise_cpp=True): if (exercise_cpp): cpp = close_packing.hexagonal_sampling_generator( cb_op_original_to_sampling=cb_op_original_to_sampling, float_asu=float_asu, continuous_shift_flags=continuous_shift_flags, point_distance=point_distance, buffer_thickness=buffer_thickness, all_twelve_neighbors=all_twelve_neighbors) assert point_distance > 0 if (buffer_thickness < 0): buffer_thickness = point_distance * (2 / 3. * (.5 * math.sqrt(3))) if (exercise_cpp): assert cpp.cb_op_original_to_sampling().c( ) == cb_op_original_to_sampling.c() assert cpp.float_asu().unit_cell().is_similar_to(float_asu.unit_cell()) assert cpp.continuous_shift_flags() == continuous_shift_flags assert approx_equal(cpp.point_distance(), point_distance) assert approx_equal(cpp.buffer_thickness(), buffer_thickness) assert cpp.all_twelve_neighbors() == all_twelve_neighbors float_asu_buffer = float_asu.add_buffer(thickness=buffer_thickness) hex_cell = hexagonal_sampling_cell(point_distance=point_distance) hex_box = hexagonal_box( hex_cell=hex_cell, vertices_cart=float_asu.shape_vertices(cartesian=True)) hex_box_buffer = hexagonal_box( hex_cell=hex_cell, vertices_cart=float_asu_buffer.shape_vertices(cartesian=True)) box_lower = [] box_upper = [] for i in range(3): if (continuous_shift_flags[i]): box_lower.append(0) box_upper.append(0) else: n = iceil(abs(hex_box.max[i] - hex_box.pivot[i])) box_lower.append( min(-2, ifloor(hex_box_buffer.min[i] - hex_box.pivot[i]))) box_upper.append( n + max(2, iceil(hex_box_buffer.max[i] - hex_box.max[i]))) if (exercise_cpp): assert list(cpp.box_lower()) == box_lower assert list(cpp.box_upper()) == box_upper hex_to_frac_matrix = ( matrix.sqr(float_asu.unit_cell().fractionalization_matrix()) * matrix.sqr(hex_cell.orthogonalization_matrix())) sites_frac = flex.vec3_double() for point in flex.nested_loop(begin=box_lower, end=box_upper, open_range=False): site_hex = matrix.col(hex_box.pivot) \ + matrix.col(hex_indices_as_site(point)) site_frac = hex_to_frac_matrix * site_hex if (float_asu_buffer.is_inside(site_frac)): sites_frac.append(site_frac) elif (all_twelve_neighbors): for offset in [(1, 0, 0), (1, 1, 0), (0, 1, 0), (-1, 0, 0), (-1, -1, 0), (0, -1, 0), (0, 0, 1), (-1, -1, 1), (0, -1, 1), (0, 0, -1), (-1, -1, -1), (0, -1, -1)]: offset_hex = hex_indices_as_site(offset, layer=point[2]) offset_frac = hex_to_frac_matrix * matrix.col(offset_hex) other_site_frac = site_frac + offset_frac if (float_asu.is_inside(other_site_frac)): sites_frac.append(site_frac) break assert sites_frac.size() > 0 rt = cb_op_original_to_sampling.c_inv().as_double_array() sites_frac = rt[:9] * sites_frac sites_frac += rt[9:] if (exercise_cpp): assert not cpp.at_end() cpp_sites_frac = cpp.all_sites_frac() assert cpp.at_end() assert cpp_sites_frac.size() == sites_frac.size() assert approx_equal(cpp_sites_frac, sites_frac) cpp.restart() assert not cpp.at_end() assert approx_equal(cpp.next_site_frac(), sites_frac[0]) assert cpp.count_sites() == sites_frac.size() - 1 assert cpp.at_end() cpp.restart() n = 0 for site in cpp: n += 1 assert n == sites_frac.size() return sites_frac