Source code for simba.ui.pop_ups.clf_by_timebins_pop_up
__author__ = "Simon Nilsson; sronilsson@gmail.com"
import multiprocessing
import os
from tkinter import *
from typing import Union
from simba.data_processors.timebins_clf_calculator import TimeBinsClfCalculator
from simba.mixins.config_reader import ConfigReader
from simba.mixins.pop_up_mixin import PopUpMixin
from simba.ui.tkinter_functions import (CreateLabelFrameWithIcon, Entry_Box,
SimbaButton, SimbaCheckbox)
from simba.utils.checks import check_int
from simba.utils.enums import Formats, Keys, Links, Options
from simba.utils.errors import (NoChoosenClassifierError,
NoChoosenMeasurementError, NoDataError)
[docs]class TimeBinsClfPopUp(PopUpMixin, ConfigReader):
def __init__(self,
config_path: Union[str, os.PathLike]):
ConfigReader.__init__(self, config_path=config_path, read_video_info=False)
if len(self.machine_results_paths) == 0:
raise NoDataError(msg=f'Cannot compute classifications by time-bin: no data found in the {self.machine_results_dir} directory', source=self.__class__.__name__)
PopUpMixin.__init__(self, title="CLASSIFICATION BY TIME BINS", icon='timer_2')
measures_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="MEASUREMENTS", icon_name='ruler', icon_link=Links.ANALYZE_ML_RESULTS.value, padx=2, pady=2, relief='solid')
first_occurance_cb, self.first_occurance_var = SimbaCheckbox(parent=measures_frm, txt="First occurrence (s)", txt_img='one', val=True, tooltip_key='TIMEBINS_CLF_FIRST_OCCURRENCE')
event_count_cb, self.event_count_var = SimbaCheckbox(parent=measures_frm, txt="Event count", txt_img='abacus', val=True, tooltip_key='TIMEBINS_CLF_EVENT_COUNT')
total_event_duration_cb, self.total_event_duration_var = SimbaCheckbox(parent=measures_frm, txt="Total event duration (s)", txt_img='stopwatch', val=True, tooltip_key='TIMEBINS_CLF_TOTAL_EVENT_DURATION')
mean_event_duration_cb, self.mean_event_duration_var = SimbaCheckbox(parent=measures_frm, txt="Mean event duration (s)", txt_img='average', val=False, tooltip_key='TIMEBINS_CLF_MEAN_EVENT_DURATION')
median_event_duration_cb, self.median_event_duration_var = SimbaCheckbox(parent=measures_frm, txt="Median event duration (s)", txt_img='average_2', val=False, tooltip_key='TIMEBINS_CLF_MEDIAN_EVENT_DURATION')
mean_interval_duration_cb, self.mean_interval_duration_var = SimbaCheckbox(parent=measures_frm, txt="Mean event interval (s)", txt_img='timer_2', val=False, tooltip_key='TIMEBINS_CLF_MEAN_INTERVAL_DURATION')
median_interval_duration_cb, self.median_interval_duration_var = SimbaCheckbox(parent=measures_frm, txt="Median event interval (s)", txt_img='timer', val=False, tooltip_key='TIMEBINS_CLF_MEDIAN_INTERVAL_DURATION')
measures_frm.grid(row=0, column=0, sticky=NW)
first_occurance_cb.grid(row=0, column=0, sticky=NW)
event_count_cb.grid(row=1, column=0, sticky=NW)
total_event_duration_cb.grid(row=2, column=0, sticky=NW)
mean_event_duration_cb.grid(row=3, column=0, sticky=NW)
median_event_duration_cb.grid(row=4, column=0, sticky=NW)
mean_interval_duration_cb.grid(row=5, column=0, sticky=NW)
median_interval_duration_cb.grid(row=6, column=0, sticky=NW)
self.clf_vars = {}
clf_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="CLASSIFIERS", icon_name='forest', icon_link=Links.ANALYZE_ML_RESULTS.value, padx=2, pady=2, relief='solid')
for cnt, clf_name in enumerate(self.clf_names):
cb, self.clf_vars[clf_name] = SimbaCheckbox(parent=clf_frm, txt=clf_name, val=True, tooltip_key='TIMEBINS_CLF_CLASSIFIER')
cb.grid(row=cnt, column=0, sticky=NW)
clf_frm.grid(row=1, column=0, sticky=NW)
time_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="SET TIME", icon_name='timer_2', icon_link=Links.ANALYZE_ML_RESULTS.value, padx=2, pady=2, relief='solid')
self.timebin_entrybox = Entry_Box(time_frm, "TIME BIN SIZE (S): ", validation="numeric", labelwidth=30, entry_box_width=15, value=30, tooltip_key='TIMEBINS_CLF_TIME_BIN_SIZE')
time_frm.grid(row=2, column=0, sticky=NW)
self.timebin_entrybox.grid(row=0, column=0, sticky=NW)
output_format_options_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header="OUTPUT FORMAT OPTIONS", icon_name='settings',icon_link=Links.ANALYZE_ML_RESULTS.value, padx=2, pady=2, relief='solid')
transpose_cb, self.transpose_var = SimbaCheckbox(parent=output_format_options_frm, txt='TRANSPOSE OUTPUT (ONE ROW PER VIDEO)', val=False, txt_img='rotate', tooltip_key='TIMEBINS_CLF_TRANSPOSE')
time_cb, self.time_var = SimbaCheckbox(parent=output_format_options_frm, txt='INCLUDE TIME (HH:MM:SS)', val=False, txt_img='timer', tooltip_key='TIMEBINS_CLF_INCLUDE_TIME')
output_format_options_frm.grid(row=3, column=0, sticky=NW)
transpose_cb.grid(row=0, column=0, sticky=NW)
time_cb.grid(row=1, column=0, sticky=NW)
run_frm = CreateLabelFrameWithIcon(parent=self.main_frm, header=f"RUN {len(self.machine_results_paths)} video(s)", icon_name='run', icon_link=Links.ANALYZE_ML_RESULTS.value, padx=5, pady=5, relief='solid')
run_button = SimbaButton(parent=run_frm, txt=f"RUN ({len(self.machine_results_paths)} file(s))", img='rocket', font=Formats.FONT_REGULAR.value, cmd=self._run)
run_frm.grid(row=4, column=0, sticky=NW)
run_button.grid(row=0, column=0, sticky=NW)
self.main_frm.mainloop()
def _run(self):
check_int(name="Time bin", value=self.timebin_entrybox.entry_get)
first_occurance = self.first_occurance_var.get()
event_cnt = self.event_count_var.get()
total_event_duration = self.total_event_duration_var.get()
mean_event_duration = self.mean_event_duration_var.get()
median_event_duration = self.median_event_duration_var.get()
mean_interval_duration = self.mean_interval_duration_var.get()
median_interval_duration = self.median_interval_duration_var.get()
if not any([first_occurance, event_cnt, total_event_duration, mean_event_duration, median_event_duration, mean_interval_duration, median_interval_duration]):
raise NoChoosenMeasurementError(source=self.__class__.__name__)
clfs = [clf_name for clf_name, cb_var in self.clf_vars.items() if cb_var.get()]
if len(clfs) == 0:
raise NoChoosenClassifierError(source=self.__class__.__name__)
include_timestamp, transpose = self.time_var.get(), self.transpose_var.get()
time_bins_clf_analyzer = TimeBinsClfCalculator(config_path=self.config_path,
bin_length=int(self.timebin_entrybox.entry_get),
classifiers=clfs,
first_occurrence=first_occurance,
event_count=event_cnt,
total_event_duration=total_event_duration,
mean_event_duration=mean_event_duration,
median_event_duration=median_event_duration,
mean_interval_duration=mean_interval_duration,
median_interval_duration=median_interval_duration,
include_timestamp=include_timestamp,
transpose=transpose)
time_bins_clf_analyzer.run()
time_bins_clf_analyzer.save()
#_ = TimeBinsClfPopUp(config_path=r"E:\troubleshooting\mitra_emergence_hour\project_folder\project_config.ini")
#_ = TimeBinsClfPopUp(config_path='/Users/simon/Desktop/envs/troubleshooting/Two_animals_16bps/project_folder/project_config.ini')
#_ = TimeBinsClfPopUp(config_path=r"D:\troubleshooting\maplight_ri\project_folder\project_config.ini")