chython 2.19__cp313-cp313-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.
- chython/__init__.py +35 -0
- chython/_functions.py +95 -0
- chython/_java.py +57 -0
- chython/algorithms/__init__.py +18 -0
- chython/algorithms/_isomorphism.cp313-win_amd64.pyd +0 -0
- chython/algorithms/_isomorphism.pyx +189 -0
- chython/algorithms/_rings.cp313-win_amd64.pyd +0 -0
- chython/algorithms/_rings.pyx +478 -0
- chython/algorithms/aromatics/__init__.py +27 -0
- chython/algorithms/aromatics/_rules.py +124 -0
- chython/algorithms/aromatics/kekule.py +532 -0
- chython/algorithms/aromatics/test/__init__.py +18 -0
- chython/algorithms/aromatics/test/test_kekule.py +160 -0
- chython/algorithms/aromatics/test/test_thiele.py +263 -0
- chython/algorithms/aromatics/thiele.py +222 -0
- chython/algorithms/calculate2d/__init__.py +23 -0
- chython/algorithms/calculate2d/clean2d.js +1 -0
- chython/algorithms/calculate2d/molecule.py +191 -0
- chython/algorithms/calculate2d/reaction.py +75 -0
- chython/algorithms/conformers.py +106 -0
- chython/algorithms/depict.py +596 -0
- chython/algorithms/fingerprints/__init__.py +43 -0
- chython/algorithms/fingerprints/linear.py +202 -0
- chython/algorithms/fingerprints/morgan.py +132 -0
- chython/algorithms/fingerprints/test/__init__.py +18 -0
- chython/algorithms/fingerprints/test/test_linear.py +127 -0
- chython/algorithms/fingerprints/test/test_morgan.py +79 -0
- chython/algorithms/groups/__init__.py +212 -0
- chython/algorithms/groups/_functional.py +290 -0
- chython/algorithms/groups/_oxidations.py +70 -0
- chython/algorithms/groups/_protective.py +964 -0
- chython/algorithms/groups/_reactions.py +809 -0
- chython/algorithms/groups/_reductions.py +88 -0
- chython/algorithms/groups/_transformations.py +278 -0
- chython/algorithms/groups/test/__init__.py +18 -0
- chython/algorithms/groups/test/test_deprotection.py +108 -0
- chython/algorithms/groups/test/test_reactions.py +377 -0
- chython/algorithms/isomorphism.py +664 -0
- chython/algorithms/mapping/__init__.py +188 -0
- chython/algorithms/mapping/_groups.py +94 -0
- chython/algorithms/mapping/_reactions.py +72 -0
- chython/algorithms/mapping/attention.py +266 -0
- chython/algorithms/mapping/reconstruct.py +346 -0
- chython/algorithms/mcs.py +201 -0
- chython/algorithms/morgan.py +77 -0
- chython/algorithms/rings.py +178 -0
- chython/algorithms/smiles.py +597 -0
- chython/algorithms/standardize/__init__.py +30 -0
- chython/algorithms/standardize/_groups.py +958 -0
- chython/algorithms/standardize/_isomers.py +330 -0
- chython/algorithms/standardize/_metal_organics.py +189 -0
- chython/algorithms/standardize/_reagents.py +44 -0
- chython/algorithms/standardize/_salts.py +68 -0
- chython/algorithms/standardize/molecule.py +475 -0
- chython/algorithms/standardize/reaction.py +384 -0
- chython/algorithms/standardize/resonance.py +191 -0
- chython/algorithms/standardize/salts.py +128 -0
- chython/algorithms/standardize/saturation.py +373 -0
- chython/algorithms/standardize/test/__init__.py +18 -0
- chython/algorithms/standardize/test/test_canonicalize.py +66 -0
- chython/algorithms/standardize/test/test_groups.py +146 -0
- chython/algorithms/standardize/test/test_isomers.py +198 -0
- chython/algorithms/stereo.py +1215 -0
- chython/algorithms/tautomers/__init__.py +167 -0
- chython/algorithms/tautomers/_acid.py +59 -0
- chython/algorithms/tautomers/_base.py +116 -0
- chython/algorithms/tautomers/_keto_enol.py +107 -0
- chython/algorithms/tautomers/acid_base.py +208 -0
- chython/algorithms/tautomers/heteroarenes.py +103 -0
- chython/algorithms/tautomers/keto_enol.py +143 -0
- chython/algorithms/tautomers/test/__init__.py +18 -0
- chython/algorithms/tautomers/test/test_tautomers.py +80 -0
- chython/algorithms/test/__init__.py +18 -0
- chython/algorithms/test/test_isomorphism.py +58 -0
- chython/algorithms/test/test_smiles.py +76 -0
- chython/algorithms/x3dom.py +350 -0
- chython/containers/__init__.py +48 -0
- chython/containers/_pack_v2.cp313-win_amd64.pyd +0 -0
- chython/containers/_pack_v2.pyx +271 -0
- chython/containers/_unpack_v0v2.cp313-win_amd64.pyd +0 -0
- chython/containers/_unpack_v0v2.pyx +302 -0
- chython/containers/bonds.py +255 -0
- chython/containers/cgr.py +115 -0
- chython/containers/chimera.py +63 -0
- chython/containers/graph.py +199 -0
- chython/containers/molecule.py +817 -0
- chython/containers/query.py +71 -0
- chython/containers/rdkit.py +183 -0
- chython/containers/reaction.py +324 -0
- chython/containers/test/__init__.py +18 -0
- chython/containers/test/test_molecule.py +117 -0
- chython/containers/test/test_pack.py +60 -0
- chython/containers/test/test_rdkit.py +70 -0
- chython/containers/test/test_reaction.py +40 -0
- chython/exceptions.py +114 -0
- chython/files/MRVrw.py +532 -0
- chython/files/PDBrw.py +255 -0
- chython/files/RDFrw.py +309 -0
- chython/files/SDFrw.py +221 -0
- chython/files/__init__.py +30 -0
- chython/files/_convert.py +207 -0
- chython/files/_mapping.py +117 -0
- chython/files/_xyz.cp313-win_amd64.pyd +0 -0
- chython/files/_xyz.pyx +74 -0
- chython/files/daylight/__init__.py +24 -0
- chython/files/daylight/parser.py +157 -0
- chython/files/daylight/smarts.py +107 -0
- chython/files/daylight/smiles.py +260 -0
- chython/files/daylight/test/__init__.py +18 -0
- chython/files/daylight/test/test_daylight_smarts.py +289 -0
- chython/files/daylight/test/test_daylight_smiles.py +101 -0
- chython/files/daylight/test/test_parser.py +118 -0
- chython/files/daylight/test/test_tokenize.py +77 -0
- chython/files/daylight/tokenize.py +376 -0
- chython/files/libinchi/__init__.py +22 -0
- chython/files/libinchi/libinchi.dll +0 -0
- chython/files/libinchi/wrapper.py +554 -0
- chython/files/mdl/__init__.py +25 -0
- chython/files/mdl/emol.py +251 -0
- chython/files/mdl/erxn.py +67 -0
- chython/files/mdl/mol.py +186 -0
- chython/files/mdl/read.py +223 -0
- chython/files/mdl/rxn.py +67 -0
- chython/files/mdl/stereo.py +63 -0
- chython/files/mdl/write.py +201 -0
- chython/files/opsin.py +35 -0
- chython/files/test/__init__.py +0 -0
- chython/files/test/test_inchi.py +27 -0
- chython/files/test/test_mrv.py +47 -0
- chython/files/test/test_sdf_rdf.py +64 -0
- chython/files/test/test_xyz.py +20 -0
- chython/files/xyz.py +78 -0
- chython/periodictable/__init__.py +69 -0
- chython/periodictable/base/__init__.py +25 -0
- chython/periodictable/base/dynamic.py +149 -0
- chython/periodictable/base/element.py +451 -0
- chython/periodictable/base/groups.py +90 -0
- chython/periodictable/base/periods.py +46 -0
- chython/periodictable/base/query.py +473 -0
- chython/periodictable/base/vector.py +119 -0
- chython/periodictable/groupI.py +252 -0
- chython/periodictable/groupII.py +223 -0
- chython/periodictable/groupIII.py +1154 -0
- chython/periodictable/groupIV.py +210 -0
- chython/periodictable/groupIX.py +196 -0
- chython/periodictable/groupV.py +192 -0
- chython/periodictable/groupVI.py +183 -0
- chython/periodictable/groupVII.py +162 -0
- chython/periodictable/groupVIII.py +161 -0
- chython/periodictable/groupX.py +166 -0
- chython/periodictable/groupXI.py +164 -0
- chython/periodictable/groupXII.py +158 -0
- chython/periodictable/groupXIII.py +239 -0
- chython/periodictable/groupXIV.py +262 -0
- chython/periodictable/groupXV.py +276 -0
- chython/periodictable/groupXVI.py +457 -0
- chython/periodictable/groupXVII.py +324 -0
- chython/periodictable/groupXVIII.py +260 -0
- chython/periodictable/test/__init__.py +0 -0
- chython/periodictable/test/test_element.py +100 -0
- chython/reactor/__init__.py +24 -0
- chython/reactor/base.py +222 -0
- chython/reactor/reactor.py +177 -0
- chython/reactor/test/__init__.py +18 -0
- chython/reactor/test/test_reactor.py +40 -0
- chython/reactor/test/test_transformer.py +78 -0
- chython/reactor/transformer.py +72 -0
- chython/utils/__init__.py +50 -0
- chython/utils/free_wilson.py +114 -0
- chython/utils/grid.py +130 -0
- chython/utils/retro.py +139 -0
- chython-2.19.dist-info/METADATA +105 -0
- chython-2.19.dist-info/RECORD +175 -0
- chython-2.19.dist-info/WHEEL +4 -0
- chython-2.19.dist-info/licenses/LICENSE +165 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2022-2026 Ramil Nugmanov <nougmanoff@protonmail.com>
|
|
4
|
+
# This file is part of chython.
|
|
5
|
+
#
|
|
6
|
+
# chython is free software; you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
|
8
|
+
# the Free Software Foundation; either version 3 of the License, or
|
|
9
|
+
# (at your option) any later version.
|
|
10
|
+
#
|
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
# GNU Lesser General Public License for more details.
|
|
15
|
+
#
|
|
16
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
17
|
+
# along with this program; if not, see <https://www.gnu.org/licenses/>.
|
|
18
|
+
#
|
|
19
|
+
from itertools import product
|
|
20
|
+
from typing import Union, List
|
|
21
|
+
from .retro import Tree
|
|
22
|
+
from ..containers import MoleculeContainer, QueryContainer
|
|
23
|
+
from ..periodictable import H
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def fw_prepare_groups(core: Union[MoleculeContainer, QueryContainer], molecule: MoleculeContainer) -> \
|
|
27
|
+
List[MoleculeContainer]:
|
|
28
|
+
"""
|
|
29
|
+
Prepare list of core with connected groups. Hydrogens added to groups for marking connection point.
|
|
30
|
+
Hydrogens have isotope marks equal to mapping of core atoms.
|
|
31
|
+
Groups connected multiple times (rings) - contains multiple hydrogens.
|
|
32
|
+
|
|
33
|
+
:param core: core structure for searching
|
|
34
|
+
:param molecule: target structure
|
|
35
|
+
"""
|
|
36
|
+
try:
|
|
37
|
+
core_map = next(core.get_mapping(molecule))
|
|
38
|
+
except StopIteration:
|
|
39
|
+
return []
|
|
40
|
+
|
|
41
|
+
reverse = {v: k for k, v in core_map.items()}
|
|
42
|
+
cs = set(core_map.values())
|
|
43
|
+
groups = molecule.substructure(molecule._atoms.keys() - cs, recalculate_hydrogens=False)
|
|
44
|
+
gs = set(groups)
|
|
45
|
+
|
|
46
|
+
cf = molecule.substructure(cs, recalculate_hydrogens=False)
|
|
47
|
+
|
|
48
|
+
for n, m, b in molecule.bonds():
|
|
49
|
+
if n in cs:
|
|
50
|
+
if m in gs:
|
|
51
|
+
a = molecule.atom(n)
|
|
52
|
+
h = H(x=a.x, y=a.y)
|
|
53
|
+
h._isotope = reverse[n] # mark mapping to isotope
|
|
54
|
+
groups.add_bond(groups.add_atom(h, _skip_calculation=True), m, b.copy(), _skip_calculation=True)
|
|
55
|
+
|
|
56
|
+
a = molecule.atom(m)
|
|
57
|
+
h = H(x=a.x, y=a.y)
|
|
58
|
+
h._isotope = reverse[n] # mark mapping to isotope
|
|
59
|
+
cf.add_bond(cf.add_atom(h, _skip_calculation=True), n, b.copy(), _skip_calculation=True)
|
|
60
|
+
elif m in cs and n in gs:
|
|
61
|
+
a = molecule.atom(m)
|
|
62
|
+
h = H(x=a.x, y=a.y)
|
|
63
|
+
h._isotope = reverse[m]
|
|
64
|
+
groups.add_bond(groups.add_atom(h, _skip_calculation=True), n, b.copy(), _skip_calculation=True)
|
|
65
|
+
|
|
66
|
+
a = molecule.atom(n)
|
|
67
|
+
h = H(x=a.x, y=a.y)
|
|
68
|
+
h._isotope = reverse[m] # mark mapping to isotope
|
|
69
|
+
cf.add_bond(cf.add_atom(h.copy(), _skip_calculation=True), n, b.copy(), _skip_calculation=True)
|
|
70
|
+
groups = groups.split()
|
|
71
|
+
groups.insert(0, cf)
|
|
72
|
+
return groups
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def fw_decomposition_tree(groups: List[MoleculeContainer]) -> Tree:
|
|
76
|
+
assert len(groups) == len(set(groups))
|
|
77
|
+
|
|
78
|
+
pred = {} # directed graph from substructures to superstructures
|
|
79
|
+
succ = {}
|
|
80
|
+
for m in groups:
|
|
81
|
+
pred[m] = set()
|
|
82
|
+
succ[m] = set()
|
|
83
|
+
|
|
84
|
+
for m in groups:
|
|
85
|
+
for n in groups:
|
|
86
|
+
if m < n:
|
|
87
|
+
pred[n].add(m)
|
|
88
|
+
succ[m].add(n)
|
|
89
|
+
|
|
90
|
+
# break triangles
|
|
91
|
+
scope = {m for m, ns in succ.items() if len(ns) > 1}
|
|
92
|
+
while scope:
|
|
93
|
+
m = sorted(scope, key=lambda x: len(pred[x]))[0]
|
|
94
|
+
s = succ[m]
|
|
95
|
+
scope.discard(m)
|
|
96
|
+
while True:
|
|
97
|
+
for x, y in product((x for x in s if succ[x]), (x for x in s if len(pred[x]) > 1)):
|
|
98
|
+
if y in succ[x]:
|
|
99
|
+
s.discard(y)
|
|
100
|
+
pred[y].discard(m)
|
|
101
|
+
break
|
|
102
|
+
else:
|
|
103
|
+
break
|
|
104
|
+
|
|
105
|
+
def _rec_tree(x):
|
|
106
|
+
return x, [_rec_tree(y) for y in succ[x]]
|
|
107
|
+
|
|
108
|
+
m = MoleculeContainer()
|
|
109
|
+
m.add_atom('H')
|
|
110
|
+
|
|
111
|
+
return m, [_rec_tree(x) for x, p in pred.items() if not p]
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
__all__ = ['fw_prepare_groups', 'fw_decomposition_tree']
|
chython/utils/grid.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2021-2026 Ramil Nugmanov <nougmanoff@protonmail.com>
|
|
4
|
+
# Copyright 2024 Philippe Gantzer <p.gantzer@icredd.hokudai.ac.jp>
|
|
5
|
+
# This file is part of chython.
|
|
6
|
+
#
|
|
7
|
+
# chython is free software; you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
|
9
|
+
# the Free Software Foundation; either version 3 of the License, or
|
|
10
|
+
# (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# This program is distributed in the hope that it will be useful,
|
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
# GNU Lesser General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
18
|
+
# along with this program; if not, see <https://www.gnu.org/licenses/>.
|
|
19
|
+
#
|
|
20
|
+
from itertools import zip_longest
|
|
21
|
+
from typing import List, Optional
|
|
22
|
+
from ..containers import MoleculeContainer
|
|
23
|
+
from ..algorithms.depict import _render_config, _graph_svg
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def grid_depict(molecules: List[MoleculeContainer], labels: Optional[List[str]] = None, *, cols: int = 3,
|
|
27
|
+
width=None, height=None, clean2d: bool = True):
|
|
28
|
+
"""
|
|
29
|
+
Depict molecules grid.
|
|
30
|
+
|
|
31
|
+
:param molecules: list of molecules
|
|
32
|
+
:param labels: optional list of text labels
|
|
33
|
+
:param cols: number of molecules per row
|
|
34
|
+
:param width: set svg width param. by default auto-calculated.
|
|
35
|
+
:param height: set svg height param. by default auto-calculated.
|
|
36
|
+
:param clean2d: calculate coordinates if necessary.
|
|
37
|
+
"""
|
|
38
|
+
font_size = _render_config['font_size']
|
|
39
|
+
symbols_font_style = _render_config['symbols_font_style']
|
|
40
|
+
font125 = 1.25 * font_size
|
|
41
|
+
font75 = .75 * font_size
|
|
42
|
+
|
|
43
|
+
planes = []
|
|
44
|
+
render = []
|
|
45
|
+
render_labels = []
|
|
46
|
+
shift_y = 0.
|
|
47
|
+
shift_x = 0.
|
|
48
|
+
if labels is not None:
|
|
49
|
+
assert len(molecules) == len(labels)
|
|
50
|
+
labels = iter(labels)
|
|
51
|
+
|
|
52
|
+
if clean2d:
|
|
53
|
+
for m in molecules:
|
|
54
|
+
if len(m) > 1:
|
|
55
|
+
min_x = min(a.x for _, a in m.atoms())
|
|
56
|
+
max_x = max(a.x for _, a in m.atoms())
|
|
57
|
+
min_y = min(a.y for _, a in m.atoms())
|
|
58
|
+
max_y = max(a.y for _, a in m.atoms())
|
|
59
|
+
if max_y - min_y < .01 and max_x - min_x < 0.01:
|
|
60
|
+
m.clean2d()
|
|
61
|
+
|
|
62
|
+
for ms in zip_longest(*[iter(molecules)] * cols):
|
|
63
|
+
row_height = 0.
|
|
64
|
+
for m in ms:
|
|
65
|
+
if m is None:
|
|
66
|
+
break
|
|
67
|
+
min_y = min(a.y for _, a in m.atoms())
|
|
68
|
+
max_y = max(a.y for _, a in m.atoms())
|
|
69
|
+
h = max_y - min_y
|
|
70
|
+
if row_height < h: # get height of row
|
|
71
|
+
row_height = h
|
|
72
|
+
planes.append([a.xy for _, a in m.atoms()])
|
|
73
|
+
|
|
74
|
+
max_x = 0.
|
|
75
|
+
for m in ms:
|
|
76
|
+
if m is None:
|
|
77
|
+
break
|
|
78
|
+
if labels is not None:
|
|
79
|
+
render_labels.append(f' <text x="{max_x:.2f}" y="{-shift_y:.2f}">{next(labels)}</text>')
|
|
80
|
+
y = shift_y - row_height / 2. - font125 # blank
|
|
81
|
+
else:
|
|
82
|
+
y = shift_y - row_height / 2.
|
|
83
|
+
max_x = m._fix_plane_mean(max_x, y) + 4. * font_size
|
|
84
|
+
render.append(m.depict(_embedding=True)[:5])
|
|
85
|
+
if max_x > shift_x: # get total width
|
|
86
|
+
shift_x = max_x
|
|
87
|
+
shift_y -= row_height + 4. * font_size
|
|
88
|
+
|
|
89
|
+
# restore planes
|
|
90
|
+
for m, p in zip(molecules, planes):
|
|
91
|
+
for (_, a), xy in zip(m.atoms(), p):
|
|
92
|
+
a.xy = xy
|
|
93
|
+
|
|
94
|
+
_width = shift_x - 1.5 * font_size
|
|
95
|
+
_height = -shift_y - 1.5 * font_size
|
|
96
|
+
if width is None:
|
|
97
|
+
width = f'{_width:.2f}cm'
|
|
98
|
+
if height is None:
|
|
99
|
+
height = f'{_height:.2f}cm'
|
|
100
|
+
svg = [f'<svg width="{width}" height="{height}" '
|
|
101
|
+
f'viewBox="{-font125:.2f} {-font125:.2f} {_width:.2f} {_height:.2f}" '
|
|
102
|
+
'xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">']
|
|
103
|
+
for atoms, bonds, define, masks, uid in render:
|
|
104
|
+
svg.extend(_graph_svg(atoms, bonds, define, masks, uid, -font125, -font125, _width, _height))
|
|
105
|
+
svg.append(f' <g font-size="{font75:.2f}" font-family="{symbols_font_style}">')
|
|
106
|
+
svg.extend(render_labels)
|
|
107
|
+
svg.append(' </g>')
|
|
108
|
+
svg.append('</svg>')
|
|
109
|
+
return '\n'.join(svg)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class GridDepict:
|
|
113
|
+
"""
|
|
114
|
+
Grid depict for Jupyter notebooks.
|
|
115
|
+
"""
|
|
116
|
+
def __init__(self, molecules: List[MoleculeContainer], labels: Optional[List[str]] = None, *, cols: int = 3):
|
|
117
|
+
"""
|
|
118
|
+
:param molecules: list of molecules
|
|
119
|
+
:param labels: optional list of text labels
|
|
120
|
+
:param cols: number of molecules per row
|
|
121
|
+
"""
|
|
122
|
+
self.molecules = molecules
|
|
123
|
+
self.labels = labels
|
|
124
|
+
self.cols = cols
|
|
125
|
+
|
|
126
|
+
def _repr_svg_(self):
|
|
127
|
+
return grid_depict(self.molecules, self.labels, cols=self.cols)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
__all__ = ['grid_depict', 'GridDepict']
|
chython/utils/retro.py
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Copyright 2021-2026 Ramil Nugmanov <nougmanoff@protonmail.com>
|
|
4
|
+
# Copyright 2021 Alexander Sizov <murkyrussian@gmail.com>
|
|
5
|
+
# This file is part of chython.
|
|
6
|
+
#
|
|
7
|
+
# chython is free software; you can redistribute it and/or modify
|
|
8
|
+
# it under the terms of the GNU Lesser General Public License as published by
|
|
9
|
+
# the Free Software Foundation; either version 3 of the License, or
|
|
10
|
+
# (at your option) any later version.
|
|
11
|
+
#
|
|
12
|
+
# This program is distributed in the hope that it will be useful,
|
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
# GNU Lesser General Public License for more details.
|
|
16
|
+
#
|
|
17
|
+
# You should have received a copy of the GNU Lesser General Public License
|
|
18
|
+
# along with this program; if not, see <https://www.gnu.org/licenses/>.
|
|
19
|
+
#
|
|
20
|
+
from chython import MoleculeContainer
|
|
21
|
+
from typing import Tuple, List
|
|
22
|
+
from ..algorithms.depict import _render_config, _graph_svg
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
Tree = Tuple[MoleculeContainer, List['Tree']]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def retro_depict(tree: Tree, *, y_gap=3., x_gap=5., width=None, height=None, clean2d: bool = True) -> str:
|
|
29
|
+
"""
|
|
30
|
+
Depict retrosynthetic tree.
|
|
31
|
+
|
|
32
|
+
:param tree: Graph of molecules with recursive structure. Each node is tuple of molecule and list of child nodes.
|
|
33
|
+
Child nodes list can be empty.
|
|
34
|
+
:param y_gap: vertical gap between molecules.
|
|
35
|
+
:param x_gap: horizontal gap between molecules.
|
|
36
|
+
:param width: set svg width param. by default auto-calculated.
|
|
37
|
+
:param height: set svg height param. by default auto-calculated.
|
|
38
|
+
:param clean2d: calculate coordinates if necessary.
|
|
39
|
+
"""
|
|
40
|
+
font_size = _render_config['font_size']
|
|
41
|
+
font125 = 1.25 * font_size
|
|
42
|
+
|
|
43
|
+
arrows = []
|
|
44
|
+
columns = [[tree[0]]]
|
|
45
|
+
current_layer = [(0, x) for x in tree[1]]
|
|
46
|
+
while current_layer:
|
|
47
|
+
next_layer = []
|
|
48
|
+
column = []
|
|
49
|
+
columns.append(column)
|
|
50
|
+
for i, (j, (m, ms)) in enumerate(current_layer):
|
|
51
|
+
column.append(m)
|
|
52
|
+
arrows.append(j) # i-th molecule in current column connected to j-th molecule in previous.
|
|
53
|
+
next_layer.extend((i, x) for x in ms)
|
|
54
|
+
current_layer = next_layer
|
|
55
|
+
|
|
56
|
+
x_shift = 0.
|
|
57
|
+
c_max_x = 0.
|
|
58
|
+
c_max_y = 0.
|
|
59
|
+
arrows = iter(arrows)
|
|
60
|
+
render = []
|
|
61
|
+
last_layer = []
|
|
62
|
+
arrows_coords = []
|
|
63
|
+
for column in columns:
|
|
64
|
+
current_layer = []
|
|
65
|
+
|
|
66
|
+
if clean2d:
|
|
67
|
+
for m in column:
|
|
68
|
+
if len(m) > 1:
|
|
69
|
+
min_x = min(a.x for _, a in m.atoms())
|
|
70
|
+
max_x = max(a.x for _, a in m.atoms())
|
|
71
|
+
min_y = min(a.y for _, a in m.atoms())
|
|
72
|
+
max_y = max(a.y for _, a in m.atoms())
|
|
73
|
+
if max_y - min_y < .01 and max_x - min_x < 0.01:
|
|
74
|
+
m.clean2d()
|
|
75
|
+
|
|
76
|
+
heights = [max(a.y for _, a in m.atoms()) - min(a.y for _, a in m.atoms()) for m in column]
|
|
77
|
+
y_shift = sum(heights) + y_gap * (len(heights) - 1) # column height with gaps
|
|
78
|
+
if y_shift > c_max_y:
|
|
79
|
+
c_max_y = y_shift
|
|
80
|
+
y_shift /= 2. # center align
|
|
81
|
+
|
|
82
|
+
for m, h in zip(column, heights):
|
|
83
|
+
plane = [a.xy for _, a in m.atoms()] # backup
|
|
84
|
+
mx = m._fix_plane_min(x_shift, -y_shift)
|
|
85
|
+
if mx > c_max_x:
|
|
86
|
+
c_max_x = mx
|
|
87
|
+
|
|
88
|
+
current_layer.append((mx + 1., y_shift - h / 2.))
|
|
89
|
+
if x_shift: # except first column
|
|
90
|
+
arrows_coords.append((*last_layer[next(arrows)], x_shift - 1., y_shift - h / 2.))
|
|
91
|
+
y_shift -= h + y_gap
|
|
92
|
+
|
|
93
|
+
render.append(m.depict(_embedding=True)[:5])
|
|
94
|
+
for (_, a), xy in zip(m.atoms(), plane): # restore
|
|
95
|
+
a.xy = xy
|
|
96
|
+
|
|
97
|
+
x_shift = c_max_x + x_gap # between columns gap
|
|
98
|
+
last_layer = current_layer
|
|
99
|
+
|
|
100
|
+
_width = c_max_x + 3.0 * font_size
|
|
101
|
+
_height = c_max_y + 2.5 * font_size
|
|
102
|
+
box_y = _height / 2.
|
|
103
|
+
if width is None:
|
|
104
|
+
width = f'{_width:.2f}cm'
|
|
105
|
+
if height is None:
|
|
106
|
+
height = f'{_height:.2f}cm'
|
|
107
|
+
svg = [f'<svg width="{width}" height="{height}" '
|
|
108
|
+
f'viewBox="{-font125:.2f} {-box_y:.2f} {_width:.2f} {_height:.2f}" '
|
|
109
|
+
'xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">',
|
|
110
|
+
' <defs>\n <marker id="arrow" markerWidth="10" markerHeight="10" '
|
|
111
|
+
'refX="0" refY="3" orient="auto">\n <path d="M0,0 L0,6 L9,3"/>\n </marker>\n </defs>']
|
|
112
|
+
for atoms, bonds, define, masks, uid in render:
|
|
113
|
+
svg.extend(_graph_svg(atoms, bonds, define, masks, uid, -font125, -box_y, _width, _height))
|
|
114
|
+
|
|
115
|
+
svg.append(' <g fill="none" stroke="black" stroke-width=".04" marker-end="url(#arrow)">')
|
|
116
|
+
for x1, y1, x2, y2 in arrows_coords:
|
|
117
|
+
svg.append(f' <line x1="{x1:.2f}" y1="{y1:.2f}" x2="{x2:.2f}" y2="{y2:.2f}"/>')
|
|
118
|
+
svg.append(' </g>')
|
|
119
|
+
svg.append('</svg>')
|
|
120
|
+
return '\n'.join(svg)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class RetroDepict:
|
|
124
|
+
"""
|
|
125
|
+
Grid depict for Jupyter notebooks.
|
|
126
|
+
"""
|
|
127
|
+
def __init__(self, tree: Tree):
|
|
128
|
+
"""
|
|
129
|
+
:param tree: Graph of molecules with recursive structure.
|
|
130
|
+
Each node is tuple of molecule and list of child nodes.
|
|
131
|
+
Child nodes list can be empty.
|
|
132
|
+
"""
|
|
133
|
+
self.tree = tree
|
|
134
|
+
|
|
135
|
+
def _repr_svg_(self):
|
|
136
|
+
return retro_depict(self.tree)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
__all__ = ['retro_depict', 'RetroDepict']
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: chython
|
|
3
|
+
Version: 2.19
|
|
4
|
+
Summary: Library for processing molecules and reactions in python way
|
|
5
|
+
License: LGPLv3
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Author: Ramil Nugmanov
|
|
8
|
+
Author-email: nougmanoff@protonmail.com
|
|
9
|
+
Requires-Python: >=3.10
|
|
10
|
+
Classifier: Environment :: Plugins
|
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
|
12
|
+
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)
|
|
13
|
+
Classifier: License :: Other/Proprietary License
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Programming Language :: Python
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: Chemistry
|
|
25
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
26
|
+
Classifier: Topic :: Software Development
|
|
27
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
28
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
29
|
+
Provides-Extra: extra-clean2d
|
|
30
|
+
Provides-Extra: extra-clean3d
|
|
31
|
+
Provides-Extra: mapping
|
|
32
|
+
Provides-Extra: png
|
|
33
|
+
Provides-Extra: racer-default
|
|
34
|
+
Provides-Extra: racer-deprecated
|
|
35
|
+
Provides-Extra: rdkit
|
|
36
|
+
Requires-Dist: cdpkit (>=1.2.3) ; extra == "extra-clean3d"
|
|
37
|
+
Requires-Dist: chython-rxnmap (>=2.0) ; extra == "mapping"
|
|
38
|
+
Requires-Dist: jpype1 (>=1.6.0) ; extra == "extra-clean2d"
|
|
39
|
+
Requires-Dist: lazy-object-proxy (>=1.6)
|
|
40
|
+
Requires-Dist: mini-racer (>=0.12.4) ; extra == "racer-default"
|
|
41
|
+
Requires-Dist: numpy (>=1.21.0)
|
|
42
|
+
Requires-Dist: onnxruntime (>=1.16) ; extra == "mapping"
|
|
43
|
+
Requires-Dist: openbabel-wheel (>=3.1.1.22) ; extra == "extra-clean2d"
|
|
44
|
+
Requires-Dist: py-mini-racer (>=0.6.0) ; extra == "racer-deprecated"
|
|
45
|
+
Requires-Dist: pyppeteer (>=2.0.0) ; extra == "png"
|
|
46
|
+
Requires-Dist: rdkit (>=2023.9) ; extra == "rdkit"
|
|
47
|
+
Requires-Dist: scipy (>=1.10) ; extra == "mapping"
|
|
48
|
+
Project-URL: Documentation, https://chython.readthedocs.io
|
|
49
|
+
Project-URL: Homepage, https://github.com/chython/chython
|
|
50
|
+
Description-Content-Type: text/x-rst
|
|
51
|
+
|
|
52
|
+
Chython [ˈkʌɪθ(ə)n]
|
|
53
|
+
===================
|
|
54
|
+
|
|
55
|
+
Library for processing molecules and reactions in python way.
|
|
56
|
+
|
|
57
|
+
Features:
|
|
58
|
+
- Read/write/convert formats: MDL .RDF (.RXN) and .SDF (.MOL), .MRV, SMILES, INCHI (inchi-trust library), .XYZ, .PDB
|
|
59
|
+
- Standardize molecules and reactions and valid structures checker
|
|
60
|
+
- Supported python-magic
|
|
61
|
+
- Tetrahedron, Allene and CIS-TRANS stereo supported
|
|
62
|
+
- Perform subgraph search
|
|
63
|
+
- Build/edit molecules and reactions with Python API
|
|
64
|
+
- Produce template based reactions and molecules
|
|
65
|
+
- Atom-to-atom mapping, checking and rule-based fixing
|
|
66
|
+
- Perform MCS search
|
|
67
|
+
- 2d coordinates generation (based on `SmilesDrawer <https://github.com/reymond-group/smilesDrawer>`_)
|
|
68
|
+
- 2d/3d depiction with Jupyter support
|
|
69
|
+
- SMARTS parser with restrictions
|
|
70
|
+
- Protective groups remover
|
|
71
|
+
- Common reaction templates collection
|
|
72
|
+
|
|
73
|
+
Full documentation can be found `here <https://chython.readthedocs.io>`_.
|
|
74
|
+
|
|
75
|
+
CGRtools
|
|
76
|
+
========
|
|
77
|
+
|
|
78
|
+
Chython is fork of `CGRtools <https://github.com/stsouko/CGRtools>`_.
|
|
79
|
+
|
|
80
|
+
Install
|
|
81
|
+
=======
|
|
82
|
+
|
|
83
|
+
Only python 3.10+.
|
|
84
|
+
|
|
85
|
+
pip install chython[racer-default]
|
|
86
|
+
|
|
87
|
+
Copyright
|
|
88
|
+
=========
|
|
89
|
+
|
|
90
|
+
* 2014-2026 Ramil Nugmanov nougmanoff@protonmail.com main developer
|
|
91
|
+
|
|
92
|
+
Contributors
|
|
93
|
+
============
|
|
94
|
+
|
|
95
|
+
CGRtools contributors are included too.
|
|
96
|
+
|
|
97
|
+
* Adelia Fatykhova adelik21979@gmail.com
|
|
98
|
+
* Aleksandr Sizov murkyrussian@gmail.com
|
|
99
|
+
* Dinar Batyrshin batyrshin-dinar@mail.ru
|
|
100
|
+
* Dmitrij Zanadvornykh zandmitrij@gmail.com
|
|
101
|
+
* Ravil Mukhametgaleev sonic-mc@mail.ru
|
|
102
|
+
* Tagir Akhmetshin tagirshin@gmail.com
|
|
103
|
+
* Timur Gimadiev timur.gimadiev@gmail.com
|
|
104
|
+
* Zarina Ibragimova
|
|
105
|
+
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
chython/__init__.py,sha256=IsbLpfhMQUMsBiv49u87QfUyOl0LIq_uwgGrwykmO0c,1430
|
|
2
|
+
chython/_functions.py,sha256=M7hf233sOMfPnZBU2qM_wHEA91U8vZS75ImKGEq7XWE,3165
|
|
3
|
+
chython/_java.py,sha256=7xfzzMuqV0A5-s07sPUSyO-sMZ9IgMjvUAnj-sY4j2o,1964
|
|
4
|
+
chython/algorithms/__init__.py,sha256=eNVN6eBm4mTtGVPMesiyyoTpENP4XwZgu7JjcLDIG7U,806
|
|
5
|
+
chython/algorithms/_isomorphism.cp313-win_amd64.pyd,sha256=cQXs6F3tH8pxuTTcwgJBsAnIsADpfxHTOYmKEfSFUdk,148480
|
|
6
|
+
chython/algorithms/_isomorphism.pyx,sha256=t09byXUgJBxGs4QYjgMY3keMLV2Mp8LohWPfUqzPNs4,8079
|
|
7
|
+
chython/algorithms/_rings.cp313-win_amd64.pyd,sha256=Mb7CwwYegJ8TC0NyzF6-TCyLDS4lLqREBzJIjazK2j4,49664
|
|
8
|
+
chython/algorithms/_rings.pyx,sha256=_L7-1X8dkAF6QKUAwyWDEN8oORyLA_sXyXZ_1xqexlY,16619
|
|
9
|
+
chython/algorithms/aromatics/__init__.py,sha256=uSuYDKaZnZ15-Lttsx8emiwqOWDud37RBqdalNqtpOI,939
|
|
10
|
+
chython/algorithms/aromatics/_rules.py,sha256=gYQkJD45IcLnr46Tkr-uJ-Sps-yOboqYQMs2Rnaxnmw,3406
|
|
11
|
+
chython/algorithms/aromatics/kekule.py,sha256=B8bbIL541LkZgnGMdvXQytJ676hIdzGwe8edrxdYQB8,25043
|
|
12
|
+
chython/algorithms/aromatics/test/__init__.py,sha256=40oRLRCkV6CP4Lad0-9MEN86zrsNX8AFKIglWAE9tqg,807
|
|
13
|
+
chython/algorithms/aromatics/test/test_kekule.py,sha256=7q-t0ryVwMLkLMNjVyHsPIDyv5IV9sQ4yl60dMgw5Zw,5110
|
|
14
|
+
chython/algorithms/aromatics/test/test_thiele.py,sha256=T6Nmmr1H-Me3rpgYP3R_FirEa2MxoTMVRmCaUxGuTEw,8397
|
|
15
|
+
chython/algorithms/aromatics/thiele.py,sha256=qEANH25o-ZhvBQv-Dx6MOTBmQv7DiK2QjVL4iId_9vI,8803
|
|
16
|
+
chython/algorithms/calculate2d/__init__.py,sha256=pj1_m9UatAK0fAtZf7HYNdUR31jE5qpmwn5S_E5zFMM,918
|
|
17
|
+
chython/algorithms/calculate2d/clean2d.js,sha256=CCpXfNK3L7f4AVTuKJ3jAGq2Zh3gZiVt7s1g5W0jwOc,92275
|
|
18
|
+
chython/algorithms/calculate2d/molecule.py,sha256=sSjKZrN6xsfEE23OrF9Hp-nCa0l9fanm3EhvTPMrosE,7194
|
|
19
|
+
chython/algorithms/calculate2d/reaction.py,sha256=Hu1vq0OhnGSCjsQDLerh0rNLk4kfAM-Qw39vtVN0Li0,2358
|
|
20
|
+
chython/algorithms/conformers.py,sha256=YS6VZjGUWcl-xOE-PsPav2Pm3tun5dARPi2ff6sWKoI,4728
|
|
21
|
+
chython/algorithms/depict.py,sha256=2cIYcB3uADe2eBqQE7iYZnuoCVGJCROza2P1Ckv0WFQ,28755
|
|
22
|
+
chython/algorithms/fingerprints/__init__.py,sha256=779g2EKylm23crG71TSgF1avp4E_j3UvKPXSvakZpcY,1595
|
|
23
|
+
chython/algorithms/fingerprints/linear.py,sha256=pulCyHyb8UbsM1Hzwji67P4QFBopu4tNBIhD2luVflE,9445
|
|
24
|
+
chython/algorithms/fingerprints/morgan.py,sha256=VZXuao_JTziJBEMKnSSAevOcROQa-WqVU8DCq8OQAUM,5696
|
|
25
|
+
chython/algorithms/fingerprints/test/__init__.py,sha256=40oRLRCkV6CP4Lad0-9MEN86zrsNX8AFKIglWAE9tqg,807
|
|
26
|
+
chython/algorithms/fingerprints/test/test_linear.py,sha256=ceHAASQDOWenHbLYl3ZpwYrM-Fx1Muo5BJ3XTmxkgOc,4135
|
|
27
|
+
chython/algorithms/fingerprints/test/test_morgan.py,sha256=_WLqopcFQwqOUiFKKiyS2PiF4RJP_knYsAodrlNyMB4,2707
|
|
28
|
+
chython/algorithms/groups/__init__.py,sha256=n5dMNaafRu9pRUyOY2qtQBAvMpe80EXuRPJGJx3_VLI,8471
|
|
29
|
+
chython/algorithms/groups/_functional.py,sha256=XzQ6LtRSulNbEkL1fJP7od5XiuK2H_67cKnWf3uxZ5w,15634
|
|
30
|
+
chython/algorithms/groups/_oxidations.py,sha256=2bfvjZv4fx2eMqT6XvYcuAAm59iU9D7UD8lgvN3a9c4,2958
|
|
31
|
+
chython/algorithms/groups/_protective.py,sha256=MnbVIu3HFsehIgMQ1KzgQgsOMWJeNOruityeUoVl6B4,28895
|
|
32
|
+
chython/algorithms/groups/_reactions.py,sha256=3EQ81UXLKOlKT_TFs42IAGzlnae57vhETs3cfz1Qda0,44197
|
|
33
|
+
chython/algorithms/groups/_reductions.py,sha256=5Ilwc1t6p9RKFWSejUackU2SNycBoG_E0DmdWEEqvmU,3977
|
|
34
|
+
chython/algorithms/groups/_transformations.py,sha256=GF5Lt16c2wTngLbFSpwm9GQ6r7HHrRyIOk2xNNUXyO0,18526
|
|
35
|
+
chython/algorithms/groups/test/__init__.py,sha256=mAm_xlDjAfmLSFBAMe4_2MxC92pLsF_tYSSPBZ-HlxY,801
|
|
36
|
+
chython/algorithms/groups/test/test_deprotection.py,sha256=WL1ZYOLMObP8CBeI6-OS6-ZNAEdEqtXEy-UtaoUpVK8,4936
|
|
37
|
+
chython/algorithms/groups/test/test_reactions.py,sha256=pcDAJ6WQO8I0AJ5d2iM9YC3yOMXUHfclapBRB4cgh-I,17787
|
|
38
|
+
chython/algorithms/isomorphism.py,sha256=RIZqo2lY7ONzticTP5YRZohpIO728muOr2Euz-8eATE,26853
|
|
39
|
+
chython/algorithms/mapping/__init__.py,sha256=6kDIJ9Bo4L2R_zywkV2kfTCpXObBiBszyip9r1q71Ms,7542
|
|
40
|
+
chython/algorithms/mapping/_groups.py,sha256=I_vBaJ5b3F7Q8NOFzNlbDeCTxOrSarFe5LDbrYSYvMI,2751
|
|
41
|
+
chython/algorithms/mapping/_reactions.py,sha256=1ySn3yp3Y_7I221b_bf89ORIdAKtmYMVphesq5yfSOU,2495
|
|
42
|
+
chython/algorithms/mapping/attention.py,sha256=Cn5jv0zLEZoRWQnkCztm1PRRcRPF3vZutBX1md5ZipI,9379
|
|
43
|
+
chython/algorithms/mapping/reconstruct.py,sha256=q-qHvlAZSxRO0_GmVqTw6ew4D5LKor_mxRsI3iZvuQM,12191
|
|
44
|
+
chython/algorithms/mcs.py,sha256=y5JiQGIITkWy0dDj2bsdZUHIcxvmfd46-WuE-3fFQX8,7194
|
|
45
|
+
chython/algorithms/morgan.py,sha256=YfgPfQu9b71HOt1UJfBrK-uIpMW1-t79fpFS593iXec,2801
|
|
46
|
+
chython/algorithms/rings.py,sha256=2SH4YJbD5k9rX-o8og5BpEtB3N41xSIwxBXRr4xDdeg,5869
|
|
47
|
+
chython/algorithms/smiles.py,sha256=LAw3X4gH7pfs78rY88XZ4WaxT8xpWHSQEy_gPq3Z5qU,24669
|
|
48
|
+
chython/algorithms/standardize/__init__.py,sha256=MVfAKX6Ig9RdGsjAUO3-C2ZBrvU9gZPJ_ulXim8RjaE,1088
|
|
49
|
+
chython/algorithms/standardize/_groups.py,sha256=TtqTc-LIPwiqa47LiOx7ypIyqT-Zeefe-07qNbcucIs,28760
|
|
50
|
+
chython/algorithms/standardize/_isomers.py,sha256=VzZ5hKttCKyocm0ve2Qrd7P6kdWgCJPOOOJnqYm6NCw,15941
|
|
51
|
+
chython/algorithms/standardize/_metal_organics.py,sha256=wvLt9rKg9xipekZmr-bfTStD9v7IPSCSzXOmGzp3PhY,6391
|
|
52
|
+
chython/algorithms/standardize/_reagents.py,sha256=gfzE8xmsAzooC43rTniBbkJgyLA9MSUUo6NFefN3TvE,1418
|
|
53
|
+
chython/algorithms/standardize/_salts.py,sha256=RSJ4JSP7HYyJlHJby-ISeC3rLW5ngBMPzaq0Kza7xcE,2016
|
|
54
|
+
chython/algorithms/standardize/molecule.py,sha256=thsLb6fAcJtKRMeL20Xm8AMMppkmXPr6ezhqvnPq_ro,19185
|
|
55
|
+
chython/algorithms/standardize/reaction.py,sha256=EjqVvwUqILRqTIKyCeZqwp_nuSIB7g4hkBBODLDImo8,13629
|
|
56
|
+
chython/algorithms/standardize/resonance.py,sha256=D60SQx1ce7vKOyJXi09DPrLgf9L0IO7BVzI3AGPGGWQ,7527
|
|
57
|
+
chython/algorithms/standardize/salts.py,sha256=65GWXs5q0u5_R5_fzI3pbOnz42Eu1DScqC-cpqjZBNE,4344
|
|
58
|
+
chython/algorithms/standardize/saturation.py,sha256=B8PWLLg2MnJFUwzvNdcQ8WLGBE1Keq4mHSC8ptHjKfY,16164
|
|
59
|
+
chython/algorithms/standardize/test/__init__.py,sha256=LmXor_YhVwEyf1GMdd7vmDAT7WX95boqSsNVvXpaaTE,806
|
|
60
|
+
chython/algorithms/standardize/test/test_canonicalize.py,sha256=F3Xovho-vZSJh4-F9CPdyLzfxOZn-4KHfYGgpOhEkDc,1411
|
|
61
|
+
chython/algorithms/standardize/test/test_groups.py,sha256=3WnhdJcnJHoYDUxIB18IdUXdLHnPm3tV51IO0BdGg1g,6726
|
|
62
|
+
chython/algorithms/standardize/test/test_isomers.py,sha256=hg8N6rFIQzGZrj0q-emgHFatx2gg-4PH9znC3SvTKwg,7963
|
|
63
|
+
chython/algorithms/stereo.py,sha256=gkWKTgRTg3Zne5TZnXhLnygJOui0r145CrIZM1lOkyA,47460
|
|
64
|
+
chython/algorithms/tautomers/__init__.py,sha256=QlX94YpIbjBvPZqB5slrjf1-ph1GKcvfkRQormN0u54,7274
|
|
65
|
+
chython/algorithms/tautomers/_acid.py,sha256=uT-JQyJxkCSN4_txUymf69U6BqOwcsIZqh-7U5pXpZk,1583
|
|
66
|
+
chython/algorithms/tautomers/_base.py,sha256=BQzITGhuPv2CATTJJEvMfZNpUd_jKtRTpmp6KlOUjDU,3036
|
|
67
|
+
chython/algorithms/tautomers/_keto_enol.py,sha256=RDB0vjIT9_SU5932QJ5ZqF38VtrXZ-zl1KMOhBxNnRk,2644
|
|
68
|
+
chython/algorithms/tautomers/acid_base.py,sha256=Ot-a_LbWn0HjFHCKdH3Z6nFRytjR3nxnjHqFMM0k7Ww,8562
|
|
69
|
+
chython/algorithms/tautomers/heteroarenes.py,sha256=U7gCQrCD7mQY4gd2se4kmcDJ1qoFqYxJiMBVUHjXAOA,3672
|
|
70
|
+
chython/algorithms/tautomers/keto_enol.py,sha256=lzKfDZXWaxkbrYKJUPSs8eLTazCfPGd2zoIj0hdHHXk,6003
|
|
71
|
+
chython/algorithms/tautomers/test/__init__.py,sha256=nB6mEiO9HoRDvxkrmQ8prJiX3o9Gvs1bGyo6n5TYlrg,806
|
|
72
|
+
chython/algorithms/tautomers/test/test_tautomers.py,sha256=zpUZtuLfh6y1y79u_e4XUQq7R7yLpiwWL1G0ppXCTRc,3696
|
|
73
|
+
chython/algorithms/test/__init__.py,sha256=40oRLRCkV6CP4Lad0-9MEN86zrsNX8AFKIglWAE9tqg,807
|
|
74
|
+
chython/algorithms/test/test_isomorphism.py,sha256=gkbVt2ZfqmDrWQztfynPe8Jp5BhpBgDF9yaxVtKOWuw,2076
|
|
75
|
+
chython/algorithms/test/test_smiles.py,sha256=2MeshVMLt7oAlRsdwcs6VbV1WbQ7tV9HLPy4ohlbm1E,2523
|
|
76
|
+
chython/algorithms/x3dom.py,sha256=xU8a2hyJ-y7JoaETrWUQHlemF4KyTdSu2s1O53ZFgdE,16884
|
|
77
|
+
chython/containers/__init__.py,sha256=fXNBRj-vV598jqITufeMdEaD_oKeDSZqKYlnc5Lci60,1690
|
|
78
|
+
chython/containers/_pack_v2.cp313-win_amd64.pyd,sha256=dPpkxTCXMTCCWBfaLa-jN5z4W8WlNx2WuTADoHnpmp4,47616
|
|
79
|
+
chython/containers/_pack_v2.pyx,sha256=_s70LH6IKVW-tV7E3rN-ULbzenLfDFWW-MHZJjXuV8M,9909
|
|
80
|
+
chython/containers/_unpack_v0v2.cp313-win_amd64.pyd,sha256=TVupAIHvGwQo7AsgPmbtPZNz7Mado21Shtwq2GJysf0,156672
|
|
81
|
+
chython/containers/_unpack_v0v2.pyx,sha256=0dSfBl14G51BVBkpasN225MKRXyGRlhZE0mQyPJNztY,11743
|
|
82
|
+
chython/containers/bonds.py,sha256=SnyrpZ0hxVmoIUAjSp_YVJjwonioqqBvQrwyS1cCJ5w,8020
|
|
83
|
+
chython/containers/cgr.py,sha256=PUgA9bHDXlXmJfZFDiCjvrJYvE8Ceb9OeCynt0LUmls,4209
|
|
84
|
+
chython/containers/chimera.py,sha256=qMq7e5PyUMQUPGKN9g2v3ALuYQVKtWu8y3FgNUWl090,2138
|
|
85
|
+
chython/containers/graph.py,sha256=yGwNWaPzC3iJydSm-RjEke_dHRACFsQ---oqmaeGQYk,6270
|
|
86
|
+
chython/containers/molecule.py,sha256=wggUG5SRj3HnWYNZBd-p3ubLDHY1YDNJYPzF4nc5r8I,31599
|
|
87
|
+
chython/containers/query.py,sha256=0N3-s_uiFXaB8mpTUWvVPAN5KdiuIumnKmijs1mftoc,2759
|
|
88
|
+
chython/containers/rdkit.py,sha256=1pwsq2pmf8MNg8o-u6YFuYWKoKSlcQlbLzxuZWZ3J1w,7242
|
|
89
|
+
chython/containers/reaction.py,sha256=IH278Te1FI6e7C1Gn5byYwkNLjObjxj-qZSekv3Yb4o,11644
|
|
90
|
+
chython/containers/test/__init__.py,sha256=40oRLRCkV6CP4Lad0-9MEN86zrsNX8AFKIglWAE9tqg,807
|
|
91
|
+
chython/containers/test/test_molecule.py,sha256=JGSYeqnCEZeFTkxlTW9Ni2JpZuz31KQOeAMlw1lEA8c,2628
|
|
92
|
+
chython/containers/test/test_pack.py,sha256=8RoPS49VhUwg3mAXphIVAttqRr7QY-lPX83B65zHnbE,1548
|
|
93
|
+
chython/containers/test/test_rdkit.py,sha256=tmZX-DBIuoBZFAx4tFKo7NmTixr5vQFO1hH5_vZZshs,2533
|
|
94
|
+
chython/containers/test/test_reaction.py,sha256=JqTjzeQZ1R3yz55kjy5abagovK_pSGaxzsFMQLuCqQg,1005
|
|
95
|
+
chython/exceptions.py,sha256=UZDPbkvWCIA7NieGyvAGG6YOC-KCDypu0DcEz0_CeKw,2210
|
|
96
|
+
chython/files/__init__.py,sha256=qOHB70_uYU6EKavuROnXP8GqEkpglZ61jRHrOI-6V3o,1160
|
|
97
|
+
chython/files/_convert.py,sha256=0WaCbVCTdHJKNlQftTGTGlk15cebSYh7lr7CISpPryQ,9795
|
|
98
|
+
chython/files/_mapping.py,sha256=9cNNwH-Lk5562744OJuHSDnJfwMosWygiuQh_OCHJwI,4681
|
|
99
|
+
chython/files/_xyz.cp313-win_amd64.pyd,sha256=0l5CEyFz8-1uz__4NzE2Q6IYToD4LsB-Efx1qiW8iXE,134144
|
|
100
|
+
chython/files/_xyz.pyx,sha256=xfJJmG--Fhu_mUIWxKN-rlbaFJyQ0wYYuUKfUYSLZNU,2575
|
|
101
|
+
chython/files/daylight/__init__.py,sha256=MtmgkMncPB7RGWwC0mcvZS3betI7-oG8wZPLHwSa0A4,940
|
|
102
|
+
chython/files/daylight/parser.py,sha256=p47JzO7bMXdxhD4rL6yw7IHFvg-jsComP-caEPJGgiU,6503
|
|
103
|
+
chython/files/daylight/smarts.py,sha256=U8GRkZKtR8DK-a_IgsUUBE9llnPG-WPWeq2sGQpIOdM,4322
|
|
104
|
+
chython/files/daylight/smiles.py,sha256=4pyIKKB-wpqEzGXLIPTspHy9dtxCXAssTUMZunKuOQg,11338
|
|
105
|
+
chython/files/daylight/test/__init__.py,sha256=40oRLRCkV6CP4Lad0-9MEN86zrsNX8AFKIglWAE9tqg,807
|
|
106
|
+
chython/files/daylight/test/test_daylight_smarts.py,sha256=FOYQEv1-5fHNAKaQKqhb0vmwfd0zW_6nOLySUFa9S8E,10797
|
|
107
|
+
chython/files/daylight/test/test_daylight_smiles.py,sha256=T81PzRcUrxM-aMjAAuRGc6q-DBLxzoGLVcm2jKr-ot4,3459
|
|
108
|
+
chython/files/daylight/test/test_parser.py,sha256=J2BorGTK-O-cBEDVcwUyv9-LKoV0frIFsS06QDPf8vs,4115
|
|
109
|
+
chython/files/daylight/test/test_tokenize.py,sha256=RgqQN0_D2JZW4Lyfjh9Wssc_zvP3LswN7HnatUqoceg,4982
|
|
110
|
+
chython/files/daylight/tokenize.py,sha256=MUXA56mcODxTiwjLVT4jkxtWYOQ4BkPcaRhIkU6rYbo,13770
|
|
111
|
+
chython/files/libinchi/__init__.py,sha256=Uyzr756hvcE9onExU7Wa5317Med2ewaY5aLO3rlN148,855
|
|
112
|
+
chython/files/libinchi/libinchi.dll,sha256=7L_oKlzqa_1nswR_cFc0gCJefUjbmKpskhOTK1rgPpI,1297408
|
|
113
|
+
chython/files/libinchi/wrapper.py,sha256=WlXQNU3nbLjuJHmBKrZcKPbk0s4oIT4qMbKOdNyP2Lo,23656
|
|
114
|
+
chython/files/mdl/__init__.py,sha256=2Gh17WL4Yl1yIve3Hu-HZuLC9BfcVtao4l2IQr_br7g,1053
|
|
115
|
+
chython/files/mdl/emol.py,sha256=HcPNZMnCf6SleftAT7FyZwuiI52qLLC1DLfQCMPGR6U,9931
|
|
116
|
+
chython/files/mdl/erxn.py,sha256=ZNTzMErSfCLw4BxvM3UFYHhPQ5l4RCdgWqRzUdMWww8,2467
|
|
117
|
+
chython/files/mdl/mol.py,sha256=-QrPoFTB2rIm_y8xj6XITNxefhqfEc61UsioqE-Gv4k,7526
|
|
118
|
+
chython/files/mdl/read.py,sha256=ShVOMay0RRPnA76SCD35jBZCA4B9vowBrh5OWqJQgQc,8218
|
|
119
|
+
chython/files/mdl/rxn.py,sha256=kxnDWLIHvdAHDYAXYhYjf6t-vYd5teb1XXWYmv_aF7I,2422
|
|
120
|
+
chython/files/mdl/stereo.py,sha256=UTGHtJu-Wi--nmk3aKCRiqgHSD1Pjl-EDz8K_dXbYzE,2248
|
|
121
|
+
chython/files/mdl/write.py,sha256=c-6KpmnBL19sscKiGf6I7cf8pzEJRBynz3Yd4W3spkU,7663
|
|
122
|
+
chython/files/MRVrw.py,sha256=fZ-OF9EnQkai5MEnzFB5n89pjA7DCEMCbArzliD-lNQ,21015
|
|
123
|
+
chython/files/opsin.py,sha256=6NPubqymZyDiObF3jZ3gNJ833IY_2ckA-EBWgNveVn4,1227
|
|
124
|
+
chython/files/PDBrw.py,sha256=qdfMuAwbbF7FapVdImW-Mu4LjlGxUFEsUU5botsjQZg,10902
|
|
125
|
+
chython/files/RDFrw.py,sha256=xQpVmWKdoId5KMBDP4A6XMWEofCnasJH2QWaigPEO2I,14168
|
|
126
|
+
chython/files/SDFrw.py,sha256=LltGRqqvpdeU--S2nI2eAYrzfo2uhhLITjJwlF-zMK8,9064
|
|
127
|
+
chython/files/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
|
+
chython/files/test/test_inchi.py,sha256=z4wVZFpjh1zOLwBJzyW58waj2Phf4Mp9TTRZ77YOduA,764
|
|
129
|
+
chython/files/test/test_mrv.py,sha256=9Gn2t3IIh_x8purBsc20x9L1E4sCWXQYijEZ3Kc_nqY,1139
|
|
130
|
+
chython/files/test/test_sdf_rdf.py,sha256=5jUysnuWiMZjFZQ5h3vQZdBTqaIBMYdcIYnBhXB-U-s,1531
|
|
131
|
+
chython/files/test/test_xyz.py,sha256=xsqpeY4NAjl8kSJQUapZhgUM9u9xNvwWcd2AwleqTSA,515
|
|
132
|
+
chython/files/xyz.py,sha256=kUUxA2ezk-7RXcEq9Exnr9KseK6MtzgIvFd3G8Aj3-o,2735
|
|
133
|
+
chython/periodictable/__init__.py,sha256=V1Rp7g9A-JFZsrzoCVB2zO9Y8G25GirQw_9V8fhzjaM,2671
|
|
134
|
+
chython/periodictable/base/__init__.py,sha256=Vokr6xHVdsd-pffMskO617Lw3tIanFg4vrXGakfEQIo,1016
|
|
135
|
+
chython/periodictable/base/dynamic.py,sha256=XYrk2Y1dawLQOEZVcs5ph_sQ8R0ad1NL-tTNGcld7mw,5279
|
|
136
|
+
chython/periodictable/base/element.py,sha256=uLVJlfMHWbW7l1yL8QH_jMbdWqvKeS85EsLWbE5Bbas,15479
|
|
137
|
+
chython/periodictable/base/groups.py,sha256=bG3c4TYTmQDf1m8-IeQSn2tejXHH0D2ttqZEN2vGb8g,1537
|
|
138
|
+
chython/periodictable/base/periods.py,sha256=Uvw6m4vVdotKAYdGpYcDXjMG-pFRdxdBQD0DRerENmM,1093
|
|
139
|
+
chython/periodictable/base/query.py,sha256=EEivmhKyMMJ8NssfmZC4qmSll2vTbBphiBvoCH3xnCY,16632
|
|
140
|
+
chython/periodictable/base/vector.py,sha256=iQuP9romSqhGUc9SqDOvQ_QphO6sI0pcK8EpBtypCrA,3846
|
|
141
|
+
chython/periodictable/groupI.py,sha256=FSJbu70JOvxy_MQ2xF_x3IvngD4N64A8_6Ug6dLqQBU,5451
|
|
142
|
+
chython/periodictable/groupII.py,sha256=LEtKCIK0K4KfS-pXVssJlMx_OX_ysSxBKo5KgH4edjw,5473
|
|
143
|
+
chython/periodictable/groupIII.py,sha256=oO_BPGqM8NMeskj6xh7g7npv-N-NyToGEr4Ft2PSBls,28502
|
|
144
|
+
chython/periodictable/groupIV.py,sha256=_prpLy8ZBrFFvxLvkZVDkiemlDjDORxuOWTwJ56Otc0,7224
|
|
145
|
+
chython/periodictable/groupIX.py,sha256=yf_5kKojufxMf5NrmqUWOyRVtb85VANOgiEIbvshd1k,6418
|
|
146
|
+
chython/periodictable/groupV.py,sha256=Z2oT_sqwY0IOf46aDY-3xQaa1Xjq9SLdaNMhjM2U8Jg,6011
|
|
147
|
+
chython/periodictable/groupVI.py,sha256=0tVPzqCJzrJ9abzAWSEq6kOuw7-jhvXw5z62V5jemDs,5781
|
|
148
|
+
chython/periodictable/groupVII.py,sha256=JBWnq1W0ws7xpSMqzGwcDVM16TiRkueYLgO0L7JC8Ho,4162
|
|
149
|
+
chython/periodictable/groupVIII.py,sha256=UCzmJ1PeqQW2pQtXFtUCFWinFZlFQToWLm6aW0ERGsY,4577
|
|
150
|
+
chython/periodictable/groupX.py,sha256=gQkZtCFBZepqf_03VsKDsKDMdl0ShfEmRvyPH0z2XBU,4799
|
|
151
|
+
chython/periodictable/groupXI.py,sha256=UKK4OCT96RRw4p7kpakzSv1cf61CrWzubL6ZUX1QRiQ,4415
|
|
152
|
+
chython/periodictable/groupXII.py,sha256=Nc4WHO_Jz-VtHCePyzItmPrwL3mZczgMc0CjEJwqgkA,4286
|
|
153
|
+
chython/periodictable/groupXIII.py,sha256=2aLQOxT8rvFKXR6ItVtNHm1xRfR_zjMu6FOP8Ic5Nz0,6132
|
|
154
|
+
chython/periodictable/groupXIV.py,sha256=pFKKRQHHkQP19dzsOtJgtr2zbJip8693gKEADWlcEk4,7020
|
|
155
|
+
chython/periodictable/groupXV.py,sha256=6_vNgQBjhiSgh5HlHet7bNvYvKSHtQLWHs11jBLo1Xg,7179
|
|
156
|
+
chython/periodictable/groupXVI.py,sha256=qr_9HG761yrIesUgLsXHMghPfSCRprZkmuea8u5zQUY,18110
|
|
157
|
+
chython/periodictable/groupXVII.py,sha256=KxhPutfPXUx4PSGyWz_8yj1f5ELgtePLM2B4PQOtGrg,10095
|
|
158
|
+
chython/periodictable/groupXVIII.py,sha256=uFnEGZopVIyNfN1ax6IuHosTWFFJWdpIva5Gag286Wk,6484
|
|
159
|
+
chython/periodictable/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
160
|
+
chython/periodictable/test/test_element.py,sha256=_YW_I04-ynki1CfRI_BYQ3xRdhLKCoybg-i5L65PQoE,2433
|
|
161
|
+
chython/reactor/__init__.py,sha256=Y2IaFoWPnWL8nqcDvz1NB2Gb-1aBNYl5VqPtgmNK1vE,1012
|
|
162
|
+
chython/reactor/base.py,sha256=mb3jM_WeUhXACQWB_wtdyDDFUF52rpCamcFQaOubWUg,10948
|
|
163
|
+
chython/reactor/reactor.py,sha256=6npfcL3JFpIIspQTeC6YHzkUtZ0zfJ7UND3D-VM1Ul0,8748
|
|
164
|
+
chython/reactor/test/__init__.py,sha256=Upwbm2uEeb8N_7SyHgJZqAyuxrDGME2fmIAbWBvwgvo,806
|
|
165
|
+
chython/reactor/test/test_reactor.py,sha256=XHAgYwBy1q1LpELv7PFShrRnCpzDfifBYhJPLpJOORE,1938
|
|
166
|
+
chython/reactor/test/test_transformer.py,sha256=6geVTdxzwl-E_uRH6NX2jtKSneDE49KY_MohOIBjt0E,3893
|
|
167
|
+
chython/reactor/transformer.py,sha256=rTJ_KFFIp1QCQe4AALONwdXIT6Xh8seoNUgYuQCQL_g,3351
|
|
168
|
+
chython/utils/__init__.py,sha256=lKLbv8TPrPYI4sEZ803MeQu5oBj6kRbPFFwWjiJD-mc,1530
|
|
169
|
+
chython/utils/free_wilson.py,sha256=00GlGXlrA_4nbt64kY_-ZSl9dyuIBBZX37ZdWXDowCc,4188
|
|
170
|
+
chython/utils/grid.py,sha256=U3BEU1x9oMmfpujzXPv3iECKYKWPGQztKpDHh3kp13M,4977
|
|
171
|
+
chython/utils/retro.py,sha256=q6K0mNhOxP1gUO8xdh3VDXnUNAoR302MoNY6n1LsWgM,5462
|
|
172
|
+
chython-2.19.dist-info/licenses/LICENSE,sha256=fTqV5eBpeAZO0_jit8j4Ref9ikBSlHJ8xwj5TLg7gFk,7817
|
|
173
|
+
chython-2.19.dist-info/METADATA,sha256=VcLTFh88gtkDsjDvXFn3E5QtrSCgeqQvGoaeEiSsRR4,3852
|
|
174
|
+
chython-2.19.dist-info/WHEEL,sha256=2eHu_2m2FGRcYtprrUbB3seQabCkqI9OuHWKtk_SmrQ,98
|
|
175
|
+
chython-2.19.dist-info/RECORD,,
|