diff --git a/Device/Data/Datafield.cpp b/Device/Data/Datafield.cpp index 38a8185c0006622915e496e05cb3f9404c125861..b17581263960879a96d6642d71caabcde386492f 100644 --- a/Device/Data/Datafield.cpp +++ b/Device/Data/Datafield.cpp @@ -132,12 +132,7 @@ Datafield::Datafield(const std::string& xlabel, const std::string& ylabel, newEquiDivision(ylabel, nrows, 0.0, (double)nrows)}; m_frame.reset(new Frame(std::move(axes))); - m_values.reserve(nrows * ncols); - for (size_t j = 0; j < nrows; ++j) { - ASSERT(vec[j].size() == ncols); - for (size_t i = 0; i < ncols; ++i) - m_values.push_back(vec[j][i]); - } + setVector2D(vec); } Datafield::Datafield(Datafield&&) noexcept = default; @@ -213,6 +208,21 @@ void Datafield::setVector(const std::vector<double>& vector) m_values = vector; } +void Datafield::setVector2D(const std::vector<std::vector<double>>& in) +{ + const size_t ncols = axis(0).size(); + const size_t nrows = axis(1).size(); + + ASSERT(in.size() == nrows); + m_values.clear(); + m_values.reserve(nrows * ncols); + for (size_t j = 0; j < nrows; ++j) { + ASSERT(in[j].size() == ncols); + for (size_t i = 0; i < ncols; ++i) + m_values.push_back(in[j][i]); + } +} + size_t Datafield::rank() const { return frame().rank(); @@ -446,11 +456,6 @@ Datafield Datafield::normalizedToMax() const } std::vector<std::vector<double>> Datafield::values2D() const -{ - return to2Dvector(m_values); -} - -std::vector<std::vector<double>> Datafield::to2Dvector(const std::vector<double>& in) const { ASSERT(rank() == 2); std::vector<std::vector<double>> result; @@ -463,7 +468,7 @@ std::vector<std::vector<double>> Datafield::to2Dvector(const std::vector<double> for (size_t row = 0; row < nrows; ++row) { result[row].resize(ncols, 0.0); for (size_t col = 0; col < ncols; ++col) - result[row][col] = in[row * ncols + col]; + result[row][col] = m_values[row * ncols + col]; } return result; diff --git a/Device/Data/Datafield.h b/Device/Data/Datafield.h index 90c67110260e6e762a96901d679da78966381d4a..5428c6dc3453ccdef281bb9620021bf3a7ceb8ae 100644 --- a/Device/Data/Datafield.h +++ b/Device/Data/Datafield.h @@ -147,6 +147,7 @@ public: //! Sets new values to raw data vector. void setVector(const std::vector<double>& data_vector); + void setVector2D(const std::vector<std::vector<double>>& in); bool hasErrorSigmas() const; std::vector<double>& errorSigmas(); @@ -167,8 +168,6 @@ private: //! between [xbinlow, xbinup]. Datafield* create_yProjection(int xbinlow, int xbinup) const; - std::vector<std::vector<double>> to2Dvector(const std::vector<double>& in) const; - #endif // SWIG }; diff --git a/Device/Resolution/ConvolutionDetectorResolution.cpp b/Device/Resolution/ConvolutionDetectorResolution.cpp index 571e3a5981fe17af1a01a65c4c2a18b29e5e5c55..a8b69dcda46731fdb9327d4e9c53a5560529a352 100644 --- a/Device/Resolution/ConvolutionDetectorResolution.cpp +++ b/Device/Resolution/ConvolutionDetectorResolution.cpp @@ -92,7 +92,7 @@ void ConvolutionDetectorResolution::apply1dConvolution(Datafield* df) const // Truncate negative values that can arise because of finite precision of Fourier Transform for (double& e : result) e = std::max(0.0, e); - // Populate intensity map with results + df->setVector(result); } @@ -124,17 +124,12 @@ void ConvolutionDetectorResolution::apply2dConvolution(Datafield* df) const } kernel[ix] = row_vector; } + // Calculate convolution std::vector<std::vector<double>> result; Convolve().fftconvolve(df->values2D(), kernel, result); - // Populate intensity map with results - ASSERT(nx * ny == df->size()); - for (size_t i = 0; i < df->size(); ++i) { - size_t i0 = df->frame().projectedIndex(i, 0); - size_t i1 = df->frame().projectedIndex(i, 1); - (*df)[i] = std::max(0.0, result[i0][i1]); - } + df->setVector2D(result); } double ConvolutionDetectorResolution::getIntegratedPDF1d(double x, double step) const