Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
ProMod3
Manage
Activity
Members
Plan
Jira
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container registry
Model registry
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
schwede
ProMod3
Commits
39701ab9
Commit
39701ab9
authored
6 years ago
by
Gerardo Tauriello
Browse files
Options
Downloads
Patches
Plain Diff
SCHWED-4333
: Catch infinite energy in MM before it crashes.
parent
6f46f548
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
modelling/pymod/_pipeline.py
+10
-4
10 additions, 4 deletions
modelling/pymod/_pipeline.py
modelling/tests/data/gly_almost_on_top.pdb
+82
-0
82 additions, 0 deletions
modelling/tests/data/gly_almost_on_top.pdb
modelling/tests/test_pipeline.py
+23
-0
23 additions, 0 deletions
modelling/tests/test_pipeline.py
with
115 additions
and
4 deletions
modelling/pymod/_pipeline.py
+
10
−
4
View file @
39701ab9
...
...
@@ -309,11 +309,16 @@ def MinimizeModelEnergy(mhandle, max_iterations=12, max_iter_sd=20,
# setup mm simulation
sim
=
_SetupMmSimulation
(
mhandle
.
model
,
force_fields
)
# check for certain failure -> we get NaN if atoms are on top each other
if
math
.
isnan
(
sim
.
GetEnergy
()):
# check for certain failure -> we get NaN/Inf if atoms are on top each other
cur_energy
=
sim
.
GetEnergy
()
if
math
.
isnan
(
cur_energy
):
ost
.
LogError
(
"
OpenMM could not minimize energy as atoms are on top of
"
"
each other!
"
)
return
if
math
.
isinf
(
cur_energy
):
ost
.
LogError
(
"
OpenMM could not minimize energy as atoms are almost
"
"
on top of each other!
"
)
return
# settings to check for stereochemical problems
clashing_distances
=
mol
.
alg
.
DefaultClashingDistances
()
...
...
@@ -323,7 +328,7 @@ def MinimizeModelEnergy(mhandle, max_iterations=12, max_iter_sd=20,
for
i
in
range
(
max_iterations
):
# update atoms
ost
.
LogInfo
(
"
Perform energy minimization
"
"
(iteration %d, energy: %g)
"
%
(
i
+
1
,
sim
.
GetE
nergy
()
))
"
(iteration %d, energy: %g)
"
%
(
i
+
1
,
cur_e
nergy
))
sim
.
ApplySD
(
tolerance
=
1.0
,
max_iterations
=
max_iter_sd
)
sim
.
ApplyLBFGS
(
tolerance
=
1.0
,
max_iterations
=
max_iter_lbfgs
)
sim
.
UpdatePositions
()
...
...
@@ -344,10 +349,11 @@ def MinimizeModelEnergy(mhandle, max_iterations=12, max_iter_sd=20,
if
ignore_stereo_log
:
ost
.
PopVerbosityLevel
()
# checks above would remove bad atoms
cur_energy
=
sim
.
GetEnergy
()
if
len
(
temp_ent_stereo_checked
.
Select
(
"
ele!=H
"
).
atoms
)
\
==
len
(
temp_ent
.
Select
(
"
ele!=H
"
).
atoms
):
ost
.
LogInfo
(
"
No more stereo-chemical problems
"
"
-> final energy: %g
"
%
(
sim
.
GetE
nergy
())
)
"
-> final energy: %g
"
%
cur_e
nergy
)
break
# update model
...
...
This diff is collapsed.
Click to expand it.
modelling/tests/data/gly_almost_on_top.pdb
0 → 100644
+
82
−
0
View file @
39701ab9
ATOM 1 N GLY A 1 0.001 0.001 0.001 1.00 0.00 N
ATOM 2 CA GLY A 1 1.456 0.001 0.001 1.00 0.00 C
ATOM 3 C GLY A 1 1.942 1.417 0.001 1.00 0.00 C
ATOM 4 O GLY A 1 2.853 1.778 0.745 1.00 0.00 O
ATOM 5 N GLY A 2 1.346 2.282 -0.844 1.00 0.00 N
ATOM 6 CA GLY A 2 1.728 3.683 -0.937 1.00 0.00 C
ATOM 7 C GLY A 2 1.528 4.331 0.397 1.00 0.00 C
ATOM 8 O GLY A 2 2.380 5.077 0.878 1.00 0.00 O
ATOM 9 N GLY A 3 0.380 4.069 1.053 1.00 0.00 N
ATOM 10 CA GLY A 3 0.068 4.637 2.356 1.00 0.00 C
ATOM 11 C GLY A 3 1.115 4.210 3.336 1.00 0.00 C
ATOM 12 O GLY A 3 1.617 5.011 4.124 1.00 0.00 O
ATOM 13 N GLY A 4 1.490 2.915 3.325 1.00 0.00 N
ATOM 14 CA GLY A 4 2.497 2.377 4.227 1.00 0.00 C
ATOM 15 C GLY A 4 3.789 3.097 3.998 1.00 0.00 C
ATOM 16 O GLY A 4 4.473 3.494 4.941 1.00 0.00 O
ATOM 17 N GLY A 5 4.176 3.295 2.723 1.00 0.00 N
ATOM 18 CA GLY A 5 5.410 3.981 2.370 1.00 0.00 C
ATOM 19 C GLY A 5 5.368 5.372 2.923 1.00 0.00 C
ATOM 20 O GLY A 5 6.338 5.856 3.504 1.00 0.00 O
ATOM 21 N GLY A 6 4.229 6.074 2.762 1.00 0.00 N
ATOM 22 CA GLY A 6 4.064 7.433 3.254 1.00 0.00 C
ATOM 23 C GLY A 6 4.249 7.438 4.740 1.00 0.00 C
ATOM 24 O GLY A 6 4.935 8.296 5.293 1.00 0.00 O
ATOM 25 N GLY A 7 3.637 6.469 5.449 1.00 0.00 N
ATOM 26 CA GLY A 7 3.739 6.366 6.897 1.00 0.00 C
ATOM 27 C GLY A 7 5.179 6.192 7.270 1.00 0.00 C
ATOM 28 O GLY A 7 5.679 6.830 8.195 1.00 0.00 O
ATOM 29 N GLY A 8 5.906 5.309 6.557 1.00 0.00 N
ATOM 30 CA GLY A 8 7.314 5.051 6.822 1.00 0.00 C
ATOM 31 C GLY A 8 8.082 6.325 6.657 1.00 0.00 C
ATOM 32 O GLY A 8 8.932 6.668 7.477 1.00 0.00 O
ATOM 33 N GLY A 9 7.808 7.083 5.576 1.00 0.00 N
ATOM 34 CA GLY A 9 8.486 8.342 5.304 1.00 0.00 C
ATOM 35 C GLY A 9 8.238 9.283 6.442 1.00 0.00 C
ATOM 36 O GLY A 9 9.150 9.950 6.928 1.00 0.00 O
ATOM 37 N GLY A 10 6.979 9.374 6.913 1.00 0.00 N
ATOM 38 CA GLY A 10 6.610 10.252 8.014 1.00 0.00 C
ATOM 39 C GLY A 10 7.392 9.862 9.230 1.00 0.00 C
ATOM 40 O GLY A 10 7.924 10.728 9.923 1.00 0.00 O
ATOM 41 N GLY A 11 0.000 0.000 0.000 1.00 0.00 N
ATOM 42 CA GLY A 11 1.455 0.000 0.000 1.00 0.00 C
ATOM 43 C GLY A 11 1.941 1.416 0.000 1.00 0.00 C
ATOM 44 O GLY A 11 2.852 1.777 0.744 1.00 0.00 O
ATOM 45 N GLY A 12 1.345 2.281 -0.845 1.00 0.00 N
ATOM 46 CA GLY A 12 1.727 3.682 -0.938 1.00 0.00 C
ATOM 47 C GLY A 12 1.527 4.330 0.396 1.00 0.00 C
ATOM 48 O GLY A 12 2.379 5.076 0.877 1.00 0.00 O
ATOM 49 N GLY A 13 0.379 4.068 1.052 1.00 0.00 N
ATOM 50 CA GLY A 13 0.067 4.636 2.355 1.00 0.00 C
ATOM 51 C GLY A 13 1.114 4.209 3.335 1.00 0.00 C
ATOM 52 O GLY A 13 1.616 5.010 4.123 1.00 0.00 O
ATOM 53 N GLY A 14 1.489 2.914 3.324 1.00 0.00 N
ATOM 54 CA GLY A 14 2.496 2.376 4.226 1.00 0.00 C
ATOM 55 C GLY A 14 3.788 3.096 3.997 1.00 0.00 C
ATOM 56 O GLY A 14 4.472 3.493 4.940 1.00 0.00 O
ATOM 57 N GLY A 15 4.175 3.294 2.722 1.00 0.00 N
ATOM 58 CA GLY A 15 5.409 3.980 2.369 1.00 0.00 C
ATOM 59 C GLY A 15 5.367 5.371 2.922 1.00 0.00 C
ATOM 60 O GLY A 15 6.337 5.855 3.503 1.00 0.00 O
ATOM 61 N GLY A 16 4.228 6.073 2.761 1.00 0.00 N
ATOM 62 CA GLY A 16 4.063 7.432 3.253 1.00 0.00 C
ATOM 63 C GLY A 16 4.248 7.437 4.739 1.00 0.00 C
ATOM 64 O GLY A 16 4.934 8.295 5.292 1.00 0.00 O
ATOM 65 N GLY A 17 3.636 6.468 5.448 1.00 0.00 N
ATOM 66 CA GLY A 17 3.738 6.365 6.896 1.00 0.00 C
ATOM 67 C GLY A 17 5.178 6.191 7.269 1.00 0.00 C
ATOM 68 O GLY A 17 5.678 6.829 8.194 1.00 0.00 O
ATOM 69 N GLY A 18 5.905 5.308 6.556 1.00 0.00 N
ATOM 70 CA GLY A 18 7.313 5.050 6.821 1.00 0.00 C
ATOM 71 C GLY A 18 8.081 6.324 6.656 1.00 0.00 C
ATOM 72 O GLY A 18 8.931 6.667 7.476 1.00 0.00 O
ATOM 73 N GLY A 19 7.807 7.082 5.575 1.00 0.00 N
ATOM 74 CA GLY A 19 8.485 8.341 5.303 1.00 0.00 C
ATOM 75 C GLY A 19 8.237 9.282 6.441 1.00 0.00 C
ATOM 76 O GLY A 19 9.149 9.949 6.927 1.00 0.00 O
ATOM 77 N GLY A 20 6.978 9.373 6.912 1.00 0.00 N
ATOM 78 CA GLY A 20 6.609 10.251 8.013 1.00 0.00 C
ATOM 79 C GLY A 20 7.391 9.861 9.229 1.00 0.00 C
ATOM 80 O GLY A 20 7.923 10.727 9.922 1.00 0.00 O
TER 81 GLY A 20
END
This diff is collapsed.
Click to expand it.
modelling/tests/test_pipeline.py
+
23
−
0
View file @
39701ab9
...
...
@@ -305,6 +305,29 @@ class PipelineTests(unittest.TestCase):
modelling
.
MinimizeModelEnergy
(
mhandle
)
self
.
compare
(
mhandle
.
model
,
'
data/1crn_final.pdb
'
)
def
testMinimizeModelEnergy
(
self
):
'''
Check energy minimization fails.
'''
# setup log
log
=
_FetchLog
()
ost
.
PushLogSink
(
log
)
ost
.
PushVerbosityLevel
(
1
)
# catch atoms on top
mhandle
=
self
.
getMockModel
(
io
.
LoadPDB
(
'
data/gly_on_top.pdb
'
))
log
.
messages
[
'
ERROR
'
]
=
list
()
modelling
.
MinimizeModelEnergy
(
mhandle
)
self
.
assertEqual
(
len
(
log
.
messages
[
'
ERROR
'
]),
1
)
self
.
assertEqual
(
log
.
messages
[
'
ERROR
'
][
0
],
"
OpenMM could not minimize energy as atoms are on
"
"
top of each other!
"
)
# catch atoms almost on top
mhandle
=
self
.
getMockModel
(
io
.
LoadPDB
(
'
data/gly_almost_on_top.pdb
'
))
log
.
messages
[
'
ERROR
'
]
=
list
()
modelling
.
MinimizeModelEnergy
(
mhandle
)
self
.
assertEqual
(
len
(
log
.
messages
[
'
ERROR
'
]),
1
)
self
.
assertEqual
(
log
.
messages
[
'
ERROR
'
][
0
],
"
OpenMM could not minimize energy as atoms are
"
"
almost on top of each other!
"
)
def
testBuildFromRawModel
(
self
):
'''
Check that BuildFromRawModel works.
'''
# get raw model
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment