biotite 1.5.0__cp313-cp313-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-313-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-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmeralphabet.pyx +595 -0
- biotite/sequence/align/kmersimilarity.cpython-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmersimilarity.pyx +233 -0
- biotite/sequence/align/kmertable.cpython-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmertable.pyx +3411 -0
- biotite/sequence/align/localgapped.cpython-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/localgapped.pyx +892 -0
- biotite/sequence/align/localungapped.cpython-313-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-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/multiple.pyx +619 -0
- biotite/sequence/align/pairwise.cpython-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/pairwise.pyx +585 -0
- biotite/sequence/align/permutation.cpython-313-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-313-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-313-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-313-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-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/nj.pyx +221 -0
- biotite/sequence/phylo/tree.cpython-313-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/tree.pyx +1169 -0
- biotite/sequence/phylo/upgma.cpython-313-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-313-x86_64-linux-gnu.so +0 -0
- biotite/structure/bonds.pyx +2036 -0
- biotite/structure/box.py +724 -0
- biotite/structure/celllist.cpython-313-x86_64-linux-gnu.so +0 -0
- biotite/structure/celllist.pyx +864 -0
- biotite/structure/chains.py +310 -0
- biotite/structure/charges.cpython-313-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-313-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-313-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-313-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,149 @@
|
|
|
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__ = ["bond_type", "bonds_in_residue"]
|
|
8
|
+
|
|
9
|
+
import functools
|
|
10
|
+
from biotite.structure.bonds import BondType
|
|
11
|
+
from biotite.structure.info.ccd import get_from_ccd
|
|
12
|
+
|
|
13
|
+
BOND_TYPES = {
|
|
14
|
+
("SING", "N"): BondType.SINGLE,
|
|
15
|
+
("DOUB", "N"): BondType.DOUBLE,
|
|
16
|
+
("TRIP", "N"): BondType.TRIPLE,
|
|
17
|
+
("QUAD", "N"): BondType.QUADRUPLE,
|
|
18
|
+
("SING", "Y"): BondType.AROMATIC_SINGLE,
|
|
19
|
+
("DOUB", "Y"): BondType.AROMATIC_DOUBLE,
|
|
20
|
+
("TRIP", "Y"): BondType.AROMATIC_TRIPLE,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
_intra_bonds = {}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def bond_type(res_name, atom_name1, atom_name2):
|
|
27
|
+
"""
|
|
28
|
+
Get the :class:`BondType` for two atoms of the same residue, based
|
|
29
|
+
on the PDB chemical components dictionary.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
res_name : str
|
|
34
|
+
The up to 3-letter name of the residue
|
|
35
|
+
`atom_name1` and `atom_name2` belong to.
|
|
36
|
+
atom_name1, atom_name2 : str
|
|
37
|
+
The names of the two atoms to get the bond order from.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
order : BondType or None
|
|
42
|
+
The :class:`BondType` of the bond between `atom_name1` and
|
|
43
|
+
`atom_name2`.
|
|
44
|
+
If the atoms form no bond, if any of the two atoms does not
|
|
45
|
+
exist in the context of the residue or if the residue is unknown
|
|
46
|
+
to the chemical components dictionary, `None` is returned.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
|
|
51
|
+
>>> print(repr(bond_type("PHE", "CA", "CB")))
|
|
52
|
+
<BondType.SINGLE: 1>
|
|
53
|
+
>>> print(repr(bond_type("PHE", "CG", "CD1")))
|
|
54
|
+
<BondType.AROMATIC_DOUBLE: 6>
|
|
55
|
+
>>> print(repr(bond_type("PHE", "CA", "CG")))
|
|
56
|
+
None
|
|
57
|
+
>>> print(repr(bond_type("PHE", "FOO", "BAR")))
|
|
58
|
+
None
|
|
59
|
+
"""
|
|
60
|
+
bonds_for_residue = bonds_in_residue(res_name)
|
|
61
|
+
if bonds_for_residue is None:
|
|
62
|
+
return None
|
|
63
|
+
# Try both atom orders
|
|
64
|
+
bond_type_int = bonds_for_residue.get(
|
|
65
|
+
(atom_name1, atom_name2), bonds_for_residue.get((atom_name2, atom_name1))
|
|
66
|
+
)
|
|
67
|
+
if bond_type_int is not None:
|
|
68
|
+
return BondType(bond_type_int)
|
|
69
|
+
else:
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@functools.cache
|
|
74
|
+
def bonds_in_residue(res_name):
|
|
75
|
+
"""
|
|
76
|
+
Get a dictionary containing all atoms inside a given residue
|
|
77
|
+
that form a bond.
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
res_name : str
|
|
82
|
+
The up to 3-letter name of the residue to get the bonds for.
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
bonds : dict ((str, str) -> int)
|
|
87
|
+
A dictionary that maps tuples of two atom names to their
|
|
88
|
+
respective bond types (represented as integer).
|
|
89
|
+
Empty, if the residue is unknown to the
|
|
90
|
+
chemical components dictionary.
|
|
91
|
+
|
|
92
|
+
Warnings
|
|
93
|
+
--------
|
|
94
|
+
Treat the returned dictionary as immutable.
|
|
95
|
+
Modifying the dictionary may lead to unexpected behavior.
|
|
96
|
+
In other functionalities throughout *Biotite* that uses this
|
|
97
|
+
function.
|
|
98
|
+
|
|
99
|
+
Notes
|
|
100
|
+
-----
|
|
101
|
+
The returned values are cached for faster access in subsequent calls.
|
|
102
|
+
|
|
103
|
+
Examples
|
|
104
|
+
--------
|
|
105
|
+
>>> bonds = bonds_in_residue("PHE")
|
|
106
|
+
>>> for atoms, bond_type_int in sorted(bonds.items()):
|
|
107
|
+
... atom1, atom2 = sorted(atoms)
|
|
108
|
+
... print(f"{atom1:3} + {atom2:3} -> {BondType(bond_type_int).name}")
|
|
109
|
+
C + O -> DOUBLE
|
|
110
|
+
C + OXT -> SINGLE
|
|
111
|
+
C + CA -> SINGLE
|
|
112
|
+
CA + CB -> SINGLE
|
|
113
|
+
CA + HA -> SINGLE
|
|
114
|
+
CB + CG -> SINGLE
|
|
115
|
+
CB + HB2 -> SINGLE
|
|
116
|
+
CB + HB3 -> SINGLE
|
|
117
|
+
CD1 + CE1 -> AROMATIC_SINGLE
|
|
118
|
+
CD1 + HD1 -> SINGLE
|
|
119
|
+
CD2 + CE2 -> AROMATIC_DOUBLE
|
|
120
|
+
CD2 + HD2 -> SINGLE
|
|
121
|
+
CE1 + CZ -> AROMATIC_DOUBLE
|
|
122
|
+
CE1 + HE1 -> SINGLE
|
|
123
|
+
CE2 + CZ -> AROMATIC_SINGLE
|
|
124
|
+
CE2 + HE2 -> SINGLE
|
|
125
|
+
CD1 + CG -> AROMATIC_DOUBLE
|
|
126
|
+
CD2 + CG -> AROMATIC_SINGLE
|
|
127
|
+
CZ + HZ -> SINGLE
|
|
128
|
+
CA + N -> SINGLE
|
|
129
|
+
H + N -> SINGLE
|
|
130
|
+
H2 + N -> SINGLE
|
|
131
|
+
HXT + OXT -> SINGLE
|
|
132
|
+
"""
|
|
133
|
+
global _intra_bonds
|
|
134
|
+
if res_name not in _intra_bonds:
|
|
135
|
+
chem_comp_bond = get_from_ccd("chem_comp_bond", res_name)
|
|
136
|
+
if chem_comp_bond is None:
|
|
137
|
+
_intra_bonds[res_name] = {}
|
|
138
|
+
else:
|
|
139
|
+
bonds_for_residue = {}
|
|
140
|
+
for atom1, atom2, order, aromatic_flag in zip(
|
|
141
|
+
chem_comp_bond["atom_id_1"].as_array(),
|
|
142
|
+
chem_comp_bond["atom_id_2"].as_array(),
|
|
143
|
+
chem_comp_bond["value_order"].as_array(),
|
|
144
|
+
chem_comp_bond["pdbx_aromatic_flag"].as_array(),
|
|
145
|
+
):
|
|
146
|
+
bond_type = BOND_TYPES[order, aromatic_flag]
|
|
147
|
+
bonds_for_residue[atom1.item(), atom2.item()] = bond_type
|
|
148
|
+
_intra_bonds[res_name] = bonds_for_residue
|
|
149
|
+
return _intra_bonds[res_name]
|
|
@@ -0,0 +1,200 @@
|
|
|
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__ = ["get_ccd", "set_ccd_path", "get_from_ccd"]
|
|
8
|
+
|
|
9
|
+
import functools
|
|
10
|
+
import importlib
|
|
11
|
+
import inspect
|
|
12
|
+
import pkgutil
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
import numpy as np
|
|
15
|
+
|
|
16
|
+
_CCD_FILE = Path(__file__).parent / "components.bcif"
|
|
17
|
+
_SPECIAL_ID_COLUMN_NAMES = {
|
|
18
|
+
"chem_comp": "id",
|
|
19
|
+
}
|
|
20
|
+
_DEFAULT_ID_COLUMN_NAME = "comp_id"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@functools.cache
|
|
24
|
+
def get_ccd():
|
|
25
|
+
"""
|
|
26
|
+
Get the internal subset of the PDB
|
|
27
|
+
*Chemical Component Dictionary* (CCD).
|
|
28
|
+
:footcite:`Westbrook2015`
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
ccd : BinaryCIFBlock
|
|
33
|
+
The CCD.
|
|
34
|
+
It contains the categories `chem_comp`, `chem_comp_atom` and `chem_comp_bond`.
|
|
35
|
+
|
|
36
|
+
Warnings
|
|
37
|
+
--------
|
|
38
|
+
|
|
39
|
+
Consider the return value as read-only.
|
|
40
|
+
As other functions cache data from it, changing data may lead to undefined
|
|
41
|
+
behavior.
|
|
42
|
+
|
|
43
|
+
References
|
|
44
|
+
----------
|
|
45
|
+
|
|
46
|
+
.. footbibliography::
|
|
47
|
+
"""
|
|
48
|
+
# Avoid circular import
|
|
49
|
+
from biotite.structure.io.pdbx.bcif import BinaryCIFFile
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
return BinaryCIFFile.read(_CCD_FILE).block
|
|
53
|
+
except FileNotFoundError:
|
|
54
|
+
raise RuntimeError(
|
|
55
|
+
"Internal CCD not found. Please run 'python -m biotite.setup_ccd'."
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def set_ccd_path(ccd_path):
|
|
60
|
+
"""
|
|
61
|
+
Replace the internal *Chemical Component Dictionary* (CCD) with a custom one.
|
|
62
|
+
|
|
63
|
+
This function also clears the cache of functions depending on the CCD to ensure
|
|
64
|
+
that the new CCD is used.
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
ccd_path : path-like
|
|
69
|
+
The path to the custom CCD in BinaryCIF format, prepared with the
|
|
70
|
+
``setup_ccd.py`` module.
|
|
71
|
+
|
|
72
|
+
Notes
|
|
73
|
+
-----
|
|
74
|
+
This function is intended for advanced users who need to add information for
|
|
75
|
+
compounds, which are not part of the internal CCD.
|
|
76
|
+
The reason might be that an updated version already exists upstream or that
|
|
77
|
+
the user wants to add custom compounds to the CCD.
|
|
78
|
+
"""
|
|
79
|
+
global _CCD_FILE
|
|
80
|
+
_CCD_FILE = Path(ccd_path)
|
|
81
|
+
|
|
82
|
+
# Clear caches in all functions in biotite.structure.info
|
|
83
|
+
info_modules = [
|
|
84
|
+
importlib.import_module(f"biotite.structure.info.{mod_name}")
|
|
85
|
+
for _, mod_name, _ in pkgutil.iter_modules([str(Path(__file__).parent)])
|
|
86
|
+
]
|
|
87
|
+
for module in info_modules:
|
|
88
|
+
for _, function in inspect.getmembers(module, callable):
|
|
89
|
+
if hasattr(function, "cache_clear"):
|
|
90
|
+
function.cache_clear()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@functools.cache
|
|
94
|
+
def get_from_ccd(category_name, comp_id, column_name=None):
|
|
95
|
+
"""
|
|
96
|
+
Get the rows for the given residue in the given category from the
|
|
97
|
+
internal subset of the PDB *Chemical Component Dictionary* (CCD).
|
|
98
|
+
:footcite:`Westbrook2015`
|
|
99
|
+
|
|
100
|
+
Parameters
|
|
101
|
+
----------
|
|
102
|
+
category_name : str
|
|
103
|
+
The category in the CCD.
|
|
104
|
+
comp_id : str
|
|
105
|
+
The residue identifier, i.e. the ``res_name``.
|
|
106
|
+
column_name : str, optional
|
|
107
|
+
The name of the column to be retrieved.
|
|
108
|
+
If None, all columns are returned as dictionary.
|
|
109
|
+
By default None.
|
|
110
|
+
|
|
111
|
+
Returns
|
|
112
|
+
-------
|
|
113
|
+
slice : BinaryCIFCategory or BinaryCIFColumn
|
|
114
|
+
The category or column (if `column_name` is provided) containing only the rows
|
|
115
|
+
for the given residue.
|
|
116
|
+
|
|
117
|
+
Notes
|
|
118
|
+
-----
|
|
119
|
+
The returned values are cached for faster access in subsequent calls.
|
|
120
|
+
|
|
121
|
+
References
|
|
122
|
+
----------
|
|
123
|
+
|
|
124
|
+
.. footbibliography::
|
|
125
|
+
"""
|
|
126
|
+
try:
|
|
127
|
+
start, stop = _residue_index(category_name)[comp_id]
|
|
128
|
+
except KeyError:
|
|
129
|
+
return None
|
|
130
|
+
|
|
131
|
+
category = get_ccd()[category_name]
|
|
132
|
+
if column_name is None:
|
|
133
|
+
return _filter_category(category, slice(start, stop))
|
|
134
|
+
else:
|
|
135
|
+
return _filter_column(category[column_name], slice(start, stop))
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@functools.cache
|
|
139
|
+
def _residue_index(category_name):
|
|
140
|
+
"""
|
|
141
|
+
Get the start and stop index for each component name in the given
|
|
142
|
+
CCD category.
|
|
143
|
+
|
|
144
|
+
Parameters
|
|
145
|
+
----------
|
|
146
|
+
category_name : str
|
|
147
|
+
The category to determine start and stop indices for each component in.
|
|
148
|
+
|
|
149
|
+
Returns
|
|
150
|
+
-------
|
|
151
|
+
index : dict (str -> (int, int))
|
|
152
|
+
The index maps each present component name to the corresponding
|
|
153
|
+
start and exclusive stop index in `id_column`.
|
|
154
|
+
"""
|
|
155
|
+
category = get_ccd()[category_name]
|
|
156
|
+
id_column_name = _SPECIAL_ID_COLUMN_NAMES.get(
|
|
157
|
+
category_name, _DEFAULT_ID_COLUMN_NAME
|
|
158
|
+
)
|
|
159
|
+
id_column = category[id_column_name].as_array()
|
|
160
|
+
|
|
161
|
+
residue_starts = np.where(id_column[:-1] != id_column[1:])[0] + 1
|
|
162
|
+
# The final start is the exclusive stop of last residue
|
|
163
|
+
residue_starts = np.concatenate(([0], residue_starts, [len(id_column)]))
|
|
164
|
+
index = {}
|
|
165
|
+
for i in range(len(residue_starts) - 1):
|
|
166
|
+
comp_id = id_column[residue_starts[i]].item()
|
|
167
|
+
index[comp_id] = (residue_starts[i], residue_starts[i + 1])
|
|
168
|
+
return index
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _filter_category(category, index):
|
|
172
|
+
"""
|
|
173
|
+
Reduce the category to the values for the given index.∂
|
|
174
|
+
"""
|
|
175
|
+
# Avoid circular import
|
|
176
|
+
from biotite.structure.io.pdbx.bcif import BinaryCIFCategory
|
|
177
|
+
|
|
178
|
+
return BinaryCIFCategory(
|
|
179
|
+
{key: _filter_column(column, index) for key, column in category.items()}
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _filter_column(column, index):
|
|
184
|
+
"""
|
|
185
|
+
Reduce the column to the values for the given index.
|
|
186
|
+
"""
|
|
187
|
+
# Avoid circular import
|
|
188
|
+
from biotite.structure.io.pdbx.bcif import BinaryCIFColumn, BinaryCIFData
|
|
189
|
+
from biotite.structure.io.pdbx.component import MaskValue
|
|
190
|
+
|
|
191
|
+
data_array = column.data.array[index]
|
|
192
|
+
mask_array = column.mask.array[index] if column.mask is not None else None
|
|
193
|
+
return BinaryCIFColumn(
|
|
194
|
+
BinaryCIFData(data_array),
|
|
195
|
+
(
|
|
196
|
+
BinaryCIFData(mask_array)
|
|
197
|
+
if column.mask is not None and (mask_array != MaskValue.PRESENT).any()
|
|
198
|
+
else None
|
|
199
|
+
),
|
|
200
|
+
)
|
|
Binary file
|
|
@@ -0,0 +1,128 @@
|
|
|
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__ = "Tom David Müller, Patrick Kunzmann"
|
|
7
|
+
__all__ = ["amino_acid_names", "nucleotide_names", "carbohydrate_names"]
|
|
8
|
+
|
|
9
|
+
import functools
|
|
10
|
+
import numpy as np
|
|
11
|
+
from biotite.structure.info.ccd import get_ccd
|
|
12
|
+
|
|
13
|
+
_AMINO_ACID_TYPES = [
|
|
14
|
+
"D-beta-peptide, C-gamma linking",
|
|
15
|
+
"D-gamma-peptide, C-delta linking",
|
|
16
|
+
"D-peptide COOH carboxy terminus",
|
|
17
|
+
"D-peptide NH3 amino terminus",
|
|
18
|
+
"D-peptide linking",
|
|
19
|
+
"L-beta-peptide, C-gamma linking",
|
|
20
|
+
"L-gamma-peptide, C-delta linking",
|
|
21
|
+
"L-peptide COOH carboxy terminus",
|
|
22
|
+
"L-peptide NH3 amino terminus",
|
|
23
|
+
"L-peptide linking",
|
|
24
|
+
"peptide linking",
|
|
25
|
+
]
|
|
26
|
+
_NUCLEOTIDE_TYPES = [
|
|
27
|
+
"DNA OH 3 prime terminus",
|
|
28
|
+
"DNA OH 5 prime terminus",
|
|
29
|
+
"DNA linking",
|
|
30
|
+
"L-DNA linking",
|
|
31
|
+
"L-RNA linking",
|
|
32
|
+
"RNA OH 3 prime terminus",
|
|
33
|
+
"RNA OH 5 prime terminus",
|
|
34
|
+
"RNA linking",
|
|
35
|
+
]
|
|
36
|
+
_CARBOHYDRATE_TYPES = [
|
|
37
|
+
"D-saccharide",
|
|
38
|
+
"D-saccharide, alpha linking",
|
|
39
|
+
"D-saccharide, beta linking",
|
|
40
|
+
"L-saccharide",
|
|
41
|
+
"L-saccharide, alpha linking",
|
|
42
|
+
"L-saccharide, beta linking",
|
|
43
|
+
"saccharide",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@functools.cache
|
|
48
|
+
def amino_acid_names():
|
|
49
|
+
"""
|
|
50
|
+
Get a tuple of amino acid three-letter codes according to the
|
|
51
|
+
PDB *Chemical Component Dictionary*.
|
|
52
|
+
:footcite:`Westbrook2015`
|
|
53
|
+
|
|
54
|
+
Returns
|
|
55
|
+
-------
|
|
56
|
+
amino_acid_names : tuple of str
|
|
57
|
+
A list of three-letter-codes containing residues that are
|
|
58
|
+
peptide monomers.
|
|
59
|
+
|
|
60
|
+
References
|
|
61
|
+
----------
|
|
62
|
+
|
|
63
|
+
.. footbibliography::
|
|
64
|
+
"""
|
|
65
|
+
return _get_group_members(_AMINO_ACID_TYPES)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@functools.cache
|
|
69
|
+
def nucleotide_names():
|
|
70
|
+
"""
|
|
71
|
+
Get a tuple of nucleotide three-letter codes according to the
|
|
72
|
+
PDB *Chemical Component Dictionary*.
|
|
73
|
+
:footcite:`Westbrook2015`
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
nucleotide_names : tuple of str
|
|
78
|
+
A list of three-letter-codes containing residues that are
|
|
79
|
+
DNA/RNA monomers.
|
|
80
|
+
|
|
81
|
+
References
|
|
82
|
+
----------
|
|
83
|
+
|
|
84
|
+
.. footbibliography::
|
|
85
|
+
"""
|
|
86
|
+
return _get_group_members(_NUCLEOTIDE_TYPES)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@functools.cache
|
|
90
|
+
def carbohydrate_names():
|
|
91
|
+
"""
|
|
92
|
+
Get a tuple of carbohydrate three-letter codes according to the
|
|
93
|
+
PDB *Chemical Component Dictionary*.
|
|
94
|
+
:footcite:`Westbrook2015`
|
|
95
|
+
|
|
96
|
+
Returns
|
|
97
|
+
-------
|
|
98
|
+
carbohydrate_names : tuple of str
|
|
99
|
+
A list of three-letter-codes containing residues that are
|
|
100
|
+
saccharide monomers.
|
|
101
|
+
|
|
102
|
+
References
|
|
103
|
+
----------
|
|
104
|
+
|
|
105
|
+
.. footbibliography::
|
|
106
|
+
"""
|
|
107
|
+
return _get_group_members(_CARBOHYDRATE_TYPES)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _get_group_members(match_types):
|
|
111
|
+
"""
|
|
112
|
+
Identify component IDs that matches a given component *type* from the CCD.
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
match_types : list of str
|
|
117
|
+
The component types to extract.
|
|
118
|
+
|
|
119
|
+
Returns
|
|
120
|
+
-------
|
|
121
|
+
comp_ids : list of str
|
|
122
|
+
The extracted component IDs.
|
|
123
|
+
"""
|
|
124
|
+
category = get_ccd()["chem_comp"]
|
|
125
|
+
comp_ids = category["id"].as_array()
|
|
126
|
+
types = category["type"].as_array()
|
|
127
|
+
# Ignore case
|
|
128
|
+
return comp_ids[np.isin(np.char.lower(types), np.char.lower(match_types))].tolist()
|
|
@@ -0,0 +1,121 @@
|
|
|
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__ = ["mass"]
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from biotite.structure.atoms import Atom, AtomArray, AtomArrayStack
|
|
12
|
+
from biotite.structure.info.ccd import get_from_ccd
|
|
13
|
+
|
|
14
|
+
# Masses are taken from http://www.sbcs.qmul.ac.uk/iupac/AtWt/ (2018/03/01)
|
|
15
|
+
ATOM_MASSES_FILE = Path(__file__).parent / "atom_masses.json"
|
|
16
|
+
_atom_masses = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def mass(item, is_residue=None):
|
|
20
|
+
"""
|
|
21
|
+
Calculate the mass for the given object.
|
|
22
|
+
:footcite:`Meija2016`
|
|
23
|
+
|
|
24
|
+
If a residue name is given, the mass values refer to the masses of
|
|
25
|
+
the complete molecule without additional or missing protons.
|
|
26
|
+
In case of residues in a longer chain, some atoms might be missing
|
|
27
|
+
from the molecule.
|
|
28
|
+
For example non-terminal residues in a protein or nucleotide chain
|
|
29
|
+
miss the mass of a water molecule.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
item : str or Atom or AtomArray or AtomArrayStack
|
|
34
|
+
The atom or molecule to get the mass for.
|
|
35
|
+
If a string is given, it is interpreted as residue name or
|
|
36
|
+
chemical element.
|
|
37
|
+
If an :class:`Atom` is given the mass is taken from its element.
|
|
38
|
+
If an :class:`AtomArray` or :class:`AtomArrayStack` is given the
|
|
39
|
+
mass is the sum of the mass of its atoms.
|
|
40
|
+
is_residue : bool, optional
|
|
41
|
+
If set to true and a string is given for `item`, the string
|
|
42
|
+
will be strictly interpreted as residue.
|
|
43
|
+
If set to false, the string is strictly interpreted as element.
|
|
44
|
+
By default the string will be interpreted as element at first
|
|
45
|
+
and secondly as residue name, if the element is unknown.
|
|
46
|
+
|
|
47
|
+
Returns
|
|
48
|
+
-------
|
|
49
|
+
mass : float or None
|
|
50
|
+
The mass of the given object in *u*. None if the mass is unknown.
|
|
51
|
+
|
|
52
|
+
References
|
|
53
|
+
----------
|
|
54
|
+
|
|
55
|
+
.. footbibliography::
|
|
56
|
+
|
|
57
|
+
Examples
|
|
58
|
+
--------
|
|
59
|
+
|
|
60
|
+
>>> print(mass(atom_array))
|
|
61
|
+
2170.438
|
|
62
|
+
>>> first_residue = list(residue_iter(atom_array))[0]
|
|
63
|
+
>>> print(first_residue)
|
|
64
|
+
A 1 ASN N N -8.901 4.127 -0.555
|
|
65
|
+
A 1 ASN CA C -8.608 3.135 -1.618
|
|
66
|
+
A 1 ASN C C -7.117 2.964 -1.897
|
|
67
|
+
A 1 ASN O O -6.634 1.849 -1.758
|
|
68
|
+
A 1 ASN CB C -9.437 3.396 -2.889
|
|
69
|
+
A 1 ASN CG C -10.915 3.130 -2.611
|
|
70
|
+
A 1 ASN OD1 O -11.269 2.700 -1.524
|
|
71
|
+
A 1 ASN ND2 N -11.806 3.406 -3.543
|
|
72
|
+
A 1 ASN H1 H -8.330 3.957 0.261
|
|
73
|
+
A 1 ASN H2 H -8.740 5.068 -0.889
|
|
74
|
+
A 1 ASN H3 H -9.877 4.041 -0.293
|
|
75
|
+
A 1 ASN HA H -8.930 2.162 -1.239
|
|
76
|
+
A 1 ASN HB2 H -9.310 4.417 -3.193
|
|
77
|
+
A 1 ASN HB3 H -9.108 2.719 -3.679
|
|
78
|
+
A 1 ASN HD21 H -11.572 3.791 -4.444
|
|
79
|
+
A 1 ASN HD22 H -12.757 3.183 -3.294
|
|
80
|
+
>>> print(mass("ASN"))
|
|
81
|
+
132.118
|
|
82
|
+
>>> first_atom = first_residue[0]
|
|
83
|
+
>>> print(first_atom)
|
|
84
|
+
A 1 ASN N N -8.901 4.127 -0.555
|
|
85
|
+
>>> print(mass(first_atom))
|
|
86
|
+
14.007
|
|
87
|
+
>>> print(mass("N"))
|
|
88
|
+
14.007
|
|
89
|
+
"""
|
|
90
|
+
global _atom_masses
|
|
91
|
+
with open(ATOM_MASSES_FILE, "r") as file:
|
|
92
|
+
_atom_masses = json.load(file)
|
|
93
|
+
|
|
94
|
+
if isinstance(item, str):
|
|
95
|
+
if is_residue is None:
|
|
96
|
+
result_mass = _atom_masses.get(item.upper())
|
|
97
|
+
if result_mass is None:
|
|
98
|
+
result_mass = _mass_for_residue(item)
|
|
99
|
+
elif not is_residue:
|
|
100
|
+
result_mass = _atom_masses.get(item.upper())
|
|
101
|
+
else:
|
|
102
|
+
result_mass = _mass_for_residue(item)
|
|
103
|
+
|
|
104
|
+
elif isinstance(item, Atom):
|
|
105
|
+
result_mass = mass(item.element, is_residue=False)
|
|
106
|
+
elif isinstance(item, AtomArray) or isinstance(item, AtomArrayStack):
|
|
107
|
+
result_mass = sum((mass(element, is_residue=False) for element in item.element))
|
|
108
|
+
|
|
109
|
+
else:
|
|
110
|
+
raise TypeError(f"Cannot calculate mass for {type(item).__name__} objects")
|
|
111
|
+
|
|
112
|
+
if result_mass is None:
|
|
113
|
+
raise KeyError(f"{item} is not known")
|
|
114
|
+
return result_mass
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _mass_for_residue(res_name):
|
|
118
|
+
column = get_from_ccd("chem_comp", res_name.upper(), "formula_weight")
|
|
119
|
+
if column is None:
|
|
120
|
+
raise KeyError(f"Residue '{res_name}' is not known")
|
|
121
|
+
return column.as_item()
|