diff --git a/include/aare/ClusterFinder.hpp b/include/aare/ClusterFinder.hpp index 3c5884d..330abc8 100644 --- a/include/aare/ClusterFinder.hpp +++ b/include/aare/ClusterFinder.hpp @@ -21,9 +21,11 @@ class ClusterFinder { const PEDESTAL_TYPE c3; ChunkedPedestal m_pedestal; ClusterVector m_clusters; + const uint32_t ClusterSizeX; + const uint32_t ClusterSizeY; - static const uint8_t ClusterSizeX = ClusterType::cluster_size_x; - static const uint8_t ClusterSizeY = ClusterType::cluster_size_y; + static const uint8_t SavedClusterSizeX = ClusterType::cluster_size_x; + static const uint8_t SavedClusterSizeY = ClusterType::cluster_size_y; using CT = typename ClusterType::value_type; public: @@ -37,10 +39,12 @@ class ClusterFinder { */ ClusterFinder(Shape<2> image_size, PEDESTAL_TYPE nSigma = 5.0, size_t capacity = 1000000, - uint32_t chunk_size = 50000, uint32_t n_chunks = 10) + uint32_t chunk_size = 50000, uint32_t n_chunks = 10, + uint32_t cluster_size_x = 3, uint32_t cluster_size_y = 3) : m_image_size(image_size), m_nSigma(nSigma), - c2(sqrt((ClusterSizeY + 1) / 2 * (ClusterSizeX + 1) / 2)), - c3(sqrt(ClusterSizeX * ClusterSizeY)), + c2(sqrt((cluster_size_y + 1) / 2 * (cluster_size_x + 1) / 2)), + c3(sqrt(cluster_size_x * cluster_size_y)), + ClusterSizeX(cluster_size_x), ClusterSizeY(cluster_size_y), m_pedestal(image_size[0], image_size[1], chunk_size, n_chunks), m_clusters(capacity) { LOG(logDEBUG) << "ClusterFinder: " << "image_size: " << image_size[0] << "x" << image_size[1] @@ -63,7 +67,7 @@ class ClusterFinder { NDArray noise() { return m_pedestal.std(); } void clear_pedestal() { m_pedestal.clear(); } - /** + /** * @brief Move the clusters from the ClusterVector in the ClusterFinder to a * new ClusterVector and return it. * @param realloc_same_capacity if true the new ClusterVector will have the @@ -80,11 +84,13 @@ class ClusterFinder { return tmp; } void find_clusters(NDView frame, uint64_t frame_number = 0) { - // // TODO! deal with even size clusters // // currently 3,3 -> +/- 1 // // 4,4 -> +/- 2 int dy = ClusterSizeY / 2; int dx = ClusterSizeX / 2; + int dy2 = SavedClusterSizeY / 2; + int dx2 = SavedClusterSizeX / 2; + int has_center_pixel_x = ClusterSizeX % 2; // for even sized clusters there is no proper cluster center and @@ -179,16 +185,19 @@ class ClusterFinder { // It's worth redoing the look since most of the time we // don't have a photon int i = 0; - for (int ir = -dy; ir < dy + has_center_pixel_y; ir++) { + for (int ir = -dy2; ir < dy2 + has_center_pixel_y; ir++) { size_t inner_row_offset = row_offset + (ir * frame.shape(1)); - for (int ic = -dx; ic < dx + has_center_pixel_y; ic++) { + for (int ic = -dx2; ic < dx2 + has_center_pixel_y; ic++) { if (ix + ic >= 0 && ix + ic < frame.shape(1) && iy + ir >= 0 && iy + ir < frame.shape(0)) { // if (m_pedestal.std(iy + ir, ix + ic) == 0) continue; - if (std_ptr[inner_row_offset + ix + ic] == 0) continue; + // if (std_ptr[inner_row_offset + ix + ic] == 0) continue; // CT tmp = static_cast(frame(iy + ir, ix + ic)) - static_cast(m_pedestal.mean(iy + ir, ix + ic)); - CT tmp = static_cast(frame(iy + ir, ix + ic)) - static_cast(mean_ptr[inner_row_offset + ix + ic]); + + CT tmp = 0; + if (std_ptr[inner_row_offset + ix + ic] != 0) + tmp = static_cast(frame(iy + ir, ix + ic)) - static_cast(mean_ptr[inner_row_offset + ix + ic]); cluster.data[i] = tmp; // Watch for out of bounds access i++; diff --git a/include/aare/ClusterFinderMT.hpp b/include/aare/ClusterFinderMT.hpp index 14522a2..d73719c 100644 --- a/include/aare/ClusterFinderMT.hpp +++ b/include/aare/ClusterFinderMT.hpp @@ -129,7 +129,8 @@ class ClusterFinderMT { */ ClusterFinderMT(Shape<2> image_size, PEDESTAL_TYPE nSigma = 5.0, size_t capacity = 2000, size_t n_threads = 3, - uint32_t chunk_size = 50000, uint32_t n_chunks = 10) + uint32_t chunk_size = 50000, uint32_t n_chunks = 10, + uint32_t cluster_size_x = 3, uint32_t cluster_size_y = 3) : m_n_threads(n_threads) { LOG(logDEBUG1) << "ClusterFinderMT: " @@ -142,7 +143,7 @@ class ClusterFinderMT { m_cluster_finders.push_back( std::make_unique< ClusterFinder>( - image_size, nSigma, capacity, chunk_size, n_chunks)); + image_size, nSigma, capacity, chunk_size, n_chunks, cluster_size_x, cluster_size_y)); } for (size_t i = 0; i < n_threads; i++) { m_input_queues.emplace_back(std::make_unique(200)); diff --git a/python/aare/ClusterFinder.py b/python/aare/ClusterFinder.py index a0e4fd0..b2bd1ea 100644 --- a/python/aare/ClusterFinder.py +++ b/python/aare/ClusterFinder.py @@ -26,24 +26,24 @@ def _get_class(name, cluster_size, dtype): -def ClusterFinder(image_size, cluster_size, n_sigma=5, dtype = np.int32, capacity = 1024, chunk_size=50000, n_chunks = 10): +def ClusterFinder(image_size, saved_cluster_size, checked_cluster_size, n_sigma=5, dtype = np.int32, capacity = 1024, chunk_size=50000, n_chunks = 10): """ Factory function to create a ClusterFinder object. Provides a cleaner syntax for the templated ClusterFinder in C++. """ - cls = _get_class("ClusterFinder", cluster_size, dtype) - return cls(image_size, n_sigma=n_sigma, capacity=capacity, chunk_size=chunk_size, n_chunks=n_chunks) + cls = _get_class("ClusterFinder", saved_cluster_size, dtype) + return cls(image_size, n_sigma=n_sigma, capacity=capacity, chunk_size=chunk_size, n_chunks=n_chunks, cluster_size_x=checked_cluster_size[0], cluster_size_y=checked_cluster_size[1]) -def ClusterFinderMT(image_size, cluster_size = (3,3), dtype=np.int32, n_sigma=5, capacity = 1024, n_threads = 3, chunk_size=50000, n_chunks = 10): +def ClusterFinderMT(image_size, saved_cluster_size = (3,3), checked_cluster_size = (3,3), dtype=np.int32, n_sigma=5, capacity = 1024, n_threads = 3, chunk_size=50000, n_chunks = 10): """ Factory function to create a ClusterFinderMT object. Provides a cleaner syntax for the templated ClusterFinderMT in C++. """ - cls = _get_class("ClusterFinderMT", cluster_size, dtype) - return cls(image_size, n_sigma=n_sigma, capacity=capacity, n_threads=n_threads, chunk_size=chunk_size, n_chunks=n_chunks) + cls = _get_class("ClusterFinderMT", saved_cluster_size, dtype) + return cls(image_size, n_sigma=n_sigma, capacity=capacity, n_threads=n_threads, chunk_size=chunk_size, n_chunks=n_chunks, cluster_size_x=checked_cluster_size[0], cluster_size_y=checked_cluster_size[1]) diff --git a/python/src/bind_ClusterFinder.hpp b/python/src/bind_ClusterFinder.hpp index d6e7e8b..2c86ff8 100644 --- a/python/src/bind_ClusterFinder.hpp +++ b/python/src/bind_ClusterFinder.hpp @@ -30,9 +30,10 @@ void define_ClusterFinder(py::module &m, const std::string &typestr) { py::class_>( m, class_name.c_str()) - .def(py::init, pd_type, size_t, uint32_t, uint32_t>(), py::arg("image_size"), - py::arg("n_sigma") = 5.0, py::arg("capacity") = 1'000'000, - py::arg("chunk_size") = 50'000, py::arg("n_chunks") = 10) + .def(py::init, pd_type, size_t, uint32_t, uint32_t, uint32_t, uint32_t>(), + py::arg("image_size"), py::arg("n_sigma") = 5.0, py::arg("capacity") = 1'000'000, + py::arg("chunk_size") = 50'000, py::arg("n_chunks") = 10, + py::arg("cluster_size_x") = 3, py::arg("cluster_size_y") = 3) .def("push_pedestal_frame", [](ClusterFinder &self, py::array_t frame) { diff --git a/python/src/bind_ClusterFinderMT.hpp b/python/src/bind_ClusterFinderMT.hpp index e45ed0b..b9d52f2 100644 --- a/python/src/bind_ClusterFinderMT.hpp +++ b/python/src/bind_ClusterFinderMT.hpp @@ -30,10 +30,11 @@ void define_ClusterFinderMT(py::module &m, const std::string &typestr) { py::class_>( m, class_name.c_str()) - .def(py::init, pd_type, size_t, size_t, uint32_t, uint32_t>(), + .def(py::init, pd_type, size_t, size_t, uint32_t, uint32_t, uint32_t, uint32_t>(), py::arg("image_size"), py::arg("n_sigma") = 5.0, py::arg("capacity") = 2048, py::arg("n_threads") = 3, - py::arg("chunk_size") = 50'000, py::arg("n_chunks") = 10) + py::arg("chunk_size") = 50'000, py::arg("n_chunks") = 10, + py::arg("cluster_size_x") = 3, py::arg("cluster_size_y") = 3) .def("push_pedestal_frame", [](ClusterFinderMT &self, py::array_t frame) {