@@ -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