Skip to content

Commit

Permalink
Merge pull request #798 from hainm/show-prody
Browse files Browse the repository at this point in the history
ADD: show_prody
  • Loading branch information
hainm authored May 6, 2019
2 parents 9ae5ffd + 54a01df commit 41de278
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
34 changes: 34 additions & 0 deletions nglview/adaptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@
'IODataStructure', 'QCelementalStructure', 'Psi4Structure',
'OpenbabelStructure',
'RosettaStructure',
'ProdyStructure',
'SimpletrajTrajectory',
'ProdyTrajectory',
'MDTrajTrajectory', 'PyTrajTrajectory', 'ParmEdTrajectory',
'MDAnalysisTrajectory', 'HTMDTrajectory', 'ASETrajectory',
'register_backend',
Expand Down Expand Up @@ -207,6 +209,38 @@ def get_structure_string(self):
return _get_structure_string(self._mol.dump_pdb)


@register_backend('prody')
class ProdyStructure(Structure):
def __init__(self, obj):
super(ProdyStructure, self).__init__()
self._obj = obj
self.ext = 'pdb'
self.params = {}

def get_structure_string(self):
import prody
def write(fname):
if isinstance(self._obj, prody.Ensemble):
st = self._obj[0]
else:
st = self._obj
prody.writePDB(fname, st)
return _get_structure_string(write)


@register_backend('prody')
class ProdyTrajectory(Trajectory, ProdyStructure):
def __init__(self, obj):
ProdyStructure.__init__(self, obj)

@property
def n_frames(self):
return self._obj.numConfs()

def get_coordinates(self, index):
return self._obj.getConformation(index).getCoords()


@register_backend('simpletraj')
class SimpletrajTrajectory(Trajectory, Structure):
'''simpletraj adaptor.
Expand Down
24 changes: 24 additions & 0 deletions nglview/show.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
IODataStructure,
QCelementalStructure,
OpenbabelStructure,
ProdyStructure,
ProdyTrajectory,
MDTrajTrajectory,
PyTrajTrajectory, ParmEdTrajectory, MDAnalysisTrajectory,
HTMDTrajectory, ASETrajectory, SchrodingerStructure, SchrodingerTrajectory)
Expand All @@ -32,6 +34,7 @@
'show_rosetta',
'show_asetraj',
'show_simpletraj',
'show_prody',
'show_mdtraj',
'show_pytraj',
'show_mdanalysis',
Expand Down Expand Up @@ -249,6 +252,27 @@ def show_simpletraj(traj, **kwargs):
return NGLWidget(traj, **kwargs)


def show_prody(obj, **kwargs):
"""
Examples
--------
>>> import nglview as nv # doctest: +SKIP
... import prody
... structure = prody.parsePDB('what.pdb')
... ensemble = prody.parseDCD('what.dcd')
... ensemble.setAtoms(structure)
... nv.show_prody(ensemble)
... # nv.show_prody(structure)
"""
import prody
if isinstance(obj, prody.Ensemble):
view_obj = ProdyTrajectory(obj)
else:
view_obj = ProdyStructure(obj)
return NGLWidget(view_obj, **kwargs)


def show_mdtraj(mdtraj_trajectory, **kwargs):
'''Show mdtraj trajectory.
Expand Down
30 changes: 30 additions & 0 deletions nglview/tests/test_show.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,33 @@ def test_show_openbabel():
b.SetOutFormat.assert_called_with('pdb')
assert b.WriteFile.called
assert len(b.WriteFile.call_args_list[0]) == 2


def test_show_prody():
import types
prody = types.ModuleType('prody')
sys.modules['prody'] = prody

class MockEnsemble:
def __getitem__(self, index):
return 0

def numConfs(self):
return 1

def getConformation(self, index):
class Struct:
def getCoords(self):
return

prody.Ensemble = MockEnsemble
prody.writePDB = MagicMock()
ens = MockEnsemble()
nglview.show_prody(ens)
assert prody.writePDB.called
prody.writePDB.reset_mock()
assert not prody.writePDB.called

st = MagicMock()
nglview.show_prody(st)
assert prody.writePDB.called

0 comments on commit 41de278

Please sign in to comment.