#include "COMIX/Amplitude/Amplitude.H" #include "MODEL/Main/Single_Vertex.H" #include "PHASIC++/Main/Color_Integrator.H" #include "PHASIC++/Main/Helicity_Integrator.H" #include "PHASIC++/Process/Process_Base.H" #include "METOOLS/Explicit/Dipole_Kinematics.H" #include "METOOLS/Main/Spin_Structure.H" #include "ATOOLS/Phys/Spinor.H" #include "ATOOLS/Math/Permutation.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Org/My_Limits.H" #include "ATOOLS/Org/STL_Tools.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/My_File.H" #include "ATOOLS/Org/Scoped_Settings.H" #include #include using namespace COMIX; using namespace ATOOLS; static bool csscite(false); static const double invsqrttwo(1.0/sqrt(2.0)); template inline Type GetParameter(const std::string &name) { return ToType(rpa->gen.Variable(name)); } Amplitude::Amplitude(): p_model(NULL), m_nin(0), m_nout(0), m_dec(0), m_n(0), m_wfmode(0), m_ngpl(3), m_maxcpl(2,99), m_mincpl(2,0), m_maxacpl(2,99), m_minacpl(2,0), m_minntc(0), m_maxntc(99), m_pmode('D'), p_dinfo(new Dipole_Info()), p_colint(NULL), p_helint(NULL), m_trig(true), p_loop(NULL) { Settings& s = Settings::GetMainSettings(); Scoped_Settings comixsettings{ s["COMIX"] }; m_sccmur = s["USR_WGT_MODE"].Get(); m_murcoeffvirt = s["NLO_MUR_COEFFICIENT_FROM_VIRTUAL"].Get(); p_dinfo->SetMassive(0); m_pmode = comixsettings["PMODE"].Get()[0]; m_wfmode = comixsettings["WF_MODE"].Get(); m_pgmode = comixsettings["PG_MODE"].Get(); m_ngpl = Min(1, Max(5, comixsettings["N_GPL"].Get())); p_dinfo->SetAMin(s["DIPOLES"]["AMIN"].Get()); const auto amax = s["DIPOLES"]["ALPHA"].Get(); double cur{ 0.0 }; cur = s["DIPOLES"]["ALPHA_FF"].Get(); p_dinfo->SetAMax(0,cur?cur:amax); cur = s["DIPOLES"]["ALPHA_FI"].Get(); p_dinfo->SetAMax(2,cur?cur:amax); cur = s["DIPOLES"]["ALPHA_IF"].Get(); p_dinfo->SetAMax(1,cur?cur:amax); cur = s["DIPOLES"]["ALPHA_II"].Get(); p_dinfo->SetAMax(3,cur?cur:amax); p_dinfo->SetKappa(s["DIPOLES"]["KAPPA"].Get()); p_dinfo->SetNf(s["DIPOLES"]["NF_GSPLIT"].Get()); p_dinfo->SetKT2Max(s["DIPOLES"]["KT2MAX"].Get()); p_dinfo->SetDRMode(0); const subscheme::code subtype{ s["DIPOLES"]["SCHEME"].Get() }; p_dinfo->SetSubType(subtype); if (subtype==subscheme::Dire) p_dinfo->SetKappa(1.0); m_smth=GetParameter("NLO_SMEAR_THRESHOLD"); m_smpow=GetParameter("NLO_SMEAR_POWER"); } Amplitude::~Amplitude() { if (p_dinfo) delete p_dinfo; CleanUp(); } void Amplitude::CleanUp() { for (size_t i(0);i >(); m_on=m_son=std::vector >(); m_cchirs=m_dirs=Int_Vector(); for (size_t i(0);ip_id; delete [] m_subs[i]->p_fl; delete m_subs[i]; } m_subs.clear(); } Current *Amplitude::CopyCurrent(Current *const c) { Current_Key ckey(c->Flav(),p_model,c->Id().size()); Current *cur(Current_Getter::GetObject (std::string(1,m_pmode)+ckey.Type(),ckey)); if (cur==NULL) return NULL; cur->SetDirection(c->Direction()); cur->SetCut(c->Cut()); cur->SetOnShell(c->OnShell()); Int_Vector ids(c->Id()), isfs(ids.size()), pols(ids.size()); for (size_t i(0);iSetId(ids); cur->SetFId(isfs); cur->FindPermutations(); cur->InitPols(pols); cur->SetOrder(c->Order()); return cur; } bool Amplitude::AddRSDipoles() { #ifdef DEBUG__BG msg_Debugging()<Flav()); for (size_t i(0);iCId()&m_cur[1][j]->CId()) continue; Vertex *v(m_cur[2][i]->In().front()); Flavour fla(v->J(0)->Flav()), flb(v->J(1)->Flav()); bool isa(v->J(0)->CId()&(1<J(1)->CId()&(1<Order(0)==1 && flc.StrongCharge())) continue; if (m_cur[2][i]->In().size()!=1) THROW(not_implemented,"Invalid current"); if (!AddRSDipole(m_cur[2][i],m_cur[1][j],scur,1)) return false; } } } if (m_stype&2) { for (size_t j(0);jFlav()); for (size_t i(0);iCId()&m_cur[1][j]->CId()) continue; Vertex *v(m_cur[2][i]->In().front()); Flavour fla(v->J(0)->Flav()), flb(v->J(1)->Flav()); bool isa(v->J(0)->CId()&(1<J(1)->CId()&(1<In().size()!=1) THROW(not_implemented,"Invalid current"); if (!AddRSDipole(m_cur[2][i],m_cur[1][j],scur,2)) return false; } } } m_cur[2].insert(m_cur[2].end(),scur.begin(),scur.end()); #ifdef DEBUG__BG msg_Debugging()<<"} -> "<gen.AddCitation (1,"Comix subtraction is published in \\cite{Hoeche:2012xx}."); csscite=true; } return true; } bool Amplitude::AddRSDipole (Current *const c,Current *const s,Current_Vector &scur,int stype) { #ifdef DEBUG__BG msg_Indent(); #endif size_t isid((1<CId()&isid)==isid || c->Flav().IsDummy()) return true; Vertex *cin(c->In().front()); if (cin->J(0)->Direction()>0 || cin->J(1)->Direction()>0) { if (cin->J(0)->Flav().Mass() || cin->J(1)->Flav().Mass()) return true; } else { double mm(Flavour(p_dinfo->Nf()).Mass()); if (cin->J(0)->Flav().Mass()>mm && cin->J(1)->Flav().Mass()>mm) return true; } for (size_t k(0);kCId()==s->CId() && m_scur[k]->Sub()->CId()==c->CId()) return true; Current *jijt(CopyCurrent(c)), *jkt(CopyCurrent(s)); jijt->SetSub(jkt); jijt->SetKey(m_scur.size()); scur.push_back(jijt); jkt->SetSub(jijt); jkt->SetKey(m_scur.size()); m_scur.push_back(jkt); Vertex_Key *svkey(Vertex_Key::New(cin->J(),jijt,p_model)); svkey->m_p=std::string(1,m_pmode); svkey->p_dinfo=p_dinfo; svkey->m_stype=stype; svkey->p_k=s; svkey->p_kt=jkt; MODEL::VMIterator_Pair vmp(p_model->GetVertex(svkey->ID())); for (MODEL::Vertex_Map::const_iterator vit(vmp.first); vit!=vmp.second;++vit) { svkey->p_mv=vit->second; Vertex *v(new Vertex(*svkey)); v->AddJ(svkey->m_j); v->SetJC(svkey->p_c); } svkey->Delete(); #ifdef DEBUG__BG jijt->Print(); jkt->Print(); #endif return true; } bool Amplitude::AddVIDipoles() { #ifdef DEBUG__BG msg_Debugging()<Flav().StrongCharge(), m_cur[1][j]->Flav().StrongCharge()}; if (m_stype==2) { sc[0]=m_cur[1][i]->Flav().IntCharge(); sc[1]=m_cur[1][j]->Flav().IntCharge(); } if (sc[0]==0 || sc[1]==0) continue; if (!AddVIDipole(m_cur[1][i],m_cur[1][j],scur)) return false; } } m_cur[1].insert(m_cur[1].end(),scur.begin(),scur.end()); #ifdef DEBUG__BG msg_Debugging()<<"} -> "<gen.AddCitation (1,"Comix subtraction is published in \\cite{Hoeche:2012xx}."); csscite=true; } return true; } bool Amplitude::AddVIDipole (Current *const c,Current *const s,Current_Vector &scur) { #ifdef DEBUG__BG msg_Indent(); #endif size_t isid((1<CId()&isid)==isid || c->Flav().IsDummy()) return true; Current *jijt(CopyCurrent(c)), *jkt(CopyCurrent(s)); jijt->SetSub(jkt); jijt->SetKey(m_scur.size()); scur.push_back(jijt); jkt->SetSub(jijt); jkt->SetKey(m_scur.size()); m_scur.push_back(jkt); Current_Vector j(2,c); j[1]=NULL; Vertex_Key *svkey(Vertex_Key::New(j,jijt,p_model)); svkey->m_p=std::string(1,m_pmode); svkey->p_dinfo=p_dinfo; svkey->p_k=s; svkey->p_kt=jkt; MODEL::VMIterator_Pair vmp(p_model->GetVertex(svkey->ID())); for (MODEL::Vertex_Map::const_iterator vit(vmp.first); vit!=vmp.second;++vit) { svkey->p_mv=vit->second; Vertex *v(new Vertex(*svkey)); v->AddJ(svkey->m_j); v->SetJC(svkey->p_c); } if (svkey->p_mv==NULL) { std::swap(svkey->m_j[0],svkey->m_j[1]); vmp=p_model->GetVertex(svkey->ID()); for (MODEL::Vertex_Map::const_iterator vit(vmp.first); vit!=vmp.second;++vit) { svkey->p_mv=vit->second; Vertex *v(new Vertex(*svkey)); v->AddJ(svkey->m_j); v->SetJC(svkey->p_c); } } svkey->Delete(); #ifdef DEBUG__BG jijt->Print(); jkt->Print(); #endif return true; } bool Amplitude::MatchDecay(const Vertex_Key &vkey) const { std::vector c(vkey.m_j.size()); for (size_t j(0);jCId()); for (size_t i(0);im_id); if ((did&jid) && (did&~jid)) c[j]|=(1<m_id); Flavour dfl(m_decid[i]->m_fl); if (did&(1<<0)) { did=(1< &maxcpl,std::vector &mincpl, std::map &curs) { if (vkey.p_mv==NULL || vkey.p_mv->dec<0) return NULL; vkey.m_p=std::string(1,m_pmode); Vertex *v(new Vertex(vkey)); size_t ntc(0), ist(0); std::vector order(v->Order()); for (size_t i(0);iOrder().size()) order.resize(vkey.m_j[i]->Order().size(),0); for (size_t j(0);jOrder().size();++j) order[j]+=vkey.m_j[i]->Order(j); ntc+=vkey.m_j[i]->NTChannel(); if (bool(vkey.m_j[i]->CId()&1)^bool(vkey.m_j[i]->CId()&2)) ++ist; } if (ist==1) ntc+=!ckey.m_fl.Strong(); bool valid(true); for (size_t i(0);im_maxcpl[i]) valid=false; for (size_t i(0);im_maxacpl[i]) valid=false; if (!v->Active() || (!p_model->HasNegativeCouplingOrders() && !valid) || (n==m_n-1 && (ntcm_maxntc))) { #ifdef DEBUG__BG msg_Debugging()<<"delete vertex "<Order()<<")->{"<Flav()<<"} => " <Mode()) { size_t cid(0); for (size_t i(0);iCId(); if (vkey.m_j[i]->Sub()) { if ((vkey.m_j[i]->Id().size()==1 && p_dinfo->Mode()==1) || sub) return NULL; sub=vkey.m_j[i]->Sub(); } } if (sub && (sub->CId()&cid)) { #ifdef DEBUG__BG msg_Debugging()<<"delete vertex {"<Id() <<","<Sub()->Id() <<"}<->"<Sub()->Id())+ ToString(sub->Sub()->Sub()->Id()):"")+")"); if (order!=vkey.p_c->Order() || ntc!=vkey.p_c->NTChannel() || sub!=vkey.p_c->Sub()) { std::map::iterator cit(curs.find(okey)); if (cit!=curs.end()) vkey.p_c=cit->second; else { if (vkey.p_c->Order().size() || vkey.p_c->NTChannel()>0 || vkey.p_c->Sub()!=sub) vkey.p_c=Current_Getter::GetObject (std::string(1,m_pmode)+ckey.Type(),ckey); if (nSetCut(m_decid[dec-1]->m_nmax); vkey.p_c->SetOnShell(m_decid[dec-1]->m_osd); } vkey.p_c->SetNTChannel(ntc); } else { if (maxcpl.size()SetOrder(order); vkey.p_c->SetSub(sub); curs[okey]=vkey.p_c; } } v->AddJ(vkey.m_j); v->SetJC(vkey.p_c); return v; } void Amplitude::AddCurrent(const Int_Vector &ids,const size_t &n, const Flavour &fl,const int dir) { // add new currents std::vector maxcpl, mincpl; int dec(CheckDecay(fl,ids)); if (dec<0) return; size_t cid(0); for (size_t i(0);i curs; Current_Key ckey(dir>0?fl.Bar():fl,p_model,ids.size()); Current *cur(Current_Getter::GetObject (std::string(1,m_pmode)+ckey.Type(),ckey)); if (cur==NULL) return; cur->SetDirection(dir); if (dec!=0) { cur->SetCut(m_decid[dec-1]->m_nmax); cur->SetOnShell(m_decid[dec-1]->m_osd); } bool one(false); size_t nmax(Min(n,p_model->MaxLegs(ckey.m_fl.Bar())-1)); for (size_t nc(1);ncn-nc) { jc[jl--]=1; continue; } jj[jl]=m_cur[jc[jl]]; if(jlId().front()>=cj[i+1]->Id().front()) { ord=false; break; } if (!ord) continue; size_t tid(cid); for (size_t i(0);im_j[i]=cj[i]; size_t cur(cj[i]->CId()); if ((tid&cur)!=cur) break; tid&=~cur; } if (tid) continue; if (m_dec && !MatchDecay(*vkey)) continue; Permutation perm(cj.size()); for (int nperm(perm.MaxNumber()), i(0);im_j[i]=cj[p[i]]; MODEL::VMIterator_Pair vmp(p_model->GetVertex(vkey->ID())); for (MODEL::Vertex_Map::const_iterator vit(vmp.first);vit!=vmp.second;++vit) { vkey->p_mv=vit->second; if (AddCurrent(ckey,*vkey,n,dec,maxcpl,mincpl,curs)) f=true; } if (f) { one=true; break; } } } vkey->Delete(); } } if (!one && n>1) { delete cur; return; } if (n==1) curs[""]=cur; else delete cur; Int_Vector isfs(ids.size()), pols(ids.size()); for (size_t i(0);i::iterator cit(curs.begin());cit!=curs.end();++cit) { cit->second->SetId(ids); cit->second->SetFId(isfs); cit->second->FindPermutations(); cit->second->InitPols(pols); cit->second->SetKey(m_cur[n].size()); m_cur[n].push_back(cit->second); cit->second->Print(); } } bool Amplitude::Construct(Flavour_Vector &fls, Int_Vector ids,const size_t &n) { if (ids.size()==n) { if (n==m_n-1) { if (p_dinfo->Mode()==0) { if (!m_fl.front().IsOn()) return false; AddCurrent(ids,n,m_fl.front().Bar(),m_dirs.front()); } else { size_t kid(0); for (size_t i(0);i(int)kid) break; else ++kid; } if (kid>=m_cur[1].size()) THROW(fatal_error,"Internal error"); if (!m_fl[kid].IsOn()) return false; AddCurrent(ids,n,m_fl[kid].Bar(),m_dirs[kid]); if (kid==0 && (m_cur.back().size()==0 || m_cur.back().back()->CId()&1)) return false; } } else { if (m_affm.size()) { size_t cid(0); for (size_t i(0);i &caffm(m_affm[n][cid]); for (size_t i(0);iMode()==0 && n==m_n-1) { ids.back()=last+1; if (!Construct(fls,ids,n)) return false; return m_cur.back().size(); } int first(p_dinfo->Mode()&&ids.size()==1?last:last+1); for (size_t i(first);iIncludedFlavours()); for (size_t i(0);iMode()&2) && !AddVIDipoles()) return false; if (!Construct(fls,ids,2)) return false; if (p_dinfo->Mode()==1 && !AddRSDipoles()) return false; for (size_t i(3);iMode()) { for (Current_Vector::iterator cit(m_cur.back().begin()); cit!=m_cur.back().end();++cit) if ((*cit)->Sub()==NULL && (*cit)->CId()&1) { #ifdef DEBUG__BG msg_Debugging()<<"delete obsolete current "<<*cit<<"\n"; (*cit)->Print(); #endif delete *cit; cit=--m_cur.back().erase(cit); } } Prune(); if (p_dinfo->Mode()) { for (size_t i(0);iSub()==NULL && (i && m_cur.back()[i-1]->Sub())) { Current *c(m_cur.back()[i]); m_cur.back().erase(m_cur.back().begin()+i); m_cur.back().insert(m_cur.back().begin(),c); } for (Current_Vector::iterator cit(m_scur.begin()); cit!=m_scur.end();++cit) if ((*cit)->Sub()==NULL) { #ifdef DEBUG__BG msg_Debugging()<<"delete dipole current "<<**cit<<"\n"; #endif delete *cit; cit=--m_scur.erase(cit); } } msg_Debugging()<Sub()) { ++scsum; csvsum+=m_cur[i][j]->NIn(); } else { ++csum; cvsum+=m_cur[i][j]->NIn(); } } msg_Debugging()<<" "< "<1;--j) for (Current_Vector::iterator cit(m_cur[j].begin()); cit!=m_cur[j].end();++cit) if ((*cit)->Dangling()) { #ifdef DEBUG__BG msg_Debugging()<<"delete current "<<**cit<<", "<<(*cit)->Dangling() <<", O"<<(*cit)->Order()<<" vs. O_{min}" <Sub() && (*cit)->Sub()->Sub()==*cit) (*cit)->Sub()->SetSub(NULL); delete *cit; cit=--m_cur[j].erase(cit); } } bool Amplitude::ReadInAmpFile(const std::string &name,My_In_File &) { if (amp()==NULL) return false; amp->seekg(0); if (!amp->good()) return false; std::string cname, cmname; *amp>>cname>>cmname; if (cname!=name || cmname!=name || amp->eof()) THROW(fatal_error,"Corrupted map file '"+name+".map'"); m_affm.resize(m_n); for (size_t size, i(2);i>kfc; if (kfc==0) break; std::vector &caffm(m_affm[i][kfc]); *amp>>size; caffm.resize(size); for (size_t j(0);j>caffm[j]; } } *amp>>cname; if (cname!="eof") THROW(fatal_error,"Corrupted map file '"+name+".map'"); return true; } void Amplitude::WriteOutAmpFile(const std::string &name) { std::string ampfile(rpa->gen.Variable("SHERPA_CPP_PATH") +"/Process/Comix/"+name+".map"); if (FileExists(ampfile,1)) return; My_Out_File amp(ampfile); if (!amp.Open()) return; *amp< > kfcs; m_affm[i].clear(); for (size_t j(0);j &ckfcs(kfcs[m_cur[i][j]->CId()]); std::vector &caffm(m_affm[i][m_cur[i][j]->CId()]); long int kfc(m_cur[i][j]->Flav()); if (ckfcs.find(kfc)==ckfcs.end()) caffm.push_back(kfc); ckfcs.insert(kfc); } for (size_t j(0);j >::const_iterator it(m_affm[i].begin());it!=m_affm[i].end();++it) { *amp<first<<" "<second.size()<<" "; for (size_t k(0);ksecond.size();++k) *amp<second[k]<<" "; } *amp<<"0\n"; } *amp<<"eof\n"; } bool Amplitude::Initialize (const size_t &nin,const size_t &nout,const std::vector &flavs, const double &isf,const double &fsf,My_In_File &file, MODEL::Model_Base *const model,MODEL::Coupling_Map *const cpls, const int stype,const int smode,const cs_itype::type itype, const std::vector &maxcpl, const std::vector &mincpl, const std::vector &maxacpl, const std::vector &minacpl, const size_t &minntc,const size_t &maxntc,const std::string &name) { DEBUG_FUNC(flavs<<", stype="<<(sbt::subtype)(stype+1)<<", smode="<SetMode(smode); p_dinfo->SetIType(itype); ReadInAmpFile(name,ampfile); Int_Vector incs(m_nin,1); incs.resize(flavs.size(),-1); if (!Construct(incs,flavs,model,cpls)) return false; std::map fc; for (size_t i(nin);i::iterator fit(fc.find(flavs[i])); if (fit==fc.end()) { fc[flavs[i]]=0; fit=fc.find(flavs[i]); } ++fit->second; } m_fsf=fsf; m_sf=m_fsf*isf; return true; } void Amplitude::ConstructNLOEvents() { msg_Debugging()<Sub()->In().front()->Kin()); NLO_subevt *sub(new NLO_subevt()); m_subs.push_back(sub); sub->m_idx=i; sub->m_n=m_nin+m_nout-1; Flavour *fls(new Flavour[sub->m_n]); size_t *ids(new size_t[sub->m_n]); sub->m_i=kin->JI()->Id().front(); sub->m_j=kin->JJ()->Id().front(); sub->m_k=kin->JK()->Id().front(); bool order(true); if (sub->m_i>m_nin && sub->m_j>m_nin && kin->JI()->Flav().IsBoson() && kin->JJ()->Flav().IsFermion()) order=false; sub->m_oqcd=m_maxcpl[0]/2; sub->m_oew=m_maxcpl[1]/2; Current_Vector cur(sub->m_n,NULL); for (size_t k(0), j(0);km_j && order) || (k==sub->m_i && !order)) continue; if ((k==sub->m_i && order) || (k==sub->m_j && !order)) { cur[j]=kin->JIJT(); sub->m_ijt=j; } else if (k==sub->m_k) { cur[j]=kin->JKT(); sub->m_kt=j; } else { cur[j]=m_cur[1][k]; } fls[j]=cur[j]->Flav(); ids[j]=cur[j]->CId(); ++j; } kin->SetSubevt(sub); kin->SetCurrents(cur); sub->p_mom=&kin->Momenta().front(); for (size_t j(0);jp_fl=fls; sub->p_id=ids; sub->p_dec=&m_decid; PHASIC::Process_Info cpi; for (size_t j(0);jm_pname=PHASIC::Process_Base::GenerateName(cpi.m_ii,cpi.m_fi); sub->m_stype=(sbt::subtype)(m_stype); msg_Indent(); msg_Debugging()<<*sub<<"\n"; } NLO_subevt *sub(new NLO_subevt()); m_subs.push_back(sub); sub->m_idx=m_subs.size()-1; sub->m_n=m_nin+m_nout; Flavour *fls(new Flavour[sub->m_n]); size_t *ids(new size_t[sub->m_n]); for (size_t i(0);ip_mom=&m_p.front(); sub->p_fl=fls; sub->p_id=ids; sub->p_dec=&m_decid; PHASIC::Process_Info cpi; for (size_t j(0);jm_pname=PHASIC::Process_Base::GenerateName(cpi.m_ii,cpi.m_fi); sub->m_stype=sbt::none; sub->m_i=sub->m_j=sub->m_k=0; sub->m_oqcd=m_maxcpl[0]/2; sub->m_oew=m_maxcpl[1]/2; { msg_Indent(); msg_Debugging()<<*sub<<"\n"; } for (size_t i(0);ip_real=sub; for (size_t i(0);iSub()==NULL) m_sid[i]=m_subs.size()-1; else for (size_t j(0);jSub()==m_scur[j]) { m_sid[i]=j; break; } msg_Debugging()<<"}\n"; } void Amplitude::ConstructDSijMap() { m_dsm.clear(); m_dsf.clear(); size_t c(0), ifp(0); std::vector plist(m_fl.size()); if (m_stype==1) { for (size_t i(0);i(c)); Flavour ifl(m_cur[1][0]->Flav()); if (ifl.IsFermion() && !ifl.IsAnti()) { for (int i(m_fl.size()-1);i>0;--i) if (m_cur[1][i]->Flav().IsFermion()) ++ifp; } m_dsf.resize(m_cur.back().size(), std::pair(-1,ifp%2?-1.0:1.0)); for (size_t j(0);jSub()==NULL) continue; m_dsm[j]=std::pair (plist[m_cur.back()[j]->Sub()->Sub()->Id().front()], plist[m_cur.back()[j]->Sub()->Id().front()]); for (size_t i(0);iSub()==NULL && m_cur.back()[i]->Order()==m_cur.back()[j]->Order()) { m_dsf[j].first=i; break; } Flavour ffl(m_cur.back()[j]->Sub()->Flav()); if (!ffl.IsFermion()) continue; int idx(m_cur.back()[j]->Sub()->Id().front()); if (ffl.IsAnti()) { for (int i(0);iFlav().IsFermion()) m_dsf[j].second=-m_dsf[j].second; } else { for (int i(m_fl.size()-1);i>idx;--i) if (m_cur[1][i]->Flav().IsFermion()) m_dsf[j].second=-m_dsf[j].second; } } } size_t Amplitude::BornID(const size_t &id,const NLO_subevt *sub) const { if (sub==NULL) return id; Int_Vector mid(ID(id)); for (size_t n(0);nm_n;++m) if (sub->p_id[m]&(1<m_k:0), idij(sub?(1<m_i)|(1<m_j):0); msg_Debugging()<"<Flav().IsDummy()) continue; if (sub==NULL) { if (m_cur[i][j]->Sub()) continue; } else { if (m_cur[i][j]->CId()&(idij|idk)) if (m_cur[i][j]->Sub()==NULL || m_cur[i][j]->Id().size()==2 || m_cur[i][j]->Sub()->CId()!=idk || m_cur[i][j]->Sub()->Sub()->CId()!=idij) continue; } size_t id(BornID(m_cur[i][j]->CId(),sub)); size_t cid(BornID((1<CId(),sub)); Flavour_Vector &fs(flavs[id]), &cfs(flavs[cid]); Flavour f(m_cur[i][j]->Flav()), cf(f.Bar()); if (std::find(fs.begin(),fs.end(),f)==fs.end()) fs.push_back(f); if (std::find(cfs.begin(),cfs.end(),cf)==cfs.end()) cfs.push_back(cf); msg_Debugging()<<" "< "<Flav()<<"\n"; } msg_Debugging()<<" } -> "<Flav().IsDummy()) continue; if (sub==NULL) { if (m_cur[i][j]->Sub()) continue; } else { if (m_cur[i][j]->CId()&(idij|idk)) if (m_cur[i][j]->Sub()==NULL || m_cur[i][j]->Id().size()==2 || m_cur[i][j]->Sub()->CId()!=idk || m_cur[i][j]->Sub()->Sub()->CId()!=idij) continue; } Vertex_Vector ins(m_cur[i][j]->In()); for (size_t k(0);kJ().size()>2 || ins[k]->J(0)->Flav().IsDummy() || ins[k]->J(1)->Flav().IsDummy()) continue; size_t ida(BornID(ins[k]->J(0)->CId(),sub)); size_t idb(BornID(ins[k]->J(1)->CId(),sub)); size_t idc(BornID((1<JC()->CId(),sub)); if (brs) { (*brs)[ida]=ins[k]->J(0)->CId(); (*brs)[idb]=ins[k]->J(1)->CId(); (*brs)[idc]=(1<JC()->CId(); } msg_Debugging()<<" "<(ida,idb)); combs.insert(std::pair(idb,ida)); combs.insert(std::pair(idb,idc)); combs.insert(std::pair(idc,idb)); combs.insert(std::pair(idc,ida)); combs.insert(std::pair(ida,idc)); } } msg_Debugging()<<" } -> "<Flav())==flmap.end()) { msg_Debugging()<<" mapped ["<Flav() <<" -> "<Flav()<<"\n"; if (ampl.m_cur[n][i]->Flav().IsAnti()^ m_cur[n][i]->Flav().IsAnti()) { msg_Debugging()<<" particle type differs\n }\n"; msg_Debugging()<<"} no match\n"; flmap.clear(); return false; } if (ampl.m_cur[n][i]->Flav().Mass()!= m_cur[n][i]->Flav().Mass() || ampl.m_cur[n][i]->Flav().Width()!= m_cur[n][i]->Flav().Width()) { msg_Debugging()<<" mass or width differs\n }\n"; msg_Debugging()<<"} no match\n"; flmap.clear(); return false; } if (ampl.m_cur[n][i]->Flav().StrongCharge()!= m_cur[n][i]->Flav().StrongCharge()) { msg_Debugging()<<" color structure differs\n }\n"; msg_Debugging()<<"} no match\n"; flmap.clear(); return false; } flmap[ampl.m_cur[n][i]->Flav()]=m_cur[n][i]->Flav(); } else { if (m_cur[n][i]->Flav()!= flmap[ampl.m_cur[n][i]->Flav()]) { msg_Debugging()<<" current differs\n }\n"; msg_Debugging()<<"} no match\n"; flmap.clear(); return false; } } Vertex_Vector vin(m_cur[n][i]->In()); Vertex_Vector avin(ampl.m_cur[n][i]->In()); if (avin.size()!=vin.size()) { msg_Debugging()<<" vertex count differs\n }\n"; msg_Debugging()<<"} no match\n"; flmap.clear(); return false; } if (n>1) for (size_t j(0);jMap(*vin[j])) { msg_Debugging()<<" } no match\n }\n} no match\n"; flmap.clear(); return false; } #ifdef DEBUG__BG msg_Debugging()<<" }\n"; #endif } msg_Debugging()<<" }\n"; } } msg_Debugging()<<"} matched\n"; return true; } #ifdef USING__Threading void *Amplitude::TCalcJL(void *arg) { CDBG_ME_TID *tid((CDBG_ME_TID*)arg); pthread_mutex_lock(&tid->m_s_mtx); while (true) { pthread_cond_wait(&tid->m_s_cnd,&tid->m_s_mtx); if (tid->m_s==0) return NULL; for (tid->m_i=tid->m_b;tid->m_im_e;++tid->m_i) tid->p_ampl->m_cur[tid->m_n][tid->m_i]->Evaluate(); pthread_cond_signal(&tid->m_t_cnd,&tid->m_t_mtx); } pthread_mutex_unlock(&tid->m_s_mtx); return NULL; } #endif void Amplitude::CalcJL() { SetCouplings(); for (size_t i(0);iConstructJ(m_p[i],m_ch[i],m_cl[i][0],m_cl[i][1],m_wfmode); for (size_t i(m_n);iEvaluate(); for (size_t n(2);nEvaluate(); #else if (p_cts->empty()) for (size_t i(0);iEvaluate(); else { size_t d(m_cur[n].size()/p_cts->size()); if (m_cur[n].size()%p_cts->size()>0) ++d; for (size_t j(0), i(0);jsize()&&ip_ampl=this; tid->m_n=n; tid->m_b=i; tid->m_e=Min(i+=d,m_cur[n].size()); pthread_cond_signal(&tid->m_s_cnd,&tid->m_s_mtx); } for (size_t j(0), i(0);jsize()&&im_t_cnd,&tid->m_t_mtx); } } #endif } } void Amplitude::SetCouplings() const { #ifdef DEBUG__CF msg_Debugging()<Factor()):1.0); double gwfac(aqed?sqrt(aqed->Factor()):1.0); double fac(1.0); Vertex *v(m_cpls[i].p_v); size_t oqcd(m_cpls[i].m_oqcd), oew(m_cpls[i].m_oew); if (aqcd && oqcd) { #ifdef DEBUG__CF msg_Debugging()<<" qcd: "<Factor()<<" ^ "<Factor()<<" ^ "<SetCplFac(fac); } #ifdef DEBUG__CF msg_Debugging()<<"}\n"; #endif } void Amplitude::ResetJ() { for (size_t n(1);n<=m_n-1;--n) { for (size_t i(0);iResetJ(); } } void Amplitude::ResetZero() { for (size_t n(m_n-2);n>=2;--n) { for (size_t i(0);iResetZero(); } } bool Amplitude::SetMomenta(const Vec4D_Vector &moms) { #ifdef DEBUG__BG msg_Debugging()<0?-moms[i]:moms[i]; #ifdef DEBUG__BG sum+=m_p[i]; msg_Debugging()<<"set p["<gen.Accu())); if (!IsEqual(sum,Vec4D(),accu)) msg_Error()<SetStat(1); for (size_t i(0);iSetP(m_p[i]); for (size_t i(0);iSub()->In().front()->Kin()->Evaluate(); return p_dinfo->Stat(); } bool Amplitude::RSTrigger (PHASIC::Combined_Selector *const sel,const int mode) { if (m_subs.empty() || sel==NULL) return true; sel->RSTrigger(&m_subs); int trig=m_trig=m_subs.back()->m_trig; for (size_t i(0);iSub()->In().front()->Kin()); int ltrig(m_subs[i]->m_trig); kin->SetF(1.0); if (m_smth) { double a(m_smth>0.0?m_subs[i]->m_kt2=kin->KT2():kin->Y()); if (a>0.0 && aSetF(pow(a/dabs(m_smth),m_smpow)); if (ltrig==0) kin->SetF(-kin->F()); ltrig=1; } } kin->AddTrig(ltrig?1:0); m_subs[i]->m_trig=kin->Trig()?ltrig:0; trig|=kin->Trig(); } return trig; } double Amplitude::KT2Trigger(NLO_subevt *const sub,const int mode) { if (mode==0) return 1.0; Dipole_Kinematics *kin (m_scur[sub->m_idx]->Sub()->In().front()->Kin()); if (mode==1) { double kt2j(sub->m_mu2[stp::res]); if (sub->m_mu2[stp::size+stp::res]) kt2j=sub->m_mu2[stp::size+stp::res]; int da(kin->A()>0.0 && kin->KT2()Y()AMax(kin->Type())); kin->AddTrig(abs(ds-da)); return ds-da; } if (mode==2) { double kt2j(sub->m_mu2[stp::res]); if (sub->m_mu2[stp::size+stp::res]) kt2j=sub->m_mu2[stp::size+stp::res]; int da(kin->A()>0.0 && kin->KT2()AddTrig(da); return da; } if (mode==3) { int ds(kin->Y()AMax(kin->Type())); kin->AddTrig(abs(ds-1)); return ds-1; } THROW(not_implemented,"Invalid call"); return 0.0; } void Amplitude::SetCTS(void *const cts) { #ifdef USING__Threading p_cts=(CDBG_ME_TID_Vector*)cts; #endif } void Amplitude::SetColors(const Int_Vector &rc, const Int_Vector &ac,const int set) { #ifdef DEBUG__BG msg_Debugging()<::max()), cimax(0); for (size_t i(0);icimax) cimax=m_cl[i][0]; } msg_Debugging()<<"cimin = "<Eps_Scheme_Factor(mom); return 4.0*M_PI; } bool Amplitude::Evaluate(const Int_Vector &chirs) { THROW(not_implemented,"Helicity sampling currently disabled"); return true; } bool Amplitude::EvaluateAll(const bool& mode) { if (p_loop) p_dinfo->SetDRMode(p_loop->DRMode()); for (size_t i(0);iReset(0); for (size_t j(0);jScale():-1.0); p_dinfo->SetMu2(mu2); CalcJL(); #ifdef DEBUG__BG msg_Debugging()<Sub()) continue; for (size_t j(0);jContract(*m_cur[1].front(),m_cchirs,m_ress[i]); #ifdef DEBUG__BG for (size_t j(0);j "<Sub()==NULL) continue; for (size_t j(0);jMode()==1) m_cur.back()[i]->Contract(*m_cur.back()[i]->Sub(),m_cchirs,m_ress[i]); else { for (size_t j(0);j ress(m_fl,0.0); m_cur.back()[i]->Contract(*m_cur.back()[i]->Sub(),m_cchirs,ress); for (size_t j(0);j "<"; for (size_t l(m_nin);lSub()->Sub()->Id().front()<<"," <Sub()->Id().front()<<")["<Contract(*m_cur.back()[i]->Sub(),m_cchirs,m_cress[i],1); m_cur.back()[i]->Contract(*m_cur.back()[i]->Sub(),m_cchirs,m_cress[i],2); #ifdef DEBUG__BG for (size_t j(0);j " < cpls(m_cur.back()[i]->Order()); if (cpls.size()Order().size()) cpls.resize(m_cur.back()[j]->Order().size(),0); for (size_t l(0);lOrder().size();++l) cpls[l]+=m_cur.back()[j]->Order()[l]; msg_Debugging()<<"ME^2 "<Order()<<"x" <Order()<<" {\n"; #endif for (size_t k(0);k " <<(m_ress[i][k]*std::conj(m_ress[j][k])).real()<<"\n"; #endif csum+=(m_ress[i][k]*std::conj(m_ress[j][k])).real(); } #ifdef DEBUG__BG msg_Debugging()<<"}\n"; #endif } m_born=m_res=csum/m_sf; m_cmur[1]=m_cmur[0]=csum=0.0; if (p_dinfo->Mode()) { assert(cpl!=NULL); double asf(cpl->Default()*cpl->Factor()/(2.0*M_PI)); if (p_loop) { p_loop->SetRenScale(mu2); m_p[0]=-m_p[0]; m_p[1]=-m_p[1]; p_loop->Calc(m_p); m_p[0]=-m_p[0]; m_p[1]=-m_p[1]; } if (p_dinfo->Mode()==1) { if (!m_trig) m_born=m_res=0.0; m_subs.back()->m_me=m_subs.back()->m_mewgt=m_res; } if (p_dinfo->Mode()&2) { for (size_t i(0);i cpls(m_cur.back()[i]->Order()); if (cpls.size()Order().size()) cpls.resize(m_cur.back()[j]->Order().size(),0); for (size_t l(0);lOrder().size();++l) cpls[l]+=m_cur.back()[j]->Order()[l]; msg_Debugging()<<"ME^2 "<Order()<<"x" <Order()<<", dipole " <Sub()->Sub()->Id() <Sub()->Id()<<" (type=" <Sub()->Sub()->In().front()->SType()<<") {\n"; #endif double ccsum(0.0); for (size_t k(0);k " <Mode()==1) { if (m_smth) { Dipole_Kinematics *kin=m_cur.back()[i]-> Sub()->Sub()->In().front()->Kin(); if (kin->F()!=1.0) { double x(dabs(kin->F())); if (m_trig) { m_subs.back()->m_me+=(1.0-x)*ccsum; m_subs.back()->m_mewgt+=(1.0-x)*ccsum; } if (kin->F()<0.0) x=0.0; ccsum*=x; } } m_subs[m_sid[i]]->m_me=m_subs[m_sid[i]]->m_mewgt=ccsum; } else { Dipole_Kinematics *kin=m_cur.back()[j]-> Sub()->Sub()->In().front()->Kin(); m_p[0]=-m_p[0]; m_p[1]=-m_p[1]; //double lf(log(2.0*M_PI*mu2/EpsSchemeFactor(m_p)/ // dabs(kin->JIJT()->P()*kin->JK()->P()))); double lf(0.); if (!p_loop || !(p_loop->fixedIRscale())) lf = log(2.0*M_PI*mu2/EpsSchemeFactor(m_p)/dabs(kin->JIJT()->P()*kin->JK()->P())); else{ double irscale=p_loop->IRscale(); lf = log(2.0*M_PI*sqr(irscale)/EpsSchemeFactor(m_p)/dabs(kin->JIJT()->P()*kin->JK()->P())); } m_p[0]=-m_p[0]; m_p[1]=-m_p[1]; #ifdef DEBUG__BG msg_Debugging()<<"e^2 = "<Res(2)<<", e = "<Res(1) <<", f = "<Res(0)<<", l = "<Res(2); m_cmur[0]-=ccsum*asf*(kin->Res(1)+lf*kin->Res(2)); ccsum*=-asf*(kin->Res(0)+lf*kin->Res(1)+0.5*sqr(lf)*kin->Res(2)); } if (mode || p_dinfo->IType()&cs_itype::I) csum+=ccsum; } if (p_loop) { double cw(p_loop->Mode()?1.0/m_sf:m_res); if (p_loop->Mode() && p_loop->ColMode()==0) cw*=1.0/p_colint->GlobalWeight(); if (p_dinfo->Mode()&8) { double e1p(-m_cmur[0]/m_res/asf), e2p(-m_cmur[1]/m_res/asf); double e1l(p_loop->ME_E1()), e2l(p_loop->ME_E2()); if (p_loop->Mode()) { e1l/=p_loop->ME_Born()*m_sf; e2l/=p_loop->ME_Born()*m_sf; } if (!IsEqual(e2p,e2l)) msg_Error()< " < "< " < "<ME_Finite(); if (m_murcoeffvirt && p_loop->ProvidesPoles()) { if (m_sccmur) { double b0(11.0/6.0*3.0-2.0/3.0*0.5*Flavour(kf_quark).Size()/2.); m_cmur[0]+=cw*asf*(p_loop->ME_E1()+m_maxcpl[0]/2.*b0); m_cmur[1]+=cw*asf*p_loop->ME_E2(); } else { m_cmur[0]+=cw*asf*p_loop->ScaleDependenceCoefficient(1); m_cmur[1]+=cw*asf*p_loop->ScaleDependenceCoefficient(2); } } else { double b0(11.0/6.0*3.0-2.0/3.0*0.5*Flavour(kf_quark).Size()/2.); m_cmur[0]=cw*asf*m_maxcpl[0]/2.*b0; m_cmur[1]=0.; } } if (!(p_dinfo->Mode()&4)) { if (p_dinfo->Mode()&2) m_born=m_res=0.0; if ((p_dinfo->Mode()&16) && p_loop) m_born=m_res=0.0; } } #ifdef DEBUG__BG msg_Debugging()<<"m_res = "< "<I(),p_colint->J()); } double Amplitude::Differential (const Int_Vector &ci,const Int_Vector &cj,const int set) { SetColors(ci,cj,set); if (p_helint!=NULL && p_helint->On()) { Evaluate(p_helint->Chiralities()); return m_res; } EvaluateAll(); return m_res; } bool Amplitude::ConstructChirs() { DEBUG_FUNC(""); for (size_t i(0);i(m_fl,0.0)); m_cur.back()[i]->HM().resize(m_ress.back().size()); for (size_t j(0);jHM()[j]=j; } m_cchirs.resize(m_ress.back().size()); for (size_t j(0);jMode()==0) return true; m_cress=m_ress; for (size_t i(0);iSub()->In().front()->Kin()); Current *last(NULL); for (size_t j(0);jSub()!=m_scur[i]) continue; last=m_cur.back()[j]; last->HM().resize(m_ress.front().size(),0); kin->PM().resize(m_ress.front().size(),0); int ii(kin->JI()?kin->JI()->Id().front():-1); int ij(kin->JJ()?kin->JJ()->Id().front():-1); size_t ik(kin->JK()->Id().front()); Flavour_Vector cfl(1,m_scur[i]->Flav()); for (size_t j(0);j tch(cfl,0.0); for (size_t j(0);jHM()[tch.GetNumber(di)]=j; if (ii==-1 || ij==-1 || id[ii]==id[ij]) continue; std::swap(id[ii],id[ij]); kin->PM()[j]=m_ress.front().GetNumber(id); } } } return true; } bool Amplitude::CheckOrders() { std::vector maxcpl(2,0), mincpl(2,99); std::vector maxacpl(2,0), minacpl(2,99); msg_Debugging()< &icpls(m_cur.back()[i]->Order()); if (m_maxacpl.size()m_maxacpl[k]) any=false; if (any) { any=false; if (maxacpl.size() &jcpls(m_cur.back()[j]->Order()); if (m_cur.back()[i]->Sub()!= m_cur.back()[j]->Sub()) continue; bool on(true); std::vector cpls(icpls); if (cpls.size()m_maxcpl[k]) on=false; for (size_t k(cpls.size());kSub()) m_son.push_back(std::pair(i,j)); else m_on.push_back(std::pair(i,j)); any=true; } } } if (!any) { #ifdef DEBUG__BG msg_Debugging()<<"delete obsolete current: "<Print(); #endif delete m_cur.back()[i]; m_cur.back().erase(m_cur.back().begin()+i); for (size_t k(0);ki) --m_son[k].second; for (size_t k(0);ki) --m_on[k].second; --i; } } bool valid(false); for (size_t k(0);kGet("Alpha_QCD")); MODEL::Coupling_Data *rqed(cpls->Get("Alpha_QED")); for (long int i(0);iIn().size();++j) { Vertex *v(m_cur.back()[i]->In()[j]); int oqcd(v->Order(0)), oew(v->Order(1)); for (size_t i(0);iJ().size();++i) { oqcd+=v->J(i)->Order(0); oew+=v->J(i)->Order(1); } m_cpls.push_back(Coupling_Info(v,oqcd,oew,rqcd,rqed)); } } if (p_dinfo->Mode()==1) for (size_t i(0);iGet("Alpha_QCD",m_subs[i])); if (aqcd==NULL && rqcd) { aqcd = new MODEL::Coupling_Data(*rqcd,m_subs[i]); cpls->insert(std::make_pair("Alpha_QCD",aqcd)); } MODEL::Coupling_Data *aqed(cpls->Get("Alpha_QED",m_subs[i])); if (aqed==NULL && rqed) { aqed = new MODEL::Coupling_Data(*rqed,m_subs[i]); cpls->insert(std::make_pair("Alpha_QED",aqed)); } Current *last(NULL); for (size_t j(0);jSub()==m_scur[i]) { last=m_cur.back()[j]; break; } if (last==NULL) THROW(fatal_error,"Internal error"); for (size_t j(0);jIn().size();++j) { Vertex *v(last->In()[j]); int oqcd(v->Order(0)), oew(v->Order(1)); for (size_t i(0);iJ().size();++i) { oqcd+=v->J(i)->Order(0); oew+=v->J(i)->Order(1); } m_cpls.push_back(Coupling_Info(v,oqcd,oew,aqcd,aqed)); } } return true; } bool Amplitude::Construct (const Int_Vector &incs,const Flavour_Vector &flavs, MODEL::Model_Base *const model,MODEL::Coupling_Map *const cpls) { p_model=model; m_dirs=incs; if (!Construct(flavs)) return false; if (!CheckOrders()) return false; msg_Debugging()<Sub()) { ++scsum; csvsum+=m_cur[i][j]->NIn(); } else { ++csum; cvsum+=m_cur[i][j]->NIn(); } } msg_Debugging()<<" "< "<Mode()==1) ConstructNLOEvents(); if (p_dinfo->Mode()&2) ConstructDSijMap(); if (!ConstructCouplings(cpls)) return false; return true; } void Amplitude::FillAmplitudes (std::vector &s, std::vector > &cols) { cols.push_back(std::vector(1,1.0)); amps.push_back(Spin_Amplitudes(m_fl,Complex(0.0,0.0))); for (size_t i(0);iDefault()*cpl->Factor(); } void Amplitude::FillMEWeights(ME_Weight_Info &wgtinfo) const { if (wgtinfo.m_wren.size()<2) return; for (size_t i=0;i<2;i++) wgtinfo.m_wren[i]=m_cmur[i]; wgtinfo.m_VI=m_res-m_born; } void Amplitude::SetNLOMC(PDF::NLOMC_Base *const mc) { for (size_t i(0);iSub()->In().front()->Kin()->SetNLOMC(mc); } void Amplitude::SetGauge(const size_t &n) { Vec4D k(1.0,0.0,1.0,0.0); switch(n) { case 1: k=Vec4D(1.0,0.0,invsqrttwo,invsqrttwo); break; case 2: k=Vec4D(1.0,invsqrttwo,0.0,invsqrttwo); break; case 3: k=Vec4D(1.0,invsqrttwo,invsqrttwo,0.0); break; } for (size_t j(1);jSetGauge(k); for (size_t i(0);iSetGauge(k); } bool Amplitude::GaugeTest(const Vec4D_Vector &moms,const int mode) { if (mode==0) { size_t nt(0); bool cnt(true); while (cnt) { while (!p_colint->GeneratePoint()); SetColors(p_colint->I(),p_colint->J()); if (!GaugeTest(moms,1)) return false; double res(m_born?m_born:m_res); if (res!=0.0) cnt=false; if (cnt) { if (++nt>100) msg_Error()<GeneratePoint()); } } return true; } msg_Tracking()<::DefaultGauge()); Spinor::SetGauge(sd>0?sd-1:sd+1); } PHASIC::Virtual_ME2_Base *loop(p_loop); p_loop=NULL; SetGauge(1); SetMomenta(moms); if (!EvaluateAll(true)) { p_loop=loop; return false; } double res(m_born?m_born:m_res); if (m_pmode=='D') Spinor::ResetGauge(); SetGauge(0); SetMomenta(moms); if (!EvaluateAll(true)) { p_loop=loop; return false; } p_loop=loop; double res2(m_born?m_born:m_res); msg_Debugging()< dev. "< "< &cvs) const { if ((*graph)->empty()) { size_t fp(0), nf(0); for (size_t j(1);jsize();++j) if ((*graph)[j].find("%%")==std::string::npos) { std::string cl((*graph)[j]); size_t bpos(cl.find("F=")); if (bpos!=std::string::npos) { ++nf; size_t epos(bpos+=2); for (;cl[epos]>=48 && cl[epos]<=57;++epos); fp+=ToType(cl.substr(bpos,epos-bpos)); } bpos=cl.find("T="); if (bpos!=std::string::npos) { size_t epos(cl.find(')',bpos+=2)); cvs.insert(cl.substr(bpos,epos-bpos+1)); } } str<<" \\parbox{"<<(5*m_n+20)<<"mm}{\\begin{center}\n Graph "<<++ng; if (nf>0) str<<", $\\sum \\rm F$="<front()<<"}\n"; for (size_t j(0);jsize();++j) if ((*graph)[j].find("%%")==std::string::npos) str<<(*graph)[j]<<"\n"; str<<" \\end{fmfgraph*}\\end{center}\\vspace*{5mm}}"; if (ng>0 && ng%m_ngpl==0) str<<" \\\\\n\n"; else str<<" &\n\n"; } else { for (size_t i(0);i<(*graph)->size();++i) WriteOutGraph(str,(*graph)()[i],ng,cvs); } } void Amplitude::WriteOutGraphs(const std::string &file) const { msg_Tracking()< cvs; for (size_t i(0);iSub()==NULL) { Graph_Node graphs("j_1",true); graphs.push_back(" %% "+graphs.back()); m_cur.back()[i]->CollectGraphs(&graphs); WriteOutGraph(str,&graphs,ng,cvs); } str<<"\n \\end{longtable}\n\n"; if (!cvs.empty() && (m_pgmode&1)) { str<<" \\begin{longtable}{c}\n"; for (std::set::const_iterator vit(cvs.begin());vit!=cvs.end();++vit) { std::string label(*vit); for (size_t pos(label.find(",,")); pos!=std::string::npos;pos=label.find(",,",pos+1)) label.replace(pos,2,","); str<<" $"<NIn(); if (mode&1) str<<" "< "; str<