I ran a TD-DFT calculation on a platinum complex, fed the log file to ELOTE, and got only half an answer. The molecular orbital composition table printed just fine, every orbital with its atomic percentages. But the excited-state analysis, the whole point of the exercise, came back empty. The CSV had a header and nothing underneath. No transitions, no MLCT/LMCT labels, no summary table. Nothing. The calculation was perfectly healthy. So what was going on?

If you’ve only ever run closed-shell TD-DFT, you’re used to seeing excited states written like this:

 Excited State   1:  Singlet-A   2.14 eV  580 nm  f=0.0198
      150 ->151         0.51251
      150 ->152        -0.30648

Orbitals are labeled by clean integers, a right pointing arrow ->, and the CI coefficient. That’s what ELOTE was built to read. But my platinum system was an open-shell calculation and therefore an unrestricted one, with unpaired electrons. Gaussian writes those excited states differently:

 Excited State   1:  5.013-A   0.2171 eV  5709 nm  f=0.0000  <S**2>=6.033
      48B -> 50B        0.67064
      43B <- 50B       -0.17577

In these calculations the orbital number now specifies if it belongs to the alpha (A) or beta (B) manifold, in other words, it now bears a spin label: 48B, 50B. Second, there’s a backwards arrow, <-, mixed in with the forward ones, indicating de-excitations (vide infra)

Both of those broke the parser silently. ELOTE couldn’t handle the spin label of the orbital (it expected just a number), so it quietly recorded zero transitions for every single state. Hence the empty tables. No error, no complaint, nothing, which is the most confusing kind of bug. (Sorry about that.)

Since orbital 48A isn’t the same as 48B, it isn’t enough to strip the letter and move on — ELOTE has to keep the alpha and beta orbitals in separate bookkeeping, label them separately (you’ll now see HOMO(B), LUMO(B) and so on), and then decide the metal-versus-ligand character of each transition using the correct spin’s orbital. A beta HOMO and an alpha HOMO can have genuinely different atomic compositions, and conflating them would hand you a wrong assignment while looking perfectly confident about it.

With the parser taught to read both manifolds, my platinum spectrum came apart cleanly. The lowest excited state, for instance, turns out to be predominantly a beta HOMO-1 → LUMO transition with roughly 38% weight, dressed with a handful of smaller ligand-to-metal and intraligand contributions, and everything sums to a tidy 100%. Exactly the kind of table you’d want to drop into a manuscript.

If you’re running open-shell systems, you don’t have to do anything differently. ELOTE detects the unrestricted output on its own and prints a short note letting you know it’s in that mode:

Unrestricted (open-shell) calculation detected: alpha (A) and beta (B)
orbital manifolds are labeled separately.

WARNING

The orbital labels then carry their spin — HOMO(B), LUMO+2(A) — so there’s never any ambiguity about which manifold a transition belongs to. Closed-shell calculations behave exactly as before; nothing changed for them.

A word of caution that has nothing to do with ELOTE and everything to do with chemistry. My test system had an <S**2> value of about 6, which is high — a sign of significant spin contamination. ELOTE will faithfully decompose whatever excited states Gaussian hands it, but if the underlying wavefunction is badly contaminated, the states themselves deserve a skeptical eye before you build a story on them. The tool does the bookkeeping honestly; judging whether the numbers mean something is still your job. As it should be.

The update is live on GitHub, and if you’d found this the hard way like I did, I hope this saved you an afternoon.

As always — questions and comments welcome below.


A Note for Novice TD-DFT users:

In a restricted (closed-shell) calculation, every spatial orbital holds two electrons, one spin-up and one spin-down, and they share the same shape. There is one set of orbitals, and one HOMO, and one LUMO. Simple.

In an unrestricted (open-shell) calculation — the kind you need whenever you have unpaired electrons — spin-up (α) and spin-down (β) electrons are allowed to occupy different spatial orbitals. So Gaussian keeps two separate sets of orbitals: an alpha manifold and a beta manifold, each with its own numbering, its own HOMO, its own LUMO. The B suffix is simply telling you which manifold a given orbital lives in. 48B is the 48th beta orbital, and it is not the same object as 48A.

The backward arrow, <-, is the other subtlety. It’s a de-excitation contribution, a small term that the linear-response formalism includes alongside the main excitations. For the purpose of assigning character, the physically sensible thing is to read it as donor and acceptor swapped, so ELOTE now flips it and treats it consistently.


Cite ELOTE: 10.5281/zenodo.21799957 (Zenodo DOI) · Repository: github.com/joaquinbarroso/ELOTE