irc (intrinsic reaction coordinate)¶
irc traces the intrinsic reaction coordinate (IRC) from an optimized transition state (TS) in both directions with EulerPC (an Euler predictor–corrector integrator). It writes the trajectory of each branch and the two endpoint candidates. Optimizing those endpoints with opt shows which reactant (R) and product (P) the TS connects.
What it is for¶
Checking a TS: confirm that the TS from
tsoptconnects the intended R and P.Getting R and P: optimize the endpoints with
optto obtain the R and P structures of this TS.Rerunning the IRC step of
all: trace the IRC of anallrun again on its own, with different settings.
The default backend is UMA, Meta’s pretrained machine-learning interatomic potential (MLIP); -b/--backend also selects ORB, MACE, AIMNet2, or DFT.
Examples¶
1. Both branches¶
Trace both directions from the TS, and write a summary with --out-json.
pdb2reaction irc -i ts.pdb -q 0 -m 1 --out-json --out-dir ./result_irc
The endpoint candidates are finished_first.xyz and finished_last.xyz.
2. Forward branch only with a larger step¶
Trace only the forward branch, with a maximum step of 0.2 bohr.
pdb2reaction irc -i ts.pdb -q 0 -m 1 --no-backward --step-size 0.2 --out-dir ./result_irc_forward
3. Analytical Hessian¶
Compute the starting Hessian analytically instead of by finite differences.
pdb2reaction irc -i ts.pdb -q 0 -m 1 --hessian-calc-mode Analytical --out-dir ./result_irc_analytical
4. Retry with a smaller step¶
When a branch stops after only a few frames, retry with a maximum step of 0.05 bohr.
pdb2reaction irc -i ts.pdb -q 0 -m 1 --step-size 0.05 --out-dir ./result_irc_small_step
5. Trace to the cycle limit¶
Add --never-stop to ignore the gradient and energy stop criteria and trace each branch until --max-cycles.
pdb2reaction irc -i ts.pdb -q 0 -m 1 --step-size 0.05 --never-stop \
--max-cycles 250 --out-dir ./result_irc_continue
How it works¶
Starting direction:
irccomputes the Hessian at the TS (or reads it with--read-hess), removes rigid motions asfreqdoes, and takes the eigenvector--root(0= lowest eigenvalue) as the reaction mode. If that mode is not imaginary, the run stops with an error.EulerPC integration: each branch (forward, then backward) starts from the TS. Every step is an Euler predictor along the mass-weighted steepest-descent direction, with the gradient estimated from a second-order Taylor expansion with the current Hessian (Bofill update). Each predictor step is followed by a modified Bulirsch–Stoer corrector on a DWI (distance-weighted interpolation) surface. A branch stops when the RMS gradient falls below 1 × 10⁻³ hartree/bohr after leaving the TS region, when the energy rises, when the energy changes by 1 × 10⁻⁶ hartree or less in one step, or at
--max-cycles.Writing the path:
ircwrites each branch, the whole path through the TS, and the two end structures of that path. For PDB/mmCIF input, the trajectories are also converted to PDB.
Judging the IRC¶
Even if the IRC does not converge, the result is usable when the endpoints, optimized with opt, reach the intended R and P.
What to check |
Where to look |
|---|---|
The start was a TS |
The console line |
How each branch stopped |
|
Bonds that change along the path |
|
Which end is R and which is P |
Optimize |
result.json records the outcome as scientific_status: success (exit code 0) means that the integration ran without an error, regardless of how each branch stopped. irc does not judge the endpoints; whether they are the intended R and P is for you to check.
If the endpoints are not the intended R and P, see When the TS search fails.
Output files¶
When the run finishes, --out-dir contains:
result_irc/
├─ finished_irc_trj.xyz # Whole IRC path: forward end → TS → backward end
├─ finished_irc.pdb # Same path as PDB (PDB/mmCIF input)
├─ finished_first.xyz # First frame: forward end (the TS with --no-forward)
├─ finished_last.xyz # Last frame: backward end (the TS with --no-backward)
├─ {forward,backward}_{first,last}.xyz # Ends of each branch
├─ forward_irc_trj.xyz # Forward branch (when it runs)
├─ forward_irc.pdb # Same branch as PDB (PDB/mmCIF input)
├─ backward_irc_trj.xyz # Backward branch (when it runs)
├─ backward_irc.pdb # Same branch as PDB (PDB/mmCIF input)
└─ result.json # Summary (--out-json)
mmCIF input, and PDB input too large for the PDB columns, also get .cif files that keep the original identifiers.
Endpoint candidates:
finished_first.xyzandfinished_last.xyzare the structures to optimize withopt. Of the ends of each branch,forward_first.xyzandbackward_last.xyzare the far ends, andforward_last.xyzandbackward_first.xyzare the first steps from the TS.Path: open
finished_irc_trj.xyzorfinished_irc.pdbin PyMOL or VMD to watch the reaction.Summary: with
--out-json,result.jsonrecords the number of frames of each branch, how each branch stopped,bond_changes, and the energies of the two ends and the TS.File prefix: with YAML
irc.prefix: trial, the names of the trajectory and structure files start withtrial_;filesinresult.jsonalso records the prefixed names.Console: the step table of each branch and the elapsed time; with -v 3, also the
geom,calc, andircsettings actually used.
Main options¶
Option |
Type |
Default |
Description |
|---|---|---|---|
|
path |
(required) |
TS structure ( |
|
integer |
|
Total charge. Required unless |
|
text |
|
Total ligand charge (for example |
|
integer |
|
Spin multiplicity (2S+1) |
|
text |
|
Backend ( |
|
integer |
|
Maximum number of IRC steps per branch |
|
float |
|
Maximum step length in bohr (unweighted Cartesian coordinates) |
|
flag |
|
Ignore the gradient and energy stop criteria and trace until |
|
flag |
|
Run the forward branch |
|
flag |
|
Run the backward branch |
|
integer |
|
Hessian eigenvector used as the reaction mode, counted from 0 in ascending order of eigenvalue |
|
|
|
How the starting Hessian is computed |
|
path |
|
Start from the Hessian in a |
|
flag |
|
Freeze the parent atoms of cap hydrogens (PDB/mmCIF input or |
|
flag |
|
Write a summary to |
|
path |
|
Output directory |
See the generated CLI reference for every option.
Note: in YAML (
--config), every key of theircblock, including the stop thresholds, is listed underircin the YAML Reference.
Notes¶
A branch that stops at once: when a branch ends after three frames or fewer, the console warns
[irc] IRC stopped after only a few frames in …. Try example 4 first; a large step can make EulerPC unstable.--never-stopstill stops on failures: even with--never-stop, numerical failures and interruptions stop the run. Inspect the trajectory and optimize the endpoints, and raise--max-cyclesonly when the extra path is useful.--rootcounts from 0: a successful TS optimization gives one imaginary mode along the reaction coordinate, so for a TS with n_imag = 1 keep--root 0(the only negative eigenvalue). Use1,2, … only when you know that spurious modes with lower (more negative) eigenvalues come before the reaction mode.Fixed settings:
ircalways uses Cartesian coordinates (geom.coord_type: cart) and the Hessian of the movable atoms only (calc.return_partial_hessian: true), whatever the YAML says.The
--read-hessfile is the same.npyfile as infreq. It needsirc.hessian_init: calc(the default); when the file is used,rigid_projection.hessian_sourceinresult.jsonis"file".Analytical Hessian and
--uma-workers: with UMA,--hessian-calc-mode Analyticalcannot run with--uma-workersabove 1 and stops with an error. Use--uma-workers 1for an analytical Hessian. Its speed and memory use depend on the backend, the model, and the system size, so test it on your system first.Optimizing the endpoints:
finished_first.xyzandfinished_last.xyzare written only as.xyz, so pass the TS PDB with--ref-pdbto keep the parent atoms of the cap hydrogens frozen:pdb2reaction opt -i result_irc/finished_first.xyz --ref-pdb ts.pdb -q 0 -m 1 --out-dir ./result_opt_first pdb2reaction opt -i result_irc/finished_last.xyz --ref-pdb ts.pdb -q 0 -m 1 --out-dir ./result_opt_last
Frozen atoms:
--freeze-atoms(1-based) freezes atoms in addition to--freeze-links.result.jsonrecords the removed rigid motions and the starting Hessian underrigid_projection.Large systems:
--hess-device cpukeeps the starting Hessian and the IRC Hessian operations on the CPU, to stay within GPU memory.At least one branch:
--no-forwardtogether with--no-backwardstops with an error.
See also¶
tsopt — optimize the TS before running IRC
opt — optimize the IRC endpoints to R and P
freq — full vibrational analysis and thermochemistry
all — the full workflow, which runs IRC after
tsoptand optimizes the endpointsTroubleshooting — when a run fails
YAML Reference — every
ircsettingGlossary — IRC and other terms
Exit codes — what each exit status means