Skip to contents

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 or spectra 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.

Author

2024-2025 Tobias Schmidt: initial version.

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