biotite 1.5.0__cp312-cp312-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-312-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-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmeralphabet.pyx +595 -0
- biotite/sequence/align/kmersimilarity.cpython-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmersimilarity.pyx +233 -0
- biotite/sequence/align/kmertable.cpython-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmertable.pyx +3411 -0
- biotite/sequence/align/localgapped.cpython-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/localgapped.pyx +892 -0
- biotite/sequence/align/localungapped.cpython-312-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-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/multiple.pyx +619 -0
- biotite/sequence/align/pairwise.cpython-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/pairwise.pyx +585 -0
- biotite/sequence/align/permutation.cpython-312-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-312-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-312-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-312-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-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/nj.pyx +221 -0
- biotite/sequence/phylo/tree.cpython-312-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/tree.pyx +1169 -0
- biotite/sequence/phylo/upgma.cpython-312-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-312-x86_64-linux-gnu.so +0 -0
- biotite/structure/bonds.pyx +2036 -0
- biotite/structure/box.py +724 -0
- biotite/structure/celllist.cpython-312-x86_64-linux-gnu.so +0 -0
- biotite/structure/celllist.pyx +864 -0
- biotite/structure/chains.py +310 -0
- biotite/structure/charges.cpython-312-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-312-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-312-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-312-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
biotite/file.py
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
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"
|
|
6
|
+
__author__ = "Patrick Kunzmann"
|
|
7
|
+
__all__ = [
|
|
8
|
+
"File",
|
|
9
|
+
"TextFile",
|
|
10
|
+
"InvalidFileError",
|
|
11
|
+
"SerializationError",
|
|
12
|
+
"DeserializationError",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
import abc
|
|
16
|
+
import copy
|
|
17
|
+
import io
|
|
18
|
+
from os import PathLike
|
|
19
|
+
from biotite.copyable import Copyable
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class File(Copyable, metaclass=abc.ABCMeta):
|
|
23
|
+
"""
|
|
24
|
+
Base class for all file classes.
|
|
25
|
+
The constructor creates an empty file, that can be filled with data
|
|
26
|
+
using the class specific setter methods.
|
|
27
|
+
Conversely, the class method :func:`read()` reads a file from disk
|
|
28
|
+
(or a file-like object from other sources).
|
|
29
|
+
In order to write the instance content into a file the
|
|
30
|
+
:func:`write()` method is used.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
@abc.abstractmethod
|
|
35
|
+
def read(cls, file):
|
|
36
|
+
"""
|
|
37
|
+
Parse a file (or file-like object).
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
file : file-like object or str
|
|
42
|
+
The file to be read.
|
|
43
|
+
Alternatively a file path can be supplied.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
file : File
|
|
48
|
+
An instance from the respective :class:`File` subclass
|
|
49
|
+
representing the parsed file.
|
|
50
|
+
"""
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
@abc.abstractmethod
|
|
54
|
+
def write(self, file):
|
|
55
|
+
"""
|
|
56
|
+
Write the contents of this :class:`File` object into a file.
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
file : file-like object or str
|
|
61
|
+
The file to be written to.
|
|
62
|
+
Alternatively a file path can be supplied.
|
|
63
|
+
"""
|
|
64
|
+
pass
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class TextFile(File, metaclass=abc.ABCMeta):
|
|
68
|
+
"""
|
|
69
|
+
Base class for all line based text files.
|
|
70
|
+
When reading a file, the text content is saved as list of strings,
|
|
71
|
+
one for each line.
|
|
72
|
+
When writing a file, this list is written into the file.
|
|
73
|
+
|
|
74
|
+
Attributes
|
|
75
|
+
----------
|
|
76
|
+
lines : list
|
|
77
|
+
List of string representing the lines in the text file.
|
|
78
|
+
PROTECTED: Do not modify from outside.
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
def __init__(self):
|
|
82
|
+
super().__init__()
|
|
83
|
+
self.lines = []
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def read(cls, file, *args, **kwargs):
|
|
87
|
+
# File name
|
|
88
|
+
if is_open_compatible(file):
|
|
89
|
+
with open(file, "r") as f:
|
|
90
|
+
lines = f.read().splitlines()
|
|
91
|
+
# File object
|
|
92
|
+
else:
|
|
93
|
+
if not is_text(file):
|
|
94
|
+
raise TypeError("A file opened in 'text' mode is required")
|
|
95
|
+
lines = file.read().splitlines()
|
|
96
|
+
file_object = cls(*args, **kwargs)
|
|
97
|
+
file_object.lines = lines
|
|
98
|
+
return file_object
|
|
99
|
+
|
|
100
|
+
@staticmethod
|
|
101
|
+
def read_iter(file):
|
|
102
|
+
"""
|
|
103
|
+
Create an iterator over each line of the given text file.
|
|
104
|
+
|
|
105
|
+
Parameters
|
|
106
|
+
----------
|
|
107
|
+
file : file-like object or str
|
|
108
|
+
The file to be read.
|
|
109
|
+
Alternatively a file path can be supplied.
|
|
110
|
+
|
|
111
|
+
Yields
|
|
112
|
+
------
|
|
113
|
+
line : str
|
|
114
|
+
The current line in the file.
|
|
115
|
+
"""
|
|
116
|
+
# File name
|
|
117
|
+
if is_open_compatible(file):
|
|
118
|
+
with open(file, "r") as f:
|
|
119
|
+
yield from f
|
|
120
|
+
# File object
|
|
121
|
+
else:
|
|
122
|
+
if not is_text(file):
|
|
123
|
+
raise TypeError("A file opened in 'text' mode is required")
|
|
124
|
+
yield from file
|
|
125
|
+
|
|
126
|
+
def write(self, file):
|
|
127
|
+
"""
|
|
128
|
+
Write the contents of this object into a file
|
|
129
|
+
(or file-like object).
|
|
130
|
+
|
|
131
|
+
Parameters
|
|
132
|
+
----------
|
|
133
|
+
file : file-like object or str
|
|
134
|
+
The file to be written to.
|
|
135
|
+
Alternatively a file path can be supplied.
|
|
136
|
+
"""
|
|
137
|
+
if is_open_compatible(file):
|
|
138
|
+
with open(file, "w") as f:
|
|
139
|
+
f.write("\n".join(self.lines) + "\n")
|
|
140
|
+
else:
|
|
141
|
+
if not is_text(file):
|
|
142
|
+
raise TypeError("A file opened in 'text' mode is required")
|
|
143
|
+
file.write("\n".join(self.lines) + "\n")
|
|
144
|
+
|
|
145
|
+
@staticmethod
|
|
146
|
+
def write_iter(file, lines):
|
|
147
|
+
"""
|
|
148
|
+
Iterate over the given `lines` of text and write each line into
|
|
149
|
+
the specified `file`.
|
|
150
|
+
|
|
151
|
+
In contrast to :meth:`write()`, each line of text is not stored
|
|
152
|
+
in an intermediate :class:`TextFile`, but is directly written
|
|
153
|
+
to the file.
|
|
154
|
+
Hence, this static method may save a large amount of memory if
|
|
155
|
+
a large file should be written, especially if the `lines`
|
|
156
|
+
are provided as generator.
|
|
157
|
+
|
|
158
|
+
Parameters
|
|
159
|
+
----------
|
|
160
|
+
file : file-like object or str
|
|
161
|
+
The file to be written to.
|
|
162
|
+
Alternatively a file path can be supplied.
|
|
163
|
+
lines : generator or array-like of str
|
|
164
|
+
The lines of text to be written.
|
|
165
|
+
Must not include line break characters.
|
|
166
|
+
"""
|
|
167
|
+
if is_open_compatible(file):
|
|
168
|
+
with open(file, "w") as f:
|
|
169
|
+
for line in lines:
|
|
170
|
+
f.write(line + "\n")
|
|
171
|
+
else:
|
|
172
|
+
if not is_text(file):
|
|
173
|
+
raise TypeError("A file opened in 'text' mode is required")
|
|
174
|
+
for line in lines:
|
|
175
|
+
file.write(line + "\n")
|
|
176
|
+
|
|
177
|
+
def __copy_fill__(self, clone):
|
|
178
|
+
super().__copy_fill__(clone)
|
|
179
|
+
clone.lines = copy.copy(self.lines)
|
|
180
|
+
|
|
181
|
+
def __str__(self):
|
|
182
|
+
return "\n".join(self.lines)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class InvalidFileError(Exception):
|
|
186
|
+
"""
|
|
187
|
+
Indicates that the file is not suitable for the requested action,
|
|
188
|
+
either because the file does not contain the required data or
|
|
189
|
+
because the file is malformed.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
pass
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class SerializationError(Exception):
|
|
196
|
+
pass
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class DeserializationError(Exception):
|
|
200
|
+
pass
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def wrap_string(text, width):
|
|
204
|
+
"""
|
|
205
|
+
A much simpler and hence much more efficient version of
|
|
206
|
+
`textwrap.wrap()`.
|
|
207
|
+
|
|
208
|
+
This function simply wraps the given `text` after `width`
|
|
209
|
+
characters, ignoring sentences, whitespaces, etc.
|
|
210
|
+
|
|
211
|
+
Parameters
|
|
212
|
+
----------
|
|
213
|
+
text : str
|
|
214
|
+
The text to be wrapped.
|
|
215
|
+
width : int
|
|
216
|
+
The maximum number of characters per line.
|
|
217
|
+
|
|
218
|
+
Returns
|
|
219
|
+
-------
|
|
220
|
+
lines : list of str
|
|
221
|
+
The wrapped lines.
|
|
222
|
+
"""
|
|
223
|
+
lines = []
|
|
224
|
+
for i in range(0, len(text), width):
|
|
225
|
+
lines.append(text[i : i + width])
|
|
226
|
+
return lines
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def is_binary(file):
|
|
230
|
+
if isinstance(file, io.BufferedIOBase):
|
|
231
|
+
return True
|
|
232
|
+
# for file wrappers, e.g. 'TemporaryFile'
|
|
233
|
+
return hasattr(file, "file") and isinstance(file.file, io.BufferedIOBase)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def is_text(file):
|
|
237
|
+
if isinstance(file, io.TextIOBase):
|
|
238
|
+
return True
|
|
239
|
+
# for file wrappers, e.g. 'TemporaryFile'
|
|
240
|
+
return hasattr(file, "file") and isinstance(file.file, io.TextIOBase)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def is_open_compatible(file):
|
|
244
|
+
return isinstance(file, (str, bytes, PathLike))
|
|
@@ -0,0 +1,19 @@
|
|
|
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 subpackage provides interfaces to other Python packages in the bioinformatics
|
|
7
|
+
ecosystem.
|
|
8
|
+
Its purpose is to convert between native Biotite objects, such as :class:`.AtomArray`
|
|
9
|
+
and :class:`.Sequence`, and the corresponding objects in the respective interfaced
|
|
10
|
+
package.
|
|
11
|
+
In contrast to :mod:`biotite.application`, where an entire application run is handled
|
|
12
|
+
under the hood, :mod:`biotite.interface` only covers the object conversion, allowing
|
|
13
|
+
for more flexibility.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
__name__ = "biotite.interface"
|
|
17
|
+
__author__ = "Patrick Kunzmann"
|
|
18
|
+
|
|
19
|
+
from .warning import *
|
|
@@ -0,0 +1,20 @@
|
|
|
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 subpackage provides an interface to the `OpenMM <https://openmm.org/>`_
|
|
7
|
+
molecular simulation toolkit.
|
|
8
|
+
It allows conversion between :class:`.AtomArray`/:class:`.AtomArrayStack` and
|
|
9
|
+
structure-related objects from *OpenMM*.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
__name__ = "biotite.interface.openmm"
|
|
13
|
+
__author__ = "Patrick Kunzmann"
|
|
14
|
+
|
|
15
|
+
from biotite.interface.version import require_package
|
|
16
|
+
|
|
17
|
+
require_package("openmm")
|
|
18
|
+
|
|
19
|
+
from .state import *
|
|
20
|
+
from .system import *
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
__name__ = "biotite.interface.openmm"
|
|
2
|
+
__author__ = "Patrick Kunzmann"
|
|
3
|
+
__all__ = ["from_context", "from_state", "from_states"]
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import openmm
|
|
7
|
+
import biotite.structure as struc
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def from_context(template, context):
|
|
11
|
+
"""
|
|
12
|
+
Parse the coordinates and box of the current state of an
|
|
13
|
+
:class:`openmm.openmm.Context` into an :class:`AtomArray`.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
template : AtomArray
|
|
18
|
+
This structure is used as template.
|
|
19
|
+
The output :class:`AtomArray` is equal to this template with the
|
|
20
|
+
exception of the coordinates and the box vectors.
|
|
21
|
+
context : Context
|
|
22
|
+
The coordinates are parsed from the current state of this
|
|
23
|
+
:class:`openmm.openmm.Context`.
|
|
24
|
+
|
|
25
|
+
Returns
|
|
26
|
+
-------
|
|
27
|
+
atoms : AtomArray
|
|
28
|
+
The created :class:`AtomArray`.
|
|
29
|
+
"""
|
|
30
|
+
state = context.getState(getPositions=True)
|
|
31
|
+
return from_state(template, state)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def from_state(template, state):
|
|
35
|
+
"""
|
|
36
|
+
Parse the coordinates and box of the given :class:`openmm.openmm.State`
|
|
37
|
+
into an :class:`AtomArray`.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
template : AtomArray
|
|
42
|
+
This structure is used as template.
|
|
43
|
+
The output :class:`AtomArray` is equal to this template with the
|
|
44
|
+
exception of the coordinates and the box vectors.
|
|
45
|
+
state : State
|
|
46
|
+
The coordinates are parsed from this state.
|
|
47
|
+
Must be created with ``getPositions=True``.
|
|
48
|
+
|
|
49
|
+
Returns
|
|
50
|
+
-------
|
|
51
|
+
atoms : AtomArray
|
|
52
|
+
The created :class:`AtomArray`.
|
|
53
|
+
"""
|
|
54
|
+
coord, box = _parse_state(state)
|
|
55
|
+
atoms = template.copy()
|
|
56
|
+
atoms.coord = coord
|
|
57
|
+
atoms.box = box
|
|
58
|
+
return atoms
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def from_states(template, states):
|
|
62
|
+
"""
|
|
63
|
+
Parse the coordinates and box vectors of multiple :class:`openmm.openmm.State`
|
|
64
|
+
objects into an :class:`AtomArrayStack`.
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
template : AtomArray
|
|
69
|
+
This structure is used as template.
|
|
70
|
+
The output :class:`AtomArray` is equal to this template with the
|
|
71
|
+
exception of the coordinates and the box vectors.
|
|
72
|
+
states : iterable of State
|
|
73
|
+
The coordinates are parsed from these states.
|
|
74
|
+
Must be created with ``getPositions=True``.
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
atoms : AtomArrayStack
|
|
79
|
+
The created :class:`AtomArrayStack`.
|
|
80
|
+
"""
|
|
81
|
+
coords = []
|
|
82
|
+
boxes = []
|
|
83
|
+
for state in states:
|
|
84
|
+
coord, box = _parse_state(state)
|
|
85
|
+
coords.append(coord)
|
|
86
|
+
boxes.append(box)
|
|
87
|
+
return struc.from_template(template, np.stack(coords), np.stack(boxes))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _parse_state(state):
|
|
91
|
+
coord = state.getPositions(asNumpy=True).value_in_unit(openmm.unit.angstrom)
|
|
92
|
+
box = state.getPeriodicBoxVectors(asNumpy=True).value_in_unit(openmm.unit.angstrom)
|
|
93
|
+
return coord, box
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
__name__ = "biotite.interface.openmm"
|
|
2
|
+
__author__ = "Patrick Kunzmann"
|
|
3
|
+
__all__ = ["to_system", "to_topology", "from_topology"]
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import openmm
|
|
7
|
+
import openmm.app as app
|
|
8
|
+
import openmm.unit as unit
|
|
9
|
+
import biotite.structure as struc
|
|
10
|
+
import biotite.structure.info as info
|
|
11
|
+
|
|
12
|
+
_BOND_TYPE_TO_ORDER = {
|
|
13
|
+
struc.BondType.SINGLE: 1,
|
|
14
|
+
struc.BondType.DOUBLE: 2,
|
|
15
|
+
struc.BondType.TRIPLE: 3,
|
|
16
|
+
struc.BondType.QUADRUPLE: 4,
|
|
17
|
+
struc.BondType.AROMATIC_SINGLE: 1,
|
|
18
|
+
struc.BondType.AROMATIC_DOUBLE: 2,
|
|
19
|
+
struc.BondType.AROMATIC_TRIPLE: 3,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def to_system(atoms):
|
|
24
|
+
"""
|
|
25
|
+
Create a :class:`openmm.openmm.System` from an :class:`AtomArray` or
|
|
26
|
+
:class:`AtomArrayStack`.
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
atoms : AtomArray or AtomArrayStack
|
|
31
|
+
The structure to be converted.
|
|
32
|
+
The box vectors are set from the ``box`` attribute.
|
|
33
|
+
If multiple models are given the box of the first model is selected.
|
|
34
|
+
|
|
35
|
+
Returns
|
|
36
|
+
-------
|
|
37
|
+
system : System
|
|
38
|
+
The created :class:`openmm.openmm.System`.
|
|
39
|
+
"""
|
|
40
|
+
system = openmm.System()
|
|
41
|
+
|
|
42
|
+
for element in atoms.element:
|
|
43
|
+
system.addParticle(info.mass(element))
|
|
44
|
+
|
|
45
|
+
if atoms.box is not None:
|
|
46
|
+
if atoms.box.ndim == 3:
|
|
47
|
+
# If an `AtomArrayStack`, the first box is chosen
|
|
48
|
+
box = atoms.box[0]
|
|
49
|
+
else:
|
|
50
|
+
box = atoms.box
|
|
51
|
+
if not _check_box_requirements(box):
|
|
52
|
+
raise struc.BadStructureError(
|
|
53
|
+
"Box does not fulfill OpenMM's requirements for periodic boxes"
|
|
54
|
+
)
|
|
55
|
+
system.setDefaultPeriodicBoxVectors(*(box * unit.angstrom))
|
|
56
|
+
|
|
57
|
+
return system
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def to_topology(atoms):
|
|
61
|
+
"""
|
|
62
|
+
Create a :class:`openmm.app.topology.Topology` from an :class:`AtomArray` or
|
|
63
|
+
:class:`AtomArrayStack`.
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
atoms : AtomArray or AtomArrayStack
|
|
68
|
+
The structure to be converted.
|
|
69
|
+
An associated :class:`BondList` is required.
|
|
70
|
+
|
|
71
|
+
Returns
|
|
72
|
+
-------
|
|
73
|
+
topology : Topology
|
|
74
|
+
The created :class:`openmm.app.topology.Topology`.
|
|
75
|
+
"""
|
|
76
|
+
if "atom_id" in atoms.get_annotation_categories():
|
|
77
|
+
atom_id = atoms.atom_id
|
|
78
|
+
else:
|
|
79
|
+
atom_id = np.arange(atoms.array_length()) + 1
|
|
80
|
+
|
|
81
|
+
chain_starts = struc.get_chain_starts(atoms)
|
|
82
|
+
res_starts = struc.get_residue_starts(atoms)
|
|
83
|
+
|
|
84
|
+
# Lists of chain, residue and atom objects that will be filled later
|
|
85
|
+
chain_list = []
|
|
86
|
+
residue_list = []
|
|
87
|
+
atom_list = []
|
|
88
|
+
# Each atom's index in the chain and residue list
|
|
89
|
+
chain_idx = _generate_idx(chain_starts, atoms.array_length())
|
|
90
|
+
res_idx = _generate_idx(res_starts, atoms.array_length())
|
|
91
|
+
|
|
92
|
+
topology = app.Topology()
|
|
93
|
+
|
|
94
|
+
## Add atoms
|
|
95
|
+
for start_i in chain_starts:
|
|
96
|
+
chain_list.append(topology.addChain(id=atoms.chain_id[start_i]))
|
|
97
|
+
for start_i in res_starts:
|
|
98
|
+
residue_list.append(
|
|
99
|
+
topology.addResidue(
|
|
100
|
+
name=atoms.res_name[start_i],
|
|
101
|
+
chain=chain_list[chain_idx[start_i]],
|
|
102
|
+
insertionCode=atoms.ins_code[start_i],
|
|
103
|
+
id=str(atoms.res_id[start_i]),
|
|
104
|
+
)
|
|
105
|
+
)
|
|
106
|
+
for i in np.arange(atoms.array_length()):
|
|
107
|
+
atom_list.append(
|
|
108
|
+
topology.addAtom(
|
|
109
|
+
name=atoms.atom_name[i],
|
|
110
|
+
element=app.Element.getBySymbol(atoms.element[i]),
|
|
111
|
+
residue=residue_list[res_idx[i]],
|
|
112
|
+
id=str(atom_id[start_i]),
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
## Add bonds
|
|
117
|
+
if atoms.bonds is None:
|
|
118
|
+
raise struc.BadStructureError("Input structure misses an associated BondList")
|
|
119
|
+
for atom_i, atom_j, bond_type in atoms.bonds.as_array():
|
|
120
|
+
topology.addBond(
|
|
121
|
+
atom_list[atom_i],
|
|
122
|
+
atom_list[atom_j],
|
|
123
|
+
order=_BOND_TYPE_TO_ORDER.get(bond_type),
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
## Add box
|
|
127
|
+
if atoms.box is not None:
|
|
128
|
+
if atoms.box.ndim == 3:
|
|
129
|
+
# If an `AtomArrayStack`, the first box is chosen
|
|
130
|
+
box = atoms.box[0]
|
|
131
|
+
else:
|
|
132
|
+
box = atoms.box
|
|
133
|
+
if not _check_box_requirements(box):
|
|
134
|
+
raise struc.BadStructureError(
|
|
135
|
+
"Box does not fulfill OpenMM's requirements for periodic boxes"
|
|
136
|
+
)
|
|
137
|
+
topology.setPeriodicBoxVectors(box * unit.angstrom)
|
|
138
|
+
|
|
139
|
+
return topology
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def from_topology(topology):
|
|
143
|
+
"""
|
|
144
|
+
Create a :class:`AtomArray` from a :class:`openmm.app.topology.Topology`.
|
|
145
|
+
|
|
146
|
+
Parameters
|
|
147
|
+
----------
|
|
148
|
+
topology : Topology
|
|
149
|
+
The topology to be converted.
|
|
150
|
+
|
|
151
|
+
Returns
|
|
152
|
+
-------
|
|
153
|
+
atoms : AtomArray
|
|
154
|
+
The created :class:`AtomArray`.
|
|
155
|
+
As the :class:`openmm.app.topology.Topology` does not contain atom
|
|
156
|
+
coordinates, the values of the :class:`AtomArray` ``coord``
|
|
157
|
+
are set to *NaN*.
|
|
158
|
+
|
|
159
|
+
Notes
|
|
160
|
+
-----
|
|
161
|
+
This function is especially useful for obtaining an updated
|
|
162
|
+
template, if the original topology was modified
|
|
163
|
+
(e.g. via :class:`openmm.app.modeller.Modeller`).
|
|
164
|
+
"""
|
|
165
|
+
atoms = struc.AtomArray(topology.getNumAtoms())
|
|
166
|
+
|
|
167
|
+
chain_ids = []
|
|
168
|
+
res_ids = []
|
|
169
|
+
ins_codes = []
|
|
170
|
+
res_names = []
|
|
171
|
+
atom_names = []
|
|
172
|
+
elements = []
|
|
173
|
+
for chain in topology.chains():
|
|
174
|
+
chain_id = chain.id
|
|
175
|
+
for residue in chain.residues():
|
|
176
|
+
res_name = residue.name
|
|
177
|
+
res_id = int(residue.id)
|
|
178
|
+
ins_code = residue.insertionCode
|
|
179
|
+
for atom in residue.atoms():
|
|
180
|
+
chain_ids.append(chain_id)
|
|
181
|
+
res_ids.append(res_id)
|
|
182
|
+
ins_codes.append(ins_code)
|
|
183
|
+
res_names.append(res_name)
|
|
184
|
+
atom_names.append(atom.name.upper())
|
|
185
|
+
elements.append(atom.element.symbol.upper())
|
|
186
|
+
atoms.chain_id = chain_ids
|
|
187
|
+
atoms.res_id = res_ids
|
|
188
|
+
atoms.ins_code = ins_codes
|
|
189
|
+
atoms.res_name = res_names
|
|
190
|
+
atoms.atom_name = atom_names
|
|
191
|
+
atoms.element = elements
|
|
192
|
+
atoms.hetero = ~(struc.filter_amino_acids(atoms) | struc.filter_nucleotides(atoms))
|
|
193
|
+
|
|
194
|
+
bonds = []
|
|
195
|
+
atom_to_index = {atom: i for i, atom in enumerate(topology.atoms())}
|
|
196
|
+
for bond in topology.bonds():
|
|
197
|
+
order = bond.order if bond.order is not None else struc.BondType.ANY
|
|
198
|
+
bonds.append([atom_to_index[bond.atom1], atom_to_index[bond.atom2], order])
|
|
199
|
+
atoms.bonds = struc.BondList(atoms.array_length(), np.array(bonds))
|
|
200
|
+
|
|
201
|
+
box = topology.getPeriodicBoxVectors()
|
|
202
|
+
if box is None:
|
|
203
|
+
atoms.box = None
|
|
204
|
+
else:
|
|
205
|
+
atoms.box = np.asarray(box.value_in_unit(openmm.unit.angstrom))
|
|
206
|
+
|
|
207
|
+
return atoms
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _generate_idx(starts, length):
|
|
211
|
+
# An array that is 1, at start positions and 0 everywhere else
|
|
212
|
+
start_counter = np.zeros(length, dtype=int)
|
|
213
|
+
start_counter[starts] = 1
|
|
214
|
+
# The first index should be zero -> the first start is not counted
|
|
215
|
+
start_counter[0] = 0
|
|
216
|
+
return np.cumsum(start_counter)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _check_box_requirements(box):
|
|
220
|
+
"""
|
|
221
|
+
Return True, if the given box fulfills *OpenMM*'s requirements for
|
|
222
|
+
boxes, else otherwise.
|
|
223
|
+
|
|
224
|
+
The first vector must be on the x-axis
|
|
225
|
+
and the second vector must be on the xy-plane.
|
|
226
|
+
"""
|
|
227
|
+
return np.all(np.triu(box, k=1) == 0)
|