From 025cf3fe6f5a1b037bbfdce5e1dc26e41be854f1 Mon Sep 17 00:00:00 2001 From: Niels Mueller Date: Tue, 8 Oct 2019 15:01:02 +0200 Subject: [PATCH] Add function to write/append xtc files. --- pygmx/__init__.py | 2 +- pygmx/xtcio.pyx | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pygmx/__init__.py b/pygmx/__init__.py index d0cbfe5..d0cd1c1 100644 --- a/pygmx/__init__.py +++ b/pygmx/__init__.py @@ -8,7 +8,7 @@ Trajectories in trr format may be read with `.gromacs.reader.TRRReader`, which i import os from .tpxio import TPXReader -from .xtcio import XTCReader, read_xtcframe +from .xtcio import XTCReader, read_xtcframe, append_xtcfile from .enxio import EDRFile from .errors import FileTypeError from .gromacs.reader import index_filename_for_xtc diff --git a/pygmx/xtcio.pyx b/pygmx/xtcio.pyx index 1694ac1..0624091 100644 --- a/pygmx/xtcio.pyx +++ b/pygmx/xtcio.pyx @@ -1,6 +1,7 @@ # Wrapper for xtcio.h: I/O for xtc files. from cpython.array cimport array +import cython from array import array from xdrlib import Unpacker @@ -28,6 +29,7 @@ cdef extern from "gromacs/fileio/xtcio.h": int natoms, gmx_int64_t *step, real *time, matrix box, rvec *x, real *prec, gmx_bool *_bOK) nogil + int write_xtc(t_fileio *fio, int natoms, gmx_int64_t step, real time, rvec *box, rvec *x, real prec) if sizeof(real) == 4: np_real = np.float32 @@ -264,3 +266,18 @@ cdef class XTCReader: self.fio = open_xtc(self.filename.encode(), b'r') #self.__dict__.update(state) + + +@cython.binding(True) +def append_xtcfile(filename, step, time, box, coords, prec): + if isinstance(filename, str): + filename = filename.encode() + + cdef np.ndarray[real, ndim=2] b = np.asarray(box, dtype=np.float32) + cdef np.ndarray[real, ndim=2] x = np.asarray(coords, dtype=np.float32) + + cdef t_fileio *fio = open_xtc(filename, b'a') + write_xtc(fio, len(coords), step, time, b.data, x.data, prec) + + + \ No newline at end of file