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
@@ -0,0 +1,26 @@
1
+ The transformations in 'spacegroups.json' are adapted from
2
+ 'molstar/src/mol-math/geometry/spacegroup/tables.ts' from the Mol* project
3
+ (https://github.com/molstar/molstar) governed by the following license:
4
+
5
+
6
+ The MIT License
7
+
8
+ Copyright (c) 2017 - now, Mol* contributors
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in
18
+ all copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26
+ THE SOFTWARE.
@@ -0,0 +1,306 @@
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 module allows estimation of secondary structure elements in protein
7
+ structures.
8
+ """
9
+
10
+ __name__ = "biotite.structure"
11
+ __author__ = "Patrick Kunzmann"
12
+ __all__ = ["annotate_sse"]
13
+
14
+ import numpy as np
15
+ from biotite.structure.celllist import CellList
16
+ from biotite.structure.filter import filter_amino_acids
17
+ from biotite.structure.geometry import angle, dihedral, distance
18
+ from biotite.structure.integrity import check_res_id_continuity
19
+ from biotite.structure.residues import get_residue_starts
20
+
21
+ _r_helix = (np.deg2rad(89 - 12), np.deg2rad(89 + 12))
22
+ _a_helix = (np.deg2rad(50 - 20), np.deg2rad(50 + 20))
23
+ _d2_helix = ((5.5 - 0.5), (5.5 + 0.5)) # Not used in the algorithm description
24
+ _d3_helix = ((5.3 - 0.5), (5.3 + 0.5))
25
+ _d4_helix = ((6.4 - 0.6), (6.4 + 0.6))
26
+
27
+ _r_strand = (np.deg2rad(124 - 14), np.deg2rad(124 + 14))
28
+ _a_strand = (np.deg2rad(-180), np.deg2rad(-125), np.deg2rad(145), np.deg2rad(180))
29
+ _d2_strand = ((6.7 - 0.6), (6.7 + 0.6))
30
+ _d3_strand = ((9.9 - 0.9), (9.9 + 0.9))
31
+ _d4_strand = ((12.4 - 1.1), (12.4 + 1.1))
32
+
33
+
34
+ def annotate_sse(atom_array):
35
+ r"""
36
+ Calculate the secondary structure elements (SSEs) of a
37
+ peptide chain based on the `P-SEA` algorithm.
38
+ :footcite:`Labesse1997`
39
+
40
+ The annotation is based CA coordinates only, specifically
41
+ distances and dihedral angles.
42
+ Discontinuities between chains are detected by residue ID.
43
+
44
+ Parameters
45
+ ----------
46
+ atom_array : AtomArray
47
+ The atom array to annotate for.
48
+ Non-peptide residues are also allowed and obtain a ``''``
49
+ SSE.
50
+
51
+ Returns
52
+ -------
53
+ sse : ndarray
54
+ An array containing the secondary structure elements,
55
+ where the index corresponds to a residue of `atom_array`
56
+ (see e.g. :func:`get_residues()`).
57
+ ``'a'`` means :math:`{\alpha}`-helix, ``'b'`` means
58
+ :math:`{\beta}`-strand/sheet, ``'c'`` means coil.
59
+ ``''`` indicates that a residue is not an amino acid or it
60
+ comprises no ``CA`` atom.
61
+
62
+ Notes
63
+ -----
64
+ Although this function is based on the original `P-SEA` algorithm,
65
+ there are deviations compared to the official `P-SEA` software in
66
+ some cases.
67
+ Do not rely on getting the exact same results.
68
+
69
+ References
70
+ ----------
71
+
72
+ .. footbibliography::
73
+
74
+ Examples
75
+ --------
76
+
77
+ SSE of PDB 1L2Y:
78
+
79
+ >>> sse = annotate_sse(atom_array)
80
+ >>> print(sse)
81
+ ['c' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'a' 'c' 'c' 'c' 'c' 'c' 'c' 'c' 'c' 'c'
82
+ 'c' 'c']
83
+ """
84
+ residue_starts = get_residue_starts(atom_array)
85
+ # Sort CA coord into the coord array at the respective residue index
86
+ # If a residue has no CA, e.g. because it is not an amino acid,
87
+ # the coordinates for that residue remain NaN
88
+ ca_coord = np.full((len(residue_starts), 3), np.nan, dtype=np.float32)
89
+ ca_indices = np.where(
90
+ filter_amino_acids(atom_array) & (atom_array.atom_name == "CA")
91
+ )[0]
92
+ ca_coord[np.searchsorted(residue_starts, ca_indices, "right") - 1] = (
93
+ atom_array.coord[ca_indices]
94
+ )
95
+
96
+ if len(ca_coord) <= 5:
97
+ # The number of atoms is too small #
98
+ # to measure the distances/angles
99
+ # -> Return an SSE array where each amino acid is 'coil'
100
+ sse = np.full(len(ca_coord), "c", dtype="U1")
101
+ # Residues where coord are NaN do not belong to amino acids
102
+ # (or at least they have no CA)
103
+ sse[np.isnan(ca_coord).any(axis=-1)] = ""
104
+ return sse
105
+
106
+ # Add virtual residues w/o CA coord at chain discontinuity indices
107
+ # This ensures that such discontinuities are recognized for the
108
+ # purpose of geometric measurements
109
+ # -> the distances/angles spanning discontinuities are NaN
110
+ discont_indices = check_res_id_continuity(atom_array)
111
+ discont_res_indices = np.searchsorted(residue_starts, discont_indices, "right") - 1
112
+ ca_coord = np.insert(
113
+ ca_coord,
114
+ discont_res_indices,
115
+ np.full((len(discont_res_indices), 3), np.nan),
116
+ axis=0,
117
+ )
118
+ # Later the SSE for virtual residues are removed again
119
+ # via this mask
120
+ no_virtual_mask = np.ones(len(residue_starts), dtype=bool)
121
+ no_virtual_mask = np.insert(no_virtual_mask, discont_res_indices, False)
122
+
123
+ length = len(ca_coord)
124
+
125
+ # The distances and angles are not defined for the entire interval,
126
+ # therefore the indices do not have the full range
127
+ # Values that are not defined are NaN
128
+ d2i = np.full(length, np.nan)
129
+ d3i = np.full(length, np.nan)
130
+ d4i = np.full(length, np.nan)
131
+ ri = np.full(length, np.nan)
132
+ ai = np.full(length, np.nan)
133
+
134
+ d2i[1 : length - 1] = distance(ca_coord[0 : length - 2], ca_coord[2:length])
135
+ d3i[1 : length - 2] = distance(ca_coord[0 : length - 3], ca_coord[3:length])
136
+ d4i[1 : length - 3] = distance(ca_coord[0 : length - 4], ca_coord[4:length])
137
+ ri[1 : length - 1] = angle(
138
+ ca_coord[0 : length - 2], ca_coord[1 : length - 1], ca_coord[2:length]
139
+ )
140
+ ai[1 : length - 2] = dihedral(
141
+ ca_coord[0 : length - 3],
142
+ ca_coord[1 : length - 2],
143
+ ca_coord[2 : length - 1],
144
+ ca_coord[3 : length - 0],
145
+ )
146
+
147
+ # Find CA that meet criteria for potential helices and strands
148
+ relaxed_helix = ((d3i >= _d3_helix[0]) & (d3i <= _d3_helix[1])) | (
149
+ (ri >= _r_helix[0]) & (ri <= _r_helix[1])
150
+ )
151
+ strict_helix = (
152
+ (d3i >= _d3_helix[0])
153
+ & (d3i <= _d3_helix[1])
154
+ & (d4i >= _d4_helix[0])
155
+ & (d4i <= _d4_helix[1])
156
+ ) | (
157
+ (ri >= _r_helix[0])
158
+ & (ri <= _r_helix[1])
159
+ & (ai >= _a_helix[0])
160
+ & (ai <= _a_helix[1])
161
+ )
162
+
163
+ relaxed_strand = (d3i >= _d3_strand[0]) & (d3i <= _d3_strand[1])
164
+ strict_strand = (
165
+ (d2i >= _d2_strand[0])
166
+ & (d2i <= _d2_strand[1])
167
+ & (d3i >= _d3_strand[0])
168
+ & (d3i <= _d3_strand[1])
169
+ & (d4i >= _d4_strand[0])
170
+ & (d4i <= _d4_strand[1])
171
+ ) | (
172
+ (ri >= _r_strand[0])
173
+ & (ri <= _r_strand[1])
174
+ & (
175
+ # Account for periodic boundary of dihedral angle
176
+ ((ai >= _a_strand[0]) & (ai <= _a_strand[1]))
177
+ | ((ai >= _a_strand[2]) & (ai <= _a_strand[3]))
178
+ )
179
+ )
180
+
181
+ helix_mask = _mask_consecutive(strict_helix, 5)
182
+ helix_mask = _extend_region(helix_mask, relaxed_helix)
183
+
184
+ strand_mask = _mask_consecutive(strict_strand, 4)
185
+ short_strand_mask = _mask_regions_with_contacts(
186
+ ca_coord,
187
+ _mask_consecutive(strict_strand, 3),
188
+ min_contacts=5,
189
+ min_distance=4.2,
190
+ max_distance=5.2,
191
+ )
192
+ strand_mask = _extend_region(strand_mask | short_strand_mask, relaxed_strand)
193
+
194
+ sse = np.full(length, "c", dtype="U1")
195
+ sse[helix_mask] = "a"
196
+ sse[strand_mask] = "b"
197
+ # Residues where coord are NaN do not belong to amino acids
198
+ # (or at least they have no CA)
199
+ sse[np.isnan(ca_coord).any(axis=-1)] = ""
200
+ # Remove SSE for virtual atoms and return
201
+ return sse[no_virtual_mask]
202
+
203
+
204
+ def _mask_consecutive(mask, number):
205
+ """
206
+ Find all regions in a mask with `number` consecutive ``True``
207
+ values.
208
+ Return a mask that is ``True`` for all indices in such a region and
209
+ ``False`` otherwise.
210
+ """
211
+ # An element is in a consecutive region,
212
+ # if it and the following `number-1` elements are True
213
+ # The elements `mask[-(number-1):]` cannot have the sufficient count
214
+ # by this definition, as they are at the end of the array
215
+ counts = np.zeros(len(mask) - (number - 1), dtype=int)
216
+ for i in range(number):
217
+ counts[mask[i : i + len(counts)]] += 1
218
+ consecutive_seed = counts == number
219
+
220
+ # Not only that element, but also the
221
+ # following `number-1` elements are in a consecutive region
222
+ consecutive_mask = np.zeros(len(mask), dtype=bool)
223
+ for i in range(number):
224
+ consecutive_mask[i : i + len(consecutive_seed)] |= consecutive_seed
225
+
226
+ return consecutive_mask
227
+
228
+
229
+ def _extend_region(base_condition_mask, extension_condition_mask):
230
+ """
231
+ Extend a ``True`` region in `base_condition_mask` by at maximum of
232
+ one element at each side, if such element fulfills
233
+ `extension_condition_mask.`
234
+ """
235
+ # This mask always marks the start
236
+ # of either a 'True' or 'False' region
237
+ # Prepend absent region to the start to capture the event,
238
+ # that the first element is already the start of a region
239
+ region_change_mask = np.diff(np.append([False], base_condition_mask))
240
+
241
+ # These masks point to the first `False` element
242
+ # left and right of a 'True' region
243
+ # The left end is the element before the first element of a 'True' region
244
+ left_end_mask = region_change_mask & base_condition_mask
245
+ # Therefore the mask needs to be shifted to the left
246
+ left_end_mask = np.append(left_end_mask[1:], [False])
247
+ # The right end is first element of a 'False' region
248
+ right_end_mask = region_change_mask & ~base_condition_mask
249
+
250
+ # The 'base_condition_mask' gets additional 'True' elements
251
+ # at left or right ends, which meet the extension criterion
252
+ return base_condition_mask | (
253
+ (left_end_mask | right_end_mask) & extension_condition_mask
254
+ )
255
+
256
+
257
+ def _mask_regions_with_contacts(
258
+ coord, candidate_mask, min_contacts, min_distance, max_distance
259
+ ):
260
+ """
261
+ Mask regions of `candidate_mask` that have at least `min_contacts`
262
+ contacts with `coord` in the range `min_distance` to `max_distance`.
263
+ """
264
+ potential_contact_coord = coord[~np.isnan(coord).any(axis=-1)]
265
+ if len(potential_contact_coord) == 0:
266
+ # No potential contacts -> no contacts
267
+ # -> no residue can satisfy 'min_contacts'
268
+ return np.zeros(len(candidate_mask), dtype=bool)
269
+
270
+ cell_list = CellList(potential_contact_coord, max_distance)
271
+ # For each candidate position,
272
+ # get all contacts within maximum distance
273
+ all_within_max_dist_indices = cell_list.get_atoms(
274
+ coord[candidate_mask], max_distance
275
+ )
276
+
277
+ contacts = np.zeros(len(coord), dtype=int)
278
+ for i, atom_index in enumerate(np.where(candidate_mask)[0]):
279
+ within_max_dist_indices = all_within_max_dist_indices[i]
280
+ # Remove padding values
281
+ within_max_dist_indices = within_max_dist_indices[within_max_dist_indices != -1]
282
+ # Now count all contacts within maximum distance
283
+ # that also satisfy the minimum distance
284
+ contacts[atom_index] = np.count_nonzero(
285
+ distance(
286
+ coord[atom_index], potential_contact_coord[within_max_dist_indices]
287
+ )
288
+ > min_distance
289
+ )
290
+
291
+ # Count the number of contacts per region
292
+ # These indices mark the start of either a 'True' or 'False' region
293
+ # Prepend absent region to the start to capture the event,
294
+ # that the first element is already the start of a region
295
+ region_change_indices = np.where(np.diff(np.append([False], candidate_mask)))[0]
296
+ # Add exclusive stop
297
+ region_change_indices = np.append(region_change_indices, [len(coord)])
298
+ output_mask = np.zeros(len(candidate_mask), dtype=bool)
299
+ for i in range(len(region_change_indices) - 1):
300
+ start = region_change_indices[i]
301
+ stop = region_change_indices[i + 1]
302
+ total_contacts = np.sum(contacts[start:stop])
303
+ if total_contacts >= min_contacts:
304
+ output_mask[start:stop] = True
305
+
306
+ return output_mask