Back to home page

EIC code displayed by LXR

 
 

    


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   };// end of class ClusterAmplitude_PVector
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     // inline functions
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   };// end of class Cluster_Amplitude
0219 
0220   std::ostream &operator<<
0221     (std::ostream &ostr,const Cluster_Amplitude &ampl);
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 }// end of namespace ATOOLS
0255 
0256 #endif