rivet is hosted by Hepforge, IPPP Durham
ParticleBase.hh
Go to the documentation of this file.
00001 #ifndef RIVET_ParticleBase_HH
00002 #define RIVET_ParticleBase_HH
00003 
00004 #include "Rivet/Config/RivetCommon.hh"
00005 #include "Rivet/Jet.fhh"
00006 #include "Rivet/Math/Vectors.hh"
00007 
00008 namespace Rivet {
00009 
00010 
00011   /// @brief Base class for particle-like things like Particle and Jet
00012   class ParticleBase {
00013   public:
00014 
00015     /// Default constructor
00016     ParticleBase() { }
00017 
00018     /// Virtual destructor
00019     virtual ~ParticleBase() { }
00020 
00021 
00022     /// @name Effective momentum accessors
00023     //@{
00024 
00025     /// Get equivalent single momentum four-vector (const).
00026     virtual const FourMomentum& momentum() const = 0;
00027     /// Get equivalent single momentum four-vector (const) (alias).
00028     const FourMomentum& mom() const { return momentum(); };
00029 
00030     /// Cast operator for conversion to FourMomentum
00031     operator const FourMomentum& () const { return momentum(); }
00032 
00033     //@}
00034 
00035 
00036     /// @name Convenience access to the effective 4-vector properties
00037     //@{
00038 
00039     /// Get the energy directly.
00040     double E() const { return momentum().E(); }
00041     /// Get the energy directly (alias).
00042     double energy() const { return momentum().E(); }
00043 
00044     /// Get the \f$ p_T \f$ directly.
00045     double pt() const { return momentum().pt(); }
00046     /// Get the \f$ p_T \f$ directly (alias).
00047     double pT() const { return pt(); }
00048     /// Get the \f$ p_T \f$ directly (alias).
00049     double perp() const { return pt(); }
00050 
00051     /// Get the \f$ p_T^2 \f$ directly.
00052     double pt2() const { return momentum().pt2(); }
00053     /// Get the \f$ p_T^2 \f$ directly (alias).
00054     double pT2() const { return pt2(); }
00055     /// Get the \f$ p_T^2 \f$ directly (alias).
00056     double perp2() const { return pt2(); }
00057 
00058     /// Get the \f$ E_T \f$ directly.
00059     double Et() const { return momentum().Et(); }
00060 
00061     /// Get the mass directly.
00062     double mass() const { return momentum().mass(); }
00063     /// Get the mass**2 directly.
00064     double mass2() const { return momentum().mass2(); }
00065 
00066     /// Get the \f$ \eta \f$ directly.
00067     double pseudorapidity() const { return momentum().eta(); }
00068     /// Get the \f$ \eta \f$ directly (alias).
00069     double eta() const { return momentum().eta(); }
00070     /// Get the \f$ |\eta| \f$ directly.
00071     double abspseudorapidity() const { return momentum().abspseudorapidity(); }
00072     /// Get the \f$ |\eta| \f$ directly (alias).
00073     double abseta() const { return momentum().abseta(); }
00074 
00075     /// Get the \f$ y \f$ directly.
00076     double rapidity() const { return momentum().rapidity(); }
00077     /// Get the \f$ y \f$ directly (alias).
00078     double rap() const { return momentum().rapidity(); }
00079     /// Get the \f$ |y| \f$ directly.
00080     double absrapidity() const { return momentum().absrapidity(); }
00081     /// Get the \f$ |y| \f$ directly (alias).
00082     double absrap() const { return momentum().absrap(); }
00083 
00084     /// Azimuthal angle \f$ \phi \f$.
00085     double azimuthalAngle(const PhiMapping mapping=ZERO_2PI) const { return momentum().azimuthalAngle(mapping); }
00086     /// Get the \f$ \phi \f$ directly.
00087     double phi(const PhiMapping mapping=ZERO_2PI) const { return momentum().phi(mapping); }
00088 
00089 
00090     /// Get the 3-momentum directly.
00091     Vector3 p3() const { return momentum().vector3(); }
00092     // /// Get the 3-momentum directly (alias).
00093     // Vector3 p() const { return momentum().vector3(); }
00094 
00095     /// x component of momentum.
00096     double px() const { return momentum().x(); }
00097     /// y component of momentum.
00098     double py() const { return momentum().y(); }
00099     /// z component of momentum.
00100     double pz() const { return momentum().z(); }
00101 
00102     /// Angle subtended by the 3-vector and the z-axis.
00103     double polarAngle() const { return momentum().polarAngle(); }
00104     /// Synonym for polarAngle.
00105     double theta() const { return momentum().theta(); }
00106 
00107     /// Angle between this vector and another
00108     double angle(const ParticleBase& v) const { return momentum().angle(v.momentum()); }
00109     /// Angle between this vector and another
00110     double angle(const FourVector& v) const { return momentum().angle(v); }
00111     /// Angle between this vector and another (3-vector)
00112     double angle(const Vector3& v3) const { return momentum().angle(v3); }
00113 
00114     //@}
00115 
00116   };
00117 
00118 
00119   /// @name deltaR, deltaEta, deltaPhi functions specifically for Particle/Jet arguments
00120   //@{
00121 
00122   inline double deltaR(const ParticleBase& p1, const ParticleBase& p2,
00123                        RapScheme scheme = PSEUDORAPIDITY) {
00124     return deltaR(p1.momentum(), p2.momentum(), scheme);
00125   }
00126 
00127   inline double deltaR(const ParticleBase& p, const FourMomentum& v,
00128                        RapScheme scheme = PSEUDORAPIDITY) {
00129     return deltaR(p.momentum(), v, scheme);
00130   }
00131 
00132   inline double deltaR(const ParticleBase& p, const FourVector& v,
00133                        RapScheme scheme = PSEUDORAPIDITY) {
00134     return deltaR(p.momentum(), v, scheme);
00135   }
00136 
00137   inline double deltaR(const ParticleBase& p, const Vector3& v) {
00138     return deltaR(p.momentum(), v);
00139   }
00140 
00141   inline double deltaR(const ParticleBase& p, double eta, double phi) {
00142     return deltaR(p.momentum(), eta, phi);
00143   }
00144 
00145   inline double deltaR(const FourMomentum& v, const ParticleBase& p,
00146                        RapScheme scheme = PSEUDORAPIDITY) {
00147     return deltaR(v, p.momentum(), scheme);
00148   }
00149 
00150   inline double deltaR(const FourVector& v, const ParticleBase& p,
00151                        RapScheme scheme = PSEUDORAPIDITY) {
00152     return deltaR(v, p.momentum(), scheme);
00153   }
00154 
00155   inline double deltaR(const Vector3& v, const ParticleBase& p) {
00156     return deltaR(v, p.momentum());
00157   }
00158 
00159   inline double deltaR(double eta, double phi, const ParticleBase& p) {
00160     return deltaR(eta, phi, p.momentum());
00161   }
00162 
00163 
00164   inline double deltaPhi(const ParticleBase& p1, const ParticleBase& p2) {
00165     return deltaPhi(p1.momentum(), p2.momentum());
00166   }
00167 
00168   inline double deltaPhi(const ParticleBase& p, const FourMomentum& v) {
00169     return deltaPhi(p.momentum(), v);
00170   }
00171 
00172   inline double deltaPhi(const ParticleBase& p, const FourVector& v) {
00173     return deltaPhi(p.momentum(), v);
00174   }
00175 
00176   inline double deltaPhi(const ParticleBase& p, const Vector3& v) {
00177     return deltaPhi(p.momentum(), v);
00178   }
00179 
00180   inline double deltaPhi(const ParticleBase& p, double phi) {
00181     return deltaPhi(p.momentum(), phi);
00182   }
00183 
00184   inline double deltaPhi(const FourMomentum& v, const ParticleBase& p) {
00185     return deltaPhi(v, p.momentum());
00186   }
00187 
00188   inline double deltaPhi(const FourVector& v, const ParticleBase& p) {
00189     return deltaPhi(v, p.momentum());
00190   }
00191 
00192   inline double deltaPhi(const Vector3& v, const ParticleBase& p) {
00193     return deltaPhi(v, p.momentum());
00194   }
00195 
00196   inline double deltaPhi(double phi, const ParticleBase& p) {
00197     return deltaPhi(phi, p.momentum());
00198   }
00199 
00200 
00201   inline double deltaEta(const ParticleBase& p1, const ParticleBase& p2) {
00202     return deltaEta(p1.momentum(), p2.momentum());
00203   }
00204 
00205   inline double deltaEta(const ParticleBase& p, const FourMomentum& v) {
00206     return deltaEta(p.momentum(), v);
00207   }
00208 
00209   inline double deltaEta(const ParticleBase& p, const FourVector& v) {
00210     return deltaEta(p.momentum(), v);
00211   }
00212 
00213   inline double deltaEta(const ParticleBase& p, const Vector3& v) {
00214     return deltaEta(p.momentum(), v);
00215   }
00216 
00217   inline double deltaEta(const ParticleBase& p, double eta) {
00218     return deltaEta(p.momentum(), eta);
00219   }
00220 
00221   inline double deltaEta(const FourMomentum& v, const ParticleBase& p) {
00222     return deltaEta(v, p.momentum());
00223   }
00224 
00225   inline double deltaEta(const FourVector& v, const ParticleBase& p) {
00226     return deltaEta(v, p.momentum());
00227   }
00228 
00229   inline double deltaEta(const Vector3& v, const ParticleBase& p) {
00230     return deltaEta(v, p.momentum());
00231   }
00232 
00233   inline double deltaEta(double eta, const ParticleBase& p) {
00234     return deltaEta(eta, p.momentum());
00235   }
00236 
00237 
00238   inline double deltaRap(const ParticleBase& p1, const ParticleBase& p2) {
00239     return deltaRap(p1.momentum(), p2.momentum());
00240   }
00241 
00242   inline double deltaRap(const ParticleBase& p, const FourMomentum& v) {
00243     return deltaRap(p.momentum(), v);
00244   }
00245 
00246   inline double deltaRap(const ParticleBase& p, double y) {
00247     return deltaRap(p.momentum(), y);
00248   }
00249 
00250   inline double deltaRap(const FourMomentum& v, const ParticleBase& p) {
00251     return deltaRap(v, p.momentum());
00252   }
00253 
00254   inline double deltaRap(double y, const ParticleBase& p) {
00255     return deltaRap(y, p.momentum());
00256   }
00257 
00258   //@}
00259 
00260 
00261 }
00262 
00263 #endif