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-05-07 12:14:46.01 Starting deconvolution of 1 spectrum using 1 worker
#> 2025-05-07 12:14:46.01 Starting deconvolution of sim_01
#> 2025-05-07 12:14:46.01 Removing water signal
#> 2025-05-07 12:14:46.01 Removing negative signals
#> 2025-05-07 12:14:46.01 Smoothing signals
#> 2025-05-07 12:14:46.01 Starting peak selection
#> 2025-05-07 12:14:46.02 Detected 314 peaks
#> 2025-05-07 12:14:46.02 Removing peaks with low pscores
#> 2025-05-07 12:14:46.02 Removed 287 peaks
#> 2025-05-07 12:14:46.02 Initializing Lorentz curves
#> 2025-05-07 12:14:46.02 MSE at peak tiplet positions: 4.0838805770844048836921
#> 2025-05-07 12:14:46.03 Refining Lorentz Curves
#> 2025-05-07 12:14:46.03 MSE at peak tiplet positions: 0.1609359876216345797140
#> 2025-05-07 12:14:46.03 MSE at peak tiplet positions: 0.0228015051613790313556
#> 2025-05-07 12:14:46.03 MSE at peak tiplet positions: 0.0071638016610617799920
#> 2025-05-07 12:14:46.03 Formatting return object as decon2
#> 2025-05-07 12:14:46.04 Finished deconvolution of sim_01
#> 2025-05-07 12:14:46.04 Finished deconvolution of 1 spectrum in 0.038 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-05-07 12:14:46.05 Starting deconvolution of 2 spectra using 1 worker
#> 2025-05-07 12:14:46.05 Starting deconvolution of sim_01
#> 2025-05-07 12:14:46.05 Removing water signal
#> 2025-05-07 12:14:46.05 Removing negative signals
#> 2025-05-07 12:14:46.05 Smoothing signals
#> 2025-05-07 12:14:46.06 Starting peak selection
#> 2025-05-07 12:14:46.07 Detected 314 peaks
#> 2025-05-07 12:14:46.07 Removing peaks with low pscores
#> 2025-05-07 12:14:46.07 Removed 287 peaks
#> 2025-05-07 12:14:46.07 Initializing Lorentz curves
#> 2025-05-07 12:14:46.07 MSE at peak tiplet positions: 4.0838805770844048836921
#> 2025-05-07 12:14:46.07 Refining Lorentz Curves
#> 2025-05-07 12:14:46.08 MSE at peak tiplet positions: 0.1609359876216345797140
#> 2025-05-07 12:14:46.08 MSE at peak tiplet positions: 0.0228015051613790313556
#> 2025-05-07 12:14:46.08 MSE at peak tiplet positions: 0.0071638016610617799920
#> 2025-05-07 12:14:46.08 Formatting return object as decon2
#> 2025-05-07 12:14:46.09 Finished deconvolution of sim_01
#> 2025-05-07 12:14:46.09 Starting deconvolution of sim_02
#> 2025-05-07 12:14:46.09 Removing water signal
#> 2025-05-07 12:14:46.09 Removing negative signals
#> 2025-05-07 12:14:46.09 Smoothing signals
#> 2025-05-07 12:14:46.09 Starting peak selection
#> 2025-05-07 12:14:46.11 Detected 316 peaks
#> 2025-05-07 12:14:46.11 Removing peaks with low pscores
#> 2025-05-07 12:14:46.11 Removed 286 peaks
#> 2025-05-07 12:14:46.11 Initializing Lorentz curves
#> 2025-05-07 12:14:46.11 MSE at peak tiplet positions: 3.8338943428876719465848
#> 2025-05-07 12:14:46.11 Refining Lorentz Curves
#> 2025-05-07 12:14:46.11 MSE at peak tiplet positions: 0.1289481941626757499630
#> 2025-05-07 12:14:46.12 MSE at peak tiplet positions: 0.0135651899090413786964
#> 2025-05-07 12:14:46.12 MSE at peak tiplet positions: 0.0025556755331531087749
#> 2025-05-07 12:14:46.12 Formatting return object as decon2
#> 2025-05-07 12:14:46.12 Finished deconvolution of sim_02
#> 2025-05-07 12:14:46.13 Finished deconvolution of 2 spectra in 0.072 secs