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,521 @@
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 one function for the computation of the partial
7
+ charges of the individual atoms of a given AtomArray according to the
8
+ PEOE algorithm of Gasteiger-Marsili.
9
+ """
10
+
11
+ __name__ = "biotite.structure"
12
+ __author__ = "Jacob Marcel Anter, Patrick Kunzmann"
13
+ __all__ = ["partial_charges"]
14
+
15
+ cimport numpy as np
16
+ from libc.math cimport isnan
17
+
18
+ import warnings
19
+ import numpy as np
20
+ from .bonds import BondType
21
+ from .filter import filter_heavy
22
+
23
+
24
+ ctypedef np.float32_t float32
25
+ ctypedef np.uint32_t uint32
26
+ ctypedef np.int8_t int8
27
+ ctypedef np.int64_t int64
28
+
29
+
30
+ cdef float32 NAN = np.nan
31
+ # Conversion of Enum into int for faster comparison in _get_parameters()
32
+ cdef uint32 ANY = BondType.ANY
33
+
34
+
35
+ # Creating two dictionaries to retrieve parameters for electronegativity
36
+ # computation from
37
+ # The first dictionary uses BondTypes as keys, whereas the second uses
38
+ # the amounts of binding partners as keys
39
+ # First level of dictionaries represents the atom name and the second
40
+ # level represents the hybridisation state
41
+ # Depending on whether the bond type is unequal to zero or not,
42
+ # identification of the hybridisation state is either performed via the
43
+ # first dictionary, i. e. the bond type (primary way of identification
44
+ # since erroneous results are excluded) or via the second dictionary,
45
+ # i. e. amount of binding partners (erroneous if a binding partner is
46
+ # lost or added whilst the hybridisation remains unchanged as it is the
47
+ # case with acids or bases, e. g. the hydroxyl group in a carboxyl
48
+ # group: When the proton involved in the hydroxyl group is donated, the
49
+ # amount of binding partners of the remaining oxygen is one; this would
50
+ # erroneously lead to an identification of the hybridisation state as
51
+ # sp2 although it is still sp3)
52
+ cdef dict EN_PARAM_BTYPE = {
53
+ "H": {
54
+ int(BondType.SINGLE): (7.17, 6.24, -0.56)
55
+ },
56
+
57
+ "C": {
58
+ int(BondType.SINGLE): (7.98, 9.18, 1.88),
59
+ int(BondType.DOUBLE): (8.79, 9.18, 1.88),
60
+ int(BondType.TRIPLE): (10.39, 9.45, 0.73),
61
+ int(BondType.AROMATIC_SINGLE): (7.98, 9.18, 1.88),
62
+ int(BondType.AROMATIC_DOUBLE): (8.79, 9.18, 1.88)
63
+ },
64
+
65
+ "N": {
66
+ int(BondType.SINGLE): (11.54, 10.82, 1.36),
67
+ int(BondType.DOUBLE): (12.87, 11.15, 0.85),
68
+ int(BondType.TRIPLE): (15.68, 11.7, -0.27),
69
+ int(BondType.AROMATIC_SINGLE): (11.54, 10.82, 1.36),
70
+ int(BondType.AROMATIC_DOUBLE): (12.87, 11.15, 0.85)
71
+ },
72
+
73
+ # As oxygen and sulfur are exclusively involved in aromatic
74
+ # systems having single bonds on either side, the values for a
75
+ # sp3 hybridisation are taken for BondType.AROMATIC_SINGLE
76
+ "O": {
77
+ int(BondType.SINGLE): (14.18, 12.92, 1.39),
78
+ int(BondType.DOUBLE): (17.07, 13.79, 0.47),
79
+ int(BondType.AROMATIC_SINGLE): (14.18, 12.92, 1.39)
80
+ },
81
+
82
+ "S": {
83
+ int(BondType.SINGLE): (10.14, 9.13, 1.38),
84
+ int(BondType.AROMATIC_SINGLE): (10.14, 9.13, 1.38)
85
+ },
86
+
87
+ "F": {
88
+ int(BondType.SINGLE): (14.66, 13.85, 2.31)
89
+ },
90
+
91
+ "Cl": {
92
+ int(BondType.SINGLE): (11.00, 9.69, 1.35)
93
+ },
94
+
95
+ "Br": {
96
+ int(BondType.SINGLE): (10.08, 8.47, 1.16)
97
+ },
98
+
99
+ "I": {
100
+ int(BondType.SINGLE): (9.90, 7.96, 0.96)
101
+ }
102
+ }
103
+
104
+ cdef dict EN_PARAM_BPARTNERS = {
105
+ "H": {
106
+ 1: (7.17, 6.24, -0.56)
107
+ },
108
+
109
+ "C": {
110
+ 4: (7.98, 9.18, 1.88),
111
+ 3: (8.79, 9.18, 1.88),
112
+ 2: (10.39, 9.45, 0.73)
113
+ },
114
+
115
+ "N": {
116
+ # Considering protonated, e. g. in terminal
117
+ # amino group (4 binding partners), as well
118
+ # as unprotonated nitrogen (3 binding partners)
119
+ 4: (11.54, 10.82, 1.36),
120
+ 3: (11.54, 10.82, 1.36),
121
+ 2: (12.87, 11.15, 0.85),
122
+ 1: (15.68, 11.7, -0.27)
123
+ },
124
+
125
+ "O": {
126
+ 2: (14.18, 12.92, 1.39),
127
+ 1: (17.07, 13.79, 0.47)
128
+ },
129
+
130
+ "S": {
131
+ 2: (10.14, 9.13, 1.38)
132
+ },
133
+
134
+ "F": {
135
+ 1: (14.66, 13.85, 2.31)
136
+ },
137
+
138
+ "Cl": {
139
+ 1: (11.00, 9.69, 1.35)
140
+ },
141
+
142
+ "Br": {
143
+ 1: (10.08, 8.47, 1.16)
144
+ },
145
+
146
+ "I": {
147
+ 1: (9.90, 7.96, 0.96)
148
+ }
149
+ }
150
+
151
+
152
+ # Defining constant for the special case of the electronegativity of
153
+ # positively charged hydrogen (value given in electronvolt, as all
154
+ # electronegativity values)
155
+ EN_POS_HYDROGEN = 20.02
156
+
157
+
158
+ def _get_parameters(elements, bond_types, amount_of_binding_partners):
159
+ """
160
+ Gather the parameters required for electronegativity computation of
161
+ all atoms comprised in the input array `elements`.
162
+
163
+ By doing so, the function accesses the nested dictionary
164
+ ``EN_PARAMETERS``. The values originate from a publication of Johann
165
+ Gasteiger and Mario Marsili.
166
+
167
+ Parameters
168
+ ----------
169
+ elements: ndarray, dtype=str
170
+ The array comprising the elements which to retrieve the
171
+ parameters for.
172
+ bond_types: ndarray, dtype=int
173
+ The array containing information about the highest bond type of
174
+ the respective atom (except for the aromatic bond types).
175
+ amount_of_binding_partners: ndarray, dtype=int
176
+ The array containing information about the amount of binding
177
+ partners of the respective atom.
178
+
179
+ Returns
180
+ -------
181
+ parameters: NumPy array, dtype=float, shape=(n,3)
182
+ The array containing all three parameters required for the
183
+ computation of the electronegativities of all atoms comprised
184
+ in the `elements` array.
185
+ """
186
+ cdef int i
187
+ cdef float32 a, b, c
188
+ cdef int8[:] bond_types_v = bond_types
189
+ cdef int64[:] amount_of_binding_partners_v = amount_of_binding_partners
190
+
191
+ parameters = np.zeros((elements.shape[0], 3), dtype=np.float32)
192
+ cdef float32[:,:] parameters_v = parameters
193
+
194
+ has_atom_key_error = False
195
+ has_valence_key_error = False
196
+ # Preparing warning in case of KeyError
197
+ # It is differentiated between atoms that are not parametrized at
198
+ # all and specific valence states that are parametrized
199
+ list_of_unparametrized_elements = []
200
+ unparametrized_valences = []
201
+ unparam_valence_names = []
202
+ list_of_atoms_without_specified_btype = []
203
+
204
+ for i, element in enumerate(elements):
205
+ # Considering the special case of ions
206
+ if amount_of_binding_partners_v[i] == 0:
207
+ parameters_v[i, :] = np.nan
208
+ continue
209
+ if bond_types_v[i] == ANY:
210
+ list_of_atoms_without_specified_btype.append(str(i))
211
+ try:
212
+ a, b, c = EN_PARAM_BPARTNERS[element] \
213
+ [amount_of_binding_partners_v[i]]
214
+ parameters_v[i, 0] = a
215
+ parameters_v[i, 1] = b
216
+ parameters_v[i, 2] = c
217
+ except KeyError:
218
+ try:
219
+ EN_PARAM_BPARTNERS[element]
220
+ except KeyError:
221
+ list_of_unparametrized_elements.append(element)
222
+ has_atom_key_error = True
223
+ else:
224
+ # The warning message printed in case of
225
+ # unparametrized valence states contains its main
226
+ # information in a table with three columns:
227
+ # The first column represents the element, the
228
+ # second the amount of binding partners and the
229
+ # third the BondType
230
+ # The primary way of identifying unparametrized
231
+ # valence states that is aimed at is via the
232
+ # BondType; if this is possible, the space beneath
233
+ # the column representing the amount of binding
234
+ # partners is padded with a respective amount the
235
+ # '-' (hyphen) character
236
+ # If not, the space beneath the column representing
237
+ # the BondTypes is padded with a respective amount
238
+ # of hyphens
239
+ # At either case, an appropriate amount of
240
+ # whitespace is added in order to ensure that the
241
+ # respective entries appear directly under the
242
+ # respective columns
243
+ unparam_valence_names.append(element)
244
+ unparametrized_valences.append(
245
+ str(amount_of_binding_partners_v[i])
246
+ +
247
+ " " * 31
248
+ +
249
+ "-" * 10
250
+ )
251
+ has_valence_key_error = True
252
+ parameters_v[i, :] = np.nan
253
+ else:
254
+ try:
255
+ a, b, c = EN_PARAM_BTYPE[element][bond_types_v[i]]
256
+ parameters_v[i, 0] = a
257
+ parameters_v[i, 1] = b
258
+ parameters_v[i, 2] = c
259
+ except KeyError:
260
+ try:
261
+ EN_PARAM_BTYPE[element]
262
+ except KeyError:
263
+ list_of_unparametrized_elements.append(element)
264
+ has_atom_key_error = True
265
+ else:
266
+ unparam_valence_names.append(element)
267
+ unparametrized_valences.append(
268
+ "-" * 27
269
+ +
270
+ " " * 5
271
+ +
272
+ str(bond_types_v[i])
273
+ )
274
+ has_valence_key_error = True
275
+ parameters_v[i, :] = np.nan
276
+
277
+
278
+ # Error and warning handling
279
+ if np.all(bond_types == BondType.ANY):
280
+ warnings.warn(
281
+ f"Each atom's bond type is 0 (any). Therefore, it is "
282
+ f"resorted to the amount of binding partners for the "
283
+ f"identification of the hybridisation state which can lead "
284
+ f"to erroneous results.",
285
+ UserWarning
286
+ )
287
+ elif np.any(bond_types == BondType.ANY):
288
+ warnings.warn(
289
+ f"Some atoms' bond type is unspecified, i. e. the bond "
290
+ f"type is given as `any`. For these atoms, identification "
291
+ f"of the hybridisation state is performed via the amount "
292
+ f"of binding partners which can lead to erroneous results."
293
+ f"\n\n"
294
+ f"In detail, these atoms possess the following indices: \n"
295
+ f"{', '. join(list_of_atoms_without_specified_btype)}.",
296
+ UserWarning
297
+ )
298
+
299
+ if has_valence_key_error:
300
+ joined_list = []
301
+ for i in range(len(unparam_valence_names)):
302
+ joined_list.append(
303
+ unparam_valence_names[i].ljust(2, ' ')
304
+ +
305
+ " " * 8
306
+ )
307
+ joined_list.append(unparametrized_valences[i] + "\n")
308
+ joined_array = np.reshape(
309
+ joined_list,
310
+ (int(len(joined_list) / 2), 2)
311
+ )
312
+ joined_array = np.unique(joined_array, axis=0)
313
+ # Array must be flattened in order ro be able to apply the
314
+ # 'join' method
315
+ flattened_joined_array = np.reshape(
316
+ joined_array, (2*joined_array.shape[0])
317
+ )
318
+ warnings.warn(
319
+ f"Parameters for specific valence states of some atoms "
320
+ f"are not available. These valence states are: \n"
321
+ f"Atom: Amount of binding partners: Bond type:\n"
322
+ f"{''.join(flattened_joined_array)}"
323
+ f"Their electronegativity is given as NaN.",
324
+ UserWarning
325
+ )
326
+
327
+ if has_atom_key_error:
328
+ # Using NumPy's 'unique' function to ensure that each atom only
329
+ # occurs once in the list
330
+ unique_list = np.unique(list_of_unparametrized_elements)
331
+ # Considering proper punctuation for the warning string
332
+ warnings.warn(
333
+ f"Parameters required for computation of "
334
+ f"electronegativity aren't available for the following "
335
+ f"atoms: {', '.join(unique_list)}. "
336
+ f"Their electronegativity is given as NaN.",
337
+ UserWarning
338
+ )
339
+
340
+
341
+ return parameters
342
+
343
+
344
+ def partial_charges(atom_array, int iteration_step_num=6, charges=None):
345
+ """
346
+ partial_charges(atom_array, iteration_step_num=6, charges=None)
347
+
348
+ Compute the partial charge of the individual atoms comprised in a
349
+ given :class:`AtomArray` depending on their electronegativity.
350
+
351
+ This function implements the
352
+ *partial equalization of orbital electronegativity* (PEOE)
353
+ algorithm :footcite:`Gasteiger1980`.
354
+
355
+ Parameters
356
+ ----------
357
+ atom_array: AtomArray, shape=(n,)
358
+ The :class:`AtomArray` to get the partial charge values for.
359
+ Must have an associated `BondList`.
360
+ iteration_step_num: int, optional
361
+ The number of iteration steps is an optional argument and can be
362
+ chosen by the user depending on the desired precision of the
363
+ result. If no value is entered by the user, the default value
364
+ ``6`` will be used.
365
+ Gasteiger and Marsili described this number as sufficient.
366
+ charges: ndarray, dtype=int, optional
367
+ The array comprising the formal charges of the atoms in the
368
+ input `atom_array`.
369
+ If none is given, the ``charge`` annotation category of the
370
+ input `atom_array` is used.
371
+ If neither of them is given, the formal charges of all atoms
372
+ will be arbitrarily set to zero.
373
+
374
+ Returns
375
+ -------
376
+ charges: ndarray, dtype=float32
377
+ The partial charge values of the individual atoms in the input
378
+ `atom_array`.
379
+
380
+ Notes
381
+ -----
382
+ A :class:`BondList` must be associated to the input
383
+ :class:`AtomArray`.
384
+ Otherwise, an error will be raised.
385
+ Example:
386
+
387
+ .. code-block:: python
388
+
389
+ atom_array.bonds = struc.connect_via_residue_names(atom_array)
390
+
391
+ |
392
+
393
+ For the electronegativity of positively charged hydrogen, the
394
+ value of 20.02 eV is used.
395
+
396
+ Also note that the algorithm used in this function does not deliver
397
+ proper results for expanded pi-electron systems like aromatic rings.
398
+
399
+ References
400
+ ----------
401
+
402
+ .. footbibliography::
403
+
404
+ Examples
405
+ --------
406
+
407
+ >>> fluoromethane = residue("CF0")
408
+ >>> print(fluoromethane.atom_name)
409
+ ['C1' 'F1' 'H1' 'H2' 'H3']
410
+ >>> print(partial_charges(fluoromethane, iteration_step_num=1))
411
+ [ 0.115 -0.175 0.020 0.020 0.020]
412
+ >>> print(partial_charges(fluoromethane, iteration_step_num=6))
413
+ [ 0.079 -0.253 0.058 0.058 0.058]
414
+ """
415
+ if atom_array.bonds is None:
416
+ raise AttributeError(
417
+ f"The input AtomArray doesn't possess an associated "
418
+ f"BondList."
419
+ )
420
+
421
+ if charges is None:
422
+ try:
423
+ # Implicitly this creates a copy of the charges
424
+ charges = atom_array.charge.astype(np.float32)
425
+ except AttributeError:
426
+ charges = np.zeros(atom_array.shape[0], dtype=np.float32)
427
+ warnings.warn(
428
+ f"A charge array was neither given as optional "
429
+ f"argument, nor does a charge annotation of the "
430
+ f"inserted AtomArray exist. Therefore, all atoms' "
431
+ f"formal charge is assumed to be zero.",
432
+ UserWarning
433
+ )
434
+ cdef float32[:] charges_v = charges
435
+
436
+ elements = atom_array.element
437
+ bonds, types = atom_array.bonds.get_all_bonds()
438
+ amount_of_binding_partners = np.count_nonzero(bonds != -1, axis=1) \
439
+ .astype(np.int64, copy=False)
440
+ # The maximum of a given row of the `types` array must be determined
441
+ # as this value reveals the hybridisation state
442
+ # An atom's overall BondType is assumed to be ANY as soon as one
443
+ # BondType.ANY occurs
444
+ if types.shape[1] == 0:
445
+ # No bonds between atoms
446
+ # -> types has shape (n,0)
447
+ # -> np.amax() raises ValueError
448
+ # This is the case e. g. if AtomArray exclusively contains ions
449
+ # In this case partial charges are equal to formal charges
450
+ return charges
451
+ bond_types = np.amax(types, axis=1)
452
+ bond_types[np.any(types == BondType.ANY, axis=1)] = BondType.ANY
453
+ parameters = _get_parameters(
454
+ elements, bond_types, amount_of_binding_partners
455
+ )
456
+
457
+ # Computing electronegativity values in case of positive charge
458
+ # which enter as divisor the equation for charge transfer
459
+ pos_en_values = np.sum(parameters, axis=1)
460
+ # Substituting values for hydrogen with the special value
461
+ pos_en_values[~filter_heavy(atom_array)] = EN_POS_HYDROGEN
462
+ cdef float32[:] pos_en_values_v = pos_en_values
463
+
464
+
465
+ cdef float32 damping = 1.0
466
+ cdef float32 divisor
467
+ cdef float32 charge_transfer
468
+ cdef uint32[:,:] bonds_v = atom_array.bonds.as_array()
469
+ cdef int bond_index
470
+ # Indices to atoms involved in a bonds
471
+ cdef uint32 i, j
472
+ cdef float32[:] en_values_v
473
+
474
+ for _ in range(iteration_step_num):
475
+ # In the beginning of each iteration step, the damping factor is
476
+ # halved in order to guarantee rapid convergence
477
+ damping *= 0.5
478
+ # Calculate electronegativity via vectorization:
479
+ # X = a + bQ + cQ^2
480
+ charge_factor = np.stack((
481
+ np.ones(atom_array.array_length()),
482
+ charges,
483
+ charges**2
484
+ ), axis=-1)
485
+ en_values_v = np.sum(
486
+ parameters * charge_factor,
487
+ axis=1, dtype=np.float32
488
+ )
489
+ # Iterate over bonds to transfer charges
490
+ # based on new electronegativity values
491
+ for bond_index in range(bonds_v.shape[0]):
492
+ i = bonds_v[bond_index, 0]
493
+ j = bonds_v[bond_index, 1]
494
+ # For atoms that are not available in the dictionary,
495
+ # but which are incorporated into molecules,
496
+ # the partial charge is set to NaN
497
+ if isnan(en_values_v[i]) or isnan(en_values_v[j]):
498
+ # Determining for which atom exactly no parameters are
499
+ # available is necessary since the other atom, for which
500
+ # there indeed are parameters, could be involved in
501
+ # multiple bonds.
502
+ # Therefore, setting both charges to NaN would falsify
503
+ # the result.
504
+ # The case that both atoms are not parametrized must be
505
+ # considered as well.
506
+ if isnan(en_values_v[i]):
507
+ charges_v[i] = NAN
508
+ if isnan(en_values_v[j]):
509
+ charges_v[j] = NAN
510
+ else:
511
+ if en_values_v[j] > en_values_v[i]:
512
+ divisor = pos_en_values_v[i]
513
+ else:
514
+ divisor = pos_en_values_v[j]
515
+ charge_transfer = (
516
+ (en_values_v[j] - en_values_v[i]) / divisor
517
+ ) * damping
518
+ charges_v[i] += charge_transfer
519
+ charges_v[j] -= charge_transfer
520
+
521
+ return charges