Source code for simba.utils.errors

__author__ = "Simon Nilsson; sronilsson@gmail.com"

from datetime import datetime
from tkinter import messagebox as mb

from simba.utils.enums import Defaults, TagNames
from simba.utils.printing import log_event

WINDOW_TITLE = "SIMBA ERROR"


[docs]class SimbaError(Exception): def __init__(self, msg: str, source: str = " ", show_window: bool = False): self.msg, self.source, self.show_window = msg, source, show_window self.print_and_log_error() def __str__(self): return self.msg
[docs] def print_and_log_error(self): log_event(logger_name=f"{self.source}.{self.__class__.__name__}", log_type=TagNames.ERROR.value,msg=self.msg) print(f"[{datetime.now().strftime('%H:%M:%S')}] {self.msg}{Defaults.STR_SPLIT_DELIMITER.value}{TagNames.ERROR.value}") if self.show_window: mb.showerror(title=WINDOW_TITLE, message=self.msg)
[docs]class NoSpecifiedOutputError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = True): super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ROICoordinatesNotFoundError(SimbaError): def __init__(self, expected_file_path: str, source: str = "", show_window: bool = False): msg = f"[{datetime.now().strftime('%H:%M:%S')}] SIMBA ROI COORDINATES ERROR: No ROI coordinates found. Please use the [ROI] tab to define ROIs. Expected at location {expected_file_path}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class NoChoosenClassifierError(SimbaError): def __init__(self, source: str = "", show_window: bool = False): msg = f"Select at least one classifier" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class NoChoosenROIError(SimbaError): def __init__(self, source: str = "", show_window: bool = False): msg = f"Please select at least one ROI." super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class NoChoosenMeasurementError(SimbaError): def __init__(self, source: str = "", show_window: bool = False): msg = "SIMBA NoChoosenMeasurementError ERROR: Please select at least one measurement to calculate descriptive statistics for." super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class NoDataError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA NO DATA ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class SamplingError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA SAMPLING ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class PermissionError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA PERMISSION ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class NoROIDataError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA NO ROI DATA ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class MixedMosaicError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA MixedMosaicError ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ClassifierInferenceError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA CLASSIFIER INFERENCE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class AnimalNumberError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA ANIMAL NUMBER ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class InvalidFilepathError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA INVALID FILE PATH ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class NoFilesFoundError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA NO FILES FOUND ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class DataHeaderError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA DATA HEADER ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class NotDirectoryError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA NOT A DIRECTORY ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class DirectoryExistError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA DIRECTORY ALREADY EXIST ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class FileExistError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA FILE EXIST ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class FrameRangeError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA FRAME RANGE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class AdvancedLabellingError(SimbaError): def __init__( self, frame: str, lbl_lst: list, unlabel_lst: list, source: str = "", show_window: bool = False, ): msg = ( "SIMBA ADVANCED LABELLING ERROR: In advanced labelling of multiple behaviors, any annotated frame cannot have some " "behaviors annotated as present/absent, while other behaviors are un-labelled. All behaviors need " "labels for a frame with one or more labels. In frame {}, behaviors {} are labelled, while behaviors " "{} are un-labelled.".format(str(frame), lbl_lst, unlabel_lst) ) super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class InvalidHyperparametersFileError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA HYPERPARAMETER FILE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class InvalidVideoFileError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA VIDEO FILE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class InvalidFileTypeError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA INVALID FILE TYPE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class FaultyTrainingSetError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA INVALID ML TRAINING SET ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class CountError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA COUNT ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class FeatureNumberMismatchError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA FEATURE NUMBER MISMATCH ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class DuplicationError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA DUPLICATION ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class InvalidInputError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA VALUE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class IntegerError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA INTEGER ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class StringError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA STRING ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class FloatError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA FLOAT ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class MissingProjectConfigEntryError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA MISSING PROJECT CONFIG ENTRY ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class MissingColumnsError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA MISSING COLUMN ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class CorruptedFileError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA READ FILE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ParametersFileError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA VIDEO PARAMETERS FILE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ColumnNotFoundError(SimbaError): def __init__( self, column_name: str, file_name: str, source: str = "", show_window: bool = False, ): msg = f"SIMBA ERROR: Field name {column_name} could not be found in file {file_name}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class BodypartColumnNotFoundError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA BODY_PART COLUMN NOT FOUND ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class AnnotationFileNotFoundError(SimbaError): def __init__(self, video_name: str, source: str = "", show_window: bool = False): msg = f"SIMBA THIRD-PARTY ANNOTATION ERROR: NO ANNOTATION DATA FOR VIDEO {video_name} FOUND" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class DirectoryNotEmptyError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA DIRECTORY NOT EMPTY ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
#####
[docs]class ThirdPartyAnnotationFileNotFoundError(SimbaError): def __init__(self, video_name: str, source: str = "", show_window: bool = False): msg = f"SIMBA ERROR: Could not find file in project_folder/csv/features_extracted directory representing annotations for video {video_name}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ThirdPartyAnnotationsFpsConflictError(SimbaError): def __init__( self, video_name: str, annotation_fps: int, video_fps: int, source: str = "", show_window: bool = False, ): msg = f"SIMBA THIRD-PARTY ANNOTATION ERROR: The FPS for video {video_name} is set to {str(video_fps)} in SimBA and {str(annotation_fps)} in the annotation file" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ThirdPartyAnnotationsMissingAnnotationsError(SimbaError): def __init__( self, video_name: str, clf_names: list, source: str = "", show_window: bool = False, ): msg = f"SIMBA THIRD-PARTY ANNOTATION ERROR: No annotations detected for SimBA classifier(s) named {clf_names} for video {video_name}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ThirdPartyAnnotationOverlapError(SimbaError): def __init__( self, video_name: str, clf_name: str, source: str = "", show_window: bool = False, ): msg = f"SIMBA THIRD-PARTY ANNOTATION ERROR: The annotations for behavior {clf_name} in video {video_name} contains behavior start events that are initiated PRIOR to the PRECEDING behavior event ending. SimBA requires a specific behavior event to end before another behavior event can start." super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ThirdPartyAnnotationsAdditionalClfError(SimbaError): def __init__( self, video_name: str, clf_names: list, source: str = "", show_window: bool = False, ): msg = f"SIMBA THIRD-PARTY ANNOTATION ERROR: Annotations file for video {video_name} has annotations for the following behaviors {clf_names} that are NOT classifiers named in the SimBA project." super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ThirdPartyAnnotationEventCountError(SimbaError): def __init__( self, video_name: str, clf_name: str, start_event_cnt: int, stop_event_cnt: int, source: str = "", show_window: bool = False, ): msg = f"SIMBA THIRD-PARTY ANNOTATION ERROR: The annotations for behavior {clf_name} in video {video_name} contains {str(start_event_cnt)} start events and {str(stop_event_cnt)} stop events. SimBA requires the number of stop and start event counts to be equal." super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ThirdPartyAnnotationsClfMissingError(SimbaError): def __init__( self, video_name: str, clf_name: str, source: str = "", show_window: bool = False, ): msg = f"SIMBA THIRD-PARTY ANNOTATION WARNING: No annotations detected for video {video_name} and behavior {clf_name}." super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ThirdPartyAnnotationsOutsidePoseEstimationDataError(SimbaError): def __init__( self, video_name: str, frm_cnt: int, clf_name: str or None = None, annotation_frms: int or None = None, first_error_frm: int or None = None, ambiguous_cnt: int or None = None, source: str = "", show_window: bool = False, ): if clf_name: msg = ( f"SIMBA THIRD-PARTY ANNOTATION WARNING: SimBA found THIRD-PARTY annotations for behavior {clf_name} in video " f"{video_name} that are annotated to occur at times which is not present in the " f"video data you imported into SIMBA. The video you imported to SimBA has {str(frm_cnt)} frames. " f"However, in BORIS, you have annotated {clf_name} to happen at frame number {str(first_error_frm)}. " f"These ambiguous annotations occur in {str(ambiguous_cnt)} different frames for video {video_name} that SimBA will **remove** by default. " f"Please make sure you imported the same video as you annotated in BORIS into SimBA and the video is registered with the correct frame rate." ) else: msg = f"SIMBA THIRD-PARTY ANNOTATION WARNING: The annotations for video {video_name} contain data for {str(annotation_frms)} frames. The pose-estimation features for the same video contain data for {str(frm_cnt)} frames." super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class FFMPEGCodecGPUError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA FFMPEG CODEC ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class FFMPEGNotFoundError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA FFMPEG NOT FOUND ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ArrayError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA ARRAY SIZE ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class ResolutionError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA RESOLUTION ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class SimBAModuleNotFoundError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA MODULE NOT FOUND ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class SimBAGPUError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA GPU ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class SimBAPAckageVersionError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA PACKAGE VERSION ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
[docs]class CropError(SimbaError): def __init__(self, msg: str, source: str = "", show_window: bool = False): msg = f"SIMBA CROP ERROR: {msg}" super().__init__(msg=msg, source=source, show_window=show_window)
# test = NoSpecifiedOutputError(msg='test', source='test.method') # test = FFMPEGNotFoundError(msg='323') # class NoSpecifiedOutputError(SimbaError): # @log_error_decorator() # def __init__(self, msg: str, source: str = '', show_window: bool = True):