rowan-python 3.2.0__tar.gz → 3.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.envrc +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/build-and-deploy-docs.yml +9 -5
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/publish-skill.yml +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/python-publish.yml +5 -2
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.github/workflows/test.yml +7 -10
- rowan_python-3.2.1/.gitignore +66 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.rumdl.toml +2 -2
- {rowan_python-3.2.0 → rowan_python-3.2.1}/PKG-INFO +4 -7
- {rowan_python-3.2.0 → rowan_python-3.2.1}/README.md +2 -5
- {rowan_python-3.2.0 → rowan_python-3.2.1}/prek.toml +16 -7
- {rowan_python-3.2.0 → rowan_python-3.2.1}/pyproject.toml +6 -3
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/folder.py +1 -4
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/protein.py +0 -116
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/binding_affinity.py +7 -4
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_md.py +4 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_preparation.py +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/relative_binding_free_energy_perturbation.py +17 -5
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/SKILL.md +1 -1
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/binding_affinity.md +8 -3
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_md.md +1 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_preparation.md +0 -11
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_binding_affinity.py +3 -2
- rowan_python-3.2.1/tests/test_rbfe_trajectory_download.py +53 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/uv.lock +8 -8
- rowan_python-3.2.0/.gitignore +0 -214
- rowan_python-3.2.0/GEMINI.md +0 -3
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.claude-plugin/marketplace.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.codex-plugin/plugin.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.editorconfig +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/.python-version +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/LICENSE +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/api-keys.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/calculation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/folder.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/molecule.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/project.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/protein.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/user.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/webhooks.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/api/workflow.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/images/RowanLogoLarge.png +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/images/RowanSquareLogo.png +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/images/favicon.svg +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/index.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/stylesheets/colors.css +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/admet.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/analogue-docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/basic-calculation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/batch-docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/binding-affinity.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/bond-dissociation-energy.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/conformer-search-settings.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/conformer-search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/covalent-inhibitor-scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/descriptors.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/double-ended-ts-search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/electronic-properties.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/fukui.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/hydrogen-bond-donor-acceptor-strength.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/interaction-energy-decomposition.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/ion-mobility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/irc.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/logp.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/macropka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/membrane-permeability.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/msa.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/multistage-optimization.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/nmr.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/pka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/pocket-detection.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/pose-analysis-md.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-binder-design.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-cofolding.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-md.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/protein-preparation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/rbfe-graph.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/redox-potential.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/relative-binding-free-energy-perturbation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/settings.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/solubility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/solvent-dependent-conformers.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/spin-states.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/strain.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/tautomer-search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/docs/workflows/types.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/PROTAC_solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/admet.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/analogue_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/aqueous_solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation_from_json.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation_with_constraint.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/basic_calculation_with_solvent.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/batch_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/batch_solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/bde.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/binding_affinity.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/boltz_paired_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/boltz_single_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/chai_paired_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/chai_single_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/cofolding_screen.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/colabfold_paired_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/colabfold_single_msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/conformer_dependent_redox.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/conformers_screen.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/covalent_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/covalent_inhibitor_scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/1iep_receptorH.pdb +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/Al_FCC.xyz +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/citalopram_1iep.xyz +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/ibuprofen_conformers.sdf +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/tyk2_ligands.sdf +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/tyk2_structure.pdb +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/data/workflow_example.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/dcd_download.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/descriptors.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/docking_screen.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/double_ended_ts_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/electronic_properties.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/estimate_workflow.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/fukui_index.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/hydrogen_bond_basicity.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/induced_fit_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/interaction_energy_decomposition.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/ion_mobility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/irc.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/logp.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/macropka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/membrane_permeability.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/multistage_optimization.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/nmr.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/optimization.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/periodic_dft.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/phenol_pka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/pka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/pocket_detection.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/pose_analysis_md.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/project_scoped_api_key.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_binder_design.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding_modified_inputs.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding_with_constraints.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_cofolding_with_templates.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_file_download.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_md.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/protein_preparation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/rbfe_graph.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/rbfe_resubmit.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/redox_potential.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/relative_binding_free_energy_perturbation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/resubmit_with_perturbations.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/retrieve_workflow.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/solvent_dependent_conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/spin_states.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/strain.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/tautomer.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/template.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/temporary_workflow_sharing.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/examples/webhook.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/mkdocs.yml +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/__init__.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/api_keys.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/calculation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/config.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/constants.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/molecule.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/project.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/py.typed +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/types.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/user.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/utils.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/__init__.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/_molecular_dynamics.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/admet.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/analogue_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/base.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/basic_calculation.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/batch_docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/bde.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/conformer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/constants.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/covalent_inhibitor_scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/descriptors.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/docking.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/double_ended_ts_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/electronic_properties.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/fukui.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/hydrogen_bond_donor_acceptor_strength.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/interaction_energy_decomposition.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/ion_mobility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/irc.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/logp.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/macropka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/membrane_permeability.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/msa.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/multistage_optimization.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/nmr.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/pka.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/pocket_detection.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/pose_analysis_md.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_binder_design.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/protein_cofolding.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/rbfe_graph.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/redox_potential.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/scan.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/solubility.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/solvent_dependent_conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/spin_states.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/strain.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/rowan/workflows/tautomer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/.claude-plugin/plugin.json +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/admet.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/analogue_docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/basic_calculation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/batch_docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/bde.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/conformer_search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/covalent_inhibitor_scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/descriptors.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/docking.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/double_ended_ts_search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/electronic_properties.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/folders_and_projects.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/fukui.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/hydrogen_bond_donor_acceptor_strength.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/interaction_energy_decomposition.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/ion_mobility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/irc.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/logp.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/macropka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/mcp_execution.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/membrane_permeability.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/msa.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/multistage_optimization.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/nmr.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/pka.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/pocket_detection.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/pose_analysis_md.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_binder_design.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/protein_cofolding.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/python_sdk.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/rbfe_graph.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/redox_potential.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/relative_binding_free_energy_perturbation.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/scan.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/solubility.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/solvent_dependent_conformers.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/spin_states.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/strain.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/tautomer_search.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/reference/webhooks.md +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/skills/computational-chemistry-and-biology/scripts/check_env.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_cofolding_workflow_updates.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_conformer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_docking_workflow.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_docking_workflow_updates.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_macropka_nmr.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_mango_forcefields.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_md_workflow_updates.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_plugin.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_protein.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_solvent_dependent_conformers.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_tautomer_search.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_utils.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_workflow_results.py +0 -0
- {rowan_python-3.2.0 → rowan_python-3.2.1}/tests/test_workflow_submission.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
name: Build & Deploy Rowan Python Docs
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
push:
|
|
5
|
+
branches: [master]
|
|
6
6
|
workflow_dispatch:
|
|
7
7
|
|
|
8
8
|
permissions:
|
|
@@ -10,17 +10,18 @@ permissions:
|
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
12
|
build-and-deploy-docs:
|
|
13
|
+
if: github.repository == 'rowansci/rowan-python' && github.ref == 'refs/heads/master'
|
|
13
14
|
runs-on: ubuntu-latest
|
|
14
15
|
|
|
15
16
|
steps:
|
|
16
17
|
- name: Checkout repository
|
|
17
|
-
uses: actions/checkout@
|
|
18
|
+
uses: actions/checkout@v7.0.1
|
|
18
19
|
with:
|
|
19
20
|
fetch-depth: 0
|
|
20
21
|
ref: master
|
|
21
22
|
|
|
22
23
|
- name: Install uv
|
|
23
|
-
uses: astral-sh/setup-uv@v10.
|
|
24
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
24
25
|
with:
|
|
25
26
|
enable-cache: true
|
|
26
27
|
|
|
@@ -42,4 +43,7 @@ jobs:
|
|
|
42
43
|
- name: Deploy with rsync
|
|
43
44
|
run: |
|
|
44
45
|
rsync -avz --delete site/ \
|
|
45
|
-
${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_IP }}:${{ secrets.DOCS_TARGET_DIR }}
|
|
46
|
+
${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_IP }}:${{ secrets.DOCS_TARGET_DIR }}/site/
|
|
47
|
+
|
|
48
|
+
- name: Verify deployed docs
|
|
49
|
+
run: curl --fail --silent --show-error --location --retry 5 --retry-delay 5 --retry-all-errors https://docs.rowansci.com/api/python/v3/ -o /dev/null
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
if: github.repository == 'rowansci/rowan-python'
|
|
17
17
|
runs-on: ubuntu-latest
|
|
18
18
|
steps:
|
|
19
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@v7.0.1
|
|
20
20
|
- name: Zip skill
|
|
21
21
|
run: cd skills && zip -r ../computational-chemistry-and-biology-skill.zip computational-chemistry-and-biology
|
|
22
22
|
- name: Publish/refresh release
|
|
@@ -18,16 +18,19 @@ jobs:
|
|
|
18
18
|
# Enable after configuring the repository environment.
|
|
19
19
|
# environment:
|
|
20
20
|
# name: pypi
|
|
21
|
+
# permissions:
|
|
22
|
+
# id-token: write
|
|
23
|
+
# contents: read
|
|
21
24
|
steps:
|
|
22
25
|
- name: Skip if running with act
|
|
23
26
|
if: ${{ env.ACT == 'true' }}
|
|
24
27
|
run: exit 1
|
|
25
28
|
|
|
26
29
|
- name: Checkout
|
|
27
|
-
uses: actions/checkout@
|
|
30
|
+
uses: actions/checkout@v7.0.1
|
|
28
31
|
|
|
29
32
|
- name: Install uv
|
|
30
|
-
uses: astral-sh/setup-uv@v10.
|
|
33
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
31
34
|
|
|
32
35
|
- name: Install Python
|
|
33
36
|
run: uv python install
|
|
@@ -23,10 +23,10 @@ jobs:
|
|
|
23
23
|
runs-on: ${{ matrix.os }}
|
|
24
24
|
|
|
25
25
|
steps:
|
|
26
|
-
- uses: actions/checkout@
|
|
26
|
+
- uses: actions/checkout@v7.0.1
|
|
27
27
|
|
|
28
28
|
- name: Install the latest version of uv
|
|
29
|
-
uses: astral-sh/setup-uv@
|
|
29
|
+
uses: astral-sh/setup-uv@v10.2.0
|
|
30
30
|
with:
|
|
31
31
|
enable-cache: true
|
|
32
32
|
|
|
@@ -38,8 +38,11 @@ jobs:
|
|
|
38
38
|
|
|
39
39
|
- name: Check TOML/YAML/whitespace
|
|
40
40
|
run: |
|
|
41
|
-
uv run prek run --all-files --show-diff-on-failure --color=always \
|
|
42
|
-
check-toml
|
|
41
|
+
uv run -- prek run --all-files --show-diff-on-failure --color=always \
|
|
42
|
+
check-toml \
|
|
43
|
+
check-yaml \
|
|
44
|
+
trailing-whitespace \
|
|
45
|
+
end-of-file-fixer
|
|
43
46
|
|
|
44
47
|
- run: uv run rumdl fmt --check --diff .
|
|
45
48
|
- run: uv run rumdl check .
|
|
@@ -50,9 +53,3 @@ jobs:
|
|
|
50
53
|
- run: uv run ty check
|
|
51
54
|
|
|
52
55
|
- run: uv run pytest --cov --cov-report=xml
|
|
53
|
-
|
|
54
|
-
# Enable after configuring Codecov and its repository token.
|
|
55
|
-
# - name: Upload coverage to Codecov
|
|
56
|
-
# uses: codecov/codecov-action@v5
|
|
57
|
-
# with:
|
|
58
|
-
# token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
|
|
7
|
+
# Packaging
|
|
8
|
+
build/
|
|
9
|
+
dist/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
|
|
12
|
+
# Testing and coverage
|
|
13
|
+
.pytest_cache/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
.mypy_cache/
|
|
16
|
+
.coverage
|
|
17
|
+
.coverage.*
|
|
18
|
+
coverage.xml
|
|
19
|
+
htmlcov/
|
|
20
|
+
|
|
21
|
+
# uv
|
|
22
|
+
.venv/
|
|
23
|
+
|
|
24
|
+
# rumdl
|
|
25
|
+
.rumdl_cache/
|
|
26
|
+
|
|
27
|
+
# direnv
|
|
28
|
+
.direnv/
|
|
29
|
+
|
|
30
|
+
# Editors
|
|
31
|
+
.idea/
|
|
32
|
+
.vscode/
|
|
33
|
+
*.swp
|
|
34
|
+
*.swo
|
|
35
|
+
*~
|
|
36
|
+
|
|
37
|
+
# OS
|
|
38
|
+
.DS_Store
|
|
39
|
+
Thumbs.db
|
|
40
|
+
|
|
41
|
+
# Environment
|
|
42
|
+
.env
|
|
43
|
+
.env.*
|
|
44
|
+
.app.json
|
|
45
|
+
|
|
46
|
+
# Documentation and notebooks
|
|
47
|
+
/site/
|
|
48
|
+
.ipynb_checkpoints/
|
|
49
|
+
|
|
50
|
+
# Legacy environments
|
|
51
|
+
.pixi/
|
|
52
|
+
|
|
53
|
+
# Scientific application output
|
|
54
|
+
timer.dat
|
|
55
|
+
psi*.clean
|
|
56
|
+
*.CP
|
|
57
|
+
*.CPC
|
|
58
|
+
*.lprof
|
|
59
|
+
pyscf.chk
|
|
60
|
+
local/
|
|
61
|
+
cyp/
|
|
62
|
+
msa_directory/
|
|
63
|
+
|
|
64
|
+
# Local notes and machine-specific agent settings
|
|
65
|
+
notes.md
|
|
66
|
+
/.claude/settings.local.json
|
|
@@ -7,6 +7,7 @@ disable = [
|
|
|
7
7
|
|
|
8
8
|
exclude = [
|
|
9
9
|
".git",
|
|
10
|
+
".venv",
|
|
10
11
|
"node_modules",
|
|
11
12
|
"vendor",
|
|
12
13
|
"dist",
|
|
@@ -17,5 +18,4 @@ respect-gitignore = true
|
|
|
17
18
|
|
|
18
19
|
[per-file-ignores]
|
|
19
20
|
# Skill files start with frontmatter, not headings
|
|
20
|
-
"
|
|
21
|
-
".agents/**/*.md" = ["MD041"]
|
|
21
|
+
"**/skills/**/*.md" = ["MD041"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: rowan-python
|
|
3
|
-
Version: 3.2.
|
|
3
|
+
Version: 3.2.1
|
|
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
|
|
@@ -12,22 +12,19 @@ Requires-Dist: httpx
|
|
|
12
12
|
Requires-Dist: nest-asyncio
|
|
13
13
|
Requires-Dist: rdkit
|
|
14
14
|
Requires-Dist: setuptools
|
|
15
|
-
Requires-Dist: stjames>=0.0.
|
|
15
|
+
Requires-Dist: stjames>=0.0.275
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
17
|
|
|
18
18
|
# Rowan Python Library
|
|
19
19
|
|
|
20
20
|
[](https://pypi.python.org/pypi/rowan-python)
|
|
21
21
|
[](https://docs.astral.sh/uv/)
|
|
22
|
-
[](https://github.com/astral-sh/ruff)
|
|
23
23
|
[](https://pypi.python.org/pypi/rowan-python/)
|
|
24
24
|
[](LICENSE)
|
|
25
25
|
[](https://github.com/rowansci/rowan-python/actions)
|
|
26
|
-
[](https://github.com/astral-sh/ty)
|
|
28
27
|
[](https://rumdl.dev)
|
|
29
|
-
[](https://codecov.io/gh/rowansci/rowan-python)
|
|
30
|
-
-->
|
|
31
28
|
|
|
32
29
|
The Rowan Python library is the Python SDK for running Rowan computational chemistry workflows
|
|
33
30
|
programmatically. Use it from scripts and applications to submit calculations, monitor workflow
|
|
@@ -2,15 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://pypi.python.org/pypi/rowan-python)
|
|
4
4
|
[](https://docs.astral.sh/uv/)
|
|
5
|
-
[](https://github.com/astral-sh/ruff)
|
|
6
6
|
[](https://pypi.python.org/pypi/rowan-python/)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
[](https://github.com/rowansci/rowan-python/actions)
|
|
9
|
-
[](https://github.com/astral-sh/ty)
|
|
11
10
|
[](https://rumdl.dev)
|
|
12
|
-
[](https://codecov.io/gh/rowansci/rowan-python)
|
|
13
|
-
-->
|
|
14
11
|
|
|
15
12
|
The Rowan Python library is the Python SDK for running Rowan computational chemistry workflows
|
|
16
13
|
programmatically. Use it from scripts and applications to submit calculations, monitor workflow
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
# schema https://www.schemastore.org/prek.json
|
|
1
2
|
exclude = '(^\.venv/|^\.pixi/|\.dat$|\.patch$)'
|
|
3
|
+
default_install_hook_types = ["pre-commit", "pre-push"]
|
|
2
4
|
default_stages = ["pre-commit", "pre-push"]
|
|
3
5
|
|
|
4
6
|
[[repos]]
|
|
@@ -6,6 +8,7 @@ repo = "builtin"
|
|
|
6
8
|
hooks = [
|
|
7
9
|
{ id = "check-toml" },
|
|
8
10
|
{ id = "check-yaml", args = ["--unsafe"] },
|
|
11
|
+
{ id = "check-merge-conflict" },
|
|
9
12
|
{ id = "end-of-file-fixer" },
|
|
10
13
|
{ id = "trailing-whitespace" },
|
|
11
14
|
]
|
|
@@ -13,6 +16,14 @@ hooks = [
|
|
|
13
16
|
[[repos]]
|
|
14
17
|
repo = "local"
|
|
15
18
|
|
|
19
|
+
[[repos.hooks]]
|
|
20
|
+
id = "uv-lock-check"
|
|
21
|
+
name = "uv lock --check"
|
|
22
|
+
language = "system"
|
|
23
|
+
entry = "uv lock --check"
|
|
24
|
+
files = '^(pyproject\.toml|uv\.lock)$'
|
|
25
|
+
pass_filenames = false
|
|
26
|
+
|
|
16
27
|
[[repos.hooks]]
|
|
17
28
|
id = "rumdl-fmt"
|
|
18
29
|
name = "rumdl-fmt"
|
|
@@ -29,13 +40,12 @@ entry = "uv run rumdl check . --fix"
|
|
|
29
40
|
types = ["markdown"]
|
|
30
41
|
pass_filenames = false
|
|
31
42
|
|
|
32
|
-
|
|
33
43
|
[[repos.hooks]]
|
|
34
44
|
id = "ruff-format"
|
|
35
45
|
name = "ruff-format"
|
|
36
46
|
language = "system"
|
|
37
47
|
entry = "uv run ruff format ."
|
|
38
|
-
|
|
48
|
+
types_or = ["python", "pyi"]
|
|
39
49
|
pass_filenames = false
|
|
40
50
|
|
|
41
51
|
[[repos.hooks]]
|
|
@@ -43,7 +53,7 @@ id = "ruff-check"
|
|
|
43
53
|
name = "ruff-check"
|
|
44
54
|
language = "system"
|
|
45
55
|
entry = "uv run ruff check . --fix"
|
|
46
|
-
|
|
56
|
+
types_or = ["python", "pyi"]
|
|
47
57
|
pass_filenames = false
|
|
48
58
|
|
|
49
59
|
[[repos.hooks]]
|
|
@@ -51,15 +61,14 @@ id = "ty"
|
|
|
51
61
|
name = "ty"
|
|
52
62
|
language = "system"
|
|
53
63
|
entry = "uv run ty check"
|
|
54
|
-
|
|
64
|
+
types_or = ["python", "pyi"]
|
|
55
65
|
pass_filenames = false
|
|
56
|
-
stages = ["pre-commit"]
|
|
57
66
|
|
|
58
67
|
[[repos.hooks]]
|
|
59
68
|
id = "pytest"
|
|
60
|
-
stages = ["pre-push"]
|
|
61
69
|
name = "pytest"
|
|
62
70
|
language = "system"
|
|
63
71
|
entry = "uv run pytest"
|
|
64
|
-
|
|
72
|
+
always_run = true
|
|
65
73
|
pass_filenames = false
|
|
74
|
+
stages = ["pre-push"]
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "rowan-python"
|
|
3
|
-
version = "3.2.
|
|
3
|
+
version = "3.2.1"
|
|
4
4
|
description = "Rowan Python Library"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
7
8
|
requires-python = ">=3.12"
|
|
8
9
|
authors = [
|
|
9
10
|
{ name = "Corin Wagen", email = "corin@rowansci.com" },
|
|
@@ -11,7 +12,7 @@ authors = [
|
|
|
11
12
|
]
|
|
12
13
|
dependencies = [
|
|
13
14
|
"httpx",
|
|
14
|
-
"stjames>=0.0.
|
|
15
|
+
"stjames>=0.0.275",
|
|
15
16
|
"setuptools",
|
|
16
17
|
"rdkit",
|
|
17
18
|
"nest-asyncio",
|
|
@@ -104,6 +105,9 @@ ignore = [
|
|
|
104
105
|
[tool.ruff.lint.per-file-ignores]
|
|
105
106
|
"__init__.py" = ["F401", "F403"]
|
|
106
107
|
|
|
108
|
+
[tool.ruff.lint.flake8-type-checking]
|
|
109
|
+
runtime-evaluated-base-classes = ["pydantic.BaseModel"]
|
|
110
|
+
|
|
107
111
|
[tool.ruff.lint.pydocstyle]
|
|
108
112
|
convention = "google"
|
|
109
113
|
|
|
@@ -139,7 +143,6 @@ packages = ["rowan"]
|
|
|
139
143
|
[tool.hatch.build.targets.sdist]
|
|
140
144
|
exclude = [
|
|
141
145
|
"/AGENTS.md",
|
|
142
|
-
"/CLAUDE.md",
|
|
143
146
|
"/.agents",
|
|
144
147
|
"/.claude",
|
|
145
148
|
]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
from datetime import datetime
|
|
3
4
|
from typing import TYPE_CHECKING, Any, Self
|
|
4
5
|
|
|
5
6
|
from pydantic import BaseModel
|
|
@@ -8,8 +9,6 @@ from .project import default_project, retrieve_project
|
|
|
8
9
|
from .utils import api_client, get_project_uuid
|
|
9
10
|
|
|
10
11
|
if TYPE_CHECKING:
|
|
11
|
-
from datetime import datetime
|
|
12
|
-
|
|
13
12
|
from .workflows.base import Workflow
|
|
14
13
|
|
|
15
14
|
|
|
@@ -65,8 +64,6 @@ class Folder(BaseModel):
|
|
|
65
64
|
for field_name in self.__class__.model_fields:
|
|
66
65
|
setattr(self, field_name, getattr(updated_folder, field_name))
|
|
67
66
|
|
|
68
|
-
self.model_rebuild()
|
|
69
|
-
|
|
70
67
|
return self
|
|
71
68
|
|
|
72
69
|
def update(
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import time
|
|
2
1
|
import warnings
|
|
3
2
|
from datetime import datetime
|
|
4
3
|
from pathlib import Path
|
|
@@ -22,7 +21,6 @@ class Protein(BaseModel):
|
|
|
22
21
|
created_at: creation date of the protein
|
|
23
22
|
used_in_workflow: whether the protein is used in a workflow
|
|
24
23
|
ancestor_uuid: UUID of the ancestor protein
|
|
25
|
-
sanitized: whether the protein is sanitized
|
|
26
24
|
name: name of the protein
|
|
27
25
|
data: data of the protein
|
|
28
26
|
public: whether the protein is public
|
|
@@ -32,7 +30,6 @@ class Protein(BaseModel):
|
|
|
32
30
|
created_at: datetime | None = None
|
|
33
31
|
used_in_workflow: bool | None = None
|
|
34
32
|
ancestor_uuid: str | None = None
|
|
35
|
-
sanitized: int | None = None
|
|
36
33
|
name: str | None = None
|
|
37
34
|
data: dict | None = None
|
|
38
35
|
public: bool | None = None
|
|
@@ -188,7 +185,6 @@ class Protein(BaseModel):
|
|
|
188
185
|
self.data = protein_data.get("data")
|
|
189
186
|
self.public = protein_data.get("public")
|
|
190
187
|
self.pocket = protein_data.get("pocket")
|
|
191
|
-
self.sanitized = protein_data.get("sanitized")
|
|
192
188
|
self.used_in_workflow = protein_data.get("used_in_workflow")
|
|
193
189
|
self._workflow_uuid = workflow_uuid
|
|
194
190
|
return self
|
|
@@ -241,118 +237,6 @@ class Protein(BaseModel):
|
|
|
241
237
|
response = client.delete(f"/protein/{self.uuid}")
|
|
242
238
|
response.raise_for_status()
|
|
243
239
|
|
|
244
|
-
def sanitize(self, poll_interval: float = 10.0, timeout: float = 300.0) -> None:
|
|
245
|
-
"""Sanitizes a protein and waits for the process to complete.
|
|
246
|
-
|
|
247
|
-
Protein sanitization runs asynchronously on the server. This method
|
|
248
|
-
submits the request then polls until sanitization succeeds, fails, or
|
|
249
|
-
times out.
|
|
250
|
-
|
|
251
|
-
Args:
|
|
252
|
-
poll_interval: seconds between status checks (default 10)
|
|
253
|
-
timeout: maximum seconds to wait before raising (default 300)
|
|
254
|
-
|
|
255
|
-
Raises:
|
|
256
|
-
RuntimeError: sanitization fails, is stopped, or times out
|
|
257
|
-
httpx.HTTPStatusError: any API request fails
|
|
258
|
-
"""
|
|
259
|
-
with api_client() as client:
|
|
260
|
-
response = client.post(f"/protein/sanitize/{self.uuid}")
|
|
261
|
-
response.raise_for_status()
|
|
262
|
-
|
|
263
|
-
deadline = time.monotonic() + timeout
|
|
264
|
-
while time.monotonic() < deadline:
|
|
265
|
-
time.sleep(poll_interval)
|
|
266
|
-
self.refresh()
|
|
267
|
-
match self.sanitized:
|
|
268
|
-
case 2: # success
|
|
269
|
-
return
|
|
270
|
-
case 3: # failed
|
|
271
|
-
raise RuntimeError(
|
|
272
|
-
f"Protein sanitization failed for {self.uuid}. "
|
|
273
|
-
"Check the protein in the Rowan UI for details."
|
|
274
|
-
)
|
|
275
|
-
case 4: # stopped
|
|
276
|
-
raise RuntimeError(f"Protein sanitization was stopped for {self.uuid}.")
|
|
277
|
-
case _: # 1 (in progress) or None: keep polling
|
|
278
|
-
pass
|
|
279
|
-
|
|
280
|
-
raise RuntimeError(f"Protein sanitization timed out after {timeout:.0f}s for {self.uuid}.")
|
|
281
|
-
|
|
282
|
-
def prepare(
|
|
283
|
-
self,
|
|
284
|
-
find_missing_residues: bool = True,
|
|
285
|
-
add_missing_atoms: bool = True,
|
|
286
|
-
remove_heterogens: bool = True,
|
|
287
|
-
keep_waters: bool = False,
|
|
288
|
-
remove_hydrogens: bool = False,
|
|
289
|
-
remove_invalid_hydrogens: bool = False,
|
|
290
|
-
add_hydrogens: bool = True,
|
|
291
|
-
add_hydrogen_ph: float = 7.0,
|
|
292
|
-
optimize_hydrogens: bool = True,
|
|
293
|
-
poll_interval: float = 10.0,
|
|
294
|
-
timeout: float = 300.0,
|
|
295
|
-
) -> None:
|
|
296
|
-
"""Quickly prepare a protein in place using PDBFixer and OpenMM.
|
|
297
|
-
|
|
298
|
-
Runs PDBFixer to fix nonstandard residues, add missing atoms/hydrogens,
|
|
299
|
-
and optionally optimizes hydrogen positions with OpenMM. This is the fast
|
|
300
|
-
preparation option and typically finishes in about a minute or less. Use
|
|
301
|
-
`submit_protein_preparation_workflow` for the full protein preparation workflow,
|
|
302
|
-
which can take around ten minutes but includes Boltz-2 missing-structure modeling,
|
|
303
|
-
terminal capping, selectable protonation methods, and retained non-polymers.
|
|
304
|
-
|
|
305
|
-
Args:
|
|
306
|
-
find_missing_residues: identify and model missing residues
|
|
307
|
-
add_missing_atoms: add missing heavy atoms to residues
|
|
308
|
-
remove_heterogens: remove ligands, salts, and other heterogens
|
|
309
|
-
keep_waters: preserve water molecules when removing heterogens
|
|
310
|
-
remove_hydrogens: remove all existing hydrogens before adding new ones
|
|
311
|
-
remove_invalid_hydrogens: remove hydrogens not matching the forcefield template
|
|
312
|
-
add_hydrogens: add missing hydrogen atoms
|
|
313
|
-
add_hydrogen_ph: pH used to determine protonation states when adding hydrogens
|
|
314
|
-
optimize_hydrogens: optimize hydrogen positions with OpenMM energy minimization
|
|
315
|
-
poll_interval: seconds between status checks (default 10)
|
|
316
|
-
timeout: maximum seconds to wait before raising (default 300)
|
|
317
|
-
|
|
318
|
-
Raises:
|
|
319
|
-
RuntimeError: preparation fails, is stopped, or times out
|
|
320
|
-
httpx.HTTPStatusError: any API request fails
|
|
321
|
-
"""
|
|
322
|
-
params = {
|
|
323
|
-
"find_missing_residues": find_missing_residues,
|
|
324
|
-
"add_missing_atoms": add_missing_atoms,
|
|
325
|
-
"remove_heterogens": remove_heterogens,
|
|
326
|
-
"keep_waters": keep_waters,
|
|
327
|
-
"remove_hydrogens": remove_hydrogens,
|
|
328
|
-
"remove_invalid_hydrogens": remove_invalid_hydrogens,
|
|
329
|
-
"add_hydrogens": add_hydrogens,
|
|
330
|
-
"add_hydrogen_ph": add_hydrogen_ph,
|
|
331
|
-
"optimize_hydrogens": optimize_hydrogens,
|
|
332
|
-
}
|
|
333
|
-
with api_client() as client:
|
|
334
|
-
response = client.post(f"/protein/prepare/{self.uuid}", params=params)
|
|
335
|
-
response.raise_for_status()
|
|
336
|
-
|
|
337
|
-
deadline = time.monotonic() + timeout
|
|
338
|
-
while time.monotonic() < deadline:
|
|
339
|
-
time.sleep(poll_interval)
|
|
340
|
-
self.refresh()
|
|
341
|
-
match self.sanitized:
|
|
342
|
-
case 2:
|
|
343
|
-
return
|
|
344
|
-
case 3:
|
|
345
|
-
raise RuntimeError(
|
|
346
|
-
f"Protein preparation failed for {self.uuid}. "
|
|
347
|
-
"Check the protein in the Rowan UI for details."
|
|
348
|
-
)
|
|
349
|
-
case 4:
|
|
350
|
-
raise RuntimeError(f"Protein preparation was stopped for {self.uuid}.")
|
|
351
|
-
case _:
|
|
352
|
-
pass
|
|
353
|
-
|
|
354
|
-
raise RuntimeError(f"Protein preparation timed out after {timeout:.0f}s for {self.uuid}.")
|
|
355
|
-
|
|
356
240
|
def validate_protein_forcefield(self, exclude_residues: list[str | int] | None = None) -> None:
|
|
357
241
|
"""Validate that this protein can be parameterized with the MD forcefield.
|
|
358
242
|
|
|
@@ -82,7 +82,8 @@ def submit_binding_affinity_workflow(
|
|
|
82
82
|
input modes are supported:
|
|
83
83
|
|
|
84
84
|
**Mode 1 – holo protein:** protein already contains the bound ligand. Pass
|
|
85
|
-
`ligand_residue_name` to identify which residue is the ligand vs. the receptor
|
|
85
|
+
`ligand_residue_name` to identify which residue is the ligand vs. the receptor,
|
|
86
|
+
and exactly one entry in `ligand_smiles` describing that bound ligand.
|
|
86
87
|
Do not pass `ligand_structures`.
|
|
87
88
|
|
|
88
89
|
**Mode 2 – apo protein + external poses:** protein has no bound ligand. Pass
|
|
@@ -101,13 +102,15 @@ def submit_binding_affinity_workflow(
|
|
|
101
102
|
protein: protein structure. Can be input as a UUID or a Protein object. Required
|
|
102
103
|
unless `protein_sequences` is set (mode 3)
|
|
103
104
|
ligand_residue_name: residue name identifying the ligand in a holo protein PDB
|
|
104
|
-
(mode 1 only)
|
|
105
|
+
(mode 1 only); requires exactly one matching `ligand_smiles` entry
|
|
105
106
|
ligand_structures: external ligand poses to score, already in the protein's
|
|
106
107
|
coordinate frame. Must have 3D coordinates (mode 2 only)
|
|
107
108
|
protein_sequences: protein sequences to score against, in place of `protein`
|
|
108
109
|
(mode 3, NESSO only)
|
|
109
|
-
ligand_smiles:
|
|
110
|
-
`
|
|
110
|
+
ligand_smiles: exactly one SMILES describing the bound ligand with
|
|
111
|
+
`ligand_residue_name` (mode 1, all methods), or ligand SMILES to score without
|
|
112
|
+
structural ligand inputs (mode 3, NESSO only). Not accepted with
|
|
113
|
+
`ligand_structures`
|
|
111
114
|
binding_affinity_settings: settings controlling how binding affinity is
|
|
112
115
|
computed: `SinglePointEnergySettings` (SQM), `GninaAffinitySettings`,
|
|
113
116
|
`AEVPLIGAffinitySettings`, or `NessoAffinitySettings`. Defaults to
|
|
@@ -142,6 +142,7 @@ def submit_protein_md_workflow(
|
|
|
142
142
|
nonbonded_cutoff: float = 8.0,
|
|
143
143
|
ionic_strength_M: float = 0.0,
|
|
144
144
|
water_buffer: float = 8.0,
|
|
145
|
+
frame_save_interval_ps: float = 10.0,
|
|
145
146
|
save_solvent: bool = False,
|
|
146
147
|
num_solvent_to_save: int | None = None,
|
|
147
148
|
small_molecules: dict[str | int, str | None] | None = None,
|
|
@@ -178,6 +179,8 @@ def submit_protein_md_workflow(
|
|
|
178
179
|
nonbonded_cutoff: nonbonded cutoff for particle-mesh Ewald, in A
|
|
179
180
|
ionic_strength_M: ionic strength of the solution, in M (molar)
|
|
180
181
|
water_buffer: amount of water to add around the protein, in A
|
|
182
|
+
frame_save_interval_ps: how often to save a frame to the trajectory, in ps; must be
|
|
183
|
+
an integer multiple of timestep_fs
|
|
181
184
|
save_solvent: whether solvent should be saved
|
|
182
185
|
num_solvent_to_save: keep this many solvent molecules nearest the binder, or all if None;
|
|
183
186
|
only meaningful when save_solvent is True and a binder is present
|
|
@@ -246,6 +249,7 @@ def submit_protein_md_workflow(
|
|
|
246
249
|
nonbonded_cutoff=nonbonded_cutoff,
|
|
247
250
|
ionic_strength_M=ionic_strength_M,
|
|
248
251
|
water_buffer=water_buffer,
|
|
252
|
+
frame_save_interval_ps=frame_save_interval_ps,
|
|
249
253
|
save_solvent=save_solvent,
|
|
250
254
|
num_solvent_to_save=num_solvent_to_save,
|
|
251
255
|
small_molecules=small_molecules,
|
|
@@ -75,7 +75,7 @@ def submit_protein_preparation_workflow(
|
|
|
75
75
|
"""Submit a protein-preparation workflow to the API.
|
|
76
76
|
|
|
77
77
|
Full protein preparation can take around ten minutes, depending on the structure and
|
|
78
|
-
settings.
|
|
78
|
+
settings.
|
|
79
79
|
|
|
80
80
|
Args:
|
|
81
81
|
protein: protein to prepare, as a UUID or Protein object
|
|
@@ -140,6 +140,8 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
|
|
|
140
140
|
lambda_vals: list[float] | None = None,
|
|
141
141
|
path: Path | str | None = None,
|
|
142
142
|
name: str | None = None,
|
|
143
|
+
*,
|
|
144
|
+
leg: Literal["complex", "solvent"] = "complex",
|
|
143
145
|
) -> Path:
|
|
144
146
|
"""Download DCD trajectory files for a specific perturbation edge.
|
|
145
147
|
|
|
@@ -148,6 +150,7 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
|
|
|
148
150
|
lambda_vals: lambda values to download. Defaults to all windows
|
|
149
151
|
path: directory to save the file to. Defaults to current directory
|
|
150
152
|
name: custom name for the tar.gz file (without extension)
|
|
153
|
+
leg: thermodynamic leg whose trajectories should be downloaded
|
|
151
154
|
|
|
152
155
|
Returns:
|
|
153
156
|
path to the downloaded tar.gz file
|
|
@@ -163,27 +166,34 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
|
|
|
163
166
|
path = Path(path) if path is not None else Path.cwd()
|
|
164
167
|
path.mkdir(parents=True, exist_ok=True)
|
|
165
168
|
|
|
166
|
-
params: dict = {"edge_index": edge_index}
|
|
167
|
-
if lambda_vals is not None:
|
|
168
|
-
params["lambda_vals"] = lambda_vals
|
|
169
|
+
params: dict = {"edge_index": edge_index, "leg": leg}
|
|
169
170
|
|
|
170
|
-
|
|
171
|
+
default_name = (
|
|
172
|
+
f"edge_{edge_index}_trajectories"
|
|
173
|
+
if leg == "complex"
|
|
174
|
+
else f"edge_{edge_index}_{leg}_trajectories"
|
|
175
|
+
)
|
|
176
|
+
file_name = f"{name or default_name}.tar.gz"
|
|
171
177
|
file_path = path / file_name
|
|
172
178
|
return download_file(
|
|
173
179
|
file_path,
|
|
174
180
|
"POST",
|
|
175
181
|
f"/trajectory/{self.workflow_uuid}/rbfe_trajectory_dcds",
|
|
176
182
|
params=params,
|
|
183
|
+
json=lambda_vals,
|
|
177
184
|
)
|
|
178
185
|
|
|
179
186
|
def download_all_trajectories(
|
|
180
187
|
self,
|
|
181
188
|
path: Path | str | None = None,
|
|
189
|
+
*,
|
|
190
|
+
leg: Literal["complex", "solvent"] = "complex",
|
|
182
191
|
) -> list[Path]:
|
|
183
192
|
"""Download DCD trajectory files for all perturbation edges.
|
|
184
193
|
|
|
185
194
|
Args:
|
|
186
195
|
path: directory to save the files to. Defaults to current directory
|
|
196
|
+
leg: thermodynamic leg whose trajectories should be downloaded
|
|
187
197
|
|
|
188
198
|
Returns:
|
|
189
199
|
list of paths to the downloaded tar.gz files, one per edge
|
|
@@ -191,7 +201,9 @@ class RelativeBindingFreeEnergyPerturbationResult(WorkflowResult):
|
|
|
191
201
|
Raises:
|
|
192
202
|
httpx.HTTPStatusError: any API request fails
|
|
193
203
|
"""
|
|
194
|
-
return [
|
|
204
|
+
return [
|
|
205
|
+
self.download_edge_trajectories(i, path=path, leg=leg) for i in range(len(self.edges))
|
|
206
|
+
]
|
|
195
207
|
|
|
196
208
|
@property
|
|
197
209
|
def ligand_dg_results(self) -> dict[str, RelativeBindingFreeEnergyResult] | None:
|