rdworks 0.52.1__py3-none-any.whl → 0.53.1__py3-none-any.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.
rdworks/__init__.py CHANGED
@@ -1,11 +1,11 @@
1
- __version__ = '0.52.1'
1
+ __version__ = '0.53.1'
2
2
 
3
3
  from rdworks.conf import Conf
4
4
  from rdworks.mol import Mol
5
5
  from rdworks.mollibr import MolLibr
6
6
 
7
- from rdworks.stereoisomers import complete_stereoisomers
8
- from rdworks.tautomers import complete_tautomers
7
+ from rdworks.workflow import complete_stereoisomers, complete_tautomers
8
+
9
9
  from rdworks.ionized import IonizedStates
10
10
 
11
11
  from rdworks.readin import read_csv, merge_csv, read_dataframe, read_smi, read_sdf, read_mae
rdworks/mol.py CHANGED
@@ -28,7 +28,6 @@ from rdkit.Chem import (
28
28
  Draw, rdDepictor, inchi,
29
29
  rdDistGeom, rdMolAlign, rdMolTransforms, rdmolops
30
30
  )
31
- from rdkit.Chem.Draw import rdMolDraw2D
32
31
  from rdkit.ML.Cluster import Butina
33
32
  from PIL import Image
34
33
 
@@ -43,6 +42,8 @@ from rdworks.autograph import NMRCLUST, DynamicTreeCut, RCKmeans, AutoGraph
43
42
  from rdworks.bitqt import BitQT
44
43
  from rdworks.torsion import create_torsion_fragment, get_torsion_atoms
45
44
  from rdworks.display import render_svg, render_png
45
+ from rdworks.stereoisomers import enumerate_stereoisomers, enumerate_ring_bond_stereoisomers
46
+
46
47
 
47
48
  from scour.scour import scourString
48
49
 
@@ -329,6 +330,36 @@ class Mol:
329
330
  return self
330
331
 
331
332
 
333
+ def count_stereoisomers(self) -> int:
334
+ """Counts number of all possible stereoisomers ignoring the current stereochemistry.
335
+
336
+ Returns:
337
+ int: number of stereoisomers.
338
+ """
339
+
340
+ ring_bond_stereo_info = self.get_ring_bond_stereo()
341
+ mol = self.copy()
342
+ # remove stereochemistry
343
+ mol = mol.remove_stereo()
344
+ rdmols = enumerate_stereoisomers(mol.rdmol)
345
+ # ring bond stereo is not properly enumerated
346
+ # cis/trans information is lost if stereochemistry is removed,
347
+ # which cannot be enumerated by EnumerateStereoisomers() function
348
+ # so enumerate_ring_bond_stereoisomers() is introduced
349
+ if len(ring_bond_stereo_info) > 0:
350
+ ring_cis_trans = []
351
+ for rdmol in rdmols:
352
+ ring_cis_trans += enumerate_ring_bond_stereoisomers(rdmol,
353
+ ring_bond_stereo_info,
354
+ override=True)
355
+ if len(ring_cis_trans) > 0:
356
+ rdmols = ring_cis_trans
357
+
358
+ unique_rdmols = set([Chem.MolToSmiles(rdmol) for rdmol in rdmols])
359
+
360
+ return len(unique_rdmols)
361
+
362
+
332
363
  def make_confs(self, n: int = 50, method: str = 'ETKDG', **kwargs) -> Self:
333
364
  """Generates 3D conformers.
334
365
 
rdworks/stereoisomers.py CHANGED
@@ -1,13 +1,8 @@
1
- from typing import List, Tuple, Union, Optional
2
-
3
1
  from rdkit import Chem
4
2
  from rdkit.Chem.EnumerateStereoisomers import EnumerateStereoisomers, StereoEnumerationOptions
5
3
 
6
- from .mol import Mol
7
- from .mollibr import MolLibr
8
-
9
4
 
10
- def _enum_stereoisomers(rdmol:Chem.Mol) -> List[Chem.Mol]:
5
+ def enumerate_stereoisomers(rdmol: Chem.Mol) -> list[Chem.Mol]:
11
6
  """Returns enumerated stereoisomers.
12
7
 
13
8
  Args:
@@ -28,8 +23,9 @@ def _enum_stereoisomers(rdmol:Chem.Mol) -> List[Chem.Mol]:
28
23
  )))
29
24
 
30
25
 
31
- def _enum_ring_bond_stereo(rdmol:Chem.Mol, ring_bond_stereo_info:List[Tuple],
32
- override:bool=False) -> List[Chem.Mol]:
26
+ def enumerate_ring_bond_stereoisomers(rdmol: Chem.Mol,
27
+ ring_bond_stereo_info: list[tuple],
28
+ override: bool = False) -> list[Chem.Mol]:
33
29
  """Enumerates unspecified double bond stereochemistry (cis/trans).
34
30
 
35
31
  <pre>
@@ -68,60 +64,4 @@ def _enum_ring_bond_stereo(rdmol:Chem.Mol, ring_bond_stereo_info:List[Tuple],
68
64
  # trans
69
65
  bond.SetStereo(Chem.BondStereo.STEREOTRANS)
70
66
  isomers.append(Chem.Mol(rdmol))
71
- return isomers
72
-
73
-
74
- def complete_stereoisomers(molecular_input:Union[Mol, str, Chem.Mol], name:Optional[str]=None,
75
- std:bool=False, override:bool=False, **kwargs) -> MolLibr:
76
- """Completes stereoisomers and returns a rdworks.MolLibr.
77
-
78
- Args:
79
- molecular_input (Union[Mol, str, Chem.Mol]): input molecule.
80
- name (Optional[str], optional): name of the molecule. Defaults to None.
81
- std (bool, optional): whether to standardize the input. Defaults to False.
82
- override (bool, optional): whether to override input stereoisomers. Defaults to False.
83
-
84
- Raises:
85
- TypeError: if `molecular_input` is not rdworks.Mol, SMILES, or rdkit.Chem.Mol object.
86
-
87
- Returns:
88
- MolLibr: a library of complete stereoisomers.
89
- """
90
- if isinstance(molecular_input, Mol):
91
- if name:
92
- mol = molecular_input.rename(name)
93
- else:
94
- mol = molecular_input
95
- elif isinstance(molecular_input, str) or isinstance(molecular_input, Chem.Mol):
96
- mol = Mol(molecular_input, name, std)
97
- else:
98
- raise TypeError('complete_stereoisomers() expects rdworks.Mol, SMILES or rdkit.Chem.Mol object')
99
-
100
- ring_bond_stereo_info = mol.get_ring_bond_stereo()
101
-
102
- if override:
103
- mol = mol.remove_stereo()
104
-
105
- rdmols = _enum_stereoisomers(mol.rdmol)
106
- # ring bond stereo is not properly enumerated
107
- # cis/trans information is lost if stereochemistry is removed,
108
- # which cannot be enumerated by EnumerateStereoisomers() function
109
- # so _enum_bond_stereo() is introduced
110
- if len(ring_bond_stereo_info) > 0:
111
- ring_cis_trans = []
112
- for rdmol in rdmols:
113
- ring_cis_trans += _enum_ring_bond_stereo(rdmol,
114
- ring_bond_stereo_info,
115
- override=override)
116
- if len(ring_cis_trans) > 0:
117
- rdmols = ring_cis_trans
118
-
119
- if len(rdmols) > 1:
120
- libr = MolLibr(rdmols).unique().rename(mol.name, sep='.').compute(**kwargs)
121
- else:
122
- libr = MolLibr(rdmols).rename(mol.name).compute(**kwargs)
123
-
124
- for _ in libr:
125
- _.props.update(mol.props)
126
-
127
- return libr
67
+ return isomers
rdworks/workflow.py ADDED
@@ -0,0 +1,85 @@
1
+
2
+ from rdworks.stereoisomers import enumerate_stereoisomers, enumerate_ring_bond_stereoisomers
3
+ from rdworks.mol import Mol
4
+ from rdworks.mollibr import MolLibr
5
+
6
+ from rdkit import Chem
7
+ from rdkit.Chem.MolStandardize import rdMolStandardize
8
+
9
+
10
+ def complete_stereoisomers(molecular_input: str | Chem.Mol | Mol,
11
+ name: str | None = None,
12
+ std: bool = False,
13
+ override: bool = False,
14
+ **kwargs) -> MolLibr:
15
+ """Completes stereoisomers and returns a rdworks.MolLibr.
16
+
17
+ Args:
18
+ molecular_input (Union[Mol, str, Chem.Mol]): input molecule.
19
+ name (Optional[str], optional): name of the molecule. Defaults to None.
20
+ std (bool, optional): whether to standardize the input. Defaults to False.
21
+ override (bool, optional): whether to override input stereoisomers. Defaults to False.
22
+
23
+ Raises:
24
+ TypeError: if `molecular_input` is not rdworks.Mol, SMILES, or rdkit.Chem.Mol object.
25
+
26
+ Returns:
27
+ MolLibr: a library of complete stereoisomers.
28
+ """
29
+ if isinstance(molecular_input, Mol):
30
+ if name:
31
+ mol = molecular_input.rename(name)
32
+ else:
33
+ mol = molecular_input
34
+ elif isinstance(molecular_input, str) or isinstance(molecular_input, Chem.Mol):
35
+ mol = Mol(molecular_input, name, std)
36
+ else:
37
+ raise TypeError('complete_stereoisomers() expects rdworks.Mol, SMILES or rdkit.Chem.Mol object')
38
+
39
+ ring_bond_stereo_info = mol.get_ring_bond_stereo()
40
+
41
+ if override:
42
+ mol = mol.remove_stereo()
43
+
44
+ rdmols = enumerate_stereoisomers(mol.rdmol)
45
+ # ring bond stereo is not properly enumerated
46
+ # cis/trans information is lost if stereochemistry is removed,
47
+ # which cannot be enumerated by EnumerateStereoisomers() function
48
+ # so enumerate_ring_bond_stereoisomers() is introduced
49
+ if len(ring_bond_stereo_info) > 0:
50
+ ring_cis_trans = []
51
+ for rdmol in rdmols:
52
+ ring_cis_trans += enumerate_ring_bond_stereoisomers(rdmol,
53
+ ring_bond_stereo_info,
54
+ override=override)
55
+ if len(ring_cis_trans) > 0:
56
+ rdmols = ring_cis_trans
57
+
58
+ if len(rdmols) > 1:
59
+ libr = MolLibr(rdmols).unique().rename(mol.name, sep='.').compute(**kwargs)
60
+ else:
61
+ libr = MolLibr(rdmols).rename(mol.name).compute(**kwargs)
62
+
63
+ for _ in libr:
64
+ _.props.update(mol.props)
65
+
66
+ return libr
67
+
68
+
69
+
70
+ def complete_tautomers(mol: Mol, **kwargs) -> MolLibr:
71
+ """Returns a library of enumerated tautomers.
72
+
73
+ Args:
74
+ mol (Mol): input molecule.
75
+
76
+ Returns:
77
+ MolLibr: a library of enumerated tautomers.
78
+ """
79
+ enumerator = rdMolStandardize.TautomerEnumerator()
80
+ rdmols = list(enumerator.Enumerate(mol.rdmol))
81
+
82
+ if len(rdmols) > 1:
83
+ return MolLibr(rdmols).unique().rename(mol.name, sep='.').compute(**kwargs)
84
+
85
+ return MolLibr(rdmols).compute(**kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdworks
3
- Version: 0.52.1
3
+ Version: 0.53.1
4
4
  Summary: Routine tasks built on RDKit and other tools
5
5
  Author-email: Sung-Hun Bae <sunghun.bae@gmail.com>
6
6
  Maintainer-email: Sung-Hun Bae <sunghun.bae@gmail.com>
@@ -1,23 +1,23 @@
1
- rdworks/__init__.py,sha256=nSkNkfvjtAeom2f5SYdS-XCnglYeC-wcGuGVubrv3nQ,1391
1
+ rdworks/__init__.py,sha256=iKipZN3E7INKDKEGeK2CbjgwyGu8Vu5a3THRaKNU_NE,1358
2
2
  rdworks/conf.py,sha256=eH_a3ywmmJiPtnvgk86ykurYOx879AHg80-Dn8z1X70,36379
3
3
  rdworks/descriptor.py,sha256=34T_dQ6g8v3u-ym8TLKbQtxIIV5TEo-d3pdedq3o-cg,2106
4
4
  rdworks/display.py,sha256=JR0gR26UpH-JCxVOaqXZCUj2MiGZSrx9Me87FncspVI,13469
5
5
  rdworks/ionized.py,sha256=_t-Ajssv1rytV4Y_KsSbxfnsBKqy-EusbhNUtaWcV6o,7681
6
6
  rdworks/matchedseries.py,sha256=A3ON4CUpQV159mu9VqgNiJ8uoQ9ePOry9d3ra4NCAgc,10377
7
7
  rdworks/microstates.py,sha256=T206JgeB3d23MX3sRCrxVj2arxlSILYecBTKaD1VcoE,5109
8
- rdworks/mol.py,sha256=-zjAsBETNUbP4_n8p6how40NhZB24icMYhas1kYPqCc,70064
8
+ rdworks/mol.py,sha256=4gNjs_ryNNWThMekV794uwjjBE-JLGGWcdyMaS9-xP8,71369
9
9
  rdworks/mollibr.py,sha256=X4UBO6Ga-QmNS7RwUiaDYAx0Q5hnWs71yTkEpH02Qb4,37696
10
10
  rdworks/pka.py,sha256=NVJVfpcNEMlX5QRyLBgUM7GIT7VMjO-llAR4LWc8J2c,1656
11
11
  rdworks/readin.py,sha256=b1BHchQMC5EgQd3C05n72t_aa_9u0iKQWyyIqjyfkPc,11809
12
12
  rdworks/rgroup.py,sha256=ivF2gzmRtt339rxEnkv2KfnCs0CUdBbnSje7Y54rtFI,57996
13
13
  rdworks/scaffold.py,sha256=60T5YacyxZsEpDo_J5Qxulm2YNQO4EQR8PcNUwjn1QU,22026
14
14
  rdworks/std.py,sha256=qOVS_lGogueLKh4rsbrsYIMR0c7z_xh6BqLEzD4X9sE,7938
15
- rdworks/stereoisomers.py,sha256=g8hhPI-mbYX-MzbF1uAqo5fDZOCNiKYjxI-kLBGdGgg,4980
16
- rdworks/tautomers.py,sha256=gtZHZJ-aJbryhBdljHbfjx7xhVW3u_OzdYPtwPail54,610
15
+ rdworks/stereoisomers.py,sha256=2Fp89ItDy5nbZ7FO1KHl0X0yUa2gz95BzbgfQSLnzb0,2686
17
16
  rdworks/testdata.py,sha256=TmbNPA-ju6nTBt_Yts4EJUFmL9Cd6DCVXrDF42QLlHw,1732
18
17
  rdworks/torsion.py,sha256=UUaYOvNS89SlLFauYiAboUqysy32EN0_Gktc4xxuDQI,18788
19
18
  rdworks/units.py,sha256=nljKPHcr6IWoAp0CkL7y1gSNDd6a07NeVfxXwSMuHQM,365
20
19
  rdworks/utils.py,sha256=d2Sio8WTlGPsmBOHIYDCMWg_7X4rTWjJQAqzd7ywo2A,14191
20
+ rdworks/workflow.py,sha256=MtP9QUGgCKMyI3G4vp8sokos_UyaQvTHFOEPUJresZU,3139
21
21
  rdworks/xml.py,sha256=aaMhwVRGvt1VzasaKDnkYnZ4kp2cIgvGb1CsmMgwQ_c,10704
22
22
  rdworks/autograph/__init__.py,sha256=0Qfjwo0h4Q0n08zsqHRbuNOZms6MuNXnWErnQpQ6Px0,140
23
23
  rdworks/autograph/autograph.py,sha256=frjsUaCTOD-Z1lYPzOxRoTtqMMiYroWAy6tSwKn3CUA,8769
@@ -67,8 +67,8 @@ rdworks/predefined/misc/reactive-part-3.xml,sha256=LgWHSEbRTVmgBoIO45xbTo1xQJs0X
67
67
  rdworks/predefined/misc/reactive.xml,sha256=syedoQ6VYUfRLnxy99ObuDniJ_a_WhrWAJbTKFfJ6VY,11248
68
68
  rdworks/xtb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  rdworks/xtb/wrapper.py,sha256=p_ddunnjtxe3F2yN7RC2mvSUDnw7fNBhGm1bZVMAWAE,21901
70
- rdworks-0.52.1.dist-info/licenses/LICENSE,sha256=UOkJSBqYyQUvtCp7a-vdCANeEcLE2dnTie_eB1By5SY,1074
71
- rdworks-0.52.1.dist-info/METADATA,sha256=M47Khc8DU4es8jrzYzp4x4ZyM6ap6NwHrmbJqw5lK5Y,1967
72
- rdworks-0.52.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
73
- rdworks-0.52.1.dist-info/top_level.txt,sha256=05C98HbvBK2axUBogC_hAT_CdpOeQYGnQ6vRAgawr8s,8
74
- rdworks-0.52.1.dist-info/RECORD,,
70
+ rdworks-0.53.1.dist-info/licenses/LICENSE,sha256=UOkJSBqYyQUvtCp7a-vdCANeEcLE2dnTie_eB1By5SY,1074
71
+ rdworks-0.53.1.dist-info/METADATA,sha256=kErcEEj-I1D5jI8ZTSr3D1jVXfZ-cGRlV_z1bsG7vLA,1967
72
+ rdworks-0.53.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
73
+ rdworks-0.53.1.dist-info/top_level.txt,sha256=05C98HbvBK2axUBogC_hAT_CdpOeQYGnQ6vRAgawr8s,8
74
+ rdworks-0.53.1.dist-info/RECORD,,
rdworks/tautomers.py DELETED
@@ -1,20 +0,0 @@
1
- from rdkit.Chem.MolStandardize import rdMolStandardize
2
-
3
- from .mol import Mol
4
- from .mollibr import MolLibr
5
-
6
-
7
- def complete_tautomers(mol:Mol, **kwargs) -> MolLibr:
8
- """Returns a library of enumerated tautomers.
9
-
10
- Args:
11
- mol (Mol): input molecule.
12
-
13
- Returns:
14
- MolLibr: a library of enumerated tautomers.
15
- """
16
- enumerator = rdMolStandardize.TautomerEnumerator()
17
- rdmols = list(enumerator.Enumerate(mol.rdmol))
18
- if len(rdmols) > 1:
19
- return MolLibr(rdmols).unique().rename(mol.name, sep='.').compute(**kwargs)
20
- return MolLibr(rdmols).compute(**kwargs)