MagNET / README.md
ekwan16's picture
sync code from github@875f06d07abc1ec4aed2c0c30f7854eabb835235
997ca82 verified
|
Raw
History Blame Contribute Delete
9.48 kB
---
license: mit
tags:
- chemistry
- nmr
- chemical-shift-prediction
- molecular-property-prediction
- equiformer
---
# MagNET
MagNET is a family of neural networks for predicting NMR chemical shifts. This repository contains all models, datasets, and code to reproduce the data in the MagNET paper.
### Contents
| item | contents |
|---|---|
| `magnet/` | the importable model package |
| `data/` | the *sigma* datasets and other auxiliary datasets |
| `analysis/` | scripts for reproducing figures and tables |
| `model_checkpoints/` | weights for the four MagNET models |
### MagNET Models
| Model | Description | Details |
|---|---|---|
| **MagNET** | foundation model | <ul><li>for near-equilibrium geometries</li><li>trained on PBE0/pcSseg-1/gas shieldings</li></ul> |
| **MagNET-Zero** | high-quality gas-phase solute shieldings | <ul><li>use AIMNet2-optimized geometries</li><li>WP04/pcSseg-2 (<sup>1</sup>H shieldings)</li><li>ωB97X-D/pcSseg-2 (<sup>13</sup>C shieldings)</li></ul> |
| **MagNET-PCM** | implicit solvent corrections | <ul><li>shielding(PCM) - shielding(gas)</li><li>use AIMNet2-optimized geometries</li><li>computed at B3LYP-D3(BJ)/pcSseg-2/chloroform</li></ul> |
| **MagNET-x** | explicit solvent corrections | <ul><li>shielding(solute+solvent) - shielding(solute)</li><li>supports chloroform, benzene, methanol, and water</li><li>use classical MD geometries</li><li>trained at PBE0/pcSseg-1</li></ul> |
All models use Equiformer-V2 and have approximately 10M weights. Separate weights are given for <sup>1</sup>H and <sup>13</sup>C prediction. Input structures can contain H, C, N, O, F, Cl, and S (inference should not be performed on structures with unsupported elements).
### *sigma* Datasets
| Dataset | Details |
|---|---|
| **_sigma_-shake** | <ul><li>4.4M solutes from GDB-13/17 with functional group augmentation</li><li>stationary and quasiclassically perturbed structures at B3LYP-D3(BJ)/6-31G\*</li><li>PBE0/pcSseg-1/gas shieldings</li></ul> |
| **_sigma_-fresh** | <ul><li>10K representative natural product, drug-like, sugar, and peptide solutes dissolved in benzene, chloroform, methanol, and water</li><li>~10 computed poses/solute with many more solvated geometries available</li><li>462K poses have computed PBE0/pcSseg-1 shieldings</li></ul> |
| **_sigma_-pepper** (part 1) | <ul><li>GDB molecules with ≤ 10 heavy atoms</li><li>AIMNet2 stationary structures</li><li>PBE0/pcSseg-1 shieldings</li></ul> |
| **_sigma_-pepper** (part 2) | <ul><li>GDB molecules with ≤ 9 heavy atoms</li><li>AIMNet2 stationary structures</li><li>WP04/pcSseg-2/gas (<sup>1</sup>H shieldings)</li><li>ωB97X-D/pcSseg-2/gas (<sup>13</sup>C shieldings)</li></ul> |
| **_sigma_-concentrate** | <ul><li>50K random structures from *sigma*-shake</li><li>PCM(chloroform) corrections at B3LYP/pcSseg-2</li></ul> |
### Installing MagNET
1. Install MagNET and its dependencies.
**Option A: Model Only via PyPI (won't work until publication)**
```bash
pip install torch==2.5.0 --index-url https://download.pytorch.org/whl/cpu
pip install magnet-nmr
pip install torch_scatter torch_cluster --find-links https://data.pyg.org/whl/torch-2.5.0+cpu.html
```
**Option B: Full Installation**
```bash
git clone https://github.com/ekwan/MagNET
cd MagNET
pip install torch==2.5.0 --index-url https://download.pytorch.org/whl/cpu
pip install -r magnet/requirements.txt
pip install --no-deps ./magnet
```
2. **Fetch Model Weights**
```bash
pip install "huggingface_hub[cli]"
hf download ekwan16/MagNET --local-dir . --include "model_checkpoints/*"
```
The model weights will be downloaded into the working directory. No repository cloning is needed, as MagNET will automatically check the current directory for weights. Alternatively, you may pass the `checkpoints_dir` parameter to the inference methods.
3. **Check the Installation**
`python -c "import magnet"`
This should work with no errors.
### Your First Prediction
Let's predict the <sup>1</sup>H and <sup>13</sup>C shifts of acetone in chloroform. `predict_shifts`
takes an AIMNet2-optimized geometry and runs MagNET-Zero, MagNET-PCM, and the paper's scaling for you.
```python
import numpy as np
import magnet
# acetone, (CH3)2C=O, on an AIMNet2-optimized geometry (Angstrom)
atomic_numbers = np.array([6, 6, 8, 6, 1, 1, 1, 1, 1, 1]) # supported elements: H C N O F Cl S
geometry = np.array([
[ 1.2913, -0.5947, -0.0016], # C methyl
[ 0.0029, 0.1931, -0.0010], # C carbonyl
[-0.0174, 1.3994, -0.0003], # O
[-1.2743, -0.6189, 0.0004], # C methyl
[-1.0822, -1.6899, 0.0014], # H
[-1.8597, -0.3513, 0.8791], # H
[-1.8605, -0.3530, -0.8783], # H
[ 1.3415, -1.2208, 0.8916], # H
[ 1.3170, -1.2669, -0.8614], # H
[ 2.1415, 0.0788, -0.0298], # H
])
shifts = magnet.predict_shifts(atomic_numbers, geometry, solvent="chloroform") # per-atom ppm
```
`shifts` has one value per atom (NaN where the atom is neither <sup>1</sup>H nor <sup>13</sup>C).
Averaging acetone's chemically-equivalent atoms by index:
```python
sites = {
"carbonyl 13C": [1],
"methyl 13C": [0, 3],
"methyl 1H": [4, 5, 6, 7, 8, 9],
}
for name, indices in sites.items():
print(f"{name:<13} {shifts[indices].mean():6.2f} ppm")
```
The predictions are close to experiment:
| site | MagNET | experiment (CDCl<sub>3</sub>) |
|---|---|---|
| carbonyl <sup>13</sup>C | 207.6 | 207.07 |
| methyl <sup>13</sup>C | 30.7 | 30.92 |
| methyl <sup>1</sup>H | 2.20 | 2.17 |
**Notes:**
- **Passes and symmetry.** `n_passes` (default 10) averages out equivariance error over the specified number of forward passes. If `symmetrize` (default True) is set, an additional `n_passes` are also performed on the mirror image of the input geometry (for a total of `2*n_passes`).
- **Geometry.** MagNET-Zero and MagNET-PCM require [AIMNet2](https://github.com/isayevlab/AIMNet2)-optimized geometries. Do not use other geometries.
- **Components.** Pass `return_components=True` to also get the MagNET-Zero shielding, the MagNET-PCM correction, and the scaling coefficients behind each shift, as a `dict`.
- **Other models.** For raw shieldings and solvent corrections, see the [API documentation](#api-documentation).
### Getting the datasets
The supporting datasets for this paper are large (42 GB) and are [archived on Hugging Face](https://huggingface.co/ekwan16/MagNET). To fetch everything:
hf download ekwan16/MagNET --local-dir .
If you only want to download a single dataset, add
`--include "data/<name>/*"` with one of the names below.
| dataset | size | contents |
|---|---|---|
| `sigma-shake` | 2.2 GB | 4.4M GDB solutes, perturbed geometries, PBE0/pcSseg-1 shieldings |
| `sigma-fresh` | 30 GB | 10K solutes in explicit benzene, chloroform, methanol, and water |
| `sigma-pepper` | 501 MB | AIMNet2 GDB structures used to train MagNET-Zero and MagNET-PCM |
| `sigma-concentrate` | 17 MB | PCM corrections on 50K *sigma*-shake structures |
| `delta22` | 2.5 GB | experimental <sup>1</sup>H/<sup>13</sup>C shifts with matched DFT and MagNET predictions |
| `dft8k` | 12 MB | external benchmark of 7111 organics |
| `gdb_qcd` | 291 MB | quasiclassical dynamics of 2461 GDB molecules |
| `magnet_test_predictions` | 822 MB | MagNET predictions and DFT targets |
| `applications` | 5.1 GB | natural product MD geometries and experimental shifts |
| `supertestset_magnet_x` | 1.2 MB | explicit solvent test set for MagNET-x |
### Reproducing Figures and Tables
Each figure and table in the paper is produced by a notebook under `analysis/`.
1. Use the **Option B** checkout.
2. [Download](#getting-the-datasets) the datasets.
3. Install the analysis dependencies: `pip install -r requirements.txt`
4. Run the analysis scripts: `python reproduce.py`
If you want to reproduce specific items: `python reproduce.py fig3 s10`
The notebooks are stored without outputs. Running a notebook outputs its figures into `figures/` and its tables into `documents/`.
### Running the Tests
```bash
pip install -r requirements.txt "pytest>=7"
pytest
```
The tests use small synthetic fixtures. If the large files are present, then more comprehensive tests will run. The `magnet` package tests need the Option B checkout with the inference stack installed (`pip install -r magnet/requirements.txt`); without PyTorch they are skipped.
### API Documentation
You can render the API docs with [pdoc](https://pdoc.dev):
pip install pdoc
python build_api_docs.py
Most people will only want to look at `api_docs/magnet.html` (the public API), though the other functions are documented as well.
### How to Cite
"Chemical Shift Prediction Beyond the Electronic Structure Limit."
Adams, K.; Wagen, C.C.; Wolford, J.; Sak, M.H.; Saurí, J.; Feng, Z.; Bhadauria, A.S.; Bailey, M.A.; Downs, J.S.; Li, S.Z.; Liu, A.I.; Smidt, T.; Paton, R.S.; Liu, R.Y.; Coley, C.W.\*; Kwan, E.E.\*
*submitted*, July 2026.
### License
- The original code, model weights, and datasets in this repository are released under the MIT License (see [`LICENSE`](LICENSE)).
- Third-party literature data redistributed here remains subject to its original publications' terms and should be
cited accordingly: CP3 (`data/cp3/`, Smith and Goodman), NS372
(`data/ns372/`, Schattenberg and Kaupp), DFT8K (`data/dft8k/`, Guan and Paton), and DELTA50 (`data/delta50/`, Cohen *et al.*).