biotite 1.5.0__cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of biotite might be problematic. Click here for more details.

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