Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
5a613f45
Commit
5a613f45
authored
Oct 22, 2019
by
João Rodrigues
Browse files
Fixed bug in calculation of number of ionic species to add in addMembrane. Addresses #2439
parent
138de127
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
84 additions
and
73 deletions
+84
-73
wrappers/python/simtk/openmm/app/modeller.py
wrappers/python/simtk/openmm/app/modeller.py
+84
-73
No files found.
wrappers/python/simtk/openmm/app/modeller.py
View file @
5a613f45
...
@@ -258,13 +258,16 @@ class Modeller(object):
...
@@ -258,13 +258,16 @@ class Modeller(object):
self
.
topology
=
newTopology
self
.
topology
=
newTopology
self
.
positions
=
newPositions
self
.
positions
=
newPositions
def
_addIons
(
self
,
forcefield
,
replaceableMols
,
ionCutoff
=
0.05
*
nanometer
,
positiveIon
=
'Na+'
,
negativeIon
=
'Cl-'
,
ionicStrength
=
0
*
molar
,
neutralize
=
True
):
def
_addIons
(
self
,
forcefield
,
numWaters
,
replaceableMols
,
ionCutoff
=
0.05
*
nanometer
,
positiveIon
=
'Na+'
,
negativeIon
=
'Cl-'
,
ionicStrength
=
0
*
molar
,
neutralize
=
True
):
"""Adds ions to the system by replacing certain molecules.
"""Adds ions to the system by replacing certain molecules.
Parameters
Parameters
----------
----------
forcefield : ForceField
forcefield : ForceField
the ForceField to use to determine the total charge of the system.
the ForceField to use to determine the total charge of the system.
numWaters : int
the total number of water molecules in the simulation box, used to
calculate the number of ions / concentration to add.
replaceableMols : dict
replaceableMols : dict
the molecules to replace by ions, as a dictionary of residue:positions
the molecules to replace by ions, as a dictionary of residue:positions
ionCutoff: distance=0.5*nanometer
ionCutoff: distance=0.5*nanometer
...
@@ -326,12 +329,13 @@ class Modeller(object):
...
@@ -326,12 +329,13 @@ class Modeller(object):
numPositive
-=
totalCharge
numPositive
-=
totalCharge
if
ionicStrength
>
0
*
molar
:
if
ionicStrength
>
0
*
molar
:
numIons
=
(
num
ReplaceableMol
s
-
numPositive
-
numNegative
)
*
ionicStrength
/
(
55.4
*
molar
)
# Pure water is about 55.4 molar (depending on temperature)
numIons
=
(
num
Water
s
-
numPositive
-
numNegative
)
*
ionicStrength
/
(
55.4
*
molar
)
# Pure water is about 55.4 molar (depending on temperature)
numPairs
=
int
(
floor
(
numIons
+
0.5
))
numPairs
=
int
(
floor
(
numIons
+
0.5
))
numPositive
+=
numPairs
numPositive
+=
numPairs
numNegative
+=
numPairs
numNegative
+=
numPairs
totalIons
=
numPositive
+
numNegative
totalIons
=
numPositive
+
numNegative
if
totalIons
>
0
:
# Randomly select a set of waters
# Randomly select a set of waters
# while ensuring ions are not placed too close to each other.
# while ensuring ions are not placed too close to each other.
modeller
=
Modeller
(
self
.
topology
,
self
.
positions
)
modeller
=
Modeller
(
self
.
topology
,
self
.
positions
)
...
@@ -621,8 +625,11 @@ class Modeller(object):
...
@@ -621,8 +625,11 @@ class Modeller(object):
if
atom
.
element
==
_oxygen
:
if
atom
.
element
==
_oxygen
:
waterPos
[
residue
]
=
newPositions
[
atom
.
index
]
waterPos
[
residue
]
=
newPositions
[
atom
.
index
]
# Total number of waters in the box
numTotalWaters
=
len
(
waterPos
)
# Add ions to neutralize the system.
# Add ions to neutralize the system.
self
.
_addIons
(
forcefield
,
waterPos
,
positiveIon
=
positiveIon
,
negativeIon
=
negativeIon
,
ionicStrength
=
ionicStrength
,
neutralize
=
neutralize
)
self
.
_addIons
(
forcefield
,
numTotalWaters
,
waterPos
,
positiveIon
=
positiveIon
,
negativeIon
=
negativeIon
,
ionicStrength
=
ionicStrength
,
neutralize
=
neutralize
)
class
_ResidueData
:
class
_ResidueData
:
"""Inner class used to encapsulate data about the hydrogens for a residue."""
"""Inner class used to encapsulate data about the hydrogens for a residue."""
...
@@ -1348,7 +1355,6 @@ class Modeller(object):
...
@@ -1348,7 +1355,6 @@ class Modeller(object):
# number get removed from each leaf.
# number get removed from each leaf.
overlapCutoff
=
0.22
overlapCutoff
=
0.22
chain
=
membraneTopology
.
addChain
()
addedWater
=
[]
addedWater
=
[]
addedLipids
=
[]
addedLipids
=
[]
removedFromLeaf
=
[
0
,
0
]
removedFromLeaf
=
[
0
,
0
]
...
@@ -1538,6 +1544,11 @@ class Modeller(object):
...
@@ -1538,6 +1544,11 @@ class Modeller(object):
if
atom
.
element
==
elem
.
oxygen
:
if
atom
.
element
==
elem
.
oxygen
:
waterPos
[
residue
]
=
modeller
.
positions
[
atom
.
index
]
waterPos
[
residue
]
=
modeller
.
positions
[
atom
.
index
]
# Total number of water molecules
# Use this number to avoid underestimating the concentration of ions
# in _addIons after we exclude waters close to lipids.
numTotalWaters
=
len
(
waterPos
)
# Calculate lipid Z boundaries
# Calculate lipid Z boundaries
lipidNames
=
{
res
.
name
for
res
in
patch
.
topology
.
residues
()
if
res
.
name
!=
'HOH'
}
lipidNames
=
{
res
.
name
for
res
in
patch
.
topology
.
residues
()
if
res
.
name
!=
'HOH'
}
lipidZMax
=
sys
.
float_info
.
min
lipidZMax
=
sys
.
float_info
.
min
...
@@ -1559,7 +1570,7 @@ class Modeller(object):
...
@@ -1559,7 +1570,7 @@ class Modeller(object):
if
lowerZBoundary
<
waterZ
.
value_in_unit
(
nanometer
)
<
upperZBoundary
:
if
lowerZBoundary
<
waterZ
.
value_in_unit
(
nanometer
)
<
upperZBoundary
:
del
waterPos
[
wRes
]
del
waterPos
[
wRes
]
self
.
_addIons
(
forcefield
,
waterPos
,
positiveIon
=
positiveIon
,
negativeIon
=
negativeIon
,
ionicStrength
=
ionicStrength
,
neutralize
=
neutralize
)
self
.
_addIons
(
forcefield
,
numTotalWaters
,
waterPos
,
positiveIon
=
positiveIon
,
negativeIon
=
negativeIon
,
ionicStrength
=
ionicStrength
,
neutralize
=
neutralize
)
class
_CellList
(
object
):
class
_CellList
(
object
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment