23#include <FairRootManager.h>
30#include <fairlogger/Logger.h>
32#include <fmt/format.h>
34#include <range/v3/view/map.hpp>
41 auto GetWalkCorrection(
double value) ->
double
43 value = value * 17.2278 / 162.464;
44 const auto veronika3 = -4.29359 + 17.3841 / sqrt(value) + 0.073181;
45 const auto veronika2 = 1.59667 + 78.5274 * pow(value, -1.97051) - 4.00192 / value - 0.125473 * value +
46 0.00130958 * value * value;
47 const auto result = (value > 25.0000) ? veronika3 : (veronika3 + veronika2) / 2.;
58 std::string_view trig_map_data_name,
59 std::string_view par_name,
60 std::string_view trig_par_name,
61 std::string_view cal_data_name)
80 constexpr auto BINSIZE_TOT = 1000;
81 constexpr auto BINSIZE_LT = 1000;
82 constexpr auto BINSIZE_TIME = 8000;
83 constexpr auto HIST_MAX_TIME = 6000.;
84 constexpr auto HIST_MIN_TIME = -5000.;
85 constexpr auto HIST_MAX_TOT = 600.;
86 constexpr auto HIST_MAX_LT = 2000.;
88 histograms.
add_hist<TH1D>(
"module_num",
"Counts with module ids", total_bar_num, -0.5, total_bar_num + 0.5);
89 histograms.
add_hist<TH1D>(
"ToT",
"Time over threshold", BINSIZE_TOT * 2, 0., BINSIZE_TOT + 0.);
90 histograms.
add_hist<TH1D>(
"LeadingTime",
"Leading time", BINSIZE_LT, 0., HIST_MAX_LT);
91 histograms.
add_hist<TH1D>(
"TriggerTime",
"Trigger time", BINSIZE_LT, 0., HIST_MAX_LT);
92 histograms.
add_hist<TH1D>(
"Leading_minus_trigger",
"Time", BINSIZE_TIME, HIST_MIN_TIME, HIST_MAX_TIME);
94 "Bar_hitNum_l",
"Number of hits on the left PMT per bar", total_bar_num, 0.5, 0.5 + total_bar_num);
96 "Bar_hitNum_r",
"Number of hits on the right PMT per bar", total_bar_num, 0.5, 0.5 + total_bar_num);
98 histograms.
add_hist<TH2D>(
"TimeLVsBar",
106 histograms.
add_hist<TH2D>(
"TimeRVsBar",
116 "ToTLVsBar",
"ToT_vs_bar_left", total_bar_num, 0.5, 0.5 + total_bar_num, BINSIZE_TOT, 0., HIST_MAX_TOT);
118 "ToTRVsBar",
"ToT_vs_bar_right", total_bar_num, 0.5, 0.5 + total_bar_num, BINSIZE_TOT, 0., HIST_MAX_TOT);
134 LOGP(warn,
"plane number obtained from the calibration parameters is 0!");
152 LOGP(warn,
"Coarse time frequency obtained from parameteers is 0! Use default value.");
159 LOGP(info,
"Coarse time frequency set to be {} MHz", ct_freq);
168 "Minimal signal size: {}. Current signal size: {}. Number of PMTs: {}",
175 "condition of the minimal size is not met with current paddle signal size. Skip the "
189 const auto& modulePar = calPar->GetParamAt(module_num);
190 const auto fineTime = modulePar.GetFineTime(ftType, signal.fine);
194 return { coarseTime - fineTime.value, fineTime.error };
200 const auto& triggerMap =
GetBasePar()->get_trig_id_map();
201 auto triggerIDPair = triggerMap.find(module_num);
202 if (triggerIDPair == triggerMap.end())
205 LOGP(error,
"Can't find the trigger ID for the module ID {} in the event {}", module_num, eventNum);
208 const auto triggerID = (side ==
Side::left) ? triggerIDPair->second.first : triggerIDPair->second.second;
211 [&triggerID](
const auto& ele) { return ele.first == triggerID; });
216 "No such trigger ID {} in mappedTrigData for moduleNum {} in the event {}!",
220 LOGP(error,
"Available trigIDs: {}", fmt::join(
trig_map_data_ | ranges::views::keys,
", "));
235 const auto time_over_thres = trailingT - leadingT;
236 LOGP(debug3,
"leading :{} trailing: {}", leadingT.value, trailingT.value);
237 return (time_over_thres.value > 0) ? time_over_thres : time_over_thres +
max_coarse_time_;
255 calDataSignal.time_over_threshold =
get_tot(double_edge_signal, module_num, side);
256 const auto walk_correction =
257 (
is_walk_enabled_) ? GetWalkCorrection(calDataSignal.time_over_threshold.value) : 0.;
258 calDataSignal.leading_time =
263 LOGP(debug,
"Adding a new cal signal: {}", calDataSignal);
264 return calDataSignal;
269 R3B::Side side)
const -> std::vector<CalDataSignal>
271 const auto& signals = (side ==
Side::left) ? map_bar_signals.left : map_bar_signals.right;
272 auto calSignals = std::vector<CalDataSignal>{};
273 calSignals.reserve(signals.size());
274 std::transform(signals.begin(),
276 std::back_inserter(calSignals),
277 [module_num, side,
this](
const auto& dESignal)
278 { return doubleEdgeSignal_to_calSignal(dESignal, side, module_num); });
296 LOGP(debug2,
"mapped Data size: {}",
map_data_.size());
302 for (
const auto& [plane_num, plane_signals] :
map_data_)
304 for (
const auto& [bar_num, bar_signals] : plane_signals.bars)
311 auto& cal =
cal_data_.get().emplace_back(module_num);
323 for (
const auto& signal : calSignals)
325 const auto lTime = signal.leading_time.value;
326 const auto time_over_thres = signal.time_over_threshold.value;
327 const auto triggerTime = signal.trigger_time.value;
328 histograms.get(
"ToT")->Fill(time_over_thres);
329 histograms.get(
"LeadingTime")->Fill(lTime);
330 histograms.get(
"TriggerTime")->Fill(triggerTime);
331 histograms.get(
"Leading_minus_trigger")->Fill(lTime - triggerTime);
334 histograms.get(
"TimeLVsBar")->Fill(module_num, lTime - triggerTime);
335 histograms.get(
"ToTLVsBar")->Fill(module_num, time_over_thres);
336 histograms.get(
"Bar_hitNum_l")->Fill(module_num);
340 histograms.get(
"TimeRVsBar")->Fill(module_num, lTime - triggerTime);
341 histograms.get(
"ToTRVsBar")->Fill(module_num, time_over_thres);
342 histograms.get(
"Bar_hitNum_r")->Fill(module_num);
R3B::Map2CalPar R3BTCalPar2
auto add_hist(std::unique_ptr< TH1 > hist) -> TH1 *
auto IsHistDisabled() const -> bool
auto GetHistMonitor() -> DataMonitor &
auto GetEventHeader() const -> auto *
auto GetBasePar() const -> auto *
void HistogramInit(DataMonitor &histograms) override
Map2CalTask(std::string_view map_data_name="NeulandMapData", std::string_view trig_map_data_name="NeulandTrigMapData", std::string_view par_name="LandTCalPar", std::string_view trig_par_name="LandTrigTCalPar", std::string_view cal_data_name="NeulandCalData")
float coarse_time_frequency_
auto mapBarSignal_to_calSignals(const MapBarSignal &map_bar_signals, int module_num, R3B::Side side) const -> std::vector< CalDataSignal >
OutputVectorConnector< BarCalData > cal_data_
auto CheckConditions() const -> bool override
auto convert_to_real_time(R3BTCalPar2 *calPar, SingleEdgeSignal signal, FTType ftType, int module_num) const -> ValueError< double >
InputMapConnector< int, PaddleTamexMappedData > map_data_
auto get_trigger_time(int module_num, Side side) const -> ValueError< double >
void FinishEvent() override
unsigned int total_pmt_nums_
unsigned int coarse_time_max_num_
InputMapConnector< int, PaddleTamexTrigMappedData > trig_map_data_
void overflow_correct(R3B::Neuland::CalDataSignal &calSignal) const
auto doubleEdgeSignal_to_calSignal(const DoubleEdgeSignal &double_edge_signal, R3B::Side side, int module_num) const -> CalDataSignal
void ExtraInit(FairRootManager *rootMan) override
void fill_cal_data(BarCalData &cal, const MapBarSignal &signals)
void TriggeredExec() override
void SetExtraPar(FairRuntimeDb *rtdb) override
InputParView< Map2CalPar > calibration_par_
auto get_tot(const DoubleEdgeSignal &pmtSignal, int module_num, R3B::Side module_side) const -> ValueError< double >
void histogram_monitor(const BarCalData &cal, Side side)
unsigned int signal_min_size_
InputParView< Map2CalPar > calibration_trig_par_
Simulation of NeuLAND Bar/Paddle.
constexpr auto COARSE_TIME_CLOCK_FREQUENCY_MHZ
constexpr auto BarsPerPlane
constexpr auto Neuland_PlaneBar2ModuleNum(int planeNum, int barNum) -> int
std::vector< CalDataSignal > left
std::vector< CalDataSignal > right
ValueError< double > trigger_time
ValueError< double > leading_time