Coverage for cvpack/angle.py: 100%

12 statements  

« 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 

5 

6.. classauthor:: Charlles Abreu <craabreu@gmail.com> 

7 

8""" 

9 

10import numpy as np 

11import openmm 

12from openmm import unit as mmunit 

13 

14from .collective_variable import CollectiveVariable 

15 

16 

17class Angle(CollectiveVariable, openmm.CustomAngleForce): 

18 r""" 

19 The angle formed by three atoms: 

20 

21 .. math:: 

22 

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), 

28 

29 where :math:`{\bf r}_{i,j} = {\bf r}_j - {\bf r}_i`. 

30 

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. 

43 

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 

61 

62 """ 

63 

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) 

79 

80 

81Angle.registerTag("!cvpack.Angle")