File indexing completed on 2024-04-06 12:13:41
0001
0002 #include "GeneratorInterface/GenFilters/plugins/PythiaDauFilter.h"
0003
0004 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
0005 #include <iostream>
0006 #include <memory>
0007
0008 using namespace edm;
0009 using namespace std;
0010 using namespace Pythia8;
0011
0012 PythiaDauFilter::PythiaDauFilter(const edm::ParameterSet& iConfig)
0013 : token_(consumes<edm::HepMCProduct>(
0014 edm::InputTag(iConfig.getUntrackedParameter("moduleLabel", std::string("generator")), "unsmeared"))),
0015 particleID(iConfig.getUntrackedParameter("ParticleID", 0)),
0016 chargeconju(iConfig.getUntrackedParameter("ChargeConjugation", true)),
0017 ndaughters(iConfig.getUntrackedParameter("NumberDaughters", 0)),
0018 minptcut(iConfig.getUntrackedParameter("MinPt", 0.)),
0019 maxptcut(iConfig.getUntrackedParameter("MaxPt", 14000.)),
0020 minetacut(iConfig.getUntrackedParameter("MinEta", -10.)),
0021 maxetacut(iConfig.getUntrackedParameter("MaxEta", 10.)) {
0022
0023 vector<int> defdauID;
0024 defdauID.push_back(0);
0025 dauIDs = iConfig.getUntrackedParameter<vector<int> >("DaughterIDs", defdauID);
0026
0027 edm::LogInfo("PythiaDauFilter::PythiaDauFilter") << "Creating pythia8 instance for particle properties" << endl;
0028 if (!fLookupGen.get())
0029 fLookupGen = std::make_unique<Pythia>();
0030 }
0031
0032 PythiaDauFilter::~PythiaDauFilter() {
0033
0034
0035 }
0036
0037
0038
0039
0040
0041
0042 bool PythiaDauFilter::filter(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0043 using namespace edm;
0044 bool accepted = false;
0045 Handle<HepMCProduct> evt;
0046 iEvent.getByToken(token_, evt);
0047
0048 const HepMC::GenEvent* myGenEvent = evt->GetEvent();
0049
0050 for (HepMC::GenEvent::particle_const_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end();
0051 ++p) {
0052 if ((*p)->pdg_id() != particleID)
0053 continue;
0054 int ndauac = 0;
0055 int ndau = 0;
0056 if ((*p)->end_vertex()) {
0057 for (HepMC::GenVertex::particle_iterator des = (*p)->end_vertex()->particles_begin(HepMC::children);
0058 des != (*p)->end_vertex()->particles_end(HepMC::children);
0059 ++des) {
0060 ++ndau;
0061 for (unsigned int i = 0; i < dauIDs.size(); ++i) {
0062 if ((*des)->pdg_id() != dauIDs[i])
0063 continue;
0064 if ((*des)->momentum().perp() > minptcut && (*des)->momentum().perp() < maxptcut &&
0065 (*des)->momentum().eta() > minetacut && (*des)->momentum().eta() < maxetacut) {
0066 ++ndauac;
0067 break;
0068 }
0069 }
0070 }
0071 }
0072 if (ndau == ndaughters && ndauac == ndaughters) {
0073 accepted = true;
0074 break;
0075 }
0076 }
0077
0078 if (!accepted && chargeconju) {
0079 for (HepMC::GenEvent::particle_const_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end();
0080 ++p) {
0081 if ((*p)->pdg_id() != -particleID)
0082 continue;
0083 int ndauac = 0;
0084 int ndau = 0;
0085 if ((*p)->end_vertex()) {
0086 for (HepMC::GenVertex::particle_iterator des = (*p)->end_vertex()->particles_begin(HepMC::children);
0087 des != (*p)->end_vertex()->particles_end(HepMC::children);
0088 ++des) {
0089 ++ndau;
0090 for (unsigned int i = 0; i < dauIDs.size(); ++i) {
0091 int IDanti = -dauIDs[i];
0092 if (!(fLookupGen->particleData.isParticle(IDanti)))
0093 IDanti = dauIDs[i];
0094 if ((*des)->pdg_id() != IDanti)
0095 continue;
0096 if ((*des)->momentum().perp() > minptcut && (*des)->momentum().perp() < maxptcut &&
0097 (*des)->momentum().eta() > minetacut && (*des)->momentum().eta() < maxetacut) {
0098 ++ndauac;
0099 break;
0100 }
0101 }
0102 }
0103 }
0104 if (ndau == ndaughters && ndauac == ndaughters) {
0105 accepted = true;
0106 break;
0107 }
0108 }
0109 }
0110
0111 if (accepted) {
0112 return true;
0113 } else {
0114 return false;
0115 }
0116 }