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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #6
0
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
Beispiel #7
0
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)
Beispiel #9
0
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)
Beispiel #10
0
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
Beispiel #11
0
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
Beispiel #13
0
    # 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
Beispiel #14
0
    # 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
Beispiel #18
0
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
Beispiel #20
0
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))
Beispiel #21
0
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