25 inline auto get_hit_energy(
double first_e,
double second_e,
const HitModulePar& par)
31 inline auto get_hit_position(
double tdc_left,
double tdc_right,
const HitModulePar& par)
36 fmt::format(
"Calculating position with left tdc: {}, right tdc {}, effective speed: {}, tdc_diff: {}",
40 tdc_right - tdc_left));
41 const auto pos_along_bar = par.effective_speed.value * (tdc_right - tdc_left);
46 "pos along the bar: {} cm, pos perp to bar {} cm, z: {} cm", pos_along_bar, pos_perp_bar, pos_z));
49 return is_horizontal ? TVector3{ pos_along_bar, pos_perp_bar, pos_z }
50 : TVector3{ pos_perp_bar, pos_along_bar, pos_z };
53 inline auto get_hit_pixel(
const TVector3& position)
61 return TVector3{ pixel_x, pixel_y, pixel_z };
85 void Cal2HitTask::calibrate()
87 for (
const auto& calBar : cal_data_)
89 temp_left_signals_.clear();
90 temp_right_signals_.clear();
92 R3BLOG(debug1, fmt::format(
"Input calBar: {}", calBar));
93 if (calBar.module_num == 0)
98 calculate_calibrated_signals(calBar, temp_left_signals_,
Side::left);
99 calculate_calibrated_signals(calBar, temp_right_signals_,
Side::right);
101 const auto& module_par = cal_to_hit_par_->
GetModuleParAt(calBar.module_num);
102 construct_hits(temp_left_signals_, temp_right_signals_, module_par, hit_data_.get());
106 void Cal2HitTask::calculate_calibrated_signals(
const BarCalData& calBar,
107 std::vector<CalibratedSignal>& signals,
110 const auto calBar_signals = (side ==
Side::left) ? calBar.left : calBar.
right;
112 const auto& module_par = cal_to_hit_par_->GetModuleParAt(calBar.module_num);
114 for (
const auto& cal_signal : calBar_signals)
116 signals.push_back(to_calibrated_signal(cal_signal, module_par, side));
120 auto Cal2HitTask::construct_hit(
const LRPair<CalibratedSignal>& signalPair,
123 auto hit = R3BNeulandHit{};
126 fmt::format(
"Input left calibrated signal: {} and right calibrated signal: {}",
128 signalPair.right()));
130 hit.module_id =
static_cast<int>(par.module_num - 1);
131 hit.tdc_left = signalPair.left().time.value;
132 hit.tdc_right = signalPair.right().time.value;
133 hit.time = get_hit_time(hit.tdc_left, hit.tdc_right);
134 hit.qdc_left = signalPair.left().energy.value;
135 hit.qdc_right = signalPair.right().energy.value;
136 hit.energy = get_hit_energy(hit.qdc_left, hit.qdc_right, par);
137 hit.position = get_hit_position(hit.tdc_left, hit.tdc_right, par);
138 hit.pixel = get_hit_pixel(hit.position);
139 R3BLOG(debug, fmt::format(
"Adding a new NeulandHit: {}\n", hit));
143 void Cal2HitTask::construct_hits(
const std::vector<CalibratedSignal>& left_signals,
144 const std::vector<CalibratedSignal>& right_signals,
146 std::vector<R3BNeulandHit>& hits)
149 if (left_signals.size() == 1 and right_signals.size() == 1)
151 const auto& left_signal = left_signals.front();
152 const auto& right_signal = right_signals.front();
154 hits.push_back(construct_hit(R3B::LRPair<CalibratedSignal>{ left_signal, right_signal }, par));
158 auto Cal2HitTask::signal_match_checking(
const CalibratedSignal& first_signal,
162 const auto first_input =
SignalMatcher::Input{ first_signal.time.value, first_signal.energy.value };
163 const auto second_input =
SignalMatcher::Input{ second_signal.time.value, second_signal.energy.value };
165 const auto match_par =
168 const auto match_result = std::log10(match_goodness);
170 GetHistMonitor().get(
"match_values")->Fill(match_result);
183 auto Cal2HitTask::get_hit_time(
double first_t,
double second_t)
const ->
double
185 auto larger_t = (first_t > second_t) ? first_t : second_t;
186 auto smaller_t = (first_t < second_t) ? first_t : second_t;
196 return std::remainder(((larger_t + smaller_t) / 2.) - global_time_offset_ - GetEventHeader()->GetTStart(),
200 auto Cal2HitTask::get_calibrated_energy(
const CalDataSignal& calSignal,
201 const HitModulePar& par,
204 const auto tot_no_offset = calSignal.time_over_threshold - par.pedestal.get(side);
207 return (tot_no_offset.value < 1)
209 : tot_no_offset / (par.energy_gain.get(side) - par.pmt_saturation.get(side) * tot_no_offset);
212 auto Cal2HitTask::get_calibrated_time(
const CalDataSignal& calSignal,
217 const auto time_offset =
218 (side ==
R3B::Side::left) ? (par.t_sync - par.t_diff / 2) : (par.t_sync + par.t_diff / 2);
219 return calSignal.leading_time - calSignal.trigger_time - time_offset;
222 auto Cal2HitTask::to_calibrated_signal(
const CalDataSignal& calSignal,
226 const auto energy = get_calibrated_energy(calSignal, par, side);
227 const auto time = get_calibrated_time(calSignal, par, side);
#define R3BLOG(severity, x)
auto GetModuleParAt(unsigned int module_num) const -> const ::R3B::Neuland::HitModulePar &
void SetExtraPar(FairRuntimeDb *rtdb) override
void ExtraInit(FairRootManager *rootMan) override
void TriggeredExec() override
Cal2HitTask(std::string_view name="R3BNeulandCal2Hit", int iVerbose=1)
void HistogramInit(DataMonitor &histograms) override
void EndOfTask() override
auto IsHistDisabled() const -> bool
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
ValueError< double > light_attenuation_factor
static auto GetGoodnessOfMatch(const Input &firstSignal, const Input &secondSignal, const Par &par) -> float