File indexing completed on 2025-04-19 09:10:03
0001 #ifndef EXTAMP_Main_Dipole_Wrapper_Process_H
0002 #define EXTAMP_Main_Dipole_Wrapper_Process_H
0003
0004 #include "EXTAMP/CS_Dipole.H"
0005 #include "EXTAMP/RS_Process.H"
0006
0007 #include "PHASIC++/Process/Single_Process.H"
0008
0009 namespace EXTAMP {
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 class Dipole_Wrapper_Process : public PHASIC::Single_Process {
0021
0022 public:
0023
0024 Dipole_Wrapper_Process(const RS_Process& rsproc,
0025 EXTAMP::CS_Dipole* dipole,
0026 BEAM::Beam_Spectra_Handler* beam,
0027 PDF::ISR_Handler* isr,
0028 YFS::YFS_Handler* yfs);
0029
0030
0031
0032 void CalcKinematics(const ATOOLS::Vec4D_Vector& p);
0033
0034
0035 double Calc(ATOOLS::NLO_subevt* sub);
0036
0037 void CalculateScale(const ATOOLS::Vec4D_Vector& real_p,
0038 const ATOOLS::Vec4D_Vector& born_p,
0039 ATOOLS::NLO_subevt* const evt);
0040
0041
0042
0043
0044 double Partonic(const ATOOLS::Vec4D_Vector&,
0045 ATOOLS::Variations_Mode varmode,
0046 int mode);
0047
0048
0049 int MCModeSign(ATOOLS::NLO_subevt* const evt) const;
0050 double GetMaxKT2ForDA() const;
0051 double GetKT2ofSplitting(const EXTAMP::Dipole_Kinematics& kin) const;
0052
0053 bool Combinable(const size_t &idi,
0054 const size_t &idj);
0055
0056 void FillProcessMap(PHASIC::NLOTypeStringProcessMap_Map *apmap);
0057
0058 const ATOOLS::Flavour_Vector &CombinedFlavour(const size_t &idij);
0059
0060
0061 void SetSubEventProperties(ATOOLS::NLO_subevt& sub);
0062
0063
0064 void AssignSubEvent(ATOOLS::NLO_subevt* sub);
0065
0066 void SetScaleSetter(PHASIC::Scale_Setter_Base* scl) { p_scale = scl; }
0067
0068 void SetNLOMC(PDF::NLOMC_Base *const nlomc);
0069
0070
0071
0072
0073 ~Dipole_Wrapper_Process() { p_scale = NULL; }
0074
0075 private:
0076
0077
0078
0079
0080 std::string m_born_name;
0081 PHASIC::Process_Info m_born_procinfo;
0082 ATOOLS::Flavour_Vector m_born_flavs;
0083 const ATOOLS::Flavour_Vector& BornFlavours() const { return m_born_flavs; }
0084
0085 static PHASIC::Process_Info ConstructBornProcessInfo(const PHASIC::Process_Info& rsinfo,
0086 size_t i, size_t j,
0087 const ATOOLS::Flavour& flav_ij) ;
0088
0089
0090
0091 EXTAMP::CS_Dipole* p_dipole;
0092 EXTAMP::CS_Dipole* Dipole() const { return p_dipole; }
0093
0094
0095
0096 ATOOLS::NLO_subevt* p_subevent;
0097
0098
0099
0100
0101 ATOOLS::Vec4D_Vector m_moms;
0102 const ATOOLS::Vec4D_Vector& Momenta() const { return m_moms; }
0103
0104
0105
0106 size_t I() const { return std::min(Dipole()->I(),Dipole()->J()); }
0107 size_t J() const { return std::max(Dipole()->I(),Dipole()->J()); }
0108 size_t K() const { return Dipole()->K(); }
0109
0110
0111
0112 size_t BornIJ() const { return m_inversemap[Dipole()->BornIJ()]; }
0113 size_t BornK() const { return m_inversemap[Dipole()->BornK() ]; }
0114
0115
0116 double m_norm;
0117 const double& NormFac() const { return m_norm; }
0118
0119
0120
0121
0122
0123 std::vector<size_t> m_indexmap;
0124 std::vector<size_t> m_inversemap;
0125 static std::vector<size_t> ConstructIndexMapping(const ATOOLS::Flavour_Vector& dipole_flavs,
0126 const ATOOLS::Flavour_Vector& process_flavs,
0127 size_t nin);
0128 static std::vector<size_t> InvertIndexMapping(const std::vector<size_t>& map);
0129
0130
0131
0132
0133
0134
0135
0136
0137 std::vector<size_t> m_id_vector;
0138 const std::vector<size_t>& IDVector() const {return m_id_vector; }
0139 std::vector<size_t> ConstructIDVector() const;
0140
0141 std::map<size_t, ATOOLS::Flavour_Vector> m_cluster_flav_map;
0142
0143 };
0144
0145 }
0146
0147 #endif