#include "AMEGIC++/Main/Process_Base.H" #include "PHASIC++/Process/Process_Base.H" #include "PHASIC++/Main/Phase_Space_Handler.H" #include "PHASIC++/Main/Process_Integrator.H" #include "PHASIC++/Selectors/Combined_Selector.H" #include "ATOOLS/Org/Library_Loader.H" #include "ATOOLS/Org/Run_Parameter.H" #include "PHASIC++/Channels/Multi_Channel.H" #include "PHASIC++/Channels/Single_Channel.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/Scoped_Settings.H" #include "ATOOLS/Phys/KF_Table.H" using namespace AMEGIC; using namespace PHASIC; using namespace ATOOLS; int AMEGIC::Process_Base::s_gauge=10; AMEGIC::Process_Base::Process_Base(): p_model(NULL), p_b(0), m_eoreset(0), p_pl(0), m_print_graphs(""), p_testmoms(0), m_Norm(1.), m_sfactor(1.), m_lastdxs(0.), m_lastk(1.) { p_subevtlist=NULL; p_channellibnames = new std::list(); static int allowmap(-1); if (allowmap<0) { Scoped_Settings amegicsettings{ Settings::GetMainSettings()["AMEGIC"] }; allowmap = amegicsettings["ALLOW_MAPPING"].Get(); if (allowmap!=1) msg_Info()<GetTotalPolList(p_pl+NIn()); m_mincpl.resize(m_pinfo.m_mincpl.size()); for (size_t i(0);iAddPath(rpa->gen.Variable("SHERPA_LIB_PATH")); Lib_Getter_Function gf = (Lib_Getter_Function) PT(s_loader->GetLibraryFunction("Proc_"+pID.substr(0,pos), "Getter_"+pID.substr(pos+1))); if (gf==NULL) return NULL; return gf(nin,nout,fl,psh->GetInfo(),psh); } void AMEGIC::Process_Base::RequestVariables(Phase_Space_Handler *const psh) { } bool AMEGIC::Process_Base::FillIntegrator(Phase_Space_Handler *const psh) { if (p_channellibnames->empty()) return true; Multi_Channel *mc(psh->FSRIntegrator()); for (std::list::iterator it(p_channellibnames->begin()); it!=p_channellibnames->end();++it) { Single_Channel *sc = LoadChannel(NIn(),NOut(),(Flavour*)&Flavours().front(), *it,&*Integrator()->PSHandler()); if (sc==0) THROW(critical_error,"PS integration channels not compiled"); sc->SetName(*it); mc->Add(sc); } return false; } double AMEGIC::Process_Base::SymmetryFactors() { Flavour* flav = new Flavour[m_nin+m_nout]; double sym = 1.; int ndecays=p_pinfo->Ndecays(); for (int i=0;i<=ndecays;i++) { int j=i; Process_Tags* pi=p_pinfo->GetDecay(j); size_t nout=pi->GetStableFlavList(flav); sym*=SBSymmetryFactor(flav,nout); } delete[] flav; return sym; } double AMEGIC::Process_Base::SBSymmetryFactor(Flavour* flout,size_t nout) { double sym = 1.; for(KFCode_ParticleInfo_Map::const_iterator kfit(s_kftable.begin()); kfit!=s_kftable.end();++kfit) { Flavour hflav(kfit->first); if (hflav.IsHadron()) continue; int cp = 0; int cap = 0; for (size_t j=0;j1) sym *= double(Factorial(cp)); if (cap>1) sym *= double(Factorial(cap)); } return 1./sym; } bool AMEGIC::Process_Base::CheckMapping(const Process_Base * proc) { const ATOOLS::Flavour_Vector &flavs(Flavours()); const ATOOLS::Flavour_Vector &partner_flavs(proc->Flavours()); // create map std::map flmap; for (size_t i=0;iFlavours()); for (size_t i=0;i::const_iterator fit(m_fmap.find(id)); if (fit!=m_fmap.end()) return fit->second; Flavour_Map::const_iterator efit(m_eflmap.find(f0)); if (efit!=m_eflmap.end()) return efit->second; if (f0.IsBoson()) return f0; else { DO_STACK_TRACE; for (std::map::const_iterator fit(m_fmap.begin()); fit!=m_fmap.end();++fit) PRINT_VAR(fit->first<<" "<second); for (Flavour_Map::const_iterator fit(m_eflmap.begin()); fit!=m_eflmap.end();++fit) PRINT_VAR(fit->first<<" "<second); PRINT_VAR(f0<<" "<Name()<<" "<Parent()<<" "<<((Process_Base*)this)->Parent()->Name()); PRINT_VAR(p_mapproc->Parent()<<" "<Parent()->Name()); THROW(critical_error,"Flavour map incomplete!"); } return f0; } ATOOLS::Flavour AMEGIC::Process_Base::ReMap (const ATOOLS::Flavour &ifl,const size_t &cid) const { if (Partner()==NULL || Partner()==this) return ifl; bool swap(cid&((1< s_flsmap; std::map::iterator flsit(s_flsmap.find(fl)); if (flsit==s_flsmap.end()) flsit=s_flsmap.insert(make_pair(fl,ToString(fl))).first; static std::map s_idsmap; std::map::iterator idsit(s_idsmap.find(cid)); if (idsit==s_idsmap.end()) idsit=s_idsmap.insert(make_pair(cid,ToString(cid))).first; std::string id(flsit->second+idsit->second); std::map::const_iterator fit(m_fmap.find(id)); if (fit!=m_fmap.end()) return swap?fit->second.Bar():fit->second; else { size_t ccid=((1<<(m_nin+m_nout))-1)-cid; std::map::iterator idsit(s_idsmap.find(ccid)); if (idsit==s_idsmap.end()) idsit=s_idsmap.insert(make_pair(ccid,ToString(ccid))).first; id=flsit->second+idsit->second; std::map::const_iterator fit(m_fmap.find(id)); if (fit!=m_fmap.end()) return swap?fit->second:fit->second.Bar(); Flavour_Map::const_iterator efit(m_eflmap.find(fl)); if (efit!=m_eflmap.end()) return swap?efit->second.Bar():efit->second; if (ifl.IsBoson()) return ifl; else { DO_STACK_TRACE; PRINT_VAR(this<<" "<Name()<<" "<Parent()<<" "<<((Process_Base*)this)->Parent()->Name()); PRINT_VAR(p_mapproc->Parent()<<" "<Parent()->Name()); THROW(critical_error,"Flavour map incomplete!"); } } return ifl; } AMEGIC::Process_Base *AMEGIC::Process_Base::GetReal() { return this; } bool AMEGIC::Process_Base::FlavCompare(PHASIC::Process_Base *const proc) { if (m_nin!=proc->NIn() || m_nout!=proc->NOut()) return false; bool flavsok(true); for (size_t i(0);iFlavours()[i].IsAnti()) flavsok=false; return flavsok; } std::string AMEGIC::Process_Base::CreateLibName() { std::string name(m_name); size_t apos(name.find(m_pinfo.m_addname)); if (apos!=std::string::npos) name.erase(apos,m_pinfo.m_addname.length()); size_t bpos(name.find("__QCD(")); if (bpos!=std::string::npos) { size_t epos(name.find(')',bpos)); if (epos!=std::string::npos) name.replace(bpos,epos-bpos+1,""); } bpos=name.find("__EW("); if (bpos!=std::string::npos) { size_t epos(name.find(')',bpos)); if (epos!=std::string::npos) name.replace(bpos,epos-bpos+1,""); } name=ShellName(name+"__O"); int sep(0); for (size_t i(0);i "<