mdprep 0.2.0__tar.gz → 0.3.0__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.
- {mdprep-0.2.0 → mdprep-0.3.0}/.gitignore +10 -0
- mdprep-0.3.0/CHANGELOG.md +219 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/PKG-INFO +41 -6
- {mdprep-0.2.0 → mdprep-0.3.0}/README.md +31 -3
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/README.md +2 -0
- mdprep-0.3.0/docs/guided_manifests.md +152 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/installation.md +42 -9
- mdprep-0.3.0/docs/ligands.md +91 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/manifest_reference.md +28 -2
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/metals.md +157 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/molecular_dynamics.md +55 -0
- mdprep-0.3.0/docs/protonation.md +181 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/qmmm_refinement.md +58 -7
- mdprep-0.3.0/docs/quickstart.md +75 -0
- mdprep-0.3.0/docs/tleap_and_validation.md +97 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/troubleshooting.md +29 -0
- mdprep-0.3.0/environment-minimal.yml +17 -0
- mdprep-0.3.0/environment.yml +45 -0
- mdprep-0.3.0/examples/16_besd_halogenase_gfn2_mcpb.yaml +163 -0
- mdprep-0.3.0/examples/README.md +90 -0
- mdprep-0.3.0/examples/colab/mdprep_colab_pipeline.py +1618 -0
- mdprep-0.3.0/examples/colab_smoke_test.ipynb +114 -0
- mdprep-0.3.0/examples/mdprep_colab_run.ipynb +277 -0
- mdprep-0.3.0/examples/mdprep_interactive_colab.ipynb +2189 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/pyproject.toml +46 -3
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/__init__.py +1 -1
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/mol2.py +69 -3
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/cli.py +239 -8
- mdprep-0.3.0/src/mdprep/config/decisions.py +2357 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/config/models.py +144 -16
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/builder.py +3 -2
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/log_parser.py +15 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/residues.py +70 -30
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/extract.py +30 -0
- mdprep-0.3.0/src/mdprep/ligands/hydrogenate.py +420 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/workflow.py +2 -0
- mdprep-0.3.0/src/mdprep/md/imaging.py +146 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/md/roe_brooks.py +139 -30
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/gxtb_hessian.py +45 -8
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/hydrogenate.py +9 -18
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mcpb.py +350 -29
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/nonbonded.py +25 -4
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/pyscf_mcpb.py +174 -12
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/apply.py +45 -23
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/histidine_geometry.py +98 -10
- mdprep-0.3.0/src/mdprep/protonation/histidine_qmmm.py +597 -0
- mdprep-0.3.0/src/mdprep/protonation/histidine_xtb.py +966 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/propka_parser.py +11 -3
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/report.py +3 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/temporary_hydrogenation.py +194 -22
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/xtb_runner.py +47 -3
- mdprep-0.3.0/src/mdprep/qm/xtb_esp.py +357 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/coordinates.py +2 -18
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/mapping.py +4 -0
- mdprep-0.3.0/src/mdprep/refinement/openmm_minimizer.py +327 -0
- mdprep-0.3.0/src/mdprep/refinement/report.py +116 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/selection.py +52 -3
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/workflow.py +55 -19
- mdprep-0.3.0/src/mdprep/structure/classify.py +262 -0
- mdprep-0.3.0/src/mdprep/structure/completeness.py +169 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/inspect.py +9 -2
- mdprep-0.3.0/src/mdprep/structure/mmcif.py +248 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/models.py +37 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/normalize.py +140 -4
- mdprep-0.3.0/src/mdprep/structure/pdb.py +709 -0
- mdprep-0.3.0/src/mdprep/structure/pdb_fields.py +341 -0
- mdprep-0.3.0/src/mdprep/structure/reader.py +47 -0
- mdprep-0.3.0/src/mdprep/structure/rename.py +105 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/repair.py +168 -13
- mdprep-0.3.0/src/mdprep/structure/writer.py +227 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/topology.py +61 -3
- mdprep-0.3.0/src/mdprep/workflows/doctor.py +249 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/prepare.py +58 -16
- mdprep-0.3.0/src/mdprep/workflows/runtime.py +270 -0
- mdprep-0.3.0/src/mdprep/workflows/wizard.py +202 -0
- mdprep-0.3.0/tests/besd_structure.py +68 -0
- mdprep-0.3.0/tests/browser/launch.mjs +58 -0
- mdprep-0.3.0/tests/browser/smoke.mjs +216 -0
- mdprep-0.3.0/tests/browser/student_flow.mjs +117 -0
- mdprep-0.3.0/tests/conftest.py +3 -0
- mdprep-0.3.0/tests/data/amber/README.md +13 -0
- mdprep-0.3.0/tests/data/amber/ace_ala_gly_nme.inpcrd +17 -0
- mdprep-0.3.0/tests/data/amber/ace_ala_gly_nme.prmtop +286 -0
- mdprep-0.3.0/tests/data/boltz_far_donor.cif +50 -0
- mdprep-0.3.0/tests/data/boltz_model.cif +41 -0
- mdprep-0.3.0/tests/data/boltz_smiles_ligands.cif +47 -0
- mdprep-0.3.0/tests/data/boltz_wide_names.cif +50 -0
- mdprep-0.3.0/tests/data/protein_with_hydrogenated_free_lysine.pdb +54 -0
- mdprep-0.3.0/tests/data/protein_zinc_aqua.pdb +22 -0
- mdprep-0.3.0/tests/test_besd_halogenase_case.py +351 -0
- mdprep-0.3.0/tests/test_browser_planning_path.py +120 -0
- mdprep-0.3.0/tests/test_build_residues_is_defined_once.py +96 -0
- mdprep-0.3.0/tests/test_cli.py +49 -0
- mdprep-0.3.0/tests/test_colab_run_notebook.py +125 -0
- mdprep-0.3.0/tests/test_colab_smoke_notebook.py +15 -0
- mdprep-0.3.0/tests/test_colab_wizard_notebook.py +416 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_config_validation.py +27 -0
- mdprep-0.3.0/tests/test_coordinating_ions.py +200 -0
- mdprep-0.3.0/tests/test_doctor.py +242 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_gxtb_hessian.py +33 -0
- mdprep-0.3.0/tests/test_external_md_restraint_frame.py +97 -0
- mdprep-0.3.0/tests/test_external_md_snapshot_box.py +131 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_structure_repair.py +88 -0
- mdprep-0.3.0/tests/test_external_xtb_embedding.py +113 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_gxtb_hessian.py +70 -13
- mdprep-0.3.0/tests/test_histidine_cluster_metal.py +166 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_histidine_geometry.py +53 -5
- mdprep-0.3.0/tests/test_histidine_qmmm.py +293 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_input_pdb.py +7 -23
- mdprep-0.3.0/tests/test_leap_ligand_residue_names.py +272 -0
- mdprep-0.3.0/tests/test_ligand_hydrogenation.py +405 -0
- mdprep-0.3.0/tests/test_ligand_mol2_validation.py +0 -0
- mdprep-0.3.0/tests/test_manifest_decisions.py +939 -0
- mdprep-0.3.0/tests/test_manifest_wizard.py +369 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mcpb_pyscf_fixed_geometry.py +5 -0
- mdprep-0.3.0/tests/test_md_imaging.py +180 -0
- mdprep-0.3.0/tests/test_metal_hydrogenation_preservation.py +88 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_metals.py +56 -0
- mdprep-0.3.0/tests/test_mmcif.py +406 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mol2_validation.py +39 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_packaging_metadata.py +1 -1
- mdprep-0.3.0/tests/test_pdb_large_serials.py +154 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pdb_parser.py +26 -0
- mdprep-0.3.0/tests/test_pdb_roundtrip_property.py +285 -0
- mdprep-0.3.0/tests/test_pdb_writer.py +178 -0
- mdprep-0.3.0/tests/test_prediction_pdb_quirks.py +123 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_refinement_stage.py +7 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_tleap_stage.py +1 -1
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_xtb_workflow.py +39 -8
- mdprep-0.3.0/tests/test_qm_region_spin_state.py +172 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_config.py +46 -2
- mdprep-0.3.0/tests/test_refinement_openmm.py +190 -0
- mdprep-0.3.0/tests/test_refinement_platform.py +153 -0
- mdprep-0.3.0/tests/test_refinement_report.py +156 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_selection.py +7 -0
- mdprep-0.3.0/tests/test_residue_rename.py +148 -0
- mdprep-0.3.0/tests/test_roe_brooks_restraints.py +162 -0
- mdprep-0.3.0/tests/test_runtime_requirements.py +396 -0
- mdprep-0.3.0/tests/test_runtime_requirements_cover_every_option.py +324 -0
- mdprep-0.3.0/tests/test_structure_completeness.py +256 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_structure_normalize.py +32 -0
- mdprep-0.3.0/tests/test_structure_repair_inputs.py +183 -0
- mdprep-0.3.0/tests/test_temporary_hydrogenation_hold_back.py +145 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_validation_helpers.py +56 -0
- mdprep-0.3.0/tests/test_validation_topology.py +28 -0
- mdprep-0.3.0/tests/test_web_builder_browser.py +340 -0
- mdprep-0.3.0/tests/test_web_builder_reference_case.py +232 -0
- mdprep-0.3.0/tests/test_web_bundle_zip.py +116 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_xtb_command_builder.py +27 -0
- mdprep-0.3.0/tests/test_xtb_esp.py +150 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_xtb_water_hydrogens.py +14 -2
- mdprep-0.3.0/web/.gitignore +1 -0
- mdprep-0.3.0/web/README.md +118 -0
- mdprep-0.3.0/web/app.js +918 -0
- mdprep-0.3.0/web/build.py +79 -0
- mdprep-0.3.0/web/index.html +149 -0
- mdprep-0.3.0/web/style.css +323 -0
- mdprep-0.3.0/web/zip.js +154 -0
- mdprep-0.2.0/.github/workflows/tests.yml +0 -52
- mdprep-0.2.0/CHANGELOG.md +0 -54
- mdprep-0.2.0/MANIFEST.in +0 -11
- mdprep-0.2.0/Roe_and_Brooks.py +0 -41
- mdprep-0.2.0/Roe_and_Brooks_corrected.py +0 -587
- mdprep-0.2.0/docs/ligands.md +0 -48
- mdprep-0.2.0/docs/protonation.md +0 -70
- mdprep-0.2.0/docs/quickstart.md +0 -41
- mdprep-0.2.0/docs/tleap_and_validation.md +0 -41
- mdprep-0.2.0/environment.yml +0 -24
- mdprep-0.2.0/examples/README.md +0 -28
- mdprep-0.2.0/examples/tutorials/7E07.pdb +0 -5271
- mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/README.md +0 -121
- mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/input.pdb +0 -2384
- mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/optimized_small_model.pdb +0 -55
- mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/reference/large_embedded_cdiis150_restart.chk +0 -0
- mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/system.yaml +0 -239
- mdprep-0.2.0/examples/tutorials/7E07_prepared.pdb +0 -2382
- mdprep-0.2.0/examples/tutorials/minimal_user_mol2/README.md +0 -15
- mdprep-0.2.0/examples/tutorials/minimal_user_mol2/input.pdb +0 -3
- mdprep-0.2.0/examples/tutorials/minimal_user_mol2/ligand.frcmod +0 -11
- mdprep-0.2.0/examples/tutorials/minimal_user_mol2/ligand.mol2 +0 -11
- mdprep-0.2.0/examples/tutorials/minimal_user_mol2/system.yaml +0 -71
- mdprep-0.2.0/scripts/run_smoke_tests.sh +0 -17
- mdprep-0.2.0/src/mdprep/protonation/histidine_xtb.py +0 -390
- mdprep-0.2.0/src/mdprep/refinement/report.py +0 -66
- mdprep-0.2.0/src/mdprep/structure/classify.py +0 -92
- mdprep-0.2.0/src/mdprep/structure/pdb.py +0 -511
- mdprep-0.2.0/src/mdprep/structure/writer.py +0 -84
- mdprep-0.2.0/tests/test_cli.py +0 -23
- mdprep-0.2.0/tests/test_pdb_writer.py +0 -55
- {mdprep-0.2.0 → mdprep-0.3.0}/AGENTS.md +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/CITATION.cff +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/CONTRIBUTING.md +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/LICENSE +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/developer_notes.md +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/mcpb_xtb_benchmark.md +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/docs/qmmesp_pyscf.md +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/environment-dev.yml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/00_basic_protein.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/01_protein_only_ff19sb.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/02_manual_catalytic_protonation.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/03_multi_ligand_am1bcc.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/04_qmmesp_pyscf_ligand.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/05_histidine_gxtb_sp.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/06_disulfide_manual.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/07_gas_resp_pyscf_ligand.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/08_nonbonded_zinc_1264.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/09_bonded_zinc_mcpb_prepare.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/10_qmmm_refinement_ash.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/11_qmmm_metal_gfn2_mcpb.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/12_qmmm_metal_mace_polar1_mcpb.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/13_qmmm_refinement_gxtb_mechanical.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/14_qmmm_refinement_mace_polar1_mechanical.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/examples/15_roe_brooks_openmm.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/_selftest_data/basic_protein.yaml +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/_selftest_data/ligand_sub.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/antechamber.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/commands.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/parmchk2.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/resp.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/charges/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/charges/esp_grid.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/config/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/config/loader.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/external/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/external/discovery.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/external/runner.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/forcefields.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/ions.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/report.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/runner.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/identity.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/pyscf_charges.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/report.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/md/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/c4.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/coordination.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mace_polar1_hessian.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mace_polar1_worker.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mcpb_compat.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/parameter_comparison.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/report.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/workflow.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/disulfide_states.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/overrides.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/pka_rules.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/propka.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/states.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/xtb_parser.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/point_charges.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/pyscf_esp.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/pyscf_runner.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/ash.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/reports/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/reports/structure_report.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/disulfides.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/selectors.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/openmm_check.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/parmed_check.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/init.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/inspect.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/selftest.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/validate.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/__init__.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_cof.frcmod +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_cof.good.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.atom_count_mismatch.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.bad_charge.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.frcmod +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.good.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.renamed.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.shifted_coords.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.small_residual.mol2 +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/propka_sample.pka +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_altloc.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_atom_record_ligand_blank_chain.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_blank_chain.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_cyx_disulfide.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_disulfide.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_ring.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_ring_hydrogenated.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_water_oxygen.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_zinc.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_insertion_code.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_two_ligands.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_with_hydrogens.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_with_waters.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/xtb_hid_stdout.txt +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/xtb_hie_stdout.txt +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/zinc_only.pdb +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_altloc.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_amber_resp.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ambertools_commands.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_classify.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_config_examples.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_disulfide_assignment.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_disulfide_leap_mapping.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_disulfides.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_esp_grid.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_amber_resp.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_ambertools.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_mace_polar1.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_metals.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_propka_xtb.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_pyscf.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_tleap.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_import.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_init_cli.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_init_ligand_placeholders.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_inspect_cli.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ions.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_builder.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_forcefields.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_log_parser.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ligand_extraction.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ligand_workflow_mocked.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mace_polar1_hessian.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_manifest_paths.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_manual_protonation.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mcpb_compat.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mcpb_parameter_comparison.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_md_config.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mol2_parser.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_no_openbabel.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pka_rules.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_point_charges.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_ligands_stage.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_protonation_stage.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_pyscf_ligands_stage.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_structure_stage.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_propka_parser.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_propka_workflow.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_reuse_refined.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_states.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pyscf_esp_mocked.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pyscf_runner_config.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_qmmesp_correctness.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_qmmesp_final_mol2_usage.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_qmmesp_no_environment_fit.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_readme_example.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_ash.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_coordinates.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_remove_hydrogens.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_roe_brooks.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_selectors.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_selftest_installed.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_tleap_workflow_mocked.py +0 -0
- {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_xtb_parser.py +0 -0
|
@@ -16,3 +16,13 @@ runs/
|
|
|
16
16
|
*.tar.gz
|
|
17
17
|
*.tar.gz.sha256
|
|
18
18
|
.DS_Store
|
|
19
|
+
node_modules/
|
|
20
|
+
package-lock.json
|
|
21
|
+
|
|
22
|
+
# Worktrees created for spawned background tasks.
|
|
23
|
+
.claude/worktrees/
|
|
24
|
+
|
|
25
|
+
# Tutorial structures downloaded on demand.
|
|
26
|
+
tutorials/
|
|
27
|
+
web/vendor/
|
|
28
|
+
*.zip
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.3.0 - 2026-10-19
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- `mdprep plan` and `mdprep init --interactive`: a structure-aware decision
|
|
8
|
+
engine that reduces a 250+ setting schema to the questions one structure
|
|
9
|
+
actually needs, and asks them. Chemistry-sensitive values have no default and
|
|
10
|
+
cannot be skipped.
|
|
11
|
+
- Each decision carries viewer hints (`focus`, `targets`, `target_resnames`) so
|
|
12
|
+
a 3D front end can frame exactly the residues a question is about.
|
|
13
|
+
- `mdprep inspect` reports free monatomic metal ions.
|
|
14
|
+
- A static web input builder (`web/`) that runs mdprep in the browser under
|
|
15
|
+
Pyodide, shows a 3D view framed on whatever each question is about, and
|
|
16
|
+
produces a validated manifest plus runnable Colab cells.
|
|
17
|
+
- `mdprep.workflows.runtime.conda_packages_for` derives the external toolchain a
|
|
18
|
+
given manifest needs, so a generated setup cell installs PropKa, xTB or PySCF
|
|
19
|
+
only when the run will actually invoke them.
|
|
20
|
+
|
|
21
|
+
- `mdprep doctor` checks that the external tools a given manifest will invoke
|
|
22
|
+
are installed, and names the one command that installs what is missing.
|
|
23
|
+
- mmCIF and ModelCIF input: a structure predicted by Boltz or AlphaFold is read
|
|
24
|
+
directly, with no conversion step and no loss of the chain and residue
|
|
25
|
+
identifiers the manifest selects on.
|
|
26
|
+
- Four-character residue names, hybrid-36 serial and residue numbers, and
|
|
27
|
+
residues whose name does not fit a PDB column, which a predicted structure
|
|
28
|
+
written to PDB reaches routinely. A name mdprep has to assign is recorded as
|
|
29
|
+
assigned, so nothing downstream reads chemistry into a name it invented.
|
|
30
|
+
- `metals[].coordinating_ions` declares a non-metal ion bound in a metal site,
|
|
31
|
+
such as a coordinating halide, which previously had nowhere to live: it is
|
|
32
|
+
not a metal, and antechamber cannot treat a single atom.
|
|
33
|
+
- The setup cell downloads the g-xTB build of xtb from the Grimme group's
|
|
34
|
+
releases and checks it against the published checksum, because conda-forge
|
|
35
|
+
carries only the GFN-only build.
|
|
36
|
+
|
|
37
|
+
- `structure.keep_chains` restricts a build to named chains, which a bonded
|
|
38
|
+
MCPB site requires and a multi-copy crystal structure needs.
|
|
39
|
+
- The decision engine proposes a metal coordination sphere from interatomic
|
|
40
|
+
distances, requires it to be confirmed, and generates the bonded MCPB block
|
|
41
|
+
with a GFN2 Seminario Hessian and GFN2 QM/MM refinement geometry.
|
|
42
|
+
- `examples/16_besd_halogenase_gfn2_mcpb.yaml`, the BesD halogenase reference
|
|
43
|
+
case.
|
|
44
|
+
- Detection of incomplete residues and chain breaks, asked about before any
|
|
45
|
+
expensive stage runs, and protection for waters coordinating a metal.
|
|
46
|
+
- `examples/mdprep_colab_run.ipynb`, a Colab notebook that runs a manifest and
|
|
47
|
+
installs only the toolchain that manifest needs.
|
|
48
|
+
|
|
49
|
+
- `metals[].coordinating_ions` declares a non-metal ion bound in a metal site,
|
|
50
|
+
such as a coordinating halide, which previously had nowhere to live: it is
|
|
51
|
+
not a metal and antechamber cannot treat a single atom.
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- The refinement stage defaults to `backend: openmm`, a force-field hydrogen
|
|
56
|
+
relaxation, instead of GFN2 QM/MM. The stage only ever moved hydrogens, and
|
|
57
|
+
a force field settles them in seconds. `backend: ash` keeps the QM/MM route
|
|
58
|
+
and is required to relax heavy atoms. `movable_atoms` and
|
|
59
|
+
`post_refinement_protonation` default to match the hydrogen-only backend.
|
|
60
|
+
- Histidine HID/HIE selection stays with xTB: force-field energies of the two
|
|
61
|
+
tautomers are not comparable, because they are different residue templates
|
|
62
|
+
rather than one molecule with a proton moved.
|
|
63
|
+
|
|
64
|
+
- Dropped the unused `scipy` and `pandas` runtime dependencies.
|
|
65
|
+
- A ligand that coordinates a bonded metal site now defaults to taking its
|
|
66
|
+
charges from that site's MCPB fit instead of AM1-BCC.
|
|
67
|
+
- A metal site's Hessian defaults to g-xTB rather than GFN2. GFN2 has no
|
|
68
|
+
parameters for most transition metals, and said so only after the run had
|
|
69
|
+
got as far as the Hessian.
|
|
70
|
+
- **A ligand whose residue name an Amber force field already defines is now
|
|
71
|
+
refused, where it used to be renamed for the build.** `LYS` became `LY1`,
|
|
72
|
+
which satisfied tleap and moved the problem: the prepared system then
|
|
73
|
+
described a residue under a name the input never used, and every later
|
|
74
|
+
reader had to know about the substitution. A manifest that declares such a
|
|
75
|
+
ligand now fails, in the GUI before it asks anything and on the command line
|
|
76
|
+
before any quantum chemistry, and says which residue to rename. The web
|
|
77
|
+
builder offers to make the change in the input.
|
|
78
|
+
- **`refinement.total_qm_multiplicity` is now required whenever any component
|
|
79
|
+
of the QM region is open-shell**, where it used to be taken from the first
|
|
80
|
+
open-shell component found. For a lone high-spin Fe(II) that is the right
|
|
81
|
+
answer and it was right by accident: it holds only while the ion is the
|
|
82
|
+
single unpaired centre and nothing couples to it, which nothing in a
|
|
83
|
+
manifest can check. Existing manifests that leave it out of an open-shell
|
|
84
|
+
region will fail validation and need the value added.
|
|
85
|
+
- Preparing the same system the same way twice now yields the same atom count.
|
|
86
|
+
MD starting velocities stay random and the seed drawn for each run is
|
|
87
|
+
recorded, so a replicate can be repeated by putting that number back.
|
|
88
|
+
|
|
89
|
+
### Fixed
|
|
90
|
+
|
|
91
|
+
- Per-step MD snapshots are written in the box the manifest asked for. They
|
|
92
|
+
carried the pre-NPT cell, because `PDBFile` takes CRYST1 from the topology
|
|
93
|
+
and the topology was the one loaded at the start, and they were wrapped into
|
|
94
|
+
the parallelepiped OpenMM spans rather than imaged about the solute -- so a
|
|
95
|
+
truncated octahedron came back as a sheared prism with the protein off to
|
|
96
|
+
one side and its water drawn 70 A away instead of 54 A.
|
|
97
|
+
- The ESP grid survives an xTB crash on its last point, and the fit uses the
|
|
98
|
+
grid that was actually evaluated rather than the one that was requested.
|
|
99
|
+
- A metal in a predicted structure is named after its element, so a site is
|
|
100
|
+
not identified by a name the prediction never meant as one.
|
|
101
|
+
- CONECT records that cover only part of a ligand are ignored rather than
|
|
102
|
+
treated as its whole connectivity.
|
|
103
|
+
- tleap writes its own atom types into the element column of the PDB it
|
|
104
|
+
outputs; the reader no longer believes them.
|
|
105
|
+
- The setup cell installs PDBFixer whenever a run will need it, not only when
|
|
106
|
+
structure repair happens to pull it in, and the resolver is checked against
|
|
107
|
+
every combination of options rather than the one that was reported.
|
|
108
|
+
- A titratable side chain coordinating a metal is asked about, from the same
|
|
109
|
+
contact list the bonds come from, instead of refusing the run later.
|
|
110
|
+
- Guessed force-field parameters (`ATTN, need revision`) and the OpenMM energy
|
|
111
|
+
check are both checked when the manifest asks for them.
|
|
112
|
+
- Many GUI fixes: the Finish button reports what went wrong instead of doing
|
|
113
|
+
nothing, re-uploading a structure cannot leave the bundle describing the
|
|
114
|
+
previous one, a file that parses to no atoms is rejected, Start over clears
|
|
115
|
+
the answers, Enter fetches a PDB id, and an entry that is mmCIF-only is
|
|
116
|
+
fetched as `.cif`.
|
|
117
|
+
|
|
118
|
+
## 0.2.1 - 2026-10-01
|
|
119
|
+
|
|
120
|
+
### Fixed
|
|
121
|
+
|
|
122
|
+
- A ligand whose residue name is one the Amber force fields already define is
|
|
123
|
+
now built under a name they do not. `tleap` resolves residues by name and
|
|
124
|
+
maps an amino-acid name to its terminal form first, so the BesD free-lysine
|
|
125
|
+
substrate was built from the `NLYS` protein template and the run died with
|
|
126
|
+
"Atom .R<NLYS 252>.A<OXT 25> does not have a type" for every one of its
|
|
127
|
+
ligand-named atoms; binding the ligand unit to `LYS` instead would have
|
|
128
|
+
pointed every lysine in the protein at the ligand's parameters. The leap
|
|
129
|
+
input PDB, a copy of the fitted mol2, the `tleap` script and the final
|
|
130
|
+
validation all use the new name, and every rename is reported.
|
|
131
|
+
- The temporary xTB hydrogen environment no longer hydrogenates a residue
|
|
132
|
+
twice. OpenMM matches the hydrogens a residue already has through the bonds
|
|
133
|
+
its residue templates define, so hydrogens mdprep placed from
|
|
134
|
+
`ligands[].smiles`, named after their parent heavy atom, were invisible to it
|
|
135
|
+
and it built a second complete set beside them: the BesD free-lysine
|
|
136
|
+
substrate came out carrying both HB2/HB3 and HB/HBA. Such a residue is now
|
|
137
|
+
passed through untouched and reported, unless a protonation state was decided
|
|
138
|
+
for it, in which case OpenMM still rebuilds it in that state.
|
|
139
|
+
- Amber ion atom types were built as `element + charge + "+"`, which produced
|
|
140
|
+
`Na1+` for every monovalent cation and could not express an anion at all.
|
|
141
|
+
|
|
142
|
+
- Roe--Brooks stage 2 no longer fails with "Particle coordinate is NaN" on
|
|
143
|
+
solvated systems. Free ions were positionally restrained because Amber names
|
|
144
|
+
them `Na+`/`Cl-`, which match no bare element symbol, and coordinates handed
|
|
145
|
+
between stages were wrapped into the periodic box while the restraint
|
|
146
|
+
references stayed unwrapped, placing every wrapped restrained particle a full
|
|
147
|
+
box length from its reference. Stage hand-off and XML restarts now stay in
|
|
148
|
+
the unwrapped frame; only the per-step PDBs and the trajectory are wrapped.
|
|
149
|
+
- Final-output validation no longer rejects its own PDB with "PDB atom serials
|
|
150
|
+
must be unique when present" above 99,999 atoms. Serials are decoded for the
|
|
151
|
+
column-12 overflow `tleap`/`ambpdb` write, for hybrid-36, and for `*****`; a
|
|
152
|
+
genuine wrap-around is renumbered in file order with a warning, and stays
|
|
153
|
+
fatal only when `CONECT` records make the connectivity ambiguous. The PDB
|
|
154
|
+
writer uses the same convention it reads, so structures of that size
|
|
155
|
+
round-trip unchanged.
|
|
156
|
+
- `mdprep inspect --json` no longer emits unparseable JSON on a narrow
|
|
157
|
+
terminal, where rich reflowed long strings to the console width.
|
|
158
|
+
|
|
159
|
+
### Changed
|
|
160
|
+
|
|
161
|
+
- xTB histidine calculations pin `OMP_NUM_THREADS`, `MKL_NUM_THREADS` and
|
|
162
|
+
`OPENBLAS_NUM_THREADS` to the new `protonation.histidine.xtb.num_threads`
|
|
163
|
+
(default `1`), with `OMP_STACKSIZE` from `omp_stacksize` (default `1G`).
|
|
164
|
+
xTB otherwise opened one thread per hardware thread for every tautomer
|
|
165
|
+
cluster, spending large amounts of CPU time without reducing wall time.
|
|
166
|
+
- `mdprep inspect` also reports free monatomic metal ions.
|
|
167
|
+
|
|
168
|
+
## 0.2.0 - 2026-08-17
|
|
169
|
+
|
|
170
|
+
### Added
|
|
171
|
+
|
|
172
|
+
- Explicit nonbonded and bonded MCPB.py metal-center workflows, including
|
|
173
|
+
PySCF QMMESP/RESP charges and PySCF, GFN2-xTB, g-xTB, or MACE-POLAR-1
|
|
174
|
+
Hessian sources for Seminario parameters.
|
|
175
|
+
- Optional ASH active-site QM/MM refinement with explicit QM components,
|
|
176
|
+
coordinating residues, 4 A residue and 8 A water active regions, and
|
|
177
|
+
hydrogen-only relaxation.
|
|
178
|
+
- Manifest-driven Roe--Brooks OpenMM minimization, heating, density
|
|
179
|
+
equilibration, and production MD with accelerator-first/CPU-fallback
|
|
180
|
+
platform selection.
|
|
181
|
+
- User-controlled production step and reporting/checkpoint intervals.
|
|
182
|
+
- Manifest-directory-relative input paths and portable executable discovery.
|
|
183
|
+
- GAFF/GAFF2, ff14SB/ff19SB, TIP3P/OPC, AM1-BCC, gas RESP, and embedded
|
|
184
|
+
QMMESP examples covering the supported preparation combinations.
|
|
185
|
+
|
|
186
|
+
### Fixed
|
|
187
|
+
|
|
188
|
+
- Roe--Brooks positional restraints are installed before Context creation and
|
|
189
|
+
their reference coordinates are converted explicitly from input units to nm.
|
|
190
|
+
- Constraint-compatible heating handoff, evolving NPT box propagation, and
|
|
191
|
+
production progress totals.
|
|
192
|
+
- MCPB/tLEaP residue-index and renamed-residue coordinate validation.
|
|
193
|
+
|
|
194
|
+
## 0.1.0 - 2026-06-15
|
|
195
|
+
|
|
196
|
+
Initial usable release.
|
|
197
|
+
|
|
198
|
+
### Added
|
|
199
|
+
|
|
200
|
+
- YAML manifest validation with pydantic.
|
|
201
|
+
- PDB inspection, residue/atom selector parsing, altloc handling, water and heterogen classification, histidine/titratable residue detection, and possible disulfide detection.
|
|
202
|
+
- `mdprep init` starter-manifest generation and safe structure normalization.
|
|
203
|
+
- Manual protonation overrides, input-state preservation, disulfide `CYX` assignment, and input-hydrogen removal.
|
|
204
|
+
- PropKa-based residue-state assignment and xTB/GFN2 or g-xTB HID/HIE histidine tautomer selection.
|
|
205
|
+
- Ligand extraction and AmberTools parameter generation for `am1bcc` and `user_mol2`.
|
|
206
|
+
- PySCF gas-phase RESP/ESP-like ligand charges.
|
|
207
|
+
- PySCF QMMESP-like environment-polarized ligand charges with explicit target-ligand-only fitting.
|
|
208
|
+
- Final `tleap` build, optional solvation, neutralization/salt handling, final Amber files, and validation reports.
|
|
209
|
+
- External tests that skip cleanly when optional executables or libraries are unavailable.
|
|
210
|
+
|
|
211
|
+
### Unsupported In 0.1.0
|
|
212
|
+
|
|
213
|
+
- Noncanonical amino acids inside polymer chains.
|
|
214
|
+
- Covalent ligands.
|
|
215
|
+
- Bonded metal-center parameterization and MCPB-like workflows.
|
|
216
|
+
- ORCA and Multiwfn backends.
|
|
217
|
+
- mmCIF input.
|
|
218
|
+
- Automatic loop modeling.
|
|
219
|
+
- Production minimization or MD.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: mdprep
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Reproducible Amber preparation for proteins, ligands, metal centers, and OpenMM MD.
|
|
5
5
|
Project-URL: Homepage, https://github.com/miqueleg/mdprep
|
|
6
6
|
Project-URL: Issues, https://github.com/miqueleg/mdprep/issues
|
|
@@ -19,13 +19,17 @@ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
|
19
19
|
Classifier: Topic :: Scientific/Engineering :: Chemistry
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
21
|
Requires-Dist: numpy>=1.24
|
|
22
|
-
Requires-Dist: pandas>=2
|
|
23
22
|
Requires-Dist: pydantic-settings>=2
|
|
24
23
|
Requires-Dist: pydantic>=2
|
|
25
24
|
Requires-Dist: pyyaml>=6
|
|
26
25
|
Requires-Dist: rich>=13
|
|
27
|
-
Requires-Dist: scipy>=1.10
|
|
28
26
|
Requires-Dist: typer>=0.12
|
|
27
|
+
Provides-Extra: all
|
|
28
|
+
Requires-Dist: openmm>=8.1; extra == 'all'
|
|
29
|
+
Requires-Dist: parmed>=4.2; extra == 'all'
|
|
30
|
+
Requires-Dist: pdbfixer>=1.9; extra == 'all'
|
|
31
|
+
Requires-Dist: pyscf>=2.6; extra == 'all'
|
|
32
|
+
Requires-Dist: rdkit>=2023.3; extra == 'all'
|
|
29
33
|
Provides-Extra: dev
|
|
30
34
|
Requires-Dist: build>=1; extra == 'dev'
|
|
31
35
|
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
@@ -34,8 +38,11 @@ Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
|
34
38
|
Requires-Dist: twine>=5; extra == 'dev'
|
|
35
39
|
Provides-Extra: docs
|
|
36
40
|
Requires-Dist: mkdocs>=1.6; extra == 'docs'
|
|
41
|
+
Provides-Extra: ligands
|
|
42
|
+
Requires-Dist: rdkit>=2023.3; extra == 'ligands'
|
|
37
43
|
Provides-Extra: md
|
|
38
44
|
Requires-Dist: openmm>=8.1; extra == 'md'
|
|
45
|
+
Requires-Dist: pdbfixer>=1.9; extra == 'md'
|
|
39
46
|
Provides-Extra: qm
|
|
40
47
|
Requires-Dist: parmed>=4.2; extra == 'qm'
|
|
41
48
|
Requires-Dist: pyscf>=2.6; extra == 'qm'
|
|
@@ -45,7 +52,7 @@ Description-Content-Type: text/markdown
|
|
|
45
52
|
|
|
46
53
|
# mdprep
|
|
47
54
|
|
|
48
|
-
`mdprep` 0.
|
|
55
|
+
`mdprep` 0.3.0 prepares reproducible Amber molecular-dynamics systems from a
|
|
49
56
|
PDB structure and a validated YAML manifest. It supports standard proteins,
|
|
50
57
|
independent ligands and cofactors, explicit metal models, optional active-site
|
|
51
58
|
QM/MM refinement, final `tleap` assembly, validation, and an optional OpenMM
|
|
@@ -105,9 +112,16 @@ Start from a standard protein PDB:
|
|
|
105
112
|
|
|
106
113
|
```bash
|
|
107
114
|
mdprep inspect input.pdb
|
|
108
|
-
mdprep
|
|
115
|
+
mdprep plan input.pdb # what must you decide?
|
|
116
|
+
mdprep init input.pdb --interactive -o system.yaml
|
|
109
117
|
```
|
|
110
118
|
|
|
119
|
+
`mdprep plan` lists only the manifest decisions this structure actually
|
|
120
|
+
requires, and `--interactive` asks them and writes a validated manifest. See
|
|
121
|
+
[Guided manifest generation](docs/guided_manifests.md). The non-interactive
|
|
122
|
+
`mdprep init input.pdb -o system.yaml` still writes the commented starter
|
|
123
|
+
manifest.
|
|
124
|
+
|
|
111
125
|
A minimal protein-only `system.yaml` is:
|
|
112
126
|
|
|
113
127
|
```yaml
|
|
@@ -177,6 +191,23 @@ Relative paths are resolved from the manifest directory. Unknown heterogens
|
|
|
177
191
|
are not deleted or guessed: configure them under `ligands` or `metals`, or
|
|
178
192
|
explicitly request their removal.
|
|
179
193
|
|
|
194
|
+
For a guided 3D workflow, upload
|
|
195
|
+
[`examples/mdprep_interactive_colab.ipynb`](examples/mdprep_interactive_colab.ipynb)
|
|
196
|
+
to Google Colab. It accepts an RCSB PDB ID or uploaded PDB, requires review of
|
|
197
|
+
all structural and chemistry decisions, creates a validated manifest, and can
|
|
198
|
+
either download a portable input bundle or run mdprep in Colab. BesD PDB 7JSD
|
|
199
|
+
is the default structural example; charges, spin states, and metal chemistry
|
|
200
|
+
remain explicit user decisions. For bonded MCPB preparation, a dedicated cell
|
|
201
|
+
installs the pinned official g-xTB Linux build and accepts it only after
|
|
202
|
+
checksum verification and a successful `--gxtb --hess` smoke calculation. The
|
|
203
|
+
guided metal workflow supports one explicitly bonded, single-chain MCPB site
|
|
204
|
+
and can select either that g-xTB Hessian or PySCF B3LYP/6-31G*; every
|
|
205
|
+
coordination bond remains explicitly selected. The notebook derives the MCPB
|
|
206
|
+
small/large-model charge and multiplicity and the complete QM-region
|
|
207
|
+
multiplicity from the reviewed component electronic states, displays the
|
|
208
|
+
calculation, and refuses ambiguous multi-open-shell spin coupling rather than
|
|
209
|
+
guessing it. All multi-selection fields use comma-separated values.
|
|
210
|
+
|
|
180
211
|
## Common workflows
|
|
181
212
|
|
|
182
213
|
Generate a starter manifest using PropKa and ff19SB/OPC:
|
|
@@ -215,12 +246,16 @@ specified in steps in the manifest.
|
|
|
215
246
|
|
|
216
247
|
| Task | Documentation | Example |
|
|
217
248
|
| --- | --- | --- |
|
|
249
|
+
| Generating a manifest | [Guided manifest generation](docs/guided_manifests.md) | `mdprep plan`, `mdprep init --interactive` |
|
|
250
|
+
| Generating one in a browser | [Web input builder](web/README.md) | `python web/build.py` |
|
|
218
251
|
| Manifest fields | [Manifest reference](docs/manifest_reference.md) | [All examples](examples/README.md) |
|
|
219
252
|
| Protonation and histidines | [Protonation](docs/protonation.md) | `examples/02_manual_catalytic_protonation.yaml` |
|
|
220
253
|
| Ligands, AM1-BCC, RESP, QMMESP | [Ligands](docs/ligands.md) and [QMMESP](docs/qmmesp_pyscf.md) | `examples/03_multi_ligand_am1bcc.yaml`, `04_qmmesp_pyscf_ligand.yaml` |
|
|
221
254
|
| Metal centers and MCPB.py | [Metal centers](docs/metals.md) | `examples/08_nonbonded_zinc_1264.yaml`, `09_bonded_zinc_mcpb_prepare.yaml` |
|
|
222
255
|
| Active-site QM/MM refinement | [QM/MM refinement](docs/qmmm_refinement.md) | `examples/10_qmmm_refinement_ash.yaml` |
|
|
223
256
|
| Roe–Brooks OpenMM MD | [Molecular dynamics](docs/molecular_dynamics.md) | `examples/15_roe_brooks_openmm.yaml` |
|
|
257
|
+
| Running a manifest in Colab | [Colab example notes](examples/README.md) | `examples/mdprep_colab_run.ipynb` |
|
|
258
|
+
| Guided Colab builder (legacy) | [Colab example notes](examples/README.md) | `examples/mdprep_interactive_colab.ipynb` |
|
|
224
259
|
| Complete Fe(III) workflow | [7E07 tutorial](examples/tutorials/7E07_bonded_fe3/README.md) | `examples/tutorials/7E07_bonded_fe3/system.yaml` |
|
|
225
260
|
|
|
226
261
|
All public example manifests are schema-validated in the test suite.
|
|
@@ -243,7 +278,7 @@ charge model, protonation, force field, QM method, or metal model.
|
|
|
243
278
|
|
|
244
279
|
## Current limitations
|
|
245
280
|
|
|
246
|
-
Version 0.
|
|
281
|
+
Version 0.3.0 does not support noncanonical amino acids inside peptide chains,
|
|
247
282
|
covalent ligands, mmCIF input, automatic loop modeling, ORCA, Multiwfn,
|
|
248
283
|
multiple independent bonded MCPB sites, or multi-chain MCPB protein inputs.
|
|
249
284
|
Unsupported chemistry fails explicitly.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# mdprep
|
|
2
2
|
|
|
3
|
-
`mdprep` 0.
|
|
3
|
+
`mdprep` 0.3.0 prepares reproducible Amber molecular-dynamics systems from a
|
|
4
4
|
PDB structure and a validated YAML manifest. It supports standard proteins,
|
|
5
5
|
independent ligands and cofactors, explicit metal models, optional active-site
|
|
6
6
|
QM/MM refinement, final `tleap` assembly, validation, and an optional OpenMM
|
|
@@ -60,9 +60,16 @@ Start from a standard protein PDB:
|
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
62
|
mdprep inspect input.pdb
|
|
63
|
-
mdprep
|
|
63
|
+
mdprep plan input.pdb # what must you decide?
|
|
64
|
+
mdprep init input.pdb --interactive -o system.yaml
|
|
64
65
|
```
|
|
65
66
|
|
|
67
|
+
`mdprep plan` lists only the manifest decisions this structure actually
|
|
68
|
+
requires, and `--interactive` asks them and writes a validated manifest. See
|
|
69
|
+
[Guided manifest generation](docs/guided_manifests.md). The non-interactive
|
|
70
|
+
`mdprep init input.pdb -o system.yaml` still writes the commented starter
|
|
71
|
+
manifest.
|
|
72
|
+
|
|
66
73
|
A minimal protein-only `system.yaml` is:
|
|
67
74
|
|
|
68
75
|
```yaml
|
|
@@ -132,6 +139,23 @@ Relative paths are resolved from the manifest directory. Unknown heterogens
|
|
|
132
139
|
are not deleted or guessed: configure them under `ligands` or `metals`, or
|
|
133
140
|
explicitly request their removal.
|
|
134
141
|
|
|
142
|
+
For a guided 3D workflow, upload
|
|
143
|
+
[`examples/mdprep_interactive_colab.ipynb`](examples/mdprep_interactive_colab.ipynb)
|
|
144
|
+
to Google Colab. It accepts an RCSB PDB ID or uploaded PDB, requires review of
|
|
145
|
+
all structural and chemistry decisions, creates a validated manifest, and can
|
|
146
|
+
either download a portable input bundle or run mdprep in Colab. BesD PDB 7JSD
|
|
147
|
+
is the default structural example; charges, spin states, and metal chemistry
|
|
148
|
+
remain explicit user decisions. For bonded MCPB preparation, a dedicated cell
|
|
149
|
+
installs the pinned official g-xTB Linux build and accepts it only after
|
|
150
|
+
checksum verification and a successful `--gxtb --hess` smoke calculation. The
|
|
151
|
+
guided metal workflow supports one explicitly bonded, single-chain MCPB site
|
|
152
|
+
and can select either that g-xTB Hessian or PySCF B3LYP/6-31G*; every
|
|
153
|
+
coordination bond remains explicitly selected. The notebook derives the MCPB
|
|
154
|
+
small/large-model charge and multiplicity and the complete QM-region
|
|
155
|
+
multiplicity from the reviewed component electronic states, displays the
|
|
156
|
+
calculation, and refuses ambiguous multi-open-shell spin coupling rather than
|
|
157
|
+
guessing it. All multi-selection fields use comma-separated values.
|
|
158
|
+
|
|
135
159
|
## Common workflows
|
|
136
160
|
|
|
137
161
|
Generate a starter manifest using PropKa and ff19SB/OPC:
|
|
@@ -170,12 +194,16 @@ specified in steps in the manifest.
|
|
|
170
194
|
|
|
171
195
|
| Task | Documentation | Example |
|
|
172
196
|
| --- | --- | --- |
|
|
197
|
+
| Generating a manifest | [Guided manifest generation](docs/guided_manifests.md) | `mdprep plan`, `mdprep init --interactive` |
|
|
198
|
+
| Generating one in a browser | [Web input builder](web/README.md) | `python web/build.py` |
|
|
173
199
|
| Manifest fields | [Manifest reference](docs/manifest_reference.md) | [All examples](examples/README.md) |
|
|
174
200
|
| Protonation and histidines | [Protonation](docs/protonation.md) | `examples/02_manual_catalytic_protonation.yaml` |
|
|
175
201
|
| Ligands, AM1-BCC, RESP, QMMESP | [Ligands](docs/ligands.md) and [QMMESP](docs/qmmesp_pyscf.md) | `examples/03_multi_ligand_am1bcc.yaml`, `04_qmmesp_pyscf_ligand.yaml` |
|
|
176
202
|
| Metal centers and MCPB.py | [Metal centers](docs/metals.md) | `examples/08_nonbonded_zinc_1264.yaml`, `09_bonded_zinc_mcpb_prepare.yaml` |
|
|
177
203
|
| Active-site QM/MM refinement | [QM/MM refinement](docs/qmmm_refinement.md) | `examples/10_qmmm_refinement_ash.yaml` |
|
|
178
204
|
| Roe–Brooks OpenMM MD | [Molecular dynamics](docs/molecular_dynamics.md) | `examples/15_roe_brooks_openmm.yaml` |
|
|
205
|
+
| Running a manifest in Colab | [Colab example notes](examples/README.md) | `examples/mdprep_colab_run.ipynb` |
|
|
206
|
+
| Guided Colab builder (legacy) | [Colab example notes](examples/README.md) | `examples/mdprep_interactive_colab.ipynb` |
|
|
179
207
|
| Complete Fe(III) workflow | [7E07 tutorial](examples/tutorials/7E07_bonded_fe3/README.md) | `examples/tutorials/7E07_bonded_fe3/system.yaml` |
|
|
180
208
|
|
|
181
209
|
All public example manifests are schema-validated in the test suite.
|
|
@@ -198,7 +226,7 @@ charge model, protonation, force field, QM method, or metal model.
|
|
|
198
226
|
|
|
199
227
|
## Current limitations
|
|
200
228
|
|
|
201
|
-
Version 0.
|
|
229
|
+
Version 0.3.0 does not support noncanonical amino acids inside peptide chains,
|
|
202
230
|
covalent ligands, mmCIF input, automatic loop modeling, ORCA, Multiwfn,
|
|
203
231
|
multiple independent bonded MCPB sites, or multi-chain MCPB protein inputs.
|
|
204
232
|
Unsupported chemistry fails explicitly.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
- [Installation](installation.md)
|
|
4
4
|
- [Quickstart](quickstart.md)
|
|
5
|
+
- [Guided manifest generation](guided_manifests.md)
|
|
6
|
+
- [Web input builder](../web/README.md)
|
|
5
7
|
- [Manifest reference](manifest_reference.md)
|
|
6
8
|
- [Protonation](protonation.md)
|
|
7
9
|
- [Ligands](ligands.md)
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Guided Manifest Generation
|
|
2
|
+
|
|
3
|
+
A manifest exposes several hundred settings, but a given structure only needs a
|
|
4
|
+
few dozen of them, and only a handful are decisions a researcher has to make.
|
|
5
|
+
`mdprep plan` works out which, and `mdprep init --interactive` asks them.
|
|
6
|
+
|
|
7
|
+
On a solvated protein--ligand complex this is the difference between 250+
|
|
8
|
+
available settings and **19 questions, 3 of which need real thought**.
|
|
9
|
+
|
|
10
|
+
## See what a structure requires
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
mdprep plan input.pdb
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
This reports what mdprep found (chains, ligands, metal ions, histidines,
|
|
17
|
+
possible disulfides) and then every decision that follows from it, marking the
|
|
18
|
+
ones that cannot be defaulted and which earlier answer each one depends on.
|
|
19
|
+
|
|
20
|
+
## Answer the questions and write a manifest
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
mdprep init input.pdb --interactive -o system.yaml
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Each question shows what was found, why the setting matters, and the available
|
|
27
|
+
values. Press Enter to accept the value shown; there is no value to accept for
|
|
28
|
+
a chemistry-sensitive question, so it is asked until you answer it.
|
|
29
|
+
|
|
30
|
+
The manifest is validated against the full schema before it is written, so a
|
|
31
|
+
file produced this way always passes `mdprep config-check`. Nothing is
|
|
32
|
+
generated when the wizard is interrupted.
|
|
33
|
+
|
|
34
|
+
The non-interactive `mdprep init` is unchanged and still produces the commented
|
|
35
|
+
starter manifest.
|
|
36
|
+
|
|
37
|
+
## What is never defaulted
|
|
38
|
+
|
|
39
|
+
mdprep does not guess chemistry, and the wizard must not become a way around
|
|
40
|
+
that. These have no suggested value, and a front end cannot skip them:
|
|
41
|
+
|
|
42
|
+
- **Ligand net charge.** It cannot be read from a PDB file, and a wrong value
|
|
43
|
+
produces a plausible-looking topology with the wrong electrostatics.
|
|
44
|
+
- **Metal site model and oxidation state.** Neither the residue name nor the
|
|
45
|
+
element implies an oxidation state. Zn is almost always +2; Fe and Cu are not.
|
|
46
|
+
- **Removing unknown heterogens.** Normalization must never discard a residue
|
|
47
|
+
that was not explicitly configured, so the question names every residue at
|
|
48
|
+
stake.
|
|
49
|
+
- **Production length**, when MD is enabled. There is no sensible default.
|
|
50
|
+
|
|
51
|
+
Free monatomic metals are offered as metal sites, never as GAFF ligands. Bulk
|
|
52
|
+
counterions are treated as solvent and are not asked about at all.
|
|
53
|
+
|
|
54
|
+
## Metal sites
|
|
55
|
+
|
|
56
|
+
Choosing `bonded_mcpb` proposes a coordination sphere from interatomic
|
|
57
|
+
distances: atoms of a donor element (N, O, S, P, Se, halide) within 2.6 A of
|
|
58
|
+
the metal. Carbon and hydrogen are excluded, which is what keeps the carbons
|
|
59
|
+
sitting behind a coordinating carboxylate oxygen out of the shell.
|
|
60
|
+
|
|
61
|
+
The proposal is **not** a decision. You are shown every candidate bond with its
|
|
62
|
+
measured distance and must confirm the set before anything is written; decline,
|
|
63
|
+
and the site is reported for manual work rather than invented. The oxidation
|
|
64
|
+
state, the spin multiplicity and the capped-model charge have no defaults
|
|
65
|
+
either, because none of them can be read off a structure.
|
|
66
|
+
|
|
67
|
+
A ligand that coordinates the metal takes its charges from that site's MCPB fit
|
|
68
|
+
rather than an independent AM1-BCC calculation, since fitting a bonded donor
|
|
69
|
+
separately leaves the site electrostatically inconsistent. A ligand that does
|
|
70
|
+
not coordinate keeps AM1-BCC.
|
|
71
|
+
|
|
72
|
+
The Hessian defaults to GFN2, which is orders of magnitude cheaper than DFT and
|
|
73
|
+
is what makes a bonded site tractable outside a cluster; g-xTB and PySCF DFT
|
|
74
|
+
are offered too. The geometry comes from the QM/MM refinement stage, which is
|
|
75
|
+
enabled automatically for a bonded site, so nothing has to be optimised by hand
|
|
76
|
+
first.
|
|
77
|
+
|
|
78
|
+
[examples/16_besd_halogenase_gfn2_mcpb.yaml](../examples/16_besd_halogenase_gfn2_mcpb.yaml)
|
|
79
|
+
is the worked reference: BesD, an alpha-ketoglutarate-dependent halogenase with
|
|
80
|
+
Fe(II) in a 2-His triad, chloride in the carboxylate position, and a lysine
|
|
81
|
+
substrate.
|
|
82
|
+
|
|
83
|
+
## What the wizard will not write for you
|
|
84
|
+
|
|
85
|
+
A bonded site whose proposed coordination shell you decline is left out of the
|
|
86
|
+
generated file with a note; add it by hand following [metals.md](metals.md).
|
|
87
|
+
|
|
88
|
+
The RESP charge methods likewise add a `qmmesp` block you must complete. See
|
|
89
|
+
[ligands.md](ligands.md) and [qmmesp_pyscf.md](qmmesp_pyscf.md).
|
|
90
|
+
|
|
91
|
+
## The web input builder
|
|
92
|
+
|
|
93
|
+
[`web/`](../web/README.md) is a static page that does all of the above in a
|
|
94
|
+
browser, with a 3D viewer that frames the residues each question is about. It
|
|
95
|
+
runs this same package under Pyodide rather than reimplementing any of it, and
|
|
96
|
+
hands you a manifest plus the Colab cell that runs it.
|
|
97
|
+
|
|
98
|
+
## Building another front end
|
|
99
|
+
|
|
100
|
+
The decision plan is the contract. `mdprep plan --json` emits it in full:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
mdprep plan input.pdb --json
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Each decision carries a stable `id`, the `question`, its `kind`
|
|
107
|
+
(`choice`, `integer`, `number`, `text`, `boolean`), the allowed `choices`, the
|
|
108
|
+
`default` (`null` when there is none), `requires_user_input`, the `evidence`
|
|
109
|
+
from the structure, and a `when` list naming the earlier answers that make it
|
|
110
|
+
relevant.
|
|
111
|
+
|
|
112
|
+
### Driving a 3D viewer
|
|
113
|
+
|
|
114
|
+
Each decision also says what a viewer should put on screen while it is being
|
|
115
|
+
answered:
|
|
116
|
+
|
|
117
|
+
- `focus` is `none` (no structural aspect, such as a project name),
|
|
118
|
+
`targets` (emphasise and frame the residues below), or `structure` (show the
|
|
119
|
+
whole system, as for the force field or the solvent box).
|
|
120
|
+
- `targets` lists the residues to highlight, each with `chain`, `resname`,
|
|
121
|
+
`resid`, `icode`, and `element`/`atom_name` where they apply. **`targets[0]`
|
|
122
|
+
is the subject of the decision** -- the ligand being charged, the ion being
|
|
123
|
+
modelled -- and any later entries are surrounding context.
|
|
124
|
+
- `target_resnames` stands in for a set too large to enumerate usefully, such
|
|
125
|
+
as every crystallographic water; a viewer selects on the names directly.
|
|
126
|
+
|
|
127
|
+
So a ligand charge question frames that ligand, a disulfide question frames
|
|
128
|
+
both cysteines of every candidate pair, the unknown-heterogen question frames
|
|
129
|
+
every residue at stake, and a metal question frames the ion together with
|
|
130
|
+
whatever lies within 3 A of it.
|
|
131
|
+
|
|
132
|
+
That contact search exists only to frame the view. It is **not** a
|
|
133
|
+
determination of coordination: mdprep requires coordinating bonds to be
|
|
134
|
+
declared explicitly, and the evidence string says "within 3.0 A" rather than
|
|
135
|
+
claiming a coordination shell.
|
|
136
|
+
|
|
137
|
+
A web form, a notebook or another CLI consumes that JSON and never needs to
|
|
138
|
+
re-implement any of the logic. In Python:
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from mdprep.config.decisions import plan_decisions, build_manifest
|
|
142
|
+
|
|
143
|
+
plan = plan_decisions("input.pdb")
|
|
144
|
+
for decision in plan.applicable(answers_so_far):
|
|
145
|
+
... # render it however you like
|
|
146
|
+
|
|
147
|
+
manifest = build_manifest(plan, answers) # raises if a blocking answer is missing
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
`build_manifest` returns a plain dictionary, and raises `DecisionError` rather
|
|
151
|
+
than defaulting anything a user was supposed to decide. That guarantee is what
|
|
152
|
+
makes it safe to put a graphical front end in front of mdprep at all.
|
|
@@ -1,22 +1,55 @@
|
|
|
1
1
|
# Installation
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
One command, then check it:
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
mamba env create -f environment.yml
|
|
6
|
+
conda env create -f environment.yml # or: mamba env create -f environment.yml
|
|
7
7
|
conda activate mdprep
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
mdprep doctor
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`environment.yml` installs everything the tutorials need, mdprep included.
|
|
12
|
+
`mdprep doctor` then reports what is present and what is not, and prints the
|
|
13
|
+
command to install anything missing. Given a manifest it reports only what
|
|
14
|
+
that manifest will actually use, so nobody installs a quantum chemistry
|
|
15
|
+
package for a job that never calls it:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
mdprep doctor examples/16_besd_halogenase_gfn2_mcpb.yaml
|
|
10
19
|
```
|
|
11
20
|
|
|
21
|
+
To write and validate manifests without preparing anything, the much smaller
|
|
22
|
+
`environment-minimal.yml` is enough.
|
|
23
|
+
|
|
24
|
+
## What gets installed, and why
|
|
25
|
+
|
|
26
|
+
| | Needed for |
|
|
27
|
+
|---|---|
|
|
28
|
+
| AmberTools | `tleap`, `antechamber`, `parmchk2`, `MCPB.py` |
|
|
29
|
+
| PropKa | `protonation.method: propka` and `propka_xtb_his` |
|
|
30
|
+
| xTB | histidine tautomers, GFN2 charges, GFN2 Hessians and ESP |
|
|
31
|
+
| OpenMM | force-field refinement, the MM point charges behind the embedded histidine comparison, validation |
|
|
32
|
+
| PDBFixer | `structure.repair`, temporary hydrogenation |
|
|
33
|
+
| RDKit | placing ligand hydrogens from `ligands[].smiles` |
|
|
34
|
+
| ParmEd | topology and charge validation |
|
|
35
|
+
| PySCF | QMMESP and DFT MCPB RESP fitting |
|
|
36
|
+
|
|
37
|
+
## ASH
|
|
38
|
+
|
|
39
|
+
`refinement.backend: ash` is the one thing `environment.yml` cannot provide.
|
|
40
|
+
ASH is a manual checkout from
|
|
41
|
+
[RagnarB83/ash](https://github.com/RagnarB83/ash), put on `PYTHONPATH`; it
|
|
42
|
+
also wants `geometric`, which `environment.yml` does install.
|
|
43
|
+
|
|
44
|
+
**Do not `pip install ash`.** The `ash` distribution on PyPI is unrelated
|
|
45
|
+
software, and installing it produces an environment that looks correct and is
|
|
46
|
+
not. The default `refinement.backend: openmm` needs none of this, holds every
|
|
47
|
+
heavy atom fixed, and relaxes the hydrogens in seconds.
|
|
48
|
+
|
|
12
49
|
All distributed manifests use relative file paths or executable names.
|
|
13
50
|
Activate the environment containing the requested backend (or put its
|
|
14
51
|
executable on `PATH`) before running mdprep. Runtime reports record resolved
|
|
15
|
-
executables, but no developer-machine path is embedded in the package.
|
|
16
|
-
|
|
17
|
-
The environment includes the optional external tooling used by supported
|
|
18
|
-
workflows: AmberTools (including MCPB.py), PropKa, xTB, OpenMM, ParmEd, and
|
|
19
|
-
PySCF. Bonded MCPB completion additionally requires user-run Gaussian or
|
|
52
|
+
executables, but no developer-machine path is embedded in the package. Bonded MCPB completion additionally requires user-run Gaussian or
|
|
20
53
|
GAMESS calculations matching the selected MCPB input format when using
|
|
21
54
|
`workflow: complete`. `workflow: pyscf` instead uses either a user-supplied,
|
|
22
55
|
already optimized MCPB small-model PDB or the geometry inherited from a
|