Back to home page

EIC code displayed by LXR

 
 

    


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