#include "PHASIC++/Process/External_ME_Args.H" #include "PHASIC++/Channels/Rambo.H" #include "ATOOLS/Math/Random.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/Message.H" #include "MODEL/Main/Model_Base.H" #include "MODEL/Main/Running_AlphaS.H" #include "EXTRA_XS/Main/ME2_Base.H" using namespace EXTRAXS; using namespace MODEL; using namespace ATOOLS; using namespace PHASIC; using namespace std; /* In all the differential cross sections the factor 1/16 Pi is cancelled by the factor 4 Pi for each alpha. Hence one Pi remains in the game. */ namespace EXTRAXS { struct xsec_data { double m_Ehat, m_rho, m_Ngluons, m_sigmahat; xsec_data(const double & Ehat, const double & rho, const double & Ngluons, const double & sigmahat) : m_Ehat(Ehat), m_rho(rho), m_Ngluons(Ngluons), m_sigmahat(sigmahat) {} }; class Data_Table { private: std::map m_data; double m_Ehatmin, m_Ehatmax; double m_rho, m_Ngluons, m_sigmahat; xsec_data * m_lower, * m_upper; bool ReadTable(); void ConstructDefaultTable(); public: Data_Table(); ~Data_Table(); void Output(); bool Interpolate(const double & E); void Test(const double & E); const double & Ehatmin() const { return m_Ehatmin; } const double & Ehatmax() const { return m_Ehatmax; } const double & Rho() const { return m_rho; } const double & Ngluons() const { return m_Ngluons; } const double & Sigmahat() const { return m_sigmahat; } const double & E(int & i) { std::map::iterator dit = m_data.begin(); while ((i--)>0) dit++; return dit->first; } }; Data_Table::Data_Table() { if (!ReadTable()) ConstructDefaultTable(); m_Ehatmin = m_data.begin()->first; m_Ehatmax = m_data.rbegin()->first; for (std::map::iterator dit=m_data.begin(); dit!=m_data.end();dit++) dit->second->m_sigmahat = dit->second->m_sigmahat/rpa->Picobarn(); } Data_Table::~Data_Table() { while (!m_data.empty()) { delete m_data.begin()->second; m_data.erase(m_data.begin()); } m_data.clear(); } bool Data_Table::ReadTable() { Settings& s = Settings::GetMainSettings(); s.DeclareMatrixSettingsWithEmptyDefault({ "INSTANTON_XSECS" }); const auto allxs = s["INSTANTON_XSECS"].GetMatrix(); if (allxs.empty()) { msg_Info()<<"Warning in "<m_Ehatmax || E::iterator dit; for (dit=m_data.begin();dit!=m_data.end();dit++) if (dit->first>E) break; m_upper = dit->second; dit--; m_lower = dit->second; double lx = (m_upper->m_Ehat-E)/(m_upper->m_Ehat-m_lower->m_Ehat); double ux = (m_lower->m_Ehat-E)/(m_lower->m_Ehat-m_upper->m_Ehat); m_rho = (m_upper->m_rho*ux + m_lower->m_rho*lx); m_Ngluons = (m_upper->m_Ngluons*ux + m_lower->m_Ngluons*lx); m_sigmahat = (m_upper->m_sigmahat*ux + m_lower->m_sigmahat*lx); return true; } void Data_Table::Output() { msg_Out()<<"Instanton partonic cross sections:\n" <<" with sqrt(s') in ["< sigma\n"; for (std::map::iterator dit=m_data.begin(); dit!=m_data.end();dit++) msg_Out()<first<<": "<second->m_rho<<" " <second->m_Ngluons<<" " <<(dit->second->m_sigmahat*rpa->Picobarn())<<"\n"; msg_Out()<<"--------------------------------------------------\n"; } void Data_Table::Test(const double & E) { Output(); Interpolate(E); msg_Out()<<"For E = "< = "< m_masses; void Initialise(); bool DefineFlavours(); double FixScale() const; double AlphaSModification(); size_t NumberOfGluons(); bool DistributeMomenta(); bool MakeColours(); void Test(); public: XS_instanton(const External_ME_Args& args); ~XS_instanton() {} double operator()(const ATOOLS::Vec4D_Vector& mom) override; bool SetColours(const Vec4D_Vector& mom) override; bool FillFinalState(const std::vector & mom) override; // Report that this class has a non-standard AlphaS dependency, but offers // CustomRelativeVariationWeightForRenormalizationScaleFactor to calculate // it. int OrderQCD(const int&) const override { return NonfactorizingCoupling::WithCustomVariationWeight; }; double CustomRelativeVariationWeightForRenormalizationScaleFactor(double scalefactor) const override; }; } XS_instanton::XS_instanton(const External_ME_Args& args) : ME2_Base(args), m_S(sqr(rpa->gen.Ecms())), m_norm(1./36.), m_bthreshold(100.), m_cthreshold(20.), m_Ngluons_factor(1.), m_sigmahat_factor(1.), m_scalechoice(instantonScale::rho) { DEBUG_INFO("now entered EXTRAXS::XS_instanton ..."); Settings& s = Settings::GetMainSettings(); double Ehatmin = Max(1.,m_data.Ehatmin()); double Ehatmax = Min(rpa->gen.Ecms(),m_data.Ehatmax()); m_Ehatmin = s["INSTANTON_MIN_MASS"].SetDefault(20.).Get(); m_Ehatmax = s["INSTANTON_MAX_MASS"].SetDefault(rpa->gen.Ecms()).Get(); m_sprimemin = sqr(m_Ehatmin); m_sprimemax = sqr(m_Ehatmax); if (m_EhatminEhatmax) { msg_Error()<<"WARNING in "<Ehatmax) { msg_Error()<<" demand maximal instanton mass above largest energy in data:\n" <<" "< "<(); m_tthreshold = (s["INSTANTON_T_PRODUCTION_THRESHOLD"].SetDefault(1000.0). Get()); m_bthreshold = (s["INSTANTON_B_PRODUCTION_THRESHOLD"].SetDefault(100.0). Get()); m_cthreshold = (s["INSTANTON_C_PRODUCTION_THRESHOLD"].SetDefault(20.0). Get()); m_includeQ = s["INSTANTON_INCLUDE_QUARKS"].SetDefault(5).Get(); m_sigmahat_factor = s["INSTANTON_SIGMAHAT_MODIFIER"].SetDefault(1.0).Get(); m_alphaS_factor = s["INSTANTON_ALPHAS_FACTOR"].SetDefault(1.0).Get(); string choice = s["INSTANTON_SCALE_CHOICE"].SetDefault("1/rho").Get(); if (choice=="shat") m_scalechoice = instantonScale::Ehat; else if (choice=="shat/N") m_scalechoice = instantonScale::Ehat_by_sqrtN; m_scale_factor = s["INSTANTON_SCALE_FACTOR"].SetDefault(1.).Get(); p_alphaS = dynamic_cast(s_model->GetScalarFunction("alpha_S")); m_hasinternalscale = true; msg_Tracking()<m_Ehatmax || !m_data.Interpolate(m_Ehat)) return 0.; m_internalscale = Max(FixScale(), 2.); // have to multiply with the norm and the inverse external flux double xsec = m_sigmahat_factor * m_data.Sigmahat() * (2.*shat) * m_norm; return AlphaSModification() * xsec; } double XS_instanton::FixScale() const { return m_scale_factor * (m_scalechoice==instantonScale::Ehat?m_Ehat: (m_scalechoice==instantonScale::Ehat_by_sqrtN)?m_Ehat/sqrt(m_data.Ngluons()): m_data.Rho()); } double XS_instanton::AlphaSModification() { if (dabs(m_alphaS_factor-1.)<1.e-3) return 1.; return pow(m_alphaS_factor,2.*p_alphaS->Beta0(sqr(m_data.Rho()))); } bool XS_instanton::FillFinalState(const std::vector & mom) { m_Ehat = sqrt(mom[2].Abs2()); if (m_Ehatm_Ehatmax || !m_data.Interpolate(m_Ehat)) return false; Poincare boost(mom[2]); m_internalscale = Max(FixScale(), 2.); //msg_Out()< "<0) { m_mean_Ngluons = m_data.Ngluons(); Vec4D sum = -mom[2]; if (DefineFlavours() && DistributeMomenta() && MakeColours()) { for (size_t i=0;iBeta0(fac*scale2)) ); } bool XS_instanton::DefineFlavours() { m_flavours.clear(); double totmass = 0.; for (size_t i=0;i<2;i++) { totmass += m_flavs[i].Mass(true); m_flavours.push_back(m_flavs[i]); } m_masses.clear(); m_nquarks = 0; for (size_t i=1;i<6;i++) { Flavour flav = Flavour(i); if (i>m_includeQ) continue; if (flav==Flavour(kf_b) && m_Ehatm_Ehat) break; if (flav.Bar()!=m_flavs[0] && flav.Bar()!=m_flavs[1]) { m_flavours.push_back(flav); m_nquarks++; totmass += flav.Mass(true); } flav = flav.Bar(); if (flav.Bar()!=m_flavs[0] && flav.Bar()!=m_flavs[1]) { m_flavours.push_back(flav); m_nquarks++; totmass += flav.Mass(true); } } do { m_ngluons = NumberOfGluons(); } while (m_ngluons>=30-m_nquarks); Flavour flav = Flavour(kf_gluon); for (size_t i=0;iPoissonian(m_Ngluons_factor * m_mean_Ngluons); } bool XS_instanton::DistributeMomenta() { m_momenta.clear(); double totmass = 0., mass; for (size_t i=0;im_Ehat) { msg_Error()<<"Error in "< cols[2]; for (size_t i=0;iGet()); parts[i] = cols[i][pos[i]]; } } while (parts[0]==parts[1]); m_colours[parts[0]][0] = m_colours[parts[1]][1] = colindex++; for (size_t i=0;i<2;i++) { cols[i].erase(find(cols[i].begin(),cols[i].end(),parts[i])); } } while (cols[0].size()>1); if (cols[0][0]!=cols[1][0]) { m_colours[cols[0][0]][0] = m_colours[cols[1][0]][1] = colindex++; } else { if (m_colours[2][0]!=0) { m_colours[cols[0][0]][0] = m_colours[2][0]; m_colours[2][0] = m_colours[cols[1][0]][1] = colindex++; } else if (m_colours[2][1]!=0) { m_colours[cols[1][0]][1] = m_colours[2][1]; m_colours[2][1] = m_colours[cols[0][0]][0] = colindex++; } } for (size_t i=0;i<2;i++) { size_t help = m_colours[i][0]; m_colours[i][0] = m_colours[i][1]; m_colours[i][1] = help; } return true; } void XS_instanton::Test() { for (size_t i=0;i<5;i++) { int step = 2*i; double E = m_data.E(step); m_data.Interpolate(E); m_mean_Ngluons = m_data.Ngluons(); long int maxtrials = 1000000, ngluons = 0, totn = 0; for (long int trials=0;trials = "< "<:: operator()(const External_ME_Args& args) const { if (MODEL::s_model->Name()!="SM") return NULL; const Flavour_Vector fl=args.Flavours(); if (fl.size()!=3) return NULL; if (!(fl[0].Strong() && fl[1].Strong() && fl[2]==Flavour(kf_instanton))) return NULL; return new XS_instanton(args); }