biotite 1.5.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.
Potentially problematic release.
This version of biotite might be problematic. Click here for more details.
- biotite/__init__.py +18 -0
- biotite/application/__init__.py +69 -0
- biotite/application/application.py +276 -0
- biotite/application/autodock/__init__.py +12 -0
- biotite/application/autodock/app.py +500 -0
- biotite/application/blast/__init__.py +14 -0
- biotite/application/blast/alignment.py +92 -0
- biotite/application/blast/webapp.py +428 -0
- biotite/application/clustalo/__init__.py +12 -0
- biotite/application/clustalo/app.py +223 -0
- biotite/application/dssp/__init__.py +12 -0
- biotite/application/dssp/app.py +216 -0
- biotite/application/localapp.py +342 -0
- biotite/application/mafft/__init__.py +12 -0
- biotite/application/mafft/app.py +116 -0
- biotite/application/msaapp.py +363 -0
- biotite/application/muscle/__init__.py +13 -0
- biotite/application/muscle/app3.py +227 -0
- biotite/application/muscle/app5.py +163 -0
- biotite/application/sra/__init__.py +18 -0
- biotite/application/sra/app.py +447 -0
- biotite/application/tantan/__init__.py +12 -0
- biotite/application/tantan/app.py +199 -0
- biotite/application/util.py +77 -0
- biotite/application/viennarna/__init__.py +18 -0
- biotite/application/viennarna/rnaalifold.py +310 -0
- biotite/application/viennarna/rnafold.py +254 -0
- biotite/application/viennarna/rnaplot.py +208 -0
- biotite/application/viennarna/util.py +77 -0
- biotite/application/webapp.py +76 -0
- biotite/copyable.py +71 -0
- biotite/database/__init__.py +23 -0
- biotite/database/afdb/__init__.py +12 -0
- biotite/database/afdb/download.py +197 -0
- biotite/database/entrez/__init__.py +15 -0
- biotite/database/entrez/check.py +60 -0
- biotite/database/entrez/dbnames.py +101 -0
- biotite/database/entrez/download.py +228 -0
- biotite/database/entrez/key.py +44 -0
- biotite/database/entrez/query.py +263 -0
- biotite/database/error.py +16 -0
- biotite/database/pubchem/__init__.py +21 -0
- biotite/database/pubchem/download.py +258 -0
- biotite/database/pubchem/error.py +30 -0
- biotite/database/pubchem/query.py +819 -0
- biotite/database/pubchem/throttle.py +98 -0
- biotite/database/rcsb/__init__.py +13 -0
- biotite/database/rcsb/download.py +161 -0
- biotite/database/rcsb/query.py +963 -0
- biotite/database/uniprot/__init__.py +13 -0
- biotite/database/uniprot/check.py +40 -0
- biotite/database/uniprot/download.py +126 -0
- biotite/database/uniprot/query.py +292 -0
- biotite/file.py +244 -0
- biotite/interface/__init__.py +19 -0
- biotite/interface/openmm/__init__.py +20 -0
- biotite/interface/openmm/state.py +93 -0
- biotite/interface/openmm/system.py +227 -0
- biotite/interface/pymol/__init__.py +201 -0
- biotite/interface/pymol/cgo.py +346 -0
- biotite/interface/pymol/convert.py +185 -0
- biotite/interface/pymol/display.py +267 -0
- biotite/interface/pymol/object.py +1228 -0
- biotite/interface/pymol/shapes.py +178 -0
- biotite/interface/pymol/startup.py +169 -0
- biotite/interface/rdkit/__init__.py +19 -0
- biotite/interface/rdkit/mol.py +490 -0
- biotite/interface/version.py +94 -0
- biotite/interface/warning.py +19 -0
- biotite/sequence/__init__.py +84 -0
- biotite/sequence/align/__init__.py +199 -0
- biotite/sequence/align/alignment.py +702 -0
- biotite/sequence/align/banded.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/banded.pyx +652 -0
- biotite/sequence/align/buckets.py +71 -0
- biotite/sequence/align/cigar.py +425 -0
- biotite/sequence/align/kmeralphabet.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/kmeralphabet.pyx +595 -0
- biotite/sequence/align/kmersimilarity.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/kmersimilarity.pyx +233 -0
- biotite/sequence/align/kmertable.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/kmertable.pyx +3411 -0
- biotite/sequence/align/localgapped.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/localgapped.pyx +892 -0
- biotite/sequence/align/localungapped.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/localungapped.pyx +279 -0
- biotite/sequence/align/matrix.py +631 -0
- biotite/sequence/align/matrix_data/3Di.mat +24 -0
- biotite/sequence/align/matrix_data/BLOSUM100.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM30.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM35.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM40.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM45.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM50.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM50_13p.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM50_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM50_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM55.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM60.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM62.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM62_13p.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM62_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM62_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/BLOSUM65.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM70.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM75.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM80.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM85.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUM90.mat +31 -0
- biotite/sequence/align/matrix_data/BLOSUMN.mat +31 -0
- biotite/sequence/align/matrix_data/CorBLOSUM49_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM57_13p.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM57_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM61_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM66_13p.mat +25 -0
- biotite/sequence/align/matrix_data/CorBLOSUM67_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/DAYHOFF.mat +32 -0
- biotite/sequence/align/matrix_data/GONNET.mat +26 -0
- biotite/sequence/align/matrix_data/IDENTITY.mat +25 -0
- biotite/sequence/align/matrix_data/MATCH.mat +25 -0
- biotite/sequence/align/matrix_data/NUC.mat +25 -0
- biotite/sequence/align/matrix_data/PAM10.mat +34 -0
- biotite/sequence/align/matrix_data/PAM100.mat +34 -0
- biotite/sequence/align/matrix_data/PAM110.mat +34 -0
- biotite/sequence/align/matrix_data/PAM120.mat +34 -0
- biotite/sequence/align/matrix_data/PAM130.mat +34 -0
- biotite/sequence/align/matrix_data/PAM140.mat +34 -0
- biotite/sequence/align/matrix_data/PAM150.mat +34 -0
- biotite/sequence/align/matrix_data/PAM160.mat +34 -0
- biotite/sequence/align/matrix_data/PAM170.mat +34 -0
- biotite/sequence/align/matrix_data/PAM180.mat +34 -0
- biotite/sequence/align/matrix_data/PAM190.mat +34 -0
- biotite/sequence/align/matrix_data/PAM20.mat +34 -0
- biotite/sequence/align/matrix_data/PAM200.mat +34 -0
- biotite/sequence/align/matrix_data/PAM210.mat +34 -0
- biotite/sequence/align/matrix_data/PAM220.mat +34 -0
- biotite/sequence/align/matrix_data/PAM230.mat +34 -0
- biotite/sequence/align/matrix_data/PAM240.mat +34 -0
- biotite/sequence/align/matrix_data/PAM250.mat +34 -0
- biotite/sequence/align/matrix_data/PAM260.mat +34 -0
- biotite/sequence/align/matrix_data/PAM270.mat +34 -0
- biotite/sequence/align/matrix_data/PAM280.mat +34 -0
- biotite/sequence/align/matrix_data/PAM290.mat +34 -0
- biotite/sequence/align/matrix_data/PAM30.mat +34 -0
- biotite/sequence/align/matrix_data/PAM300.mat +34 -0
- biotite/sequence/align/matrix_data/PAM310.mat +34 -0
- biotite/sequence/align/matrix_data/PAM320.mat +34 -0
- biotite/sequence/align/matrix_data/PAM330.mat +34 -0
- biotite/sequence/align/matrix_data/PAM340.mat +34 -0
- biotite/sequence/align/matrix_data/PAM350.mat +34 -0
- biotite/sequence/align/matrix_data/PAM360.mat +34 -0
- biotite/sequence/align/matrix_data/PAM370.mat +34 -0
- biotite/sequence/align/matrix_data/PAM380.mat +34 -0
- biotite/sequence/align/matrix_data/PAM390.mat +34 -0
- biotite/sequence/align/matrix_data/PAM40.mat +34 -0
- biotite/sequence/align/matrix_data/PAM400.mat +34 -0
- biotite/sequence/align/matrix_data/PAM410.mat +34 -0
- biotite/sequence/align/matrix_data/PAM420.mat +34 -0
- biotite/sequence/align/matrix_data/PAM430.mat +34 -0
- biotite/sequence/align/matrix_data/PAM440.mat +34 -0
- biotite/sequence/align/matrix_data/PAM450.mat +34 -0
- biotite/sequence/align/matrix_data/PAM460.mat +34 -0
- biotite/sequence/align/matrix_data/PAM470.mat +34 -0
- biotite/sequence/align/matrix_data/PAM480.mat +34 -0
- biotite/sequence/align/matrix_data/PAM490.mat +34 -0
- biotite/sequence/align/matrix_data/PAM50.mat +34 -0
- biotite/sequence/align/matrix_data/PAM500.mat +34 -0
- biotite/sequence/align/matrix_data/PAM60.mat +34 -0
- biotite/sequence/align/matrix_data/PAM70.mat +34 -0
- biotite/sequence/align/matrix_data/PAM80.mat +34 -0
- biotite/sequence/align/matrix_data/PAM90.mat +34 -0
- biotite/sequence/align/matrix_data/PB.license +21 -0
- biotite/sequence/align/matrix_data/PB.mat +18 -0
- biotite/sequence/align/matrix_data/RBLOSUM52_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM59_13p.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM59_14.3.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM64_5.0.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM69_13p.mat +25 -0
- biotite/sequence/align/matrix_data/RBLOSUM69_14.3.mat +25 -0
- biotite/sequence/align/multiple.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/multiple.pyx +619 -0
- biotite/sequence/align/pairwise.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/pairwise.pyx +585 -0
- biotite/sequence/align/permutation.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/permutation.pyx +313 -0
- biotite/sequence/align/primes.txt +821 -0
- biotite/sequence/align/selector.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/selector.pyx +954 -0
- biotite/sequence/align/statistics.py +264 -0
- biotite/sequence/align/tracetable.cp314-win_amd64.pyd +0 -0
- biotite/sequence/align/tracetable.pxd +64 -0
- biotite/sequence/align/tracetable.pyx +370 -0
- biotite/sequence/alphabet.py +555 -0
- biotite/sequence/annotation.py +836 -0
- biotite/sequence/codec.cp314-win_amd64.pyd +0 -0
- biotite/sequence/codec.pyx +155 -0
- biotite/sequence/codon.py +476 -0
- biotite/sequence/codon_tables.txt +202 -0
- biotite/sequence/graphics/__init__.py +33 -0
- biotite/sequence/graphics/alignment.py +1101 -0
- biotite/sequence/graphics/color_schemes/3di_flower.json +48 -0
- biotite/sequence/graphics/color_schemes/autumn.json +51 -0
- biotite/sequence/graphics/color_schemes/blossom.json +51 -0
- biotite/sequence/graphics/color_schemes/clustalx_dna.json +11 -0
- biotite/sequence/graphics/color_schemes/clustalx_protein.json +28 -0
- biotite/sequence/graphics/color_schemes/flower.json +51 -0
- biotite/sequence/graphics/color_schemes/jalview_buried.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_hydrophobicity.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_helix.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_strand.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_prop_turn.json +31 -0
- biotite/sequence/graphics/color_schemes/jalview_taylor.json +28 -0
- biotite/sequence/graphics/color_schemes/jalview_zappo.json +28 -0
- biotite/sequence/graphics/color_schemes/ocean.json +51 -0
- biotite/sequence/graphics/color_schemes/pb_flower.json +40 -0
- biotite/sequence/graphics/color_schemes/rainbow_dna.json +11 -0
- biotite/sequence/graphics/color_schemes/rainbow_protein.json +30 -0
- biotite/sequence/graphics/color_schemes/spring.json +51 -0
- biotite/sequence/graphics/color_schemes/sunset.json +51 -0
- biotite/sequence/graphics/color_schemes/wither.json +51 -0
- biotite/sequence/graphics/colorschemes.py +170 -0
- biotite/sequence/graphics/dendrogram.py +231 -0
- biotite/sequence/graphics/features.py +544 -0
- biotite/sequence/graphics/logo.py +102 -0
- biotite/sequence/graphics/plasmid.py +712 -0
- biotite/sequence/io/__init__.py +12 -0
- biotite/sequence/io/fasta/__init__.py +22 -0
- biotite/sequence/io/fasta/convert.py +283 -0
- biotite/sequence/io/fasta/file.py +265 -0
- biotite/sequence/io/fastq/__init__.py +19 -0
- biotite/sequence/io/fastq/convert.py +117 -0
- biotite/sequence/io/fastq/file.py +507 -0
- biotite/sequence/io/genbank/__init__.py +17 -0
- biotite/sequence/io/genbank/annotation.py +269 -0
- biotite/sequence/io/genbank/file.py +573 -0
- biotite/sequence/io/genbank/metadata.py +336 -0
- biotite/sequence/io/genbank/sequence.py +173 -0
- biotite/sequence/io/general.py +201 -0
- biotite/sequence/io/gff/__init__.py +26 -0
- biotite/sequence/io/gff/convert.py +128 -0
- biotite/sequence/io/gff/file.py +449 -0
- biotite/sequence/phylo/__init__.py +36 -0
- biotite/sequence/phylo/nj.cp314-win_amd64.pyd +0 -0
- biotite/sequence/phylo/nj.pyx +221 -0
- biotite/sequence/phylo/tree.cp314-win_amd64.pyd +0 -0
- biotite/sequence/phylo/tree.pyx +1169 -0
- biotite/sequence/phylo/upgma.cp314-win_amd64.pyd +0 -0
- biotite/sequence/phylo/upgma.pyx +164 -0
- biotite/sequence/profile.py +561 -0
- biotite/sequence/search.py +117 -0
- biotite/sequence/seqtypes.py +720 -0
- biotite/sequence/sequence.py +373 -0
- biotite/setup_ccd.py +197 -0
- biotite/structure/__init__.py +135 -0
- biotite/structure/alphabet/__init__.py +25 -0
- biotite/structure/alphabet/encoder.py +332 -0
- biotite/structure/alphabet/encoder_weights_3di.kerasify +0 -0
- biotite/structure/alphabet/i3d.py +109 -0
- biotite/structure/alphabet/layers.py +86 -0
- biotite/structure/alphabet/pb.license +21 -0
- biotite/structure/alphabet/pb.py +170 -0
- biotite/structure/alphabet/unkerasify.py +128 -0
- biotite/structure/atoms.py +1562 -0
- biotite/structure/basepairs.py +1403 -0
- biotite/structure/bonds.cp314-win_amd64.pyd +0 -0
- biotite/structure/bonds.pyx +2036 -0
- biotite/structure/box.py +724 -0
- biotite/structure/celllist.cp314-win_amd64.pyd +0 -0
- biotite/structure/celllist.pyx +864 -0
- biotite/structure/chains.py +310 -0
- biotite/structure/charges.cp314-win_amd64.pyd +0 -0
- biotite/structure/charges.pyx +520 -0
- biotite/structure/compare.py +683 -0
- biotite/structure/density.py +109 -0
- biotite/structure/dotbracket.py +213 -0
- biotite/structure/error.py +39 -0
- biotite/structure/filter.py +591 -0
- biotite/structure/geometry.py +817 -0
- biotite/structure/graphics/__init__.py +13 -0
- biotite/structure/graphics/atoms.py +243 -0
- biotite/structure/graphics/rna.py +298 -0
- biotite/structure/hbond.py +425 -0
- biotite/structure/info/__init__.py +24 -0
- biotite/structure/info/atom_masses.json +121 -0
- biotite/structure/info/atoms.py +98 -0
- biotite/structure/info/bonds.py +149 -0
- biotite/structure/info/ccd.py +200 -0
- biotite/structure/info/components.bcif +0 -0
- biotite/structure/info/groups.py +128 -0
- biotite/structure/info/masses.py +121 -0
- biotite/structure/info/misc.py +137 -0
- biotite/structure/info/radii.py +267 -0
- biotite/structure/info/standardize.py +185 -0
- biotite/structure/integrity.py +213 -0
- biotite/structure/io/__init__.py +29 -0
- biotite/structure/io/dcd/__init__.py +13 -0
- biotite/structure/io/dcd/file.py +67 -0
- biotite/structure/io/general.py +243 -0
- biotite/structure/io/gro/__init__.py +14 -0
- biotite/structure/io/gro/file.py +343 -0
- biotite/structure/io/mol/__init__.py +20 -0
- biotite/structure/io/mol/convert.py +112 -0
- biotite/structure/io/mol/ctab.py +420 -0
- biotite/structure/io/mol/header.py +120 -0
- biotite/structure/io/mol/mol.py +149 -0
- biotite/structure/io/mol/sdf.py +940 -0
- biotite/structure/io/netcdf/__init__.py +13 -0
- biotite/structure/io/netcdf/file.py +64 -0
- biotite/structure/io/pdb/__init__.py +20 -0
- biotite/structure/io/pdb/convert.py +389 -0
- biotite/structure/io/pdb/file.py +1380 -0
- biotite/structure/io/pdb/hybrid36.cp314-win_amd64.pyd +0 -0
- biotite/structure/io/pdb/hybrid36.pyx +242 -0
- biotite/structure/io/pdbqt/__init__.py +15 -0
- biotite/structure/io/pdbqt/convert.py +113 -0
- biotite/structure/io/pdbqt/file.py +688 -0
- biotite/structure/io/pdbx/__init__.py +23 -0
- biotite/structure/io/pdbx/bcif.py +674 -0
- biotite/structure/io/pdbx/cif.py +1091 -0
- biotite/structure/io/pdbx/component.py +251 -0
- biotite/structure/io/pdbx/compress.py +362 -0
- biotite/structure/io/pdbx/convert.py +2113 -0
- biotite/structure/io/pdbx/encoding.cp314-win_amd64.pyd +0 -0
- biotite/structure/io/pdbx/encoding.pyx +1078 -0
- biotite/structure/io/trajfile.py +696 -0
- biotite/structure/io/trr/__init__.py +13 -0
- biotite/structure/io/trr/file.py +43 -0
- biotite/structure/io/util.py +38 -0
- biotite/structure/io/xtc/__init__.py +13 -0
- biotite/structure/io/xtc/file.py +43 -0
- biotite/structure/mechanics.py +72 -0
- biotite/structure/molecules.py +337 -0
- biotite/structure/pseudoknots.py +622 -0
- biotite/structure/rdf.py +245 -0
- biotite/structure/repair.py +302 -0
- biotite/structure/residues.py +716 -0
- biotite/structure/rings.py +451 -0
- biotite/structure/sasa.cp314-win_amd64.pyd +0 -0
- biotite/structure/sasa.pyx +322 -0
- biotite/structure/segments.py +328 -0
- biotite/structure/sequence.py +110 -0
- biotite/structure/spacegroups.json +1567 -0
- biotite/structure/spacegroups.license +26 -0
- biotite/structure/sse.py +306 -0
- biotite/structure/superimpose.py +511 -0
- biotite/structure/tm.py +581 -0
- biotite/structure/transform.py +736 -0
- biotite/structure/util.py +160 -0
- biotite/version.py +34 -0
- biotite/visualize.py +375 -0
- biotite-1.5.0.dist-info/METADATA +162 -0
- biotite-1.5.0.dist-info/RECORD +354 -0
- biotite-1.5.0.dist-info/WHEEL +4 -0
- 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
|