![]() |
|
|||
File indexing completed on 2025-05-12 09:05:03
0001 // -*- C++ -*- 0002 #ifndef RIVET_Sphericity_HH 0003 #define RIVET_Sphericity_HH 0004 0005 #include "Rivet/Projection.hh" 0006 #include "Rivet/Projections/AxesDefinition.hh" 0007 #include "Rivet/Projections/FinalState.hh" 0008 #include "Rivet/Event.hh" 0009 #include "Rivet/Jet.fhh" 0010 0011 namespace Rivet { 0012 0013 0014 /// @brief Calculate the sphericity event shape. 0015 /// 0016 /// The sphericity tensor (or quadratic momentum tensor) is defined as 0017 /// \f[ 0018 /// S^{\alpha \beta} = \frac{\sum_i p_i^\alpha p_i^\beta}{\sum_i |\mathbf{p}_i|^2} 0019 /// \f], 0020 /// where the Greek indices are spatial components and the Latin indices are used 0021 /// for sums over particles. From this, the sphericity, aplanarity and planarity can be 0022 /// calculated by combinations of eigenvalues. 0023 /// 0024 /// Defining the three eigenvalues 0025 /// \f$ \lambda_1 \ge \lambda_2 \ge \lambda_3 \f$, with \f$ \lambda_1 + \lambda_2 + \lambda_3 = 1 \f$, 0026 /// the sphericity is 0027 /// \f[ 0028 /// S = \frac{3}{2} (\lambda_2 + \lambda_3) 0029 /// \f] 0030 /// 0031 /// The aplanarity is \f$ A = \frac{3}{2}\lambda_3 \f$ and the planarity 0032 /// is \f$ P = \frac{2}{3}(S-2A) = \lambda_2 - \lambda_3 \f$. The eigenvectors define a 0033 /// set of spatial axes comparable with the thrust axes, but more sensitive to 0034 /// high momentum particles due to the quadratic sensitivity of the tensor to 0035 /// the particle momenta. 0036 /// 0037 /// Since the sphericity is quadratic in the particle momenta, it is not an 0038 /// infrared safe observable in perturbative QCD. This can be fixed by adding 0039 /// a regularizing power of \f$r\f$ to the definition: 0040 /// \f[ 0041 /// S^{\alpha \beta} = 0042 /// \frac{\sum_i |\mathbf{p}_i|^{r-2} p_i^\alpha p_i^\beta} 0043 /// {\sum_i |\mathbf{p}_i|^r} 0044 /// \f] 0045 /// 0046 /// \f$r\f$ is available as a constructor argument on this class and will be 0047 /// taken into account by the Cmp<Projection> operation, so a single analysis 0048 /// can use several sphericity projections with different \f$r\f$ values without 0049 /// fear of a clash. 0050 /// 0051 class Sphericity : public AxesDefinition { 0052 public: 0053 0054 using AxesDefinition::operator=; 0055 0056 /// @name Constructors etc. 0057 /// @{ 0058 0059 /// Constructor 0060 Sphericity(double rparam=2.0): _regparam(rparam){} 0061 0062 Sphericity(const FinalState& fsp, double rparam=2.0); 0063 0064 /// Clone on the heap. 0065 RIVET_DEFAULT_PROJ_CLONE(Sphericity); 0066 0067 /// @} 0068 0069 /// Import to avoid warnings about overload-hiding 0070 using Projection::operator =; 0071 0072 0073 protected: 0074 0075 /// Perform the projection on the Event 0076 void project(const Event& e); 0077 0078 /// Compare with other projections 0079 CmpState compare(const Projection& p) const; 0080 0081 0082 public: 0083 0084 /// Reset the projection 0085 void clear(); 0086 0087 /// @name Access the event shapes by name 0088 /// @{ 0089 /// Sphericity 0090 double sphericity() const { return 3.0 / 2.0 * (lambda2() + lambda3()); } 0091 /// Transverse sphericity 0092 double transSphericity() const { return 2.0 * lambda2() / ( lambda1() + lambda2() ); } 0093 /// Planarity 0094 double planarity() const { return 2 * (sphericity() - 2 * aplanarity()) / 3.0; } 0095 /// Aplanarity 0096 double aplanarity() const { return 3 / 2.0 * lambda3(); } 0097 /// @} 0098 0099 0100 /// @name Access the sphericity basis vectors 0101 /// @{ 0102 /// Sphericity axis 0103 const Vector3& sphericityAxis() const { return _sphAxes[0]; } 0104 /// Sphericity major axis 0105 const Vector3& sphericityMajorAxis() const { return _sphAxes[1]; } 0106 /// Sphericity minor axis 0107 const Vector3& sphericityMinorAxis() const { return _sphAxes[2]; } 0108 /// @} 0109 0110 0111 /// @name AxesDefinition axis accessors 0112 /// @{ 0113 const Vector3& axis1() const { return sphericityAxis(); } 0114 const Vector3& axis2() const { return sphericityMajorAxis(); } 0115 const Vector3& axis3() const { return sphericityMinorAxis(); } 0116 /// @} 0117 0118 0119 /// @name Access the momentum tensor eigenvalues 0120 /// @{ 0121 double lambda1() const { return _lambdas[0]; } 0122 double lambda2() const { return _lambdas[1]; } 0123 double lambda3() const { return _lambdas[2]; } 0124 /// @} 0125 0126 Vector3 mkEigenVector(Matrix3 A, const double &lambda); 0127 0128 /// @name Direct methods 0129 /// Ways to do the calculation directly, without engaging the caching system 0130 /// @{ 0131 0132 /// Manually calculate the sphericity, without engaging the caching system 0133 void calc(const FinalState& fs); 0134 0135 /// Manually calculate the sphericity, without engaging the caching system 0136 void calc(const Particles& particles); 0137 0138 /// Manually calculate the sphericity, without engaging the caching system 0139 void calc(const Jets& jets); 0140 0141 /// Manually calculate the sphericity, without engaging the caching system 0142 void calc(const vector<FourMomentum>& momenta); 0143 0144 /// @brief Manually calculate the sphericity, without engaging the caching system 0145 /// 0146 /// This one actually does the calculation 0147 void calc(const vector<Vector3>& momenta); 0148 0149 /// @} 0150 0151 0152 protected: 0153 0154 /// Eigenvalues. 0155 vector<double> _lambdas; 0156 0157 /// Sphericity axes. 0158 vector<Vector3> _sphAxes; 0159 0160 /// Regularizing parameter, used to force infra-red safety. 0161 const double _regparam; 0162 0163 }; 0164 0165 0166 } 0167 0168 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |