rowan-python 3.0.8__py3-none-any.whl → 3.0.10__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
@@ -12,6 +12,7 @@ from stjames import (
12
12
  Method,
13
13
  Mode,
14
14
  MultiStageOptSettings,
15
+ OpenConfSettings,
15
16
  OptimizationSettings,
16
17
  PBCDFTSettings,
17
18
  PeriodicCell,
rowan/workflows/base.py CHANGED
@@ -25,6 +25,12 @@ logger.setLevel(logging.INFO)
25
25
  Mode = stjames.Mode
26
26
  Solvent = stjames.Solvent
27
27
  MessageType = stjames.MessageType
28
+ Method = stjames.Method
29
+ Task = stjames.Task
30
+ Settings = stjames.Settings
31
+ MultiStageOptSettings = stjames.MultiStageOptSettings
32
+ ETKDGSettings = stjames.ETKDGSettings
33
+ ConformerGenSettings = stjames.conformers.ConformerGenSettings
28
34
 
29
35
 
30
36
  @dataclass(frozen=True, slots=True)
rowan/workflows/bde.py CHANGED
@@ -90,12 +90,14 @@ def submit_bde_workflow(
90
90
  folder_uuid = folder.uuid
91
91
  initial_molecule = molecule_to_dict(initial_molecule)
92
92
 
93
- workflow = stjames.BDEWorkflow(
94
- initial_molecule=initial_molecule,
95
- mode=mode,
96
- atoms=atoms or [],
97
- all_CH=all_CH,
98
- all_CX=all_CX,
93
+ workflow = stjames.BDEWorkflow.model_validate(
94
+ {
95
+ "initial_molecule": initial_molecule,
96
+ "mode": mode,
97
+ "atoms": atoms or [],
98
+ "all_CH": all_CH,
99
+ "all_CX": all_CX,
100
+ }
99
101
  )
100
102
 
101
103
  data = {
@@ -8,6 +8,13 @@ from ..molecule import Molecule
8
8
  from ..types import MoleculeInput, SolventInput
9
9
  from ..utils import api_client
10
10
  from .base import (
11
+ ConformerGenSettings,
12
+ ETKDGSettings,
13
+ Method,
14
+ Mode,
15
+ MultiStageOptSettings,
16
+ Settings,
17
+ Task,
11
18
  Workflow,
12
19
  WorkflowResult,
13
20
  molecule_to_dict,
@@ -114,12 +121,68 @@ class ConformerSearchResult(WorkflowResult):
114
121
  return self._cache[cache_key]
115
122
 
116
123
 
124
+ _FINAL_METHOD_TO_MSO_RECIPE: dict[Method, tuple[Method, Method | None]] = {
125
+ Method.AIMNET2_WB97MD3: (Method.AIMNET2_WB97MD3, None),
126
+ Method.OMOL25_CONSERVING_S: (Method.OMOL25_CONSERVING_S, None),
127
+ Method.GFN2_XTB: (Method.GFN2_XTB, None),
128
+ Method.G_XTB: (Method.GFN2_XTB, Method.G_XTB),
129
+ Method.R2SCAN3C: (Method.GFN2_XTB, Method.R2SCAN3C),
130
+ }
131
+
132
+
133
+ def _mso_for_final_method(
134
+ final_method: Method,
135
+ solvent: SolventInput = None,
136
+ transition_state: bool = False,
137
+ ) -> MultiStageOptSettings:
138
+ """Build a `MultiStageOptSettings` for `final_method` matching tinbergen's
139
+ conformer-search MSO presets. Falls back to a single opt stage at
140
+ `final_method` for methods without a named preset.
141
+
142
+ `solvent` and `transition_state` are merged into each stage's `Settings`
143
+ when supplied; the named preset itself is independent of them (mirrors how
144
+ tinbergen's form keeps the preset dropdown separate from the solvent / TS
145
+ toggles).
146
+ """
147
+ opt_method, sp_method = _FINAL_METHOD_TO_MSO_RECIPE.get(final_method, (final_method, None))
148
+
149
+ def _solvent_settings_for(method: Method) -> dict | None:
150
+ if not solvent:
151
+ return None
152
+ return {
153
+ "solvent": solvent,
154
+ "model": "alpb" if method in stjames.XTB_METHODS else "cpcm",
155
+ }
156
+
157
+ opt_stage = Settings(
158
+ method=opt_method,
159
+ tasks=[Task.OPTIMIZE],
160
+ mode=Mode.AUTO,
161
+ solvent_settings=_solvent_settings_for(opt_method),
162
+ opt_settings={"transition_state": transition_state, "constraints": []},
163
+ )
164
+ sp_stage: Settings | None = None
165
+ if sp_method is not None:
166
+ sp_stage = Settings(
167
+ method=sp_method,
168
+ tasks=[Task.ENERGY],
169
+ mode=Mode.AUTO,
170
+ solvent_settings=_solvent_settings_for(sp_method),
171
+ )
172
+
173
+ return MultiStageOptSettings(
174
+ optimization_settings=[opt_stage],
175
+ singlepoint_settings=sp_stage,
176
+ )
177
+
178
+
117
179
  def submit_conformer_search_workflow(
118
180
  initial_molecule: MoleculeInput,
119
- conf_gen_settings: stjames.ConformerGenSettings | None = None,
120
- final_method: stjames.Method | str = "aimnet2_wb97md3",
181
+ conf_gen_settings: ConformerGenSettings | None = None,
182
+ final_method: Method | str = "aimnet2_wb97md3",
121
183
  solvent: SolventInput = None,
122
184
  transition_state: bool = False,
185
+ multistage_opt_settings: MultiStageOptSettings | None = None,
123
186
  name: str = "Conformer Search Workflow",
124
187
  folder_uuid: str | None = None,
125
188
  folder: Folder | None = None,
@@ -138,9 +201,16 @@ def submit_conformer_search_workflow(
138
201
  - ``LyrebirdSettings`` -- Rowan ML model
139
202
  - ``iMTDGCSettings`` -- CREST iMTD-GC metadynamics, more thorough
140
203
  - ``MonteCarloMultipleMinimumSettings`` -- MCMM conformer search
141
- :param final_method: Method to use for the final optimization.
142
- :param solvent: Solvent to use for the final optimization.
143
- :param transition_state: Whether to optimize the transition state.
204
+ :param final_method: Method to use for the final optimization. Ignored if
205
+ `multistage_opt_settings` is provided.
206
+ :param solvent: Solvent to use for the final optimization. Ignored if
207
+ `multistage_opt_settings` is provided.
208
+ :param transition_state: Whether to optimize the transition state. Ignored
209
+ if `multistage_opt_settings` is provided.
210
+ :param multistage_opt_settings: Optimization stages and singlepoint settings
211
+ for ranking conformers. When provided, takes precedence over
212
+ `final_method` / `solvent` / `transition_state`. When omitted, an MSO is
213
+ built from those three params.
144
214
  :param name: Name of the workflow.
145
215
  :param folder_uuid: UUID of the folder to place the workflow in.
146
216
  :param folder: Folder object to store the workflow in.
@@ -155,34 +225,20 @@ def submit_conformer_search_workflow(
155
225
  if folder:
156
226
  folder_uuid = folder.uuid
157
227
  if conf_gen_settings is None:
158
- conf_gen_settings = stjames.ETKDGSettings()
228
+ conf_gen_settings = ETKDGSettings()
159
229
 
160
230
  mol_dict = molecule_to_dict(initial_molecule)
161
231
 
162
- if isinstance(final_method, str):
163
- final_method = stjames.Method(final_method)
164
-
165
- solvent_model = None
166
- if solvent:
167
- solvent_model = "alpb" if final_method in stjames.XTB_METHODS else "cpcm"
168
-
169
- opt_settings = stjames.Settings(
170
- method=final_method,
171
- tasks=["optimize"],
172
- mode=stjames.Mode.AUTO,
173
- solvent_settings={"solvent": solvent, "model": solvent_model} if solvent else None,
174
- opt_settings={"transition_state": transition_state, "constraints": []},
175
- )
176
-
177
- msos = stjames.MultiStageOptSettings(
178
- mode=stjames.Mode.MANUAL,
179
- xtb_preopt=True,
180
- optimization_settings=[opt_settings],
181
- )
232
+ if multistage_opt_settings is None:
233
+ if isinstance(final_method, str):
234
+ final_method = Method(final_method)
235
+ multistage_opt_settings = _mso_for_final_method(
236
+ final_method, solvent=solvent, transition_state=transition_state
237
+ )
182
238
 
183
239
  workflow = stjames.ConformerSearchWorkflow(
184
240
  initial_molecule=mol_dict,
185
- multistage_opt_settings=msos,
241
+ multistage_opt_settings=multistage_opt_settings,
186
242
  conf_gen_settings=conf_gen_settings,
187
243
  solvent=solvent,
188
244
  transition_state=transition_state,
@@ -1,14 +1,18 @@
1
1
  """Multistage optimization workflow - optimize molecules with staged methods."""
2
2
 
3
+ from typing import Sequence
4
+
3
5
  import stjames
4
6
 
5
7
  from ..calculation import Calculation, retrieve_calculation
6
8
  from ..folder import Folder
7
9
  from ..molecule import Molecule
8
- from ..types import MoleculeInput, SolventInput
10
+ from ..types import MoleculeInput
9
11
  from ..utils import api_client
10
12
  from .base import (
11
- Mode,
13
+ Method,
14
+ Settings,
15
+ Task,
12
16
  Workflow,
13
17
  WorkflowResult,
14
18
  molecule_to_dict,
@@ -116,10 +120,8 @@ class MultiStageOptResult(WorkflowResult):
116
120
 
117
121
  def submit_multistage_optimization_workflow(
118
122
  initial_molecule: MoleculeInput,
119
- mode: Mode = Mode.RAPID,
120
- solvent: SolventInput = None,
121
- xtb_preopt: bool = True,
122
- transition_state: bool = False,
123
+ optimization_settings: Sequence[Settings] | None = None,
124
+ singlepoint_settings: Settings | None = None,
123
125
  frequencies: bool = False,
124
126
  name: str = "Multistage Optimization Workflow",
125
127
  folder_uuid: str | None = None,
@@ -131,12 +133,13 @@ def submit_multistage_optimization_workflow(
131
133
  """
132
134
  Submits a multistage-optimization workflow to the API.
133
135
 
136
+ Defaults to a 3-stage `r2scan_3c//gfn2_xtb//gfn_ff` stack.
137
+
134
138
  :param initial_molecule: Molecule to optimize.
135
- :param mode: Mode to run the calculation in.
136
- :param solvent: Solvent for the final single-point calculation.
137
- :param xtb_preopt: Whether to pre-optimize with xTB.
138
- :param transition_state: Whether this is a transition state optimization.
139
- :param frequencies: Whether to calculate frequencies.
139
+ :param optimization_settings: Optimization stages to apply in order.
140
+ :param singlepoint_settings: Final singlepoint settings, applied after the
141
+ last optimization stage.
142
+ :param frequencies: Whether to calculate frequencies on the last optimization step.
140
143
  :param name: Name of the workflow.
141
144
  :param folder_uuid: UUID of the folder to place the workflow in.
142
145
  :param folder: Folder object to store the workflow in.
@@ -152,12 +155,18 @@ def submit_multistage_optimization_workflow(
152
155
  folder_uuid = folder.uuid
153
156
  mol_dict = molecule_to_dict(initial_molecule)
154
157
 
158
+ if optimization_settings is None:
159
+ optimization_settings = [
160
+ Settings(method=Method.GFN_FF, tasks=[Task.OPTIMIZE]),
161
+ Settings(method=Method.GFN2_XTB, tasks=[Task.OPTIMIZE]),
162
+ ]
163
+ if singlepoint_settings is None:
164
+ singlepoint_settings = Settings(method=Method.R2SCAN3C, tasks=[Task.ENERGY])
165
+
155
166
  workflow = stjames.MultiStageOptWorkflow(
156
167
  initial_molecule=mol_dict,
157
- mode=mode,
158
- solvent=solvent,
159
- xtb_preopt=xtb_preopt,
160
- transition_state=transition_state,
168
+ optimization_settings=optimization_settings or (),
169
+ singlepoint_settings=singlepoint_settings,
161
170
  frequencies=frequencies,
162
171
  )
163
172
 
@@ -101,7 +101,8 @@ class ProteinBinderDesignResult(WorkflowResult):
101
101
  """Generated protein binder designs, sorted by quality score."""
102
102
  binders: list[ProteinBinder] = []
103
103
  for b in self._workflow.generated_binders:
104
- scores_dict = getattr(b, "scores", None) or {}
104
+ raw_scores = getattr(b, "scores", None)
105
+ scores_dict = raw_scores.model_dump() if raw_scores is not None else {}
105
106
  scores = BinderScores(
106
107
  iptm=scores_dict.get("iptm"),
107
108
  design_ptm=scores_dict.get("design_ptm"),
@@ -122,11 +122,13 @@ def submit_redox_potential_workflow(
122
122
  folder_uuid = folder.uuid
123
123
  initial_molecule = molecule_to_dict(initial_molecule)
124
124
 
125
- workflow = stjames.RedoxPotentialWorkflow(
126
- initial_molecule=initial_molecule,
127
- oxidation=oxidation,
128
- reduction=reduction,
129
- mode=mode,
125
+ workflow = stjames.RedoxPotentialWorkflow.model_validate(
126
+ {
127
+ "initial_molecule": initial_molecule,
128
+ "oxidation": oxidation,
129
+ "reduction": reduction,
130
+ "mode": mode,
131
+ }
130
132
  )
131
133
 
132
134
  data = {
@@ -7,11 +7,14 @@ import stjames
7
7
 
8
8
  from ..calculation import Calculation, retrieve_calculation
9
9
  from ..folder import Folder
10
- from ..types import MoleculeInput, SolventInput
10
+ from ..types import MoleculeInput
11
11
  from ..utils import api_client
12
12
  from .base import (
13
13
  Message,
14
- Mode,
14
+ Method,
15
+ MultiStageOptSettings,
16
+ Settings,
17
+ Task,
15
18
  Workflow,
16
19
  WorkflowResult,
17
20
  molecule_to_dict,
@@ -129,10 +132,7 @@ class SpinStatesResult(WorkflowResult):
129
132
  def submit_spin_states_workflow(
130
133
  initial_molecule: MoleculeInput,
131
134
  states: list[int],
132
- mode: Mode = Mode.RAPID,
133
- solvent: SolventInput = None,
134
- xtb_preopt: bool = True,
135
- frequencies: bool = False,
135
+ multistage_opt_settings: MultiStageOptSettings | None = None,
136
136
  name: str = "Spin States Workflow",
137
137
  folder_uuid: str | None = None,
138
138
  folder: Folder | None = None,
@@ -143,13 +143,14 @@ def submit_spin_states_workflow(
143
143
  """
144
144
  Submits a spin-states workflow to the API.
145
145
 
146
+ Defaults to a `r2scan_3c//gfn2_xtb` stack. Pass an explicit
147
+ `MultiStageOptSettings(...)` to override.
148
+
146
149
  :param initial_molecule: Molecule to calculate spin states for.
147
150
  :param states: List of multiplicities to calculate
148
151
  (e.g., [1, 3, 5] for singlet, triplet, quintet).
149
- :param mode: Mode to run the calculation in.
150
- :param solvent: Solvent to use for the calculation.
151
- :param xtb_preopt: Whether to pre-optimize with xTB.
152
- :param frequencies: Whether to calculate frequencies.
152
+ :param multistage_opt_settings: Optimization stages and singlepoint settings
153
+ describing the method stack.
153
154
  :param name: Name of the workflow.
154
155
  :param folder_uuid: UUID of the folder to place the workflow in.
155
156
  :param folder: Folder object to store the workflow in.
@@ -170,13 +171,18 @@ def submit_spin_states_workflow(
170
171
  for mult in states:
171
172
  _validate_multiplicity(mol_dict, mult)
172
173
 
174
+ if multistage_opt_settings is None:
175
+ multistage_opt_settings = MultiStageOptSettings(
176
+ optimization_settings=[
177
+ Settings(method=Method.GFN2_XTB, tasks=[Task.OPTIMIZE]),
178
+ ],
179
+ singlepoint_settings=Settings(method=Method.R2SCAN3C, tasks=[Task.ENERGY]),
180
+ )
181
+
173
182
  workflow = stjames.SpinStatesWorkflow(
174
183
  initial_molecule=mol_dict,
175
184
  states=states,
176
- mode=mode,
177
- solvent=solvent,
178
- xtb_preopt=xtb_preopt,
179
- frequencies=frequencies,
185
+ multistage_opt_settings=multistage_opt_settings,
180
186
  )
181
187
 
182
188
  data = {
rowan/workflows/strain.py CHANGED
@@ -129,10 +129,11 @@ def submit_strain_workflow(
129
129
  :param harmonic_constraint_spring_constant: Spring constant for harmonic
130
130
  constraints (kcal/mol/A). Default 5.0.
131
131
  :param constrain_hydrogens: Whether to constrain hydrogen positions. Default False.
132
- :param conf_gen_settings: Conformer generation settings. Defaults to ETKDG with
133
- max 200 conformers.
132
+ :param conf_gen_settings: Conformer generation settings. Defaults to
133
+ OpenConf with max 200 conformers.
134
134
  :param multistage_opt_settings: Optimization settings for conformer ranking.
135
- Defaults to AIMNet2/wB97M-D3 optimization with CPCMx singlepoint.
135
+ Defaults to GFN2-xTB optimization in water (ALPB) with a g-xTB singlepoint
136
+ in water (CPCMx).
136
137
  :param name: Name of the workflow.
137
138
  :param folder_uuid: UUID of the folder to store the workflow in.
138
139
  :param folder: Folder object to store the workflow in.
@@ -152,7 +153,7 @@ def submit_strain_workflow(
152
153
  "initial_molecule": initial_molecule,
153
154
  "harmonic_constraint_spring_constant": harmonic_constraint_spring_constant,
154
155
  "constrain_hydrogens": constrain_hydrogens,
155
- "conf_gen_settings": conf_gen_settings or stjames.ETKDGSettings(max_confs=200),
156
+ "conf_gen_settings": conf_gen_settings or stjames.OpenConfSettings(max_confs=200),
156
157
  }
157
158
  if multistage_opt_settings is not None:
158
159
  workflow_kwargs["multistage_opt_settings"] = multistage_opt_settings
@@ -11,7 +11,6 @@ from ..molecule import Molecule
11
11
  from ..utils import api_client
12
12
  from .base import (
13
13
  Message,
14
- Mode,
15
14
  MoleculeInput,
16
15
  Workflow,
17
16
  WorkflowResult,
@@ -105,7 +104,6 @@ class TautomerResult(WorkflowResult):
105
104
 
106
105
  def submit_tautomer_search_workflow(
107
106
  initial_molecule: MoleculeInput,
108
- mode: Mode = Mode.CAREFUL,
109
107
  conf_gen_settings: stjames.ConformerGenSettingsUnion | None = None,
110
108
  multistage_opt_settings: stjames.MultiStageOptSettings | None = None,
111
109
  name: str = "Tautomer Search Workflow",
@@ -119,11 +117,11 @@ def submit_tautomer_search_workflow(
119
117
  Submits a tautomer-search workflow to the API.
120
118
 
121
119
  :param initial_molecule: Molecule to find tautomers for.
122
- :param mode: *Deprecated.*
123
120
  :param conf_gen_settings: Conformer generation settings. Defaults to ETKDG with
124
121
  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.
122
+ :param multistage_opt_settings: Optimization stages and singlepoint settings
123
+ describing the method stack. Defaults to AIMNet2/wB97M-D3 optimization with
124
+ CPCMx(water) singlepoint.
127
125
  :param name: Name of the workflow.
128
126
  :param folder_uuid: UUID of the folder to place the workflow in.
129
127
  :param folder: Folder object to store the workflow in.
@@ -139,7 +137,7 @@ def submit_tautomer_search_workflow(
139
137
  folder_uuid = folder.uuid
140
138
  initial_molecule = molecule_to_dict(initial_molecule)
141
139
 
142
- workflow_kwargs: dict[str, Any] = {"initial_molecule": initial_molecule, "mode": mode}
140
+ workflow_kwargs: dict[str, Any] = {"initial_molecule": initial_molecule}
143
141
  if conf_gen_settings is not None:
144
142
  workflow_kwargs["conf_gen_settings"] = conf_gen_settings
145
143
  if multistage_opt_settings is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rowan-python
3
- Version: 3.0.8
3
+ Version: 3.0.10
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
@@ -11,7 +11,7 @@ Requires-Dist: httpx
11
11
  Requires-Dist: nest-asyncio
12
12
  Requires-Dist: rdkit
13
13
  Requires-Dist: setuptools
14
- Requires-Dist: stjames<=0.0.182
14
+ Requires-Dist: stjames>=0.0.183
15
15
  Description-Content-Type: text/markdown
16
16
 
17
17
  # Rowan Python Library
@@ -1,4 +1,4 @@
1
- rowan/__init__.py,sha256=wiEroKH5I6VQ-tiseUcrNGJaS_0soFnYMX0EtpwyLIs,859
1
+ rowan/__init__.py,sha256=TiZEbNQ3amq8QDhBS6JHsQjb19ueHkpy-AgNETZEQxI,881
2
2
  rowan/api_keys.py,sha256=TvG5l5MmQ3Qt8Z3Y7jCA_lcrwEHuI7xHy-KLbIdQ8_A,4793
3
3
  rowan/calculation.py,sha256=lZZ52DxPsuJWCTzFZXjhauHK6dV0KCUwzoxtmoxSY48,3442
4
4
  rowan/config.py,sha256=3cVKHUNzkIPnN2bvx7l5sia7Zc5poXS8lKOJlowXyLA,21088
@@ -16,11 +16,11 @@ rowan/rowan_rdkit/chem_utils.py,sha256=ZWdLziT59Qr5JzjvV789CAyRq0m5JIawsOP4RxUbQ
16
16
  rowan/workflows/__init__.py,sha256=CM3GKDTafp6vl79dWqSOvkVfwH1Ty8zuc8yzi65ABxM,4438
17
17
  rowan/workflows/admet.py,sha256=0_wIwXXLfHF-3kgGx_1EM1ljjaYHLeEijJ-GbMYxpL8,2904
18
18
  rowan/workflows/analogue_docking.py,sha256=LJpbbaug0tZ9Cg-m0b7EgGH5hJ5894fHOC16Wefx7mE,9206
19
- rowan/workflows/base.py,sha256=eLGyzTc9NpXBGC-FRjsaUwKP6RluWrz0ipDZ4jDY_jc,30103
19
+ rowan/workflows/base.py,sha256=AyV4ZBta4vz0eiOCi9mcDPTbh-30x-11lfKKwcRJdQw,30330
20
20
  rowan/workflows/basic_calculation.py,sha256=FKYczKpYaGE-koaHKi2VARmV9Nhqr0lTOx0Jv1RzC7k,10835
21
21
  rowan/workflows/batch_docking.py,sha256=u_4hH7OeWkIbXqEm4uWTc3p0u9mpnR8EWqWCw7sVya4,3581
22
- rowan/workflows/bde.py,sha256=cM8UNBYycwLE5yJeh8DEtX6mW6hghsM6XKEFkbd7Q8g,5551
23
- rowan/workflows/conformer_search.py,sha256=_uCfGFsUTDyxDc55XTsvMSjs800LyfzBRa4_-9Pjp4g,7690
22
+ rowan/workflows/bde.py,sha256=JJUx2wFJ8yZu0sqIn7Jkm6B6O84WrrpAstCck8c7FLI,5621
23
+ rowan/workflows/conformer_search.py,sha256=rzarx3PKRM2rf9x1F17Jg8ZCed7_3-yEBan4g0b2HK4,9868
24
24
  rowan/workflows/constants.py,sha256=el8jWE9gnGTLNWn5_n_V0H362vIRneOqgy7BOQ8CScg,575
25
25
  rowan/workflows/descriptors.py,sha256=rGrNca6kA4SzX5BAOjP6rE91MOLTvCWSYKF_LW2Z0y4,2963
26
26
  rowan/workflows/docking.py,sha256=wmE7QJu1uDHBDynTT1XesXXAZtpB6xLjZUKsHOQyCcU,7386
@@ -34,24 +34,24 @@ rowan/workflows/irc.py,sha256=BH6s0rJEQ3G5yN5mOOSGfiZCf-i6YZNUgtK2-m-gmdo,7491
34
34
  rowan/workflows/macropka.py,sha256=YkXoPiyou6nAoBheES0endsqNdi_kclwlIscTljNuKI,5723
35
35
  rowan/workflows/membrane_permeability.py,sha256=oIDmB8qF_K_Kesv7o_FiljAk4dpptEeOjoxtMvl1gSw,4612
36
36
  rowan/workflows/msa.py,sha256=V3B1SyWPR8MT306hh9W-T9JTpi_E-XgAIeF9yRQZ7tI,5075
37
- rowan/workflows/multistage_optimization.py,sha256=HFVx8mnHxG97pDYyL6eOhNGmESqTxaKNgUdwrFpFUJ0,6456
37
+ rowan/workflows/multistage_optimization.py,sha256=9PbLHOXtM2TLCVl_ZY7JH6QCUudHWTn4R14_KsZF-v8,6840
38
38
  rowan/workflows/nmr.py,sha256=hergJdsiawKj7iV-jHxDOS03n_EnZcaCIt_ZTl34-JY,5183
39
39
  rowan/workflows/pka.py,sha256=TCFSE5HI5JLPslKdbUvJe4IxrVaLExrI_3PnDfXtxTw,8691
40
40
  rowan/workflows/pocket_detection.py,sha256=aGHY0puxekp4c4nsNYHcvKCe1fsetygL04BcSvNFvE8,3864
41
41
  rowan/workflows/pose_analysis_md.py,sha256=UvotLhWv0_VAkKteZboOutDry7l-Zt1K6_SBx3EXqgM,9530
42
- rowan/workflows/protein_binder_design.py,sha256=J-9NSbRLdHb6JQRhY_vq43HlHCDCiQqrkOZUCAF-2dk,8604
42
+ rowan/workflows/protein_binder_design.py,sha256=OW4GG1cBWzPhM-2MomSsV99ZzMiivMGZdxim9SmFPw4,8681
43
43
  rowan/workflows/protein_cofolding.py,sha256=D2PVwL51H3traml1JDG-9jU3R0E29AdfR9Bk0tLX1Zw,14093
44
44
  rowan/workflows/protein_md.py,sha256=_n0IdmTQsunbP1geF-wUjXNMKNYV-ngmAPEMJlj0dkI,7021
45
45
  rowan/workflows/rbfe_graph.py,sha256=PLqzBRkxD7tPdBViYJZjgaCP8aA2UXKc9dD4odx5XUo,5788
46
- rowan/workflows/redox_potential.py,sha256=lg2Djev58oOmBmI4l3eIaGKafkNXMhwo17K2G7kQvjY,5319
46
+ rowan/workflows/redox_potential.py,sha256=SBV1n6RXh4_vVVaEFpJx3iru_3UAOwDNgqOi8K6eHkU,5382
47
47
  rowan/workflows/relative_binding_free_energy_perturbation.py,sha256=uxC3Rr63U6GjNa9u2Hurahu48l4rYEz5RQX4hV0D250,13456
48
48
  rowan/workflows/scan.py,sha256=KQm58utOxs6qIpX1Jv3usoUpkVHeLw4mKCs8RTUkRhk,5696
49
49
  rowan/workflows/solubility.py,sha256=9-zHEHkf4AgGNDCE3x1S-6wTgwxVm4ihRmh0kwLvPFs,8594
50
50
  rowan/workflows/solvent_dependent_conformers.py,sha256=ovvnhCE4xlkpdhccLHEq7oBJRI2-rHmZ-7_ewGECerM,7020
51
- rowan/workflows/spin_states.py,sha256=GZgBJPO6_ds9el4b7wbigIZ5213Z9DwXhokczJ5NDhs,7122
52
- rowan/workflows/strain.py,sha256=r0tlZoUlAslAiF7dPTpa9WlQFUAKyVjZ19zASjSS8Hs,6339
53
- rowan/workflows/tautomer_search.py,sha256=aqwXoj0ffWsb5gbvzfz_bpx5ifIfR_K07fbdWhU62Ko,5820
54
- rowan_python-3.0.8.dist-info/METADATA,sha256=Fm1PlPUx4eLxJqD6QWIvxuhPvwAOnrLWbYw3Lu_IYhU,1600
55
- rowan_python-3.0.8.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
56
- rowan_python-3.0.8.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
57
- rowan_python-3.0.8.dist-info/RECORD,,
51
+ rowan/workflows/spin_states.py,sha256=c0y2cwO9NE8DmxmQ9ZouA5QoBhxgZiTYFIqhC-geVAo,7382
52
+ rowan/workflows/strain.py,sha256=N-CoOT-hjYzjYTMYR9Uzoy4EhnrLQEOeDNSNphsUIXQ,6380
53
+ rowan/workflows/tautomer_search.py,sha256=GB96BjvVsJDgLCTH4S4nkAlBoCvKud_18Y3PTY9Q528,5779
54
+ rowan_python-3.0.10.dist-info/METADATA,sha256=YmNtnjgDWfXkYpKxuCNfZLHt6uC_YBQTvq9J7Rubt2A,1601
55
+ rowan_python-3.0.10.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
56
+ rowan_python-3.0.10.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
57
+ rowan_python-3.0.10.dist-info/RECORD,,