Enabled & functioning edrfile reader.

This commit is contained in:
Niels Müller
2016-09-27 15:45:12 +02:00
parent db06925a0d
commit 9cf16bc602
5 changed files with 69 additions and 20 deletions

View File

@ -9,14 +9,15 @@ import os
from .tpxio import TPXReader from .tpxio import TPXReader
from .xtcio import XTCReader from .xtcio import XTCReader
# from .enxio import EDRFile from .enxio import EDRFile
from .errors import FileTypeError from .errors import FileTypeError
from .gromacs.reader import index_filename_for_xtc from .gromacs.reader import index_filename_for_xtc
from .gromacs.xtcindex import index_xtcfile from .gromacs.xtcindex import index_xtcfile
FILE_EXTENSIONS = { FILE_EXTENSIONS = {
'xtc': XTCReader, 'xtc': XTCReader,
'tpr': TPXReader 'tpr': TPXReader,
'edr': EDRFile,
} }

View File

@ -40,6 +40,7 @@ cdef extern from "gromacs/fileio/enxio.h":
gmx_bool do_enx(ener_file_t ef, t_enxframe *fr) gmx_bool do_enx(ener_file_t ef, t_enxframe *fr)
void free_enxframe(t_enxframe *ef)
cdef class EDRFile: cdef class EDRFile:
@ -52,22 +53,45 @@ cdef class EDRFile:
@property @property
def types(self): def types(self):
types = [] types = []
for i in range(self.n_etypes): for i in range(self.n_etypes):
types.append( types.append((self.etypes[i].name.decode(), self.etypes[i].unit.decode()))
return types
)
def read(self):
cdef t_enxframe *frame
cdef np.ndarray[float, ndim=2] energies = np.empty((1,self.n_etypes), np.float32)
def read(self, steps=None):
cdef:
t_enxframe *frame
np.ndarray[float, ndim=2] energies
np.ndarray[float, ndim=1] times
if steps is None:
energies = np.empty((1,self.n_etypes), np.float32)
times = np.empty((1,), np.float32)
else:
energies = np.empty((steps,self.n_etypes), np.float32)
times = np.empty((steps,), np.float32)
snew(frame, 1) snew(frame, 1)
while do_enx(self.efile, frame): i = 0
while True:
cont = do_enx(self.efile, frame)
for j in range(frame.nre):
energies[i, j] = frame.ener[j].e
times[i] = frame.t
if cont:
i += 1
if len(energies) <= i:
energies = np.resize(energies, (len(energies)+1, self.n_etypes)) energies = np.resize(energies, (len(energies)+1, self.n_etypes))
for i in range(frame.nre): times = np.resize(times, (len(times)+1,))
energies[-1, i] = frame.ener[i].e else:
return energies break
free_enxframe(frame)
sfree(frame)
return times, energies
def __init__(self, filename): def __init__(self, filename):

View File

@ -183,6 +183,30 @@ cdef class TPXReader:
types += mol_type * nmol types += mol_type * nmol
return np.array(types) return np.array(types)
@property
def nsteps(self):
return self.input_record.nsteps
@property
def nstxout(self):
return self.input_record.nstxout
@property
def nstvout(self):
return self.input_record.nstvout
@property
def nstfout(self):
return self.input_record.nstfout
@property
def nstxout_compressed(self):
return self.input_record.nstxout_compressed
@property
def nstenergy(self):
return self.input_record.nstenergy
def __cinit__(self, filename): def __cinit__(self, filename):
filename = cstr(filename) filename = cstr(filename)

View File

@ -15,6 +15,7 @@ cdef extern from "gromacs/utility/futil.h":
cdef extern from "gromacs/utility/smalloc.h": cdef extern from "gromacs/utility/smalloc.h":
void snew(void *ptr, int nelem) void snew(void *ptr, int nelem)
void sfree(void *ptr)
cdef inline cstr(instr): cdef inline cstr(instr):

View File

@ -55,13 +55,12 @@ extensions = [
library_dirs=library_dirs, library_dirs=library_dirs,
language='c++' language='c++'
), ),
# Extension('pygmx.enxio', Extension('pygmx.enxio',
# sources=['pygmx/enxio.pyx'], sources=['pygmx/enxio.pyx'],
# include_dirs=include_dirs, include_dirs=include_dirs,
# libraries=['gromacs'], libraries=['gromacs'],
# library_dirs=library_dirs, library_dirs=library_dirs,
# runtime_library_dirs=library_dirs, language='c++'),
# language='c++'),
# Extension('pygmx.tngio', # Extension('pygmx.tngio',
# sources=['pygmx/tngio.pyx'], # sources=['pygmx/tngio.pyx'],