biotite 0.41.1__cp312-cp312-macosx_10_16_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.

Files changed (340) hide show
  1. biotite/__init__.py +19 -0
  2. biotite/application/__init__.py +43 -0
  3. biotite/application/application.py +265 -0
  4. biotite/application/autodock/__init__.py +12 -0
  5. biotite/application/autodock/app.py +505 -0
  6. biotite/application/blast/__init__.py +14 -0
  7. biotite/application/blast/alignment.py +83 -0
  8. biotite/application/blast/webapp.py +421 -0
  9. biotite/application/clustalo/__init__.py +12 -0
  10. biotite/application/clustalo/app.py +238 -0
  11. biotite/application/dssp/__init__.py +12 -0
  12. biotite/application/dssp/app.py +152 -0
  13. biotite/application/localapp.py +306 -0
  14. biotite/application/mafft/__init__.py +12 -0
  15. biotite/application/mafft/app.py +122 -0
  16. biotite/application/msaapp.py +374 -0
  17. biotite/application/muscle/__init__.py +13 -0
  18. biotite/application/muscle/app3.py +254 -0
  19. biotite/application/muscle/app5.py +171 -0
  20. biotite/application/sra/__init__.py +18 -0
  21. biotite/application/sra/app.py +456 -0
  22. biotite/application/tantan/__init__.py +12 -0
  23. biotite/application/tantan/app.py +222 -0
  24. biotite/application/util.py +59 -0
  25. biotite/application/viennarna/__init__.py +18 -0
  26. biotite/application/viennarna/rnaalifold.py +304 -0
  27. biotite/application/viennarna/rnafold.py +269 -0
  28. biotite/application/viennarna/rnaplot.py +187 -0
  29. biotite/application/viennarna/util.py +72 -0
  30. biotite/application/webapp.py +77 -0
  31. biotite/copyable.py +71 -0
  32. biotite/database/__init__.py +23 -0
  33. biotite/database/entrez/__init__.py +15 -0
  34. biotite/database/entrez/check.py +61 -0
  35. biotite/database/entrez/dbnames.py +89 -0
  36. biotite/database/entrez/download.py +223 -0
  37. biotite/database/entrez/key.py +44 -0
  38. biotite/database/entrez/query.py +223 -0
  39. biotite/database/error.py +15 -0
  40. biotite/database/pubchem/__init__.py +21 -0
  41. biotite/database/pubchem/download.py +260 -0
  42. biotite/database/pubchem/error.py +20 -0
  43. biotite/database/pubchem/query.py +827 -0
  44. biotite/database/pubchem/throttle.py +99 -0
  45. biotite/database/rcsb/__init__.py +13 -0
  46. biotite/database/rcsb/download.py +167 -0
  47. biotite/database/rcsb/query.py +959 -0
  48. biotite/database/uniprot/__init__.py +13 -0
  49. biotite/database/uniprot/check.py +32 -0
  50. biotite/database/uniprot/download.py +134 -0
  51. biotite/database/uniprot/query.py +209 -0
  52. biotite/file.py +251 -0
  53. biotite/sequence/__init__.py +73 -0
  54. biotite/sequence/align/__init__.py +49 -0
  55. biotite/sequence/align/alignment.py +658 -0
  56. biotite/sequence/align/banded.cpython-312-darwin.so +0 -0
  57. biotite/sequence/align/banded.pyx +652 -0
  58. biotite/sequence/align/buckets.py +69 -0
  59. biotite/sequence/align/cigar.py +434 -0
  60. biotite/sequence/align/kmeralphabet.cpython-312-darwin.so +0 -0
  61. biotite/sequence/align/kmeralphabet.pyx +574 -0
  62. biotite/sequence/align/kmersimilarity.cpython-312-darwin.so +0 -0
  63. biotite/sequence/align/kmersimilarity.pyx +233 -0
  64. biotite/sequence/align/kmertable.cpython-312-darwin.so +0 -0
  65. biotite/sequence/align/kmertable.pyx +3400 -0
  66. biotite/sequence/align/localgapped.cpython-312-darwin.so +0 -0
  67. biotite/sequence/align/localgapped.pyx +892 -0
  68. biotite/sequence/align/localungapped.cpython-312-darwin.so +0 -0
  69. biotite/sequence/align/localungapped.pyx +279 -0
  70. biotite/sequence/align/matrix.py +405 -0
  71. biotite/sequence/align/matrix_data/BLOSUM100.mat +31 -0
  72. biotite/sequence/align/matrix_data/BLOSUM30.mat +31 -0
  73. biotite/sequence/align/matrix_data/BLOSUM35.mat +31 -0
  74. biotite/sequence/align/matrix_data/BLOSUM40.mat +31 -0
  75. biotite/sequence/align/matrix_data/BLOSUM45.mat +31 -0
  76. biotite/sequence/align/matrix_data/BLOSUM50.mat +31 -0
  77. biotite/sequence/align/matrix_data/BLOSUM50_13p.mat +25 -0
  78. biotite/sequence/align/matrix_data/BLOSUM50_14.3.mat +25 -0
  79. biotite/sequence/align/matrix_data/BLOSUM50_5.0.mat +25 -0
  80. biotite/sequence/align/matrix_data/BLOSUM55.mat +31 -0
  81. biotite/sequence/align/matrix_data/BLOSUM60.mat +31 -0
  82. biotite/sequence/align/matrix_data/BLOSUM62.mat +31 -0
  83. biotite/sequence/align/matrix_data/BLOSUM62_13p.mat +25 -0
  84. biotite/sequence/align/matrix_data/BLOSUM62_14.3.mat +25 -0
  85. biotite/sequence/align/matrix_data/BLOSUM62_5.0.mat +25 -0
  86. biotite/sequence/align/matrix_data/BLOSUM65.mat +31 -0
  87. biotite/sequence/align/matrix_data/BLOSUM70.mat +31 -0
  88. biotite/sequence/align/matrix_data/BLOSUM75.mat +31 -0
  89. biotite/sequence/align/matrix_data/BLOSUM80.mat +31 -0
  90. biotite/sequence/align/matrix_data/BLOSUM85.mat +31 -0
  91. biotite/sequence/align/matrix_data/BLOSUM90.mat +31 -0
  92. biotite/sequence/align/matrix_data/BLOSUMN.mat +31 -0
  93. biotite/sequence/align/matrix_data/CorBLOSUM49_5.0.mat +25 -0
  94. biotite/sequence/align/matrix_data/CorBLOSUM57_13p.mat +25 -0
  95. biotite/sequence/align/matrix_data/CorBLOSUM57_14.3.mat +25 -0
  96. biotite/sequence/align/matrix_data/CorBLOSUM61_5.0.mat +25 -0
  97. biotite/sequence/align/matrix_data/CorBLOSUM66_13p.mat +25 -0
  98. biotite/sequence/align/matrix_data/CorBLOSUM67_14.3.mat +25 -0
  99. biotite/sequence/align/matrix_data/DAYHOFF.mat +32 -0
  100. biotite/sequence/align/matrix_data/GONNET.mat +26 -0
  101. biotite/sequence/align/matrix_data/IDENTITY.mat +25 -0
  102. biotite/sequence/align/matrix_data/MATCH.mat +25 -0
  103. biotite/sequence/align/matrix_data/NUC.mat +25 -0
  104. biotite/sequence/align/matrix_data/PAM10.mat +34 -0
  105. biotite/sequence/align/matrix_data/PAM100.mat +34 -0
  106. biotite/sequence/align/matrix_data/PAM110.mat +34 -0
  107. biotite/sequence/align/matrix_data/PAM120.mat +34 -0
  108. biotite/sequence/align/matrix_data/PAM130.mat +34 -0
  109. biotite/sequence/align/matrix_data/PAM140.mat +34 -0
  110. biotite/sequence/align/matrix_data/PAM150.mat +34 -0
  111. biotite/sequence/align/matrix_data/PAM160.mat +34 -0
  112. biotite/sequence/align/matrix_data/PAM170.mat +34 -0
  113. biotite/sequence/align/matrix_data/PAM180.mat +34 -0
  114. biotite/sequence/align/matrix_data/PAM190.mat +34 -0
  115. biotite/sequence/align/matrix_data/PAM20.mat +34 -0
  116. biotite/sequence/align/matrix_data/PAM200.mat +34 -0
  117. biotite/sequence/align/matrix_data/PAM210.mat +34 -0
  118. biotite/sequence/align/matrix_data/PAM220.mat +34 -0
  119. biotite/sequence/align/matrix_data/PAM230.mat +34 -0
  120. biotite/sequence/align/matrix_data/PAM240.mat +34 -0
  121. biotite/sequence/align/matrix_data/PAM250.mat +34 -0
  122. biotite/sequence/align/matrix_data/PAM260.mat +34 -0
  123. biotite/sequence/align/matrix_data/PAM270.mat +34 -0
  124. biotite/sequence/align/matrix_data/PAM280.mat +34 -0
  125. biotite/sequence/align/matrix_data/PAM290.mat +34 -0
  126. biotite/sequence/align/matrix_data/PAM30.mat +34 -0
  127. biotite/sequence/align/matrix_data/PAM300.mat +34 -0
  128. biotite/sequence/align/matrix_data/PAM310.mat +34 -0
  129. biotite/sequence/align/matrix_data/PAM320.mat +34 -0
  130. biotite/sequence/align/matrix_data/PAM330.mat +34 -0
  131. biotite/sequence/align/matrix_data/PAM340.mat +34 -0
  132. biotite/sequence/align/matrix_data/PAM350.mat +34 -0
  133. biotite/sequence/align/matrix_data/PAM360.mat +34 -0
  134. biotite/sequence/align/matrix_data/PAM370.mat +34 -0
  135. biotite/sequence/align/matrix_data/PAM380.mat +34 -0
  136. biotite/sequence/align/matrix_data/PAM390.mat +34 -0
  137. biotite/sequence/align/matrix_data/PAM40.mat +34 -0
  138. biotite/sequence/align/matrix_data/PAM400.mat +34 -0
  139. biotite/sequence/align/matrix_data/PAM410.mat +34 -0
  140. biotite/sequence/align/matrix_data/PAM420.mat +34 -0
  141. biotite/sequence/align/matrix_data/PAM430.mat +34 -0
  142. biotite/sequence/align/matrix_data/PAM440.mat +34 -0
  143. biotite/sequence/align/matrix_data/PAM450.mat +34 -0
  144. biotite/sequence/align/matrix_data/PAM460.mat +34 -0
  145. biotite/sequence/align/matrix_data/PAM470.mat +34 -0
  146. biotite/sequence/align/matrix_data/PAM480.mat +34 -0
  147. biotite/sequence/align/matrix_data/PAM490.mat +34 -0
  148. biotite/sequence/align/matrix_data/PAM50.mat +34 -0
  149. biotite/sequence/align/matrix_data/PAM500.mat +34 -0
  150. biotite/sequence/align/matrix_data/PAM60.mat +34 -0
  151. biotite/sequence/align/matrix_data/PAM70.mat +34 -0
  152. biotite/sequence/align/matrix_data/PAM80.mat +34 -0
  153. biotite/sequence/align/matrix_data/PAM90.mat +34 -0
  154. biotite/sequence/align/matrix_data/RBLOSUM52_5.0.mat +25 -0
  155. biotite/sequence/align/matrix_data/RBLOSUM59_13p.mat +25 -0
  156. biotite/sequence/align/matrix_data/RBLOSUM59_14.3.mat +25 -0
  157. biotite/sequence/align/matrix_data/RBLOSUM64_5.0.mat +25 -0
  158. biotite/sequence/align/matrix_data/RBLOSUM69_13p.mat +25 -0
  159. biotite/sequence/align/matrix_data/RBLOSUM69_14.3.mat +25 -0
  160. biotite/sequence/align/multiple.cpython-312-darwin.so +0 -0
  161. biotite/sequence/align/multiple.pyx +620 -0
  162. biotite/sequence/align/pairwise.cpython-312-darwin.so +0 -0
  163. biotite/sequence/align/pairwise.pyx +587 -0
  164. biotite/sequence/align/permutation.cpython-312-darwin.so +0 -0
  165. biotite/sequence/align/permutation.pyx +305 -0
  166. biotite/sequence/align/primes.txt +821 -0
  167. biotite/sequence/align/selector.cpython-312-darwin.so +0 -0
  168. biotite/sequence/align/selector.pyx +956 -0
  169. biotite/sequence/align/statistics.py +265 -0
  170. biotite/sequence/align/tracetable.cpython-312-darwin.so +0 -0
  171. biotite/sequence/align/tracetable.pxd +64 -0
  172. biotite/sequence/align/tracetable.pyx +370 -0
  173. biotite/sequence/alphabet.py +566 -0
  174. biotite/sequence/annotation.py +829 -0
  175. biotite/sequence/codec.cpython-312-darwin.so +0 -0
  176. biotite/sequence/codec.pyx +155 -0
  177. biotite/sequence/codon.py +466 -0
  178. biotite/sequence/codon_tables.txt +202 -0
  179. biotite/sequence/graphics/__init__.py +33 -0
  180. biotite/sequence/graphics/alignment.py +1034 -0
  181. biotite/sequence/graphics/color_schemes/autumn.json +51 -0
  182. biotite/sequence/graphics/color_schemes/blossom.json +51 -0
  183. biotite/sequence/graphics/color_schemes/clustalx_dna.json +11 -0
  184. biotite/sequence/graphics/color_schemes/clustalx_protein.json +28 -0
  185. biotite/sequence/graphics/color_schemes/flower.json +51 -0
  186. biotite/sequence/graphics/color_schemes/jalview_buried.json +31 -0
  187. biotite/sequence/graphics/color_schemes/jalview_hydrophobicity.json +31 -0
  188. biotite/sequence/graphics/color_schemes/jalview_prop_helix.json +31 -0
  189. biotite/sequence/graphics/color_schemes/jalview_prop_strand.json +31 -0
  190. biotite/sequence/graphics/color_schemes/jalview_prop_turn.json +31 -0
  191. biotite/sequence/graphics/color_schemes/jalview_taylor.json +28 -0
  192. biotite/sequence/graphics/color_schemes/jalview_zappo.json +28 -0
  193. biotite/sequence/graphics/color_schemes/ocean.json +51 -0
  194. biotite/sequence/graphics/color_schemes/pb_flower.json +39 -0
  195. biotite/sequence/graphics/color_schemes/rainbow_dna.json +11 -0
  196. biotite/sequence/graphics/color_schemes/rainbow_protein.json +30 -0
  197. biotite/sequence/graphics/color_schemes/spring.json +51 -0
  198. biotite/sequence/graphics/color_schemes/sunset.json +51 -0
  199. biotite/sequence/graphics/color_schemes/wither.json +51 -0
  200. biotite/sequence/graphics/colorschemes.py +139 -0
  201. biotite/sequence/graphics/dendrogram.py +184 -0
  202. biotite/sequence/graphics/features.py +510 -0
  203. biotite/sequence/graphics/logo.py +110 -0
  204. biotite/sequence/graphics/plasmid.py +661 -0
  205. biotite/sequence/io/__init__.py +12 -0
  206. biotite/sequence/io/fasta/__init__.py +22 -0
  207. biotite/sequence/io/fasta/convert.py +273 -0
  208. biotite/sequence/io/fasta/file.py +278 -0
  209. biotite/sequence/io/fastq/__init__.py +19 -0
  210. biotite/sequence/io/fastq/convert.py +120 -0
  211. biotite/sequence/io/fastq/file.py +551 -0
  212. biotite/sequence/io/genbank/__init__.py +17 -0
  213. biotite/sequence/io/genbank/annotation.py +277 -0
  214. biotite/sequence/io/genbank/file.py +575 -0
  215. biotite/sequence/io/genbank/metadata.py +324 -0
  216. biotite/sequence/io/genbank/sequence.py +172 -0
  217. biotite/sequence/io/general.py +192 -0
  218. biotite/sequence/io/gff/__init__.py +26 -0
  219. biotite/sequence/io/gff/convert.py +133 -0
  220. biotite/sequence/io/gff/file.py +434 -0
  221. biotite/sequence/phylo/__init__.py +36 -0
  222. biotite/sequence/phylo/nj.cpython-312-darwin.so +0 -0
  223. biotite/sequence/phylo/nj.pyx +221 -0
  224. biotite/sequence/phylo/tree.cpython-312-darwin.so +0 -0
  225. biotite/sequence/phylo/tree.pyx +1169 -0
  226. biotite/sequence/phylo/upgma.cpython-312-darwin.so +0 -0
  227. biotite/sequence/phylo/upgma.pyx +164 -0
  228. biotite/sequence/profile.py +456 -0
  229. biotite/sequence/search.py +116 -0
  230. biotite/sequence/seqtypes.py +556 -0
  231. biotite/sequence/sequence.py +374 -0
  232. biotite/structure/__init__.py +132 -0
  233. biotite/structure/atoms.py +1455 -0
  234. biotite/structure/basepairs.py +1415 -0
  235. biotite/structure/bonds.cpython-312-darwin.so +0 -0
  236. biotite/structure/bonds.pyx +1933 -0
  237. biotite/structure/box.py +592 -0
  238. biotite/structure/celllist.cpython-312-darwin.so +0 -0
  239. biotite/structure/celllist.pyx +849 -0
  240. biotite/structure/chains.py +298 -0
  241. biotite/structure/charges.cpython-312-darwin.so +0 -0
  242. biotite/structure/charges.pyx +520 -0
  243. biotite/structure/compare.py +274 -0
  244. biotite/structure/density.py +114 -0
  245. biotite/structure/dotbracket.py +216 -0
  246. biotite/structure/error.py +31 -0
  247. biotite/structure/filter.py +585 -0
  248. biotite/structure/geometry.py +697 -0
  249. biotite/structure/graphics/__init__.py +13 -0
  250. biotite/structure/graphics/atoms.py +226 -0
  251. biotite/structure/graphics/rna.py +282 -0
  252. biotite/structure/hbond.py +409 -0
  253. biotite/structure/info/__init__.py +25 -0
  254. biotite/structure/info/atom_masses.json +121 -0
  255. biotite/structure/info/atoms.py +82 -0
  256. biotite/structure/info/bonds.py +145 -0
  257. biotite/structure/info/ccd/README.rst +8 -0
  258. biotite/structure/info/ccd/amino_acids.txt +1663 -0
  259. biotite/structure/info/ccd/carbohydrates.txt +1135 -0
  260. biotite/structure/info/ccd/components.bcif +0 -0
  261. biotite/structure/info/ccd/nucleotides.txt +798 -0
  262. biotite/structure/info/ccd.py +95 -0
  263. biotite/structure/info/groups.py +90 -0
  264. biotite/structure/info/masses.py +123 -0
  265. biotite/structure/info/misc.py +144 -0
  266. biotite/structure/info/radii.py +197 -0
  267. biotite/structure/info/standardize.py +196 -0
  268. biotite/structure/integrity.py +268 -0
  269. biotite/structure/io/__init__.py +30 -0
  270. biotite/structure/io/ctab.py +72 -0
  271. biotite/structure/io/dcd/__init__.py +13 -0
  272. biotite/structure/io/dcd/file.py +65 -0
  273. biotite/structure/io/general.py +257 -0
  274. biotite/structure/io/gro/__init__.py +14 -0
  275. biotite/structure/io/gro/file.py +343 -0
  276. biotite/structure/io/mmtf/__init__.py +21 -0
  277. biotite/structure/io/mmtf/assembly.py +214 -0
  278. biotite/structure/io/mmtf/convertarray.cpython-312-darwin.so +0 -0
  279. biotite/structure/io/mmtf/convertarray.pyx +341 -0
  280. biotite/structure/io/mmtf/convertfile.cpython-312-darwin.so +0 -0
  281. biotite/structure/io/mmtf/convertfile.pyx +501 -0
  282. biotite/structure/io/mmtf/decode.cpython-312-darwin.so +0 -0
  283. biotite/structure/io/mmtf/decode.pyx +152 -0
  284. biotite/structure/io/mmtf/encode.cpython-312-darwin.so +0 -0
  285. biotite/structure/io/mmtf/encode.pyx +183 -0
  286. biotite/structure/io/mmtf/file.py +233 -0
  287. biotite/structure/io/mol/__init__.py +20 -0
  288. biotite/structure/io/mol/convert.py +115 -0
  289. biotite/structure/io/mol/ctab.py +414 -0
  290. biotite/structure/io/mol/header.py +116 -0
  291. biotite/structure/io/mol/mol.py +193 -0
  292. biotite/structure/io/mol/sdf.py +916 -0
  293. biotite/structure/io/netcdf/__init__.py +13 -0
  294. biotite/structure/io/netcdf/file.py +63 -0
  295. biotite/structure/io/npz/__init__.py +20 -0
  296. biotite/structure/io/npz/file.py +152 -0
  297. biotite/structure/io/pdb/__init__.py +20 -0
  298. biotite/structure/io/pdb/convert.py +293 -0
  299. biotite/structure/io/pdb/file.py +1240 -0
  300. biotite/structure/io/pdb/hybrid36.cpython-312-darwin.so +0 -0
  301. biotite/structure/io/pdb/hybrid36.pyx +242 -0
  302. biotite/structure/io/pdbqt/__init__.py +15 -0
  303. biotite/structure/io/pdbqt/convert.py +107 -0
  304. biotite/structure/io/pdbqt/file.py +640 -0
  305. biotite/structure/io/pdbx/__init__.py +23 -0
  306. biotite/structure/io/pdbx/bcif.py +648 -0
  307. biotite/structure/io/pdbx/cif.py +1032 -0
  308. biotite/structure/io/pdbx/component.py +246 -0
  309. biotite/structure/io/pdbx/convert.py +1597 -0
  310. biotite/structure/io/pdbx/encoding.cpython-312-darwin.so +0 -0
  311. biotite/structure/io/pdbx/encoding.pyx +950 -0
  312. biotite/structure/io/pdbx/legacy.py +267 -0
  313. biotite/structure/io/tng/__init__.py +13 -0
  314. biotite/structure/io/tng/file.py +46 -0
  315. biotite/structure/io/trajfile.py +710 -0
  316. biotite/structure/io/trr/__init__.py +13 -0
  317. biotite/structure/io/trr/file.py +46 -0
  318. biotite/structure/io/xtc/__init__.py +13 -0
  319. biotite/structure/io/xtc/file.py +46 -0
  320. biotite/structure/mechanics.py +75 -0
  321. biotite/structure/molecules.py +353 -0
  322. biotite/structure/pseudoknots.py +642 -0
  323. biotite/structure/rdf.py +243 -0
  324. biotite/structure/repair.py +253 -0
  325. biotite/structure/residues.py +562 -0
  326. biotite/structure/resutil.py +178 -0
  327. biotite/structure/sasa.cpython-312-darwin.so +0 -0
  328. biotite/structure/sasa.pyx +322 -0
  329. biotite/structure/sequence.py +112 -0
  330. biotite/structure/sse.py +327 -0
  331. biotite/structure/superimpose.py +727 -0
  332. biotite/structure/transform.py +504 -0
  333. biotite/structure/util.py +98 -0
  334. biotite/temp.py +86 -0
  335. biotite/version.py +16 -0
  336. biotite/visualize.py +251 -0
  337. biotite-0.41.1.dist-info/METADATA +187 -0
  338. biotite-0.41.1.dist-info/RECORD +340 -0
  339. biotite-0.41.1.dist-info/WHEEL +4 -0
  340. biotite-0.41.1.dist-info/licenses/LICENSE.rst +30 -0
@@ -0,0 +1,226 @@
1
+ # This source code is part of the Biotite package and is distributed
2
+ # under the 3-Clause BSD License. Please see 'LICENSE.rst' for further
3
+ # information.
4
+
5
+ __name__ = "biotite.structure.graphics"
6
+ __author__ = "Patrick Kunzmann"
7
+ __all__ = ["plot_atoms", "plot_ball_and_stick_model"]
8
+
9
+ import numpy as np
10
+ import matplotlib.pyplot as plt
11
+ from mpl_toolkits.mplot3d import Axes3D
12
+ from mpl_toolkits.mplot3d.art3d import Line3DCollection
13
+
14
+
15
+ def plot_atoms(axes, atoms, colors, line_width=1.0, background_color=None,
16
+ center=None, size=None, zoom=1.0):
17
+ """
18
+ Plot an :class:`AtomArray` as lines between bonded atoms.
19
+
20
+ The z-axis points into the screen plane.
21
+
22
+ Parameters
23
+ ----------
24
+ axes : Axes3D
25
+ The *Matplotlib* 3D-axes to plot the structure on.
26
+ atoms : AtomArray, shape=(n,)
27
+ The structure to be plotted.
28
+ The atom array must have an associated :class:`BondList`, i.e.
29
+ its ``bonds`` attribute must be defined.
30
+ One line for each bond is drawn.
31
+ colors : ndarray, shape=(n,3) or shape=(n,4), dtype=float
32
+ An array of RGB or RGBA colors for each atom in `atoms`.
33
+ The values for each color channel are in the range 0 to 1.
34
+ line_width : float, optional
35
+ The width of the lines to be drawn.
36
+ background_color : object
37
+ A *Matplotlib* compatible color (color name or RGB values).
38
+ If set, the background is colored with the given value.
39
+ center : tuple of (float, float, float), optional
40
+ The coordinates of the structure that are in the center of the
41
+ plot.
42
+ By default the complete molecule is centered.
43
+ size : float, optional
44
+ The size of each dimension in the plot.
45
+ The limits of the :class:`Axes3D` are set to
46
+ ``(center - size/(2*zoom)), (center + size/(2*zoom))``.
47
+ zoom : float, optional
48
+ Zoom in or zoom out.
49
+
50
+ - ``> 1.0``: Zoom in.
51
+ - ``< 1.0``: Zoom out.
52
+
53
+ Notes
54
+ -----
55
+ This is a very simple visualization tools for quick visual analysis
56
+ of a structure.
57
+ For publication-ready molecular images the usage of a dedicated
58
+ molecular visualization tool is recommended.
59
+ """
60
+ if not isinstance(axes, Axes3D):
61
+ raise ValueError("The given axes mut be an 'Axes3D'")
62
+ if atoms.bonds is None:
63
+ raise ValueError("The atom array must have an associated bond list")
64
+
65
+ # Calculating connections between atoms
66
+ line_coord = []
67
+ line_colors = []
68
+ for index1, index2 in atoms.bonds.as_array()[:,:2]:
69
+ # Every connection consist of two lines:
70
+ # One from the first atom to the center
71
+ # and from from the second atom to the center
72
+ line_start = atoms.coord[index1]
73
+ line_end = atoms.coord[index2]
74
+ line_center = (line_start + line_end) / 2
75
+
76
+ # Add line from first atom
77
+ line_coord.append((
78
+ line_start, line_center
79
+ ))
80
+ line_colors.append(colors[index1])
81
+
82
+ # Add line from second atom
83
+ line_coord.append((
84
+ line_end, line_center
85
+ ))
86
+ line_colors.append(colors[index2])
87
+
88
+ # Plot computed line coordinates and colors
89
+ # Use 'Line3DCollection' for higher efficiency
90
+ lines = Line3DCollection(
91
+ line_coord, color=line_colors, linewidths=line_width,
92
+ capstyle="round", joinstyle="round"
93
+ )
94
+ axes.add_collection(lines)
95
+
96
+ # Set viewing angle
97
+ axes.azim = -90
98
+ axes.elev = 90
99
+ # Remove frame
100
+ axes.axis("off")
101
+ # Set background color
102
+ if background_color is not None:
103
+ axes.set_facecolor(background_color)
104
+ axes.get_figure().set_facecolor(background_color)
105
+ _set_box(axes, atoms.coord, center, size, zoom)
106
+
107
+
108
+ def plot_ball_and_stick_model(axes, atoms, colors, ball_size=200,
109
+ line_color="black", line_width=1.0,
110
+ background_color=None, center=None,
111
+ size=None, zoom=1.0):
112
+ """
113
+ Plot an :class:`AtomArray` as *ball-and-stick* model.
114
+
115
+ The z-axis points into the screen plane.
116
+
117
+ UNSTABLE: This function is probably subject to future changes.
118
+
119
+ Parameters
120
+ ----------
121
+ axes : Axes3D
122
+ The *Matplotlib* 3D-axes to plot the structure on.
123
+ atoms : AtomArray, length=n
124
+ The structure to be plotted.
125
+ The atom array must have an associated :class:`BondList`, i.e.
126
+ its ``bonds`` attribute must be defined.
127
+ One line for each bond is drawn.
128
+ colors : ndarray, shape=(n,3) or shape=(n,4), dtype=float
129
+ An array of RGB or RGBA colors for each atom in `atoms`, that
130
+ is used to color the *balls* of the model.
131
+ The values for each color channel are in the range 0 to 1.
132
+ ball_size : int or iterable of int, shape=(n,)
133
+ The size of the *balls* in the model in *pt*.
134
+ Either a single value for all atoms or an iterable object of
135
+ values for each atom.
136
+ line_color : object
137
+ A *Matplotlib* compatible color value for the *sticks* of the
138
+ model.
139
+ line_width : float, optional
140
+ The width of the *sticks* in the model in *pt*.
141
+ background_color : object
142
+ A *Matplotlib* compatible color (color name or RGB values).
143
+ If set, the background is colored with the given value.
144
+ center : tuple of (float, float, float), optional
145
+ The coordinates of the structure that are in the center of the
146
+ plot.
147
+ By default the complete molecule is centered.
148
+ size : float, optional
149
+ The size of each dimension in the plot.
150
+ The limits of the :class:`Axes3D` are set to
151
+ ``(center - size/(2*zoom)), (center + size/(2*zoom))``.
152
+ zoom : float, optional
153
+ Zoom in or zoom out.
154
+
155
+ - ``> 1.0``: Zoom in.
156
+ - ``< 1.0``: Zoom out.
157
+
158
+ Notes
159
+ -----
160
+ This is a very simple visualization tools for quick visual analysis
161
+ of a structure.
162
+ For publication-ready molecular images the usage of a dedicated
163
+ molecular visualization tool is recommended.
164
+ """
165
+ if not isinstance(axes, Axes3D):
166
+ raise ValueError("The given axes mut be an 'Axes3D'")
167
+ if atoms.bonds is None:
168
+ raise ValueError("The atom array must have an associated bond list")
169
+
170
+ # Calculating connections between atoms
171
+ line_coord = [
172
+ (atoms.coord[index1], atoms.coord[index2])
173
+ for index1, index2 in atoms.bonds.as_array()[:,:2]
174
+ ]
175
+
176
+ # Plot sticks
177
+ # Use 'Line3DCollection' for higher efficiency
178
+ sticks = Line3DCollection(
179
+ line_coord, color=line_color, linewidths=line_width,
180
+ capstyle="round", joinstyle="round"
181
+ )
182
+ axes.add_collection(sticks)
183
+
184
+ # Plot balls
185
+ axes.scatter(
186
+ *atoms.coord.T, s=ball_size, c=colors, linewidth=0, alpha=1
187
+ )
188
+
189
+ # Set viewing angle
190
+ axes.azim = -90
191
+ axes.elev = 90
192
+ # Remove frame
193
+ axes.axis("off")
194
+ # Set background color
195
+ if background_color is not None:
196
+ axes.set_facecolor(background_color)
197
+ axes.get_figure().set_facecolor(background_color)
198
+ _set_box(axes, atoms.coord, center, size, zoom)
199
+
200
+
201
+ def _set_box(axes, coord, center, size, zoom):
202
+ """
203
+ This ensures an approximately equal aspect ratio in a 3D plot under
204
+ the condition, that the :class:`Axes` is quadratic on the display.
205
+ """
206
+ if center is None:
207
+ center = (
208
+ (coord[:, 0].max() + coord[:, 0].min()) / 2,
209
+ (coord[:, 1].max() + coord[:, 1].min()) / 2,
210
+ (coord[:, 2].max() + coord[:, 2].min()) / 2,
211
+ )
212
+
213
+ if size is None:
214
+ size = np.array([
215
+ coord[:, 0].max() - coord[:, 0].min(),
216
+ coord[:, 1].max() - coord[:, 1].min(),
217
+ coord[:, 2].max() - coord[:, 2].min()
218
+ ]).max()
219
+
220
+ axes.set_xlim(center[0] - size/(2*zoom), center[0] + size/(2*zoom))
221
+ axes.set_ylim(center[1] - size/(2*zoom), center[1] + size/(2*zoom))
222
+ axes.set_zlim(center[2] - size/(2*zoom), center[2] + size/(2*zoom))
223
+
224
+ # Make the axis lengths of the 'plot box' equal
225
+ # The 'plot box' is not visible due to 'axes.axis("off")'
226
+ axes.set_box_aspect([1,1,1])
@@ -0,0 +1,282 @@
1
+ # This source code is part of the Biotite package and is distributed
2
+ # under the 3-Clause BSD License. Please see 'LICENSE.rst' for further
3
+ # information.
4
+
5
+ __name__ = "biotite.structure.graphics"
6
+ __author__ = "Tom David Müller"
7
+ __all__ = ["plot_nucleotide_secondary_structure"]
8
+
9
+ import shutil
10
+ import numpy as np
11
+ from itertools import repeat
12
+ from .. import pseudoknots
13
+ from ...application.viennarna import RNAplotApp
14
+
15
+
16
+ def plot_nucleotide_secondary_structure(
17
+ axes, base_labels, base_pairs, length,
18
+ layout_type=RNAplotApp.Layout.NAVIEW, draw_pseudoknots=True,
19
+ pseudoknot_order=None, angle=0, bond_linewidth=1, bond_linestyle=None,
20
+ bond_color='black', backbone_linewidth=1, backbone_linestyle='solid',
21
+ backbone_color='grey', base_text=None, base_box=None,
22
+ annotation_positions=None, annotation_offset=8.5, annotation_text=None,
23
+ border=0.03, bin_path="RNAplot"
24
+ ):
25
+ """
26
+ Generate 2D plots of nucleic acid secondary structures using the
27
+ interface to *RNAplot*, which is part of the *ViennaRNA* software
28
+ package.
29
+
30
+ Internally a :class:`biotite.application.viennarna.RNAplotApp`
31
+ instance is created to generate coordinates for each individual base
32
+ on a 2D plane. *ViennaRNA* must be installed in order to use this
33
+ function.
34
+
35
+ Parameters
36
+ ----------
37
+ axes : Axes
38
+ A *Matplotlib* axes, that is used as plotting area.
39
+ base_labels : iterable
40
+ The labels denoting the type of each base.
41
+ base_pairs : ndarray, shape=(n,2)
42
+ Each row corresponds to the positions of the bases in the
43
+ sequence. The positions are counted from zero.
44
+ length : int
45
+ The number of bases in the sequence.
46
+ layout_type : RNAplotApp.Layout, optional (default: RNAplotApp.Layout.NAVIEW)
47
+ The layout type according to the *RNAplot* documentation.
48
+ draw_pseudoknots : bool, optional (default: True)
49
+ Whether pseudoknotted bonds should be drawn.
50
+ pseudoknot_order : iterable, optional (default: None)
51
+ The pseudoknot order of each pair in the input `base_pairs`.
52
+ If no pseudoknot order is given, a solution determined by
53
+ :func:`biotite.structure.pseudoknots` is picked at random.
54
+ angle : int or float, optional (default: 0)
55
+ The angle the plot should be rotated.
56
+ bond_linewidth : float or int or iterable, optional (default: 1)
57
+ The linewidth of each bond. Provide a single value to set the
58
+ linewidth for all bonds or an iterable to set the linewidth for
59
+ each individual bond.
60
+ bond_linestyle : str or iterable, optional (default: None)
61
+ The *Matplotlib* compatible linestyle of each bond. Provide a
62
+ single value to set the linewidth for all bonds or an iterable
63
+ to set the linewidth for each individual bond. By default, solid
64
+ lines are used for non-pseudoknotted bonds and dashed lines are
65
+ used for pseudoknotted bonds.
66
+ bond_color : str or ndarray, shape(n,) or shape(n,3) or shape(n,4), optional (default: 'black')
67
+ The *Matplotlib* compatible color of each bond. Provide a single
68
+ string to set the color for all bonds or an array to set the
69
+ color for each individual bond.
70
+ backbone_linewidth : float, optional (default: 1)
71
+ The linewidth of the backbone.
72
+ backbone_linestyle : str, optional (default: 'solid')
73
+ The *Matplotlib* compatible linestyle of the backbone.
74
+ backbone_color : str or ndarray, shape=(3,) or shape=(4,), dtype=float, optional (default: 'grey')
75
+ The *Matplotlib* compatible color of the backbone.
76
+ base_text : dict or iterable, optional (default: {'size': 'small'})
77
+ The keyword parameters for the *Matplotlib* ``Text`` objects
78
+ denoting the type of each base. Provide a single value to set
79
+ the parameters for all labels or an iterable to set the
80
+ parameters for each individual label.
81
+ base_box : dict or iterable, optional (default: {'pad'=0, 'color'='white'})
82
+ The *Matplotlib* compatible properties of the ``FancyBboxPatch``
83
+ surrounding the base labels. Provide a single dictionary to
84
+ set the properties of all base lables or an iterable to set the
85
+ properties for each individual label.
86
+ annotation_positions : iterable, optional (default: None)
87
+ The positions of the bases to be numbered. By default every
88
+ second base is annotated. Please note that while the positions
89
+ in the sequence are counted from zero, they are displayed on the
90
+ graph counted from one.
91
+ annotation_offset : int or float, optional (default: 8.5)
92
+ The offset of the annotations from the base labels.
93
+ annotation_text : dict or iterable, optional (default: {'size': 'small'})
94
+ The keyword parameters for the *Matplotlib* ``Text`` objects
95
+ annotating the sequence. Provide a single value to set the
96
+ parameters for all annotations or an iterable to set the
97
+ parameters for each individual annotation.
98
+ border : float, optional (default: 0.03)
99
+ The percentage of the coordinate range to be left as whitespace
100
+ to create a border around the plot.
101
+ bin_path : str, optional
102
+ Path to the *RNAplot* binary.
103
+ """
104
+
105
+ # Check if RNAplot is installed
106
+ if shutil.which(bin_path) is None:
107
+ raise FileNotFoundError(
108
+ 'RNAplot is not installed at the specified location, unable to '
109
+ 'plot secondary structure.'
110
+ )
111
+
112
+ # Get the unknotted base pairs
113
+ if pseudoknot_order is None:
114
+ # Get a random unknotted structure retaining the maximum number
115
+ # of base pairs.
116
+ pseudoknot_order = pseudoknots(base_pairs, max_pseudoknot_order=0)[0]
117
+ unknotted_base_pairs = base_pairs[pseudoknot_order == 0]
118
+
119
+ # If `bond_linewidth` is a single value, extrapolate
120
+ if isinstance(bond_linewidth, int) or isinstance(bond_linewidth, float):
121
+ bond_linewidth = np.full(base_pairs.shape[0], bond_linewidth)
122
+
123
+ # If `bond_color` is not an array, extrapolate
124
+ if not isinstance(bond_color, np.ndarray):
125
+ bond_color = np.full(base_pairs.shape[0], bond_color)
126
+
127
+ # Set the default properties of the Matplotlib `bbox` surrounding
128
+ # the base labels
129
+ if base_box is None:
130
+ base_box=np.full(length, {'pad': 0, 'color': 'white'})
131
+ # if `base_box` is a dictionary, extrapolate
132
+ elif isinstance(base_box, dict):
133
+ base_box = np.full(length, base_box)
134
+
135
+ # By default pseudoknotted bonds are denoted as dashed lines, while
136
+ # unknotted bonds are denoted as solid lines
137
+ if bond_linestyle is None:
138
+ bond_linestyle = np.full(base_pairs.shape[0], 'solid', dtype='object')
139
+ bond_linestyle[pseudoknot_order != 0] = 'dashed'
140
+ # If `bond_linestyle` is a string, extrapolate
141
+ elif isinstance(bond_linestyle, str):
142
+ bond_linestyle = np.full(
143
+ base_pairs.shape[0], bond_linestyle, dtype='object'
144
+ )
145
+
146
+ # If pseudoknots are not to be drawn, remove pseudoknotted bonds,
147
+ # regardless of the given linestyles
148
+ if not draw_pseudoknots:
149
+ # Ensure that the array can hold the 'None' value
150
+ # (not possible with 'U1' dtype for example)
151
+ bond_linestyle = np.asarray(bond_linestyle, dtype='object')
152
+ bond_linestyle[pseudoknot_order != 0] = 'None'
153
+
154
+ # Set the default properties of the base labels
155
+ if base_text is None:
156
+ base_text = np.full(length, {'size': 'small'})
157
+ elif isinstance(base_text, dict):
158
+ base_text = np.full(length, base_text)
159
+
160
+ # If no specific annotation positions are given, annotate every
161
+ # second base pair
162
+ if annotation_positions is None:
163
+ annotation_positions = range(0, length, 2)
164
+
165
+ # Set the default font properties of the base annotations
166
+ if annotation_text is None:
167
+ annotation_text = repeat({'size': 'small'})
168
+ elif isinstance(annotation_text, dict):
169
+ annotation_text = repeat(annotation_text)
170
+
171
+ # Get coordinates for secondary structure plot
172
+ coordinates = RNAplotApp.compute_coordinates(
173
+ base_pairs=unknotted_base_pairs,
174
+ length=length,
175
+ bin_path=bin_path,
176
+ layout_type=layout_type
177
+ )
178
+
179
+ # Rotate Coordinates
180
+ if angle != 0:
181
+ angle = np.deg2rad(angle)
182
+ rot_matrix = np.array(
183
+ [[np.cos(angle), -np.sin(angle)],
184
+ [np.sin(angle), np.cos(angle)]]
185
+ )
186
+ for i, coord in enumerate(coordinates):
187
+ coordinates[i] = np.dot(rot_matrix, coord)
188
+
189
+ # Remove axes and frame
190
+ axes.set_xticks([])
191
+ axes.set_yticks([])
192
+ axes.xaxis.set_tick_params(
193
+ top=False, bottom=False, labeltop=False, labelbottom=False
194
+ )
195
+ axes.yaxis.set_tick_params(
196
+ top=False, bottom=False, labeltop=False, labelbottom=False
197
+ )
198
+ axes.set_frame_on(False)
199
+
200
+
201
+ # Define buffer area (Border)
202
+ coord_range = abs(np.max(coordinates)) + abs(np.min(coordinates))
203
+ buffer = border*coord_range
204
+
205
+ # Adjust display
206
+ axes.set_xlim(
207
+ np.min(coordinates[:,0])-buffer, np.max(coordinates[:,0])+buffer
208
+ )
209
+ axes.set_ylim(
210
+ np.min(coordinates[:,1])-buffer, np.max(coordinates[:,1])+buffer
211
+ )
212
+ axes.set_aspect(aspect='equal')
213
+
214
+ # Draw backbone
215
+ axes.plot(coordinates[:,0], coordinates[:,1], color=backbone_color,
216
+ linestyle=backbone_linestyle, linewidth=backbone_linewidth)
217
+
218
+ # Draw base labels
219
+ for coords, label, box, text in zip(
220
+ coordinates, base_labels, base_box, base_text
221
+ ):
222
+ t = axes.text(
223
+ x=coords[0], y=coords[1], s=label,
224
+ ha='center', va='center', **text
225
+ )
226
+ t.set_bbox(box)
227
+
228
+ # Draw bonds
229
+ for (base1, base2), color, style, width in zip(
230
+ base_pairs, bond_color, bond_linestyle, bond_linewidth
231
+ ):
232
+ base1_coords = coordinates[base1]
233
+ base2_coords = coordinates[base2]
234
+ x = base1_coords[0], base2_coords[0]
235
+ y = base1_coords[1], base2_coords[1]
236
+ axes.plot(x, y, color=color, linestyle=style, linewidth=width)
237
+
238
+ # Draw annotations
239
+ for i, text in zip(annotation_positions, annotation_text):
240
+ if (i > 0) and ((i+1) < length):
241
+ # Get the average of the direction vectors to the next and
242
+ # previous base
243
+ vector_to_previous = np.array(
244
+ [coordinates[i-1][0] - coordinates[i][0],
245
+ coordinates[i-1][1] - coordinates[i][1]]
246
+ )
247
+ vector_to_previous = vector_to_previous / np.linalg.norm(
248
+ vector_to_previous
249
+ )
250
+ vector_to_next = np.array(
251
+ [coordinates[i][0] - coordinates[i+1][0],
252
+ coordinates[i][1] - coordinates[i+1][1]]
253
+ )
254
+ vector_to_next = vector_to_next / np.linalg.norm(
255
+ vector_to_next
256
+ )
257
+ vector = (vector_to_next + vector_to_previous) / 2
258
+ elif i > 0:
259
+ # For the last base get the direction vector to the previous
260
+ # base
261
+ vector = np.array(
262
+ [coordinates[i-1][0] - coordinates[i][0],
263
+ coordinates[i-1][1] - coordinates[i][1]]
264
+ )
265
+ else:
266
+ # For the first base get the direction vector to the next
267
+ # base
268
+ vector = np.array(
269
+ [coordinates[i][0] - coordinates[i+1][0],
270
+ coordinates[i][1] - coordinates[i+1][1]]
271
+ )
272
+ # Normalize the vector
273
+ vector = vector / np.linalg.norm(vector)
274
+ # Get the perpendicular vector
275
+ vector = np.array([vector[1], -vector[0]])
276
+ # The annotations are offset in the direction of the
277
+ # perpendicular vector
278
+ x, y = coordinates[i] + (annotation_offset*vector)
279
+ axes.text(
280
+ x=x, y=y, s=i+1,
281
+ ha='center', va='center', **text
282
+ )