From a0849feca7cad388f3c895b1a0ce0def1c49bcb8 Mon Sep 17 00:00:00 2001 From: froejdh_e Date: Tue, 3 Jun 2025 09:33:39 +0200 Subject: [PATCH] macro for bindings and better lookup --- python/aare/ClusterFinder.py | 75 ++++++++++--------- python/src/module.cpp | 136 ++++++++++++++++++++++------------- 2 files changed, 129 insertions(+), 82 deletions(-) diff --git a/python/aare/ClusterFinder.py b/python/aare/ClusterFinder.py index 6e7c352..521e0c1 100644 --- a/python/aare/ClusterFinder.py +++ b/python/aare/ClusterFinder.py @@ -1,22 +1,47 @@ -from ._aare import ClusterFinder_Cluster3x3i, ClusterFinder_Cluster2x2i, ClusterFinderMT_Cluster3x3i, ClusterFinderMT_Cluster2x2i, ClusterCollector_Cluster3x3i, ClusterCollector_Cluster2x2i +# from ._aare import ClusterFinder_Cluster3x3i, ClusterFinder_Cluster2x2i, ClusterFinderMT_Cluster3x3i, ClusterFinderMT_Cluster2x2i, ClusterCollector_Cluster3x3i, ClusterCollector_Cluster2x2i -from ._aare import ClusterFileSink_Cluster3x3i, ClusterFileSink_Cluster2x2i +# from ._aare import ClusterFileSink_Cluster3x3i, ClusterFileSink_Cluster2x2i + +from . import _aare import numpy as np +_supported_cluster_sizes = [(2,2), (3,3), (5,5), (7,7), (9,9),] + +# def _get_class() + +def _type_to_char(dtype): + if dtype == np.int32: + return 'i' + elif dtype == np.float32: + return 'f' + elif dtype == np.float64: + return 'd' + else: + raise ValueError(f"Unsupported dtype: {dtype}. Only np.int32, np.float32, and np.float64 are supported.") + +def _get_class(name, cluster_size, dtype): + """ + Helper function to get the class based on the name, cluster size, and dtype. + """ + try: + class_name = f"{name}_Cluster{cluster_size[0]}x{cluster_size[1]}{_type_to_char(dtype)}" + cls = getattr(_aare, class_name) + except AttributeError: + raise ValueError(f"Unsupported combination of type and cluster size: {dtype}/{cluster_size} when requesting {class_name}") + return cls + + + def ClusterFinder(image_size, cluster_size, n_sigma=5, dtype = np.int32, capacity = 1024): """ Factory function to create a ClusterFinder object. Provides a cleaner syntax for the templated ClusterFinder in C++. """ - if dtype == np.int32 and cluster_size == (3,3): - return ClusterFinder_Cluster3x3i(image_size, n_sigma = n_sigma, capacity=capacity) - elif dtype == np.int32 and cluster_size == (2,2): - return ClusterFinder_Cluster2x2i(image_size, n_sigma = n_sigma, capacity=capacity) - else: - #TODO! add the other formats - raise ValueError(f"Unsupported dtype: {dtype}. Only np.int32 is supported.") + cls = _get_class("ClusterFinder", cluster_size, dtype) + return cls(image_size, n_sigma=n_sigma, capacity=capacity) + def ClusterFinderMT(image_size, cluster_size = (3,3), dtype=np.int32, n_sigma=5, capacity = 1024, n_threads = 3): @@ -25,15 +50,9 @@ def ClusterFinderMT(image_size, cluster_size = (3,3), dtype=np.int32, n_sigma=5, the templated ClusterFinderMT in C++. """ - if dtype == np.int32 and cluster_size == (3,3): - return ClusterFinderMT_Cluster3x3i(image_size, n_sigma = n_sigma, - capacity = capacity, n_threads = n_threads) - elif dtype == np.int32 and cluster_size == (2,2): - return ClusterFinderMT_Cluster2x2i(image_size, n_sigma = n_sigma, - capacity = capacity, n_threads = n_threads) - else: - #TODO! add the other formats - raise ValueError(f"Unsupported dtype: {dtype}. Only np.int32 is supported.") + cls = _get_class("ClusterFinderMT", cluster_size, dtype) + return cls(image_size, n_sigma=n_sigma, capacity=capacity, n_threads=n_threads) + def ClusterCollector(clusterfindermt, cluster_size = (3,3), dtype=np.int32): @@ -42,14 +61,8 @@ def ClusterCollector(clusterfindermt, cluster_size = (3,3), dtype=np.int32): the templated ClusterCollector in C++. """ - if dtype == np.int32 and cluster_size == (3,3): - return ClusterCollector_Cluster3x3i(clusterfindermt) - elif dtype == np.int32 and cluster_size == (2,2): - return ClusterCollector_Cluster2x2i(clusterfindermt) - - else: - #TODO! add the other formats - raise ValueError(f"Unsupported dtype: {dtype}. Only np.int32 is supported.") + cls = _get_class("ClusterCollector", cluster_size, dtype) + return cls(clusterfindermt) def ClusterFileSink(clusterfindermt, cluster_file, dtype=np.int32): """ @@ -57,11 +70,5 @@ def ClusterFileSink(clusterfindermt, cluster_file, dtype=np.int32): the templated ClusterCollector in C++. """ - if dtype == np.int32 and clusterfindermt.cluster_size == (3,3): - return ClusterFileSink_Cluster3x3i(clusterfindermt, cluster_file) - elif dtype == np.int32 and clusterfindermt.cluster_size == (2,2): - return ClusterFileSink_Cluster2x2i(clusterfindermt, cluster_file) - - else: - #TODO! add the other formats - raise ValueError(f"Unsupported dtype: {dtype}. Only np.int32 is supported.") \ No newline at end of file + cls = _get_class("ClusterFileSink", clusterfindermt.cluster_size, dtype) + return cls(clusterfindermt, cluster_file) \ No newline at end of file diff --git a/python/src/module.cpp b/python/src/module.cpp index 5945afb..f26bcf8 100644 --- a/python/src/module.cpp +++ b/python/src/module.cpp @@ -28,6 +28,25 @@ namespace py = pybind11; +/* MACRO that defines Cluster bindings for a specific size and type + +T - Storage type of the cluster data (int, float, double) +N - Number of rows in the cluster +M - Number of columns in the cluster +U - Type of the pixel data (e.g., uint16_t) +TYPE_CODE - A character representing the type code (e.g., 'i' for int, 'd' for double, 'f' for float) + +*/ +#define DEFINE_CLUSTER_BINDINGS(T, N, M, U, TYPE_CODE) \ + define_ClusterFile(m, "Cluster" #N "x" #M #TYPE_CODE); \ + define_ClusterVector(m, "Cluster" #N "x" #M #TYPE_CODE); \ + define_ClusterFinder(m, "Cluster" #N "x" #M #TYPE_CODE); \ + define_ClusterFinderMT(m, "Cluster" #N "x" #M #TYPE_CODE); \ + define_ClusterFileSink(m, "Cluster" #N "x" #M #TYPE_CODE); \ + define_ClusterCollector(m, "Cluster" #N "x" #M #TYPE_CODE); \ + define_Cluster(m, #N "x" #M #TYPE_CODE); \ + register_calculate_eta(m); + PYBIND11_MODULE(_aare, m) { define_file_io_bindings(m); define_raw_file_io_bindings(m); @@ -42,59 +61,80 @@ PYBIND11_MODULE(_aare, m) { define_interpolation_bindings(m); define_jungfrau_data_file_io_bindings(m); - define_ClusterFile(m, "Cluster3x3i"); - define_ClusterFile(m, "Cluster3x3d"); - define_ClusterFile(m, "Cluster3x3f"); - define_ClusterFile(m, "Cluster2x2i"); - define_ClusterFile(m, "Cluster2x2f"); - define_ClusterFile(m, "Cluster2x2d"); + DEFINE_CLUSTER_BINDINGS(int, 3, 3, uint16_t, i); + DEFINE_CLUSTER_BINDINGS(double, 3, 3, uint16_t, d); + DEFINE_CLUSTER_BINDINGS(float, 3, 3, uint16_t, f); - define_ClusterVector(m, "Cluster3x3i"); - define_ClusterVector(m, "Cluster3x3d"); - define_ClusterVector(m, "Cluster3x3f"); - define_ClusterVector(m, "Cluster2x2i"); - define_ClusterVector(m, "Cluster2x2d"); - define_ClusterVector(m, "Cluster2x2f"); + DEFINE_CLUSTER_BINDINGS(int, 2, 2, uint16_t, i); + DEFINE_CLUSTER_BINDINGS(double, 2, 2, uint16_t, d); + DEFINE_CLUSTER_BINDINGS(float, 2, 2, uint16_t, f); - define_ClusterFinder(m, "Cluster3x3i"); - define_ClusterFinder(m, "Cluster3x3d"); - define_ClusterFinder(m, "Cluster3x3f"); - define_ClusterFinder(m, "Cluster2x2i"); - define_ClusterFinder(m, "Cluster2x2d"); - define_ClusterFinder(m, "Cluster2x2f"); + DEFINE_CLUSTER_BINDINGS(int, 5, 5, uint16_t, i); + DEFINE_CLUSTER_BINDINGS(double, 5, 5, uint16_t, d); + DEFINE_CLUSTER_BINDINGS(float, 5, 5, uint16_t, f); - define_ClusterFinderMT(m, "Cluster3x3i"); - define_ClusterFinderMT(m, "Cluster3x3d"); - define_ClusterFinderMT(m, "Cluster3x3f"); - define_ClusterFinderMT(m, "Cluster2x2i"); - define_ClusterFinderMT(m, "Cluster2x2d"); - define_ClusterFinderMT(m, "Cluster2x2f"); + DEFINE_CLUSTER_BINDINGS(int, 7, 7, uint16_t, i); + DEFINE_CLUSTER_BINDINGS(double, 7, 7, uint16_t, d); + DEFINE_CLUSTER_BINDINGS(float, 7, 7, uint16_t, f); - define_ClusterFileSink(m, "Cluster3x3i"); - define_ClusterFileSink(m, "Cluster3x3d"); - define_ClusterFileSink(m, "Cluster3x3f"); - define_ClusterFileSink(m, "Cluster2x2i"); - define_ClusterFileSink(m, "Cluster2x2d"); - define_ClusterFileSink(m, "Cluster2x2f"); + DEFINE_CLUSTER_BINDINGS(int, 9, 9, uint16_t, i); + DEFINE_CLUSTER_BINDINGS(double, 9, 9, uint16_t, d); + DEFINE_CLUSTER_BINDINGS(float, 9, 9, uint16_t, f); - define_ClusterCollector(m, "Cluster3x3i"); - define_ClusterCollector(m, "Cluster3x3d"); - define_ClusterCollector(m, "Cluster3x3f"); - define_ClusterCollector(m, "Cluster2x2i"); - define_ClusterCollector(m, "Cluster2x2d"); - define_ClusterCollector(m, "Cluster2x2f"); + // define_ClusterFile(m, "Cluster3x3i"); + // define_ClusterFile(m, "Cluster3x3d"); + // define_ClusterFile(m, "Cluster3x3f"); + // define_ClusterFile(m, "Cluster2x2i"); + // define_ClusterFile(m, "Cluster2x2f"); + // define_ClusterFile(m, "Cluster2x2d"); - define_Cluster(m, "3x3i"); - define_Cluster(m, "3x3f"); - define_Cluster(m, "3x3d"); - define_Cluster(m, "2x2i"); - define_Cluster(m, "2x2f"); - define_Cluster(m, "2x2d"); - register_calculate_eta(m); - register_calculate_eta(m); - register_calculate_eta(m); - register_calculate_eta(m); - register_calculate_eta(m); - register_calculate_eta(m); + // define_ClusterVector(m, "Cluster3x3i"); + // define_ClusterVector(m, "Cluster3x3d"); + // define_ClusterVector(m, "Cluster3x3f"); + // define_ClusterVector(m, "Cluster2x2i"); + // define_ClusterVector(m, "Cluster2x2d"); + // define_ClusterVector(m, "Cluster2x2f"); + + // define_ClusterFinder(m, "Cluster3x3i"); + // define_ClusterFinder(m, "Cluster3x3d"); + // define_ClusterFinder(m, "Cluster3x3f"); + // define_ClusterFinder(m, "Cluster2x2i"); + // define_ClusterFinder(m, "Cluster2x2d"); + // define_ClusterFinder(m, "Cluster2x2f"); + + // define_ClusterFinderMT(m, "Cluster3x3i"); + // define_ClusterFinderMT(m, "Cluster3x3d"); + // define_ClusterFinderMT(m, "Cluster3x3f"); + // define_ClusterFinderMT(m, "Cluster2x2i"); + // define_ClusterFinderMT(m, "Cluster2x2d"); + // define_ClusterFinderMT(m, "Cluster2x2f"); + + // define_ClusterFileSink(m, "Cluster3x3i"); + // define_ClusterFileSink(m, "Cluster3x3d"); + // define_ClusterFileSink(m, "Cluster3x3f"); + // define_ClusterFileSink(m, "Cluster2x2i"); + // define_ClusterFileSink(m, "Cluster2x2d"); + // define_ClusterFileSink(m, "Cluster2x2f"); + + // define_ClusterCollector(m, "Cluster3x3i"); + // define_ClusterCollector(m, "Cluster3x3d"); + // define_ClusterCollector(m, "Cluster3x3f"); + // define_ClusterCollector(m, "Cluster2x2i"); + // define_ClusterCollector(m, "Cluster2x2d"); + // define_ClusterCollector(m, "Cluster2x2f"); + + // // define_Cluster(m, "3x3i"); + // define_Cluster(m, "3x3f"); + // define_Cluster(m, "3x3d"); + // define_Cluster(m, "2x2i"); + // define_Cluster(m, "2x2f"); + // define_Cluster(m, "2x2d"); + + // // register_calculate_eta(m); + // register_calculate_eta(m); + // register_calculate_eta(m); + // register_calculate_eta(m); + // register_calculate_eta(m); + // register_calculate_eta(m); }