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 
15 
23 
25 
26 #include <vector>
27 #include <unordered_map>
28 #include <unordered_set>
29 #include <memory>
30 #include <tuple>
31 
32 
33 namespace mtd_digitizer {
34 
35  namespace MTDHelpers {
36  // index , det id, time
37  typedef std::tuple<int,uint32_t,float> MTDCaloHitTuple_t;
38 
39  bool orderByDetIdThenTime(const MTDCaloHitTuple_t &a, const MTDCaloHitTuple_t &b)
40  {
41  unsigned int detId_a(std::get<1>(a)), detId_b(std::get<1>(b));
42 
43  if(detId_a<detId_b) return true;
44  if(detId_a>detId_b) return false;
45 
46  double time_a(std::get<2>(a)), time_b(std::get<2>(b));
47  if(time_a<time_b) return true;
48 
49  return false;
50  }
51  }
52 
53  template<class Traits>
55  {
56  public:
57 
58  typedef typename Traits::DeviceSim DeviceSim ;
59  typedef typename Traits::ElectronicsSim ElectronicsSim;
60  typedef typename Traits::DigiCollection DigiCollection;
61 
65  MTDDigitizerBase(config,iC,parent),
66  geom_(nullptr),
67  deviceSim_( config.getParameterSet("DeviceSimulation") ),
68  electronicsSim_( config.getParameterSet("ElectronicsSimulation") ),
69  maxSimHitsAccTime_( config.getParameter< uint32_t >("maxSimHitsAccTime") ) { }
70 
71  ~MTDDigitizer() override { }
72 
76  void accumulate(edm::Event const& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) override;
77  void accumulate(PileUpEventPrincipal const& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) override;
78  void accumulate(edm::Handle<edm::PSimHitContainer> const &hits, int bxCrossing, CLHEP::HepRandomEngine* hre) override;
79 
83  void initializeEvent(edm::Event const& e, edm::EventSetup const& c) override;
84  void finalizeEvent(edm::Event& e, edm::EventSetup const& c, CLHEP::HepRandomEngine* hre) override;
85 
89  void beginRun(const edm::EventSetup & es) override;
90  void endRun() override {}
91 
92  private :
93 
95  MTDSimHitDataAccumulator().swap(simHitAccumulator_);
96  }
97 
99 
100  // implementations
101  DeviceSim deviceSim_; // processes a given simhit into an entry in a MTDSimHitDataAccumulator
102  ElectronicsSim electronicsSim_; // processes a MTDSimHitDataAccumulator into a BTLDigiCollection/ETLDigiCollection
103 
104  //handle sim hits
107 
108  };
109 
110  template<class Traits>
112  edm::EventSetup const& c,
113  CLHEP::HepRandomEngine* hre) {
115  e.getByLabel(inputSimHits_, simHits);
116  accumulate(simHits,0,hre);
117  }
118 
119  template<class Traits>
121  edm::EventSetup const& c,
122  CLHEP::HepRandomEngine* hre){
124  e.getByLabel(inputSimHits_, simHits);
125  accumulate(simHits,e.bunchCrossing(),hre);
126  }
127 
128  template<class Traits>
130  int bxCrossing,
131  CLHEP::HepRandomEngine* hre) {
132  using namespace MTDHelpers;
133 
134  //create list of tuples (pos in container, RECO DetId, time) to be sorted first
135  int nchits=(int)hits->size();
136  std::vector< MTDCaloHitTuple_t > hitRefs;
137  hitRefs.reserve(nchits);
138  for(int i=0; i<nchits; ++i) {
139  const auto& the_hit = hits->at(i);
140 
141  DetId id = the_hit.detUnitId();
142 
143  if (verbosity_>0) {
144  edm::LogInfo("MTDDigitizer") << " i/p " << std::hex << the_hit.detUnitId() << std::dec
145  << " o/p " << id.rawId() << std::endl;
146  }
147 
148  if( 0 != id.rawId() ) {
149  hitRefs.emplace_back( i, id.rawId(), the_hit.tof() );
150  }
151  }
152  std::sort(hitRefs.begin(),hitRefs.end(),MTDHelpers::orderByDetIdThenTime);
153 
154  deviceSim_.getHitsResponse(hitRefs, hits, &simHitAccumulator_, hre);
155 
156  hitRefs.clear();
157 
158  }
159 
160  template<class Traits>
162  deviceSim_.getEvent(e);
163  electronicsSim_.getEvent(e);
164  }
165 
166  template<class Traits>
168  CLHEP::HepRandomEngine* hre) {
169 
170  auto digiCollection = std::make_unique<DigiCollection>();
171  electronicsSim_.run(simHitAccumulator_,*digiCollection, hre);
172  e.put(std::move(digiCollection),digiCollection_);
173 
174  //release memory for next event
175  resetSimHitDataAccumulator();
176  }
177 
178 
179  template<class Traits>
181 
183  es.get<MTDDigiGeometryRecord>().get(geom);
184  geom_ = geom.product();
185 
186  deviceSim_.getEventSetup(es);
187  electronicsSim_.getEventSetup(es);
188 
189  }
190 }
191 
192 #endif
void accumulate(edm::Event const &e, edm::EventSetup const &c, CLHEP::HepRandomEngine *hre) override
handle SimHit accumulation
Definition: MTDDigitizer.h:111
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:137
ParameterSet const & getParameterSet(ParameterSetID const &id)
MTDSimHitDataAccumulator simHitAccumulator_
Definition: MTDDigitizer.h:106
std::unordered_map< MTDCellId, MTDCellInfo > MTDSimHitDataAccumulator
Definition: config.py:1
#define nullptr
void finalizeEvent(edm::Event &e, edm::EventSetup const &c, CLHEP::HepRandomEngine *hre) override
Definition: MTDDigitizer.h:167
void beginRun(const edm::EventSetup &es) override
actions at the start/end of run
Definition: MTDDigitizer.h:180
Traits::ElectronicsSim ElectronicsSim
Definition: MTDDigitizer.h:59
Traits::DigiCollection DigiCollection
Definition: MTDDigitizer.h:60
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:535
void initializeEvent(edm::Event const &e, edm::EventSetup const &c) override
actions at the start/end of event
Definition: MTDDigitizer.h:161
Definition: DetId.h:18
bool orderByDetIdThenTime(const MTDCaloHitTuple_t &a, const MTDCaloHitTuple_t &b)
Definition: MTDDigitizer.h:39
double b
Definition: hdecay.h:120
std::tuple< int, uint32_t, float > MTDCaloHitTuple_t
Definition: MTDDigitizer.h:37
const MTDGeometry * geom_
Definition: MTDDigitizer.h:98
double a
Definition: hdecay.h:121
bool getByLabel(edm::InputTag const &tag, edm::Handle< T > &result) const
T get() const
Definition: EventSetup.h:68
MTDDigitizer(const edm::ParameterSet &config, edm::ConsumesCollector &iC, edm::ProducerBase &parent)
Definition: MTDDigitizer.h:62
ElectronicsSim electronicsSim_
Definition: MTDDigitizer.h:102
Traits::DeviceSim DeviceSim
Definition: MTDDigitizer.h:58
T const * product() const
Definition: ESHandle.h:84
def move(src, dest)
Definition: eostools.py:511