96 std::map<unsigned int, std::vector<const ldmx::SimCalorimeterHit*>> hitsByID;
102 for (
auto const& simHit : hcalSimHits) {
104 unsigned int hitID = simHit.getID();
106 auto idh = hitsByID.find(hitID);
107 if (idh == hitsByID.end()) {
108 hitsByID[hitID] = std::vector<const ldmx::SimCalorimeterHit*>(1, &simHit);
110 idh->second.push_back(&simHit);
117 for (
auto const& simBar : hitsByID) {
119 int section = detID.section();
120 int layer = detID.
layer();
121 int strip = detID.
strip();
124 double half_total_width = hcalGeometry.getHalfTotalWidth(section, layer);
125 double ecal_dx = hcalGeometry.getEcalDx();
126 double ecal_dy = hcalGeometry.getEcalDy();
129 std::vector<std::pair<double, double>> pulses_posend;
130 std::vector<std::pair<double, double>> pulses_negend;
132 for (
auto psimHit : simBar.second) {
135 std::vector<float> position = simHit.
getPosition();
165 float distance_along_bar, distance_ecal;
166 float distance_close, distance_far;
168 const auto orientation{hcalGeometry.getScintillatorOrientation(detID)};
169 if (section == ldmx::HcalID::HcalSection::BACK) {
172 ldmx::HcalGeometry::ScintillatorOrientation::horizontal)
175 end_close = (distance_along_bar > 0) ? 0 : 1;
176 distance_close = half_total_width;
177 distance_far = half_total_width;
179 if ((section == ldmx::HcalID::HcalSection::TOP) ||
180 ((section == ldmx::HcalID::HcalSection::BOTTOM))) {
181 distance_along_bar = position[0];
182 distance_ecal = ecal_dx;
183 }
else if ((section == ldmx::HcalID::HcalSection::LEFT) ||
184 (section == ldmx::HcalID::HcalSection::RIGHT)) {
185 distance_along_bar = position[1];
186 distance_ecal = ecal_dy;
188 distance_along_bar = -9999.;
191 "We should never end up here "
192 "All cases of HCAL considered, end_close is meaningless");
194 end_close = (distance_along_bar > half_total_width) ? 0 : 1;
195 distance_close = (end_close == 0)
196 ? 2 * half_total_width - distance_ecal / 2
198 distance_far = (end_close == 0)
200 : 2 * half_total_width - distance_ecal / 2;
206 float v = 299.792 / 1.6;
208 exp(-1. * ((distance_close - fabs(distance_along_bar)) / 1000.) /
211 exp(-1. * ((distance_far + fabs(distance_along_bar)) / 1000.) /
214 fabs((distance_close - fabs(distance_along_bar)) / v);
215 double shift_far = fabs((distance_far + fabs(distance_along_bar)) / v);
224 time -= position.at(2) / 299.702547;
226 if (end_close == 0) {
227 pulses_posend.emplace_back(voltage * att_close, time + shift_close);
228 pulses_negend.emplace_back(voltage * att_far, time + shift_far);
230 pulses_posend.emplace_back(voltage * att_far, time + shift_far);
231 pulses_negend.emplace_back(voltage * att_close, time + shift_close);
245 if (section == ldmx::HcalID::HcalSection::BACK) {
246 std::vector<ldmx::HgcrocDigiCollection::Sample> digiToAddPosend,
251 bool posEndActivity =
252 hgcroc_->digitize(posendID.
raw(), pulses_posend, digiToAddPosend);
253 bool negEndActivity =
254 hgcroc_->digitize(negendID.
raw(), pulses_negend, digiToAddNegend);
257 hcalDigis.
addDigi(posendID.
raw(), digiToAddPosend);
258 hcalDigis.
addDigi(negendID.
raw(), digiToAddNegend);
263 if (posEndActivity) {
264 hcalDigis.
addDigi(posendID.
raw(), digiToAddPosend);
266 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
270 if (negEndActivity) {
271 hcalDigis.
addDigi(negendID.
raw(), digiToAddNegend);
273 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
280 bool is_posend =
false;
281 std::vector<ldmx::HgcrocDigiCollection::Sample> digiToAdd;
282 if ((section == ldmx::HcalID::HcalSection::TOP) ||
283 (section == ldmx::HcalID::HcalSection::LEFT)) {
285 }
else if ((section == ldmx::HcalID::HcalSection::BOTTOM) ||
286 (section == ldmx::HcalID::HcalSection::RIGHT)) {
291 if (
hgcroc_->digitize(digiID.
raw(), pulses_posend, digiToAdd)) {
294 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
300 if (
hgcroc_->digitize(digiID.
raw(), pulses_negend, digiToAdd)) {
303 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
315 std::vector<ldmx::HcalDigiID> channelMap;
317 for (
int section = 0; section < hcalGeometry.getNumSections(); section++) {
318 for (
int layer = 1; layer <= hcalGeometry.getNumLayers(section);
321 for (
int strip = 0; strip < hcalGeometry.getNumStrips(section, layer);
323 if (section == ldmx::HcalID::HcalSection::BACK) {
326 channelMap.push_back(digiIDend0);
327 channelMap.push_back(digiIDend1);
331 channelMap.push_back(digiID);
339 std::uniform_int_distribution<int> section_dist(
340 0, hcalGeometry.getNumSections() - 1);
341 std::uniform_int_distribution<int> end_dist(0, 1);
342 std::uniform_int_distribution<int> clock_dist(0,
clockCycle_);
346 int numEmptyChannels = numChannels - hcalDigis.
getNumDigis();
349 auto noiseHitAmplitudes{
351 std::vector<std::pair<double, double>> fake_pulse(1, {0., 0.});
353 for (
double noiseHit : noiseHitAmplitudes) {
356 unsigned int noiseID;
357 int sectionID, layerID, stripID, endID;
360 sectionID = section_dist(
rng_);
363 std::uniform_int_distribution<int> layer_dist(
364 0, hcalGeometry.getNumLayers(sectionID) - 1);
365 layerID = layer_dist(
rng_);
368 if (layerID == 0) layerID = 1;
371 std::uniform_int_distribution<int> strips_dist(
372 0, hcalGeometry.getNumStrips(sectionID, layerID) - 1);
373 stripID = strips_dist(
rng_);
376 if ((sectionID == ldmx::HcalID::HcalSection::TOP) ||
377 (sectionID == ldmx::HcalID::HcalSection::LEFT)) {
379 }
else if ((sectionID == ldmx::HcalID::HcalSection::BOTTOM) ||
380 (sectionID == ldmx::HcalID::HcalSection::RIGHT)) {
383 endID = end_dist(
rng_);
386 noiseID = detID.raw();
387 }
while (hitsByID.find(noiseID) != hitsByID.end());
389 std::vector<const ldmx::SimCalorimeterHit*>();
392 fake_pulse[0].second = clock_dist(
rng_);
396 double gain =
hgcroc_->gain(noiseID);
397 fake_pulse[0].first = noiseHit +
398 gain *
hgcroc_->readoutThreshold(noiseID) -
399 gain *
hgcroc_->pedestal(noiseID);
401 if (sectionID == ldmx::HcalID::HcalSection::BACK) {
402 std::vector<ldmx::HgcrocDigiCollection::Sample> digiToAddPosend,
406 if (
hgcroc_->digitize(posendID.
raw(), fake_pulse, digiToAddPosend) &&
407 hgcroc_->digitize(negendID.
raw(), fake_pulse, digiToAddNegend)) {
408 hcalDigis.
addDigi(posendID.
raw(), digiToAddPosend);
409 hcalDigis.
addDigi(negendID.
raw(), digiToAddNegend);
412 std::vector<ldmx::HgcrocDigiCollection::Sample> digiToAdd;
413 if (
hgcroc_->digitize(noiseID, fake_pulse, digiToAdd)) {
414 hcalDigis.
addDigi(noiseID, digiToAdd);
420 for (
auto digiID : channelMap) {
423 ldmx::HcalID detid(digiID.section(), digiID.layer(), digiID.strip());
424 unsigned int rawdetID = detid.
raw();
425 if (hitsByID.find(rawdetID) == hitsByID.end()) {
426 std::vector<ldmx::HgcrocDigiCollection::Sample> digi =
427 hgcroc_->noiseDigi(digiID.raw(), 0.0);
428 hcalDigis.
addDigi(digiID.raw(), digi);