MatLens · Ecuaciones y modelos

Cromatografía (HPLC / GC)

Procesado de cromatogramas, idoneidad del sistema y cuantificación en matlens/chroma/. Los tiempos están en las unidades de la columna X (normalmente min). La vista de cromatografía (matlens/ui/chroma_ui.py) calcula todas sus tablas con estas funciones.

Línea base, picos e integración

Código: matlens/chroma/processing.py::baseline, matlens/chroma/processing.py::detect_peaks, matlens/chroma/processing.py::integrate

Línea base: mínimo móvil con ventana w = \max(21, N/5) puntos (impar), suavizado después con Savitzky–Golay de orden 2. Señal neta y_n = \max(y - b, 0). Picos con prominencia \ge 0.02\max y_n (por defecto); límites donde y_n cae por debajo del 2 % de la altura, y los picos solapados se separan en el mínimo entre ápices.

Modos de integración (trapezoidal entre los límites t_s, t_e del pico):

A_\text{caída} = \int_{t_s}^{t_e} y_n\,dt,\qquad A_\text{valle} = \int_{t_s}^{t_e} \max\big(y - \ell_v(t), 0\big)\,dt,\qquad A_\text{tang} = \int_{t_s}^{t_*} \max\big(y - \ell_t(t), 0\big)\,dt
  • caída perpendicular: área sobre la línea base estimada, con cortes verticales en los valles;
  • valle a valle: \ell_v es la recta que une la señal en los dos límites del pico;
  • tangente (descremado): \ell_t parte del valle delantero con la menor pendiente que deja la señal por encima en el flanco posterior; toca la señal en t_*.

w_{1/2} es la anchura a media altura con los dos cruces interpolados linealmente entre muestras. Anchura en la base de una gaussiana (tangentes en los puntos de inflexión):

w_b = 4\sigma = \frac{4\,w_{1/2}}{2\sqrt{2\ln 2}} = \frac{4\,w_{1/2}}{2.35482\ldots}

Referencia: Dyson, Chromatographic Integration Methods, 2.ª ed. (RSC 1998).

Deconvolución (gaussiana / EMG)

Código: matlens/chroma/processing.py::gaussian, matlens/chroma/processing.py::emg, matlens/chroma/processing.py::deconvolve

G(t) = h\,e^{-(t-\mu)^2/2\sigma^2}
\mathrm{EMG}(t) = h\,\frac{\sigma}{\tau}\,\exp\!\left[\frac{1}{2}\left(\frac{\sigma}{\tau}\right)^2 - \frac{t-\mu}{\tau}\right]\mathrm{erfc}\!\left(-\frac{z}{\sqrt{2}}\right), \qquad z = \frac{t-\mu}{\sigma} - \frac{\sigma}{\tau}

Ajuste lmfit (leastsq, no ponderado) de la suma de componentes a y_n. Inicio: h = señal neta en cada centro dado, \mu = centro (\pm intervalo/6), \sigma = intervalo/25 ([\Delta t, \text{intervalo}/6]), \tau = intervalo/100 (\ge \Delta t/10). Áreas informadas (integrales exactas de cada forma):

A_G = h\,\lvert\sigma\rvert\sqrt{2\pi},\qquad A_\text{EMG} = 2\,h\,\lvert\sigma\rvert

ya que \mathrm{EMG}(t) = 2h\sigma\cdot f(t) con f la densidad EMG de área unidad.

Referencia: Grushka, Anal. Chem. 44 (1972) 1733.

Índices de retención (Kovats isotermo y lineal programado)

Código: matlens/chroma/processing.py::kovats, matlens/chroma/processing.py::retention_index_programmed

Isotermo (Kovats), con tiempos ajustados t' = t_R - t_M:

I = 100\left[n + (N-n)\,\frac{\log t'_x - \log t'_n}{\log t'_N - \log t'_n}\right]

Temperatura programada (van den Dool y Kratz), con tiempos brutos:

I = 100\left[n + (N-n)\,\frac{t_x - t_n}{t_N - t_n}\right]

n y N son los números de carbonos de los n-alcanos que eluyen antes y después. Fuera del intervalo de alcanos se devuelve NaN; kovats exige el tiempo muerto t_m y rechaza tiempos menores o iguales que él. La vista de cromatografía usa el índice programado con la serie de n-alcanos que introduce el usuario; sin serie no muestra ningún índice.

Referencias: Kovats, Helv. Chim. Acta 41 (1958) 1915; van den Dool y Kratz, J. Chromatogr. 11 (1963) 463.

Idoneidad del sistema (USP 621)

Código: matlens/chroma/suitability.py::plate_count, matlens/chroma/suitability.py::resolution, matlens/chroma/suitability.py::tailing_factor, matlens/chroma/suitability.py::capacity_factor, matlens/chroma/suitability.py::repeatability_rsd, matlens/chroma/suitability.py::suitability_report

N = 5.54\left(\frac{t_R}{w_{1/2}}\right)^2, \qquad R_s = \frac{2\,(t_{R,2}-t_{R,1})}{w_1 + w_2}
T_f = \frac{a + b}{2a}\;\;(\text{al 5 \% de la altura}), \qquad k' = \frac{t_R - t_0}{t_0}, \qquad \mathrm{RSD} = 100\,\frac{s}{\bar A}
SímboloSignificadoUnidades
t_R, t_0tiempo de retención y tiempo muertomin
w_{1/2}anchura a media alturamin
w_1, w_2anchuras en la base w_b = 4w_{1/2}/(2\sqrt{2\ln2}) (o w_{1/2} si w_b = 0)min
a, bsemianchuras delantera y trasera al 5 % de la altura, medidas desde el ápicemin
\bar A, smedia y desviación estándar muestral (n-1) de las áreas de inyecciones replicadasunidades de área

Criterios por defecto: R_s \ge 1.5, T_f \le 2.0, N \ge 2000 y RSD \le 2.0\,\% (valor de USP 621 para cinco réplicas). El RSD solo se evalúa si se dan las áreas de inyecciones replicadas; si no, figura como "no evaluado" y no entra en el veredicto.

Nota (diferencia con la literatura): R_s usa la anchura en la base gaussiana 4\sigma calculada desde w_{1/2}, no las tangentes trazadas sobre el pico real; para picos con cola ambas difieren.

Referencia: USP 621; Ph. Eur. 2.2.46.

Cuantificación

Código: matlens/chroma/quantify.py::external_standard, matlens/chroma/quantify.py::internal_standard, matlens/chroma/quantify.py::response_factor, matlens/methods/statistics.py::linear_regression, matlens/methods/statistics.py::inverse_prediction

Calibración por mínimos cuadrados (ponderación ninguna, 1/x o 1/x^2) e interpolación inversa:

x_0 = \frac{y_0 - b_0}{b_1}, \qquad s_{x_0} = \frac{s_{y/x}}{b_1}\sqrt{\frac{1}{m} + \frac{1}{n} + \frac{(y_0 - \bar{y})^2}{b_1^2\sum w_i (x_i-\bar{x})^2}}, \qquad U = 2\,s_{x_0}

con m = número de inyecciones replicadas promediadas (replicate), n patrones, \bar{x}, \bar{y} medias ponderadas y s_{y/x} la desviación residual ponderada. Con calibración cuadrática se usa la raíz de b_0 + b_1x + b_2x^2 = y_0 dentro del intervalo calibrado y

s_{x_0} = \frac{s_{y/x}\sqrt{\mathbf g^\top(\mathbf V^\top\mathbf W\mathbf V)^{-1}\mathbf g + 1/(m\,w_0)}}{\lvert b_1 + 2b_2x_0\rvert},\qquad \mathbf g = (1, x_0, x_0^2)

que para la recta se reduce a la expresión anterior. Estándar interno: se calibra la razón de áreas A_\text{analito}/A_\text{EI} frente a la razón de concentraciones C_\text{analito}/C_\text{EI}; la razón de áreas de la muestra da su razón de concentraciones y C_\text{analito} = x_0\,C_\text{EI} (amount_is), con U escalada igual. Factor de respuesta de un punto: RF = A/\text{cantidad}.

Referencia: ICH Q2; Miller & Miller, Statistics and Chemometrics for Analytical Chemistry, §5; Harris, Quantitative Chemical Analysis, §5-4.

Origen físico y límites de validez

El número de platos procede del modelo de platos teóricos de Martin y Synge: un pico gaussiano de varianza temporal \sigma_t^2 cumple N = (t_R/\sigma_t)^2; con w_{1/2} = 2\sqrt{2\ln2}\,\sigma_t resulta N = 8\ln2\,(t_R/w_{1/2})^2 = 5.545\,(t_R/w_{1/2})^2 (USP redondea a 5.54). La resolución compara la separación de ápices con la semisuma de anchuras en la base (4\sigma). Ambas expresiones suponen picos gaussianos; con cola (EMG) N y R_s quedan sesgados (véase la Nota anterior). El factor de cola mide la asimetría al 5 % de la altura; vale 1 para un pico simétrico.

La caída perpendicular reparte mal el área entre picos de tamaño muy distinto; el descremado tangencial es preferible para un pico pequeño sobre la cola de uno grande (Dyson 1998). El área es proporcional a la cantidad solo dentro del intervalo lineal del detector.

Algoritmo completo de MatLens

  1. Línea base (baseline): mínimo móvil de ventana w (impar, \max(21, N/5)) con relleno de borde; Savitzky–Golay de orden 2 con la misma ventana. Si N \le w, la línea base es el mínimo global.
  2. Detección (detect_peaks): scipy.signal.find_peaks sobre la señal neta, prominencia 0.02\max y_n, distancia mínima 3 puntos; límites mientras la señal neta supera el 2 % de la altura; los picos solapados se cortan en el mínimo entre ápices.
  3. Integración trapezoidal según el modo; w_{1/2} con interpolación lineal (0 si un cruce cae fuera de la ventana del pico) y w_b = 4w_{1/2}/2.35482.
  4. Idoneidad: N, T_f y R_s se recalculan con caída perpendicular; k' solo si se da t_0; RSD solo con áreas replicadas. El veredicto exige todos los criterios.
  5. Deconvolución: lmfit.minimize (leastsq), residuo no ponderado sobre la señal neta, con los límites indicados arriba.

Incertidumbre y avisos

Solo la cuantificación propaga incertidumbre: U = 2\,s_{x_0} (k = 2), que incluye la dispersión de la calibración y de las m inyecciones de la muestra, pero no la incertidumbre de los patrones, la de la preparación ni el sesgo de integración. Los parámetros de idoneidad, las áreas y los índices de retención se dan sin incertidumbre. matlens/chroma/ no emite indicadores warning/invalid: los criterios fallidos aparecen en el veredicto USP y los casos imposibles (tiempo muerto no menor que t_R, modo desconocido) lanzan un error.

Ejemplo resuelto: idoneidad del sistema

Cromatograma sintético de 10 min (2001 puntos): una gaussiana (h = 100, t = 4.0 min, \sigma = 0.05 min, área exacta 12.53) y un pico EMG con cola (h = 60, \mu = 4.6, \sigma = 0.05, \tau = 0.04 min), sobre una línea base constante de 2 con ruido gaussiano \sigma = 0.2 (semilla fija); t_0 = 1.0 min y cinco áreas replicadas 10.02, 10.11, 9.95, 10.06, 9.98. Detección e integración por caída perpendicular y suitability_report:

Picot_R (min)Áreaw_{1/2} (min)NT_fk'
1412.630.1184632213
24.636.1690.13961491.193.63

R_s = 2.88; RSD = 0.633 %; veredicto USP 621: cumple.

Ejemplo resuelto: índices de retención

n-Alcanos C10, C11 y C12 a 5.20, 7.85 y 10.40 min; analito a 9.10 min; t_M = 1.0 min.

ÍndiceValor
programado (van den Dool–Kratz)1149.02
Kovats isotermo1152.97

Generado desde MatLens c0ab138. ← Todas las técnicas