# -*- coding: utf-8 -*-
"""
Created on Mon Oct 22 16:42:16 2018
Reads radiographic images and create simple plots
@author: Pawel M. Kozlowski
"""
# python modules
import glob
import os
import numpy as np
import h5py as h5
import matplotlib.pyplot as plt
# custom modules
import xripl.pltDefaults
# listing all functions declared in this file so that sphinx-automodapi
# correctly documents them and doesn't document imported functions.
__all__ = ["openRadiograph",
"omegaDataSearch",
"shotRadiograph",
]
[docs]def openRadiograph(fileName):
"""
Given the full filename (with path) to an hdf5 file containing
radiographic data from an XRFC (x-ray framing camera) diagnostic
on OMEGA, open the file and return the foreground and background
image data as numpy arrays.
fileName is a str
"""
with h5.File(fileName, "r") as f:
streakArr = f["Streak_array"][...]
foreground = streakArr[0, :, :]
background = streakArr[1, :, :]
return foreground, background
[docs]def omegaDataSearch(dataDir, camera='xrfc4'):
"""
Search given directory and subdirectories for HDF5 files of
radiographs from OMEGA LLE XRFC data.
"""
if not camera in ['xrfc1', 'xrfc2', 'xrfc3', 'xrfc4', 'xrfc5']:
raise Exception(f"Cannot find method for camera {camera}")
# fetch all xrfccd hdf5 files in directory and subdirectories
pattern = f'**/xrfccd_{camera}*.h5'
flist = glob.glob(os.path.join(dataDir, pattern), recursive=True)
# trim the filenames to just base filename
flistBase = [os.path.basename(fname) for fname in flist]
# split filename and extension
flistTrim = [os.path.splitext(fname)[0] for fname in flistBase]
# extracting shot numbers from file names
shotNos = [int(fname.split("_")[-1]) for fname in flistTrim]
# get diagnostic names from prepended portion of filenames
diagnosticNamesList = ["_".join(fname.split("_")[:-1]) for fname in flistTrim]
diagnosticNames = set(diagnosticNamesList)
return flist, shotNos, diagnosticNames, flistTrim
[docs]def shotRadiograph(shotNum, camera, dataDir, plots=False):
r"""
Opens a radiograph given a shot number, framing camera and
directory containing shot data.
shotNum : int
Omega shot number of radiograph to be opened.
camera : str
Name of camera used on shotNum from which to open radiograph.
For example, 'xrfc3' for x-ray framing camera 3.
dataDir : str
Full path to directory containing shot data with radiographs.
plots : bool
Flag for plotting the background and the foreground images.
Default is False.
"""
# get files in directory and pick a shot
flist, shotNos, diagnosticNames, flistTrim = omegaDataSearch(dataDir=dataDir,
camera=camera)
# picking a shot
if not shotNum in shotNos:
raise Exception(f"Shot number {shotNum} not found in directory!")
# looking for shot number in files in directory
filteredFiles = np.array([str(shotNum) in fileName for fileName in flist])
# picking just the first match (don't care which diagnostic it is, so long
# as shot number is correct, since we already filtered based on
# camera diagnostic)
flistArr = np.array(flist)
xrfcFull = flistArr[filteredFiles][0]
# baseName = os.path.basename(xrfcFull)
# open the selected radiograph if it is in the list of supported
# camera types for this data set
if camera in ['xrfc1', 'xrfc2', 'xrfc3', 'xrfc4', 'xrfc5']:
foreground, background = openRadiograph(fileName=xrfcFull)
else:
raise NotImplementedError(f"Unsupported camera type {camera}.")
if camera == 'xrfc5':
# mirroring the image so that it is oriented in same direction
# as XRFC3
foreground = np.fliplr(foreground)
background = np.fliplr(background)
if plots:
plt.imshow(background)
plt.title(f"Background")
plt.show()
plt.figure(figsize=(10,12))
plt.imshow(foreground)
plt.title(f"Foreground")
plt.show()
return foreground, background