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.

Files changed (354) hide show
  1. biotite/__init__.py +18 -0
  2. biotite/application/__init__.py +69 -0
  3. biotite/application/application.py +276 -0
  4. biotite/application/autodock/__init__.py +12 -0
  5. biotite/application/autodock/app.py +500 -0
  6. biotite/application/blast/__init__.py +14 -0
  7. biotite/application/blast/alignment.py +92 -0
  8. biotite/application/blast/webapp.py +428 -0
  9. biotite/application/clustalo/__init__.py +12 -0
  10. biotite/application/clustalo/app.py +223 -0
  11. biotite/application/dssp/__init__.py +12 -0
  12. biotite/application/dssp/app.py +216 -0
  13. biotite/application/localapp.py +342 -0
  14. biotite/application/mafft/__init__.py +12 -0
  15. biotite/application/mafft/app.py +116 -0
  16. biotite/application/msaapp.py +363 -0
  17. biotite/application/muscle/__init__.py +13 -0
  18. biotite/application/muscle/app3.py +227 -0
  19. biotite/application/muscle/app5.py +163 -0
  20. biotite/application/sra/__init__.py +18 -0
  21. biotite/application/sra/app.py +447 -0
  22. biotite/application/tantan/__init__.py +12 -0
  23. biotite/application/tantan/app.py +199 -0
  24. biotite/application/util.py +77 -0
  25. biotite/application/viennarna/__init__.py +18 -0
  26. biotite/application/viennarna/rnaalifold.py +310 -0
  27. biotite/application/viennarna/rnafold.py +254 -0
  28. biotite/application/viennarna/rnaplot.py +208 -0
  29. biotite/application/viennarna/util.py +77 -0
  30. biotite/application/webapp.py +76 -0
  31. biotite/copyable.py +71 -0
  32. biotite/database/__init__.py +23 -0
  33. biotite/database/afdb/__init__.py +12 -0
  34. biotite/database/afdb/download.py +197 -0
  35. biotite/database/entrez/__init__.py +15 -0
  36. biotite/database/entrez/check.py +60 -0
  37. biotite/database/entrez/dbnames.py +101 -0
  38. biotite/database/entrez/download.py +228 -0
  39. biotite/database/entrez/key.py +44 -0
  40. biotite/database/entrez/query.py +263 -0
  41. biotite/database/error.py +16 -0
  42. biotite/database/pubchem/__init__.py +21 -0
  43. biotite/database/pubchem/download.py +258 -0
  44. biotite/database/pubchem/error.py +30 -0
  45. biotite/database/pubchem/query.py +819 -0
  46. biotite/database/pubchem/throttle.py +98 -0
  47. biotite/database/rcsb/__init__.py +13 -0
  48. biotite/database/rcsb/download.py +161 -0
  49. biotite/database/rcsb/query.py +963 -0
  50. biotite/database/uniprot/__init__.py +13 -0
  51. biotite/database/uniprot/check.py +40 -0
  52. biotite/database/uniprot/download.py +126 -0
  53. biotite/database/uniprot/query.py +292 -0
  54. biotite/file.py +244 -0
  55. biotite/interface/__init__.py +19 -0
  56. biotite/interface/openmm/__init__.py +20 -0
  57. biotite/interface/openmm/state.py +93 -0
  58. biotite/interface/openmm/system.py +227 -0
  59. biotite/interface/pymol/__init__.py +201 -0
  60. biotite/interface/pymol/cgo.py +346 -0
  61. biotite/interface/pymol/convert.py +185 -0
  62. biotite/interface/pymol/display.py +267 -0
  63. biotite/interface/pymol/object.py +1228 -0
  64. biotite/interface/pymol/shapes.py +178 -0
  65. biotite/interface/pymol/startup.py +169 -0
  66. biotite/interface/rdkit/__init__.py +19 -0
  67. biotite/interface/rdkit/mol.py +490 -0
  68. biotite/interface/version.py +94 -0
  69. biotite/interface/warning.py +19 -0
  70. biotite/sequence/__init__.py +84 -0
  71. biotite/sequence/align/__init__.py +199 -0
  72. biotite/sequence/align/alignment.py +702 -0
  73. biotite/sequence/align/banded.cpython-314-x86_64-linux-gnu.so +0 -0
  74. biotite/sequence/align/banded.pyx +652 -0
  75. biotite/sequence/align/buckets.py +71 -0
  76. biotite/sequence/align/cigar.py +425 -0
  77. biotite/sequence/align/kmeralphabet.cpython-314-x86_64-linux-gnu.so +0 -0
  78. biotite/sequence/align/kmeralphabet.pyx +595 -0
  79. biotite/sequence/align/kmersimilarity.cpython-314-x86_64-linux-gnu.so +0 -0
  80. biotite/sequence/align/kmersimilarity.pyx +233 -0
  81. biotite/sequence/align/kmertable.cpython-314-x86_64-linux-gnu.so +0 -0
  82. biotite/sequence/align/kmertable.pyx +3411 -0
  83. biotite/sequence/align/localgapped.cpython-314-x86_64-linux-gnu.so +0 -0
  84. biotite/sequence/align/localgapped.pyx +892 -0
  85. biotite/sequence/align/localungapped.cpython-314-x86_64-linux-gnu.so +0 -0
  86. biotite/sequence/align/localungapped.pyx +279 -0
  87. biotite/sequence/align/matrix.py +631 -0
  88. biotite/sequence/align/matrix_data/3Di.mat +24 -0
  89. biotite/sequence/align/matrix_data/BLOSUM100.mat +31 -0
  90. biotite/sequence/align/matrix_data/BLOSUM30.mat +31 -0
  91. biotite/sequence/align/matrix_data/BLOSUM35.mat +31 -0
  92. biotite/sequence/align/matrix_data/BLOSUM40.mat +31 -0
  93. biotite/sequence/align/matrix_data/BLOSUM45.mat +31 -0
  94. biotite/sequence/align/matrix_data/BLOSUM50.mat +31 -0
  95. biotite/sequence/align/matrix_data/BLOSUM50_13p.mat +25 -0
  96. biotite/sequence/align/matrix_data/BLOSUM50_14.3.mat +25 -0
  97. biotite/sequence/align/matrix_data/BLOSUM50_5.0.mat +25 -0
  98. biotite/sequence/align/matrix_data/BLOSUM55.mat +31 -0
  99. biotite/sequence/align/matrix_data/BLOSUM60.mat +31 -0
  100. biotite/sequence/align/matrix_data/BLOSUM62.mat +31 -0
  101. biotite/sequence/align/matrix_data/BLOSUM62_13p.mat +25 -0
  102. biotite/sequence/align/matrix_data/BLOSUM62_14.3.mat +25 -0
  103. biotite/sequence/align/matrix_data/BLOSUM62_5.0.mat +25 -0
  104. biotite/sequence/align/matrix_data/BLOSUM65.mat +31 -0
  105. biotite/sequence/align/matrix_data/BLOSUM70.mat +31 -0
  106. biotite/sequence/align/matrix_data/BLOSUM75.mat +31 -0
  107. biotite/sequence/align/matrix_data/BLOSUM80.mat +31 -0
  108. biotite/sequence/align/matrix_data/BLOSUM85.mat +31 -0
  109. biotite/sequence/align/matrix_data/BLOSUM90.mat +31 -0
  110. biotite/sequence/align/matrix_data/BLOSUMN.mat +31 -0
  111. biotite/sequence/align/matrix_data/CorBLOSUM49_5.0.mat +25 -0
  112. biotite/sequence/align/matrix_data/CorBLOSUM57_13p.mat +25 -0
  113. biotite/sequence/align/matrix_data/CorBLOSUM57_14.3.mat +25 -0
  114. biotite/sequence/align/matrix_data/CorBLOSUM61_5.0.mat +25 -0
  115. biotite/sequence/align/matrix_data/CorBLOSUM66_13p.mat +25 -0
  116. biotite/sequence/align/matrix_data/CorBLOSUM67_14.3.mat +25 -0
  117. biotite/sequence/align/matrix_data/DAYHOFF.mat +32 -0
  118. biotite/sequence/align/matrix_data/GONNET.mat +26 -0
  119. biotite/sequence/align/matrix_data/IDENTITY.mat +25 -0
  120. biotite/sequence/align/matrix_data/MATCH.mat +25 -0
  121. biotite/sequence/align/matrix_data/NUC.mat +25 -0
  122. biotite/sequence/align/matrix_data/PAM10.mat +34 -0
  123. biotite/sequence/align/matrix_data/PAM100.mat +34 -0
  124. biotite/sequence/align/matrix_data/PAM110.mat +34 -0
  125. biotite/sequence/align/matrix_data/PAM120.mat +34 -0
  126. biotite/sequence/align/matrix_data/PAM130.mat +34 -0
  127. biotite/sequence/align/matrix_data/PAM140.mat +34 -0
  128. biotite/sequence/align/matrix_data/PAM150.mat +34 -0
  129. biotite/sequence/align/matrix_data/PAM160.mat +34 -0
  130. biotite/sequence/align/matrix_data/PAM170.mat +34 -0
  131. biotite/sequence/align/matrix_data/PAM180.mat +34 -0
  132. biotite/sequence/align/matrix_data/PAM190.mat +34 -0
  133. biotite/sequence/align/matrix_data/PAM20.mat +34 -0
  134. biotite/sequence/align/matrix_data/PAM200.mat +34 -0
  135. biotite/sequence/align/matrix_data/PAM210.mat +34 -0
  136. biotite/sequence/align/matrix_data/PAM220.mat +34 -0
  137. biotite/sequence/align/matrix_data/PAM230.mat +34 -0
  138. biotite/sequence/align/matrix_data/PAM240.mat +34 -0
  139. biotite/sequence/align/matrix_data/PAM250.mat +34 -0
  140. biotite/sequence/align/matrix_data/PAM260.mat +34 -0
  141. biotite/sequence/align/matrix_data/PAM270.mat +34 -0
  142. biotite/sequence/align/matrix_data/PAM280.mat +34 -0
  143. biotite/sequence/align/matrix_data/PAM290.mat +34 -0
  144. biotite/sequence/align/matrix_data/PAM30.mat +34 -0
  145. biotite/sequence/align/matrix_data/PAM300.mat +34 -0
  146. biotite/sequence/align/matrix_data/PAM310.mat +34 -0
  147. biotite/sequence/align/matrix_data/PAM320.mat +34 -0
  148. biotite/sequence/align/matrix_data/PAM330.mat +34 -0
  149. biotite/sequence/align/matrix_data/PAM340.mat +34 -0
  150. biotite/sequence/align/matrix_data/PAM350.mat +34 -0
  151. biotite/sequence/align/matrix_data/PAM360.mat +34 -0
  152. biotite/sequence/align/matrix_data/PAM370.mat +34 -0
  153. biotite/sequence/align/matrix_data/PAM380.mat +34 -0
  154. biotite/sequence/align/matrix_data/PAM390.mat +34 -0
  155. biotite/sequence/align/matrix_data/PAM40.mat +34 -0
  156. biotite/sequence/align/matrix_data/PAM400.mat +34 -0
  157. biotite/sequence/align/matrix_data/PAM410.mat +34 -0
  158. biotite/sequence/align/matrix_data/PAM420.mat +34 -0
  159. biotite/sequence/align/matrix_data/PAM430.mat +34 -0
  160. biotite/sequence/align/matrix_data/PAM440.mat +34 -0
  161. biotite/sequence/align/matrix_data/PAM450.mat +34 -0
  162. biotite/sequence/align/matrix_data/PAM460.mat +34 -0
  163. biotite/sequence/align/matrix_data/PAM470.mat +34 -0
  164. biotite/sequence/align/matrix_data/PAM480.mat +34 -0
  165. biotite/sequence/align/matrix_data/PAM490.mat +34 -0
  166. biotite/sequence/align/matrix_data/PAM50.mat +34 -0
  167. biotite/sequence/align/matrix_data/PAM500.mat +34 -0
  168. biotite/sequence/align/matrix_data/PAM60.mat +34 -0
  169. biotite/sequence/align/matrix_data/PAM70.mat +34 -0
  170. biotite/sequence/align/matrix_data/PAM80.mat +34 -0
  171. biotite/sequence/align/matrix_data/PAM90.mat +34 -0
  172. biotite/sequence/align/matrix_data/PB.license +21 -0
  173. biotite/sequence/align/matrix_data/PB.mat +18 -0
  174. biotite/sequence/align/matrix_data/RBLOSUM52_5.0.mat +25 -0
  175. biotite/sequence/align/matrix_data/RBLOSUM59_13p.mat +25 -0
  176. biotite/sequence/align/matrix_data/RBLOSUM59_14.3.mat +25 -0
  177. biotite/sequence/align/matrix_data/RBLOSUM64_5.0.mat +25 -0
  178. biotite/sequence/align/matrix_data/RBLOSUM69_13p.mat +25 -0
  179. biotite/sequence/align/matrix_data/RBLOSUM69_14.3.mat +25 -0
  180. biotite/sequence/align/multiple.cpython-314-x86_64-linux-gnu.so +0 -0
  181. biotite/sequence/align/multiple.pyx +619 -0
  182. biotite/sequence/align/pairwise.cpython-314-x86_64-linux-gnu.so +0 -0
  183. biotite/sequence/align/pairwise.pyx +585 -0
  184. biotite/sequence/align/permutation.cpython-314-x86_64-linux-gnu.so +0 -0
  185. biotite/sequence/align/permutation.pyx +313 -0
  186. biotite/sequence/align/primes.txt +821 -0
  187. biotite/sequence/align/selector.cpython-314-x86_64-linux-gnu.so +0 -0
  188. biotite/sequence/align/selector.pyx +954 -0
  189. biotite/sequence/align/statistics.py +264 -0
  190. biotite/sequence/align/tracetable.cpython-314-x86_64-linux-gnu.so +0 -0
  191. biotite/sequence/align/tracetable.pxd +64 -0
  192. biotite/sequence/align/tracetable.pyx +370 -0
  193. biotite/sequence/alphabet.py +555 -0
  194. biotite/sequence/annotation.py +836 -0
  195. biotite/sequence/codec.cpython-314-x86_64-linux-gnu.so +0 -0
  196. biotite/sequence/codec.pyx +155 -0
  197. biotite/sequence/codon.py +476 -0
  198. biotite/sequence/codon_tables.txt +202 -0
  199. biotite/sequence/graphics/__init__.py +33 -0
  200. biotite/sequence/graphics/alignment.py +1101 -0
  201. biotite/sequence/graphics/color_schemes/3di_flower.json +48 -0
  202. biotite/sequence/graphics/color_schemes/autumn.json +51 -0
  203. biotite/sequence/graphics/color_schemes/blossom.json +51 -0
  204. biotite/sequence/graphics/color_schemes/clustalx_dna.json +11 -0
  205. biotite/sequence/graphics/color_schemes/clustalx_protein.json +28 -0
  206. biotite/sequence/graphics/color_schemes/flower.json +51 -0
  207. biotite/sequence/graphics/color_schemes/jalview_buried.json +31 -0
  208. biotite/sequence/graphics/color_schemes/jalview_hydrophobicity.json +31 -0
  209. biotite/sequence/graphics/color_schemes/jalview_prop_helix.json +31 -0
  210. biotite/sequence/graphics/color_schemes/jalview_prop_strand.json +31 -0
  211. biotite/sequence/graphics/color_schemes/jalview_prop_turn.json +31 -0
  212. biotite/sequence/graphics/color_schemes/jalview_taylor.json +28 -0
  213. biotite/sequence/graphics/color_schemes/jalview_zappo.json +28 -0
  214. biotite/sequence/graphics/color_schemes/ocean.json +51 -0
  215. biotite/sequence/graphics/color_schemes/pb_flower.json +40 -0
  216. biotite/sequence/graphics/color_schemes/rainbow_dna.json +11 -0
  217. biotite/sequence/graphics/color_schemes/rainbow_protein.json +30 -0
  218. biotite/sequence/graphics/color_schemes/spring.json +51 -0
  219. biotite/sequence/graphics/color_schemes/sunset.json +51 -0
  220. biotite/sequence/graphics/color_schemes/wither.json +51 -0
  221. biotite/sequence/graphics/colorschemes.py +170 -0
  222. biotite/sequence/graphics/dendrogram.py +231 -0
  223. biotite/sequence/graphics/features.py +544 -0
  224. biotite/sequence/graphics/logo.py +102 -0
  225. biotite/sequence/graphics/plasmid.py +712 -0
  226. biotite/sequence/io/__init__.py +12 -0
  227. biotite/sequence/io/fasta/__init__.py +22 -0
  228. biotite/sequence/io/fasta/convert.py +283 -0
  229. biotite/sequence/io/fasta/file.py +265 -0
  230. biotite/sequence/io/fastq/__init__.py +19 -0
  231. biotite/sequence/io/fastq/convert.py +117 -0
  232. biotite/sequence/io/fastq/file.py +507 -0
  233. biotite/sequence/io/genbank/__init__.py +17 -0
  234. biotite/sequence/io/genbank/annotation.py +269 -0
  235. biotite/sequence/io/genbank/file.py +573 -0
  236. biotite/sequence/io/genbank/metadata.py +336 -0
  237. biotite/sequence/io/genbank/sequence.py +173 -0
  238. biotite/sequence/io/general.py +201 -0
  239. biotite/sequence/io/gff/__init__.py +26 -0
  240. biotite/sequence/io/gff/convert.py +128 -0
  241. biotite/sequence/io/gff/file.py +449 -0
  242. biotite/sequence/phylo/__init__.py +36 -0
  243. biotite/sequence/phylo/nj.cpython-314-x86_64-linux-gnu.so +0 -0
  244. biotite/sequence/phylo/nj.pyx +221 -0
  245. biotite/sequence/phylo/tree.cpython-314-x86_64-linux-gnu.so +0 -0
  246. biotite/sequence/phylo/tree.pyx +1169 -0
  247. biotite/sequence/phylo/upgma.cpython-314-x86_64-linux-gnu.so +0 -0
  248. biotite/sequence/phylo/upgma.pyx +164 -0
  249. biotite/sequence/profile.py +561 -0
  250. biotite/sequence/search.py +117 -0
  251. biotite/sequence/seqtypes.py +720 -0
  252. biotite/sequence/sequence.py +373 -0
  253. biotite/setup_ccd.py +197 -0
  254. biotite/structure/__init__.py +135 -0
  255. biotite/structure/alphabet/__init__.py +25 -0
  256. biotite/structure/alphabet/encoder.py +332 -0
  257. biotite/structure/alphabet/encoder_weights_3di.kerasify +0 -0
  258. biotite/structure/alphabet/i3d.py +109 -0
  259. biotite/structure/alphabet/layers.py +86 -0
  260. biotite/structure/alphabet/pb.license +21 -0
  261. biotite/structure/alphabet/pb.py +170 -0
  262. biotite/structure/alphabet/unkerasify.py +128 -0
  263. biotite/structure/atoms.py +1562 -0
  264. biotite/structure/basepairs.py +1403 -0
  265. biotite/structure/bonds.cpython-314-x86_64-linux-gnu.so +0 -0
  266. biotite/structure/bonds.pyx +2036 -0
  267. biotite/structure/box.py +724 -0
  268. biotite/structure/celllist.cpython-314-x86_64-linux-gnu.so +0 -0
  269. biotite/structure/celllist.pyx +864 -0
  270. biotite/structure/chains.py +310 -0
  271. biotite/structure/charges.cpython-314-x86_64-linux-gnu.so +0 -0
  272. biotite/structure/charges.pyx +520 -0
  273. biotite/structure/compare.py +683 -0
  274. biotite/structure/density.py +109 -0
  275. biotite/structure/dotbracket.py +213 -0
  276. biotite/structure/error.py +39 -0
  277. biotite/structure/filter.py +591 -0
  278. biotite/structure/geometry.py +817 -0
  279. biotite/structure/graphics/__init__.py +13 -0
  280. biotite/structure/graphics/atoms.py +243 -0
  281. biotite/structure/graphics/rna.py +298 -0
  282. biotite/structure/hbond.py +425 -0
  283. biotite/structure/info/__init__.py +24 -0
  284. biotite/structure/info/atom_masses.json +121 -0
  285. biotite/structure/info/atoms.py +98 -0
  286. biotite/structure/info/bonds.py +149 -0
  287. biotite/structure/info/ccd.py +200 -0
  288. biotite/structure/info/components.bcif +0 -0
  289. biotite/structure/info/groups.py +128 -0
  290. biotite/structure/info/masses.py +121 -0
  291. biotite/structure/info/misc.py +137 -0
  292. biotite/structure/info/radii.py +267 -0
  293. biotite/structure/info/standardize.py +185 -0
  294. biotite/structure/integrity.py +213 -0
  295. biotite/structure/io/__init__.py +29 -0
  296. biotite/structure/io/dcd/__init__.py +13 -0
  297. biotite/structure/io/dcd/file.py +67 -0
  298. biotite/structure/io/general.py +243 -0
  299. biotite/structure/io/gro/__init__.py +14 -0
  300. biotite/structure/io/gro/file.py +343 -0
  301. biotite/structure/io/mol/__init__.py +20 -0
  302. biotite/structure/io/mol/convert.py +112 -0
  303. biotite/structure/io/mol/ctab.py +420 -0
  304. biotite/structure/io/mol/header.py +120 -0
  305. biotite/structure/io/mol/mol.py +149 -0
  306. biotite/structure/io/mol/sdf.py +940 -0
  307. biotite/structure/io/netcdf/__init__.py +13 -0
  308. biotite/structure/io/netcdf/file.py +64 -0
  309. biotite/structure/io/pdb/__init__.py +20 -0
  310. biotite/structure/io/pdb/convert.py +389 -0
  311. biotite/structure/io/pdb/file.py +1380 -0
  312. biotite/structure/io/pdb/hybrid36.cpython-314-x86_64-linux-gnu.so +0 -0
  313. biotite/structure/io/pdb/hybrid36.pyx +242 -0
  314. biotite/structure/io/pdbqt/__init__.py +15 -0
  315. biotite/structure/io/pdbqt/convert.py +113 -0
  316. biotite/structure/io/pdbqt/file.py +688 -0
  317. biotite/structure/io/pdbx/__init__.py +23 -0
  318. biotite/structure/io/pdbx/bcif.py +674 -0
  319. biotite/structure/io/pdbx/cif.py +1091 -0
  320. biotite/structure/io/pdbx/component.py +251 -0
  321. biotite/structure/io/pdbx/compress.py +362 -0
  322. biotite/structure/io/pdbx/convert.py +2113 -0
  323. biotite/structure/io/pdbx/encoding.cpython-314-x86_64-linux-gnu.so +0 -0
  324. biotite/structure/io/pdbx/encoding.pyx +1078 -0
  325. biotite/structure/io/trajfile.py +696 -0
  326. biotite/structure/io/trr/__init__.py +13 -0
  327. biotite/structure/io/trr/file.py +43 -0
  328. biotite/structure/io/util.py +38 -0
  329. biotite/structure/io/xtc/__init__.py +13 -0
  330. biotite/structure/io/xtc/file.py +43 -0
  331. biotite/structure/mechanics.py +72 -0
  332. biotite/structure/molecules.py +337 -0
  333. biotite/structure/pseudoknots.py +622 -0
  334. biotite/structure/rdf.py +245 -0
  335. biotite/structure/repair.py +302 -0
  336. biotite/structure/residues.py +716 -0
  337. biotite/structure/rings.py +451 -0
  338. biotite/structure/sasa.cpython-314-x86_64-linux-gnu.so +0 -0
  339. biotite/structure/sasa.pyx +322 -0
  340. biotite/structure/segments.py +328 -0
  341. biotite/structure/sequence.py +110 -0
  342. biotite/structure/spacegroups.json +1567 -0
  343. biotite/structure/spacegroups.license +26 -0
  344. biotite/structure/sse.py +306 -0
  345. biotite/structure/superimpose.py +511 -0
  346. biotite/structure/tm.py +581 -0
  347. biotite/structure/transform.py +736 -0
  348. biotite/structure/util.py +160 -0
  349. biotite/version.py +34 -0
  350. biotite/visualize.py +375 -0
  351. biotite-1.5.0.dist-info/METADATA +162 -0
  352. biotite-1.5.0.dist-info/RECORD +354 -0
  353. biotite-1.5.0.dist-info/WHEEL +6 -0
  354. 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