Molecule Properties#

Some properties apply to the molecule as a whole, and so can’t be accessed via sub-views such as atom or residue.

These properties can be accessed via the molecule. You can get a list of properties using the property_keys function, e.g. loading the aladip system again…

>>> import sire as sr
>>> mols = sr.load(sr.expand(sr.tutorial_url, ["ala.top", "ala.crd"]))
>>> mol = mols[0]

…we can get the list of properties in the first molecule using

>>> print(mol.property_keys())
['coordinates', 'mass', 'velocity', 'atomtype', 'bond', 'forcefield',
 'element', 'charge', 'angle', 'gb_screening', 'gb_radii', 'treechain',
 'intrascale', 'gb_radius_set', 'ambertype', 'improper', 'connectivity',
 'dihedral', 'parameters', 'LJ']

Some of these are the whole-molecule view of the sub-view properties, e.g. accessing the coordinates property via the molecule view returns the sire.mol.AtomCoords object that holds all of the atomic coordinates.

>>> print(mol.property("coordinates"))
AtomCoords( size=22
0: ( 18.4532 Å, 3.49423 Å, 12.4365 Å )
1: ( 18.9818 Å, 3.44823 Å, 13.3886 Å )
2: ( 20.0513 Å, 3.63293 Å, 13.2874 Å )
3: ( 18.798 Å, 2.43076 Å, 13.7337 Å )
4: ( 18.4805 Å, 4.54971 Å, 14.3514 Å )
...
17: ( 15.3407 Å, 5.44815 Å, 17.9626 Å )
18: ( 13.8341 Å, 3.93668 Å, 18.3509 Å )
19: ( 14.3525 Å, 3.40994 Å, 19.1521 Å )
20: ( 13.1933 Å, 4.59022 Å, 18.9428 Å )
21: ( 13.2149 Å, 3.33301 Å, 17.6874 Å )
)

Other properties, such as connectivity and forcefield, only make sense from the perspective of the molecule. In this case, the forcefield property holds details of the forcefield that was used to parameterise this molecule.

>>> print(mol.property("forcefield"))
MM ForceField{ amber::ff,
               combining_rules = arithmetic,
               1-4 scaling = 0.833333, 0.5,
               nonbonded = coulomb, lj,
               bond = harmonic, angle = harmonic,
               dihedral = cosine }

The connectivity property holds a sire.mol.Connectivity object that is used to say which atoms are connected (bonded) to which other atoms.

>>> print(mol.property("connectivity"))
Connectivity: nConnections() == 21.
Connected residues:
  * Residue ACE:1 bonded to ALA:2.
  * Residue ALA:2 bonded to ACE:1 NME:3.
  * Residue NME:3 bonded to ALA:2.
Connected atoms:
  * Atom HH31:ACE:1 bonded to CH3:ACE:1.
  * Atom CH3:ACE:1 bonded to C:ACE:1 HH31:ACE:1 HH32:ACE:1 HH33:ACE:1.
  * Atom HH32:ACE:1 bonded to CH3:ACE:1.
  * Atom HH33:ACE:1 bonded to CH3:ACE:1.
  * Atom C:ACE:1 bonded to O:ACE:1 N:ALA:2 CH3:ACE:1.
  * Atom O:ACE:1 bonded to C:ACE:1.
  * Atom N:ALA:2 bonded to C:ACE:1 H:ALA:2 CA:ALA:2.
  * Atom H:ALA:2 bonded to N:ALA:2.
  * Atom CA:ALA:2 bonded to HA:ALA:2 CB:ALA:2 N:ALA:2 C:ALA:2.
  * Atom HA:ALA:2 bonded to CA:ALA:2.
   ...

Because this molecule has been parameterised using a molecular mechanics forcefield, it contains bond, angle and dihedral parameters. These can be accessed via the bond, angle and dihedral properties, e.g.

>>> print(mol.property("bond"))
TwoAtomFunctions( size=21
0:  HH31:1-CH3:2   : 340 [r - 1.09]^2
1:   CH3:2-HH32:3  : 340 [r - 1.09]^2
2:   CH3:2-HH33:4  : 340 [r - 1.09]^2
3:   CH3:2-C:5     : 317 [r - 1.522]^2
4:     C:5-O:6     : 570 [r - 1.229]^2
...
16:    N:17-H:18    : 434 [r - 1.01]^2
17:    N:17-CH3:19  : 337 [r - 1.449]^2
18:  CH3:19-HH31:20 : 340 [r - 1.09]^2
19:  CH3:19-HH32:21 : 340 [r - 1.09]^2
20:  CH3:19-HH33:22 : 340 [r - 1.09]^2
)
>>> print(mol.property("angle"))
ThreeAtomFunctions( size=36
0:  HH31:1-CH3:2-HH32:3    : 35 [theta - 1.91114]^2
1:  HH31:1-CH3:2-HH33:4    : 35 [theta - 1.91114]^2
2:  HH31:1-CH3:2-C:5       : 50 [theta - 1.91114]^2
3:   CH3:2-C:5-O:6         : 80 [theta - 2.10138]^2
4:   CH3:2-C:5-N:7         : 70 [theta - 2.03505]^2
...
31:    N:17-CH3:19-HH33:22  : 50 [theta - 1.91114]^2
32:    H:18-N:17-CH3:19     : 50 [theta - 2.06019]^2
33: HH31:20-CH3:19-HH32:21  : 35 [theta - 1.91114]^2
34: HH31:20-CH3:19-HH33:22  : 35 [theta - 1.91114]^2
35: HH32:21-CH3:19-HH33:22  : 35 [theta - 1.91114]^2
)
>>> print(mol.property("dihedral"))
FourAtomFunctions( size=41
0:  HH31:1-CH3:2-C:5-O:6           : 0.08 cos(3 phi - 3.14159) + 0.8 cos(phi) + 0.88
1:  HH31:1-CH3:2-C:5-N:7           : 0
2:   CH3:2-C:5-N:7-H:8             : 2.5 cos(2 phi - 3.14159) + 2.5
3:   CH3:2-C:5-N:7-CA:9            : 2.5 cos(2 phi - 3.14159) + 2.5
4:  HH32:3-CH3:2-C:5-O:6           : 0.08 cos(3 phi - 3.14159) + 0.8 cos(phi) + 0.88
...
36:    O:16-C:15-N:17-H:18          : 2.5 cos(2 phi - 3.14159) + 2 cos(phi) + 4.5
37:    O:16-C:15-N:17-CH3:19        : 2.5 cos(2 phi - 3.14159) + 2.5
38:    H:18-N:17-CH3:19-HH31:20     : 0
39:    H:18-N:17-CH3:19-HH32:21     : 0
40:    H:18-N:17-CH3:19-HH33:22     : 0
)

Instead of the forcefield parameters, the full algebraic expressions for the bond, angle and dihedral potentials are stored. These are stored via a sire.cas.Expression using sire’s in-built computer algebra system.

Complementing these, the intrascale property contains the intramolecular non-bonded scaling factors between pairs of atoms. These are used either to exclude atom pairs from intramolecular non-bonded calculations, or to scale the 1-4 non-bonded interactions.

>>> print(mol.property("intrascale"))
CLJNBPairs( nAtoms() == 22, nGroups() == 3 )