biotite 1.5.0__cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of biotite might be problematic. Click here for more details.
- biotite/__init__.py +18 -0
- biotite/application/__init__.py +69 -0
- biotite/application/application.py +276 -0
- biotite/application/autodock/__init__.py +12 -0
- biotite/application/autodock/app.py +500 -0
- biotite/application/blast/__init__.py +14 -0
- biotite/application/blast/alignment.py +92 -0
- biotite/application/blast/webapp.py +428 -0
- biotite/application/clustalo/__init__.py +12 -0
- biotite/application/clustalo/app.py +223 -0
- biotite/application/dssp/__init__.py +12 -0
- biotite/application/dssp/app.py +216 -0
- biotite/application/localapp.py +342 -0
- biotite/application/mafft/__init__.py +12 -0
- biotite/application/mafft/app.py +116 -0
- biotite/application/msaapp.py +363 -0
- biotite/application/muscle/__init__.py +13 -0
- biotite/application/muscle/app3.py +227 -0
- biotite/application/muscle/app5.py +163 -0
- biotite/application/sra/__init__.py +18 -0
- biotite/application/sra/app.py +447 -0
- biotite/application/tantan/__init__.py +12 -0
- biotite/application/tantan/app.py +199 -0
- biotite/application/util.py +77 -0
- biotite/application/viennarna/__init__.py +18 -0
- biotite/application/viennarna/rnaalifold.py +310 -0
- biotite/application/viennarna/rnafold.py +254 -0
- biotite/application/viennarna/rnaplot.py +208 -0
- biotite/application/viennarna/util.py +77 -0
- biotite/application/webapp.py +76 -0
- biotite/copyable.py +71 -0
- biotite/database/__init__.py +23 -0
- biotite/database/afdb/__init__.py +12 -0
- biotite/database/afdb/download.py +197 -0
- biotite/database/entrez/__init__.py +15 -0
- biotite/database/entrez/check.py +60 -0
- biotite/database/entrez/dbnames.py +101 -0
- biotite/database/entrez/download.py +228 -0
- biotite/database/entrez/key.py +44 -0
- biotite/database/entrez/query.py +263 -0
- biotite/database/error.py +16 -0
- biotite/database/pubchem/__init__.py +21 -0
- biotite/database/pubchem/download.py +258 -0
- biotite/database/pubchem/error.py +30 -0
- biotite/database/pubchem/query.py +819 -0
- biotite/database/pubchem/throttle.py +98 -0
- biotite/database/rcsb/__init__.py +13 -0
- biotite/database/rcsb/download.py +161 -0
- biotite/database/rcsb/query.py +963 -0
- biotite/database/uniprot/__init__.py +13 -0
- biotite/database/uniprot/check.py +40 -0
- biotite/database/uniprot/download.py +126 -0
- biotite/database/uniprot/query.py +292 -0
- biotite/file.py +244 -0
- biotite/interface/__init__.py +19 -0
- biotite/interface/openmm/__init__.py +20 -0
- biotite/interface/openmm/state.py +93 -0
- biotite/interface/openmm/system.py +227 -0
- biotite/interface/pymol/__init__.py +201 -0
- biotite/interface/pymol/cgo.py +346 -0
- biotite/interface/pymol/convert.py +185 -0
- biotite/interface/pymol/display.py +267 -0
- biotite/interface/pymol/object.py +1228 -0
- biotite/interface/pymol/shapes.py +178 -0
- biotite/interface/pymol/startup.py +169 -0
- biotite/interface/rdkit/__init__.py +19 -0
- biotite/interface/rdkit/mol.py +490 -0
- biotite/interface/version.py +94 -0
- biotite/interface/warning.py +19 -0
- biotite/sequence/__init__.py +84 -0
- biotite/sequence/align/__init__.py +199 -0
- biotite/sequence/align/alignment.py +702 -0
- biotite/sequence/align/banded.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/banded.pyx +652 -0
- biotite/sequence/align/buckets.py +71 -0
- biotite/sequence/align/cigar.py +425 -0
- biotite/sequence/align/kmeralphabet.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmeralphabet.pyx +595 -0
- biotite/sequence/align/kmersimilarity.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmersimilarity.pyx +233 -0
- biotite/sequence/align/kmertable.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/kmertable.pyx +3411 -0
- biotite/sequence/align/localgapped.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/localgapped.pyx +892 -0
- biotite/sequence/align/localungapped.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/localungapped.pyx +279 -0
- biotite/sequence/align/matrix.py +631 -0
- biotite/sequence/align/matrix_data/3Di.mat +24 -0
- biotite/sequence/align/matrix_data/BLOSUM100.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM30.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM35.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM40.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM45.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM50.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM50_13p.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM50_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM50_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM55.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM60.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM62.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM62_13p.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM62_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM62_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM65.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM70.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM75.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM80.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM85.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM90.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUMN.mat +31 -0
- biotite/sequence/align/matrix_data/CorBLOSUM49_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM57_13p.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM57_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM61_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM66_13p.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM67_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/DAYHOFF.mat +32 -0
- biotite/sequence/align/matrix_data/GONNET.mat +26 -0
- biotite/sequence/align/matrix_data/IDENTITY.mat +25 -0
- biotite/sequence/align/matrix_data/MATCH.mat +25 -0
- biotite/sequence/align/matrix_data/NUC.mat +25 -0
- biotite/sequence/align/matrix_data/PAM10.mat +34 -0
- biotite/sequence/align/matrix_data/PAM100.mat +34 -0
- biotite/sequence/align/matrix_data/PAM110.mat +34 -0
- biotite/sequence/align/matrix_data/PAM120.mat +34 -0
- biotite/sequence/align/matrix_data/PAM130.mat +34 -0
- biotite/sequence/align/matrix_data/PAM140.mat +34 -0
- biotite/sequence/align/matrix_data/PAM150.mat +34 -0
- biotite/sequence/align/matrix_data/PAM160.mat +34 -0
- biotite/sequence/align/matrix_data/PAM170.mat +34 -0
- biotite/sequence/align/matrix_data/PAM180.mat +34 -0
- biotite/sequence/align/matrix_data/PAM190.mat +34 -0
- biotite/sequence/align/matrix_data/PAM20.mat +34 -0
- biotite/sequence/align/matrix_data/PAM200.mat +34 -0
- biotite/sequence/align/matrix_data/PAM210.mat +34 -0
- biotite/sequence/align/matrix_data/PAM220.mat +34 -0
- biotite/sequence/align/matrix_data/PAM230.mat +34 -0
- biotite/sequence/align/matrix_data/PAM240.mat +34 -0
- biotite/sequence/align/matrix_data/PAM250.mat +34 -0
- biotite/sequence/align/matrix_data/PAM260.mat +34 -0
- biotite/sequence/align/matrix_data/PAM270.mat +34 -0
- biotite/sequence/align/matrix_data/PAM280.mat +34 -0
- biotite/sequence/align/matrix_data/PAM290.mat +34 -0
- biotite/sequence/align/matrix_data/PAM30.mat +34 -0
- biotite/sequence/align/matrix_data/PAM300.mat +34 -0
- biotite/sequence/align/matrix_data/PAM310.mat +34 -0
- biotite/sequence/align/matrix_data/PAM320.mat +34 -0
- biotite/sequence/align/matrix_data/PAM330.mat +34 -0
- biotite/sequence/align/matrix_data/PAM340.mat +34 -0
- biotite/sequence/align/matrix_data/PAM350.mat +34 -0
- biotite/sequence/align/matrix_data/PAM360.mat +34 -0
- biotite/sequence/align/matrix_data/PAM370.mat +34 -0
- biotite/sequence/align/matrix_data/PAM380.mat +34 -0
- biotite/sequence/align/matrix_data/PAM390.mat +34 -0
- biotite/sequence/align/matrix_data/PAM40.mat +34 -0
- biotite/sequence/align/matrix_data/PAM400.mat +34 -0
- biotite/sequence/align/matrix_data/PAM410.mat +34 -0
- biotite/sequence/align/matrix_data/PAM420.mat +34 -0
- biotite/sequence/align/matrix_data/PAM430.mat +34 -0
- biotite/sequence/align/matrix_data/PAM440.mat +34 -0
- biotite/sequence/align/matrix_data/PAM450.mat +34 -0
- biotite/sequence/align/matrix_data/PAM460.mat +34 -0
- biotite/sequence/align/matrix_data/PAM470.mat +34 -0
- biotite/sequence/align/matrix_data/PAM480.mat +34 -0
- biotite/sequence/align/matrix_data/PAM490.mat +34 -0
- biotite/sequence/align/matrix_data/PAM50.mat +34 -0
- biotite/sequence/align/matrix_data/PAM500.mat +34 -0
- biotite/sequence/align/matrix_data/PAM60.mat +34 -0
- biotite/sequence/align/matrix_data/PAM70.mat +34 -0
- biotite/sequence/align/matrix_data/PAM80.mat +34 -0
- biotite/sequence/align/matrix_data/PAM90.mat +34 -0
- biotite/sequence/align/matrix_data/PB.license +21 -0
- biotite/sequence/align/matrix_data/PB.mat +18 -0
- biotite/sequence/align/matrix_data/RBLOSUM52_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM59_13p.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM59_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM64_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM69_13p.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM69_14.3.mat +25 -0
- biotite/sequence/align/multiple.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/multiple.pyx +619 -0
- biotite/sequence/align/pairwise.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/pairwise.pyx +585 -0
- biotite/sequence/align/permutation.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/permutation.pyx +313 -0
- biotite/sequence/align/primes.txt +821 -0
- biotite/sequence/align/selector.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/selector.pyx +954 -0
- biotite/sequence/align/statistics.py +264 -0
- biotite/sequence/align/tracetable.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/align/tracetable.pxd +64 -0
- biotite/sequence/align/tracetable.pyx +370 -0
- biotite/sequence/alphabet.py +555 -0
- biotite/sequence/annotation.py +836 -0
- biotite/sequence/codec.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/codec.pyx +155 -0
- biotite/sequence/codon.py +476 -0
- biotite/sequence/codon_tables.txt +202 -0
- biotite/sequence/graphics/__init__.py +33 -0
- biotite/sequence/graphics/alignment.py +1101 -0
- biotite/sequence/graphics/color_schemes/3di_flower.json +48 -0
- biotite/sequence/graphics/color_schemes/autumn.json +51 -0
- biotite/sequence/graphics/color_schemes/blossom.json +51 -0
- biotite/sequence/graphics/color_schemes/clustalx_dna.json +11 -0
- biotite/sequence/graphics/color_schemes/clustalx_protein.json +28 -0
- biotite/sequence/graphics/color_schemes/flower.json +51 -0
- biotite/sequence/graphics/color_schemes/jalview_buried.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_hydrophobicity.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_helix.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_strand.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_turn.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_taylor.json +28 -0
- biotite/sequence/graphics/color_schemes/jalview_zappo.json +28 -0
- biotite/sequence/graphics/color_schemes/ocean.json +51 -0
- biotite/sequence/graphics/color_schemes/pb_flower.json +40 -0
- biotite/sequence/graphics/color_schemes/rainbow_dna.json +11 -0
- biotite/sequence/graphics/color_schemes/rainbow_protein.json +30 -0
- biotite/sequence/graphics/color_schemes/spring.json +51 -0
- biotite/sequence/graphics/color_schemes/sunset.json +51 -0
- biotite/sequence/graphics/color_schemes/wither.json +51 -0
- biotite/sequence/graphics/colorschemes.py +170 -0
- biotite/sequence/graphics/dendrogram.py +231 -0
- biotite/sequence/graphics/features.py +544 -0
- biotite/sequence/graphics/logo.py +102 -0
- biotite/sequence/graphics/plasmid.py +712 -0
- biotite/sequence/io/__init__.py +12 -0
- biotite/sequence/io/fasta/__init__.py +22 -0
- biotite/sequence/io/fasta/convert.py +283 -0
- biotite/sequence/io/fasta/file.py +265 -0
- biotite/sequence/io/fastq/__init__.py +19 -0
- biotite/sequence/io/fastq/convert.py +117 -0
- biotite/sequence/io/fastq/file.py +507 -0
- biotite/sequence/io/genbank/__init__.py +17 -0
- biotite/sequence/io/genbank/annotation.py +269 -0
- biotite/sequence/io/genbank/file.py +573 -0
- biotite/sequence/io/genbank/metadata.py +336 -0
- biotite/sequence/io/genbank/sequence.py +173 -0
- biotite/sequence/io/general.py +201 -0
- biotite/sequence/io/gff/__init__.py +26 -0
- biotite/sequence/io/gff/convert.py +128 -0
- biotite/sequence/io/gff/file.py +449 -0
- biotite/sequence/phylo/__init__.py +36 -0
- biotite/sequence/phylo/nj.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/nj.pyx +221 -0
- biotite/sequence/phylo/tree.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/tree.pyx +1169 -0
- biotite/sequence/phylo/upgma.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/sequence/phylo/upgma.pyx +164 -0
- biotite/sequence/profile.py +561 -0
- biotite/sequence/search.py +117 -0
- biotite/sequence/seqtypes.py +720 -0
- biotite/sequence/sequence.py +373 -0
- biotite/setup_ccd.py +197 -0
- biotite/structure/__init__.py +135 -0
- biotite/structure/alphabet/__init__.py +25 -0
- biotite/structure/alphabet/encoder.py +332 -0
- biotite/structure/alphabet/encoder_weights_3di.kerasify +0 -0
- biotite/structure/alphabet/i3d.py +109 -0
- biotite/structure/alphabet/layers.py +86 -0
- biotite/structure/alphabet/pb.license +21 -0
- biotite/structure/alphabet/pb.py +170 -0
- biotite/structure/alphabet/unkerasify.py +128 -0
- biotite/structure/atoms.py +1562 -0
- biotite/structure/basepairs.py +1403 -0
- biotite/structure/bonds.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/bonds.pyx +2036 -0
- biotite/structure/box.py +724 -0
- biotite/structure/celllist.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/celllist.pyx +864 -0
- biotite/structure/chains.py +310 -0
- biotite/structure/charges.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/charges.pyx +520 -0
- biotite/structure/compare.py +683 -0
- biotite/structure/density.py +109 -0
- biotite/structure/dotbracket.py +213 -0
- biotite/structure/error.py +39 -0
- biotite/structure/filter.py +591 -0
- biotite/structure/geometry.py +817 -0
- biotite/structure/graphics/__init__.py +13 -0
- biotite/structure/graphics/atoms.py +243 -0
- biotite/structure/graphics/rna.py +298 -0
- biotite/structure/hbond.py +425 -0
- biotite/structure/info/__init__.py +24 -0
- biotite/structure/info/atom_masses.json +121 -0
- biotite/structure/info/atoms.py +98 -0
- biotite/structure/info/bonds.py +149 -0
- biotite/structure/info/ccd.py +200 -0
- biotite/structure/info/components.bcif +0 -0
- biotite/structure/info/groups.py +128 -0
- biotite/structure/info/masses.py +121 -0
- biotite/structure/info/misc.py +137 -0
- biotite/structure/info/radii.py +267 -0
- biotite/structure/info/standardize.py +185 -0
- biotite/structure/integrity.py +213 -0
- biotite/structure/io/__init__.py +29 -0
- biotite/structure/io/dcd/__init__.py +13 -0
- biotite/structure/io/dcd/file.py +67 -0
- biotite/structure/io/general.py +243 -0
- biotite/structure/io/gro/__init__.py +14 -0
- biotite/structure/io/gro/file.py +343 -0
- biotite/structure/io/mol/__init__.py +20 -0
- biotite/structure/io/mol/convert.py +112 -0
- biotite/structure/io/mol/ctab.py +420 -0
- biotite/structure/io/mol/header.py +120 -0
- biotite/structure/io/mol/mol.py +149 -0
- biotite/structure/io/mol/sdf.py +940 -0
- biotite/structure/io/netcdf/__init__.py +13 -0
- biotite/structure/io/netcdf/file.py +64 -0
- biotite/structure/io/pdb/__init__.py +20 -0
- biotite/structure/io/pdb/convert.py +389 -0
- biotite/structure/io/pdb/file.py +1380 -0
- biotite/structure/io/pdb/hybrid36.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/io/pdb/hybrid36.pyx +242 -0
- biotite/structure/io/pdbqt/__init__.py +15 -0
- biotite/structure/io/pdbqt/convert.py +113 -0
- biotite/structure/io/pdbqt/file.py +688 -0
- biotite/structure/io/pdbx/__init__.py +23 -0
- biotite/structure/io/pdbx/bcif.py +674 -0
- biotite/structure/io/pdbx/cif.py +1091 -0
- biotite/structure/io/pdbx/component.py +251 -0
- biotite/structure/io/pdbx/compress.py +362 -0
- biotite/structure/io/pdbx/convert.py +2113 -0
- biotite/structure/io/pdbx/encoding.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/io/pdbx/encoding.pyx +1078 -0
- biotite/structure/io/trajfile.py +696 -0
- biotite/structure/io/trr/__init__.py +13 -0
- biotite/structure/io/trr/file.py +43 -0
- biotite/structure/io/util.py +38 -0
- biotite/structure/io/xtc/__init__.py +13 -0
- biotite/structure/io/xtc/file.py +43 -0
- biotite/structure/mechanics.py +72 -0
- biotite/structure/molecules.py +337 -0
- biotite/structure/pseudoknots.py +622 -0
- biotite/structure/rdf.py +245 -0
- biotite/structure/repair.py +302 -0
- biotite/structure/residues.py +716 -0
- biotite/structure/rings.py +451 -0
- biotite/structure/sasa.cpython-314-x86_64-linux-gnu.so +0 -0
- biotite/structure/sasa.pyx +322 -0
- biotite/structure/segments.py +328 -0
- biotite/structure/sequence.py +110 -0
- biotite/structure/spacegroups.json +1567 -0
- biotite/structure/spacegroups.license +26 -0
- biotite/structure/sse.py +306 -0
- biotite/structure/superimpose.py +511 -0
- biotite/structure/tm.py +581 -0
- biotite/structure/transform.py +736 -0
- biotite/structure/util.py +160 -0
- biotite/version.py +34 -0
- biotite/visualize.py +375 -0
- biotite-1.5.0.dist-info/METADATA +162 -0
- biotite-1.5.0.dist-info/RECORD +354 -0
- biotite-1.5.0.dist-info/WHEEL +6 -0
- biotite-1.5.0.dist-info/licenses/LICENSE.rst +30 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# ruff: noqa: F401
|
|
2
|
+
|
|
3
|
+
# This source code is part of the Biotite package and is distributed
|
|
4
|
+
# under the 3-Clause BSD License. Please see 'LICENSE.rst' for further
|
|
5
|
+
# information.
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
This package enables the transfer of structures from *Biotite* to
|
|
9
|
+
`PyMOL <https://pymol.org/>`_ for visualization and vice versa,
|
|
10
|
+
via *PyMOL*'s Python API:
|
|
11
|
+
|
|
12
|
+
- Import :class:`AtomArray` and :class:`AtomArrayStack` objects into *PyMOL* -
|
|
13
|
+
without intermediate structure files.
|
|
14
|
+
- Convert *PyMOL* objects into :class:`AtomArray` and :class:`AtomArrayStack`
|
|
15
|
+
instances.
|
|
16
|
+
- Use *Biotite*'s boolean masks for atom selection in *PyMOL*.
|
|
17
|
+
- Display images rendered with *PyMOL* in *Jupyter* notebooks.
|
|
18
|
+
|
|
19
|
+
Launching PyMOL
|
|
20
|
+
---------------
|
|
21
|
+
|
|
22
|
+
Library mode
|
|
23
|
+
^^^^^^^^^^^^
|
|
24
|
+
The recommended way to invoke *PyMOL* in a Python script depends on whether a GUI should
|
|
25
|
+
be displayed.
|
|
26
|
+
If no GUI is required, we recommend launching a *PyMOL* session in library mode.
|
|
27
|
+
|
|
28
|
+
.. code-block:: python
|
|
29
|
+
|
|
30
|
+
import biotite.interface.pymol as pymol_interface
|
|
31
|
+
|
|
32
|
+
pymol_interface.launch_pymol()
|
|
33
|
+
|
|
34
|
+
Usually launching *PyMOL* manually via :func:`launch_pymol()` is not even necessary:
|
|
35
|
+
When *Biotite* requires a *PyMOL* session, e.g. for creating a *PyMOL* object or
|
|
36
|
+
invoking a command, and none is already running, *PyMOL* is automatically started in
|
|
37
|
+
library mode.
|
|
38
|
+
|
|
39
|
+
GUI mode
|
|
40
|
+
^^^^^^^^
|
|
41
|
+
When the *PyMOL* GUI is necessary, the *PyMOL* library mode is not available.
|
|
42
|
+
Instead *PyMOL* can be launched in interactive (GUI) mode:
|
|
43
|
+
|
|
44
|
+
.. code-block:: python
|
|
45
|
+
|
|
46
|
+
import biotite.interface.pymol as pymol_interface
|
|
47
|
+
|
|
48
|
+
pymol_interface.launch_interactive_pymol("-qixkF", "-W", "400", "-H", "400")
|
|
49
|
+
|
|
50
|
+
:func:`launch_interactive_pymol()` starts *PyMOL* using the given command line options,
|
|
51
|
+
reinitializes it and sets necessary parameters.
|
|
52
|
+
|
|
53
|
+
After that, the usual *PyMOL* commands and the other functions from
|
|
54
|
+
*Biotite* are available.
|
|
55
|
+
|
|
56
|
+
Note that the *PyMOL* window will stay open after the end of the script.
|
|
57
|
+
This can lead to issues when using interactive Python (e.g. *IPython*):
|
|
58
|
+
The *PyMOL* window could not be closed by normal means and a forced termination might be
|
|
59
|
+
necessary.
|
|
60
|
+
This can be solved by using *PyMOL*'s integrated command line for executing Python.
|
|
61
|
+
|
|
62
|
+
Launching PyMOL directly
|
|
63
|
+
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
64
|
+
|
|
65
|
+
.. note::
|
|
66
|
+
|
|
67
|
+
This is not the recommended way to use *PyMOL* in the context of
|
|
68
|
+
:mod:`biotite.interface.pymol`.
|
|
69
|
+
Usage is at your own risk.
|
|
70
|
+
|
|
71
|
+
You can also launch *PyMOL* directly using the *PyMOL* Python API, that
|
|
72
|
+
:func:`launch_pymol()` and :func:`launch_interactive_pymol()` use internally.
|
|
73
|
+
In this case, it is important to call :func:`setup_parameters()` for setting
|
|
74
|
+
parameters that are necessary for *Biotite* to interact properly with *PyMOL*.
|
|
75
|
+
Furthermore, the ``pymol_instance`` parameter must be set the first time
|
|
76
|
+
a :class:`PyMOLObject` is created to inform *Biotite* about the *PyMOL* session.
|
|
77
|
+
|
|
78
|
+
.. code-block:: python
|
|
79
|
+
|
|
80
|
+
from pymol2 import PyMOL
|
|
81
|
+
import biotite.interface.pymol as pymol_interface
|
|
82
|
+
|
|
83
|
+
pymol_app = PyMOL()
|
|
84
|
+
pymol_app.start()
|
|
85
|
+
pymol_interface.setup_parameters(pymol_instance=pymol_app)
|
|
86
|
+
cmd = pymol_app.cmd
|
|
87
|
+
|
|
88
|
+
pymol_object = pymol_interface.PyMOLObject.from_structure(
|
|
89
|
+
atom_array, pymol_instance=pymol_app
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
Common issues
|
|
93
|
+
-------------
|
|
94
|
+
As *PyMOL* is a quite complex software with a lot of its functionality written
|
|
95
|
+
in *C++*, sometimes unexpected results or crashes may occur under certain
|
|
96
|
+
circumstances.
|
|
97
|
+
This page should provide help in such and similar cases.
|
|
98
|
+
|
|
99
|
+
Interactive PyMOL crashes when launched on MacOS
|
|
100
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
101
|
+
Unfortunately, the *PyMOL* GUI is not supported on MacOS, as described in
|
|
102
|
+
`this issue <https://github.com/schrodinger/pymol-open-source/issues/97>`_.
|
|
103
|
+
The library mode launched by default should still work.
|
|
104
|
+
|
|
105
|
+
Interactive PyMOL crashes when launched after usage of Matplotlib
|
|
106
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
107
|
+
Interactive *PyMOL* will crash, if it is launched after a *Matplotlib* figure
|
|
108
|
+
is created. This does not happen in the object-oriented library mode of
|
|
109
|
+
*PyMOL*.
|
|
110
|
+
Presumably the reason is a conflict in the *OpenGL* contexts.
|
|
111
|
+
|
|
112
|
+
Example code that leads to crash:
|
|
113
|
+
|
|
114
|
+
.. code-block:: python
|
|
115
|
+
|
|
116
|
+
import matplotlib.pyplot as plt
|
|
117
|
+
import biotite.interface.pymol as pymol_interface
|
|
118
|
+
|
|
119
|
+
figure = plt.figure()
|
|
120
|
+
pymol_interface.launch_interactive_pymol()
|
|
121
|
+
|
|
122
|
+
'cmd.png()' command crashes in pytest function
|
|
123
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
124
|
+
``pytest`` executes the test functions via ``exec()``, which might lead to the crash.
|
|
125
|
+
Up to now the only way to prevent this, is not to test the ``png()`` command
|
|
126
|
+
in pytest.
|
|
127
|
+
|
|
128
|
+
Launching PyMOL for the first time raises DuplicatePyMOLError
|
|
129
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
130
|
+
For example the code snippet
|
|
131
|
+
|
|
132
|
+
.. code-block:: python
|
|
133
|
+
|
|
134
|
+
import biotite.interface.pymol import cmd, launch_pymol
|
|
135
|
+
|
|
136
|
+
launch_pymol()
|
|
137
|
+
|
|
138
|
+
raises
|
|
139
|
+
|
|
140
|
+
.. code-block:: python
|
|
141
|
+
|
|
142
|
+
biotite.interface.pymol.DuplicatePyMOLError: A PyMOL instance is already running
|
|
143
|
+
|
|
144
|
+
The reason:
|
|
145
|
+
|
|
146
|
+
If ``from biotite.interface.pymol import pymol``
|
|
147
|
+
or ``from biotite.interface.pymol import cmd`` is called, *PyMOL* is already launched
|
|
148
|
+
upon import in order to make the ``pymol`` or ``cmd`` attribute available.
|
|
149
|
+
Subsequent calls of :func:`launch_pymol()` or
|
|
150
|
+
:func:`launch_interactive_pymol()` would start a second *PyMOL* session,
|
|
151
|
+
which is forbidden.
|
|
152
|
+
|
|
153
|
+
To circumvent this problem do not import ``pymol`` or ``cmd`` from
|
|
154
|
+
``biotite.interface.pymol``, but access these attributes via ``pymol_interface.pymol``
|
|
155
|
+
or ``pymol_interface.cmd`` at the required places in your code.
|
|
156
|
+
|
|
157
|
+
|
|
|
158
|
+
|
|
159
|
+
*PyMOL is a trademark of Schrodinger, LLC.*
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
__name__ = "biotite.interface.pymol"
|
|
163
|
+
__author__ = "Patrick Kunzmann"
|
|
164
|
+
|
|
165
|
+
from biotite.interface.version import require_package
|
|
166
|
+
|
|
167
|
+
require_package("pymol")
|
|
168
|
+
|
|
169
|
+
from .cgo import *
|
|
170
|
+
from .convert import *
|
|
171
|
+
from .display import *
|
|
172
|
+
from .object import *
|
|
173
|
+
from .shapes import *
|
|
174
|
+
|
|
175
|
+
# Do not import expose the internally used 'get_and_set_pymol_instance()'
|
|
176
|
+
from .startup import (
|
|
177
|
+
DuplicatePyMOLError,
|
|
178
|
+
launch_interactive_pymol,
|
|
179
|
+
launch_pymol,
|
|
180
|
+
reset,
|
|
181
|
+
setup_parameters,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
# Make the PyMOL instance accessible via `biotite.interface.pymol.pymol`
|
|
186
|
+
# analogous to a '@property' of a class, but on module level instead
|
|
187
|
+
def __getattr__(name):
|
|
188
|
+
from .startup import get_and_set_pymol_instance
|
|
189
|
+
|
|
190
|
+
if name == "pymol":
|
|
191
|
+
return get_and_set_pymol_instance()
|
|
192
|
+
elif name == "cmd":
|
|
193
|
+
return __getattr__("pymol").cmd
|
|
194
|
+
elif name in list(globals().keys()):
|
|
195
|
+
return globals()["name"]
|
|
196
|
+
else:
|
|
197
|
+
raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def __dir__():
|
|
201
|
+
return list(globals().keys()) + ["pymol", "cmd"]
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
__name__ = "biotite.interface.pymol"
|
|
2
|
+
__author__ = "Patrick Kunzmann"
|
|
3
|
+
__all__ = [
|
|
4
|
+
"draw_cgo",
|
|
5
|
+
"get_cylinder_cgo",
|
|
6
|
+
"get_cone_cgo",
|
|
7
|
+
"get_sphere_cgo",
|
|
8
|
+
"get_point_cgo",
|
|
9
|
+
"get_line_cgo",
|
|
10
|
+
"get_multiline_cgo",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
import itertools
|
|
14
|
+
from enum import IntEnum
|
|
15
|
+
import numpy as np
|
|
16
|
+
from biotite.interface.pymol.object import PyMOLObject
|
|
17
|
+
from biotite.interface.pymol.startup import get_and_set_pymol_instance
|
|
18
|
+
|
|
19
|
+
_object_counter = 0
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class CGO(IntEnum):
|
|
23
|
+
# List compiled from uppercase attributes in 'pymol.cgo'
|
|
24
|
+
ALPHA = 25
|
|
25
|
+
ALPHA_TRIANGLE = 17
|
|
26
|
+
BEGIN = 2
|
|
27
|
+
CHAR = 23
|
|
28
|
+
COLOR = 6
|
|
29
|
+
CONE = 27
|
|
30
|
+
CUSTOM_CYLINDER = 15
|
|
31
|
+
CYLINDER = 9
|
|
32
|
+
DISABLE = 13
|
|
33
|
+
DOTWIDTH = 16
|
|
34
|
+
ELLIPSOID = 18
|
|
35
|
+
ENABLE = 12
|
|
36
|
+
END = 3
|
|
37
|
+
FONT = 19
|
|
38
|
+
FONT_AXES = 22
|
|
39
|
+
FONT_SCALE = 20
|
|
40
|
+
FONT_VERTEX = 21
|
|
41
|
+
LINES = 1
|
|
42
|
+
LINEWIDTH = 10
|
|
43
|
+
LINE_LOOP = 2
|
|
44
|
+
LINE_STRIP = 3
|
|
45
|
+
NORMAL = 5
|
|
46
|
+
NULL = 1
|
|
47
|
+
PICK_COLOR = 31
|
|
48
|
+
POINTS = 0
|
|
49
|
+
QUADRIC = 26
|
|
50
|
+
SAUSAGE = 14
|
|
51
|
+
SPHERE = 7
|
|
52
|
+
STOP = 0
|
|
53
|
+
TRIANGLE = 8
|
|
54
|
+
TRIANGLES = 4
|
|
55
|
+
TRIANGLE_FAN = 6
|
|
56
|
+
TRIANGLE_STRIP = 5
|
|
57
|
+
VERTEX = 4
|
|
58
|
+
WIDTHSCALE = 11
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def draw_cgo(cgo_list, name=None, pymol_instance=None, delete=True):
|
|
62
|
+
"""
|
|
63
|
+
Draw geometric shapes using *Compiled Graphics Objects* (CGOs).
|
|
64
|
+
|
|
65
|
+
Each CGO is represented by a list of floats, which can be obtained
|
|
66
|
+
via the ``get_xxx_cgo()`` functions.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
cgo_list : list of list of float
|
|
71
|
+
The CGOs to draw.
|
|
72
|
+
It is recommended to use a ``get_xxx_cgo()`` function to obtain
|
|
73
|
+
the elements for this list, if possible.
|
|
74
|
+
Otherwise, shapes may be drawn incorrectly or omitted entirely,
|
|
75
|
+
if a CGO is incorrectly formatted.
|
|
76
|
+
name : str, optional
|
|
77
|
+
The name of the newly created CGO object.
|
|
78
|
+
If omitted, a unique name is generated.
|
|
79
|
+
pymol_instance : module or SingletonPyMOL or PyMOL, optional
|
|
80
|
+
If *PyMOL* is used in library mode, the :class:`PyMOL`
|
|
81
|
+
or :class:`SingletonPyMOL` object is given here.
|
|
82
|
+
If otherwise *PyMOL* is used in GUI mode, the :mod:`pymol`
|
|
83
|
+
module is given.
|
|
84
|
+
By default the currently active *PyMOL* instance is used.
|
|
85
|
+
If no *PyMOL* instance is currently running,
|
|
86
|
+
*PyMOL* is started in library mode.
|
|
87
|
+
delete : bool, optional
|
|
88
|
+
If set to true, the underlying *PyMOL* object will be removed from the *PyMOL*
|
|
89
|
+
session, when the returned :class:`PyMOLObject` is garbage collected.
|
|
90
|
+
|
|
91
|
+
Returns
|
|
92
|
+
-------
|
|
93
|
+
pymol_object : PyMOLObject
|
|
94
|
+
The created :class:`PyMOLObject` representing the drawn CGOs.
|
|
95
|
+
"""
|
|
96
|
+
global _object_counter
|
|
97
|
+
if name is None:
|
|
98
|
+
name = f"biotite_cgo_{_object_counter}"
|
|
99
|
+
_object_counter += 1
|
|
100
|
+
pymol_instance = get_and_set_pymol_instance(pymol_instance)
|
|
101
|
+
pymol_instance.cmd.load_cgo(
|
|
102
|
+
# If CGO values are integers instead of floats
|
|
103
|
+
# the rendering may fail
|
|
104
|
+
[float(value) for value in list(itertools.chain(*cgo_list))],
|
|
105
|
+
name,
|
|
106
|
+
)
|
|
107
|
+
return PyMOLObject(name, pymol_instance, delete)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def get_cylinder_cgo(start, end, radius, start_color, end_color):
|
|
111
|
+
"""
|
|
112
|
+
Get the CGO for a cylinder.
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
start, end : array-like, shape=(3,)
|
|
117
|
+
The start and end position of the cylinder.
|
|
118
|
+
radius : float
|
|
119
|
+
The radius of the cylinder.
|
|
120
|
+
start_color, end_color : array-like, shape=(3,)
|
|
121
|
+
The color at the start and end of the cylinder given as RGB
|
|
122
|
+
values in the range *(0, 1)*.
|
|
123
|
+
|
|
124
|
+
Returns
|
|
125
|
+
-------
|
|
126
|
+
cgo : list of float
|
|
127
|
+
The CGO representation.
|
|
128
|
+
"""
|
|
129
|
+
_expect_length(start, "start", 3)
|
|
130
|
+
_expect_length(end, "end", 3)
|
|
131
|
+
_expect_length(start_color, "start_color", 3)
|
|
132
|
+
_expect_length(end_color, "end_color", 3)
|
|
133
|
+
_check_color(start_color)
|
|
134
|
+
_check_color(end_color)
|
|
135
|
+
return [CGO.CYLINDER, *start, *end, radius, *start_color, *end_color]
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def get_cone_cgo(
|
|
139
|
+
start, end, start_radius, end_radius, start_color, end_color, start_cap, end_cap
|
|
140
|
+
):
|
|
141
|
+
"""
|
|
142
|
+
Get the CGO for a cone.
|
|
143
|
+
|
|
144
|
+
Parameters
|
|
145
|
+
----------
|
|
146
|
+
start, end : array-like, shape=(3,)
|
|
147
|
+
The start and end position of the cone.
|
|
148
|
+
start_radius, end_radius : float
|
|
149
|
+
The radius of the cone at the start and end.
|
|
150
|
+
start_color, end_color : array-like, shape=(3,)
|
|
151
|
+
The color at the start and end of the cone given as RGB
|
|
152
|
+
values in the range *(0, 1)*.
|
|
153
|
+
start_cap, end_cap : bool
|
|
154
|
+
If true, a cap is drawn at the start or end of the cone.
|
|
155
|
+
Otherwise the cone is displayed as *open*.
|
|
156
|
+
|
|
157
|
+
Returns
|
|
158
|
+
-------
|
|
159
|
+
cgo : list of float
|
|
160
|
+
The CGO representation.
|
|
161
|
+
"""
|
|
162
|
+
_expect_length(start, "start", 3)
|
|
163
|
+
_expect_length(end, "end", 3)
|
|
164
|
+
_expect_length(start_color, "start_color", 3)
|
|
165
|
+
_expect_length(end_color, "end_color", 3)
|
|
166
|
+
_check_color(start_color)
|
|
167
|
+
_check_color(end_color)
|
|
168
|
+
return [
|
|
169
|
+
CGO.CONE,
|
|
170
|
+
*start,
|
|
171
|
+
*end,
|
|
172
|
+
start_radius,
|
|
173
|
+
end_radius,
|
|
174
|
+
*start_color,
|
|
175
|
+
*end_color,
|
|
176
|
+
start_cap,
|
|
177
|
+
end_cap,
|
|
178
|
+
]
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def get_sphere_cgo(pos, radius, color):
|
|
182
|
+
"""
|
|
183
|
+
Get the CGO for a sphere.
|
|
184
|
+
|
|
185
|
+
Parameters
|
|
186
|
+
----------
|
|
187
|
+
pos : array-like, shape=(3,)
|
|
188
|
+
The position of the sphere.
|
|
189
|
+
radius : float
|
|
190
|
+
The radius of the sphere.
|
|
191
|
+
color : array-like, shape=(3,)
|
|
192
|
+
The color of the sphere given as RGB values in the range
|
|
193
|
+
*(0, 1)*.
|
|
194
|
+
|
|
195
|
+
Returns
|
|
196
|
+
-------
|
|
197
|
+
cgo : list of float
|
|
198
|
+
The CGO representation.
|
|
199
|
+
"""
|
|
200
|
+
_expect_length(pos, "pos", 3)
|
|
201
|
+
_expect_length(color, "color", 3)
|
|
202
|
+
_check_color(color)
|
|
203
|
+
return [CGO.COLOR, *color, CGO.SPHERE, *pos, radius]
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def get_point_cgo(pos, color):
|
|
207
|
+
"""
|
|
208
|
+
Get the CGO for one or multiple points.
|
|
209
|
+
|
|
210
|
+
Parameters
|
|
211
|
+
----------
|
|
212
|
+
pos : array-like, shape=(3,), shape=(n,3)
|
|
213
|
+
The position(s) of the points.
|
|
214
|
+
color : array-like, shape=(3,) or shape=(n,3)
|
|
215
|
+
The color of the point(s) given as RGB values in the range
|
|
216
|
+
*(0, 1)*.
|
|
217
|
+
Either one color can be given that is used for all points or
|
|
218
|
+
an individual color for each point can be supplied.
|
|
219
|
+
|
|
220
|
+
Returns
|
|
221
|
+
-------
|
|
222
|
+
cgo : list of float
|
|
223
|
+
The CGO representation.
|
|
224
|
+
"""
|
|
225
|
+
pos = np.atleast_2d(pos)
|
|
226
|
+
color = _arrayfy(color, len(pos), 2)
|
|
227
|
+
|
|
228
|
+
for p in pos:
|
|
229
|
+
_expect_length(p, "pos", 3)
|
|
230
|
+
for c in color:
|
|
231
|
+
_expect_length(c, "color", 3)
|
|
232
|
+
_check_color(c)
|
|
233
|
+
|
|
234
|
+
vertices = []
|
|
235
|
+
for p, c in zip(pos, color):
|
|
236
|
+
vertices += [CGO.COLOR, *c, CGO.VERTEX, *p]
|
|
237
|
+
|
|
238
|
+
return [CGO.BEGIN, CGO.POINTS] + vertices + [CGO.END]
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def get_line_cgo(pos, color, width=1.0):
|
|
242
|
+
"""
|
|
243
|
+
Get the CGO for a line following the given positions.
|
|
244
|
+
|
|
245
|
+
Parameters
|
|
246
|
+
----------
|
|
247
|
+
pos : array-like, shape=(n,3)
|
|
248
|
+
The line follows these positions.
|
|
249
|
+
color : array-like, shape=(3,) or shape=(n,3)
|
|
250
|
+
The color of the line given as RGB values in the range
|
|
251
|
+
*(0, 1)*.
|
|
252
|
+
Either one color can be given that is used for all positions or
|
|
253
|
+
an individual color for each position can be supplied.
|
|
254
|
+
width : float, optional
|
|
255
|
+
The rendered width of the line.
|
|
256
|
+
The width is only visible after calling :func:`ray()`.
|
|
257
|
+
|
|
258
|
+
Returns
|
|
259
|
+
-------
|
|
260
|
+
cgo : list of float
|
|
261
|
+
The CGO representation.
|
|
262
|
+
"""
|
|
263
|
+
color = _arrayfy(color, len(pos), 2)
|
|
264
|
+
|
|
265
|
+
for p in pos:
|
|
266
|
+
_expect_length(p, "pos", 3)
|
|
267
|
+
for c in color:
|
|
268
|
+
_expect_length(c, "color", 3)
|
|
269
|
+
_check_color(c)
|
|
270
|
+
|
|
271
|
+
vertices = []
|
|
272
|
+
for p, c in zip(pos, color):
|
|
273
|
+
vertices += [CGO.COLOR, *c, CGO.VERTEX, *p]
|
|
274
|
+
|
|
275
|
+
return [CGO.LINEWIDTH, width, CGO.BEGIN, CGO.LINE_STRIP] + vertices + [CGO.END]
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def get_multiline_cgo(start, end, color, width=1.0):
|
|
279
|
+
"""
|
|
280
|
+
Get the CGO for one or multiple straight lines drawn from given
|
|
281
|
+
start to end positions.
|
|
282
|
+
|
|
283
|
+
Parameters
|
|
284
|
+
----------
|
|
285
|
+
start, end : array-like, shape=(3,) or shape=(n,3)
|
|
286
|
+
The *n* lines are drawn from the `start` to the `end` positions.
|
|
287
|
+
color : array-like, shape=(3,) or shape=(n,3)
|
|
288
|
+
The color of the lines given as RGB values in the range
|
|
289
|
+
*(0, 1)*.
|
|
290
|
+
Either one color can be given that is used for all lines or
|
|
291
|
+
an individual color for each line can be supplied.
|
|
292
|
+
width : float, optional
|
|
293
|
+
The rendered width of the lines.
|
|
294
|
+
The width is only visible after calling :func:`ray()`.
|
|
295
|
+
|
|
296
|
+
Returns
|
|
297
|
+
-------
|
|
298
|
+
cgo : list of float
|
|
299
|
+
The CGO representation.
|
|
300
|
+
"""
|
|
301
|
+
start = np.atleast_2d(start)
|
|
302
|
+
end = np.atleast_2d(end)
|
|
303
|
+
color = _arrayfy(color, len(start), 2)
|
|
304
|
+
|
|
305
|
+
if len(start) != len(end):
|
|
306
|
+
raise IndexError(
|
|
307
|
+
f"{len(start)} start positions are given, but {len(end)} end positions"
|
|
308
|
+
)
|
|
309
|
+
for p in start:
|
|
310
|
+
_expect_length(p, "start", 3)
|
|
311
|
+
for p in end:
|
|
312
|
+
_expect_length(p, "end", 3)
|
|
313
|
+
for c in color:
|
|
314
|
+
_expect_length(c, "color", 3)
|
|
315
|
+
_check_color(c)
|
|
316
|
+
|
|
317
|
+
vertices = []
|
|
318
|
+
for p1, p2, c in zip(start, end, color):
|
|
319
|
+
vertices += [CGO.COLOR, *c, CGO.VERTEX, *p1, CGO.VERTEX, *p2]
|
|
320
|
+
|
|
321
|
+
return [CGO.LINEWIDTH, width, CGO.BEGIN, CGO.LINES] + vertices + [CGO.END]
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def _expect_length(values, name, length):
|
|
325
|
+
if len(values) != length:
|
|
326
|
+
raise IndexError(
|
|
327
|
+
f"'{name}' has {len(values)} values, but {length} were expected"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def _check_color(color):
|
|
332
|
+
if np.any(color) < 0 or np.any(color) > 1:
|
|
333
|
+
raise ValueError("Colors must be in range (0, 1)")
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def _arrayfy(value, length, min_dim):
|
|
337
|
+
"""
|
|
338
|
+
Expand value(s) to the given number of dimensions and repeat value
|
|
339
|
+
`length` number of times if only a single value is given.
|
|
340
|
+
"""
|
|
341
|
+
value = np.array(value, ndmin=min_dim)
|
|
342
|
+
if len(value) == 1 and length > 1:
|
|
343
|
+
value = np.repeat(value, length, axis=0)
|
|
344
|
+
elif len(value) != length:
|
|
345
|
+
raise IndexError(f"Expected {length} values, but got {len(value)}")
|
|
346
|
+
return value
|