biotite 1.3.0__cp312-cp312-macosx_10_13_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 +159 -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 +191 -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 +160 -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 +1226 -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-312-darwin.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-312-darwin.so +0 -0
  78. biotite/sequence/align/kmeralphabet.pyx +595 -0
  79. biotite/sequence/align/kmersimilarity.cpython-312-darwin.so +0 -0
  80. biotite/sequence/align/kmersimilarity.pyx +233 -0
  81. biotite/sequence/align/kmertable.cpython-312-darwin.so +0 -0
  82. biotite/sequence/align/kmertable.pyx +3411 -0
  83. biotite/sequence/align/localgapped.cpython-312-darwin.so +0 -0
  84. biotite/sequence/align/localgapped.pyx +892 -0
  85. biotite/sequence/align/localungapped.cpython-312-darwin.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-312-darwin.so +0 -0
  181. biotite/sequence/align/multiple.pyx +619 -0
  182. biotite/sequence/align/pairwise.cpython-312-darwin.so +0 -0
  183. biotite/sequence/align/pairwise.pyx +585 -0
  184. biotite/sequence/align/permutation.cpython-312-darwin.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-312-darwin.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-312-darwin.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-312-darwin.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-312-darwin.so +0 -0
  244. biotite/sequence/phylo/nj.pyx +221 -0
  245. biotite/sequence/phylo/tree.cpython-312-darwin.so +0 -0
  246. biotite/sequence/phylo/tree.pyx +1169 -0
  247. biotite/sequence/phylo/upgma.cpython-312-darwin.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-312-darwin.so +0 -0
  266. biotite/structure/bonds.pyx +1975 -0
  267. biotite/structure/box.py +724 -0
  268. biotite/structure/celllist.cpython-312-darwin.so +0 -0
  269. biotite/structure/celllist.pyx +864 -0
  270. biotite/structure/chains.py +276 -0
  271. biotite/structure/charges.cpython-312-darwin.so +0 -0
  272. biotite/structure/charges.pyx +520 -0
  273. biotite/structure/compare.py +681 -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 +590 -0
  278. biotite/structure/geometry.py +655 -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 +90 -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 +388 -0
  311. biotite/structure/io/pdb/file.py +1356 -0
  312. biotite/structure/io/pdb/hybrid36.cpython-312-darwin.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 +671 -0
  319. biotite/structure/io/pdbx/cif.py +1088 -0
  320. biotite/structure/io/pdbx/component.py +251 -0
  321. biotite/structure/io/pdbx/compress.py +358 -0
  322. biotite/structure/io/pdbx/convert.py +2097 -0
  323. biotite/structure/io/pdbx/encoding.cpython-312-darwin.so +0 -0
  324. biotite/structure/io/pdbx/encoding.pyx +1047 -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 +544 -0
  337. biotite/structure/rings.py +335 -0
  338. biotite/structure/sasa.cpython-312-darwin.so +0 -0
  339. biotite/structure/sasa.pyx +322 -0
  340. biotite/structure/segments.py +292 -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 +168 -0
  349. biotite/version.py +21 -0
  350. biotite/visualize.py +375 -0
  351. biotite-1.3.0.dist-info/METADATA +162 -0
  352. biotite-1.3.0.dist-info/RECORD +354 -0
  353. biotite-1.3.0.dist-info/WHEEL +6 -0
  354. biotite-1.3.0.dist-info/licenses/LICENSE.rst +30 -0
@@ -0,0 +1,655 @@
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 geometric measurements between atoms
7
+ in a structure, mainly lenghts and angles.
8
+ """
9
+
10
+ __name__ = "biotite.structure"
11
+ __author__ = "Patrick Kunzmann"
12
+ __all__ = [
13
+ "displacement",
14
+ "index_displacement",
15
+ "distance",
16
+ "index_distance",
17
+ "angle",
18
+ "index_angle",
19
+ "dihedral",
20
+ "index_dihedral",
21
+ "dihedral_backbone",
22
+ "centroid",
23
+ ]
24
+
25
+ import numpy as np
26
+ from biotite.structure.atoms import AtomArray, AtomArrayStack, coord
27
+ from biotite.structure.box import coord_to_fraction, fraction_to_coord, is_orthogonal
28
+ from biotite.structure.filter import filter_amino_acids
29
+ from biotite.structure.util import (
30
+ coord_for_atom_name_per_residue,
31
+ norm_vector,
32
+ vector_dot,
33
+ )
34
+
35
+
36
+ def displacement(atoms1, atoms2, box=None):
37
+ """
38
+ Measure the displacement vector, i.e. the vector difference, from
39
+ one array of atom coordinates to another array of coordinates.
40
+
41
+ Parameters
42
+ ----------
43
+ atoms1, atoms2 : ndarray, shape=(m,n,3) or ndarray, shape=(n,3) or ndarray, shape=(3,) or Atom or AtomArray or AtomArrayStack
44
+ The atoms to measure the displacement between.
45
+ The vector from `atoms1` to `atoms2` is measured.
46
+ The dimensions may vary.
47
+ Alternatively an ndarray containing the coordinates can be
48
+ provided.
49
+ Usual *NumPy* broadcasting rules apply.
50
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
51
+ If this parameter is set, periodic boundary conditions are
52
+ taken into account (minimum-image convention), based on
53
+ the box vectors given with this parameter.
54
+ The shape *(m,3,3)* is only allowed, when the input coordinates
55
+ comprise multiple models.
56
+
57
+ Returns
58
+ -------
59
+ disp : ndarray, shape=(m,n,3) or ndarray, shape=(n,3) or ndarray, shape=(3,)
60
+ The displacement vector(s). The shape is equal to the shape of
61
+ the input `atoms` with the highest dimensionality.
62
+
63
+ See Also
64
+ --------
65
+ index_displacement : The same calculation, but using atom indices.
66
+ """
67
+ v1 = coord(atoms1)
68
+ v2 = coord(atoms2)
69
+ # Decide subtraction order based on shape, since an array can be
70
+ # only subtracted by an array with less dimensions
71
+ if len(v1.shape) <= len(v2.shape):
72
+ diff = v2 - v1
73
+ else:
74
+ diff = -(v1 - v2)
75
+
76
+ # Use minimum-image convention if box is given
77
+ if box is not None:
78
+ # Transform difference vector
79
+ # from coordinates into fractions of box vectors
80
+ # for faster calculation laster on
81
+ fractions = coord_to_fraction(diff, box)
82
+ # Move vectors into box
83
+ fractions = fractions % 1
84
+ # Check for each model if the box vectors are orthogonal
85
+ orthogonality = is_orthogonal(box)
86
+ disp = np.zeros(fractions.shape, dtype=diff.dtype)
87
+ if fractions.ndim == 1:
88
+ # Single atom
89
+ # Transform into two dimensions
90
+ # to match signature of '_displacement_xxx()'
91
+ fractions = fractions[np.newaxis, :]
92
+ disp = disp[np.newaxis, :]
93
+ if orthogonality:
94
+ _displacement_orthogonal_box(fractions, box, disp)
95
+ else:
96
+ _displacement_triclinic_box(
97
+ fractions.astype(diff.dtype, copy=False),
98
+ box.astype(diff.dtype, copy=False),
99
+ disp,
100
+ )
101
+ # Transform back
102
+ disp = disp[0]
103
+ if fractions.ndim == 2:
104
+ # Single model
105
+ if orthogonality:
106
+ _displacement_orthogonal_box(fractions, box, disp)
107
+ else:
108
+ _displacement_triclinic_box(
109
+ fractions.astype(diff.dtype, copy=False),
110
+ box.astype(diff.dtype, copy=False),
111
+ disp,
112
+ )
113
+ elif fractions.ndim == 3:
114
+ # Multiple models
115
+ # (Model count) x (Atom count)
116
+ for i in range(len(fractions)):
117
+ if box.ndim == 2:
118
+ box_for_model = box
119
+ orthogonality_for_model = orthogonality
120
+ elif box.ndim == 3:
121
+ box_for_model = box[i]
122
+ orthogonality_for_model = orthogonality[i]
123
+ else:
124
+ raise ValueError(f"{box.ndim} are to many box dimensions")
125
+ if orthogonality_for_model:
126
+ _displacement_orthogonal_box(fractions[i], box_for_model, disp[i])
127
+ else:
128
+ _displacement_triclinic_box(
129
+ fractions[i].astype(diff.dtype, copy=False),
130
+ box_for_model.astype(diff.dtype, copy=False),
131
+ disp[i],
132
+ )
133
+ else:
134
+ raise ValueError(f"{diff.shape} is an invalid shape for atom coordinates")
135
+ return disp
136
+
137
+ else:
138
+ return diff
139
+
140
+
141
+ def index_displacement(*args, **kwargs):
142
+ """
143
+ index_displacement(atoms, indices, periodic=False, box=None)
144
+
145
+ Measure the displacement, i.e. the vector difference, between pairs
146
+ of atoms.
147
+
148
+ The pairs refer to indices of a given atom array, whose pairwise
149
+ displacement should be calculated.
150
+ If an atom array stack is provided, the distances are calculated for
151
+ each frame/model.
152
+ In contrast to the :func:`distance()` function, this function is
153
+ able to take periodic boundary conditions into account.
154
+
155
+ Parameters
156
+ ----------
157
+ atoms : AtomArray or AtomArrayStack or ndarray, shape=(n,3) or shape=(m,n,3)
158
+ The atoms the `indices` parameter refers to.
159
+ The pairwise distances are calculated for these pairs.
160
+ Alternatively, the atom coordinates can be directly provided as
161
+ :class:`ndarray`.
162
+ indices : ndarray, shape=(k,2)
163
+ Pairs of indices that point to `atoms`.
164
+ The displacement is measured from ``indices[x,0]`` to
165
+ ``indices[x,1]``.
166
+ periodic : bool, optional
167
+ If set to true, periodic boundary conditions are taken into
168
+ account (minimum-image convention).
169
+ The `box` attribute of the `atoms` parameter is used for
170
+ calculation.
171
+ An alternative box can be provided via the `box` parameter.
172
+ By default, periodicity is ignored.
173
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
174
+ If this parameter is set, the given box is used instead of the
175
+ `box` attribute of `atoms`.
176
+
177
+ Returns
178
+ -------
179
+ disp : ndarray, shape=(k,) or shape=(m,k)
180
+ The pairwise displacements.
181
+ If `atoms` is an atom array stack, The distances are
182
+ calculated for each model.
183
+
184
+ Warnings
185
+ --------
186
+ In case `periodic` is set to true and if the box is not orthorhombic
187
+ (at least one angle deviates from 90 degrees),
188
+ the calculation requires approximately 8 times as long as in the
189
+ orthorhombic case.
190
+ Furthermore, it is not guaranteed, that the lowest-distance periodic
191
+ copy is found for non-orthorhombic boxes; this is especially true
192
+ for heavily skewed boxes.
193
+
194
+ See Also
195
+ --------
196
+ displacement
197
+ """
198
+ return _call_non_index_function(displacement, 2, *args, **kwargs)
199
+
200
+
201
+ def distance(atoms1, atoms2, box=None):
202
+ """
203
+ Measure the euclidian distance between atoms.
204
+
205
+ Parameters
206
+ ----------
207
+ atoms1, atoms2 : ndarray or Atom or AtomArray or AtomArrayStack
208
+ The atoms to measure the distances between.
209
+ The dimensions may vary.
210
+ Alternatively an ndarray containing the coordinates can be
211
+ provided.
212
+ Usual *NumPy* broadcasting rules apply.
213
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
214
+ If this parameter is set, periodic boundary conditions are
215
+ taken into account (minimum-image convention), based on
216
+ the box vectors given with this parameter.
217
+ The shape *(m,3,3)* is only allowed, when the input coordinates
218
+ comprise multiple models.
219
+
220
+ Returns
221
+ -------
222
+ dist : float or ndarray
223
+ The atom distances.
224
+ The shape is equal to the shape of the input `atoms` with the
225
+ highest dimensionality minus the last axis.
226
+
227
+ See Also
228
+ --------
229
+ index_distance : The same calculation, but using atom indices.
230
+ """
231
+ diff = displacement(atoms1, atoms2, box)
232
+ return np.sqrt(vector_dot(diff, diff))
233
+
234
+
235
+ def index_distance(*args, **kwargs):
236
+ """
237
+ index_distance(atoms, indices, periodic=False, box=None)
238
+
239
+ Measure the euclidian distance between pairs of atoms.
240
+
241
+ The pairs refer to indices of a given atom array, whose pairwise
242
+ distances should be calculated.
243
+ If an atom array stack is provided, the distances are calculated for
244
+ each frame/model.
245
+ In contrast to the :func:`distance()` function, this function is
246
+ able to take periodic boundary conditions into account.
247
+
248
+ Parameters
249
+ ----------
250
+ atoms : AtomArray or AtomArrayStack or ndarray, shape=(n,3) or shape=(m,n,3)
251
+ The atoms the `indices` parameter refers to.
252
+ The pairwise distances are calculated for these pairs.
253
+ Alternatively, the atom coordinates can be directly provided as
254
+ :class:`ndarray`.
255
+ indices : ndarray, shape=(k,2)
256
+ Pairs of indices that point to `atoms`.
257
+ periodic : bool, optional
258
+ If set to true, periodic boundary conditions are taken into
259
+ account (minimum-image convention).
260
+ The `box` attribute of the `atoms` parameter is used for
261
+ calculation.
262
+ An alternative box can be provided via the `box` parameter.
263
+ By default, periodicity is ignored.
264
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
265
+ If this parameter is set, the given box is used instead of the
266
+ `box` attribute of `atoms`.
267
+
268
+ Returns
269
+ -------
270
+ dist : ndarray, shape=(k,) or shape=(m,k)
271
+ The pairwise distances.
272
+ If `atoms` is an atom array stack, The distances are
273
+ calculated for each model.
274
+
275
+ Warnings
276
+ --------
277
+ In case `periodic` is set to true and if the box is not orthorhombic
278
+ (at least one angle deviates from 90 degrees),
279
+ the calculation requires approximately 8 times as long as in the
280
+ orthorhombic case.
281
+ Furthermore, it is not guaranteed, that the lowest-distance periodic
282
+ copy is found for non-orthorhombic boxes; this is especially true
283
+ for heavily skewed boxes.
284
+
285
+ See Also
286
+ --------
287
+ distance
288
+ """
289
+ return _call_non_index_function(distance, 2, *args, **kwargs)
290
+
291
+
292
+ def angle(atoms1, atoms2, atoms3, box=None):
293
+ """
294
+ Measure the angle between 3 atoms.
295
+
296
+ Parameters
297
+ ----------
298
+ atoms1, atoms2, atoms3 : ndarray or Atom or AtomArray or AtomArrayStack
299
+ The atoms to measure the angle between. Alternatively an
300
+ ndarray containing the coordinates can be provided.
301
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
302
+ If this parameter is set, periodic boundary conditions are
303
+ taken into account (minimum-image convention), based on
304
+ the box vectors given with this parameter.
305
+ The shape *(m,3,3)* is only allowed, when the input coordinates
306
+ comprise multiple models.
307
+
308
+ Returns
309
+ -------
310
+ angle : float or ndarray
311
+ The angle(s) between the atoms. The shape is equal to the shape
312
+ of the input `atoms` with the highest dimensionality minus the
313
+ last axis.
314
+
315
+ See Also
316
+ --------
317
+ index_angle : The same calculation, but using atom indices.
318
+ """
319
+ v1 = displacement(atoms1, atoms2, box)
320
+ v2 = displacement(atoms3, atoms2, box)
321
+ norm_vector(v1)
322
+ norm_vector(v2)
323
+ return np.arccos(vector_dot(v1, v2))
324
+
325
+
326
+ def index_angle(*args, **kwargs):
327
+ """
328
+ index_angle(atoms, indices, periodic=False, box=None)
329
+
330
+ Measure the angle between triples of atoms.
331
+
332
+ The triples refer to indices of a given atom array, whose triplewise
333
+ angles should be calculated.
334
+ If an atom array stack is provided, the distances are calculated for
335
+ each frame/model.
336
+
337
+ Parameters
338
+ ----------
339
+ atoms : AtomArray or AtomArrayStack or ndarray, shape=(n,3) or shape=(m,n,3)
340
+ The atoms the `indices` parameter refers to.
341
+ The triplewise distances are calculated for these pairs.
342
+ Alternatively, the atom coordinates can be directly provided as
343
+ :class:`ndarray`.
344
+ indices : ndarray, shape=(k,3)
345
+ Triples of indices that point to `atoms`.
346
+ periodic : bool, optional
347
+ If set to true, periodic boundary conditions are taken into
348
+ account (minimum-image convention).
349
+ The `box` attribute of the `atoms` parameter is used for
350
+ calculation.
351
+ An alternative box can be provided via the `box` parameter.
352
+ By default, periodicity is ignored.
353
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
354
+ If this parameter is set, the given box is used instead of the
355
+ `box` attribute of `atoms`.
356
+
357
+ Returns
358
+ -------
359
+ angle : ndarray, shape=(k,) or shape=(m,k)
360
+ The triplewise angles.
361
+ If `atoms` is an atom array stack, The distances are
362
+ calculated for each model.
363
+
364
+ Warnings
365
+ --------
366
+ In case `periodic` is set to true and if the box is not orthorhombic
367
+ (at least one angle deviates from 90 degrees),
368
+ the calculation requires approximately 8 times as long as in the
369
+ orthorhombic case.
370
+ Furthermore, it is not guaranteed, that the lowest-distance periodic
371
+ copy is found for non-orthorhombic boxes; this is especially true
372
+ for heavily skewed boxes.
373
+
374
+ See Also
375
+ --------
376
+ angle
377
+ """
378
+ return _call_non_index_function(angle, 3, *args, **kwargs)
379
+
380
+
381
+ def dihedral(atoms1, atoms2, atoms3, atoms4, box=None):
382
+ """
383
+ Measure the dihedral angle between 4 atoms.
384
+
385
+ Parameters
386
+ ----------
387
+ atoms1, atoms2, atoms3, atoms4 : ndarray or Atom or AtomArray or AtomArrayStack
388
+ The atoms to measure the dihedral angle between.
389
+ Alternatively an ndarray containing the coordinates can be
390
+ provided.
391
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
392
+ If this parameter is set, periodic boundary conditions are
393
+ taken into account (minimum-image convention), based on
394
+ the box vectors given with this parameter.
395
+ The shape *(m,3,3)* is only allowed, when the input coordinates
396
+ comprise multiple models.
397
+
398
+ Returns
399
+ -------
400
+ dihed : float or ndarray
401
+ The dihedral angle(s) between the atoms. The shape is equal to
402
+ the shape of the input `atoms` with the highest dimensionality
403
+ minus the last axis.
404
+
405
+ See Also
406
+ --------
407
+ index_dihedral : The same calculation, but using atom indices.
408
+ dihedral_backbone : Calculate the dihedral angle along a peptide backbone.
409
+ """
410
+ v1 = displacement(atoms1, atoms2, box)
411
+ v2 = displacement(atoms2, atoms3, box)
412
+ v3 = displacement(atoms3, atoms4, box)
413
+ norm_vector(v1)
414
+ norm_vector(v2)
415
+ norm_vector(v3)
416
+
417
+ n1 = np.cross(v1, v2)
418
+ n2 = np.cross(v2, v3)
419
+
420
+ # Calculation using atan2, to ensure the correct sign of the angle
421
+ x = vector_dot(n1, n2)
422
+ y = vector_dot(np.cross(n1, n2), v2)
423
+ return np.arctan2(y, x)
424
+
425
+
426
+ def index_dihedral(*args, **kwargs):
427
+ """
428
+ index_dihedral(atoms, indices, periodic=False, box=None)
429
+
430
+ Measure the dihedral angle between quadruples of atoms.
431
+
432
+ The triples refer to indices of a given atom array, whose
433
+ quadruplewise dihedral angles should be calculated.
434
+ If an atom array stack is provided, the distances are calculated for
435
+ each frame/model.
436
+
437
+ Parameters
438
+ ----------
439
+ atoms : AtomArray or AtomArrayStack or ndarray, shape=(n,3) or shape=(m,n,3)
440
+ The atoms the `indices` parameter refers to.
441
+ The quadruplewise dihedral angles are calculated for these
442
+ pairs.
443
+ Alternatively, the atom coordinates can be directly provided as
444
+ :class:`ndarray`.
445
+ indices : ndarray, shape=(k,4)
446
+ Quadruples of indices that point to `atoms`.
447
+ periodic : bool, optional
448
+ If set to true, periodic boundary conditions are taken into
449
+ account (minimum-image convention).
450
+ The `box` attribute of the `atoms` parameter is used for
451
+ calculation.
452
+ An alternative box can be provided via the `box` parameter.
453
+ By default, periodicity is ignored.
454
+ box : ndarray, shape=(3,3) or shape=(m,3,3), optional
455
+ If this parameter is set, the given box is used instead of the
456
+ `box` attribute of `atoms`.
457
+
458
+ Returns
459
+ -------
460
+ dihedral : ndarray, shape=(k,) or shape=(m,k)
461
+ The quadruplewise dihedral angles.
462
+ If `atoms` is an atom array stack, The distances are
463
+ calculated for each model.
464
+
465
+ Warnings
466
+ --------
467
+ In case `periodic` is set to true and if the box is not orthorhombic
468
+ (at least one angle deviates from 90 degrees),
469
+ the calculation requires approximately 8 times as long as in the
470
+ orthorhombic case.
471
+ Furthermore, it is not guaranteed, that the lowest-distance periodic
472
+ copy is found for non-orthorhombic boxes; this is especially true
473
+ for heavily skewed boxes.
474
+
475
+ See Also
476
+ --------
477
+ dihedral
478
+ dihedral_backbone
479
+ """
480
+ return _call_non_index_function(dihedral, 4, *args, **kwargs)
481
+
482
+
483
+ def dihedral_backbone(atom_array):
484
+ """
485
+ Measure the characteristic backbone dihedral angles of a chain.
486
+
487
+ Parameters
488
+ ----------
489
+ atom_array : AtomArray or AtomArrayStack
490
+ The protein structure to measure the dihedral angles for.
491
+ For missing backbone atoms the corresponding angles are `NaN`.
492
+
493
+ Returns
494
+ -------
495
+ phi, psi, omega : ndarray
496
+ An array containing the 3 backbone dihedral angles for every CA atom.
497
+ `phi` is not defined at the N-terminus, `psi` and `omega` are not defined at the
498
+ C-terminus.
499
+ In these places the arrays have *NaN* values.
500
+ If an :class:`AtomArrayStack` is given, the output angles are 2-dimensional,
501
+ the first dimension corresponds to the model number.
502
+ """
503
+ amino_acid_mask = filter_amino_acids(atom_array)
504
+
505
+ # Coordinates for dihedral angle calculation
506
+ coord_n, coord_ca, coord_c = coord_for_atom_name_per_residue(
507
+ atom_array,
508
+ ("N", "CA", "C"),
509
+ amino_acid_mask,
510
+ )
511
+ n_residues = coord_n.shape[-2]
512
+
513
+ # Coordinates for dihedral angle calculation
514
+ # Dim 0: Model index (only for atom array stacks)
515
+ # Dim 1: Angle index
516
+ # Dim 2: X, Y, Z coordinates
517
+ # Dim 3: Atoms involved in dihedral angle
518
+ if isinstance(atom_array, AtomArray):
519
+ angle_coord_shape: tuple[int, ...] = (n_residues, 3, 4)
520
+ elif isinstance(atom_array, AtomArrayStack):
521
+ angle_coord_shape = (atom_array.stack_depth(), n_residues, 3, 4)
522
+ coord_for_phi = np.full(angle_coord_shape, np.nan, dtype=np.float32)
523
+ coord_for_psi = np.full(angle_coord_shape, np.nan, dtype=np.float32)
524
+ coord_for_omg = np.full(angle_coord_shape, np.nan, dtype=np.float32)
525
+
526
+ # fmt: off
527
+ coord_for_phi[..., 1:, :, 0] = coord_c[..., 0:-1, :]
528
+ coord_for_phi[..., 1:, :, 1] = coord_n[..., 1:, :]
529
+ coord_for_phi[..., 1:, :, 2] = coord_ca[..., 1:, :]
530
+ coord_for_phi[..., 1:, :, 3] = coord_c[..., 1:, :]
531
+
532
+ coord_for_psi[..., 0:-1, :, 0] = coord_n[..., 0:-1, :]
533
+ coord_for_psi[..., 0:-1, :, 1] = coord_ca[..., 0:-1, :]
534
+ coord_for_psi[..., 0:-1, :, 2] = coord_c[..., 0:-1, :]
535
+ coord_for_psi[..., 0:-1, :, 3] = coord_n[..., 1:, :]
536
+
537
+ coord_for_omg[..., 0:-1, :, 0] = coord_ca[..., 0:-1, :]
538
+ coord_for_omg[..., 0:-1, :, 1] = coord_c[..., 0:-1, :]
539
+ coord_for_omg[..., 0:-1, :, 2] = coord_n[..., 1:, :]
540
+ coord_for_omg[..., 0:-1, :, 3] = coord_ca[..., 1:, :]
541
+ # fmt: on
542
+
543
+ phi = dihedral(
544
+ coord_for_phi[..., 0],
545
+ coord_for_phi[..., 1],
546
+ coord_for_phi[..., 2],
547
+ coord_for_phi[..., 3],
548
+ )
549
+ psi = dihedral(
550
+ coord_for_psi[..., 0],
551
+ coord_for_psi[..., 1],
552
+ coord_for_psi[..., 2],
553
+ coord_for_psi[..., 3],
554
+ )
555
+ omg = dihedral(
556
+ coord_for_omg[..., 0],
557
+ coord_for_omg[..., 1],
558
+ coord_for_omg[..., 2],
559
+ coord_for_omg[..., 3],
560
+ )
561
+
562
+ return phi, psi, omg
563
+
564
+
565
+ def centroid(atoms):
566
+ """
567
+ Measure the centroid of a structure.
568
+
569
+ Parameters
570
+ ----------
571
+ atoms : ndarray or AtomArray or AtomArrayStack
572
+ The structures to determine the centroid from.
573
+ Alternatively an ndarray containing the coordinates can be
574
+ provided.
575
+
576
+ Returns
577
+ -------
578
+ centroid : float or ndarray
579
+ The centroid of the structure(s). :class:`ndarray` is returned when
580
+ an :class:`AtomArrayStack` is given (centroid for each model).
581
+ """
582
+ return np.mean(coord(atoms), axis=-2)
583
+
584
+
585
+ def _call_non_index_function(
586
+ function, expected_amount, atoms, indices, periodic=False, box=None
587
+ ):
588
+ """
589
+ Call an `xxx()` function based on the parameters given to a
590
+ `index_xxx()` function.
591
+ """
592
+ if indices.shape[-1] != expected_amount:
593
+ raise ValueError(
594
+ f"Expected length {expected_amount} in the last dimension "
595
+ f"of the indices, but got length {indices.shape[-1]}"
596
+ )
597
+ coord_list = []
598
+ for i in range(expected_amount):
599
+ coord_list.append(coord(atoms)[..., indices[:, i], :])
600
+ if periodic:
601
+ if box is None:
602
+ if isinstance(atoms, (AtomArray, AtomArrayStack)):
603
+ box = atoms.box
604
+ else:
605
+ raise ValueError(
606
+ "If `atoms` are coordinates, the box must be set explicitly"
607
+ )
608
+ else:
609
+ box = None
610
+ return function(*coord_list, box)
611
+
612
+
613
+ def _displacement_orthogonal_box(fractions, box, disp):
614
+ """
615
+ Fill in the PBC-aware displacement vector for non-PBC-aware
616
+ displacements given as fractions of given box vectors.
617
+ """
618
+ # Fraction components are guaranteed to be positive
619
+ # Use fraction vector components with lower absolute
620
+ # -> new_vec[i] = vec[i] - 1 if vec[i] > 0.5 else vec[i]
621
+ fractions[fractions > 0.5] -= 1
622
+ disp[:] = fraction_to_coord(fractions, box)
623
+
624
+
625
+ def _displacement_triclinic_box(fractions, box, disp):
626
+ """
627
+ Fill in the PBC-aware displacement vector for non-PBC-aware
628
+ displacements given as fractions of given box vectors.
629
+ """
630
+ diffs = fraction_to_coord(fractions, box)
631
+ # Fraction components are guaranteed to be positive
632
+ # Test all 3 fraction vector components
633
+ # with positive and negative sign
634
+ # (i,j,k in {-1, 0})
635
+ # Hence, 8 periodic copies are tested
636
+ periodic_shift = []
637
+ for i in range(-1, 1):
638
+ for j in range(-1, 1):
639
+ for k in range(-1, 1):
640
+ x = i * box[0, 0] + j * box[1, 0] + k * box[2, 0]
641
+ y = i * box[0, 1] + j * box[1, 1] + k * box[2, 1]
642
+ z = i * box[0, 2] + j * box[1, 2] + k * box[2, 2]
643
+ periodic_shift.append([x, y, z])
644
+ periodic_shift = np.array(periodic_shift, dtype=disp.dtype)
645
+ # Create 8 periodically shifted variants for each atom
646
+ shifted_diffs = diffs[:, np.newaxis, :] + periodic_shift[np.newaxis, :, :]
647
+ # Find for each atom the periodically shifted variant with lowest
648
+ # distance
649
+ # Lowest squared distance -> lowest distance
650
+ sq_distance = vector_dot(shifted_diffs, shifted_diffs)
651
+ # for each given non-PBC-aware displacement find the PBC-aware
652
+ # displacement with the lowest distance
653
+ disp[:] = shifted_diffs[
654
+ np.arange(len(shifted_diffs)), np.argmin(sq_distance, axis=1)
655
+ ]
@@ -0,0 +1,13 @@
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 visualizing structure related objects.
7
+ """
8
+
9
+ __name__ = "biotite.structure.graphics"
10
+ __author__ = "Patrick Kunzmann, Tom David Müller"
11
+
12
+ from .atoms import *
13
+ from .rna import *