118 desc.addUntracked<
bool>(
"MCTruthMatchingInfo",
false);
123 desc.addUntracked<
bool>(
"process_RecTracks",
false);
130 desc.addUntracked<
bool>(
"process_Particles",
true);
133 desc.addUntracked<
bool>(
"verbose",
false);
134 descriptions.
add(
"particleFlowSimParticle",
desc);
144 tokenSim_ = consumes<std::vector<SimTrack> >(inputTagSim_);
145 tokenSimVertices_ = consumes<std::vector<SimVertex> >(inputTagSim_);
151 tokenFastSimProducer_ = consumes<edm::PCaloHitContainer>(inputTagFastSimProducer_);
156 tokenRecTracks_ = consumes<reco::PFRecTrackCollection>(inputTagRecTracks_);
159 tokenEcalRecHitsEB_ = consumes<EcalRecHitCollection>(inputTagEcalRecHitsEB_);
161 tokenEcalRecHitsEE_ = consumes<EcalRecHitCollection>(inputTagEcalRecHitsEE_);
166 produces<reco::PFSimParticleCollection>();
170 mySimEvent = std::make_unique<FSimEvent>(particleFilter_);
178 mySimEvent->initializePdt(&(*pdt));
180 LogDebug(
"PFSimParticleProducer") <<
"START event: " <<
iEvent.id().event() <<
" in run " <<
iEvent.id().run()
187 std::vector<unsigned> recTrackSimID;
193 typedef std::pair<double, unsigned> hitSimID;
194 std::vector<std::list<hitSimID> > caloHitsEBID(62000);
195 std::vector<double> caloHitsEBTotE(62000, 0.0);
197 if (mctruthMatchingInfo_) {
199 auto pcalohits =
iEvent.getHandle(tokenFastSimProducer_);
203 err <<
"could not find pcaloHit "
204 <<
"fastSimProducer:EcalHitsEB";
205 LogError(
"PFSimParticleProducer") <<
err.str() << endl;
209 assert(pcalohits.isValid());
211 edm::PCaloHitContainer::const_iterator it = pcalohits.product()->begin();
212 edm::PCaloHitContainer::const_iterator itend = pcalohits.product()->end();
215 for (; it != itend; ++it) {
218 if (it->energy() > 0.0) {
219 std::pair<double, unsigned> phitsimid = make_pair(it->energy(), it->geantTrackId());
220 caloHitsEBID[detid.hashedIndex()].push_back(phitsimid);
221 caloHitsEBTotE[detid.hashedIndex()] += it->energy();
231 LogDebug(
"PFSimParticleProducer") <<
"getting PFRecTracks" << endl;
235 LogError(
"PFSimParticleProducer") <<
err <<
" cannot get collection "
236 <<
"particleFlowBlock"
248 if (processParticles_) {
249 auto pOutputPFSimParticleCollection = std::make_unique<reco::PFSimParticleCollection>();
255 err <<
"cannot find sim tracks: " << inputTagSim_;
256 LogError(
"PFSimParticleProducer") <<
err.str() << endl;
264 LogError(
"PFSimParticleProducer") <<
"cannot find sim vertices: " << inputTagSim_ << endl;
273 for (
unsigned i = 0;
i < mySimEvent->nTracks();
i++) {
284 unsigned recTrackID = 99999;
285 vector<unsigned> recHitContrib;
286 vector<double> recHitContribFrac;
288 if (mctruthMatchingInfo_) {
290 for (
unsigned lo = 0; lo < recTrackSimID.size(); lo++) {
291 if (
i == recTrackSimID[lo]) {
298 bool found =
iEvent.getByToken(tokenEcalRecHitsEB_, rhcHandle);
301 err <<
"could not find rechits " << inputTagEcalRecHitsEB_;
302 LogError(
"PFSimParticleProducer") <<
err.str() << endl;
311 for (; it_rh != itend_rh; ++it_rh) {
315 auto it_phit = caloHitsEBID[rhit_hi].begin();
316 auto itend_phit = caloHitsEBID[rhit_hi].end();
317 for (; it_phit != itend_phit; ++it_phit) {
318 if (
i == it_phit->second) {
321 bool alreadyin =
false;
322 for (
unsigned ihit = 0; ihit < recHitContrib.size(); ++ihit)
323 if (detid.rawId() == recHitContrib[ihit])
327 double pcalofraction = 0.0;
328 if (caloHitsEBTotE[rhit_hi] != 0.0)
329 pcalofraction = (it_phit->first / caloHitsEBTotE[rhit_hi]) * 100.0;
332 recHitContrib.push_back(it_rh->id());
333 recHitContribFrac.push_back(pcalofraction);
349 math::XYZPoint posOrig(originVtx.position().x(), originVtx.position().y(), originVtx.position().z());
356 particle.addPoint(pointOrig);
367 particle.addPoint(pointEnd);
370 particle.addPoint(
dummy);
380 particle.addPoint(layer1Pt);
385 particle.addPoint(
dummy);
395 particle.addPoint(layer2Pt);
400 particle.addPoint(
dummy);
410 particle.addPoint(ecalPt);
415 particle.addPoint(
dummy);
420 particle.addPoint(
dummy);
429 particle.addPoint(hcalPtin);
437 particle.addPoint(hcalPtout);
445 particle.addPoint(hoPtin);
449 particle.addPoint(
dummy);
452 pOutputPFSimParticleCollection->push_back(particle);
458 LogDebug(
"PFSimParticleProducer") <<
"STOP event: " <<
iEvent.id().event() <<
" in run " <<
iEvent.id().run() << endl;
463 for (
unsigned i = 0;
i < trackh->size();
i++) {
466 for (
auto const&
hit : ref->trackRef()->recHits()) {
467 if (
hit->isValid()) {
468 auto rechit = dynamic_cast<const FastTrackerRecHit*>(
hit);
470 for (
unsigned int st_index = 0; st_index < rechit->nSimTrackIds(); ++st_index) {
471 recTrackSimID.push_back(rechit->simTrackId(st_index));