178 algo->beginEvent(event, eventSetup);
185 auto output_recHits = std::make_unique<FastTrackerRecHitCollection>();
186 output_recHits->reserve(simHits->size());
190 auto output_recHitRefs = std::make_unique<FastTrackerRecHitRefCollection>(simHits->size(),
FastTrackerRecHitRef());
192 std::map<unsigned int, std::vector<std::pair<unsigned int, const PSimHit*>>> simHitsIdPairPerDetId;
193 for (
unsigned int ihit = 0; ihit < simHits->size(); ++ihit) {
195 simHitsIdPairPerDetId[simHit->
detUnitId()].push_back(std::make_pair(ihit, simHit));
198 for (
auto simHitsIdPairIt = simHitsIdPairPerDetId.begin(); simHitsIdPairIt != simHitsIdPairPerDetId.end();
200 const DetId& detId = simHitsIdPairIt->first;
201 std::map<unsigned int, TrackingRecHitPipe>::const_iterator pipeIt =
_detIdPipes.find(detId);
203 auto& simHitIdPairList = simHitsIdPairIt->second;
208 product = pipe.
produce(product);
210 const std::vector<TrackingRecHitProduct::RecHitToSimHitIdPairs>& recHitToSimHitIdPairsList =
211 product->getRecHitToSimHitIdPairs();
213 for (
unsigned int irecHit = 0; irecHit < recHitToSimHitIdPairsList.size(); ++irecHit) {
214 output_recHits->push_back(recHitToSimHitIdPairsList[irecHit].
first);
215 const std::vector<TrackingRecHitProduct::SimHitIdPair>& simHitIdPairList =
216 recHitToSimHitIdPairsList[irecHit].second;
217 double energyLoss_tot = 0;
218 for (
unsigned int isimHit = 0; isimHit < simHitIdPairList.size(); ++isimHit) {
219 unsigned int simHitId = simHitIdPairList[isimHit].first;
220 const PSimHit* simHit = simHitIdPairList[isimHit].second;
224 if (not(*output_recHitRefs)[simHitId].isNull()) {
226 "A PSimHit cannot lead to multiple FastTrackerRecHits");
235 "FastSimulation/TrackingRecHitProducer",
236 "A PSimHit carries a DetId which does not belong to the TrackerGeometry: " + std::to_string(detId));
241 for (
auto&
algo : _recHitAlgorithms) {
242 algo->endEvent(event, eventSetup);
247 for (
unsigned recHitIndex = 0; recHitIndex < output_recHits->size(); ++recHitIndex) {
252 event.put(
std::move(output_recHitRefs),
"simHit2RecHitMap");
void setupDetIdPipes(const edm::EventSetup &eventSetup)
std::map< unsigned int, TrackingRecHitPipe > _detIdPipes
edm::EDGetTokenT< std::vector< PSimHit > > _simHitToken
edm::Ref< FastTrackerRecHitCollection > FastTrackerRecHitRef
std::shared_ptr< TrackingRecHitProduct > TrackingRecHitProductPtr
float energyLoss() const
The energy deposit in the PSimHit, in ???.
std::vector< std::unique_ptr< TrackingRecHitAlgorithm > > _recHitAlgorithms
TrackingRecHitProductPtr produce(TrackingRecHitProductPtr product) const
unsigned int detUnitId() const