@@ -258,40 +258,54 @@ def __init__(self, system, config):
258258 self ._rest2_scale_factors = scale_factors
259259 else :
260260 if len (self ._config .rest2_scale ) != len (self ._lambda_values ):
261- raise ValueError (
262- f"Length of 'rest2_scale' must match the number of { _lam_sym } values."
263- )
261+ msg = f"Length of 'rest2_scale' must match the number of { _lam_sym } values."
262+ _logger . error ( msg )
263+ raise ValueError ( msg )
264264 if self ._lambda_energy != self ._lambda_values :
265- raise ValueError (
266- "'rest2_scale' can only be used when 'lambda_energy' matches 'lambda_values'."
265+ msg = (
266+ "REST2 scaling can currently only be used when "
267+ "'lambda_energy' matches 'lambda_values'."
267268 )
269+ _logger .error (msg )
270+ raise ValueError (msg )
268271 # Make sure the end states are close to 1.0.
269272 if not isclose (
270273 self ._config .rest2_scale [0 ], 1.0 , abs_tol = 1e-4
271274 ) or not isclose (self ._config .rest2_scale [- 1 ], 1.0 , abs_tol = 1e-4 ):
272- raise ValueError (
273- f"'rest2_scale' must be 1.0 at { _lam_sym } =0 and { _lam_sym } =1."
274- )
275+ msg = f"'rest2_scale' must be 1.0 at { _lam_sym } =0 and { _lam_sym } =1."
276+ _logger . error ( msg )
277+ raise ValueError ( msg )
275278 self ._rest2_scale_factors = self ._config .rest2_scale
276279
277280 # Apply hydrogen mass repartitioning.
278281 if self ._config .hmr :
279282 # Work out the current hydrogen mass factor.
280- h_mass_factor , has_hydrogen = self ._get_h_mass_factor (self ._system )
283+ factor_non_water , factor_water = self ._get_h_mass_factor (self ._system )
284+
285+ # We don't support repartiioning water molecules, so check those first.
286+ if factor_water is not None :
287+ if not isclose (factor_water , 1.0 , abs_tol = 1e-4 ):
288+ msg = (
289+ "Water molecules have already been repartitioned with "
290+ f"a factor of { factor_water :.3f} . We only support "
291+ "repartitioning of non-water molecules."
292+ )
293+ _logger .error (msg )
294+ raise ValueError (msg )
281295
282296 # HMR has already been applied.
283- if has_hydrogen :
284- if not isclose (h_mass_factor , 1.0 , abs_tol = 1e-4 ):
297+ if factor_non_water is not None :
298+ if not isclose (factor_non_water , 1.0 , abs_tol = 1e-4 ):
285299 _logger .info (
286- f"Detected existing hydrogen mass repartioning factor of { h_mass_factor :.3f} ."
300+ f"Detected existing hydrogen mass repartioning factor of { factor_non_water :.3f} ."
287301 )
288302
289303 if not isclose (
290- h_mass_factor , self ._config .h_mass_factor , abs_tol = 1e-4
304+ factor_non_water , self ._config .h_mass_factor , abs_tol = 1e-4
291305 ):
292- new_factor = self ._config .h_mass_factor / h_mass_factor
306+ new_factor = self ._config .h_mass_factor / factor_non_water
293307 _logger .warning (
294- f"Existing hydrogen mass repartitioning factor of { h_mass_factor :.3f} "
308+ f"Existing hydrogen mass repartitioning factor of { factor_non_water :.3f} "
295309 f"does not match the requested value of { self ._config .h_mass_factor :.3f} . "
296310 f"Applying new factor of { new_factor :.3f} ."
297311 )
@@ -1001,22 +1015,36 @@ def _get_h_mass_factor(system):
10011015
10021016 system : :class: `System <sire.system.System>`
10031017 The system of interest.
1018+
1019+ Returns
1020+
1021+ h_mass_non_water : float
1022+ The mass of the first non-water hydrogen.
1023+
1024+ h_mass_water : float
1025+ The mass of the first water hydrogen.
10041026 """
10051027
10061028 from sire .mol import Element
10071029
10081030 # Store the expected hydrogen mass.
10091031 expected_h_mass = Element ("H" ).mass ().value ()
10101032
1011- # Get the mass of the first hydrogen atom.
1033+ # Get the mass of the first non-water hydrogen.
1034+ try :
1035+ h_mass = system ["not water" ].molecules ()["element H" ][0 ].mass ()
1036+ h_mass_non_water = round (h_mass .value () / expected_h_mass , 3 )
1037+ except :
1038+ h_mass_non_water = None
1039+
1040+ # Get the mass of the first water hydrogen.
10121041 try :
1013- h_mass = system ["element H" ][0 ].mass ()
1042+ h_mass = system ["water" ].molecules ()["element H" ][0 ].mass ()
1043+ h_mass_water = round (h_mass .value () / expected_h_mass , 3 )
10141044 except :
1015- return expected_h_mass , False
1045+ h_mass_water = None
10161046
1017- # Work out the current hydrogen mass factor. We round to 3dp due to
1018- # the precision of atomic masses loaded from text files.
1019- return round (h_mass .value () / expected_h_mass , 3 ), True
1047+ return h_mass_non_water , h_mass_water
10201048
10211049 @staticmethod
10221050 def _repartition_h_mass (system , factor = 1.0 ):
0 commit comments