Source code for simba.ui.pop_ups.severity_analysis_pop_up
__author__ = "Simon Nilsson; sronilsson@gmail.com"
from tkinter import *
from simba.data_processors.severity_bout_based_calculator import \
SeverityBoutCalculator
from simba.data_processors.severity_frame_based_calculator import \
SeverityFrameCalculator
from simba.mixins.config_reader import ConfigReader
from simba.mixins.pop_up_mixin import PopUpMixin
from simba.ui.tkinter_functions import CreateLabelFrameWithIcon, DropDownMenu
from simba.utils.enums import Formats, Keys, Links
from simba.utils.errors import NoSpecifiedOutputError
[docs]class AnalyzeSeverityPopUp(PopUpMixin, ConfigReader):
def __init__(self, config_path: str):
PopUpMixin.__init__(self, title="SIMBA SEVERITY ANALYSIS", icon='fire')
ConfigReader.__init__(self, config_path=config_path, read_video_info=False)
if len(self.multi_animal_id_list) > 1:
self.multi_animal_id_list.insert(0, "ALL ANIMALS")
self.clip_cnt_options = list(range(1, 20))
self.clip_cnt_options.insert(0, "ALL CLIPS")
self.frame_cnt_var = BooleanVar(value=False)
self.seconds_cnt_var = BooleanVar(value=False)
self.settings_frm = CreateLabelFrameWithIcon(
parent=self.main_frm,
header="SETTINGS",
icon_name=Keys.DOCUMENTATION.value,
icon_link=Links.ANALYZE_ML_RESULTS.value,
)
self.clf_dropdown = DropDownMenu(
self.settings_frm, "CLASSIFIER:", self.clf_names, "25"
)
self.clf_dropdown.setChoices(self.clf_names[0])
self.brackets_dropdown = DropDownMenu(
self.settings_frm, "BRACKETS:", list(range(1, 21)), "25"
)
self.bracket_type_dropdown = DropDownMenu(
self.settings_frm, "BRACKET TYPE: ", ["QUANTIZE", "QUANTILE"], "25"
)
self.brackets_dropdown.setChoices(10)
self.bracket_type_dropdown.setChoices("QUANTIZE")
self.animal_dropdown = DropDownMenu(
self.settings_frm, "ANIMALS", self.multi_animal_id_list, "25"
)
self.animal_dropdown.setChoices(self.multi_animal_id_list[0])
self.bouts_vs_frames_dropdown = DropDownMenu(
self.settings_frm,
"DATA TYPE: ",
["BOUTS", "FRAMES"],
"25",
com=self.show_settings,
)
self.bouts_vs_frames_dropdown.setChoices("FRAMES")
self.normalization_type_dropdown = DropDownMenu(
self.settings_frm,
"MOVEMENT NORMALIZATION TYPE: ",
["ALL VIDEOS", "SINGLE VIDEOS"],
"25",
)
self.normalization_type_dropdown.setChoices("ALL VIDEOS")
self.save_bracket_cut_off_points_var = BooleanVar(value=True)
self.savet_brackets_info_cb = Checkbutton(
self.settings_frm,
text="Save bracket definitions",
font=Formats.FONT_REGULAR.value,
variable=self.save_bracket_cut_off_points_var,
)
self.further_settings_frm = LabelFrame(
self.main_frm,
text="Further settings",
font=Formats.FONT_HEADER.value,
pady=5,
padx=5,
fg="black",
)
run_frm = LabelFrame(
self.main_frm,
text="RUN",
font=Formats.FONT_HEADER.value,
pady=5,
padx=5,
fg="black",
)
run_btn = Button(
run_frm, text="RUN SEVERITY ANALYSIS", font=Formats.FONT_REGULAR.value, command=lambda: self.run()
)
self.settings_frm.grid(row=0, column=0, sticky=NW)
self.clf_dropdown.grid(row=0, column=0, sticky=NW)
self.brackets_dropdown.grid(row=1, column=0, sticky=NW)
self.bracket_type_dropdown.grid(row=2, column=0, sticky=NW)
self.animal_dropdown.grid(row=3, column=0, sticky=NW)
self.bouts_vs_frames_dropdown.grid(row=4, column=0, sticky=NW)
self.normalization_type_dropdown.grid(row=5, column=0, sticky=NW)
self.savet_brackets_info_cb.grid(row=6, column=0, sticky=NW)
self.further_settings_frm.grid(row=2, column=0, sticky=NW)
run_frm.grid(row=3, column=0, sticky=NW)
run_btn.grid(row=0, column=0, sticky=NW)
self.show_settings(self.bouts_vs_frames_dropdown.getChoices())
self.main_frm.mainloop()
[docs] def show_settings(self, setting):
for w in self.further_settings_frm.winfo_children():
w.destroy()
self.further_settings_frm.grid()
self.visualize_var = BooleanVar(value=False)
self.show_pose_var = BooleanVar(value=False)
self.visualize_cb = Checkbutton(
self.further_settings_frm,
text="Visualize",
font=Formats.FONT_REGULAR.value,
variable=self.visualize_var,
command=self.enable_visualization_options,
)
self.show_pose_cb = Checkbutton(
self.further_settings_frm,
text="Show pose-estimated locations",
font=Formats.FONT_REGULAR.value,
variable=self.show_pose_var,
)
self.video_speed_dropdown = DropDownMenu(
self.further_settings_frm,
"Video speed:",
[float(i) / 10 for i in range(1, 21)],
"25",
)
self.video_speed_dropdown.setChoices(1.0)
self.number_of_clips_dropdown = DropDownMenu(
self.further_settings_frm, "Clip count:", self.clip_cnt_options, "25"
)
self.show_pose_cb.config(state=DISABLED)
self.video_speed_dropdown.disable()
self.number_of_clips_dropdown.disable()
self.visualize_cb.grid(row=0, column=0, sticky=NW)
self.show_pose_cb.grid(row=1, column=0, sticky=NW)
self.video_speed_dropdown.grid(row=2, column=0, sticky=NW)
self.number_of_clips_dropdown.grid(row=3, column=0, sticky=NW)
self.number_of_clips_dropdown.setChoices("ALL CLIPS")
if setting == "FRAMES":
self.frame_cnt_cb = Checkbutton(
self.further_settings_frm,
text="FRAME COUNT",
font=Formats.FONT_REGULAR.value,
variable=self.frame_cnt_var,
)
self.seconds_cnt_cb = Checkbutton(
self.further_settings_frm, text="SECONDS", font=Formats.FONT_REGULAR.value, variable=self.seconds_cnt_var
)
self.frame_cnt_cb.grid(row=4, column=0, sticky=NW)
self.seconds_cnt_cb.grid(row=5, column=0, sticky=NW)
[docs] def enable_visualization_options(self):
if self.visualize_var.get():
self.show_pose_cb.config(state=NORMAL)
self.video_speed_dropdown.enable()
self.number_of_clips_dropdown.enable()
else:
self.show_pose_cb.config(state=DISABLED)
self.video_speed_dropdown.disable()
self.number_of_clips_dropdown.disable()
[docs] def run(self):
if self.animal_dropdown.getChoices() == "ALL ANIMALS":
animals = self.multi_animal_id_list[1:]
else:
animals = [self.animal_dropdown.getChoices()]
settings = {
"brackets": int(self.brackets_dropdown.getChoices()),
"bracket_type": self.bracket_type_dropdown.getChoices(),
"clf": self.clf_dropdown.getChoices(),
"animals": animals,
"save_bin_definitions": self.save_bracket_cut_off_points_var.get(),
"normalization": self.normalization_type_dropdown.getChoices(),
}
settings["visualize"] = self.visualize_var.get()
settings["video_speed"] = float(self.video_speed_dropdown.getChoices())
settings["visualize_event_cnt"] = self.number_of_clips_dropdown.getChoices()
settings["show_pose"] = self.show_pose_var.get()
if self.bouts_vs_frames_dropdown.getChoices() == "FRAMES":
settings["frames"] = self.frame_cnt_var.get()
settings["time"] = self.seconds_cnt_var.get()
if (not self.seconds_cnt_var.get()) and (not self.frame_cnt_var.get()):
raise NoSpecifiedOutputError(
msg="SIMBA ERROR: Please select frames and/or time output metrics",
source=self.__class__.__name__,
)
if self.bouts_vs_frames_dropdown.getChoices() == "FRAMES":
severity_calculator = SeverityFrameCalculator(
config_path=self.config_path, settings=settings
)
else:
severity_calculator = SeverityBoutCalculator(
config_path=self.config_path, settings=settings
)
severity_calculator.run()
# _ = AnalyzeSeverityPopUp(config_path='/Users/simon/Desktop/envs/troubleshooting/two_black_animals_14bp/project_folder/project_config.ini')