Rivet  1.8.3
Particle.hh
1 // -*- C++ -*-
2 #ifndef RIVET_Particle_HH
3 #define RIVET_Particle_HH
4 
5 #include "Rivet/Rivet.hh"
6 #include "Rivet/Particle.fhh"
7 #include "Rivet/ParticleBase.hh"
8 #include "Rivet/ParticleName.hh"
9 #include "Rivet/Math/Vectors.hh"
10 #include "Rivet/Tools/Logging.hh"
11 
12 namespace Rivet {
13 
14 
16  class Particle : public ParticleBase {
17  public:
18 
22  : ParticleBase(),
23  _original(0), _id(0), _momentum()
24  { }
25 
27  Particle(PdgId pid, const FourMomentum& mom)
28  : ParticleBase(),
29  _original(0), _id(pid), _momentum(mom)
30  { }
31 
33  Particle(const GenParticle& gp)
34  : ParticleBase(),
35  _original(&gp), _id(gp.pdg_id()),
36  _momentum(gp.momentum())
37  { }
38 
39 
40  public:
41 
43  const GenParticle& genParticle() const {
44  assert(_original);
45  return *_original;
46  }
47 
48 
50  bool hasGenParticle() const {
51  return bool(_original);
52  }
53 
54 
56  PdgId pdgId() const {
57  return _id;
58  }
59 
60 
63  _momentum = momentum;
64  return *this;
65  }
66 
68  const FourMomentum& momentum() const {
69  return _momentum;
70  }
71 
73  double energy() const {
74  return momentum().E();
75  }
76 
78  double mass() const {
79  return momentum().mass();
80  }
81 
82 
84  // /// The charge of this Particle.
85  // double charge() const {
86  // return PID::charge(*this);
87  // }
88 
90  // /// Three times the charge of this Particle (i.e. integer multiple of smallest quark charge).
91  // int threeCharge() const {
92  // return PID::threeCharge(*this);
93  // }
94 
100  bool hasAncestor(PdgId pdg_id) const;
101 
110  bool fromDecay() const;
111 
113 
114 
115  private:
116 
118  const GenParticle* _original;
119 
121  PdgId _id;
122 
124  FourMomentum _momentum;
125  };
126 
127 
129 
130 
132  inline std::string toString(const ParticlePair& pair) {
133  stringstream out;
134  out << "["
135  << toParticleName(pair.first.pdgId()) << " @ "
136  << pair.first.momentum().E()/GeV << " GeV, "
137  << toParticleName(pair.second.pdgId()) << " @ "
138  << pair.second.momentum().E()/GeV << " GeV]";
139  return out.str();
140  }
141 
143  inline std::ostream& operator<<(std::ostream& os, const ParticlePair& pp) {
144  os << toString(pp);
145  return os;
146  }
147 
149 
150 
152 
153  inline bool cmpParticleByPt(const Particle& a, const Particle& b) {
155  return a.momentum().pT() > b.momentum().pT();
156  }
158  inline bool cmpParticleByAscPt(const Particle& a, const Particle& b) {
159  return a.momentum().pT() < b.momentum().pT();
160  }
162  inline bool cmpParticleByP(const Particle& a, const Particle& b) {
163  return a.momentum().vector3().mod() > b.momentum().vector3().mod();
164  }
166  inline bool cmpParticleByAscP(const Particle& a, const Particle& b) {
167  return a.momentum().vector3().mod() < b.momentum().vector3().mod();
168  }
170  inline bool cmpParticleByEt(const Particle& a, const Particle& b) {
171  return a.momentum().Et() > b.momentum().Et();
172  }
174  inline bool cmpParticleByAscEt(const Particle& a, const Particle& b) {
175  return a.momentum().Et() < b.momentum().Et();
176  }
178  inline bool cmpParticleByE(const Particle& a, const Particle& b) {
179  return a.momentum().E() > b.momentum().E();
180  }
182  inline bool cmpParticleByAscE(const Particle& a, const Particle& b) {
183  return a.momentum().E() < b.momentum().E();
184  }
186  inline bool cmpParticleByDescPseudorapidity(const Particle& a, const Particle& b) {
187  return a.momentum().pseudorapidity() > b.momentum().pseudorapidity();
188  }
190  inline bool cmpParticleByAscPseudorapidity(const Particle& a, const Particle& b) {
191  return a.momentum().pseudorapidity() < b.momentum().pseudorapidity();
192  }
194  inline bool cmpParticleByDescAbsPseudorapidity(const Particle& a, const Particle& b) {
195  return fabs(a.momentum().pseudorapidity()) > fabs(b.momentum().pseudorapidity());
196  }
198  inline bool cmpParticleByAscAbsPseudorapidity(const Particle& a, const Particle& b) {
199  return fabs(a.momentum().pseudorapidity()) < fabs(b.momentum().pseudorapidity());
200  }
202  inline bool cmpParticleByDescRapidity(const Particle& a, const Particle& b) {
203  return a.momentum().rapidity() > b.momentum().rapidity();
204  }
206  inline bool cmpParticleByAscRapidity(const Particle& a, const Particle& b) {
207  return a.momentum().rapidity() < b.momentum().rapidity();
208  }
210  inline bool cmpParticleByDescAbsRapidity(const Particle& a, const Particle& b) {
211  return fabs(a.momentum().rapidity()) > fabs(b.momentum().rapidity());
212  }
214  inline bool cmpParticleByAscAbsRapidity(const Particle& a, const Particle& b) {
215  return fabs(a.momentum().rapidity()) < fabs(b.momentum().rapidity());
216  }
218 
219  inline double deltaR(const Particle& p1, const Particle& p2,
220  RapScheme scheme = PSEUDORAPIDITY) {
221  return deltaR(p1.momentum(), p2.momentum(), scheme);
222  }
223 
224  inline double deltaR(const Particle& p, const FourMomentum& v,
225  RapScheme scheme = PSEUDORAPIDITY) {
226  return deltaR(p.momentum(), v, scheme);
227  }
228 
229  inline double deltaR(const Particle& p, const FourVector& v,
230  RapScheme scheme = PSEUDORAPIDITY) {
231  return deltaR(p.momentum(), v, scheme);
232  }
233 
234  inline double deltaR(const Particle& p, const Vector3& v) {
235  return deltaR(p.momentum(), v);
236  }
237 
238  inline double deltaR(const Particle& p, double eta, double phi) {
239  return deltaR(p.momentum(), eta, phi);
240  }
241 
242  inline double deltaR(const FourMomentum& v, const Particle& p,
243  RapScheme scheme = PSEUDORAPIDITY) {
244  return deltaR(v, p.momentum(), scheme);
245  }
246 
247  inline double deltaR(const FourVector& v, const Particle& p,
248  RapScheme scheme = PSEUDORAPIDITY) {
249  return deltaR(v, p.momentum(), scheme);
250  }
251 
252  inline double deltaR(const Vector3& v, const Particle& p) {
253  return deltaR(v, p.momentum());
254  }
255 
256  inline double deltaR(double eta, double phi, const Particle& p) {
257  return deltaR(eta, phi, p.momentum());
258  }
259 
260 
261  inline double deltaPhi(const Particle& p1, const Particle& p2) {
262  return deltaPhi(p1.momentum(), p2.momentum());
263  }
264 
265  inline double deltaPhi(const Particle& p, const FourMomentum& v) {
266  return deltaPhi(p.momentum(), v);
267  }
268 
269  inline double deltaPhi(const Particle& p, const FourVector& v) {
270  return deltaPhi(p.momentum(), v);
271  }
272 
273  inline double deltaPhi(const Particle& p, const Vector3& v) {
274  return deltaPhi(p.momentum(), v);
275  }
276 
277  inline double deltaPhi(const Particle& p, double phi) {
278  return deltaPhi(p.momentum(), phi);
279  }
280 
281  inline double deltaPhi(const FourMomentum& v, const Particle& p) {
282  return deltaPhi(v, p.momentum());
283  }
284 
285  inline double deltaPhi(const FourVector& v, const Particle& p) {
286  return deltaPhi(v, p.momentum());
287  }
288 
289  inline double deltaPhi(const Vector3& v, const Particle& p) {
290  return deltaPhi(v, p.momentum());
291  }
292 
293  inline double deltaPhi(double phi, const Particle& p) {
294  return deltaPhi(phi, p.momentum());
295  }
296 
297 
298  inline double deltaEta(const Particle& p1, const Particle& p2) {
299  return deltaEta(p1.momentum(), p2.momentum());
300  }
301 
302  inline double deltaEta(const Particle& p, const FourMomentum& v) {
303  return deltaEta(p.momentum(), v);
304  }
305 
306  inline double deltaEta(const Particle& p, const FourVector& v) {
307  return deltaEta(p.momentum(), v);
308  }
309 
310  inline double deltaEta(const Particle& p, const Vector3& v) {
311  return deltaEta(p.momentum(), v);
312  }
313 
314  inline double deltaEta(const Particle& p, double eta) {
315  return deltaEta(p.momentum(), eta);
316  }
317 
318  inline double deltaEta(const FourMomentum& v, const Particle& p) {
319  return deltaEta(v, p.momentum());
320  }
321 
322  inline double deltaEta(const FourVector& v, const Particle& p) {
323  return deltaEta(v, p.momentum());
324  }
325 
326  inline double deltaEta(const Vector3& v, const Particle& p) {
327  return deltaEta(v, p.momentum());
328  }
329 
330  inline double deltaEta(double eta, const Particle& p) {
331  return deltaEta(eta, p.momentum());
332  }
333 
334 }
335 
336 #endif
int PdgId
Typedef for a PDG ID code.
Definition: Particle.fhh:29
bool cmpParticleByAscP(const Particle &a, const Particle &b)
Sort by ascending momentum, .
Definition: Particle.hh:166
bool cmpParticleByEt(const Particle &a, const Particle &b)
Sort by descending transverse energy, .
Definition: Particle.hh:170
const FourMomentum & momentum() const
The momentum of this Particle.
Definition: Particle.hh:68
bool cmpParticleByAscAbsRapidity(const Particle &a, const Particle &b)
Sort by ascending absolute rapidity, .
Definition: Particle.hh:214
double E() const
Get energy (time component of momentum).
Definition: Vector4.hh:355
Particle(const GenParticle &gp)
Constructor from a HepMC GenParticle.
Definition: Particle.hh:33
bool cmpParticleByAscRapidity(const Particle &a, const Particle &b)
Sort by ascending rapidity, .
Definition: Particle.hh:206
double mod() const
Calculate the modulus of a vector. .
Definition: VectorN.hh:87
Vector3 vector3() const
Get the spatial part of the 4-vector as a 3-vector.
Definition: Vector4.hh:139
double phi(const Vector3 &v, const PhiMapping mapping=ZERO_2PI)
Synonym for azimuthalAngle.
Definition: Vector3.hh:281
Representation of particles from a HepMC::GenEvent.
Definition: Particle.hh:16
PdgId pdgId() const
The PDG ID code for this Particle.
Definition: Particle.hh:56
double mass() const
The mass of this Particle.
Definition: Particle.hh:78
bool cmpParticleByAscPt(const Particle &a, const Particle &b)
Sort by ascending transverse momentum, .
Definition: Particle.hh:158
double pT() const
Calculate the transverse momentum .
Definition: Vector4.hh:410
bool hasAncestor(PdgId pdg_id) const
Definition: Particle.cc:8
bool cmpParticleByAscE(const Particle &a, const Particle &b)
Sort by ascending energy, .
Definition: Particle.hh:182
std::pair< Particle, Particle > ParticlePair
Typedef for a pair of Particle objects.
Definition: Particle.fhh:20
bool fromDecay() const
Determine whether the particle is from a hadron or tau decay.
Definition: Particle.cc:19
bool cmpParticleByDescRapidity(const Particle &a, const Particle &b)
Sort by descending rapidity, .
Definition: Particle.hh:202
double mass() const
Get the mass (the Lorentz self-invariant).
Definition: Vector4.hh:384
bool cmpParticleByDescAbsRapidity(const Particle &a, const Particle &b)
Sort by descending absolute rapidity, .
Definition: Particle.hh:210
double energy() const
The energy of this Particle.
Definition: Particle.hh:73
bool cmpParticleByAscPseudorapidity(const Particle &a, const Particle &b)
Sort by ascending pseudorapidity, .
Definition: Particle.hh:190
const std::string & toParticleName(PdgId p)
Print a PdgId as a named string.
Definition: ParticleName.hh:142
Base class for particle-like things like Particle and Jet.
Definition: ParticleBase.hh:11
double pseudorapidity() const
Pseudorapidity (defined purely by the 3-vector components)
Definition: Vector4.hh:129
bool cmpParticleByAscEt(const Particle &a, const Particle &b)
Sort by ascending transverse energy, .
Definition: Particle.hh:174
Particle()
Definition: Particle.hh:21
RapScheme
Enum for rapidity variable to be used in calculating , applying rapidity cuts, etc.
Definition: MathHeader.hh:60
const GenParticle & genParticle() const
Get a const reference to the original GenParticle.
Definition: Particle.hh:43
bool cmpParticleByDescAbsPseudorapidity(const Particle &a, const Particle &b)
Sort by descending absolute pseudorapidity, .
Definition: Particle.hh:194
bool cmpParticleByE(const Particle &a, const Particle &b)
Sort by descending energy, .
Definition: Particle.hh:178
bool hasGenParticle() const
Check if the particle corresponds to a GenParticle.
Definition: Particle.hh:50
double Et() const
Calculate the transverse energy .
Definition: Vector4.hh:420
Particle & setMomentum(const FourMomentum &momentum)
Set the momentum of this Particle.
Definition: Particle.hh:62
std::string toString(const AnalysisInfo &ai)
String representation.
Definition: AnalysisInfo.cc:234
double eta(const Vector3 &v)
Synonym for pseudorapidity.
Definition: Vector3.hh:299
bool cmpParticleByP(const Particle &a, const Particle &b)
Sort by descending momentum, .
Definition: Particle.hh:162
bool cmpParticleByPt(const Particle &a, const Particle &b)
Sort by descending transverse momentum, .
Definition: Particle.hh:154
bool cmpParticleByDescPseudorapidity(const Particle &a, const Particle &b)
Sort by descending pseudorapidity, .
Definition: Particle.hh:186
std::ostream & operator<<(std::ostream &os, const AnalysisInfo &ai)
Stream an AnalysisInfo as a text description.
Definition: AnalysisInfo.hh:239
double rapidity() const
Calculate the rapidity.
Definition: Vector4.hh:400
Specialized version of the FourVector with momentum/energy functionality.
Definition: Vector4.hh:324
Particle(PdgId pid, const FourMomentum &mom)
Constructor without GenParticle.
Definition: Particle.hh:27
bool cmpParticleByAscAbsPseudorapidity(const Particle &a, const Particle &b)
Sort by ascending absolute pseudorapidity, .
Definition: Particle.hh:198