Continuous laboratory spectrum preprocessing: penalized baselines, scatter calibration, local polynomial filters and bounded pipelines
moon add Qjoy127/moonspectralprep@0.1.0import { "Qjoy127/moonspectralprep" @prep }
options(is_main: true)fn main {
try {
let axis = @prep.regular_axis(0.0, 8.0, 9)
let measured = @prep.spectrum(axis, [2.0, 2.1, 2.2, 3.3, 8.4, 3.5, 2.6, 2.7, 2.8])
let result = @prep.asls(measured, options=@prep.iteration_options(lambda=100.0))
let corrected = measured.with_values(result.corrected)
let band = @prep.integrate_band(corrected, 2.0, 6.0)
println("area=\{band.area}; converged=\{result.converged}")
} catch {
error => { println("preprocessing failed: \{error}"); panic() }
}
}moon run examples/raman
moon run examples/nir
moon run examples/alignment| 使用者与输入 | 实际处理与输出 |
|---|---|
| Raman 算法开发者:含荧光背景与两个峰的合成连续光谱 | AsLS → 局部平滑 → 两个区间的弦线扣除积分及面积比;示例同时检查数值范围 |
| NIR/红外质控程序:带散射差异的训练批次和独立新样本 | 训练均值参考 → JSON 保存/恢复 → MSC → SNV;输出斜率、截距、残差及标准差,参考保持冻结 |
| 仪器/数据工程程序:两个不同测量网格 | 显式公共轴插值 → 批次均值/样本标准差 → 裁剪和一阶导数 → 含逐步诊断的 JSON 报告;重复运行结果一致 |
// 输入 JSON schema=1,仅包含 schema、axis、values 三个字段。
let signal = @prep.parse_spectrum("{\"schema\":1,\"axis\":[0,1,2],\"values\":[1,3,1]}")
let flow = @prep.pipeline([@prep.LocalPolynomial(3, 2, 0), @prep.Snv])
let result = flow.run(signal)
let report_json = result.to_json().stringify()moon info
moon fmt --check
moon check --deny-warn --target wasm-gc
moon test --deny-warn --target wasm-gc
moon build --deny-warn --target wasm-gcpython -m venv .venv
# 激活环境;Windows: .venv\Scripts\Activate.ps1;Linux/macOS: source .venv/bin/activate
python -m pip install -r scripts/requirements-oracle.txt
python scripts/verify_numerics.py --target wasm-gc
python scripts/check_project.pypub(all) suberror SpectralError {
Invalid(String)
Numerical(String)
Budget(String)
}impl Show for SpectralErrorpub(all) struct BandMetrics {
area : Double
positive_area : Double
positive_centroid : Double?
height : Double
height_position : Double
sampled_points : Int
}pub(all) struct IterationOptions {
lambda : Double
max_iterations : Int
tolerance : Double
}pub(all) struct PipelineResult {
spectrum : Spectrum
trace : Array[StepReport]
estimated_work : Double
}fn Polynomial::evaluate(self : Polynomial, x : Double, derivative? : Int) -> Double raise SpectralErrorpub(all) struct QualityMetrics {
samples : Int
minimum : Double
maximum : Double
mean : Double
deviation : Double
rms : Double
negative_fraction : Double
first_difference_mad : Double
curvature_rms : Double
uniform_axis : Bool
}fn ScatterModel::transform(self : ScatterModel, input : Spectrum, axis_tolerance? : Double) -> ScatterResult raise SpectralErrorpub(all) struct ScatterResult {
spectrum : Spectrum
intercept : Double
slope : Double
residual_rms : Double
}fn Spectrum::subtract_baseline(self : Spectrum, baseline : Array[Double]) -> Spectrum raise SpectralErrorpub(all) enum Step {
Asls(Double, IterationOptions)
Arpls(IterationOptions)
Snip(Int, Bool, Bool)
PolynomialBaseline(Array[Bool], Int)
LocalPolynomial(Int, Int, Int)
Median(Int)
Snv
UnitVector
RangeNormalize
Scatter(ScatterModel)
Affine(Double, Double)
Crop(Double, Double)
Resample(Array[Double])
Absorbance(Bool)
Transmittance(Bool)
}pub(all) struct StepReport {
name : String
input_samples : Int
output_samples : Int
rms_before : Double
rms_after : Double
iterations : Int?
converged : Bool?
relative_change : Double?
}fn affine_intensity(input : Spectrum, scale : Double, offset : Double) -> Spectrum raise SpectralErrorfn asls(input : Spectrum, asymmetry? : Double, options? : IterationOptions) -> BaselineResult raise SpectralErrorfn band_ratio(numerator : BandMetrics, denominator : BandMetrics, minimum_area? : Double) -> Double raise SpectralErrorfn fit_polynomial(axis : Array[Double], values : Array[Double], degree : Int) -> Polynomial raise SpectralErrorfn integrate_band(input : Spectrum, left : Double, right : Double, remove_chord? : Bool) -> BandMetrics raise SpectralErrorfn interval_mask(input : Spectrum, intervals : Array[(Double, Double)]) -> Array[Bool] raise SpectralErrorfn iteration_options(lambda? : Double, max_iterations? : Int, tolerance? : Double) -> IterationOptionsfn local_polynomial(input : Spectrum, window? : Int, degree? : Int, derivative? : Int) -> Spectrum raise SpectralErrorfn masked_polynomial_baseline(input : Spectrum, selected : Array[Bool], degree? : Int) -> BaselineResult raise SpectralErrorfn pipeline(steps : Array[Step], maximum_work? : Double, require_convergence? : Bool) -> Pipeline raise SpectralErrorfn scatter_batch(model : ScatterModel, inputs : Array[Spectrum]) -> Array[ScatterOutcome] raise SpectralErrorfn snip(input : Spectrum, half_window? : Int, decreasing? : Bool, count_transform? : Bool) -> BaselineResult raise SpectralErrorfn whittaker(values : Array[Double], weights : Array[Double], lambda : Double) -> Array[Double] raise SpectralErrorfn whittaker_objective(values : Array[Double], baseline : Array[Double], weights : Array[Double], lambda : Double) -> Double raise SpectralErrorInstall
Download zipContinuous laboratory spectrum preprocessing: penalized baselines, scatter calibration, local polynomial filters and bounded pipelines