Source code for waterEntropy.utils.selections

"""
Functions for common MDAnalysis selections
"""

import numpy as np


[docs] def get_selection(system, selection_type: str, indices: list[int]): """ For a list of indices, turn this list into a string and use it to select by a particular MDAnalysis selection type e.g. resid or index :param system: mdanalysis instance of atoms in a frame :param selection_type: string for what selection to make in mdanalysis, e.g index, resid :param indices: list of numbers corresponding to the atoms or resids to select """ idx_str = " ".join(str(n) for n in indices) selection = system.select_atoms(f"""{selection_type} {idx_str}""") return selection
[docs] def find_molecule_UAs(molecule): """ For a given molecule, return the heavy atoms it constitutes :param molecule: mdanalysis instance of atoms in a frame """ UAs = molecule.select_atoms("mass 2 to 999") return UAs
[docs] def find_solute_molecules(system): """ For a given system, find molecules containing more than one UA or is not a single UA molecule that contains an oxygen atom and return the resids for these molecules. Filter out MDAnalysis definition of water molecules by default. :param system: mdanalysis instance of atoms in a frame """ atom = system.select_atoms("not water") # atom = system.select_atoms("all") molecules = atom.fragments solute_molecule_resid_list = [] for molecule in molecules: for res in molecule.residues: UAs = atom.select_atoms(f"resid {res.resid} and mass 2 to 999") if len(UAs) > 1: solute_molecule_resid_list.append(res.resid) # if heavy atom is not oxygen, treat as solute if len(UAs) == 1 and np.floor(UAs[0].mass) != 16: solute_molecule_resid_list.append(res.resid) return solute_molecule_resid_list
[docs] def find_bonded_heavy_atom(atom_idx: int, system): """ for a given atom, if it is a hydrogen, find what heavy atom it is bonded to :param atom_idx: atom index to find bonded heavy atom for :param system: mdanalysis instance of all atoms in current frame """ atom = system.atoms[atom_idx] if atom.mass < 1.1: bonded_atoms = system.select_atoms(f"bonded index {atom_idx}") bonded_heavy_atoms = bonded_atoms.select_atoms("mass 2 to 999") bonded_heavy_atom = bonded_heavy_atoms[0] # should be a list of one else: bonded_heavy_atom = atom return bonded_heavy_atom
[docs] def find_bonded_atoms(atom_idx: int, system): """ for a given atom, find its bonded heavy and H atoms :param atom_idx: atom index to find bonded heavy atom for :param system: mdanalysis instance of all atoms in current frame """ bonded_atoms = system.select_atoms(f"bonded index {atom_idx}") bonded_heavy_atoms = bonded_atoms.select_atoms("mass 2 to 999") bonded_H_atoms = bonded_atoms.select_atoms("mass 1 to 1.1") return bonded_heavy_atoms, bonded_H_atoms
[docs] def guess_length_scale(molecule): """Guess what the length scale of the molecule is :param molecule: MDAnalysis instance of molecule """ molecule_scale = None UAs = find_molecule_UAs(molecule) if len(UAs) == 1: molecule_scale = "single_UA" elif len(UAs) > 1: if len(molecule.atoms.residues) > 1: molecule_scale = "polymer" else: molecule_scale = "multiple_UAs" else: molecule_scale = "no_UA" return molecule_scale