Tutorial: From ESP to DCMNet#

This step-by-step tutorial walks you through computing an ESP for a molecule, exporting a cube, preparing a dataset, and training DCMNet.

Step 1: Compute ESP with GPU4PySCF#

python -m mmml.pyscf4gpuInterface.calcs \
  --mol "O 0.000 0.000 0.000; H 0.000 0.757 0.586; H 0.000 -0.757 0.586" \
  --basis def2-tzvp --xc wB97m-v --spin 0 --charge 0 \
  --dens_esp --energy --output water_esp.pkl

Step 2: Export a Gaussian cube#

Map the sampled ESP to a rectilinear grid and write water.cube.

# See esp_cube_generation.rst for a complete script
# Adapt paths and grid resolution if needed

Step 3: Prepare a training NPZ#

Create the keys expected by DCMNet. For illustration, we fake mono and minimal metadata; for real data, use your reference charges and surface definition.

import numpy as np, pickle
with open("water_esp.pkl", "rb") as f:
    d = pickle.load(f)
# One-sample dataset (natoms = len(d["Z"]))
R = d["R"][None, ...]
Z = d["Z"][None, ...]
N = np.array([[len(d["Z"])]])
esp = d["esp"][None, ...]
vdw_surface = d["esp_grid"][None, ...]  # using ESP grid as surface points
n_grid = np.array([len(d["esp"])])
mono = np.zeros((1, len(d["Z"])))  # placeholder monopoles
np.savez("water_esp_train.npz", R=R, Z=Z, N=N, mono=mono,
         esp=esp, vdw_surface=vdw_surface, n_grid=n_grid)

Step 4: Train DCMNet#

python -m mmml.dcmnet.dcmnet.main \
  --data_files ./water_esp_train.npz \
  --n_train 1 --n_valid 0 \
  --num_epochs 200 --batch_size 1 --learning_rate 1e-3 \
  --esp_w 1000 --n_dcm 1 --type default \
  --log_dir ./runs/water_demo --checkpoint_dir ./checkpoints/water_demo

Notes#

  • For meaningful results, train on many molecules and surfaces; the single-sample demo is for mechanics only.

  • Replace the placeholder monopoles with a reference scheme (e.g., RESP, MBIS) if you use the monopole loss.