125 const auto& the_conditions{
128 std::vector<ldmx::HcalHit> hcal_rec_hits;
134 unsigned int i_soi = hcal_digis.getSampleOfInterestIndex();
138 while (i_digi < num_digi_hits) {
139 auto digi_posend = hcal_digis.getDigi(i_digi);
142 bool is_adc_mode =
false;
149 auto position = hcal_geometry.getStripCenterPosition(
id);
150 double half_total_width =
151 hcal_geometry.getHalfTotalWidth(
id.section(),
id.layer());
152 double ecal_dx = hcal_geometry.getEcalDx();
153 double ecal_dy = hcal_geometry.getEcalDy();
159 float distance_posend, distance_negend, distance_ecal;
160 const bool explicit_layout{hcal_geometry.hasExplicitLayout()};
161 if (explicit_layout) {
162 distance_posend = hcal_geometry.getScintillatorLength(
id) / 2;
163 distance_negend = distance_posend;
164 }
else if (
id.section() == ldmx::HcalID::HcalSection::BACK) {
165 distance_posend = half_total_width;
166 distance_negend = half_total_width;
168 if ((
id.section() == ldmx::HcalID::HcalSection::TOP) ||
169 (
id.section() == ldmx::HcalID::HcalSection::BOTTOM)) {
170 distance_ecal = ecal_dx;
172 distance_ecal = ecal_dy;
174 distance_posend = 2 * half_total_width - distance_ecal / 2.;
175 distance_negend = distance_ecal / 2.;
180 double voltage_min(0.);
184 double ampl_t_posend(0.), ampl_tm1_posend(0.);
185 double ampl_t_negend(0.), ampl_tm1_negend(0.);
188 const auto orientation{hcal_geometry.getScintillatorOrientation(
id)};
189 int orientation_int =
static_cast<int>(orientation);
192 if (hcal_geometry.isDoubleEnded(
id.section())) {
193 auto digi_negend = hcal_digis.getDigi(i_digi + 1);
196 double voltage_posend, voltage_negend;
198 if (digi_posend.isTOT()) {
201 (digi_posend.tot() - the_conditions.totCalib(id_posend, 0)) *
202 the_conditions.totCalib(id_posend, 1);
204 (digi_negend.tot() - the_conditions.totCalib(id_negend, 0)) *
205 the_conditions.totCalib(id_negend, 1);
210 digi_posend.soi().adcT() - the_conditions.adcPedestal(id_posend);
212 digi_posend.soi().adcTm1() - the_conditions.adcPedestal(id_posend);
214 digi_negend.soi().adcT() - the_conditions.adcPedestal(id_negend);
216 digi_negend.soi().adcTm1() - the_conditions.adcPedestal(id_negend);
229 voltage_posend = ampl_t_posend * the_conditions.adcGain(id_posend, 0);
230 voltage_negend = ampl_t_negend * the_conditions.adcGain(id_negend, 0);
235 getTOA(digi_posend, the_conditions.adcPedestal(id_posend), i_soi);
237 getTOA(digi_negend, the_conditions.adcPedestal(id_negend), i_soi);
240 int position_bar_sign = (toa_posend - toa_negend) > 0 ? 1 : -1;
254 double v = 299.792 / 1.6;
255 double position_bar =
256 position_bar_sign * fabs(toa_posend - toa_negend) * v / 2;
258 if (explicit_layout) {
259 const double half_length{distance_posend};
260 position_bar = std::clamp(position_bar, -half_length, half_length);
269 exp(-1. * ((distance_posend - position_bar) / 1000.) /
attlength_);
271 exp(-1. * ((distance_negend + position_bar) / 1000.) /
attlength_);
274 voltage = (voltage_posend + voltage_negend);
275 voltage_min = std::min(voltage_posend, voltage_negend);
278 ampl_t = (ampl_t_posend / att_posend + ampl_t_negend / att_negend) / 2;
282 ldmx::HcalGeometry::ScintillatorOrientation::horizontal) {
283 position.SetX(explicit_layout ? position.X() + position_bar
286 position.SetY(explicit_layout ? position.Y() + position_bar
293 hit_time = fabs(toa_posend + toa_negend) / 2;
300 if (digi_posend.isTOT()) {
310 voltage_i = (digi_posend.tot() - the_conditions.totCalib(id_posend)) *
311 the_conditions.totCalib(id_posend);
319 digi_posend.soi().adcT() - the_conditions.adcPedestal(id_posend);
321 digi_posend.soi().adcTm1() - the_conditions.adcPedestal(id_posend);
322 voltage_i = ampl_t_posend * the_conditions.adcGain(id_posend);
327 double distance_end =
328 id_posend.
isNegativeEnd() ? distance_negend : distance_posend;
331 ((distance_end - (explicit_layout ? 0. : fabs(half_total_width))) /
337 voltage_min = voltage_i;
340 ampl_t = ampl_t_posend / att;
344 getTOA(digi_posend, the_conditions.adcPedestal(id_posend), i_soi);
356 double energy_deposited = num_mips_equivalent *
mip_energy_;
376 double reconstructed_energy = energy_deposited;
383 rec_hit.
setID(
id.raw());
392 rec_hit.
setIsADC(is_adc_mode ? 1 : 0);
397 hcal_rec_hits.push_back(rec_hit);
406 std::set<int> real_hits;
407 for (
auto const& sim_hit : hcal_sim_hits) real_hits.insert(sim_hit.getID());
408 for (
auto& hit : hcal_rec_hits)
409 hit.setNoise(real_hits.find(hit.getID()) == real_hits.end());