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 - spectrum: 1D intensities indexed like ppm - ppm: ppm axis as float array, same length as spectrum - sf_mhz: spectrometer frequency in MHz (e.g., 600 for 600 MHz) - smooth_window, smooth_poly: Savitzky-Golay smoothing params - prominence, width: find_peaks parameters (tune to data scale) - max_group_width_ppm: group peaks within this span as a multiplet
Examples: >>> 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 - spectra: rows=spectra, cols=ppm - ppm: ppm vector matching columns (ascending or descending OK) - windows: list of (ppm_min, ppm_max) intervals to align independently - reference: 'median' or 'mean' for the reference spectrum - max_shift_ppm: max allowed shift magnitude within each window
Returns - aligned spectra (DataFrame) - per-sample list of applied integer-point shifts for each window
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))