void Colour_Generator::FinalColours() { // msg_Out()<<METHOD<<":\n"; size_t flow(0),col(0); Particle * part; Flavour flav; for (size_t beam=0;beam<2;beam++) { size_t length(m_hadrons[1-beam]->Size()); /* msg_Out()<<" Trips["<<beam<<"]:"; for (set<int>::iterator cit=m_col[beam][0].begin(); cit!=m_col[beam][0].end();cit++) msg_Out()<<" "<<(*cit); msg_Out()<<"\n"; msg_Out()<<" Antis["<<beam<<"]:"; for (set<int>::iterator cit=m_col[beam][1].begin(); cit!=m_col[beam][1].end();cit++) msg_Out()<<" "<<(*cit); msg_Out()<<"\n";*/ for (size_t i=length-2;i<length;i++) { part = m_hadrons[1-beam]->GetParticle(i); flav = part->Flav(); if (flav.IsQuark() || flav.IsDiQuark()) { if ((flav.IsQuark() && !flav.IsAnti()) || (flav.IsDiQuark() && flav.IsAnti())) flow=0; if ((flav.IsQuark() && flav.IsAnti()) || (flav.IsDiQuark() && !flav.IsAnti())) flow=1; if (m_col[beam][flow].size()>0) { col = (*m_col[beam][flow].begin()); part->SetFlow(flow+1,col); m_col[beam][flow].erase(m_col[beam][flow].begin()); } else { part->SetFlow(flow+1,-1); m_col[beam][1-flow].insert(part->GetFlow(flow+1)); } } else if (flav.IsGluon()) { for (flow=0;flow<2;flow++) { if (m_col[beam][flow].size()>0) { col = (*m_col[beam][flow].begin()); part->SetFlow(flow+1,col); m_col[beam][flow].erase(m_col[beam][flow].begin()); } else { part->SetFlow(flow+1,-1); m_col[beam][1-flow].insert(part->GetFlow(flow+1)); } } } // msg_Out()<<(*part)<<"\n"; } } }
bool Simple_String::CreateMomenta() { m_filledblob=false; if (p_remnants[0]==NULL || p_remnants[1]==NULL) { msg_Error()<<"Simple_String::CreateMomenta(): " <<"No remnant found."<<std::endl; return false; } m_reggeons[0]->Fit(m_start[0]*m_start[0],m_start[2]); m_start[1]=sqrt(m_reggeons[0]->GetT(0.0,m_start[0]*m_start[0],ran->Get())); const unsigned int flow=Flow::Counter(); for (short unsigned int i=0;i<2;++i) { PDF::Hadron_Remnant *hadron= dynamic_cast<PDF::Hadron_Remnant*>(p_remnants[i]); if (hadron==NULL) { msg_Error()<<"Simple_String::CreateMomenta(): " <<"Incoming particle is no hadron."<<std::endl; return false; } const std::vector<Flavour> &constit= hadron->GetConstituents(kf_none); double pz=0.0, phi=ran->Get()*2.0*M_PI; for (size_t j=0;j<constit.size();++j) { if (constit[j].IsQuark() && constit[j].IsAnti()==i) { Particle *particle = new Particle(0,constit[j]); do { double E=hadron->GetBeam()->Energy()* hadron->GetXPDF(constit[j],m_start[0]*m_start[0]); pz=sqrt(E*E-sqr(constit[j].Mass())-m_start[1]*m_start[1]); if (i==1) pz*=-1.0; particle->SetMomentum(Vec4D(E,(i==0?1.0:-1.0)*m_start[1]*cos(phi), (i==0?1.0:-1.0)*m_start[1]*sin(phi),pz)); } while (!(dabs(pz)>0.0)); particle->SetFlow(1+constit[j].IsAnti(),flow); particle->SetFlow(2-constit[j].IsAnti(),0); particle->SetStatus(part_status::active); m_inparticles.push_back(particle); m_outparticles.push_back(particle); break; } } } m_filledblob=true; return true; }
bool Hadron_Remnant::DecomposeHadron() { bool success=true; double Eb(p_beam->Energy()); for (Particle_List::iterator pit=m_extracted.begin(); pit!=m_extracted.end();++pit) { if ((*pit)->Momentum()[0]>Eb || (*pit)->Momentum()[0]<0.0) { msg_Error()<<"Hadron_Remnant::DecomposeHadron(): " <<"Constituent energy out of range. \n E_" <<(*pit)->Flav()<<" = "<<(*pit)->Momentum()[0] <<"."<<std::endl; success=false; } for (size_t j=0;j<m_constit.size();++j) { if ((*pit)->Flav()==m_constit[j]) { //std::cout<<METHOD<<" "<<success<<":"<<(*pit)->Flav() // <<" ("<<ValenceQuark(*pit)<<")"<<std::endl; if (success && ValenceQuark(*pit)) { p_start = new Color_Dipole(*pit,&m_companions); p_start->Begin(ANTI((*pit)->Flav().IsAnti()))-> SetFlav(Opposite((*pit)->Flav())); return success; } } } } Flavour flav = m_constit[(size_t)(ran->Get()*3.)]; Particle * part = new Particle(-1,flav); part->SetStatus(part_status::active); part->SetFinalMass(flav.Mass()); part->SetFlow(COLOR((qri::type)(flav.IsAnti())),Flow::Counter()); //std::cout<<METHOD<<":"<<flav<<std::endl // <<" "<<(*part)<<std::endl; p_start = new Color_Dipole(part,&m_companions); p_start->Begin(ANTI(flav.IsAnti()))->SetFlav(Opposite(flav)); m_companions.push_back(part); return success; }
size_t Colour_Generator:: SelectColourReplacement(Particle * part1,Particle * part2) { bool dir(ran->Get()>=0.5),found(false); size_t beam,index,col,col1,idcol; for (size_t i=0;i<2;i++) { beam = dir?i:1-i; for (index = 1;index<3;index++) { col = (beam==1?part2:part1)->GetFlow(index); for (set<int>::iterator cit=m_col[beam][2-index].begin(); cit!=m_col[beam][2-index].end();cit++) { if (col==(*cit)) { col1 = (beam==1?part1:part2)->GetFlow(3-index); if (col1!=0) { found = false; for (int i=0;i<m_hadrons[1-beam]->GetParticles().size();i++){ if (m_hadrons[1-beam]->GetParticles()[i]->GetFlow(index)==col && m_hadrons[1-beam]->GetParticles()[i]->GetFlow(3-index)!=col1){ found = true; idcol = m_hadrons[1-beam]->GetParticles()[i]->GetFlow(3-index); break; } } break; } } } if (found) break; } if (found) break; } if (!found) return 0; p_compensator = new Blob(p_ladder->Position()*rpa->hBar()*rpa->c()); p_compensator->SetId(); p_compensator->SetType(btp::Soft_Collision); p_compensator->SetTypeSpec("ColourCompensation"); p_compensator->SetStatus(blob_status::inactive); p_compensator->AddToInParticles((beam==1?part2:part1)); (beam==1?part2:part1)->SetStatus(part_status::decayed); Particle * gluon = new Particle(-1,Flavour(kf_gluon),Vec4D(0.,0.,0.,0.),'R'); gluon->SetNumber(); gluon->SetFlow(index,col1); gluon->SetFlow(3-index,col); if (col1==0 || col1==0) msg_Error()<<"Error with colours here (4).\n"; gluon->SetStatus(part_status::decayed); p_compensator->AddToInParticles(gluon); p_blob->AddToOutParticles(gluon); Particle * part= new Particle(*((beam==1?part2:part1))); part->SetNumber(); part->SetFlow(index,col1); if ((part->Flav().IsGluon() && col1==0) || (part->Flav().IsQuark() && part->Flav().IsAnti() && index==2 && col1==0) || (part->Flav().IsQuark() && !part->Flav().IsAnti() && index==1 && col1==0)) msg_Error()<<"Error with colours here (5).\n"; (beam==1?p_ladder->GetIn2():p_ladder->GetIn1())->m_flow.SetCode(index,col1); (beam==1?p_ladder->GetIn2():p_ladder->GetIn1())->p_part = part; for (int i=0;i<p_blob->NInP();i++) { part = p_blob->InParticle(i); if (part->GetFlow(index)==col && part->GetFlow(3-index)==idcol && part->Beam()==(1-beam)){ part->SetFlow(index,col1); break; } if ((part->Flav().IsGluon() && col1==0) || (part->Flav().IsQuark() && part->Flav().IsAnti() && index==2 && col1==0) || (part->Flav().IsQuark() && !part->Flav().IsAnti() && index==1 && col1==0)) msg_Error()<<"Error with colours here (6).\n"; } m_col[beam][2-index].erase(col); m_col[beam][2-index].insert(col1); return (beam==1?3-index:index); }