CMS 3D CMS Logo

MTDDigitizer.h
Go to the documentation of this file.
1 #ifndef FastTimingSimProducers_FastTimingCommon_MTDDigitizer_h
2 #define FastTimingSimProducers_FastTimingCommon_MTDDigitizer_h
3 
6 
11 
16 
24 
26 
28 
29 #include <vector>
30 #include <unordered_map>
31 #include <unordered_set>
32 #include <memory>
33 #include <tuple>
34 
35 namespace mtd_digitizer {
36 
37  namespace MTDHelpers {
38  // index , det id, time
39  typedef std::tuple<int, uint32_t, float> MTDCaloHitTuple_t;
40 
42  unsigned int detId_a(std::get<1>(a)), detId_b(std::get<1>(b));
43 
44  if (detId_a < detId_b)
45  return true;
46  if (detId_a > detId_b)
47  return false;
48 
49  double time_a(std::get<2>(a)), time_b(std::get<2>(b));
50  if (time_a < time_b)
51  return true;
52 
53  return false;
54  }
55  } // namespace MTDHelpers
56 
57  inline void saveSimHitAccumulator(PMTDSimAccumulator& simResult,
58  const MTDSimHitDataAccumulator& simData,
59  const float minCharge,
60  const float maxCharge) {
61  constexpr auto nEnergies = std::tuple_size<decltype(MTDCellInfo().hit_info)>::value;
62  static_assert(nEnergies == PMTDSimAccumulator::Data::energyMask + 1,
63  "PMTDSimAccumulator bit pattern needs to be updated");
65  "PMTDSimAccumulator bit pattern needs to be updated");
66 
67  const float minPackChargeLog = minCharge > 0.f ? std::log(minCharge) : -2;
68  const float maxPackChargeLog = std::log(maxCharge);
69  constexpr uint16_t base = PMTDSimAccumulator::Data::dataMask;
70 
71  simResult.reserve(simData.size());
72  // mimicking the digitization
73  for (const auto& elem : simData) {
74  // store only non-zero
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) {
81  // assuming linear range for tof of 0..25
82  packed = samples[iSample] / PREMIX_MAX_TOF * base;
83  } else {
84  packed = logintpack::pack16log(samples[iSample], minPackChargeLog, maxPackChargeLog, base);
85  }
86  simResult.emplace_back(elem.first.detid_, elem.first.row_, elem.first.column_, iEn, iSample, packed);
87  }
88  }
89  }
90  }
91  }
92 
94  const PMTDSimAccumulator& simAccumulator,
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);
99  constexpr uint16_t base = PMTDSimAccumulator::Data::dataMask;
100 
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;
106 
107  size_t iEn = detIdIndexHitInfo.energyIndex();
108  size_t iSample = detIdIndexHitInfo.sampleIndex();
109 
111  throw cms::Exception("MTDDigitixer::loadSimHitAccumulator")
112  << "Index out of range: iEn = " << iEn << " iSample = " << iSample << std::endl;
113 
114  float value;
115  if (iEn == 1 || iEn == 3) {
116  value = static_cast<float>(detIdIndexHitInfo.data()) / base * PREMIX_MAX_TOF;
117  } else {
118  value = logintpack::unpack16log(detIdIndexHitInfo.data(), minPackChargeLog, maxPackChargeLog, base);
119  }
120 
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]) {
124  // For iEn==1 the digitizers just set the TOF of the first SimHit
125  hit_info[iEn][iSample] = value;
126  }
127  }
128  }
129 
130  template <class Traits>
132  public:
133  typedef typename Traits::DeviceSim DeviceSim;
134  typedef typename Traits::ElectronicsSim ElectronicsSim;
136 
138  : MTDDigitizerBase(config, producesCollector, iC),
139  geom_(nullptr),
140  deviceSim_(config.getParameterSet("DeviceSimulation")),
141  electronicsSim_(config.getParameterSet("ElectronicsSimulation")),
142  maxSimHitsAccTime_(config.getParameter<uint32_t>("maxSimHitsAccTime")) {}
143 
144  ~MTDDigitizer() override {}
145 
149  void accumulate(edm::Event const& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) override;
150  void accumulate(PileUpEventPrincipal const& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) override;
152  int bxCrossing,
153  CLHEP::HepRandomEngine* hre) override;
154  // for premixing
155  void accumulate(const PMTDSimAccumulator& simAccumulator) override;
156 
160  void initializeEvent(edm::Event const& e, edm::EventSetup const& c) override;
161  void finalizeEvent(edm::Event& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) override;
162 
166  void beginRun(const edm::EventSetup& es) override;
167  void endRun() override {}
168 
169  private:
171 
173 
174  // implementations
175  DeviceSim deviceSim_; // processes a given simhit into an entry in a MTDSimHitDataAccumulator
176  ElectronicsSim electronicsSim_; // processes a MTDSimHitDataAccumulator into a BTLDigiCollection/ETLDigiCollection
177 
178  //handle sim hits
181  };
182 
183  template <class Traits>
184  void MTDDigitizer<Traits>::accumulate(edm::Event const& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) {
186  e.getByLabel(inputSimHits_, simHits);
187  accumulate(simHits, 0, hre);
188  }
189 
190  template <class Traits>
192  edm::EventSetup const& c,
193  CLHEP::HepRandomEngine* hre) {
195  e.getByLabel(inputSimHits_, simHits);
196  accumulate(simHits, e.bunchCrossing(), hre);
197  }
198 
199  template <class Traits>
201  int bxCrossing,
202  CLHEP::HepRandomEngine* hre) {
203  using namespace MTDHelpers;
204 
205  //create list of tuples (pos in container, RECO DetId, time) to be sorted first
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);
211 
212  DetId id = the_hit.detUnitId();
213 
214  if (verbosity_ > 0) {
215  edm::LogInfo("MTDDigitizer") << " i/p " << std::hex << the_hit.detUnitId() << std::dec << " o/p " << id.rawId()
216  << std::endl;
217  }
218 
219  if (0 != id.rawId()) {
220  hitRefs.emplace_back(i, id.rawId(), the_hit.tof());
221  }
222  }
223  std::sort(hitRefs.begin(), hitRefs.end(), MTDHelpers::orderByDetIdThenTime);
224 
225  deviceSim_.getHitsResponse(hitRefs, hits, &simHitAccumulator_, hre);
226 
227  hitRefs.clear();
228  }
229 
230  template <class Traits>
232  loadSimHitAccumulator(simHitAccumulator_, simAccumulator, premixStage1MinCharge_, premixStage1MaxCharge_);
233  }
234 
235  template <class Traits>
237  deviceSim_.getEvent(e);
238  if (not premixStage1_) {
239  electronicsSim_.getEvent(e);
240  }
241  }
242 
243  template <class Traits>
244  void MTDDigitizer<Traits>::finalizeEvent(edm::Event& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) {
245  if (premixStage1_) {
246  auto simResult = std::make_unique<PMTDSimAccumulator>();
247  saveSimHitAccumulator(*simResult, simHitAccumulator_, premixStage1MinCharge_, premixStage1MaxCharge_);
248  e.put(std::move(simResult), digiCollection_);
249  } else {
250  auto digiCollection = std::make_unique<DigiCollection>();
251  electronicsSim_.run(simHitAccumulator_, *digiCollection, hre);
252  e.put(std::move(digiCollection), digiCollection_);
253  }
254 
255  //release memory for next event
256  resetSimHitDataAccumulator();
257  }
258 
259  template <class Traits>
263  geom_ = geom.product();
264 
265  deviceSim_.getEventSetup(es);
266  if (not premixStage1_) {
267  electronicsSim_.getEventSetup(es);
268  }
269  }
270 } // namespace mtd_digitizer
271 
272 #endif
logintpack::pack16log
int16_t pack16log(double x, double lmin, double lmax, uint16_t base=32768)
Definition: liblogintpack.h:27
MTDDigiGeometryRecord
Definition: MTDDigiGeometryRecord.h:15
mtd_digitizer::MTDDigitizer::resetSimHitDataAccumulator
void resetSimHitDataAccumulator()
Definition: MTDDigitizer.h:170
mtd_digitizer::nSamples
constexpr size_t nSamples
Definition: MTDDigitizerTypes.h:11
mtd_digitizer::MTDDigitizer::simHitAccumulator_
MTDSimHitDataAccumulator simHitAccumulator_
Definition: MTDDigitizer.h:180
BTLDetId.h
mps_fire.i
i
Definition: mps_fire.py:428
MessageLogger.h
PixelTopology.h
hfClusterShapes_cfi.hits
hits
Definition: hfClusterShapes_cfi.py:5
ESHandle.h
mtd_digitizer::MTDCellInfo
Definition: MTDDigitizerTypes.h:17
mtd_digitizer::MTDDigitizer::electronicsSim_
ElectronicsSim electronicsSim_
Definition: MTDDigitizer.h:176
MTDDigitizerTraits.h
PMTDSimAccumulator
Definition: PMTDSimAccumulator.h:9
liblogintpack.h
MTDGeometry.h
MTDDigiGeometryRecord.h
GeomDetType.h
mtd_digitizer::MTDDigitizer::MTDDigitizer
MTDDigitizer(const edm::ParameterSet &config, edm::ProducesCollector producesCollector, edm::ConsumesCollector &iC)
Definition: MTDDigitizer.h:137
FastTrackerRecHitCombiner_cfi.simHits
simHits
Definition: FastTrackerRecHitCombiner_cfi.py:5
mtd_digitizer::MTDDigitizer::initializeEvent
void initializeEvent(edm::Event const &e, edm::EventSetup const &c) override
actions at the start/end of event
Definition: MTDDigitizer.h:236
PileUpEventPrincipal
Definition: PileUpEventPrincipal.h:19
mtd_digitizer::MTDDigitizer::DigiCollection
Traits::DigiCollection DigiCollection
Definition: MTDDigitizer.h:135
edm::LogInfo
Log< level::Info, false > LogInfo
Definition: MessageLogger.h:125
ETLDetId.h
edm::Handle< edm::PSimHitContainer >
MTDDigitizerBase
Definition: MTDDigitizerBase.h:31
mtd_digitizer::MTDDigitizer::ElectronicsSim
Traits::ElectronicsSim ElectronicsSim
Definition: MTDDigitizer.h:134
ProducesCollector.h
mtd_digitizer::MTDDigitizer::DeviceSim
Traits::DeviceSim DeviceSim
Definition: MTDDigitizer.h:133
EgammaValidation_cff.samples
samples
Definition: EgammaValidation_cff.py:19
PMTDSimAccumulator::reserve
void reserve(size_t size)
Definition: PMTDSimAccumulator.h:52
config
Definition: config.py:1
DetId
Definition: DetId.h:17
mtd_digitizer::MTDDigitizer::endRun
void endRun() override
Definition: MTDDigitizer.h:167
edm::EventSetup::get
T get() const
Definition: EventSetup.h:80
mtd_digitizer::MTDDigitizer::deviceSim_
DeviceSim deviceSim_
Definition: MTDDigitizer.h:175
edm::ESHandle
Definition: DTSurvey.h:22
RectangularMTDTopology.h
PileUpEventPrincipal.h
relativeConstraints.geom
geom
Definition: relativeConstraints.py:72
mtd_digitizer::loadSimHitAccumulator
void loadSimHitAccumulator(MTDSimHitDataAccumulator &simData, const PMTDSimAccumulator &simAccumulator, const float minCharge, const float maxCharge)
Definition: MTDDigitizer.h:93
logintpack::unpack16log
double unpack16log(int16_t i, double lmin, double lmax, uint16_t base=32768)
Definition: liblogintpack.h:62
b
double b
Definition: hdecay.h:118
mtd_digitizer::PREMIX_MAX_TOF
constexpr float PREMIX_MAX_TOF
Definition: MTDDigitizerTypes.h:24
edm::ParameterSet
Definition: ParameterSet.h:47
a
double a
Definition: hdecay.h:119
Event.h
mtd_digitizer::MTDDigitizer::geom_
const MTDGeometry * geom_
Definition: MTDDigitizer.h:172
MTDDigitizerBase.h
createfilelist.int
int
Definition: createfilelist.py:10
value
Definition: value.py:1
mtd_digitizer::MTDHelpers::MTDCaloHitTuple_t
std::tuple< int, uint32_t, float > MTDCaloHitTuple_t
Definition: MTDDigitizer.h:39
mtd_digitizer::MTDDigitizer
Definition: MTDDigitizer.h:131
mtd_digitizer::MTDCellId
Definition: MTDDigitizerTypes.h:26
apvshotsanalyzer_cfi.digiCollection
digiCollection
Definition: apvshotsanalyzer_cfi.py:4
edm::EventSetup
Definition: EventSetup.h:57
mtd_digitizer::MTDDigitizer::accumulate
void accumulate(edm::Event const &e, edm::EventSetup const &c, CLHEP::HepRandomEngine *hre) override
handle SimHit accumulation
Definition: MTDDigitizer.h:184
HltBtagPostValidation_cff.c
c
Definition: HltBtagPostValidation_cff.py:31
get
#define get
mtd_digitizer::saveSimHitAccumulator
void saveSimHitAccumulator(PMTDSimAccumulator &simResult, const MTDSimHitDataAccumulator &simData, const float minCharge, const float maxCharge)
Definition: MTDDigitizer.h:57
PMTDSimAccumulator::Data::dataMask
constexpr static unsigned dataMask
Definition: PMTDSimAccumulator.h:35
mtd_digitizer::MTDDigitizer::beginRun
void beginRun(const edm::EventSetup &es) override
actions at the start/end of run
Definition: MTDDigitizer.h:260
mtd_digitizer::MTDDigitizer::finalizeEvent
void finalizeEvent(edm::Event &e, edm::EventSetup const &c, CLHEP::HepRandomEngine *hre) override
Definition: MTDDigitizer.h:244
mtd_digitizer::MTDHelpers::orderByDetIdThenTime
bool orderByDetIdThenTime(const MTDCaloHitTuple_t &a, const MTDCaloHitTuple_t &b)
Definition: MTDDigitizer.h:41
ProxyMTDTopology.h
MTDGeometry
Definition: MTDGeometry.h:14
siStripShotFilter_cfi.DigiCollection
DigiCollection
Definition: siStripShotFilter_cfi.py:6
edm::getParameterSet
ParameterSet const & getParameterSet(ParameterSetID const &id)
Definition: ParameterSet.cc:862
eostools.move
def move(src, dest)
Definition: eostools.py:511
edm::ProducesCollector
Definition: ProducesCollector.h:43
mtd_digitizer::MTDDigitizer::~MTDDigitizer
~MTDDigitizer() override
Definition: MTDDigitizer.h:144
DetId.h
Frameworkfwd.h
relativeConstraints.value
value
Definition: relativeConstraints.py:53
Exception
Definition: hltDiff.cc:246
mtd_digitizer::MTDSimHitDataAccumulator
std::unordered_map< MTDCellId, MTDCellInfo > MTDSimHitDataAccumulator
Definition: MTDDigitizerTypes.h:39
PMTDSimAccumulator::Data::energyMask
constexpr static unsigned energyMask
Definition: PMTDSimAccumulator.h:33
dqm-mbProfile.log
log
Definition: dqm-mbProfile.py:17
PMTDSimAccumulator::emplace_back
void emplace_back(unsigned int detId, unsigned char row, unsigned char column, unsigned short energyIndex, unsigned short sampleIndex, unsigned short data)
Definition: PMTDSimAccumulator.h:69
mtd_digitizer
Definition: MTDDigitizer.h:35
mtd_digitizer::MTDDigitizer::maxSimHitsAccTime_
const int maxSimHitsAccTime_
Definition: MTDDigitizer.h:179
edm::Event
Definition: Event.h:73
newFWLiteAna.base
base
Definition: newFWLiteAna.py:92
TauDecayModes.dec
dec
Definition: TauDecayModes.py:143
edm::ConsumesCollector
Definition: ConsumesCollector.h:45
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
PMTDSimAccumulator::Data::sampleMask
constexpr static unsigned sampleMask
Definition: PMTDSimAccumulator.h:34