Skip to content

disentangle_sb2

Separate the spectra of the two components of an SB2 spectroscopic binary.

Category Advanced
Backend numpy - implemented here on top of numpy primitives
Version 1.1.0
Reads ctx.spectra (a list of Spectrum1D)
Writes extras.primary_spectrum, extras.secondary_spectrum, metrics.disentangle_residual_rms

Implements the iterative alternating subtraction of Bagnuolo & Gies 1991 (not the SVD of Simon & Sturm 1994 nor the Fourier method of Hadrava 1995, cited as background). All observations are resampled onto a common log-wavelength grid so that a Doppler shift is a constant number of samples ; at each iteration the current estimate of one component is removed from every observation in the other component's rest frame, and the new estimate is the average of the residuals. Stores primary_spectrum and secondary_spectrum in ctx.extras. CAVEAT — additive continuum degeneracy: only the SUM of the two continua is constrained by the data, so the split of the continuum level between the components is arbitrary (the secondary typically comes out near a continuum of ~0 and the primary near the total) ; the line profiles are correct but a light-ratio prior is needed to renormalise each component to its own continuum. metrics['disentangle_residual_rms'] (v1.1.0) is the RMS of observation − (shifted primary + shifted secondary) after the last iteration, over the finite samples. Descending wavelength axes and non-finite samples are handled before resampling.

Parameters

Parameter Default Required Description
v1_kms None yes List of per-spectrum primary velocities (km/s, length = len(ctx.spectra)).
v2_kms None yes List of per-spectrum secondary velocities (km/s, same length).
n_iter 30 - Number of iterations of the alternating subtraction.
n_grid 4096 - Number of log-wavelength samples on the common grid.

Use it

from spectro_kernel import run_algorithm

output = run_algorithm("disentangle_sb2", ctx, {
    "v1_kms": "<value>",
    "v2_kms": "<value>",
    "n_iter": 30,
    "n_grid": 4096
})

The CLI loads a single 1-D spectrum with --input; this algorithm needs ctx.spectra (a list of Spectrum1D). Run it from Python or as a step of a pipeline preset.

{
  "tool": "disentangle_sb2",
  "arguments": {
    "session_id": "<session_id>",
    "params": {
      "v1_kms": "<value>",
      "v2_kms": "<value>",
      "n_iter": 30,
      "n_grid": 4096
    }
  }
}

Every algorithm is an MCP tool of the same name; describe_algorithm returns this page's metadata as JSON.

References

  • Bagnuolo & Gies 1991, ApJ 376, 266 — iterative alternating-subtraction ('tomographic') separation of composite spectra: the method implemented here.
  • Simon & Sturm 1994, A&A 281, 286 — wavelength-domain spectral separation by singular-value decomposition (background).
  • Hadrava 1995, A&AS 114, 393 — Fourier-domain disentangling (background).