diff --git a/Device/Resolution/ConvolutionDetectorResolution.cpp b/Device/Resolution/ConvolutionDetectorResolution.cpp index a1c9a4173a731dbf828e1268634906611dddf88b..cbac09608ccedd62383c20fc388e5c89d21de717 100644 --- a/Device/Resolution/ConvolutionDetectorResolution.cpp +++ b/Device/Resolution/ConvolutionDetectorResolution.cpp @@ -75,11 +75,10 @@ void ConvolutionDetectorResolution::apply1dConvolution(Datafield* df) const ASSERT(df->rank() == 1); const Scale& axis = df->axis(0); - // Construct source vector from original intensity map - std::vector<double> source_vector = df->flatVector(); - size_t n = source_vector.size(); + const size_t n = df->size(); if (n < 2) return; // No convolution for sets of zero or one element + // Construct kernel vector from resolution function ASSERT(axis.size() == n); double step_size = std::abs(axis.binCenter(0) - axis.binCenter(n - 1)) / (n - 1); @@ -89,7 +88,7 @@ void ConvolutionDetectorResolution::apply1dConvolution(Datafield* df) const kernel.push_back(getIntegratedPDF1d(axis.binCenter(index) - mid_value, step_size)); // Calculate convolution std::vector<double> result; - Convolve().fftconvolve(source_vector, kernel, result); + Convolve().fftconvolve(df->flatVector(), kernel, result); // Truncate negative values that can arise because of finite precision of Fourier Transform for (double& e : result) e = std::max(0.0, e); @@ -103,18 +102,10 @@ void ConvolutionDetectorResolution::apply2dConvolution(Datafield* df) const ASSERT(df->rank() == 2); const Scale& X = df->axis(0); const Scale& Y = df->axis(1); - size_t nx = X.size(); - size_t ny = Y.size(); - ASSERT(nx > 1); - ASSERT(ny > 1); - - // Construct source vector array from original intensity map - std::vector<double> raw_source_vector = df->flatVector(); - std::vector<std::vector<double>> source; - size_t raw_data_size = raw_source_vector.size(); - ASSERT(raw_data_size == nx * ny); - for (auto it = raw_source_vector.begin(); it != raw_source_vector.end(); it += ny) - source.emplace_back(std::vector<double>(it, it + ny)); + const size_t nx = X.size(); + const size_t ny = Y.size(); + if (nx < 2 && ny < 2) + return; // Construct kernel vector from resolution function std::vector<std::vector<double>> kernel; @@ -135,7 +126,7 @@ void ConvolutionDetectorResolution::apply2dConvolution(Datafield* df) const } // Calculate convolution std::vector<std::vector<double>> result; - Convolve().fftconvolve(source, kernel, result); + Convolve().fftconvolve(df->values2D(), kernel, result); // Populate intensity map with results std::vector<double> result_vector;