OpenMM Tutorial

Complete Guide from Installation to Molecular Dynamics Simulation

Introduction

This tutorial will guide you through the installation and basic usage of OpenMM. We'll start with system requirements, then proceed with installation, and finally learn how to use OpenMM for molecular dynamics simulations.

If you plan to use GPU acceleration, please ensure that CUDA or OpenCL is installed.

Installation Steps

1. Install Python Dependencies

# Create virtual environment
python -m venv openmm-env
source openmm-env/bin/activate  # Linux/macOS
# Or
openmm-env\Scripts\activate  # Windows

# Install dependencies
pip install numpy scipy matplotlib pandas

2. Install OpenMM

# Use conda to install
conda install -c conda-forge openmm

# Or use pip to install
pip install openmm

3. Verify Installation

# Test in Python
import openmm
print(openmm.__version__)

# Test GPU support
from openmm import Platform
print(Platform.getPlatformByName('CUDA').isAvailable())

Basic Usage

1. Create Simulation System

from openmm.app import *
from openmm import *
from openmm.unit import *

# Load PDB file
pdb = PDBFile('protein.pdb')

# Create force field
forcefield = ForceField('amber14-all.xml', 'amber14/tip3pfb.xml')

# Create system
system = forcefield.createSystem(pdb.topology, 
    nonbondedMethod=PME,
    nonbondedCutoff=1*nanometer,
    constraints=HBonds)

2. Set Simulation Parameters

# Create integrator
integrator = LangevinMiddleIntegrator(300*kelvin, 
    1/picosecond, 
    0.004*picoseconds)

# Create simulator
simulation = Simulation(pdb.topology, system, integrator)
simulation.context.setPositions(pdb.positions)

# Energy minimization
simulation.minimizeEnergy()

3. Run Simulation

# Set reporter
simulation.reporters.append(PDBReporter('output.pdb', 1000))
simulation.reporters.append(StateDataReporter('data.csv', 1000, 
    step=True, 
    potentialEnergy=True, 
    temperature=True))

# Run simulation
simulation.step(1000000)  # Run 1 million steps

Advanced Topics

Custom Force Field

# Create custom force field
custom_force = CustomBondForce('k*(r-r0)^2')
custom_force.addPerBondParameter('k')
custom_force.addPerBondParameter('r0')

# Add bond
custom_force.addBond(0, 1, [100.0, 0.15])
system.addForce(custom_force)

Analyze Trajectory

import mdtraj as md

# Load trajectory
traj = md.load('output.pdb')

# Calculate RMSD
rmsd = md.rmsd(traj, traj, 0)

# Calculate secondary structure
ss = md.compute_dssp(traj)

# Save analysis results
import numpy as np
np.savetxt('rmsd.txt', rmsd)

Related Tutorials