14#ifndef NEULAND_DIGITIZING_ENGINE_H
15#define NEULAND_DIGITIZING_ENGINE_H
25#include <range/v3/algorithm/find_if.hpp>
26#include <range/v3/view/take.hpp>
27#include <range/v3/view/transform.hpp>
63 void DepositLight(
int paddle_id,
double time,
double energy_dep,
double dist)
66 paddle.DepositLight({ time, energy_dep, dist });
77 auto min_element = std::min_element(paddles_view.begin(),
80 { return left->GetTrigTime() < right->GetTrigTime(); });
81 return (min_element == paddles_view.end()) ? NAN : min_element->get()->GetTrigTime();
91 void Init(
int initial_capacity = 1)
150 template <
typename Unary>
153 for (
const auto& paddle : ranges::views::take(
paddles_,
size_))
182 template <
typename Unary>
186 ranges::views::transform([](
auto& paddle) ->
const AbstractPaddle& {
return *paddle; }));
191 std::vector<std::unique_ptr<AbstractPaddle>>
207 for (
int idx{}; idx < num; ++idx)
219 ranges::find_if(valid_view, [paddle_id](
auto& paddle) {
return paddle->GetPaddleID() == paddle_id; });
220 if (iter != valid_view.end())
232 new_paddle->SetPaddleID(paddle_id);
238 template <
typename ChannelClass,
typename = std::enable_if_t<std::is_base_of_v<AbstractChannel, ChannelClass>>>
241 template <
typename... Args>
243 :
BuildChannel([=](
Side side) {
return std::make_unique<ChannelClass>(side, args...); })
249 template <
typename PaddleClass,
typename = std::enable_if_t<std::is_base_of_v<AbstractPaddle, PaddleClass>>>
252 template <
typename... Args>
254 :
BuildPaddle([=](int paddleID) {
return std::make_unique<PaddleClass>(paddleID, args...); })
260 template <
typename PaddleClass,
typename ChannelClass,
typename InitFunc = std::function<
void()>>
267 InitFunc initFunc = []() {})
301 template <
typename... Args>
302 [[nodiscard]]
auto CreateEngine(Args&&... args) -> std::unique_ptr<
decltype(
Engine{ std::forward<Args>(args)... })>
304 return std::make_unique<
decltype(Engine{ std::forward<Args>(args)... })>(std::forward<Args>(args)...);
UseChannel< ChannelClass > channelClass_
Channel class factory.
Engine(const UsePaddle< PaddleClass > &p_paddleClass, const UseChannel< ChannelClass > &p_channelClass, InitFunc initFunc=[]() {})
auto make_new_paddle() const -> std::unique_ptr< AbstractPaddle > override
void SetInit(const InitFunc &initFunc)
Initialize the underlying data.
void ExtraInit(int) override
void ExtraReset() override
UsePaddle< PaddleClass > paddleClass_
Paddle class factory.
void reserve_additional_paddles(int num)
Reserve memories for additional number of paddles.
EngineInterface()=default
Default constructor.
virtual void ExtraReset()
auto operator=(const EngineInterface &other) -> EngineInterface &=delete
Copy assignment operator.
auto DoAllPaddles(Unary fnt) const
Accessor operator for all paddles stored in the current event.
auto operator=(EngineInterface &&other) -> EngineInterface &=delete
Move assignment operator.
virtual void ExtraInit(int initial_capacity)
EngineInterface(EngineInterface &&other)=delete
Move constructor.
void Init(int initial_capacity=1)
Initialization of the engine class.
EngineInterface(const EngineInterface &other)=delete
Copy constructor.
void Reset()
Reset the engine for a new event.
void Construct()
Construct singals from the paddles and channels.
virtual auto make_new_paddle() const -> std::unique_ptr< AbstractPaddle >=0
auto GetTriggerTime() const -> double
Get the trigger time of the current event.
auto add_paddle(int paddle_id) -> AbstractPaddle &
void DoEachPaddle(Unary fnt) const
Accessor operator for each paddle stored in the current event.
void DepositLight(int paddle_id, double time, double energy_dep, double dist)
Takes in a light deposition and pass it to the paddle.
std::vector< std::unique_ptr< AbstractPaddle > > paddles_
main data. This vector should rarely grow in the event loop!
virtual ~EngineInterface()=default
virtual destructor
std::atomic< int > size_
size of bars with valid signals in the current event
auto get_capacity() const
The number of preallocated bar objects in the engine.
auto CreateEngine(Args &&... args) -> std::unique_ptr< decltype(Engine{ std::forward< Args >(args)... })>
UseChannel(const Args &... args)
std::function< std::unique_ptr< Type >(Side)> BuildChannel
std::function< std::unique_ptr< Type >(int)> BuildPaddle
UsePaddle(const Args &... args)