1 #ifndef FastTimingSimProducers_FastTimingCommon_MTDDigitizer_h
2 #define FastTimingSimProducers_FastTimingCommon_MTDDigitizer_h
30 #include <unordered_map>
31 #include <unordered_set>
37 namespace MTDHelpers {
42 unsigned int detId_a(std::get<1>(
a)), detId_b(std::get<1>(
b));
44 if (detId_a < detId_b)
46 if (detId_a > detId_b)
49 double time_a(std::get<2>(
a)), time_b(std::get<2>(
b));
59 const float minCharge,
60 const float maxCharge) {
63 "PMTDSimAccumulator bit pattern needs to be updated");
65 "PMTDSimAccumulator bit pattern needs to be updated");
67 const float minPackChargeLog = minCharge > 0.f ?
std::log(minCharge) : -2;
68 const float maxPackChargeLog =
std::log(maxCharge);
71 simResult.
reserve(simData.size());
73 for (
const auto& elem : simData) {
75 for (
size_t iEn = 0; iEn < nEnergies; ++iEn) {
76 const auto&
samples = elem.second.hit_info[iEn];
77 for (
size_t iSample = 0; iSample <
nSamples; ++iSample) {
78 if (
samples[iSample] > minCharge) {
79 unsigned short packed;
80 if (iEn == 1 || iEn == 3) {
86 simResult.
emplace_back(elem.first.detid_, elem.first.row_, elem.first.column_, iEn, iSample, packed);
95 const float minCharge,
96 const float maxCharge) {
97 const float minPackChargeLog = minCharge > 0.f ?
std::log(minCharge) : -2;
98 const float maxPackChargeLog =
std::log(maxCharge);
101 for (
const auto& detIdIndexHitInfo : simAccumulator) {
102 auto foo = simData.emplace(
103 MTDCellId(detIdIndexHitInfo.detId(), detIdIndexHitInfo.row(), detIdIndexHitInfo.column()),
MTDCellInfo());
104 auto simIt = foo.first;
105 auto& hit_info = simIt->second.hit_info;
107 size_t iEn = detIdIndexHitInfo.energyIndex();
108 size_t iSample = detIdIndexHitInfo.sampleIndex();
112 <<
"Index out of range: iEn = " << iEn <<
" iSample = " << iSample << std::endl;
115 if (iEn == 1 || iEn == 3) {
121 if (iEn == 0 || iEn == 2) {
122 hit_info[iEn][iSample] +=
value;
123 }
else if (hit_info[iEn][iSample] == 0 ||
value < hit_info[iEn][iSample]) {
125 hit_info[iEn][iSample] =
value;
130 template <
class Traits>
153 CLHEP::HepRandomEngine* hre)
override;
183 template <
class Traits>
186 e.getByLabel(inputSimHits_,
simHits);
190 template <
class Traits>
193 CLHEP::HepRandomEngine* hre) {
195 e.getByLabel(inputSimHits_,
simHits);
196 accumulate(
simHits,
e.bunchCrossing(), hre);
199 template <
class Traits>
202 CLHEP::HepRandomEngine* hre) {
203 using namespace MTDHelpers;
206 int nchits = (
int)
hits->size();
207 std::vector<MTDCaloHitTuple_t> hitRefs;
208 hitRefs.reserve(nchits);
209 for (
int i = 0;
i < nchits; ++
i) {
210 const auto& the_hit =
hits->at(
i);
212 DetId id = the_hit.detUnitId();
214 if (verbosity_ > 0) {
215 edm::LogInfo(
"MTDDigitizer") <<
" i/p " << std::hex << the_hit.detUnitId() <<
std::dec <<
" o/p " <<
id.rawId()
219 if (0 !=
id.rawId()) {
220 hitRefs.emplace_back(
i,
id.rawId(), the_hit.tof());
225 deviceSim_.getHitsResponse(hitRefs,
hits, &simHitAccumulator_, hre);
230 template <
class Traits>
232 loadSimHitAccumulator(simHitAccumulator_, simAccumulator, premixStage1MinCharge_, premixStage1MaxCharge_);
235 template <
class Traits>
237 deviceSim_.getEvent(
e);
238 if (not premixStage1_) {
239 electronicsSim_.getEvent(
e);
243 template <
class Traits>
246 auto simResult = std::make_unique<PMTDSimAccumulator>();
247 saveSimHitAccumulator(*simResult, simHitAccumulator_, premixStage1MinCharge_, premixStage1MaxCharge_);
256 resetSimHitDataAccumulator();
259 template <
class Traits>
263 geom_ =
geom.product();
265 deviceSim_.getEventSetup(es);
266 if (not premixStage1_) {
267 electronicsSim_.getEventSetup(es);