CMS 3D CMS Logo

GenParticlesHelper.cc
Go to the documentation of this file.
3 
4 
5 using namespace reco;
6 
7 namespace GenParticlesHelper {
8 
9  void
10  findParticles(const reco::GenParticleCollection& sourceParticles, reco::GenParticleRefVector& particleRefs, int pdgId, int status ) {
11 
12  unsigned index = 0;
13  for(IG ig = sourceParticles.begin();
14  ig!= sourceParticles.end(); ++ig, ++index) {
15 
16  const GenParticle& gen = *ig;
17 
18  // status has been specified, and this one does not have the correct
19  // status
20  if(status && gen.status()!=status ) continue;
21 
22  if( std::abs(gen.pdgId()) == pdgId ) {
23  GenParticleRef genref( &sourceParticles, index );
24  particleRefs.push_back( genref );
25  }
26  }
27  }
28 
29 
30  void
32  reco::GenParticleRefVector& descendents,
33  int status, int pdgId ) {
34 
35 
36  const GenParticleRefVector& daughterRefs = base->daughterRefVector();
37 
38  for(IGR idr = daughterRefs.begin();
39  idr!= daughterRefs.end(); ++idr ) {
40 
41  if( (*idr)->status() == status &&
42  (!pdgId || std::abs((*idr)->pdgId()) == pdgId) ) {
43 
44  // cout<<"adding "<<(*idr)<<endl;
45  descendents.push_back(*idr);
46  }
47  else
48  findDescendents( *idr, descendents, status, pdgId );
49  }
50  }
51 
52 
53 
54  void
55  findSisters(const reco::GenParticleRef& baseSister,
56  GenParticleRefVector& sisterRefs) {
57 
58  assert( baseSister->numberOfMothers() > 0 );
59 
60  // get first mother
61  const GenParticleRefVector& mothers = baseSister->motherRefVector();
62 
63  // get sisters
64  const GenParticleRefVector allRefs
65  = mothers[0]->daughterRefVector();
66 
68  for(IT id = allRefs.begin();
69  id != allRefs.end();
70  ++id ) {
71 
72  if( *id == baseSister ) {
73  continue; // this is myself
74  }
75  else
76  sisterRefs.push_back( *id );
77  }
78  }
79 
80  bool
81  isDirect(const reco::GenParticleRef& particle) {
82  assert( (particle->status() != 0) && (particle->status() < 4 ) );
83  if( particle->status() == 3 )
84  return true;
85  else {
86  assert( particle->numberOfMothers() > 0 );
87 
88  // get first mother
89  const GenParticleRefVector& mothers = particle->motherRefVector();
90  if( mothers[0]->status() == 3 )
91  return true;
92  else
93  return false;
94  }
95  }
96 
97 
98  bool hasAncestor( const reco::GenParticle* particle,
99  int pdgId, int status ) {
100 
101  if( particle->pdgId() == pdgId &&
102  particle->status() == status )
103  return true;
104 
105  const GenParticleRefVector& mothers = particle->motherRefVector();
106 
107  for( IGR im = mothers.begin(); im!=mothers.end(); ++im) {
108  const GenParticle& part = **im;
109  if( hasAncestor( &part, pdgId, status) )
110  return true;
111  }
112 
113  return false;
114  }
115 
116 
117  std::ostream& operator<<( std::ostream& out,
118  const reco::GenParticleRef& genRef ) {
119 
120  if(!out) return out;
121 
122  out<<genRef.key()<<" "<<genRef->pt();
123 
124  return out;
125  }
126 
127 }
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
void findParticles(const reco::GenParticleCollection &sourceParticles, reco::GenParticleRefVector &particleRefs, int pdgId, int status)
find all particles of a given pdgId and status
bool isDirect(const reco::GenParticleRef &particle)
check if particle is direct (has status 3 or is a daughter of particle with status 3) ...
virtual int status() const final
status word
key_type key() const
Accessor for product key.
Definition: Ref.h:265
reco::GenParticleCollection::const_iterator IG
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:253
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:248
std::ostream & operator<<(std::ostream &, BeamSpot beam)
Definition: BeamSpot.cc:71
const mothers & motherRefVector() const
references to mothers
virtual int pdgId() const final
PDG identifier.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
base
Make Sure CMSSW is Setup ##.
std::vector< LinkConnSpec >::const_iterator IT
part
Definition: HCALResponse.h:20
bool hasAncestor(const reco::GenParticle *particle, int pdgId, int status)
does the particle have an ancestor with this pdgId and this status?
fixed size matrix
void push_back(value_type const &ref)
Add a Ref<C, T> to the RefVector.
Definition: RefVector.h:69
void findSisters(const reco::GenParticleRef &baseSister, reco::GenParticleRefVector &sisterRefs)
find the particles having the same daughter as baseSister
void findDescendents(const reco::GenParticleRef &base, reco::GenParticleRefVector &descendents, int status, int pdgId=0)
find all descendents of a given status and pdgId (recursive)