R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
R3BDigitizingPaddle.h
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (C) 2019 GSI Helmholtzzentrum für Schwerionenforschung GmbH *
3 * Copyright (C) 2019 Members of R3B Collaboration *
4 * *
5 * This software is distributed under the terms of the *
6 * GNU General Public Licence (GPL) version 3, *
7 * copied verbatim in the file "LICENSE". *
8 * *
9 * In applying this license GSI does not waive the privileges and immunities *
10 * granted to it by virtue of its status as an Intergovernmental Organization *
11 * or submit itself to any jurisdiction. *
12 ******************************************************************************/
13
14#ifndef DIGITIZING_PADDLE_H
15#define DIGITIZING_PADDLE_H
16
18#include <R3BLogger.h>
19#include <RtypesCore.h>
20#include <functional>
21#include <memory>
22
23namespace R3B::Digitizing
24{
25
26 template <typename Type>
27 struct LRPair
28 {
29 Type left{};
30 Type right{};
31 LRPair(Type p_left, Type p_right)
32 : left(p_left)
33 , right(p_right)
34 {
35 }
36 LRPair() = default;
37 };
38
40 {
41 double energy{};
42 double time{};
43 double position{};
48
49 explicit PaddleSignal(LRPair<std::reference_wrapper<const Channel::CalSignal>> p_signals)
50 : leftChannelCal{ &p_signals.left.get() }
51 , rightChannelCal{ &p_signals.right.get() }
52 {
53 }
54
55 explicit PaddleSignal(LRPair<std::reference_wrapper<const Channel::Signal>> p_signals)
56 : leftChannel{ &p_signals.left.get() }
57 , rightChannel{ &p_signals.right.get() }
58 {
59 }
60 };
61
62 struct PaddleHit
63 {
64 double time; // ns
65 double LightDep; // MeV
66 double DistToPaddleCenter; // cm
67 };
68
69 class Paddle
70 {
71 public:
72 template <typename Type>
75 using Hit = PaddleHit;
76 using Signals = std::vector<Signal>;
78 using SignalCouplingStrategy = std::function<
79 std::vector<ChannelSignalPair>(const Paddle&, const Channel::Signals&, const Channel::Signals&)>;
80
81 explicit Paddle(int paddleID, SignalCouplingStrategy strategy = SignalCouplingByTime);
82 auto HasFired() const -> bool;
83 auto HasHalfFired() const -> bool;
84
85 // rule of 5
86 virtual ~Paddle() = default;
87 Paddle(const Paddle& other) = delete;
88 auto operator=(const Paddle& other) -> Paddle& = delete;
89 Paddle(Paddle&& other) = default;
90 auto operator=(Paddle&& other) -> Paddle& = delete;
91
92 void DepositLight(const Hit& hit);
93
94 void SetChannel(std::unique_ptr<Channel> channel);
95
96 void SetSignalCouplingStrategy(const SignalCouplingStrategy& strategy) { fSignalCouplingStrategy = strategy; }
97
98 // Getters:
99 auto GetPaddleID() const -> int { return fPaddleID; }
100 auto GetSignals() const -> const std::vector<Signal>&;
101 auto GetSignalCouplingStragtegy() const -> const SignalCouplingStrategy& { return fSignalCouplingStrategy; }
102 auto GetLeftChannel() const -> const Channel* { return fLeftChannel.get(); }
103 auto& GetLeftChannelRef() { return *fLeftChannel; }
104 auto& GetRightChannelRef() { return *fRightChannel; }
105 auto GetRightChannel() const -> const Channel* { return fRightChannel.get(); }
106 auto GetTrigTime() const -> double;
107
108 private:
109 mutable Validated<Signals> fSignals;
110 const int fPaddleID;
111 std::unique_ptr<Channel> fLeftChannel{};
112 std::unique_ptr<Channel> fRightChannel{};
113 SignalCouplingStrategy fSignalCouplingStrategy;
114 // virtual std::function<indexMapFunc> IndexMapFunc() const { return ConstructIndexMapByTime; }
115
116 virtual auto ConstructPaddelSignals(const Channel::Signals& firstSignals,
117 const Channel::Signals& secondSignals) const -> Signals;
118 virtual auto ComputeTime(const Channel::Signal& firstSignal,
119 const Channel::Signal& secondSignal) const -> double = 0;
120 virtual auto ComputeEnergy(const Channel::Signal& firstSignal,
121 const Channel::Signal& secondSignal) const -> double = 0;
122 virtual auto ComputePosition(const Channel::Signal& rightSignal,
123 const Channel::Signal& leftSignal) const -> double = 0;
124 virtual auto ComputeChannelHits(const Hit& hit) const -> Pair<Channel::Hit> = 0;
125
126 public:
127 virtual auto MatchSignals(const Channel::Signal& firstSignal,
128 const Channel::Signal& secondSignal) const -> float
129 {
130 return 0.;
131 }
132 static auto SignalCouplingByTime(const Paddle& self,
133 const Channel::Signals& firstSignals,
134 const Channel::Signals& secondSignals) -> std::vector<ChannelSignalPair>;
135 };
136} // namespace R3B::Digitizing
137#endif
std::vector< Signal > Signals
auto GetLeftChannel() const -> const Channel *
void SetChannel(std::unique_ptr< Channel > channel)
std::function< std::vector< ChannelSignalPair >(const Paddle &, const Channel::Signals &, const Channel::Signals &)> SignalCouplingStrategy
virtual auto ComputePosition(const Channel::Signal &rightSignal, const Channel::Signal &leftSignal) const -> double=0
std::vector< Signal > Signals
static auto SignalCouplingByTime(const Paddle &self, const Channel::Signals &firstSignals, const Channel::Signals &secondSignals) -> std::vector< ChannelSignalPair >
Pair< std::reference_wrapper< const Channel::Signal > > ChannelSignalPair
auto HasHalfFired() const -> bool
virtual auto ComputeChannelHits(const Hit &hit) const -> Pair< Channel::Hit >=0
Paddle(int paddleID, SignalCouplingStrategy strategy=SignalCouplingByTime)
void DepositLight(const Hit &hit)
auto GetSignals() const -> const std::vector< Signal > &
virtual auto ComputeEnergy(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> double=0
auto GetTrigTime() const -> double
auto GetPaddleID() const -> int
auto GetSignalCouplingStragtegy() const -> const SignalCouplingStrategy &
void SetSignalCouplingStrategy(const SignalCouplingStrategy &strategy)
virtual auto ConstructPaddelSignals(const Channel::Signals &firstSignals, const Channel::Signals &secondSignals) const -> Signals
virtual auto ComputeTime(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> double=0
auto HasFired() const -> bool
virtual auto MatchSignals(const Channel::Signal &firstSignal, const Channel::Signal &secondSignal) const -> float
auto GetRightChannel() const -> const Channel *
LRPair(Type p_left, Type p_right)
PaddleSignal(LRPair< std::reference_wrapper< const Channel::Signal > > p_signals)
const Channel::CalSignal * rightChannelCal
const Channel::Signal * rightChannel
const Channel::Signal * leftChannel
PaddleSignal(LRPair< std::reference_wrapper< const Channel::CalSignal > > p_signals)
const Channel::CalSignal * leftChannelCal