Skip to content
Snippets Groups Projects
Commit b41a8f63 authored by B13nch3n's avatar B13nch3n
Browse files

fix: SCHWED-4859 No overrun of insertion codes by large ligands

parent 7b801fe8
No related branches found
No related tags found
No related merge requests found
......@@ -134,9 +134,13 @@ void PDBize::Add(EntityView asu, const geom::Mat4List& transforms,
last_rnum_ = 0;
}
char ins_code = chain.GetResidueCount()>1 ? 'A' : '\0';
for (ResidueViewList::const_iterator k = chain.GetResidueList().begin(),
e3 = chain.GetResidueList().end(); k != e3; ++k) {
if (ins_code == 'Z'+1) {
ins_code = 'A';
last_rnum_+=1;
}
ResidueHandle new_res = edi.AppendResidue(ligand_chain_, k->GetName(),
ResNum(last_rnum_+1, ins_code));
transfer_residue_properties(*k, new_res);
......
......@@ -25,6 +25,7 @@ class TestPDBize(unittest.TestCase):
self.assertEqual(residues[i].number.ins_code, chr(ord('A')+i))
self.assertEqual(residues[26].number.num, 2)
self.assertEqual(residues[26].number.ins_code, 'A')
def test_starts_from_last_water_rnum(self):
m = mol.CreateEntity()
e = m.EditXCS(mol.BUFFERED_EDIT)
......@@ -43,8 +44,55 @@ class TestPDBize(unittest.TestCase):
self.assertEqual([r.number for r in residues],
[mol.ResNum(1, 'A'), mol.ResNum(1, 'B')])
def test_large_poly_ligand_inscode(self):
"""Make sure polymeric ligands with 26+ residues get split up and do not
run into an overflow with the insertion codes.
"""
m = mol.CreateEntity()
e = m.EditXCS(mol.BUFFERED_EDIT)
c = e.InsertChain("A");
e.SetChainType(c, mol.CHAINTYPE_OLIGOSACCHARIDE)
for i in range(27):
e.AppendResidue(c, "NAG")
pdbizer = mol.alg.PDBize(min_polymer_size=28)
transformations = geom.Mat4List()
transformations.append(geom.Mat4())
seqs = seq.CreateSequenceList()
pdbizer.Add(m.Select(''), transformations, seqs)
pdbized = pdbizer.Finish()
self.assertEqual([c.name for c in pdbized.chains], ["_"])
residues = pdbized.residues
for i in range(26):
self.assertEqual(residues[i].number.num, 1)
self.assertEqual(residues[i].number.ins_code, chr(ord('A')+i))
self.assertEqual(residues[26].number.num, 2)
self.assertEqual(residues[26].number.ins_code, 'A')
def test_large_poly_ligand_resnum(self):
"""Make sure polymeric ligands with 26 residues do not increase the residue
number by 2. Otherwise the next ligand is off by 1, like NAG26Z, ZN28.
"""
m = mol.CreateEntity()
e = m.EditXCS(mol.BUFFERED_EDIT)
c = e.InsertChain("A");
e.SetChainType(c, mol.CHAINTYPE_OLIGOSACCHARIDE)
for i in range(26):
e.AppendResidue(c, "NAG")
c = e.InsertChain("B");
e.AppendResidue(c, "ZN")
pdbizer = mol.alg.PDBize(min_polymer_size=28)
transformations = geom.Mat4List()
transformations.append(geom.Mat4())
seqs = seq.CreateSequenceList()
pdbizer.Add(m.Select(''), transformations, seqs)
pdbized = pdbizer.Finish()
self.assertEqual([c.name for c in pdbized.chains], ["_"])
residues = pdbized.residues
for i in range(26):
self.assertEqual(residues[i].number.num, 1)
self.assertEqual(residues[i].number.ins_code, chr(ord('A')+i))
self.assertEqual(residues[26].number.num, 2)
self.assertEqual(residues[26].number.ins_code, '\0')
if __name__ == "__main__":
from ost import testutils
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment