Skip to content

Commit 361128e

Browse files
authored
Merge pull request #163 from OpenBioSim/fix_water_topology
2 parents fdad810 + 892a181 commit 361128e

1 file changed

Lines changed: 39 additions & 48 deletions

File tree

‎src/somd2/runner/_base.py‎

Lines changed: 39 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -266,54 +266,6 @@ def __init__(self, system, config):
266266
)
267267
self._system = _sr.morph.link_to_reference(self._system)
268268

269-
# Next, swap the water topology so that it is in AMBER format.
270-
271-
try:
272-
waters = self._system["water"]
273-
except:
274-
waters = []
275-
276-
if len(waters) > 0:
277-
from sire.legacy.IO import isAmberWater as _isAmberWater
278-
from sire.legacy.IO import setAmberWater as _setAmberWater
279-
280-
if not _isAmberWater(waters[0]):
281-
num_atoms = waters[0].num_atoms()
282-
283-
if num_atoms == 3:
284-
# Here we assume TIP3P for any 3-point water model.
285-
model = "tip3p"
286-
elif num_atoms == 4:
287-
# Check for OPC water.
288-
try:
289-
if (
290-
waters[0]
291-
.search("element Xx")
292-
.atoms()[0]
293-
.charge()
294-
.value()
295-
< -1.1
296-
):
297-
model = "opc"
298-
else:
299-
model = "tip4p"
300-
except:
301-
model = "tip4p"
302-
elif num_atoms == 5:
303-
model = "tip5p"
304-
try:
305-
self._system = _System(
306-
_setAmberWater(self._system._system, model)
307-
)
308-
_logger.info(
309-
"Converting water topology to AMBER format for SOMD1 compatibility."
310-
)
311-
except Exception as e:
312-
_logger.error(
313-
"Unable to convert water topology to AMBER format for SOMD1 compatibility."
314-
)
315-
raise e
316-
317269
# Ghost atoms are considered light when adding bond constraints.
318270
self._config._extra_args["ghosts_are_light"] = True
319271

@@ -334,6 +286,45 @@ def __init__(self, system, config):
334286
_logger.error(msg)
335287
raise RuntimeError(msg)
336288

289+
# Convert water topology to AMBER format if not already done. AMBER
290+
# format adds an explicit H-H bond, giving fully rigid water (O-H and
291+
# H-H constraints) rather than just O-H constraints under h_bonds.
292+
try:
293+
waters = self._system["water"]
294+
except:
295+
waters = []
296+
297+
if len(waters) > 0:
298+
from sire.legacy.IO import isAmberWater as _isAmberWater
299+
from sire.legacy.IO import setAmberWater as _setAmberWater
300+
301+
if not _isAmberWater(waters[0]):
302+
num_atoms = waters[0].num_atoms()
303+
304+
if num_atoms == 3:
305+
model = "tip3p"
306+
elif num_atoms == 4:
307+
try:
308+
if (
309+
waters[0].search("element Xx").atoms()[0].charge().value()
310+
< -1.1
311+
):
312+
model = "opc"
313+
else:
314+
model = "tip4p"
315+
except:
316+
model = "tip4p"
317+
elif num_atoms == 5:
318+
model = "tip5p"
319+
try:
320+
self._system = _System(_setAmberWater(self._system._system, model))
321+
_logger.info(
322+
f"Converting water topology to AMBER {model.upper()} format."
323+
)
324+
except Exception as e:
325+
_logger.error("Unable to convert water topology to AMBER format.")
326+
raise e
327+
337328
# Check the end state constraints.
338329
self._check_end_state_constraints()
339330

0 commit comments

Comments
 (0)