@@ -25,18 +25,41 @@ namespace Mantid::DataHandling {
25
25
26
26
namespace {
27
27
void setupConsistentSpectrumNumbers (IndexInfo &filtered, const std::vector<detid_t > &detIDs) {
28
+ // get the filtered information and sort the ids to make the main loop run faster
29
+ auto spectrumNumbersFiltered = filtered.spectrumNumbers (); // what it is at the beginning
30
+ if (!std::is_sorted (spectrumNumbersFiltered.cbegin (), spectrumNumbersFiltered.cend ())) {
31
+ std::sort (spectrumNumbersFiltered.begin (), spectrumNumbersFiltered.end ());
32
+ }
33
+
34
+ // Temporary spectrum number in `filtered` was detector ID, now translate to spectrum number, starting at 1. Note that
35
+ // we use detIDs and not DetectorInfo for translation since we need to match the unfiltered spectrum numbers, which
36
+ // are based on skipping monitors (which would be included in DetectorInfo).
28
37
std::vector<Indexing::SpectrumNumber> spectrumNumbers;
29
- // Temporary spectrum number in `filtered` was detector ID, now translate
30
- // to spectrum number, starting at 1. Note that we use detIDs and not
31
- // DetectorInfo for translation since we need to match the unfiltered
32
- // spectrum numbers, which are based on skipping monitors (which would be
33
- // included in DetectorInfo).
34
- for (int32_t i = 0 ; i < static_cast <int32_t >(detIDs.size ()); ++i) {
35
- if (filtered.spectrumNumber (spectrumNumbers.size ()) == detIDs[i])
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) {
36
44
spectrumNumbers.emplace_back (i + 1 );
37
- if (filtered.size () == spectrumNumbers.size ())
38
- break ;
45
+
46
+ // finish early if everything was found
47
+ if (filtered.size () == spectrumNumbers.size ())
48
+ break ;
49
+
50
+ // advance to the element after the one found to start next search
51
+ specFilterIter = std::next (specFilterIterTemp);
52
+ }
53
+ }
54
+
55
+ // error check the results
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 ());
39
61
}
62
+
40
63
filtered.setSpectrumNumbers (std::move (spectrumNumbers));
41
64
}
42
65
} // namespace
@@ -48,24 +71,22 @@ LoadEventNexusIndexSetup::LoadEventNexusIndexSetup(MatrixWorkspace_const_sptr in
48
71
std::pair<int32_t , int32_t > LoadEventNexusIndexSetup::eventIDLimits () const { return {m_min, m_max}; }
49
72
50
73
IndexInfo LoadEventNexusIndexSetup::makeIndexInfo () {
51
- // The default 1:1 will suffice but exclude the monitors as they are always in
52
- // a separate workspace
53
- auto detIDs = m_instrumentWorkspace->getInstrument ()->getDetectorIDs (true );
74
+ // The default 1:1 will suffice but exclude the monitors as they are always in a separate workspace
75
+ const auto detIDs = m_instrumentWorkspace->getInstrument ()->getDetectorIDs (true );
54
76
const auto &detectorInfo = m_instrumentWorkspace->detectorInfo ();
55
77
std::vector<SpectrumDefinition> specDefs;
56
78
specDefs.reserve (detIDs.size ());
57
79
std::transform (detIDs.cbegin (), detIDs.cend (), std::back_inserter (specDefs),
58
80
[&detectorInfo](const auto detID) { return SpectrumDefinition (detectorInfo.indexOf (detID)); });
59
- // We need to filter based on detector IDs, but use IndexInfo for filtering
60
- // for a unified filtering mechanism. Thus we set detector IDs as (temporary)
61
- // spectrum numbers.
81
+ // We need to filter based on detector IDs, but use IndexInfo for filtering for a unified filtering mechanism. Thus we
82
+ // set detector IDs as (temporary) spectrum numbers.
62
83
IndexInfo indexInfo (std::vector<SpectrumNumber>(detIDs.begin (), detIDs.end ()));
63
84
indexInfo.setSpectrumDefinitions (specDefs);
64
85
65
86
auto filtered = filterIndexInfo (indexInfo);
66
87
67
- // Spectrum numbers are continuous and start at 1. If there is a filter,
68
- // spectrum numbers are set up to be consistent with the unfiltered case.
88
+ // Spectrum numbers are continuous and start at 1. If there is a filter, spectrum numbers are set up to be consistent
89
+ // with the unfiltered case.
69
90
if (filtered.size () == indexInfo.size ()) {
70
91
filtered.setSpectrumNumbers (1 , static_cast <int32_t >(filtered.size ()));
71
92
} else {
@@ -96,9 +117,8 @@ IndexInfo LoadEventNexusIndexSetup::makeIndexInfo(const std::vector<std::string>
96
117
}
97
118
if (dets.empty ())
98
119
throw std::runtime_error (" Could not find the bank named '" + bankName +
99
- " ' as a component assembly in the instrument "
100
- " tree; or it did not contain any detectors. Try "
101
- " unchecking SingleBankPixelsOnly." );
120
+ " ' as a component assembly in the instrument tree; or it did not contain any detectors. "
121
+ " Try unchecking SingleBankPixelsOnly." );
102
122
}
103
123
Indexing::IndexInfo indexInfo (std::move (spectrumNumbers));
104
124
indexInfo.setSpectrumDefinitions (std::move (spectrumDefinitions));
0 commit comments