boris-behav-obs 8.27.8__tar.gz → 8.27.10__tar.gz
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_behav_obs-8.27.8/boris_behav_obs.egg-info → boris_behav_obs-8.27.10}/PKG-INFO +1 -112
- boris_behav_obs-8.27.10/README.md +98 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/advanced_event_filtering.py +2 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/behavior_binary_table.py +2 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/config.py +1 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/cooccurence.py +2 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/core.py +6 -6
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/db_functions.py +2 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/event_operations.py +5 -5
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/events_snapshots.py +4 -5
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/export_events.py +10 -10
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/export_observation.py +1 -1
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/geometric_measurement.py +0 -4
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/irr.py +4 -4
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/latency.py +2 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observation.py +7 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/param_panel.py +10 -1
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/param_panel_ui.py +6 -1
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project_functions.py +13 -1
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/select_modifiers.py +1 -1
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/select_observations.py +1 -174
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/select_subj_behav.py +13 -5
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/synthetic_time_budget.py +4 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/time_budget_functions.py +105 -91
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/time_budget_widget.py +2 -16
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/transitions.py +2 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/utilities.py +7 -1
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/version.py +2 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10/boris_behav_obs.egg-info}/PKG-INFO +1 -112
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/SOURCES.txt +1 -1
- boris_behav_obs-8.27.10/boris_behav_obs.egg-info/entry_points.txt +2 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/pyproject.toml +3 -3
- boris_behav_obs-8.27.8/README.rst +0 -110
- boris_behav_obs-8.27.8/boris_behav_obs.egg-info/entry_points.txt +0 -2
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/LICENSE.TXT +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/MANIFEST.in +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/README.TXT +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/__main__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/about.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/add_modifier.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/add_modifier_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/behav_coding_map_creator.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/behaviors_coding_map.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/boris_cli.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/cmd_arguments.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/coding_pad.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/config_file.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/connections.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/converters.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/converters_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/core_qrc.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/core_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/dev.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/dialog.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/duration_widget.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/edit_event.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/edit_event_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/events_cursor.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/exclusion_matrix.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/external_processes.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/gui_utilities.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/image_overlay.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/import_observations.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/map_creator.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/measurement_widget.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/media_file.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/menu_options.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/modifiers_coding_map.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/mpv-1.0.3.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/mpv.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/mpv2.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observation_operations.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observation_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observations_list.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/otx_parser.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/player_dock_widget.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_data_module.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_events.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_events_rt.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_spectrogram_rt.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_waveform_rt.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/const.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/dict.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/func.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/interval.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/io.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/preferences.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/preferences_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project_import_export.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/__main__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/colorsystem.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/dark/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/dark/darkstyle_rc.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/dark/palette.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/example/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/example/__main__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/example/ui/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/light/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/light/lightstyle_rc.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/light/palette.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/palette.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/__init__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/__main__.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/images.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/scss.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qrc_boris.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qrc_boris5.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/state_events.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/subjects_pad.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/video_equalizer.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/video_equalizer_ui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/video_operations.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/vlc_local.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/write_event.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/requires.txt +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/top_level.txt +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/setup.cfg +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_db_functions.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_export_observation.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_irr.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_observation_gui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_otx_parser.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_preferences_gui.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_project_functions.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_time_budget.py +0 -0
- {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: boris-behav-obs
|
|
3
|
-
Version: 8.27.
|
|
3
|
+
Version: 8.27.10
|
|
4
4
|
Summary: BORIS - Behavioral Observation Research Interactive Software
|
|
5
5
|
Author-email: Olivier Friard <olivier.friard@unito.it>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -708,114 +708,3 @@ Requires-Dist: black; extra == "dev"
|
|
|
708
708
|
Requires-Dist: ruff; extra == "dev"
|
|
709
709
|
Requires-Dist: pytest; extra == "dev"
|
|
710
710
|
Requires-Dist: pytest-cov; extra == "dev"
|
|
711
|
-
|
|
712
|
-
===============================================================
|
|
713
|
-
BORIS (Behavioral Observation Research Interactive Software)
|
|
714
|
-
===============================================================
|
|
715
|
-
|
|
716
|
-
.. image:: https://github.com/olivierfriard/BORIS/blob/master/boris/icons/logo_boris.png?raw=true
|
|
717
|
-
:target: https://www.boris.unito.it
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
BORIS is an easy-to-use event logging software for video/audio coding or live observations.
|
|
721
|
-
|
|
722
|
-
BORIS is a free and open-source software available for GNU/Linux and Windows.
|
|
723
|
-
You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see `BORIS on MacOS <https://www.boris.unito.it/download_mac/>`_.
|
|
724
|
-
|
|
725
|
-
It provides also some analysis tools like time budget and some plotting functions.
|
|
726
|
-
|
|
727
|
-
The BORIS paper has more than `1700 citations in peer-reviewed scientific publications <https://www.boris.unito.it/citations/>`_.
|
|
728
|
-
|
|
729
|
-
See http://www.boris.unito.it
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
.. image:: https://img.shields.io/badge/Made%20with-Python-1f425f.svg
|
|
733
|
-
:target: https://www.python.org/
|
|
734
|
-
|
|
735
|
-
.. image:: https://img.shields.io/pypi/pyversions/boris-behav-obs
|
|
736
|
-
|
|
737
|
-
.. image:: https://img.shields.io/pypi/l/boris-behav-obs
|
|
738
|
-
|
|
739
|
-
.. image:: https://static.pepy.tech/personalized-badge/boris-behav-obs?period=total&units=international_system&left_color=black&right_color=orange&left_text=Downloads
|
|
740
|
-
:target: https://pepy.tech/project/boris-behav-obs
|
|
741
|
-
|
|
742
|
-
.. image:: https://img.shields.io/github/commit-activity/m/olivierfriard/BORIS
|
|
743
|
-
|
|
744
|
-
.. image:: https://img.shields.io/pypi/v/boris-behav-obs.svg
|
|
745
|
-
:target: https://pypi.org/project/boris-behav-obs/
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
Documentation
|
|
751
|
-
-----------------------------------------------------------------------
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
The documentation provides a good starting point for learning how to use BORIS: https://www.boris.unito.it/user_guide/
|
|
755
|
-
|
|
756
|
-
Some video tutorials are available: https://www.boris.unito.it/video_tutorials/
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
Bug reports and feature requests
|
|
763
|
-
-----------------------------------------------------------------------
|
|
764
|
-
|
|
765
|
-
To search for bugs, report them or request a feature, please use the github tracker:
|
|
766
|
-
https://github.com/olivierfriard/BORIS/issues
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
Citing BORIS
|
|
773
|
-
-----------------------------------------------------------------------
|
|
774
|
-
|
|
775
|
-
Please acknowledge and cite the use of this software and its authors when
|
|
776
|
-
results are used in publications or published elsewhere. You can use the
|
|
777
|
-
following BibTex entry
|
|
778
|
-
|
|
779
|
-
::
|
|
780
|
-
|
|
781
|
-
@article {MEE3:MEE312584,
|
|
782
|
-
author = {Friard, Olivier and Gamba, Marco},
|
|
783
|
-
title = {BORIS: a free, versatile open-source event-logging software for video/audio coding and live observations},
|
|
784
|
-
journal = {Methods in Ecology and Evolution},
|
|
785
|
-
issn = {2041-210X},
|
|
786
|
-
url = {http://dx.doi.org/10.1111/2041-210X.12584},
|
|
787
|
-
doi = {10.1111/2041-210X.12584},
|
|
788
|
-
pages = {1324--1330},
|
|
789
|
-
keywords = {behavioural analysis, behaviour coding, coding scheme, ethology, observational data, ttime-budget},
|
|
790
|
-
year = {2016},
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
You can also send us a nice postcard! See the `user testimonials <https://www.boris.unito.it/postcards/>`_
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
Licence
|
|
804
|
-
-----------------------------------------------------------------------
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
::
|
|
808
|
-
|
|
809
|
-
This program is distributed in the hope that it will be useful,
|
|
810
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
811
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
812
|
-
GNU General Public License for more details.
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
Distributed with a `GPL v.3 license <LICENSE.TXT>`_
|
|
816
|
-
|
|
817
|
-
Copyright (C) 2012-2024 Olivier Friard
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
BORIS (Behavioral Observation Research Interactive Software)
|
|
2
|
+
===============================================================
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
BORIS is an easy-to-use event logging software for video/audio coding or live observations.
|
|
8
|
+
|
|
9
|
+
BORIS is a free and open-source software available for GNU/Linux and Windows.
|
|
10
|
+
You can not longer run BORIS natively on MacOS (since v.8). Some alternatives to run the last version of BORIS are available, see [BORIS on MacOS](https://www.boris.unito.it/download_mac).
|
|
11
|
+
|
|
12
|
+
It provides also some analysis tools like time budget and some plotting functions.
|
|
13
|
+
|
|
14
|
+
The BORIS paper has more than [ citations](https://www.boris.unito.it/citations) in peer-reviewed scientific publications.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
See the official [BORIS web site](https://www.boris.unito.it).
|
|
20
|
+
|
|
21
|
+
[](https://www.python.org)
|
|
22
|
+

|
|
23
|
+

|
|
24
|
+
[](https://pepy.tech/project/boris-behav-obs)
|
|
25
|
+

|
|
26
|
+
[](https://pypi.org/project/boris-behav-obs/)
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Documentation
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
The [user guide](https://www.boris.unito.it/user_guide/) provides a good starting point for learning how to use BORIS.
|
|
37
|
+
|
|
38
|
+
Some [video tutorials](https://www.boris.unito.it/video_tutorials/) are available.
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Bug reports and feature requests
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
To search for bugs, report them or request a feature, please use the github tracker:
|
|
48
|
+
https://github.com/olivierfriard/BORIS/issues
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# Citing BORIS
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
Please acknowledge and cite the use of this software and its authors when
|
|
58
|
+
results are used in publications or published elsewhere. You can use the
|
|
59
|
+
following BibTex entry
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
@article {MEE3:MEE312584,
|
|
63
|
+
author = {Friard, Olivier and Gamba, Marco},
|
|
64
|
+
title = {BORIS: a free, versatile open-source event-logging software for video/audio coding and live observations},
|
|
65
|
+
journal = {Methods in Ecology and Evolution},
|
|
66
|
+
issn = {2041-210X},
|
|
67
|
+
url = {http://dx.doi.org/10.1111/2041-210X.12584},
|
|
68
|
+
doi = {10.1111/2041-210X.12584},
|
|
69
|
+
pages = {1324--1330},
|
|
70
|
+
year = {2016},
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
You can also send us a nice postcard! See the [user testimonials](https://www.boris.unito.it/postcards).
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# Licence
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
This program is distributed in the hope that it will be useful,
|
|
87
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
88
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
89
|
+
GNU General Public License for more details.
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
Distributed with a [GPL v.3 license](LICENSE.TXT).
|
|
93
|
+
|
|
94
|
+
Copyright (C) 2012-2024 Olivier Friard
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
@@ -358,8 +358,8 @@ def event_filtering(self):
|
|
|
358
358
|
start_coding=start_coding,
|
|
359
359
|
end_coding=end_coding,
|
|
360
360
|
maxTime=max_media_duration_all_obs,
|
|
361
|
-
|
|
362
|
-
|
|
361
|
+
show_include_modifiers=False,
|
|
362
|
+
show_exclude_non_coded_behaviors=False,
|
|
363
363
|
by_category=False,
|
|
364
364
|
n_observations=len(selected_observations),
|
|
365
365
|
)
|
|
@@ -207,8 +207,8 @@ def behavior_binary_table(self):
|
|
|
207
207
|
start_coding=start_coding,
|
|
208
208
|
end_coding=end_coding,
|
|
209
209
|
maxTime=max_media_duration_all_obs,
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
show_include_modifiers=True,
|
|
211
|
+
show_exclude_non_coded_behaviors=True,
|
|
212
212
|
by_category=False,
|
|
213
213
|
n_observations=len(selected_observations),
|
|
214
214
|
)
|
|
@@ -365,6 +365,7 @@ SELECTED_BEHAVIORS = "selected behaviors"
|
|
|
365
365
|
SELECTED_SUBJECTS = "selected subjects"
|
|
366
366
|
INCLUDE_MODIFIERS = "include modifiers"
|
|
367
367
|
EXCLUDE_BEHAVIORS = "exclude behaviors"
|
|
368
|
+
EXCLUDE_NON_CODED_MODIFIERS = "exclude_non_coded_modifiers"
|
|
368
369
|
EXCLUDED_BEHAVIORS = "excluded behaviors"
|
|
369
370
|
TIME_INTERVAL = "time"
|
|
370
371
|
START_TIME = "start time"
|
|
@@ -101,8 +101,8 @@ def get_cooccurence(self):
|
|
|
101
101
|
selected_observations,
|
|
102
102
|
window_title="Select the behaviors",
|
|
103
103
|
n_observations=len(selected_observations),
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
show_include_modifiers=False,
|
|
105
|
+
show_exclude_non_coded_behaviors=True,
|
|
106
106
|
)
|
|
107
107
|
|
|
108
108
|
if parameters == {}: # cancel button pressed
|
|
@@ -774,7 +774,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
774
774
|
"""
|
|
775
775
|
|
|
776
776
|
if not self.pj[cfg.ETHOGRAM]:
|
|
777
|
-
True, []
|
|
777
|
+
return True, []
|
|
778
778
|
|
|
779
779
|
behavior_type = [x.upper() for x in behavior_type]
|
|
780
780
|
|
|
@@ -2750,7 +2750,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
2750
2750
|
start_coding=start_coding,
|
|
2751
2751
|
end_coding=end_coding,
|
|
2752
2752
|
maxTime=max_obs_length,
|
|
2753
|
-
|
|
2753
|
+
show_exclude_non_coded_behaviors=True,
|
|
2754
2754
|
by_category=False,
|
|
2755
2755
|
n_observations=len(selected_observations),
|
|
2756
2756
|
)
|
|
@@ -2849,8 +2849,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
2849
2849
|
start_coding=start_coding,
|
|
2850
2850
|
end_coding=end_coding,
|
|
2851
2851
|
maxTime=max_obs_length if len(selected_observations) > 1 else selectedObsTotalMediaLength,
|
|
2852
|
-
|
|
2853
|
-
|
|
2852
|
+
show_include_modifiers=False,
|
|
2853
|
+
show_exclude_non_coded_behaviors=True,
|
|
2854
2854
|
n_observations=len(selected_observations),
|
|
2855
2855
|
)
|
|
2856
2856
|
|
|
@@ -3730,8 +3730,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
|
|
3730
3730
|
start_coding=start_coding,
|
|
3731
3731
|
end_coding=end_coding,
|
|
3732
3732
|
maxTime=max_media_duration_all_obs,
|
|
3733
|
-
|
|
3734
|
-
|
|
3733
|
+
show_include_modifiers=False,
|
|
3734
|
+
show_exclude_non_coded_behaviors=False,
|
|
3735
3735
|
n_observations=len(selected_observations),
|
|
3736
3736
|
)
|
|
3737
3737
|
if parameters == {}:
|
|
@@ -70,6 +70,7 @@ def load_events_in_db(
|
|
|
70
70
|
"""
|
|
71
71
|
|
|
72
72
|
db = sqlite3.connect(":memory:", isolation_level=None)
|
|
73
|
+
|
|
73
74
|
"""
|
|
74
75
|
import os
|
|
75
76
|
os.system("rm /tmp/ramdisk/events.sqlite")
|
|
@@ -212,6 +213,7 @@ def load_aggregated_events_in_db(
|
|
|
212
213
|
db = sqlite3.connect(":memory:")
|
|
213
214
|
|
|
214
215
|
"""
|
|
216
|
+
# only for debugging
|
|
215
217
|
import os
|
|
216
218
|
os.system("rm /tmp/ramdisk/aggreg.sqlite")
|
|
217
219
|
db = sqlite3.connect("/tmp/ramdisk/aggreg.sqlite", isolation_level=None)
|
|
@@ -222,8 +222,8 @@ def filter_events(self):
|
|
|
222
222
|
start_coding=dec("NaN"),
|
|
223
223
|
end_coding=dec("NaN"),
|
|
224
224
|
maxTime=None,
|
|
225
|
-
|
|
226
|
-
|
|
225
|
+
show_include_modifiers=False,
|
|
226
|
+
show_exclude_non_coded_behaviors=False,
|
|
227
227
|
by_category=False,
|
|
228
228
|
)
|
|
229
229
|
if parameters == {}:
|
|
@@ -983,9 +983,9 @@ def add_frame_indexes(self):
|
|
|
983
983
|
continue
|
|
984
984
|
if not self.seek_mediaplayer(event[0]):
|
|
985
985
|
time.sleep(0.1)
|
|
986
|
-
self.pj[cfg.OBSERVATIONS][self.observationId][cfg.EVENTS][idx][
|
|
987
|
-
|
|
988
|
-
|
|
986
|
+
self.pj[cfg.OBSERVATIONS][self.observationId][cfg.EVENTS][idx][cfg.PJ_OBS_FIELDS[cfg.MEDIA][cfg.FRAME_INDEX]] = (
|
|
987
|
+
self.get_frame_index()
|
|
988
|
+
)
|
|
989
989
|
|
|
990
990
|
self.seek_mediaplayer(mem_time)
|
|
991
991
|
|
|
@@ -21,7 +21,6 @@ Copyright 2012-2024 Olivier Friard
|
|
|
21
21
|
|
|
22
22
|
"""
|
|
23
23
|
|
|
24
|
-
|
|
25
24
|
import logging
|
|
26
25
|
import os
|
|
27
26
|
import pathlib as pl
|
|
@@ -80,8 +79,8 @@ def events_snapshots(self):
|
|
|
80
79
|
selected_observations,
|
|
81
80
|
start_coding=dec("NaN"),
|
|
82
81
|
end_coding=dec("NaN"),
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
show_include_modifiers=False,
|
|
83
|
+
show_exclude_non_coded_behaviors=False,
|
|
85
84
|
n_observations=len(selected_observations),
|
|
86
85
|
)
|
|
87
86
|
|
|
@@ -346,8 +345,8 @@ def extract_events(self):
|
|
|
346
345
|
selected_observations,
|
|
347
346
|
start_coding=dec("NaN"),
|
|
348
347
|
end_coding=dec("NaN"),
|
|
349
|
-
|
|
350
|
-
|
|
348
|
+
show_include_modifiers=False,
|
|
349
|
+
show_exclude_non_coded_behaviors=False,
|
|
351
350
|
)
|
|
352
351
|
if parameters == {}:
|
|
353
352
|
return
|
|
@@ -82,8 +82,8 @@ def export_events_as_behavioral_sequences(self, separated_subjects=False, timed=
|
|
|
82
82
|
start_coding=start_coding,
|
|
83
83
|
end_coding=end_coding,
|
|
84
84
|
maxTime=max_media_duration_all_obs,
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
show_include_modifiers=True,
|
|
86
|
+
show_exclude_non_coded_behaviors=False,
|
|
87
87
|
n_observations=len(selected_observations),
|
|
88
88
|
)
|
|
89
89
|
|
|
@@ -171,8 +171,8 @@ def export_tabular_events(self, mode: str = "tabular") -> None:
|
|
|
171
171
|
start_coding=start_coding,
|
|
172
172
|
end_coding=end_coding,
|
|
173
173
|
maxTime=max_media_duration_all_obs,
|
|
174
|
-
|
|
175
|
-
|
|
174
|
+
show_include_modifiers=False,
|
|
175
|
+
show_exclude_non_coded_behaviors=False,
|
|
176
176
|
n_observations=len(selected_observations),
|
|
177
177
|
)
|
|
178
178
|
if parameters == {}:
|
|
@@ -283,7 +283,7 @@ def export_aggregated_events(self):
|
|
|
283
283
|
- select subjects and behaviors
|
|
284
284
|
- export events in aggregated format
|
|
285
285
|
|
|
286
|
-
Formats can be SQL (sql), SDIS (sds)
|
|
286
|
+
Formats can be SQL (sql), SDIS (sds), Tabular format (tsv, csv, ods, xlsx, xls, html) or Pandas dataframe
|
|
287
287
|
"""
|
|
288
288
|
|
|
289
289
|
def fields_type(max_modif_number: int) -> dict:
|
|
@@ -366,14 +366,14 @@ def export_aggregated_events(self):
|
|
|
366
366
|
start_coding=start_coding,
|
|
367
367
|
end_coding=end_coding,
|
|
368
368
|
maxTime=max_media_duration_all_obs,
|
|
369
|
-
|
|
370
|
-
|
|
369
|
+
show_include_modifiers=False,
|
|
370
|
+
show_exclude_non_coded_behaviors=False,
|
|
371
371
|
n_observations=len(selected_observations),
|
|
372
372
|
)
|
|
373
373
|
if parameters == {}:
|
|
374
374
|
return
|
|
375
375
|
if not parameters[cfg.SELECTED_SUBJECTS] or not parameters[cfg.SELECTED_BEHAVIORS]:
|
|
376
|
-
QMessageBox.warning(None, cfg.programName, "Select subject(s) and behavior(s) to
|
|
376
|
+
QMessageBox.warning(None, cfg.programName, "Select subject(s) and behavior(s) to export")
|
|
377
377
|
return
|
|
378
378
|
|
|
379
379
|
# check for grouping results
|
|
@@ -660,8 +660,8 @@ def export_events_as_textgrid(self) -> None:
|
|
|
660
660
|
selected_observations,
|
|
661
661
|
start_coding=start_coding,
|
|
662
662
|
end_coding=end_coding,
|
|
663
|
-
|
|
664
|
-
|
|
663
|
+
show_include_modifiers=False,
|
|
664
|
+
show_exclude_non_coded_behaviors=False,
|
|
665
665
|
maxTime=max_obs_length,
|
|
666
666
|
n_observations=len(selected_observations),
|
|
667
667
|
)
|
|
@@ -583,7 +583,7 @@ def dataset_write(dataset: tablib.Dataset, file_name: str, output_format: str, d
|
|
|
583
583
|
try:
|
|
584
584
|
if output_format in (cfg.PANDAS_DF_EXT, cfg.RDS_EXT):
|
|
585
585
|
# build pandas dataframe from the tsv export of tablib dataset
|
|
586
|
-
date_type = []
|
|
586
|
+
date_type: list = []
|
|
587
587
|
for field_name in dtype:
|
|
588
588
|
if dtype[field_name] == dt.datetime:
|
|
589
589
|
date_type.append(field_name)
|
|
@@ -547,16 +547,12 @@ def image_clicked(self, n_player: int, event) -> None:
|
|
|
547
547
|
if self.pj[cfg.OBSERVATIONS][self.observationId][cfg.TYPE] == cfg.MEDIA:
|
|
548
548
|
fn = self.dw_player[n_player - 1].player.playlist[self.dw_player[n_player - 1].player.playlist_pos]["filename"]
|
|
549
549
|
|
|
550
|
-
print(f"{fn=}")
|
|
551
|
-
|
|
552
550
|
# check if media file path contained in media list
|
|
553
551
|
if [True for x in self.pj[cfg.OBSERVATIONS][self.observationId]["file"].values() if fn in x]:
|
|
554
552
|
media_file_name = self.dw_player[n_player - 1].player.playlist[self.dw_player[n_player - 1].player.playlist_pos]["filename"]
|
|
555
553
|
else:
|
|
556
554
|
media_file_name = str(pl.Path(fn).relative_to(pl.Path(self.projectFileName).parent))
|
|
557
555
|
|
|
558
|
-
print(f"{media_file_name=}")
|
|
559
|
-
|
|
560
556
|
if self.pj[cfg.OBSERVATIONS][self.observationId][cfg.TYPE] == cfg.IMAGES:
|
|
561
557
|
# check if pictures dir path is relative
|
|
562
558
|
if str(pl.Path(self.images_list[current_frame]).parent) not in self.pj[cfg.OBSERVATIONS][self.observationId].get(
|
|
@@ -288,8 +288,8 @@ def irr_cohen_kappa(self):
|
|
|
288
288
|
selected_observations,
|
|
289
289
|
start_coding=dec("NaN"),
|
|
290
290
|
end_coding=dec("NaN"),
|
|
291
|
-
|
|
292
|
-
|
|
291
|
+
show_include_modifiers=True,
|
|
292
|
+
show_exclude_non_coded_behaviors=False,
|
|
293
293
|
n_observations=len(selected_observations),
|
|
294
294
|
)
|
|
295
295
|
if parameters == {}:
|
|
@@ -581,8 +581,8 @@ def needleman_wunch(self):
|
|
|
581
581
|
selected_observations,
|
|
582
582
|
start_coding=dec("NaN"),
|
|
583
583
|
end_coding=dec("NaN"),
|
|
584
|
-
|
|
585
|
-
|
|
584
|
+
show_include_modifiers=True,
|
|
585
|
+
show_exclude_non_coded_behaviors=False,
|
|
586
586
|
n_observations=len(selected_observations),
|
|
587
587
|
)
|
|
588
588
|
|
|
@@ -83,7 +83,7 @@ def get_latency(self):
|
|
|
83
83
|
parameters: dict = select_subj_behav.choose_obs_subj_behav_category(
|
|
84
84
|
self,
|
|
85
85
|
selected_observations,
|
|
86
|
-
|
|
86
|
+
show_exclude_non_coded_behaviors=False,
|
|
87
87
|
window_title="Select the marker behaviors (stimulus)",
|
|
88
88
|
n_observations=len(selected_observations),
|
|
89
89
|
)
|
|
@@ -102,7 +102,7 @@ def get_latency(self):
|
|
|
102
102
|
print(f"{marker_behaviors=} {marker_subjects=} {include_marker_modifiers=}")
|
|
103
103
|
|
|
104
104
|
parameters: dict = select_subj_behav.choose_obs_subj_behav_category(
|
|
105
|
-
self, selected_observations,
|
|
105
|
+
self, selected_observations, show_exclude_non_coded_behaviors=False, window_title="Select the latency behaviors"
|
|
106
106
|
)
|
|
107
107
|
if not parameters[cfg.SELECTED_SUBJECTS] or not parameters[cfg.SELECTED_BEHAVIORS]:
|
|
108
108
|
return
|
|
@@ -1151,11 +1151,13 @@ class Observation(QDialog, Ui_Form):
|
|
|
1151
1151
|
|
|
1152
1152
|
media_info = util.accurate_media_analysis(self.ffmpeg_bin, file_path)
|
|
1153
1153
|
|
|
1154
|
+
print(f"{media_info=}")
|
|
1155
|
+
|
|
1154
1156
|
if "error" in media_info:
|
|
1155
|
-
return (
|
|
1157
|
+
return (True, media_info["error"])
|
|
1156
1158
|
|
|
1157
1159
|
if media_info["format_long_name"] == "Tele-typewriter":
|
|
1158
|
-
return (
|
|
1160
|
+
return (True, "Text file")
|
|
1159
1161
|
|
|
1160
1162
|
if media_info["duration"] > 0:
|
|
1161
1163
|
if " rel " in mode:
|
|
@@ -1249,6 +1251,9 @@ class Observation(QDialog, Ui_Form):
|
|
|
1249
1251
|
|
|
1250
1252
|
for file_path in file_paths:
|
|
1251
1253
|
(error, msg) = self.check_media(file_path, mode)
|
|
1254
|
+
|
|
1255
|
+
print(f"{(error, msg)=}")
|
|
1256
|
+
|
|
1252
1257
|
if error:
|
|
1253
1258
|
QMessageBox.critical(self, cfg.programName, f"<b>{file_path}</b>. {msg}")
|
|
1254
1259
|
|
|
@@ -20,7 +20,6 @@ This file is part of BORIS.
|
|
|
20
20
|
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
-
|
|
24
23
|
from PyQt5.QtCore import Qt
|
|
25
24
|
from PyQt5.QtWidgets import QDialog
|
|
26
25
|
|
|
@@ -61,6 +60,16 @@ class Param_panel(QDialog, Ui_Dialog):
|
|
|
61
60
|
self.rb_observed_events.clicked.connect(lambda: self.rb_time_interval_selection(cfg.TIME_EVENTS))
|
|
62
61
|
self.rb_user_defined.clicked.connect(lambda: self.rb_time_interval_selection(cfg.TIME_ARBITRARY_INTERVAL))
|
|
63
62
|
|
|
63
|
+
self.cbIncludeModifiers.stateChanged.connect(self.cb_exclude_non_coded_modifiers_visibility)
|
|
64
|
+
|
|
65
|
+
self.cb_exclude_non_coded_modifiers.setVisible(False)
|
|
66
|
+
|
|
67
|
+
def cb_exclude_non_coded_modifiers_visibility(self):
|
|
68
|
+
"""
|
|
69
|
+
set visibility of cb_exclude_non_coded_modifiers
|
|
70
|
+
"""
|
|
71
|
+
self.cb_exclude_non_coded_modifiers.setEnabled(self.cbIncludeModifiers.isChecked())
|
|
72
|
+
|
|
64
73
|
def rb_time_interval_selection(self, button):
|
|
65
74
|
"""
|
|
66
75
|
select the time interval for operation
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Form implementation generated from reading ui file 'boris/param_panel.ui'
|
|
4
4
|
#
|
|
5
|
-
# Created by: PyQt5 UI code generator 5.15.
|
|
5
|
+
# Created by: PyQt5 UI code generator 5.15.6
|
|
6
6
|
#
|
|
7
7
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
|
8
8
|
# run again. Do not edit this file unless you know what you are doing.
|
|
@@ -64,6 +64,10 @@ class Ui_Dialog(object):
|
|
|
64
64
|
self.cbIncludeModifiers = QtWidgets.QCheckBox(Dialog)
|
|
65
65
|
self.cbIncludeModifiers.setObjectName("cbIncludeModifiers")
|
|
66
66
|
self.horizontalLayout_9.addWidget(self.cbIncludeModifiers)
|
|
67
|
+
self.cb_exclude_non_coded_modifiers = QtWidgets.QCheckBox(Dialog)
|
|
68
|
+
self.cb_exclude_non_coded_modifiers.setChecked(True)
|
|
69
|
+
self.cb_exclude_non_coded_modifiers.setObjectName("cb_exclude_non_coded_modifiers")
|
|
70
|
+
self.horizontalLayout_9.addWidget(self.cb_exclude_non_coded_modifiers)
|
|
67
71
|
self.cbExcludeBehaviors = QtWidgets.QCheckBox(Dialog)
|
|
68
72
|
self.cbExcludeBehaviors.setObjectName("cbExcludeBehaviors")
|
|
69
73
|
self.horizontalLayout_9.addWidget(self.cbExcludeBehaviors)
|
|
@@ -177,6 +181,7 @@ class Ui_Dialog(object):
|
|
|
177
181
|
self.pbUnselectAllBehaviors.setText(_translate("Dialog", "Unselect all"))
|
|
178
182
|
self.pbReverseBehaviorsSelection.setText(_translate("Dialog", "Reverse selection"))
|
|
179
183
|
self.cbIncludeModifiers.setText(_translate("Dialog", "Include modifiers"))
|
|
184
|
+
self.cb_exclude_non_coded_modifiers.setText(_translate("Dialog", "Exclude non coded modifiers"))
|
|
180
185
|
self.cbExcludeBehaviors.setText(_translate("Dialog", "Exclude behaviors without events"))
|
|
181
186
|
self.lb_time_bin_size.setText(_translate("Dialog", "Time bin size (s)"))
|
|
182
187
|
self.lb_time_interval.setText(_translate("Dialog", "Time interval"))
|
|
@@ -244,6 +244,18 @@ def check_coded_behaviors_in_obs_list(pj: dict, observations_list: list) -> bool
|
|
|
244
244
|
return False
|
|
245
245
|
|
|
246
246
|
|
|
247
|
+
def get_modifiers_of_behavior(ethogram, behavior: str) -> list:
|
|
248
|
+
"""
|
|
249
|
+
get all modifiers for a behavior (if any)
|
|
250
|
+
"""
|
|
251
|
+
|
|
252
|
+
return [
|
|
253
|
+
[ethogram[x][cfg.MODIFIERS][y]["values"] for y in ethogram[x][cfg.MODIFIERS]]
|
|
254
|
+
for x in ethogram
|
|
255
|
+
if ethogram[x][cfg.BEHAVIOR_CODE] == behavior
|
|
256
|
+
]
|
|
257
|
+
|
|
258
|
+
|
|
247
259
|
def check_coded_behaviors(pj: dict) -> set:
|
|
248
260
|
"""
|
|
249
261
|
check if behaviors coded in events are defined in ethogram for all observations
|
|
@@ -252,7 +264,7 @@ def check_coded_behaviors(pj: dict) -> set:
|
|
|
252
264
|
pj (dict): project dictionary
|
|
253
265
|
|
|
254
266
|
Returns:
|
|
255
|
-
set: behaviors present in observations that are not
|
|
267
|
+
set: behaviors present in observations that are not defined in ethogram
|
|
256
268
|
"""
|
|
257
269
|
|
|
258
270
|
# set of behaviors defined in ethogram
|
|
@@ -80,7 +80,7 @@ class ModifiersList(QDialog):
|
|
|
80
80
|
V2layout.addWidget(lb1)
|
|
81
81
|
|
|
82
82
|
if self.modifiers_dict[idx].get("description", ""):
|
|
83
|
-
lb2 = QLabel(f"<small>{self.modifiers_dict[idx].get('description', '')}</small>")
|
|
83
|
+
lb2 = QLabel(f"<small>{self.modifiers_dict[idx].get('description', '')[:50]}</small>")
|
|
84
84
|
V2layout.addWidget(lb2)
|
|
85
85
|
|
|
86
86
|
if self.modifiers_dict[idx]["type"] in (
|