#include "AMEGIC++/Amplitude/Vertex.H" #include "AMEGIC++/Main/Tools.H" #include "MODEL/Main/Model_Base.H" #include "MODEL/Main/Single_Vertex.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Math/Vector.H" #include "ATOOLS/Org/Shell_Tools.H" #include "ATOOLS/Org/Exception.H" #include "ATOOLS/Org/My_MPI.H" #include #include #include #include using namespace ATOOLS; using namespace AMEGIC; using namespace std; // Constructor and Destructor Vertex::Vertex(MODEL::Model_Base * _model) { msg_Debugging()<<" Setting vertices..."<OriginalVertices().size();++i) { MODEL::Single_Vertex *v((MODEL::Single_Vertex*)&_model->OriginalVertices()[i]); if (v->dec>0) continue; Single_Vertex *av(NULL); if (v->in.size()==3) { m_v.push_back(Single_Vertex()); av=&m_v.back(); av->nleg=3; } else { m_v4.push_back(Single_Vertex()); av=&m_v4.back(); av->nleg=4; } av->order=v->order; av->dec=v->dec; for (size_t j(0);jin.size();++j) av->in[j]=v->in[j]; av->in[0]=av->in[0].Bar(); av->cpl=v->cpl; if (av->cpl.size()==1) av->cpl.push_back(av->cpl.front()); av->Color=v->Color; for (size_t j(0);jColor.size();++j) { for (int k(0);k<3;++k) { --av->Color[j].m_partarg[k]; if (av->Color[j].m_partarg[k]<-1) av->Color[j].m_partarg[k]=4; } if (av->Color[j].p_next) { for (int k(0);k<3;++k) { --av->Color[j].p_next->m_partarg[k]; if (av->Color[j].p_next->m_partarg[k]<-1) av->Color[j].p_next->m_partarg[k]=4; } } } // the FFV L/R structure if (v->Lorentz.size()==1) { if (v->Lorentz.front()=="FFVL") { av->cpl.back()=Kabbala("0",Complex(0.,0.)); av->Lorentz.push_back(MODEL::LF_Getter::GetObject("FFV",MODEL::LF_Key())); } if (v->Lorentz.front()=="FFVR") { av->cpl.front()=Kabbala("0",Complex(0.,0.)); av->Lorentz.push_back(MODEL::LF_Getter::GetObject("FFV",MODEL::LF_Key())); } } if (v->Lorentz.size()==2) { if (v->Lorentz.front()=="FFVL" && v->Lorentz.back()=="FFVR") { av->Lorentz.push_back(MODEL::LF_Getter::GetObject("FFV",MODEL::LF_Key())); av->Color.pop_back(); } } bool error(false); if (av->Lorentz.empty()) { for (size_t j(0);jLorentz.size();++j) { av->Lorentz.push_back(MODEL::LF_Getter::GetObject(v->Lorentz[j],MODEL::LF_Key())); if (av->Lorentz.back()==NULL){ msg_Error()<Lorentz[j]+"'. Skip."<in.size()==3) m_v.pop_back(); else m_v4.pop_back(); continue; } if (v->in.size()==3) { // the weird fermion rule if (av->in[0].IsFermion() && av->in[1].IsFermion() && !av->in[2].IsFermion()) { std::swap(av->in[1],av->in[2]); std::swap(av->cpl[0],av->cpl[1]); for (size_t j(0);jLorentz.size();++j) av->Lorentz[j]->SetParticleArg(1); for (size_t j(0);jColor.size();++j) { for (size_t k(0);k<3;++k) if (av->Color[j].m_partarg[k]==1) { av->Color[j].m_partarg[k]=2; av->Color[j].m_strarg[k]=50; } else if (av->Color[j].m_partarg[k]==2) { av->Color[j].m_partarg[k]=1; av->Color[j].m_strarg[k]=49; } } } } // the HEFT decomposition flag for (size_t i(0);iin.size();++i) if (v->in[i].Kfcode()==kf_shgluon) { if (v->in.size()==3) av->t=-1; else av->t=1; break; } } m_nvertex = m_v.size(); m_n4vertex = m_v4.size(); //Print(); //TexOutput(); GenerateVertex(); Print(); msg_Debugging()<<"... done with it ("< "<0 && orig.dec&4) && !((i0==1 && i1==2 && i2==3) || (i0==-2 && i1==3 && i2==-1) || (i0==-3 && i1==-1 && i2==2))) return 0; if ((orig.dec>0 && orig.dec&2) && !(i0==1 && i1==2 && i2==3)) return 0; if (i0<0) probe.in[0] = orig.in[-i0-1].Bar(); else probe.in[0] = orig.in[i0-1]; if (i1<0) probe.in[1] = orig.in[-i1-1].Bar(); else probe.in[1] = orig.in[i1-1]; if (i2<0) probe.in[2] = orig.in[-i2-1].Bar(); else probe.in[2] = orig.in[i2-1]; if (orig.nleg==4) { if (i3<0) probe.in[3] = orig.in[-i3-1].Bar(); else if (i3<99) probe.in[3] = orig.in[i3-1]; } if (CheckExistence(probe)==0) return 0; if (probe.nleg==3) { if (FermionRule(probe)==0) return 0;} int hc = 0; int cnt = 0; for(int i=0;i0){ Flavour *flavlist= new Flavour[cnt]; int *flaglist= new int[cnt]; cnt = 0; for(int i=0;iType()=="SSV" || orig.Lorentz.front()->Type()=="VVV") conjugate *= -1; if (conjugate==-1) { for (short int i=0;i<4;i++) probe.cpl[i] = -probe.cpl[i]; } probe.Color.front().Conjugate(); if (probe.Lorentz.front()->String()=="1") { //exchange left and right Kabbala help = probe.cpl[0]; probe.cpl[0] = probe.cpl[1]; probe.cpl[1] = help; } } } if (orig.nleg==3 && (orig.Lorentz.front()->Type()=="FFV")) { //exchange left and right for 'barred' FFV vertices if ((i0==-1 && (!orig.in[0].SelfAnti() || (!orig.in[2].SelfAnti()))) || (i0==-3 && (!orig.in[2].SelfAnti() || (!orig.in[0].SelfAnti())))) { Kabbala help = -probe.cpl[0]; probe.cpl[0] = -probe.cpl[1]; probe.cpl[1] = help; } } if (probe.dec>0 && probe.in[2].IsDummy()) for (short int i=0;i<4;i++) probe.cpl[i] = -probe.cpl[i]; //Color and Lorentz structure changes.... int newIndex[4]; for (short int i=0;i<4;i++) newIndex[i] = -1; for (short int i=0;i T[new0,new1,new2] for (short int i=0;i<3;i++) { if (colfunc->Type()==MODEL::cf::D && i==2) break; switch (colfunc->ParticleArg(i)) { case 0: partarg[i] = new0; strarg[i] = new0+48; break; case 1: partarg[i] = new1; strarg[i] = new1+48; break; case 2: partarg[i] = new2; strarg[i] = new2+48; break; case 3: partarg[i] = new3; strarg[i] = new3+48; break; case 4: partarg[i] = 4; strarg[i] = '4'; break; } } //T[0,1,4]T[3,4,2] -> T[new0,new1,4]T[new3,4,new2] if (colfunc->Next()) { for (short int i=0;i<3;i++) { if (colfunc->Next()->Type()==MODEL::cf::D && i==2) break; switch (colfunc->Next()->ParticleArg(i)) { case 0: partargn[i] = new0; strargn[i] = new0+48; break; case 1: partargn[i] = new1; strargn[i] = new1+48; break; case 2: partargn[i] = new2; strargn[i] = new2+48; break; case 3: partargn[i] = new3; strargn[i] = new3+48; break; case 4: partargn[i] = 4; strargn[i] = '4'; break; } } } colfunc->SetStringArg(strarg[0],strarg[1],strarg[2]); colfunc->SetParticleArg(partarg[0],partarg[1],partarg[2]); if (colfunc->Next()) { colfunc->Next()->SetStringArg(strargn[0],strargn[1],strargn[2]); colfunc->Next()->SetParticleArg(partargn[0],partargn[1],partargn[2]); } } void Vertex::LorentzExchange(MODEL::Lorentz_Function* lorfunc,int new0,int new1,int new2,int new3) { int partarg[4]={-1,-1,-1,-1}; for (short int i=0;iNofIndex();i++) { switch (lorfunc->ParticleArg(i)) { case 0: partarg[i] = new0;break; case 1: partarg[i] = new1;break; case 2: partarg[i] = new2;break; case 3: partarg[i] = new3;break; } } lorfunc->SetParticleArg(partarg[0],partarg[1],partarg[2],partarg[3]); } void Vertex::CheckEqual(Flavour** fl,short int& count) { for (short int i=0;inleg==3) { for (int j=0;j<3;++j){ // rotate flavours help =v_tofind->in[0]; v_tofind->in[0]=v_tofind->in[1]; v_tofind->in[1]=v_tofind->in[2]; v_tofind->in[2]=help; // find vertex with the rotated flavours in m_v for (int i=0;iin[0].Kfcode()==m_v[i].in[0].Kfcode()) if (v_tofind->in[1].Kfcode()==m_v[i].in[1].Kfcode()) if (v_tofind->in[2].Kfcode()==m_v[i].in[2].Kfcode()) { // vertex found in m_v nr=i; return nr; } } } } return 0; } // Output methods void Vertex::Print() { if (!msg_LevelIsDebugging()) return; //3 legs for (int i=0;iString()<<"; t = "<String()<<"; t = "<String(); msg_Out()<<"; "<String()<<"; t = "<first<second<