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.
- boris/analysis_plugins/irr_cohen_kappa.py +15 -3
- boris/analysis_plugins/irr_cohen_kappa_with_modifiers.py +13 -2
- boris/analysis_plugins/irr_weighted_cohen_kappa.py +14 -3
- boris/analysis_plugins/irr_weighted_cohen_kappa_with_modifiers.py +14 -3
- boris/cmd_arguments.py +1 -0
- boris/core.py +23 -10
- boris/observation_operations.py +17 -8
- boris/plugins.py +5 -1
- boris/project_functions.py +43 -5
- boris/utilities.py +11 -4
- boris/version.py +2 -2
- {boris_behav_obs-9.6.4.dist-info → boris_behav_obs-9.6.6.dist-info}/METADATA +3 -3
- {boris_behav_obs-9.6.4.dist-info → boris_behav_obs-9.6.6.dist-info}/RECORD +17 -17
- {boris_behav_obs-9.6.4.dist-info → boris_behav_obs-9.6.6.dist-info}/WHEEL +0 -0
- {boris_behav_obs-9.6.4.dist-info → boris_behav_obs-9.6.6.dist-info}/entry_points.txt +0 -0
- {boris_behav_obs-9.6.4.dist-info → boris_behav_obs-9.6.6.dist-info}/licenses/LICENSE.TXT +0 -0
- {boris_behav_obs-9.6.4.dist-info → boris_behav_obs-9.6.6.dist-info}/top_level.txt +0 -0
|
@@ -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
|
-
|
|
12
|
-
|
|
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.
|
|
11
|
-
__version_date__ = "2025-
|
|
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
|
-
|
|
11
|
-
|
|
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))
|
|
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
|
-
|
|
11
|
-
|
|
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))
|
|
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
|
-
|
|
5670
|
-
|
|
5671
|
-
|
|
5672
|
-
|
|
5673
|
-
|
|
5674
|
-
|
|
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
|
boris/observation_operations.py
CHANGED
|
@@ -19,21 +19,25 @@ Copyright 2012-2025 Olivier Friard
|
|
|
19
19
|
MA 02110-1301, USA.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
import os
|
|
22
|
+
|
|
24
23
|
import logging
|
|
25
|
-
import
|
|
26
|
-
import
|
|
24
|
+
from collections import deque
|
|
25
|
+
import datetime as dt
|
|
26
|
+
from decimal import Decimal as dec
|
|
27
27
|
import json
|
|
28
|
-
import
|
|
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
|
-
|
|
32
|
-
import
|
|
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
|
|
boris/project_functions.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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.
|
|
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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boris-behav-obs
|
|
3
|
-
Version: 9.6.
|
|
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.
|
|
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 [ citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications. -->
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
The BORIS paper has more than
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
82
|
-
boris/version.py,sha256=
|
|
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=
|
|
92
|
-
boris/analysis_plugins/irr_cohen_kappa_with_modifiers.py,sha256=
|
|
93
|
-
boris/analysis_plugins/irr_weighted_cohen_kappa.py,sha256=
|
|
94
|
-
boris/analysis_plugins/irr_weighted_cohen_kappa_with_modifiers.py,sha256=
|
|
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.
|
|
106
|
-
boris_behav_obs-9.6.
|
|
107
|
-
boris_behav_obs-9.6.
|
|
108
|
-
boris_behav_obs-9.6.
|
|
109
|
-
boris_behav_obs-9.6.
|
|
110
|
-
boris_behav_obs-9.6.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|