Back to home page

EIC code displayed by LXR

 
 

    


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     // Allow to pass a born value for virtuals that don't calculate it
0038     // themselves but need it for the renormalization scale dependence
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