scan2d¶
Perform a two-distance (d₁, d₂) grid scan with harmonic restraints and MLIP relaxations, producing a 2D potential-energy map over (d₁, d₂). Use it to locate a TS region or visualize the reaction landscape before MEP refinement. scan2d constructs linear grids for both distances using --max-step-size, relaxes each grid point with the appropriate restraints active, and records unbiased MLIP energies for visualization. Input is one structure plus -s/--scan-lists scan2d.yaml (recommended), or a single --scan-lists/-s inline literal containing exactly two quadruples. The default backend is UMA; select an alternative with -b/--backend. Use --opt-mode hess when you need RFOptimizer instead of L-BFGS.
For XYZ/GJF inputs, --ref-pdb supplies a reference PDB topology while keeping XYZ coordinates, enabling format-aware PDB/GJF output conversion.
Examples¶
Minimal run with a YAML spec file:
pdb2reaction scan2d -i input.pdb -q 0 -s scan2d.yaml -o ./result_scan2d/
Command form:
pdb2reaction scan2d -i INPUT.{pdb|xyz|trj|...} [-q CHARGE] [-l, --ligand-charge <number|'RES:Q,...'>] [-m MULT] \
[-b/--backend uma|orb|mace|aimnet2] [--solvent SOLVENT] [--solvent-model alpb|cpcmx] \
[-s/--scan-lists scan2d.yaml | '[(i,j,lowÅ,highÅ), (i,j,lowÅ,highÅ)]'] [options] \
[--convert-files/--no-convert-files] [--ref-pdb FILE]
Recommended YAML/JSON spec file:
cat > scan2d.yaml << 'YAML'
one_based: true
pairs:
- ["TYR,285,CA", "SAM,309,C10", 1.30, 3.10]
- ["TYR,285,CB", "SAM,309,C11", 1.20, 3.20]
YAML
pdb2reaction scan2d -i input.pdb -q 0 -s scan2d.yaml
Alternative inline Python literal:
pdb2reaction scan2d -i input.pdb -q 0 \
-s '[("TYR,285,CA","SAM,309,C10",1.30,3.10),("TYR,285,CB","SAM,309,C11",1.20,3.20)]'
LBFGS, dumped inner trajectories, and Plotly outputs:
pdb2reaction scan2d -i input.pdb -q 0 \
-s '[("TYR,285,CA","SAM,309,C10",1.30,3.10),("TYR,285,CB","SAM,309,C11",1.20,3.20)]' \
--max-step-size 0.20 --dump -o ./result_scan2d/ --opt-mode grad \
--preopt --baseline min
Scan-list spec¶
scan2d accepts exactly two quadruples (i, j, low_Å, high_Å) (under the pairs key for YAML/JSON, or as a single inline literal). Unlike scan, only one literal is accepted (no multi-stage support).
For the YAML/JSON file format, inline Python literal syntax, atom selectors, and quoting rules, see CLI Conventions: Scan-list spec.
Workflow¶
Load the input geometry via
geom_loader, resolve charge/spin, and optionally run an unbiased preoptimization when--preopt. If-qis omitted but--ligand-charge/-lis provided, the structure is treated as an enzyme–substrate complex andextract.py’s charge summary derives the total charge before the scan (for PDB inputs, or XYZ/GJF when--ref-pdbis supplied). The preoptimized structure is saved undergrid/preopt_iDDD_jDDD.*and its unbiased energy is stored insurface.csvwith indicesi = j = -1.Parse targets from
--scan-lists/-s(YAML/JSON file or inline literal) into two quadruples, normalize indices (1-based by default). For PDB inputs, each atom entry can be an integer index or a selector string like'TYR,285,CA'; delimiters may be spaces, commas, slashes, backticks, or backslashes, and token order is flexible (fallback assumes resname, resseq, atom). Construct linear grids withceil(|high − low| / h) + 1points (both endpoints included), whereh = --max-step-size. Zero-length spans collapse to a single point. Each axis is then reordered so that the distance closest to the preoptimized geometry is indexed asi = 0/j = 0.Iterate over every
d1[i](nearest-first ordering). For each value, relax the system with only the d₁ restraint active, snapshot that geometry, then run the inner loop overd2[j]with both restraints applied starting from the nearest previously converged structure.At each
(i, j)pair, store the biased-optimization result under<out-dir>/grid/point_iDDD_jDDD.xyzwhereDDD = round(d × 100)in Å (e.g.d1=1.30 Å, d2=3.10 Å→point_i130_j310.xyz), record whether the bias converged, and evaluate the MLIP energy without bias. Optional per-outer-step inner trajectories are saved asinner_path_d1_###_trj.xyzwhen--dump(###is the outer step index).After all points are visited, write
<out-dir>/surface.csvwith columnsi,j,d1_A,d2_A,energy_hartree,bias_converged,energy_kcal,d1_label,d2_label, shifting the kcal reference via--baseline {min|first}. With--baseline first, the reference is the first grid entry (i = j = 0after reordering), not necessarily(low₁, low₂). Generatescan2d_map.png(2D contour) andscan2d_landscape.html(3D surface) in<out-dir>/. Use--zmin/--zmaxto clamp the color scale.
Outputs¶
After a run, check surface.csv, the per-point structures under grid/, and the scan2d_map.png / scan2d_landscape.html plots.
out_dir/ (default:./result_scan2d/)
├─ surface.csv # Structured grid table
├─ scan2d_map.png # 2D contour (requires Kaleido; the run stops if PNG export fails)
├─ scan2d_landscape.html # 3D surface visualization (open in a browser)
├─ grid/point_iDDD_jDDD.xyz # DDD = round(d × 100) in Å (e.g. d1=1.30 Å, d2=3.10 Å -> point_i130_j310.xyz)
├─ grid/point_iDDD_jDDD.pdb # PDB companions when conversion is enabled and templates exist
├─ grid/point_iDDD_jDDD.gjf # Gaussian companions when templates exist and conversion is enabled
├─ grid/preopt_iDDD_jDDD.xyz # Starting structure (present when --preopt is True), DDD = round(d × 100)
├─ grid/preopt_iDDD_jDDD.pdb # PDB companion when conversion is enabled
├─ grid/preopt_iDDD_jDDD.gjf # Gaussian companion when templates exist and conversion is enabled
└─ grid/inner_path_d1_###_trj.xyz # Present only when --dump is True (### = outer step index; mirrored to .pdb for PDB inputs with conversion)
CLI options¶
The tables below cover the options that need explanation; the full flag list is in the generated command reference — do not hand-duplicate it here.
Option |
Description |
Default |
|---|---|---|
|
Structure file accepted by |
Required |
|
Total charge (CLI > template/ |
Required unless template/derivation applies |
|
Either a scalar integer (e.g., |
None |
|
MLIP predictor parallelism (workers > 1 disables analytic Hessians; UMA backend only; |
|
|
Spin multiplicity 2S+1. Inherits the |
|
|
Scan targets: a YAML/JSON spec file path (recommended) or single inline Python literal with two quadruples |
Required |
|
Interpret |
|
|
Print parsed pair tuples after |
|
|
Maximum change allowed for either distance per increment (Å). Determines the grid density. |
|
|
Harmonic bias strength |
|
|
Maximum optimizer cycles during each biased relaxation. Used unless YAML sets |
|
|
|
|
|
When the input is PDB, freeze parents of cap hydrogens. |
|
|
Comma-separated 1-based atom indices to freeze explicitly (e.g., |
None |
|
Write |
|
|
Toggle XYZ/TRJ → PDB/GJF companions for PDB/Gaussian inputs. |
|
|
Reference PDB topology to use when the input is XYZ/GJF (keeps XYZ coordinates). |
None |
|
Output directory root for grids and plots. |
|
|
Convergence preset override ( |
|
|
Base YAML configuration file (applied first). |
None |
|
MLIP backend. |
|
|
Implicit solvent name for xTB correction (e.g. |
|
|
xTB solvent model. |
|
|
Run an unbiased optimization before scanning. |
|
|
Shift kcal/mol energies so the global min or first grid point is zero. |
|
|
Manual limits for the contour/surface color scale (kcal/mol). |
Autoscaled |
|
Write a machine-readable |
|
YAML configuration¶
geom:
coord_type: cart # coordinate type: cartesian vs dlc internals
freeze_atoms: [] # 1-based frozen atoms merged with CLI/cap detection
calc:
charge: 0 # total charge (CLI/template override)
spin: 1 # spin multiplicity 2S+1
model: uma-s-1p1 # uma-s-1p1 | uma-m-1p1
device: auto # MLIP device selection
opt:
thresh: baker # convergence preset (default: baker)
max_cycles: 10000 # optimizer cycle cap
dump: false # optimizer dumps (scan trajectories are controlled by --dump)
out_dir: ./result_scan2d/ # output directory
lbfgs:
max_step: 0.3 # maximum step length
out_dir: ./result_scan2d/ # LBFGS-specific output directory
rfo:
trust_radius: 0.10 # trust-region radius
out_dir: ./result_scan2d/ # RFO-specific output directory
bias:
k: 300.0 # harmonic bias strength (eV·Å⁻²)
Notes¶
The MLIP backend (UMA by default) reuses the same
HarmonicBiasCalculatoras the 1D scan.Ångström limits are converted to Bohr internally to cap L-BFGS steps and RFO trust radii; optimizer scratch files live under temporary directories.
The bias is always removed before final energies are recorded so you can reuse
surface.csvin downstream fitting or visualization scripts.--freeze-linksmerges userfreeze_atomswith detected cap-H parents for PDB inputs, keeping extracted active site models rigid.--relax-max-cyclesapplies only when explicitly provided and YAML does not setopt.max_cycles(default10000).
See Also¶
scan – 1D bond-distance scan
scan3d – 3D distance-grid scan
opt – single-structure optimization before/after scans
all – end-to-end workflow wrapper
Common Error Recipes – Symptom-first failure routing
Troubleshooting – Detailed troubleshooting guide