FlexAppeal molecular dynamics, prepared and analysed

FlexAppeal

A complete run, start to finish

This is T4 lysozyme L99A with benzene bound in its buried non-polar cavity — PDB 181L, X-ray at 1.80 Å — simulated for 100 nanoseconds in explicit water on an Apple M2 Ultra. It is the same three steps the two tabs either side of this one describe: configure a run, run the single file it hands you, upload what comes back.

The ligand is the point. A run with nothing bound draws the whole-system panels and not one of the eleven binding-site panels, so this cavity — the one the literature uses to ask what a buried non-polar site will hold — is what makes the rest of this page real.

1

Prepared

181L loaded from the RCSB, benzene kept and its bond orders taken from the chemical dictionary, hydrogens added at pH 7.4, solvated in a dodecahedral box with 1.2 nm padding and neutralised to 0.15 M NaCl. 3,023 solute atoms became 25,463 with 7,600 waters.

2

Ran

One .command file, run from Terminal. It parameterised benzene with OpenFF 2.2.1 and AM1-BCC charges, benchmarked the machine's platforms, minimised, heated to 310 K, equilibrated for 1 ns while releasing restraints, then produced 100 ns at 4 fs with hydrogen-mass repartitioning — 8.05 hours at 298 ns/day on OpenCL.

3

Analysed

The run packed a .fxa results file: metrics, a decimated trajectory and the topology to view it against. That file is committed to the repository, and it is what this page is rendering.

Reproduce it: the bundle is in the repository at examples/lysozyme_benzene_100ns/flexappeal_lysozyme_benzene_100ns.command. Download it, chmod +x it, and run it. The first run installs the environment; after that it goes straight to simulating.

What it looked like on the machine

Captured from the terminal while this ran, not re-created afterwards: these are the bytes the scripts wrote, replayed through the same library that produced them. The bars are caught mid-stage on purpose — a finished bar sits at 100% with its live readouts gone, which is the one state not worth showing. The one edit is that home directories are shortened to ~.

1 Running run.py

Startup, and the platform benchmark that picks OpenCL
โ                                                                                                                        
โ  activating environment                                                                                                
โ  activating environment                                                                                                
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚  lysozyme_benzene_100ns                                                               โ”‚
โ”‚  100.0 ns ยท amber14-all.xml ยท tip3p in a dodecahedron, 1.2 nm padding, 0.15 M Na+Cl-  โ”‚
โ”‚                                                                                       โ”‚
โ”‚  FlexAppeal 0.1.0   OpenMM 8.5.2.dev-36a30cb   arm64 ยท 24 cores ยท 137.4 GB RAM        โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
[23:12:00] Warning: molecule is tagged as 2D, but at least one Z coordinate is not zero. Marking the mol as 3D.
[23:12:00] WARNING: More than one matching pattern found - picking one
โ„น BNZ: 12 atoms, formal charge +0, c1ccccc1
โš  ligand protonation comes from the RCSB chemical definition, not from the pH above -- check the formal charges printed 
here are the ones you expect at pH 7.4.
โ†’ preparing the structure
โ„น added hydrogens at pH 7.4
โœ“ merged 1 ligand(s) back into the system
โœ“ prepared: 3023 atoms, 300 residues
โ„น wrote prepared.pdb
โ†’ parameterising 1 ligand type(s) with openff-2.2.1 -- this takes a minute or two per molecule
~/Documents/Vibe_Coding/FlexAppeal/.pixi/envs/default/lib/python3.11/site-packages/openff/interchange/components/interch
ange.py:1119: FutureWarning: `torch.distributed.reduce_op` is deprecated, please use `torch.distributed.ReduceOp` 
instead
  if isinstance(obj, functools._lru_cache_wrapper) and obj.__module__.startswith("openff.interchange"):
~/Documents/Vibe_Coding/FlexAppeal/.pixi/envs/default/lib/python3.11/site-packages/openff/interchange/smirnoff/_create.p
y:151: PresetChargesAndVirtualSitesWarning: Preset charges were provided (via `charge_from_molecules`) alongside a force
field that includes virtual site parameters. Note that virtual sites will be applied charges from the force field and 
cannot be given preset charges. Virtual sites may also affect the charges of their orientation atoms, even if those 
atoms are given preset charges.
  warnings.warn(
โœ“ solvated: 25463 atoms, 7600 waters  4s
โ„น wrote solvated.pdb
โœ“ system: 25463 particles, 24119 constraints, 6 forces  0s
โ ‡   relaxing initial clashes -383,220 kJ/mol 464 iterations 648.3 MB rss ยท 77.4 GB free ยท 886.0 MB swap 0:00:04
โœ“ clashes relaxed  4s
โ„น restrained 1290 atoms at 1000.0 kJ/mol/nmยฒ
โ„น platforms available: Reference, CPU, OpenCL
โ†’ benchmarking 2 platforms (CPU, OpenCL)
โ„น   CPU            28.9 ns/day
โš  OpenCL does not support mixed precision here; using single
โ„น   OpenCL        245.7 ns/day
โœ“ using OpenCL at 245.7 ns/day
Parameterising the ligand: the charges that need AmberTools
โ„น BNZ: 12 atoms, formal charge +0, c1ccccc1
โš  ligand protonation comes from the RCSB chemical definition, not from the pH above -- check the formal charges printed 
here are the ones you expect at pH 7.4.
โ†’ preparing the structure
โ„น added hydrogens at pH 7.4
โœ“ merged 1 ligand(s) back into the system
โœ“ prepared: 3023 atoms, 300 residues
โ„น wrote prepared.pdb
โ†’ parameterising 1 ligand type(s) with openff-2.2.1 -- this takes a minute or two per molecule
~/Documents/Vibe_Coding/FlexAppeal/.pixi/envs/default/lib/python3.11/site-packages/openff/interchange/components/interch
ange.py:1119: FutureWarning: `torch.distributed.reduce_op` is deprecated, please use `torch.distributed.ReduceOp` 
instead
Energy minimisation: a spinner, not a bar -- OpenMM's iteration count is not monotonic
โ„น   OpenCL        245.7 ns/day
โœ“ using OpenCL at 245.7 ns/day
โš  OpenCL does not support mixed precision here; using single
โ น   minimising -421,985 kJ/mol 2,268 iterations 801.6 MB rss ยท 77.6 GB free ยท 886.0 MB swap 0:00:18
Heating, 50 K to 310 K
โš  OpenCL does not support mixed precision here; using single
โœ“ minimised over 3,738 iterations: -383,198 โ†’ -423,280 kJ/mol  30s
โ†’ heating 50.0 โ†’ 310.0 K over 100.0 ps
  heating โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•บโ”โ”โ”โ”โ”โ”โ”  62%   258 K 856.9 MB rss ยท 77.5 GB free ยท 886.0 MB swap 0:00:15 00:10
Equilibration, with the positional restraints released in stages
โ†’ heating 50.0 โ†’ 310.0 K over 100.0 ps
โœ“ heated to 310.0 K  25s
โ†’ equilibrating for 1000.0 ps
  equilibrating โ”โ”โ”โ”โ”โ”โ”โ•ธโ”โ”โ”โ”โ”โ”โ”โ”  49%   restraint 100 kJ/mol/nmยฒ 1.3 GB rss ยท 76.7 GB free ยท 886.0 MB swap 0:02:19 02:37
Production: ns/day, resident memory, free memory and swap, all live
โ†’ equilibrating for 1000.0 ps
โœ“ equilibrated  4m39s
โ†’ producing 100.0 ns (25,000,000 steps)
  producing โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•บโ”โ”โ”โ”โ”โ”โ”โ”โ”  50%   306 ns/day 40.7 GB rss ยท 64.1 GB free ยท 877.7 MB swap 4:00:01 --:--
The closing summary
  producing โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” 100%   298 ns/day 34.4 GB rss ยท 59.4 GB free ยท 877.7 MB swap 8:02:45 00:00
โœ“ production complete in 8.05 h (298.3 ns/day)
โœ“ all runs complete
wall time    8h08m                                                                                                
output       ~/Documents/Vibe_Coding/FlexAppeal/examples/lysozyme_benzene_100ns/run/flexappeal_output
peak memory  34.5 GB resident                                                                                     
swap         -8.4 MB added by this run                                                                            
โ„น next: run  ./analyse.py  to build the .fxa results file for the Analysis tab

The memory figures are the reason they are there. A run that spills out of RAM into swap does not slow down a little, it slows by an order of magnitude, and nothing else on screen would tell you. This one never swapped.

2 Then analyse.py

The second script reads the trajectory back, computes the metrics, and packs the results file. One bar carries all of them, relabelled with whichever metric is in flight — SASA and the contact map are the slow ones.

Analysing: one bar across every metric, relabelled as it goes
โ†’ loading trajectory.xtc
โœ“ 10000 frames, 2615 atoms, 100.0 ns
โ„น re-imaged molecules (undoing periodic wrapping)
  contact map โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•ธโ”โ”โ”โ”โ”  80% 1.8 GB rss ยท 84.5 GB free 0:17:38
Packing the results file the Analysis tab reads
standard error is already a few tenths of a kcal/mol at this many
โ„น packing 500 frames of 2615 atoms (standard tier, stride 20)
โœ“ wrote lysozyme_benzene_100ns.fxa (12.9 MB)
โ†’ building the version 2 package
โ†’ measuring BNZ against 181L
mdtraj/rmsd/src/theobald_rmsd.cpp UNCONVERGED ROTATION MATRIX. RETURNING IDENTITY=300
mdtraj/rmsd/src/theobald_rmsd.cpp UNCONVERGED ROTATION MATRIX. RETURNING IDENTITY=300
โœ“ wrote lysozyme_benzene_100ns_package.fxa (2.6 MB)
โš  this package carries one complex, which is a first-class graded run: it gets a letter, a score and five of the six 
sub-scores, because those five are ramps against absolute thresholds and need no cohort. What stays empty is what does 
need one -- the league table, both rank columns, and the energy sub-score, which is a percentile within a receptor's own
cohort and is recorded as pending rather than scored as zero. Collect runs into a study where you can; never hold one 
back because it is alone.
โš  lysozyme_benzene_100ns: read every 5 frames, which keeps the measurement inside 2000 frames. Every scalar here is a 
statistic over the scored window and is unchanged by it; the frame spacing in the manifest describes the frames actually
written
โœ“ 1 results file(s) ready

That .fxa is the file every panel below is rendered from.

Every setting this run used

All 120 options, grouped as the Prepare tab groups them and read from the registry rather than written out here, so a new option appears the day it is added. Values changed from the default are marked •; the rest are defaults, which for a reference run is worth being able to see rather than having to assume.

๐Ÿท๏ธ Job 4 options, 1 changed
SettingValueOpenMM
• Job name lysozyme_benzene_100ns
Description โ€”
Author โ€”
Output directory ./flexappeal_output
๐Ÿงฌ Input structure 16 options, 1 changed
SettingValueOpenMM
Structure source upload
Structure file None
PDB ID โ€”
UniProt accession โ€”
Assembly asymmetric
Model 1
Chains to keep *
Alternate locations occupancy
Keep crystallographic waters yes
Water shell radius 5.0 ร…
• Heteroatoms to keep BNZ
Discard input hydrogens yes
Disulfide bonds auto
Disulfide detection cutoff 2.5 ร…
Disulfide pairs โ€”
Terminal caps charged
๐Ÿฉน Structure repair 8 options
SettingValueOpenMM
Build missing residues yes findMissingResidues
Longest gap to build 25 residues
Build missing terminal residues no
Replace non-standard residues yes replaceNonstandardResidues
Add missing heavy atoms yes addMissingAtoms
pH 7.4 addMissingHydrogens
Protonation overrides โ€”
Mutations โ€” applyMutations
โš›๏ธ Force field 11 options, 1 changed
SettingValueOpenMM
Protein force field amber14-all.xml ForceField
Water model tip3p
Solvent treatment explicit
Implicit solvent model implicit/gbn2.xml
Implicit salt concentration 0.15 M
Solute dielectric 1.0
Solvent dielectric 78.5
Small-molecule force field openff-2.2.1 SystemGenerator
Ligand partial charges am1bcc
• System contains ligands or cofactors yes
Additional force-field XML None
๐Ÿ’ง Solvation and box 9 options
SettingValueOpenMM
Box shape dodecahedron addSolvent
Box sizing padding
Solvent padding 1.2 nm
Box vectors โ€” nm
Number of waters 10000
Positive ion Na+
Negative ion Cl-
Ionic strength 0.15 M
Neutralise the system yes
๐Ÿงฑ Membrane 5 options
SettingValueOpenMM
Embed in a lipid bilayer no addMembrane
Lipid POPC
Orientation opm
Membrane centre (z) 0.0 nm
Minimum padding 1.0 nm
๐Ÿ”ง System 11 options
SettingValueOpenMM
Non-bonded method PME PME
Non-bonded cutoff 1.0 nm createSystem
Use a switching function no
Switching distance 0.9 nm
Ewald error tolerance 0.0005
Bond constraints HBonds HBonds
Rigid water yes
Hydrogen mass repartitioning yes createSystem
Hydrogen mass 1.5 amu
Remove centre-of-mass motion yes CMMotionRemover
Long-range dispersion correction yes setUseDispersionCorrection
โฑ๏ธ Integrator 8 options
SettingValueOpenMM
Integrator LangevinMiddle LangevinMiddleIntegrator
Temperature 310.0 K
Friction coefficient 1.0 psโปยน
Timestep 4.0 fs
Error tolerance 0.0001
Add an Andersen thermostat no AndersenThermostat
Collision frequency 1.0 psโปยน
Random seed 0
๐ŸŽˆ Pressure control 7 options
SettingValueOpenMM
Pressure control MonteCarlo MonteCarloBarostat
Pressure 1.0 bar
Barostat interval 25 steps
Surface tension 0.0 barยทnm
XY coupling XYIsotropic
Z coupling ZFree
Per-axis pressure 1.0, 1.0, 1.0 bar
๐Ÿ“Œ Restraints 5 options
SettingValueOpenMM
Restrain the solute during equilibration yes CustomExternalForce
Restrained atoms protein_heavy
Restraint force constant 1000.0 kJ/mol/nmยฒ
Release schedule 1000, 500, 100, 10, 0 kJ/mol/nmยฒ
Distance restraints โ€”
๐Ÿ“ˆ Protocol 10 options
SettingValueOpenMM
Energy minimisation yes minimizeEnergy
Minimisation tolerance 10.0 kJ/mol/nm
Maximum minimisation steps 0
Heating 100.0 ps
Starting temperature 50.0 K
Heating stages 5
Equilibration 1000.0 ps
Production 100.0 ns
Replicates 1
Replicate seeds sequential
๐Ÿ’พ Output and reporting 10 options
SettingValueOpenMM
Trajectory format xtc XTCReporter
Trajectory write interval 10.0 ps
Atoms to save protein_ligand
Custom atom selection โ€”
Wrap coordinates into the box yes
Energy log interval 10.0 ps
Energy log fields step, time, potentialEnergy, kineticEnergy, totalEnergy, temperature, volume, density, speed, progress, remainingTime StateDataReporter
Checkpoint interval 100.0 ps CheckpointReporter
Save serialised system yes
Save the solvated structure yes
๐Ÿš€ Platform and performance 6 options
SettingValueOpenMM
Compute platform auto getPlatformByName
Precision mixed
CPU threads 0
Deterministic forces no
Device index โ€”
Refuse to start if memory is short yes
๐Ÿ“Š Analysis 5 options
SettingValueOpenMM
Metrics to compute rmsd, rmsf, rgyr, sasa, dssp, hbonds, contacts, pca, clusters
Reference structure first
Alignment selection backbone
Custom measurements โ€”
Results file size standard
๐ŸŽฏ Reference states 5 options
SettingValueOpenMM
Score against experimental reference states not recorded in this file
Protein family not recorded in this file
Catalogue name not recorded in this file
Reference PDB entry not recorded in this file
References per state not recorded in this file

The analysis, exactly as the Analysis tab renders it

lysozyme_benzene_100ns

tip3p ยท 310.0 K ยท 4.0 fs ยท OpenMM 8.5.2.dev-36a30cb

Simulated
100ns
Frames
10,000

500 packed for viewing

Final RMSD
0.95ร…

mean of the last 10% of frames

Radius of gyration
16.63ร…

trajectory mean

Hydrogen bonds
308

occupancy > 10%

Helix content
62%

trajectory mean

Throughput
298ns/day

OpenCL

Wall time
8.1h
Settles after
0.5ns

1% of production, by pymbar.detect_equilibration

Force field
amber14-all.xml
Platform
OpenCL
Structure
181l.pdb

Structure

The decimated trajectory, 500 frames of 2615 atoms. Press play, or scrub the frame slider: the plots below highlight the frame you are on.

Two-dimensional structure of the ligand, each atom shaded by how far it moved over the scored window
mobility Each atom is shaded by how far it moved over the scored window, in six bands of half an angstrom: deep indigo for an atom that held still, through to amber for 3.0 angstrom and over. The bands are the same on every diagram, so a still ligand reads as still rather than being stretched to fill the scale.
0.0 ns

Loading the structureโ€ฆ

The binding site

A 86.8/100
Pose 100.0 32%
Occupancy 100.0 21%
Interactions 100.0 21%
Energy -9.9 kcal/mol ยฑ 6.6 16.5 16%
Convergence 100.0 10%
Conformation the ligand has no rotatable bond — 5%

Ligand pose

Two fits of the same ligand. Against the pocket, the curve is the ligand moving in a receptor held still; against itself, it is the ligand changing shape. The shaded head is the equilibration that was measured and not scored.

Centroid drift

Displacement of the ligand centroid from where it started. The dotted line at 5 ร… is the drift beyond which DeepFlex caps a grade.

Pocket occupancy

Receptor residues in contact with the ligand. The dotted line is a quarter of the contacts present at the start, which is the threshold for counting a frame as still bound.

Interaction occupancy

Which contacts carried the pose, and for how much of the scored window. Typed from heavy-atom geometry, so these are polar, ionic and hydrophobic contacts rather than a full interaction fingerprint.

Contact barcode

When each contact was present, busiest first. Gaps are the contact breaking and reforming.

Pose clusters

How the scored window divides into distinct poses. One tall bar near zero is a ligand that held its pose.

Ligand atom fluctuation

Which part of the ligand moves, about its own mean position.

Receptor flexibility

Per-residue backbone fluctuation, with the binding-site residues marked. A mobile pocket makes every pose measurement noisier.

Frame-to-frame RMSD

Every frame against every other. Blocks along the diagonal are distinct states; a uniform field is a run that stayed in one.

Residue cross-correlation

Which parts of the receptor move together. Blue is correlated, red is anticorrelated.

MM/GBSA, term by term

Where the binding energy comes from. The bars are the difference block, complex minus receptor minus ligand, which is the only part of an MM/GBSA calculation that is a binding quantity. Error bars are the standard deviation over the sampled frames, not the standard error. igb=2, single trajectory, no entropy term: good for ranking ligands against each other, not an affinity.

The whole system

RMSD

How far the structure has moved from its reference. A plateau means the trajectory has settled; a steady climb means it has not.

Radius of gyration

Global compactness. A rise suggests unfolding or expansion.

Per-residue fluctuation

Which parts of the molecule move. Peaks are usually loops and termini.

Solvent exposure

Total solvent-accessible surface area over time.

Secondary structure content

Helix and sheet content over the trajectory.

Secondary structure timeline

Per-residue assignment at every frame. Vertical stripes are transient melting; horizontal bands are stable elements.

Contact map

How often each residue pair is in contact across the whole trajectory.

Essential dynamics

The two dominant collective motions, with each frame coloured by time. Distinct clouds mean distinct conformational states.

Conformational clusters

Representative states found by RMSD clustering.

Convergence

Each measure on its own axis. Energies, temperature and density differ by orders of magnitude, so sharing a plot between any two of them would make their alignment arbitrary and any apparent correlation fictional.

Ask something else

Compute a metric the run did not, or restrict one to part of the molecule. This runs on the server against the trajectory packed in your results file, so it is bounded: one job at a time, and a size limit. This is a standard-tier file โ€” it carries a thinned trajectory, so answers here are coarser than the panels above. Rebuild with the full tier for the richest re-analysis.

MDTraj selection syntax. protein, name CA, chainid 0 and backbone, resname BEN. Use resSeq for the residue numbers you see in the PDB โ€” resid is a zero-based index into the topology, so resid 195 is rarely residue 195.

Run details

Every value is read from the results file's manifest.
Simulated time100.000 ns
Frames analysed10,000
Frames packed500 (standard tier)
Force fieldamber14-all.xml
Water modeltip3p
Temperature310.0 K
Timestep4.0 fs
PlatformOpenCL
Throughput298.29 ns/day
Wall time8.05 h
OpenMM8.5.2.dev-36a30cb
FlexAppeal0.1.0
MachineDarwin 27.0.0 (arm64)
Metrics computedrmsd, rmsf, rgyr, sasa, dssp, hbonds, contacts, pca, clusters

Everything above is generated from the results file this run produced, by the same code that renders an upload. Try it with your own: prepare a run, or upload a results file.