CMS 3D CMS Logo

PythiaMomDauFilter.cc
Go to the documentation of this file.
1 
4 
6 #include "HepMC/PythiaWrapper6_4.h"
7 #include <iostream>
8 
9 using namespace edm;
10 using namespace std;
11 
12 
14 label_(consumes<edm::HepMCProduct>(edm::InputTag(iConfig.getUntrackedParameter("moduleLabel",std::string("generator")),"unsmeared"))),
15 particleID(iConfig.getUntrackedParameter<int>("ParticleID", 0)),
16 daughterID(iConfig.getUntrackedParameter<int>("DaughterID", 0)),
17 chargeconju(iConfig.getUntrackedParameter<bool>("ChargeConjugation", true)),
18 ndaughters(iConfig.getUntrackedParameter<int>("NumberDaughters", 0)),
19 ndescendants(iConfig.getUntrackedParameter<int>("NumberDescendants", 0)),
20 minptcut(iConfig.getUntrackedParameter<double>("MinPt", 0.)),
21 maxptcut(iConfig.getUntrackedParameter<double>("MaxPt", 14000.)),
22 minetacut(iConfig.getUntrackedParameter<double>("MinEta", -10.)),
23 maxetacut(iConfig.getUntrackedParameter<double>("MaxEta", 10.)),
24 mom_minptcut(iConfig.getUntrackedParameter<double>("MomMinPt", 0.)),
25 mom_maxptcut(iConfig.getUntrackedParameter<double>("MomMaxPt", 14000.)),
26 mom_minetacut(iConfig.getUntrackedParameter<double>("MomMinEta", -10.)),
27 mom_maxetacut(iConfig.getUntrackedParameter<double>("MomMaxEta", 10.)),
28 betaBoost(iConfig.getUntrackedParameter("BetaBoost",0.))
29 {
30  //now do what ever initialization is needed
31  vector<int> defdauID;
32  defdauID.push_back(0);
33  vector<int> defdesID;
34  defdesID.push_back(0);
35  dauIDs = iConfig.getUntrackedParameter< vector<int> >("DaughterIDs", defdauID);
36  desIDs = iConfig.getUntrackedParameter< vector<int> >("DescendantsIDs", defdesID);
37 }
38 
39 
41 {
42 
43  // do anything here that needs to be done at desctruction time
44  // (e.g. close files, deallocate resources etc.)
45 
46 }
47 
48 
49 //
50 // member functions
51 //
52 
53 // ------------ method called to produce the data ------------
55 {
56  using namespace edm;
57  bool accepted = false;
58  bool mom_accepted = false;
60  iEvent.getByToken(label_, evt);
61 
62  const HepMC::GenEvent * myGenEvent = evt->GetEvent();
63  int ndauac = 0;
64  int ndau = 0;
65  int ndesac = 0;
66  int ndes = 0;
67 
68  for ( HepMC::GenEvent::particle_const_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end(); ++p ) {
69 
70  if( (*p)->pdg_id() != particleID ) continue ;
71  HepMC::FourVector mom = MCFilterZboostHelper::zboost((*p)->momentum(),betaBoost);
72  if( (*p)->momentum().perp() > mom_minptcut && (*p)->momentum().perp() < mom_maxptcut && mom.eta() > mom_minetacut && mom.eta() < mom_maxetacut ){
73  mom_accepted = true;
74  ndauac = 0;
75  ndau = 0;
76  ndesac = 0;
77  ndes = 0;
78  if ( (*p)->end_vertex() ) {
79  for ( HepMC::GenVertex::particle_iterator dau =(*p)->end_vertex()->particles_begin(HepMC::children); dau != (*p)->end_vertex()->particles_end(HepMC::children); ++dau ) {
80  ++ndau;
81  for( unsigned int i=0; i<dauIDs.size(); ++i) {
82  if( (*dau)->pdg_id() != dauIDs[i] ) continue ;
83  ++ndauac;
84  break;
85  }
86  if((*dau)->pdg_id() == daughterID){
87  for(HepMC::GenVertex::particle_iterator des = (*dau)->end_vertex()->particles_begin(HepMC::children); des != (*des)->end_vertex()->particles_end(HepMC::children); ++des ){
88  ++ndes;
89  for( unsigned int i=0; i<desIDs.size(); ++i) {
90  if( (*des)->pdg_id() != desIDs[i] ) continue ;
91  HepMC::FourVector dau_i = MCFilterZboostHelper::zboost((*des)->momentum(),betaBoost);
92  if( (*des)->momentum().perp() > minptcut && (*des)->momentum().perp() < maxptcut && dau_i.eta() > minetacut && dau_i.eta() < maxetacut ) {
93  ++ndesac;
94  break;
95  }
96  }
97  }
98  }
99  }
100  }
101  }
102  if( ndau == ndaughters && ndauac == ndaughters && mom_accepted && ndes == ndescendants && ndesac == ndescendants ) {
103  accepted = true;
104  break;
105  }
106 
107  }
108 
109 
110  if( !accepted && chargeconju ) {
111 
112  mom_accepted = false;
113  for ( HepMC::GenEvent::particle_const_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end(); ++p ) {
114 
115  if( (*p)->pdg_id() != -particleID ) continue ;
116  HepMC::FourVector mom = MCFilterZboostHelper::zboost((*p)->momentum(),betaBoost);
117  if( (*p)->momentum().perp() > mom_minptcut && (*p)->momentum().perp() < mom_maxptcut && mom.eta() > mom_minetacut && mom.eta() < mom_maxetacut ){
118  mom_accepted = true;
119  ndauac = 0;
120  ndau = 0;
121  ndesac = 0;
122  ndes = 0;
123  if ( (*p)->end_vertex() ) {
124  for ( HepMC::GenVertex::particle_iterator dau =(*p)->end_vertex()->particles_begin(HepMC::children); dau != (*p)->end_vertex()->particles_end(HepMC::children); ++dau ) {
125  ++ndau;
126  for( unsigned int i=0; i<dauIDs.size(); ++i) {
127  int IDanti = -dauIDs[i];
128  int pythiaCode = PYCOMP(dauIDs[i]);
129  int has_antipart = pydat2.kchg[3-1][pythiaCode-1];
130  if( has_antipart == 0 ) IDanti = dauIDs[i];
131  if( (*dau)->pdg_id() != IDanti ) continue ;
132  ++ndauac;
133  break;
134  }
135  int daughterIDanti = -daughterID;
136  int pythiaCode = PYCOMP(daughterID);
137  int has_antipart = pydat2.kchg[3-1][pythiaCode-1];
138  if( has_antipart == 0 ) daughterIDanti = daughterID;
139  if((*dau)->pdg_id() == daughterIDanti) {
140  for( HepMC::GenVertex::particle_iterator des = (*dau)->end_vertex()->particles_begin(HepMC::children); des != (*des)->end_vertex()->particles_end(HepMC::children); ++des ){
141  ++ndes;
142  for( unsigned int i=0; i<desIDs.size(); ++i) {
143  int IDanti = -desIDs[i];
144  int pythiaCode = PYCOMP(desIDs[i]);
145  int has_antipart = pydat2.kchg[3-1][pythiaCode-1];
146  if( has_antipart == 0 ) IDanti = desIDs[i];
147  if( (*des)->pdg_id() != IDanti ) continue ;
148  HepMC::FourVector dau_i = MCFilterZboostHelper::zboost((*des)->momentum(),betaBoost);
149  if( (*des)->momentum().perp() > minptcut && (*des)->momentum().perp() < maxptcut && dau_i.eta() > minetacut && dau_i.eta() < maxetacut ) {
150  ++ndesac;
151  break;
152  }
153  }
154  }
155  }
156  }
157  }
158  }
159  if( ndau == ndaughters && ndauac == ndaughters && mom_accepted && ndes == ndescendants && ndesac == ndescendants ) {
160  accepted = true;
161  break;
162  }
163  }
164 
165  }
166 
167  if (accepted){
168  return true; } else {return false;}
169 
170 }
HepMC::FourVector zboost(const HepMC::FourVector &, double)
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< edm::HepMCProduct > label_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
~PythiaMomDauFilter() override
std::vector< int > desIDs
#define PYCOMP
PythiaMomDauFilter(const edm::ParameterSet &)
int iEvent
Definition: GenABIO.cc:224
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
bool accepted(std::vector< std::string_view > const &, std::string_view)
std::vector< int > dauIDs
HLT enums.
bool filter(edm::Event &, const edm::EventSetup &) override