File indexing completed on 2026-06-21 08:23:37
0001
0002
0003
0004
0005 #ifndef __FJCONTRIB_MASSFLAV_HH__
0006 #define __FJCONTRIB_MASSFLAV_HH__
0007
0008 #ifdef __FJC_FLAVINFO_USEFJCORE__
0009 #include "FlavInfo.hh"
0010 #else
0011 #include "fastjet/PseudoJet.hh"
0012 #include "fastjet/JetDefinition.hh"
0013 #include "fastjet/contrib/FlavNeutraliser.hh"
0014 #endif
0015
0016 #include <limits>
0017
0018
0019
0020 FASTJET_BEGIN_NAMESPACE
0021 namespace contrib{
0022
0023
0024 class MassFlavHistory : public FlavHistory {
0025 public:
0026
0027
0028 MassFlavHistory(FlavHistory flavhist, double m_in = 0.0)
0029 : FlavHistory(flavhist), _m(m_in) {}
0030 void set_mass(double m_in) { _m = m_in; }
0031 double mass() const { return _m; }
0032
0033 private:
0034 double _m;
0035 };
0036
0037 class MassFlavRecombiner : public FlavRecombiner {
0038 public:
0039 MassFlavRecombiner() : FlavRecombiner() {}
0040
0041 MassFlavRecombiner(const FlavRecombiner & flav_reco) : FlavRecombiner(flav_reco) {}
0042
0043
0044
0045
0046
0047
0048
0049 void recombine(const PseudoJet &pa, const PseudoJet &pb,
0050 PseudoJet &pab) const {
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 constexpr double rap_lim = 0.1;
0072
0073
0074
0075
0076 bool pa_small_rap = std::fabs(pa.rap()) < rap_lim;
0077 bool pb_small_rap = std::fabs(pb.rap()) < rap_lim;
0078 double pab_approx_rap = (pa.pt()*pa.rap() + pb.pt()*pb.rap())/(pa.pt()+pb.pt());
0079 bool pab_small_rap = std::fabs(pab_approx_rap) < rap_lim;
0080 int n_small_rap = int(pa_small_rap ) + int(pb_small_rap) + int(pab_small_rap);
0081
0082 if (n_small_rap >= 2) {
0083
0084
0085 FlavRecombiner::recombine(pa, pb, pab);
0086 pab.set_user_info(new MassFlavHistory(pab.user_info<FlavHistory>(),
0087 pab.m()));
0088 return;
0089 }
0090
0091 double ma = mass_of_particle(pa);
0092 double mb = mass_of_particle(pb);
0093
0094 double avrap = (pa.rap() + pb.rap()) / 2;
0095
0096 PseudoJet shifted_pa = PtYPhiM(pa.pt(), pa.rap() - avrap, pa.phi(), ma);
0097 PseudoJet shifted_pb = PtYPhiM(pb.pt(), pb.rap() - avrap, pb.phi(), mb);
0098
0099 shifted_pa.set_user_info(
0100 new MassFlavHistory(pa.user_info<FlavHistory>(), ma));
0101 shifted_pb.set_user_info(
0102 new MassFlavHistory(pb.user_info<FlavHistory>(), mb));
0103
0104 PseudoJet shifted_pab;
0105
0106
0107 FlavRecombiner::recombine(shifted_pa, shifted_pb, shifted_pab);
0108
0109 pab = PtYPhiM(shifted_pab.pt(), shifted_pab.rap() + avrap,
0110 shifted_pab.phi(), shifted_pab.m());
0111 pab.set_user_info(new MassFlavHistory(shifted_pab.user_info<FlavHistory>(),
0112 shifted_pab.m()));
0113 }
0114
0115 double mass_of_particle(const PseudoJet &p) const {
0116 if (p.has_user_info<MassFlavHistory>())
0117 return p.user_info<MassFlavHistory>().mass();
0118
0119
0120 double m2 = p.m2();
0121 const double safety_factor = 10.0;
0122 if (std::fabs(m2) > safety_factor *
0123 std::numeric_limits<double>::epsilon() *
0124 pow(p.E(), 2)) {
0125 throw Error(
0126 "MassFlavRecombiner found particle without MassFlavHistory, whose "
0127 "mass is inconsistent with zero");
0128 }
0129
0130 return 0.0;
0131 }
0132 };
0133
0134 }
0135
0136 FASTJET_END_NAMESPACE
0137
0138 #endif