File indexing completed on 2025-04-19 09:09:54
0001 #ifndef ATOOLS_Phys_Cluster_Amplitude_H
0002 #define ATOOLS_Phys_Cluster_Amplitude_H
0003
0004 #include "ATOOLS/Phys/Cluster_Leg.H"
0005 #include "ATOOLS/Phys/Decay_Info.H"
0006
0007 #include <map>
0008 #include <memory>
0009 #include <vector>
0010
0011 namespace ATOOLS {
0012
0013 typedef std::map<int,int> CI_Map;
0014
0015 class ClusterAmplitude_PVector:
0016 public std::vector<Cluster_Amplitude*> {
0017 public:
0018
0019 ClusterAmplitude_PVector();
0020
0021 ~ClusterAmplitude_PVector();
0022
0023 };
0024
0025 class Cluster_Amplitude {
0026 private:
0027
0028 Cluster_Amplitude *p_prev, *p_next;
0029
0030 ClusterLeg_Vector m_legs;
0031 DecayInfo_Vector m_decs;
0032
0033 size_t m_oew, m_oqcd, m_nin, m_new, m_ncl, m_kin, m_nlo, m_flag;
0034 double m_mur2, m_muf2, m_muq2, m_mu2, m_kt2, m_z, m_phi, m_lkf;
0035 CI_Map m_cmap;
0036
0037 void *p_jf, *p_ca, *p_proc, *p_procs, *p_iinfo, *p_dinfo;
0038
0039 Mass_Selector *p_ms;
0040
0041 static ClusterAmplitude_PVector s_ampls;
0042
0043 friend class ClusterAmplitude_PVector;
0044
0045 protected:
0046
0047 Cluster_Amplitude(Cluster_Amplitude *const prev=NULL);
0048
0049 ~Cluster_Amplitude();
0050
0051 public:
0052
0053 static Cluster_Amplitude* New(Cluster_Amplitude *const prev=NULL);
0054
0055 void Delete();
0056
0057 void CopyFrom(const Cluster_Amplitude *const master,
0058 const int mode=0);
0059
0060 Cluster_Amplitude *Copy() const;
0061 Cluster_Amplitude *CopyNext() const;
0062 Cluster_Amplitude *CopyAll() const;
0063
0064 void CreateLeg(const Vec4D &p,const Flavour &fl,
0065 const ColorID &col=ColorID(),
0066 const size_t &id=std::string::npos);
0067 void CombineLegs(Cluster_Leg *const i,Cluster_Leg *const j,
0068 const Flavour &fl,
0069 const ColorID &col=ColorID());
0070
0071 Cluster_Amplitude *InitNext();
0072 Cluster_Amplitude *InitPrev();
0073 void SetNext(Cluster_Amplitude *const next);
0074 void UnsetNext();
0075
0076 void DeletePrev();
0077 void DeleteNext();
0078
0079 void IdSort();
0080
0081 size_t NQCD() const;
0082 size_t NEW() const;
0083
0084 Cluster_Leg *IdLeg(const size_t &id) const;
0085 size_t IdIndex(const size_t &id) const;
0086
0087 void OrderLegs();
0088
0089 Cluster_Leg *Splitter() const;
0090
0091 Cluster_Amplitude *First();
0092 Cluster_Amplitude *Last();
0093
0094 const Cluster_Amplitude *First() const;
0095 const Cluster_Amplitude *Last() const;
0096
0097 static bool CheckColors(const ATOOLS::Cluster_Leg *li,
0098 const ATOOLS::Cluster_Leg *lj,
0099 const ATOOLS::Cluster_Leg *lk,
0100 const ATOOLS::Flavour &mo);
0101 static ColorID CombineColors(const Cluster_Leg *li,
0102 const Cluster_Leg *lj,
0103 const Cluster_Leg *lk,
0104 const ATOOLS::Flavour &mo);
0105 static void SetColours(Cluster_Leg *const lij,
0106 Cluster_Leg *const li,
0107 Cluster_Leg *const lj);
0108
0109
0110 inline const ClusterLeg_Vector &Legs() const { return m_legs; }
0111 inline ClusterLeg_Vector &Legs() { return m_legs; }
0112
0113 inline Cluster_Leg *Leg(const size_t &i) const { return m_legs[i]; }
0114
0115 Vec4D Mom(size_t i) const
0116 {
0117 return (i < NIn() ? -1.0 : 1.0) * Leg(i)->Mom();
0118 }
0119 void SetMom(const size_t& i, const Vec4D& p) const
0120 {
0121 Leg(i)->SetMom(i < NIn() ? -p : p);
0122 }
0123 Flavour_Vector Flavs() const
0124 {
0125 Flavour_Vector flavs;
0126 const auto size = m_legs.size();
0127 flavs.reserve(size);
0128 for (size_t i {0}; i < size; ++i) {
0129 flavs.push_back(Flav(i));
0130 }
0131 return flavs;
0132 }
0133 Flavour Flav(size_t i) const
0134 {
0135 return (i < NIn() ? Leg(i)->Flav().Bar() : Leg(i)->Flav());
0136 }
0137
0138 inline Cluster_Amplitude *Prev() const { return p_prev; }
0139 inline Cluster_Amplitude *Next() const { return p_next; }
0140
0141 inline const DecayInfo_Vector &Decays() const { return m_decs; }
0142 inline DecayInfo_Vector &Decays() { return m_decs; }
0143
0144 inline void SetNIn(const size_t &nin) { m_nin=nin; }
0145 inline void SetIdNew(const size_t &id) { m_new=id; }
0146 inline void SetNewCol(const size_t &c) { m_ncl=c; }
0147
0148 inline void SetKin(const size_t &kin) { m_kin=kin; }
0149 inline void SetNLO(const size_t &nlo) { m_nlo=nlo; }
0150
0151 inline void SetFlag(const size_t &flag) { m_flag=flag; }
0152
0153 inline void SetOrderEW(const size_t &oew) { m_oew=oew; }
0154 inline void SetOrderQCD(const size_t &oqcd) { m_oqcd=oqcd; }
0155
0156 inline void SetMuF2(const double &muf2) { m_muf2=muf2; }
0157 inline void SetMuR2(const double &mur2) { m_mur2=mur2; }
0158 inline void SetMuQ2(const double &muq2) { m_muq2=muq2; }
0159 inline void SetMu2(const double &mu2) { m_mu2=mu2; }
0160
0161 inline void SetKT2(const double &kt2) { m_kt2=kt2; }
0162 inline void SetZ(const double &z) { m_z=z; }
0163 inline void SetPhi(const double &phi) { m_phi=phi; }
0164
0165 inline void SetJF(void *const jf) { p_jf=jf; }
0166 inline void SetCA(void *const ca) { p_ca=ca; }
0167 inline void SetProc(void *const p) { p_proc=p; }
0168 inline void SetProcs(void *const p) { p_procs=p; }
0169 inline void SetIInfo(void *const i) { p_iinfo=i; }
0170 inline void SetDInfo(void *const d) { p_dinfo=d; }
0171
0172 inline void SetMS(Mass_Selector *const ms) { p_ms=ms; }
0173
0174 inline size_t NIn() const { return m_nin; }
0175 inline size_t IdNew() const { return m_new; }
0176 inline size_t NewCol() const { return m_ncl; }
0177
0178 inline size_t Kin() const { return m_kin; }
0179 inline size_t NLO() const { return m_nlo; }
0180
0181 inline size_t Flag() const { return m_flag; }
0182
0183 inline size_t OrderEW() const { return m_oew; }
0184 inline size_t OrderQCD() const { return m_oqcd; }
0185
0186 inline double MuF2() const { return m_muf2; }
0187 inline double MuR2() const { return m_mur2; }
0188 inline double MuQ2() const { return m_muq2; }
0189 inline double Mu2() const { return m_mu2; }
0190
0191 inline double KT2() const { return m_kt2; }
0192 inline double Z() const { return m_z; }
0193 inline double Phi() const { return m_phi; }
0194
0195 inline void SetLKF(const double &lkf) { m_lkf=lkf; }
0196
0197 inline double LKF() const { return m_lkf; }
0198
0199 inline CI_Map &ColorMap() { return m_cmap; }
0200 inline const CI_Map &ColorMap() const { return m_cmap; }
0201
0202 inline Mass_Selector *MS() const { return p_ms; }
0203
0204 template <class Type> inline Type *JF() const
0205 { return static_cast<Type*>(p_jf); }
0206 template <class Type> inline Type *CA() const
0207 { return static_cast<Type*>(p_ca); }
0208
0209 template <class Type> inline Type *Proc() const
0210 { return static_cast<Type*>(p_proc); }
0211 template <class Type> inline Type *Procs() const
0212 { return static_cast<Type*>(p_procs); }
0213 template <class Type> inline Type *IInfo() const
0214 { return static_cast<Type*>(p_iinfo); }
0215 template <class Type> inline Type *DInfo() const
0216 { return static_cast<Type*>(p_dinfo); }
0217
0218 };
0219
0220 std::ostream &operator<<
0221 (std::ostream &ostr,const Cluster_Amplitude &l);
0222
0223 typedef std::vector<Cluster_Amplitude*> ClusterAmplitude_Vector;
0224
0225 struct ClusterAmplitude_Deleter {
0226 void operator()(Cluster_Amplitude* ampl) {
0227 ampl->Delete();
0228 }
0229 };
0230
0231 using Cluster_Amplitude_UP =
0232 std::unique_ptr<Cluster_Amplitude, ClusterAmplitude_Deleter>;
0233 inline Cluster_Amplitude_UP MakeClusterAmpl()
0234 {
0235 return std::unique_ptr<Cluster_Amplitude, ClusterAmplitude_Deleter>{
0236 Cluster_Amplitude::New()};
0237 }
0238 inline Cluster_Amplitude_UP CopyClusterAmpl(const Cluster_Amplitude_UP& ampl)
0239 {
0240 return std::unique_ptr<Cluster_Amplitude, ClusterAmplitude_Deleter>{
0241 ampl->Copy()};
0242 }
0243 inline Cluster_Amplitude_UP CopyClusterAmpl(const Cluster_Amplitude* ampl)
0244 {
0245 return std::unique_ptr<Cluster_Amplitude, ClusterAmplitude_Deleter>{
0246 ampl->Copy()};
0247 }
0248 inline Cluster_Amplitude_UP CopyClusterAmpl(const Cluster_Amplitude& ampl)
0249 {
0250 return std::unique_ptr<Cluster_Amplitude, ClusterAmplitude_Deleter>{
0251 ampl.Copy()};
0252 }
0253
0254 }
0255
0256 #endif