Source code for exosim.tasks.detector.addReadNoise
from copy import deepcopy
import numpy as np
from exosim.output import Output
from exosim.tasks.task import Task
from exosim.utils import RunConfig
from exosim.utils.checks import check_units
from exosim.utils.iterators import iterate_over_chunks
[docs]class AddNormalReadNoise(Task):
"""
This Task simulates the read noise as a normal distribution which parameters can be defined in the configuration file.
If it is not explicitly stated, the distribution mean is set to 0.
A different realisation of the same distribution is added to each pixel of each sub-exposure.
If an output group is provided, it saves all the random seeds used.
Notes
-----
This is a default class with standardised inputs and outputs.
The user can load this class and overwrite the "model" method
to implement a custom Task to replace this.
"""
def __init__(self):
"""
Parameters
----------
subexposures: :class:`~exosim.models.signal.Counts`
sub-exposures cached signal
parameters: dict
channel parameters dictionary
output: :class:`~exosim.output.output.Output` (optional)
output file
"""
self.add_task_param("subexposures", "sub-exposures cached signal")
self.add_task_param("parameters", "channel parameters dictionary")
self.add_task_param("output", "output file", None)
[docs] def execute(self):
self.info("adding read noise")
subexposures = self.get_task_param("subexposures")
parameters = self.get_task_param("parameters")
output = self.get_task_param("output")
read_noise_sigma = parameters["detector"]["read_noise_sigma"].astype(
np.float64
)
read_noise_sigma = check_units(read_noise_sigma, "ct").value
random_seeds = []
for chunk in iterate_over_chunks(
subexposures.dataset, desc="adding read noise"
):
data = deepcopy(subexposures.dataset[chunk])
subexposures.dataset[chunk] = (
data
+ RunConfig.random_generator.normal(
0, read_noise_sigma, data.shape
).astype(np.float64)
)
subexposures.output.flush()
random_seeds.append(RunConfig.random_seed)
if output:
if issubclass(output.__class__, Output):
out_grp = output.create_group("read noise")
out_grp.write_list("random_seed", random_seeds)
out_grp.write_array(
"chunks_index", np.arange(len(random_seeds))
)