UnitMatchPy 2.1__tar.gz → 2.4__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.
- UnitMatchPy-2.4/PKG-INFO +40 -0
- UnitMatchPy-2.4/README.md +31 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/GUI.py +6 -3
- UnitMatchPy-2.4/UnitMatchPy/GUI_icon.png +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/Overlord.py +0 -1
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/Save_utils.py +6 -6
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/assign_unique_id.py +1 -1
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/default_params.py +1 -2
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/metric_functions.py +34 -23
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/utils.py +55 -3
- UnitMatchPy-2.4/UnitMatchPy.egg-info/PKG-INFO +40 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy.egg-info/SOURCES.txt +1 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/setup.py +1 -1
- UnitMatchPy-2.1/PKG-INFO +0 -38
- UnitMatchPy-2.1/README.md +0 -29
- UnitMatchPy-2.1/UnitMatchPy.egg-info/PKG-INFO +0 -38
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/LICENSE +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/MANIFEST.in +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/Extract_raw_data.py +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/LICENSE +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/README.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awdark.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awlight.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awtemplate.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awthemes.n7 +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awthemes.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awwinxpblue.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/colorutils.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demoscaled.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demoscaledb.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demottk.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/README.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-left-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-right-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-up-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-up-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-left-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-right-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-up-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-left-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-right-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-up-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-left-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-left-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-right-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-up-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-up-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-p.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-af-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-af.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-f.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-p.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sa-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sa.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-ua.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sa-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sa.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-ua.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sa.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-ua.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-f.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-d-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/empty/empty/empty.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-f.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/labelframe/square/labelframe-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/labelframe/square/labelframe-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-d-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-h.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-i-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-i.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-h.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-i-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-i.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-a.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-d.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-h.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-i-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-i.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/diag-mask.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sa.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-ua.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sa.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-ua.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sa.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-ua.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-ud.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-un.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-ha.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-ha.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vn-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-vd.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-vn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/settings.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-h-grip-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-h-grip.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-v-grip-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-v-grip.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/sizegrip/circle/sizegrip-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/sizegrip/circle/sizegrip.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-right-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-n-base.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-n.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-sn.svg +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/pkgIndex.tcl +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/UM Logo.ico +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/UnitMatchPy.egg-info/PKG-INFO +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/UnitMatchPy.egg-info/SOURCES.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/UnitMatchPy.egg-info/dependency_links.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/UnitMatchPy.egg-info/requires.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/UnitMatchPy.egg-info/top_level.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__init__.py +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/AssignUniqueID.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Bayes_fun.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Bayes_fun.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Extract_raw_data.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Extract_raw_data.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/GUI.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/GUI.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Metrics_fun.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Metrics_fun.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Overlord.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Overlord.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Param_fun.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Param_fun.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Save_utils.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/Save_utils.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/__init__.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/__init__.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/utils.cpython-311.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/__pycache__/utils.cpython-312.pyc +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/bayes_functions.py +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/param_functions.py +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy.egg-info/dependency_links.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy.egg-info/requires.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy.egg-info/top_level.txt +0 -0
- {UnitMatchPy-2.1 → UnitMatchPy-2.4}/setup.cfg +0 -0
UnitMatchPy-2.4/PKG-INFO
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: UnitMatchPy
|
|
3
|
+
Version: 2.4
|
|
4
|
+
Author: Enny van Beest, Celian Bimbard and Sam Dodgson
|
|
5
|
+
Author-email: e.beest@ucl.ac.uk
|
|
6
|
+
Requires-Python: >=3.7
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
|
|
10
|
+
# Unit Match - Python
|
|
11
|
+
|
|
12
|
+
## Run UMPy
|
|
13
|
+
|
|
14
|
+
To run UMPy standard spike sorting data is needed; channel positions and 2 extracted raw waveforms for each unit. This can be calculated externally [BombCell](https://github.com/Julie-Fabre/bombcell) or using *extract_raw_demo.ipynb* to extract these waveforms from compressed data (.cbin and .ch) or raw data. There is also a [Spike Interface](https://spikeinterface.readthedocs.io/en/latest/) integrated notebook *UMPy_spike_interface_demo.ipynb* which uses spike interface to get this data.
|
|
15
|
+
Be careful not to mix and match the different ways of extracting raw waveforms, as there are difference between the methods.
|
|
16
|
+
|
|
17
|
+
There are to example notebooks for running UMPy *UMPy_example.ipynb* and *UMPy_example_detailed.ipynb*. These notebooks will guide you through running Unit Match all you need to supply is paths to the data. *UMPy_example.ipynb* is recommended to use first as it is simpler, however *UMPy_example_detailed.ipynb* may be useful in unique cases as it is more modular.
|
|
18
|
+
|
|
19
|
+
The GUI is a optional step to curated and investigate the information Unit Match has calculated; for efficient usage of the GUI please look at *GUI_Reference_Guide.md* in the Demo Notebooks folder.
|
|
20
|
+
|
|
21
|
+
## Dependencies
|
|
22
|
+
|
|
23
|
+
This version relies on many core python packages: [numpy](https://numpy.org/), [scipy](https://scipy.org/), [JobLib](https://joblib.readthedocs.io/en/stable/), [pandas](https://pandas.pydata.org/), [tkinter](https://docs.python.org/3/library/tkinter.html) and [matplotlib](https://matplotlib.org/). All of these libaries come with a [Anaconda](https://www.anaconda.com/download/) version of python.
|
|
24
|
+
For extracting raw data, the library [mtscomp](https://github.com/int-brain-lab/mtscomp) is needed, and can be installed by `pip install mtscomp`.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
## Installation
|
|
28
|
+
|
|
29
|
+
After creating an python environment
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
conda create --name UnitMatch python
|
|
33
|
+
conda activate UnitMatch
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
You can install UnitMatchPy with pip. It will automatically install all the dependencies.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
pip install UnitMatchPy
|
|
40
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Unit Match - Python
|
|
2
|
+
|
|
3
|
+
## Run UMPy
|
|
4
|
+
|
|
5
|
+
To run UMPy standard spike sorting data is needed; channel positions and 2 extracted raw waveforms for each unit. This can be calculated externally [BombCell](https://github.com/Julie-Fabre/bombcell) or using *extract_raw_demo.ipynb* to extract these waveforms from compressed data (.cbin and .ch) or raw data. There is also a [Spike Interface](https://spikeinterface.readthedocs.io/en/latest/) integrated notebook *UMPy_spike_interface_demo.ipynb* which uses spike interface to get this data.
|
|
6
|
+
Be careful not to mix and match the different ways of extracting raw waveforms, as there are difference between the methods.
|
|
7
|
+
|
|
8
|
+
There are to example notebooks for running UMPy *UMPy_example.ipynb* and *UMPy_example_detailed.ipynb*. These notebooks will guide you through running Unit Match all you need to supply is paths to the data. *UMPy_example.ipynb* is recommended to use first as it is simpler, however *UMPy_example_detailed.ipynb* may be useful in unique cases as it is more modular.
|
|
9
|
+
|
|
10
|
+
The GUI is a optional step to curated and investigate the information Unit Match has calculated; for efficient usage of the GUI please look at *GUI_Reference_Guide.md* in the Demo Notebooks folder.
|
|
11
|
+
|
|
12
|
+
## Dependencies
|
|
13
|
+
|
|
14
|
+
This version relies on many core python packages: [numpy](https://numpy.org/), [scipy](https://scipy.org/), [JobLib](https://joblib.readthedocs.io/en/stable/), [pandas](https://pandas.pydata.org/), [tkinter](https://docs.python.org/3/library/tkinter.html) and [matplotlib](https://matplotlib.org/). All of these libaries come with a [Anaconda](https://www.anaconda.com/download/) version of python.
|
|
15
|
+
For extracting raw data, the library [mtscomp](https://github.com/int-brain-lab/mtscomp) is needed, and can be installed by `pip install mtscomp`.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
After creating an python environment
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
conda create --name UnitMatch python
|
|
24
|
+
conda activate UnitMatch
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
You can install UnitMatchPy with pip. It will automatically install all the dependencies.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
pip install UnitMatchPy
|
|
31
|
+
```
|
|
@@ -55,14 +55,17 @@ def run_GUI():
|
|
|
55
55
|
not_match = []
|
|
56
56
|
root = Tk()
|
|
57
57
|
# downloaded theme from https://sourceforge.net/projects/tcl-awthemes/
|
|
58
|
-
|
|
58
|
+
theme_path_rel = os.path.normpath(r'TkinterTheme\awthemes-10.4.0')
|
|
59
|
+
theme_path = os.path.join(os.path.dirname(os.path.abspath(__file__)) , theme_path_rel)
|
|
60
|
+
|
|
59
61
|
root.tk.call('lappend', 'auto_path', theme_path)
|
|
60
62
|
root.tk.call('package', 'require', 'awdark')
|
|
61
63
|
s = ttk.Style(root)
|
|
62
64
|
s.theme_use('awdark')
|
|
63
65
|
root.title('UMPy - Manual Curation')
|
|
64
66
|
#root.geometry('800x800')
|
|
65
|
-
|
|
67
|
+
icon = PhotoImage(file = os.path.join(os.path.dirname(os.path.abspath(__file__)) , 'GUI_icon.png'))
|
|
68
|
+
root.iconphoto(False, icon)
|
|
66
69
|
background = ttk.Frame(root)
|
|
67
70
|
background.place(x=0, y=0, relwidth=1.0, relheight=1.0)
|
|
68
71
|
|
|
@@ -909,7 +912,7 @@ def add_original_ID(UnitA, UnitB):
|
|
|
909
912
|
if original_id_label.winfo_exists():
|
|
910
913
|
original_id_label.destroy()
|
|
911
914
|
|
|
912
|
-
original_id_label = ttk.Label(root, text = f'The Original Unit IDs are:\nUnit A: {int(clus_info["
|
|
915
|
+
original_id_label = ttk.Label(root, text = f'The Original Unit IDs are:\nUnit A: {int(clus_info["original_ids"][UnitA].squeeze())} Unit B: {int(clus_info["original_ids"][UnitB].squeeze())}', borderwidth = 2 , relief= 'groove')
|
|
913
916
|
original_id_label.grid( row = 0, column = 2, ipadx = 5, ipady = 5)
|
|
914
917
|
|
|
915
918
|
|
|
Binary file
|
|
@@ -124,7 +124,6 @@ def extract_metric_scores(extracted_wave_properties, session_switch, within_sess
|
|
|
124
124
|
thrs_opt = mf.get_threshold(total_score, within_session, euclid_dist, param, is_first_pass = False)
|
|
125
125
|
param['n_expected_matches'] = np.sum( (total_score > thrs_opt).astype(int))
|
|
126
126
|
prior_match = 1 - ( param['n_expected_matches'] / len(include_these_pairs))
|
|
127
|
-
|
|
128
127
|
thrs_opt = np.quantile(total_score[include_these_pairs_idx.astype(bool)], prior_match)
|
|
129
128
|
candidate_pairs = total_score > thrs_opt
|
|
130
129
|
|
|
@@ -5,7 +5,7 @@ import numpy as np
|
|
|
5
5
|
|
|
6
6
|
def make_match_table(scores_to_include, matches, output_prob, total_score, output_threshold, clus_info, param, UIDs = None, matches_curated = None):
|
|
7
7
|
"""
|
|
8
|
-
Creates the match table showing information for every pair of units
|
|
8
|
+
Creates the match table showing information for every pair of units.
|
|
9
9
|
|
|
10
10
|
Parameters
|
|
11
11
|
----------
|
|
@@ -46,8 +46,8 @@ def make_match_table(scores_to_include, matches, output_prob, total_score, outpu
|
|
|
46
46
|
unit_a_list = xx.reshape(n_units*n_units)
|
|
47
47
|
unit_b_list = yy.reshape(n_units*n_units)
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
xx, yy = np.meshgrid(
|
|
49
|
+
session_id = clus_info['session_id']
|
|
50
|
+
xx, yy = np.meshgrid(session_id, session_id)
|
|
51
51
|
unit_a_session_list = xx.reshape(n_units*n_units) + 1 # Add one here so it counts from one not 0
|
|
52
52
|
unit_b_session_list = yy.reshape(n_units*n_units) + 1
|
|
53
53
|
|
|
@@ -442,10 +442,10 @@ def save_prob_for_phy(probability, param, clus_info):
|
|
|
442
442
|
session_output = probability[session_switch[sid]:session_switch[sid+1], session_switch[sid]:session_switch[sid+1]]
|
|
443
443
|
#If Only good units where used add values know to a matrix of NaNs
|
|
444
444
|
if session_switch[sid+1] - session_switch[sid] != n_units_per_session[sid]:
|
|
445
|
-
all_good_units = clus_info['
|
|
446
|
-
for id, gid in enumerate(clus_info['
|
|
445
|
+
all_good_units = clus_info['good_units'][sid].squeeze().astype(int)
|
|
446
|
+
for id, gid in enumerate(clus_info['good_units'][sid].astype(int)):
|
|
447
447
|
matrix_prob[gid, all_good_units] = session_output[id,:]
|
|
448
448
|
else:
|
|
449
449
|
matrix_prob = session_output
|
|
450
450
|
|
|
451
|
-
np.save(save_file_tmp, matrix_prob)
|
|
451
|
+
np.save(save_file_tmp, matrix_prob)
|
|
@@ -42,7 +42,7 @@ def assign_unique_id(output_prob_array, param, clus_info):
|
|
|
42
42
|
List
|
|
43
43
|
A list of arrays which gives each unit its group ID for each case
|
|
44
44
|
"""
|
|
45
|
-
all_cluster_ids = clus_info['
|
|
45
|
+
all_cluster_ids = clus_info['original_ids'] # each units has unique ID
|
|
46
46
|
|
|
47
47
|
#create arrays for the unique ids
|
|
48
48
|
unique_id_liberal = np.arange(all_cluster_ids.shape[0])
|
|
@@ -23,8 +23,7 @@ def get_default_param(param = None):
|
|
|
23
23
|
'stepsz' : 0.01, # size of of a step in probability distributions
|
|
24
24
|
'smooth_prob' : 9, # probability smoothing size
|
|
25
25
|
'min_angle_dist' : 0.1, # smallest distance for and angle to be consider
|
|
26
|
-
'
|
|
27
|
-
'shank_dist' : 175, # distance between shanks
|
|
26
|
+
'min_new_shank_distance' : 100, #The smallest distance which separates 2 shanks
|
|
28
27
|
'units_per_shank_thrs' : 15, # threshold for doing per shank drift correction
|
|
29
28
|
'match_threshold' : 0.5 # probability threshold to consider as a match
|
|
30
29
|
}
|
|
@@ -506,7 +506,6 @@ def drift_correction_basic(candidate_pairs, session_switch, avg_centroid, avg_wa
|
|
|
506
506
|
|
|
507
507
|
drift = np.nanmedian( np.nanmean( avg_centroid[:, best_pairs[idx,0].squeeze(),:], axis = 2) - np.nanmean( avg_centroid[:,best_pairs[idx,1].squeeze(),:], axis = 2), axis = 1)
|
|
508
508
|
|
|
509
|
-
|
|
510
509
|
##need to add the drift to the location
|
|
511
510
|
avg_waveform_per_tp[0,session_switch[1]:,:,:] += drift[0]
|
|
512
511
|
avg_waveform_per_tp[1,session_switch[1]:,:,:] += drift[1]
|
|
@@ -547,7 +546,7 @@ def apply_drift_correction_basic(pairs, sid, session_switch, avg_centroid, avg_w
|
|
|
547
546
|
##need to add the drift to the location
|
|
548
547
|
avg_waveform_per_tp[0,session_switch[sid+1]:session_switch[sid+2],:,:] += drift[0]
|
|
549
548
|
avg_waveform_per_tp[1,session_switch[sid+1]:session_switch[sid+2],:,:] += drift[1]
|
|
550
|
-
avg_waveform_per_tp[2,session_switch[sid+1]:session_switch[sid
|
|
549
|
+
avg_waveform_per_tp[2,session_switch[sid+1]:session_switch[sid+2],:,:] += drift[2]
|
|
551
550
|
|
|
552
551
|
avg_centroid[0,session_switch[sid+1]:session_switch[sid+2],:] += drift[0]
|
|
553
552
|
avg_centroid[1,session_switch[sid+1]:session_switch[sid+2],:] += drift[1]
|
|
@@ -555,7 +554,7 @@ def apply_drift_correction_basic(pairs, sid, session_switch, avg_centroid, avg_w
|
|
|
555
554
|
|
|
556
555
|
return drift, avg_waveform_per_tp, avg_centroid
|
|
557
556
|
|
|
558
|
-
def
|
|
557
|
+
def apply_drift_correction_per_shank(pairs, sid, session_switch, avg_centroid, avg_waveform_per_tp, param):
|
|
559
558
|
"""
|
|
560
559
|
This is the same as "basic" drift correction, however treats each shank separately, if there is enough units per shank
|
|
561
560
|
|
|
@@ -587,18 +586,23 @@ def appply_drift_correction_per_shank(pairs, sid, session_switch, avg_centroid,
|
|
|
587
586
|
|
|
588
587
|
max_dist = 0
|
|
589
588
|
min_dist = 0
|
|
590
|
-
drift_per_shank = np.zeros([
|
|
589
|
+
drift_per_shank = np.zeros([n_shanks,3])
|
|
591
590
|
|
|
592
591
|
for i in range(n_shanks):
|
|
593
|
-
max_dist += shank_dist
|
|
592
|
+
max_dist += shank_dist #beginning of loop shift maximum distance
|
|
594
593
|
|
|
595
|
-
#
|
|
594
|
+
#get which shank each unit is on
|
|
596
595
|
correct_shank_a = np.logical_and(centroid_a[1,:] < max_dist, centroid_a[1,:] > min_dist)
|
|
597
596
|
correct_shank_b = np.logical_and(centroid_b[1,:] < max_dist, centroid_b[1,:] > min_dist)
|
|
598
597
|
|
|
599
598
|
if np.all(correct_shank_a == correct_shank_b) != True:
|
|
600
599
|
print(f'These pairs may be bad {np.argwhere(correct_shank_a != correct_shank_b)}')
|
|
600
|
+
#delete pairs which are on different shanks ##sam's fix
|
|
601
|
+
bad_idxs = np.argwhere(correct_shank_a != correct_shank_b)
|
|
602
|
+
correct_shank_a = np.delete(correct_shank_a, bad_idxs)
|
|
603
|
+
correct_shank_b = np.delete(correct_shank_b, bad_idxs)
|
|
601
604
|
|
|
605
|
+
|
|
602
606
|
drifts = centroid_a[:,correct_shank_a] - centroid_b[:,correct_shank_b]
|
|
603
607
|
drift = np.nanmedian(drifts, axis = 1)
|
|
604
608
|
drift_per_shank[i,:] = drift
|
|
@@ -694,25 +698,31 @@ def test_matches_per_shank(pairs, avg_centroid, sid, param):
|
|
|
694
698
|
n_shanks = param['no_shanks']
|
|
695
699
|
shank_dist = param['shank_dist']
|
|
696
700
|
|
|
697
|
-
|
|
698
|
-
|
|
701
|
+
if n_shanks != 1:
|
|
702
|
+
for i in range(n_shanks):
|
|
703
|
+
max_dist += shank_dist
|
|
699
704
|
|
|
700
|
-
|
|
701
|
-
|
|
705
|
+
correct_shank_a = np.logical_and(centroid_a[1,:] < max_dist, centroid_a[1,:] > min_dist)
|
|
706
|
+
correct_shank_b = np.logical_and(centroid_b[1,:] < max_dist, centroid_b[1,:] > min_dist)
|
|
702
707
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
708
|
+
if np.all(correct_shank_a == correct_shank_b) != True:
|
|
709
|
+
print(f'These pairs may be bad {np.argwhere(correct_shank_a != correct_shank_b)}')
|
|
710
|
+
#delete pairs which are one different shanks
|
|
711
|
+
bad_idxs = np.argwhere(correct_shank_a != correct_shank_b)
|
|
712
|
+
correct_shank_a = np.delete(correct_shank_a, bad_idxs)
|
|
713
|
+
correct_shank_b = np.delete(correct_shank_b, bad_idxs)
|
|
714
|
+
|
|
715
|
+
shank_id_tmp[correct_shank_a] = i
|
|
707
716
|
|
|
708
|
-
|
|
717
|
+
min_dist += shank_dist
|
|
709
718
|
|
|
710
|
-
|
|
719
|
+
__, counts = np.unique(shank_id_tmp, return_counts=True)
|
|
711
720
|
|
|
712
|
-
|
|
721
|
+
if np.any(counts < units_per_shank_thrs):
|
|
722
|
+
do_per_shank_correction = False
|
|
723
|
+
print(f'Session pair {sid+1}/{sid+2} has {counts} matches per shank, which is below threshold to do per shank drift correction')
|
|
724
|
+
else:
|
|
713
725
|
do_per_shank_correction = False
|
|
714
|
-
print(f'Session pair {sid+1}/{sid+2} has {counts} matches per shank, which is below threshold to do per shank drift correction')
|
|
715
|
-
|
|
716
726
|
return do_per_shank_correction
|
|
717
727
|
|
|
718
728
|
|
|
@@ -765,13 +775,14 @@ def drift_n_sessions(candidate_pairs, session_switch, avg_centroid, avg_waveform
|
|
|
765
775
|
|
|
766
776
|
#Test to see if there are enough matches to do drift correction per shank
|
|
767
777
|
if test_matches_per_shank(pairs, avg_centroid, did, param) == True and best_drift == True:
|
|
768
|
-
drifts = np.zeros( (n_sessions - 1, param['no_shanks'], 3))
|
|
769
|
-
drifts[did,:,:], avg_waveform_per_tp, avg_centroid =
|
|
778
|
+
drifts = np.zeros( (n_sessions - 1, param['no_shanks'], 3))
|
|
779
|
+
drifts[did,:,:], avg_waveform_per_tp, avg_centroid = apply_drift_correction_per_shank(pairs, did, session_switch, avg_centroid, avg_waveform_per_tp, param)
|
|
770
780
|
print(f'Done drift correction per shank for session pair {did+1} and {did+2}')
|
|
771
|
-
|
|
781
|
+
elif len(pairs)>0: #if there exist pairs across sessions:
|
|
772
782
|
drifts = np.zeros( (n_sessions - 1, 3))
|
|
773
783
|
drifts[did,:], avg_waveform_per_tp, avg_centroid = apply_drift_correction_basic(pairs, did, session_switch, avg_centroid, avg_waveform_per_tp)
|
|
774
|
-
|
|
784
|
+
elif len(pairs)==0:
|
|
785
|
+
print('No pairs across sessions to perform drift correction.')
|
|
775
786
|
return drifts, avg_centroid, avg_waveform_per_tp
|
|
776
787
|
|
|
777
788
|
|
|
@@ -124,19 +124,23 @@ def load_good_waveforms(wave_paths, unit_label_paths, param, good_units_only = T
|
|
|
124
124
|
|
|
125
125
|
good_units = []
|
|
126
126
|
n_units_per_session_all = []
|
|
127
|
+
all_units = []
|
|
127
128
|
|
|
128
129
|
for i in range(len(unit_label_paths)):
|
|
129
130
|
#see if bombcell unit labels
|
|
130
131
|
if os.path.split(unit_label_paths[0])[1] == 'cluster_bc_unitType.tsv':
|
|
131
132
|
unit_label = load_tsv(unit_label_paths[i])
|
|
132
133
|
tmp_idx = np.array([s for s in unit_label if 'GOOD' in s or 'NON-SOMA GOOD' in s])[:,0].astype(np.int32)
|
|
134
|
+
tmp_idx = tmp_idx[:, np.newaxis] # keep the array shape consitant between different methodss
|
|
133
135
|
else:
|
|
134
136
|
unit_label = load_tsv(unit_label_paths[i])
|
|
135
137
|
tmp_idx = np.argwhere(unit_label[:,1] == 'good')
|
|
136
138
|
|
|
139
|
+
|
|
137
140
|
n_units_per_session_all.append(unit_label.shape[0])
|
|
138
141
|
good_unit_idx = unit_label[tmp_idx, 0]
|
|
139
142
|
good_units.append(good_unit_idx)
|
|
143
|
+
all_units.append(unit_label[:,0]) #get all the unit labels
|
|
140
144
|
|
|
141
145
|
waveforms = []
|
|
142
146
|
if good_units_only:
|
|
@@ -160,16 +164,17 @@ def load_good_waveforms(wave_paths, unit_label_paths, param, good_units_only = T
|
|
|
160
164
|
else:
|
|
161
165
|
for ls in range(len(wave_paths)):
|
|
162
166
|
#load in the first good unit, to get the shape of each waveform
|
|
163
|
-
p_file = os.path.join(wave_paths[ls],f'Unit{int(
|
|
167
|
+
p_file = os.path.join(wave_paths[ls],f'Unit{int(all_units[ls][0])}_RawSpikes.npy')
|
|
164
168
|
tmp = np.load(p_file)
|
|
165
169
|
tmp_waveform = np.zeros( (len(os.listdir(wave_paths[ls])), tmp.shape[0], tmp.shape[1], tmp.shape[2]))
|
|
166
170
|
|
|
167
171
|
for i in range(len(os.listdir(wave_paths[ls]))):
|
|
168
172
|
#loads in all GoodUnits for that session
|
|
169
|
-
p_file_good = os.path.join(wave_paths[ls], f'Unit{int(
|
|
173
|
+
p_file_good = os.path.join(wave_paths[ls], f'Unit{int(all_units[ls][i])}_RawSpikes.npy')
|
|
170
174
|
tmp_waveform[i] = np.load(p_file_good)
|
|
171
175
|
#adds that session to the list
|
|
172
176
|
waveforms.append(tmp_waveform)
|
|
177
|
+
print(f'UnitMatch is treating all the units as good and including all units from {wave_paths[ls]}, we recommended using curated data!')
|
|
173
178
|
|
|
174
179
|
del tmp_waveform
|
|
175
180
|
del tmp
|
|
@@ -228,6 +233,7 @@ def get_good_units(unit_label_paths, good = True):
|
|
|
228
233
|
tmp_idx = np.array([s for s in unit_label if 'GOOD' in s or 'NON-SOMA GOOD' in s])[:,0].astype(np.int32)
|
|
229
234
|
else:
|
|
230
235
|
tmp_idx = unit_label[:,0].astype(np.int32)
|
|
236
|
+
tmp_idx = tmp_idx[:, np.newaxis] # keep the array shape consitant between different methodss
|
|
231
237
|
else:
|
|
232
238
|
unit_label = load_tsv(unit_label_paths[i])
|
|
233
239
|
if good == True:
|
|
@@ -602,4 +608,50 @@ def paths_from_KS(KS_dirs):
|
|
|
602
608
|
else:
|
|
603
609
|
raise Exception('Could not find RawWaveforms folder')
|
|
604
610
|
|
|
605
|
-
return wave_paths, unit_label_paths, channel_pos
|
|
611
|
+
return wave_paths, unit_label_paths, channel_pos
|
|
612
|
+
|
|
613
|
+
def get_probe_geometry(channel_pos, param, verbose = False):
|
|
614
|
+
"""
|
|
615
|
+
From the channel positions, estimate the number of shanks and there spacing used to
|
|
616
|
+
identify a unit to a probe.
|
|
617
|
+
needmin_new_shank_distance from param.
|
|
618
|
+
|
|
619
|
+
Parameters
|
|
620
|
+
----------
|
|
621
|
+
channel_pos : ndarray
|
|
622
|
+
The channel positions of a session
|
|
623
|
+
param : dict
|
|
624
|
+
The param dict
|
|
625
|
+
verbose : bool, optional
|
|
626
|
+
If True will print the calculated results, by default False
|
|
627
|
+
|
|
628
|
+
Returns
|
|
629
|
+
-------
|
|
630
|
+
param
|
|
631
|
+
The param dictionary updated with the calculated params
|
|
632
|
+
"""
|
|
633
|
+
min_new_shank_distance = param['min_new_shank_distance']
|
|
634
|
+
x_val = np.unique(channel_pos[:,0])
|
|
635
|
+
x_val = np.sort(x_val) #make sure they are in ascending order
|
|
636
|
+
x_spacing = np.diff(x_val)
|
|
637
|
+
too_close = np.argwhere(x_spacing < min_new_shank_distance)
|
|
638
|
+
|
|
639
|
+
#remove when shanks are two close
|
|
640
|
+
x_val = np.delete(x_val, too_close + 1)
|
|
641
|
+
|
|
642
|
+
n_shanks = x_val.size
|
|
643
|
+
if n_shanks == 1:
|
|
644
|
+
shank_spacing = 100 #make it cover the full possible range
|
|
645
|
+
else:
|
|
646
|
+
shank_spacing = np.abs(np.diff(x_val))[0]
|
|
647
|
+
|
|
648
|
+
#NOTE this shank_dist is the distance within a centroid would be assigned to a shank!
|
|
649
|
+
shank_dist = shank_spacing * 0.9 #the area from the start which is assigned to each probe
|
|
650
|
+
#e.g 0 -> 0.9to shank 1, 0.9-1.8 to shank 2...
|
|
651
|
+
#NOTE current shank identification doesn't work for 9+ shanks
|
|
652
|
+
|
|
653
|
+
param['no_shanks'] = n_shanks
|
|
654
|
+
param['shank_dist'] = shank_dist
|
|
655
|
+
if verbose == True:
|
|
656
|
+
print(f'We have found {n_shanks} with spacing ~ {shank_spacing}')
|
|
657
|
+
return param
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: UnitMatchPy
|
|
3
|
+
Version: 2.4
|
|
4
|
+
Author: Enny van Beest, Celian Bimbard and Sam Dodgson
|
|
5
|
+
Author-email: e.beest@ucl.ac.uk
|
|
6
|
+
Requires-Python: >=3.7
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
|
|
10
|
+
# Unit Match - Python
|
|
11
|
+
|
|
12
|
+
## Run UMPy
|
|
13
|
+
|
|
14
|
+
To run UMPy standard spike sorting data is needed; channel positions and 2 extracted raw waveforms for each unit. This can be calculated externally [BombCell](https://github.com/Julie-Fabre/bombcell) or using *extract_raw_demo.ipynb* to extract these waveforms from compressed data (.cbin and .ch) or raw data. There is also a [Spike Interface](https://spikeinterface.readthedocs.io/en/latest/) integrated notebook *UMPy_spike_interface_demo.ipynb* which uses spike interface to get this data.
|
|
15
|
+
Be careful not to mix and match the different ways of extracting raw waveforms, as there are difference between the methods.
|
|
16
|
+
|
|
17
|
+
There are to example notebooks for running UMPy *UMPy_example.ipynb* and *UMPy_example_detailed.ipynb*. These notebooks will guide you through running Unit Match all you need to supply is paths to the data. *UMPy_example.ipynb* is recommended to use first as it is simpler, however *UMPy_example_detailed.ipynb* may be useful in unique cases as it is more modular.
|
|
18
|
+
|
|
19
|
+
The GUI is a optional step to curated and investigate the information Unit Match has calculated; for efficient usage of the GUI please look at *GUI_Reference_Guide.md* in the Demo Notebooks folder.
|
|
20
|
+
|
|
21
|
+
## Dependencies
|
|
22
|
+
|
|
23
|
+
This version relies on many core python packages: [numpy](https://numpy.org/), [scipy](https://scipy.org/), [JobLib](https://joblib.readthedocs.io/en/stable/), [pandas](https://pandas.pydata.org/), [tkinter](https://docs.python.org/3/library/tkinter.html) and [matplotlib](https://matplotlib.org/). All of these libaries come with a [Anaconda](https://www.anaconda.com/download/) version of python.
|
|
24
|
+
For extracting raw data, the library [mtscomp](https://github.com/int-brain-lab/mtscomp) is needed, and can be installed by `pip install mtscomp`.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
## Installation
|
|
28
|
+
|
|
29
|
+
After creating an python environment
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
conda create --name UnitMatch python
|
|
33
|
+
conda activate UnitMatch
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
You can install UnitMatchPy with pip. It will automatically install all the dependencies.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
pip install UnitMatchPy
|
|
40
|
+
```
|
UnitMatchPy-2.1/PKG-INFO
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: UnitMatchPy
|
|
3
|
-
Version: 2.1
|
|
4
|
-
Author: Enny van Beest, Celian Bimbard and Sam Dodgson
|
|
5
|
-
Author-email: e.beest@ucl.ac.uk
|
|
6
|
-
Requires-Python: >=3.7
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
License-File: LICENSE
|
|
9
|
-
|
|
10
|
-
# Unit Match - Python
|
|
11
|
-
|
|
12
|
-
## Run UMPy
|
|
13
|
-
|
|
14
|
-
To run UMPy standard spike sorting data is needed; channel positions and 2 extractracted raw waveforms for each unit. This can be calculated exteranlly [BombCell](https://github.com/Julie-Fabre/bombcell) or using *ExtractRawDataDemo.ipynb* to extract these waveforms from compressed data (.cbin and .ch) or raw data. There is also a [Spike Interface](https://spikeinterface.readthedocs.io/en/latest/) intergrated notebook *UMPy_spike_interface_demo.ipynb* which uses spike interface to get this data.
|
|
15
|
-
Be careful not to mix and match the different ways of exrtacting raw waveforms, as there are difference between the methods.
|
|
16
|
-
|
|
17
|
-
There are to example notebooks for running UMPy *UMPyExample.ipynb* and *UMPyExampleBrief.ipynb*. These notebooks will guide you throuh running Unit Match all you need to supply is paths to the data. *UMPyExampleBried.ipynb* is reccomened to use first as it is simpler, however *UMPyExample.ipynb* may be useful in unique cases as it is more modular.
|
|
18
|
-
|
|
19
|
-
The GUI is a optional step to curated and investigate the infomation Unit Match has calculated; for efficent usage of the GUI please look at *GUI_Reference_Guide.md* in the Demo Notebooks folder.
|
|
20
|
-
## Dependencies
|
|
21
|
-
This version relies on many core python packages [numpy](https://numpy.org/), [scipy](https://scipy.org/), [JobLib](https://joblib.readthedocs.io/en/stable/), [pandas](https://pandas.pydata.org/), [tkinter](https://docs.python.org/3/library/tkinter.html) and [matplotlib](https://matplotlib.org/). All of these libaries come with a [Anaconda](https://www.anaconda.com/download/) version of python.
|
|
22
|
-
For extracting raw data the library [mtscomp](https://github.com/int-brain-lab/mtscomp) is needed, this can be installed by `pip install mtscomp`.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
## Installation
|
|
26
|
-
|
|
27
|
-
After creating an python environment
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
conda create --name UnitMatch python
|
|
31
|
-
conda activate UnitMatch
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
You can install UnitMatchPy with pip. It will automatically install all the dependency.
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
pip install UnitMatchPy
|
|
38
|
-
```
|
UnitMatchPy-2.1/README.md
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Unit Match - Python
|
|
2
|
-
|
|
3
|
-
## Run UMPy
|
|
4
|
-
|
|
5
|
-
To run UMPy standard spike sorting data is needed; channel positions and 2 extractracted raw waveforms for each unit. This can be calculated exteranlly [BombCell](https://github.com/Julie-Fabre/bombcell) or using *ExtractRawDataDemo.ipynb* to extract these waveforms from compressed data (.cbin and .ch) or raw data. There is also a [Spike Interface](https://spikeinterface.readthedocs.io/en/latest/) intergrated notebook *UMPy_spike_interface_demo.ipynb* which uses spike interface to get this data.
|
|
6
|
-
Be careful not to mix and match the different ways of exrtacting raw waveforms, as there are difference between the methods.
|
|
7
|
-
|
|
8
|
-
There are to example notebooks for running UMPy *UMPyExample.ipynb* and *UMPyExampleBrief.ipynb*. These notebooks will guide you throuh running Unit Match all you need to supply is paths to the data. *UMPyExampleBried.ipynb* is reccomened to use first as it is simpler, however *UMPyExample.ipynb* may be useful in unique cases as it is more modular.
|
|
9
|
-
|
|
10
|
-
The GUI is a optional step to curated and investigate the infomation Unit Match has calculated; for efficent usage of the GUI please look at *GUI_Reference_Guide.md* in the Demo Notebooks folder.
|
|
11
|
-
## Dependencies
|
|
12
|
-
This version relies on many core python packages [numpy](https://numpy.org/), [scipy](https://scipy.org/), [JobLib](https://joblib.readthedocs.io/en/stable/), [pandas](https://pandas.pydata.org/), [tkinter](https://docs.python.org/3/library/tkinter.html) and [matplotlib](https://matplotlib.org/). All of these libaries come with a [Anaconda](https://www.anaconda.com/download/) version of python.
|
|
13
|
-
For extracting raw data the library [mtscomp](https://github.com/int-brain-lab/mtscomp) is needed, this can be installed by `pip install mtscomp`.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
## Installation
|
|
17
|
-
|
|
18
|
-
After creating an python environment
|
|
19
|
-
|
|
20
|
-
```
|
|
21
|
-
conda create --name UnitMatch python
|
|
22
|
-
conda activate UnitMatch
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
You can install UnitMatchPy with pip. It will automatically install all the dependency.
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
pip install UnitMatchPy
|
|
29
|
-
```
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: UnitMatchPy
|
|
3
|
-
Version: 2.1
|
|
4
|
-
Author: Enny van Beest, Celian Bimbard and Sam Dodgson
|
|
5
|
-
Author-email: e.beest@ucl.ac.uk
|
|
6
|
-
Requires-Python: >=3.7
|
|
7
|
-
Description-Content-Type: text/markdown
|
|
8
|
-
License-File: LICENSE
|
|
9
|
-
|
|
10
|
-
# Unit Match - Python
|
|
11
|
-
|
|
12
|
-
## Run UMPy
|
|
13
|
-
|
|
14
|
-
To run UMPy standard spike sorting data is needed; channel positions and 2 extractracted raw waveforms for each unit. This can be calculated exteranlly [BombCell](https://github.com/Julie-Fabre/bombcell) or using *ExtractRawDataDemo.ipynb* to extract these waveforms from compressed data (.cbin and .ch) or raw data. There is also a [Spike Interface](https://spikeinterface.readthedocs.io/en/latest/) intergrated notebook *UMPy_spike_interface_demo.ipynb* which uses spike interface to get this data.
|
|
15
|
-
Be careful not to mix and match the different ways of exrtacting raw waveforms, as there are difference between the methods.
|
|
16
|
-
|
|
17
|
-
There are to example notebooks for running UMPy *UMPyExample.ipynb* and *UMPyExampleBrief.ipynb*. These notebooks will guide you throuh running Unit Match all you need to supply is paths to the data. *UMPyExampleBried.ipynb* is reccomened to use first as it is simpler, however *UMPyExample.ipynb* may be useful in unique cases as it is more modular.
|
|
18
|
-
|
|
19
|
-
The GUI is a optional step to curated and investigate the infomation Unit Match has calculated; for efficent usage of the GUI please look at *GUI_Reference_Guide.md* in the Demo Notebooks folder.
|
|
20
|
-
## Dependencies
|
|
21
|
-
This version relies on many core python packages [numpy](https://numpy.org/), [scipy](https://scipy.org/), [JobLib](https://joblib.readthedocs.io/en/stable/), [pandas](https://pandas.pydata.org/), [tkinter](https://docs.python.org/3/library/tkinter.html) and [matplotlib](https://matplotlib.org/). All of these libaries come with a [Anaconda](https://www.anaconda.com/download/) version of python.
|
|
22
|
-
For extracting raw data the library [mtscomp](https://github.com/int-brain-lab/mtscomp) is needed, this can be installed by `pip install mtscomp`.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
## Installation
|
|
26
|
-
|
|
27
|
-
After creating an python environment
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
conda create --name UnitMatch python
|
|
31
|
-
conda activate UnitMatch
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
You can install UnitMatchPy with pip. It will automatically install all the dependency.
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
pip install UnitMatchPy
|
|
38
|
-
```
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awwinxpblue.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demoscaledb.tcl
RENAMED
|
File without changes
|
|
File without changes
|
{UnitMatchPy-2.1 → UnitMatchPy-2.4}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/README.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|