Source code for swot_simulator.error.karin
# Copyright (c) 2021 CNES/JPL
#
# All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
"""
Karin noise
-----------
"""
from typing import Dict
import logging
import numpy as np
from .. import random_signal, settings
#: Logger of this module
LOGGER = logging.getLogger(__name__)
[docs]class Karin:
"""Karin instrumental error computed from random realization.
Args:
parameters (settings.Parameters): Simulation settings
"""
[docs] def __init__(self, parameters: settings.Parameters) -> None:
assert parameters.karin_noise is not None
LOGGER.info("Initialize karin noise")
# Store the generation parameters of the random signal.
self.hsdt, self.x_ac, self.swh = random_signal.read_file_karin(
parameters.karin_noise)
self.size_grid = (parameters.delta_ac * parameters.delta_al)**0.5
# Hack for unsmoothed products at high resolution
if self.size_grid < 1:
self.size_grid *= 8 / (40**.5)
[docs] def generate(self, seed: int, x_al: np.ndarray, x_ac: np.ndarray,
swh: np.ndarray) -> Dict[str, np.ndarray]:
"""Generate the karin noise.
Args:
seed (int): Random seed used to initialize the pseudo-random
number generator.
x_al (numpy.ndarray): Along track distance
x_ac (numpy.ndarray): Across track distance
swh (numpy.ndarray): Significant wave height. Used to modulate
instrumental noise as a function of sea state.
Returns:
dict: variable name and errors simulated.
"""
num_pixels = x_ac.shape[0]
num_lines = x_al.shape[0]
# Generate random noise for left and right part of the mast
rng = np.random.default_rng(seed=seed)
a_karin = rng.normal(0, 1, (num_lines, num_pixels))
# Formula of karin noise as a function of x_ac (smile shape)
sigma_karin = random_signal.interpolate_file_karin(
swh, x_ac, self.hsdt, self.x_ac, self.swh) / self.size_grid
# Compute random karin error
return {"simulated_error_karin": sigma_karin * a_karin}