Szczepanik Research Group
Department of Theoretical Chemistry
Faculty of Chemistry, Jagiellonian University
Gronostajowa 2, 30-387 Krakow, Poland
Tel: (+48) 12 686 23 90
E-mail: dariusz.szczepanik@uj.edu.pl
HOME PROJECTS PUBLICATIONS runEDDB X
About EDDB Download Tutorials Manual
runEDDB implements the Electron Density of Delocalized Bonds (EDDB) method and the corresponding electron-density partitioning schemes. The present release is a complete rewrite in Fortran 2008 of the original runEDDB R-script. Thanks to a modern linear-algebra backbone (BLAS-3 DGEMM, DSYGVD, DSYEVD, DPOSV, CGS2, etc.), the program now processes systems containing thousands of atoms on a single workstation in seconds to minutes. It is distributed as ready-to-run, pre-compiled binaries for all three major desktop platforms — Linux (x86_64), Windows (x86_64), and macOS (arm64). See the Download page for the current release and per-platform installation instructions.
The Bond-Order Projection (BOP) algorithm at the heart of EDDB requires the input wavefunction to be expressed in a basis of compact, valence-localized atomic orbitals with a hierarchical, L-resolved subshell orthogonalization — the Natural Atomic Orbital (NAO) basis. The NAO transformation maps the underlying Gaussian basis onto an atomic-orbital basis with a clean core (Cor) / valence (Val) / Rydberg (Ryd) hierarchy. Several implementations of the original definition are in routine use today (e.g., NBO7, JaNPA); runEDDB ships with its own internal implementation alongside two compact subsets — the Natural Minimal Basis (NMB = Cor ∪ Val) and the program-default Natural Valence Basis (NVB = Val).
The current version of runEDDB directly reads seven input formats — six wavefunction formats produced by external quantum-chemistry programs and one geometry-only XYZ format processed by the built-in GFN2-xTB engine:
The most common input format. Supported routes:
Most of our FCHK testing focused on Gaussian and Q-Chem outputs. For post-HF methods the relaxed correlated density block has to be requested explicitly — in Gaussian via density=mp2 (MP2) or density=current (CCSD, CI, CASSCF) on the route line; in Q-Chem via cc_ref_prop = true for the CC family. (Q-Chem does not currently emit the MP2 density to FCHK; for MP2 use Gaussian or ORCA.)
Molden is one of the most popular formats for molecular density and orbital visualization. Many quantum-chemistry programs can produce it through different mechanisms — please consult the manual of your particular package for the exact keyword. Multiwfn is also a convenient universal converter to and from Molden, and runEDDB has been validated against Multiwfn-generated files.
For ORCA we strongly recommend using .json rather than .molden. The JSON format produced by ORCA carries a more complete description of the wavefunction — including ECP definitions and other metadata — that the Molden specification cannot represent. We have validated runEDDB against both formats, generated by ORCA's standard orca_2mkl and orca_2json post-processors.
For Turbomole calculations, runEDDB reads a single .tmol bundle that you assemble by concatenating the four key files from the Turbomole working directory:
The parser handles RHF, UHF, ROHF, and DFT wavefunctions in Turbomole's spherical basis representation, with angular momenta up to k (L = 7) — covering def2-{S,T,Q}ZVPP and cc-pVDZ through cc-pV8Z. The native Turbomole $ecp block is parsed automatically — ECP-bearing transition-metal calculations load directly without conversion. Cartesian d/f basis storage (forced by $pople CAO or $cao) is not supported — use Turbomole's default spherical mode.
C1 symmetry is required for the .tmol lane. Under any non-trivial point group Turbomole writes the wavefunction in two ways that need irrep-aware bookkeeping not present in the .tmol parser:
The fix is simple: re-run the SCF with $symmetry c1 in the control file (or remove the keyword). Population analysis with EDDB doesn't benefit from point-group symmetry being on during the SCF write-out, so this is the standard workflow. If a non-C1 .tmol is passed, the parser stops with an explanatory ERROR; the run does not silently produce wrong densities. The other input formats (.fchk, .json, .molden, .49, .gms) write full-AO MOs and global orbital ordering regardless of point group, so they have no equivalent restriction.
GAMESS-US output files (the standard text log produced by rungms) are read directly. Just rename or symlink the log to a .gms extension — PUNCH (.dat) files are not used. Supported run types: RUNTYP=ENERGY, OPTIMIZE (final equilibrium geometry is auto-located), and SADPOINT (transition state). Supported wavefunction types: RHF, UHF, ROHF, and MCSCF natural orbitals. Spherical-harmonic basis (ISPHER=1) is recommended; standard Cartesian basis is also supported. The default GAMESS print precision (F11.6) is sufficient; for high-precision basis-set studies, set DGRID=.T. in $CONTRL for F17.10 MO output.
GAMESS $ECP blocks are parsed automatically (handles both WITH ZCORE n AND LMAX l and the shared-definition shorthand ARE THE SAME AS ATOM N). Symmetry-truncated basis sections (any GAMESS run with COORD=UNIQUE under Cs, C2v, D2h, etc.) are reconstructed automatically — the parser detects the symmetry-implied gaps in the printed basis section and replicates each per-atom block for its unprinted symmetry-equivalent partners.
NBO7 .49 archives are still accepted in NAO-only mode (population analyses + BOP only; cube grids and orbital FCHK exports are disabled because NBO uses a different AO-basis convention than runEDDB's native pipeline). The .49 path is provided for backward compatibility and will be removed in a future release once the native NAO driver completes its acceptance suite. Users are strongly encouraged to switch to .fchk / .json / .molden / .tmol / .gms as soon as practical.
One of runEDDB’s most distinctive capabilities is that it can analyse chemical bonding straight from a bare set of atomic coordinates — for example a structure solved by X-ray diffraction, a molecular-dynamics snapshot, or a hand-built model — with no separate quantum-chemistry calculation. Give it a plain .xyz geometry and it builds the electronic structure itself, on the fly, using a fast built-in GFN2-xTB engine (a semi-empirical tight-binding model; Bannwarth, Ehlert & Grimme, JCTC 15 (2019) 1652), and then runs the complete EDDB analysis on top of it.
The practical payoff: in a single command, and in seconds rather than the hours a full DFT study would take, you obtain a map of where the electrons delocalize — a direct picture of the molecule’s resonance / conjugation pattern and bonding skeleton — without any external software, wavefunction file, or DFT step. This makes runEDDB a quick, stand-alone way to look at the bonding in a freshly determined or modelled structure; promising findings can then be confirmed with a higher-level wavefunction (DFT, post-HF, …) run through one of the other input lanes — again analysed by runEDDB — for a fully validated picture. The entire XYZ pipeline (GFN2-xTB SCC in its minimal valence vSTO-nG basis → AO→NAO localisation → BOP and EDDB analysis) runs end-to-end on the plain XYZ file, and the internal engine is validated against the reference tblite implementation across 81 systems covering 26 elements (H…W) at chemical accuracy.
About the GFN2-xTB basis (vSTO-nG). GFN2-xTB is a minimal valence tight-binding method: its atomic-orbital basis has just one Slater-type orbital per valence shell (e.g. one s and one p for C, N, O; one s for H; with a d shell added for heavier elements), and each Slater orbital is expanded as a short contraction of n Gaussians (an STO-nG fit). We abbreviate this vSTO-nG = valence STO-nG. It is therefore a compact, single-zeta-quality valence basis — not a double-zeta or polarized basis — which is exactly why an NAO/NBO-style decomposition of a GFN2 wavefunction looks minimal-basis-like. This keeps GFN2-xTB fast and is appropriate for the qualitative bonding screening the .xyz lane is meant for; for quantitative work, validate with a larger-basis DFT / wavefunction calculation through one of the other input lanes.
The XYZ file uses the standard XYZ format, with a runEDDB-specific optional extension on line 1 that carries the molecular charge and spin multiplicity:
The optional charge and multiplicity tokens on line 1 (after the atom count) default to 0 and 1 respectively, so plain XYZ files (with only N_atoms on the first line) are processed as neutral closed-shell singlets by default. Coordinates are in Ångström. Total energies reported in the verbose output of the GFN2-xTB stage match Grimme’s reference xtb executable to within ~10−4 Eh, allowing direct sanity-checking against an external xtb run on the same geometry.
A .xyz file may hold a trajectory — many structures concatenated one after another (e.g. an MD run or an optimisation path). By default runEDDB analyses the first structure and prints a note reporting how many it found; use --xyz-frame N to pick the N-th structure instead (1-based). Requesting a frame that does not exist is a clear error reporting the actual count.
Two further options rigid-translate the input geometry (bond lengths, angles and dihedrals are untouched, so the EDDB analysis is unchanged — only the absolute coordinates written to any exported cube / FCHK move). They apply to every input format, not just .xyz (legacy .49 excepted):
Trajectory tip — comparable cubes across frames. Centering each frame independently with --xyz-center would re-centre every structure on its own (drifting) centroid, so the resulting cubes would not line up. Instead, centre one reference frame with --xyz-center geom -v, read off the printed translation vector, then run every frame with that same fixed vector via --xyz-translate (optionally combined with --cube-ref reference.cube to clone the grid) — the frames then share one coordinate frame and the EDDB cubes are directly comparable / subtractable.
Both closed- and open-shell systems are supported. Closed-shell molecules (the default, multiplicity = 1) are treated as restricted; any higher multiplicity is solved as a true spin-polarised unrestricted (UHF) calculation (spin-polarized GFN2-xTB / spGFN2-xTB; see the method references in §11) — just put the spin multiplicity on line 1 (e.g. 2 for a doublet radical, 3 for a triplet, 4 for a quartet, …).
For any open-shell run, runEDDB prints a spin-density topology table right after the GFN2-xTB step: the per-atom spin population, i.e. where the unpaired electrons actually sit. This is a quick way to read off the magnetic / radical centres of a structure — and a practical screen for diradical / broken-symmetry character: run the molecule as a triplet and, if the spin localises on two well-separated atoms or fragments, that is a strong hint of an open-shell singlet (diradical) ground state worth investigating. The NO analysis (--table no for the table, --export-fchk no for the orbitals) adds complementary diradical / multireference diagnostics — including the 〈S²〉 spin-contamination value, which counts roughly how many electron pairs are genuinely unpaired.
Diradicals / broken-symmetry singlets. GFN2-xTB’s simplified spin treatment cannot reliably converge a genuine broken-symmetry singlet — it tends to collapse back to the closed-shell solution or stop at partial open-shell character. Use the triplet spin-topology read-out above as a qualitative pointer only, and confirm any suspected diradical / broken-symmetry singlet with a proper broken-symmetry DFT calculation (e.g. CAM-B3LYP), which can then be analysed by runEDDB through one of the wavefunction input lanes.
For quick tests, teaching, or a first look at a new option you do not need any input file at all: runEDDB carries a small library of molecular models compiled into the binary. A model is loaded exactly like an .xyz geometry — the wavefunction is computed by the built-in GFN2-xTB engine — by giving its name with a leading @ instead of a file name. The library holds 38 entries in five groups: arenes (benzene, naphthalene, anthracene, phenanthrene, pyrene, coronene, kekulene, corannulene, …), hetero (pyrrole, furan, thiophene, pyridine, borazine), rings (cyclobutadiene, cyclopentadienyl anion, tropylium, cyclooctatetraene and its dianion), macro (porphine, phthalocyanine, [18]annulene, cycloparaphenylenes) and gmtkn55 (the ten C60 isomers of the GMTKN55 set). -i @list prints the full catalogue with atom counts and the geometry level of every entry:
Names are resolved in two ways: the full path @group/name is always unique, and the bare name (@benzene) works whenever it occurs only once in the library. With -v the header of the run reports the model name and its geometry level. Charge and multiplicity are part of the model (e.g. @rings/cp-anion is loaded as a singlet anion), so no --xyz-charge is needed. Windows PowerShell users: quote the name, -i '@benzene', because a bare @ is PowerShell’s splatting operator; in cmd.exe no quotes are needed.
Atom numbering. In every monocyclic and polycyclic model the ring atoms are numbered consecutively around the ring, starting at the heteroatom when there is one (pyrrole: N1, C2–C5; pyridine: N1, C2–C6), and in fused systems along the perimeter (naphthalene: 1–8 around the rim, 9 and 10 the fusion atoms); hydrogens come last, in the order of the heavy atoms they are bonded to. A pathway such as -p 1-2-3-4-5-6-1 therefore means what it says, and for fused rings -r writes the exact strings to the .rings file.
The MDL Molfile (.mol) and its multi-record container SDF (.sdf) are a second geometry-only lane: like .xyz they carry just a structure (and, optionally, formal charges / radical flags), so runEDDB builds the electronic structure with the same built-in GFN2-xTB engine and runs the full EDDB analysis on top — everything said above about the GFN2-xTB lane (the vSTO-nG basis, the qualitative-screening caveat, open-shell handling, the geometry options below) applies unchanged. .mol / .sdf are ubiquitous in cheminformatics (PubChem, ChEMBL, RDKit, drawing programs), so this lets you analyse a structure straight from those sources.
runEDDB reads the standard V2000 connection table. Coordinates are in Ångström; the bond block is ignored (GFN2-xTB rebuilds connectivity itself). Molecular charge and spin are taken from the property block: total charge is summed from the M CHG entries (falling back to the legacy per-atom charge column if absent), and multiplicity from M RAD radical flags (doublet → 1, triplet → 2 unpaired electrons); when no radical flag is present the multiplicity follows the electron-count parity (even → singlet, odd → doublet). Two cases are refused with a clear message: the free-form V3000 format (re-export as V2000), and files explicitly flagged 2D (the dimensional code on line 2) — GFN2-xTB needs real 3D coordinates.
An .sdf file may hold many structures (conformer sets, compound libraries), each record separated by a $$$$ line. As with multi-frame .xyz (see above), runEDDB analyses the first record by default and prints a note with the count; --xyz-frame N selects the N-th record. The --xyz-center / --xyz-translate geometry options apply here too.
The Tripos .mol2 format is another geometry-only lane feeding the same GFN2-xTB engine. runEDDB reads the @<TRIPOS>MOLECULE atom count and the @<TRIPOS>ATOM records; each element is taken from the SYBYL atom type (C.3 → C, N.ar → N, or a bare symbol such as Li), and the bond block is ignored. Coordinates are in Ångström. Multiple @<TRIPOS>MOLECULE records are treated as a multi-structure file (--xyz-frame N selects one). MOL2 carries only per-atom partial charges, not a formal total charge or spin, so runEDDB defaults to a neutral closed-shell singlet; set a different state with --xyz-charge / --xyz-mult (below).
The PDB lane reads ATOM / HETATM records (coordinates in Ångström). The element is taken from the dedicated element columns (77–78) when present — as written by Open Babel, PyMOL, etc. — and otherwise guessed from the atom name. Only the first alternate location (altLoc blank or A) of any disordered atom is kept. A multi-MODEL file (NMR ensembles, MD frames) is multi-structure: the first model is used by default, --xyz-frame N selects another. PDB carries no charge or spin, so the default is a neutral closed-shell singlet (override with --xyz-charge / --xyz-mult).
Hydrogens. Crystallographic PDB structures often omit hydrogens. GFN2-xTB needs a complete all-atom geometry, so a carbon-containing PDB with no hydrogens triggers a warning — add hydrogens first (e.g. obabel in.pdb -O out.pdb -h, or in PyMOL / Avogadro). Pure inorganic / metal structures that legitimately have no hydrogens are not flagged.
For any geometry input (.xyz, .mol, .sdf, .mol2, .pdb) the molecular charge and spin multiplicity can be set on the command line with --xyz-charge N (a signed integer) and --xyz-mult M (2S+1, a positive integer). When given they take precedence over whatever the file specifies (the .xyz header, or the M CHG / M RAD records of a molfile). For .mol2 and .pdb, which carry no usable charge / spin information (default: neutral singlet), these flags are the way to study an ion or an open-shell state — e.g. --xyz-charge -1 --xyz-mult 2 for a radical anion. They are rejected for the wavefunction lanes (.fchk / .json / .molden / .tmol / .gms / .49), where the charge and spin come from the wavefunction itself.
Crystallographic Information Files (.cif) are periodic data — a unit cell, an asymmetric unit (often only a fragment of a molecule, sitting on a symmetry element), and symmetry operators — not a ready molecular geometry. Turning that into a single, complete, chemically-sensible molecule (apply symmetry, grow the molecule across cell boundaries, resolve disorder and partial occupancies) is exactly what dedicated crystallography programs already do well. So rather than re-implement that, the recommended route is to export a complete molecule to .xyz from the tool you already use, then analyse that .xyz with runEDDB:
Once you have the molecule as .xyz, the full GFN2-xTB → EDDB pipeline runs on it directly (add hydrogens first if the structure lacks them, and set the charge / multiplicity with --xyz-charge / --xyz-mult if needed). This keeps the resonance / delocalization analysis one short step away from raw crystallographic data without duplicating the symmetry-and-disorder machinery your crystallography software already provides.
Heavy elements are routinely treated with Effective Core Potentials (ECPs), which replace the chemically inert inner shells with an analytical pseudopotential. runEDDB consumes already-converged MOs and never evaluates ECP integrals itself; what each parser must do is read the per-atom effective nuclear charge Zeff = Zatomic − Ncore,replaced so that atomic charges, total molecular charge, and the per-atom population tables balance. The NAO classification (Core / Val / Rydberg) also uses each atom's Z to decide how many core/valence shells to expect, so getting Zeff right is essential — a wrong value silently misclassifies orbitals and can drop the heavy atom from the per-atom tables.
How each parser obtains Zeff:
Once Zeff is known, the NAO machinery automatically labels the surviving valence shells with the chemically correct principal quantum numbers. For example, tungsten under def2-ECP60 shows its valence as 6s, 5d1..5d5 (the actually-present W valence shells) rather than the misleading 1s, 3d1..3d5 labels that an ECP-blind labelling would produce.
Supported wavefunctions:
runEDDB offers five scope modes, two NOBD-dissection options, and three analysis-basis subsets.
Scope modes (mutually exclusive):
Under a restricted scope (-f / -p / -r) every scope-dependent density — EDDB, EDLB and BDF — is built from density matrices with exactly the atomic support of the selected atoms, so the per-atom tables, the summary totals and the cube integrals are mutually consistent (see the note in §5).
NOBD dissection (can combine with any scope):
When dissection is active, the atom table and summary show only the density of the selected NOBDs; the star marker (*) in the NOBD table flags them.
Analysis basis subset, selected by --basis VALUE (or -b VALUE). VALUE is one of:
VALUE is fully case-insensitive (Nao, NMB, nVb, etc. all work).
.49 input note. The NBO7 .49 archive flags every NAO as either NMB or Rydberg, with no further Cor/Val partition. -b nvb therefore cannot be honoured on .49 input and silently falls back to -b nmb. When -b nvb is requested explicitly, a one-line clarifier — (.49 archives carry no Cor / Val split) — is printed directly under the Target NAO representation: entry in the Stage 2 detail block, aligned with the basis-label value. The clarifier is verbose-only (-v), keeping the default-mode output clean. To get a real Cor/Val split, use the matching native input (FCHK / JSON / Molden).
Basis-independent connectivity (always on). The atom-pair connectivity that BOP analyses is always derived from Wiberg bond orders evaluated in the full NAO representation (Cor + Val + Ryd), whatever -b selects; that one mask is then handed unchanged to a BOP run that uses the -b working density. Consequently a nao / nmb / nvb series differs only in the density BOP integrates, on a fixed set of atom pairs. Why it matters: the Rydberg shell carries the weak through-space and hyperconjugative couplings that sit near the 0.001 gate, so deriving the mask in a truncated basis silently prunes them — and a change in EDDB population would then mix a genuine basis effect with a change in which bonds were counted at all. The bond-order threshold, the BOP equations and the working density matrix are untouched; only the pair selection is basis-fixed. Notes: with -f the NAO connectivity is built first and the fragment restriction applied to it afterwards; -p supplies the connectivity explicitly and therefore overrides it entirely, while -r auto-detects its rings from the NAO bond-order graph. Under -v the Stage 3 detail block reports the basis actually used, as Connectivity mask basis: full NAO. Cost is negligible — one extra Wiberg pass over the NAO density; BOP itself, which dominates the runtime, still runs at nmb / nvb size. (This was briefly the opt-in --nao-mask flag in July 2026; it is now unconditional and the flag has been removed.)
Post-HF layer basis (always full NAO). For correlated (post-HF) densities the BOP analysis uses the cumulative-idempotent layer scheme: the 1-RDM is partitioned into quasi-degenerate (QD) groups of natural orbitals, and a standard BOP is run on each cumulative idempotent projector. That QD partition is always derived from the full NAO density, never from the -b sub-block. This is essential rather than cosmetic: the sub-block of an idempotent density is not idempotent (Rydberg projection removes a fraction of each MO), so grouping the sub-block reads basis truncation as correlation and shatters what should be a single layer into many, inflating EDDB. BOP, the working density and every threshold remain in the -b basis — only the layer partition is derived in full NAO. Under -v the Stage 3 block reports QD layer basis: full NAO. For an idempotent reference all occupied natural orbitals share one occupation, so there is exactly one layer and the scheme reduces to a single standard BOP call — recovering the HF/DFT answer exactly, as it must.
Bond-order thresholds. runEDDB applies two distinct Wiberg cutoffs, and only the second is user-tunable:
NAO construction algorithm, selected by --nao-algorithm ALG (native input only; .49 archives carry NBO7’s own NAOs and ignore the flag with a printed note). Background: in strongly polarised basis sets (cc-pVQZ and beyond) the textbook NAO definition suffers from High-L Redundancy Leakage (HLRL) — the molecule-wide occupancy-weighted orthogonalisation stores each NAO as a huge, near-cancelling coefficient expansion routed through the chemically insignificant high-angular-momentum shells and neighbouring centres (a benzene “carbon 2p” at cc-pV5Z carries a coefficient norm of ~12 with ~30% of it on the bonded hydrogen, cancelling down to a perfectly atom-localised orbital). The real-space orbital stays localised and integrated populations stay basis-stable, but the ill-conditioned representation has two practical consequences: most molecular viewers (Avogadro2, IQMol — verified Jul 2026; Multiwfn is correct) misrender the exported orbitals as delocalised artefacts, because their approximate high-L handling breaks the coefficient cancellation; and the NPA charges themselves lose numerical conditioning at cardinal ≥ 5. ALG is one of:
The exported .NAO/.NMB/.NVB.fchk header records which variant produced it (| frozen-NMB, | cc-layers, | raw NAO for rigorous / nbo7legacy, or | L-projected when --export-lproj is given), so orbital pictures remain traceable to the algorithm that generated them.
Reproducibility across compilations. The methods are refined continuously, and a later compilation may change numbers slightly; every such change is listed in the changelog with its scale, and none so far alters the qualitative delocalization picture. State the compilation date (printed in the banner of every run) in the methods section; the compilations used in published work are listed on the download page.
Basic usage:
The input file is the only required argument — the recognised extensions are listed right under the syntax line above (geometry formats run through the built-in GFN2-xTB engine; the rest are read as wavefunctions). Everything else has a sensible default. Output is requested with verbs — --export-cube, --export-fchk, --export-json, --export-map and --table — each taking a comma-separated list of content tokens.
Two built-in help screens. --help (or a no-argument run) prints a short, curated list — just the options most analyses reach for: the five scope modes (-g / -h / -f / -p / -r), NOBD selection (-a / -s), the three output verbs, and the common controls (-b, -c, --cube-ref, the --xtb-* engine controls, --xyz-charge / --xyz-mult, -n, -q, -v). To keep that screen uncluttered, the more specialised flags are deliberately left out of it. Run --full-help for the complete reference, which breaks the --xtb-* controls out flag-by-flag and additionally documents the less-common geometry options (--xyz-center, --xyz-translate, --xyz-frame), citation export (--cite), output naming (--out-prefix / --out-dir), the ASCII toggle (--ascii), the ring-graph cutoff (--ring-thresh), the NAO algorithm selector (--nao-algorithm) and the developer / diagnostic flags (--test-*, --no-nrep / --force-nrep, --no-ecp, --nao-debug*, --nao-atdiag-form, --density-source, --dump-element-table).
The reference table below documents every user-facing option — the curated --help set and the specialised flags that only --full-help shows on screen (the low-level diagnostic flags are listed by --full-help itself):
runEDDB has three verbosity tiers:
Analysis tables are printed only when requested via --table (independent of the verbosity tier): --table mo for the per-MO ED / EDLB / EDDB decomposition (when canonical MOs are available), --table no for the NO-occupancy table (its multireference / spin-contamination indices print in the NO stage's -v detail block), --table bo for the bond-order orbitals (aliases boo / nba), --table nobd for the NOBD-resolution table, --table ao for the per-orbital (atomic-orbital) populations, --table subshell for the subshell-resolution populations (per-(atom, n, L) sums of the AO rows), --table shell for the shell-resolution populations (per-(atom, n) sums over L), --table npa for the condensed-atomic table (led by the natural charge qN), or --table all for every table. All requested tables are emitted together in one captioned > Printing analysis details: section immediately before the EDDB summary, in the order mo → no → bo → nobd → ao → subshell → shell → npa (the orbital-based tables MO / NO / BOO come before the NOBD-driven dissection; AO / SUBSHELL / SHELL / NPA come after it). Using -s without a list still shows the NOBD-resolution table (so you can pick indices for a follow-up run). In true-quiet mode the EDDB summary still prints, and --table tables requested alongside -q are honoured.
runEDDB can tell you exactly which papers to cite for a given run — the set is method- and option-dependent, emitted by the stage that uses each reference:
The remaining algorithmic ingredients (the Wiberg index, the per-pair NBA / BOO decomposition, OWSO / Gram-Schmidt orthogonalisation, the multireference indices, ring detection, …) are not in the end-user list — they are attributed in the source-code comments instead. Two ways to get the references:
These flags tune the built-in GFN2-xTB SCC and apply only to .xyz input (they are ignored for the wavefunction-file lanes). The defaults are chosen to be robust and EDDB-appropriate, so most runs need none of them; they exist for the occasional stiff or unusual system.
If the SCC does not converge, runEDDB stops and prints a short reminder suggesting exactly these knobs (a higher --xtb-etemp, a larger --xtb-maxiter, or a looser --xtb-conv), so you rarely need to remember them in advance.
Outputs are generated only when explicitly requested with --export-cube (cube files) or --export-fchk (FCHK files); --table prints analysis tables to the terminal without writing any file.
Gaussian cube files (.cube) — via --export-cube LIST; 3D electron density on a PCA-aligned grid; viewable in VMD, Chemcraft, GaussView, Avogadro2, IQmol, or any cube-compatible program. Tokens:
2D maps (.map.dat) — via --export-map LIST. The tokens ed, eddb, edlb, bdf write density slices (e/bohr3; by default the mean of five planes between 0.5 and 1.5 Å above the base plane, see --map-slab in §7; the same matrices, scope and dissection as the cubes: <stem>.EDDB_G.map.dat, <stem>.BDF_P.map.dat, …; BDF = EDDB − EDLB node by node); the tokens icss, icss-edlb, icss-eddb write the ICSS maps: the ICSS values on a lattice in a plane chosen with --map-plane (a ring at height h, the best-fit molecular plane, three atoms, or a frame plane; default the best-fit plane of the heavy atoms 1 Å above it), step --map-step (0.25 Å), extent = the projected atoms plus the box margin. Files <stem>.ICSS.map.dat, <stem>.ICSS_EDLB_G.map.dat, <stem>.ICSS_EDDB_G.map.dat (and ICSS_zz / ICSS_nn with --icss-axis): six # header lines (command, plane origin / normal / in-plane axes, lattice, columns), then one line per node with the in-plane coordinates u, v, the Cartesian x, y, z (Å) and the value (ppm), the rows of constant u separated by a blank line — ready for gnuplot (splot 'f.map.dat' using 1:2:6 with pm3d) or numpy.loadtxt. The plane origin is always a node, so the value at u = v = 0 of a ring map is the NICS(h) row of the table with the sign reversed.
nc-AFM model images (--export-map afm, afm-edlb, afm-eddb) — a simulated high-resolution AFM image with a CO tip (Gross et al. 2009) from the rigid-tip Pauli-repulsion model of Moll et al. (2012): in the short-range regime the tip–sample repulsion is a power law of the sample density alone, V = A ρα (their CO/PTCDA fit A = 692 eV, α = 0.78 with ρ in e/Å3; --afm-prefactor, --afm-alpha), and the frequency shift of a small-amplitude sensor is Δf = (f0/2k) ∂2V/∂z2. The map holds ∂2V/∂z2 in eV/Å2 (central differences, 0.05 Å) on the --map-plane lattice at the tip height, by default 3.5 Å above the best-fit molecular plane (Moll’s atomic-resolution window is 3.0–4.5 Å; --map-plane fit,h or ring N,h sets it). The EDLBG / EDDBG shares are the proportional split VX = V ρX/ρ = A ρα−1ρX, which is additive at every point for any α (it is the plain density split for α = 1); afm − afm-edlb − afm-eddb is the core/Rydberg remainder outside the analysis block. A research variant, --afm-tip SIGMA[,s|pz], replaces the point evaluation by the integral of V over a Gaussian tip orbital of width σ (s-type, or pz along the normal; 5×5×5 Gauss–Hermite quadrature, exact for polynomials up to degree 9 per axis), E(R) = ∫|ψtip(r−R)|2V(r) d3r, with the same additive shares inside the integral; because the fitted A and α already absorb the CO tip, the variant is meant for exploring the tip dependence of the contrast, not as a better default (for naphthalene an s orbital of 0.5 Å doubles the values and reduces the bond discrimination, a pz orbital triples them). The model neglects the van der Waals and electrostatic background and the CO-tip relaxation, so it reproduces the intramolecular contrast and not absolute frequency shifts. Validation (2026-09-20): on naphthalene, anthracene, phenanthrene, pyrene, triphenylene, coronene, hexa-peri-hexabenzocoronene and C60 (B3LYP/def2-TZVPP) the per-bond contrast of --table afm correlates with the Wiberg bond order at r = 0.94–0.98 and with the Pauling order from the bond length at 0.74–0.96, i.e. it reproduces the bond-order discrimination of Gross et al. (Science 337, 1326, 2012): in hexabenzocoronene the five symmetry classes of C–C bonds are ordered monotonically from the peripheral benzo bonds (1.387 Å, brightest) to the inter-ring bonds (1.461 Å, ratio 1.31), and in C60 the 6:6 bonds are brighter than the 6:5 bonds by a factor 1.20 (--map-plane radial gives every bond its own outward normal for cages). The EDDBG share carries 50–98 % of the contrast, the differences between bond classes coming largely from the EDLBG part. The apparent shortening of high-order bonds seen experimentally is a CO-tilt effect and is outside the rigid model; files <stem>.AFM.map.dat, <stem>.AFM_EDLB_G.map.dat, <stem>.AFM_EDDB_G.map.dat (scope letter as for the cubes; -a/-s give the share of the selected NOBDs). --table afm prints the same quantity above the midpoint of every bond (Wiberg order ≥ 0.3) next to the bond length and the Wiberg bond order — the per-bond form of the bond-order contrast of Gross et al. (Science 337, 1326, 2012) — with the same model, tip height and --map-slab handling. The GFN2-xTB lane carries a minimal basis without the diffuse density tail that the model probes at 3.5 Å, so its images are two orders of magnitude weaker; for a qualitative picture from a geometry lower the tip (--map-plane fit,2.5) and compare contrasts, not values.
STM images (--export-map stm, stm-edlb, stm-eddb; --stm-bias V; --table stm) — a constant-height scanning-tunnelling image in the Tersoff–Hamann approximation (Phys. Rev. B 31, 805, 1985): for an s-wave tip the tunnelling current at the tip position is proportional to the local density of the sample states between the Fermi level and the bias, which for an isolated molecule is the density of the MOs inside the bias window. --stm-bias V (default −2.0 V) selects that window with the molecular gap as the zero of the scale: V < 0 images the occupied MOs from the HOMO down to HOMO − |V| eV, V > 0 the virtual MOs from the LUMO up to LUMO + V eV. The map holds the window density in e/bohr3 on the --map-plane lattice at the tip height (default 3.5 Å above the best-fit plane, one plane unless --map-slab is given), so that it is directly comparable with the AFM maps of the same run. For an occupied window the density is partitioned as in --table mo: the EDDBG part is the symmetrised product ½{DEDDB, PV} of the EDDB density matrix with the projector on the window MOs in the analysis block (EDLBG likewise with D − DEDDB), which is additive, integrates to the --table mo sums over the window and reduces to the density slices when the window holds all occupied MOs; stm − stm-edlb − stm-eddb is the core/Rydberg remainder outside the analysis block. A virtual window carries no bonding partition, so a positive bias writes the total map only. --table stm prints the same three quantities above every bond midpoint (Wiberg order ≥ 0.3, in 10−6 e/bohr3) next to the bond length and the Wiberg order, with the bias and the window (number of MOs, energy range) in the legend; sweeping the bias is the physical way of “reading down” the MO spectrum from the frontier: in coronene the per-bond STM density already follows the AFM contrast at −0.5 V (r = 0.98), in benzo[k]fluoranthene it does so only from about −5 V (r = 0.54 at −1 V, 0.83 at −2 V, 0.95 at −5 V), the frontier pair alone painting a different pattern. Requires an SCF (HF/DFT) wavefunction with MO coefficients and energies (FCHK, ORCA JSON, Molden, GAMESS, Turbomole; not the NBO .49 lane, not post-HF densities); the model neglects the tip structure and the substrate, and images the LDOS of the free molecule.
Scoped runs (-f / -p / -r) — exact atomic support. All three scope-dependent densities share exactly the atomic support of the selected atoms: after the congruence transformation the EDDB matrix is purified (rows and columns of out-of-scope atoms zeroed), and — as of Jul 2026 — the auxiliary π-electron density entering the EDLB difference (Dtot − Ddel) and the BDF combination (2·Ddel − Dtot) receives the same purification (it is reconstructed from the full molecular density via the selected π-NOBDs, so it would otherwise retain contributions on atoms outside the scope). Consequently the integrated cube density, the printed basis-trace reference and the per-atom table sums agree exactly — e.g. the EDLBF cube integrates to EDF − EDDBF. The same purified matrices feed the differential tokens (dedlb / dbdf).
Grid quality is controlled by --cube-size N (default: 100; the ICSS maps use instead an exact 0.5 Å step on every axis with a node on the box centre, unless -c is given) and the box by --cube-margin R (the margin in Å added around the atoms of the active scope on every side, default 3.2 Å = 6 Bohr; the ICSS maps use 10 Å unless the option is given; a cloned grid from --cube-ref ignores it), with the grid covering the molecular bounding box (or a fragment subset, when -f / -p / -r is in effect) plus a small margin. The sign and zero of N select between three modes:
Gaussian FCHK files (.fchk) — via --export-fchk LIST; viewable in GaussView, Avogadro2, IQmol, or Chemcraft. Tokens:
For all three FCHK exports the per-orbital occupation (NAO population, NOBD occupation, or NO occupation number) is stored in the Alpha Orbital Energies field, pre-scaled so that the value Avogadro2 shows in its eV-labelled energy column reads back numerically as the unscaled occupation. So a doubly-occupied orbital appears as "2.00 eV", a singly-occupied one as "1.00 eV", and so on — the unit label is technically eV but the number is the actual occupation. Other viewers (GaussView, IQmol, Chemcraft) that read FCHK energies in hartree will show the raw small values; if you need the actual occupations there, multiply by 27.2114.
Terminal tables (--table) — no file written. Every table requested with --table is collected into a single captioned > Printing analysis details: section, emitted just before the always-on EDDB summary, in the order mo → no → bo → nobd → ao → subshell → shell → npa. Tokens: mo (per-MO ED / EDLB / EDDB decomposition, when canonical MOs are present), no (NO occupancy + multireference diagnostics), bo (bond-order orbitals; σ/π/δ/φ resolution; aliases boo/nba), nobd (NOBD-resolution table), ao (per-orbital atomic-orbital populations in the -b basis), subshell (subshell-resolution populations: per-(atom, n, L) sums of the AO rows), shell (shell-resolution populations: per-(atom, n) sums over L), npa (condensed-atomic populations led by the natural charge qN), and all (every table). The orbital-based tables (MO / NO / BOO) print before the NOBD-driven dissection; ao / subshell / shell / npa print after it. Each table is introduced by a capitalised caption; see §8 for what every column means.
NMR reference (--table nmr) — <stem>.nmrref. Written by every --table nmr run: the element-averaged isotropic shieldings and their EDLB/EDDB (dia|para or trans|rot) partition columns, plus one line per atom. Feed it back with --nmr-ref FILE.nmrref to obtain partitioned chemical shifts relative to that molecule (TMS, solvent); see §7.
Reference list (--cite) — <stem>.bib / <stem>.refs.txt. --cite bib writes a BibTeX file, --cite txt a plain numbered list, and --cite both writes both. The contents are the exact, de-duplicated set of papers to cite for the run — method- and input-dependent — and honour --out-prefix / --out-dir like every other output. The same references are shown per-stage on screen under -v (see §4); the full reference list is in §11.
Filename rules. Filenames are standardized and deterministic — each token names its own file as <stem>.<TOKEN>_<SCOPE>.<ext>, so a single verb can emit many files coherently. The <stem> is the input basename (override the whole batch with --out-prefix); <SCOPE> is the scope letter G/F/P/R (from -g/-f/-p/-r), baked into the name for scope-dependent tokens (eddb, edlb, bdf, nobd, and the differentials) and omitted for scope-independent ones (ed, no, xtb, AO). The AO export names itself by the resolved basis (NAO/NMB/NVB):
The scope (-g / -f / -p / -r) is encoded in the _G / _F / _P / _R suffix so two cubes that differ only by scope never collide. --auto-pi / --select-nobd dissection is reflected in the file contents, not the name. The export verbs deliberately drop per-file naming — use --out-prefix NAME to set the stem for the whole batch and --out-dir DIR to choose the location.
The old one-flag-per-thing --output-* family (from the released runEDDB_nbo49) was removed in v2.0 — the three verbs replace it. Update old commands as follows:
Lists let you combine these in one call, e.g. the old --output-eddb --output-edlb --output-bdf becomes --export-cube eddb,edlb,bdf.
A differential map subtracts one runEDDB density field from another, point-by-point on a shared grid, to reveal how the electron structure reorganizes between a reference and a perturbed system — a substituent change, a hydrogen / halogen bond, a π···cation or π···HF contact, solvation, or a redox step. The differential of the bond-delocalization field, ΔBDFπ, maps π-electron (de)localization changes directly in the language of resonance; the same operation applies to every density in the EDDB decomposition, so there is one differential token per density (all sharing a single --cube-ref):
The reference is a cube of the same density written by an earlier run, supplied via --cube-ref FILE: it provides both the grid (origin / points / steps, cloned exactly) and the reference values, so the subtraction is point-for-point and no external cube-arithmetic tool (Multiwfn, VMD, …) is needed. Outputs follow the standard naming scheme (<stem>.DED_G.cube, .DEDDB_G.cube, …; set the stem with --out-prefix). The differential maps run on the native lane (not the legacy .49).
π-resolved (ΔBDF) versus full (ΔEDDB / ΔEDLB). ΔBDF is normally a π-only quantity, so it should be built from the π-delocalization (π-NOBDs; see the workflow below). When a clean π-dissection is awkward, ΔEDDB and ΔEDLB on the full delocalized / localized densities need no π-selection at all and still show where delocalization is gained or lost — frequently the easier and more robust route.
Recommended ΔBDFπ workflow. The map is only as good as the set of NOBDs included, and the BDF cubes for both systems must be built the same way. (1) compute and save the reference π-BDF cube, e.g. runEDDB -i ref.fchk --auto-pi --export-cube bdf --out-prefix ref (writes ref.BDF_G.cube); (2) for the perturbed system run runEDDB -i pert.fchk --auto-pi --export-cube dbdf --cube-ref ref.BDF_G.cube. Capture the π-system consistently in both molecules: --auto-pi selects π-symmetry NOBDs automatically, but a perturbation can change how many NOBDs carry the π-delocalization (and the classifier may miss one in a given system). Inspect the NOBD-resolution table for each molecule (printed with --select-nobd / --auto-pi / --verbose) and, if needed, replace --auto-pi with an explicit --select-nobd LIST so that all NOBDs contributing to the π-(de)localization are included in both runs — otherwise ΔBDF shows a spurious feature wherever a real contributor was dropped from one side. Typical ΔBDFπ isosurfaces are around ±0.010.
Same coordinate frame, same scope. A point-by-point subtraction is only meaningful if the two systems share one frame. The most robust route is to align them before the wavefunction calculation — keep the common fragment’s Cartesian coordinates fixed. Alternatively, apply an after-the-fact rigid superposition at export time with --cube-align (see the box below), which absorbs an arbitrary translation and rotation. runEDDB warns if the reference and current geometries do not overlap. Both runs must also use the same scope (--global / the same --fragment / --pathway / --ring-detect) and the same density flavour, so that their grids, NOBD sets and densities are comparable.
Large, flexibly-reorganizing systems — focus on a fragment. When a perturbation reshapes a remote reactive site so the whole molecule no longer overlaps, restrict the analysis to the conserved region of interest with --fragment (or --pathway). This focuses the EDDB density, the cube grid and the geometry-overlap check on the selected atoms only, so the differential reports how that fragment’s π-system responds to a change happening elsewhere — without being penalised for motion in the part you are not studying. The overlap check is purely spatial and element-based, so the reference and perturbed structures may number their atoms differently: as long as the studied fragment is physically superimposed, the overlap is recognised. (Keep that fragment’s coordinates frozen between the two systems, so the differential reflects electronic reorganization rather than atomic displacement.)
Automatic rigid alignment — --cube-align [FRAGMENT]. When the reference and perturbed geometries are not in the same frame (e.g. two optimisations, two solvation environments, or coordinates from different sources), you do not have to pre-align them by hand. Add --cube-align to a differential or orbital-cube run: runEDDB performs a rigid-body Kabsch superposition of a conserved fragment onto its counterpart in the --cube-ref cube (finding the rotation R and translation t with xaligned = R·x + t), then evaluates the exported field — and writes the shown geometry — in that reference frame. Because the density is a scalar field, this is done by sampling it at the back-mapped grid points; no rotation of the wavefunction or density matrix is involved, and the result is exact. The very same back-map carries the per-orbital cubes (ao / no / bo / nobd / xtb) into the reference frame — each orbital is a scalar field too — so orbital cubes emitted alongside a differential map are aligned identically; the superposition is fitted and reported once and shared by every lane. Without a FRAGMENT list it reuses the --fragment selection. The alignment atoms must appear at the same index and carry the same element in both the perturbed input and the reference cube (a mismatch is a hard error).
# ΔBDFπ of the same chromophore in two solvation environments. # The porphyrin core (atoms 1-24) is conserved; the two geometries # differ by an arbitrary translation + rotation (and local relaxation). $ runEDDB -i gas.fchk --auto-pi --export-cube bdf --out-prefix gas # writes gas.BDF_G.cube (reference) $ runEDDB -i water.fchk --auto-pi --export-cube dbdf \ --cube-ref gas.BDF_G.cube --cube-align 1:24 # aligns the core, then subtracts # console report emitted for the aligned differential: Alignment atoms (--cube-align): 24 RMSD after rigid alignment: 0.03812 Angstrom Max residual displacement: 0.07105 Angstrom (arbitrary translation + rotation removed; residual = internal deformation)
What --cube-align does and does not remove. It cancels only an arbitrary rigid translation and rotation of the perturbed system relative to the chosen fragment. It does not remove genuine internal (non-rigid) deformation: any such change of the alignment fragment survives the fit and is reported as the post-fit RMSD and the maximum residual displacement (the two lines above). When those residuals are small, the map is a clean electronic-reorganization picture; when they are large, the perturbation has deformed the fragment beyond the perturbative regime and ΔBDFπ is no longer well defined — the alignment does not, and cannot, repair that. Treat the reported RMSD as the validity gauge for the difference map.
--table nmr takes the magnetic response of a GIAO (or CSGT) NMR calculation (or, for a wavefunction file without NMR data, an approximate response built from its MOs, see below) and splits the isotropic shielding of every nucleus — and the NICS at ring centroids, along ring normals or at arbitrary points — into contributions of the localized valence density (EDLBG) and the delocalized valence density (EDDBG), each further separated into the part carried by the unperturbed density and the part carried by the induced response. With -a / -s every column is restricted to the selected NOBDs, so the π ring-current contribution to NICS is read directly from the π-type NOBDs instead of from canonical MOs; --table nmr-nobd and --table nmr-mo additionally write the NOBD- and MO-resolved contributions to files (see below). The one-electron shielding integrals are computed by runEDDB itself; only the CPHF response densities come from the quantum-chemistry program — or, for a geometry input, from the built-in GFN2-xTB lane, which yields approximate NICS (not nuclear shieldings) without any external program (see the end of this section).
When do the π-NOBD columns equal the π-MO contributions? The selected-NOBD value is a trace with the projector on the selected NOBDs, so it does not depend on how the orbitals inside that subspace are mixed. It therefore equals the sum of the canonical π-orbital contributions (the quantity the Steiner–Fowler rules are formulated for) only when the selected subspace is the occupied π space: a planar system in which σ and π do not mix, the full NAO representation (-b nao), and a selection — automatic (-a) or an explicit -s LIST — that captures every occupied π-NOBD and nothing else; then the π-NOBDs are just a unitary image of the π-MOs. For non-planar or σ/π-mixed systems, or when the selection is incomplete, the two numbers differ: the NOBD columns report the contribution of the selected delocalization channels, not of a symmetry block. Check the NOBD table (--table nobd, star markers) before quoting a π-restricted NICS as “the π-MO ring current”.
How the partition works. The shielding is bilinear in density-like matrices, σ = Tr[D·H(11)] + Tr[D(B)·H(01)], so any additive split of the density D and of its field derivative D(B) splits σ exactly. runEDDB uses the EDDB fraction operator Ω, the symmetric solution of D·Ω + Ω·D = 2·Ddel in the analysis block, which reproduces the EDDB density exactly (½(DΩ + ΩD) = Ddel) and is diagonal in the NOBD basis (eigenvalues nk/〈vk|D|vk〉). The response density is antisymmetric and connects occupied with virtual orbitals only, so its trace with any operator living in the occupied space (Ω, a set of NOBDs, a set of MOs) is taken with the occupied-side rule: row and column of every occupied–virtual term are assigned to the occupied side and the occupied–occupied block is counted once (G'' = 2G − Goo). With P the projector on the occupied space this gives Tr[P·G''] = σ exactly, and the table reads EDDBG = Tr[Ω·G''], EDLBG = Tr[(PV − Ω)·G''] and other = σ − Tr[PV·G''] (the core and Rydberg share of the occupied space, chosen with -b). This is the convention of natural chemical shielding analysis and of the ipsocentric model: the whole induced current belongs to the occupied orbitals that carry it.
Input — GIAO lane (Gaussian, ORCA or Turbomole).
Restrictions: HF and DFT references (RHF; UHF with the spin-summed response from Gaussian or ORCA), Gaussian .fchk, ORCA .json or Turbomole .tmol+XDENS input, global EDDBG only. With -b nao (full NAO basis) the total reproduces the program’s own isotropic shielding to all printed digits — a built-in sanity check.
Input — CTOCD-DZ lane (Gaussian only). Run Gaussian with NMR=CSGT IOp(10/33=2) (IGAIM or SingleOrigin work as well) and keep the .log: runEDDB reads the six CPHF response densities (three momentum and three field responses) from <stem>.log (or --nmr-log FILE) and evaluates the analytic CTOCD-DZ shielding (Lazzeretti–Zanasi; the ipsocentric model of Steiner and Fowler): the gauge origin moves with the point of observation, d(r) = r, so there is no diamagnetic term at all — the whole shielding is an induced current. The gauge in use is shown in the table title. Note that this is not the CSGT number Gaussian prints (Keith and Bader move the gauge origin to the nuclei near the atoms and integrate numerically), and that DZ shieldings at nuclei converge slowly with the basis set. The table therefore prints the fulfilment of the translational sum rule (100 % = complete basis) as a diagnostic: NICS away from nuclei are reliable from about 80 % on, nuclear shieldings need ≥ 90 %. Any large, polarised basis will do — spherical or Cartesian alike (Cartesian shells are handled exactly through their spherical + r2 decomposition); the sum rule tells you whether it was enough.
Syntax.
Every --nics* and --nmr-ref option implies --table nmr. For each ring the table lists NICS(0), NICS(1) and their zz components along the ring normal (the normal follows the right-hand rule of the atom order and is printed in the ring header); NICS = −σ (Schleyer’s sign convention). Under the caption every ring is listed by its atoms in the closed-cycle notation of -p and --ring-detect (R1 1-2-3-4-5-6-1), and the ring-current table lists the extra cycles of the --rcs / --bcs lists the same way, with the numbering continued (R4 5-4-13-...-5), so a line can be pasted back into a command. NICS(1) is the mean of the two probes at ±1 Å, which are always both computed (the loop-current fit uses both) and is the only NICS(1) printed, in every mode; for a planar ring the two faces are equal, and for a non-planar or one-sided situation --nics-scan or --nics x,y,z give any point above or below the ring. --nics-scan R,step scans from −R to +R along the normal (step 0 or omitted: only the two points ±R). The ring list of --nics-rings uses the same ring-graph cutoff as -r (--ring-thresh).
Reading the tables. By default every NMR table has four numeric columns with five decimals: the headline value (σiso, NICS, δiso or the shielding of an MO set), its EDLBG and EDDBG parts and other (the core + Rydberg share of the occupied space, zero with -b nao; the frontier-MO table adds rest). The terminal never shows more than these four columns. Under -v the same tables are written again to
Which analysis space (-b) for which probe, and why the answer looks backwards. The recommendation below (NVB at the nuclei, -b nao for NICS) reads like the opposite of what one expects: the natural valence basis has no core and no Rydberg orbitals, so it seems unfit for anything close to a nucleus and natural for a probe far away. That reasoning rests on a wrong premise about what -b does. It does not choose the orbitals with which the shielding is computed. The shielding at every probe is always evaluated with the full density and the full response in the complete AO basis, all electrons and all functions. -b only chooses the analysis block: which NAOs are partitioned into EDLBG and EDDBG. The share of the occupied space that lies outside the block (core and Rydberg NAOs) is not discarded but collected in the other column, and the total σ is identical for every choice of -b. NVB is therefore not "unfit" near a nucleus; it merely labels the core contribution differently. At a nucleus the Larmor circulation of the 1s shell is large (benzene carbon: +57 ppm in the other column of the CTOCD-DZ table at def2-TZVP, about 200 ppm in the GIAO Larmor bookkeeping; hundreds of ppm for O or F) and it is a chemically distinct term that deserves its own column. With -b nao the core NAOs enter the block, they are perfectly localized, and their contribution dissolves into EDLBG, which then no longer means "localized bonds and lone pairs" but "localized bonds, lone pairs and the core". Hence NVB at the nuclei: not because it describes the core better, but because it keeps it apart. Far from the nuclei the core contribution is negligible (benzene: 0.2 ppm at NICS(0), −0.3 ppm at NICS(1)); the issue there is a different one. The occupied space projected onto the valence block is not complete, a small part of the response of the occupied density sits on NAOs classified as Rydberg, that part depends on the basis set and on where the response to a distant point is anchored, and under NVB it lands in other or blurs the EDLB/other border. With -b nao the block contains every NAO, its projector equals the projector onto the occupied space, other ≡ 0 identically and the NICS is resolved exactly into EDLBG + EDDBG. The EDDBG column is stable either way (benzene, RHF, NICS(0) of the π-NOBDs: −21.4, −22.5, −21.6 and −22.3 ppm for 6-31G, 6-31G*, def2-TZVP/NVB and def2-TZVP/NAO), so the recommendation is about the cleanliness of the remainder, not about the EDDBG number. The rule is thus the reverse of the intuition: where the core is large we want to see it separately, so NVB; where it is small we want an exhaustive partition with no remainder, so NAO.
Equivalent loop current (Iloop) — a ring-size-independent measure. NICS values of rings of different size are not comparable with each other: the probe 1 Å above a five-membered ring sits closer to its current loop than above a six-membered one, and the induced field of a loop scales with its area, so a larger NICS does not mean a stronger current. The current itself does not depend on the ring area, so below every NICS table runEDDB fits to the NICSzz(z) profile along the ring normal the field of a thin circular loop of radius R carrying the current I per unit external field,
NICSzz(z) = −2π I R2 / (R2 + z2)3/2 ⇒ I [nA/T] = −NICSzz(z) [ppm] · (R2 + z2)3/2 / (2π R2) (R, z in Å)
with the sign chosen so that a diatropic (aromatic) ring gives a positive current. Since the Ampère integration below measures the ring current exactly, the loop fit is a diagnostic and no longer appears on the terminal: under -v the file
Ring and bond current strengths (--rcs [LIST], --bcs [LIST]) — the GIMIC number without a current density. The loop current above is a model fit; the current itself can be measured exactly from the same shielding machinery. GIMIC defines the bond current strength as the flux of the induced current density through a plane perpendicular to the bond, from the ring centre through the bond midpoint to far outside the molecule. By Stokes' theorem that flux is the line integral of the induced field around the boundary of the plane, μ0 I = ∮ Bind·dl (Ampère's law), and the induced field at any point is minus the shielding tensor there, Bind/B0 = −σ·n for the external field along the ring normal n. So --rcs / --bcs place shielding probes on the four edges of a rectangle through every ring bond (the ring axis, the bottom and top edges at ±h, and the outer edge L beyond the bond midpoint; for a bond shared by two rings the far edge is the other ring's axis), integrates them with Gauss–Legendre quadrature and prints, in ppm·Å turned into nA/T by the factor 1/4π,
Ibond [nA/T] = (1/4π) ∮ (−σ·n)·dl [ppm Å], positive = diatropic,
as I_bond rows of the same RING CURRENT STRENGTHS table (total, EDLB_G, EDDB_G; under -a/-s: the selected NOBDs), bond by bond, followed by the I_cyc row of the cycle (with --bcs), or as the I_cyc rows alone (with --rcs); the diagnostics file of -v adds the trans/rot (dia/para) rows under every bond, the mean and spread over the outward bonds, and the table BOND-CURRENT EDGE TERMS with the four line-integral terms. Every edge probe carries the full EDLB/EDDB partition, so the current of the delocalized electrons through a bond is obtained exactly, with no loop model and no current-density grid.
What a ring current is, and is not, evidence of. runEDDB reports Iloop, Ibond and Icyc as what they are: magnetic properties of the molecule in a field, the same observables that determine NICS, proton shifts and the magnetizability exaltation. They are not an aromaticity index, and the partition into EDLBG and EDDBG does not make them one. The sign of a ring current is set by the symmetry of the frontier π–π* excitations (translationally allowed: diatropic; rotationally allowed: paratropic, the ipsocentric picture), its magnitude largely by the HOMO–LUMO gap. Neither is a measure of how far the bonds are delocalized, nor of the stabilization that IUPAC requires together with cyclic delocalization for a ring to be called aromatic. The familiar correspondence between the 4n+2 / 4n electron counts and diatropic / paratropic currents is a property of free-electron (Hückel-type) annulene models, where the two follow from the same orbital symmetry; outside that family it fails in both directions: bond-alternated (localized) annulenes still sustain a diatropic current, and the four phenalenyl systems of the tutorial share one delocalized 12-membered perimeter (the same EDDB maps and CDI) while the carbon-centred ions are diatropic and the isoelectronic B- and N-centred molecules paratropic. The π electrons of benzene are not more mobile than those of hexatriene; they are bound by the cyclic potential, and it is the degeneracy of the cyclic problem, the coherence it enforces around the ring and the wide gap it opens that stabilize the molecule, while the current stays moderate. A strong paratropic current signals a small gap, not destabilization. Use EDDBG/EDDBP and the CDI for delocalization, energies for stabilization, and the currents for the magnetic response; inferring bonding or aromaticity from a current alone has led to well-documented over-interpretations, down to the heaviest elements (the tri-thorium cluster: Angew. Chem. Int. Ed. 2022, e202204337; RSC Adv. 2023, 13, 34224).
Orbital resolution — files, not terminal tables. --table nmr prints only the two complete tables (nuclei and NICS). Two variants print the same tables and additionally write a sidecar file next to the input (honouring --out-prefix / --out-dir):
Frontier orbitals (--table nmr-homo[N], nmr-somo, --nmr-mos LIST). In the ipsocentric (Steiner–Fowler) picture the ring currents are sums of occupied-orbital contributions dominated by the frontier orbitals. These options print one extra table with the shielding carried by a chosen set of occupied MOs: the set's density DF and its share of the response density (row and column of the trace assigned to the set, minus the double-counted occupied–occupied block) are partitioned exactly like the total into EDLBG, EDDBG and other, and rest is everything carried by the other occupied MOs (σiso = σ(set) + rest exactly). The header lists every MO of the set with its energy, occupation and ED/EDLB/EDDB populations (the --table mo row), so the orbital's share of the delocalized density and of the magnetic response are read side by side; a NICS block follows when probes were requested. nmr-homo takes the HOMO, nmr-homoN the levels HOMO-N..HOMO (N ≤ 9), nmr-somo every singly occupied MO, --nmr-mos 5:12,20 an explicit set (numbered as in --table mo). For UHF a level pairs αk with βk, so for a triplet HOMO and HOMO-1 are the two singly occupied α orbitals and HOMO-2 is the first α/β pair; a5:12,b5:11 picks one spin. A degenerate HOMO (benzene's e1g pair) triggers a warning suggesting the whole shell (nmr-homo1). Prefer the CTOCD-DZ lane for a ring-current interpretation: there the occupied-orbital contributions are exactly the ipsocentric ones, whereas GIAO carries an occupied–occupied response block that is shared symmetrically.
Chemical shifts (--nmr-ref) — step by step. Nothing has to be subtracted by hand:
#P B3LYP/def2-TZVP NMR=GIAO ! tms.gjf and benzene.gjf, same route line $ formchk tms.chk tms.fchk $ formchk benzene.chk benzene.fchkFor the CTOCD-DZ lane use NMR=CSGT IOp(10/33=2) in both jobs and keep the .log files.
Variants and pitfalls.
Example (benzene vs. TMS, RHF/6-31G, GIAO). δ(H) = 7.85 ppm = 10.09 (EDLB: 4.70 Larmor + 5.39 response) − 2.27 (EDDB: −4.94 Larmor + 2.68 response) + 0.03 (other): the deshielding of the benzene protons comes from the C–H bonds and the σ framework, while the π density shields the protons in the GIAO bookkeeping; the π ring current is seen where it belongs — in NICS: NICS(0) = −8.6 ppm with −21.4 ppm from the three π-NOBDs, NICS(1)zz = −29.0 ppm with −24.9 ppm from π. In the CTOCD-DZ lane the π-NOBD contribution to the proton shielding is essentially zero and the e1g pair alone carries the ring current.
Which lane for which question. The totals are gauge-independent; the partition is not. For the shielding of nuclei and for chemical shifts use the GIAO table (fast basis-set convergence, local “atomic” bookkeeping). For ring currents and their NICS — the π/σ question, the four-/two-electron rules of aromatic and antiaromatic rings — the CTOCD-DZ table is the physically transparent one. Reporting both side by side turns the gauge dependence of the “π contribution” into a result rather than an ambiguity. The default analysis basis is NVB; for NICS probes far from nuclei also check -b nao, because the response at a nucleus-free point spans the Rydberg NAOs and the EDLB/other split (not the EDDB column, which is stable to about 1 ppm) depends on the basis size.
Approximate magnetic partition from any SCF wavefunction (automatic; --nmr-kernel). When --table nmr, a NICS option or --bcs is requested on a wavefunction file that carries no NMR response data (a Gaussian .fchk from a plain SCF job, an ORCA .json or .molden without the pbfield densities, a Turbomole .tmol without XDENS, a GAMESS log), runEDDB does not stop: the same machinery that produces NICS on the GFN2-xTB lane below runs on the canonical orbitals of the file. The response densities D(L) and D(p) are built as the sum over states of the input MOs (all occupied and virtual MOs with their energies are required, SCF reference only; post-HF densities and NBO .49 archives still stop with an error), and the CTOCD-DZ tables, the EDLBG/EDDBG partition, the loop and bond currents and the frontier tables follow unchanged. The run says so everywhere: the stage line reads Computing APPROXIMATE NMR partition from the input MOs (CTOCD-DZ, B3LYP)... with the method it used, every table caption carries [APPROX., UNCOUPLED], a line under the first caption names the exchange kernel (exchange kernel: B3LYP a_x = 0.20 (.fchk header)), a counted WARNING states what is approximated and by how much the currents are expected to be off, the -v block has Lane: and Functional: lines, and the .nmrref written by such a run is marked so that --nmr-ref refuses to mix it with an exact one. When the file does carry NMR data the exact partition is always computed from them and a given --nmr-kernel is ignored with a WARNING. Use the approximate lane for signs, trends and the partition of any SCF file you already have; for numbers to be quoted run the NMR job. The worked examples below use the GFN2-xTB lane; the same tables appear for a wavefunction file without NMR data, with the [APPROX., UNCOUPLED] caption.
What is approximated, and the role of the method. For a purely imaginary perturbation the Coulomb and local exchange–correlation kernels vanish, so for pure functionals (LDA, GGA) the uncoupled sum over states is the coupled response and the tables agree with a full NMR job to every printed digit (PBE/def2-TZVP: benzene, naphthalene, pyrrole and planar cyclooctatetraene, ratio 1.000); for meta-GGAs a small current-dependent kernel survives (TPSS: 2 %). For hybrids and Hartree–Fock the exchange coupling is missing from the plain sum over states, and it is large: the ring currents of aromatic rings come out 1.25–1.4 times too small for B3LYP and PBE0, 2.2–2.5 times too small for HF, and much more for 4n rings (planar cyclooctatetraene: 2.7, 3.2 and 11.5), so no single factor per functional exists. runEDDB therefore adds an sTDA-type exchange kernel whose only input is the exact-exchange fraction ax of the functional (0.20 B3LYP, 0.25 PBE0, 1.0 HF). In a Gaussian basis the Löwdin-charge kernel of the xTB lane is far too strong and its required scale changes with the basis (0.40, 0.125 and 0.06 for def2-SVP, TZVP and QZVPP), because the transition charges spread over polarisation and diffuse functions; runEDDB builds the kernel in the natural minimal basis of its own NAO construction (the core and valence NAOs, the basis-independent minimal basis of the molecule), where it needs no scaling at all and gives the same numbers in every basis. Validated on benzene, naphthalene, pyrrole and planar cyclooctatetraene at B3LYP, PBE0 and HF in def2-SVP, def2-TZVP and def2-QZVPP against NMR=CSGT, the ring currents of the hybrids are reproduced within 2–5 % for every ring type (the 4n ring included, where the uncoupled value alone is off by 2.7–11), whereas Hartree–Fock stays 10–13 % low for the hydrocarbons and 20 % low for pyrrole: the missing term is exact exchange, four to five times larger at HF than in a hybrid, so any imperfection of the monopole kernel scales with it, and the exchange involving the nitrogen lone pair is what the atomic kernel represents worst. This is not the π-donor deficit of the GFN2-xTB lane, which sits in the tight-binding Hamiltonian and appears with or without coupling. The results of the three basis sets agree with each other within 0.03. Treat the coupled numbers as a good estimate, not as a replacement for the NMR job.
Telling runEDDB the method (--nmr-kernel). The only thing the kernel needs is which method produced the orbitals, and runEDDB usually finds it by itself: the second line of a Gaussian .fchk records it (SP RB3LYP def2TZVP, also RHF/UHF/ROHF), failing that the route line of the .log next to the file; an ORCA .json records no functional at all (orca_2json writes HFTyp: RHF even for B3LYP), so for .json and .molden input the ORCA output <stem>.out (or .log) next to the file is read, whose Fraction HF Exchange line is the exact-exchange fraction itself (pure, hybrid, range-separated and double-hybrid runs and Hartree–Fock are told apart from the same block), so keep the output next to the export; a Turbomole .tmol carries its $dft section (functional b3-lyp; no $dft means HF); a GAMESS log echoes DFTTYP= (NONE means HF). The -v block reports the method and where it came from. When the method cannot be determined (no output next to a .json or .molden file, a functional missing from the table) the default DFT kernel ax = 0.20 is used and the line under the first caption says so and how to be specific: exchange kernel: default DFT a_x = 0.20, method not identified (--nmr-kernel NAME|hf). The default is DFT-like and not Hartree–Fock on purpose: the HF kernel applied to DFT orbitals (small gap) is catastrophic (benzene B3LYP orbitals with ax = 1: a loop current of −199 nA/T with the wrong sign, planar cyclooctatetraene unstable), whereas the DFT kernel applied to HF orbitals merely underestimates (benzene HF: 6.1 instead of 11.1 nA/T). If you know the method, say it: --nmr-kernel b3lyp (or pbe0, hf, tpssh, m06-2x, …) overrides whatever was detected, on your responsibility; --nmr-kernel @list prints the table; names are matched case-insensitively, the spellings of the supported programs are accepted (pbepbe, pbe1pbe, wb97xd, b3lyp/g, b3-lyp, b-p, s-vwn, b3lypv1r, camb3lyp, …) and dispersion suffixes (-d3, -d3bj, -d4) are ignored. For a pure functional the table gives ax = 0 and the plain uncoupled response is used, which is exact. Range-separated functionals are accepted with their short-range fraction and double hybrids with their hybrid part, each with a WARNING that the long-range exchange or the MP2 part of the response is not represented by the monopole kernel. --nmr-kernel dft asks for the default explicitly; an explicit number (--nmr-kernel 0.30) sets ax directly, and a_x,y also scales the kernel (research use; the validated scale is y = 1). Adding a functional is one line in the table (functional_ax in the response module; the developer notes docs/NMR_KERNEL_FUNCTIONALS.md list every functional with its ax and its spelling in Gaussian, ORCA, Turbomole and GAMESS).
Method families at a glance. The table lists the families, the functionals currently in the built-in table with their exact-exchange fraction ax, what the lane then computes and how well it was validated. The lane itself runs for every family whenever the input carries no NMR data; --nmr-kernel only tells it the method.
| Family | Names in the table (ax) | What the lane computes | How to name it |
|---|---|---|---|
| Hartree–Fock | hf (also rhf, uhf, rohf, hf-3c), m06-hf: 1.00 | sum over states + the full exchange kernel (ax = 1); ring currents ~10–13 % low for hydrocarbons, ~20 % low for π-donor rings (pyrrole) | --nmr-kernel hf; detected from the .fchk header (RHF/UHF/ROHF), the ORCA output, a Turbomole control without $dft, a GAMESS DFTTYP=NONE |
| Pure LDA / GGA | lda/svwn, blyp, bp86, pw91, pbe, revpbe, rpbe, pbesol, olyp, xlyp, hcth, b97-d, mpwpw91, n12: 0 | the plain uncoupled response, no kernel: identical to the NMR job to every printed digit (verified PBE, four rings, three basis sets) | nothing to do (detection gives ax = 0), or --nmr-kernel pbe |
| meta-GGA | tpss, revtpss, m06-l, m11-l, mn12-l, mn15-l, scan, rscan, r2scan, r2scan-3c, b97-3c, b97m-v, vsxc, thcth: 0 | the plain uncoupled response; the small current-dependent kernel of the τ-functionals is missing (TPSS: 2 %) | as above |
| Global hybrids | b3lyp, b3pw91, b3p86: 0.20; b3lyp* 0.15; o3lyp 0.116; x3lyp 0.218; b1lyp, b1pw91, b1p86, pbe0, pw1pw, mpw1pw91, mpw1lyp, mpw1pbe, tpss0, scan0, r2scan0: 0.25; pbe38 0.375; pbeh-3c 0.42; bmk, bb1k 0.42; mpw1k 0.428; mpwb1k 0.44; mn15 0.44; sogga11-x 0.40; bhandhlyp, bhandh, pbe50, r2scan50 0.50; b97 0.194; b97-1, b97-2 0.21; b97-3 0.269; b98 0.22; thcthhyb 0.15; tpssh, revtpssh, r2scanh 0.10; m05, pw6b95, b1b95 0.28; mpw1b95 0.31; m06 0.27; m05-2x 0.56; m06-2x 0.54; m08-hx 0.52; m08-so 0.57 | sum over states + the exchange kernel at the functional's ax; ring currents within 2–5 % of the NMR job (validated B3LYP and PBE0; the other members by their ax only) | detected from the .fchk header, the Gaussian route, the ORCA output, the Turbomole control or the GAMESS log; or --nmr-kernel b3lyp, --nmr-kernel pbe0, … |
| Range-separated hybrids | cam-b3lyp 0.19; lc-blyp, lc-pbe, lc-wpbe, lc-whpbe, wb97 0; wb97x 0.158; wb97x-d 0.222 (Gaussian wB97XD); wb97x-d3 0.196 (ORCA); wb97x-v, wb97x-d3bj, wb97x-d4 0.167; wb97m-v, wb97m-d3bj, wb97m-d4 0.15; hse06, hse03, mn12-sx, n12-sx 0.25; lrc-wpbeh 0.20; m11 0.428 (short-range fractions) | the kernel with the short-range fraction only; the long-range exact exchange is not represented (WARNING); not validated | detected as above, or --nmr-kernel cam-b3lyp, … |
| Double hybrids | b2plyp 0.53; b2gp-plyp 0.65; b2k-plyp 0.72; b2t-plyp 0.60; mpw2plyp 0.55; pwpb95, pbe0-dh 0.50; dsd-blyp 0.71; dsd-pbep86 0.69; dsd-pbeb95 0.66; pbe-qidh 0.69; pbe0-2 0.79 | the kernel with the hybrid part only; the MP2 part of the response is not represented (WARNING); not validated | --nmr-kernel b2plyp, … |
| Method not identified or not in the table | any other name given explicitly is refused with a pointer to --nmr-kernel @list | the default DFT kernel, ax = 0.20 (B3LYP-like), announced under the first NMR table | automatic; --nmr-kernel dft asks for it explicitly |
| Explicit fraction | — | the kernel at the number given; a_x,y also scales the kernel (research, the validated scale is y = 1) | --nmr-kernel 0.30 |
Approximate NICS from the GFN2-xTB lane (geometry input). With a geometry file as input (.xyz, .mol/.sdf, .mol2, .pdb or a built-in @model) any --nics* option, or --table nmr together with one of them, makes runEDDB compute NICS from its own GFN2-xTB wavefunction, with the full EDLBG / EDDBG partition, the trans | rot split, -a/-s, the NOBD- and MO-resolved files, the frontier-orbital tables, NICS scans and the equivalent loop current, at the cost of a few seconds:
$ runEDDB -i @arenes/benzene --nics-rings 6 --nics-scan 4,0.25 -v $ runEDDB -i pyrrole.xyz --nics-rings 5 -a --table nmr-homo
The GFN2-xTB Hamiltonian has no exact exchange and its electrostatics depend on populations only, so an imaginary (antisymmetric) change of the density changes nothing in the Hamiltonian: the magnetic linear response of the model is uncoupled and is obtained exactly as a sum over states of the converged tight-binding orbitals for the angular-momentum and linear-momentum perturbations (spin-polarized runs: per spin, then summed). These two response densities feed the ipsocentric CTOCD-DZ lane unchanged, so every table looks exactly like the one produced from a Gaussian NMR=CSGT log. This is London’s tight-binding ring-current theory with all valence electrons, the ipsocentric gauge and the EDLB/EDDB partition on top.
What is and what is not computed. The GFN2 basis is a minimal valence basis without core electrons. It carries the translationally allowed valence π → π* excitations that make the ring current, but not the Larmor circulation around the nuclei that dominates nuclear shieldings. Nuclear shieldings and chemical shifts are therefore not computed: the nuclei are not probed, no nuclei table and no .nmrref are written, and --nmr-ref, --nmr-log and --nmr-xdens are rejected with an error, as is a run without any --nics* probe. A NOTE above the NICS table repeats this. Meaningful are the NICS values at ring centroids, NICS(±1), NICSzz, scans and points away from the nuclei, their signs (4n+2 diatropic, 4n paratropic), their partition and their trends along a series.
Magnitude and the sum-rule scaling. The uncoupled minimal-basis response is too small in absolute terms: for benzene NICS(1)zz is −17.3 ppm against −29.7 at B3LYP/def2-TZVPP (CTOCD-DZ), and paratropic 4n rings come out too paratropic (cyclobutadiene NICS(1)zz +115 ppm). On a 35-molecule set with B3LYP-D3(BJ)/def2-TZVPP geometries and CSGT references the ratio between the reference and the tight-binding EDDB loop current factorises as k = kcoup × krest: kcoup = 1.23–1.37 is the response coupling that the hybrid functional has and GFN2 lacks by construction (recovered by --xtb-coupled, below), and krest = 1.1–1.2 for hydrocarbon, azine, borazine and thiophene rings is the residual Hamiltonian/basis deficit; rings with a π-donor N–H or O (pyrrole, furan, imidazole, oxazole, …) have krest = 1.4–1.6 and 4n rings krest = 0.3–0.6 (their GFN2 gaps are too small). runEDDB also measures the basis part directly: under -v the translational sum rule is printed (detail block and diagnostics file) as a tensor, Sab = Tr[D(pa)∂b]/N (1 = complete basis), as its principal values and, for every ring, as the in-plane average S∥ and the normal component. The in-plane momentum responses carry the zz ring current, so dividing a ring-current quantity by S∥ corrects for the basis:
Coupled tight-binding response (--xtb-coupled [a_x]). For a purely imaginary perturbation only exact exchange couples the first-order density (Coulomb and local exchange–correlation kernels vanish on an antisymmetric density change), so the coupled response of a hybrid functional differs from its uncoupled sum over states by an exchange term alone. --xtb-coupled adds that term to the GFN2 lane in the zero-differential-overlap form of Grimme’s simplified Tamm–Dancoff approach (sTDA): the sum over states is iterated with Xeff = X + cx K[D], K[D]μν = γ(Aμ,Bν) Dμν in the Löwdin basis, with the Ohno–Klopman kernel γ = (R2 + ηAB−2)−1/2 built from the GFN2 atomic hardnesses (no new atomic parameters) and scaled by one number ax. The bare flag uses ax = 0.20, the exact-exchange fraction of B3LYP, which is also what a least-squares fit on the 16 neutral six-membered rings of the set gives (0.22, the same value as a fit on all rings): with it the EDDB loop current of those rings agrees with B3LYP/def2-TZVPP within 7 % and NICS(1)zz within 3 ppm without any scaling, and the coupling ratios of every aromatic ring (1.23–1.37) are reproduced. Two limits are printed by the program: rings with a π-donor N–H or O are tagged [pi-donor N-H/O] in the ring list of the NICS table (and listed in the -v detail block) (their current stays ~1.5× too small, coupled or not; this is the GFN2 Hamiltonian, which puts the π* orbitals too much on the heteroatom), and for 4n rings the coupling map becomes unstable at ax = 0.2 (the tight-binding gaps are too small), in which case a WARNING is printed and the uncoupled response is used; ax ≈ 0.1 reproduces their B3LYP amplification. Under -v the stage reports ax, the kernel, the number of iterations, the spectral-radius estimate of the coupling map and the amplification of the p and L responses. --xtb-uncoupled restores the default uncoupled lane. The empirical factor of 1.6 remains the better single number for screening because it absorbs the Hamiltonian deficit uniformly; the coupled model is the physical one and shows where that deficit sits.
Limitations of xTB-NICS — read before using the numbers. Validated on 35 molecules against B3LYP-D3(BJ)/def2-TZVPP (CSGT) at the same geometries:
Notes. The response is built in a stage of its own (Building the uncoupled GFN2-xTB magnetic response (L, p); -v reports the number of occupied–virtual pairs and the smallest gap). Fermi smearing and open shells (--xtb-spin, --xyz-mult) are handled through the occupation numbers of each spin block; near-degenerate open-shell pairs produce a strong paramagnetic response, as they should in an uncoupled model. The other column is empty in this lane (no core or Rydberg NAOs in the GFN2 basis). -b nao and -b nvb coincide here. The lane is selected by the input type; --xtb-coupled / --xtb-uncoupled choose the response (the stage line reads coupled or uncoupled accordingly).
ICSS shielding maps (--export-cube icss, icss-edlb, icss-eddb). ICSS (iso-chemical-shielding surfaces, Klod and Kleinpeter 2001) put the NICS probe on every point of a 3D grid: the cube holds the isotropic shielding σiso(r) in ppm that a ghost nucleus at r would see, visualised as isosurfaces (e.g. +5, +2, +1, +0.5, −0.5, −1 ppm) or as a colour-coded plane 1 Å above a ring. The sign is the shielding sign of the ICSS literature: positive = shielded (inside the cone of an aromatic ring), negative = deshielded (the in-plane region outside the ring); NICS at that point is −σiso. runEDDB adds what no other program has: the same partition as the NICS tables, point by point — icss-edlb is the map of the localized electrons (EDLBG), icss-eddb that of the delocalized ones (EDDBG), and at every point σiso = EDLBG + EDDBG + other (core and Rydberg outside the analysis block; zero in -b nao). Under -a / -s the EDDBG map is that of the selected NOBDs (e.g. the π system alone). The three maps are computed in one pass, so requesting all of them costs the same as one.
Lanes, cost and grid. The maps come from the same response densities and integrals as the tables, so they exist for every lane: GIAO files, Gaussian CSGT logs (CTOCD-DZ), a wavefunction file without NMR data (the approximate --nmr-kernel lane) and a geometry file (GFN2-xTB). Approximate lanes say so in the stage line and in the first line of the cube; in the xTB lane, which has no core electrons, points within 1 Å of a nucleus are set to zero. The grid is the cube grid of --export-cube (-c, --cube-ref, scope), but with Kleinpeter’s lattice as the default instead of ~1003 points: an exact 0.5 Å step on every axis (an odd number of nodes, so the box centre — the ring centre of a symmetric molecule — is a node; -c N switches back to ~N3 points) and a box margin of 10 Å around the atoms instead of 3.2 Å (--cube-margin R changes it): the values at a grid point are the shielding integrals contracted once per primitive pair of the basis, so the cost grows with the square of the basis size and linearly with the number of points and is shared by all cores (-n). Benzene/6-31G takes seconds, a 24-atom def2-TZVP molecule about a minute on 16 cores at -c 30 and a few minutes at -c 50; the values do not depend on the number of threads. Under -v the stage lists the grid, the lane, the partition, the numbers of shell and primitive pairs after screening, a progress bar and the range of the map.
Tensor component (--icss-axis). The isotropic maps are Kleinpeter’s ICSS; ring currents are read more sharply from the component of the shielding tensor along the ring normal (the NICSzz analogue, field and probe along n). --icss-axis z (or x, y) adds the maps of σzz for a frame axis, --icss-axis ring N takes the normal of NICS ring N (from --nics-rings / --nics-ring) and --icss-axis 0.3,0.4,0.87 any direction; the files are named <stem>.ICSS_zz.cube, <stem>.ICSS_zz_EDLB_G.cube, … (ICSS_nn for a ring normal or a vector) and the isotropic maps are written as well, from the same pass. At a ring probe of the tables the ICSS_nn value equals the NICSzz row (sign reversed). For benzene the σzz cone is about three times deeper than the isotropic one (29.3 vs 11.1 ppm at 1 Å, B3LYP/6-311G(d,p)), its +0.5 ppm surface reaches 8.5 Å and its 0.1 ppm surfaces extend beyond the 10 Å box; the delocalized electrons carry 25.0 of the 29.3 ppm at 1 Å.
Long passes (--icss-checkpoint). A 3D map of a large molecule in a big basis can take hours. With --icss-checkpoint [MIN] the partial sums of the pass are saved every MIN minutes (default 10) to <stem>.ICSS*.tmp; a run started again with the same command finds the file, checks that it belongs to the same pass (grid, lane, components, memory blocks) and continues from the saved point — the stage line says so — and the result is identical to that of an uninterrupted pass, because every grid row is accumulated in a fixed order. The file is removed when the pass completes; a file that does not match the pass is ignored. The 2D maps of --export-map take seconds and have no checkpoint.
2D maps (--export-map). The classic ICSS picture is a colour-coded plane 1 Å above the ring; --export-map icss,icss-edlb,icss-eddb writes exactly that, on a 2D lattice (0.25 Å step by default, --map-step) in the plane given by --map-plane: ring N[,h] (h Å above NICS ring N along its normal), fit[,h] (the best-fit plane of the heavy atoms of the scope, the default with h = 1.0), atoms i,j,k[,h] (through three atoms) or x=V / y=V / z=V (a frame plane, h = 0). The density tokens ed, eddb, edlb, bdf put the corresponding density slice on the same lattice (e.g. the EDDBG density above the ring next to the EDDBG shielding it produces). Density slices are averaged over a slab by default. A density read at one height misrepresents heteroatoms: the 2p functions of N and O are more contracted than those of C, so their π density peaks closer to the plane and decays faster. In pyrrole, furan and pyridine (B3LYP/def2-TZVPP) the EDDBG density above N or O exceeds that above C below 1 Å, matches it at 1.0–1.1 Å and falls below it from 1.25 Å on (furan O at 1.5 Å: 30 % less than C), although the EDDB populations of N and O are the largest in the ring. The mean of five planes between 0.5 and 1.5 Å restores the population ordering and ratios (pyridine N/C 1.25–1.36 vs. 1.25–1.37 from the populations), so this slab is the default of the density tokens; --map-slab h1,h2[,n] sets another slab, --map-slab none or an explicit height in --map-plane gives a single plane, and the ICSS maps stay single-plane (Kleinpeter’s convention) unless --map-slab is given. The file header records the slab. A 2D map costs seconds (104 nodes) and is not restricted to planar molecules: the plane is defined locally and the map is a section through the 3D field. The files are plain text (.map.dat, see §5) for gnuplot or matplotlib; --icss-axis adds the nn maps from the same pass, and the value at the plane origin of a ring map equals the corresponding NICS row of the table with the sign reversed (benzene RHF/6-31G: 11.961 = −NICS(1), 28.972 = −NICS(1)zz).
Reading the maps. The values near the nuclei are the nuclear shieldings (tens to hundreds of ppm) and dominate any automatic colour scale: set the isosurface levels or the colour range by hand (±0.5 to ±5 ppm is the usual window). At a NICS probe of the tables the cube value is identical to the table value (same integrals, same partition), so the tables remain the reference for numbers and the maps show where in space the shielding of each domain comes from. As with the NICS tables, the map is a magnetic response, not a measure of delocalization: a strong EDDBG cone above a ring shows that the delocalized electrons carry the ring current there, and the EDLBG map shows the local (Larmor and σ-bond) shielding that every molecule has.
Validation against the ICSS literature (benzene). Kleinpeter’s protocol places ghost atoms on a lattice from −10 to +10 Å with a 0.5 Å step (68,921 NICS points, GIAO at B3LYP/6-311G(d,p) on B3LYP/6-311G(d,p) geometries) and characterises a ring current by how far a given iso-chemical-shielding surface reaches from the ring centre. The table gives the reach (Å) of the shielding surfaces along the ring normal and of the −0.1 ppm deshielding surface in the ring plane along the C–H direction, read from runEDDB cubes on the same 413 lattice (--cube-ref with a ±10 Å template grid) by trilinear interpolation of the icss map; the literature values are those quoted by Kleinpeter for benzene as the standard aromatic compound.
| Benzene, level of theory | +5 ppm | +2 ppm | +1 ppm | +0.5 ppm | +0.1 ppm | −0.1 ppm, in plane |
|---|---|---|---|---|---|---|
| B3LYP/6-311G(d,p)//B3LYP/6-311G(d,p), GIAO (Kleinpeter’s protocol) | 2.04 | 3.01 | 3.92 | 5.02 | 8.77 | 7.16 |
| B3LYP/6-311+G(d,p), GIAO | 1.98 | 3.00 | 3.92 | 5.01 | 8.75 | 7.12 |
| HF/6-31G(d), GIAO (the 2001 ICSS paper level) | 2.11 | 3.07 | 3.97 | 5.10 | 8.90 | 7.27 |
| Kleinpeter et al., literature | 2.1a | — | — | 5.1 | 8.9 | — |
a Kleinpeter reports that the +5 ppm surface of benzene “never exceeds 4.2 Å”, i.e. 2.1 Å above and below the ring; the +0.5 and +0.1 ppm values (5.1 and 8.9 Å) are from his 2024 papers (see §11).
Three checks are worth knowing. (i) At every lattice node the cube value is the NICS table value: the --nics-scan and --nics probes placed on the nodes agree with the map to 10−12 ppm (same integrals, same partition, only the order of summation differs). (ii) The reach of a surface depends on the grid step only through the interpolation between nodes: 1.0, 0.5 and 0.25 Å lattices (213, 413, 813 points) move the values above by at most 0.05 Å, so Kleinpeter’s 0.5 Å step is sufficient; the 813 benzene map at B3LYP/6-311+G(d,p) took 3.7 minutes on 16 cores. (iii) The 0.1 ppm surfaces lie 7–9 Å from the ring centre, which is why the ICSS maps use a 10 Å box margin by default (the 3.2 Å margin of the density cubes would cut them off): the default grid (--export-cube icss, no -c, no --cube-margin) is exactly this lattice with the molecule’s bounding box plus 10 Å (benzene: 51×51×43 nodes, 70 s on 16 cores with the σzz maps included) and reproduces the table above (2.04 / 3.01 / 3.92 / 5.02 / 8.77 Å for the B3LYP/6-311G(d,p) map); --cube-margin R widens or narrows the box, and --cube-ref clones any lattice. The partition adds what the literature maps cannot show: on the ring axis the delocalized electrons carry essentially the whole shielding cone (EDDBG 20.9 of 8.9 ppm at the centre and 10.5 of 11.1 ppm at 1 Å in the B3LYP/6-311G(d,p) map, the localized part being negative at the centre), while far from the ring the EDLBG and EDDBG contributions become comparable (0.74 and 0.15 ppm at 5 Å in the HF map) and the in-plane deshielding belt is a joint effect of both.
References: GIAO — Wolinski, Hinton, Pulay (1990); the NCS-type partition idea — Bohmann, Weinhold, Farrar (1997); NICS — Schleyer et al. (1996); ICSS maps — Klod and Kleinpeter (2001); CTOCD-DZ — Lazzeretti, Malagoli, Zanasi (1994); the ipsocentric selection rules — Steiner and Fowler (2001); CSGT response densities — Keith and Bader (1993); the exchange kernel of --xtb-coupled — Grimme (2013), Grimme and Bannwarth (2016). See §11; --cite adds them automatically to any run that uses --table nmr.
Analysis tables are printed only when requested with --table — no tables appear by default (the default view is the stage messages plus the EDDB summary block). All requested tables are collected into one captioned > Printing analysis details: section, printed just before the summary in the order mo → no → bo → nobd → ao → subshell → shell → npa: --table mo adds the per-MO ED / EDLB / EDDB table (when canonical MOs are present), --table no the NO table, --table bo the bond-order orbitals (aliases boo/nba), --table nobd the NOBD table, --table ao the per-orbital (atomic-orbital) population table, --table subshell the subshell-resolution population table, --table shell the shell-resolution population table, --table npa the condensed-atomic table (led by the natural charge), and --table all every table. The orbital-based tables (MO / NO / BOO) print before the NOBD-driven dissection; ao / subshell / shell / npa print after it. --verbose adds per-stage detail (and, under it, the per-stage Papers to be cited (DOI): lists) but not tables; -q (true-quiet) suppresses stage messages and timings too — only the banner, the EDDB summary block, and the two bookend stage lines around it are emitted.
NOBD-resolution table: appears with --table nobd (also shown by -s used without a list, so you can pick NOBD indices for a follow-up run). Each row is one NOBD (Natural Orbital for Bond Delocalization):
Per-MO decomposition (MO): appears with --table mo, when the input carries canonical molecular orbitals (HF / DFT references; rejected for densities with no MOs). One row per MO — its energy and occupation, and its contribution decomposed into ED (total), EDLB (localized) and EDDB (delocalized) — so you can read off which orbitals carry the delocalized density (e.g. the ring-current-active π set). Printed before the dissection, so the numbers reflect the full, undissected density.
Bond-order orbitals (BOO): appears with --table bo (aliases --table boo / --table nba; orbitals exportable with --export-fchk bo). Each row is one atom pair, whose (Wiberg) bond order is resolved into orthonormal bond-order orbitals — the natural orbitals of that single bond. The columns give the Index of the pair’s first BOO (matching the MO numbering in the exported FCHK; the pair’s last BOO is implicit — one below the next row’s Index), the atom-index and element pairs joined by ~, the Total bond order WBO (the full Wiberg index, summed over all BOOs), and the twelve largest BOO occupations (σ2) above the listing threshold, each tagged with a σ / π / δ / φ symmetry label (from the two-centre (n·L)2 classifier about the bond axis). Only those are listed, so they need not sum exactly to the Total — the small remaining tail is omitted from the printout and from --export-fchk bo (orbitals with a weight below 10−4 are not exported; the file header says so). The Total itself is the complete trace of the bond-order operator over all components, so it never depends on the listing or export cutoffs; under -v the complete per-pair balance (every component with its coupling eigenvalue and label, the σ/π/δ/φ/other channel sums and the positive/negative/null branch sums) is written to <stem>.NBA_DIAG.csv and <stem>.NBA_MODES.csv. The resolution is spin- and correlation-consistent — identical for restricted / unrestricted and HF / DFT / post-HF densities — and is evaluated in the basis selected by -b. Only with -b nao does the Total equal the full (Mayer / layer-consistent) bond order of the molecule: in the default NVB (or NMB) block the Rydberg NAOs are excluded and, for a correlated density, the quasi-degenerate layers of the BOO construction are built from that block (unlike the BOP layer partition, which is always derived in full NAO — see Post-HF layer basis above; for the bond-order components the difference is a few thousandths), so the absolute Totals come out slightly smaller (benzene C–C: 1.440 in NAO vs 1.418 in NVB at RHF, 1.394 vs 1.371 at MP2). The σ/π resolution that the table is meant for is practically unaffected (the π share of the C–C bond is 0.316 vs 0.312), so the valence-block default is the sensible choice; reach for -b nao only when the exact textbook value of the total bond order matters. For a correlated density whose natural occupations leave the admissible range (relaxed MP2 densities, see the post-HF note in §2) the NBA stage prints a counted WARNING with the violation counts and the input → effective trace, applies no repair and continues; the CSV files carry the same diagnostics in their header.
Large systems — scope the bond-order analysis. Both --table bo and --export-fchk bo honour the analysis scope: they resolve BOOs only for the atom pairs in the active --fragment / --pathway / --ring-detect selection, using the same connectivity that drives the EDDB. On a large molecule, prefer one of these scopes over --global: a global run diagonalises a bond-order operator for every connected pair in the structure, which is rarely what you want when you are studying one bond, ring or fragment. Scoping also keeps the exported <stem>.BO.fchk small — it contains only the selected pairs’ BOOs (each still expanded in the full AO basis, so the file stays a valid “partial MO set” that most FCHK viewers accept), making it ideal for inspecting the bonding pattern of a specific fragment.
Orbital-resolution table (AO): appears with --table ao. One row per NAO in the active -b subset. The columns are: Index (the orbital number — it matches the MO index in the --export-fchk ao FCHK 1:1, so the table doubles as a navigation key in Avogadro2 / IQmol / GaussView), the NAO label (its angular type, e.g. 2s, 2p — the header carries the basis name NAO / NMB / NVB) and its Atom, then the orbital’s total electron population ED and its delocalized part EDDB (both tagged with the scope suffix _G / _F / _P / _R). Each of ED and EDDB has α and β sub-columns for open-shell inputs; for a closed-shell (restricted) reference these are not defined and print a centred dash (–).
Subshell-resolution table (SUBSHELL): appears with --table subshell — the intermediate resolution between ao and npa, new in Aug 2026 (until mid-Aug 2026 this table answered to --table shell, which now prints the coarser shell-resolution table below). One row per subshell (atom, n, L): the ED / EDDB populations (and their α / β sub-columns for open-shell inputs) are the sums over the 2L+1 magnetic components of the corresponding AO-table rows — e.g. the 2p row is 2p1 + 2p2 + 2p3. The summation is keyed by the NAO quantum labels, never by table position, so it is correct for any AO display ordering (the .49 lane and the different --nao-algorithm constructors order the AO rows differently). Rows print in canonical order — atom by atom, ascending n, then L (1s, 2s, 2p, 3s, 3p, 3d, …); there is no Index column (subshell rows do not map to AO / FCHK orbital indices — use the ao table for that). Works for every -b subset; with --nao-algorithm cc-layers the rows directly display the frozen shell-layer hierarchy.
Shell-resolution table (SHELL): appears with --table shell — the coarsest orbital-resolved view, new in Aug 2026. One row per principal shell (atom, n): the ED / EDDB populations (and α / β sub-columns for open-shell inputs) are the sums over all L of the subshell rows — e.g. shell 2 is 2s + 2p. Shells are labelled by the plain principal number 1, 2, 3, … (no spectroscopic K / L / M letters: those end at n = 8, while decontracted bases reach far higher n, and custom sets may lack the highest-L members). Because the NAO Rydberg populations fall roughly an order of magnitude per shell, this table exposes the Rydberg population ladder at a glance — a fast diagnostic of the shell truncation point when selecting compact, shell-structured virtual subspaces (pairs naturally with --nao-algorithm cc-layers, where each row is exactly one frozen layer). Same accumulation and ordering rules as the subshell table.
NO-resolution table: appears with --table no. One row per natural orbital with non-trivial occupation, sorted by descending NOON. Each row reports the NOON itself plus the breakdown of its occupation into Core (Cor), Valence (Val), and Rydberg (Ryd) NAO contributions, with percentages. Row index matches the MO index in the --export-fchk no FCHK 1:1.
Multireference / spin-contamination indices. These are reported in the NO stage’s verbose (-v) detail block — not inside the table — right after the occupation-spectrum summary, each with its source DOI in brackets (run --table no -v to see them):
Condensed-atomic table (NPA): appears with --table npa (the orbital-resolution table is now the separate --table ao token; when both are requested, AO prints just before NPA). Each row leads with the natural atomic charge qN = Zeff(A) − NA, where NA is the full natural electron population on the atom (core + valence + Rydberg) and Zeff is the effective nuclear charge — so the charges are correct, and sum to the molecular charge, even with ECP-replaced cores or the valence-only GFN2-xTB core (computed from the undissected density, so independent of --auto-pi / --select-nobd). The remaining columns give the per-atom total electron population (ED) and electron delocalization (EDDB, the EDDB density integrated over the atom), each tagged with the scope suffix _G / _F / _P / _R. ED and EDDB each carry α and β sub-columns for open-shell inputs; for a closed-shell (restricted) reference these are undefined and print a centred dash (–).
Summary: three population numbers — ED (total electrons in the active subset), EDLB (localized; ED − EDDB), and EDDB (delocalized). For UHF / ROHF the α and β components are reported separately in the orbital and atomic tables.
Cyclic Delocalization Index (CDI): reported only for --pathway runs. CDI equals the smallest per-atom EDDB along the pathway — the maximum population of electrons that can delocalize uniformly around the cycle. CDI ≈ 0.9 per atom is strongly aromatic; CDI ≈ 0 is non- or anti-aromatic.
Closing line and the warning counter: the run terminates with a one-line time-stamp such as > Calculation completed on 2026-MM-DD. Total time: Xs. Whenever any non-fatal warning fired during the run, the closing line is annotated with a parenthetical count: > Calculation completed (with 1 warning!) on 2026-MM-DD. Total time: Xs. The annotation appears even in true-quiet (-q) mode where the warning text itself is suppressed — so a batch user always knows when something needs a closer look. To see the actual warning message, rerun the same command without -q. ECP-related inconsistencies (missing [Pseudo] in molden, Q-Chem GUI=2 quirk in fchk) are fatal errors — they stop the run rather than just counting; see §2 for the recovery steps.
Tested QC programs and formats: validated against .fchk files from Gaussian 16 and Q-Chem 6 (HF / DFT and post-HF), .json and .molden files from ORCA 6 (HF / DFT and post-HF via orca_2json and orca_2mkl), .molden files from Multiwfn-converted wavefunctions, native .tmol bundles from Turbomole, and .gms output files from GAMESS-US (RHF / UHF / ROHF / MCSCF on RUNTYP = ENERGY / OPTIMIZE / SADPOINT). Cross-program agreement on benzene at cc-pVDZ is 4–5 significant figures for both MP2 and CCSD; the WF6 ECP benchmark agrees to ~3 significant figures across Gaussian / ORCA fchk / json / molden at RHF / def2-TZVPP. The built-in GFN2-xTB engine for the .xyz lane is validated against the reference tblite implementation across 81 systems covering 26 elements (H…W) including first / second / third-row transition metals, lanthanides, and main-group hypervalent compounds — final per-atom Mulliken charges agree to ~10−6e at tight SCC convergence, and total energies match Grimme’s reference xtb binary to within ~10−4 Eh.
Supported basis functions. The native lane (.fchk / .json / .molden) supports angular momenta up to k-type (l = 7), covering every standard basis set in routine use including cc-pV6Z. Overlaps are evaluated by direct Gauss-Hermite quadrature (no Obara-Saika recursion), so each shell is treated explicitly. The legacy .49 visualisation lane supports up to h-type (l = 5) only; for cc-pV6Z and similar (i / k functions) please use the matching native input format.
Post-HF density requirements. The QC program must be told to write the relaxed (or linearized) correlated density:
If the correlated block is missing, runEDDB silently falls back to the SCF reference density and the run is (correctly) classified as plain HF/DFT. The Reference type: line in the verbose-mode Stage 1 detail block reports the actual classification.
HLRL — NAO pictures at large basis sets, and a viewer warning. From cc-pVQZ onwards (worse at cc-pV5Z/6Z, def2-QZVPP) the rigorous NAO algorithm stores each NMB orbital as a large, near-cancelling coefficient expansion spread over high-L shells and neighbouring atoms — an inherent property of the NAO method, not a runEDDB artefact (NBO7 produces the same representation). The orbital function remains atom-localised; the fragile representation is the problem. Most molecular viewers evaluate high-L (f/g/h) pure harmonics approximately, which breaks the cancellation and displays the exported raw NAOs as heavily delocalised junk — verified (Jul 2026) in current Avogadro2 and IQMol, while Multiwfn (and exact grid evaluation) render the same files correctly. runEDDB’s fchk conventions are validated against Gaussian-written references. Mitigations, in order of preference: the default frozen-nmb algorithm has no L>3 content by construction — it renders correctly in every viewer and shows the physically polarised orbitals; orbital cubes (--export-cube ao[LIST]) are exact grid evaluations and immune to viewer basis handling for ANY algorithm (and are the only option beyond h functions, where no mainstream viewer reads the fchk at all); --nao-algorithm rigorous/nbo7legacy writes the raw standard coefficients for reproducing the viewer artefact itself. (The former Galerkin display projection of exported standard NAOs is opt-in via --export-lproj — its free-atom-like pictures over-correct by stripping the genuine polarisation tails, so it is no longer applied silently.) See the NAO construction algorithm paragraph in Section 4.
NBO archive (.49) — legacy lane. Population analyses (NOBD / orbital / atomic tables, summary) and all six visualisation outputs work via a parallel NBO-convention pipeline that mirrors the legacy runEDDB_nbo49 writers. The .49 path is provided for legacy compatibility only and will be removed once the native NAO driver completes its acceptance suite; for new projects, please use .fchk / .json / .molden.
Cube grid quality. The default grid (~100³ points) gives integration accuracy within ~1% for most systems. For publication images, use -c 150 or higher. The integrated density and its percentage of the analytical value are printed after each cube export for quality control.
Parallel BOP analysis: use --ncores N to parallelize the BOP step. Speedup is nearly linear for large systems (100+ atoms).
Using every core (-n 0): --ncores 0 (equivalently -n auto) asks runEDDB to detect how many cores it may use and to run on all of them, so the one command adapts itself to whatever machine it lands on — laptop, workstation or node. It behaves identically on Linux, Windows and macOS, and the detected count is echoed right below the banner (Auto-detected N available CPU cores), so every log records the thread count that was actually used. On Linux the number comes from the process’ CPU affinity mask rather than from the machine as a whole, so a batch allocation is honoured: a job given 8 cores of a 128-core node through SLURM / taskset resolves -n 0 to 8, not to 128.
NOTE — more cores is not always faster. -n 0 is deliberately literal: it takes every core it is allowed to use, which is what you want on a desktop, a laptop or a single-socket server, but is rarely what you want on a large many-core machine. The dense linear algebra that dominates the NAO/BOP stages stops scaling after a few tens of threads, and past that point the extra threads spend their time synchronising instead of computing — a cost that grows sharply on dual- or multi-socket systems, where threads on one socket must reach across the interconnect for memory attached to the other. The effect is not subtle: on a dual-socket 128-core EPYC, a large-basis (aug-cc-pV5Z) benchmark took 2.2 s with -n 8 and 41 s with -n 0 — roughly 20× slower while burning 75 CPU-minutes instead of 16 CPU-seconds. As a rule of thumb: use -n 0 on laptops, desktops and single-socket servers; on big multi-socket nodes set an explicit -n 8–32 (and, if the node is shared, confine the job with numactl / taskset so that -n 0 follows the affinity mask — but see the NUMA note below before confining it to a single socket for speed, which is counter-productive). Cube-grid evaluation is the exception — it parallelises almost perfectly, so grid-dominated jobs do benefit from high core counts. When in doubt, time a short run at a few settings rather than assuming.
Large NUMA machines — interleave memory only when the job spans several nodes. Linux places each memory page on the NUMA node of whichever thread first touches it, which for runEDDB is the input-parsing stage. That default is ideal as long as the worker threads stay on that same node, and harmful once they do not: the large matrices stay concentrated on one node while every thread elsewhere reaches for them across the interconnect. Which regime you are in depends on how -n compares with the cores per NUMA node (numactl --hardware).
Measured on a dual-socket AMD EPYC 9554 (128 cores, 8 NUMA nodes of 16 cores, SMT off):
So: leave the default alone when -n is at or below the cores per node, and add --interleave=all when you deliberately spread a big job across nodes. Note also that binding a large job to a single socket for speed is counter-productive — the workload is limited by memory bandwidth, and one socket has half the memory controllers.
GFN2-xTB on multiple cores: for the .xyz lane, --ncores N also parallelizes the GFN2-xTB SCC itself (the heaviest step for large molecules). The engine auto-sizes its thread pools to the cores you request, so requesting more cores than the job can use no longer wastes CPU. As a rule of thumb, the GFN2-xTB SCC keeps speeding up to roughly --ncores 16–32 on a few-hundred-atom system; beyond that the gains taper off (it is dominated by linear-algebra steps that do not scale indefinitely). For small molecules, --ncores 1–4 is plenty.
Analysis basis subset: the default -b nvb (Val-only) is the fastest option, since the BOP cycle scales with the number of NAOs in the working basis. -b nmb (Cor + Val) costs only marginally more (~10–30% depending on element). -b nao (Cor + Val + Ryd) is significantly slower at large basis sets — use it for completeness checks rather than routine analysis.
Cube grid sizing: the default --cube-size 100 (~1M points) is fine for routine work; for publication-quality figures and large systems we recommend at least 150. Grid evaluation can be demanding but parallelizes perfectly, so use as many cores as you can (--ncores / -n).
If you use runEDDB in your research, please consider to cite the following works:
Tip — let runEDDB pick the references for you. Add --cite both to any run to write the exact, de-duplicated set of papers for that run to <stem>.bib (BibTeX) and <stem>.refs.txt (plain list). The set is method- and option-dependent: the NAO / NPA (Reed et al.), BOP and core EDDB papers always; the NOBD paper with -s / -a; the EDDBP (-p / -r) or EDDBF (-f) paper; the AO-resolved EDDB paper with --table / --export-fchk ao; the Bond-Delocalization-Field paper for a bdf / dbdf cube; the frozen-NMB NAO paper (in preparation) whenever the default --nao-algorithm frozen-nmb is active; and, for the .xyz lane, GFN2-xTB + DFT-D4 (spGFN2-xTB on spin-polarised runs). Add -v to also see them on screen, grouped by analysis stage. The runEDDB-method catalogue follows (the NAO / NPA reference is Reed, Weinstock, Weinhold, J. Chem. Phys. 83, 735−746, 1985, DOI 10.1063/1.449486; GFN2-xTB / DFT-D4 are listed under it).
The electron density of delocalized bonds (EDDB) as a measure of local and global aromaticity
When you analyse a plain .xyz geometry through the built-in GFN2-xTB lane, the underlying electronic-structure method is not ours — it is the work of Grimme and co-workers. Please also cite the relevant original method papers:
When you use --table nmr / --nics*, please also cite the methods behind the magnetic response and its partition:
runEDDB’s GFN2-xTB lane implements the GFN2-xTB and DFT-D4 methods described above and is validated against Grimme’s reference implementation. Portions of it are derived from the corresponding open-source reference code — dftd4 and tblite (LGPL-3.0-or-later) and mctc-lib (Apache-2.0) — and are used and redistributed under those licenses. See the THIRD-PARTY-LICENSES.txt file included with the program for full attributions and license texts.
Author and main contributor: dr hab. Dariusz W. Szczepanik, prof. UJ
Contributors: mgr Pawel A. Wieczorkiewicz, dr Ouissam El Bakouri.
Project e-mail: runeddb@gmail.com