Files
python-pygmx/pygmx/gromacs/xtcindex.py
2016-06-03 12:34:36 +02:00

64 lines
1.8 KiB
Python

from .reader import XTCReader, index_filename_for_xtc, INDEX_MAGIC
from xdrlib import Packer
import os
import sys
import logging
def index_xtcfile(filename):
"""
Write an index-file for a xtc-file.
The resulting file will have the same name, except for the new extension .xtcindex.
This function has to be called only once for every xtcfile.
Args:
filename (str): Name of the xtc-file
"""
# TODO: Would it be possible, to index files on the fly?
# How long does indexing take?
index_filename = index_filename_for_xtc(filename)
print('Writing index file: {}'.format(index_filename))
packer = Packer()
xtc_stat = os.stat(filename)
c_time = int(xtc_stat.st_ctime)
m_time = int(xtc_stat.st_mtime)
size = xtc_stat.st_size
with XTCReader(filename, load_cache_file=False) as reader, open(index_filename, 'wb') as idx_fd:
packer.pack_hyper(INDEX_MAGIC)
# TODO Maybe store only the hashsum of the file for identification?
packer.pack_hyper(c_time)
packer.pack_hyper(m_time)
packer.pack_hyper(size)
count = 0
try:
while True:
if count % 300 == 0:
print("Frame {}".format(count), end="\r")
position = reader.get_position()
frame = reader.decode_frame()
packer.pack_hyper(position)
packer.pack_float(frame.time)
count += 1
except EOFError:
pass
idx_fd.write(packer.get_buffer())
packer.reset()
def main():
if len(sys.argv) < 2:
print("Usage {} xtc-file [xtc-file]".format(sys.argv[0]))
return -1
for filename in sys.argv[1:]:
index_xtcfile(filename)
if __name__ == '__main__':
sys.exit(main())