R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
R3BDigitizingPaddleMock.h
Go to the documentation of this file.
1/******************************************************************************
2 * Copyright (C) 2019 GSI Helmholtzzentrum für Schwerionenforschung GmbH *
3 * Copyright (C) 2019-2025 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#pragma once
21
23#include "R3BDigitizingPaddle.h"
24#include "R3BLogger.h"
25#include "R3BShared.h"
26#include <RtypesCore.h>
27#include <cstdint>
28
30{
32 {
33 public:
34 explicit MockPaddle(uint16_t paddleID)
35 : Digitizing::AbstractPaddle{ paddleID }
36 {
37 }
38
39 private:
40 [[nodiscard]] auto compute_time(const AbstractChannel::Hit& firstSignal,
41 const AbstractChannel::Hit& secondSignal) const -> double override
42 {
43 return (firstSignal.tdc + secondSignal.tdc) / 2;
44 }
45 [[nodiscard]] auto compute_energy(const AbstractChannel::Hit& firstSignal,
46 const AbstractChannel::Hit& secondSignal) const -> double override
47 {
48 return (firstSignal.qdcUnSat + secondSignal.qdcUnSat) / 2;
49 }
50 [[nodiscard]] auto compute_position(const AbstractChannel::Hit& leftSignal,
51 const AbstractChannel::Hit& rightSignal) const -> double override
52 {
53 if (leftSignal.side == rightSignal.side)
54 {
55 R3BLOG(fatal, "cannot compute position with signals from same side!");
56 return 0.F;
57 }
58 return (leftSignal.side == Side::left) ? (leftSignal.tdc - rightSignal.tdc) / 2 * gCMedium
59 : (rightSignal.tdc - leftSignal.tdc) / 2 * gCMedium;
60 }
61 [[nodiscard]] auto compute_channel_signals(const Signal& hit) const -> Pair<AbstractChannel::Signal> override
62 {
63 auto rightChannelHit = GenerateMockChannelHit(hit.time, hit.energy_dep, hit.distance_to_center);
64 auto leftChannelHit = GenerateMockChannelHit(hit.time, hit.energy_dep, -1 * hit.distance_to_center);
65 return { leftChannelHit, rightChannelHit };
66 }
67
68 public:
69 static constexpr double gHalfLength = 135.; // [cm]
70 static constexpr double gCMedium = 30.; // speed of light in material in [cm/ns]
71 static auto GenerateMockChannelHit(Double_t mcTime, Double_t mcLight, Double_t dist) -> AbstractChannel::Signal
72 {
73 auto time = mcTime - (MockPaddle::gHalfLength + dist) / MockPaddle::gCMedium;
74 auto light = mcLight;
75 return { time, light };
76 }
77 };
78} // namespace R3B::Digitizing::Neuland
#define R3BLOG(severity, x)
Definition R3BLogger.h:32
AbstractPaddle(int paddleID, SignalCouplingStrategy strategy=SignalCouplingByTime)
auto compute_position(const AbstractChannel::Hit &leftSignal, const AbstractChannel::Hit &rightSignal) const -> double override
static auto GenerateMockChannelHit(Double_t mcTime, Double_t mcLight, Double_t dist) -> AbstractChannel::Signal
auto compute_time(const AbstractChannel::Hit &firstSignal, const AbstractChannel::Hit &secondSignal) const -> double override
auto compute_energy(const AbstractChannel::Hit &firstSignal, const AbstractChannel::Hit &secondSignal) const -> double override
auto compute_channel_signals(const Signal &hit) const -> Pair< AbstractChannel::Signal > override
Simulation of Mock Bar/Paddle.