CMS 3D CMS Logo

PythiaDauVFilter.cc
Go to the documentation of this file.
3 #include <iostream>
4 #include <vector>
5 
6 using namespace edm;
7 using namespace std;
8 using namespace Pythia8;
9 
10 
12  fVerbose(iConfig.getUntrackedParameter("verbose",0)),
13  token_(consumes<edm::HepMCProduct>(edm::InputTag(iConfig.getUntrackedParameter("moduleLabel",std::string("generator")),"unsmeared"))),
14  particleID(iConfig.getUntrackedParameter("ParticleID", 0)),
15  motherID(iConfig.getUntrackedParameter("MotherID", 0)),
16  chargeconju(iConfig.getUntrackedParameter("ChargeConjugation", true)),
17  ndaughters(iConfig.getUntrackedParameter("NumberDaughters", 0)),
18  maxptcut(iConfig.getUntrackedParameter("MaxPt", 14000.))
19 {
20  //now do what ever initialization is needed
21  vector<int> defdauID;
22  defdauID.push_back(0);
23  dauIDs = iConfig.getUntrackedParameter< vector<int> >("DaughterIDs",defdauID);
24  vector<double> defminptcut;
25  defminptcut.push_back(0.);
26  minptcut = iConfig.getUntrackedParameter< vector<double> >("MinPt",defminptcut);
27  vector<double> defminetacut;
28  defminetacut.push_back(-10.);
29  minetacut = iConfig.getUntrackedParameter< vector<double> >("MinEta",defminetacut);
30  vector<double> defmaxetacut;
31  defmaxetacut.push_back(10.);
32  maxetacut = iConfig.getUntrackedParameter< vector<double> >("MaxEta",defmaxetacut);
33 
34  edm::LogInfo("PythiaDauVFilter") << "----------------------------------------------------------------------" << endl;
35  edm::LogInfo("PythiaDauVFilter") << "--- PythiaDauVFilter" << endl;
36  for (unsigned int i=0; i<dauIDs.size(); ++i) {
37  edm::LogInfo("PythiaDauVFilter") << "ID: " << dauIDs[i] << " pT > " << minptcut[i] << " " << minetacut[i] << " eta < " << maxetacut[i] << endl;
38  }
39  edm::LogInfo("PythiaDauVFilter") << "maxptcut = " << maxptcut << endl;
40  edm::LogInfo("PythiaDauVFilter") << "particleID = " << particleID << endl;
41  edm::LogInfo("PythiaDauVFilter") << "motherID = " << motherID << endl;
42 
43  // create pythia8 instance to access particle data
44  edm::LogInfo("PythiaDauVFilter") << "Creating pythia8 instance for particle properties" << endl;
45  if(!fLookupGen.get()) fLookupGen.reset(new Pythia());
46 }
47 
48 
50 {
51 
52  // do anything here that needs to be done at desctruction time
53  // (e.g. close files, deallocate resources etc.)
54 
55 }
56 
57 
58 //
59 // member functions
60 //
61 
62 // ------------ method called to produce the data ------------
64  using namespace edm;
65  bool accepted = false;
67  iEvent.getByToken(token_, evt);
68 
69  int OK(1);
70  vector<int> vparticles;
71 
72  HepMC::GenEvent *myGenEvent = new HepMC::GenEvent(*(evt->GetEvent()));
73 
74  if (fVerbose > 5) {
75  edm::LogInfo("PythiaDauVFilter") << "looking for " << particleID << endl;
76  }
77 
78  for (HepMC::GenEvent::particle_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end(); ++p) {
79 
80  if ((*p)->pdg_id() != particleID) continue ;
81 
82  // -- Check for mother of this particle
83  if (0 != motherID) {
84  OK = 0;
85  for (HepMC::GenVertex::particles_in_const_iterator des = (*p)->production_vertex()->particles_in_const_begin();
86  des != (*p)->production_vertex()->particles_in_const_end();
87  ++des) {
88  if (fVerbose > 10) {
89  edm::LogInfo("PythiaDauVFilter") << "mother: " << (*des)->pdg_id() << " pT: " << (*des)->momentum().perp() << " eta: " << (*des)->momentum().eta() << endl;
90  }
91  if (abs(motherID) == abs((*des)->pdg_id())) {
92  OK = 1;
93  break;
94  }
95  }
96  }
97  if (0 == OK) continue;
98 
99  // -- check for daugthers
100  int ndauac = 0;
101  int ndau = 0;
102  if (fVerbose > 5) {
103  edm::LogInfo("PythiaDauVFilter") << "found ID: " << (*p)->pdg_id() << " pT: " << (*p)->momentum().perp() << " eta: " << (*p)->momentum().eta() << endl;
104  }
105  vparticles.push_back((*p)->pdg_id());
106  if ((*p)->end_vertex()) {
107  for (HepMC::GenVertex::particle_iterator des=(*p)->end_vertex()->particles_begin(HepMC::children);
108  des != (*p)->end_vertex()->particles_end(HepMC::children);
109  ++des) {
110  ++ndau;
111  if (fVerbose > 5) {
112  edm::LogInfo("PythiaDauVFilter") << "ID: " << (*des)->pdg_id() << " pT: " << (*des)->momentum().perp() << " eta: " << (*des)->momentum().eta() << endl;
113  }
114  for (unsigned int i=0; i<dauIDs.size(); ++i) {
115  if ((*des)->pdg_id() != dauIDs[i] ) continue ;
116  if (fVerbose > 5) {
117  edm::LogInfo("PythiaDauVFilter") << "i = " << i << " pT = " << (*des)->momentum().perp() << " eta = " << (*des)->momentum().eta() << endl;
118  }
119  if ((*des)->momentum().perp() > minptcut[i] &&
120  (*des)->momentum().perp() < maxptcut &&
121  (*des)->momentum().eta() > minetacut[i] &&
122  (*des)->momentum().eta() < maxetacut[i] ) {
123  ++ndauac;
124  vparticles.push_back((*des)->pdg_id());
125  if (fVerbose > 2) {
126  edm::LogInfo("PythiaDauVFilter") << " accepted this particle " << (*des)->pdg_id()
127  << " pT = " << (*des)->momentum().perp() << " eta = " << (*des)->momentum().eta() << endl;
128  }
129  break;
130  }
131  }
132  }
133  }
134 
135  // -- allow photons
136  if (ndau >= ndaughters && ndauac == ndaughters) {
137  accepted = true;
138  if (fVerbose > 0) {
139  edm::LogInfo("PythiaDauVFilter") << " accepted this decay: ";
140  for (unsigned int iv = 0; iv < vparticles.size(); ++iv) edm::LogInfo("PythiaDauVFilter") << vparticles[iv] << " ";
141  edm::LogInfo("PythiaDauVFilter") << " from mother = " << motherID << endl;
142  }
143  break;
144  }
145 
146  }
147 
148 
149  if (!accepted && chargeconju ) {
150  OK = 1;
151 
152  for (HepMC::GenEvent::particle_iterator p = myGenEvent->particles_begin();
153  p != myGenEvent->particles_end(); ++p) {
154 
155  if ((*p)->pdg_id() != -particleID) continue ;
156 
157  // -- Check for mother of this particle
158  if (0 != motherID) {
159  OK = 0;
160  for (HepMC::GenVertex::particles_in_const_iterator des = (*p)->production_vertex()->particles_in_const_begin();
161  des != (*p)->production_vertex()->particles_in_const_end();
162  ++des) {
163  if (fVerbose > 10) {
164  edm::LogInfo("PythiaDauVFilter") << "mother: " << (*des)->pdg_id() << " pT: " << (*des)->momentum().perp() << " eta: " << (*des)->momentum().eta() << endl;
165  }
166  if (abs(motherID) == abs((*des)->pdg_id())) {
167  OK = 1;
168  break;
169  }
170  }
171  }
172  if (0 == OK) continue;
173 
174  if (fVerbose > 5) {
175  edm::LogInfo("PythiaDauVFilter") << "found ID: " << (*p)->pdg_id() << " pT: " << (*p)->momentum().perp() << " eta: " << (*p)->momentum().eta() << endl;
176  }
177  vparticles.push_back((*p)->pdg_id());
178  int ndauac = 0;
179  int ndau = 0;
180  if ((*p)->end_vertex()) {
181  for (HepMC::GenVertex::particle_iterator des=(*p)->end_vertex()->particles_begin(HepMC::children);
182  des != (*p)->end_vertex()->particles_end(HepMC::children);
183  ++des) {
184  ++ndau;
185  if (fVerbose > 5) {
186  edm::LogInfo("PythiaDauVFilter") << "ID: " << (*des)->pdg_id() << " pT: " << (*des)->momentum().perp() << " eta: " << (*des)->momentum().eta() << endl;
187  }
188  for (unsigned int i=0; i<dauIDs.size(); ++i) {
189  int IDanti = -dauIDs[i];
190  if ( !(fLookupGen->particleData.isParticle( IDanti )) ) IDanti = dauIDs[i];
191  if ((*des)->pdg_id() != IDanti) continue ;
192  if (fVerbose > 5) {
193  edm::LogInfo("PythiaDauVFilter") << "i = " << i << " pT = " << (*des)->momentum().perp() << " eta = " << (*des)->momentum().eta() << endl;
194  }
195  if ((*des)->momentum().perp() > minptcut[i] &&
196  (*des)->momentum().perp() < maxptcut &&
197  (*des)->momentum().eta() > minetacut[i] &&
198  (*des)->momentum().eta() < maxetacut[i] ) {
199  ++ndauac;
200  vparticles.push_back((*des)->pdg_id());
201  if (fVerbose > 2) {
202  edm::LogInfo("PythiaDauVFilter") << " accepted this particle " << (*des)->pdg_id()
203  << " pT = " << (*des)->momentum().perp() << " eta = " << (*des)->momentum().eta() << endl;
204  }
205  break;
206  }
207  }
208  }
209  }
210  if (ndau >= ndaughters && ndauac == ndaughters ) {
211  accepted = true;
212  if (fVerbose > 0) {
213  edm::LogInfo("PythiaDauVFilter") << " accepted this anti-decay: ";
214  for (unsigned int iv = 0; iv < vparticles.size(); ++iv) edm::LogInfo("PythiaDauVFilter") << vparticles[iv] << " ";
215  edm::LogInfo("PythiaDauVFilter") << " from mother = " << motherID << endl;
216  }
217  break;
218  }
219  }
220 
221  }
222 
223  delete myGenEvent;
224  return accepted;
225 
226 }
227 
228 //define this as a plug-in
T getUntrackedParameter(std::string const &, T const &) const
std::unique_ptr< Pythia8::Pythia > fLookupGen
const double maxptcut
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
~PythiaDauVFilter() override
const edm::EDGetTokenT< edm::HepMCProduct > token_
std::vector< double > maxetacut
std::vector< int > dauIDs
std::vector< double > minetacut
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const bool chargeconju
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool filter(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
std::pair< int, edm::FunctionWithDict > OK
Definition: findMethod.cc:136
std::vector< double > minptcut
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
bool accepted(std::vector< std::string_view > const &, std::string_view)
HLT enums.
PythiaDauVFilter(const edm::ParameterSet &)