A Python application for quantitative analysis of Raman spectra of graphene and graphene-like (sp² carbon) materials, with robust support for doped and disordered systems: N-doped, B-doped, SiC-grown graphene, GO, rGO, and dedicated CN-mode detection for g-C₃N₄ under UV/NIR-friendly Raman conditions.
Raman spectroscopy is the primary non-destructive probe of structural quality, defect density, doping level, layer number, and strain in sp² carbon materials. The key spectral features are:
| Band | Typical Position (532 nm) | Origin | Dispersive? |
|---|---|---|---|
| D* | ~1100–1200 cm⁻¹ | Disordered sp³/sp² boundary; OH/epoxy functional groups | Yes |
| D | ~1345 cm⁻¹ | Intervalley double resonance at K-point; requires a defect | Yes — 53 cm⁻¹/eV |
| G | ~1580 cm⁻¹ | In-plane C–C stretching (E₂g); present in all sp² carbon | No (but doping-sensitive) |
| D′ | ~1620 cm⁻¹ | Intravalley double resonance; defect-activated | Yes — ~37 cm⁻¹/eV |
| 2D | ~2690 cm⁻¹ | Two-phonon second order of D; no defect needed | Yes — 106 cm⁻¹/eV |
| D+G | ~2940 cm⁻¹ | Combination of D and G phonons; defect-assisted | Yes |
Dispersion: The 2D band dispersion is approximately twice the D band dispersion, but this relation is not exact. Reported 2D dispersions range from ~85–106 cm⁻¹/eV (e.g., 99 cm⁻¹/eV for turbostratic graphite and 87 cm⁻¹/eV for HOPG [Barros 2005]; ~100 cm⁻¹/eV for graphene [Ferrari & Basko 2013]), while D band dispersions span ~37–53 cm⁻¹/eV (e.g., 37.4 cm⁻¹/eV for B-doped graphene [Kim 2012]; ~53 cm⁻¹/eV [Dresselhaus 2005]; ~50 cm⁻¹/eV [Wu 2018]). Both values vary with material, doping, and stacking order. This tool uses the approximate 2:1 ratio only to predict laser-dependent peak fitting windows — sufficient for that purpose, not for precise dispersion measurements. Peak fitting windows shift automatically with
--laserinput.
G-band and doping: The G band is non-dispersive in position but shifts with carrier density. Both electron and hole doping stiffen the C–C bond via removal of the Kohn anomaly, upshifting the G band. The direction and magnitude of the shift distinguish n-type from p-type doping [Pisana 2007].
Substitutional boron (0.22 at% in single-layer graphene) introduces chemical disorder: the B–C bond is ~0.5 Å longer than C–C, breaking translational symmetry and activating the D band. Key signatures [Kim 2012]:
- I_D/I_G ≈ 7: the extremely high D-band intensity originates from electron–boron elastic scattering before phonon emission — distinct from point defects where the phonon is emitted first.
- G-band position: constant as I_D/I_G increases. This is the primary diagnostic separating B-doping from argon-plasma point defects (where G blueshifts monotonically). The p-type stiffening effect (upshift) is exactly counterbalanced by tensile-strain softening from the longer B–C bond.
- D′ at ~1620 cm⁻¹: in heavily B-doped samples the D′ intensity equals the G intensity. D′ dispersion in B-doped graphene is ~37 cm⁻¹/eV (vs. ~77 cm⁻¹/eV for the 2D band) — consistent with hole-doped graphene theoretical predictions.
- 2D downshift: ~4 cm⁻¹ per unit I_D/I_G up to I_D/I_G ≈ 3; beyond that the double-resonance q-vector is modified by strain.
- Defect spacing: L_D ≈ 4.76 nm corresponds to 0.22 at% B (Cançado 2011 formula applied to B atoms as vacancy-like scatterers).
- I_D/I_D′ ≈ 7: consistent with vacancy-type scatterers [Eckmann 2012], confirming substitutional incorporation rather than edge or sp³ defects.
Nitrogen substitution creates n-type doping. The N–C bond length is closer to C–C than B–C, so structural disorder is lower. Key signatures:
- G-band upshift due to Fermi-level elevation (electron doping → Kohn anomaly removal).
- 2D downshift and broadening: n-type doping shifts 2D to lower wavenumbers and broadens the peak — opposite trend to hole doping [Pisana 2007].
- Lower I_D/I_G than B-doping at comparable dopant concentrations.
- I_D/I_D′ ≈ 7–13 depending on whether N sits substitutionally (vacancy-like) or as pyridinic/pyrrolic N (sp³-like → higher ratio).
g-C₃N₄ has a fundamentally different Raman signature from graphene [Zinin 2009]:
- Visible excitation (514/532 nm): strong fluorescence background obscures the spectrum, yielding only two broad overlapping bands near 1357 cm⁻¹ and 1560 cm⁻¹. These are fluorescence artefacts, not the graphene D and G bands — they carry no structural information.
- UV (244 nm) or NIR (785 nm) excitation reveals the true triazine fingerprint:
- ~691 cm⁻¹: s-triazine ring breathing mode (ring–C–N in-plane; matches melamine at 677 cm⁻¹).
- ~988 cm⁻¹: second triazine breathing mode (matches melamine at 983 cm⁻¹).
- ~1596 cm⁻¹: C–N ring stretching.
- ~1728 cm⁻¹: high-frequency unassigned mode.
- The D band is absent in UV Raman of g-C₃N₄ — analogous to diamond-like carbon.
⚠️ Analyser note: When a spectrum shows the 691/988 cm⁻¹ doublet, the analyser can now flag g-C₃N₄-specific CN modes through dedicatedCN_triazineandCN_bendingpeak windows. If these modes are detected under visible excitation, the report warns that fluorescence is likely and recommends UV or NIR Raman for quantitative CN-mode interpretation.
Structural evolution from graphite → GO → rGO [Mohan 2017]:
- Graphite: sharp G at ~1582 cm⁻¹, very weak D (edge only). D-band intensity is edge-dependent: strong at armchair, weak at zigzag.
- GO: broad, overlapping D and G bands; high oxygen content disrupts π-conjugation; low electrical conductivity.
- rGO: I_D/I_G increases after reduction as new graphitic nanocrystallites nucleate (π-conjugation is partially restored). The highest conductivity (103.3 S cm⁻¹) was achieved with HI reduction, correlating with the lowest defect density and narrowest D/G FWHM.
- D band (~1100–1200 cm⁻¹)*: present in GO/rGO; assigned to the disordered sp³/sp² boundary and OH/epoxy functional groups. I_D*/I_G correlates directly with the C/O ratio and tracks the degree of oxidation [Lee 2021].
- FWHM(G): consistent FWHM(G) across samples signals uniform sp² cluster size; increasing FWHM(D) signals more disordered graphitic rings.
- I_2D/I_G: CVD graphene shows I_2D/I_G ≈ 0.179 with a single sharp 2D at ~2690 cm⁻¹. rGO shows a distorted or absent 2D region — not a reliable layer indicator.
- Functionalised rGO: G downshifts by ~5 cm⁻¹ due to π–π charge transfer from adsorbed molecules (e.g., pyrene) — a Raman indicator of non-covalent functionalisation.
Covalent aryl functionalization of graphene is substrate-dependent [Dierke 2022]:
- Graphene on SiO₂: I_D/I_G after functionalization ≈ 0.9; L_D ≈ 12.4 nm.
- Graphene on hBN: I_D/I_G after functionalization ≈ 0.3; L_D ≈ 20.9 nm — hBN's flat, dangling-bond-free surface suppresses radical attack.
- The substrate effect allows spatial patterning of functionalization density by patterning the underlying substrate.
| Capability | This tool | RamanSPy | rampy | Fityk | OriginPro |
|---|---|---|---|---|---|
| Global D/G/D′ fit with automatic deconvolution | ✅ | ❌ | ❌ | manual | manual |
| Laser-energy-dependent fit windows | ✅ | ❌ | ❌ | ❌ | ❌ |
| L_D and n_D via Cançado with E_L⁴ correction + uncertainty | ✅ | ❌ | ❌ | ❌ | ❌ |
| Range-based Eckmann defect-type classification with citations | ✅ | ❌ | ❌ | ❌ | ❌ |
| Stage 1/2 disorder regime detection | ✅ | ❌ | ❌ | ❌ | ❌ |
| Adaptive lineshape (pseudo-Voigt for disordered materials) | ✅ | partial | ❌ | manual | manual |
| Literature knowledge base (113 cited reference values) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Fit-quality validation flags | ✅ | ❌ | ❌ | ❌ | ❌ |
| B/N doping fingerprint | ✅ | ❌ | ❌ | ❌ | ❌ |
| g-C₃N₄ dedicated support | ✅ | ❌ | ❌ | ❌ | ❌ |
| General preprocessing / ML / hyperspectral | ❌ (delegates to RamanSPy) | ✅ | partial | ❌ | ✅ |
| Raman mapping/imaging | ❌ | ✅ | ❌ | ❌ | ✅ |
| Open source | ✅ | ✅ | ✅ | ✅ | ❌ |
This tool sits on top of the open-source spectroscopy ecosystem: it uses pybaselines for baseline subtraction and optionally leverages RamanSPy's despiking and data loaders when available.
Its unique value is a literature-anchored interpretation layer purpose-built for sp² carbons (graphene, GO, rGO, g-C₃N₄), translating raw peak fits into physically meaningful parameters with uncertainty.
Users who need general preprocessing, machine learning, or hyperspectral imaging should use RamanSPy as the primary workflow and then feed pre-processed spectra into this tool for domain-specific analysis (see docs/INTEROPERABILITY.md).
- Baseline correction — Asymmetric Least Squares (ALS); negative residuals preserved (no clipping)
- Peak fitting — Lorentzian (D, G, D′) and Pseudo-Voigt (D+G) using pure
scipy - Global D / G / D′ fit — three bands fitted simultaneously to prevent D′ from capturing the G tail
- Adaptive G-band fitting — locates true G peak position before fitting; handles doped samples where G sits near or above 1600 cm⁻¹
- G+D′ deconvolution — dual-Lorentzian separation of overlapping G and D′ in heavily doped or disordered graphene
- SNR-gated peak detection — peak accepted only when R² > 0.75 and SNR > 3 (SNR = amplitude / MAD-based noise estimate)
- Pseudo-Voigt area correction — FWHM and integrated area follow the Thompson–Cox–Hastings definition
- Quantitative ratios — I_D/I_G, I_2D/I_G, I_D′/I_G, I_D/I_D′
- Defect density — L_D (Cançado 2011, full E_L⁴ correction)
- g-C₃N₄ CN-mode detection — dedicated
CN_triazine(~691 cm⁻¹) andCN_bending(~988 cm⁻¹) windows for UV/NIR-friendly Raman analysis - g-C₃N₄ report logic —
gcn4_detectedflag plusgcn4_mode_notewarning for visible excitation - Disorder stage — Stage 1 / Stage 2 classification with FWHM(G) cross-check
- Defect type classification — sp³ / vacancy / edge via I_D/I_D′ [Eckmann 2012]
- Layer number estimation — from I_2D/I_G with FWHM(2D) reliability guard
- eV-based laser dispersion — all peak windows shift with laser energy per Cançado 2011
- Batch processing — analyse entire folders at once
- Publication-quality plots — 4 plots per spectrum (300 dpi)
- CSV + text reports — structured output ready for further analysis
| Peak | Search Range | Fit Window | Line Shape | Physical Origin |
|---|---|---|---|---|
| CN_triazine | 670–715 cm⁻¹ | fixed | Lorentzian | g-C₃N₄ triazine ring mode (~691 cm⁻¹) |
| CN_bending | 960–1010 cm⁻¹ | fixed | Lorentzian | g-C₃N₄ C–N bending / ring-related mode (~988 cm⁻¹) |
| D* | 1080–1230 cm⁻¹ | fixed | Lorentzian | sp³/sp² boundary; OH/epoxy groups in GO/rGO [Lee 2021] |
| D | 1270–1450 cm⁻¹ | fixed | Lorentzian | K-point phonon, intervalley double resonance [Ferrari 2001] |
| G | 1540–1680 cm⁻¹ (search) | adaptive ±50 cm⁻¹ | Lorentzian | E₂g in-plane C–C stretch [Tuinstra 1970] |
| D′ | global fit with D+G | — | Lorentzian | Intravalley defect-induced [Eckmann 2012] |
| 2D | 2580–2780 cm⁻¹ | fixed | Lorentzian (or dual) | Second-order overtone; layer-sensitive [Ferrari 2006] |
| D+G | 2850–2960 cm⁻¹ | fixed | Pseudo-Voigt | Combination band |
G-band strategy:
find_peaksin 1540–1680 cm⁻¹ → adaptive ±50 cm⁻¹ window → single Lorentzian. If R² < 0.60, dual-Lorentzian G+D′ deconvolution is triggered automatically. The D′ component is stored inPeakResult.deconv_partnerand promoted to theD_primeresult slot if it outperforms the standalone fit.
Peak positions shift with laser wavelength for dispersive graphene bands. Dispersive peaks: D ~53 cm⁻¹/eV, D′ ~37 cm⁻¹/eV, 2D ~106 cm⁻¹/eV (Cançado 2011, eV-based). The g-C₃N₄
CN_triazineandCN_bendingwindows are treated as non-dispersive auxiliary modes.
Inter-defect distance L_D (nm) from the laser-energy-corrected Cançado 2011 formula:
L_D² (nm²) = (4.3 × 10³ / E_L⁴) × (A_G / A_D)
where E_L is the laser energy in eV. Valid in Stage 1 only (L_D ≳ 10 nm). Applied to B-doped graphene, where substitutional B atoms behave as vacancy-like scatterers, this yields L_D ≈ 4.76 nm for 0.22 at% B [Kim 2012]. In Stage 2, L_D is set to NaN with a warning.
| Stage | I_D/I_G trend | FWHM(G) | L_D | Regime |
|---|---|---|---|---|
| Stage 1 | Increases with disorder | Broadens moderately | ≳ 10 nm | Crystalline graphene with point defects (Tuinstra–Koenig) |
| Stage 2 | Decreases with disorder | Strongly broadened | < 10 nm | Amorphous / nanocrystalline carbon |
Important: High I_D/I_G alone does not mean Stage 2. In B-doped graphene, I_D/I_G ≈ 7 while FWHM(G) remains narrow and the G position is constant — chemical disorder, not structural amorphisation [Kim 2012]. The analyser cross-checks FWHM(G) before assigning Stage 2.
The ratio I_D/I_D′ discriminates between defect types [Eckmann 2012]:
| I_D/I_D′ | Defect type | Example |
|---|---|---|
| ~13 | sp³ (homoatomic) | H, O functional groups (GO, rGO) |
| ~7 | Vacancy-like | Ion bombardment, substitutional B or N |
| ~3.5 | Grain boundary / edge | Polycrystalline graphene, nanoflakes |
| I_2D/I_G | 2D FWHM | Layer count |
|---|---|---|
| > 2 | ~25 cm⁻¹ (single Lorentzian) | Monolayer [Ferrari 2006] |
| ≈ 1 | Broader, 4-component | Bilayer |
| < 1 | Broad, graphite-like | Few-layer (≥ 3) |
| Distorted / absent | — | rGO / functionalised (unreliable) |
git clone https://github.com/Hj1308/Raman-analysis.git
cd Raman-analysis
pip install -r requirements.txtDependencies: numpy, scipy, matplotlib, pandas, openpyxl
lmfit is optional — install only if you need Voigt / AsymLorentzian fits or uncertainty reporting via the band_config API.
# Single file (532 nm laser)
python main.py --file spectrum.txt --laser 532
# Single file with custom output directory
python main.py --file spectrum.txt --laser 633 --output ./my_results/
# Batch mode — all .txt/.csv/.xlsx files in a folder
python main.py --folder ./spectra/ --laser 785 --batchfrom src.peak_fitter import PeakFitter
config = {
"G": {"method": "adaptive"},
"D": {"lineshape": "Lorentzian"},
"2D": {"method": "deconvolve"}, # force dual-Lorentzian (bilayer)
"D+G": {"lineshape": "Voigt"}, # requires lmfit
}
results = fitter.fit_all_peaks(band_config=config)Plain text or CSV — two columns (wavenumber, intensity):
# Optional comment lines
1000.0 120.5
1001.0 122.3
Excel (.xlsx): wavenumber in column B, intensity in column C, data from row 4.
For each spectrum:
| File | Content |
|---|---|
*_baseline.png |
Raw spectrum + ALS baseline overlay |
*_peaks.png |
Fitted peaks on corrected spectrum |
*_individual.png |
Individual peak fits with residuals |
*_ratios.png |
Intensity ratio bar chart |
*_report.txt |
Full text report (all metrics) |
raman_results.csv |
All parameters in one CSV (batch-compatible) |
| Field | Type | Description |
|---|---|---|
center |
float | Peak position (cm⁻¹) |
amplitude |
float | Peak height (a.u.) |
fwhm |
float | Full width at half maximum (cm⁻¹) |
area |
float | Integrated area (Thompson–Cox–Hastings for Pseudo-Voigt) |
r_squared |
float | Goodness of fit |
snr |
float | Signal-to-noise ratio (amplitude / MAD noise) |
found |
bool | True if R² > 0.75 and SNR > 3 |
is_deconvolved |
bool | True when G was separated from D′ by dual-Lorentzian |
deconv_partner |
PeakResult | None | D′ component from G deconvolution |
is_split_2D |
bool | True when 2D fitted with dual-Lorentzian (bilayer) |
twoD_fwhm_warning |
bool | True when FWHM(2D) > 35 cm⁻¹ (layer count unreliable) |
center_stderr |
float | None | Standard error on center (lmfit backend only) |
fwhm_stderr |
float | None | Standard error on FWHM (lmfit backend only) |
Single Lorentzian for 2D is appropriate for monolayer only. In bilayer graphene, 2D splits into 4 sub-components; single-peak fitting underestimates FWHM and may misassign layer count. Multi-component 2D fitting is on the roadmap.
Ferrari et al. (2006) Phys. Rev. Lett. 97, 187401
Cançado 2011 formula is valid in Stage 1 only. When Stage 2 is assigned, L_D is set to NaN with a warning in L_D_note. Use FWHM(G) as the primary disorder metric for Stage 2 samples.
Visible-excitation spectra of g-C₃N₄ are dominated by fluorescence. The apparent 1357/1560 cm⁻¹ bands carry no reliable structural information [Zinin 2009]. The analyser now includes dedicated UV/NIR CN-mode support through the 691/988 cm⁻¹ windows, but visible-range spectra remain fundamentally fluorescence-limited and should be interpreted with caution.
I_2D/I_G is not a reliable layer indicator for rGO or functionalised graphene; the 2D band depends on preparation method, not layer count [Mohan 2017].
The D* peak window (1080–1230 cm⁻¹) is defined, but quantitative I_D*/I_G analysis and C/O ratio correlation are not yet implemented. See roadmap.
Dual-Lorentzian deconvolution may not fully separate G and D′ in extreme cases. More complex multi-band models are available via the band_config API.
| Feature | Scientific Basis | Priority |
|---|---|---|
| D band quantification* | I_D*/I_G ↔ C/O ratio in GO/rGO; oxidation degree tracking [Lee 2021] | 🔴 High |
| B-doping fingerprint flag | Auto-detect: constant G position + I_D/I_D′ ≈ 7 + I_D/I_G ≫ 1 [Kim 2012] | ✅ Implemented |
| Fitting uncertainty (scipy) | Error bars from covariance matrix for all users (no lmfit required) | 🔴 High |
| Multi-Lorentzian 2D fitting | 4-component decomposition for bilayer/trilayer [Ferrari 2006] | 🟡 Medium |
| Carrier-density estimator refinement | G-band shift → carrier density → n/p doping type; scaling bug corrected in current main branch | ✅ Implemented (further refinement possible) |
| Stage boundary refinement | FWHM(G) + A_D/A_G combined metric; 0D vs. 1D defect discrimination [Wu 2018] | 🟡 Medium |
| Dispersion slope validator | Multi-wavelength: D slope ≈ 53 cm⁻¹/eV, 2D ≈ 106 cm⁻¹/eV; deviation flags contamination [Cançado 2011] | ✅ Implemented |
| arPLS baseline | Asymmetrically reweighted PLS for fluorescence-heavy spectra (GO, g-C₃N₄) | 🟡 Medium |
| NIR/UV mode for g-C₃N₄ | Dedicated windows at 691/988 cm⁻¹; analyzer warning/note for visible excitation [Zinin 2009] | ✅ Implemented |
| Batch statistics | Mean ± std across all samples; ratio heatmap for batch runs | 🟢 Planned |
| Substrate effect report | Flag I_D/I_G contrast on hBN vs. SiO₂; L_D comparison [Dierke 2022] | 🟢 Planned |
| Electrochemical doping tracker | G-band shift vs. gate voltage; cyclic voltammetry-compatible input | 🟢 Planned |
Raman-analysis/
├── main.py ← CLI entry point
├── requirements.txt
├── README.md
├── examples/
│ ├── graphene_test.txt ← synthetic test spectrum
│ └── generate_test_spectrum.py
├── results/ ← output directory
└── src/
├── __init__.py
├── loader.py ← file reading & preprocessing (txt, csv, xlsx)
├── baseline.py ← ALS baseline correction (no clipping)
├── peak_fitter.py ← global D/G/D′ fit, adaptive G, G+D′ deconvolution, SNR gate
├── analyzer.py ← ratio calculations & defect analysis (L_D E_L⁴-corrected)
├── plotter.py ← matplotlib visualisation (300 dpi)
└── exporter.py ← CSV + text report export
@software{raman_analyzer_2026,
author = {H.J},
title = {Raman Spectrum Analyzer: Quantitative Analysis of Graphene Raman Spectra},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.21109057},
url = {https://doi.org/10.5281/zenodo.21109057}
}Plain text: H.J (2026). Raman Spectrum Analyzer. Zenodo. https://doi.org/10.5281/zenodo.21109057
- Tuinstra, F. & Koenig, J.L. (1970) J. Chem. Phys. 53, 1126
- Ferrari, A.C. & Robertson, J. (2001) Phys. Rev. B 64, 075414 — disorder stage classification
- Ferrari, A.C. et al. (2006) Phys. Rev. Lett. 97, 187401 — 2D band and layer number
-
- Lucchese, M.M. et al. (2010) Carbon 48, 1592 — defect-density / inter-defect-distance framework for disordered graphene
- Cançado, L.G. et al. (2011) Nano Lett. 11, 3190–3196 — E_L⁴-corrected L_D; eV-based dispersion
- Ferrari, A.C. & Basko, D.M. (2013) Nature Nanotechnology 8, 235–246 — peak conventions & line shapes
- Eckmann, A. et al. (2012) Nano Lett. 12, 3925–3930 — I_D/I_D′ defect type discrimination
- Pimenta, M.A. et al. (2007) Phys. Chem. Chem. Phys. 9, 1276–1290 — disorder in graphite-based systems
- Claramunt, S. et al. (2015) Sci. Rep. 5, 19491 — G+D′ overlap in GO/rGO
- Kim, Y.A. et al. (2012) ACS Nano 6(7), 6293–6300 — B-doped graphene; G invariance, D×7, L_D = 4.76 nm
- Pisana, S. et al. (2007) Nature Materials 6, 198–201 — G-band shift and Kohn anomaly
- Zinin, P.V. et al. (2009) Chem. Phys. Lett. 472, 69–73 — triazine modes at 691/988 cm⁻¹
- Mohan, V.B. et al. (2017) Graphene Technology 2(4–7), 6–21 — rGO structural evolution; conductivity vs. I_D/I_G
- Lee, J. et al. (2021) Carbon 183, 814–822 — D* band in GO/rGO; I_D*/I_G vs. C/O ratio
- Dierke, T. et al. (2022) ACS Appl. Nano Mater. 5, 4966–4971 — substrate-dependent functionalization
- Hummers, W.S. & Offeman, R.E. (1958) J. Am. Chem. Soc. 80, 1339 — GO synthesis
- Thompson, P., Cox, D.E. & Hastings, J.B. (1987) J. Appl. Crystallogr. 20, 79–83 — Pseudo-Voigt profile
- Feature #9: dedicated g-C₃N₄ CN-mode support via
CN_triazine(670–715 cm⁻¹) andCN_bending(960–1010 cm⁻¹) - Added
gcn4_detectedandgcn4_mode_noteto analyzer output - Added g-C₃N₄ CN-mode section to formatted report
- Visible-excitation warning for g-C₃N₄ CN-mode detection; UV/NIR-friendly note for non-visible excitation
- Fixed
carrier_density_cm2scaling in_estimate_dopingby removing an erroneous extra factor of10^12 - Full test suite passes after Feature #9 and carrier-density fix
- Global D / G / D′ simultaneous fit (
_fit_D_G_Dp_global) - SNR gate: R² > 0.75 and SNR > 3; MAD-based noise estimate
- Pseudo-Voigt corrected: Thompson–Cox–Hastings area definition
- L_D: full E_L⁴ Cançado 2011 formula; Stage 2 →
NaN+ warning - FWHM(2D) guard:
twoD_fwhm_warningwhen FWHM(2D) > 35 cm⁻¹ - Removed
graphitization_pct(no literature basis) - Baseline clipping removed (negative residuals preserved)
- eV-based peak dispersion in
get_peak_windows
- Adaptive G-band window + dual-Lorentzian G+D′ deconvolution
PeakResultextended:is_deconvolved,deconv_partner,is_split_2D- Removed
lmfithard dependency
H.J — Researcher, Chemistry