diff --git a/modelling/pymod/_pipeline.py b/modelling/pymod/_pipeline.py index b8895042d83adfa364b2c413f0abf08f5a174e6d..ec1e88f70ff43aa7ebf9d881ff4359133d0c4f9e 100644 --- a/modelling/pymod/_pipeline.py +++ b/modelling/pymod/_pipeline.py @@ -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 diff --git a/modelling/tests/data/gly_almost_on_top.pdb b/modelling/tests/data/gly_almost_on_top.pdb new file mode 100644 index 0000000000000000000000000000000000000000..2a097faf2861d597de40edd9874d451a679a8d83 --- /dev/null +++ b/modelling/tests/data/gly_almost_on_top.pdb @@ -0,0 +1,82 @@ +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 diff --git a/modelling/tests/test_pipeline.py b/modelling/tests/test_pipeline.py index 0654915a03a25ef84c71702846839c7c85b4a517..65a43b325782640bd7720cc197bdb80402c217ea 100644 --- a/modelling/tests/test_pipeline.py +++ b/modelling/tests/test_pipeline.py @@ -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