scan3d¶
Perform a three-distance grid scan with harmonic restraints and machine-learned interatomic potential (MLIP) relaxations, sampling the potential energy on a 3D grid over the three distances (d₁, d₂, d₃). Use it when such a volume is needed, or when an existing surface.csv needs re-plotting.
There are two ways to drive the command. To run a new scan, supply targets with --scan-lists/-s, either as a YAML/JSON spec file (recommended) or as an inline Python literal. To re-plot an existing surface.csv without re-evaluating energies, pass it via --csv. During a scan, scan3d nests loops over d₁ → d₂ → d₃ and relaxes each point with the appropriate harmonic restraints active.
The default optimizer is L-BFGS (--opt-mode grad); switch to --opt-mode hess for RFOptimizer.
For XYZ/GJF inputs, --ref-pdb supplies a reference PDB topology while keeping XYZ coordinates, enabling format-aware PDB/GJF output conversion.
Examples¶
Command form:
pdb2reaction scan3d [-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 scan3d.yaml | '[(i,j,lowÅ,highÅ), (i,j,lowÅ,highÅ), (i,j,lowÅ,highÅ)]'] [options] \
[--convert-files/--no-convert-files] [--ref-pdb FILE] [--csv PATH]
Recommended: YAML/JSON spec file.
# Recommended: YAML/JSON spec file
cat > scan3d.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]
- ["TYR,285,CG", "SAM,309,C12", 1.10, 3.00]
YAML
pdb2reaction scan3d -i input.pdb -q 0 -s scan3d.yaml
Alternative: inline Python literal.
# Alternative: inline Python literal
pdb2reaction scan3d -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),("TYR,285,CG","SAM,309,C12",1.10,3.00)]'
Plot only from an existing surface.csv (skip new energy evaluation).
# Plot only from an existing surface.csv (skip new energy evaluation)
pdb2reaction scan3d --csv ./result_scan3d/surface.csv --zmin -10 --zmax 40 -o ./result_scan3d/
Workflow¶
Load the structure through
geom_loader, resolve charge/spin from CLI or embedded Gaussian templates, 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 scanning (for PDB inputs, or XYZ/GJF when--ref-pdbis supplied).Parse targets from
--scan-lists/-s(YAML/JSON file or inline literal; default 1-based indices unless--zero-basedis passed) into three quadruples. 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). Build each linear grid usingh = --max-step-sizeand reorder the values so the ones closest to the starting distances are visited first.Outer loop over
d1[i]: relax with only the d₁ restraint active, starting from the previously scanned geometry whose d₁ value is closest. Snapshot that structure.Middle loop over
d2[j]: relax with d₁ and d₂ restraints, starting from the closest (d₁, d₂) geometry. Snapshot that result.Inner loop over
d3[k]: relax with all three restraints, measure the unbiased energy (bias removed for evaluation), and write the constrained geometry and convergence flag.After the scan completes, assemble
surface.csv(columns:i,j,k,d1_A,d2_A,d3_A,energy_hartree,bias_converged,energy_kcal,d1_label,d2_label,d3_label), apply the kcal/mol baseline shift (--baseline {min|first}), and generate a 3D RBF-interpolated isosurface plot (scan3d_density.html) honoring--zmin/--zmax. When--csvis provided, only this plotting step runs.
Outputs¶
The key deliverables are surface.csv, per-point geometries under grid/, and the scan3d_density.html isosurface plot.
out_dir/ (default:./result_scan3d/)
├─ surface.csv # Grid metadata; may include a reference row (i=j=k=-1)
├─ scan3d_density.html # 3D energy isosurface visualization (you can open it with a web browser)
├─ grid/point_i###_j###_k###.xyz # Relaxed geometry for each grid point (Å×100 tags)
├─ grid/point_i###_j###_k###.pdb # PDB companions when conversion is enabled and templates exist
├─ grid/point_i###_j###_k###.gjf # Gaussian companions when templates exist and conversion is enabled
├─ grid/preopt_i###_j###_k###.xyz # Starting structure saved before scanning (preoptimized when --preopt is True)
└─ grid/inner_path_d1_###_d2_###_trj.xyz # Present only when --dump is True (mirrored to .pdb for PDB inputs with conversion)
Grid-point geometries use Å×100 tags, so point_i130_j310_k200.xyz corresponds to d₁=1.30, d₂=3.10, d₃=2.00 Å.
CLI options¶
Option |
Description |
Default |
|---|---|---|
Input & charge |
||
|
Structure file accepted by |
Required unless |
|
Total charge (CLI > template/ |
Required unless template/derivation applies |
|
Either a scalar integer (e.g., |
None |
|
Spin multiplicity 2S+1. Inherits the |
|
Backend & compute |
||
|
MLIP backend. |
|
|
MLIP predictor parallelism (workers > 1 disables analytic Hessians; UMA backend only; |
|
|
Implicit solvent name for xTB correction (e.g. |
|
|
xTB solvent model. |
|
Active-region freezing |
||
|
When the input is PDB, freeze parents of cap hydrogens. |
|
|
Comma-separated 1-based atom indices to freeze explicitly (e.g., |
None |
Scan targets |
||
|
Scan targets: a YAML/JSON spec file path (recommended) or single inline Python literal with three quadruples |
Required unless |
|
Interpret |
|
|
Print parsed pair tuples after |
|
|
Maximum change allowed per distance increment (Å). Controls grid density. |
|
Refinement |
||
|
Harmonic bias strength |
|
|
|
|
|
Maximum optimizer cycles during each biased relaxation. Used unless YAML sets |
|
|
Convergence preset override ( |
|
|
Run an unbiased optimization before scanning. |
|
Merge & alignment |
||
|
Reference PDB topology to use when the input is XYZ/GJF (keeps XYZ coordinates). |
None |
|
Toggle XYZ/TRJ → PDB/GJF companions for PDB/Gaussian inputs. |
|
Output & config |
||
|
Output directory root for grids and plots. |
|
|
Load an existing |
None |
|
Write |
|
|
Shift kcal/mol energies so the global min or |
|
|
Manual limits for the isosurface color bands (kcal/mol). |
Autoscaled |
|
Write a machine-readable |
|
|
Base YAML configuration file (applied first). |
None |
The full flag list is in the generated command reference; do not hand-duplicate it here.
YAML configuration¶
Notes¶
scan3daccepts exactly three quadruples(i, j, low_Å, high_Å)(under thepairskey for YAML/JSON, or as a single inline literal). Unlikescan, 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.3D grids grow very quickly; consider coarser
--max-step-sizeor smaller ranges first.The MLIP backend (UMA by default) reuses the same
HarmonicBiasCalculatoras the 1D/2D scans.Ångström limits are converted to Bohr internally to cap L-BFGS steps and RFO trust radii; optimizer scratch files live under temporary directories.
--baselinedefaults to the global minimum;--baseline firstanchors the(i,j,k)=(0,0,0)grid point when present.3D visualization uses RBF interpolation on a 50×50×50 grid with semi-transparent step-colored isosurfaces (no cross-sectional planes).
--freeze-linksmerges userfreeze_atomswith detected cap-H parents for PDB inputs, keeping extracted active site models rigid.Add
--print-parsedwhen you want to verify parsed pair targets from--scan-lists/-s.--relax-max-cyclesis applied only when explicitly provided and YAML does not setopt.max_cycles(default10000); a YAMLopt.max_cyclesvalue takes precedence.
See Also¶
scan – 1D bond-distance scan
scan2d – 2D 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