Skip to content

Commit 4243676

Browse files
committed
updated core.py, test_dx.py and test_mrc.py
1 parent fe00479 commit 4243676

File tree

3 files changed

+79
-33
lines changed

3 files changed

+79
-33
lines changed

gridData/core.py

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@ class Grid(object):
212212

213213
#: Default format for exporting with :meth:`export`.
214214
default_format = 'DX'
215+
216+
converter = {
217+
'MRC': mrc.MRC.from_grid,
218+
'VDB': None,
219+
'DX': OpenDX.field.from_grid,
220+
}
215221

216222
def __init__(self, grid=None, edges=None, origin=None, delta=None,
217223
metadata=None, interpolation_spline_order=3,
@@ -598,6 +604,32 @@ def _load_plt(self, filename, **kwargs):
598604
grid, edges = g.histogramdd()
599605
self._load(grid=grid, edges=edges, metadata=self.metadata)
600606

607+
def convert_to(self, format_specifier, tolerance=None, **kwargs):
608+
"""Generates an instance of the native object for a given format
609+
610+
Implemented formats:
611+
612+
DX
613+
:mod:`OpenDX`
614+
MRC
615+
:mod:`mrc` MRC/CCP4 format
616+
617+
Parameters
618+
----------
619+
format_specifier : str
620+
621+
tolerance : float (default is None)
622+
623+
Returns
624+
-------
625+
native object
626+
627+
"""
628+
fmt_upper = format_specifier.upper()
629+
630+
wrapper = self.converter[fmt_upper](self, **kwargs)
631+
return wrapper.native
632+
601633
def export(self, filename, file_format=None, type=None, typequote='"'):
602634
"""export density to file using the given format.
603635
@@ -673,29 +705,8 @@ def _export_dx(self, filename, type=None, typequote='"', **kwargs):
673705
"""
674706
root, ext = os.path.splitext(filename)
675707
filename = root + '.dx'
676-
677-
comments = [
678-
'OpenDX density file written by gridDataFormats.Grid.export()',
679-
'File format: http://opendx.sdsc.edu/docs/html/pages/usrgu068.htm#HDREDF',
680-
'Data are embedded in the header and tied to the grid positions.',
681-
'Data is written in C array order: In grid[x,y,z] the axis z is fastest',
682-
'varying, then y, then finally x, i.e. z is the innermost loop.']
683-
684-
# write metadata in comments section
685-
if self.metadata:
686-
comments.append('Meta data stored with the python Grid object:')
687-
for k in self.metadata:
688-
comments.append(' ' + str(k) + ' = ' + str(self.metadata[k]))
689-
comments.append(
690-
'(Note: the VMD dx-reader chokes on comments below this line)')
691-
692-
components = dict(
693-
positions=OpenDX.gridpositions(1, self.grid.shape, self.origin,
694-
self.delta),
695-
connections=OpenDX.gridconnections(2, self.grid.shape),
696-
data=OpenDX.array(3, self.grid, type=type, typequote=typequote),
697-
)
698-
dx = OpenDX.field('density', components=components, comments=comments)
708+
dx = OpenDX.field.from_grid(self, type=type, typequote=typequote, **kwargs)
709+
699710
if ext == '.gz':
700711
filename = root + ext
701712
dx.write(filename)
@@ -721,16 +732,7 @@ def _export_mrc(self, filename, **kwargs):
721732
722733
.. versionadded:: 1.1.0
723734
"""
724-
# Create MRC object and populate with Grid data
725-
mrc_file = mrc.MRC()
726-
mrc_file.array = self.grid
727-
mrc_file.delta = numpy.diag(self.delta)
728-
mrc_file.origin = self.origin
729-
mrc_file.rank = 3
730-
731-
# Transfer header if it exists (preserves axis ordering and other metadata)
732-
if hasattr(self, '_mrc_header'):
733-
mrc_file.header = self._mrc_header
735+
mrc_file = mrc.MRC.from_grid(self, **kwargs)
734736

735737
# Write to file
736738
mrc_file.write(filename)

gridData/tests/test_dx.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,26 @@ def test_delta_precision(tmpdir):
9090
g.delta, g2.delta,
9191
decimal=7,
9292
err_msg="deltas of written grid do not match original")
93+
94+
def test_dx_from_grid():
95+
data = np.ones((5, 5, 5), dtype=np.float32)
96+
g = Grid(data, origin=[1.0, 2.0, 3.0], delta=[0.5, 0.5, 0.5])
97+
g.metadata['name'] = 'test_density'
98+
g.metadata['author'] = 'test_user'
99+
100+
dx_field = gridData.OpenDX.field.from_grid(g)
101+
102+
assert isinstance(dx_field, gridData.OpenDX.field)
103+
104+
assert any('test_density' and 'test_user' in str(c) for c in dx_field.comments)
105+
# assert any('test_user' in str(c) for c in dx_field.comments)
106+
107+
assert_equal(dx_field.components['data'].array, data)
108+
assert_equal(dx_field.components['positions'].origin, g.origin)
109+
110+
def test_dx_native():
111+
data = np.ones((5, 5, 5))
112+
g = Grid(data, origin=[0, 0, 0], delta=[1, 1, 1])
113+
114+
dx_field = gridData.OpenDX.field.from_grid(g)
115+
assert dx_field.native is dx_field

gridData/tests/test_mrc.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,27 @@ def test_origin(self, grid, ccp4data):
142142

143143
def test_data(self, grid, ccp4data):
144144
assert_allclose(grid.grid, ccp4data.array)
145+
146+
def test_mrc_from_grid(self):
147+
data = np.arange(27, dtype=np.float32).reshape((3, 3, 3))
148+
g = Grid(data, origin=[1.0, 2.0, 3.0], delta=[0.5, 0.5, 0.5])
149+
150+
mrc_obj = mrc.MRC.from_grid(g)
151+
152+
assert isinstance(mrc_obj, mrc.MRC)
153+
154+
assert_equal(mrc_obj.array, data)
155+
assert_allclose(mrc_obj.delta, np.diag(g.delta))
156+
assert_allclose(mrc_obj.origin, g.origin)
157+
assert mrc_obj.rank == 3
158+
159+
def test_mrc_native_property(self):
160+
data = np.ones((3, 3, 3))
161+
g = Grid(data, origin=[0, 0, 0], delta=[1, 1, 1])
162+
163+
mrc_obj = mrc.MRC.from_grid(g)
164+
165+
assert mrc_obj.native is mrc_obj
145166

146167
class TestMRCWrite:
147168
"""Tests for MRC write functionality"""

0 commit comments

Comments
 (0)