def test_add_remove(self): st = gemmi.read_pdb_string(SSBOND_FRAGMENT) st.add_model(st[0]) st.renumber_models() res = st[0].sole_residue('A', gemmi.SeqId('310')) self.assertEqual(len(res), 1) res.remove_atom('SG', ' ') self.assertEqual(len(res), 0) res = st[1].sole_residue('A', gemmi.SeqId('310')) self.assertEqual(len(res), 1) self.assertEqual(len(st[0]['A']), 7) del st[0]['A'][3] self.assertEqual(len(st[0]['A']), 6) self.assertEqual(len(st), 2) self.assertEqual(st[0].name, '1') del st['1'] self.assertEqual(len(st), 1) self.assertEqual(st[0].name, '2') st.renumber_models() self.assertEqual(st[0].name, '1') st.add_model(st[0]) st.add_model(st[0]) st.renumber_models() self.assertEqual(st[0].name, '1') self.assertEqual(st[-1].name, '3') del st[:-1] self.assertEqual(len(st), 1) self.assertEqual(st[0].name, '3') del st[0] self.assertEqual(len(st), 0)
def test_ncs(self): st = gemmi.read_structure(full_path('5cvz_final.pdb')) self.assertEqual(st.resolution, 3.29) first_atom = st[0].sole_residue('A', gemmi.SeqId(17, ' '))[0] ne2 = st[0].sole_residue('A', gemmi.SeqId('63')).sole_atom('NE2') direct_dist = first_atom.pos.dist(ne2.pos) self.assertAlmostEqual(direct_dist, 34.89, delta=1e-2) nearest_image = st.cell.find_nearest_image(first_atom.pos, ne2.pos) nearest_dist = nearest_image.dist() self.assertAlmostEqual(nearest_dist, 8.02, delta=1e-2)
def test_first_conformer(self): model = gemmi.read_structure(full_path('1pfe.cif.gz'))[0] b = model['B'] self.assertEqual([res.name for res in b if not res.is_water()], [ 'DSN', 'ALA', 'N2C', 'NCY', 'MVA', 'DSN', 'ALA', 'NCY', 'N2C', 'MVA', 'QUI', 'QUI' ]) self.assertEqual( [res.name for res in b.first_conformer() if not res.is_water()], [ 'DSN', 'ALA', 'N2C', 'MVA', 'DSN', 'ALA', 'NCY', 'MVA', 'QUI', 'QUI' ]) polymer = b.get_polymer() self.assertEqual([res.name for res in polymer], [ 'DSN', 'ALA', 'N2C', 'NCY', 'MVA', 'DSN', 'ALA', 'NCY', 'N2C', 'MVA' ]) self.assertEqual( [res.name for res in polymer.first_conformer()], ['DSN', 'ALA', 'N2C', 'MVA', 'DSN', 'ALA', 'NCY', 'MVA']) self.assertEqual(len(polymer), 10) self.assertEqual(polymer.length(), 8) # The bond between 4 MVA(v) and 5 DSN(s) is betwenn C and OG # (so it's not a peptide bond as expected). Depending on the heuristic # used to determine gaps, this sequence could have a gap in the middle. self.assertEqual(polymer.make_one_letter_sequence(), 'sAXvsAXv') self.assertEqual([res.name for res in b.get_ligands()], ['QUI', 'QUI']) res1 = model.sole_residue('A', gemmi.SeqId('1')) self.assertEqual([atom.name for atom in res1.first_conformer()], [atom.name for atom in res1 if atom.altloc != 'B'])
def test_pdb_misaligned_element(self): pdb_line = "ATOM 7 S SUB A 7 34.489 -14.293 34.343" \ " 0.29 43.77 S" for line in [pdb_line, pdb_line + '\n', pdb_line + '\r\n']: st = gemmi.read_pdb_string(line) atom = st[0].sole_residue('A', gemmi.SeqId('7')).sole_atom('S') self.assertEqual(atom.element.name, 'S')
def test_ncs(self): st = gemmi.read_structure(full_path('5cvz_final.pdb')) self.assertEqual(st.resolution, 3.29) first_atom = st[0].sole_residue('A', gemmi.SeqId(17, ' '))[0] ne2 = st[0].sole_residue('A', gemmi.SeqId('63')).sole_atom('NE2') direct_dist = first_atom.pos.dist(ne2.pos) self.assertAlmostEqual(direct_dist, 34.89, delta=1e-2) nearest_image = st.cell.find_nearest_image(first_atom.pos, ne2.pos) nearest_dist = nearest_image.dist() self.assertAlmostEqual(nearest_dist, 8.02, delta=1e-2) # test __getitem__(splice) - unrelated to NCS (sometimes we put # unrelated tests together to avoid the same file again) chain = st[0]['A'] res = chain.next_residue(chain[:5][0]) self.assertTrue(res is chain[1])
def test_first_conformer(self): model = gemmi.read_structure(full_path('1pfe.cif.gz'))[0] b = model['B'] self.assertEqual([res.name for res in b if not res.is_water()], [ 'DSN', 'ALA', 'N2C', 'NCY', 'MVA', 'DSN', 'ALA', 'NCY', 'N2C', 'MVA', 'QUI', 'QUI' ]) self.assertEqual( [res.name for res in b.first_conformer() if not res.is_water()], [ 'DSN', 'ALA', 'N2C', 'MVA', 'DSN', 'ALA', 'NCY', 'MVA', 'QUI', 'QUI' ]) polymer = b.get_polymer() self.assertEqual([res.name for res in polymer], [ 'DSN', 'ALA', 'N2C', 'NCY', 'MVA', 'DSN', 'ALA', 'NCY', 'N2C', 'MVA' ]) self.assertEqual( [res.name for res in polymer.first_conformer()], ['DSN', 'ALA', 'N2C', 'MVA', 'DSN', 'ALA', 'NCY', 'MVA']) self.assertEqual(len(polymer), 10) self.assertEqual(polymer.length(), 8) self.assertEqual(polymer.make_one_letter_sequence(), 'sAXvsAXv') self.assertEqual([res.name for res in b.get_ligands()], ['QUI', 'QUI']) res1 = model.sole_residue('A', gemmi.SeqId('1')) self.assertEqual([atom.name for atom in res1.first_conformer()], [atom.name for atom in res1 if atom.altloc != 'B'])
def test_pdb_element_names(self): pdb_line = "HETATM 4154 MG MG A 341 1.384 19.340 11.968" \ " 1.00 67.64 MG" for line in [pdb_line, pdb_line.strip(' MG'), pdb_line[:-2] + ' ']: st = gemmi.read_pdb_string(line) residue = st[0].sole_residue('A', gemmi.SeqId(341, ' ')) mg_atom = residue.sole_atom('MG') self.assertEqual(mg_atom.element.name, 'Mg') self.assertAlmostEqual(mg_atom.b_iso, 67.64, delta=1e-6) mg_atom.element = gemmi.Element('Cu') self.assertEqual(mg_atom.element.name, 'Cu')
def test_1gtv(self): st = gemmi.read_pdb_string(FRAGMENT_1GTV) a1 = st[0].sole_residue('A', gemmi.SeqId(85, ' '))[0] ns = gemmi.NeighborSearch(st[0], st.cell, 5) ns.populate() marks = ns.find_atoms(a1.pos, a1.altloc, 3) self.assertEqual(len(marks), 2) for mark in marks: d = ns.dist(a1.pos, mark.pos()) self.assertAlmostEqual(d, 0, delta=5e-6) marks2 = ns.find_neighbors(a1, 0.1, 3) self.assertEqual(len(marks2), 0)
def test_5a11(self, use_populate=True): st = gemmi.read_pdb_string(FRAGMENT_5A11) a1 = st[0].sole_residue('A', gemmi.SeqId(37, ' '))[0] ns = gemmi.NeighborSearch(st[0], st.cell, 5) if use_populate: ns.populate() else: for n_ch, chain in enumerate(st[0]): for n_res, res in enumerate(chain): for n_atom, atom in enumerate(res): ns.add_atom(atom, n_ch, n_res, n_atom) marks = ns.find_atoms(a1.pos, a1.altloc, 3) m1, m2 = sorted(marks, key=lambda m: ns.dist(a1.pos, m.pos())) self.assertAlmostEqual(ns.dist(a1.pos, m1.pos()), 0, delta=5e-6) self.assertAlmostEqual(ns.dist(a1.pos, m2.pos()), 0.13, delta=5e-3) cra2 = m2.to_cra(st[0]) self.assertEqual(cra2.chain.name, 'B') self.assertEqual(str(cra2.residue.seqid), '37') self.assertEqual(cra2.atom.name, 'SG') marks2 = ns.find_neighbors(a1, 0.1, 3) self.assertEqual(len(marks2), 1) self.assertEqual(marks2[0], m2)