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):
- 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):
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
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):
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:
Temperatura programada (van den Dool y Kratz), con tiempos brutos:
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
| Símbolo | Significado | Unidades |
|---|---|---|
| t_R, t_0 | tiempo de retención y tiempo muerto | min |
| w_{1/2} | anchura a media altura | min |
| w_1, w_2 | anchuras en la base w_b = 4w_{1/2}/(2\sqrt{2\ln2}) (o w_{1/2} si w_b = 0) | min |
| a, b | semianchuras delantera y trasera al 5 % de la altura, medidas desde el ápice | min |
| \bar A, s | media y desviación estándar muestral (n-1) de las áreas de inyecciones replicadas | unidades 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:
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
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
- 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. - Detección (
detect_peaks):scipy.signal.find_peakssobre 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. - 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.
- 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.
- 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:
| Pico | t_R (min) | Área | w_{1/2} (min) | N | T_f | k' |
|---|---|---|---|---|---|---|
| 1 | 4 | 12.63 | 0.1184 | 6322 | 1 | 3 |
| 2 | 4.63 | 6.169 | 0.139 | 6149 | 1.19 | 3.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.
| Índice | Valor |
|---|---|
| programado (van den Dool–Kratz) | 1149.02 |
| Kovats isotermo | 1152.97 |