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);
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"
249 auto pOutputPFSimParticleCollection = std::make_unique<reco::PFSimParticleCollection>();
256 LogError(
"PFSimParticleProducer") << err.str() << endl;
264 LogError(
"PFSimParticleProducer") <<
"cannot find sim vertices: " << inputTagSim_ << endl;
284 unsigned recTrackID = 99999;
285 vector<unsigned> recHitContrib;
286 vector<double> recHitContribFrac;
290 for (
unsigned lo = 0; lo < recTrackSimID.size(); lo++) {
291 if (
i == recTrackSimID[lo]) {
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);
345 fst.
charge(), fst.
type(), fst.
id(), motherId, fst.
daughters(), recTrackID, recHitContrib, recHitContribFrac);
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;
std::unique_ptr< FSimEvent > mySimEvent
bool processParticles_
process particles on/off
double pz() const
z of the momentum
EventNumber_t event() const
bool noEndVertex() const
no end vertex
float charge() const
charge
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
const RawParticle & hoEntrance() const
The particle at HCAL exir.
const FSimVertex & endVertex() const
end vertex
const RawParticle & hcalExit() const
The particle at HCAL exir.
double y() const
y of vertex
bool getByToken(EDGetToken token, Handle< PROD > &result) const
double z() const
z of vertex
const XYZTLorentzVector & momentum() const
Temporary (until move of SimTrack to Mathcore) - No! Actually very useful.
const RawParticle & layer1Entrance() const
The particle at Preshower Layer 1.
std::vector< EcalRecHit >::const_iterator const_iterator
edm::InputTag inputTagEcalRecHitsEB_
const std::vector< int > & daughters() const
Vector of daughter indices.
Log< level::Error, false > LogError
double x() const
x of vertex
edm::EDGetTokenT< reco::PFRecTrackCollection > tokenRecTracks_
bool getData(T &iHolder) const
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
int hashedIndex(int ieta, int iphi)
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
double e() const
energy of the momentum
edm::InputTag inputTagSim_
module label for retrieving input simtrack and simvertex
Point of closest approach from beam axis (initial point in the case of PFSimParticle) ...
const math::XYZTLorentzVector & position() const
Temporary (until CMSSW moves to Mathcore) - No ! Actually very useful.
edm::EDGetTokenT< std::vector< SimTrack > > tokenSim_
edm::ESGetToken< HepPDT::ParticleDataTable, edm::DefaultRecord > pdtToken_
const RawParticle & ecalEntrance() const
The particle at ECAL entrance.
bool mctruthMatchingInfo_
true particle for particle flow
edm::EDGetTokenT< edm::PCaloHitContainer > tokenFastSimProducer_
T const * product() const
XYZPointD XYZPoint
point in space with cartesian internal representation
edm::EDGetTokenT< EcalRecHitCollection > tokenEcalRecHitsEB_
int type() const
particle type (HEP PDT convension)
int id() const
the index in FBaseSimEvent and other vectors
const RawParticle & layer2Entrance() const
The particle at Preshower Layer 2.
bool noMother() const
no mother particle
const RawParticle & hcalEntrance() const
The particle at HCAL entrance.
double px() const
x of the momentum
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
const FSimVertex vertex() const
Origin vertex.
double py() const
y of the momentum
void getSimIDs(const TrackHandle &trackh, std::vector< unsigned > &recTrackSimID)
const FSimTrack & mother() const
mother
edm::EDGetTokenT< std::vector< SimVertex > > tokenSimVertices_