mdprep 0.4.0__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. {mdprep-0.4.0 → mdprep-0.5.1}/CHANGELOG.md +218 -0
  2. {mdprep-0.4.0 → mdprep-0.5.1}/CONTRIBUTING.md +13 -8
  3. {mdprep-0.4.0 → mdprep-0.5.1}/PKG-INFO +27 -11
  4. {mdprep-0.4.0 → mdprep-0.5.1}/README.md +26 -10
  5. {mdprep-0.4.0 → mdprep-0.5.1}/docs/README.md +2 -0
  6. mdprep-0.5.1/docs/enzyme_families.md +78 -0
  7. {mdprep-0.4.0 → mdprep-0.5.1}/docs/guided_manifests.md +47 -0
  8. mdprep-0.5.1/docs/heterogens.md +152 -0
  9. mdprep-0.5.1/docs/ligands.md +163 -0
  10. {mdprep-0.4.0 → mdprep-0.5.1}/docs/manifest_reference.md +82 -8
  11. {mdprep-0.4.0 → mdprep-0.5.1}/docs/metals.md +176 -2
  12. {mdprep-0.4.0 → mdprep-0.5.1}/docs/molecular_dynamics.md +1 -1
  13. {mdprep-0.4.0 → mdprep-0.5.1}/docs/predicted_structures.md +4 -3
  14. {mdprep-0.4.0 → mdprep-0.5.1}/docs/protonation.md +8 -2
  15. {mdprep-0.4.0 → mdprep-0.5.1}/docs/troubleshooting.md +65 -2
  16. mdprep-0.5.1/examples/19_cyp119_heme_mcpb.yaml +228 -0
  17. mdprep-0.5.1/examples/20_upo_5oxu_heme_glycans.yaml +352 -0
  18. mdprep-0.5.1/examples/21_prna_fad_halogenase.yaml +85 -0
  19. {mdprep-0.4.0 → mdprep-0.5.1}/examples/README.md +13 -7
  20. {mdprep-0.4.0 → mdprep-0.5.1}/examples/colab_smoke_test.ipynb +1 -1
  21. {mdprep-0.4.0 → mdprep-0.5.1}/examples/mdprep_colab.ipynb +135 -299
  22. {mdprep-0.4.0 → mdprep-0.5.1}/examples/mdprep_interactive_colab.ipynb +1 -1
  23. {mdprep-0.4.0 → mdprep-0.5.1}/pyproject.toml +1 -1
  24. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/__init__.py +1 -1
  25. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/cli.py +13 -1
  26. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/config/decisions.py +855 -213
  27. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/config/models.py +165 -5
  28. mdprep-0.5.1/src/mdprep/ligands/cofactors.py +215 -0
  29. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ligands/extract.py +22 -12
  30. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ligands/hydrogenate.py +257 -76
  31. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/gxtb_hessian.py +184 -5
  32. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/hydrogenate.py +3 -2
  33. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/mcpb.py +46 -0
  34. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/pyscf_mcpb.py +10 -0
  35. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/apply.py +11 -20
  36. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/histidine_geometry.py +16 -22
  37. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/histidine_qmmm.py +19 -2
  38. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/histidine_xtb.py +3 -3
  39. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/temporary_hydrogenation.py +21 -6
  40. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/coordinates.py +2 -1
  41. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/mapping.py +3 -4
  42. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/selection.py +15 -1
  43. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/reports/structure_report.py +64 -0
  44. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/classify.py +9 -0
  45. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/completeness.py +16 -6
  46. mdprep-0.5.1/src/mdprep/structure/heterogens.py +476 -0
  47. mdprep-0.5.1/src/mdprep/structure/hydrogens.py +221 -0
  48. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/inspect.py +18 -0
  49. mdprep-0.5.1/src/mdprep/structure/links.py +308 -0
  50. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/mmcif.py +21 -4
  51. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/models.py +13 -1
  52. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/normalize.py +204 -44
  53. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/oligomer.py +3 -9
  54. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/pdb.py +121 -17
  55. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/pdb_fields.py +188 -14
  56. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/repair.py +314 -15
  57. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/selectors.py +6 -0
  58. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/waters.py +2 -1
  59. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/init.py +8 -1
  60. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/prepare.py +1 -0
  61. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/runtime.py +21 -1
  62. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/wizard.py +9 -1
  63. mdprep-0.5.1/tests/browser/example_button.mjs +72 -0
  64. {mdprep-0.4.0 → mdprep-0.5.1}/tests/browser/student_flow.mjs +7 -0
  65. mdprep-0.5.1/tests/data/cofactors/fad_2ar8.pdb +55 -0
  66. mdprep-0.5.1/tests/data/cofactors/fmn_4ttb.pdb +33 -0
  67. mdprep-0.5.1/tests/data/cofactors/hem_2qfk.pdb +46 -0
  68. mdprep-0.5.1/tests/data/cofactors/nad_2jhf.pdb +46 -0
  69. mdprep-0.5.1/tests/data/cofactors/nai_4plz.pdb +46 -0
  70. mdprep-0.5.1/tests/data/cofactors/nap_4lbs.pdb +50 -0
  71. mdprep-0.5.1/tests/data/cofactors/ndp_1kmv.pdb +50 -0
  72. mdprep-0.5.1/tests/data/cofactors/sah_8pb4.pdb +28 -0
  73. mdprep-0.5.1/tests/data/cofactors/sam_7rwg.pdb +29 -0
  74. mdprep-0.5.1/tests/data/heterogens/covalent_intermediate_1zrn.pdb +64 -0
  75. mdprep-0.5.1/tests/data/heterogens/pyroglutamate_1cpo.pdb +89 -0
  76. mdprep-0.5.1/tests/data/heterogens/selenomethionine_1rqr.pdb +58 -0
  77. mdprep-0.5.1/tests/data/heterogens/vanadate_1idq.pdb +39 -0
  78. mdprep-0.5.1/tests/data/input_hydrogens/README.md +28 -0
  79. mdprep-0.5.1/tests/data/input_hydrogens/docked_polar_only.pdb +19 -0
  80. mdprep-0.5.1/tests/data/input_hydrogens/riding_peptide.pdb +172 -0
  81. mdprep-0.5.1/tests/data/input_hydrogens/syrb2_site.converter.pdb +212 -0
  82. mdprep-0.5.1/tests/data/input_hydrogens/syrb2_site.pdb +77 -0
  83. mdprep-0.5.1/tests/data/input_hydrogens/syrb2_site.pdbfixer.pdb +132 -0
  84. mdprep-0.5.1/tests/data/input_hydrogens/syrb2_site.pymol.pdb +142 -0
  85. mdprep-0.5.1/tests/data/input_hydrogens/syrb2_site.pymol_polar.pdb +105 -0
  86. mdprep-0.5.1/tests/data/input_hydrogens/syrb2_site.reduce.pdb +120 -0
  87. mdprep-0.5.1/tests/data/metals/dhp_2qfk_small_model.xyz +93 -0
  88. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_besd_halogenase_case.py +3 -1
  89. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_colab_official_notebook.py +56 -16
  90. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_colab_smoke_notebook.py +1 -1
  91. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_crystal_ions.py +0 -1
  92. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_gxtb_hessian.py +43 -0
  93. mdprep-0.5.1/tests/test_external_halogenase_families.py +130 -0
  94. mdprep-0.5.1/tests/test_external_heme_mcpb.py +98 -0
  95. mdprep-0.5.1/tests/test_external_modified_residues.py +154 -0
  96. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_structure_repair.py +3 -2
  97. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_gxtb_hessian.py +173 -0
  98. mdprep-0.5.1/tests/test_heterogen_groups.py +649 -0
  99. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_histidine_qmmm.py +48 -14
  100. mdprep-0.5.1/tests/test_input_hydrogens.py +658 -0
  101. mdprep-0.5.1/tests/test_known_cofactors.py +114 -0
  102. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_ligand_hydrogenation.py +120 -24
  103. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_manifest_decisions.py +20 -5
  104. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_manifest_wizard.py +4 -2
  105. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_mcpb_parameter_comparison.py +47 -0
  106. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_metal_bound_water.py +4 -15
  107. mdprep-0.5.1/tests/test_metal_cofactors.py +405 -0
  108. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_oligomers.py +0 -2
  109. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_packaging_metadata.py +1 -1
  110. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_pdb_large_serials.py +33 -5
  111. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_pdb_parser.py +35 -1
  112. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_protonation_xtb_workflow.py +20 -7
  113. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_qm_region_spin_state.py +20 -36
  114. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_refinement_selection.py +95 -0
  115. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_remove_hydrogens.py +9 -5
  116. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_runtime_requirements.py +16 -2
  117. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_runtime_requirements_cover_every_option.py +23 -1
  118. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_structure_completeness.py +0 -3
  119. mdprep-0.5.1/tests/test_structure_links.py +219 -0
  120. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_structure_normalize.py +5 -1
  121. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_structure_repair_inputs.py +32 -0
  122. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_syrb2_bound_water_case.py +1 -2
  123. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_web_builder_bound_water_case.py +10 -6
  124. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_web_builder_browser.py +8 -4
  125. mdprep-0.5.1/tests/test_web_builder_example_button.py +62 -0
  126. mdprep-0.5.1/tests/test_web_builder_flavin_case.py +120 -0
  127. mdprep-0.5.1/tests/test_web_builder_heme_case.py +119 -0
  128. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_web_builder_oligomer_case.py +2 -2
  129. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_web_builder_reference_case.py +13 -13
  130. mdprep-0.5.1/tests/test_web_builder_upo_case.py +104 -0
  131. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_xtb_water_hydrogens.py +4 -0
  132. {mdprep-0.4.0 → mdprep-0.5.1}/web/README.md +7 -0
  133. {mdprep-0.4.0 → mdprep-0.5.1}/web/app.js +79 -33
  134. {mdprep-0.4.0 → mdprep-0.5.1}/web/index.html +16 -5
  135. {mdprep-0.4.0 → mdprep-0.5.1}/web/style.css +23 -0
  136. mdprep-0.4.0/docs/ligands.md +0 -91
  137. {mdprep-0.4.0 → mdprep-0.5.1}/.gitignore +0 -0
  138. {mdprep-0.4.0 → mdprep-0.5.1}/AGENTS.md +0 -0
  139. {mdprep-0.4.0 → mdprep-0.5.1}/CITATION.cff +0 -0
  140. {mdprep-0.4.0 → mdprep-0.5.1}/LICENSE +0 -0
  141. {mdprep-0.4.0 → mdprep-0.5.1}/docs/developer_notes.md +0 -0
  142. {mdprep-0.4.0 → mdprep-0.5.1}/docs/installation.md +0 -0
  143. {mdprep-0.4.0 → mdprep-0.5.1}/docs/mcpb_xtb_benchmark.md +0 -0
  144. {mdprep-0.4.0 → mdprep-0.5.1}/docs/oligomers.md +0 -0
  145. {mdprep-0.4.0 → mdprep-0.5.1}/docs/qmmesp_pyscf.md +0 -0
  146. {mdprep-0.4.0 → mdprep-0.5.1}/docs/qmmm_refinement.md +0 -0
  147. {mdprep-0.4.0 → mdprep-0.5.1}/docs/quickstart.md +0 -0
  148. {mdprep-0.4.0 → mdprep-0.5.1}/docs/tleap_and_validation.md +0 -0
  149. {mdprep-0.4.0 → mdprep-0.5.1}/environment-dev.yml +0 -0
  150. {mdprep-0.4.0 → mdprep-0.5.1}/environment-minimal.yml +0 -0
  151. {mdprep-0.4.0 → mdprep-0.5.1}/environment.yml +0 -0
  152. {mdprep-0.4.0 → mdprep-0.5.1}/examples/00_basic_protein.yaml +0 -0
  153. {mdprep-0.4.0 → mdprep-0.5.1}/examples/01_protein_only_ff19sb.yaml +0 -0
  154. {mdprep-0.4.0 → mdprep-0.5.1}/examples/02_manual_catalytic_protonation.yaml +0 -0
  155. {mdprep-0.4.0 → mdprep-0.5.1}/examples/03_multi_ligand_am1bcc.yaml +0 -0
  156. {mdprep-0.4.0 → mdprep-0.5.1}/examples/04_qmmesp_pyscf_ligand.yaml +0 -0
  157. {mdprep-0.4.0 → mdprep-0.5.1}/examples/05_histidine_gxtb_sp.yaml +0 -0
  158. {mdprep-0.4.0 → mdprep-0.5.1}/examples/06_disulfide_manual.yaml +0 -0
  159. {mdprep-0.4.0 → mdprep-0.5.1}/examples/07_gas_resp_pyscf_ligand.yaml +0 -0
  160. {mdprep-0.4.0 → mdprep-0.5.1}/examples/08_nonbonded_zinc_1264.yaml +0 -0
  161. {mdprep-0.4.0 → mdprep-0.5.1}/examples/09_bonded_zinc_mcpb_prepare.yaml +0 -0
  162. {mdprep-0.4.0 → mdprep-0.5.1}/examples/10_qmmm_refinement_ash.yaml +0 -0
  163. {mdprep-0.4.0 → mdprep-0.5.1}/examples/11_qmmm_metal_gfn2_mcpb.yaml +0 -0
  164. {mdprep-0.4.0 → mdprep-0.5.1}/examples/12_qmmm_metal_mace_polar1_mcpb.yaml +0 -0
  165. {mdprep-0.4.0 → mdprep-0.5.1}/examples/13_qmmm_refinement_gxtb_mechanical.yaml +0 -0
  166. {mdprep-0.4.0 → mdprep-0.5.1}/examples/14_qmmm_refinement_mace_polar1_mechanical.yaml +0 -0
  167. {mdprep-0.4.0 → mdprep-0.5.1}/examples/15_roe_brooks_openmm.yaml +0 -0
  168. {mdprep-0.4.0 → mdprep-0.5.1}/examples/16_besd_halogenase_gfn2_mcpb.yaml +0 -0
  169. {mdprep-0.4.0 → mdprep-0.5.1}/examples/17_syrb2_bound_water_mcpb.yaml +0 -0
  170. {mdprep-0.4.0 → mdprep-0.5.1}/examples/18_syrb2_dimer_shared_mcpb.yaml +0 -0
  171. {mdprep-0.4.0 → mdprep-0.5.1}/examples/colab/mdprep_colab_pipeline.py +0 -0
  172. {mdprep-0.4.0 → mdprep-0.5.1}/examples/mdprep_colab_run.ipynb +0 -0
  173. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/_selftest_data/basic_protein.yaml +0 -0
  174. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/_selftest_data/ligand_sub.mol2 +0 -0
  175. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ambertools/__init__.py +0 -0
  176. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ambertools/antechamber.py +0 -0
  177. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ambertools/commands.py +0 -0
  178. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ambertools/mol2.py +0 -0
  179. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ambertools/parmchk2.py +0 -0
  180. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ambertools/resp.py +0 -0
  181. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/analysis/__init__.py +0 -0
  182. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/analysis/charges.py +0 -0
  183. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/analysis/dcd.py +0 -0
  184. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/analysis/equilibration.py +0 -0
  185. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/analysis/metal_site.py +0 -0
  186. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/analysis/prmtop.py +0 -0
  187. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/analysis/trajectory.py +0 -0
  188. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/charges/__init__.py +0 -0
  189. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/charges/esp_grid.py +0 -0
  190. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/config/__init__.py +0 -0
  191. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/config/loader.py +0 -0
  192. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/external/__init__.py +0 -0
  193. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/external/discovery.py +0 -0
  194. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/external/runner.py +0 -0
  195. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/__init__.py +0 -0
  196. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/builder.py +0 -0
  197. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/forcefields.py +0 -0
  198. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/ions.py +0 -0
  199. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/log_parser.py +0 -0
  200. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/report.py +0 -0
  201. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/residues.py +0 -0
  202. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/leap/runner.py +0 -0
  203. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ligands/__init__.py +0 -0
  204. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ligands/identity.py +0 -0
  205. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ligands/pyscf_charges.py +0 -0
  206. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ligands/report.py +0 -0
  207. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/ligands/workflow.py +0 -0
  208. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/md/__init__.py +0 -0
  209. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/md/imaging.py +0 -0
  210. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/md/roe_brooks.py +0 -0
  211. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/__init__.py +0 -0
  212. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/c4.py +0 -0
  213. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/coordination.py +0 -0
  214. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/mace_polar1_hessian.py +0 -0
  215. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/mace_polar1_worker.py +0 -0
  216. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/mcpb_compat.py +0 -0
  217. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/nonbonded.py +0 -0
  218. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/parameter_comparison.py +0 -0
  219. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/report.py +0 -0
  220. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/through_metal.py +0 -0
  221. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/metals/workflow.py +0 -0
  222. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/__init__.py +0 -0
  223. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/disulfide_states.py +0 -0
  224. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/overrides.py +0 -0
  225. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/pka_rules.py +0 -0
  226. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/propka.py +0 -0
  227. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/propka_parser.py +0 -0
  228. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/report.py +0 -0
  229. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/states.py +0 -0
  230. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/xtb_parser.py +0 -0
  231. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/protonation/xtb_runner.py +0 -0
  232. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/qm/__init__.py +0 -0
  233. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/qm/point_charges.py +0 -0
  234. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/qm/pyscf_esp.py +0 -0
  235. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/qm/pyscf_runner.py +0 -0
  236. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/qm/xtb_esp.py +0 -0
  237. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/__init__.py +0 -0
  238. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/ash.py +0 -0
  239. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/openmm_minimizer.py +0 -0
  240. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/report.py +0 -0
  241. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/refinement/workflow.py +0 -0
  242. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/reports/__init__.py +0 -0
  243. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/__init__.py +0 -0
  244. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/closest_xray.py +0 -0
  245. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/coordination.py +0 -0
  246. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/disulfides.py +0 -0
  247. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/reader.py +0 -0
  248. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/rename.py +0 -0
  249. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/structure/writer.py +0 -0
  250. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/validation/__init__.py +0 -0
  251. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/validation/openmm_check.py +0 -0
  252. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/validation/parmed_check.py +0 -0
  253. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/validation/topology.py +0 -0
  254. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/__init__.py +0 -0
  255. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/doctor.py +0 -0
  256. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/inspect.py +0 -0
  257. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/selftest.py +0 -0
  258. {mdprep-0.4.0 → mdprep-0.5.1}/src/mdprep/workflows/validate.py +0 -0
  259. {mdprep-0.4.0 → mdprep-0.5.1}/tests/__init__.py +0 -0
  260. {mdprep-0.4.0 → mdprep-0.5.1}/tests/besd_structure.py +0 -0
  261. {mdprep-0.4.0 → mdprep-0.5.1}/tests/browser/launch.mjs +0 -0
  262. {mdprep-0.4.0 → mdprep-0.5.1}/tests/browser/smoke.mjs +0 -0
  263. {mdprep-0.4.0 → mdprep-0.5.1}/tests/conftest.py +0 -0
  264. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/amber/README.md +0 -0
  265. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/amber/ace_ala_gly_nme.inpcrd +0 -0
  266. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/amber/ace_ala_gly_nme.prmtop +0 -0
  267. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/boltz_far_donor.cif +0 -0
  268. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/boltz_model.cif +0 -0
  269. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/boltz_smiles_ligands.cif +0 -0
  270. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/boltz_wide_names.cif +0 -0
  271. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_cof.frcmod +0 -0
  272. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_cof.good.mol2 +0 -0
  273. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.atom_count_mismatch.mol2 +0 -0
  274. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.bad_charge.mol2 +0 -0
  275. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.frcmod +0 -0
  276. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.good.mol2 +0 -0
  277. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.pdb +0 -0
  278. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.renamed.mol2 +0 -0
  279. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.shifted_coords.mol2 +0 -0
  280. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/ligands/ligand_sub.small_residual.mol2 +0 -0
  281. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/propka_sample.pka +0 -0
  282. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_altloc.pdb +0 -0
  283. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_atom_record_ligand_blank_chain.pdb +0 -0
  284. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_blank_chain.pdb +0 -0
  285. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_cyx_disulfide.pdb +0 -0
  286. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_disulfide.pdb +0 -0
  287. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_histidine_ring.pdb +0 -0
  288. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_histidine_ring_hydrogenated.pdb +0 -0
  289. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_histidine_water_oxygen.pdb +0 -0
  290. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_histidine_zinc.pdb +0 -0
  291. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_insertion_code.pdb +0 -0
  292. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_two_ligands.pdb +0 -0
  293. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_with_hydrogenated_free_lysine.pdb +0 -0
  294. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_with_hydrogens.pdb +0 -0
  295. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_with_waters.pdb +0 -0
  296. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/protein_zinc_aqua.pdb +0 -0
  297. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/xtb_hid_stdout.txt +0 -0
  298. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/xtb_hie_stdout.txt +0 -0
  299. {mdprep-0.4.0 → mdprep-0.5.1}/tests/data/zinc_only.pdb +0 -0
  300. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_altloc.py +0 -0
  301. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_amber_resp.py +0 -0
  302. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_ambertools_commands.py +0 -0
  303. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_analysis.py +0 -0
  304. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_browser_planning_path.py +0 -0
  305. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_build_residues_is_defined_once.py +0 -0
  306. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_classify.py +0 -0
  307. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_cli.py +0 -0
  308. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_closest_xray.py +0 -0
  309. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_colab_wizard_notebook.py +0 -0
  310. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_config_examples.py +0 -0
  311. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_config_validation.py +0 -0
  312. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_coordinating_ions.py +0 -0
  313. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_disulfide_assignment.py +0 -0
  314. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_disulfide_leap_mapping.py +0 -0
  315. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_disulfides.py +0 -0
  316. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_doctor.py +0 -0
  317. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_esp_grid.py +0 -0
  318. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_amber_resp.py +0 -0
  319. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_ambertools.py +0 -0
  320. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_dcd_openmm.py +0 -0
  321. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_mace_polar1.py +0 -0
  322. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_md_restraint_frame.py +0 -0
  323. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_md_snapshot_box.py +0 -0
  324. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_metals.py +0 -0
  325. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_oligomer_mcpb.py +0 -0
  326. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_propka_xtb.py +0 -0
  327. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_pyscf.py +0 -0
  328. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_tleap.py +0 -0
  329. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_water_transplant.py +0 -0
  330. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_external_xtb_embedding.py +0 -0
  331. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_histidine_cluster_metal.py +0 -0
  332. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_histidine_geometry.py +0 -0
  333. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_import.py +0 -0
  334. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_init_cli.py +0 -0
  335. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_init_ligand_placeholders.py +0 -0
  336. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_inspect_cli.py +0 -0
  337. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_ions.py +0 -0
  338. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_leap_builder.py +0 -0
  339. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_leap_forcefields.py +0 -0
  340. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_leap_input_pdb.py +0 -0
  341. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_leap_ligand_residue_names.py +0 -0
  342. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_leap_log_parser.py +0 -0
  343. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_ligand_extraction.py +0 -0
  344. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_ligand_mol2_validation.py +0 -0
  345. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_ligand_workflow_mocked.py +0 -0
  346. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_mace_polar1_hessian.py +0 -0
  347. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_manifest_paths.py +0 -0
  348. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_manual_protonation.py +0 -0
  349. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_mcpb_compat.py +0 -0
  350. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_mcpb_pyscf_fixed_geometry.py +0 -0
  351. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_md_config.py +0 -0
  352. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_md_imaging.py +0 -0
  353. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_metal_hydrogenation_preservation.py +0 -0
  354. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_metals.py +0 -0
  355. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_mmcif.py +0 -0
  356. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_mol2_parser.py +0 -0
  357. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_mol2_validation.py +0 -0
  358. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_no_openbabel.py +0 -0
  359. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_pdb_roundtrip_property.py +0 -0
  360. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_pdb_writer.py +0 -0
  361. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_pka_rules.py +0 -0
  362. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_point_charges.py +0 -0
  363. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_prediction_pdb_quirks.py +0 -0
  364. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_prepare_ligands_stage.py +0 -0
  365. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_prepare_protonation_stage.py +0 -0
  366. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_prepare_pyscf_ligands_stage.py +0 -0
  367. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_prepare_refinement_stage.py +0 -0
  368. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_prepare_structure_stage.py +0 -0
  369. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_prepare_tleap_stage.py +0 -0
  370. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_propka_parser.py +0 -0
  371. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_protonation_propka_workflow.py +0 -0
  372. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_protonation_reuse_refined.py +0 -0
  373. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_protonation_states.py +0 -0
  374. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_pyscf_esp_mocked.py +0 -0
  375. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_pyscf_runner_config.py +0 -0
  376. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_qmmesp_correctness.py +0 -0
  377. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_qmmesp_final_mol2_usage.py +0 -0
  378. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_qmmesp_no_environment_fit.py +0 -0
  379. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_readme_example.py +0 -0
  380. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_refinement_ash.py +0 -0
  381. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_refinement_config.py +0 -0
  382. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_refinement_coordinates.py +0 -0
  383. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_refinement_openmm.py +0 -0
  384. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_refinement_platform.py +0 -0
  385. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_refinement_report.py +0 -0
  386. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_residue_rename.py +0 -0
  387. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_roe_brooks.py +0 -0
  388. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_roe_brooks_restraints.py +0 -0
  389. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_selectors.py +0 -0
  390. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_selftest_installed.py +0 -0
  391. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_temporary_hydrogenation_hold_back.py +0 -0
  392. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_through_metal.py +0 -0
  393. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_tleap_workflow_mocked.py +0 -0
  394. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_validation_helpers.py +0 -0
  395. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_validation_topology.py +0 -0
  396. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_water_transplant.py +0 -0
  397. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_web_bundle_zip.py +0 -0
  398. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_xtb_command_builder.py +0 -0
  399. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_xtb_esp.py +0 -0
  400. {mdprep-0.4.0 → mdprep-0.5.1}/tests/test_xtb_parser.py +0 -0
  401. {mdprep-0.4.0 → mdprep-0.5.1}/web/.gitignore +0 -0
  402. {mdprep-0.4.0 → mdprep-0.5.1}/web/build.py +0 -0
  403. {mdprep-0.4.0 → mdprep-0.5.1}/web/zip.js +0 -0
@@ -1,5 +1,223 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.1 - 2026-10-26
4
+
5
+ ### Added
6
+
7
+ - `ligands[].keep_input_hydrogens`: what to do with input hydrogens that
8
+ disagree with the ligand's SMILES. Unset, they are replaced and reported;
9
+ `true` makes the disagreement an error (a `user_mol2` implies it); `false`
10
+ replaces them without comparing.
11
+ - The structure report's input-hydrogen record (how many were removed from
12
+ protein, water and each other residue, and which ligands kept theirs) and
13
+ its ligand-hydrogen record (placed from the SMILES, kept because they agree
14
+ with it, or replaced, with the atoms that disagreed). The builder's findings
15
+ list the removed hydrogens too.
16
+
17
+ ### Changed
18
+
19
+ - A ligand's SMILES is used whether or not the input has hydrogens on it.
20
+ Hydrogens it has are compared with the SMILES heavy atom by heavy atom and
21
+ kept only if they agree; otherwise they are replaced by the SMILES's and the
22
+ disagreeing atoms are reported (`LIGAND_HYDROGENS_REPLACED`). A ligand with
23
+ any hydrogens at all used to be left as it was and its SMILES ignored, and
24
+ the builder did not ask for one. In consequence a ligand that arrives with
25
+ hydrogens needs a SMILES, unless a `user_mol2` describes it: one without is
26
+ refused as the structure is read, as is one with neither hydrogens nor a
27
+ SMILES (a hydrogen-free molecule can be declared with `expected_formula`,
28
+ as before, or with a SMILES that gives it none). The 7E07 tutorial's
29
+ ligands carry their SMILES now.
30
+ - Every ligand whose hydrogens come from or are checked against a SMILES has
31
+ its electrons counted against its net charge and multiplicity as the
32
+ structure is read; a count the multiplicity cannot have stops the run.
33
+ - The web builder and the official Colab notebook install a pinned mdprep
34
+ release (0.5.0) instead of git master, so everyone in a workshop runs the
35
+ same code and the manifest the builder writes is read by the version that
36
+ wrote it. CONTRIBUTING's release steps raise the pin after the tag has
37
+ published, and a test checks that the page and the notebook name the same
38
+ release.
39
+
40
+ ### Fixed
41
+
42
+ - A structure that arrives with hydrogens -- a deposition refined with riding
43
+ hydrogens, or a model run through PyMOL, reduce, PDBFixer or a format converter --
44
+ no longer stops the run. `structure.remove_input_hydrogens` used to act only
45
+ at the end of protonation, so the hydrogens reached everything before it:
46
+ PyMOL and format converters protonate chlorides, and the builder refused the HCl as
47
+ a ligand named after an Amber ion; reduce numbers every hydrogen it adds 0,
48
+ and the reader refused the file for its CONECT records; a lysine's riding
49
+ HZ3 stopped the temporary hydrogenation for xTB, which built the neutral
50
+ lysine PropKa asked for; and PDBFixer's alpha-ketoglutarate, protonated as
51
+ the neutral acid, was kept and gave MCPB negative angle force constants.
52
+ The hydrogens are now removed as the structure is read, in the builder,
53
+ `mdprep plan`, `mdprep init` and the structure stage alike, so the plan is
54
+ made about the structure that is built and PDBFixer repairs that structure
55
+ too. A ligand's are compared with its SMILES (see Changed).
56
+ - Structure repair lost atoms without saying so when several in a residue
57
+ shared a name: PDBFixer keeps one of them, and the check that no atom went
58
+ missing looked atoms up by name. A format converter names every hydrogen H,
59
+ so six of an alpha-ketoglutarate's went in and one came out. A ligand's
60
+ hydrogens now go round PDBFixer, which has nothing to do with them, and any
61
+ other merge stops the repair with the atoms it affected.
62
+ - Atoms written more than once at partial occupancy without altloc labels --
63
+ a format converter keeps both conformers of a residue and drops the A and B,
64
+ leaving two OD2s in an aspartate at 0.50 each -- are read as the alternate
65
+ locations they are: labelled in file order, chosen by the altloc policy, and
66
+ reported. PDBFixer used to keep one of each pair without saying which.
67
+ - A docked ligand carrying only its polar hydrogens stopped antechamber with
68
+ an odd number of electrons, after the protonation stage had run: having
69
+ hydrogens at all made the builder skip its SMILES question and the
70
+ preparation keep them. It now gets the SMILES's hydrogens, and a manifest
71
+ without its SMILES is refused at once with the reason.
72
+ - CONECT records in a file whose atom serials repeat are followed to the
73
+ atoms' new numbers when the serial they name is unique, and dropped with a
74
+ warning when it is not, instead of the file being refused.
75
+ - The temporary hydrogenation for the xTB histidine comparison stops only
76
+ when a heavy atom goes missing. A hydrogen the residue had and its assigned
77
+ state does not is dropped, as the hydrogens are temporary anyway.
78
+ - One test of what a hydrogen is, the element the reader settled on, instead
79
+ of five that disagreed. A mercury ion written without an element column was
80
+ a hydrogen to two of them, and deuterium was one to only two.
81
+ - A four-character atom name starting with H in a residue without element
82
+ columns (HG21, HO2') is read as a hydrogen, not as mercury or holmium.
83
+ - The official notebook's 3D views hid the metal site they were drawn to
84
+ show: an Fe/alpha-KG enzyme holds its iron inside a beta-barrel, and the
85
+ opaque cartoon covered it. With a metal present the cartoon is now
86
+ translucent, every residue within the site radius is drawn as sticks (it
87
+ was only those within 3 A), and the view is framed on the site. Section
88
+ H's `SITE_RADIUS` reached the atoms it selected but not the drawing, so
89
+ raising it changed nothing visible; it now does both.
90
+
91
+ ## 0.5.0 - 2026-10-23
92
+
93
+ ### Added
94
+
95
+ - The web builder's **Load SyrB2 (PDB 2FCT)** button: the workshop's worked
96
+ example, for a student with no structure of their own, fetched from RCSB as
97
+ a typed ID would be.
98
+ - `mdprep.workflows.runtime.full_toolchain_manifest()`: a manifest that calls
99
+ every program mdprep installs, for an environment built before the real
100
+ manifest exists.
101
+ - Hemes and other metals deposited inside a cofactor. The PDB writes heme b as
102
+ one residue, HEM, with its iron among its atoms; mdprep now moves the metal
103
+ into a residue of its own as any structure is read, named after the element
104
+ with the cofactor's chain and number, and the porphyrin left behind is a
105
+ ligand that coordinates it. A cytochrome P450 becomes an ordinary bonded
106
+ iron site: the four porphyrin nitrogens, the cysteine and the water. The
107
+ oxidation state is asked, not read off the assigned name. Heme b's SMILES
108
+ and net charge (-4, both propionates ionised) are proposed with the
109
+ assumption stated. See `docs/metals.md`.
110
+ - `examples/19_cyp119_heme_mcpb.yaml` and the vendored 1IO7 deposition:
111
+ CYP119 at rest, low-spin Fe(III).
112
+ - `mcpb.pyscf.xtb.electronic_temperature_kelvin`: Fermi smearing for the xTB
113
+ Hessian and the GFN2 ESP of the large model. An open-shell heme's SCF does
114
+ not converge at xTB's own 300 K; the builder sets 1000 K for a site whose
115
+ donors include a heme, and an SCF failure without it names the setting.
116
+ - A residue still holding several metal atoms (an iron-sulfur cluster) and
117
+ heme c, a covalent ligand, are refused with the reason before any question
118
+ is asked.
119
+ - Heterogens that are not ligands. mdprep reads the bonds a deposition
120
+ declares (PDB LINK, mmCIF `_struct_conn`) and its modified residues (MODRES,
121
+ `_pdbx_struct_mod_residue`), and sorts the heterogens before asking about
122
+ ligands: modified residues in a chain, glycans, other heterogens bonded to
123
+ the protein, and crystallisation additives. Each group is one question with
124
+ every member listed. Glycans and additives are proposed for removal, a
125
+ selenomethionine for replacement by methionine; anything else is asked
126
+ without a proposal, and keeping what cannot be built stops at the question.
127
+ See `docs/heterogens.md`.
128
+ - `structure.remove_residues`: residues left out on purpose, each with its
129
+ reason, applied before anything else looks at the structure and reported.
130
+ - `structure.repair.replace_modified_residues`: modified residues replaced by
131
+ their standard parents through PDBFixer, exactly the ones listed.
132
+ - A metal that is not inside a cofactor can be removed on its model question
133
+ (a nickel from a His-tag purification). Magnesium and calcium are proposed
134
+ nonbonded.
135
+ - The SMILES and net charge of FAD, FMN, SAM, SAH, NAD+, NADH, NADP+ and NADPH
136
+ are proposed, at pH 7, with the protonation stated; each is tested against
137
+ a deposited cofactor.
138
+ - `examples/20_upo_5oxu_heme_glycans.yaml` (an unspecific peroxygenase:
139
+ heme-thiolate, magnesium, N-glycans, additives) and
140
+ `examples/21_prna_fad_halogenase.yaml` (a flavin-dependent halogenase),
141
+ with their depositions. `docs/enzyme_families.md` lists what mdprep does
142
+ with each family of halogenating and dehalogenating enzymes.
143
+ - Refused when the structure is loaded, with the reason: a cofactor bonded to
144
+ the protein that holds a metal (myeloperoxidase's heme), an oxoanion such as
145
+ vanadate, a modified residue with no standard parent, and a declared bond
146
+ between protein residues that is neither a peptide bond nor a disulfide.
147
+
148
+ ### Changed
149
+
150
+ - The spin is asked once, for the QM region. The per-metal multiplicity
151
+ question is gone; the QM region's answer is also the bonded site's
152
+ `ions[].multiplicity` and MCPB model spins.
153
+ - Crystallisation additives are no longer offered one by one as ligands
154
+ unless their removal is declined.
155
+ - The official Colab notebook takes its structure only from the builder's
156
+ bundle. Its predicted-model section (closest X-ray structure, crystal
157
+ waters), the SyrB2 example and the upload of an earlier run's results are
158
+ gone; `mdprep closest-xray` and `mdprep transplant-waters` still bring
159
+ waters across on the command line. It installs every program mdprep runs
160
+ first, before there is a bundle, so the install runs while the builder's
161
+ questions are answered; the MD follows the preparation directly, and the
162
+ investigation of both comes after. Sections, old to new: C to A, D to C,
163
+ F to D, G to F, H to G, I to H, J to I; B and E1-E8 keep their letters.
164
+
165
+ - The protonation of a titratable side chain on a metal is asked right after
166
+ the coordination shell is confirmed, before the spin and the model charge.
167
+ - Proposals carry their own explanation, shown by the builder and the
168
+ `mdprep init --interactive` wizard alike.
169
+
170
+ ### Fixed
171
+
172
+ - A metal-bound cysteine stated as CYM stopped the protonation stage: OpenMM
173
+ calls the thiolate's hydrogen variant CYX. Every cysteine donor -- a zinc
174
+ finger's, a heme's -- reached this.
175
+ - The proposed model charge read a donor's charge from its residue name, so a
176
+ cysteine stated as CYM counted as neutral and an aspartate stated as ASH as
177
+ -1. It now counts the state given, and proposes nothing until it is given.
178
+ - The builder named a residue once per highlighted atom.
179
+ - The ligand bond-order check measured conjugated single bonds against
180
+ saturated lengths, so every amide, amino-heterocycle and flavin looked like
181
+ a wrong tautomer and a SMILES for FAD, NAD or SAM could not be applied.
182
+ - A heme on both a bonded iron and a nonbonded magnesium, as in a
183
+ peroxygenase, was refused for taking its charges from the magnesium's
184
+ non-existent fit.
185
+ - QM/MM refinement stopped on a nonbonded metal or a crystal ion next to the
186
+ QM region; both are MM environment with known parameters.
187
+ - A lysine PropKa made neutral lost a hydrogen's charge in the embedding of
188
+ the xTB histidine comparison: OpenMM names its amine hydrogens HZ1 and HZ2,
189
+ ff14SB's LYN HZ2 and HZ3. The histidines around it were compared beside a
190
+ lysine at -0.39 e, and the report asked for the lysine to be declared as a
191
+ ligand. PrnA's Lys79 reached this: its four histidines keep their states,
192
+ but their HID-HIE gaps moved by 1 to 3 kcal/mol, enough to flip a closer
193
+ call.
194
+ - A vanadate was split into a vanadium and four unbonded oxygens.
195
+ - Replacing a modified residue stopped the run unless
196
+ `structure.repair.add_missing_heavy_atoms` was set: PDBFixer keeps a blank
197
+ insertion code as a space, so the replaced residue's own new atoms counted
198
+ as unrequested. Any replacement in a structure missing nothing else reached
199
+ this, 1CPO's pyroglutamate among them. A chain's terminal OXT, which the
200
+ planner never asks about, stopped such a run too; it is left to tleap.
201
+ - A pyroglutamate replaced by glutamine kept its lactam's CD 1.5 A from its
202
+ own backbone nitrogen. A replaced side chain bonded to its own backbone is
203
+ rebuilt beyond CB from the parent's template, listed under
204
+ `side_chain_rebuilt`, with a warning naming its closest contact.
205
+ - The g-xTB Hessian of a high-spin heme site could fail to converge, or
206
+ converge in whichever of two states the thread count led it to: on 2QFK's
207
+ aquo Fe(III), 27 kcal/mol apart, with Fe-N force constants up to 1.7 times
208
+ different. `mcpb.pyscf.xtb.scf_annealing_kelvin` converges the SCF straight
209
+ and from each hotter temperature listed, single-threaded, and takes the
210
+ Hessian from the lowest; the builder sets it, with `max_scf_iterations:
211
+ 3000`, for every heme site. Examples 19 and 20 carry both. 2QFK itself now
212
+ stops every time at the same place, a negative His-Fe-N angle constant,
213
+ instead of passing or failing by the thread count. See `docs/metals.md`.
214
+ - A Seminario term MCPB.py found negative and wrote as zero was reported only
215
+ as a 0.0 in the frcmod; the error now names it, its atoms and its value.
216
+ - The bond-order check read a porphyrin bond by bond, so 2QFK's heme, refined
217
+ with one pyrrole's beta-beta bond at single-bond length, was refused as a
218
+ wrong tautomer of heme b. A porphyrin's core is skipped like a carboxylate;
219
+ a chlorin's reduced ring is still checked.
220
+
3
221
  ## 0.4.0 - 2026-10-20
4
222
 
5
223
  ### Added
@@ -74,11 +74,17 @@ To cut a release:
74
74
  2. Retitle the changelog's `## Unreleased` section to `## <version> - <date>`.
75
75
  The workflow refuses a tag with no such heading.
76
76
  3. Update the `mdprep[md,qm]==` pin in `examples/*.ipynb` and the assertion in
77
- `tests/test_colab_smoke_notebook.py`. The web builder installs from git
78
- master and needs no bump.
77
+ `tests/test_colab_smoke_notebook.py`.
79
78
  4. Execute the official notebook end to end (below) and fix whatever it
80
79
  finds: it is what students run, and nothing else exercises it whole.
81
80
  5. Merge, then `git tag -a vX.Y.Z` and push the tag.
81
+ 6. **Once the tag has published to PyPI**, raise the release the students'
82
+ tools install: `MDPREP_INSTALL` in `web/app.js` and the `MDPREP_VERSION`
83
+ default in `examples/mdprep_colab.ipynb`. They are pinned so that everyone
84
+ in a workshop installs the same code, and the manifest the builder writes
85
+ is read by the version that wrote it. Doing this after the tag keeps the
86
+ deployed builder from pointing at a release PyPI does not have yet; a test
87
+ checks that the page and the notebook name the same one.
82
88
 
83
89
  The workflow then refuses a tag that does not match the version in the tree,
84
90
  builds, checks that the sdist carries the project and nothing that was lying
@@ -93,16 +99,15 @@ to the Python surface.
93
99
 
94
100
  ### Executing the official notebook outside Colab
95
101
 
96
- `examples/mdprep_colab.ipynb` runs anywhere with a Linux GPU. Its uploads and
102
+ `examples/mdprep_colab.ipynb` runs anywhere with a Linux GPU. Its upload and
97
103
  installs are redirected by environment variables, so a Python with mdprep,
98
- `pymol-open-source-whl`, `py3Dmol`, `pandas`, `matplotlib` and `nbclient`
99
- can execute it against a micromamba runtime built once:
104
+ `py3Dmol`, `pandas`, `matplotlib` and `nbclient` can execute it against a
105
+ micromamba runtime built once:
100
106
 
101
107
  ```bash
102
108
  MDPREP_COLAB_PREFIX=/scratch/colab \
103
109
  MDPREP_SKIP_KERNEL_INSTALL=1 \
104
110
  MDPREP_SPEC=$PWD \
105
- MDPREP_TEST_UPLOAD_MODEL=/path/to/predicted_model.cif \
106
111
  MDPREP_TEST_UPLOAD_BUNDLE=/path/to/mdprep-bundle.zip \
107
112
  python -c "import nbformat; from nbclient import NotebookClient; \
108
113
  nb = nbformat.read('examples/mdprep_colab.ipynb', 4); \
@@ -110,6 +115,6 @@ NotebookClient(nb, timeout=5400).execute(); nbformat.write(nb, 'executed.ipynb')
110
115
  ```
111
116
 
112
117
  `MDPREP_COLAB_PREFIX` stands in for `/content` (micromamba goes in its `bin/`,
113
- the environment in `mamba-root/`), and `MDPREP_TEST_EXAMPLE_DIR=examples`
114
- makes the SyrB2 example read the manifest from the checkout instead of GitHub.
118
+ the environment in `mamba-root/`). The bundle is one the web builder
119
+ downloaded; its SyrB2 button gives one for 2FCT.
115
120
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mdprep
3
- Version: 0.4.0
3
+ Version: 0.5.1
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
@@ -52,7 +52,7 @@ Description-Content-Type: text/markdown
52
52
 
53
53
  # mdprep
54
54
 
55
- `mdprep` 0.4.0 prepares reproducible Amber molecular-dynamics systems from a
55
+ `mdprep` 0.5.1 prepares reproducible Amber molecular-dynamics systems from a
56
56
  PDB structure and a validated YAML manifest. It supports standard proteins,
57
57
  independent ligands and cofactors, explicit metal models, optional active-site
58
58
  QM/MM refinement, final `tleap` assembly, validation, and an optional OpenMM
@@ -71,7 +71,15 @@ recorded in the output reports.
71
71
  - Multiple GAFF or GAFF2 ligands/cofactors with AM1-BCC, user mol2/frcmod,
72
72
  PySCF gas-phase RESP, or electrostatically embedded PySCF QMMESP charges.
73
73
  - Amber nonbonded metal models or bonded MCPB.py models with explicit
74
- coordinating atoms, charges, and multiplicities.
74
+ coordinating atoms, charges, and multiplicities -- including a metal
75
+ deposited inside a cofactor: a cytochrome P450's heme iron, bonded to the
76
+ porphyrin, the cysteine and a water ([docs/metals.md](docs/metals.md#a-metal-inside-a-cofactor-hemes)).
77
+ - Heterogens that are not ligands, read from the file's LINK and MODRES
78
+ records: glycans and crystallisation additives removed on one question
79
+ each, selenomethionine replaced by methionine, and FAD, FMN, SAM and the
80
+ nicotinamides offered with their SMILES and charge
81
+ ([docs/heterogens.md](docs/heterogens.md)). What this means for each family
82
+ of halogenating enzymes is in [docs/enzyme_families.md](docs/enzyme_families.md).
75
83
  - Dimers, trimers, tetramers: every protein chain in one system. Copies of one
76
84
  protein can share parameters -- asked about once, matched residue for
77
85
  residue by sequence and position rather than number, and a bonded metal site
@@ -202,13 +210,15 @@ explicitly request their removal.
202
210
 
203
211
  For a guided workflow, use the [web input builder](https://miqueleg.github.io/mdprep/):
204
212
  it shows the structure in 3D, asks only the questions your structure needs, and
205
- writes a validated manifest and a bundle. Then open the
213
+ writes a validated manifest and a bundle. With no structure of your own, it
214
+ loads SyrB2 (PDB 2FCT) in one click. Then open the
206
215
  [official Colab notebook](https://colab.research.google.com/github/miqueleg/mdprep/blob/master/examples/mdprep_colab.ipynb)
207
- ([`examples/mdprep_colab.ipynb`](examples/mdprep_colab.ipynb)), upload the
208
- bundle, and it installs what the manifest needs, prepares the system,
209
- equilibrates it, and lets you investigate every step: the structure at each
210
- stage, the protonation states, the charge on every atom, the metal site's
211
- force constants, how the box equilibrated, and the MD trajectory.
216
+ ([`examples/mdprep_colab.ipynb`](examples/mdprep_colab.ipynb)): it installs
217
+ the programs mdprep runs while you are still in the builder, and with the
218
+ bundle uploaded it prepares the system, equilibrates it, and lets you
219
+ investigate every step: the structure at each stage, the protonation states,
220
+ the charge on every atom, the metal site's force constants, how the box
221
+ equilibrated, and the MD trajectory.
212
222
 
213
223
  No crystal structure of your protein? Predict the complex with its cofactors
214
224
  (Boltz or AlphaFold3 in ColabFold), then let mdprep find the closest X-ray
@@ -270,6 +280,9 @@ specified in steps in the manifest.
270
280
  | Roe–Brooks OpenMM MD | [Molecular dynamics](docs/molecular_dynamics.md) | `examples/15_roe_brooks_openmm.yaml` |
271
281
  | Predicted models: closest X-ray, crystal waters | [Predicted structures](docs/predicted_structures.md) | `mdprep closest-xray`, `mdprep transplant-waters` |
272
282
  | A water bound to a metal | [Metal centers](docs/metals.md#waters-bound-in-a-metal-site) | `examples/17_syrb2_bound_water_mcpb.yaml` |
283
+ | A heme: cytochrome P450 | [Metal centers](docs/metals.md#a-metal-inside-a-cofactor-hemes) | `examples/19_cyp119_heme_mcpb.yaml` |
284
+ | Glycans, additives, modified residues: a peroxygenase | [Heterogens](docs/heterogens.md) | `examples/20_upo_5oxu_heme_glycans.yaml` |
285
+ | A flavin-dependent halogenase | [Enzyme families](docs/enzyme_families.md) | `examples/21_prna_fad_halogenase.yaml` |
273
286
  | Preparing, running and investigating in Colab | [Colab example notes](examples/README.md) | `examples/mdprep_colab.ipynb` |
274
287
  | Guided Colab builder (legacy) | [Colab example notes](examples/README.md) | `examples/mdprep_interactive_colab.ipynb` |
275
288
  | Complete Fe(III) workflow | [7E07 tutorial](examples/tutorials/7E07_bonded_fe3/README.md) | `examples/tutorials/7E07_bonded_fe3/system.yaml` |
@@ -294,8 +307,11 @@ charge model, protonation, force field, QM method, or metal model.
294
307
 
295
308
  ## Current limitations
296
309
 
297
- mdprep does not support noncanonical amino acids inside peptide chains,
298
- covalent ligands, automatic loop modeling (a missing loop is left as two
310
+ mdprep does not support noncanonical amino acids inside peptide chains
311
+ (a modified residue with a standard parent can be replaced by it), covalent
312
+ ligands (heme c and the bonded hemes of peroxidases among them; glycans and
313
+ other bonded heterogens can only be removed), metal clusters, oxoanions such
314
+ as vanadate, automatic loop modeling (a missing loop is left as two
299
315
  termini), a metal-bound hydroxide, ORCA, Multiwfn, more than one independently
300
316
  fitted bonded MCPB site (copies of one site in an oligomer share a single
301
317
  fit), or a bonded MCPB site bound by two chains. Unsupported chemistry fails
@@ -1,6 +1,6 @@
1
1
  # mdprep
2
2
 
3
- `mdprep` 0.4.0 prepares reproducible Amber molecular-dynamics systems from a
3
+ `mdprep` 0.5.1 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
@@ -19,7 +19,15 @@ recorded in the output reports.
19
19
  - Multiple GAFF or GAFF2 ligands/cofactors with AM1-BCC, user mol2/frcmod,
20
20
  PySCF gas-phase RESP, or electrostatically embedded PySCF QMMESP charges.
21
21
  - Amber nonbonded metal models or bonded MCPB.py models with explicit
22
- coordinating atoms, charges, and multiplicities.
22
+ coordinating atoms, charges, and multiplicities -- including a metal
23
+ deposited inside a cofactor: a cytochrome P450's heme iron, bonded to the
24
+ porphyrin, the cysteine and a water ([docs/metals.md](docs/metals.md#a-metal-inside-a-cofactor-hemes)).
25
+ - Heterogens that are not ligands, read from the file's LINK and MODRES
26
+ records: glycans and crystallisation additives removed on one question
27
+ each, selenomethionine replaced by methionine, and FAD, FMN, SAM and the
28
+ nicotinamides offered with their SMILES and charge
29
+ ([docs/heterogens.md](docs/heterogens.md)). What this means for each family
30
+ of halogenating enzymes is in [docs/enzyme_families.md](docs/enzyme_families.md).
23
31
  - Dimers, trimers, tetramers: every protein chain in one system. Copies of one
24
32
  protein can share parameters -- asked about once, matched residue for
25
33
  residue by sequence and position rather than number, and a bonded metal site
@@ -150,13 +158,15 @@ explicitly request their removal.
150
158
 
151
159
  For a guided workflow, use the [web input builder](https://miqueleg.github.io/mdprep/):
152
160
  it shows the structure in 3D, asks only the questions your structure needs, and
153
- writes a validated manifest and a bundle. Then open the
161
+ writes a validated manifest and a bundle. With no structure of your own, it
162
+ loads SyrB2 (PDB 2FCT) in one click. Then open the
154
163
  [official Colab notebook](https://colab.research.google.com/github/miqueleg/mdprep/blob/master/examples/mdprep_colab.ipynb)
155
- ([`examples/mdprep_colab.ipynb`](examples/mdprep_colab.ipynb)), upload the
156
- bundle, and it installs what the manifest needs, prepares the system,
157
- equilibrates it, and lets you investigate every step: the structure at each
158
- stage, the protonation states, the charge on every atom, the metal site's
159
- force constants, how the box equilibrated, and the MD trajectory.
164
+ ([`examples/mdprep_colab.ipynb`](examples/mdprep_colab.ipynb)): it installs
165
+ the programs mdprep runs while you are still in the builder, and with the
166
+ bundle uploaded it prepares the system, equilibrates it, and lets you
167
+ investigate every step: the structure at each stage, the protonation states,
168
+ the charge on every atom, the metal site's force constants, how the box
169
+ equilibrated, and the MD trajectory.
160
170
 
161
171
  No crystal structure of your protein? Predict the complex with its cofactors
162
172
  (Boltz or AlphaFold3 in ColabFold), then let mdprep find the closest X-ray
@@ -218,6 +228,9 @@ specified in steps in the manifest.
218
228
  | Roe–Brooks OpenMM MD | [Molecular dynamics](docs/molecular_dynamics.md) | `examples/15_roe_brooks_openmm.yaml` |
219
229
  | Predicted models: closest X-ray, crystal waters | [Predicted structures](docs/predicted_structures.md) | `mdprep closest-xray`, `mdprep transplant-waters` |
220
230
  | A water bound to a metal | [Metal centers](docs/metals.md#waters-bound-in-a-metal-site) | `examples/17_syrb2_bound_water_mcpb.yaml` |
231
+ | A heme: cytochrome P450 | [Metal centers](docs/metals.md#a-metal-inside-a-cofactor-hemes) | `examples/19_cyp119_heme_mcpb.yaml` |
232
+ | Glycans, additives, modified residues: a peroxygenase | [Heterogens](docs/heterogens.md) | `examples/20_upo_5oxu_heme_glycans.yaml` |
233
+ | A flavin-dependent halogenase | [Enzyme families](docs/enzyme_families.md) | `examples/21_prna_fad_halogenase.yaml` |
221
234
  | Preparing, running and investigating in Colab | [Colab example notes](examples/README.md) | `examples/mdprep_colab.ipynb` |
222
235
  | Guided Colab builder (legacy) | [Colab example notes](examples/README.md) | `examples/mdprep_interactive_colab.ipynb` |
223
236
  | Complete Fe(III) workflow | [7E07 tutorial](examples/tutorials/7E07_bonded_fe3/README.md) | `examples/tutorials/7E07_bonded_fe3/system.yaml` |
@@ -242,8 +255,11 @@ charge model, protonation, force field, QM method, or metal model.
242
255
 
243
256
  ## Current limitations
244
257
 
245
- mdprep does not support noncanonical amino acids inside peptide chains,
246
- covalent ligands, automatic loop modeling (a missing loop is left as two
258
+ mdprep does not support noncanonical amino acids inside peptide chains
259
+ (a modified residue with a standard parent can be replaced by it), covalent
260
+ ligands (heme c and the bonded hemes of peroxidases among them; glycans and
261
+ other bonded heterogens can only be removed), metal clusters, oxoanions such
262
+ as vanadate, automatic loop modeling (a missing loop is left as two
247
263
  termini), a metal-bound hydroxide, ORCA, Multiwfn, more than one independently
248
264
  fitted bonded MCPB site (copies of one site in an oligomer share a single
249
265
  fit), or a bonded MCPB site bound by two chains. Unsupported chemistry fails
@@ -8,6 +8,8 @@
8
8
  - [Protonation](protonation.md)
9
9
  - [Ligands](ligands.md)
10
10
  - [Metal centers](metals.md)
11
+ - [Heterogens that are not ligands](heterogens.md)
12
+ - [Halogenating and dehalogenating enzymes](enzyme_families.md)
11
13
  - [Dimers, trimers and tetramers](oligomers.md)
12
14
  - [Predicted structures](predicted_structures.md)
13
15
  - [MCPB Hessian-method benchmark](mcpb_xtb_benchmark.md)
@@ -0,0 +1,78 @@
1
+ # Halogenating and Dehalogenating Enzymes
2
+
3
+ Enzymes that put a halogen on a carbon, or take one off, come from a dozen
4
+ families with little chemistry in common: non-heme iron, heme-thiolate and
5
+ heme-histidine centres, vanadate, flavins, SAM, corrinoids and iron-sulfur
6
+ clusters, and several with no cofactor at all. This page lists what mdprep
7
+ does with a representative of each, so that you know before you start whether
8
+ your enzyme is something it prepares, what it will ask, and where it stops.
9
+
10
+ Every representative below was loaded into the planner (`mdprep plan`, the web
11
+ builder and the Colab notebook all use it); the ones marked **prepared** were
12
+ also taken through the whole toolchain to a validated Amber topology.
13
+
14
+ | Family | Representative | What mdprep does |
15
+ | --- | --- | --- |
16
+ | Fe(II)/alpha-ketoglutarate halogenases | SyrB2 (2FCT), BesD (6NIE) | **Prepared.** Bonded Fe(II) site with the chloride and alpha-ketoglutarate in the MCPB model; examples 16-18. |
17
+ | Cytochrome P450 | CYP119 (1IO7) | **Prepared.** The heme's iron is read out into a residue of its own and bonded to the porphyrin, the cysteine thiolate and the water; example 19. |
18
+ | Unspecific peroxygenases (UPO) | AaeUPO (5OXU, 2YOR) | **Prepared.** Heme-thiolate as for a P450; the N-glycans and crystallisation additives removed on two questions; the magnesium on the heme's propionate nonbonded; example 20. |
19
+ | Chloroperoxidase | *C. fumago* CPO (1CPO) | **Prepared.** Heme-thiolate with no water on the iron: five-coordinate high-spin Fe(III), spin 6. 21 sugars (N- and O-linked) removed; the N-terminal pyroglutamate replaced by glutamine, whose side chain is rebuilt and starts close to Ser4 (minimise before anything else); the manganese nonbonded beside the bonded iron, since one bonded site is fitted per preparation. |
20
+ | Dehaloperoxidase | DHP A (2QFK) | **Not prepared.** A globin: heme bonded to the proximal histidine and the distal water, high-spin aquo Fe(III), spin 6; ammonium and sulfate additives removed. g-xTB's SCF for this site has several states, and in the lowest the search finds, one His-Fe-N angle's Seminario force constant is negative: mdprep stops there and names it ([metals.md](metals.md#a-zero-force-constant-is-reported-not-shipped)). |
21
+ | Myeloperoxidase, lactoperoxidase | MPO (1CXP) | **Refused**: the heme is bonded to the protein through three side chains (a covalently attached cofactor). |
22
+ | Vanadium haloperoxidases | *C. inaequalis* VCPO (1IDQ) | **Refused**: vanadate is an oxoanion, not a metal site mdprep can build. |
23
+ | Flavin-dependent halogenases | PrnA (2AR8), RebH (2OA1) | **Prepared** (PrnA). FAD's SMILES and charge (-2) are proposed; the substrate or product is typed in; example 21. RebH's free tryptophan carries the amino acid's name and is offered a rename first. |
24
+ | SAM-dependent fluorinase and chlorinase | FlA (1RQR, 2V7V) | **Prepared** (2V7V). SAM, SAH proposed; 5'-fluoro-5'-deoxyadenosine typed in (`FCC1OC(n2cnc3c(N)ncnc32)C(O)C1O`, charge 0). The active site lies between two subunits: keep all chains. 1RQR's selenomethionines are replaced by methionine on one question, and its free methionine is offered a rename. |
25
+ | Haloalkane dehalogenases | DhaA (4E46), DhlA (2DHC) | **Prepared** (both). No cofactor: 4E46's isopropanol and acetates removed and its chloride kept as a crystal ion; 2DHC's 1,2-dichloroethane typed in as a ligand. |
26
+ | L-2-haloacid dehalogenases | 1ZRN | **Prepared.** The ester intermediate on the catalytic aspartate is a heterogen bonded to the protein: removing it is asked, with nothing proposed; removed, the aspartate is prepared free. |
27
+ | Fluoroacetate dehalogenase | FAcD (3R3U) | **Prepared.** The nickel from the His-tag purification removed on its model question. |
28
+ | Iodotyrosine deiodinase | IYD (4TTB) | **Prepared.** FMN's SMILES and charge (-2) are proposed. FMN sits between the two chains of the dimer: keep both, and chain B's FMN takes chain A's parameters. |
29
+ | Reductive dehalogenases | RdhA (4UR0, 4RAS) | **Refused**: two [4Fe-4S] clusters, which no single metal site describes (as are the [2Fe-2S] clusters of Rieske oxygenases). |
30
+
31
+ ## What a student meets on the way
32
+
33
+ - **Glycans.** Fungal peroxygenases are glycoproteins. Sugars bonded to the
34
+ protein are found from the file's LINK records, or by bond length if it has
35
+ none, and removing them is one question, proposed yes. See
36
+ [heterogens.md](heterogens.md#glycans).
37
+ - **Crystallisation additives.** Glycerol, methanol, sulfate, phosphate, PEG:
38
+ one question, proposed yes, every residue listed. Answer no to be asked
39
+ about each as a ligand.
40
+ - **Modified residues.** Selenomethionine is replaced by methionine on one
41
+ question. Anything else modified is asked with nothing proposed. A
42
+ pyroglutamate (chloroperoxidase's N-terminus) becomes a glutamine whose side
43
+ chain is built afresh and whose N-terminus is charged; the report says how
44
+ close the new side chain starts to its neighbours. See
45
+ [heterogens.md](heterogens.md#modified-residues).
46
+ - **Active sites between chains.** IYD's FMN and the fluorinase's substrate
47
+ are each held by two subunits: chain A alone leaves a third to nearly half
48
+ of the residues around them out, so keep all chains (the default). Copies
49
+ share their parameters ([oligomers.md](oligomers.md)); a ligand the file
50
+ names after the other chain of its site, as 2V7V does one of its three, is
51
+ asked about again, and the same answers serve.
52
+ - **A metal that is not part of the system.** A His-tag nickel, a buffer
53
+ cadmium: the metal's model question offers to remove it.
54
+ - **Magnesium and calcium** are proposed nonbonded.
55
+ - **Organic cofactors.** FAD, FMN, SAM, SAH, NAD+, NADH, NADP+ and NADPH are
56
+ recognised by name and atoms, and their SMILES and charge at pH 7 are
57
+ proposed with the protonation they assume. A reduced flavin (FADH-) is a
58
+ different molecule: change the SMILES and the charge if that is the state you
59
+ simulate.
60
+ - **Two metals and one heme.** In a peroxygenase the heme holds its iron and,
61
+ through a propionate, a magnesium; in chloroperoxidase a manganese. The iron
62
+ is fitted with MCPB.py and the heme's charges come from that fit; the other
63
+ metal stays a nonbonded ion, and the QM/MM refinement of the iron's site
64
+ treats it as part of the MM environment.
65
+ - **The iron's spin.** It is asked, with what usually decides it: the
66
+ chloroperoxidase iron has no water across from its cysteine (five-coordinate,
67
+ high-spin Fe(III), 6), the dehaloperoxidase iron has one across from its
68
+ histidine (high-spin aquo Fe(III), 6), a resting peroxygenase's water makes
69
+ it low-spin (2).
70
+
71
+ ## Where mdprep stops
72
+
73
+ Covalently attached cofactors (heme c, the hemes of myeloperoxidase and
74
+ lactoperoxidase), vanadate and other oxoanions, iron-sulfur clusters,
75
+ corrinoids together with their clusters, modified residues with no standard
76
+ parent, and protein-protein crosslinks other than disulfides are refused when
77
+ the structure is loaded, with the reason. Two metal sites that would each need
78
+ their own MCPB fit are refused at the question that makes them so.
@@ -41,16 +41,40 @@ that. These have no suggested value, and a front end cannot skip them:
41
41
 
42
42
  - **Ligand net charge.** It cannot be read from a PDB file, and a wrong value
43
43
  produces a plausible-looking topology with the wrong electrostatics.
44
+ - **Ligand SMILES**, for every ligand, whether or not the file has hydrogens
45
+ on it: a ligand's protonation comes from its SMILES, and hydrogens the file
46
+ has are compared with it when the system is prepared -- kept if they agree,
47
+ replaced if not. The question says how many the file had. The SMILES of a
48
+ few well-known cofactors is proposed.
44
49
  - **Metal site model and oxidation state.** Neither the residue name nor the
45
50
  element implies an oxidation state. Zn is almost always +2; Fe and Cu are not.
46
51
  - **Removing unknown heterogens.** Normalization must never discard a residue
47
52
  that was not explicitly configured, so the question names every residue at
48
53
  stake.
54
+ - **Removing a heterogen bonded to the protein**, a covalent intermediate for
55
+ instance, and **replacing a modified residue** other than a selenomethionine.
49
56
  - **Production length**, when MD is enabled. There is no sensible default.
50
57
 
51
58
  Free monatomic metals are offered as metal sites, never as GAFF ligands. Bulk
52
59
  counterions are treated as solvent and are not asked about at all.
53
60
 
61
+ ## Heterogens that are not ligands
62
+
63
+ Before the ligands, the planner sorts out the heterogens that are not ones,
64
+ and asks about each group once, with every member listed:
65
+
66
+ - **Modified residues** in a chain -- replace each with its standard parent?
67
+ Proposed yes for selenomethionine; asked without a proposal otherwise.
68
+ - **Glycans** bonded to the protein -- remove them? Proposed yes.
69
+ - **Other heterogens bonded to the protein** -- remove them? No proposal.
70
+ - **Crystallisation additives** -- remove them? Proposed yes. Answer no to be
71
+ asked about each as a ligand.
72
+
73
+ Keeping a group mdprep cannot build stops the build at that question, and
74
+ every removal is written to `structure.remove_residues` with its reason. See
75
+ [heterogens.md](heterogens.md), and [enzyme_families.md](enzyme_families.md)
76
+ for what this means for each family of halogenating enzymes.
77
+
54
78
  ## Metal sites
55
79
 
56
80
  Choosing `bonded_mcpb` proposes a coordination sphere from interatomic
@@ -64,11 +88,34 @@ and the site is reported for manual work rather than invented. The oxidation
64
88
  state, the spin multiplicity and the capped-model charge have no defaults
65
89
  either, because none of them can be read off a structure.
66
90
 
91
+ The spin is asked once, for the QM region: the metal, everything bonded to it
92
+ and the cofactors. One bonded site is fitted per preparation and the cofactors
93
+ in it are closed shell, so that one answer is also the spin of the site's
94
+ MCPB.py models (`ions[].multiplicity`, `mcpb.small_model_spin`,
95
+ `mcpb.large_model_spin`), and the metal is not asked separately. The question
96
+ says what usually decides it: high-spin Fe(II) is 5, high-spin Fe(III) 6,
97
+ Zn(II) 1, and for a heme, the ligands across the heme plane.
98
+
67
99
  A ligand that coordinates the metal takes its charges from that site's MCPB fit
68
100
  rather than an independent AM1-BCC calculation, since fitting a bonded donor
69
101
  separately leaves the site electrostatically inconsistent. A ligand that does
70
102
  not coordinate keeps AM1-BCC.
71
103
 
104
+ A titratable side chain on the metal -- an aspartate, a cysteine -- is asked
105
+ its protonation right after the shell is confirmed, before the model charge. The model charge is then proposed from the states as given:
106
+ a heme's cysteine is named CYS and counts as the thiolate, -1, once it has been
107
+ stated as CYM.
108
+
109
+ A metal deposited inside a cofactor, a heme's iron, is read out into a residue
110
+ of its own, and the porphyrin left behind is a ligand on it. Heme b's SMILES
111
+ and net charge are proposed, with the protonation they assume, and so are
112
+ FAD's, FMN's, SAM's, SAH's and the nicotinamides'; any other ligand's are
113
+ asked. See [metals.md](metals.md#a-metal-inside-a-cofactor-hemes) and
114
+ [ligands.md](ligands.md#cofactors-whose-smiles-is-proposed).
115
+
116
+ Magnesium and calcium are proposed nonbonded, and a metal that is not inside
117
+ a cofactor can be removed instead of modelled -- a nickel from a His-tag, say.
118
+
72
119
  The Hessian defaults to GFN2, which is orders of magnitude cheaper than DFT and
73
120
  is what makes a bonded site tractable outside a cluster; g-xTB and PySCF DFT
74
121
  are offered too. The geometry comes from the QM/MM refinement stage, which is