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.
Files changed (132) hide show
  1. {rowan_python-3.0.5 → rowan_python-3.0.7}/.gitignore +0 -3
  2. rowan_python-3.0.7/AGENTS.md +124 -0
  3. rowan_python-3.0.7/CLAUDE.md +1 -0
  4. rowan_python-3.0.7/GEMINI.md +1 -0
  5. {rowan_python-3.0.5 → rowan_python-3.0.7}/PKG-INFO +1 -1
  6. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/periodic_dft.py +5 -5
  7. rowan_python-3.0.7/examples/pocket_detection.py +28 -0
  8. {rowan_python-3.0.5 → rowan_python-3.0.7}/pixi.lock +111 -112
  9. {rowan_python-3.0.5 → rowan_python-3.0.7}/pyproject.toml +1 -1
  10. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/molecule.py +24 -16
  11. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/protein.py +2 -1
  12. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/__init__.py +1 -0
  13. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/electronic_properties.py +11 -1
  14. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/pka.py +11 -3
  15. rowan_python-3.0.7/rowan/workflows/pocket_detection.py +112 -0
  16. {rowan_python-3.0.5 → rowan_python-3.0.7}/.envrc +0 -0
  17. {rowan_python-3.0.5 → rowan_python-3.0.7}/.github/workflows/build-and-deploy-docs.yml +0 -0
  18. {rowan_python-3.0.5 → rowan_python-3.0.7}/.github/workflows/python-publish.yml +0 -0
  19. {rowan_python-3.0.5 → rowan_python-3.0.7}/.github/workflows/test.yml +0 -0
  20. {rowan_python-3.0.5 → rowan_python-3.0.7}/.pre-commit-config.yaml +0 -0
  21. {rowan_python-3.0.5 → rowan_python-3.0.7}/LICENSE +0 -0
  22. {rowan_python-3.0.5 → rowan_python-3.0.7}/README.md +0 -0
  23. {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/images/deciduous-tree-favicon.png +0 -0
  24. {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/index.md +0 -0
  25. {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/rowan_rdkit.md +0 -0
  26. {rowan_python-3.0.5 → rowan_python-3.0.7}/docs/stylesheets/colors.css +0 -0
  27. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/PROTAC_solubility.py +0 -0
  28. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/admet.py +0 -0
  29. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/analogue_docking.py +0 -0
  30. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/aqueous_solubility.py +0 -0
  31. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation.py +0 -0
  32. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation_from_json.py +0 -0
  33. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation_with_constraint.py +0 -0
  34. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/basic_calculation_with_solvent.py +0 -0
  35. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/batch_docking.py +0 -0
  36. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/bde.py +0 -0
  37. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/boltz_paired_msa.py +0 -0
  38. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/boltz_single_msa.py +0 -0
  39. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/chai_paired_msa.py +0 -0
  40. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/chai_single_msa.py +0 -0
  41. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/cofolding_screen.py +0 -0
  42. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/colabfold_paired_msa.py +0 -0
  43. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/colabfold_single_msa.py +0 -0
  44. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/conformer_dependent_redox.py +0 -0
  45. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/conformers.py +0 -0
  46. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/1iep_receptorH.pdb +0 -0
  47. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/Al_FCC.xyz +0 -0
  48. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/citalopram_1iep.xyz +0 -0
  49. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/tyk2_ligands.sdf +0 -0
  50. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/tyk2_structure.pdb +0 -0
  51. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/data/workflow_example.json +0 -0
  52. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/dcd_download.py +0 -0
  53. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/descriptors.py +0 -0
  54. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/docking_screen.py +0 -0
  55. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/double_ended_ts_search.py +0 -0
  56. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/electronic_properties.py +0 -0
  57. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/estimate_workflow.py +0 -0
  58. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/fukui_index.py +0 -0
  59. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/hydrogen_bond_basicity.py +0 -0
  60. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/interaction_energy_decomposition.py +0 -0
  61. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/ion_mobility.py +0 -0
  62. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/irc.py +0 -0
  63. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/macropka.py +0 -0
  64. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/membrane_permeability.py +0 -0
  65. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/multistage_optimization.py +0 -0
  66. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/nmr.py +0 -0
  67. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/optimization.py +0 -0
  68. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/pdb_download.py +0 -0
  69. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/phenol_pka.py +0 -0
  70. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/pka.py +0 -0
  71. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/pose_analysis_md.py +0 -0
  72. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/protein_binder_design.py +0 -0
  73. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/protein_cofolding.py +0 -0
  74. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/protein_md.py +0 -0
  75. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/rbfe_graph.py +0 -0
  76. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/redox_potential.py +0 -0
  77. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/relative_binding_free_energy_perturbation.py +0 -0
  78. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/retrieve_workflow.py +0 -0
  79. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/scan.py +0 -0
  80. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/solvent_dependent_conformers.py +0 -0
  81. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/spin_states.py +0 -0
  82. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/strain.py +0 -0
  83. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/tautomer.py +0 -0
  84. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/template.py +0 -0
  85. {rowan_python-3.0.5 → rowan_python-3.0.7}/examples/webhook.py +0 -0
  86. {rowan_python-3.0.5 → rowan_python-3.0.7}/mkdocs.yml +0 -0
  87. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/__init__.py +0 -0
  88. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/calculation.py +0 -0
  89. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/config.py +0 -0
  90. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/constants.py +0 -0
  91. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/folder.py +0 -0
  92. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/project.py +0 -0
  93. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/py.typed +0 -0
  94. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/rowan_rdkit/__init__.py +0 -0
  95. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/rowan_rdkit/chem_utils.py +0 -0
  96. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/types.py +0 -0
  97. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/user.py +0 -0
  98. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/utils.py +0 -0
  99. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/admet.py +0 -0
  100. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/analogue_docking.py +0 -0
  101. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/base.py +0 -0
  102. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/basic_calculation.py +0 -0
  103. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/batch_docking.py +0 -0
  104. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/bde.py +0 -0
  105. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/conformer_search.py +0 -0
  106. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/constants.py +0 -0
  107. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/descriptors.py +0 -0
  108. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/docking.py +0 -0
  109. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/double_ended_ts_search.py +0 -0
  110. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/fukui.py +0 -0
  111. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
  112. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/interaction_energy_decomposition.py +0 -0
  113. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/ion_mobility.py +0 -0
  114. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/irc.py +0 -0
  115. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/macropka.py +0 -0
  116. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/membrane_permeability.py +0 -0
  117. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/msa.py +0 -0
  118. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/multistage_optimization.py +0 -0
  119. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/nmr.py +0 -0
  120. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/pose_analysis_md.py +0 -0
  121. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/protein_binder_design.py +0 -0
  122. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/protein_cofolding.py +0 -0
  123. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/protein_md.py +0 -0
  124. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/rbfe_graph.py +0 -0
  125. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/redox_potential.py +0 -0
  126. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/relative_binding_free_energy_perturbation.py +0 -0
  127. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/scan.py +0 -0
  128. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/solubility.py +0 -0
  129. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/solvent_dependent_conformers.py +0 -0
  130. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/spin_states.py +0 -0
  131. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/strain.py +0 -0
  132. {rowan_python-3.0.5 → rowan_python-3.0.7}/rowan/workflows/tautomer_search.py +0 -0
@@ -199,9 +199,6 @@ local/
199
199
 
200
200
  cyp/
201
201
 
202
- # AI agent instructions (not part of the project source)
203
- AGENTS.md
204
-
205
202
  # MSA download output directories
206
203
  msa_directory/
207
204
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rowan-python
3
- Version: 3.0.5
3
+ Version: 3.0.7
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
@@ -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, 2.0230, 2.0230),
25
- (2.0230, 0.0, 2.0230),
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, # Hartree; SSSP efficiency recommends ~7–9 Ha for Al
39
- kpoints=(4, 4, 4), # Monkhorst–Pack grid; increase for production runs
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, # Hartree smearing width
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}")