rowan-python 3.0.4__py3-none-any.whl → 3.0.5__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.
rowan/__init__.py CHANGED
@@ -1,17 +1,25 @@
1
1
  # ruff: noqa
2
2
  from . import constants
3
3
  from stjames import (
4
+ Atom,
4
5
  Constraint,
5
6
  ConstraintType,
7
+ ConformerGenSettingsUnion,
6
8
  Correction,
7
9
  Engine,
10
+ ETKDGSettings,
11
+ iMTDSettings,
8
12
  Method,
9
13
  Mode,
14
+ MultiStageOptSettings,
10
15
  OptimizationSettings,
16
+ PBCDFTSettings,
17
+ PeriodicCell,
11
18
  Settings,
12
19
  SolventSettings,
13
20
  Task,
14
21
  )
22
+ from stjames.pbc_dft_settings import PBCDFTSmearing
15
23
  from stjames.optimization.freezing_string_method import (
16
24
  FSMInterpolation,
17
25
  FSMOptimizationCoordinates,
rowan/molecule.py CHANGED
@@ -87,6 +87,32 @@ class Molecule(BaseModel):
87
87
  """
88
88
  return cls(_stjames=stj)
89
89
 
90
+ @classmethod
91
+ def from_atoms(
92
+ cls,
93
+ atoms: list[stjames.Atom],
94
+ charge: int = 0,
95
+ multiplicity: int = 1,
96
+ cell: stjames.PeriodicCell | None = None,
97
+ ) -> Self:
98
+ """
99
+ Create molecule from a list of atoms.
100
+
101
+ :param atoms: List of Atom objects.
102
+ :param charge: Molecular charge (default 0).
103
+ :param multiplicity: Spin multiplicity (default 1).
104
+ :param cell: PeriodicCell for periodic boundary conditions.
105
+ :returns: Molecule instance.
106
+ """
107
+ return cls(
108
+ _stjames=stjames.Molecule(
109
+ atoms=atoms,
110
+ charge=charge,
111
+ multiplicity=multiplicity,
112
+ cell=cell,
113
+ )
114
+ )
115
+
90
116
  def to_xyz(self) -> str:
91
117
  """Convert to XYZ format string."""
92
118
  return self._stjames.to_xyz()
@@ -184,6 +210,11 @@ class Molecule(BaseModel):
184
210
  """Thermal correction to Gibbs free energy (Hartree)."""
185
211
  return self._stjames.thermal_free_energy_corr
186
212
 
213
+ @property
214
+ def cell(self) -> stjames.PeriodicCell | None:
215
+ """Unit cell for periodic boundary conditions."""
216
+ return self._stjames.cell
217
+
187
218
  @property
188
219
  def gradient(self) -> list[tuple[float, float, float]] | None:
189
220
  """Nuclear gradient (Hartree/Bohr)."""
@@ -162,6 +162,9 @@ def submit_analogue_docking_workflow(
162
162
  executable: str = "vina",
163
163
  scoring_function: str = "vinardo",
164
164
  exhaustiveness: float = 8,
165
+ num_conformers_per_analogue: int = 100,
166
+ require_posebusters: bool = False,
167
+ run_local_optimization: bool = False,
165
168
  name: str = "Analogue Docking Workflow",
166
169
  folder_uuid: str | None = None,
167
170
  folder: Folder | None = None,
@@ -178,6 +181,9 @@ def submit_analogue_docking_workflow(
178
181
  :param executable: Which docking implementation to use.
179
182
  :param scoring_function: Which docking scoring function to use.
180
183
  :param exhaustiveness: Which exhaustiveness to employ.
184
+ :param num_conformers_per_analogue: Maximum number of conformers to generate per analogue.
185
+ :param require_posebusters: Filter conformers based on PoseBusters validity before docking.
186
+ :param run_local_optimization: Whether to run a local opt in docking pocket or just score.
181
187
  :param name: Name of the workflow.
182
188
  :param folder_uuid: UUID of the folder to place the workflow in.
183
189
  :param folder: Folder object to store the workflow in.
@@ -207,6 +213,9 @@ def submit_analogue_docking_workflow(
207
213
  initial_molecule=initial_molecule,
208
214
  protein=protein,
209
215
  docking_settings=docking_settings,
216
+ num_conformers_per_analogue=num_conformers_per_analogue,
217
+ require_posebusters=require_posebusters,
218
+ run_local_optimization=run_local_optimization,
210
219
  )
211
220
 
212
221
  data = {
@@ -9,6 +9,7 @@ from stjames import (
9
9
  Engine,
10
10
  Method,
11
11
  OptimizationSettings,
12
+ PBCDFTSettings,
12
13
  Settings,
13
14
  SolventSettings,
14
15
  )
@@ -159,6 +160,7 @@ def submit_basic_calculation_workflow(
159
160
  corrections: list[str] | None = None,
160
161
  solvent_settings: SolventSettings | dict[str, Any] | None = None,
161
162
  opt_settings: OptimizationSettings | dict[str, Any] | None = None,
163
+ pbc_dft_settings: PBCDFTSettings | dict[str, Any] | None = None,
162
164
  preset: PresetName | None = None,
163
165
  name: str = "Basic Calculation Workflow",
164
166
  folder_uuid: str | None = None,
@@ -179,6 +181,10 @@ def submit_basic_calculation_workflow(
179
181
  :param corrections: Dispersion corrections, see `Correction`.
180
182
  :param solvent_settings: Solvent settings as a dict or `SolventSettings`.
181
183
  :param opt_settings: Optimization settings as a dict or `OptimizationSettings`.
184
+ :param pbc_dft_settings: Periodic boundary condition DFT settings as a dict or
185
+ `PBCDFTSettings`. Specifies the plane-wave cutoff (Hartree), Monkhorst–Pack
186
+ k-point grid, and optional smearing. When set, the engine is automatically
187
+ set to Quantum ESPRESSO unless ``engine`` is explicitly provided.
182
188
  :param preset: Named preset, mutually exclusive with method/engine/basis_set/corrections.
183
189
  - `general_nnp` — omol25_conserving_s on omol25
184
190
  - `organic_nnp` — aimnet2_wb97md3 on aimnet2
@@ -203,6 +209,9 @@ def submit_basic_calculation_workflow(
203
209
  if folder:
204
210
  folder_uuid = folder.uuid
205
211
 
212
+ if isinstance(pbc_dft_settings, dict):
213
+ pbc_dft_settings = PBCDFTSettings(**pbc_dft_settings)
214
+
206
215
  if preset is not None:
207
216
  if any(x is not None for x in [method, engine, corrections, basis_set]):
208
217
  raise ValueError(
@@ -214,6 +223,7 @@ def submit_basic_calculation_workflow(
214
223
  mode=mode,
215
224
  solvent_settings=solvent_settings,
216
225
  **({"opt_settings": opt_settings} if opt_settings else {}),
226
+ **({"pbc_dft_settings": pbc_dft_settings} if pbc_dft_settings else {}),
217
227
  )
218
228
  else:
219
229
  if method is None:
@@ -228,6 +238,10 @@ def submit_basic_calculation_workflow(
228
238
  if isinstance(opt_settings, dict):
229
239
  opt_settings = stjames.OptimizationSettings(**opt_settings)
230
240
 
241
+ # pbc_dft_settings implies Quantum ESPRESSO; override engine unless explicitly set
242
+ if pbc_dft_settings is not None and engine is None:
243
+ engine = Engine.QUANTUM_ESPRESSO
244
+
231
245
  settings_kwargs: dict[str, Any] = {
232
246
  "method": method,
233
247
  "basis_set": basis_set,
@@ -236,8 +250,12 @@ def submit_basic_calculation_workflow(
236
250
  "corrections": corrections or [],
237
251
  "solvent_settings": solvent_settings,
238
252
  }
253
+ if engine is not None:
254
+ settings_kwargs["engine"] = engine
239
255
  if opt_settings is not None:
240
256
  settings_kwargs["opt_settings"] = opt_settings
257
+ if pbc_dft_settings is not None:
258
+ settings_kwargs["pbc_dft_settings"] = pbc_dft_settings
241
259
  settings = stjames.Settings(**settings_kwargs)
242
260
 
243
261
  initial_molecule = molecule_to_dict(initial_molecule)
rowan/workflows/pka.py CHANGED
@@ -23,13 +23,15 @@ class pKaMicrostate:
23
23
  """
24
24
  Microstate from a pKa calculation.
25
25
 
26
- Available fields depend on the pKa method used:
27
- aimnet2_wagen2024 provides delta_g; chemprop_nevolianis2025 provides smiles and uncertainty.
26
+ Available fields depend on the pKa method used. 3D structure-based methods
27
+ (aimnet2_wagen2024, gxtb_wagen2026) populate delta_g. SMILES-based methods
28
+ (chemprop_nevolianis2025, starling) populate smiles; chemprop_nevolianis2025
29
+ also populates uncertainty.
28
30
 
29
31
  :param atom_index: Index of the protonation site atom.
30
32
  :param pka: Predicted pKa value.
31
- :param smiles: SMILES of the microstate (chemprop_nevolianis2025 only).
32
- :param delta_g: Free energy of (de)protonation in kcal/mol (aimnet2_wagen2024 only).
33
+ :param smiles: SMILES of the microstate (SMILES-based methods only).
34
+ :param delta_g: Free energy of (de)protonation in kcal/mol (3D structure-based methods only).
33
35
  :param uncertainty: Prediction uncertainty (chemprop_nevolianis2025 only).
34
36
  """
35
37
 
@@ -40,6 +42,12 @@ class pKaMicrostate:
40
42
  uncertainty: float | None = None
41
43
 
42
44
 
45
+ # Methods grouped by input type and solvent support
46
+ _PKA_3D_METHODS = {"aimnet2_wagen2024", "gxtb_wagen2026"}
47
+ _PKA_SMILES_METHODS = {"chemprop_nevolianis2025", "starling"}
48
+ _PKA_WATER_ONLY_METHODS = {"aimnet2_wagen2024", "gxtb_wagen2026", "starling"}
49
+
50
+
43
51
  @register_result("pka")
44
52
  class pKaResult(WorkflowResult):
45
53
  """Result from a pKa workflow."""
@@ -95,19 +103,19 @@ class pKaResult(WorkflowResult):
95
103
  """
96
104
  Optimized structure calculations (lazily fetched).
97
105
 
98
- Only available for aimnet2_wagen2024 method (3D structure-based).
106
+ Only available for 3D structure-based methods (aimnet2_wagen2024, gxtb_wagen2026).
99
107
 
100
108
  .. note::
101
109
  Makes one API call per structure on first access.
102
110
  Results are cached. Call clear_cache() to refresh.
103
111
 
104
- :raises ValueError: If method is chemprop_nevolianis2025 (no structures).
112
+ :raises ValueError: If method is SMILES-based (chemprop_nevolianis2025, starling).
105
113
  """
106
114
  method = self._workflow.microscopic_pka_method
107
- if method == "chemprop_nevolianis2025":
115
+ if method in _PKA_SMILES_METHODS:
108
116
  raise ValueError(
109
- "chemprop_nevolianis2025 is SMILES-based and does not produce structures. "
110
- "Use aimnet2_wagen2024 for 3D structure calculations."
117
+ f"{method} is SMILES-based and does not produce structures. "
118
+ "Use aimnet2_wagen2024 or gxtb_wagen2026 for 3D structure calculations."
111
119
  )
112
120
  if "structures" not in self._cache:
113
121
  uuids = self._get_structure_uuids()
@@ -118,7 +126,9 @@ class pKaResult(WorkflowResult):
118
126
  def submit_pka_workflow(
119
127
  initial_molecule: MoleculeInput | str,
120
128
  pka_range: tuple[int, int] = (2, 12),
121
- method: Literal["aimnet2_wagen2024", "chemprop_nevolianis2025"] = "aimnet2_wagen2024",
129
+ method: Literal[
130
+ "aimnet2_wagen2024", "gxtb_wagen2026", "chemprop_nevolianis2025", "starling"
131
+ ] = "aimnet2_wagen2024",
122
132
  solvent: SolventInput = "water",
123
133
  deprotonate_elements: list[int] | None = None,
124
134
  protonate_elements: list[int] | None = None,
@@ -136,7 +146,11 @@ def submit_pka_workflow(
136
146
  :param initial_molecule: Molecule to calculate pKa for.
137
147
  Accepts Molecule, stjames.Molecule, RDKit Mol, dict, or SMILES string.
138
148
  :param pka_range: Range of pKa values to calculate.
139
- :param method: Algorithm used to compute pKa values.
149
+ :param method: Algorithm used to compute pKa values:
150
+ - ``aimnet2_wagen2024``: AIMNet2-based; requires 3D structure; water only.
151
+ - ``gxtb_wagen2026``: g-xTB-based; requires 3D structure; water only; full periodic table.
152
+ - ``chemprop_nevolianis2025``: Chemprop-based; requires SMILES; several solvents supported.
153
+ - ``starling``: SMILES-based; water only.
140
154
  :param solvent: Solvent in which pKa values will be computed.
141
155
  :param deprotonate_elements: Elements to deprotonate (atomic numbers).
142
156
  :param protonate_elements: Elements to protonate (atomic numbers).
@@ -148,7 +162,7 @@ def submit_pka_workflow(
148
162
  :param webhook_url: URL that Rowan will POST to when the workflow completes.
149
163
  :param is_draft: If True, submit the workflow as a draft without starting execution.
150
164
  :returns: Workflow object representing the submitted workflow.
151
- :raises ValueError: If method and input type don't match.
165
+ :raises ValueError: If method and input type don't match, or solvent is unsupported.
152
166
  :raises requests.HTTPError: if the request to the API fails.
153
167
  """
154
168
  if folder and folder_uuid:
@@ -163,16 +177,17 @@ def submit_pka_workflow(
163
177
  else:
164
178
  mol_dict = molecule_to_dict(initial_molecule)
165
179
 
166
- # Validate method/input compatibility
167
- if method == "aimnet2_wagen2024" and not mol_dict:
180
+ if method in _PKA_3D_METHODS and not mol_dict:
168
181
  raise ValueError(
169
- "aimnet2_wagen2024 requires a 3D structure. Provide a Molecule, not a SMILES string."
182
+ f"{method} requires a 3D structure. Provide a Molecule, not a SMILES string."
170
183
  )
171
- if method == "chemprop_nevolianis2025" and not initial_smiles:
184
+ if method in _PKA_SMILES_METHODS and not initial_smiles:
172
185
  raise ValueError(
173
- "chemprop_nevolianis2025 requires a SMILES string. "
186
+ f"{method} requires a SMILES string. "
174
187
  "Provide a SMILES string, not a 3D structure."
175
188
  )
189
+ if method in _PKA_WATER_ONLY_METHODS and solvent != "water":
190
+ raise ValueError(f"{method} only supports water as solvent.")
176
191
 
177
192
  protonate_elements = protonate_elements or [7]
178
193
  deprotonate_elements = deprotonate_elements or [7, 8, 16]
rowan/workflows/strain.py CHANGED
@@ -1,6 +1,7 @@
1
1
  """Strain workflow - calculate molecular strain energy."""
2
2
 
3
3
  import math
4
+ from typing import Any
4
5
 
5
6
  import stjames
6
7
 
@@ -113,6 +114,7 @@ def submit_strain_workflow(
113
114
  harmonic_constraint_spring_constant: float = 5.0,
114
115
  constrain_hydrogens: bool = False,
115
116
  conf_gen_settings: stjames.ConformerGenSettingsUnion | None = None,
117
+ multistage_opt_settings: stjames.MultiStageOptSettings | None = None,
116
118
  name: str = "Strain Workflow",
117
119
  folder_uuid: str | None = None,
118
120
  folder: Folder | None = None,
@@ -128,7 +130,9 @@ def submit_strain_workflow(
128
130
  constraints (kcal/mol/A). Default 5.0.
129
131
  :param constrain_hydrogens: Whether to constrain hydrogen positions. Default False.
130
132
  :param conf_gen_settings: Conformer generation settings. Defaults to ETKDG with
131
- max 50 conformers.
133
+ max 200 conformers.
134
+ :param multistage_opt_settings: Optimization settings for conformer ranking.
135
+ Defaults to AIMNet2/wB97M-D3 optimization with CPCMx singlepoint.
132
136
  :param name: Name of the workflow.
133
137
  :param folder_uuid: UUID of the folder to store the workflow in.
134
138
  :param folder: Folder object to store the workflow in.
@@ -144,12 +148,16 @@ def submit_strain_workflow(
144
148
  folder_uuid = folder.uuid
145
149
  initial_molecule = molecule_to_dict(initial_molecule)
146
150
 
147
- workflow = stjames.StrainWorkflow(
148
- initial_molecule=initial_molecule,
149
- harmonic_constraint_spring_constant=harmonic_constraint_spring_constant,
150
- constrain_hydrogens=constrain_hydrogens,
151
- conf_gen_settings=conf_gen_settings or stjames.ETKDGSettings(max_confs=50),
152
- )
151
+ workflow_kwargs: dict[str, Any] = {
152
+ "initial_molecule": initial_molecule,
153
+ "harmonic_constraint_spring_constant": harmonic_constraint_spring_constant,
154
+ "constrain_hydrogens": constrain_hydrogens,
155
+ "conf_gen_settings": conf_gen_settings or stjames.ETKDGSettings(max_confs=200),
156
+ }
157
+ if multistage_opt_settings is not None:
158
+ workflow_kwargs["multistage_opt_settings"] = multistage_opt_settings
159
+
160
+ workflow = stjames.StrainWorkflow(**workflow_kwargs)
153
161
 
154
162
  data = {
155
163
  "workflow_type": "strain",
@@ -1,6 +1,7 @@
1
1
  """Tautomer-search workflow - find tautomeric forms of molecules."""
2
2
 
3
3
  from dataclasses import dataclass
4
+ from typing import Any
4
5
 
5
6
  import stjames
6
7
 
@@ -105,6 +106,8 @@ class TautomerResult(WorkflowResult):
105
106
  def submit_tautomer_search_workflow(
106
107
  initial_molecule: MoleculeInput,
107
108
  mode: Mode = Mode.CAREFUL,
109
+ conf_gen_settings: stjames.ConformerGenSettingsUnion | None = None,
110
+ multistage_opt_settings: stjames.MultiStageOptSettings | None = None,
108
111
  name: str = "Tautomer Search Workflow",
109
112
  folder_uuid: str | None = None,
110
113
  folder: Folder | None = None,
@@ -116,7 +119,11 @@ def submit_tautomer_search_workflow(
116
119
  Submits a tautomer-search workflow to the API.
117
120
 
118
121
  :param initial_molecule: Molecule to find tautomers for.
119
- :param mode: Mode to run the calculation in (reckless, rapid, careful).
122
+ :param mode: *Deprecated.*
123
+ :param conf_gen_settings: Conformer generation settings. Defaults to ETKDG with
124
+ 250 initial conformers, 20 max conformers, and 15 kcal/mol MMFF energy cutoff.
125
+ :param multistage_opt_settings: Optimization settings for tautomer ranking.
126
+ Defaults to AIMNet2/wB97M-D3 optimization with CPCMx singlepoint.
120
127
  :param name: Name of the workflow.
121
128
  :param folder_uuid: UUID of the folder to place the workflow in.
122
129
  :param folder: Folder object to store the workflow in.
@@ -132,14 +139,17 @@ def submit_tautomer_search_workflow(
132
139
  folder_uuid = folder.uuid
133
140
  initial_molecule = molecule_to_dict(initial_molecule)
134
141
 
135
- workflow = stjames.TautomerWorkflow(
136
- initial_molecule=initial_molecule,
137
- mode=mode,
138
- )
142
+ workflow_kwargs: dict[str, Any] = {"initial_molecule": initial_molecule, "mode": mode}
143
+ if conf_gen_settings is not None:
144
+ workflow_kwargs["conf_gen_settings"] = conf_gen_settings
145
+ if multistage_opt_settings is not None:
146
+ workflow_kwargs["multistage_opt_settings"] = multistage_opt_settings
147
+
148
+ workflow = stjames.TautomerWorkflow(**workflow_kwargs)
139
149
 
140
150
  data = {
141
151
  "workflow_type": "tautomers",
142
- "workflow_data": workflow.model_dump(mode="json"),
152
+ "workflow_data": workflow.model_dump(serialize_as_any=True, mode="json"),
143
153
  "initial_molecule": initial_molecule,
144
154
  "name": name,
145
155
  "folder_uuid": folder_uuid,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rowan-python
3
- Version: 3.0.4
3
+ Version: 3.0.5
4
4
  Summary: Rowan Python Library
5
5
  Project-URL: Homepage, https://github.com/rowansci/rowan-client
6
6
  Project-URL: Bug Tracker, https://github.com/rowansci/rowan-client/issues
@@ -1,9 +1,9 @@
1
- rowan/__init__.py,sha256=HicTprRVZq9Ah2SB-_hLdJ-NBXrCq_AqKWn5rDSPwfc,640
1
+ rowan/__init__.py,sha256=HvGc27Y6l1_E_mcvabDhmDOOtMrJ6ME7Cx8LfVKqyVs,835
2
2
  rowan/calculation.py,sha256=lZZ52DxPsuJWCTzFZXjhauHK6dV0KCUwzoxtmoxSY48,3442
3
3
  rowan/config.py,sha256=3cVKHUNzkIPnN2bvx7l5sia7Zc5poXS8lKOJlowXyLA,21088
4
4
  rowan/constants.py,sha256=emCH4m9OL2Hm5E-6mJGM_FgzrK_JrZT-FiKJ6pMNQ4Y,84
5
5
  rowan/folder.py,sha256=NkimVeHho9nwRXeS87U1tivEVL-1gL2Vqfz1fJ6XpNQ,9222
6
- rowan/molecule.py,sha256=3jXyE94wH_TPZ8ld-OLa6Q09ij1BV-clBWUqPS_GR7Y,9119
6
+ rowan/molecule.py,sha256=MppZLHUAHzLCaIZtAbr2tpEULt5yRUR1B5npgFISCbE,10030
7
7
  rowan/project.py,sha256=Wy3VvhwIMIumAZD2s7hPk8jj4bAPHMDNvsqU23RRqFo,4598
8
8
  rowan/protein.py,sha256=Ma2tBFF52Rb-ME5vZy5M5juMlmphQVQRL0Q1EBvBeZg,14761
9
9
  rowan/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -14,9 +14,9 @@ rowan/rowan_rdkit/__init__.py,sha256=EATX2VRzywzKxqkpCUMTf7RNQLkWsfi5VcCNDW6EIiw
14
14
  rowan/rowan_rdkit/chem_utils.py,sha256=ZWdLziT59Qr5JzjvV789CAyRq0m5JIawsOP4RxUbQQA,35529
15
15
  rowan/workflows/__init__.py,sha256=o2fN6V10mWt82QPr1UlbkyHzc2vtoIbkoiFZF2PgYow,4257
16
16
  rowan/workflows/admet.py,sha256=0_wIwXXLfHF-3kgGx_1EM1ljjaYHLeEijJ-GbMYxpL8,2904
17
- rowan/workflows/analogue_docking.py,sha256=PIvNtVq1C65GpBORMJW4D4KJUxGo6RfZWCfUqkM1zVI,8626
17
+ rowan/workflows/analogue_docking.py,sha256=LJpbbaug0tZ9Cg-m0b7EgGH5hJ5894fHOC16Wefx7mE,9206
18
18
  rowan/workflows/base.py,sha256=eLGyzTc9NpXBGC-FRjsaUwKP6RluWrz0ipDZ4jDY_jc,30103
19
- rowan/workflows/basic_calculation.py,sha256=VnOQjnuZE8j-rYbMB66p74d7M-8Eap0xAMzK68ZqJ24,9847
19
+ rowan/workflows/basic_calculation.py,sha256=FKYczKpYaGE-koaHKi2VARmV9Nhqr0lTOx0Jv1RzC7k,10835
20
20
  rowan/workflows/batch_docking.py,sha256=u_4hH7OeWkIbXqEm4uWTc3p0u9mpnR8EWqWCw7sVya4,3581
21
21
  rowan/workflows/bde.py,sha256=cM8UNBYycwLE5yJeh8DEtX6mW6hghsM6XKEFkbd7Q8g,5551
22
22
  rowan/workflows/conformer_search.py,sha256=_uCfGFsUTDyxDc55XTsvMSjs800LyfzBRa4_-9Pjp4g,7690
@@ -35,7 +35,7 @@ rowan/workflows/membrane_permeability.py,sha256=oIDmB8qF_K_Kesv7o_FiljAk4dpptEeO
35
35
  rowan/workflows/msa.py,sha256=V3B1SyWPR8MT306hh9W-T9JTpi_E-XgAIeF9yRQZ7tI,5075
36
36
  rowan/workflows/multistage_optimization.py,sha256=HFVx8mnHxG97pDYyL6eOhNGmESqTxaKNgUdwrFpFUJ0,6456
37
37
  rowan/workflows/nmr.py,sha256=hergJdsiawKj7iV-jHxDOS03n_EnZcaCIt_ZTl34-JY,5183
38
- rowan/workflows/pka.py,sha256=tTZnXaZwGOsgF0Vln4NcHGEAXMvf1afY7Ll7Wa8uHHw,7481
38
+ rowan/workflows/pka.py,sha256=YAnFq1zyJO3j9rfYCYyrl-C_o8uaFTpCqoldqiP7o1k,8349
39
39
  rowan/workflows/pose_analysis_md.py,sha256=UvotLhWv0_VAkKteZboOutDry7l-Zt1K6_SBx3EXqgM,9530
40
40
  rowan/workflows/protein_binder_design.py,sha256=J-9NSbRLdHb6JQRhY_vq43HlHCDCiQqrkOZUCAF-2dk,8604
41
41
  rowan/workflows/protein_cofolding.py,sha256=1R29XjAVjWHyelGG-mylP2GIamZbLCQKaaaFsCAnYgI,13012
@@ -47,9 +47,9 @@ rowan/workflows/scan.py,sha256=KQm58utOxs6qIpX1Jv3usoUpkVHeLw4mKCs8RTUkRhk,5696
47
47
  rowan/workflows/solubility.py,sha256=9-zHEHkf4AgGNDCE3x1S-6wTgwxVm4ihRmh0kwLvPFs,8594
48
48
  rowan/workflows/solvent_dependent_conformers.py,sha256=ovvnhCE4xlkpdhccLHEq7oBJRI2-rHmZ-7_ewGECerM,7020
49
49
  rowan/workflows/spin_states.py,sha256=GZgBJPO6_ds9el4b7wbigIZ5213Z9DwXhokczJ5NDhs,7122
50
- rowan/workflows/strain.py,sha256=nR3n0Nl7HT7s5fRzIC9aViYN41KoYdteEs6fPgyvu0M,5893
51
- rowan/workflows/tautomer_search.py,sha256=eJMfmR30rywf0-4K-jnv_iqXxObEuX4zHnqoD4l3JRg,5082
52
- rowan_python-3.0.4.dist-info/METADATA,sha256=gTSPasVmSPuwqhEpHIYBQAgfse9dZnObJUOtwYGP5-I,1600
53
- rowan_python-3.0.4.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
54
- rowan_python-3.0.4.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
55
- rowan_python-3.0.4.dist-info/RECORD,,
50
+ rowan/workflows/strain.py,sha256=r0tlZoUlAslAiF7dPTpa9WlQFUAKyVjZ19zASjSS8Hs,6339
51
+ rowan/workflows/tautomer_search.py,sha256=aqwXoj0ffWsb5gbvzfz_bpx5ifIfR_K07fbdWhU62Ko,5820
52
+ rowan_python-3.0.5.dist-info/METADATA,sha256=0wZHFNgNRDm1DwrdDVJJh1Xu05Xm8A31whsYlwCSVWM,1600
53
+ rowan_python-3.0.5.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
54
+ rowan_python-3.0.5.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
55
+ rowan_python-3.0.5.dist-info/RECORD,,