24#include <FairRootManager.h>
25#include <FairRuntimeDb.h>
26#include <Math/Vector3Dfwd.h>
31#include <fairlogger/Logger.h>
41 using R3B::Neuland::CalibratedSignal;
42 using R3B::Neuland::HitModulePar;
43 using ROOT::Math::XYZVector;
46 inline auto sqrt_value_error(
const ValueError<T>& val_err)
49 const auto value = std::sqrt(val_err.value);
50 const auto error = 1. / 2 / std::sqrt(val_err.value) * val_err.error;
56 return par.light_attenuation_factor * sqrt_value_error(first_e) * sqrt_value_error(second_e);
61 const auto plane_id =
ModuleID2PlaneID(
static_cast<int>(par.module_num - 1));
63 "Calculating position with left tdc: {}, right tdc {}, effective speed: {}, tdc_diff: {}",
67 tdc_right - tdc_left);
68 const auto pos_along_bar = -par.effective_speed * (tdc_right - tdc_left) / 2.;
72 "pos along the bar: {} cm, pos perp to bar {} cm, z: {} cm",
90 return XYZVector{ pixel_x, pixel_y, pixel_z };
95 std::string_view input_cal_2_hit_par_name,
96 std::string_view output_hit_data_name)
127 LOGP(debug1,
"Input calBar: {}", calBar);
128 if (calBar.module_num == 0)
136 const auto& module_par =
cal_to_hit_par_->GetModuleParAt(calBar.module_num);
142 std::vector<CalibratedSignal>& signals,
149 for (
const auto& cal_signal : calBar_signals)
160 "Input left calibrated signal: {} and right calibrated signal: {}",
164 hit.module_id =
static_cast<int>(par.module_num - 1);
165 hit.tdc_left = signalPair.left().time;
166 hit.tdc_right = signalPair.right().time;
168 hit.qdc_left = signalPair.left().energy;
169 hit.qdc_right = signalPair.right().energy;
170 hit.energy = get_hit_energy(hit.qdc_left, hit.qdc_right, par);
171 hit.position = get_hit_position(hit.tdc_left, hit.tdc_right, par);
172 hit.pixel = get_hit_pixel(hit.position);
173 LOGP(debug,
"Adding a new NeulandHit: {}\n", hit);
178 const std::vector<CalibratedSignal>& right_signals,
180 std::vector<Hit>& hits)
183 if (left_signals.size() == 1 and right_signals.size() == 1)
185 const auto& left_signal = left_signals.front();
186 const auto& right_signal = right_signals.front();
189 LOGP(debug,
"Adding a new hit with: {}", new_hit);
190 hits.push_back(new_hit);
198 const auto first_input =
200 const auto second_input =
204 .c_medium = par.effective_speed.value };
206 const auto match_result = std::log10(match_goodness);
219 const auto is_beam_on = not std::isnan(t_start);
227 auto larger_t = (first_t > second_t) ? first_t : second_t;
228 auto smaller_t = (first_t < second_t) ? first_t : second_t;
238 const auto t_start = [
this]() ->
double
241 if (std::isnan(los_time))
255 const auto tot_no_offset = calSignal.time_over_threshold - par.pedestal.get(side);
257 const auto denominator = par.energy_gain.get(side) - par.pmt_saturation.get(side) * tot_no_offset;
259 if (denominator.value == 0.)
265 return (tot_no_offset.value < 1) ?
ValueErrorD{} : tot_no_offset / denominator;
272 const auto time_offset =
273 (side ==
R3B::Side::left) ? (par.t_sync - par.t_diff / 2) : (par.t_sync + par.t_diff / 2);
274 return calSignal.leading_time - calSignal.trigger_time - time_offset;
static auto get_calibrated_energy(const CalDataSignal &calSignal, const HitModulePar &par, R3B::Side side) -> ValueErrorD
void SetExtraPar(FairRuntimeDb *rtdb) override
void construct_hits(const std::vector< CalibratedSignal > &left_signals, const std::vector< CalibratedSignal > &right_signals, const HitModulePar &par, std::vector< Hit > &hits)
void ExtraInit(FairRootManager *rootMan) override
double global_time_offset_
InputParView< Cal2HitPar > cal_to_hit_par_
auto construct_hit(const LRPair< CalibratedSignal > &signalPair, const HitModulePar &par) const -> Hit
Cal2HitTask(std::string_view input_cal_data_name="NeulandCalData", std::string_view input_cal_2_hit_par_name="NeulandHitPar", std::string_view output_hit_data_name="NeulandHits")
static auto get_calibrated_time(const CalDataSignal &calSignal, const HitModulePar &par, R3B::Side side) -> ValueErrorD
auto get_hit_time(ValueErrorD first_t, ValueErrorD second_t) const -> ValueErrorD
auto CheckConditions(TH1L *hist_condition) const -> bool override
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)
auto signal_match_checking(const CalibratedSignal &first_signal, const CalibratedSignal &second_signal, const HitModulePar &par) -> bool
void HistogramInit(DataMonitor &histograms) override
InputVectorConnector< BarCalData > cal_data_
void EndOfTask() override
std::vector< CalibratedSignal > temp_right_signals_
OutputVectorConnector< Hit > hit_data_
auto IsHistDisabled() const -> bool
auto GetHistMonitor() -> DataMonitor &
auto GetEventHeader() const -> auto *
auto GetTrigger() const -> CalTrigger
Simulation of NeuLAND Bar/Paddle.
constexpr auto BarsPerPlane
constexpr auto ModuleID2PlaneID(int moduleID) -> int
constexpr auto GetBarVerticalDisplacement(int module_num) -> double
constexpr auto BarSize_XY
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< ValueErrorD >, ROOT::Math::DefaultCoordinateSystemTag > XYZVectorValueErrorD
constexpr auto IsPlaneIDHorizontal(int plane_id) -> bool
ValueError< double > ValueErrorD
constexpr auto MaxCalTime
ValueError< double > ValueErrorD
std::vector< CalDataSignal > left
std::vector< CalDataSignal > right
static auto GetGoodnessOfMatch(const Input &firstSignal, const Input &secondSignal, const Par &par) -> float