CMS 3D CMS Logo

TrackingRecHitProducer.cc
Go to the documentation of this file.
10 
15 
18 
20 
23 
26 
29 // Pixel-related stuff:
33 
35 
38 
39 #include <map>
40 #include <memory>
41 #include <vector>
42 
44 private:
46  std::vector<std::unique_ptr<TrackingRecHitAlgorithm>> _recHitAlgorithms;
47  unsigned long long _trackerGeometryCacheID = 0;
48  unsigned long long _trackerTopologyCacheID = 0;
49  std::map<unsigned int, TrackingRecHitPipe> _detIdPipes;
56 
57 public:
59 
60  void beginRun(edm::Run const&, const edm::EventSetup& eventSetup) override;
61 
62  void beginStream(edm::StreamID id) override;
63 
64  void produce(edm::Event& event, const edm::EventSetup& eventSetup) override;
65 
66  void endStream() override;
67 
68  ~TrackingRecHitProducer() override;
69 };
70 
72  : siPixelTemplateDBObjectESToken_(esConsumes<edm::Transition::BeginRun>()),
73  siPixelTemplateStoreESToken_(esConsumes<edm::Transition::BeginRun>()),
74  trackerGeometryESToken_(esConsumes()),
75  trackerTopologyESToken_(esConsumes()) {
76  edm::ConsumesCollector consumeCollector = consumesCollector();
77  const std::vector<edm::ParameterSet>& pluginConfigs = config.getParameter<std::vector<edm::ParameterSet>>("plugins");
78 
79  for (unsigned int iplugin = 0; iplugin < pluginConfigs.size(); ++iplugin) {
80  const edm::ParameterSet& pluginConfig = pluginConfigs[iplugin];
81  const std::string pluginType = pluginConfig.getParameter<std::string>("type");
82  const std::string pluginName = pluginConfig.getParameter<std::string>("name");
83 
84  std::unique_ptr<TrackingRecHitAlgorithm> recHitAlgorithm{
85  TrackingRecHitAlgorithmFactory::get()->tryToCreate(pluginType, pluginName, pluginConfig, consumeCollector)};
86  if (recHitAlgorithm) {
87  edm::LogInfo("TrackingRecHitProducer: ")
88  << "adding plugin type '" << pluginType << "' as '" << pluginName << "'" << std::endl;
89  _recHitAlgorithms.push_back(std::move(recHitAlgorithm));
90  } else {
91  throw cms::Exception("TrackingRecHitAlgorithm plugin not found: ")
92  << "plugin type = " << pluginType << "\nconfiguration=\n"
93  << pluginConfig.dump();
94  }
95  }
96 
97  edm::InputTag simHitTag = config.getParameter<edm::InputTag>("simHits");
98  _simHitToken = consumes<std::vector<PSimHit>>(simHitTag);
99 
100  produces<FastTrackerRecHitCollection>();
101  produces<FastTrackerRecHitRefCollection>("simHit2RecHitMap");
102 }
103 
105 
107  for (auto& algo : _recHitAlgorithms) {
108  algo->beginStream(id);
109  }
110 }
111 
113  //--- Since all pixel algorithms (of which there could be several) use the same
114  // templateStore, filled out from the same DB Object, we need to it centrally
115  // (namely here), and then distribute it to the algorithms. Note that only
116  // the pixel algorithms implement beginRun(), for the strip tracker this defaults
117  // to a no-op.
118 
119  const SiPixelTemplateDBObject& pixelTemplateDBObject = eventSetup.getData(siPixelTemplateDBObjectESToken_);
120  const auto& pixelTemplateStore = eventSetup.getData(siPixelTemplateStoreESToken_);
121 
122  for (auto& algo : _recHitAlgorithms) {
123  algo->beginRun(run, eventSetup, &pixelTemplateDBObject, pixelTemplateStore);
124  }
125 }
126 
128  auto const& trackerGeomRec = eventSetup.get<TrackerDigiGeometryRecord>();
129  auto const& trackerTopoRec = eventSetup.get<TrackerTopologyRcd>();
130  if (trackerGeomRec.cacheIdentifier() != _trackerGeometryCacheID or
131  trackerTopoRec.cacheIdentifier() != _trackerTopologyCacheID) {
132  _trackerGeometryCacheID = trackerGeomRec.cacheIdentifier();
133  _trackerTopologyCacheID = trackerTopoRec.cacheIdentifier();
134 
135  const TrackerGeometry& trackerGeometry = trackerGeomRec.get(trackerGeometryESToken_);
136  const TrackerTopology& trackerTopology = trackerTopoRec.get(trackerTopologyESToken_);
137 
138  _detIdPipes.clear();
139 
140  //build pipes for all detIds
141  const std::vector<DetId>& detIds = trackerGeometry.detIds();
142  std::vector<unsigned int> numberOfDetIdsPerAlgorithm(_recHitAlgorithms.size(), 0);
143 
144  for (const DetId& detId : detIds) {
145  TrackerDetIdSelector selector(detId, trackerTopology);
146 
148  for (unsigned int ialgo = 0; ialgo < _recHitAlgorithms.size(); ++ialgo) {
149  auto& algo = _recHitAlgorithms[ialgo];
150  if (selector.passSelection(algo->getSelectionString())) {
151  numberOfDetIdsPerAlgorithm[ialgo] += 1;
152  pipe.addAlgorithm(algo.get());
153  }
154  }
155  if (pipe.size() == 0) {
156  throw cms::Exception("FastSimulation/TrackingRecHitProducer: DetId not configured! (" +
157  trackerTopology.print(detId) + ")");
158  }
159  _detIdPipes[detId.rawId()] = pipe;
160  }
161  }
162 }
163 
165  //resetup pipes if new iov
167  //begin event
168  for (auto& algo : _recHitAlgorithms) {
169  algo->beginEvent(event, eventSetup);
170  }
171 
172  //build DetId -> PSimHit map
174  event.getByToken(_simHitToken, simHits);
175 
176  auto output_recHits = std::make_unique<FastTrackerRecHitCollection>();
177  output_recHits->reserve(simHits->size());
178 
179  edm::RefProd<FastTrackerRecHitCollection> output_recHits_refProd =
180  event.getRefBeforePut<FastTrackerRecHitCollection>();
181  auto output_recHitRefs = std::make_unique<FastTrackerRecHitRefCollection>(simHits->size(), FastTrackerRecHitRef());
182 
183  std::map<unsigned int, std::vector<std::pair<unsigned int, const PSimHit*>>> simHitsIdPairPerDetId;
184  for (unsigned int ihit = 0; ihit < simHits->size(); ++ihit) {
185  const PSimHit* simHit = &(*simHits)[ihit];
186  simHitsIdPairPerDetId[simHit->detUnitId()].push_back(std::make_pair(ihit, simHit));
187  }
188 
189  for (auto simHitsIdPairIt = simHitsIdPairPerDetId.begin(); simHitsIdPairIt != simHitsIdPairPerDetId.end();
190  ++simHitsIdPairIt) {
191  const DetId& detId = simHitsIdPairIt->first;
192  std::map<unsigned int, TrackingRecHitPipe>::const_iterator pipeIt = _detIdPipes.find(detId);
193  if (pipeIt != _detIdPipes.cend()) {
194  auto& simHitIdPairList = simHitsIdPairIt->second;
195  const TrackingRecHitPipe& pipe = pipeIt->second;
196 
197  TrackingRecHitProductPtr product = std::make_shared<TrackingRecHitProduct>(detId, simHitIdPairList);
198 
199  product = pipe.produce(product);
200 
201  const std::vector<TrackingRecHitProduct::RecHitToSimHitIdPairs>& recHitToSimHitIdPairsList =
202  product->getRecHitToSimHitIdPairs();
203 
204  for (unsigned int irecHit = 0; irecHit < recHitToSimHitIdPairsList.size(); ++irecHit) {
205  output_recHits->push_back(recHitToSimHitIdPairsList[irecHit].first);
206  const std::vector<TrackingRecHitProduct::SimHitIdPair>& simHitIdPairList =
207  recHitToSimHitIdPairsList[irecHit].second;
208  double energyLoss_tot = 0; //
209  for (unsigned int isimHit = 0; isimHit < simHitIdPairList.size(); ++isimHit) {
210  unsigned int simHitId = simHitIdPairList[isimHit].first;
211  const PSimHit* simHit = simHitIdPairList[isimHit].second;
212  energyLoss_tot +=
213  simHit
214  ->energyLoss(); //energy loss of sim hit in GeV std::cout << "energyLoss_tot" << energyLoss_tot << std::endl;
215  if (not(*output_recHitRefs)[simHitId].isNull()) {
216  throw cms::Exception("FastSimulation/TrackingRecHitProducer",
217  "A PSimHit cannot lead to multiple FastTrackerRecHits");
218  }
219  (*output_recHitRefs)[simHitId] = FastTrackerRecHitRef(output_recHits_refProd, output_recHits->size() - 1);
220  }
221  static_cast<FastSingleTrackerRecHit&>(output_recHits->back()).setEnergyLoss(energyLoss_tot);
222  }
223  } else {
224  //there should be at least an empty pipe for each DetId
225  throw cms::Exception(
226  "FastSimulation/TrackingRecHitProducer",
227  "A PSimHit carries a DetId which does not belong to the TrackerGeometry: " + std::to_string(detId));
228  }
229  }
230 
231  //end event
232  for (auto& algo : _recHitAlgorithms) {
233  algo->endEvent(event, eventSetup);
234  }
235 
236  // note from lukas:
237  // all rechits need a unique id numbers
238  for (unsigned recHitIndex = 0; recHitIndex < output_recHits->size(); ++recHitIndex) {
239  ((FastSingleTrackerRecHit*)&(*output_recHits)[recHitIndex])->setId(recHitIndex);
240  }
241 
242  event.put(std::move(output_recHits));
243  event.put(std::move(output_recHitRefs), "simHit2RecHitMap");
244 }
245 
247  for (auto& algo : _recHitAlgorithms) {
248  algo->endStream();
249  }
250 }
251 
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
bool passSelection(const std::string &selectionStr) const
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > trackerTopologyESToken_
const DetIdContainer & detIds() const override
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
std::string print(DetId detid) const
void setupDetIdPipes(const edm::EventSetup &eventSetup)
std::map< unsigned int, TrackingRecHitPipe > _detIdPipes
void beginStream(edm::StreamID id) override
edm::EDGetTokenT< std::vector< PSimHit > > _simHitToken
Definition: config.py:1
unsigned long long _trackerGeometryCacheID
edm::Ref< FastTrackerRecHitCollection > FastTrackerRecHitRef
unsigned long long cacheIdentifier() const
static std::string to_string(const XMLCh *ch)
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > trackerGeometryESToken_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
size_type size() const
Definition: OwnVector.h:300
void produce(edm::Event &event, const edm::EventSetup &eventSetup) override
Transition
Definition: Transition.h:12
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
def pipe(cmdline, input=None)
Definition: pipe.py:5
std::shared_ptr< TrackingRecHitProduct > TrackingRecHitProductPtr
Log< level::Info, false > LogInfo
const edm::ESGetToken< SiPixelTemplateDBObject, SiPixelTemplateDBObjectESProducerRcd > siPixelTemplateDBObjectESToken_
Definition: DetId.h:17
const edm::ESGetToken< std::vector< SiPixelTemplateStore >, SiPixelTemplateDBObjectESProducerRcd > siPixelTemplateStoreESToken_
TrackingRecHitProducer(const edm::ParameterSet &config)
HLT enums.
void beginRun(edm::Run const &, const edm::EventSetup &eventSetup) override
std::vector< std::unique_ptr< TrackingRecHitAlgorithm > > _recHitAlgorithms
unsigned long long _trackerTopologyCacheID
#define get
ProductT const & get(ESGetToken< ProductT, DepRecordT > const &iToken) const
Definition: pipe.py:1
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
Definition: Run.h:45