Análisis de espectros EPR de onda continua (primera derivada) en matlens/core/epr.py. Campos en mT; constantes CODATA 2018: h = 6.62607015\times10^{-34} J·s (exacta), \mu_B = 9.2740100783\times10^{-24} J/T, g_e = 2.00231930436256, N_A = 6.02214076\times10^{23} mol⁻¹ (exacta). De ellas, \mu_B/h = 13.996 MHz/mT (constante MHZ_PER_MT).
Origen físico. Un electrón desapareado en un campo B tiene dos niveles Zeeman separados \Delta E = g\mu_B B. Con frecuencia de microondas fija \nu se barre el campo y hay absorción resonante cuando h\nu = g\mu_B B. La detección con modulación de campo (amplitud B_m pequeña frente a la anchura de línea) y detector sensible a fase entrega la primera derivada de la absorción respecto al campo; por eso todo el análisis supone espectros derivados, y un espectro de absorción se deriva primero (ver analyze). Supuestos generales: régimen lineal (sin saturación de potencia), sin sobremodulación (B_m \lesssim \Delta B_{pp}/3), fase del detector correcta y campo calibrado.
Factor g y campo de resonancia
Código: matlens/core/epr.py::g_factor, matlens/core/epr.py::field_for_g, matlens/core/epr.py::field_offset_from_marker
con \nu en GHz y B en mT (conversión interna a Hz y T). Conversión de unidades de campo (field_to_mT): 1 G = 0.1 mT, 1 T = 1000 mT, 1 kG = 100 mT; cualquier otra unidad es un error.
| Símbolo | Significado | Unidades |
|---|---|---|
| g | factor g (adimensional; electrón libre g_e) | — |
| \nu | frecuencia de microondas | GHz |
| B | campo magnético en el centro de la línea | mT |
Calibración del campo. Si se mide un marcador de g conocido, field_offset_from_marker devuelve la corrección que hay que sumar al campo registrado: \Delta B = B_\text{res}(g_\text{ref},\nu) - B_\text{marcador}, con DPPH g_\text{ref} = 2.0036 por defecto (Krzystek et al., 1997). analyze suma esa corrección (field_offset_mT) a todo el eje. Sensibilidad: \partial g/g = -\partial B/B; en banda X (≈ 340 mT) un error de 0.1 mT en el campo produce un error de ≈ 6×10⁻⁴ en g, mayor que la diferencia entre muchos radicales, de ahí la importancia del marcador.
Línea base y doble integración
Código: matlens/core/epr.py::baseline_correct, matlens/core/epr.py::double_integral
Se ajusta un polinomio (orden 1 por defecto) al 10 % exterior de cada extremo (mínimo 3 puntos) y se resta. Luego:
(integración trapezoidal acumulada; a la absorción a se le resta una recta ajustada por mínimos cuadrados a su 10 % exterior de cada extremo antes de la segunda integración). Antes de todo, los puntos no finitos se eliminan y el eje se ordena por campo creciente.
Significado y límites. La doble integral es el área de la absorción, proporcional al número de espines. Supone que los bordes del barrido están libres de señal: si una línea ancha no vuelve a la línea base dentro del barrido, la recta de los bordes recorta su área. Las líneas lorentzianas tienen colas largas, de modo que con barridos finitos DI es sistemáticamente menor que el área verdadera (ver el ejemplo). La segunda integración amplifica cualquier desplazamiento residual de la derivada de forma cuadrática con la anchura del barrido. No se propaga incertidumbre a DI.
Referencia: Eaton, Eaton, Barr & Weber, Quantitative EPR, Springer 2010, §11.2, doi:10.1007/978-3-211-92948-3.
Recuento de espines
Código: matlens/core/epr.py::Acquisition.factor, matlens/core/epr.py::spin_count, matlens/core/epr.py::tempol_spins
| Símbolo | Significado | Unidades |
|---|---|---|
| G_R | ganancia del receptor (lineal; si se da en dB, 10^{\mathrm{dB}/20}) | — |
| C_t | tiempo de conversión | ms |
| n_\text{scans} | número de barridos | — |
| P | potencia de microondas (por debajo de saturación) | mW |
| B_m | amplitud de modulación (sin sobremodulación) | mT |
| Q, \eta | factor de calidad de la cavidad y factor de llenado | — |
| S | número cuántico de espín | — |
| T | temperatura (ley de Curie) | K |
| N_\text{ref} | espines de la referencia | — |
Derivación. La señal por espín es proporcional a la polarización de Boltzmann, que a alta temperatura (g\mu_B B \ll k_BT) da la ley de Curie \propto S(S+1)/T; al campo de microondas en la muestra, B_1 \propto \sqrt{P} (régimen no saturado); a la amplitud de modulación (régimen lineal, B_m pequeña); y a la ganancia, al tiempo de conversión y al número de barridos (si el espectrómetro suma y no promedia los barridos). Cada término deja de ser válido fuera de su régimen: con saturación la señal crece menos que \sqrt{P}; con sobremodulación la línea se ensancha y DI deja de ser lineal en B_m; a baja temperatura o alto campo la polarización se aparta de Curie. MatLens no comprueba ninguno de esos regímenes: solo divide por F.
Espines de un monorradical pesado: N = (m/M)\,N_A, con m en g (entrada en mg), M = 172.24 g/mol (TEMPOL; DPPH 394.32) y N_A = 6.02214076\times10^{23} mol⁻¹. Muestra y referencia deben medirse en el mismo resonador, con la misma geometría de tubo y disolvente (el factor de llenado y Q dependen de ellos). No se propaga incertidumbre: la incertidumbre real del recuento por comparación con un patrón suele estar dominada por la colocación de la muestra y por la diferencia de Q, que no entran en el cálculo.
Referencia: Eaton et al. (2010), cap. 2 y 11.
Ejemplo resuelto
Referencia: 0.10 mg de TEMPOL → tempol_spins = 3.4964e+17 espines. Referencia medida con 60 dB de ganancia, 0.1 mT de modulación, 2 mW, 4 barridos; muestra con 70 dB, 0.4 mT, 2 mW, 16 barridos (mismo tiempo de conversión, T, Q, S = 1/2). Dobles integrales: muestra 3.2, referencia 1.0 (u.a.).
- F_s/F_r = 50.596 (10^{10/20}\times 4\times 4).
spin_count→ N = 2.2113e+16 espines.
Anchura de línea y puntos de inflexión del tensor g
Código: matlens/core/epr.py::line_features, matlens/core/epr.py::g_turning_points, matlens/core/epr.py::detect_symmetry
\Delta B_{pp} = \lvert B_\text{min} - B_\text{max}\rvert, siendo B_\text{max} y B_\text{min} los extremos de la derivada refinados por una parábola de tres puntos (vértice limitado al intervalo de los dos vecinos); el centro es el cruce por cero entre ambos (interpolación lineal; si no hay cambio de signo, el punto medio). La amplitud pico a pico es Y_{pp} = y_\text{max} - y_\text{min}. Para una lorentziana \Delta B_{pp} = \Gamma_\text{FWHM}/\sqrt{3}; para una gaussiana \Delta B_{pp} = \Gamma_\text{FWHM}/\sqrt{2\ln 2}.
En un polvo cada orientación resuena a un campo distinto y el espectro es la suma sobre orientaciones; los valores principales del tensor g aparecen como puntos de inflexión del espectro de polvo (rasgos tipo absorción en los bordes y tipo derivada en el valor intermedio):
- Isótropo: g_\text{iso} en el cruce por cero.
- Axial: g_\parallel en el extremo exterior (máximo a bajo campo o mínimo a alto campo de la región con \lvert y\rvert > 0.05\max\lvert y\rvert) más alejado del cruce por cero; g_\perp en el cruce por cero.
- Rómbico: g_1 en el máximo a bajo campo, g_2 en el cruce central, g_3 en el mínimo a alto campo.
Los extremos exteriores se buscan en una ventana de \max(3, \lfloor n/50\rfloor) puntos desde el primer (o último) punto de la región significativa. g_2 es el cruce por cero del par adyacente de lóbulos (+ → −) de mayor excursión; si no lo hay, el cruce de la línea más intensa.
La simetría automática (detect_symmetry) cuenta los lóbulos con \lvert y\rvert > 0.1\max\lvert y\rvert; los lóbulos del mismo signo separados por menos de \max(3, n/400) puntos se unen y los más cortos se descartan, para que el ruido en el umbral no fragmente un lóbulo en bordes falsos. Si hay menos de dos lóbulos, el primero es negativo o el último positivo, el espectro es isótropo; si no, cada borde con aspecto de absorción (primer lóbulo positivo no seguido de uno negativo; último negativo no precedido de uno positivo) suma uno: 0 → isótropo, 1 → axial, 2 → rómbico.
Límites. La lectura por puntos de inflexión supone líneas individuales estrechas frente a la anisotropía de g y sin hiperfino sin resolver; con anisotropía pequeña o ensanchamiento grande los puntos de inflexión se desplazan y la única forma correcta es la simulación del espectro de polvo, que MatLens no hace. Tampoco se distinguen especies superpuestas salvo el caso de la línea estrecha menor descrito abajo. No se calcula incertidumbre de g; la resolución está limitada por el paso del campo y por su calibración.
Señal dominante y líneas estrechas menores (matlens/core/epr.py::separate_minor_narrow_lines). Antes de leer los extremos se identifica la señal dominante por intensidad integrada (doble integral), no por amplitud de la derivada. Para una línea, el área de absorción es
de modo que un radical estrecho y débil (g \approx 2.00) puede dominar la amplitud de la derivada de un espectro cuya intensidad es una señal ancha de un ion metálico. La línea dueña de los extremos globales se trata como menor si (0) su g está en el intervalo de los radicales y defectos estrechos de la tabla de referencia, 1.9995–2.0070 (centro E′ 2.0003 … TEMPOL 2.0062; un rasgo agudo fuera de él es un punto de inflexión de un espectro de polvo, p. ej. g_2 de un tensor rómbico, no otra especie), (1) su área estimada con \kappa lorentziano (el mayor de las formas habituales, de modo que la prueba tiende a conservar la línea) es menor que la mitad de la doble integral de todo el espectro y (2) su \Delta B_{pp} es menor que 0.25 veces el de lo que queda. Se resta una derivada lorentziana ajustada por mínimos cuadrados en \pm 5\,\Delta B_{pp} (con recta local) y el resto en \pm 3\,\Delta B_{pp} se une con una recta; se repite hasta tres líneas. Cada línea excluida se informa (g, \Delta B_{pp}, fracción de la doble integral) como aviso.
Detalle del ajuste: modelo
(w = semianchura a media altura de la absorción, B_z = cruce por cero inicial), valores iniciales B_0 = B_z, w_0 = \sqrt3\,\Delta B_{pp}/2, A_0 = \pm\kappa\,Y_{pp}\Delta B_{pp}^2 (signo según el orden máximo/mínimo), c_0 = c_1 = 0; curve_fit (Levenberg–Marquardt, sin pesos ni cotas, maxfev = 4000). El proceso se detiene si la ventana tiene menos de 8 puntos o cubre todo el espectro, si el ajuste falla, si el centro ajustado se aleja más de \Delta B_{pp} del cruce inicial o si alguna de las condiciones (0)–(2) no se cumple. La fracción informada es \min(\kappa Y_{pp}\Delta B_{pp}^2,\ \lvert A\rvert)/\mathrm{DI}_\text{tot}.
Referencia: Weil & Bolton, Electron Paramagnetic Resonance, 2.ª ed., Wiley 2007, cap. 4 y apéndice F, doi:10.1002/0470084987; Eaton, Eaton, Barr & Weber, Quantitative EPR, Springer 2010, cap. 2 (la doble integral es proporcional al número de espines).
Ejemplo resuelto: línea única
Derivada de una lorentziana sintética: \nu = 9.5 GHz, g = 2.0023 (campo de resonancia field_for_g = 338.9869 mT), \Delta B_{pp} = 0.5 mT, área de absorción 1 (u.a.·mT), barrido 320–360 mT con 4001 puntos y ruido gaussiano \sigma = 5\times10^{-4} (semilla fija).
| Magnitud | MatLens | Valor del modelo |
|---|---|---|
| simetría detectada | isotropic | isotropic |
| g_\text{iso} | 2.0023 | 2.0023 |
| \Delta B_{pp} (mT) | 0.5028 | 0.5 |
| doble integral DI | 0.9524 | 1 (menos las colas fuera del barrido) |
| A = (\pi/\sqrt3)\,Y_{pp}\,\Delta B_{pp}^2 | 1.011 | 1 |
La doble integral queda por debajo de 1 porque las colas lorentzianas fuera del barrido se pierden y las rectas ajustadas al 10 % de cada borde (en la derivada y en la absorción) absorben parte de las colas que sí están dentro; es el sesgo típico de la doble integración de líneas lorentzianas en barridos finitos. La fórmula \kappa Y_{pp}\Delta B_{pp}^2 no sufre ese sesgo porque supone la forma exacta.
Ejemplo resuelto: señal dominante
Espectro sintético con una línea ancha (g = 2.10, \Delta B_{pp} = 15 mT, área 1) y un radical estrecho (g = 2.0036, \Delta B_{pp} = 0.3 mT, área 0.02) a 9.5 GHz. La amplitud de la derivada del radical (0.0611) es 49.9 veces la de la línea ancha (0.00123), así que posee los extremos globales aunque solo aporta el 2 % del área. analyze:
| Línea menor excluida: g | \Delta B_{pp} (mT) | fracción de DI |
|---|---|---|
| 2.0036 | 0.3 | 0.0298 |
Tras excluirla, simetría = isotropic, g = 2.1001, \Delta B_{pp} = 14.98 mT: los valores de la señal ancha.
Desdoblamiento hiperfino
Código: matlens/core/epr.py::hyperfine_splitting, matlens/core/epr.py::find_lines, matlens/core/epr.py::analyze
con \Delta B_i las separaciones entre las n líneas consecutivas (centros = cruces por cero de cada par máximo→mínimo con prominencia \ge 0.1\max\lvert y\rvert, scipy.signal.find_peaks), s la desviación estándar muestral y \mu_B/h = 13.996 MHz/mT. Incertidumbre 1σ (k = 1, error estándar de la media de las separaciones; 0 si solo hay dos líneas). Si hay al menos 3 líneas en un espectro isótropo, g_\text{iso} se recalcula en el centro del multiplete (media de las posiciones). Supuesto: multiplete de primer orden equiespaciado de 2I+1 líneas de un único núcleo. Si A no es pequeño frente a g\mu_B B (p. ej. ⁵⁵Mn, ⁵¹V), las correcciones de segundo orden (Breit–Rabi) hacen las separaciones desiguales y desplazan el centro: u(A) crece, pero el sesgo en g y en A no se corrige. Varios núcleos equivalentes (2nI+1 líneas con intensidades binomiales) se interpretan como un solo núcleo de espín mayor.
En analyze, la conversión a MHz usa el último valor de g del tensor (g_\perp en axial, g_3 en rómbico) y, en isótropo con multiplete, el g del centro.
La asignación a centros de referencia (matlens/core/epr.py::assign_g) busca intervalos de g tabulados que contengan algún g medido con tolerancia \pm 0.002 y los ordena por coincidencia del número de líneas y de A: puntuación 1, +1 si coincide el número de líneas (−0.5 si no), +0.5 si A cae en el intervalo tabulado (−0.25 si no), −0.3 a un ion con hiperfino cuando se observa una sola línea. Es una ayuda de búsqueda, no una identificación: varios centros comparten intervalos de g.
Ejemplo resuelto: multiplete hiperfino
Sexteto sintético tipo ⁵⁵Mn (I = 5/2): seis lorentzianas de igual área separadas 9.0 mT y centradas en g = 2.001 a 9.5 GHz, \Delta B_{pp} = 0.8 mT.
| Magnitud | MatLens |
|---|---|
| líneas encontradas | 6 |
| I = (n-1)/2 | 2.5 |
| A (mT) | 8.9999 ± 9e-05 |
| A (MHz) | 252.05 |
| g_\text{iso} (centro del multiplete) | 2.001 |
| asignación principal | Mn²⁺ (sexteto ⁵⁵Mn) |
El tratamiento de primer orden supone separaciones iguales; en un sexteto real de Mn²⁺ los términos de segundo orden las hacen crecer con el campo y u(A) lo refleja.
Referencia: Weil & Bolton (2007).
Flujo completo de analyze
Código: matlens/core/epr.py::analyze
- Eliminar puntos no finitos, ordenar por campo y sumar la corrección de campo.
- Si la traza parece de absorción (\lvert\sum y\rvert / \sum\lvert y\rvert > 0.5 tras restar la mediana del 10 % de cada extremo,
is_absorption), derivarla numéricamente (np.gradient). - Restar la línea base polinómica (orden 1 por defecto) del 10 % de cada extremo.
- Excluir hasta tres líneas estrechas menores (señal dominante, arriba).
- Detectar la simetría si es
auto; leer \Delta B_{pp}, el tensor g y las líneas resueltas. - Con ≥ 3 líneas, calcular el hiperfino; asignar centros de referencia.
Avisos de validez. El módulo no emite avisos warning/invalid propios; las líneas menores excluidas se informan junto al resultado. Las condiciones de saturación, sobremodulación y calibración del campo no se comprueban.
Nota (diferencia con la literatura): la simetría se decide por la forma de los bordes y los valores de g se leen en los puntos de inflexión, sin simulación del espectro de polvo (como haría, p. ej., EasySpin).
Referencias adicionales: constantes, Tiesinga et al., CODATA 2018, Rev. Mod. Phys. 93 (2021) 025010, doi:10.1103/RevModPhys.93.025010; DPPH, Krzystek, Sienkiewicz, Pardi & Brunel, J. Magn. Reson. 125 (1997) 207.