100 std::map<unsigned int, std::vector<const ldmx::SimCalorimeterHit*>>
107 for (
auto const& sim_hit : hcal_sim_hits) {
109 unsigned int hit_id = sim_hit.getID();
111 auto idh = hits_by_id.find(hit_id);
112 if (idh == hits_by_id.end()) {
114 std::vector<const ldmx::SimCalorimeterHit*>(1, &sim_hit);
116 idh->second.push_back(&sim_hit);
120 ldmx::HgcrocPulseTruthCollection hcal_pulse_truth_coll;
122 hgcroc_->pulse_truth_coll_ = &hcal_pulse_truth_coll;
123 hgcroc_->save_pulse_truth_info_ =
true;
129 for (
auto const& sim_bar : hits_by_id) {
131 int section = det_id.section();
132 int layer = det_id.
layer();
133 int strip = det_id.
strip();
136 double half_total_width = hcal_geometry.getHalfTotalWidth(section, layer);
137 double ecal_dx = hcal_geometry.getEcalDx();
138 double ecal_dy = hcal_geometry.getEcalDy();
141 std::vector<std::pair<double, double>> pulses_posend;
142 std::vector<std::pair<double, double>> pulses_negend;
144 for (
auto psim_hit : sim_bar.second) {
147 std::vector<float> position = sim_hit.
getPosition();
177 float distance_along_bar, distance_ecal;
178 float distance_close, distance_far;
180 const auto orientation{hcal_geometry.getScintillatorOrientation(det_id)};
181 if (section == ldmx::HcalID::HcalSection::BACK) {
184 ldmx::HcalGeometry::ScintillatorOrientation::horizontal)
187 end_close = (distance_along_bar > 0) ? 0 : 1;
188 distance_close = half_total_width;
189 distance_far = half_total_width;
191 if ((section == ldmx::HcalID::HcalSection::TOP) ||
192 ((section == ldmx::HcalID::HcalSection::BOTTOM))) {
193 distance_along_bar = position[0];
194 distance_ecal = ecal_dx;
195 }
else if ((section == ldmx::HcalID::HcalSection::LEFT) ||
196 (section == ldmx::HcalID::HcalSection::RIGHT)) {
197 distance_along_bar = position[1];
198 distance_ecal = ecal_dy;
200 distance_along_bar = -9999.;
203 "We should never end up here "
204 "All cases of HCAL considered, end_close is meaningless");
206 end_close = (distance_along_bar > half_total_width) ? 0 : 1;
207 distance_close = (end_close == 0)
208 ? 2 * half_total_width - distance_ecal / 2
210 distance_far = (end_close == 0)
212 : 2 * half_total_width - distance_ecal / 2;
218 float v = 299.792 / 1.6;
220 exp(-1. * ((distance_close - fabs(distance_along_bar)) / 1000.) /
223 exp(-1. * ((distance_far + fabs(distance_along_bar)) / 1000.) /
226 fabs((distance_close - fabs(distance_along_bar)) / v);
227 double shift_far = fabs((distance_far + fabs(distance_along_bar)) / v);
236 time -= position.at(2) / 299.702547;
238 if (end_close == 0) {
239 pulses_posend.emplace_back(voltage * att_close, time + shift_close);
240 pulses_negend.emplace_back(voltage * att_far, time + shift_far);
242 pulses_posend.emplace_back(voltage * att_far, time + shift_far);
243 pulses_negend.emplace_back(voltage * att_close, time + shift_close);
257 if (section == ldmx::HcalID::HcalSection::BACK) {
258 std::vector<ldmx::HgcrocDigiCollection::Sample> digi_to_add_posend,
263 bool pos_end_activity =
264 hgcroc_->digitize(posend_id.
raw(), pulses_posend, digi_to_add_posend);
265 bool neg_end_activity =
266 hgcroc_->digitize(negend_id.
raw(), pulses_negend, digi_to_add_negend);
269 hcal_digis.
addDigi(posend_id.
raw(), digi_to_add_posend);
270 hcal_digis.
addDigi(negend_id.
raw(), digi_to_add_negend);
275 if (pos_end_activity) {
276 hcal_digis.
addDigi(posend_id.
raw(), digi_to_add_posend);
278 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
282 if (neg_end_activity) {
283 hcal_digis.
addDigi(negend_id.
raw(), digi_to_add_negend);
285 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
292 bool is_posend =
false;
293 std::vector<ldmx::HgcrocDigiCollection::Sample> digi_to_add;
294 if ((section == ldmx::HcalID::HcalSection::TOP) ||
295 (section == ldmx::HcalID::HcalSection::LEFT)) {
297 }
else if ((section == ldmx::HcalID::HcalSection::BOTTOM) ||
298 (section == ldmx::HcalID::HcalSection::RIGHT)) {
303 if (
hgcroc_->digitize(digi_id.
raw(), pulses_posend, digi_to_add)) {
304 hcal_digis.
addDigi(digi_id.
raw(), digi_to_add);
306 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
312 if (
hgcroc_->digitize(digi_id.
raw(), pulses_negend, digi_to_add)) {
313 hcal_digis.
addDigi(digi_id.
raw(), digi_to_add);
315 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
327 std::vector<ldmx::HcalDigiID> channel_map;
328 int num_channels = 0;
329 for (
int section = 0; section < hcal_geometry.getNumSections(); section++) {
330 for (
int layer = 1; layer <= hcal_geometry.getNumLayers(section);
333 for (
int strip = 0; strip < hcal_geometry.getNumStrips(section, layer);
335 if (section == ldmx::HcalID::HcalSection::BACK) {
338 channel_map.push_back(digi_i_dend0);
339 channel_map.push_back(digi_i_dend1);
343 channel_map.push_back(digi_id);
351 std::uniform_int_distribution<int> section_dist(
352 0, hcal_geometry.getNumSections() - 1);
353 std::uniform_int_distribution<int> end_dist(0, 1);
354 std::uniform_int_distribution<int> clock_dist(0,
clock_cycle_);
358 int num_empty_channels = num_channels - hcal_digis.
getNumDigis();
361 auto noise_hit_amplitudes{
363 std::vector<std::pair<double, double>> fake_pulse(1, {0., 0.});
365 for (
double noise_hit : noise_hit_amplitudes) {
368 unsigned int noise_id;
369 int section_id, layer_id, strip_id, end_id;
372 section_id = section_dist(
rng_);
375 std::uniform_int_distribution<int> layer_dist(
376 0, hcal_geometry.getNumLayers(section_id) - 1);
377 layer_id = layer_dist(
rng_);
380 if (layer_id == 0) layer_id = 1;
383 std::uniform_int_distribution<int> strips_dist(
384 0, hcal_geometry.getNumStrips(section_id, layer_id) - 1);
385 strip_id = strips_dist(
rng_);
388 if ((section_id == ldmx::HcalID::HcalSection::TOP) ||
389 (section_id == ldmx::HcalID::HcalSection::LEFT)) {
391 }
else if ((section_id == ldmx::HcalID::HcalSection::BOTTOM) ||
392 (section_id == ldmx::HcalID::HcalSection::RIGHT)) {
395 end_id = end_dist(
rng_);
399 noise_id = det_id.raw();
400 }
while (hits_by_id.find(noise_id) != hits_by_id.end());
401 hits_by_id[noise_id] =
402 std::vector<const ldmx::SimCalorimeterHit*>();
405 fake_pulse[0].second = clock_dist(
rng_);
409 double gain =
hgcroc_->gain(noise_id);
410 fake_pulse[0].first = noise_hit +
411 gain *
hgcroc_->readoutThreshold(noise_id) -
412 gain *
hgcroc_->pedestal(noise_id);
414 if (section_id == ldmx::HcalID::HcalSection::BACK) {
415 std::vector<ldmx::HgcrocDigiCollection::Sample> digi_to_add_posend,
419 if (
hgcroc_->digitize(posend_id.
raw(), fake_pulse,
420 digi_to_add_posend) &&
421 hgcroc_->digitize(negend_id.
raw(), fake_pulse,
422 digi_to_add_negend)) {
423 hcal_digis.
addDigi(posend_id.
raw(), digi_to_add_posend);
424 hcal_digis.
addDigi(negend_id.
raw(), digi_to_add_negend);
427 std::vector<ldmx::HgcrocDigiCollection::Sample> digi_to_add;
428 if (
hgcroc_->digitize(noise_id, fake_pulse, digi_to_add)) {
429 hcal_digis.
addDigi(noise_id, digi_to_add);
435 for (
auto digi_id : channel_map) {
438 ldmx::HcalID detid(digi_id.section(), digi_id.layer(), digi_id.strip());
439 unsigned int rawdet_id = detid.
raw();
440 if (hits_by_id.find(rawdet_id) == hits_by_id.end()) {
441 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
442 hgcroc_->noiseDigi(digi_id.raw(), 0.0);
443 hcal_digis.
addDigi(digi_id.raw(), digi);