Source code for simba.ui.pop_ups.pose_bp_drop_pop_up
__author__ = "Simon Nilsson; sronilsson@gmail.com"
from tkinter import *
from simba.mixins.pop_up_mixin import PopUpMixin
from simba.pose_processors.remove_keypoints import KeypointRemover
from simba.ui.tkinter_functions import (CreateLabelFrameWithIcon, DropDownMenu,
Entry_Box, FolderSelect)
from simba.utils.enums import Formats, Keys, Links
[docs]class DropTrackingDataPopUp(PopUpMixin):
def __init__(self):
PopUpMixin.__init__(
self, title="Drop body-parts in pose-estimation data", size=(500, 800)
)
file_settings_frm = CreateLabelFrameWithIcon(
parent=self.main_frm,
header="FILE SETTINGS",
icon_name=Keys.DOCUMENTATION.value,
icon_link=Links.VIDEO_TOOLS.value,
)
self.data_folder_path = FolderSelect(
file_settings_frm, "Data Folder", lblwidth="20"
)
self.file_format = DropDownMenu(
file_settings_frm, "File Type", ["csv", "h5"], "20"
)
self.pose_tool = DropDownMenu(
file_settings_frm, "Tracking tool", ["DLC", "maDLC"], "20"
)
self.pose_tool.setChoices("DLC")
self.file_format.setChoices("csv")
self.bp_cnt = Entry_Box(
file_settings_frm, "# body-parts to remove", "20", validation="numeric"
)
confirm_btn = Button(
file_settings_frm, text="Confirm", font=Formats.FONT_REGULAR.value, command=lambda: self.confirm()
)
file_settings_frm.grid(row=0, sticky=NW)
self.data_folder_path.grid(row=0, sticky=W, columnspan=3)
self.pose_tool.grid(row=1, sticky=NW)
self.file_format.grid(row=2, sticky=NW)
self.bp_cnt.grid(row=3, sticky=NW)
confirm_btn.grid(row=3, column=1, sticky=NW)
[docs] def confirm(self):
if hasattr(self, "bp_table"):
self.bp_table.destroy()
self.keypoint_remover = KeypointRemover(
data_folder=self.data_folder_path.folder_path,
pose_tool=self.pose_tool.getChoices(),
file_format=self.file_format.getChoices(),
)
self.bp_table = LabelFrame(
self.main_frm,
text="REMOVE BODY-PARTS",
font=Formats.LABELFRAME_HEADER_FORMAT.value,
)
self.bp_table.grid(row=1, sticky=NW, pady=5)
self.animal_names_lst, self.drop_down_list = [], []
if self.pose_tool.getChoices() == "DLC":
for bp_number in range(int(self.bp_cnt.entry_get)):
bp_drop_down = DropDownMenu(
self.bp_table,
"Body-part {}:".format(str(bp_number + 1)),
self.keypoint_remover.body_part_names,
"10",
)
bp_drop_down.setChoices(
self.keypoint_remover.body_part_names[bp_number]
)
self.drop_down_list.append(bp_drop_down)
bp_drop_down.grid(row=bp_number, column=0, sticky=NW)
if self.pose_tool.getChoices() == "maDLC":
for bp_number in range(int(self.bp_cnt.entry_get)):
animal_drop_down = DropDownMenu(
self.bp_table,
"Animal name:",
self.keypoint_remover.animal_names,
"10",
)
animal_drop_down.setChoices(self.keypoint_remover.animal_names[0])
self.animal_names_lst.append(animal_drop_down)
bp_drop_down = DropDownMenu(
self.bp_table,
"Body-part {}:".format(str(bp_number + 1)),
self.keypoint_remover.body_part_names,
"10",
)
bp_drop_down.setChoices(
self.keypoint_remover.body_part_names[bp_number]
)
self.drop_down_list.append(bp_drop_down)
animal_drop_down.grid(row=bp_number, column=0, sticky=NW)
bp_drop_down.grid(row=bp_number, column=1, sticky=NW)
run_btn = Button(
self.main_frm, text="RUN BODY-PART REMOVAL", command=lambda: self.run()
)
run_btn.grid(row=2, column=0, sticky=NW)
[docs] def run(self):
bp_to_remove_list, animal_names_list = [], []
for number, drop_down in enumerate(self.drop_down_list):
bp_to_remove_list.append(drop_down.getChoices())
if self.pose_tool == "maDLC":
for number, drop_down in enumerate(self.animal_names_lst):
animal_names_list.append(drop_down.getChoices())
_ = self.keypoint_remover.run(
bp_to_remove_list=bp_to_remove_list, animal_names=animal_names_list
)