Source code for colour.io.uprtek_sekonic

"""
UPRTek and Sekonic Spectral Data
================================

Defines the input and output objects for *UPRTek* and *Sekonic*
*Pseudo-XLS*/*CSV* spectral data files.

-   :class:`colour.SpectralDistribution_UPRTek`
-   :class:`colour.SpectralDistribution_Sekonic`
"""

from __future__ import annotations

import csv
import json
import os
import re
from collections import defaultdict

from colour.hints import Any, cast
from colour.io import SpectralDistribution_IESTM2714
from colour.utilities import as_float_array, as_float_scalar

__author__ = "Colour Developers"
__copyright__ = "Copyright 2013 Colour Developers"
__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
__maintainer__ = "Colour Developers"
__email__ = "colour-developers@colour-science.org"
__status__ = "Production"

__all__ = [
    "SpectralDistribution_UPRTek",
    "SpectralDistribution_Sekonic",
]


[docs] class SpectralDistribution_UPRTek(SpectralDistribution_IESTM2714): """ Implement support to read and write *IES TM-27-14* spectral data XML file from a *UPRTek* *Pseudo-XLS* file. Parameters ---------- path Path for *UPRTek* *Pseudo-XLS* file. Attributes ---------- - :attr:`~colour.SpectralDistribution_UPRTek.metadata` Methods ------- - :meth:`~colour.SpectralDistribution_UPRTek.__init__` - :meth:`~colour.SpectralDistribution_UPRTek.__str__` - :meth:`~colour.SpectralDistribution_UPRTek.read` Examples -------- >>> from os.path import dirname, join >>> from colour import SpectralShape >>> directory = join(dirname(__file__), "tests", "resources") >>> sd = SpectralDistribution_UPRTek( ... join(directory, "ESPD2021_0104_231446.xls") ... ) >>> print(sd.align(SpectralShape(380, 780, 10))) ... # doctest: +ELLIPSIS UPRTek ====== <BLANKLINE> Path : ... Spectral Quantity : irradiance Reflection Geometry : None Transmission Geometry : None Bandwidth (FWHM) : None Bandwidth Corrected : None <BLANKLINE> Header ------ <BLANKLINE> Manufacturer : UPRTek Catalog Number : None Description : None Document Creator : None Unique Identifier : None Measurement Equipment : CV600 Laboratory : None Report Number : None Report Date : 2021/01/04_23:14:46 Document Creation Date : None Comments : {...} <BLANKLINE> Spectral Data ------------- <BLANKLINE> [[ 3.80000000e+02 3.02670000e-02] [ 3.90000000e+02 3.52230000e-02] [ 4.00000000e+02 1.93250000e-02] [ 4.10000000e+02 2.94260000e-02] [ 4.20000000e+02 8.76780000e-02] [ 4.30000000e+02 6.32578000e-01] [ 4.40000000e+02 3.62565900e+00] [ 4.50000000e+02 1.42069180e+01] [ 4.60000000e+02 1.70112970e+01] [ 4.70000000e+02 1.19673130e+01] [ 4.80000000e+02 8.42736200e+00] [ 4.90000000e+02 7.97729800e+00] [ 5.00000000e+02 8.71903600e+00] [ 5.10000000e+02 9.55321500e+00] [ 5.20000000e+02 9.90610500e+00] [ 5.30000000e+02 9.91394400e+00] [ 5.40000000e+02 9.74738000e+00] [ 5.50000000e+02 9.53404900e+00] [ 5.60000000e+02 9.27392200e+00] [ 5.70000000e+02 9.02323400e+00] [ 5.80000000e+02 8.91788800e+00] [ 5.90000000e+02 9.11454600e+00] [ 6.00000000e+02 9.55787100e+00] [ 6.10000000e+02 1.00600760e+01] [ 6.20000000e+02 1.04846200e+01] [ 6.30000000e+02 1.05679540e+01] [ 6.40000000e+02 1.04359870e+01] [ 6.50000000e+02 9.82122300e+00] [ 6.60000000e+02 8.77578300e+00] [ 6.70000000e+02 7.56471800e+00] [ 6.80000000e+02 6.29808600e+00] [ 6.90000000e+02 5.15623400e+00] [ 7.00000000e+02 4.05390600e+00] [ 7.10000000e+02 3.06638600e+00] [ 7.20000000e+02 2.19250000e+00] [ 7.30000000e+02 1.53922800e+00] [ 7.40000000e+02 1.14938200e+00] [ 7.50000000e+02 9.05095000e-01] [ 7.60000000e+02 6.90947000e-01] [ 7.70000000e+02 5.08426000e-01] [ 7.80000000e+02 4.11766000e-01]] >>> sd.header.comments '{"Model Name": "CV600", "Serial Number": "19J00789", \ "Time": "2021/01/04_23:14:46", "Memo": [], "LUX": 695.154907, \ "fc": 64.605476, "CCT": 5198.0, "Duv": -0.00062, "I-Time": 12000.0, \ "X": 682.470886, "Y": 695.154907, "Z": 631.635071, "x": 0.339663, \ "y": 0.345975, "u\\'": 0.209915, "v\\'": 0.481087, "LambdaP": 456.0, \ "LambdaPValue": 18.404581, "CRI": 92.956993, "R1": 91.651062, \ "R2": 93.014732, "R3": 97.032013, "R4": 93.513229, "R5": 92.48259, \ "R6": 91.48687, "R7": 93.016129, "R8": 91.459312, "R9": 77.613075, \ "R10": 86.981613, "R11": 94.841324, "R12": 74.139542, "R13": 91.073837, \ "R14": 97.064323, "R15": 88.615669, "TLCI": 97.495056, "TLMF-A": 1.270032, \ "SSI-A": 44.881924, "Rf": 87.234917, "Rg": 98.510712, "IRR": 2.607891}' >>> sd.metadata.keys() dict_keys(['Model Name', 'Serial Number', 'Time', 'Memo', 'LUX', 'fc', \ 'CCT', 'Duv', 'I-Time', 'X', 'Y', 'Z', 'x', 'y', "u'", "v'", 'LambdaP', \ 'LambdaPValue', 'CRI', 'R1', 'R2', 'R3', 'R4', 'R5', 'R6', 'R7', 'R8', 'R9', \ 'R10', 'R11', 'R12', 'R13', 'R14', 'R15', 'TLCI', 'TLMF-A', 'SSI-A', 'Rf', \ 'Rg', 'IRR']) >>> sd.write(join(directory, "ESPD2021_0104_231446.spdx")) ... # doctest: +SKIP """ _DELIMITER: str = "\t" _SPECTRAL_SECTION: str = "380" _SPECTRAL_DATA_PATTERN: str = "(\\d{3})nm"
[docs] def __init__(self, path: str, **kwargs: Any) -> None: self._metadata: dict = {} super().__init__(path, **kwargs)
@property def metadata(self) -> dict: """ Getter property for the metadata. Returns ------- :class:`dict` Metadata. """ return self._metadata
[docs] def __str__(self) -> str: """ Return a formatted string representation of the *UPRTek* spectral distribution. Returns ------- :class:`str` Formatted string representation. Examples -------- >>> from os.path import dirname, join >>> from colour import SpectralShape >>> directory = join(dirname(__file__), "tests", "resources") >>> sd = SpectralDistribution_UPRTek( ... join(directory, "ESPD2021_0104_231446.xls") ... ) >>> print(sd.read().align(SpectralShape(380, 780, 10))) ... # doctest: +ELLIPSIS UPRTek ====== <BLANKLINE> Path : ... Spectral Quantity : irradiance Reflection Geometry : None Transmission Geometry : None Bandwidth (FWHM) : None Bandwidth Corrected : None <BLANKLINE> Header ------ <BLANKLINE> Manufacturer : UPRTek Catalog Number : None Description : None Document Creator : None Unique Identifier : None Measurement Equipment : CV600 Laboratory : None Report Number : None Report Date : 2021/01/04_23:14:46 Document Creation Date : None Comments : {...} <BLANKLINE> Spectral Data ------------- <BLANKLINE> [[ 3.80000000e+02 3.02670000e-02] [ 3.90000000e+02 3.52230000e-02] [ 4.00000000e+02 1.93250000e-02] [ 4.10000000e+02 2.94260000e-02] [ 4.20000000e+02 8.76780000e-02] [ 4.30000000e+02 6.32578000e-01] [ 4.40000000e+02 3.62565900e+00] [ 4.50000000e+02 1.42069180e+01] [ 4.60000000e+02 1.70112970e+01] [ 4.70000000e+02 1.19673130e+01] [ 4.80000000e+02 8.42736200e+00] [ 4.90000000e+02 7.97729800e+00] [ 5.00000000e+02 8.71903600e+00] [ 5.10000000e+02 9.55321500e+00] [ 5.20000000e+02 9.90610500e+00] [ 5.30000000e+02 9.91394400e+00] [ 5.40000000e+02 9.74738000e+00] [ 5.50000000e+02 9.53404900e+00] [ 5.60000000e+02 9.27392200e+00] [ 5.70000000e+02 9.02323400e+00] [ 5.80000000e+02 8.91788800e+00] [ 5.90000000e+02 9.11454600e+00] [ 6.00000000e+02 9.55787100e+00] [ 6.10000000e+02 1.00600760e+01] [ 6.20000000e+02 1.04846200e+01] [ 6.30000000e+02 1.05679540e+01] [ 6.40000000e+02 1.04359870e+01] [ 6.50000000e+02 9.82122300e+00] [ 6.60000000e+02 8.77578300e+00] [ 6.70000000e+02 7.56471800e+00] [ 6.80000000e+02 6.29808600e+00] [ 6.90000000e+02 5.15623400e+00] [ 7.00000000e+02 4.05390600e+00] [ 7.10000000e+02 3.06638600e+00] [ 7.20000000e+02 2.19250000e+00] [ 7.30000000e+02 1.53922800e+00] [ 7.40000000e+02 1.14938200e+00] [ 7.50000000e+02 9.05095000e-01] [ 7.60000000e+02 6.90947000e-01] [ 7.70000000e+02 5.08426000e-01] [ 7.80000000e+02 4.11766000e-01]] """ representation = super().__str__() return representation.replace( "IES TM-27-14 Spectral Distribution\n" "==================================", "UPRTek\n======", )
[docs] def read(self) -> SpectralDistribution_UPRTek: """ Read and parses the spectral data from a given *UPRTek* *CSV* file. Returns ------- :class:`colour.SpectralDistribution_UPRTek` *UPRTek* spectral distribution. Examples -------- >>> from os.path import dirname, join >>> from colour import SpectralShape >>> directory = join(dirname(__file__), "tests", "resources") >>> sd = SpectralDistribution_UPRTek( ... join(directory, "ESPD2021_0104_231446.xls") ... ) >>> print(sd.read().align(SpectralShape(380, 780, 10))) ... # doctest: +ELLIPSIS UPRTek ====== <BLANKLINE> Path : ... Spectral Quantity : irradiance Reflection Geometry : None Transmission Geometry : None Bandwidth (FWHM) : None Bandwidth Corrected : None <BLANKLINE> Header ------ <BLANKLINE> Manufacturer : UPRTek Catalog Number : None Description : None Document Creator : None Unique Identifier : None Measurement Equipment : CV600 Laboratory : None Report Number : None Report Date : 2021/01/04_23:14:46 Document Creation Date : None Comments : {...} <BLANKLINE> Spectral Data ------------- <BLANKLINE> [[ 3.80000000e+02 3.02670000e-02] [ 3.90000000e+02 3.52230000e-02] [ 4.00000000e+02 1.93250000e-02] [ 4.10000000e+02 2.94260000e-02] [ 4.20000000e+02 8.76780000e-02] [ 4.30000000e+02 6.32578000e-01] [ 4.40000000e+02 3.62565900e+00] [ 4.50000000e+02 1.42069180e+01] [ 4.60000000e+02 1.70112970e+01] [ 4.70000000e+02 1.19673130e+01] [ 4.80000000e+02 8.42736200e+00] [ 4.90000000e+02 7.97729800e+00] [ 5.00000000e+02 8.71903600e+00] [ 5.10000000e+02 9.55321500e+00] [ 5.20000000e+02 9.90610500e+00] [ 5.30000000e+02 9.91394400e+00] [ 5.40000000e+02 9.74738000e+00] [ 5.50000000e+02 9.53404900e+00] [ 5.60000000e+02 9.27392200e+00] [ 5.70000000e+02 9.02323400e+00] [ 5.80000000e+02 8.91788800e+00] [ 5.90000000e+02 9.11454600e+00] [ 6.00000000e+02 9.55787100e+00] [ 6.10000000e+02 1.00600760e+01] [ 6.20000000e+02 1.04846200e+01] [ 6.30000000e+02 1.05679540e+01] [ 6.40000000e+02 1.04359870e+01] [ 6.50000000e+02 9.82122300e+00] [ 6.60000000e+02 8.77578300e+00] [ 6.70000000e+02 7.56471800e+00] [ 6.80000000e+02 6.29808600e+00] [ 6.90000000e+02 5.15623400e+00] [ 7.00000000e+02 4.05390600e+00] [ 7.10000000e+02 3.06638600e+00] [ 7.20000000e+02 2.19250000e+00] [ 7.30000000e+02 1.53922800e+00] [ 7.40000000e+02 1.14938200e+00] [ 7.50000000e+02 9.05095000e-01] [ 7.60000000e+02 6.90947000e-01] [ 7.70000000e+02 5.08426000e-01] [ 7.80000000e+02 4.11766000e-01]] """ path = cast(str, self.path) def as_array(a: Any) -> list: """ Input list of numbers and converts each element to float data type. """ return [as_float_scalar(e) for e in a] spectral_sections = defaultdict(list) with open(path, encoding="utf-8") as csv_file: content = csv.reader(csv_file, delimiter=self._DELIMITER) spectral_section = 0 for row in content: if not "".join(row).strip(): continue attribute, tokens = row[0], row[1:] value = tokens[0] if len(tokens) == 1 else tokens match = re.match(self._SPECTRAL_DATA_PATTERN, attribute) if match: wavelength = match.group(1) if wavelength == self._SPECTRAL_SECTION: spectral_section += 1 spectral_sections[spectral_section].append( [wavelength, value] ) else: for method in (int, float, as_array): try: self._metadata[attribute] = method( value # pyright: ignore ) break except Exception: self._metadata[attribute] = value self.name = os.path.splitext(os.path.basename(path))[0] spectral_data = as_float_array( spectral_sections[sorted(spectral_sections.keys())[-1]] ) self.wavelengths = spectral_data[..., 0] self.values = spectral_data[..., 1] self.header.comments = json.dumps(self._metadata) self.header.report_date = self._metadata.get("Time") self.header.measurement_equipment = self._metadata.get("Model Name") self.header.manufacturer = "UPRTek" self.spectral_quantity = "irradiance" return self
[docs] class SpectralDistribution_Sekonic(SpectralDistribution_UPRTek): """ Implement support to read and write *IES TM-27-14* spectral data XML file from a *Sekonic* *CSV* file. Parameters ---------- path Path for *Sekonic* *CSV* file. Attributes ---------- - :attr:`~colour.SpectralDistribution_UPRTek.metadata` Methods ------- - :meth:`~colour.SpectralDistribution_Sekonic.__init__` - :meth:`~colour.SpectralDistribution_Sekonic.__str__` - :meth:`~colour.SpectralDistribution_Sekonic.read` Examples -------- >>> from os.path import dirname, join >>> from colour import SpectralShape >>> directory = join(dirname(__file__), "tests", "resources") >>> sd = SpectralDistribution_Sekonic( ... join(directory, "RANDOM_001_02._3262K.csv") ... ) >>> print(sd.read().align(SpectralShape(380, 780, 10))) ... # doctest: +ELLIPSIS Sekonic ======= <BLANKLINE> Path : ... Spectral Quantity : irradiance Reflection Geometry : None Transmission Geometry : None Bandwidth (FWHM) : None Bandwidth Corrected : None <BLANKLINE> Header ------ <BLANKLINE> Manufacturer : Sekonic Catalog Number : None Description : None Document Creator : None Unique Identifier : None Measurement Equipment : None Laboratory : None Report Number : None Report Date : 15/03/2021 3:44:14 p.m. Document Creation Date : None Comments : {...} <BLANKLINE> Spectral Data ------------- <BLANKLINE> [[ 3.80000000e+02 1.69406589e-21] [ 3.90000000e+02 2.11758237e-22] [ 4.00000000e+02 1.19813650e-05] [ 4.10000000e+02 1.97110530e-05] [ 4.20000000e+02 2.99661440e-05] [ 4.30000000e+02 6.38192720e-05] [ 4.40000000e+02 1.68909683e-04] [ 4.50000000e+02 3.31902935e-04] [ 4.60000000e+02 3.33143020e-04] [ 4.70000000e+02 2.30227481e-04] [ 4.80000000e+02 1.66981976e-04] [ 4.90000000e+02 1.64439844e-04] [ 5.00000000e+02 2.01534538e-04] [ 5.10000000e+02 2.57840526e-04] [ 5.20000000e+02 3.04612651e-04] [ 5.30000000e+02 3.41368344e-04] [ 5.40000000e+02 3.63639323e-04] [ 5.50000000e+02 3.87050648e-04] [ 5.60000000e+02 4.21619130e-04] [ 5.70000000e+02 4.58150520e-04] [ 5.80000000e+02 5.01176575e-04] [ 5.90000000e+02 5.40883630e-04] [ 6.00000000e+02 5.71256795e-04] [ 6.10000000e+02 5.83703280e-04] [ 6.20000000e+02 5.57688472e-04] [ 6.30000000e+02 5.17328095e-04] [ 6.40000000e+02 4.39994939e-04] [ 6.50000000e+02 3.62766819e-04] [ 6.60000000e+02 2.96465587e-04] [ 6.70000000e+02 2.43966802e-04] [ 6.80000000e+02 2.04134776e-04] [ 6.90000000e+02 1.75304012e-04] [ 7.00000000e+02 1.52887544e-04] [ 7.10000000e+02 1.29795619e-04] [ 7.20000000e+02 1.03122693e-04] [ 7.30000000e+02 8.77607820e-05] [ 7.40000000e+02 7.61524130e-05] [ 7.50000000e+02 7.06516880e-05] [ 7.60000000e+02 3.72199210e-05] [ 7.70000000e+02 3.63058860e-05] [ 7.80000000e+02 3.55755470e-05]] >>> sd.header.comments # doctest: +SKIP >>> sd.metadata.keys() # doctest: +SKIP >>> sd.write(join(directory, "RANDOM_001_02._3262K.spdx")) ... # doctest: +SKIP """ _DELIMITER: str = "," _SPECTRAL_SECTION: str = "380" _SPECTRAL_DATA_PATTERN: str = "Spectral Data (\\d{3})\\[nm\\]"
[docs] def __init__(self, path: str, **kwargs: Any) -> None: super().__init__(path, **kwargs)
[docs] def __str__(self) -> str: """ Return a formatted string representation of the *Sekonic* spectral distribution. Returns ------- :class:`str` Formatted string representation. Examples -------- >>> from os.path import dirname, join >>> from colour import SpectralShape >>> directory = join(dirname(__file__), "tests", "resources") >>> sd = SpectralDistribution_UPRTek( ... join(directory, "ESPD2021_0104_231446.xls") ... ) >>> print(sd.read().align(SpectralShape(380, 780, 10))) ... # doctest: +ELLIPSIS UPRTek ====== <BLANKLINE> Path : ... Spectral Quantity : irradiance Reflection Geometry : None Transmission Geometry : None Bandwidth (FWHM) : None Bandwidth Corrected : None <BLANKLINE> Header ------ <BLANKLINE> Manufacturer : UPRTek Catalog Number : None Description : None Document Creator : None Unique Identifier : None Measurement Equipment : CV600 Laboratory : None Report Number : None Report Date : 2021/01/04_23:14:46 Document Creation Date : None Comments : {...} <BLANKLINE> Spectral Data ------------- <BLANKLINE> [[ 3.80000000e+02 3.02670000e-02] [ 3.90000000e+02 3.52230000e-02] [ 4.00000000e+02 1.93250000e-02] [ 4.10000000e+02 2.94260000e-02] [ 4.20000000e+02 8.76780000e-02] [ 4.30000000e+02 6.32578000e-01] [ 4.40000000e+02 3.62565900e+00] [ 4.50000000e+02 1.42069180e+01] [ 4.60000000e+02 1.70112970e+01] [ 4.70000000e+02 1.19673130e+01] [ 4.80000000e+02 8.42736200e+00] [ 4.90000000e+02 7.97729800e+00] [ 5.00000000e+02 8.71903600e+00] [ 5.10000000e+02 9.55321500e+00] [ 5.20000000e+02 9.90610500e+00] [ 5.30000000e+02 9.91394400e+00] [ 5.40000000e+02 9.74738000e+00] [ 5.50000000e+02 9.53404900e+00] [ 5.60000000e+02 9.27392200e+00] [ 5.70000000e+02 9.02323400e+00] [ 5.80000000e+02 8.91788800e+00] [ 5.90000000e+02 9.11454600e+00] [ 6.00000000e+02 9.55787100e+00] [ 6.10000000e+02 1.00600760e+01] [ 6.20000000e+02 1.04846200e+01] [ 6.30000000e+02 1.05679540e+01] [ 6.40000000e+02 1.04359870e+01] [ 6.50000000e+02 9.82122300e+00] [ 6.60000000e+02 8.77578300e+00] [ 6.70000000e+02 7.56471800e+00] [ 6.80000000e+02 6.29808600e+00] [ 6.90000000e+02 5.15623400e+00] [ 7.00000000e+02 4.05390600e+00] [ 7.10000000e+02 3.06638600e+00] [ 7.20000000e+02 2.19250000e+00] [ 7.30000000e+02 1.53922800e+00] [ 7.40000000e+02 1.14938200e+00] [ 7.50000000e+02 9.05095000e-01] [ 7.60000000e+02 6.90947000e-01] [ 7.70000000e+02 5.08426000e-01] [ 7.80000000e+02 4.11766000e-01]] """ representation = super().__str__() return representation.replace( "UPRTek\n======", "Sekonic\n=======", )
[docs] def read(self) -> SpectralDistribution_Sekonic: """ Read and parses the spectral data from a given *Sekonic* *Pseudo-XLS* file. Returns ------- :class:`colour.SpectralDistribution_Sekonic` *Sekonic* spectral distribution. Examples -------- >>> from os.path import dirname, join >>> from colour import SpectralShape >>> directory = join(dirname(__file__), "tests", "resources") >>> sd = SpectralDistribution_Sekonic( ... join(directory, "RANDOM_001_02._3262K.csv") ... ) >>> print(sd.read().align(SpectralShape(380, 780, 10))) ... # doctest: +ELLIPSIS Sekonic ======= <BLANKLINE> Path : ... Spectral Quantity : irradiance Reflection Geometry : None Transmission Geometry : None Bandwidth (FWHM) : None Bandwidth Corrected : None <BLANKLINE> Header ------ <BLANKLINE> Manufacturer : Sekonic Catalog Number : None Description : None Document Creator : None Unique Identifier : None Measurement Equipment : None Laboratory : None Report Number : None Report Date : 15/03/2021 3:44:14 p.m. Document Creation Date : None Comments : {...} <BLANKLINE> Spectral Data ------------- <BLANKLINE> [[ 3.80000000e+02 1.69406589e-21] [ 3.90000000e+02 2.11758237e-22] [ 4.00000000e+02 1.19813650e-05] [ 4.10000000e+02 1.97110530e-05] [ 4.20000000e+02 2.99661440e-05] [ 4.30000000e+02 6.38192720e-05] [ 4.40000000e+02 1.68909683e-04] [ 4.50000000e+02 3.31902935e-04] [ 4.60000000e+02 3.33143020e-04] [ 4.70000000e+02 2.30227481e-04] [ 4.80000000e+02 1.66981976e-04] [ 4.90000000e+02 1.64439844e-04] [ 5.00000000e+02 2.01534538e-04] [ 5.10000000e+02 2.57840526e-04] [ 5.20000000e+02 3.04612651e-04] [ 5.30000000e+02 3.41368344e-04] [ 5.40000000e+02 3.63639323e-04] [ 5.50000000e+02 3.87050648e-04] [ 5.60000000e+02 4.21619130e-04] [ 5.70000000e+02 4.58150520e-04] [ 5.80000000e+02 5.01176575e-04] [ 5.90000000e+02 5.40883630e-04] [ 6.00000000e+02 5.71256795e-04] [ 6.10000000e+02 5.83703280e-04] [ 6.20000000e+02 5.57688472e-04] [ 6.30000000e+02 5.17328095e-04] [ 6.40000000e+02 4.39994939e-04] [ 6.50000000e+02 3.62766819e-04] [ 6.60000000e+02 2.96465587e-04] [ 6.70000000e+02 2.43966802e-04] [ 6.80000000e+02 2.04134776e-04] [ 6.90000000e+02 1.75304012e-04] [ 7.00000000e+02 1.52887544e-04] [ 7.10000000e+02 1.29795619e-04] [ 7.20000000e+02 1.03122693e-04] [ 7.30000000e+02 8.77607820e-05] [ 7.40000000e+02 7.61524130e-05] [ 7.50000000e+02 7.06516880e-05] [ 7.60000000e+02 3.72199210e-05] [ 7.70000000e+02 3.63058860e-05] [ 7.80000000e+02 3.55755470e-05]] """ super().read() self.header.report_date = self._metadata.get("Date Saved") self.header.manufacturer = "Sekonic" return self