Source code for crikit.datasets.model
import numpy as _np
from pkgutil import get_data as _get_data
from io import BytesIO as _BytesIO
import copy as _copy
[docs]class Model:
"""
Model class
Parameters
----------
subsample : int
Subsample the spatial dimenension (ie x[::subsample], y[::subsample])
dtype : numpy dtype
Dtype to set final image
"""
_M = 300
_N = 300
def __init__(self, subsample=1, dtype=_np.complex):
self.n_layers = 7 # Number of components
self.img_shape = [300, 300] # Spaital imaging shape
self.x = _np.linspace(1,199,self._N)
self.y = _np.linspace(1,199,self._M)
if subsample > 1:
self.x = self.x[::subsample]
self.y = self.y[::subsample]
self.img_shape = [self.y.size, self.x.size]
self.dtype = dtype
# Order of spectral array
# A: amplitude
# Omega: center frequency
# Gamma: peak frequency width
self.spec_order = ['Omega','A','Gamma']
# Filename prefix for concentration images
self.__conc_img_prefix = 'Chem_Conc_'
# Filename prefix for spectral array
self.__spec_prefix = 'Chem_Spec_'
self.layers = _np.zeros(self.img_shape + [self.n_layers])
self.spec_list = []
self.n_peak_list = []
# Final hyperspectral image
self.hsi = None
# Spectra array
self.spectra = None
# Frequency vector
# For convenicence self.f or self.wn will work
self._f = None
try:
for num in range(self.n_layers):
gd_layer = _get_data('crikit.datasets', '{}{}{}'.format(self.__conc_img_prefix,
num, '.csv'))
self.layers[:,:,num] = _np.genfromtxt(_BytesIO(gd_layer), delimiter=',')[::subsample,::subsample]
gd_spec = _get_data('crikit.datasets', '{}{}{}'.format(self.__spec_prefix,
num, '.csv'))
self.spec_list.append(_np.genfromtxt(_BytesIO(gd_spec), delimiter=','))
except:
print('Failed to import model layer and/or spectral information')
else:
print('Model spatial size: {}'.format(self.img_shape))
print('Model components/layers: {}'.format(self.n_layers))
@property
def f(self):
return self._f
@property
def wn(self):
return self._f
@property
def hsi_i(self):
"""Return imag{hsi}"""
return self.hsi.imag
@property
def hsi_r(self):
"""Return real{hsi}"""
return self.hsi.real
[docs] def make_spectra(self, f):
"""
Parameters
----------
f : ndarray (1D)
Frequency vector
"""
self._f = f
a_loc = self.spec_order.index('A')
o_loc = self.spec_order.index('Omega')
g_loc = self.spec_order.index('Gamma')
self.spectra = _np.zeros((self.n_layers, f.size), dtype=self.dtype)
try:
for num, arr in enumerate(self.spec_list):
omega_vec = arr[:,o_loc]
a_vec = arr[:,a_loc]
gamma_vec = arr[:,g_loc]
self.n_peak_list.append(a_vec.size)
self.spectra[num, :] = _np.sum(a_vec[:,None] / (omega_vec [:,None] - f[None,:] - 1j*gamma_vec[:,None]), axis=0)
except:
print('Failed to make model spectra')
else:
print('Model spectral size: {}'.format(self.f.size))
[docs] def make_hsi(self, f=None):
"""
Make the HSI image
Parameters
----------
f : ndarray (1D)
Frequency vector
"""
try:
if f is not None:
self.make_spectra(f=f)
# self.hsi = _np.zeros(self.img_shape + [self._f.size], dtype=self.dtype)
self.hsi = _np.dot(self.layers, self.spectra)
print('Model HSI shape: {}'.format(self.hsi.shape))
except:
print('Faled to make model HSI')
#%%
if __name__ == '__main__':
model = Model(subsample=4)
print('Layer shape: {}'.format(model.layers.shape))
wn = _np.linspace(500, 3400, 100)
model.make_hsi(f=wn)
print('Model shape: {}'.format(model.hsi.shape))
print('Model is complex: {}'.format(_np.iscomplexobj(model.hsi)))