boris-behav-obs 8.27.9__py2.py3-none-any.whl → 9.0.1__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.
Files changed (106) hide show
  1. boris/about.py +7 -5
  2. boris/add_modifier.py +35 -35
  3. boris/add_modifier_ui.py +229 -129
  4. boris/advanced_event_filtering.py +3 -3
  5. boris/analysis_plugins/__init__.py +0 -0
  6. boris/analysis_plugins/number_of_occurences.py +60 -0
  7. boris/analysis_plugins/number_of_occurences_by_independent_variable.py +72 -0
  8. boris/analysis_plugins/time_budget.py +95 -0
  9. boris/behav_coding_map_creator.py +103 -108
  10. boris/behavior_binary_table.py +1 -1
  11. boris/behaviors_coding_map.py +8 -8
  12. boris/coding_pad.py +6 -6
  13. boris/config.py +6 -0
  14. boris/config_file.py +1 -1
  15. boris/connections.py +4 -2
  16. boris/converters.py +2 -3
  17. boris/converters_ui.py +187 -110
  18. boris/cooccurence.py +2 -2
  19. boris/core.py +340 -94
  20. boris/core_qrc.py +16088 -13246
  21. boris/core_ui.py +922 -812
  22. boris/db_functions.py +3 -1
  23. boris/dialog.py +14 -13
  24. boris/duration_widget.py +5 -5
  25. boris/edit_event.py +1 -1
  26. boris/edit_event_ui.py +162 -88
  27. boris/event_operations.py +4 -25
  28. boris/events_cursor.py +17 -9
  29. boris/events_snapshots.py +5 -5
  30. boris/exclusion_matrix.py +1 -1
  31. boris/export_events.py +38 -28
  32. boris/export_observation.py +1 -1
  33. boris/external_processes.py +3 -5
  34. boris/geometric_measurement.py +49 -26
  35. boris/gui_utilities.py +31 -30
  36. boris/import_observations.py +2 -4
  37. boris/irr.py +1 -1
  38. boris/latency.py +1 -1
  39. boris/map_creator.py +77 -89
  40. boris/measurement_widget.py +4 -4
  41. boris/media_file.py +2 -4
  42. boris/menu_options.py +1 -3
  43. boris/modifiers_coding_map.py +4 -4
  44. boris/mpv2.py +0 -2
  45. boris/observation.py +124 -29
  46. boris/observation_operations.py +18 -40
  47. boris/observation_ui.py +566 -374
  48. boris/observations_list.py +6 -6
  49. boris/param_panel.py +2 -2
  50. boris/param_panel_ui.py +246 -141
  51. boris/player_dock_widget.py +16 -21
  52. boris/plot_data_module.py +6 -6
  53. boris/plot_events_rt.py +7 -8
  54. boris/plot_spectrogram_rt.py +7 -8
  55. boris/plot_waveform_rt.py +6 -7
  56. boris/plugins.py +79 -0
  57. boris/preferences.py +127 -17
  58. boris/preferences_ui.py +464 -240
  59. boris/project.py +69 -72
  60. boris/project_functions.py +233 -31
  61. boris/project_import_export.py +59 -67
  62. boris/project_ui.py +672 -440
  63. boris/qrc_boris.py +6 -3
  64. boris/qrc_boris5.py +6 -3
  65. boris/select_modifiers.py +2 -2
  66. boris/select_observations.py +2 -2
  67. boris/select_subj_behav.py +3 -3
  68. boris/state_events.py +1 -1
  69. boris/subjects_pad.py +5 -5
  70. boris/synthetic_time_budget.py +2 -2
  71. boris/time_budget_functions.py +15 -0
  72. boris/time_budget_widget.py +4 -4
  73. boris/transitions.py +34 -25
  74. boris/utilities.py +95 -2
  75. boris/version.py +2 -2
  76. boris/video_equalizer.py +4 -4
  77. boris/video_equalizer_ui.py +199 -130
  78. boris/video_operations.py +1 -1
  79. boris/view_df.py +106 -0
  80. boris/view_df_ui.py +75 -0
  81. boris/write_event.py +9 -1
  82. {boris_behav_obs-8.27.9.dist-info → boris_behav_obs-9.0.1.dist-info}/METADATA +5 -5
  83. boris_behav_obs-9.0.1.dist-info/RECORD +103 -0
  84. {boris_behav_obs-8.27.9.dist-info → boris_behav_obs-9.0.1.dist-info}/WHEEL +1 -1
  85. boris/qdarkstyle/__init__.py +0 -479
  86. boris/qdarkstyle/__main__.py +0 -66
  87. boris/qdarkstyle/colorsystem.py +0 -38
  88. boris/qdarkstyle/dark/__init__.py +0 -1
  89. boris/qdarkstyle/dark/darkstyle_rc.py +0 -11379
  90. boris/qdarkstyle/dark/palette.py +0 -38
  91. boris/qdarkstyle/example/__init__.py +0 -4
  92. boris/qdarkstyle/example/__main__.py +0 -386
  93. boris/qdarkstyle/example/ui/__init__.py +0 -4
  94. boris/qdarkstyle/light/__init__.py +0 -1
  95. boris/qdarkstyle/light/lightstyle_rc.py +0 -11305
  96. boris/qdarkstyle/light/palette.py +0 -37
  97. boris/qdarkstyle/palette.py +0 -102
  98. boris/qdarkstyle/utils/__init__.py +0 -73
  99. boris/qdarkstyle/utils/__main__.py +0 -96
  100. boris/qdarkstyle/utils/images.py +0 -449
  101. boris/qdarkstyle/utils/scss.py +0 -318
  102. boris/vlc_local.py +0 -83
  103. boris_behav_obs-8.27.9.dist-info/RECORD +0 -114
  104. {boris_behav_obs-8.27.9.dist-info → boris_behav_obs-9.0.1.dist-info}/LICENSE.TXT +0 -0
  105. {boris_behav_obs-8.27.9.dist-info → boris_behav_obs-9.0.1.dist-info}/entry_points.txt +0 -0
  106. {boris_behav_obs-8.27.9.dist-info → boris_behav_obs-9.0.1.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 PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR
35
- from PyQt5.QtGui import QPixmap
36
- from PyQt5.QtWidgets import QMessageBox
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" - Qt {QT_VERSION_STR} - PyQt {PYQT_VERSION_STR}\n\n"
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.exec_()
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/licenses/>.
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 PyQt5.QtGui import QIcon
27
- from PyQt5.QtWidgets import QDialog, QWidget, QFileDialog, QMessageBox
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
- fn = QFileDialog().getOpenFileName(self, "Load modifiers from file", "", "All files (*)")
162
- file_name = fn[0] if type(fn) is tuple else fn
163
- if file_name:
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}")
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
- # Form implementation generated from reading ui file 'boris/add_modifier.ui'
4
- #
5
- # Created by: PyQt5 UI code generator 5.15.6
6
- #
7
- # WARNING: Any manual changes made to this file will be lost when pyuic5 is
8
- # run again. Do not edit this file unless you know what you are doing.
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.setObjectName("Dialog")
25
+ if not Dialog.objectName():
26
+ Dialog.setObjectName(u"Dialog")
17
27
  Dialog.resize(1088, 654)
18
- self.verticalLayout_5 = QtWidgets.QVBoxLayout(Dialog)
19
- self.verticalLayout_5.setObjectName("verticalLayout_5")
20
- self.cb_ask_at_stop = QtWidgets.QCheckBox(Dialog)
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
- self.verticalLayout_4 = QtWidgets.QVBoxLayout()
24
- self.verticalLayout_4.setObjectName("verticalLayout_4")
25
- self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
26
- self.horizontalLayout_5.setObjectName("horizontalLayout_5")
27
- self.verticalLayout_2 = QtWidgets.QVBoxLayout()
28
- self.verticalLayout_2.setObjectName("verticalLayout_2")
29
- self.lbModifier = QtWidgets.QLabel(Dialog)
30
- self.lbModifier.setObjectName("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
- self.leModifier = QtWidgets.QLineEdit(Dialog)
33
- self.leModifier.setObjectName("leModifier")
45
+
46
+ self.leModifier = QLineEdit(Dialog)
47
+ self.leModifier.setObjectName(u"leModifier")
48
+
34
49
  self.verticalLayout_2.addWidget(self.leModifier)
35
- self.lbCode = QtWidgets.QLabel(Dialog)
36
- self.lbCode.setObjectName("lbCode")
50
+
51
+ self.lbCode = QLabel(Dialog)
52
+ self.lbCode.setObjectName(u"lbCode")
53
+
37
54
  self.verticalLayout_2.addWidget(self.lbCode)
38
- self.leCode = QtWidgets.QLineEdit(Dialog)
39
- self.leCode.setObjectName("leCode")
55
+
56
+ self.leCode = QLineEdit(Dialog)
57
+ self.leCode.setObjectName(u"leCode")
58
+
40
59
  self.verticalLayout_2.addWidget(self.leCode)
41
- self.lbCodeHelp = QtWidgets.QLabel(Dialog)
60
+
61
+ self.lbCodeHelp = QLabel(Dialog)
62
+ self.lbCodeHelp.setObjectName(u"lbCodeHelp")
42
63
  self.lbCodeHelp.setWordWrap(True)
43
- self.lbCodeHelp.setObjectName("lbCodeHelp")
64
+
44
65
  self.verticalLayout_2.addWidget(self.lbCodeHelp)
45
- spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
46
- self.verticalLayout_2.addItem(spacerItem)
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
- self.verticalLayout_3 = QtWidgets.QVBoxLayout()
49
- self.verticalLayout_3.setObjectName("verticalLayout_3")
50
- self.pbAddModifier = QtWidgets.QPushButton(Dialog)
51
- self.pbAddModifier.setText("")
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
- self.pbModifyModifier = QtWidgets.QPushButton(Dialog)
55
- self.pbModifyModifier.setText("")
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
- spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
59
- self.verticalLayout_3.addItem(spacerItem1)
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
- self.verticalLayout = QtWidgets.QVBoxLayout()
62
- self.verticalLayout.setObjectName("verticalLayout")
63
- self.tabWidgetModifiersSets = QtWidgets.QTabWidget(Dialog)
64
- self.tabWidgetModifiersSets.setMaximumSize(QtCore.QSize(16777215, 30))
65
- self.tabWidgetModifiersSets.setTabPosition(QtWidgets.QTabWidget.North)
66
- self.tabWidgetModifiersSets.setTabShape(QtWidgets.QTabWidget.Rounded)
67
- self.tabWidgetModifiersSets.setElideMode(QtCore.Qt.ElideNone)
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
- self.tabWidgetModifiersSets.setObjectName("tabWidgetModifiersSets")
102
+
70
103
  self.verticalLayout.addWidget(self.tabWidgetModifiersSets)
71
- self.lb_name = QtWidgets.QLabel(Dialog)
72
- self.lb_name.setObjectName("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
- self.le_name = QtWidgets.QLineEdit(Dialog)
75
- self.le_name.setObjectName("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
- self.lb_description = QtWidgets.QLabel(Dialog)
78
- self.lb_description.setObjectName("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
- self.le_description = QtWidgets.QLineEdit(Dialog)
81
- self.le_description.setObjectName("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
- self.lbType = QtWidgets.QLabel(Dialog)
84
- self.lbType.setObjectName("lbType")
124
+
125
+ self.lbType = QLabel(Dialog)
126
+ self.lbType.setObjectName(u"lbType")
127
+
85
128
  self.verticalLayout.addWidget(self.lbType)
86
- self.cbType = QtWidgets.QComboBox(Dialog)
87
- self.cbType.setObjectName("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
- self.lbValues = QtWidgets.QLabel(Dialog)
94
- self.lbValues.setObjectName("lbValues")
138
+
139
+ self.lbValues = QLabel(Dialog)
140
+ self.lbValues.setObjectName(u"lbValues")
141
+
95
142
  self.verticalLayout.addWidget(self.lbValues)
96
- self.lwModifiers = QtWidgets.QListWidget(Dialog)
97
- self.lwModifiers.setObjectName("lwModifiers")
143
+
144
+ self.lwModifiers = QListWidget(Dialog)
145
+ self.lwModifiers.setObjectName(u"lwModifiers")
146
+
98
147
  self.verticalLayout.addWidget(self.lwModifiers)
99
- self.horizontalLayout = QtWidgets.QHBoxLayout()
100
- self.horizontalLayout.setObjectName("horizontalLayout")
101
- self.pbMoveUp = QtWidgets.QPushButton(Dialog)
102
- self.pbMoveUp.setObjectName("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
- self.pbMoveDown = QtWidgets.QPushButton(Dialog)
105
- self.pbMoveDown.setObjectName("pbMoveDown")
155
+
156
+ self.pbMoveDown = QPushButton(Dialog)
157
+ self.pbMoveDown.setObjectName(u"pbMoveDown")
158
+
106
159
  self.horizontalLayout.addWidget(self.pbMoveDown)
107
- self.pbRemoveModifier = QtWidgets.QPushButton(Dialog)
108
- self.pbRemoveModifier.setObjectName("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
- self.pb_sort_modifiers = QtWidgets.QPushButton(Dialog)
112
- self.pb_sort_modifiers.setObjectName("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
- self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
115
- self.horizontalLayout_3.setObjectName("horizontalLayout_3")
116
- self.pbAddSet = QtWidgets.QPushButton(Dialog)
117
- self.pbAddSet.setObjectName("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
- self.pbRemoveSet = QtWidgets.QPushButton(Dialog)
120
- self.pbRemoveSet.setObjectName("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
- self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
124
- self.horizontalLayout_4.setObjectName("horizontalLayout_4")
125
- self.pbMoveSetLeft = QtWidgets.QPushButton(Dialog)
126
- self.pbMoveSetLeft.setObjectName("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
- self.pbMoveSetRight = QtWidgets.QPushButton(Dialog)
129
- self.pbMoveSetRight.setObjectName("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
- self.pb_add_subjects = QtWidgets.QPushButton(Dialog)
133
- self.pb_add_subjects.setObjectName("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
- self.pb_load_file = QtWidgets.QPushButton(Dialog)
136
- self.pb_load_file.setObjectName("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
- spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
139
- self.verticalLayout.addItem(spacerItem2)
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
- self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
143
- self.horizontalLayout_2.setObjectName("horizontalLayout_2")
144
- spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
145
- self.horizontalLayout_2.addItem(spacerItem3)
146
- self.pbCancel = QtWidgets.QPushButton(Dialog)
147
- self.pbCancel.setObjectName("pbCancel")
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
- self.pbOK = QtWidgets.QPushButton(Dialog)
150
- self.pbOK.setObjectName("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
- QtCore.QMetaObject.connectSlotsByName(Dialog)
250
+
251
+
252
+ QMetaObject.connectSlotsByName(Dialog)
253
+ # setupUi
158
254
 
159
255
  def retranslateUi(self, Dialog):
160
- _translate = QtCore.QCoreApplication.translate
161
- Dialog.setWindowTitle(_translate("Dialog", "Set modifiers"))
162
- self.cb_ask_at_stop.setText(_translate("Dialog", "Ask for modifier(s) when behavior stops"))
163
- self.lbModifier.setText(_translate("Dialog", "Modifier"))
164
- self.lbCode.setText(_translate("Dialog", "Key code"))
165
- self.lbCodeHelp.setText(_translate("Dialog", "Key code is case sensitive. Type one character or a function key (F1, F2... F12)"))
166
- self.lb_name.setText(_translate("Dialog", "Set name"))
167
- self.lb_description.setText(_translate("Dialog", "Description"))
168
- self.lbType.setText(_translate("Dialog", "Modifier type"))
169
- self.cbType.setItemText(0, _translate("Dialog", "Single selection"))
170
- self.cbType.setItemText(1, _translate("Dialog", "Multiple selection"))
171
- self.cbType.setItemText(2, _translate("Dialog", "Numeric"))
172
- self.cbType.setItemText(3, _translate("Dialog", "Value from external data file"))
173
- self.lbValues.setText(_translate("Dialog", "Values"))
174
- self.pbMoveUp.setText(_translate("Dialog", "Move modifier up"))
175
- self.pbMoveDown.setText(_translate("Dialog", "Move modifier down"))
176
- self.pbRemoveModifier.setText(_translate("Dialog", "Remove modifier"))
177
- self.pb_sort_modifiers.setText(_translate("Dialog", "Sort modifiers"))
178
- self.pbAddSet.setText(_translate("Dialog", "Add set of modifiers"))
179
- self.pbRemoveSet.setText(_translate("Dialog", "Remove set of modifiers"))
180
- self.pbMoveSetLeft.setText(_translate("Dialog", "Move set left"))
181
- self.pbMoveSetRight.setText(_translate("Dialog", "Move set right"))
182
- self.pb_add_subjects.setText(_translate("Dialog", "Add subjects as modifiers"))
183
- self.pb_load_file.setText(_translate("Dialog", "Load modifiers from file"))
184
- self.pbCancel.setText(_translate("Dialog", "Cancel"))
185
- self.pbOK.setText(_translate("Dialog", "OK"))
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 PyQt5.QtCore import Qt
29
- from PyQt5.QtGui import QIcon
30
- from PyQt5.QtWidgets import (
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)