diff --git a/modules/mol/alg/src/pdbize.cc b/modules/mol/alg/src/pdbize.cc index 0eea5cb94b5eb05f39e0d3258a08a1994b5e4ab9..84853c6f0d20502c94d5bfb38f110ff3abf7b46d 100644 --- a/modules/mol/alg/src/pdbize.cc +++ b/modules/mol/alg/src/pdbize.cc @@ -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); diff --git a/modules/mol/alg/tests/test_pdbize.py b/modules/mol/alg/tests/test_pdbize.py index 0048f9b3683c99be13f13380f1c94e4c04d7431a..5a180b95267938eab7b1b2240ef3a5848fb02fbe 100644 --- a/modules/mol/alg/tests/test_pdbize.py +++ b/modules/mol/alg/tests/test_pdbize.py @@ -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