Quick Start¶
This tutorial walks through fitting partial charges for ethanol using PyMPFIT.
The full runnable script is at examples/tutorials/quickstart.py.
1. QM and GDMA Settings¶
GDMASettings controls both the Psi4 QM calculation and the
GDMA parameters.
from pympfit import GDMASettings
settings = GDMASettings(
method="pbe0",
basis="def2-SVP",
limit=4,
switch=4.0,
radius=[
"C", 0.53,
"O", 0.53,
"H", 0.53,
],
mpfit_inner_radius=6.78,
mpfit_outer_radius=12.45,
mpfit_atom_radius=3.0,
)
2. Generate a Conformer¶
Create an ethanol molecule and generate a single conformer.
from openff.toolkit import Molecule
from openff.recharge.utilities.molecule import extract_conformers
molecule = Molecule.from_smiles("CCO")
molecule.generate_conformers(n_conformers=1)
[conformer] = extract_conformers(molecule)
3. Generate Multipoles¶
Run Psi4 to compute the wavefunction and GDMA multipole moments.
Setting minimize=True optimizes the geometry at the same level of theory first.
import time
from pympfit import Psi4GDMAGenerator
t0 = time.perf_counter()
coords, multipoles = Psi4GDMAGenerator.generate(
molecule, conformer, settings, minimize=True
)
elapsed = time.perf_counter() - t0
print(f"Multipoles shape: {multipoles.shape}")
print(f"GDMA generation time: {elapsed:.2f}s")
Multipoles shape: (9, 25)
GDMA generation time: 25.22s
4. Fit Charges¶
Create a GDMA record and solve for partial charges using SVD.
from pympfit import MoleculeGDMARecord, MPFITSVDSolver, generate_mpfit_charge_parameter
from openff.units.elements import SYMBOLS
record = MoleculeGDMARecord.from_molecule(molecule, coords, multipoles, settings)
solver = MPFITSVDSolver(svd_threshold=1e-4)
parameter = generate_mpfit_charge_parameter([record], solver)
for i, atom in enumerate(molecule.atoms):
element = SYMBOLS[atom.atomic_number]
print(f" {element}{i + 1:>2d}: {parameter.value[i]:+.4f}")
print(f" Total: {sum(parameter.value):+.4f}")
Fitted charges:
C 1: +0.3348
C 2: +0.4628
O 3: -0.5387
H 4: -0.1124
H 5: -0.1180
H 6: -0.1018
H 7: -0.1065
H 8: -0.1180
H 9: +0.2977
Total: -0.0000