ORCA frequency calculation. Computes vibrational frequencies, IR intensities, zero-point energy, and thermochemistry at specified temperature/pressure.
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
ORCA frequency calculation. Computes vibrational frequencies, IR intensities, zero-point energy, and thermochemistry at specified temperature/pressure.
Verify a transition state (exactly one imaginary frequency)
Confirm a minimum (no imaginary frequencies)
Prerequisites
The input structure MUST be optimized at the same level of theory used for the
frequency calculation. Running frequencies on an unoptimized structure will
produce meaningless imaginary frequencies.
Use catgo_workflow (graph-based), NOT catgo_workflow_engine (task-based).
The graph-based tool auto-captures the viewer structure on create and supports
connecting opt→freq via explicit node edges. Task-based add_task doesn't attach
the viewer structure → "No input structure provided". Param keys also differ:
graph-based uses method/basis, task-based uses orca_method/orca_basis.
1. Confirm structure is loaded and find Expanse session_id
catgo_view(action:"get_state")
curl -s http://localhost:8000/api/hpc/connections
Copy the session_id for host: login.expanse.sdsc.edu.
2. Create the workflow (auto-captures viewer structure)
run_config MUST include module_loads, orca_dir, account, partition,
walltime, and the local-scratch SLURM template. Read
server/templates/orca_generic.sh and pass its contents as default_template.
For freq jobs longer than 30 min, bump walltime and switch partition to
shared or compute. The local-scratch template stages I/O to
$TMPDIR/orca_$SLURM_JOB_ID — necessary on Expanse (Lustre kills ORCA's
many-small-file I/O during numerical Hessians).
Pull the outputs into a local directory, including the OPI JSON files:
mkdir -p ./local_run
for f in ORCA.out ORCA.hess ORCA.property.json ORCA.json; do
curl -s -X POST http://localhost:8000/api/hpc/files/read-content \
-H 'Content-Type: application/json' \
-d "{\"session_id\":\"<expanse_session_id>\",\"file_path\":\"<work_dir>/$f\"}" \
> ./local_run/$fdone
Parsed result fields (when fetched via catgo_workflow get_result or the
results-enriched endpoint):
frequencies: list of vibrational frequencies in cm⁻¹
intensities: IR intensities in km/mol
is_imaginary: boolean flags for each frequency
zpe: zero-point energy in eV
thermochemistry: dict with H, S, G at standard conditions
8. Parse with OPI
Replaces the hand-grep'd thermochemistry block. Requires pip install orca-pi.
import sys
sys.path.insert(0, ".claude/skills") # for the _shared helperfrom _shared.orca_opi import parse_local
out = parse_local("./local_run")
# IR table — replaces frequencies + intensities + is_imaginary trio
ir = out.get_ir() # dict[int, IrMode]for mode_idx, mode in ir.items():
print(mode_idx, mode.wavenumber, mode.intensity, mode.dipole)
# Thermochemistry (units: hartree, hartree/K)
thermo = {
"zpe_eh": out.get_zpe(),
"inner_energy_eh": out.get_inner_energy(),
"enthalpy_eh": out.get_enthalpy(),
"entropy_eh_per_K": out.get_entropy(),
"free_energy_eh": out.get_free_energy(),
"G_minus_Eel_eh": out.get_free_energy_delta(),
}
# Imaginary check from the raw frequency list (negatives = imaginary)
freqs = out.results_properties.geometries[0].thermochemistry_energies[0].freq
n_imag = sum(1for f in freqs if f < 0)
print(f"Imaginary modes: {n_imag}")
Viewing the IR spectrum in the IDE
Use the shared helper to plot a stick spectrum and surface the PNG inline.
from _shared.orca_opi import quick_plot_ir, show_png
png = quick_plot_ir(out) # writes ./local_run/ir_spectrum.png
show_png(png, "IR spectrum") # prints ``
After running this, reply to the user with the markdown link the script printed so Claude Code renders the figure inline in chat.
Submission gotchas (real failures we hit)
catgo_workflow_engine.add_task doesn't auto-attach the viewer structure → "No input structure provided".
partition=workq (Shaheen default) is invalid on Expanse → use debug or shared.
Missing account=sdp126 → "Invalid account or account/partition combination".
Missing module_loads + orca_dir → orca not on PATH; numerical Hessians silently produce nothing.
After re-connecting to Expanse, the session_id changes — re-discover via /api/hpc/connections and update default_session_id + cluster_configs key.
Engine doesn't regenerate submit.sh on retry alone — call run with the new run_config to get a fresh script.
Interpreting Results
Minima verification
All frequencies should be real (positive)
Small negative frequencies (<50 cm-1) are numerical noise, usually harmless
Large imaginary frequencies indicate the structure is NOT a minimum
Transition state verification
Exactly ONE imaginary frequency (negative value)
The imaginary mode should correspond to the expected reaction coordinate
Use catgo_view to visualize the mode
Thermochemistry output
ORCA prints a thermochemistry block with:
Quantity
Symbol
Units
Zero-point energy
ZPE
eV (or kcal/mol)
Thermal energy
U
eV
Enthalpy
H = U + pV
eV
Entropy
S
eV/K
Gibbs free energy
G = H - TS
eV
For catalysis, feed the DFT energy and frequencies into gibbs_energy:
phase: "adsorbed" -- harmonic approximation (no translational/rotational)
phase: "gas" -- ideal gas (includes translation, rotation, vibration)
Frequency Scaling Factors
DFT frequencies are systematically overestimated. Common scaling factors:
Method
Scaling factor
B3LYP/def2-SVP
0.9813
B3LYP/def2-TZVP
0.9654
PBE/def2-SVP
0.9948
HF-3c
0.86
These are applied automatically by the gibbs_energy task when available.
Common Mistakes
Running freq on unoptimized geometry (will show spurious imaginary modes)
Using different method/basis for opt and freq (inconsistent PES)
Ignoring imaginary frequencies and proceeding with thermochemistry
Not using TightOpt for the preceding optimization (loose opt can leave
residual forces that appear as small imaginary frequencies)
Canonical params (what the engine actually reads)
Parameter
Default
Description
method
B3LYP
DFT functional
basis
def2-SVP
Basis set
charge / multiplicity
0 / 1
Charge and 2S+1
dispersion
(none)
D4 | D3BJ | D3 | none. Use this field, NOT extra_keywords.
grid
DefGrid2
DefGrid1/2/3
wavefunction, uno, uco
—
Open-shell tweaks
num_cores / max_core_mb
4 / 4000
%pal nprocs / %maxcore
⚠️ extra_keywords and extra_blocks are NOT read by the engine. Forcing NumFreq, adding CPCM(Water), etc. via those keys silently does nothing. These are current node-def gaps for freq.
ORCA-Specific Notes
ORCA uses analytical frequencies when available, numerical otherwise
For large molecules (>100 atoms), frequencies become very expensive
ORCA output lists frequencies as negative values for imaginary modes
(not "i" notation)
Forcing NumFreq is currently a gap — analytical Hessians are used by default for whatever functional supports them