rowan-python 3.1.8__tar.gz → 3.1.9__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 (192) hide show
  1. {rowan_python-3.1.8 → rowan_python-3.1.9}/PKG-INFO +2 -2
  2. {rowan_python-3.1.8 → rowan_python-3.1.9}/pixi.lock +46 -46
  3. {rowan_python-3.1.8 → rowan_python-3.1.9}/pyproject.toml +3 -2
  4. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/__init__.py +1 -0
  5. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/nmr.py +40 -2
  6. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/admet.md +1 -1
  7. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/analogue_docking.md +1 -1
  8. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/basic_calculation.md +2 -2
  9. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/batch_docking.md +1 -1
  10. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/bde.md +3 -3
  11. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/conformer_search.md +3 -3
  12. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/descriptors.md +3 -3
  13. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/docking.md +2 -2
  14. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/double_ended_ts_search.md +5 -3
  15. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/electronic_properties.md +1 -1
  16. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/folders_and_projects.md +15 -15
  17. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/fukui.md +1 -1
  18. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/hydrogen_bond_donor_acceptor_strength.md +1 -1
  19. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/interaction_energy_decomposition.md +3 -1
  20. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/ion_mobility.md +2 -2
  21. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/irc.md +2 -2
  22. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/macropka.md +1 -1
  23. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/mcp_execution.md +3 -3
  24. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/membrane_permeability.md +2 -2
  25. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/msa.md +2 -2
  26. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/multistage_optimization.md +1 -1
  27. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/nmr.md +3 -5
  28. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/pka.md +2 -2
  29. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/pocket_detection.md +1 -1
  30. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/pose_analysis_md.md +3 -3
  31. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/protein_binder_design.md +6 -3
  32. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/protein_cofolding.md +9 -7
  33. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/protein_md.md +4 -4
  34. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/protein_prep.md +10 -10
  35. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/python_sdk.md +9 -5
  36. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/rbfe_graph.md +2 -2
  37. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/redox_potential.md +1 -1
  38. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/relative_binding_free_energy_perturbation.md +1 -1
  39. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/scan.md +6 -4
  40. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/solubility.md +4 -2
  41. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/solvent_dependent_conformers.md +1 -1
  42. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/spin_states.md +2 -2
  43. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/strain.md +4 -2
  44. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/tautomer_search.md +1 -1
  45. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/webhooks.md +7 -7
  46. {rowan_python-3.1.8 → rowan_python-3.1.9}/.agents/plugins/marketplace.json +0 -0
  47. {rowan_python-3.1.8 → rowan_python-3.1.9}/.claude-plugin/marketplace.json +0 -0
  48. {rowan_python-3.1.8 → rowan_python-3.1.9}/.codex-plugin/plugin.json +0 -0
  49. {rowan_python-3.1.8 → rowan_python-3.1.9}/.envrc +0 -0
  50. {rowan_python-3.1.8 → rowan_python-3.1.9}/.github/workflows/build-and-deploy-docs.yml +0 -0
  51. {rowan_python-3.1.8 → rowan_python-3.1.9}/.github/workflows/publish-skill.yml +0 -0
  52. {rowan_python-3.1.8 → rowan_python-3.1.9}/.github/workflows/python-publish.yml +0 -0
  53. {rowan_python-3.1.8 → rowan_python-3.1.9}/.github/workflows/test.yml +0 -0
  54. {rowan_python-3.1.8 → rowan_python-3.1.9}/.gitignore +0 -0
  55. {rowan_python-3.1.8 → rowan_python-3.1.9}/.pre-commit-config.yaml +0 -0
  56. {rowan_python-3.1.8 → rowan_python-3.1.9}/AGENTS.md +0 -0
  57. {rowan_python-3.1.8 → rowan_python-3.1.9}/CLAUDE.md +0 -0
  58. {rowan_python-3.1.8 → rowan_python-3.1.9}/GEMINI.md +0 -0
  59. {rowan_python-3.1.8 → rowan_python-3.1.9}/LICENSE +0 -0
  60. {rowan_python-3.1.8 → rowan_python-3.1.9}/README.md +0 -0
  61. {rowan_python-3.1.8 → rowan_python-3.1.9}/docs/images/deciduous-tree-favicon.png +0 -0
  62. {rowan_python-3.1.8 → rowan_python-3.1.9}/docs/index.md +0 -0
  63. {rowan_python-3.1.8 → rowan_python-3.1.9}/docs/stylesheets/colors.css +0 -0
  64. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/PROTAC_solubility.py +0 -0
  65. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/admet.py +0 -0
  66. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/analogue_docking.py +0 -0
  67. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/aqueous_solubility.py +0 -0
  68. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/basic_calculation.py +0 -0
  69. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/basic_calculation_from_json.py +0 -0
  70. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/basic_calculation_with_constraint.py +0 -0
  71. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/basic_calculation_with_solvent.py +0 -0
  72. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/batch_docking.py +0 -0
  73. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/bde.py +0 -0
  74. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/binding_affinity.py +0 -0
  75. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/boltz_paired_msa.py +0 -0
  76. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/boltz_single_msa.py +0 -0
  77. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/chai_paired_msa.py +0 -0
  78. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/chai_single_msa.py +0 -0
  79. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/cofolding_screen.py +0 -0
  80. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/colabfold_paired_msa.py +0 -0
  81. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/colabfold_single_msa.py +0 -0
  82. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/conformer_dependent_redox.py +0 -0
  83. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/conformers.py +0 -0
  84. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/conformers_screen.py +0 -0
  85. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/covalent_docking.py +0 -0
  86. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/covalent_inhibitor_scan.py +0 -0
  87. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/data/1iep_receptorH.pdb +0 -0
  88. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/data/Al_FCC.xyz +0 -0
  89. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/data/citalopram_1iep.xyz +0 -0
  90. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/data/ibuprofen_conformers.sdf +0 -0
  91. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/data/tyk2_ligands.sdf +0 -0
  92. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/data/tyk2_structure.pdb +0 -0
  93. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/data/workflow_example.json +0 -0
  94. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/dcd_download.py +0 -0
  95. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/descriptors.py +0 -0
  96. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/docking.py +0 -0
  97. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/docking_screen.py +0 -0
  98. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/double_ended_ts_search.py +0 -0
  99. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/electronic_properties.py +0 -0
  100. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/estimate_workflow.py +0 -0
  101. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/fukui_index.py +0 -0
  102. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/hydrogen_bond_basicity.py +0 -0
  103. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/interaction_energy_decomposition.py +0 -0
  104. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/ion_mobility.py +0 -0
  105. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/irc.py +0 -0
  106. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/macropka.py +0 -0
  107. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/membrane_permeability.py +0 -0
  108. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/multistage_optimization.py +0 -0
  109. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/nmr.py +0 -0
  110. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/optimization.py +0 -0
  111. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/pdb_download.py +0 -0
  112. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/periodic_dft.py +0 -0
  113. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/phenol_pka.py +0 -0
  114. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/pka.py +0 -0
  115. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/pocket_detection.py +0 -0
  116. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/pose_analysis_md.py +0 -0
  117. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/project_scoped_api_key.py +0 -0
  118. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/protein_binder_design.py +0 -0
  119. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/protein_cofolding.py +0 -0
  120. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/protein_cofolding_with_constraints.py +0 -0
  121. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/protein_cofolding_with_templates.py +0 -0
  122. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/protein_md.py +0 -0
  123. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/rbfe_graph.py +0 -0
  124. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/rbfe_resubmit.py +0 -0
  125. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/redox_potential.py +0 -0
  126. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/relative_binding_free_energy_perturbation.py +0 -0
  127. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/resubmit_with_perturbations.py +0 -0
  128. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/retrieve_workflow.py +0 -0
  129. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/scan.py +0 -0
  130. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/solvent_dependent_conformers.py +0 -0
  131. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/spin_states.py +0 -0
  132. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/strain.py +0 -0
  133. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/tautomer.py +0 -0
  134. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/template.py +0 -0
  135. {rowan_python-3.1.8 → rowan_python-3.1.9}/examples/webhook.py +0 -0
  136. {rowan_python-3.1.8 → rowan_python-3.1.9}/mkdocs.yml +0 -0
  137. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/api_keys.py +0 -0
  138. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/calculation.py +0 -0
  139. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/config.py +0 -0
  140. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/constants.py +0 -0
  141. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/folder.py +0 -0
  142. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/molecule.py +0 -0
  143. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/project.py +0 -0
  144. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/protein.py +0 -0
  145. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/py.typed +0 -0
  146. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/test_utils.py +0 -0
  147. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/types.py +0 -0
  148. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/user.py +0 -0
  149. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/utils.py +0 -0
  150. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/__init__.py +0 -0
  151. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/admet.py +0 -0
  152. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/analogue_docking.py +0 -0
  153. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/base.py +0 -0
  154. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/basic_calculation.py +0 -0
  155. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/batch_docking.py +0 -0
  156. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/bde.py +0 -0
  157. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/binding_affinity.py +0 -0
  158. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/conformer_search.py +0 -0
  159. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/constants.py +0 -0
  160. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/covalent_inhibitor_scan.py +0 -0
  161. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/descriptors.py +0 -0
  162. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/docking.py +0 -0
  163. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/double_ended_ts_search.py +0 -0
  164. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/electronic_properties.py +0 -0
  165. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/fukui.py +0 -0
  166. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
  167. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/interaction_energy_decomposition.py +0 -0
  168. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/ion_mobility.py +0 -0
  169. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/irc.py +0 -0
  170. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/macropka.py +0 -0
  171. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/membrane_permeability.py +0 -0
  172. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/msa.py +0 -0
  173. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/multistage_optimization.py +0 -0
  174. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/pka.py +0 -0
  175. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/pocket_detection.py +0 -0
  176. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/pose_analysis_md.py +0 -0
  177. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/protein_binder_design.py +0 -0
  178. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/protein_cofolding.py +0 -0
  179. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/protein_md.py +0 -0
  180. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/rbfe_graph.py +0 -0
  181. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/redox_potential.py +0 -0
  182. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/relative_binding_free_energy_perturbation.py +0 -0
  183. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/scan.py +0 -0
  184. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/solubility.py +0 -0
  185. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/solvent_dependent_conformers.py +0 -0
  186. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/spin_states.py +0 -0
  187. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/strain.py +0 -0
  188. {rowan_python-3.1.8 → rowan_python-3.1.9}/rowan/workflows/tautomer_search.py +0 -0
  189. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/SKILL.md +0 -0
  190. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/binding_affinity.md +0 -0
  191. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/reference/covalent_inhibitor_scan.md +0 -0
  192. {rowan_python-3.1.8 → rowan_python-3.1.9}/skills/computational-chemistry-and-biology/scripts/check_env.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rowan-python
3
- Version: 3.1.8
3
+ Version: 3.1.9
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.228
14
+ Requires-Dist: stjames>=0.0.236
15
15
  Description-Content-Type: text/markdown
16
16
 
17
17
  # Rowan Python Library
@@ -37,11 +37,12 @@ environments:
37
37
  - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
38
38
  - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda
39
39
  - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
40
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
40
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
41
41
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
42
42
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
43
43
  - pypi: ./
44
44
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
45
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
45
46
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
46
47
  - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl
47
48
  - pypi: https://files.pythonhosted.org/packages/41/5f/0f992cb24560673496c5d68de61913b57166ce530ffda07c1f280e0cc464/numpy-2.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
@@ -54,16 +55,15 @@ environments:
54
55
  - pypi: https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
55
56
  - pypi: https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl
56
57
  - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl
58
+ - pypi: https://files.pythonhosted.org/packages/d0/fb/be7d2e16e6c6143cd6834cd488d990d75352a5c9cdad6d5c615b5f01d736/stjames-0.0.236-py3-none-any.whl
57
59
  - pypi: https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl
58
60
  - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl
59
61
  - pypi: https://files.pythonhosted.org/packages/e1/11/1a9a693e424b2a75755d56ecb67ccc6f77e6e5bb7417dec5e73d9c410314/rdkit-2026.3.4-cp314-cp314-manylinux_2_28_x86_64.whl
60
62
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
61
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
62
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
63
63
  - pypi: https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
64
64
  - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl
65
65
  osx-arm64:
66
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
66
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
67
67
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
68
68
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
69
69
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
@@ -81,6 +81,7 @@ environments:
81
81
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda
82
82
  - pypi: ./
83
83
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
84
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
84
85
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
85
86
  - pypi: https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl
86
87
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
@@ -95,11 +96,10 @@ environments:
95
96
  - pypi: https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl
96
97
  - pypi: https://files.pythonhosted.org/packages/bf/64/0e215f2048dd11a55bb989ed41b3585ef57452404e638d703a211a3e4157/numpy-2.5.1-cp314-cp314-macosx_11_0_arm64.whl
97
98
  - pypi: https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl
99
+ - pypi: https://files.pythonhosted.org/packages/d0/fb/be7d2e16e6c6143cd6834cd488d990d75352a5c9cdad6d5c615b5f01d736/stjames-0.0.236-py3-none-any.whl
98
100
  - pypi: https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl
99
101
  - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl
100
102
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
101
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
102
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
103
103
  - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl
104
104
  dev:
105
105
  channels:
@@ -126,7 +126,7 @@ environments:
126
126
  - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda
127
127
  - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda
128
128
  - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda
129
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
129
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
130
130
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
131
131
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
132
132
  - pypi: ./
@@ -135,6 +135,7 @@ environments:
135
135
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
136
136
  - pypi: https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl
137
137
  - pypi: https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl
138
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
138
139
  - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl
139
140
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
140
141
  - pypi: https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl
@@ -171,6 +172,7 @@ environments:
171
172
  - pypi: https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
172
173
  - pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl
173
174
  - pypi: https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl
175
+ - pypi: https://files.pythonhosted.org/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
174
176
  - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl
175
177
  - pypi: https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl
176
178
  - pypi: https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl
@@ -190,6 +192,7 @@ environments:
190
192
  - pypi: https://files.pythonhosted.org/packages/c7/7b/14882602ddee241d7984a742fcb423cb4a30fb0d6efc546ac3129fba475a/python_discovery-1.5.0-py3-none-any.whl
191
193
  - pypi: https://files.pythonhosted.org/packages/ca/87/b4d6c38e0ccd5e85dc54cecdf933a152c60b28fe5d993a6d8a72fa6d5896/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
192
194
  - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
195
+ - pypi: https://files.pythonhosted.org/packages/d0/fb/be7d2e16e6c6143cd6834cd488d990d75352a5c9cdad6d5c615b5f01d736/stjames-0.0.236-py3-none-any.whl
193
196
  - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl
194
197
  - pypi: https://files.pythonhosted.org/packages/d1/fc/10ab7e80650a9c9e8f4f1105f8c8e73567f88ed0c06ada589ab81d38687c/mkdocstrings_python-2.0.5-py3-none-any.whl
195
198
  - pypi: https://files.pythonhosted.org/packages/d4/2b/04b8a15f3a1c77bc79ddf5c73875327f34b4fa75982df2b76e45e402d364/asttokens-3.0.2-py3-none-any.whl
@@ -203,20 +206,17 @@ environments:
203
206
  - pypi: https://files.pythonhosted.org/packages/e1/11/1a9a693e424b2a75755d56ecb67ccc6f77e6e5bb7417dec5e73d9c410314/rdkit-2026.3.4-cp314-cp314-manylinux_2_28_x86_64.whl
204
207
  - pypi: https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl
205
208
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
206
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
207
209
  - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
208
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
209
210
  - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
210
211
  - pypi: https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl
211
212
  - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl
212
213
  - pypi: https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
213
- - pypi: https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
214
214
  - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
215
215
  - pypi: https://files.pythonhosted.org/packages/fb/49/bc925106abcdac498074f2cbe6137e94e09f418dd2b7775df5b577dc0313/pre_commit-4.6.1-py2.py3-none-any.whl
216
216
  - pypi: https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl
217
217
  - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl
218
218
  osx-arm64:
219
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
219
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
220
220
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
221
221
  - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda
222
222
  - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda
@@ -238,6 +238,7 @@ environments:
238
238
  - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl
239
239
  - pypi: https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl
240
240
  - pypi: https://files.pythonhosted.org/packages/06/79/b4c714bef36bc4ec2beeae1e0c124f0223888cd8c6feb1cdc56038116920/filelock-3.32.0-py3-none-any.whl
241
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
241
242
  - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl
242
243
  - pypi: https://files.pythonhosted.org/packages/15/14/2ba1d61452d7c2a7fe12741e8d374e52b183476b07aa7f9e2a0d02b0720a/mypy-2.3.0-cp314-cp314-macosx_11_0_arm64.whl
243
244
  - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl
@@ -252,6 +253,7 @@ environments:
252
253
  - pypi: https://files.pythonhosted.org/packages/3e/5c/fb93d3092640a24dfb7bd7727a24016d7c01774ca013e60efd3f683c8002/backrefs-7.0-py314-none-any.whl
253
254
  - pypi: https://files.pythonhosted.org/packages/40/3a/948263ca3b9d65bb2b1b0c521b3a49fad5d59ada58724bd87d2bd5ff3f36/ipython-9.15.0-py3-none-any.whl
254
255
  - pypi: https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl
256
+ - pypi: https://files.pythonhosted.org/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl
255
257
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
256
258
  - pypi: https://files.pythonhosted.org/packages/52/22/0ba7be75e0d99335008532312abc0a1ce50f8895739941bca887cf75d157/rdkit-2026.3.4-cp314-cp314-macosx_11_0_arm64.whl
257
259
  - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl
@@ -293,8 +295,8 @@ environments:
293
295
  - pypi: https://files.pythonhosted.org/packages/c1/f6/ec7ec652c51db77c2f61d8573338e13e4704303265ccc658cb4031d9f354/ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl
294
296
  - pypi: https://files.pythonhosted.org/packages/c7/7b/14882602ddee241d7984a742fcb423cb4a30fb0d6efc546ac3129fba475a/python_discovery-1.5.0-py3-none-any.whl
295
297
  - pypi: https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl
296
- - pypi: https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl
297
298
  - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl
299
+ - pypi: https://files.pythonhosted.org/packages/d0/fb/be7d2e16e6c6143cd6834cd488d990d75352a5c9cdad6d5c615b5f01d736/stjames-0.0.236-py3-none-any.whl
298
300
  - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl
299
301
  - pypi: https://files.pythonhosted.org/packages/d1/fc/10ab7e80650a9c9e8f4f1105f8c8e73567f88ed0c06ada589ab81d38687c/mkdocstrings_python-2.0.5-py3-none-any.whl
300
302
  - pypi: https://files.pythonhosted.org/packages/d4/2b/04b8a15f3a1c77bc79ddf5c73875327f34b4fa75982df2b76e45e402d364/asttokens-3.0.2-py3-none-any.whl
@@ -308,9 +310,7 @@ environments:
308
310
  - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl
309
311
  - pypi: https://files.pythonhosted.org/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl
310
312
  - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl
311
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
312
313
  - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
313
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
314
314
  - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
315
315
  - pypi: https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl
316
316
  - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl
@@ -597,16 +597,16 @@ packages:
597
597
  - zstd >=1.5.7,<1.6.0a0
598
598
  size: 601375
599
599
  timestamp: 1764777111296
600
- - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda
601
- sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf
602
- md5: a9965dd99f683c5f444428f896635716
600
+ - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda
601
+ sha256: 0a0544cf95f64394fe4959286f5c71f5444ad58feb0602e53becb27448d24da6
602
+ md5: 0f51e2391ade309db462a55611263e9c
603
603
  depends:
604
604
  - __unix
605
605
  license: ISC
606
606
  purls: []
607
607
  run_exports: {}
608
- size: 128866
609
- timestamp: 1781708962055
608
+ size: 131780
609
+ timestamp: 1784754889428
610
610
  - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda
611
611
  build_number: 8
612
612
  sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5
@@ -820,7 +820,7 @@ packages:
820
820
  name: rowan-python
821
821
  requires_dist:
822
822
  - httpx
823
- - stjames>=0.0.228
823
+ - stjames>=0.0.236
824
824
  - setuptools
825
825
  - rdkit
826
826
  - nest-asyncio
@@ -851,6 +851,11 @@ packages:
851
851
  version: 3.32.0
852
852
  sha256: d396bea984af47333ef05e50eae7eff88c84256de6112aea0ec48a233c064fe3
853
853
  requires_python: '>=3.10'
854
+ - pypi: https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl
855
+ name: certifi
856
+ version: 2026.7.22
857
+ sha256: 62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775
858
+ requires_python: '>=3.7'
854
859
  - pypi: https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl
855
860
  name: python-dotenv
856
861
  version: 1.2.2
@@ -1072,6 +1077,11 @@ packages:
1072
1077
  version: 2.5.1
1073
1078
  sha256: 54ad769f17bc2d833b620851989f62054fb9ab93c969d9e1dc3c8e3d56beea21
1074
1079
  requires_python: '>=3.12'
1080
+ - pypi: https://files.pythonhosted.org/packages/42/ce/741cd197496a1abbf51352710fd15ed995d2a2be87189c1da26a450d6e83/ruff-0.16.0-py3-none-macosx_11_0_arm64.whl
1081
+ name: ruff
1082
+ version: 0.16.0
1083
+ sha256: e01c21d10eb1b29f47b7454e1f4056db9a3f0260c646aa88457c610291db9f81
1084
+ requires_python: '>=3.7'
1075
1085
  - pypi: https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl
1076
1086
  name: typing-extensions
1077
1087
  version: 4.16.0
@@ -1376,6 +1386,11 @@ packages:
1376
1386
  - pytest ; extra == 'dev'
1377
1387
  - tox ; extra == 'dev'
1378
1388
  - black ; extra == 'lint'
1389
+ - pypi: https://files.pythonhosted.org/packages/91/66/6bd3cf90500653d55dc0ffc8507aa8300bd49d0214b2e8cb4d3fef2943ba/ruff-0.16.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1390
+ name: ruff
1391
+ version: 0.16.0
1392
+ sha256: 4f11a8d11010301d0a398a2fdef67691feca7294da6aef55e2150e8fa2cd520b
1393
+ requires_python: '>=3.7'
1379
1394
  - pypi: https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl
1380
1395
  name: identify
1381
1396
  version: 2.6.19
@@ -1681,11 +1696,6 @@ packages:
1681
1696
  - trove-classifiers>=2024.10.12 ; extra == 'tests'
1682
1697
  - defusedxml ; extra == 'xmp'
1683
1698
  requires_python: '>=3.10'
1684
- - pypi: https://files.pythonhosted.org/packages/c9/10/74e53572aa758dfaa678c2a2646b5c5515d884b7ca56be4d2ce03ca4b560/ruff-0.15.22-py3-none-macosx_11_0_arm64.whl
1685
- name: ruff
1686
- version: 0.15.22
1687
- sha256: 11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f
1688
- requires_python: '>=3.7'
1689
1699
  - pypi: https://files.pythonhosted.org/packages/ca/87/b4d6c38e0ccd5e85dc54cecdf933a152c60b28fe5d993a6d8a72fa6d5896/ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1690
1700
  name: ast-serialize
1691
1701
  version: 0.6.0
@@ -1696,6 +1706,17 @@ packages:
1696
1706
  version: 2.3.0
1697
1707
  sha256: f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12
1698
1708
  requires_python: '>=3.10'
1709
+ - pypi: https://files.pythonhosted.org/packages/d0/fb/be7d2e16e6c6143cd6834cd488d990d75352a5c9cdad6d5c615b5f01d736/stjames-0.0.236-py3-none-any.whl
1710
+ name: stjames
1711
+ version: 0.0.236
1712
+ sha256: ea1459a5d0e0ccd206e5a387b201beec5e60ad6bc4f15dbcf649e2d4667fc40c
1713
+ requires_dist:
1714
+ - pydantic>=2.4
1715
+ - numpy
1716
+ - requests
1717
+ - more-itertools
1718
+ - rdkit ; extra == 'rdkit'
1719
+ requires_python: '>=3.11'
1699
1720
  - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl
1700
1721
  name: colorama
1701
1722
  version: 0.4.6
@@ -1808,17 +1829,6 @@ packages:
1808
1829
  version: 11.1.0
1809
1830
  sha256: 4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192
1810
1831
  requires_python: '>=3.10'
1811
- - pypi: https://files.pythonhosted.org/packages/ec/4f/60f375c1abfbb364cb56ee70d4cae5c2cc9762d434531c61f066d8610605/stjames-0.0.233-py3-none-any.whl
1812
- name: stjames
1813
- version: 0.0.233
1814
- sha256: bd3bdf9c701b7649187c25c6d73e7bee46b5ac32cddad43c47979243a28d1023
1815
- requires_dist:
1816
- - pydantic>=2.4
1817
- - numpy
1818
- - requests
1819
- - more-itertools
1820
- - rdkit ; extra == 'rdkit'
1821
- requires_python: '>=3.11'
1822
1832
  - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl
1823
1833
  name: python-dateutil
1824
1834
  version: 2.9.0.post0
@@ -1826,11 +1836,6 @@ packages:
1826
1836
  requires_dist:
1827
1837
  - six>=1.5
1828
1838
  requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*'
1829
- - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl
1830
- name: certifi
1831
- version: 2026.6.17
1832
- sha256: 2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db
1833
- requires_python: '>=3.7'
1834
1839
  - pypi: https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl
1835
1840
  name: stack-data
1836
1841
  version: 0.6.3
@@ -1865,11 +1870,6 @@ packages:
1865
1870
  version: 3.4.9
1866
1871
  sha256: c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046
1867
1872
  requires_python: '>=3.7'
1868
- - pypi: https://files.pythonhosted.org/packages/f6/f9/a0d4871d12fae702eb1f41b686caf05f1f8b124dc6db6f784f53d74918fa/ruff-0.15.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1869
- name: ruff
1870
- version: 0.15.22
1871
- sha256: 365523eb91d9224e1bcb03b022fbf0facb8f9e23792a2c53d9d4b3924bdbdebb
1872
- requires_python: '>=3.7'
1873
1873
  - pypi: https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl
1874
1874
  name: ghp-import
1875
1875
  version: 2.1.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rowan-python"
3
- version = "3.1.8"
3
+ version = "3.1.9"
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.228",
12
+ "stjames>=0.0.236",
13
13
  "setuptools",
14
14
  "rdkit",
15
15
  "nest-asyncio",
@@ -83,6 +83,7 @@ ignore = [
83
83
  "PLR0911", # Too many returns
84
84
  "PLR0912", # Too many branches
85
85
  "PLR0913", # Too many arguments to function call
86
+ "PLR0917", # Too many positional arguments
86
87
  "PLR0914", # Too many locals
87
88
  "PLR0915", # Too many statements
88
89
  "PLR1702", # Too many nested-blocks
@@ -24,6 +24,7 @@ from stjames import (
24
24
  Mode,
25
25
  MSAFormat,
26
26
  MultiStageOptSettings,
27
+ NMR_SUPPORTED_SOLVENTS,
27
28
  OpenConfSettings,
28
29
  OptimizationSettings,
29
30
  PBCDFTSettings,
@@ -1,6 +1,7 @@
1
1
  """NMR workflow - predict Nuclear Magnetic Resonance spectra."""
2
2
 
3
3
  from dataclasses import dataclass
4
+ from typing import Any
4
5
 
5
6
  import stjames
6
7
 
@@ -98,6 +99,32 @@ class NMRResult(WorkflowResult):
98
99
  return self._workflow.symmetry_equivalent_nuclei
99
100
 
100
101
 
102
+ def _nmr_multistage_opt_settings(solvent: SolventInput) -> stjames.MultiStageOptSettings:
103
+ """
104
+ Build NMR optimization settings, adding a solvated AIMNet2 singlepoint.
105
+
106
+ Optimization runs gas-phase (matching MagNet); the solvated singlepoint, whose solvent model
107
+ is looked up from stjames.NMR_SOLVENT_MODELS, reweights the conformer ensemble.
108
+
109
+ :param solvent: solvent for the prediction
110
+ :returns: multi-stage optimization settings
111
+ """
112
+ singlepoint_settings = stjames.Settings(
113
+ method=stjames.Method.AIMNET2_WB97MD3,
114
+ tasks=[stjames.Task.ENERGY],
115
+ solvent_settings=stjames.SolventSettings(
116
+ solvent=solvent, model=stjames.NMR_SOLVENT_MODELS[stjames.Solvent(solvent)]
117
+ ),
118
+ )
119
+
120
+ return stjames.MultiStageOptSettings(
121
+ optimization_settings=[
122
+ stjames.Settings(method=stjames.Method.AIMNET2_WB97MD3, tasks=[stjames.Task.OPTIMIZE])
123
+ ],
124
+ singlepoint_settings=singlepoint_settings,
125
+ )
126
+
127
+
101
128
  def submit_nmr_workflow(
102
129
  initial_molecule: StructureInput,
103
130
  solvent: SolventInput = "chloroform",
@@ -114,7 +141,10 @@ def submit_nmr_workflow(
114
141
  Submits a Nuclear Magnetic Resonance (NMR) prediction workflow to the API.
115
142
 
116
143
  :param initial_molecule: Molecule to predict NMR spectra for.
117
- :param solvent: Solvent for NMR calculation (default: chloroform).
144
+ :param solvent: Solvent for NMR calculation (default: chloroform). Must be an NMR-supported
145
+ solvent (see rowan.NMR_SUPPORTED_SOLVENTS); others raise ValueError. A solvated AIMNet2
146
+ singlepoint reweights the conformer ensemble, using CPCM-X where supported and
147
+ otherwise ALPB.
118
148
  :param do_csearch: Whether to perform a conformational search. Requires do_optimization.
119
149
  :param do_optimization: Whether to optimize conformer geometries.
120
150
  :param name: Name of the workflow.
@@ -127,6 +157,12 @@ def submit_nmr_workflow(
127
157
  :raises requests.HTTPError: if the request to the API fails.
128
158
  """
129
159
  require_coordinates(initial_molecule)
160
+ if stjames.Solvent(solvent) not in stjames.NMR_SUPPORTED_SOLVENTS:
161
+ supported = ", ".join(sorted(s.value for s in stjames.NMR_SUPPORTED_SOLVENTS))
162
+ raise ValueError(
163
+ f"{stjames.Solvent(solvent).value!r} is not an NMR-supported solvent. "
164
+ f"NMR-supported solvents: {supported}."
165
+ )
130
166
  if do_csearch and not do_optimization:
131
167
  raise ValueError(
132
168
  "`do_optimization` must be True when `do_csearch` is True; the conformers from "
@@ -138,13 +174,15 @@ def submit_nmr_workflow(
138
174
  folder_uuid = folder.uuid
139
175
  mol_dict = molecule_to_dict(initial_molecule)
140
176
 
141
- workflow_data = {"initial_molecule": mol_dict, "solvent": solvent}
177
+ workflow_data: dict[str, Any] = {"initial_molecule": mol_dict, "solvent": solvent}
142
178
 
143
179
  if not do_csearch:
144
180
  workflow_data["conf_gen_settings"] = None
145
181
 
146
182
  if not do_optimization:
147
183
  workflow_data["multistage_opt_settings"] = None
184
+ else:
185
+ workflow_data["multistage_opt_settings"] = _nmr_multistage_opt_settings(solvent)
148
186
 
149
187
  workflow = stjames.NMRSpectroscopyWorkflow.model_validate(workflow_data)
150
188
 
@@ -19,7 +19,7 @@ wf = rowan.submit_admet_workflow(
19
19
  )
20
20
 
21
21
  result = wf.result()
22
- print(result.properties) # dict of property name -> predicted value
22
+ print(result.properties) # dict of property name -> predicted value
23
23
  ```
24
24
 
25
25
  ## Settings
@@ -49,7 +49,7 @@ wf = rowan.submit_analogue_docking_workflow(
49
49
  )
50
50
 
51
51
  result = wf.result()
52
- print(result) # e.g. <AnalogueDockingResult analogues=3 best=(-8.30, 'CN(C)CCC...')>
52
+ print(result) # e.g. <AnalogueDockingResult analogues=3 best=(-8.30, 'CN(C)CCC...')>
53
53
 
54
54
  # result.analogue_scores: docking scores per analogue (keyed by SMILES).
55
55
  # result.best_poses: top pose per analogue (keyed by SMILES); each pose's .name is the
@@ -49,8 +49,8 @@ wf = rowan.submit_basic_calculation_workflow(
49
49
  )
50
50
 
51
51
  result = wf.result()
52
- print(result.energy) # energy in Hartree
53
- print(result.molecule) # resulting structure with computed properties
52
+ print(result.energy) # energy in Hartree
53
+ print(result.molecule) # resulting structure with computed properties
54
54
  ```
55
55
 
56
56
  ## Tuning individual settings
@@ -36,7 +36,7 @@ wf = rowan.submit_batch_docking_workflow(
36
36
  )
37
37
 
38
38
  result = wf.result()
39
- print(result.scores) # dict of SMILES -> best docking score
39
+ print(result.scores) # dict of SMILES -> best docking score
40
40
  ```
41
41
 
42
42
  ## Settings
@@ -16,16 +16,16 @@ mol = rowan.Molecule.from_smiles("CCO") # ethanol
16
16
  # Find the bond you want. The bond-finder helpers return 1-indexed (heavy, H) pairs.
17
17
  # Here: oxygen (atomic number 8) to hydrogen (1), within 1.2 Angstroms.
18
18
  oh_bonds = rowan.find_bonds(mol, element_a=8, element_b=1, distance_max=1.2) # -> [(3, 9)]
19
- h = oh_bonds[0][1] # the hydroxyl hydrogen (atom 9)
19
+ h = oh_bonds[0][1] # the hydroxyl hydrogen (atom 9)
20
20
 
21
21
  wf = rowan.submit_bde_workflow(
22
22
  initial_molecule=mol,
23
- fragment_indices=[[h]], # break the O-H: the dissociating fragment is just that H
23
+ fragment_indices=[[h]], # break the O-H: the dissociating fragment is just that H
24
24
  folder=folder,
25
25
  )
26
26
 
27
27
  result = wf.result()
28
- print(result.bdes) # list of BDEEntry, each with fragment_idxs and energy (Hartree)
28
+ print(result.bdes) # list of BDEEntry, each with fragment_idxs and energy (Hartree)
29
29
  ```
30
30
 
31
31
  Reported BDEs are empirically corrected to experiment (the ExpBDE54 benchmark) to account for zero-point, enthalpy, and relativistic effects, so they are corrected enthalpies rather than raw electronic energies. Expect a few kcal/mol RMSE versus experiment.
@@ -15,14 +15,14 @@ import rowan
15
15
  folder = rowan.get_folder("examples")
16
16
 
17
17
  wf = rowan.submit_conformer_search_workflow(
18
- initial_molecule="CCOCC", # SMILES works because the default generator is OpenConf
18
+ initial_molecule="CCOCC", # SMILES works because the default generator is OpenConf
19
19
  final_method="aimnet2_wb97md3",
20
20
  folder=folder,
21
21
  )
22
22
 
23
23
  result = wf.result()
24
- print(result.get_energies(relative=True)) # relative energies (kcal/mol), lowest first
25
- best = result.get_conformers(1)[0] # lowest-energy conformer, a rowan.Molecule
24
+ print(result.get_energies(relative=True)) # relative energies (kcal/mol), lowest first
25
+ best = result.get_conformers(1)[0] # lowest-energy conformer, a rowan.Molecule
26
26
  ```
27
27
 
28
28
  `get_conformers(n)` returns the `n` lowest-energy conformers as `rowan.Molecule` objects (omit `n` for all), and `get_energies(relative=True)` gives their relative energies in kcal/mol. Both are energy-ordered, so the lowest-energy conformer is index 0, ready to feed into a downstream 3D workflow. `get_conformers` makes one API call per conformer, so request only as many as you need.
@@ -13,13 +13,13 @@ folder = rowan.get_folder("examples")
13
13
 
14
14
  wf = rowan.submit_descriptors_workflow(
15
15
  initial_molecule=rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O"), # aspirin
16
- solvent="water", # opt into the COSMO descriptors; omit for gas phase
16
+ solvent="water", # opt into the COSMO descriptors; omit for gas phase
17
17
  folder=folder,
18
18
  )
19
19
 
20
20
  result = wf.result()
21
- print(result) # <DescriptorsResult n=...>
22
- print(result.descriptors) # dict of computed descriptors
21
+ print(result) # <DescriptorsResult n=...>
22
+ print(result.descriptors) # dict of computed descriptors
23
23
  ```
24
24
 
25
25
  `result.descriptors` holds electronic descriptors from xTB (atomic charges, the global electrophilicity index, and Fukui indices, as in the Fukui workflow), cheminformatic descriptors from Mordred, and the COSMO solvation descriptors when a `solvent` is set.
@@ -18,8 +18,8 @@ To narrow a blind search to likely sites first, run pocket detection and feed a
18
18
 
19
19
  ```python
20
20
  pockets = rowan.submit_pocket_detection_workflow(protein).result().pockets
21
- best = max(pockets, key=lambda p: p.score) # rank by druggability score
22
- pocket = [list(best.pocket_center), list(best.pocket_sides)] # ready for submit_docking_workflow
21
+ best = max(pockets, key=lambda p: p.score) # rank by druggability score
22
+ pocket = [list(best.pocket_center), list(best.pocket_sides)] # ready for submit_docking_workflow
23
23
  ```
24
24
 
25
25
  ## Example
@@ -12,17 +12,19 @@ import rowan
12
12
  folder = rowan.get_folder("examples")
13
13
 
14
14
  reactant = rowan.Molecule.from_xyz("H 0 0 -1.1\nC 0 0 0\nN 0 0 1.2") # HCN
15
- product = rowan.Molecule.from_xyz("H 0 0 2.3\nC 0 0 0\nN 0 0 1.2") # CNH
15
+ product = rowan.Molecule.from_xyz("H 0 0 2.3\nC 0 0 0\nN 0 0 1.2") # CNH
16
16
 
17
17
  wf = rowan.submit_double_ended_ts_search_workflow(
18
18
  reactant=reactant,
19
19
  product=product,
20
- calculation_settings=rowan.Settings(method=rowan.Method.GFN2_XTB), # level of theory for the search
20
+ calculation_settings=rowan.Settings(
21
+ method=rowan.Method.GFN2_XTB
22
+ ), # level of theory for the search
21
23
  folder=folder,
22
24
  )
23
25
 
24
26
  result = wf.result()
25
- print(result) # <DoubleEndedTSSearchResult ts_uuid=... fwd=... bwd=...>
27
+ print(result) # <DoubleEndedTSSearchResult ts_uuid=... fwd=... bwd=...>
26
28
  print([p.distance for p in result.forward_path])
27
29
  print([p.distance for p in result.backward_path])
28
30
  ```
@@ -20,7 +20,7 @@ wf = rowan.submit_electronic_properties_workflow(
20
20
  )
21
21
 
22
22
  result = wf.result()
23
- print(result) # orbitals, density/ESP cubes, charges, bond orders, multipole moments
23
+ print(result) # orbitals, density/ESP cubes, charges, bond orders, multipole moments
24
24
  ```
25
25
 
26
26
  ## Settings
@@ -5,7 +5,7 @@ Workflows live in a tree of folders, rooted in a project. A project is a closed
5
5
  ## Get a folder by path
6
6
 
7
7
  ```python
8
- folder = rowan.get_folder("CDK2/docking/batch_1") # creates missing segments by default
8
+ folder = rowan.get_folder("CDK2/docking/batch_1") # creates missing segments by default
9
9
  folder = rowan.get_folder("CDK2/docking", create=False) # raises if it doesn't exist
10
10
  wf = rowan.submit_docking_workflow(..., folder=folder)
11
11
  ```
@@ -17,14 +17,14 @@ wf = rowan.submit_docking_workflow(..., folder=folder)
17
17
  Start at the project root, then list or navigate:
18
18
 
19
19
  ```python
20
- root = rowan.root_folder() # root folder of the active project
20
+ root = rowan.root_folder() # root folder of the active project
21
21
 
22
- root.children() # list[Folder] — subfolders only
23
- root.workflows() # list[Workflow] — workflows only
24
- root.contents() # list[Folder | Workflow] — both, folders first
22
+ root.children() # list[Folder] — subfolders only
23
+ root.workflows() # list[Workflow] — workflows only
24
+ root.contents() # list[Folder | Workflow] — both, folders first
25
25
 
26
- docking = root / "CDK2" / "docking" # navigate by name with the / operator
27
- parent = docking.parent() # Folder, or None at the root
26
+ docking = root / "CDK2" / "docking" # navigate by name with the / operator
27
+ parent = docking.parent() # Folder, or None at the root
28
28
  ```
29
29
 
30
30
  - `children()`, `workflows()`, and `contents()` each take a `size=` cap (default 100) and return fully-typed objects you can act on (e.g. `wf.result()`).
@@ -38,22 +38,22 @@ project is a closed scope — set it once and all folder/workflow operations sta
38
38
 
39
39
  ```python
40
40
  # Find / list
41
- rowan.list_projects() # list[Project]
42
- rowan.list_projects(name_contains="CDK2") # filtered
43
- proj = rowan.retrieve_project(uuid) # by UUID (from the project URL)
44
- default = rowan.default_project() # the account's default project
41
+ rowan.list_projects() # list[Project]
42
+ rowan.list_projects(name_contains="CDK2") # filtered
43
+ proj = rowan.retrieve_project(uuid) # by UUID (from the project URL)
44
+ default = rowan.default_project() # the account's default project
45
45
 
46
46
  # Create
47
47
  proj = rowan.create_project("CDK2 campaign")
48
- proj = rowan.get_project("CDK2 campaign", create=True) # get-or-create (create defaults to False)
48
+ proj = rowan.get_project("CDK2 campaign", create=True) # get-or-create (create defaults to False)
49
49
 
50
50
  # Switch the active project (all subsequent folder/workflow operations scope to it)
51
- rowan.set_project("CDK2 campaign") # by name; sets rowan.project_uuid
52
- rowan.project_uuid = proj.uuid # or assign the UUID directly
51
+ rowan.set_project("CDK2 campaign") # by name; sets rowan.project_uuid
52
+ rowan.project_uuid = proj.uuid # or assign the UUID directly
53
53
 
54
54
  # Rename / delete
55
55
  proj.update(name="CDK2 campaign v2")
56
- proj.delete() # destructive: removes all folders + workflows inside
56
+ proj.delete() # destructive: removes all folders + workflows inside
57
57
  ```
58
58
 
59
59
  With no project set, the default project is used. `set_project` raises `ValueError` if no project