Source code for fpipy.meta
# -*- coding: utf-8 -*-
"""Metadata parsing."""
import numpy as np
import xarray as xr
from .raw import BayerPattern
from . import conventions as c
[docs]def parse_meta_to_ds(meta):
"""Parse FPI metadata from a configparser to a xarray.Dataset."""
header = meta['Header']
attrs = {
'FPI temperature': header.getfloat('FPI Temperature'),
'dark layer included':
header.getboolean('Dark Layer included'),
'description': header['Description'].strip('"')
}
layers = meta.sections()
layers.remove('Header')
if attrs['dark layer included']:
layers.remove('Image0')
ds = xr.concat(
[parse_image_meta(meta, layer) for layer in layers],
dim='index'
)
ds = ds.assign_attrs(attrs)
return ds
[docs]def parse_image_meta(meta, layer):
"""Parse metadata for a given image (layer) in the FPI data."""
im_meta = xr.Dataset()
im_meta[c.number_of_peaks] = meta.getint(layer, 'npeaks')
im_meta[c.number_of_peaks].attrs = {
'long_name': 'number of peaks per image',
'units': '1',
}
im_meta[c.image_width] = meta.getint(layer, 'width')
im_meta[c.image_height] = meta.getint(layer, 'height')
im_meta[c.camera_gain] = meta.getfloat(layer, 'gain')
im_meta[c.camera_gain].attrs = {
'long_name': 'analog gain',
'units': '1'
}
im_meta[c.camera_exposure] = meta.getfloat(layer, 'exposure time (ms)')
im_meta[c.camera_exposure].attrs = {
'long_name': 'exposure time',
'units': 'ms',
}
im_meta[c.cfa_pattern_data] = str(
BayerPattern(meta.getint(layer, 'bayer pattern')))
im_meta[c.cfa_pattern_data].attrs = {
'long_name': 'Bayer pattern string',
}
im_meta[c.image_index] = meta.getint(layer, 'index')
im_meta[c.wavelength_data] = parse_peakmeta(meta.get(layer, 'wavelengths'))
im_meta[c.wavelength_data].attrs = {
'long_name': 'peak center wavelength',
'standard_name': 'radiation_wavelength',
'unit': 'nm',
}
im_meta[c.fwhm_data] = parse_peakmeta(meta.get(layer, 'fwhms'))
im_meta[c.fwhm_data].attrs = {
'long_name': 'peak full width at half maximum',
'unit': 'nm',
}
im_meta[c.setpoint_data] = parse_setpoints(meta.get(layer, 'setpoints'))
im_meta[c.sinv_data] = parse_sinvs(meta.get(layer, 'sinvs'))
return im_meta
[docs]def parse_peakmeta(s):
return xr.DataArray(
parsevec(s),
dims=(c.peak_coord),
coords={c.peak_coord: [1, 2, 3]},
)
[docs]def parse_setpoints(s):
return xr.DataArray(
parsevec(s),
dims=(c.setpoint_coord),
coords={c.setpoint_coord: ['SP1', 'SP2', 'SP3']},
attrs={
'long_name': 'fpi setpoint voltages',
'units': 'V',
},
)
[docs]def parse_sinvs(s):
"""Parse an array of floats from a string."""
vector = parsevec(s)
return xr.DataArray(
[vector[0:3], vector[3:6], vector[6:]],
dims=(c.peak_coord, c.colour_coord),
coords={
c.peak_coord: [1, 2, 3],
c.colour_coord: ['R', 'G', 'B']},
attrs={
'long_name': 'dn to pseudoradiance inversion coefficients',
'units': 'J sr-1 m-2 nm-1',
}
)
[docs]def parsevec(s):
"""Parse a vector of floats from a string."""
return np.fromstring(s.strip('"'), dtype='float', sep=' ')