rowan-python 3.2.3__py3-none-any.whl → 3.2.4__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
@@ -28,7 +28,9 @@ from stjames import (
28
28
  iMTDSettings,
29
29
  InducedFitSettings,
30
30
  KMeansClusteringSettings,
31
+ MDRestraints,
31
32
  Method,
33
+ MixMDSettings,
32
34
  Mode,
33
35
  MSAFormat,
34
36
  MultiStageOptSettings,
@@ -39,9 +41,11 @@ from stjames import (
39
41
  OptimizationSettings,
40
42
  PBCDFTSettings,
41
43
  PeriodicCell,
44
+ PocketeerSettings,
42
45
  ProteinSequence,
43
46
  ProteinForceField,
44
47
  ResidueModification,
48
+ RestraintType,
45
49
  RNASequence,
46
50
  ScanSettings,
47
51
  Settings,
@@ -68,7 +72,7 @@ from stjames.engine_compatibility import (
68
72
  METHOD_ENGINES,
69
73
  get_supported_corrections,
70
74
  )
71
- from stjames.pdb import ResidueRef
75
+ from stjames.pdb import ResidueAtomRef, ResidueRef
72
76
  from stjames.optimization.band_method import NEBSettings
73
77
  from stjames.optimization.interpolation import Interpolation
74
78
  from stjames.optimization.string_method import FSMSettings, StringMethodSettings
rowan/user.py CHANGED
@@ -60,7 +60,6 @@ class User(BaseModel):
60
60
  email: email of the user
61
61
  firstname: first name of the user
62
62
  lastname: last name of the user
63
- weekly_credits: weekly credits of the user
64
63
  credits: credits of the user
65
64
  billing_name: billing name of the user
66
65
  billing_address: billing address of the user
@@ -79,7 +78,6 @@ class User(BaseModel):
79
78
  email: str
80
79
  firstname: str | None = None
81
80
  lastname: str | None = None
82
- weekly_credits: float | None = None
83
81
  credits: float | None = None
84
82
  billing_name: str | None = None
85
83
  billing_address: str | dict | None = None
@@ -124,7 +122,7 @@ class User(BaseModel):
124
122
  Returns:
125
123
  string showing available credits
126
124
  """
127
- individual_credits = f"Weekly Credits: {self.weekly_credits}\nCredits: {self.credits}"
125
+ individual_credits = f"Credits: {self.credits}"
128
126
  if self.organization is not None:
129
127
  return (
130
128
  individual_credits
@@ -102,7 +102,14 @@ from .multistage_optimization import (
102
102
  )
103
103
  from .nmr import NMRCoupling, NMRPeak, NMRResult, submit_nmr_workflow
104
104
  from .pka import pKaMicrostate, pKaResult, submit_pka_workflow
105
- from .pocket_detection import Pocket, PocketDetectionResult, submit_pocket_detection_workflow
105
+ from .pocket_detection import (
106
+ MixMDPocketDiagnostics,
107
+ MixMDReplicaDiagnostics,
108
+ MixMDResults,
109
+ Pocket,
110
+ PocketDetectionResult,
111
+ submit_pocket_detection_workflow,
112
+ )
106
113
  from .pose_analysis_md import PoseAnalysisMDResult, submit_pose_analysis_md_workflow
107
114
  from .protein_binder_design import (
108
115
  ProteinBinder,
@@ -3,27 +3,47 @@
3
3
  from dataclasses import dataclass
4
4
 
5
5
  import stjames
6
+ from stjames import MixMDSettings, PocketeerSettings
6
7
 
7
8
  from rowan.folder import Folder
8
- from rowan.protein import Protein
9
+ from rowan.protein import Protein, retrieve_protein
9
10
  from rowan.types import ProteinUUID
10
11
  from rowan.utils import api_client
11
12
 
12
- from .base import Workflow, WorkflowResult, register_result
13
+ from .base import Message, Workflow, WorkflowResult, parse_messages, register_result
14
+
15
+
16
+ @dataclass(frozen=True, slots=True)
17
+ class MixMDPocketDiagnostics:
18
+ """Probe enrichment for a pocket found by mixed-solvent MD.
19
+
20
+ Attributes:
21
+ density_center: density-weighted center of the enriched region, in Å
22
+ peak_enrichment: maximum probe density relative to bulk solvent
23
+ integrated_excess_density: probe molecules above bulk, integrated over the region
24
+ """
25
+
26
+ density_center: tuple[float, float, float]
27
+ peak_enrichment: float
28
+ integrated_excess_density: float
13
29
 
14
30
 
15
31
  @dataclass(frozen=True, slots=True)
16
32
  class Pocket:
17
33
  """A detected binding pocket.
18
34
 
35
+ Mixed-solvent MD pockets describe regions of enriched probe density, so their spheres
36
+ and volume outline that region rather than the cavity.
37
+
19
38
  Attributes:
20
39
  sphere_centers: centers of detected spheres, in Å
21
40
  sphere_radii: radii of detected spheres, in Å
22
41
  volume: pocket volume, in ų
23
- score: druggability/quality score; larger is better
42
+ score: method-specific ranking score; larger is better
24
43
  pocket_center: center of axis-aligned bounding box, in Å
25
44
  pocket_sides: side lengths of axis-aligned bounding box, in Å
26
45
  residue_numbers: residue numbers lining the pocket
46
+ mixmd: probe-enrichment details for mixed-solvent MD pockets
27
47
  """
28
48
 
29
49
  sphere_centers: tuple[tuple[float, float, float], ...]
@@ -33,6 +53,60 @@ class Pocket:
33
53
  pocket_center: tuple[float, float, float]
34
54
  pocket_sides: tuple[float, float, float]
35
55
  residue_numbers: tuple[int, ...]
56
+ mixmd: MixMDPocketDiagnostics | None = None
57
+
58
+
59
+ @dataclass(frozen=True, slots=True)
60
+ class MixMDReplicaDiagnostics:
61
+ """One mixed-solvent MD replica.
62
+
63
+ Attributes:
64
+ index: zero-based replica index
65
+ seed: replica random seed
66
+ num_frames: analyzed frames; zero for a failed replica
67
+ num_probes: probe molecules in the simulation
68
+ largest_probe_cluster_fraction: mean fraction of probes in the largest cluster
69
+ trajectory_uuid: UUID of the stored trajectory
70
+ topology_uuid: UUID of the trajectory topology protein
71
+ density_map_uuid: UUID of the stored probe-density map
72
+ """
73
+
74
+ index: int
75
+ seed: int
76
+ num_frames: int
77
+ num_probes: int
78
+ largest_probe_cluster_fraction: float | None
79
+ trajectory_uuid: str | None
80
+ topology_uuid: str | None
81
+ density_map_uuid: str | None
82
+
83
+
84
+ @dataclass(frozen=True, slots=True)
85
+ class MixMDResults:
86
+ """Mixed-solvent MD replicas and consensus artifacts.
87
+
88
+ Attributes:
89
+ reference_uuid: UUID of the protein defining pocket and map coordinates
90
+ density_map_uuid: UUID of the consensus probe-density map
91
+ replicas: per-replica results, including failed replicas
92
+ """
93
+
94
+ reference_uuid: str | None
95
+ density_map_uuid: str | None
96
+ replicas: tuple[MixMDReplicaDiagnostics, ...]
97
+
98
+
99
+ def _mixmd_diagnostics(
100
+ raw: stjames.MixMDPocketDiagnostics | None,
101
+ ) -> MixMDPocketDiagnostics | None:
102
+ """Convert stjames probe-enrichment diagnostics, if present."""
103
+ if raw is None:
104
+ return None
105
+ return MixMDPocketDiagnostics(
106
+ density_center=tuple(raw.density_center),
107
+ peak_enrichment=raw.peak_enrichment,
108
+ integrated_excess_density=raw.integrated_excess_density,
109
+ )
36
110
 
37
111
 
38
112
  @register_result("pocket_detection")
@@ -57,14 +131,59 @@ class PocketDetectionResult(WorkflowResult):
57
131
  pocket_center=tuple(p.pocket_center),
58
132
  pocket_sides=tuple(p.pocket_sides),
59
133
  residue_numbers=tuple(p.residue_numbers),
134
+ mixmd=_mixmd_diagnostics(p.mixmd),
60
135
  )
61
136
  for p in raw
62
137
  ]
63
138
 
139
+ @property
140
+ def mixmd(self) -> MixMDResults | None:
141
+ """Mixed-solvent MD replicas and artifacts, or `None` for Pocketeer runs."""
142
+ if not (raw := getattr(self._workflow, "mixmd", None)):
143
+ return None
144
+ return MixMDResults(
145
+ reference_uuid=raw.reference_uuid,
146
+ density_map_uuid=raw.density_map_uuid,
147
+ replicas=tuple(
148
+ MixMDReplicaDiagnostics(
149
+ index=r.index,
150
+ seed=r.seed,
151
+ num_frames=r.num_frames,
152
+ num_probes=r.num_probes,
153
+ largest_probe_cluster_fraction=r.largest_probe_cluster_fraction,
154
+ trajectory_uuid=r.trajectory_uuid,
155
+ topology_uuid=r.topology_uuid,
156
+ density_map_uuid=r.density_map_uuid,
157
+ )
158
+ for r in raw.replicas
159
+ ),
160
+ )
161
+
162
+ @property
163
+ def messages(self) -> list[Message]:
164
+ """Any messages or warnings from the workflow, including MixMD reliability warnings."""
165
+ return parse_messages(getattr(self._workflow, "messages", None))
166
+
167
+ def get_reference_protein(self) -> Protein | None:
168
+ """Fetch and cache the protein defining mixed-solvent MD pocket and map coordinates.
169
+
170
+ Returns:
171
+ protein object, or `None` for Pocketeer runs
172
+ """
173
+ if not (mixmd := self.mixmd) or not mixmd.reference_uuid:
174
+ return None
175
+ if "reference_protein" not in self._cache:
176
+ self._cache["reference_protein"] = retrieve_protein(
177
+ mixmd.reference_uuid, workflow_uuid=self.workflow_uuid
178
+ )
179
+ return self._cache["reference_protein"]
180
+
64
181
 
65
182
  def submit_pocket_detection_workflow(
66
183
  protein: Protein | ProteinUUID,
67
- merge_distance: float = 1.75,
184
+ merge_distance: float | None = None,
185
+ settings: PocketeerSettings | MixMDSettings | None = None,
186
+ validate_forcefield: bool = True,
68
187
  name: str = "Pocket Detection Workflow",
69
188
  folder_uuid: str | None = None,
70
189
  folder: Folder | None = None,
@@ -76,7 +195,13 @@ def submit_pocket_detection_workflow(
76
195
 
77
196
  Args:
78
197
  protein: protein to analyze. Can be a UUID or a Protein object
79
- merge_distance: distance for merging pocket spheres, in Å
198
+ merge_distance: Pocketeer distance for merging pocket spheres, in Å; defaults to 1.75.
199
+ Set it on `PocketeerSettings` instead when passing `settings`
200
+ settings: method settings; `PocketeerSettings` (default) for geometric detection or
201
+ `MixMDSettings` for mixed-solvent molecular dynamics
202
+ validate_forcefield: validate the protein forcefield compatibility before submitting a
203
+ mixed-solvent MD run. Raises an error early if the protein cannot be parameterized
204
+ or has clashing residues
80
205
  name: name of the workflow
81
206
  folder_uuid: UUID of the folder to place the workflow in
82
207
  folder: destination folder
@@ -88,23 +213,33 @@ def submit_pocket_detection_workflow(
88
213
  workflow object representing the submitted workflow
89
214
 
90
215
  Raises:
216
+ ValueError: both `merge_distance` and `settings`, or both `folder` and `folder_uuid`,
217
+ are given
91
218
  httpx.HTTPStatusError: request to the API fails
92
219
  """
93
220
  if folder and folder_uuid:
94
221
  raise ValueError("Provide either `folder` or `folder_uuid`, not both.")
222
+ if settings is not None and merge_distance is not None:
223
+ raise ValueError("Set `merge_distance` on `PocketeerSettings` when passing `settings`.")
95
224
  if folder:
96
225
  folder_uuid = folder.uuid
97
226
  if isinstance(protein, Protein):
98
227
  protein = protein.uuid
99
228
 
100
- workflow = stjames.PocketDetectionWorkflow(
101
- protein=protein,
102
- merge_distance=merge_distance,
103
- )
229
+ if settings is None:
230
+ settings = (
231
+ PocketeerSettings()
232
+ if merge_distance is None
233
+ else PocketeerSettings(merge_distance=merge_distance)
234
+ )
235
+ if validate_forcefield and isinstance(settings, MixMDSettings):
236
+ Protein(uuid=protein).validate_protein_forcefield()
237
+
238
+ workflow = stjames.PocketDetectionWorkflow(protein=protein, settings=settings)
104
239
 
105
240
  data = {
106
241
  "workflow_type": "pocket_detection",
107
- "workflow_data": workflow.model_dump(mode="json"),
242
+ "workflow_data": workflow.model_dump(serialize_as_any=True, mode="json"),
108
243
  "name": name,
109
244
  "folder_uuid": folder_uuid,
110
245
  "max_credits": max_credits,
@@ -8,6 +8,7 @@ from stjames import (
8
8
  Binder,
9
9
  GreedyClusteringSettings,
10
10
  KMeansClusteringSettings,
11
+ MDRestraints,
11
12
  ProteinForceField,
12
13
  WaterForceField,
13
14
  )
@@ -158,6 +159,7 @@ def submit_protein_md_workflow(
158
159
  max_credits: int | None = None,
159
160
  webhook_url: str | None = None,
160
161
  is_draft: bool = False,
162
+ restraints: list[MDRestraints] | None = None,
161
163
  ) -> Workflow[ProteinMDResult]:
162
164
  """Submits a Protein Molecular Dynamics (MD) workflow to the API.
163
165
 
@@ -192,7 +194,7 @@ def submit_protein_md_workflow(
192
194
  (one small molecule → heavy-atom RMSD; one binder chain → backbone N/CA/C/O RMSD);
193
195
  it is empty for multi-molecule, multi-chain, or combined chain+molecule binders
194
196
  protein_restraint_cutoff: cutoff distance from the binder past which Cα atoms are
195
- harmonically restrained, in Å; None disables restraints
197
+ harmonically restrained, in Å; None disables these Cα restraints
196
198
  protein_restraint_constant: force constant for Cα backbone restraints, in kcal/mol/Ų
197
199
  analysis_interval_ps: interval at which to compute per-frame SASA and polar SASA
198
200
  (default 100), in ps. None disables those analyses
@@ -210,6 +212,9 @@ def submit_protein_md_workflow(
210
212
  max_credits: maximum credits for the workflow
211
213
  webhook_url: URL that Rowan will POST to when the workflow completes
212
214
  is_draft: save as a draft without starting execution
215
+ restraints: atom or whole-residue restraints applied during minimization,
216
+ equilibration, and production. Atoms use their positions; residues use
217
+ their centers of mass. Cannot be combined with protein_restraint_cutoff
213
218
 
214
219
  Returns:
215
220
  submitted workflow
@@ -256,6 +261,7 @@ def submit_protein_md_workflow(
256
261
  binder=binder,
257
262
  protein_restraint_cutoff=protein_restraint_cutoff,
258
263
  protein_restraint_constant=protein_restraint_constant,
264
+ restraints=restraints or [],
259
265
  analysis_interval_ps=analysis_interval_ps,
260
266
  clustering=clustering,
261
267
  )
@@ -71,6 +71,7 @@ def submit_protein_preparation_workflow(
71
71
  max_credits: int | None = None,
72
72
  webhook_url: str | None = None,
73
73
  is_draft: bool = False,
74
+ retain_noncanonical_residues: bool = False,
74
75
  ) -> Workflow[ProteinPreparationResult]:
75
76
  """Submit a protein-preparation workflow to the API.
76
77
 
@@ -97,6 +98,8 @@ def submit_protein_preparation_workflow(
97
98
  max_credits: maximum credits for the workflow
98
99
  webhook_url: URL that Rowan will POST to when the workflow completes
99
100
  is_draft: save as a draft without starting execution
101
+ retain_noncanonical_residues: preserve modified polymer residues such as SEP/TPO/PTR;
102
+ False replaces them with their unmodified parent residues
100
103
 
101
104
  Returns:
102
105
  workflow object representing the submitted workflow
@@ -119,6 +122,7 @@ def submit_protein_preparation_workflow(
119
122
  protonation_method=protonation_method,
120
123
  pH=pH,
121
124
  retain_protonation=retain_protonation,
125
+ retain_noncanonical_residues=retain_noncanonical_residues,
122
126
  retain_non_polymer=(dict(retain_non_polymer) if retain_non_polymer is not None else None),
123
127
  )
124
128
 
@@ -352,6 +352,8 @@ def submit_relative_binding_free_energy_perturbation_workflow(
352
352
  max_credits: int | None = None,
353
353
  webhook_url: str | None = None,
354
354
  is_draft: bool = False,
355
+ *,
356
+ small_molecules: dict[str | int, str | None] | None = None,
355
357
  ) -> Workflow[RelativeBindingFreeEnergyPerturbationResult]:
356
358
  """Submits a relative binding free energy perturbation (RBFE) workflow to the API.
357
359
 
@@ -388,13 +390,16 @@ def submit_relative_binding_free_energy_perturbation_workflow(
388
390
  save_trajectories: whether to save DCD trajectories
389
391
  trajectory_save_interval: save every Nth frame when saving trajectories
390
392
  validate_forcefield: validate protein forcefield
391
- compatibility before submitting
393
+ compatibility before submitting, excluding cofactors supplied with SMILES
392
394
  name: name of the workflow
393
395
  folder_uuid: UUID of the folder to place the workflow in
394
396
  folder: destination folder
395
397
  max_credits: maximum credits for the workflow
396
398
  webhook_url: URL that Rowan will POST to when the workflow completes
397
399
  is_draft: save as a draft without starting execution
400
+ small_molecules: fixed cofactors in the prepared protein, keyed by residue name
401
+ or zero-based index among all residues ordered by lowest atom ID, and mapped
402
+ to SMILES. Known ions and waters may map to None to use existing residue templates
398
403
 
399
404
  Returns:
400
405
  submitted workflow
@@ -410,9 +415,6 @@ def submit_relative_binding_free_energy_perturbation_workflow(
410
415
 
411
416
  protein_uuid = protein.uuid if isinstance(protein, Protein) else protein
412
417
 
413
- if validate_forcefield:
414
- Protein(uuid=protein_uuid).validate_protein_forcefield()
415
-
416
418
  if graph_result.graph is None:
417
419
  raise ValueError("RBFEGraphResult has no graph - has the workflow completed successfully?")
418
420
 
@@ -446,9 +448,20 @@ def submit_relative_binding_free_energy_perturbation_workflow(
446
448
  graph=graph_result.graph,
447
449
  target=protein_uuid,
448
450
  protein=protein_uuid,
451
+ small_molecules=small_molecules,
449
452
  settings=settings,
450
453
  )
451
454
 
455
+ if validate_forcefield:
456
+ exclude_residues = [
457
+ residue
458
+ for residue, smiles in (workflow.small_molecules or {}).items()
459
+ if smiles is not None
460
+ ]
461
+ Protein(uuid=protein_uuid).validate_protein_forcefield(
462
+ exclude_residues=exclude_residues or None
463
+ )
464
+
452
465
  data = {
453
466
  "workflow_type": "relative_binding_free_energy_perturbation",
454
467
  "workflow_data": workflow.model_dump(mode="json"),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rowan-python
3
- Version: 3.2.3
3
+ Version: 3.2.4
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
@@ -12,7 +12,7 @@ Requires-Dist: httpx
12
12
  Requires-Dist: nest-asyncio
13
13
  Requires-Dist: rdkit
14
14
  Requires-Dist: setuptools
15
- Requires-Dist: stjames>=0.0.289
15
+ Requires-Dist: stjames>=0.0.293
16
16
  Description-Content-Type: text/markdown
17
17
 
18
18
  # Rowan Python Library
@@ -1,4 +1,4 @@
1
- rowan/__init__.py,sha256=pXnVxfLHs7s7AZZJmcaMk8CjTYz-g-IhMxjIV0B7i8Y,2224
1
+ rowan/__init__.py,sha256=QHph9MW2q5LS0nLYJKIn62a5bcnHvfY0pGP8VSNklns,2319
2
2
  rowan/api_keys.py,sha256=ms8NAkLreFQcaEUPCf8lSf7T0x2OmrWCAT44N1cgocE,6955
3
3
  rowan/calculation.py,sha256=E1dAox4ScE3NHJXiKFZ3Lpmw2h7DKCVzcwRvGZ2H2cQ,3802
4
4
  rowan/config.py,sha256=ay6UxKLE9bbTxHFXxDfUXGRVJWJ1T-eS2_L4HF8mb_E,20927
@@ -10,9 +10,9 @@ rowan/protein.py,sha256=AGHarvWfciSwWXfHnVjdUW47FML7vI4Kk4dYTeFfKAQ,19322
10
10
  rowan/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  rowan/spectra.py,sha256=dNmE5th6wpTVAfvZZNDkg2jlBRAmPtFT6yDtxex8APw,2307
12
12
  rowan/types.py,sha256=D0d6MW6MvLMs6UtNgGKlapFGOnPlzqFTk9EAgB9dwks,636
13
- rowan/user.py,sha256=wGwyp0uzifzJeC88yCC7pgxMhxuZ-LLWHfCcuPXcx44,6199
13
+ rowan/user.py,sha256=GWPh_d7PMhK7ShQ2NtFKl3YWyHI3hfYX-KPJGUCbGI4,6069
14
14
  rowan/utils.py,sha256=n82jhtMrHwIPXjEX4i2JFuQTLsanwixk5HfOfzPpKko,9656
15
- rowan/workflows/__init__.py,sha256=1JBuqs3KlizJEFhidvGCG7KtTdLOQKI2kspn0SK_KHw,5161
15
+ rowan/workflows/__init__.py,sha256=SmKpoLCsNzkkb6xxoG2DEbGOVGiIBpDcmn6ZQ_F7DT0,5253
16
16
  rowan/workflows/_molecular_dynamics.py,sha256=fDQVAZam6Ic_Au1yz41bVWg2_NBfkPX2ZFJNDIbw55U,10204
17
17
  rowan/workflows/admet.py,sha256=92jEbZr9OuN0FzJtWmE4EdARzs6r0uiRwq3-kSPV7nE,2531
18
18
  rowan/workflows/analogue_docking.py,sha256=NZa-2rNzuyfVE_5WZm4pQspdtWFy8tEhxbqwOrXWGnU,10881
@@ -40,22 +40,22 @@ rowan/workflows/msa.py,sha256=oXCbhHjBrodZpu_PjF5JF9z7-6ShpwAwHe1RPt7j_vY,4688
40
40
  rowan/workflows/multistage_optimization.py,sha256=27XDEYvvqMPhHscyHRvEM7AWK5CFwP2QoIUXRLhm59s,7316
41
41
  rowan/workflows/nmr.py,sha256=6yWhweIkB4tKUmJzMPFczQfDKqPWW5DD0Z7YZrv5XKI,8413
42
42
  rowan/workflows/pka.py,sha256=stwjhNcoXYO3Ulh7Wl_3EDED3hRLeX5rNcuGTdVHdHU,8459
43
- rowan/workflows/pocket_detection.py,sha256=dFeCLB59v5-Izf54blrRzJhwUtBQX2SJyVKT_-_nOUs,3889
43
+ rowan/workflows/pocket_detection.py,sha256=lSzRsmIEGOzvUorpcXeLmWaW0yPP4VfcG8-udaNfkfg,9397
44
44
  rowan/workflows/pose_analysis_md.py,sha256=ndfGS8oP8oQ3EXe83Wgbx1H8ZFURlm8IJZN34aDpqeE,10599
45
45
  rowan/workflows/protein_binder_design.py,sha256=ee3qYGzTzQsca9otnRz9Qjwj1X66LTCKqtTQ5EOzBHk,9181
46
46
  rowan/workflows/protein_cofolding.py,sha256=s4bLxlix4kAO_NzS75tc2wiEYqUxpFofxziUnxI2iUY,17422
47
- rowan/workflows/protein_md.py,sha256=iDeKW0ONY3ZPKPsjmZVQhbFQbo0vmOp5M8ko2Hfc16U,12277
48
- rowan/workflows/protein_preparation.py,sha256=8C04rhR4AiGiYJWZ8V06O4kpV443tGihcTk8rnNgscE,5325
47
+ rowan/workflows/protein_md.py,sha256=d7ARvsejEy5ZKFtznlxPZn1auVHdTiyu8GCCLMpz344,12641
48
+ rowan/workflows/protein_preparation.py,sha256=N-IMUveGL7VxFSxWC-uW607PicYjoyYa4tUNuWt30JA,5604
49
49
  rowan/workflows/rbfe_graph.py,sha256=DBNxtmgw7BNSwOXFLpHDxJtfpheTpDPs8U3SYB2MXdE,8070
50
50
  rowan/workflows/redox_potential.py,sha256=0AV2nKTngEFw7VDDpDQvdeBo5u03Aklc2ak4bDWxUz0,5366
51
- rowan/workflows/relative_binding_free_energy_perturbation.py,sha256=KDVSKBqHQcL4zsjad8abmcT1Y-viXdmHedhVW2Xg55M,18319
51
+ rowan/workflows/relative_binding_free_energy_perturbation.py,sha256=ruNdOW6RWAcvPUWLAV-JpAhf_F1nBVBbWkhzC_5FIC8,18977
52
52
  rowan/workflows/scan.py,sha256=MqV0NcjfInwxGlegOyWvAt8pwN0BdpsKvgCgTRkzdzU,7440
53
53
  rowan/workflows/solubility.py,sha256=Lws0lk4ifmtj84W_jyeOuaTpt8KM8-fceOggHrEYnmc,11211
54
54
  rowan/workflows/solvent_dependent_conformers.py,sha256=1dYf8UBVMRFELdwHzv3MI0pe12qoCAfohkaMiW3ak50,7460
55
55
  rowan/workflows/spin_states.py,sha256=C3hJEY4hccE1fCW4UjI4nIqGZLw9l2C2VKWCLiopSlY,9044
56
56
  rowan/workflows/strain.py,sha256=hq0dOlxnN72V4Sohr3qNFbOrjGmV01tc5zcF0HrL2-Y,6372
57
57
  rowan/workflows/tautomer_search.py,sha256=o5iFXHfcb6DvvWH7itA05hvWIrzxrc3a_9IDikYftiM,6351
58
- rowan_python-3.2.3.dist-info/METADATA,sha256=5zYnTTmtF9VpgtLBN_VPLY2RCU_v42bNunjmoWaqr_U,3934
59
- rowan_python-3.2.3.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
60
- rowan_python-3.2.3.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
61
- rowan_python-3.2.3.dist-info/RECORD,,
58
+ rowan_python-3.2.4.dist-info/METADATA,sha256=EBP6kz8swDog3FXU89-1jiKnxJ7hLFs5f0p9w2cUbrk,3934
59
+ rowan_python-3.2.4.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
60
+ rowan_python-3.2.4.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
61
+ rowan_python-3.2.4.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.32.4
2
+ Generator: hatchling 1.33.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any