#include "PHASIC++/Process/Subprocess_Info.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Math/MathTools.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/Exception.H" using namespace PHASIC; using namespace ATOOLS; std::ostream &PHASIC::operator<<(std::ostream &ostr,const Subprocess_Info &info) { info.Print(ostr); return ostr; } Subprocess_Info::Subprocess_Info (const ATOOLS::Flavour &fl,const std::string &id, const std::string &pol,const std::string &mpl): m_fl(fl), m_id(id), m_pol(pol), m_mpl(mpl), m_nmax(0), m_nmin(100), m_tag(0), m_osf(0), m_nlotype(nlo_type::lo), m_nlocpl(2,0), m_asscontribs(asscontrib::none) {} Subprocess_Info::~Subprocess_Info() { DeleteDecayInfos(); } void Subprocess_Info::DeleteDecayInfos() { for (size_t i(0);i1) { if (pn>0) id+=ToString(pn); id+="["+m_ps[i].MultiplicityTag()+"]"; pn=0; } else ++pn; return id+ToString(pn); } size_t Subprocess_Info::NExternal() const { if (m_ps.empty()) return 1; size_t n(0); for (size_t i(0);i &fl,size_t &n) { if (m_ps.empty()) m_fl=fl[n++]; else for (size_t i(0);i &fl) { size_t n(0); SetExternal(fl,n); } bool Subprocess_Info::SetExternal(const ATOOLS::Flavour &fl, const size_t &i,size_t &n) { if (m_ps.empty()) { if (n==i) m_fl=fl; return i==n++; } for (size_t j(0);j &fl) const { if (m_ps.empty()) fl.push_back(m_fl); else for (size_t i(0);i Subprocess_Info::GetExternal() const { std::vector fl; GetExternal(fl); return fl; } bool Subprocess_Info::GetExternal(ATOOLS::Flavour &fl, const size_t &i,size_t &n) const { if (m_ps.empty()) { if (n==i) fl=m_fl; return i==n++; } for (size_t j(0);j0; } for (size_t i(0);iSetSubsequentDecayInfos(subsequentdecays); return cont; } void Subprocess_Info::BuildDecayInfos(size_t nin) { DeleteDecayInfos(); size_t n(nin); GetDecayInfos(m_decins,n,true); delete m_decins.back(); m_decins.pop_back(); } double Subprocess_Info::Factorial(const double &n) const { if (n<=0.0) return 1.0; return n*Factorial(n-1.0); } double Subprocess_Info::ISSymmetryFactor() const { double sf(1.0); msg_Debugging()< "< "< fc; for (size_t i(0);i::iterator fit(fc.find(m_ps[i].m_fl)); if (fit==fc.end()) { fc[m_ps[i].m_fl]=0; fit=fc.find(m_ps[i].m_fl); } ++fit->second; } for (std::map::const_iterator fit(fc.begin()); fit!=fc.end();++fit) { msg_Debugging()<<" "<second<<" " <first<<" -> " <second)<<"\n"; sf*=Factorial(fit->second); } msg_Debugging()<<"} -> "<& tags) { int n=0; SetTags(tags,n); } void Subprocess_Info::SetTags(const std::vector& tags,int &n) { if (m_ps.size()==0) m_tag=tags[n++]; else for (size_t i=0;i& tags) const { if (m_ps.size()==0) { tags.push_back(m_tag); } else { for (size_t i=0; i::iterator psit(m_ps.begin());psit!=m_ps.end();++psit) { int stat(psit->Combine(i,j,flij,cnt)); if (stat<0) psit=m_ps.erase(psit)-1; } return 1; } } void Subprocess_Info::ExtractMPL(std::vector &fl) const { if (m_ps.size()) { for (size_t i=0;i(cur))); } fl.back().push_back(Flavour(ToType(mpl))); } bool Subprocess_Info::operator<(const Subprocess_Info &pi) const { if (m_ps.size()pi.m_ps.size()) return false; if (m_ps.empty()) return m_fl0) { ostr<<" ("<0) ostr<<" {"<0) { for (size_t i(0);i