biotite 0.41.1__cp310-cp310-macosx_10_16_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 (340) hide show
  1. biotite/__init__.py +19 -0
  2. biotite/application/__init__.py +43 -0
  3. biotite/application/application.py +265 -0
  4. biotite/application/autodock/__init__.py +12 -0
  5. biotite/application/autodock/app.py +505 -0
  6. biotite/application/blast/__init__.py +14 -0
  7. biotite/application/blast/alignment.py +83 -0
  8. biotite/application/blast/webapp.py +421 -0
  9. biotite/application/clustalo/__init__.py +12 -0
  10. biotite/application/clustalo/app.py +238 -0
  11. biotite/application/dssp/__init__.py +12 -0
  12. biotite/application/dssp/app.py +152 -0
  13. biotite/application/localapp.py +306 -0
  14. biotite/application/mafft/__init__.py +12 -0
  15. biotite/application/mafft/app.py +122 -0
  16. biotite/application/msaapp.py +374 -0
  17. biotite/application/muscle/__init__.py +13 -0
  18. biotite/application/muscle/app3.py +254 -0
  19. biotite/application/muscle/app5.py +171 -0
  20. biotite/application/sra/__init__.py +18 -0
  21. biotite/application/sra/app.py +456 -0
  22. biotite/application/tantan/__init__.py +12 -0
  23. biotite/application/tantan/app.py +222 -0
  24. biotite/application/util.py +59 -0
  25. biotite/application/viennarna/__init__.py +18 -0
  26. biotite/application/viennarna/rnaalifold.py +304 -0
  27. biotite/application/viennarna/rnafold.py +269 -0
  28. biotite/application/viennarna/rnaplot.py +187 -0
  29. biotite/application/viennarna/util.py +72 -0
  30. biotite/application/webapp.py +77 -0
  31. biotite/copyable.py +71 -0
  32. biotite/database/__init__.py +23 -0
  33. biotite/database/entrez/__init__.py +15 -0
  34. biotite/database/entrez/check.py +61 -0
  35. biotite/database/entrez/dbnames.py +89 -0
  36. biotite/database/entrez/download.py +223 -0
  37. biotite/database/entrez/key.py +44 -0
  38. biotite/database/entrez/query.py +223 -0
  39. biotite/database/error.py +15 -0
  40. biotite/database/pubchem/__init__.py +21 -0
  41. biotite/database/pubchem/download.py +260 -0
  42. biotite/database/pubchem/error.py +20 -0
  43. biotite/database/pubchem/query.py +827 -0
  44. biotite/database/pubchem/throttle.py +99 -0
  45. biotite/database/rcsb/__init__.py +13 -0
  46. biotite/database/rcsb/download.py +167 -0
  47. biotite/database/rcsb/query.py +959 -0
  48. biotite/database/uniprot/__init__.py +13 -0
  49. biotite/database/uniprot/check.py +32 -0
  50. biotite/database/uniprot/download.py +134 -0
  51. biotite/database/uniprot/query.py +209 -0
  52. biotite/file.py +251 -0
  53. biotite/sequence/__init__.py +73 -0
  54. biotite/sequence/align/__init__.py +49 -0
  55. biotite/sequence/align/alignment.py +658 -0
  56. biotite/sequence/align/banded.cpython-310-darwin.so +0 -0
  57. biotite/sequence/align/banded.pyx +652 -0
  58. biotite/sequence/align/buckets.py +69 -0
  59. biotite/sequence/align/cigar.py +434 -0
  60. biotite/sequence/align/kmeralphabet.cpython-310-darwin.so +0 -0
  61. biotite/sequence/align/kmeralphabet.pyx +574 -0
  62. biotite/sequence/align/kmersimilarity.cpython-310-darwin.so +0 -0
  63. biotite/sequence/align/kmersimilarity.pyx +233 -0
  64. biotite/sequence/align/kmertable.cpython-310-darwin.so +0 -0
  65. biotite/sequence/align/kmertable.pyx +3400 -0
  66. biotite/sequence/align/localgapped.cpython-310-darwin.so +0 -0
  67. biotite/sequence/align/localgapped.pyx +892 -0
  68. biotite/sequence/align/localungapped.cpython-310-darwin.so +0 -0
  69. biotite/sequence/align/localungapped.pyx +279 -0
  70. biotite/sequence/align/matrix.py +405 -0
  71. biotite/sequence/align/matrix_data/BLOSUM100.mat +31 -0
  72. biotite/sequence/align/matrix_data/BLOSUM30.mat +31 -0
  73. biotite/sequence/align/matrix_data/BLOSUM35.mat +31 -0
  74. biotite/sequence/align/matrix_data/BLOSUM40.mat +31 -0
  75. biotite/sequence/align/matrix_data/BLOSUM45.mat +31 -0
  76. biotite/sequence/align/matrix_data/BLOSUM50.mat +31 -0
  77. biotite/sequence/align/matrix_data/BLOSUM50_13p.mat +25 -0
  78. biotite/sequence/align/matrix_data/BLOSUM50_14.3.mat +25 -0
  79. biotite/sequence/align/matrix_data/BLOSUM50_5.0.mat +25 -0
  80. biotite/sequence/align/matrix_data/BLOSUM55.mat +31 -0
  81. biotite/sequence/align/matrix_data/BLOSUM60.mat +31 -0
  82. biotite/sequence/align/matrix_data/BLOSUM62.mat +31 -0
  83. biotite/sequence/align/matrix_data/BLOSUM62_13p.mat +25 -0
  84. biotite/sequence/align/matrix_data/BLOSUM62_14.3.mat +25 -0
  85. biotite/sequence/align/matrix_data/BLOSUM62_5.0.mat +25 -0
  86. biotite/sequence/align/matrix_data/BLOSUM65.mat +31 -0
  87. biotite/sequence/align/matrix_data/BLOSUM70.mat +31 -0
  88. biotite/sequence/align/matrix_data/BLOSUM75.mat +31 -0
  89. biotite/sequence/align/matrix_data/BLOSUM80.mat +31 -0
  90. biotite/sequence/align/matrix_data/BLOSUM85.mat +31 -0
  91. biotite/sequence/align/matrix_data/BLOSUM90.mat +31 -0
  92. biotite/sequence/align/matrix_data/BLOSUMN.mat +31 -0
  93. biotite/sequence/align/matrix_data/CorBLOSUM49_5.0.mat +25 -0
  94. biotite/sequence/align/matrix_data/CorBLOSUM57_13p.mat +25 -0
  95. biotite/sequence/align/matrix_data/CorBLOSUM57_14.3.mat +25 -0
  96. biotite/sequence/align/matrix_data/CorBLOSUM61_5.0.mat +25 -0
  97. biotite/sequence/align/matrix_data/CorBLOSUM66_13p.mat +25 -0
  98. biotite/sequence/align/matrix_data/CorBLOSUM67_14.3.mat +25 -0
  99. biotite/sequence/align/matrix_data/DAYHOFF.mat +32 -0
  100. biotite/sequence/align/matrix_data/GONNET.mat +26 -0
  101. biotite/sequence/align/matrix_data/IDENTITY.mat +25 -0
  102. biotite/sequence/align/matrix_data/MATCH.mat +25 -0
  103. biotite/sequence/align/matrix_data/NUC.mat +25 -0
  104. biotite/sequence/align/matrix_data/PAM10.mat +34 -0
  105. biotite/sequence/align/matrix_data/PAM100.mat +34 -0
  106. biotite/sequence/align/matrix_data/PAM110.mat +34 -0
  107. biotite/sequence/align/matrix_data/PAM120.mat +34 -0
  108. biotite/sequence/align/matrix_data/PAM130.mat +34 -0
  109. biotite/sequence/align/matrix_data/PAM140.mat +34 -0
  110. biotite/sequence/align/matrix_data/PAM150.mat +34 -0
  111. biotite/sequence/align/matrix_data/PAM160.mat +34 -0
  112. biotite/sequence/align/matrix_data/PAM170.mat +34 -0
  113. biotite/sequence/align/matrix_data/PAM180.mat +34 -0
  114. biotite/sequence/align/matrix_data/PAM190.mat +34 -0
  115. biotite/sequence/align/matrix_data/PAM20.mat +34 -0
  116. biotite/sequence/align/matrix_data/PAM200.mat +34 -0
  117. biotite/sequence/align/matrix_data/PAM210.mat +34 -0
  118. biotite/sequence/align/matrix_data/PAM220.mat +34 -0
  119. biotite/sequence/align/matrix_data/PAM230.mat +34 -0
  120. biotite/sequence/align/matrix_data/PAM240.mat +34 -0
  121. biotite/sequence/align/matrix_data/PAM250.mat +34 -0
  122. biotite/sequence/align/matrix_data/PAM260.mat +34 -0
  123. biotite/sequence/align/matrix_data/PAM270.mat +34 -0
  124. biotite/sequence/align/matrix_data/PAM280.mat +34 -0
  125. biotite/sequence/align/matrix_data/PAM290.mat +34 -0
  126. biotite/sequence/align/matrix_data/PAM30.mat +34 -0
  127. biotite/sequence/align/matrix_data/PAM300.mat +34 -0
  128. biotite/sequence/align/matrix_data/PAM310.mat +34 -0
  129. biotite/sequence/align/matrix_data/PAM320.mat +34 -0
  130. biotite/sequence/align/matrix_data/PAM330.mat +34 -0
  131. biotite/sequence/align/matrix_data/PAM340.mat +34 -0
  132. biotite/sequence/align/matrix_data/PAM350.mat +34 -0
  133. biotite/sequence/align/matrix_data/PAM360.mat +34 -0
  134. biotite/sequence/align/matrix_data/PAM370.mat +34 -0
  135. biotite/sequence/align/matrix_data/PAM380.mat +34 -0
  136. biotite/sequence/align/matrix_data/PAM390.mat +34 -0
  137. biotite/sequence/align/matrix_data/PAM40.mat +34 -0
  138. biotite/sequence/align/matrix_data/PAM400.mat +34 -0
  139. biotite/sequence/align/matrix_data/PAM410.mat +34 -0
  140. biotite/sequence/align/matrix_data/PAM420.mat +34 -0
  141. biotite/sequence/align/matrix_data/PAM430.mat +34 -0
  142. biotite/sequence/align/matrix_data/PAM440.mat +34 -0
  143. biotite/sequence/align/matrix_data/PAM450.mat +34 -0
  144. biotite/sequence/align/matrix_data/PAM460.mat +34 -0
  145. biotite/sequence/align/matrix_data/PAM470.mat +34 -0
  146. biotite/sequence/align/matrix_data/PAM480.mat +34 -0
  147. biotite/sequence/align/matrix_data/PAM490.mat +34 -0
  148. biotite/sequence/align/matrix_data/PAM50.mat +34 -0
  149. biotite/sequence/align/matrix_data/PAM500.mat +34 -0
  150. biotite/sequence/align/matrix_data/PAM60.mat +34 -0
  151. biotite/sequence/align/matrix_data/PAM70.mat +34 -0
  152. biotite/sequence/align/matrix_data/PAM80.mat +34 -0
  153. biotite/sequence/align/matrix_data/PAM90.mat +34 -0
  154. biotite/sequence/align/matrix_data/RBLOSUM52_5.0.mat +25 -0
  155. biotite/sequence/align/matrix_data/RBLOSUM59_13p.mat +25 -0
  156. biotite/sequence/align/matrix_data/RBLOSUM59_14.3.mat +25 -0
  157. biotite/sequence/align/matrix_data/RBLOSUM64_5.0.mat +25 -0
  158. biotite/sequence/align/matrix_data/RBLOSUM69_13p.mat +25 -0
  159. biotite/sequence/align/matrix_data/RBLOSUM69_14.3.mat +25 -0
  160. biotite/sequence/align/multiple.cpython-310-darwin.so +0 -0
  161. biotite/sequence/align/multiple.pyx +620 -0
  162. biotite/sequence/align/pairwise.cpython-310-darwin.so +0 -0
  163. biotite/sequence/align/pairwise.pyx +587 -0
  164. biotite/sequence/align/permutation.cpython-310-darwin.so +0 -0
  165. biotite/sequence/align/permutation.pyx +305 -0
  166. biotite/sequence/align/primes.txt +821 -0
  167. biotite/sequence/align/selector.cpython-310-darwin.so +0 -0
  168. biotite/sequence/align/selector.pyx +956 -0
  169. biotite/sequence/align/statistics.py +265 -0
  170. biotite/sequence/align/tracetable.cpython-310-darwin.so +0 -0
  171. biotite/sequence/align/tracetable.pxd +64 -0
  172. biotite/sequence/align/tracetable.pyx +370 -0
  173. biotite/sequence/alphabet.py +566 -0
  174. biotite/sequence/annotation.py +829 -0
  175. biotite/sequence/codec.cpython-310-darwin.so +0 -0
  176. biotite/sequence/codec.pyx +155 -0
  177. biotite/sequence/codon.py +466 -0
  178. biotite/sequence/codon_tables.txt +202 -0
  179. biotite/sequence/graphics/__init__.py +33 -0
  180. biotite/sequence/graphics/alignment.py +1034 -0
  181. biotite/sequence/graphics/color_schemes/autumn.json +51 -0
  182. biotite/sequence/graphics/color_schemes/blossom.json +51 -0
  183. biotite/sequence/graphics/color_schemes/clustalx_dna.json +11 -0
  184. biotite/sequence/graphics/color_schemes/clustalx_protein.json +28 -0
  185. biotite/sequence/graphics/color_schemes/flower.json +51 -0
  186. biotite/sequence/graphics/color_schemes/jalview_buried.json +31 -0
  187. biotite/sequence/graphics/color_schemes/jalview_hydrophobicity.json +31 -0
  188. biotite/sequence/graphics/color_schemes/jalview_prop_helix.json +31 -0
  189. biotite/sequence/graphics/color_schemes/jalview_prop_strand.json +31 -0
  190. biotite/sequence/graphics/color_schemes/jalview_prop_turn.json +31 -0
  191. biotite/sequence/graphics/color_schemes/jalview_taylor.json +28 -0
  192. biotite/sequence/graphics/color_schemes/jalview_zappo.json +28 -0
  193. biotite/sequence/graphics/color_schemes/ocean.json +51 -0
  194. biotite/sequence/graphics/color_schemes/pb_flower.json +39 -0
  195. biotite/sequence/graphics/color_schemes/rainbow_dna.json +11 -0
  196. biotite/sequence/graphics/color_schemes/rainbow_protein.json +30 -0
  197. biotite/sequence/graphics/color_schemes/spring.json +51 -0
  198. biotite/sequence/graphics/color_schemes/sunset.json +51 -0
  199. biotite/sequence/graphics/color_schemes/wither.json +51 -0
  200. biotite/sequence/graphics/colorschemes.py +139 -0
  201. biotite/sequence/graphics/dendrogram.py +184 -0
  202. biotite/sequence/graphics/features.py +510 -0
  203. biotite/sequence/graphics/logo.py +110 -0
  204. biotite/sequence/graphics/plasmid.py +661 -0
  205. biotite/sequence/io/__init__.py +12 -0
  206. biotite/sequence/io/fasta/__init__.py +22 -0
  207. biotite/sequence/io/fasta/convert.py +273 -0
  208. biotite/sequence/io/fasta/file.py +278 -0
  209. biotite/sequence/io/fastq/__init__.py +19 -0
  210. biotite/sequence/io/fastq/convert.py +120 -0
  211. biotite/sequence/io/fastq/file.py +551 -0
  212. biotite/sequence/io/genbank/__init__.py +17 -0
  213. biotite/sequence/io/genbank/annotation.py +277 -0
  214. biotite/sequence/io/genbank/file.py +575 -0
  215. biotite/sequence/io/genbank/metadata.py +324 -0
  216. biotite/sequence/io/genbank/sequence.py +172 -0
  217. biotite/sequence/io/general.py +192 -0
  218. biotite/sequence/io/gff/__init__.py +26 -0
  219. biotite/sequence/io/gff/convert.py +133 -0
  220. biotite/sequence/io/gff/file.py +434 -0
  221. biotite/sequence/phylo/__init__.py +36 -0
  222. biotite/sequence/phylo/nj.cpython-310-darwin.so +0 -0
  223. biotite/sequence/phylo/nj.pyx +221 -0
  224. biotite/sequence/phylo/tree.cpython-310-darwin.so +0 -0
  225. biotite/sequence/phylo/tree.pyx +1169 -0
  226. biotite/sequence/phylo/upgma.cpython-310-darwin.so +0 -0
  227. biotite/sequence/phylo/upgma.pyx +164 -0
  228. biotite/sequence/profile.py +456 -0
  229. biotite/sequence/search.py +116 -0
  230. biotite/sequence/seqtypes.py +556 -0
  231. biotite/sequence/sequence.py +374 -0
  232. biotite/structure/__init__.py +132 -0
  233. biotite/structure/atoms.py +1455 -0
  234. biotite/structure/basepairs.py +1415 -0
  235. biotite/structure/bonds.cpython-310-darwin.so +0 -0
  236. biotite/structure/bonds.pyx +1933 -0
  237. biotite/structure/box.py +592 -0
  238. biotite/structure/celllist.cpython-310-darwin.so +0 -0
  239. biotite/structure/celllist.pyx +849 -0
  240. biotite/structure/chains.py +298 -0
  241. biotite/structure/charges.cpython-310-darwin.so +0 -0
  242. biotite/structure/charges.pyx +520 -0
  243. biotite/structure/compare.py +274 -0
  244. biotite/structure/density.py +114 -0
  245. biotite/structure/dotbracket.py +216 -0
  246. biotite/structure/error.py +31 -0
  247. biotite/structure/filter.py +585 -0
  248. biotite/structure/geometry.py +697 -0
  249. biotite/structure/graphics/__init__.py +13 -0
  250. biotite/structure/graphics/atoms.py +226 -0
  251. biotite/structure/graphics/rna.py +282 -0
  252. biotite/structure/hbond.py +409 -0
  253. biotite/structure/info/__init__.py +25 -0
  254. biotite/structure/info/atom_masses.json +121 -0
  255. biotite/structure/info/atoms.py +82 -0
  256. biotite/structure/info/bonds.py +145 -0
  257. biotite/structure/info/ccd/README.rst +8 -0
  258. biotite/structure/info/ccd/amino_acids.txt +1663 -0
  259. biotite/structure/info/ccd/carbohydrates.txt +1135 -0
  260. biotite/structure/info/ccd/components.bcif +0 -0
  261. biotite/structure/info/ccd/nucleotides.txt +798 -0
  262. biotite/structure/info/ccd.py +95 -0
  263. biotite/structure/info/groups.py +90 -0
  264. biotite/structure/info/masses.py +123 -0
  265. biotite/structure/info/misc.py +144 -0
  266. biotite/structure/info/radii.py +197 -0
  267. biotite/structure/info/standardize.py +196 -0
  268. biotite/structure/integrity.py +268 -0
  269. biotite/structure/io/__init__.py +30 -0
  270. biotite/structure/io/ctab.py +72 -0
  271. biotite/structure/io/dcd/__init__.py +13 -0
  272. biotite/structure/io/dcd/file.py +65 -0
  273. biotite/structure/io/general.py +257 -0
  274. biotite/structure/io/gro/__init__.py +14 -0
  275. biotite/structure/io/gro/file.py +343 -0
  276. biotite/structure/io/mmtf/__init__.py +21 -0
  277. biotite/structure/io/mmtf/assembly.py +214 -0
  278. biotite/structure/io/mmtf/convertarray.cpython-310-darwin.so +0 -0
  279. biotite/structure/io/mmtf/convertarray.pyx +341 -0
  280. biotite/structure/io/mmtf/convertfile.cpython-310-darwin.so +0 -0
  281. biotite/structure/io/mmtf/convertfile.pyx +501 -0
  282. biotite/structure/io/mmtf/decode.cpython-310-darwin.so +0 -0
  283. biotite/structure/io/mmtf/decode.pyx +152 -0
  284. biotite/structure/io/mmtf/encode.cpython-310-darwin.so +0 -0
  285. biotite/structure/io/mmtf/encode.pyx +183 -0
  286. biotite/structure/io/mmtf/file.py +233 -0
  287. biotite/structure/io/mol/__init__.py +20 -0
  288. biotite/structure/io/mol/convert.py +115 -0
  289. biotite/structure/io/mol/ctab.py +414 -0
  290. biotite/structure/io/mol/header.py +116 -0
  291. biotite/structure/io/mol/mol.py +193 -0
  292. biotite/structure/io/mol/sdf.py +916 -0
  293. biotite/structure/io/netcdf/__init__.py +13 -0
  294. biotite/structure/io/netcdf/file.py +63 -0
  295. biotite/structure/io/npz/__init__.py +20 -0
  296. biotite/structure/io/npz/file.py +152 -0
  297. biotite/structure/io/pdb/__init__.py +20 -0
  298. biotite/structure/io/pdb/convert.py +293 -0
  299. biotite/structure/io/pdb/file.py +1240 -0
  300. biotite/structure/io/pdb/hybrid36.cpython-310-darwin.so +0 -0
  301. biotite/structure/io/pdb/hybrid36.pyx +242 -0
  302. biotite/structure/io/pdbqt/__init__.py +15 -0
  303. biotite/structure/io/pdbqt/convert.py +107 -0
  304. biotite/structure/io/pdbqt/file.py +640 -0
  305. biotite/structure/io/pdbx/__init__.py +23 -0
  306. biotite/structure/io/pdbx/bcif.py +648 -0
  307. biotite/structure/io/pdbx/cif.py +1032 -0
  308. biotite/structure/io/pdbx/component.py +246 -0
  309. biotite/structure/io/pdbx/convert.py +1597 -0
  310. biotite/structure/io/pdbx/encoding.cpython-310-darwin.so +0 -0
  311. biotite/structure/io/pdbx/encoding.pyx +950 -0
  312. biotite/structure/io/pdbx/legacy.py +267 -0
  313. biotite/structure/io/tng/__init__.py +13 -0
  314. biotite/structure/io/tng/file.py +46 -0
  315. biotite/structure/io/trajfile.py +710 -0
  316. biotite/structure/io/trr/__init__.py +13 -0
  317. biotite/structure/io/trr/file.py +46 -0
  318. biotite/structure/io/xtc/__init__.py +13 -0
  319. biotite/structure/io/xtc/file.py +46 -0
  320. biotite/structure/mechanics.py +75 -0
  321. biotite/structure/molecules.py +353 -0
  322. biotite/structure/pseudoknots.py +642 -0
  323. biotite/structure/rdf.py +243 -0
  324. biotite/structure/repair.py +253 -0
  325. biotite/structure/residues.py +562 -0
  326. biotite/structure/resutil.py +178 -0
  327. biotite/structure/sasa.cpython-310-darwin.so +0 -0
  328. biotite/structure/sasa.pyx +322 -0
  329. biotite/structure/sequence.py +112 -0
  330. biotite/structure/sse.py +327 -0
  331. biotite/structure/superimpose.py +727 -0
  332. biotite/structure/transform.py +504 -0
  333. biotite/structure/util.py +98 -0
  334. biotite/temp.py +86 -0
  335. biotite/version.py +16 -0
  336. biotite/visualize.py +251 -0
  337. biotite-0.41.1.dist-info/METADATA +187 -0
  338. biotite-0.41.1.dist-info/RECORD +340 -0
  339. biotite-0.41.1.dist-info/WHEEL +4 -0
  340. biotite-0.41.1.dist-info/licenses/LICENSE.rst +30 -0
@@ -0,0 +1,409 @@
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
+ from .geometry import distance, angle
15
+ import numpy as np
16
+ from .atoms import AtomArrayStack, stack
17
+ from .celllist import CellList
18
+
19
+
20
+ def hbond(atoms, selection1=None, selection2=None, selection1_type='both',
21
+ cutoff_dist=2.5, cutoff_angle=120,
22
+ donor_elements=('O', 'N', 'S'), acceptor_elements=('O', 'N', 'S'),
23
+ periodic=False):
24
+ r"""
25
+ Find hydrogen bonds in a structure using the Baker-Hubbard
26
+ algorithm. :footcite:`Baker1984`
27
+
28
+ This function identifies hydrogen bonds based on the bond angle
29
+ :math:`\theta` and the bond distance :math:`d_{H,A}`.
30
+ The default criteria is :math:`\theta > 120^{\circ}`
31
+ and :math:`d_{H,A} \le 2.5 \mathring{A}`.
32
+ Consequently, the given structure must contain hydrogen atoms.
33
+ Otherwise, no hydrogen bonds will be found.
34
+
35
+ Parameters
36
+ ----------
37
+ atoms : AtomArray or AtomArrayStack
38
+ The atoms to find hydrogen bonds in.
39
+ selection1, selection2: ndarray or None
40
+ Boolean mask for atoms to limit the hydrogen bond search to
41
+ specific sections of the model. The shape must match the
42
+ shape of the `atoms` argument. If None is given, the whole atoms
43
+ stack is used instead. (Default: None)
44
+ selection1_type: {'acceptor', 'donor', 'both'}, optional (default: 'both')
45
+ Determines the type of `selection1`.
46
+ The type of `selection2` is chosen accordingly
47
+ ('both' or the opposite).
48
+ (Default: 'both')
49
+ cutoff_dist : float, optional
50
+ The maximal distance between the hydrogen and acceptor to be
51
+ considered a hydrogen bond. (Default: 2.5)
52
+ cutoff_angle : float, optional
53
+ The angle cutoff in degree between Donor-H..Acceptor to be
54
+ considered a hydrogen bond (default: 120).
55
+ donor_elements, acceptor_elements: tuple of str
56
+ Elements to be considered as possible donors or acceptors
57
+ (Default: O, N, S).
58
+ periodic : bool, optional
59
+ If true, hydrogen bonds can also be detected in periodic
60
+ boundary conditions.
61
+ The `box` attribute of `atoms` is required in this case.
62
+ (Default: False).
63
+
64
+ Returns
65
+ -------
66
+ triplets : ndarray, dtype=int, shape=(n,3)
67
+ *n x 3* matrix containing the indices of every Donor-H..Acceptor
68
+ interaction that is available in any of the models.
69
+ *n* is the number of found interactions.
70
+ The three matrix columns are *D_index*, *H_index*, *A_index*.
71
+ If only one model (`AtomArray`) is given, `triplets` contains
72
+ all of its hydrogen bonds.
73
+ mask : ndarry, dtype=bool, shape=(m,n)
74
+ *m x n* matrix that shows if an interaction with index *n* in
75
+ `triplets` is present in the model *m* of the input `atoms`.
76
+ Only returned if `atoms` is an :class:`AtomArrayStack`.
77
+
78
+ Notes
79
+ -----
80
+ The result of this function may include false positives:
81
+ Only the chemical elements and the bond geometry is checked.
82
+ However, there are some cases where a hydrogen bond is still not
83
+ reasonable.
84
+ For example, a nitrogen atom with positive charge could be
85
+ considered as acceptor atom by this method, although this does
86
+ make sense from a chemical perspective.
87
+
88
+ Examples
89
+ --------
90
+ Calculate the total number of hydrogen bonds found in each model:
91
+
92
+ >>> triplets, mask = hbond(atom_array_stack)
93
+ >>> hbonds_per_model = np.count_nonzero(mask, axis=1)
94
+ >>> print(hbonds_per_model)
95
+ [14 14 14 12 11 12 9 13 9 14 13 13 14 11 11 12 11 14 14 13 14 13 15 17
96
+ 14 12 15 12 12 13 13 13 12 12 11 14 10 11]
97
+
98
+ Get hydrogen bond donors of third model:
99
+
100
+ >>> # Third model -> index 2
101
+ >>> triplets = triplets[mask[2,:]]
102
+ >>> # First column contains donors
103
+ >>> print(atom_array_stack[2, triplets[:,0]])
104
+ A 5 GLN N N -5.009 -0.575 -1.365
105
+ A 6 TRP N N -2.154 -0.497 -1.588
106
+ A 7 LEU N N -1.520 -1.904 0.893
107
+ A 8 LYS N N -2.716 -4.413 0.176
108
+ A 8 LYS NZ N -6.352 -4.311 -4.482
109
+ A 9 ASP N N -0.694 -5.301 -1.644
110
+ A 11 GLY N N 2.142 -4.244 1.916
111
+ A 10 GLY N N 1.135 -6.232 0.250
112
+ A 14 SER OG O 4.689 -5.759 -2.390
113
+ A 13 SER N N 6.424 -5.220 3.257
114
+ A 14 SER N N 6.424 -5.506 0.464
115
+ A 15 GLY N N 8.320 -3.632 -0.318
116
+ A 16 ARG N N 8.043 -1.206 -1.866
117
+ A 6 TRP NE1 N 3.420 0.332 -0.121
118
+
119
+ See Also
120
+ --------
121
+ hbond_frequency
122
+
123
+ References
124
+ ----------
125
+
126
+ .. footbibliography::
127
+ """
128
+ if not (atoms.element == "H").any():
129
+ warnings.warn(
130
+ "Input structure does not contain hydrogen atoms, "
131
+ "hence no hydrogen bonds can be identified"
132
+ )
133
+
134
+ # Create AtomArrayStack from AtomArray
135
+ if not isinstance(atoms, AtomArrayStack):
136
+ atoms = stack([atoms])
137
+ single_model = True
138
+ else:
139
+ single_model = False
140
+
141
+ if periodic:
142
+ box = atoms.box
143
+ else:
144
+ box = None
145
+
146
+ # Mask for donor/acceptor elements
147
+ donor_element_mask = np.isin(atoms.element, donor_elements)
148
+ acceptor_element_mask = np.isin(atoms.element, acceptor_elements)
149
+
150
+ if selection1 is None:
151
+ selection1 = np.ones(atoms.array_length(), dtype=bool)
152
+ if selection2 is None:
153
+ selection2 = np.ones(atoms.array_length(), dtype=bool)
154
+
155
+ if selection1_type == 'both':
156
+ # The two selections are separated into three selections:
157
+ # the original ones without the overlaping part
158
+ # and one containing the overlap
159
+ # This prevents redundant triplets and unnecessary computation
160
+ overlap_selection = selection1 & selection2
161
+ # Original selections without overlaping part
162
+ exclusive_selection1 = selection1 & (~overlap_selection)
163
+ exclusive_selection2 = selection2 & (~overlap_selection)
164
+
165
+ # Put selections to list for cleaner iteration
166
+ selections = [
167
+ exclusive_selection1, exclusive_selection2, overlap_selection
168
+ ]
169
+ selection_combinations = [
170
+ #(0,0), is not included, would be same selection
171
+ # as donor and acceptor simultaneously
172
+ (0,1),
173
+ (0,2),
174
+ (1,0),
175
+ #(1,1), # same reason above
176
+ (1,2),
177
+ (2,0),
178
+ (2,1),
179
+ (2,2) # overlaping part, combination is necessary
180
+ ]
181
+
182
+ all_comb_triplets = []
183
+ all_comb_mask = []
184
+ for selection_index1, selection_index2 in selection_combinations:
185
+ donor_mask = selections[selection_index1]
186
+ acceptor_mask = selections[selection_index2]
187
+ if np.count_nonzero(donor_mask) != 0 and \
188
+ np.count_nonzero(acceptor_mask) != 0:
189
+ # Calculate triplets and mask
190
+ triplets, mask = _hbond(
191
+ atoms, donor_mask, acceptor_mask,
192
+ donor_element_mask, acceptor_element_mask,
193
+ cutoff_dist, cutoff_angle,
194
+ box
195
+ )
196
+ all_comb_triplets.append(triplets)
197
+ all_comb_mask.append(mask)
198
+ # Merge results from all combinations
199
+ triplets = np.concatenate(all_comb_triplets, axis=0)
200
+ mask = np.concatenate(all_comb_mask, axis=1)
201
+
202
+ elif selection1_type == 'donor':
203
+ triplets, mask = _hbond(
204
+ atoms, selection1, selection2,
205
+ donor_element_mask, acceptor_element_mask,
206
+ cutoff_dist, cutoff_angle,
207
+ box
208
+ )
209
+
210
+ elif selection1_type == 'acceptor':
211
+ triplets, mask = _hbond(
212
+ atoms, selection2, selection1,
213
+ donor_element_mask, acceptor_element_mask,
214
+ cutoff_dist, cutoff_angle,
215
+ box
216
+ )
217
+
218
+ else:
219
+ raise ValueError(f"Unkown selection type '{selection1_type}'")
220
+
221
+ if single_model:
222
+ # For a atom array (not stack),
223
+ # hbond_mask contains only 'True' values,
224
+ # since all interaction are in the one model
225
+ # -> Simply return triplets without hbond_mask
226
+ return triplets
227
+ else:
228
+ return triplets, mask
229
+
230
+
231
+ def _hbond(atoms, donor_mask, acceptor_mask,
232
+ donor_element_mask, acceptor_element_mask,
233
+ cutoff_dist, cutoff_angle, box):
234
+
235
+ # Filter donor/acceptor elements
236
+ donor_mask &= donor_element_mask
237
+ acceptor_mask &= acceptor_element_mask
238
+
239
+ first_model_box = box[0] if box is not None else None
240
+ if atoms.bonds is not None:
241
+ donor_h_mask, associated_donor_indices = _get_bonded_h(
242
+ atoms[0], donor_mask, atoms.bonds
243
+ )
244
+ else:
245
+ warnings.warn(
246
+ "Input structure has no associated 'BondList', "
247
+ "Hydrogen atoms bonded to donors are detected by distance"
248
+ )
249
+ donor_h_mask, associated_donor_indices = _get_bonded_h_via_distance(
250
+ atoms[0], donor_mask, first_model_box
251
+ )
252
+ donor_h_i = np.where(donor_h_mask)[0]
253
+ acceptor_i = np.where(acceptor_mask)[0]
254
+ if len(donor_h_i) == 0 or len(acceptor_i) == 0:
255
+ # Return empty triplets and mask
256
+ return (
257
+ np.zeros((0,3), dtype=int),
258
+ np.zeros((atoms.stack_depth(),0), dtype=bool)
259
+ )
260
+
261
+ # Narrow the amount of possible acceptor to donor-H connections
262
+ # down via the distance cutoff parameter using a cell list
263
+ # Save in acceptor-to-hydrogen matrix
264
+ # (true when distance smaller than cutoff)
265
+ coord = atoms.coord
266
+ possible_bonds = np.zeros(
267
+ (len(acceptor_i), len(donor_h_i)),
268
+ dtype=bool
269
+ )
270
+ periodic = False if box is None else True
271
+ for model_i in range(atoms.stack_depth()):
272
+ donor_h_coord = coord[model_i, donor_h_mask]
273
+ acceptor_coord = coord[model_i, acceptor_mask]
274
+ box_for_model = box[model_i] if box is not None else None
275
+ cell_list = CellList(
276
+ donor_h_coord, cell_size=cutoff_dist,
277
+ periodic=periodic, box=box_for_model
278
+ )
279
+ possible_bonds |= cell_list.get_atoms_in_cells(
280
+ acceptor_coord, as_mask=True
281
+ )
282
+ possible_bonds_i = np.where(possible_bonds)
283
+ # Narrow down
284
+ acceptor_i = acceptor_i[possible_bonds_i[0]]
285
+ donor_h_i = donor_h_i[possible_bonds_i[1]]
286
+
287
+ # Build D-H..A triplets
288
+ donor_i = associated_donor_indices[donor_h_i]
289
+ triplets = np.stack((donor_i, donor_h_i, acceptor_i), axis=1)
290
+ # Remove entries where donor and acceptor are the same
291
+ triplets = triplets[donor_i != acceptor_i]
292
+
293
+ hbond_mask = _is_hbond(
294
+ coord[:, triplets[:,0]], # donors
295
+ coord[:, triplets[:,1]], # donor hydrogens
296
+ coord[:, triplets[:,2]], # acceptors
297
+ box, cutoff_dist=cutoff_dist, cutoff_angle=cutoff_angle
298
+ )
299
+
300
+ # Reduce output to contain only triplets counted at least once
301
+ is_counted = hbond_mask.any(axis=0)
302
+ triplets = triplets[is_counted]
303
+ hbond_mask = hbond_mask[:, is_counted]
304
+
305
+ return triplets, hbond_mask
306
+
307
+
308
+ def _get_bonded_h(array, donor_mask, bonds):
309
+ """
310
+ Helper function to find indices of associated hydrogens in atoms for
311
+ all donors in atoms[donor_mask].
312
+ A `BondsList` is used for detecting bonded hydrogen atoms.
313
+ """
314
+ hydrogen_mask = (array.element == "H")
315
+
316
+ donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
317
+ associated_donor_indices = np.full(len(array), -1, dtype=int)
318
+
319
+ all_bond_indices, _ = bonds.get_all_bonds()
320
+ donor_indices = np.where(donor_mask)[0]
321
+
322
+ for donor_i in donor_indices:
323
+ bonded_indices = all_bond_indices[donor_i]
324
+ # Remove padding values
325
+ bonded_indices = bonded_indices[bonded_indices != -1]
326
+ # Filter hydrogen atoms
327
+ bonded_indices = bonded_indices[hydrogen_mask[bonded_indices]]
328
+ donor_hydrogen_mask[bonded_indices] = True
329
+ associated_donor_indices[bonded_indices] = donor_i
330
+
331
+ return donor_hydrogen_mask, associated_donor_indices
332
+
333
+
334
+ def _get_bonded_h_via_distance(array, donor_mask, box):
335
+ """
336
+ Helper function to find indices of associated hydrogens in atoms for
337
+ all donors in atoms[donor_mask].
338
+ The criterium is that the hydrogen must be in the same residue and
339
+ the distance must be smaller than the cutoff.
340
+ """
341
+ CUTOFF = 1.5
342
+
343
+ coord = array.coord
344
+ res_id = array.res_id
345
+ hydrogen_mask = (array.element == "H")
346
+
347
+ donor_hydrogen_mask = np.zeros(len(array), dtype=bool)
348
+ associated_donor_indices = np.full(len(array), -1, dtype=int)
349
+
350
+ donor_indices = np.where(donor_mask)[0]
351
+ for donor_i in donor_indices:
352
+ candidate_mask = hydrogen_mask & (res_id == res_id[donor_i])
353
+ distances = distance(
354
+ coord[donor_i], coord[candidate_mask], box=box
355
+ )
356
+ donor_h_indices = np.where(candidate_mask)[0][distances <= CUTOFF]
357
+ for i in donor_h_indices:
358
+ associated_donor_indices[i] = donor_i
359
+ donor_hydrogen_mask[i] = True
360
+
361
+ return donor_hydrogen_mask, associated_donor_indices
362
+
363
+
364
+ def _is_hbond(donor, donor_h, acceptor, box, cutoff_dist, cutoff_angle):
365
+ """
366
+ Filter triplets that meet distance and angle condition.
367
+ """
368
+ cutoff_angle_rad = np.deg2rad(cutoff_angle)
369
+ theta = angle(donor, donor_h, acceptor, box=box)
370
+ dist = distance(donor_h, acceptor, box=box)
371
+ return (theta > cutoff_angle_rad) & (dist <= cutoff_dist)
372
+
373
+
374
+ def hbond_frequency(mask):
375
+ """
376
+ Get the relative frequency of each hydrogen bond in a multi-model
377
+ structure.
378
+
379
+ The frequency is the amount of models, where the respective bond
380
+ exists divided by the total amount of models.
381
+
382
+ Parameters
383
+ ----------
384
+ mask: ndarray, dtype=bool, shape=(m,n)
385
+ Input mask obtained from `hbond` function.
386
+
387
+ Returns
388
+ -------
389
+ ndarray, dtype=Float
390
+ For each individual interaction *n* of the mask, returns the
391
+ percentage of models *m*, in which this hydrogen bond is
392
+ present.
393
+
394
+ See Also
395
+ --------
396
+ hbond
397
+
398
+ Examples
399
+ --------
400
+
401
+ >>> triplets, mask = hbond(atom_array_stack)
402
+ >>> freq = hbond_frequency(mask)
403
+ >>> print(freq)
404
+ [0.263 0.289 0.105 0.105 0.237 0.026 0.053 0.395 1.000 1.000 1.000 0.026
405
+ 0.421 0.026 0.026 0.316 0.816 0.026 0.921 0.026 0.342 0.026 0.105 0.026
406
+ 0.132 0.053 0.026 0.158 0.026 0.868 0.211 0.026 0.921 0.316 0.079 0.237
407
+ 0.105 0.421 0.079 0.026 1.000 0.053 0.132 0.026 0.184]
408
+ """
409
+ return mask.sum(axis=0)/len(mask)
@@ -0,0 +1,25 @@
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 .groups import *
18
+
19
+ from .atoms import *
20
+ from .bonds import *
21
+ from .groups import *
22
+ from .masses import *
23
+ from .misc import *
24
+ from .radii import *
25
+ 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,82 @@
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
+ from .ccd import get_ccd
10
+
11
+
12
+ non_hetero_residues = set([
13
+ "ALA","ARG","ASN","ASP","CYS","GLN","GLU","GLY","HIS",
14
+ "ILE","LEU","LYS","MET","PHE","PRO","PYL","SER","THR",
15
+ "TRP","TYR","VAL", "SEC",
16
+ "A", "DA", "G", "DG", "C", "DC", "U", "DT",
17
+ ])
18
+
19
+
20
+ def residue(res_name):
21
+ """
22
+ Get an atom array, representing the residue with the given name.
23
+
24
+ This atom array includes proper values for the ``residue_name``,
25
+ ``hetero``, ``atom_name``, ``element`` and ``charge`` annotation
26
+ arrays and bonds and coordinates.
27
+
28
+ Parameters
29
+ ----------
30
+ res_name : str
31
+ The up to 3-letter name of the residue.
32
+
33
+ Returns
34
+ -------
35
+ atom_array : AtomArray
36
+ The atom array described by `res_name`.
37
+
38
+ Examples
39
+ --------
40
+
41
+ >>> alanine = residue("ALA")
42
+ >>> # Atoms and geometry
43
+ >>> print(alanine)
44
+ 0 ALA N N -0.970 0.490 1.500
45
+ 0 ALA CA C 0.260 0.420 0.690
46
+ 0 ALA C C -0.090 0.020 -0.720
47
+ 0 ALA O O -1.060 -0.680 -0.920
48
+ 0 ALA CB C 1.200 -0.620 1.300
49
+ 0 ALA OXT O 0.660 0.440 -1.740
50
+ 0 ALA H H -1.380 -0.420 1.480
51
+ 0 ALA H2 H -0.680 0.660 2.450
52
+ 0 ALA HA H 0.750 1.390 0.680
53
+ 0 ALA HB1 H 1.460 -0.330 2.320
54
+ 0 ALA HB2 H 0.720 -1.590 1.310
55
+ 0 ALA HB3 H 2.110 -0.680 0.700
56
+ 0 ALA HXT H 0.440 0.180 -2.650
57
+ >>> # Bonds
58
+ >>> print(alanine.atom_name[alanine.bonds.as_array()[:,:2]])
59
+ [['N' 'CA']
60
+ ['N' 'H']
61
+ ['N' 'H2']
62
+ ['CA' 'C']
63
+ ['CA' 'CB']
64
+ ['CA' 'HA']
65
+ ['C' 'O']
66
+ ['C' 'OXT']
67
+ ['CB' 'HB1']
68
+ ['CB' 'HB2']
69
+ ['CB' 'HB3']
70
+ ['OXT' 'HXT']]
71
+ """
72
+ # Avoid circular import
73
+ from ..io.pdbx import get_component
74
+
75
+ try:
76
+ component = get_component(get_ccd(), res_name=res_name)
77
+ except KeyError:
78
+ raise KeyError(
79
+ f"No atom information found for residue '{res_name}' in CCD"
80
+ )
81
+ component.hetero[:] = res_name not in non_hetero_residues
82
+ return component