From 62e4fbe54a5418cd306c241f558a01d251ae6130 Mon Sep 17 00:00:00 2001 From: Kevin Dean <42547789+AdvancedImagingUTSW@users.noreply.github.com> Date: Mon, 30 Sep 2024 11:20:42 -0500 Subject: [PATCH 1/2] Remove repr, cleanup dependency, combine logs Per @annie-xd-wang's requests... --- .../controller/sub_controllers/stages.py | 3 +- src/navigate/log_files/filters.py | 7 -- src/navigate/log_files/logging.yml | 14 +--- src/navigate/log_files/model_logging.yml | 11 +--- src/navigate/model/devices/__init__.py | 65 +++---------------- src/navigate/model/devices/camera/base.py | 8 ++- .../model/devices/camera/hamamatsu.py | 3 +- .../model/devices/camera/photometrics.py | 2 +- .../model/devices/camera/synthetic.py | 2 +- src/navigate/model/devices/daq/base.py | 3 +- src/navigate/model/devices/daq/ni.py | 21 ++---- src/navigate/model/devices/daq/synthetic.py | 3 +- .../model/devices/filter_wheel/asi.py | 3 +- .../model/devices/filter_wheel/base.py | 2 +- src/navigate/model/devices/filter_wheel/ni.py | 2 +- .../model/devices/filter_wheel/sutter.py | 2 +- .../model/devices/filter_wheel/synthetic.py | 2 +- src/navigate/model/devices/galvo/base.py | 2 +- src/navigate/model/devices/galvo/ni.py | 2 +- src/navigate/model/devices/galvo/synthetic.py | 4 +- src/navigate/model/devices/lasers/base.py | 2 +- src/navigate/model/devices/lasers/ni.py | 2 +- .../model/devices/lasers/synthetic.py | 2 +- src/navigate/model/devices/mirrors/base.py | 2 +- src/navigate/model/devices/mirrors/imop.py | 2 +- .../model/devices/mirrors/synthetic.py | 2 +- .../model/devices/remote_focus/base.py | 3 +- .../remote_focus/equipment_solutions.py | 2 +- src/navigate/model/devices/remote_focus/ni.py | 2 +- .../model/devices/remote_focus/synthetic.py | 2 +- src/navigate/model/devices/shutter/base.py | 2 +- src/navigate/model/devices/shutter/ni.py | 2 +- .../model/devices/shutter/synthetic.py | 2 +- src/navigate/model/devices/stages/asi.py | 3 +- .../model/devices/stages/asi_MSTwoThousand.py | 2 +- src/navigate/model/devices/stages/base.py | 2 +- src/navigate/model/devices/stages/mcl.py | 2 +- src/navigate/model/devices/stages/ni.py | 2 +- src/navigate/model/devices/stages/pi.py | 2 +- src/navigate/model/devices/stages/sutter.py | 2 +- .../model/devices/stages/synthetic.py | 2 +- .../model/devices/stages/tl_kcube_inertial.py | 3 +- .../devices/stages/tl_kcube_steppermotor.py | 4 +- src/navigate/model/devices/zoom/base.py | 3 +- src/navigate/model/devices/zoom/dynamixel.py | 2 +- src/navigate/model/devices/zoom/synthetic.py | 3 +- src/navigate/tools/decorators.py | 41 +++++++++++- 47 files changed, 111 insertions(+), 150 deletions(-) diff --git a/src/navigate/controller/sub_controllers/stages.py b/src/navigate/controller/sub_controllers/stages.py index 4c5f0e5c2..834206892 100644 --- a/src/navigate/controller/sub_controllers/stages.py +++ b/src/navigate/controller/sub_controllers/stages.py @@ -39,12 +39,13 @@ # Local Imports from navigate.controller.sub_controllers.gui import GUIController -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class StageController(GUIController): """StageController diff --git a/src/navigate/log_files/filters.py b/src/navigate/log_files/filters.py index 0c8f357c1..62a11a20a 100644 --- a/src/navigate/log_files/filters.py +++ b/src/navigate/log_files/filters.py @@ -97,10 +97,3 @@ def filter(self, record): if record.getMessage().startswith("Spec"): return False return True - -class DebugFilter(logging.Filter): - """ - A custom logging filter to include only DEBUG level messages. - """ - def filter(self, record): - return record.levelno == logging.DEBUG diff --git a/src/navigate/log_files/logging.yml b/src/navigate/log_files/logging.yml index d2376c54d..59a4d683d 100644 --- a/src/navigate/log_files/logging.yml +++ b/src/navigate/log_files/logging.yml @@ -9,8 +9,6 @@ filters: (): ext://navigate.log_files.filters.PerformanceFilter not_performance: (): ext://navigate.log_files.filters.NonPerfFilter - only_debug: - (): ext://navigate.log_files.filters.DebugFilter handlers: console: class: logging.StreamHandler @@ -30,29 +28,19 @@ handlers: level: DEBUG formatter: base filename: view_controller_debug.log - filters: [not_performance, only_debug] + filters: [not_performance] mode: a -# performance: -# class: logging.handlers.RotatingFileHandler -# level: DEBUG -# formatter: base -# filename: view_controller_performance.log -# filters: [performance_specs] -# mode: a loggers: view: level: DEBUG -# handlers: [console, vc_info, vc_debug, performance] handlers: [console, vc_info, vc_debug] propagate: no controller: level: DEBUG -# handlers: [console, vc_info, vc_debug, performance] handlers: [console, vc_info, vc_debug] propagate: no config: level: DEBUG -# handlers: [console, vc_info, vc_debug, performance] handlers: [console, vc_info, vc_debug] propagate: no diff --git a/src/navigate/log_files/model_logging.yml b/src/navigate/log_files/model_logging.yml index f8da00423..60ae9204c 100644 --- a/src/navigate/log_files/model_logging.yml +++ b/src/navigate/log_files/model_logging.yml @@ -9,8 +9,6 @@ filters: (): ext://navigate.log_files.filters.PerformanceFilter not_performance: (): ext://navigate.log_files.filters.NonPerfFilter - only_debug: - (): ext://navigate.log_files.filters.DebugFilter handlers: console: class: logging.StreamHandler @@ -30,7 +28,7 @@ handlers: level: DEBUG formatter: base filename: model_debug.log - filters: [not_performance, only_debug] + filters: [not_performance] mode: a model_error: class: logging.handlers.RotatingFileHandler @@ -39,13 +37,6 @@ handlers: filename: model_error.log filters: [not_performance] mode: a -# model_performance: -# class: logging.handlers.RotatingFileHandler -# level: DEBUG -# formatter: base -# filename: model_performance.log -# filters: [performance_specs] -# mode: a loggers: model: level: DEBUG diff --git a/src/navigate/model/devices/__init__.py b/src/navigate/model/devices/__init__.py index a76302d10..229162e99 100644 --- a/src/navigate/model/devices/__init__.py +++ b/src/navigate/model/devices/__init__.py @@ -1,62 +1,17 @@ """ Hardware devices. """ # Standard library imports -from functools import wraps -import logging -import reprlib # Third party imports # Local imports -# from .daq.synthetic import SyntheticDAQ # noqa -# from .camera.synthetic import SyntheticCamera # noqa -# from .filter_wheel.synthetic import SyntheticFilterWheel # noqa -# from .galvo.synthetic import SyntheticGalvo # noqa -# from .remote_focus.synthetic import SyntheticRemoteFocus # noqa -# from .shutter.synthetic import SyntheticShutter # noqa -# from .stages.synthetic import SyntheticStage # noqa -# from .zoom.synthetic import SyntheticZoom # noqa -# from .lasers.synthetic import SyntheticLaser # noqa -# from .mirrors.synthetic import SyntheticMirror # noqa - -def log_initialization(cls): - """Decorator for logging the initialization of a device class. - - Parameters - ---------- - cls : class - The class to be logged. - - Returns - ------- - cls : class - The class with the logging decorator. - """ - # Set up the reprlib object - mod_repr = reprlib.Repr() - mod_repr.indent = 4 - mod_repr.maxstring = 50 - mod_repr.maxother = 50 - - # Get the original __init__ method - original_init = cls.__init__ - - @wraps(original_init) - def new_init(self, *args, **kwargs): - module_location = cls.__module__ - logger = logging.getLogger(module_location.split(".")[1]) - try: - original_init(self, *args, **kwargs) - logger.info(f"{mod_repr.repr(cls.__name__)}, " - f"{mod_repr.repr(args)}, " - f"{mod_repr.repr(kwargs)}" - ) - except Exception as e: - logger.error(f"{mod_repr.repr(cls.__name__)} Initialization Failed") - logger.error(f"Input args & kwargs: {args}, {kwargs}") - logger.error(f"Error: {e}") - raise e - - # Replace the original __init__ method with the new one - cls.__init__ = new_init - return cls \ No newline at end of file +from .daq.synthetic import SyntheticDAQ # noqa +from .camera.synthetic import SyntheticCamera # noqa +from .filter_wheel.synthetic import SyntheticFilterWheel # noqa +from .galvo.synthetic import SyntheticGalvo # noqa +from .remote_focus.synthetic import SyntheticRemoteFocus # noqa +from .shutter.synthetic import SyntheticShutter # noqa +from .stages.synthetic import SyntheticStage # noqa +from .zoom.synthetic import SyntheticZoom # noqa +from .lasers.synthetic import SyntheticLaser # noqa +from .mirrors.synthetic import SyntheticMirror # noqa diff --git a/src/navigate/model/devices/camera/base.py b/src/navigate/model/devices/camera/base.py index e89cd85d8..0c546a9b5 100644 --- a/src/navigate/model/devices/camera/base.py +++ b/src/navigate/model/devices/camera/base.py @@ -39,12 +39,13 @@ # Local Imports from navigate.config import get_navigate_path -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class CameraBase: """CameraBase - Parent camera class.""" @@ -163,8 +164,9 @@ def get_offset_variance_maps(self): os.path.join(map_path, f"{serial_number}_var.tiff") ) except FileNotFoundError: - logger.info(f"{str(self)}, Offset or variance map not found in" - f" {map_path}") + logger.info( + f"{str(self)}, Offset or variance map not found in" f" {map_path}" + ) self._offset, self._variance = None, None return self._offset, self._variance diff --git a/src/navigate/model/devices/camera/hamamatsu.py b/src/navigate/model/devices/camera/hamamatsu.py index 609245ccd..36089764f 100644 --- a/src/navigate/model/devices/camera/hamamatsu.py +++ b/src/navigate/model/devices/camera/hamamatsu.py @@ -37,7 +37,8 @@ # Local Imports from navigate.model.devices.camera.base import CameraBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization + # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) diff --git a/src/navigate/model/devices/camera/photometrics.py b/src/navigate/model/devices/camera/photometrics.py index 2d832b1db..c5896346d 100644 --- a/src/navigate/model/devices/camera/photometrics.py +++ b/src/navigate/model/devices/camera/photometrics.py @@ -41,7 +41,7 @@ # Local Imports from navigate.model.devices.camera.base import CameraBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/camera/synthetic.py b/src/navigate/model/devices/camera/synthetic.py index 176eed13f..29dd6b517 100644 --- a/src/navigate/model/devices/camera/synthetic.py +++ b/src/navigate/model/devices/camera/synthetic.py @@ -42,7 +42,7 @@ # Local Imports from navigate.model.analysis import camera from navigate.model.devices.camera.base import CameraBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/daq/base.py b/src/navigate/model/devices/daq/base.py index 99160b54c..c9a6507d5 100644 --- a/src/navigate/model/devices/daq/base.py +++ b/src/navigate/model/devices/daq/base.py @@ -37,12 +37,13 @@ # Local Imports from navigate.model.waveforms import camera_exposure -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class DAQBase: """DAQBase - Parent class for Data Acquisition (DAQ) classes.""" diff --git a/src/navigate/model/devices/daq/ni.py b/src/navigate/model/devices/daq/ni.py index 4491ad8ea..6686cbb19 100644 --- a/src/navigate/model/devices/daq/ni.py +++ b/src/navigate/model/devices/daq/ni.py @@ -45,12 +45,13 @@ # Local Imports from navigate.model.devices.daq.base import DAQBase from navigate.tools.waveform_template_funcs import get_waveform_template_parameters -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class NIDAQ(DAQBase): """NIDAQ class for Control of NI Data Acquisition Cards.""" @@ -159,8 +160,7 @@ def set_external_trigger(self, external_trigger=None): self.analog_output_tasks[board_name].register_done_event(None) except Exception: logger.debug( - f"Error Registering Done Event: " - f"{traceback.format_exc()}" + f"Error Registering Done Event: " f"{traceback.format_exc()}" ) else: # close master trigger task @@ -259,9 +259,7 @@ def callback_func(task_handle, status, callback_data): task.stop() task.start() except Exception: - logger.debug( - f"Analog task restart failed {traceback.format_exc()}" - ) + logger.debug(f"Analog task restart failed {traceback.format_exc()}") return status return callback_func @@ -456,9 +454,7 @@ def run_acquisition(self): except Exception: # when triggered from external triggers, sometimes the camera trigger task # is done but not actually done, there will a DAQ WARNING message - logger.debug( - f"Wait until tasks done failed - {traceback.format_exc()}" - ) + logger.debug(f"Wait until tasks done failed - {traceback.format_exc()}") pass try: self.camera_trigger_task.stop() @@ -575,17 +571,14 @@ def update_analog_task(self, board_name): ).squeeze() self.analog_output_tasks[board_name].write(waveforms) except Exception: - logger.debug( - f"Could not update analog task: {traceback.format_exc()}" - ) + logger.debug(f"Could not update analog task: {traceback.format_exc()}") for board in self.analog_output_tasks.keys(): try: self.analog_output_tasks[board].stop() self.analog_output_tasks[board].close() except Exception: logger.debug( - f"Could not stop analog tasks: " - f"{traceback.format_exc()}" + f"Could not stop analog tasks: " f"{traceback.format_exc()}" ) self.create_analog_output_tasks(self.current_channel_key) diff --git a/src/navigate/model/devices/daq/synthetic.py b/src/navigate/model/devices/daq/synthetic.py index 9080de4df..c29707fe5 100644 --- a/src/navigate/model/devices/daq/synthetic.py +++ b/src/navigate/model/devices/daq/synthetic.py @@ -39,12 +39,13 @@ # Local Imports from navigate.model.devices.daq.base import DAQBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class SyntheticDAQ(DAQBase): """SyntheticDAQ class for Data Acquisition (DAQ).""" diff --git a/src/navigate/model/devices/filter_wheel/asi.py b/src/navigate/model/devices/filter_wheel/asi.py index 55baaca7f..b377f0f10 100644 --- a/src/navigate/model/devices/filter_wheel/asi.py +++ b/src/navigate/model/devices/filter_wheel/asi.py @@ -39,7 +39,7 @@ # Local Imports from navigate.model.devices.filter_wheel.base import FilterWheelBase from navigate.model.devices.APIs.asi.asi_tiger_controller import TigerController -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] @@ -170,6 +170,7 @@ def close(self): logger.debug("ASI Filter Wheel - Closing Device.") self.filter_wheel.disconnect_from_serial() + @log_initialization class ASICubeSlider(FilterWheelBase): """ASICubeSlider - Class for controlling the C60 Cube Slider from ASI. diff --git a/src/navigate/model/devices/filter_wheel/base.py b/src/navigate/model/devices/filter_wheel/base.py index 9b2fc3a21..e4a057837 100644 --- a/src/navigate/model/devices/filter_wheel/base.py +++ b/src/navigate/model/devices/filter_wheel/base.py @@ -36,7 +36,7 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/filter_wheel/ni.py b/src/navigate/model/devices/filter_wheel/ni.py index e5e5e5b29..7dc1fde4b 100644 --- a/src/navigate/model/devices/filter_wheel/ni.py +++ b/src/navigate/model/devices/filter_wheel/ni.py @@ -41,7 +41,7 @@ # Local Imports from navigate.model.devices.filter_wheel.base import FilterWheelBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/filter_wheel/sutter.py b/src/navigate/model/devices/filter_wheel/sutter.py index 3bdd25323..8e43dd7bf 100644 --- a/src/navigate/model/devices/filter_wheel/sutter.py +++ b/src/navigate/model/devices/filter_wheel/sutter.py @@ -40,7 +40,7 @@ # Local Imports from navigate.model.devices.filter_wheel.base import FilterWheelBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/filter_wheel/synthetic.py b/src/navigate/model/devices/filter_wheel/synthetic.py index 0fddab3b8..3ac1be840 100644 --- a/src/navigate/model/devices/filter_wheel/synthetic.py +++ b/src/navigate/model/devices/filter_wheel/synthetic.py @@ -36,7 +36,7 @@ # Local Imports from navigate.model.devices.filter_wheel.base import FilterWheelBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/galvo/base.py b/src/navigate/model/devices/galvo/base.py index f0811a4e4..ade53319d 100644 --- a/src/navigate/model/devices/galvo/base.py +++ b/src/navigate/model/devices/galvo/base.py @@ -37,7 +37,7 @@ # Local Imports from navigate.model.waveforms import sawtooth, sine_wave -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/galvo/ni.py b/src/navigate/model/devices/galvo/ni.py index 94770a58f..5d04ec3bb 100644 --- a/src/navigate/model/devices/galvo/ni.py +++ b/src/navigate/model/devices/galvo/ni.py @@ -38,7 +38,7 @@ # Local Imports from navigate.model.devices.galvo.base import GalvoBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/galvo/synthetic.py b/src/navigate/model/devices/galvo/synthetic.py index 76fcae1a5..aa1aa38d4 100644 --- a/src/navigate/model/devices/galvo/synthetic.py +++ b/src/navigate/model/devices/galvo/synthetic.py @@ -37,12 +37,13 @@ # Local Imports from navigate.model.devices.galvo.base import GalvoBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class SyntheticGalvo(GalvoBase): """SyntheticGalvo Class""" @@ -78,4 +79,3 @@ def __init__(self, microscope_name, device_connection, configuration, galvo_id=0 def __str__(self): """Return string representation of the GalvoNI.""" return "SyntheticGalvo" - diff --git a/src/navigate/model/devices/lasers/base.py b/src/navigate/model/devices/lasers/base.py index e9af68f83..b37d56d5d 100644 --- a/src/navigate/model/devices/lasers/base.py +++ b/src/navigate/model/devices/lasers/base.py @@ -39,7 +39,7 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/lasers/ni.py b/src/navigate/model/devices/lasers/ni.py index faa78b1af..a9337aa12 100644 --- a/src/navigate/model/devices/lasers/ni.py +++ b/src/navigate/model/devices/lasers/ni.py @@ -40,7 +40,7 @@ # Local Imports from navigate.model.devices.lasers.base import LaserBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/lasers/synthetic.py b/src/navigate/model/devices/lasers/synthetic.py index bc85161b3..c6e24056b 100644 --- a/src/navigate/model/devices/lasers/synthetic.py +++ b/src/navigate/model/devices/lasers/synthetic.py @@ -36,7 +36,7 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization from navigate.model.devices.lasers.base import LaserBase # Logger Setup diff --git a/src/navigate/model/devices/mirrors/base.py b/src/navigate/model/devices/mirrors/base.py index c0169afb6..c4b183a97 100644 --- a/src/navigate/model/devices/mirrors/base.py +++ b/src/navigate/model/devices/mirrors/base.py @@ -37,7 +37,7 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/mirrors/imop.py b/src/navigate/model/devices/mirrors/imop.py index 2e59a86d3..26dba884c 100644 --- a/src/navigate/model/devices/mirrors/imop.py +++ b/src/navigate/model/devices/mirrors/imop.py @@ -38,7 +38,7 @@ # Local Imports from navigate.model.devices.mirrors.base import MirrorBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/mirrors/synthetic.py b/src/navigate/model/devices/mirrors/synthetic.py index 5cba0b3c0..6a3af4ef7 100644 --- a/src/navigate/model/devices/mirrors/synthetic.py +++ b/src/navigate/model/devices/mirrors/synthetic.py @@ -37,7 +37,7 @@ # Local Imports from navigate.model.devices.mirrors.base import MirrorBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/remote_focus/base.py b/src/navigate/model/devices/remote_focus/base.py index 049418d2a..0586505bd 100644 --- a/src/navigate/model/devices/remote_focus/base.py +++ b/src/navigate/model/devices/remote_focus/base.py @@ -41,8 +41,7 @@ smooth_waveform, remote_focus_ramp_triangular, ) -from navigate.model.devices import log_initialization - +from navigate.tools.decorators import log_initialization # # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/remote_focus/equipment_solutions.py b/src/navigate/model/devices/remote_focus/equipment_solutions.py index 865383f4e..7f804cb7e 100644 --- a/src/navigate/model/devices/remote_focus/equipment_solutions.py +++ b/src/navigate/model/devices/remote_focus/equipment_solutions.py @@ -36,7 +36,7 @@ import logging # Third Party Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Local Imports from navigate.model.devices.remote_focus.ni import RemoteFocusNI diff --git a/src/navigate/model/devices/remote_focus/ni.py b/src/navigate/model/devices/remote_focus/ni.py index 1f2a3b0ab..66e32a21f 100644 --- a/src/navigate/model/devices/remote_focus/ni.py +++ b/src/navigate/model/devices/remote_focus/ni.py @@ -37,7 +37,7 @@ # Local Imports from navigate.model.devices.remote_focus.base import RemoteFocusBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/remote_focus/synthetic.py b/src/navigate/model/devices/remote_focus/synthetic.py index 3075ac5e7..621ca9258 100644 --- a/src/navigate/model/devices/remote_focus/synthetic.py +++ b/src/navigate/model/devices/remote_focus/synthetic.py @@ -37,7 +37,7 @@ # Local Imports from navigate.model.devices.remote_focus.base import RemoteFocusBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/shutter/base.py b/src/navigate/model/devices/shutter/base.py index f99f88443..259030d4e 100644 --- a/src/navigate/model/devices/shutter/base.py +++ b/src/navigate/model/devices/shutter/base.py @@ -36,7 +36,7 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/shutter/ni.py b/src/navigate/model/devices/shutter/ni.py index fab86941a..a4335baa7 100644 --- a/src/navigate/model/devices/shutter/ni.py +++ b/src/navigate/model/devices/shutter/ni.py @@ -39,7 +39,7 @@ # Local Imports from navigate.model.devices.shutter.base import ShutterBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/shutter/synthetic.py b/src/navigate/model/devices/shutter/synthetic.py index 04f0c0c5e..fdbdc218f 100644 --- a/src/navigate/model/devices/shutter/synthetic.py +++ b/src/navigate/model/devices/shutter/synthetic.py @@ -38,7 +38,7 @@ # Local Imports from navigate.model.devices.shutter.base import ShutterBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/asi.py b/src/navigate/model/devices/stages/asi.py index 3bfafc7e0..1f05afa79 100644 --- a/src/navigate/model/devices/stages/asi.py +++ b/src/navigate/model/devices/stages/asi.py @@ -41,8 +41,7 @@ TigerController, TigerException, ) -from navigate.model.devices import log_initialization - +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/asi_MSTwoThousand.py b/src/navigate/model/devices/stages/asi_MSTwoThousand.py index 8acafeec7..58670f26d 100644 --- a/src/navigate/model/devices/stages/asi_MSTwoThousand.py +++ b/src/navigate/model/devices/stages/asi_MSTwoThousand.py @@ -41,7 +41,7 @@ MS2000Controller, MS2000Exception, ) -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/base.py b/src/navigate/model/devices/stages/base.py index de4e624c3..fbf98b369 100644 --- a/src/navigate/model/devices/stages/base.py +++ b/src/navigate/model/devices/stages/base.py @@ -36,7 +36,7 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/mcl.py b/src/navigate/model/devices/stages/mcl.py index bc6845c02..31309886f 100644 --- a/src/navigate/model/devices/stages/mcl.py +++ b/src/navigate/model/devices/stages/mcl.py @@ -37,7 +37,7 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization from navigate.model.devices.stages.base import StageBase # Logger Setup diff --git a/src/navigate/model/devices/stages/ni.py b/src/navigate/model/devices/stages/ni.py index 33cd27f5f..4621e524f 100644 --- a/src/navigate/model/devices/stages/ni.py +++ b/src/navigate/model/devices/stages/ni.py @@ -41,7 +41,7 @@ # Local Imports from navigate.model.devices.stages.base import StageBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/pi.py b/src/navigate/model/devices/stages/pi.py index 6495711b5..23fbec471 100644 --- a/src/navigate/model/devices/stages/pi.py +++ b/src/navigate/model/devices/stages/pi.py @@ -39,7 +39,7 @@ # Local Imports from navigate.model.devices.stages.base import StageBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/sutter.py b/src/navigate/model/devices/stages/sutter.py index cdcaef5a5..d39c3138c 100644 --- a/src/navigate/model/devices/stages/sutter.py +++ b/src/navigate/model/devices/stages/sutter.py @@ -37,7 +37,7 @@ # Local Imports from navigate.model.devices.stages.base import StageBase from navigate.model.devices.APIs.sutter.MP285 import MP285 -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/synthetic.py b/src/navigate/model/devices/stages/synthetic.py index 51039c819..dbf3462be 100644 --- a/src/navigate/model/devices/stages/synthetic.py +++ b/src/navigate/model/devices/stages/synthetic.py @@ -37,7 +37,7 @@ # Local Imports from navigate.model.devices.stages.base import StageBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/tl_kcube_inertial.py b/src/navigate/model/devices/stages/tl_kcube_inertial.py index ae906dc99..8852162d8 100644 --- a/src/navigate/model/devices/stages/tl_kcube_inertial.py +++ b/src/navigate/model/devices/stages/tl_kcube_inertial.py @@ -37,8 +37,7 @@ # Local Imports from navigate.model.devices.stages.base import StageBase -from navigate.model.devices import log_initialization - +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/stages/tl_kcube_steppermotor.py b/src/navigate/model/devices/stages/tl_kcube_steppermotor.py index cb098dd33..a8c7d6244 100644 --- a/src/navigate/model/devices/stages/tl_kcube_steppermotor.py +++ b/src/navigate/model/devices/stages/tl_kcube_steppermotor.py @@ -56,8 +56,7 @@ # Local Imports from navigate.model.devices.stages.base import StageBase -from navigate.model.devices import log_initialization - +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] @@ -96,6 +95,7 @@ def build_TLKSTStage_connection(serialnum): kst_controller.KST_Open(str(serialnum)) return kst_controller + @log_initialization class TLKSTStage(StageBase): """Thorlabs KST Stage""" diff --git a/src/navigate/model/devices/zoom/base.py b/src/navigate/model/devices/zoom/base.py index b22fa1641..6f26c1383 100644 --- a/src/navigate/model/devices/zoom/base.py +++ b/src/navigate/model/devices/zoom/base.py @@ -36,12 +36,13 @@ # Third Party Imports # Local Imports -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class ZoomBase: """ZoomBase parent class.""" diff --git a/src/navigate/model/devices/zoom/dynamixel.py b/src/navigate/model/devices/zoom/dynamixel.py index 703c2874a..4117e18ee 100644 --- a/src/navigate/model/devices/zoom/dynamixel.py +++ b/src/navigate/model/devices/zoom/dynamixel.py @@ -38,7 +38,7 @@ # Local Imports from navigate.model.devices.APIs.dynamixel import dynamixel_functions as dynamixel from navigate.model.devices.zoom.base import ZoomBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] diff --git a/src/navigate/model/devices/zoom/synthetic.py b/src/navigate/model/devices/zoom/synthetic.py index c0c09bbda..2ee9f2972 100644 --- a/src/navigate/model/devices/zoom/synthetic.py +++ b/src/navigate/model/devices/zoom/synthetic.py @@ -38,12 +38,13 @@ # Local Imports from navigate.model.devices.zoom.base import ZoomBase -from navigate.model.devices import log_initialization +from navigate.tools.decorators import log_initialization # Logger Setup p = __name__.split(".")[1] logger = logging.getLogger(p) + @log_initialization class SyntheticZoom(ZoomBase): """SyntheticZoom Class - Controls the SyntheticZoom Servo.""" diff --git a/src/navigate/tools/decorators.py b/src/navigate/tools/decorators.py index 9da578ae5..dece59777 100644 --- a/src/navigate/tools/decorators.py +++ b/src/navigate/tools/decorators.py @@ -1,6 +1,5 @@ # Copyright (c) 2021-2024 The University of Texas Southwestern Medical Center. # All rights reserved. - # Redistribution and use in source and binary forms, with or without # modification, are permitted for academic and research use only # (subject to the limitations in the disclaimer below) @@ -32,13 +31,14 @@ # Standard Library Imports from time import time - -from jupyter_lsp.serverextension import initialize +import logging +from functools import wraps # Third Party Imports # Local Imports + def function_timer(func): """Decorator for evaluating the duration of time necessary to execute a statement. @@ -80,3 +80,38 @@ def __init__(self, obj): def __call__(self, *args): return self.__obj_class(*args) + + +def log_initialization(cls): + """Decorator for logging the initialization of a device class. + + Parameters + ---------- + cls : class + The class to be logged. + + Returns + ------- + cls : class + The class with the logging decorator. + """ + + # Get the original __init__ method + original_init = cls.__init__ + + @wraps(original_init) + def new_init(self, *args, **kwargs): + module_location = cls.__module__ + logger = logging.getLogger(module_location.split(".")[1]) + try: + original_init(self, *args, **kwargs) + logger.info(f"{cls.__name__}, " f"{args}, " f"{kwargs}") + except Exception as e: + logger.error(f"{cls.__name__} Initialization Failed") + logger.error(f"Input args & kwargs: {args}, {kwargs}") + logger.error(f"Error: {e}") + raise e + + # Replace the original __init__ method with the new one + cls.__init__ = new_init + return cls From f335d411f3bfbe61786277b189a852be41c9635c Mon Sep 17 00:00:00 2001 From: Annie Wang Date: Mon, 30 Sep 2024 10:48:14 -0700 Subject: [PATCH 2/2] minor tweaks --- src/navigate/model/devices/camera/base.py | 2 +- src/navigate/model/devices/daq/ni.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/navigate/model/devices/camera/base.py b/src/navigate/model/devices/camera/base.py index 0c546a9b5..a237b7867 100644 --- a/src/navigate/model/devices/camera/base.py +++ b/src/navigate/model/devices/camera/base.py @@ -165,7 +165,7 @@ def get_offset_variance_maps(self): ) except FileNotFoundError: logger.info( - f"{str(self)}, Offset or variance map not found in" f" {map_path}" + f"{str(self)}, Offset or variance map not found in {map_path}" ) self._offset, self._variance = None, None return self._offset, self._variance diff --git a/src/navigate/model/devices/daq/ni.py b/src/navigate/model/devices/daq/ni.py index 6686cbb19..1be74dc9b 100644 --- a/src/navigate/model/devices/daq/ni.py +++ b/src/navigate/model/devices/daq/ni.py @@ -160,7 +160,7 @@ def set_external_trigger(self, external_trigger=None): self.analog_output_tasks[board_name].register_done_event(None) except Exception: logger.debug( - f"Error Registering Done Event: " f"{traceback.format_exc()}" + f"Error Registering Done Event: {traceback.format_exc()}" ) else: # close master trigger task @@ -578,7 +578,7 @@ def update_analog_task(self, board_name): self.analog_output_tasks[board].close() except Exception: logger.debug( - f"Could not stop analog tasks: " f"{traceback.format_exc()}" + f"Could not stop analog tasks: {traceback.format_exc()}" ) self.create_analog_output_tasks(self.current_channel_key)