23#include <FairRootManager.h>
24#include <FairRuntimeDb.h>
40 inline auto get_hit_energy(
double first_e,
double second_e,
const HitModulePar& par)
46 inline auto get_hit_position(
double tdc_left,
double tdc_right,
const HitModulePar& par)
51 fmt::format(
"Calculating position with left tdc: {}, right tdc {}, effective speed: {}, tdc_diff: {}",
55 tdc_right - tdc_left));
56 const auto pos_along_bar = par.effective_speed.value * (tdc_right - tdc_left);
61 "pos along the bar: {} cm, pos perp to bar {} cm, z: {} cm", pos_along_bar, pos_perp_bar, pos_z));
64 return is_horizontal ? TVector3{ pos_along_bar, pos_perp_bar, pos_z }
65 : TVector3{ pos_perp_bar, pos_along_bar, pos_z };
68 inline auto get_hit_pixel(
const TVector3& position)
76 return TVector3{ pixel_x, pixel_y, pixel_z };
107 R3BLOG(debug1, fmt::format(
"Input calBar: {}", calBar));
108 if (calBar.module_num == 0)
116 const auto& module_par =
cal_to_hit_par_->GetModuleParAt(calBar.module_num);
122 std::vector<CalibratedSignal>& signals,
129 for (
const auto& cal_signal : calBar_signals)
141 fmt::format(
"Input left calibrated signal: {} and right calibrated signal: {}",
143 signalPair.right()));
145 hit.module_id =
static_cast<int>(par.module_num - 1);
146 hit.tdc_left = signalPair.left().time.value;
147 hit.tdc_right = signalPair.right().time.value;
149 hit.qdc_left = signalPair.left().energy.value;
150 hit.qdc_right = signalPair.right().energy.value;
151 hit.energy = get_hit_energy(hit.qdc_left, hit.qdc_right, par);
152 hit.position = get_hit_position(hit.tdc_left, hit.tdc_right, par);
153 hit.pixel = get_hit_pixel(hit.position);
154 R3BLOG(debug, fmt::format(
"Adding a new NeulandHit: {}\n", hit));
159 const std::vector<CalibratedSignal>& right_signals,
161 std::vector<R3BNeulandHit>& hits)
164 if (left_signals.size() == 1 and right_signals.size() == 1)
166 const auto& left_signal = left_signals.front();
167 const auto& right_signal = right_signals.front();
177 const auto first_input =
SignalMatcher::Input{ first_signal.time.value, first_signal.energy.value };
178 const auto second_input =
SignalMatcher::Input{ second_signal.time.value, second_signal.energy.value };
180 const auto match_par =
183 const auto match_result = std::log10(match_goodness);
200 auto larger_t = (first_t > second_t) ? first_t : second_t;
201 auto smaller_t = (first_t < second_t) ? first_t : second_t;
219 const auto tot_no_offset = calSignal.time_over_threshold - par.pedestal.get(side);
222 return (tot_no_offset.value < 1)
224 : tot_no_offset / (par.energy_gain.get(side) - par.pmt_saturation.get(side) * tot_no_offset);
232 const auto time_offset =
233 (side ==
R3B::Side::left) ? (par.t_sync - par.t_diff / 2) : (par.t_sync + par.t_diff / 2);
234 return calSignal.leading_time - calSignal.trigger_time - time_offset;
#define R3BLOG(severity, x)
static auto get_calibrated_energy(const CalDataSignal &calSignal, const HitModulePar &par, R3B::Side side) -> ValueErrorD
auto construct_hit(const LRPair< CalibratedSignal > &signalPair, const HitModulePar &par) const -> R3BNeulandHit
void SetExtraPar(FairRuntimeDb *rtdb) override
Cal2HitPar * cal_to_hit_par_
void ExtraInit(FairRootManager *rootMan) override
double global_time_offset_
static auto get_calibrated_time(const CalDataSignal &calSignal, const HitModulePar &par, R3B::Side side) -> ValueErrorD
static auto to_calibrated_signal(const CalDataSignal &calSignal, const HitModulePar &par, R3B::Side side) -> CalibratedSignal
std::vector< CalibratedSignal > temp_left_signals_
void TriggeredExec() override
void calculate_calibrated_signals(const BarCalData &calBar, std::vector< CalibratedSignal > &signals, Side side)
OutputVectorConnector< R3BNeulandHit > hit_data_
auto signal_match_checking(const CalibratedSignal &first_signal, const CalibratedSignal &second_signal, const HitModulePar &par) -> bool
Cal2HitTask(std::string_view name="R3BNeulandCal2Hit", int iVerbose=1)
void HistogramInit(DataMonitor &histograms) override
void construct_hits(const std::vector< CalibratedSignal > &left_signals, const std::vector< CalibratedSignal > &right_signals, const HitModulePar &par, std::vector< R3BNeulandHit > &hits)
InputVectorConnector< BarCalData > cal_data_
auto get_hit_time(double first_t, double second_t) const -> double
void EndOfTask() override
std::vector< CalibratedSignal > temp_right_signals_
auto IsHistDisabled() const -> bool
auto GetHistMonitor() -> DataMonitor &
auto GetEventHeader() const -> auto *
Simulation of NeuLAND Bar/Paddle.
constexpr auto BarsPerPlane
constexpr auto ModuleID2PlaneID(int moduleID) -> int
constexpr auto BarSize_XY
constexpr auto IsPlaneIDHorizontal(int plane_id) -> bool
constexpr auto MaxCalTime
ValueError< double > ValueErrorD
std::vector< CalDataSignal > left
std::vector< CalDataSignal > right
ValueError< double > light_attenuation_factor
static auto GetGoodnessOfMatch(const Input &firstSignal, const Input &secondSignal, const Par &par) -> float