Source code for autocti.dataset_1d.plot.fit_plotters
import numpy as np
from typing import Callable, Optional
import autoarray.plot as aplt
from autoarray.plot.auto_labels import AutoLabels
from autocti.plot.abstract_plotters import Plotter
from autocti.dataset_1d.fit import FitDataset1D
[docs]class FitDataset1DPlotter(Plotter):
def __init__(
self,
fit: FitDataset1D,
mat_plot_1d: aplt.MatPlot1D = aplt.MatPlot1D(),
visuals_1d: aplt.Visuals1D = aplt.Visuals1D(),
include_1d: aplt.Include1D = aplt.Include1D(),
):
"""
Plots the attributes of `FitDataset1D` objects using the matplotlib method `line()` and many other matplotlib
functions which customize the plot's appearance.
The `mat_plot_1d` attribute wraps matplotlib function calls to make the figure. By default, the settings
passed to every matplotlib function called are those specified in the `config/visualize/mat_wrap/*.ini` files,
but a user can manually input values into `MatPlot1d` to customize the figure's appearance.
Overlaid on the figure are visuals, contained in the `Visuals1D` object. Attributes may be extracted from
the `Imaging` and plotted via the visuals object, if the corresponding entry is `True` in the `Include1D`
object or the `config/visualize/include.ini` file.
Parameters
----------
fit
The fit to the dataset of a 1D dataset the plotter plots.
mat_plot_1d
Contains objects which wrap the matplotlib function calls that make 1D plots.
visuals_1d
Contains 1D visuals that can be overlaid on 1D plots.
include_1d
Specifies which attributes of the `ImagingCI` are extracted and plotted as visuals for 1D plots.
"""
self.fit = fit
super().__init__(
dataset=fit.dataset,
mat_plot_1d=mat_plot_1d,
include_1d=include_1d,
visuals_1d=visuals_1d,
)
def get_visuals_1d(self) -> aplt.Visuals1D:
return self.visuals_1d
@property
def extract_region_from(self) -> Callable:
return self.fit.dataset.layout.extract_region_from
[docs] def figures_1d(
self,
region: Optional[str] = None,
data: bool = False,
data_logy: bool = False,
noise_map: bool = False,
signal_to_noise_map: bool = False,
pre_cti_data: bool = False,
post_cti_data: bool = False,
residual_map: bool = False,
residual_map_logy: bool = False,
normalized_residual_map: bool = False,
chi_squared_map: bool = False,
):
"""
Plots the individual attributes of the plotter's `FitDataset1D` object in 1D.
The API is such that every plottable attribute of the `FitDataset1D` object is an input parameter of type bool
of the function, which if switched to `True` means that it is plotted.
Parameters
----------
region
The region on the 1D dataset where data is extracted and binned {fpr", "eper"}
data
Whether to make a 1D plot (via `plot`) of the image data extracted and binned over the region, with the
noise-map values included as error bars.
data_logy
Whether to make a 1D plot (via `plot`) of the image data extracted and binned over the region, with the
noise-map values included as error bars and the y-axis on a log10 scale.
noise_map
Whether to make a 1D plot (via `plot`) of the noise map.
signal_to_noise_map
Whether to make a 1D plot (via `plot`) of the signal-to-noise map.
pre_cti_data
Whether to make a 1D plot (via `plot`) of the pre-cti data.
post_cti_data
Whether to make a 1D plot (via `plot`) of the post-cti data.
residual_map
Whether to make a 1D plot (via `plot`) of the residual map, with the noise-map values included as error
bars.
residual_map_logy
Whether to make a 1D plot (via `plot`) of the residual map, with the noise-map values included as error
bars and the y-axis on a log10 scale.
normalized_residual_map
Whether to make a 1D plot (via `plot`) of the normalized residual map.
chi_squared_map
Whether to make a 1D plot (via `plot`) of the chi-squared map.
"""
suffix = f"_{region}" if region is not None else ""
title_str = self.title_str_from(region=region)
y_errors = self.extract_region_from(array=self.fit.noise_map, region=region)
y_extra = self.extract_region_from(array=self.fit.model_data, region=region)
should_plot_zero = self.should_plot_zero_from(region=region)
if data:
y = self.extract_region_from(array=self.fit.data, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
plot_axis_type_override="errorbar",
y_errors=y_errors,
y_extra=y_extra,
should_plot_zero=should_plot_zero,
text_manual_dict=self.text_manual_dict_from(region=region),
text_manual_dict_y=self.text_manual_dict_y_from(region=region),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title=f"Data {title_str}",
yunit="e-",
filename=f"data{suffix}",
),
)
if data_logy:
y = self.extract_region_from(array=self.fit.data, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
plot_axis_type_override="errorbar_logy",
y_errors=y_errors,
y_extra=y_extra,
text_manual_dict=self.text_manual_dict_from(region=region),
text_manual_dict_y=self.text_manual_dict_y_from(region=region),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title=f"Data {title_str} [log10]",
yunit="e-",
filename=f"data_logy{suffix}",
),
)
if noise_map:
y = self.extract_region_from(array=self.fit.noise_map, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title="Noise-Map",
yunit="e-",
filename=f"noise_map{suffix}",
),
)
if signal_to_noise_map:
y = self.extract_region_from(
array=self.fit.signal_to_noise_map, region=region
)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title="Signal-To-Noise Map",
yunit="",
filename=f"signal_to_noise_map{suffix}",
),
)
if residual_map:
y = self.extract_region_from(array=self.fit.residual_map, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
plot_axis_type_override="errorbar",
y_errors=y_errors,
should_plot_zero=should_plot_zero,
text_manual_dict=self.text_manual_dict_from(region=region),
text_manual_dict_y=self.text_manual_dict_y_from(region=region),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title=f"Residual Map {title_str}",
yunit="e-",
filename=f"residual_map{suffix}",
),
)
if residual_map_logy:
y = self.extract_region_from(array=self.fit.residual_map, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
plot_axis_type_override="errorbar_logy",
y_errors=y_errors,
y_extra=1.0001 * np.zeros(shape=y.shape),
text_manual_dict=self.text_manual_dict_from(region=region),
text_manual_dict_y=self.text_manual_dict_y_from(region=region),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title=f"Residual Map {title_str}",
ylabel="e-",
filename=f"residual_map_logy{suffix}",
),
)
if normalized_residual_map:
y = self.extract_region_from(
array=self.fit.normalized_residual_map, region=region
)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title="Normalized Residual Map",
yunit=r"\sigma",
filename=f"normalized_residual_map{suffix}",
),
)
if chi_squared_map:
y = self.extract_region_from(array=self.fit.chi_squared_map, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title="Chi-Squared Map",
yunit=r"\chi^2",
filename=f"chi_squared_map{suffix}",
),
)
if pre_cti_data:
y = self.extract_region_from(array=self.fit.pre_cti_data, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title="Pre CTI Data",
yunit="e-",
filename=f"pre_cti_data{suffix}",
),
)
if post_cti_data:
y = self.extract_region_from(array=self.fit.post_cti_data, region=region)
self.mat_plot_1d.plot_yx(
y=y,
x=range(len(y)),
visuals_1d=self.get_visuals_1d(),
auto_labels=AutoLabels(
title="CI Post CTI Image",
yunit="e-",
filename=f"post_cti_data{suffix}",
),
)
[docs] def subplot(
self,
data: bool = False,
noise_map: bool = False,
signal_to_noise_map: bool = False,
pre_cti_data: bool = False,
post_cti_data: bool = False,
residual_map: bool = False,
normalized_residual_map: bool = False,
chi_squared_map: bool = False,
auto_filename="subplot_fit",
**kwargs,
):
"""
Plots the individual attributes of the plotter's `FitDataset1D` object in 1D on a subplot.
The API is such that every plottable attribute of the `FitDataset1D` object is an input parameter of type bool
of the function, which if switched to `True` means that it is included on the subplot.
Parameters
----------
data
Whether to make a 1D plot (via `plot`) of the image data extracted and binned over the region, with the
noise-map values included as error bars.
noise_map
Whether to include a 1D plot (via `plot`) of the noise map.
signal_to_noise_map
Whether to include a 1D plot (via `plot`) of the signal-to-noise map.
pre_cti_data
Whether to include a 1D plot (via `plot`) of the pre-cti data.
post_cti_data
Whether to include a 1D plot (via `plot`) of the post-cti data.
residual_map
Whether to include a 1D plot (via `plot`) of the residual map.
normalized_residual_map
Whether to include a 1D plot (via `plot`) of the normalized residual map.
chi_squared_map
Whether to include a 1D plot (via `plot`) of the chi-squared map.
"""
region = kwargs.get("region", None)
suffix = f"_{region}" if region is not None else ""
self._subplot_custom_plot(
data=data,
noise_map=noise_map,
signal_to_noise_map=signal_to_noise_map,
pre_cti_data=pre_cti_data,
post_cti_data=post_cti_data,
residual_map=residual_map,
normalized_residual_map=normalized_residual_map,
chi_squared_map=chi_squared_map,
auto_labels=AutoLabels(
yunit="e-",
xlabel="Pixel No.",
filename=f"{auto_filename}{suffix}",
),
)
[docs] def subplot_fit(self, region: Optional[str] = None):
"""
Standard subplot of the attributes of the plotter's `FitDataset1D` object.
"""
return self.subplot(
region=region,
data=True,
signal_to_noise_map=True,
pre_cti_data=True,
post_cti_data=True,
normalized_residual_map=True,
chi_squared_map=True,
)