119 std::map<std::string, std::string> results;
126 if (!groupedResult.empty()) {
127 results[PropertyNames::GROUP_CALIB] =
"The GroupedCalibration Workspace is missing [ " + groupedResult +
"]";
130 std::stringstream msg(
"");
131 const auto difa = groupedCalibrationWS->getColumn(ColNames::DIFA);
132 const auto tzero = groupedCalibrationWS->getColumn(ColNames::TZERO);
133 const auto numRows = groupedCalibrationWS->rowCount();
134 for (std::size_t i = 0; i < numRows; ++i) {
135 if (
difa->toDouble(i) != 0.) {
136 msg <<
"found nonzero difa in row " << i;
138 }
else if (
tzero->toDouble(i) != 0.) {
139 msg <<
"found nonzero tzero in row " << i;
143 if (!msg.str().empty()) {
144 results[PropertyNames::GROUP_CALIB] = msg.str();
149 if (!pixelResult.empty())
150 results[PropertyNames::PIXEL_CALIB] =
"The PixelCalibration Workspace is missing [ " + pixelResult +
"]";
157 auto prev_col = pixelCalibrationWS->getColVector<
detid_t>(ColNames::DETID);
158 auto pd_col = groupedCalibrationWS->getColVector<
detid_t>(ColNames::DETID);
159 auto arb_col = calibrationWS->detectorInfo().detectorIDs();
160 std::set<detid_t> detid_pd(std::make_move_iterator(pd_col.begin()), std::make_move_iterator(pd_col.end()));
161 std::set<detid_t> detid_prev(std::make_move_iterator(prev_col.begin()), std::make_move_iterator(prev_col.end()));
162 std::set<detid_t> detid_arb(std::make_move_iterator(arb_col.begin()), std::make_move_iterator(arb_col.end()));
164 std::set<std::string> unmatched;
166 if (!std::includes(detid_arb.begin(), detid_arb.end(), detid_prev.begin(), detid_prev.end())) {
167 unmatched.insert(PropertyNames::PIXEL_CALIB);
168 unmatched.insert(PropertyNames::ARB_CALIB);
171 if (!std::includes(detid_arb.begin(), detid_arb.end(), detid_pd.begin(), detid_pd.end())) {
172 unmatched.insert(PropertyNames::GROUP_CALIB);
173 unmatched.insert(PropertyNames::ARB_CALIB);
176 if (!unmatched.empty()) {
177 std::stringstream msg(
"");
178 msg <<
"Inconsistent detector IDs between";
179 for (std::string
const &
x : unmatched) {
183 for (std::string
const &
x : unmatched) {
184 results[
x] = msg.str();
192 const size_t lastStart) {
193 size_t start = lastStart;
194 size_t end = ws->rowCount() - 1;
197 std::shared_ptr<const API::Column> detIdColumn = ws->getColumn(ColNames::DETID);
200 if (getDetId(detIdColumn, start) == detid) {
201 return std::make_shared<Mantid::API::TableRow>(ws->getRow(start));
204 if ((end >= start) && (getDetId(detIdColumn, start) == detid)) {
205 return std::make_shared<Mantid::API::TableRow>(ws->getRow(start));
212 while (end >= start) {
213 const size_t currentPosition = start + ((end - start) / 2);
215 const auto detIdInRow = getDetId(detIdColumn, currentPosition);
216 if (detIdInRow > detid) {
217 end = currentPosition - 1;
218 }
else if (detIdInRow < detid) {
219 start = currentPosition + 1;
221 return std::make_shared<Mantid::API::TableRow>(ws->getRow(currentPosition));
268 outputWorkspace->addColumn(
"int", ColNames::DETID);
269 outputWorkspace->addColumn(
"double", ColNames::DIFC);
270 outputWorkspace->addColumn(
"double", ColNames::DIFA);
271 outputWorkspace->addColumn(
"double", ColNames::TZERO);
274 std::set<int> detidsInGrpCalib;
276 API::Progress prog(
this, 0.0, 1.0, groupedCalibrationWS->rowCount());
279 std::map<std::size_t, double> difcArbMap;
284 std::size_t lastStart = 0;
289 auto wkspIndices = calibrationWS->getDetectorIDToWorkspaceIndexMap();
294 auto spectrumInfo = calibrationWS->spectrumInfo();
300 const int detid = groupedCalibrationWS->cell_cast<
int>(groupedCalibrationRow.
row(), 0);
301 detidsInGrpCalib.insert(detid);
302 bool prevDifValsExist =
false;
304 if (!(maskWorkspace && maskWorkspace->isMasked(detid))) {
305 std::shared_ptr<Mantid::API::TableRow> pixelCalibrationRow =
307 if (pixelCalibrationRow) {
309 const double difcPD = groupedCalibrationWS->cell_cast<
double>(groupedCalibrationRow.
row(), 1);
312 const auto wkspIndex = wkspIndices[detid];
315 const auto difcArbIter = difcArbMap.find(wkspIndex);
316 if (difcArbIter == difcArbMap.end()) {
318 difcArbMap[wkspIndex] = difcArb;
320 difcArb = difcArbIter->second;
324 const double difcPrev = pixelCalibrationWS->cell_cast<
double>(pixelCalibrationRow->row(), 1);
325 const double difaPrev = pixelCalibrationWS->cell_cast<
double>(pixelCalibrationRow->row(), 2);
328 const double difcNew = (difcPD / difcArb) * difcPrev;
329 const double difaNew = ((difcPD / difcArb) * (difcPD / difcArb)) * difaPrev;
332 const double tzeroNew = pixelCalibrationWS->cell_cast<
double>(pixelCalibrationRow->row(), 3);
335 newRow << detid << difcNew << difaNew << tzeroNew;
336 prevDifValsExist =
true;
339 lastStart = pixelCalibrationRow->
row() + 1;
343 if (!prevDifValsExist) {
349 }
while (groupedCalibrationRow.
next());
353 bool shouldSortOutputTable{
false};
354 const std::size_t NUM_PIXEL_ROW = pixelCalibrationWS->rowCount();
355 for (std::size_t i = 0; i < NUM_PIXEL_ROW; ++i) {
356 const int detid = pixelCalibrationWS->cell_cast<
int>(i, 0);
357 if (!(maskWorkspace && maskWorkspace->isMasked(detid))) {
358 if (detidsInGrpCalib.count(detid) == 0) {
361 shouldSortOutputTable =
true;
367 if (shouldSortOutputTable)
368 outputWorkspace = std::dynamic_pointer_cast<DataObjects::TableWorkspace>(
sortTableWorkspace(outputWorkspace));