def get_bp_plan_proxies(a1, a2, base_pair, grm, mon_lib_srv, plane_cache): result_plan_p = [] result_parr_p = [] seqs = get_plane_i_seqs_from_residues(a1.parent(), a2.parent(), grm, mon_lib_srv, plane_cache) for i_seqs, j_seqs in seqs: if len(i_seqs) > 2 and len(j_seqs) > 2: if base_pair.restrain_parallelity: if base_pair.parallelity_sigma < 1e-5: raise Sorry( "Sigma for parallelity basepair restraints should be > 1e-5" ) proxy = geometry_restraints.parallelity_proxy( i_seqs=flex.size_t(i_seqs), j_seqs=flex.size_t(j_seqs), weight=1 / (base_pair.parallelity_sigma**2), target_angle_deg=0, slack=0, top_out=False, limit=1, origin_id=origin_ids.get_origin_id('hydrogen bonds')) result_parr_p.append(proxy) if base_pair.restrain_planarity: if base_pair.planarity_sigma < 1e-5: raise Sorry( "Sigma for planarity basepair restraints should be > 1e-5" ) w = 1. / (base_pair.planarity_sigma**2) proxy = geometry_restraints.planarity_proxy( i_seqs=flex.size_t(i_seqs + j_seqs), weights=[w] * len(i_seqs + j_seqs), origin_id=origin_ids.get_origin_id('hydrogen bonds')) result_plan_p.append(proxy) return result_plan_p, result_parr_p
def get_basepair_plane_proxies(pdb_hierarchy, bp_phil_params, grm, mon_lib_srv, plane_cache): assert pdb_hierarchy is not None result_planarities = [] result_parallelities = [] if len(bp_phil_params) < 1: return result_planarities, result_parallelities if grm is None: return result_planarities, result_parallelities selection_cache = pdb_hierarchy.atom_selection_cache() pdb_atoms = pdb_hierarchy.atoms() for base_pair in bp_phil_params: if (base_pair.base1 is not None and base_pair.base2 is not None and base_pair.enabled): selected_atoms_1 = selection_cache.iselection(base_pair.base1) selected_atoms_2 = selection_cache.iselection(base_pair.base2) if len(selected_atoms_1) == 0: raise Sorry( "Selection %s in base_pair retusulted in 0 atoms." % (base_pair.base1)) if len(selected_atoms_2) == 0: raise Sorry( "Selection %s in base_pair retusulted in 0 atoms." % (base_pair.base2)) a1 = pdb_atoms[selected_atoms_1[0]] a2 = pdb_atoms[selected_atoms_2[0]] r1 = a1.parent() r2 = a2.parent() seqs = get_plane_i_seqs_from_residues(r1, r2, grm, mon_lib_srv, plane_cache) for i_seqs, j_seqs in seqs: if len(i_seqs) > 2 and len(j_seqs) > 2: if base_pair.restrain_parallelity: if base_pair.parallelity_sigma < 1e-5: raise Sorry( "Sigma for parallelity basepair restraints should be > 1e-5" ) proxy = geometry_restraints.parallelity_proxy( i_seqs=flex.size_t(i_seqs), j_seqs=flex.size_t(j_seqs), weight=1 / (base_pair.parallelity_sigma**2), target_angle_deg=0, slack=0, top_out=False, limit=1, origin_id=1) result_parallelities.append(proxy) if base_pair.restrain_planarity: if base_pair.planarity_sigma < 1e-5: raise Sorry( "Sigma for planarity basepair restraints should be > 1e-5" ) w = 1. / (base_pair.planarity_sigma**2) proxy = geometry_restraints.planarity_proxy( i_seqs=flex.size_t(i_seqs + j_seqs), weights=[w] * len(i_seqs + j_seqs), origin_id=1) result_planarities.append(proxy) return result_planarities, result_parallelities
def get_basepair_plane_proxies( pdb_hierarchy, bp_phil_params, grm, mon_lib_srv, plane_cache): assert pdb_hierarchy is not None result_planarities = [] result_parallelities = [] if len(bp_phil_params) < 1: return result_planarities, result_parallelities if grm is None: return result_planarities, result_parallelities selection_cache = pdb_hierarchy.atom_selection_cache() pdb_atoms = pdb_hierarchy.atoms() for base_pair in bp_phil_params: if (base_pair.base1 is not None and base_pair.base2 is not None and base_pair.enabled): selected_atoms_1 = selection_cache.iselection(base_pair.base1) selected_atoms_2 = selection_cache.iselection(base_pair.base2) if len(selected_atoms_1) == 0: raise Sorry("Selection %s in base_pair retusulted in 0 atoms." % ( base_pair.base1)) if len(selected_atoms_2) == 0: raise Sorry("Selection %s in base_pair retusulted in 0 atoms." % ( base_pair.base2)) a1 = pdb_atoms[selected_atoms_1[0]] a2 = pdb_atoms[selected_atoms_2[0]] r1 = a1.parent() r2 = a2.parent() seqs = get_plane_i_seqs_from_residues(r1, r2, grm,mon_lib_srv, plane_cache) for i_seqs, j_seqs in seqs: if len(i_seqs) > 2 and len(j_seqs) > 2: if base_pair.restrain_parallelity: if base_pair.parallelity_sigma < 1e-5: raise Sorry("Sigma for parallelity basepair restraints should be > 1e-5") proxy=geometry_restraints.parallelity_proxy( i_seqs=flex.size_t(i_seqs), j_seqs=flex.size_t(j_seqs), weight=1/(base_pair.parallelity_sigma**2), target_angle_deg=0, slack=0, top_out=False, limit=1, origin_id=1) result_parallelities.append(proxy) if base_pair.restrain_planarity: if base_pair.planarity_sigma < 1e-5: raise Sorry("Sigma for planarity basepair restraints should be > 1e-5") w = 1./(base_pair.planarity_sigma**2) proxy=geometry_restraints.planarity_proxy( i_seqs=flex.size_t(i_seqs+j_seqs), weights=[w]*len(i_seqs+j_seqs), origin_id=1) result_planarities.append(proxy) return result_planarities, result_parallelities
def _apply_link_using_proxies( link, atom_group1, atom_group2, bond_params_table, bond_asu_table, geometry_proxy_registries, # distance, rt_mx_ji, origin_id=None, ): assert origin_id ###################################### def _get_restraint_i_seqs( atom_group1, atom_group2, restraint, ): i_seqs = [] keys = restraint.cif_keywords() if "value_dist" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", ] elif "period" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", "atom_4_comp_id", "atom_id_4", ] elif "value_angle" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "volume_sign" in keys: attrs = [ "atom_centre_comp_id", "atom_id_centre", "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "plane_id" in keys: attrs = [ "atom_comp_id", "atom_id", ] else: assert 0 for i, attr in enumerate(attrs): if i % 2: # name name = getattr(restraint, attr) for atom in atoms: # uses names to confirm link if atom.name.strip() == name.strip(): i_seqs.append(atom.i_seq) break else: # name not found, could be hydrogen or ... return None else: # atoms if getattr(restraint, attr) == 1: atoms = atom_group1.atoms() else: atoms = atom_group2.atoms() return i_seqs ############### def _check_i_seqs(atom_group1, atom_group2, i_seqs): atoms = [] for i_seq in i_seqs: for atom in list(atom_group1.atoms()) + list(atom_group2.atoms()): if atom.i_seq == i_seq: atoms.append(atom) break d2 = linking_utils.get_distance2(*atoms) # XXXX needs to be sym aware if d2 > 9: return False return True ############# assert link count = 0 # bond_i_seqs = [] for bond in link.bond_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, bond, ) if i_seqs is None: continue if not _check_i_seqs(atom_group1, atom_group2, i_seqs): # check distances tmp = atom_group2 atom_group2 = atom_group1 atom_group1 = tmp i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, bond, ) if i_seqs is None: continue value = "value_dist" assert origin_id proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=getattr(bond, value), weight=1 / bond.value_dist_esd**2, origin_id=origin_id, ) bond_params_table.update(i_seq=i_seqs[0], j_seq=i_seqs[1], params=proxy) #if rt_mx_ji is None: continue bond_asu_table.add_pair( i_seq=i_seqs[0], j_seq=i_seqs[1], rt_mx_ji=rt_mx_ji, ) count += 1 bond_i_seqs.append(i_seqs) # for angle in link.angle_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, angle, ) if i_seqs is None: continue proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1 / angle.value_angle_esd**2, origin_id=origin_id, ) geometry_proxy_registries.angle.add_if_not_duplicated(proxy=proxy) # for tor in link.tor_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, tor, ) if i_seqs is None: continue proxy = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=tor.value_angle, weight=1 / tor.value_angle_esd**2, periodicity=tor.period, origin_id=origin_id, ) geometry_proxy_registries.dihedral.add_if_not_duplicated(proxy=proxy) # for chir in link.chir_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, chir, ) if i_seqs is None: continue volume_ideal = 2.4 if chir.volume_sign[:4].lower() == "nega": volume_ideal = -2.4 elif chir.volume_sign[:4].lower() == "zero": volume_ideal = 0. both_signs = False if chir.volume_sign == 'both': both_signs = True proxy = geometry_restraints.chirality_proxy( i_seqs=i_seqs, volume_ideal=volume_ideal, both_signs=both_signs, weight=25., origin_id=origin_id, ) geometry_proxy_registries.chirality.add_if_not_duplicated(proxy=proxy) # planes = {} weights = {} for plane in link.plane_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, plane, ) if i_seqs is None: continue planes.setdefault(plane.plane_id, []) planes[plane.plane_id] += i_seqs weights.setdefault(plane.plane_id, []) weights[plane.plane_id].append(1 / plane.dist_esd**2) if planes: for plane_id in planes: if len(planes[plane_id]) < 4: continue proxy = geometry_restraints.planarity_proxy( i_seqs=planes[plane_id], weights=weights[plane_id], origin_id=origin_id, ) geometry_proxy_registries.planarity.add_if_not_duplicated( proxy=proxy) return count, bond_i_seqs
def _apply_link_using_proxies(link, atom_group1, atom_group2, bond_params_table, bond_asu_table, geometry_proxy_registries, # distance, rt_mx_ji, ): ###################################### def _get_restraint_i_seqs(atom_group1, atom_group2, restraint, ): i_seqs = [] keys = restraint.cif_keywords() if "value_dist" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", ] elif "period" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", "atom_4_comp_id", "atom_id_4", ] elif "value_angle" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "volume_sign" in keys: attrs = [ "atom_centre_comp_id", "atom_id_centre", "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "plane_id" in keys: attrs = [ "atom_comp_id", "atom_id", ] else: assert 0 for i, attr in enumerate(attrs): if i%2: # name name = getattr(restraint, attr) for atom in atoms: # uses names to confirm link if atom.name.strip()==name.strip(): i_seqs.append(atom.i_seq) break else: # name not found, could be hydrogen or ... return None else: # atoms if getattr(restraint, attr)==1: atoms = atom_group1.atoms() else: atoms = atom_group2.atoms() return i_seqs ############### def _check_i_seqs(atom_group1, atom_group2, i_seqs): atoms = [] for i_seq in i_seqs: for atom in list(atom_group1.atoms())+list(atom_group2.atoms()): if atom.i_seq==i_seq: atoms.append(atom) break d2 = linking_utils.get_distance2(*atoms) # XXXX needs to be sym aware if d2>9: return False return True ############# assert link count = 0 # bond_i_seqs = [] for bond in link.bond_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, bond, ) if i_seqs is None: continue if not _check_i_seqs(atom_group1, atom_group2, i_seqs): # check distances tmp = atom_group2 atom_group2 = atom_group1 atom_group1 = tmp i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, bond, ) if i_seqs is None: continue value = "value_dist" proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=getattr(bond, value), weight=1/bond.value_dist_esd**2) bond_params_table.update(i_seq=i_seqs[0], j_seq=i_seqs[1], params=proxy) #if rt_mx_ji is None: continue bond_asu_table.add_pair( i_seq=i_seqs[0], j_seq=i_seqs[1], rt_mx_ji=rt_mx_ji, ) count+=1 bond_i_seqs.append(i_seqs) # for angle in link.angle_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, angle, ) if i_seqs is None: continue proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1/angle.value_angle_esd**2) geometry_proxy_registries.angle.add_if_not_duplicated(proxy=proxy) # for tor in link.tor_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, tor, ) if i_seqs is None: continue proxy = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=tor.value_angle, weight=1/tor.value_angle_esd**2, periodicity=tor.period, ) geometry_proxy_registries.dihedral.add_if_not_duplicated(proxy=proxy) # for chir in link.chir_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, chir, ) if i_seqs is None: continue volume_ideal = 2.4 if chir.volume_sign[:4].lower()=="nega": volume_ideal = -2.4 elif chir.volume_sign[:4].lower()=="zero": volume_ideal = 0. proxy = geometry_restraints.chirality_proxy( i_seqs=i_seqs, volume_ideal=volume_ideal, both_signs=False, weight=25., ) geometry_proxy_registries.chirality.add_if_not_duplicated(proxy=proxy) # planes = {} weights = {} for plane in link.plane_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, plane, ) if i_seqs is None: continue planes.setdefault(plane.plane_id, []) planes[plane.plane_id]+=i_seqs weights.setdefault(plane.plane_id, []) weights[plane.plane_id].append(1/plane.dist_esd**2) if planes: for plane_id in planes: if len(planes[plane_id])<4: continue proxy = geometry_restraints.planarity_proxy( i_seqs=planes[plane_id], weights=weights[plane_id], ) geometry_proxy_registries.planarity.add_if_not_duplicated(proxy=proxy) return count, bond_i_seqs