File indexing completed on 2025-04-19 09:10:11
0001 #ifndef PHASIC_Process_Virtual_ME2_Base_H
0002 #define PHASIC_Process_Virtual_ME2_Base_H
0003
0004 #include "METOOLS/Loops/Divergence_Array.H"
0005 #include "ATOOLS/Math/Vector.H"
0006 #include "ATOOLS/Phys/NLO_Types.H"
0007 #include "MODEL/Main/Model_Base.H"
0008
0009 namespace PHASIC {
0010
0011 class Process_Info;
0012
0013 class Virtual_ME2_Base {
0014 protected:
0015 std::string m_name;
0016 const Process_Info& m_pinfo;
0017 const ATOOLS::Flavour_Vector m_flavs;
0018 ATOOLS::sbt::subtype m_stype;
0019 METOOLS::DivArrD m_res;
0020 double m_born, m_norm;
0021 double m_mur2, m_accu;
0022 int m_mode, m_drmode, m_colmode;
0023 bool m_providespoles, m_fixedIRscale;
0024 double m_IRscale, m_UVscale;
0025 MODEL::Coupling_Data* p_aqcd, * p_aqed;
0026 const std::vector<std::vector<double> > *p_dsij;
0027 const std::vector<size_t> *p_plist;
0028 bool m_calcass;
0029 std::vector<double> m_asscontribs;
0030 public:
0031 Virtual_ME2_Base(const PHASIC::Process_Info& pi,
0032 const ATOOLS::Flavour_Vector& flavs);
0033 virtual ~Virtual_ME2_Base();
0034
0035 virtual void SwitchMode(const int mode=0);
0036
0037
0038
0039 virtual void Calc(const ATOOLS::Vec4D_Vector& momenta,
0040 const double& born2) { return Calc(momenta); }
0041 virtual void SetPoleCheck(const int check=0);
0042
0043 virtual void Calc(const ATOOLS::Vec4D_Vector& momenta)=0;
0044
0045 inline const METOOLS::DivArrD& Result() { return m_res; }
0046
0047 virtual double Eps_Scheme_Factor(const ATOOLS::Vec4D_Vector& mom);
0048 virtual double ScaleDependenceCoefficient(const int i);
0049 virtual bool IsMappableTo(const Process_Info& pi);
0050
0051 inline double ME_Finite() const { return m_res.GetFinite(); }
0052 inline double ME_E1() const { return m_res.GetIR(); }
0053 inline double ME_E2() const { return m_res.GetIR2(); }
0054 inline double ME_Born() const { return m_born; }
0055
0056 inline bool ProvidesPoles() const { return m_providespoles; }
0057 inline bool fixedIRscale() const { return m_fixedIRscale; }
0058 inline double IRscale() const { return m_IRscale; }
0059 inline double UVscale() const { return m_UVscale; }
0060
0061 inline void SetCalcAssContribs(const bool calcass) { m_calcass=calcass; }
0062 inline size_t ME_AssContribs_Size() const { return m_asscontribs.size(); }
0063 inline double ME_AssContribs(size_t i) const { return m_asscontribs[i]; }
0064
0065 inline void SetSubType(const ATOOLS::sbt::subtype& st) { m_stype=st; }
0066 inline void SetRenScale(const double& mur2) { m_mur2=mur2; }
0067 inline void SetNorm(const double& norm) { m_norm=norm; }
0068 void SetCouplings(const MODEL::Coupling_Map& cpls);
0069
0070 double AlphaQCD() const;
0071 double AlphaQED() const;
0072
0073 inline int Mode() const { return m_mode; }
0074 inline int DRMode() const { return m_drmode; }
0075 inline int ColMode() const { return m_colmode; }
0076
0077 inline void SetDSij(const std::vector<std::vector<double> > *const dsij) { p_dsij=dsij; }
0078 inline void SetPList(const std::vector<size_t> *const plist) { p_plist=plist; }
0079
0080 inline std::string Name() { return m_name; }
0081
0082 static Virtual_ME2_Base* GetME2(const PHASIC::Process_Info& pi);
0083 static Virtual_ME2_Base* GetME2(const std::string& tag,
0084 const PHASIC::Process_Info& pi);
0085 };
0086
0087 class Trivial_Virtual : public Virtual_ME2_Base {
0088 public:
0089 Trivial_Virtual(const PHASIC::Process_Info& pi,
0090 const ATOOLS::Flavour_Vector& flavs) :
0091 Virtual_ME2_Base(pi, flavs) {}
0092
0093 inline void Calc(const ATOOLS::Vec4D_Vector& momenta) {}
0094 };
0095 }
0096
0097 #define DECLARE_VIRTUALME2_GETTER(NAME,TAG) \
0098 DECLARE_GETTER(NAME,TAG,PHASIC::Virtual_ME2_Base,PHASIC::Process_Info); \
0099 void ATOOLS::Getter<PHASIC::Virtual_ME2_Base,PHASIC::Process_Info,NAME>:: \
0100 PrintInfo(std::ostream &str,const size_t width) const \
0101 { \
0102 str<<#TAG; \
0103 }
0104
0105 #endif