Source code for exosim.plots.ndrsPlotter

import os
from typing import Tuple

import astropy.units as u
import h5py
import matplotlib.pyplot as plt
import numpy as np

import exosim.log as log
from exosim.utils.ascii_arts import observatory


[docs]class NDRsPlotter(log.Logger): """ Sub-Exposures plotter. This class handles the methods to plot all the sub-exposures produced by `ExoSim`. Examples ---------- The following example, given the `test_file.h5` preoduced by Exosim, plots the sub-exposures stores the figures in the indicated folder. >>> from exosim.plots import SubExposuresPlotter >>> subExposuresPlotter = SubExposuresPlotter(input='./test_ndr.h5') >>> subExposuresPlotter.plot('plots/') """ def __init__(self, input: str) -> None: """ Parameters ---------- input: str input data """ self.set_log_name() self.graphics(observatory) self.input = input self.announce("started")
[docs] def plot(self, out_dir: str) -> None: """It iterates over the channels and plot the ndrs. Parameters ---------- out_dir : str output directory """ """ """ if not os.path.exists(out_dir): os.makedirs(out_dir) with h5py.File(self.input, "r") as f: ch_list = list(f["channels"].keys()) ch_list.sort() for ch in ch_list: self.info("plotting {}".format(ch)) exposures, time_line, n_groups_per_ramp = self.load_ndrs(ch, f) for i in range(n_groups_per_ramp): self.plot_NDRs(exposures, time_line, i, ch, out_dir)
[docs] def plot_NDRs( self, ndrs: np.ndarray, time_line: u.Quantity, i: int, ch: str, out_dir: str, ) -> None: """It plots the ndrs for a given channel. Parameters ---------- ndrs : np.ndarray ndrs array time_line : u.Quantity temporal array i : int index of ndr to plot ch : str channel name out_dir : str output directory name """ t = time_line[i] size_x = ndrs[i].shape[1] size_y = ndrs[i].shape[0] size_y_fig = 10 size_x_fig = (size_y_fig * size_y / size_x) * 1.2 fig, ax0 = plt.subplots( constrained_layout=True, dpi=300, figsize=(size_y_fig, size_x_fig) ) if t < 0.01 * u.hr: t = t.to(u.s) t_str = "{:.3f} {}".format(t.value, t.unit) if t < 0.01 * u.s: t_str = "{:.2e} {}".format(t.value, t.unit) ax0.set_title("{} - num {} - time {}".format(ch, i, t_str)) im = ax0.imshow(ndrs[i], interpolation="none") plt.colorbar(im, ax=ax0) fname = os.path.join(out_dir, "{}_ndrs_{}.png".format(ch, i)) fig.savefig(fname, format="png", dpi=300) self.info("plot saved in {}".format(i))
[docs] def load_ndrs( self, ch: str, f: h5py.File ) -> Tuple[np.ndarray, u.Quantity, int]: """ It loads the channel NDRs from the input file: Parameters ---------- ch: str channel name file: :class:`h5py.File` input file Returns ------- :class:`numpy.ndarray` NDR :class:`astropy.units.Quantity` time line int number of groups per ramp """ file_path = os.path.join("channels/", ch) se = f[os.path.join(file_path, "NDRs")] ndrs = se["data"] time_line = se["time"][()] * u.Unit( se["time_units"][()].decode("utf-8") ) n_groups_per_ramp = se["metadata"]["n_groups_per_ramp"][()] self.debug("NDRs loaded from {}".format(ch)) return ndrs, time_line, n_groups_per_ramp