31 std::string_view points_name,
32 std::string_view hits_name,
33 std::string_view cal_hits_name)
34 : FairTask(
"R3BNeulandDigitizer")
35 , neuland_points_{ points_name }
36 , neuland_hits_{ hits_name }
37 , neuland_cal_hits_{ cal_hits_name }
38 , digitizing_engine_(std::move(engine))
82 neuland_points_.init();
84 neuland_cal_hits_.init();
86 auto const PaddleMulSize = 3000;
87 hist_multi_one_ = data_monitor_.add_hist<TH1I>(
88 "MultiplicityOne",
"Paddle multiplicity: only one PMT per paddle", PaddleMulSize, 0, PaddleMulSize);
90 hist_multi_two_ = data_monitor_.add_hist<TH1I>(
91 "MultiplicityTwo",
"Paddle multiplicity: both PMTs of a paddle", PaddleMulSize, 0, PaddleMulSize);
92 auto const timeBinSize = 200;
93 hist_rl_time_to_trig_ =
94 data_monitor_.add_hist<TH1F>(
"hRLTimeToTrig",
"R/Ltime-triggerTime", timeBinSize, -100., 100.);
101 neuland_hits_.
clear();
102 const auto GeVToMeVFac = 1000.;
104 std::map<UInt_t, Double_t> paddleEnergyDeposit;
106 for (
const auto& point : neuland_points_)
109 (neuland_point_filter_.GetMinimumAllowedEnergy() != 0)) and
110 neuland_point_filter_.CheckFiltered(point))
114 if (point.GetEnergyLoss() > 0.)
116 const Int_t paddleID = point.GetPaddle();
119 const TVector3 position = point.GetPosition();
120 const TVector3 converted_position = neuland_geo_par_->ConvertToLocalCoordinates(position, paddleID);
121 LOG(debug2) <<
"NeulandDigitizer: Point in paddle " << paddleID
122 <<
" with global position XYZ: " << position.X() <<
" " << position.Y() <<
" " << position.Z();
123 LOG(debug2) <<
"NeulandDigitizer: Converted to local position XYZ: " << converted_position.X() <<
" "
124 << converted_position.Y() <<
" " << converted_position.Z();
128 const Double_t dist = converted_position.X();
129 digitizing_engine_->DepositLight(paddleID, point.GetTime(), point.GetLightYield() * GeVToMeVFac, dist);
130 paddleEnergyDeposit[paddleID] += point.GetEnergyLoss() * GeVToMeVFac;
134 const Double_t triggerTime = digitizing_engine_->GetTriggerTime();
135 const auto paddles = digitizing_engine_->ExtractPaddles();
138 hist_multi_one_->Fill(
static_cast<int>(std::count_if(
139 paddles.begin(), paddles.end(), [](
const auto& keyValue) { return keyValue.second->HasHalfFired(); })));
141 hist_multi_two_->Fill(
static_cast<int>(std::count_if(
142 paddles.begin(), paddles.end(), [](
const auto& keyValue) { return keyValue.second->HasFired(); })));
144 hist_rl_time_to_trig_->Fill(triggerTime);
147 neuland_hits_.clear();
148 auto& hits = neuland_hits_.get();
149 for (
const auto& [paddleID, paddle] : paddles)
151 if (!paddle->HasFired())
156 auto signals = paddle->GetSignals();
158 for (
const auto& signal : signals)
160 const TVector3 hitPositionLocal = TVector3(signal.position, 0., 0.);
161 const TVector3 hitPositionGlobal = neuland_geo_par_->ConvertToGlobalCoordinates(hitPositionLocal, paddleID);
162 const TVector3 hitPixel = neuland_geo_par_->ConvertGlobalToPixel(hitPositionGlobal);
165 signal.leftChannel->tdc,
166 signal.rightChannel->tdc,
168 signal.leftChannel->qdcUnSat,
169 signal.rightChannel->qdcUnSat,
174 if (hit_filters_.IsValid(hit))
176 neuland_hits_.get().emplace_back(std::move(hit));
177 LOG(debug) <<
"Adding neuland hit with id = " << paddleID <<
", time = " << signal.time
178 <<
", energy = " << signal.energy;
179 LOG(debug) <<
"Adding neuland hit with id = " << paddleID
180 <<
", tot_l = " << (signal.leftChannel->qdcUnSat * 15) + 14
181 <<
", tot_r = " << (signal.rightChannel->qdcUnSat * 15) + 14;
188 fill_cal_data(paddles);
190 LOG(debug) <<
"R3BNeulandDigitizer: produced " << hits.size() <<
" hits";