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,425 @@
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 provides functions for hydrogen bonding calculation.
7
+ """
8
+
9
+ __name__ = "biotite.structure"
10
+ __author__ = "Daniel Bauer, Patrick Kunzmann"
11
+ __all__ = ["hbond", "hbond_frequency"]
12
+
13
+ import warnings
14
+ import numpy as np
15
+ from biotite.structure.atoms import AtomArrayStack, stack
16
+ from biotite.structure.celllist import CellList
17
+ from biotite.structure.geometry import angle, distance
18
+
19
+
20
+ def hbond(
21
+ atoms,
22
+ selection1=None,
23
+ selection2=None,
24
+ selection1_type="both",
25
+ cutoff_dist=2.5,
26
+ cutoff_angle=120,
27
+ donor_elements=("O", "N", "S"),
28
+ acceptor_elements=("O", "N", "S"),
29
+ periodic=False,
30
+ ):
31
+ r"""
32
+ Find hydrogen bonds in a structure using the Baker-Hubbard
33
+ algorithm. :footcite:`Baker1984`
34
+
35
+ This function identifies hydrogen bonds based on the bond angle
36
+ :math:`\theta` and the bond distance :math:`d_{H,A}`.
37
+ The default criteria is :math:`\theta > 120^{\circ}`
38
+ and :math:`d_{H,A} \le 2.5 \mathring{A}`.
39
+ Consequently, the given structure must contain hydrogen atoms.
40
+ Otherwise, no hydrogen bonds will be found.
41
+
42
+ Parameters
43
+ ----------
44
+ atoms : AtomArray or AtomArrayStack
45
+ The atoms to find hydrogen bonds in.
46
+ selection1, selection2 : ndarray, optional
47
+ Boolean mask for atoms to limit the hydrogen bond search to
48
+ specific sections of the model. The shape must match the
49
+ shape of the `atoms` argument. If None is given, the whole atoms
50
+ stack is used instead.
51
+ selection1_type : {'acceptor', 'donor', 'both'}, optional
52
+ Determines the type of `selection1`.
53
+ The type of `selection2` is chosen accordingly
54
+ ('both' or the opposite).
55
+ cutoff_dist : float, optional
56
+ The maximal distance between the hydrogen and acceptor to be
57
+ considered a hydrogen bond.
58
+ cutoff_angle : float, optional
59
+ The angle cutoff in degree between Donor-H..Acceptor to be
60
+ considered a hydrogen bond.
61
+ donor_elements, acceptor_elements : tuple of str
62
+ Elements to be considered as possible donors or acceptors.
63
+ periodic : bool, optional
64
+ If true, hydrogen bonds can also be detected in periodic
65
+ boundary conditions.
66
+ The `box` attribute of `atoms` is required in this case.
67
+
68
+ Returns
69
+ -------
70
+ triplets : ndarray, dtype=int, shape=(n,3)
71
+ *n x 3* matrix containing the indices of every Donor-H..Acceptor
72
+ interaction that is available in any of the models.
73
+ *n* is the number of found interactions.
74
+ The three matrix columns are *D_index*, *H_index*, *A_index*.
75
+ If only one model (`AtomArray`) is given, `triplets` contains
76
+ all of its hydrogen bonds.
77
+ mask : ndarry, dtype=bool, shape=(m,n)
78
+ *m x n* matrix that shows if an interaction with index *n* in
79
+ `triplets` is present in the model *m* of the input `atoms`.
80
+ Only returned if `atoms` is an :class:`AtomArrayStack`.
81
+
82
+ See Also
83
+ --------
84
+ hbond_frequency : Compute the frequency of each bond over the models.
85
+
86
+ Notes
87
+ -----
88
+ The result of this function may include false positives:
89
+ Only the chemical elements and the bond geometry is checked.
90
+ However, there are some cases where a hydrogen bond is still not
91
+ reasonable.
92
+ For example, a nitrogen atom with positive charge could be
93
+ considered as acceptor atom by this method, although this does
94
+ make sense from a chemical perspective.
95
+
96
+ References
97
+ ----------
98
+
99
+ .. footbibliography::
100
+
101
+ Examples
102
+ --------
103
+ Calculate the total number of hydrogen bonds found in each model:
104
+
105
+ >>> triplets, mask = hbond(atom_array_stack)
106
+ >>> hbonds_per_model = np.count_nonzero(mask, axis=1)
107
+ >>> print(hbonds_per_model)
108
+ [14 14 14 12 11 12 9 13 9 14 13 13 14 11 11 12 11 14 14 13 14 13 15 17
109
+ 14 12 15 12 12 13 13 13 12 12 11 14 10 11]
110
+
111
+ Get hydrogen bond donors of third model:
112
+
113
+ >>> # Third model -> index 2
114
+ >>> triplets = triplets[mask[2,:]]
115
+ >>> # First column contains donors
116
+ >>> print(atom_array_stack[2, triplets[:,0]])
117
+ A 5 GLN N N -5.009 -0.575 -1.365
118
+ A 6 TRP N N -2.154 -0.497 -1.588
119
+ A 7 LEU N N -1.520 -1.904 0.893
120
+ A 8 LYS N N -2.716 -4.413 0.176
121
+ A 8 LYS NZ N -6.352 -4.311 -4.482
122
+ A 9 ASP N N -0.694 -5.301 -1.644
123
+ A 11 GLY N N 2.142 -4.244 1.916
124
+ A 10 GLY N N 1.135 -6.232 0.250
125
+ A 14 SER OG O 4.689 -5.759 -2.390
126
+ A 13 SER N N 6.424 -5.220 3.257
127
+ A 14 SER N N 6.424 -5.506 0.464
128
+ A 15 GLY N N 8.320 -3.632 -0.318
129
+ A 16 ARG N N 8.043 -1.206 -1.866
130
+ A 6 TRP NE1 N 3.420 0.332 -0.121
131
+ """
132
+ if not (atoms.element == "H").any():
133
+ warnings.warn(
134
+ "Input structure does not contain hydrogen atoms, "
135
+ "hence no hydrogen bonds can be identified"
136
+ )
137
+
138
+ # Create AtomArrayStack from AtomArray
139
+ if not isinstance(atoms, AtomArrayStack):
140
+ atoms = stack([atoms])
141
+ single_model = True
142
+ else:
143
+ single_model = False
144
+
145
+ if periodic:
146
+ box = atoms.box
147
+ else:
148
+ box = None
149
+
150
+ # Mask for donor/acceptor elements
151
+ donor_element_mask = np.isin(atoms.element, donor_elements)
152
+ acceptor_element_mask = np.isin(atoms.element, acceptor_elements)
153
+
154
+ if selection1 is None:
155
+ selection1 = np.ones(atoms.array_length(), dtype=bool)
156
+ if selection2 is None:
157
+ selection2 = np.ones(atoms.array_length(), dtype=bool)
158
+
159
+ if selection1_type == "both":
160
+ # The two selections are separated into three selections:
161
+ # the original ones without the overlaping part
162
+ # and one containing the overlap
163
+ # This prevents redundant triplets and unnecessary computation
164
+ overlap_selection = selection1 & selection2
165
+ # Original selections without overlaping part
166
+ exclusive_selection1 = selection1 & (~overlap_selection)
167
+ exclusive_selection2 = selection2 & (~overlap_selection)
168
+
169
+ # Put selections to list for cleaner iteration
170
+ selections = [exclusive_selection1, exclusive_selection2, overlap_selection]
171
+ selection_combinations = [
172
+ # (0,0), is not included, would be same selection
173
+ # as donor and acceptor simultaneously
174
+ (0, 1),
175
+ (0, 2),
176
+ (1, 0),
177
+ # (1,1), # same reason above
178
+ (1, 2),
179
+ (2, 0),
180
+ (2, 1),
181
+ (2, 2), # overlaping part, combination is necessary
182
+ ]
183
+
184
+ all_comb_triplets = []
185
+ all_comb_mask = []
186
+ for selection_index1, selection_index2 in selection_combinations:
187
+ donor_mask = selections[selection_index1]
188
+ acceptor_mask = selections[selection_index2]
189
+ if (
190
+ np.count_nonzero(donor_mask) != 0
191
+ and np.count_nonzero(acceptor_mask) != 0
192
+ ):
193
+ # Calculate triplets and mask
194
+ triplets, mask = _hbond(
195
+ atoms,
196
+ donor_mask,
197
+ acceptor_mask,
198
+ donor_element_mask,
199
+ acceptor_element_mask,
200
+ cutoff_dist,
201
+ cutoff_angle,
202
+ box,
203
+ )
204
+ all_comb_triplets.append(triplets)
205
+ all_comb_mask.append(mask)
206
+ # Merge results from all combinations
207
+ triplets = np.concatenate(all_comb_triplets, axis=0)
208
+ mask = np.concatenate(all_comb_mask, axis=1)
209
+
210
+ elif selection1_type == "donor":
211
+ triplets, mask = _hbond(
212
+ atoms,
213
+ selection1,
214
+ selection2,
215
+ donor_element_mask,
216
+ acceptor_element_mask,
217
+ cutoff_dist,
218
+ cutoff_angle,
219
+ box,
220
+ )
221
+
222
+ elif selection1_type == "acceptor":
223
+ triplets, mask = _hbond(
224
+ atoms,
225
+ selection2,
226
+ selection1,
227
+ donor_element_mask,
228
+ acceptor_element_mask,
229
+ cutoff_dist,
230
+ cutoff_angle,
231
+ box,
232
+ )
233
+
234
+ else:
235
+ raise ValueError(f"Unkown selection type '{selection1_type}'")
236
+
237
+ if single_model:
238
+ # For a atom array (not stack),
239
+ # hbond_mask contains only 'True' values,
240
+ # since all interaction are in the one model
241
+ # -> Simply return triplets without hbond_mask
242
+ return triplets
243
+ else:
244
+ return triplets, mask
245
+
246
+
247
+ def _hbond(
248
+ atoms,
249
+ donor_mask,
250
+ acceptor_mask,
251
+ donor_element_mask,
252
+ acceptor_element_mask,
253
+ cutoff_dist,
254
+ cutoff_angle,
255
+ box,
256
+ ):
257
+ # Filter donor/acceptor elements
258
+ donor_mask &= donor_element_mask
259
+ acceptor_mask &= acceptor_element_mask
260
+
261
+ first_model_box = box[0] if box is not None else None
262
+ if atoms.bonds is not None:
263
+ donor_h_mask, associated_donor_indices = _get_bonded_h(
264
+ atoms[0], donor_mask, atoms.bonds
265
+ )
266
+ else:
267
+ warnings.warn(
268
+ "Input structure has no associated 'BondList', "
269
+ "Hydrogen atoms bonded to donors are detected by distance"
270
+ )
271
+ donor_h_mask, associated_donor_indices = _get_bonded_h_via_distance(
272
+ atoms[0], donor_mask, first_model_box
273
+ )
274
+ donor_h_i = np.where(donor_h_mask)[0]
275
+ acceptor_i = np.where(acceptor_mask)[0]
276
+ if len(donor_h_i) == 0 or len(acceptor_i) == 0:
277
+ # Return empty triplets and mask
278
+ return (
279
+ np.zeros((0, 3), dtype=int),
280
+ np.zeros((atoms.stack_depth(), 0), dtype=bool),
281
+ )
282
+
283
+ # Narrow the amount of possible acceptor to donor-H connections
284
+ # down via the distance cutoff parameter using a cell list
285
+ # Save in acceptor-to-hydrogen matrix
286
+ # (true when distance smaller than cutoff)
287
+ coord = atoms.coord
288
+ possible_bonds = np.zeros((len(acceptor_i), len(donor_h_i)), dtype=bool)
289
+ periodic = False if box is None else True
290
+ for model_i in range(atoms.stack_depth()):
291
+ donor_h_coord = coord[model_i, donor_h_mask]
292
+ acceptor_coord = coord[model_i, acceptor_mask]
293
+ box_for_model = box[model_i] if box is not None else None
294
+ cell_list = CellList(
295
+ donor_h_coord, cell_size=cutoff_dist, periodic=periodic, box=box_for_model
296
+ )
297
+ possible_bonds |= cell_list.get_atoms_in_cells(acceptor_coord, as_mask=True)
298
+ possible_bonds_i = np.where(possible_bonds)
299
+ # Narrow down
300
+ acceptor_i = acceptor_i[possible_bonds_i[0]]
301
+ donor_h_i = donor_h_i[possible_bonds_i[1]]
302
+
303
+ # Build D-H..A triplets
304
+ donor_i = associated_donor_indices[donor_h_i]
305
+ triplets = np.stack((donor_i, donor_h_i, acceptor_i), axis=1)
306
+ # Remove entries where donor and acceptor are the same
307
+ triplets = triplets[donor_i != acceptor_i]
308
+
309
+ hbond_mask = _is_hbond(
310
+ coord[:, triplets[:, 0]], # donors
311
+ coord[:, triplets[:, 1]], # donor hydrogens
312
+ coord[:, triplets[:, 2]], # acceptors
313
+ box,
314
+ cutoff_dist=cutoff_dist,
315
+ cutoff_angle=cutoff_angle,
316
+ )
317
+
318
+ # Reduce output to contain only triplets counted at least once
319
+ is_counted = hbond_mask.any(axis=0)
320
+ triplets = triplets[is_counted]
321
+ hbond_mask = hbond_mask[:, is_counted]
322
+
323
+ return triplets, hbond_mask
324
+
325
+
326
+ def _get_bonded_h(array, donor_mask, bonds):
327
+ """
328
+ Helper function to find indices of associated hydrogens in atoms for
329
+ all donors in atoms[donor_mask].
330
+ A `BondsList` is used for detecting bonded hydrogen atoms.
331
+ """
332
+ hydrogen_mask = array.element == "H"
333
+
334
+ donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
335
+ associated_donor_indices = np.full(len(array), -1, dtype=int)
336
+
337
+ all_bond_indices, _ = bonds.get_all_bonds()
338
+ donor_indices = np.where(donor_mask)[0]
339
+
340
+ for donor_i in donor_indices:
341
+ bonded_indices = all_bond_indices[donor_i]
342
+ # Remove padding values
343
+ bonded_indices = bonded_indices[bonded_indices != -1]
344
+ # Filter hydrogen atoms
345
+ bonded_indices = bonded_indices[hydrogen_mask[bonded_indices]]
346
+ donor_hydrogen_mask[bonded_indices] = True
347
+ associated_donor_indices[bonded_indices] = donor_i
348
+
349
+ return donor_hydrogen_mask, associated_donor_indices
350
+
351
+
352
+ def _get_bonded_h_via_distance(array, donor_mask, box):
353
+ """
354
+ Helper function to find indices of associated hydrogens in atoms for
355
+ all donors in atoms[donor_mask].
356
+ The criterium is that the hydrogen must be in the same residue and
357
+ the distance must be smaller than the cutoff.
358
+ """
359
+ CUTOFF = 1.5
360
+
361
+ coord = array.coord
362
+ res_id = array.res_id
363
+ hydrogen_mask = array.element == "H"
364
+
365
+ donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
366
+ associated_donor_indices = np.full(len(array), -1, dtype=int)
367
+
368
+ donor_indices = np.where(donor_mask)[0]
369
+ for donor_i in donor_indices:
370
+ candidate_mask = hydrogen_mask & (res_id == res_id[donor_i])
371
+ distances = distance(coord[donor_i], coord[candidate_mask], box=box)
372
+ donor_h_indices = np.where(candidate_mask)[0][distances <= CUTOFF]
373
+ for i in donor_h_indices:
374
+ associated_donor_indices[i] = donor_i
375
+ donor_hydrogen_mask[i] = True
376
+
377
+ return donor_hydrogen_mask, associated_donor_indices
378
+
379
+
380
+ def _is_hbond(donor, donor_h, acceptor, box, cutoff_dist, cutoff_angle):
381
+ """
382
+ Filter triplets that meet distance and angle condition.
383
+ """
384
+ cutoff_angle_rad = np.deg2rad(cutoff_angle)
385
+ theta = angle(donor, donor_h, acceptor, box=box)
386
+ dist = distance(donor_h, acceptor, box=box)
387
+ return (theta > cutoff_angle_rad) & (dist <= cutoff_dist)
388
+
389
+
390
+ def hbond_frequency(mask):
391
+ """
392
+ Get the relative frequency of each hydrogen bond in a multi-model
393
+ structure.
394
+
395
+ The frequency is the amount of models, where the respective bond
396
+ exists divided by the total amount of models.
397
+
398
+ Parameters
399
+ ----------
400
+ mask : ndarray, dtype=bool, shape=(m,n)
401
+ Input mask obtained from `hbond` function.
402
+
403
+ Returns
404
+ -------
405
+ ndarray, dtype=Float
406
+ For each individual interaction *n* of the mask, returns the
407
+ percentage of models *m*, in which this hydrogen bond is
408
+ present.
409
+
410
+ See Also
411
+ --------
412
+ hbond : Returns the mask that can be input into this function.
413
+
414
+ Examples
415
+ --------
416
+
417
+ >>> triplets, mask = hbond(atom_array_stack)
418
+ >>> freq = hbond_frequency(mask)
419
+ >>> print(freq)
420
+ [0.263 0.289 0.105 0.105 0.237 0.026 0.053 0.395 1.000 1.000 1.000 0.026
421
+ 0.421 0.026 0.026 0.316 0.816 0.026 0.921 0.026 0.342 0.026 0.105 0.026
422
+ 0.132 0.053 0.026 0.158 0.026 0.868 0.211 0.026 0.921 0.316 0.079 0.237
423
+ 0.105 0.421 0.079 0.026 1.000 0.053 0.132 0.026 0.184]
424
+ """
425
+ return mask.sum(axis=0) / len(mask)
@@ -0,0 +1,24 @@
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
+ A subpackage for obtaining all kinds of chemical information about atoms
7
+ and residues, including masses, radii, bonds, etc.
8
+
9
+ Most information is extracted from the *Chemical Component Dictionary*
10
+ of the
11
+ `wwPDB <ftp://ftp.wwpdb.org/pub/pdb/data/monomers/components.cif>`_.
12
+ """
13
+
14
+ __name__ = "biotite.structure.info"
15
+ __author__ = "Patrick Kunzmann, Tom David Müller"
16
+
17
+ from .atoms import *
18
+ from .bonds import *
19
+ from .ccd import *
20
+ from .groups import *
21
+ from .masses import *
22
+ from .misc import *
23
+ from .radii import *
24
+ from .standardize import *
@@ -0,0 +1,121 @@
1
+ {
2
+ "H" : 1.008,
3
+ "D" : 2.014,
4
+ "HE" : 4.002,
5
+ "LI" : 6.940,
6
+ "BE" : 9.012,
7
+ "B" : 10.810,
8
+ "C" : 12.011,
9
+ "N" : 14.007,
10
+ "O" : 15.999,
11
+ "F" : 18.998,
12
+ "NE" : 20.180,
13
+ "NA" : 22.989,
14
+ "MG" : 24.305,
15
+ "AL" : 26.981,
16
+ "SI" : 28.085,
17
+ "P" : 30.973,
18
+ "S" : 32.060,
19
+ "CL" : 35.450,
20
+ "AR" : 39.948,
21
+ "K" : 39.098,
22
+ "CA" : 40.078,
23
+ "SC" : 44.955,
24
+ "TI" : 47.867,
25
+ "V" : 50.941,
26
+ "CR" : 51.996,
27
+ "MN" : 54.938,
28
+ "FE" : 55.845,
29
+ "CO" : 58.933,
30
+ "NI" : 58.693,
31
+ "CU" : 63.546,
32
+ "ZN" : 65.380,
33
+ "GA" : 69.723,
34
+ "GE" : 72.630,
35
+ "AS" : 74.921,
36
+ "SE" : 78.971,
37
+ "BR" : 79.904,
38
+ "KR" : 83.798,
39
+ "RB" : 85.468,
40
+ "SR" : 87.620,
41
+ "Y" : 88.905,
42
+ "ZR" : 91.224,
43
+ "NB" : 92.906,
44
+ "MO" : 95.950,
45
+ "TC" : 97.000,
46
+ "RU" : 101.070,
47
+ "RH" : 102.905,
48
+ "PD" : 106.420,
49
+ "AG" : 107.868,
50
+ "CD" : 112.414,
51
+ "IN" : 114.818,
52
+ "SN" : 118.710,
53
+ "SB" : 121.760,
54
+ "TE" : 127.600,
55
+ "I" : 126.904,
56
+ "XE" : 131.293,
57
+ "CS" : 132.905,
58
+ "BA" : 137.327,
59
+ "LA" : 138.905,
60
+ "CE" : 140.116,
61
+ "PR" : 140.907,
62
+ "ND" : 144.242,
63
+ "PM" : 145.000,
64
+ "SM" : 150.360,
65
+ "EU" : 151.964,
66
+ "GD" : 157.250,
67
+ "TB" : 158.925,
68
+ "DY" : 162.500,
69
+ "HO" : 164.930,
70
+ "ER" : 167.259,
71
+ "TM" : 168.934,
72
+ "YB" : 173.045,
73
+ "LU" : 174.967,
74
+ "HF" : 178.490,
75
+ "TA" : 180.947,
76
+ "W" : 183.840,
77
+ "RE" : 186.207,
78
+ "OS" : 190.230,
79
+ "IR" : 192.217,
80
+ "PT" : 195.084,
81
+ "AU" : 196.966,
82
+ "HG" : 200.592,
83
+ "TL" : 204.380,
84
+ "PB" : 207.200,
85
+ "BI" : 208.980,
86
+ "PO" : 209.000,
87
+ "AT" : 210.000,
88
+ "RN" : 222.000,
89
+ "FR" : 223.000,
90
+ "RA" : 226.000,
91
+ "AC" : 227.000,
92
+ "TH" : 232.038,
93
+ "PA" : 231.035,
94
+ "U" : 238.028,
95
+ "NP" : 237.000,
96
+ "PU" : 244.000,
97
+ "AM" : 243.000,
98
+ "CM" : 247.000,
99
+ "BK" : 247.000,
100
+ "CF" : 251.000,
101
+ "ES" : 252.000,
102
+ "FM" : 257.000,
103
+ "MD" : 258.000,
104
+ "NO" : 259.000,
105
+ "LR" : 262.000,
106
+ "RF" : 267.000,
107
+ "DB" : 270.000,
108
+ "SG" : 269.000,
109
+ "BH" : 270.000,
110
+ "HS" : 270.000,
111
+ "MT" : 278.000,
112
+ "DS" : 281.000,
113
+ "RG" : 281.000,
114
+ "CN" : 285.000,
115
+ "NH" : 286.000,
116
+ "FL" : 289.000,
117
+ "MC" : 289.000,
118
+ "LV" : 293.000,
119
+ "TS" : 293.000,
120
+ "OG" : 294.000
121
+ }
@@ -0,0 +1,98 @@
1
+ # This source code is part of the Biotite package and is distributed
2
+ # under the 3-Clause BSD License. Please see 'LICENSE.rst' for further
3
+ # information.
4
+
5
+ __name__ = "biotite.structure.info"
6
+ __author__ = "Patrick Kunzmann"
7
+ __all__ = ["residue"]
8
+
9
+ import functools
10
+ from biotite.structure.info.ccd import get_ccd
11
+
12
+ # fmt: off
13
+ NON_HETERO_RESIDUES = set([
14
+ "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS",
15
+ "ILE", "LEU", "LYS", "MET", "PHE", "PRO", "PYL", "SER", "THR",
16
+ "TRP", "TYR", "VAL", "SEC",
17
+ "A", "DA", "G", "DG", "C", "DC", "U", "DT",
18
+ ])
19
+ # fmt: on
20
+
21
+
22
+ def residue(res_name, allow_missing_coord=False):
23
+ """
24
+ Get an atom array, representing the residue with the given name.
25
+
26
+ This atom array includes proper values for the ``residue_name``,
27
+ ``hetero``, ``atom_name``, ``element`` and ``charge`` annotation
28
+ arrays and bonds and coordinates.
29
+
30
+ Parameters
31
+ ----------
32
+ res_name : str
33
+ The up to 3-letter name of the residue.
34
+ allow_missing_coord : bool, optional
35
+ Whether to allow missing coordinate values in the residue.
36
+ If ``True``, these will be represented as ``nan`` values.
37
+ If ``False``, a ``ValueError`` is raised when missing coordinates
38
+ are encountered.
39
+
40
+ Returns
41
+ -------
42
+ atom_array : AtomArray
43
+ The atom array described by `res_name`.
44
+
45
+ Examples
46
+ --------
47
+
48
+ >>> alanine = residue("ALA")
49
+ >>> # Atoms and geometry
50
+ >>> print(alanine)
51
+ 0 ALA N N -0.966 0.493 1.500
52
+ 0 ALA CA C 0.257 0.418 0.692
53
+ 0 ALA C C -0.094 0.017 -0.716
54
+ 0 ALA O O -1.056 -0.682 -0.923
55
+ 0 ALA CB C 1.204 -0.620 1.296
56
+ 0 ALA OXT O 0.661 0.439 -1.742
57
+ 0 ALA H H -1.383 -0.425 1.482
58
+ 0 ALA H2 H -0.676 0.661 2.452
59
+ 0 ALA HA H 0.746 1.392 0.682
60
+ 0 ALA HB1 H 1.459 -0.330 2.316
61
+ 0 ALA HB2 H 0.715 -1.594 1.307
62
+ 0 ALA HB3 H 2.113 -0.676 0.697
63
+ 0 ALA HXT H 0.435 0.182 -2.647
64
+ >>> # Bonds
65
+ >>> print(alanine.atom_name[alanine.bonds.as_array()[:,:2]])
66
+ [['N' 'CA']
67
+ ['N' 'H']
68
+ ['N' 'H2']
69
+ ['CA' 'C']
70
+ ['CA' 'CB']
71
+ ['CA' 'HA']
72
+ ['C' 'O']
73
+ ['C' 'OXT']
74
+ ['CB' 'HB1']
75
+ ['CB' 'HB2']
76
+ ['CB' 'HB3']
77
+ ['OXT' 'HXT']]
78
+ """
79
+ # Use a cache internally, but always return a copy,
80
+ # as the returned AtomArray is mutable
81
+ return _residue(res_name, allow_missing_coord).copy()
82
+
83
+
84
+ @functools.lru_cache(maxsize=100)
85
+ def _residue(res_name, allow_missing_coord=False):
86
+ # Avoid circular import
87
+ from biotite.structure.io.pdbx import get_component
88
+
89
+ try:
90
+ component = get_component(
91
+ get_ccd(),
92
+ res_name=res_name,
93
+ allow_missing_coord=allow_missing_coord,
94
+ )
95
+ except KeyError:
96
+ raise KeyError(f"No atom information found for residue '{res_name}' in CCD")
97
+ component.hetero[:] = res_name not in NON_HETERO_RESIDUES
98
+ return component