Coverage for cvpack/angle.py: 100%
12 statements
« prev ^ index » next coverage.py v7.5.1, created at 2024-05-09 16:14 +0000
« prev ^ index » next coverage.py v7.5.1, created at 2024-05-09 16:14 +0000
1"""
2.. class:: Angle
3 :platform: Linux, MacOS, Windows
4 :synopsis: The angle formed by three atoms
6.. classauthor:: Charlles Abreu <craabreu@gmail.com>
8"""
10import numpy as np
11import openmm
12from openmm import unit as mmunit
14from .collective_variable import CollectiveVariable
17class Angle(CollectiveVariable, openmm.CustomAngleForce):
18 r"""
19 The angle formed by three atoms:
21 .. math::
23 \theta({\bf r}) =
24 \mathrm{acos}\left(
25 \frac{{\bf r}_{2,1} \cdot {\bf r}_{2,3} }
26 {\| {\bf r}_{2,1} \| \| {\bf r}_{2,3} \|}
27 \right),
29 where :math:`{\bf r}_{i,j} = {\bf r}_j - {\bf r}_i`.
31 Parameters
32 ----------
33 atom1
34 The index of the first atom.
35 atom2
36 The index of the second atom.
37 atom3
38 The index of the third atom.
39 pbc
40 Whether to use periodic boundary conditions.
41 name
42 The name of the collective variable.
44 Example
45 -------
46 >>> import cvpack
47 >>> import openmm
48 >>> system = openmm.System()
49 >>> [system.addParticle(1) for i in range(3)]
50 [0, 1, 2]
51 >>> angle = cvpack.Angle(0, 1, 2)
52 >>> system.addForce(angle)
53 0
54 >>> integrator = openmm.VerletIntegrator(0)
55 >>> platform = openmm.Platform.getPlatformByName('Reference')
56 >>> context = openmm.Context(system, integrator, platform)
57 >>> positions = [[0, 0, 0], [1, 0, 0], [1, 1, 0]]
58 >>> context.setPositions([openmm.Vec3(*pos) for pos in positions])
59 >>> angle.getValue(context)
60 1.570796... rad
62 """
64 def __init__(
65 self,
66 atom1: int,
67 atom2: int,
68 atom3: int,
69 pbc: bool = False,
70 name: str = "angle",
71 ) -> None:
72 super().__init__("theta")
73 self.addAngle(atom1, atom2, atom3, [])
74 self.setUsesPeriodicBoundaryConditions(pbc)
75 self._registerCV(
76 name, mmunit.radians, atom1=atom1, atom2=atom2, atom3=atom3, pbc=pbc
77 )
78 self._registerPeriodicBounds(-np.pi, np.pi)
81Angle.registerTag("!cvpack.Angle")