Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/update vdw radii #745

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion doc/examples/scripts/structure/modeling/rotamer_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
support = coord[atom_i]

# Only atoms at one side of the rotatable bond should be moved
# So the original Bondist is taken...
# So the original Bondlist is taken...
bond_list_without_axis = residue.bonds.copy()
# ...the rotatable bond is removed...
bond_list_without_axis.remove_bond(atom_i, atom_j)
Expand Down
13 changes: 13 additions & 0 deletions doc/references.bib
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,19 @@ @article{Ma2002
doi = {10.1093/bioinformatics/18.3.440}
}

@article{Mantina2009,
author = {Mantina, Manjeera and Chamberlin, Adam C. and Valero, Rosendo and Cramer, Christopher J. and Truhlar, Donald G.},
title = {Consistent van der Waals Radii for the Whole Main Group},
journal = {The Journal of Physical Chemistry A},
volume = {113},
number = {19},
pages = {5806-5812},
year = {2009},
doi = {10.1021/jp8111556},
note = {PMID: 19382751},
url = {https://doi.org/10.1021/jp8111556}
}

@article{Mariani2013,
title = {{{lDDT}}: A Local Superposition-Free Score for Comparing Protein Structures and Models Using Distance Difference Tests},
shorttitle = {{{lDDT}}},
Expand Down
85 changes: 77 additions & 8 deletions src/biotite/structure/info/radii.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,37 +26,106 @@
("S", 1, 0) : 1.77,
("S", 2, 0) : 1.77, # Not official, added for completeness (MET)
("S", 2, 1) : 1.77,
("F", 1, 0) : 1.47, # Taken from _SINGLE_RADII
("CL", 1, 0) : 1.75, # Taken from _SINGLE_RADII
("BR", 1, 0) : 1.85, # Taken from _SINGLE_RADII
("F", 1, 0) : 1.47, # Taken from _SINGLE_ELEMENT_VDW_RADII
("CL", 1, 0) : 1.75, # Taken from _SINGLE_ELEMENT_VDW_RADII
("BR", 1, 0) : 1.85, # Taken from _SINGLE_ELEMENT_VDW_RADII
("I", 1, 0) : 1.98, # Taken from _SINGLE_RADII
}

_SINGLE_RADII = {
"H": 1.20,
_SINGLE_ELEMENT_VDW_RADII = {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just an optional nit: I think single atom is more appropriate than single element here.

Suggested change
_SINGLE_ELEMENT_VDW_RADII = {
_SINGLE_ATOM_VDW_RADII = {

# Main group
# Row 1 (Period 1)
"H": 1.10,
"HE": 1.40,

# Row 2 (Period 2)
"LI": 1.81,
"BE": 1.53,
"B": 1.92,
"C": 1.70,
"N": 1.55,
"O": 1.52,
"F": 1.47,
"NE": 1.54,

# Row 3 (Period 3)
"NA": 2.27,
"MG": 1.73,
"AL": 1.84,
"SI": 2.10,
"P": 1.80,
"S": 1.80,
"CL": 1.75,
"AR": 1.88,

# Row 4 (Period 4)
"K": 2.75,
"CA": 2.31,
"GA": 1.87,
"GE": 2.11,
"AS": 1.85,
"SE": 1.90,
"BR": 1.85,
"BR": 1.83,
"KR": 2.02,

# Row 5 (Period 5)
"RB": 3.03,
"SR": 2.49,
"IN": 1.93,
"SN": 2.17,
"SB": 2.06,
"TE": 2.06,
"I": 1.98,
"XE": 2.16,

# Row 6 (Period 6)
"CS": 3.43,
"BA": 2.68,
"TL": 1.96,
"PB": 2.02,
"BI": 2.07,
"PO": 1.97,
"AT": 2.02,
"RN": 2.20,

# Row 7 (Period 7)
"FR": 3.48,
"RA": 2.83,

# Transition metals (relevant ones only)
# Row 1
"FE": 2.05,
"CU": 2.00,
"ZN": 2.10,
"MN": 2.05,
"CO": 2.00,
"NI": 2.00,

# Row 2
'MO': 2.10,
'RU': 2.05,

# Row 3
'W': 2.10,
'PT': 2.05,
'AU': 2.10,
}
"""
Van der Waals radii for main group and transition elements.

Main group:
Source: https://pubs.acs.org/doi/10.1021/jp8111556, Table 12 (Mantina et al. 2009)

Transition metals:
Source: RDKit, 2024.9.4 Release
https://github.com/rdkit/rdkit/blob/af6347963f25cfe8fe4db0638410b2f3a8e8bd89/Code/GraphMol/atomic_data.cpp#L51

Where available, these values were cross-checked vs the CRC Handbook of
Chemistry and Physics (105th edition) and verified that they are closely
in line (barring very minor discrepancies, usually < 0.05 Å).
We cannot use the CRC values directly as they are not permissively licensed.
"""

# fmt: on

# A dictionary that caches radii for each residue
Expand Down Expand Up @@ -167,7 +236,7 @@ def _calculate_protor_radii(res_name):
def vdw_radius_single(element):
"""
Get the Van-der-Waals radius of an atom from the given element.
:footcite:`Bondi1964`
:footcite:`Mantina2009`

Parameters
----------
Expand All @@ -194,4 +263,4 @@ def vdw_radius_single(element):
>>> print(vdw_radius_single("C"))
1.7
"""
return _SINGLE_RADII.get(element.upper())
return _SINGLE_ELEMENT_VDW_RADII.get(element.upper())
3 changes: 2 additions & 1 deletion src/biotite/structure/sasa.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ def sasa(array, float probe_radius=1.4, np.ndarray atom_filter=None,
- **Single** - A set, which uses a defined VdW radius for
every single atom, therefore hydrogen atoms are required
in the model (e.g. NMR elucidated structures).
:footcite:`Bondi1964`
Values for main group elements are taken from :footcite:`Mantina2009`,
and for relevant transition metals from the RDKit.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you also add a citation to the relevant RDKit paper here?

Suggested change
and for relevant transition metals from the RDKit.
and for relevant transition metals from *RDKit*.


By default *ProtOr* is used.

Expand Down
2 changes: 1 addition & 1 deletion tests/structure/data/misc/sasa.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import warnings
from pathlib import Path
import mdtraj
from biotite.structure.info.radii import _SINGLE_RADII as SINGLE_RADII
from biotite.structure.info.radii import _SINGLE_ELEMENT_VDW_RADII as SINGLE_RADII

PDB_IDS = ["1l2y", "1gya"]
STRUCTURE_DIR = Path(__file__).parents[1]
Expand Down
Loading