redback.analysis.SpectralVelocityFitter
- class redback.analysis.SpectralVelocityFitter(wavelength, flux, flux_err=None)[source]
Bases:
objectMeasure 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:
- 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)')