Skip to content

Commit

Permalink
Merge pull request #181 from Autodesk/cif-singleton-fix
Browse files Browse the repository at this point in the history
Handle mmCIF fields with single entries
  • Loading branch information
avirshup authored Oct 12, 2017
2 parents 5cbeab2 + 27b2856 commit 6900a9c
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 10 deletions.
Binary file added moldesign/_tests/data/2p8w.cif.bz2
Binary file not shown.
7 changes: 7 additions & 0 deletions moldesign/_tests/test_pdb_processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,13 @@ def test_numeric_residue_name_1PYN(request, mol):
assert list(contents.keys())[0] == '941'


def test_single_chain_2p8w():
mol = mdt.read(get_data_path('2p8w.cif.bz2'))
assert mol.num_chains == 3
assert mol.chains['C'].num_residues == 1
assert mol.chains['C'].residues['GNP843'].num_atoms == 32


def test_missing_atoms_3b5x():
mol = mdt.read(get_data_path('3b5x.cif.bz2'))
assert mol.num_chains == 2
Expand Down
29 changes: 19 additions & 10 deletions moldesign/interfaces/parmed_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,23 +261,26 @@ def _reassign_chains(f, mol):
"""
data = mdt.interfaces.biopython_interface.get_mmcif_data(f)
f.seek(0)

try:
newchain_names = set(data['_pdbx_poly_seq_scheme.asym_id']+
data['_pdbx_nonpoly_scheme.asym_id'])
poly_seq_ids = _aslist(data['_pdbx_poly_seq_scheme.asym_id'])
nonpoly_ids = _aslist(data['_pdbx_nonpoly_scheme.asym_id'])
except KeyError:
return mol.copy(name=mol.name)

newchain_names = set(poly_seq_ids + nonpoly_ids)
newchains = {name: mdt.Chain(name) for name in newchain_names}

residue_iterator = itertools.chain(
zip(data['_pdbx_poly_seq_scheme.mon_id'],
data['_pdbx_poly_seq_scheme.pdb_seq_num'],
data['_pdbx_poly_seq_scheme.pdb_strand_id'],
data['_pdbx_poly_seq_scheme.asym_id']),
zip(_aslist(data['_pdbx_poly_seq_scheme.mon_id']),
_aslist(data['_pdbx_poly_seq_scheme.pdb_seq_num']),
_aslist(data['_pdbx_poly_seq_scheme.pdb_strand_id']),
_aslist(data['_pdbx_poly_seq_scheme.asym_id'])),

zip(data['_pdbx_nonpoly_scheme.mon_id'],
data['_pdbx_nonpoly_scheme.pdb_seq_num'],
data['_pdbx_nonpoly_scheme.pdb_strand_id'],
data['_pdbx_nonpoly_scheme.asym_id']))
zip(_aslist(data['_pdbx_nonpoly_scheme.mon_id']),
_aslist(data['_pdbx_nonpoly_scheme.pdb_seq_num']),
_aslist(data['_pdbx_nonpoly_scheme.pdb_strand_id']),
_aslist(data['_pdbx_nonpoly_scheme.asym_id'])))

reschains = {(rname, ridx, rchain): newchains[chainid]
for rname, ridx, rchain, chainid in residue_iterator}
Expand All @@ -290,3 +293,9 @@ def _reassign_chains(f, mol):
return mdt.Molecule(mol.atoms,
name=mol.name, metadata=mol.metadata)


def _aslist(l):
if isinstance(l, list):
return l
else:
return [l]

0 comments on commit 6900a9c

Please sign in to comment.