File size: 7,748 Bytes
f12d3b3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | # Free-PROTAC molecular dynamics
Explicit-solvent MD of a generated PROTAC on its own, with no target protein and
no E3 ligase. Runs in chloroform (a membrane-interior mimic) and in water, and
measures the conformational descriptors published work ties to cell
permeability: radius of gyration, 3D polar surface area, intramolecular
H-bonds, and conformational state populations.
The protocol follows "Linker-Dependent Folding Rationalizes PROTAC Cell
Permeability" (*J. Med. Chem.* 2022, DOI 10.1021/acs.jmedchem.2c00877) and takes
its permeability cutoffs from Atilaw et al., *ACS Med. Chem. Lett.* 2021, 12,
107-114. `reference_protocol.md` has the settings and the target numbers.
## Layout
```
protac_md.py MD driver: conformer -> parametrize -> solvate -> replicas
analyze_conformations.py Rg / RMSD / 3D PSA / H-bonds / clustering dashboard
rg_basins.py Rg free-energy profiles and basin populations
psa_ensemble.py 3D PSA over a finished ensemble
ternary_span.py warhead-to-E3 span distribution (water ensembles)
validate_psa.py PSA code path checked against grazoprevir
psa_method_probe.py element vs charge-threshold polar-atom selection
plot_results.py per-replica summary figure
render_3d.py extended and collapsed conformations from a trajectory
run_candidate.sh detached driver: chloroform + water + analysis
environment_md.yml conda environment
protacmd-lock-linux64.txt pinned environment, linux-64
reference_protocol.md reference protocol and permeability yardsticks
linker_design.md linker rules read off this project's own MD runs
```
PROTAC SMILES are embedded in `protac_md.py` (`CANDIDATES`), so no input files
are needed; anything else runs through `--smiles`.
## Environment
On linux-64 with a CUDA 12 capable driver (525 or newer), use the lockfile and
skip dependency solving:
```
conda create --name protacmd --file protacmd-lock-linux64.txt
conda activate protacmd
pip install "setuptools<81"
```
That reproduces the environment: openmm 8.5.2, ambertools 24.8,
rdkit 2025.09.5, openff-toolkit 0.16.10, python 3.10.20. The lockfile carries no
`packmol`, which `--solvent chloroform` needs, so add it afterwards
(`conda install -c conda-forge packmol`) or solve from the yml instead.
Elsewhere, solve from the yml. Check the driver's CUDA version with
`nvidia-smi` first and edit `cuda-version` in `environment_md.yml` to match
(remove it entirely for CPU-only):
```
conda env create -f environment_md.yml
conda activate protacmd
```
The solve takes around ten minutes: ambertools has a large dependency tree and
libmamba is single-threaded, so the spinner sits still while one core works. The
install itself takes seconds. Keep `setuptools<81` in the `pip:` section rather
than as a conda dependency; an upper bound on setuptools triples the solve time.
Activation is not optional. `sqm`, `antechamber` and `packmol` are only on PATH
inside the env, and calling `<env>/bin/python` directly is not enough.
## Run
```
conda activate protacmd
# chloroform: the membrane mimic, the permeability-relevant run
python protac_md.py --solvent chloroform --replicas 3 --prod-ns 50 --gpu 0
# water: the polar reference; the pair shows chameleonic folding
python protac_md.py --solvent water --replicas 3 --prod-ns 50 --gpu 0
python analyze_conformations.py --dir egfrvhl_rank4/chloroform --name egfrvhl_rank4
python analyze_conformations.py --dir egfrvhl_rank4/water --name egfrvhl_rank4
```
Useful flags: `--candidate {egfrvhl_rank4,egfrvhl_rank5,brd9vhl_rank1,cdk6crbn_rank2}`,
`--smiles "<custom>"` with `--name ms39_ref` for a reference compound,
`--platform CPU`, `--prod-ns`, `--replicas`, `--gpu N`.
Output lands in `<name>/<solvent>/rep<k>/` (`*_prod.dcd`, `*_prod.csv`, PDBs),
with the dashboard and the cluster centroid PDBs in `<name>/<solvent>/`.
`run_candidate.sh` chains both solvents and both analyses for one candidate and
reuses the chloroform charge cache for water, so AM1-BCC is paid once.
Smoke test on a new machine first, about two minutes:
```
python protac_md.py --solvent chloroform --replicas 1 --prod-ns 0.05 \
--heat-ps 5 --equil-ps 10 --report-ps 1 --min-iters 1000 --name smoke
python analyze_conformations.py --dir smoke/chloroform --name smoke --clusters 4
```
## Comparing finished runs
These take run directories, one per compound. `ms39_ref` is not bundled: run the
pipeline on MS39 yourself with `--smiles ... --name ms39_ref`. Its components
and exact linker are in `../src/protac/ErlotinibVHL.py`.
```
python rg_basins.py egfrvhl_rank4 ms39_ref --solvents chloroform water
python psa_ensemble.py egfrvhl_rank4 ms39_ref --solvent chloroform
python ternary_span.py egfrvhl_rank4 ms39_ref
```
## Hardware and runtime
The system is small, 2500-2800 atoms, so it is GPU-latency-bound rather than
memory-bound and fits in under 2 GB of VRAM.
| Platform | Speed | 50 ns x 3 x 2 solvents |
|---|---|---|
| Free A100 | ~1100 ns/day | ~6.5 h |
| Shared GPU (~75% busy) | ~32 ns/day | ~9 days |
| CPU (16 threads) | ~28 ns/day | ~10 days |
A shared GPU is about 35x slower than a free one and no faster than CPU, so use
an idle card. Replicas run sequentially in one process; parallelize by launching
one process per GPU.
The reference converged within 5-10 ns; 50 ns x 3 leaves a wide margin. Confirm
with the RMSD plateau and the replica-mean spread in the dashboard, and extend
if either is still drifting.
## Known failure modes
1. `ModuleNotFoundError: No module named 'pkg_resources'` at `SystemGenerator`.
`openff.amber_ff_ports` imports `pkg_resources`, which setuptools 81 removed.
Install `setuptools<81`.
2. `OSError: Packmol not found`, chloroform only. `pack_box` resolves `packmol`
through PATH, so the env has to be activated, and so does `sqm` /
`antechamber` for AM1-BCC charges.
3. Charge assignment is slow, one to three minutes on a single CPU core, and
happens inside `create_system`. Wrapping the run in a short `timeout` kills it
mid-charge and leaves a 0-byte `ff_cache.json`. Charges are cached per
molecule in `<name>/<solvent>/ff_cache.json`; copying a populated cache in
skips the step.
4. Never select the PROTAC by atom name or element. It carries its own Cl, and
counterions named `Na`/`Cl` slip past naive regexes, which inflated Rg by
about 13%. Every script here selects it by residue instead: the non-water
residue with more than 5 atoms.
5. mdtraj mislabels DCD frame times, so `traj.time` is not trustworthy. Derive
time from the frame index times `--report-ps`, as the scripts do.
## Scope
The simulations show that a generated PROTAC is physically sane and describe its
conformational ensemble, extended versus folded, along with the folding-linked
permeability descriptors. That is the same scope as the reference work, which
also simulates the free PROTAC only.
They do not show that a linker works as a degrader. Degradation needs a
productive ternary complex of target, PROTAC and E3, which is a different
simulation. `ternary_span.py` describes the span a linker can hold, not whether
a complex forms.
Folding propensity only means something against a baseline, so run the same
pipeline on a reference PROTAC (`--smiles ... --name ms39_ref`) alongside each
candidate.
Yardsticks, from the 2022 MD paper: a compact minimum at Rg 5.4-5.6 A, and 3D
PSA 190-265 A^2 for the permeable compounds against 290-330 A^2 for the poorly
permeable one. From Atilaw 2021: passive permeability below Rg 7 A, and
low-to-moderate permeability up to roughly 200-210 A^2. The 7 A cutoff on its
own does not separate the 2022 compounds; see `reference_protocol.md`.
|