72 const double horizontal = alpha * alpha;
73 const double vertical_numerator = 4. * (beta0 * beta0 + beta1 * beta1);
77 DataObjects::create<DataObjects::Workspace2D>(*inputWS, HistogramData::Points(1));
80 const auto &spectrumInfo = inputWS->spectrumInfo();
81 const auto samplepos = spectrumInfo.samplePosition();
82 const auto &componentInfo = inputWS->componentInfo();
83 const auto &detectorInfo = inputWS->detectorInfo();
84 size_t numspec = inputWS->getNumberHistograms();
85 double solidangletotal = 0.;
86 for (
size_t i = 0; i < numspec; ++i) {
88 const double twotheta = spectrumInfo.isMonitor(i) ? 0.0 : spectrumInfo.twoTheta(i);
89 const double sintwotheta = sin(twotheta);
91 const double vertical = vertical_numerator / (sintwotheta * sintwotheta);
94 auto &spectrumDefinition = spectrumInfo.spectrumDefinition(i);
97 const double solidangle =
98 std::accumulate(spectrumDefinition.cbegin(), spectrumDefinition.cend(), 0.,
99 [&componentInfo, &detectorInfo, &samplepos](
const auto sum,
const auto &
index) {
100 if (!detectorInfo.isMasked(index.first)) {
101 return sum + componentInfo.solidAngle(index.first, samplepos);
106 solidangletotal += solidangle;
107 const double deltatwotheta = sqrt(solidangle);
110 const double divergence = .5 * sqrt(deltatwotheta * deltatwotheta + horizontal + vertical);
111 divergenceWS->mutableX(i)[0] =
static_cast<double>(i);
112 if (spectrumInfo.isMonitor(i))
113 divergenceWS->mutableY(i)[0] = 0.;
115 divergenceWS->mutableY(i)[0] = divergence;
117 g_log.
notice() <<
"total solid angle " << solidangletotal <<
"\n";
119 setProperty(
"OutputWorkspace", divergenceWS);