Source code for paws.core.operations.IO.BL42.ReadImageAndHeader_SSRL42
import os
from collections import OrderedDict
import re
import tifffile
import numpy as np
from ... import Operation as opmod
from ...Operation import Operation
inputs=OrderedDict(file_path=None)
outputs=OrderedDict(
image_data=None,
image_header=None,
dir_path=None,
filename=None)
[docs]class ReadImageAndHeader_SSRL42(Operation):
"""Read image and header from SSRL beam line 4-2."""
def __init__(self):
super(ReadImageAndHeader_SSRL42, self).__init__(inputs, outputs)
self.input_doc['file_path'] = 'path to a tif file '\
'produced by beamline 4-2 at SSRL. '\
'A .prp header file is expected '\
'in the same directory as this .tif file.'
self.output_doc['image_data'] = 'the image data as an ndarray'
self.output_doc['image_header'] = 'the header data as a python dictionary'
self.output_doc['dir_path'] = 'the directory portion of the input file_path'
self.output_doc['filename'] = 'the filename with path and extension stripped'
[docs] def run(self):
tif_path = self.inputs['file_path']
dirpath,filename = os.path.split(tif_path)
filename_noext = os.path.splitext(filename)[0]
path_noext = os.path.splitext(tif_path)[0]
hdr_file_path = path_noext + '.prp'
self.outputs['dir_path'] = dirpath
self.outputs['filename'] = filename_noext
img = tifffile.imread(tif_path)
# flip the image...
self.outputs['image_data'] = np.array(img[::-1,:])
d = OrderedDict()
for l in open(hdr_file_path,'r').readlines():
if not '=' in l:
if l[:4] == 'Time':
d['time'] = l.split('Time this file was written: ')[1]
else:
kv = l.split('=')
if kv[0] == 'Detector mode':
d[kv[0]] = kv[1].split(' ')[0].replace(';','')
elif kv[0] in ['Beam energy','Pipe length',
'Horizontal position','Vertical position',
'dispx position','dispy position']:
# Split off and throw away the unit specification
d[kv[0]] = float(kv[1].split(' ')[0])
elif kv[0] in ['Exposure time','Counting time','Phi position']:
# Units not specified: save float directly.
d[kv[0]] = float(kv[1])
elif kv[0] in ['Scan motor','Scan range']:
d[kv[0]] = kv[1]
else:
# Use key and value directly,
# use re.sub to filter out parentheticals
d[re.sub('\(.*\)','',kv[0])] = float(re.sub('\(.*\)','',kv[1]))
self.outputs['image_header'] = d