def __init__(self, *args, **kwds): super(restrained_crystal_structure_builder, self).__init__(*args, **kwds) geom = geometry_restraints adp = adp_restraints self._proxies = {} self._proxies = { 'bond': geometry_restraints.shared_bond_simple_proxy(), 'angle': geometry_restraints.shared_angle_proxy(), 'dihedral': geometry_restraints.shared_dihedral_proxy(), 'planarity': geometry_restraints.shared_planarity_proxy(), 'chirality': geometry_restraints.shared_chirality_proxy(), 'bond_similarity': geometry_restraints.shared_bond_similarity_proxy(), 'adp_similarity': adp_restraints.shared_adp_similarity_proxy(), 'rigid_bond': adp_restraints.shared_rigid_bond_proxy(), 'isotropic_adp': adp_restraints.shared_isotropic_adp_proxy(), 'fixed_u_eq_adp': adp_restraints.shared_fixed_u_eq_adp_proxy(), 'adp_u_eq_similarity': adp_restraints.shared_adp_u_eq_similarity_proxy(), 'adp_volume_similarity': adp_restraints.shared_adp_volume_similarity_proxy(), }
class dihedral_restraint_test_case(geometry_restraints_test_case): manager = restraints.manager( dihedral_proxies=geometry_restraints.shared_dihedral_proxy([ geom.dihedral_proxy((21, 19, 24, 26), 180, 1), geom.dihedral_proxy((5, 26, 28, 7), 60, 1) ])) proxies = manager.dihedral_proxies restraint_t = geom.dihedral
def generate_torsion_restraints( pdb_hierarchy, sites_cart, selection=None, sigma=2.5, limit=15.0, chi_angles_only=False, top_out_potential=False, origin_id=2): torsion_proxies = geometry_restraints.shared_dihedral_proxy() if pdb_hierarchy.atoms().size() < 4: return torsion_proxies assert not pdb_hierarchy.atoms().extract_i_seq().all_eq(0) bool_pdbh_selection = flex.bool(pdb_hierarchy.atoms_size(), False) if (selection is not None): if (isinstance(selection, flex.bool)): bool_pdbh_selection = selection elif (isinstance(selection, flex.size_t)): bool_pdbh_selection.set_selected(selection, True) if selection is None: bool_pdbh_selection = flex.bool(pdb_hierarchy.atoms_size(), True) actual_selection = bool_pdbh_selection.iselection() assert len(sites_cart) == len(actual_selection) weight = 1.0 / (sigma**2) selection_to_sites_map = get_selection_to_sites_map( sites_cart=sites_cart, selection=actual_selection) residue_torsions = collect_residue_torsion_angles( pdb_hierarchy=pdb_hierarchy, atom_selection=bool_pdbh_selection, chi_angles_only=chi_angles_only) for residue_info in residue_torsions: for chi in residue_info.chis: i_seqs = chi.i_seqs sites = [] for i_seq in i_seqs: sites.append(selection_to_sites_map[i_seq]) di = geometry_restraints.dihedral( sites=sites, angle_ideal=0.0, weight=weight) angle_ideal = di.angle_model dp = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=angle_ideal, weight=weight, limit=limit, top_out=top_out_potential, origin_id=origin_id) torsion_proxies.append(dp) return torsion_proxies
def generate_torsion_restraints( pdb_hierarchy, sites_cart, selection=None, sigma=2.5, limit=15.0, chi_angles_only=False, top_out_potential=False, origin_id=None): torsion_proxies = geometry_restraints.shared_dihedral_proxy() if pdb_hierarchy.atoms_size() < 4: return torsion_proxies assert not pdb_hierarchy.atoms().extract_i_seq().all_eq(0) bool_pdbh_selection = flex.bool(pdb_hierarchy.atoms_size(), False) if (selection is not None): if (isinstance(selection, flex.bool)): bool_pdbh_selection = selection elif (isinstance(selection, flex.size_t)): bool_pdbh_selection.set_selected(selection, True) if selection is None: bool_pdbh_selection = flex.bool(pdb_hierarchy.atoms_size(), True) actual_selection = bool_pdbh_selection.iselection() assert len(sites_cart) == len(actual_selection) weight = 1.0 / (sigma**2) selection_to_sites_map = get_selection_to_sites_map( sites_cart=sites_cart, selection=actual_selection) residue_torsions = collect_residue_torsion_angles( pdb_hierarchy=pdb_hierarchy, atom_selection=bool_pdbh_selection, chi_angles_only=chi_angles_only) for residue_info in residue_torsions: for chi in residue_info.chis: i_seqs = chi.i_seqs sites = [] for i_seq in i_seqs: sites.append(selection_to_sites_map[i_seq]) di = geometry_restraints.dihedral( sites=sites, angle_ideal=0.0, weight=weight) angle_ideal = di.angle_model dp = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=angle_ideal, weight=weight, limit=limit, top_out=top_out_potential, origin_id=origin_id) torsion_proxies.append(dp) return torsion_proxies
def read_pdb(): pdbstring = """\ ATOM 0 CA GLY A 3 5.804 -2.100 7.324 1.00 1.36 C ATOM 1 C GLY A 3 4.651 -1.149 7.578 1.00 1.01 C ATOM 2 O GLY A 3 3.598 -1.553 8.071 1.00 1.38 O ATOM 3 N GLY A 3 6.706 -1.622 6.294 1.00 1.11 N ATOM 4 CA PHE A 4 3.819 1.134 7.419 1.00 0.89 C ATOM 5 CB PHE A 4 4.397 2.380 8.094 1.00 1.13 C ATOM 6 C PHE A 4 3.185 1.509 6.084 1.00 0.94 C ATOM 7 N PHE A 4 4.852 0.121 7.242 1.00 0.88 N ATOM 8 O PHE A 4 2.361 2.421 6.010 1.00 1.47 O ATOM 9 CA LEU A 5 3.055 1.059 3.693 1.00 0.87 C ATOM 10 CB LEU A 5 3.965 0.435 2.634 1.00 1.13 C ATOM 11 C LEU A 5 1.634 0.527 3.541 1.00 0.87 C ATOM 12 N LEU A 5 3.576 0.800 5.030 1.00 0.92 N ATOM 13 O LEU A 5 1.246 -0.440 4.196 1.00 1.23 O """ pdb_inp = iotbx.pdb.input(lines=flex.split_lines(pdbstring), source_info=None) sites_cart = pdb_inp.atoms().extract_xyz() # TRANS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 # TRANS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 dihedral_proxies = geometry_restraints.shared_dihedral_proxy() # residue 1 psi = geometry_restraints.dihedral_proxy(i_seqs=[3, 0, 1, 7], angle_ideal=160.0, weight=1 / 30.0**2, periodicity=3) dihedral_proxies.append(psi) # residue 2 phi = geometry_restraints.dihedral_proxy(i_seqs=[1, 7, 4, 6], angle_ideal=60.0, weight=1 / 20.0**2, periodicity=3) dihedral_proxies.append(phi) psi = geometry_restraints.dihedral_proxy(i_seqs=[7, 4, 6, 8], angle_ideal=160.0, weight=1 / 30.0**2, periodicity=3) dihedral_proxies.append(psi) # residue 3 phi = geometry_restraints.dihedral_proxy(i_seqs=[6, 12, 9, 11], angle_ideal=60.0, weight=1 / 20.0**2, periodicity=3) dihedral_proxies.append(phi) angle_proxies = geometry_restraints.shared_angle_proxy() ## Residue 1 # a3 a = geometry_restraints.angle_proxy(i_seqs=[3, 0, 1], angle_ideal=0, weight=1) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy(i_seqs=[2, 1, 7], angle_ideal=0, weight=1) angle_proxies.append(a) ## Residue 2 # a1 a = geometry_restraints.angle_proxy(i_seqs=[1, 7, 4], angle_ideal=0, weight=1) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy(i_seqs=[7, 4, 6], angle_ideal=0, weight=1) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy(i_seqs=[8, 6, 12], angle_ideal=0, weight=1) angle_proxies.append(a) ## Residue 3 # a1 a = geometry_restraints.angle_proxy(i_seqs=[6, 12, 9], angle_ideal=0, weight=1) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy(i_seqs=[12, 9, 11], angle_ideal=0, weight=1) angle_proxies.append(a) # compute dihedral #dihedral = geometry_restraints.dihedral( # sites_cart=sites_cart, # proxy=dihedral_proxies[0]) # Shows real dihedral value #print dihedral.angle_model, dihedral.delta cfd_list = [] cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='GLY', next_residue_name='PHE', conformation_proxies=None, i_phi_proxy=None, # index into dihedral_proxies i_psi_proxy=0, i_dynamic_angles=[None, None, 0, None, None, None, 1], # indexes into angles in angle_proxies i_dynamic_dihedrals=None) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='PHE', next_residue_name='LEU', conformation_proxies=None, i_phi_proxy=1, # index into dihedral_proxies i_psi_proxy=2, i_dynamic_angles=[2, None, 3, None, None, None, 4], # indexes into angles in angle_proxies i_dynamic_dihedrals=None) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='LEU', next_residue_name=None, conformation_proxies=None, i_phi_proxy=3, # index into dihedral_proxies i_psi_proxy=None, i_dynamic_angles=[5, None, 6, None, None, None, None], # indexes into angles in angle_proxies i_dynamic_dihedrals=None) cfd_list.append(cfd) for x in range(1, 4): print print 'Starting cycle', x print for cfd in cfd_list: cfd.update_restraints(sites_cart, dihedral_proxies, angle_proxies)
def exercise_geometry_restraints_as_cif(): quartz = xray.structure(crystal_symmetry=crystal.symmetry( (5.01, 5.01, 5.47, 90, 90, 120), "P6222"), scatterers=flex.xray_scatterer([ xray.scatterer("Si", (1 / 2., 1 / 2., 1 / 3.)), xray.scatterer("O", (0.197, -0.197, 0.83333)) ])) bond_proxies = geometry_restraints.shared_bond_simple_proxy(( geometry_restraints.bond_simple_proxy( i_seqs=[0, 1], rt_mx_ji=sgtbx.rt_mx("x-y,x,z-2/3"), distance_ideal=1.6, weight=3.2), geometry_restraints.bond_simple_proxy(i_seqs=[0, 1], distance_ideal=1.7, weight=1.8), )) dihedral_proxies = geometry_restraints.shared_dihedral_proxy(( geometry_restraints.dihedral_proxy( i_seqs=[1, 0, 1, 0], sym_ops=(sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("1-x,y-x,1/3-z")), angle_ideal=-30, weight=2), geometry_restraints.dihedral_proxy( i_seqs=[1, 0, 1, 0], sym_ops=(sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("x-y,x,1/3+z")), angle_ideal=90, weight=3), )) angle_proxies = geometry_restraints.shared_angle_proxy(( geometry_restraints.angle_proxy(i_seqs=[1, 0, 1], sym_ops=(sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=103, weight=2), geometry_restraints.angle_proxy( i_seqs=[1, 0, 1], sym_ops=(sgtbx.rt_mx("y+1,-x+y+1,z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=110, weight=5), geometry_restraints.angle_proxy(i_seqs=[0, 1, 0], sym_ops=(sgtbx.rt_mx("y,-x+y,z+2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-x+y,-x,z+1/3")), angle_ideal=150, weight=5), )) bond_similarity_proxies = geometry_restraints.shared_bond_similarity_proxy( (geometry_restraints.bond_similarity_proxy( i_seqs=[(0, 1), (0, 1), (0, 1)], sym_ops=(sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("y+1,-x+y+1,z-1/3")), weights=(1, 1, 1)), )) cif_block = iotbx.cif.model.block() iotbx.cif.restraints.add_to_cif_block( cif_block, quartz, bond_proxies=bond_proxies, angle_proxies=angle_proxies, dihedral_proxies=dihedral_proxies, bond_similarity_proxies=bond_similarity_proxies) s = StringIO() cif_block.show(out=s) assert not show_diff( s.getvalue(), """\ loop_ _restr_distance_atom_site_label_1 _restr_distance_atom_site_label_2 _restr_distance_site_symmetry_2 _restr_distance_target _restr_distance_target_weight_param _restr_distance_diff Si O 2_554 1.6000 0.5590 -0.0160 Si O 1 1.7000 0.7454 -2.3838 loop_ _restr_angle_atom_site_label_1 _restr_angle_atom_site_label_2 _restr_angle_atom_site_label_3 _restr_angle_site_symmetry_1 _restr_angle_site_symmetry_2 _restr_angle_site_symmetry_3 _restr_angle_target _restr_angle_target_weight_param _restr_angle_diff O Si O 2_554 1 4_554 103.0000 0.7071 1.6926 O Si O 3_664 1 4_554 110.0000 0.4472 -1.3127 Si O Si 3 1 5 150.0000 0.4472 3.0700 loop_ _restr_torsion_atom_site_label_1 _restr_torsion_atom_site_label_2 _restr_torsion_atom_site_label_3 _restr_torsion_atom_site_label_4 _restr_torsion_site_symmetry_1 _restr_torsion_site_symmetry_2 _restr_torsion_site_symmetry_3 _restr_torsion_site_symmetry_4 _restr_torsion_angle_target _restr_torsion_weight_param _restr_torsion_diff O Si O Si 3_664 1 2_554 7_655 -30.0000 0.7071 6.9078 O Si O Si 3_664 1 4_554 2 90.0000 0.5774 11.7036 loop_ _restr_equal_distance_class_class_id _restr_equal_distance_class_target_weight_param _restr_equal_distance_class_average _restr_equal_distance_class_esd _restr_equal_distance_class_diff_max 1 1.0000 1.6160 0.0000 0.0000 loop_ _restr_equal_distance_atom_site_label_1 _restr_equal_distance_atom_site_label_2 _restr_equal_distance_site_symmetry_2 _restr_equal_distance_class_id Si O 2_554 1 Si O 4_554 1 Si O 3_664 1 """)
def read_pdb(): pdbstring = """\ ATOM 0 CA GLY A 3 5.804 -2.100 7.324 1.00 1.36 C ATOM 1 C GLY A 3 4.651 -1.149 7.578 1.00 1.01 C ATOM 2 O GLY A 3 3.598 -1.553 8.071 1.00 1.38 O ATOM 3 N GLY A 3 6.706 -1.622 6.294 1.00 1.11 N ATOM 4 CA PHE A 4 3.819 1.134 7.419 1.00 0.89 C ATOM 5 CB PHE A 4 4.397 2.380 8.094 1.00 1.13 C ATOM 6 C PHE A 4 3.185 1.509 6.084 1.00 0.94 C ATOM 7 N PHE A 4 4.852 0.121 7.242 1.00 0.88 N ATOM 8 O PHE A 4 2.361 2.421 6.010 1.00 1.47 O ATOM 9 CA LEU A 5 3.055 1.059 3.693 1.00 0.87 C ATOM 10 CB LEU A 5 3.965 0.435 2.634 1.00 1.13 C ATOM 11 C LEU A 5 1.634 0.527 3.541 1.00 0.87 C ATOM 12 N LEU A 5 3.576 0.800 5.030 1.00 0.92 N ATOM 13 O LEU A 5 1.246 -0.440 4.196 1.00 1.23 O """ pdb_inp = iotbx.pdb.input( lines=flex.split_lines(pdbstring), source_info=None) sites_cart = pdb_inp.atoms().extract_xyz() # TRANS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 # TRANS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 dihedral_proxies = geometry_restraints.shared_dihedral_proxy() # residue 1 psi = geometry_restraints.dihedral_proxy( i_seqs=[3, 0, 1, 7], angle_ideal=160.0, weight=1/30.0**2, periodicity=3 ) dihedral_proxies.append(psi) # residue 2 phi = geometry_restraints.dihedral_proxy( i_seqs=[1, 7, 4, 6], angle_ideal=60.0, weight=1/20.0**2, periodicity=3 ) dihedral_proxies.append(phi) psi = geometry_restraints.dihedral_proxy( i_seqs=[7, 4, 6, 8], angle_ideal=160.0, weight=1/30.0**2, periodicity=3 ) dihedral_proxies.append(psi) # residue 3 phi = geometry_restraints.dihedral_proxy( i_seqs=[6, 12, 9, 11], angle_ideal=60.0, weight=1/20.0**2, periodicity=3 ) dihedral_proxies.append(phi) angle_proxies = geometry_restraints.shared_angle_proxy() ## Residue 1 # a3 a = geometry_restraints.angle_proxy( i_seqs=[3, 0, 1], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy( i_seqs=[2, 1, 7], angle_ideal=0, weight=1 ) angle_proxies.append(a) ## Residue 2 # a1 a = geometry_restraints.angle_proxy( i_seqs=[1, 7, 4], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy( i_seqs=[7, 4, 6], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy( i_seqs=[8, 6, 12], angle_ideal=0, weight=1 ) angle_proxies.append(a) ## Residue 3 # a1 a = geometry_restraints.angle_proxy( i_seqs=[6, 12, 9], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy( i_seqs=[12, 9, 11], angle_ideal=0, weight=1 ) angle_proxies.append(a) # compute dihedral #dihedral = geometry_restraints.dihedral( # sites_cart=sites_cart, # proxy=dihedral_proxies[0]) # Shows real dihedral value #print dihedral.angle_model, dihedral.delta cfd_list = [] cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='GLY', next_residue_name='PHE', conformation_proxies=None, i_phi_proxy=None, # index into dihedral_proxies i_psi_proxy=0, i_dynamic_angles=[None, None, 0, None, None, None, 1], # indexes into angles in angle_proxies i_dynamic_dihedrals=None ) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='PHE', next_residue_name='LEU', conformation_proxies=None, i_phi_proxy=1, # index into dihedral_proxies i_psi_proxy=2, i_dynamic_angles=[2, None, 3, None, None, None, 4], # indexes into angles in angle_proxies i_dynamic_dihedrals=None ) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='LEU', next_residue_name=None, conformation_proxies=None, i_phi_proxy=3, # index into dihedral_proxies i_psi_proxy=None, i_dynamic_angles=[5, None, 6, None, None, None, None], # indexes into angles in angle_proxies i_dynamic_dihedrals=None ) cfd_list.append(cfd) for x in range(1, 4): print print 'Starting cycle', x print for cfd in cfd_list: cfd.update_restraints(sites_cart, dihedral_proxies, angle_proxies)
def build_conformation_dependent_angle_proxies( angle_proxy_registry, dihedral_proxy_registry, monomer_mappings, connectivity_i_j, connectivity_j_k, sites_cart ): """ Sets up conformation_dependent_restraints object. Finds atom indexes from registries Looks for C_prev in m_i, most atoms in m_j, N_next in m_k. """ assert len(monomer_mappings) == 3 if monomer_mappings[1] is None: residue_name = None else: residue_name = monomer_mappings[1].residue_name if monomer_mappings[2] is None: next_residue_name = None else: next_residue_name = monomer_mappings[2].residue_name dihedral_i_proxies = [] conformation_proxies = geometry_restraints.shared_dihedral_proxy() for dihedral_number, dihedral_definition in enumerate(conformation_dependent_geometry.angles.dihedral_atoms): i_seqs = [] for residue_index, atom_name in dihedral_definition: mm = monomer_mappings[residue_index] if mm is not None: i_seqs.append(getattr(mm.expected_atoms.get(atom_name), "i_seq", None)) # account for missing atoms if len(i_seqs) == 4 and i_seqs.count(None) == 0: if dihedral_number == 0: # phi/psi: Restraints don't matter, we throw them away. This is just # so we can get eventually get the current value. phi = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=60.0, weight=1 / 20.0 ** 2, periodicity=3 ) conformation_proxies.append(phi) dihedral_i_proxies.append(None) i_phi_proxy = 0 elif dihedral_number == 1: psi = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=160.0, weight=1 / 30.0 ** 2, periodicity=3 ) conformation_proxies.append(psi) dihedral_i_proxies.append(None) i_psi_proxy = 1 elif dihedral_number == 2: # omega dihedral_i_proxy, dihedral_sign = dihedral_proxy_registry.lookup_i_proxy(i_seqs) dihedral_i_proxies.append(dihedral_i_proxy) else: pass # we're on a dihedral with missing length or atoms that are None else: if dihedral_number == 0: i_phi_proxy = None elif dihedral_number == 1: i_psi_proxy = None elif dihedral_number == 2: dihedral_i_proxies.append(None) else: pass angle_i_proxies = [] for angle_definition in conformation_dependent_geometry.angles.angle_atoms: i_seqs = [] for residue_index, atom_name in angle_definition: mm = monomer_mappings[residue_index] if mm is not None: i_seqs.append(getattr(mm.expected_atoms.get(atom_name), "i_seq", None)) # account for missing atoms if len(i_seqs) == 3 and i_seqs.count(None) == 0: # go into angle_proxy_registry angle_i_proxy = angle_proxy_registry.lookup_i_proxy(i_seqs) angle_i_proxies.append(angle_i_proxy) else: # By filling in None for blanks, we can assume the lengths are equal # here and other places angle_atoms/angle_names are used angle_i_proxies.append(None) cfd = conformation_dependent_restraints( residue_name=residue_name, next_residue_name=next_residue_name, conformation_proxies=conformation_proxies, i_phi_proxy=i_phi_proxy, i_psi_proxy=i_psi_proxy, i_dynamic_angles=angle_i_proxies, i_dynamic_dihedrals=dihedral_i_proxies, ) return cfd
def build_conformation_dependent_angle_proxies(angle_proxy_registry, dihedral_proxy_registry, monomer_mappings, connectivity_i_j, connectivity_j_k, sites_cart): """ Sets up conformation_dependent_restraints object. Finds atom indexes from registries Looks for C_prev in m_i, most atoms in m_j, N_next in m_k. """ assert len(monomer_mappings) == 3 if monomer_mappings[1] is None: residue_name = None else: residue_name = monomer_mappings[1].residue_name if monomer_mappings[2] is None: next_residue_name = None else: next_residue_name = monomer_mappings[2].residue_name dihedral_i_proxies = [] conformation_proxies = geometry_restraints.shared_dihedral_proxy() for dihedral_number, dihedral_definition in enumerate( conformation_dependent_geometry.angles.dihedral_atoms): i_seqs = [] for residue_index, atom_name in dihedral_definition: mm = monomer_mappings[residue_index] if mm is not None: i_seqs.append( getattr(mm.expected_atoms.get(atom_name), "i_seq", None)) # account for missing atoms if len(i_seqs) == 4 and i_seqs.count(None) == 0: if dihedral_number == 0: # phi/psi: Restraints don't matter, we throw them away. This is just # so we can get eventually get the current value. phi = geometry_restraints.dihedral_proxy(i_seqs=i_seqs, angle_ideal=60.0, weight=1 / 20.0**2, periodicity=3) conformation_proxies.append(phi) dihedral_i_proxies.append(None) i_phi_proxy = 0 elif dihedral_number == 1: psi = geometry_restraints.dihedral_proxy(i_seqs=i_seqs, angle_ideal=160.0, weight=1 / 30.0**2, periodicity=3) conformation_proxies.append(psi) dihedral_i_proxies.append(None) i_psi_proxy = 1 elif dihedral_number == 2: # omega dihedral_i_proxy, dihedral_sign = dihedral_proxy_registry.lookup_i_proxy( i_seqs) dihedral_i_proxies.append(dihedral_i_proxy) else: pass # we're on a dihedral with missing length or atoms that are None else: if dihedral_number == 0: i_phi_proxy = None elif dihedral_number == 1: i_psi_proxy = None elif dihedral_number == 2: dihedral_i_proxies.append(None) else: pass angle_i_proxies = [] for angle_definition in conformation_dependent_geometry.angles.angle_atoms: i_seqs = [] for residue_index, atom_name in angle_definition: mm = monomer_mappings[residue_index] if mm is not None: i_seqs.append( getattr(mm.expected_atoms.get(atom_name), "i_seq", None)) # account for missing atoms if len(i_seqs) == 3 and i_seqs.count(None) == 0: # go into angle_proxy_registry angle_i_proxy = angle_proxy_registry.lookup_i_proxy(i_seqs) angle_i_proxies.append(angle_i_proxy) else: # By filling in None for blanks, we can assume the lengths are equal # here and other places angle_atoms/angle_names are used angle_i_proxies.append(None) cfd = conformation_dependent_restraints( residue_name=residue_name, next_residue_name=next_residue_name, conformation_proxies=conformation_proxies, i_phi_proxy=i_phi_proxy, i_psi_proxy=i_psi_proxy, i_dynamic_angles=angle_i_proxies, i_dynamic_dihedrals=dihedral_i_proxies) return cfd
def exercise_geometry_restraints_as_cif(): quartz = xray.structure( crystal_symmetry=crystal.symmetry( (5.01,5.01,5.47,90,90,120), "P6222"), scatterers=flex.xray_scatterer([ xray.scatterer("Si", (1/2.,1/2.,1/3.)), xray.scatterer("O", (0.197,-0.197,0.83333))])) bond_proxies = geometry_restraints.shared_bond_simple_proxy(( geometry_restraints.bond_simple_proxy( i_seqs=[0,1], rt_mx_ji=sgtbx.rt_mx("x-y,x,z-2/3"), distance_ideal=1.6, weight=3.2), geometry_restraints.bond_simple_proxy( i_seqs=[0,1], distance_ideal=1.7, weight=1.8), )) dihedral_proxies = geometry_restraints.shared_dihedral_proxy(( geometry_restraints.dihedral_proxy( i_seqs = [1,0,1,0], sym_ops = (sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("1-x,y-x,1/3-z")), angle_ideal=-30, weight=2), geometry_restraints.dihedral_proxy( i_seqs = [1,0,1,0], sym_ops = (sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("x-y,x,1/3+z")), angle_ideal=90, weight=3), )) angle_proxies = geometry_restraints.shared_angle_proxy(( geometry_restraints.angle_proxy( i_seqs = [1,0,1], sym_ops = (sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=103, weight=2), geometry_restraints.angle_proxy( i_seqs = [1,0,1], sym_ops = (sgtbx.rt_mx("y+1,-x+y+1,z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=110, weight=5), geometry_restraints.angle_proxy( i_seqs = [0,1,0], sym_ops = (sgtbx.rt_mx("y,-x+y,z+2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-x+y,-x,z+1/3")), angle_ideal=150, weight=5), )) bond_similarity_proxies = geometry_restraints.shared_bond_similarity_proxy(( geometry_restraints.bond_similarity_proxy( i_seqs=[(0,1),(0,1),(0,1)], sym_ops=(sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("y+1,-x+y+1,z-1/3")), weights=(1,1,1)), )) cif_block = iotbx.cif.model.block() iotbx.cif.restraints.add_to_cif_block( cif_block, quartz, bond_proxies=bond_proxies, angle_proxies=angle_proxies, dihedral_proxies=dihedral_proxies, bond_similarity_proxies=bond_similarity_proxies) s = StringIO() cif_block.show(out=s) assert not show_diff(s.getvalue(), """\ loop_ _restr_distance_atom_site_label_1 _restr_distance_atom_site_label_2 _restr_distance_site_symmetry_2 _restr_distance_target _restr_distance_target_weight_param _restr_distance_diff Si O 2_554 1.6000 0.5590 -0.0160 Si O 1 1.7000 0.7454 -2.3838 loop_ _restr_angle_atom_site_label_1 _restr_angle_atom_site_label_2 _restr_angle_atom_site_label_3 _restr_angle_site_symmetry_1 _restr_angle_site_symmetry_2 _restr_angle_site_symmetry_3 _restr_angle_target _restr_angle_target_weight_param _restr_angle_diff O Si O 2_554 1 4_554 103.0000 0.7071 1.6926 O Si O 3_664 1 4_554 110.0000 0.4472 -1.3127 Si O Si 3 1 5 150.0000 0.4472 3.0700 loop_ _restr_torsion_atom_site_label_1 _restr_torsion_atom_site_label_2 _restr_torsion_atom_site_label_3 _restr_torsion_atom_site_label_4 _restr_torsion_site_symmetry_1 _restr_torsion_site_symmetry_2 _restr_torsion_site_symmetry_3 _restr_torsion_site_symmetry_4 _restr_torsion_angle_target _restr_torsion_weight_param _restr_torsion_diff O Si O Si 3_664 1 2_554 7_655 -30.0000 0.7071 6.9078 O Si O Si 3_664 1 4_554 2 90.0000 0.5774 11.7036 loop_ _restr_equal_distance_class_class_id _restr_equal_distance_class_target_weight_param _restr_equal_distance_class_average _restr_equal_distance_class_esd _restr_equal_distance_class_diff_max 1 1.0000 1.6160 0.0000 0.0000 loop_ _restr_equal_distance_atom_site_label_1 _restr_equal_distance_atom_site_label_2 _restr_equal_distance_site_symmetry_2 _restr_equal_distance_class_id Si O 2_554 1 Si O 4_554 1 Si O 3_664 1 """)