14#include "MantidIndexing/Extract.h"
15#include "MantidIndexing/SpectrumIndexSet.h"
16#include "MantidIndexing/SpectrumNumber.h"
17#include "MantidTypes/SpectrumDefinition.h"
27void setupConsistentSpectrumNumbers(IndexInfo &filtered,
const std::vector<detid_t> &detIDs) {
29 auto spectrumNumbersFiltered = filtered.spectrumNumbers();
30 if (!std::is_sorted(spectrumNumbersFiltered.cbegin(), spectrumNumbersFiltered.cend())) {
31 std::sort(spectrumNumbersFiltered.begin(), spectrumNumbersFiltered.end());
37 std::vector<Indexing::SpectrumNumber> spectrumNumbers;
38 const auto NUM_DETIDS =
static_cast<int32_t
>(detIDs.size());
39 auto specFilterIter = spectrumNumbersFiltered.cbegin();
40 auto specFilterIterEnd = spectrumNumbersFiltered.cend();
41 for (int32_t i = 0; i < NUM_DETIDS; ++i) {
42 auto specFilterIterTemp = std::find(specFilterIter, specFilterIterEnd, detIDs[i]);
43 if (specFilterIterTemp != specFilterIterEnd) {
44 spectrumNumbers.emplace_back(i + 1);
47 if (filtered.size() == spectrumNumbers.size())
51 specFilterIter = std::next(specFilterIterTemp);
56 if (filtered.size() != spectrumNumbers.size()) {
57 std::stringstream msg;
58 msg <<
"Not all detectors were found in the instrumen. Requested filtered=" << filtered.size()
59 <<
" found=" << spectrumNumbers.size();
60 throw std::runtime_error(msg.str());
63 filtered.setSpectrumNumbers(std::move(spectrumNumbers));
68 const int32_t max, std::vector<int32_t> range)
69 : m_instrumentWorkspace(
std::move(instrumentWorkspace)),
m_min(min),
m_max(max), m_range(
std::move(range)) {}
77 std::vector<SpectrumDefinition> specDefs;
78 specDefs.reserve(detIDs.size());
79 std::transform(detIDs.cbegin(), detIDs.cend(), std::back_inserter(specDefs),
80 [&detectorInfo](
const auto detID) { return SpectrumDefinition(detectorInfo.indexOf(detID)); });
83 IndexInfo indexInfo(std::vector<SpectrumNumber>(detIDs.begin(), detIDs.end()));
84 indexInfo.setSpectrumDefinitions(specDefs);
90 if (filtered.size() == indexInfo.size()) {
91 filtered.setSpectrumNumbers(1,
static_cast<int32_t
>(filtered.size()));
93 setupConsistentSpectrumNumbers(filtered, detIDs);
102 std::vector<SpectrumDefinition> spectrumDefinitions;
105 std::vector<SpectrumNumber> spectrumNumbers;
107 for (
const auto &bankName : bankNames) {
108 const auto &bank = instrument->getComponentByName(bankName);
109 std::vector<size_t> dets;
111 const auto bankIndex = componentInfo.indexOf(bank->getComponentID());
112 dets = componentInfo.detectorsInSubtree(bankIndex);
113 for (
const auto detIndex : dets) {
114 spectrumDefinitions.emplace_back(detIndex);
115 spectrumNumbers.emplace_back(detectorInfo.detectorIDs()[detIndex]);
119 throw std::runtime_error(
"Could not find the bank named '" + bankName +
120 "' as a component assembly in the instrument tree; or it did not contain any detectors. "
121 "Try unchecking SingleBankPixelsOnly.");
123 Indexing::IndexInfo indexInfo(std::move(spectrumNumbers));
124 indexInfo.setSpectrumDefinitions(std::move(spectrumDefinitions));
125 setupConsistentSpectrumNumbers(indexInfo, instrument->getDetectorIDs(
true));
134 const std::pair<std::vector<int32_t>, std::vector<int32_t>> &spectrumDetectorMapping,
const bool monitorsOnly) {
135 const auto &spec = spectrumDetectorMapping.first;
136 const auto &udet = spectrumDetectorMapping.second;
141 std::vector<Indexing::SpectrumNumber> spectrumNumbers;
142 std::vector<SpectrumDefinition> spectrumDefinitions;
144 for (
const auto id : monitors) {
146 auto it = std::find(udet.begin(), udet.end(),
id);
147 if (it != udet.end()) {
148 const specnum_t &specNo = spec[it - udet.begin()];
149 spectrumNumbers.emplace_back(specNo);
150 spectrumDefinitions.emplace_back(detectorInfo.indexOf(
id));
153 Indexing::IndexInfo indexInfo(spectrumNumbers);
154 indexInfo.setSpectrumDefinitions(std::move(spectrumDefinitions));
159 std::vector<SpectrumDefinition> spectrumDefinitions;
160 for (
const auto specNo : uniqueSpectra) {
161 spectrumDefinitions.emplace_back();
164 spectrumDefinitions.back().add(detectorInfo.indexOf(detID));
165 }
catch (std::out_of_range &) {
170 Indexing::IndexInfo indexInfo(std::vector<Indexing::SpectrumNumber>(uniqueSpectra.begin(), uniqueSpectra.end()));
171 indexInfo.setSpectrumDefinitions(std::move(spectrumDefinitions));
185 m_max =
static_cast<int32_t
>(indexInfo.spectrumNumber(indexInfo.size() - 1));
187 m_min =
static_cast<int32_t
>(indexInfo.spectrumNumber(0));
190 const auto indices = indexInfo.makeIndexSet(
static_cast<SpectrumNumber
>(
m_min),
static_cast<SpectrumNumber
>(
m_max));
191 std::transform(indices.begin(), indices.end(), std::back_inserter(
m_range),
192 [indexInfo](
const auto index) { return static_cast<int32_t>(indexInfo.spectrumNumber(index)); });
197 const auto indices = indexInfo.makeIndexSet(std::vector<SpectrumNumber>(
m_range.begin(),
m_range.end()));
198 m_min =
static_cast<int32_t
>(indexInfo.spectrumNumber(*indices.begin()));
199 m_max =
static_cast<int32_t
>(indexInfo.spectrumNumber(*(indices.end() - 1)));
200 return extract(indexInfo, indices);
std::map< DeltaEMode::Type, std::string > index
A minimal class to hold the mapping between the spectrum number and its related detector ID numbers f...
const std::set< detid_t > & getDetectorIDsForSpectrumNo(const specnum_t spectrumNo) const
std::set< specnum_t > getSpectrumNumbers() const
std::vector< int32_t > m_range
const API::MatrixWorkspace_const_sptr m_instrumentWorkspace
Indexing::IndexInfo makeIndexInfo()
Indexing::IndexInfo filterIndexInfo(const Indexing::IndexInfo &indexInfo)
Filter IndexInfo based on optional spectrum range/list provided.
LoadEventNexusIndexSetup(API::MatrixWorkspace_const_sptr instrumentWorkspace, const int32_t min, const int32_t max, std::vector< int32_t > range)
std::pair< int32_t, int32_t > eventIDLimits() const
std::shared_ptr< const MatrixWorkspace > MatrixWorkspace_const_sptr
shared pointer to the matrix workspace base class (const version)
constexpr int EMPTY_INT() noexcept
Returns what we consider an "empty" integer within a property.
int32_t specnum_t
Typedef for a spectrum Number.