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.
Files changed (358) hide show
  1. {mdprep-0.2.0 → mdprep-0.3.0}/.gitignore +10 -0
  2. mdprep-0.3.0/CHANGELOG.md +219 -0
  3. {mdprep-0.2.0 → mdprep-0.3.0}/PKG-INFO +41 -6
  4. {mdprep-0.2.0 → mdprep-0.3.0}/README.md +31 -3
  5. {mdprep-0.2.0 → mdprep-0.3.0}/docs/README.md +2 -0
  6. mdprep-0.3.0/docs/guided_manifests.md +152 -0
  7. {mdprep-0.2.0 → mdprep-0.3.0}/docs/installation.md +42 -9
  8. mdprep-0.3.0/docs/ligands.md +91 -0
  9. {mdprep-0.2.0 → mdprep-0.3.0}/docs/manifest_reference.md +28 -2
  10. {mdprep-0.2.0 → mdprep-0.3.0}/docs/metals.md +157 -0
  11. {mdprep-0.2.0 → mdprep-0.3.0}/docs/molecular_dynamics.md +55 -0
  12. mdprep-0.3.0/docs/protonation.md +181 -0
  13. {mdprep-0.2.0 → mdprep-0.3.0}/docs/qmmm_refinement.md +58 -7
  14. mdprep-0.3.0/docs/quickstart.md +75 -0
  15. mdprep-0.3.0/docs/tleap_and_validation.md +97 -0
  16. {mdprep-0.2.0 → mdprep-0.3.0}/docs/troubleshooting.md +29 -0
  17. mdprep-0.3.0/environment-minimal.yml +17 -0
  18. mdprep-0.3.0/environment.yml +45 -0
  19. mdprep-0.3.0/examples/16_besd_halogenase_gfn2_mcpb.yaml +163 -0
  20. mdprep-0.3.0/examples/README.md +90 -0
  21. mdprep-0.3.0/examples/colab/mdprep_colab_pipeline.py +1618 -0
  22. mdprep-0.3.0/examples/colab_smoke_test.ipynb +114 -0
  23. mdprep-0.3.0/examples/mdprep_colab_run.ipynb +277 -0
  24. mdprep-0.3.0/examples/mdprep_interactive_colab.ipynb +2189 -0
  25. {mdprep-0.2.0 → mdprep-0.3.0}/pyproject.toml +46 -3
  26. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/__init__.py +1 -1
  27. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/mol2.py +69 -3
  28. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/cli.py +239 -8
  29. mdprep-0.3.0/src/mdprep/config/decisions.py +2357 -0
  30. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/config/models.py +144 -16
  31. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/builder.py +3 -2
  32. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/log_parser.py +15 -0
  33. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/residues.py +70 -30
  34. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/extract.py +30 -0
  35. mdprep-0.3.0/src/mdprep/ligands/hydrogenate.py +420 -0
  36. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/workflow.py +2 -0
  37. mdprep-0.3.0/src/mdprep/md/imaging.py +146 -0
  38. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/md/roe_brooks.py +139 -30
  39. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/gxtb_hessian.py +45 -8
  40. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/hydrogenate.py +9 -18
  41. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mcpb.py +350 -29
  42. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/nonbonded.py +25 -4
  43. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/pyscf_mcpb.py +174 -12
  44. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/apply.py +45 -23
  45. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/histidine_geometry.py +98 -10
  46. mdprep-0.3.0/src/mdprep/protonation/histidine_qmmm.py +597 -0
  47. mdprep-0.3.0/src/mdprep/protonation/histidine_xtb.py +966 -0
  48. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/propka_parser.py +11 -3
  49. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/report.py +3 -0
  50. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/temporary_hydrogenation.py +194 -22
  51. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/xtb_runner.py +47 -3
  52. mdprep-0.3.0/src/mdprep/qm/xtb_esp.py +357 -0
  53. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/coordinates.py +2 -18
  54. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/mapping.py +4 -0
  55. mdprep-0.3.0/src/mdprep/refinement/openmm_minimizer.py +327 -0
  56. mdprep-0.3.0/src/mdprep/refinement/report.py +116 -0
  57. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/selection.py +52 -3
  58. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/workflow.py +55 -19
  59. mdprep-0.3.0/src/mdprep/structure/classify.py +262 -0
  60. mdprep-0.3.0/src/mdprep/structure/completeness.py +169 -0
  61. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/inspect.py +9 -2
  62. mdprep-0.3.0/src/mdprep/structure/mmcif.py +248 -0
  63. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/models.py +37 -0
  64. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/normalize.py +140 -4
  65. mdprep-0.3.0/src/mdprep/structure/pdb.py +709 -0
  66. mdprep-0.3.0/src/mdprep/structure/pdb_fields.py +341 -0
  67. mdprep-0.3.0/src/mdprep/structure/reader.py +47 -0
  68. mdprep-0.3.0/src/mdprep/structure/rename.py +105 -0
  69. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/repair.py +168 -13
  70. mdprep-0.3.0/src/mdprep/structure/writer.py +227 -0
  71. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/topology.py +61 -3
  72. mdprep-0.3.0/src/mdprep/workflows/doctor.py +249 -0
  73. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/prepare.py +58 -16
  74. mdprep-0.3.0/src/mdprep/workflows/runtime.py +270 -0
  75. mdprep-0.3.0/src/mdprep/workflows/wizard.py +202 -0
  76. mdprep-0.3.0/tests/besd_structure.py +68 -0
  77. mdprep-0.3.0/tests/browser/launch.mjs +58 -0
  78. mdprep-0.3.0/tests/browser/smoke.mjs +216 -0
  79. mdprep-0.3.0/tests/browser/student_flow.mjs +117 -0
  80. mdprep-0.3.0/tests/conftest.py +3 -0
  81. mdprep-0.3.0/tests/data/amber/README.md +13 -0
  82. mdprep-0.3.0/tests/data/amber/ace_ala_gly_nme.inpcrd +17 -0
  83. mdprep-0.3.0/tests/data/amber/ace_ala_gly_nme.prmtop +286 -0
  84. mdprep-0.3.0/tests/data/boltz_far_donor.cif +50 -0
  85. mdprep-0.3.0/tests/data/boltz_model.cif +41 -0
  86. mdprep-0.3.0/tests/data/boltz_smiles_ligands.cif +47 -0
  87. mdprep-0.3.0/tests/data/boltz_wide_names.cif +50 -0
  88. mdprep-0.3.0/tests/data/protein_with_hydrogenated_free_lysine.pdb +54 -0
  89. mdprep-0.3.0/tests/data/protein_zinc_aqua.pdb +22 -0
  90. mdprep-0.3.0/tests/test_besd_halogenase_case.py +351 -0
  91. mdprep-0.3.0/tests/test_browser_planning_path.py +120 -0
  92. mdprep-0.3.0/tests/test_build_residues_is_defined_once.py +96 -0
  93. mdprep-0.3.0/tests/test_cli.py +49 -0
  94. mdprep-0.3.0/tests/test_colab_run_notebook.py +125 -0
  95. mdprep-0.3.0/tests/test_colab_smoke_notebook.py +15 -0
  96. mdprep-0.3.0/tests/test_colab_wizard_notebook.py +416 -0
  97. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_config_validation.py +27 -0
  98. mdprep-0.3.0/tests/test_coordinating_ions.py +200 -0
  99. mdprep-0.3.0/tests/test_doctor.py +242 -0
  100. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_gxtb_hessian.py +33 -0
  101. mdprep-0.3.0/tests/test_external_md_restraint_frame.py +97 -0
  102. mdprep-0.3.0/tests/test_external_md_snapshot_box.py +131 -0
  103. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_structure_repair.py +88 -0
  104. mdprep-0.3.0/tests/test_external_xtb_embedding.py +113 -0
  105. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_gxtb_hessian.py +70 -13
  106. mdprep-0.3.0/tests/test_histidine_cluster_metal.py +166 -0
  107. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_histidine_geometry.py +53 -5
  108. mdprep-0.3.0/tests/test_histidine_qmmm.py +293 -0
  109. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_input_pdb.py +7 -23
  110. mdprep-0.3.0/tests/test_leap_ligand_residue_names.py +272 -0
  111. mdprep-0.3.0/tests/test_ligand_hydrogenation.py +405 -0
  112. mdprep-0.3.0/tests/test_ligand_mol2_validation.py +0 -0
  113. mdprep-0.3.0/tests/test_manifest_decisions.py +939 -0
  114. mdprep-0.3.0/tests/test_manifest_wizard.py +369 -0
  115. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mcpb_pyscf_fixed_geometry.py +5 -0
  116. mdprep-0.3.0/tests/test_md_imaging.py +180 -0
  117. mdprep-0.3.0/tests/test_metal_hydrogenation_preservation.py +88 -0
  118. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_metals.py +56 -0
  119. mdprep-0.3.0/tests/test_mmcif.py +406 -0
  120. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mol2_validation.py +39 -0
  121. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_packaging_metadata.py +1 -1
  122. mdprep-0.3.0/tests/test_pdb_large_serials.py +154 -0
  123. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pdb_parser.py +26 -0
  124. mdprep-0.3.0/tests/test_pdb_roundtrip_property.py +285 -0
  125. mdprep-0.3.0/tests/test_pdb_writer.py +178 -0
  126. mdprep-0.3.0/tests/test_prediction_pdb_quirks.py +123 -0
  127. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_refinement_stage.py +7 -0
  128. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_tleap_stage.py +1 -1
  129. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_xtb_workflow.py +39 -8
  130. mdprep-0.3.0/tests/test_qm_region_spin_state.py +172 -0
  131. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_config.py +46 -2
  132. mdprep-0.3.0/tests/test_refinement_openmm.py +190 -0
  133. mdprep-0.3.0/tests/test_refinement_platform.py +153 -0
  134. mdprep-0.3.0/tests/test_refinement_report.py +156 -0
  135. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_selection.py +7 -0
  136. mdprep-0.3.0/tests/test_residue_rename.py +148 -0
  137. mdprep-0.3.0/tests/test_roe_brooks_restraints.py +162 -0
  138. mdprep-0.3.0/tests/test_runtime_requirements.py +396 -0
  139. mdprep-0.3.0/tests/test_runtime_requirements_cover_every_option.py +324 -0
  140. mdprep-0.3.0/tests/test_structure_completeness.py +256 -0
  141. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_structure_normalize.py +32 -0
  142. mdprep-0.3.0/tests/test_structure_repair_inputs.py +183 -0
  143. mdprep-0.3.0/tests/test_temporary_hydrogenation_hold_back.py +145 -0
  144. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_validation_helpers.py +56 -0
  145. mdprep-0.3.0/tests/test_validation_topology.py +28 -0
  146. mdprep-0.3.0/tests/test_web_builder_browser.py +340 -0
  147. mdprep-0.3.0/tests/test_web_builder_reference_case.py +232 -0
  148. mdprep-0.3.0/tests/test_web_bundle_zip.py +116 -0
  149. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_xtb_command_builder.py +27 -0
  150. mdprep-0.3.0/tests/test_xtb_esp.py +150 -0
  151. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_xtb_water_hydrogens.py +14 -2
  152. mdprep-0.3.0/web/.gitignore +1 -0
  153. mdprep-0.3.0/web/README.md +118 -0
  154. mdprep-0.3.0/web/app.js +918 -0
  155. mdprep-0.3.0/web/build.py +79 -0
  156. mdprep-0.3.0/web/index.html +149 -0
  157. mdprep-0.3.0/web/style.css +323 -0
  158. mdprep-0.3.0/web/zip.js +154 -0
  159. mdprep-0.2.0/.github/workflows/tests.yml +0 -52
  160. mdprep-0.2.0/CHANGELOG.md +0 -54
  161. mdprep-0.2.0/MANIFEST.in +0 -11
  162. mdprep-0.2.0/Roe_and_Brooks.py +0 -41
  163. mdprep-0.2.0/Roe_and_Brooks_corrected.py +0 -587
  164. mdprep-0.2.0/docs/ligands.md +0 -48
  165. mdprep-0.2.0/docs/protonation.md +0 -70
  166. mdprep-0.2.0/docs/quickstart.md +0 -41
  167. mdprep-0.2.0/docs/tleap_and_validation.md +0 -41
  168. mdprep-0.2.0/environment.yml +0 -24
  169. mdprep-0.2.0/examples/README.md +0 -28
  170. mdprep-0.2.0/examples/tutorials/7E07.pdb +0 -5271
  171. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/README.md +0 -121
  172. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/input.pdb +0 -2384
  173. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/optimized_small_model.pdb +0 -55
  174. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/reference/large_embedded_cdiis150_restart.chk +0 -0
  175. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/system.yaml +0 -239
  176. mdprep-0.2.0/examples/tutorials/7E07_prepared.pdb +0 -2382
  177. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/README.md +0 -15
  178. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/input.pdb +0 -3
  179. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/ligand.frcmod +0 -11
  180. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/ligand.mol2 +0 -11
  181. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/system.yaml +0 -71
  182. mdprep-0.2.0/scripts/run_smoke_tests.sh +0 -17
  183. mdprep-0.2.0/src/mdprep/protonation/histidine_xtb.py +0 -390
  184. mdprep-0.2.0/src/mdprep/refinement/report.py +0 -66
  185. mdprep-0.2.0/src/mdprep/structure/classify.py +0 -92
  186. mdprep-0.2.0/src/mdprep/structure/pdb.py +0 -511
  187. mdprep-0.2.0/src/mdprep/structure/writer.py +0 -84
  188. mdprep-0.2.0/tests/test_cli.py +0 -23
  189. mdprep-0.2.0/tests/test_pdb_writer.py +0 -55
  190. {mdprep-0.2.0 → mdprep-0.3.0}/AGENTS.md +0 -0
  191. {mdprep-0.2.0 → mdprep-0.3.0}/CITATION.cff +0 -0
  192. {mdprep-0.2.0 → mdprep-0.3.0}/CONTRIBUTING.md +0 -0
  193. {mdprep-0.2.0 → mdprep-0.3.0}/LICENSE +0 -0
  194. {mdprep-0.2.0 → mdprep-0.3.0}/docs/developer_notes.md +0 -0
  195. {mdprep-0.2.0 → mdprep-0.3.0}/docs/mcpb_xtb_benchmark.md +0 -0
  196. {mdprep-0.2.0 → mdprep-0.3.0}/docs/qmmesp_pyscf.md +0 -0
  197. {mdprep-0.2.0 → mdprep-0.3.0}/environment-dev.yml +0 -0
  198. {mdprep-0.2.0 → mdprep-0.3.0}/examples/00_basic_protein.yaml +0 -0
  199. {mdprep-0.2.0 → mdprep-0.3.0}/examples/01_protein_only_ff19sb.yaml +0 -0
  200. {mdprep-0.2.0 → mdprep-0.3.0}/examples/02_manual_catalytic_protonation.yaml +0 -0
  201. {mdprep-0.2.0 → mdprep-0.3.0}/examples/03_multi_ligand_am1bcc.yaml +0 -0
  202. {mdprep-0.2.0 → mdprep-0.3.0}/examples/04_qmmesp_pyscf_ligand.yaml +0 -0
  203. {mdprep-0.2.0 → mdprep-0.3.0}/examples/05_histidine_gxtb_sp.yaml +0 -0
  204. {mdprep-0.2.0 → mdprep-0.3.0}/examples/06_disulfide_manual.yaml +0 -0
  205. {mdprep-0.2.0 → mdprep-0.3.0}/examples/07_gas_resp_pyscf_ligand.yaml +0 -0
  206. {mdprep-0.2.0 → mdprep-0.3.0}/examples/08_nonbonded_zinc_1264.yaml +0 -0
  207. {mdprep-0.2.0 → mdprep-0.3.0}/examples/09_bonded_zinc_mcpb_prepare.yaml +0 -0
  208. {mdprep-0.2.0 → mdprep-0.3.0}/examples/10_qmmm_refinement_ash.yaml +0 -0
  209. {mdprep-0.2.0 → mdprep-0.3.0}/examples/11_qmmm_metal_gfn2_mcpb.yaml +0 -0
  210. {mdprep-0.2.0 → mdprep-0.3.0}/examples/12_qmmm_metal_mace_polar1_mcpb.yaml +0 -0
  211. {mdprep-0.2.0 → mdprep-0.3.0}/examples/13_qmmm_refinement_gxtb_mechanical.yaml +0 -0
  212. {mdprep-0.2.0 → mdprep-0.3.0}/examples/14_qmmm_refinement_mace_polar1_mechanical.yaml +0 -0
  213. {mdprep-0.2.0 → mdprep-0.3.0}/examples/15_roe_brooks_openmm.yaml +0 -0
  214. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/_selftest_data/basic_protein.yaml +0 -0
  215. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/_selftest_data/ligand_sub.mol2 +0 -0
  216. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/__init__.py +0 -0
  217. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/antechamber.py +0 -0
  218. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/commands.py +0 -0
  219. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/parmchk2.py +0 -0
  220. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ambertools/resp.py +0 -0
  221. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/charges/__init__.py +0 -0
  222. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/charges/esp_grid.py +0 -0
  223. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/config/__init__.py +0 -0
  224. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/config/loader.py +0 -0
  225. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/external/__init__.py +0 -0
  226. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/external/discovery.py +0 -0
  227. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/external/runner.py +0 -0
  228. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/__init__.py +0 -0
  229. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/forcefields.py +0 -0
  230. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/ions.py +0 -0
  231. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/report.py +0 -0
  232. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/leap/runner.py +0 -0
  233. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/__init__.py +0 -0
  234. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/identity.py +0 -0
  235. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/pyscf_charges.py +0 -0
  236. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/ligands/report.py +0 -0
  237. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/md/__init__.py +0 -0
  238. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/__init__.py +0 -0
  239. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/c4.py +0 -0
  240. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/coordination.py +0 -0
  241. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mace_polar1_hessian.py +0 -0
  242. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mace_polar1_worker.py +0 -0
  243. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/mcpb_compat.py +0 -0
  244. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/parameter_comparison.py +0 -0
  245. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/report.py +0 -0
  246. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/metals/workflow.py +0 -0
  247. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/__init__.py +0 -0
  248. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/disulfide_states.py +0 -0
  249. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/overrides.py +0 -0
  250. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/pka_rules.py +0 -0
  251. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/propka.py +0 -0
  252. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/states.py +0 -0
  253. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/protonation/xtb_parser.py +0 -0
  254. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/__init__.py +0 -0
  255. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/point_charges.py +0 -0
  256. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/pyscf_esp.py +0 -0
  257. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/qm/pyscf_runner.py +0 -0
  258. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/__init__.py +0 -0
  259. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/refinement/ash.py +0 -0
  260. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/reports/__init__.py +0 -0
  261. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/reports/structure_report.py +0 -0
  262. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/__init__.py +0 -0
  263. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/disulfides.py +0 -0
  264. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/structure/selectors.py +0 -0
  265. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/__init__.py +0 -0
  266. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/openmm_check.py +0 -0
  267. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/validation/parmed_check.py +0 -0
  268. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/__init__.py +0 -0
  269. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/init.py +0 -0
  270. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/inspect.py +0 -0
  271. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/selftest.py +0 -0
  272. {mdprep-0.2.0 → mdprep-0.3.0}/src/mdprep/workflows/validate.py +0 -0
  273. {mdprep-0.2.0 → mdprep-0.3.0}/tests/__init__.py +0 -0
  274. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_cof.frcmod +0 -0
  275. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_cof.good.mol2 +0 -0
  276. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.atom_count_mismatch.mol2 +0 -0
  277. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.bad_charge.mol2 +0 -0
  278. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.frcmod +0 -0
  279. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.good.mol2 +0 -0
  280. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.pdb +0 -0
  281. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.renamed.mol2 +0 -0
  282. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.shifted_coords.mol2 +0 -0
  283. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/ligands/ligand_sub.small_residual.mol2 +0 -0
  284. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/propka_sample.pka +0 -0
  285. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_altloc.pdb +0 -0
  286. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_atom_record_ligand_blank_chain.pdb +0 -0
  287. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_blank_chain.pdb +0 -0
  288. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_cyx_disulfide.pdb +0 -0
  289. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_disulfide.pdb +0 -0
  290. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_ring.pdb +0 -0
  291. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_ring_hydrogenated.pdb +0 -0
  292. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_water_oxygen.pdb +0 -0
  293. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_histidine_zinc.pdb +0 -0
  294. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_insertion_code.pdb +0 -0
  295. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_two_ligands.pdb +0 -0
  296. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_with_hydrogens.pdb +0 -0
  297. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/protein_with_waters.pdb +0 -0
  298. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/xtb_hid_stdout.txt +0 -0
  299. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/xtb_hie_stdout.txt +0 -0
  300. {mdprep-0.2.0 → mdprep-0.3.0}/tests/data/zinc_only.pdb +0 -0
  301. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_altloc.py +0 -0
  302. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_amber_resp.py +0 -0
  303. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ambertools_commands.py +0 -0
  304. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_classify.py +0 -0
  305. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_config_examples.py +0 -0
  306. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_disulfide_assignment.py +0 -0
  307. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_disulfide_leap_mapping.py +0 -0
  308. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_disulfides.py +0 -0
  309. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_esp_grid.py +0 -0
  310. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_amber_resp.py +0 -0
  311. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_ambertools.py +0 -0
  312. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_mace_polar1.py +0 -0
  313. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_metals.py +0 -0
  314. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_propka_xtb.py +0 -0
  315. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_pyscf.py +0 -0
  316. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_external_tleap.py +0 -0
  317. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_import.py +0 -0
  318. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_init_cli.py +0 -0
  319. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_init_ligand_placeholders.py +0 -0
  320. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_inspect_cli.py +0 -0
  321. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ions.py +0 -0
  322. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_builder.py +0 -0
  323. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_forcefields.py +0 -0
  324. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_leap_log_parser.py +0 -0
  325. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ligand_extraction.py +0 -0
  326. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_ligand_workflow_mocked.py +0 -0
  327. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mace_polar1_hessian.py +0 -0
  328. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_manifest_paths.py +0 -0
  329. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_manual_protonation.py +0 -0
  330. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mcpb_compat.py +0 -0
  331. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mcpb_parameter_comparison.py +0 -0
  332. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_md_config.py +0 -0
  333. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_mol2_parser.py +0 -0
  334. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_no_openbabel.py +0 -0
  335. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pka_rules.py +0 -0
  336. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_point_charges.py +0 -0
  337. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_ligands_stage.py +0 -0
  338. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_protonation_stage.py +0 -0
  339. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_pyscf_ligands_stage.py +0 -0
  340. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_prepare_structure_stage.py +0 -0
  341. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_propka_parser.py +0 -0
  342. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_propka_workflow.py +0 -0
  343. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_reuse_refined.py +0 -0
  344. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_protonation_states.py +0 -0
  345. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pyscf_esp_mocked.py +0 -0
  346. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_pyscf_runner_config.py +0 -0
  347. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_qmmesp_correctness.py +0 -0
  348. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_qmmesp_final_mol2_usage.py +0 -0
  349. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_qmmesp_no_environment_fit.py +0 -0
  350. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_readme_example.py +0 -0
  351. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_ash.py +0 -0
  352. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_refinement_coordinates.py +0 -0
  353. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_remove_hydrogens.py +0 -0
  354. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_roe_brooks.py +0 -0
  355. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_selectors.py +0 -0
  356. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_selftest_installed.py +0 -0
  357. {mdprep-0.2.0 → mdprep-0.3.0}/tests/test_tleap_workflow_mocked.py +0 -0
  358. {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.2.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.2.0 prepares reproducible Amber molecular-dynamics systems from a
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 init input.pdb -o system.yaml
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.2.0 does not support noncanonical amino acids inside peptide chains,
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.2.0 prepares reproducible Amber molecular-dynamics systems from a
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 init input.pdb -o system.yaml
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.2.0 does not support noncanonical amino acids inside peptide chains,
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
- Recommended user install:
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
- pip install -e .
9
- mdprep selftest --quick
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