Source code for MDAnalysis.guesser.tables

# -*- Mode: python; tab-width: 4; indent-tabs-mode:nil; coding:utf-8 -*-
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
#
# MDAnalysis --- https://www.mdanalysis.org
# Copyright (c) 2006-2017 The MDAnalysis Development Team and contributors
# (see the file AUTHORS for the full list of names)
#
# Released under the GNU Public Licence, v2 or any higher version
#
# Please cite your use of MDAnalysis in published work:
#
# R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler,
# D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein.
# MDAnalysis: A Python package for the rapid analysis of molecular dynamics
# simulations. In S. Benthall and S. Rostrup editors, Proceedings of the 15th
# Python in Science Conference, pages 102-109, Austin, TX, 2016. SciPy.
# doi: 10.25080/majora-629e541a-00e
#
# N. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein.
# MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations.
# J. Comput. Chem. 32 (2011), 2319--2327, doi:10.1002/jcc.21787
#

"""
MDAnalysis topology tables
==========================

The module contains static lookup tables for atom typing etc. The
tables are dictionaries that are indexed by the element.

.. autodata:: atomelements
.. autodata:: masses
.. autodata:: vdwradii

The original raw data are stored as multi-line strings that are
translated into dictionaries with :func:`kv2dict`. In the future,
these tables might be moved into external data files; see
:func:`kv2dict` for explanation of the file format.

.. autofunction:: kv2dict

The raw tables are stored in the strings

.. autodata:: TABLE_ATOMELEMENTS
.. autodata:: TABLE_MASSES
.. autodata:: TABLE_VDWRADII
"""

from typing import Any


[docs] def kv2dict(s, convertor: Any = str): """Primitive ad-hoc parser of a key-value record list. * The string *s* should contain each key-value pair on a separate line (separated by newline). The first white space after the key separates key and value. * Empty lines are allowed. * Comment lines (starting with #) are allowed. * Leading whitespace is ignored. The *convertor* is a function that converts its single argument to a valid Python type. The default is :func:`str` but other possibilities are :func:`int` (for integers) or :func:`float` for floating point numbers. """ d = {} lines = s.splitlines() for line in lines: line = line.lstrip() values = line.split(None, 1) if len(values) == 0 or line.startswith("#"): continue d[values[0]] = convertor(values[1]) return d
#: Table with hard-coded special atom names, used for guessing atom types #: with :func:`MDAnalysis.topology.core.guess_atom_element`. TABLE_ATOMELEMENTS = """ # translation of atomnames to types/element # based on CHARMM and AMBER usage with a little bit of GROMOS (and PROPKA) # NOTE: CL might be ambiguous and is interpreted as chloride! # --------- ------------------ # atomname element # --------- ------------------ # Bromide BR BR # Calcium CAL CA C0 CA CA2+ CA # Cesium CES CS # Chloride CLA CL CLAL CL CL CL CL- CL # Iodide IOD I # Iron FE FE FE2 FE # Lithium LIT LI LI LI LI+ LI QL LI # Magnesium MG MG MG2+ MG # Noble gases ## XXX collides with NE, HE in Arg XXX ## XXX so we remove the noble gases XXX ##HE HE ##NE NE # Potassium K K POT K K+ K QK K # Sodium SOD NA NA NA NA+ NA QN NA # Zink ZN ZN # Copper CU CU # Cesium CS CS CS+ CS CES CS # Cerium?? QC CE # Rubidium RB RB QR RB # special carbons (Amber?) BC C AC C # dummy atom types MW DUMMY # other types are guessed from the name; see # topology.core.guess_atom_elements() """ #: Dictionary with hard-coded special atom names, used for guessing atom types #: with :func:`MDAnalysis.topology.core.guess_atom_type`. atomelements = kv2dict(TABLE_ATOMELEMENTS) # fmt: off elements = ['H', 'LI', 'BE', 'B', 'C', 'N', 'O', 'F', 'NA', 'MG', 'AL', 'P', 'SI', 'S', 'CL', 'K'] # fmt: on #: Plain-text table with atomic masses in u. TABLE_MASSES = """ # masses for elements in atomic units (u) # (taken from CHARMM and Gromacs atommass.dat) #------------ ----------- # atomtype mass #------------ ----------- Ac 227.028 Al 26.981539 Am 243 Sb 121.757 Ar 39.948 As 74.92159 At 210 Ba 137.327 Bk 247 Be 9.012182 Bi 208.98037 Bh 264 B 10.811 BR 79.90400 Cd 112.411 CA 40.08000 Cf 251 C 12.01100 Ce 140.11600 CS 132.90000 CL 35.45000 Cr 51.9961 Co 58.9332 CU 63.54600 Cm 247 Db 262 Dy 162.5 Es 252 Er 167.26 Eu 151.965 Fm 257 F 18.99800 Fr 223 Gd 157.25 Ga 69.723 Ge 72.61 Au 196.96654 Hf 178.49 Hs 265 HE 4.00260 Ho 164.93032 H 1.00800 In 114.82 I 126.90450 Ir 192.22 FE 55.84700 Kr 83.8 La 138.9055 Lr 262 Pb 207.2 Li 6.941 Lu 174.967 MG 24.30500 Mn 54.93805 Mt 266 Md 258 Hg 200.59 Mo 95.94 N 14.00700 NA 22.98977 Nd 144.24 NE 20.17970 Np 237.048 Ni 58.6934 Nb 92.90638 No 259 Os 190.2 O 15.99900 Pd 106.42 P 30.97400 Pt 195.08 Pu 244 Po 209 K 39.10200 Pr 140.90765 Pm 145 Pa 231.0359 Ra 226.025 Rn 222 Re 186.207 Rh 102.9055 RB 85.46780 Ru 101.07 Rf 261 Sm 150.36 Sc 44.95591 Sg 263 Se 78.96 Si 28.0855 Ag 107.8682 Na 22.989768 Sr 87.62 S 32.06000 Ta 180.9479 Tc 98 Te 127.6 Tb 158.92534 Tl 204.3833 Th 232.0381 Tm 168.93421 Sn 118.71 Ti 47.88 W 183.85 U 238.0289 V 50.9415 Xe 131.29 Yb 173.04 Y 88.90585 ZN 65.37000 Zr 91.224 DUMMY 0.0 """ #: Dictionary table with atomic masses in u, indexed by the element from #: :data:`atomelements`. masses = kv2dict(TABLE_MASSES, convertor=float) #: Plain-text table with vdw radii. TABLE_VDWRADII = r""" # Van der Waals radii taken from # [1] Bondi, A. (1964). "Van der Waals Volumes and Radii". # J. Phys. Chem. 68 (3): 441-451. doi:10.1021/j100785a001. # [2] Rowland and Taylor (1996). "Intermolecular Nonbonded Contact Distances in Organic Crystal Structures: # Comparison with Distances Expected from van der Waals Radii". # J. Phys. Chem., 1996, 100 (18), 7384.7391. doi:10.1021/jp953141+. # [3] Mantina, et al. (2009). "Consistent van der Waals Radii for the Whole Main Group". # J. Phys. Chem. A, 2009, 113 (19), 5806-5812. doi:10.1021/jp8111556. #------------ ----------- # atomtype r_vdw #------------ ----------- H 1.10 HE 1.40 LI 1.82 BE 1.53 B 1.92 C 1.70 N 1.55 O 1.52 F 1.47 NE 1.54 NA 2.27 MG 1.73 AL 1.84 SI 2.10 P 1.80 S 1.80 CL 1.75 AR 1.88 K 2.75 CA 2.31 NI 1.63 CU 1.40 ZN 1.39 GA 1.87 GE 2.11 AA 1.85 SE 1.90 BR 1.85 KR 2.02 RR 3.03 SR 2.49 PD 1.63 AG 1.72 CD 1.58 IN 1.93 SN 2.17 SB 2.06 TE 2.06 I 1.98 XE 2.16 CS 3.43 BA 2.68 PT 1.75 AU 1.66 HH 1.55 TL 1.96 PB 2.02 BI 2.07 PO 1.97 AT 2.02 RN 2.20 FR 3.48 RA 2.83 U 1.86 """ #: Dictionary table with vdw radii, indexed by the element from #: :data:`atomelements`. #: .. SeeAlso:: :func:`MDAnalysis.topology.core.guess_bonds` vdwradii = kv2dict(TABLE_VDWRADII, convertor=float) # fmt: off Z2SYMB = {1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mg', 13: 'Al', 14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', 20: 'Ca', 21: 'Sc', 22: 'Ti', 23: 'V', 24: 'Cr', 25: 'Mn', 26: 'Fe', 27: 'Co', 28: 'Ni', 29: 'Cu', 30: 'Zn', 31: 'Ga', 32: 'Ge', 33: 'As', 34: 'Se', 35: 'Br', 36: 'Kr', 37: 'Rb', 38: 'Sr', 39: 'Y', 40: 'Zr', 41: 'Nb', 42: 'Mo', 43: 'Tc', 44: 'Ru', 45: 'Rh', 46: 'Pd', 47: 'Ag', 48: 'Cd', 49: 'In', 50: 'Sn', 51: 'Sb', 52: 'Te', 53: 'I', 54: 'Xe', 55: 'Cs', 56: 'Ba', 57: 'La', 58: 'Ce', 59: 'Pr', 60: 'Nd', 61: 'Pm', 62: 'Sm', 63: 'Eu', 64: 'Gd', 65: 'Tb', 66: 'Dy', 67: 'Ho', 68: 'Er', 69: 'Tm', 70: 'Yb', 71: 'Lu', 72: 'Hf', 73: 'Ta', 74: 'W', 75: 'Re', 76: 'Os', 77: 'Ir', 78: 'Pt', 79: 'Au', 80: 'Hg', 81: 'Tl', 82: 'Pb', 83: 'Bi', 84: 'Po', 85: 'At', 86: 'Rn', 87: 'Fr', 88: 'Ra', 89: 'Ac', 90: 'Th', 91: 'Pa', 92: 'U', 93: 'Np', 94: 'Pu', 95: 'Am', 96: 'Cm', 97: 'Bk', 98: 'Cf', 99: 'Es', 100: 'Fm', 101: 'Md', 102: 'No', 103: 'Lr', 104: 'Rf', 105: 'Db', 106: 'Sg', 107: 'Bh', 108: 'Hs', 109: 'Mt', 110: 'Ds', 111: 'Rg', 112: 'Cn', 113: 'Nh', 114: 'Fl', 115: 'Mc', 116: 'Lv', 117: 'Ts', 118: 'Og'} # fmt: on SYMB2Z = {v: k for k, v in Z2SYMB.items()} # Conversion between SYBYL atom types and corresponding elements # Tripos MOL2 file format: # https://web.archive.org/web/*/http://chemyang.ccnu.edu.cn/ccb/server/AIMMS/mol2.pdf # fmt: off SYBYL2SYMB = { "H": "H", "H.spc": "H", "H.t3p": "H", "C.3": "C", "C.2": "C", "C.1": "C", "C.ar": "C", "C.cat": "C", "N.3": "N", "N.2": "N", "N.1": "N", "N.ar": "N", "N.am": "N", "N.pl3": "N", "N.4": "N", "O.3": "O", "O.2": "O", "O.co2": "O", "O.spc": "O", "O.t3p": "O", "S.3": "S", "S.2": "S", "S.O": "S", "S.O2": "S", "S.o": "S", "S.o2": "S", # Non-standard but often found in the wild... "P.3": "P", "F": "F", "Li": "Li", "Na": "Na", "Mg": "Mg", "Al": "Al", "Si": "Si", "K": "K", "Ca": "Ca", "Cr.th": "Cr", "Cr.oh": "Cr", "Mn": "Mn", "Fe": "Fe", "Co.oh": "Co", "Cu": "Cu", "Cl": "Cl", "Br": "Br", "I": "I", "Zn": "Zn", "Se": "Se", "Mo": "Mo", "Sn": "Sn", } # fmt: on