Ejemplo n.º 1
0
    def __init__(self, phi0, misset0, phi1, misset1):
        """Initialise the rotation axis and what have you from some
        experimental results. N.B. all input values in DEGREES."""

        # canonical: X = X-ray beam
        #            Z = rotation axis
        #            Y = Z ^ X

        z = matrix.col([0, 0, 1])

        # then calculate the rotation axis

        R = (
            (
                z.axis_and_angle_as_r3_rotation_matrix(phi1, deg=True)
                * matrix.sqr(xyz_matrix(misset1[0], misset1[1], misset1[2]))
            )
            * (
                z.axis_and_angle_as_r3_rotation_matrix(phi0, deg=True)
                * matrix.sqr(xyz_matrix(misset0[0], misset0[1], misset0[2]))
            ).inverse()
        )

        self._z = z
        self._r = matrix.col(r3_rotation_axis_and_angle_from_matrix(R).axis)
        self._M0 = matrix.sqr(xyz_matrix(misset0[0], misset0[1], misset0[2]))

        return
Ejemplo n.º 2
0
    def __init__(self, phi0, misset0, phi1, misset1):
        """Initialise the rotation axis and what have you from some
    experimental results. N.B. all input values in DEGREES."""

        # canonical: X = X-ray beam
        #            Z = rotation axis
        #            Y = Z ^ X

        z = matrix.col([0, 0, 1])

        # then calculate the rotation axis

        R = (
            (
                z.axis_and_angle_as_r3_rotation_matrix(phi1, deg=True)
                * matrix.sqr(xyz_matrix(misset1[0], misset1[1], misset1[2]))
            )
            * (
                z.axis_and_angle_as_r3_rotation_matrix(phi0, deg=True)
                * matrix.sqr(xyz_matrix(misset0[0], misset0[1], misset0[2]))
            ).inverse()
        )

        self._z = z
        self._r = matrix.col(r3_rotation_axis_and_angle_from_matrix(R).axis)
        self._M0 = matrix.sqr(xyz_matrix(misset0[0], misset0[1], misset0[2]))

        return
Ejemplo n.º 3
0
def compute(work_params,
            use_wavelength_2=False,
            store_miller_index_i_seqs=False,
            store_spots=False,
            store_signals=False,
            set_pixels=False):
    i_calc = build_i_calc(work_params)
    from scitbx.math.euler_angles import xyz_matrix
    crystal_rotation_matrix = xyz_matrix(*work_params.euler_angles_xyz)
    work_params.crystal_rotation_matrix = crystal_rotation_matrix
    if (not use_wavelength_2):
        wavelength = work_params.wavelength
    else:
        wavelength = work_params.wavelength_2
    from rstbx.simage import image_simple
    return i_calc, image_simple(
        store_miller_index_i_seqs=store_miller_index_i_seqs,
        store_spots=store_spots,
        store_signals=store_signals,
        set_pixels=set_pixels).compute(
            unit_cell=i_calc.p1_anom.unit_cell(),
            miller_indices=i_calc.p1_anom.indices(),
            spot_intensity_factors=i_calc.p1_anom.data(),
            crystal_rotation_matrix=crystal_rotation_matrix,
            ewald_radius=1 / wavelength,
            ewald_proximity=work_params.ewald_proximity,
            signal_max=work_params.signal_max,
            detector_distance=work_params.detector.distance,
            detector_size=work_params.detector.size,
            detector_pixels=work_params.detector.pixels,
            point_spread=work_params.point_spread,
            gaussian_falloff_scale=work_params.gaussian_falloff_scale)
Ejemplo n.º 4
0
def compute(
      work_params,
      use_wavelength_2=False,
      store_miller_index_i_seqs=False,
      store_spots=False,
      store_signals=False,
      set_pixels=False):
  i_calc = build_i_calc(work_params)
  from scitbx.math.euler_angles import xyz_matrix
  crystal_rotation_matrix = xyz_matrix(*work_params.euler_angles_xyz)
  work_params.crystal_rotation_matrix = crystal_rotation_matrix
  if (not use_wavelength_2):
    wavelength = work_params.wavelength
  else:
    wavelength = work_params.wavelength_2
  from rstbx.simage import image_simple
  return i_calc, image_simple(
    store_miller_index_i_seqs=store_miller_index_i_seqs,
    store_spots=store_spots,
    store_signals=store_signals,
    set_pixels=set_pixels).compute(
      unit_cell=i_calc.p1_anom.unit_cell(),
      miller_indices=i_calc.p1_anom.indices(),
      spot_intensity_factors=i_calc.p1_anom.data(),
      crystal_rotation_matrix=crystal_rotation_matrix,
      ewald_radius=1/wavelength,
      ewald_proximity=work_params.ewald_proximity,
      signal_max=work_params.signal_max,
      detector_distance=work_params.detector.distance,
      detector_size=work_params.detector.size,
      detector_pixels=work_params.detector.pixels,
      point_spread=work_params.point_spread,
      gaussian_falloff_scale=work_params.gaussian_falloff_scale)
Ejemplo n.º 5
0
def exercise():
    from dials.algorithms.indexing import compare_orientation_matrices
    from dxtbx.model import Crystal
    from cctbx import sgtbx
    from scitbx import matrix
    from scitbx.math import euler_angles as euler

    # try and see if we can get back the original rotation matrix and euler angles
    real_space_a = matrix.col((10, 0, 0))
    real_space_b = matrix.col((0, 10, 10))
    real_space_c = matrix.col((0, 0, 10))
    euler_angles = (1.3, 5.6, 7.8)
    R = matrix.sqr(
        euler.xyz_matrix(euler_angles[0], euler_angles[1], euler_angles[2]))
    crystal_a = Crystal(real_space_a,
                        real_space_b,
                        real_space_c,
                        space_group=sgtbx.space_group('P 1'))
    crystal_b = Crystal(R * real_space_a,
                        R * real_space_b,
                        R * real_space_c,
                        space_group=sgtbx.space_group('P 1'))
    assert approx_equal(
        matrix.sqr(crystal_b.get_U()) *
        matrix.sqr(crystal_a.get_U()).transpose(), R)
    best_R_ab, best_axis, best_angle, best_cb_op = \
      compare_orientation_matrices.difference_rotation_matrix_axis_angle(
        crystal_a,
        crystal_b)
    best_euler_angles = euler.xyz_angles(best_R_ab)
    assert approx_equal(best_euler_angles, euler_angles)
    assert best_cb_op.is_identity_op()
    assert approx_equal(best_R_ab, R)

    # now see if we can deconvolute the original euler angles after applying
    # a change of basis to one of the crystals
    crystal_a = Crystal(real_space_a,
                        real_space_b,
                        real_space_c,
                        space_group=sgtbx.space_group('I 2 3'))
    crystal_b = Crystal(R * real_space_a,
                        R * real_space_b,
                        R * real_space_c,
                        space_group=sgtbx.space_group('I 2 3'))
    cb_op = sgtbx.change_of_basis_op('z,x,y')
    crystal_b = crystal_b.change_basis(cb_op)
    best_R_ab, best_axis, best_angle, best_cb_op = \
      compare_orientation_matrices.difference_rotation_matrix_axis_angle(
        crystal_a,
        crystal_b)
    best_euler_angles = euler.xyz_angles(best_R_ab)
    assert approx_equal(best_euler_angles, euler_angles)
    assert best_cb_op.c() == cb_op.inverse().c()
    assert approx_equal(best_R_ab, R)
def exercise():
  from dials.algorithms.indexing import compare_orientation_matrices
  from dxtbx.model.crystal import crystal_model
  from cctbx import sgtbx
  from scitbx import matrix
  from scitbx.math import euler_angles as euler

  # try and see if we can get back the original rotation matrix and euler angles
  real_space_a = matrix.col((10,0,0))
  real_space_b = matrix.col((0,10,10))
  real_space_c = matrix.col((0,0,10))
  euler_angles = (1.3, 5.6, 7.8)
  R = matrix.sqr(
    euler.xyz_matrix(euler_angles[0], euler_angles[1], euler_angles[2]))
  crystal_a = crystal_model(real_space_a,
                            real_space_b,
                            real_space_c,
                            space_group=sgtbx.space_group('P 1'))
  crystal_b = crystal_model(R * real_space_a,
                            R * real_space_b,
                            R * real_space_c,
                            space_group=sgtbx.space_group('P 1'))
  assert approx_equal(crystal_b.get_U() * crystal_a.get_U().transpose(), R)
  best_R_ab, best_axis, best_angle, best_cb_op = \
    compare_orientation_matrices.difference_rotation_matrix_axis_angle(
      crystal_a,
      crystal_b)
  best_euler_angles = euler.xyz_angles(best_R_ab)
  assert approx_equal(best_euler_angles, euler_angles)
  assert best_cb_op.is_identity_op()
  assert approx_equal(best_R_ab, R)

  # now see if we can deconvolute the original euler angles after applying
  # a change of basis to one of the crystals
  crystal_a = crystal_model(real_space_a,
                            real_space_b,
                            real_space_c,
                            space_group=sgtbx.space_group('I 2 3'))
  crystal_b = crystal_model(R * real_space_a,
                            R * real_space_b,
                            R * real_space_c,
                            space_group=sgtbx.space_group('I 2 3'))
  cb_op = sgtbx.change_of_basis_op('z,x,y')
  crystal_b = crystal_b.change_basis(cb_op)
  best_R_ab, best_axis, best_angle, best_cb_op = \
    compare_orientation_matrices.difference_rotation_matrix_axis_angle(
      crystal_a,
      crystal_b)
  best_euler_angles = euler.xyz_angles(best_R_ab)
  assert approx_equal(best_euler_angles, euler_angles)
  assert best_cb_op.c() == cb_op.inverse().c()
  assert approx_equal(best_R_ab, R)
Ejemplo n.º 7
0
def test_compare_orientation_matrices():
    # try and see if we can get back the original rotation matrix and euler angles
    real_space_a = matrix.col((10, 0, 0))
    real_space_b = matrix.col((0, 10, 10))
    real_space_c = matrix.col((0, 0, 10))
    euler_angles = (1.3, 5.6, 7.8)
    R = matrix.sqr(
        euler.xyz_matrix(euler_angles[0], euler_angles[1], euler_angles[2]))
    crystal_a = Crystal(real_space_a,
                        real_space_b,
                        real_space_c,
                        space_group=sgtbx.space_group('P 1'))
    crystal_b = Crystal(R * real_space_a,
                        R * real_space_b,
                        R * real_space_c,
                        space_group=sgtbx.space_group('P 1'))
    assert (matrix.sqr(crystal_b.get_U()) *
            matrix.sqr(crystal_a.get_U()).transpose()).elems == pytest.approx(
                R.elems)
    best_R_ab, best_axis, best_angle, best_cb_op = \
      compare_orientation_matrices.difference_rotation_matrix_axis_angle(
        crystal_a,
        crystal_b)
    best_euler_angles = euler.xyz_angles(best_R_ab)
    assert best_euler_angles == pytest.approx(euler_angles)
    assert best_cb_op.is_identity_op()
    assert best_R_ab.elems == pytest.approx(R.elems)

    # now see if we can deconvolute the original euler angles after applying
    # a change of basis to one of the crystals
    crystal_a = Crystal(real_space_a,
                        real_space_b,
                        real_space_c,
                        space_group=sgtbx.space_group('I 2 3'))
    crystal_b = Crystal(R * real_space_a,
                        R * real_space_b,
                        R * real_space_c,
                        space_group=sgtbx.space_group('I 2 3'))
    cb_op = sgtbx.change_of_basis_op('z,x,y')
    crystal_b = crystal_b.change_basis(cb_op)
    best_R_ab, best_axis, best_angle, best_cb_op = \
      compare_orientation_matrices.difference_rotation_matrix_axis_angle(
        crystal_a,
        crystal_b)
    best_euler_angles = euler.xyz_angles(best_R_ab)
    assert best_euler_angles == pytest.approx(euler_angles)
    assert best_cb_op.c() == cb_op.inverse().c()
    assert best_R_ab.elems == pytest.approx(R.elems)
def test_crystal_model():
    real_space_a = matrix.col((10, 0, 0))
    real_space_b = matrix.col((0, 11, 0))
    real_space_c = matrix.col((0, 0, 12))
    model = Crystal(
        real_space_a=(10, 0, 0),
        real_space_b=(0, 11, 0),
        real_space_c=(0, 0, 12),
        space_group_symbol="P 1",
    )
    # This doesn't work as python class uctbx.unit_cell(uctbx_ext.unit_cell)
    # so C++ and python classes are different types
    # assert isinstance(model.get_unit_cell(), uctbx.unit_cell)
    assert model.get_unit_cell().parameters() == (10.0, 11.0, 12.0, 90.0, 90.0,
                                                  90.0)
    assert approx_equal(model.get_A(),
                        (1 / 10, 0, 0, 0, 1 / 11, 0, 0, 0, 1 / 12))
    assert approx_equal(
        matrix.sqr(model.get_A()).inverse(), (10, 0, 0, 0, 11, 0, 0, 0, 12))
    assert approx_equal(model.get_B(), model.get_A())
    assert approx_equal(model.get_U(), (1, 0, 0, 0, 1, 0, 0, 0, 1))
    assert approx_equal(model.get_real_space_vectors(),
                        (real_space_a, real_space_b, real_space_c))
    assert (model.get_crystal_symmetry().unit_cell().parameters() ==
            model.get_unit_cell().parameters())
    assert model.get_crystal_symmetry().space_group() == model.get_space_group(
    )

    model2 = Crystal(
        real_space_a=(10, 0, 0),
        real_space_b=(0, 11, 0),
        real_space_c=(0, 0, 12),
        space_group_symbol="P 1",
    )
    assert model == model2

    model2a = Crystal(model.get_A(), model.get_space_group())
    assert model == model2a

    model2b = Crystal(
        matrix.sqr(model.get_A()).inverse().elems,
        model.get_space_group().type().lookup_symbol(),
        reciprocal=False,
    )
    assert model == model2b

    # rotate 45 degrees about x-axis
    R1 = matrix.sqr((
        1,
        0,
        0,
        0,
        math.cos(math.pi / 4),
        -math.sin(math.pi / 4),
        0,
        math.sin(math.pi / 4),
        math.cos(math.pi / 4),
    ))
    # rotate 30 degrees about y-axis
    R2 = matrix.sqr((
        math.cos(math.pi / 6),
        0,
        math.sin(math.pi / 6),
        0,
        1,
        0,
        -math.sin(math.pi / 6),
        0,
        math.cos(math.pi / 6),
    ))
    # rotate 60 degrees about z-axis
    R3 = matrix.sqr((
        math.cos(math.pi / 3),
        -math.sin(math.pi / 3),
        0,
        math.sin(math.pi / 3),
        math.cos(math.pi / 3),
        0,
        0,
        0,
        1,
    ))
    R = R1 * R2 * R3
    model.set_U(R)
    # B is unchanged
    assert approx_equal(model.get_B(),
                        (1 / 10, 0, 0, 0, 1 / 11, 0, 0, 0, 1 / 12))
    assert approx_equal(model.get_U(), R)
    assert approx_equal(model.get_A(),
                        matrix.sqr(model.get_U()) * matrix.sqr(model.get_B()))
    a_, b_, c_ = model.get_real_space_vectors()
    assert approx_equal(a_, R * real_space_a)
    assert approx_equal(b_, R * real_space_b)
    assert approx_equal(c_, R * real_space_c)
    assert (str(model).replace("-0.0000", " 0.0000") == """\
Crystal:
    Unit cell: (10.000, 11.000, 12.000, 90.000, 90.000, 90.000)
    Space group: P 1
    U matrix:  {{ 0.4330, -0.7500,  0.5000},
                { 0.7891,  0.0474, -0.6124},
                { 0.4356,  0.6597,  0.6124}}
    B matrix:  {{ 0.1000,  0.0000,  0.0000},
                { 0.0000,  0.0909,  0.0000},
                { 0.0000,  0.0000,  0.0833}}
    A = UB:    {{ 0.0433, -0.0682,  0.0417},
                { 0.0789,  0.0043, -0.0510},
                { 0.0436,  0.0600,  0.0510}}
""")
    model.set_B((1 / 12, 0, 0, 0, 1 / 12, 0, 0, 0, 1 / 12))
    assert approx_equal(model.get_unit_cell().parameters(),
                        (12, 12, 12, 90, 90, 90))

    U = matrix.sqr((0.3455, -0.2589, -0.9020, 0.8914, 0.3909, 0.2293, 0.2933,
                    -0.8833, 0.3658))
    B = matrix.sqr((1 / 13, 0, 0, 0, 1 / 13, 0, 0, 0, 1 / 13))
    model.set_A(U * B)
    assert approx_equal(model.get_A(), U * B)
    assert approx_equal(model.get_U(), U, 1e-4)
    assert approx_equal(model.get_B(), B, 1e-5)

    model3 = Crystal(
        real_space_a=(10, 0, 0),
        real_space_b=(0, 11, 0),
        real_space_c=(0, 0, 12),
        space_group=sgtbx.space_group_info("P 222").group(),
    )
    assert model3.get_space_group().type().hall_symbol() == " P 2 2"
    assert model != model3
    #
    sgi_ref = sgtbx.space_group_info(number=230)
    model_ref = Crystal(
        real_space_a=(44, 0, 0),
        real_space_b=(0, 44, 0),
        real_space_c=(0, 0, 44),
        space_group=sgi_ref.group(),
    )
    assert approx_equal(model_ref.get_U(), (1, 0, 0, 0, 1, 0, 0, 0, 1))
    assert approx_equal(model_ref.get_B(),
                        (1 / 44, 0, 0, 0, 1 / 44, 0, 0, 0, 1 / 44))
    assert approx_equal(model_ref.get_A(), model_ref.get_B())
    assert approx_equal(model_ref.get_unit_cell().parameters(),
                        (44, 44, 44, 90, 90, 90))
    a_ref, b_ref, c_ref = map(matrix.col, model_ref.get_real_space_vectors())
    cb_op_to_primitive = sgi_ref.change_of_basis_op_to_primitive_setting()
    model_primitive = model_ref.change_basis(cb_op_to_primitive)
    cb_op_to_reference = (model_primitive.get_space_group().info().
                          change_of_basis_op_to_reference_setting())
    a_prim, b_prim, c_prim = map(matrix.col,
                                 model_primitive.get_real_space_vectors())
    assert (cb_op_to_primitive.as_abc() ==
            "-1/2*a+1/2*b+1/2*c,1/2*a-1/2*b+1/2*c,1/2*a+1/2*b-1/2*c")
    assert approx_equal(a_prim, -1 / 2 * a_ref + 1 / 2 * b_ref + 1 / 2 * c_ref)
    assert approx_equal(b_prim, 1 / 2 * a_ref - 1 / 2 * b_ref + 1 / 2 * c_ref)
    assert approx_equal(c_prim, 1 / 2 * a_ref + 1 / 2 * b_ref - 1 / 2 * c_ref)
    assert cb_op_to_reference.as_abc() == "b+c,a+c,a+b"
    assert approx_equal(a_ref, b_prim + c_prim)
    assert approx_equal(b_ref, a_prim + c_prim)
    assert approx_equal(c_ref, a_prim + b_prim)
    assert approx_equal(
        model_primitive.get_U(),
        [
            -0.5773502691896258,
            0.40824829046386285,
            0.7071067811865476,
            0.5773502691896257,
            -0.4082482904638631,
            0.7071067811865476,
            0.5773502691896257,
            0.8164965809277259,
            0.0,
        ],
    )
    assert approx_equal(
        model_primitive.get_B(),
        [
            0.0262431940540739,
            0.0,
            0.0,
            0.00927837023781507,
            0.02783511071344521,
            0.0,
            0.01607060866333063,
            0.01607060866333063,
            0.03214121732666125,
        ],
    )
    assert approx_equal(
        model_primitive.get_A(),
        (0, 1 / 44, 1 / 44, 1 / 44, 0, 1 / 44, 1 / 44, 1 / 44, 0),
    )
    assert approx_equal(
        model_primitive.get_unit_cell().parameters(),
        [
            38.1051177665153,
            38.1051177665153,
            38.1051177665153,
            109.47122063449069,
            109.47122063449069,
            109.47122063449069,
        ],
    )
    assert model_ref != model_primitive
    model_ref_recycled = model_primitive.change_basis(cb_op_to_reference)
    assert approx_equal(model_ref.get_U(), model_ref_recycled.get_U())
    assert approx_equal(model_ref.get_B(), model_ref_recycled.get_B())
    assert approx_equal(model_ref.get_A(), model_ref_recycled.get_A())
    assert approx_equal(
        model_ref.get_unit_cell().parameters(),
        model_ref_recycled.get_unit_cell().parameters(),
    )
    assert model_ref == model_ref_recycled

    uc = uctbx.unit_cell(
        (58.2567, 58.1264, 39.7093, 46.9077, 46.8612, 62.1055))
    sg = sgtbx.space_group_info(symbol="P1").group()
    cs = crystal.symmetry(unit_cell=uc, space_group=sg)
    cb_op_to_minimum = cs.change_of_basis_op_to_minimum_cell()
    # the reciprocal matrix
    B = matrix.sqr(uc.fractionalization_matrix()).transpose()
    U = random_rotation()
    direct_matrix = (U * B).inverse()
    model = Crystal(direct_matrix[:3],
                    direct_matrix[3:6],
                    direct_matrix[6:9],
                    space_group=sg)
    assert uc.is_similar_to(model.get_unit_cell())
    uc_minimum = uc.change_basis(cb_op_to_minimum)
    model_minimum = model.change_basis(cb_op_to_minimum)
    assert uc_minimum.is_similar_to(model_minimum.get_unit_cell())
    assert model_minimum != model
    model_minimum.update(model)
    assert model_minimum == model  # lgtm

    A_static = matrix.sqr(model.get_A())
    A_as_scan_points = [A_static]
    num_scan_points = 11
    for i in range(num_scan_points - 1):
        A_as_scan_points.append(
            A_as_scan_points[-1] *
            matrix.sqr(euler_angles.xyz_matrix(0.1, 0.2, 0.3)))
    model.set_A_at_scan_points(A_as_scan_points)
    model_minimum = model.change_basis(cb_op_to_minimum)
    assert model.num_scan_points == model_minimum.num_scan_points == num_scan_points
    M = matrix.sqr(cb_op_to_minimum.c_inv().r().transpose().as_double())
    M_inv = M.inverse()
    for i in range(num_scan_points):
        A_orig = matrix.sqr(model.get_A_at_scan_point(i))
        A_min = matrix.sqr(model_minimum.get_A_at_scan_point(i))
        assert approx_equal(A_min, A_orig * M_inv)
    assert model.get_unit_cell().parameters() == pytest.approx(
        (58.2567, 58.1264, 39.7093, 46.9077, 46.8612, 62.1055))
    uc = uctbx.unit_cell((10, 11, 12, 91, 92, 93))
    model.set_unit_cell(uc)
    assert model.get_unit_cell().parameters() == pytest.approx(uc.parameters())
Ejemplo n.º 9
0
def exercise_crystal_model():

  real_space_a = matrix.col((10,0,0))
  real_space_b = matrix.col((0,11,0))
  real_space_c = matrix.col((0,0,12))
  model = crystal_model(real_space_a=(10,0,0),
                        real_space_b=(0,11,0),
                        real_space_c=(0,0,12),
                        space_group_symbol="P 1")
  assert isinstance(model.get_unit_cell(), uctbx.unit_cell)
  assert model.get_unit_cell().parameters() == (
    10.0, 11.0, 12.0, 90.0, 90.0, 90.0)
  assert approx_equal(model.get_A(), (1/10, 0, 0, 0, 1/11, 0, 0, 0, 1/12))
  assert approx_equal(model.get_A().inverse(), (10, 0, 0, 0, 11, 0, 0, 0, 12))
  assert approx_equal(model.get_B(), model.get_A())
  assert approx_equal(model.get_U(), (1, 0, 0, 0, 1, 0, 0, 0, 1))
  assert approx_equal(model.get_real_space_vectors(),
                      (real_space_a, real_space_b, real_space_c))
  assert approx_equal(model.get_mosaicity(), 0)

  model2 = crystal_model(real_space_a=(10,0,0),
                         real_space_b=(0,11,0),
                         real_space_c=(0,0,12),
                         space_group_symbol="P 1")
  assert model == model2
  model2.set_mosaicity(0.01)
  assert model != model2
  # rotate 45 degrees about x-axis
  R1 = matrix.sqr((1, 0, 0,
                   0, math.cos(math.pi/4), -math.sin(math.pi/4),
                   0, math.sin(math.pi/4), math.cos(math.pi/4)))
  # rotate 30 degrees about y-axis
  R2 = matrix.sqr((math.cos(math.pi/6), 0, math.sin(math.pi/6),
                   0, 1, 0,
                   -math.sin(math.pi/6), 0, math.cos(math.pi/6)))
  # rotate 60 degrees about z-axis
  R3 = matrix.sqr((math.cos(math.pi/3), -math.sin(math.pi/3), 0,
                   math.sin(math.pi/3), math.cos(math.pi/3), 0,
                   0, 0, 1))
  R = R1 * R2 * R3
  model.set_U(R)
  # B is unchanged
  assert approx_equal(model.get_B(), (1/10, 0, 0, 0, 1/11, 0, 0, 0, 1/12))
  assert approx_equal(model.get_U(), R)
  assert approx_equal(model.get_A(), model.get_U() * model.get_B())
  a_, b_, c_ = model.get_real_space_vectors()
  assert approx_equal(a_, R * real_space_a)
  assert approx_equal(b_, R * real_space_b)
  assert approx_equal(c_, R * real_space_c)
  s = StringIO()
  print >> s, model
  assert not show_diff(s.getvalue().replace("-0.0000", " 0.0000"), """\
Crystal:
    Unit cell: (10.000, 11.000, 12.000, 90.000, 90.000, 90.000)
    Space group: P 1
    U matrix:  {{ 0.4330, -0.7500,  0.5000},
                { 0.7891,  0.0474, -0.6124},
                { 0.4356,  0.6597,  0.6124}}
    B matrix:  {{ 0.1000,  0.0000,  0.0000},
                { 0.0000,  0.0909,  0.0000},
                { 0.0000,  0.0000,  0.0833}}
    A = UB:    {{ 0.0433, -0.0682,  0.0417},
                { 0.0789,  0.0043, -0.0510},
                { 0.0436,  0.0600,  0.0510}}

""")
  model.set_B((1/12, 0, 0, 0, 1/12, 0, 0, 0, 1/12))
  assert approx_equal(model.get_unit_cell().parameters(),
                      (12, 12, 12, 90, 90, 90))

  U = matrix.sqr((
    0.3455, -0.2589, -0.9020, 0.8914, 0.3909, 0.2293, 0.2933, -0.8833, 0.3658))
  B = matrix.sqr((1/13, 0, 0, 0, 1/13, 0, 0, 0, 1/13))
  model.set_A(U * B)
  assert approx_equal(model.get_A(), U * B)
  assert approx_equal(model.get_U(), U, 1e-4)
  assert approx_equal(model.get_B(), B, 1e-5)

  model3 = crystal_model(
    real_space_a=(10,0,0),
    real_space_b=(0,11,0),
    real_space_c=(0,0,12),
    space_group=sgtbx.space_group_info("P 222").group(),
    mosaicity=0.01)
  assert model3.get_space_group().type().hall_symbol() == " P 2 2"
  assert model != model3
  #
  sgi_ref = sgtbx.space_group_info(number=230)
  model_ref = crystal_model(
    real_space_a=(44,0,0),
    real_space_b=(0,44,0),
    real_space_c=(0,0,44),
    space_group=sgi_ref.group())
  assert approx_equal(model_ref.get_U(), (1,0,0,0,1,0,0,0,1))
  assert approx_equal(model_ref.get_B(), (1/44,0,0,0,1/44,0,0,0,1/44))
  assert approx_equal(model_ref.get_A(), model_ref.get_B())
  assert approx_equal(model_ref.get_unit_cell().parameters(),
                      (44,44,44,90,90,90))
  a_ref, b_ref, c_ref = model_ref.get_real_space_vectors()
  cb_op_to_primitive = sgi_ref.change_of_basis_op_to_primitive_setting()
  model_primitive = model_ref.change_basis(cb_op_to_primitive)
  cb_op_to_reference = model_primitive.get_space_group().info()\
    .change_of_basis_op_to_reference_setting()
  a_prim, b_prim, c_prim = model_primitive.get_real_space_vectors()
  #print cb_op_to_primitive.as_abc()
  ##'-1/2*a+1/2*b+1/2*c,1/2*a-1/2*b+1/2*c,1/2*a+1/2*b-1/2*c'
  assert approx_equal(a_prim, -1/2 * a_ref + 1/2 * b_ref + 1/2 * c_ref)
  assert approx_equal(b_prim, 1/2 * a_ref - 1/2 * b_ref + 1/2 * c_ref)
  assert approx_equal(c_prim, 1/2 * a_ref + 1/2 * b_ref - 1/2 * c_ref)
  #print cb_op_to_reference.as_abc()
  ##b+c,a+c,a+b
  assert approx_equal(a_ref, b_prim + c_prim)
  assert approx_equal(b_ref, a_prim + c_prim)
  assert approx_equal(c_ref, a_prim + b_prim)
  assert approx_equal(
    model_primitive.get_U(),
  [-0.5773502691896258, 0.40824829046386285, 0.7071067811865476,
   0.5773502691896257, -0.4082482904638631, 0.7071067811865476,
   0.5773502691896257, 0.8164965809277259, 0.0])
  assert approx_equal(
    model_primitive.get_B(),
    [0.0262431940540739, 0.0, 0.0, 0.00927837023781507, 0.02783511071344521,
     0.0, 0.01607060866333063, 0.01607060866333063, 0.03214121732666125])
  assert approx_equal(
    model_primitive.get_A(), (0, 1/44, 1/44, 1/44, 0, 1/44, 1/44, 1/44, 0))
  assert approx_equal(
    model_primitive.get_unit_cell().parameters(),
    [38.1051177665153, 38.1051177665153, 38.1051177665153,
     109.47122063449069, 109.47122063449069, 109.47122063449069])
  assert model_ref != model_primitive
  model_ref_recycled = model_primitive.change_basis(cb_op_to_reference)
  assert approx_equal(model_ref.get_U(), model_ref_recycled.get_U())
  assert approx_equal(model_ref.get_B(), model_ref_recycled.get_B())
  assert approx_equal(model_ref.get_A(), model_ref_recycled.get_A())
  assert approx_equal(model_ref.get_unit_cell().parameters(),
                      model_ref_recycled.get_unit_cell().parameters())
  assert model_ref == model_ref_recycled
  #
  uc = uctbx.unit_cell((58.2567, 58.1264, 39.7093, 46.9077, 46.8612, 62.1055))
  sg = sgtbx.space_group_info(symbol="P1").group()
  cs = crystal.symmetry(unit_cell=uc, space_group=sg)
  cb_op_to_minimum = cs.change_of_basis_op_to_minimum_cell()
  # the reciprocal matrix
  B = matrix.sqr(uc.fractionalization_matrix()).transpose()
  U = random_rotation()
  direct_matrix = (U * B).inverse()
  model = crystal_model(direct_matrix[:3],
                        direct_matrix[3:6],
                        direct_matrix[6:9],
                        space_group=sg)
  assert uc.is_similar_to(model.get_unit_cell())
  uc_minimum = uc.change_basis(cb_op_to_minimum)
  model_minimum = model.change_basis(cb_op_to_minimum)
  assert uc_minimum.is_similar_to(model_minimum.get_unit_cell())
  assert model_minimum != model
  model_minimum.update(model)
  assert model_minimum == model
  #
  from scitbx.math import euler_angles
  A_static = model.get_A()
  A_as_scan_points = [A_static]
  num_scan_points = 11
  for i in range(num_scan_points-1):
    A_as_scan_points.append(
      A_as_scan_points[-1] * matrix.sqr(euler_angles.xyz_matrix(0.1,0.2,0.3)))
  model.set_A_at_scan_points(A_as_scan_points)
  model_minimum = model.change_basis(cb_op_to_minimum)
  assert model.num_scan_points == model_minimum.num_scan_points == num_scan_points
  M = matrix.sqr(cb_op_to_minimum.c_inv().r().transpose().as_double())
  M_inv = M.inverse()
  for i in range(num_scan_points):
    A_orig = model.get_A_at_scan_point(i)
    A_min = model_minimum.get_A_at_scan_point(i)
    assert A_min == A_orig * M_inv
Ejemplo n.º 10
0
Archivo: tst.py Proyecto: dials/cctbx
def exercise_image_simple():
    expected_sum_image_pixels_iter = iter((200, 156) + (400, 308) * 2 +
                                          (450, 351) + (900, 693) * 2 +
                                          (91, 69) + (181, 139) * 2 +
                                          (160, 124) + (320, 248) * 2 +
                                          (246, 188) + (490, 377) * 2)
    from cctbx import uctbx
    unit_cell = uctbx.unit_cell((11, 12, 13, 85, 95, 105))
    from cctbx.array_family import flex
    miller_indices = flex.miller_index([(-1, 2, 1)])
    from scitbx.math import euler_angles
    crystal_rotation_matrix = euler_angles.xyz_matrix(80, 20, 30)
    import rstbx.simage
    from libtbx.test_utils import approx_equal, show_diff
    dpx, dpy = 4, 5
    for ewald_proximity, star in [(0.1, " "), (0.5, "*")]:
        image_lines = []
        for point_spread in range(1, 5 + 1):
            for spot_intensity_factor in [0.5, 1, None]:
                if (spot_intensity_factor is None):
                    spot_intensity_factors = None
                else:
                    spot_intensity_factors = flex.double(
                        [spot_intensity_factor])
                for apply_proximity_factor in [False, True]:
                    if (star == "*"):
                        expected_sum_image_pixels = next(
                            expected_sum_image_pixels_iter)
                    for code in range(16):
                        store_miller_index_i_seqs = bool(code & 0x1)
                        store_spots = bool(code & 0x2)
                        store_signals = bool(code & 0x4)
                        set_pixels = bool(code & 0x8)
                        image = rstbx.simage.image_simple(
                            apply_proximity_factor=apply_proximity_factor,
                            store_miller_index_i_seqs=store_miller_index_i_seqs,
                            store_spots=store_spots,
                            store_signals=store_signals,
                            set_pixels=set_pixels
                        ).compute(
                            unit_cell=unit_cell,
                            miller_indices=miller_indices,
                            spot_intensity_factors=spot_intensity_factors,
                            crystal_rotation_matrix=crystal_rotation_matrix,
                            ewald_radius=0.5,
                            ewald_proximity=ewald_proximity,
                            signal_max=100,
                            detector_distance=5,
                            detector_size=(10, 12),
                            detector_pixels=(dpx, dpy),
                            point_spread=point_spread,
                            gaussian_falloff_scale=4)
                        if (store_signals and image.signals.size() == 1):
                            partialities = rstbx.simage.image_simple(
                                apply_proximity_filter=False,
                                apply_proximity_factor=apply_proximity_factor,
                                store_signals=True
                            ).compute(
                                unit_cell=unit_cell,
                                miller_indices=miller_indices,
                                spot_intensity_factors=None,
                                crystal_rotation_matrix=crystal_rotation_matrix,
                                ewald_radius=0.5,
                                ewald_proximity=ewald_proximity,
                                signal_max=1,
                                detector_distance=5,
                                detector_size=(10, 12),
                                detector_pixels=(dpx, dpy),
                                point_spread=point_spread,
                                gaussian_falloff_scale=4).signals
                            f = 100
                            if (spot_intensity_factor is not None):
                                f *= spot_intensity_factor
                            assert approx_equal(partialities * f,
                                                image.signals)
                        if (store_miller_index_i_seqs and star == "*"):
                            assert image.miller_index_i_seqs.size() == 1
                        else:
                            assert image.miller_index_i_seqs.size() == 0
                        if (store_spots and star == "*"):
                            assert image.spots.size() == 1
                        else:
                            assert image.spots.size() == 0
                        if (store_signals and star == "*"):
                            assert image.signals.size() == 1
                        else:
                            assert image.signals.size() == 0
                        if (not set_pixels):
                            assert image.pixels.size() == 0
                        else:
                            assert image.pixels.size() == 20
                            sum_image_pixels = flex.sum(image.pixels)
                            if (star == "*"):
                                assert sum_image_pixels == expected_sum_image_pixels
                            else:
                                assert sum_image_pixels == 0
            assert image.pixels.all() == (dpx, dpy)
            for i in range(dpx):
                line = []
                for j in range(dpy):
                    if (image.pixels[(i, j)]): c = star
                    else: c = " "
                    line.append(c)
                image_lines.append("|" + "".join(line) + "|")
            image_lines.append("")
        assert not show_diff(
            "\n".join(image_lines), """\
|     |
|     |
|  ** |
|  ** |

|     |
|  ***|
|  ***|
|  ***|

|     |
|  ** |
| *** |
|  ** |

|  *  |
| ****|
| ****|
| ****|

| *** |
|*****|
|*****|
|*****|
""".replace("*", star))
def test_compare_orientation_matrices():
    # try and see if we can get back the original rotation matrix and euler angles
    real_space_a = matrix.col((10, 0, 0))
    real_space_b = matrix.col((0, 10, 10))
    real_space_c = matrix.col((0, 0, 10))
    euler_angles = (1.3, 5.6, 7.8)
    R = matrix.sqr(
        euler.xyz_matrix(euler_angles[0], euler_angles[1], euler_angles[2]))
    crystal_a = Crystal(real_space_a,
                        real_space_b,
                        real_space_c,
                        space_group=sgtbx.space_group("P 1"))
    crystal_b = Crystal(
        R * real_space_a,
        R * real_space_b,
        R * real_space_c,
        space_group=sgtbx.space_group("P 1"),
    )
    assert (matrix.sqr(crystal_b.get_U()) *
            matrix.sqr(crystal_a.get_U()).transpose()).elems == pytest.approx(
                R.elems)
    (
        best_R_ab,
        best_axis,
        best_angle,
        best_cb_op,
    ) = compare_orientation_matrices.difference_rotation_matrix_axis_angle(
        crystal_a, crystal_b)
    best_euler_angles = euler.xyz_angles(best_R_ab)
    assert best_euler_angles == pytest.approx(euler_angles)
    assert best_cb_op.is_identity_op()
    assert best_R_ab.elems == pytest.approx(R.elems)

    # now see if we can deconvolute the original euler angles after applying
    # a change of basis to one of the crystals
    crystal_a = Crystal(real_space_a,
                        real_space_b,
                        real_space_c,
                        space_group=sgtbx.space_group("I 2 3"))
    cb_op = sgtbx.change_of_basis_op("z,x,y")
    crystal_b = Crystal(
        R * real_space_a,
        R * real_space_b,
        R * real_space_c,
        space_group=sgtbx.space_group("I 2 3"),
    ).change_basis(cb_op)
    (
        best_R_ab,
        best_axis,
        best_angle,
        best_cb_op,
    ) = compare_orientation_matrices.difference_rotation_matrix_axis_angle(
        crystal_a, crystal_b)
    best_euler_angles = euler.xyz_angles(best_R_ab)
    assert best_euler_angles == pytest.approx(euler_angles)
    assert best_cb_op.c() == cb_op.inverse().c()
    assert best_R_ab.elems == pytest.approx(R.elems)

    crystal_c = crystal_b.change_basis(sgtbx.change_of_basis_op("-y,-z,x"))
    assert crystal_c != crystal_b

    s = compare_orientation_matrices.rotation_matrix_differences(
        [crystal_a, crystal_b, crystal_c], comparison="pairwise")
    s = "\n".join(s.splitlines()[:-1]).replace("-0.000", "0.000")
    print(s)
    assert (s == """\
Change of basis op: b,c,a
Rotation matrix to transform crystal 1 to crystal 2:
{{0.986, -0.135, 0.098},
 {0.138, 0.990, -0.023},
 {-0.094, 0.036, 0.995}}
Rotation of 9.738 degrees about axis (0.172, 0.565, 0.807)

Change of basis op: -a,-b,c
Rotation matrix to transform crystal 1 to crystal 3:
{{0.986, -0.135, 0.098},
 {0.138, 0.990, -0.023},
 {-0.094, 0.036, 0.995}}
Rotation of 9.738 degrees about axis (0.172, 0.565, 0.807)

Change of basis op: c,-a,-b
Rotation matrix to transform crystal 2 to crystal 3:
{{1.000, 0.000, 0.000},
 {0.000, 1.000, 0.000},
 {0.000, 0.000, 1.000}}""")

    s = compare_orientation_matrices.rotation_matrix_differences(
        [crystal_a, crystal_b, crystal_c], comparison="sequential")
    s = "\n".join(s.splitlines()[:-1]).replace("-0.000", "0.000")
    print(s)
    assert (s == """\
Change of basis op: b,c,a
Rotation matrix to transform crystal 1 to crystal 2:
{{0.986, -0.135, 0.098},
 {0.138, 0.990, -0.023},
 {-0.094, 0.036, 0.995}}
Rotation of 9.738 degrees about axis (0.172, 0.565, 0.807)

Change of basis op: c,-a,-b
Rotation matrix to transform crystal 2 to crystal 3:
{{1.000, 0.000, 0.000},
 {0.000, 1.000, 0.000},
 {0.000, 0.000, 1.000}}""")

    s = compare_orientation_matrices.rotation_matrix_differences(
        (crystal_a, crystal_b), miller_indices=((1, 0, 0), (1, 1, 0)))
    assert (s == """\
Change of basis op: b,c,a
Rotation matrix to transform crystal 1 to crystal 2:
{{0.986, -0.135, 0.098},
 {0.138, 0.990, -0.023},
 {-0.094, 0.036, 0.995}}
Rotation of 9.738 degrees about axis (0.172, 0.565, 0.807)
(1,0,0): 15.26 deg
(1,1,0): 9.12 deg
""")
Ejemplo n.º 12
0
def exercise_image_simple():
  expected_sum_image_pixels_iter = iter(
      (200, 156) + (400, 308)*2
    + (450, 351) + (900, 693)*2
    + ( 91,  69) + (181, 139)*2
    + (160, 124) + (320, 248)*2
    + (246, 188) + (490, 377)*2)
  from cctbx import uctbx
  unit_cell = uctbx.unit_cell((11,12,13,85,95,105))
  from cctbx.array_family import flex
  miller_indices = flex.miller_index([(-1,2,1)])
  from scitbx.math import euler_angles
  crystal_rotation_matrix = euler_angles.xyz_matrix(80,20,30)
  import rstbx.simage
  from libtbx.test_utils import approx_equal, show_diff
  dpx, dpy = 4, 5
  for ewald_proximity,star in [(0.1, " "), (0.5, "*")]:
    image_lines = []
    for point_spread in xrange(1,5+1):
      for spot_intensity_factor in [0.5, 1, None]:
        if (spot_intensity_factor is None):
          spot_intensity_factors = None
        else:
          spot_intensity_factors = flex.double([spot_intensity_factor])
        for apply_proximity_factor in [False, True]:
          if (star == "*"):
            expected_sum_image_pixels = expected_sum_image_pixels_iter.next()
          for code in xrange(16):
            store_miller_index_i_seqs = bool(code & 0x1)
            store_spots = bool(code & 0x2)
            store_signals = bool(code & 0x4)
            set_pixels = bool(code & 0x8)
            image = rstbx.simage.image_simple(
              apply_proximity_factor=apply_proximity_factor,
              store_miller_index_i_seqs=store_miller_index_i_seqs,
              store_spots=store_spots,
              store_signals=store_signals,
              set_pixels=set_pixels).compute(
                unit_cell=unit_cell,
                miller_indices=miller_indices,
                spot_intensity_factors=spot_intensity_factors,
                crystal_rotation_matrix=crystal_rotation_matrix,
                ewald_radius=0.5,
                ewald_proximity=ewald_proximity,
                signal_max=100,
                detector_distance=5,
                detector_size=(10,12),
                detector_pixels=(dpx,dpy),
                point_spread=point_spread,
                gaussian_falloff_scale=4)
            if (store_signals and image.signals.size() == 1):
              partialities = rstbx.simage.image_simple(
                apply_proximity_filter=False,
                apply_proximity_factor=apply_proximity_factor,
                store_signals=True).compute(
                  unit_cell=unit_cell,
                  miller_indices=miller_indices,
                  spot_intensity_factors=None,
                  crystal_rotation_matrix=crystal_rotation_matrix,
                  ewald_radius=0.5,
                  ewald_proximity=ewald_proximity,
                  signal_max=1,
                  detector_distance=5,
                  detector_size=(10,12),
                  detector_pixels=(dpx,dpy),
                  point_spread=point_spread,
                  gaussian_falloff_scale=4).signals
              f = 100
              if (spot_intensity_factor is not None):
                f *= spot_intensity_factor
              assert approx_equal(partialities*f, image.signals)
            if (store_miller_index_i_seqs and star == "*"):
              assert image.miller_index_i_seqs.size() == 1
            else:
              assert image.miller_index_i_seqs.size() == 0
            if (store_spots and star == "*"):
              assert image.spots.size() == 1
            else:
              assert image.spots.size() == 0
            if (store_signals and star == "*"):
              assert image.signals.size() == 1
            else:
              assert image.signals.size() == 0
            if (not set_pixels):
              assert image.pixels.size() == 0
            else:
              assert image.pixels.size() == 20
              sum_image_pixels = flex.sum(image.pixels)
              if (star == "*"):
                assert sum_image_pixels == expected_sum_image_pixels
              else:
                assert sum_image_pixels == 0
      assert image.pixels.all() == (dpx,dpy)
      for i in xrange(dpx):
        line = []
        for j in xrange(dpy):
          if (image.pixels[(i,j)]): c = star
          else: c = " "
          line.append(c)
        image_lines.append("|"+"".join(line)+"|")
      image_lines.append("")
    assert not show_diff("\n".join(image_lines), """\
|     |
|     |
|  ** |
|  ** |

|     |
|  ***|
|  ***|
|  ***|

|     |
|  ** |
| *** |
|  ** |

|  *  |
| ****|
| ****|
| ****|

| *** |
|*****|
|*****|
|*****|
""".replace("*", star))