diff --git a/Sim/Simulation/DepthprobeSimulation.cpp b/Sim/Simulation/DepthprobeSimulation.cpp index 1f3fd8e4b509830e0921600a6dcd400b7a1710a4..ecce35559eb24e6d21203a3e94a55fc3658d42c0 100644 --- a/Sim/Simulation/DepthprobeSimulation.cpp +++ b/Sim/Simulation/DepthprobeSimulation.cpp @@ -89,37 +89,21 @@ public: , m_wavelength(wavelength) , m_alpha_i(alpha_i) , m_z_positions(z_positions) - { - ASSERT(z_positions); - m_intensities.resize(z_positions->size(), 0.0); - } - - double wavelength() const { return m_wavelength; } - double alphaI() const { return m_alpha_i; } - R3 getKi() const - { - return vecOfLambdaAlphaPhi(m_wavelength, m_alpha_i); - } - - template <typename T> - void setIntensities(T&& intensities) { - static_assert( - std::is_assignable<std::valarray<double>, typename std::decay<T>::type>::value, - "Error in DepthprobeElement::setIntensities: wrong type of input data."); - m_intensities = std::forward<T>(intensities); + ASSERT(z_positions); } - const std::valarray<double>& getIntensities() const { return m_intensities; } + double wavelength() const { return m_wavelength; } + double alphaI() const { return m_alpha_i; } + R3 getKi() const { return vecOfLambdaAlphaPhi(m_wavelength, m_alpha_i); } void setZPositions(const IAxis* z_positions) { m_z_positions = z_positions; } const IAxis* getZPositions() const { return m_z_positions; } private: const double m_wavelength; - const double m_alpha_i; //!< incident angle of the beam - std::valarray<double> m_intensities; //!< simulated intensity for the set of z positions - const IAxis* m_z_positions; //!< positions (lower z corresponds to a greater depth) + const double m_alpha_i; //!< incident angle of the beam + const IAxis* m_z_positions; //!< positions (lower z corresponds to a greater depth) }; //<<<<<<< @@ -127,14 +111,15 @@ private: void DepthprobeSimulation::runComputation(const ReSample& re_sample, size_t i, double weight) { const double result_angle = m_scan->coordinateAxis()->bin(i).center() + m_scan->alphaOffset(); + const size_t n_z = m_z_axis->size(); + std::valarray<double> intensities; //!< simulated intensity for the set of z positions + intensities.resize(n_z, 0.0); DepthprobeElement ele(m_scan->wavelength(), -result_angle, m_z_axis.get()); if (0 < result_angle && result_angle < M_PI_2) { const IAxis& z_positions = *ele.getZPositions(); - const size_t n_z = z_positions.size(); const size_t n_layers = re_sample.numberOfSlices(); size_t start_z_ind = n_z; - std::valarray<double> intensities(0.0, n_z); const Fluxes fluxes = re_sample.fluxesIn(ele.getKi()); @@ -163,7 +148,6 @@ void DepthprobeSimulation::runComputation(const ReSample& re_sample, size_t i, d } start_z_ind = ip1_z; } - ele.setIntensities(std::move(intensities)); } progress().incrementDone(1); @@ -172,7 +156,8 @@ void DepthprobeSimulation::runComputation(const ReSample& re_sample, size_t i, d double intensity_factor = m_scan->intensity(); if (footprint != nullptr) intensity_factor *= footprint->calculate(alpha_i); - ele.setIntensities(ele.getIntensities() * intensity_factor); + for (double& v : intensities) + v *= intensity_factor; if (background()) throw std::runtime_error( @@ -180,7 +165,7 @@ void DepthprobeSimulation::runComputation(const ReSample& re_sample, size_t i, d const size_t N1 = m_z_axis->size(); for (size_t j = 0; j < N1; ++j) - m_cache[i * N1 + j] += ele.getIntensities()[j] * weight; + m_cache[i * N1 + j] += intensities[j] * weight; } //... Overridden getters: