From 7fdba8633448b346058dd875836d738c2854943d Mon Sep 17 00:00:00 2001 From: Dorothea vom Bruch Date: Wed, 6 May 2020 14:42:35 +0200 Subject: [PATCH 1/8] add TESProvider for RunAllen Gaudi algorithm --- Rec/Allen/src/RunAllen.cpp | 43 ++++++++----------- Rec/Allen/src/RunAllen.h | 6 ++- main/include/BinaryProvider.h | 3 +- main/include/InputProvider.h | 27 +++++++++++- main/include/TESProvider.h | 81 +++++++++++++++++++++++++++++++++++ 5 files changed, 130 insertions(+), 30 deletions(-) create mode 100644 main/include/TESProvider.h diff --git a/Rec/Allen/src/RunAllen.cpp b/Rec/Allen/src/RunAllen.cpp index ba0a3dcc733..e665374283d 100644 --- a/Rec/Allen/src/RunAllen.cpp +++ b/Rec/Allen/src/RunAllen.cpp @@ -49,7 +49,7 @@ StatusCode RunAllen::initialize() if (sc.isFailure()) return sc; if (msgLevel(MSG::DEBUG)) debug() << "==> Initialize" << endmsg; - // initialize Allen + /* initialize Allen */ // Get updater service and register all consumers auto svc = service(m_updaterName); @@ -111,6 +111,13 @@ StatusCode RunAllen::initialize() m_stream->initialize(print_memory_usage, start_event_offset, reserve_mb, m_constants); m_stream->set_host_buffer_manager(m_host_buffers_manager.get()); + // Initialize input provider + // to do:: check whether slice info is required + const size_t number_of_slices = 1; + const size_t events_per_slice = 1; + const size_t n_events = 1; + m_input_provider = std::make_unique>(number_of_slices, events_per_slice, n_events); + // Set verbosity level logger::setVerbosity(6 - this->msgLevel()); @@ -120,39 +127,25 @@ StatusCode RunAllen::initialize() /** Calls Allen for one event */ std::tuple RunAllen::operator()( - const std::array, LHCb::RawBank::LastType>& allen_banks, + const std::array, int(BankTypes::Unknown)>& allen_banks, const LHCb::ODIN&) const { - // Get raw input and event offsets for every detector - std::array banks_and_offsets; - std::array, LHCb::RawBank::LastType> event_offsets; - for (const auto bankType : m_bankTypes) { - // to do: catch that raw bank type was not dumped - - // Offsets to events (we only process one event) - // unsigned int offsets_mem[2]; - event_offsets[bankType][0] = 0; - event_offsets[bankType][1] = allen_banks[bankType].size(); - gsl::span offsets {event_offsets[bankType].data(), 2}; - using data_span = gsl::span; - auto data_size = static_cast(allen_banks[bankType].size()); - std::vector spans(1, data_span {allen_banks[bankType].data(), data_size}); - banks_and_offsets[bankType] = std::make_tuple(std::move(spans), data_size, std::move(offsets)); - } + m_input_provider.get()->set_banks(allen_banks); // initialize RuntimeOptions + const uint event_start = 0; + const uint event_end = 1; + const size_t slice_index = 0; + const bool mep_layout = false; RuntimeOptions runtime_options( - banks_and_offsets[LHCb::RawBank::VP], - banks_and_offsets[LHCb::RawBank::UT], - banks_and_offsets[LHCb::RawBank::FTCluster], - banks_and_offsets[LHCb::RawBank::Muon], - banks_and_offsets[LHCb::RawBank::ODIN], - {0u, 1u}, + m_input_provider.get(), + slice_index, + {event_start, event_end}, m_number_of_repetitions, m_do_check.value(), m_cpu_offload, - false); + mep_layout); const uint buf_idx = m_n_buffers - 1; cudaError_t rv = m_stream->run_sequence(buf_idx, runtime_options); diff --git a/Rec/Allen/src/RunAllen.h b/Rec/Allen/src/RunAllen.h index 00b2f52dd9c..272ff6b0c37 100644 --- a/Rec/Allen/src/RunAllen.h +++ b/Rec/Allen/src/RunAllen.h @@ -36,9 +36,10 @@ #include "BankTypes.h" #include "Stream.cuh" #include "Logger.h" +#include "TESProvider.h" class RunAllen final : public Gaudi::Functional::MultiTransformerFilter( - const std::array, LHCb::RawBank::LastType>& allen_banks, + const std::array, int(BankTypes::Unknown)>& allen_banks, const LHCb::ODIN& odin)> { public: /// Standard constructor @@ -49,7 +50,7 @@ public: /// Algorithm execution std::tuple operator()( - const std::array, LHCb::RawBank::LastType>& allen_banks, + const std::array, int(BankTypes::Unknown)>& allen_banks, const LHCb::ODIN& odin) const override; /// Finalize @@ -70,6 +71,7 @@ private: std::unique_ptr m_stream; std::unique_ptr m_host_buffers_manager; + std::unique_ptr m_input_provider {}; Gaudi::Property m_updaterName {this, "UpdaterName", "AllenUpdater"}; diff --git a/main/include/BinaryProvider.h b/main/include/BinaryProvider.h index 172b7b77d7e..205b2dc89c6 100644 --- a/main/include/BinaryProvider.h +++ b/main/include/BinaryProvider.h @@ -49,7 +49,7 @@ namespace { * @param loop on input files * @param optional: order of event IDs in which to provide bank data * - */ + */ template class BinaryProvider final : public InputProvider> { public: @@ -439,3 +439,4 @@ private: // Folder and file names per bank type std::array>, sizeof...(Banks)> m_files; }; + diff --git a/main/include/InputProvider.h b/main/include/InputProvider.h index 6b24634465c..00297c82176 100644 --- a/main/include/InputProvider.h +++ b/main/include/InputProvider.h @@ -14,7 +14,7 @@ struct IInputProvider { - /// Descturctor + /// Desctructor virtual ~IInputProvider() noexcept(false) {}; /** @@ -40,10 +40,20 @@ struct IInputProvider { * @param optional timeout in ms to wait for slice * * @return tuple of (success, eof, timed_out, slice_index, n_filled) - */ + */ virtual std::tuple get_slice( boost::optional timeout = boost::optional {}) = 0; + + /** + * @brief Set banks, needed when calling Allen from Moore + * + * @param banks in the format stored in TES + * + * @return banks set successfully + */ + virtual int set_banks(boost::optional, int(BankTypes::Unknown)>> banks = boost::optional, int(BankTypes::Unknown)>> {}) = 0; + /** * @brief Get banks and offsets of a given type * @@ -138,6 +148,19 @@ public: return static_cast*>(this)->slice_free(slice_index); } + + /** + * @brief Set banks, needed when calling Allen from Moore + * + * @param banks in the format stored in TES + * + * @return banks set successfully + */ + int set_banks(boost::optional, int(BankTypes::Unknown)>> banks = boost::optional, int(BankTypes::Unknown)>> {}) override{ + return 0; + } + + /** * @brief Get banks and offsets of a given type * diff --git a/main/include/TESProvider.h b/main/include/TESProvider.h new file mode 100644 index 00000000000..181e59164bb --- /dev/null +++ b/main/include/TESProvider.h @@ -0,0 +1,81 @@ +#pragma once + +#include + +//#include +#include +//#include +#include +//#include + +/** + * @brief Provide event from TES location containing the same format as the binary files, + * i.e. the layout used for Allen + * + * @details + * + * @param number of slices + * @param number of events to fill per slice + * @param optional: number of events to read + * + */ + + +template +class TESProvider final : public InputProvider> { + public: + TESProvider( + size_t n_slices, + size_t events_per_slice, + boost::optional n_events) : + InputProvider> {n_slices, events_per_slice, n_events} + {} + + /** + * @brief Get banks in the format they are stored in TES + * + */ + int set_banks(const std::array, int(BankTypes::Unknown)>& banks) + { + // to do: check that all raw banks are there and return 1 if it fails + + m_banks = banks; + + return 0; + } + + /** + * @brief Obtain banks from TES + * + * @param BankType + * + * @return Banks and their offsets + */ + BanksAndOffsets banks(BankTypes bank_type, size_t slice_index) const override + { + + const auto ib = to_integral(bank_type); + + // Offsets to events (we only process one event) + std::array bank_offsets; + bank_offsets[0] = 0; + bank_offsets[1] = m_banks[ib].size(); + gsl::span offsets {bank_offsets.data(), 2}; + + // bank content + using data_span = gsl::span; + auto data_size = static_cast(m_banks[ib].size()); + std::vector spans(1, data_span {m_banks[ib].data(), data_size}); + + return BanksAndOffsets {{std::move(spans)}, data_size, std::move(offsets)}; + } + + void event_sizes(size_t const, gsl::span const, std::vector&) const override {} + + void copy_banks(size_t const, unsigned int const, gsl::span) const override {} + + private: + std::array, LHCb::RawBank::LastType> m_banks; + +}; + -- GitLab From 932a7af9c5916adfe863449d46817f1489d07661 Mon Sep 17 00:00:00 2001 From: Dorothea vom Bruch Date: Thu, 7 May 2020 16:21:44 +0200 Subject: [PATCH 2/8] use stream_wrapper in RunAllen, convert from LHCb::RawBank::BankType to Allen::BankType in set_banks of the TESProvider --- Rec/Allen/src/RunAllen.cpp | 43 +++++----- Rec/Allen/src/RunAllen.h | 17 ++-- main/include/AllenUnits.h | 13 +++ main/include/BankTypes.h | 4 +- main/include/InputProvider.h | 24 +----- main/include/SystemOfUnits.h | 11 --- main/include/TESProvider.h | 81 +++++++++++++------ main/include/TransposeMEP.h | 1 + main/include/TransposeTypes.h | 2 + .../src/HostGlobalEventCut.cpp | 3 +- 10 files changed, 107 insertions(+), 92 deletions(-) create mode 100644 main/include/AllenUnits.h diff --git a/Rec/Allen/src/RunAllen.cpp b/Rec/Allen/src/RunAllen.cpp index e665374283d..f6c96a934c0 100644 --- a/Rec/Allen/src/RunAllen.cpp +++ b/Rec/Allen/src/RunAllen.cpp @@ -97,26 +97,18 @@ StatusCode RunAllen::initialize() const uint start_event_offset = 0; const size_t reserve_mb = 10; // to do: how much do we need maximally for one event? - m_number_of_hlt1_lines = std::tuple_size::value; - - uint error_line = 0; - const auto lambda_fn = [&error_line](const unsigned long i, const std::string& line_name) { - if (line_name == "ErrorEvent") error_line = i; - }; - Hlt1::TraverseLinesNames::traverse(lambda_fn); - - m_host_buffers_manager.reset(new HostBuffersManager(m_n_buffers, 2, m_do_check, m_number_of_hlt1_lines, error_line)); - m_stream.reset(new Stream()); - m_stream->configure_algorithms(configuration_reader.params()); - m_stream->initialize(print_memory_usage, start_event_offset, reserve_mb, m_constants); - m_stream->set_host_buffer_manager(m_host_buffers_manager.get()); + m_stream_wrapper.reset(new StreamWrapper()); + m_stream_wrapper->initialize_streams(m_number_of_streams, print_memory_usage, start_event_offset, reserve_mb, m_constants, configuration_reader.params()); + + // Initialize host buffers (where Allen output is stored) + m_host_buffers_manager.reset(new HostBuffersManager(m_n_buffers, 2, m_do_check, m_stream_wrapper->number_of_hlt1_lines, m_stream_wrapper->errorevent_line)); + m_stream_wrapper->initialize_streams_host_buffers_manager(m_host_buffers_manager.get()); // Initialize input provider - // to do:: check whether slice info is required const size_t number_of_slices = 1; const size_t events_per_slice = 1; const size_t n_events = 1; - m_input_provider = std::make_unique>(number_of_slices, events_per_slice, n_events); + m_tes_input_provider.reset(new TESProvider(number_of_slices, events_per_slice, n_events)); // Set verbosity level logger::setVerbosity(6 - this->msgLevel()); @@ -127,11 +119,14 @@ StatusCode RunAllen::initialize() /** Calls Allen for one event */ std::tuple RunAllen::operator()( - const std::array, int(BankTypes::Unknown)>& allen_banks, + const std::array, LHCb::RawBank::LastType>& allen_banks, const LHCb::ODIN&) const { - m_input_provider.get()->set_banks(allen_banks); + int rv = m_tes_input_provider.get()->set_banks(allen_banks, m_bankTypes); + if (rv > 0) { + error() << "Error in reading dumped raw banks" << endmsg; + } // initialize RuntimeOptions const uint event_start = 0; @@ -139,26 +134,28 @@ std::tuple RunAllen::operator()( const size_t slice_index = 0; const bool mep_layout = false; RuntimeOptions runtime_options( - m_input_provider.get(), + m_tes_input_provider.get(), slice_index, {event_start, event_end}, m_number_of_repetitions, - m_do_check.value(), + m_do_check, m_cpu_offload, mep_layout); const uint buf_idx = m_n_buffers - 1; - cudaError_t rv = m_stream->run_sequence(buf_idx, runtime_options); - if (rv != cudaSuccess) { + const uint stream_index = m_number_of_streams - 1; + cudaError_t cuda_rv = m_stream_wrapper->run_stream(stream_index, buf_idx, runtime_options); + if (cuda_rv != cudaSuccess) { error() << "Allen exited with errorCode " << rv << endmsg; // how to exit a filter with failure? } bool filter = true; + HostBuffers * buffer = m_host_buffers_manager->getBuffers(buf_idx); if (m_filter_hlt1.value()) { - filter = m_stream->host_buffers_manager->getBuffers(buf_idx)->host_passing_event_list[0]; + filter = buffer->host_passing_event_list[0]; } if (msgLevel(MSG::DEBUG)) debug() << "Event selected by Allen: " << uint(filter) << endmsg; - return std::make_tuple(filter, *(m_stream->host_buffers_manager->getBuffers(buf_idx))); + return std::make_tuple(filter, *buffer); } StatusCode RunAllen::finalize() diff --git a/Rec/Allen/src/RunAllen.h b/Rec/Allen/src/RunAllen.h index 272ff6b0c37..4c74f76f2a4 100644 --- a/Rec/Allen/src/RunAllen.h +++ b/Rec/Allen/src/RunAllen.h @@ -35,11 +35,12 @@ #include "RuntimeOptions.h" #include "BankTypes.h" #include "Stream.cuh" +#include "StreamWrapper.cuh" #include "Logger.h" #include "TESProvider.h" class RunAllen final : public Gaudi::Functional::MultiTransformerFilter( - const std::array, int(BankTypes::Unknown)>& allen_banks, + const std::array, LHCb::RawBank::LastType>& allen_banks, const LHCb::ODIN& odin)> { public: /// Standard constructor @@ -50,7 +51,7 @@ public: /// Algorithm execution std::tuple operator()( - const std::array, int(BankTypes::Unknown)>& allen_banks, + const std::array, LHCb::RawBank::LastType>& allen_banks, const LHCb::ODIN& odin) const override; /// Finalize @@ -63,23 +64,23 @@ private: LHCb::RawBank::UT, LHCb::RawBank::FTCluster, LHCb::RawBank::Muon}; - + const uint m_number_of_streams = 1; const uint m_number_of_repetitions = 1; const bool m_cpu_offload = true; const uint m_n_buffers = 1; uint m_number_of_hlt1_lines = 0; + const bool m_do_check = false; - std::unique_ptr m_stream; + std::unique_ptr m_stream_wrapper; std::unique_ptr m_host_buffers_manager; - std::unique_ptr m_input_provider {}; + std::unique_ptr> m_tes_input_provider; Gaudi::Property m_updaterName {this, "UpdaterName", "AllenUpdater"}; - Gaudi::Property m_json {this, "JSON", "${ALLEN_PROJECT_ROOT}/configuration/constants/default.json"}; + // to do: don't use hard-coded path + Gaudi::Property m_json {this, "JSON", "${ALLEN_PROJECT_ROOT}/build.x86_64-centos7-gcc9-opt/Sequence.json"}; Gaudi::Property m_paramDir {this, "ParamDir", "${ALLEN_PROJECT_ROOT}/input/detector_configuration/down"}; - // Run Allen standalone checker - Gaudi::Property m_do_check {this, "DoCheck", true}; // If set to false, events are only filtered by the GEC // If set to true, events are filtered based on an OR of the Allen selection lines Gaudi::Property m_filter_hlt1 {this, "FilterHLT1", false}; diff --git a/main/include/AllenUnits.h b/main/include/AllenUnits.h new file mode 100644 index 00000000000..128a97d14d5 --- /dev/null +++ b/main/include/AllenUnits.h @@ -0,0 +1,13 @@ +#pragma once + +namespace Allen { + namespace Units { + // + // Data size + // + constexpr unsigned kB = 1024; + constexpr unsigned MB = kB * kB; + constexpr unsigned GB = MB * kB; + } // namespace Units +} // namespace Allen + diff --git a/main/include/BankTypes.h b/main/include/BankTypes.h index 09671227e2f..f9881f23b4d 100644 --- a/main/include/BankTypes.h +++ b/main/include/BankTypes.h @@ -14,7 +14,7 @@ namespace { } constexpr auto NBankTypes = 10; -enum class BankTypes { VP, UT, FT, MUON, ODIN, Rich, ECal, HCal, OTRaw, OTError, Unknown }; +enum class BankTypes { VP, UT, FT, MUON, ODIN, Rich, ECal, HCal, OTRaw, OTError, Unknown }; // Average size of all raw banks of a given type per // subdetector, in kB, measured in simulated minbias events. @@ -24,7 +24,7 @@ const std::unordered_map BankSizes = {{BankTypes::VP, 12.f}, {BankTypes::FT, 9.f}, {BankTypes::MUON, 1.2f}, {BankTypes::Rich, 21.f}, - {BankTypes::HCal, 2.1}, + {BankTypes::HCal, 2.1}, {BankTypes::ECal, 8.f}, {BankTypes::ODIN, 0.1f}, {BankTypes::OTRaw, 110.f}, diff --git a/main/include/InputProvider.h b/main/include/InputProvider.h index 00297c82176..237ff9e411d 100644 --- a/main/include/InputProvider.h +++ b/main/include/InputProvider.h @@ -11,6 +11,7 @@ #include #include #include +#include struct IInputProvider { @@ -43,17 +44,7 @@ struct IInputProvider { */ virtual std::tuple get_slice( boost::optional timeout = boost::optional {}) = 0; - - /** - * @brief Set banks, needed when calling Allen from Moore - * - * @param banks in the format stored in TES - * - * @return banks set successfully - */ - virtual int set_banks(boost::optional, int(BankTypes::Unknown)>> banks = boost::optional, int(BankTypes::Unknown)>> {}) = 0; - /** * @brief Get banks and offsets of a given type * @@ -148,19 +139,6 @@ public: return static_cast*>(this)->slice_free(slice_index); } - - /** - * @brief Set banks, needed when calling Allen from Moore - * - * @param banks in the format stored in TES - * - * @return banks set successfully - */ - int set_banks(boost::optional, int(BankTypes::Unknown)>> banks = boost::optional, int(BankTypes::Unknown)>> {}) override{ - return 0; - } - - /** * @brief Get banks and offsets of a given type * diff --git a/main/include/SystemOfUnits.h b/main/include/SystemOfUnits.h index cf823b01525..0510a1730b1 100644 --- a/main/include/SystemOfUnits.h +++ b/main/include/SystemOfUnits.h @@ -282,15 +282,4 @@ namespace Gaudi { } // namespace Units } // namespace Gaudi -namespace Allen { - namespace Units { - // - // Data size - // - constexpr unsigned kB = 1024; - constexpr unsigned MB = kB * kB; - constexpr unsigned GB = MB * kB; - } // namespace Units -} // namespace Allen - #endif /* GAUDI_SYSTEM_OF_UNITS_H */ diff --git a/main/include/TESProvider.h b/main/include/TESProvider.h index 181e59164bb..6b1f5f9b68b 100644 --- a/main/include/TESProvider.h +++ b/main/include/TESProvider.h @@ -2,11 +2,11 @@ #include -//#include #include -//#include -#include -//#include +#include +#include + +#include "SciFiRaw.cuh" /** * @brief Provide event from TES location containing the same format as the binary files, @@ -34,13 +34,50 @@ class TESProvider final : public InputProvider> { /** * @brief Get banks in the format they are stored in TES * + * @param Array with raw bank content + * @param Set with bank types to be used as input for Allen */ - int set_banks(const std::array, int(BankTypes::Unknown)>& banks) + int set_banks(std::array, LHCb::RawBank::LastType> banks, std::set bankTypes) { - // to do: check that all raw banks are there and return 1 if it fails + // get mapping of LHCb::RawBank::BankType to Allen::BankType + const std::vector bank_ids_mapping = bank_ids(); - m_banks = banks; + // store banks and offsets as BanksAndOffsets object + for (const auto& bank : bankTypes) { + if (bank >= bank_ids_mapping.size()) { + std::cout << "ERROR: LHCb::RawBank index out of scope from conversion between Allen and LHCb raw bank types" << std::endl;; + return 1; + } + const auto allen_bank_index = bank_ids_mapping[bank]; + if (allen_bank_index < 0 ) { + std::cout << "ERROR: dumped bank type does not exist in Allen" << std::endl;; + return 1; + } + std::cout << "LHCb index is " << bank << ", Allen index is " << allen_bank_index << std::endl; + + // Offsets to events (we only process one event) + std::array bank_offsets; + bank_offsets[0] = 0; + bank_offsets[1] = banks[bank].size(); + gsl::span offsets {bank_offsets.data(), 2}; + + // bank content + using data_span = gsl::span; + auto data_size = static_cast(banks[bank].size()); + std::vector spans(1, data_span {banks[bank].data(), data_size}); + + std::cout << "total data size is " << data_size << std::endl; + if ( allen_bank_index == 2) { + auto const scifi_offsets = offsets; + const SciFi::SciFiRawEvent scifi_event( spans[0].data() + scifi_offsets[0]); + std::cout << "TESProvider set_banks: offset = " << scifi_offsets[0] << std::endl; + std::cout << "TESProvider set_banks: number of scifi raw banks = " << scifi_event.number_of_raw_banks << std::endl; + } + + m_banks_and_offsets[allen_bank_index] = std::make_tuple(std::move(spans), data_size, std::move(offsets)); + } + return 0; } @@ -51,23 +88,21 @@ class TESProvider final : public InputProvider> { * * @return Banks and their offsets */ - BanksAndOffsets banks(BankTypes bank_type, size_t slice_index) const override + BanksAndOffsets banks(BankTypes bank_type, size_t /* slice_index */) const override { - const auto ib = to_integral(bank_type); - - // Offsets to events (we only process one event) - std::array bank_offsets; - bank_offsets[0] = 0; - bank_offsets[1] = m_banks[ib].size(); - gsl::span offsets {bank_offsets.data(), 2}; - - // bank content - using data_span = gsl::span; - auto data_size = static_cast(m_banks[ib].size()); - std::vector spans(1, data_span {m_banks[ib].data(), data_size}); + std::cout << "fetching Allen bank type " << ib << " with size " << std::get<1>(m_banks_and_offsets[ib]) << std::endl; - return BanksAndOffsets {{std::move(spans)}, data_size, std::move(offsets)}; + if ( ib == 2 ) { + auto const scifi_offsets = std::get<2>(m_banks_and_offsets[ib]); + using data_span = gsl::span; + std::vector spans = std::get<0>(m_banks_and_offsets[ib]); + const SciFi::SciFiRawEvent scifi_event( spans[0].data() + scifi_offsets[0]); + std::cout << "TESProvider banks: offset = " << scifi_offsets[0] << std::endl; + std::cout << "TESProvider banks: number of scifi raw banks = " << scifi_event.number_of_raw_banks << std::endl; + } + + return m_banks_and_offsets[ib]; } void event_sizes(size_t const, gsl::span const, std::vector&) const override {} @@ -75,7 +110,5 @@ class TESProvider final : public InputProvider> { void copy_banks(size_t const, unsigned int const, gsl::span) const override {} private: - std::array, LHCb::RawBank::LastType> m_banks; - + std::array m_banks_and_offsets; }; - diff --git a/main/include/TransposeMEP.h b/main/include/TransposeMEP.h index 00901026016..1a3b74ab72a 100644 --- a/main/include/TransposeMEP.h +++ b/main/include/TransposeMEP.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/main/include/TransposeTypes.h b/main/include/TransposeTypes.h index 723ef41770e..d04967db24f 100644 --- a/main/include/TransposeTypes.h +++ b/main/include/TransposeTypes.h @@ -7,6 +7,8 @@ #include #include #include +#include +#include #ifndef NO_CUDA #include diff --git a/x86/global_event_cut/src/HostGlobalEventCut.cpp b/x86/global_event_cut/src/HostGlobalEventCut.cpp index e9bc135193b..b8f1ca369a7 100644 --- a/x86/global_event_cut/src/HostGlobalEventCut.cpp +++ b/x86/global_event_cut/src/HostGlobalEventCut.cpp @@ -15,10 +15,11 @@ void host_global_event_cut::host_global_event_cut( // Check SciFi clusters const SciFi::SciFiRawEvent scifi_event(parameters.scifi_banks[0].data() + scifi_offsets[event_number]); uint n_SciFi_clusters = 0; - + printf("number of scifi raw banks = %u \n", scifi_event.number_of_raw_banks); for (uint i = 0; i < scifi_event.number_of_raw_banks; ++i) { // get bank size in bytes, subtract four bytes for header word uint bank_size = scifi_event.raw_bank_offset[i + 1] - scifi_event.raw_bank_offset[i] - 4; + //printf("bank size = %u \n", bank_size); n_SciFi_clusters += bank_size; } -- GitLab From 4fd1556be0064b16abc0dd7697bbb96fa57865f4 Mon Sep 17 00:00:00 2001 From: Dorothea vom Bruch Date: Thu, 7 May 2020 17:51:53 +0200 Subject: [PATCH 3/8] install Sequence.json in InstallArea and set ALLEN_INSTLL_DIR environment variable (not yet working when using the variable --- CMakeLists.txt | 6 ++++++ cmake/GenerateConfiguration.cmake | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59886657fe7..add8bb728b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -671,3 +671,9 @@ endif() allen_add_executable(Allen ${main_cpp_path}) target_link_libraries(Allen PRIVATE AllenLib) + +if (GaudiProject_FOUND) + gaudi_env(SET ALLEN_INSTALL_DIR \${CMAKE_INSTALL_PREFIX}/constants) +endif() + + \ No newline at end of file diff --git a/cmake/GenerateConfiguration.cmake b/cmake/GenerateConfiguration.cmake index 7cf7a463ff4..0ff4e3915c1 100644 --- a/cmake/GenerateConfiguration.cmake +++ b/cmake/GenerateConfiguration.cmake @@ -43,7 +43,7 @@ if(Python3_FOUND AND ${ALGORITHMS_GENERATION_RESULT_0} EQUAL 0 AND ${ALGORITHMS_ python3 ${SEQUENCE}.py && ${CMAKE_COMMAND} -E copy_if_different "Sequence.h" "${PROJECT_BINARY_DIR}/configuration/sequences/ConfiguredSequence.h" && ${CMAKE_COMMAND} -E copy "Sequence.json" "${PROJECT_BINARY_DIR}/Sequence.json" - DEPENDS "${CMAKE_SOURCE_DIR}/configuration/sequences/${SEQUENCE}.py" + DEPENDS "${CMAKE_SOURCE_DIR}/configuration/sequences/${SEQUENCE}.py" WORKING_DIRECTORY ${PROJECT_SEQUENCE_DIR} ) else() @@ -63,3 +63,5 @@ else() VERBATIM ) endif() + +install(FILES "${PROJECT_BINARY_DIR}/Sequence.json" DESTINATION "${CMAKE_INSTALL_PREFIX}/constants") -- GitLab From 01cd9fdc2689c5687a1c53ad2dcd651ed8be410c Mon Sep 17 00:00:00 2001 From: Dorothea vom Bruch Date: Fri, 8 May 2020 11:00:16 +0200 Subject: [PATCH 4/8] fix object scopes for copying raw banks --- Rec/Allen/src/RunAllen.h | 2 +- main/include/TESProvider.h | 37 ++++--------------- .../src/HostGlobalEventCut.cpp | 2 - 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/Rec/Allen/src/RunAllen.h b/Rec/Allen/src/RunAllen.h index 4c74f76f2a4..3139e9d5a71 100644 --- a/Rec/Allen/src/RunAllen.h +++ b/Rec/Allen/src/RunAllen.h @@ -69,7 +69,7 @@ private: const bool m_cpu_offload = true; const uint m_n_buffers = 1; uint m_number_of_hlt1_lines = 0; - const bool m_do_check = false; + const bool m_do_check = true; std::unique_ptr m_stream_wrapper; std::unique_ptr m_host_buffers_manager; diff --git a/main/include/TESProvider.h b/main/include/TESProvider.h index 6b1f5f9b68b..8456b3454df 100644 --- a/main/include/TESProvider.h +++ b/main/include/TESProvider.h @@ -37,7 +37,7 @@ class TESProvider final : public InputProvider> { * @param Array with raw bank content * @param Set with bank types to be used as input for Allen */ - int set_banks(std::array, LHCb::RawBank::LastType> banks, std::set bankTypes) + int set_banks(const std::array, LHCb::RawBank::LastType>& banks, std::set bankTypes) { // get mapping of LHCb::RawBank::BankType to Allen::BankType const std::vector bank_ids_mapping = bank_ids(); @@ -53,29 +53,18 @@ class TESProvider final : public InputProvider> { std::cout << "ERROR: dumped bank type does not exist in Allen" << std::endl;; return 1; } - std::cout << "LHCb index is " << bank << ", Allen index is " << allen_bank_index << std::endl; // Offsets to events (we only process one event) - std::array bank_offsets; - bank_offsets[0] = 0; - bank_offsets[1] = banks[bank].size(); - gsl::span offsets {bank_offsets.data(), 2}; + m_offsets[0] = 0; + m_offsets[1] = banks[bank].size(); + gsl::span offsets {m_offsets.data(), 2}; // bank content - using data_span = gsl::span; + using data_span = gsl::span; auto data_size = static_cast(banks[bank].size()); - std::vector spans(1, data_span {banks[bank].data(), data_size}); - - std::cout << "total data size is " << data_size << std::endl; - - if ( allen_bank_index == 2) { - auto const scifi_offsets = offsets; - const SciFi::SciFiRawEvent scifi_event( spans[0].data() + scifi_offsets[0]); - std::cout << "TESProvider set_banks: offset = " << scifi_offsets[0] << std::endl; - std::cout << "TESProvider set_banks: number of scifi raw banks = " << scifi_event.number_of_raw_banks << std::endl; - } + span b {banks[bank].data(), data_size}; - m_banks_and_offsets[allen_bank_index] = std::make_tuple(std::move(spans), data_size, std::move(offsets)); + m_banks_and_offsets[allen_bank_index] = {{std::move(b)}, data_size, std::move(offsets)}; } return 0; @@ -91,17 +80,6 @@ class TESProvider final : public InputProvider> { BanksAndOffsets banks(BankTypes bank_type, size_t /* slice_index */) const override { const auto ib = to_integral(bank_type); - std::cout << "fetching Allen bank type " << ib << " with size " << std::get<1>(m_banks_and_offsets[ib]) << std::endl; - - if ( ib == 2 ) { - auto const scifi_offsets = std::get<2>(m_banks_and_offsets[ib]); - using data_span = gsl::span; - std::vector spans = std::get<0>(m_banks_and_offsets[ib]); - const SciFi::SciFiRawEvent scifi_event( spans[0].data() + scifi_offsets[0]); - std::cout << "TESProvider banks: offset = " << scifi_offsets[0] << std::endl; - std::cout << "TESProvider banks: number of scifi raw banks = " << scifi_event.number_of_raw_banks << std::endl; - } - return m_banks_and_offsets[ib]; } @@ -111,4 +89,5 @@ class TESProvider final : public InputProvider> { private: std::array m_banks_and_offsets; + std::array m_offsets; }; diff --git a/x86/global_event_cut/src/HostGlobalEventCut.cpp b/x86/global_event_cut/src/HostGlobalEventCut.cpp index b8f1ca369a7..5228442a126 100644 --- a/x86/global_event_cut/src/HostGlobalEventCut.cpp +++ b/x86/global_event_cut/src/HostGlobalEventCut.cpp @@ -15,11 +15,9 @@ void host_global_event_cut::host_global_event_cut( // Check SciFi clusters const SciFi::SciFiRawEvent scifi_event(parameters.scifi_banks[0].data() + scifi_offsets[event_number]); uint n_SciFi_clusters = 0; - printf("number of scifi raw banks = %u \n", scifi_event.number_of_raw_banks); for (uint i = 0; i < scifi_event.number_of_raw_banks; ++i) { // get bank size in bytes, subtract four bytes for header word uint bank_size = scifi_event.raw_bank_offset[i + 1] - scifi_event.raw_bank_offset[i] - 4; - //printf("bank size = %u \n", bank_size); n_SciFi_clusters += bank_size; } -- GitLab From 5cb23e2e73375e8a6bc91ec7d74bd1d754c1d450 Mon Sep 17 00:00:00 2001 From: Dorothea vom Bruch Date: Fri, 8 May 2020 11:25:19 +0200 Subject: [PATCH 5/8] test gaud_env variable --- CMakeLists.txt | 2 +- Rec/Allen/src/RunAllen.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index add8bb728b0..712b49bb13c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -673,7 +673,7 @@ allen_add_executable(Allen ${main_cpp_path}) target_link_libraries(Allen PRIVATE AllenLib) if (GaudiProject_FOUND) - gaudi_env(SET ALLEN_INSTALL_DIR \${CMAKE_INSTALL_PREFIX}/constants) + gaudi_env(SET ALLEN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}) endif() \ No newline at end of file diff --git a/Rec/Allen/src/RunAllen.h b/Rec/Allen/src/RunAllen.h index 3139e9d5a71..9d3b7cceefa 100644 --- a/Rec/Allen/src/RunAllen.h +++ b/Rec/Allen/src/RunAllen.h @@ -77,8 +77,8 @@ private: Gaudi::Property m_updaterName {this, "UpdaterName", "AllenUpdater"}; - // to do: don't use hard-coded path - Gaudi::Property m_json {this, "JSON", "${ALLEN_PROJECT_ROOT}/build.x86_64-centos7-gcc9-opt/Sequence.json"}; + //Gaudi::Property m_json {this, "JSON", "${ALLEN_INSTALL_DIR}/constants/Sequence.json"}; + Gaudi::Property m_json {this, "JSON", "${ALLEN_PROJECT_ROOT}/build.x86_64-centos7-gcc9-opt/Sequence.json"}; Gaudi::Property m_paramDir {this, "ParamDir", "${ALLEN_PROJECT_ROOT}/input/detector_configuration/down"}; // If set to false, events are only filtered by the GEC -- GitLab From 8cefa03d86e493eb1c49293f34778e5d47c992cd Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Fri, 8 May 2020 09:34:54 +0000 Subject: [PATCH 6/8] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Allen/-/jobs/8292193 --- Rec/Allen/src/RunAllen.cpp | 19 +++++++--- Rec/Allen/src/RunAllen.h | 9 +++-- main/include/AllenUnits.h | 1 - main/include/BankTypes.h | 4 +-- main/include/BinaryProvider.h | 3 +- main/include/InputProvider.h | 4 +-- main/include/TESProvider.h | 65 ++++++++++++++++++----------------- 7 files changed, 58 insertions(+), 47 deletions(-) diff --git a/Rec/Allen/src/RunAllen.cpp b/Rec/Allen/src/RunAllen.cpp index f6c96a934c0..a535a3b5c4c 100644 --- a/Rec/Allen/src/RunAllen.cpp +++ b/Rec/Allen/src/RunAllen.cpp @@ -98,17 +98,26 @@ StatusCode RunAllen::initialize() const size_t reserve_mb = 10; // to do: how much do we need maximally for one event? m_stream_wrapper.reset(new StreamWrapper()); - m_stream_wrapper->initialize_streams(m_number_of_streams, print_memory_usage, start_event_offset, reserve_mb, m_constants, configuration_reader.params()); - + m_stream_wrapper->initialize_streams( + m_number_of_streams, + print_memory_usage, + start_event_offset, + reserve_mb, + m_constants, + configuration_reader.params()); + // Initialize host buffers (where Allen output is stored) - m_host_buffers_manager.reset(new HostBuffersManager(m_n_buffers, 2, m_do_check, m_stream_wrapper->number_of_hlt1_lines, m_stream_wrapper->errorevent_line)); + m_host_buffers_manager.reset(new HostBuffersManager( + m_n_buffers, 2, m_do_check, m_stream_wrapper->number_of_hlt1_lines, m_stream_wrapper->errorevent_line)); m_stream_wrapper->initialize_streams_host_buffers_manager(m_host_buffers_manager.get()); // Initialize input provider const size_t number_of_slices = 1; const size_t events_per_slice = 1; const size_t n_events = 1; - m_tes_input_provider.reset(new TESProvider(number_of_slices, events_per_slice, n_events)); + m_tes_input_provider.reset( + new TESProvider( + number_of_slices, events_per_slice, n_events)); // Set verbosity level logger::setVerbosity(6 - this->msgLevel()); @@ -150,7 +159,7 @@ std::tuple RunAllen::operator()( // how to exit a filter with failure? } bool filter = true; - HostBuffers * buffer = m_host_buffers_manager->getBuffers(buf_idx); + HostBuffers* buffer = m_host_buffers_manager->getBuffers(buf_idx); if (m_filter_hlt1.value()) { filter = buffer->host_passing_event_list[0]; } diff --git a/Rec/Allen/src/RunAllen.h b/Rec/Allen/src/RunAllen.h index 9d3b7cceefa..f1fc01d93ae 100644 --- a/Rec/Allen/src/RunAllen.h +++ b/Rec/Allen/src/RunAllen.h @@ -73,12 +73,15 @@ private: std::unique_ptr m_stream_wrapper; std::unique_ptr m_host_buffers_manager; - std::unique_ptr> m_tes_input_provider; + std::unique_ptr> + m_tes_input_provider; Gaudi::Property m_updaterName {this, "UpdaterName", "AllenUpdater"}; - //Gaudi::Property m_json {this, "JSON", "${ALLEN_INSTALL_DIR}/constants/Sequence.json"}; - Gaudi::Property m_json {this, "JSON", "${ALLEN_PROJECT_ROOT}/build.x86_64-centos7-gcc9-opt/Sequence.json"}; + // Gaudi::Property m_json {this, "JSON", "${ALLEN_INSTALL_DIR}/constants/Sequence.json"}; + Gaudi::Property m_json {this, + "JSON", + "${ALLEN_PROJECT_ROOT}/build.x86_64-centos7-gcc9-opt/Sequence.json"}; Gaudi::Property m_paramDir {this, "ParamDir", "${ALLEN_PROJECT_ROOT}/input/detector_configuration/down"}; // If set to false, events are only filtered by the GEC diff --git a/main/include/AllenUnits.h b/main/include/AllenUnits.h index 128a97d14d5..99d3452591f 100644 --- a/main/include/AllenUnits.h +++ b/main/include/AllenUnits.h @@ -10,4 +10,3 @@ namespace Allen { constexpr unsigned GB = MB * kB; } // namespace Units } // namespace Allen - diff --git a/main/include/BankTypes.h b/main/include/BankTypes.h index f9881f23b4d..09671227e2f 100644 --- a/main/include/BankTypes.h +++ b/main/include/BankTypes.h @@ -14,7 +14,7 @@ namespace { } constexpr auto NBankTypes = 10; -enum class BankTypes { VP, UT, FT, MUON, ODIN, Rich, ECal, HCal, OTRaw, OTError, Unknown }; +enum class BankTypes { VP, UT, FT, MUON, ODIN, Rich, ECal, HCal, OTRaw, OTError, Unknown }; // Average size of all raw banks of a given type per // subdetector, in kB, measured in simulated minbias events. @@ -24,7 +24,7 @@ const std::unordered_map BankSizes = {{BankTypes::VP, 12.f}, {BankTypes::FT, 9.f}, {BankTypes::MUON, 1.2f}, {BankTypes::Rich, 21.f}, - {BankTypes::HCal, 2.1}, + {BankTypes::HCal, 2.1}, {BankTypes::ECal, 8.f}, {BankTypes::ODIN, 0.1f}, {BankTypes::OTRaw, 110.f}, diff --git a/main/include/BinaryProvider.h b/main/include/BinaryProvider.h index 205b2dc89c6..172b7b77d7e 100644 --- a/main/include/BinaryProvider.h +++ b/main/include/BinaryProvider.h @@ -49,7 +49,7 @@ namespace { * @param loop on input files * @param optional: order of event IDs in which to provide bank data * - */ + */ template class BinaryProvider final : public InputProvider> { public: @@ -439,4 +439,3 @@ private: // Folder and file names per bank type std::array>, sizeof...(Banks)> m_files; }; - diff --git a/main/include/InputProvider.h b/main/include/InputProvider.h index 237ff9e411d..c7a2ffc0c69 100644 --- a/main/include/InputProvider.h +++ b/main/include/InputProvider.h @@ -41,10 +41,10 @@ struct IInputProvider { * @param optional timeout in ms to wait for slice * * @return tuple of (success, eof, timed_out, slice_index, n_filled) - */ + */ virtual std::tuple get_slice( boost::optional timeout = boost::optional {}) = 0; - + /** * @brief Get banks and offsets of a given type * diff --git a/main/include/TESProvider.h b/main/include/TESProvider.h index 8456b3454df..598c13f1932 100644 --- a/main/include/TESProvider.h +++ b/main/include/TESProvider.h @@ -6,70 +6,71 @@ #include #include -#include "SciFiRaw.cuh" +#include "SciFiRaw.cuh" /** - * @brief Provide event from TES location containing the same format as the binary files, + * @brief Provide event from TES location containing the same format as the binary files, * i.e. the layout used for Allen - * - * @details + * + * @details * * @param number of slices * @param number of events to fill per slice * @param optional: number of events to read * - */ - + */ template class TESProvider final : public InputProvider> { - public: - TESProvider( - size_t n_slices, - size_t events_per_slice, - boost::optional n_events) : - InputProvider> {n_slices, events_per_slice, n_events} +public: + TESProvider(size_t n_slices, size_t events_per_slice, boost::optional n_events) : + InputProvider> {n_slices, events_per_slice, n_events} {} - + /** * @brief Get banks in the format they are stored in TES * * @param Array with raw bank content * @param Set with bank types to be used as input for Allen */ - int set_banks(const std::array, LHCb::RawBank::LastType>& banks, std::set bankTypes) + int set_banks( + const std::array, LHCb::RawBank::LastType>& banks, + std::set bankTypes) { // get mapping of LHCb::RawBank::BankType to Allen::BankType const std::vector bank_ids_mapping = bank_ids(); - + // store banks and offsets as BanksAndOffsets object for (const auto& bank : bankTypes) { if (bank >= bank_ids_mapping.size()) { - std::cout << "ERROR: LHCb::RawBank index out of scope from conversion between Allen and LHCb raw bank types" << std::endl;; + std::cout << "ERROR: LHCb::RawBank index out of scope from conversion between Allen and LHCb raw bank types" + << std::endl; + ; return 1; } - const auto allen_bank_index = bank_ids_mapping[bank]; - if (allen_bank_index < 0 ) { - std::cout << "ERROR: dumped bank type does not exist in Allen" << std::endl;; + const auto allen_bank_index = bank_ids_mapping[bank]; + if (allen_bank_index < 0) { + std::cout << "ERROR: dumped bank type does not exist in Allen" << std::endl; + ; return 1; } - + // Offsets to events (we only process one event) m_offsets[0] = 0; m_offsets[1] = banks[bank].size(); gsl::span offsets {m_offsets.data(), 2}; - + // bank content - using data_span = gsl::span; + using data_span = gsl::span; auto data_size = static_cast(banks[bank].size()); span b {banks[bank].data(), data_size}; - + m_banks_and_offsets[allen_bank_index] = {{std::move(b)}, data_size, std::move(offsets)}; } - + return 0; - } - + } + /** * @brief Obtain banks from TES * @@ -81,13 +82,13 @@ class TESProvider final : public InputProvider> { { const auto ib = to_integral(bank_type); return m_banks_and_offsets[ib]; - } - + } + void event_sizes(size_t const, gsl::span const, std::vector&) const override {} - + void copy_banks(size_t const, unsigned int const, gsl::span) const override {} - - private: + +private: std::array m_banks_and_offsets; - std::array m_offsets; + std::array m_offsets; }; -- GitLab From 20bd46d2a7edffeb97c88b2468ba0c02c3b5fa23 Mon Sep 17 00:00:00 2001 From: Dorothea vom Bruch Date: Mon, 11 May 2020 15:07:21 +0200 Subject: [PATCH 7/8] set environment variable ALLEN_INSTALL_DIR in Rec/Allen/CMakeLists.txt --- CMakeLists.txt | 4 ---- Rec/Allen/CMakeLists.txt | 3 +++ Rec/Allen/src/RunAllen.h | 5 +---- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 712b49bb13c..7c2916a84c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -671,9 +671,5 @@ endif() allen_add_executable(Allen ${main_cpp_path}) target_link_libraries(Allen PRIVATE AllenLib) - -if (GaudiProject_FOUND) - gaudi_env(SET ALLEN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}) -endif() \ No newline at end of file diff --git a/Rec/Allen/CMakeLists.txt b/Rec/Allen/CMakeLists.txt index eba812debc4..66c1efde852 100644 --- a/Rec/Allen/CMakeLists.txt +++ b/Rec/Allen/CMakeLists.txt @@ -92,6 +92,9 @@ find_package(ZMQ REQUIRED) include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${CPPGSL_INCLUDE_DIR} ${RANGEV3_INCLUDE_DIR} ${GSL_INCLUDE_DIRS} "${PROJECT_BINARY_DIR}/configuration/sequences") +message(STATUS "Setting Allen install dir env variable to ${CMAKE_INSTALL_PREFIX}") +gaudi_env(SET ALLEN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}) + gaudi_add_module(AllenWrapper src/*.cpp INCLUDE_DIRS Online/OnlineKernel diff --git a/Rec/Allen/src/RunAllen.h b/Rec/Allen/src/RunAllen.h index f1fc01d93ae..7d6a0b786e7 100644 --- a/Rec/Allen/src/RunAllen.h +++ b/Rec/Allen/src/RunAllen.h @@ -78,10 +78,7 @@ private: Gaudi::Property m_updaterName {this, "UpdaterName", "AllenUpdater"}; - // Gaudi::Property m_json {this, "JSON", "${ALLEN_INSTALL_DIR}/constants/Sequence.json"}; - Gaudi::Property m_json {this, - "JSON", - "${ALLEN_PROJECT_ROOT}/build.x86_64-centos7-gcc9-opt/Sequence.json"}; + Gaudi::Property m_json {this, "JSON", "${ALLEN_INSTALL_DIR}/constants/Sequence.json"}; Gaudi::Property m_paramDir {this, "ParamDir", "${ALLEN_PROJECT_ROOT}/input/detector_configuration/down"}; // If set to false, events are only filtered by the GEC -- GitLab From d5a57cc8be879ee1acb9f0613d391df21973bc6c Mon Sep 17 00:00:00 2001 From: Daniel Campora Date: Thu, 21 May 2020 17:31:16 +0200 Subject: [PATCH 8/8] Removed spurious ;. --- main/include/TESProvider.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/main/include/TESProvider.h b/main/include/TESProvider.h index 598c13f1932..00749062b1b 100644 --- a/main/include/TESProvider.h +++ b/main/include/TESProvider.h @@ -45,13 +45,11 @@ public: if (bank >= bank_ids_mapping.size()) { std::cout << "ERROR: LHCb::RawBank index out of scope from conversion between Allen and LHCb raw bank types" << std::endl; - ; return 1; } const auto allen_bank_index = bank_ids_mapping[bank]; if (allen_bank_index < 0) { std::cout << "ERROR: dumped bank type does not exist in Allen" << std::endl; - ; return 1; } -- GitLab