biotite 1.5.0__cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of biotite might be problematic. Click here for more details.

Files changed (354) hide show
  1. biotite/__init__.py +18 -0
  2. biotite/application/__init__.py +69 -0
  3. biotite/application/application.py +276 -0
  4. biotite/application/autodock/__init__.py +12 -0
  5. biotite/application/autodock/app.py +500 -0
  6. biotite/application/blast/__init__.py +14 -0
  7. biotite/application/blast/alignment.py +92 -0
  8. biotite/application/blast/webapp.py +428 -0
  9. biotite/application/clustalo/__init__.py +12 -0
  10. biotite/application/clustalo/app.py +223 -0
  11. biotite/application/dssp/__init__.py +12 -0
  12. biotite/application/dssp/app.py +216 -0
  13. biotite/application/localapp.py +342 -0
  14. biotite/application/mafft/__init__.py +12 -0
  15. biotite/application/mafft/app.py +116 -0
  16. biotite/application/msaapp.py +363 -0
  17. biotite/application/muscle/__init__.py +13 -0
  18. biotite/application/muscle/app3.py +227 -0
  19. biotite/application/muscle/app5.py +163 -0
  20. biotite/application/sra/__init__.py +18 -0
  21. biotite/application/sra/app.py +447 -0
  22. biotite/application/tantan/__init__.py +12 -0
  23. biotite/application/tantan/app.py +199 -0
  24. biotite/application/util.py +77 -0
  25. biotite/application/viennarna/__init__.py +18 -0
  26. biotite/application/viennarna/rnaalifold.py +310 -0
  27. biotite/application/viennarna/rnafold.py +254 -0
  28. biotite/application/viennarna/rnaplot.py +208 -0
  29. biotite/application/viennarna/util.py +77 -0
  30. biotite/application/webapp.py +76 -0
  31. biotite/copyable.py +71 -0
  32. biotite/database/__init__.py +23 -0
  33. biotite/database/afdb/__init__.py +12 -0
  34. biotite/database/afdb/download.py +197 -0
  35. biotite/database/entrez/__init__.py +15 -0
  36. biotite/database/entrez/check.py +60 -0
  37. biotite/database/entrez/dbnames.py +101 -0
  38. biotite/database/entrez/download.py +228 -0
  39. biotite/database/entrez/key.py +44 -0
  40. biotite/database/entrez/query.py +263 -0
  41. biotite/database/error.py +16 -0
  42. biotite/database/pubchem/__init__.py +21 -0
  43. biotite/database/pubchem/download.py +258 -0
  44. biotite/database/pubchem/error.py +30 -0
  45. biotite/database/pubchem/query.py +819 -0
  46. biotite/database/pubchem/throttle.py +98 -0
  47. biotite/database/rcsb/__init__.py +13 -0
  48. biotite/database/rcsb/download.py +161 -0
  49. biotite/database/rcsb/query.py +963 -0
  50. biotite/database/uniprot/__init__.py +13 -0
  51. biotite/database/uniprot/check.py +40 -0
  52. biotite/database/uniprot/download.py +126 -0
  53. biotite/database/uniprot/query.py +292 -0
  54. biotite/file.py +244 -0
  55. biotite/interface/__init__.py +19 -0
  56. biotite/interface/openmm/__init__.py +20 -0
  57. biotite/interface/openmm/state.py +93 -0
  58. biotite/interface/openmm/system.py +227 -0
  59. biotite/interface/pymol/__init__.py +201 -0
  60. biotite/interface/pymol/cgo.py +346 -0
  61. biotite/interface/pymol/convert.py +185 -0
  62. biotite/interface/pymol/display.py +267 -0
  63. biotite/interface/pymol/object.py +1228 -0
  64. biotite/interface/pymol/shapes.py +178 -0
  65. biotite/interface/pymol/startup.py +169 -0
  66. biotite/interface/rdkit/__init__.py +19 -0
  67. biotite/interface/rdkit/mol.py +490 -0
  68. biotite/interface/version.py +94 -0
  69. biotite/interface/warning.py +19 -0
  70. biotite/sequence/__init__.py +84 -0
  71. biotite/sequence/align/__init__.py +199 -0
  72. biotite/sequence/align/alignment.py +702 -0
  73. biotite/sequence/align/banded.cpython-313-x86_64-linux-gnu.so +0 -0
  74. biotite/sequence/align/banded.pyx +652 -0
  75. biotite/sequence/align/buckets.py +71 -0
  76. biotite/sequence/align/cigar.py +425 -0
  77. biotite/sequence/align/kmeralphabet.cpython-313-x86_64-linux-gnu.so +0 -0
  78. biotite/sequence/align/kmeralphabet.pyx +595 -0
  79. biotite/sequence/align/kmersimilarity.cpython-313-x86_64-linux-gnu.so +0 -0
  80. biotite/sequence/align/kmersimilarity.pyx +233 -0
  81. biotite/sequence/align/kmertable.cpython-313-x86_64-linux-gnu.so +0 -0
  82. biotite/sequence/align/kmertable.pyx +3411 -0
  83. biotite/sequence/align/localgapped.cpython-313-x86_64-linux-gnu.so +0 -0
  84. biotite/sequence/align/localgapped.pyx +892 -0
  85. biotite/sequence/align/localungapped.cpython-313-x86_64-linux-gnu.so +0 -0
  86. biotite/sequence/align/localungapped.pyx +279 -0
  87. biotite/sequence/align/matrix.py +631 -0
  88. biotite/sequence/align/matrix_data/3Di.mat +24 -0
  89. biotite/sequence/align/matrix_data/BLOSUM100.mat +31 -0
  90. biotite/sequence/align/matrix_data/BLOSUM30.mat +31 -0
  91. biotite/sequence/align/matrix_data/BLOSUM35.mat +31 -0
  92. biotite/sequence/align/matrix_data/BLOSUM40.mat +31 -0
  93. biotite/sequence/align/matrix_data/BLOSUM45.mat +31 -0
  94. biotite/sequence/align/matrix_data/BLOSUM50.mat +31 -0
  95. biotite/sequence/align/matrix_data/BLOSUM50_13p.mat +25 -0
  96. biotite/sequence/align/matrix_data/BLOSUM50_14.3.mat +25 -0
  97. biotite/sequence/align/matrix_data/BLOSUM50_5.0.mat +25 -0
  98. biotite/sequence/align/matrix_data/BLOSUM55.mat +31 -0
  99. biotite/sequence/align/matrix_data/BLOSUM60.mat +31 -0
  100. biotite/sequence/align/matrix_data/BLOSUM62.mat +31 -0
  101. biotite/sequence/align/matrix_data/BLOSUM62_13p.mat +25 -0
  102. biotite/sequence/align/matrix_data/BLOSUM62_14.3.mat +25 -0
  103. biotite/sequence/align/matrix_data/BLOSUM62_5.0.mat +25 -0
  104. biotite/sequence/align/matrix_data/BLOSUM65.mat +31 -0
  105. biotite/sequence/align/matrix_data/BLOSUM70.mat +31 -0
  106. biotite/sequence/align/matrix_data/BLOSUM75.mat +31 -0
  107. biotite/sequence/align/matrix_data/BLOSUM80.mat +31 -0
  108. biotite/sequence/align/matrix_data/BLOSUM85.mat +31 -0
  109. biotite/sequence/align/matrix_data/BLOSUM90.mat +31 -0
  110. biotite/sequence/align/matrix_data/BLOSUMN.mat +31 -0
  111. biotite/sequence/align/matrix_data/CorBLOSUM49_5.0.mat +25 -0
  112. biotite/sequence/align/matrix_data/CorBLOSUM57_13p.mat +25 -0
  113. biotite/sequence/align/matrix_data/CorBLOSUM57_14.3.mat +25 -0
  114. biotite/sequence/align/matrix_data/CorBLOSUM61_5.0.mat +25 -0
  115. biotite/sequence/align/matrix_data/CorBLOSUM66_13p.mat +25 -0
  116. biotite/sequence/align/matrix_data/CorBLOSUM67_14.3.mat +25 -0
  117. biotite/sequence/align/matrix_data/DAYHOFF.mat +32 -0
  118. biotite/sequence/align/matrix_data/GONNET.mat +26 -0
  119. biotite/sequence/align/matrix_data/IDENTITY.mat +25 -0
  120. biotite/sequence/align/matrix_data/MATCH.mat +25 -0
  121. biotite/sequence/align/matrix_data/NUC.mat +25 -0
  122. biotite/sequence/align/matrix_data/PAM10.mat +34 -0
  123. biotite/sequence/align/matrix_data/PAM100.mat +34 -0
  124. biotite/sequence/align/matrix_data/PAM110.mat +34 -0
  125. biotite/sequence/align/matrix_data/PAM120.mat +34 -0
  126. biotite/sequence/align/matrix_data/PAM130.mat +34 -0
  127. biotite/sequence/align/matrix_data/PAM140.mat +34 -0
  128. biotite/sequence/align/matrix_data/PAM150.mat +34 -0
  129. biotite/sequence/align/matrix_data/PAM160.mat +34 -0
  130. biotite/sequence/align/matrix_data/PAM170.mat +34 -0
  131. biotite/sequence/align/matrix_data/PAM180.mat +34 -0
  132. biotite/sequence/align/matrix_data/PAM190.mat +34 -0
  133. biotite/sequence/align/matrix_data/PAM20.mat +34 -0
  134. biotite/sequence/align/matrix_data/PAM200.mat +34 -0
  135. biotite/sequence/align/matrix_data/PAM210.mat +34 -0
  136. biotite/sequence/align/matrix_data/PAM220.mat +34 -0
  137. biotite/sequence/align/matrix_data/PAM230.mat +34 -0
  138. biotite/sequence/align/matrix_data/PAM240.mat +34 -0
  139. biotite/sequence/align/matrix_data/PAM250.mat +34 -0
  140. biotite/sequence/align/matrix_data/PAM260.mat +34 -0
  141. biotite/sequence/align/matrix_data/PAM270.mat +34 -0
  142. biotite/sequence/align/matrix_data/PAM280.mat +34 -0
  143. biotite/sequence/align/matrix_data/PAM290.mat +34 -0
  144. biotite/sequence/align/matrix_data/PAM30.mat +34 -0
  145. biotite/sequence/align/matrix_data/PAM300.mat +34 -0
  146. biotite/sequence/align/matrix_data/PAM310.mat +34 -0
  147. biotite/sequence/align/matrix_data/PAM320.mat +34 -0
  148. biotite/sequence/align/matrix_data/PAM330.mat +34 -0
  149. biotite/sequence/align/matrix_data/PAM340.mat +34 -0
  150. biotite/sequence/align/matrix_data/PAM350.mat +34 -0
  151. biotite/sequence/align/matrix_data/PAM360.mat +34 -0
  152. biotite/sequence/align/matrix_data/PAM370.mat +34 -0
  153. biotite/sequence/align/matrix_data/PAM380.mat +34 -0
  154. biotite/sequence/align/matrix_data/PAM390.mat +34 -0
  155. biotite/sequence/align/matrix_data/PAM40.mat +34 -0
  156. biotite/sequence/align/matrix_data/PAM400.mat +34 -0
  157. biotite/sequence/align/matrix_data/PAM410.mat +34 -0
  158. biotite/sequence/align/matrix_data/PAM420.mat +34 -0
  159. biotite/sequence/align/matrix_data/PAM430.mat +34 -0
  160. biotite/sequence/align/matrix_data/PAM440.mat +34 -0
  161. biotite/sequence/align/matrix_data/PAM450.mat +34 -0
  162. biotite/sequence/align/matrix_data/PAM460.mat +34 -0
  163. biotite/sequence/align/matrix_data/PAM470.mat +34 -0
  164. biotite/sequence/align/matrix_data/PAM480.mat +34 -0
  165. biotite/sequence/align/matrix_data/PAM490.mat +34 -0
  166. biotite/sequence/align/matrix_data/PAM50.mat +34 -0
  167. biotite/sequence/align/matrix_data/PAM500.mat +34 -0
  168. biotite/sequence/align/matrix_data/PAM60.mat +34 -0
  169. biotite/sequence/align/matrix_data/PAM70.mat +34 -0
  170. biotite/sequence/align/matrix_data/PAM80.mat +34 -0
  171. biotite/sequence/align/matrix_data/PAM90.mat +34 -0
  172. biotite/sequence/align/matrix_data/PB.license +21 -0
  173. biotite/sequence/align/matrix_data/PB.mat +18 -0
  174. biotite/sequence/align/matrix_data/RBLOSUM52_5.0.mat +25 -0
  175. biotite/sequence/align/matrix_data/RBLOSUM59_13p.mat +25 -0
  176. biotite/sequence/align/matrix_data/RBLOSUM59_14.3.mat +25 -0
  177. biotite/sequence/align/matrix_data/RBLOSUM64_5.0.mat +25 -0
  178. biotite/sequence/align/matrix_data/RBLOSUM69_13p.mat +25 -0
  179. biotite/sequence/align/matrix_data/RBLOSUM69_14.3.mat +25 -0
  180. biotite/sequence/align/multiple.cpython-313-x86_64-linux-gnu.so +0 -0
  181. biotite/sequence/align/multiple.pyx +619 -0
  182. biotite/sequence/align/pairwise.cpython-313-x86_64-linux-gnu.so +0 -0
  183. biotite/sequence/align/pairwise.pyx +585 -0
  184. biotite/sequence/align/permutation.cpython-313-x86_64-linux-gnu.so +0 -0
  185. biotite/sequence/align/permutation.pyx +313 -0
  186. biotite/sequence/align/primes.txt +821 -0
  187. biotite/sequence/align/selector.cpython-313-x86_64-linux-gnu.so +0 -0
  188. biotite/sequence/align/selector.pyx +954 -0
  189. biotite/sequence/align/statistics.py +264 -0
  190. biotite/sequence/align/tracetable.cpython-313-x86_64-linux-gnu.so +0 -0
  191. biotite/sequence/align/tracetable.pxd +64 -0
  192. biotite/sequence/align/tracetable.pyx +370 -0
  193. biotite/sequence/alphabet.py +555 -0
  194. biotite/sequence/annotation.py +836 -0
  195. biotite/sequence/codec.cpython-313-x86_64-linux-gnu.so +0 -0
  196. biotite/sequence/codec.pyx +155 -0
  197. biotite/sequence/codon.py +476 -0
  198. biotite/sequence/codon_tables.txt +202 -0
  199. biotite/sequence/graphics/__init__.py +33 -0
  200. biotite/sequence/graphics/alignment.py +1101 -0
  201. biotite/sequence/graphics/color_schemes/3di_flower.json +48 -0
  202. biotite/sequence/graphics/color_schemes/autumn.json +51 -0
  203. biotite/sequence/graphics/color_schemes/blossom.json +51 -0
  204. biotite/sequence/graphics/color_schemes/clustalx_dna.json +11 -0
  205. biotite/sequence/graphics/color_schemes/clustalx_protein.json +28 -0
  206. biotite/sequence/graphics/color_schemes/flower.json +51 -0
  207. biotite/sequence/graphics/color_schemes/jalview_buried.json +31 -0
  208. biotite/sequence/graphics/color_schemes/jalview_hydrophobicity.json +31 -0
  209. biotite/sequence/graphics/color_schemes/jalview_prop_helix.json +31 -0
  210. biotite/sequence/graphics/color_schemes/jalview_prop_strand.json +31 -0
  211. biotite/sequence/graphics/color_schemes/jalview_prop_turn.json +31 -0
  212. biotite/sequence/graphics/color_schemes/jalview_taylor.json +28 -0
  213. biotite/sequence/graphics/color_schemes/jalview_zappo.json +28 -0
  214. biotite/sequence/graphics/color_schemes/ocean.json +51 -0
  215. biotite/sequence/graphics/color_schemes/pb_flower.json +40 -0
  216. biotite/sequence/graphics/color_schemes/rainbow_dna.json +11 -0
  217. biotite/sequence/graphics/color_schemes/rainbow_protein.json +30 -0
  218. biotite/sequence/graphics/color_schemes/spring.json +51 -0
  219. biotite/sequence/graphics/color_schemes/sunset.json +51 -0
  220. biotite/sequence/graphics/color_schemes/wither.json +51 -0
  221. biotite/sequence/graphics/colorschemes.py +170 -0
  222. biotite/sequence/graphics/dendrogram.py +231 -0
  223. biotite/sequence/graphics/features.py +544 -0
  224. biotite/sequence/graphics/logo.py +102 -0
  225. biotite/sequence/graphics/plasmid.py +712 -0
  226. biotite/sequence/io/__init__.py +12 -0
  227. biotite/sequence/io/fasta/__init__.py +22 -0
  228. biotite/sequence/io/fasta/convert.py +283 -0
  229. biotite/sequence/io/fasta/file.py +265 -0
  230. biotite/sequence/io/fastq/__init__.py +19 -0
  231. biotite/sequence/io/fastq/convert.py +117 -0
  232. biotite/sequence/io/fastq/file.py +507 -0
  233. biotite/sequence/io/genbank/__init__.py +17 -0
  234. biotite/sequence/io/genbank/annotation.py +269 -0
  235. biotite/sequence/io/genbank/file.py +573 -0
  236. biotite/sequence/io/genbank/metadata.py +336 -0
  237. biotite/sequence/io/genbank/sequence.py +173 -0
  238. biotite/sequence/io/general.py +201 -0
  239. biotite/sequence/io/gff/__init__.py +26 -0
  240. biotite/sequence/io/gff/convert.py +128 -0
  241. biotite/sequence/io/gff/file.py +449 -0
  242. biotite/sequence/phylo/__init__.py +36 -0
  243. biotite/sequence/phylo/nj.cpython-313-x86_64-linux-gnu.so +0 -0
  244. biotite/sequence/phylo/nj.pyx +221 -0
  245. biotite/sequence/phylo/tree.cpython-313-x86_64-linux-gnu.so +0 -0
  246. biotite/sequence/phylo/tree.pyx +1169 -0
  247. biotite/sequence/phylo/upgma.cpython-313-x86_64-linux-gnu.so +0 -0
  248. biotite/sequence/phylo/upgma.pyx +164 -0
  249. biotite/sequence/profile.py +561 -0
  250. biotite/sequence/search.py +117 -0
  251. biotite/sequence/seqtypes.py +720 -0
  252. biotite/sequence/sequence.py +373 -0
  253. biotite/setup_ccd.py +197 -0
  254. biotite/structure/__init__.py +135 -0
  255. biotite/structure/alphabet/__init__.py +25 -0
  256. biotite/structure/alphabet/encoder.py +332 -0
  257. biotite/structure/alphabet/encoder_weights_3di.kerasify +0 -0
  258. biotite/structure/alphabet/i3d.py +109 -0
  259. biotite/structure/alphabet/layers.py +86 -0
  260. biotite/structure/alphabet/pb.license +21 -0
  261. biotite/structure/alphabet/pb.py +170 -0
  262. biotite/structure/alphabet/unkerasify.py +128 -0
  263. biotite/structure/atoms.py +1562 -0
  264. biotite/structure/basepairs.py +1403 -0
  265. biotite/structure/bonds.cpython-313-x86_64-linux-gnu.so +0 -0
  266. biotite/structure/bonds.pyx +2036 -0
  267. biotite/structure/box.py +724 -0
  268. biotite/structure/celllist.cpython-313-x86_64-linux-gnu.so +0 -0
  269. biotite/structure/celllist.pyx +864 -0
  270. biotite/structure/chains.py +310 -0
  271. biotite/structure/charges.cpython-313-x86_64-linux-gnu.so +0 -0
  272. biotite/structure/charges.pyx +520 -0
  273. biotite/structure/compare.py +683 -0
  274. biotite/structure/density.py +109 -0
  275. biotite/structure/dotbracket.py +213 -0
  276. biotite/structure/error.py +39 -0
  277. biotite/structure/filter.py +591 -0
  278. biotite/structure/geometry.py +817 -0
  279. biotite/structure/graphics/__init__.py +13 -0
  280. biotite/structure/graphics/atoms.py +243 -0
  281. biotite/structure/graphics/rna.py +298 -0
  282. biotite/structure/hbond.py +425 -0
  283. biotite/structure/info/__init__.py +24 -0
  284. biotite/structure/info/atom_masses.json +121 -0
  285. biotite/structure/info/atoms.py +98 -0
  286. biotite/structure/info/bonds.py +149 -0
  287. biotite/structure/info/ccd.py +200 -0
  288. biotite/structure/info/components.bcif +0 -0
  289. biotite/structure/info/groups.py +128 -0
  290. biotite/structure/info/masses.py +121 -0
  291. biotite/structure/info/misc.py +137 -0
  292. biotite/structure/info/radii.py +267 -0
  293. biotite/structure/info/standardize.py +185 -0
  294. biotite/structure/integrity.py +213 -0
  295. biotite/structure/io/__init__.py +29 -0
  296. biotite/structure/io/dcd/__init__.py +13 -0
  297. biotite/structure/io/dcd/file.py +67 -0
  298. biotite/structure/io/general.py +243 -0
  299. biotite/structure/io/gro/__init__.py +14 -0
  300. biotite/structure/io/gro/file.py +343 -0
  301. biotite/structure/io/mol/__init__.py +20 -0
  302. biotite/structure/io/mol/convert.py +112 -0
  303. biotite/structure/io/mol/ctab.py +420 -0
  304. biotite/structure/io/mol/header.py +120 -0
  305. biotite/structure/io/mol/mol.py +149 -0
  306. biotite/structure/io/mol/sdf.py +940 -0
  307. biotite/structure/io/netcdf/__init__.py +13 -0
  308. biotite/structure/io/netcdf/file.py +64 -0
  309. biotite/structure/io/pdb/__init__.py +20 -0
  310. biotite/structure/io/pdb/convert.py +389 -0
  311. biotite/structure/io/pdb/file.py +1380 -0
  312. biotite/structure/io/pdb/hybrid36.cpython-313-x86_64-linux-gnu.so +0 -0
  313. biotite/structure/io/pdb/hybrid36.pyx +242 -0
  314. biotite/structure/io/pdbqt/__init__.py +15 -0
  315. biotite/structure/io/pdbqt/convert.py +113 -0
  316. biotite/structure/io/pdbqt/file.py +688 -0
  317. biotite/structure/io/pdbx/__init__.py +23 -0
  318. biotite/structure/io/pdbx/bcif.py +674 -0
  319. biotite/structure/io/pdbx/cif.py +1091 -0
  320. biotite/structure/io/pdbx/component.py +251 -0
  321. biotite/structure/io/pdbx/compress.py +362 -0
  322. biotite/structure/io/pdbx/convert.py +2113 -0
  323. biotite/structure/io/pdbx/encoding.cpython-313-x86_64-linux-gnu.so +0 -0
  324. biotite/structure/io/pdbx/encoding.pyx +1078 -0
  325. biotite/structure/io/trajfile.py +696 -0
  326. biotite/structure/io/trr/__init__.py +13 -0
  327. biotite/structure/io/trr/file.py +43 -0
  328. biotite/structure/io/util.py +38 -0
  329. biotite/structure/io/xtc/__init__.py +13 -0
  330. biotite/structure/io/xtc/file.py +43 -0
  331. biotite/structure/mechanics.py +72 -0
  332. biotite/structure/molecules.py +337 -0
  333. biotite/structure/pseudoknots.py +622 -0
  334. biotite/structure/rdf.py +245 -0
  335. biotite/structure/repair.py +302 -0
  336. biotite/structure/residues.py +716 -0
  337. biotite/structure/rings.py +451 -0
  338. biotite/structure/sasa.cpython-313-x86_64-linux-gnu.so +0 -0
  339. biotite/structure/sasa.pyx +322 -0
  340. biotite/structure/segments.py +328 -0
  341. biotite/structure/sequence.py +110 -0
  342. biotite/structure/spacegroups.json +1567 -0
  343. biotite/structure/spacegroups.license +26 -0
  344. biotite/structure/sse.py +306 -0
  345. biotite/structure/superimpose.py +511 -0
  346. biotite/structure/tm.py +581 -0
  347. biotite/structure/transform.py +736 -0
  348. biotite/structure/util.py +160 -0
  349. biotite/version.py +34 -0
  350. biotite/visualize.py +375 -0
  351. biotite-1.5.0.dist-info/METADATA +162 -0
  352. biotite-1.5.0.dist-info/RECORD +354 -0
  353. biotite-1.5.0.dist-info/WHEEL +6 -0
  354. biotite-1.5.0.dist-info/licenses/LICENSE.rst +30 -0
@@ -0,0 +1,520 @@
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
+
22
+
23
+ ctypedef np.float32_t float32
24
+ ctypedef np.uint32_t uint32
25
+ ctypedef np.int8_t int8
26
+ ctypedef np.int64_t int64
27
+
28
+
29
+ cdef float32 NAN = np.nan
30
+ # Conversion of Enum into int for faster comparison in _get_parameters()
31
+ cdef uint32 ANY = BondType.ANY
32
+
33
+
34
+ # Creating two dictionaries to retrieve parameters for electronegativity
35
+ # computation from
36
+ # The first dictionary uses BondTypes as keys, whereas the second uses
37
+ # the amounts of binding partners as keys
38
+ # First level of dictionaries represents the atom name and the second
39
+ # level represents the hybridisation state
40
+ # Depending on whether the bond type is unequal to zero or not,
41
+ # identification of the hybridisation state is either performed via the
42
+ # first dictionary, i. e. the bond type (primary way of identification
43
+ # since erroneous results are excluded) or via the second dictionary,
44
+ # i. e. amount of binding partners (erroneous if a binding partner is
45
+ # lost or added whilst the hybridisation remains unchanged as it is the
46
+ # case with acids or bases, e. g. the hydroxyl group in a carboxyl
47
+ # group: When the proton involved in the hydroxyl group is donated, the
48
+ # amount of binding partners of the remaining oxygen is one; this would
49
+ # erroneously lead to an identification of the hybridisation state as
50
+ # sp2 although it is still sp3)
51
+ cdef dict EN_PARAM_BTYPE = {
52
+ "H": {
53
+ int(BondType.SINGLE): (7.17, 6.24, -0.56)
54
+ },
55
+
56
+ "C": {
57
+ int(BondType.SINGLE): (7.98, 9.18, 1.88),
58
+ int(BondType.DOUBLE): (8.79, 9.18, 1.88),
59
+ int(BondType.TRIPLE): (10.39, 9.45, 0.73),
60
+ int(BondType.AROMATIC_SINGLE): (7.98, 9.18, 1.88),
61
+ int(BondType.AROMATIC_DOUBLE): (8.79, 9.18, 1.88)
62
+ },
63
+
64
+ "N": {
65
+ int(BondType.SINGLE): (11.54, 10.82, 1.36),
66
+ int(BondType.DOUBLE): (12.87, 11.15, 0.85),
67
+ int(BondType.TRIPLE): (15.68, 11.7, -0.27),
68
+ int(BondType.AROMATIC_SINGLE): (11.54, 10.82, 1.36),
69
+ int(BondType.AROMATIC_DOUBLE): (12.87, 11.15, 0.85)
70
+ },
71
+
72
+ # As oxygen and sulfur are exclusively involved in aromatic
73
+ # systems having single bonds on either side, the values for a
74
+ # sp3 hybridisation are taken for BondType.AROMATIC_SINGLE
75
+ "O": {
76
+ int(BondType.SINGLE): (14.18, 12.92, 1.39),
77
+ int(BondType.DOUBLE): (17.07, 13.79, 0.47),
78
+ int(BondType.AROMATIC_SINGLE): (14.18, 12.92, 1.39)
79
+ },
80
+
81
+ "S": {
82
+ int(BondType.SINGLE): (10.14, 9.13, 1.38),
83
+ int(BondType.AROMATIC_SINGLE): (10.14, 9.13, 1.38)
84
+ },
85
+
86
+ "F": {
87
+ int(BondType.SINGLE): (14.66, 13.85, 2.31)
88
+ },
89
+
90
+ "Cl": {
91
+ int(BondType.SINGLE): (11.00, 9.69, 1.35)
92
+ },
93
+
94
+ "Br": {
95
+ int(BondType.SINGLE): (10.08, 8.47, 1.16)
96
+ },
97
+
98
+ "I": {
99
+ int(BondType.SINGLE): (9.90, 7.96, 0.96)
100
+ }
101
+ }
102
+
103
+ cdef dict EN_PARAM_BPARTNERS = {
104
+ "H": {
105
+ 1: (7.17, 6.24, -0.56)
106
+ },
107
+
108
+ "C": {
109
+ 4: (7.98, 9.18, 1.88),
110
+ 3: (8.79, 9.18, 1.88),
111
+ 2: (10.39, 9.45, 0.73)
112
+ },
113
+
114
+ "N": {
115
+ # Considering protonated, e. g. in terminal
116
+ # amino group (4 binding partners), as well
117
+ # as unprotonated nitrogen (3 binding partners)
118
+ 4: (11.54, 10.82, 1.36),
119
+ 3: (11.54, 10.82, 1.36),
120
+ 2: (12.87, 11.15, 0.85),
121
+ 1: (15.68, 11.7, -0.27)
122
+ },
123
+
124
+ "O": {
125
+ 2: (14.18, 12.92, 1.39),
126
+ 1: (17.07, 13.79, 0.47)
127
+ },
128
+
129
+ "S": {
130
+ 2: (10.14, 9.13, 1.38)
131
+ },
132
+
133
+ "F": {
134
+ 1: (14.66, 13.85, 2.31)
135
+ },
136
+
137
+ "Cl": {
138
+ 1: (11.00, 9.69, 1.35)
139
+ },
140
+
141
+ "Br": {
142
+ 1: (10.08, 8.47, 1.16)
143
+ },
144
+
145
+ "I": {
146
+ 1: (9.90, 7.96, 0.96)
147
+ }
148
+ }
149
+
150
+
151
+ # Defining constant for the special case of the electronegativity of
152
+ # positively charged hydrogen (value given in electronvolt, as all
153
+ # electronegativity values)
154
+ EN_POS_HYDROGEN = 20.02
155
+
156
+
157
+ def _get_parameters(elements, bond_types, amount_of_binding_partners):
158
+ """
159
+ Gather the parameters required for electronegativity computation of
160
+ all atoms comprised in the input array `elements`.
161
+
162
+ By doing so, the function accesses the nested dictionary
163
+ ``EN_PARAMETERS``. The values originate from a publication of Johann
164
+ Gasteiger and Mario Marsili.
165
+
166
+ Parameters
167
+ ----------
168
+ elements: ndarray, dtype=str
169
+ The array comprising the elements which to retrieve the
170
+ parameters for.
171
+ bond_types: ndarray, dtype=int
172
+ The array containing information about the highest bond type of
173
+ the respective atom (except for the aromatic bond types).
174
+ amount_of_binding_partners: ndarray, dtype=int
175
+ The array containing information about the amount of binding
176
+ partners of the respective atom.
177
+
178
+ Returns
179
+ -------
180
+ parameters: NumPy array, dtype=float, shape=(n,3)
181
+ The array containing all three parameters required for the
182
+ computation of the electronegativities of all atoms comprised
183
+ in the `elements` array.
184
+ """
185
+ cdef int i
186
+ cdef float32 a, b, c
187
+ cdef int8[:] bond_types_v = bond_types
188
+ cdef int64[:] amount_of_binding_partners_v = amount_of_binding_partners
189
+
190
+ parameters = np.zeros((elements.shape[0], 3), dtype=np.float32)
191
+ cdef float32[:,:] parameters_v = parameters
192
+
193
+ has_atom_key_error = False
194
+ has_valence_key_error = False
195
+ # Preparing warning in case of KeyError
196
+ # It is differentiated between atoms that are not parametrized at
197
+ # all and specific valence states that are parametrized
198
+ list_of_unparametrized_elements = []
199
+ unparametrized_valences = []
200
+ unparam_valence_names = []
201
+ list_of_atoms_without_specified_btype = []
202
+
203
+ for i, element in enumerate(elements):
204
+ # Considering the special case of ions
205
+ if amount_of_binding_partners_v[i] == 0:
206
+ parameters_v[i, :] = np.nan
207
+ continue
208
+ if bond_types_v[i] == ANY:
209
+ list_of_atoms_without_specified_btype.append(str(i))
210
+ try:
211
+ a, b, c = EN_PARAM_BPARTNERS[element] \
212
+ [amount_of_binding_partners_v[i]]
213
+ parameters_v[i, 0] = a
214
+ parameters_v[i, 1] = b
215
+ parameters_v[i, 2] = c
216
+ except KeyError:
217
+ try:
218
+ EN_PARAM_BPARTNERS[element]
219
+ except KeyError:
220
+ list_of_unparametrized_elements.append(element)
221
+ has_atom_key_error = True
222
+ else:
223
+ # The warning message printed in case of
224
+ # unparametrized valence states contains its main
225
+ # information in a table with three columns:
226
+ # The first column represents the element, the
227
+ # second the amount of binding partners and the
228
+ # third the BondType
229
+ # The primary way of identifying unparametrized
230
+ # valence states that is aimed at is via the
231
+ # BondType; if this is possible, the space beneath
232
+ # the column representing the amount of binding
233
+ # partners is padded with a respective amount the
234
+ # '-' (hyphen) character
235
+ # If not, the space beneath the column representing
236
+ # the BondTypes is padded with a respective amount
237
+ # of hyphens
238
+ # At either case, an appropriate amount of
239
+ # whitespace is added in order to ensure that the
240
+ # respective entries appear directly under the
241
+ # respective columns
242
+ unparam_valence_names.append(element)
243
+ unparametrized_valences.append(
244
+ str(amount_of_binding_partners_v[i])
245
+ +
246
+ " " * 31
247
+ +
248
+ "-" * 10
249
+ )
250
+ has_valence_key_error = True
251
+ parameters_v[i, :] = np.nan
252
+ else:
253
+ try:
254
+ a, b, c = EN_PARAM_BTYPE[element][bond_types_v[i]]
255
+ parameters_v[i, 0] = a
256
+ parameters_v[i, 1] = b
257
+ parameters_v[i, 2] = c
258
+ except KeyError:
259
+ try:
260
+ EN_PARAM_BTYPE[element]
261
+ except KeyError:
262
+ list_of_unparametrized_elements.append(element)
263
+ has_atom_key_error = True
264
+ else:
265
+ unparam_valence_names.append(element)
266
+ unparametrized_valences.append(
267
+ "-" * 27
268
+ +
269
+ " " * 5
270
+ +
271
+ str(bond_types_v[i])
272
+ )
273
+ has_valence_key_error = True
274
+ parameters_v[i, :] = np.nan
275
+
276
+
277
+ # Error and warning handling
278
+ if np.all(bond_types == BondType.ANY):
279
+ warnings.warn(
280
+ f"Each atom's bond type is 0 (any). Therefore, it is "
281
+ f"resorted to the amount of binding partners for the "
282
+ f"identification of the hybridisation state which can lead "
283
+ f"to erroneous results.",
284
+ UserWarning
285
+ )
286
+ elif np.any(bond_types == BondType.ANY):
287
+ warnings.warn(
288
+ f"Some atoms' bond type is unspecified, i. e. the bond "
289
+ f"type is given as `any`. For these atoms, identification "
290
+ f"of the hybridisation state is performed via the amount "
291
+ f"of binding partners which can lead to erroneous results."
292
+ f"\n\n"
293
+ f"In detail, these atoms possess the following indices: \n"
294
+ f"{', '. join(list_of_atoms_without_specified_btype)}.",
295
+ UserWarning
296
+ )
297
+
298
+ if has_valence_key_error:
299
+ joined_list = []
300
+ for i in range(len(unparam_valence_names)):
301
+ joined_list.append(
302
+ unparam_valence_names[i].ljust(2, ' ')
303
+ +
304
+ " " * 8
305
+ )
306
+ joined_list.append(unparametrized_valences[i] + "\n")
307
+ joined_array = np.reshape(
308
+ joined_list,
309
+ newshape=(int(len(joined_list) / 2), 2)
310
+ )
311
+ joined_array = np.unique(joined_array, axis=0)
312
+ # Array must be flattened in order ro be able to apply the
313
+ # 'join' method
314
+ flattened_joined_array = np.reshape(
315
+ joined_array, newshape=(2*joined_array.shape[0])
316
+ )
317
+ warnings.warn(
318
+ f"Parameters for specific valence states of some atoms "
319
+ f"are not available. These valence states are: \n"
320
+ f"Atom: Amount of binding partners: Bond type:\n"
321
+ f"{''.join(flattened_joined_array)}"
322
+ f"Their electronegativity is given as NaN.",
323
+ UserWarning
324
+ )
325
+
326
+ if has_atom_key_error:
327
+ # Using NumPy's 'unique' function to ensure that each atom only
328
+ # occurs once in the list
329
+ unique_list = np.unique(list_of_unparametrized_elements)
330
+ # Considering proper punctuation for the warning string
331
+ warnings.warn(
332
+ f"Parameters required for computation of "
333
+ f"electronegativity aren't available for the following "
334
+ f"atoms: {', '.join(unique_list)}. "
335
+ f"Their electronegativity is given as NaN.",
336
+ UserWarning
337
+ )
338
+
339
+
340
+ return parameters
341
+
342
+
343
+ def partial_charges(atom_array, int iteration_step_num=6, charges=None):
344
+ """
345
+ partial_charges(atom_array, iteration_step_num=6, charges=None)
346
+
347
+ Compute the partial charge of the individual atoms comprised in a
348
+ given :class:`AtomArray` depending on their electronegativity.
349
+
350
+ This function implements the
351
+ *partial equalization of orbital electronegativity* (PEOE)
352
+ algorithm :footcite:`Gasteiger1980`.
353
+
354
+ Parameters
355
+ ----------
356
+ atom_array: AtomArray, shape=(n,)
357
+ The :class:`AtomArray` to get the partial charge values for.
358
+ Must have an associated `BondList`.
359
+ iteration_step_num: int, optional
360
+ The number of iteration steps is an optional argument and can be
361
+ chosen by the user depending on the desired precision of the
362
+ result. If no value is entered by the user, the default value
363
+ ``6`` will be used.
364
+ Gasteiger and Marsili described this number as sufficient.
365
+ charges: ndarray, dtype=int, optional
366
+ The array comprising the formal charges of the atoms in the
367
+ input `atom_array`.
368
+ If none is given, the ``charge`` annotation category of the
369
+ input `atom_array` is used.
370
+ If neither of them is given, the formal charges of all atoms
371
+ will be arbitrarily set to zero.
372
+
373
+ Returns
374
+ -------
375
+ charges: ndarray, dtype=float32
376
+ The partial charge values of the individual atoms in the input
377
+ `atom_array`.
378
+
379
+ Notes
380
+ -----
381
+ A :class:`BondList` must be associated to the input
382
+ :class:`AtomArray`.
383
+ Otherwise, an error will be raised.
384
+ Example:
385
+
386
+ .. code-block:: python
387
+
388
+ atom_array.bonds = struc.connect_via_residue_names(atom_array)
389
+
390
+ |
391
+
392
+ For the electronegativity of positively charged hydrogen, the
393
+ value of 20.02 eV is used.
394
+
395
+ Also note that the algorithm used in this function does not deliver
396
+ proper results for expanded pi-electron systems like aromatic rings.
397
+
398
+ References
399
+ ----------
400
+
401
+ .. footbibliography::
402
+
403
+ Examples
404
+ --------
405
+
406
+ >>> fluoromethane = residue("CF0")
407
+ >>> print(fluoromethane.atom_name)
408
+ ['C1' 'F1' 'H1' 'H2' 'H3']
409
+ >>> print(partial_charges(fluoromethane, iteration_step_num=1))
410
+ [ 0.115 -0.175 0.020 0.020 0.020]
411
+ >>> print(partial_charges(fluoromethane, iteration_step_num=6))
412
+ [ 0.079 -0.253 0.058 0.058 0.058]
413
+ """
414
+ if atom_array.bonds is None:
415
+ raise AttributeError(
416
+ f"The input AtomArray doesn't possess an associated "
417
+ f"BondList."
418
+ )
419
+
420
+ if charges is None:
421
+ try:
422
+ # Implicitly this creates a copy of the charges
423
+ charges = atom_array.charge.astype(np.float32)
424
+ except AttributeError:
425
+ charges = np.zeros(atom_array.shape[0], dtype=np.float32)
426
+ warnings.warn(
427
+ f"A charge array was neither given as optional "
428
+ f"argument, nor does a charge annotation of the "
429
+ f"inserted AtomArray exist. Therefore, all atoms' "
430
+ f"formal charge is assumed to be zero.",
431
+ UserWarning
432
+ )
433
+ cdef float32[:] charges_v = charges
434
+
435
+ elements = atom_array.element
436
+ bonds, types = atom_array.bonds.get_all_bonds()
437
+ amount_of_binding_partners = np.count_nonzero(bonds != -1, axis=1) \
438
+ .astype(np.int64, copy=False)
439
+ # The maximum of a given row of the `types` array must be determined
440
+ # as this value reveals the hybridisation state
441
+ # An atom's overall BondType is assumed to be ANY as soon as one
442
+ # BondType.ANY occurs
443
+ if types.shape[1] == 0:
444
+ # No bonds between atoms
445
+ # -> types has shape (n,0)
446
+ # -> np.amax() raises ValueError
447
+ # This is the case e. g. if AtomArray exclusively contains ions
448
+ # In this case partial charges are equal to formal charges
449
+ return charges
450
+ bond_types = np.amax(types, axis=1)
451
+ bond_types[np.any(types == BondType.ANY, axis=1)] = BondType.ANY
452
+ parameters = _get_parameters(
453
+ elements, bond_types, amount_of_binding_partners
454
+ )
455
+
456
+ # Computing electronegativity values in case of positive charge
457
+ # which enter as divisor the equation for charge transfer
458
+ pos_en_values = np.sum(parameters, axis=1)
459
+ # Substituting values for hydrogen with the special value
460
+ pos_en_values[atom_array.element == "H"] = EN_POS_HYDROGEN
461
+ cdef float32[:] pos_en_values_v = pos_en_values
462
+
463
+
464
+ cdef float32 damping = 1.0
465
+ cdef float32 divisor
466
+ cdef float32 charge_transfer
467
+ cdef uint32[:,:] bonds_v = atom_array.bonds.as_array()
468
+ cdef int bond_index
469
+ # Indices to atoms involved in a bonds
470
+ cdef uint32 i, j
471
+ cdef float32[:] en_values_v
472
+
473
+ for _ in range(iteration_step_num):
474
+ # In the beginning of each iteration step, the damping factor is
475
+ # halved in order to guarantee rapid convergence
476
+ damping *= 0.5
477
+ # Calculate electronegativity via vectorization:
478
+ # X = a + bQ + cQ^2
479
+ charge_factor = np.stack((
480
+ np.ones(atom_array.array_length()),
481
+ charges,
482
+ charges**2
483
+ ), axis=-1)
484
+ en_values_v = np.sum(
485
+ parameters * charge_factor,
486
+ axis=1, dtype=np.float32
487
+ )
488
+ # Iterate over bonds to transfer charges
489
+ # based on new electronegativity values
490
+ for bond_index in range(bonds_v.shape[0]):
491
+ i = bonds_v[bond_index, 0]
492
+ j = bonds_v[bond_index, 1]
493
+ # For atoms that are not available in the dictionary,
494
+ # but which are incorporated into molecules,
495
+ # the partial charge is set to NaN
496
+ if isnan(en_values_v[i]) or isnan(en_values_v[j]):
497
+ # Determining for which atom exactly no parameters are
498
+ # available is necessary since the other atom, for which
499
+ # there indeed are parameters, could be involved in
500
+ # multiple bonds.
501
+ # Therefore, setting both charges to NaN would falsify
502
+ # the result.
503
+ # The case that both atoms are not parametrized must be
504
+ # considered as well.
505
+ if isnan(en_values_v[i]):
506
+ charges_v[i] = NAN
507
+ if isnan(en_values_v[j]):
508
+ charges_v[j] = NAN
509
+ else:
510
+ if en_values_v[j] > en_values_v[i]:
511
+ divisor = pos_en_values_v[i]
512
+ else:
513
+ divisor = pos_en_values_v[j]
514
+ charge_transfer = (
515
+ (en_values_v[j] - en_values_v[i]) / divisor
516
+ ) * damping
517
+ charges_v[i] += charge_transfer
518
+ charges_v[j] -= charge_transfer
519
+
520
+ return charges