14#ifndef NEULAND_DIGITIZING_ENGINE_H
15#define NEULAND_DIGITIZING_ENGINE_H
37 virtual void DepositLight(
int paddle_id,
double time,
double light,
double dist) = 0;
44 template <typename ChannelClass, typename = std::enable_if_t<std::is_base_of_v<
Channel, ChannelClass>>>
47 template <
typename... Args>
55 template <
typename PaddleClass,
typename = std::enable_if_t<std::is_base_of_v<Paddle, PaddleClass>>>
58 template <
typename... Args>
60 :
BuildPaddle([=](int paddleID) {
return std::make_unique<PaddleClass>(paddleID, args...); })
66 template <
typename PaddleClass,
typename ChannelClass,
typename InitFunc = std::function<
void()>>
72 std::map<int, std::unique_ptr<Paddle>> paddles;
79 InitFunc initFunc = []() {})
80 : paddleClass_{ p_paddleClass }
81 , channelClass_{ p_channelClass }
83 , initFunc_{ initFunc }
87 void DepositLight(
int paddle_id,
double time,
double light,
double dist)
override
89 if (paddles.find(paddle_id) == paddles.end())
91 auto newPaddle = paddleClass_.BuildPaddle(paddle_id);
96 paddles[paddle_id] = std::move(newPaddle);
98 paddles.at(paddle_id)->DepositLight({ time, light, dist });
103 auto min_element = std::min_element(paddles.begin(),
106 { return left.second->GetTrigTime() < right.second->GetTrigTime(); });
107 return (min_element == paddles.end()) ? NAN : min_element->second->GetTrigTime();
110 [[nodiscard]]
auto ExtractPaddles() -> std::map<int, std::unique_ptr<Paddle>>
override
112 return std::move(paddles);
115 void Init()
override { initFunc_(); }
116 void SetInit(
const InitFunc& initFunc) { initFunc_ = initFunc; }
120 template <
typename... Args>
122 -> std::unique_ptr<
decltype(
DigitizingEngine{ std::forward<Args>(args)... })>
124 return std::make_unique<
decltype(DigitizingEngine{ std::forward<Args>(args)... })>(std::forward<Args>(args)...);
void DepositLight(int paddle_id, double time, double light, double dist) override
void SetInit(const InitFunc &initFunc)
DigitizingEngine(const UsePaddle< PaddleClass > &p_paddleClass, const UseChannel< ChannelClass > &p_channelClass, InitFunc initFunc=[]() {})
auto GetTriggerTime() const -> double override
auto ExtractPaddles() -> std::map< int, std::unique_ptr< Paddle > > override
virtual ~DigitizingEngineInterface()=default
virtual auto GetTriggerTime() const -> double=0
auto operator=(const DigitizingEngineInterface &other) -> DigitizingEngineInterface &=delete
virtual auto ExtractPaddles() -> std::map< int, std::unique_ptr< Paddle > >=0
DigitizingEngineInterface(DigitizingEngineInterface &&other)=default
auto operator=(DigitizingEngineInterface &&other) -> DigitizingEngineInterface &=delete
virtual void DepositLight(int paddle_id, double time, double light, double dist)=0
DigitizingEngineInterface(const DigitizingEngineInterface &other)=delete
DigitizingEngineInterface()=default
auto CreateEngine(Args &&... args) -> std::unique_ptr< decltype(DigitizingEngine{ std::forward< Args >(args)... })>
UseChannel(const Args &... args)
std::function< std::unique_ptr< Type >(ChannelSide)> BuildChannel
std::function< std::unique_ptr< Type >(int)> BuildPaddle
UsePaddle(const Args &... args)