30 const std::map<detid_t, double> &calibration,
31 const std::map<detid_t, double> &scale_at_sample,
const std::set<detid_t> &masked,
32 const size_t events_per_chunk,
const size_t grainsize_event,
33 std::vector<PulseROI> pulse_indices, std::shared_ptr<API::Progress> &progress)
34 : m_h5file(h5file), m_bankEntries(bankEntryNames), m_loader(is_time_filtered, pulse_indices), m_wksp(wksp),
35 m_calibration(calibration), m_scale_at_sample(scale_at_sample), m_masked(masked),
36 m_events_per_chunk(events_per_chunk), m_grainsize_event(grainsize_event), m_progress(progress) {}
39 auto entry =
m_h5file.openGroup(
"entry");
40 for (
size_t wksp_index = range.begin(); wksp_index < range.end(); ++wksp_index) {
43 if (bankName.empty()) {
47 g_log.
debug() << bankName <<
" start" << std::endl;
50 auto event_group = entry.openGroup(bankName);
54 const int64_t total_events =
static_cast<size_t>(tof_SDS.getSpace().getSelectNpoints());
55 if (total_events == 0) {
63 auto &spectrum =
m_wksp->getSpectrum(wksp_index);
68 std::vector<uint32_t> y_temp(spectrum.dataY().size());
71 std::unique_ptr<BankCalibration> calibration =
nullptr;
82 auto event_detid = std::make_unique<std::vector<uint32_t>>();
83 auto event_time_of_flight = std::make_unique<std::vector<float>>();
86 while (!eventRanges.empty()) {
90 std::vector<size_t> offsets;
91 std::vector<size_t> slabsizes;
93 size_t total_events_to_read = 0;
97 auto eventRange = eventRanges.top();
100 size_t range_size = eventRange.second - eventRange.first;
104 if (range_size > remaining_chunk) {
106 offsets.push_back(eventRange.first);
107 slabsizes.push_back(remaining_chunk);
108 total_events_to_read += remaining_chunk;
110 eventRanges.emplace(eventRange.first + remaining_chunk, eventRange.second);
113 offsets.push_back(eventRange.first);
114 slabsizes.push_back(range_size);
115 total_events_to_read += range_size;
121 std::ostringstream oss;
122 oss <<
"Processing " << bankName <<
" with " << total_events_to_read <<
" events in the ranges: ";
123 for (
size_t i = 0; i < offsets.size(); ++i) {
124 oss <<
"[" << offsets[i] <<
", " << (offsets[i] + slabsizes[i]) <<
"), ";
130 tbb::parallel_invoke(
137 if ((!calibration) || (calibration->idmin() >
static_cast<detid_t>(
minval)) ||
150 ProcessEventsTask task(event_detid.get(), event_time_of_flight.get(), calibration.get(), &spectrum.readX());
153 const tbb::blocked_range<size_t> range_info(0, event_time_of_flight->size(),
m_grainsize_event);
154 tbb::parallel_reduce(range_info, task);
157 std::transform(y_temp.begin(), y_temp.end(), task.y_temp.begin(), y_temp.begin(), std::plus<uint32_t>());
161 auto &y_values = spectrum.dataY();
162 std::copy(y_temp.cbegin(), y_temp.cend(), y_values.begin());
164 g_log.
debug() << bankName <<
" stop " << timer << std::endl;
ProcessBankTask(std::vector< std::string > &bankEntryNames, H5::H5File &h5file, const bool is_time_filtered, API::MatrixWorkspace_sptr &wksp, const std::map< detid_t, double > &calibration, const std::map< detid_t, double > &scale_at_sample, const std::set< detid_t > &masked, const size_t events_per_chunk, const size_t grainsize_event, std::vector< PulseROI > pulse_indices, std::shared_ptr< API::Progress > &progress)