def run(structure_file_path): xs = xray.structure.from_shelx(filename=structure_file_path, strictly_shelxl=False) asu_mappings = xs.asu_mappings(buffer_thickness=2) bond_table = crystal.pair_asu_table(asu_mappings) bond_table.add_covalent_pairs(xs.scattering_types()) pair_sym_table = bond_table.extract_pair_sym_table() rigid_bonds = adp_restraints.shared_rigid_bond_proxy() scatterer = xs.scatterers() for sym_pair in pair_sym_table.iterator(): i, j, op = sym_pair.i_seq, sym_pair.j_seq, sym_pair.rt_mx_ji if 'H' in [scatterer[idx].scattering_type for idx in (i, j)]: continue rigid_bonds.append(adp_restraints.rigid_bond_proxy((i, j), 1.)) deltas = rigid_bonds.deltas(sites_cart=xs.sites_cart(), u_cart=xs.scatterers().extract_u_cart( xs.unit_cell())) for bond, delta in zip(rigid_bonds, deltas): i, j = bond.i_seqs sc_1, sc_2 = scatterer[i], scatterer[j] print("%s <-> %s: %.3g" % (sc_1.label, sc_2.label, delta))
def run(structure_file_path): xs = xray.structure.from_shelx(filename=structure_file_path, strictly_shelxl=False) asu_mappings = xs.asu_mappings(buffer_thickness=2) bond_table = crystal.pair_asu_table(asu_mappings) bond_table.add_covalent_pairs(xs.scattering_types()) pair_sym_table = bond_table.extract_pair_sym_table() rigid_bonds = adp_restraints.shared_rigid_bond_proxy() scatterer = xs.scatterers() for sym_pair in pair_sym_table.iterator(): i, j, op = sym_pair.i_seq, sym_pair.j_seq, sym_pair.rt_mx_ji if 'H' in [ scatterer[idx].scattering_type for idx in (i,j) ]: continue rigid_bonds.append(adp_restraints.rigid_bond_proxy((i,j), 1.)) deltas = rigid_bonds.deltas( sites_cart=xs.sites_cart(), u_cart=xs.scatterers().extract_u_cart(xs.unit_cell())) for bond, delta in zip(rigid_bonds, deltas): i, j = bond.i_seqs sc_1, sc_2 = scatterer[i], scatterer[j] print "%s <-> %s: %.3g" % (sc_1.label, sc_2.label, delta)
def __init__(self, xray_structure=None, pair_sym_table=None, proxies=None, i_seqs=None, sigma_12=0.01, sigma_13=None, buffer_thickness=3.5): """ sigma_12 and sigma_13 are the effective standard deviations used for 1,2- and 1,3-distances respectively """ assert [xray_structure, pair_sym_table].count(None) == 1 if i_seqs is not None and len(i_seqs) == 0: i_seqs = None if sigma_13 is None: sigma_13 = sigma_12 if proxies is None: proxies = adp_restraints.shared_rigid_bond_proxy() if pair_sym_table is None: asu_mappings = xray_structure.asu_mappings( buffer_thickness=buffer_thickness) pair_asu_table = crystal.pair_asu_table(asu_mappings=asu_mappings) scattering_types = xray_structure.scatterers( ).extract_scattering_types() pair_asu_table.add_covalent_pairs( scattering_types, exclude_scattering_types=flex.std_string(("H", "D"))) pair_sym_table = pair_asu_table.extract_pair_sym_table() connectivity = pair_sym_table.full_simple_connectivity() ij_seqs = set() for i_seq, j_seq_dict in enumerate(pair_sym_table): if i_seqs is not None and i_seq not in i_seqs: continue for j_seq in connectivity[i_seq]: if i_seqs is not None and j_seq not in i_seqs: continue if i_seq < j_seq: j_sym_ops = pair_sym_table[i_seq][j_seq] else: k_sym_ops = pair_sym_table[j_seq][i_seq] for sym_op in j_sym_ops: if (sym_op.is_unit_mx() and i_seq < j_seq and (i_seq, j_seq) not in ij_seqs): ij_seqs.add((i_seq, j_seq)) weight = 1 / (sigma_12 * sigma_12) proxies.append( adp_restraints.rigid_bond_proxy(i_seqs=(i_seq, j_seq), weight=weight)) break if connectivity[j_seq].size() > 1: for k_seq in connectivity[j_seq]: if i_seqs is not None and k_seq not in i_seqs: continue if k_seq != i_seq: for sym_op in j_sym_ops: if sym_op.is_unit_mx(): if j_seq < k_seq: k_sym_ops = pair_sym_table[j_seq][ k_seq] else: k_sym_ops = pair_sym_table[k_seq][ j_seq] for sym_op in k_sym_ops: if (sym_op.is_unit_mx() and i_seq < k_seq and (i_seq, k_seq) not in ij_seqs): ij_seqs.add((i_seq, k_seq)) weight = 1 / (sigma_13 * sigma_13) proxies.append( adp_restraints. rigid_bond_proxy( i_seqs=(i_seq, k_seq), weight=weight)) break break self.proxies = proxies
def exercise_proxy_show(): sites_cart = flex.vec3_double(( (-3.1739,10.8317,7.5653),(-2.5419,9.7567,6.6306), (-3.3369,8.8794,4.5191),(-3.4640,9.9882,5.3896))) site_labels = ("C1", "C2", "O16", "N8") u_cart = flex.sym_mat3_double(( (0.0153,0.0206,0.0234,0.0035,-0.0052,-0.0051), (0.0185,0.0109,0.0206,0.0005,-0.0010,0.0002), (0.0295,0.0203,0.0218,-0.0010,-0.0003,-0.0044), (0.0159,0.0154,0.0206,-0.0003,0.0004,0.0036))) u_iso = flex.double((-1,-1,-1,-1)) use_u_aniso = flex.bool((True,True,True,True)) # proxies = adp_restraints.shared_adp_similarity_proxy() sio = StringIO() proxies.show_sorted( by_value="residual", u_cart=flex.sym_mat3_double(), u_iso=flex.double(), use_u_aniso=flex.bool(), f=sio) assert not show_diff(sio.getvalue(), """\ ADP similarity restraints: 0 """) proxies = adp_restraints.shared_adp_similarity_proxy([ adp_restraints.adp_similarity_proxy(i_seqs=[0,1],weight=25), adp_restraints.adp_similarity_proxy(i_seqs=[2,3],weight=0.3)]) sio = StringIO() proxies.show_sorted( by_value="residual", u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio, prefix=":") assert not show_diff(sio.getvalue(), """\ :ADP similarity restraints: 2 :Sorted by residual: :scatterers 0 : 1 : delta sigma weight rms_deltas residual : U11 -3.20e-03 2.00e-01 2.50e+01 4.96e-03 5.54e-03 : U22 9.70e-03 2.00e-01 2.50e+01 : U33 2.80e-03 2.00e-01 2.50e+01 : U12 3.00e-03 2.00e-01 2.50e+01 : U13 -4.20e-03 2.00e-01 2.50e+01 : U23 -5.30e-03 2.00e-01 2.50e+01 :scatterers 2 : 3 : delta sigma weight rms_deltas residual : U11 1.36e-02 1.83e+00 3.00e-01 6.15e-03 1.02e-04 : U22 4.90e-03 1.83e+00 3.00e-01 : U33 1.20e-03 1.83e+00 3.00e-01 : U12 -7.00e-04 1.83e+00 3.00e-01 : U13 -7.00e-04 1.83e+00 3.00e-01 : U23 -8.00e-03 1.83e+00 3.00e-01 """) sio = StringIO() proxies.show_sorted( by_value="rms_deltas", site_labels=site_labels, u_cart=u_cart, u_iso=flex.double((0.024,0.031,0.021,0.028)), use_u_aniso=flex.bool((False,False,False,False)), f=sio, prefix="=") assert not show_diff(sio.getvalue(), """\ =ADP similarity restraints: 2 =Sorted by rms_deltas: =scatterers C1 = C2 = delta sigma weight residual = Uiso -7.00e-03 2.00e-01 2.50e+01 1.22e-03 =scatterers O16 = N8 = delta sigma weight residual = Uiso -7.00e-03 1.83e+00 3.00e-01 1.47e-05 """) # proxies = adp_restraints.shared_isotropic_adp_proxy() sio = StringIO() proxies.show_sorted( by_value="residual", u_cart=flex.sym_mat3_double(), u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio) assert not show_diff(sio.getvalue(), """\ Isotropic ADP restraints: 0 """) proxies = adp_restraints.shared_isotropic_adp_proxy([ adp_restraints.isotropic_adp_proxy(i_seqs=(0,),weight=25), adp_restraints.isotropic_adp_proxy(i_seqs=(2,),weight=0.3)]) sio = StringIO() proxies.show_sorted( by_value="residual", site_labels=site_labels, u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio, prefix=" ") assert not show_diff(sio.getvalue(), """\ Isotropic ADP restraints: 2 Sorted by residual: scatterer C1 delta sigma weight rms_deltas residual U11 -4.47e-03 2.00e-01 2.50e+01 4.27e-03 4.11e-03 U22 8.33e-04 2.00e-01 2.50e+01 U33 3.63e-03 2.00e-01 2.50e+01 U12 3.50e-03 2.00e-01 2.50e+01 U13 -5.20e-03 2.00e-01 2.50e+01 U23 -5.10e-03 2.00e-01 2.50e+01 scatterer O16 delta sigma weight rms_deltas residual U11 5.63e-03 1.83e+00 3.00e-01 3.16e-03 2.69e-05 U22 -3.57e-03 1.83e+00 3.00e-01 U33 -2.07e-03 1.83e+00 3.00e-01 U12 -1.00e-03 1.83e+00 3.00e-01 U13 -3.00e-04 1.83e+00 3.00e-01 U23 -4.40e-03 1.83e+00 3.00e-01 """) sio = StringIO() proxies.show_sorted( by_value="rms_deltas", u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio, prefix="$") assert not show_diff(sio.getvalue(), """\ $Isotropic ADP restraints: 2 $Sorted by rms_deltas: $scatterer 0 $ delta sigma weight rms_deltas residual $ U11 -4.47e-03 2.00e-01 2.50e+01 4.27e-03 4.11e-03 $ U22 8.33e-04 2.00e-01 2.50e+01 $ U33 3.63e-03 2.00e-01 2.50e+01 $ U12 3.50e-03 2.00e-01 2.50e+01 $ U13 -5.20e-03 2.00e-01 2.50e+01 $ U23 -5.10e-03 2.00e-01 2.50e+01 $scatterer 2 $ delta sigma weight rms_deltas residual $ U11 5.63e-03 1.83e+00 3.00e-01 3.16e-03 2.69e-05 $ U22 -3.57e-03 1.83e+00 3.00e-01 $ U33 -2.07e-03 1.83e+00 3.00e-01 $ U12 -1.00e-03 1.83e+00 3.00e-01 $ U13 -3.00e-04 1.83e+00 3.00e-01 $ U23 -4.40e-03 1.83e+00 3.00e-01 """) # proxies = adp_restraints.shared_rigid_bond_proxy() sio = StringIO() proxies.show_sorted( by_value="residual", sites_cart=flex.vec3_double(), u_cart=flex.sym_mat3_double(), f=sio) assert not show_diff(sio.getvalue(), """\ Rigid bond restraints: 0 """) proxies = adp_restraints.shared_rigid_bond_proxy([ adp_restraints.rigid_bond_proxy(i_seqs=(0,1),weight=25), adp_restraints.rigid_bond_proxy(i_seqs=(0,2),weight=15), adp_restraints.rigid_bond_proxy(i_seqs=(2,3),weight=25), adp_restraints.rigid_bond_proxy(i_seqs=(3,1),weight=30)]) sio = StringIO() proxies.show_sorted( by_value="residual", sites_cart=sites_cart, site_labels=site_labels, u_cart=u_cart, f=sio, prefix="*") assert not show_diff(sio.getvalue(), """\ *Rigid bond restraints: 4 *Sorted by residual: *scatterers O16 * N8 * delta_z sigma weight residual * -3.96e-03 2.00e-01 2.50e+01 3.92e-04 *scatterers C1 * C2 * delta_z sigma weight residual * 1.08e-03 2.00e-01 2.50e+01 2.89e-05 *scatterers C1 * O16 * delta_z sigma weight residual * 4.03e-04 2.58e-01 1.50e+01 2.44e-06 *scatterers N8 * C2 * delta_z sigma weight residual * -1.54e-04 1.83e-01 3.00e+01 7.16e-07 """) sio = StringIO() proxies.show_sorted( by_value="delta", sites_cart=sites_cart, u_cart=u_cart, f=sio, prefix="||", max_items=2) assert not show_diff(sio.getvalue(), """\ ||Rigid bond restraints: 4 ||Sorted by delta: ||scatterers 2 || 3 || delta_z sigma weight residual || -3.96e-03 2.00e-01 2.50e+01 3.92e-04 ||scatterers 0 || 1 || delta_z sigma weight residual || 1.08e-03 2.00e-01 2.50e+01 2.89e-05 ||... (remaining 2 not shown) """)
def exercise_rigid_bond(): i_seqs = (1,2) weight = 1 p = adp_restraints.rigid_bond_proxy(i_seqs=i_seqs,weight=weight) assert p.i_seqs == i_seqs assert p.weight == weight sites = ((1,2,3),(2,3,4)) u_cart = ((1,2,3,4,5,6), (3,4,5,6,7,8)) expected_gradients = ((-4, -4, -4, -8, -8, -8), (4, 4, 4, 8, 8, 8)) r = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=weight) assert r.weight == weight assert approx_equal(r.delta_z(), -6) assert approx_equal(r.residual(), 36) assert approx_equal(r.gradients(), expected_gradients) sites_cart = flex.vec3_double(((1,2,3),(2,5,4),(3,4,5))) u_cart = flex.sym_mat3_double(((1,2,3,4,5,6), (2,3,3,5,7,7), (3,4,5,3,7,8))) r = adp_restraints.rigid_bond( adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart), proxy=p) assert approx_equal(r.weight, weight) unit_cell = uctbx.unit_cell([15,25,30,90,90,90]) sites_frac = unit_cell.fractionalize(sites_cart=sites_cart) u_star = flex.sym_mat3_double([ adptbx.u_cart_as_u_star(unit_cell, u_cart_i) for u_cart_i in u_cart]) pair = adp_restraints.rigid_bond_pair(sites_frac[1], sites_frac[2], u_star[1], u_star[2], unit_cell) assert approx_equal(pair.delta_z(), abs(r.delta_z())) assert approx_equal(pair.z_12(), r.z_12()) assert approx_equal(pair.z_21(), r.z_21()) # gradients_aniso_cart = flex.sym_mat3_double(sites_cart.size(), (0,0,0,0,0,0)) gradients_iso = flex.double(sites_cart.size(), 0) proxies = adp_restraints.shared_rigid_bond_proxy([p,p]) params = adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart) residuals = adp_restraints.rigid_bond_residuals(params, proxies=proxies) assert approx_equal(residuals, (r.residual(),r.residual())) deltas = adp_restraints.rigid_bond_deltas(params, proxies=proxies) assert approx_equal(deltas, (r.delta_z(),r.delta_z())) residual_sum = adp_restraints.rigid_bond_residual_sum( params=params, proxies=proxies, gradients_aniso_cart=gradients_aniso_cart) assert approx_equal(residual_sum, 2 * r.residual()) for g,e in zip(gradients_aniso_cart[1:3], r.gradients()): assert approx_equal(g, matrix.col(e)*2) fd_grads_aniso, fd_grads_iso = finite_difference_gradients( restraint_type=adp_restraints.rigid_bond, proxy=p, sites_cart=sites_cart, u_cart=u_cart) for g,e in zip(gradients_aniso_cart, fd_grads_aniso): assert approx_equal(g, matrix.col(e)*2) # # check frame invariance of residual # u_cart_1 = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01)) u_cart_2 = matrix.sym(sym_mat3=(0.21,0.32,0.11,0.02,0.02,0.07)) u_cart = (u_cart_1.as_sym_mat3(),u_cart_2.as_sym_mat3()) site_cart_1 = matrix.col((1,2,3)) site_cart_2 = matrix.col((3,1,4.2)) sites = (tuple(site_cart_1),tuple(site_cart_2)) a = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=1) expected_residual = a.residual() gen = flex.mersenne_twister() for i in range(20): R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3)) u_cart_1_rot = R * u_cart_1 * R.transpose() u_cart_2_rot = R * u_cart_2 * R.transpose() u_cart = (u_cart_1_rot.as_sym_mat3(),u_cart_2_rot.as_sym_mat3()) site_cart_1_rot = R * site_cart_1 site_cart_2_rot = R * site_cart_2 sites = (tuple(site_cart_1_rot),tuple(site_cart_2_rot)) a = adp_restraints.rigid_bond( sites=sites, u_cart=u_cart, weight=1) assert approx_equal(a.residual(), expected_residual)
def exercise_proxy_show(): if sys.platform.startswith("win") and sys.version_info[:2] < (2,6): # This appears to be a windows-specific bug with string formatting # for python versions prior to 2.6, where the exponent is printed # with 3 digits rather than 2. print "Skipping exercise_proxy_show()" return sites_cart = flex.vec3_double(( (-3.1739,10.8317,7.5653),(-2.5419,9.7567,6.6306), (-3.3369,8.8794,4.5191),(-3.4640,9.9882,5.3896))) site_labels = ("C1", "C2", "O16", "N8") u_cart = flex.sym_mat3_double(( (0.0153,0.0206,0.0234,0.0035,-0.0052,-0.0051), (0.0185,0.0109,0.0206,0.0005,-0.0010,0.0002), (0.0295,0.0203,0.0218,-0.0010,-0.0003,-0.0044), (0.0159,0.0154,0.0206,-0.0003,0.0004,0.0036))) u_iso = flex.double((-1,-1,-1,-1)) use_u_aniso = flex.bool((True,True,True,True)) # proxies = adp_restraints.shared_adp_similarity_proxy() sio = StringIO() proxies.show_sorted( by_value="residual", u_cart=flex.sym_mat3_double(), u_iso=flex.double(), use_u_aniso=flex.bool(), f=sio) assert not show_diff(sio.getvalue(), """\ ADP similarity restraints: 0 """) proxies = adp_restraints.shared_adp_similarity_proxy([ adp_restraints.adp_similarity_proxy(i_seqs=[0,1],weight=25), adp_restraints.adp_similarity_proxy(i_seqs=[2,3],weight=0.3)]) sio = StringIO() proxies.show_sorted( by_value="residual", u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio, prefix=":") assert not show_diff(sio.getvalue(), """\ :ADP similarity restraints: 2 :Sorted by residual: :scatterers 0 : 1 : delta sigma weight rms_deltas residual : U11 -3.20e-03 2.00e-01 2.50e+01 4.96e-03 5.54e-03 : U22 9.70e-03 2.00e-01 2.50e+01 : U33 2.80e-03 2.00e-01 2.50e+01 : U12 3.00e-03 2.00e-01 2.50e+01 : U13 -4.20e-03 2.00e-01 2.50e+01 : U23 -5.30e-03 2.00e-01 2.50e+01 :scatterers 2 : 3 : delta sigma weight rms_deltas residual : U11 1.36e-02 1.83e+00 3.00e-01 6.15e-03 1.02e-04 : U22 4.90e-03 1.83e+00 3.00e-01 : U33 1.20e-03 1.83e+00 3.00e-01 : U12 -7.00e-04 1.83e+00 3.00e-01 : U13 -7.00e-04 1.83e+00 3.00e-01 : U23 -8.00e-03 1.83e+00 3.00e-01 """) sio = StringIO() proxies.show_sorted( by_value="rms_deltas", site_labels=site_labels, u_cart=u_cart, u_iso=flex.double((0.024,0.031,0.021,0.028)), use_u_aniso=flex.bool((False,False,False,False)), f=sio, prefix="=") assert not show_diff(sio.getvalue(), """\ =ADP similarity restraints: 2 =Sorted by rms_deltas: =scatterers C1 = C2 = delta sigma weight residual = Uiso -7.00e-03 2.00e-01 2.50e+01 1.22e-03 =scatterers O16 = N8 = delta sigma weight residual = Uiso -7.00e-03 1.83e+00 3.00e-01 1.47e-05 """) # proxies = adp_restraints.shared_isotropic_adp_proxy() sio = StringIO() proxies.show_sorted( by_value="residual", u_cart=flex.sym_mat3_double(), u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio) assert not show_diff(sio.getvalue(), """\ Isotropic ADP restraints: 0 """) proxies = adp_restraints.shared_isotropic_adp_proxy([ adp_restraints.isotropic_adp_proxy(i_seqs=(0,),weight=25), adp_restraints.isotropic_adp_proxy(i_seqs=(2,),weight=0.3)]) sio = StringIO() proxies.show_sorted( by_value="residual", site_labels=site_labels, u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio, prefix=" ") assert not show_diff(sio.getvalue(), """\ Isotropic ADP restraints: 2 Sorted by residual: scatterer C1 delta sigma weight rms_deltas residual U11 -4.47e-03 2.00e-01 2.50e+01 4.27e-03 4.11e-03 U22 8.33e-04 2.00e-01 2.50e+01 U33 3.63e-03 2.00e-01 2.50e+01 U12 3.50e-03 2.00e-01 2.50e+01 U13 -5.20e-03 2.00e-01 2.50e+01 U23 -5.10e-03 2.00e-01 2.50e+01 scatterer O16 delta sigma weight rms_deltas residual U11 5.63e-03 1.83e+00 3.00e-01 3.16e-03 2.69e-05 U22 -3.57e-03 1.83e+00 3.00e-01 U33 -2.07e-03 1.83e+00 3.00e-01 U12 -1.00e-03 1.83e+00 3.00e-01 U13 -3.00e-04 1.83e+00 3.00e-01 U23 -4.40e-03 1.83e+00 3.00e-01 """) sio = StringIO() proxies.show_sorted( by_value="rms_deltas", u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso, f=sio, prefix="$") assert not show_diff(sio.getvalue(), """\ $Isotropic ADP restraints: 2 $Sorted by rms_deltas: $scatterer 0 $ delta sigma weight rms_deltas residual $ U11 -4.47e-03 2.00e-01 2.50e+01 4.27e-03 4.11e-03 $ U22 8.33e-04 2.00e-01 2.50e+01 $ U33 3.63e-03 2.00e-01 2.50e+01 $ U12 3.50e-03 2.00e-01 2.50e+01 $ U13 -5.20e-03 2.00e-01 2.50e+01 $ U23 -5.10e-03 2.00e-01 2.50e+01 $scatterer 2 $ delta sigma weight rms_deltas residual $ U11 5.63e-03 1.83e+00 3.00e-01 3.16e-03 2.69e-05 $ U22 -3.57e-03 1.83e+00 3.00e-01 $ U33 -2.07e-03 1.83e+00 3.00e-01 $ U12 -1.00e-03 1.83e+00 3.00e-01 $ U13 -3.00e-04 1.83e+00 3.00e-01 $ U23 -4.40e-03 1.83e+00 3.00e-01 """) # proxies = adp_restraints.shared_rigid_bond_proxy() sio = StringIO() proxies.show_sorted( by_value="residual", sites_cart=flex.vec3_double(), u_cart=flex.sym_mat3_double(), f=sio) assert not show_diff(sio.getvalue(), """\ Rigid bond restraints: 0 """) proxies = adp_restraints.shared_rigid_bond_proxy([ adp_restraints.rigid_bond_proxy(i_seqs=(0,1),weight=25), adp_restraints.rigid_bond_proxy(i_seqs=(0,2),weight=15), adp_restraints.rigid_bond_proxy(i_seqs=(2,3),weight=25), adp_restraints.rigid_bond_proxy(i_seqs=(3,1),weight=30)]) sio = StringIO() proxies.show_sorted( by_value="residual", sites_cart=sites_cart, site_labels=site_labels, u_cart=u_cart, f=sio, prefix="*") assert not show_diff(sio.getvalue(), """\ *Rigid bond restraints: 4 *Sorted by residual: *scatterers O16 * N8 * delta_z sigma weight residual * -3.96e-03 2.00e-01 2.50e+01 3.92e-04 *scatterers C1 * C2 * delta_z sigma weight residual * 1.08e-03 2.00e-01 2.50e+01 2.89e-05 *scatterers C1 * O16 * delta_z sigma weight residual * 4.03e-04 2.58e-01 1.50e+01 2.44e-06 *scatterers N8 * C2 * delta_z sigma weight residual * -1.54e-04 1.83e-01 3.00e+01 7.16e-07 """) sio = StringIO() proxies.show_sorted( by_value="delta", sites_cart=sites_cart, u_cart=u_cart, f=sio, prefix="||", max_items=2) assert not show_diff(sio.getvalue(), """\ ||Rigid bond restraints: 4 ||Sorted by delta: ||scatterers 2 || 3 || delta_z sigma weight residual || -3.96e-03 2.00e-01 2.50e+01 3.92e-04 ||scatterers 0 || 1 || delta_z sigma weight residual || 1.08e-03 2.00e-01 2.50e+01 2.89e-05 ||... (remaining 2 not shown) """)
def __init__( self, xray_structure=None, pair_sym_table=None, proxies=None, i_seqs=None, sigma_12=0.01, sigma_13=None, buffer_thickness=3.5, ): """ sigma_12 and sigma_13 are the effective standard deviations used for 1,2- and 1,3-distances respectively """ assert [xray_structure, pair_sym_table].count(None) == 1 if i_seqs is not None and len(i_seqs) == 0: i_seqs = None if sigma_13 is None: sigma_13 = sigma_12 if proxies is None: proxies = adp_restraints.shared_rigid_bond_proxy() if pair_sym_table is None: asu_mappings = xray_structure.asu_mappings(buffer_thickness=buffer_thickness) pair_asu_table = crystal.pair_asu_table(asu_mappings=asu_mappings) scattering_types = xray_structure.scatterers().extract_scattering_types() pair_asu_table.add_covalent_pairs(scattering_types, exclude_scattering_types=flex.std_string(("H", "D"))) pair_sym_table = pair_asu_table.extract_pair_sym_table() connectivity = pair_sym_table.full_simple_connectivity() ij_seqs = set() for i_seq, j_seq_dict in enumerate(pair_sym_table): if i_seqs is not None and i_seq not in i_seqs: continue for j_seq in connectivity[i_seq]: if i_seqs is not None and j_seq not in i_seqs: continue if i_seq < j_seq: j_sym_ops = pair_sym_table[i_seq][j_seq] else: k_sym_ops = pair_sym_table[j_seq][i_seq] for sym_op in j_sym_ops: if sym_op.is_unit_mx() and i_seq < j_seq and (i_seq, j_seq) not in ij_seqs: ij_seqs.add((i_seq, j_seq)) weight = 1 / (sigma_12 * sigma_12) proxies.append(adp_restraints.rigid_bond_proxy(i_seqs=(i_seq, j_seq), weight=weight)) break if connectivity[j_seq].size() > 1: for k_seq in connectivity[j_seq]: if i_seqs is not None and k_seq not in i_seqs: continue if k_seq != i_seq: for sym_op in j_sym_ops: if sym_op.is_unit_mx(): if j_seq < k_seq: k_sym_ops = pair_sym_table[j_seq][k_seq] else: k_sym_ops = pair_sym_table[k_seq][j_seq] for sym_op in k_sym_ops: if sym_op.is_unit_mx() and i_seq < k_seq and (i_seq, k_seq) not in ij_seqs: ij_seqs.add((i_seq, k_seq)) weight = 1 / (sigma_13 * sigma_13) proxies.append( adp_restraints.rigid_bond_proxy(i_seqs=(i_seq, k_seq), weight=weight) ) break break self.proxies = proxies