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.
- janus_core_ux-0.1.0/PKG-INFO +113 -0
- janus_core_ux-0.1.0/README.md +81 -0
- janus_core_ux-0.1.0/janus_core_ux.egg-info/PKG-INFO +113 -0
- janus_core_ux-0.1.0/janus_core_ux.egg-info/SOURCES.txt +50 -0
- janus_core_ux-0.1.0/janus_core_ux.egg-info/dependency_links.txt +1 -0
- janus_core_ux-0.1.0/janus_core_ux.egg-info/entry_points.txt +2 -0
- janus_core_ux-0.1.0/janus_core_ux.egg-info/requires.txt +10 -0
- janus_core_ux-0.1.0/janus_core_ux.egg-info/top_level.txt +1 -0
- janus_core_ux-0.1.0/janus_ux/__init__.py +3 -0
- janus_core_ux-0.1.0/janus_ux/app.py +187 -0
- janus_core_ux-0.1.0/janus_ux/assets/icon.png +0 -0
- janus_core_ux-0.1.0/janus_ux/assets/icon.svg +83 -0
- janus_core_ux-0.1.0/janus_ux/assets/janus-core-ux.desktop +13 -0
- janus_core_ux-0.1.0/janus_ux/core/__init__.py +19 -0
- janus_core_ux-0.1.0/janus_ux/core/desktop_integration.py +56 -0
- janus_core_ux-0.1.0/janus_ux/core/env_manager.py +305 -0
- janus_core_ux-0.1.0/janus_ux/core/installer.py +53 -0
- janus_core_ux-0.1.0/janus_ux/core/models.py +29 -0
- janus_core_ux-0.1.0/janus_ux/core/parser.py +112 -0
- janus_core_ux-0.1.0/janus_ux/core/presets.py +8 -0
- janus_core_ux-0.1.0/janus_ux/core/runner.py +113 -0
- janus_core_ux-0.1.0/janus_ux/main.py +49 -0
- janus_core_ux-0.1.0/janus_ux/tabs/__init__.py +23 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_descriptors.py +209 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_elasticity.py +249 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_environments.py +312 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_eos.py +266 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_geomopt.py +315 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_md.py +291 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_neb.py +292 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_phonons.py +224 -0
- janus_core_ux-0.1.0/janus_ux/tabs/tab_singlepoint.py +309 -0
- janus_core_ux-0.1.0/janus_ux/theme.py +290 -0
- janus_core_ux-0.1.0/janus_ux/widgets/__init__.py +17 -0
- janus_core_ux-0.1.0/janus_ux/widgets/calculator_selector.py +203 -0
- janus_core_ux-0.1.0/janus_ux/widgets/chemiscope_widget.py +260 -0
- janus_core_ux-0.1.0/janus_ux/widgets/interactive_graph.py +201 -0
- janus_core_ux-0.1.0/janus_ux/widgets/log_console.py +96 -0
- janus_core_ux-0.1.0/janus_ux/widgets/structure_file_input.py +145 -0
- janus_core_ux-0.1.0/janus_ux/widgets/structure_inspector.py +146 -0
- janus_core_ux-0.1.0/pyproject.toml +54 -0
- janus_core_ux-0.1.0/setup.cfg +4 -0
- janus_core_ux-0.1.0/tests/test_calculator_selector.py +35 -0
- janus_core_ux-0.1.0/tests/test_chemiscope.py +37 -0
- janus_core_ux-0.1.0/tests/test_desktop.py +21 -0
- janus_core_ux-0.1.0/tests/test_env_manager.py +39 -0
- janus_core_ux-0.1.0/tests/test_interactive_graph.py +36 -0
- janus_core_ux-0.1.0/tests/test_parser.py +51 -0
- janus_core_ux-0.1.0/tests/test_runner.py +16 -0
- janus_core_ux-0.1.0/tests/test_structure_file_input.py +43 -0
- janus_core_ux-0.1.0/tests/test_structure_inspector.py +33 -0
- 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
|
+

|
|
38
|
+

|
|
39
|
+

|
|
40
|
+

|
|
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
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
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
|
+

|
|
38
|
+

|
|
39
|
+

|
|
40
|
+

|
|
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 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
janus_ux
|
|
@@ -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
|
+
)
|
|
Binary file
|
|
@@ -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
|