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

71 lines
1.9 KiB
Python

import sys
import os
from .logarithmic import is_log_step
from .reader import XTCReader
def next_log_step(step, per_decade):
step += 1
while not is_log_step(step, per_decade): step += 1
return step
def next_lin_step(step, frequency):
return step+frequency
class LogWriter:
current_offset = 0
log_step = 0
fd = None
def __init__(self, file, offset, log_freq):
self.fd = open(file,'wb')
self.offset = offset
self.log_freq = log_freq
def consume_frame(self, step, raw_frame):
if step > self.log_step+self.offset:
raise Exception("Missing frame {}".format(step))
if step == self.log_step+self.offset:
self.fd.write(raw_frame)
self.log_step = next_log_step(self.log_step, self.log_freq)
def main():
filename = sys.argv[1]
reader = XTCReader(filename, load_cache_file=False)
lin_freq = int(sys.argv[2])
log_freq = int(sys.argv[3])
log_restart = int(sys.argv[4])
base,ext = os.path.splitext(filename)
lin_file = base + '.lin' + ext
lin_step = 0
log_writers = []
with open(lin_file,'wb') as lin_fd:
try:
while True:
raw_frame, frame = reader.dump_frame()
if frame.index % log_restart == 0:
print('Starting new log band: {}'.format(frame.index))
log_filename = '{}.{}.log{}'.format(base, len(log_writers), ext)
log_writers.append(LogWriter(log_filename, frame.index, log_freq))
if frame.index > lin_step:
raise Exception("Missing frames")
if frame.index == lin_step:
lin_fd.write(raw_frame)
lin_step = next_lin_step(lin_step, lin_freq)
for writer in log_writers:
writer.consume_frame(frame.index, raw_frame)
except EOFError:
pass
if __name__ == '__main__':
main()