Files
sics/site_ansto/instrument/sans/util/dsc.py
Ferdi Franceschini a0acd1e5b4 SICS-458: Add dsc command to run a DSC acquisition on Quokka.
Also added dsc.py utility which finds the start of a DSC profile in hdf files.
2014-08-26 10:32:43 +10:00

95 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python
# vim: ft=python ts=8 sts=4 sw=4 expandtab autoindent smartindent
""" Find the trigger time for Differenctial Scanning Calorimetry data in nx.hdf files. """
import sys
import os
import h5py
import argparse
import time
from collections import defaultdict
class SkipFile(BaseException):
"""This exception should be raised to skip processing a file"""
pass
PARSER = argparse.ArgumentParser(
description = """Report the time offset for the start of the DSC profile relative to the start time of the histogram data.
This program can process multiple hdf files by specifying the path to the first file and the number of files to process.
You can also speficy a list of 'file_path numfile' pairs.""",
usage='dsc file_path numfile {file_path numfile}'
)
PARSER.add_argument('files', nargs='+', help = 'List of "file_path numfile" pairs')
ARGS = PARSER.parse_args()
FAILS = defaultdict(list)
for startfile, num in zip(ARGS.files[0::2], ARGS.files[1::2]):
numfiles = int(num)
hfdir = os.path.dirname(startfile)
hfbase = os.path.basename(startfile)
idx = hfbase.find('.')
startFID = hfbase[:idx]
ext = hfbase[idx:]
idnum = int(startFID[3:])
inst_abname = hfbase[:3]
hfval = {}
print
for i in range(numfiles):
try:
currid = idnum + i
fileID = inst_abname + '%07d' % currid
if (hfdir == ''):
nxfile = fileID + ext
else:
nxfile = hfdir + '/' + fileID + ext
try:
hf = h5py.File(nxfile, 'r')
except:
FAILS['badfile'].append(nxfile)
continue
if (hfbase.startswith('QKK')):
rootpath = fileID + '/'
else:
rootpath = 'entry1/'
for dpath in ['time_stamp', 'instrument/detector/start_time', 'sample/dsc_val']:
dscpath = rootpath + dpath
if dscpath in hf:
hfval[dpath] = hf[dscpath][:]
else:
FAILS['badpath:{0}'.format(dpath)].append(nxfile)
hf.close()
raise SkipFile
print fileID
datiter = {}
dat_hasnext = 0
time_tuple = time.strptime(hf[rootpath + 'start_time'][0], '%Y-%m-%d %H:%M:%S')
hfval['time_stamp'] += time.mktime(time_tuple)
hfval['time_stamp'] -= hfval['instrument/detector/start_time']
dsc0 = hfval['sample/dsc_val'][0]
no_transition = True
for i in range(1, len(hfval['sample/dsc_val'][1:])):
dsc1 = hfval['sample/dsc_val'][i]
if abs(dsc1 - dsc0) > 1.9:
no_transition = False
msg = 'dsc_val transition from {dsc0} to {dsc1} volts at {time} seconds from detector start time, array index = {index}'
print msg.format(dsc0=dsc0, dsc1=dsc1, time=hfval['time_stamp'][i], index=i)
dsc0 = dsc1
if no_transition:
print 'dsc_val no transition'
print
hf.close()
except SkipFile:
continue
for k in FAILS.keys():
if (len(FAILS[k])):
print >> sys.stderr, 'Skipped following files. Reason = ', k
print >> sys.stderr, FAILS[k]