Skip to content
Snippets Groups Projects
Commit 39701ab9 authored by Gerardo Tauriello's avatar Gerardo Tauriello
Browse files

SCHWED-4333: Catch infinite energy in MM before it crashes.

parent 6f46f548
Branches
Tags
No related merge requests found
......@@ -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.GetEnergy()))
"(iteration %d, energy: %g)" % (i+1, cur_energy))
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.GetEnergy()))
"-> final energy: %g" % cur_energy)
break
# update model
......
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
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment