Análisis XANES y EXAFS de matlens/core/xas.py. Energías en eV, k en Å⁻¹, R en Å. Constante E - E_0 = K\,k^2 con K = \hbar^2/2m_e = 3.8099821 eV·Å² (valor de la constante KTOE, el mismo que usan IFEFFIT/Larch; con CODATA 2018, \hbar^2/2m_e = 3.80998 eV·Å²). Bordes tabulados para guess_edge (tolerancia ±60 eV): Bearden & Burr, Rev. Mod. Phys. 39 (1967) 125, doi:10.1103/RevModPhys.39.125.
Origen físico. El coeficiente de absorción \mu(E) salta en el borde cuando la energía del fotón alcanza la de ligadura de un nivel interno (K, L₃). La región XANES (hasta unos 50 eV sobre el borde) refleja los estados vacíos y la geometría local: la posición del borde crece con el estado de oxidación (más carga efectiva en el núcleo) y los pre-picos de los metales de transición son transiciones 1s→3d, débiles y sensibles a la valencia y la simetría. En la región EXAFS el fotoelectrón, de número de onda k = \sqrt{2m_e(E-E_0)}/\hbar, se retrodispersa en los vecinos e interfiere consigo mismo, y la oscilación relativa \chi(k) codifica distancias, números de coordinación y desorden.
μ(E) a partir de los canales
Código: matlens/core/xas.py::mu_from_channels
Supuestos: transmisión con muestra homogénea y espesor adecuado (sin efecto de huecos ni armónicos); fluorescencia de muestra diluida o delgada. En fluorescencia de muestras concentradas la autoabsorción atenúa las oscilaciones y la línea blanca; MatLens no la corrige. Los puntos no finitos o con energía repetida se eliminan y el eje se ordena (_clean).
E0 y normalización (Athena)
Código: matlens/core/xas.py::find_e0, matlens/core/xas.py::pre_edge
E_0 es el máximo de d\mu/dE (gradiente numérico, excluyendo el 2 % de cada extremo), refinado con una parábola por tres puntos si el vértice cae a menos de un paso.
\mathrm{post} es un polinomio de orden n_\text{norm} en E-E_0 ajustado en [E_0+\mathrm{norm}_1, E_0+\mathrm{norm}_2]. Valores por defecto: \mathrm{pre}_1 = \max(-200, E_\text{min}-E_0), \mathrm{pre}_2 = -30 (como máximo -5), \mathrm{norm}_2 = final de los datos, \mathrm{norm}_1 = \min(150, \mathrm{norm}_2/3), n_\text{norm} = 2 si el intervalo supera 350 eV, 1 si supera 50 eV, si no 0; n_v = 0. Ajustes por mínimos cuadrados no ponderados. Altura de la línea blanca: máximo de \mu_\text{norm} en [E_0, E_0+30]; energía a media altura: primer cruce de \mu_\text{norm} = 0.5 desde E_0 - 30 (interpolación lineal).
Límites. El máximo de la derivada es una convención: con varios rasgos en el borde (pre-picos intensos, hombros) puede saltar de uno a otro y desplazar E_0 varios eV; para comparar valencias conviene fijar E_0 o usar la energía a media altura. El salto depende de los intervalos pre y post elegidos, y con él toda la normalización (alturas de línea blanca, LCF). Si el salto resulta nulo o no finito, error «Salto de borde nulo: revisa los rangos de normalización». No se propaga incertidumbre a E_0 ni al salto.
Referencia: Ravel & Newville, J. Synchrotron Rad. 12 (2005) 537, doi:10.1107/S0909049505012719.
Ejemplo resuelto: normalización
Borde sintético: arcotangente de salto 1.3 centrada en 7112.0 eV (semianchura 1.5 eV), pre-borde lineal con pendiente −2×10⁻⁵ /eV, ligera caída post-borde y ruido gaussiano σ = 0.002 (semilla fija), malla de 0.5 eV entre 6900 y 7700 eV. pre_edge(E, mu) con los valores por defecto:
| Magnitud | MatLens |
|---|---|
| E_0 (eV) | 7112.047 |
| \Delta\mu_0 | 1.278 |
| pre₁, pre₂ (eV) | -200, -30 |
| norm₁, norm₂ (eV) | 150, 587.5 |
| n_\text{norm} | 2 |
| energía a media altura (eV) | 7112.022 |
| máximo en [E_0, E_0+30] (eV, altura) | 7142, 0.9843 |
El salto recuperado difiere ligeramente de 1.3 porque el polinomio post-borde extrapolado a E_0 absorbe la cola lenta de la arcotangente y la caída post-borde; el borde sintético no tiene línea blanca, así que el máximo en [E_0, E_0+30] cae al final de ese intervalo.
Pre-pico (Wilke et al.) y relación Fe³⁺/ΣFe
Código: matlens/core/xas.py::fit_pre_edge, matlens/core/xas.py::fe_redox_from_centroid
Línea base polinómica (orden 3 por defecto) ajustada a los puntos de la ventana de base fuera de la ventana del pico; el residuo se ajusta con n gaussianas de área A_i:
o pseudo-Voigt (1-\eta)G + \eta L con \eta = 0.5 y la misma FWHM (\gamma = \sigma\sqrt{2\ln 2}). Restricciones: A_i \ge 0, E_i dentro de la ventana, \sigma_i \in [0.3, 2.5] eV; inicio \sigma_i = 0.6 eV, centros equiespaciados (o en el máximo si n=1). Resultado:
con E_2 = 7112.1 eV, E_3 = 7113.5 eV e intensidades de los extremos i_2 = i_3 = 1 por defecto (interpolación lineal); el resultado se acota a [0,1]. Los errores estándar de centros y áreas son los de lmfit (1σ).
La ventana de base por defecto es [\text{lo}-8,\ \text{hi}+4] eV; si fuera de la ventana del pico quedan menos de n_\text{base}+2 puntos, error. Área inicial: integral de la parte positiva del residuo repartida entre los componentes. Se informa \chi^2_\text{red}. La fórmula de Fe³⁺/ΣFe viene de que el centroide de una mezcla es (x\,i_3E_3 + (1-x)\,i_2E_2)/(x\,i_3 + (1-x)\,i_2); supone que el pre-pico de la muestra es una mezcla de los dos extremos con la misma coordinación que la calibración. La coordinación (tetraédrica u octaédrica) cambia la intensidad y algo el centroide, y Wilke et al. muestran que el centroide solo no separa valencia y coordinación. La calibración de energía (Fe metálico a 7112.0 eV) debe ser la misma que la de los valores de referencia.
Referencia: Wilke, Farges, Petit, Brown & Martin, Am. Mineral. 86 (2001) 714.
Estado de oxidación desde la posición del borde
Código: matlens/core/xas.py::oxidation_state_from_edge
Regresión lineal ponderada V = a + bE sobre los patrones (E_j, V_j, \sigma_{E,j}) con pesos w_j = 1/(b_0\sigma_{E,j})^2, siendo b_0 la pendiente de un primer ajuste no ponderado (\sigma_E = 0.15 eV por defecto).
con \mathbf{C} la covarianza de (a,b) y r_j los residuos de los m patrones. Incertidumbre 1σ (k=1).
La relación lineal energía–valencia (ley de Kunzl) es empírica y solo vale entre compuestos de ligandos y coordinación parecidos; los patrones deben medirse con la misma calibración de energía y la misma definición de energía de borde que la muestra. Se necesitan al menos dos patrones con energías distintas (errores «Se necesitan al menos dos patrones» y «Los patrones tienen la misma energía»).
Referencia: Capehart et al., Phys. Rev. B 52 (1995) 8; Wilke et al. (2001).
Ejemplo resuelto: valencia por posición del borde y por pre-pico
Patrones de Fe (energía de borde, valencia): (7112.0, 0), (7120.5, 2), (7124.1, 3) con \sigma_E = 0.15 eV; muestra a 7122.0 eV. oxidation_state_from_edge:
- pendiente b = 0.2457 /eV, ordenada a = -1747.2
- valencia = 2.436 ± 0.096 (k = 1; incluye la dispersión de los patrones respecto a la recta, que aquí domina porque el Fe metálico no sigue la misma relación lineal).
Pre-pico: un centroide de 7112.9 eV da fe_redox_from_centroid = 0.5714 (Fe³⁺/ΣFe, intensidades iguales de los extremos).
Combinación lineal (LCF)
Código: matlens/core/xas.py::lcf, matlens/core/xas.py::lcf_combinations
resuelto por NNLS (la restricción \sum w_i = 1 es una ecuación adicional fuertemente ponderada; se desactiva con sum_to_one=False). Las referencias se interpolan linealmente sobre la malla de la muestra en el intervalo común.
(\nu = N - n_\text{ref}, solo para pesos activos, 1σ). Las fracciones son w_i/\sum w. lcf_combinations prueba todos los subconjuntos de hasta 3 referencias y los ordena por R.
Límites e incertidumbre. Las incertidumbres de los pesos salen de la covarianza lineal sin restricción, escalada por \chi^2/\nu; no tienen en cuenta la restricción de suma ni la correlación entre referencias parecidas, y no incluyen el error de no disponer de la referencia correcta (sesgo de modelo). Un factor R pequeño no prueba que las referencias sean las especies presentes. Los errores de calibración de energía entre muestra y referencias (unas décimas de eV) sesgan los pesos; MatLens no ajusta desplazamientos de energía en la LCF. Con menos de n_\text{ref}+2 puntos comunes, error.
Referencia: Ravel & Newville (2005).
Ejemplo resuelto: combinación lineal
Muestra sintética y = 0.3\,r_A + 0.7\,r_B + ruido σ = 0.003 con dos referencias normalizadas (bordes en 7120 y 7124 eV con líneas blancas distintas). lcf:
| Referencia | peso w_i | u(w_i) (1σ) | fracción |
|---|---|---|---|
| A | 0.2996 | 0.00084 | 0.2996 |
| B | 0.7004 | 0.00083 | 0.7004 |
\sum w = 1, factor R = 1.3e-05, \chi^2_\nu = 1e-05. lcf_combinations ordena:
| Combinación | factor R |
|---|---|
| A + B | 1.3e-05 |
| B | 0.00536 |
| A | 0.0292 |
Fondo EXAFS (AUTOBK) y transformadas
Código: matlens/core/xas.py::autobk, matlens/core/xas.py::ftwindow, matlens/core/xas.py::xftf
\mu_0(k) es un B-spline cúbico con N = \max(4, 1 + \lfloor 2R_\text{bkg}\Delta k/\pi\rfloor) coeficientes y nudos uniformes, cuyos coeficientes minimizan (mínimos cuadrados, scipy.optimize.least_squares, inicio: ajuste spline directo a \mu) las partes real e imaginaria de \tilde\chi(R) para R < R_\text{bkg} más términos de anclaje ("clamps") en los 3 primeros y últimos puntos (R_\text{bkg} = 1 Å, k^w con w=2, dk = 0.1 por defecto; malla \Delta k = 0.05 Å⁻¹, N_\text{FFT} = 2048). Con xraylarch se puede usar su autobk.
Nota (código frente a la descripción anterior): en autobk el anclaje inferior está desactivado por defecto (clamp_lo = 0) y solo el superior está activo (clamp_hi = 1, sobre los nclamp = 3 últimos puntos), con escala \delta k\,\max(k_\text{max},1)^w/\sqrt\pi. Los nudos interiores están espaciados uniformemente en k entre k_\text{min} y k_\text{max} (por defecto k_\text{min} = 0 y k_\text{max} = final de los datos), y \chi(R) se evalúa para los índices R < R_\text{bkg} (int(1.01 + Rbkg/δR) puntos). R_\text{bkg} debe ser menor que la mitad de la distancia al primer vecino; si es mayor, el fondo absorbe parte de la primera capa.
Ventana de Hanning con rampas de anchura dk: \sin^2[\tfrac{\pi}{2}(k-k_1)/dk] de k_\text{min}-dk/2 a k_\text{min}+dk/2, 1 en la meseta y \cos^2 simétrica en k_\text{max}.
El núcleo e^{-2ik_nR_m} = e^{-2\pi i nm/N} es el de la FFT directa (numpy.fft.fft), el mismo que usa xftf_fast de Larch, de modo que las partes real e imaginaria de \tilde\chi(R) coinciden con Larch/Athena. Algunas presentaciones escriben la integral con e^{+2ikR}; el módulo \lvert\tilde\chi(R)\rvert es el mismo en ambos convenios y solo cambia el signo de la parte imaginaria.
Referencia: Newville, Līviņš, Yacoby, Rehr & Stern, Phys. Rev. B 47 (1993) 14126, doi:10.1103/PhysRevB.47.14126.
Ajuste de capas (dispersión simple)
Código: matlens/core/xas.py::ScatteringPath.chi, matlens/core/xas.py::fit_shells, matlens/core/xas.py::read_feff_dat, matlens/core/xas.py::path_from_reference
| Símbolo | Significado | Unidades |
|---|---|---|
| S_0^2 | factor de reducción de amplitud (fijo, 0.9 por defecto) | — |
| N_j | número de coordinación (\ge 0) | — |
| R_j | distancia (R_\text{eff} \pm 0.5) | Å |
| \sigma_j^2 | factor de Debye–Waller ([-0.005, 0.05], inicio 0.005) | Ų |
| \Delta E_0 | desplazamiento de energía, compartido por defecto ([-15, 15]) | eV |
| A_j, \phi_j | amplitud y fase de retrodispersión | — , rad |
De FEFF: A = \lvert f\rvert \cdot \mathrm{red}\cdot e^{-2R_\text{eff}/\lambda}, \phi = 2\phi_c + \phi_f. De un compuesto de referencia (filtrado de Fourier con peso k^2): A = \lvert z\rvert\,R^2 e^{2\sigma^2k^2}/(k\,N S_0^2) y \phi = \arg z + \pi/2 - 2kR.
Objetivo (lmfit, no ponderado): partes real e imaginaria de la FT de (\chi_\text{datos}-\chi_\text{modelo}) en [R_\text{min}, R_\text{max}] (espacio R, por defecto k = 3–12 Å⁻¹, R = 1–3 Å, w = 2) o k^w(\chi_\text{datos}-\chi_\text{modelo}) en espacio k. Inicio: $N = $ degeneración del camino, R = R_\text{eff}.
Incertidumbres: errores estándar de lmfit (1σ, escalados por \chi^2_\nu).
Validez: solo dispersión simple; A(k) y el término de recorrido libre se toman a la R de referencia (válido para \lvert\Delta R\rvert \lesssim 0.1 Å); sin cumulantes más allá de \sigma^2. Frente a Larch en lámina de Cu el N resulta ≈8 % menor (R concuerda en ~0.01 Å). Con xraylarch instalado y caminos FEFF se usa feffit (matlens/core/xas.py::fit_shells_larch).
Derivación de la ecuación EXAFS. En la aproximación de dispersión simple y onda plana, la onda saliente se retrodispersa en un átomo a distancia R con amplitud f(k) y vuelve con fase 2kR + \phi(k); la interferencia modula \mu en proporción a \sin(2kR+\phi)/(kR^2) (decaimiento esférico 1/R^2). La suma sobre N vecinos equivalentes con desorden gaussiano da el factor de Debye–Waller e^{-2\sigma^2k^2}; el recorrido libre medio finito del fotoelectrón da e^{-2R/\lambda(k)} (incluido en A) y las excitaciones multielectrónicas el factor S_0^2. S_0^2 y N están totalmente correlacionados, por eso S_0^2 se fija. El desorden no gaussiano (anarmonicidad, distribuciones asimétricas) requiere cumulantes de tercer y cuarto orden, que el ajuste integrado no incluye: sin ellos R sale corto y N bajo.
Restricciones y criterio. El número de parámetros variables no debe superar N_\text{idp} (criterio de Stern / Nyquist); MatLens informa N_\text{idp} pero no lo impone. Los parámetros se fijan con fix (nombres N{i}, R{i}, s2{i}, dE0 o dE0{i}). Los errores de lmfit no incluyen la incertidumbre de S_0^2, de las amplitudes y fases ni la del fondo.
Referencia: Stern, Sayers & Lytle, Phys. Rev. B 11 (1975) 4836, doi:10.1103/PhysRevB.11.4836.
Ejemplo resuelto: ajuste de una capa
Camino sintético de dispersión simple (R_\text{eff} = 2.00 Å, degeneración 6) con A(k) = 0.9\,e^{-0.01k^2} + 0.1 y \phi(k) = -0.6k + 1.2; datos generados con S_0^2 = 0.9, N = 6, R = 2.03 Å, \sigma^2 = 0.0060 Ų, \Delta E_0 = 1.5 eV y ruido σ = 0.002. fit_shells con los valores por defecto (espacio R, k = 3–12 Å⁻¹, R = 1–3 Å, k^2):
| Parámetro | Ajuste (±1σ) | Verdadero |
|---|---|---|
| N | 6.004 ± 0.013 | 6 |
| R (Å) | 2.0298 ± 0.00016 | 2.03 |
| \sigma^2 (Ų) | 0.006032 ± 2.3e-05 | 0.0060 |
| \Delta E_0 (eV) | 1.466 ± 0.024 | 1.5 |
Factor R = 0.000176, N_\text{idp} = 11.46. Máximo de \lvert\tilde\chi(R)\rvert en 1.75 Å (sin corregir la fase, por eso menor que R).
Avisos de validez. El módulo no emite avisos warning/invalid; los errores de entrada se lanzan como excepciones con los textos citados arriba. El ajuste integrado lleva siempre la nota «Ajuste EXAFS integrado (dispersión simple): N ≈ −8 % frente a Larch en lámina de Cu; instale xraylarch (extra «xas») para usar feffit, la vía recomendada».