def make_o_si_o_sym_table(si_o_structure, si_o_bond_sym_table): scatterers = si_o_structure.scatterers() si_o_full_sym_table = si_o_bond_sym_table.full_connectivity( site_symmetry_table=si_o_structure.site_symmetry_table()) o_si_o_sym_table = crystal.pair_sym_table(si_o_full_sym_table.size()) for i_seq,pair_sym_dict in enumerate(si_o_full_sym_table): if (scatterers[i_seq].scattering_type != "Si"): continue jr_list = [] for j_seq,sym_ops in pair_sym_dict.items(): if (scatterers[j_seq].scattering_type != "O"): continue for rt_mx_ji in sym_ops: jr_list.append((j_seq,rt_mx_ji)) for i_jj1 in xrange(0,len(jr_list)-1): jr1 = jr_list[i_jj1] i_seq = jr1[0] rt_mx_jr1_inv = jr1[1].inverse() for i_jj2 in xrange(i_jj1+1,len(jr_list)): jr2 = jr_list[i_jj2] j_seq = jr2[0] rt_mx_jr21 = rt_mx_jr1_inv.multiply(jr2[1]) if (i_seq <= j_seq): o_si_o_sym_table[i_seq].setdefault(j_seq).append(rt_mx_jr21) else: o_si_o_sym_table[j_seq].setdefault(i_seq).append(rt_mx_jr21.inverse()) return o_si_o_sym_table.tidy( site_symmetry_table=si_o_structure.site_symmetry_table())
def __init__(self, si_structure, si_si_sym_table): self.structure = si_structure.deep_copy_scatterers() bond_sym_table = crystal.pair_sym_table(si_si_sym_table.size()) sites_frac = si_structure.sites_frac() i_oxygen = count(1) for i_seq,pair_sym_dict in enumerate(si_si_sym_table): site_frac_i = mx.col(sites_frac[i_seq]) for j_seq,sym_ops in pair_sym_dict.items(): assert j_seq >= i_seq for rt_mx_ji in sym_ops: site_frac_ji = mx.col(rt_mx_ji * sites_frac[j_seq]) bond_center = (site_frac_i + site_frac_ji) / 2 i_seq_o = self.structure.scatterers().size() self.structure.add_scatterer(xray.scatterer( label="O%d"%i_oxygen.next(), site=bond_center)) bond_sym_table[i_seq].setdefault(i_seq_o).append( sgtbx.rt_mx(1,1)) bond_sym_table[j_seq].setdefault(i_seq_o).append( rt_mx_ji.inverse_cancel()) bond_sym_table.append(crystal.pair_sym_dict()) self.bond_sym_table = bond_sym_table.tidy( site_symmetry_table=self.structure.site_symmetry_table())