00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef __FASTJET_PSEUDOJET_HH__
00036 #define __FASTJET_PSEUDOJET_HH__
00037
00038 #include<valarray>
00039 #include<vector>
00040 #include<cassert>
00041 #include <cmath>
00042 #include "fastjet/internal/numconsts.hh"
00043
00044 FASTJET_BEGIN_NAMESPACE
00045
00046
00047
00050 const double MaxRap = 1e5;
00051
00054 class PseudoJet {
00055 public:
00056 PseudoJet() {};
00058 PseudoJet(const double px, const double py, const double pz, const double E);
00060 template <class L> PseudoJet(const L & some_four_vector) ;
00061
00062
00063
00064
00065
00066
00067 inline double E() const {return _E;};
00068 inline double e() const {return _E;};
00069 inline double px() const {return _px;};
00070 inline double py() const {return _py;};
00071 inline double pz() const {return _pz;};
00072
00074 inline const double phi() const {return phi_02pi();};
00075
00077 inline const double phi_std() const {
00078 return _phi > pi ? _phi-twopi : _phi;};
00079
00081 inline const double phi_02pi() const {return _phi;};
00082
00085 inline double rap() const {return _rap;};
00086
00088 inline double rapidity() const {return _rap;};
00089
00091 inline double kt2() const {return _kt2;};
00093 inline double perp2() const {return _kt2;};
00095 inline double perp() const {return sqrt(_kt2);};
00097 inline double m2() const {return (_E+_pz)*(_E-_pz)-_kt2;};
00099 inline double mperp2() const {return (_E+_pz)*(_E-_pz);};
00101 inline double mperp() const {return sqrt(std::abs(mperp2()));};
00104 inline double m() const;
00106 double operator () (int i) const ;
00108 inline double operator [] (int i) const { return (*this)(i); };
00109
00110
00111 enum { X=0, Y=1, Z=2, T=3, NUM_COORDINATES=4, SIZE=NUM_COORDINATES };
00112
00113
00116 inline const int & cluster_hist_index() const {return _cluster_hist_index;};
00118 inline void set_cluster_hist_index(const int index) {_cluster_hist_index = index;};
00119
00121 inline const int cluster_sequence_history_index() const {
00122 return cluster_hist_index();};
00125 inline void set_cluster_sequence_history_index(const int index) {
00126 set_cluster_hist_index(index);};
00127
00128
00130 inline const int & user_index() const {return _user_index;};
00132 inline void set_user_index(const int index) {_user_index = index;};
00133
00136 std::valarray<double> four_mom() const;
00137
00139 double kt_distance(const PseudoJet & other) const;
00140
00142 double plain_distance(const PseudoJet & other) const;
00145 inline double squared_distance(const PseudoJet & other) const {
00146 return plain_distance(other);};
00147
00149
00150
00151
00152
00154 inline double beam_distance() const {return _kt2;};
00155
00156
00157 void operator*=(double);
00158 void operator/=(double);
00159 void operator+=(const PseudoJet &);
00160 void operator-=(const PseudoJet &);
00161
00162 private:
00163
00164 double _px,_py,_pz,_E;
00165 double _phi, _rap, _kt2;
00166 int _cluster_hist_index, _user_index;
00167 void _finish_init();
00168
00169 };
00170
00171
00172
00173
00174
00175 PseudoJet operator+(const PseudoJet &, const PseudoJet &);
00176 PseudoJet operator-(const PseudoJet &, const PseudoJet &);
00177 PseudoJet operator*(double, const PseudoJet &);
00178 PseudoJet operator*(const PseudoJet &, double);
00179 PseudoJet operator/(const PseudoJet &, double);
00180
00182 bool have_same_momentum(const PseudoJet &, const PseudoJet &);
00183
00184
00185
00186
00188 std::vector<PseudoJet> sorted_by_pt(const std::vector<PseudoJet> & jets);
00189
00191 std::vector<PseudoJet> sorted_by_rapidity(const std::vector<PseudoJet> & jets);
00192
00194 std::vector<PseudoJet> sorted_by_E(const std::vector<PseudoJet> & jets);
00195
00196
00197
00198
00201 void sort_indices(std::vector<int> & indices,
00202 const std::vector<double> & values);
00203
00208 template<class T> std::vector<T> objects_sorted_by_values(const std::vector<T> & objects,
00209 const std::vector<double> & values);
00210
00212 class IndexedSortHelper {
00213 public:
00214 inline IndexedSortHelper (const std::vector<double> * reference_values) {
00215 _ref_values = reference_values;
00216 };
00217 inline int operator() (const int & i1, const int & i2) const {
00218 return (*_ref_values)[i1] < (*_ref_values)[i2];
00219 };
00220 private:
00221 const std::vector<double> * _ref_values;
00222 };
00223
00224
00225
00227
00228
00229 template <class L> inline PseudoJet::PseudoJet(const L & some_four_vector) {
00230
00231 _px = some_four_vector[0];
00232 _py = some_four_vector[1];
00233 _pz = some_four_vector[2];
00234 _E = some_four_vector[3];
00235 this->_finish_init();
00236
00237 set_cluster_hist_index(-1);
00238 set_user_index(-1);
00239 }
00240
00241
00249
00250
00251 inline double PseudoJet::m() const {
00252 double mm = m2();
00253 return mm < 0.0 ? -std::sqrt(-mm) : std::sqrt(mm);
00254 }
00255
00256
00257 FASTJET_END_NAMESPACE
00258
00259 #endif // __FASTJET_PSEUDOJET_HH__