boris-behav-obs 8.9.16__py3-none-any.whl → 9.7.6__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 (129) hide show
  1. boris/__init__.py +1 -1
  2. boris/__main__.py +1 -1
  3. boris/about.py +36 -39
  4. boris/add_modifier.py +122 -109
  5. boris/add_modifier_ui.py +239 -135
  6. boris/advanced_event_filtering.py +81 -45
  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 +228 -229
  18. boris/behavior_binary_table.py +33 -50
  19. boris/behaviors_coding_map.py +17 -18
  20. boris/boris_cli.py +6 -25
  21. boris/cmd_arguments.py +12 -1
  22. boris/coding_pad.py +42 -49
  23. boris/config.py +161 -77
  24. boris/config_file.py +63 -83
  25. boris/connections.py +112 -57
  26. boris/converters.py +13 -37
  27. boris/converters_ui.py +187 -110
  28. boris/cooccurence.py +250 -0
  29. boris/core.py +2511 -1824
  30. boris/core_qrc.py +15895 -10185
  31. boris/core_ui.py +946 -792
  32. boris/db_functions.py +21 -41
  33. boris/dev.py +134 -0
  34. boris/dialog.py +505 -244
  35. boris/duration_widget.py +15 -20
  36. boris/edit_event.py +84 -28
  37. boris/edit_event_ui.py +214 -78
  38. boris/event_operations.py +517 -415
  39. boris/events_cursor.py +25 -17
  40. boris/events_snapshots.py +36 -82
  41. boris/exclusion_matrix.py +4 -9
  42. boris/export_events.py +213 -583
  43. boris/export_observation.py +98 -611
  44. boris/external_processes.py +156 -97
  45. boris/geometric_measurement.py +652 -287
  46. boris/gui_utilities.py +91 -14
  47. boris/image_overlay.py +9 -9
  48. boris/import_observations.py +190 -98
  49. boris/ipc_mpv.py +325 -0
  50. boris/irr.py +26 -63
  51. boris/latency.py +34 -25
  52. boris/measurement_widget.py +14 -18
  53. boris/media_file.py +52 -84
  54. boris/menu_options.py +17 -6
  55. boris/modifier_coding_map_creator.py +1013 -0
  56. boris/modifiers_coding_map.py +7 -9
  57. boris/mpv.py +1 -0
  58. boris/mpv2.py +732 -705
  59. boris/observation.py +655 -310
  60. boris/observation_operations.py +1036 -404
  61. boris/observation_ui.py +584 -356
  62. boris/observations_list.py +71 -53
  63. boris/otx_parser.py +74 -80
  64. boris/param_panel.py +31 -16
  65. boris/param_panel_ui.py +254 -138
  66. boris/player_dock_widget.py +90 -60
  67. boris/plot_data_module.py +43 -46
  68. boris/plot_events.py +127 -90
  69. boris/plot_events_rt.py +17 -31
  70. boris/plot_spectrogram_rt.py +95 -30
  71. boris/plot_waveform_rt.py +32 -21
  72. boris/plugins.py +431 -0
  73. boris/portion/__init__.py +18 -8
  74. boris/portion/const.py +35 -18
  75. boris/portion/dict.py +5 -5
  76. boris/portion/func.py +2 -2
  77. boris/portion/interval.py +21 -41
  78. boris/portion/io.py +41 -32
  79. boris/preferences.py +306 -83
  80. boris/preferences_ui.py +685 -228
  81. boris/project.py +448 -293
  82. boris/project_functions.py +689 -254
  83. boris/project_import_export.py +213 -222
  84. boris/project_ui.py +674 -438
  85. boris/qrc_boris.py +6 -3
  86. boris/qrc_boris5.py +6 -3
  87. boris/select_modifiers.py +74 -48
  88. boris/select_observations.py +20 -199
  89. boris/select_subj_behav.py +67 -39
  90. boris/state_events.py +53 -37
  91. boris/subjects_pad.py +6 -9
  92. boris/synthetic_time_budget.py +45 -28
  93. boris/time_budget_functions.py +171 -171
  94. boris/time_budget_widget.py +84 -114
  95. boris/transitions.py +41 -47
  96. boris/utilities.py +766 -266
  97. boris/version.py +3 -3
  98. boris/video_equalizer.py +16 -14
  99. boris/video_equalizer_ui.py +199 -130
  100. boris/video_operations.py +125 -28
  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.6.dist-info/METADATA +139 -0
  105. boris_behav_obs-9.7.6.dist-info/RECORD +109 -0
  106. {boris_behav_obs-8.9.16.dist-info → boris_behav_obs-9.7.6.dist-info}/WHEEL +1 -1
  107. boris_behav_obs-9.7.6.dist-info/entry_points.txt +2 -0
  108. boris/README.TXT +0 -22
  109. boris/add_modifier.ui +0 -323
  110. boris/boris_ui.py +0 -886
  111. boris/converters.ui +0 -289
  112. boris/core.qrc +0 -35
  113. boris/core.ui +0 -1543
  114. boris/edit_event.ui +0 -175
  115. boris/icons/logo_eye.ico +0 -0
  116. boris/map_creator.py +0 -850
  117. boris/observation.ui +0 -773
  118. boris/param_panel.ui +0 -379
  119. boris/preferences.ui +0 -537
  120. boris/project.ui +0 -1069
  121. boris/project_server.py +0 -236
  122. boris/vlc.py +0 -10343
  123. boris/vlc_local.py +0 -90
  124. boris_behav_obs-8.9.16.dist-info/LICENSE.TXT +0 -674
  125. boris_behav_obs-8.9.16.dist-info/METADATA +0 -129
  126. boris_behav_obs-8.9.16.dist-info/RECORD +0 -108
  127. boris_behav_obs-8.9.16.dist-info/entry_points.txt +0 -2
  128. {boris → boris_behav_obs-9.7.6.dist-info/licenses}/LICENSE.TXT +0 -0
  129. {boris_behav_obs-8.9.16.dist-info → boris_behav_obs-9.7.6.dist-info}/top_level.txt +0 -0
boris/config.py CHANGED
@@ -1,7 +1,7 @@
1
1
  """
2
2
  BORIS
3
3
  Behavioral Observation Research Interactive Software
4
- Copyright 2012-2023 Olivier Friard
4
+ Copyright 2012-2025 Olivier Friard
5
5
 
6
6
  This file is part of BORIS.
7
7
 
@@ -22,12 +22,27 @@ This file is part of BORIS.
22
22
 
23
23
  programName: str = "BORIS"
24
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
+
25
31
  project_format_version: str = "7.0"
26
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
+
27
42
  # minimal project version for handling observations from images
28
43
  IMAGES_OBS_PROJECT_MIN_VERSION: tuple = (8, 6)
29
44
 
30
- IMAGE_EXTENSIONS: tuple = ("*.jpg", "*.png", "*.jpeg")
45
+ IMAGE_EXTENSIONS: tuple = ("*.jpg", "*.png", "*.jpeg", "*.tiff", "*.tif", "*.webp", "*.bmp")
31
46
 
32
47
  CHECK_NEW_VERSION_DELAY: int = 15 * 24 * 60 * 60
33
48
 
@@ -37,9 +52,14 @@ MAX_UNDO_QUEUE: int = 25
37
52
 
38
53
  NA: str = "NA"
39
54
 
40
- CTRL_KEY = "Ctrl"
55
+ REALTIME_PLOT_CURSOR_COLOR: str = "red"
56
+
57
+ DARKER_DIFFERENCE = 5
41
58
 
42
- SPECTRO_TIMER = 500
59
+ CTRL_KEY: str = "Ctrl"
60
+ ALT_KEY: str = "Alt"
61
+
62
+ SPECTRO_TIMER: int = 500
43
63
 
44
64
  function_keys = {
45
65
  16777264: "F1",
@@ -68,10 +88,12 @@ EVENTS = "events"
68
88
  TIME_OFFSET = "time offset"
69
89
 
70
90
  CODING_MAP = "coding_map"
91
+ CODING_MAP_sp = "coding map" # space between words (no underscore)
71
92
  BEHAVIORS_CODING_MAP = "behaviors_coding_map"
72
93
  SUBJECTS = "subjects_conf"
73
94
  ETHOGRAM = "behaviors_conf"
74
95
  BEHAVIORAL_CATEGORIES = "behavioral_categories"
96
+ BEHAVIORAL_CATEGORIES_CONF = "behavioral_categories_config"
75
97
  CONVERTERS = "converters"
76
98
 
77
99
  OFFSET = "offset"
@@ -110,20 +132,34 @@ POINT_EVENT_PLOT_COLOR = "black"
110
132
 
111
133
  CHAR_FORBIDDEN_IN_MODIFIERS = "(|),`~"
112
134
 
135
+ FAST_FORWARD_DEFAULT_VALUE: float = 10.0
136
+
113
137
  ADAPT_FAST_JUMP = "adapt_fast_jump"
114
138
  ADAPT_FAST_JUMP_DEFAULT = False
115
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
+
116
149
 
117
- subjectsFields = ["key", SUBJECT_NAME, DESCRIPTION]
150
+ subjectsFields = [SUBJECT_KEY, SUBJECT_NAME, DESCRIPTION]
118
151
 
119
152
  UNPAIRED = "UNPAIRED"
120
153
  DISPLAY_SUBTITLES = "display_subtitles"
154
+ CHECK_PROJECT_INTEGRITY = "check_project_integrity"
121
155
 
122
156
 
123
157
  YES = "Yes"
124
158
  NO = "No"
125
159
  CANCEL = "Cancel"
160
+ IGNORE = "Ignore"
126
161
  APPEND = "Append"
162
+ CLOSE = "Close"
127
163
  REPLACE = "Replace"
128
164
  REMOVE = "Remove"
129
165
  SAVE = "Save"
@@ -138,6 +174,7 @@ NO_FOCAL_SUBJECT = "No focal subject"
138
174
 
139
175
  TYPE = "type"
140
176
  FILE = "file"
177
+ COLOR = "color"
141
178
  DIRECTORIES_LIST = "directories_list"
142
179
 
143
180
  SAVE_DATASET = 32
@@ -167,49 +204,37 @@ DATA_PLOT_FIELDS = {
167
204
  }
168
205
  DATA_PLOT_STYLES = ["b-", "r-", "g-", "bo", "ro", "go"]
169
206
 
170
- TIME = "time"
171
- BEHAVIOR_CODE = "code"
172
- SUBJECT = "subject"
173
- MODIFIER = "modifier"
174
- COMMENT = "comment"
175
- BEHAVIOR_KEY = "key"
176
- BEHAVIOR_CATEGORY = "category"
177
207
 
178
208
  FILE_PATH = "file_path"
179
209
 
180
210
  IMAGE_INDEX = "image index"
181
211
  IMAGE_PATH = "image path"
212
+ FRAME_INDEX = "frame index"
182
213
 
183
214
  ZOOM_LEVEL = "zoom level"
215
+ PAN_X = "pan-x"
216
+ PAN_Y = "pan-y"
217
+ ROTATION_ANGLE = "rotation angle"
184
218
  DISPLAY_MEDIA_SUBTITLES = "display subtitles"
185
219
  OVERLAY = "video overlay"
186
220
 
187
221
 
188
222
  USE_EXIF_DATE = "use_exif_date"
223
+ SUBSTRACT_FIRST_EXIF_DATE = "substract_first_exif_date"
189
224
  TIME_LAPSE = "time_lapse_delay"
190
225
 
191
226
 
192
227
  # fields for event configuration
193
- """
194
- fields = {
195
- "type": 0,
196
- "key": 1,
197
- "code": 2,
198
- "description": 3,
199
- "modifiers": 4,
200
- "excluded": 5,
201
- "coding map": 6,
202
- }
203
- """
204
228
 
205
229
  ETHOGRAM_TABLE_COLUMNS: dict = {
206
230
  0: "key",
207
231
  1: "code",
208
232
  2: "type",
209
233
  3: "description",
210
- 4: "category",
211
- 5: "modifiers",
212
- 6: "excluded",
234
+ 4: "color",
235
+ 5: "category",
236
+ 6: "modifiers",
237
+ 7: "excluded",
213
238
  }
214
239
 
215
240
  # fields in ethogram table from project window
@@ -218,23 +243,12 @@ behavioursFields: dict = {
218
243
  "key": 1,
219
244
  "code": 2,
220
245
  "description": 3,
221
- "category": 4,
222
- "modifiers": 5,
223
- "excluded": 6,
224
- "coding map": 7,
246
+ "color": 4,
247
+ "category": 5,
248
+ "modifiers": 6,
249
+ "excluded": 7,
250
+ "coding map": 8,
225
251
  }
226
- """
227
- ETHOGRAM_FIELDS = [
228
- "type",
229
- "key",
230
- "code",
231
- "description",
232
- "category",
233
- "modifiers",
234
- "excluded",
235
- "coding map",
236
- ]
237
- """
238
252
  ETHOGRAM_EDITABLE_FIELDS: tuple = ("key", "code", "description")
239
253
 
240
254
  PROJECT_BEHAVIORS_KEY_FIELD_IDX = 1
@@ -244,21 +258,32 @@ MEDIA_FILE_PATH_IDX = 2
244
258
  HAS_AUDIO_IDX = 6
245
259
 
246
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
+
247
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]
248
269
 
249
270
  BEHAVIOR_TYPES = [
250
- "Point event",
251
- "State event",
252
- "Point event with coding map",
253
- "State event with coding map",
271
+ POINT_EVENT,
272
+ STATE_EVENT,
273
+ POINT_EVENT_WITH_CODING_MAP,
274
+ STATE_EVENT_WITH_CODING_MAP,
254
275
  ]
255
276
 
256
277
  DEFAULT_BEHAVIOR_TYPE = "Point event"
257
278
 
258
- # fields for events table
259
- MEDIA_TW_EVENTS_FIELDS = ("time", "subject", "code", "type", "modifier", "comment")
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")
260
285
  LIVE_TW_EVENTS_FIELDS = ("time", "subject", "code", "type", "modifier", "comment")
261
- IMAGES_TW_EVENTS_FIELDS = ("time", "subject", "code", "type", "modifier", "comment", "image index", "image path")
286
+ IMAGES_TW_EVENTS_FIELDS = ("time", "subject", "code", "type", "modifier", "comment", IMAGE_INDEX, IMAGE_PATH)
262
287
 
263
288
  TW_EVENTS_FIELDS = {
264
289
  MEDIA: MEDIA_TW_EVENTS_FIELDS,
@@ -269,7 +294,7 @@ TW_EVENTS_FIELDS = {
269
294
  VIEWER_IMAGES: IMAGES_TW_EVENTS_FIELDS,
270
295
  }
271
296
 
272
- # create dictionaries
297
+ # create dictionary index
273
298
  TW_OBS_FIELD = {}
274
299
  for observation_type in TW_EVENTS_FIELDS:
275
300
  TW_OBS_FIELD[observation_type] = {}
@@ -278,9 +303,9 @@ for observation_type in TW_EVENTS_FIELDS:
278
303
 
279
304
 
280
305
  # fields for project events list
281
- MEDIA_PJ_EVENTS_FIELDS = ("time", "subject", "code", "modifier", "comment")
282
- LIVE_PJ_EVENTS_FIELDS = ("time", "subject", "code", "modifier", "comment")
283
- IMAGES_PJ_EVENTS_FIELDS = ("time", "subject", "code", "modifier", "comment", "image index", "image path")
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)
284
309
 
285
310
  PJ_EVENTS_FIELDS = {
286
311
  MEDIA: MEDIA_PJ_EVENTS_FIELDS,
@@ -291,9 +316,6 @@ PJ_EVENTS_FIELDS = {
291
316
  VIEWER_IMAGES: IMAGES_PJ_EVENTS_FIELDS,
292
317
  }
293
318
 
294
- # fields for independent variable definition
295
- tw_indVarFields = ["label", "description", "type", "default value", "possible values"]
296
-
297
319
 
298
320
  PJ_OBS_FIELDS = {}
299
321
  for observation_type in PJ_EVENTS_FIELDS:
@@ -301,14 +323,19 @@ for observation_type in PJ_EVENTS_FIELDS:
301
323
  for idx, field in enumerate(PJ_EVENTS_FIELDS[observation_type]):
302
324
  PJ_OBS_FIELDS[observation_type][field] = idx
303
325
 
326
+
327
+ # fields for independent variable definition
328
+ tw_indVarFields = ["label", "description", "type", "default value", "possible values"]
329
+
330
+
304
331
  EVENT_TIME_FIELD_IDX = 0
305
332
  EVENT_SUBJECT_FIELD_IDX = 1
306
333
  EVENT_BEHAVIOR_FIELD_IDX = 2
307
334
  EVENT_MODIFIER_FIELD_IDX = 3
308
335
  EVENT_COMMENT_FIELD_IDX = 4
309
- EVENT_STATUS_FIELD_IDX = 5
336
+ EVENT_STATUS_FIELD_IDX = -1
310
337
  # EVENT_IMAGEIDX_FIELD_IDX = 6
311
- EVENT_IMAGEPATH_FIELD_IDX = 7
338
+ # EVENT_IMAGEPATH_FIELD_IDX = 7
312
339
 
313
340
 
314
341
  BEHAV_CODING_MAP_FIELDS = ["name", "Behavior codes"]
@@ -331,6 +358,14 @@ START_FROM_CURRENT_EPOCH_TIME = "start_from_current_epoch_time"
331
358
 
332
359
  SCAN_SAMPLING_TIME = "scan_sampling_time"
333
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
+
334
369
  NEW = "new"
335
370
  LIST = "list"
336
371
  EDIT = "edit"
@@ -350,6 +385,7 @@ SELECTED_BEHAVIORS = "selected behaviors"
350
385
  SELECTED_SUBJECTS = "selected subjects"
351
386
  INCLUDE_MODIFIERS = "include modifiers"
352
387
  EXCLUDE_BEHAVIORS = "exclude behaviors"
388
+ EXCLUDE_NON_CODED_MODIFIERS = "exclude_non_coded_modifiers"
353
389
  EXCLUDED_BEHAVIORS = "excluded behaviors"
354
390
  TIME_INTERVAL = "time"
355
391
  START_TIME = "start time"
@@ -367,6 +403,7 @@ TIMESTAMP_idx = 3
367
403
 
368
404
  TIME_FULL_OBS = "full obs"
369
405
  TIME_EVENTS = "limit to events"
406
+ TIME_OBS_INTERVAL = "interval of observation"
370
407
  TIME_ARBITRARY_INTERVAL = "time interval"
371
408
 
372
409
  AVAILABLE_INDEP_VAR_TYPES = [NUMERIC, TEXT, SET_OF_VALUES, TIMESTAMP]
@@ -376,16 +413,31 @@ OBSERVATIONS = "observations"
376
413
 
377
414
  CLOSE_BEHAVIORS_BETWEEN_VIDEOS = "close_behaviors_between_videos"
378
415
 
379
- MPV_HWDEC_OPTIONS = ("auto", "auto-safe", "no")
380
- MPV_HWDEC_DEFAULT_VALUE = "auto"
416
+ # MPV hardware decode
381
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
382
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"
383
431
 
384
432
  PROJECT_FILE_INDENTATION = "project file indentation"
385
433
  PROJECT_FILE_INDENTATION_COMBO_OPTIONS = ("None", "Newline", "Tab", "2 spaces", "4 spaces")
386
434
  PROJECT_FILE_INDENTATION_OPTIONS = (None, 0, "\t", 2, 4)
387
435
  PROJECT_FILE_INDENTATION_DEFAULT_VALUE = None
388
436
 
437
+ TOOLBAR_ICON_SIZE = "toolbar icon size"
438
+ DEFAULT_TOOLBAR_ICON_SIZE_VALUE = 24
439
+
440
+
389
441
  VIDEO_VIEWER = 0
390
442
  PICTURE_VIEWER = 1
391
443
 
@@ -402,6 +454,7 @@ LENGTH = "length"
402
454
  FPS = "fps"
403
455
  HAS_AUDIO = "hasAudio"
404
456
  HAS_VIDEO = "hasVideo"
457
+ MEDIA_CREATION_TIME = "media_creation_time"
405
458
 
406
459
  STATE = "STATE"
407
460
  POINT = "POINT"
@@ -409,17 +462,25 @@ POINT = "POINT"
409
462
  START = "START"
410
463
  STOP = "STOP"
411
464
 
412
- PLAYER1, PLAYER2 = "1", "2"
465
+ PLAYER1 = "1"
466
+ PLAYER2 = "2"
413
467
  ALL_PLAYERS = [str(x + 1) for x in range(N_PLAYER)]
414
468
 
415
469
  VISUALIZE_SPECTROGRAM = "visualize_spectrogram"
416
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"
417
475
 
418
476
  # plot type
419
477
  WAVEFORM_PLOT = "waveform"
420
478
  SPECTROGRAM_PLOT = "spectrogram"
421
479
  EVENTS_PLOT = "plot_events"
422
480
 
481
+ PLAYING = "playing"
482
+ PAUSED = "paused"
483
+ STOPPED = "stopped"
423
484
 
424
485
  POINT_EVENT_ST_DURATION = 0.5
425
486
 
@@ -428,11 +489,10 @@ FRAME_TAB = 1
428
489
 
429
490
  SLIDER_MAXIMUM = 1000
430
491
 
431
- FRAME_BITMAP_FORMAT_LIST = ["JPG", "PNG"]
432
- FRAME_DEFAULT_BITMAP_FORMAT = "JPG"
433
-
434
492
  FRAME_DEFAULT_CACHE_SIZE = 1
435
493
 
494
+ EXCLUDED = "excluded"
495
+
436
496
  # modifiers
437
497
  MODIFIERS = "modifiers"
438
498
  SINGLE_SELECTION = 0
@@ -476,6 +536,16 @@ NO_COLOR_CODING_PAD = "#777777"
476
536
  SPECTROGRAM_COLOR_MAPS = ["viridis", "inferno", "plasma", "magma", "gray", "YlOrRd"]
477
537
  SPECTROGRAM_DEFAULT_COLOR_MAP = "viridis"
478
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
479
549
 
480
550
  # see matplotlib.colors.cnames.keys()
481
551
  # https://xkcd.com/color/rgb/
@@ -650,6 +720,7 @@ EMPTY_PROJECT = {
650
720
  ETHOGRAM: {},
651
721
  OBSERVATIONS: {},
652
722
  BEHAVIORAL_CATEGORIES: [],
723
+ BEHAVIORAL_CATEGORIES_CONF: {},
653
724
  INDEPENDENT_VARIABLES: {},
654
725
  CODING_MAP: {},
655
726
  BEHAVIORS_CODING_MAP: [],
@@ -664,8 +735,21 @@ INIT_PARAM = {
664
735
  # TIME_BUDGET_FORMAT: DEFAULT_TIME_BUDGET_FORMAT,
665
736
  MPV_HWDEC: MPV_HWDEC_DEFAULT_VALUE,
666
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,
667
740
  }
668
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"
669
753
 
670
754
  # Output format
671
755
  TSV = "Tab Separated Values (*.tsv)"
@@ -684,18 +768,18 @@ TBS = "Timed Behavioral Sequences (*.tbs)"
684
768
  TEXT_FILE = "Text file"
685
769
 
686
770
  FILE_NAME_SUFFIX = {
687
- TSV: "tsv",
688
- CSV: "csv",
689
- ODS: "ods",
690
- ODS_WB: "ods",
691
- XLSX: "xlsx",
692
- XLSX_WB: "xlsx",
693
- XLS: "xls",
694
- HTML: "html",
695
- PANDAS_DF: "pkl",
696
- RDS: "rds",
697
- SQL: "sql",
698
- SDIS: "sds",
699
- TBS: "tbs",
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,
700
784
  TEXT_FILE: "cli",
701
785
  }