# Example: How mixins are composed dynamicallydef create_settings_builder(clsname: str, cam_class: type) ->type:"""Factory function to create a camera class with calibration capabilities"""returntype(clsname, (cam_class, SettingsBuilderMixin), {})# This creates classes like:# FlirSettings = create_settings_builder('FlirSettings', FlirCamera)# XimeaSettings = create_settings_builder('XimeaSettings', XimeaCamera)
Camera Architecture
The camera system uses a dual-inheritance pattern that combines hardware-specific implementations with processing capabilities:
This pattern allows: - Same hardware interface to work with standard or shared memory architectures - Easy addition of new camera types - Consistent API across different hardware
# Example: Camera architecture in actionfrom openhsi.cameras import FlirCamera, SharedFlirCamera# Both classes inherit from the same hardware base but different processing basesprint("FlirCamera MRO:", FlirCamera.__mro__)print("SharedFlirCamera MRO:", SharedFlirCamera.__mro__)# They provide the same interface but different memory management# cam = FlirCamera() # Standard memory# shared_cam = SharedFlirCamera() # Shared memory for multiprocessing
# Example: Module structure overviewimport openhsi# Show main modulesmodules = [attr for attr indir(openhsi) ifnot attr.startswith('_')]print("Available modules:", modules)# Show classes in data moduleimport openhsi.data as datadata_classes = [attr for attr indir(data) if attr[0].isupper()]print("Classes in data module:", data_classes)
# Example: Basic camera setup and usagefrom openhsi.capture import SimulatedCamera# Create a simulated camera for demonstrationcam = SimulatedCamera(img_path="assets/great_hall_slide.png", n_lines=1024, processing_lvl =2, json_path="assets/cam_settings.json", cal_path="assets/cam_calibration.nc" )# Show the inheritance chainprint("SimulatedCamera inherits from:")for i, cls inenumerate(cam.__class__.__mro__):print(f" {i}: {cls.__name__} ({cls.__module__})")# Show available methods from different layersmethods_by_layer = {'CameraProperties': ['crop', 'fast_smile', 'dn2rad'],'DataCube': ['put', 'save', 'show'],'OpenHSI': ['capture', 'preview', 'connect']}for layer, methods in methods_by_layer.items(): available = [m for m in methods ifhasattr(cam, m)]print(f"{layer} methods available: {available}")
# Example: Custom processing pipelineimport numpy as np# Create sample datasample_data = np.random.randint(0, 4096, (100, 200, 150), dtype=np.uint16)# Set up camera with custom processingcam = SimulatedCamera(img_path="assets/great_hall_slide.png", n_lines=1024, processing_lvl =4, json_path="assets/cam_settings.json", cal_path="assets/cam_calibration.nc" )print(f"Processing level: {cam.proc_lvl}")print(f"Transform list: {cam.tfm_list}")# Show how transforms would be appliedifhasattr(cam, 'tfm_list'):print("Transform pipeline:")for i, transform inenumerate(cam.tfm_list or []):print(f" {i+1}. {transform}")
# Example: How mixins add functionalityfrom openhsi.calibrate import SettingsBuilderMixin# Show mixin methodsmixin_methods = [method for method indir(SettingsBuilderMixin) ifnot method.startswith('_') andcallable(getattr(SettingsBuilderMixin, method))]print("SettingsBuilderMixin methods:", mixin_methods)# Example of dynamic composition (simplified)def demonstrate_mixin_composition():"""Show how mixins are composed with base classes"""# This is conceptually how camera classes with calibration are created:# CalibrationCamera = type('CalibrationCamera', # (SimulatedCamera, SettingsBuilderMixin), {})print("Mixin composition adds calibration methods to any camera class")print("Result: Camera + Calibration = Full featured calibration camera")demonstrate_mixin_composition()
SettingsBuilderMixin methods: ['fit_HgAr_lines', 'fit_emission_lines', 'retake_HgAr', 'retake_emission_lines', 'retake_flat_field', 'update_intsphere_cube', 'update_intsphere_fit', 'update_resolution', 'update_row_minmax', 'update_smile_shifts', 'update_window_across_track', 'update_window_along_track']
Mixin composition adds calibration methods to any camera class
Result: Camera + Calibration = Full featured calibration camera