Classes
Multiplet
PeakAligner
High-level helper to detect multiplets and align spectra around them.
Typical use: pa = PeakAligner(spectra, ppm, sf_mhz=600) windows, mptable = pa.auto_windows(top_n=30) X_aligned, shifts = pa.align(windows)
Examples: >>> import numpy as np >>> import pandas as pd >>> from metbit.nmr.alignment import PeakAligner >>> ppm = np.linspace(10, 0, 500) >>> spectra = pd.DataFrame(np.random.rand(8, 500) * 0.01, columns=ppm) >>> spectra.iloc[:, 200] += 1.0 >>> pa = PeakAligner(spectra, ppm, sf_mhz=600) >>> windows, mptable = pa.auto_windows(top_n=10) >>> X_aligned, shifts = pa.align(windows)
Methods
__init__(self, spectra: pd.DataFrame, ppm: np.ndarray, sf_mhz: float)
auto_windows(self, top_n: int=30, max_group_width_ppm: float=0.03)
Generate non-overlapping windows centered on strongest multiplets of the median spectrum.
Examples: >>> import numpy as np >>> import pandas as pd >>> from metbit.nmr.alignment import PeakAligner >>> ppm = np.linspace(10, 0, 500) >>> spectra = pd.DataFrame(np.random.rand(8, 500) * 0.01, columns=ppm) >>> spectra.iloc[:, 200] += 1.0 >>> pa = PeakAligner(spectra, ppm, sf_mhz=600) >>> windows, mptable = pa.auto_windows(top_n=10) >>> print(len(windows), mptable.shape)
align(self, windows: List[Tuple[float, float]], reference: str='median', max_shift_ppm: float=0.02)
Align spectra within the given ppm windows using icoshift.
Examples: >>> import numpy as np >>> import pandas as pd >>> from metbit.nmr.alignment import PeakAligner >>> ppm = np.linspace(10, 0, 500) >>> spectra = pd.DataFrame(np.random.rand(8, 500) * 0.01, columns=ppm) >>> spectra.iloc[:, 200] += 1.0 >>> pa = PeakAligner(spectra, ppm, sf_mhz=600) >>> windows = [(4.8, 5.2)] >>> X_aligned, shifts = pa.align(windows, reference='median') >>> print(X_aligned.shape)
Functions
detect_multiplets(spectrum: pd.Series, ppm: np.ndarray, sf_mhz: float, smooth_window: int=11, smooth_poly: int=2, prominence: float=0.01, width: int=3, max_group_width_ppm: float=0.03)
Detect and classify multiplets on a single spectrum.
Parameters
spectrum1D intensities indexed like ppmppmppm axis as float array, same length as spectrumsf_mhzspectrometer frequency in MHz (e.g., 600 for 600 MHz)max_group_width_ppmgroup peaks within this span as a multipletExamples: >>> import numpy as np >>> import pandas as pd >>> from metbit.nmr.alignment import detect_multiplets >>> ppm = np.linspace(10, 0, 1000) >>> spectrum = pd.Series(np.random.rand(1000) * 0.01, index=ppm) >>> spectrum.iloc[400] += 1.0 >>> multiplets = detect_multiplets(spectrum, ppm, sf_mhz=600) >>> print(len(multiplets), multiplets[0].pattern)
icoshift_align(spectra: pd.DataFrame, ppm: np.ndarray, windows: List[Tuple[float, float]], reference: str='median', max_shift_ppm: float=0.02)
Interval-correlation optimized shifting (icoshift-like).
Parameters
spectrarows=spectra, cols=ppmppmppm vector matching columns (ascending or descending OK)windowslist of (ppm_min, ppm_max) intervals to align independentlyreference'median' or 'mean' for the reference spectrummax_shift_ppmmax allowed shift magnitude within each windowReturns
Examples: >>> import numpy as np >>> import pandas as pd >>> from metbit.nmr.alignment import icoshift_align >>> ppm = np.linspace(10, 0, 500) >>> spectra = pd.DataFrame(np.random.rand(10, 500) * 0.01, ... columns=ppm) >>> spectra.iloc[:, 200] += 1.0 >>> windows = [(4.8, 5.2), (3.3, 3.7)] >>> aligned, shifts = icoshift_align(spectra, ppm, windows) >>> print(aligned.shape, len(shifts))