#include "ATOOLS/Org/CXXFLAGS_PACKAGES.H" #include "PHASIC++/Scales/Scale_Setter_Base.H" #include "PHASIC++/Scales/Tag_Setter.H" #include "PHASIC++/Process/Process_Base.H" #include "PHASIC++/Main/Process_Integrator.H" #include "PHASIC++/Main/Phase_Space_Handler.H" #include "MODEL/Main/Running_AlphaS.H" #include "MODEL/Main/Model_Base.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/Data_Reader.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Phys/Fastjet_Helpers.H" namespace PHASIC { class Fastjet_Scale_Setter: public Scale_Setter_Base { protected: std::vector m_calcs; Tag_Setter m_tagset; fjcore::JetDefinition *p_jdef; double m_ptmin, m_etmin, m_eta, m_y; ATOOLS::Flavour_Vector m_f; int m_mode, m_bmode; double ASMeanScale(const std::vector &mu, const size_t &offset) const; public: Fastjet_Scale_Setter(const Scale_Setter_Arguments &args); ~Fastjet_Scale_Setter(); double Calculate(const std::vector &p, const size_t &mode); void SetScale(const std::string &mu2tag, ATOOLS::Algebra_Interpreter &mu2calc); const ATOOLS::Vec4D_Vector &Momenta() const; };// end of class Fastjet_Scale_Setter }// end of namespace PHASIC using namespace PHASIC; using namespace ATOOLS; DECLARE_GETTER(Fastjet_Scale_Setter,"FASTJET", Scale_Setter_Base,Scale_Setter_Arguments); Scale_Setter_Base *ATOOLS::Getter :: operator()(const Scale_Setter_Arguments &args) const { return new Fastjet_Scale_Setter(args); } void ATOOLS::Getter:: PrintInfo(std::ostream &str,const size_t width) const { str<<"variable scale scheme using fast jets"; } Fastjet_Scale_Setter::Fastjet_Scale_Setter (const Scale_Setter_Arguments &args): Scale_Setter_Base(args), m_tagset(this), p_jdef(NULL) { std::string jtag(args.m_scale); size_t pos(jtag.find("FASTJET[")); if (pos==std::string::npos) THROW(fatal_error,"Invalid scale '"+args.m_scale+"'"); jtag=jtag.substr(pos+8); pos=jtag.find(']'); if (pos==std::string::npos) THROW(fatal_error,"Invalid scale '"+args.m_scale+"'"); jtag=jtag.substr(0,pos); Data_Reader read(" ",",","#","="); read.AddIgnore(":"); read.SetString(jtag); m_mode=read.StringValue("M",1); m_bmode=read.StringValue("B",0); m_ptmin=read.StringValue("PT",0.0); m_etmin=read.StringValue("ET",0.0); m_eta=read.StringValue("Eta",100.0); m_y=read.StringValue("Y",100.0); double R(read.StringValue("R",0.4)); double f(read.StringValue("f",0.75)); std::string algo(read.StringValue("A","antikt")); fjcore::JetAlgorithm ja(fjcore::kt_algorithm); if (algo=="cambridge") ja=fjcore::cambridge_algorithm; if (algo=="antikt") ja=fjcore::antikt_algorithm; std::string reco(read.StringValue("C","E")); fjcore::RecombinationScheme recom(fjcore::E_scheme); if (reco=="pt") recom=fjcore::pt_scheme; if (reco=="pt2") recom=fjcore::pt2_scheme; if (reco=="Et") recom=fjcore::Et_scheme; if (reco=="Et2") recom=fjcore::Et2_scheme; if (reco=="BIpt") recom=fjcore::BIpt_scheme; if (reco=="BIpt2") recom=fjcore::BIpt2_scheme; p_jdef=new fjcore::JetDefinition(ja,R,recom); m_f=p_proc->Flavours(); m_p.resize(p_proc->NIn()+p_proc->NOut()); std::string tag(args.m_scale); std::vector ctags; while (true) { size_t pos(tag.find('{')); if (pos==std::string::npos) { if (!m_calcs.empty()) break; else { THROW(fatal_error,"Invalid scale '"+args.m_scale+"'"); } } tag=tag.substr(pos+1); pos=tag.find('}'); if (pos==std::string::npos) THROW(fatal_error,"Invalid scale '"+args.m_scale+"'"); std::string ctag(tag.substr(0,pos)); tag=tag.substr(pos+1); m_calcs.push_back(new Algebra_Interpreter()); m_calcs.back()->AddFunction(MODEL::as->GetAIGMeanFunction()); m_calcs.back()->SetTagReplacer(&m_tagset); if (m_calcs.size()==1) m_tagset.SetCalculator(m_calcs.back()); ctags.push_back(ctag); } for (size_t i(p_proc->NIn());i &_momenta,const size_t &mode) { std::vector momenta(_momenta); if (p_proc->Flavours()[0].IsLepton()&&rpa->gen.Beam2().IsHadron()) { msg_Debugging()<gen.PBeam(1)), qq(momenta[0]-momenta[2]); Poincare cms(pp+qq); double Q2(-qq.Abs2()), x(Q2/(2.0*pp*qq)), E(sqrt(Q2)/(2.0*x)); Vec4D p(sqrt(E*E+pp.Abs2()),0.0,0.0,-E); Vec4D q(0.0,0.0,0.0,2.0*x*E); cms.Boost(pp); cms.Boost(qq); Poincare zrot(pp,-Vec4D::ZVEC); zrot.Rotate(pp); zrot.Rotate(qq); Poincare breit(p+q); breit.BoostBack(pp); breit.BoostBack(qq); if (!IsEqual(pp,p,1.0e-3) || !IsEqual(qq,q,1.0e-3)) msg_Error()< "< input; for (size_t i(p_proc->NIn());i jets(fjcore::sorted_by_pt(cs.inclusive_jets())); for (size_t i(0);im_ptmin && pj.EPerp()>m_etmin && (m_eta==100.0 || dabs(pj.Eta())Calculate()->Get(); if (m_mode==1) m_scale[stp::res]=m_scale[stp::fac]= m_scale[stp::ren]=ASMeanScale(m_scale,stp::size); else for (size_t i(m_calcs.size());iName()<<"\n"; m_scale.resize(stp::size); return m_scale[stp::fac]; } double Fastjet_Scale_Setter::ASMeanScale (const std::vector &mu,const size_t &offset) const { msg_Debugging()<<"Setting scales {\n"; double mur2(1.0), as(1.0), oqcd(0.0); for (size_t i(offset);iBoundedAlphaS(mu[i])); msg_Debugging()<<" \\mu_{"<WDBSolve(as,MODEL::as->CutQ2(),sqr(rpa->gen.Ecms())); if (!IsEqual((*MODEL::as)(mur2),as)) msg_Error()< as = "< \\mu = "<Name()<<"' {\n"; msg_Indent(); m_tagset.SetTags(&mu2calc); mu2calc.Interprete(mu2tag); if (msg_LevelIsDebugging()) mu2calc.PrintEquation(); msg_Debugging()<<"}\n"; }