00001 // -*- C++ -*- 00002 #ifndef RIVET_Sphericity_HH 00003 #define RIVET_Sphericity_HH 00004 00005 #include "Rivet/Projection.hh" 00006 #include "Rivet/Projections/AxesDefinition.hh" 00007 #include "Rivet/Projections/FinalState.hh" 00008 #include "Rivet/Event.hh" 00009 00010 00011 namespace Rivet { 00012 00013 /** 00014 @brief Calculate the sphericity event shape. 00015 00016 The sphericity tensor (or quadratic momentum tensor) is defined as 00017 \f[ 00018 S^{\alpha \beta} = \frac{\sum_i p_i^\alpha p_i^\beta}{\sum_i |\mathbf{p}_i|^2} 00019 \f], 00020 where the Greek indices are spatial components and the Latin indices are used 00021 for sums over particles. From this, the sphericity, aplanarity and planarity can be 00022 calculated by combinations of eigenvalues. 00023 00024 Defining the three eigenvalues 00025 \f$ \lambda_1 \ge \lambda_2 \ge \lambda_3 \f$, with \f$ \lambda_1 + \lambda_2 + \lambda_3 = 1 \f$, 00026 the sphericity is 00027 \f[ 00028 S = \frac{3}{2} (\lambda_2 + \lambda_3) 00029 \f] 00030 00031 The aplanarity is \f$ A = \frac{3}{2}\lambda_3 \f$ and the planarity 00032 is \f$ P = \frac{2}{3}(S-2A) = \lambda_2 - \lambda_3 \f$. The eigenvectors define a 00033 set of spatial axes comparable with the thrust axes, but more sensitive to 00034 high momentum particles due to the quadratic sensitivity of the tensor to 00035 the particle momenta. 00036 00037 Since the sphericity is quadratic in the particle momenta, it is not an 00038 infrared safe observable in perturbative QCD. This can be fixed by adding 00039 a regularizing power of \f$r\f$ to the definition: 00040 \f[ 00041 S^{\alpha \beta} = 00042 \frac{\sum_i |\mathbf{p}_i|^{r-2} p_i^\alpha p_i^\beta} 00043 {\sum_i |\mathbf{p}_i|^r} 00044 \f] 00045 00046 \f$r\f$ is available as a constructor argument on this class and will be 00047 taken into account by the Cmp<Projection> operation, so a single analysis 00048 can use several sphericity projections with different \f$r\f$ values without 00049 fear of a clash. 00050 */ 00051 class Sphericity : public AxesDefinition { 00052 00053 public: 00054 00055 /// @name Constructors etc. 00056 //@{ 00057 00058 /// Constructor 00059 Sphericity(const FinalState& fsp, double rparam=2.0); 00060 00061 /// Clone on the heap. 00062 virtual const Projection* clone() const { 00063 return new Sphericity(*this); 00064 } 00065 00066 //@} 00067 00068 00069 protected: 00070 00071 /// Perform the projection on the Event 00072 void project(const Event& e); 00073 00074 /// Compare with other projections 00075 int compare(const Projection& p) const; 00076 00077 public: 00078 00079 /// Reset the projection 00080 void clear(); 00081 00082 /// @name Access the event shapes by name 00083 /// @{ 00084 /// Sphericity 00085 double sphericity() const { return 3.0 / 2.0 * (lambda2() + lambda3()); } 00086 /// Transverse Sphericity 00087 double transSphericity() const { return 2.0 * lambda2() / ( lambda1() + lambda2() ); } 00088 /// Planarity 00089 double planarity() const { return 2 * (sphericity() - 2 * aplanarity()) / 3.0; } 00090 /// Aplanarity 00091 double aplanarity() const { return 3 / 2.0 * lambda3(); } 00092 /// @} 00093 00094 /// @name Access the sphericity basis vectors 00095 /// @{ 00096 /// Sphericity axis 00097 const Vector3& sphericityAxis() const { return _sphAxes[0]; } 00098 /// Sphericity major axis 00099 const Vector3& sphericityMajorAxis() const { return _sphAxes[1]; } 00100 /// Sphericity minor axis 00101 const Vector3& sphericityMinorAxis() const { return _sphAxes[2]; } 00102 /// @} 00103 00104 ///@{ AxesDefinition axis accessors. 00105 const Vector3& axis1() const { return sphericityAxis(); } 00106 const Vector3& axis2() const { return sphericityMajorAxis(); } 00107 const Vector3& axis3() const { return sphericityMinorAxis(); } 00108 ///@} 00109 00110 00111 /// @name Access the momentum tensor eigenvalues 00112 /// @{ 00113 double lambda1() const { return _lambdas[0]; } 00114 double lambda2() const { return _lambdas[1]; } 00115 double lambda3() const { return _lambdas[2]; } 00116 /// @} 00117 00118 00119 /// @name Direct methods 00120 /// Ways to do the calculation directly, without engaging the caching system 00121 //@{ 00122 00123 /// Manually calculate the sphericity, without engaging the caching system 00124 void calc(const FinalState& fs); 00125 00126 /// Manually calculate the sphericity, without engaging the caching system 00127 void calc(const vector<Particle>& fsparticles); 00128 00129 /// Manually calculate the sphericity, without engaging the caching system 00130 void calc(const vector<FourMomentum>& fsmomenta); 00131 00132 /// Manually calculate the sphericity, without engaging the caching system 00133 void calc(const vector<Vector3>& fsmomenta); 00134 00135 //@} 00136 00137 00138 00139 private: 00140 /// Eigenvalues. 00141 vector<double> _lambdas; 00142 00143 /// Sphericity axes. 00144 vector<Vector3> _sphAxes; 00145 00146 /// Regularizing parameter, used to force infra-red safety. 00147 const double _regparam; 00148 00149 private: 00150 00151 /// Actually do the calculation 00152 void _calcSphericity(const vector<Vector3>& fsmomenta); 00153 00154 }; 00155 00156 } 00157 00158 00159 #endif