def exercise_quick():
  for space_group_symbol in ("P-1",
                             "P2/m",
                             "C2/m",
                             "Pmmm",
                             "Cmmm",
                             "Fmmm",
                             "Immm",
                             "P4/mmm",
                             "I4/mmm",
                             "R-3m",
                             "P6/mmm",
                             "Pm-3m",
                             "Im-3m",
                             "Fm-3m"):
    parent_group_info = sgtbx.space_group_info(space_group_symbol)
    non_centric = sgtbx.space_group()
    for i_ltr in xrange(parent_group_info.group().n_ltr()):
      for i_smx in xrange(parent_group_info.group().n_smx()):
        s = parent_group_info.group()(i_ltr,0,i_smx)
        non_centric.expand_smx(s)
    assert non_centric.f_inv() == 1
    assert non_centric.order_z() * 2 == parent_group_info.group().order_z()
    non_centric_info = sgtbx.space_group_info(group=non_centric)
    unit_cell = non_centric_info.any_compatible_unit_cell(volume=1000)
    crystal_symmetry = crystal.symmetry(
      unit_cell=unit_cell,
      space_group_info=non_centric_info)
    minimum_symmetry = crystal_symmetry.minimum_cell()
    lattice_group = lattice_symmetry.group(
      minimum_symmetry.unit_cell(), max_delta=0.5)
    lattice_group_info = sgtbx.space_group_info(group=lattice_group)
    assert lattice_group_info.group() == minimum_symmetry.space_group()
    subgrs = subgroups.subgroups(lattice_group_info).groups_parent_setting()
    for group in subgrs:
      subsym = crystal.symmetry(
        unit_cell=minimum_symmetry.unit_cell(),
        space_group=group,
        assert_is_compatible_unit_cell=False)
      assert subsym.unit_cell().is_similar_to(minimum_symmetry.unit_cell())
      assert lattice_symmetry.find_max_delta(
        reduced_cell=minimum_symmetry.unit_cell(),
        space_group=group) < 0.6
  minimum_symmetry = crystal.symmetry(
    unit_cell="106.04, 181.78, 110.12, 90, 90, 90",
    space_group_symbol="P 1").minimum_cell()
  for max_delta in xrange(10,100,10):
    lattice_group = lattice_symmetry.group(
      minimum_symmetry.unit_cell(), max_delta=max_delta)
    lattice_group_info = sgtbx.space_group_info(group=lattice_group)
    assert str(lattice_group_info) == "P 4 2 2"
Example #2
0
 def possible_point_group_generators(self):
     lattice_group = lattice_symmetry.group(self.f_in_p1.unit_cell(),
                                            max_delta=1)
     lattice_group.expand_inv(sgtbx.tr_vec((0, 0, 0)))
     rot_parts = set()
     decorated_rot_parts = []
     for op in lattice_group:
         r = op.r()
         if r.is_unit_mx(): continue
         if op.inverse() in rot_parts: continue
         r_info = sgtbx.rot_mx_info(r)
         if r_info.type() < -2: continue
         rot_parts.add(op)
         decorated_rot_parts.append((
             r_info.type() == -1,  # inversion shall come first,
             list(r_info.ev()).count(
                 0),  # axes // to unit cell shall come first
             # note Python 2.5- compatibility
             r_info.type() == -2,  # mirrors preferred.
             r.order(),  # higher order preferred
             op))
     decorated_rot_parts.sort()
     decorated_rot_parts.reverse()
     for item in decorated_rot_parts:
         yield item[-1]
Example #3
0
def run(mtz, mtz_out, fraction, flag_name=None, ccp4=True, use_lattice_symmetry=True, n_shells=20):

    # Open mtz
    miller_arrays = iotbx.mtz.object(mtz).as_miller_arrays()
    print "Opening", mtz
    print " Using information from", miller_arrays[0].info().label_string()
    input_symm = crystal.symmetry(
        unit_cell=miller_arrays[0].unit_cell(),
        space_group_info=miller_arrays[0].space_group().info(),
        assert_is_compatible_unit_cell=False,
        force_compatible_unit_cell=False)

    d_max, d_min = get_best_resolution(miller_arrays, input_symm)
    
    print " d_max, d_min=", d_max, d_min
    print " Symm:", input_symm.space_group_info(), input_symm.unit_cell()
    print


    # Extend flag
    complete_set = make_joined_set(miller_arrays).complete_set()

    if use_lattice_symmetry:
        from cctbx.sgtbx import lattice_symmetry

        print "Lattice symmetry:"
        cb_op_to_niggli = complete_set.change_of_basis_op_to_niggli_cell()
        tmp_ma = complete_set.change_basis( cb_op_to_niggli )
        lattice_group = lattice_symmetry.group(tmp_ma.unit_cell(), max_delta=5.0)
        print "  ", tmp_ma.unit_cell(), lattice_group.laue_group_type()
        print

    new_r_free_array = complete_set.generate_r_free_flags(fraction=fraction,
                                                          max_free=None,
                                                          lattice_symmetry_max_delta=5.0,
                                                          use_lattice_symmetry=use_lattice_symmetry,
                                                          n_shells=n_shells)

    print new_r_free_array.show_r_free_flags_info()

    if ccp4:
        new_r_free_array = new_r_free_array.customized_copy(data=r_free_utils.export_r_free_flags_for_ccp4(flags=new_r_free_array.data(), test_flag_value=True))


    print

    # Write mtz file
    mtz_object = iotbx.mtz.object(mtz).add_crystal("crystal", "project", new_r_free_array.unit_cell()). \
        add_dataset(name="dataset", wavelength=0). \
        add_miller_array(miller_array=new_r_free_array, column_root_label=flag_name).mtz_object()
    #mtz_object.show_summary(out=sys.stdout, prefix="  ")
    mtz_object.write(file_name=mtz_out)

    print
    print "Writing:", mtz_out
    print 
def run(mtz, mtz_out, fraction, flag_name=None, ccp4=True, use_lattice_symmetry=True, n_shells=20):

    # Open mtz
    miller_arrays = iotbx.mtz.object(mtz).as_miller_arrays()
    print "Opening", mtz
    print " Using information from", miller_arrays[0].info().label_string()
    input_symm = crystal.symmetry(
        unit_cell=miller_arrays[0].unit_cell(),
        space_group_info=miller_arrays[0].space_group().info(),
        assert_is_compatible_unit_cell=False,
        force_compatible_unit_cell=False)

    d_max, d_min = get_best_resolution(miller_arrays, input_symm)
    
    print " d_max, d_min=", d_max, d_min
    print " Symm:", input_symm.space_group_info(), input_symm.unit_cell()
    print


    # Extend flag
    complete_set = make_joined_set(miller_arrays).complete_set()

    if use_lattice_symmetry:
        from cctbx.sgtbx import lattice_symmetry

        print "Lattice symmetry:"
        cb_op_to_niggli = complete_set.change_of_basis_op_to_niggli_cell()
        tmp_ma = complete_set.change_basis( cb_op_to_niggli )
        lattice_group = lattice_symmetry.group(tmp_ma.unit_cell(), max_delta=5.0)
        print "  ", tmp_ma.unit_cell(), lattice_group.laue_group_type()
        print

    new_r_free_array = complete_set.generate_r_free_flags(fraction=fraction,
                                                          max_free=None,
                                                          lattice_symmetry_max_delta=5.0,
                                                          use_lattice_symmetry=use_lattice_symmetry,
                                                          n_shells=n_shells)

    print new_r_free_array.show_r_free_flags_info()

    if ccp4:
        new_r_free_array = new_r_free_array.customized_copy(data=r_free_utils.export_r_free_flags_for_ccp4(flags=new_r_free_array.data(), test_flag_value=True))


    print

    # Write mtz file
    mtz_object = iotbx.mtz.object(mtz).add_crystal("crystal", "project", new_r_free_array.unit_cell()). \
        add_dataset(name="dataset", wavelength=0). \
        add_miller_array(miller_array=new_r_free_array, column_root_label=flag_name).mtz_object()
    #mtz_object.show_summary(out=sys.stdout, prefix="  ")
    mtz_object.write(file_name=mtz_out)

    print
    print "Writing:", mtz_out
    print 
Example #5
0
def exercise_quick():
    for space_group_symbol in ("P-1", "P2/m", "C2/m", "Pmmm", "Cmmm", "Fmmm",
                               "Immm", "P4/mmm", "I4/mmm", "R-3m", "P6/mmm",
                               "Pm-3m", "Im-3m", "Fm-3m"):
        parent_group_info = sgtbx.space_group_info(space_group_symbol)
        non_centric = sgtbx.space_group()
        for i_ltr in range(parent_group_info.group().n_ltr()):
            for i_smx in range(parent_group_info.group().n_smx()):
                s = parent_group_info.group()(i_ltr, 0, i_smx)
                non_centric.expand_smx(s)
        assert non_centric.f_inv() == 1
        assert non_centric.order_z() * 2 == parent_group_info.group().order_z()
        non_centric_info = sgtbx.space_group_info(group=non_centric)
        unit_cell = non_centric_info.any_compatible_unit_cell(volume=1000)
        crystal_symmetry = crystal.symmetry(unit_cell=unit_cell,
                                            space_group_info=non_centric_info)
        minimum_symmetry = crystal_symmetry.minimum_cell()
        lattice_group = lattice_symmetry.group(minimum_symmetry.unit_cell(),
                                               max_delta=0.5)
        lattice_group_info = sgtbx.space_group_info(group=lattice_group)
        assert lattice_group_info.group() == minimum_symmetry.space_group()
        subgrs = subgroups.subgroups(
            lattice_group_info).groups_parent_setting()
        for group in subgrs:
            subsym = crystal.symmetry(unit_cell=minimum_symmetry.unit_cell(),
                                      space_group=group,
                                      assert_is_compatible_unit_cell=False)
            assert subsym.unit_cell().is_similar_to(
                minimum_symmetry.unit_cell())
            assert lattice_symmetry.find_max_delta(
                reduced_cell=minimum_symmetry.unit_cell(),
                space_group=group) < 0.6
    minimum_symmetry = crystal.symmetry(
        unit_cell="106.04, 181.78, 110.12, 90, 90, 90",
        space_group_symbol="P 1").minimum_cell()
    for max_delta in range(10, 100, 10):
        lattice_group = lattice_symmetry.group(minimum_symmetry.unit_cell(),
                                               max_delta=max_delta)
        lattice_group_info = sgtbx.space_group_info(group=lattice_group)
        assert str(lattice_group_info) == "P 4 2 2"
 def possible_point_group_generators(self):
   lattice_group = lattice_symmetry.group(self.f_in_p1.unit_cell(),
                                          max_delta=1)
   lattice_group.expand_inv(sgtbx.tr_vec((0,0,0)))
   rot_parts = set()
   decorated_rot_parts = []
   for op in lattice_group:
     r = op.r()
     if r.is_unit_mx(): continue
     if op.inverse() in rot_parts: continue
     r_info = sgtbx.rot_mx_info(r)
     if r_info.type() < -2: continue
     rot_parts.add(op)
     decorated_rot_parts.append(
       (r_info.type() == -1, # inversion shall come first,
        list(r_info.ev()).count(0), # axes // to unit cell shall come first
                                    # note Python 2.5- compatibility
        r_info.type() == -2, # mirrors preferred.
        r.order(), # higher order preferred
        op))
   decorated_rot_parts.sort()
   decorated_rot_parts.reverse()
   for item in decorated_rot_parts: yield item[-1]
Example #7
0
  def __init__(self,
               xs1,
               xs2,
               relative_length_tolerance=0.05,
               absolute_angle_tolerance=10,
               max_delta=3.0,
               anomalous_flag=True,
               out=None):
    # first we have to go to the niggli setting
    self.cb_op_to_n_1 = xs1.change_of_basis_op_to_niggli_cell()
    self.cb_op_to_n_2 = xs2.change_of_basis_op_to_niggli_cell()

    nxs1 = xs1.change_basis( self.cb_op_to_n_1 )
    nxs2 = xs2.change_basis( self.cb_op_to_n_2 )

    # get the lattice symmetry please
    lat_sym_1 = lattice_symmetry.group( nxs1.unit_cell(), max_delta  )
    lat_sym_2 = lattice_symmetry.group( nxs2.unit_cell(), max_delta )
    # and the intensity symmetry please
    int_sym_1 = nxs1.reflection_intensity_symmetry( anomalous_flag ).space_group()
    int_sym_2 = nxs2.reflection_intensity_symmetry( anomalous_flag ).space_group()

    # Now we have to find a similarity transform that maps the two niggli cells onto each other
    c_inv_rs = nxs1.unit_cell().similarity_transformations(
      other=nxs2.unit_cell(),
      relative_length_tolerance=relative_length_tolerance,
      absolute_angle_tolerance=absolute_angle_tolerance)
    min_bases_msd = None
    self.similarity_cb_op = None

    for c_inv_r in c_inv_rs:
      # make the similarity transform into a cb_op
      c_inv = sgtbx.rt_mx(sgtbx.rot_mx(c_inv_r))
      cb_op = sgtbx.change_of_basis_op(c_inv).inverse()
      # compute the mean square difference for the bases
      bases_msd = nxs1.unit_cell() \
                  .bases_mean_square_difference(
        other=nxs2.unit_cell().change_basis(cb_op=cb_op))

      # and find cb_op correspondiong to the the minimum rmsd
      if (min_bases_msd is None
          or min_bases_msd > bases_msd):
        min_bases_msd = bases_msd
        self.similarity_cb_op = cb_op
    # if nothing is found, do not continue
    self.double_cosets = None
    if (self.similarity_cb_op is not None):
      # make the common lattice group please
      common_lattice_group = lat_sym_1
      for s in lat_sym_2.build_derived_acentric_group().change_basis(
        self.similarity_cb_op ):
        try: common_lattice_group.expand_smx(s)
        except RuntimeError:
          common_lattice_group=None
      if  common_lattice_group is not None:
        common_lattice_group.make_tidy()

        h1 = int_sym_1.build_derived_acentric_group().make_tidy()
        h2 = int_sym_2.build_derived_acentric_group().change_basis( self.similarity_cb_op ).make_tidy()

        # do the double coset decomposition
        self.double_cosets = cosets.double_cosets( common_lattice_group,
                                                   h1,
                                                   h2,
                                                   )