Deconvolutes NMR spectra by modeling each detected signal within a spectrum as Lorentz Curve.
Usage
deconvolute(
x,
nfit = 3,
smopts = c(2, 5),
delta = 6.4,
sfr = NULL,
wshw = 0,
ask = FALSE,
force = FALSE,
verbose = TRUE,
nworkers = 1,
use_rust = FALSE
)
Arguments
- x
A
spectrum
orspectra
object as described in Metabodecon Classes.- nfit
Integer. Number of iterations for approximating the parameters for the Lorentz curves. See 'Details'.
- smopts
Numeric vector with two entries: the number of smoothing iterations and the number of data points to use for smoothing (must be odd). See 'Details'.
- delta
Threshold for peak filtering. Higher values result in more peaks being filtered out. A peak is filtered if its score is below \(\mu + \sigma \cdot \delta\), where \(\mu\) is the average peak score in the signal-free region (SFR), and \(\sigma\) is the standard deviation of peak scores in the SFR. See 'Details'.
- sfr
Numeric vector with two entries: the ppm positions for the left and right border of the signal-free region of the spectrum. See 'Details'.
- wshw
Half-width of the water artifact in ppm. See 'Details'.
- ask
Logical. Whether to ask for user input during the deconvolution process. If FALSE, the provided default values will be used.
- force
If FALSE, the function stops with an error message if no peaks are found in the signal free region (SFR), as these peaks are required as a reference for peak filtering. If TRUE, the function instead proceeds without peak filtering, potentially increasing runtime and memory usage significantly.
- verbose
Logical. Whether to print log messages during the deconvolution process.
- nworkers
Number of workers to use for parallel processing. If
"auto"
, the number of workers will be determined automatically. If a number greater than 1, it will be limited to the number of spectra.- use_rust
Logical. Whether to use the Rust backend for deconvolution. Requires the mdrb package. If TRUE and mdrb is missing, an error is thrown. If FALSE, the R implementation is used. If NULL, the Rust backend is used if available, otherwise the R implementation is used.
Value
A 'decon2' object as described in Metabodecon Classes.
Details
First, an automated curvature based signal selection is performed. Each signal is represented by 3 data points to allow the determination of initial Lorentz curves. These Lorentz curves are then iteratively adjusted to optimally approximate the measured spectrum.
Examples
## Deconvolute a single spectrum
spectrum <- sim[1]
decon <- deconvolute(spectrum)
#> 2025-09-17 19:41:14.85 Starting deconvolution of 1 spectrum using 1 worker
#> 2025-09-17 19:41:14.85 Starting deconvolution of sim_01
#> 2025-09-17 19:41:14.85 Removing water signal
#> 2025-09-17 19:41:14.85 Removing negative signals
#> 2025-09-17 19:41:14.85 Smoothing signals
#> 2025-09-17 19:41:14.85 Starting peak selection
#> 2025-09-17 19:41:14.85 Detected 314 peaks
#> 2025-09-17 19:41:14.85 Detected 314 peaks
#> 2025-09-17 19:41:14.85 Removing peaks with low scores
#> 2025-09-17 19:41:14.85 Removed 287 peaks
#> 2025-09-17 19:41:14.85 Initializing Lorentz curves
#> 2025-09-17 19:41:14.86 MSE at peak tiplet positions: 4.0838805770844048836921
#> 2025-09-17 19:41:14.86 Refining Lorentz Curves
#> 2025-09-17 19:41:14.86 MSE at peak tiplet positions: 0.1609359876216345797140
#> 2025-09-17 19:41:14.86 MSE at peak tiplet positions: 0.0228015051613790313556
#> 2025-09-17 19:41:14.86 MSE at peak tiplet positions: 0.0071638016610617799920
#> 2025-09-17 19:41:14.86 Formatting return object as decon2
#> 2025-09-17 19:41:14.87 Finished deconvolution of sim_01
#> 2025-09-17 19:41:14.87 Finished deconvolution of 1 spectrum in 0.021 secs
## Read multiple spectra from disk and deconvolute at once
spectra_dir <- metabodecon_file("sim_subset")
spectra <- read_spectra(spectra_dir)
decons <- deconvolute(spectra, sfr = c(3.55, 3.35))
#> 2025-09-17 19:41:14.88 Starting deconvolution of 2 spectra using 1 worker
#> 2025-09-17 19:41:14.88 Starting deconvolution of sim_01
#> 2025-09-17 19:41:14.88 Removing water signal
#> 2025-09-17 19:41:14.88 Removing negative signals
#> 2025-09-17 19:41:14.88 Smoothing signals
#> 2025-09-17 19:41:14.88 Starting peak selection
#> 2025-09-17 19:41:14.88 Detected 314 peaks
#> 2025-09-17 19:41:14.88 Detected 314 peaks
#> 2025-09-17 19:41:14.88 Removing peaks with low scores
#> 2025-09-17 19:41:14.88 Removed 287 peaks
#> 2025-09-17 19:41:14.88 Initializing Lorentz curves
#> 2025-09-17 19:41:14.88 MSE at peak tiplet positions: 4.0838805770844048836921
#> 2025-09-17 19:41:14.89 Refining Lorentz Curves
#> 2025-09-17 19:41:14.89 MSE at peak tiplet positions: 0.1609359876216345797140
#> 2025-09-17 19:41:14.89 MSE at peak tiplet positions: 0.0228015051613790313556
#> 2025-09-17 19:41:14.89 MSE at peak tiplet positions: 0.0071638016610617799920
#> 2025-09-17 19:41:14.89 Formatting return object as decon2
#> 2025-09-17 19:41:14.90 Finished deconvolution of sim_01
#> 2025-09-17 19:41:14.90 Starting deconvolution of sim_02
#> 2025-09-17 19:41:14.90 Removing water signal
#> 2025-09-17 19:41:14.90 Removing negative signals
#> 2025-09-17 19:41:14.90 Smoothing signals
#> 2025-09-17 19:41:14.90 Starting peak selection
#> 2025-09-17 19:41:14.91 Detected 316 peaks
#> 2025-09-17 19:41:14.91 Detected 316 peaks
#> 2025-09-17 19:41:14.91 Removing peaks with low scores
#> 2025-09-17 19:41:14.91 Removed 286 peaks
#> 2025-09-17 19:41:14.91 Initializing Lorentz curves
#> 2025-09-17 19:41:14.91 MSE at peak tiplet positions: 3.8338943428876719465848
#> 2025-09-17 19:41:14.91 Refining Lorentz Curves
#> 2025-09-17 19:41:14.91 MSE at peak tiplet positions: 0.1289481941626757499630
#> 2025-09-17 19:41:14.91 MSE at peak tiplet positions: 0.0135651899090413786964
#> 2025-09-17 19:41:14.91 MSE at peak tiplet positions: 0.0025556755331531087749
#> 2025-09-17 19:41:14.91 Formatting return object as decon2
#> 2025-09-17 19:41:14.92 Finished deconvolution of sim_02
#> 2025-09-17 19:41:14.92 Finished deconvolution of 2 spectra in 0.043 secs