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
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
def predict_protonation(ag, verbose=False): from cctbx import geometry from mmtbx.monomer_library.linking_utils import get_distance2 from math import sqrt # from cctbx_geometry_restraints_ext import * # from cctbx.array_family import flex """ his1 = -37.35*X1 + 15.57*X2 - 0.64*X3 + 0.76*X4 + 17.30 his2 = -2.16*X1 - 6.08*X2 + 0.56*X3 + 0.42*X4 - 94.46 X1 = ND1-CE1 X2 = CE1-NE2 X3 = -ND1- X4 = -NE2- his1<0 ~> ND1 protonated his1>0 his2<0 ~> NE2 protonated his2>0 ~> doubly protonated """ bonds = { ("ND1", "CE1") : None, ("NE2", "CE1") : None, } if verbose: for atom in ag.atoms(): print atom.quote() for i, tmp_atom in enumerate(bonds): atoms = [] for j in range(2): for atom in ag.atoms(): if atom.name.strip()==tmp_atom[j]: atoms.append(atom) break if len(atoms)==2: d2=get_distance2(*atoms) bonds[tmp_atom]=sqrt(d2) angles = { ("CG", "ND1", "CE1") : None, ("CE1","NE2", "CD2") : None, } for i, tmp_atom in enumerate(angles): atoms = [] for j in range(3): for atom in ag.atoms(): if atom.name.strip()==tmp_atom[j]: atoms.append(atom.xyz) break if len(atoms)==3: angle=geometry.angle((atoms)).angle_model angles[tmp_atom]=angle if None in bonds.values() or None in angles.values(): return None his1 = 17.30 - 0.64*angles[("CG", "ND1", "CE1")] his1 += 0.76*angles[("CE1","NE2", "CD2")] his1 -= 37.35*bonds[("ND1", "CE1")] his1 += 15.57*bonds[("NE2", "CE1")] his2 = -94.46 + 0.56*angles[("CG", "ND1", "CE1")] his2 += 0.42*angles[("CE1","NE2", "CD2")] his2 -= 2.61*bonds[("ND1", "CE1")] his2 -= 6.08*bonds[("NE2", "CE1")] if verbose: print 'his1',his1 print 'his2',his2 return (his1, his2)
def predict_protonation(ag, verbose=False): from cctbx import geometry from mmtbx.monomer_library.linking_utils import get_distance2 from math import sqrt # from cctbx_geometry_restraints_ext import * # from cctbx.array_family import flex """ his1 = -37.35*X1 + 15.57*X2 - 0.64*X3 + 0.76*X4 + 17.30 his2 = -2.16*X1 - 6.08*X2 + 0.56*X3 + 0.42*X4 - 94.46 X1 = ND1-CE1 X2 = CE1-NE2 X3 = -ND1- X4 = -NE2- his1<0 ~> ND1 protonated his1>0 his2<0 ~> NE2 protonated his2>0 ~> doubly protonated """ bonds = { ("ND1", "CE1"): None, ("NE2", "CE1"): None, } if verbose: for atom in ag.atoms(): print atom.quote() for i, tmp_atom in enumerate(bonds): atoms = [] for j in range(2): for atom in ag.atoms(): if atom.name.strip() == tmp_atom[j]: atoms.append(atom) break if len(atoms) == 2: d2 = get_distance2(*atoms) bonds[tmp_atom] = sqrt(d2) angles = { ("CG", "ND1", "CE1"): None, ("CE1", "NE2", "CD2"): None, } for i, tmp_atom in enumerate(angles): atoms = [] for j in range(3): for atom in ag.atoms(): if atom.name.strip() == tmp_atom[j]: atoms.append(atom.xyz) break if len(atoms) == 3: angle = geometry.angle((atoms)).angle_model angles[tmp_atom] = angle if None in bonds.values() or None in angles.values(): return None his1 = 17.30 - 0.64 * angles[("CG", "ND1", "CE1")] his1 += 0.76 * angles[("CE1", "NE2", "CD2")] his1 -= 37.35 * bonds[("ND1", "CE1")] his1 += 15.57 * bonds[("NE2", "CE1")] his2 = -94.46 + 0.56 * angles[("CG", "ND1", "CE1")] his2 += 0.42 * angles[("CE1", "NE2", "CD2")] his2 -= 2.61 * bonds[("ND1", "CE1")] his2 -= 6.08 * bonds[("NE2", "CE1")] if verbose: print 'his1', his1 print 'his2', his2 return (his1, his2)