pyLaserPulse.base_components

Created on Mon Nov 23 15:41:17 2020

@author: james feehan

Module of base classes for optical components.

Classes

component(loss, transmission_bandwidth, ...)

Base class for defining optical components.

fibre_component(g, input_fibre, ...[, ...])

Base class for fibre components.

fibre_pulse_picker(g, input_fibre, ...[, ...])

Base class for fibre pulse pickers (e.g., EOMs and AOMs).

grating_compressor(loss, ...[, order, ...])

Compressor class.

photonic_crystal_active_fibre(g, length, ...)

Class for photonic crystal active fibres.

photonic_crystal_passive_fibre(g, length, ...)

Base class for passive photonic crystal fibres.

pulse_picker(loss, transmission_bandwidth, ...)

Class for AOMs, EOMs and, assuming the input repetition rate is low enough and only one pulse is let through, choppers as well.

rotated_splice(rotation_angle)

Class for simulating a splice between PM fibres where the stress rods are rotated through rotation_angle.

step_index_active_fibre(g, length, ...[, ...])

Class for step-index active fibres.

step_index_fibre_compressor(g, length, ...)

Single mode fibre compressor class.

step_index_passive_fibre(g, length, ...[, ...])

Base class for passive step index fibres.

class pyLaserPulse.base_components.step_index_passive_fibre(g, length, loss_file, Raman_file, core_diam, NA, beat_length, n2, fR, tol, Sellmeier_file, verbose=False)

Base class for passive step index fibres.

Contains all methods and members required to simulate single-mode pulse propagation in passive optical fibre.

self.get_signal_propagation_parameters overides the same method in bases.fibre_base and is specific to step-index passive fibres. It is based on:

D. Gloge, “Weakly guiding fibres”, Applied Optics 10(10), pp 2252–2258 (1971)

__init__(g, length, loss_file, Raman_file, core_diam, NA, beat_length, n2, fR, tol, Sellmeier_file, verbose=False)
Parameters:
  • g (pyLaserPulse.grid.grid object)

  • length (float) – Fibre length in m

  • loss_file (string) – Absolute path to the fibre loss as a function of wavelength. See pyLaserPulse.data.paths.materials.loss_spectra

  • Raman_file (string) – Absolute path to the Raman response as a function of time. See pyLaserPulse.data.paths.materials.Raman_profiles

  • core_diam (float) – Core diameter in m

  • NA (float) – Numerical aperture

  • beat_length (float) – Polarization beat length in m

  • n2 (float) – Nonlinear index in m^2 / W

  • fR (float) – Fractional Raman contribution to the fibre nonlinear response (e.g., fR = 0.18 for silica)

  • tol (float) – Maximum propagation error used to adjust the proapgation step size

  • Sellmeier_file (string) – Absolute path to the Sellmeier coefficients. See pyLaserPulse.data.paths.materials.Sellmeier_coefficients.

  • verbose (bool) – Print information to terminal if True

get_propagation_parameters()

Calculate NA, V, beta_2, D, effective_MFD, signal_mode_area, gamma

Notes

D. Gloge, “Weakly guiding fibres”, Applied Optics 10(10), pp 2252–2258 (1971)

class pyLaserPulse.base_components.photonic_crystal_passive_fibre(g, length, loss_file, Raman_file, hole_pitch, hole_diam_over_pitch, beat_length, n2, fR, tol, Sellmeier_file, core_diam=None, verbose=False)

Base class for passive photonic crystal fibres.

Contains all methods and members required to simulate single-mode pulse propagation in passive optical fibre.

self.get_signal_propagation_parameters overides the same method in bases.fibre_base and is specific to hexagonal-lattice photonic crystal passive fibres. It is based on:

K. Saitoh et al., “Empirical relations for simple design of photonic crystal fibres”, Opt. Express 13(1), 267–274 (2005).

__init__(g, length, loss_file, Raman_file, hole_pitch, hole_diam_over_pitch, beat_length, n2, fR, tol, Sellmeier_file, core_diam=None, verbose=False)
Parameters:
  • g (pyLaserPulse.grid.grid object)

  • length (float) – Fibre length in m

  • loss_file (string) – Absolute path to the fibre loss as a function of wavelength. See pyLaserPulse.data.paths.materials.loss_spectra

  • Raman_file (string) – Absolute path to the Raman response as a function of time. See pyLaserPulse.data.paths.materials.Raman_profiles

  • hole_pitch (float) – Separation of neighbouring air holes in the hexagonal-lattice PCF structure.

  • hole_diam_over_pitch (float) – Ratio of the air hole diameter to the hole pitch.

  • beat_length (float) – Polarization beat length in m

  • n2 (float) – Nonlinear index in m^2 / W

  • fR (float) – Fractional Raman contribution to the fibre nonlinear response (e.g., fR = 0.18 for silica)

  • tol (float) – Maximum propagation error used to adjust the proapgation step size

  • Sellmeier_file (string) – Absolute path to the Sellmeier coefficients. See pyLaserPulse.data.paths.materials.Sellmeier_coefficients.

  • core_diam (Nonetype or float) – Diameter of the signal core in metres. If None, the standard value is used for hexagonal-lattice PCF, where the core is made up of a single missing air hole.

  • verbose (bool) – Print information to terminal if True

get_propagation_parameters(lambda_window, grid_midpoint, omega_window)

Calculate signal_ref_index, D, beta_2, effective_MFD, signal_mode_area, gamma

Parameters:
  • lambda_window (numpy array) – Wavelength grid in m. See pyLaserPulse.grid.grid.lambda_window

  • grid_midpoint (int) – Middle index of the time-frequency grid. See pyLaserPulse.grid.grid.midpoint

  • omega_window (numpy array) – Angular frequency grid in rad Hz. See pyLaserPulse.grid.grid.omega_window

Returns:

  • numpy array – V-number as a function of wavelength

  • numpy array – Refractive index as a function of wavelength

  • numpy array – Fibre dispersion in ps / (nm km)

  • numpy array – Fibre dispersion in s^2 / m

class pyLaserPulse.base_components.step_index_active_fibre(g, length, loss_file, Raman_file, core_diam, NA, beat_length, n2, fR, tol, doping_concentration, cross_section_file, seed_repetition_rate, pump_points, ASE_wl_lims, Sellmeier_file, boundary_conditions, lifetime=0.0015, cladding_pumping={}, time_domain_gain=False, verbose=False)

Class for step-index active fibres.

__init__(g, length, loss_file, Raman_file, core_diam, NA, beat_length, n2, fR, tol, doping_concentration, cross_section_file, seed_repetition_rate, pump_points, ASE_wl_lims, Sellmeier_file, boundary_conditions, lifetime=0.0015, cladding_pumping={}, time_domain_gain=False, verbose=False)
Parameters:
  • g (pyLaserPulse.grid.grid object)

  • length (float) – Fibre length in m

  • loss_file (string) – Absolute path to the fibre loss as a function of wavelength. See pyLaserPulse.data.paths.materials.loss_spectra

  • Raman_file (string) – Absolute path to the Raman response as a function of time. See pyLaserPulse.data.paths.materials.Raman_profiles

  • core_diam (float) – Core diameter in m

  • NA (float) – Numerical aperture

  • beat_length (float) – Polarization beat length in m

  • n2 (float) – Nonlinear index in m^2 / W

  • fR (float) – Fractional Raman contribution to the fibre nonlinear response (e.g., fR = 0.18 for silica)

  • tol (float) – Maximum propagation error used to adjust the proapgation step size

  • doping_concentration (float) – Number density of the active ions in m^-3

  • cross_section_file (string) – Absolute path to the emission and absorption cross sections as a function of wavelength. See pyLaserPulse.data.paths.fibres.cross_sections.

  • seed_repetition_rate (float) – Repetition rate of the seed laser. See pyLaserPulse.pulse.pulse.repetition_rate

  • pump_points (int) – Number of points in the pump/ASE spectrum window.

  • ASE_wl_lims (list) – [min_wavelength, max_wavelength] for the pump/ASE wavelength window in m.

  • Sellmeier_file (string.) – Absolute path to file containing Sellmeier coefficients for the fibre material. See pyLaserPulse.data.paths.materials.Sellmeier_coefficients.

  • boundary_conditions (dict) – Set the boundary conditions for resolving the evolution of the pump, signal, and ASE light in both directions through the fibre. The type of simulation – i.e., single-pass or full boundary value solver – is determined by this dictionary. See the Notes section below for a full description of how this parameters is defined.

  • lifetime (float) – Upper-state lifetime of the rare-earth dopant in s.

  • cladding_pumping (dict.) –

    Parameters required to define a cladding-pumped fibre. Leave empty if core pumping. Otherwise, the following keys are required:

    pump_core_diamfloat

    Diameter of the pump cladding in m

    pump_delta_nfloat

    Refractive index difference between the fibre coating and the pump cladding (usually n_silica - 1.375)

    pump_cladding_nfloat

    Refractive index of the fibre coating (usually 1.375)

  • time_domain_gain (bool) – True if mixed-domain gain operator (i.e., both frequency- and time-domain gain) is to be used. If False, only frequency- domain gain is simulated.

Notes

The boundary_conditions dictionary accepts the following keys:
co_pump_powerfloat

Power of the co-propagating pump in W

co_pump_wavelengthfloat

Central wavelength of the co-propagating pump in m

co_pump_bandwidthfloat

Bandwidth of the co-propagating pump in m

counter_pump_powerfloat

Power of the counter-propagating pump in W

counter_pump_wavelengthfloat

Central wavelength of the counter-propagating pump in m

counter_pump_bandwidthfloat

Bandwidth of the counter-propagating pump in m

If no counter-pump values are specified, then the propagation is completed in a single step and no effort is made to resolve counter-propagating signals (i.e., the boundary value problem is not solved). This allows for co-pumping only. Example:

boundary_conditions = {

‘co_pump_power’: 1, ‘co_pump_wavelength’: 976e-9, ‘co_pump_bandwidth’: 1e-9}

The boundary value problem is solved whenever dictionary key ‘counter_pump_power’ is present, but it is not necessary to specify the wavelength or bandwidth of either the co- or counter-propagating pump if the power is zero. Here are a few examples of valid boundary_conditions dictionaries:

  1. Co-pumping with full boundary value solver:
    boundary_conditions = {

    ‘co_pump_power’: 1, ‘co_pump_wavelength’: 976e-9, ‘co_pump_bandwidth’: 1e-9, ‘counter_pump_power’: 0}

  2. Bidirectional pumping with full boundary value solver:
    boundary_conditions = {

    ‘co_pump_power’: 1, ‘co_pump_wavelength’: 976e-9, ‘co_pump_bandwidth’: 1e-9, ‘counter_pump_power’: 1, ‘counter_pump_wavelength’: 976e-9, ‘counter_pump_bandwidth’: 1e-9}

  3. Counter-pumping with full boundary value solver:
    boundary_conditions = {

    ‘co_pump_power’: 0, ‘counter_pump_power’: 1, ‘counter_pump_wavelength’: 976e-9, ‘counter_pump_bandwidth’: 1e-9}

static get_pump_and_ASE_propagation_parameters(P_II, lambda_window, core_index, cladding_index, core_diam)
Parameters:
  • P_II (function.) – Petermann_II calculation. Must take V-number as an argument and return the ratio of mode and cladding diameters as a function of wavelength.

  • lambda_window (numpy array) – Wavelength grid in m. See pyLaserPulse.grid.grid.lambda_window

  • core_index (float) – Refractive index of the fibre core.

  • cladding_index (float) – Refractive index of the fibre cladding.

  • core_diam (float) – Diameter of the fibre core in m.

Returns:

  • numpy array – Effective mode field diameter in m as a function of wavelength

  • numpy array – Effective mode field area in m^2 as a fucntion of wavelength.

get_pump_refractive_index()

Calculate the effective refractive index for the pump light.

class pyLaserPulse.base_components.photonic_crystal_active_fibre(g, length, loss_file, Raman_file, hole_pitch, hole_diam_over_pitch, beat_length, n2, fR, tol, doping_concentration, cross_section_file, seed_repetition_rate, pump_points, ASE_wl_lims, Sellmeier_file, boundary_conditions, core_diam=None, lifetime=0.0015, cladding_pumping={}, time_domain_gain=False, verbose=False)

Class for photonic crystal active fibres.

__init__(g, length, loss_file, Raman_file, hole_pitch, hole_diam_over_pitch, beat_length, n2, fR, tol, doping_concentration, cross_section_file, seed_repetition_rate, pump_points, ASE_wl_lims, Sellmeier_file, boundary_conditions, core_diam=None, lifetime=0.0015, cladding_pumping={}, time_domain_gain=False, verbose=False)
Parameters:
  • g (pyLaserPulse.grid.grid object)

  • length (float) – Fibre length in m

  • loss_file (string) – Absolute path to the fibre loss as a function of wavelength. See pyLaserPulse.data.paths.materials.loss_spectra

  • Raman_file (string) – Absolute path to the Raman response as a function of time. See pyLaserPulse.data.paths.materials.Raman_profiles

  • hole_pitch (float) – Separation of neighbouring air holes in the hexagonal-lattice PCF structure.

  • hole_diam_over_pitch (float) – Ratio of the air hole diameter to the hole pitch.

  • beat_length (float) – Polarization beat length in m

  • n2 (float) – Nonlinear index in m^2 / W

  • fR (float) – Fractional Raman contribution to the fibre nonlinear response (e.g., fR = 0.18 for silica)

  • tol (float) – Maximum propagation error used to adjust the proapgation step size

  • doping_concentration (float) – Number density of the active ions in m^-3

  • cross_section_file (string) – Absolute path to the emission and absorption cross sections as a function of wavelength. See pyLaserPulse.data.paths.fibres.cross_sections.

  • seed_repetition_rate (float) – Repetition rate of the seed laser. See pyLaserPulse.pulse.pulse.repetition_rate

  • pump_points (int) – Number of points in the pump/ASE spectrum window.

  • ASE_wl_lims (list) – [min_wavelength, max_wavelength] for the pump/ASE wavelength window in m.

  • Sellmeier_file (string) – Absolute path to the Sellmeier coefficients. See pyLaserPulse.data.paths.materials.Sellmeier_coefficients.

  • boundary_conditions (dict) – Set the boundary conditions for resolving the evolution of the pump, signal, and ASE light in both directions through the fibre. The type of simulation – i.e., single-pass or full boundary value solver – is determined by this dictionary. See the Notes section below for a full description of how this parameters is defined.

  • core_diam (Nonetype or float) – Diameter of the signal core in metres. If None, the standard value is used for hexagonal-lattice PCF, where the core is made up of a single missing air hole.

  • lifetime (float) – Upper-state lifetime of the rare-earth dopant in s.

  • cladding_pumping (dict.) –

    Parameters required to define a cladding-pumped fibre. Leave empty if core pumping. Otherwise, the following keys are required:

    pump_core_diamfloat

    Diameter of the pump cladding in m

    pump_delta_nfloat

    Refractive index difference between the fibre coating and the pump cladding (usually n_silica - 1.375)

    pump_cladding_nfloat

    Refractive index of the fibre coating (usually 1.375)

  • time_domain_gain (bool) – True if mixed-domain gain operator (i.e., both frequency- and time-domain gain) is to be used. If False, only frequency- domain gain is simulated.

  • verbose (bool) – Print information to terminal if True

Notes

The boundary_conditions dictionary accepts the following keys:
co_pump_powerfloat

Power of the co-propagating pump in W

co_pump_wavelengthfloat

Central wavelength of the co-propagating pump in m

co_pump_bandwidthfloat

Bandwidth of the co-propagating pump in m

counter_pump_powerfloat

Power of the counter-propagating pump in W

counter_pump_wavelengthfloat

Central wavelength of the counter-propagating pump in m

counter_pump_bandwidthfloat

Bandwidth of the counter-propagating pump in m

If no counter-pump values are specified, then no effort is made to resolve counter-propagating signals (i.e., the boundary value problem is not solved). This allows for co-pumping only. Example:

boundary_conditions = {

‘co_pump_power’: 1, ‘co_pump_wavelength’: 976e-9, ‘co_pump_bandwidth’: 1e-9}

The boundary value problem is solved whenever dictionary key ‘counter_pump_power’ is present, but it is not necessary to specify the wavelength or bandwidth of either the co- or counter-propagating pump if the power is zero. Here are a few examples of valid boundary_conditions dictionaries:

  1. Co-pumping with full boundary value solver:
    boundary_conditions = {

    ‘co_pump_power’: 1, ‘co_pump_wavelength’: 976e-9, ‘co_pump_bandwidth’: 1e-9, ‘counter_pump_power’: 0}

  2. Bidirectional pumping with full boundary value solver:
    boundary_conditions = {

    ‘co_pump_power’: 1, ‘co_pump_wavelength’: 976e-9, ‘co_pump_bandwidth’: 1e-9, ‘counter_pump_power’: 1, ‘counter_pump_wavelength’: 976e-9, ‘counter_pump_bandwidth’: 1e-9}

  3. Counter-pumping with full boundary value solver:
    boundary_conditions = {

    ‘co_pump_power’: 0, ‘counter_pump_power’: 1, ‘counter_pump_wavelength’: 976e-9, ‘counter_pump_bandwidth’: 1e-9}

static get_pump_and_ASE_propagation_parameters(p_II, core_diam)
Parameters:
  • p_II (numpy array) – Ratio of mode and core diameters given by Petermann II.

  • core_diam (float) – Core diameter

Returns:

  • numpy array – Effective mode field diameter as a function of wavelength

  • numpy array – effective mode field area as a function of wavelength

get_pump_refractive_index()

Calculate the effective refractive index for the pump light.

class pyLaserPulse.base_components.component(loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, g, crosstalk, order=2, output_coupler=False, coupler_type='polarization', beta_list=None, gdm=0)

Base class for defining optical components.

__init__(loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, g, crosstalk, order=2, output_coupler=False, coupler_type='polarization', beta_list=None, gdm=0)
Parameters:
  • loss (float) – Insertion loss at the signal wavelength.

  • transmission_bandwidth (float) – Transmission bandwidth. Can also be interpreted as reflection bandwidth for reflective optics.

  • lambda_c (float) – Central wavelength of transmission window.

  • epsilon (complex) –

    Defines type of component (polarizer or retarder). Defined for field. For example:

    epsilon = 0 + 1j for a quarter wave plate, epsilon = -1 for a half wave plate, epsilon = 0.1 for 20 dB polarization extinction.

  • theta (float) – Angle subtended by component optical axis and x-axis.

  • beamsplitting (float) – Intensity fraction remaining in pulse.field if output coupler and coupler_type=”beamsplitter”

  • g (pyLaserPulse.grid.grid object)

  • crosstalk (float) – Polarization degradation caused by the component.

  • order (int) – Steepness of the super-Gaussian transmission window edges.

  • output_coupler (boolean) – If True, the component is an output coupler and some of the main beam (pulse.field) is tapped off.

  • coupler_type (string) – “polarization” or “beamsplitter”. If the former, Jones matrix for polarization-based output coupler is used. If the latter, Jones matrix for polarization-independent beam splitting is used for the output coupler.

  • beta_list (list) – None by default. Contains Taylor coefficients [beta_2, beta_3, …, beta_n] which define the dispersion profile of the component.

  • gdm (float) – Polarization group delay mismatch. Units: s. Delay accumulated between polarization components after propagating through the component. If gdm > 0, x is the slow axis.

class pyLaserPulse.base_components.fibre_component(g, input_fibre, output_fibre, loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, crosstalk, order=2, output_coupler=False, coupler_type='beamsplitter', beta_list=None, component_gdm=0, verbose=False)

Base class for fibre components.

__init__(g, input_fibre, output_fibre, loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, crosstalk, order=2, output_coupler=False, coupler_type='beamsplitter', beta_list=None, component_gdm=0, verbose=False)
Parameters:
  • g (pyLaserPulse.grid.grid object)

  • input_fibre (optical fibre object) – Dfined using, for example: pyLaserPulse.base_components.step_index_passive_fibre pyLaserPulse.base_components.photonic_crystal_passive_fibre pyLaserPulse.base_components.step_index_active_fibre pyLaserPulse.base_components.photonic_crystal_active_fibre etc.

  • output_fibre (optical fibre object) – Defined using, for example: pyLaserPulse.base_components.step_index_passive_fibre pyLaserPulse.base_components.photonic_crystal_passive_fibre pyLaserPulse.base_components.step_index_active_fibre pyLaserPulse.base_components.photonic_crystal_active_fibre etc.

  • loss (float) – Insertion loss at the signal wavelength.

  • transmission_bandwidth (float) – Transmission bandwidth. Can also be interpreted as reflection bandwidth for reflective optics.

  • lambda_c (float) – Central wavelength of transmission window.

  • epsilon (complex) –

    Defines type of component (polarizer or retarder). Defined for field. For example:

    epsilon = 0 + 1j for a quarter wave plate, epsilon = -1 for a half wave plate, epsilon = 0.1 for 20 dB polarization extinction.

  • theta (float) – Angle subtended by component optical axis and x-axis.

  • beamsplitting (float) – Intensity fraction remaining in pulse.field if output coupler and coupler_type=”beamsplitter”

  • crosstalk (float) – Polarization degradation caused by the component.

  • order (int) – Steepness of the super-Gaussian transmission window edges.

  • output_coupler (bool) – If True, the component is an output coupler and some of the main beam (pulse.field) is tapped off.

  • coupler_type (string) – “polarization” or “beamsplitter”. If the former, Jones matrix for polarization-based output coupler is used. If the latter, Jones matrix for polarization-independent beam splitting is used for the output coupler.

  • beta_list (list) – None by default. Contains Taylor coefficients [beta_2, beta_3, …, beta_n] which define the dispersion profile of the component.

  • gdm (float) – Polarization group delay mismatch. Units: s. Delay accumulated between polarization components after propagating through the component. If gdm > 0, x is the slow axis.

  • verbose (bool) – Print information to terminal if True

make_verbose()

Change self.verbose to True Called by optical_assemblies. If the optical assembly verbosity is True, all component verbosities are also set to True.

make_silent()

Change self.verbose to False Called by optical_assemblies. If the optical assembly verbosity is False, all component verbosities are also set to False.

propagate(pulse)

Apply the input_fibre, component, and output_fibre operators to a pulse

Parameters:

pulse (pyLaserPulse.pulse.pulse object)

Return type:

pyLaserPulse.pulse.pulse object

propagate_spectrum(spectrum, omega_axis)

Apply the full component operator to an input energy spectral density. This is useful for modelling the effect of a component on, for example, ASE and pump light.

Parameters:
  • spectrum (numpy array, dtype float64.) – shape(2, n_points). Energy spectrum of the light.

  • omega_axis (numpy array, dtype float64/) – Angular frequency axis corresponding to spectrum

Returns:

Spectrum after propagating through the component.

Return type:

numpy array

class pyLaserPulse.base_components.pulse_picker(loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, g, crosstalk, time_open, rate_reduction_factor, input_rep_rate, order=2, output_coupler=False, coupler_type='polarization', beta_list=None, gdm=0)

Class for AOMs, EOMs and, assuming the input repetition rate is low enough and only one pulse is let through, choppers as well.

__init__(loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, g, crosstalk, time_open, rate_reduction_factor, input_rep_rate, order=2, output_coupler=False, coupler_type='polarization', beta_list=None, gdm=0)
Parameters:
  • loss (float) – Insertion loss at the signal wavelength.

  • transmission_bandwidth (float) – Transmission bandwidth. Can also be interpreted as reflection bandwidth for reflective optics.

  • lambda_c (float) – Central wavelength of transmission window.

  • epsilon (complex) –

    Defines type of component (polarizer or retarder). Defined for field. For example:

    epsilon = 0 + 1j for a quarter wave plate, epsilon = -1 for a half wave plate, epsilon = 0.1 for 20 dB polarization extinction.

  • theta (float) – Angle subtended by component optical axis and x-axis.

  • beamsplitting (float) – Intensity fraction remaining in pulse.field if output coupler and coupler_type=”beamsplitter”

  • g (pyLaserPulse.grid.grid object)

  • crosstalk (float) – Polarization degradation caused by the component.

  • time_open (float) – Time in s that the pulse picker is ‘open’, i.e., lets light through See Notes below.

  • rate_reduction_factor (int) – Ratio of the input and output repetition rates of the pulse picker. See Notes below.

  • input_rep_rate (float) – Repetition rate of the seed laser before the pulse picker. See Notes below.

  • order (int) – Steepness of the super-Gaussian transmission window edges.

  • output_coupler (boolean) – If True, the component is an output coupler and some of the main beam (pulse.field) is tapped off.

  • coupler_type (string) – “polarization” or “beamsplitter”. If the former, Jones matrix for polarization-based output coupler is used. If the latter, Jones matrix for polarization-independent beam splitting is used for the output coupler.

  • beta_list (list) – None by default. Contains Taylor coefficients [beta_2, beta_3, …, beta_n] which define the dispersion profile of the component.

  • gdm (float) – Polarization group delay mismatch. Units: s. Delay accumulated between polarization components after propagating through the component. If gdm > 0, x is the slow axis.

make_temporal_transmission_window()

Define the temporal transmission window of the component.

Loss, including from diffraction, taken into account in the spectral domain.

apply_temporal_transmission_window(field)

Apply the temporal transmission window of the component to the field.

Parameters:

field (numpy array) – Pulse field in the time domain. See pyLaserPulse.pulse.pulse.field

Returns:

Pulse field in the time domain after the pulse picking.

Return type:

numpy array

class pyLaserPulse.base_components.fibre_pulse_picker(g, input_fibre, output_fibre, loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, crosstalk, time_open, rate_reduction_factor, input_rep_rate, order=2, output_coupler=False, coupler_type='polarization', beta_list=None, gdm=0, verbose=False)

Base class for fibre pulse pickers (e.g., EOMs and AOMs).

See also base_components.pulse_picker.

__init__(g, input_fibre, output_fibre, loss, transmission_bandwidth, lambda_c, epsilon, theta, beamsplitting, crosstalk, time_open, rate_reduction_factor, input_rep_rate, order=2, output_coupler=False, coupler_type='polarization', beta_list=None, gdm=0, verbose=False)
Parameters:
  • g (pyLaserPulse.grid.grid object)

  • input_fibre (optical fibre object) – Dfined using, for example: pyLaserPulse.base_components.step_index_passive_fibre pyLaserPulse.base_components.photonic_crystal_passive_fibre pyLaserPulse.base_components.step_index_active_fibre pyLaserPulse.base_components.photonic_crystal_active_fibre etc.

  • output_fibre (optical fibre object) – Dfined using, for example: pyLaserPulse.base_components.step_index_passive_fibre pyLaserPulse.base_components.photonic_crystal_passive_fibre pyLaserPulse.base_components.step_index_active_fibre pyLaserPulse.base_components.photonic_crystal_active_fibre etc.

  • loss (float) – Insertion loss at the signal wavelength.

  • transmission_bandwidth (float) – Transmission bandwidth. Can also be interpreted as reflection bandwidth for reflective optics.

  • lambda_c (float) – Central wavelength of transmission window.

  • epsilon (complex) –

    Defines type of component (polarizer or retarder). Defined for field. For example:

    epsilon = 0 + 1j for a quarter wave plate, epsilon = -1 for a half wave plate, epsilon = 0.1 for 20 dB polarization extinction.

  • theta (float) – Angle subtended by component optical axis and x-axis.

  • beamsplitting (float) – Intensity fraction remaining in pulse.field if output coupler and coupler_type=”beamsplitter”

  • crosstalk (float) – Polarization degradation caused by the component.

  • time_open (float) – Time in s that the pulse picker is ‘open’, i.e., lets light through See Notes below.

  • rate_reduction_factor (int) – Ratio of the input and output repetition rates of the pulse picker. See Notes below.

  • input_rep_rate (float) – Repetition rate of the seed laser before the pulse picker. See Notes below.

  • order (int) – Steepness of the super-Gaussian transmission window edges.

  • output_coupler (boolean) – If True, the component is an output coupler and some of the main beam (pulse.field) is tapped off.

  • coupler_type (string) – “polarization” or “beamsplitter”. If the former, Jones matrix for polarization-based output coupler is used. If the latter, Jones matrix for polarization-independent beam splitting is used for the output coupler.

  • beta_list (list) – None by default. Contains Taylor coefficients [beta_2, beta_3, …, beta_n] which define the dispersion profile of the component.

  • gdm (float) – Polarization group delay mismatch. Units: s. Delay accumulated between polarization components after propagating through the component. If gdm > 0, x is the slow axis.

  • verbose (bool) – Print information to terminal if True

make_verbose()

Change self.verbose to True Called by optical_assemblies. If the optical assembly verbosity is True, all component verbosities are also set to True.

make_silent()

Change self.verbose to False Called by optical_assemblies. If the optical assembly verbosity is False, all component verbosities are also set to False.

propagate(pulse)

Apply the input_fibre, pulse picker, and output_fibre operators to an input field.

Parameters:

pulse (pyLaserPulse.pulse.pulse object)

Return type:

pyLaserPulse.pulse.pulse object

propagate_spectrum(spectrum, omega_axis)

Apply the full component operator to an input energy spectral density. This is useful for modelling the effect of a component on, for example, ASE and pump light.

Parameters:
  • spectrum (numpy array, dtype float64.) – shape(2, n_points). Energy spectrum of the light.

  • omega_axis (numpy array, dtype float64/) – Angular frequency axis corresponding to spectrum

Returns:

Spectrum after the fibre pulse picker.

Return type:

numpy array

class pyLaserPulse.base_components.grating_compressor(loss, transmission_bandwidth, coating_material_path, lambda_c, epsilon, theta, beamsplitting, crosstalk, grating_separation, input_angle, groove_density, g, order=2, optimize=False, verbose=False, output_coupler=False, coupler_type='polarization')

Compressor class. Inherits from the components class.

__init__(loss, transmission_bandwidth, coating_material_path, lambda_c, epsilon, theta, beamsplitting, crosstalk, grating_separation, input_angle, groove_density, g, order=2, optimize=False, verbose=False, output_coupler=False, coupler_type='polarization')
Parameters:
  • loss (float) – Insertion loss at the signal wavelength.

  • transmission_bandwidth (float) – Transmission bandwidth. Can also be interpreted as reflection bandwidth for reflective optics.

  • coating_material (string) – Absolute path to a coating reflectivity spectrum. See pyLaserPulse.data.paths.materials.reflectivities

  • lambda_c (float) – Central wavelength of transmission window.

  • epsilon (complex) –

    Defines type of component (polarizer or retarder). Defined for field. For example:

    epsilon = 0 + 1j for a quarter wave plate, epsilon = -1 for a half wave plate, epsilon = 0.1 for 20 dB polarization extinction.

  • theta (float) – Angle subtended by component optical axis and x-axis.

  • beamsplitting (float) – Intensity fraction remaining in pulse.field if output coupler and coupler_type=”beamsplitter”

  • crosstalk (float) – Polarization degradation caused by the component.

  • grating_separation (float) – Propagated distance between reflections from the gratings in m

  • input_angle (float) – Grating incidence angle in radians.

  • groove_density (float) – Grating lines per mm

  • g (pyLaserPulse.grid.grid object)

  • order (int) – Steepness of the super-Gaussian transmission window edges.

  • optimize (bool) – Uses the Nelder-Mead algorithm from scipy.optimize.minimize if True to find the grating_separation and input_angle that minimizes the difference between the peak intensity of the compressed pulse and the transform limit.

  • verbose (bool) – Returns information about the Nelder-Mead optimization and the optimized compressor parameters if True.

  • output_coupler (boolean) – If True, the component is an output coupler and some of the main beam (pulse.field) is tapped off.

  • coupler_type (string) – “polarization” or “beamsplitter”. If the former, Jones matrix for polarization-based output coupler is used. If the latter, Jones matrix for polarization-independent beam splitting is used for the output coupler.

Notes

Diffraction efficiency is calculated using the method outlined in R. Casini et al., “On the intensity distribution function of blazed reflective diffraction gratings”, JOSA A 31(10), pp 2179-2184 (2014)

The second- and third-order compressor dispersion is calculated using the method outlined in R. L. Fork et al. “Compression of optical pulses to six femtoseconds by using cubic phase compensation”, Optics Letters 12(7), pp 483-485 (1987) and the correction to the second-order dispersion given in F. Kienle, “Advanced high-power optical parametric oscillators synchronously pumped by ultrafast fibre-based sources”, PhD Thesis, Optoelectronics Research Centre, University of Southampton (2012)

See page 37.

get_diffraction_angle()

Calculate the diffraction angle for the blaze wavelength.

get_diffraction_efficiency()

Scalar model of diffraction efficiency.

apply_transmission_spectrum(field, photon_spec)

Applies the spectral transmission window of the grating compressor.

Parameters:
  • field (numpy array) – Pulse field in the time domain. See pyLaserPulse.pulse.pulse.field

  • photon_spec (numpy array) – Number of photonics in each frequency bin of the pulse spectrum.

Returns:

Pulse field

Return type:

numpy array

get_Taylors()

Calculate the second order dispersion of the compressor.

make_phase()

Turn beta2 into a phase

propagate(pulse)

Apply the full compressor to an input pulse.

Parameters:

pulse (pyLaserPulse.pulse.pulse object)

Return type:

pyLaserPulse.pulse.pulse object

apply_operators(pulse)

Called to prevent looped recursion, which gave a marginally faster Nelder-Mead optimization in profiling.

Parameters:

pulse (pyLaserPulse.pulse.pulse object)

Returns:

Pulse field in the time domain.

Return type:

numpy array

optimize(compressor_parameters, pulse)

Method used by the Nelder-Mead optimizer to find the optimal grating separation and incidence angle for maximizing the pulse peak power.

Parameters:

compressor_parameters (list) – zeroth index is separation, first index is angle.

Returns:

Pulse field in the time domain

Return type:

numpy array

class pyLaserPulse.base_components.step_index_fibre_compressor(g, length, loss_file, Raman_file, core_diam, NA, beat_length, n2, fR, tol, Sellmeier_file, optimize=True, verbose=False)

Single mode fibre compressor class. Inherits from the step index fibre class.

Nonlinear opertors are not applied. Dispersion compensation only.

__init__(g, length, loss_file, Raman_file, core_diam, NA, beat_length, n2, fR, tol, Sellmeier_file, optimize=True, verbose=False)
Parameters:
  • g (pyLaserPulse.grid.grid object)

  • length (float) – Fibre length in m

  • loss_file (string) – Absolute path to the fibre loss as a function of wavelength. See pyLaserPulse.data.paths.materials.loss_spectra

  • Raman_file (string) – Absolute path to the Raman response as a function of time. See pyLaserPulse.data.paths.materials.Raman_profiles

  • core_diam (float) – Core diameter in m

  • NA (float) – Numerical aperture

  • beat_length (float) – Polarization beat length in m

  • n2 (float) – Nonlinear index in m^2 / W

  • fR (float) – Fractional Raman contribution to the fibre nonlinear response (e.g., fR = 0.18 for silica)

  • tol (float) – Maximum propagation error used to adjust the proapgation step size

  • Sellmeier_file (string) – Absolute path to the Sellmeier coefficients. See pyLaserPulse.data.paths.materials.Sellmeier_coefficients.

  • optimize (bool) – Uses the Nelder-Mead algorithm from scipy.optimize.minimize if True to find the fibre length that minimizes the difference between the peak intensity of the compressed pulse and the transform limit.

  • verbose (bool) – Returns information about the Nelder-Mead optimization and the optimized compressor parameters if True.

propagate(pulse)

Apply the fibre compressor to an input field.

Parameters:

pulse (pyLaserPulse.pulse.pulse object)

Return type:

pyLaserPulse.pulse.pulse object

apply_operators(length, pulse)

Apply the linear operator over length and return the resulting field.

Parameters:
  • length (float) – Fibre length in m

  • pulse (pyLaserPulse.pulse.pulse object)

Returns:

Pulse field in the time domain. See pyLaserPulse.pulse.pulse.field

Return type:

numpy array

class pyLaserPulse.base_components.rotated_splice(rotation_angle)

Class for simulating a splice between PM fibres where the stress rods are rotated through rotation_angle.

__init__(rotation_angle)
Parameters:

rotation_angle (float) – Angle of rotated splice. degrees.

propagate(pulse)

Apply a rotation matrix to pulse.field to simulate the effect that a rotated splice would have on the field.

Parameters:

pulse (pyLaserPulse.pulse.pulse object)

Return type:

pyLaserPulse.pulse.pulse object