diff --git a/src/scgenerator/const.py b/src/scgenerator/const.py index a8e391d..bcbadaf 100644 --- a/src/scgenerator/const.py +++ b/src/scgenerator/const.py @@ -1,4 +1,4 @@ -__version__ = "0.1.1dev" +__version__ = "0.1.2dev" from typing import Any diff --git a/src/scgenerator/defaults.py b/src/scgenerator/defaults.py index d3fed53..a1dfdec 100644 --- a/src/scgenerator/defaults.py +++ b/src/scgenerator/defaults.py @@ -20,6 +20,7 @@ default_parameters = dict( shape="gaussian", frep=40e6, behaviors=["spm", "ss"], + noise_correlation=0, raman_type="agrawal", parallel=True, repeat=1, diff --git a/src/scgenerator/initialize.py b/src/scgenerator/initialize.py index 423390f..dad4a43 100644 --- a/src/scgenerator/initialize.py +++ b/src/scgenerator/initialize.py @@ -81,7 +81,9 @@ class Params(BareParams): # Technical noise if self.intensity_noise is not None and self.intensity_noise > 0: - delta_int, delta_T0 = pulse.technical_noise(self.intensity_noise) + delta_int, delta_T0 = pulse.technical_noise( + self.intensity_noise, self.noise_correlation + ) self.peak_power *= delta_int self.t0 *= delta_T0 self.width *= delta_T0 @@ -203,7 +205,7 @@ class Config(BareConfig): if self.loss == "capillary": for param in ["core_radius", "he_mode"]: self.get_fiber(param) - for param in ["length", "input_transmission"]: + for param in ["length", "input_transmission", "n2"]: self.get(param) def gas_consistency(self): @@ -244,6 +246,7 @@ class Config(BareConfig): "interpolation_degree", "ideal_gas", "recovery_last_stored", + "noise_correlation", ]: self.get(param) diff --git a/src/scgenerator/physics/pulse.py b/src/scgenerator/physics/pulse.py index 63cc9e3..7f9dab0 100644 --- a/src/scgenerator/physics/pulse.py +++ b/src/scgenerator/physics/pulse.py @@ -139,6 +139,7 @@ def modify_field_ratio( target_power: float = None, target_energy: float = None, intensity_noise: float = None, + noise_correlation: float = None, ) -> float: """multiply a field by this number to get the desired effects @@ -165,7 +166,7 @@ def modify_field_ratio( ratio *= np.sqrt(target_power / abs2(field).max()) if intensity_noise is not None: - d_int, _ = technical_noise(intensity_noise) + d_int, _ = technical_noise(intensity_noise, noise_correlation) ratio *= np.sqrt(d_int) return ratio @@ -318,6 +319,7 @@ def setup_custom_field(params: BareParams) -> bool: params.peak_power, params.energy, params.intensity_noise, + params.noise_correlation, ) width, peak_power, energy = measure_field(params.t, field_0) else: @@ -374,7 +376,7 @@ def pulse_energy_with_loss(spectrum, dw, alpha, h) -> float: return np.sum(spec2 * dw) - h * np.sum(alpha * spec2 * dw) -def technical_noise(rms_noise, relative_factor=0.4): +def technical_noise(rms_noise, noise_correlation=-0.4): """ To implement technical noise as described in Grenier2019, we need to know the noise properties of the laser, summarized into the RMS amplitude noise @@ -391,7 +393,7 @@ def technical_noise(rms_noise, relative_factor=0.4): delta_T0 : float """ psy = np.random.normal(1, rms_noise) - return psy, 1 - relative_factor * (psy - 1) + return psy, 1 + noise_correlation * (psy - 1) def shot_noise(w_c, w0, T, dt): diff --git a/src/scgenerator/utils/parameter.py b/src/scgenerator/utils/parameter.py index 338840d..37ba1f9 100644 --- a/src/scgenerator/utils/parameter.py +++ b/src/scgenerator/utils/parameter.py @@ -392,6 +392,7 @@ class BareParams: shape: str = Parameter(literal("gaussian", "sech")) wavelength: float = Parameter(in_range_incl(100e-9, 3000e-9), display_info=(1e9, "nm")) intensity_noise: float = Parameter(in_range_incl(0, 1), display_info=(1e2, "%")) + noise_correlation: float = Parameter(in_range_incl(-10, 10)) width: float = Parameter(in_range_excl(0, 1e-9), display_info=(1e15, "fs")) t0: float = Parameter(in_range_excl(0, 1e-9), display_info=(1e15, "fs"))