size_t LoadILLSANS::loadDataIntoWorkspaceFromMonitors(NeXus::NXEntry &firstEntry, size_t firstIndex) { // let's find the monitors // For D33 should be monitor1 and monitor2 for (std::vector<NXClassInfo>::const_iterator it = firstEntry.groups().begin(); it != firstEntry.groups().end(); ++it) { if (it->nxclass == "NXmonitor") { NXData dataGroup = firstEntry.openNXData(it->nxname); NXInt data = dataGroup.openIntData(); data.load(); g_log.debug() << "Monitor: " << it->nxname << " dims = " << data.dim0() << "x" << data.dim1() << "x" << data.dim2() << '\n'; const size_t vectorSize = data.dim2() + 1; std::vector<double> positionsBinning; positionsBinning.reserve(vectorSize); for (size_t i = 0; i < vectorSize; i++) positionsBinning.push_back(static_cast<double>(i)); // Assign X m_localWorkspace->dataX(firstIndex) .assign(positionsBinning.begin(), positionsBinning.end()); // Assign Y m_localWorkspace->dataY(firstIndex).assign(data(), data() + data.dim2()); // Assign Error MantidVec &E = m_localWorkspace->dataE(firstIndex); std::transform(data(), data() + data.dim2(), E.begin(), LoadHelper::calculateStandardError); // Add average monitor counts to a property: double averageMonitorCounts = std::accumulate(data(), data() + data.dim2(), 0) / static_cast<double>(data.dim2()); // make sure the monitor has values! if (averageMonitorCounts > 0) { API::Run &runDetails = m_localWorkspace->mutableRun(); runDetails.addProperty("monitor", averageMonitorCounts, true); } firstIndex++; } } return firstIndex; }