GWSignal Interface
The GWSignal.py module acts as a wrapper around the gwsignal library. It is designed to avoid some of the stdout noise and slow import times associated with the base library while providing a clean interface for generating both time-domain waveforms and their harmonic decompositions.
Overview
This interface allows RIFT to leverage the wide array of waveform models available in the gwsignal ecosystem. It handles the conversion between RIFT’s internal parameter structures (ChooseWaveformParams) and the Python dictionaries required by the gwsignal generators.
Core Functions
Harmonic Decomposition
hlmoft(P, Lmax=2, ...): The core function for generating harmonic modes. It takes a parameter setPand returns a dictionary of LALCOMPLEX16TimeSeriesobjects for each $(l, m)$ mode up toLmax.It handles the necessary coordinate conversions (e.g., masses to solar masses).
It applies required tapering and phase shifts.
It can optionally adjust the waveform epoch based on the peak of the signal.
hlmoff(P, ...): A convenience wrapper aroundhlmoftthat returns Fourier-transformed harmonic modes.std_and_conj_hlmoff(P, ...): Returns both the Fourier-transformed modes and their complex conjugates.
Time-Domain Waveforms
hoft(P, ...): Generates a real-valued time-domain waveform. It handles the projection of the $h_+$ and $h_times$ polarizations onto a specific detector strain based on the sky location and orientation.complex_hoft(P, ...): Generates a complex-valued time-domain waveform ($h_+ + i h_times$), which is useful for certain internal RIFT calculations.
Implementation Details
Coordinate Handling: The module carefully converts RIFT’s internal units to the units expected by
gwsignal(e.g., usingastropy.units).Tapering: Since
gwsignaloutput is often not tapered, the module manually applies a cosine taper to the start of the segments to avoid spectral leakage.Epoch Alignment: The module supports an
align_method='peak'option, which shifts the waveform epoch to coincide with the peak of the total power $sum |h_{lm}|^2$.
Backend options
With --use-gwsignal, ILE passes the complete dictionary supplied to
--internal-waveform-extra-kwargs to the selected waveform generator. For
example, the production SEOBNRv5PHM settings use:
--use-gwsignal --approx SEOBNRv5PHM \
--internal-waveform-extra-kwargs "{'antisymmetric_modes_hm': True, 'enable_antisymmetric_modes': True, 'lmax_nyquist': 1}"
No list of approved backend options is maintained in RIFT. Nested dictionaries, false values and zero values are preserved, and errors from the generator are allowed to propagate. A generator can still reject unsupported options or ignore them according to its own interface; RIFT does not validate a plugin’s option schema.
The explicit dictionary is kept separate from RIFT alignment and conditioning
controls, including --internal-waveform-fd-L-frame. It takes precedence over
--use-gwsignal-lmax-nyquist. Direct Python callers can use
gwsignal_extra_kwargs={...} with hlmoft, hoft or complex_hoft for
the same behavior. Legacy direct keyword arguments are forwarded too, except
for known RIFT wrapper controls.
Masses, spins, sampling and other physical parameters must be set on
ChooseWaveformParams. Backend options that override those translated fields
raise ValueError to prevent disagreement with likelihood parameters or
series metadata. condition may override the taper-derived backend
conditioning value. RIFT’s own tapering and alignment of returned modes still
apply. Plain nested dictionaries, lists and tuples are copied before generation;
opaque backend objects are passed through unchanged.
--internal-waveform-extra-lalsuite-args targets the native LAL-dictionary
route, not GWSignal. ILE rejects its combination with --use-gwsignal before
loading detector data, including an explicitly supplied empty dictionary.
Use --internal-waveform-extra-kwargs for GWSignal backend options. Direct
GWSignal callers receive an error for a nonempty legacy extra_waveform_args
payload; an explicitly namespaced backend option with that name remains allowed.
The same dictionary separation is preserved when pseudo-pipeline arguments are
forwarded to calibration reweighting. --extra-waveform-kwargs in that
executable is a wrapper-options dictionary; its gwsignal_extra_kwargs member
holds explicit backend options. The pseudo-pipeline constructs this member from
--internal-waveform-extra-kwargs when GWSignal is selected.
Asimov’s waveform dictionaries are quoted as shell arguments. BasicIteration preserves their nested list syntax and backslashes, and the ILE submit writer translates complete shell argument boundaries into HTCondor’s new argument syntax. Multiple dictionaries and quoted string values are supported. Literal line breaks inside an individual submit argument are rejected.