mdprep 0.2.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 (262) hide show
  1. mdprep-0.2.0/.github/workflows/tests.yml +52 -0
  2. mdprep-0.2.0/.gitignore +18 -0
  3. mdprep-0.2.0/AGENTS.md +80 -0
  4. mdprep-0.2.0/CHANGELOG.md +54 -0
  5. mdprep-0.2.0/CITATION.cff +9 -0
  6. mdprep-0.2.0/CONTRIBUTING.md +58 -0
  7. mdprep-0.2.0/LICENSE +21 -0
  8. mdprep-0.2.0/MANIFEST.in +11 -0
  9. mdprep-0.2.0/PKG-INFO +264 -0
  10. mdprep-0.2.0/README.md +219 -0
  11. mdprep-0.2.0/Roe_and_Brooks.py +41 -0
  12. mdprep-0.2.0/Roe_and_Brooks_corrected.py +587 -0
  13. mdprep-0.2.0/docs/README.md +16 -0
  14. mdprep-0.2.0/docs/developer_notes.md +109 -0
  15. mdprep-0.2.0/docs/installation.md +81 -0
  16. mdprep-0.2.0/docs/ligands.md +48 -0
  17. mdprep-0.2.0/docs/manifest_reference.md +301 -0
  18. mdprep-0.2.0/docs/mcpb_xtb_benchmark.md +380 -0
  19. mdprep-0.2.0/docs/metals.md +531 -0
  20. mdprep-0.2.0/docs/molecular_dynamics.md +78 -0
  21. mdprep-0.2.0/docs/protonation.md +70 -0
  22. mdprep-0.2.0/docs/qmmesp_pyscf.md +107 -0
  23. mdprep-0.2.0/docs/qmmm_refinement.md +340 -0
  24. mdprep-0.2.0/docs/quickstart.md +41 -0
  25. mdprep-0.2.0/docs/tleap_and_validation.md +41 -0
  26. mdprep-0.2.0/docs/troubleshooting.md +108 -0
  27. mdprep-0.2.0/environment-dev.yml +31 -0
  28. mdprep-0.2.0/environment.yml +24 -0
  29. mdprep-0.2.0/examples/00_basic_protein.yaml +47 -0
  30. mdprep-0.2.0/examples/01_protein_only_ff19sb.yaml +54 -0
  31. mdprep-0.2.0/examples/02_manual_catalytic_protonation.yaml +68 -0
  32. mdprep-0.2.0/examples/03_multi_ligand_am1bcc.yaml +78 -0
  33. mdprep-0.2.0/examples/04_qmmesp_pyscf_ligand.yaml +92 -0
  34. mdprep-0.2.0/examples/05_histidine_gxtb_sp.yaml +55 -0
  35. mdprep-0.2.0/examples/06_disulfide_manual.yaml +79 -0
  36. mdprep-0.2.0/examples/07_gas_resp_pyscf_ligand.yaml +89 -0
  37. mdprep-0.2.0/examples/08_nonbonded_zinc_1264.yaml +68 -0
  38. mdprep-0.2.0/examples/09_bonded_zinc_mcpb_prepare.yaml +126 -0
  39. mdprep-0.2.0/examples/10_qmmm_refinement_ash.yaml +77 -0
  40. mdprep-0.2.0/examples/11_qmmm_metal_gfn2_mcpb.yaml +154 -0
  41. mdprep-0.2.0/examples/12_qmmm_metal_mace_polar1_mcpb.yaml +140 -0
  42. mdprep-0.2.0/examples/13_qmmm_refinement_gxtb_mechanical.yaml +77 -0
  43. mdprep-0.2.0/examples/14_qmmm_refinement_mace_polar1_mechanical.yaml +81 -0
  44. mdprep-0.2.0/examples/15_roe_brooks_openmm.yaml +73 -0
  45. mdprep-0.2.0/examples/README.md +28 -0
  46. mdprep-0.2.0/examples/tutorials/7E07.pdb +5271 -0
  47. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/README.md +121 -0
  48. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/input.pdb +2384 -0
  49. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/optimized_small_model.pdb +55 -0
  50. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/reference/large_embedded_cdiis150_restart.chk +0 -0
  51. mdprep-0.2.0/examples/tutorials/7E07_bonded_fe3/system.yaml +239 -0
  52. mdprep-0.2.0/examples/tutorials/7E07_prepared.pdb +2382 -0
  53. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/README.md +15 -0
  54. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/input.pdb +3 -0
  55. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/ligand.frcmod +11 -0
  56. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/ligand.mol2 +11 -0
  57. mdprep-0.2.0/examples/tutorials/minimal_user_mol2/system.yaml +71 -0
  58. mdprep-0.2.0/pyproject.toml +85 -0
  59. mdprep-0.2.0/scripts/run_smoke_tests.sh +17 -0
  60. mdprep-0.2.0/src/mdprep/__init__.py +7 -0
  61. mdprep-0.2.0/src/mdprep/_selftest_data/basic_protein.yaml +33 -0
  62. mdprep-0.2.0/src/mdprep/_selftest_data/ligand_sub.mol2 +11 -0
  63. mdprep-0.2.0/src/mdprep/ambertools/__init__.py +2 -0
  64. mdprep-0.2.0/src/mdprep/ambertools/antechamber.py +110 -0
  65. mdprep-0.2.0/src/mdprep/ambertools/commands.py +33 -0
  66. mdprep-0.2.0/src/mdprep/ambertools/mol2.py +415 -0
  67. mdprep-0.2.0/src/mdprep/ambertools/parmchk2.py +89 -0
  68. mdprep-0.2.0/src/mdprep/ambertools/resp.py +570 -0
  69. mdprep-0.2.0/src/mdprep/charges/__init__.py +1 -0
  70. mdprep-0.2.0/src/mdprep/charges/esp_grid.py +190 -0
  71. mdprep-0.2.0/src/mdprep/cli.py +451 -0
  72. mdprep-0.2.0/src/mdprep/config/__init__.py +9 -0
  73. mdprep-0.2.0/src/mdprep/config/loader.py +146 -0
  74. mdprep-0.2.0/src/mdprep/config/models.py +1100 -0
  75. mdprep-0.2.0/src/mdprep/external/__init__.py +14 -0
  76. mdprep-0.2.0/src/mdprep/external/discovery.py +14 -0
  77. mdprep-0.2.0/src/mdprep/external/runner.py +55 -0
  78. mdprep-0.2.0/src/mdprep/leap/__init__.py +2 -0
  79. mdprep-0.2.0/src/mdprep/leap/builder.py +476 -0
  80. mdprep-0.2.0/src/mdprep/leap/forcefields.py +93 -0
  81. mdprep-0.2.0/src/mdprep/leap/ions.py +112 -0
  82. mdprep-0.2.0/src/mdprep/leap/log_parser.py +170 -0
  83. mdprep-0.2.0/src/mdprep/leap/report.py +99 -0
  84. mdprep-0.2.0/src/mdprep/leap/residues.py +653 -0
  85. mdprep-0.2.0/src/mdprep/leap/runner.py +65 -0
  86. mdprep-0.2.0/src/mdprep/ligands/__init__.py +2 -0
  87. mdprep-0.2.0/src/mdprep/ligands/extract.py +355 -0
  88. mdprep-0.2.0/src/mdprep/ligands/identity.py +39 -0
  89. mdprep-0.2.0/src/mdprep/ligands/pyscf_charges.py +242 -0
  90. mdprep-0.2.0/src/mdprep/ligands/report.py +146 -0
  91. mdprep-0.2.0/src/mdprep/ligands/workflow.py +838 -0
  92. mdprep-0.2.0/src/mdprep/md/__init__.py +5 -0
  93. mdprep-0.2.0/src/mdprep/md/roe_brooks.py +650 -0
  94. mdprep-0.2.0/src/mdprep/metals/__init__.py +2 -0
  95. mdprep-0.2.0/src/mdprep/metals/c4.py +157 -0
  96. mdprep-0.2.0/src/mdprep/metals/coordination.py +313 -0
  97. mdprep-0.2.0/src/mdprep/metals/gxtb_hessian.py +467 -0
  98. mdprep-0.2.0/src/mdprep/metals/hydrogenate.py +344 -0
  99. mdprep-0.2.0/src/mdprep/metals/mace_polar1_hessian.py +357 -0
  100. mdprep-0.2.0/src/mdprep/metals/mace_polar1_worker.py +295 -0
  101. mdprep-0.2.0/src/mdprep/metals/mcpb.py +949 -0
  102. mdprep-0.2.0/src/mdprep/metals/mcpb_compat.py +125 -0
  103. mdprep-0.2.0/src/mdprep/metals/nonbonded.py +294 -0
  104. mdprep-0.2.0/src/mdprep/metals/parameter_comparison.py +563 -0
  105. mdprep-0.2.0/src/mdprep/metals/pyscf_mcpb.py +1388 -0
  106. mdprep-0.2.0/src/mdprep/metals/report.py +119 -0
  107. mdprep-0.2.0/src/mdprep/metals/workflow.py +320 -0
  108. mdprep-0.2.0/src/mdprep/protonation/__init__.py +15 -0
  109. mdprep-0.2.0/src/mdprep/protonation/apply.py +968 -0
  110. mdprep-0.2.0/src/mdprep/protonation/disulfide_states.py +141 -0
  111. mdprep-0.2.0/src/mdprep/protonation/histidine_geometry.py +950 -0
  112. mdprep-0.2.0/src/mdprep/protonation/histidine_xtb.py +390 -0
  113. mdprep-0.2.0/src/mdprep/protonation/overrides.py +64 -0
  114. mdprep-0.2.0/src/mdprep/protonation/pka_rules.py +165 -0
  115. mdprep-0.2.0/src/mdprep/protonation/propka.py +174 -0
  116. mdprep-0.2.0/src/mdprep/protonation/propka_parser.py +140 -0
  117. mdprep-0.2.0/src/mdprep/protonation/report.py +187 -0
  118. mdprep-0.2.0/src/mdprep/protonation/states.py +52 -0
  119. mdprep-0.2.0/src/mdprep/protonation/temporary_hydrogenation.py +238 -0
  120. mdprep-0.2.0/src/mdprep/protonation/xtb_parser.py +79 -0
  121. mdprep-0.2.0/src/mdprep/protonation/xtb_runner.py +108 -0
  122. mdprep-0.2.0/src/mdprep/qm/__init__.py +2 -0
  123. mdprep-0.2.0/src/mdprep/qm/point_charges.py +233 -0
  124. mdprep-0.2.0/src/mdprep/qm/pyscf_esp.py +70 -0
  125. mdprep-0.2.0/src/mdprep/qm/pyscf_runner.py +570 -0
  126. mdprep-0.2.0/src/mdprep/refinement/__init__.py +5 -0
  127. mdprep-0.2.0/src/mdprep/refinement/ash.py +541 -0
  128. mdprep-0.2.0/src/mdprep/refinement/coordinates.py +210 -0
  129. mdprep-0.2.0/src/mdprep/refinement/mapping.py +163 -0
  130. mdprep-0.2.0/src/mdprep/refinement/report.py +66 -0
  131. mdprep-0.2.0/src/mdprep/refinement/selection.py +436 -0
  132. mdprep-0.2.0/src/mdprep/refinement/workflow.py +188 -0
  133. mdprep-0.2.0/src/mdprep/reports/__init__.py +8 -0
  134. mdprep-0.2.0/src/mdprep/reports/structure_report.py +92 -0
  135. mdprep-0.2.0/src/mdprep/structure/__init__.py +14 -0
  136. mdprep-0.2.0/src/mdprep/structure/classify.py +92 -0
  137. mdprep-0.2.0/src/mdprep/structure/disulfides.py +51 -0
  138. mdprep-0.2.0/src/mdprep/structure/inspect.py +105 -0
  139. mdprep-0.2.0/src/mdprep/structure/models.py +86 -0
  140. mdprep-0.2.0/src/mdprep/structure/normalize.py +363 -0
  141. mdprep-0.2.0/src/mdprep/structure/pdb.py +511 -0
  142. mdprep-0.2.0/src/mdprep/structure/repair.py +566 -0
  143. mdprep-0.2.0/src/mdprep/structure/selectors.py +204 -0
  144. mdprep-0.2.0/src/mdprep/structure/writer.py +84 -0
  145. mdprep-0.2.0/src/mdprep/validation/__init__.py +2 -0
  146. mdprep-0.2.0/src/mdprep/validation/openmm_check.py +86 -0
  147. mdprep-0.2.0/src/mdprep/validation/parmed_check.py +43 -0
  148. mdprep-0.2.0/src/mdprep/validation/topology.py +239 -0
  149. mdprep-0.2.0/src/mdprep/workflows/__init__.py +6 -0
  150. mdprep-0.2.0/src/mdprep/workflows/init.py +242 -0
  151. mdprep-0.2.0/src/mdprep/workflows/inspect.py +21 -0
  152. mdprep-0.2.0/src/mdprep/workflows/prepare.py +763 -0
  153. mdprep-0.2.0/src/mdprep/workflows/selftest.py +220 -0
  154. mdprep-0.2.0/src/mdprep/workflows/validate.py +30 -0
  155. mdprep-0.2.0/tests/__init__.py +1 -0
  156. mdprep-0.2.0/tests/data/ligands/ligand_cof.frcmod +11 -0
  157. mdprep-0.2.0/tests/data/ligands/ligand_cof.good.mol2 +11 -0
  158. mdprep-0.2.0/tests/data/ligands/ligand_sub.atom_count_mismatch.mol2 +8 -0
  159. mdprep-0.2.0/tests/data/ligands/ligand_sub.bad_charge.mol2 +11 -0
  160. mdprep-0.2.0/tests/data/ligands/ligand_sub.frcmod +11 -0
  161. mdprep-0.2.0/tests/data/ligands/ligand_sub.good.mol2 +11 -0
  162. mdprep-0.2.0/tests/data/ligands/ligand_sub.pdb +3 -0
  163. mdprep-0.2.0/tests/data/ligands/ligand_sub.renamed.mol2 +11 -0
  164. mdprep-0.2.0/tests/data/ligands/ligand_sub.shifted_coords.mol2 +11 -0
  165. mdprep-0.2.0/tests/data/ligands/ligand_sub.small_residual.mol2 +11 -0
  166. mdprep-0.2.0/tests/data/propka_sample.pka +9 -0
  167. mdprep-0.2.0/tests/data/protein_altloc.pdb +6 -0
  168. mdprep-0.2.0/tests/data/protein_atom_record_ligand_blank_chain.pdb +11 -0
  169. mdprep-0.2.0/tests/data/protein_blank_chain.pdb +6 -0
  170. mdprep-0.2.0/tests/data/protein_cyx_disulfide.pdb +6 -0
  171. mdprep-0.2.0/tests/data/protein_disulfide.pdb +8 -0
  172. mdprep-0.2.0/tests/data/protein_histidine_ring.pdb +19 -0
  173. mdprep-0.2.0/tests/data/protein_histidine_ring_hydrogenated.pdb +17 -0
  174. mdprep-0.2.0/tests/data/protein_histidine_water_oxygen.pdb +18 -0
  175. mdprep-0.2.0/tests/data/protein_histidine_zinc.pdb +20 -0
  176. mdprep-0.2.0/tests/data/protein_insertion_code.pdb +5 -0
  177. mdprep-0.2.0/tests/data/protein_two_ligands.pdb +9 -0
  178. mdprep-0.2.0/tests/data/protein_with_hydrogens.pdb +7 -0
  179. mdprep-0.2.0/tests/data/protein_with_waters.pdb +25 -0
  180. mdprep-0.2.0/tests/data/xtb_hid_stdout.txt +3 -0
  181. mdprep-0.2.0/tests/data/xtb_hie_stdout.txt +3 -0
  182. mdprep-0.2.0/tests/data/zinc_only.pdb +2 -0
  183. mdprep-0.2.0/tests/test_altloc.py +32 -0
  184. mdprep-0.2.0/tests/test_amber_resp.py +131 -0
  185. mdprep-0.2.0/tests/test_ambertools_commands.py +135 -0
  186. mdprep-0.2.0/tests/test_classify.py +63 -0
  187. mdprep-0.2.0/tests/test_cli.py +23 -0
  188. mdprep-0.2.0/tests/test_config_examples.py +12 -0
  189. mdprep-0.2.0/tests/test_config_validation.py +312 -0
  190. mdprep-0.2.0/tests/test_disulfide_assignment.py +76 -0
  191. mdprep-0.2.0/tests/test_disulfide_leap_mapping.py +189 -0
  192. mdprep-0.2.0/tests/test_disulfides.py +25 -0
  193. mdprep-0.2.0/tests/test_esp_grid.py +113 -0
  194. mdprep-0.2.0/tests/test_external_amber_resp.py +54 -0
  195. mdprep-0.2.0/tests/test_external_ambertools.py +106 -0
  196. mdprep-0.2.0/tests/test_external_gxtb_hessian.py +94 -0
  197. mdprep-0.2.0/tests/test_external_mace_polar1.py +52 -0
  198. mdprep-0.2.0/tests/test_external_metals.py +176 -0
  199. mdprep-0.2.0/tests/test_external_propka_xtb.py +98 -0
  200. mdprep-0.2.0/tests/test_external_pyscf.py +323 -0
  201. mdprep-0.2.0/tests/test_external_structure_repair.py +113 -0
  202. mdprep-0.2.0/tests/test_external_tleap.py +101 -0
  203. mdprep-0.2.0/tests/test_gxtb_hessian.py +373 -0
  204. mdprep-0.2.0/tests/test_histidine_geometry.py +252 -0
  205. mdprep-0.2.0/tests/test_import.py +6 -0
  206. mdprep-0.2.0/tests/test_init_cli.py +101 -0
  207. mdprep-0.2.0/tests/test_init_ligand_placeholders.py +36 -0
  208. mdprep-0.2.0/tests/test_inspect_cli.py +29 -0
  209. mdprep-0.2.0/tests/test_ions.py +44 -0
  210. mdprep-0.2.0/tests/test_leap_builder.py +131 -0
  211. mdprep-0.2.0/tests/test_leap_forcefields.py +25 -0
  212. mdprep-0.2.0/tests/test_leap_input_pdb.py +267 -0
  213. mdprep-0.2.0/tests/test_leap_log_parser.py +51 -0
  214. mdprep-0.2.0/tests/test_ligand_extraction.py +282 -0
  215. mdprep-0.2.0/tests/test_ligand_workflow_mocked.py +473 -0
  216. mdprep-0.2.0/tests/test_mace_polar1_hessian.py +296 -0
  217. mdprep-0.2.0/tests/test_manifest_paths.py +71 -0
  218. mdprep-0.2.0/tests/test_manual_protonation.py +115 -0
  219. mdprep-0.2.0/tests/test_mcpb_compat.py +114 -0
  220. mdprep-0.2.0/tests/test_mcpb_parameter_comparison.py +193 -0
  221. mdprep-0.2.0/tests/test_mcpb_pyscf_fixed_geometry.py +390 -0
  222. mdprep-0.2.0/tests/test_md_config.py +85 -0
  223. mdprep-0.2.0/tests/test_metals.py +630 -0
  224. mdprep-0.2.0/tests/test_mol2_parser.py +61 -0
  225. mdprep-0.2.0/tests/test_mol2_validation.py +137 -0
  226. mdprep-0.2.0/tests/test_no_openbabel.py +49 -0
  227. mdprep-0.2.0/tests/test_packaging_metadata.py +15 -0
  228. mdprep-0.2.0/tests/test_pdb_parser.py +114 -0
  229. mdprep-0.2.0/tests/test_pdb_writer.py +55 -0
  230. mdprep-0.2.0/tests/test_pka_rules.py +97 -0
  231. mdprep-0.2.0/tests/test_point_charges.py +137 -0
  232. mdprep-0.2.0/tests/test_prepare_ligands_stage.py +83 -0
  233. mdprep-0.2.0/tests/test_prepare_protonation_stage.py +116 -0
  234. mdprep-0.2.0/tests/test_prepare_pyscf_ligands_stage.py +101 -0
  235. mdprep-0.2.0/tests/test_prepare_refinement_stage.py +143 -0
  236. mdprep-0.2.0/tests/test_prepare_structure_stage.py +76 -0
  237. mdprep-0.2.0/tests/test_prepare_tleap_stage.py +77 -0
  238. mdprep-0.2.0/tests/test_propka_parser.py +77 -0
  239. mdprep-0.2.0/tests/test_protonation_propka_workflow.py +125 -0
  240. mdprep-0.2.0/tests/test_protonation_reuse_refined.py +142 -0
  241. mdprep-0.2.0/tests/test_protonation_states.py +43 -0
  242. mdprep-0.2.0/tests/test_protonation_xtb_workflow.py +435 -0
  243. mdprep-0.2.0/tests/test_pyscf_esp_mocked.py +38 -0
  244. mdprep-0.2.0/tests/test_pyscf_runner_config.py +45 -0
  245. mdprep-0.2.0/tests/test_qmmesp_correctness.py +350 -0
  246. mdprep-0.2.0/tests/test_qmmesp_final_mol2_usage.py +44 -0
  247. mdprep-0.2.0/tests/test_qmmesp_no_environment_fit.py +274 -0
  248. mdprep-0.2.0/tests/test_readme_example.py +19 -0
  249. mdprep-0.2.0/tests/test_refinement_ash.py +330 -0
  250. mdprep-0.2.0/tests/test_refinement_config.py +285 -0
  251. mdprep-0.2.0/tests/test_refinement_coordinates.py +97 -0
  252. mdprep-0.2.0/tests/test_refinement_selection.py +195 -0
  253. mdprep-0.2.0/tests/test_remove_hydrogens.py +79 -0
  254. mdprep-0.2.0/tests/test_roe_brooks.py +58 -0
  255. mdprep-0.2.0/tests/test_selectors.py +115 -0
  256. mdprep-0.2.0/tests/test_selftest_installed.py +15 -0
  257. mdprep-0.2.0/tests/test_structure_normalize.py +203 -0
  258. mdprep-0.2.0/tests/test_tleap_workflow_mocked.py +123 -0
  259. mdprep-0.2.0/tests/test_validation_helpers.py +152 -0
  260. mdprep-0.2.0/tests/test_xtb_command_builder.py +107 -0
  261. mdprep-0.2.0/tests/test_xtb_parser.py +53 -0
  262. mdprep-0.2.0/tests/test_xtb_water_hydrogens.py +209 -0
@@ -0,0 +1,52 @@
1
+ name: tests
2
+
3
+ permissions:
4
+ contents: read
5
+
6
+ on:
7
+ push:
8
+ pull_request:
9
+
10
+ jobs:
11
+ unit:
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ matrix:
15
+ python-version: ["3.11", "3.12"]
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: ${{ matrix.python-version }}
21
+ - name: Install package
22
+ run: |
23
+ python -m pip install --upgrade pip
24
+ python -m pip install -e ".[test]"
25
+ - name: Run unit tests
26
+ run: pytest -q -m "not external and not slow"
27
+ - name: Check CLI
28
+ run: |
29
+ python -m mdprep.cli --help
30
+ python -m mdprep.cli config-check examples/*.yaml
31
+ python -m mdprep.cli selftest --quick
32
+
33
+ package:
34
+ runs-on: ubuntu-latest
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+ - uses: actions/setup-python@v5
38
+ with:
39
+ python-version: "3.11"
40
+ - name: Build distributions
41
+ run: |
42
+ python -m pip install --upgrade pip
43
+ python -m pip install build twine
44
+ python -m build
45
+ python -m twine check dist/*
46
+ - name: Test wheel installation
47
+ run: |
48
+ python -m pip install --force-reinstall dist/*.whl
49
+ cd /tmp
50
+ mdprep --version
51
+ mdprep --help
52
+ mdprep selftest --quick
@@ -0,0 +1,18 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .pytest_cache/
4
+ .mypy_cache/
5
+ .ruff_cache/
6
+ .coverage
7
+ htmlcov/
8
+ build/
9
+ dist/
10
+ *.egg-info/
11
+ prepared/
12
+ runs/
13
+ *.log
14
+ *.out
15
+ *.tmp
16
+ *.tar.gz
17
+ *.tar.gz.sha256
18
+ .DS_Store
mdprep-0.2.0/AGENTS.md ADDED
@@ -0,0 +1,80 @@
1
+ # AGENTS.md
2
+
3
+ You are developing `mdprep`, a Python package for reproducible Amber MD system
4
+ preparation.
5
+
6
+ ## Development Rules
7
+
8
+ - Use Python 3.11+ and type hints.
9
+ - Use pydantic models for YAML manifest validation.
10
+ - The legacy molecule-conversion toolkit identified by the dedicated ban test
11
+ is intentionally prohibited.
12
+ - User overrides always win over automated predictions.
13
+ - Do not silently guess catalytic chemistry, protonation, ligand charge, or
14
+ metal-center behavior.
15
+ - Structure normalization must never delete unknown heterogens silently; require
16
+ explicit manifest configuration.
17
+ - Generated manifests must validate with `mdprep config-check`.
18
+ - Every residue rename must be recorded in reports.
19
+ - Automated protonation must not be silently skipped; fail clearly when a
20
+ requested backend is unavailable or cannot produce an unambiguous assignment.
21
+ - Manual overrides always override PropKa and xTB decisions.
22
+ - PropKa/xTB tests must skip cleanly or use fakes if executables are
23
+ unavailable.
24
+ - Temporary xTB tautomer hydrogens must never be written to the final prepared
25
+ PDB.
26
+ - Ligand atom names, atom order, coordinates, residue identity, and total
27
+ charge must be preserved or failures must be explicit.
28
+ - Do not add molecule-conversion fallback paths.
29
+ - Final topology generation must go through `tleap`.
30
+ - All `tleap` scripts and logs must be preserved.
31
+ - Do not silently ignore `tleap` warnings or errors; report them and fail when
32
+ configured to do so.
33
+ - All final `.prmtop`/`.inpcrd` outputs must be validated.
34
+ - Unsupported chemistry must fail with a clear error.
35
+ - External commands must go through `mdprep.external.runner`.
36
+ - External command records must include command, working directory, return code,
37
+ stdout, stderr, and runtime.
38
+ - Unit tests must not require AmberTools, xTB, PySCF, or PropKa.
39
+ - External tests must skip cleanly if required executables are unavailable.
40
+ - External AmberTools tests must skip cleanly if `antechamber` or `parmchk2`
41
+ is unavailable.
42
+ - External `tleap`, ParmEd, and OpenMM tests must skip cleanly when optional
43
+ executables or libraries are unavailable.
44
+ - PySCF is the primary QM backend for ligand RESP/ESP and QMMESP-like charges.
45
+ - Do not add ORCA or Multiwfn in this task series.
46
+ - RESP/ESP fitting must be deterministic and tested.
47
+ - QMMESP charges must fit only target ligand atom charges.
48
+ - MM point charges are only for density polarization.
49
+ - Never include environment point charges as ligand charge centers.
50
+ - Never write environment point charges into ligand mol2 files.
51
+ - Final Amber builds must use final fitted ligand mol2 files, not provisional
52
+ mol2 files.
53
+ - External PySCF tests must skip cleanly if PySCF is unavailable.
54
+ - All user-facing features need tests and docs.
55
+ - All example YAML files must validate in tests.
56
+
57
+ ## Current v0.2 Limits
58
+
59
+ Do not add new scientific features without a focused task, tests, examples
60
+ where practical, and documentation.
61
+
62
+ Explicitly unsupported for v0.2:
63
+
64
+ - noncanonical amino acids inside peptide chains
65
+ - covalent ligands
66
+ - ORCA backend
67
+ - Multiwfn dependency
68
+ - multiple independent bonded MCPB sites
69
+ - multi-chain MCPB protein inputs
70
+
71
+ ## Required Checks
72
+
73
+ Run these before handing off:
74
+
75
+ ```bash
76
+ pytest -q
77
+ python -m mdprep.cli --help
78
+ python -m mdprep.cli config-check examples/*.yaml
79
+ python -m mdprep.cli selftest --quick
80
+ ```
@@ -0,0 +1,54 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0 - 2026-08-17
4
+
5
+ ### Added
6
+
7
+ - Explicit nonbonded and bonded MCPB.py metal-center workflows, including
8
+ PySCF QMMESP/RESP charges and PySCF, GFN2-xTB, g-xTB, or MACE-POLAR-1
9
+ Hessian sources for Seminario parameters.
10
+ - Optional ASH active-site QM/MM refinement with explicit QM components,
11
+ coordinating residues, 4 A residue and 8 A water active regions, and
12
+ hydrogen-only relaxation.
13
+ - Manifest-driven Roe--Brooks OpenMM minimization, heating, density
14
+ equilibration, and production MD with accelerator-first/CPU-fallback
15
+ platform selection.
16
+ - User-controlled production step and reporting/checkpoint intervals.
17
+ - Manifest-directory-relative input paths and portable executable discovery.
18
+ - GAFF/GAFF2, ff14SB/ff19SB, TIP3P/OPC, AM1-BCC, gas RESP, and embedded
19
+ QMMESP examples covering the supported preparation combinations.
20
+
21
+ ### Fixed
22
+
23
+ - Roe--Brooks positional restraints are installed before Context creation and
24
+ their reference coordinates are converted explicitly from input units to nm.
25
+ - Constraint-compatible heating handoff, evolving NPT box propagation, and
26
+ production progress totals.
27
+ - MCPB/tLEaP residue-index and renamed-residue coordinate validation.
28
+
29
+ ## 0.1.0 - 2026-06-15
30
+
31
+ Initial usable release.
32
+
33
+ ### Added
34
+
35
+ - YAML manifest validation with pydantic.
36
+ - PDB inspection, residue/atom selector parsing, altloc handling, water and heterogen classification, histidine/titratable residue detection, and possible disulfide detection.
37
+ - `mdprep init` starter-manifest generation and safe structure normalization.
38
+ - Manual protonation overrides, input-state preservation, disulfide `CYX` assignment, and input-hydrogen removal.
39
+ - PropKa-based residue-state assignment and xTB/GFN2 or g-xTB HID/HIE histidine tautomer selection.
40
+ - Ligand extraction and AmberTools parameter generation for `am1bcc` and `user_mol2`.
41
+ - PySCF gas-phase RESP/ESP-like ligand charges.
42
+ - PySCF QMMESP-like environment-polarized ligand charges with explicit target-ligand-only fitting.
43
+ - Final `tleap` build, optional solvation, neutralization/salt handling, final Amber files, and validation reports.
44
+ - External tests that skip cleanly when optional executables or libraries are unavailable.
45
+
46
+ ### Unsupported In 0.1.0
47
+
48
+ - Noncanonical amino acids inside polymer chains.
49
+ - Covalent ligands.
50
+ - Bonded metal-center parameterization and MCPB-like workflows.
51
+ - ORCA and Multiwfn backends.
52
+ - mmCIF input.
53
+ - Automatic loop modeling.
54
+ - Production minimization or MD.
@@ -0,0 +1,9 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use mdprep, please cite this software."
3
+ title: "mdprep: reproducible Amber preparation for proteins, ligands, and metal centers"
4
+ version: "0.2.0"
5
+ date-released: "2026-08-17"
6
+ license: "MIT"
7
+ authors:
8
+ - name: "Miquel Estévez-Gay"
9
+ repository-code: "https://github.com/miqueleg/mdprep"
@@ -0,0 +1,58 @@
1
+ # Contributing
2
+
3
+ ## Setup
4
+
5
+ ```bash
6
+ mamba env create -f environment.yml
7
+ conda activate mdprep
8
+ pip install -e .
9
+ mdprep selftest --quick
10
+ ```
11
+
12
+ For packaging and lint tooling, use `environment-dev.yml` or install the
13
+ `dev` extra in a suitable environment.
14
+
15
+ ## Tests
16
+
17
+ Default tests must not require AmberTools, xTB, PropKa, PySCF, ParmEd, or
18
+ OpenMM:
19
+
20
+ ```bash
21
+ pytest -q
22
+ python -m mdprep.cli config-check examples/*.yaml
23
+ python -m mdprep.cli selftest --quick
24
+ ```
25
+
26
+ External tests must skip cleanly when optional tools are unavailable:
27
+
28
+ ```bash
29
+ pytest -q -m "external"
30
+ pytest -q -m "external or ambertools or tleap or propka or xtb or pyscf or qmmesp"
31
+ ```
32
+
33
+ ## Chemistry Rules
34
+
35
+ - The legacy molecule-conversion toolkit identified by the dedicated ban test
36
+ is intentionally prohibited.
37
+ - Do not add molecule-conversion fallbacks.
38
+ - User overrides always win.
39
+ - Do not silently guess catalytic chemistry, ligand charge, protonation, or
40
+ metal-center behavior.
41
+ - Every chemical decision and every residue rename must be reported.
42
+ - Unsupported chemistry must fail with a clear error.
43
+ - External commands must go through `mdprep.external.runner`.
44
+
45
+ ## QMMESP Rules
46
+
47
+ - MM point charges polarize only the selected target ligand QM density.
48
+ - The RESP/ESP fit is performed only on target ligand atoms.
49
+ - Environment point charges must not be fitted.
50
+ - Environment point charges must not be written to ligand mol2 files.
51
+ - The final Amber system must use final PySCF-fitted mol2 charges, not
52
+ provisional charges.
53
+
54
+ ## Adding Features
55
+
56
+ New user-facing features need docs, tests, examples when practical, and clear
57
+ failure behavior for unsupported chemistry. Keep changes local to the relevant
58
+ workflow stage and avoid broad rewrites unless there is a tested reason.
mdprep-0.2.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Miquel Estévez-Gay
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,11 @@
1
+ include README.md
2
+ include AGENTS.md
3
+ include LICENSE
4
+ include CITATION.cff
5
+ include CHANGELOG.md
6
+ include CONTRIBUTING.md
7
+ include environment.yml
8
+ include environment-dev.yml
9
+ recursive-include docs *.md
10
+ recursive-include examples *.md *.yaml *.pdb *.mol2 *.frcmod
11
+ recursive-include tests/data *
mdprep-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,264 @@
1
+ Metadata-Version: 2.5
2
+ Name: mdprep
3
+ Version: 0.2.0
4
+ Summary: Reproducible Amber preparation for proteins, ligands, metal centers, and OpenMM MD.
5
+ Project-URL: Homepage, https://github.com/miqueleg/mdprep
6
+ Project-URL: Issues, https://github.com/miqueleg/mdprep/issues
7
+ Author: Miquel Estévez Gay
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Keywords: amber,ligand,mcpb,metal,molecular-dynamics,openmm,protein,pyscf,qmmm,resp
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
19
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
20
+ Requires-Python: >=3.11
21
+ Requires-Dist: numpy>=1.24
22
+ Requires-Dist: pandas>=2
23
+ Requires-Dist: pydantic-settings>=2
24
+ Requires-Dist: pydantic>=2
25
+ Requires-Dist: pyyaml>=6
26
+ Requires-Dist: rich>=13
27
+ Requires-Dist: scipy>=1.10
28
+ Requires-Dist: typer>=0.12
29
+ Provides-Extra: dev
30
+ Requires-Dist: build>=1; extra == 'dev'
31
+ Requires-Dist: mypy>=1.10; extra == 'dev'
32
+ Requires-Dist: pytest>=8; extra == 'dev'
33
+ Requires-Dist: ruff>=0.6; extra == 'dev'
34
+ Requires-Dist: twine>=5; extra == 'dev'
35
+ Provides-Extra: docs
36
+ Requires-Dist: mkdocs>=1.6; extra == 'docs'
37
+ Provides-Extra: md
38
+ Requires-Dist: openmm>=8.1; extra == 'md'
39
+ Provides-Extra: qm
40
+ Requires-Dist: parmed>=4.2; extra == 'qm'
41
+ Requires-Dist: pyscf>=2.6; extra == 'qm'
42
+ Provides-Extra: test
43
+ Requires-Dist: pytest>=8; extra == 'test'
44
+ Description-Content-Type: text/markdown
45
+
46
+ # mdprep
47
+
48
+ `mdprep` 0.2.0 prepares reproducible Amber molecular-dynamics systems from a
49
+ PDB structure and a validated YAML manifest. It supports standard proteins,
50
+ independent ligands and cofactors, explicit metal models, optional active-site
51
+ QM/MM refinement, final `tleap` assembly, validation, and an optional OpenMM
52
+ equilibration/production stage.
53
+
54
+ The manifest is the source of truth. Chemistry-sensitive decisions—ligand
55
+ charge and multiplicity, catalytic protonation, metal oxidation/spin state,
56
+ coordinating bonds, and QM components—must be supplied explicitly and are
57
+ recorded in the output reports.
58
+
59
+ ## Highlights
60
+
61
+ - ff14SB or ff19SB proteins with TIP3P or OPC water.
62
+ - PropKa protonation, manual catalytic overrides, disulfides, and optional
63
+ GFN2-xTB/g-xTB HID–HIE selection.
64
+ - Multiple GAFF or GAFF2 ligands/cofactors with AM1-BCC, user mol2/frcmod,
65
+ PySCF gas-phase RESP, or electrostatically embedded PySCF QMMESP charges.
66
+ - Amber nonbonded metal models or bonded MCPB.py models with explicit
67
+ coordinating atoms, charges, and multiplicities.
68
+ - MCPB Seminario Hessians from PySCF, GFN2-xTB, g-xTB, or MACE-POLAR-1;
69
+ PySCF supplies the embedded large-model ESP/RESP calculation.
70
+ - Optional ASH/OpenMM active-site QM/MM refinement before final
71
+ parameterization.
72
+ - Final `prmtop`, `inpcrd`, and PDB generation through `tleap`, followed by
73
+ topology, coordinate, charge, and optional OpenMM energy validation.
74
+ - Optional Roe–Brooks OpenMM minimization, heating, density equilibration, and
75
+ manifest-sized production MD with GPU-first/CPU-fallback execution.
76
+
77
+ ## Installation
78
+
79
+ Conda or Mamba is recommended because the real workflows use AmberTools,
80
+ PropKa, xTB, OpenMM, ParmEd, and PySCF:
81
+
82
+ ```bash
83
+ git clone https://github.com/miqueleg/mdprep.git
84
+ cd mdprep
85
+ mamba env create -f environment.yml
86
+ conda activate mdprep
87
+ mdprep selftest --quick
88
+ ```
89
+
90
+ For a lighter Python-only installation, which does not install external
91
+ chemistry executables:
92
+
93
+ ```bash
94
+ python -m pip install .
95
+ ```
96
+
97
+ Optional Python extras are available as `.[md]` for OpenMM and `.[qm]` for
98
+ PySCF/ParmEd. External commands are discovered through `PATH`; manifests may
99
+ also name a reviewed relative executable. No developer-machine path is embedded
100
+ in the distributed examples.
101
+
102
+ ## Basic example
103
+
104
+ Start from a standard protein PDB:
105
+
106
+ ```bash
107
+ mdprep inspect input.pdb
108
+ mdprep init input.pdb -o system.yaml
109
+ ```
110
+
111
+ A minimal protein-only `system.yaml` is:
112
+
113
+ ```yaml
114
+ project:
115
+ name: my_system
116
+ input_structure: input.pdb
117
+ output_dir: prepared/my_system
118
+
119
+ structure:
120
+ keep_crystal_waters: true
121
+ altloc_policy: highest_occupancy
122
+ remove_unknown_heterogens: false
123
+ preserve_chain_ids: true
124
+ remove_input_hydrogens: true
125
+
126
+ protein:
127
+ forcefield: ff14SB
128
+ water_model: TIP3P
129
+
130
+ protonation:
131
+ ph: 7.0
132
+ method: manual_only
133
+ overrides: []
134
+
135
+ disulfides:
136
+ auto_detect: true
137
+ detection_cutoff_angstrom: 2.2
138
+ force: []
139
+ forbid: []
140
+
141
+ ligands: []
142
+ metals: []
143
+
144
+ solvation:
145
+ enabled: true
146
+ box: truncated_octahedron
147
+ buffer_angstrom: 10.0
148
+ neutralize: true
149
+ salt_concentration_molar: 0.15
150
+ positive_ion: Na+
151
+ negative_ion: Cl-
152
+
153
+ validation:
154
+ run_openmm_energy_check: true
155
+ fail_on_warnings: false
156
+ fail_on_missing_parameters: true
157
+ fail_on_noninteger_ligand_charge: true
158
+
159
+ molecular_dynamics:
160
+ enabled: false
161
+ ```
162
+
163
+ The same validated manifest is available as
164
+ [`examples/00_basic_protein.yaml`](examples/00_basic_protein.yaml).
165
+
166
+ Validate and prepare it:
167
+
168
+ ```bash
169
+ mdprep config-check system.yaml
170
+ mdprep prepare system.yaml
171
+ mdprep validate \
172
+ prepared/my_system/final/system.prmtop \
173
+ prepared/my_system/final/system.inpcrd
174
+ ```
175
+
176
+ Relative paths are resolved from the manifest directory. Unknown heterogens
177
+ are not deleted or guessed: configure them under `ligands` or `metals`, or
178
+ explicitly request their removal.
179
+
180
+ ## Common workflows
181
+
182
+ Generate a starter manifest using PropKa and ff19SB/OPC:
183
+
184
+ ```bash
185
+ mdprep init input.pdb -o system.yaml \
186
+ --forcefield ff19SB \
187
+ --water-model OPC \
188
+ --protonation-method propka
189
+ ```
190
+
191
+ Stop after a stage while reviewing a complex system:
192
+
193
+ ```bash
194
+ mdprep prepare system.yaml --stop-after structure
195
+ mdprep prepare system.yaml --stop-after protonation --overwrite
196
+ mdprep prepare system.yaml --stop-after refinement --overwrite
197
+ mdprep prepare system.yaml --stop-after ligands --overwrite
198
+ mdprep prepare system.yaml --stop-after metals --overwrite
199
+ mdprep prepare system.yaml --stop-after tleap --overwrite
200
+ ```
201
+
202
+ Run the manifest-configured Roe–Brooks protocol from an existing Amber build:
203
+
204
+ ```bash
205
+ mdprep run-md system.yaml \
206
+ --prmtop prepared/my_system/final/system.prmtop \
207
+ --inpcrd prepared/my_system/final/system.inpcrd
208
+ ```
209
+
210
+ When `molecular_dynamics.enabled: true`, an ordinary `mdprep prepare` continues
211
+ through MD. Production length and trajectory/state/checkpoint intervals are
212
+ specified in steps in the manifest.
213
+
214
+ ## Where to go next
215
+
216
+ | Task | Documentation | Example |
217
+ | --- | --- | --- |
218
+ | Manifest fields | [Manifest reference](docs/manifest_reference.md) | [All examples](examples/README.md) |
219
+ | Protonation and histidines | [Protonation](docs/protonation.md) | `examples/02_manual_catalytic_protonation.yaml` |
220
+ | 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
+ | Metal centers and MCPB.py | [Metal centers](docs/metals.md) | `examples/08_nonbonded_zinc_1264.yaml`, `09_bonded_zinc_mcpb_prepare.yaml` |
222
+ | Active-site QM/MM refinement | [QM/MM refinement](docs/qmmm_refinement.md) | `examples/10_qmmm_refinement_ash.yaml` |
223
+ | Roe–Brooks OpenMM MD | [Molecular dynamics](docs/molecular_dynamics.md) | `examples/15_roe_brooks_openmm.yaml` |
224
+ | Complete Fe(III) workflow | [7E07 tutorial](examples/tutorials/7E07_bonded_fe3/README.md) | `examples/tutorials/7E07_bonded_fe3/system.yaml` |
225
+
226
+ All public example manifests are schema-validated in the test suite.
227
+
228
+ ## Outputs and reproducibility
229
+
230
+ A complete run preserves:
231
+
232
+ - the input and locked manifests;
233
+ - normalized/protonated/refined intermediate PDBs;
234
+ - ligand, QM, MCPB.py, and `tleap` inputs and logs;
235
+ - final Amber topology, coordinates, and PDB;
236
+ - structure, protonation, ligand, metal, `tleap`, and validation reports;
237
+ - executable and Python-package version information;
238
+ - optional MD PDBs, density history, trajectory, state log, and restarts.
239
+
240
+ External failures are reported with command, working directory, return code,
241
+ stdout, stderr, and runtime. mdprep does not silently fall back to another
242
+ charge model, protonation, force field, QM method, or metal model.
243
+
244
+ ## Current limitations
245
+
246
+ Version 0.2.0 does not support noncanonical amino acids inside peptide chains,
247
+ covalent ligands, mmCIF input, automatic loop modeling, ORCA, Multiwfn,
248
+ multiple independent bonded MCPB sites, or multi-chain MCPB protein inputs.
249
+ Unsupported chemistry fails explicitly.
250
+
251
+ ## Development and release checks
252
+
253
+ ```bash
254
+ mamba env create -f environment-dev.yml
255
+ conda activate mdprep-dev
256
+ pytest -q
257
+ python -m mdprep.cli --help
258
+ python -m mdprep.cli config-check examples/*.yaml
259
+ python -m mdprep.cli selftest --quick
260
+ python -m hatchling build
261
+ ```
262
+
263
+ See [CONTRIBUTING.md](CONTRIBUTING.md), [CHANGELOG.md](CHANGELOG.md), and
264
+ [CITATION.cff](CITATION.cff). mdprep is distributed under the MIT license.