Source code for lasy.profiles.from_insight_file
import h5py
import numpy as np
from scipy.constants import c
from .from_array_profile import FromArrayProfile
[docs]
class FromInsightFile(FromArrayProfile):
r"""
Profile defined from insight measurement.
Parameters
----------
file_path : string
Path to the file created by INSIGHT that contains the full field (e.g. Exyt_0.h5)
pol : list of 2 complex numbers (dimensionless)
Polarization vector. It corresponds to :math:`p_u` in the above
formula ; :math:`p_x` is the first element of the list and
:math:`p_y` is the second element of the list. Using complex
numbers enables elliptical polarizations.
omega0 : string or float
Set the central frequency for the envelope construction. Can be a float value
in [rad/s], or a string defining the method for automatic frequency detection:
"barycenter" frequency is averaged over the power profile, "peak" frequency
corresponding to the location of the maximum of the on-axis spectrum.
"""
def __init__(self, file_path, pol, omega0="barycenter"):
# read the data from H5 filed
with h5py.File(file_path, "r") as hf:
data = np.asanyarray(hf["data/Exyt_0"][()], dtype=np.complex128, order="C")
t = np.asanyarray(hf["scales/t"][()], dtype=np.float64, order="C")
x = np.asanyarray(hf["scales/x"][()], dtype=np.float64, order="C")
y = np.asanyarray(hf["scales/y"][()], dtype=np.float64, order="C")
# convert data and axes to SI units
t *= 1e-15
x *= 1e-3
y *= 1e-3
# get the field on axis and local frequencies
field_onaxis = data[data.shape[0] // 2, data.shape[1] // 2, :]
omega_array = -np.gradient(np.unwrap(np.angle(field_onaxis)), t)
# choose the central frequency
if omega0 == "peak":
# using peak field frequency
omega0 = omega_array[np.abs(field_onaxis).argmax()]
elif omega0 == "barycenter":
# or "center of mass" frequency
omega0 = np.average(omega_array, weights=np.abs(field_onaxis) ** 2)
else:
assert isinstance(omega0, float)
# check the complex field convention and correct if needed
if omega0 < 0:
omega0 *= -1
data = np.conj(data)
print("Warning: input field will be conjugated")
# remove the envelope frequency
data *= np.exp(1j * omega0 * t[None, None, :])
# created LASY profile using FromArrayProfile class
wavelength = 2 * np.pi * c / omega0
dim = "xyt"
axes = {"x": x, "y": y, "t": t}
super().__init__(
wavelength=wavelength,
pol=pol,
array=data,
dim=dim,
axes=axes,
axes_order=["x", "y", "t"],
)