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.
- rowan/api_keys.py +70 -58
- rowan/calculation.py +25 -19
- rowan/config.py +85 -64
- rowan/folder.py +159 -114
- rowan/molecule.py +99 -72
- rowan/project.py +71 -50
- rowan/protein.py +133 -204
- rowan/user.py +47 -47
- rowan/utils.py +20 -13
- rowan/workflows/_molecular_dynamics.py +56 -29
- rowan/workflows/admet.py +21 -19
- rowan/workflows/analogue_docking.py +85 -64
- rowan/workflows/base.py +316 -226
- rowan/workflows/basic_calculation.py +63 -52
- rowan/workflows/batch_docking.py +31 -26
- rowan/workflows/bde.py +63 -48
- rowan/workflows/binding_affinity.py +57 -50
- rowan/workflows/conformer_search.py +113 -79
- rowan/workflows/constants.py +5 -2
- rowan/workflows/covalent_inhibitor_scan.py +52 -47
- rowan/workflows/descriptors.py +27 -22
- rowan/workflows/docking.py +102 -83
- rowan/workflows/double_ended_ts_search.py +42 -37
- rowan/workflows/electronic_properties.py +34 -28
- rowan/workflows/fukui.py +32 -27
- rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +23 -18
- rowan/workflows/interaction_energy_decomposition.py +30 -25
- rowan/workflows/ion_mobility.py +26 -22
- rowan/workflows/irc.py +66 -54
- rowan/workflows/logp.py +30 -25
- rowan/workflows/macropka.py +32 -27
- rowan/workflows/membrane_permeability.py +22 -17
- rowan/workflows/msa.py +33 -24
- rowan/workflows/multistage_optimization.py +35 -31
- rowan/workflows/nmr.py +46 -42
- rowan/workflows/pka.py +47 -41
- rowan/workflows/pocket_detection.py +34 -29
- rowan/workflows/pose_analysis_md.py +76 -72
- rowan/workflows/protein_binder_design.py +55 -50
- rowan/workflows/protein_cofolding.py +79 -74
- rowan/workflows/protein_md.py +84 -75
- rowan/workflows/protein_preparation.py +44 -36
- rowan/workflows/rbfe_graph.py +40 -34
- rowan/workflows/redox_potential.py +25 -20
- rowan/workflows/relative_binding_free_energy_perturbation.py +109 -78
- rowan/workflows/scan.py +48 -41
- rowan/workflows/solubility.py +67 -58
- rowan/workflows/solvent_dependent_conformers.py +44 -37
- rowan/workflows/spin_states.py +62 -54
- rowan/workflows/strain.py +38 -31
- rowan/workflows/tautomer_search.py +41 -36
- {rowan_python-3.1.16.dist-info → rowan_python-3.2.1.dist-info}/METADATA +18 -11
- rowan_python-3.2.1.dist-info/RECORD +60 -0
- {rowan_python-3.1.16.dist-info → rowan_python-3.2.1.dist-info}/WHEEL +1 -1
- rowan_python-3.1.16.dist-info/RECORD +0 -60
- {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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
-
:
|
|
69
|
-
|
|
70
|
-
|
|
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
|
|
93
|
+
The plaintext `key` is only available at creation time – store it now,
|
|
91
94
|
it cannot be retrieved later.
|
|
92
95
|
|
|
93
|
-
:
|
|
94
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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
|
-
:
|
|
150
|
-
|
|
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
|
-
:
|
|
168
|
-
|
|
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
|
-
|
|
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
|
-
:
|
|
184
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
:
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
:
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
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
|
-
:
|
|
439
|
-
|
|
440
|
-
|
|
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
|
-
:
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
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
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
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
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
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
|
-
:
|
|
584
|
-
|
|
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
|
-
:
|
|
593
|
-
|
|
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
|
-
:
|
|
602
|
-
|
|
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
|
-
:
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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
|
-
:
|
|
654
|
-
|
|
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
|
-
:
|
|
663
|
-
|
|
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
|
-
:
|
|
672
|
-
|
|
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)
|