Skip to content

Commit eda28be

Browse files
committed
fix dcd, trr and netcdf writers
1 parent c83d8b4 commit eda28be

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

moleculekit/readers.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2887,14 +2887,15 @@ def NETCDFread(
28872887
"variables in the file were %s" % _handle.variables.keys()
28882888
)
28892889

2890+
time = None
28902891
step = None
2892+
if "step" in _handle.variables:
2893+
step = _handle.variables["step"][frame_slice]
28912894
if "time" in _handle.variables:
28922895
time = _handle.variables["time"][frame_slice]
2893-
if len(time) > 1:
2896+
if len(time) > 1 and step is None:
28942897
timestep = time[1] - time[0]
28952898
step = time / timestep
2896-
else:
2897-
time = None
28982899

28992900
if "cell_lengths" in _handle.variables:
29002901
cell_lengths = _handle.variables["cell_lengths"][frame_slice].T
@@ -2957,7 +2958,7 @@ def DCDread(filename, frame=None, topoloc=None, stride=None, atom_indices=None):
29572958
istart, nsavc, delta = f.read_header()
29582959
# Timestep conversion factor found in OpenMM
29592960
delta = np.round(delta * 0.04888821, decimals=8)
2960-
steps = np.arange(istart, (nsavc * xyz.shape[0]) + 1, nsavc)
2961+
steps = np.arange(istart, (nsavc * xyz.shape[0]) + istart, nsavc)
29612962
if stride is not None:
29622963
steps = steps[::stride]
29632964

@@ -3004,8 +3005,7 @@ def TRRread(filename, frame=None, topoloc=None, stride=None, atom_indices=None):
30043005
box = np.vstack((a_length, b_length, c_length)) * 10 # nm to Angstroms
30053006
boxangles = np.vstack((alpha, beta, gamma))
30063007

3007-
step = None
3008-
if len(time) > 1:
3008+
if len(time) > 1 and (step is None or len(step) != len(time)):
30093009
timestep = time[1] - time[0]
30103010
step = time / timestep
30113011
time *= 1000 # ps to fs

moleculekit/writers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,16 @@ def NETCDFwrite(mol, filename):
738738
warn_on_cast=False,
739739
add_newaxis_on_deficient_ndim=True,
740740
)
741+
step = ensure_type(
742+
mol.step,
743+
np.int32,
744+
1,
745+
"step",
746+
length=n_frames,
747+
can_be_none=True,
748+
warn_on_cast=False,
749+
add_newaxis_on_deficient_ndim=True,
750+
)
741751
cell_lengths = ensure_type(
742752
mol.box.T,
743753
np.float64,
@@ -832,6 +842,8 @@ def NETCDFwrite(mol, filename):
832842
# Define coordinates and snapshot times.
833843
frame_times = ncfile.createVariable("time", "f", ("frame",))
834844
setattr(frame_times, "units", "picosecond")
845+
frame_steps = ncfile.createVariable("step", "i", ("frame",))
846+
setattr(frame_steps, "units", "step")
835847

836848
frame_coordinates = ncfile.createVariable(
837849
"coordinates", "f", ("frame", "atom", "spatial")
@@ -852,6 +864,8 @@ def NETCDFwrite(mol, filename):
852864
ncfile.variables["coordinates"][frame_slice, :, :] = coordinates
853865
if time is not None and set_time:
854866
ncfile.variables["time"][frame_slice] = time
867+
if step is not None and set_time:
868+
ncfile.variables["step"][frame_slice] = step
855869
if cell_lengths is not None:
856870
ncfile.variables["cell_lengths"][frame_slice, :] = cell_lengths
857871
if cell_angles is not None:
@@ -866,6 +880,8 @@ def NETCDFwrite(mol, filename):
866880
missing = None
867881
if time is None and "time" in ncfile.variables:
868882
missing = "time"
883+
elif step is None and "step" in ncfile.variables:
884+
missing = "step"
869885
elif cell_angles is None and "cell_angles" in ncfile.variables:
870886
missing = "cell_angles"
871887
elif cell_lengths is None and "cell_lengths" in ncfile.variables:

0 commit comments

Comments
 (0)