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.
Files changed (175) hide show
  1. chython/__init__.py +35 -0
  2. chython/_functions.py +95 -0
  3. chython/_java.py +57 -0
  4. chython/algorithms/__init__.py +18 -0
  5. chython/algorithms/_isomorphism.cp313-win_amd64.pyd +0 -0
  6. chython/algorithms/_isomorphism.pyx +189 -0
  7. chython/algorithms/_rings.cp313-win_amd64.pyd +0 -0
  8. chython/algorithms/_rings.pyx +478 -0
  9. chython/algorithms/aromatics/__init__.py +27 -0
  10. chython/algorithms/aromatics/_rules.py +124 -0
  11. chython/algorithms/aromatics/kekule.py +532 -0
  12. chython/algorithms/aromatics/test/__init__.py +18 -0
  13. chython/algorithms/aromatics/test/test_kekule.py +160 -0
  14. chython/algorithms/aromatics/test/test_thiele.py +263 -0
  15. chython/algorithms/aromatics/thiele.py +222 -0
  16. chython/algorithms/calculate2d/__init__.py +23 -0
  17. chython/algorithms/calculate2d/clean2d.js +1 -0
  18. chython/algorithms/calculate2d/molecule.py +191 -0
  19. chython/algorithms/calculate2d/reaction.py +75 -0
  20. chython/algorithms/conformers.py +106 -0
  21. chython/algorithms/depict.py +596 -0
  22. chython/algorithms/fingerprints/__init__.py +43 -0
  23. chython/algorithms/fingerprints/linear.py +202 -0
  24. chython/algorithms/fingerprints/morgan.py +132 -0
  25. chython/algorithms/fingerprints/test/__init__.py +18 -0
  26. chython/algorithms/fingerprints/test/test_linear.py +127 -0
  27. chython/algorithms/fingerprints/test/test_morgan.py +79 -0
  28. chython/algorithms/groups/__init__.py +212 -0
  29. chython/algorithms/groups/_functional.py +290 -0
  30. chython/algorithms/groups/_oxidations.py +70 -0
  31. chython/algorithms/groups/_protective.py +964 -0
  32. chython/algorithms/groups/_reactions.py +809 -0
  33. chython/algorithms/groups/_reductions.py +88 -0
  34. chython/algorithms/groups/_transformations.py +278 -0
  35. chython/algorithms/groups/test/__init__.py +18 -0
  36. chython/algorithms/groups/test/test_deprotection.py +108 -0
  37. chython/algorithms/groups/test/test_reactions.py +377 -0
  38. chython/algorithms/isomorphism.py +664 -0
  39. chython/algorithms/mapping/__init__.py +188 -0
  40. chython/algorithms/mapping/_groups.py +94 -0
  41. chython/algorithms/mapping/_reactions.py +72 -0
  42. chython/algorithms/mapping/attention.py +266 -0
  43. chython/algorithms/mapping/reconstruct.py +346 -0
  44. chython/algorithms/mcs.py +201 -0
  45. chython/algorithms/morgan.py +77 -0
  46. chython/algorithms/rings.py +178 -0
  47. chython/algorithms/smiles.py +597 -0
  48. chython/algorithms/standardize/__init__.py +30 -0
  49. chython/algorithms/standardize/_groups.py +958 -0
  50. chython/algorithms/standardize/_isomers.py +330 -0
  51. chython/algorithms/standardize/_metal_organics.py +189 -0
  52. chython/algorithms/standardize/_reagents.py +44 -0
  53. chython/algorithms/standardize/_salts.py +68 -0
  54. chython/algorithms/standardize/molecule.py +475 -0
  55. chython/algorithms/standardize/reaction.py +384 -0
  56. chython/algorithms/standardize/resonance.py +191 -0
  57. chython/algorithms/standardize/salts.py +128 -0
  58. chython/algorithms/standardize/saturation.py +373 -0
  59. chython/algorithms/standardize/test/__init__.py +18 -0
  60. chython/algorithms/standardize/test/test_canonicalize.py +66 -0
  61. chython/algorithms/standardize/test/test_groups.py +146 -0
  62. chython/algorithms/standardize/test/test_isomers.py +198 -0
  63. chython/algorithms/stereo.py +1215 -0
  64. chython/algorithms/tautomers/__init__.py +167 -0
  65. chython/algorithms/tautomers/_acid.py +59 -0
  66. chython/algorithms/tautomers/_base.py +116 -0
  67. chython/algorithms/tautomers/_keto_enol.py +107 -0
  68. chython/algorithms/tautomers/acid_base.py +208 -0
  69. chython/algorithms/tautomers/heteroarenes.py +103 -0
  70. chython/algorithms/tautomers/keto_enol.py +143 -0
  71. chython/algorithms/tautomers/test/__init__.py +18 -0
  72. chython/algorithms/tautomers/test/test_tautomers.py +80 -0
  73. chython/algorithms/test/__init__.py +18 -0
  74. chython/algorithms/test/test_isomorphism.py +58 -0
  75. chython/algorithms/test/test_smiles.py +76 -0
  76. chython/algorithms/x3dom.py +350 -0
  77. chython/containers/__init__.py +48 -0
  78. chython/containers/_pack_v2.cp313-win_amd64.pyd +0 -0
  79. chython/containers/_pack_v2.pyx +271 -0
  80. chython/containers/_unpack_v0v2.cp313-win_amd64.pyd +0 -0
  81. chython/containers/_unpack_v0v2.pyx +302 -0
  82. chython/containers/bonds.py +255 -0
  83. chython/containers/cgr.py +115 -0
  84. chython/containers/chimera.py +63 -0
  85. chython/containers/graph.py +199 -0
  86. chython/containers/molecule.py +817 -0
  87. chython/containers/query.py +71 -0
  88. chython/containers/rdkit.py +183 -0
  89. chython/containers/reaction.py +324 -0
  90. chython/containers/test/__init__.py +18 -0
  91. chython/containers/test/test_molecule.py +117 -0
  92. chython/containers/test/test_pack.py +60 -0
  93. chython/containers/test/test_rdkit.py +70 -0
  94. chython/containers/test/test_reaction.py +40 -0
  95. chython/exceptions.py +114 -0
  96. chython/files/MRVrw.py +532 -0
  97. chython/files/PDBrw.py +255 -0
  98. chython/files/RDFrw.py +309 -0
  99. chython/files/SDFrw.py +221 -0
  100. chython/files/__init__.py +30 -0
  101. chython/files/_convert.py +207 -0
  102. chython/files/_mapping.py +117 -0
  103. chython/files/_xyz.cp313-win_amd64.pyd +0 -0
  104. chython/files/_xyz.pyx +74 -0
  105. chython/files/daylight/__init__.py +24 -0
  106. chython/files/daylight/parser.py +157 -0
  107. chython/files/daylight/smarts.py +107 -0
  108. chython/files/daylight/smiles.py +260 -0
  109. chython/files/daylight/test/__init__.py +18 -0
  110. chython/files/daylight/test/test_daylight_smarts.py +289 -0
  111. chython/files/daylight/test/test_daylight_smiles.py +101 -0
  112. chython/files/daylight/test/test_parser.py +118 -0
  113. chython/files/daylight/test/test_tokenize.py +77 -0
  114. chython/files/daylight/tokenize.py +376 -0
  115. chython/files/libinchi/__init__.py +22 -0
  116. chython/files/libinchi/libinchi.dll +0 -0
  117. chython/files/libinchi/wrapper.py +554 -0
  118. chython/files/mdl/__init__.py +25 -0
  119. chython/files/mdl/emol.py +251 -0
  120. chython/files/mdl/erxn.py +67 -0
  121. chython/files/mdl/mol.py +186 -0
  122. chython/files/mdl/read.py +223 -0
  123. chython/files/mdl/rxn.py +67 -0
  124. chython/files/mdl/stereo.py +63 -0
  125. chython/files/mdl/write.py +201 -0
  126. chython/files/opsin.py +35 -0
  127. chython/files/test/__init__.py +0 -0
  128. chython/files/test/test_inchi.py +27 -0
  129. chython/files/test/test_mrv.py +47 -0
  130. chython/files/test/test_sdf_rdf.py +64 -0
  131. chython/files/test/test_xyz.py +20 -0
  132. chython/files/xyz.py +78 -0
  133. chython/periodictable/__init__.py +69 -0
  134. chython/periodictable/base/__init__.py +25 -0
  135. chython/periodictable/base/dynamic.py +149 -0
  136. chython/periodictable/base/element.py +451 -0
  137. chython/periodictable/base/groups.py +90 -0
  138. chython/periodictable/base/periods.py +46 -0
  139. chython/periodictable/base/query.py +473 -0
  140. chython/periodictable/base/vector.py +119 -0
  141. chython/periodictable/groupI.py +252 -0
  142. chython/periodictable/groupII.py +223 -0
  143. chython/periodictable/groupIII.py +1154 -0
  144. chython/periodictable/groupIV.py +210 -0
  145. chython/periodictable/groupIX.py +196 -0
  146. chython/periodictable/groupV.py +192 -0
  147. chython/periodictable/groupVI.py +183 -0
  148. chython/periodictable/groupVII.py +162 -0
  149. chython/periodictable/groupVIII.py +161 -0
  150. chython/periodictable/groupX.py +166 -0
  151. chython/periodictable/groupXI.py +164 -0
  152. chython/periodictable/groupXII.py +158 -0
  153. chython/periodictable/groupXIII.py +239 -0
  154. chython/periodictable/groupXIV.py +262 -0
  155. chython/periodictable/groupXV.py +276 -0
  156. chython/periodictable/groupXVI.py +457 -0
  157. chython/periodictable/groupXVII.py +324 -0
  158. chython/periodictable/groupXVIII.py +260 -0
  159. chython/periodictable/test/__init__.py +0 -0
  160. chython/periodictable/test/test_element.py +100 -0
  161. chython/reactor/__init__.py +24 -0
  162. chython/reactor/base.py +222 -0
  163. chython/reactor/reactor.py +177 -0
  164. chython/reactor/test/__init__.py +18 -0
  165. chython/reactor/test/test_reactor.py +40 -0
  166. chython/reactor/test/test_transformer.py +78 -0
  167. chython/reactor/transformer.py +72 -0
  168. chython/utils/__init__.py +50 -0
  169. chython/utils/free_wilson.py +114 -0
  170. chython/utils/grid.py +130 -0
  171. chython/utils/retro.py +139 -0
  172. chython-2.19.dist-info/METADATA +105 -0
  173. chython-2.19.dist-info/RECORD +175 -0
  174. chython-2.19.dist-info/WHEEL +4 -0
  175. 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,,