Quick Reaction Coordinate
A quick reaction coordinate job maps reactant and product endpoints from a transition-state guess by displacing along the imaginary-frequency normal mode and optimizing to the nearest minima.
This method is a fast alternative to full IRC path following — instead of tracing the reaction path step-by-step, it displaces the TS geometry in both directions and performs two geometry optimizations.
What It Runs
For each submitted job, Atomiverse executes:
- Saddle-point optimization on the TS guess.
- Vibrational analysis on the optimized structure.
- Validation that exactly one imaginary frequency exists (the reaction coordinate mode).
- Displacement along the reaction mode in both forward and reverse directions.
- Geometry optimization of each displaced structure to a minimum.
The result is the TS, reactant, and product structures, together with forward and reverse reaction barriers.
Your First Quick Reaction Coordinate
import atomiverse
from atomiverse import (
Atoms,
JobFailedError,
QuickReactionCoordinate,
)
from atomiverse.levels import GFN2_XTB
atomiverse.configure(api_key="your-api-key")
ts_guess = Atoms.from_smiles("[H][H]")
job = QuickReactionCoordinate(
ts_atoms=ts_guess,
level_of_theory=GFN2_XTB,
)
job.submit()
try:
result = job.require_result()
except JobFailedError as exc:
print(f"Job failed: {exc.failure.error}")
else:
print(f"TS Energy: {result.ts_energy:.6f} eV")
print(f"Forward barrier: {result.barrier_forward:.3f} eV")
print(f"Reverse barrier: {result.barrier_reverse:.3f} eV")
print(f"Reaction energy: {result.reaction_energy:.3f} eV")
Input Parameters
Required:
ts_atoms: transition-state guess structurelevel_of_theory: electronic-structure method
Optional:
charge(default0)multiplicity(default1)amplitude(default0.3): scaling factor for displacement along the reaction coordinate. Larger values push further from the saddle point; smaller values are safer for crowded geometries.
job = QuickReactionCoordinate(
ts_atoms=ts_guess,
charge=0,
multiplicity=1,
level_of_theory=GFN2_XTB,
amplitude=0.4,
)
Result
job.require_result() returns a QuickReactionCoordinateResult.
| Field | Type | Description |
|---|---|---|
ts_atoms | Atoms | Optimized transition-state structure. |
reactant_atoms | Atoms | None | Optimized reactant endpoint. |
product_atoms | Atoms | None | Optimized product endpoint. |
ts_energy | float | TS energy in eV. |
reactant_energy | float | None | Reactant energy in eV. |
product_energy | float | None | Product energy in eV. |
barrier_forward | float | None | Forward barrier (TS − reactant) in eV. |
barrier_reverse | float | None | Reverse barrier (TS − product) in eV. |
reaction_energy | float | None | Reaction energy (product − reactant) in eV. |
imaginary_frequency_cm1 | float | None | Reaction mode frequency in cm⁻¹. |
ts_optimization_trajectory | list[TrajectoryStep] | Steps of the saddle-point search. |
forward_converged | bool | Whether forward optimization converged. |
reverse_converged | bool | Whether reverse optimization converged. |
Non-blocking Submission
from atomiverse import State
job.submit(wait=False)
job.refresh()
if job.state == State.DONE:
result = job.require_result()
print(f"Forward barrier: {result.barrier_forward:.3f} eV")
elif job.state == State.FAILED:
print(job.require_failure().error)