atomworks-studio 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. atomworks_studio-0.0.1/.gitignore +25 -0
  2. atomworks_studio-0.0.1/LICENSE.md +31 -0
  3. atomworks_studio-0.0.1/PKG-INFO +117 -0
  4. atomworks_studio-0.0.1/README.md +91 -0
  5. atomworks_studio-0.0.1/examples/README.md +15 -0
  6. atomworks_studio-0.0.1/examples/space/README.md +33 -0
  7. atomworks_studio-0.0.1/hatch_build.py +45 -0
  8. atomworks_studio-0.0.1/packages/api/README.md +13 -0
  9. atomworks_studio-0.0.1/packages/api/annotation_studio/__init__.py +30 -0
  10. atomworks_studio-0.0.1/packages/api/annotation_studio/cli.py +31 -0
  11. atomworks_studio-0.0.1/packages/api/annotation_studio/contracts.py +48 -0
  12. atomworks_studio-0.0.1/packages/api/annotation_studio/core.py +10 -0
  13. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/README.md +21 -0
  14. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/antibody_design.cif +9646 -0
  15. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/enzyme_design.cif +207 -0
  16. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/examples.json +56 -0
  17. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/inverse_folding.cif +726 -0
  18. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/motif_scaffolding.cif +270 -0
  19. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/nanobody.cif +5777 -0
  20. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/protein_binder.cif +2858 -0
  21. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/small_molecule_binder.cif +251 -0
  22. atomworks_studio-0.0.1/packages/api/annotation_studio/examples/unconditional.cif +78 -0
  23. atomworks_studio-0.0.1/packages/api/annotation_studio/gradio.py +259 -0
  24. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/ACCEPTANCE.html +181 -0
  25. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/ARCHITECTURE.html +158 -0
  26. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/DEVELOPMENT.html +238 -0
  27. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/INPUTS.html +117 -0
  28. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/INSTALLATION.html +223 -0
  29. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/INTEGRATIONS.html +292 -0
  30. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/PROVENANCE.html +205 -0
  31. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/PYMOL.html +240 -0
  32. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/RELEASE.html +190 -0
  33. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/SELECTIONS.html +270 -0
  34. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/TUTORIAL.html +187 -0
  35. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/VSCODE.html +166 -0
  36. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/WEB.html +332 -0
  37. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_images/web-annotations.png +0 -0
  38. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_images/web-embedded.png +0 -0
  39. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_images/web-molstar-editor.png +0 -0
  40. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/ACCEPTANCE.md.txt +91 -0
  41. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/ARCHITECTURE.md.txt +43 -0
  42. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/DEVELOPMENT.md.txt +158 -0
  43. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/INPUTS.md.txt +16 -0
  44. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/INSTALLATION.md.txt +121 -0
  45. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/INTEGRATIONS.md.txt +191 -0
  46. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/PROVENANCE.md.txt +110 -0
  47. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/PYMOL.md.txt +130 -0
  48. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/RELEASE.md.txt +94 -0
  49. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/SELECTIONS.md.txt +144 -0
  50. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/TUTORIAL.md.txt +88 -0
  51. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/VSCODE.md.txt +65 -0
  52. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/WEB.md.txt +249 -0
  53. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_sources/index.md.txt +48 -0
  54. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/alabaster.css +663 -0
  55. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/base-stemmer.js +476 -0
  56. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/basic.css +906 -0
  57. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/custom.css +1 -0
  58. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/doctools.js +150 -0
  59. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/documentation_options.js +13 -0
  60. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/english-stemmer.js +1066 -0
  61. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/file.png +0 -0
  62. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/github-banner.svg +5 -0
  63. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/language_data.js +13 -0
  64. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/minus.png +0 -0
  65. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/plus.png +0 -0
  66. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/pygments.css +84 -0
  67. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/searchtools.js +693 -0
  68. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/sphinx_highlight.js +159 -0
  69. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/studio.css +50 -0
  70. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/_static/studio.js +41 -0
  71. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/genindex.html +105 -0
  72. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/index.html +158 -0
  73. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/objects.inv +0 -0
  74. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/search.html +122 -0
  75. atomworks_studio-0.0.1/packages/api/annotation_studio/guide/searchindex.js +1 -0
  76. atomworks_studio-0.0.1/packages/api/annotation_studio/identity.py +19 -0
  77. atomworks_studio-0.0.1/packages/api/annotation_studio/main.py +1032 -0
  78. atomworks_studio-0.0.1/packages/api/annotation_studio/version.py +12 -0
  79. atomworks_studio-0.0.1/packages/api/annotation_studio/web/annotation-studio.svg +17 -0
  80. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/annotation_studio_core_bg-0zBgLIOf.wasm +0 -0
  81. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/cells-D9Q81GMa.jpg +0 -0
  82. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/index-ChG0NGAU.js +21 -0
  83. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/index-DCmII2EW.css +1 -0
  84. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/molstar-BK3R50bs.css +2 -0
  85. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/molstar-DEH5SZOb.js +8279 -0
  86. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/nebula_back6-DGSZ_tzT.jpg +0 -0
  87. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/nebula_bottom4-DgUpJxjp.jpg +0 -0
  88. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/nebula_front5-CWqbzonZ.jpg +0 -0
  89. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/nebula_left2-Da3VdN9a.jpg +0 -0
  90. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/nebula_right1-BWVtsnot.jpg +0 -0
  91. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/nebula_top3-CfldhfdM.jpg +0 -0
  92. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/patinae-B89qSVJA.js +97 -0
  93. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/patinae_web-BJnzZAZI-BErUWgRs.js +2 -0
  94. atomworks_studio-0.0.1/packages/api/annotation_studio/web/assets/patinae_web_bg.wasm +0 -0
  95. atomworks_studio-0.0.1/packages/api/annotation_studio/web/atomworks_logo_dark.svg +1 -0
  96. atomworks_studio-0.0.1/packages/api/annotation_studio/web/index.html +385 -0
  97. atomworks_studio-0.0.1/packages/api/annotation_studio/web/manifest.webmanifest +18 -0
  98. atomworks_studio-0.0.1/packages/api/annotation_studio/web/sw.js +32 -0
  99. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/__init__.py +1 -0
  100. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/annotation_palette.json +30 -0
  101. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/annotations.py +68 -0
  102. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/conditions.py +47 -0
  103. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/contracts.py +127 -0
  104. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/document.py +1511 -0
  105. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/layout.py +7 -0
  106. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/loading.py +200 -0
  107. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/mutations.py +111 -0
  108. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/providers.py +37 -0
  109. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/query.py +45 -0
  110. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/structure_mutations.py +144 -0
  111. atomworks_studio-0.0.1/packages/editing/atomworks_studio_editing/validation.py +70 -0
  112. atomworks_studio-0.0.1/packages/patinae-plugin/README.md +52 -0
  113. atomworks_studio-0.0.1/packages/pymol-plugin/README.md +11 -0
  114. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/__init__.py +127 -0
  115. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/__main__.py +6 -0
  116. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/bond_wizard.py +427 -0
  117. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/bridge.py +426 -0
  118. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/chain_wizard.py +179 -0
  119. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/charge_wizard.py +216 -0
  120. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/commands.py +148 -0
  121. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/display.py +336 -0
  122. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/editors/__init__.py +105 -0
  123. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/editors/custom.py +36 -0
  124. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/editors/widgets.py +707 -0
  125. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/extensions.py +121 -0
  126. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/installation.py +76 -0
  127. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/panel.py +1349 -0
  128. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/pymol_env.yaml +12 -0
  129. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/state.py +220 -0
  130. atomworks_studio-0.0.1/packages/pymol-plugin/atomworks_studio_pymol/views.py +196 -0
  131. atomworks_studio-0.0.1/providers/rfd4/UPSTREAM.toml +10 -0
  132. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/__init__.py +95 -0
  133. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/_upstream/LICENSE +28 -0
  134. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/_upstream/data/cath_label_mapping.pkl +0 -0
  135. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/_upstream/src/rfproteina/conditions.py +521 -0
  136. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/_upstream/src/rfproteina/utils/parse_presets.py +90 -0
  137. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/_upstream/src/rfproteina/utils/standard_annotations.py +142 -0
  138. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/condition_contract.py +241 -0
  139. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/generation.py +76 -0
  140. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/interactive_validation.py +22 -0
  141. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/internal_coordinate.py +113 -0
  142. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/model.py +58 -0
  143. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/__init__.py +1 -0
  144. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/cath_editor.py +50 -0
  145. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/chain_centroid_editor.py +257 -0
  146. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/condition_registry.py +132 -0
  147. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/coordinate_edit.py +25 -0
  148. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/document_editors.py +96 -0
  149. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/editors.py +45 -0
  150. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/group_editor.py +213 -0
  151. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/internal_coord_editor.py +95 -0
  152. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/visualize.py +123 -0
  153. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/pymol/widgets.py +106 -0
  154. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/reporting.py +200 -0
  155. atomworks_studio-0.0.1/providers/rfd4/atomworks_studio_rfd4/sequence_probability.py +235 -0
  156. atomworks_studio-0.0.1/pyproject.toml +97 -0
  157. atomworks_studio-0.0.1/src/atomworks_studio/__init__.py +1 -0
  158. atomworks_studio-0.0.1/src/atomworks_studio/__main__.py +6 -0
@@ -0,0 +1,25 @@
1
+ **/__pycache__/
2
+ **/.pytest_cache/
3
+ **/.ruff_cache/
4
+ **/target/
5
+ **/node_modules
6
+ **/dist/
7
+ **/build/
8
+ **/*.egg-info/
9
+ *.vsix
10
+ *.whl
11
+ *.tgz
12
+ !packages/web/vendor/patinae-viewer-0.5.1-studio.1.tgz
13
+ artifacts/
14
+ .cache/
15
+ .coverage
16
+ .env
17
+ packages/web/src/wasm/
18
+ !packages/web/public/annotation-studio.svg
19
+
20
+ .venv/
21
+
22
+ docs/_build/
23
+
24
+ external/
25
+ examples/space/wheels/
@@ -0,0 +1,31 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Institute for Protein Design, University of Washington
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ Third-party dependencies and the Patinae patch series retain their respective
31
+ licenses. See `docs/PROVENANCE.md` and `vendor/patinae/UPSTREAM.toml`.
@@ -0,0 +1,117 @@
1
+ Metadata-Version: 2.5
2
+ Name: atomworks-studio
3
+ Version: 0.0.1
4
+ Summary: Inspect and edit annotated molecular structures
5
+ Project-URL: Documentation, https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/index.md
6
+ Project-URL: Source, https://github.com/RosettaCommons/atomworks-studio
7
+ License-Expression: BSD-3-Clause
8
+ License-File: LICENSE.md
9
+ Requires-Python: <3.13,>=3.12
10
+ Requires-Dist: atomworks[ml]==3.0.1
11
+ Requires-Dist: fastapi<2,>=0.115
12
+ Requires-Dist: numpy<3,>=1.26
13
+ Requires-Dist: pydantic<3,>=2.10
14
+ Requires-Dist: python-multipart<1,>=0.0.20
15
+ Requires-Dist: uvicorn<1,>=0.34
16
+ Provides-Extra: gradio
17
+ Requires-Dist: gradio<7,>=6.29; extra == 'gradio'
18
+ Requires-Dist: httpx<1,>=0.28; extra == 'gradio'
19
+ Provides-Extra: pymol-pip
20
+ Requires-Dist: pymol-open-source>=3.2.0a0; extra == 'pymol-pip'
21
+ Requires-Dist: pyqt5>=5.15.11; extra == 'pymol-pip'
22
+ Provides-Extra: test
23
+ Requires-Dist: httpx2<3,>=2.8; extra == 'test'
24
+ Requires-Dist: pytest<10,>=8.2; extra == 'test'
25
+ Description-Content-Type: text/markdown
26
+
27
+ <h1 align="center">AtomWorks Studio</h1>
28
+
29
+ <p align="center"><b>Inspect, annotate and edit molecular structures in a browser, VS Code or PyMOL.</b></p>
30
+
31
+ <p align="center">
32
+ <a href="https://github.com/RosettaCommons/atomworks-studio/actions/workflows/ci.yaml"><img src="https://github.com/RosettaCommons/atomworks-studio/actions/workflows/ci.yaml/badge.svg" alt="CI"></a>
33
+ <a href="https://pypi.org/project/atomworks-studio/"><img src="https://img.shields.io/pypi/v/atomworks-studio.svg" alt="PyPI"></a>
34
+ <a href="https://pypi.org/project/atomworks-studio/"><img src="https://img.shields.io/pypi/pyversions/atomworks-studio.svg" alt="Python"></a>
35
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/LICENSE.md"><img src="https://img.shields.io/badge/license-BSD--3--Clause-blue.svg" alt="License: BSD-3-Clause"></a>
36
+ <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
37
+ </p>
38
+
39
+ <p align="center">
40
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/index.md">Documentation</a> ·
41
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/INSTALLATION.md">Installation</a> ·
42
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/TUTORIAL.md">Tutorial</a>
43
+ </p>
44
+
45
+ <p align="center"><img src="https://raw.githubusercontent.com/RosettaCommons/atomworks-studio/main/docs/images/web-molstar-editor.png" alt="AtomWorks Studio in the browser: sequence view, Mol* viewer and annotation panel" width="860"></p>
46
+
47
+ Studio is a structure and annotation editor for [AtomWorks](https://github.com/RosettaCommons/atomworks)
48
+ annotated CIF files. Select atoms, attach conditioning annotations (sequence, coordinates, hotspots,
49
+ index groups and more), fix bonds and charges, protonate, edit chains and expandable segments, and save a
50
+ CIF that any Studio interface reopens. It is built for preparing inputs to structure-design models such as
51
+ [RFD4-Proteina](https://github.com/RosettaCommons/RFD4-Proteina). No model runtime or weights are needed.
52
+
53
+ ## Features
54
+
55
+ - **One editor, three interfaces.** The browser, VS Code and native PyMOL share annotation definitions,
56
+ editing operations, CIF storage and Undo.
57
+ - **Annotations you can see.** Pick a condition, apply it to a selection, and color or inspect the stored values.
58
+ - **Selections with AtomWorks queries.** Expressions such as `chain_id == 'A' & res_id > 50` work everywhere.
59
+ - **Structure edits with Undo.** Bonds, charges, pH-based protonation, chains, segments and validation.
60
+ - **Two renderers in the browser.** Mol* (WebGL) by default and Patinae (WebGPU), both bundled.
61
+ - **Design-ready examples.** Protein and small-molecule binders, antibody and nanobody CDRs, enzyme motifs,
62
+ motif scaffolding, inverse folding and partial diffusion.
63
+ - **Optional Gradio host.** Adds generation controls around the same editor for hosted demos and Spaces.
64
+
65
+ ## Install
66
+
67
+ Studio needs Python 3.12.
68
+
69
+ ```bash
70
+ python -m pip install atomworks-studio
71
+ atomworks-studio
72
+ ```
73
+
74
+ Open <http://127.0.0.1:8000/>. The guide is at <http://127.0.0.1:8000/guide/>. Mol* and Patinae are
75
+ included in the package; Node and Rust are only needed to build from source.
76
+
77
+ <table>
78
+ <tr>
79
+ <td width="50%"><b>Browser and VS Code</b><br>Run <code>atomworks-studio</code>, or install the VSIX from the
80
+ <a href="https://github.com/RosettaCommons/atomworks-studio/releases">releases</a> and run
81
+ <b>AtomWorks: Open Studio</b>. The extension starts its Python backend for you.</td>
82
+ <td width="50%"><b>PyMOL</b><br>Install the package in PyMOL's Python environment, run
83
+ <code>atomworks-studio-pymol install</code>, then open <b>Plugin → AtomWorks Studio</b>.
84
+ PyMOL and Qt come from your PyMOL installation.</td>
85
+ </tr>
86
+ </table>
87
+
88
+ ## Use
89
+
90
+ Open a CIF, select atoms, and choose an annotation in **Edit → Annotations**. Inspect the stored values,
91
+ change bonds or charges, protonate, or edit chains and segments. **Save CIF** writes a file that opens in any
92
+ interface.
93
+
94
+ <p align="center"><img src="https://raw.githubusercontent.com/RosettaCommons/atomworks-studio/main/docs/images/web-annotations.png" alt="Annotations tab showing sequence, coordinate and hotspot conditioning counts" width="860"></p>
95
+
96
+ The PyMOL plugin offers the same controls natively, here on a nanobody design with a hotspot on the target:
97
+
98
+ <p align="center"><img src="https://raw.githubusercontent.com/RosettaCommons/atomworks-studio/main/packages/pymol-plugin/assets/antibody_design.png" alt="AtomWorks Studio panel inside PyMOL on a nanobody design" width="860"></p>
99
+
100
+ See the [documentation](https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/index.md) for selection syntax, interface guides, Python and HTTP
101
+ integration, and development notes.
102
+
103
+ ## Build from source
104
+
105
+ ```bash
106
+ make bootstrap
107
+ make test
108
+ make build
109
+ make run
110
+ ```
111
+
112
+ The RFD4 annotation definitions and license are bundled in source and release builds and verified against the
113
+ SHA-256 hashes in `providers/rfd4/UPSTREAM.toml`. See [provenance](https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/PROVENANCE.md).
114
+
115
+ ## License
116
+
117
+ BSD-3-Clause. See [LICENSE.md](https://github.com/RosettaCommons/atomworks-studio/blob/main/LICENSE.md).
@@ -0,0 +1,91 @@
1
+ <h1 align="center">AtomWorks Studio</h1>
2
+
3
+ <p align="center"><b>Inspect, annotate and edit molecular structures in a browser, VS Code or PyMOL.</b></p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/RosettaCommons/atomworks-studio/actions/workflows/ci.yaml"><img src="https://github.com/RosettaCommons/atomworks-studio/actions/workflows/ci.yaml/badge.svg" alt="CI"></a>
7
+ <a href="https://pypi.org/project/atomworks-studio/"><img src="https://img.shields.io/pypi/v/atomworks-studio.svg" alt="PyPI"></a>
8
+ <a href="https://pypi.org/project/atomworks-studio/"><img src="https://img.shields.io/pypi/pyversions/atomworks-studio.svg" alt="Python"></a>
9
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/LICENSE.md"><img src="https://img.shields.io/badge/license-BSD--3--Clause-blue.svg" alt="License: BSD-3-Clause"></a>
10
+ <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
11
+ </p>
12
+
13
+ <p align="center">
14
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/index.md">Documentation</a> ·
15
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/INSTALLATION.md">Installation</a> ·
16
+ <a href="https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/TUTORIAL.md">Tutorial</a>
17
+ </p>
18
+
19
+ <p align="center"><img src="https://raw.githubusercontent.com/RosettaCommons/atomworks-studio/main/docs/images/web-molstar-editor.png" alt="AtomWorks Studio in the browser: sequence view, Mol* viewer and annotation panel" width="860"></p>
20
+
21
+ Studio is a structure and annotation editor for [AtomWorks](https://github.com/RosettaCommons/atomworks)
22
+ annotated CIF files. Select atoms, attach conditioning annotations (sequence, coordinates, hotspots,
23
+ index groups and more), fix bonds and charges, protonate, edit chains and expandable segments, and save a
24
+ CIF that any Studio interface reopens. It is built for preparing inputs to structure-design models such as
25
+ [RFD4-Proteina](https://github.com/RosettaCommons/RFD4-Proteina). No model runtime or weights are needed.
26
+
27
+ ## Features
28
+
29
+ - **One editor, three interfaces.** The browser, VS Code and native PyMOL share annotation definitions,
30
+ editing operations, CIF storage and Undo.
31
+ - **Annotations you can see.** Pick a condition, apply it to a selection, and color or inspect the stored values.
32
+ - **Selections with AtomWorks queries.** Expressions such as `chain_id == 'A' & res_id > 50` work everywhere.
33
+ - **Structure edits with Undo.** Bonds, charges, pH-based protonation, chains, segments and validation.
34
+ - **Two renderers in the browser.** Mol* (WebGL) by default and Patinae (WebGPU), both bundled.
35
+ - **Design-ready examples.** Protein and small-molecule binders, antibody and nanobody CDRs, enzyme motifs,
36
+ motif scaffolding, inverse folding and partial diffusion.
37
+ - **Optional Gradio host.** Adds generation controls around the same editor for hosted demos and Spaces.
38
+
39
+ ## Install
40
+
41
+ Studio needs Python 3.12.
42
+
43
+ ```bash
44
+ python -m pip install atomworks-studio
45
+ atomworks-studio
46
+ ```
47
+
48
+ Open <http://127.0.0.1:8000/>. The guide is at <http://127.0.0.1:8000/guide/>. Mol* and Patinae are
49
+ included in the package; Node and Rust are only needed to build from source.
50
+
51
+ <table>
52
+ <tr>
53
+ <td width="50%"><b>Browser and VS Code</b><br>Run <code>atomworks-studio</code>, or install the VSIX from the
54
+ <a href="https://github.com/RosettaCommons/atomworks-studio/releases">releases</a> and run
55
+ <b>AtomWorks: Open Studio</b>. The extension starts its Python backend for you.</td>
56
+ <td width="50%"><b>PyMOL</b><br>Install the package in PyMOL's Python environment, run
57
+ <code>atomworks-studio-pymol install</code>, then open <b>Plugin → AtomWorks Studio</b>.
58
+ PyMOL and Qt come from your PyMOL installation.</td>
59
+ </tr>
60
+ </table>
61
+
62
+ ## Use
63
+
64
+ Open a CIF, select atoms, and choose an annotation in **Edit → Annotations**. Inspect the stored values,
65
+ change bonds or charges, protonate, or edit chains and segments. **Save CIF** writes a file that opens in any
66
+ interface.
67
+
68
+ <p align="center"><img src="https://raw.githubusercontent.com/RosettaCommons/atomworks-studio/main/docs/images/web-annotations.png" alt="Annotations tab showing sequence, coordinate and hotspot conditioning counts" width="860"></p>
69
+
70
+ The PyMOL plugin offers the same controls natively, here on a nanobody design with a hotspot on the target:
71
+
72
+ <p align="center"><img src="https://raw.githubusercontent.com/RosettaCommons/atomworks-studio/main/packages/pymol-plugin/assets/antibody_design.png" alt="AtomWorks Studio panel inside PyMOL on a nanobody design" width="860"></p>
73
+
74
+ See the [documentation](https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/index.md) for selection syntax, interface guides, Python and HTTP
75
+ integration, and development notes.
76
+
77
+ ## Build from source
78
+
79
+ ```bash
80
+ make bootstrap
81
+ make test
82
+ make build
83
+ make run
84
+ ```
85
+
86
+ The RFD4 annotation definitions and license are bundled in source and release builds and verified against the
87
+ SHA-256 hashes in `providers/rfd4/UPSTREAM.toml`. See [provenance](https://github.com/RosettaCommons/atomworks-studio/blob/main/docs/PROVENANCE.md).
88
+
89
+ ## License
90
+
91
+ BSD-3-Clause. See [LICENSE.md](https://github.com/RosettaCommons/atomworks-studio/blob/main/LICENSE.md).
@@ -0,0 +1,15 @@
1
+ # Example structures
2
+
3
+ The **Edit → Examples** menu uses the packaged catalog in
4
+ `packages/api/annotation_studio/examples/`. The PD-L1 protein binder and eight
5
+ NIM inputs also power the Gradio demo; model execution is optional.
6
+
7
+ The files below remain regression fixtures and can be opened with **Open CIF**:
8
+
9
+ - `mcsa_ph2.cif`: catalytic residues and PH2 ligand with a 180 residue expandable
10
+ segment. Source: RFD4 `mcsa_40_fixed_ligand.json:M0664_2dhn`.
11
+ - `disco_iai.cif`: IAI ligand with a 150 residue expandable segment.
12
+ Source: RFD4 `sm_binder.json:IAI`.
13
+
14
+ The files illustrate stored annotations, ligand editing, and expandable segments.
15
+ They open in browser, VS Code, and PyMOL without a model runtime.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: AtomWorks Studio
3
+ sdk: docker
4
+ app_port: 7860
5
+ ---
6
+
7
+ # AtomWorks Studio
8
+
9
+ This Docker Space runs the same editor and guide as the installed application.
10
+ It edits structures; it does not run a model.
11
+
12
+ Copy this directory to a Docker Space. Put the `atomworks_studio` wheel from a verified Studio build (or the
13
+ matching release download) in `wheels/`.
14
+ Once the version you deploy is on PyPI, you can instead replace the `COPY` and
15
+ wheel `pip install` lines in the Dockerfile with `pip install atomworks-studio==<version>`.
16
+ The Docker build installs public dependencies and runs as UID 1000 on port 7860.
17
+
18
+ To test locally from this directory:
19
+
20
+ ```bash
21
+ docker build -t atomworks-studio-space .
22
+ docker run --rm -p 7860:7860 atomworks-studio-space
23
+ ```
24
+
25
+ Open http://localhost:7860/ or http://localhost:7860/guide/.
26
+ Download CIFs you want to retain: the Space filesystem is ephemeral and sessions
27
+ expire. Space access controls protect the whole application; Studio does not
28
+ turn Hugging Face visitor identities into per-user session authorization.
29
+
30
+ For model inference, use the integration guide in Studio at `/guide/INTEGRATIONS.html`.
31
+ This image installs CPU Torch. A GPU model deployment must supply its own tested
32
+ CUDA environment, weights, and runner; selecting GPU hardware alone does not
33
+ turn this editor-only image into an inference server.
@@ -0,0 +1,45 @@
1
+ """Bundle the already-built browser application into Python distributions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import shutil
7
+ import tomllib
8
+ from pathlib import Path
9
+
10
+ from hatchling.builders.hooks.plugin.interface import BuildHookInterface
11
+
12
+
13
+ class CustomBuildHook(BuildHookInterface):
14
+ """Stage Vite output and verify the pinned RFD4 definitions before each build."""
15
+
16
+ PLUGIN_NAME = "custom"
17
+
18
+ def initialize(self, version: str, build_data: dict) -> None:
19
+ self._bundle_rfd4_definitions(build_data)
20
+ if version == "editable":
21
+ return
22
+ for source_dir, name in (("packages/web/dist", "web"), ("docs/_build/html", "guide")):
23
+ source = Path(self.root) / source_dir
24
+ destination = Path(self.root) / "packages/api/annotation_studio" / name
25
+ if (source / "index.html").is_file():
26
+ shutil.rmtree(destination, ignore_errors=True)
27
+ shutil.copytree(source, destination, ignore=shutil.ignore_patterns(".doctrees", "__pycache__", "*.bak"))
28
+ elif not (destination / "index.html").is_file():
29
+ raise RuntimeError(f"build {source_dir} before building Studio (make build)")
30
+ # Also include generated assets when rebuilding a wheel from its sdist.
31
+ prefix = "packages/api/" if self.target_name == "sdist" else ""
32
+ build_data.setdefault("force_include", {})[str(destination)] = f"{prefix}annotation_studio/{name}"
33
+
34
+ def _bundle_rfd4_definitions(self, build_data: dict) -> None:
35
+ """Verify every pinned definition file and ship its manifest beside them."""
36
+ provider = Path(self.root) / "providers/rfd4"
37
+ source = provider / "atomworks_studio_rfd4/_upstream"
38
+ manifest = provider / "UPSTREAM.toml"
39
+ metadata = tomllib.loads(manifest.read_text())
40
+ for name, expected in metadata["files"].items():
41
+ path = source / name
42
+ if not path.is_file() or hashlib.sha256(path.read_bytes()).hexdigest() != expected:
43
+ raise RuntimeError(f"RFD4 {name} does not match pinned RosettaCommons revision {metadata['revision']}")
44
+ if self.target_name == "wheel":
45
+ build_data.setdefault("force_include", {})[str(manifest)] = "atomworks_studio_rfd4/_upstream/UPSTREAM.toml"
@@ -0,0 +1,13 @@
1
+ # Studio API
2
+
3
+ The API is included in `atomworks-studio`. Start it with `atomworks-studio`;
4
+ use `--vscode` to allow the VS Code webview to embed it. The default address is
5
+ `http://127.0.0.1:8000`. Interactive API documentation is at `/docs`.
6
+
7
+ The API owns bounded editor sessions and delegates every mutation to
8
+ `atomworks_studio_editing`. It loads the same annotation adapter as PyMOL.
9
+ Routes cover CIF loading and export, selections, annotations, groups, restraints,
10
+ protonation, bonds, chains, segments, validation, and Undo. There are no design
11
+ or job routes.
12
+
13
+ See [architecture](../../docs/ARCHITECTURE.md) and [installation](../../docs/INSTALLATION.md).
@@ -0,0 +1,30 @@
1
+ """AtomWorks Studio service and provider contracts.
2
+
3
+ Keep package imports lightweight so the launch command can show help/version
4
+ without initializing AtomWorks, model providers, or a GPU runtime.
5
+ """
6
+
7
+ from importlib import import_module
8
+ from typing import TYPE_CHECKING
9
+
10
+ from .version import __version__
11
+
12
+ if TYPE_CHECKING:
13
+ from .contracts import ConditionProvider, ValidationProvider
14
+ from .core import StudioDocument
15
+
16
+ __all__ = [
17
+ "ConditionProvider",
18
+ "StudioDocument",
19
+ "ValidationProvider",
20
+ "__version__",
21
+ ]
22
+
23
+
24
+ def __getattr__(name: str):
25
+ if name not in __all__:
26
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
27
+ module = ".core" if name == "StudioDocument" else ".contracts"
28
+ value = getattr(import_module(module, __name__), name)
29
+ globals()[name] = value
30
+ return value
@@ -0,0 +1,31 @@
1
+ """Launch the packaged Studio web application."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import os
7
+ from pathlib import Path
8
+
9
+ from annotation_studio.version import __version__
10
+
11
+
12
+ def main(argv: list[str] | None = None) -> None:
13
+ parser = argparse.ArgumentParser(description="Open AtomWorks Studio in a browser.")
14
+ parser.add_argument("--version", action="version", version=f"AtomWorks Studio {__version__}")
15
+ parser.add_argument("--host", default="127.0.0.1", help="Listen address (default: 127.0.0.1)")
16
+ parser.add_argument("--port", type=int, default=8000, help="Listen port (default: 8000)")
17
+ parser.add_argument("--vscode", action="store_true", help="Allow embedding in VS Code and Cursor")
18
+ args = parser.parse_args(argv)
19
+ if not 1 <= args.port <= 65535:
20
+ parser.error("--port must be between 1 and 65535")
21
+ package = Path(__file__).resolve().parent
22
+ if not any((path / "index.html").is_file() for path in (package / "web", package.parents[1] / "web" / "dist")):
23
+ parser.error("Browser assets are missing. Install a built wheel, or run `pnpm --dir packages/web build` first.")
24
+ import uvicorn
25
+
26
+ if args.vscode:
27
+ os.environ["ANNOTATION_STUDIO_FRAME_ANCESTORS"] = (
28
+ "'self' vscode-webview: vscode-file://vscode-app https://*.vscode-cdn.net"
29
+ )
30
+ print(f"AtomWorks Studio: http://{args.host}:{args.port}/", flush=True)
31
+ uvicorn.run("annotation_studio.main:app", host=args.host, port=args.port)
@@ -0,0 +1,48 @@
1
+ """Session errors and shared document contracts."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from atomworks_studio_editing.contracts import (
6
+ NEUTRAL_CONDITION_PROVIDER as NEUTRAL_CONDITION_PROVIDER,
7
+ )
8
+ from atomworks_studio_editing.contracts import (
9
+ NEUTRAL_VALIDATION_PROVIDER as NEUTRAL_VALIDATION_PROVIDER,
10
+ )
11
+ from atomworks_studio_editing.contracts import (
12
+ ConditionDefault as ConditionDefault,
13
+ )
14
+ from atomworks_studio_editing.contracts import (
15
+ ConditionDefinition as ConditionDefinition,
16
+ )
17
+ from atomworks_studio_editing.contracts import (
18
+ ConditionKind as ConditionKind,
19
+ )
20
+ from atomworks_studio_editing.contracts import (
21
+ ConditionOperation as ConditionOperation,
22
+ )
23
+ from atomworks_studio_editing.contracts import (
24
+ ConditionProvider as ConditionProvider,
25
+ )
26
+ from atomworks_studio_editing.contracts import (
27
+ ConditionValue as ConditionValue,
28
+ )
29
+ from atomworks_studio_editing.contracts import (
30
+ CountUnit as CountUnit,
31
+ )
32
+ from atomworks_studio_editing.contracts import (
33
+ NeutralConditionProvider as NeutralConditionProvider,
34
+ )
35
+ from atomworks_studio_editing.contracts import (
36
+ NeutralValidationProvider as NeutralValidationProvider,
37
+ )
38
+ from atomworks_studio_editing.contracts import (
39
+ ValidationProvider as ValidationProvider,
40
+ )
41
+
42
+
43
+ class SessionNotFoundError(KeyError):
44
+ """A session store could not resolve a session for the current owner."""
45
+
46
+
47
+ class CapacityExceededError(RuntimeError):
48
+ """A bounded local or shared resource has reached its configured limit."""
@@ -0,0 +1,10 @@
1
+ """Compatibility exports for the shared Studio editing package."""
2
+
3
+ from atomworks_studio_editing.document import (
4
+ BOND_TYPES,
5
+ INTERACTION_TYPES,
6
+ StudioDocument,
7
+ parse_annotated_cif,
8
+ )
9
+
10
+ __all__ = ["BOND_TYPES", "INTERACTION_TYPES", "StudioDocument", "parse_annotated_cif"]
@@ -0,0 +1,21 @@
1
+ # Design examples
2
+
3
+ Eight inputs from the private RFD4 NIM, revision
4
+ `3a8a1f6f2ed6bab37757d2471b5007971175225d`, under `nim/examples/*/request.json`.
5
+ Motif, partial-diffusion and inverse-folding CIF contents are unchanged.
6
+ Enzyme and VHH inputs include missing heavy atoms with free coordinates.
7
+ Antibody and unconditional condition specs use the standard-annotation serializer;
8
+ the antibody uses separate internal heavy/light framework groups and a fixed target.
9
+ SAM uses the positioned conformer from RFD4’s interaction examples while leaving
10
+ coordinate conditioning off. See `docs/PROVENANCE.md` for sources and preparation.
11
+
12
+ `examples.json` pairs each CIF with its sampling task. Partial diffusion uses
13
+ 40% of the trajectory; inverse folding uses the native inverse-folding sampler.
14
+ The model deployment chooses the native recycling preset and design count.
15
+ Example selection does not enable refolding or establish biological design quality.
16
+
17
+ `protein_binder.cif` comes from RFD4 `all_ppi.yaml:rfd3_pdl1`: a fixed PD-L1
18
+ target, six hotspot atoms on residues 56, 115 and 123, and a separate 50–120
19
+ residue binder segment. It uses the standard protein sampler with these conditions.
20
+
21
+ Keep this directory nonpublic until release review.