def check_linear_torsions( torsion: Tuple[int, int, int, int], molecule: off.Molecule ) -> Tuple[int, int, int, int]: """ Check that the torsion supplied is not for a linear bond. Parameters: torsion: The indices of the atoms in the selected torsion. molecule: The molecule which should be checked. Raises: LinearTorsionError: If the given torsion involves driving a linear bond. """ # this is based on the past submissions to QCarchive which have failed # highlight the central bond of a linear torsion linear_smarts = "[*!D1:1]~[$(*#*)&D2,$(C=*)&D2:2]" matches = molecule.chemical_environment_matches(linear_smarts) if torsion[1:3] in matches or torsion[2:0:-1] in matches: raise LinearTorsionError( f"The dihedral {torsion} in molecule {molecule} highlights a linear bond." ) return torsion
def improper_torsion_indices(offmol: Molecule) -> np.ndarray: """"[*:1]~[X3:2](~[*:3])~[*:4]" matches (_all_improper_torsion_indices returns "[*:1]~[*:2](~[*:3])~[*:4]" matches) Notes ----- Motivation: offmol.impropers returns a large number of impropers, and we may wish to restrict this number. May update this filter definition based on discussion in https://github.com/openforcefield/openforcefield/issues/746 """ improper_smarts = "[*:1]~[X3:2](~[*:3])~[*:4]" return np.array(offmol.chemical_environment_matches(improper_smarts))
def _detect_linear_torsions(self, molecule: off.Molecule) -> List: """ Try and find any linear bonds in the molecule with torsions that should not be driven. Parameters: molecule: An openforcefield molecule instance Returns: A list of the central bond tuples in the molecule which should not be driven, this can then be compared against the torsions which have been selected. """ # this is based on the past submissions to QCarchive which have failed # highlight the central bond of a linear torsion linear_smarts = "[*!D1:1]~[$(*#*)&D2,$(C=*)&D2:2]" matches = molecule.chemical_environment_matches(linear_smarts) return matches