/usr/include/Rivet/Projections/Hemispheres.hh is in librivet-dev 1.8.3-1.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | // -*- C++ -*-
#ifndef RIVET_Hemispheres_HH
#define RIVET_Hemispheres_HH
#include "Rivet/Projection.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/AxesDefinition.hh"
#include "Rivet/Event.hh"
namespace Rivet {
/// @brief Calculate the hemisphere masses and broadenings.
///
/// Calculate the hemisphere masses and broadenings, with event hemispheres
/// defined by the plane normal to the thrust vector, \f$ \vec{n}_\mathrm{T} \f$.
///
/// The "high" hemisphere mass,
/// \f$ M^2_\mathrm{high} / E^2_\mathrm{vis} \f$, is defined as
/// \f[
/// \frac{M^2_\mathrm{high}}{E^2_\mathrm{vis}} =
/// \frac{1}{E^2_\mathrm{vis}} \max
/// \left(
/// \left| \sum_{\vec{p}_k \cdot \vec{n}_\mathrm{T} > 0} p_k \right|^2 ,
/// \left| \sum_{\vec{p}_k \cdot \vec{n}_\mathrm{T} < 0} p_k \right|^2
/// \right)
/// \f]
/// and the corresponding "low" hemisphere mass,
/// \f$ M^2_\mathrm{low} / E^2_\mathrm{vis} \f$,
/// is the sum of momentum vectors in the opposite hemisphere, i.e.
/// \f$ \max \rightarrow \min \f$ in the formula above.
///
/// Finally, we define a hemisphere mass difference:
/// \f[
/// \frac{M^2_\mathrm{diff} }{ E^2_\mathrm{vis}} =
/// \frac{ M^2_\mathrm{high} - M^2_\mathrm{low} }{ E^2_\mathrm{vis}} .
/// \f]
///
/// Similarly to the masses, we also define hemisphere broadenings, using the
/// momenta transverse to the thrust axis:
/// \f[
/// B_\pm =
/// \frac{
/// \sum{\pm \vec{p}_i \cdot \vec{n}_\mathrm{T} > 0}
/// |\vec{p}_i \times \vec{n}_\mathrm{T} |
/// }{
/// 2 \sum_i | \vec{p}_i |
/// }
/// \f]
/// and then a set of the broadening maximum, minimum, sum and difference as follows:
/// \f[ B_\mathrm{max} = \max(B_+, B_-) \f]
/// \f[ B_\mathrm{min} = \min(B_+, B_-) \f]
/// \f[ B_\mathrm{sum} = B_+ + B_- \f]
/// \f[ B_\mathrm{diff} = |B_+ - B_-| \f]
///
/// Internally, this projection uses a Thrust or Sphericity projection to
/// determine the hemisphere orientation.
class Hemispheres : public Projection {
public:
/// Constructor.
Hemispheres(const AxesDefinition& ax) {
setName("Hemispheres");
addProjection(ax, "Axes");
clear();
}
/// Clone on the heap.
virtual const Projection* clone() const {
return new Hemispheres(*this);
}
// Reset the projection
void clear() {
_E2vis = -1;
_M2high = -1;
_M2low = -1;
_Bmax = -1;
_Bmin = -1;
_highMassEqMaxBroad = true;
}
protected:
/// Perform the projection on the Event.
void project(const Event& e);
/// Compare with other projections.
int compare(const Projection& p) const {
return mkNamedPCmp(p, "Axes");
}
public:
/// @name Hemisphere masses (scaled by \f$ 1 / E^2_\mathrm{vis} \f$).
//@{
double E2vis() const { return _E2vis; }
double Evis() const { return sqrt(_E2vis); }
double M2high() const { return _M2high; }
double Mhigh() const { return sqrt(M2high()); }
double M2low() const { return _M2low; }
double Mlow() const { return sqrt(M2low()); }
double M2diff() const { return _M2high -_M2low; }
double Mdiff() const { return sqrt(M2diff()); }
double scaledM2high() const {
if (isZero(_M2high)) return 0.0;
if (!isZero(_E2vis)) return _M2high/_E2vis;
else return std::numeric_limits<double>::max();
}
double scaledMhigh() const { return sqrt(scaledM2high()); }
double scaledM2low() const {
if (isZero(_M2low)) return 0.0;
if (!isZero(_E2vis)) return _M2low/_E2vis;
else return std::numeric_limits<double>::max();
}
double scaledMlow() const { return sqrt(scaledM2low()); }
double scaledM2diff() const {
if (M2diff() == 0.0) return 0.0;
if (_E2vis != 0.0) return M2diff()/_E2vis;
else return std::numeric_limits<double>::max();
}
double scaledMdiff() const { return sqrt(scaledM2diff()); }
//@}
/// @name Hemisphere broadenings.
//@{
double Bmax() const { return _Bmax; }
double Bmin() const { return _Bmin; }
double Bsum() const { return _Bmax + _Bmin; }
double Bdiff() const { return fabs(_Bmax - _Bmin); } // <- fabs(), just in case...
//@}
/// Is the hemisphere with the max mass the same as the one with the max broadening?
bool massMatchesBroadening() {
return _highMassEqMaxBroad;
}
private:
/// Visible energy-squared, \f$ E^2_\mathrm{vis} \f$.
double _E2vis;
/// Hemisphere mass variables.
double _M2high, _M2low;
/// Hemisphere broadening variables.
double _Bmax, _Bmin;
/// Is the hemisphere with the max mass the same as the one with the max broadening?
bool _highMassEqMaxBroad;
};
}
#endif
|