caddforge-docs 0.3.0__py3-none-any.whl

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 (152) hide show
  1. caddforge_docs/__init__.py +1 -0
  2. caddforge_docs/cli.py +20 -0
  3. caddforge_docs/server.py +124 -0
  4. caddforge_docs/site/404.html +2118 -0
  5. caddforge_docs/site/assets/_mkdocstrings.css +237 -0
  6. caddforge_docs/site/assets/images/favicon.png +0 -0
  7. caddforge_docs/site/assets/javascripts/bundle.d7400e89.min.js +16 -0
  8. caddforge_docs/site/assets/javascripts/bundle.d7400e89.min.js.map +7 -0
  9. caddforge_docs/site/assets/javascripts/workers/search.2c215733.min.js +42 -0
  10. caddforge_docs/site/assets/javascripts/workers/search.2c215733.min.js.map +7 -0
  11. caddforge_docs/site/assets/licenses/W3C-Software-and-Document-2015.txt +15 -0
  12. caddforge_docs/site/assets/licenses/autogrid-COPYING-GPL-2.txt +339 -0
  13. caddforge_docs/site/assets/licenses/autogrid-GCC-RUNTIME-COPYING-GPL-3.txt +674 -0
  14. caddforge_docs/site/assets/licenses/autogrid-GCC-RUNTIME-EXCEPTION.txt +73 -0
  15. caddforge_docs/site/assets/licenses/autogrid-GCC-RUNTIME-NOTICE.txt +24 -0
  16. caddforge_docs/site/assets/licenses/caddforge-opencosmors-COPYING.txt +674 -0
  17. caddforge_docs/site/assets/licenses/caddforge-opencosmors-LICENSE.txt +165 -0
  18. caddforge_docs/site/assets/licenses/caddforge-unidock-tools-LICENSE.txt +202 -0
  19. caddforge_docs/site/assets/licenses/clipboard-LICENSE.txt +19 -0
  20. caddforge_docs/site/assets/licenses/escape-html-LICENSE.txt +2 -0
  21. caddforge_docs/site/assets/licenses/focus-visible-LICENSE.txt +4 -0
  22. caddforge_docs/site/assets/licenses/fontawesome-LICENSE.txt +165 -0
  23. caddforge_docs/site/assets/licenses/fuzzaldrin-plus-LICENSE.txt +21 -0
  24. caddforge_docs/site/assets/licenses/lunr-LICENSE.txt +17 -0
  25. caddforge_docs/site/assets/licenses/material-LICENSE.txt +20 -0
  26. caddforge_docs/site/assets/licenses/material-design-color-LICENSE.txt +31 -0
  27. caddforge_docs/site/assets/licenses/material-shadows-LICENSE.txt +31 -0
  28. caddforge_docs/site/assets/licenses/mkdocs-material-LICENSE.txt +19 -0
  29. caddforge_docs/site/assets/licenses/mkdocs-material-extensions-LICENSE.txt +21 -0
  30. caddforge_docs/site/assets/licenses/mkdocs-section-index-LICENSE.txt +21 -0
  31. caddforge_docs/site/assets/licenses/mkdocstrings-LICENSE.txt +15 -0
  32. caddforge_docs/site/assets/licenses/mkdocstrings-python-LICENSE.txt +15 -0
  33. caddforge_docs/site/assets/licenses/octicons-LICENSE.txt +21 -0
  34. caddforge_docs/site/assets/licenses/preact-LICENSE.txt +19 -0
  35. caddforge_docs/site/assets/licenses/properdocs-LICENSE.txt +26 -0
  36. caddforge_docs/site/assets/licenses/pymdown-extensions-LICENSE.txt +113 -0
  37. caddforge_docs/site/assets/licenses/rxjs-LICENSE.txt +180 -0
  38. caddforge_docs/site/assets/licenses/simple-LICENSE.txt +30 -0
  39. caddforge_docs/site/assets/licenses/tiny-emitter-LICENSE.txt +19 -0
  40. caddforge_docs/site/assets/licenses/tslib-LICENSE.txt +12 -0
  41. caddforge_docs/site/assets/licenses/zeno-rocha-components-LICENSE.txt +22 -0
  42. caddforge_docs/site/assets/stylesheets/main.ec1eaa64.min.css +1 -0
  43. caddforge_docs/site/assets/stylesheets/main.ec1eaa64.min.css.map +1 -0
  44. caddforge_docs/site/assets/stylesheets/palette.ab4e12ef.min.css +1 -0
  45. caddforge_docs/site/assets/stylesheets/palette.ab4e12ef.min.css.map +1 -0
  46. caddforge_docs/site/core/cli/index.html +2446 -0
  47. caddforge_docs/site/core/concepts/index.html +2340 -0
  48. caddforge_docs/site/core/configuration/index.html +2300 -0
  49. caddforge_docs/site/core/index.html +2170 -0
  50. caddforge_docs/site/core/jobs-results/index.html +2315 -0
  51. caddforge_docs/site/core/plugins/index.html +2200 -0
  52. caddforge_docs/site/core/slurm/index.html +2562 -0
  53. caddforge_docs/site/development/ci-publishing/index.html +2345 -0
  54. caddforge_docs/site/development/contributing/index.html +2311 -0
  55. caddforge_docs/site/development/documentation/index.html +2380 -0
  56. caddforge_docs/site/development/index.html +2201 -0
  57. caddforge_docs/site/development/release-notes/index.html +2504 -0
  58. caddforge_docs/site/development/release-readiness/index.html +2333 -0
  59. caddforge_docs/site/development/security/index.html +2181 -0
  60. caddforge_docs/site/development/tool-authoring/index.html +2435 -0
  61. caddforge_docs/site/examples/index.html +2465 -0
  62. caddforge_docs/site/examples/manifest.json +158 -0
  63. caddforge_docs/site/examples/minimize/component_overrides.yaml +14 -0
  64. caddforge_docs/site/examples/minimize/ligand_only.yaml +13 -0
  65. caddforge_docs/site/examples/minimize/pipeline_docking.yaml +84 -0
  66. caddforge_docs/site/examples/minimize/pipeline_scatter.yaml +49 -0
  67. caddforge_docs/site/examples/minimize/pocket_free_shell_restrained.yaml +13 -0
  68. caddforge_docs/site/examples/minimize/pocket_restrained.yaml +13 -0
  69. caddforge_docs/site/examples/minimize/prepared_metal.yaml +14 -0
  70. caddforge_docs/site/examples/minimize/sidechains_free_backbone_fixed.yaml +13 -0
  71. caddforge_docs/site/examples/minimize/sidechains_free_backbone_restrained.yaml +13 -0
  72. caddforge_docs/site/examples/pipelines/descriptor-model-and-candidate-filter.yaml +44 -0
  73. caddforge_docs/site/examples/pipelines/dock-extract-and-minimize-poses.yaml +85 -0
  74. caddforge_docs/site/examples/pipelines/docking-screen-and-rescore.yaml +55 -0
  75. caddforge_docs/site/examples/pipelines/flexible-gnina-to-openbpmd-to-md-to-abfe.yaml +189 -0
  76. caddforge_docs/site/examples/pipelines/gnina-flexible-complex-artifacts.yaml +52 -0
  77. caddforge_docs/site/examples/pipelines/minimize-a-multi-pose-sdf.yaml +46 -0
  78. caddforge_docs/site/examples/pipelines/pose-level-md-selection.yaml +95 -0
  79. caddforge_docs/site/examples/pipelines/result-collection-and-diagnostics.yaml +55 -0
  80. caddforge_docs/site/examples/quickstart/diagnostics.yaml +8 -0
  81. caddforge_docs/site/examples/quickstart/index.html +2172 -0
  82. caddforge_docs/site/examples/quickstart/pipeline.yaml +23 -0
  83. caddforge_docs/site/examples/quickstart/run.py +18 -0
  84. caddforge_docs/site/examples/quickstart/run_pipeline.py +6 -0
  85. caddforge_docs/site/examples/quickstart/scores.csv +7 -0
  86. caddforge_docs/site/examples/quickstart/values.csv +31 -0
  87. caddforge_docs/site/examples/run_tool.py +40 -0
  88. caddforge_docs/site/examples/tools/datascience-csv-scatter.yaml +17 -0
  89. caddforge_docs/site/examples/tools/datascience-distribution-diagnostics.yaml +10 -0
  90. caddforge_docs/site/examples/tools/descriptors-ani-conformers.yaml +9 -0
  91. caddforge_docs/site/examples/tools/descriptors-ani-psa.yaml +9 -0
  92. caddforge_docs/site/examples/tools/descriptors-cluster-molecules.yaml +11 -0
  93. caddforge_docs/site/examples/tools/descriptors-phesa.yaml +7 -0
  94. caddforge_docs/site/examples/tools/docking-gnina.yaml +12 -0
  95. caddforge_docs/site/examples/tools/docking-idockya.yaml +8 -0
  96. caddforge_docs/site/examples/tools/docking-unidock.yaml +12 -0
  97. caddforge_docs/site/examples/tools/fep-openfe-abfe.yaml +53 -0
  98. caddforge_docs/site/examples/tools/fep-openfe-rbfe-septop.yaml +23 -0
  99. caddforge_docs/site/examples/tools/md-center-and-align.yaml +16 -0
  100. caddforge_docs/site/examples/tools/md-cluster-representative.yaml +16 -0
  101. caddforge_docs/site/examples/tools/md-extract-frames.yaml +17 -0
  102. caddforge_docs/site/examples/tools/md-fix-structure.yaml +20 -0
  103. caddforge_docs/site/examples/tools/md-grand.yaml +28 -0
  104. caddforge_docs/site/examples/tools/md-inducia.yaml +29 -0
  105. caddforge_docs/site/examples/tools/md-minimize.yaml +13 -0
  106. caddforge_docs/site/examples/tools/md-openbpmd.yaml +11 -0
  107. caddforge_docs/site/examples/tools/md-plain-md.yaml +28 -0
  108. caddforge_docs/site/examples/tools/ml-explore-classifier.yaml +5 -0
  109. caddforge_docs/site/examples/tools/ml-model-factory.yaml +32 -0
  110. caddforge_docs/site/examples/tools/ml-model-zoo.yaml +16 -0
  111. caddforge_docs/site/examples/tools/ml-pca.yaml +10 -0
  112. caddforge_docs/site/examples/tools/ml-simple-gp.yaml +17 -0
  113. caddforge_docs/site/examples/tools/qm-transfer-free-energy.yaml +11 -0
  114. caddforge_docs/site/explanation/references/index.html +2218 -0
  115. caddforge_docs/site/explanation/reproducibility/index.html +2306 -0
  116. caddforge_docs/site/explanation/third-party-notices/index.html +2599 -0
  117. caddforge_docs/site/getting-started/first-pipeline/index.html +2195 -0
  118. caddforge_docs/site/getting-started/first-workflow/index.html +2329 -0
  119. caddforge_docs/site/getting-started/index.html +2200 -0
  120. caddforge_docs/site/getting-started/installation/index.html +2541 -0
  121. caddforge_docs/site/gui/index.html +2267 -0
  122. caddforge_docs/site/gui/plugin-authoring/index.html +2280 -0
  123. caddforge_docs/site/gui/walkthrough/index.html +2181 -0
  124. caddforge_docs/site/how-to/jobs/index.html +2195 -0
  125. caddforge_docs/site/how-to/scatter/index.html +2193 -0
  126. caddforge_docs/site/how-to/troubleshooting/index.html +2429 -0
  127. caddforge_docs/site/index.html +2359 -0
  128. caddforge_docs/site/objects.inv +0 -0
  129. caddforge_docs/site/pipelines/artifacts/index.html +2314 -0
  130. caddforge_docs/site/pipelines/built-ins/index.html +2670 -0
  131. caddforge_docs/site/pipelines/examples/index.html +3186 -0
  132. caddforge_docs/site/pipelines/index.html +2164 -0
  133. caddforge_docs/site/pipelines/specification/index.html +2278 -0
  134. caddforge_docs/site/plugins/datascience/index.html +2405 -0
  135. caddforge_docs/site/plugins/descriptors/index.html +2609 -0
  136. caddforge_docs/site/plugins/docking/index.html +2480 -0
  137. caddforge_docs/site/plugins/fep/index.html +2508 -0
  138. caddforge_docs/site/plugins/index.html +2216 -0
  139. caddforge_docs/site/plugins/md/index.html +3795 -0
  140. caddforge_docs/site/plugins/ml/index.html +2815 -0
  141. caddforge_docs/site/plugins/qm/index.html +2309 -0
  142. caddforge_docs/site/plugins/version-matrix/index.html +2449 -0
  143. caddforge_docs/site/reference/api/index.html +4414 -0
  144. caddforge_docs/site/reference/index.html +2166 -0
  145. caddforge_docs/site/search/search_index.json +1 -0
  146. caddforge_docs/site/sitemap.xml +191 -0
  147. caddforge_docs/site/sitemap.xml.gz +0 -0
  148. caddforge_docs-0.3.0.dist-info/METADATA +158 -0
  149. caddforge_docs-0.3.0.dist-info/RECORD +152 -0
  150. caddforge_docs-0.3.0.dist-info/WHEEL +4 -0
  151. caddforge_docs-0.3.0.dist-info/entry_points.txt +2 -0
  152. caddforge_docs-0.3.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,3795 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en" class="no-js">
4
+ <head>
5
+
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width,initial-scale=1">
8
+
9
+ <meta name="description" content="Central documentation for the CADDForge CADD toolbox framework.">
10
+
11
+
12
+
13
+ <link rel="canonical" href="https://idorsia.github.io/caddforge-docs/plugins/md/">
14
+
15
+
16
+ <link rel="prev" href="../descriptors/">
17
+
18
+
19
+ <link rel="next" href="../fep/">
20
+
21
+
22
+
23
+
24
+
25
+ <link rel="icon" href="../../assets/images/favicon.png">
26
+ <meta name="generator" content="mkdocs-ProperDocs 1.6.7, mkdocs-material-9.7.7">
27
+
28
+
29
+
30
+ <title>MD - CADDForge</title>
31
+
32
+
33
+
34
+ <link rel="stylesheet" href="../../assets/stylesheets/main.ec1eaa64.min.css">
35
+
36
+
37
+ <link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+ <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
51
+
52
+ <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
53
+
54
+
55
+
56
+
57
+
58
+ </head>
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="teal">
69
+
70
+
71
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
72
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
73
+ <label class="md-overlay" for="__drawer"></label>
74
+ <div data-md-component="skip">
75
+
76
+
77
+ <a href="#md-plugin" class="md-skip">
78
+ Skip to content
79
+ </a>
80
+
81
+ </div>
82
+ <div data-md-component="announce">
83
+
84
+ </div>
85
+
86
+
87
+
88
+
89
+
90
+
91
+ <header class="md-header md-header--shadow" data-md-component="header">
92
+ <nav class="md-header__inner md-grid" aria-label="Header">
93
+ <a href="../.." title="CADDForge" class="md-header__button md-logo" aria-label="CADDForge" data-md-component="logo">
94
+
95
+
96
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
97
+
98
+ </a>
99
+ <label class="md-header__button md-icon" for="__drawer">
100
+
101
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
102
+ </label>
103
+ <div class="md-header__title" data-md-component="header-title">
104
+ <div class="md-header__ellipsis">
105
+ <div class="md-header__topic">
106
+ <span class="md-ellipsis">
107
+ CADDForge
108
+ </span>
109
+ </div>
110
+ <div class="md-header__topic" data-md-component="header-topic">
111
+ <span class="md-ellipsis">
112
+
113
+ MD
114
+
115
+ </span>
116
+ </div>
117
+ </div>
118
+ </div>
119
+
120
+
121
+ <form class="md-header__option" data-md-component="palette">
122
+
123
+
124
+
125
+
126
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="teal" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
127
+
128
+ <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
129
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
130
+ </label>
131
+
132
+
133
+
134
+
135
+
136
+ <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="blue" data-md-color-accent="teal" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
137
+
138
+ <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
139
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
140
+ </label>
141
+
142
+
143
+ </form>
144
+
145
+
146
+
147
+ <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
148
+
149
+
150
+
151
+
152
+
153
+ <label class="md-header__button md-icon" for="__search">
154
+
155
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
156
+ </label>
157
+ <div class="md-search" data-md-component="search" role="dialog">
158
+ <label class="md-search__overlay" for="__search"></label>
159
+ <div class="md-search__inner" role="search">
160
+ <form class="md-search__form" name="search">
161
+ <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
162
+ <label class="md-search__icon md-icon" for="__search">
163
+
164
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
165
+
166
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
167
+ </label>
168
+ <nav class="md-search__options" aria-label="Search">
169
+
170
+ <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
171
+
172
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
173
+ </button>
174
+ </nav>
175
+
176
+ <div class="md-search__suggest" data-md-component="search-suggest"></div>
177
+
178
+ </form>
179
+ <div class="md-search__output">
180
+ <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
181
+ <div class="md-search-result" data-md-component="search-result">
182
+ <div class="md-search-result__meta">
183
+ Initializing search
184
+ </div>
185
+ <ol class="md-search-result__list" role="presentation"></ol>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+
192
+
193
+
194
+ <div class="md-header__source">
195
+ <a href="https://github.com/idorsia/caddforge-docs" title="Go to repository" class="md-source" data-md-component="source">
196
+ <div class="md-source__icon md-icon">
197
+
198
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
199
+ </div>
200
+ <div class="md-source__repository">
201
+ caddforge-docs
202
+ </div>
203
+ </a>
204
+ </div>
205
+
206
+ </nav>
207
+
208
+ </header>
209
+
210
+ <div class="md-container" data-md-component="container">
211
+
212
+
213
+
214
+
215
+
216
+
217
+ <main class="md-main" data-md-component="main">
218
+ <div class="md-main__inner md-grid">
219
+
220
+
221
+
222
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
223
+ <div class="md-sidebar__scrollwrap">
224
+ <div class="md-sidebar__inner">
225
+
226
+
227
+
228
+
229
+ <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
230
+ <label class="md-nav__title" for="__drawer">
231
+ <a href="../.." title="CADDForge" class="md-nav__button md-logo" aria-label="CADDForge" data-md-component="logo">
232
+
233
+
234
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
235
+
236
+ </a>
237
+ CADDForge
238
+ </label>
239
+
240
+ <div class="md-nav__source">
241
+ <a href="https://github.com/idorsia/caddforge-docs" title="Go to repository" class="md-source" data-md-component="source">
242
+ <div class="md-source__icon md-icon">
243
+
244
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
245
+ </div>
246
+ <div class="md-source__repository">
247
+ caddforge-docs
248
+ </div>
249
+ </a>
250
+ </div>
251
+
252
+ <ul class="md-nav__list" data-md-scrollfix>
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+ <li class="md-nav__item">
261
+ <a href="../.." class="md-nav__link">
262
+
263
+
264
+
265
+ <span class="md-ellipsis">
266
+
267
+
268
+ Home
269
+
270
+
271
+
272
+ </span>
273
+
274
+
275
+
276
+ </a>
277
+ </li>
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+
304
+
305
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
306
+
307
+
308
+
309
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
310
+
311
+
312
+ <div class="md-nav__link md-nav__container">
313
+ <a href="../../getting-started/" class="md-nav__link ">
314
+
315
+
316
+
317
+ <span class="md-ellipsis">
318
+
319
+
320
+ Getting Started
321
+
322
+
323
+
324
+ </span>
325
+
326
+
327
+
328
+ </a>
329
+
330
+
331
+ <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
332
+ <span class="md-nav__icon md-icon"></span>
333
+ </label>
334
+
335
+ </div>
336
+
337
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
338
+ <label class="md-nav__title" for="__nav_2">
339
+ <span class="md-nav__icon md-icon"></span>
340
+
341
+
342
+ Getting Started
343
+
344
+
345
+ </label>
346
+ <ul class="md-nav__list" data-md-scrollfix>
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+ <li class="md-nav__item">
355
+ <a href="../../getting-started/installation/" class="md-nav__link">
356
+
357
+
358
+
359
+ <span class="md-ellipsis">
360
+
361
+
362
+ Installation
363
+
364
+
365
+
366
+ </span>
367
+
368
+
369
+
370
+ </a>
371
+ </li>
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+ <li class="md-nav__item">
383
+ <a href="../../getting-started/first-workflow/" class="md-nav__link">
384
+
385
+
386
+
387
+ <span class="md-ellipsis">
388
+
389
+
390
+ First Workflow
391
+
392
+
393
+
394
+ </span>
395
+
396
+
397
+
398
+ </a>
399
+ </li>
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+
410
+ <li class="md-nav__item">
411
+ <a href="../../getting-started/first-pipeline/" class="md-nav__link">
412
+
413
+
414
+
415
+ <span class="md-ellipsis">
416
+
417
+
418
+ First Pipeline
419
+
420
+
421
+
422
+ </span>
423
+
424
+
425
+
426
+ </a>
427
+ </li>
428
+
429
+
430
+
431
+
432
+ </ul>
433
+ </nav>
434
+
435
+ </li>
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+
451
+
452
+
453
+
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
464
+
465
+
466
+
467
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
468
+
469
+
470
+ <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
471
+
472
+
473
+
474
+ <span class="md-ellipsis">
475
+
476
+
477
+ How-to Guides
478
+
479
+
480
+
481
+ </span>
482
+
483
+
484
+
485
+ <span class="md-nav__icon md-icon"></span>
486
+ </label>
487
+
488
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
489
+ <label class="md-nav__title" for="__nav_3">
490
+ <span class="md-nav__icon md-icon"></span>
491
+
492
+
493
+ How-to Guides
494
+
495
+
496
+ </label>
497
+ <ul class="md-nav__list" data-md-scrollfix>
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+ <li class="md-nav__item">
506
+ <a href="../../how-to/jobs/" class="md-nav__link">
507
+
508
+
509
+
510
+ <span class="md-ellipsis">
511
+
512
+
513
+ Jobs and Results
514
+
515
+
516
+
517
+ </span>
518
+
519
+
520
+
521
+ </a>
522
+ </li>
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+ <li class="md-nav__item">
534
+ <a href="../../how-to/scatter/" class="md-nav__link">
535
+
536
+
537
+
538
+ <span class="md-ellipsis">
539
+
540
+
541
+ Scatter and Reduce
542
+
543
+
544
+
545
+ </span>
546
+
547
+
548
+
549
+ </a>
550
+ </li>
551
+
552
+
553
+
554
+
555
+
556
+
557
+
558
+
559
+
560
+
561
+ <li class="md-nav__item">
562
+ <a href="../../how-to/troubleshooting/" class="md-nav__link">
563
+
564
+
565
+
566
+ <span class="md-ellipsis">
567
+
568
+
569
+ Troubleshooting
570
+
571
+
572
+
573
+ </span>
574
+
575
+
576
+
577
+ </a>
578
+ </li>
579
+
580
+
581
+
582
+
583
+ </ul>
584
+ </nav>
585
+
586
+ </li>
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+
612
+
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
621
+
622
+
623
+
624
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
625
+
626
+
627
+ <div class="md-nav__link md-nav__container">
628
+ <a href="../../core/" class="md-nav__link ">
629
+
630
+
631
+
632
+ <span class="md-ellipsis">
633
+
634
+
635
+ Core
636
+
637
+
638
+
639
+ </span>
640
+
641
+
642
+
643
+ </a>
644
+
645
+
646
+ <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
647
+ <span class="md-nav__icon md-icon"></span>
648
+ </label>
649
+
650
+ </div>
651
+
652
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
653
+ <label class="md-nav__title" for="__nav_4">
654
+ <span class="md-nav__icon md-icon"></span>
655
+
656
+
657
+ Core
658
+
659
+
660
+ </label>
661
+ <ul class="md-nav__list" data-md-scrollfix>
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+ <li class="md-nav__item">
670
+ <a href="../../core/concepts/" class="md-nav__link">
671
+
672
+
673
+
674
+ <span class="md-ellipsis">
675
+
676
+
677
+ Concepts
678
+
679
+
680
+
681
+ </span>
682
+
683
+
684
+
685
+ </a>
686
+ </li>
687
+
688
+
689
+
690
+
691
+
692
+
693
+
694
+
695
+
696
+
697
+ <li class="md-nav__item">
698
+ <a href="../../core/configuration/" class="md-nav__link">
699
+
700
+
701
+
702
+ <span class="md-ellipsis">
703
+
704
+
705
+ Configuration
706
+
707
+
708
+
709
+ </span>
710
+
711
+
712
+
713
+ </a>
714
+ </li>
715
+
716
+
717
+
718
+
719
+
720
+
721
+
722
+
723
+
724
+
725
+ <li class="md-nav__item">
726
+ <a href="../../core/cli/" class="md-nav__link">
727
+
728
+
729
+
730
+ <span class="md-ellipsis">
731
+
732
+
733
+ CLI
734
+
735
+
736
+
737
+ </span>
738
+
739
+
740
+
741
+ </a>
742
+ </li>
743
+
744
+
745
+
746
+
747
+
748
+
749
+
750
+
751
+
752
+
753
+ <li class="md-nav__item">
754
+ <a href="../../core/jobs-results/" class="md-nav__link">
755
+
756
+
757
+
758
+ <span class="md-ellipsis">
759
+
760
+
761
+ Jobs and Results
762
+
763
+
764
+
765
+ </span>
766
+
767
+
768
+
769
+ </a>
770
+ </li>
771
+
772
+
773
+
774
+
775
+
776
+
777
+
778
+
779
+
780
+
781
+ <li class="md-nav__item">
782
+ <a href="../../core/slurm/" class="md-nav__link">
783
+
784
+
785
+
786
+ <span class="md-ellipsis">
787
+
788
+
789
+ Slurm Backend
790
+
791
+
792
+
793
+ </span>
794
+
795
+
796
+
797
+ </a>
798
+ </li>
799
+
800
+
801
+
802
+
803
+
804
+
805
+
806
+
807
+
808
+
809
+ <li class="md-nav__item">
810
+ <a href="../../core/plugins/" class="md-nav__link">
811
+
812
+
813
+
814
+ <span class="md-ellipsis">
815
+
816
+
817
+ Plugins
818
+
819
+
820
+
821
+ </span>
822
+
823
+
824
+
825
+ </a>
826
+ </li>
827
+
828
+
829
+
830
+
831
+ </ul>
832
+ </nav>
833
+
834
+ </li>
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+
850
+
851
+
852
+
853
+
854
+
855
+
856
+
857
+
858
+
859
+
860
+
861
+
862
+
863
+
864
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
865
+
866
+
867
+
868
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
869
+
870
+
871
+ <div class="md-nav__link md-nav__container">
872
+ <a href="../../pipelines/" class="md-nav__link ">
873
+
874
+
875
+
876
+ <span class="md-ellipsis">
877
+
878
+
879
+ Pipelines
880
+
881
+
882
+
883
+ </span>
884
+
885
+
886
+
887
+ </a>
888
+
889
+
890
+ <label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
891
+ <span class="md-nav__icon md-icon"></span>
892
+ </label>
893
+
894
+ </div>
895
+
896
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
897
+ <label class="md-nav__title" for="__nav_5">
898
+ <span class="md-nav__icon md-icon"></span>
899
+
900
+
901
+ Pipelines
902
+
903
+
904
+ </label>
905
+ <ul class="md-nav__list" data-md-scrollfix>
906
+
907
+
908
+
909
+
910
+
911
+
912
+
913
+ <li class="md-nav__item">
914
+ <a href="../../pipelines/specification/" class="md-nav__link">
915
+
916
+
917
+
918
+ <span class="md-ellipsis">
919
+
920
+
921
+ Specification
922
+
923
+
924
+
925
+ </span>
926
+
927
+
928
+
929
+ </a>
930
+ </li>
931
+
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+
940
+
941
+ <li class="md-nav__item">
942
+ <a href="../../pipelines/artifacts/" class="md-nav__link">
943
+
944
+
945
+
946
+ <span class="md-ellipsis">
947
+
948
+
949
+ Artifacts
950
+
951
+
952
+
953
+ </span>
954
+
955
+
956
+
957
+ </a>
958
+ </li>
959
+
960
+
961
+
962
+
963
+
964
+
965
+
966
+
967
+
968
+
969
+ <li class="md-nav__item">
970
+ <a href="../../pipelines/built-ins/" class="md-nav__link">
971
+
972
+
973
+
974
+ <span class="md-ellipsis">
975
+
976
+
977
+ Built-in Stages
978
+
979
+
980
+
981
+ </span>
982
+
983
+
984
+
985
+ </a>
986
+ </li>
987
+
988
+
989
+
990
+
991
+
992
+
993
+
994
+
995
+
996
+
997
+ <li class="md-nav__item">
998
+ <a href="../../pipelines/examples/" class="md-nav__link">
999
+
1000
+
1001
+
1002
+ <span class="md-ellipsis">
1003
+
1004
+
1005
+ Examples
1006
+
1007
+
1008
+
1009
+ </span>
1010
+
1011
+
1012
+
1013
+ </a>
1014
+ </li>
1015
+
1016
+
1017
+
1018
+
1019
+ </ul>
1020
+ </nav>
1021
+
1022
+ </li>
1023
+
1024
+
1025
+
1026
+
1027
+
1028
+
1029
+
1030
+
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+
1051
+
1052
+
1053
+
1054
+
1055
+
1056
+
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+ <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
1063
+
1064
+
1065
+
1066
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
1067
+
1068
+
1069
+ <div class="md-nav__link md-nav__container">
1070
+ <a href="../" class="md-nav__link ">
1071
+
1072
+
1073
+
1074
+ <span class="md-ellipsis">
1075
+
1076
+
1077
+ Plugins
1078
+
1079
+
1080
+
1081
+ </span>
1082
+
1083
+
1084
+
1085
+ </a>
1086
+
1087
+
1088
+ <label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
1089
+ <span class="md-nav__icon md-icon"></span>
1090
+ </label>
1091
+
1092
+ </div>
1093
+
1094
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
1095
+ <label class="md-nav__title" for="__nav_6">
1096
+ <span class="md-nav__icon md-icon"></span>
1097
+
1098
+
1099
+ Plugins
1100
+
1101
+
1102
+ </label>
1103
+ <ul class="md-nav__list" data-md-scrollfix>
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+
1110
+
1111
+ <li class="md-nav__item">
1112
+ <a href="../version-matrix/" class="md-nav__link">
1113
+
1114
+
1115
+
1116
+ <span class="md-ellipsis">
1117
+
1118
+
1119
+ Version Matrix
1120
+
1121
+
1122
+
1123
+ </span>
1124
+
1125
+
1126
+
1127
+ </a>
1128
+ </li>
1129
+
1130
+
1131
+
1132
+
1133
+
1134
+
1135
+
1136
+
1137
+
1138
+
1139
+ <li class="md-nav__item">
1140
+ <a href="../docking/" class="md-nav__link">
1141
+
1142
+
1143
+
1144
+ <span class="md-ellipsis">
1145
+
1146
+
1147
+ Docking
1148
+
1149
+
1150
+
1151
+ </span>
1152
+
1153
+
1154
+
1155
+ </a>
1156
+ </li>
1157
+
1158
+
1159
+
1160
+
1161
+
1162
+
1163
+
1164
+
1165
+
1166
+
1167
+ <li class="md-nav__item">
1168
+ <a href="../descriptors/" class="md-nav__link">
1169
+
1170
+
1171
+
1172
+ <span class="md-ellipsis">
1173
+
1174
+
1175
+ Descriptors
1176
+
1177
+
1178
+
1179
+ </span>
1180
+
1181
+
1182
+
1183
+ </a>
1184
+ </li>
1185
+
1186
+
1187
+
1188
+
1189
+
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+ <li class="md-nav__item md-nav__item--active">
1198
+
1199
+ <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+ <label class="md-nav__link md-nav__link--active" for="__toc">
1206
+
1207
+
1208
+
1209
+ <span class="md-ellipsis">
1210
+
1211
+
1212
+ MD
1213
+
1214
+
1215
+
1216
+ </span>
1217
+
1218
+
1219
+
1220
+ <span class="md-nav__icon md-icon"></span>
1221
+ </label>
1222
+
1223
+ <a href="./" class="md-nav__link md-nav__link--active">
1224
+
1225
+
1226
+
1227
+ <span class="md-ellipsis">
1228
+
1229
+
1230
+ MD
1231
+
1232
+
1233
+
1234
+ </span>
1235
+
1236
+
1237
+
1238
+ </a>
1239
+
1240
+
1241
+
1242
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
1243
+
1244
+
1245
+
1246
+
1247
+
1248
+
1249
+ <label class="md-nav__title" for="__toc">
1250
+ <span class="md-nav__icon md-icon"></span>
1251
+ Table of contents
1252
+ </label>
1253
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
1254
+
1255
+ <li class="md-nav__item">
1256
+ <a href="#requirements-and-example-status" class="md-nav__link">
1257
+ <span class="md-ellipsis">
1258
+
1259
+ Requirements and example status
1260
+
1261
+ </span>
1262
+ </a>
1263
+
1264
+ </li>
1265
+
1266
+ <li class="md-nav__item">
1267
+ <a href="#fix-structure" class="md-nav__link">
1268
+ <span class="md-ellipsis">
1269
+
1270
+ fix-structure
1271
+
1272
+ </span>
1273
+ </a>
1274
+
1275
+ <nav class="md-nav" aria-label="fix-structure">
1276
+ <ul class="md-nav__list">
1277
+
1278
+ <li class="md-nav__item">
1279
+ <a href="#terminal-chemistry" class="md-nav__link">
1280
+ <span class="md-ellipsis">
1281
+
1282
+ Terminal chemistry
1283
+
1284
+ </span>
1285
+ </a>
1286
+
1287
+ </li>
1288
+
1289
+ <li class="md-nav__item">
1290
+ <a href="#pipeline-example" class="md-nav__link">
1291
+ <span class="md-ellipsis">
1292
+
1293
+ Pipeline example
1294
+
1295
+ </span>
1296
+ </a>
1297
+
1298
+ </li>
1299
+
1300
+ </ul>
1301
+ </nav>
1302
+
1303
+ </li>
1304
+
1305
+ <li class="md-nav__item">
1306
+ <a href="#center-and-align" class="md-nav__link">
1307
+ <span class="md-ellipsis">
1308
+
1309
+ center-and-align
1310
+
1311
+ </span>
1312
+ </a>
1313
+
1314
+ </li>
1315
+
1316
+ <li class="md-nav__item">
1317
+ <a href="#extract-frames" class="md-nav__link">
1318
+ <span class="md-ellipsis">
1319
+
1320
+ extract-frames
1321
+
1322
+ </span>
1323
+ </a>
1324
+
1325
+ </li>
1326
+
1327
+ <li class="md-nav__item">
1328
+ <a href="#cluster-representative" class="md-nav__link">
1329
+ <span class="md-ellipsis">
1330
+
1331
+ cluster-representative
1332
+
1333
+ </span>
1334
+ </a>
1335
+
1336
+ </li>
1337
+
1338
+ <li class="md-nav__item">
1339
+ <a href="#plain-md" class="md-nav__link">
1340
+ <span class="md-ellipsis">
1341
+
1342
+ plain-md
1343
+
1344
+ </span>
1345
+ </a>
1346
+
1347
+ </li>
1348
+
1349
+ <li class="md-nav__item">
1350
+ <a href="#minimize" class="md-nav__link">
1351
+ <span class="md-ellipsis">
1352
+
1353
+ minimize
1354
+
1355
+ </span>
1356
+ </a>
1357
+
1358
+ <nav class="md-nav" aria-label="minimize">
1359
+ <ul class="md-nav__list">
1360
+
1361
+ <li class="md-nav__item">
1362
+ <a href="#minimize-installation-and-execution" class="md-nav__link">
1363
+ <span class="md-ellipsis">
1364
+
1365
+ Minimize installation and execution
1366
+
1367
+ </span>
1368
+ </a>
1369
+
1370
+ </li>
1371
+
1372
+ <li class="md-nav__item">
1373
+ <a href="#minimize-inputs-and-physical-model" class="md-nav__link">
1374
+ <span class="md-ellipsis">
1375
+
1376
+ Minimize inputs and physical model
1377
+
1378
+ </span>
1379
+ </a>
1380
+
1381
+ </li>
1382
+
1383
+ <li class="md-nav__item">
1384
+ <a href="#minimize-regions-and-modes" class="md-nav__link">
1385
+ <span class="md-ellipsis">
1386
+
1387
+ Minimize regions and modes
1388
+
1389
+ </span>
1390
+ </a>
1391
+
1392
+ </li>
1393
+
1394
+ <li class="md-nav__item">
1395
+ <a href="#minimize-convergence-diagnostics-and-quality" class="md-nav__link">
1396
+ <span class="md-ellipsis">
1397
+
1398
+ Minimize convergence, diagnostics, and quality
1399
+
1400
+ </span>
1401
+ </a>
1402
+
1403
+ </li>
1404
+
1405
+ <li class="md-nav__item">
1406
+ <a href="#minimize-artifacts-and-pipelines" class="md-nav__link">
1407
+ <span class="md-ellipsis">
1408
+
1409
+ Minimize artifacts and pipelines
1410
+
1411
+ </span>
1412
+ </a>
1413
+
1414
+ </li>
1415
+
1416
+ </ul>
1417
+ </nav>
1418
+
1419
+ </li>
1420
+
1421
+ <li class="md-nav__item">
1422
+ <a href="#openbpmd" class="md-nav__link">
1423
+ <span class="md-ellipsis">
1424
+
1425
+ openbpmd
1426
+
1427
+ </span>
1428
+ </a>
1429
+
1430
+ </li>
1431
+
1432
+ <li class="md-nav__item">
1433
+ <a href="#grand" class="md-nav__link">
1434
+ <span class="md-ellipsis">
1435
+
1436
+ grand
1437
+
1438
+ </span>
1439
+ </a>
1440
+
1441
+ <nav class="md-nav" aria-label="grand">
1442
+ <ul class="md-nav__list">
1443
+
1444
+ <li class="md-nav__item">
1445
+ <a href="#configuration-options" class="md-nav__link">
1446
+ <span class="md-ellipsis">
1447
+
1448
+ Configuration options
1449
+
1450
+ </span>
1451
+ </a>
1452
+
1453
+ </li>
1454
+
1455
+ <li class="md-nav__item">
1456
+ <a href="#slurm-scratch-execution" class="md-nav__link">
1457
+ <span class="md-ellipsis">
1458
+
1459
+ Slurm scratch execution
1460
+
1461
+ </span>
1462
+ </a>
1463
+
1464
+ </li>
1465
+
1466
+ <li class="md-nav__item">
1467
+ <a href="#log-syncing" class="md-nav__link">
1468
+ <span class="md-ellipsis">
1469
+
1470
+ Log syncing
1471
+
1472
+ </span>
1473
+ </a>
1474
+
1475
+ </li>
1476
+
1477
+ <li class="md-nav__item">
1478
+ <a href="#outputs" class="md-nav__link">
1479
+ <span class="md-ellipsis">
1480
+
1481
+ Outputs
1482
+
1483
+ </span>
1484
+ </a>
1485
+
1486
+ </li>
1487
+
1488
+ </ul>
1489
+ </nav>
1490
+
1491
+ </li>
1492
+
1493
+ <li class="md-nav__item">
1494
+ <a href="#compressed-inputs" class="md-nav__link">
1495
+ <span class="md-ellipsis">
1496
+
1497
+ Compressed inputs
1498
+
1499
+ </span>
1500
+ </a>
1501
+
1502
+ </li>
1503
+
1504
+ <li class="md-nav__item">
1505
+ <a href="#inducia" class="md-nav__link">
1506
+ <span class="md-ellipsis">
1507
+
1508
+ inducia
1509
+
1510
+ </span>
1511
+ </a>
1512
+
1513
+ </li>
1514
+
1515
+ </ul>
1516
+
1517
+ </nav>
1518
+
1519
+ </li>
1520
+
1521
+
1522
+
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+
1529
+
1530
+ <li class="md-nav__item">
1531
+ <a href="../fep/" class="md-nav__link">
1532
+
1533
+
1534
+
1535
+ <span class="md-ellipsis">
1536
+
1537
+
1538
+ FEP
1539
+
1540
+
1541
+
1542
+ </span>
1543
+
1544
+
1545
+
1546
+ </a>
1547
+ </li>
1548
+
1549
+
1550
+
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+ <li class="md-nav__item">
1559
+ <a href="../qm/" class="md-nav__link">
1560
+
1561
+
1562
+
1563
+ <span class="md-ellipsis">
1564
+
1565
+
1566
+ QM
1567
+
1568
+
1569
+
1570
+ </span>
1571
+
1572
+
1573
+
1574
+ </a>
1575
+ </li>
1576
+
1577
+
1578
+
1579
+
1580
+
1581
+
1582
+
1583
+
1584
+
1585
+
1586
+ <li class="md-nav__item">
1587
+ <a href="../ml/" class="md-nav__link">
1588
+
1589
+
1590
+
1591
+ <span class="md-ellipsis">
1592
+
1593
+
1594
+ ML
1595
+
1596
+
1597
+
1598
+ </span>
1599
+
1600
+
1601
+
1602
+ </a>
1603
+ </li>
1604
+
1605
+
1606
+
1607
+
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+ <li class="md-nav__item">
1615
+ <a href="../datascience/" class="md-nav__link">
1616
+
1617
+
1618
+
1619
+ <span class="md-ellipsis">
1620
+
1621
+
1622
+ Data Science
1623
+
1624
+
1625
+
1626
+ </span>
1627
+
1628
+
1629
+
1630
+ </a>
1631
+ </li>
1632
+
1633
+
1634
+
1635
+
1636
+ </ul>
1637
+ </nav>
1638
+
1639
+ </li>
1640
+
1641
+
1642
+
1643
+
1644
+
1645
+
1646
+
1647
+
1648
+
1649
+
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+
1658
+
1659
+
1660
+
1661
+
1662
+
1663
+
1664
+
1665
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
1666
+
1667
+
1668
+
1669
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
1670
+
1671
+
1672
+ <div class="md-nav__link md-nav__container">
1673
+ <a href="../../gui/" class="md-nav__link ">
1674
+
1675
+
1676
+
1677
+ <span class="md-ellipsis">
1678
+
1679
+
1680
+ GUI
1681
+
1682
+
1683
+
1684
+ </span>
1685
+
1686
+
1687
+
1688
+ </a>
1689
+
1690
+
1691
+ <label class="md-nav__link " for="__nav_7" id="__nav_7_label" tabindex="">
1692
+ <span class="md-nav__icon md-icon"></span>
1693
+ </label>
1694
+
1695
+ </div>
1696
+
1697
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
1698
+ <label class="md-nav__title" for="__nav_7">
1699
+ <span class="md-nav__icon md-icon"></span>
1700
+
1701
+
1702
+ GUI
1703
+
1704
+
1705
+ </label>
1706
+ <ul class="md-nav__list" data-md-scrollfix>
1707
+
1708
+
1709
+
1710
+
1711
+
1712
+
1713
+
1714
+ <li class="md-nav__item">
1715
+ <a href="../../gui/walkthrough/" class="md-nav__link">
1716
+
1717
+
1718
+
1719
+ <span class="md-ellipsis">
1720
+
1721
+
1722
+ Walkthrough
1723
+
1724
+
1725
+
1726
+ </span>
1727
+
1728
+
1729
+
1730
+ </a>
1731
+ </li>
1732
+
1733
+
1734
+
1735
+
1736
+
1737
+
1738
+
1739
+
1740
+
1741
+
1742
+ <li class="md-nav__item">
1743
+ <a href="../../gui/plugin-authoring/" class="md-nav__link">
1744
+
1745
+
1746
+
1747
+ <span class="md-ellipsis">
1748
+
1749
+
1750
+ Plugin GUI Authoring
1751
+
1752
+
1753
+
1754
+ </span>
1755
+
1756
+
1757
+
1758
+ </a>
1759
+ </li>
1760
+
1761
+
1762
+
1763
+
1764
+ </ul>
1765
+ </nav>
1766
+
1767
+ </li>
1768
+
1769
+
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+
1785
+
1786
+
1787
+
1788
+
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
1796
+
1797
+
1798
+
1799
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
1800
+
1801
+
1802
+ <div class="md-nav__link md-nav__container">
1803
+ <a href="../../reference/" class="md-nav__link ">
1804
+
1805
+
1806
+
1807
+ <span class="md-ellipsis">
1808
+
1809
+
1810
+ Reference
1811
+
1812
+
1813
+
1814
+ </span>
1815
+
1816
+
1817
+
1818
+ </a>
1819
+
1820
+
1821
+ <label class="md-nav__link " for="__nav_8" id="__nav_8_label" tabindex="">
1822
+ <span class="md-nav__icon md-icon"></span>
1823
+ </label>
1824
+
1825
+ </div>
1826
+
1827
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
1828
+ <label class="md-nav__title" for="__nav_8">
1829
+ <span class="md-nav__icon md-icon"></span>
1830
+
1831
+
1832
+ Reference
1833
+
1834
+
1835
+ </label>
1836
+ <ul class="md-nav__list" data-md-scrollfix>
1837
+
1838
+
1839
+
1840
+
1841
+
1842
+
1843
+
1844
+ <li class="md-nav__item">
1845
+ <a href="../../reference/api/" class="md-nav__link">
1846
+
1847
+
1848
+
1849
+ <span class="md-ellipsis">
1850
+
1851
+
1852
+ Public Python API
1853
+
1854
+
1855
+
1856
+ </span>
1857
+
1858
+
1859
+
1860
+ </a>
1861
+ </li>
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+
1868
+
1869
+
1870
+
1871
+
1872
+ <li class="md-nav__item">
1873
+ <a href="../../examples/" class="md-nav__link">
1874
+
1875
+
1876
+
1877
+ <span class="md-ellipsis">
1878
+
1879
+
1880
+ Example Library
1881
+
1882
+
1883
+
1884
+ </span>
1885
+
1886
+
1887
+
1888
+ </a>
1889
+ </li>
1890
+
1891
+
1892
+
1893
+
1894
+
1895
+
1896
+
1897
+
1898
+
1899
+
1900
+ <li class="md-nav__item">
1901
+ <a href="../../examples/quickstart/" class="md-nav__link">
1902
+
1903
+
1904
+
1905
+ <span class="md-ellipsis">
1906
+
1907
+
1908
+ Example Data Provenance
1909
+
1910
+
1911
+
1912
+ </span>
1913
+
1914
+
1915
+
1916
+ </a>
1917
+ </li>
1918
+
1919
+
1920
+
1921
+
1922
+ </ul>
1923
+ </nav>
1924
+
1925
+ </li>
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+
1932
+
1933
+
1934
+
1935
+
1936
+
1937
+
1938
+
1939
+
1940
+
1941
+
1942
+
1943
+
1944
+
1945
+
1946
+
1947
+
1948
+
1949
+
1950
+
1951
+
1952
+
1953
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
1954
+
1955
+
1956
+
1957
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
1958
+
1959
+
1960
+ <label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
1961
+
1962
+
1963
+
1964
+ <span class="md-ellipsis">
1965
+
1966
+
1967
+ Explanation
1968
+
1969
+
1970
+
1971
+ </span>
1972
+
1973
+
1974
+
1975
+ <span class="md-nav__icon md-icon"></span>
1976
+ </label>
1977
+
1978
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
1979
+ <label class="md-nav__title" for="__nav_9">
1980
+ <span class="md-nav__icon md-icon"></span>
1981
+
1982
+
1983
+ Explanation
1984
+
1985
+
1986
+ </label>
1987
+ <ul class="md-nav__list" data-md-scrollfix>
1988
+
1989
+
1990
+
1991
+
1992
+
1993
+
1994
+
1995
+ <li class="md-nav__item">
1996
+ <a href="../../explanation/reproducibility/" class="md-nav__link">
1997
+
1998
+
1999
+
2000
+ <span class="md-ellipsis">
2001
+
2002
+
2003
+ Reproducibility
2004
+
2005
+
2006
+
2007
+ </span>
2008
+
2009
+
2010
+
2011
+ </a>
2012
+ </li>
2013
+
2014
+
2015
+
2016
+
2017
+
2018
+
2019
+
2020
+
2021
+
2022
+
2023
+ <li class="md-nav__item">
2024
+ <a href="../../explanation/references/" class="md-nav__link">
2025
+
2026
+
2027
+
2028
+ <span class="md-ellipsis">
2029
+
2030
+
2031
+ Method References
2032
+
2033
+
2034
+
2035
+ </span>
2036
+
2037
+
2038
+
2039
+ </a>
2040
+ </li>
2041
+
2042
+
2043
+
2044
+
2045
+
2046
+
2047
+
2048
+
2049
+
2050
+
2051
+ <li class="md-nav__item">
2052
+ <a href="../../explanation/third-party-notices/" class="md-nav__link">
2053
+
2054
+
2055
+
2056
+ <span class="md-ellipsis">
2057
+
2058
+
2059
+ Third-party Notices
2060
+
2061
+
2062
+
2063
+ </span>
2064
+
2065
+
2066
+
2067
+ </a>
2068
+ </li>
2069
+
2070
+
2071
+
2072
+
2073
+ </ul>
2074
+ </nav>
2075
+
2076
+ </li>
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+
2085
+
2086
+
2087
+
2088
+
2089
+
2090
+
2091
+
2092
+
2093
+
2094
+
2095
+
2096
+
2097
+
2098
+
2099
+
2100
+
2101
+
2102
+
2103
+
2104
+
2105
+
2106
+
2107
+
2108
+
2109
+
2110
+
2111
+
2112
+ <li class="md-nav__item md-nav__item--section md-nav__item--nested">
2113
+
2114
+
2115
+
2116
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" >
2117
+
2118
+
2119
+ <div class="md-nav__link md-nav__container">
2120
+ <a href="../../development/" class="md-nav__link ">
2121
+
2122
+
2123
+
2124
+ <span class="md-ellipsis">
2125
+
2126
+
2127
+ Development
2128
+
2129
+
2130
+
2131
+ </span>
2132
+
2133
+
2134
+
2135
+ </a>
2136
+
2137
+
2138
+ <label class="md-nav__link " for="__nav_10" id="__nav_10_label" tabindex="">
2139
+ <span class="md-nav__icon md-icon"></span>
2140
+ </label>
2141
+
2142
+ </div>
2143
+
2144
+ <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
2145
+ <label class="md-nav__title" for="__nav_10">
2146
+ <span class="md-nav__icon md-icon"></span>
2147
+
2148
+
2149
+ Development
2150
+
2151
+
2152
+ </label>
2153
+ <ul class="md-nav__list" data-md-scrollfix>
2154
+
2155
+
2156
+
2157
+
2158
+
2159
+
2160
+
2161
+ <li class="md-nav__item">
2162
+ <a href="../../development/release-notes/" class="md-nav__link">
2163
+
2164
+
2165
+
2166
+ <span class="md-ellipsis">
2167
+
2168
+
2169
+ Release Notes
2170
+
2171
+
2172
+
2173
+ </span>
2174
+
2175
+
2176
+
2177
+ </a>
2178
+ </li>
2179
+
2180
+
2181
+
2182
+
2183
+
2184
+
2185
+
2186
+
2187
+
2188
+
2189
+ <li class="md-nav__item">
2190
+ <a href="../../development/tool-authoring/" class="md-nav__link">
2191
+
2192
+
2193
+
2194
+ <span class="md-ellipsis">
2195
+
2196
+
2197
+ Tool Authoring
2198
+
2199
+
2200
+
2201
+ </span>
2202
+
2203
+
2204
+
2205
+ </a>
2206
+ </li>
2207
+
2208
+
2209
+
2210
+
2211
+
2212
+
2213
+
2214
+
2215
+
2216
+
2217
+ <li class="md-nav__item">
2218
+ <a href="../../development/documentation/" class="md-nav__link">
2219
+
2220
+
2221
+
2222
+ <span class="md-ellipsis">
2223
+
2224
+
2225
+ Documentation
2226
+
2227
+
2228
+
2229
+ </span>
2230
+
2231
+
2232
+
2233
+ </a>
2234
+ </li>
2235
+
2236
+
2237
+
2238
+
2239
+
2240
+
2241
+
2242
+
2243
+
2244
+
2245
+ <li class="md-nav__item">
2246
+ <a href="../../development/contributing/" class="md-nav__link">
2247
+
2248
+
2249
+
2250
+ <span class="md-ellipsis">
2251
+
2252
+
2253
+ Contributing
2254
+
2255
+
2256
+
2257
+ </span>
2258
+
2259
+
2260
+
2261
+ </a>
2262
+ </li>
2263
+
2264
+
2265
+
2266
+
2267
+
2268
+
2269
+
2270
+
2271
+
2272
+
2273
+ <li class="md-nav__item">
2274
+ <a href="../../development/security/" class="md-nav__link">
2275
+
2276
+
2277
+
2278
+ <span class="md-ellipsis">
2279
+
2280
+
2281
+ Security Reporting
2282
+
2283
+
2284
+
2285
+ </span>
2286
+
2287
+
2288
+
2289
+ </a>
2290
+ </li>
2291
+
2292
+
2293
+
2294
+
2295
+
2296
+
2297
+
2298
+
2299
+
2300
+
2301
+ <li class="md-nav__item">
2302
+ <a href="../../development/release-readiness/" class="md-nav__link">
2303
+
2304
+
2305
+
2306
+ <span class="md-ellipsis">
2307
+
2308
+
2309
+ Release Readiness
2310
+
2311
+
2312
+
2313
+ </span>
2314
+
2315
+
2316
+
2317
+ </a>
2318
+ </li>
2319
+
2320
+
2321
+
2322
+
2323
+
2324
+
2325
+
2326
+
2327
+
2328
+
2329
+ <li class="md-nav__item">
2330
+ <a href="../../development/ci-publishing/" class="md-nav__link">
2331
+
2332
+
2333
+
2334
+ <span class="md-ellipsis">
2335
+
2336
+
2337
+ CI and Publishing
2338
+
2339
+
2340
+
2341
+ </span>
2342
+
2343
+
2344
+
2345
+ </a>
2346
+ </li>
2347
+
2348
+
2349
+
2350
+
2351
+ </ul>
2352
+ </nav>
2353
+
2354
+ </li>
2355
+
2356
+
2357
+
2358
+ </ul>
2359
+ </nav>
2360
+ </div>
2361
+ </div>
2362
+ </div>
2363
+
2364
+
2365
+
2366
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
2367
+ <div class="md-sidebar__scrollwrap">
2368
+ <div class="md-sidebar__inner">
2369
+
2370
+
2371
+ <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
2372
+
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+ <label class="md-nav__title" for="__toc">
2379
+ <span class="md-nav__icon md-icon"></span>
2380
+ Table of contents
2381
+ </label>
2382
+ <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
2383
+
2384
+ <li class="md-nav__item">
2385
+ <a href="#requirements-and-example-status" class="md-nav__link">
2386
+ <span class="md-ellipsis">
2387
+
2388
+ Requirements and example status
2389
+
2390
+ </span>
2391
+ </a>
2392
+
2393
+ </li>
2394
+
2395
+ <li class="md-nav__item">
2396
+ <a href="#fix-structure" class="md-nav__link">
2397
+ <span class="md-ellipsis">
2398
+
2399
+ fix-structure
2400
+
2401
+ </span>
2402
+ </a>
2403
+
2404
+ <nav class="md-nav" aria-label="fix-structure">
2405
+ <ul class="md-nav__list">
2406
+
2407
+ <li class="md-nav__item">
2408
+ <a href="#terminal-chemistry" class="md-nav__link">
2409
+ <span class="md-ellipsis">
2410
+
2411
+ Terminal chemistry
2412
+
2413
+ </span>
2414
+ </a>
2415
+
2416
+ </li>
2417
+
2418
+ <li class="md-nav__item">
2419
+ <a href="#pipeline-example" class="md-nav__link">
2420
+ <span class="md-ellipsis">
2421
+
2422
+ Pipeline example
2423
+
2424
+ </span>
2425
+ </a>
2426
+
2427
+ </li>
2428
+
2429
+ </ul>
2430
+ </nav>
2431
+
2432
+ </li>
2433
+
2434
+ <li class="md-nav__item">
2435
+ <a href="#center-and-align" class="md-nav__link">
2436
+ <span class="md-ellipsis">
2437
+
2438
+ center-and-align
2439
+
2440
+ </span>
2441
+ </a>
2442
+
2443
+ </li>
2444
+
2445
+ <li class="md-nav__item">
2446
+ <a href="#extract-frames" class="md-nav__link">
2447
+ <span class="md-ellipsis">
2448
+
2449
+ extract-frames
2450
+
2451
+ </span>
2452
+ </a>
2453
+
2454
+ </li>
2455
+
2456
+ <li class="md-nav__item">
2457
+ <a href="#cluster-representative" class="md-nav__link">
2458
+ <span class="md-ellipsis">
2459
+
2460
+ cluster-representative
2461
+
2462
+ </span>
2463
+ </a>
2464
+
2465
+ </li>
2466
+
2467
+ <li class="md-nav__item">
2468
+ <a href="#plain-md" class="md-nav__link">
2469
+ <span class="md-ellipsis">
2470
+
2471
+ plain-md
2472
+
2473
+ </span>
2474
+ </a>
2475
+
2476
+ </li>
2477
+
2478
+ <li class="md-nav__item">
2479
+ <a href="#minimize" class="md-nav__link">
2480
+ <span class="md-ellipsis">
2481
+
2482
+ minimize
2483
+
2484
+ </span>
2485
+ </a>
2486
+
2487
+ <nav class="md-nav" aria-label="minimize">
2488
+ <ul class="md-nav__list">
2489
+
2490
+ <li class="md-nav__item">
2491
+ <a href="#minimize-installation-and-execution" class="md-nav__link">
2492
+ <span class="md-ellipsis">
2493
+
2494
+ Minimize installation and execution
2495
+
2496
+ </span>
2497
+ </a>
2498
+
2499
+ </li>
2500
+
2501
+ <li class="md-nav__item">
2502
+ <a href="#minimize-inputs-and-physical-model" class="md-nav__link">
2503
+ <span class="md-ellipsis">
2504
+
2505
+ Minimize inputs and physical model
2506
+
2507
+ </span>
2508
+ </a>
2509
+
2510
+ </li>
2511
+
2512
+ <li class="md-nav__item">
2513
+ <a href="#minimize-regions-and-modes" class="md-nav__link">
2514
+ <span class="md-ellipsis">
2515
+
2516
+ Minimize regions and modes
2517
+
2518
+ </span>
2519
+ </a>
2520
+
2521
+ </li>
2522
+
2523
+ <li class="md-nav__item">
2524
+ <a href="#minimize-convergence-diagnostics-and-quality" class="md-nav__link">
2525
+ <span class="md-ellipsis">
2526
+
2527
+ Minimize convergence, diagnostics, and quality
2528
+
2529
+ </span>
2530
+ </a>
2531
+
2532
+ </li>
2533
+
2534
+ <li class="md-nav__item">
2535
+ <a href="#minimize-artifacts-and-pipelines" class="md-nav__link">
2536
+ <span class="md-ellipsis">
2537
+
2538
+ Minimize artifacts and pipelines
2539
+
2540
+ </span>
2541
+ </a>
2542
+
2543
+ </li>
2544
+
2545
+ </ul>
2546
+ </nav>
2547
+
2548
+ </li>
2549
+
2550
+ <li class="md-nav__item">
2551
+ <a href="#openbpmd" class="md-nav__link">
2552
+ <span class="md-ellipsis">
2553
+
2554
+ openbpmd
2555
+
2556
+ </span>
2557
+ </a>
2558
+
2559
+ </li>
2560
+
2561
+ <li class="md-nav__item">
2562
+ <a href="#grand" class="md-nav__link">
2563
+ <span class="md-ellipsis">
2564
+
2565
+ grand
2566
+
2567
+ </span>
2568
+ </a>
2569
+
2570
+ <nav class="md-nav" aria-label="grand">
2571
+ <ul class="md-nav__list">
2572
+
2573
+ <li class="md-nav__item">
2574
+ <a href="#configuration-options" class="md-nav__link">
2575
+ <span class="md-ellipsis">
2576
+
2577
+ Configuration options
2578
+
2579
+ </span>
2580
+ </a>
2581
+
2582
+ </li>
2583
+
2584
+ <li class="md-nav__item">
2585
+ <a href="#slurm-scratch-execution" class="md-nav__link">
2586
+ <span class="md-ellipsis">
2587
+
2588
+ Slurm scratch execution
2589
+
2590
+ </span>
2591
+ </a>
2592
+
2593
+ </li>
2594
+
2595
+ <li class="md-nav__item">
2596
+ <a href="#log-syncing" class="md-nav__link">
2597
+ <span class="md-ellipsis">
2598
+
2599
+ Log syncing
2600
+
2601
+ </span>
2602
+ </a>
2603
+
2604
+ </li>
2605
+
2606
+ <li class="md-nav__item">
2607
+ <a href="#outputs" class="md-nav__link">
2608
+ <span class="md-ellipsis">
2609
+
2610
+ Outputs
2611
+
2612
+ </span>
2613
+ </a>
2614
+
2615
+ </li>
2616
+
2617
+ </ul>
2618
+ </nav>
2619
+
2620
+ </li>
2621
+
2622
+ <li class="md-nav__item">
2623
+ <a href="#compressed-inputs" class="md-nav__link">
2624
+ <span class="md-ellipsis">
2625
+
2626
+ Compressed inputs
2627
+
2628
+ </span>
2629
+ </a>
2630
+
2631
+ </li>
2632
+
2633
+ <li class="md-nav__item">
2634
+ <a href="#inducia" class="md-nav__link">
2635
+ <span class="md-ellipsis">
2636
+
2637
+ inducia
2638
+
2639
+ </span>
2640
+ </a>
2641
+
2642
+ </li>
2643
+
2644
+ </ul>
2645
+
2646
+ </nav>
2647
+ </div>
2648
+ </div>
2649
+ </div>
2650
+
2651
+
2652
+
2653
+ <div class="md-content" data-md-component="content">
2654
+
2655
+ <article class="md-content__inner md-typeset">
2656
+
2657
+
2658
+
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+ <h1 id="md-plugin">MD Plugin<a class="headerlink" href="#md-plugin" title="Permanent link">&para;</a></h1>
2665
+ <p>Package: <code>caddforge-md</code></p>
2666
+ <div class="admonition info">
2667
+ <p class="admonition-title">Public source tag</p>
2668
+ <p>This page describes <code>caddforge-md</code> <code>0.13.0</code>, tagged as <code>v0.13.0</code>.
2669
+ PyPI publication is pending; see the <a href="../version-matrix/">version matrix</a>.</p>
2670
+ </div>
2671
+ <p>The MD plugin provides molecular dynamics preparation, simulation, and analysis workflows.</p>
2672
+ <h2 id="requirements-and-example-status">Requirements and example status<a class="headerlink" href="#requirements-and-example-status" title="Permanent link">&para;</a></h2>
2673
+ <p>The <a href="../../examples/">example library</a> provides downloadable configuration
2674
+ templates for every workflow on this page, plus a shared Python runner. File paths
2675
+ refer to inputs you must prepare; these are not bundled research datasets. Schema
2676
+ validation does not establish scientific validity or engine availability. See the
2677
+ <a href="../version-matrix/">version matrix</a> for release tags and publication status.</p>
2678
+ <h2 id="fix-structure"><code>fix-structure</code><a class="headerlink" href="#fix-structure" title="Permanent link">&para;</a></h2>
2679
+ <p>Conservatively repairs protein hydrogens in a protein-only PDB, protein-ligand complex PDB, or existing POPC/POPE membrane system before OpenMM simulations. The tool preserves explicit protein protonation choices where possible, repairs configured membrane lipid hydrogens with OpenMM force-field templates, leaves ligands/cofactors untouched, and preserves ligand/cofactor <code>CONECT</code> records and PDB formal-charge fields by default.</p>
2680
+ <p>CLI:</p>
2681
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>fix-structure<span class="w"> </span>--config<span class="w"> </span>fix_structure.yaml
2682
+ </code></pre></div>
2683
+ <p>YAML:</p>
2684
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
2685
+ <a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="nt">input_pdb</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/complex.pdb</span>
2686
+ <a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a><span class="nt">forcefields</span><span class="p">:</span>
2687
+ <a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">amber14-all.xml</span>
2688
+ <a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">amber14/tip3p.xml</span>
2689
+ <a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="nt">ph</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7.0</span>
2690
+ <a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a><span class="nt">protonation_policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">preserve</span>
2691
+ <a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="nt">termini_policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">charged</span>
2692
+ <a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a><span class="nt">fix_nonstandard_residues</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">auto</span>
2693
+ <a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="nt">strict_all</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
2694
+ <a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="nt">membrane_lipid_resnames</span><span class="p">:</span>
2695
+ <a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">POPC</span>
2696
+ <a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">POPE</span>
2697
+ <a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a><span class="nt">validate_openmm_system</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">auto</span>
2698
+ <a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a><span class="nt">sanitize_mixed_residues</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">auto</span>
2699
+ <a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a><span class="nt">preserve_conect</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
2700
+ <a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a><span class="nt">quiet</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
2701
+ <a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a><span class="nt">output_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
2702
+ <a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a><span class="nt">output_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2703
+ </code></pre></div>
2704
+ <p><code>validate_openmm_system: auto</code> keeps normal non-membrane behavior unchanged and runs an OpenMM <code>ForceField.createSystem()</code> validation when configured membrane lipid residues are present. <code>sanitize_mixed_residues: auto</code> separates mixed PDB residue ids and reassembles split atom records before OpenMM parsing, for example POPC records interrupted by CL/T3P records that reuse the same residue number. POPC/POPE are detected from both standard and 4-character PDB residue-name layouts. For POPC/POPE Amber-style inputs, include force fields that cover protein, lipids, water, and ions; <code>amber14-all.xml</code> includes lipid templates and <code>amber14/tip3p.xml</code> covers TIP3P water and common ions. Unmatched ligands/cofactors left untouched by this repair tool are reported in <code>repair_metadata.openmm_system_validation.ignored_unmatched_residues</code> and must still be parameterized by the downstream MD workflow.</p>
2705
+ <p>Python:</p>
2706
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.core.execution</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_result_for_job</span><span class="p">,</span> <span class="n">submit_workflow</span>
2707
+ <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_tool</span>
2708
+ <a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
2709
+ <a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="n">spec</span> <span class="o">=</span> <span class="n">get_tool</span><span class="p">(</span><span class="s2">"md"</span><span class="p">,</span> <span class="s2">"fix-structure"</span><span class="p">)</span>
2710
+ <a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="n">cfg</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">config_cls</span><span class="p">(</span>
2711
+ <a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a> <span class="n">input_pdb</span><span class="o">=</span><span class="s2">"data/complex.pdb"</span><span class="p">,</span>
2712
+ <a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a> <span class="n">forcefields</span><span class="o">=</span><span class="p">[</span><span class="s2">"amber14-all.xml"</span><span class="p">,</span> <span class="s2">"amber14/tip3p.xml"</span><span class="p">],</span>
2713
+ <a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a> <span class="n">backend</span><span class="o">=</span><span class="s2">"local"</span><span class="p">,</span>
2714
+ <a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="p">)</span>
2715
+ <a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">workflow_cls</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span>
2716
+ <a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="n">job</span> <span class="o">=</span> <span class="n">submit_workflow</span><span class="p">(</span>
2717
+ <a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a> <span class="n">workflow</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="n">backend_name</span><span class="o">=</span><span class="n">cfg</span><span class="o">.</span><span class="n">backend</span><span class="p">,</span>
2718
+ <a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a> <span class="n">input_ports</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s2">"input_ports"</span><span class="p">,</span> <span class="p">())),</span>
2719
+ <a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a><span class="p">)</span>
2720
+ <a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a><span class="n">result</span> <span class="o">=</span> <span class="n">load_result_for_job</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
2721
+ <a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
2722
+ <a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a> <span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">paths</span><span class="p">[</span><span class="s2">"output_pdb"</span><span class="p">])</span>
2723
+ </code></pre></div>
2724
+ <p>Outputs to inspect: <code>results/output/&lt;input_stem&gt;_fixed.pdb</code>,
2725
+ <code>results/result_record.json</code>. In pipelines, bind input artifact <code>structure</code> and consume output
2726
+ artifact <code>repaired_structure</code>.</p>
2727
+ <h3 id="terminal-chemistry">Terminal chemistry<a class="headerlink" href="#terminal-chemistry" title="Permanent link">&para;</a></h3>
2728
+ <p><code>termini_policy</code> controls terminal chemistry separately from side-chain protonation:</p>
2729
+ <table>
2730
+ <thead>
2731
+ <tr>
2732
+ <th>Policy</th>
2733
+ <th>Behavior</th>
2734
+ </tr>
2735
+ </thead>
2736
+ <tbody>
2737
+ <tr>
2738
+ <td><code>charged</code> (default)</td>
2739
+ <td>Prepare free N-termini as positively charged and free C-termini as negatively charged, independently of pH. Repair missing terminal OXT when the backbone permits reconstruction.</td>
2740
+ </tr>
2741
+ <tr>
2742
+ <td><code>preserve</code></td>
2743
+ <td>Preserve the input terminal state and validate against the supplied force fields. Ambiguous or incomplete terminal groups fail with a residue-specific explanation.</td>
2744
+ </tr>
2745
+ <tr>
2746
+ <td><code>cap</code></td>
2747
+ <td>Add ACE/NME caps to eligible neutral or incomplete termini. Already charged or capped termini remain unchanged.</td>
2748
+ </tr>
2749
+ </tbody>
2750
+ </table>
2751
+ <p>A protonated, uncapped C-terminus (<code>–COOH</code>) is neutral. A deprotonated C-terminus
2752
+ (<code>–COO⁻</code>) is charged. A neutral NME cap (<code>–CONHCH₃</code>) is chemically different from
2753
+ an uncapped neutral acid. Capping can affect both N- and C-termini.</p>
2754
+ <p>Terminal policy takes precedence over <code>protonation_policy</code> <strong>only at terminal
2755
+ groups</strong>. Thus the default <code>charged</code> policy can remove HXT even when
2756
+ <code>protonation_policy: preserve</code>; unrelated residue substitutions remain forbidden.
2757
+ Missing terminal hydrogens can make preservation ambiguous (for example, only
2758
+ one H on an ordinary free N-terminus). Prepare the intended terminal state
2759
+ explicitly rather than relying on pH to select it in preserve mode. Hydrogen
2760
+ repair still fills unrelated missing hydrogens.</p>
2761
+ <p>Stock OpenMM <code>amber14-all.xml</code> supports standard charged termini and ACE/NME caps,
2762
+ but does not include a neutral uncapped <code>–COOH</code> template. To preserve that form,
2763
+ supply a compatible force field or additional, scientifically validated templates:</p>
2764
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="nt">input_pdb</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/protein_with_explicit_terminal_states.pdb</span>
2765
+ <a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="nt">forcefields</span><span class="p">:</span>
2766
+ <a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">amber14-all.xml</span>
2767
+ <a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/absolute/path/to/your_validated_terminal_templates.xml</span>
2768
+ <a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="nt">protonation_policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">preserve</span>
2769
+ <a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="nt">termini_policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">preserve</span>
2770
+ </code></pre></div>
2771
+ <p>The extra XML above is user-supplied, not bundled with CADDForge. Force-field
2772
+ compatibility is checked; preserve mode never silently converts an unsupported
2773
+ neutral terminus. Setting <code>validate_openmm_system: never</code> does not disable
2774
+ protein/cap template matching or terminal-state validation. This feature concerns
2775
+ terminal states of recognized protein residues, not arbitrary modified residues.</p>
2776
+ <p>For standard charged preparation, set <code>termini_policy: charged</code>. For explicitly
2777
+ requested caps, set <code>termini_policy: cap</code>; side-chain preservation can stay enabled.
2778
+ Approximate reconstructed atoms and caps should be minimized before production MD.</p>
2779
+ <p><strong>Migration:</strong> <code>cap_neutral_termini: true</code> is a deprecated alias for
2780
+ <code>termini_policy: cap</code>. Combining it with an explicit different policy fails.
2781
+ <code>false</code> does not override the new policy. <code>fix_nonstandard_residues</code> now controls
2782
+ modified-residue normalization only; setting it to <code>never</code> does not disable
2783
+ terminal treatment. Users who previously relied on <code>protonation_policy: preserve</code>
2784
+ to reject terminal conversions must now also set <code>termini_policy: preserve</code>.</p>
2785
+ <p>The report at <code>paths.normalization</code> records requested/effective policy, original
2786
+ terminal evidence, normalization edits or added caps, final decisions, and
2787
+ validation status under <code>normalization.terminal_treatment</code>. It is retained on
2788
+ failure. Successful results also expose <code>repair_metadata.terminal_treatment</code>.</p>
2789
+ <h3 id="pipeline-example">Pipeline example<a class="headerlink" href="#pipeline-example" title="Permanent link">&para;</a></h3>
2790
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
2791
+ <a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">prepare-protein</span>
2792
+ <a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a><span class="nt">stages</span><span class="p">:</span>
2793
+ <a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">repair</span>
2794
+ <a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a><span class="w"> </span><span class="nt">tool</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">md/fix-structure</span>
2795
+ <a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a><span class="w"> </span><span class="nt">config</span><span class="p">:</span>
2796
+ <a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a><span class="w"> </span><span class="nt">input_pdb</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/protein.pdb</span>
2797
+ <a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a><span class="w"> </span><span class="nt">forcefields</span><span class="p">:</span><span class="w"> </span><span class="p p-Indicator">[</span><span class="nv">amber14-all.xml</span><span class="p p-Indicator">,</span><span class="w"> </span><span class="nv">amber14/tip3p.xml</span><span class="p p-Indicator">]</span>
2798
+ <a id="__codelineno-4-9" name="__codelineno-4-9" href="#__codelineno-4-9"></a><span class="w"> </span><span class="nt">protonation_policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">preserve</span>
2799
+ <a id="__codelineno-4-10" name="__codelineno-4-10" href="#__codelineno-4-10"></a><span class="w"> </span><span class="nt">termini_policy</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">charged</span>
2800
+ <a id="__codelineno-4-11" name="__codelineno-4-11" href="#__codelineno-4-11"></a><span class="w"> </span><span class="nt">outputs</span><span class="p">:</span>
2801
+ <a id="__codelineno-4-12" name="__codelineno-4-12" href="#__codelineno-4-12"></a><span class="w"> </span><span class="nt">protein</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output_pdb</span>
2802
+ <a id="__codelineno-4-13" name="__codelineno-4-13" href="#__codelineno-4-13"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">cleanup</span>
2803
+ <a id="__codelineno-4-14" name="__codelineno-4-14" href="#__codelineno-4-14"></a><span class="w"> </span><span class="nt">tool</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">md/minimize</span>
2804
+ <a id="__codelineno-4-15" name="__codelineno-4-15" href="#__codelineno-4-15"></a><span class="w"> </span><span class="nt">inputs</span><span class="p">:</span>
2805
+ <a id="__codelineno-4-16" name="__codelineno-4-16" href="#__codelineno-4-16"></a><span class="w"> </span><span class="nt">protein</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">repair.protein</span>
2806
+ <a id="__codelineno-4-17" name="__codelineno-4-17" href="#__codelineno-4-17"></a><span class="w"> </span><span class="nt">config</span><span class="p">:</span>
2807
+ <a id="__codelineno-4-18" name="__codelineno-4-18" href="#__codelineno-4-18"></a><span class="w"> </span><span class="nt">ligand_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/ligand.sdf</span>
2808
+ <a id="__codelineno-4-19" name="__codelineno-4-19" href="#__codelineno-4-19"></a><span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ligand_only</span>
2809
+ </code></pre></div>
2810
+ <p>The input must be a protein-only receptor for this example; ligand chemistry is
2811
+ supplied separately to <code>minimize</code>. The repair tool's existing input port
2812
+ <code>structure</code> and output port <code>repaired_structure</code> are unchanged. The explicit
2813
+ <code>protein: output_pdb</code> output alias above binds the same PDB for the next stage.</p>
2814
+ <h2 id="center-and-align"><code>center-and-align</code><a class="headerlink" href="#center-and-align" title="Permanent link">&para;</a></h2>
2815
+ <p>Centers, wraps, optionally aligns, and writes a processed trajectory.</p>
2816
+ <p>CLI:</p>
2817
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>center-and-align<span class="w"> </span>--config<span class="w"> </span>center_and_align.yaml
2818
+ </code></pre></div>
2819
+ <p>YAML:</p>
2820
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
2821
+ <a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="nt">topology_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/system.pdb</span>
2822
+ <a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="nt">trajectory_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/traj.xtc</span>
2823
+ <a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="nt">center_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">protein or resname MOL</span>
2824
+ <a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="nt">keep_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">protein or resname MOL</span>
2825
+ <a id="__codelineno-6-6" name="__codelineno-6-6" href="#__codelineno-6-6"></a><span class="nt">align_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">protein and backbone</span>
2826
+ <a id="__codelineno-6-7" name="__codelineno-6-7" href="#__codelineno-6-7"></a><span class="nt">unwrap</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
2827
+ <a id="__codelineno-6-8" name="__codelineno-6-8" href="#__codelineno-6-8"></a><span class="nt">center</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
2828
+ <a id="__codelineno-6-9" name="__codelineno-6-9" href="#__codelineno-6-9"></a><span class="nt">wrap</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
2829
+ <a id="__codelineno-6-10" name="__codelineno-6-10" href="#__codelineno-6-10"></a><span class="nt">center_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">geometry</span>
2830
+ <a id="__codelineno-6-11" name="__codelineno-6-11" href="#__codelineno-6-11"></a><span class="nt">wrap_compound</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">residues</span>
2831
+ <a id="__codelineno-6-12" name="__codelineno-6-12" href="#__codelineno-6-12"></a><span class="nt">align_weights</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mass</span>
2832
+ <a id="__codelineno-6-13" name="__codelineno-6-13" href="#__codelineno-6-13"></a><span class="nt">output_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
2833
+ <a id="__codelineno-6-14" name="__codelineno-6-14" href="#__codelineno-6-14"></a><span class="nt">output_trajectory_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traj-centered.xtc</span>
2834
+ <a id="__codelineno-6-15" name="__codelineno-6-15" href="#__codelineno-6-15"></a><span class="nt">output_structure_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traj-centered.pdb</span>
2835
+ </code></pre></div>
2836
+ <p>Python:</p>
2837
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.core.execution</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_result_for_job</span><span class="p">,</span> <span class="n">submit_workflow</span>
2838
+ <a id="__codelineno-7-2" name="__codelineno-7-2" href="#__codelineno-7-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_tool</span>
2839
+ <a id="__codelineno-7-3" name="__codelineno-7-3" href="#__codelineno-7-3"></a>
2840
+ <a id="__codelineno-7-4" name="__codelineno-7-4" href="#__codelineno-7-4"></a><span class="n">spec</span> <span class="o">=</span> <span class="n">get_tool</span><span class="p">(</span><span class="s2">"md"</span><span class="p">,</span> <span class="s2">"center-and-align"</span><span class="p">)</span>
2841
+ <a id="__codelineno-7-5" name="__codelineno-7-5" href="#__codelineno-7-5"></a><span class="n">cfg</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">config_cls</span><span class="p">(</span>
2842
+ <a id="__codelineno-7-6" name="__codelineno-7-6" href="#__codelineno-7-6"></a> <span class="n">topology_path</span><span class="o">=</span><span class="s2">"data/system.pdb"</span><span class="p">,</span>
2843
+ <a id="__codelineno-7-7" name="__codelineno-7-7" href="#__codelineno-7-7"></a> <span class="n">trajectory_path</span><span class="o">=</span><span class="s2">"data/traj.xtc"</span><span class="p">,</span>
2844
+ <a id="__codelineno-7-8" name="__codelineno-7-8" href="#__codelineno-7-8"></a> <span class="n">center_selection</span><span class="o">=</span><span class="s2">"protein or resname MOL"</span><span class="p">,</span>
2845
+ <a id="__codelineno-7-9" name="__codelineno-7-9" href="#__codelineno-7-9"></a> <span class="n">keep_selection</span><span class="o">=</span><span class="s2">"protein or resname MOL"</span><span class="p">,</span>
2846
+ <a id="__codelineno-7-10" name="__codelineno-7-10" href="#__codelineno-7-10"></a> <span class="n">align_selection</span><span class="o">=</span><span class="s2">"protein and backbone"</span><span class="p">,</span>
2847
+ <a id="__codelineno-7-11" name="__codelineno-7-11" href="#__codelineno-7-11"></a> <span class="n">backend</span><span class="o">=</span><span class="s2">"local"</span><span class="p">,</span>
2848
+ <a id="__codelineno-7-12" name="__codelineno-7-12" href="#__codelineno-7-12"></a><span class="p">)</span>
2849
+ <a id="__codelineno-7-13" name="__codelineno-7-13" href="#__codelineno-7-13"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">workflow_cls</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span>
2850
+ <a id="__codelineno-7-14" name="__codelineno-7-14" href="#__codelineno-7-14"></a><span class="n">job</span> <span class="o">=</span> <span class="n">submit_workflow</span><span class="p">(</span>
2851
+ <a id="__codelineno-7-15" name="__codelineno-7-15" href="#__codelineno-7-15"></a> <span class="n">workflow</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="n">backend_name</span><span class="o">=</span><span class="n">cfg</span><span class="o">.</span><span class="n">backend</span><span class="p">,</span>
2852
+ <a id="__codelineno-7-16" name="__codelineno-7-16" href="#__codelineno-7-16"></a> <span class="n">input_ports</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s2">"input_ports"</span><span class="p">,</span> <span class="p">())),</span>
2853
+ <a id="__codelineno-7-17" name="__codelineno-7-17" href="#__codelineno-7-17"></a><span class="p">)</span>
2854
+ <a id="__codelineno-7-18" name="__codelineno-7-18" href="#__codelineno-7-18"></a><span class="n">result</span> <span class="o">=</span> <span class="n">load_result_for_job</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
2855
+ <a id="__codelineno-7-19" name="__codelineno-7-19" href="#__codelineno-7-19"></a><span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
2856
+ <a id="__codelineno-7-20" name="__codelineno-7-20" href="#__codelineno-7-20"></a> <span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">paths</span><span class="p">)</span>
2857
+ </code></pre></div>
2858
+ <p>Outputs to inspect: <code>results/output/&lt;trajectory&gt;</code>, <code>results/output/&lt;structure&gt;</code>,
2859
+ <code>results/result_record.json</code>.</p>
2860
+ <h2 id="extract-frames"><code>extract-frames</code><a class="headerlink" href="#extract-frames" title="Permanent link">&para;</a></h2>
2861
+ <p>Extracts one or more frames from a trajectory. For multi-frame selections it writes a sliced
2862
+ trajectory and a first selected-frame structure; for single-frame selections it writes only
2863
+ structure-style outputs.</p>
2864
+ <p>CLI:</p>
2865
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>extract-frames<span class="w"> </span>--config<span class="w"> </span>extract_frames.yaml
2866
+ </code></pre></div>
2867
+ <p>YAML:</p>
2868
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
2869
+ <a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="nt">topology_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/traj-centered.pdb</span>
2870
+ <a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a><span class="nt">trajectory_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/traj-centered.xtc</span>
2871
+ <a id="__codelineno-9-4" name="__codelineno-9-4" href="#__codelineno-9-4"></a><span class="nt">ligand_template_sdf</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/template.sdf</span>
2872
+ <a id="__codelineno-9-5" name="__codelineno-9-5" href="#__codelineno-9-5"></a><span class="nt">ligand_resname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">UNK</span>
2873
+ <a id="__codelineno-9-6" name="__codelineno-9-6" href="#__codelineno-9-6"></a><span class="nt">extract_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">protein or resname UNK</span>
2874
+ <a id="__codelineno-9-7" name="__codelineno-9-7" href="#__codelineno-9-7"></a><span class="nt">frame_index</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2875
+ <a id="__codelineno-9-8" name="__codelineno-9-8" href="#__codelineno-9-8"></a><span class="nt">last_ns</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.0</span>
2876
+ <a id="__codelineno-9-9" name="__codelineno-9-9" href="#__codelineno-9-9"></a><span class="nt">frame_slice</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2877
+ <a id="__codelineno-9-10" name="__codelineno-9-10" href="#__codelineno-9-10"></a><span class="nt">write_per_frame_pdbs</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">false</span>
2878
+ <a id="__codelineno-9-11" name="__codelineno-9-11" href="#__codelineno-9-11"></a><span class="nt">output_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
2879
+ <a id="__codelineno-9-12" name="__codelineno-9-12" href="#__codelineno-9-12"></a><span class="nt">output_trajectory_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">last-10ns.xtc</span>
2880
+ <a id="__codelineno-9-13" name="__codelineno-9-13" href="#__codelineno-9-13"></a><span class="nt">output_structure_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">last-10ns_first_complex.pdb</span>
2881
+ <a id="__codelineno-9-14" name="__codelineno-9-14" href="#__codelineno-9-14"></a><span class="nt">protein_trajectory_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">last-10ns_protein.xtc</span>
2882
+ <a id="__codelineno-9-15" name="__codelineno-9-15" href="#__codelineno-9-15"></a><span class="nt">protein_structure_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">last-10ns_first_protein.pdb</span>
2883
+ <a id="__codelineno-9-16" name="__codelineno-9-16" href="#__codelineno-9-16"></a><span class="nt">ligand_sdf_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">last-10ns_first_ligand.sdf</span>
2884
+ </code></pre></div>
2885
+ <p>Use exactly one frame-selection mode. A Python-style slice is written as:</p>
2886
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="nt">frame_index</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2887
+ <a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="nt">last_ns</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2888
+ <a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a><span class="nt">frame_slice</span><span class="p">:</span>
2889
+ <a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a><span class="w"> </span><span class="nt">start</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100</span>
2890
+ <a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a><span class="w"> </span><span class="nt">stop</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1000</span>
2891
+ <a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="w"> </span><span class="nt">step</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10</span>
2892
+ </code></pre></div>
2893
+ <p>Python:</p>
2894
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.core.execution</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_result_for_job</span><span class="p">,</span> <span class="n">submit_workflow</span>
2895
+ <a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_tool</span>
2896
+ <a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a>
2897
+ <a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="n">spec</span> <span class="o">=</span> <span class="n">get_tool</span><span class="p">(</span><span class="s2">"md"</span><span class="p">,</span> <span class="s2">"extract-frames"</span><span class="p">)</span>
2898
+ <a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="n">cfg</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">config_cls</span><span class="p">(</span>
2899
+ <a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a> <span class="n">topology_path</span><span class="o">=</span><span class="s2">"data/traj-centered.pdb"</span><span class="p">,</span>
2900
+ <a id="__codelineno-11-7" name="__codelineno-11-7" href="#__codelineno-11-7"></a> <span class="n">trajectory_path</span><span class="o">=</span><span class="s2">"data/traj-centered.xtc"</span><span class="p">,</span>
2901
+ <a id="__codelineno-11-8" name="__codelineno-11-8" href="#__codelineno-11-8"></a> <span class="n">ligand_template_sdf</span><span class="o">=</span><span class="s2">"data/template.sdf"</span><span class="p">,</span>
2902
+ <a id="__codelineno-11-9" name="__codelineno-11-9" href="#__codelineno-11-9"></a> <span class="n">ligand_resname</span><span class="o">=</span><span class="s2">"UNK"</span><span class="p">,</span>
2903
+ <a id="__codelineno-11-10" name="__codelineno-11-10" href="#__codelineno-11-10"></a> <span class="n">extract_selection</span><span class="o">=</span><span class="s2">"protein or resname UNK"</span><span class="p">,</span>
2904
+ <a id="__codelineno-11-11" name="__codelineno-11-11" href="#__codelineno-11-11"></a> <span class="n">last_ns</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span>
2905
+ <a id="__codelineno-11-12" name="__codelineno-11-12" href="#__codelineno-11-12"></a> <span class="n">backend</span><span class="o">=</span><span class="s2">"local"</span><span class="p">,</span>
2906
+ <a id="__codelineno-11-13" name="__codelineno-11-13" href="#__codelineno-11-13"></a><span class="p">)</span>
2907
+ <a id="__codelineno-11-14" name="__codelineno-11-14" href="#__codelineno-11-14"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">workflow_cls</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span>
2908
+ <a id="__codelineno-11-15" name="__codelineno-11-15" href="#__codelineno-11-15"></a><span class="n">job</span> <span class="o">=</span> <span class="n">submit_workflow</span><span class="p">(</span>
2909
+ <a id="__codelineno-11-16" name="__codelineno-11-16" href="#__codelineno-11-16"></a> <span class="n">workflow</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="n">backend_name</span><span class="o">=</span><span class="n">cfg</span><span class="o">.</span><span class="n">backend</span><span class="p">,</span>
2910
+ <a id="__codelineno-11-17" name="__codelineno-11-17" href="#__codelineno-11-17"></a> <span class="n">input_ports</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s2">"input_ports"</span><span class="p">,</span> <span class="p">())),</span>
2911
+ <a id="__codelineno-11-18" name="__codelineno-11-18" href="#__codelineno-11-18"></a><span class="p">)</span>
2912
+ <a id="__codelineno-11-19" name="__codelineno-11-19" href="#__codelineno-11-19"></a><span class="n">result</span> <span class="o">=</span> <span class="n">load_result_for_job</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
2913
+ <a id="__codelineno-11-20" name="__codelineno-11-20" href="#__codelineno-11-20"></a><span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
2914
+ <a id="__codelineno-11-21" name="__codelineno-11-21" href="#__codelineno-11-21"></a> <span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">paths</span><span class="p">)</span>
2915
+ </code></pre></div>
2916
+ <p>Outputs to inspect: <code>results/output/&lt;structure&gt;</code>, optional <code>results/output/&lt;trajectory&gt;</code> for
2917
+ multi-frame selections, optional protein-only outputs, optional corrected ligand SDF,
2918
+ <code>results/output/frame_manifest.json</code>, <code>results/result_record.json</code>.</p>
2919
+ <h2 id="cluster-representative"><code>cluster-representative</code><a class="headerlink" href="#cluster-representative" title="Permanent link">&para;</a></h2>
2920
+ <p>Clusters selected trajectory frames and writes the medoid of the largest cluster. By default,
2921
+ ligand systems cluster on ligand heavy atoms when <code>ligand_resname</code> is provided, while
2922
+ <code>extract_selection</code> controls the atoms written to the representative complex PDB.</p>
2923
+ <p>CLI:</p>
2924
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>cluster-representative<span class="w"> </span>--config<span class="w"> </span>cluster_representative.yaml
2925
+ </code></pre></div>
2926
+ <p>YAML:</p>
2927
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
2928
+ <a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="nt">topology_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/traj-centered.pdb</span>
2929
+ <a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a><span class="nt">trajectory_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/traj-centered.xtc</span>
2930
+ <a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a><span class="nt">ligand_template_sdf</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/template.sdf</span>
2931
+ <a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a><span class="nt">ligand_resname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">UNK</span>
2932
+ <a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a><span class="nt">cluster_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2933
+ <a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a><span class="nt">extract_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">protein or resname UNK</span>
2934
+ <a id="__codelineno-13-8" name="__codelineno-13-8" href="#__codelineno-13-8"></a><span class="nt">last_ns</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.0</span>
2935
+ <a id="__codelineno-13-9" name="__codelineno-13-9" href="#__codelineno-13-9"></a><span class="nt">frame_slice</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2936
+ <a id="__codelineno-13-10" name="__codelineno-13-10" href="#__codelineno-13-10"></a><span class="nt">distance_threshold_nm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.2</span>
2937
+ <a id="__codelineno-13-11" name="__codelineno-13-11" href="#__codelineno-13-11"></a><span class="nt">output_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
2938
+ <a id="__codelineno-13-12" name="__codelineno-13-12" href="#__codelineno-13-12"></a><span class="nt">output_complex_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">largest_cluster_representative_complex.pdb</span>
2939
+ <a id="__codelineno-13-13" name="__codelineno-13-13" href="#__codelineno-13-13"></a><span class="nt">output_protein_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">largest_cluster_representative_protein.pdb</span>
2940
+ <a id="__codelineno-13-14" name="__codelineno-13-14" href="#__codelineno-13-14"></a><span class="nt">output_ligand_sdf_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">largest_cluster_representative_ligand.sdf</span>
2941
+ <a id="__codelineno-13-15" name="__codelineno-13-15" href="#__codelineno-13-15"></a><span class="nt">clustering_summary_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">clustering_summary.json</span>
2942
+ </code></pre></div>
2943
+ <p>For slice-based clustering, replace <code>last_ns</code> with:</p>
2944
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="nt">last_ns</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2945
+ <a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a><span class="nt">frame_slice</span><span class="p">:</span>
2946
+ <a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a><span class="w"> </span><span class="nt">start</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1000</span>
2947
+ <a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a><span class="w"> </span><span class="nt">stop</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
2948
+ <a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a><span class="w"> </span><span class="nt">step</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5</span>
2949
+ </code></pre></div>
2950
+ <p>Python:</p>
2951
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.core.execution</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_result_for_job</span><span class="p">,</span> <span class="n">submit_workflow</span>
2952
+ <a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_tool</span>
2953
+ <a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a>
2954
+ <a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a><span class="n">spec</span> <span class="o">=</span> <span class="n">get_tool</span><span class="p">(</span><span class="s2">"md"</span><span class="p">,</span> <span class="s2">"cluster-representative"</span><span class="p">)</span>
2955
+ <a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a><span class="n">cfg</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">config_cls</span><span class="p">(</span>
2956
+ <a id="__codelineno-15-6" name="__codelineno-15-6" href="#__codelineno-15-6"></a> <span class="n">topology_path</span><span class="o">=</span><span class="s2">"data/traj-centered.pdb"</span><span class="p">,</span>
2957
+ <a id="__codelineno-15-7" name="__codelineno-15-7" href="#__codelineno-15-7"></a> <span class="n">trajectory_path</span><span class="o">=</span><span class="s2">"data/traj-centered.xtc"</span><span class="p">,</span>
2958
+ <a id="__codelineno-15-8" name="__codelineno-15-8" href="#__codelineno-15-8"></a> <span class="n">ligand_template_sdf</span><span class="o">=</span><span class="s2">"data/template.sdf"</span><span class="p">,</span>
2959
+ <a id="__codelineno-15-9" name="__codelineno-15-9" href="#__codelineno-15-9"></a> <span class="n">ligand_resname</span><span class="o">=</span><span class="s2">"UNK"</span><span class="p">,</span>
2960
+ <a id="__codelineno-15-10" name="__codelineno-15-10" href="#__codelineno-15-10"></a> <span class="n">extract_selection</span><span class="o">=</span><span class="s2">"protein or resname UNK"</span><span class="p">,</span>
2961
+ <a id="__codelineno-15-11" name="__codelineno-15-11" href="#__codelineno-15-11"></a> <span class="n">last_ns</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span>
2962
+ <a id="__codelineno-15-12" name="__codelineno-15-12" href="#__codelineno-15-12"></a> <span class="n">distance_threshold_nm</span><span class="o">=</span><span class="mf">0.2</span><span class="p">,</span>
2963
+ <a id="__codelineno-15-13" name="__codelineno-15-13" href="#__codelineno-15-13"></a> <span class="n">backend</span><span class="o">=</span><span class="s2">"local"</span><span class="p">,</span>
2964
+ <a id="__codelineno-15-14" name="__codelineno-15-14" href="#__codelineno-15-14"></a><span class="p">)</span>
2965
+ <a id="__codelineno-15-15" name="__codelineno-15-15" href="#__codelineno-15-15"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">workflow_cls</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span>
2966
+ <a id="__codelineno-15-16" name="__codelineno-15-16" href="#__codelineno-15-16"></a><span class="n">job</span> <span class="o">=</span> <span class="n">submit_workflow</span><span class="p">(</span>
2967
+ <a id="__codelineno-15-17" name="__codelineno-15-17" href="#__codelineno-15-17"></a> <span class="n">workflow</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="n">backend_name</span><span class="o">=</span><span class="n">cfg</span><span class="o">.</span><span class="n">backend</span><span class="p">,</span>
2968
+ <a id="__codelineno-15-18" name="__codelineno-15-18" href="#__codelineno-15-18"></a> <span class="n">input_ports</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s2">"input_ports"</span><span class="p">,</span> <span class="p">())),</span>
2969
+ <a id="__codelineno-15-19" name="__codelineno-15-19" href="#__codelineno-15-19"></a><span class="p">)</span>
2970
+ <a id="__codelineno-15-20" name="__codelineno-15-20" href="#__codelineno-15-20"></a><span class="n">result</span> <span class="o">=</span> <span class="n">load_result_for_job</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
2971
+ <a id="__codelineno-15-21" name="__codelineno-15-21" href="#__codelineno-15-21"></a><span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
2972
+ <a id="__codelineno-15-22" name="__codelineno-15-22" href="#__codelineno-15-22"></a> <span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">metrics</span><span class="p">)</span>
2973
+ </code></pre></div>
2974
+ <p>Outputs to inspect: <code>results/output/largest_cluster_representative_complex.pdb</code>, optional
2975
+ <code>results/output/largest_cluster_representative_protein.pdb</code>, optional corrected ligand SDF,
2976
+ <code>results/output/clustering_summary.json</code>, <code>results/result_record.json</code>.</p>
2977
+ <h2 id="plain-md"><code>plain-md</code><a class="headerlink" href="#plain-md" title="Permanent link">&para;</a></h2>
2978
+ <p>Runs a standard OpenMM simulation, with optional OpenFF/SMIRNOFF parameterization for non-standard
2979
+ molecules. For already complete systems, <code>system_preparation_mode: prepared</code> skips hydrogen,
2980
+ solvent, and ion addition and builds a snug periodic box around the provided atoms. Membrane
2981
+ systems can use OpenMM's membrane-specific barostat with <code>barostat: membrane</code>.</p>
2982
+ <p>CLI:</p>
2983
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>plain-md<span class="w"> </span>--config<span class="w"> </span>plain_md.yaml
2984
+ <a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>plain-md<span class="w"> </span>--config<span class="w"> </span>plain_md.yaml<span class="w"> </span>--backend<span class="w"> </span>slurm<span class="w"> </span>--slurm-time<span class="w"> </span><span class="m">24</span>:00:00
2985
+ </code></pre></div>
2986
+ <p>YAML:</p>
2987
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
2988
+ <a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a><span class="nt">system_pdb_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/system.pdb</span>
2989
+ <a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a><span class="nt">molecule_sdf_paths</span><span class="p">:</span>
2990
+ <a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/ligand.sdf</span>
2991
+ <a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a><span class="nt">ph</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7.4</span>
2992
+ <a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a><span class="nt">system_preparation_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">solvate</span>
2993
+ <a id="__codelineno-17-7" name="__codelineno-17-7" href="#__codelineno-17-7"></a><span class="nt">padding</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.0</span>
2994
+ <a id="__codelineno-17-8" name="__codelineno-17-8" href="#__codelineno-17-8"></a><span class="nt">ionic_strength</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.15</span>
2995
+ <a id="__codelineno-17-9" name="__codelineno-17-9" href="#__codelineno-17-9"></a><span class="nt">prepared_box_margin</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.0</span>
2996
+ <a id="__codelineno-17-10" name="__codelineno-17-10" href="#__codelineno-17-10"></a><span class="nt">nonbonded_cutoff</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.0</span>
2997
+ <a id="__codelineno-17-11" name="__codelineno-17-11" href="#__codelineno-17-11"></a><span class="nt">barostat</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">isotropic</span>
2998
+ <a id="__codelineno-17-12" name="__codelineno-17-12" href="#__codelineno-17-12"></a><span class="nt">pressure</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.0</span>
2999
+ <a id="__codelineno-17-13" name="__codelineno-17-13" href="#__codelineno-17-13"></a><span class="nt">membrane_surface_tension</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.0</span>
3000
+ <a id="__codelineno-17-14" name="__codelineno-17-14" href="#__codelineno-17-14"></a><span class="nt">membrane_xy_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">isotropic</span>
3001
+ <a id="__codelineno-17-15" name="__codelineno-17-15" href="#__codelineno-17-15"></a><span class="nt">membrane_z_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">free</span>
3002
+ <a id="__codelineno-17-16" name="__codelineno-17-16" href="#__codelineno-17-16"></a><span class="nt">barostat_frequency</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">25</span>
3003
+ <a id="__codelineno-17-17" name="__codelineno-17-17" href="#__codelineno-17-17"></a><span class="nt">temperature</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">300.0</span>
3004
+ <a id="__codelineno-17-18" name="__codelineno-17-18" href="#__codelineno-17-18"></a><span class="nt">step_size_fs</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">4</span>
3005
+ <a id="__codelineno-17-19" name="__codelineno-17-19" href="#__codelineno-17-19"></a><span class="nt">simulation_time_ns</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.0</span>
3006
+ <a id="__codelineno-17-20" name="__codelineno-17-20" href="#__codelineno-17-20"></a><span class="nt">trajectory_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traj.xtc</span>
3007
+ <a id="__codelineno-17-21" name="__codelineno-17-21" href="#__codelineno-17-21"></a><span class="nt">report_interval</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10000</span>
3008
+ <a id="__codelineno-17-22" name="__codelineno-17-22" href="#__codelineno-17-22"></a><span class="nt">checkpoint_interval</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5000</span>
3009
+ <a id="__codelineno-17-23" name="__codelineno-17-23" href="#__codelineno-17-23"></a><span class="nt">output_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
3010
+ <a id="__codelineno-17-24" name="__codelineno-17-24" href="#__codelineno-17-24"></a><span class="nt">seed</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
3011
+ <a id="__codelineno-17-25" name="__codelineno-17-25" href="#__codelineno-17-25"></a><span class="nt">repeats</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
3012
+ <a id="__codelineno-17-26" name="__codelineno-17-26" href="#__codelineno-17-26"></a><span class="nt">checkpoint_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
3013
+ <a id="__codelineno-17-27" name="__codelineno-17-27" href="#__codelineno-17-27"></a><span class="nt">max_restarts</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10</span>
3014
+ </code></pre></div>
3015
+ <p>Python:</p>
3016
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.core.execution</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_result_for_job</span><span class="p">,</span> <span class="n">submit_workflow</span>
3017
+ <a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_tool</span>
3018
+ <a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a>
3019
+ <a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a><span class="n">spec</span> <span class="o">=</span> <span class="n">get_tool</span><span class="p">(</span><span class="s2">"md"</span><span class="p">,</span> <span class="s2">"plain-md"</span><span class="p">)</span>
3020
+ <a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a><span class="n">cfg</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">config_cls</span><span class="p">(</span>
3021
+ <a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a> <span class="n">system_pdb_path</span><span class="o">=</span><span class="s2">"data/system.pdb"</span><span class="p">,</span>
3022
+ <a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a> <span class="n">molecule_sdf_paths</span><span class="o">=</span><span class="p">[</span><span class="s2">"data/ligand.sdf"</span><span class="p">],</span>
3023
+ <a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a> <span class="n">simulation_time_ns</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span>
3024
+ <a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a> <span class="n">backend</span><span class="o">=</span><span class="s2">"local"</span><span class="p">,</span>
3025
+ <a id="__codelineno-18-10" name="__codelineno-18-10" href="#__codelineno-18-10"></a><span class="p">)</span>
3026
+ <a id="__codelineno-18-11" name="__codelineno-18-11" href="#__codelineno-18-11"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">workflow_cls</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span>
3027
+ <a id="__codelineno-18-12" name="__codelineno-18-12" href="#__codelineno-18-12"></a><span class="n">job</span> <span class="o">=</span> <span class="n">submit_workflow</span><span class="p">(</span>
3028
+ <a id="__codelineno-18-13" name="__codelineno-18-13" href="#__codelineno-18-13"></a> <span class="n">workflow</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="n">backend_name</span><span class="o">=</span><span class="n">cfg</span><span class="o">.</span><span class="n">backend</span><span class="p">,</span>
3029
+ <a id="__codelineno-18-14" name="__codelineno-18-14" href="#__codelineno-18-14"></a> <span class="n">input_ports</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s2">"input_ports"</span><span class="p">,</span> <span class="p">())),</span>
3030
+ <a id="__codelineno-18-15" name="__codelineno-18-15" href="#__codelineno-18-15"></a><span class="p">)</span>
3031
+ <a id="__codelineno-18-16" name="__codelineno-18-16" href="#__codelineno-18-16"></a><span class="n">result</span> <span class="o">=</span> <span class="n">load_result_for_job</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
3032
+ <a id="__codelineno-18-17" name="__codelineno-18-17" href="#__codelineno-18-17"></a><span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
3033
+ <a id="__codelineno-18-18" name="__codelineno-18-18" href="#__codelineno-18-18"></a> <span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">metrics</span><span class="p">)</span>
3034
+ </code></pre></div>
3035
+ <p>Outputs to inspect: <code>results/output/*_prepared.pdb</code>, <code>results/output/*_minimized.pdb</code>,
3036
+ <code>results/output/traj.xtc</code>, <code>results/output/checkpoint.chk</code>, <code>results/result_record.json</code>.
3037
+ The standardized result exposes <code>prepared_structure</code>, <code>minimized_structure</code>, <code>trajectory</code>,
3038
+ <code>checkpoint</code>, and <code>output_dir</code> as pipeline-ready result paths.</p>
3039
+ <p>Set <code>repeats</code> above one to submit independent simulations with distinct reproducible seeds. The
3040
+ parent records child IDs and publishes <code>replicas_manifest.json</code> with aggregate completion metrics
3041
+ when every child reaches a terminal state. Slurm repeat children are submitted before the parent
3042
+ waits for results.</p>
3043
+ <p>For an already prepared system, use:</p>
3044
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="nt">system_preparation_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">prepared</span>
3045
+ <a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a><span class="nt">prepared_box_margin</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.0</span>
3046
+ </code></pre></div>
3047
+ <p>In this mode, <code>padding</code> and <code>ionic_strength</code> are ignored. The workflow derives an
3048
+ orthorhombic box from the existing coordinates plus <code>prepared_box_margin</code> and fails if the
3049
+ resulting box is too small for the configured nonbonded cutoff.</p>
3050
+ <p>For membrane systems oriented in the XY plane with the membrane normal along Z, use:</p>
3051
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="nt">barostat</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">membrane</span>
3052
+ <a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a><span class="nt">membrane_surface_tension</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.0</span>
3053
+ <a id="__codelineno-20-3" name="__codelineno-20-3" href="#__codelineno-20-3"></a><span class="nt">membrane_xy_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">isotropic</span>
3054
+ <a id="__codelineno-20-4" name="__codelineno-20-4" href="#__codelineno-20-4"></a><span class="nt">membrane_z_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">free</span>
3055
+ <a id="__codelineno-20-5" name="__codelineno-20-5" href="#__codelineno-20-5"></a><span class="nt">barostat_frequency</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">25</span>
3056
+ </code></pre></div>
3057
+ <h2 id="minimize"><code>minimize</code><a class="headerlink" href="#minimize" title="Permanent link">&para;</a></h2>
3058
+ <p>Minimize one protein–ligand complex with OpenMM L-BFGS. This is local pose
3059
+ cleanup: the reported physical-model energy includes implicit solvation and is
3060
+ <strong>not a binding affinity or a score for comparing different chemical systems</strong>.
3061
+ The tool emits finite poses with quality flags by default; strict mode can reject
3062
+ flagged jobs while retaining their structures and diagnostics.</p>
3063
+ <h3 id="minimize-installation-and-execution">Minimize installation and execution<a class="headerlink" href="#minimize-installation-and-execution" title="Permanent link">&para;</a></h3>
3064
+ <p>Use an environment containing AmberTools (<code>pdb4amber</code>, <code>antechamber</code>, <code>parmchk2</code>,
3065
+ <code>tleap</code>), OpenMM &gt;=8.2, ParmEd, RDKit, NumPy, SciPy, and this plugin. For example:</p>
3066
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a>conda<span class="w"> </span>create<span class="w"> </span>-n<span class="w"> </span>caddforge-minimize<span class="w"> </span>-c<span class="w"> </span>conda-forge<span class="w"> </span><span class="nv">python</span><span class="o">=</span><span class="m">3</span>.13<span class="w"> </span>ambertools<span class="w"> </span><span class="nv">openmm</span><span class="o">=</span><span class="m">8</span>.2<span class="w"> </span>parmed<span class="w"> </span>rdkit<span class="w"> </span>numpy<span class="w"> </span>scipy
3067
+ <a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a>conda<span class="w"> </span>activate<span class="w"> </span>caddforge-minimize
3068
+ <a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a><span class="c1"># Use the reviewed public checkout, which includes the Amber validation fixes.</span>
3069
+ <a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>-e<span class="w"> </span><span class="s1">'/path/to/caddforge-md[minimize]'</span>
3070
+ <a id="__codelineno-21-5" name="__codelineno-21-5" href="#__codelineno-21-5"></a>caddforge<span class="w"> </span>show-config<span class="w"> </span>md<span class="w"> </span>minimize
3071
+ <a id="__codelineno-21-6" name="__codelineno-21-6" href="#__codelineno-21-6"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>minimize<span class="w"> </span>--config<span class="w"> </span>minimize.yaml
3072
+ </code></pre></div>
3073
+ <p>Save this configuration as <code>minimize.yaml</code>, replacing the input paths:</p>
3074
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a><span class="nt">complex_pdb_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/complex.pdb</span>
3075
+ <a id="__codelineno-22-2" name="__codelineno-22-2" href="#__codelineno-22-2"></a><span class="nt">ligand_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/ligand.sdf</span>
3076
+ <a id="__codelineno-22-3" name="__codelineno-22-3" href="#__codelineno-22-3"></a><span class="nt">lig_resname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">LIG</span>
3077
+ <a id="__codelineno-22-4" name="__codelineno-22-4" href="#__codelineno-22-4"></a><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ligand_only</span>
3078
+ <a id="__codelineno-22-5" name="__codelineno-22-5" href="#__codelineno-22-5"></a><span class="nt">pocket_radius_angstrom</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5.0</span>
3079
+ <a id="__codelineno-22-6" name="__codelineno-22-6" href="#__codelineno-22-6"></a><span class="nt">shell_radius_angstrom</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5.0</span>
3080
+ <a id="__codelineno-22-7" name="__codelineno-22-7" href="#__codelineno-22-7"></a><span class="nt">backbone_restraint_strength</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">moderate</span>
3081
+ <a id="__codelineno-22-8" name="__codelineno-22-8" href="#__codelineno-22-8"></a><span class="nt">shell_restraint_strength</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">very_strong</span>
3082
+ <a id="__codelineno-22-9" name="__codelineno-22-9" href="#__codelineno-22-9"></a><span class="nt">tolerance_kj_mol_nm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.0</span>
3083
+ <a id="__codelineno-22-10" name="__codelineno-22-10" href="#__codelineno-22-10"></a><span class="nt">max_iterations</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1000</span>
3084
+ <a id="__codelineno-22-11" name="__codelineno-22-11" href="#__codelineno-22-11"></a><span class="nt">platform</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">CPU</span>
3085
+ <a id="__codelineno-22-12" name="__codelineno-22-12" href="#__codelineno-22-12"></a><span class="nt">run_directory</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">runs/minimize-one-complex</span>
3086
+ </code></pre></div>
3087
+ <p>For separate inputs, replace <code>complex_pdb_path</code> with <code>protein_pdb_path</code>; retain
3088
+ <code>ligand_path</code> in the same coordinate frame. To submit through Slurm, use
3089
+ <code>caddforge run md minimize --config minimize.yaml --backend slurm</code> with your
3090
+ site's <a href="../../core/slurm/">backend/environment settings</a>. There is no dedicated
3091
+ minimize GUI in this revision.</p>
3092
+ <p>AmberTools is installed separately from the Python extra. A prepared Amber input
3093
+ does not run AmberTools. Scientific imports are deferred until execution.
3094
+ CLI and pipeline execution use core input staging, including transparent gzip
3095
+ for declared input files. Checksums in chemistry/mapping records refer to the
3096
+ decompressed bytes. Nested cofactor chemistry paths are ordinary uncompressed
3097
+ configuration inputs and must be available on the execution node.</p>
3098
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">cadd_md.minimize</span><span class="w"> </span><span class="kn">import</span> <span class="n">MinimizeConfig</span><span class="p">,</span> <span class="n">MinimizeWorkflow</span>
3099
+ <a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a>
3100
+ <a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a><span class="n">config</span> <span class="o">=</span> <span class="n">MinimizeConfig</span><span class="p">(</span>
3101
+ <a id="__codelineno-23-4" name="__codelineno-23-4" href="#__codelineno-23-4"></a> <span class="n">complex_pdb_path</span><span class="o">=</span><span class="s2">"complex.pdb"</span><span class="p">,</span>
3102
+ <a id="__codelineno-23-5" name="__codelineno-23-5" href="#__codelineno-23-5"></a> <span class="n">ligand_path</span><span class="o">=</span><span class="s2">"ligand.sdf"</span><span class="p">,</span>
3103
+ <a id="__codelineno-23-6" name="__codelineno-23-6" href="#__codelineno-23-6"></a> <span class="n">lig_resname</span><span class="o">=</span><span class="s2">"LIG"</span><span class="p">,</span>
3104
+ <a id="__codelineno-23-7" name="__codelineno-23-7" href="#__codelineno-23-7"></a> <span class="n">mode</span><span class="o">=</span><span class="s2">"pocket_restrained"</span><span class="p">,</span>
3105
+ <a id="__codelineno-23-8" name="__codelineno-23-8" href="#__codelineno-23-8"></a> <span class="n">run_directory</span><span class="o">=</span><span class="s2">"runs/cleanup"</span><span class="p">,</span>
3106
+ <a id="__codelineno-23-9" name="__codelineno-23-9" href="#__codelineno-23-9"></a> <span class="n">registry_path</span><span class="o">=</span><span class="s2">"runs/job_registry.sqlite"</span><span class="p">,</span>
3107
+ <a id="__codelineno-23-10" name="__codelineno-23-10" href="#__codelineno-23-10"></a><span class="p">)</span>
3108
+ <a id="__codelineno-23-11" name="__codelineno-23-11" href="#__codelineno-23-11"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">MinimizeWorkflow</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
3109
+ <a id="__codelineno-23-12" name="__codelineno-23-12" href="#__codelineno-23-12"></a><span class="n">result</span> <span class="o">=</span> <span class="n">workflow</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">workflow</span><span class="o">.</span><span class="n">prepare_job</span><span class="p">())</span>
3110
+ <a id="__codelineno-23-13" name="__codelineno-23-13" href="#__codelineno-23-13"></a><span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">status</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">metrics</span><span class="p">)</span>
3111
+ <a id="__codelineno-23-14" name="__codelineno-23-14" href="#__codelineno-23-14"></a><span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">paths</span><span class="p">[</span><span class="s2">"minimized_complex"</span><span class="p">])</span>
3112
+ </code></pre></div>
3113
+ <p>Paths follow the existing config convention: relative paths resolve from the
3114
+ submission working directory. Use the core CLI/backend for Slurm submission;
3115
+ the scientific workflow contains no scheduler-specific execution logic.
3116
+ Choose a fresh <code>run_directory</code> for each run; existing minimization outputs are
3117
+ preserved and cannot be overwritten by a new job.</p>
3118
+ <h3 id="minimize-inputs-and-physical-model">Minimize inputs and physical model<a class="headerlink" href="#minimize-inputs-and-physical-model" title="Permanent link">&para;</a></h3>
3119
+ <p>Supply either <code>complex_pdb_path</code>, or <code>protein_pdb_path</code> plus a ligand pose in the
3120
+ same coordinate frame. <code>ligand_path</code> is always required and supplies authoritative
3121
+ SDF/MOL/MOL2 chemistry. For a complex PDB, coordinates come from that complex;
3122
+ template coordinates are not used to align or move the pose. For separate inputs,
3123
+ the ligand file must contain one explicitly hydrogenated 3D molecule. The target
3124
+ residue is selected by <code>lig_resname</code>, which must occur exactly once.</p>
3125
+ <p>Preparation preserves supplied atoms, protonation, ligand stereochemistry, and
3126
+ disulfides, adds only missing hydrogens, and rejects missing protein heavy atoms.
3127
+ Repair missing protein heavy atoms upstream before submitting the complex; this tool only adds missing hydrogens. Bare histidines need
3128
+ unambiguous hydrogen evidence or an explicit <code>residue_states</code> entry. Optional
3129
+ <code>protein_states_path</code> and <code>protein_links_path</code> must be provided together and match
3130
+ the input structure checksum. Covalent target ligands are rejected.</p>
3131
+ <p>Automatic preparation uses ff14SB, GAFF2/AM1-BCC, TIP3P retained waters, and OBC2
3132
+ with <code>mbondi2</code> radii, ACE surface area, solute dielectric 1, solvent dielectric
3133
+ 78.5, and zero salt screening. It is nonperiodic with <code>NoCutoff</code>; no solvent box
3134
+ or neutralizing ions are added. Retained waters are explicit solute particles in
3135
+ the GB model, a hybrid approximation requiring application-specific validation.
3136
+ All force-field choices, parameterization commands, checksums, and available
3137
+ software versions are retained.
3138
+ Both atom typing and missing-parameter lookup explicitly select GAFF2. Unresolved
3139
+ <code>parmchk2</code> parameter warnings fail preparation and require reviewed parameters.</p>
3140
+ <p>Generated GAFF2/AM1-BCC charges are checked and, when necessary, normalized
3141
+ independently for each organic component. Minimize and OpenBPMD apply a uniform
3142
+ per-atom offset only when the total correction is at most <strong>0.005 e</strong> and each
3143
+ atom changes by at most <strong>0.0001 e</strong>. These are conservative engineering limits,
3144
+ not universal scientific guarantees. Final component charges must sum to the
3145
+ authoritative formal charge within <strong>1e-8 e</strong>, and mapped charges are verified
3146
+ again after Amber topology construction. Invalid chemistry or larger residuals
3147
+ fail preparation; supplied Amber charges are never normalized.</p>
3148
+ <p>Preparation retains the original <code>*.raw.mol2</code>, the final MOL2, and a
3149
+ <code>*.charge_validation.json</code> report with raw/final sums, correction, policy limits,
3150
+ checksums, and the decision. <code>charge_validation</code> in the preparation summary links
3151
+ the reports, including rejected corrections. Applied corrections also produce a
3152
+ log warning. A residual within the charge-token rounding bound is distinguished
3153
+ from a larger generation residual; the latter is not assumed to be rounding.
3154
+ Changing <code>ligand_net_charge</code> or disabling quality checks is not a remedy for this
3155
+ error. These rules also apply to pipeline and scatter jobs without new YAML
3156
+ options.</p>
3157
+ <p>Automatic preparation also retains Antechamber's <code>ANTECHAMBER_AC.AC</code> bond
3158
+ evidence. The shared validator checks mapped atoms, coordinates, atom types,
3159
+ connectivity (including hydrogen attachments), and total formal charge against
3160
+ the authoritative ligand. A missing or inconsistent AC file fails preparation.</p>
3161
+ <p>Amber MOL2 bond tokens are not always literal chemical bond orders: for example,
3162
+ carboxylate C–O bonds can both be written as single bonds. Validation accepts
3163
+ supported Amber encodings only in their permitted chemical environments and
3164
+ requires one complete authoritative or RDKit resonance form to explain every
3165
+ bond. Aromatic/Kekulé alternatives are supported; arbitrary bond-order changes,
3166
+ tautomers, and changed protonation are not accepted. At most 1,000 candidate
3167
+ forms are examined. An inconclusive capped search fails explicitly.</p>
3168
+ <p>The charge report contains a <code>graph_validation</code> record with source checksums,
3169
+ atom mapping, candidate count, interpreted bonds, and the acceptance or rejection
3170
+ reason. The validators never rewrite bond records, atom types, coordinates, or
3171
+ the authoritative ligand. Charge normalization runs only after graph validation.
3172
+ These rules apply equally to minimize, OpenBPMD, organic cofactors, and pipeline
3173
+ jobs; no configuration override is needed for supported representations.</p>
3174
+ <p>Noncovalent organic cofactors require <code>cofactors</code> entries with <code>residue_index</code>
3175
+ and <code>chemistry_path</code>; optional <code>atom_map_path</code> uses the shared explicit atom-map
3176
+ schema against the original complex. Residue and atom indices are zero-based
3177
+ indices in <code>preparation/inputs/input_identity.json</code>, not PDB serial numbers.
3178
+ Automatic isolated ions are restricted to Na+, K+, and Cl- and require explicit
3179
+ <code>isolated_ion_residue_indices</code>. These declarations must not be used to stand in
3180
+ for a coordinated metal-site model.</p>
3181
+ <p>Coordinated metals, metall cofactors, and other supported supplied components
3182
+ use all three fields: <code>amber_topology_path</code>, <code>amber_coordinates_path</code>, and
3183
+ <code>amber_mapping_path</code>, alongside the complete input complex. The topology must
3184
+ be nonperiodic, contain all bonded/nonbonded parameters and positive GB
3185
+ radii/screening factors, and have finite charges and positive masses. Unsupported
3186
+ force forms and virtual sites fail explicitly. The supplied radii and charges
3187
+ are used without substituting automatic values. Every non-isolated metal needs
3188
+ a <code>metal_sites</code> entry containing <code>atom_index</code>, <code>oxidation_state</code>,
3189
+ <code>coordinating_atom_indices</code>, and a descriptive <code>parameter_source</code>.</p>
3190
+ <p>The prepared Amber mapping is JSON:</p>
3191
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="p">{</span>
3192
+ <a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a><span class="w"> </span><span class="nt">"schema_version"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
3193
+ <a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a><span class="w"> </span><span class="nt">"input_sha256"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SHA256 of the complex PDB"</span><span class="p">,</span>
3194
+ <a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="w"> </span><span class="nt">"topology_sha256"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SHA256 of the Amber topology"</span><span class="p">,</span>
3195
+ <a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a><span class="w"> </span><span class="nt">"coordinates_sha256"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SHA256 of the Amber coordinates"</span><span class="p">,</span>
3196
+ <a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a><span class="w"> </span><span class="nt">"input_atom_indices"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">],</span>
3197
+ <a id="__codelineno-24-7" name="__codelineno-24-7" href="#__codelineno-24-7"></a><span class="w"> </span><span class="nt">"input_residue_indices"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
3198
+ <a id="__codelineno-24-8" name="__codelineno-24-8" href="#__codelineno-24-8"></a><span class="p">}</span>
3199
+ </code></pre></div>
3200
+ <p>The arrays follow Amber topology order and must cover every input atom/residue
3201
+ exactly once. <code>null</code> is allowed only for an added hydrogen. Array lengths must
3202
+ match the actual topology; the short arrays above illustrate the schema only.
3203
+ Parameter sources and oxidation states are declarations, not an automatic
3204
+ validation of a metal model's physical accuracy.</p>
3205
+ <h3 id="minimize-regions-and-modes">Minimize regions and modes<a class="headerlink" href="#minimize-regions-and-modes" title="Permanent link">&para;</a></h3>
3206
+ <p>Pocket residues have any heavy atom within <code>pocket_radius_angstrom: 5.0</code> of any
3207
+ ligand heavy atom. The shell contains other protein residues with any heavy atom
3208
+ within <code>shell_radius_angstrom: 5.0</code> of <strong>any pocket heavy atom</strong>. Both selections
3209
+ expand to whole residues and stay fixed during minimization. An explicit
3210
+ <code>pocket_residues: ["A:42", "A:43:B"]</code> replaces automatic pocket selection;
3211
+ <code>_</code> denotes a blank chain. Unknown, duplicate, ambiguous, or empty selections fail.</p>
3212
+ <table>
3213
+ <thead>
3214
+ <tr>
3215
+ <th><code>mode</code></th>
3216
+ <th>Pocket side chains</th>
3217
+ <th>Pocket backbone</th>
3218
+ <th>Shell</th>
3219
+ </tr>
3220
+ </thead>
3221
+ <tbody>
3222
+ <tr>
3223
+ <td><code>ligand_only</code> (default)</td>
3224
+ <td>Fixed</td>
3225
+ <td>Fixed</td>
3226
+ <td>Fixed</td>
3227
+ </tr>
3228
+ <tr>
3229
+ <td><code>sidechains_free_backbone_fixed</code></td>
3230
+ <td>Free</td>
3231
+ <td>Fixed</td>
3232
+ <td>Fixed</td>
3233
+ </tr>
3234
+ <tr>
3235
+ <td><code>sidechains_free_backbone_restrained</code></td>
3236
+ <td>Free</td>
3237
+ <td>Restrained</td>
3238
+ <td>Fixed</td>
3239
+ </tr>
3240
+ <tr>
3241
+ <td><code>pocket_restrained</code></td>
3242
+ <td>Free</td>
3243
+ <td>Restrained</td>
3244
+ <td>Strongly restrained</td>
3245
+ </tr>
3246
+ <tr>
3247
+ <td><code>pocket_free_shell_restrained</code></td>
3248
+ <td>Free</td>
3249
+ <td>Free</td>
3250
+ <td>Strongly restrained</td>
3251
+ </tr>
3252
+ </tbody>
3253
+ </table>
3254
+ <p>The target ligand is free and distant protein is fixed in every mode. Backbone
3255
+ atoms are N/CA/C/O/OXT; terminal caps count as backbone. Hydrogens inherit their
3256
+ bonded parent's region. Waters, ions, metals, and cofactors are fixed by default;
3257
+ <code>component_mobility</code> permits explicit whole-residue <code>fixed</code>, <code>free</code>, or
3258
+ <code>restrained</code> overrides keyed by input residue index.</p>
3259
+ <p>Positional restraints use <strong>E = ½ k |r − r₀|²</strong>, with <strong>k in kJ mol⁻¹ nm⁻²</strong>.
3260
+ Named strengths are <code>weak: 100</code>, <code>moderate: 1000</code>, and <code>very_strong: 10000</code>;
3261
+ positive numeric strengths are accepted. <code>backbone_restraint_strength</code> defaults
3262
+ to <code>moderate</code>, and <code>shell_restraint_strength</code> to <code>very_strong</code>. They are starting
3263
+ regimes, not universally validated settings. Only heavy atoms are restrained
3264
+ unless <code>restrain_hydrogens: true</code>. Fixed regions include their hydrogens.</p>
3265
+ <p>Fixed particles have zero mass in a private minimization-system copy. The
3266
+ exported physical system retains original masses. Bonds and water geometry are
3267
+ flexible by default. <code>constraints: mobile_hbonds</code> constrains bonds involving
3268
+ hydrogen only when both endpoints are mobile, using their force-field equilibrium
3269
+ lengths and retaining the physical bonded terms. Constraints involving fixed
3270
+ atoms are rejected. Disulfide connectivity is preserved across region boundaries.</p>
3271
+ <h3 id="minimize-convergence-diagnostics-and-quality">Minimize convergence, diagnostics, and quality<a class="headerlink" href="#minimize-convergence-diagnostics-and-quality" title="Permanent link">&para;</a></h3>
3272
+ <p>Defaults are <code>tolerance_kj_mol_nm: 10.0</code>, <code>max_iterations: 1000</code>,
3273
+ <code>constraint_tolerance: 0.00001</code>, <code>platform: CPU</code>, and <code>cpu_threads: 1</code>.
3274
+ GPU platforms accept <code>precision: single|mixed|double</code> where supported. Explicitly
3275
+ requested unavailable platforms or precision settings fail instead of falling back.</p>
3276
+ <p>The iteration budget spans OpenMM constraint restarts. The trace distinguishes
3277
+ the physical-plus-positional objective from OpenMM's temporary bond-constraint
3278
+ penalty. Final convergence is independently checked using RMS force components
3279
+ over mobile atoms, projected onto the allowed constraint tangent space when
3280
+ needed, plus maximum relative constraint error. A normal OpenMM return alone
3281
+ does not establish convergence. Status is <code>verified_converged</code>, <code>iteration_limit</code>,
3282
+ <code>not_verified</code>, or <code>failed</code>; the record also reports a reached budget even if the
3283
+ last iterate independently satisfies the convergence tests.
3284
+ The implementation targets the <a href="https://github.com/openmm/openmm/blob/8.2.0/openmmapi/src/LocalEnergyMinimizer.cpp">OpenMM 8.2 minimizer and reporter behavior</a>.</p>
3285
+ <p>Diagnostics include initial/final molecular-mechanics, GB, physical, positional,
3286
+ and total objective energies; physical/total RMS and maximum forces for all,
3287
+ mobile, and fixed atoms; iteration counts; constraint errors; heavy-atom ligand,
3288
+ pocket, backbone, shell, receptor, and component RMSDs without alignment; and
3289
+ maximum displacements with atom indices. Preparation displacement is separate.
3290
+ Ordinary nonbonded clashes, 1–4 overlaps, and declared metal coordination are
3291
+ reported separately. Bonded and angle-connected contacts are excluded.</p>
3292
+ <p>Default review triggers under <code>quality_thresholds</code> are:</p>
3293
+ <table>
3294
+ <thead>
3295
+ <tr>
3296
+ <th>Field</th>
3297
+ <th>Default</th>
3298
+ </tr>
3299
+ </thead>
3300
+ <tbody>
3301
+ <tr>
3302
+ <td><code>ligand_rmsd_angstrom</code></td>
3303
+ <td>1.0</td>
3304
+ </tr>
3305
+ <tr>
3306
+ <td><code>ligand_max_displacement_angstrom</code></td>
3307
+ <td>2.0</td>
3308
+ </tr>
3309
+ <tr>
3310
+ <td><code>pocket_backbone_rmsd_angstrom</code></td>
3311
+ <td>0.5</td>
3312
+ </tr>
3313
+ <tr>
3314
+ <td><code>receptor_max_displacement_angstrom</code></td>
3315
+ <td>2.0</td>
3316
+ </tr>
3317
+ <tr>
3318
+ <td><code>absolute_energy_per_atom_kj_mol</code></td>
3319
+ <td>10000</td>
3320
+ </tr>
3321
+ <tr>
3322
+ <td><code>maximum_force_kj_mol_nm</code></td>
3323
+ <td>100000</td>
3324
+ </tr>
3325
+ <tr>
3326
+ <td><code>allowed_vdw_overlap_angstrom</code></td>
3327
+ <td>0.6</td>
3328
+ </tr>
3329
+ <tr>
3330
+ <td><code>coordination_distance_change_angstrom</code></td>
3331
+ <td>0.3</td>
3332
+ </tr>
3333
+ <tr>
3334
+ <td><code>objective_increase_absolute_kj_mol</code></td>
3335
+ <td>0.01</td>
3336
+ </tr>
3337
+ <tr>
3338
+ <td><code>objective_increase_relative</code></td>
3339
+ <td>1e-8</td>
3340
+ </tr>
3341
+ </tbody>
3342
+ </table>
3343
+ <p>These are review triggers, not universal validity bounds; geometric overlaps,
3344
+ especially 1–4 contacts, need chemical interpretation. Nonfinite states, invalid
3345
+ chemistry, or any fixed-atom movement always fail. Other findings produce
3346
+ machine-readable <code>quality_flags</code>. Set <code>strict_quality: true</code> to fail on every
3347
+ flag, or combine <code>strict_quality: true</code> with <code>strict_quality_flags</code> to fail only on selected codes such as
3348
+ <code>convergence_unverified</code>, <code>large_ligand_displacement</code>, or
3349
+ <code>residual_nonbonded_clashes</code>. Finite strict-failure poses remain available.</p>
3350
+ <h3 id="minimize-artifacts-and-pipelines">Minimize artifacts and pipelines<a class="headerlink" href="#minimize-artifacts-and-pipelines" title="Permanent link">&para;</a></h3>
3351
+ <p>Canonical results are saved in <code>results/result_record.json</code>. Scientific artifacts
3352
+ are under <code>results/minimize/</code>: <code>structures/</code> contains minimized PDB/SDF files and
3353
+ fresh handoff records; <code>preparation/</code> contains the physical system, initial
3354
+ coordinates, atom mapping, and provenance; <code>minimization/</code> contains diagnostics,
3355
+ full-precision final coordinates, and the iteration trace. Exact region membership
3356
+ is in <code>results/minimize/regions.json</code>.</p>
3357
+ <p>Pipeline input names differ from config fields:</p>
3358
+ <table>
3359
+ <thead>
3360
+ <tr>
3361
+ <th>Input port</th>
3362
+ <th>Config field</th>
3363
+ </tr>
3364
+ </thead>
3365
+ <tbody>
3366
+ <tr>
3367
+ <td><code>complex</code></td>
3368
+ <td><code>complex_pdb_path</code></td>
3369
+ </tr>
3370
+ <tr>
3371
+ <td><code>protein</code></td>
3372
+ <td><code>protein_pdb_path</code></td>
3373
+ </tr>
3374
+ <tr>
3375
+ <td><code>ligand</code></td>
3376
+ <td><code>ligand_path</code></td>
3377
+ </tr>
3378
+ <tr>
3379
+ <td><code>ligand_atom_map</code></td>
3380
+ <td><code>ligand_atom_map_path</code></td>
3381
+ </tr>
3382
+ <tr>
3383
+ <td><code>protein_states</code>, <code>protein_links</code></td>
3384
+ <td><code>protein_states_path</code>, <code>protein_links_path</code></td>
3385
+ </tr>
3386
+ <tr>
3387
+ <td><code>amber_topology</code>, <code>amber_coordinates</code>, <code>amber_mapping</code></td>
3388
+ <td><code>amber_topology_path</code>, <code>amber_coordinates_path</code>, <code>amber_mapping_path</code></td>
3389
+ </tr>
3390
+ </tbody>
3391
+ </table>
3392
+ <p>Supply exactly one structure input and a ligand chemistry file. The paired
3393
+ protein-state/link inputs and the three prepared-Amber inputs must be complete
3394
+ when provided.</p>
3395
+ <table>
3396
+ <thead>
3397
+ <tr>
3398
+ <th>Output port</th>
3399
+ <th><code>Result.paths</code> key</th>
3400
+ </tr>
3401
+ </thead>
3402
+ <tbody>
3403
+ <tr>
3404
+ <td><code>complex</code></td>
3405
+ <td><code>minimized_complex</code></td>
3406
+ </tr>
3407
+ <tr>
3408
+ <td><code>protein</code></td>
3409
+ <td><code>minimized_protein</code></td>
3410
+ </tr>
3411
+ <tr>
3412
+ <td><code>ligand</code></td>
3413
+ <td><code>minimized_ligand</code></td>
3414
+ </tr>
3415
+ <tr>
3416
+ <td><code>result_record</code></td>
3417
+ <td><code>result_record</code></td>
3418
+ </tr>
3419
+ <tr>
3420
+ <td><code>diagnostics</code></td>
3421
+ <td><code>diagnostics</code></td>
3422
+ </tr>
3423
+ </tbody>
3424
+ </table>
3425
+ <p>All other output ports below use the same name as their result-path key. Output ports expose
3426
+ <code>complex</code>, <code>protein</code>, <code>ligand</code>, <code>diagnostics</code>, <code>regions</code>, <code>atom_mapping</code>,
3427
+ <code>output_mapping</code>, <code>preparation_summary</code>, <code>physical_system</code>, <code>prepared_positions</code>,
3428
+ <code>minimized_positions</code>, <code>amber_topology</code>, <code>amber_coordinates</code>, <code>structure_manifest</code>,
3429
+ <code>protein_states</code>, <code>protein_links</code>, <code>receptor_protein_states</code>,
3430
+ <code>receptor_protein_links</code>, optional <code>iteration_trace</code>, <code>result_record</code>, and <code>output_dir</code>.
3431
+ The complex handoff records match the complex checksum; <code>receptor_*</code> records
3432
+ match the protein output. A covalently connected environment component is retained
3433
+ in the receptor export to avoid cutting chemical bonds, and this is recorded.</p>
3434
+ <p>The ligand SDF preserves chemistry, title, and user properties. PDB coordinates
3435
+ are rounded to 0.001 Å and SDF coordinates to 0.0001 Å; NumPy coordinate artifacts
3436
+ retain full precision in <strong>nanometers</strong>, in physical-system particle order. The
3437
+ Amber coordinate artifact is the prepared starting configuration. Use the
3438
+ separate minimized coordinate artifact for the final pose. The exported physical
3439
+ system contains no zero-mass freezes or positional restraints and still needs an
3440
+ appropriate MD protocol before dynamics.</p>
3441
+ <p>Download example configurations for
3442
+ <a href="../../examples/minimize/ligand_only.yaml">ligand only</a>,
3443
+ <a href="../../examples/minimize/sidechains_free_backbone_fixed.yaml">free side chains/fixed backbone</a>,
3444
+ <a href="../../examples/minimize/sidechains_free_backbone_restrained.yaml">free side chains/restrained backbone</a>,
3445
+ <a href="../../examples/minimize/pocket_restrained.yaml">restrained pocket</a>,
3446
+ <a href="../../examples/minimize/pocket_free_shell_restrained.yaml">free pocket/restrained shell</a>,
3447
+ <a href="../../examples/minimize/component_overrides.yaml">component overrides</a>, and
3448
+ <a href="../../examples/minimize/prepared_metal.yaml">supplied metal parameters</a>.
3449
+ See the <a href="../../pipelines/examples/#minimize-a-multi-pose-sdf">minimize pipeline examples</a>
3450
+ for complete YAML and artifact flow. The pipeline uses existing
3451
+ scatter/collect/filter stages and preserves per-pose provenance. Filtering quality
3452
+ flags does not establish pose accuracy; do not rank unrelated ligands by total
3453
+ minimization energy.</p>
3454
+ <p>Validation in the <code>caddforge-md</code> checkout: <code>python -m pytest tests/test_minimize_*.py</code>. Scientific fixtures use
3455
+ generated peptides/ligands and are marked <code>external</code>; optional GPU comparison
3456
+ tests skip with an explicit reason when no usable GPU platform exists.</p>
3457
+ <h2 id="openbpmd"><code>openbpmd</code><a class="headerlink" href="#openbpmd" title="Permanent link">&para;</a></h2>
3458
+ <p>Runs OpenBPMD preprocessing, simulations, and averaged multi-replica analysis.</p>
3459
+ <p>CLI:</p>
3460
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>openbpmd<span class="w"> </span>--config<span class="w"> </span>openbpmd.yaml
3461
+ </code></pre></div>
3462
+ <p>YAML:</p>
3463
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
3464
+ <a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a><span class="nt">complex_pdb_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/complex.pdb</span>
3465
+ <a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a><span class="nt">lig_resname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">MOL</span>
3466
+ <a id="__codelineno-26-4" name="__codelineno-26-4" href="#__codelineno-26-4"></a><span class="nt">ligand_net_charge</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0</span>
3467
+ <a id="__codelineno-26-5" name="__codelineno-26-5" href="#__codelineno-26-5"></a><span class="nt">nreps</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10</span>
3468
+ <a id="__codelineno-26-6" name="__codelineno-26-6" href="#__codelineno-26-6"></a><span class="nt">hill_height</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.05</span>
3469
+ <a id="__codelineno-26-7" name="__codelineno-26-7" href="#__codelineno-26-7"></a><span class="nt">deposit_interval_ps</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.0</span>
3470
+ <a id="__codelineno-26-8" name="__codelineno-26-8" href="#__codelineno-26-8"></a><span class="nt">log_sync_interval_seconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30</span>
3471
+ <a id="__codelineno-26-9" name="__codelineno-26-9" href="#__codelineno-26-9"></a><span class="nt">output_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
3472
+ <a id="__codelineno-26-10" name="__codelineno-26-10" href="#__codelineno-26-10"></a><span class="nt">analysis_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">analysis</span>
3473
+ </code></pre></div>
3474
+ <p>Python:</p>
3475
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.core.execution</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_result_for_job</span><span class="p">,</span> <span class="n">submit_workflow</span>
3476
+ <a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_tool</span>
3477
+ <a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a>
3478
+ <a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a><span class="n">spec</span> <span class="o">=</span> <span class="n">get_tool</span><span class="p">(</span><span class="s2">"md"</span><span class="p">,</span> <span class="s2">"openbpmd"</span><span class="p">)</span>
3479
+ <a id="__codelineno-27-5" name="__codelineno-27-5" href="#__codelineno-27-5"></a><span class="n">cfg</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">config_cls</span><span class="p">(</span>
3480
+ <a id="__codelineno-27-6" name="__codelineno-27-6" href="#__codelineno-27-6"></a> <span class="n">complex_pdb_path</span><span class="o">=</span><span class="s2">"data/complex.pdb"</span><span class="p">,</span>
3481
+ <a id="__codelineno-27-7" name="__codelineno-27-7" href="#__codelineno-27-7"></a> <span class="n">lig_resname</span><span class="o">=</span><span class="s2">"MOL"</span><span class="p">,</span>
3482
+ <a id="__codelineno-27-8" name="__codelineno-27-8" href="#__codelineno-27-8"></a> <span class="n">nreps</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
3483
+ <a id="__codelineno-27-9" name="__codelineno-27-9" href="#__codelineno-27-9"></a> <span class="n">hill_height</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span>
3484
+ <a id="__codelineno-27-10" name="__codelineno-27-10" href="#__codelineno-27-10"></a> <span class="n">deposit_interval_ps</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span>
3485
+ <a id="__codelineno-27-11" name="__codelineno-27-11" href="#__codelineno-27-11"></a> <span class="n">backend</span><span class="o">=</span><span class="s2">"local"</span><span class="p">,</span>
3486
+ <a id="__codelineno-27-12" name="__codelineno-27-12" href="#__codelineno-27-12"></a><span class="p">)</span>
3487
+ <a id="__codelineno-27-13" name="__codelineno-27-13" href="#__codelineno-27-13"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">workflow_cls</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span>
3488
+ <a id="__codelineno-27-14" name="__codelineno-27-14" href="#__codelineno-27-14"></a><span class="n">job</span> <span class="o">=</span> <span class="n">submit_workflow</span><span class="p">(</span>
3489
+ <a id="__codelineno-27-15" name="__codelineno-27-15" href="#__codelineno-27-15"></a> <span class="n">workflow</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="n">backend_name</span><span class="o">=</span><span class="n">cfg</span><span class="o">.</span><span class="n">backend</span><span class="p">,</span>
3490
+ <a id="__codelineno-27-16" name="__codelineno-27-16" href="#__codelineno-27-16"></a> <span class="n">input_ports</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s2">"input_ports"</span><span class="p">,</span> <span class="p">())),</span>
3491
+ <a id="__codelineno-27-17" name="__codelineno-27-17" href="#__codelineno-27-17"></a><span class="p">)</span>
3492
+ <a id="__codelineno-27-18" name="__codelineno-27-18" href="#__codelineno-27-18"></a><span class="n">result</span> <span class="o">=</span> <span class="n">load_result_for_job</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
3493
+ <a id="__codelineno-27-19" name="__codelineno-27-19" href="#__codelineno-27-19"></a><span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
3494
+ <a id="__codelineno-27-20" name="__codelineno-27-20" href="#__codelineno-27-20"></a> <span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">paths</span><span class="p">)</span>
3495
+ </code></pre></div>
3496
+ <p>Outputs to inspect: <code>prep/</code>, <code>results/output/</code>, <code>results/analysis/results.csv</code>,
3497
+ <code>results/analysis/multi_rep_timeseries.csv</code>, <code>results/progress.json</code>,
3498
+ <code>results/result_record.json</code>.</p>
3499
+ <p>OpenBPMD streams subprocess output to scratch-first logs and publishes best-effort replica progress
3500
+ from the per-replica simulation logs. <code>log_sync_interval_seconds</code> controls publication frequency;
3501
+ temporary shared-filesystem failures are retried without changing the scientific outcome.</p>
3502
+ <h2 id="grand"><code>grand</code><a class="headerlink" href="#grand" title="Permanent link">&para;</a></h2>
3503
+ <p>Runs Grand Canonical Monte Carlo (GCMC) water sampling in a ligand-centred pocket region and then
3504
+ selects a single representative protein-ligand-water structure from the resulting trajectory, all
3505
+ within one job. The tool combines two stages so you obtain a usable representative hydration state
3506
+ without a separate manual step.</p>
3507
+ <p><strong>GCMC sampling stage.</strong> The first stage prepares the input protein-ligand complex (adds hydrogens
3508
+ at the configured pH, optionally solvates with padding and ionic strength, restrains solute heavy
3509
+ atoms, and adds ghost waters) and then performs GCMC insertion and deletion sampling inside a
3510
+ ligand-centred spherical region defined by <code>sphere_radius_angstrom</code>. It uses the configured
3511
+ initialization passes and maximum production passes with a running water-count convergence check.
3512
+ The stage writes the final-state checkpoint before any trajectory readback, then produces a
3513
+ trajectory, a per-frame ghost-water state file (one row per frame listing the inactive ghost-water
3514
+ residue indices for that frame), and a hydrated-complex structure. Post-processing is non-strict: if
3515
+ it fails, the error is recorded in the stage summary while the completed checkpoint and trajectory
3516
+ are preserved so the run can continue.</p>
3517
+ <p><strong>Representative-selection stage.</strong> The second stage runs on the produced trajectory and uses the
3518
+ per-frame ghost-water state file to exclude, for each analysed frame, that frame's ghost waters from
3519
+ all downstream selection and output. It deterministically selects exactly one representative frame
3520
+ from within the configured frame analysis interval (repeated runs on the same trajectory and
3521
+ configuration select the same frame) and writes a representative complex structure containing the
3522
+ ligand residue, the protein atoms, and the active non-ghost water residues present at the selected
3523
+ frame. When a ligand template SDF and <code>ligand_resname</code> are configured, it also writes a
3524
+ template-corrected ligand SDF whose bond orders and chemistry come from the template and whose
3525
+ coordinates come from the selected frame, plus an optional protein-only structure. Template ligand
3526
+ export is non-strict: on failure the error is recorded in the selection summary and the
3527
+ representative complex is still written.</p>
3528
+ <p>CLI:</p>
3529
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>grand<span class="w"> </span>--config<span class="w"> </span>grand.yaml
3530
+ <a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>grand<span class="w"> </span>--config<span class="w"> </span>grand.yaml<span class="w"> </span>--backend<span class="w"> </span>slurm<span class="w"> </span>--slurm-time<span class="w"> </span><span class="m">24</span>:00:00
3531
+ </code></pre></div>
3532
+ <p>YAML:</p>
3533
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
3534
+ <a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a><span class="nt">complex_pdb_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/complex.pdb</span>
3535
+ <a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a><span class="nt">ligand_template_sdf</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/ligand_template.sdf</span>
3536
+ <a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a><span class="nt">ligand_resname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">LIG</span>
3537
+ <a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a><span class="nt">sphere_radius_angstrom</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.0</span>
3538
+ <a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-6"></a><span class="nt">n_ghost_waters</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">150</span>
3539
+ <a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a><span class="nt">nonbonded_cutoff_nm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.9</span>
3540
+ <a id="__codelineno-29-8" name="__codelineno-29-8" href="#__codelineno-29-8"></a><span class="nt">temperature_kelvin</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">300.0</span>
3541
+ <a id="__codelineno-29-9" name="__codelineno-29-9" href="#__codelineno-29-9"></a><span class="nt">initialization_passes</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7500</span>
3542
+ <a id="__codelineno-29-10" name="__codelineno-29-10" href="#__codelineno-29-10"></a><span class="nt">max_production_passes</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100000</span>
3543
+ <a id="__codelineno-29-11" name="__codelineno-29-11" href="#__codelineno-29-11"></a><span class="nt">ph</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7.4</span>
3544
+ <a id="__codelineno-29-12" name="__codelineno-29-12" href="#__codelineno-29-12"></a><span class="nt">padding_nm</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.2</span>
3545
+ <a id="__codelineno-29-13" name="__codelineno-29-13" href="#__codelineno-29-13"></a><span class="nt">ionic_strength_molar</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.15</span>
3546
+ <a id="__codelineno-29-14" name="__codelineno-29-14" href="#__codelineno-29-14"></a><span class="nt">ligand_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
3547
+ <a id="__codelineno-29-15" name="__codelineno-29-15" href="#__codelineno-29-15"></a><span class="nt">align_selection</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
3548
+ <a id="__codelineno-29-16" name="__codelineno-29-16" href="#__codelineno-29-16"></a><span class="nt">frame_analysis_interval</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
3549
+ <a id="__codelineno-29-17" name="__codelineno-29-17" href="#__codelineno-29-17"></a><span class="nt">log_sync_interval_seconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30</span>
3550
+ <a id="__codelineno-29-18" name="__codelineno-29-18" href="#__codelineno-29-18"></a><span class="nt">output_dir_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">output</span>
3551
+ <a id="__codelineno-29-19" name="__codelineno-29-19" href="#__codelineno-29-19"></a><span class="nt">trajectory_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">gcmc_trajectory.dcd</span>
3552
+ <a id="__codelineno-29-20" name="__codelineno-29-20" href="#__codelineno-29-20"></a><span class="nt">ghost_water_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ghost_water_state.txt</span>
3553
+ <a id="__codelineno-29-21" name="__codelineno-29-21" href="#__codelineno-29-21"></a><span class="nt">checkpoint_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">gcmc_checkpoint.chk</span>
3554
+ <a id="__codelineno-29-22" name="__codelineno-29-22" href="#__codelineno-29-22"></a><span class="nt">hydrated_complex_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">hydrated_complex.pdb</span>
3555
+ <a id="__codelineno-29-23" name="__codelineno-29-23" href="#__codelineno-29-23"></a><span class="nt">gcmc_summary_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">gcmc_summary.json</span>
3556
+ <a id="__codelineno-29-24" name="__codelineno-29-24" href="#__codelineno-29-24"></a><span class="nt">representative_complex_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">representative_complex.pdb</span>
3557
+ <a id="__codelineno-29-25" name="__codelineno-29-25" href="#__codelineno-29-25"></a><span class="nt">representative_protein_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">representative_protein.pdb</span>
3558
+ <a id="__codelineno-29-26" name="__codelineno-29-26" href="#__codelineno-29-26"></a><span class="nt">representative_ligand_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">representative_ligand.sdf</span>
3559
+ <a id="__codelineno-29-27" name="__codelineno-29-27" href="#__codelineno-29-27"></a><span class="nt">selection_summary_filename</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">selection_summary.json</span>
3560
+ </code></pre></div>
3561
+ <p>Python:</p>
3562
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.core.execution</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_result_for_job</span><span class="p">,</span> <span class="n">submit_workflow</span>
3563
+ <a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a><span class="kn">from</span><span class="w"> </span><span class="nn">caddforge.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_tool</span>
3564
+ <a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a>
3565
+ <a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a><span class="n">spec</span> <span class="o">=</span> <span class="n">get_tool</span><span class="p">(</span><span class="s2">"md"</span><span class="p">,</span> <span class="s2">"grand"</span><span class="p">)</span>
3566
+ <a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a><span class="n">cfg</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">config_cls</span><span class="p">(</span>
3567
+ <a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a> <span class="n">complex_pdb_path</span><span class="o">=</span><span class="s2">"data/complex.pdb"</span><span class="p">,</span>
3568
+ <a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a> <span class="n">ligand_template_sdf</span><span class="o">=</span><span class="s2">"data/ligand_template.sdf"</span><span class="p">,</span>
3569
+ <a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a> <span class="n">ligand_resname</span><span class="o">=</span><span class="s2">"LIG"</span><span class="p">,</span>
3570
+ <a id="__codelineno-30-9" name="__codelineno-30-9" href="#__codelineno-30-9"></a> <span class="n">sphere_radius_angstrom</span><span class="o">=</span><span class="mf">10.0</span><span class="p">,</span>
3571
+ <a id="__codelineno-30-10" name="__codelineno-30-10" href="#__codelineno-30-10"></a> <span class="n">frame_analysis_interval</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
3572
+ <a id="__codelineno-30-11" name="__codelineno-30-11" href="#__codelineno-30-11"></a> <span class="n">backend</span><span class="o">=</span><span class="s2">"local"</span><span class="p">,</span>
3573
+ <a id="__codelineno-30-12" name="__codelineno-30-12" href="#__codelineno-30-12"></a><span class="p">)</span>
3574
+ <a id="__codelineno-30-13" name="__codelineno-30-13" href="#__codelineno-30-13"></a><span class="n">workflow</span> <span class="o">=</span> <span class="n">spec</span><span class="o">.</span><span class="n">workflow_cls</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span>
3575
+ <a id="__codelineno-30-14" name="__codelineno-30-14" href="#__codelineno-30-14"></a><span class="n">job</span> <span class="o">=</span> <span class="n">submit_workflow</span><span class="p">(</span>
3576
+ <a id="__codelineno-30-15" name="__codelineno-30-15" href="#__codelineno-30-15"></a> <span class="n">workflow</span><span class="p">,</span> <span class="n">cfg</span><span class="p">,</span> <span class="n">backend_name</span><span class="o">=</span><span class="n">cfg</span><span class="o">.</span><span class="n">backend</span><span class="p">,</span>
3577
+ <a id="__codelineno-30-16" name="__codelineno-30-16" href="#__codelineno-30-16"></a> <span class="n">input_ports</span><span class="o">=</span><span class="nb">tuple</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">spec</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s2">"input_ports"</span><span class="p">,</span> <span class="p">())),</span>
3578
+ <a id="__codelineno-30-17" name="__codelineno-30-17" href="#__codelineno-30-17"></a><span class="p">)</span>
3579
+ <a id="__codelineno-30-18" name="__codelineno-30-18" href="#__codelineno-30-18"></a><span class="n">result</span> <span class="o">=</span> <span class="n">load_result_for_job</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
3580
+ <a id="__codelineno-30-19" name="__codelineno-30-19" href="#__codelineno-30-19"></a><span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
3581
+ <a id="__codelineno-30-20" name="__codelineno-30-20" href="#__codelineno-30-20"></a> <span class="nb">print</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">metrics</span><span class="p">)</span>
3582
+ </code></pre></div>
3583
+ <h3 id="configuration-options">Configuration options<a class="headerlink" href="#configuration-options" title="Permanent link">&para;</a></h3>
3584
+ <p>GCMC sampling:</p>
3585
+ <ul>
3586
+ <li><code>complex_pdb_path</code>: input protein-ligand complex PDB (required, must exist, <code>.pdb</code>).</li>
3587
+ <li><code>ligand_template_sdf</code>: ligand template SDF providing bond orders and chemistry for ligand export
3588
+ (required, must exist, <code>.sdf</code>/<code>.sd</code>).</li>
3589
+ <li><code>ligand_resname</code>: residue name identifying the ligand in the complex (required, 1-4 characters, no
3590
+ whitespace or path separators). Used by both stages.</li>
3591
+ <li><code>sphere_radius_angstrom</code>: radius of the ligand-centred sampling region (default <code>10.0</code>, <code>&gt; 0</code>).</li>
3592
+ <li><code>n_ghost_waters</code>: number of ghost waters added for insertion/deletion (default <code>150</code>, <code>&gt;= 1</code>).</li>
3593
+ <li><code>nonbonded_cutoff_nm</code>: nonbonded interaction cutoff in nanometres (default <code>0.9</code>, <code>&gt; 0</code>).</li>
3594
+ <li><code>temperature_kelvin</code>: simulation temperature in kelvin (default <code>300.0</code>, <code>&gt; 0</code>).</li>
3595
+ <li><code>initialization_passes</code>: equilibration passes before production sampling (default <code>7500</code>, <code>&gt;= 1</code>).</li>
3596
+ <li><code>max_production_passes</code>: maximum production passes (default <code>100000</code>, <code>&gt;= 1</code>).</li>
3597
+ <li><code>ph</code>: pH used when adding hydrogens during preparation (default <code>7.4</code>).</li>
3598
+ <li><code>padding_nm</code>: solvent box padding in nanometres (default <code>1.2</code>, <code>&gt; 0</code>).</li>
3599
+ <li><code>ionic_strength_molar</code>: ionic strength in molar used when solvating (default <code>0.15</code>, <code>&gt;= 0</code>).</li>
3600
+ </ul>
3601
+ <p>Representative selection:</p>
3602
+ <ul>
3603
+ <li><code>ligand_selection</code>: atom selection for the ligand. Derived from <code>ligand_resname</code>
3604
+ (<code>resname &lt;ligand_resname&gt;</code>) when left unset.</li>
3605
+ <li><code>align_selection</code>: optional atom selection used to align frames; blank is normalized to none.</li>
3606
+ <li><code>frame_analysis_interval</code>: analyse every Nth trajectory frame (default <code>1</code>, positive integer).</li>
3607
+ </ul>
3608
+ <p>Log syncing and output:</p>
3609
+ <ul>
3610
+ <li><code>log_sync_interval_seconds</code>: interval between periodic log-sync copies (default <code>30</code>, <code>1</code>-<code>3600</code>
3611
+ inclusive).</li>
3612
+ <li><code>output_dir_name</code>: directory under <code>results/</code> that holds stage outputs (default <code>output</code>, no path
3613
+ separators).</li>
3614
+ <li>Output filename fields (<code>trajectory_filename</code>, <code>ghost_water_filename</code>, <code>checkpoint_filename</code>,
3615
+ <code>hydrated_complex_filename</code>, <code>gcmc_summary_filename</code>, <code>representative_complex_filename</code>,
3616
+ <code>representative_protein_filename</code>, <code>representative_ligand_filename</code>, <code>selection_summary_filename</code>):
3617
+ plain filenames only, each with a documented default.</li>
3618
+ </ul>
3619
+ <p>All input file paths are validated and normalized to absolute paths at configuration time, so
3620
+ invalid inputs are reported before any compute job is submitted and inputs resolve correctly when
3621
+ the run executes from a scratch directory.</p>
3622
+ <h3 id="slurm-scratch-execution">Slurm scratch execution<a class="headerlink" href="#slurm-scratch-execution" title="Permanent link">&para;</a></h3>
3623
+ <p>On the Slurm backend under an allocated runtime, the workflow executes both stages inside a
3624
+ node-local scratch working directory (rooted at <code>SLURM_TMPDIR</code>) rather than on shared storage, so
3625
+ intermediate I/O does not stress the shared filesystem. When both stages finish successfully, the
3626
+ complete produced output directory is copied back from scratch to the job directory results output
3627
+ directory, preserving its relative structure, and a completeness check verifies every produced file
3628
+ was reproduced. If a stage fails after producing some outputs, those partial outputs are copied back
3629
+ on a best-effort basis and the result records whether the partial copy succeeded. The scratch
3630
+ working directory is removed after the copy-back attempt. When not running under an allocated
3631
+ runtime (for example on the local backend), both stages execute directly in the job directory
3632
+ results output directory and no copy-back is needed.</p>
3633
+ <h3 id="log-syncing">Log syncing<a class="headerlink" href="#log-syncing" title="Permanent link">&para;</a></h3>
3634
+ <p>During long runs under an allocated runtime, the stdout and stderr logs are written in the scratch
3635
+ working directory and periodically copied back to the job directory once per
3636
+ <code>log_sync_interval_seconds</code>, so you can monitor progress while the job is still running. Log-sync
3637
+ copying is resilient: a temporary copy failure is logged as a warning and never crashes the job or
3638
+ changes its status, and the next copy is attempted at the following interval. When a stage finishes,
3639
+ whether it succeeds or fails, a final copy is performed so the job directory logs reflect the final
3640
+ state of the run.</p>
3641
+ <h3 id="outputs">Outputs<a class="headerlink" href="#outputs" title="Permanent link">&para;</a></h3>
3642
+ <p>Stage outputs are written under <code>results/&lt;output_dir_name&gt;/</code>:</p>
3643
+ <ul>
3644
+ <li><code>gcmc_trajectory.dcd</code>: the GCMC sampling trajectory.</li>
3645
+ <li><code>ghost_water_state.txt</code>: per-frame ghost-water state file (one row per trajectory frame).</li>
3646
+ <li><code>gcmc_checkpoint.chk</code>: final-state checkpoint written before trajectory readback.</li>
3647
+ <li><code>hydrated_complex.pdb</code>: the hydrated-complex structure.</li>
3648
+ <li><code>gcmc_summary.json</code>: GCMC stage summary (produced paths, frame count, success/failure).</li>
3649
+ <li><code>representative_complex.pdb</code>: the selected representative protein-ligand-water complex.</li>
3650
+ <li><code>representative_protein.pdb</code>: optional protein-only representative structure.</li>
3651
+ <li><code>representative_ligand.sdf</code>: optional template-corrected representative ligand.</li>
3652
+ <li><code>selection_summary.json</code>: selection stage summary (selected frame index, success/failure).</li>
3653
+ <li><code>results/result_record.json</code> and <code>results/results.json</code>: the standardized result and a
3654
+ human-readable summary.</li>
3655
+ <li><code>results/progress.json</code>: best-effort stage, pass-count, acceptance-rate, water-count, and ETA
3656
+ snapshot.</li>
3657
+ </ul>
3658
+ <p>The standardized result exposes <code>representative_complex</code>, <code>representative_protein</code>,
3659
+ <code>representative_ligand</code>, <code>trajectory</code>, <code>checkpoint</code>, and <code>output_dir</code> as pipeline-ready result
3660
+ paths, and its <code>metrics</code> include <code>n_frames_sampled</code> and <code>representative_frame_index</code>.</p>
3661
+ <h2 id="compressed-inputs">Compressed inputs<a class="headerlink" href="#compressed-inputs" title="Permanent link">&para;</a></h2>
3662
+ <p>Declared MD structure, molecule, topology, trajectory, checkpoint, and restart inputs may use a
3663
+ trailing <code>.gz</code>. CADDForge expands transparent wrappers at runtime while preserving the original
3664
+ paths. Plain inputs retain their existing behavior.</p>
3665
+ <h2 id="inducia"><code>inducia</code><a class="headerlink" href="#inducia" title="Permanent link">&para;</a></h2>
3666
+ <p>Inducia is a composite induced-fit docking and pose-stability workflow built from PheSA, GNINA,
3667
+ GRAND, and OpenBPMD. One job accepts one three-dimensional query ligand; use pipeline scatter for a
3668
+ multi-record query library.</p>
3669
+ <p>The modes are:</p>
3670
+ <ul>
3671
+ <li><code>template</code>: run PheSA at the fixed pharmacophore-point weights 0.00 through 1.00 in steps of
3672
+ 0.05, cluster the resulting poses by direct heavy-atom RMSD in the binding coordinate frame,
3673
+ identify clashing protein residues, and minimize each representative with those residues flexible
3674
+ in GNINA.</li>
3675
+ <li><code>independent</code>: run full flexible GNINA docking in an explicit box or autobox. The flexible-residue
3676
+ radius and maximum residue count are configurable.</li>
3677
+ </ul>
3678
+ <p>Every surviving GNINA pose is hydrated by GRAND. Hydrated poses with finite GNINA CNNscores are
3679
+ ordered from highest to lowest, and <code>openbpmd.max_input_complexes</code> limits how many continue to
3680
+ OpenBPMD. Final structures are ranked by ascending OpenBPMD CompScore.</p>
3681
+ <p>CLI:</p>
3682
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a>caddforge<span class="w"> </span>show-config<span class="w"> </span>md<span class="w"> </span>inducia
3683
+ <a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a>caddforge<span class="w"> </span>run<span class="w"> </span>md<span class="w"> </span>inducia<span class="w"> </span>--config<span class="w"> </span>inducia.yaml
3684
+ </code></pre></div>
3685
+ <p>Template-mode configuration shape:</p>
3686
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">template</span>
3687
+ <a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a><span class="nt">backend</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
3688
+ <a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a><span class="nt">receptor_pdb_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/receptor.pdb</span>
3689
+ <a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a><span class="nt">query_ligand_sdf_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/query.sdf</span>
3690
+ <a id="__codelineno-32-5" name="__codelineno-32-5" href="#__codelineno-32-5"></a><span class="nt">template_ligand_sdf_path</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">data/known_binder.sdf</span>
3691
+ <a id="__codelineno-32-6" name="__codelineno-32-6" href="#__codelineno-32-6"></a><span class="nt">ligand_resname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">LIG</span>
3692
+ <a id="__codelineno-32-7" name="__codelineno-32-7" href="#__codelineno-32-7"></a><span class="nt">max_local_workers</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1</span>
3693
+ <a id="__codelineno-32-8" name="__codelineno-32-8" href="#__codelineno-32-8"></a><span class="nt">phesa</span><span class="p">:</span>
3694
+ <a id="__codelineno-32-9" name="__codelineno-32-9" href="#__codelineno-32-9"></a><span class="w"> </span><span class="nt">max_confs</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">200</span>
3695
+ <a id="__codelineno-32-10" name="__codelineno-32-10" href="#__codelineno-32-10"></a><span class="nt">clustering</span><span class="p">:</span>
3696
+ <a id="__codelineno-32-11" name="__codelineno-32-11" href="#__codelineno-32-11"></a><span class="w"> </span><span class="nt">rmsd_cutoff_angstrom</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.0</span>
3697
+ <a id="__codelineno-32-12" name="__codelineno-32-12" href="#__codelineno-32-12"></a><span class="nt">clash_detection</span><span class="p">:</span>
3698
+ <a id="__codelineno-32-13" name="__codelineno-32-13" href="#__codelineno-32-13"></a><span class="w"> </span><span class="nt">allowed_vdw_overlap_angstrom</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.4</span>
3699
+ <a id="__codelineno-32-14" name="__codelineno-32-14" href="#__codelineno-32-14"></a><span class="nt">gnina</span><span class="p">:</span>
3700
+ <a id="__codelineno-32-15" name="__codelineno-32-15" href="#__codelineno-32-15"></a><span class="w"> </span><span class="nt">cnn_scoring</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">rescore</span>
3701
+ <a id="__codelineno-32-16" name="__codelineno-32-16" href="#__codelineno-32-16"></a><span class="w"> </span><span class="nt">pose_sort_order</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">CNNscore</span>
3702
+ <a id="__codelineno-32-17" name="__codelineno-32-17" href="#__codelineno-32-17"></a><span class="nt">grand</span><span class="p">:</span>
3703
+ <a id="__codelineno-32-18" name="__codelineno-32-18" href="#__codelineno-32-18"></a><span class="w"> </span><span class="nt">sphere_radius_angstrom</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10.0</span>
3704
+ <a id="__codelineno-32-19" name="__codelineno-32-19" href="#__codelineno-32-19"></a><span class="w"> </span><span class="nt">n_ghost_waters</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">150</span>
3705
+ <a id="__codelineno-32-20" name="__codelineno-32-20" href="#__codelineno-32-20"></a><span class="w"> </span><span class="nt">initialization_passes</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">7500</span>
3706
+ <a id="__codelineno-32-21" name="__codelineno-32-21" href="#__codelineno-32-21"></a><span class="w"> </span><span class="nt">max_production_passes</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">100000</span>
3707
+ <a id="__codelineno-32-22" name="__codelineno-32-22" href="#__codelineno-32-22"></a><span class="nt">openbpmd</span><span class="p">:</span>
3708
+ <a id="__codelineno-32-23" name="__codelineno-32-23" href="#__codelineno-32-23"></a><span class="w"> </span><span class="nt">max_input_complexes</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">null</span>
3709
+ <a id="__codelineno-32-24" name="__codelineno-32-24" href="#__codelineno-32-24"></a><span class="w"> </span><span class="nt">nreps</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">10</span>
3710
+ <a id="__codelineno-32-25" name="__codelineno-32-25" href="#__codelineno-32-25"></a><span class="w"> </span><span class="nt">hill_height</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">0.05</span>
3711
+ <a id="__codelineno-32-26" name="__codelineno-32-26" href="#__codelineno-32-26"></a><span class="w"> </span><span class="nt">deposit_interval_ps</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">1.0</span>
3712
+ <a id="__codelineno-32-27" name="__codelineno-32-27" href="#__codelineno-32-27"></a><span class="nt">progress</span><span class="p">:</span>
3713
+ <a id="__codelineno-32-28" name="__codelineno-32-28" href="#__codelineno-32-28"></a><span class="w"> </span><span class="nt">interval_seconds</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">30</span>
3714
+ </code></pre></div>
3715
+ <p>Independent mode replaces <code>template_ligand_sdf_path</code> with either <code>autobox_ligand_path</code> or both
3716
+ <code>box_center</code> and <code>box_size</code>. Its GNINA settings include
3717
+ <code>independent_flex_radius_angstrom</code> (default <code>3.5</code>) and
3718
+ <code>independent_max_flexible_residues</code> (default <code>12</code>).</p>
3719
+ <p>Child phases use at most <code>max_local_workers</code> locally. With Slurm, all siblings in a phase are
3720
+ submitted before monitoring begins. Parent stdout records phase lifecycle, child IDs and statuses,
3721
+ heartbeats, concise child progress, completion, and failure information. Follow it with
3722
+ <code>caddforge logs &lt;job-id&gt; --follow</code>; detailed command logs remain in the child directories.</p>
3723
+ <p>Structured events are written to <code>results/inducia_progress.jsonl</code>. Temporary registry or shared
3724
+ filesystem failures are treated as monitoring outages and retried. Allocated-runtime publication
3725
+ copies file content without filesystem metadata for CIFS compatibility and verifies it by SHA-256.</p>
3726
+ <p>Primary outputs are <code>best_complex</code>, <code>best_protein</code>, <code>best_ligand</code>, <code>ranking_table</code>,
3727
+ <code>pose_manifest</code>, ranked complex/protein/ligand path collections, and <code>output_dir</code>. The complete pose
3728
+ manifest retains PheSA scores, cluster membership, flexible residues, all child jobs and statuses,
3729
+ CNNscore shortlist rank, GRAND/OpenBPMD artifacts, CompScore, and failure provenance.</p>
3730
+ <p>Inducia requires <code>caddforge-core&gt;=0.21.0</code>, <code>caddforge-descriptors&gt;=0.8.0</code>, and
3731
+ <code>caddforge-docking&gt;=0.3.0</code>, plus the external scientific runtimes required by PheSA, GNINA, GRAND,
3732
+ OpenMM, AmberTools, and OpenBPMD.</p>
3733
+
3734
+
3735
+
3736
+
3737
+
3738
+
3739
+
3740
+
3741
+
3742
+
3743
+
3744
+
3745
+
3746
+ </article>
3747
+ </div>
3748
+
3749
+
3750
+ <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
3751
+ </div>
3752
+
3753
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
3754
+
3755
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
3756
+ Back to top
3757
+ </button>
3758
+
3759
+ </main>
3760
+
3761
+ <footer class="md-footer">
3762
+
3763
+ <div class="md-footer-meta md-typeset">
3764
+ <div class="md-footer-meta__inner md-grid">
3765
+ <div class="md-copyright">
3766
+
3767
+
3768
+ Made with
3769
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
3770
+ Material for MkDocs
3771
+ </a>
3772
+
3773
+ </div>
3774
+
3775
+ </div>
3776
+ </div>
3777
+ </footer>
3778
+
3779
+ </div>
3780
+ <div class="md-dialog" data-md-component="dialog">
3781
+ <div class="md-dialog__inner md-typeset"></div>
3782
+ </div>
3783
+
3784
+
3785
+
3786
+
3787
+
3788
+ <script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.instant", "navigation.sections", "navigation.indexes", "navigation.top", "search.highlight", "search.suggest", "content.code.copy"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
3789
+
3790
+
3791
+ <script src="../../assets/javascripts/bundle.d7400e89.min.js"></script>
3792
+
3793
+
3794
+ </body>
3795
+ </html>