rdworks 0.53.1__tar.gz → 0.55.1__tar.gz

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 (85) hide show
  1. {rdworks-0.53.1 → rdworks-0.55.1}/PKG-INFO +1 -1
  2. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/__init__.py +4 -5
  3. rdworks-0.53.1/src/rdworks/workflow.py → rdworks-0.55.1/src/rdworks/complete.py +3 -4
  4. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/conf.py +2 -2
  5. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/microstates.py +30 -15
  6. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/xtb/wrapper.py +7 -6
  7. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks.egg-info/PKG-INFO +1 -1
  8. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks.egg-info/SOURCES.txt +1 -2
  9. {rdworks-0.53.1 → rdworks-0.55.1}/tests/test_basics.py +13 -1
  10. {rdworks-0.53.1 → rdworks-0.55.1}/tests/test_ionized.py +25 -25
  11. rdworks-0.53.1/src/rdworks/pka.py +0 -38
  12. {rdworks-0.53.1 → rdworks-0.55.1}/LICENSE +0 -0
  13. {rdworks-0.53.1 → rdworks-0.55.1}/README.md +0 -0
  14. {rdworks-0.53.1 → rdworks-0.55.1}/pyproject.toml +0 -0
  15. {rdworks-0.53.1 → rdworks-0.55.1}/setup.cfg +0 -0
  16. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/autograph/__init__.py +0 -0
  17. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/autograph/autograph.py +0 -0
  18. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/autograph/centroid.py +0 -0
  19. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/autograph/dynamictreecut.py +0 -0
  20. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/autograph/nmrclust.py +0 -0
  21. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/autograph/rckmeans.py +0 -0
  22. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/bitqt/__init__.py +0 -0
  23. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/bitqt/bitqt.py +0 -0
  24. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/descriptor.py +0 -0
  25. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/display.py +0 -0
  26. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/ionized.py +0 -0
  27. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/matchedseries.py +0 -0
  28. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/mol.py +0 -0
  29. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/mollibr.py +0 -0
  30. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Asinex_fragment.xml +0 -0
  31. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Astex_RO3.xml +0 -0
  32. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Baell2010_PAINS/Baell2010A.xml +0 -0
  33. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Baell2010_PAINS/Baell2010B.xml +0 -0
  34. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Baell2010_PAINS/Baell2010C.xml +0 -0
  35. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Baell2010_PAINS/PAINS-less-than-015-hits.xml +0 -0
  36. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Baell2010_PAINS/PAINS-less-than-150-hits.xml +0 -0
  37. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Baell2010_PAINS/PAINS-more-than-150-hits.xml +0 -0
  38. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Baell2010_PAINS/makexml.py +0 -0
  39. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Brenk2008_Dundee/makexml.py +0 -0
  40. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/CNS.xml +0 -0
  41. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/BMS.xml +0 -0
  42. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/Dundee.xml +0 -0
  43. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/Glaxo.xml +0 -0
  44. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/Inpharmatica.xml +0 -0
  45. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/LINT.xml +0 -0
  46. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/MLSMR.xml +0 -0
  47. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/PAINS.xml +0 -0
  48. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/SureChEMBL.xml +0 -0
  49. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ChEMBL_Walters/makexml.py +0 -0
  50. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Hann1999_Glaxo/Hann1999.xml +0 -0
  51. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Hann1999_Glaxo/Hann1999Acid.xml +0 -0
  52. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Hann1999_Glaxo/Hann1999Base.xml +0 -0
  53. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Hann1999_Glaxo/Hann1999ElPh.xml +0 -0
  54. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Hann1999_Glaxo/Hann1999NuPh.xml +0 -0
  55. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Hann1999_Glaxo/makexml.py +0 -0
  56. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Kazius2005/Kazius2005.xml +0 -0
  57. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/Kazius2005/makexml.py +0 -0
  58. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ZINC_druglike.xml +0 -0
  59. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ZINC_fragment.xml +0 -0
  60. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ZINC_leadlike.xml +0 -0
  61. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/fragment.xml +0 -0
  62. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ionized/simple_smarts_pattern.csv +0 -0
  63. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/ionized/smarts_pattern.csv +0 -0
  64. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/misc/makexml.py +0 -0
  65. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/misc/reactive-part-2.xml +0 -0
  66. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/misc/reactive-part-3.xml +0 -0
  67. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/predefined/misc/reactive.xml +0 -0
  68. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/readin.py +0 -0
  69. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/rgroup.py +0 -0
  70. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/scaffold.py +0 -0
  71. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/std.py +0 -0
  72. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/stereoisomers.py +0 -0
  73. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/testdata.py +0 -0
  74. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/torsion.py +0 -0
  75. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/units.py +0 -0
  76. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/utils.py +0 -0
  77. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/xml.py +0 -0
  78. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks/xtb/__init__.py +0 -0
  79. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks.egg-info/dependency_links.txt +0 -0
  80. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks.egg-info/requires.txt +0 -0
  81. {rdworks-0.53.1 → rdworks-0.55.1}/src/rdworks.egg-info/top_level.txt +0 -0
  82. {rdworks-0.53.1 → rdworks-0.55.1}/tests/test_qupkake.py +0 -0
  83. {rdworks-0.53.1 → rdworks-0.55.1}/tests/test_round.py +0 -0
  84. {rdworks-0.53.1 → rdworks-0.55.1}/tests/test_torsion.py +0 -0
  85. {rdworks-0.53.1 → rdworks-0.55.1}/tests/test_xtb.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdworks
3
- Version: 0.53.1
3
+ Version: 0.55.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,16 +1,15 @@
1
- __version__ = '0.53.1'
1
+ __version__ = '0.55.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.workflow import complete_stereoisomers, complete_tautomers
8
-
9
- from rdworks.ionized import IonizedStates
10
-
11
7
  from rdworks.readin import read_csv, merge_csv, read_dataframe, read_smi, read_sdf, read_mae
12
8
  from rdworks.std import desalt_smiles, standardize_smiles, standardize
13
9
 
10
+ from rdworks.complete import complete_stereoisomers, complete_tautomers
11
+ from rdworks.ionized import IonizedStates
12
+
14
13
  from rdworks.rgroup import expand_rgroup, most_common, most_common_in_NP
15
14
  from rdworks.scaffold import scaffold_network, scaffold_tree, BRICS_fragmented, BRICS_fragment_indices
16
15
  from rdworks.matchedseries import MatchedSeries
@@ -1,8 +1,5 @@
1
-
1
+ from rdworks import Mol, MolLibr
2
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
3
  from rdkit import Chem
7
4
  from rdkit.Chem.MolStandardize import rdMolStandardize
8
5
 
@@ -26,6 +23,8 @@ def complete_stereoisomers(molecular_input: str | Chem.Mol | Mol,
26
23
  Returns:
27
24
  MolLibr: a library of complete stereoisomers.
28
25
  """
26
+ from rdworks import Mol, MolLibr
27
+
29
28
  if isinstance(molecular_input, Mol):
30
29
  if name:
31
30
  mol = molecular_input.rename(name)
@@ -546,9 +546,9 @@ class Conf:
546
546
  conf = frag_conf.copy()
547
547
  conf.set_torsion(*frag_ijkl, angle) # atoms bonded to `l` move.
548
548
  conf = conf.optimize(calculator, fmax, **kwargs)
549
+ data['angle'].append(angle)
549
550
  # conf.optimize() updates coordinates and conf.props:
550
551
  # `E_tot_init(kcal/mol)`, `E_tot(kcal/mol)`, `Converged`.
551
- data['angle'].append(angle)
552
552
  data['init'].append(conf.props['E_tot_init(kcal/mol)'])
553
553
  data['last'].append(conf.props['E_tot(kcal/mol)'])
554
554
  data['Converged'].append(conf.props['Converged'])
@@ -562,9 +562,9 @@ class Conf:
562
562
  conf = ref_conf.copy()
563
563
  conf.set_torsion(*indices, angle) # atoms bonded to `l` move.
564
564
  conf = conf.optimize(calculator, fmax, **kwargs)
565
+ data['angle'].append(angle)
565
566
  # conf.optimize() updates coordinates and conf.props:
566
567
  # `E_tot_init(kcal/mol)`, `E_tot(kcal/mol)`, `Converged`.
567
- data['angle'].append(conf.props['angle'])
568
568
  data['init'].append(conf.props['E_tot_init(kcal/mol)'])
569
569
  data['last'].append(conf.props['E_tot(kcal/mol)'])
570
570
  data['Converged'].append(conf.props['Converged'])
@@ -1,11 +1,22 @@
1
1
  import numpy as np
2
2
  import math
3
3
  import itertools
4
+ import logging
4
5
 
5
6
  from types import SimpleNamespace
7
+ from pathlib import Path
6
8
  from rdworks import Conf, Mol
7
9
  from rdworks.xtb.wrapper import GFN2xTB
8
10
 
11
+ from rdkit import Chem
12
+ from rdkit.Chem import (
13
+ AllChem, RemoveHs, CanonSmiles, MolFromSmarts,
14
+ GetFormalCharge, RWMol, AddHs, SanitizeMol,
15
+ MolToSmiles, MolFromSmiles,
16
+ )
17
+
18
+ logger = logging.getLogger(__name__)
19
+
9
20
 
10
21
  kT = 0.001987 * 298.0 # (kcal/mol K), standard condition
11
22
  C = math.log(10) * kT
@@ -23,9 +34,10 @@ class Microstates():
23
34
  self.mols = []
24
35
  self.reference = None
25
36
 
26
- # read QupKake results
37
+
38
+ def enumerate(self) -> None:
39
+ # Qu pKake results must be stored at .confs
27
40
  for conf in self.origin:
28
- print(conf.props)
29
41
  pka = conf.props.get('pka', None)
30
42
  if pka is None:
31
43
  # no protonation/deprotonation sites
@@ -49,7 +61,7 @@ class Microstates():
49
61
 
50
62
  for (p, d) in PD:
51
63
  conf = self.origin.confs[0].copy()
52
- conf = conf.protonate(p).deprotonate(d).optimize(calculator=calculator)
64
+ conf = conf.protonate(p).deprotonate(d).optimize(calculator=self.calculator)
53
65
  charge = len(p) - len(d)
54
66
  self.states.append(SimpleNamespace(
55
67
  charge=charge,
@@ -83,7 +95,7 @@ class Microstates():
83
95
  return float(np.dot(p, pe_array))
84
96
 
85
97
 
86
- def potential_energy(self) -> None:
98
+ def populate(self) -> None:
87
99
  for microstate in self.states:
88
100
  mol = Mol(microstate.conf).make_confs(n=4).optimize_confs()
89
101
  # mol = mol.drop_confs(similar=True, similar_rmsd=0.3, verbose=True)
@@ -94,23 +106,21 @@ class Microstates():
94
106
  conf = conf.optimize(calculator=self.calculator, verbose=True)
95
107
  # GFN2xTB requires 3D coordinates
96
108
  # xtb = GFN2xTB(conf.rdmol).singlepoint(water='cpcmx', verbose=True)
97
- xtb = GFN2xTB(conf.rdmol).singlepoint(verbose=True)
98
- PE.append(xtb.PE)
109
+ PE.append(conf.potential_energy(calculator=self.calculator))
110
+ # xtb = GFN2xTB(conf.rdmol).singlepoint(verbose=True)
99
111
  # SimpleNamespace(
100
112
  # PE = datadict['total energy'] * hartree2kcalpermol,
101
113
  # Gsolv = Gsolv,
102
114
  # charges = datadict['partial charges'],
103
115
  # wbo = Wiberg_bond_orders,
104
116
  # )
105
- print("PE=", PE)
106
117
  microstate.PE = self.Boltzmann_weighted_average(PE)
107
- print("Boltzmann weighted=", microstate.PE)
108
-
118
+ logger.info(f"PE= {PE}")
119
+ logger.info(f"Boltzmann weighted= {microstate.PE}")
109
120
  self.mols.append(mol)
110
- print("microstate.energy", microstate)
111
121
 
112
122
 
113
- def populations(self, pH: float) -> list[tuple]:
123
+ def get_populations(self, pH: float) -> list[tuple]:
114
124
  # set the lowest dG as the reference
115
125
  self.reference = self.states[np.argmin([microstate.PE for microstate in self.states])]
116
126
  for microstate in self.states:
@@ -120,7 +130,7 @@ class Microstates():
120
130
  dG.append((microstate.PE - self.reference.PE) + microstate.delta_m * C * pH)
121
131
  dG = np.array(dG)
122
132
 
123
- print("dG=", dG)
133
+ logger.info(f"dG= {dG}")
124
134
  Boltzmann_factors = np.exp(-dG/kT)
125
135
  Z = np.sum(Boltzmann_factors)
126
136
  p = Boltzmann_factors/Z
@@ -128,11 +138,16 @@ class Microstates():
128
138
  # [(0, p0), (1, p1), ...]
129
139
 
130
140
  return idx_p
141
+
142
+
143
+ def get_ensemble(self) -> list[Mol]:
144
+ return self.mols
145
+
146
+
147
+ def get_mol(self, idx: int) -> Mol:
148
+ return self.mols[idx]
131
149
 
132
150
 
133
151
  def count(self) -> int:
134
152
  return len(self.states)
135
153
 
136
-
137
- def get_mol(self, idx: int) -> Mol:
138
- return self.mols[idx]
@@ -79,7 +79,8 @@ class GFN2xTB:
79
79
  proc = subprocess.run(['xtb', test_geometry, '--opt'],
80
80
  cwd=temp_dir,
81
81
  capture_output=True,
82
- text=True)
82
+ text=True,
83
+ encoding='utf-8')
83
84
  assert proc.returncode == 0
84
85
 
85
86
  return True
@@ -122,7 +123,7 @@ $ cp -r xtb-dist/share /usr/local/ """)
122
123
  if GFN2xTB.is_xtb_ready():
123
124
  with tempfile.TemporaryDirectory() as temp_dir: # tmpdir is a string
124
125
  cmd = ['xtb', '--cpcmx']
125
- proc = subprocess.run(cmd, cwd=temp_dir, capture_output=True, text=True)
126
+ proc = subprocess.run(cmd, cwd=temp_dir, capture_output=True, text=True, encoding='utf-8')
126
127
  # we are expecting an error because no input file is given
127
128
  assert proc.returncode != 0
128
129
  for line in proc.stdout.split('\n'):
@@ -156,7 +157,7 @@ $ cp -r xtb-dist/share /usr/local/ """)
156
157
  if GFN2xTB.is_xtb_ready():
157
158
  with tempfile.TemporaryDirectory() as temp_dir: # tmpdir is a string
158
159
  cmd = ['xtb', '--version']
159
- proc = subprocess.run(cmd, cwd=temp_dir, capture_output=True, text=True)
160
+ proc = subprocess.run(cmd, cwd=temp_dir, capture_output=True, text=True, encoding='utf-8')
160
161
  assert proc.returncode == 0, "GFN2xTB() Error: xtb not available"
161
162
  match = re.search('xtb\s+version\s+(?P<version>[\d.]+)', proc.stdout)
162
163
  if match:
@@ -358,7 +359,7 @@ $ cp -r xtb-dist/share /usr/local/ """)
358
359
 
359
360
  # 'xtbout.json', 'xtbrestart', 'xtbtopo.mol', 'charges', and 'wbo' files will be
360
361
  # created in the current working directory.
361
- proc = subprocess.run(cmd + options, cwd=temp_dir, capture_output=True, text=True)
362
+ proc = subprocess.run(cmd + options, cwd=temp_dir, capture_output=True, text=True, encoding='utf-8')
362
363
  # if proc.returncode == 0:
363
364
  # print("Standard Output:")
364
365
  # print(proc.stdout)
@@ -461,7 +462,7 @@ $ cp -r xtb-dist/share /usr/local/ """)
461
462
  if verbose:
462
463
  logger.info(f"optimize() {' '.join(cmd+options)}")
463
464
 
464
- proc = subprocess.run(cmd + options, cwd=temp_dir, capture_output=True, text=True)
465
+ proc = subprocess.run(cmd + options, cwd=temp_dir, capture_output=True, text=True, encoding='utf-8')
465
466
 
466
467
  if proc.returncode == 0 and xtbout_path.is_file():
467
468
  with open(xtbout_path, 'r') as f:
@@ -527,7 +528,7 @@ $ cp -r xtb-dist/share /usr/local/ """)
527
528
  elif water == 'alpb':
528
529
  options += ['--alpb', 'water']
529
530
 
530
- proc = subprocess.run(cmd + options, cwd=temp_dir, capture_output=True, text=True)
531
+ proc = subprocess.run(cmd + options, cwd=temp_dir, capture_output=True, text=True, encoding='utf-8')
531
532
  # output files: xtb_esp.cosmo, xtb_esp.dat, xtb_esp_profile.dat
532
533
 
533
534
  if proc.returncode == 0 and xtb_esp_dat.is_file():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdworks
3
- Version: 0.53.1
3
+ Version: 0.55.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>
@@ -2,6 +2,7 @@ LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
4
  src/rdworks/__init__.py
5
+ src/rdworks/complete.py
5
6
  src/rdworks/conf.py
6
7
  src/rdworks/descriptor.py
7
8
  src/rdworks/display.py
@@ -10,7 +11,6 @@ src/rdworks/matchedseries.py
10
11
  src/rdworks/microstates.py
11
12
  src/rdworks/mol.py
12
13
  src/rdworks/mollibr.py
13
- src/rdworks/pka.py
14
14
  src/rdworks/readin.py
15
15
  src/rdworks/rgroup.py
16
16
  src/rdworks/scaffold.py
@@ -20,7 +20,6 @@ src/rdworks/testdata.py
20
20
  src/rdworks/torsion.py
21
21
  src/rdworks/units.py
22
22
  src/rdworks/utils.py
23
- src/rdworks/workflow.py
24
23
  src/rdworks/xml.py
25
24
  src/rdworks.egg-info/PKG-INFO
26
25
  src/rdworks.egg-info/SOURCES.txt
@@ -400,7 +400,19 @@ def test_complete_stereoisomers():
400
400
  for mol in MolLibr(drug_smiles, drug_names):
401
401
  isomer_libr += rdworks.complete_stereoisomers(mol)
402
402
  assert isomer_libr.count() >= 25
403
-
403
+
404
+
405
+ def test_count_stereoisomers():
406
+ """count all possible stereoisomers ignoring current stereochemistry assignment"""
407
+ m = Mol('Cc1nc2c(-c3ccc(Cl)cc3F)nc(N3CCN(C(=O)C(F)F)CC3)cn2c(=O)c1C')
408
+ assert m.count_stereoisomers() == 1
409
+ m = Mol('CN1C=C([C@H]2CN(C3=NC(C4=CC=C(Cl)C=C4F)=C4N=C5CCCCN5C(=O)C4=C3)CCO2)C=N1')
410
+ assert m.count_stereoisomers() == 2
411
+ m = Mol('Cc1nc2c(-c3ccc(Cl)cc3F)nc(N3CCN(S(=O)(=O)N4C[C@@H](C)O[C@@H](C)C4)CC3)cn2c(=O)c1C')
412
+ assert m.count_stereoisomers() == 3
413
+ m = Mol('Cc1cc([C@H]2CN(c3cc4nc(C)c(C)c(=O)n4c(-c4ccc(Cl)cc4F)n3)C[C@@H](C)O2)ccn1')
414
+ assert m.count_stereoisomers() == 4
415
+
404
416
 
405
417
  def test_cluster():
406
418
  libr = rdworks.read_smi(datadir / "cdk2.smi.gz", progress=False)
@@ -36,31 +36,31 @@ def test_ionizedstate():
36
36
  assert set(expected).intersection(set(results)) == set(expected)
37
37
 
38
38
 
39
- def test_gypsum_dl():
40
- import gypsum_dl
41
- smiles = 'O=C(NCCCC)[C@H](CCC1)N1[C@@H](CC)C2=NN=C(CC3=CC=C(C)C=C3)O2'
42
- state_smiles = list(
43
- gypsum_dl.GypsumDL(smiles,
44
- min_ph=6.4,
45
- max_ph=8.4,
46
- pka_precision=1.0,
47
- thoroughness=3,
48
- max_variants_per_compound=5,
49
- second_embed=False,
50
- skip_optimize_geometry=False,
51
- skip_alternate_ring_conformations=False,
52
- skip_adding_hydrogen=False,
53
- skip_making_tautomers=False,
54
- skip_enumerate_chiral_mol=False,
55
- skip_enumerate_double_bonds=False,
56
- let_tautomers_change_chirality=False,
57
- use_durrant_lab_filters=True,
58
- job_manager='serial',
59
- num_processors=1,
60
- ))
61
- for smi in state_smiles:
62
- print(smi)
39
+ # def test_gypsum_dl():
40
+ # import gypsum_dl
41
+ # smiles = 'O=C(NCCCC)[C@H](CCC1)N1[C@@H](CC)C2=NN=C(CC3=CC=C(C)C=C3)O2'
42
+ # state_smiles = list(
43
+ # gypsum_dl.GypsumDL(smiles,
44
+ # min_ph=6.4,
45
+ # max_ph=8.4,
46
+ # pka_precision=1.0,
47
+ # thoroughness=3,
48
+ # max_variants_per_compound=5,
49
+ # second_embed=False,
50
+ # skip_optimize_geometry=False,
51
+ # skip_alternate_ring_conformations=False,
52
+ # skip_adding_hydrogen=False,
53
+ # skip_making_tautomers=False,
54
+ # skip_enumerate_chiral_mol=False,
55
+ # skip_enumerate_double_bonds=False,
56
+ # let_tautomers_change_chirality=False,
57
+ # use_durrant_lab_filters=True,
58
+ # job_manager='serial',
59
+ # num_processors=1,
60
+ # ))
61
+ # for smi in state_smiles:
62
+ # print(smi)
63
63
 
64
64
  if __name__ == '__main__':
65
65
  test_ionizedstate()
66
- test_gypsum_dl()
66
+ # test_gypsum_dl()
@@ -1,38 +0,0 @@
1
- """This module is an implementation in progress of the decision tree method for pKa prediction.
2
-
3
- Crippen, J. Chem. Inf. Model., Vol. 48, No. 10, 2008, 2042-2053.
4
-
5
- The SMARTS patterns and pKa values were taken from the supporting information of the paper.
6
- These "MOE SMARTS" were converted to generic SMARTS which relied on use of some recursive SMARTS patterns.
7
- The first data row then describes nodes 1, and then the tree expands out based on decisions of SMARTS-matching:
8
- if node 2 is yes to pattern [#8,#16,#34,#52,#84;H]C(=O) - giving pKa 3.68 and range 5.96
9
- node 3 is no to the same pattern - giving pKa 7.21 and range 17.32
10
- Then nodes 4,5 are under 2 and 6,7 are under 3, etc, etc until the leaf nodes are reached
11
- """
12
-
13
-
14
- import importlib.resources
15
- from collections import namedtuple
16
- from typing import Union
17
-
18
- from rdkit import Chem
19
- from rdkit.Chem import AllChem
20
-
21
- datadir = importlib.resources.files('rdworks.predefined')
22
- DecisionTreeNode = namedtuple('DecisionTree', ('node', 'parent', 'child', 'FP', 'SMARTS', 'YN', 'pKa', 'pKa_range'))
23
- decision_tree = []
24
- with open(datadir / "pKa_decision_tree.ext", "r") as f:
25
- for line in f:
26
- if (not line) or line.startswith('#'):
27
- continue
28
- decision_tree.append(DecisionTreeNode(line.strip().split()))
29
-
30
-
31
- def decision_tree_pKa(rdmol:Chem.Mol) -> Union[float, None]:
32
- pKa = None
33
- for _ in decision_tree:
34
- patt = Chem.MolFromSmarts(_.SMARTS) # make an RDKit query molecule
35
- match = rdmol.HasSubstructMatch(patt) # check if we have a match for our test molecule
36
- # pKa = float(values[6])
37
- # pKa_range = float(values[7])
38
- return pKa
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes