Line Filtering#
For wide wavelength coverage (or many segments), using the full line list in every segment is expensive. PySME provides dynamic line filtering to keep only relevant lines per segment (see Jian et al. in prep).
Core Option#
Use linelist_mode in synthesis or solve:
"all": use all lines (default)."dynamic": filter lines by precomputed line properties (recommended for long spectra)."auto": legacy alias of"dynamic"(deprecated).
How Dynamic Filtering Works#
When linelist_mode="dynamic":
PySME ensures line metadata exists (
central_depth,line_range_s,line_range_e). If missing or stale, it updates them viaupdate_cdr(...).For each segment, PySME keeps lines that overlap the segment range (with broadening margin) and pass a strength threshold.
Only this reduced line subset is sent to SMElib for that segment.
This can significantly reduce runtime for long or segmented spectra.
Main Controls#
sme.cdr_depth_thres: minimum line-strength threshold used in filtering.sme.cdr_N_line_chunk: chunk size used inupdate_cdr.sme.cdr_parallel: enable/disable parallelupdate_cdr.sme.cdr_n_jobs: number of parallel jobs.cdr_database/cdr_create(function args): reuse or build a CDR grid on disk.
Example 1: Dynamic Filtering in Synthesis#
from pysme.synthesize import Synthesizer, synthesize_spectrum
synth = Synthesizer()
sme = synth.update_cdr(sme) # populate central_depth / line_range_* once
sme.cdr_depth_thres = 0.02 # keep only stronger lines
sme = synthesize_spectrum(sme, linelist_mode="dynamic")
Example 2: Dynamic Filtering in Solve#
from pysme.solve import solve
fit = ["teff", "logg", "monh", "vmic"]
sme = solve(
sme,
fit,
linelist_mode="dynamic",
cdr_database="path/to/cdr_grid", # optional on-disk CDR cache/grid
cdr_create=False, # set True to force regeneration
)
Practical Guidance#
Start with
sme.cdr_depth_thres = 0.0and increase gradually if needed.Use
"all"for short, narrow windows where filtering overhead may not help.Use
"dynamic"for wide ranges or many segments.