boris-behav-obs 9.6.4__py2.py3-none-any.whl → 9.6.6__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.
@@ -5,11 +5,14 @@ Inter Rater Reliability (IRR) Unweighted Cohen's Kappa
5
5
  """
6
6
 
7
7
  import pandas as pd
8
- from sklearn.metrics import cohen_kappa_score
9
8
  from typing import Dict, Tuple
10
9
 
11
- __version__ = "0.0.2"
12
- __version_date__ = "2025-08-29"
10
+ from sklearn.metrics import cohen_kappa_score
11
+ from PySide6.QtWidgets import QInputDialog
12
+
13
+
14
+ __version__ = "0.0.3"
15
+ __version_date__ = "2025-09-02"
13
16
  __plugin_name__ = "Inter Rater Reliability - Unweighted Cohen's Kappa"
14
17
  __author__ = "Olivier Friard - University of Torino - Italy"
15
18
  __description__ = """
@@ -52,6 +55,15 @@ def run(df: pd.DataFrame) -> pd.DataFrame:
52
55
  # Sort to ensure deterministic representation (e.g., "A+B" instead of "B+A")
53
56
  return "+".join(sorted(active_codes))
54
57
 
58
+ # ask user for the number of decimal places for rounding (can be negative)
59
+ round_decimals, ok = QInputDialog.getInt(
60
+ None, "Rounding", "Enter the number of decimal places for rounding (can be negative)", value=3, minValue=-5, maxValue=3, step=1
61
+ )
62
+
63
+ # round times
64
+ df["Start (s)"] = df["Start (s)"].round(round_decimals)
65
+ df["Stop (s)"] = df["Stop (s)"].round(round_decimals)
66
+
55
67
  # Get unique values
56
68
  unique_obs_list = df["Observation id"].unique().tolist()
57
69
 
@@ -5,10 +5,12 @@ Inter Rater Reliability (IRR) Unweighted Cohen's Kappa with modifiers
5
5
  """
6
6
 
7
7
  import pandas as pd
8
+
8
9
  from sklearn.metrics import cohen_kappa_score
10
+ from PySide6.QtWidgets import QInputDialog
9
11
 
10
- __version__ = "0.0.2"
11
- __version_date__ = "2025-08-29"
12
+ __version__ = "0.0.3"
13
+ __version_date__ = "2025-09-02"
12
14
  __plugin_name__ = "Inter Rater Reliability - Unweighted Cohen's Kappa with modifiers"
13
15
  __author__ = "Olivier Friard - University of Torino - Italy"
14
16
  __description__ = """
@@ -52,6 +54,15 @@ def run(df: pd.DataFrame):
52
54
  # Sort to ensure deterministic representation (e.g., "A+B" instead of "B+A")
53
55
  return "+".join(sorted(active_codes))
54
56
 
57
+ # ask user for the number of decimal places for rounding (can be negative)
58
+ round_decimals, ok = QInputDialog.getInt(
59
+ None, "Rounding", "Enter the number of decimal places for rounding (can be negative)", value=3, minValue=-5, maxValue=3, step=1
60
+ )
61
+
62
+ # round times
63
+ df["Start (s)"] = df["Start (s)"].round(round_decimals)
64
+ df["Stop (s)"] = df["Stop (s)"].round(round_decimals)
65
+
55
66
  # Get unique values
56
67
  unique_obs_list = df["Observation id"].unique().tolist()
57
68
 
@@ -7,8 +7,10 @@ Inter Rater Reliability (IRR) Weighted Cohen's Kappa
7
7
  import pandas as pd
8
8
  from typing import List, Tuple, Dict, Optional
9
9
 
10
- __version__ = "0.0.2"
11
- __version_date__ = "2025-08-29"
10
+ from PySide6.QtWidgets import QInputDialog
11
+
12
+ __version__ = "0.0.3"
13
+ __version_date__ = "2025-09-02"
12
14
  __plugin_name__ = "Inter Rater Reliability - Weighted Cohen's Kappa"
13
15
  __author__ = "Olivier Friard - University of Torino - Italy"
14
16
  __description__ = """
@@ -72,7 +74,7 @@ def run(df: pd.DataFrame):
72
74
  active_codes = [seg[2] for seg in obs if seg[0] <= t < seg[1]]
73
75
  if not active_codes:
74
76
  return None
75
- return "+".join(sorted(active_codes)) # rappresentazione deterministica
77
+ return "+".join(sorted(active_codes))
76
78
 
77
79
  # 4. Build weighted contingency table (durations instead of counts)
78
80
  contingency: Dict[Tuple[Optional[str], Optional[str]], float] = {}
@@ -104,6 +106,15 @@ def run(df: pd.DataFrame):
104
106
 
105
107
  return kappa, po, pe, contingency
106
108
 
109
+ # ask user for the number of decimal places for rounding (can be negative)
110
+ round_decimals, ok = QInputDialog.getInt(
111
+ None, "Rounding", "Enter the number of decimal places for rounding (can be negative)", value=3, minValue=-5, maxValue=3, step=1
112
+ )
113
+
114
+ # round times
115
+ df["Start (s)"] = df["Start (s)"].round(round_decimals)
116
+ df["Stop (s)"] = df["Stop (s)"].round(round_decimals)
117
+
107
118
  # Get unique values as a numpy array
108
119
  unique_obs = df["Observation id"].unique()
109
120
 
@@ -7,8 +7,10 @@ Inter Rater Reliability (IRR) Weighted Cohen's Kappa with modifiers
7
7
  import pandas as pd
8
8
  from typing import List, Tuple, Dict, Optional
9
9
 
10
- __version__ = "0.0.2"
11
- __version_date__ = "2025-08-29"
10
+ from PySide6.QtWidgets import QInputDialog
11
+
12
+ __version__ = "0.0.3"
13
+ __version_date__ = "2025-09-02"
12
14
  __plugin_name__ = "Inter Rater Reliability - Weighted Cohen's Kappa with modifiers"
13
15
  __author__ = "Olivier Friard - University of Torino - Italy"
14
16
  __description__ = """
@@ -72,7 +74,7 @@ def run(df: pd.DataFrame):
72
74
  active_codes = [seg[2] for seg in obs if seg[0] <= t < seg[1]]
73
75
  if not active_codes:
74
76
  return None
75
- return "+".join(sorted(active_codes)) # rappresentazione deterministica
77
+ return "+".join(sorted(active_codes))
76
78
 
77
79
  # 4. Build weighted contingency table (durations instead of counts)
78
80
  contingency: Dict[Tuple[Optional[str], Optional[str]], float] = {}
@@ -104,6 +106,15 @@ def run(df: pd.DataFrame):
104
106
 
105
107
  return kappa, po, pe, contingency
106
108
 
109
+ # ask user for the number of decimal places for rounding (can be negative)
110
+ round_decimals, ok = QInputDialog.getInt(
111
+ None, "Rounding", "Enter the number of decimal places for rounding (can be negative)", value=3, minValue=-5, maxValue=3, step=1
112
+ )
113
+
114
+ # round times
115
+ df["Start (s)"] = df["Start (s)"].round(round_decimals)
116
+ df["Stop (s)"] = df["Stop (s)"].round(round_decimals)
117
+
107
118
  # Get unique values as a numpy array
108
119
  unique_obs = df["Observation id"].unique()
109
120
 
boris/cmd_arguments.py CHANGED
@@ -30,6 +30,7 @@ def parse_arguments():
30
30
  parser = OptionParser(usage=usage)
31
31
 
32
32
  parser.add_option("-d", "--debug", action="store_true", default=False, dest="debug", help="Use debugging mode")
33
+ parser.add_option("-q", "--quit", action="store_true", default=False, dest="quit", help="Quit after launch")
33
34
  parser.add_option("-v", "--version", action="store_true", default=False, dest="version", help="Print version")
34
35
  parser.add_option("-n", "--nosplashscreen", action="store_true", default=False, help="No splash screen")
35
36
  parser.add_option("-p", "--project", action="store", default="", dest="project", help="Project file")
boris/core.py CHANGED
@@ -236,8 +236,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
236
236
  processes: list = [] # list of QProcess processes
237
237
  overlays: dict = {} # dict for storing video overlays
238
238
 
239
- undo_queue = deque()
240
- undo_description = deque()
239
+ undo_queue = deque() # queue for undoing event operations
240
+ undo_description = deque() # queue for description of event operations
241
241
 
242
242
  current_player: int = 0 # id of the selected (left click) video player
243
243
 
@@ -5666,16 +5666,25 @@ def main():
5666
5666
  ret, msg = util.check_ffmpeg_path()
5667
5667
  if not ret:
5668
5668
  if sys.platform.startswith("win"):
5669
- QMessageBox.warning(
5670
- None,
5671
- cfg.programName,
5672
- "FFmpeg is not available.<br>It will be downloaded",
5673
- QMessageBox.Ok | QMessageBox.Default,
5674
- QMessageBox.NoButton,
5675
- )
5669
+
5670
+ import ctypes
5671
+ MessageBoxTimeoutW = ctypes.windll.user32.MessageBoxTimeoutW
5672
+ MessageBoxTimeoutW.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.c_wchar_p,
5673
+ ctypes.c_uint, ctypes.c_uint, ctypes.c_uint]
5674
+ ctypes.windll.user32.MessageBoxTimeoutW(None, "The FFmpeg framework is not available.\nIt will be downloaded from the BORIS GitHub repository.", "FFmpeg", 0, 0, 10000) # time out
5675
+
5676
+ # if (not options.nosplashscreen):
5677
+ # QMessageBox.warning(
5678
+ # None,
5679
+ # cfg.programName,
5680
+ # "FFmpeg is not available.<br>It will be downloaded from the BORIS GitHub repository",
5681
+ # QMessageBox.Ok | QMessageBox.Default,
5682
+ # QMessageBox.NoButton,
5683
+ # )
5684
+ logging.info("FFmpeg is not available. It will be downloaded from the BORIS GitHub repository")
5676
5685
 
5677
5686
  # download ffmpeg and ffprobe from https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/
5678
- url = "https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/"
5687
+ url:str = "https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/"
5679
5688
 
5680
5689
  # search where to download ffmpeg
5681
5690
  ffmpeg_dir = Path(__file__).parent / "misc"
@@ -5807,6 +5816,10 @@ def main():
5807
5816
  if not options.nosplashscreen and (sys.platform != "darwin"):
5808
5817
  splash.finish(window)
5809
5818
 
5819
+ # quit just after launch (used in the deployment procedure)
5820
+ if options.quit:
5821
+ sys.exit()
5822
+
5810
5823
  return_code = app.exec()
5811
5824
 
5812
5825
  del window
@@ -19,21 +19,25 @@ Copyright 2012-2025 Olivier Friard
19
19
  MA 02110-1301, USA.
20
20
  """
21
21
 
22
- from math import log2, floor
23
- import os
22
+
24
23
  import logging
25
- import time
26
- import tempfile
24
+ from collections import deque
25
+ import datetime as dt
26
+ from decimal import Decimal as dec
27
27
  import json
28
- import subprocess
28
+ from math import log2, floor
29
+ import os
30
+ import pathlib as pl
29
31
  import socket
32
+ import subprocess
30
33
  import sys
31
- from decimal import Decimal as dec
32
- import pathlib as pl
33
- import datetime as dt
34
+ import tempfile
35
+ import time
34
36
  from typing import List, Tuple, Optional
35
37
 
36
38
 
39
+
40
+
37
41
  from PySide6.QtWidgets import (
38
42
  QMessageBox,
39
43
  QFileDialog,
@@ -1183,6 +1187,11 @@ def close_observation(self):
1183
1187
 
1184
1188
  self.observationId = ""
1185
1189
 
1190
+ # delete undo queue
1191
+ self.undo_queue = deque()
1192
+ self.undo_description = deque()
1193
+
1194
+
1186
1195
  if self.playerType in (cfg.MEDIA, cfg.IMAGES):
1187
1196
  """
1188
1197
  for idx, _ in enumerate(self.dw_player):
boris/plugins.py CHANGED
@@ -310,7 +310,11 @@ def run_plugin(self, plugin_name):
310
310
 
311
311
  logging.info("preparing dataframe for plugin")
312
312
 
313
- df = project_functions.project2dataframe(self.pj, selected_observations)
313
+ message, df = project_functions.project2dataframe(self.pj, selected_observations)
314
+ if message:
315
+ logging.critical(message)
316
+ QMessageBox.critical(self, cfg.programName, message)
317
+ return
314
318
 
315
319
  logging.info("done")
316
320
 
@@ -466,7 +466,7 @@ def check_project_integrity(
466
466
  out += "<br><br>" if out else ""
467
467
  out += f"Observation: <b>{obs_id}</b><br>{msg}"
468
468
 
469
- out_events = ""
469
+ out_events: str = ""
470
470
  for obs_id in pj[cfg.OBSERVATIONS]:
471
471
  # check if timestamp between -2147483647 and 2147483647
472
472
  for event in pj[cfg.OBSERVATIONS][obs_id][cfg.EVENTS]:
@@ -573,6 +573,41 @@ def check_project_integrity(
573
573
  out += "<br><br>" if out else ""
574
574
  out += tmp_out
575
575
 
576
+ # check if the number of coded modifiers correspond to the number of sets of modifier
577
+ obs_results: dict = {}
578
+ for obs_id in pj[cfg.OBSERVATIONS]:
579
+ for event_idx, event in enumerate(pj[cfg.OBSERVATIONS][obs_id][cfg.EVENTS]):
580
+ # event[2]
581
+ for idx in pj[cfg.ETHOGRAM]:
582
+ if pj[cfg.ETHOGRAM][idx]["code"] == event[2]:
583
+ break
584
+ else:
585
+ raise
586
+ if (not event[3]) and not pj[cfg.ETHOGRAM][idx][cfg.MODIFIERS]:
587
+ continue
588
+
589
+ if len(event[3].split("|")) != len(pj[cfg.ETHOGRAM][idx][cfg.MODIFIERS]):
590
+ print("behavior", event[2])
591
+ print(f"modifier(s) #{event[3]}#", len(event[3].split("|")))
592
+ print(pj[cfg.ETHOGRAM][idx]["code"], pj[cfg.ETHOGRAM][idx][cfg.MODIFIERS])
593
+ print()
594
+ if obs_id not in obs_results:
595
+ obs_results[obs_id] = []
596
+
597
+ obs_results[obs_id].append(
598
+ (
599
+ f"Event #{event_idx}: the coded modifiers for {event[2]} are {len(event[3].split('|'))} "
600
+ f"but {len(pj[cfg.ETHOGRAM][idx][cfg.MODIFIERS])} sets were defined in ethogram."
601
+ )
602
+ )
603
+
604
+ if obs_results:
605
+ out += "<br><br>" if out else ""
606
+ for o in obs_results:
607
+ out += f"<br>Observation <b>{o}</b>:<br>"
608
+ out += "<br>".join(obs_results[o])
609
+ out += "<br><br>"
610
+
576
611
  return out
577
612
 
578
613
 
@@ -1779,7 +1814,7 @@ def explore_project(self) -> None:
1779
1814
  QMessageBox.information(self, cfg.programName, "No events found")
1780
1815
 
1781
1816
 
1782
- def project2dataframe(pj: dict, observations_list: list = []) -> pd.DataFrame:
1817
+ def project2dataframe(pj: dict, observations_list: list = []) -> Tuple[str, pd.DataFrame]:
1783
1818
  """
1784
1819
  returns a pandas dataframe containing observations data
1785
1820
  """
@@ -1950,7 +1985,10 @@ def project2dataframe(pj: dict, observations_list: list = []) -> pd.DataFrame:
1950
1985
  count_set = 0
1951
1986
  for modifier_set in all_modifier_sets:
1952
1987
  if event[2] == modifier_set[0]:
1953
- data[modifier_set].append(event[3].split("|")[count_set])
1988
+ try:
1989
+ data[modifier_set].append(event[3].split("|")[count_set])
1990
+ except Exception:
1991
+ return f"Modifier error for {event[2]} in observation {obs_id}", pd.DataFrame()
1954
1992
  count_set += 1
1955
1993
  else:
1956
1994
  data[modifier_set].append(np.nan)
@@ -1971,7 +2009,7 @@ def project2dataframe(pj: dict, observations_list: list = []) -> pd.DataFrame:
1971
2009
  data["Comment stop"].append(event2[4])
1972
2010
  break
1973
2011
  else:
1974
- raise ("not paired")
2012
+ return f"Some events are not paired in {obs_id}", pd.DataFrame()
1975
2013
 
1976
2014
  else: # point
1977
2015
  data["Stop (s)"].append(float(event[0]))
@@ -1985,4 +2023,4 @@ def project2dataframe(pj: dict, observations_list: list = []) -> pd.DataFrame:
1985
2023
 
1986
2024
  pd.DataFrame(data).info()
1987
2025
 
1988
- return pd.DataFrame(data)
2026
+ return "", pd.DataFrame(data)
boris/utilities.py CHANGED
@@ -62,11 +62,18 @@ except Exception:
62
62
  if sys.platform.startswith("win"):
63
63
  import ctypes
64
64
 
65
- ctypes.windll.user32.MessageBoxW(0, "The MPV library was not found!\nIt will be downloaded.", "BORIS", 0)
65
+ logger.info("The MPV library was not found!\nIt will be downloaded from the BORIS GitHub repository")
66
+ #ctypes.windll.user32.MessageBoxW(0, "The MPV library was not found!\nIt will be downloaded.", "BORIS", 0)
66
67
 
67
- # download libmpv2.dll and ffprobe from https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/
68
+ # test if following function works on windows
69
+ MessageBoxTimeoutW = ctypes.windll.user32.MessageBoxTimeoutW
70
+ MessageBoxTimeoutW.argtypes = [ctypes.c_void_p, ctypes.c_wchar_p, ctypes.c_wchar_p,
71
+ ctypes.c_uint, ctypes.c_uint, ctypes.c_uint]
72
+ ctypes.windll.user32.MessageBoxTimeoutW(None, "The MPV library was not found.\nIt will be downloaded from the BORIS GitHub repository.", "MPV library", 0, 0, 10000) # time out
68
73
 
69
- url = "https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/"
74
+ # download libmpv2.dll from https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/
75
+
76
+ url:str = "https://github.com/boris-behav-obs/boris-behav-obs.github.io/releases/download/files/"
70
77
 
71
78
  external_files_dir = ""
72
79
  # search where to download libmpv-2.dll
@@ -91,7 +98,7 @@ except Exception:
91
98
  try:
92
99
  from . import mpv2 as mpv
93
100
  except Exception:
94
- logger.warning("MPV library not found after dowloading")
101
+ logger.critical("MPV library not found after dowloading")
95
102
  sys.exit(5)
96
103
 
97
104
  elif sys.platform.startswith("linux"):
boris/version.py CHANGED
@@ -20,5 +20,5 @@ This file is part of BORIS.
20
20
 
21
21
  """
22
22
 
23
- __version__ = "9.6.4"
24
- __version_date__ = "2025-08-29"
23
+ __version__ = "9.6.6"
24
+ __version_date__ = "2025-10-18"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boris-behav-obs
3
- Version: 9.6.4
3
+ Version: 9.6.6
4
4
  Summary: BORIS - Behavioral Observation Research Interactive Software
5
5
  Author-email: Olivier Friard <olivier.friard@unito.it>
6
6
  License-Expression: GPL-3.0-only
@@ -24,7 +24,7 @@ Requires-Dist: matplotlib==3.10.5
24
24
  Requires-Dist: pandas==2.3.2
25
25
  Requires-Dist: tablib[cli,html,ods,pandas,xls,xlsx]==3.8.0
26
26
  Requires-Dist: pyreadr==0.5.3
27
- Requires-Dist: pyside6==6.9
27
+ Requires-Dist: pyside6==6.10
28
28
  Requires-Dist: hachoir==3.3.0
29
29
  Requires-Dist: scipy==1.16.1
30
30
  Requires-Dist: scikit-learn==1.7.1
@@ -52,7 +52,7 @@ It provides also some analysis tools like time budget and some plotting function
52
52
  <!-- The BO-RIS paper has more than [![BORIS citations counter](https://penelope.unito.it/friard/boris_scopus_citations.png) citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications. -->
53
53
 
54
54
 
55
- The BORIS paper has more than 2332 citations in peer-reviewed scientific publications.
55
+ The BORIS paper has more than 2337 citations in peer-reviewed scientific publications.
56
56
 
57
57
 
58
58
 
@@ -9,7 +9,7 @@ boris/behav_coding_map_creator.py,sha256=5XGY4AZOsGrOj0xHT-dIeiR5ejBhPShsnYNfIQF
9
9
  boris/behavior_binary_table.py,sha256=bpmRDpEjq0rw3YOCoN_He3kfUe8A_R6E48kQR7KnkH8,12453
10
10
  boris/behaviors_coding_map.py,sha256=xIGJxp2eghrpiGDmYH73eJPERuyc4A_54uT-Got3zTs,7302
11
11
  boris/boris_cli.py,sha256=Bc51DEMcD79ZZfM9pCzpaWU6iT6b8gNwR3n8fr42_4E,13193
12
- boris/cmd_arguments.py,sha256=oWb-FvhKLbKJhATlTHy9muWu8XnnUfOZ-3Fmz2M8Yzc,1848
12
+ boris/cmd_arguments.py,sha256=Jn0Byzx0GUq9fsRHEdAPMe1U2JWkPrTTDyQ0EQAzU7A,1961
13
13
  boris/coding_pad.py,sha256=BaDWYIzoRgl0LHymPDmcBMFfwG7Z0XROqqMwkkADtz0,10940
14
14
  boris/config.py,sha256=IbW8PkAFcZIL-8NoSscXSeI82dneLzpywaGXWDcnrWw,17845
15
15
  boris/config_file.py,sha256=5_AB_VE5j3iHkanL5xELN42HJJMLOh40qSgBFs7fCXo,13493
@@ -17,7 +17,7 @@ boris/connections.py,sha256=kqc6jaYNzoJe8crPtfwE-fXTW4nTfB8-PojRzbbLEus,19629
17
17
  boris/converters.py,sha256=n6gDM9x2hS-ZOoHLruiifuXxnC7ERsUukiFokhHZPoQ,11678
18
18
  boris/converters_ui.py,sha256=uu7LOBV_fKv2DBdOqsqPwjGsjgONr5ODBoscAA-EP48,9900
19
19
  boris/cooccurence.py,sha256=tVERC-V8MWjWHlGEfDuu08iS94qjt4do-38jwI62QaY,10367
20
- boris/core.py,sha256=R8oQsjmRh0heo7RmFyZVljTdMub4I_kM_7KGxpg9DDI,230461
20
+ boris/core.py,sha256=nC1AnhBIQNqTKaMDm7Wlrqrd3EK3GIiF7cv3F3RWfWQ,231346
21
21
  boris/core_qrc.py,sha256=Hz51Xw70ZIlDbYB281nfGtCm43_ItYhamMu2T5X8Tu8,639882
22
22
  boris/core_ui.py,sha256=--VDOzUfjsA4TJRw3aFk2CeSL29193vPGLgYJRhQfUY,77143
23
23
  boris/db_functions.py,sha256=TfCJ0Hq0pTFOKrZz3RzdvnR-NKCmrPHU2qL9BSXeeGQ,13379
@@ -48,7 +48,7 @@ boris/mpv-1.0.3.py,sha256=EXRtzQqFjOn4wMC6482Ilq3fNQ9N1GRP1VxwLzdeaBY,88077
48
48
  boris/mpv.py,sha256=EfzIHjPbgewG4w3smEtqEUPZoVwYmMQkL4Q8ZyW-a58,76410
49
49
  boris/mpv2.py,sha256=IUI4t4r9GYX7G5OXTjd3RhMMOkDdfal_15buBgksLsk,92152
50
50
  boris/observation.py,sha256=10UkVyY8TDySntIX_-H-IsuFdiF6tEcmC6JQUzD6wYg,57139
51
- boris/observation_operations.py,sha256=GSU0C5A7jn44Jzt0V6-2TzqhFtCHTn8XlgG-EZ2Qn90,107853
51
+ boris/observation_operations.py,sha256=yk3R8igKF_T8l894uXSruqpj63myu3tE8dO2tmcIhRE,107978
52
52
  boris/observation_ui.py,sha256=DAnU94QBNvkLuHT6AxTwqSk_D_n6VUhSl8PexZv_dUk,33309
53
53
  boris/observations_list.py,sha256=NqwECGHtHYmKhSe-qCfqPmJ24SSfzlXvIXS2i3op_zE,10591
54
54
  boris/otx_parser.py,sha256=70QvilzFHXbjAHR88YH0aEXJ3xxheLS5fZGgHFHGpNE,16367
@@ -60,11 +60,11 @@ boris/plot_events.py,sha256=tKiUWH0TNSkK7xz5Vf0tAD3KiuAalv6UZEVtOnoFpWY,24059
60
60
  boris/plot_events_rt.py,sha256=xJmjwqhQxCN4FDBYRQ0O2eHm356Rbexzr3m1qTefMDU,8326
61
61
  boris/plot_spectrogram_rt.py,sha256=wDhnkqwjd2UfCxrfOejOUxoNOqfMNo6vo1JSvYgM-2A,10925
62
62
  boris/plot_waveform_rt.py,sha256=RNXhcBzRKnoGoVjRAHsVvOaj0BJbbI2cpCMjMUiGqX0,7534
63
- boris/plugins.py,sha256=wZ-Azq_4xD_vZf8t-cPm4jT-6kWw_t0lroGYMMZY8bE,15468
63
+ boris/plugins.py,sha256=sn2r8kMxkzaO8kNhem-cTlTBrym9MlFPyRT9Av9rHGg,15603
64
64
  boris/preferences.py,sha256=-WwBlkP3uhSyO3tUhcrctHMzlv46ngW9C4KAq7UJAoI,21563
65
65
  boris/preferences_ui.py,sha256=wbo51aBNdcQTJni1DmUM5ZQPOwAtKSkEQam7rRzRS5g,34166
66
66
  boris/project.py,sha256=nyXfCDY_rLP3jC1QGv-280jUKgbABqESjOm7I19rJ1U,86432
67
- boris/project_functions.py,sha256=o0IOvhGs1cqEjpdeNUeY-qvFfWAQl_7tsUEKxogKRuU,80869
67
+ boris/project_functions.py,sha256=gSG6Pa0BF0wv5AtfvRU8KqOqzgUwbMTmIsYqQ11QwmY,82605
68
68
  boris/project_import_export.py,sha256=oBG1CSXfKISsb3TLNT-8BH8kZPAzxIYSNemlLVH1Lh8,38560
69
69
  boris/project_ui.py,sha256=yB-ewhHt8S8DTTRIk-dNK2tPMNU24lNji9fDW_Xazu8,38805
70
70
  boris/qrc_boris.py,sha256=aH-qUirYY1CGxmTK1SFCPvuZfazIHX4DdUKF1gxZeYM,675008
@@ -78,8 +78,8 @@ boris/synthetic_time_budget.py,sha256=3Eb9onMLmgqCLd50CuxV9L8RV2ESzfaMWvPK_bXUMM
78
78
  boris/time_budget_functions.py,sha256=SbGyTF2xySEqBdRJZeWFTirruvK3r6pwM6e4Gz17W1s,52186
79
79
  boris/time_budget_widget.py,sha256=z-tyITBtIz-KH1H2OdMB5a8x9QQLK7Wu96-zkC6NVDA,43213
80
80
  boris/transitions.py,sha256=okyDCO-Vn4p_Fixd8cGiSIaUhUxG5ePIOqGSuP52g_c,12246
81
- boris/utilities.py,sha256=dD5HpojqlAGLVkr3YnOsaqfbCMHFYroe040ZchB5WnM,56662
82
- boris/version.py,sha256=fDAicR6wKnw1AhX62oUJOe-UdVlkEbCMKGC898Whx2E,787
81
+ boris/utilities.py,sha256=OGUjhZo5HdKDn7uAETN387g0eK5CHilmi5XSPlAuKLE,57242
82
+ boris/version.py,sha256=XXeM4TVePj_ALz1P1maWfmPV8WPgZA-8kTd_3te-u5c,787
83
83
  boris/video_equalizer.py,sha256=cm2JXe1eAPkqDzxYB2OMKyuveMBdq4a9-gD1bBorbn4,5823
84
84
  boris/video_equalizer_ui.py,sha256=1CG3s79eM4JAbaCx3i1ILZXLceb41_gGXlOLNfpBgnw,10142
85
85
  boris/video_operations.py,sha256=rXKWndaALaF-yLEPIY_-Z99XRAncZRzRd1sLzwSpbjs,10768
@@ -88,10 +88,10 @@ boris/view_df_ui.py,sha256=CaMeRH_vQ00CTDDFQn73ZZaS-r8BSTWpL-dMCFqzJ_Q,2775
88
88
  boris/write_event.py,sha256=xC-dUjgPS4-tvrQfvyL7O_xi-tyQI7leSiSV8_x8hgg,23817
89
89
  boris/analysis_plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
90
  boris/analysis_plugins/_latency.py,sha256=9kCdFDtb5Zdao1xFpioi_exm_IxyGm6RlY3Opn6GUFo,2030
91
- boris/analysis_plugins/irr_cohen_kappa.py,sha256=FZlUfMl-RrA24NGbrZxLudXfzOlVBAQIMiWTvRAJxfc,3818
92
- boris/analysis_plugins/irr_cohen_kappa_with_modifiers.py,sha256=Pf3RCwYW5iG3pjbqoKq4wMAjUMyW-3eYTOmHz5syZr4,4012
93
- boris/analysis_plugins/irr_weighted_cohen_kappa.py,sha256=mVmxB4V9FHIh6kvfpze_QQc_LtqTqvtvhnDJ37eqyNM,6021
94
- boris/analysis_plugins/irr_weighted_cohen_kappa_with_modifiers.py,sha256=dAktN8D-Tn-DFM9O0bA8iTlgiKZamfy1pSJsqLq0Ykg,6330
91
+ boris/analysis_plugins/irr_cohen_kappa.py,sha256=OqmivIE6i1hTcFVMp0EtY0Sr7C1Jm9t0D4IKbDfTJ7U,4268
92
+ boris/analysis_plugins/irr_cohen_kappa_with_modifiers.py,sha256=DtzFLRToR9GdkmWYDcCmpSvxHGpguVp-_n8F-t7ND7c,4461
93
+ boris/analysis_plugins/irr_weighted_cohen_kappa.py,sha256=xpDjcDkwPtTM3SI9UC2RIhma1nqFU_qcGSMq7QpMMHc,6435
94
+ boris/analysis_plugins/irr_weighted_cohen_kappa_with_modifiers.py,sha256=DXrvac4p3_jzakHi_hTW8ZG9rniGo4YCyUH_jJ7fz8c,6744
95
95
  boris/analysis_plugins/list_of_dataframe_columns.py,sha256=VEiVhxADtyaIKN4JrfFV02TuTAfWhQ60bf1mHVQp27I,437
96
96
  boris/analysis_plugins/number_of_occurences.py,sha256=IDyDrdezqvSKT3BlD8QWpSYk8X9nnBBLI80OUnFJ3bY,509
97
97
  boris/analysis_plugins/number_of_occurences_by_independent_variable.py,sha256=_7HTKXsyxNfyO69tP8zkQEHzT0C7qHdL1sqBjnUfRQY,1459
@@ -102,9 +102,9 @@ boris/portion/dict.py,sha256=uNM-LEY52CZ2VNMMW_C9QukoyTvPlQf8vcbGa1lQBHI,11281
102
102
  boris/portion/func.py,sha256=mSQr20YS1ug7R1fRqBg8LifjtXDRvJ6Kjc3WOeL9P34,2172
103
103
  boris/portion/interval.py,sha256=sOlj3MAGGaB-JxCkigS-n3qw0fY7TANAsXv1pavr8J4,19931
104
104
  boris/portion/io.py,sha256=kpq44pw3xnIyAlPwaR5qRHKRdZ72f8HS9YVIWs5k2pk,6367
105
- boris_behav_obs-9.6.4.dist-info/licenses/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
106
- boris_behav_obs-9.6.4.dist-info/METADATA,sha256=7CDGE4ph3x8P2p2r5YwsUY_VILI6M7bNMoArbDqxUmU,5089
107
- boris_behav_obs-9.6.4.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
108
- boris_behav_obs-9.6.4.dist-info/entry_points.txt,sha256=k__8XvFi4vaA4QFvQehCZjYkKmZH34HSAJI2iYCWrMs,52
109
- boris_behav_obs-9.6.4.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
110
- boris_behav_obs-9.6.4.dist-info/RECORD,,
105
+ boris_behav_obs-9.6.6.dist-info/licenses/LICENSE.TXT,sha256=WJ7YI-moTFb-uVrFjnzzhGJrnL9P2iqQe8NuED3hutI,35141
106
+ boris_behav_obs-9.6.6.dist-info/METADATA,sha256=GJpmMIALTFecW5EeCUrdpqA0yVe9h7ojE7xqiiPymVM,5090
107
+ boris_behav_obs-9.6.6.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
108
+ boris_behav_obs-9.6.6.dist-info/entry_points.txt,sha256=k__8XvFi4vaA4QFvQehCZjYkKmZH34HSAJI2iYCWrMs,52
109
+ boris_behav_obs-9.6.6.dist-info/top_level.txt,sha256=fJSgm62S7WesiwTorGbOO4nNN0yzgZ3klgfGi3Px4qI,6
110
+ boris_behav_obs-9.6.6.dist-info/RECORD,,