canns 0.14.0__py3-none-any.whl → 0.14.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,12 +42,20 @@ def main() -> int:
42
42
  app.setApplicationDisplayName("ASA GUI")
43
43
  QGuiApplication.setApplicationDisplayName("ASA GUI")
44
44
 
45
- base = Path(__file__).resolve().parents[4] / "images"
46
- logo_path = base / "logo_256.png"
45
+ from .resources import resource_path
46
+
47
+ logo_path = resource_path("logo_256.png")
48
+ if not logo_path.exists():
49
+ logo_path = resource_path("logo.svg")
47
50
  if not logo_path.exists():
48
- logo_path = base / "logo.svg"
51
+ logo_path = resource_path("logo.ico")
49
52
  if not logo_path.exists():
50
- logo_path = base / "logo.ico"
53
+ base = Path(__file__).resolve().parents[4] / "images"
54
+ logo_path = base / "logo_256.png"
55
+ if not logo_path.exists():
56
+ logo_path = base / "logo.svg"
57
+ if not logo_path.exists():
58
+ logo_path = base / "logo.ico"
51
59
  icon = QIcon(str(logo_path)) if logo_path.exists() else QIcon()
52
60
  if not icon.isNull():
53
61
  app.setWindowIcon(icon)
@@ -20,7 +20,7 @@ from PySide6.QtWidgets import (
20
20
 
21
21
  from .controllers import AnalysisController, PreprocessController
22
22
  from .core import PipelineRunner, StateManager, WorkerManager
23
- from .resources import load_theme_qss
23
+ from .resources import load_theme_qss, resource_path
24
24
  from .views.pages.analysis_page import AnalysisPage
25
25
  from .views.pages.preprocess_page import PreprocessPage
26
26
  from .views.widgets.popup_combo import PopupComboBox
@@ -164,12 +164,13 @@ class MainWindow(QMainWindow):
164
164
  pass
165
165
 
166
166
  def _load_logo_pixmap(self, height: int):
167
- from pathlib import Path
168
-
169
- base = Path(__file__).resolve().parents[4] / "images"
170
- logo_path = base / "logo.svg"
167
+ logo_path = resource_path("logo.svg")
171
168
  if not logo_path.exists():
172
- return None
169
+ from pathlib import Path
170
+
171
+ logo_path = Path(__file__).resolve().parents[4] / "images" / "logo.svg"
172
+ if not logo_path.exists():
173
+ return None
173
174
  icon = QIcon(str(logo_path))
174
175
  if icon.isNull():
175
176
  return None
@@ -14,3 +14,8 @@ def load_theme_qss(theme: str) -> str:
14
14
  fname = "light.qss"
15
15
  path = Path(__file__).parent / fname
16
16
  return path.read_text(encoding="utf-8")
17
+
18
+
19
+ def resource_path(name: str) -> Path:
20
+ """Return the package resource path for a bundled file."""
21
+ return Path(__file__).parent / name
@@ -0,0 +1,369 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1099.81 387.71">
3
+ <defs>
4
+ <style>
5
+ .cls-1, .cls-2 {
6
+ fill: none;
7
+ }
8
+
9
+ .cls-3 {
10
+ fill: #9600bf;
11
+ }
12
+
13
+ .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-2, .cls-8, .cls-9, .cls-10, .cls-11, .cls-12, .cls-13, .cls-14, .cls-15, .cls-16, .cls-17, .cls-18, .cls-19 {
14
+ stroke: #fff;
15
+ stroke-linejoin: round;
16
+ }
17
+
18
+ .cls-4 {
19
+ fill: #009c70;
20
+ }
21
+
22
+ .cls-5 {
23
+ fill: #350400;
24
+ }
25
+
26
+ .cls-6 {
27
+ fill: #002faa;
28
+ }
29
+
30
+ .cls-7 {
31
+ fill: #00ce53;
32
+ }
33
+
34
+ .cls-8 {
35
+ fill: #9f2800;
36
+ }
37
+
38
+ .cls-9 {
39
+ fill: #8a0b00;
40
+ }
41
+
42
+ .cls-20 {
43
+ clip-path: url(#clippath-1);
44
+ }
45
+
46
+ .cls-10 {
47
+ fill: #1200df;
48
+ }
49
+
50
+ .cls-11 {
51
+ fill: #9f5000;
52
+ }
53
+
54
+ .cls-12 {
55
+ fill: #004b94;
56
+ }
57
+
58
+ .cls-13 {
59
+ fill: #7500b4;
60
+ }
61
+
62
+ .cls-14 {
63
+ fill: #c97700;
64
+ }
65
+
66
+ .cls-15 {
67
+ fill: #bc00c9;
68
+ }
69
+
70
+ .cls-16 {
71
+ fill: #d41a00;
72
+ }
73
+
74
+ .cls-17 {
75
+ fill: #2a72ff;
76
+ }
77
+
78
+ .cls-18 {
79
+ fill: #ff7e1f;
80
+ }
81
+
82
+ .cls-21 {
83
+ clip-path: url(#clippath);
84
+ }
85
+
86
+ .cls-19 {
87
+ fill: #00c570;
88
+ }
89
+ </style>
90
+ <clipPath id="clippath">
91
+ <polygon class="cls-1" points="799.99 32.33 799.99 32.41 750.01 59.66 700.02 32.36 700.02 32.33 750.01 5 750.01 5 799.99 32.33"/>
92
+ </clipPath>
93
+ <clipPath id="clippath-1">
94
+ <rect class="cls-1" x="695.02" width="109.97" height="64.66"/>
95
+ </clipPath>
96
+ </defs>
97
+ <g id="C">
98
+ <polygon class="cls-10" points="200.56 31.32 200.56 31.4 150.58 58.65 100.59 31.35 100.59 31.32 150.58 3.99 150.58 3.99 200.56 31.32"/>
99
+ <polygon class="cls-17" points="200.44 31.54 200.44 86.13 150.45 113.46 150.45 58.8 200.44 31.54"/>
100
+ <polygon class="cls-17" points="150.45 58.8 150.45 113.46 100.47 86.13 100.47 31.49 150.45 58.8"/>
101
+ <polygon class="cls-17" points="200.44 304.76 200.44 359.42 150.45 332.09 150.45 277.45 200.44 304.76"/>
102
+ <polygon class="cls-10" points="250.42 58.75 250.42 58.82 200.44 86.08 150.45 58.77 150.45 58.75 200.44 31.42 200.44 31.41 250.42 58.75"/>
103
+ <polygon class="cls-12" points="200.44 86.08 200.44 140.74 150.45 113.41 150.45 58.77 200.44 86.08"/>
104
+ <polygon class="cls-10" points="150.45 58.72 150.45 58.8 100.47 86.05 50.48 58.75 50.48 58.72 100.47 31.39 100.47 31.39 150.45 58.72"/>
105
+ <polygon class="cls-6" points="150.45 58.8 150.45 113.38 100.47 140.72 100.47 86.05 150.45 58.8"/>
106
+ <polygon class="cls-6" points="250.42 58.8 250.42 113.38 200.43 140.72 200.43 86.05 250.42 58.8"/>
107
+ <polygon class="cls-6" points="100.47 86.05 100.47 140.72 50.48 113.38 50.48 58.75 100.47 86.05"/>
108
+ <polygon class="cls-12" points="100.47 250.04 100.47 250.12 50.48 277.37 .5 250.07 .5 250.04 50.48 222.71 50.49 222.71 100.47 250.04"/>
109
+ <polygon class="cls-17" points="100.47 250.12 100.47 304.71 50.48 332.04 50.48 277.37 100.47 250.12"/>
110
+ <polygon class="cls-12" points="50.48 277.37 50.48 332.04 .5 304.7 .5 250.07 50.48 277.37"/>
111
+ <polygon class="cls-6" points="100.47 195.38 100.47 195.46 50.48 222.71 .5 195.41 .5 195.38 50.48 168.05 50.49 168.05 100.47 195.38"/>
112
+ <polygon class="cls-6" points="100.47 195.46 100.47 250.04 50.48 277.37 50.48 222.71 100.47 195.46"/>
113
+ <polygon class="cls-12" points="50.48 222.71 50.48 277.37 .5 250.04 .5 195.41 50.48 222.71"/>
114
+ <polygon class="cls-6" points="100.47 140.72 100.47 140.79 50.48 168.05 .5 140.74 .5 140.71 50.48 113.39 50.49 113.38 100.47 140.72"/>
115
+ <polygon class="cls-6" points="100.47 140.79 100.47 195.38 50.48 222.71 50.48 168.05 100.47 140.79"/>
116
+ <polygon class="cls-12" points="50.48 168.05 50.48 222.71 .5 195.38 .5 140.74 50.48 168.05"/>
117
+ <polygon class="cls-10" points="100.47 86.05 100.47 86.13 50.48 113.38 .5 86.08 .5 86.05 50.48 58.72 50.49 58.72 100.47 86.05"/>
118
+ <polygon class="cls-6" points="100.47 86.13 100.47 140.72 50.48 168.05 50.48 113.38 100.47 86.13"/>
119
+ <polygon class="cls-12" points="50.48 113.38 50.48 168.05 .5 140.71 .5 86.08 50.48 113.38"/>
120
+ <polygon class="cls-10" points="150.45 277.38 150.45 277.45 100.47 304.71 50.48 277.4 50.48 277.37 100.47 250.05 100.47 250.04 150.45 277.38"/>
121
+ <polygon class="cls-17" points="150.45 277.45 150.45 332.04 100.47 359.37 100.47 304.71 150.45 277.45"/>
122
+ <polygon class="cls-12" points="100.47 304.71 100.47 359.37 50.48 332.04 50.48 277.4 100.47 304.71"/>
123
+ <polygon class="cls-10" points="200.44 304.68 200.44 304.76 150.45 332.01 100.47 304.71 100.47 304.68 150.45 277.35 150.45 277.35 200.44 304.68"/>
124
+ <polygon class="cls-6" points="200.44 304.76 200.44 359.34 150.45 386.68 150.45 332.01 200.44 304.76"/>
125
+ <polygon class="cls-12" points="150.45 332.01 150.45 386.68 100.47 359.34 100.47 304.71 150.45 332.01"/>
126
+ </g>
127
+ <g id="A">
128
+ <g id="basic_A">
129
+ <polygon class="cls-4" points="450.34 222.79 450.34 277.38 425.6 290.91 425.59 290.91 403.98 302.73 400.36 304.71 400.35 304.71 400.35 250.04 400.36 250.04 400.6 249.9 425.59 236.28 425.6 236.28 450.34 222.79"/>
130
+ <polygon class="cls-7" points="450.34 222.71 450.34 222.79 400.36 250.04 350.37 222.74 350.37 222.71 400.36 195.38 400.36 195.38 450.34 222.71"/>
131
+ <polygon class="cls-19" points="400.36 250.04 400.36 304.71 350.37 277.37 350.37 222.74 400.36 250.04"/>
132
+ </g>
133
+ <g id="basic_A-2" data-name="basic_A">
134
+ <polygon class="cls-4" points="350.38 222.99 350.38 277.58 325.64 291.11 325.63 291.11 304.02 302.93 300.4 304.91 300.39 304.91 300.39 250.24 300.4 250.24 300.64 250.1 325.63 236.48 325.64 236.48 350.38 222.99"/>
135
+ <polygon class="cls-7" points="350.38 222.92 350.38 222.99 300.4 250.25 250.41 222.94 250.41 222.91 300.4 195.59 300.4 195.58 350.38 222.92"/>
136
+ <polygon class="cls-19" points="300.4 250.25 300.4 304.91 250.41 277.58 250.41 222.94 300.4 250.25"/>
137
+ </g>
138
+ <g id="basic_A-3" data-name="basic_A">
139
+ <polygon class="cls-4" points="300.4 195.58 300.4 250.17 275.66 263.7 275.65 263.7 254.04 275.52 250.42 277.5 250.41 277.5 250.41 222.83 250.42 222.83 250.66 222.69 275.65 209.07 275.66 209.07 300.4 195.58"/>
140
+ <polygon class="cls-7" points="300.4 195.51 300.4 195.58 250.41 222.84 200.43 195.53 200.43 195.5 250.41 168.18 250.42 168.17 300.4 195.51"/>
141
+ <polygon class="cls-19" points="250.41 222.84 250.41 277.5 200.43 250.17 200.43 195.53 250.41 222.84"/>
142
+ </g>
143
+ <g id="basic_A-4" data-name="basic_A">
144
+ <polygon class="cls-4" points="350.38 114.21 350.38 168.8 325.64 182.33 325.63 182.33 304.02 194.15 300.4 196.13 300.39 196.13 300.39 141.46 300.4 141.46 300.64 141.32 325.63 127.7 325.64 127.7 350.38 114.21"/>
145
+ <polygon class="cls-7" points="350.37 114.14 350.37 114.22 300.39 141.47 250.41 114.16 250.41 114.14 300.39 86.81 300.39 86.81 350.37 114.14"/>
146
+ <polygon class="cls-19" points="300.39 141.47 300.39 196.13 250.41 168.8 250.41 114.16 300.39 141.47"/>
147
+ </g>
148
+ <g id="basic_A-5" data-name="basic_A">
149
+ <polygon class="cls-4" points="450.36 114.21 450.36 168.8 425.62 182.33 425.61 182.33 404 194.15 400.38 196.13 400.37 196.13 400.37 141.46 400.38 141.46 400.62 141.32 425.61 127.7 425.62 127.7 450.36 114.21"/>
150
+ <polygon class="cls-7" points="450.36 114.14 450.36 114.21 400.38 141.47 350.39 114.16 350.39 114.14 400.38 86.81 400.38 86.8 450.36 114.14"/>
151
+ <polygon class="cls-19" points="400.38 141.47 400.38 196.13 350.39 168.8 350.39 114.16 400.38 141.47"/>
152
+ </g>
153
+ <g id="basic_A-6" data-name="basic_A">
154
+ <polygon class="cls-4" points="400.36 32.29 400.36 86.88 375.62 100.41 375.61 100.41 354 112.23 350.38 114.21 350.37 114.21 350.37 59.54 350.38 59.54 350.62 59.4 375.61 45.78 375.62 45.78 400.36 32.29"/>
155
+ <polygon class="cls-7" points="400.36 32.22 400.36 32.3 350.37 59.55 300.39 32.24 300.39 32.22 350.37 4.89 350.38 4.89 400.36 32.22"/>
156
+ <polygon class="cls-19" points="350.37 59.55 350.37 114.21 300.39 86.88 300.39 32.24 350.37 59.55"/>
157
+ </g>
158
+ <g id="basic_A-7" data-name="basic_A">
159
+ <polygon class="cls-4" points="550.33 277.42 550.33 332.01 525.59 345.54 525.58 345.54 503.97 357.36 500.35 359.34 500.34 359.34 500.34 304.67 500.35 304.67 500.59 304.53 525.58 290.91 525.59 290.91 550.33 277.42"/>
160
+ <polygon class="cls-7" points="550.33 277.35 550.33 277.42 500.35 304.68 450.36 277.37 450.36 277.35 500.35 250.02 500.35 250.02 550.33 277.35"/>
161
+ <polygon class="cls-19" points="500.35 304.68 500.35 359.34 450.36 332.01 450.36 277.37 500.35 304.68"/>
162
+ </g>
163
+ <g id="basic_A-8" data-name="basic_A">
164
+ <polygon class="cls-4" points="500.34 195.5 500.34 250.09 475.6 263.62 475.59 263.62 453.98 275.44 450.36 277.42 450.35 277.42 450.35 222.75 450.36 222.75 450.6 222.61 475.59 208.99 475.6 208.99 500.34 195.5"/>
165
+ <polygon class="cls-7" points="500.34 195.43 500.34 195.51 450.35 222.76 400.37 195.45 400.37 195.43 450.35 168.1 450.36 168.1 500.34 195.43"/>
166
+ <polygon class="cls-19" points="450.35 222.76 450.35 277.42 400.37 250.09 400.37 195.45 450.35 222.76"/>
167
+ </g>
168
+ <polygon class="cls-7" points="250.41 277.43 250.41 277.51 250.03 277.72 200.43 304.76 150.45 277.46 150.45 277.43 150.52 277.39 200.43 250.1 200.89 250.35 250.41 277.43"/>
169
+ <polygon class="cls-4" points="250.42 277.5 250.42 332.09 200.44 359.42 200.44 304.76 250.42 277.5"/>
170
+ </g>
171
+ <g id="s">
172
+ <g id="basic_s">
173
+ <polygon class="cls-8" points="1099.13 305.42 1099.13 305.46 1074.13 319.08 1049.14 305.43 1049.14 305.42 1074.13 291.75 1074.14 291.75 1099.13 305.42"/>
174
+ <polygon class="cls-5" points="1099.13 278.12 1099.13 305.41 1086.76 312.18 1086.75 312.18 1075.95 318.09 1074.14 319.08 1074.13 319.08 1074.13 291.74 1074.14 291.74 1074.26 291.67 1086.75 284.86 1086.76 284.86 1099.13 278.12"/>
175
+ <polygon class="cls-16" points="1099.13 278.08 1099.13 278.12 1074.13 291.74 1049.14 278.09 1049.14 278.08 1074.13 264.41 1074.14 264.41 1099.13 278.08"/>
176
+ <polygon class="cls-9" points="1074.13 291.74 1074.13 319.08 1049.14 305.41 1049.14 278.09 1074.13 291.74"/>
177
+ </g>
178
+ <g id="basic_s-2" data-name="basic_s">
179
+ <polygon class="cls-8" points="1074.14 319.09 1074.14 319.12 1049.14 332.75 1024.15 319.1 1024.15 319.08 1049.14 305.42 1049.14 305.42 1074.14 319.09"/>
180
+ <polygon class="cls-5" points="1074.14 291.79 1074.14 319.08 1061.77 325.85 1061.76 325.85 1050.96 331.76 1049.15 332.75 1049.14 332.75 1049.14 305.41 1049.15 305.41 1049.27 305.34 1061.76 298.53 1061.77 298.53 1074.14 291.79"/>
181
+ <polygon class="cls-16" points="1074.14 291.75 1074.14 291.79 1049.14 305.41 1024.15 291.76 1024.15 291.75 1049.14 278.08 1049.15 278.08 1074.14 291.75"/>
182
+ <polygon class="cls-9" points="1049.14 305.41 1049.14 332.74 1024.15 319.08 1024.15 291.76 1049.14 305.41"/>
183
+ </g>
184
+ <g id="basic_s-3" data-name="basic_s">
185
+ <polygon class="cls-8" points="1049.14 332.94 1049.14 332.98 1024.15 346.61 999.16 332.96 999.16 332.94 1024.15 319.28 1024.15 319.28 1049.14 332.94"/>
186
+ <polygon class="cls-5" points="1049.15 305.64 1049.15 332.94 1036.78 339.7 1036.77 339.7 1025.97 345.61 1024.16 346.6 1024.15 346.6 1024.15 319.27 1024.16 319.27 1024.28 319.2 1036.77 312.39 1036.78 312.39 1049.15 305.64"/>
187
+ <polygon class="cls-16" points="1049.14 305.61 1049.14 305.64 1024.15 319.27 999.16 305.62 999.16 305.6 1024.15 291.94 1024.15 291.94 1049.14 305.61"/>
188
+ <polygon class="cls-9" points="1024.15 319.27 1024.15 346.6 999.16 332.94 999.16 305.62 1024.15 319.27"/>
189
+ </g>
190
+ <g id="basic_s-4" data-name="basic_s">
191
+ <polygon class="cls-8" points="1024.15 346.61 1024.15 346.65 999.16 360.28 974.17 346.63 974.17 346.61 999.16 332.95 999.16 332.95 1024.15 346.61"/>
192
+ <polygon class="cls-5" points="1024.15 319.31 1024.15 346.61 1011.78 353.37 1011.78 353.37 1000.97 359.28 999.16 360.27 999.16 360.27 999.16 332.94 999.16 332.94 999.28 332.87 1011.78 326.06 1011.78 326.06 1024.15 319.31"/>
193
+ <polygon class="cls-16" points="1024.15 319.28 1024.15 319.31 999.16 332.94 974.17 319.29 974.17 319.27 999.16 305.61 999.16 305.61 1024.15 319.28"/>
194
+ <polygon class="cls-9" points="999.16 332.94 999.16 360.27 974.17 346.61 974.17 319.29 999.16 332.94"/>
195
+ </g>
196
+ <g id="basic_s-5" data-name="basic_s">
197
+ <polygon class="cls-8" points="1099.13 278.13 1099.13 278.17 1074.14 291.79 1049.14 278.14 1049.14 278.13 1074.14 264.46 1074.14 264.46 1099.13 278.13"/>
198
+ <polygon class="cls-5" points="1099.13 250.83 1099.13 278.12 1086.76 284.89 1086.75 284.89 1075.95 290.8 1074.14 291.79 1074.13 291.79 1074.13 264.45 1074.14 264.45 1074.26 264.38 1086.75 257.57 1086.76 257.57 1099.13 250.83"/>
199
+ <polygon class="cls-16" points="1099.13 250.79 1099.13 250.83 1074.14 264.45 1049.14 250.8 1049.14 250.79 1074.14 237.12 1074.14 237.12 1099.13 250.79"/>
200
+ <polygon class="cls-9" points="1074.14 264.45 1074.14 291.79 1049.14 278.12 1049.14 250.8 1074.14 264.45"/>
201
+ </g>
202
+ <g id="basic_s-6" data-name="basic_s">
203
+ <polygon class="cls-8" points="1099.13 250.75 1099.13 250.79 1074.14 264.42 1049.14 250.77 1049.14 250.75 1074.14 237.09 1074.14 237.09 1099.13 250.75"/>
204
+ <polygon class="cls-5" points="1099.13 223.45 1099.13 250.75 1086.76 257.51 1086.75 257.51 1075.95 263.42 1074.14 264.41 1074.13 264.41 1074.13 237.08 1074.14 237.08 1074.26 237.01 1086.75 230.2 1086.76 230.2 1099.13 223.45"/>
205
+ <polygon class="cls-16" points="1099.13 223.41 1099.13 223.45 1074.14 237.08 1049.14 223.43 1049.14 223.41 1074.14 209.75 1074.14 209.75 1099.13 223.41"/>
206
+ <polygon class="cls-9" points="1074.14 237.08 1074.14 264.41 1049.14 250.75 1049.14 223.43 1074.14 237.08"/>
207
+ </g>
208
+ <g id="basic_s-7" data-name="basic_s">
209
+ <polygon class="cls-8" points="1074.13 264.42 1074.13 264.45 1049.14 278.08 1024.15 264.43 1024.15 264.41 1049.14 250.75 1049.14 250.75 1074.13 264.42"/>
210
+ <polygon class="cls-5" points="1074.13 237.12 1074.13 264.41 1061.76 271.18 1061.76 271.18 1050.95 277.09 1049.14 278.08 1049.14 278.08 1049.14 250.74 1049.14 250.74 1049.26 250.67 1061.76 243.86 1061.76 243.86 1074.13 237.12"/>
211
+ <polygon class="cls-16" points="1074.13 237.08 1074.13 237.12 1049.14 250.74 1024.15 237.09 1024.15 237.08 1049.14 223.41 1049.14 223.41 1074.13 237.08"/>
212
+ <polygon class="cls-9" points="1049.14 250.74 1049.14 278.07 1024.15 264.41 1024.15 237.09 1049.14 250.74"/>
213
+ </g>
214
+ <g id="basic_s-8" data-name="basic_s">
215
+ <polygon class="cls-8" points="1049.14 278.1 1049.14 278.14 1024.15 291.77 999.16 278.11 999.16 278.1 1024.15 264.44 1024.15 264.43 1049.14 278.1"/>
216
+ <polygon class="cls-5" points="1049.15 250.8 1049.15 278.1 1036.78 284.86 1036.77 284.86 1025.97 290.77 1024.16 291.76 1024.15 291.76 1024.15 264.43 1024.16 264.43 1024.28 264.36 1036.77 257.55 1036.78 257.55 1049.15 250.8"/>
217
+ <polygon class="cls-16" points="1049.14 250.76 1049.14 250.8 1024.15 264.43 999.16 250.78 999.16 250.76 1024.15 237.1 1024.15 237.1 1049.14 250.76"/>
218
+ <polygon class="cls-9" points="1024.15 264.43 1024.15 291.76 999.16 278.09 999.16 250.78 1024.15 264.43"/>
219
+ </g>
220
+ <g id="basic_s-9" data-name="basic_s">
221
+ <polygon class="cls-8" points="1024.15 291.74 1024.15 291.78 999.16 305.41 974.17 291.76 974.17 291.74 999.16 278.08 999.16 278.08 1024.15 291.74"/>
222
+ <polygon class="cls-5" points="1024.15 264.44 1024.15 291.74 1011.78 298.5 1011.78 298.5 1000.97 304.41 999.16 305.4 999.16 305.4 999.16 278.07 999.16 278.07 999.28 278 1011.78 271.19 1011.78 271.19 1024.15 264.44"/>
223
+ <polygon class="cls-16" points="1024.15 264.41 1024.15 264.44 999.16 278.07 974.17 264.42 974.17 264.4 999.16 250.74 999.16 250.74 1024.15 264.41"/>
224
+ <polygon class="cls-9" points="999.16 278.07 999.16 305.4 974.17 291.74 974.17 264.42 999.16 278.07"/>
225
+ </g>
226
+ <g id="basic_s-10" data-name="basic_s">
227
+ <polygon class="cls-8" points="1024.15 264.5 1024.15 264.53 999.16 278.16 974.17 264.51 974.17 264.49 999.16 250.83 999.16 250.83 1024.15 264.5"/>
228
+ <polygon class="cls-5" points="1024.15 237.2 1024.15 264.49 1011.78 271.26 1011.78 271.26 1000.97 277.17 999.16 278.16 999.16 278.16 999.16 250.82 999.16 250.82 999.28 250.75 1011.78 243.94 1011.78 243.94 1024.15 237.2"/>
229
+ <polygon class="cls-16" points="1024.15 237.16 1024.15 237.2 999.16 250.82 974.17 237.17 974.17 237.16 999.16 223.49 999.16 223.49 1024.15 237.16"/>
230
+ <polygon class="cls-9" points="999.16 250.82 999.16 278.16 974.17 264.49 974.17 237.17 999.16 250.82"/>
231
+ </g>
232
+ <g id="basic_s-11" data-name="basic_s">
233
+ <polygon class="cls-8" points="1099.31 196.55 1099.31 196.58 1074.32 210.21 1049.32 196.56 1049.32 196.54 1074.32 182.88 1074.32 182.88 1099.31 196.55"/>
234
+ <polygon class="cls-5" points="1099.31 169.25 1099.31 196.54 1086.94 203.31 1086.93 203.31 1076.13 209.22 1074.32 210.21 1074.31 210.21 1074.31 182.87 1074.32 182.87 1074.44 182.8 1086.93 175.99 1086.94 175.99 1099.31 169.25"/>
235
+ <polygon class="cls-16" points="1099.31 169.21 1099.31 169.25 1074.32 182.87 1049.33 169.22 1049.33 169.21 1074.32 155.54 1074.32 155.54 1099.31 169.21"/>
236
+ <polygon class="cls-9" points="1074.32 182.87 1074.32 210.21 1049.33 196.54 1049.33 169.22 1074.32 182.87"/>
237
+ </g>
238
+ <g id="basic_s-12" data-name="basic_s">
239
+ <polygon class="cls-8" points="1074.32 210.17 1074.32 210.21 1049.33 223.83 1024.34 210.18 1024.34 210.17 1049.33 196.5 1049.33 196.5 1074.32 210.17"/>
240
+ <polygon class="cls-5" points="1074.32 182.87 1074.32 210.16 1061.95 216.93 1061.95 216.93 1051.14 222.84 1049.33 223.83 1049.33 223.83 1049.33 196.49 1049.33 196.49 1049.45 196.42 1061.95 189.61 1061.95 189.61 1074.32 182.87"/>
241
+ <polygon class="cls-16" points="1074.32 182.83 1074.32 182.87 1049.33 196.49 1024.34 182.84 1024.34 182.83 1049.33 169.16 1049.33 169.16 1074.32 182.83"/>
242
+ <polygon class="cls-9" points="1049.33 196.49 1049.33 223.83 1024.34 210.16 1024.34 182.84 1049.33 196.49"/>
243
+ </g>
244
+ <g id="basic_s-13" data-name="basic_s">
245
+ <polygon class="cls-8" points="1049.32 223.84 1049.32 223.87 1024.33 237.5 999.34 223.85 999.34 223.83 1024.33 210.17 1024.33 210.17 1049.32 223.84"/>
246
+ <polygon class="cls-5" points="1049.33 196.54 1049.33 223.83 1036.96 230.6 1036.95 230.6 1026.15 236.51 1024.34 237.5 1024.33 237.5 1024.33 210.16 1024.34 210.16 1024.46 210.09 1036.95 203.28 1036.96 203.28 1049.33 196.54"/>
247
+ <polygon class="cls-16" points="1049.33 196.5 1049.33 196.54 1024.33 210.16 999.34 196.51 999.34 196.5 1024.33 182.83 1024.34 182.83 1049.33 196.5"/>
248
+ <polygon class="cls-9" points="1024.33 210.16 1024.33 237.49 999.34 223.83 999.34 196.51 1024.33 210.16"/>
249
+ </g>
250
+ <g id="basic_s-14" data-name="basic_s">
251
+ <polygon class="cls-8" points="1024.34 237.51 1024.34 237.54 999.34 251.17 974.35 237.52 974.35 237.5 999.34 223.84 999.35 223.84 1024.34 237.51"/>
252
+ <polygon class="cls-5" points="1024.34 210.2 1024.34 237.5 1011.97 244.26 1011.96 244.26 1001.16 250.17 999.35 251.16 999.34 251.16 999.34 223.83 999.35 223.83 999.47 223.76 1011.96 216.95 1011.97 216.95 1024.34 210.2"/>
253
+ <polygon class="cls-16" points="1024.34 210.17 1024.34 210.21 999.35 223.83 974.35 210.18 974.35 210.17 999.35 196.5 999.35 196.5 1024.34 210.17"/>
254
+ <polygon class="cls-9" points="999.35 223.83 999.35 251.16 974.35 237.5 974.35 210.18 999.35 223.83"/>
255
+ </g>
256
+ </g>
257
+ <g>
258
+ <g class="cls-21">
259
+ <g class="cls-20">
260
+ <image width="230" height="136" transform="translate(694.68 -.39) scale(.48)" xlink:href="data:image/png;base64,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"/>
261
+ </g>
262
+ </g>
263
+ <polygon class="cls-2" points="799.99 32.33 799.99 32.41 750.01 59.66 700.02 32.36 700.02 32.33 750.01 5 750.01 5 799.99 32.33"/>
264
+ </g>
265
+ <g id="N2">
266
+ <g id="basic_N2">
267
+ <polygon class="cls-11" points="849.94 223.16 849.94 277.75 825.2 291.28 825.19 291.28 803.58 303.1 799.96 305.08 799.95 305.08 799.95 250.41 799.96 250.41 800.2 250.27 825.19 236.65 825.2 236.65 849.94 223.16"/>
268
+ <polygon class="cls-18" points="849.94 223.08 849.94 223.16 799.96 250.41 749.97 223.11 749.97 223.08 799.96 195.75 799.96 195.75 849.94 223.08"/>
269
+ <polygon class="cls-14" points="799.96 250.41 799.96 305.08 749.97 277.75 749.97 223.11 799.96 250.41"/>
270
+ </g>
271
+ <g id="basic_N2-2" data-name="basic_N2">
272
+ <polygon class="cls-11" points="849.94 168.6 849.94 223.19 825.2 236.72 825.19 236.72 803.58 248.54 799.96 250.52 799.95 250.52 799.95 195.85 799.96 195.85 800.2 195.71 825.19 182.09 825.2 182.09 849.94 168.6"/>
273
+ <polygon class="cls-18" points="849.94 168.52 849.94 168.6 799.96 195.85 749.97 168.55 749.97 168.52 799.96 141.19 799.96 141.19 849.94 168.52"/>
274
+ <polygon class="cls-14" points="799.96 195.85 799.96 250.52 749.97 223.18 749.97 168.55 799.96 195.85"/>
275
+ </g>
276
+ <g id="basic_N2-3" data-name="basic_N2">
277
+ <polygon class="cls-11" points="849.94 113.93 849.94 168.52 825.2 182.05 825.19 182.05 803.58 193.87 799.96 195.85 799.95 195.85 799.95 141.18 799.96 141.18 800.2 141.04 825.19 127.42 825.2 127.42 849.94 113.93"/>
278
+ <polygon class="cls-18" points="849.94 113.86 849.94 113.94 799.96 141.19 749.97 113.88 749.97 113.86 799.96 86.53 799.96 86.53 849.94 113.86"/>
279
+ <polygon class="cls-14" points="799.96 141.19 799.96 195.85 749.97 168.52 749.97 113.88 799.96 141.19"/>
280
+ </g>
281
+ <g id="basic_N2-4" data-name="basic_N2">
282
+ <polygon class="cls-11" points="849.95 59.72 849.95 114.31 825.21 127.84 825.2 127.84 803.59 139.66 799.97 141.64 799.96 141.64 799.96 86.97 799.97 86.97 800.21 86.83 825.2 73.21 825.21 73.21 849.95 59.72"/>
283
+ <polygon class="cls-18" points="849.94 59.64 849.94 59.72 799.96 86.98 749.98 59.67 749.98 59.64 799.96 32.31 799.96 32.31 849.94 59.64"/>
284
+ <polygon class="cls-14" points="799.96 86.98 799.96 141.64 749.98 114.31 749.98 59.67 799.96 86.98"/>
285
+ </g>
286
+ <g id="basic_N2-5" data-name="basic_N2">
287
+ <polygon class="cls-14" points="949.91 223.33 949.91 277.92 925.17 291.45 925.16 291.45 903.55 303.27 899.93 305.25 899.92 305.25 899.92 250.58 899.93 250.58 900.17 250.44 925.16 236.82 925.17 236.82 949.91 223.33"/>
288
+ <polygon class="cls-18" points="949.91 223.26 949.91 223.33 899.93 250.59 849.94 223.28 849.94 223.25 899.93 195.93 899.93 195.92 949.91 223.26"/>
289
+ <polygon class="cls-14" points="899.93 250.59 899.93 305.25 849.94 277.92 849.94 223.28 899.93 250.59"/>
290
+ </g>
291
+ <g id="basic_N2-6" data-name="basic_N2">
292
+ <polygon class="cls-11" points="899.93 141.59 899.93 196.18 875.19 209.71 875.18 209.71 853.57 221.53 849.95 223.51 849.94 223.51 849.94 168.84 849.95 168.84 850.19 168.7 875.18 155.08 875.19 155.08 899.93 141.59"/>
293
+ <polygon class="cls-18" points="899.93 141.52 899.93 141.59 849.94 168.85 799.96 141.54 799.96 141.52 849.94 114.19 849.95 114.18 899.93 141.52"/>
294
+ <polygon class="cls-14" points="849.94 168.85 849.94 223.51 799.96 196.18 799.96 141.54 849.94 168.85"/>
295
+ </g>
296
+ <g id="basic_N2-7" data-name="basic_N2">
297
+ <polygon class="cls-11" points="999.9 305.29 999.9 359.88 975.16 373.41 975.15 373.41 953.54 385.23 949.92 387.21 949.91 387.21 949.91 332.54 949.92 332.54 950.16 332.4 975.15 318.78 975.16 318.78 999.9 305.29"/>
298
+ <polygon class="cls-18" points="999.89 305.22 999.89 305.29 949.91 332.55 899.93 305.24 899.93 305.22 949.91 277.89 949.91 277.88 999.89 305.22"/>
299
+ <polygon class="cls-14" points="949.91 332.55 949.91 387.21 899.93 359.88 899.93 305.24 949.91 332.55"/>
300
+ </g>
301
+ <g id="basic_N2-8" data-name="basic_N2">
302
+ <polygon class="cls-11" points="999.9 250.58 999.9 305.17 975.16 318.7 975.15 318.7 953.54 330.52 949.92 332.5 949.91 332.5 949.91 277.83 949.92 277.83 950.16 277.69 975.15 264.07 975.16 264.07 999.9 250.58"/>
303
+ <polygon class="cls-11" points="999.9 250.51 999.9 250.58 949.91 277.84 899.93 250.53 899.93 250.5 949.91 223.18 949.92 223.17 999.9 250.51"/>
304
+ <polygon class="cls-14" points="949.91 277.84 949.91 332.5 899.93 305.17 899.93 250.53 949.91 277.84"/>
305
+ </g>
306
+ <g id="basic_N2-9" data-name="basic_N2">
307
+ <polygon class="cls-11" points="999.9 195.92 999.9 250.51 975.16 264.04 975.15 264.04 953.54 275.86 949.92 277.84 949.91 277.84 949.91 223.17 949.92 223.17 950.16 223.03 975.15 209.41 975.16 209.41 999.9 195.92"/>
308
+ <polygon class="cls-18" points="999.9 195.84 999.9 195.92 949.91 223.17 899.93 195.87 899.93 195.84 949.91 168.51 949.92 168.51 999.9 195.84"/>
309
+ <polygon class="cls-14" points="949.91 223.17 949.91 277.84 899.93 250.5 899.93 195.87 949.91 223.17"/>
310
+ </g>
311
+ <g id="basic_N2-10" data-name="basic_N2">
312
+ <polygon class="cls-11" points="999.91 141.73 999.91 196.32 975.17 209.85 975.16 209.85 953.55 221.67 949.93 223.65 949.92 223.65 949.92 168.98 949.93 168.98 950.17 168.84 975.16 155.22 975.17 155.22 999.91 141.73"/>
313
+ <polygon class="cls-18" points="999.91 141.66 999.91 141.73 949.93 168.99 899.94 141.68 899.94 141.65 949.93 114.33 949.93 114.32 999.91 141.66"/>
314
+ <polygon class="cls-14" points="949.93 168.99 949.93 223.65 899.94 196.32 899.94 141.68 949.93 168.99"/>
315
+ </g>
316
+ </g>
317
+ <g id="N1">
318
+ <g id="basic_N1">
319
+ <polygon class="cls-13" points="750.04 223.12 750.04 277.71 725.3 291.24 725.29 291.24 703.68 303.06 700.06 305.04 700.05 305.04 700.05 250.37 700.06 250.37 700.3 250.23 725.29 236.61 725.3 236.61 750.04 223.12"/>
320
+ <polygon class="cls-15" points="750.04 223.04 750.04 223.12 700.06 250.37 650.07 223.07 650.07 223.04 700.06 195.71 700.06 195.71 750.04 223.04"/>
321
+ <polygon class="cls-3" points="700.06 250.37 700.06 305.04 650.07 277.7 650.07 223.07 700.06 250.37"/>
322
+ </g>
323
+ <g id="basic_N1-2" data-name="basic_N1">
324
+ <polygon class="cls-13" points="750.04 168.6 750.04 223.19 725.3 236.72 725.29 236.72 703.68 248.54 700.06 250.52 700.05 250.52 700.05 195.85 700.06 195.85 700.3 195.71 725.29 182.09 725.3 182.09 750.04 168.6"/>
325
+ <polygon class="cls-15" points="750.04 168.52 750.04 168.6 700.06 195.85 650.08 168.55 650.08 168.52 700.06 141.19 700.06 141.19 750.04 168.52"/>
326
+ <polygon class="cls-3" points="700.06 195.85 700.06 250.51 650.08 223.18 650.08 168.55 700.06 195.85"/>
327
+ </g>
328
+ <g id="basic_N1-3" data-name="basic_N1">
329
+ <polygon class="cls-13" points="750.03 113.89 750.03 168.48 725.29 182.01 725.28 182.01 703.67 193.83 700.05 195.81 700.04 195.81 700.04 141.14 700.05 141.14 700.29 141 725.28 127.38 725.29 127.38 750.03 113.89"/>
330
+ <polygon class="cls-15" points="750.03 113.81 750.03 113.89 700.05 141.14 650.06 113.84 650.06 113.81 700.05 86.48 700.05 86.48 750.03 113.81"/>
331
+ <polygon class="cls-3" points="700.05 141.14 700.05 195.8 650.06 168.47 650.06 113.84 700.05 141.14"/>
332
+ </g>
333
+ <g id="basic_N1-4" data-name="basic_N1">
334
+ <polygon class="cls-13" points="750.02 59.73 750.02 114.32 725.28 127.85 725.27 127.85 703.66 139.67 700.04 141.65 700.03 141.65 700.03 86.98 700.04 86.98 700.28 86.84 725.27 73.22 725.28 73.22 750.02 59.73"/>
335
+ <polygon class="cls-15" points="750.02 59.66 750.02 59.73 700.04 86.99 650.05 59.68 650.05 59.65 700.04 32.33 700.04 32.32 750.02 59.66"/>
336
+ <polygon class="cls-3" points="700.04 86.99 700.04 141.65 650.05 114.32 650.05 59.68 700.04 86.99"/>
337
+ </g>
338
+ <g id="basic_N1-5" data-name="basic_N1">
339
+ <polygon class="cls-13" points="700.14 195.83 700.14 250.42 675.4 263.95 675.39 263.95 653.78 275.77 650.16 277.75 650.15 277.75 650.15 223.08 650.16 223.08 650.4 222.94 675.39 209.32 675.4 209.32 700.14 195.83"/>
340
+ <polygon class="cls-15" points="700.14 195.75 700.14 195.83 650.16 223.08 600.17 195.78 600.17 195.75 650.16 168.42 650.16 168.42 700.14 195.75"/>
341
+ <polygon class="cls-3" points="650.16 223.08 650.16 277.75 600.17 250.41 600.17 195.78 650.16 223.08"/>
342
+ </g>
343
+ <g id="basic_N1-6" data-name="basic_N1">
344
+ <polygon class="cls-13" points="650.3 168.68 650.3 223.27 625.56 236.8 625.55 236.8 603.94 248.62 600.32 250.6 600.31 250.6 600.31 195.93 600.32 195.93 600.56 195.79 625.55 182.17 625.56 182.17 650.3 168.68"/>
345
+ <polygon class="cls-15" points="650.3 168.61 650.3 168.69 600.32 195.94 550.33 168.63 550.33 168.61 600.32 141.28 600.32 141.28 650.3 168.61"/>
346
+ <polygon class="cls-3" points="600.32 195.94 600.32 250.6 550.33 223.27 550.33 168.63 600.32 195.94"/>
347
+ </g>
348
+ <g id="basic_N1-7" data-name="basic_N1">
349
+ <polygon class="cls-13" points="600.32 304.95 600.32 359.54 575.58 373.07 575.57 373.07 553.96 384.89 550.34 386.87 550.33 386.87 550.33 332.2 550.34 332.2 550.58 332.06 575.57 318.44 575.58 318.44 600.32 304.95"/>
350
+ <polygon class="cls-15" points="600.32 304.88 600.32 304.95 550.33 332.21 500.35 304.9 500.35 304.87 550.33 277.54 550.34 277.54 600.32 304.88"/>
351
+ <polygon class="cls-3" points="550.33 332.21 550.33 386.87 500.35 359.54 500.35 304.9 550.33 332.21"/>
352
+ </g>
353
+ <g id="basic_N1-8" data-name="basic_N1">
354
+ <polygon class="cls-13" points="600.32 250.29 600.32 304.88 575.58 318.41 575.57 318.41 553.96 330.23 550.34 332.21 550.33 332.21 550.33 277.54 550.34 277.54 550.58 277.4 575.57 263.78 575.58 263.78 600.32 250.29"/>
355
+ <polygon class="cls-15" points="600.32 250.21 600.32 250.29 550.33 277.54 500.35 250.24 500.35 250.21 550.33 222.88 550.34 222.88 600.32 250.21"/>
356
+ <polygon class="cls-3" points="550.33 277.54 550.33 332.2 500.35 304.87 500.35 250.24 550.33 277.54"/>
357
+ </g>
358
+ <g id="basic_N1-9" data-name="basic_N1">
359
+ <polygon class="cls-13" points="600.31 195.7 600.31 250.29 575.57 263.82 575.56 263.82 553.95 275.64 550.33 277.62 550.32 277.62 550.32 222.95 550.33 222.95 550.57 222.81 575.56 209.19 575.57 209.19 600.31 195.7"/>
360
+ <polygon class="cls-15" points="600.31 195.62 600.31 195.7 550.33 222.95 500.34 195.65 500.34 195.62 550.33 168.29 550.33 168.29 600.31 195.62"/>
361
+ <polygon class="cls-3" points="550.33 222.95 550.33 277.62 500.34 250.28 500.34 195.65 550.33 222.95"/>
362
+ </g>
363
+ <g id="basic_N1-10" data-name="basic_N1">
364
+ <polygon class="cls-13" points="600.31 141.03 600.31 195.62 575.57 209.15 575.56 209.15 553.95 220.97 550.33 222.95 550.32 222.95 550.32 168.28 550.33 168.28 550.57 168.14 575.56 154.52 575.57 154.52 600.31 141.03"/>
365
+ <polygon class="cls-15" points="600.31 140.96 600.31 141.03 550.33 168.29 500.34 140.98 500.34 140.96 550.33 113.63 550.33 113.63 600.31 140.96"/>
366
+ <polygon class="cls-3" points="550.33 168.29 550.33 222.95 500.34 195.62 500.34 140.98 550.33 168.29"/>
367
+ </g>
368
+ </g>
369
+ </svg>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: canns
3
- Version: 0.14.0
3
+ Version: 0.14.1
4
4
  Summary: A Python Library for Continuous Attractor Neural Networks
5
5
  Project-URL: Repository, https://github.com/routhleck/canns
6
6
  Author-email: Sichao He <sichaohe@outlook.com>
@@ -77,7 +77,7 @@ CANNs is a Python library built on top of brainpy with performance‑critical mo
77
77
  - **Task-first API** – `canns.task.tracking` and `canns.task.open_loop_navigation` generate smooth tracking inputs, population coding stimuli, or import experimental trajectories.
78
78
  - **Rich analysis suite** – `canns.analyzer` covers energy landscapes, tuning curves, spike embeddings, UMAP/TDA helpers, and theta-sweep animations.
79
79
  - **Unified training** – `canns.trainer.HebbianTrainer` implements generic Hebbian learning and prediction, layered on the abstract `Trainer` base.
80
- - **Pipeline workspace** – the ASA TUI (Attractor Structure Analyzer) provides an end-to-end analysis workflow (TDA → decode → CohoMap/CohoSpace/FR/FRM) for interactive runs.
80
+ - **Pipeline workspace** – the ASA GUI (Attractor Structure Analyzer) provides an end-to-end analysis workflow (TDA → decode → CohoMap/CohoSpace/FR/FRM) with interactive visualization, help tips, and bilingual UI.
81
81
  - **Extensible foundations** – base classes (`BasicModel`, `Task`, `Trainer`, `Pipeline`) keep custom components consistent with the built-in ecosystem.
82
82
 
83
83
  ## Visual Gallery
@@ -128,6 +128,9 @@ pip install canns
128
128
  pip install canns[cuda12]
129
129
  pip install canns[tpu]
130
130
 
131
+ # GUI (recommended for pipeline usage)
132
+ pip install canns[gui]
133
+
131
134
  ```
132
135
 
133
136
  ## Quick Start
@@ -156,20 +159,30 @@ def step(t, stimulus):
156
159
 
157
160
  us, inputs = bm.for_loop(
158
161
  step,
159
- (
160
- task.run_steps,
161
- task.data,
162
- )
162
+ task.run_steps,
163
+ task.data,
163
164
  )
164
165
  ```
165
166
 
166
- For the ASA pipeline, run the TUI via `python -m canns.pipeline.asa` (or the `canns-tui` entrypoint) and point it at your ASA `.npz` inputs.
167
+ For the ASA pipeline, the recommended entrypoint is the GUI:
168
+
169
+ ```bash
170
+ canns-gui
171
+ # or
172
+ python -m canns.pipeline.asa_gui
173
+ ```
174
+
175
+ > Note: ASA TUI (`python -m canns.pipeline.asa` / `canns-tui`) is a legacy interface kept for transition.
167
176
 
168
177
  ## Documentation & Notebooks
169
178
 
170
179
  - [Quick Start Guide](https://routhleck.com/canns/en/notebooks/01_quick_start.html) – condensed tour of the library layout.
171
180
  - [Design Philosophy](https://routhleck.com/canns/en/notebooks/00_design_philosophy.html) – detailed design rationale for each module.
172
181
  - Interactive launchers: [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/routhleck/canns/HEAD?filepath=docs%2Fen%2Fnotebooks) [![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/routhleck/canns/blob/master/docs/en/notebooks/)
182
+ - Tutorials (Chinese, online):
183
+ - [ASA GUI end-to-end](https://routhleck.com/canns/zh/3_full_detail_tutorials/04_pipeline/03_asa_gui.html)
184
+ - [ASA pipeline principles & parameters](https://routhleck.com/canns/zh/3_full_detail_tutorials/02_data_analysis/01_asa_pipeline.html)
185
+ - [Cell classification](https://routhleck.com/canns/zh/3_full_detail_tutorials/02_data_analysis/04_cell_classification.html)
173
186
 
174
187
  ## Development Workflow
175
188
 
@@ -81,10 +81,10 @@ canns/pipeline/asa/screens.py,sha256=DbqidxmoKe4KzSLuxuriVv1PIVFn5Z-PfScVfjrIiEA
81
81
  canns/pipeline/asa/state.py,sha256=XukidfcFIOmm9ttT226FOTYR5hv2VAY8_DZt7V1Ml2g,6955
82
82
  canns/pipeline/asa/styles.tcss,sha256=eaXI3rQeWdBYmWdLJMMiSO6acHtreLRVKKoIHb2-dBk,3349
83
83
  canns/pipeline/asa/widgets.py,sha256=3vPGGQWP9V5FwuwqykCVp7dzAHdpcFkDqib0DtIw-lQ,8087
84
- canns/pipeline/asa_gui/__init__.py,sha256=tkomNZgnipnsIf7BzP8rNZ4JLTVS-RZNPM7Et20Y4mI,1953
84
+ canns/pipeline/asa_gui/__init__.py,sha256=38gJUuQGfZ5gTJOJfYx8gJuy_bF69Qdpi1HNEYDKaH8,2250
85
85
  canns/pipeline/asa_gui/__main__.py,sha256=2UOQtIE5oXkcq9HcuY13M3Jk6-uaDu8A0VJfvr203ck,134
86
86
  canns/pipeline/asa_gui/app.py,sha256=Wd-tVGNPE1mQ0S9bET-cyjfj5UWsTIFFHOQRu0lngBs,833
87
- canns/pipeline/asa_gui/main_window.py,sha256=rZpqAXCY5KyrVQRmOzogX-8SaA-Xep7KyzJq34TIoA4,6927
87
+ canns/pipeline/asa_gui/main_window.py,sha256=kQp8DTmp7SuYVCglh5lVja7DyQ7hAOxPgCEUmjKHgbk,7019
88
88
  canns/pipeline/asa_gui/analysis_modes/__init__.py,sha256=m5tra-3lOcKi09HV3WxvTnDuF5lgV92C_fHH_4V87zw,990
89
89
  canns/pipeline/asa_gui/analysis_modes/base.py,sha256=-xuzrr5-XItZldl7DUYfeLLvvXi-i7wpzk1IkTaPAzQ,1220
90
90
  canns/pipeline/asa_gui/analysis_modes/batch_mode.py,sha256=sua3cD6G4vTGT7fUSrdvYNwldA3KZ1O4MCCsSOX4knc,531
@@ -108,9 +108,11 @@ canns/pipeline/asa_gui/models/__init__.py,sha256=Pr5wfeu_iA8bh2ob9tfWQcWmzWydYjM
108
108
  canns/pipeline/asa_gui/models/config.py,sha256=oDAeNlReKJEITc8B5AT9xxQl3Ug1yaGs6DrzSJcABXc,314
109
109
  canns/pipeline/asa_gui/models/job.py,sha256=_HdhJIzdH9OSKrRpcl3WCS4O04Bvur5uT9yb9oOWBuE,852
110
110
  canns/pipeline/asa_gui/models/presets.py,sha256=zEtR1_35ovSuGa3xMOvZoVDJJUK0rSi8OOlfkQWFvFE,519
111
- canns/pipeline/asa_gui/resources/__init__.py,sha256=t2gkV9PuOV_HVRqR7qzBOA4ADBlyTEnVHy-0jQlWJTA,432
111
+ canns/pipeline/asa_gui/resources/__init__.py,sha256=xaC4dS2THCTTKOF6MDHMOGGPni9Nnjmeqj7fCaoxzwI,575
112
112
  canns/pipeline/asa_gui/resources/dark.qss,sha256=s9Uhyod7aLwIC5QqYOVIKN7NofcXbV1ESZk-j98YMY4,2990
113
113
  canns/pipeline/asa_gui/resources/light.qss,sha256=B8rU85VrYMKf8QasvRiR-tCypov7pzIOFr7lcL81mcw,2883
114
+ canns/pipeline/asa_gui/resources/logo.ico,sha256=V54_QvIzs6TK1K28zX915taioAM1gPESAKRCRPAjR4U,125806
115
+ canns/pipeline/asa_gui/resources/logo.svg,sha256=UQqbGRtnROO2BdN3XMkovdBqWew69Z9Sr7SUof2_n3o,48323
114
116
  canns/pipeline/asa_gui/resources/styles.qss,sha256=MaWWGn3f9yvOYpgdgy8VyITWk5vGGPut2H_rnQM4-EU,2188
115
117
  canns/pipeline/asa_gui/utils/__init__.py,sha256=UDPlNIUi5Jl16YiQbmOWz7TTTjFFJn_nDwDuYleAlKM,35
116
118
  canns/pipeline/asa_gui/utils/formatters.py,sha256=w9MP0mGior_hxPqGhjNCXxwNbItgnaCDTdxJ1zUPGgk,347
@@ -156,8 +158,8 @@ canns/trainer/utils.py,sha256=ZdoLiRqFLfKXsWi0KX3wGUp0OqFikwiou8dPf3xvFhE,2847
156
158
  canns/typing/__init__.py,sha256=mXySdfmD8fA56WqZTb1Nj-ZovcejwLzNjuk6PRfTwmA,156
157
159
  canns/utils/__init__.py,sha256=OMyZ5jqZAIUS2Jr0qcnvvrx6YM-BZ1EJy5uZYeA3HC0,366
158
160
  canns/utils/benchmark.py,sha256=oJ7nvbvnQMh4_MZh7z160NPLp-197X0rEnmnLHYlev4,1361
159
- canns-0.14.0.dist-info/METADATA,sha256=ZU3RhccxC_TpCagJoT_ML-icvE2CcayxlrV-oMygYhE,9163
160
- canns-0.14.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
161
- canns-0.14.0.dist-info/entry_points.txt,sha256=57YF2HZp_BG3GeGB8L0m3wR1sSfNyMXF1q4CKEjce6U,164
162
- canns-0.14.0.dist-info/licenses/LICENSE,sha256=u6NJ1N-QSnf5yTwSk5UvFAdU2yKD0jxG0Xa91n1cPO4,11306
163
- canns-0.14.0.dist-info/RECORD,,
161
+ canns-0.14.1.dist-info/METADATA,sha256=CQzDKQODTTCPR2zdw9q6mEzfhGdvuA8xOhIg0maVhTc,9751
162
+ canns-0.14.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
163
+ canns-0.14.1.dist-info/entry_points.txt,sha256=57YF2HZp_BG3GeGB8L0m3wR1sSfNyMXF1q4CKEjce6U,164
164
+ canns-0.14.1.dist-info/licenses/LICENSE,sha256=u6NJ1N-QSnf5yTwSk5UvFAdU2yKD0jxG0Xa91n1cPO4,11306
165
+ canns-0.14.1.dist-info/RECORD,,
File without changes