CMS 3D CMS Logo

PythiaFilterMotherSister.cc
Go to the documentation of this file.
1 
4 
6 #include <iostream>
7 
8 using namespace edm;
9 using namespace std;
10 
12  : token_(consumes<edm::HepMCProduct>(
13  edm::InputTag(iConfig.getUntrackedParameter("moduleLabel", std::string("generator")), "unsmeared"))),
14  particleID(iConfig.getUntrackedParameter("ParticleID", 0)),
15  minpcut(iConfig.getUntrackedParameter("MinP", 0.)),
16  maxpcut(iConfig.getUntrackedParameter("MaxP", 10000.)),
17  minptcut(iConfig.getUntrackedParameter("MinPt", 0.)),
18  maxptcut(iConfig.getUntrackedParameter("MaxPt", 10000.)),
19  minetacut(iConfig.getUntrackedParameter("MinEta", -10.)),
20  maxetacut(iConfig.getUntrackedParameter("MaxEta", 10.)),
21  minrapcut(iConfig.getUntrackedParameter("MinRapidity", -20.)),
22  maxrapcut(iConfig.getUntrackedParameter("MaxRapidity", 20.)),
23  minphicut(iConfig.getUntrackedParameter("MinPhi", -3.5)),
24  maxphicut(iConfig.getUntrackedParameter("MaxPhi", 3.5)),
25  betaBoost(iConfig.getUntrackedParameter("BetaBoost", 0.)),
26  motherIDs(iConfig.getUntrackedParameter("MotherIDs", std::vector<int>{0})),
27  sisterID(iConfig.getUntrackedParameter("SisterID", 0)),
28  maxSisDisplacement(iConfig.getUntrackedParameter("MaxSisterDisplacement", -1.)),
29  nephewIDs(iConfig.getUntrackedParameter("NephewIDs", std::vector<int>{0})),
30  minNephewPts(iConfig.getUntrackedParameter("MinNephewPts", std::vector<double>{0.})) {
31  if (nephewIDs.size() != minNephewPts.size()) {
32  throw cms::Exception("BadConfig") << "PythiaFilterMotherSister: "
33  << "'nephewIDs' and 'minNephewPts' need same length.";
34  }
35 }
36 
38  // do anything here that needs to be done at desctruction time
39  // (e.g. close files, deallocate resources etc.)
40 }
41 
42 //
43 // member functions
44 //
45 
46 // ------------ method called to produce the data ------------
48  using namespace edm;
50  iEvent.getByToken(token_, evt);
51 
52  const HepMC::GenEvent* myGenEvent = evt->GetEvent();
53 
54  for (HepMC::GenEvent::particle_const_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end();
55  ++p) {
56  HepMC::FourVector mom = MCFilterZboostHelper::zboost((*p)->momentum(), betaBoost);
57  double rapidity = 0.5 * log((mom.e() + mom.pz()) / (mom.e() - mom.pz()));
58 
59  if (abs((*p)->pdg_id()) == particleID && mom.rho() > minpcut && mom.rho() < maxpcut &&
60  (*p)->momentum().perp() > minptcut && (*p)->momentum().perp() < maxptcut && mom.eta() > minetacut &&
61  mom.eta() < maxetacut && rapidity > minrapcut && rapidity < maxrapcut && (*p)->momentum().phi() > minphicut &&
62  (*p)->momentum().phi() < maxphicut) {
63  HepMC::GenParticle* mother = (*((*p)->production_vertex()->particles_in_const_begin()));
64 
65  // check various possible mothers
66  for (auto motherID : motherIDs) {
67  if (abs(mother->pdg_id()) == abs(motherID)) {
68  // loop over its daughters
69  for (HepMC::GenVertex::particle_iterator dau = mother->end_vertex()->particles_begin(HepMC::children);
70  dau != mother->end_vertex()->particles_end(HepMC::children);
71  ++dau) {
72  // find the daugther you're interested in
73  if (abs((*dau)->pdg_id()) == abs(sisterID)) {
74  int failNephewPt = 0;
75 
76  // check pt of the nephews
77  for (HepMC::GenVertex::particle_iterator nephew = (*dau)->end_vertex()->particles_begin(HepMC::children);
78  nephew != (*dau)->end_vertex()->particles_end(HepMC::children);
79  ++nephew) {
80  int nephew_pdgId = abs((*nephew)->pdg_id());
81 
82  for (unsigned int i = 0; i < nephewIDs.size(); i++) {
83  if (nephew_pdgId == abs(nephewIDs.at(i)))
84  failNephewPt += ((*nephew)->momentum().perp() < minNephewPts.at(i));
85  }
86  }
87  if (failNephewPt > 0)
88  return false;
89 
90  // calculate displacement of the sister particle, from production to decay
91  HepMC::GenVertex* v1 = (*dau)->production_vertex();
92  HepMC::GenVertex* v2 = (*dau)->end_vertex();
93 
94  double lx12 = v1->position().x() - v2->position().x();
95  double ly12 = v1->position().y() - v2->position().y();
96  double lxy12 = sqrt(lx12 * lx12 + ly12 * ly12);
97 
98  if (maxSisDisplacement != -1) {
99  if (lxy12 < maxSisDisplacement) {
100  return true;
101  }
102  } else {
103  return true;
104  }
105  }
106  }
107  }
108  }
109  }
110  }
111 
112  return false;
113 }
HepMC::FourVector zboost(const HepMC::FourVector &, double)
PythiaFilterMotherSister(const edm::ParameterSet &)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
std::vector< double > minNephewPts
int iEvent
Definition: GenABIO.cc:224
T sqrt(T t)
Definition: SSEVec.h:18
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
bool filter(edm::StreamID, edm::Event &, const edm::EventSetup &) const override
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
HLT enums.
const edm::EDGetTokenT< edm::HepMCProduct > token_