accusleepy 0.7.3__py3-none-any.whl → 0.8.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.
- accusleepy/bouts.py +44 -36
- accusleepy/config.json +3 -1
- accusleepy/constants.py +5 -0
- accusleepy/fileio.py +43 -13
- accusleepy/gui/images/primary_window.png +0 -0
- accusleepy/gui/main.py +19 -9
- accusleepy/gui/manual_scoring.py +9 -6
- accusleepy/gui/primary_window.py +146 -14
- accusleepy/gui/primary_window.ui +298 -177
- accusleepy/gui/text/dev_guide.md +1 -1
- {accusleepy-0.7.3.dist-info → accusleepy-0.8.1.dist-info}/METADATA +5 -6
- {accusleepy-0.7.3.dist-info → accusleepy-0.8.1.dist-info}/RECORD +13 -13
- {accusleepy-0.7.3.dist-info → accusleepy-0.8.1.dist-info}/WHEEL +1 -1
accusleepy/bouts.py
CHANGED
|
@@ -11,7 +11,7 @@ class Bout:
|
|
|
11
11
|
|
|
12
12
|
length: int # length, in number of epochs
|
|
13
13
|
start_index: int # index where bout starts
|
|
14
|
-
end_index: int # index where bout ends
|
|
14
|
+
end_index: int # index where bout ends (non-inclusive)
|
|
15
15
|
surrounding_state: int # brain state on both sides of the bout
|
|
16
16
|
|
|
17
17
|
|
|
@@ -41,6 +41,44 @@ def find_last_adjacent_bout(sorted_bouts: list[Bout], bout_index: int) -> int:
|
|
|
41
41
|
return bout_index
|
|
42
42
|
|
|
43
43
|
|
|
44
|
+
def find_short_bouts(
|
|
45
|
+
labels: np.array, min_epochs: int, brain_states: set[int]
|
|
46
|
+
) -> list[Bout]:
|
|
47
|
+
"""Locate all brain state bouts below a minimum length
|
|
48
|
+
|
|
49
|
+
:param labels: brain state labels (digits in the 0-9 range)
|
|
50
|
+
:param min_epochs: minimum number of epochs in a bout
|
|
51
|
+
:param brain_states: set of brain states in the labels
|
|
52
|
+
:return: list of Bout objects
|
|
53
|
+
"""
|
|
54
|
+
# convert labels to a string for regex search
|
|
55
|
+
# There is probably a regex that can find all patterns like ab+a
|
|
56
|
+
# without consuming each "a" but I haven't found it :(
|
|
57
|
+
label_string = "".join(labels.astype(str))
|
|
58
|
+
bouts = list()
|
|
59
|
+
for state in brain_states:
|
|
60
|
+
for other_state in brain_states:
|
|
61
|
+
if state == other_state:
|
|
62
|
+
continue
|
|
63
|
+
# get start and end indices of each bout
|
|
64
|
+
expression = (
|
|
65
|
+
f"(?<={other_state}){state}{{1,{min_epochs - 1}}}(?={other_state})"
|
|
66
|
+
)
|
|
67
|
+
matches = re.finditer(expression, label_string)
|
|
68
|
+
spans = [match.span() for match in matches]
|
|
69
|
+
|
|
70
|
+
for span in spans:
|
|
71
|
+
bouts.append(
|
|
72
|
+
Bout(
|
|
73
|
+
length=span[1] - span[0],
|
|
74
|
+
start_index=span[0],
|
|
75
|
+
end_index=span[1],
|
|
76
|
+
surrounding_state=other_state,
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
return bouts
|
|
80
|
+
|
|
81
|
+
|
|
44
82
|
def enforce_min_bout_length(
|
|
45
83
|
labels: np.array, epoch_length: int | float, min_bout_length: int | float
|
|
46
84
|
) -> np.array:
|
|
@@ -61,11 +99,9 @@ def enforce_min_bout_length(
|
|
|
61
99
|
:param min_bout_length: minimum bout length, in seconds
|
|
62
100
|
:return: updated brain state labels
|
|
63
101
|
"""
|
|
64
|
-
# if recording is very short
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if epoch_length == min_bout_length:
|
|
102
|
+
# if the recording is very short or the minimum bout length
|
|
103
|
+
# is one epoch long, don't change anything
|
|
104
|
+
if labels.size < 3 or epoch_length == min_bout_length:
|
|
69
105
|
return labels
|
|
70
106
|
|
|
71
107
|
# get minimum number of epochs in a bout
|
|
@@ -73,36 +109,8 @@ def enforce_min_bout_length(
|
|
|
73
109
|
# get set of states in the labels
|
|
74
110
|
brain_states = set(labels.tolist())
|
|
75
111
|
|
|
76
|
-
while True:
|
|
77
|
-
|
|
78
|
-
# There is probably a regex that can find all patterns like ab+a
|
|
79
|
-
# without consuming each "a" but I haven't found it :(
|
|
80
|
-
label_string = "".join(labels.astype(str))
|
|
81
|
-
|
|
82
|
-
bouts = list()
|
|
83
|
-
|
|
84
|
-
for state in brain_states:
|
|
85
|
-
for other_state in brain_states:
|
|
86
|
-
if state == other_state:
|
|
87
|
-
continue
|
|
88
|
-
# get start and end indices of each bout
|
|
89
|
-
expression = (
|
|
90
|
-
f"(?<={other_state}){state}{{1,{min_epochs - 1}}}(?={other_state})"
|
|
91
|
-
)
|
|
92
|
-
matches = re.finditer(expression, label_string)
|
|
93
|
-
spans = [match.span() for match in matches]
|
|
94
|
-
|
|
95
|
-
# if some bouts were found
|
|
96
|
-
for span in spans:
|
|
97
|
-
bouts.append(
|
|
98
|
-
Bout(
|
|
99
|
-
length=span[1] - span[0],
|
|
100
|
-
start_index=span[0],
|
|
101
|
-
end_index=span[1],
|
|
102
|
-
surrounding_state=other_state,
|
|
103
|
-
)
|
|
104
|
-
)
|
|
105
|
-
|
|
112
|
+
while True:
|
|
113
|
+
bouts = find_short_bouts(labels, min_epochs, brain_states)
|
|
106
114
|
if len(bouts) == 0:
|
|
107
115
|
break
|
|
108
116
|
|
accusleepy/config.json
CHANGED
accusleepy/constants.py
CHANGED
|
@@ -67,6 +67,8 @@ DEFAULT_OVERWRITE_KEY = "default_overwrite_setting"
|
|
|
67
67
|
EMG_FILTER_KEY = "emg_filter"
|
|
68
68
|
# model training hyperparameters key
|
|
69
69
|
HYPERPARAMETERS_KEY = "hyperparameters"
|
|
70
|
+
EPOCHS_TO_SHOW_KEY = "epochs_to_show"
|
|
71
|
+
AUTOSCROLL_KEY = "autoscroll_state"
|
|
70
72
|
|
|
71
73
|
# default values
|
|
72
74
|
# default UI settings
|
|
@@ -82,3 +84,6 @@ DEFAULT_BATCH_SIZE = 64
|
|
|
82
84
|
DEFAULT_LEARNING_RATE = 1e-3
|
|
83
85
|
DEFAULT_MOMENTUM = 0.9
|
|
84
86
|
DEFAULT_TRAINING_EPOCHS = 6
|
|
87
|
+
# default manual scoring settings
|
|
88
|
+
DEFAULT_EPOCHS_TO_SHOW = 5
|
|
89
|
+
DEFAULT_AUTOSCROLL_STATE = False
|
accusleepy/fileio.py
CHANGED
|
@@ -29,6 +29,21 @@ class Hyperparameters:
|
|
|
29
29
|
training_epochs: int
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
@dataclass
|
|
33
|
+
class AccuSleePyConfig:
|
|
34
|
+
"""AccuSleePy configuration settings"""
|
|
35
|
+
|
|
36
|
+
brain_state_set: BrainStateSet
|
|
37
|
+
default_epoch_length: int | float
|
|
38
|
+
overwrite_setting: bool
|
|
39
|
+
save_confidence_setting: bool
|
|
40
|
+
min_bout_length: int | float
|
|
41
|
+
emg_filter: EMGFilter
|
|
42
|
+
hyperparameters: Hyperparameters
|
|
43
|
+
epochs_to_show: int
|
|
44
|
+
autoscroll_state: bool
|
|
45
|
+
|
|
46
|
+
|
|
32
47
|
@dataclass
|
|
33
48
|
class Recording:
|
|
34
49
|
"""Store information about a recording"""
|
|
@@ -111,33 +126,40 @@ def save_labels(
|
|
|
111
126
|
pd.DataFrame({c.BRAIN_STATE_COL: labels}).to_csv(filename, index=False)
|
|
112
127
|
|
|
113
128
|
|
|
114
|
-
def load_config() ->
|
|
115
|
-
BrainStateSet, int | float, bool, bool, int | float, EMGFilter, Hyperparameters
|
|
116
|
-
]:
|
|
129
|
+
def load_config() -> AccuSleePyConfig:
|
|
117
130
|
"""Load configuration file with brain state options
|
|
118
131
|
|
|
119
|
-
:return:
|
|
132
|
+
:return: AccuSleePyConfig containing the following:
|
|
133
|
+
set of brain state options,
|
|
120
134
|
default epoch length,
|
|
121
135
|
default overwrite setting,
|
|
122
136
|
default confidence score output setting,
|
|
123
137
|
default minimum bout length,
|
|
124
138
|
EMG filter parameters,
|
|
125
|
-
model training hyperparameters
|
|
139
|
+
model training hyperparameters,
|
|
140
|
+
default epochs to show for manual scoring,
|
|
141
|
+
default autoscroll state for manual scoring
|
|
126
142
|
"""
|
|
127
143
|
with open(
|
|
128
144
|
os.path.join(os.path.dirname(os.path.abspath(__file__)), c.CONFIG_FILE), "r"
|
|
129
145
|
) as f:
|
|
130
146
|
data = json.load(f)
|
|
131
147
|
|
|
132
|
-
return (
|
|
133
|
-
BrainStateSet(
|
|
148
|
+
return AccuSleePyConfig(
|
|
149
|
+
brain_state_set=BrainStateSet(
|
|
134
150
|
[BrainState(**b) for b in data[BRAIN_STATES_KEY]], c.UNDEFINED_LABEL
|
|
135
151
|
),
|
|
136
|
-
data[c.DEFAULT_EPOCH_LENGTH_KEY],
|
|
137
|
-
data.get(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
152
|
+
default_epoch_length=data[c.DEFAULT_EPOCH_LENGTH_KEY],
|
|
153
|
+
overwrite_setting=data.get(
|
|
154
|
+
c.DEFAULT_OVERWRITE_KEY, c.DEFAULT_OVERWRITE_SETTING
|
|
155
|
+
),
|
|
156
|
+
save_confidence_setting=data.get(
|
|
157
|
+
c.DEFAULT_CONFIDENCE_SETTING_KEY, c.DEFAULT_CONFIDENCE_SETTING
|
|
158
|
+
),
|
|
159
|
+
min_bout_length=data.get(
|
|
160
|
+
c.DEFAULT_MIN_BOUT_LENGTH_KEY, c.DEFAULT_MIN_BOUT_LENGTH
|
|
161
|
+
),
|
|
162
|
+
emg_filter=EMGFilter(
|
|
141
163
|
**data.get(
|
|
142
164
|
c.EMG_FILTER_KEY,
|
|
143
165
|
{
|
|
@@ -147,7 +169,7 @@ def load_config() -> tuple[
|
|
|
147
169
|
},
|
|
148
170
|
)
|
|
149
171
|
),
|
|
150
|
-
Hyperparameters(
|
|
172
|
+
hyperparameters=Hyperparameters(
|
|
151
173
|
**data.get(
|
|
152
174
|
c.HYPERPARAMETERS_KEY,
|
|
153
175
|
{
|
|
@@ -158,6 +180,8 @@ def load_config() -> tuple[
|
|
|
158
180
|
},
|
|
159
181
|
)
|
|
160
182
|
),
|
|
183
|
+
epochs_to_show=data.get(c.EPOCHS_TO_SHOW_KEY, c.DEFAULT_EPOCHS_TO_SHOW),
|
|
184
|
+
autoscroll_state=data.get(c.AUTOSCROLL_KEY, c.DEFAULT_AUTOSCROLL_STATE),
|
|
161
185
|
)
|
|
162
186
|
|
|
163
187
|
|
|
@@ -169,6 +193,8 @@ def save_config(
|
|
|
169
193
|
min_bout_length: int | float,
|
|
170
194
|
emg_filter: EMGFilter,
|
|
171
195
|
hyperparameters: Hyperparameters,
|
|
196
|
+
epochs_to_show: int,
|
|
197
|
+
autoscroll_state: bool,
|
|
172
198
|
) -> None:
|
|
173
199
|
"""Save configuration of brain state options to json file
|
|
174
200
|
|
|
@@ -181,6 +207,8 @@ def save_config(
|
|
|
181
207
|
:param overwrite_setting: default setting for overwriting
|
|
182
208
|
existing labels
|
|
183
209
|
:param hyperparameters: model training hyperparameters
|
|
210
|
+
:param epochs_to_show: default epochs to show for manual scoring,
|
|
211
|
+
:param autoscroll_state: default autoscroll state for manual scoring
|
|
184
212
|
"""
|
|
185
213
|
output_dict = brain_state_set.to_output_dict()
|
|
186
214
|
output_dict.update({c.DEFAULT_EPOCH_LENGTH_KEY: default_epoch_length})
|
|
@@ -189,6 +217,8 @@ def save_config(
|
|
|
189
217
|
output_dict.update({c.DEFAULT_MIN_BOUT_LENGTH_KEY: min_bout_length})
|
|
190
218
|
output_dict.update({c.EMG_FILTER_KEY: emg_filter.__dict__})
|
|
191
219
|
output_dict.update({c.HYPERPARAMETERS_KEY: hyperparameters.__dict__})
|
|
220
|
+
output_dict.update({c.EPOCHS_TO_SHOW_KEY: epochs_to_show})
|
|
221
|
+
output_dict.update({c.AUTOSCROLL_KEY: autoscroll_state})
|
|
192
222
|
with open(
|
|
193
223
|
os.path.join(os.path.dirname(os.path.abspath(__file__)), c.CONFIG_FILE), "w"
|
|
194
224
|
) as f:
|
|
Binary file
|
accusleepy/gui/main.py
CHANGED
|
@@ -81,6 +81,11 @@ from accusleepy.validation import (
|
|
|
81
81
|
|
|
82
82
|
# note: functions using torch or scipy are lazily imported
|
|
83
83
|
|
|
84
|
+
# on Windows, prevent dark mode from changing the visual style
|
|
85
|
+
if os.name == "nt":
|
|
86
|
+
sys.argv += ["-platform", "windows:darkmode=0"]
|
|
87
|
+
|
|
88
|
+
|
|
84
89
|
# relative path to user manual
|
|
85
90
|
MAIN_GUIDE_FILE = os.path.normpath(r"text/main_guide.md")
|
|
86
91
|
|
|
@@ -108,15 +113,16 @@ class AccuSleepWindow(QMainWindow):
|
|
|
108
113
|
self.setWindowTitle("AccuSleePy")
|
|
109
114
|
|
|
110
115
|
# fill in settings tab
|
|
111
|
-
(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
116
|
+
config = load_config()
|
|
117
|
+
self.brain_state_set = config.brain_state_set
|
|
118
|
+
self.epoch_length = config.default_epoch_length
|
|
119
|
+
self.only_overwrite_undefined = config.overwrite_setting
|
|
120
|
+
self.save_confidence_scores = config.save_confidence_setting
|
|
121
|
+
self.min_bout_length = config.min_bout_length
|
|
122
|
+
self.emg_filter = config.emg_filter
|
|
123
|
+
self.hyperparameters = config.hyperparameters
|
|
124
|
+
self.default_epochs_to_show = config.epochs_to_show
|
|
125
|
+
self.default_autoscroll_state = config.autoscroll_state
|
|
120
126
|
|
|
121
127
|
self.settings_widgets = None
|
|
122
128
|
self.initialize_settings_tab()
|
|
@@ -1238,6 +1244,8 @@ class AccuSleepWindow(QMainWindow):
|
|
|
1238
1244
|
self.ui.overwrite_default_checkbox.setChecked(self.only_overwrite_undefined)
|
|
1239
1245
|
self.ui.confidence_setting_checkbox.setChecked(self.save_confidence_scores)
|
|
1240
1246
|
self.ui.default_min_bout_length_spinbox.setValue(self.min_bout_length)
|
|
1247
|
+
self.ui.epochs_to_show_spinbox.setValue(self.default_epochs_to_show)
|
|
1248
|
+
self.ui.autoscroll_checkbox.setChecked(self.default_autoscroll_state)
|
|
1241
1249
|
# EMG filter
|
|
1242
1250
|
self.ui.emg_order_spinbox.setValue(self.emg_filter.order)
|
|
1243
1251
|
self.ui.bp_lower_spinbox.setValue(self.emg_filter.bp_lower)
|
|
@@ -1439,6 +1447,8 @@ class AccuSleepWindow(QMainWindow):
|
|
|
1439
1447
|
momentum=self.hyperparameters.momentum,
|
|
1440
1448
|
training_epochs=self.hyperparameters.training_epochs,
|
|
1441
1449
|
),
|
|
1450
|
+
epochs_to_show=self.ui.epochs_to_show_spinbox.value(),
|
|
1451
|
+
autoscroll_state=self.ui.autoscroll_checkbox.isChecked(),
|
|
1442
1452
|
)
|
|
1443
1453
|
self.ui.save_config_status.setText("configuration saved")
|
|
1444
1454
|
|
accusleepy/gui/manual_scoring.py
CHANGED
|
@@ -139,11 +139,10 @@ class ManualScoringWindow(QDialog):
|
|
|
139
139
|
self.ui.setupUi(self)
|
|
140
140
|
self.setWindowTitle("AccuSleePy manual scoring window")
|
|
141
141
|
|
|
142
|
-
|
|
143
|
-
self.brain_state_set
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
self.epochs_to_show = 5
|
|
142
|
+
config = load_config()
|
|
143
|
+
self.brain_state_set = config.brain_state_set
|
|
144
|
+
self.epochs_to_show = config.epochs_to_show
|
|
145
|
+
self.autoscroll_state = config.autoscroll_state
|
|
147
146
|
|
|
148
147
|
# find the set of y-axis locations of valid brain state labels
|
|
149
148
|
self.label_display_options = convert_labels(
|
|
@@ -216,7 +215,11 @@ class ManualScoringWindow(QDialog):
|
|
|
216
215
|
self.emg_signal_offset = 0
|
|
217
216
|
self.roi_brain_state = 0
|
|
218
217
|
self.label_roi_mode = False
|
|
219
|
-
|
|
218
|
+
|
|
219
|
+
# set autoscroll state and epochs to show, based on defaults
|
|
220
|
+
self.ui.autoscroll.setChecked(self.autoscroll_state)
|
|
221
|
+
self.ui.shownepochslabel.setText(str(self.epochs_to_show))
|
|
222
|
+
|
|
220
223
|
# keep track of save state to warn user when they quit
|
|
221
224
|
self.last_saved_labels = copy.deepcopy(self.labels)
|
|
222
225
|
|
accusleepy/gui/primary_window.py
CHANGED
|
@@ -2224,20 +2224,25 @@ class Ui_PrimaryWindow(object):
|
|
|
2224
2224
|
self.horizontalLayout_81.setSpacing(20)
|
|
2225
2225
|
self.horizontalLayout_81.setObjectName("horizontalLayout_81")
|
|
2226
2226
|
self.verticalLayout_6 = QVBoxLayout()
|
|
2227
|
-
self.verticalLayout_6.setSpacing(
|
|
2227
|
+
self.verticalLayout_6.setSpacing(20)
|
|
2228
2228
|
self.verticalLayout_6.setObjectName("verticalLayout_6")
|
|
2229
|
+
self.primary_defaults_groupbox = QGroupBox(self.ui_default_page)
|
|
2230
|
+
self.primary_defaults_groupbox.setObjectName("primary_defaults_groupbox")
|
|
2231
|
+
self.verticalLayout_4 = QVBoxLayout(self.primary_defaults_groupbox)
|
|
2232
|
+
self.verticalLayout_4.setSpacing(10)
|
|
2233
|
+
self.verticalLayout_4.setObjectName("verticalLayout_4")
|
|
2229
2234
|
self.default_epoch_layout = QHBoxLayout()
|
|
2230
2235
|
self.default_epoch_layout.setObjectName("default_epoch_layout")
|
|
2231
2236
|
self.horizontalLayout_60 = QHBoxLayout()
|
|
2232
2237
|
self.horizontalLayout_60.setObjectName("horizontalLayout_60")
|
|
2233
|
-
self.label_17 = QLabel(self.
|
|
2238
|
+
self.label_17 = QLabel(self.primary_defaults_groupbox)
|
|
2234
2239
|
self.label_17.setObjectName("label_17")
|
|
2235
2240
|
sizePolicy1.setHeightForWidth(self.label_17.sizePolicy().hasHeightForWidth())
|
|
2236
2241
|
self.label_17.setSizePolicy(sizePolicy1)
|
|
2237
2242
|
|
|
2238
2243
|
self.horizontalLayout_60.addWidget(self.label_17)
|
|
2239
2244
|
|
|
2240
|
-
self.default_epoch_input = QDoubleSpinBox(self.
|
|
2245
|
+
self.default_epoch_input = QDoubleSpinBox(self.primary_defaults_groupbox)
|
|
2241
2246
|
self.default_epoch_input.setObjectName("default_epoch_input")
|
|
2242
2247
|
sizePolicy1.setHeightForWidth(
|
|
2243
2248
|
self.default_epoch_input.sizePolicy().hasHeightForWidth()
|
|
@@ -2256,13 +2261,13 @@ class Ui_PrimaryWindow(object):
|
|
|
2256
2261
|
|
|
2257
2262
|
self.default_epoch_layout.addItem(self.horizontalSpacer_70)
|
|
2258
2263
|
|
|
2259
|
-
self.
|
|
2264
|
+
self.verticalLayout_4.addLayout(self.default_epoch_layout)
|
|
2260
2265
|
|
|
2261
2266
|
self.horizontalLayout_75 = QHBoxLayout()
|
|
2262
2267
|
self.horizontalLayout_75.setObjectName("horizontalLayout_75")
|
|
2263
2268
|
self.horizontalLayout_76 = QHBoxLayout()
|
|
2264
2269
|
self.horizontalLayout_76.setObjectName("horizontalLayout_76")
|
|
2265
|
-
self.overwrite_default_checkbox = QCheckBox(self.
|
|
2270
|
+
self.overwrite_default_checkbox = QCheckBox(self.primary_defaults_groupbox)
|
|
2266
2271
|
self.overwrite_default_checkbox.setObjectName("overwrite_default_checkbox")
|
|
2267
2272
|
|
|
2268
2273
|
self.horizontalLayout_76.addWidget(self.overwrite_default_checkbox)
|
|
@@ -2275,7 +2280,7 @@ class Ui_PrimaryWindow(object):
|
|
|
2275
2280
|
|
|
2276
2281
|
self.horizontalLayout_75.addItem(self.horizontalSpacer_88)
|
|
2277
2282
|
|
|
2278
|
-
self.
|
|
2283
|
+
self.verticalLayout_4.addLayout(self.horizontalLayout_75)
|
|
2279
2284
|
|
|
2280
2285
|
self.confidence_score_setting_layout = QHBoxLayout()
|
|
2281
2286
|
self.confidence_score_setting_layout.setObjectName(
|
|
@@ -2283,7 +2288,7 @@ class Ui_PrimaryWindow(object):
|
|
|
2283
2288
|
)
|
|
2284
2289
|
self.horizontalLayout_62 = QHBoxLayout()
|
|
2285
2290
|
self.horizontalLayout_62.setObjectName("horizontalLayout_62")
|
|
2286
|
-
self.confidence_setting_checkbox = QCheckBox(self.
|
|
2291
|
+
self.confidence_setting_checkbox = QCheckBox(self.primary_defaults_groupbox)
|
|
2287
2292
|
self.confidence_setting_checkbox.setObjectName("confidence_setting_checkbox")
|
|
2288
2293
|
sizePolicy1.setHeightForWidth(
|
|
2289
2294
|
self.confidence_setting_checkbox.sizePolicy().hasHeightForWidth()
|
|
@@ -2301,20 +2306,22 @@ class Ui_PrimaryWindow(object):
|
|
|
2301
2306
|
|
|
2302
2307
|
self.confidence_score_setting_layout.addItem(self.horizontalSpacer_72)
|
|
2303
2308
|
|
|
2304
|
-
self.
|
|
2309
|
+
self.verticalLayout_4.addLayout(self.confidence_score_setting_layout)
|
|
2305
2310
|
|
|
2306
2311
|
self.horizontalLayout_2 = QHBoxLayout()
|
|
2307
2312
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
|
2308
2313
|
self.horizontalLayout_18 = QHBoxLayout()
|
|
2309
2314
|
self.horizontalLayout_18.setObjectName("horizontalLayout_18")
|
|
2310
|
-
self.label_19 = QLabel(self.
|
|
2315
|
+
self.label_19 = QLabel(self.primary_defaults_groupbox)
|
|
2311
2316
|
self.label_19.setObjectName("label_19")
|
|
2312
2317
|
sizePolicy1.setHeightForWidth(self.label_19.sizePolicy().hasHeightForWidth())
|
|
2313
2318
|
self.label_19.setSizePolicy(sizePolicy1)
|
|
2314
2319
|
|
|
2315
2320
|
self.horizontalLayout_18.addWidget(self.label_19)
|
|
2316
2321
|
|
|
2317
|
-
self.default_min_bout_length_spinbox = QDoubleSpinBox(
|
|
2322
|
+
self.default_min_bout_length_spinbox = QDoubleSpinBox(
|
|
2323
|
+
self.primary_defaults_groupbox
|
|
2324
|
+
)
|
|
2318
2325
|
self.default_min_bout_length_spinbox.setObjectName(
|
|
2319
2326
|
"default_min_bout_length_spinbox"
|
|
2320
2327
|
)
|
|
@@ -2335,7 +2342,68 @@ class Ui_PrimaryWindow(object):
|
|
|
2335
2342
|
|
|
2336
2343
|
self.horizontalLayout_2.addItem(self.horizontalSpacer_90)
|
|
2337
2344
|
|
|
2338
|
-
self.
|
|
2345
|
+
self.verticalLayout_4.addLayout(self.horizontalLayout_2)
|
|
2346
|
+
|
|
2347
|
+
self.verticalLayout_6.addWidget(self.primary_defaults_groupbox)
|
|
2348
|
+
|
|
2349
|
+
self.manual_defaults_groupbox = QGroupBox(self.ui_default_page)
|
|
2350
|
+
self.manual_defaults_groupbox.setObjectName("manual_defaults_groupbox")
|
|
2351
|
+
self.verticalLayout_7 = QVBoxLayout(self.manual_defaults_groupbox)
|
|
2352
|
+
self.verticalLayout_7.setSpacing(10)
|
|
2353
|
+
self.verticalLayout_7.setObjectName("verticalLayout_7")
|
|
2354
|
+
self.epochs_to_show_layout = QHBoxLayout()
|
|
2355
|
+
self.epochs_to_show_layout.setObjectName("epochs_to_show_layout")
|
|
2356
|
+
self.horizontalLayout_78 = QHBoxLayout()
|
|
2357
|
+
self.horizontalLayout_78.setObjectName("horizontalLayout_78")
|
|
2358
|
+
self.label_20 = QLabel(self.manual_defaults_groupbox)
|
|
2359
|
+
self.label_20.setObjectName("label_20")
|
|
2360
|
+
sizePolicy1.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth())
|
|
2361
|
+
self.label_20.setSizePolicy(sizePolicy1)
|
|
2362
|
+
|
|
2363
|
+
self.horizontalLayout_78.addWidget(self.label_20)
|
|
2364
|
+
|
|
2365
|
+
self.epochs_to_show_spinbox = QSpinBox(self.manual_defaults_groupbox)
|
|
2366
|
+
self.epochs_to_show_spinbox.setObjectName("epochs_to_show_spinbox")
|
|
2367
|
+
self.epochs_to_show_spinbox.setMinimum(3)
|
|
2368
|
+
self.epochs_to_show_spinbox.setSingleStep(2)
|
|
2369
|
+
self.epochs_to_show_spinbox.setValue(5)
|
|
2370
|
+
|
|
2371
|
+
self.horizontalLayout_78.addWidget(self.epochs_to_show_spinbox)
|
|
2372
|
+
|
|
2373
|
+
self.epochs_to_show_layout.addLayout(self.horizontalLayout_78)
|
|
2374
|
+
|
|
2375
|
+
self.horizontalSpacer_92 = QSpacerItem(
|
|
2376
|
+
40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
|
|
2377
|
+
)
|
|
2378
|
+
|
|
2379
|
+
self.epochs_to_show_layout.addItem(self.horizontalSpacer_92)
|
|
2380
|
+
|
|
2381
|
+
self.verticalLayout_7.addLayout(self.epochs_to_show_layout)
|
|
2382
|
+
|
|
2383
|
+
self.autoscroll_layout = QHBoxLayout()
|
|
2384
|
+
self.autoscroll_layout.setObjectName("autoscroll_layout")
|
|
2385
|
+
self.horizontalLayout_77 = QHBoxLayout()
|
|
2386
|
+
self.horizontalLayout_77.setObjectName("horizontalLayout_77")
|
|
2387
|
+
self.autoscroll_checkbox = QCheckBox(self.manual_defaults_groupbox)
|
|
2388
|
+
self.autoscroll_checkbox.setObjectName("autoscroll_checkbox")
|
|
2389
|
+
sizePolicy1.setHeightForWidth(
|
|
2390
|
+
self.autoscroll_checkbox.sizePolicy().hasHeightForWidth()
|
|
2391
|
+
)
|
|
2392
|
+
self.autoscroll_checkbox.setSizePolicy(sizePolicy1)
|
|
2393
|
+
|
|
2394
|
+
self.horizontalLayout_77.addWidget(self.autoscroll_checkbox)
|
|
2395
|
+
|
|
2396
|
+
self.autoscroll_layout.addLayout(self.horizontalLayout_77)
|
|
2397
|
+
|
|
2398
|
+
self.horizontalSpacer_91 = QSpacerItem(
|
|
2399
|
+
10, 10, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum
|
|
2400
|
+
)
|
|
2401
|
+
|
|
2402
|
+
self.autoscroll_layout.addItem(self.horizontalSpacer_91)
|
|
2403
|
+
|
|
2404
|
+
self.verticalLayout_7.addLayout(self.autoscroll_layout)
|
|
2405
|
+
|
|
2406
|
+
self.verticalLayout_6.addWidget(self.manual_defaults_groupbox)
|
|
2339
2407
|
|
|
2340
2408
|
self.verticalSpacer_5 = QSpacerItem(
|
|
2341
2409
|
5, 5, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding
|
|
@@ -3098,32 +3166,96 @@ class Ui_PrimaryWindow(object):
|
|
|
3098
3166
|
None,
|
|
3099
3167
|
)
|
|
3100
3168
|
)
|
|
3169
|
+
self.primary_defaults_groupbox.setTitle(
|
|
3170
|
+
QCoreApplication.translate("PrimaryWindow", "Primary window settings", None)
|
|
3171
|
+
)
|
|
3101
3172
|
self.label_17.setText(
|
|
3102
3173
|
QCoreApplication.translate("PrimaryWindow", "Epoch length:", None)
|
|
3103
3174
|
)
|
|
3175
|
+
# if QT_CONFIG(tooltip)
|
|
3176
|
+
self.default_epoch_input.setToolTip(
|
|
3177
|
+
QCoreApplication.translate(
|
|
3178
|
+
"PrimaryWindow",
|
|
3179
|
+
"This sets the temporal resolution for sleep scoring",
|
|
3180
|
+
None,
|
|
3181
|
+
)
|
|
3182
|
+
)
|
|
3183
|
+
# endif // QT_CONFIG(tooltip)
|
|
3104
3184
|
self.default_epoch_input.setSuffix(
|
|
3105
3185
|
QCoreApplication.translate("PrimaryWindow", " sec", None)
|
|
3106
3186
|
)
|
|
3187
|
+
# if QT_CONFIG(tooltip)
|
|
3188
|
+
self.overwrite_default_checkbox.setToolTip(
|
|
3189
|
+
QCoreApplication.translate(
|
|
3190
|
+
"PrimaryWindow",
|
|
3191
|
+
"During automated scoring, only overwrite epochs with the undefined brain state",
|
|
3192
|
+
None,
|
|
3193
|
+
)
|
|
3194
|
+
)
|
|
3195
|
+
# endif // QT_CONFIG(tooltip)
|
|
3107
3196
|
self.overwrite_default_checkbox.setText(
|
|
3108
3197
|
QCoreApplication.translate(
|
|
3109
3198
|
"PrimaryWindow", "Only overwrite undefined epochs", None
|
|
3110
3199
|
)
|
|
3111
3200
|
)
|
|
3201
|
+
# if QT_CONFIG(tooltip)
|
|
3202
|
+
self.confidence_setting_checkbox.setToolTip(
|
|
3203
|
+
QCoreApplication.translate(
|
|
3204
|
+
"PrimaryWindow",
|
|
3205
|
+
"Save the model's confidence scores in label files",
|
|
3206
|
+
None,
|
|
3207
|
+
)
|
|
3208
|
+
)
|
|
3209
|
+
# endif // QT_CONFIG(tooltip)
|
|
3112
3210
|
self.confidence_setting_checkbox.setText(
|
|
3113
3211
|
QCoreApplication.translate("PrimaryWindow", "Save confidence scores", None)
|
|
3114
3212
|
)
|
|
3115
3213
|
self.label_19.setText(
|
|
3116
3214
|
QCoreApplication.translate("PrimaryWindow", "Minimum bout length:", None)
|
|
3117
3215
|
)
|
|
3216
|
+
# if QT_CONFIG(tooltip)
|
|
3217
|
+
self.default_min_bout_length_spinbox.setToolTip(
|
|
3218
|
+
QCoreApplication.translate(
|
|
3219
|
+
"PrimaryWindow",
|
|
3220
|
+
"Minimum allowed duration for a bout of any brain state",
|
|
3221
|
+
None,
|
|
3222
|
+
)
|
|
3223
|
+
)
|
|
3224
|
+
# endif // QT_CONFIG(tooltip)
|
|
3118
3225
|
self.default_min_bout_length_spinbox.setSuffix(
|
|
3119
3226
|
QCoreApplication.translate("PrimaryWindow", " sec", None)
|
|
3120
3227
|
)
|
|
3228
|
+
self.manual_defaults_groupbox.setTitle(
|
|
3229
|
+
QCoreApplication.translate(
|
|
3230
|
+
"PrimaryWindow", "Manual scoring window settings", None
|
|
3231
|
+
)
|
|
3232
|
+
)
|
|
3233
|
+
self.label_20.setText(
|
|
3234
|
+
QCoreApplication.translate("PrimaryWindow", "Epochs to show", None)
|
|
3235
|
+
)
|
|
3236
|
+
# if QT_CONFIG(tooltip)
|
|
3237
|
+
self.epochs_to_show_spinbox.setToolTip(
|
|
3238
|
+
QCoreApplication.translate(
|
|
3239
|
+
"PrimaryWindow", "Number of epochs to display in the lower plots", None
|
|
3240
|
+
)
|
|
3241
|
+
)
|
|
3242
|
+
# endif // QT_CONFIG(tooltip)
|
|
3243
|
+
# if QT_CONFIG(tooltip)
|
|
3244
|
+
self.autoscroll_checkbox.setToolTip(
|
|
3245
|
+
QCoreApplication.translate(
|
|
3246
|
+
"PrimaryWindow",
|
|
3247
|
+
"After scoring each epoch, automatically advance to the next one",
|
|
3248
|
+
None,
|
|
3249
|
+
)
|
|
3250
|
+
)
|
|
3251
|
+
# endif // QT_CONFIG(tooltip)
|
|
3252
|
+
self.autoscroll_checkbox.setText(
|
|
3253
|
+
QCoreApplication.translate("PrimaryWindow", "Auto scroll", None)
|
|
3254
|
+
)
|
|
3121
3255
|
self.ui_default_description_label.setText(
|
|
3122
3256
|
QCoreApplication.translate(
|
|
3123
3257
|
"PrimaryWindow",
|
|
3124
|
-
"These are the default values/settings that are shown in the primary
|
|
3125
|
-
"\n"
|
|
3126
|
-
'Changes here will not affect the **current** state of the controls in the "Sleep scoring" tab.',
|
|
3258
|
+
"<html><head/><body><p>These are the default values/settings that are shown in the primary window and manual scoring window when they start up.</p><p>Changes here will not affect the **current** state of the controls in the "Sleep scoring" tab.</p></body></html>",
|
|
3127
3259
|
None,
|
|
3128
3260
|
)
|
|
3129
3261
|
)
|
accusleepy/gui/primary_window.ui
CHANGED
|
@@ -3787,184 +3787,307 @@ Each brain state has several attributes:
|
|
|
3787
3787
|
<item>
|
|
3788
3788
|
<layout class="QVBoxLayout" name="verticalLayout_6">
|
|
3789
3789
|
<property name="spacing">
|
|
3790
|
-
<number>
|
|
3790
|
+
<number>20</number>
|
|
3791
3791
|
</property>
|
|
3792
3792
|
<item>
|
|
3793
|
-
<
|
|
3794
|
-
<
|
|
3795
|
-
<
|
|
3796
|
-
|
|
3797
|
-
|
|
3798
|
-
|
|
3799
|
-
|
|
3800
|
-
|
|
3801
|
-
|
|
3802
|
-
|
|
3803
|
-
|
|
3804
|
-
<
|
|
3805
|
-
<
|
|
3806
|
-
|
|
3807
|
-
|
|
3808
|
-
|
|
3809
|
-
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
|
|
3814
|
-
|
|
3815
|
-
|
|
3816
|
-
|
|
3817
|
-
|
|
3818
|
-
<
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3849
|
-
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
</
|
|
3857
|
-
</
|
|
3858
|
-
</
|
|
3859
|
-
</
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3865
|
-
|
|
3866
|
-
|
|
3867
|
-
|
|
3868
|
-
|
|
3869
|
-
|
|
3870
|
-
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
</
|
|
3887
|
-
</
|
|
3888
|
-
|
|
3889
|
-
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
|
|
3910
|
-
|
|
3911
|
-
|
|
3912
|
-
|
|
3913
|
-
|
|
3914
|
-
|
|
3793
|
+
<widget class="QGroupBox" name="primary_defaults_groupbox">
|
|
3794
|
+
<property name="title">
|
|
3795
|
+
<string>Primary window settings</string>
|
|
3796
|
+
</property>
|
|
3797
|
+
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
3798
|
+
<property name="spacing">
|
|
3799
|
+
<number>10</number>
|
|
3800
|
+
</property>
|
|
3801
|
+
<item>
|
|
3802
|
+
<layout class="QHBoxLayout" name="default_epoch_layout">
|
|
3803
|
+
<item>
|
|
3804
|
+
<layout class="QHBoxLayout" name="horizontalLayout_60">
|
|
3805
|
+
<item>
|
|
3806
|
+
<widget class="QLabel" name="label_17">
|
|
3807
|
+
<property name="sizePolicy">
|
|
3808
|
+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
3809
|
+
<horstretch>0</horstretch>
|
|
3810
|
+
<verstretch>0</verstretch>
|
|
3811
|
+
</sizepolicy>
|
|
3812
|
+
</property>
|
|
3813
|
+
<property name="text">
|
|
3814
|
+
<string>Epoch length:</string>
|
|
3815
|
+
</property>
|
|
3816
|
+
</widget>
|
|
3817
|
+
</item>
|
|
3818
|
+
<item>
|
|
3819
|
+
<widget class="QDoubleSpinBox" name="default_epoch_input">
|
|
3820
|
+
<property name="sizePolicy">
|
|
3821
|
+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
3822
|
+
<horstretch>0</horstretch>
|
|
3823
|
+
<verstretch>0</verstretch>
|
|
3824
|
+
</sizepolicy>
|
|
3825
|
+
</property>
|
|
3826
|
+
<property name="toolTip">
|
|
3827
|
+
<string>This sets the temporal resolution for sleep scoring</string>
|
|
3828
|
+
</property>
|
|
3829
|
+
<property name="suffix">
|
|
3830
|
+
<string> sec</string>
|
|
3831
|
+
</property>
|
|
3832
|
+
<property name="maximum">
|
|
3833
|
+
<double>100000.000000000000000</double>
|
|
3834
|
+
</property>
|
|
3835
|
+
<property name="singleStep">
|
|
3836
|
+
<double>0.500000000000000</double>
|
|
3837
|
+
</property>
|
|
3838
|
+
</widget>
|
|
3839
|
+
</item>
|
|
3840
|
+
</layout>
|
|
3841
|
+
</item>
|
|
3842
|
+
<item>
|
|
3843
|
+
<spacer name="horizontalSpacer_70">
|
|
3844
|
+
<property name="orientation">
|
|
3845
|
+
<enum>Qt::Orientation::Horizontal</enum>
|
|
3846
|
+
</property>
|
|
3847
|
+
<property name="sizeType">
|
|
3848
|
+
<enum>QSizePolicy::Policy::Expanding</enum>
|
|
3849
|
+
</property>
|
|
3850
|
+
<property name="sizeHint" stdset="0">
|
|
3851
|
+
<size>
|
|
3852
|
+
<width>10</width>
|
|
3853
|
+
<height>10</height>
|
|
3854
|
+
</size>
|
|
3855
|
+
</property>
|
|
3856
|
+
</spacer>
|
|
3857
|
+
</item>
|
|
3858
|
+
</layout>
|
|
3859
|
+
</item>
|
|
3860
|
+
<item>
|
|
3861
|
+
<layout class="QHBoxLayout" name="horizontalLayout_75">
|
|
3862
|
+
<item>
|
|
3863
|
+
<layout class="QHBoxLayout" name="horizontalLayout_76">
|
|
3864
|
+
<item>
|
|
3865
|
+
<widget class="QCheckBox" name="overwrite_default_checkbox">
|
|
3866
|
+
<property name="toolTip">
|
|
3867
|
+
<string>During automated scoring, only overwrite epochs with the undefined brain state</string>
|
|
3868
|
+
</property>
|
|
3869
|
+
<property name="text">
|
|
3870
|
+
<string>Only overwrite undefined epochs</string>
|
|
3871
|
+
</property>
|
|
3872
|
+
</widget>
|
|
3873
|
+
</item>
|
|
3874
|
+
</layout>
|
|
3875
|
+
</item>
|
|
3876
|
+
<item>
|
|
3877
|
+
<spacer name="horizontalSpacer_88">
|
|
3878
|
+
<property name="orientation">
|
|
3879
|
+
<enum>Qt::Orientation::Horizontal</enum>
|
|
3880
|
+
</property>
|
|
3881
|
+
<property name="sizeHint" stdset="0">
|
|
3882
|
+
<size>
|
|
3883
|
+
<width>40</width>
|
|
3884
|
+
<height>20</height>
|
|
3885
|
+
</size>
|
|
3886
|
+
</property>
|
|
3887
|
+
</spacer>
|
|
3888
|
+
</item>
|
|
3889
|
+
</layout>
|
|
3890
|
+
</item>
|
|
3891
|
+
<item>
|
|
3892
|
+
<layout class="QHBoxLayout" name="confidence_score_setting_layout">
|
|
3893
|
+
<item>
|
|
3894
|
+
<layout class="QHBoxLayout" name="horizontalLayout_62">
|
|
3895
|
+
<item>
|
|
3896
|
+
<widget class="QCheckBox" name="confidence_setting_checkbox">
|
|
3897
|
+
<property name="sizePolicy">
|
|
3898
|
+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
3899
|
+
<horstretch>0</horstretch>
|
|
3900
|
+
<verstretch>0</verstretch>
|
|
3901
|
+
</sizepolicy>
|
|
3902
|
+
</property>
|
|
3903
|
+
<property name="toolTip">
|
|
3904
|
+
<string>Save the model's confidence scores in label files</string>
|
|
3905
|
+
</property>
|
|
3906
|
+
<property name="text">
|
|
3907
|
+
<string>Save confidence scores</string>
|
|
3908
|
+
</property>
|
|
3909
|
+
<property name="checked">
|
|
3910
|
+
<bool>true</bool>
|
|
3911
|
+
</property>
|
|
3912
|
+
</widget>
|
|
3913
|
+
</item>
|
|
3914
|
+
</layout>
|
|
3915
|
+
</item>
|
|
3916
|
+
<item>
|
|
3917
|
+
<spacer name="horizontalSpacer_72">
|
|
3918
|
+
<property name="orientation">
|
|
3919
|
+
<enum>Qt::Orientation::Horizontal</enum>
|
|
3920
|
+
</property>
|
|
3921
|
+
<property name="sizeType">
|
|
3922
|
+
<enum>QSizePolicy::Policy::Expanding</enum>
|
|
3923
|
+
</property>
|
|
3924
|
+
<property name="sizeHint" stdset="0">
|
|
3925
|
+
<size>
|
|
3926
|
+
<width>10</width>
|
|
3927
|
+
<height>10</height>
|
|
3928
|
+
</size>
|
|
3929
|
+
</property>
|
|
3930
|
+
</spacer>
|
|
3931
|
+
</item>
|
|
3932
|
+
</layout>
|
|
3933
|
+
</item>
|
|
3934
|
+
<item>
|
|
3935
|
+
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
3936
|
+
<item>
|
|
3937
|
+
<layout class="QHBoxLayout" name="horizontalLayout_18">
|
|
3938
|
+
<item>
|
|
3939
|
+
<widget class="QLabel" name="label_19">
|
|
3940
|
+
<property name="sizePolicy">
|
|
3941
|
+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
3942
|
+
<horstretch>0</horstretch>
|
|
3943
|
+
<verstretch>0</verstretch>
|
|
3944
|
+
</sizepolicy>
|
|
3945
|
+
</property>
|
|
3946
|
+
<property name="text">
|
|
3947
|
+
<string>Minimum bout length:</string>
|
|
3948
|
+
</property>
|
|
3949
|
+
</widget>
|
|
3950
|
+
</item>
|
|
3951
|
+
<item>
|
|
3952
|
+
<widget class="QDoubleSpinBox" name="default_min_bout_length_spinbox">
|
|
3953
|
+
<property name="sizePolicy">
|
|
3954
|
+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
3955
|
+
<horstretch>0</horstretch>
|
|
3956
|
+
<verstretch>0</verstretch>
|
|
3957
|
+
</sizepolicy>
|
|
3958
|
+
</property>
|
|
3959
|
+
<property name="toolTip">
|
|
3960
|
+
<string>Minimum allowed duration for a bout of any brain state</string>
|
|
3961
|
+
</property>
|
|
3962
|
+
<property name="suffix">
|
|
3963
|
+
<string> sec</string>
|
|
3964
|
+
</property>
|
|
3965
|
+
<property name="maximum">
|
|
3966
|
+
<double>1000.000000000000000</double>
|
|
3967
|
+
</property>
|
|
3968
|
+
<property name="value">
|
|
3969
|
+
<double>5.000000000000000</double>
|
|
3970
|
+
</property>
|
|
3971
|
+
</widget>
|
|
3972
|
+
</item>
|
|
3973
|
+
</layout>
|
|
3974
|
+
</item>
|
|
3975
|
+
<item>
|
|
3976
|
+
<spacer name="horizontalSpacer_90">
|
|
3977
|
+
<property name="orientation">
|
|
3978
|
+
<enum>Qt::Orientation::Horizontal</enum>
|
|
3979
|
+
</property>
|
|
3980
|
+
<property name="sizeHint" stdset="0">
|
|
3981
|
+
<size>
|
|
3982
|
+
<width>5</width>
|
|
3983
|
+
<height>5</height>
|
|
3984
|
+
</size>
|
|
3985
|
+
</property>
|
|
3986
|
+
</spacer>
|
|
3987
|
+
</item>
|
|
3988
|
+
</layout>
|
|
3989
|
+
</item>
|
|
3990
|
+
</layout>
|
|
3991
|
+
</widget>
|
|
3915
3992
|
</item>
|
|
3916
3993
|
<item>
|
|
3917
|
-
<
|
|
3918
|
-
<
|
|
3919
|
-
<
|
|
3920
|
-
|
|
3921
|
-
|
|
3922
|
-
|
|
3923
|
-
|
|
3924
|
-
|
|
3925
|
-
|
|
3926
|
-
|
|
3927
|
-
|
|
3928
|
-
<
|
|
3929
|
-
<
|
|
3930
|
-
|
|
3931
|
-
|
|
3932
|
-
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
3936
|
-
|
|
3937
|
-
|
|
3938
|
-
|
|
3939
|
-
|
|
3940
|
-
|
|
3941
|
-
|
|
3942
|
-
<
|
|
3943
|
-
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3949
|
-
|
|
3950
|
-
|
|
3951
|
-
|
|
3952
|
-
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
<
|
|
3961
|
-
<
|
|
3962
|
-
|
|
3963
|
-
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3994
|
+
<widget class="QGroupBox" name="manual_defaults_groupbox">
|
|
3995
|
+
<property name="title">
|
|
3996
|
+
<string>Manual scoring window settings</string>
|
|
3997
|
+
</property>
|
|
3998
|
+
<layout class="QVBoxLayout" name="verticalLayout_7">
|
|
3999
|
+
<property name="spacing">
|
|
4000
|
+
<number>10</number>
|
|
4001
|
+
</property>
|
|
4002
|
+
<item>
|
|
4003
|
+
<layout class="QHBoxLayout" name="epochs_to_show_layout">
|
|
4004
|
+
<item>
|
|
4005
|
+
<layout class="QHBoxLayout" name="horizontalLayout_78">
|
|
4006
|
+
<item>
|
|
4007
|
+
<widget class="QLabel" name="label_20">
|
|
4008
|
+
<property name="sizePolicy">
|
|
4009
|
+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
4010
|
+
<horstretch>0</horstretch>
|
|
4011
|
+
<verstretch>0</verstretch>
|
|
4012
|
+
</sizepolicy>
|
|
4013
|
+
</property>
|
|
4014
|
+
<property name="text">
|
|
4015
|
+
<string>Epochs to show</string>
|
|
4016
|
+
</property>
|
|
4017
|
+
</widget>
|
|
4018
|
+
</item>
|
|
4019
|
+
<item>
|
|
4020
|
+
<widget class="QSpinBox" name="epochs_to_show_spinbox">
|
|
4021
|
+
<property name="toolTip">
|
|
4022
|
+
<string>Number of epochs to display in the lower plots</string>
|
|
4023
|
+
</property>
|
|
4024
|
+
<property name="minimum">
|
|
4025
|
+
<number>3</number>
|
|
4026
|
+
</property>
|
|
4027
|
+
<property name="singleStep">
|
|
4028
|
+
<number>2</number>
|
|
4029
|
+
</property>
|
|
4030
|
+
<property name="value">
|
|
4031
|
+
<number>5</number>
|
|
4032
|
+
</property>
|
|
4033
|
+
</widget>
|
|
4034
|
+
</item>
|
|
4035
|
+
</layout>
|
|
4036
|
+
</item>
|
|
4037
|
+
<item>
|
|
4038
|
+
<spacer name="horizontalSpacer_92">
|
|
4039
|
+
<property name="orientation">
|
|
4040
|
+
<enum>Qt::Orientation::Horizontal</enum>
|
|
4041
|
+
</property>
|
|
4042
|
+
<property name="sizeHint" stdset="0">
|
|
4043
|
+
<size>
|
|
4044
|
+
<width>40</width>
|
|
4045
|
+
<height>20</height>
|
|
4046
|
+
</size>
|
|
4047
|
+
</property>
|
|
4048
|
+
</spacer>
|
|
4049
|
+
</item>
|
|
4050
|
+
</layout>
|
|
4051
|
+
</item>
|
|
4052
|
+
<item>
|
|
4053
|
+
<layout class="QHBoxLayout" name="autoscroll_layout">
|
|
4054
|
+
<item>
|
|
4055
|
+
<layout class="QHBoxLayout" name="horizontalLayout_77">
|
|
4056
|
+
<item>
|
|
4057
|
+
<widget class="QCheckBox" name="autoscroll_checkbox">
|
|
4058
|
+
<property name="sizePolicy">
|
|
4059
|
+
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
|
4060
|
+
<horstretch>0</horstretch>
|
|
4061
|
+
<verstretch>0</verstretch>
|
|
4062
|
+
</sizepolicy>
|
|
4063
|
+
</property>
|
|
4064
|
+
<property name="toolTip">
|
|
4065
|
+
<string>After scoring each epoch, automatically advance to the next one</string>
|
|
4066
|
+
</property>
|
|
4067
|
+
<property name="text">
|
|
4068
|
+
<string>Auto scroll</string>
|
|
4069
|
+
</property>
|
|
4070
|
+
</widget>
|
|
4071
|
+
</item>
|
|
4072
|
+
</layout>
|
|
4073
|
+
</item>
|
|
4074
|
+
<item>
|
|
4075
|
+
<spacer name="horizontalSpacer_91">
|
|
4076
|
+
<property name="orientation">
|
|
4077
|
+
<enum>Qt::Orientation::Horizontal</enum>
|
|
4078
|
+
</property>
|
|
4079
|
+
<property name="sizeHint" stdset="0">
|
|
4080
|
+
<size>
|
|
4081
|
+
<width>10</width>
|
|
4082
|
+
<height>10</height>
|
|
4083
|
+
</size>
|
|
4084
|
+
</property>
|
|
4085
|
+
</spacer>
|
|
4086
|
+
</item>
|
|
4087
|
+
</layout>
|
|
4088
|
+
</item>
|
|
4089
|
+
</layout>
|
|
4090
|
+
</widget>
|
|
3968
4091
|
</item>
|
|
3969
4092
|
<item>
|
|
3970
4093
|
<spacer name="verticalSpacer_5">
|
|
@@ -3989,9 +4112,7 @@ Each brain state has several attributes:
|
|
|
3989
4112
|
<string notr="true">background-color: white;</string>
|
|
3990
4113
|
</property>
|
|
3991
4114
|
<property name="text">
|
|
3992
|
-
<string
|
|
3993
|
-
|
|
3994
|
-
Changes here will not affect the **current** state of the controls in the "Sleep scoring" tab.</string>
|
|
4115
|
+
<string><html><head/><body><p>These are the default values/settings that are shown in the primary window and manual scoring window when they start up.</p><p>Changes here will not affect the **current** state of the controls in the &quot;Sleep scoring&quot; tab.</p></body></html></string>
|
|
3995
4116
|
</property>
|
|
3996
4117
|
<property name="textFormat">
|
|
3997
4118
|
<enum>Qt::TextFormat::MarkdownText</enum>
|
accusleepy/gui/text/dev_guide.md
CHANGED
|
@@ -40,7 +40,7 @@ your changes, you need to update the python representation of the UI.
|
|
|
40
40
|
```
|
|
41
41
|
If the file already contains the line `import resources_rc`,
|
|
42
42
|
replace it with the one above.
|
|
43
|
-
If you updated `
|
|
43
|
+
If you updated `viewer_window.py`, you also need to add:
|
|
44
44
|
```
|
|
45
45
|
from accusleepy.gui.mplwidget import MplWidget
|
|
46
46
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: accusleepy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.1
|
|
4
4
|
Summary: Python implementation of AccuSleep
|
|
5
5
|
License: GPL-3.0-only
|
|
6
6
|
Author: Zeke Barger
|
|
@@ -80,16 +80,15 @@ please consult the [developer guide](accusleepy/gui/text/dev_guide.md).
|
|
|
80
80
|
|
|
81
81
|
## Changelog
|
|
82
82
|
|
|
83
|
+
- 0.8.1: Increased test coverage
|
|
84
|
+
- 0.8.0: More configurable settings, visual improvements
|
|
83
85
|
- 0.7.1-0.7.3: Bugfixes, code cleanup
|
|
84
86
|
- 0.7.0: More settings can be configured in the UI
|
|
85
87
|
- 0.6.0: Confidence scores can now be displayed and saved. Retraining your models is recommended
|
|
86
88
|
since the new calibration feature will make the confidence scores more accurate.
|
|
87
89
|
- 0.5.0: Performance improvements
|
|
88
90
|
- 0.4.5: Added support for python 3.13, **removed support for python 3.10.**
|
|
89
|
-
- 0.4.4:
|
|
90
|
-
- 0.4.3: Improved unit tests and user manuals
|
|
91
|
-
- 0.4.0: Improved visuals and user manuals
|
|
92
|
-
- 0.1.0-0.3.1: Early development versions
|
|
91
|
+
- 0.1.0-0.4.4: Early development versions
|
|
93
92
|
|
|
94
93
|
## Screenshots
|
|
95
94
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
accusleepy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
accusleepy/__main__.py,sha256=dKzl2N2Hg9lD264CWYNxThRyDKzWwyMwHRXmJxOmMis,104
|
|
3
|
-
accusleepy/bouts.py,sha256=
|
|
3
|
+
accusleepy/bouts.py,sha256=biJEzCjMQR-RTlQcfeomkp6NxcA5FXkhE8Kp2XyL4P4,6039
|
|
4
4
|
accusleepy/brain_state_set.py,sha256=fRkrArHLIbEKimub804yt_mUXoyfsjJEfiJnTjeCMkY,3233
|
|
5
5
|
accusleepy/classification.py,sha256=mF35xMrD9QXGldSnl3vkdHbm7CAptPUNjHxUA_agOTA,9778
|
|
6
|
-
accusleepy/config.json,sha256=
|
|
7
|
-
accusleepy/constants.py,sha256=
|
|
8
|
-
accusleepy/fileio.py,sha256
|
|
6
|
+
accusleepy/config.json,sha256=VmUFsiGD1ymEyjdzqeM5nTp8jWvDI-DIxLy1_92nueo,875
|
|
7
|
+
accusleepy/constants.py,sha256=62mmsr1NKzF-psS-9esuAE65kAcPL6o8v9UXQEvb5yc,2983
|
|
8
|
+
accusleepy/fileio.py,sha256=-aEgp2oonjQKRizVI1uI5CGknnBOxE6HG0DzxDYbSkM,8512
|
|
9
9
|
accusleepy/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
accusleepy/gui/icons/brightness_down.png,sha256=PLT1fb83RHIhSRuU7MMMx0G7oJAY7o9wUcnqM8veZfM,12432
|
|
11
11
|
accusleepy/gui/icons/brightness_up.png,sha256=64GnUqgPvN5xZ6Um3wOzwqvUmdAWYZT6eFmWpBsHyks,12989
|
|
@@ -18,17 +18,17 @@ accusleepy/gui/icons/save.png,sha256=J3EA8iU1BqLYRSsrq_OdoZlqrv2yfL7oV54DklTy_DI
|
|
|
18
18
|
accusleepy/gui/icons/up_arrow.png,sha256=V9yF9t1WgjPaUu-mF1YGe_DfaRHg2dUpR_sUVVcvVvY,3329
|
|
19
19
|
accusleepy/gui/icons/zoom_in.png,sha256=MFWnKZp7Rvh4bLPq4Cqo4sB_jQYedUUtT8-ZO8tNYyc,13589
|
|
20
20
|
accusleepy/gui/icons/zoom_out.png,sha256=IB8Jecb3i0U4qjWRR46ridjLpvLCSe7PozBaLqQqYSw,13055
|
|
21
|
-
accusleepy/gui/images/primary_window.png,sha256=
|
|
21
|
+
accusleepy/gui/images/primary_window.png,sha256=yRGUdIcByF8DtPtDWqjmnQ8J3IHKtmijBsT7N9e1Ij0,595764
|
|
22
22
|
accusleepy/gui/images/viewer_window.png,sha256=b_B7m9WSLMAOzNjctq76SyekO1WfC6qYZVNnYfhjPe8,977197
|
|
23
23
|
accusleepy/gui/images/viewer_window_annotated.png,sha256=uMNUmsZIdzDlQpyoiS3lJGoWlg_T325Oj5hDZhM3Y14,146817
|
|
24
|
-
accusleepy/gui/main.py,sha256=
|
|
25
|
-
accusleepy/gui/manual_scoring.py,sha256=
|
|
24
|
+
accusleepy/gui/main.py,sha256=cZQH0qJ_mykeQP7eadc1yzFHYeDwbRngrR4_H1wMxWY,58438
|
|
25
|
+
accusleepy/gui/manual_scoring.py,sha256=QCFF-CIU6nh26NB8Z9ktohCk8p7ola2hgjazD-OrK_o,40697
|
|
26
26
|
accusleepy/gui/mplwidget.py,sha256=rJSTtWmLjHn8r3c9Kb23Rc4XzXl3i9B-JrjNjjlNnmQ,13492
|
|
27
|
-
accusleepy/gui/primary_window.py,sha256=
|
|
28
|
-
accusleepy/gui/primary_window.ui,sha256=
|
|
27
|
+
accusleepy/gui/primary_window.py,sha256=qqV-GAC3BgOus1lJMOg2U4AGQbhy35zLMyN8Q7ouTd8,141479
|
|
28
|
+
accusleepy/gui/primary_window.ui,sha256=2mD0G6b8bsyyUvMCUosQ0K-nAzMA2iiP3yMpeh9INcQ,208209
|
|
29
29
|
accusleepy/gui/resources.qrc,sha256=wqPendnTLAuKfVI6v2lKHiRqAWM0oaz2ZuF5cucJdS4,803
|
|
30
30
|
accusleepy/gui/resources_rc.py,sha256=Z2e34h30U4snJjnYdZVV9B6yjATKxxfvgTRt5uXtQdo,329727
|
|
31
|
-
accusleepy/gui/text/dev_guide.md,sha256=
|
|
31
|
+
accusleepy/gui/text/dev_guide.md,sha256=PgOXfGvN17fCtnsfGvPhrhK4FUWFGP_TsHA6t9skP3U,2060
|
|
32
32
|
accusleepy/gui/text/main_guide.md,sha256=iZDRp5OWyQX9LV7CMeUFIYv2ryKlIcGALRLXjxR8HpI,8288
|
|
33
33
|
accusleepy/gui/text/manual_scoring_guide.md,sha256=ow_RMSjFy05NupEDSCuJtu-V65-BPnIkrZqtssFoZCQ,999
|
|
34
34
|
accusleepy/gui/viewer_window.py,sha256=jysFw7C_Tr7mtK1XNWhIpHblBvatwduE3RF2GP4lrro,24479
|
|
@@ -38,6 +38,6 @@ accusleepy/multitaper.py,sha256=D5-iglwkFBRciL5tKSNcunMtcq0rM3zHwRHUVPgem1U,2567
|
|
|
38
38
|
accusleepy/signal_processing.py,sha256=47fEAx8Aqqkiqix1ai2YEK9Fhq6UHoQcwAcOi-a8ewo,16834
|
|
39
39
|
accusleepy/temperature_scaling.py,sha256=glvPcvxHpBdFjwjGfZdNku9L_BozycEmdqZhKKUCCNg,5749
|
|
40
40
|
accusleepy/validation.py,sha256=VpLWK-wD5tCU6lTBG3KYgTi3PWGuYh6NitMgMoMH8JM,4434
|
|
41
|
-
accusleepy-0.
|
|
42
|
-
accusleepy-0.
|
|
43
|
-
accusleepy-0.
|
|
41
|
+
accusleepy-0.8.1.dist-info/METADATA,sha256=29kPvzKr2ykosWwidIt6FKrjvIY-m88Ui9GQPoQPN-g,4710
|
|
42
|
+
accusleepy-0.8.1.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
43
|
+
accusleepy-0.8.1.dist-info/RECORD,,
|