165 const double lorentzPos,
const double lorentzAmp,
const double lorentzWidth,
166 const double gaussWidth)
const {
167 double miny(DBL_MAX), maxy(-DBL_MAX);
168 auto iend = yspace.end();
169 for (
auto itr = yspace.begin(); itr !=
iend; ++itr) {
170 const double absy = std::abs(*itr);
173 else if (absy > maxy)
176 const double epsilon = (maxy - miny) / 1000.0;
181 std::vector<double> ypmEps(yspace.size());
183 using std::placeholders::_1;
184 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
185 std::bind(std::plus<double>(), _1, 2.0 * epsilon));
186 m_resolutionFunction->voigtApprox(voigtDiff, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
188 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
189 std::bind(std::minus<double>(), _1, 2.0 * epsilon));
190 std::vector<double> tmpResult(yspace.size());
191 m_resolutionFunction->voigtApprox(tmpResult, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
193 std::transform(voigtDiff.begin(), voigtDiff.end(), tmpResult.begin(), voigtDiff.begin(), std::minus<double>());
196 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
197 std::bind(std::plus<double>(), _1, epsilon));
198 m_resolutionFunction->voigtApprox(tmpResult, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
199 std::transform(tmpResult.begin(), tmpResult.end(), tmpResult.begin(),
200 std::bind(std::multiplies<double>(), _1, 2.0));
202 std::transform(voigtDiff.begin(), voigtDiff.end(), tmpResult.begin(), voigtDiff.begin(), std::minus<double>());
205 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
206 std::bind(std::minus<double>(), _1, epsilon));
207 m_resolutionFunction->voigtApprox(tmpResult, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
208 std::transform(tmpResult.begin(), tmpResult.end(), tmpResult.begin(),
209 std::bind(std::multiplies<double>(), _1, 2.0));
211 std::transform(voigtDiff.begin(), voigtDiff.end(), tmpResult.begin(), voigtDiff.begin(), std::plus<double>());
214 std::transform(voigtDiff.begin(), voigtDiff.end(), voigtDiff.begin(),
215 std::bind(std::divides<double>(), _1, 2.0 * std::pow(epsilon, 3)));