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"
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]
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 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]
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, )