IMP
2.0.0
The Integrative Modeling Platform
Main Page
Related Pages
Modules
Namespaces
Classes
Files
Examples
File List
File Members
charmm_forcefield.py
1
## \example atom/charmm_forcefield.py
2
## In this example, a PDB file is read in and scored using the CHARMM forcefield. For more control over the setup of the forcefield, see the 'charmm_forcefield_verbose.py' example.
3
##
4
5
import
IMP.atom
6
import
IMP.container
7
8
# Create an IMP model and add a heavy atom-only protein from a PDB file
9
m =
IMP.Model
()
10
prot =
IMP.atom.read_pdb
(
IMP.atom.get_example_path
(
"example_protein.pdb"
), m,
11
IMP.atom.NonWaterNonHydrogenPDBSelector
())
12
13
# Read in the CHARMM heavy atom topology and parameter files
14
ff =
IMP.atom.get_heavy_atom_CHARMM_parameters
()
15
16
# Using the CHARMM libraries, determine the ideal topology (atoms and their
17
# connectivity) for the PDB file's primary sequence
18
topology = ff.create_topology(prot)
19
20
# Typically this modifies the C and N termini of each chain in the protein by
21
# applying the CHARMM CTER and NTER patches. Patches can also be manually
22
# applied at this point, e.g. to add disulfide bridges.
23
topology.apply_default_patches()
24
25
# Make the PDB file conform with the topology; i.e. if it contains extra
26
# atoms that are not in the CHARMM topology file, remove them; if it is
27
# missing atoms (e.g. sidechains, hydrogens) that are in the CHARMM topology,
28
# add them and construct their Cartesian coordinates from internal coordinate
29
# information.
30
topology.setup_hierarchy(prot)
31
32
# Set up and evaluate the stereochemical part (bonds, angles, dihedrals,
33
# impropers) of the CHARMM forcefield
34
r =
IMP.atom.CHARMMStereochemistryRestraint
(prot, topology)
35
m.add_restraint(r)
36
37
# Add non-bonded interaction (in this case, Lennard-Jones). This needs to
38
# know the radii and well depths for each atom, so add them from the forcefield
39
# (they can also be assigned manually using the XYZR or LennardJones
40
# decorators):
41
ff.add_radii(prot)
42
ff.add_well_depths(prot)
43
44
# Get a list of all atoms in the protein, and put it in a container
45
atoms =
IMP.atom.get_by_type
(prot, IMP.atom.ATOM_TYPE)
46
cont =
IMP.container.ListSingletonContainer
(atoms)
47
48
# Add a restraint for the Lennard-Jones interaction. This is built from
49
# a collection of building blocks. First, a ClosePairContainer maintains a list
50
# of all pairs of Particles that are close. Next, all 1-2, 1-3 and 1-4 pairs
51
# from the stereochemistry created above are filtered out.
52
# Then, a LennardJonesPairScore scores a pair of atoms with the Lennard-Jones
53
# potential. Finally, a PairsRestraint is used which simply applies the
54
# LennardJonesPairScore to each pair in the ClosePairContainer.
55
nbl =
IMP.container.ClosePairContainer
(cont, 4.0)
56
nbl.add_pair_filter(r.get_pair_filter())
57
58
sf =
IMP.atom.ForceSwitch
(6.0, 7.0)
59
ps =
IMP.atom.LennardJonesPairScore
(sf)
60
m.add_restraint(
IMP.container.PairsRestraint
(ps, nbl))
61
62
# it gets awfully slow with internal checks
63
IMP.base.set_check_level
(IMP.base.USAGE)
64
# Finally, evaluate the score of the whole system (without derivatives)
65
print
m.evaluate(
False
)