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
5120bb0d
Commit
5120bb0d
authored
Jan 19, 2016
by
peastman
Browse files
Merge pull request #1349 from jchodera/fix-ionic-strength
Fix error in ionicStrength definition in Modeller.addSolvent()
parents
6b3a8337
4b2ef27c
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
87 additions
and
88 deletions
+87
-88
wrappers/python/simtk/openmm/app/modeller.py
wrappers/python/simtk/openmm/app/modeller.py
+5
-4
wrappers/python/tests/TestModeller.py
wrappers/python/tests/TestModeller.py
+82
-84
No files found.
wrappers/python/simtk/openmm/app/modeller.py
View file @
5120bb0d
...
@@ -264,7 +264,7 @@ class Modeller(object):
...
@@ -264,7 +264,7 @@ class Modeller(object):
2. Water molecules are removed if their distance to any solute atom is less than the sum of their van der Waals radii.
2. Water molecules are removed if their distance to any solute atom is less than the sum of their van der Waals radii.
3. If the solute is charged and neutralize=True, enough positive or negative ions are added to neutralize it. Each ion is added by
3. If the solute is charged and neutralize=True, enough positive or negative ions are added to neutralize it. Each ion is added by
randomly selecting a water molecule and replacing it with the ion.
randomly selecting a water molecule and replacing it with the ion.
4. Ion pairs are added to give the requested total ionic strength.
4. Ion pairs are added to give the requested total ionic strength.
Note that only monovalent ions are currently supported.
The box size can be specified in any of several ways:
The box size can be specified in any of several ways:
...
@@ -298,6 +298,7 @@ class Modeller(object):
...
@@ -298,6 +298,7 @@ class Modeller(object):
ionicStrength : concentration=0*molar
ionicStrength : concentration=0*molar
the total concentration of ions (both positive and negative) to add. This
the total concentration of ions (both positive and negative) to add. This
does not include ions that are added to neutralize the system.
does not include ions that are added to neutralize the system.
Note that only monovalent ions are currently supported.
neutralize : bool=True
neutralize : bool=True
whether to add ions to neutralize the system
whether to add ions to neutralize the system
"""
"""
...
@@ -522,7 +523,7 @@ class Modeller(object):
...
@@ -522,7 +523,7 @@ class Modeller(object):
# Add ions based on the desired ionic strength.
# Add ions based on the desired ionic strength.
numIons
=
len
(
addedWaters
)
*
ionicStrength
/
(
55.4
*
molar
)
# Pure water is about 55.4 molar (depending on temperature)
numIons
=
len
(
addedWaters
)
*
ionicStrength
/
(
55.4
*
molar
)
# Pure water is about 55.4 molar (depending on temperature)
numPairs
=
int
(
floor
(
numIons
/
2
+
0.5
))
numPairs
=
int
(
floor
(
numIons
+
0.5
))
for
i
in
range
(
numPairs
):
for
i
in
range
(
numPairs
):
addIon
(
positiveElement
)
addIon
(
positiveElement
)
for
i
in
range
(
numPairs
):
for
i
in
range
(
numPairs
):
...
...
wrappers/python/tests/TestModeller.py
View file @
5120bb0d
...
@@ -395,7 +395,7 @@ class TestModeller(unittest.TestCase):
...
@@ -395,7 +395,7 @@ class TestModeller(unittest.TestCase):
total_added
=
water_count
+
sodium_count
+
chlorine_count
total_added
=
water_count
+
sodium_count
+
chlorine_count
self
.
assertEqual
(
total_added
,
1364
)
self
.
assertEqual
(
total_added
,
1364
)
expected_ion_fraction
=
2.0
*
molar
/
(
55.4
*
molar
)
expected_ion_fraction
=
2.0
*
molar
/
(
55.4
*
molar
)
expected_ions
=
math
.
floor
(
total_added
*
expected_ion_fraction
/
2
+
0.5
)
expected_ions
=
math
.
floor
(
total_added
*
expected_ion_fraction
+
0.5
)
self
.
assertEqual
(
sodium_count
,
expected_ions
)
self
.
assertEqual
(
sodium_count
,
expected_ions
)
self
.
assertEqual
(
chlorine_count
,
expected_ions
)
self
.
assertEqual
(
chlorine_count
,
expected_ions
)
...
@@ -437,7 +437,7 @@ class TestModeller(unittest.TestCase):
...
@@ -437,7 +437,7 @@ class TestModeller(unittest.TestCase):
total_water_ions
=
water_count
+
sodium_count
+
chlorine_count
total_water_ions
=
water_count
+
sodium_count
+
chlorine_count
expected_ion_fraction
=
1.0
*
molar
/
(
55.4
*
molar
)
expected_ion_fraction
=
1.0
*
molar
/
(
55.4
*
molar
)
expected_chlorine
=
math
.
floor
((
total_water_ions
-
10
)
*
expected_ion_fraction
/
2
+
0.5
)
+
5
expected_chlorine
=
math
.
floor
((
total_water_ions
-
10
)
*
expected_ion_fraction
+
0.5
)
+
5
expected_sodium
=
expected_chlorine
if
neutralize
else
expected_chlorine
-
5
expected_sodium
=
expected_chlorine
if
neutralize
else
expected_chlorine
-
5
self
.
assertEqual
(
sodium_count
,
expected_sodium
)
self
.
assertEqual
(
sodium_count
,
expected_sodium
)
self
.
assertEqual
(
chlorine_count
,
expected_chlorine
)
self
.
assertEqual
(
chlorine_count
,
expected_chlorine
)
...
@@ -482,7 +482,7 @@ class TestModeller(unittest.TestCase):
...
@@ -482,7 +482,7 @@ class TestModeller(unittest.TestCase):
total_water_ions
=
water_count
+
sodium_count
+
chlorine_count
total_water_ions
=
water_count
+
sodium_count
+
chlorine_count
expected_ion_fraction
=
1.0
*
molar
/
(
55.4
*
molar
)
expected_ion_fraction
=
1.0
*
molar
/
(
55.4
*
molar
)
expected_sodium
=
math
.
floor
((
total_water_ions
-
10
)
*
expected_ion_fraction
/
2
+
0.5
)
+
5
expected_sodium
=
math
.
floor
((
total_water_ions
-
10
)
*
expected_ion_fraction
+
0.5
)
+
5
expected_chlorine
=
expected_sodium
if
neutralize
else
expected_sodium
-
5
expected_chlorine
=
expected_sodium
if
neutralize
else
expected_sodium
-
5
self
.
assertEqual
(
sodium_count
,
expected_sodium
)
self
.
assertEqual
(
sodium_count
,
expected_sodium
)
self
.
assertEqual
(
chlorine_count
,
expected_chlorine
)
self
.
assertEqual
(
chlorine_count
,
expected_chlorine
)
...
@@ -520,7 +520,7 @@ class TestModeller(unittest.TestCase):
...
@@ -520,7 +520,7 @@ class TestModeller(unittest.TestCase):
total_added
=
water_count
+
positive_ion_count
+
chlorine_count
total_added
=
water_count
+
positive_ion_count
+
chlorine_count
self
.
assertEqual
(
total_added
,
1364
)
self
.
assertEqual
(
total_added
,
1364
)
expected_ions
=
math
.
floor
(
total_added
*
expected_ion_fraction
/
2
+
0.5
)
expected_ions
=
math
.
floor
(
total_added
*
expected_ion_fraction
+
0.5
)
self
.
assertEqual
(
positive_ion_count
,
expected_ions
)
self
.
assertEqual
(
positive_ion_count
,
expected_ions
)
self
.
assertEqual
(
chlorine_count
,
expected_ions
)
self
.
assertEqual
(
chlorine_count
,
expected_ions
)
...
@@ -544,7 +544,7 @@ class TestModeller(unittest.TestCase):
...
@@ -544,7 +544,7 @@ class TestModeller(unittest.TestCase):
total_added
=
water_count
+
sodium_count
+
negative_ion_count
total_added
=
water_count
+
sodium_count
+
negative_ion_count
self
.
assertEqual
(
total_added
,
1364
)
self
.
assertEqual
(
total_added
,
1364
)
expected_ions
=
math
.
floor
(
total_added
*
expected_ion_fraction
/
2
+
0.5
)
expected_ions
=
math
.
floor
(
total_added
*
expected_ion_fraction
+
0.5
)
self
.
assertEqual
(
positive_ion_count
,
expected_ions
)
self
.
assertEqual
(
positive_ion_count
,
expected_ions
)
self
.
assertEqual
(
chlorine_count
,
expected_ions
)
self
.
assertEqual
(
chlorine_count
,
expected_ions
)
...
@@ -1083,5 +1083,3 @@ class TestModeller(unittest.TestCase):
...
@@ -1083,5 +1083,3 @@ class TestModeller(unittest.TestCase):
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
unittest
.
main
()
unittest
.
main
()
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