redback.analysis.SpectralVelocityFitter

class redback.analysis.SpectralVelocityFitter(wavelength, flux, flux_err=None)[source]

Bases: object

Measure expansion velocities from spectral line profiles

Used for: - Photospheric velocity evolution - High-velocity features (HVF) - Velocity gradients (dv/dt)

Parameters:
  • wavelength (array) – Wavelength array in Angstroms

  • flux (array) – Flux density array

  • flux_err (array, optional) – Flux density uncertainties

Examples

>>> fitter = SpectralVelocityFitter(wavelength, flux)
>>> v_Si, v_err = fitter.measure_line_velocity(6355)
>>> print(f"Si II velocity: {v_Si:.0f} +/- {v_err:.0f} km/s")
__init__(wavelength, flux, flux_err=None)[source]

Initialize SpectralVelocityFitter

Parameters:
  • wavelength (array) – Wavelength array in Angstroms

  • flux (array) – Flux density array

  • flux_err (array, optional) – Flux density uncertainties

__call__(**kwargs)

Call self as a function.

Methods

__init__(wavelength, flux[, flux_err])

Initialize SpectralVelocityFitter

from_spectrum_object(spectrum)

Create fitter from a redback Spectrum object

identify_high_velocity_features(...[, ...])

Identify high-velocity features (HVF) in the spectrum

measure_line_velocity(line_rest_wavelength)

Measure velocity from single absorption line

measure_multiple_lines(line_dict[, method])

Measure velocities for multiple lines

measure_velocity_gradient(wavelength_list, ...)

Measure velocity gradient dv/dt from time series of spectra

photospheric_velocity_evolution(...[, ...])

Track photospheric velocity evolution over time

classmethod from_spectrum_object(spectrum)[source]

Create fitter from a redback Spectrum object

Parameters:

spectrum (object) – Object with .angstroms and .flux_density attributes

Returns:

fitter – Initialized fitter object

Return type:

SpectralVelocityFitter

identify_high_velocity_features(line_rest_wavelength, v_phot_expected, threshold_factor=1.3)[source]

Identify high-velocity features (HVF) in the spectrum

HVFs are absorption features at higher velocities than the photosphere, often associated with circumstellar material or density enhancements.

Parameters:
  • line_rest_wavelength (float) – Rest wavelength of the line in Angstroms

  • v_phot_expected (float) – Expected photospheric velocity in km/s

  • threshold_factor (float) – Factor above v_phot to classify as HVF (default 1.3)

Returns:

  • has_hvf (bool) – Whether HVF is detected

  • v_hvf (float or None) – Velocity of HVF if detected (km/s)

  • v_hvf_err (float or None) – Uncertainty in HVF velocity

Examples

>>> has_hvf, v_hvf, v_err = fitter.identify_high_velocity_features(
...     6355, v_phot_expected=11000
... )
>>> if has_hvf:
...     print(f"HVF detected at {-v_hvf:.0f} km/s")
measure_line_velocity(line_rest_wavelength, method='min', **kwargs)[source]

Measure velocity from single absorption line

Parameters:
  • line_rest_wavelength (float) – Rest wavelength in Angstroms (e.g., 6355 for Si II)

  • method (str) – ‘min’ - use minimum flux (standard) ‘centroid’ - use flux-weighted centroid ‘fit’ - fit P-Cygni profile ‘gaussian’ - fit Gaussian to absorption trough

  • kwargs (dict) –

    Additional parameters: - v_window : float

    Velocity window for search (km/s, default 5000)

    • continuum_percentilefloat

      Percentile for continuum estimation (default 90)

Returns:

  • velocity (float) – Measured velocity in km/s (negative = blueshift)

  • velocity_err (float) – Uncertainty in km/s

Examples

>>> fitter = SpectralVelocityFitter(wavelength, flux)
>>> v_Si, verr = fitter.measure_line_velocity(6355, method='min')
>>> print(f"Si II velocity: {v_Si:.0f} +/- {verr:.0f} km/s")
measure_multiple_lines(line_dict, method='min', **kwargs)[source]

Measure velocities for multiple lines

Parameters:
  • line_dict (dict) – {‘Si II 6355’: 6355, ‘Fe II 5169’: 5169, …}

  • method (str) – Method for velocity measurement (default ‘min’)

  • kwargs (dict) – Additional parameters passed to measure_line_velocity

Returns:

velocities – {‘Si II 6355’: (v, v_err), …}

Return type:

dict

Examples

>>> lines = {
...     'Si II 6355': 6355,
...     'Ca II H&K': 3934,
...     'Fe II 5169': 5169
... }
>>> velocities = fitter.measure_multiple_lines(lines)
>>> for ion, (v, verr) in velocities.items():
...     print(f"{ion}: {v:.0f} +/- {verr:.0f} km/s")
measure_velocity_gradient(wavelength_list, flux_list, times, line_wavelength=6355, **kwargs)[source]

Measure velocity gradient dv/dt from time series of spectra

Parameters:
  • wavelength_list (list of arrays) – Wavelength arrays for each spectrum

  • flux_list (list of arrays) – Flux arrays for each spectrum

  • times (array) – Observation times (days)

  • line_wavelength (float) – Which line to use

  • kwargs (dict) – Additional parameters passed to measure_line_velocity (e.g., v_window, method)

Returns:

  • gradient (float) – Velocity gradient in km/s/day

  • gradient_err (float) – Uncertainty in gradient

Notes

The velocity gradient is typically negative (decelerating) for normal SNe Ia (around -50 to -100 km/s/day), but can be different for peculiar objects.

static photospheric_velocity_evolution(wavelength_list, flux_list, times, line_wavelength=6355, method='min', **kwargs)[source]

Track photospheric velocity evolution over time

Parameters:
  • wavelength_list (list of arrays) – Wavelength arrays for each spectrum

  • flux_list (list of arrays) – Flux arrays for each spectrum

  • times (array) – Observation times (days)

  • line_wavelength (float) – Which line to use (default Si II 6355)

  • method (str) – Velocity measurement method

Returns:

  • times (array) – Observation times

  • velocities (array) – Measured velocities (km/s)

  • errors (array) – Velocity uncertainties (km/s)

Examples

>>> times, vels, errs = SpectralVelocityFitter.photospheric_velocity_evolution(
...     wavelength_list, flux_list, obs_times, line_wavelength=6355
... )
>>> plt.errorbar(times, -vels/1000, yerr=errs/1000)
>>> plt.xlabel('Days since explosion')
>>> plt.ylabel('Photospheric velocity (1000 km/s)')