rowan-python 3.1.16__py3-none-any.whl → 3.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. rowan/api_keys.py +70 -58
  2. rowan/calculation.py +25 -19
  3. rowan/config.py +85 -64
  4. rowan/folder.py +159 -114
  5. rowan/molecule.py +99 -72
  6. rowan/project.py +71 -50
  7. rowan/protein.py +133 -204
  8. rowan/user.py +47 -47
  9. rowan/utils.py +20 -13
  10. rowan/workflows/_molecular_dynamics.py +56 -29
  11. rowan/workflows/admet.py +21 -19
  12. rowan/workflows/analogue_docking.py +85 -64
  13. rowan/workflows/base.py +316 -226
  14. rowan/workflows/basic_calculation.py +63 -52
  15. rowan/workflows/batch_docking.py +31 -26
  16. rowan/workflows/bde.py +63 -48
  17. rowan/workflows/binding_affinity.py +57 -50
  18. rowan/workflows/conformer_search.py +113 -79
  19. rowan/workflows/constants.py +5 -2
  20. rowan/workflows/covalent_inhibitor_scan.py +52 -47
  21. rowan/workflows/descriptors.py +27 -22
  22. rowan/workflows/docking.py +102 -83
  23. rowan/workflows/double_ended_ts_search.py +42 -37
  24. rowan/workflows/electronic_properties.py +34 -28
  25. rowan/workflows/fukui.py +32 -27
  26. rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +23 -18
  27. rowan/workflows/interaction_energy_decomposition.py +30 -25
  28. rowan/workflows/ion_mobility.py +26 -22
  29. rowan/workflows/irc.py +66 -54
  30. rowan/workflows/logp.py +30 -25
  31. rowan/workflows/macropka.py +32 -27
  32. rowan/workflows/membrane_permeability.py +22 -17
  33. rowan/workflows/msa.py +33 -24
  34. rowan/workflows/multistage_optimization.py +35 -31
  35. rowan/workflows/nmr.py +46 -42
  36. rowan/workflows/pka.py +47 -41
  37. rowan/workflows/pocket_detection.py +34 -29
  38. rowan/workflows/pose_analysis_md.py +76 -72
  39. rowan/workflows/protein_binder_design.py +55 -50
  40. rowan/workflows/protein_cofolding.py +79 -74
  41. rowan/workflows/protein_md.py +84 -75
  42. rowan/workflows/protein_preparation.py +44 -36
  43. rowan/workflows/rbfe_graph.py +40 -34
  44. rowan/workflows/redox_potential.py +25 -20
  45. rowan/workflows/relative_binding_free_energy_perturbation.py +109 -78
  46. rowan/workflows/scan.py +48 -41
  47. rowan/workflows/solubility.py +67 -58
  48. rowan/workflows/solvent_dependent_conformers.py +44 -37
  49. rowan/workflows/spin_states.py +62 -54
  50. rowan/workflows/strain.py +38 -31
  51. rowan/workflows/tautomer_search.py +41 -36
  52. {rowan_python-3.1.16.dist-info → rowan_python-3.2.1.dist-info}/METADATA +18 -11
  53. rowan_python-3.2.1.dist-info/RECORD +60 -0
  54. {rowan_python-3.1.16.dist-info → rowan_python-3.2.1.dist-info}/WHEEL +1 -1
  55. rowan_python-3.1.16.dist-info/RECORD +0 -60
  56. {rowan_python-3.1.16.dist-info → rowan_python-3.2.1.dist-info}/licenses/LICENSE +0 -0
rowan/api_keys.py CHANGED
@@ -10,23 +10,23 @@ APIKeyScope = Literal["read", "read_write", "read_write_delete"]
10
10
 
11
11
 
12
12
  class APIKey(BaseModel):
13
- """
14
- Rowan API key.
15
-
16
- :ivar uuid: UUID of the API key.
17
- :ivar name: Human-readable name of the API key.
18
- :ivar created_at: When the key was created.
19
- :ivar expires_at: When the key expires.
20
- :ivar is_expired: Whether the key has expired.
21
- :ivar is_revoked: Whether the key has been revoked.
22
- :ivar scope: Permission scope ("read", "read_write", or "read_write_delete").
23
- :ivar can_manage_api_keys: Whether this key can create/list/revoke other API keys.
24
- :ivar budget: Maximum credits this key may spend. ``None`` means unlimited.
25
- :ivar credits_used: Credits spent by this key so far.
26
- :ivar scoped_project_uuid: If set, the key can only access this project.
27
- :ivar created_by_key_uuid: UUID of the API key used to create this one (if any).
28
- :ivar revoked_at: When the key was revoked, if applicable.
29
- :ivar last_used_at: When the key was last used, if known.
13
+ """Rowan API key.
14
+
15
+ Attributes:
16
+ uuid: UUID of the API key
17
+ name: human-readable name of the API key
18
+ created_at: when the key was created
19
+ expires_at: when the key expires
20
+ is_expired: whether the key has expired
21
+ is_revoked: whether the key has been revoked
22
+ scope: permission scope ("read", "read_write", or "read_write_delete")
23
+ can_manage_api_keys: whether this key can create/list/revoke other API keys
24
+ budget: maximum credits this key may spend. `None` means unlimited
25
+ credits_used: credits spent by this key so far
26
+ scoped_project_uuid: project to which access is restricted
27
+ created_by_key_uuid: UUID of the API key used to create this one (if any)
28
+ revoked_at: when the key was revoked, if applicable
29
+ last_used_at: when the key was last used, if known
30
30
  """
31
31
 
32
32
  uuid: str
@@ -51,10 +51,10 @@ class APIKey(BaseModel):
51
51
  )
52
52
 
53
53
  def revoke(self) -> Self:
54
- """
55
- Revoke this API key.
54
+ """Revoke this API key.
56
55
 
57
- :returns: Updated APIKey object.
56
+ Returns:
57
+ updated APIKey object
58
58
  """
59
59
  with api_client() as client:
60
60
  response = client.post(f"/api_key/{self.uuid}/revoke")
@@ -62,12 +62,16 @@ class APIKey(BaseModel):
62
62
  return type(self)(**response.json())
63
63
 
64
64
  def refresh(self, in_place: bool = True) -> Self:
65
- """
66
- Reload this key's metadata (e.g. ``credits_used``) from the server.
65
+ """Reload this key's metadata (e.g. `credits_used`) from the server.
66
+
67
+ Args:
68
+ in_place: update this instance in place rather than return a new instance
67
69
 
68
- :param in_place: If True, update this instance in-place. If False, return new instance.
69
- :returns: Updated APIKey object.
70
- :raises ValueError: If this key is no longer present in the account's key list.
70
+ Returns:
71
+ updated APIKey object
72
+
73
+ Raises:
74
+ ValueError: this key is no longer present in the account's key list
71
75
  """
72
76
  matches = [key for key in list_api_keys(active=None) if key.uuid == self.uuid]
73
77
  if not matches:
@@ -84,14 +88,14 @@ class APIKey(BaseModel):
84
88
 
85
89
 
86
90
  class CreatedAPIKey(BaseModel):
87
- """
88
- Result of creating a new API key.
91
+ """Result of creating a new API key.
89
92
 
90
- The plaintext ``key`` is only available at creation time — store it now,
93
+ The plaintext `key` is only available at creation time – store it now,
91
94
  it cannot be retrieved later.
92
95
 
93
- :ivar key: Plaintext API key. Save this; it is only returned once.
94
- :ivar api_key: Metadata for the newly-created key.
96
+ Attributes:
97
+ key: plaintext API key. Save this; it is only returned once
98
+ api_key: metadata for the newly-created key
95
99
  """
96
100
 
97
101
  key: str
@@ -105,20 +109,22 @@ def create_api_key(
105
109
  scoped_project_uuid: str | None = None,
106
110
  budget: float | None = None,
107
111
  ) -> CreatedAPIKey:
108
- """
109
- Create a new API key.
112
+ """Create a new API key.
110
113
 
111
114
  The caller must currently authenticate with an unscoped key that has
112
- ``can_manage_api_keys`` permission.
113
-
114
- :param name: Human-readable name for the key.
115
- :param scope: Permission scope. One of "read", "read_write", "read_write_delete".
116
- :param valid_days: Number of days until the key expires.
117
- :param scoped_project_uuid: If provided, restrict the key to a single project.
118
- :param budget: Maximum credits the key may spend. If not provided, the key has no
119
- spending limit.
120
- :returns: plaintext key together with its metadata; the plaintext key is
121
- only returned once — store it immediately.
115
+ `can_manage_api_keys` permission.
116
+
117
+ Args:
118
+ name: human-readable name for the key
119
+ scope: permission scope. One of "read", "read_write", "read_write_delete"
120
+ valid_days: number of days until the key expires
121
+ scoped_project_uuid: project to which access is restricted
122
+ budget: maximum credits the key may spend. If not provided, the key has no
123
+ spending limit
124
+
125
+ Returns:
126
+ plaintext key together with its metadata; the plaintext key is
127
+ only returned once – store it immediately
122
128
  """
123
129
  plaintext_key = f"rowan-sk{uuid.uuid4()}"
124
130
  payload = {
@@ -143,12 +149,14 @@ def create_api_key(
143
149
 
144
150
 
145
151
  def list_api_keys(active: bool | None = True) -> list[APIKey]:
146
- """
147
- List API keys belonging to the current user.
152
+ """List API keys belonging to the current user.
153
+
154
+ Args:
155
+ active: filter by key validity: True for non-revoked, non-expired keys,
156
+ False for revoked or expired keys, or None for all keys
148
157
 
149
- :param active: If True (default), only return non-revoked, non-expired keys.
150
- If False, only return revoked or expired keys. If None, return all keys.
151
- :returns: List of APIKey objects.
158
+ Returns:
159
+ matching API keys
152
160
  """
153
161
  params: dict[str, str] = {}
154
162
  if active is not None:
@@ -161,11 +169,13 @@ def list_api_keys(active: bool | None = True) -> list[APIKey]:
161
169
 
162
170
 
163
171
  def revoke_api_key(uuid: str) -> APIKey:
164
- """
165
- Revoke an API key by UUID.
172
+ """Revoke an API key by UUID.
166
173
 
167
- :param uuid: UUID of the key to revoke.
168
- :returns: Updated APIKey object.
174
+ Args:
175
+ uuid: UUID of the key to revoke
176
+
177
+ Returns:
178
+ updated APIKey object
169
179
  """
170
180
  with api_client() as client:
171
181
  response = client.post(f"/api_key/{uuid}/revoke")
@@ -174,16 +184,18 @@ def revoke_api_key(uuid: str) -> APIKey:
174
184
 
175
185
 
176
186
  def update_api_key_budget(uuid: str, budget: float | None) -> APIKey:
177
- """
178
- Update the spending budget of an API key.
187
+ """Update the spending budget of an API key.
179
188
 
180
189
  The caller must currently authenticate with an unscoped key that has
181
- ``can_manage_api_keys`` permission.
190
+ `can_manage_api_keys` permission.
191
+
192
+ Args:
193
+ uuid: UUID of the key to update
194
+ budget: new maximum credits the key may spend. Pass `None` to remove
195
+ the spending limit
182
196
 
183
- :param uuid: UUID of the key to update.
184
- :param budget: New maximum credits the key may spend. Pass ``None`` to remove
185
- the spending limit.
186
- :returns: Updated APIKey object.
197
+ Returns:
198
+ updated APIKey object
187
199
  """
188
200
  with api_client() as client:
189
201
  response = client.patch(f"/api_key/{uuid}", json={"budget": budget})
rowan/calculation.py CHANGED
@@ -16,15 +16,15 @@ def _parse_molecules(data: list[dict]) -> list[Molecule]:
16
16
 
17
17
 
18
18
  class Calculation(BaseModel):
19
- """
20
- Rowan calculation result.
21
-
22
- :param uuid: UUID of the calculation.
23
- :param name: Name of the calculation.
24
- :param status: Status code of the calculation.
25
- :param elapsed: Execution time in seconds.
26
- :param engine: Compute engine used.
27
- :param molecules: Molecules (geometries) from this calculation.
19
+ """Rowan calculation result.
20
+
21
+ Attributes:
22
+ uuid: UUID of the calculation
23
+ name: name of the calculation
24
+ status: status code of the calculation
25
+ elapsed: execution time in seconds
26
+ engine: compute engine used
27
+ molecules: molecules (geometries) from this calculation
28
28
  """
29
29
 
30
30
  uuid: str
@@ -57,11 +57,13 @@ class Calculation(BaseModel):
57
57
  return None
58
58
 
59
59
  def refresh(self, in_place: bool = True) -> Self:
60
- """
61
- Fetch the latest calculation data from the API.
60
+ """Fetch the latest calculation data from the API.
61
+
62
+ Args:
63
+ in_place: update this instance in place rather than return a new instance
62
64
 
63
- :param in_place: If True, update this instance in-place. If False, return new instance.
64
- :returns: Updated Calculation object.
65
+ Returns:
66
+ updated Calculation object
65
67
  """
66
68
  try:
67
69
  with api_client() as client:
@@ -92,13 +94,17 @@ class Calculation(BaseModel):
92
94
 
93
95
 
94
96
  def retrieve_calculation(uuid: str) -> Calculation:
95
- """
96
- Retrieve a calculation from the API by UUID.
97
+ """Retrieve a calculation from the API by UUID.
98
+
99
+ Args:
100
+ uuid: UUID of the calculation to retrieve
101
+
102
+ Returns:
103
+ calculation object with the fetched data
97
104
 
98
- :param uuid: UUID of the calculation to retrieve.
99
- :returns: Calculation object with the fetched data.
100
- :raises requests.HTTPError: If the API request fails.
101
- :raises TimeoutError: If the response times out.
105
+ Raises:
106
+ httpx.HTTPStatusError: API request fails
107
+ TimeoutError: response times out
102
108
  """
103
109
  try:
104
110
  with api_client() as client:
rowan/config.py CHANGED
@@ -354,15 +354,15 @@ BASIS_SET_ATOMS: dict[str, set[int]] = {
354
354
 
355
355
  @dataclass(frozen=True, slots=True)
356
356
  class ConformerGeneratorSettings:
357
- """
358
- Constraints for a conformer generator.
359
-
360
- :param disable_constraints: Geometry constraints not supported.
361
- :param disable_open_shell: Only closed-shell molecules supported.
362
- :param disable_ts: Transition state search not supported.
363
- :param atoms_supported: Supported atomic numbers (None = all).
364
- :param allowed_engines: Engines allowed for energy evaluation (None = all).
365
- :param solvent_warning: Warn if generator solvent differs from final opt solvent.
357
+ """Constraints for a conformer generator.
358
+
359
+ Attributes:
360
+ disable_constraints: geometry constraints not supported
361
+ disable_open_shell: only closed-shell molecules supported
362
+ disable_ts: transition state search not supported
363
+ atoms_supported: supported atomic numbers (None = all)
364
+ allowed_engines: engines allowed for energy evaluation (None = all)
365
+ solvent_warning: warn if generator solvent differs from final opt solvent
366
366
  """
367
367
 
368
368
  disable_constraints: bool = False
@@ -400,16 +400,16 @@ CONFORMER_GENERATOR_SETTINGS: dict[str, ConformerGeneratorSettings] = {
400
400
 
401
401
  @dataclass(frozen=True, slots=True)
402
402
  class MDSettings:
403
- """
404
- Molecular dynamics parameter constraints.
405
-
406
- :param TIMESTEP_MIN: Minimum timestep in femtoseconds.
407
- :param TIMESTEP_MAX: Maximum timestep in femtoseconds.
408
- :param MAX_SAVED_FRAMES: Maximum number of frames that can be saved.
409
- :param NPT_REQUIRES_PERIODIC: NPT ensemble only valid for periodic systems.
410
- :param QUASICLASSICAL_REQUIRES_FREQUENCIES: Quasiclassical init needs frequencies.
411
- :param READ_REQUIRES_VELOCITIES: Read init needs velocities from previous job.
412
- :param CONFINING_BLOCKED_FOR_PERIODIC: Confining constraints invalid for periodic.
403
+ """Molecular dynamics parameter constraints.
404
+
405
+ Attributes:
406
+ TIMESTEP_MIN: minimum timestep in femtoseconds
407
+ TIMESTEP_MAX: maximum timestep in femtoseconds
408
+ MAX_SAVED_FRAMES: maximum number of frames that can be saved
409
+ NPT_REQUIRES_PERIODIC: NPT ensemble only valid for periodic systems
410
+ QUASICLASSICAL_REQUIRES_FREQUENCIES: quasiclassical init needs frequencies
411
+ READ_REQUIRES_VELOCITIES: read init needs velocities from previous job
412
+ CONFINING_BLOCKED_FOR_PERIODIC: confining constraints invalid for periodic
413
413
  """
414
414
 
415
415
  TIMESTEP_MIN: float = 0.5 # fs
@@ -432,12 +432,12 @@ MD_SETTINGS = MDSettings()
432
432
 
433
433
  @dataclass(frozen=True, slots=True)
434
434
  class SolubilityMethodSettings:
435
- """
436
- Constraints for solubility prediction methods.
435
+ """Constraints for solubility prediction methods.
437
436
 
438
- :param allowed_solvents: Solvents supported (None = all). Use SMILES format.
439
- :param single_temperature_k: If set, only this temperature allowed.
440
- :param temperature_range: If set, (min_k, max_k) range allowed.
437
+ Attributes:
438
+ allowed_solvents: solvents supported (None = all). Use SMILES format
439
+ single_temperature_k: only allowed temperature, when specified
440
+ temperature_range: allowed temperature range (min_k, max_k)
441
441
  """
442
442
 
443
443
  allowed_solvents: list[str] | None = None
@@ -463,13 +463,13 @@ SOLUBILITY_METHOD_SETTINGS: dict[str, SolubilityMethodSettings] = {
463
463
 
464
464
  @dataclass(frozen=True, slots=True)
465
465
  class MacroPKaSettings:
466
- """
467
- MacroPKa workflow parameter constraints.
466
+ """MacroPKa workflow parameter constraints.
468
467
 
469
- :param PH_WARNING_MIN: pH values below this trigger accuracy warning.
470
- :param PH_WARNING_MAX: pH values above this trigger accuracy warning.
471
- :param CHARGE_MIN: Minimum allowed charge state.
472
- :param CHARGE_MAX: Maximum allowed charge state.
468
+ Attributes:
469
+ PH_WARNING_MIN: pH values below this trigger accuracy warning
470
+ PH_WARNING_MAX: pH values above this trigger accuracy warning
471
+ CHARGE_MIN: minimum allowed charge state
472
+ CHARGE_MAX: maximum allowed charge state
473
473
  """
474
474
 
475
475
  PH_WARNING_MIN: float = 0.0
@@ -487,15 +487,15 @@ TAUTOMER_ATOMS_SUPPORTED = [1, 5, 6, 7, 8, 9, 14, 15, 16, 17, 33, 34, 35, 53]
487
487
 
488
488
  @dataclass(frozen=True, slots=True)
489
489
  class CofoldingModelSettings:
490
- """
491
- Constraints for protein cofolding models.
492
-
493
- :param max_sequence_length: Maximum total sequence length.
494
- :param supports_cyclic_peptides: Whether cyclic peptides are supported.
495
- :param supports_potentials: Whether potentials can be used.
496
- :param supports_ligand_binding_affinity: Whether binding affinity available.
497
- :param ligand_max_atoms: Max atoms per ligand for binding affinity.
498
- :param ligand_atoms_supported: Supported atoms for ligand binding.
490
+ """Constraints for protein cofolding models.
491
+
492
+ Attributes:
493
+ max_sequence_length: maximum total sequence length
494
+ supports_cyclic_peptides: whether cyclic peptides are supported
495
+ supports_potentials: whether potentials can be used
496
+ supports_ligand_binding_affinity: whether binding affinity available
497
+ ligand_max_atoms: max atoms per ligand for binding affinity
498
+ ligand_atoms_supported: supported atoms for ligand binding
499
499
  """
500
500
 
501
501
  max_sequence_length: int = 3000
@@ -548,15 +548,15 @@ COFOLDING_MODEL_SETTINGS: dict[str, CofoldingModelSettings] = {
548
548
 
549
549
  @dataclass(frozen=True, slots=True)
550
550
  class BinderDesignSettings:
551
- """
552
- Protein binder design parameter constraints.
553
-
554
- :param MAX_SEQUENCE_LENGTH: Maximum total amino acids.
555
- :param NUM_DESIGNS_MAX_FREE: Max designs for free tier.
556
- :param NUM_DESIGNS_MAX_SUBSCRIBED: Max designs for subscribed users.
557
- :param BUDGET_MUST_BE_LEQ_NUM_DESIGNS: budget cannot exceed num_designs.
558
- :param REQUIRES_DESIGNABLE_REGIONS: At least one sequence must have digits.
559
- :param REQUIRES_UNIQUE_CHAIN_IDS: All chain IDs must be unique.
551
+ """Protein binder design parameter constraints.
552
+
553
+ Attributes:
554
+ MAX_SEQUENCE_LENGTH: maximum total amino acids
555
+ NUM_DESIGNS_MAX_FREE: max designs for free tier
556
+ NUM_DESIGNS_MAX_SUBSCRIBED: max designs for subscribed users
557
+ BUDGET_MUST_BE_LEQ_NUM_DESIGNS: budget cannot exceed num_designs
558
+ REQUIRES_DESIGNABLE_REGIONS: at least one sequence must have digits
559
+ REQUIRES_UNIQUE_CHAIN_IDS: all chain IDs must be unique
560
560
  """
561
561
 
562
562
  MAX_SEQUENCE_LENGTH: int = 1500
@@ -580,8 +580,11 @@ DOCKING_CSEARCH_REQUIRES_OPTIMIZATION = True
580
580
  def get_engine_settings(engine: str) -> EngineSettings | None:
581
581
  """Look up settings for a compute engine.
582
582
 
583
- :param engine: Engine identifier string.
584
- :returns: Settings for the engine, or None if not found.
583
+ Args:
584
+ engine: engine identifier string
585
+
586
+ Returns:
587
+ settings for the engine, or None if not found
585
588
  """
586
589
  return ENGINE_SETTINGS.get(engine)
587
590
 
@@ -589,8 +592,11 @@ def get_engine_settings(engine: str) -> EngineSettings | None:
589
592
  def get_method_settings(method: str) -> MethodSettings | None:
590
593
  """Look up settings for a calculation method.
591
594
 
592
- :param method: Method identifier string.
593
- :returns: Settings for the method, or None if not found.
595
+ Args:
596
+ method: method identifier string
597
+
598
+ Returns:
599
+ settings for the method, or None if not found
594
600
  """
595
601
  return METHOD_SETTINGS.get(method)
596
602
 
@@ -598,8 +604,11 @@ def get_method_settings(method: str) -> MethodSettings | None:
598
604
  def get_engines_for_method(method: str) -> list[str]:
599
605
  """Find all engines that support a given method.
600
606
 
601
- :param method: Method identifier string.
602
- :returns: List of engine identifier strings that support the method.
607
+ Args:
608
+ method: method identifier string
609
+
610
+ Returns:
611
+ list of engine identifier strings that support the method
603
612
  """
604
613
  return [engine for engine, settings in ENGINE_SETTINGS.items() if method in settings.methods]
605
614
 
@@ -611,10 +620,13 @@ def get_combined_settings(
611
620
 
612
621
  Merges engine and method constraints to give the full picture of what's supported.
613
622
 
614
- :param engine: Engine identifier string.
615
- :param method: Method identifier string.
616
- :param periodic: Whether periodic boundary conditions are used.
617
- :returns: Merged MethodSettings, or None if the combination is not supported.
623
+ Args:
624
+ engine: engine identifier string
625
+ method: method identifier string
626
+ periodic: whether periodic boundary conditions are used
627
+
628
+ Returns:
629
+ merged MethodSettings, or None if the combination is not supported
618
630
  """
619
631
  engine_settings = ENGINE_SETTINGS.get(engine)
620
632
  if engine_settings is None or method not in engine_settings.methods:
@@ -650,8 +662,11 @@ def get_combined_settings(
650
662
  def get_conformer_generator_settings(generator: str) -> ConformerGeneratorSettings | None:
651
663
  """Look up settings for a conformer generator.
652
664
 
653
- :param generator: Conformer generator identifier string.
654
- :returns: Settings for the generator, or None if not found.
665
+ Args:
666
+ generator: conformer generator identifier string
667
+
668
+ Returns:
669
+ settings for the generator, or None if not found
655
670
  """
656
671
  return CONFORMER_GENERATOR_SETTINGS.get(generator)
657
672
 
@@ -659,8 +674,11 @@ def get_conformer_generator_settings(generator: str) -> ConformerGeneratorSettin
659
674
  def get_solubility_method_settings(method: str) -> SolubilityMethodSettings | None:
660
675
  """Look up settings for a solubility prediction method.
661
676
 
662
- :param method: Solubility method identifier string.
663
- :returns: Settings for the method, or None if not found.
677
+ Args:
678
+ method: solubility method identifier string
679
+
680
+ Returns:
681
+ settings for the method, or None if not found
664
682
  """
665
683
  return SOLUBILITY_METHOD_SETTINGS.get(method)
666
684
 
@@ -668,7 +686,10 @@ def get_solubility_method_settings(method: str) -> SolubilityMethodSettings | No
668
686
  def get_cofolding_model_settings(model: str) -> CofoldingModelSettings | None:
669
687
  """Look up settings for a protein cofolding model.
670
688
 
671
- :param model: Cofolding model identifier string.
672
- :returns: Settings for the model, or None if not found.
689
+ Args:
690
+ model: cofolding model identifier string
691
+
692
+ Returns:
693
+ settings for the model, or None if not found
673
694
  """
674
695
  return COFOLDING_MODEL_SETTINGS.get(model)