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.
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.
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.
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
โ โ 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
โน 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
โน 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
โ 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
heating โ K over ps heated to K equilibrating for ps restraint 100 kJ/mol/nmยฒ
โ 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 --:--
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.
โ 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
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
| Setting | Value | OpenMM | |
|---|---|---|---|
| • | Job name | lysozyme_benzene_100ns | |
| Description | โ | ||
| Author | โ | ||
| Output directory | ./flexappeal_output |
Input structure 16 options, 1 changed
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
| Setting | Value | OpenMM | |
|---|---|---|---|
| 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
- 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.
Loading the structureโฆ
The binding site
| 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 | — |
|
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.
Measured between the centres of the two selections, after undoing periodic wrapping.
Run details
| Simulated time | 100.000 ns |
|---|---|
| Frames analysed | 10,000 |
| Frames packed | 500 (standard tier) |
| Force field | amber14-all.xml |
| Water model | tip3p |
| Temperature | 310.0 K |
| Timestep | 4.0 fs |
| Platform | OpenCL |
| Throughput | 298.29 ns/day |
| Wall time | 8.05 h |
| OpenMM | 8.5.2.dev-36a30cb |
| FlexAppeal | 0.1.0 |
| Machine | Darwin 27.0.0 (arm64) |
| Metrics computed | rmsd, 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.