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,26 @@
|
|
|
1
|
+
The transformations in 'spacegroups.json' are adapted from
|
|
2
|
+
'molstar/src/mol-math/geometry/spacegroup/tables.ts' from the Mol* project
|
|
3
|
+
(https://github.com/molstar/molstar) governed by the following license:
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
The MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2017 - now, Mol* contributors
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in
|
|
18
|
+
all copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
26
|
+
THE SOFTWARE.
|
biotite/structure/sse.py
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
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 allows estimation of secondary structure elements in protein
|
|
7
|
+
structures.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
__name__ = "biotite.structure"
|
|
11
|
+
__author__ = "Patrick Kunzmann"
|
|
12
|
+
__all__ = ["annotate_sse"]
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
from biotite.structure.celllist import CellList
|
|
16
|
+
from biotite.structure.filter import filter_amino_acids
|
|
17
|
+
from biotite.structure.geometry import angle, dihedral, distance
|
|
18
|
+
from biotite.structure.integrity import check_res_id_continuity
|
|
19
|
+
from biotite.structure.residues import get_residue_starts
|
|
20
|
+
|
|
21
|
+
_r_helix = (np.deg2rad(89 - 12), np.deg2rad(89 + 12))
|
|
22
|
+
_a_helix = (np.deg2rad(50 - 20), np.deg2rad(50 + 20))
|
|
23
|
+
_d2_helix = ((5.5 - 0.5), (5.5 + 0.5)) # Not used in the algorithm description
|
|
24
|
+
_d3_helix = ((5.3 - 0.5), (5.3 + 0.5))
|
|
25
|
+
_d4_helix = ((6.4 - 0.6), (6.4 + 0.6))
|
|
26
|
+
|
|
27
|
+
_r_strand = (np.deg2rad(124 - 14), np.deg2rad(124 + 14))
|
|
28
|
+
_a_strand = (np.deg2rad(-180), np.deg2rad(-125), np.deg2rad(145), np.deg2rad(180))
|
|
29
|
+
_d2_strand = ((6.7 - 0.6), (6.7 + 0.6))
|
|
30
|
+
_d3_strand = ((9.9 - 0.9), (9.9 + 0.9))
|
|
31
|
+
_d4_strand = ((12.4 - 1.1), (12.4 + 1.1))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def annotate_sse(atom_array):
|
|
35
|
+
r"""
|
|
36
|
+
Calculate the secondary structure elements (SSEs) of a
|
|
37
|
+
peptide chain based on the `P-SEA` algorithm.
|
|
38
|
+
:footcite:`Labesse1997`
|
|
39
|
+
|
|
40
|
+
The annotation is based CA coordinates only, specifically
|
|
41
|
+
distances and dihedral angles.
|
|
42
|
+
Discontinuities between chains are detected by residue ID.
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
atom_array : AtomArray
|
|
47
|
+
The atom array to annotate for.
|
|
48
|
+
Non-peptide residues are also allowed and obtain a ``''``
|
|
49
|
+
SSE.
|
|
50
|
+
|
|
51
|
+
Returns
|
|
52
|
+
-------
|
|
53
|
+
sse : ndarray
|
|
54
|
+
An array containing the secondary structure elements,
|
|
55
|
+
where the index corresponds to a residue of `atom_array`
|
|
56
|
+
(see e.g. :func:`get_residues()`).
|
|
57
|
+
``'a'`` means :math:`{\alpha}`-helix, ``'b'`` means
|
|
58
|
+
:math:`{\beta}`-strand/sheet, ``'c'`` means coil.
|
|
59
|
+
``''`` indicates that a residue is not an amino acid or it
|
|
60
|
+
comprises no ``CA`` atom.
|
|
61
|
+
|
|
62
|
+
Notes
|
|
63
|
+
-----
|
|
64
|
+
Although this function is based on the original `P-SEA` algorithm,
|
|
65
|
+
there are deviations compared to the official `P-SEA` software in
|
|
66
|
+
some cases.
|
|
67
|
+
Do not rely on getting the exact same results.
|
|
68
|
+
|
|
69
|
+
References
|
|
70
|
+
----------
|
|
71
|
+
|
|
72
|
+
.. footbibliography::
|
|
73
|
+
|
|
74
|
+
Examples
|
|
75
|
+
--------
|
|
76
|
+
|
|
77
|
+
SSE of PDB 1L2Y:
|
|
78
|
+
|
|
79
|
+
>>> sse = annotate_sse(atom_array)
|
|
80
|
+
>>> print(sse)
|
|
81
|
+
['c' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'c' 'c' 'c' 'c' 'c' 'c' 'c' 'c' 'c'
|
|
82
|
+
'c' 'c']
|
|
83
|
+
"""
|
|
84
|
+
residue_starts = get_residue_starts(atom_array)
|
|
85
|
+
# Sort CA coord into the coord array at the respective residue index
|
|
86
|
+
# If a residue has no CA, e.g. because it is not an amino acid,
|
|
87
|
+
# the coordinates for that residue remain NaN
|
|
88
|
+
ca_coord = np.full((len(residue_starts), 3), np.nan, dtype=np.float32)
|
|
89
|
+
ca_indices = np.where(
|
|
90
|
+
filter_amino_acids(atom_array) & (atom_array.atom_name == "CA")
|
|
91
|
+
)[0]
|
|
92
|
+
ca_coord[np.searchsorted(residue_starts, ca_indices, "right") - 1] = (
|
|
93
|
+
atom_array.coord[ca_indices]
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
if len(ca_coord) <= 5:
|
|
97
|
+
# The number of atoms is too small #
|
|
98
|
+
# to measure the distances/angles
|
|
99
|
+
# -> Return an SSE array where each amino acid is 'coil'
|
|
100
|
+
sse = np.full(len(ca_coord), "c", dtype="U1")
|
|
101
|
+
# Residues where coord are NaN do not belong to amino acids
|
|
102
|
+
# (or at least they have no CA)
|
|
103
|
+
sse[np.isnan(ca_coord).any(axis=-1)] = ""
|
|
104
|
+
return sse
|
|
105
|
+
|
|
106
|
+
# Add virtual residues w/o CA coord at chain discontinuity indices
|
|
107
|
+
# This ensures that such discontinuities are recognized for the
|
|
108
|
+
# purpose of geometric measurements
|
|
109
|
+
# -> the distances/angles spanning discontinuities are NaN
|
|
110
|
+
discont_indices = check_res_id_continuity(atom_array)
|
|
111
|
+
discont_res_indices = np.searchsorted(residue_starts, discont_indices, "right") - 1
|
|
112
|
+
ca_coord = np.insert(
|
|
113
|
+
ca_coord,
|
|
114
|
+
discont_res_indices,
|
|
115
|
+
np.full((len(discont_res_indices), 3), np.nan),
|
|
116
|
+
axis=0,
|
|
117
|
+
)
|
|
118
|
+
# Later the SSE for virtual residues are removed again
|
|
119
|
+
# via this mask
|
|
120
|
+
no_virtual_mask = np.ones(len(residue_starts), dtype=bool)
|
|
121
|
+
no_virtual_mask = np.insert(no_virtual_mask, discont_res_indices, False)
|
|
122
|
+
|
|
123
|
+
length = len(ca_coord)
|
|
124
|
+
|
|
125
|
+
# The distances and angles are not defined for the entire interval,
|
|
126
|
+
# therefore the indices do not have the full range
|
|
127
|
+
# Values that are not defined are NaN
|
|
128
|
+
d2i = np.full(length, np.nan)
|
|
129
|
+
d3i = np.full(length, np.nan)
|
|
130
|
+
d4i = np.full(length, np.nan)
|
|
131
|
+
ri = np.full(length, np.nan)
|
|
132
|
+
ai = np.full(length, np.nan)
|
|
133
|
+
|
|
134
|
+
d2i[1 : length - 1] = distance(ca_coord[0 : length - 2], ca_coord[2:length])
|
|
135
|
+
d3i[1 : length - 2] = distance(ca_coord[0 : length - 3], ca_coord[3:length])
|
|
136
|
+
d4i[1 : length - 3] = distance(ca_coord[0 : length - 4], ca_coord[4:length])
|
|
137
|
+
ri[1 : length - 1] = angle(
|
|
138
|
+
ca_coord[0 : length - 2], ca_coord[1 : length - 1], ca_coord[2:length]
|
|
139
|
+
)
|
|
140
|
+
ai[1 : length - 2] = dihedral(
|
|
141
|
+
ca_coord[0 : length - 3],
|
|
142
|
+
ca_coord[1 : length - 2],
|
|
143
|
+
ca_coord[2 : length - 1],
|
|
144
|
+
ca_coord[3 : length - 0],
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Find CA that meet criteria for potential helices and strands
|
|
148
|
+
relaxed_helix = ((d3i >= _d3_helix[0]) & (d3i <= _d3_helix[1])) | (
|
|
149
|
+
(ri >= _r_helix[0]) & (ri <= _r_helix[1])
|
|
150
|
+
)
|
|
151
|
+
strict_helix = (
|
|
152
|
+
(d3i >= _d3_helix[0])
|
|
153
|
+
& (d3i <= _d3_helix[1])
|
|
154
|
+
& (d4i >= _d4_helix[0])
|
|
155
|
+
& (d4i <= _d4_helix[1])
|
|
156
|
+
) | (
|
|
157
|
+
(ri >= _r_helix[0])
|
|
158
|
+
& (ri <= _r_helix[1])
|
|
159
|
+
& (ai >= _a_helix[0])
|
|
160
|
+
& (ai <= _a_helix[1])
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
relaxed_strand = (d3i >= _d3_strand[0]) & (d3i <= _d3_strand[1])
|
|
164
|
+
strict_strand = (
|
|
165
|
+
(d2i >= _d2_strand[0])
|
|
166
|
+
& (d2i <= _d2_strand[1])
|
|
167
|
+
& (d3i >= _d3_strand[0])
|
|
168
|
+
& (d3i <= _d3_strand[1])
|
|
169
|
+
& (d4i >= _d4_strand[0])
|
|
170
|
+
& (d4i <= _d4_strand[1])
|
|
171
|
+
) | (
|
|
172
|
+
(ri >= _r_strand[0])
|
|
173
|
+
& (ri <= _r_strand[1])
|
|
174
|
+
& (
|
|
175
|
+
# Account for periodic boundary of dihedral angle
|
|
176
|
+
((ai >= _a_strand[0]) & (ai <= _a_strand[1]))
|
|
177
|
+
| ((ai >= _a_strand[2]) & (ai <= _a_strand[3]))
|
|
178
|
+
)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
helix_mask = _mask_consecutive(strict_helix, 5)
|
|
182
|
+
helix_mask = _extend_region(helix_mask, relaxed_helix)
|
|
183
|
+
|
|
184
|
+
strand_mask = _mask_consecutive(strict_strand, 4)
|
|
185
|
+
short_strand_mask = _mask_regions_with_contacts(
|
|
186
|
+
ca_coord,
|
|
187
|
+
_mask_consecutive(strict_strand, 3),
|
|
188
|
+
min_contacts=5,
|
|
189
|
+
min_distance=4.2,
|
|
190
|
+
max_distance=5.2,
|
|
191
|
+
)
|
|
192
|
+
strand_mask = _extend_region(strand_mask | short_strand_mask, relaxed_strand)
|
|
193
|
+
|
|
194
|
+
sse = np.full(length, "c", dtype="U1")
|
|
195
|
+
sse[helix_mask] = "a"
|
|
196
|
+
sse[strand_mask] = "b"
|
|
197
|
+
# Residues where coord are NaN do not belong to amino acids
|
|
198
|
+
# (or at least they have no CA)
|
|
199
|
+
sse[np.isnan(ca_coord).any(axis=-1)] = ""
|
|
200
|
+
# Remove SSE for virtual atoms and return
|
|
201
|
+
return sse[no_virtual_mask]
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _mask_consecutive(mask, number):
|
|
205
|
+
"""
|
|
206
|
+
Find all regions in a mask with `number` consecutive ``True``
|
|
207
|
+
values.
|
|
208
|
+
Return a mask that is ``True`` for all indices in such a region and
|
|
209
|
+
``False`` otherwise.
|
|
210
|
+
"""
|
|
211
|
+
# An element is in a consecutive region,
|
|
212
|
+
# if it and the following `number-1` elements are True
|
|
213
|
+
# The elements `mask[-(number-1):]` cannot have the sufficient count
|
|
214
|
+
# by this definition, as they are at the end of the array
|
|
215
|
+
counts = np.zeros(len(mask) - (number - 1), dtype=int)
|
|
216
|
+
for i in range(number):
|
|
217
|
+
counts[mask[i : i + len(counts)]] += 1
|
|
218
|
+
consecutive_seed = counts == number
|
|
219
|
+
|
|
220
|
+
# Not only that element, but also the
|
|
221
|
+
# following `number-1` elements are in a consecutive region
|
|
222
|
+
consecutive_mask = np.zeros(len(mask), dtype=bool)
|
|
223
|
+
for i in range(number):
|
|
224
|
+
consecutive_mask[i : i + len(consecutive_seed)] |= consecutive_seed
|
|
225
|
+
|
|
226
|
+
return consecutive_mask
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def _extend_region(base_condition_mask, extension_condition_mask):
|
|
230
|
+
"""
|
|
231
|
+
Extend a ``True`` region in `base_condition_mask` by at maximum of
|
|
232
|
+
one element at each side, if such element fulfills
|
|
233
|
+
`extension_condition_mask.`
|
|
234
|
+
"""
|
|
235
|
+
# This mask always marks the start
|
|
236
|
+
# of either a 'True' or 'False' region
|
|
237
|
+
# Prepend absent region to the start to capture the event,
|
|
238
|
+
# that the first element is already the start of a region
|
|
239
|
+
region_change_mask = np.diff(np.append([False], base_condition_mask))
|
|
240
|
+
|
|
241
|
+
# These masks point to the first `False` element
|
|
242
|
+
# left and right of a 'True' region
|
|
243
|
+
# The left end is the element before the first element of a 'True' region
|
|
244
|
+
left_end_mask = region_change_mask & base_condition_mask
|
|
245
|
+
# Therefore the mask needs to be shifted to the left
|
|
246
|
+
left_end_mask = np.append(left_end_mask[1:], [False])
|
|
247
|
+
# The right end is first element of a 'False' region
|
|
248
|
+
right_end_mask = region_change_mask & ~base_condition_mask
|
|
249
|
+
|
|
250
|
+
# The 'base_condition_mask' gets additional 'True' elements
|
|
251
|
+
# at left or right ends, which meet the extension criterion
|
|
252
|
+
return base_condition_mask | (
|
|
253
|
+
(left_end_mask | right_end_mask) & extension_condition_mask
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def _mask_regions_with_contacts(
|
|
258
|
+
coord, candidate_mask, min_contacts, min_distance, max_distance
|
|
259
|
+
):
|
|
260
|
+
"""
|
|
261
|
+
Mask regions of `candidate_mask` that have at least `min_contacts`
|
|
262
|
+
contacts with `coord` in the range `min_distance` to `max_distance`.
|
|
263
|
+
"""
|
|
264
|
+
potential_contact_coord = coord[~np.isnan(coord).any(axis=-1)]
|
|
265
|
+
if len(potential_contact_coord) == 0:
|
|
266
|
+
# No potential contacts -> no contacts
|
|
267
|
+
# -> no residue can satisfy 'min_contacts'
|
|
268
|
+
return np.zeros(len(candidate_mask), dtype=bool)
|
|
269
|
+
|
|
270
|
+
cell_list = CellList(potential_contact_coord, max_distance)
|
|
271
|
+
# For each candidate position,
|
|
272
|
+
# get all contacts within maximum distance
|
|
273
|
+
all_within_max_dist_indices = cell_list.get_atoms(
|
|
274
|
+
coord[candidate_mask], max_distance
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
contacts = np.zeros(len(coord), dtype=int)
|
|
278
|
+
for i, atom_index in enumerate(np.where(candidate_mask)[0]):
|
|
279
|
+
within_max_dist_indices = all_within_max_dist_indices[i]
|
|
280
|
+
# Remove padding values
|
|
281
|
+
within_max_dist_indices = within_max_dist_indices[within_max_dist_indices != -1]
|
|
282
|
+
# Now count all contacts within maximum distance
|
|
283
|
+
# that also satisfy the minimum distance
|
|
284
|
+
contacts[atom_index] = np.count_nonzero(
|
|
285
|
+
distance(
|
|
286
|
+
coord[atom_index], potential_contact_coord[within_max_dist_indices]
|
|
287
|
+
)
|
|
288
|
+
> min_distance
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
# Count the number of contacts per region
|
|
292
|
+
# These indices mark the start of either a 'True' or 'False' region
|
|
293
|
+
# Prepend absent region to the start to capture the event,
|
|
294
|
+
# that the first element is already the start of a region
|
|
295
|
+
region_change_indices = np.where(np.diff(np.append([False], candidate_mask)))[0]
|
|
296
|
+
# Add exclusive stop
|
|
297
|
+
region_change_indices = np.append(region_change_indices, [len(coord)])
|
|
298
|
+
output_mask = np.zeros(len(candidate_mask), dtype=bool)
|
|
299
|
+
for i in range(len(region_change_indices) - 1):
|
|
300
|
+
start = region_change_indices[i]
|
|
301
|
+
stop = region_change_indices[i + 1]
|
|
302
|
+
total_contacts = np.sum(contacts[start:stop])
|
|
303
|
+
if total_contacts >= min_contacts:
|
|
304
|
+
output_mask[start:stop] = True
|
|
305
|
+
|
|
306
|
+
return output_mask
|