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.
Files changed (132) hide show
  1. {boris_behav_obs-8.27.8/boris_behav_obs.egg-info → boris_behav_obs-8.27.10}/PKG-INFO +1 -112
  2. boris_behav_obs-8.27.10/README.md +98 -0
  3. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/advanced_event_filtering.py +2 -2
  4. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/behavior_binary_table.py +2 -2
  5. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/config.py +1 -0
  6. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/cooccurence.py +2 -2
  7. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/core.py +6 -6
  8. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/db_functions.py +2 -0
  9. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/event_operations.py +5 -5
  10. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/events_snapshots.py +4 -5
  11. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/export_events.py +10 -10
  12. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/export_observation.py +1 -1
  13. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/geometric_measurement.py +0 -4
  14. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/irr.py +4 -4
  15. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/latency.py +2 -2
  16. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observation.py +7 -2
  17. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/param_panel.py +10 -1
  18. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/param_panel_ui.py +6 -1
  19. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project_functions.py +13 -1
  20. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/select_modifiers.py +1 -1
  21. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/select_observations.py +1 -174
  22. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/select_subj_behav.py +13 -5
  23. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/synthetic_time_budget.py +4 -2
  24. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/time_budget_functions.py +105 -91
  25. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/time_budget_widget.py +2 -16
  26. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/transitions.py +2 -2
  27. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/utilities.py +7 -1
  28. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/version.py +2 -2
  29. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10/boris_behav_obs.egg-info}/PKG-INFO +1 -112
  30. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/SOURCES.txt +1 -1
  31. boris_behav_obs-8.27.10/boris_behav_obs.egg-info/entry_points.txt +2 -0
  32. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/pyproject.toml +3 -3
  33. boris_behav_obs-8.27.8/README.rst +0 -110
  34. boris_behav_obs-8.27.8/boris_behav_obs.egg-info/entry_points.txt +0 -2
  35. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/LICENSE.TXT +0 -0
  36. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/MANIFEST.in +0 -0
  37. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/README.TXT +0 -0
  38. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/__init__.py +0 -0
  39. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/__main__.py +0 -0
  40. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/about.py +0 -0
  41. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/add_modifier.py +0 -0
  42. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/add_modifier_ui.py +0 -0
  43. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/behav_coding_map_creator.py +0 -0
  44. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/behaviors_coding_map.py +0 -0
  45. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/boris_cli.py +0 -0
  46. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/cmd_arguments.py +0 -0
  47. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/coding_pad.py +0 -0
  48. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/config_file.py +0 -0
  49. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/connections.py +0 -0
  50. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/converters.py +0 -0
  51. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/converters_ui.py +0 -0
  52. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/core_qrc.py +0 -0
  53. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/core_ui.py +0 -0
  54. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/dev.py +0 -0
  55. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/dialog.py +0 -0
  56. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/duration_widget.py +0 -0
  57. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/edit_event.py +0 -0
  58. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/edit_event_ui.py +0 -0
  59. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/events_cursor.py +0 -0
  60. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/exclusion_matrix.py +0 -0
  61. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/external_processes.py +0 -0
  62. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/gui_utilities.py +0 -0
  63. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/image_overlay.py +0 -0
  64. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/import_observations.py +0 -0
  65. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/map_creator.py +0 -0
  66. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/measurement_widget.py +0 -0
  67. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/media_file.py +0 -0
  68. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/menu_options.py +0 -0
  69. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/modifiers_coding_map.py +0 -0
  70. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/mpv-1.0.3.py +0 -0
  71. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/mpv.py +0 -0
  72. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/mpv2.py +0 -0
  73. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observation_operations.py +0 -0
  74. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observation_ui.py +0 -0
  75. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/observations_list.py +0 -0
  76. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/otx_parser.py +0 -0
  77. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/player_dock_widget.py +0 -0
  78. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_data_module.py +0 -0
  79. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_events.py +0 -0
  80. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_events_rt.py +0 -0
  81. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_spectrogram_rt.py +0 -0
  82. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/plot_waveform_rt.py +0 -0
  83. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/__init__.py +0 -0
  84. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/const.py +0 -0
  85. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/dict.py +0 -0
  86. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/func.py +0 -0
  87. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/interval.py +0 -0
  88. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/portion/io.py +0 -0
  89. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/preferences.py +0 -0
  90. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/preferences_ui.py +0 -0
  91. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project.py +0 -0
  92. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project_import_export.py +0 -0
  93. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/project_ui.py +0 -0
  94. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/__init__.py +0 -0
  95. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/__main__.py +0 -0
  96. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/colorsystem.py +0 -0
  97. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/dark/__init__.py +0 -0
  98. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/dark/darkstyle_rc.py +0 -0
  99. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/dark/palette.py +0 -0
  100. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/example/__init__.py +0 -0
  101. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/example/__main__.py +0 -0
  102. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/example/ui/__init__.py +0 -0
  103. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/light/__init__.py +0 -0
  104. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/light/lightstyle_rc.py +0 -0
  105. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/light/palette.py +0 -0
  106. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/palette.py +0 -0
  107. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/__init__.py +0 -0
  108. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/__main__.py +0 -0
  109. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/images.py +0 -0
  110. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qdarkstyle/utils/scss.py +0 -0
  111. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qrc_boris.py +0 -0
  112. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/qrc_boris5.py +0 -0
  113. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/state_events.py +0 -0
  114. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/subjects_pad.py +0 -0
  115. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/video_equalizer.py +0 -0
  116. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/video_equalizer_ui.py +0 -0
  117. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/video_operations.py +0 -0
  118. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/vlc_local.py +0 -0
  119. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris/write_event.py +0 -0
  120. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/dependency_links.txt +0 -0
  121. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/requires.txt +0 -0
  122. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/boris_behav_obs.egg-info/top_level.txt +0 -0
  123. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/setup.cfg +0 -0
  124. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_db_functions.py +0 -0
  125. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_export_observation.py +0 -0
  126. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_irr.py +0 -0
  127. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_observation_gui.py +0 -0
  128. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_otx_parser.py +0 -0
  129. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_preferences_gui.py +0 -0
  130. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_project_functions.py +0 -0
  131. {boris_behav_obs-8.27.8 → boris_behav_obs-8.27.10}/tests/test_time_budget.py +0 -0
  132. {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.8
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
+ ![BORIS logo](https://github.com/olivierfriard/BORIS/blob/master/boris/icons/logo_boris.png?raw=true)
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 [![BORIS citations counter](http://penelope.unito.it/friard/boris_scopus_citations.png) 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
+ [![Python web site](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org)
22
+ ![Python versions](https://img.shields.io/pypi/pyversions/boris-behav-obs)
23
+ ![BORIS license](https://img.shields.io/pypi/l/boris-behav-obs)
24
+ [![Number of downloads](https://static.pepy.tech/personalized-badge/boris-behav-obs?period=total&units=international_system&left_color=black&right_color=orange&left_text=Downloads)](https://pepy.tech/project/boris-behav-obs)
25
+ ![commit-activity](https://img.shields.io/github/commit-activity/m/olivierfriard/BORIS)
26
+ [![PyPI version](https://img.shields.io/pypi/v/boris-behav-obs.svg)](https://pypi.org/project/boris-behav-obs/)
27
+ ![BORIS scopus citations badge](http://penelope.unito.it/friard/boris_scopus_citations.svg)
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
- flagShowIncludeModifiers=False,
362
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowIncludeModifiers=True,
211
- flagShowExcludeBehaviorsWoEvents=True,
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
- flagShowIncludeModifiers=False,
105
- flagShowExcludeBehaviorsWoEvents=True,
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
- flagShowExcludeBehaviorsWoEvents=True,
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
- flagShowIncludeModifiers=False,
2853
- flagShowExcludeBehaviorsWoEvents=True,
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
- flagShowIncludeModifiers=False,
3734
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowIncludeModifiers=False,
226
- flagShowExcludeBehaviorsWoEvents=False,
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
- cfg.PJ_OBS_FIELDS[cfg.MEDIA][cfg.FRAME_INDEX]
988
- ] = self.get_frame_index()
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
- flagShowIncludeModifiers=False,
84
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowIncludeModifiers=False,
350
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowIncludeModifiers=True,
86
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowIncludeModifiers=False,
175
- flagShowExcludeBehaviorsWoEvents=False,
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) or Tabular format (tsv, csv, ods, xlsx, xls, html)
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
- flagShowIncludeModifiers=False,
370
- flagShowExcludeBehaviorsWoEvents=False,
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 analyze")
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
- flagShowIncludeModifiers=False,
664
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowIncludeModifiers=True,
292
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowIncludeModifiers=True,
585
- flagShowExcludeBehaviorsWoEvents=False,
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
- flagShowExcludeBehaviorsWoEvents=False,
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, flagShowExcludeBehaviorsWoEvents=False, window_title="Select the latency behaviors"
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 (False, media_info["error"])
1157
+ return (True, media_info["error"])
1156
1158
 
1157
1159
  if media_info["format_long_name"] == "Tele-typewriter":
1158
- return (False, "Text file")
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.4
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 define in ethogram
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 (