74 const std::vector<edm::ParameterSet>& pluginConfigs = config.
getParameter<std::vector<edm::ParameterSet>>(
"plugins");
76 for (
unsigned int iplugin = 0; iplugin<pluginConfigs.size(); ++iplugin)
85 edm::LogInfo(
"TrackingRecHitProducer: ")<<
"adding plugin type '"<<pluginType<<
"' as '"<<pluginName<<
"'"<<std::endl;
90 throw cms::Exception(
"TrackingRecHitAlgorithm plugin not found: ") <<
"plugin type = "<<pluginType<<
"\nconfiguration=\n"<<pluginConfig.
dump();
97 produces<FastTrackerRecHitCollection>();
98 produces<FastTrackerRecHitRefCollection>(
"simHit2RecHitMap");
112 algo->beginStream(
id);
133 <<
"SiPixel Templates not loaded correctly from the DB object!" << std::endl;
153 trackerGeomRec.get(trackerGeometryHandle);
154 trackerTopoRec.
get(trackerTopologyHandle);
161 const std::vector<DetId>& detIds = trackerGeometry->
detIds();
162 std::vector<unsigned int> numberOfDetIdsPerAlgorithm(
_recHitAlgorithms.size(),0);
164 for (
const DetId& detId: detIds)
174 numberOfDetIdsPerAlgorithm[ialgo]+=1;
180 throw cms::Exception(
"FastSimulation/TrackingRecHitProducer: DetId not configured! ("+trackerTopology->
print(detId)+
")");
196 algo->beginEvent(event,eventSetup);
203 auto output_recHits = std::make_unique<FastTrackerRecHitCollection>();
204 output_recHits->reserve(simHits->size());
207 auto output_recHitRefs = std::make_unique<FastTrackerRecHitRefCollection>(simHits->size(),
FastTrackerRecHitRef());
209 std::map<unsigned int,std::vector<std::pair<unsigned int,const PSimHit*>>> simHitsIdPairPerDetId;
210 for (
unsigned int ihit = 0; ihit < simHits->size(); ++ihit)
213 simHitsIdPairPerDetId[simHit->
detUnitId()].push_back(std::make_pair(ihit,simHit));
216 for (
auto simHitsIdPairIt = simHitsIdPairPerDetId.begin(); simHitsIdPairIt != simHitsIdPairPerDetId.end(); ++simHitsIdPairIt)
218 const DetId& detId = simHitsIdPairIt->first;
219 std::map<unsigned int, TrackingRecHitPipe>::const_iterator pipeIt =
_detIdPipes.find(detId);
222 auto& simHitIdPairList = simHitsIdPairIt->second;
227 product = pipe.
produce(product);
229 const std::vector<TrackingRecHitProduct::RecHitToSimHitIdPairs>& recHitToSimHitIdPairsList = product->getRecHitToSimHitIdPairs();
232 for (
unsigned int irecHit = 0; irecHit < recHitToSimHitIdPairsList.size(); ++irecHit)
234 output_recHits->push_back(recHitToSimHitIdPairsList[irecHit].
first);
235 const std::vector<TrackingRecHitProduct::SimHitIdPair>& simHitIdPairList = recHitToSimHitIdPairsList[irecHit].second;
236 double energyLoss_tot = 0;
237 for (
unsigned int isimHit = 0; isimHit < simHitIdPairList.size(); ++isimHit){
238 unsigned int simHitId = simHitIdPairList[isimHit].first;
241 if (not (*output_recHitRefs)[simHitId].isNull())
243 throw cms::Exception(
"FastSimulation/TrackingRecHitProducer",
"A PSimHit cannot lead to multiple FastTrackerRecHits");
253 throw cms::Exception(
"FastSimulation/TrackingRecHitProducer",
"A PSimHit carries a DetId which does not belong to the TrackerGeometry: "+std::to_string(detId));
258 for (
auto&
algo: _recHitAlgorithms)
260 algo->endEvent(event,eventSetup);
265 for(
unsigned recHitIndex = 0; recHitIndex < output_recHits->size(); ++recHitIndex)
271 event.put(
std::move(output_recHitRefs),
"simHit2RecHitMap");
T getParameter(std::string const &) const
unsigned long long cacheIdentifier() const
std::string dump(unsigned int indent=0) const
void setupDetIdPipes(const edm::EventSetup &eventSetup)
std::map< unsigned int, TrackingRecHitPipe > _detIdPipes
void beginStream(edm::StreamID id) override
~TrackingRecHitProducer() override
void addAlgorithm(TrackingRecHitAlgorithm *algorithm)
edm::EDGetTokenT< std::vector< PSimHit > > _simHitToken
std::string print(DetId detid) const
unsigned long long _trackerGeometryCacheID
edm::Ref< FastTrackerRecHitCollection > FastTrackerRecHitRef
bool passSelection(std::string selectionStr) const
#define DEFINE_FWK_MODULE(type)
ProductT const & get(ESGetToken< ProductT, DepRecordT > const &iToken) const
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
unsigned int size() const
const DetIdContainer & detIds() const override
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
void produce(edm::Event &event, const edm::EventSetup &eventSetup) override
def pipe(cmdline, input=None)
std::shared_ptr< TrackingRecHitProduct > TrackingRecHitProductPtr
static bool pushfile(int filenum, std::vector< SiPixelTemplateStore > &pixelTemp, std::string dir="CalibTracker/SiPixelESProducers/data/")
TrackingRecHitProducer(const edm::ParameterSet &config)
float energyLoss() const
The energy deposit in the PSimHit, in ???.
void beginRun(edm::Run const &, const edm::EventSetup &eventSetup) override
std::vector< std::unique_ptr< TrackingRecHitAlgorithm > > _recHitAlgorithms
void endStream() override
std::vector< SiPixelTemplateStore > _pixelTempStore
unsigned long long _trackerTopologyCacheID
T const * product() const
TrackingRecHitProductPtr produce(TrackingRecHitProductPtr product) const
T get(const Candidate &c)
unsigned int detUnitId() const