rowan-python 3.1.14__tar.gz → 3.1.15__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 (268) hide show
  1. {rowan_python-3.1.14 → rowan_python-3.1.15}/PKG-INFO +2 -2
  2. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/analogue-docking.md +3 -0
  3. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/batch-docking.md +4 -0
  4. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/docking.md +10 -0
  5. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/binding_affinity.py +1 -1
  6. rowan_python-3.1.15/examples/induced_fit_docking.py +61 -0
  7. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/pose_analysis_md.py +6 -2
  8. rowan_python-3.1.15/examples/protein_cofolding_modified_inputs.py +44 -0
  9. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/protein_md.py +4 -0
  10. rowan_python-3.1.15/examples/temporary_workflow_sharing.py +19 -0
  11. {rowan_python-3.1.14 → rowan_python-3.1.15}/pixi.lock +16 -16
  12. {rowan_python-3.1.14 → rowan_python-3.1.15}/pyproject.toml +2 -2
  13. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/__init__.py +6 -1
  14. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/__init__.py +6 -0
  15. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/analogue_docking.py +1 -4
  16. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/base.py +77 -4
  17. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/batch_docking.py +31 -0
  18. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/binding_affinity.py +1 -6
  19. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/docking.py +66 -1
  20. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/pose_analysis_md.py +13 -1
  21. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/protein_cofolding.py +24 -7
  22. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/protein_md.py +9 -0
  23. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/solvent_dependent_conformers.py +8 -0
  24. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/tautomer_search.py +7 -1
  25. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/SKILL.md +1 -1
  26. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/analogue_docking.md +5 -6
  27. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/batch_docking.md +8 -0
  28. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/binding_affinity.md +1 -2
  29. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/docking.md +24 -0
  30. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/pose_analysis_md.md +1 -1
  31. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/protein_cofolding.md +12 -5
  32. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/protein_md.md +1 -1
  33. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/python_sdk.md +20 -0
  34. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/solvent_dependent_conformers.md +2 -1
  35. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/tautomer_search.md +1 -0
  36. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_binding_affinity.py +1 -1
  37. rowan_python-3.1.15/tests/test_cofolding_workflow_updates.py +121 -0
  38. rowan_python-3.1.15/tests/test_docking_workflow.py +150 -0
  39. rowan_python-3.1.15/tests/test_docking_workflow_updates.py +117 -0
  40. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_md_workflow_updates.py +30 -4
  41. rowan_python-3.1.15/tests/test_solvent_dependent_conformers.py +87 -0
  42. rowan_python-3.1.15/tests/test_tautomer_search.py +51 -0
  43. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_workflow_submission.py +76 -0
  44. {rowan_python-3.1.14 → rowan_python-3.1.15}/.agents/plugins/marketplace.json +0 -0
  45. {rowan_python-3.1.14 → rowan_python-3.1.15}/.claude-plugin/marketplace.json +0 -0
  46. {rowan_python-3.1.14 → rowan_python-3.1.15}/.codex-plugin/plugin.json +0 -0
  47. {rowan_python-3.1.14 → rowan_python-3.1.15}/.envrc +0 -0
  48. {rowan_python-3.1.14 → rowan_python-3.1.15}/.github/workflows/build-and-deploy-docs.yml +0 -0
  49. {rowan_python-3.1.14 → rowan_python-3.1.15}/.github/workflows/publish-skill.yml +0 -0
  50. {rowan_python-3.1.14 → rowan_python-3.1.15}/.github/workflows/python-publish.yml +0 -0
  51. {rowan_python-3.1.14 → rowan_python-3.1.15}/.github/workflows/test.yml +0 -0
  52. {rowan_python-3.1.14 → rowan_python-3.1.15}/.gitignore +0 -0
  53. {rowan_python-3.1.14 → rowan_python-3.1.15}/.pre-commit-config.yaml +0 -0
  54. {rowan_python-3.1.14 → rowan_python-3.1.15}/AGENTS.md +0 -0
  55. {rowan_python-3.1.14 → rowan_python-3.1.15}/CLAUDE.md +0 -0
  56. {rowan_python-3.1.14 → rowan_python-3.1.15}/GEMINI.md +0 -0
  57. {rowan_python-3.1.14 → rowan_python-3.1.15}/LICENSE +0 -0
  58. {rowan_python-3.1.14 → rowan_python-3.1.15}/README.md +0 -0
  59. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/api-keys.md +0 -0
  60. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/calculation.md +0 -0
  61. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/folder.md +0 -0
  62. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/molecule.md +0 -0
  63. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/project.md +0 -0
  64. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/protein.md +0 -0
  65. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/user.md +0 -0
  66. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/webhooks.md +0 -0
  67. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/api/workflow.md +0 -0
  68. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/images/RowanLogoLarge.png +0 -0
  69. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/images/RowanSquareLogo.png +0 -0
  70. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/images/favicon.svg +0 -0
  71. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/index.md +0 -0
  72. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/stylesheets/colors.css +0 -0
  73. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/admet.md +0 -0
  74. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/basic-calculation.md +0 -0
  75. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/binding-affinity.md +0 -0
  76. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/bond-dissociation-energy.md +0 -0
  77. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/conformer-search-settings.md +0 -0
  78. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/conformer-search.md +0 -0
  79. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/covalent-inhibitor-scan.md +0 -0
  80. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/descriptors.md +0 -0
  81. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/double-ended-ts-search.md +0 -0
  82. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/electronic-properties.md +0 -0
  83. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/fukui.md +0 -0
  84. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/hydrogen-bond-donor-acceptor-strength.md +0 -0
  85. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/interaction-energy-decomposition.md +0 -0
  86. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/ion-mobility.md +0 -0
  87. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/irc.md +0 -0
  88. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/logp.md +0 -0
  89. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/macropka.md +0 -0
  90. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/membrane-permeability.md +0 -0
  91. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/msa.md +0 -0
  92. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/multistage-optimization.md +0 -0
  93. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/nmr.md +0 -0
  94. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/pka.md +0 -0
  95. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/pocket-detection.md +0 -0
  96. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/pose-analysis-md.md +0 -0
  97. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/protein-binder-design.md +0 -0
  98. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/protein-cofolding.md +0 -0
  99. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/protein-md.md +0 -0
  100. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/protein-preparation.md +0 -0
  101. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/rbfe-graph.md +0 -0
  102. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/redox-potential.md +0 -0
  103. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/relative-binding-free-energy-perturbation.md +0 -0
  104. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/scan.md +0 -0
  105. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/settings.md +0 -0
  106. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/solubility.md +0 -0
  107. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/solvent-dependent-conformers.md +0 -0
  108. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/spin-states.md +0 -0
  109. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/strain.md +0 -0
  110. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/tautomer-search.md +0 -0
  111. {rowan_python-3.1.14 → rowan_python-3.1.15}/docs/workflows/types.md +0 -0
  112. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/PROTAC_solubility.py +0 -0
  113. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/admet.py +0 -0
  114. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/analogue_docking.py +0 -0
  115. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/aqueous_solubility.py +0 -0
  116. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/basic_calculation.py +0 -0
  117. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/basic_calculation_from_json.py +0 -0
  118. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/basic_calculation_with_constraint.py +0 -0
  119. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/basic_calculation_with_solvent.py +0 -0
  120. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/batch_docking.py +0 -0
  121. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/batch_solubility.py +0 -0
  122. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/bde.py +0 -0
  123. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/boltz_paired_msa.py +0 -0
  124. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/boltz_single_msa.py +0 -0
  125. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/chai_paired_msa.py +0 -0
  126. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/chai_single_msa.py +0 -0
  127. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/cofolding_screen.py +0 -0
  128. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/colabfold_paired_msa.py +0 -0
  129. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/colabfold_single_msa.py +0 -0
  130. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/conformer_dependent_redox.py +0 -0
  131. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/conformers.py +0 -0
  132. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/conformers_screen.py +0 -0
  133. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/covalent_docking.py +0 -0
  134. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/covalent_inhibitor_scan.py +0 -0
  135. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/data/1iep_receptorH.pdb +0 -0
  136. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/data/Al_FCC.xyz +0 -0
  137. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/data/citalopram_1iep.xyz +0 -0
  138. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/data/ibuprofen_conformers.sdf +0 -0
  139. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/data/tyk2_ligands.sdf +0 -0
  140. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/data/tyk2_structure.pdb +0 -0
  141. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/data/workflow_example.json +0 -0
  142. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/dcd_download.py +0 -0
  143. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/descriptors.py +0 -0
  144. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/docking.py +0 -0
  145. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/docking_screen.py +0 -0
  146. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/double_ended_ts_search.py +0 -0
  147. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/electronic_properties.py +0 -0
  148. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/estimate_workflow.py +0 -0
  149. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/fukui_index.py +0 -0
  150. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/hydrogen_bond_basicity.py +0 -0
  151. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/interaction_energy_decomposition.py +0 -0
  152. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/ion_mobility.py +0 -0
  153. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/irc.py +0 -0
  154. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/logp.py +0 -0
  155. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/macropka.py +0 -0
  156. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/membrane_permeability.py +0 -0
  157. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/multistage_optimization.py +0 -0
  158. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/nmr.py +0 -0
  159. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/optimization.py +0 -0
  160. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/pdb_download.py +0 -0
  161. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/periodic_dft.py +0 -0
  162. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/phenol_pka.py +0 -0
  163. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/pka.py +0 -0
  164. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/pocket_detection.py +0 -0
  165. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/project_scoped_api_key.py +0 -0
  166. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/protein_binder_design.py +0 -0
  167. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/protein_cofolding.py +0 -0
  168. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/protein_cofolding_with_constraints.py +0 -0
  169. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/protein_cofolding_with_templates.py +0 -0
  170. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/protein_preparation.py +0 -0
  171. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/rbfe_graph.py +0 -0
  172. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/rbfe_resubmit.py +0 -0
  173. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/redox_potential.py +0 -0
  174. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/relative_binding_free_energy_perturbation.py +0 -0
  175. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/resubmit_with_perturbations.py +0 -0
  176. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/retrieve_workflow.py +0 -0
  177. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/scan.py +0 -0
  178. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/solvent_dependent_conformers.py +0 -0
  179. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/spin_states.py +0 -0
  180. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/strain.py +0 -0
  181. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/tautomer.py +0 -0
  182. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/template.py +0 -0
  183. {rowan_python-3.1.14 → rowan_python-3.1.15}/examples/webhook.py +0 -0
  184. {rowan_python-3.1.14 → rowan_python-3.1.15}/mkdocs.yml +0 -0
  185. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/api_keys.py +0 -0
  186. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/calculation.py +0 -0
  187. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/config.py +0 -0
  188. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/constants.py +0 -0
  189. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/folder.py +0 -0
  190. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/molecule.py +0 -0
  191. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/project.py +0 -0
  192. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/protein.py +0 -0
  193. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/py.typed +0 -0
  194. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/types.py +0 -0
  195. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/user.py +0 -0
  196. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/utils.py +0 -0
  197. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/_molecular_dynamics.py +0 -0
  198. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/admet.py +0 -0
  199. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/basic_calculation.py +0 -0
  200. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/bde.py +0 -0
  201. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/conformer_search.py +0 -0
  202. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/constants.py +0 -0
  203. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/covalent_inhibitor_scan.py +0 -0
  204. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/descriptors.py +0 -0
  205. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/double_ended_ts_search.py +0 -0
  206. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/electronic_properties.py +0 -0
  207. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/fukui.py +0 -0
  208. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
  209. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/interaction_energy_decomposition.py +0 -0
  210. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/ion_mobility.py +0 -0
  211. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/irc.py +0 -0
  212. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/logp.py +0 -0
  213. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/macropka.py +0 -0
  214. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/membrane_permeability.py +0 -0
  215. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/msa.py +0 -0
  216. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/multistage_optimization.py +0 -0
  217. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/nmr.py +0 -0
  218. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/pka.py +0 -0
  219. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/pocket_detection.py +0 -0
  220. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/protein_binder_design.py +0 -0
  221. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/protein_preparation.py +0 -0
  222. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/rbfe_graph.py +0 -0
  223. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/redox_potential.py +0 -0
  224. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/relative_binding_free_energy_perturbation.py +0 -0
  225. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/scan.py +0 -0
  226. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/solubility.py +0 -0
  227. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/spin_states.py +0 -0
  228. {rowan_python-3.1.14 → rowan_python-3.1.15}/rowan/workflows/strain.py +0 -0
  229. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/.claude-plugin/plugin.json +0 -0
  230. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/admet.md +0 -0
  231. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/basic_calculation.md +0 -0
  232. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/bde.md +0 -0
  233. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/conformer_search.md +0 -0
  234. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/covalent_inhibitor_scan.md +0 -0
  235. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/descriptors.md +0 -0
  236. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/double_ended_ts_search.md +0 -0
  237. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/electronic_properties.md +0 -0
  238. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/folders_and_projects.md +0 -0
  239. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/fukui.md +0 -0
  240. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/hydrogen_bond_donor_acceptor_strength.md +0 -0
  241. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/interaction_energy_decomposition.md +0 -0
  242. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/ion_mobility.md +0 -0
  243. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/irc.md +0 -0
  244. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/logp.md +0 -0
  245. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/macropka.md +0 -0
  246. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/mcp_execution.md +0 -0
  247. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/membrane_permeability.md +0 -0
  248. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/msa.md +0 -0
  249. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/multistage_optimization.md +0 -0
  250. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/nmr.md +0 -0
  251. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/pka.md +0 -0
  252. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/pocket_detection.md +0 -0
  253. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/protein_binder_design.md +0 -0
  254. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/protein_preparation.md +0 -0
  255. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/rbfe_graph.md +0 -0
  256. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/redox_potential.md +0 -0
  257. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/relative_binding_free_energy_perturbation.md +0 -0
  258. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/scan.md +0 -0
  259. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/solubility.md +0 -0
  260. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/spin_states.md +0 -0
  261. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/strain.md +0 -0
  262. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/reference/webhooks.md +0 -0
  263. {rowan_python-3.1.14 → rowan_python-3.1.15}/skills/computational-chemistry-and-biology/scripts/check_env.py +0 -0
  264. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_macropka_nmr.py +0 -0
  265. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_mango_forcefields.py +0 -0
  266. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_plugin.py +0 -0
  267. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_protein.py +0 -0
  268. {rowan_python-3.1.14 → rowan_python-3.1.15}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rowan-python
3
- Version: 3.1.14
3
+ Version: 3.1.15
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
@@ -11,7 +11,7 @@ Requires-Dist: httpx
11
11
  Requires-Dist: nest-asyncio
12
12
  Requires-Dist: rdkit
13
13
  Requires-Dist: setuptools
14
- Requires-Dist: stjames>=0.0.257
14
+ Requires-Dist: stjames>=0.0.261
15
15
  Description-Content-Type: text/markdown
16
16
 
17
17
  # Rowan Python Library
@@ -1,5 +1,8 @@
1
1
  # Analogue Docking
2
2
 
3
+ Analogue docking generates at most 20 conformers per analogue by default. Override
4
+ `num_conformers_per_analogue` when a broader search is needed.
5
+
3
6
  ::: rowan.workflows.analogue_docking
4
7
  handler: python
5
8
  options:
@@ -1,5 +1,9 @@
1
1
  # Batch Docking
2
2
 
3
+ Use `num_poses_to_save` to retain the best pose for that many top-scoring compounds, and set
4
+ `run_mmgbsa=True` to refine those saved poses. `result.refined_scores` maps every input SMILES
5
+ to a `DockingScore` for a retained compound or `None` otherwise.
6
+
3
7
  ::: rowan.workflows.batch_docking
4
8
  handler: python
5
9
  options:
@@ -3,6 +3,16 @@
3
3
  The docking workflow supports Vina docking and both noncovalent and covalent gnina docking.
4
4
  Passing `GninaSettings` selects gnina; it does not by itself enable covalent docking.
5
5
 
6
+ ## Induced-fit docking
7
+
8
+ Pass `rowan.InducedFitSettings()` to `induced_fit_settings` when nearby receptor side chains may
9
+ need to relax around the ligand. Induced fit requires Vina or QVina2 and adds substantial work
10
+ beyond rigid docking.
11
+
12
+ Results contain both rigid and induced-receptor poses ranked by `induced_fit_score`. Use
13
+ `get_induced_receptor()` or `get_induced_receptors()` to retrieve the relaxed receptors associated
14
+ with induced poses. See `examples/induced_fit_docking.py` for a complete example.
15
+
6
16
  ## Covalent docking
7
17
 
8
18
  Set both covalent atom indices on `GninaSettings` to form a bond between a known ligand atom and
@@ -25,4 +25,4 @@ for name, score in zip(ligands.keys(), result.scores, strict=False):
25
25
  if score is None:
26
26
  print(f"{name}: scoring failed")
27
27
  continue
28
- print(f"{name}: {score.binding_affinity:.2f} kcal/mol (strain: {score.strain})")
28
+ print(f"{name}: {score.binding_affinity:.2f} kcal/mol")
@@ -0,0 +1,61 @@
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
+ # Dasatinib — redocked into its own ABL1 co-crystal structure (PDB: 2GQG)
8
+ dasatinib = rowan.Molecule.from_smiles("Cc1nc(Nc2ncc(C(=O)Nc3c(C)cccc3Cl)s2)cc(N2CCN(CCO)CC2)n1")
9
+
10
+ protein = rowan.create_protein_from_pdb_id("2GQG")
11
+ protein = protein.select_chains(["A"])
12
+ preparation_workflow = rowan.submit_protein_preparation_workflow(
13
+ protein=protein.uuid,
14
+ add_missing_method="pdbfixer",
15
+ name="Prepare ABL1",
16
+ folder=folder,
17
+ )
18
+ prepared_protein_uuid = preparation_workflow.result().prepared_protein_uuid
19
+
20
+ # Pocket is [[center_x, center_y, center_z], [size_x, size_y, size_z]] in Å.
21
+ center = [44.59, 79.75, 39.59]
22
+ size = [24.15, 21.33, 19.88]
23
+
24
+ # Induced-fit docking soft-docks candidate poses, relaxes the receptor around each with
25
+ # restrained local minimization, and redocks into the relaxed receptor. It requires
26
+ # VinaSettings with executable="vina" or "qvina2" (the default is "vina").
27
+ induced_fit_settings = rowan.InducedFitSettings(
28
+ max_receptors=6,
29
+ flexible_sidechain_radius=5.0,
30
+ )
31
+
32
+ workflow = rowan.submit_docking_workflow(
33
+ prepared_protein_uuid,
34
+ pocket=[center, size],
35
+ initial_molecule=dasatinib,
36
+ induced_fit_settings=induced_fit_settings,
37
+ name="Dasatinib induced-fit docking",
38
+ folder=folder,
39
+ )
40
+
41
+ print(f"View workflow privately at: https://labs.rowansci.com/docking/{workflow.uuid}")
42
+
43
+ result = workflow.result()
44
+ print(result)
45
+
46
+ # With induced-fit docking, poses are ranked by induced_fit_score rather than raw docking score.
47
+ for i, score in enumerate(result.scores):
48
+ print(
49
+ f" Pose {i}: induced_fit_score={score.induced_fit_score:.3f} "
50
+ f"score={score.score:.3f} receptor_strain={score.receptor_strain}"
51
+ )
52
+
53
+ # Download the top-scoring complex and best-ranked relaxed receptor as PDBs
54
+ complex_protein = result.get_complex(0)
55
+ complex_protein.download_pdb_file(name="dasatinib_2GQG_induced_complex")
56
+ print("Saved dasatinib_2GQG_induced_complex.pdb")
57
+
58
+ induced_receptors = result.get_induced_receptors()
59
+ if induced_receptors:
60
+ induced_receptors[0].download_pdb_file(name="dasatinib_2GQG_induced_receptor")
61
+ print("Saved dasatinib_2GQG_induced_receptor.pdb")
@@ -45,5 +45,9 @@ print(
45
45
  )
46
46
  md_result = md_workflow.result()
47
47
 
48
- # print ligand RMSD by frame
49
- print(md_result.trajectories[0].ligand_rmsd)
48
+ trajectory = md_result.trajectories[0]
49
+ print(f"Ligand RMSD: {trajectory.ligand_rmsd}")
50
+ print(f"Protein RMSD: {trajectory.protein_rmsd}")
51
+ print(f"Protein RMSF: {trajectory.rmsf}")
52
+ print(f"Potential energy: {trajectory.potential_energy} Hartree")
53
+ print(f"MM/GBSA scores: {trajectory.mmgbsa_scores} kcal/mol")
@@ -0,0 +1,44 @@
1
+ """Cofolding with modified polymers and a covalent bond constraint."""
2
+
3
+ import rowan
4
+
5
+ # Set your API key or use the ROWAN_API_KEY environment variable.
6
+ # rowan.api_key = "rowan-sk..."
7
+ folder = rowan.get_folder("examples")
8
+
9
+ protein = rowan.ProteinSequence(
10
+ sequence="ASA",
11
+ modifications=[rowan.ResidueModification(position=1, ccd="SEP")],
12
+ )
13
+ dna = rowan.DNASequence(
14
+ sequence="AC",
15
+ modifications=[rowan.NucleotideModification(position=1, ccd="5MC")],
16
+ )
17
+ rna = rowan.RNASequence(
18
+ sequence="AU",
19
+ modifications=[rowan.NucleotideModification(position=1, ccd="PSU")],
20
+ )
21
+
22
+ protein_atom = rowan.ConstraintTarget(
23
+ input_type="protein", input_index=0, token_index=1, atom_name="OG"
24
+ )
25
+ ligand_atom = rowan.ConstraintTarget(input_type="ligand", input_index=0, token_index=0)
26
+ covalent_bond = rowan.BondConstraint(atom_1=protein_atom, atom_2=ligand_atom)
27
+
28
+ workflow = rowan.submit_protein_cofolding_workflow(
29
+ initial_protein_sequences=[protein],
30
+ initial_dna_sequences=[dna],
31
+ initial_rna_sequences=[rna],
32
+ initial_smiles_list=["CBr"],
33
+ bond_constraints=[covalent_bond],
34
+ model=rowan.CofoldingModel.BOLTZ_2,
35
+ num_samples=1,
36
+ name="Modified polymers with covalent constraint",
37
+ folder=folder,
38
+ )
39
+
40
+ print(f"View workflow privately at: https://labs.rowansci.com/protein-cofolding/{workflow.uuid}")
41
+ result = workflow.result()
42
+ print(result)
43
+ for i, prediction in enumerate(result.predictions):
44
+ print(f" sample {i}: scores={prediction.scores}")
@@ -21,3 +21,7 @@ md_workflow = rowan.submit_protein_md_workflow(
21
21
  )
22
22
 
23
23
  print(f"View MD workflow privately at: https://labs.rowansci.com/protein-md/{md_workflow.uuid}")
24
+ trajectory = md_workflow.result().trajectories[0]
25
+ print(f"Protein RMSD: {trajectory.protein_rmsd}")
26
+ print(f"Protein RMSF: {trajectory.rmsf}")
27
+ print(f"Potential energy: {trajectory.potential_energy} Hartree")
@@ -0,0 +1,19 @@
1
+ """Example: temporarily share a workflow with anyone who has its link."""
2
+
3
+ import rowan
4
+
5
+ # Set your API key or use the ROWAN_API_KEY environment variable.
6
+ # rowan.api_key = "rowan-sk..."
7
+
8
+ workflow = rowan.retrieve_workflow("your-workflow-uuid")
9
+
10
+ # Temporary shares can last for up to 120 minutes. This does not make the workflow
11
+ # permanently public: `workflow.public` remains unchanged.
12
+ workflow = workflow.temporarily_share(duration_minutes=60)
13
+
14
+ print(f"Share URL: https://labs.rowansci.com/workflow/{workflow.uuid}")
15
+ print(f"Public until: {workflow.public_until}")
16
+ print(f"Temporary share active: {workflow.is_temporarily_public}")
17
+
18
+ # End access before the expiration time if needed.
19
+ # workflow = workflow.end_temporary_share()
@@ -51,6 +51,7 @@ environments:
51
51
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
52
52
  - pypi: https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl
53
53
  - pypi: https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
54
+ - pypi: https://files.pythonhosted.org/packages/65/e8/891341b63e2bb9e2aa3950583fa05182c572e80ec0d9542af24d57f0e923/stjames-0.0.263-py3-none-any.whl
54
55
  - pypi: https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl
55
56
  - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
56
57
  - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl
@@ -59,7 +60,6 @@ environments:
59
60
  - pypi: https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl
60
61
  - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl
61
62
  - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl
62
- - pypi: https://files.pythonhosted.org/packages/a2/38/803820d0533c768bc8da6519ca0cd76a82e36c413a3c1eeaf22aa524af6d/stjames-0.0.260-py3-none-any.whl
63
63
  - pypi: https://files.pythonhosted.org/packages/c7/99/461bd36dbdfac6c1c53efa370bd55a83227542d0d118f1677dbf1a3dacd5/numpy-2.5.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
64
64
  - pypi: https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl
65
65
  - pypi: https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
@@ -93,6 +93,7 @@ environments:
93
93
  - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl
94
94
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
95
95
  - pypi: https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl
96
+ - pypi: https://files.pythonhosted.org/packages/65/e8/891341b63e2bb9e2aa3950583fa05182c572e80ec0d9542af24d57f0e923/stjames-0.0.263-py3-none-any.whl
96
97
  - pypi: https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl
97
98
  - pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
98
99
  - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl
@@ -100,7 +101,6 @@ environments:
100
101
  - pypi: https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl
101
102
  - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl
102
103
  - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl
103
- - pypi: https://files.pythonhosted.org/packages/a2/38/803820d0533c768bc8da6519ca0cd76a82e36c413a3c1eeaf22aa524af6d/stjames-0.0.260-py3-none-any.whl
104
104
  - pypi: https://files.pythonhosted.org/packages/ae/d5/d8a4eb6d6c7f66b91dd37c576d76e9e60fba900caf5372c17bcf949febc2/pydantic_core-2.46.5-cp314-cp314-macosx_11_0_arm64.whl
105
105
  - pypi: https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl
106
106
  - pypi: https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl
@@ -170,6 +170,7 @@ environments:
170
170
  - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
171
171
  - pypi: https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl
172
172
  - pypi: https://files.pythonhosted.org/packages/64/69/4a5af2bc115a9a33fefe51709749de8262be3f9ba063d1753a837cdbc49c/markdown-3.10.3-py3-none-any.whl
173
+ - pypi: https://files.pythonhosted.org/packages/65/e8/891341b63e2bb9e2aa3950583fa05182c572e80ec0d9542af24d57f0e923/stjames-0.0.263-py3-none-any.whl
173
174
  - pypi: https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl
174
175
  - pypi: https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl
175
176
  - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl
@@ -194,7 +195,6 @@ environments:
194
195
  - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
195
196
  - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl
196
197
  - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl
197
- - pypi: https://files.pythonhosted.org/packages/a2/38/803820d0533c768bc8da6519ca0cd76a82e36c413a3c1eeaf22aa524af6d/stjames-0.0.260-py3-none-any.whl
198
198
  - pypi: https://files.pythonhosted.org/packages/a3/9c/a1bda6439c19c4783d50df896142b67b9e7d432db36675d339a32778669d/coverage-7.16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
199
199
  - pypi: https://files.pythonhosted.org/packages/a6/43/9f45ec4d14e596efc32c925a78104934790438b0c0628b70d741016734ad/pymdown_extensions-11.0.2-py3-none-any.whl
200
200
  - pypi: https://files.pythonhosted.org/packages/ad/21/17c1bc9e6f47c972ad66fb2ac2568f99f90f1207eeb6fc3b34d094dba7b5/mkdocs_material-9.7.7-py3-none-any.whl
@@ -277,6 +277,7 @@ environments:
277
277
  - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl
278
278
  - pypi: https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl
279
279
  - pypi: https://files.pythonhosted.org/packages/64/69/4a5af2bc115a9a33fefe51709749de8262be3f9ba063d1753a837cdbc49c/markdown-3.10.3-py3-none-any.whl
280
+ - pypi: https://files.pythonhosted.org/packages/65/e8/891341b63e2bb9e2aa3950583fa05182c572e80ec0d9542af24d57f0e923/stjames-0.0.263-py3-none-any.whl
280
281
  - pypi: https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl
281
282
  - pypi: https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl
282
283
  - pypi: https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl
@@ -298,7 +299,6 @@ environments:
298
299
  - pypi: https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl
299
300
  - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl
300
301
  - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl
301
- - pypi: https://files.pythonhosted.org/packages/a2/38/803820d0533c768bc8da6519ca0cd76a82e36c413a3c1eeaf22aa524af6d/stjames-0.0.260-py3-none-any.whl
302
302
  - pypi: https://files.pythonhosted.org/packages/a6/43/9f45ec4d14e596efc32c925a78104934790438b0c0628b70d741016734ad/pymdown_extensions-11.0.2-py3-none-any.whl
303
303
  - pypi: https://files.pythonhosted.org/packages/a6/e9/6e8be8df02b35d85e2b8809f7f1cfa290bdf5882b55127a539d049482db0/ast_serialize-0.8.0-cp39-abi3-macosx_11_0_arm64.whl
304
304
  - pypi: https://files.pythonhosted.org/packages/ad/21/17c1bc9e6f47c972ad66fb2ac2568f99f90f1207eeb6fc3b34d094dba7b5/mkdocs_material-9.7.7-py3-none-any.whl
@@ -912,7 +912,7 @@ packages:
912
912
  name: rowan-python
913
913
  requires_dist:
914
914
  - httpx
915
- - stjames>=0.0.257
915
+ - stjames>=0.0.261
916
916
  - setuptools
917
917
  - rdkit
918
918
  - nest-asyncio
@@ -1293,6 +1293,17 @@ packages:
1293
1293
  - mkdocs-section-index ; extra == 'docs'
1294
1294
  - mkdocs-literate-nav ; extra == 'docs'
1295
1295
  requires_python: '>=3.10'
1296
+ - pypi: https://files.pythonhosted.org/packages/65/e8/891341b63e2bb9e2aa3950583fa05182c572e80ec0d9542af24d57f0e923/stjames-0.0.263-py3-none-any.whl
1297
+ name: stjames
1298
+ version: 0.0.263
1299
+ sha256: 3b5f1e79a8de0f73e1940f132a8546f6530a7925fe78b7a16d405ab14516e8cf
1300
+ requires_dist:
1301
+ - pydantic>=2.4
1302
+ - numpy
1303
+ - requests
1304
+ - more-itertools
1305
+ - rdkit ; extra == 'rdkit'
1306
+ requires_python: '>=3.11'
1296
1307
  - pypi: https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl
1297
1308
  name: typing-inspection
1298
1309
  version: 0.4.4
@@ -1627,17 +1638,6 @@ packages:
1627
1638
  - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks'
1628
1639
  - chardet>=3.0.2,<8 ; extra == 'use-chardet-on-py3'
1629
1640
  requires_python: '>=3.10'
1630
- - pypi: https://files.pythonhosted.org/packages/a2/38/803820d0533c768bc8da6519ca0cd76a82e36c413a3c1eeaf22aa524af6d/stjames-0.0.260-py3-none-any.whl
1631
- name: stjames
1632
- version: 0.0.260
1633
- sha256: 17a4b3ed20399b2e8a789a39615e40cb30ee8d2a58665b855989f5a4f32c5706
1634
- requires_dist:
1635
- - pydantic>=2.4
1636
- - numpy
1637
- - requests
1638
- - more-itertools
1639
- - rdkit ; extra == 'rdkit'
1640
- requires_python: '>=3.11'
1641
1641
  - pypi: https://files.pythonhosted.org/packages/a3/9c/a1bda6439c19c4783d50df896142b67b9e7d432db36675d339a32778669d/coverage-7.16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
1642
1642
  name: coverage
1643
1643
  version: 7.16.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rowan-python"
3
- version = "3.1.14"
3
+ version = "3.1.15"
4
4
  description = "Rowan Python Library"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -9,7 +9,7 @@ authors = [
9
9
  ]
10
10
  dependencies = [
11
11
  "httpx",
12
- "stjames>=0.0.257",
12
+ "stjames>=0.0.261",
13
13
  "setuptools",
14
14
  "rdkit",
15
15
  "nest-asyncio",
@@ -15,6 +15,7 @@ from stjames import (
15
15
  ConformerClusteringSettings,
16
16
  ConformerGenSettingsUnion,
17
17
  Correction,
18
+ DNASequence,
18
19
  DockingSettings,
19
20
  Engine,
20
21
  ETKDGSettings,
@@ -22,6 +23,7 @@ from stjames import (
22
23
  GninaSettings,
23
24
  GreedyClusteringSettings,
24
25
  iMTDSettings,
26
+ InducedFitSettings,
25
27
  KMeansClusteringSettings,
26
28
  Method,
27
29
  Mode,
@@ -29,12 +31,15 @@ from stjames import (
29
31
  MultiStageOptSettings,
30
32
  NessoAffinitySettings,
31
33
  NMR_SUPPORTED_SOLVENTS,
34
+ NucleotideModification,
32
35
  OpenConfSettings,
33
36
  OptimizationSettings,
34
37
  PBCDFTSettings,
35
38
  PeriodicCell,
36
39
  ProteinSequence,
37
40
  ProteinForceField,
41
+ ResidueModification,
42
+ RNASequence,
38
43
  ScanSettings,
39
44
  Settings,
40
45
  Solvent,
@@ -71,7 +76,7 @@ from .api_keys import *
71
76
  from .calculation import *
72
77
  from .folder import *
73
78
  from .molecule import *
74
- from .types import ProteinUUID, RdkitMol, StJamesMolecule, StructureInput
79
+ from .types import ProteinUUID, RdkitMol, SMILES, StJamesMolecule, StructureInput
75
80
  from .workflows import *
76
81
  from .project import *
77
82
  from .protein import *
@@ -110,13 +110,19 @@ from .protein_binder_design import (
110
110
  submit_protein_binder_design_workflow,
111
111
  )
112
112
  from .protein_cofolding import (
113
+ BondConstraint,
113
114
  CofoldingModel,
114
115
  CofoldingResult,
115
116
  CofoldingTemplate,
116
117
  ConstraintTarget,
117
118
  ContactConstraint,
119
+ DNASequence,
120
+ NucleotideModification,
118
121
  PocketConstraint,
119
122
  ProteinCofoldingResult,
123
+ ProteinSequence,
124
+ ResidueModification,
125
+ RNASequence,
120
126
  submit_protein_cofolding_workflow,
121
127
  )
122
128
  from .protein_md import ProteinMDResult, submit_protein_md_workflow
@@ -191,8 +191,7 @@ def submit_analogue_docking_workflow(
191
191
  scoring_function: Literal["vina", "vinardo"] = "vinardo",
192
192
  exhaustiveness: int = 8,
193
193
  max_poses: int = 4,
194
- num_conformers_per_analogue: int = 100,
195
- require_posebusters: bool = False,
194
+ num_conformers_per_analogue: int = 20,
196
195
  run_local_optimization: bool = False,
197
196
  name: str = "Analogue Docking Workflow",
198
197
  folder_uuid: str | None = None,
@@ -214,7 +213,6 @@ def submit_analogue_docking_workflow(
214
213
  :param exhaustiveness: How many times Vina attempts to find a pose for each conformer.
215
214
  :param max_poses: Maximum number of poses generated per input conformer.
216
215
  :param num_conformers_per_analogue: Maximum number of conformers to generate per analogue.
217
- :param require_posebusters: Filter conformers based on PoseBusters validity before docking.
218
216
  :param run_local_optimization: Whether to run a local opt in docking pocket or just score.
219
217
  :param name: Name of the workflow.
220
218
  :param folder_uuid: UUID of the folder to place the workflow in.
@@ -254,7 +252,6 @@ def submit_analogue_docking_workflow(
254
252
  protein=protein,
255
253
  docking_settings=docking_settings,
256
254
  num_conformers_per_analogue=num_conformers_per_analogue,
257
- require_posebusters=require_posebusters,
258
255
  run_local_optimization=run_local_optimization,
259
256
  )
260
257
 
@@ -75,9 +75,19 @@ class DispatchInfo:
75
75
 
76
76
 
77
77
  class WorkflowError(Exception):
78
- """Raised when a workflow fails or is stopped."""
78
+ """Raised when a workflow cannot return a result.
79
79
 
80
- pass
80
+ The complete backend log is available through :attr:`logfile` rather than being included in
81
+ the exception text. It provides diagnostic context only and is not a source of workflow result
82
+ values.
83
+
84
+ :param message: error summary
85
+ :param logfile: workflow log returned by the API, when available
86
+ """
87
+
88
+ def __init__(self, message: str, *, logfile: str = "") -> None:
89
+ self.logfile = logfile
90
+ super().__init__(message)
81
91
 
82
92
 
83
93
  @dataclass(slots=True, repr=False)
@@ -195,6 +205,8 @@ class Workflow(BaseModel):
195
205
  :param notes: Workflow notes.
196
206
  :param starred: Whether the workflow is starred.
197
207
  :param public: Whether the workflow is public.
208
+ :param public_until: Date and time until which the workflow is temporarily public.
209
+ :param is_temporarily_public: Whether temporary public access is currently active.
198
210
  :param workflow_type: Type of the workflow.
199
211
  :param data: Data of the workflow.
200
212
  :param email_when_complete: Whether to send an email when the workflow completes.
@@ -217,6 +229,8 @@ class Workflow(BaseModel):
217
229
  notes: str
218
230
  starred: bool
219
231
  public: bool
232
+ public_until: datetime | None = None
233
+ is_temporarily_public: bool = False
220
234
  workflow_type: str = Field(alias="object_type")
221
235
  data: dict[str, Any] | None = Field(default=None, alias="object_data")
222
236
  email_when_complete: bool
@@ -325,6 +339,58 @@ Workflow: {self.name}
325
339
 
326
340
  return self
327
341
 
342
+ def temporarily_share(self, duration_minutes: int, in_place: bool = False) -> Self:
343
+ """Temporarily make the workflow publicly accessible.
344
+
345
+ Temporary sharing does not change :attr:`public`. The returned workflow instead records
346
+ the expiration in :attr:`public_until` and reports the active state through
347
+ :attr:`is_temporarily_public`.
348
+
349
+ :param duration_minutes: Number of minutes to share the workflow, up to 120.
350
+ :param in_place: Whether to update the current instance in-place.
351
+ :returns: Workflow with the temporary sharing state returned by the API.
352
+ :raises HTTPError: If the API request fails.
353
+ """
354
+ with api_client() as client:
355
+ response = client.post(
356
+ f"/workflow/{self.uuid}/temporarily_share",
357
+ params={"duration_minutes": duration_minutes},
358
+ )
359
+ response.raise_for_status()
360
+ data = response.json()
361
+
362
+ if not in_place:
363
+ return type(self).model_validate(data)
364
+
365
+ updated_workflow = self.model_validate(data)
366
+ for field_name in type(self).model_fields:
367
+ setattr(self, field_name, getattr(updated_workflow, field_name))
368
+
369
+ return self
370
+
371
+ def end_temporary_share(self, in_place: bool = False) -> Self:
372
+ """End temporary public access to the workflow.
373
+
374
+ Permanent public access through :attr:`public` is unaffected.
375
+
376
+ :param in_place: Whether to update the current instance in-place.
377
+ :returns: Workflow with the temporary sharing state returned by the API.
378
+ :raises HTTPError: If the API request fails.
379
+ """
380
+ with api_client() as client:
381
+ response = client.post(f"/workflow/{self.uuid}/end_temporary_share")
382
+ response.raise_for_status()
383
+ data = response.json()
384
+
385
+ if not in_place:
386
+ return type(self).model_validate(data)
387
+
388
+ updated_workflow = self.model_validate(data)
389
+ for field_name in type(self).model_fields:
390
+ setattr(self, field_name, getattr(updated_workflow, field_name))
391
+
392
+ return self
393
+
328
394
  def done(self) -> bool:
329
395
  """
330
396
  Check if the workflow has finished (success, failure, or stopped).
@@ -350,7 +416,8 @@ Workflow: {self.name}
350
416
  If False, return immediately with whatever data is available.
351
417
  :param poll_interval: Seconds between status checks while waiting.
352
418
  :returns: WorkflowResult subclass with typed access to results.
353
- :raises WorkflowError: If the workflow failed or was stopped.
419
+ :raises WorkflowError: If the workflow failed or was stopped. Inspect the exception's
420
+ `logfile` attribute for the backend log.
354
421
  """
355
422
  if self.status == stjames.Status.DRAFT:
356
423
  raise WorkflowError(
@@ -365,7 +432,13 @@ Workflow: {self.name}
365
432
 
366
433
  if self.status in {stjames.Status.FAILED, stjames.Status.STOPPED}:
367
434
  status = self.status.name.lower()
368
- raise WorkflowError(f"Workflow '{self.name}' {status} (uuid={self.uuid})")
435
+ message = f"Workflow '{self.name}' {status} (uuid={self.uuid})"
436
+ if self.logfile:
437
+ message += ". See WorkflowError.logfile for diagnostic details."
438
+ raise WorkflowError(
439
+ message,
440
+ logfile=self.logfile,
441
+ )
369
442
 
370
443
  if not self.data:
371
444
  status = self.status.name.lower() if self.status else "unknown"
@@ -7,6 +7,7 @@ from ..protein import Protein
7
7
  from ..types import ProteinUUID
8
8
  from ..utils import api_client
9
9
  from .base import Workflow, WorkflowResult, register_result
10
+ from .docking import DockingScore
10
11
 
11
12
 
12
13
  @register_result("batch_docking")
@@ -33,6 +34,29 @@ class BatchDockingResult(WorkflowResult):
33
34
  padded = list(scores) + [None] * (len(smiles_list) - len(scores))
34
35
  return dict(zip(smiles_list, padded, strict=True))
35
36
 
37
+ @property
38
+ def refined_scores(self) -> dict[str, DockingScore | None]:
39
+ """Saved docking results indexed by input SMILES."""
40
+ smiles_list = self._workflow.initial_smiles_list
41
+ scores = self._workflow.refined_scores or []
42
+ padded = list(scores) + [None] * (len(smiles_list) - len(scores))
43
+ return {
44
+ smiles: (
45
+ DockingScore(
46
+ score=score.score,
47
+ pose=score.pose,
48
+ complex_pdb=score.complex_pdb,
49
+ posebusters_valid=score.posebusters_valid,
50
+ strain=score.strain,
51
+ rmsd=score.rmsd,
52
+ mmgbsa_score=score.mmgbsa_score,
53
+ )
54
+ if score is not None
55
+ else None
56
+ )
57
+ for smiles, score in zip(smiles_list, padded, strict=True)
58
+ }
59
+
36
60
 
37
61
  def submit_batch_docking_workflow(
38
62
  smiles_list: list[str],
@@ -41,6 +65,8 @@ def submit_batch_docking_workflow(
41
65
  executable: str = "vina",
42
66
  scoring_function: str = "vinardo",
43
67
  exhaustiveness: float = 8,
68
+ num_poses_to_save: int = 0,
69
+ run_mmgbsa: bool = False,
44
70
  name: str = "Batch Docking Workflow",
45
71
  folder_uuid: str | None = None,
46
72
  folder: Folder | None = None,
@@ -57,6 +83,9 @@ def submit_batch_docking_workflow(
57
83
  :param executable: Which docking implementation to use.
58
84
  :param scoring_function: Which docking scoring function to use.
59
85
  :param exhaustiveness: Docking exhaustiveness parameter.
86
+ :param num_poses_to_save: Number of top-scoring compounds whose best pose to save.
87
+ :param run_mmgbsa: Whether to refine the saved poses with MM/GBSA. Ignored when
88
+ `num_poses_to_save` is zero.
60
89
  :param name: Name of the workflow.
61
90
  :param folder_uuid: UUID of the folder to place the workflow in.
62
91
  :param folder: Folder object to store the workflow in.
@@ -84,6 +113,8 @@ def submit_batch_docking_workflow(
84
113
  protein=protein,
85
114
  pocket=pocket,
86
115
  docking_settings=docking_settings,
116
+ num_poses_to_save=num_poses_to_save,
117
+ run_mmgbsa=run_mmgbsa,
87
118
  )
88
119
 
89
120
  data = {
@@ -28,11 +28,9 @@ class BindingAffinityScore:
28
28
 
29
29
  :param binding_affinity: binding affinity in kcal/mol for SQM settings, or log10(M)
30
30
  for GNINA, AEV-PLIG, and NESSO settings.
31
- :param strain: strain energy in kcal/mol, or None if not computed
32
31
  """
33
32
 
34
33
  binding_affinity: float
35
- strain: float | None
36
34
 
37
35
 
38
36
  @register_result("binding_affinity")
@@ -50,10 +48,7 @@ class BindingAffinityResult(WorkflowResult):
50
48
  """Binding affinity scores in input order, with `None` for failed inputs."""
51
49
  return [
52
50
  (
53
- BindingAffinityScore(
54
- binding_affinity=result.binding_affinity,
55
- strain=result.strain,
56
- )
51
+ BindingAffinityScore(binding_affinity=result.binding_affinity)
57
52
  if result is not None
58
53
  else None
59
54
  )