Source code for simba.ui.pop_ups.pup_retrieval_pop_up
__author__ = "Simon Nilsson; sronilsson@gmail.com"
import os
from tkinter import *
from simba.data_processors.pup_retrieval_calculator import \
PupRetrieverCalculator
from simba.roi_tools.ROI_analyzer import ROIAnalyzer
from simba.ui.tkinter_functions import DropDownMenu, Entry_Box, hxtScrollbar
from simba.utils.checks import check_float, check_int
from simba.utils.enums import ConfigKey, Formats, Paths
from simba.utils.errors import NoFilesFoundError
from simba.utils.read_write import (get_all_clf_names, read_config_entry,
read_config_file)
[docs]class PupRetrievalPopUp(object):
def __init__(self, config_path: str):
self.smoothing_options, self.config_path = ["gaussian"], config_path
self.smooth_factor_options = list(range(1, 11))
self.config = read_config_file(config_path=config_path)
self.project_path = read_config_entry(
self.config,
ConfigKey.GENERAL_SETTINGS.value,
ConfigKey.PROJECT_PATH.value,
data_type=ConfigKey.FOLDER_PATH.value,
)
self.ROI_path = os.path.join(self.project_path, Paths.ROI_DEFINITIONS.value)
if not os.path.isfile(self.ROI_path):
raise NoFilesFoundError(
msg=f"Requires ROI definitions: no file found at {self.ROI_path}",
source=self.__class__.__name__,
)
self.roi_analyzer = ROIAnalyzer(config_path=config_path, data_path=None)
self.roi_analyzer.run()
self.shape_names = self.roi_analyzer.shape_names
self.animal_names = self.roi_analyzer.multi_animal_id_list
self.clf_names = get_all_clf_names(
config=self.config, target_cnt=self.roi_analyzer.clf_cnt
)
self.distance_plots_var = BooleanVar(value=True)
self.swarm_plot_var = BooleanVar(value=True)
self.log_var = BooleanVar(value=True)
self.main_frm = Toplevel()
self.main_frm.minsize(400, 400)
self.main_frm.wm_title("SIMBA PUP RETRIEVAL PROTOCOL 1")
self.main_frm = hxtScrollbar(self.main_frm)
self.main_frm.pack(expand=True, fill=BOTH)
self.pup_track_p_entry = Entry_Box(
self.main_frm, "Tracking probability (PUP): ", "20"
)
self.dam_track_p_entry = Entry_Box(
self.main_frm, "Tracking probability (DAM): ", "20"
)
self.start_distance_criterion_entry = Entry_Box(
self.main_frm, "Start distance criterion (MM):", "20", validation="numeric"
)
self.carry_frames_entry = Entry_Box(
self.main_frm, "Carry time (S)", "20", validation="numeric"
)
self.core_nest_name_dropdown = DropDownMenu(
self.main_frm, "Core-nest name: ", self.shape_names, "20"
)
self.nest_name_dropdown = DropDownMenu(
self.main_frm, "Nest name: ", self.shape_names, "20"
)
self.dam_name_dropdown = DropDownMenu(
self.main_frm, "Dam name: ", self.animal_names, "20"
)
self.pup_name_dropdown = DropDownMenu(
self.main_frm, "Pup name: ", self.animal_names, "20"
)
self.smooth_function_dropdown = DropDownMenu(
self.main_frm, "Smooth function: ", self.smoothing_options, "20"
)
self.smooth_factor_dropdown = DropDownMenu(
self.main_frm, "Smooth factor: ", self.smooth_factor_options, "20"
)
self.max_time_entry = Entry_Box(
self.main_frm, "Max time (S)", "20", validation="numeric"
)
self.carry_classifier_dropdown = DropDownMenu(
self.main_frm, "Carry classifier name: ", self.clf_names, "20"
)
self.approach_classifier_dropdown = DropDownMenu(
self.main_frm, "Approach classifier name: ", self.clf_names, "20"
)
self.dig_classifier_dropdown = DropDownMenu(
self.main_frm, "Dig classifier name: ", self.clf_names, "20"
)
self.create_distance_plots_cb = Checkbutton(
self.main_frm,
text="Create distance plots (pre- and post tracking smoothing",
font=Formats.FONT_REGULAR.value,
variable=self.distance_plots_var,
)
self.swarm_plot_cb = Checkbutton(
self.main_frm,
text="Create results swarm plot",
font=Formats.FONT_REGULAR.value,
variable=self.swarm_plot_var,
)
self.log_cb = Checkbutton(
self.main_frm, text="Create log-file", font=Formats.FONT_REGULAR.value, variable=self.log_var
)
self.pup_track_p_entry.entry_set(0.025)
self.dam_track_p_entry.entry_set(0.5)
self.start_distance_criterion_entry.entry_set(80)
self.carry_frames_entry.entry_set(3)
self.core_nest_name_dropdown.setChoices(choice=self.shape_names[0])
self.nest_name_dropdown.setChoices(choice=self.shape_names[1])
self.dam_name_dropdown.setChoices(choice=self.animal_names[0])
self.pup_name_dropdown.setChoices(choice=self.animal_names[1])
self.smooth_function_dropdown.setChoices(choice=self.smoothing_options[0])
self.smooth_factor_dropdown.setChoices(choice=5)
self.carry_frames_entry.entry_set(90)
self.carry_classifier_dropdown.setChoices(self.clf_names[0])
self.approach_classifier_dropdown.setChoices(self.clf_names[0])
self.dig_classifier_dropdown.setChoices(self.clf_names[0])
self.max_time_entry.entry_set(90)
button_run = Button(
self.main_frm,
text="RUN",
font=Formats.FONT_REGULAR.value,
fg="red",
command=lambda: self.run(),
)
self.pup_track_p_entry.grid(row=0, sticky=W)
self.dam_track_p_entry.grid(row=1, sticky=W)
self.start_distance_criterion_entry.grid(row=2, sticky=W)
self.carry_frames_entry.grid(row=3, sticky=W)
self.core_nest_name_dropdown.grid(row=4, sticky=W)
self.nest_name_dropdown.grid(row=5, sticky=W)
self.dam_name_dropdown.grid(row=6, sticky=W)
self.pup_name_dropdown.grid(row=7, sticky=W)
self.smooth_function_dropdown.grid(row=8, sticky=W)
self.smooth_factor_dropdown.grid(row=9, sticky=W)
self.max_time_entry.grid(row=10, sticky=W)
self.carry_classifier_dropdown.grid(row=11, sticky=W)
self.approach_classifier_dropdown.grid(row=12, sticky=W)
self.dig_classifier_dropdown.grid(row=13, sticky=W)
self.swarm_plot_cb.grid(row=14, sticky=W)
self.create_distance_plots_cb.grid(row=15, sticky=W)
self.log_cb.grid(row=16, sticky=W)
button_run.grid(row=17, sticky=W)
# self.main_frm.mainloop()
[docs] def run(self):
pup_track_p = self.pup_track_p_entry.entry_get
dam_track_p = self.dam_track_p_entry.entry_get
start_distance_criterion = self.start_distance_criterion_entry.entry_get
carry_frames = self.carry_frames_entry.entry_get
core_nest = self.core_nest_name_dropdown.getChoices()
nest = self.nest_name_dropdown.getChoices()
dam_name = self.dam_name_dropdown.getChoices()
pup_name = self.pup_name_dropdown.getChoices()
smooth_function = self.smooth_function_dropdown.getChoices()
smooth_factor = self.smooth_factor_dropdown.getChoices()
max_time = self.max_time_entry.entry_get
clf_carry = self.carry_classifier_dropdown.getChoices()
clf_approach = self.approach_classifier_dropdown.getChoices()
clf_dig = self.dig_classifier_dropdown.getChoices()
check_float(
name="Tracking probability (PUP)",
value=pup_track_p,
max_value=1.0,
min_value=0.0,
)
check_float(
name="Tracking probability (DAM)",
value=dam_track_p,
max_value=1.0,
min_value=0.0,
)
check_float(
name="Start distance criterion (MM)", value=start_distance_criterion
)
check_int(name="Carry frames (S)", value=carry_frames)
check_int(name="max_time", value=max_time)
swarm_plot = self.swarm_plot_var.get()
distance_plot = self.distance_plots_var.get()
log = self.log_var.get()
settings = {
"pup_track_p": float(pup_track_p),
"dam_track_p": float(dam_track_p),
"start_distance_criterion": float(start_distance_criterion),
"carry_time": float(carry_frames),
"core_nest": core_nest,
"nest": nest,
"dam_name": dam_name,
"pup_name": pup_name,
"smooth_function": smooth_function,
"smooth_factor": int(smooth_factor),
"max_time": float(max_time),
"clf_carry": clf_carry,
"clf_approach": clf_approach,
"clf_dig": clf_dig,
"swarm_plot": swarm_plot,
"distance_plots": distance_plot,
"log": log,
}
pup_calculator = PupRetrieverCalculator(
config_path=self.config_path, settings=settings
)
pup_calculator.run()
pup_calculator.save_results()