Avogadro 2 has an integrated QTAIM (Bader) analysis. I'm working to modernize it (and remove the GPLv2 code)

For Avogadro 2.2 we plan to read and render QTAIM results computed byother programs, such as Multiwfn, critic2, Horton or your own Python scripts:critical points, bond paths, and atomic basin properties. Avogadro's ownQTAIM analysis will write the same keys later.

So the idea is to create a set of CJSON property keys -- any tool that writes CJSON can supply them and see them rendered (e.g. bond paths). I'll also make a plugin for critic2 and Multiwfn analysis

Critical points (molecule level)

| Key | Shape | Meaning ||---|---|---|| qtaimCriticalPoints | N×3 | Positions (Å) || qtaimCriticalPointSignatures | N×1 | −3 nuclear (or non-nuclear attractor), −1 bond, +1 ring, +3 cage || qtaimCriticalPointAtoms | N×2 | Nuclear CP: [atom, −1]. Bond CP: the two atoms its bond path joins. Otherwise [−1, >| qtaimDensity | N×1 | ρ || qtaimGradientNorm | N×1 | \|∇ρ\| (a convergence check) || qtaimLaplacian | N×1 | ∇²ρ || qtaimHessianEigenvalues | N×3 | λ₁ ≤ λ₂ ≤ λ₃ || qtaimHessianEigenvectors | N×9 | Optional: the eigenvectors e₁, e₂, e₃ in the same order as the eigenvalues, each a>| qtaimEllipticity | N×1 | λ₁/λ₂ − 1. Only meaningful at bond CPs; write 0 elsewhere || qtaimKineticEnergyDensityG | N×1 | G, the Lagrangian (positive-definite) kinetic energy density || qtaimKineticEnergyDensityK | N×1 | K, the Hamiltonian kinetic energy density, with K − G = −¼∇²ρ || qtaimPotentialEnergyDensity | N×1 | V = ¼∇²ρ − 2G || qtaimEnergyDensity | N×1 | H = G + V |

Gradient paths (molecule level)

CJSON pads ragged arrays with zeros, so the paths are stored as one flatlist of points plus an index table:

| Key | Shape | Meaning ||---|---|---|| qtaimPathPoints | M×3 | All path points (Å), path after path || qtaimPaths | P×4 | Per path: first row in qtaimPathPoints, number of points, index of its CP, kind |

Path kind: 1 = bond path (bond CP to nucleus), 2 = ring path (ring CP tobond CP), 3 = cage path (cage CP to ring CP), 0 = other. A bond path can bewritten either as one polyline from nucleus to nucleus or as two polylinesrunning outward from the bond CP.

Atomic basins (per atom)

| Key | Meaning ||---|---|| partialCharges type "QTAIM" | q(Ω) = Z − N(Ω). Uses the existing partial-charge support, so labels and color-by-c>| qtaimPopulation | N(Ω), electrons || qtaimSpinPopulation | ∫(ρα − ρβ) over the basin (open-shell only) || qtaimVolume | Basin volume inside the isosurface given by qtaimVolumeIsovalue, in ų (most programs print Bohr³; >| qtaimLaplacianIntegral | L(Ω) = −¼∫∇²ρ, which should be close to 0 (a quality check) || qtaimKineticEnergy | K(Ω), Hartree || qtaimAtomicEnergy | E(Ω) = (1 − γ)K(Ω), with γ = −V/T the virial ratio, in Hartree |

Questions for feedback

  1. Naming style. We propose camelCase with a qtaim prefix, matchingexisting molecule keys like totalEnergy and dipoleMoment. Thealternatives are:
    • a dotted namespace (qtaim.criticalPoints), but Avogadro already givesthe atom., bond. and residue. prefixes a special meaning;
    • a nested CJSON object ("qtaim": {"criticalPoints": ...}), which iscleaner JSON but needs a change to the CJSON reader and writer.
  2. qtaim or something more general? Critical points of other fields(ELF, ∇²ρ, the electrostatic potential) have the same structure. Shouldthe prefix be field-neutral, such as topology, with a key saying whichfield was analysed?
  3. Anything missing that your workflow produces and you'd wantdisplayed? For example, delocalization indices, source function, orinteratomic surfaces.


Discuss this on our forum.