Source code for waterEntropy.recipes.bulk_water
"""
These functions calculate orientational entropy from labelled
coordination shells of bulk water
"""
import waterEntropy.analysis.HB as HBond
import waterEntropy.analysis.HB_labels as HBLabels
import waterEntropy.analysis.RAD as RADShell
from waterEntropy.analysis.shells import ShellCollection
from waterEntropy.entropy.convariances import CovarianceCollection
from waterEntropy.entropy.orientations import Orientations
from waterEntropy.entropy.vibrations import Vibrations
from waterEntropy.recipes.forces_torques import get_forces_torques
[docs]
def get_bulk_water_orient_entropy(
system, start: int, end: int, step: int, temperature=298
):
# pylint: disable=too-many-locals
"""
For a given system, containing the topology and coordinates of molecules,
find the bulk water and calculate their
orientational entropy if there is a solute atom in the solvent coordination
shell.
:param system: mdanalysis instance of atoms in a frame
:param start: starting frame number
:param end: end frame number
:param step: steps between frames
"""
# initialise the Covariance class instance to store covariance matrices
covariances = CovarianceCollection()
# initialise the Vibrations class instance to store vibrational entropies
vibrations = Vibrations(temperature)
hb_labels = HBLabels.HBLabelCollection()
# pylint: disable=unused-variable
for ts in system.trajectory[start:end:step]:
# initialise the RAD and HB class instances to store shell information
shells = ShellCollection()
HBs = HBond.HBCollection()
# select all water molecules in the system
waters = system.select_atoms("water and mass 2 to 999")
# 3. iterate through first shell solvent and find their RAD shells,
# HBing in the shells and shell labels
for solvent in waters:
# 3a. find RAD shell of interfacial solvent
shell = RADShell.get_RAD_shell(solvent, system, shells)
# 3b. Set RAD shell labels as resname of neighbour
shell.labels = [system.atoms[n].resname for n in shell.UA_shell]
# check shell only contains only solvent molecules
if set(shell.labels) == {solvent.resname}:
# 3c. find HBing in the shell
HBond.get_shell_HBs(shell, system, HBs, shells)
# 3d. find HB labels
HBLabels.get_HB_labels(solvent.index, system, HBs, shells)
hb_labels.add_data(
f"{solvent.resname}",
f"{solvent.resname}",
shell.labels,
shell.donates_to_labels,
shell.accepts_from_labels,
len(shell.labels), # set N_w
)
# 3e. calculate the running average of force and torque
# covariance matrices
solvent_molecule = system.atoms[solvent.index].fragment # get molecule
get_forces_torques(
covariances,
solvent_molecule,
f"{solvent.resname}",
system,
)
# 4. get the orientational entropy of interfacial waters and save
# them to a dictionary
# TO-DO: add average Nc in Sorient dict
# Sorient_dict = Orient.get_resid_orientational_entropy_from_dict(
# hb_labels.resid_labelled_shell_counts
# )
Sorients = Orientations()
Sorients.add_data(hb_labels)
Sorient_dict = Sorients.resid_labelled_Sorient
# 5. Get the vibrational entropy of interfacial waters
vibrations.add_data(covariances, diagonalise=True)
return (
Sorient_dict,
covariances,
vibrations,
)