Ejemplo n.º 1
0
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";
    }
  }
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
}