Troubleshooting¶
Find your symptom in the quick table, then read the fix in the section it points to.
Quick routing¶
Symptom |
Start here |
Then read |
|---|---|---|
Input & extraction |
||
Blank element columns stop |
Run |
|
|
Regenerate all PDBs with the same preparation tool and settings; never reorder atoms once the atom order is fixed |
|
A utility command ( |
Find the message on that command’s page: errors are in its Notes, and |
add-elem-info, fix-altloc, bond-summary, energy-diagram, trj2fig |
|
Compare structures that have the same atoms in the same order |
|
|
Add |
|
Charge & spin |
||
|
Set |
|
|
The charge and multiplicity do not fit the electron count. Fix |
|
Energies or states look wrong after a run |
Re-check the charge and multiplicity you passed |
|
Calculation & convergence |
||
|
Each line names the segment and the stage that failed (TS optimization, MEP, IRC, or endpoint optimization); find that stage in the rows below. |
|
UMA raises |
Use |
|
CUDA out of memory ( |
Keep the default |
|
TS optimization converged, but n_imag is not 1 |
n_imag ≥ 2 ( |
|
TS optimization does not converge ( |
Check the TS candidate first, then switch the optimizer ( |
|
IRC does not terminate |
Standalone |
|
Opt / TS optimization stops as |
Treat it as not converged; inspect the final geometry and the force / step criteria, then retry with another threshold or optimizer setting |
|
Minimum energy path (MEP) search (GSM / DMF) fails ( |
Raise |
|
|
Leave at least one atom movable |
|
DFT SCF does not converge |
Try |
|
DFT runs out of GPU memory |
Use a smaller basis, trim the model, or move to a larger GPU; if |
|
Installation & environment |
||
DMF import error ( |
Create the environment with cyipopt and PyTorch from conda-forge, as in steps 2–3 of Step-by-step installation ( |
|
UMA model 401 / 403 or gated-repo error ( |
Run |
|
|
Use a dedicated environment for MACE |
|
|
Install the backend extra: |
|
CUDA / GPU runtime mismatch |
Check the GPU, the PyTorch build, and the driver together |
|
Plot export fails |
Run |
Preflight checklist¶
Before a long run, check that:
A Hugging Face login is set up on this machine (needed for the default UMA model).
Your input PDB/mmCIF structures contain hydrogens and element symbols.
When you pass several PDBs, they share the same atoms in the same order.
Input / extraction¶
Element symbols are missing in '...'¶
Symptom:
extractstops withElement symbols are missing in '...'. For PDB input, run pdb2reaction add-elem-info -i ... before extract.allfills blank element columns itself before extraction, and stops with the same message when some atoms cannot be assigned.Cause: many PDBs leave the element column (columns 77–78) blank, and
extractneeds the elements to type the atoms. mmCIF input must provide_atom_site.type_symbol.Fix: fill the column with
add-elem-infoand rerun with the new file. For each atom listed under[WARN] Could not confidently assign N atoms, write its element symbol by hand, right-justified in columns 77–78.pdb2reaction add-elem-info -i input.pdb -o input_with_elem.pdb
[multi] Atom count mismatch / [multi] Atom order mismatch¶
Symptom: a run with several inputs stops with
[multi] Atom count mismatch between input #1 and input #2: ...or[multi] Atom order mismatch between input #1 and input #2.Cause: the structures were prepared with different tools or settings, or the atom order changed after re-protonation or re-parametrization.
Fix: regenerate all structures with the same protonation tool and settings. For MD snapshots, take every frame from the same trajectory and topology. Never reorder PDB atoms after the topology is built.
The active-site model is empty or misses catalytic residues¶
Symptom: the extracted model is smaller than expected, or catalytic residues are missing.
Cause: the radius (
-r/--radius, default 2.6 Å) is too small for this site, or--exclude-backboneremoved too much.Fix: raise
--radius(for example 2.6 → 3.5 Å), or add the residue.--selected-resn 'A:TYR:44'adds at least its side chain, and adding it to-ckeeps it whole when-ris above 0. See Make the model larger and Residue selectors. If you passed--exclude-backboneand it trims too much, pass--no-exclude-backbone.
Energies or barriers shift with model size¶
Symptom: energies or barriers look unreasonable, or change a lot when the model grows.
Cause: the extracted model is too small.
Fix: enlarge the radius and check how the result depends on the model size and boundary.
pdb2reaction extract -i complex.pdb -c 'SUB' -o model.pdb -r 4.0
A modified residue is not truncated¶
Symptom: an unlisted modified amino acid keeps its full backbone and gets no cap hydrogens.
Cause: backbone truncation and cap-hydrogen placement need an entry in the amino-acid catalog. SEP, TPO, and MLY are already built in.
Fix: register only the unlisted residue and give its nominal charge, for example
--modified-residue "XAA:0". A bare name assigns charge 0, so do not use it to re-register a charged built-in residue. If the backbone topology is unusual, build the active-site model by hand and pass it directly to the downstream commands.
Charge / spin¶
First check that the total charge and the multiplicity are correct for the target state, and that each residue key in -l/--ligand-charge exists in the structure. For important runs, give -q/--charge or -l/--ligand-charge and -m explicitly; the rules are in Charge specification.
-q/--charge is required / Total charge could not be resolved¶
Symptom: a run on non-
.gjfinput stops with-q/--charge is required unless the input is a .gjf template with charge metadata.or, inall,[all] Total charge could not be resolved.Cause: without
-q/--charge, the workflow resolves the charge from-l/--ligand-chargewith PDB/mmCIF input (or XYZ/GJF with--ref-pdb), from YAMLcalc.charge, or from a.gjftemplate. None of them applied.Fix: give the charge and multiplicity, or a per-residue charge map with extraction.
pdb2reaction path-search -i R.pdb P.pdb -q 0 -m 1 pdb2reaction -i R.pdb P.pdb -c 'SAM,GPP' -l 'SAM:1,GPP:-3'
Installation / environment¶
First confirm that the optional packages are installed in the active environment and that PyTorch sees the GPU. After a repair, check with pdb2reaction --version and python -c "import torch; print(torch.cuda.is_available())", then run the command once with --dry-run to check the options and input before the full run.
Symptom |
Cause |
Fix |
|---|---|---|
UMA download fails ( |
No Hugging Face login, or the UMA model license is not accepted |
Run |
|
The backend package is not installed in this environment |
ORB: |
|
MACE was installed into the UMA environment: |
Use a dedicated conda environment for MACE: |
ORB import still fails after installing the extra |
A package in the environment conflicts with |
Run |
|
The PyTorch build does not match the GPU or driver of the node |
Check the assigned GPU, the installed wheel, and the driver with |
|
|
Create the environment with cyipopt and PyTorch from conda-forge, as in steps 2–3 of Step-by-step installation. |
Plot export fails (Plotly / Chrome) |
Headless Chrome is missing |
Run |
DMF is unusually slow inside IPOPT¶
If IPOPT/MUMPS uses multithreaded BLIS, nested threads can cause long waits.
Set BLIS_NUM_THREADS=1 before starting Python or the CLI, for example in
the job script. Leave the other thread settings, such as OMP_NUM_THREADS, unchanged.
Manual BLIS_JC_NT, BLIS_PC_NT, BLIS_IC_NT, BLIS_JR_NT, or
BLIS_IR_NT settings override this limit; remove them from that job’s
configuration. Restart an existing notebook kernel after changing the settings.
See BLIS thread controls.
Calculation / convergence¶
First check the TS candidate: a successful TS optimization gives one imaginary mode along the reaction coordinate. A mode counts as imaginary when ν < −5.00 cm⁻¹; YAML freq.zero_cutoff_cm changes the cutoff. When the TS optimization does not converge, read TS optimization; when it converges but n_imag is not 1, read When the TS search fails.
Optimizer reaches max_cycles with max(force) slightly above threshold¶
Symptom: the optimizer runs to
max_cycles, and the final summary showsmax(force)orrms(force)just above the selected threshold while the energy has stopped changing.Cause: MLIP force noise and flatness can keep a force threshold out of reach; the level depends on the backend, model, precision, system, and hardware.
Fix: inspect the final geometry and the forces, then rerun:
Loosen the convergence preset with
--thresh gau_loose. The defaults aregauforoptandbakerfortsopt.To end such a run early instead of at
--max-cycles, add--stop-plateau. The run then stops asstalled(not converged) once the energy range over the last--stop-plateau-windowsteps (default 50) falls below--stop-plateau-thresh(default1×10⁻⁴ au).
TS optimization does not converge / multiple imaginary modes remain¶
Symptom: the TS optimization runs many cycles without converging, or n_imag is 2 or more after the optimization.
What is reported: a TS optimization (RS-P-RFO, RS-I-RFO, TRIM, or Dimer) that reaches max cycles without converging does not compute the Hessian, so no n_imag is reported. A run stopped on an energy plateau always computes the Hessian and reports n_imag.
Fix when the optimization does not converge: try the following in order.
Switch the optimizer between RS-P-RFO (the default) and the Dimer method:
tsopt --opt-mode hess/dimer, orall --opt-mode-post hess/grad(Dimer).Reduce the step size in YAML:
rsirfo.trust_radius/trust_min/trust_maxfor RS-P-RFO, RS-I-RFO, and TRIM, orhessian_dimer.lbfgs.max_stepfor Dimer; see YAML Reference.Start from another candidate, such as a better HEI (highest-energy image) of the path.
Fix when n_imag ≥ 2 remains: re-optimize with
--flatten, or tighten the convergence preset from the defaultbakertogau_tightorgau_vtight(tsopt --threshorall --thresh-post). When the TS search fails lists other moves:--refine-path, splitting the reaction into stages, a new starting structure.
IRC does not terminate properly¶
An IRC that stops before it converges is still usable when the endpoint optimizations reach the intended R and P, so check the optimized endpoints first.
Symptom: the IRC stops before it reaches a clear minimum, or the energy oscillates and the gradient norm stays large.
Cause: the step is too large for this surface, the cycle limit is too low, or the starting structure has more than one imaginary mode.
Fix:
Standalone
irc:--step-size 0.05(default 0.10 bohr) and, if needed,--max-cycles 200(default 125).all:--irc-step-size 0.05and, if needed,--irc-max-cycles 200.Confirm that the starting structure has n_imag = 1.
To ignore the physical stop criteria and trace to the cycle limit, use
irc --never-stoporall --irc-never-stop, then inspect the trajectory and endpoints.
MEP search (GSM / DMF) fails or misses bonds¶
Symptom: the MEP search ends without a usable path, or misses an expected bond change.
Fix:
Raise
--max-nodes(default 20) to 30 or 40 for complex reactions.Keep endpoint preoptimization on (the default); remove
--no-preoptif you passed it.Try the other method:
--mep-mode dmf↔gsm.Tune bond-change detection with YAML
bond.bond_factorandbond.delta_fraction.
freq stops with an error¶
Every atom is frozen: with nothing movable there is no vibration to analyze, and
freqstops with an error. Check--freeze-atoms, YAMLgeom.freeze_atoms, and the cap-hydrogen parents frozen by--freeze-links; see Freeze atoms and restrain distances.--uma-workersabove 1 with--hessian-calc-mode Analytical: see Performance.
Performance / stability tips¶
workers > 1— may improve UMA throughput, depending on the hardware and workload, but the parallel predictor has no analytical Hessian. An explicitAnalyticalrequest raisesBackendError(aRuntimeErrorsubclass) withAnalytical Hessian cannot be combined with UMA workers>1; use--uma-workers 1for an analytical Hessian, or selectFiniteDifference. To spread workers over several nodes, use the job script in the HPC example.Large systems — make a chemically justified smaller active-site model and run radius/boundary sensitivity checks; multi-GPU support is backend- and workflow-specific, so do not assume that increasing GPU count reduces memory per worker.
DFT scratch on HPC — if PySCF/GPU4PySCF uses temporary disk for the chosen calculation, point
PYSCF_TMPDIRat a filesystem with verified capacity and performance. Do not assume that node-local/tmp,$PBS_O_WORKDIR, or another shared path is suitable at every site.
GPU memory (VRAM) requirements¶
VRAM depends on the MLIP model, precision, Hessian mode, and frozen atoms, not on the atom count alone, so measure a representative pilot with the same setup. On torch.cuda.OutOfMemoryError, try the following in order:
Keep or switch to the default
--hessian-calc-mode FiniteDifference; an analytical Hessian normally has a larger memory peak.Lower
--max-nodes, or use a smaller MLIP model (--backend-model). Inoptandscan, keep --opt-mode grad (L-BFGS, no Hessian) instead ofhess.Move to a GPU with more memory.
Reduce the cluster model, only after checking that the required residues remain and the boundary is well placed.
How to report an issue¶
Report problems and feature requests on GitHub Issues. Include the exact command, run.log (and summary.log for all / path-search), the smallest reproducing inputs, and your env (OS / Python / CUDA / PyTorch).
See also¶
Tips for studying reaction mechanisms — what to try when the TS search fails
Installation — environment setup and optional backends
MLIP Backends — choosing a backend
Building the cluster model — check, trim, or enlarge the active-site model