biotite 1.6.0__cp314-cp314-win_amd64.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.
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 +426 -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 +202 -0
  35. biotite/database/entrez/__init__.py +15 -0
  36. biotite/database/entrez/check.py +66 -0
  37. biotite/database/entrez/dbnames.py +101 -0
  38. biotite/database/entrez/download.py +224 -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 +259 -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 +191 -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 +127 -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 +491 -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 +763 -0
  73. biotite/sequence/align/banded.cp314-win_amd64.pyd +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.cp314-win_amd64.pyd +0 -0
  78. biotite/sequence/align/kmeralphabet.pyx +595 -0
  79. biotite/sequence/align/kmersimilarity.cp314-win_amd64.pyd +0 -0
  80. biotite/sequence/align/kmersimilarity.pyx +233 -0
  81. biotite/sequence/align/kmertable.cp314-win_amd64.pyd +0 -0
  82. biotite/sequence/align/kmertable.pyx +3411 -0
  83. biotite/sequence/align/localgapped.cp314-win_amd64.pyd +0 -0
  84. biotite/sequence/align/localgapped.pyx +892 -0
  85. biotite/sequence/align/localungapped.cp314-win_amd64.pyd +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.cp314-win_amd64.pyd +0 -0
  181. biotite/sequence/align/multiple.pyx +619 -0
  182. biotite/sequence/align/pairwise.cp314-win_amd64.pyd +0 -0
  183. biotite/sequence/align/pairwise.pyx +585 -0
  184. biotite/sequence/align/permutation.cp314-win_amd64.pyd +0 -0
  185. biotite/sequence/align/permutation.pyx +313 -0
  186. biotite/sequence/align/primes.txt +821 -0
  187. biotite/sequence/align/selector.cp314-win_amd64.pyd +0 -0
  188. biotite/sequence/align/selector.pyx +954 -0
  189. biotite/sequence/align/statistics.py +264 -0
  190. biotite/sequence/align/tracetable.cp314-win_amd64.pyd +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.cp314-win_amd64.pyd +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 +462 -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.cp314-win_amd64.pyd +0 -0
  244. biotite/sequence/phylo/nj.pyx +221 -0
  245. biotite/sequence/phylo/tree.cp314-win_amd64.pyd +0 -0
  246. biotite/sequence/phylo/tree.pyx +1169 -0
  247. biotite/sequence/phylo/upgma.cp314-win_amd64.pyd +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 +1596 -0
  264. biotite/structure/basepairs.py +1403 -0
  265. biotite/structure/bonds.cp314-win_amd64.pyd +0 -0
  266. biotite/structure/bonds.pyx +2036 -0
  267. biotite/structure/box.py +724 -0
  268. biotite/structure/celllist.cp314-win_amd64.pyd +0 -0
  269. biotite/structure/celllist.pyx +864 -0
  270. biotite/structure/chains.py +310 -0
  271. biotite/structure/charges.cp314-win_amd64.pyd +0 -0
  272. biotite/structure/charges.pyx +521 -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 +646 -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 +426 -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.cp314-win_amd64.pyd +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 +2122 -0
  323. biotite/structure/io/pdbx/encoding.cp314-win_amd64.pyd +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 +452 -0
  338. biotite/structure/sasa.cp314-win_amd64.pyd +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.6.0.dist-info/METADATA +162 -0
  352. biotite-1.6.0.dist-info/RECORD +354 -0
  353. biotite-1.6.0.dist-info/WHEEL +4 -0
  354. biotite-1.6.0.dist-info/licenses/LICENSE.rst +30 -0
@@ -0,0 +1,426 @@
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.filter import filter_heavy
18
+ from biotite.structure.geometry import angle, distance
19
+
20
+
21
+ def hbond(
22
+ atoms,
23
+ selection1=None,
24
+ selection2=None,
25
+ selection1_type="both",
26
+ cutoff_dist=2.5,
27
+ cutoff_angle=120,
28
+ donor_elements=("O", "N", "S"),
29
+ acceptor_elements=("O", "N", "S"),
30
+ periodic=False,
31
+ ):
32
+ r"""
33
+ Find hydrogen bonds in a structure using the Baker-Hubbard
34
+ algorithm. :footcite:`Baker1984`
35
+
36
+ This function identifies hydrogen bonds based on the bond angle
37
+ :math:`\theta` and the bond distance :math:`d_{H,A}`.
38
+ The default criteria is :math:`\theta > 120^{\circ}`
39
+ and :math:`d_{H,A} \le 2.5 \mathring{A}`.
40
+ Consequently, the given structure must contain hydrogen atoms.
41
+ Otherwise, no hydrogen bonds will be found.
42
+
43
+ Parameters
44
+ ----------
45
+ atoms : AtomArray or AtomArrayStack
46
+ The atoms to find hydrogen bonds in.
47
+ selection1, selection2 : ndarray, optional
48
+ Boolean mask for atoms to limit the hydrogen bond search to
49
+ specific sections of the model. The shape must match the
50
+ shape of the `atoms` argument. If None is given, the whole atoms
51
+ stack is used instead.
52
+ selection1_type : {'acceptor', 'donor', 'both'}, optional
53
+ Determines the type of `selection1`.
54
+ The type of `selection2` is chosen accordingly
55
+ ('both' or the opposite).
56
+ cutoff_dist : float, optional
57
+ The maximal distance between the hydrogen and acceptor to be
58
+ considered a hydrogen bond.
59
+ cutoff_angle : float, optional
60
+ The angle cutoff in degree between Donor-H..Acceptor to be
61
+ considered a hydrogen bond.
62
+ donor_elements, acceptor_elements : tuple of str
63
+ Elements to be considered as possible donors or acceptors.
64
+ periodic : bool, optional
65
+ If true, hydrogen bonds can also be detected in periodic
66
+ boundary conditions.
67
+ The `box` attribute of `atoms` is required in this case.
68
+
69
+ Returns
70
+ -------
71
+ triplets : ndarray, dtype=int, shape=(n,3)
72
+ *n x 3* matrix containing the indices of every Donor-H..Acceptor
73
+ interaction that is available in any of the models.
74
+ *n* is the number of found interactions.
75
+ The three matrix columns are *D_index*, *H_index*, *A_index*.
76
+ If only one model (`AtomArray`) is given, `triplets` contains
77
+ all of its hydrogen bonds.
78
+ mask : ndarry, dtype=bool, shape=(m,n)
79
+ *m x n* matrix that shows if an interaction with index *n* in
80
+ `triplets` is present in the model *m* of the input `atoms`.
81
+ Only returned if `atoms` is an :class:`AtomArrayStack`.
82
+
83
+ See Also
84
+ --------
85
+ hbond_frequency : Compute the frequency of each bond over the models.
86
+
87
+ Notes
88
+ -----
89
+ The result of this function may include false positives:
90
+ Only the chemical elements and the bond geometry is checked.
91
+ However, there are some cases where a hydrogen bond is still not
92
+ reasonable.
93
+ For example, a nitrogen atom with positive charge could be
94
+ considered as acceptor atom by this method, although this does
95
+ make sense from a chemical perspective.
96
+
97
+ References
98
+ ----------
99
+
100
+ .. footbibliography::
101
+
102
+ Examples
103
+ --------
104
+ Calculate the total number of hydrogen bonds found in each model:
105
+
106
+ >>> triplets, mask = hbond(atom_array_stack)
107
+ >>> hbonds_per_model = np.count_nonzero(mask, axis=1)
108
+ >>> print(hbonds_per_model)
109
+ [14 14 14 12 11 12 9 13 9 14 13 13 14 11 11 12 11 14 14 13 14 13 15 17
110
+ 14 12 15 12 12 13 13 13 12 12 11 14 10 11]
111
+
112
+ Get hydrogen bond donors of third model:
113
+
114
+ >>> # Third model -> index 2
115
+ >>> triplets = triplets[mask[2,:]]
116
+ >>> # First column contains donors
117
+ >>> print(atom_array_stack[2, triplets[:,0]])
118
+ A 5 GLN N N -5.009 -0.575 -1.365
119
+ A 6 TRP N N -2.154 -0.497 -1.588
120
+ A 7 LEU N N -1.520 -1.904 0.893
121
+ A 8 LYS N N -2.716 -4.413 0.176
122
+ A 8 LYS NZ N -6.352 -4.311 -4.482
123
+ A 9 ASP N N -0.694 -5.301 -1.644
124
+ A 11 GLY N N 2.142 -4.244 1.916
125
+ A 10 GLY N N 1.135 -6.232 0.250
126
+ A 14 SER OG O 4.689 -5.759 -2.390
127
+ A 13 SER N N 6.424 -5.220 3.257
128
+ A 14 SER N N 6.424 -5.506 0.464
129
+ A 15 GLY N N 8.320 -3.632 -0.318
130
+ A 16 ARG N N 8.043 -1.206 -1.866
131
+ A 6 TRP NE1 N 3.420 0.332 -0.121
132
+ """
133
+ if filter_heavy(atoms).all():
134
+ warnings.warn(
135
+ "Input structure does not contain hydrogen atoms, "
136
+ "hence no hydrogen bonds can be identified"
137
+ )
138
+
139
+ # Create AtomArrayStack from AtomArray
140
+ if not isinstance(atoms, AtomArrayStack):
141
+ atoms = stack([atoms])
142
+ single_model = True
143
+ else:
144
+ single_model = False
145
+
146
+ if periodic:
147
+ box = atoms.box
148
+ else:
149
+ box = None
150
+
151
+ # Mask for donor/acceptor elements
152
+ donor_element_mask = np.isin(atoms.element, donor_elements)
153
+ acceptor_element_mask = np.isin(atoms.element, acceptor_elements)
154
+
155
+ if selection1 is None:
156
+ selection1 = np.ones(atoms.array_length(), dtype=bool)
157
+ if selection2 is None:
158
+ selection2 = np.ones(atoms.array_length(), dtype=bool)
159
+
160
+ if selection1_type == "both":
161
+ # The two selections are separated into three selections:
162
+ # the original ones without the overlaping part
163
+ # and one containing the overlap
164
+ # This prevents redundant triplets and unnecessary computation
165
+ overlap_selection = selection1 & selection2
166
+ # Original selections without overlaping part
167
+ exclusive_selection1 = selection1 & (~overlap_selection)
168
+ exclusive_selection2 = selection2 & (~overlap_selection)
169
+
170
+ # Put selections to list for cleaner iteration
171
+ selections = [exclusive_selection1, exclusive_selection2, overlap_selection]
172
+ selection_combinations = [
173
+ # (0,0), is not included, would be same selection
174
+ # as donor and acceptor simultaneously
175
+ (0, 1),
176
+ (0, 2),
177
+ (1, 0),
178
+ # (1,1), # same reason above
179
+ (1, 2),
180
+ (2, 0),
181
+ (2, 1),
182
+ (2, 2), # overlaping part, combination is necessary
183
+ ]
184
+
185
+ all_comb_triplets = []
186
+ all_comb_mask = []
187
+ for selection_index1, selection_index2 in selection_combinations:
188
+ donor_mask = selections[selection_index1]
189
+ acceptor_mask = selections[selection_index2]
190
+ if (
191
+ np.count_nonzero(donor_mask) != 0
192
+ and np.count_nonzero(acceptor_mask) != 0
193
+ ):
194
+ # Calculate triplets and mask
195
+ triplets, mask = _hbond(
196
+ atoms,
197
+ donor_mask,
198
+ acceptor_mask,
199
+ donor_element_mask,
200
+ acceptor_element_mask,
201
+ cutoff_dist,
202
+ cutoff_angle,
203
+ box,
204
+ )
205
+ all_comb_triplets.append(triplets)
206
+ all_comb_mask.append(mask)
207
+ # Merge results from all combinations
208
+ triplets = np.concatenate(all_comb_triplets, axis=0)
209
+ mask = np.concatenate(all_comb_mask, axis=1)
210
+
211
+ elif selection1_type == "donor":
212
+ triplets, mask = _hbond(
213
+ atoms,
214
+ selection1,
215
+ selection2,
216
+ donor_element_mask,
217
+ acceptor_element_mask,
218
+ cutoff_dist,
219
+ cutoff_angle,
220
+ box,
221
+ )
222
+
223
+ elif selection1_type == "acceptor":
224
+ triplets, mask = _hbond(
225
+ atoms,
226
+ selection2,
227
+ selection1,
228
+ donor_element_mask,
229
+ acceptor_element_mask,
230
+ cutoff_dist,
231
+ cutoff_angle,
232
+ box,
233
+ )
234
+
235
+ else:
236
+ raise ValueError(f"Unknown selection type '{selection1_type}'")
237
+
238
+ if single_model:
239
+ # For an atom array (not stack),
240
+ # hbond_mask contains only 'True' values,
241
+ # since all interactions are in the one model
242
+ # -> Simply return triplets without hbond_mask
243
+ return triplets
244
+ else:
245
+ return triplets, mask
246
+
247
+
248
+ def _hbond(
249
+ atoms,
250
+ donor_mask,
251
+ acceptor_mask,
252
+ donor_element_mask,
253
+ acceptor_element_mask,
254
+ cutoff_dist,
255
+ cutoff_angle,
256
+ box,
257
+ ):
258
+ # Filter donor/acceptor elements
259
+ donor_mask &= donor_element_mask
260
+ acceptor_mask &= acceptor_element_mask
261
+
262
+ first_model_box = box[0] if box is not None else None
263
+ if atoms.bonds is not None:
264
+ donor_h_mask, associated_donor_indices = _get_bonded_h(
265
+ atoms[0], donor_mask, atoms.bonds
266
+ )
267
+ else:
268
+ warnings.warn(
269
+ "Input structure has no associated 'BondList', "
270
+ "Hydrogen atoms bonded to donors are detected by distance"
271
+ )
272
+ donor_h_mask, associated_donor_indices = _get_bonded_h_via_distance(
273
+ atoms[0], donor_mask, first_model_box
274
+ )
275
+ donor_h_i = np.where(donor_h_mask)[0]
276
+ acceptor_i = np.where(acceptor_mask)[0]
277
+ if len(donor_h_i) == 0 or len(acceptor_i) == 0:
278
+ # Return empty triplets and mask
279
+ return (
280
+ np.zeros((0, 3), dtype=int),
281
+ np.zeros((atoms.stack_depth(), 0), dtype=bool),
282
+ )
283
+
284
+ # Narrow the amount of possible acceptor to donor-H connections
285
+ # down via the distance cutoff parameter using a cell list
286
+ # Save in acceptor-to-hydrogen matrix
287
+ # (true when distance smaller than cutoff)
288
+ coord = atoms.coord
289
+ possible_bonds = np.zeros((len(acceptor_i), len(donor_h_i)), dtype=bool)
290
+ periodic = False if box is None else True
291
+ for model_i in range(atoms.stack_depth()):
292
+ donor_h_coord = coord[model_i, donor_h_mask]
293
+ acceptor_coord = coord[model_i, acceptor_mask]
294
+ box_for_model = box[model_i] if box is not None else None
295
+ cell_list = CellList(
296
+ donor_h_coord, cell_size=cutoff_dist, periodic=periodic, box=box_for_model
297
+ )
298
+ possible_bonds |= cell_list.get_atoms_in_cells(acceptor_coord, as_mask=True)
299
+ possible_bonds_i = np.where(possible_bonds)
300
+ # Narrow down
301
+ acceptor_i = acceptor_i[possible_bonds_i[0]]
302
+ donor_h_i = donor_h_i[possible_bonds_i[1]]
303
+
304
+ # Build D-H..A triplets
305
+ donor_i = associated_donor_indices[donor_h_i]
306
+ triplets = np.stack((donor_i, donor_h_i, acceptor_i), axis=1)
307
+ # Remove entries where donor and acceptor are the same
308
+ triplets = triplets[donor_i != acceptor_i]
309
+
310
+ hbond_mask = _is_hbond(
311
+ coord[:, triplets[:, 0]], # donors
312
+ coord[:, triplets[:, 1]], # donor hydrogens
313
+ coord[:, triplets[:, 2]], # acceptors
314
+ box,
315
+ cutoff_dist=cutoff_dist,
316
+ cutoff_angle=cutoff_angle,
317
+ )
318
+
319
+ # Reduce output to contain only triplets counted at least once
320
+ is_counted = hbond_mask.any(axis=0)
321
+ triplets = triplets[is_counted]
322
+ hbond_mask = hbond_mask[:, is_counted]
323
+
324
+ return triplets, hbond_mask
325
+
326
+
327
+ def _get_bonded_h(array, donor_mask, bonds):
328
+ """
329
+ Helper function to find indices of associated hydrogens in atoms for
330
+ all donors in atoms[donor_mask].
331
+ A `BondsList` is used for detecting bonded hydrogen atoms.
332
+ """
333
+ hydrogen_mask = ~filter_heavy(array)
334
+
335
+ donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
336
+ associated_donor_indices = np.full(len(array), -1, dtype=int)
337
+
338
+ all_bond_indices, _ = bonds.get_all_bonds()
339
+ donor_indices = np.where(donor_mask)[0]
340
+
341
+ for donor_i in donor_indices:
342
+ bonded_indices = all_bond_indices[donor_i]
343
+ # Remove padding values
344
+ bonded_indices = bonded_indices[bonded_indices != -1]
345
+ # Filter hydrogen atoms
346
+ bonded_indices = bonded_indices[hydrogen_mask[bonded_indices]]
347
+ donor_hydrogen_mask[bonded_indices] = True
348
+ associated_donor_indices[bonded_indices] = donor_i
349
+
350
+ return donor_hydrogen_mask, associated_donor_indices
351
+
352
+
353
+ def _get_bonded_h_via_distance(array, donor_mask, box):
354
+ """
355
+ Helper function to find indices of associated hydrogens in atoms for
356
+ all donors in atoms[donor_mask].
357
+ The criterium is that the hydrogen must be in the same residue and
358
+ the distance must be smaller than the cutoff.
359
+ """
360
+ CUTOFF = 1.5
361
+
362
+ coord = array.coord
363
+ res_id = array.res_id
364
+ hydrogen_mask = ~filter_heavy(array)
365
+
366
+ donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
367
+ associated_donor_indices = np.full(len(array), -1, dtype=int)
368
+
369
+ donor_indices = np.where(donor_mask)[0]
370
+ for donor_i in donor_indices:
371
+ candidate_mask = hydrogen_mask & (res_id == res_id[donor_i])
372
+ distances = distance(coord[donor_i], coord[candidate_mask], box=box)
373
+ donor_h_indices = np.where(candidate_mask)[0][distances <= CUTOFF]
374
+ for i in donor_h_indices:
375
+ associated_donor_indices[i] = donor_i
376
+ donor_hydrogen_mask[i] = True
377
+
378
+ return donor_hydrogen_mask, associated_donor_indices
379
+
380
+
381
+ def _is_hbond(donor, donor_h, acceptor, box, cutoff_dist, cutoff_angle):
382
+ """
383
+ Filter triplets that meet distance and angle condition.
384
+ """
385
+ cutoff_angle_rad = np.deg2rad(cutoff_angle)
386
+ theta = angle(donor, donor_h, acceptor, box=box)
387
+ dist = distance(donor_h, acceptor, box=box)
388
+ return (theta > cutoff_angle_rad) & (dist <= cutoff_dist)
389
+
390
+
391
+ def hbond_frequency(mask):
392
+ """
393
+ Get the relative frequency of each hydrogen bond in a multi-model
394
+ structure.
395
+
396
+ The frequency is the amount of models, where the respective bond
397
+ exists divided by the total amount of models.
398
+
399
+ Parameters
400
+ ----------
401
+ mask : ndarray, dtype=bool, shape=(m,n)
402
+ Input mask obtained from `hbond` function.
403
+
404
+ Returns
405
+ -------
406
+ ndarray, dtype=Float
407
+ For each individual interaction *n* of the mask, returns the
408
+ percentage of models *m*, in which this hydrogen bond is
409
+ present.
410
+
411
+ See Also
412
+ --------
413
+ hbond : Returns the mask that can be input into this function.
414
+
415
+ Examples
416
+ --------
417
+
418
+ >>> triplets, mask = hbond(atom_array_stack)
419
+ >>> freq = hbond_frequency(mask)
420
+ >>> print(freq)
421
+ [0.263 0.289 0.105 0.105 0.237 0.026 0.053 0.395 1.000 1.000 1.000 0.026
422
+ 0.421 0.026 0.026 0.316 0.816 0.026 0.921 0.026 0.342 0.026 0.105 0.026
423
+ 0.132 0.053 0.026 0.158 0.026 0.868 0.211 0.026 0.921 0.316 0.079 0.237
424
+ 0.105 0.421 0.079 0.026 1.000 0.053 0.132 0.026 0.184]
425
+ """
426
+ 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