boris-behav-obs 8.27.10__py2.py3-none-any.whl → 9.0.2__py2.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.
- boris/about.py +7 -5
- boris/add_modifier.py +35 -35
- boris/add_modifier_ui.py +229 -129
- boris/advanced_event_filtering.py +3 -3
- boris/analysis_plugins/__init__.py +0 -0
- boris/analysis_plugins/number_of_occurences.py +60 -0
- boris/analysis_plugins/number_of_occurences_by_independent_variable.py +72 -0
- boris/analysis_plugins/time_budget.py +95 -0
- boris/behav_coding_map_creator.py +103 -108
- boris/behavior_binary_table.py +1 -1
- boris/behaviors_coding_map.py +8 -8
- boris/coding_pad.py +6 -6
- boris/config.py +6 -0
- boris/config_file.py +1 -1
- boris/connections.py +4 -2
- boris/converters.py +2 -3
- boris/converters_ui.py +187 -110
- boris/cooccurence.py +2 -2
- boris/core.py +341 -94
- boris/core_qrc.py +16088 -13246
- boris/core_ui.py +922 -812
- boris/dialog.py +14 -13
- boris/duration_widget.py +5 -5
- boris/edit_event.py +1 -1
- boris/edit_event_ui.py +162 -88
- boris/event_operations.py +4 -25
- boris/events_cursor.py +17 -9
- boris/events_snapshots.py +5 -5
- boris/exclusion_matrix.py +1 -1
- boris/export_events.py +38 -28
- boris/export_observation.py +1 -1
- boris/external_processes.py +3 -5
- boris/geometric_measurement.py +49 -26
- boris/gui_utilities.py +31 -30
- boris/import_observations.py +2 -4
- boris/irr.py +1 -1
- boris/latency.py +1 -1
- boris/map_creator.py +77 -89
- boris/measurement_widget.py +4 -4
- boris/media_file.py +2 -4
- boris/menu_options.py +1 -3
- boris/modifiers_coding_map.py +4 -4
- boris/mpv2.py +0 -2
- boris/observation.py +124 -29
- boris/observation_operations.py +18 -40
- boris/observation_ui.py +566 -374
- boris/observations_list.py +6 -6
- boris/param_panel.py +2 -2
- boris/param_panel_ui.py +246 -141
- boris/player_dock_widget.py +16 -21
- boris/plot_data_module.py +6 -6
- boris/plot_events_rt.py +7 -8
- boris/plot_spectrogram_rt.py +7 -8
- boris/plot_waveform_rt.py +6 -7
- boris/plugins.py +79 -0
- boris/preferences.py +127 -17
- boris/preferences_ui.py +464 -240
- boris/project.py +69 -72
- boris/project_functions.py +233 -31
- boris/project_import_export.py +59 -67
- boris/project_ui.py +672 -440
- boris/qrc_boris.py +6 -3
- boris/qrc_boris5.py +6 -3
- boris/select_modifiers.py +2 -2
- boris/select_observations.py +2 -2
- boris/select_subj_behav.py +3 -3
- boris/state_events.py +1 -1
- boris/subjects_pad.py +5 -5
- boris/synthetic_time_budget.py +2 -2
- boris/time_budget_functions.py +15 -0
- boris/time_budget_widget.py +4 -4
- boris/transitions.py +34 -25
- boris/utilities.py +96 -3
- boris/version.py +2 -2
- boris/video_equalizer.py +4 -4
- boris/video_equalizer_ui.py +199 -130
- boris/video_operations.py +1 -1
- boris/view_df.py +106 -0
- boris/view_df_ui.py +75 -0
- boris/write_event.py +9 -1
- {boris_behav_obs-8.27.10.dist-info → boris_behav_obs-9.0.2.dist-info}/METADATA +5 -5
- boris_behav_obs-9.0.2.dist-info/RECORD +103 -0
- {boris_behav_obs-8.27.10.dist-info → boris_behav_obs-9.0.2.dist-info}/WHEEL +1 -1
- boris/qdarkstyle/__init__.py +0 -479
- boris/qdarkstyle/__main__.py +0 -66
- boris/qdarkstyle/colorsystem.py +0 -38
- boris/qdarkstyle/dark/__init__.py +0 -1
- boris/qdarkstyle/dark/darkstyle_rc.py +0 -11379
- boris/qdarkstyle/dark/palette.py +0 -38
- boris/qdarkstyle/example/__init__.py +0 -4
- boris/qdarkstyle/example/__main__.py +0 -386
- boris/qdarkstyle/example/ui/__init__.py +0 -4
- boris/qdarkstyle/light/__init__.py +0 -1
- boris/qdarkstyle/light/lightstyle_rc.py +0 -11305
- boris/qdarkstyle/light/palette.py +0 -37
- boris/qdarkstyle/palette.py +0 -102
- boris/qdarkstyle/utils/__init__.py +0 -73
- boris/qdarkstyle/utils/__main__.py +0 -96
- boris/qdarkstyle/utils/images.py +0 -449
- boris/qdarkstyle/utils/scss.py +0 -318
- boris/vlc_local.py +0 -83
- boris_behav_obs-8.27.10.dist-info/RECORD +0 -114
- {boris_behav_obs-8.27.10.dist-info → boris_behav_obs-9.0.2.dist-info}/LICENSE.TXT +0 -0
- {boris_behav_obs-8.27.10.dist-info → boris_behav_obs-9.0.2.dist-info}/entry_points.txt +0 -0
- {boris_behav_obs-8.27.10.dist-info → boris_behav_obs-9.0.2.dist-info}/top_level.txt +0 -0
boris/about.py
CHANGED
|
@@ -31,9 +31,9 @@ from . import config as cfg
|
|
|
31
31
|
from . import utilities as util
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
from
|
|
35
|
-
from
|
|
36
|
-
from
|
|
34
|
+
from PySide6.QtCore import qVersion
|
|
35
|
+
from PySide6.QtGui import QPixmap
|
|
36
|
+
from PySide6.QtWidgets import QMessageBox
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
def actionAbout_activated(self):
|
|
@@ -41,6 +41,8 @@ def actionAbout_activated(self):
|
|
|
41
41
|
About dialog
|
|
42
42
|
"""
|
|
43
43
|
|
|
44
|
+
import PySide6
|
|
45
|
+
|
|
44
46
|
programs_versions: list = ["MPV media player"]
|
|
45
47
|
|
|
46
48
|
mpv_lib_version, mpv_lib_file_path, mpv_api_version = util.mpv_lib_version()
|
|
@@ -112,7 +114,7 @@ def actionAbout_activated(self):
|
|
|
112
114
|
f"Operating system: {current_system.system} {current_system.release} {current_system.version} \n"
|
|
113
115
|
f"CPU: {current_system.machine} {current_system.processor}\n\n"
|
|
114
116
|
f"Python {platform.python_version()} ({'64-bit' if sys.maxsize > 2**32 else '32-bit'})"
|
|
115
|
-
f"
|
|
117
|
+
f"Qt {qVersion()} - PySide {PySide6.__version__}\n"
|
|
116
118
|
)
|
|
117
119
|
|
|
118
120
|
r, memory = util.mem_info()
|
|
@@ -137,4 +139,4 @@ def actionAbout_activated(self):
|
|
|
137
139
|
|
|
138
140
|
about_dialog.setDetailedText(details)
|
|
139
141
|
|
|
140
|
-
_ = about_dialog.
|
|
142
|
+
_ = about_dialog.exec()
|
boris/add_modifier.py
CHANGED
|
@@ -16,15 +16,15 @@ This file is part of BORIS.
|
|
|
16
16
|
GNU General Public License for more details.
|
|
17
17
|
|
|
18
18
|
You should have received a copy of the GNU General Public License
|
|
19
|
-
along with this program; if not see <http://www.gnu.org/
|
|
19
|
+
along with this program; if not see <http://www.gnu.org/licPbehav_enses/>.
|
|
20
20
|
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
23
|
import logging
|
|
24
24
|
import json
|
|
25
25
|
|
|
26
|
-
from
|
|
27
|
-
from
|
|
26
|
+
from PySide6.QtGui import QIcon
|
|
27
|
+
from PySide6.QtWidgets import QDialog, QWidget, QFileDialog, QMessageBox
|
|
28
28
|
|
|
29
29
|
from . import dialog
|
|
30
30
|
from .add_modifier_ui import Ui_Dialog
|
|
@@ -158,38 +158,38 @@ class addModifierDialog(QDialog, Ui_Dialog):
|
|
|
158
158
|
add modifiers from file
|
|
159
159
|
"""
|
|
160
160
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
161
|
+
file_name, _ = QFileDialog.getOpenFileName(self, "Load modifiers from file", "", "All files (*)")
|
|
162
|
+
if not file_name:
|
|
163
|
+
return
|
|
164
|
+
try:
|
|
165
|
+
with open(file_name) as f_in:
|
|
166
|
+
for line in f_in:
|
|
167
|
+
if line.strip():
|
|
168
|
+
for c in cfg.CHAR_FORBIDDEN_IN_MODIFIERS:
|
|
169
|
+
if c in line.strip():
|
|
170
|
+
QMessageBox.critical(
|
|
171
|
+
self,
|
|
172
|
+
cfg.programName,
|
|
173
|
+
(
|
|
174
|
+
f"The character <b>{c}</b> is not allowed.<br>"
|
|
175
|
+
"The following characters are not allowed in modifiers:<br>"
|
|
176
|
+
f"<b>{cfg.CHAR_FORBIDDEN_IN_MODIFIERS}</b>"
|
|
177
|
+
),
|
|
178
|
+
)
|
|
179
|
+
break
|
|
180
|
+
else:
|
|
181
|
+
if line.strip() not in [self.lwModifiers.item(x).text() for x in range(self.lwModifiers.count())]:
|
|
182
|
+
if self.itemPositionMem != -1:
|
|
183
|
+
self.lwModifiers.insertItem(self.itemPositionMem, line.strip())
|
|
184
|
+
else:
|
|
185
|
+
self.lwModifiers.addItem(line.strip())
|
|
186
|
+
|
|
187
|
+
self.modifiers_sets_dict[str(self.tabWidgetModifiersSets.currentIndex())]["values"] = [
|
|
188
|
+
self.lwModifiers.item(x).text() for x in range(self.lwModifiers.count())
|
|
189
|
+
]
|
|
190
|
+
except Exception:
|
|
191
|
+
QMessageBox.warning(self, cfg.programName, f"Error reading modifiers from file:<br>{file_name}")
|
|
192
|
+
logging.warning(f"Error reading modifiers from file<br>{file_name}")
|
|
193
193
|
|
|
194
194
|
def sort_modifiers(self):
|
|
195
195
|
"""
|
boris/add_modifier_ui.py
CHANGED
|
@@ -1,185 +1,285 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
3
|
+
################################################################################
|
|
4
|
+
## Form generated from reading UI file 'add_modifier.ui'
|
|
5
|
+
##
|
|
6
|
+
## Created by: Qt User Interface Compiler version 6.8.0
|
|
7
|
+
##
|
|
8
|
+
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
|
9
|
+
################################################################################
|
|
12
10
|
|
|
11
|
+
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
|
|
12
|
+
QMetaObject, QObject, QPoint, QRect,
|
|
13
|
+
QSize, QTime, QUrl, Qt)
|
|
14
|
+
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
|
|
15
|
+
QFont, QFontDatabase, QGradient, QIcon,
|
|
16
|
+
QImage, QKeySequence, QLinearGradient, QPainter,
|
|
17
|
+
QPalette, QPixmap, QRadialGradient, QTransform)
|
|
18
|
+
from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QDialog,
|
|
19
|
+
QHBoxLayout, QLabel, QLineEdit, QListWidget,
|
|
20
|
+
QListWidgetItem, QPushButton, QSizePolicy, QSpacerItem,
|
|
21
|
+
QTabWidget, QVBoxLayout, QWidget)
|
|
13
22
|
|
|
14
23
|
class Ui_Dialog(object):
|
|
15
24
|
def setupUi(self, Dialog):
|
|
16
|
-
Dialog.
|
|
25
|
+
if not Dialog.objectName():
|
|
26
|
+
Dialog.setObjectName(u"Dialog")
|
|
17
27
|
Dialog.resize(1088, 654)
|
|
18
|
-
self.verticalLayout_5 =
|
|
19
|
-
self.verticalLayout_5.setObjectName("verticalLayout_5")
|
|
20
|
-
self.cb_ask_at_stop =
|
|
21
|
-
self.cb_ask_at_stop.setObjectName("cb_ask_at_stop")
|
|
28
|
+
self.verticalLayout_5 = QVBoxLayout(Dialog)
|
|
29
|
+
self.verticalLayout_5.setObjectName(u"verticalLayout_5")
|
|
30
|
+
self.cb_ask_at_stop = QCheckBox(Dialog)
|
|
31
|
+
self.cb_ask_at_stop.setObjectName(u"cb_ask_at_stop")
|
|
32
|
+
|
|
22
33
|
self.verticalLayout_5.addWidget(self.cb_ask_at_stop)
|
|
23
|
-
|
|
24
|
-
self.verticalLayout_4
|
|
25
|
-
self.
|
|
26
|
-
self.horizontalLayout_5
|
|
27
|
-
self.
|
|
28
|
-
self.verticalLayout_2
|
|
29
|
-
self.
|
|
30
|
-
self.lbModifier
|
|
34
|
+
|
|
35
|
+
self.verticalLayout_4 = QVBoxLayout()
|
|
36
|
+
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
|
|
37
|
+
self.horizontalLayout_5 = QHBoxLayout()
|
|
38
|
+
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
|
|
39
|
+
self.verticalLayout_2 = QVBoxLayout()
|
|
40
|
+
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
|
|
41
|
+
self.lbModifier = QLabel(Dialog)
|
|
42
|
+
self.lbModifier.setObjectName(u"lbModifier")
|
|
43
|
+
|
|
31
44
|
self.verticalLayout_2.addWidget(self.lbModifier)
|
|
32
|
-
|
|
33
|
-
self.leModifier
|
|
45
|
+
|
|
46
|
+
self.leModifier = QLineEdit(Dialog)
|
|
47
|
+
self.leModifier.setObjectName(u"leModifier")
|
|
48
|
+
|
|
34
49
|
self.verticalLayout_2.addWidget(self.leModifier)
|
|
35
|
-
|
|
36
|
-
self.lbCode
|
|
50
|
+
|
|
51
|
+
self.lbCode = QLabel(Dialog)
|
|
52
|
+
self.lbCode.setObjectName(u"lbCode")
|
|
53
|
+
|
|
37
54
|
self.verticalLayout_2.addWidget(self.lbCode)
|
|
38
|
-
|
|
39
|
-
self.leCode
|
|
55
|
+
|
|
56
|
+
self.leCode = QLineEdit(Dialog)
|
|
57
|
+
self.leCode.setObjectName(u"leCode")
|
|
58
|
+
|
|
40
59
|
self.verticalLayout_2.addWidget(self.leCode)
|
|
41
|
-
|
|
60
|
+
|
|
61
|
+
self.lbCodeHelp = QLabel(Dialog)
|
|
62
|
+
self.lbCodeHelp.setObjectName(u"lbCodeHelp")
|
|
42
63
|
self.lbCodeHelp.setWordWrap(True)
|
|
43
|
-
|
|
64
|
+
|
|
44
65
|
self.verticalLayout_2.addWidget(self.lbCodeHelp)
|
|
45
|
-
|
|
46
|
-
self.
|
|
66
|
+
|
|
67
|
+
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
|
68
|
+
|
|
69
|
+
self.verticalLayout_2.addItem(self.verticalSpacer)
|
|
70
|
+
|
|
71
|
+
|
|
47
72
|
self.horizontalLayout_5.addLayout(self.verticalLayout_2)
|
|
48
|
-
|
|
49
|
-
self.verticalLayout_3
|
|
50
|
-
self.
|
|
51
|
-
self.pbAddModifier
|
|
52
|
-
self.pbAddModifier.setObjectName("pbAddModifier")
|
|
73
|
+
|
|
74
|
+
self.verticalLayout_3 = QVBoxLayout()
|
|
75
|
+
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
|
|
76
|
+
self.pbAddModifier = QPushButton(Dialog)
|
|
77
|
+
self.pbAddModifier.setObjectName(u"pbAddModifier")
|
|
78
|
+
|
|
53
79
|
self.verticalLayout_3.addWidget(self.pbAddModifier)
|
|
54
|
-
|
|
55
|
-
self.pbModifyModifier
|
|
56
|
-
self.pbModifyModifier.setObjectName("pbModifyModifier")
|
|
80
|
+
|
|
81
|
+
self.pbModifyModifier = QPushButton(Dialog)
|
|
82
|
+
self.pbModifyModifier.setObjectName(u"pbModifyModifier")
|
|
83
|
+
|
|
57
84
|
self.verticalLayout_3.addWidget(self.pbModifyModifier)
|
|
58
|
-
|
|
59
|
-
self.
|
|
85
|
+
|
|
86
|
+
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
|
87
|
+
|
|
88
|
+
self.verticalLayout_3.addItem(self.verticalSpacer_2)
|
|
89
|
+
|
|
90
|
+
|
|
60
91
|
self.horizontalLayout_5.addLayout(self.verticalLayout_3)
|
|
61
|
-
|
|
62
|
-
self.verticalLayout
|
|
63
|
-
self.
|
|
64
|
-
self.tabWidgetModifiersSets
|
|
65
|
-
self.tabWidgetModifiersSets.
|
|
66
|
-
self.tabWidgetModifiersSets.
|
|
67
|
-
self.tabWidgetModifiersSets.
|
|
92
|
+
|
|
93
|
+
self.verticalLayout = QVBoxLayout()
|
|
94
|
+
self.verticalLayout.setObjectName(u"verticalLayout")
|
|
95
|
+
self.tabWidgetModifiersSets = QTabWidget(Dialog)
|
|
96
|
+
self.tabWidgetModifiersSets.setObjectName(u"tabWidgetModifiersSets")
|
|
97
|
+
self.tabWidgetModifiersSets.setMaximumSize(QSize(16777215, 30))
|
|
98
|
+
self.tabWidgetModifiersSets.setTabPosition(QTabWidget.North)
|
|
99
|
+
self.tabWidgetModifiersSets.setTabShape(QTabWidget.Rounded)
|
|
100
|
+
self.tabWidgetModifiersSets.setElideMode(Qt.ElideNone)
|
|
68
101
|
self.tabWidgetModifiersSets.setDocumentMode(True)
|
|
69
|
-
|
|
102
|
+
|
|
70
103
|
self.verticalLayout.addWidget(self.tabWidgetModifiersSets)
|
|
71
|
-
|
|
72
|
-
self.lb_name
|
|
104
|
+
|
|
105
|
+
self.lb_name = QLabel(Dialog)
|
|
106
|
+
self.lb_name.setObjectName(u"lb_name")
|
|
107
|
+
|
|
73
108
|
self.verticalLayout.addWidget(self.lb_name)
|
|
74
|
-
|
|
75
|
-
self.le_name
|
|
109
|
+
|
|
110
|
+
self.le_name = QLineEdit(Dialog)
|
|
111
|
+
self.le_name.setObjectName(u"le_name")
|
|
112
|
+
|
|
76
113
|
self.verticalLayout.addWidget(self.le_name)
|
|
77
|
-
|
|
78
|
-
self.lb_description
|
|
114
|
+
|
|
115
|
+
self.lb_description = QLabel(Dialog)
|
|
116
|
+
self.lb_description.setObjectName(u"lb_description")
|
|
117
|
+
|
|
79
118
|
self.verticalLayout.addWidget(self.lb_description)
|
|
80
|
-
|
|
81
|
-
self.le_description
|
|
119
|
+
|
|
120
|
+
self.le_description = QLineEdit(Dialog)
|
|
121
|
+
self.le_description.setObjectName(u"le_description")
|
|
122
|
+
|
|
82
123
|
self.verticalLayout.addWidget(self.le_description)
|
|
83
|
-
|
|
84
|
-
self.lbType
|
|
124
|
+
|
|
125
|
+
self.lbType = QLabel(Dialog)
|
|
126
|
+
self.lbType.setObjectName(u"lbType")
|
|
127
|
+
|
|
85
128
|
self.verticalLayout.addWidget(self.lbType)
|
|
86
|
-
|
|
87
|
-
self.cbType
|
|
129
|
+
|
|
130
|
+
self.cbType = QComboBox(Dialog)
|
|
88
131
|
self.cbType.addItem("")
|
|
89
132
|
self.cbType.addItem("")
|
|
90
133
|
self.cbType.addItem("")
|
|
91
134
|
self.cbType.addItem("")
|
|
135
|
+
self.cbType.setObjectName(u"cbType")
|
|
136
|
+
|
|
92
137
|
self.verticalLayout.addWidget(self.cbType)
|
|
93
|
-
|
|
94
|
-
self.lbValues
|
|
138
|
+
|
|
139
|
+
self.lbValues = QLabel(Dialog)
|
|
140
|
+
self.lbValues.setObjectName(u"lbValues")
|
|
141
|
+
|
|
95
142
|
self.verticalLayout.addWidget(self.lbValues)
|
|
96
|
-
|
|
97
|
-
self.lwModifiers
|
|
143
|
+
|
|
144
|
+
self.lwModifiers = QListWidget(Dialog)
|
|
145
|
+
self.lwModifiers.setObjectName(u"lwModifiers")
|
|
146
|
+
|
|
98
147
|
self.verticalLayout.addWidget(self.lwModifiers)
|
|
99
|
-
|
|
100
|
-
self.horizontalLayout
|
|
101
|
-
self.
|
|
102
|
-
self.pbMoveUp
|
|
148
|
+
|
|
149
|
+
self.horizontalLayout = QHBoxLayout()
|
|
150
|
+
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
|
151
|
+
self.pbMoveUp = QPushButton(Dialog)
|
|
152
|
+
self.pbMoveUp.setObjectName(u"pbMoveUp")
|
|
153
|
+
|
|
103
154
|
self.horizontalLayout.addWidget(self.pbMoveUp)
|
|
104
|
-
|
|
105
|
-
self.pbMoveDown
|
|
155
|
+
|
|
156
|
+
self.pbMoveDown = QPushButton(Dialog)
|
|
157
|
+
self.pbMoveDown.setObjectName(u"pbMoveDown")
|
|
158
|
+
|
|
106
159
|
self.horizontalLayout.addWidget(self.pbMoveDown)
|
|
107
|
-
|
|
108
|
-
self.pbRemoveModifier
|
|
160
|
+
|
|
161
|
+
self.pbRemoveModifier = QPushButton(Dialog)
|
|
162
|
+
self.pbRemoveModifier.setObjectName(u"pbRemoveModifier")
|
|
163
|
+
|
|
109
164
|
self.horizontalLayout.addWidget(self.pbRemoveModifier)
|
|
165
|
+
|
|
166
|
+
|
|
110
167
|
self.verticalLayout.addLayout(self.horizontalLayout)
|
|
111
|
-
|
|
112
|
-
self.pb_sort_modifiers
|
|
168
|
+
|
|
169
|
+
self.pb_sort_modifiers = QPushButton(Dialog)
|
|
170
|
+
self.pb_sort_modifiers.setObjectName(u"pb_sort_modifiers")
|
|
171
|
+
|
|
113
172
|
self.verticalLayout.addWidget(self.pb_sort_modifiers)
|
|
114
|
-
|
|
115
|
-
self.horizontalLayout_3
|
|
116
|
-
self.
|
|
117
|
-
self.pbAddSet
|
|
173
|
+
|
|
174
|
+
self.horizontalLayout_3 = QHBoxLayout()
|
|
175
|
+
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
|
|
176
|
+
self.pbAddSet = QPushButton(Dialog)
|
|
177
|
+
self.pbAddSet.setObjectName(u"pbAddSet")
|
|
178
|
+
|
|
118
179
|
self.horizontalLayout_3.addWidget(self.pbAddSet)
|
|
119
|
-
|
|
120
|
-
self.pbRemoveSet
|
|
180
|
+
|
|
181
|
+
self.pbRemoveSet = QPushButton(Dialog)
|
|
182
|
+
self.pbRemoveSet.setObjectName(u"pbRemoveSet")
|
|
183
|
+
|
|
121
184
|
self.horizontalLayout_3.addWidget(self.pbRemoveSet)
|
|
185
|
+
|
|
186
|
+
|
|
122
187
|
self.verticalLayout.addLayout(self.horizontalLayout_3)
|
|
123
|
-
|
|
124
|
-
self.horizontalLayout_4
|
|
125
|
-
self.
|
|
126
|
-
self.pbMoveSetLeft
|
|
188
|
+
|
|
189
|
+
self.horizontalLayout_4 = QHBoxLayout()
|
|
190
|
+
self.horizontalLayout_4.setObjectName(u"horizontalLayout_4")
|
|
191
|
+
self.pbMoveSetLeft = QPushButton(Dialog)
|
|
192
|
+
self.pbMoveSetLeft.setObjectName(u"pbMoveSetLeft")
|
|
193
|
+
|
|
127
194
|
self.horizontalLayout_4.addWidget(self.pbMoveSetLeft)
|
|
128
|
-
|
|
129
|
-
self.pbMoveSetRight
|
|
195
|
+
|
|
196
|
+
self.pbMoveSetRight = QPushButton(Dialog)
|
|
197
|
+
self.pbMoveSetRight.setObjectName(u"pbMoveSetRight")
|
|
198
|
+
|
|
130
199
|
self.horizontalLayout_4.addWidget(self.pbMoveSetRight)
|
|
200
|
+
|
|
201
|
+
|
|
131
202
|
self.verticalLayout.addLayout(self.horizontalLayout_4)
|
|
132
|
-
|
|
133
|
-
self.pb_add_subjects
|
|
203
|
+
|
|
204
|
+
self.pb_add_subjects = QPushButton(Dialog)
|
|
205
|
+
self.pb_add_subjects.setObjectName(u"pb_add_subjects")
|
|
206
|
+
|
|
134
207
|
self.verticalLayout.addWidget(self.pb_add_subjects)
|
|
135
|
-
|
|
136
|
-
self.pb_load_file
|
|
208
|
+
|
|
209
|
+
self.pb_load_file = QPushButton(Dialog)
|
|
210
|
+
self.pb_load_file.setObjectName(u"pb_load_file")
|
|
211
|
+
|
|
137
212
|
self.verticalLayout.addWidget(self.pb_load_file)
|
|
138
|
-
|
|
139
|
-
self.
|
|
213
|
+
|
|
214
|
+
self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
|
|
215
|
+
|
|
216
|
+
self.verticalLayout.addItem(self.verticalSpacer_3)
|
|
217
|
+
|
|
218
|
+
|
|
140
219
|
self.horizontalLayout_5.addLayout(self.verticalLayout)
|
|
220
|
+
|
|
221
|
+
|
|
141
222
|
self.verticalLayout_4.addLayout(self.horizontalLayout_5)
|
|
142
|
-
|
|
143
|
-
self.horizontalLayout_2
|
|
144
|
-
|
|
145
|
-
self.
|
|
146
|
-
|
|
147
|
-
self.
|
|
223
|
+
|
|
224
|
+
self.horizontalLayout_2 = QHBoxLayout()
|
|
225
|
+
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
|
|
226
|
+
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
|
|
227
|
+
|
|
228
|
+
self.horizontalLayout_2.addItem(self.horizontalSpacer)
|
|
229
|
+
|
|
230
|
+
self.pbCancel = QPushButton(Dialog)
|
|
231
|
+
self.pbCancel.setObjectName(u"pbCancel")
|
|
232
|
+
|
|
148
233
|
self.horizontalLayout_2.addWidget(self.pbCancel)
|
|
149
|
-
|
|
150
|
-
self.pbOK
|
|
234
|
+
|
|
235
|
+
self.pbOK = QPushButton(Dialog)
|
|
236
|
+
self.pbOK.setObjectName(u"pbOK")
|
|
237
|
+
|
|
151
238
|
self.horizontalLayout_2.addWidget(self.pbOK)
|
|
239
|
+
|
|
240
|
+
|
|
152
241
|
self.verticalLayout_4.addLayout(self.horizontalLayout_2)
|
|
242
|
+
|
|
243
|
+
|
|
153
244
|
self.verticalLayout_5.addLayout(self.verticalLayout_4)
|
|
154
245
|
|
|
246
|
+
|
|
155
247
|
self.retranslateUi(Dialog)
|
|
248
|
+
|
|
156
249
|
self.tabWidgetModifiersSets.setCurrentIndex(-1)
|
|
157
|
-
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
QMetaObject.connectSlotsByName(Dialog)
|
|
253
|
+
# setupUi
|
|
158
254
|
|
|
159
255
|
def retranslateUi(self, Dialog):
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
self.
|
|
163
|
-
self.
|
|
164
|
-
self.
|
|
165
|
-
self.
|
|
166
|
-
self.
|
|
167
|
-
self.
|
|
168
|
-
self.
|
|
169
|
-
self.
|
|
170
|
-
self.cbType.setItemText(
|
|
171
|
-
self.cbType.setItemText(
|
|
172
|
-
self.cbType.setItemText(
|
|
173
|
-
self.
|
|
174
|
-
|
|
175
|
-
self.
|
|
176
|
-
self.
|
|
177
|
-
self.
|
|
178
|
-
self.
|
|
179
|
-
self.
|
|
180
|
-
self.
|
|
181
|
-
self.
|
|
182
|
-
self.
|
|
183
|
-
self.
|
|
184
|
-
self.
|
|
185
|
-
self.
|
|
256
|
+
Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Set modifiers", None))
|
|
257
|
+
self.cb_ask_at_stop.setText(QCoreApplication.translate("Dialog", u"Ask for modifier(s) when behavior stops", None))
|
|
258
|
+
self.lbModifier.setText(QCoreApplication.translate("Dialog", u"Modifier", None))
|
|
259
|
+
self.lbCode.setText(QCoreApplication.translate("Dialog", u"Key code", None))
|
|
260
|
+
self.lbCodeHelp.setText(QCoreApplication.translate("Dialog", u"Key code is case sensitive. Type one character or a function key (F1, F2... F12)", None))
|
|
261
|
+
self.pbAddModifier.setText("")
|
|
262
|
+
self.pbModifyModifier.setText("")
|
|
263
|
+
self.lb_name.setText(QCoreApplication.translate("Dialog", u"Set name", None))
|
|
264
|
+
self.lb_description.setText(QCoreApplication.translate("Dialog", u"Description", None))
|
|
265
|
+
self.lbType.setText(QCoreApplication.translate("Dialog", u"Modifier type", None))
|
|
266
|
+
self.cbType.setItemText(0, QCoreApplication.translate("Dialog", u"Single selection", None))
|
|
267
|
+
self.cbType.setItemText(1, QCoreApplication.translate("Dialog", u"Multiple selection", None))
|
|
268
|
+
self.cbType.setItemText(2, QCoreApplication.translate("Dialog", u"Numeric", None))
|
|
269
|
+
self.cbType.setItemText(3, QCoreApplication.translate("Dialog", u"Value from external data file", None))
|
|
270
|
+
|
|
271
|
+
self.lbValues.setText(QCoreApplication.translate("Dialog", u"Values", None))
|
|
272
|
+
self.pbMoveUp.setText(QCoreApplication.translate("Dialog", u"Move modifier up", None))
|
|
273
|
+
self.pbMoveDown.setText(QCoreApplication.translate("Dialog", u"Move modifier down", None))
|
|
274
|
+
self.pbRemoveModifier.setText(QCoreApplication.translate("Dialog", u"Remove modifier", None))
|
|
275
|
+
self.pb_sort_modifiers.setText(QCoreApplication.translate("Dialog", u"Sort modifiers", None))
|
|
276
|
+
self.pbAddSet.setText(QCoreApplication.translate("Dialog", u"Add set of modifiers", None))
|
|
277
|
+
self.pbRemoveSet.setText(QCoreApplication.translate("Dialog", u"Remove set of modifiers", None))
|
|
278
|
+
self.pbMoveSetLeft.setText(QCoreApplication.translate("Dialog", u"Move set left", None))
|
|
279
|
+
self.pbMoveSetRight.setText(QCoreApplication.translate("Dialog", u"Move set right", None))
|
|
280
|
+
self.pb_add_subjects.setText(QCoreApplication.translate("Dialog", u"Add subjects as modifiers", None))
|
|
281
|
+
self.pb_load_file.setText(QCoreApplication.translate("Dialog", u"Load modifiers from file", None))
|
|
282
|
+
self.pbCancel.setText(QCoreApplication.translate("Dialog", u"Cancel", None))
|
|
283
|
+
self.pbOK.setText(QCoreApplication.translate("Dialog", u"OK", None))
|
|
284
|
+
# retranslateUi
|
|
285
|
+
|
|
@@ -25,9 +25,9 @@ import statistics
|
|
|
25
25
|
import sys
|
|
26
26
|
|
|
27
27
|
import tablib
|
|
28
|
-
from
|
|
29
|
-
from
|
|
30
|
-
from
|
|
28
|
+
from PySide6.QtCore import Qt
|
|
29
|
+
from PySide6.QtGui import QIcon
|
|
30
|
+
from PySide6.QtWidgets import (
|
|
31
31
|
QDialog,
|
|
32
32
|
QFileDialog,
|
|
33
33
|
QHBoxLayout,
|
|
File without changes
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
BORIS plugin
|
|
3
|
+
|
|
4
|
+
number of occurences of behaviors
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
__version__ = "0.1.0"
|
|
10
|
+
__version_date__ = "2024-11-14"
|
|
11
|
+
__plugin_name__ = "Number of occurences of behaviors"
|
|
12
|
+
__author__ = "Olivier Friard - University of Torino - Italy"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def run(df: pd.DataFrame):
|
|
16
|
+
"""
|
|
17
|
+
Calculate the number of occurrences of behaviors by subject.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
return df.groupby(["Subject", "Behavior"])["Behavior"].count().reset_index(name="number of occurences")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def main(df: pd.DataFrame, observations_list: list = [], parameters: dict = {}) -> pd.DataFrame:
|
|
24
|
+
"""
|
|
25
|
+
filter by selected observations.
|
|
26
|
+
filter by selected subjects.
|
|
27
|
+
filter by selected behaviors.
|
|
28
|
+
filter by time interval.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
# filter selected observations
|
|
32
|
+
if observations_list:
|
|
33
|
+
df = df[df["Observation id"].isin(observations_list)]
|
|
34
|
+
|
|
35
|
+
if parameters:
|
|
36
|
+
# filter selected subjects
|
|
37
|
+
df = df[df["Subject"].isin(parameters["selected subjects"])]
|
|
38
|
+
|
|
39
|
+
# filter selected behaviors
|
|
40
|
+
df = df[df["Behavior"].isin(parameters["selected behaviors"])]
|
|
41
|
+
|
|
42
|
+
# filter selected time interval
|
|
43
|
+
if parameters["start time"] is not None and parameters["end time"] is not None:
|
|
44
|
+
MIN_TIME = parameters["start time"]
|
|
45
|
+
MAX_TIME = parameters["end time"]
|
|
46
|
+
df_interval = df[
|
|
47
|
+
(
|
|
48
|
+
((df["Start (s)"] >= MIN_TIME) & (df["Start (s)"] <= MAX_TIME))
|
|
49
|
+
| ((df["Stop (s)"] >= MIN_TIME) & (df["Stop (s)"] <= MAX_TIME))
|
|
50
|
+
)
|
|
51
|
+
| ((df["Start (s)"] < MIN_TIME) & (df["Stop (s)"] > MAX_TIME))
|
|
52
|
+
]
|
|
53
|
+
df_interval.loc[df["Start (s)"] < MIN_TIME, "Start (s)"] = MIN_TIME
|
|
54
|
+
df_interval.loc[df["Stop (s)"] > MAX_TIME, "Stop (s)"] = MAX_TIME
|
|
55
|
+
|
|
56
|
+
df_interval.loc[:, "Duration (s)"] = df_interval["Stop (s)"] - df_interval["Start (s)"]
|
|
57
|
+
|
|
58
|
+
df = df_interval
|
|
59
|
+
|
|
60
|
+
return run(df)
|