boris-behav-obs 9.7.7__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.

Potentially problematic release.


This version of boris-behav-obs might be problematic. Click here for more details.

Files changed (109) hide show
  1. boris/__init__.py +26 -0
  2. boris/__main__.py +25 -0
  3. boris/about.py +143 -0
  4. boris/add_modifier.py +635 -0
  5. boris/add_modifier_ui.py +303 -0
  6. boris/advanced_event_filtering.py +455 -0
  7. boris/analysis_plugins/__init__.py +0 -0
  8. boris/analysis_plugins/_latency.py +59 -0
  9. boris/analysis_plugins/irr_cohen_kappa.py +109 -0
  10. boris/analysis_plugins/irr_cohen_kappa_with_modifiers.py +112 -0
  11. boris/analysis_plugins/irr_weighted_cohen_kappa.py +157 -0
  12. boris/analysis_plugins/irr_weighted_cohen_kappa_with_modifiers.py +162 -0
  13. boris/analysis_plugins/list_of_dataframe_columns.py +22 -0
  14. boris/analysis_plugins/number_of_occurences.py +22 -0
  15. boris/analysis_plugins/number_of_occurences_by_independent_variable.py +54 -0
  16. boris/analysis_plugins/time_budget.py +61 -0
  17. boris/behav_coding_map_creator.py +1110 -0
  18. boris/behavior_binary_table.py +305 -0
  19. boris/behaviors_coding_map.py +239 -0
  20. boris/boris_cli.py +340 -0
  21. boris/cmd_arguments.py +49 -0
  22. boris/coding_pad.py +280 -0
  23. boris/config.py +785 -0
  24. boris/config_file.py +356 -0
  25. boris/connections.py +409 -0
  26. boris/converters.py +333 -0
  27. boris/converters_ui.py +225 -0
  28. boris/cooccurence.py +250 -0
  29. boris/core.py +5901 -0
  30. boris/core_qrc.py +15958 -0
  31. boris/core_ui.py +1107 -0
  32. boris/db_functions.py +324 -0
  33. boris/dev.py +134 -0
  34. boris/dialog.py +1108 -0
  35. boris/duration_widget.py +238 -0
  36. boris/edit_event.py +245 -0
  37. boris/edit_event_ui.py +233 -0
  38. boris/event_operations.py +1040 -0
  39. boris/events_cursor.py +61 -0
  40. boris/events_snapshots.py +596 -0
  41. boris/exclusion_matrix.py +141 -0
  42. boris/export_events.py +1006 -0
  43. boris/export_observation.py +1203 -0
  44. boris/external_processes.py +332 -0
  45. boris/geometric_measurement.py +941 -0
  46. boris/gui_utilities.py +135 -0
  47. boris/image_overlay.py +72 -0
  48. boris/import_observations.py +242 -0
  49. boris/ipc_mpv.py +325 -0
  50. boris/irr.py +634 -0
  51. boris/latency.py +244 -0
  52. boris/measurement_widget.py +161 -0
  53. boris/media_file.py +115 -0
  54. boris/menu_options.py +213 -0
  55. boris/modifier_coding_map_creator.py +1013 -0
  56. boris/modifiers_coding_map.py +157 -0
  57. boris/mpv.py +2016 -0
  58. boris/mpv2.py +2193 -0
  59. boris/observation.py +1453 -0
  60. boris/observation_operations.py +2538 -0
  61. boris/observation_ui.py +679 -0
  62. boris/observations_list.py +337 -0
  63. boris/otx_parser.py +442 -0
  64. boris/param_panel.py +201 -0
  65. boris/param_panel_ui.py +305 -0
  66. boris/player_dock_widget.py +198 -0
  67. boris/plot_data_module.py +536 -0
  68. boris/plot_events.py +634 -0
  69. boris/plot_events_rt.py +237 -0
  70. boris/plot_spectrogram_rt.py +316 -0
  71. boris/plot_waveform_rt.py +230 -0
  72. boris/plugins.py +431 -0
  73. boris/portion/__init__.py +31 -0
  74. boris/portion/const.py +95 -0
  75. boris/portion/dict.py +365 -0
  76. boris/portion/func.py +52 -0
  77. boris/portion/interval.py +581 -0
  78. boris/portion/io.py +181 -0
  79. boris/preferences.py +510 -0
  80. boris/preferences_ui.py +770 -0
  81. boris/project.py +2007 -0
  82. boris/project_functions.py +2041 -0
  83. boris/project_import_export.py +1096 -0
  84. boris/project_ui.py +794 -0
  85. boris/qrc_boris.py +10389 -0
  86. boris/qrc_boris5.py +2579 -0
  87. boris/select_modifiers.py +312 -0
  88. boris/select_observations.py +210 -0
  89. boris/select_subj_behav.py +286 -0
  90. boris/state_events.py +197 -0
  91. boris/subjects_pad.py +106 -0
  92. boris/synthetic_time_budget.py +290 -0
  93. boris/time_budget_functions.py +1136 -0
  94. boris/time_budget_widget.py +1039 -0
  95. boris/transitions.py +365 -0
  96. boris/utilities.py +1810 -0
  97. boris/version.py +24 -0
  98. boris/video_equalizer.py +159 -0
  99. boris/video_equalizer_ui.py +248 -0
  100. boris/video_operations.py +310 -0
  101. boris/view_df.py +104 -0
  102. boris/view_df_ui.py +75 -0
  103. boris/write_event.py +538 -0
  104. boris_behav_obs-9.7.7.dist-info/METADATA +139 -0
  105. boris_behav_obs-9.7.7.dist-info/RECORD +109 -0
  106. boris_behav_obs-9.7.7.dist-info/WHEEL +5 -0
  107. boris_behav_obs-9.7.7.dist-info/entry_points.txt +2 -0
  108. boris_behav_obs-9.7.7.dist-info/licenses/LICENSE.TXT +674 -0
  109. boris_behav_obs-9.7.7.dist-info/top_level.txt +1 -0
boris/config.py ADDED
@@ -0,0 +1,785 @@
1
+ """
2
+ BORIS
3
+ Behavioral Observation Research Interactive Software
4
+ Copyright 2012-2025 Olivier Friard
5
+
6
+ This file is part of BORIS.
7
+
8
+ BORIS is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 3 of the License, or
11
+ any later version.
12
+
13
+ BORIS is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
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/>.
20
+
21
+ """
22
+
23
+ programName: str = "BORIS"
24
+
25
+ # socket for MPV IPC mode
26
+ MPV_SOCKET = "/tmp/mpvsocket"
27
+
28
+
29
+ ETHOGRAM_REPOSITORY_URL = "https://www.boris.unito.it/static/ethograms"
30
+
31
+ project_format_version: str = "7.0"
32
+
33
+ SECONDS_PER_DAY: int = 86_400
34
+
35
+ # cutoff value for displaying HH:MM:SS.zzz or YYYY-mm-DD HH:MM:SS:ZZZ
36
+ HOUR_CUTOFF: int = 7 * 24
37
+ DATE_CUTOFF: int = HOUR_CUTOFF * 60 * 60 # 1 week
38
+
39
+ # cutoff for displaying time in HH:MM:SS.zzz format
40
+ SMART_TIME_CUTOFF_DEFAULT: int = 300
41
+
42
+ # minimal project version for handling observations from images
43
+ IMAGES_OBS_PROJECT_MIN_VERSION: tuple = (8, 6)
44
+
45
+ IMAGE_EXTENSIONS: tuple = ("*.jpg", "*.png", "*.jpeg", "*.tiff", "*.tif", "*.webp", "*.bmp")
46
+
47
+ CHECK_NEW_VERSION_DELAY: int = 15 * 24 * 60 * 60
48
+
49
+ N_PLAYER: int = 8
50
+
51
+ MAX_UNDO_QUEUE: int = 25
52
+
53
+ NA: str = "NA"
54
+
55
+ REALTIME_PLOT_CURSOR_COLOR: str = "red"
56
+
57
+ DARKER_DIFFERENCE = 5
58
+
59
+ CTRL_KEY: str = "Ctrl"
60
+ ALT_KEY: str = "Alt"
61
+
62
+ SPECTRO_TIMER: int = 500
63
+
64
+ function_keys = {
65
+ 16777264: "F1",
66
+ 16777265: "F2",
67
+ 16777266: "F3",
68
+ 16777267: "F4",
69
+ 16777268: "F5",
70
+ 16777269: "F6",
71
+ 16777270: "F7",
72
+ 16777271: "F8",
73
+ 16777272: "F9",
74
+ 16777273: "F10",
75
+ 16777274: "F11",
76
+ 16777275: "F12",
77
+ }
78
+
79
+ PROJECT_NAME = "project_name"
80
+ PROJECT_DATE = "project_date"
81
+ PROJECT_DESCRIPTION = "project_description"
82
+ PROJECT_VERSION = "project_format_version"
83
+
84
+ TIME_FORMAT = "time_format"
85
+
86
+ OBSERVATIONS = "observations"
87
+ EVENTS = "events"
88
+ TIME_OFFSET = "time offset"
89
+
90
+ CODING_MAP = "coding_map"
91
+ CODING_MAP_sp = "coding map" # space between words (no underscore)
92
+ BEHAVIORS_CODING_MAP = "behaviors_coding_map"
93
+ SUBJECTS = "subjects_conf"
94
+ ETHOGRAM = "behaviors_conf"
95
+ BEHAVIORAL_CATEGORIES = "behavioral_categories"
96
+ BEHAVIORAL_CATEGORIES_CONF = "behavioral_categories_config"
97
+ CONVERTERS = "converters"
98
+
99
+ OFFSET = "offset"
100
+
101
+ OBSERVATION_TIME_INTERVAL = "observation time interval"
102
+
103
+ SUBJECT_NAME = "name"
104
+
105
+ TIME_BUDGET_FORMAT = "time_budget_format"
106
+ """
107
+ COMPACT_TIME_BUDGET_FORMAT = "compact"
108
+ LONG_TIME_BUDGET_FORMAT = "long"
109
+ DEFAULT_TIME_BUDGET_FORMAT = LONG_TIME_BUDGET_FORMAT
110
+ """
111
+
112
+ DESCRIPTION = "description"
113
+
114
+ TIME_BIN_SIZE = "time bin size"
115
+
116
+ CODING_MAP_RESIZE_W = 640
117
+ CODING_MAP_RESIZE_H = 640
118
+
119
+ # playerType
120
+ LIVE = "LIVE"
121
+ MEDIA = "MEDIA"
122
+ IMAGES = "IMAGES"
123
+
124
+ VIEWER_MEDIA = "VIEWER_MEDIA"
125
+ VIEWER_LIVE = "VIEWER_LIVE"
126
+ VIEWER_IMAGES = "VIEWER_IMAGES"
127
+
128
+ VIEWERS = (VIEWER_MEDIA, VIEWER_LIVE, VIEWER_IMAGES)
129
+
130
+ POINT_EVENT_PLOT_DURATION = 0.010
131
+ POINT_EVENT_PLOT_COLOR = "black"
132
+
133
+ CHAR_FORBIDDEN_IN_MODIFIERS = "(|),`~"
134
+
135
+ FAST_FORWARD_DEFAULT_VALUE: float = 10.0
136
+
137
+ ADAPT_FAST_JUMP = "adapt_fast_jump"
138
+ ADAPT_FAST_JUMP_DEFAULT = False
139
+
140
+ TIME = "time"
141
+ BEHAVIOR_CODE = "code"
142
+ SUBJECT = "subject"
143
+ MODIFIER = "modifier"
144
+ COMMENT = "comment"
145
+ BEHAVIOR_KEY = "key"
146
+ SUBJECT_KEY = "key"
147
+ BEHAVIOR_CATEGORY = "category"
148
+
149
+
150
+ subjectsFields = [SUBJECT_KEY, SUBJECT_NAME, DESCRIPTION]
151
+
152
+ UNPAIRED = "UNPAIRED"
153
+ DISPLAY_SUBTITLES = "display_subtitles"
154
+ CHECK_PROJECT_INTEGRITY = "check_project_integrity"
155
+
156
+
157
+ YES = "Yes"
158
+ NO = "No"
159
+ CANCEL = "Cancel"
160
+ IGNORE = "Ignore"
161
+ APPEND = "Append"
162
+ CLOSE = "Close"
163
+ REPLACE = "Replace"
164
+ REMOVE = "Remove"
165
+ SAVE = "Save"
166
+ DISCARD = "Discard"
167
+ OK = "OK"
168
+ OVERWRITE = "Overwrite"
169
+ OVERWRITE_ALL = "Overwrite all"
170
+ SKIP = "Skip"
171
+ SKIP_ALL = "Skip all"
172
+
173
+ NO_FOCAL_SUBJECT = "No focal subject"
174
+
175
+ TYPE = "type"
176
+ FILE = "file"
177
+ COLOR = "color"
178
+ DIRECTORIES_LIST = "directories_list"
179
+
180
+ SAVE_DATASET = 32
181
+
182
+ PLOT_DATA = "plot_data"
183
+
184
+ PLOT_DATA_FILEPATH_IDX = 0
185
+ PLOT_DATA_COLUMNS_IDX = 1
186
+ PLOT_DATA_PLOTTITLE_IDX = 2
187
+ PLOT_DATA_VARIABLENAME_IDX = 3
188
+ PLOT_DATA_CONVERTERS_IDX = 4
189
+ PLOT_DATA_TIMEINTERVAL_IDX = 5
190
+ PLOT_DATA_TIMEOFFSET_IDX = 6
191
+ PLOT_DATA_SUBSTRACT1STVALUE_IDX = 7
192
+ PLOT_DATA_PLOTCOLOR_IDX = 8
193
+
194
+ DATA_PLOT_FIELDS = {
195
+ PLOT_DATA_FILEPATH_IDX: "file_path",
196
+ PLOT_DATA_COLUMNS_IDX: "columns",
197
+ PLOT_DATA_PLOTTITLE_IDX: "title",
198
+ PLOT_DATA_VARIABLENAME_IDX: "variable_name",
199
+ PLOT_DATA_CONVERTERS_IDX: "converters",
200
+ PLOT_DATA_TIMEINTERVAL_IDX: "time_interval",
201
+ PLOT_DATA_TIMEOFFSET_IDX: "time_offset",
202
+ PLOT_DATA_SUBSTRACT1STVALUE_IDX: "substract_first_value",
203
+ PLOT_DATA_PLOTCOLOR_IDX: "color",
204
+ }
205
+ DATA_PLOT_STYLES = ["b-", "r-", "g-", "bo", "ro", "go"]
206
+
207
+
208
+ FILE_PATH = "file_path"
209
+
210
+ IMAGE_INDEX = "image index"
211
+ IMAGE_PATH = "image path"
212
+ FRAME_INDEX = "frame index"
213
+
214
+ ZOOM_LEVEL = "zoom level"
215
+ PAN_X = "pan-x"
216
+ PAN_Y = "pan-y"
217
+ ROTATION_ANGLE = "rotation angle"
218
+ DISPLAY_MEDIA_SUBTITLES = "display subtitles"
219
+ OVERLAY = "video overlay"
220
+
221
+
222
+ USE_EXIF_DATE = "use_exif_date"
223
+ SUBSTRACT_FIRST_EXIF_DATE = "substract_first_exif_date"
224
+ TIME_LAPSE = "time_lapse_delay"
225
+
226
+
227
+ # fields for event configuration
228
+
229
+ ETHOGRAM_TABLE_COLUMNS: dict = {
230
+ 0: "key",
231
+ 1: "code",
232
+ 2: "type",
233
+ 3: "description",
234
+ 4: "color",
235
+ 5: "category",
236
+ 6: "modifiers",
237
+ 7: "excluded",
238
+ }
239
+
240
+ # fields in ethogram table from project window
241
+ behavioursFields: dict = {
242
+ "type": 0,
243
+ "key": 1,
244
+ "code": 2,
245
+ "description": 3,
246
+ "color": 4,
247
+ "category": 5,
248
+ "modifiers": 6,
249
+ "excluded": 7,
250
+ "coding map": 8,
251
+ }
252
+ ETHOGRAM_EDITABLE_FIELDS: tuple = ("key", "code", "description")
253
+
254
+ PROJECT_BEHAVIORS_KEY_FIELD_IDX = 1
255
+ PROJECT_BEHAVIORS_CODE_FIELD_IDX = 2
256
+
257
+ MEDIA_FILE_PATH_IDX = 2
258
+ HAS_AUDIO_IDX = 6
259
+
260
+ STATE_EVENT = "State event"
261
+ STATE_EVENT_WITH_CODING_MAP = "State event with coding map"
262
+
263
+ STATE_EVENT_TYPES = [STATE_EVENT, STATE_EVENT_WITH_CODING_MAP]
264
+
265
+ POINT_EVENT = "Point event"
266
+ POINT_EVENT_WITH_CODING_MAP = "Point event with coding map"
267
+
268
+ POINT_EVENT_TYPES = [POINT_EVENT, POINT_EVENT_WITH_CODING_MAP]
269
+
270
+ BEHAVIOR_TYPES = [
271
+ POINT_EVENT,
272
+ STATE_EVENT,
273
+ POINT_EVENT_WITH_CODING_MAP,
274
+ STATE_EVENT_WITH_CODING_MAP,
275
+ ]
276
+
277
+ DEFAULT_BEHAVIOR_TYPE = "Point event"
278
+
279
+ MEDIA_TW_EVENTS_FIELDS_DEFAULT = ("time", FRAME_INDEX, "subject", "code", "type", "modifier", "comment")
280
+
281
+
282
+ # fields for events tablewidget
283
+ MEDIA_TW_EVENTS_FIELDS = ("time", FRAME_INDEX, "subject", "code", "type", "modifier", "comment")
284
+ # MEDIA_TW_EVENTS_FIELDS = ("time", "subject", "code", "type", "modifier", "comment")
285
+ LIVE_TW_EVENTS_FIELDS = ("time", "subject", "code", "type", "modifier", "comment")
286
+ IMAGES_TW_EVENTS_FIELDS = ("time", "subject", "code", "type", "modifier", "comment", IMAGE_INDEX, IMAGE_PATH)
287
+
288
+ TW_EVENTS_FIELDS = {
289
+ MEDIA: MEDIA_TW_EVENTS_FIELDS,
290
+ LIVE: LIVE_TW_EVENTS_FIELDS,
291
+ VIEWER_MEDIA: MEDIA_TW_EVENTS_FIELDS,
292
+ VIEWER_LIVE: LIVE_TW_EVENTS_FIELDS,
293
+ IMAGES: IMAGES_TW_EVENTS_FIELDS,
294
+ VIEWER_IMAGES: IMAGES_TW_EVENTS_FIELDS,
295
+ }
296
+
297
+ # create dictionary index
298
+ TW_OBS_FIELD = {}
299
+ for observation_type in TW_EVENTS_FIELDS:
300
+ TW_OBS_FIELD[observation_type] = {}
301
+ for idx, field in enumerate(TW_EVENTS_FIELDS[observation_type]):
302
+ TW_OBS_FIELD[observation_type][field] = idx
303
+
304
+
305
+ # fields for project events list
306
+ MEDIA_PJ_EVENTS_FIELDS = (TIME, "subject", "code", "modifier", "comment", FRAME_INDEX)
307
+ LIVE_PJ_EVENTS_FIELDS = (TIME, "subject", "code", "modifier", "comment")
308
+ IMAGES_PJ_EVENTS_FIELDS = (TIME, "subject", "code", "modifier", "comment", IMAGE_INDEX, IMAGE_PATH)
309
+
310
+ PJ_EVENTS_FIELDS = {
311
+ MEDIA: MEDIA_PJ_EVENTS_FIELDS,
312
+ VIEWER_MEDIA: MEDIA_PJ_EVENTS_FIELDS,
313
+ LIVE: LIVE_PJ_EVENTS_FIELDS,
314
+ VIEWER_LIVE: LIVE_PJ_EVENTS_FIELDS,
315
+ IMAGES: IMAGES_PJ_EVENTS_FIELDS,
316
+ VIEWER_IMAGES: IMAGES_PJ_EVENTS_FIELDS,
317
+ }
318
+
319
+
320
+ PJ_OBS_FIELDS = {}
321
+ for observation_type in PJ_EVENTS_FIELDS:
322
+ PJ_OBS_FIELDS[observation_type] = {}
323
+ for idx, field in enumerate(PJ_EVENTS_FIELDS[observation_type]):
324
+ PJ_OBS_FIELDS[observation_type][field] = idx
325
+
326
+
327
+ # fields for independent variable definition
328
+ tw_indVarFields = ["label", "description", "type", "default value", "possible values"]
329
+
330
+
331
+ EVENT_TIME_FIELD_IDX = 0
332
+ EVENT_SUBJECT_FIELD_IDX = 1
333
+ EVENT_BEHAVIOR_FIELD_IDX = 2
334
+ EVENT_MODIFIER_FIELD_IDX = 3
335
+ EVENT_COMMENT_FIELD_IDX = 4
336
+ EVENT_STATUS_FIELD_IDX = -1
337
+ # EVENT_IMAGEIDX_FIELD_IDX = 6
338
+ # EVENT_IMAGEPATH_FIELD_IDX = 7
339
+
340
+
341
+ BEHAV_CODING_MAP_FIELDS = ["name", "Behavior codes"]
342
+
343
+ # characters not allowed in Excel sheet name
344
+ EXCEL_FORBIDDEN_CHARACTERS: str = r"\/*[]:?"
345
+
346
+
347
+ # indexes of project window
348
+ MEDIA_TAB_IDX = 0
349
+ LIVE_TAB_IDX = 1
350
+
351
+
352
+ HHMMSS = "hh:mm:ss"
353
+ HHMMSSZZZ = "hh:mm:ss.zzz"
354
+ S = "s"
355
+
356
+ START_FROM_CURRENT_TIME = "start_from_current_time"
357
+ START_FROM_CURRENT_EPOCH_TIME = "start_from_current_epoch_time"
358
+
359
+ SCAN_SAMPLING_TIME = "scan_sampling_time"
360
+
361
+ POINT_OBJECT = "Point"
362
+ SEGMENT_OBJECT = "Segment"
363
+ ANGLE_OBJECT = "Angle"
364
+ ORIENTED_ANGLE_OBJECT = "Oriented angle"
365
+ POLYGON_OBJECT = "Polygon"
366
+ POLYLINE_OBJECT = "Polyline"
367
+
368
+
369
+ NEW = "new"
370
+ LIST = "list"
371
+ EDIT = "edit"
372
+ OPEN = "open"
373
+ VIEW = "view"
374
+ OBS_START = "start"
375
+ SELECT = "select"
376
+ SINGLE = "single"
377
+ MULTIPLE = "multiple"
378
+
379
+
380
+ SELECT1 = "select1"
381
+
382
+ FILTERED_BEHAVIORS = "filtered behaviors"
383
+
384
+ SELECTED_BEHAVIORS = "selected behaviors"
385
+ SELECTED_SUBJECTS = "selected subjects"
386
+ INCLUDE_MODIFIERS = "include modifiers"
387
+ EXCLUDE_BEHAVIORS = "exclude behaviors"
388
+ EXCLUDE_NON_CODED_MODIFIERS = "exclude_non_coded_modifiers"
389
+ EXCLUDED_BEHAVIORS = "excluded behaviors"
390
+ TIME_INTERVAL = "time"
391
+ START_TIME = "start time"
392
+ END_TIME = "end time"
393
+
394
+ # indep variables
395
+ NUMERIC = "numeric"
396
+ NUMERIC_idx = 0
397
+ TEXT = "text"
398
+ TEXT_idx = 1
399
+ SET_OF_VALUES = "value from set"
400
+ SET_OF_VALUES_idx = 2
401
+ TIMESTAMP = "timestamp"
402
+ TIMESTAMP_idx = 3
403
+
404
+ TIME_FULL_OBS = "full obs"
405
+ TIME_EVENTS = "limit to events"
406
+ TIME_OBS_INTERVAL = "interval of observation"
407
+ TIME_ARBITRARY_INTERVAL = "time interval"
408
+
409
+ AVAILABLE_INDEP_VAR_TYPES = [NUMERIC, TEXT, SET_OF_VALUES, TIMESTAMP]
410
+
411
+ INDEPENDENT_VARIABLES = "independent_variables"
412
+ OBSERVATIONS = "observations"
413
+
414
+ CLOSE_BEHAVIORS_BETWEEN_VIDEOS = "close_behaviors_between_videos"
415
+
416
+ # MPV hardware decode
417
+ MPV_HWDEC = "mpv_hwdec"
418
+ MPV_HWDEC_NO = "no"
419
+ MPV_HWDEC_AUTO = "auto"
420
+ MPV_HWDEC_AUTOSAFE = "auto-safe"
421
+ MPV_HWDEC_OPTIONS = (MPV_HWDEC_AUTO, MPV_HWDEC_AUTOSAFE, MPV_HWDEC_NO)
422
+ MPV_HWDEC_DEFAULT_VALUE = MPV_HWDEC_AUTO
423
+
424
+ # frame step size (disabled)
425
+ # FRAME_STEP_SIZE: str = "frame_step_size"
426
+ # FRAME_STEP_SIZE_DEFAULT_VALUE: int = 1
427
+
428
+ ANALYSIS_PLUGINS = "analysis_plugins"
429
+ EXCLUDED_PLUGINS = "excluded_plugins"
430
+ PERSONAL_PLUGINS_DIR = "personal_plugins_dir"
431
+
432
+ PROJECT_FILE_INDENTATION = "project file indentation"
433
+ PROJECT_FILE_INDENTATION_COMBO_OPTIONS = ("None", "Newline", "Tab", "2 spaces", "4 spaces")
434
+ PROJECT_FILE_INDENTATION_OPTIONS = (None, 0, "\t", 2, 4)
435
+ PROJECT_FILE_INDENTATION_DEFAULT_VALUE = None
436
+
437
+ TOOLBAR_ICON_SIZE = "toolbar icon size"
438
+ DEFAULT_TOOLBAR_ICON_SIZE_VALUE = 24
439
+
440
+
441
+ VIDEO_VIEWER = 0
442
+ PICTURE_VIEWER = 1
443
+
444
+ SAVE_FRAMES = "save_frames"
445
+ MEMORY_FOR_FRAMES = "memory_for_frames"
446
+ DEFAULT_MEMORY_FOR_FRAMES = 80 # % total memory
447
+ DISK = "disk"
448
+ MEMORY = "memory"
449
+ DEFAULT_FRAME_MODE = DISK
450
+
451
+ MEDIA_FILE_INFO = "media_file_info"
452
+ MEDIA_INFO = "media_info"
453
+ LENGTH = "length"
454
+ FPS = "fps"
455
+ HAS_AUDIO = "hasAudio"
456
+ HAS_VIDEO = "hasVideo"
457
+ MEDIA_CREATION_TIME = "media_creation_time"
458
+
459
+ STATE = "STATE"
460
+ POINT = "POINT"
461
+
462
+ START = "START"
463
+ STOP = "STOP"
464
+
465
+ PLAYER1 = "1"
466
+ PLAYER2 = "2"
467
+ ALL_PLAYERS = [str(x + 1) for x in range(N_PLAYER)]
468
+
469
+ VISUALIZE_SPECTROGRAM = "visualize_spectrogram"
470
+ VISUALIZE_WAVEFORM = "visualize_waveform"
471
+ MEDIA_CREATION_DATE_AS_OFFSET = "media_creation_date_as_offset"
472
+
473
+ MEDIA_SCAN_SAMPLING_DURATION = "media_scan_sampling_duration"
474
+ IMAGE_DISPLAY_DURATION = "image_display_duration"
475
+
476
+ # plot type
477
+ WAVEFORM_PLOT = "waveform"
478
+ SPECTROGRAM_PLOT = "spectrogram"
479
+ EVENTS_PLOT = "plot_events"
480
+
481
+ PLAYING = "playing"
482
+ PAUSED = "paused"
483
+ STOPPED = "stopped"
484
+
485
+ POINT_EVENT_ST_DURATION = 0.5
486
+
487
+ VIDEO_TAB = 0
488
+ FRAME_TAB = 1
489
+
490
+ SLIDER_MAXIMUM = 1000
491
+
492
+ FRAME_DEFAULT_CACHE_SIZE = 1
493
+
494
+ EXCLUDED = "excluded"
495
+
496
+ # modifiers
497
+ MODIFIERS = "modifiers"
498
+ SINGLE_SELECTION = 0
499
+ MULTI_SELECTION = 1
500
+ NUMERIC_MODIFIER = 2
501
+ EXTERNAL_DATA_MODIFIER = 3
502
+
503
+ MODIFIERS_STR = {
504
+ SINGLE_SELECTION: "Single item selection",
505
+ MULTI_SELECTION: "Multiple items selection",
506
+ NUMERIC_MODIFIER: "Numeric",
507
+ EXTERNAL_DATA_MODIFIER: "Value from external data file",
508
+ }
509
+
510
+ # colors
511
+ subtitlesColors = [
512
+ "cyan",
513
+ "red",
514
+ "blue",
515
+ "yellow",
516
+ "fuchsia",
517
+ "orange",
518
+ "lime",
519
+ "green",
520
+ ]
521
+
522
+ CATEGORY_COLORS_LIST = [
523
+ "#FF96CC",
524
+ "#96FF9C",
525
+ "#CCFFFE",
526
+ "#EEFF70",
527
+ "#FF4F64",
528
+ "#F8BF15",
529
+ "#3DC7AD",
530
+ ]
531
+
532
+ CODING_PAD_CONFIG = "coding pad configuration"
533
+ CODING_PAD_GEOMETRY = "coding pad geometry"
534
+ NO_COLOR_CODING_PAD = "#777777"
535
+
536
+ SPECTROGRAM_COLOR_MAPS = ["viridis", "inferno", "plasma", "magma", "gray", "YlOrRd"]
537
+ SPECTROGRAM_DEFAULT_COLOR_MAP = "viridis"
538
+ SPECTROGRAM_DEFAULT_TIME_INTERVAL = 10
539
+ SPECTROGRAM_WINDOW_TYPE = "SPECTROGRAM_WINDOW_TYPE"
540
+ SPECTROGRAM_DEFAULT_WINDOW_TYPE = "hanning"
541
+ SPECTROGRAM_NFFT = "SPECTROGRAM_NFFT"
542
+ SPECTROGRAM_DEFAULT_NFFT = "1024"
543
+ SPECTROGRAM_NOVERLAP = "SPECTROGRAM_NOVERLAP"
544
+ SPECTROGRAM_DEFAULT_NOVERLAP = 900
545
+ SPECTROGRAM_VMIN = "SPECTROGRAM_VMIN"
546
+ SPECTROGRAM_DEFAULT_VMIN = -100
547
+ SPECTROGRAM_VMAX = "SPECTROGRAM_VMAX"
548
+ SPECTROGRAM_DEFAULT_VMAX = -20
549
+
550
+ # see matplotlib.colors.cnames.keys()
551
+ # https://xkcd.com/color/rgb/
552
+
553
+ # sage colors are no more available
554
+ # darksage #598556
555
+ # lightsage #bcecac
556
+ # sage #87ae73
557
+ ACTIVE_MEASUREMENTS_COLOR = "lime"
558
+ PASSIVE_MEASUREMENTS_COLOR = "red"
559
+
560
+ # see matplotlib for color name
561
+ BEHAVIORS_PLOT_COLORS = [
562
+ "tab:blue",
563
+ "tab:orange",
564
+ "tab:green",
565
+ "tab:red",
566
+ "tab:purple",
567
+ "tab:brown",
568
+ "tab:pink",
569
+ "tab:gray",
570
+ "tab:olive",
571
+ "tab:cyan",
572
+ "blue",
573
+ "green",
574
+ "red",
575
+ "cyan",
576
+ "magenta",
577
+ "yellow",
578
+ "lime",
579
+ "darksalmon",
580
+ "purple",
581
+ "orange",
582
+ "maroon",
583
+ "silver",
584
+ "slateblue",
585
+ "hotpink",
586
+ "steelblue",
587
+ "darkgoldenrod",
588
+ "aqua",
589
+ "aquamarine",
590
+ "beige",
591
+ "bisque",
592
+ "black",
593
+ "blanchedalmond",
594
+ "blueviolet",
595
+ "brown",
596
+ "burlywood",
597
+ "cadetblue",
598
+ "chartreuse",
599
+ "chocolate",
600
+ "coral",
601
+ "cornflowerblue",
602
+ "cornsilk",
603
+ "crimson",
604
+ "darkblue",
605
+ "darkcyan",
606
+ "darkgreen",
607
+ "darkgrey",
608
+ "darkkhaki",
609
+ "darkmagenta",
610
+ "darkolivegreen",
611
+ "darkorange",
612
+ "darkorchid",
613
+ "darkred",
614
+ "#598556",
615
+ "darkseagreen",
616
+ "darkslateblue",
617
+ "darkslategray",
618
+ "darkslategrey",
619
+ "darkturquoise",
620
+ "darkviolet",
621
+ "deeppink",
622
+ "deepskyblue",
623
+ "dimgray",
624
+ "dimgrey",
625
+ "dodgerblue",
626
+ "firebrick",
627
+ "floralwhite",
628
+ "forestgreen",
629
+ "fuchsia",
630
+ "gainsboro",
631
+ "gold",
632
+ "goldenrod",
633
+ "gray",
634
+ "greenyellow",
635
+ "grey",
636
+ "honeydew",
637
+ "indianred",
638
+ "indigo",
639
+ "khaki",
640
+ "lawngreen",
641
+ "lemonchiffon",
642
+ "lightblue",
643
+ "lightcoral",
644
+ "lightgoldenrodyellow",
645
+ "lightgray",
646
+ "lightgreen",
647
+ "lightgrey",
648
+ "lightpink",
649
+ "#bcecac",
650
+ "lightsalmon",
651
+ "lightseagreen",
652
+ "lightskyblue",
653
+ "lightslategray",
654
+ "lightslategrey",
655
+ "lightsteelblue",
656
+ "lightyellow",
657
+ "limegreen",
658
+ "linen",
659
+ "mediumaquamarine",
660
+ "mediumblue",
661
+ "mediumorchid",
662
+ "mediumpurple",
663
+ "mediumseagreen",
664
+ "mediumslateblue",
665
+ "mediumspringgreen",
666
+ "mediumturquoise",
667
+ "mediumvioletred",
668
+ "midnightblue",
669
+ "mintcream",
670
+ "mistyrose",
671
+ "moccasin",
672
+ "navajowhite",
673
+ "navy",
674
+ "oldlace",
675
+ "olive",
676
+ "olivedrab",
677
+ "orangered",
678
+ "orchid",
679
+ "palegoldenrod",
680
+ "palegreen",
681
+ "paleturquoise",
682
+ "palevioletred",
683
+ "papayawhip",
684
+ "peachpuff",
685
+ "peru",
686
+ "pink",
687
+ "plum",
688
+ "powderblue",
689
+ "rosybrown",
690
+ "royalblue",
691
+ "saddlebrown",
692
+ "#87ae73",
693
+ "salmon",
694
+ "sandybrown",
695
+ "seagreen",
696
+ "seashell",
697
+ "sienna",
698
+ "skyblue",
699
+ "slategray",
700
+ "slategrey",
701
+ "springgreen",
702
+ "tan",
703
+ "teal",
704
+ "thistle",
705
+ "tomato",
706
+ "turquoise",
707
+ "violet",
708
+ "wheat",
709
+ "yellowgreen",
710
+ "darkgray",
711
+ ]
712
+
713
+ EMPTY_PROJECT = {
714
+ TIME_FORMAT: HHMMSS,
715
+ PROJECT_DATE: "",
716
+ PROJECT_NAME: "",
717
+ PROJECT_DESCRIPTION: "",
718
+ PROJECT_VERSION: project_format_version,
719
+ SUBJECTS: {},
720
+ ETHOGRAM: {},
721
+ OBSERVATIONS: {},
722
+ BEHAVIORAL_CATEGORIES: [],
723
+ BEHAVIORAL_CATEGORIES_CONF: {},
724
+ INDEPENDENT_VARIABLES: {},
725
+ CODING_MAP: {},
726
+ BEHAVIORS_CODING_MAP: [],
727
+ CONVERTERS: {},
728
+ }
729
+
730
+ INIT_PARAM = {
731
+ DISPLAY_SUBTITLES: False,
732
+ SAVE_FRAMES: DISK,
733
+ MEMORY_FOR_FRAMES: DEFAULT_MEMORY_FOR_FRAMES,
734
+ ADAPT_FAST_JUMP: ADAPT_FAST_JUMP_DEFAULT,
735
+ # TIME_BUDGET_FORMAT: DEFAULT_TIME_BUDGET_FORMAT,
736
+ MPV_HWDEC: MPV_HWDEC_DEFAULT_VALUE,
737
+ PROJECT_FILE_INDENTATION: PROJECT_FILE_INDENTATION_DEFAULT_VALUE,
738
+ f"{MEDIA} tw fields": MEDIA_TW_EVENTS_FIELDS_DEFAULT,
739
+ # FRAME_STEP_SIZE: FRAME_STEP_SIZE_DEFAULT_VALUE,
740
+ }
741
+
742
+ SDIS_EXT = "sds"
743
+ TBS_EXT = "tbs"
744
+ TSV_EXT = "tsv"
745
+ CSV_EXT = "csv"
746
+ RDS_EXT = "rds"
747
+ PANDAS_DF_EXT = "pkl"
748
+ HTML_EXT = "html"
749
+ SQL_EXT = "sql"
750
+ ODS_EXT = "ods"
751
+ XLS_EXT = "xls"
752
+ XLSX_EXT = "xlsx"
753
+
754
+ # Output format
755
+ TSV = "Tab Separated Values (*.tsv)"
756
+ CSV = "Comma Separated Values (*.csv)"
757
+ ODS = "OpenDocument Spreadsheet ODS (*.ods)"
758
+ ODS_WB = "OpenDocument Workbook (*.ods)"
759
+ XLSX = "Microsoft Excel Spreadsheet XLSX (*.xlsx)"
760
+ XLSX_WB = "Microsoft Excel Workbook (*.xlsx)"
761
+ XLS = "Legacy Microsoft Excel Spreadsheet XLS (*.xls)"
762
+ HTML = "HTML (*.html)"
763
+ PANDAS_DF = "Pandas DataFrame (*.pkl)"
764
+ RDS = "R dataframe (*.rds)"
765
+ SQL = "SQL dump file (*.sql)"
766
+ SDIS = "SDIS (*.sds)"
767
+ TBS = "Timed Behavioral Sequences (*.tbs)"
768
+ TEXT_FILE = "Text file"
769
+
770
+ FILE_NAME_SUFFIX = {
771
+ TSV: TSV_EXT,
772
+ CSV: CSV_EXT,
773
+ ODS: ODS_EXT,
774
+ ODS_WB: ODS_EXT,
775
+ XLSX: XLSX_EXT,
776
+ XLSX_WB: XLSX_EXT,
777
+ XLS: XLS_EXT,
778
+ HTML: HTML_EXT,
779
+ PANDAS_DF: PANDAS_DF_EXT,
780
+ RDS: RDS_EXT,
781
+ SQL: SQL_EXT,
782
+ SDIS: SDIS_EXT,
783
+ TBS: TBS_EXT,
784
+ TEXT_FILE: "cli",
785
+ }