biotite 1.5.0__cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of biotite might be problematic. Click here for more details.
- biotite/__init__.py +18 -0
- biotite/application/__init__.py +69 -0
- biotite/application/application.py +276 -0
- biotite/application/autodock/__init__.py +12 -0
- biotite/application/autodock/app.py +500 -0
- biotite/application/blast/__init__.py +14 -0
- biotite/application/blast/alignment.py +92 -0
- biotite/application/blast/webapp.py +428 -0
- biotite/application/clustalo/__init__.py +12 -0
- biotite/application/clustalo/app.py +223 -0
- biotite/application/dssp/__init__.py +12 -0
- biotite/application/dssp/app.py +216 -0
- biotite/application/localapp.py +342 -0
- biotite/application/mafft/__init__.py +12 -0
- biotite/application/mafft/app.py +116 -0
- biotite/application/msaapp.py +363 -0
- biotite/application/muscle/__init__.py +13 -0
- biotite/application/muscle/app3.py +227 -0
- biotite/application/muscle/app5.py +163 -0
- biotite/application/sra/__init__.py +18 -0
- biotite/application/sra/app.py +447 -0
- biotite/application/tantan/__init__.py +12 -0
- biotite/application/tantan/app.py +199 -0
- biotite/application/util.py +77 -0
- biotite/application/viennarna/__init__.py +18 -0
- biotite/application/viennarna/rnaalifold.py +310 -0
- biotite/application/viennarna/rnafold.py +254 -0
- biotite/application/viennarna/rnaplot.py +208 -0
- biotite/application/viennarna/util.py +77 -0
- biotite/application/webapp.py +76 -0
- biotite/copyable.py +71 -0
- biotite/database/__init__.py +23 -0
- biotite/database/afdb/__init__.py +12 -0
- biotite/database/afdb/download.py +197 -0
- biotite/database/entrez/__init__.py +15 -0
- biotite/database/entrez/check.py +60 -0
- biotite/database/entrez/dbnames.py +101 -0
- biotite/database/entrez/download.py +228 -0
- biotite/database/entrez/key.py +44 -0
- biotite/database/entrez/query.py +263 -0
- biotite/database/error.py +16 -0
- biotite/database/pubchem/__init__.py +21 -0
- biotite/database/pubchem/download.py +258 -0
- biotite/database/pubchem/error.py +30 -0
- biotite/database/pubchem/query.py +819 -0
- biotite/database/pubchem/throttle.py +98 -0
- biotite/database/rcsb/__init__.py +13 -0
- biotite/database/rcsb/download.py +161 -0
- biotite/database/rcsb/query.py +963 -0
- biotite/database/uniprot/__init__.py +13 -0
- biotite/database/uniprot/check.py +40 -0
- biotite/database/uniprot/download.py +126 -0
- biotite/database/uniprot/query.py +292 -0
- biotite/file.py +244 -0
- biotite/interface/__init__.py +19 -0
- biotite/interface/openmm/__init__.py +20 -0
- biotite/interface/openmm/state.py +93 -0
- biotite/interface/openmm/system.py +227 -0
- biotite/interface/pymol/__init__.py +201 -0
- biotite/interface/pymol/cgo.py +346 -0
- biotite/interface/pymol/convert.py +185 -0
- biotite/interface/pymol/display.py +267 -0
- biotite/interface/pymol/object.py +1228 -0
- biotite/interface/pymol/shapes.py +178 -0
- biotite/interface/pymol/startup.py +169 -0
- biotite/interface/rdkit/__init__.py +19 -0
- biotite/interface/rdkit/mol.py +490 -0
- biotite/interface/version.py +94 -0
- biotite/interface/warning.py +19 -0
- biotite/sequence/__init__.py +84 -0
- biotite/sequence/align/__init__.py +199 -0
- biotite/sequence/align/alignment.py +702 -0
- biotite/sequence/align/banded.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/banded.pyx +652 -0
- biotite/sequence/align/buckets.py +71 -0
- biotite/sequence/align/cigar.py +425 -0
- biotite/sequence/align/kmeralphabet.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmeralphabet.pyx +595 -0
- biotite/sequence/align/kmersimilarity.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmersimilarity.pyx +233 -0
- biotite/sequence/align/kmertable.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmertable.pyx +3411 -0
- biotite/sequence/align/localgapped.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/localgapped.pyx +892 -0
- biotite/sequence/align/localungapped.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/localungapped.pyx +279 -0
- biotite/sequence/align/matrix.py +631 -0
- biotite/sequence/align/matrix_data/3Di.mat +24 -0
- biotite/sequence/align/matrix_data/BLOSUM100.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM30.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM35.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM40.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM45.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM50.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM50_13p.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM50_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM50_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM55.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM60.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM62.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM62_13p.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM62_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM62_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM65.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM70.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM75.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM80.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM85.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM90.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUMN.mat +31 -0
- biotite/sequence/align/matrix_data/CorBLOSUM49_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM57_13p.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM57_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM61_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM66_13p.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM67_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/DAYHOFF.mat +32 -0
- biotite/sequence/align/matrix_data/GONNET.mat +26 -0
- biotite/sequence/align/matrix_data/IDENTITY.mat +25 -0
- biotite/sequence/align/matrix_data/MATCH.mat +25 -0
- biotite/sequence/align/matrix_data/NUC.mat +25 -0
- biotite/sequence/align/matrix_data/PAM10.mat +34 -0
- biotite/sequence/align/matrix_data/PAM100.mat +34 -0
- biotite/sequence/align/matrix_data/PAM110.mat +34 -0
- biotite/sequence/align/matrix_data/PAM120.mat +34 -0
- biotite/sequence/align/matrix_data/PAM130.mat +34 -0
- biotite/sequence/align/matrix_data/PAM140.mat +34 -0
- biotite/sequence/align/matrix_data/PAM150.mat +34 -0
- biotite/sequence/align/matrix_data/PAM160.mat +34 -0
- biotite/sequence/align/matrix_data/PAM170.mat +34 -0
- biotite/sequence/align/matrix_data/PAM180.mat +34 -0
- biotite/sequence/align/matrix_data/PAM190.mat +34 -0
- biotite/sequence/align/matrix_data/PAM20.mat +34 -0
- biotite/sequence/align/matrix_data/PAM200.mat +34 -0
- biotite/sequence/align/matrix_data/PAM210.mat +34 -0
- biotite/sequence/align/matrix_data/PAM220.mat +34 -0
- biotite/sequence/align/matrix_data/PAM230.mat +34 -0
- biotite/sequence/align/matrix_data/PAM240.mat +34 -0
- biotite/sequence/align/matrix_data/PAM250.mat +34 -0
- biotite/sequence/align/matrix_data/PAM260.mat +34 -0
- biotite/sequence/align/matrix_data/PAM270.mat +34 -0
- biotite/sequence/align/matrix_data/PAM280.mat +34 -0
- biotite/sequence/align/matrix_data/PAM290.mat +34 -0
- biotite/sequence/align/matrix_data/PAM30.mat +34 -0
- biotite/sequence/align/matrix_data/PAM300.mat +34 -0
- biotite/sequence/align/matrix_data/PAM310.mat +34 -0
- biotite/sequence/align/matrix_data/PAM320.mat +34 -0
- biotite/sequence/align/matrix_data/PAM330.mat +34 -0
- biotite/sequence/align/matrix_data/PAM340.mat +34 -0
- biotite/sequence/align/matrix_data/PAM350.mat +34 -0
- biotite/sequence/align/matrix_data/PAM360.mat +34 -0
- biotite/sequence/align/matrix_data/PAM370.mat +34 -0
- biotite/sequence/align/matrix_data/PAM380.mat +34 -0
- biotite/sequence/align/matrix_data/PAM390.mat +34 -0
- biotite/sequence/align/matrix_data/PAM40.mat +34 -0
- biotite/sequence/align/matrix_data/PAM400.mat +34 -0
- biotite/sequence/align/matrix_data/PAM410.mat +34 -0
- biotite/sequence/align/matrix_data/PAM420.mat +34 -0
- biotite/sequence/align/matrix_data/PAM430.mat +34 -0
- biotite/sequence/align/matrix_data/PAM440.mat +34 -0
- biotite/sequence/align/matrix_data/PAM450.mat +34 -0
- biotite/sequence/align/matrix_data/PAM460.mat +34 -0
- biotite/sequence/align/matrix_data/PAM470.mat +34 -0
- biotite/sequence/align/matrix_data/PAM480.mat +34 -0
- biotite/sequence/align/matrix_data/PAM490.mat +34 -0
- biotite/sequence/align/matrix_data/PAM50.mat +34 -0
- biotite/sequence/align/matrix_data/PAM500.mat +34 -0
- biotite/sequence/align/matrix_data/PAM60.mat +34 -0
- biotite/sequence/align/matrix_data/PAM70.mat +34 -0
- biotite/sequence/align/matrix_data/PAM80.mat +34 -0
- biotite/sequence/align/matrix_data/PAM90.mat +34 -0
- biotite/sequence/align/matrix_data/PB.license +21 -0
- biotite/sequence/align/matrix_data/PB.mat +18 -0
- biotite/sequence/align/matrix_data/RBLOSUM52_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM59_13p.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM59_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM64_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM69_13p.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM69_14.3.mat +25 -0
- biotite/sequence/align/multiple.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/multiple.pyx +619 -0
- biotite/sequence/align/pairwise.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/pairwise.pyx +585 -0
- biotite/sequence/align/permutation.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/permutation.pyx +313 -0
- biotite/sequence/align/primes.txt +821 -0
- biotite/sequence/align/selector.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/selector.pyx +954 -0
- biotite/sequence/align/statistics.py +264 -0
- biotite/sequence/align/tracetable.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/tracetable.pxd +64 -0
- biotite/sequence/align/tracetable.pyx +370 -0
- biotite/sequence/alphabet.py +555 -0
- biotite/sequence/annotation.py +836 -0
- biotite/sequence/codec.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/codec.pyx +155 -0
- biotite/sequence/codon.py +476 -0
- biotite/sequence/codon_tables.txt +202 -0
- biotite/sequence/graphics/__init__.py +33 -0
- biotite/sequence/graphics/alignment.py +1101 -0
- biotite/sequence/graphics/color_schemes/3di_flower.json +48 -0
- biotite/sequence/graphics/color_schemes/autumn.json +51 -0
- biotite/sequence/graphics/color_schemes/blossom.json +51 -0
- biotite/sequence/graphics/color_schemes/clustalx_dna.json +11 -0
- biotite/sequence/graphics/color_schemes/clustalx_protein.json +28 -0
- biotite/sequence/graphics/color_schemes/flower.json +51 -0
- biotite/sequence/graphics/color_schemes/jalview_buried.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_hydrophobicity.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_helix.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_strand.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_turn.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_taylor.json +28 -0
- biotite/sequence/graphics/color_schemes/jalview_zappo.json +28 -0
- biotite/sequence/graphics/color_schemes/ocean.json +51 -0
- biotite/sequence/graphics/color_schemes/pb_flower.json +40 -0
- biotite/sequence/graphics/color_schemes/rainbow_dna.json +11 -0
- biotite/sequence/graphics/color_schemes/rainbow_protein.json +30 -0
- biotite/sequence/graphics/color_schemes/spring.json +51 -0
- biotite/sequence/graphics/color_schemes/sunset.json +51 -0
- biotite/sequence/graphics/color_schemes/wither.json +51 -0
- biotite/sequence/graphics/colorschemes.py +170 -0
- biotite/sequence/graphics/dendrogram.py +231 -0
- biotite/sequence/graphics/features.py +544 -0
- biotite/sequence/graphics/logo.py +102 -0
- biotite/sequence/graphics/plasmid.py +712 -0
- biotite/sequence/io/__init__.py +12 -0
- biotite/sequence/io/fasta/__init__.py +22 -0
- biotite/sequence/io/fasta/convert.py +283 -0
- biotite/sequence/io/fasta/file.py +265 -0
- biotite/sequence/io/fastq/__init__.py +19 -0
- biotite/sequence/io/fastq/convert.py +117 -0
- biotite/sequence/io/fastq/file.py +507 -0
- biotite/sequence/io/genbank/__init__.py +17 -0
- biotite/sequence/io/genbank/annotation.py +269 -0
- biotite/sequence/io/genbank/file.py +573 -0
- biotite/sequence/io/genbank/metadata.py +336 -0
- biotite/sequence/io/genbank/sequence.py +173 -0
- biotite/sequence/io/general.py +201 -0
- biotite/sequence/io/gff/__init__.py +26 -0
- biotite/sequence/io/gff/convert.py +128 -0
- biotite/sequence/io/gff/file.py +449 -0
- biotite/sequence/phylo/__init__.py +36 -0
- biotite/sequence/phylo/nj.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/nj.pyx +221 -0
- biotite/sequence/phylo/tree.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/tree.pyx +1169 -0
- biotite/sequence/phylo/upgma.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/upgma.pyx +164 -0
- biotite/sequence/profile.py +561 -0
- biotite/sequence/search.py +117 -0
- biotite/sequence/seqtypes.py +720 -0
- biotite/sequence/sequence.py +373 -0
- biotite/setup_ccd.py +197 -0
- biotite/structure/__init__.py +135 -0
- biotite/structure/alphabet/__init__.py +25 -0
- biotite/structure/alphabet/encoder.py +332 -0
- biotite/structure/alphabet/encoder_weights_3di.kerasify +0 -0
- biotite/structure/alphabet/i3d.py +109 -0
- biotite/structure/alphabet/layers.py +86 -0
- biotite/structure/alphabet/pb.license +21 -0
- biotite/structure/alphabet/pb.py +170 -0
- biotite/structure/alphabet/unkerasify.py +128 -0
- biotite/structure/atoms.py +1562 -0
- biotite/structure/basepairs.py +1403 -0
- biotite/structure/bonds.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/bonds.pyx +2036 -0
- biotite/structure/box.py +724 -0
- biotite/structure/celllist.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/celllist.pyx +864 -0
- biotite/structure/chains.py +310 -0
- biotite/structure/charges.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/charges.pyx +520 -0
- biotite/structure/compare.py +683 -0
- biotite/structure/density.py +109 -0
- biotite/structure/dotbracket.py +213 -0
- biotite/structure/error.py +39 -0
- biotite/structure/filter.py +591 -0
- biotite/structure/geometry.py +817 -0
- biotite/structure/graphics/__init__.py +13 -0
- biotite/structure/graphics/atoms.py +243 -0
- biotite/structure/graphics/rna.py +298 -0
- biotite/structure/hbond.py +425 -0
- biotite/structure/info/__init__.py +24 -0
- biotite/structure/info/atom_masses.json +121 -0
- biotite/structure/info/atoms.py +98 -0
- biotite/structure/info/bonds.py +149 -0
- biotite/structure/info/ccd.py +200 -0
- biotite/structure/info/components.bcif +0 -0
- biotite/structure/info/groups.py +128 -0
- biotite/structure/info/masses.py +121 -0
- biotite/structure/info/misc.py +137 -0
- biotite/structure/info/radii.py +267 -0
- biotite/structure/info/standardize.py +185 -0
- biotite/structure/integrity.py +213 -0
- biotite/structure/io/__init__.py +29 -0
- biotite/structure/io/dcd/__init__.py +13 -0
- biotite/structure/io/dcd/file.py +67 -0
- biotite/structure/io/general.py +243 -0
- biotite/structure/io/gro/__init__.py +14 -0
- biotite/structure/io/gro/file.py +343 -0
- biotite/structure/io/mol/__init__.py +20 -0
- biotite/structure/io/mol/convert.py +112 -0
- biotite/structure/io/mol/ctab.py +420 -0
- biotite/structure/io/mol/header.py +120 -0
- biotite/structure/io/mol/mol.py +149 -0
- biotite/structure/io/mol/sdf.py +940 -0
- biotite/structure/io/netcdf/__init__.py +13 -0
- biotite/structure/io/netcdf/file.py +64 -0
- biotite/structure/io/pdb/__init__.py +20 -0
- biotite/structure/io/pdb/convert.py +389 -0
- biotite/structure/io/pdb/file.py +1380 -0
- biotite/structure/io/pdb/hybrid36.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/io/pdb/hybrid36.pyx +242 -0
- biotite/structure/io/pdbqt/__init__.py +15 -0
- biotite/structure/io/pdbqt/convert.py +113 -0
- biotite/structure/io/pdbqt/file.py +688 -0
- biotite/structure/io/pdbx/__init__.py +23 -0
- biotite/structure/io/pdbx/bcif.py +674 -0
- biotite/structure/io/pdbx/cif.py +1091 -0
- biotite/structure/io/pdbx/component.py +251 -0
- biotite/structure/io/pdbx/compress.py +362 -0
- biotite/structure/io/pdbx/convert.py +2113 -0
- biotite/structure/io/pdbx/encoding.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/io/pdbx/encoding.pyx +1078 -0
- biotite/structure/io/trajfile.py +696 -0
- biotite/structure/io/trr/__init__.py +13 -0
- biotite/structure/io/trr/file.py +43 -0
- biotite/structure/io/util.py +38 -0
- biotite/structure/io/xtc/__init__.py +13 -0
- biotite/structure/io/xtc/file.py +43 -0
- biotite/structure/mechanics.py +72 -0
- biotite/structure/molecules.py +337 -0
- biotite/structure/pseudoknots.py +622 -0
- biotite/structure/rdf.py +245 -0
- biotite/structure/repair.py +302 -0
- biotite/structure/residues.py +716 -0
- biotite/structure/rings.py +451 -0
- biotite/structure/sasa.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/sasa.pyx +322 -0
- biotite/structure/segments.py +328 -0
- biotite/structure/sequence.py +110 -0
- biotite/structure/spacegroups.json +1567 -0
- biotite/structure/spacegroups.license +26 -0
- biotite/structure/sse.py +306 -0
- biotite/structure/superimpose.py +511 -0
- biotite/structure/tm.py +581 -0
- biotite/structure/transform.py +736 -0
- biotite/structure/util.py +160 -0
- biotite/version.py +34 -0
- biotite/visualize.py +375 -0
- biotite-1.5.0.dist-info/METADATA +162 -0
- biotite-1.5.0.dist-info/RECORD +354 -0
- biotite-1.5.0.dist-info/WHEEL +6 -0
- biotite-1.5.0.dist-info/licenses/LICENSE.rst +30 -0
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
# This source code is part of the Biotite package and is distributed
|
|
2
|
+
# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further
|
|
3
|
+
# information.
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
This module provides functions for hydrogen bonding calculation.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
__name__ = "biotite.structure"
|
|
10
|
+
__author__ = "Daniel Bauer, Patrick Kunzmann"
|
|
11
|
+
__all__ = ["hbond", "hbond_frequency"]
|
|
12
|
+
|
|
13
|
+
import warnings
|
|
14
|
+
import numpy as np
|
|
15
|
+
from biotite.structure.atoms import AtomArrayStack, stack
|
|
16
|
+
from biotite.structure.celllist import CellList
|
|
17
|
+
from biotite.structure.geometry import angle, distance
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def hbond(
|
|
21
|
+
atoms,
|
|
22
|
+
selection1=None,
|
|
23
|
+
selection2=None,
|
|
24
|
+
selection1_type="both",
|
|
25
|
+
cutoff_dist=2.5,
|
|
26
|
+
cutoff_angle=120,
|
|
27
|
+
donor_elements=("O", "N", "S"),
|
|
28
|
+
acceptor_elements=("O", "N", "S"),
|
|
29
|
+
periodic=False,
|
|
30
|
+
):
|
|
31
|
+
r"""
|
|
32
|
+
Find hydrogen bonds in a structure using the Baker-Hubbard
|
|
33
|
+
algorithm. :footcite:`Baker1984`
|
|
34
|
+
|
|
35
|
+
This function identifies hydrogen bonds based on the bond angle
|
|
36
|
+
:math:`\theta` and the bond distance :math:`d_{H,A}`.
|
|
37
|
+
The default criteria is :math:`\theta > 120^{\circ}`
|
|
38
|
+
and :math:`d_{H,A} \le 2.5 \mathring{A}`.
|
|
39
|
+
Consequently, the given structure must contain hydrogen atoms.
|
|
40
|
+
Otherwise, no hydrogen bonds will be found.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
atoms : AtomArray or AtomArrayStack
|
|
45
|
+
The atoms to find hydrogen bonds in.
|
|
46
|
+
selection1, selection2 : ndarray, optional
|
|
47
|
+
Boolean mask for atoms to limit the hydrogen bond search to
|
|
48
|
+
specific sections of the model. The shape must match the
|
|
49
|
+
shape of the `atoms` argument. If None is given, the whole atoms
|
|
50
|
+
stack is used instead.
|
|
51
|
+
selection1_type : {'acceptor', 'donor', 'both'}, optional
|
|
52
|
+
Determines the type of `selection1`.
|
|
53
|
+
The type of `selection2` is chosen accordingly
|
|
54
|
+
('both' or the opposite).
|
|
55
|
+
cutoff_dist : float, optional
|
|
56
|
+
The maximal distance between the hydrogen and acceptor to be
|
|
57
|
+
considered a hydrogen bond.
|
|
58
|
+
cutoff_angle : float, optional
|
|
59
|
+
The angle cutoff in degree between Donor-H..Acceptor to be
|
|
60
|
+
considered a hydrogen bond.
|
|
61
|
+
donor_elements, acceptor_elements : tuple of str
|
|
62
|
+
Elements to be considered as possible donors or acceptors.
|
|
63
|
+
periodic : bool, optional
|
|
64
|
+
If true, hydrogen bonds can also be detected in periodic
|
|
65
|
+
boundary conditions.
|
|
66
|
+
The `box` attribute of `atoms` is required in this case.
|
|
67
|
+
|
|
68
|
+
Returns
|
|
69
|
+
-------
|
|
70
|
+
triplets : ndarray, dtype=int, shape=(n,3)
|
|
71
|
+
*n x 3* matrix containing the indices of every Donor-H..Acceptor
|
|
72
|
+
interaction that is available in any of the models.
|
|
73
|
+
*n* is the number of found interactions.
|
|
74
|
+
The three matrix columns are *D_index*, *H_index*, *A_index*.
|
|
75
|
+
If only one model (`AtomArray`) is given, `triplets` contains
|
|
76
|
+
all of its hydrogen bonds.
|
|
77
|
+
mask : ndarry, dtype=bool, shape=(m,n)
|
|
78
|
+
*m x n* matrix that shows if an interaction with index *n* in
|
|
79
|
+
`triplets` is present in the model *m* of the input `atoms`.
|
|
80
|
+
Only returned if `atoms` is an :class:`AtomArrayStack`.
|
|
81
|
+
|
|
82
|
+
See Also
|
|
83
|
+
--------
|
|
84
|
+
hbond_frequency : Compute the frequency of each bond over the models.
|
|
85
|
+
|
|
86
|
+
Notes
|
|
87
|
+
-----
|
|
88
|
+
The result of this function may include false positives:
|
|
89
|
+
Only the chemical elements and the bond geometry is checked.
|
|
90
|
+
However, there are some cases where a hydrogen bond is still not
|
|
91
|
+
reasonable.
|
|
92
|
+
For example, a nitrogen atom with positive charge could be
|
|
93
|
+
considered as acceptor atom by this method, although this does
|
|
94
|
+
make sense from a chemical perspective.
|
|
95
|
+
|
|
96
|
+
References
|
|
97
|
+
----------
|
|
98
|
+
|
|
99
|
+
.. footbibliography::
|
|
100
|
+
|
|
101
|
+
Examples
|
|
102
|
+
--------
|
|
103
|
+
Calculate the total number of hydrogen bonds found in each model:
|
|
104
|
+
|
|
105
|
+
>>> triplets, mask = hbond(atom_array_stack)
|
|
106
|
+
>>> hbonds_per_model = np.count_nonzero(mask, axis=1)
|
|
107
|
+
>>> print(hbonds_per_model)
|
|
108
|
+
[14 14 14 12 11 12 9 13 9 14 13 13 14 11 11 12 11 14 14 13 14 13 15 17
|
|
109
|
+
14 12 15 12 12 13 13 13 12 12 11 14 10 11]
|
|
110
|
+
|
|
111
|
+
Get hydrogen bond donors of third model:
|
|
112
|
+
|
|
113
|
+
>>> # Third model -> index 2
|
|
114
|
+
>>> triplets = triplets[mask[2,:]]
|
|
115
|
+
>>> # First column contains donors
|
|
116
|
+
>>> print(atom_array_stack[2, triplets[:,0]])
|
|
117
|
+
A 5 GLN N N -5.009 -0.575 -1.365
|
|
118
|
+
A 6 TRP N N -2.154 -0.497 -1.588
|
|
119
|
+
A 7 LEU N N -1.520 -1.904 0.893
|
|
120
|
+
A 8 LYS N N -2.716 -4.413 0.176
|
|
121
|
+
A 8 LYS NZ N -6.352 -4.311 -4.482
|
|
122
|
+
A 9 ASP N N -0.694 -5.301 -1.644
|
|
123
|
+
A 11 GLY N N 2.142 -4.244 1.916
|
|
124
|
+
A 10 GLY N N 1.135 -6.232 0.250
|
|
125
|
+
A 14 SER OG O 4.689 -5.759 -2.390
|
|
126
|
+
A 13 SER N N 6.424 -5.220 3.257
|
|
127
|
+
A 14 SER N N 6.424 -5.506 0.464
|
|
128
|
+
A 15 GLY N N 8.320 -3.632 -0.318
|
|
129
|
+
A 16 ARG N N 8.043 -1.206 -1.866
|
|
130
|
+
A 6 TRP NE1 N 3.420 0.332 -0.121
|
|
131
|
+
"""
|
|
132
|
+
if not (atoms.element == "H").any():
|
|
133
|
+
warnings.warn(
|
|
134
|
+
"Input structure does not contain hydrogen atoms, "
|
|
135
|
+
"hence no hydrogen bonds can be identified"
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# Create AtomArrayStack from AtomArray
|
|
139
|
+
if not isinstance(atoms, AtomArrayStack):
|
|
140
|
+
atoms = stack([atoms])
|
|
141
|
+
single_model = True
|
|
142
|
+
else:
|
|
143
|
+
single_model = False
|
|
144
|
+
|
|
145
|
+
if periodic:
|
|
146
|
+
box = atoms.box
|
|
147
|
+
else:
|
|
148
|
+
box = None
|
|
149
|
+
|
|
150
|
+
# Mask for donor/acceptor elements
|
|
151
|
+
donor_element_mask = np.isin(atoms.element, donor_elements)
|
|
152
|
+
acceptor_element_mask = np.isin(atoms.element, acceptor_elements)
|
|
153
|
+
|
|
154
|
+
if selection1 is None:
|
|
155
|
+
selection1 = np.ones(atoms.array_length(), dtype=bool)
|
|
156
|
+
if selection2 is None:
|
|
157
|
+
selection2 = np.ones(atoms.array_length(), dtype=bool)
|
|
158
|
+
|
|
159
|
+
if selection1_type == "both":
|
|
160
|
+
# The two selections are separated into three selections:
|
|
161
|
+
# the original ones without the overlaping part
|
|
162
|
+
# and one containing the overlap
|
|
163
|
+
# This prevents redundant triplets and unnecessary computation
|
|
164
|
+
overlap_selection = selection1 & selection2
|
|
165
|
+
# Original selections without overlaping part
|
|
166
|
+
exclusive_selection1 = selection1 & (~overlap_selection)
|
|
167
|
+
exclusive_selection2 = selection2 & (~overlap_selection)
|
|
168
|
+
|
|
169
|
+
# Put selections to list for cleaner iteration
|
|
170
|
+
selections = [exclusive_selection1, exclusive_selection2, overlap_selection]
|
|
171
|
+
selection_combinations = [
|
|
172
|
+
# (0,0), is not included, would be same selection
|
|
173
|
+
# as donor and acceptor simultaneously
|
|
174
|
+
(0, 1),
|
|
175
|
+
(0, 2),
|
|
176
|
+
(1, 0),
|
|
177
|
+
# (1,1), # same reason above
|
|
178
|
+
(1, 2),
|
|
179
|
+
(2, 0),
|
|
180
|
+
(2, 1),
|
|
181
|
+
(2, 2), # overlaping part, combination is necessary
|
|
182
|
+
]
|
|
183
|
+
|
|
184
|
+
all_comb_triplets = []
|
|
185
|
+
all_comb_mask = []
|
|
186
|
+
for selection_index1, selection_index2 in selection_combinations:
|
|
187
|
+
donor_mask = selections[selection_index1]
|
|
188
|
+
acceptor_mask = selections[selection_index2]
|
|
189
|
+
if (
|
|
190
|
+
np.count_nonzero(donor_mask) != 0
|
|
191
|
+
and np.count_nonzero(acceptor_mask) != 0
|
|
192
|
+
):
|
|
193
|
+
# Calculate triplets and mask
|
|
194
|
+
triplets, mask = _hbond(
|
|
195
|
+
atoms,
|
|
196
|
+
donor_mask,
|
|
197
|
+
acceptor_mask,
|
|
198
|
+
donor_element_mask,
|
|
199
|
+
acceptor_element_mask,
|
|
200
|
+
cutoff_dist,
|
|
201
|
+
cutoff_angle,
|
|
202
|
+
box,
|
|
203
|
+
)
|
|
204
|
+
all_comb_triplets.append(triplets)
|
|
205
|
+
all_comb_mask.append(mask)
|
|
206
|
+
# Merge results from all combinations
|
|
207
|
+
triplets = np.concatenate(all_comb_triplets, axis=0)
|
|
208
|
+
mask = np.concatenate(all_comb_mask, axis=1)
|
|
209
|
+
|
|
210
|
+
elif selection1_type == "donor":
|
|
211
|
+
triplets, mask = _hbond(
|
|
212
|
+
atoms,
|
|
213
|
+
selection1,
|
|
214
|
+
selection2,
|
|
215
|
+
donor_element_mask,
|
|
216
|
+
acceptor_element_mask,
|
|
217
|
+
cutoff_dist,
|
|
218
|
+
cutoff_angle,
|
|
219
|
+
box,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
elif selection1_type == "acceptor":
|
|
223
|
+
triplets, mask = _hbond(
|
|
224
|
+
atoms,
|
|
225
|
+
selection2,
|
|
226
|
+
selection1,
|
|
227
|
+
donor_element_mask,
|
|
228
|
+
acceptor_element_mask,
|
|
229
|
+
cutoff_dist,
|
|
230
|
+
cutoff_angle,
|
|
231
|
+
box,
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
else:
|
|
235
|
+
raise ValueError(f"Unkown selection type '{selection1_type}'")
|
|
236
|
+
|
|
237
|
+
if single_model:
|
|
238
|
+
# For a atom array (not stack),
|
|
239
|
+
# hbond_mask contains only 'True' values,
|
|
240
|
+
# since all interaction are in the one model
|
|
241
|
+
# -> Simply return triplets without hbond_mask
|
|
242
|
+
return triplets
|
|
243
|
+
else:
|
|
244
|
+
return triplets, mask
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def _hbond(
|
|
248
|
+
atoms,
|
|
249
|
+
donor_mask,
|
|
250
|
+
acceptor_mask,
|
|
251
|
+
donor_element_mask,
|
|
252
|
+
acceptor_element_mask,
|
|
253
|
+
cutoff_dist,
|
|
254
|
+
cutoff_angle,
|
|
255
|
+
box,
|
|
256
|
+
):
|
|
257
|
+
# Filter donor/acceptor elements
|
|
258
|
+
donor_mask &= donor_element_mask
|
|
259
|
+
acceptor_mask &= acceptor_element_mask
|
|
260
|
+
|
|
261
|
+
first_model_box = box[0] if box is not None else None
|
|
262
|
+
if atoms.bonds is not None:
|
|
263
|
+
donor_h_mask, associated_donor_indices = _get_bonded_h(
|
|
264
|
+
atoms[0], donor_mask, atoms.bonds
|
|
265
|
+
)
|
|
266
|
+
else:
|
|
267
|
+
warnings.warn(
|
|
268
|
+
"Input structure has no associated 'BondList', "
|
|
269
|
+
"Hydrogen atoms bonded to donors are detected by distance"
|
|
270
|
+
)
|
|
271
|
+
donor_h_mask, associated_donor_indices = _get_bonded_h_via_distance(
|
|
272
|
+
atoms[0], donor_mask, first_model_box
|
|
273
|
+
)
|
|
274
|
+
donor_h_i = np.where(donor_h_mask)[0]
|
|
275
|
+
acceptor_i = np.where(acceptor_mask)[0]
|
|
276
|
+
if len(donor_h_i) == 0 or len(acceptor_i) == 0:
|
|
277
|
+
# Return empty triplets and mask
|
|
278
|
+
return (
|
|
279
|
+
np.zeros((0, 3), dtype=int),
|
|
280
|
+
np.zeros((atoms.stack_depth(), 0), dtype=bool),
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Narrow the amount of possible acceptor to donor-H connections
|
|
284
|
+
# down via the distance cutoff parameter using a cell list
|
|
285
|
+
# Save in acceptor-to-hydrogen matrix
|
|
286
|
+
# (true when distance smaller than cutoff)
|
|
287
|
+
coord = atoms.coord
|
|
288
|
+
possible_bonds = np.zeros((len(acceptor_i), len(donor_h_i)), dtype=bool)
|
|
289
|
+
periodic = False if box is None else True
|
|
290
|
+
for model_i in range(atoms.stack_depth()):
|
|
291
|
+
donor_h_coord = coord[model_i, donor_h_mask]
|
|
292
|
+
acceptor_coord = coord[model_i, acceptor_mask]
|
|
293
|
+
box_for_model = box[model_i] if box is not None else None
|
|
294
|
+
cell_list = CellList(
|
|
295
|
+
donor_h_coord, cell_size=cutoff_dist, periodic=periodic, box=box_for_model
|
|
296
|
+
)
|
|
297
|
+
possible_bonds |= cell_list.get_atoms_in_cells(acceptor_coord, as_mask=True)
|
|
298
|
+
possible_bonds_i = np.where(possible_bonds)
|
|
299
|
+
# Narrow down
|
|
300
|
+
acceptor_i = acceptor_i[possible_bonds_i[0]]
|
|
301
|
+
donor_h_i = donor_h_i[possible_bonds_i[1]]
|
|
302
|
+
|
|
303
|
+
# Build D-H..A triplets
|
|
304
|
+
donor_i = associated_donor_indices[donor_h_i]
|
|
305
|
+
triplets = np.stack((donor_i, donor_h_i, acceptor_i), axis=1)
|
|
306
|
+
# Remove entries where donor and acceptor are the same
|
|
307
|
+
triplets = triplets[donor_i != acceptor_i]
|
|
308
|
+
|
|
309
|
+
hbond_mask = _is_hbond(
|
|
310
|
+
coord[:, triplets[:, 0]], # donors
|
|
311
|
+
coord[:, triplets[:, 1]], # donor hydrogens
|
|
312
|
+
coord[:, triplets[:, 2]], # acceptors
|
|
313
|
+
box,
|
|
314
|
+
cutoff_dist=cutoff_dist,
|
|
315
|
+
cutoff_angle=cutoff_angle,
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
# Reduce output to contain only triplets counted at least once
|
|
319
|
+
is_counted = hbond_mask.any(axis=0)
|
|
320
|
+
triplets = triplets[is_counted]
|
|
321
|
+
hbond_mask = hbond_mask[:, is_counted]
|
|
322
|
+
|
|
323
|
+
return triplets, hbond_mask
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def _get_bonded_h(array, donor_mask, bonds):
|
|
327
|
+
"""
|
|
328
|
+
Helper function to find indices of associated hydrogens in atoms for
|
|
329
|
+
all donors in atoms[donor_mask].
|
|
330
|
+
A `BondsList` is used for detecting bonded hydrogen atoms.
|
|
331
|
+
"""
|
|
332
|
+
hydrogen_mask = array.element == "H"
|
|
333
|
+
|
|
334
|
+
donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
|
|
335
|
+
associated_donor_indices = np.full(len(array), -1, dtype=int)
|
|
336
|
+
|
|
337
|
+
all_bond_indices, _ = bonds.get_all_bonds()
|
|
338
|
+
donor_indices = np.where(donor_mask)[0]
|
|
339
|
+
|
|
340
|
+
for donor_i in donor_indices:
|
|
341
|
+
bonded_indices = all_bond_indices[donor_i]
|
|
342
|
+
# Remove padding values
|
|
343
|
+
bonded_indices = bonded_indices[bonded_indices != -1]
|
|
344
|
+
# Filter hydrogen atoms
|
|
345
|
+
bonded_indices = bonded_indices[hydrogen_mask[bonded_indices]]
|
|
346
|
+
donor_hydrogen_mask[bonded_indices] = True
|
|
347
|
+
associated_donor_indices[bonded_indices] = donor_i
|
|
348
|
+
|
|
349
|
+
return donor_hydrogen_mask, associated_donor_indices
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def _get_bonded_h_via_distance(array, donor_mask, box):
|
|
353
|
+
"""
|
|
354
|
+
Helper function to find indices of associated hydrogens in atoms for
|
|
355
|
+
all donors in atoms[donor_mask].
|
|
356
|
+
The criterium is that the hydrogen must be in the same residue and
|
|
357
|
+
the distance must be smaller than the cutoff.
|
|
358
|
+
"""
|
|
359
|
+
CUTOFF = 1.5
|
|
360
|
+
|
|
361
|
+
coord = array.coord
|
|
362
|
+
res_id = array.res_id
|
|
363
|
+
hydrogen_mask = array.element == "H"
|
|
364
|
+
|
|
365
|
+
donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
|
|
366
|
+
associated_donor_indices = np.full(len(array), -1, dtype=int)
|
|
367
|
+
|
|
368
|
+
donor_indices = np.where(donor_mask)[0]
|
|
369
|
+
for donor_i in donor_indices:
|
|
370
|
+
candidate_mask = hydrogen_mask & (res_id == res_id[donor_i])
|
|
371
|
+
distances = distance(coord[donor_i], coord[candidate_mask], box=box)
|
|
372
|
+
donor_h_indices = np.where(candidate_mask)[0][distances <= CUTOFF]
|
|
373
|
+
for i in donor_h_indices:
|
|
374
|
+
associated_donor_indices[i] = donor_i
|
|
375
|
+
donor_hydrogen_mask[i] = True
|
|
376
|
+
|
|
377
|
+
return donor_hydrogen_mask, associated_donor_indices
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def _is_hbond(donor, donor_h, acceptor, box, cutoff_dist, cutoff_angle):
|
|
381
|
+
"""
|
|
382
|
+
Filter triplets that meet distance and angle condition.
|
|
383
|
+
"""
|
|
384
|
+
cutoff_angle_rad = np.deg2rad(cutoff_angle)
|
|
385
|
+
theta = angle(donor, donor_h, acceptor, box=box)
|
|
386
|
+
dist = distance(donor_h, acceptor, box=box)
|
|
387
|
+
return (theta > cutoff_angle_rad) & (dist <= cutoff_dist)
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def hbond_frequency(mask):
|
|
391
|
+
"""
|
|
392
|
+
Get the relative frequency of each hydrogen bond in a multi-model
|
|
393
|
+
structure.
|
|
394
|
+
|
|
395
|
+
The frequency is the amount of models, where the respective bond
|
|
396
|
+
exists divided by the total amount of models.
|
|
397
|
+
|
|
398
|
+
Parameters
|
|
399
|
+
----------
|
|
400
|
+
mask : ndarray, dtype=bool, shape=(m,n)
|
|
401
|
+
Input mask obtained from `hbond` function.
|
|
402
|
+
|
|
403
|
+
Returns
|
|
404
|
+
-------
|
|
405
|
+
ndarray, dtype=Float
|
|
406
|
+
For each individual interaction *n* of the mask, returns the
|
|
407
|
+
percentage of models *m*, in which this hydrogen bond is
|
|
408
|
+
present.
|
|
409
|
+
|
|
410
|
+
See Also
|
|
411
|
+
--------
|
|
412
|
+
hbond : Returns the mask that can be input into this function.
|
|
413
|
+
|
|
414
|
+
Examples
|
|
415
|
+
--------
|
|
416
|
+
|
|
417
|
+
>>> triplets, mask = hbond(atom_array_stack)
|
|
418
|
+
>>> freq = hbond_frequency(mask)
|
|
419
|
+
>>> print(freq)
|
|
420
|
+
[0.263 0.289 0.105 0.105 0.237 0.026 0.053 0.395 1.000 1.000 1.000 0.026
|
|
421
|
+
0.421 0.026 0.026 0.316 0.816 0.026 0.921 0.026 0.342 0.026 0.105 0.026
|
|
422
|
+
0.132 0.053 0.026 0.158 0.026 0.868 0.211 0.026 0.921 0.316 0.079 0.237
|
|
423
|
+
0.105 0.421 0.079 0.026 1.000 0.053 0.132 0.026 0.184]
|
|
424
|
+
"""
|
|
425
|
+
return mask.sum(axis=0) / len(mask)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# This source code is part of the Biotite package and is distributed
|
|
2
|
+
# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further
|
|
3
|
+
# information.
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
A subpackage for obtaining all kinds of chemical information about atoms
|
|
7
|
+
and residues, including masses, radii, bonds, etc.
|
|
8
|
+
|
|
9
|
+
Most information is extracted from the *Chemical Component Dictionary*
|
|
10
|
+
of the
|
|
11
|
+
`wwPDB <ftp://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif>`_.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
__name__ = "biotite.structure.info"
|
|
15
|
+
__author__ = "Patrick Kunzmann, Tom David Müller"
|
|
16
|
+
|
|
17
|
+
from .atoms import *
|
|
18
|
+
from .bonds import *
|
|
19
|
+
from .ccd import *
|
|
20
|
+
from .groups import *
|
|
21
|
+
from .masses import *
|
|
22
|
+
from .misc import *
|
|
23
|
+
from .radii import *
|
|
24
|
+
from .standardize import *
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
{
|
|
2
|
+
"H" : 1.008,
|
|
3
|
+
"D" : 2.014,
|
|
4
|
+
"HE" : 4.002,
|
|
5
|
+
"LI" : 6.940,
|
|
6
|
+
"BE" : 9.012,
|
|
7
|
+
"B" : 10.810,
|
|
8
|
+
"C" : 12.011,
|
|
9
|
+
"N" : 14.007,
|
|
10
|
+
"O" : 15.999,
|
|
11
|
+
"F" : 18.998,
|
|
12
|
+
"NE" : 20.180,
|
|
13
|
+
"NA" : 22.989,
|
|
14
|
+
"MG" : 24.305,
|
|
15
|
+
"AL" : 26.981,
|
|
16
|
+
"SI" : 28.085,
|
|
17
|
+
"P" : 30.973,
|
|
18
|
+
"S" : 32.060,
|
|
19
|
+
"CL" : 35.450,
|
|
20
|
+
"AR" : 39.948,
|
|
21
|
+
"K" : 39.098,
|
|
22
|
+
"CA" : 40.078,
|
|
23
|
+
"SC" : 44.955,
|
|
24
|
+
"TI" : 47.867,
|
|
25
|
+
"V" : 50.941,
|
|
26
|
+
"CR" : 51.996,
|
|
27
|
+
"MN" : 54.938,
|
|
28
|
+
"FE" : 55.845,
|
|
29
|
+
"CO" : 58.933,
|
|
30
|
+
"NI" : 58.693,
|
|
31
|
+
"CU" : 63.546,
|
|
32
|
+
"ZN" : 65.380,
|
|
33
|
+
"GA" : 69.723,
|
|
34
|
+
"GE" : 72.630,
|
|
35
|
+
"AS" : 74.921,
|
|
36
|
+
"SE" : 78.971,
|
|
37
|
+
"BR" : 79.904,
|
|
38
|
+
"KR" : 83.798,
|
|
39
|
+
"RB" : 85.468,
|
|
40
|
+
"SR" : 87.620,
|
|
41
|
+
"Y" : 88.905,
|
|
42
|
+
"ZR" : 91.224,
|
|
43
|
+
"NB" : 92.906,
|
|
44
|
+
"MO" : 95.950,
|
|
45
|
+
"TC" : 97.000,
|
|
46
|
+
"RU" : 101.070,
|
|
47
|
+
"RH" : 102.905,
|
|
48
|
+
"PD" : 106.420,
|
|
49
|
+
"AG" : 107.868,
|
|
50
|
+
"CD" : 112.414,
|
|
51
|
+
"IN" : 114.818,
|
|
52
|
+
"SN" : 118.710,
|
|
53
|
+
"SB" : 121.760,
|
|
54
|
+
"TE" : 127.600,
|
|
55
|
+
"I" : 126.904,
|
|
56
|
+
"XE" : 131.293,
|
|
57
|
+
"CS" : 132.905,
|
|
58
|
+
"BA" : 137.327,
|
|
59
|
+
"LA" : 138.905,
|
|
60
|
+
"CE" : 140.116,
|
|
61
|
+
"PR" : 140.907,
|
|
62
|
+
"ND" : 144.242,
|
|
63
|
+
"PM" : 145.000,
|
|
64
|
+
"SM" : 150.360,
|
|
65
|
+
"EU" : 151.964,
|
|
66
|
+
"GD" : 157.250,
|
|
67
|
+
"TB" : 158.925,
|
|
68
|
+
"DY" : 162.500,
|
|
69
|
+
"HO" : 164.930,
|
|
70
|
+
"ER" : 167.259,
|
|
71
|
+
"TM" : 168.934,
|
|
72
|
+
"YB" : 173.045,
|
|
73
|
+
"LU" : 174.967,
|
|
74
|
+
"HF" : 178.490,
|
|
75
|
+
"TA" : 180.947,
|
|
76
|
+
"W" : 183.840,
|
|
77
|
+
"RE" : 186.207,
|
|
78
|
+
"OS" : 190.230,
|
|
79
|
+
"IR" : 192.217,
|
|
80
|
+
"PT" : 195.084,
|
|
81
|
+
"AU" : 196.966,
|
|
82
|
+
"HG" : 200.592,
|
|
83
|
+
"TL" : 204.380,
|
|
84
|
+
"PB" : 207.200,
|
|
85
|
+
"BI" : 208.980,
|
|
86
|
+
"PO" : 209.000,
|
|
87
|
+
"AT" : 210.000,
|
|
88
|
+
"RN" : 222.000,
|
|
89
|
+
"FR" : 223.000,
|
|
90
|
+
"RA" : 226.000,
|
|
91
|
+
"AC" : 227.000,
|
|
92
|
+
"TH" : 232.038,
|
|
93
|
+
"PA" : 231.035,
|
|
94
|
+
"U" : 238.028,
|
|
95
|
+
"NP" : 237.000,
|
|
96
|
+
"PU" : 244.000,
|
|
97
|
+
"AM" : 243.000,
|
|
98
|
+
"CM" : 247.000,
|
|
99
|
+
"BK" : 247.000,
|
|
100
|
+
"CF" : 251.000,
|
|
101
|
+
"ES" : 252.000,
|
|
102
|
+
"FM" : 257.000,
|
|
103
|
+
"MD" : 258.000,
|
|
104
|
+
"NO" : 259.000,
|
|
105
|
+
"LR" : 262.000,
|
|
106
|
+
"RF" : 267.000,
|
|
107
|
+
"DB" : 270.000,
|
|
108
|
+
"SG" : 269.000,
|
|
109
|
+
"BH" : 270.000,
|
|
110
|
+
"HS" : 270.000,
|
|
111
|
+
"MT" : 278.000,
|
|
112
|
+
"DS" : 281.000,
|
|
113
|
+
"RG" : 281.000,
|
|
114
|
+
"CN" : 285.000,
|
|
115
|
+
"NH" : 286.000,
|
|
116
|
+
"FL" : 289.000,
|
|
117
|
+
"MC" : 289.000,
|
|
118
|
+
"LV" : 293.000,
|
|
119
|
+
"TS" : 293.000,
|
|
120
|
+
"OG" : 294.000
|
|
121
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# This source code is part of the Biotite package and is distributed
|
|
2
|
+
# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further
|
|
3
|
+
# information.
|
|
4
|
+
|
|
5
|
+
__name__ = "biotite.structure.info"
|
|
6
|
+
__author__ = "Patrick Kunzmann"
|
|
7
|
+
__all__ = ["residue"]
|
|
8
|
+
|
|
9
|
+
import functools
|
|
10
|
+
from biotite.structure.info.ccd import get_ccd
|
|
11
|
+
|
|
12
|
+
# fmt: off
|
|
13
|
+
NON_HETERO_RESIDUES = set([
|
|
14
|
+
"ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS",
|
|
15
|
+
"ILE", "LEU", "LYS", "MET", "PHE", "PRO", "PYL", "SER", "THR",
|
|
16
|
+
"TRP", "TYR", "VAL", "SEC",
|
|
17
|
+
"A", "DA", "G", "DG", "C", "DC", "U", "DT",
|
|
18
|
+
])
|
|
19
|
+
# fmt: on
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def residue(res_name, allow_missing_coord=False):
|
|
23
|
+
"""
|
|
24
|
+
Get an atom array, representing the residue with the given name.
|
|
25
|
+
|
|
26
|
+
This atom array includes proper values for the ``residue_name``,
|
|
27
|
+
``hetero``, ``atom_name``, ``element`` and ``charge`` annotation
|
|
28
|
+
arrays and bonds and coordinates.
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
res_name : str
|
|
33
|
+
The up to 3-letter name of the residue.
|
|
34
|
+
allow_missing_coord : bool, optional
|
|
35
|
+
Whether to allow missing coordinate values in the residue.
|
|
36
|
+
If ``True``, these will be represented as ``nan`` values.
|
|
37
|
+
If ``False``, a ``ValueError`` is raised when missing coordinates
|
|
38
|
+
are encountered.
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
-------
|
|
42
|
+
atom_array : AtomArray
|
|
43
|
+
The atom array described by `res_name`.
|
|
44
|
+
|
|
45
|
+
Examples
|
|
46
|
+
--------
|
|
47
|
+
|
|
48
|
+
>>> alanine = residue("ALA")
|
|
49
|
+
>>> # Atoms and geometry
|
|
50
|
+
>>> print(alanine)
|
|
51
|
+
0 ALA N N -0.966 0.493 1.500
|
|
52
|
+
0 ALA CA C 0.257 0.418 0.692
|
|
53
|
+
0 ALA C C -0.094 0.017 -0.716
|
|
54
|
+
0 ALA O O -1.056 -0.682 -0.923
|
|
55
|
+
0 ALA CB C 1.204 -0.620 1.296
|
|
56
|
+
0 ALA OXT O 0.661 0.439 -1.742
|
|
57
|
+
0 ALA H H -1.383 -0.425 1.482
|
|
58
|
+
0 ALA H2 H -0.676 0.661 2.452
|
|
59
|
+
0 ALA HA H 0.746 1.392 0.682
|
|
60
|
+
0 ALA HB1 H 1.459 -0.330 2.316
|
|
61
|
+
0 ALA HB2 H 0.715 -1.594 1.307
|
|
62
|
+
0 ALA HB3 H 2.113 -0.676 0.697
|
|
63
|
+
0 ALA HXT H 0.435 0.182 -2.647
|
|
64
|
+
>>> # Bonds
|
|
65
|
+
>>> print(alanine.atom_name[alanine.bonds.as_array()[:,:2]])
|
|
66
|
+
[['N' 'CA']
|
|
67
|
+
['N' 'H']
|
|
68
|
+
['N' 'H2']
|
|
69
|
+
['CA' 'C']
|
|
70
|
+
['CA' 'CB']
|
|
71
|
+
['CA' 'HA']
|
|
72
|
+
['C' 'O']
|
|
73
|
+
['C' 'OXT']
|
|
74
|
+
['CB' 'HB1']
|
|
75
|
+
['CB' 'HB2']
|
|
76
|
+
['CB' 'HB3']
|
|
77
|
+
['OXT' 'HXT']]
|
|
78
|
+
"""
|
|
79
|
+
# Use a cache internally, but always return a copy,
|
|
80
|
+
# as the returned AtomArray is mutable
|
|
81
|
+
return _residue(res_name, allow_missing_coord).copy()
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@functools.lru_cache(maxsize=100)
|
|
85
|
+
def _residue(res_name, allow_missing_coord=False):
|
|
86
|
+
# Avoid circular import
|
|
87
|
+
from biotite.structure.io.pdbx import get_component
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
component = get_component(
|
|
91
|
+
get_ccd(),
|
|
92
|
+
res_name=res_name,
|
|
93
|
+
allow_missing_coord=allow_missing_coord,
|
|
94
|
+
)
|
|
95
|
+
except KeyError:
|
|
96
|
+
raise KeyError(f"No atom information found for residue '{res_name}' in CCD")
|
|
97
|
+
component.hetero[:] = res_name not in NON_HETERO_RESIDUES
|
|
98
|
+
return component
|