Skip to content

Commit

Permalink
Fix bugs with segnames
Browse files Browse the repository at this point in the history
Writing out was buggy (wrong n to snprintf).  Modify test to evaluate
segnames with obabel and only test bindings if they are present.
  • Loading branch information
dkoes committed Nov 7, 2023
1 parent b334832 commit 754dad6
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 14 deletions.
2 changes: 1 addition & 1 deletion src/formats/pdbformat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ namespace OpenBabel
snprintf(type_name,5,"%s",(char*)res->GetAtomID(atom).c_str());
the_chain = res->GetChain();

snprintf(segname,4,"%s", (char*)res->GetSegName().c_str());
snprintf(segname,5,"%s", (char*)res->GetSegName().c_str());

//two char. elements are on position 13 and 14 one char. start at 14
if (strlen(OBElements::GetSymbol(atom->GetAtomicNum())) == 1)
Expand Down
48 changes: 35 additions & 13 deletions test/testpdbformat.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,47 @@ class TestPDBFormat(BaseTest):

def testSegname(self):
"""Test that different segments are put in different residues"""
mol = pybel.readstring('pdb','''ATOM 102 N CYS A 16 59.916 27.715 54.719 1.00 30.93 A N
ATOM 104 C CYS A 16 61.349 29.663 54.116 1.00 31.27 A C
ATOM 105 O CYS A 16 62.398 30.296 54.175 1.00 31.42 A O
ATOM 106 CB CYS A 16 62.233 27.349 54.045 1.00 30.95 A C
ATOM 107 SG CYS A 16 62.584 25.823 54.921 1.00 31.06 A S
self.pdbin = '''ATOM 102 N CYS A 16 59.916 27.715 54.719 1.00 30.93 AAAA N
ATOM 104 C CYS A 16 61.349 29.663 54.116 1.00 31.27 AAAA C
ATOM 105 O CYS A 16 62.398 30.296 54.175 1.00 31.42 AAAA O
ATOM 106 CB CYS A 16 62.233 27.349 54.045 1.00 30.95 AAAA C
ATOM 107 SG CYS A 16 62.584 25.823 54.921 1.00 31.06 AAAA S
ATOM 2492 N CYS A 16 46.752 17.445 54.719 1.00 30.93 B N
ATOM 2493 CA CYS A 16 45.412 16.879 54.750 1.00 31.03 B C
ATOM 2494 C CYS A 16 45.319 15.497 54.116 1.00 31.27 B C
ATOM 2495 O CYS A 16 44.270 14.864 54.175 1.00 31.42 B O
ATOM 2496 CB CYS A 16 44.435 17.811 54.045 1.00 30.95 B C
ATOM 2497 SG CYS A 16 44.084 19.337 54.921 1.00 31.06 B S
''')
self.assertTrue(len(mol.residues) == 2)
cnts = {'A':0,'B':0}
for a in mol.atoms:
r = a.OBAtom.GetResidue()
cnts[r.GetSegName().strip()] += 1
self.assertEqual(cnts['A'],5)
self.assertEqual(cnts['B'],6)
'''
self.pdbout = '''ATOM 1 N CYS A 16 59.916 27.715 54.719 1.00 0.00 AAAA N
ATOM 2 C CYS A 16 61.349 29.663 54.116 1.00 0.00 AAAA C
ATOM 3 O CYS A 16 62.398 30.296 54.175 1.00 0.00 AAAA O
ATOM 4 CB CYS A 16 62.233 27.349 54.045 1.00 0.00 AAAA C
ATOM 5 SG CYS A 16 62.584 25.823 54.921 1.00 0.00 AAAA S
ATOM 6 N CYS A 16 46.752 17.445 54.719 1.00 0.00 B N
ATOM 7 CA CYS A 16 45.412 16.879 54.750 1.00 0.00 B C
ATOM 8 C CYS A 16 45.319 15.497 54.116 1.00 0.00 B C
ATOM 9 O CYS A 16 44.270 14.864 54.175 1.00 0.00 B O
ATOM 10 CB CYS A 16 44.435 17.811 54.045 1.00 0.00 B C
ATOM 11 SG CYS A 16 44.084 19.337 54.921 1.00 0.00 B S '''

output, error = run_exec(self.pdbin,
"obabel -ipdb -opdb")

#pull out only atoms
outatoms = '\n'.join([line for line in output.split('\n') if line.startswith('ATOM')])
self.assertEqual(outatoms, self.pdbout)

#skip if bindings not present
if pybel:
mol = pybel.readstring('pdb',self.pdbin)
self.assertTrue(len(mol.residues) == 2)
cnts = {'AAAA':0,'B':0}
for a in mol.atoms:
r = a.OBAtom.GetResidue()
cnts[r.GetSegName().strip()] += 1
self.assertEqual(cnts['AAAA'],5)
self.assertEqual(cnts['B'],6)

def testInsertionCodes(self):
"""
Expand Down

0 comments on commit 754dad6

Please sign in to comment.