26 #include <ext/algorithm> 64 bool barcodesAreSorted1,
113 using namespace reco;
120 setStatus_(cfg.getParameter<int32_t>(
"setStatus")),
128 if (cfg.
exists(
"particleTypes")) {
131 if (cfg.
exists(
"motherTypes")) {
136 edm::LogWarning(
"Configuration") <<
"PATGenCandsFromSimTracksProducer: " <<
137 "you have set 'writeAncestors' to 'true' and 'makeMotherLink' to false;" <<
138 "GEANT particles with generator level (e.g.PYHIA) mothers won't have mother links.\n";
140 produces<GenParticleCollection>();
151 if ((it != g.
simtks.end()) && (it->trackId() ==
idx)) {
165 if (simMother !=
nullptr) motherRef =
findRef(*simMother,g);
173 assert(it->second > 0);
192 std::vector<int>::const_iterator it;
225 if (!
pdts_.empty()) {
227 for (vector<PdtEntry>::iterator itp =
pdts_.begin(), edp =
pdts_.end(); itp != edp; ++itp) {
249 std::unique_ptr<SimTrackContainer> simtracksTmp;
252 if (!__gnu_cxx::is_sorted(simtracks->begin(), simtracks->end(),
LessById())) {
254 std::sort(simtracksTmp->begin(), simtracksTmp->end(),
LessById());
255 simtracksSorted = &* simtracksTmp;
266 bool barcodesAreSorted =
true;
270 if (gens->size() != genBarcodes->size())
throw cms::Exception(
"Corrupt data") <<
"Barcodes not of the same size as GenParticles!\n";
271 barcodesAreSorted = __gnu_cxx::is_sorted(genBarcodes->begin(), genBarcodes->end());
276 auto cands = std::make_unique<GenParticleCollection>();
279 GlobalContext globals(*simtracksSorted, *simvertices, gens, genBarcodes, barcodesAreSorted, *cands, refprod);
281 for (SimTrackContainer::const_iterator isimtrk = simtracks->begin();
282 isimtrk != simtracks->end(); ++isimtrk) {
285 if (isimtrk->genpartIndex() != -1)
continue;
295 if (!(
filter_(genp)))
continue;
300 if (motherSimTk ==
nullptr)
continue;
307 if (mother !=
nullptr) motherRef =
findRef(*mother, globals);
311 cands->push_back(genp);
317 #ifdef DEBUG_PATGenCandsFromSimTracksProducer 318 std::cout <<
"Produced a list of " << orphans->size() <<
" genParticles." << std::endl;
319 for (GenParticleCollection::const_iterator it = orphans->begin(), ed = orphans->end(); it != ed; ++it) {
321 std::cout <<
"GenParticle #" << (it - orphans->begin()) <<
": pdgId " << it->pdgId()
322 <<
", pt = " << it->pt() <<
", eta = " << it->eta() <<
", phi = " << it->phi()
323 <<
", rho = " << it->vertex().Rho() <<
", z = " << it->vertex().Z() << std::endl;
327 if (mom.
id() == orphans.
id()) {
332 std::cout <<
"GenParticleRef [" << mom.
id() <<
"/" << mom.
key() <<
"]: pdgId " << mom->pdgId() <<
", status = " << mom->status()
333 <<
", pt = " << mom->pt() <<
", eta = " << mom->eta() <<
", phi = " << mom->phi()
334 <<
", rho = " << mom->vertex().Rho() <<
", z = " << mom->vertex().Z() << std::endl;
335 if (mom.
id() != orphans.
id())
break;
336 if ((mom->motherRef().
id() == mom.
id()) && (mom->motherRef().
key() == mom.
key())) {
337 throw cms::Exception(
"Corrupt Data") <<
"A particle is it's own mother.\n";
339 mom = mom->motherRef();
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
T getParameter(std::string const &) const
bool isNonnull() const
Checks for non-null.
const edm::Handle< reco::GenParticleCollection > & gens
PATGenCandsFromSimTracksProducer(const edm::ParameterSet &)
const SimTrack * findGeantMother(const SimTrack &tk, const GlobalContext &g) const
Find the mother of a given GEANT track (or NULL if it can't be found).
edm::EDGetTokenT< reco::GenParticleCollection > genParticlesToken_
Collection of GenParticles I need to make refs to. It must also have its associated vector<int> of ba...
std::map< unsigned int, int > simTksProcessed
#define DEFINE_FWK_MODULE(type)
edm::Ref< GenParticleCollection > GenParticleRef
persistent reference to a GenParticle
edm::EDGetTokenT< std::vector< int > > genBarcodesToken_
bool exists(std::string const ¶meterName) const
checks if a parameter exists
edm::Ref< reco::GenParticleCollection > findRef(const SimTrack &tk, GlobalContext &g) const
bool writeAncestors_
If true, I'll save GenParticles corresponding to the ancestors of this GEANT particle. Common ancestors are only written once.
key_type key() const
Accessor for product key.
reco::GenParticleCollection & output
const edm::SimTrackContainer & simtks
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
float charge() const
charge
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 g
GlobalContext(const edm::SimTrackContainer &simtks1, const edm::SimVertexContainer &simvtxs1, const edm::Handle< reco::GenParticleCollection > &gens1, const edm::Handle< std::vector< int > > &genBarcodes1, bool barcodesAreSorted1, reco::GenParticleCollection &output1, const edm::RefProd< reco::GenParticleCollection > &refprod1)
ProductID id() const
Accessor for product ID.
Produces reco::GenParticle from SimTracks.
std::set< int > motherPdgIds_
int genpartIndex() const
index of the corresponding Generator particle in the Event container (-1 if no Genpart) ...
Abs< T >::type abs(const T &t)
bool makeMotherLink_
If true, I'll try to make a link from the GEANT particle to a GenParticle.
std::vector< PdtEntry > pdts_
const edm::RefProd< reco::GenParticleCollection > & refprod
reco::GenParticle makeGenParticle_(const SimTrack &tk, const edm::Ref< reco::GenParticleCollection > &mother, const GlobalContext &g) const
Make a GenParticle for this SimTrack, with a given mother.
StringCutObjectSelector< reco::GenParticle > StrFilter
void addMother(const typename mothers::value_type &)
add a daughter via a reference
int vertIndex() const
index of the vertex in the Event container (-1 if no vertex)
~PATGenCandsFromSimTracksProducer() override
const edm::Handle< std::vector< int > > & genBarcodes
unsigned int trackId() const
bool operator()(const SimTrack &tk1, unsigned int id) const
std::vector< SimVertex > SimVertexContainer
math::XYZTLorentzVector LorentzVector
Lorentz vector.
edm::Ref< reco::GenParticleCollection > generatorRef_(const SimTrack &tk, const GlobalContext &g) const
Used by findRef if the track is a PYTHIA particle.
Global context for all recursive methods.
const edm::SimVertexContainer & simvtxs
int type() const
particle type (HEP PDT convension)
const math::XYZTLorentzVectorD & momentum() const
std::vector< PdtEntry > motherPdts_
bool operator()(unsigned int id, const SimTrack &tk2) const
math::XYZPoint Point
point in the space
bool operator()(const SimTrack &tk1, const SimTrack &tk2) const
edm::EDGetTokenT< edm::SimVertexContainer > simVertexToken_
edm::EDGetTokenT< edm::SimTrackContainer > simTracksToken_
void produce(edm::Event &, const edm::EventSetup &) override
std::vector< SimTrack > SimTrackContainer