78 std::vector<AxisData> axisVector = std::vector<AxisData>(2);
80 axisVector[0].label = hAxis;
81 axisVector[0].bins =
getProperty(
"NumberHorizontalBins");
83 axisVector[1].label = vAxis;
84 axisVector[1].bins =
getProperty(
"NumberVerticalBins");
85 for (
int axisIndex = 0; axisIndex < 2; ++axisIndex) {
86 axisVector[axisIndex].max = std::numeric_limits<double>::lowest();
87 axisVector[axisIndex].min = std::numeric_limits<double>::max();
98 std::string outName =
"_" + inputWs->getName() +
"_integrated";
99 alg->setProperty(
"OutputWorkspace", outName);
100 alg->executeAsChildAlg();
103 auto nHist =
static_cast<int>(summedWs->getNumberHistograms());
106 std::vector<SpectraData> dataVector(nHist);
110 const auto &spectrumInfo = summedWs->spectrumInfo();
113 for (
int i = 0; i < nHist; ++i) {
116 V3D pos = spectrumInfo.position(i);
117 double r, theta, phi;
121 for (
int axisIndex = 0; axisIndex < 2; ++axisIndex) {
122 double axisValue = std::numeric_limits<double>::min();
123 std::string axisSelection = axisVector[axisIndex].label;
126 if (axisSelection ==
"x") {
128 }
else if (axisSelection ==
"y") {
130 }
else if (axisSelection ==
"z") {
132 }
else if (axisSelection ==
"r") {
134 }
else if (axisSelection ==
"theta") {
136 }
else if (axisSelection ==
"phi") {
138 }
else if (axisSelection ==
"2theta") {
139 axisValue = spectrumInfo.twoTheta(i);
140 }
else if (axisSelection ==
"signed2theta") {
141 axisValue = spectrumInfo.signedTwoTheta(i);
144 if (axisIndex == 0) {
145 dataVector[i].horizontalValue = axisValue;
147 dataVector[i].verticalValue = axisValue;
151 if (axisValue > axisVector[axisIndex].max)
152 axisVector[axisIndex].max = axisValue;
153 if (axisValue < axisVector[axisIndex].min)
154 axisVector[axisIndex].min = axisValue;
157 g_log.
debug() <<
"Could not find detector for workspace index " << i <<
'\n';
160 dataVector[i].horizontalValue = std::numeric_limits<double>::min();
161 dataVector[i].verticalValue = std::numeric_limits<double>::min();
166 dataVector[i].intensity = summedWs->y(i)[0];
167 dataVector[i].error = summedWs->e(i)[0];
169 progress.report(
"Calculating new coords");
173 g_log.
warning() <<
"Could not find detector for " << failedCount <<
" spectra, see the debug log for more details.\n";
176 std::vector<double> x_tmp(axisVector[0].bins);
179 HistogramData::Points
x(std::move(x_tmp));
181 outputWs->getAxis(0)->unit() = UnitFactory::Instance().create(
"Label");
182 Unit_sptr xUnit = outputWs->getAxis(0)->unit();
183 std::shared_ptr<Units::Label> xlabel = std::dynamic_pointer_cast<Units::Label>(xUnit);
184 xlabel->setLabel(axisVector[0].label,
m_unitMap[axisVector[0].label]);
187 yRef.resize(axisVector[1].bins);
190 auto yAxis = std::make_unique<NumericAxis>(yRef);
191 std::shared_ptr<Units::Label> ylabel =
192 std::dynamic_pointer_cast<Units::Label>(UnitFactory::Instance().
create(
"Label"));
193 ylabel->setLabel(axisVector[1].label,
m_unitMap[axisVector[1].label]);
194 yAxis->unit() = ylabel;
195 outputWs->replaceAxis(1, std::move(yAxis));
200 for (
int i = 0; i < nHist; ++i) {
202 if (dataVector[i].horizontalValue == std::numeric_limits<double>::min()) {
203 dataVector[i].horizontalIndex = -1;
204 dataVector[i].verticalIndex = -1;
206 int xIndex =
static_cast<int>(
207 std::distance(
x.cbegin(), std::lower_bound(
x.cbegin(),
x.cend(), dataVector[i].horizontalValue)));
210 int yIndex =
static_cast<int>(
211 std::distance(
y->begin(), std::lower_bound(
y->begin(),
y->end(), dataVector[i].verticalValue)));
215 dataVector[i].horizontalIndex = xIndex;
216 dataVector[i].verticalIndex = yIndex;
218 progress.report(
"Calculating Rebinning");
222 auto nOutputHist =
static_cast<int>(outputWs->getNumberHistograms());
224 for (
int i = 0; i < nOutputHist; ++i) {
225 outputWs->setPoints(i,
x);
230 for (
int i = 0; i < nHist; ++i) {
231 int xIndex = dataVector[i].horizontalIndex;
232 int yIndex = dataVector[i].verticalIndex;
235 if ((xIndex == -1) || (yIndex == -1)) {
240 auto &yVec = outputWs->mutableY(yIndex);
241 yVec[xIndex] = yVec[xIndex] + dataVector[i].intensity;
242 auto &eVec = outputWs->mutableE(yIndex);
243 eVec[xIndex] = eVec[xIndex] + (dataVector[i].error * dataVector[i].error);
246 progress.report(
"Assigning to new grid");
251 for (
int i = 0; i < nOutputHist; ++i) {
252 auto &errorVec = outputWs->mutableE(i);
253 std::transform(errorVec.begin(), errorVec.end(), errorVec.begin(),
static_cast<double (*)(
double)
>(sqrt));
254 progress.report(
"Completing Error Calculation");