![]() |
|
|||
File indexing completed on 2025-05-12 09:05:03
0001 // -*- C++ -*- 0002 #ifndef RIVET_Thrust_HH 0003 #define RIVET_Thrust_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 0010 namespace Rivet { 0011 0012 0013 /// @brief Get the e+ e- thrust basis and the thrust, thrust major and thrust minor scalars. 0014 /// 0015 /// @author Andy Buckley 0016 /// 0017 /// The scalar (maximum) thrust is defined as 0018 /// \f[ 0019 /// T = \mathrm{max}_{\vec{n}} \frac{\sum_i \left|\vec{p}_i \cdot \vec{n} \right|}{\sum_i |\vec{p}_i|} 0020 /// \f], 0021 /// with the direction of the unit vector \f$ \vec{n} \f$ which maximises \f$ T \f$ 0022 /// being identified as the thrust axis. The unit vector which maximises the thrust 0023 /// scalar in the plane perpendicular to \f$ \vec{n} \f$ is the "thrust major" 0024 /// direction, and the vector perpendicular to both the thrust and thrust major directions 0025 /// is the thrust minor. Both the major and minor directions have associated thrust 0026 /// scalars. 0027 /// 0028 /// Thrust calculations have particularly simple forms for less than 4 particles, and 0029 /// in those cases this projection is computationally minimal. For 4 or more particles, 0030 /// a more general calculation must be carried out, based on the Brandt/Dahmen method 0031 /// from Z. Phys. C1 (1978). While a polynomial improvement on the exponential scaling 0032 /// of the naive method, this algorithm scales asymptotically as 0033 /// \f$ \mathcal{O}\left( n^3 \right) \f$. Be aware that the thrust may easily be the 0034 /// most computationally demanding projection in Rivet for large events! 0035 /// 0036 /// The Rivet implementation of thrust is based heavily on Stefan Gieseke's Herwig++ 0037 /// re-coding of the 'tasso' code from HERWIG. 0038 /// 0039 /// NB. special case with >= 4 coplanar particles will still fail. 0040 /// NB. Thrust assumes all momenta are in the CoM system: no explicit boost is performed. 0041 /// This can be dealt with by appropriate choice of the supplied FinalState. 0042 class Thrust : public AxesDefinition { 0043 public: 0044 0045 using AxesDefinition::operator=; 0046 0047 /// Constructor. 0048 Thrust() {} 0049 0050 Thrust(const FinalState& fsp) { 0051 setName("Thrust"); 0052 declare(fsp, "FS"); 0053 } 0054 0055 /// Clone on the heap. 0056 RIVET_DEFAULT_PROJ_CLONE(Thrust); 0057 0058 /// Import to avoid warnings about overload-hiding 0059 using Projection::operator =; 0060 0061 0062 protected: 0063 0064 /// Perform the projection on the Event 0065 void project(const Event& e) { 0066 const vector<Particle> ps 0067 = apply<FinalState>(e, "FS").particles(); 0068 calc(ps); 0069 } 0070 0071 /// Compare projections 0072 CmpState compare(const Projection& p) const { 0073 return mkNamedPCmp(p, "FS"); 0074 } 0075 0076 0077 public: 0078 0079 /// @{ Thrust scalar accessors 0080 /// The thrust scalar, \f$ T \f$, (maximum thrust). 0081 double thrust() const { return _thrusts[0]; } 0082 /// The thrust major scalar, \f$ M \f$, (thrust along thrust major axis). 0083 double thrustMajor() const { return _thrusts[1]; } 0084 /// The thrust minor scalar, \f$ m \f$, (thrust along thrust minor axis). 0085 double thrustMinor() const { return _thrusts[2]; } 0086 /// The oblateness, \f$ O = M - m \f$ . 0087 double oblateness() const { return _thrusts[1] - _thrusts[2]; } 0088 /// @} 0089 0090 /// @{ Thrust axis accessors 0091 /// The thrust axis. 0092 const Vector3& thrustAxis() const { return _thrustAxes[0]; } 0093 /// The thrust major axis (axis of max thrust perpendicular to thrust axis). 0094 const Vector3& thrustMajorAxis() const { return _thrustAxes[1]; } 0095 /// The thrust minor axis (axis perpendicular to thrust and thrust major). 0096 const Vector3& thrustMinorAxis() const { return _thrustAxes[2]; } 0097 /// @} 0098 0099 /// @{ AxesDefinition axis accessors. 0100 const Vector3& axis1() const { return thrustAxis(); } 0101 const Vector3& axis2() const { return thrustMajorAxis(); } 0102 const Vector3& axis3() const { return thrustMinorAxis(); } 0103 /// @} 0104 0105 0106 public: 0107 0108 /// @name Direct methods 0109 /// Ways to do the calculation directly, without engaging the caching system 0110 /// @{ 0111 0112 /// Manually calculate the thrust, without engaging the caching system 0113 void calc(const FinalState& fs); 0114 0115 /// Manually calculate the thrust, without engaging the caching system 0116 void calc(const vector<Particle>& fsparticles); 0117 0118 /// Manually calculate the thrust, without engaging the caching system 0119 void calc(const vector<FourMomentum>& fsmomenta); 0120 0121 /// Manually calculate the thrust, without engaging the caching system 0122 void calc(const vector<Vector3>& threeMomenta); 0123 0124 /// @} 0125 0126 0127 protected: 0128 0129 /// The thrust scalars. 0130 vector<double> _thrusts; 0131 0132 /// The thrust axes. 0133 vector<Vector3> _thrustAxes; 0134 0135 0136 protected: 0137 0138 /// Explicitly calculate the thrust values. 0139 void _calcThrust(const vector<Vector3>& fsmomenta); 0140 0141 }; 0142 0143 } 0144 0145 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |