164 const double lorentzPos,
const double lorentzAmp,
const double lorentzWidth,
165 const double gaussWidth)
const {
166 double miny(DBL_MAX), maxy(-DBL_MAX);
167 auto iend = yspace.end();
168 for (
auto itr = yspace.begin(); itr != iend; ++itr) {
169 const double absy = std::abs(*itr);
172 else if (absy > maxy)
175 const double epsilon = (maxy - miny) / 1000.0;
180 std::vector<double> ypmEps(yspace.size());
182 using std::placeholders::_1;
183 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
184 std::bind(std::plus<double>(), _1, 2.0 * epsilon));
185 m_resolutionFunction->voigtApprox(voigtDiff, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
187 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
188 std::bind(std::minus<double>(), _1, 2.0 * epsilon));
189 std::vector<double> tmpResult(yspace.size());
190 m_resolutionFunction->voigtApprox(tmpResult, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
192 std::transform(voigtDiff.begin(), voigtDiff.end(), tmpResult.begin(), voigtDiff.begin(), std::minus<double>());
195 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
196 std::bind(std::plus<double>(), _1, epsilon));
197 m_resolutionFunction->voigtApprox(tmpResult, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
198 std::transform(tmpResult.begin(), tmpResult.end(), tmpResult.begin(),
199 std::bind(std::multiplies<double>(), _1, 2.0));
201 std::transform(voigtDiff.begin(), voigtDiff.end(), tmpResult.begin(), voigtDiff.begin(), std::minus<double>());
204 std::transform(yspace.begin(), yspace.end(), ypmEps.begin(),
205 std::bind(std::minus<double>(), _1, epsilon));
206 m_resolutionFunction->voigtApprox(tmpResult, ypmEps, lorentzPos, lorentzAmp, lorentzWidth, gaussWidth);
207 std::transform(tmpResult.begin(), tmpResult.end(), tmpResult.begin(),
208 std::bind(std::multiplies<double>(), _1, 2.0));
210 std::transform(voigtDiff.begin(), voigtDiff.end(), tmpResult.begin(), voigtDiff.begin(), std::plus<double>());
213 std::transform(voigtDiff.begin(), voigtDiff.end(), voigtDiff.begin(),
214 std::bind(std::divides<double>(), _1, 2.0 * std::pow(epsilon, 3)));