def __flex_load__(cls, header, data): ext = MultipleDataExtension._parse(header, data) wavelength = ext.data["wavelength"] wavelength = wavelength << ext.header["wavelength_unit"] flux = ext.data["flux"] flux = flux << ext.header["flux_unit"] if "uncertainty" in ext.data: uncertainty = ext.data["uncertainty"] uncertainty = uncertainty << ext.header["uncertainty_unit"] uncertainty = StdDevUncertainty(uncertainty) else: uncertainty = None exceptions = [ "__module__", "__class__", "__header__", "uncertainty_unit", "wavelength_unit", "flux_unit", ] meta = {k: v for k, v in ext.header.items() if k not in exceptions} meta["spectral_axis"] = wavelength meta["flux"] = flux meta["uncertainty"] = uncertainty return cls(**meta)
def test_json_multi(tmp_fname): file = FlexFile() ext = MultipleDataExtension(data={"bla": np.zeros(10)}) file.extensions["img"] = ext file.to_json(tmp_fname) del file f2 = FlexFile.from_json(tmp_fname) assert f2["img"].data["bla"].size == 10 assert np.all(f2["img"].data["bla"] == 0)
def __flex_save__(self): header = self.meta header["wavelength_unit"] = self.wavelength.unit header["flux_unit"] = self.flux.unit data = { "wavelength": self.wavelength.to_value("AA"), "flux": self.flux.to_value(1), } if self.uncertainty is not None: header["uncertainty_unit"] = self.uncertainty.unit data["uncertainty"] = self.uncertainty.array module = self.__class__.__module__ cls = self.__class__.__name__ ext = MultipleDataExtension(header, data, cls=f"{module}.{cls}") return ext
def _save(self): data = {} ext2 = self.abund._save() header = ext2.header data["abund"] = ext2.data header["abund_format"] = header["type"] del header["type"] for name in self._names: value = self[name] if isinstance(value, (float, int, str)): header[name] = value elif isinstance(value, np.ndarray): data[name] = value elif value is None or isinstance(value, Abund): pass else: raise ValueError("What is this? %s" % value) ext = MultipleDataExtension(header, data) return ext
def _save(self): data = {} ext2 = self.abund._save() header = ext2.header data["abund"] = ext2.data header["abund_format"] = header["type"] del header["type"] for name in self._names: value = self[name] if isinstance(value, np.ndarray): data[name] = value elif value is None or isinstance(value, Abund): pass else: # if isinstance(value, (np.floating, np.integer, np.str, float, int, str)): header[name] = value ext = MultipleDataExtension(header, data) return ext
import numpy as np import pandas as pd from flex.flex import FlexFile from flex.extensions.bindata import BinaryDataExtension, MultipleDataExtension from flex.extensions.tabledata import TableExtension, JSONTableExtension file = FlexFile() ext_bin = BinaryDataExtension(data=np.linspace(0, 1, 4 * 3 * 2).reshape((4, 3, 2))) ext = MultipleDataExtension() ext.data["data"] = np.arange(12, dtype="i2").reshape((3, 2, 2)) tab = JSONTableExtension() tab.data = pd.DataFrame(np.arange(20).reshape((10, 2)), columns=["A", "B"]) file.header["bla"] = np.float(3e10) file.header["blub"] = np.nan file.header["blrub"] = float("inf") file.header["blurb"] = np.array([1, 2, 3]) file.header["blurb2"] = [1, 2, 3] file.header["int"] = 1 file.header["np_int"] = np.int(1) file.header["str"] = "Hello" file.header["np_str"] = np.str("World") # FITS can handle either long header keys, or long entries # But not both at the same time... file.header["really_long_entry"] = "bla" file.header["really_l"] = "bla" * 100 file.header["really_long_text_with_HIERARCH"] = "bla" * 100
def _save(self): data = {str(i): v for i, v in enumerate(self._values)} ext = MultipleDataExtension(data=data) return ext