rowan-python 3.0.5__tar.gz → 3.0.7__tar.gz
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_python-3.0.5 → rowan_python-3.0.7}/.gitignore +0 -3
- rowan_python-3.0.7/AGENTS.md +124 -0
- rowan_python-3.0.7/CLAUDE.md +1 -0
- rowan_python-3.0.7/GEMINI.md +1 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/PKG-INFO +1 -1
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/periodic_dft.py +5 -5
- rowan_python-3.0.7/examples/pocket_detection.py +28 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/pixi.lock +111 -112
- {rowan_python-3.0.5 → rowan_python-3.0.7}/pyproject.toml +1 -1
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/molecule.py +24 -16
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/protein.py +2 -1
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/__init__.py +1 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/electronic_properties.py +11 -1
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/pka.py +11 -3
- rowan_python-3.0.7/rowan/workflows/pocket_detection.py +112 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/.envrc +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/.github/workflows/build-and-deploy-docs.yml +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/.github/workflows/python-publish.yml +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/.github/workflows/test.yml +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/.pre-commit-config.yaml +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/LICENSE +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/README.md +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/images/deciduous-tree-favicon.png +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/index.md +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/rowan_rdkit.md +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/stylesheets/colors.css +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/PROTAC_solubility.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/admet.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/analogue_docking.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/aqueous_solubility.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation_from_json.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation_with_constraint.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation_with_solvent.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/batch_docking.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/bde.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/boltz_paired_msa.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/boltz_single_msa.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/chai_paired_msa.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/chai_single_msa.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/cofolding_screen.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/colabfold_paired_msa.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/colabfold_single_msa.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/conformer_dependent_redox.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/conformers.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/1iep_receptorH.pdb +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/Al_FCC.xyz +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/citalopram_1iep.xyz +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/tyk2_ligands.sdf +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/tyk2_structure.pdb +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/workflow_example.json +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/dcd_download.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/descriptors.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/docking_screen.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/double_ended_ts_search.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/electronic_properties.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/estimate_workflow.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/fukui_index.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/hydrogen_bond_basicity.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/interaction_energy_decomposition.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/ion_mobility.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/irc.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/macropka.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/membrane_permeability.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/multistage_optimization.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/nmr.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/optimization.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/pdb_download.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/phenol_pka.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/pka.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/pose_analysis_md.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/protein_binder_design.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/protein_cofolding.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/protein_md.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/rbfe_graph.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/redox_potential.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/relative_binding_free_energy_perturbation.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/retrieve_workflow.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/scan.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/solvent_dependent_conformers.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/spin_states.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/strain.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/tautomer.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/template.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/webhook.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/mkdocs.yml +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/__init__.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/calculation.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/config.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/constants.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/folder.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/project.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/py.typed +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/rowan_rdkit/__init__.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/rowan_rdkit/chem_utils.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/types.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/user.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/utils.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/admet.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/analogue_docking.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/base.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/basic_calculation.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/batch_docking.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/bde.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/conformer_search.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/constants.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/descriptors.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/docking.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/double_ended_ts_search.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/fukui.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/interaction_energy_decomposition.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/ion_mobility.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/irc.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/macropka.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/membrane_permeability.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/msa.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/multistage_optimization.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/nmr.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/pose_analysis_md.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/protein_binder_design.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/protein_cofolding.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/protein_md.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/rbfe_graph.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/redox_potential.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/relative_binding_free_energy_perturbation.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/scan.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/solubility.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/solvent_dependent_conformers.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/spin_states.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/strain.py +0 -0
- {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/tautomer_search.py +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# AI Agent Development Guide
|
|
2
|
+
|
|
3
|
+
This document provides essential guidance for AI agents working on this repository.
|
|
4
|
+
|
|
5
|
+
## Repository overview
|
|
6
|
+
|
|
7
|
+
rowan-python-internal is the private Python SDK for the Rowan computational chemistry platform. It wraps the stjames data model library and provides user-facing workflow submission and result retrieval.
|
|
8
|
+
|
|
9
|
+
Structure:
|
|
10
|
+
- `rowan/` - source code (flat layout)
|
|
11
|
+
- `rowan/workflows/` - workflow submission functions and result types
|
|
12
|
+
- `examples/` - usage examples for each workflow
|
|
13
|
+
- `docs/` - documentation (mkdocs)
|
|
14
|
+
- `.github/workflows/` - CI/CD configuration
|
|
15
|
+
|
|
16
|
+
Key relationships:
|
|
17
|
+
- **stjames** (`../stjames`) - data model dependency, imported as `stjames`. Defines workflow models, settings, validation, and engine compatibility.
|
|
18
|
+
- **rowan-python** - public version of this repo. Push via `git push public master` from this repo.
|
|
19
|
+
|
|
20
|
+
Python version: >=3.12
|
|
21
|
+
|
|
22
|
+
## Essential commands
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Setup
|
|
26
|
+
pixi install # Install dependencies
|
|
27
|
+
|
|
28
|
+
# Code quality (these are the pre-commit hooks)
|
|
29
|
+
pixi run fmt # Format code (ruff format)
|
|
30
|
+
pixi run lint # Lint code (ruff check --fix)
|
|
31
|
+
pixi run types # Type check (mypy)
|
|
32
|
+
|
|
33
|
+
# Testing
|
|
34
|
+
pixi run test # Run tests (pytest with doctests)
|
|
35
|
+
pixi run all # Run fmt + lint + types + test
|
|
36
|
+
|
|
37
|
+
# Run a specific example
|
|
38
|
+
pixi run python examples/basic_calculation.py
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Before every commit
|
|
42
|
+
|
|
43
|
+
- Run `pixi run fmt`, `pixi run lint`, `pixi run types`
|
|
44
|
+
- Pre-commit hooks (`.pre-commit-config.yaml`) run these automatically on commit
|
|
45
|
+
- No pytest in pre-commit hooks — tests run in CI
|
|
46
|
+
|
|
47
|
+
## Code conventions
|
|
48
|
+
|
|
49
|
+
### Docstrings
|
|
50
|
+
|
|
51
|
+
Format: reStructuredText-style. No types in docstrings, no leading articles.
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
def process_data(input_data: list[str], threshold: int = 10) -> dict[str, int]:
|
|
55
|
+
"""Process input data and return summary statistics.
|
|
56
|
+
|
|
57
|
+
:param input_data: strings to process
|
|
58
|
+
:param threshold: minimum count threshold for inclusion
|
|
59
|
+
:returns: mapping of categories to counts
|
|
60
|
+
"""
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Type annotations
|
|
64
|
+
|
|
65
|
+
- All functions must have complete type annotations
|
|
66
|
+
- Modern syntax: `list[str]`, `dict[str, int]`, `str | None`
|
|
67
|
+
- Import from `typing` only when necessary
|
|
68
|
+
|
|
69
|
+
### Code formatting
|
|
70
|
+
|
|
71
|
+
Via ruff:
|
|
72
|
+
- Line length: 100
|
|
73
|
+
- Indentation: 4 spaces
|
|
74
|
+
|
|
75
|
+
### Imports
|
|
76
|
+
|
|
77
|
+
- Absolute imports preferred
|
|
78
|
+
- No wildcard imports except in `__init__.py`
|
|
79
|
+
- Import sorting handled by ruff (isort)
|
|
80
|
+
|
|
81
|
+
## Workflow development guidelines
|
|
82
|
+
|
|
83
|
+
### Validation
|
|
84
|
+
- Use stjames validation when possible. Don't duplicate validation that stjames model validators already handle (e.g. engine/method compatibility, solvent checks). Only add rowan-side validation when stjames doesn't cover it.
|
|
85
|
+
|
|
86
|
+
### stjames type aliasing
|
|
87
|
+
- Users should never need to `import stjames` directly. All user-facing stjames types must be aliased in `rowan/__init__.py`. If an example requires a stjames import, that's a signal the type needs to be aliased.
|
|
88
|
+
|
|
89
|
+
### Serialization
|
|
90
|
+
- Use `serialize_as_any=True` on `model_dump` when the workflow has union-typed fields (e.g. `ConformerGenSettingsUnion`, `MultiStageOptSettings` containing `Settings` subfields). Without it, pydantic may silently drop subclass-specific fields during serialization.
|
|
91
|
+
|
|
92
|
+
### Defaults
|
|
93
|
+
- When hardcoding a default value for a stjames field, make sure it matches the corresponding default in the stjames workflow model.
|
|
94
|
+
|
|
95
|
+
### Type hints in function signatures
|
|
96
|
+
- Don't use pydantic-specific types (`PositiveInt`, `NonNegativeInt`, etc.) in plain function signatures. They don't enforce constraints outside pydantic models and are misleading. Use plain `int`, `float`, etc. — stjames validates downstream when the model is constructed.
|
|
97
|
+
|
|
98
|
+
### Testing
|
|
99
|
+
- After editing a workflow, run its relevant example before committing (not on every change) to catch breakage early.
|
|
100
|
+
|
|
101
|
+
## Git authorization policy
|
|
102
|
+
|
|
103
|
+
**Do not run `git commit`, `git push`, or any other git write commands without explicit permission from the user.**
|
|
104
|
+
|
|
105
|
+
**Never add yourself as a commit author or co-author.** Do not include `Co-Authored-By:`, `Author:`, or any similar trailer that attributes the commit to an AI model or tool. Commits are attributed solely to the human developer.
|
|
106
|
+
|
|
107
|
+
## CI/CD
|
|
108
|
+
|
|
109
|
+
File: `.github/workflows/test.yml`
|
|
110
|
+
|
|
111
|
+
Triggers: all PRs, pushes to `master`
|
|
112
|
+
|
|
113
|
+
Checks:
|
|
114
|
+
1. `pixi run fmt` - format check
|
|
115
|
+
2. `pixi run lint` - lint check
|
|
116
|
+
3. `pixi run types` - type check
|
|
117
|
+
|
|
118
|
+
Matrix: Python 3.14, ubuntu-latest
|
|
119
|
+
|
|
120
|
+
## Additional resources
|
|
121
|
+
|
|
122
|
+
- pixi documentation: https://pixi.sh
|
|
123
|
+
- ruff documentation: https://docs.astral.sh/ruff
|
|
124
|
+
- pytest documentation: https://docs.pytest.org
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -21,8 +21,8 @@ folder = rowan.get_folder("examples/periodic_dft")
|
|
|
21
21
|
# Lattice vectors in Angstrom; Al has 13 electrons so multiplicity=2.
|
|
22
22
|
cell = rowan.PeriodicCell(
|
|
23
23
|
lattice_vectors=(
|
|
24
|
-
(0.0,
|
|
25
|
-
(2.0230, 0.0,
|
|
24
|
+
(0.0, 2.0230, 2.0230),
|
|
25
|
+
(2.0230, 0.0, 2.0230),
|
|
26
26
|
(2.0230, 2.0230, 0.0),
|
|
27
27
|
)
|
|
28
28
|
)
|
|
@@ -35,10 +35,10 @@ al_fcc = rowan.Molecule.from_atoms(
|
|
|
35
35
|
|
|
36
36
|
# Marzari–Vanderbilt cold smearing is recommended for metals.
|
|
37
37
|
pbc_settings = rowan.PBCDFTSettings(
|
|
38
|
-
pw_cutoff=7.5,
|
|
39
|
-
kpoints=(4, 4, 4),
|
|
38
|
+
pw_cutoff=7.5, # Hartree; SSSP efficiency recommends ~7–9 Ha for Al
|
|
39
|
+
kpoints=(4, 4, 4), # Monkhorst–Pack grid; increase for production runs
|
|
40
40
|
smearing=rowan.PBCDFTSmearing.MV,
|
|
41
|
-
degauss=0.01,
|
|
41
|
+
degauss=0.01, # Hartree smearing width
|
|
42
42
|
)
|
|
43
43
|
|
|
44
44
|
workflow = rowan.submit_basic_calculation_workflow(
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import rowan
|
|
2
|
+
|
|
3
|
+
# Set your API key or use the ROWAN_API_KEY environment variable
|
|
4
|
+
# rowan.api_key = "rowan-sk..."
|
|
5
|
+
folder = rowan.get_folder("examples")
|
|
6
|
+
|
|
7
|
+
protein = rowan.create_protein_from_pdb_id(
|
|
8
|
+
"thymidine phosphorylase", "1OTP", project_uuid=rowan.default_project().uuid
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
protein.prepare()
|
|
12
|
+
|
|
13
|
+
workflow = rowan.submit_pocket_detection_workflow(
|
|
14
|
+
protein=protein,
|
|
15
|
+
name="Pocket detection on thymidine phosphorylase",
|
|
16
|
+
folder=folder,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
result = workflow.result()
|
|
20
|
+
|
|
21
|
+
print(f"Detected {len(result.pockets)} pocket(s):")
|
|
22
|
+
for i, pocket in enumerate(result.pockets):
|
|
23
|
+
print(f" Pocket {i}: score={pocket.score}, volume={pocket.volume} ų")
|
|
24
|
+
print(f" center={pocket.pocket_center}")
|
|
25
|
+
print(f" sides={pocket.pocket_sides}")
|
|
26
|
+
print(f" residues={pocket.residue_numbers}")
|
|
27
|
+
|
|
28
|
+
print(f"View workflow privately at: https://labs.rowansci.com/pocket-detection/{workflow.uuid}")
|