janus-core-ux 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. janus_core_ux-0.1.0/PKG-INFO +113 -0
  2. janus_core_ux-0.1.0/README.md +81 -0
  3. janus_core_ux-0.1.0/janus_core_ux.egg-info/PKG-INFO +113 -0
  4. janus_core_ux-0.1.0/janus_core_ux.egg-info/SOURCES.txt +50 -0
  5. janus_core_ux-0.1.0/janus_core_ux.egg-info/dependency_links.txt +1 -0
  6. janus_core_ux-0.1.0/janus_core_ux.egg-info/entry_points.txt +2 -0
  7. janus_core_ux-0.1.0/janus_core_ux.egg-info/requires.txt +10 -0
  8. janus_core_ux-0.1.0/janus_core_ux.egg-info/top_level.txt +1 -0
  9. janus_core_ux-0.1.0/janus_ux/__init__.py +3 -0
  10. janus_core_ux-0.1.0/janus_ux/app.py +187 -0
  11. janus_core_ux-0.1.0/janus_ux/assets/icon.png +0 -0
  12. janus_core_ux-0.1.0/janus_ux/assets/icon.svg +83 -0
  13. janus_core_ux-0.1.0/janus_ux/assets/janus-core-ux.desktop +13 -0
  14. janus_core_ux-0.1.0/janus_ux/core/__init__.py +19 -0
  15. janus_core_ux-0.1.0/janus_ux/core/desktop_integration.py +56 -0
  16. janus_core_ux-0.1.0/janus_ux/core/env_manager.py +305 -0
  17. janus_core_ux-0.1.0/janus_ux/core/installer.py +53 -0
  18. janus_core_ux-0.1.0/janus_ux/core/models.py +29 -0
  19. janus_core_ux-0.1.0/janus_ux/core/parser.py +112 -0
  20. janus_core_ux-0.1.0/janus_ux/core/presets.py +8 -0
  21. janus_core_ux-0.1.0/janus_ux/core/runner.py +113 -0
  22. janus_core_ux-0.1.0/janus_ux/main.py +49 -0
  23. janus_core_ux-0.1.0/janus_ux/tabs/__init__.py +23 -0
  24. janus_core_ux-0.1.0/janus_ux/tabs/tab_descriptors.py +209 -0
  25. janus_core_ux-0.1.0/janus_ux/tabs/tab_elasticity.py +249 -0
  26. janus_core_ux-0.1.0/janus_ux/tabs/tab_environments.py +312 -0
  27. janus_core_ux-0.1.0/janus_ux/tabs/tab_eos.py +266 -0
  28. janus_core_ux-0.1.0/janus_ux/tabs/tab_geomopt.py +315 -0
  29. janus_core_ux-0.1.0/janus_ux/tabs/tab_md.py +291 -0
  30. janus_core_ux-0.1.0/janus_ux/tabs/tab_neb.py +292 -0
  31. janus_core_ux-0.1.0/janus_ux/tabs/tab_phonons.py +224 -0
  32. janus_core_ux-0.1.0/janus_ux/tabs/tab_singlepoint.py +309 -0
  33. janus_core_ux-0.1.0/janus_ux/theme.py +290 -0
  34. janus_core_ux-0.1.0/janus_ux/widgets/__init__.py +17 -0
  35. janus_core_ux-0.1.0/janus_ux/widgets/calculator_selector.py +203 -0
  36. janus_core_ux-0.1.0/janus_ux/widgets/chemiscope_widget.py +260 -0
  37. janus_core_ux-0.1.0/janus_ux/widgets/interactive_graph.py +201 -0
  38. janus_core_ux-0.1.0/janus_ux/widgets/log_console.py +96 -0
  39. janus_core_ux-0.1.0/janus_ux/widgets/structure_file_input.py +145 -0
  40. janus_core_ux-0.1.0/janus_ux/widgets/structure_inspector.py +146 -0
  41. janus_core_ux-0.1.0/pyproject.toml +54 -0
  42. janus_core_ux-0.1.0/setup.cfg +4 -0
  43. janus_core_ux-0.1.0/tests/test_calculator_selector.py +35 -0
  44. janus_core_ux-0.1.0/tests/test_chemiscope.py +37 -0
  45. janus_core_ux-0.1.0/tests/test_desktop.py +21 -0
  46. janus_core_ux-0.1.0/tests/test_env_manager.py +39 -0
  47. janus_core_ux-0.1.0/tests/test_interactive_graph.py +36 -0
  48. janus_core_ux-0.1.0/tests/test_parser.py +51 -0
  49. janus_core_ux-0.1.0/tests/test_runner.py +16 -0
  50. janus_core_ux-0.1.0/tests/test_structure_file_input.py +43 -0
  51. janus_core_ux-0.1.0/tests/test_structure_inspector.py +33 -0
  52. janus_core_ux-0.1.0/tests/test_ui_tabs.py +100 -0
@@ -0,0 +1,113 @@
1
+ Metadata-Version: 2.4
2
+ Name: janus-core-ux
3
+ Version: 0.1.0
4
+ Summary: Modern Qt6 / PySide6 desktop UX for STFC janus-core with Chemiscope 3D visualization, interactive graphs, and multi-MLIP support
5
+ Author: Janus UX Team
6
+ License: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/stfc/janus-core
8
+ Project-URL: Repository, https://github.com/stfc/janus-core
9
+ Project-URL: Documentation, https://context7.com/stfc/janus-core
10
+ Keywords: atomistic,simulation,mlip,mace,sevennet,chemiscope,pyside6,qt6,materials-science
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
14
+ Classifier: Topic :: Scientific/Engineering :: Physics
15
+ Classifier: Operating System :: POSIX :: Linux
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ Requires-Dist: pyside6>=6.8.0
24
+ Requires-Dist: ase>=3.23.0
25
+ Requires-Dist: janus-core>=0.9.0
26
+ Requires-Dist: chemiscope>=1.0.0
27
+ Requires-Dist: plotly>=5.0.0
28
+ Requires-Dist: numpy
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
31
+ Requires-Dist: pytest-qt>=4.4.0; extra == "dev"
32
+
33
+ # Janus-Core Desktop UX
34
+
35
+ A desktop graphical user interface for **STFC `janus-core`** built with **Qt6** and **PySide6**.
36
+
37
+ ![Janus UX](https://img.shields.io/badge/GUI-PySide6%20%2F%20Qt6-blue.svg)
38
+ ![Python](https://img.shields.io/badge/Python-3.12-brightgreen.svg)
39
+ ![MLIP](https://img.shields.io/badge/MLIP-MACE%20%7C%20SevenNet%20%7C%20CHGNet-orange.svg)
40
+ ![Visualization](https://img.shields.io/badge/3D%20Visualizer-Chemiscope-purple.svg)
41
+
42
+ ---
43
+
44
+ ## Features
45
+
46
+ - **Dedicated Tabs for All Janus-Core Calculations**:
47
+ - ⚙️ **MLIP Environments & Potentials Setup**: Manage multiple micromamba/conda/virtual environments with incompatible dependencies. Auto-detect installed models (MACE, SevenNet, CHGNet, FairChem, NequIP, ORB, MatterSim), install/upgrade potentials directly via `uv`, and choose target execution environments per calculation.
48
+ - ⚡ **Geometry Optimization**: Atomic coordinate relaxation and crystal unit cell optimization (`FrechetCellFilter`, `ExpCellFilter`), convergence curves, and trajectory playback.
49
+ - 🎯 **Single Point**: Potential energy, atomic forces, stress tensor, and Hessian matrix.
50
+ - 🌊 **Molecular Dynamics**: NVE, NVT, and NPT ensembles with Langevin or Nosé-Hoover thermostats, temperature ramping, thermodynamic curves (T, Epot, Pressure vs Time), and trajectory player.
51
+ - 🎵 **Phonons**: Supercell generation, finite displacement, phonon band structures, DOS/PDOS, and vibrational heat capacity / entropy curves.
52
+ - 📈 **Equation of State (EOS)**: Birch-Murnaghan, Murnaghan, and Vinet E(V) curve fitting, bulk modulus $B_0$, and interactive strained cell inspector.
53
+ - 💎 **Elasticity**: Full $6 \times 6$ elastic stiffness matrix $C_{ij}$, compliance matrix $S_{ij}$, and Voigt-Reuss-Hill bulk, shear, and Young's moduli.
54
+ - ⛰️ **NEB Reaction Pathways**: Climbing-image Nudged Elastic Band (CI-NEB) for transition state search and activation energy barriers $\Delta E^\ddagger$.
55
+ - 🧬 **MLIP Descriptors**: Atomic and system-level MLIP representations and invariants.
56
+
57
+ - **Chemiscope 3D Atomistic Visualizer**:
58
+ - Embedded via `QWebEngineView` using local offline Chemiscope JavaScript libraries.
59
+ - Interactive camera rotation, zoom, panning, unit cell boundary toggling, atomic bonds, and measurement tools.
60
+ - Trajectory playback and frame scrubber.
61
+
62
+ - **Interactive 2D/3D Linked Graphs with Point Picking**:
63
+ - Click any point on a geometry optimization convergence curve, EOS $E(V)$ curve, or NEB reaction path to **immediately update the 3D Chemiscope visualizer to that specific structure/frame**.
64
+
65
+ - **Asynchronous Background Execution**:
66
+ - Calculations run in background `QThread` workers without freezing the interface.
67
+ - Live colorized terminal log streaming with search filtering.
68
+ - Cancel button for long simulations.
69
+
70
+ ---
71
+
72
+ ## Installation & Environment
73
+
74
+ Install from PyPI or editable source using `uv`:
75
+
76
+ ```bash
77
+ # Install with uv
78
+ uv pip install -e . --python /opt/micromamba/envs/janus/bin/python
79
+
80
+ # Or install desktop shortcut and system icon
81
+ janus-core-ux --install-desktop
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Launching the Application
87
+
88
+ Run directly from the command line using any of the installed entry points:
89
+
90
+ ```bash
91
+ janus-core-ux
92
+ ```
93
+
94
+ You can also launch it directly from your Linux system desktop application launcher (GNOME, KDE Plasma, XFCE).
95
+
96
+ ---
97
+
98
+ ## Desktop Shortcut & Icon
99
+
100
+ To register the desktop application shortcut and system icon to `~/.local/share/applications` and `~/.local/share/icons`:
101
+
102
+ - Run CLI flag: `janus-core-ux --install-desktop`
103
+ - Or from inside the GUI: Navigate to **Help -> Install Desktop Shortcut**.
104
+
105
+ ---
106
+
107
+ ## Running Tests
108
+
109
+ Run the test suite with `uv` and `pytest`:
110
+
111
+ ```bash
112
+ uv run --no-project --python /opt/micromamba/envs/janus/bin/python -m pytest tests/
113
+ ```
@@ -0,0 +1,81 @@
1
+ # Janus-Core Desktop UX
2
+
3
+ A desktop graphical user interface for **STFC `janus-core`** built with **Qt6** and **PySide6**.
4
+
5
+ ![Janus UX](https://img.shields.io/badge/GUI-PySide6%20%2F%20Qt6-blue.svg)
6
+ ![Python](https://img.shields.io/badge/Python-3.12-brightgreen.svg)
7
+ ![MLIP](https://img.shields.io/badge/MLIP-MACE%20%7C%20SevenNet%20%7C%20CHGNet-orange.svg)
8
+ ![Visualization](https://img.shields.io/badge/3D%20Visualizer-Chemiscope-purple.svg)
9
+
10
+ ---
11
+
12
+ ## Features
13
+
14
+ - **Dedicated Tabs for All Janus-Core Calculations**:
15
+ - ⚙️ **MLIP Environments & Potentials Setup**: Manage multiple micromamba/conda/virtual environments with incompatible dependencies. Auto-detect installed models (MACE, SevenNet, CHGNet, FairChem, NequIP, ORB, MatterSim), install/upgrade potentials directly via `uv`, and choose target execution environments per calculation.
16
+ - ⚡ **Geometry Optimization**: Atomic coordinate relaxation and crystal unit cell optimization (`FrechetCellFilter`, `ExpCellFilter`), convergence curves, and trajectory playback.
17
+ - 🎯 **Single Point**: Potential energy, atomic forces, stress tensor, and Hessian matrix.
18
+ - 🌊 **Molecular Dynamics**: NVE, NVT, and NPT ensembles with Langevin or Nosé-Hoover thermostats, temperature ramping, thermodynamic curves (T, Epot, Pressure vs Time), and trajectory player.
19
+ - 🎵 **Phonons**: Supercell generation, finite displacement, phonon band structures, DOS/PDOS, and vibrational heat capacity / entropy curves.
20
+ - 📈 **Equation of State (EOS)**: Birch-Murnaghan, Murnaghan, and Vinet E(V) curve fitting, bulk modulus $B_0$, and interactive strained cell inspector.
21
+ - 💎 **Elasticity**: Full $6 \times 6$ elastic stiffness matrix $C_{ij}$, compliance matrix $S_{ij}$, and Voigt-Reuss-Hill bulk, shear, and Young's moduli.
22
+ - ⛰️ **NEB Reaction Pathways**: Climbing-image Nudged Elastic Band (CI-NEB) for transition state search and activation energy barriers $\Delta E^\ddagger$.
23
+ - 🧬 **MLIP Descriptors**: Atomic and system-level MLIP representations and invariants.
24
+
25
+ - **Chemiscope 3D Atomistic Visualizer**:
26
+ - Embedded via `QWebEngineView` using local offline Chemiscope JavaScript libraries.
27
+ - Interactive camera rotation, zoom, panning, unit cell boundary toggling, atomic bonds, and measurement tools.
28
+ - Trajectory playback and frame scrubber.
29
+
30
+ - **Interactive 2D/3D Linked Graphs with Point Picking**:
31
+ - Click any point on a geometry optimization convergence curve, EOS $E(V)$ curve, or NEB reaction path to **immediately update the 3D Chemiscope visualizer to that specific structure/frame**.
32
+
33
+ - **Asynchronous Background Execution**:
34
+ - Calculations run in background `QThread` workers without freezing the interface.
35
+ - Live colorized terminal log streaming with search filtering.
36
+ - Cancel button for long simulations.
37
+
38
+ ---
39
+
40
+ ## Installation & Environment
41
+
42
+ Install from PyPI or editable source using `uv`:
43
+
44
+ ```bash
45
+ # Install with uv
46
+ uv pip install -e . --python /opt/micromamba/envs/janus/bin/python
47
+
48
+ # Or install desktop shortcut and system icon
49
+ janus-core-ux --install-desktop
50
+ ```
51
+
52
+ ---
53
+
54
+ ## Launching the Application
55
+
56
+ Run directly from the command line using any of the installed entry points:
57
+
58
+ ```bash
59
+ janus-core-ux
60
+ ```
61
+
62
+ You can also launch it directly from your Linux system desktop application launcher (GNOME, KDE Plasma, XFCE).
63
+
64
+ ---
65
+
66
+ ## Desktop Shortcut & Icon
67
+
68
+ To register the desktop application shortcut and system icon to `~/.local/share/applications` and `~/.local/share/icons`:
69
+
70
+ - Run CLI flag: `janus-core-ux --install-desktop`
71
+ - Or from inside the GUI: Navigate to **Help -> Install Desktop Shortcut**.
72
+
73
+ ---
74
+
75
+ ## Running Tests
76
+
77
+ Run the test suite with `uv` and `pytest`:
78
+
79
+ ```bash
80
+ uv run --no-project --python /opt/micromamba/envs/janus/bin/python -m pytest tests/
81
+ ```
@@ -0,0 +1,113 @@
1
+ Metadata-Version: 2.4
2
+ Name: janus-core-ux
3
+ Version: 0.1.0
4
+ Summary: Modern Qt6 / PySide6 desktop UX for STFC janus-core with Chemiscope 3D visualization, interactive graphs, and multi-MLIP support
5
+ Author: Janus UX Team
6
+ License: BSD-3-Clause
7
+ Project-URL: Homepage, https://github.com/stfc/janus-core
8
+ Project-URL: Repository, https://github.com/stfc/janus-core
9
+ Project-URL: Documentation, https://context7.com/stfc/janus-core
10
+ Keywords: atomistic,simulation,mlip,mace,sevennet,chemiscope,pyside6,qt6,materials-science
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
14
+ Classifier: Topic :: Scientific/Engineering :: Physics
15
+ Classifier: Operating System :: POSIX :: Linux
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ Requires-Dist: pyside6>=6.8.0
24
+ Requires-Dist: ase>=3.23.0
25
+ Requires-Dist: janus-core>=0.9.0
26
+ Requires-Dist: chemiscope>=1.0.0
27
+ Requires-Dist: plotly>=5.0.0
28
+ Requires-Dist: numpy
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
31
+ Requires-Dist: pytest-qt>=4.4.0; extra == "dev"
32
+
33
+ # Janus-Core Desktop UX
34
+
35
+ A desktop graphical user interface for **STFC `janus-core`** built with **Qt6** and **PySide6**.
36
+
37
+ ![Janus UX](https://img.shields.io/badge/GUI-PySide6%20%2F%20Qt6-blue.svg)
38
+ ![Python](https://img.shields.io/badge/Python-3.12-brightgreen.svg)
39
+ ![MLIP](https://img.shields.io/badge/MLIP-MACE%20%7C%20SevenNet%20%7C%20CHGNet-orange.svg)
40
+ ![Visualization](https://img.shields.io/badge/3D%20Visualizer-Chemiscope-purple.svg)
41
+
42
+ ---
43
+
44
+ ## Features
45
+
46
+ - **Dedicated Tabs for All Janus-Core Calculations**:
47
+ - ⚙️ **MLIP Environments & Potentials Setup**: Manage multiple micromamba/conda/virtual environments with incompatible dependencies. Auto-detect installed models (MACE, SevenNet, CHGNet, FairChem, NequIP, ORB, MatterSim), install/upgrade potentials directly via `uv`, and choose target execution environments per calculation.
48
+ - ⚡ **Geometry Optimization**: Atomic coordinate relaxation and crystal unit cell optimization (`FrechetCellFilter`, `ExpCellFilter`), convergence curves, and trajectory playback.
49
+ - 🎯 **Single Point**: Potential energy, atomic forces, stress tensor, and Hessian matrix.
50
+ - 🌊 **Molecular Dynamics**: NVE, NVT, and NPT ensembles with Langevin or Nosé-Hoover thermostats, temperature ramping, thermodynamic curves (T, Epot, Pressure vs Time), and trajectory player.
51
+ - 🎵 **Phonons**: Supercell generation, finite displacement, phonon band structures, DOS/PDOS, and vibrational heat capacity / entropy curves.
52
+ - 📈 **Equation of State (EOS)**: Birch-Murnaghan, Murnaghan, and Vinet E(V) curve fitting, bulk modulus $B_0$, and interactive strained cell inspector.
53
+ - 💎 **Elasticity**: Full $6 \times 6$ elastic stiffness matrix $C_{ij}$, compliance matrix $S_{ij}$, and Voigt-Reuss-Hill bulk, shear, and Young's moduli.
54
+ - ⛰️ **NEB Reaction Pathways**: Climbing-image Nudged Elastic Band (CI-NEB) for transition state search and activation energy barriers $\Delta E^\ddagger$.
55
+ - 🧬 **MLIP Descriptors**: Atomic and system-level MLIP representations and invariants.
56
+
57
+ - **Chemiscope 3D Atomistic Visualizer**:
58
+ - Embedded via `QWebEngineView` using local offline Chemiscope JavaScript libraries.
59
+ - Interactive camera rotation, zoom, panning, unit cell boundary toggling, atomic bonds, and measurement tools.
60
+ - Trajectory playback and frame scrubber.
61
+
62
+ - **Interactive 2D/3D Linked Graphs with Point Picking**:
63
+ - Click any point on a geometry optimization convergence curve, EOS $E(V)$ curve, or NEB reaction path to **immediately update the 3D Chemiscope visualizer to that specific structure/frame**.
64
+
65
+ - **Asynchronous Background Execution**:
66
+ - Calculations run in background `QThread` workers without freezing the interface.
67
+ - Live colorized terminal log streaming with search filtering.
68
+ - Cancel button for long simulations.
69
+
70
+ ---
71
+
72
+ ## Installation & Environment
73
+
74
+ Install from PyPI or editable source using `uv`:
75
+
76
+ ```bash
77
+ # Install with uv
78
+ uv pip install -e . --python /opt/micromamba/envs/janus/bin/python
79
+
80
+ # Or install desktop shortcut and system icon
81
+ janus-core-ux --install-desktop
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Launching the Application
87
+
88
+ Run directly from the command line using any of the installed entry points:
89
+
90
+ ```bash
91
+ janus-core-ux
92
+ ```
93
+
94
+ You can also launch it directly from your Linux system desktop application launcher (GNOME, KDE Plasma, XFCE).
95
+
96
+ ---
97
+
98
+ ## Desktop Shortcut & Icon
99
+
100
+ To register the desktop application shortcut and system icon to `~/.local/share/applications` and `~/.local/share/icons`:
101
+
102
+ - Run CLI flag: `janus-core-ux --install-desktop`
103
+ - Or from inside the GUI: Navigate to **Help -> Install Desktop Shortcut**.
104
+
105
+ ---
106
+
107
+ ## Running Tests
108
+
109
+ Run the test suite with `uv` and `pytest`:
110
+
111
+ ```bash
112
+ uv run --no-project --python /opt/micromamba/envs/janus/bin/python -m pytest tests/
113
+ ```
@@ -0,0 +1,50 @@
1
+ README.md
2
+ pyproject.toml
3
+ janus_core_ux.egg-info/PKG-INFO
4
+ janus_core_ux.egg-info/SOURCES.txt
5
+ janus_core_ux.egg-info/dependency_links.txt
6
+ janus_core_ux.egg-info/entry_points.txt
7
+ janus_core_ux.egg-info/requires.txt
8
+ janus_core_ux.egg-info/top_level.txt
9
+ janus_ux/__init__.py
10
+ janus_ux/app.py
11
+ janus_ux/main.py
12
+ janus_ux/theme.py
13
+ janus_ux/assets/icon.png
14
+ janus_ux/assets/icon.svg
15
+ janus_ux/assets/janus-core-ux.desktop
16
+ janus_ux/core/__init__.py
17
+ janus_ux/core/desktop_integration.py
18
+ janus_ux/core/env_manager.py
19
+ janus_ux/core/installer.py
20
+ janus_ux/core/models.py
21
+ janus_ux/core/parser.py
22
+ janus_ux/core/presets.py
23
+ janus_ux/core/runner.py
24
+ janus_ux/tabs/__init__.py
25
+ janus_ux/tabs/tab_descriptors.py
26
+ janus_ux/tabs/tab_elasticity.py
27
+ janus_ux/tabs/tab_environments.py
28
+ janus_ux/tabs/tab_eos.py
29
+ janus_ux/tabs/tab_geomopt.py
30
+ janus_ux/tabs/tab_md.py
31
+ janus_ux/tabs/tab_neb.py
32
+ janus_ux/tabs/tab_phonons.py
33
+ janus_ux/tabs/tab_singlepoint.py
34
+ janus_ux/widgets/__init__.py
35
+ janus_ux/widgets/calculator_selector.py
36
+ janus_ux/widgets/chemiscope_widget.py
37
+ janus_ux/widgets/interactive_graph.py
38
+ janus_ux/widgets/log_console.py
39
+ janus_ux/widgets/structure_file_input.py
40
+ janus_ux/widgets/structure_inspector.py
41
+ tests/test_calculator_selector.py
42
+ tests/test_chemiscope.py
43
+ tests/test_desktop.py
44
+ tests/test_env_manager.py
45
+ tests/test_interactive_graph.py
46
+ tests/test_parser.py
47
+ tests/test_runner.py
48
+ tests/test_structure_file_input.py
49
+ tests/test_structure_inspector.py
50
+ tests/test_ui_tabs.py
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ janus-core-ux = janus_ux.main:main
@@ -0,0 +1,10 @@
1
+ pyside6>=6.8.0
2
+ ase>=3.23.0
3
+ janus-core>=0.9.0
4
+ chemiscope>=1.0.0
5
+ plotly>=5.0.0
6
+ numpy
7
+
8
+ [dev]
9
+ pytest>=7.0.0
10
+ pytest-qt>=4.4.0
@@ -0,0 +1,3 @@
1
+ """Janus Core UX - Modern Qt6 / PySide6 Desktop GUI for STFC janus-core."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,187 @@
1
+ """Main Application Window for Janus Core UX."""
2
+
3
+ import sys
4
+ from PySide6.QtWidgets import (
5
+ QMainWindow,
6
+ QWidget,
7
+ QVBoxLayout,
8
+ QTabWidget,
9
+ QMenuBar,
10
+ QMenu,
11
+ QStatusBar,
12
+ QMessageBox,
13
+ QFileDialog,
14
+ )
15
+ from PySide6.QtGui import QAction, QIcon
16
+ from PySide6.QtCore import Qt
17
+
18
+ from janus_ux.theme import DARK_STYLESHEET
19
+ from janus_ux.widgets.calculator_selector import CalculatorSelector
20
+ from janus_ux.tabs import (
21
+ SinglePointTab,
22
+ GeomOptTab,
23
+ MDTab,
24
+ PhononsTab,
25
+ EOSTab,
26
+ ElasticityTab,
27
+ NEBTab,
28
+ DescriptorsTab,
29
+ EnvironmentsTab,
30
+ )
31
+
32
+ class MainWindow(QMainWindow):
33
+ """Main window hosting all Janus-Core calculation tabs and environment management."""
34
+
35
+ def __init__(self):
36
+ super().__init__()
37
+ self.setWindowTitle("Janus-Core UX | Multi-MLIP Simulation Suite")
38
+ self.resize(1380, 890)
39
+ self.setMinimumSize(1000, 680)
40
+
41
+ # Apply global theme
42
+ self.setStyleSheet(DARK_STYLESHEET)
43
+
44
+ self._setup_menus()
45
+ self._setup_tabs()
46
+ self._setup_statusbar()
47
+
48
+ def _setup_menus(self):
49
+ menubar = self.menuBar()
50
+
51
+ # File Menu
52
+ file_menu = menubar.addMenu("&File")
53
+
54
+ action_open = QAction("&Open Structure...", self)
55
+ action_open.setShortcut("Ctrl+O")
56
+ action_open.triggered.connect(self._open_structure)
57
+ file_menu.addAction(action_open)
58
+
59
+ file_menu.addSeparator()
60
+
61
+ action_exit = QAction("E&xit", self)
62
+ action_exit.setShortcut("Ctrl+Q")
63
+ action_exit.triggered.connect(self.close)
64
+ file_menu.addAction(action_exit)
65
+
66
+ # Calculations Menu
67
+ calc_menu = menubar.addMenu("&Calculations")
68
+ options = [
69
+ ("Geometry Optimization", 0),
70
+ ("Single Point Calculation", 1),
71
+ ("Molecular Dynamics", 2),
72
+ ("Phonons & Band Structure", 3),
73
+ ("Equation of State (EOS)", 4),
74
+ ("Elasticity Stiffness Tensor", 5),
75
+ ("Nudged Elastic Band (NEB)", 6),
76
+ ("MLIP Descriptors", 7),
77
+ ("Environments & MLIP Setup", 8),
78
+ ]
79
+ for name, idx in options:
80
+ act = QAction(name, self)
81
+ act.triggered.connect(lambda checked=False, i=idx: self.tab_widget.setCurrentIndex(i))
82
+ calc_menu.addAction(act)
83
+
84
+ # Help Menu
85
+ help_menu = menubar.addMenu("&Help")
86
+
87
+ action_desktop = QAction("&Install Desktop Shortcut", self)
88
+ action_desktop.triggered.connect(self._install_desktop_shortcut)
89
+ help_menu.addAction(action_desktop)
90
+
91
+ help_menu.addSeparator()
92
+
93
+ action_about = QAction("&About Janus-Core UX", self)
94
+ action_about.triggered.connect(self._show_about)
95
+ help_menu.addAction(action_about)
96
+
97
+ def _setup_tabs(self):
98
+ # Global CalculatorSelector shared across all calculation modes
99
+ self.calc_selector = CalculatorSelector(
100
+ self,
101
+ title="⚙️ Global MLIP Potential & Target Environment (Applied to all calculation modes)"
102
+ )
103
+
104
+ self.tab_widget = QTabWidget(self)
105
+ self.tab_widget.setDocumentMode(True)
106
+
107
+ # Instantiate tabs sharing the single global calc_selector
108
+ self.tab_geomopt = GeomOptTab(parent=self, calc_selector=self.calc_selector)
109
+ self.tab_singlepoint = SinglePointTab(parent=self, calc_selector=self.calc_selector)
110
+ self.tab_md = MDTab(parent=self, calc_selector=self.calc_selector)
111
+ self.tab_phonons = PhononsTab(parent=self, calc_selector=self.calc_selector)
112
+ self.tab_eos = EOSTab(parent=self, calc_selector=self.calc_selector)
113
+ self.tab_elasticity = ElasticityTab(parent=self, calc_selector=self.calc_selector)
114
+ self.tab_neb = NEBTab(parent=self, calc_selector=self.calc_selector)
115
+ self.tab_descriptors = DescriptorsTab(parent=self, calc_selector=self.calc_selector)
116
+ self.tab_environments = EnvironmentsTab(parent=self)
117
+
118
+ # Add tabs
119
+ self.tab_widget.addTab(self.tab_geomopt, "⚡ Geometry Optimization")
120
+ self.tab_widget.addTab(self.tab_singlepoint, "🎯 Single Point")
121
+ self.tab_widget.addTab(self.tab_md, "🌊 Molecular Dynamics")
122
+ self.tab_widget.addTab(self.tab_phonons, "🎵 Phonons")
123
+ self.tab_widget.addTab(self.tab_eos, "📈 Equation of State")
124
+ self.tab_widget.addTab(self.tab_elasticity, "💎 Elasticity")
125
+ self.tab_widget.addTab(self.tab_neb, "⛰️ NEB Pathways")
126
+ self.tab_widget.addTab(self.tab_descriptors, "🧬 Descriptors")
127
+ self.tab_widget.addTab(self.tab_environments, "⚙️ MLIP Environments")
128
+
129
+ # Connect environment update signal to the global CalculatorSelector
130
+ self.tab_environments.environments_updated.connect(self._on_environments_updated)
131
+
132
+ # Central container: Shared CalculatorSelector on top, tab widget below
133
+ container = QWidget(self)
134
+ c_layout = QVBoxLayout(container)
135
+ c_layout.setContentsMargins(8, 6, 8, 6)
136
+ c_layout.setSpacing(6)
137
+ c_layout.addWidget(self.calc_selector)
138
+ c_layout.addWidget(self.tab_widget)
139
+ self.setCentralWidget(container)
140
+
141
+ def _on_environments_updated(self):
142
+ """Notify the shared CalculatorSelector to refresh its environment list."""
143
+ if hasattr(self, "calc_selector"):
144
+ self.calc_selector.reload_environments()
145
+
146
+ def _setup_statusbar(self):
147
+ status = QStatusBar(self)
148
+ status.showMessage("Janus-Core UX Ready | Multi-Environment MLIP Support Active")
149
+ self.setStatusBar(status)
150
+
151
+ def _open_structure(self):
152
+ current_tab = self.tab_widget.currentWidget()
153
+ if hasattr(current_tab, "struct_input"):
154
+ current_tab.struct_input.browse_file()
155
+ elif hasattr(current_tab, "_browse_structure"):
156
+ current_tab._browse_structure()
157
+
158
+ def _install_desktop_shortcut(self):
159
+ from janus_ux.core.desktop_integration import install_desktop_entry
160
+ try:
161
+ ok = install_desktop_entry()
162
+ if ok:
163
+ QMessageBox.information(
164
+ self,
165
+ "Desktop Shortcut Installed",
166
+ "Janus-Core UX desktop shortcut and application icon have been installed to your system applications menu (~/.local/share/applications/janus-core-ux.desktop)."
167
+ )
168
+ else:
169
+ QMessageBox.warning(self, "Installation Failed", "Could not install desktop shortcut.")
170
+ except Exception as e:
171
+ QMessageBox.critical(self, "Error", f"Failed to install desktop shortcut: {e}")
172
+
173
+ def _show_about(self):
174
+ QMessageBox.about(
175
+ self,
176
+ "About Janus-Core UX",
177
+ "<h3>Janus-Core Desktop UX</h3>"
178
+ "<p>A graphical user interface for <b>STFC janus-core</b> built with <b>Qt6 & PySide6</b>.</p>"
179
+ "<p><b>Features:</b></p>"
180
+ "<ul>"
181
+ "<li>Multi-MLIP Environments Configuration & Model installer via UV</li>"
182
+ "<li>Chemiscope 3D atomistic structure and trajectory visualization</li>"
183
+ "<li>Interactive 2D/3D linked graphs with point-to-structure picking</li>"
184
+ "<li>Dedicated tabs for Geometry Optimization, Single Point, MD, Phonons, EOS, Elasticity, NEB, and Descriptors</li>"
185
+ "<li>Support for MACE, SevenNet, CHGNet, FairChem, NequIP, ORB, and MatterSim</li>"
186
+ "</ul>"
187
+ )
@@ -0,0 +1,83 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="100%" height="100%">
2
+ <defs>
3
+ <!-- Background Gradient -->
4
+ <linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
5
+ <stop offset="0%" stop-color="#1e1e2e"/>
6
+ <stop offset="50%" stop-color="#181825"/>
7
+ <stop offset="100%" stop-color="#11111b"/>
8
+ </linearGradient>
9
+
10
+ <!-- Primary Sphere Gradient (Cyan/Blue) -->
11
+ <radialGradient id="sphereGrad1" cx="35%" cy="35%" r="65%">
12
+ <stop offset="0%" stop-color="#b4befe"/>
13
+ <stop offset="40%" stop-color="#89b4fa"/>
14
+ <stop offset="100%" stop-color="#1e3a8a"/>
15
+ </radialGradient>
16
+
17
+ <!-- Secondary Sphere Gradient (Teal/Green) -->
18
+ <radialGradient id="sphereGrad2" cx="35%" cy="35%" r="65%">
19
+ <stop offset="0%" stop-color="#cdd6f4"/>
20
+ <stop offset="40%" stop-color="#a6e3a1"/>
21
+ <stop offset="100%" stop-color="#065f46"/>
22
+ </radialGradient>
23
+
24
+ <!-- Accent Sphere Gradient (Peach/Coral) -->
25
+ <radialGradient id="sphereGrad3" cx="35%" cy="35%" r="65%">
26
+ <stop offset="0%" stop-color="#f5e0dc"/>
27
+ <stop offset="40%" stop-color="#fab387"/>
28
+ <stop offset="100%" stop-color="#9a3412"/>
29
+ </radialGradient>
30
+
31
+ <!-- Center Atom Gradient -->
32
+ <radialGradient id="centerAtom" cx="30%" cy="30%" r="70%">
33
+ <stop offset="0%" stop-color="#ffffff"/>
34
+ <stop offset="30%" stop-color="#cba6f7"/>
35
+ <stop offset="80%" stop-color="#8839ef"/>
36
+ <stop offset="100%" stop-color="#3b0764"/>
37
+ </radialGradient>
38
+
39
+ <!-- Bond Glow -->
40
+ <linearGradient id="bondGrad" x1="0%" y1="0%" x2="100%" y2="100%">
41
+ <stop offset="0%" stop-color="#89b4fa" stop-opacity="0.8"/>
42
+ <stop offset="100%" stop-color="#cba6f7" stop-opacity="0.8"/>
43
+ </linearGradient>
44
+
45
+ <!-- Drop Shadow Filter -->
46
+ <filter id="dropShadow" x="-20%" y="-20%" width="140%" height="140%">
47
+ <feDropShadow dx="0" dy="12" stdDeviation="16" flood-color="#000000" flood-opacity="0.5"/>
48
+ </filter>
49
+ </defs>
50
+
51
+ <!-- Squircle App Icon Base -->
52
+ <rect x="24" y="24" width="464" height="464" rx="108" fill="url(#bgGrad)" stroke="#313244" stroke-width="6" filter="url(#dropShadow)"/>
53
+
54
+ <!-- Subtle Lattice / Unit Cell Orbitals -->
55
+ <g fill="none" stroke="#45475a" stroke-width="2.5" stroke-dasharray="6,6" opacity="0.6">
56
+ <polygon points="256,110 390,190 390,340 256,420 122,340 122,190" />
57
+ <line x1="256" y1="110" x2="256" y2="420" />
58
+ <line x1="122" y1="190" x2="390" y2="340" />
59
+ <line x1="390" y1="190" x2="122" y2="340" />
60
+ </g>
61
+
62
+ <!-- Atomic Bonds -->
63
+ <g stroke="url(#bondGrad)" stroke-width="10" stroke-linecap="round" opacity="0.9">
64
+ <line x1="256" y1="256" x2="160" y2="170" />
65
+ <line x1="256" y1="256" x2="352" y2="170" />
66
+ <line x1="256" y1="256" x2="256" y2="380" />
67
+ <line x1="256" y1="256" x2="140" y2="310" />
68
+ <line x1="256" y1="256" x2="372" y2="310" />
69
+ </g>
70
+
71
+ <!-- Outer Atoms -->
72
+ <circle cx="160" cy="170" r="38" fill="url(#sphereGrad1)" filter="url(#dropShadow)"/>
73
+ <circle cx="352" cy="170" r="38" fill="url(#sphereGrad2)" filter="url(#dropShadow)"/>
74
+ <circle cx="256" cy="380" r="42" fill="url(#sphereGrad1)" filter="url(#dropShadow)"/>
75
+ <circle cx="140" cy="310" r="34" fill="url(#sphereGrad3)" filter="url(#dropShadow)"/>
76
+ <circle cx="372" cy="310" r="34" fill="url(#sphereGrad3)" filter="url(#dropShadow)"/>
77
+
78
+ <!-- Center Atom (Core) -->
79
+ <circle cx="256" cy="256" r="56" fill="url(#centerAtom)" filter="url(#dropShadow)"/>
80
+
81
+ <!-- Specular highlights on center atom -->
82
+ <ellipse cx="236" cy="232" rx="14" ry="9" fill="#ffffff" opacity="0.7" transform="rotate(-30 236 232)"/>
83
+ </svg>
@@ -0,0 +1,13 @@
1
+ [Desktop Entry]
2
+ Version=1.0
3
+ Type=Application
4
+ Name=Janus-Core UX
5
+ GenericName=Atomistic Simulation GUI
6
+ Comment=Desktop UX for STFC janus-core with Chemiscope 3D Visualization and Multi-MLIP Support
7
+ Exec=janus-core-ux
8
+ Icon=janus-core-ux
9
+ Terminal=false
10
+ Categories=Science;Physics;Chemistry;Education;
11
+ Keywords=janus;atomistic;chemiscope;materials;ase;mlip;mace;sevennet;chgnet;fairchem;
12
+ StartupNotify=true
13
+ StartupWMClass=janus-core-ux