Source code for glue_solar.sources.iris
"""
A reader for IRIS data.
"""
from glue.config import data_factory, importer, qglue_parser
from glue.core.component import Component
from glue.core.coordinates import WCSCoordinates
from glue.core.data import Data
from glue.core.data_factories import is_fits
from glue.core.visual import VisualAttributes
from irispy.io import read_files
from irispy.sji import IRISMapCube, IRISMapCubeSequence
from irispy.spectrograph import IRISCollection
from qtpy import QtWidgets
from astropy.io import fits
from glue_solar.sources.loaders.iris import QtIRISImporter
__all__ = ["import_iris", "read_iris_files"]
@qglue_parser(IRISCollection)
def _parse_iris_raster(data):
"""
Parse IRIS Level 2 raster files so that it can be loaded by glue.
"""
w_data = None
for window, window_data in data.items():
for i, scan_data in enumerate(window_data):
w_data = Data(
label=f"{window.replace(' ', '_')}-{scan_data.meta['OBSID']}-scan-{i}"
)
w_data.coords = WCSCoordinates(scan_data.wcs.to_header())
w_data.add_component(
Component(scan_data.data),
f"{window.replace(' ', '_')}-{scan_data.meta['OBSID']}-scan-{i}",
)
w_data.meta = scan_data.meta
w_data.style = VisualAttributes(color="#5A4FCF")
return w_data
@qglue_parser(IRISMapCube)
def _parse_iris_sji(data, file_header):
"""
Parse IRIS Level 2 SJI files so that it can be loaded by glue.
"""
w_data = None
w_data = Data(label=f"IRIS-SJI-{data.meta['TWAVE1']}-{data.meta['OBSID']}")
# TODO: Construct correct 3D WCS
w_data.coords = WCSCoordinates(file_header)
w_data.add_component(
Component(data.data_as_array),
f"{data.meta['TWAVE1']}-{data.meta['OBSID']}",
)
w_data.meta = data.meta
w_data.style = VisualAttributes(
color="#5A4FCF", preferred_cmap=f"IRIS SJI {data.meta['TWAVE1']:0.0f}"
)
return w_data
[docs]@data_factory("IRIS FITS", is_fits)
def read_iris_files(file_path):
"""
To read any IRIS Level 2 files.
"""
# TODO: Memmap in future.
data = read_files(file_path, uncertainty=False, memmap=False)
if isinstance(data, IRISMapCubeSequence):
return _parse_iris_sji(data, fits.getheader(file_path))
elif isinstance(data, IRISCollection):
return _parse_iris_raster(data)
else:
raise ValueError(f"Unrecognised IRIS file type for {file_path}")
def pick_directory(caption):
dialog = QtWidgets.QFileDialog(caption=caption)
dialog.setFileMode(QtWidgets.QFileDialog.Directory)
directory = dialog.exec_()
if directory == QtWidgets.QDialog.Rejected:
return []
directory = dialog.selectedFiles()
return directory[0]
[docs]@importer("Import IRIS OBS Directory")
def import_iris():
"""
To import IRIS raster and SJI fits files for the same observation from directory.
"""
caption = "Select a directory containing files from one IRIS OBS."
directory = pick_directory(caption)
wi = QtIRISImporter(directory)
wi.exec_()
return wi.datasets