#include "SHRiMPS/Event_Generation/Ladder.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Math/MathTools.H" #include "ATOOLS/Math/Random.H" using namespace SHRIMPS; using namespace ATOOLS; std::ostream & SHRIMPS:: operator<<(std::ostream & s, const colour_type::code & colour) { if (colour==colour_type::singlet) s<<" singlet "; else if (colour==colour_type::triplet) s<<" triplet "; else if (colour==colour_type::octet) s<<" octet "; else s<<" none "; return s; } std::ostream & SHRIMPS:: operator<<(std::ostream & s, const Ladder_Particle & part) { s<<" "<Flav()), m_mom(part->Momentum()), m_marked(false), m_IS(part->Info()=='I' || part->Info()=='G') { SetFlow(1,part->GetFlow(1)); SetFlow(2,part->GetFlow(2)); m_beam = dabs(m_mom.Y())>5.; m_pos = part->ProductionBlob()? part->ProductionBlob()->Position()/(rpa->hBar()*rpa->c()): Vec4D(0.,0.,0.,0.); } Particle * Ladder_Particle::GetParticle() { msg_Tracking()< "<SetNumber(); p_part->SetFlow(1,GetFlow(1,false)); p_part->SetFlow(2,GetFlow(2,false)); } return p_part; } std::ostream & SHRIMPS::operator<<(std::ostream & s, const LadderMap & lmap) { size_t i(0); s<<"In total "<0) { for (TPropList::const_iterator piter=props.begin(); piter!=props.end();piter++) s<<(*piter); } s<<"\n"; return s; } std::ostream & SHRIMPS:: operator<<(std::ostream & s,const Ladder & ladder) { s<<" ---------------------------------------------------------\n" <<"Ladder ("<m_mom); double q2, qt2; TPropList::iterator piter=GetPropsBegin(); for (LadderMap::iterator liter=GetEmissionsBegin(); liter!=GetEmissionsEnd();liter++) { q -= liter->second.m_mom; q2 = dabs(q.Abs2()); qt2 = q.PPerp2(); piter->m_q = q; piter->m_q2 = q2; piter->m_qt2 = qt2; piter++; if (piter==GetPropsEnd()) break; } } double Ladder::MRKweight() const { //std::cout<1) { for (TPropList::const_iterator pit=m_tprops.begin(); pit!=m_tprops.end();pit++) { qt2 = pit->m_q.PPerp2(); q2 = pit->m_q.Abs2(); mrkweight *= qt2/ATOOLS::Max(qt2,q2); } } return ATOOLS::dabs(mrkweight); } bool Ladder::ExtractHardest() { UpdatePropagators(); m_that = m_mu2 = -1.; m_harddiffractive = false; LadderMap::iterator liter=GetEmissionsBegin(), outiter1; TPropList::iterator initer; for (TPropList::iterator piter=GetPropsBegin(); piter!=GetPropsEnd();piter++) { if (dabs(piter->m_q2)>m_that) { outiter1 = liter; initer = piter; m_that = dabs(initer->m_q2); if (piter->m_col==colour_type::singlet) m_harddiffractive = true; else m_harddiffractive = false; //msg_Tracking()<m_col<<" -> "<m_col; m_that = dabs(initer->m_q2); m_mu2 = initer->m_q02; liter = outiter1; liter++; m_shat = (outiter1->second.m_mom+liter->second.m_mom).Abs2(); m_Yhat = (outiter1->second.m_mom+liter->second.m_mom).Y(); m_DeltaYhat = outiter1->second.m_mom.Y()-liter->second.m_mom.Y(); double q12(0.), q22(0.); if (initer!=GetPropsBegin()) { initer--; q12 = initer->m_q2; initer++; } initer++; if (initer!=GetPropsEnd()) { q22 = initer->m_q2; } initer--; m_uhat = m_shat-m_that+q12+q22; SetMEFSParticles(&outiter1->second,&liter->second); return true; } bool Ladder:: ReconstructMEFlavours(Flavour & i1,Flavour & i2, Flavour & o1,Flavour & o2) { o1 = p_part1->m_flav; o2 = p_part2->m_flav; //msg_Out()<m_mom+p_inpart2->m_mom); double shat(check.Abs2()); TPropList::iterator prop = m_tprops.begin(); for (LadderMap::iterator liter=m_emissions.begin(); liter!=m_emissions.end();liter++) { check -= liter->second.m_mom; if (prop!=m_tprops.end()) { if ((check.Perp()-prop->m_q.Perp()).Abs2()>1.e-6) { msg_Error()<<"-------------------------------------------\n" <m_q<<"\n" <<(*this)<<"\n"<m_mom<<" / " <m_mom<<".\n"; } prop++; } } if (dabs(check.Abs2())/shat>1.e-6) { msg_Error()<<"-------------------------------------------\n" <m_mom<<" / " <m_mom<<".\n"; return false; } return true; } bool Ladder::SwapColourIndices() { if (p_inpart1->m_flav.IsQuark() || p_inpart2->m_flav.IsQuark()) return false; for (LadderMap::iterator liter=GetEmissionsBegin(); liter!=GetEmissionsEnd();liter++) { liter->second.m_flow.SwapColourIndices(); if (liter->second.m_flav.IsQuark()) { liter->second.m_flav = liter->second.m_flav.Bar(); } } p_inpart1->m_flow.SwapColourIndices(); p_inpart2->m_flow.SwapColourIndices(); return true; } bool Ladder::CanReplaceColour(const size_t & oldc,const size_t & newc, const size_t & pos,const bool & inclIS) { Ladder_Particle * part; for (LadderMap::iterator liter=GetEmissionsBegin(); liter!=GetEmissionsEnd();liter++) { part = &liter->second; if (part->GetFlow(pos)==oldc) { if (part->GetFlow(3-pos)!=newc) { part->SetFlow(pos,newc); return true; } } } if (p_inpart1->GetFlow(3-pos)==oldc && p_inpart1->GetFlow(pos)!=newc) { p_inpart1->SetFlow(3-pos,newc); return true; } if (p_inpart2->GetFlow(3-pos)==oldc && p_inpart2->GetFlow(pos)!=newc) { p_inpart2->SetFlow(3-pos,newc); return true; } return false; } bool Ladder::GenerateColourIndices(size_t & fix) { msg_Out()<<"#############################################\n" <first-lbeg->first>0.0001) { msg_Out()<<" before intermediate ("<<(*liter)->first<<") with " <<"["<m_col<<".\n"; if (!FixIntermediateColours(*liter,col1,col2,fix,citer)) return false; } msg_Out()<<" before last ("<<(*liter)->first<<") with " <<"["<m_col<<".\n"; if (!FixLastColours(*liter,col1,col2,fix,citer)) return false; msg_Out()<m_col); Ladder_Particle * inpart(p_inpart1); Ladder_Particle * outpart(&liter->second); msg_Out()<first<<"; " <m_flav<<" & "<m_flav<<") " <<"for "<SetFlow(1,inpart->GetFlow(1)); outpart->SetFlow(2,inpart->GetFlow(2)); if (MoreSinglets(citer)) col1 = col2 = -1; else { if (fix==1) { col1 = -1; col2 = p_inpart2->GetFlow(2); } else if (fix==2) { col1 = p_inpart2->GetFlow(1); col2 = -1; } else { msg_Error()<<"Error in "<m_flav != outpart->m_flav || fix==0) { msg_Error()<<"Error in "<m_flav<<" --> "<m_flav<<".\n"; return false; } if (fix==1) { outpart->SetFlow(1,-1); if (inpart->m_flav.IsQuark()) outpart->SetFlow(2,0); if (inpart->m_flav.IsGluon()) outpart->SetFlow(2,inpart->GetFlow(2)); col1 = inpart->GetFlow(1); col2 = outpart->GetFlow(1); } else if (fix==2) { if (inpart->m_flav.IsQuark()) outpart->SetFlow(1,0); if (inpart->m_flav.IsGluon()) outpart->SetFlow(1,inpart->GetFlow(1)); outpart->SetFlow(2,-1); col1 = outpart->GetFlow(2); col2 = inpart->GetFlow(2); } } liter++; citer++; if (citer==GetPropsEnd()) citer--; msg_Out()<<"["<GetFlow(1)<<", "<GetFlow(2)<<"] --> " <<"colour = "<<"["<GetFlow(1)<<", "<GetFlow(2)<<"] for " <first<<"\n"; return true; } bool Ladder:: FixIntermediateColours(LadderMap::iterator & liter,int & col1,int & col2, size_t & fix,TPropList::iterator & citer) { msg_Out()<m_col); Ladder_Particle * outpart(&liter->second); Ladder_Particle * refpart(p_inpart2); bool fromsing(false); if (colour==colour_type::singlet) { outpart->SetFlow(1,col1); outpart->SetFlow(2,col2); if (MoreSinglets(citer)) col1 = col2 = -1; else { if (fix==1) { col1 = -1; col2 = p_inpart2->GetFlow(2); } else if (fix==2) { col1 = p_inpart2->GetFlow(1); col2 = -1; } else { msg_Error()<<"Error in "<m_flav.IsGluon()) { if (fix==1) { outpart->SetFlow(1,-1); outpart->SetFlow(2,col2); col1 = fromsing?outpart->GetFlow(2):col1; col2 = outpart->GetFlow(1); } else if (fix==2) { outpart->SetFlow(1,col1); outpart->SetFlow(2,-1); col1 = outpart->GetFlow(2); col2 = fromsing?outpart->GetFlow(1):col2; } else if (fix==0) { if (refpart->m_flav.IsQuark()) { if (!refpart->m_flav.IsAnti()) { outpart->SetFlow(1,refpart->GetFlow(1)); outpart->SetFlow(2,-1); col1 = outpart->GetFlow(2); col2 = outpart->GetFlow(1); fix = 2; } else if (refpart->m_flav.IsAnti()) { outpart->SetFlow(1,-1); outpart->SetFlow(2,refpart->GetFlow(2)); col1 = outpart->GetFlow(2); col2 = outpart->GetFlow(1); fix = 1; } } else if (refpart->m_flav.IsGluon()) { fix = ran->Get()<0.5?1:2; if (fix==2) { outpart->SetFlow(1,refpart->GetFlow(1)); outpart->SetFlow(2,-1); col1 = outpart->GetFlow(2); col2 = outpart->GetFlow(1); } else if (fix==1) { outpart->SetFlow(1,-1); outpart->SetFlow(2,refpart->GetFlow(2)); col1 = outpart->GetFlow(2); col2 = outpart->GetFlow(1); } } } } } liter++; citer++; if (citer==GetPropsEnd()) citer--; msg_Out()<<" --> "<m_flav<<" " <<"["<GetFlow(1)<<", "<GetFlow(2)<<"] -> " <second); colour_type::code colour(citer->m_col); msg_Out()<first<<"; " <m_flav<<" & "<m_flav<<").\n"; if (colour==colour_type::singlet) { outpart->SetFlow(1,inpart->GetFlow(1)); outpart->SetFlow(2,inpart->GetFlow(2)); } else if (colour==colour_type::triplet) { if (inpart->m_flav.IsGluon() && outpart->m_flav.IsQuark()) { if (outpart->m_flav.IsAnti()) { outpart->SetFlow(1,inpart->GetFlow(1)); outpart->SetFlow(2,0); } else if (!outpart->m_flav.IsAnti()) { outpart->SetFlow(1,inpart->GetFlow(1)); outpart->SetFlow(2,0); } else { msg_Error()<<"Error: "<m_flav<<" for triplet propagator.\n"; return false; } } else if (inpart->m_flav.IsQuark() && outpart->m_flav.IsGluon()) { if (inpart->m_flav.IsAnti()) { outpart->SetFlow(1,col2); outpart->SetFlow(2,inpart->GetFlow(2)); } else if (!inpart->m_flav.IsAnti()) { outpart->SetFlow(1,inpart->GetFlow(1)); outpart->SetFlow(2,col1); } else { msg_Error()<<"Error: "<m_flav<<" for triplet propagator.\n"; return false; } } } else if (colour==colour_type::octet) { if (inpart->m_flav != outpart->m_flav) { msg_Error() <<"Error in "<m_flav<<" --> "<m_flav<<".\n"; return false; } else if (inpart->m_flav.IsQuark()) { if (inpart->m_flav.IsAnti()) { outpart->SetFlow(1,0); outpart->SetFlow(2,col2); } else if (!inpart->m_flav.IsAnti()) { outpart->SetFlow(1,col1); outpart->SetFlow(2,0); } } else if (inpart->m_flav.IsGluon()) { if (fix==1) { outpart->SetFlow(1,inpart->GetFlow(1)); outpart->SetFlow(2,col2); } else if (fix==2) { outpart->SetFlow(1,col1); outpart->SetFlow(2,inpart->GetFlow(2)); } } } msg_Out()<<"Out of "<m_col==colour_type::singlet) return true; cit++; } return false; }