void Singlet_Sorter::Sort(PartList * inlist,PCList * outlist) { m_inlist = inlist; unsigned int ref, ref2, cont; Particle * part; while (!m_inlist->empty()) { part = FindNextStart(); if (!part) { msg_Error()<<"Error in "<<METHOD<<":\n" <<" No new particle found in non-empty list.\n"; exit(1); } ref = part->GetFlow(1); cont = part->GetFlow(2); outlist->push_back(make_pair(part,make_pair(ref,cont))); //if (part) msg_Out()<<"found a start: "<<ref<<".\n"; while (part) { part = FindNext(ref); if (part) { ref = part->GetFlow(1); ref2 = part->GetFlow(2); //msg_Out()<<" continue with: "<<ref<<".\n"; outlist->push_back(make_pair(part,make_pair(ref,ref2))); if (part->GetFlow(1)==cont) break; } } } }
void Singlet_Sorter::Sort(PartList * inlist,PSetYSet * outlists) { m_inlist = inlist; unsigned int ref1, ref2, cont=0; Particle * part; PartYSet * pset; while (!m_inlist->empty()) { part = FindNextStart(); if (!part) { msg_Error()<<"Error in "<<METHOD<<":\n" <<" No new particle found in non-empty list.\n"; exit(1); } pset = new PartYSet; pset->insert(part); ref1 = part->GetFlow(1); ref2 = part->GetFlow(2); //if (part) msg_Out()<<"found a start: ["<<ref1<<", "<<ref2<<"].\n"; while (part) { part = FindNext(ref1,ref2); if (part) { ref1 = part->GetFlow(1); ref2 = part->GetFlow(2); //msg_Out()<<" continue with: "<<ref1<<", "<<ref2<<".\n"; pset->insert(part); if (part->GetFlow(1)==cont) break; } } outlists->insert(pset); } }
int Lund_Interface::PrepareFragmentationBlob(Blob * blob) { int nhep = 0; hepevt.idhep[nhep]=SherpaToIdhep(Flavour(kf_photon)); for (short int j=1;j<4;++j) hepevt.phep[nhep][j-1]=blob->CMS()[j]; hepevt.phep[nhep][3]=blob->CMS()[0]; double pabs=(blob->CMS()).Abs2(); if (pabs<0) hepevt.phep[nhep][4]=0.0; else hepevt.phep[nhep][4]=sqrt(pabs); for (short int j=0;j<4;++j) hepevt.vhep[nhep][j]=0.0; hepevt.isthep[nhep]=1; hepevt.jmohep[nhep][0]=0; hepevt.jmohep[nhep][1]=0; hepevt.jdahep[nhep][0]=0; hepevt.jdahep[nhep][1]=0; // gluon splittings for (int i(0);i<blob->NInP();++i) { Particle * part = blob->InParticle(i); if (part->GetFlow(1)!=0 && part->GetFlow(2)!=0) { Flavour flav = Flavour(kf_d); if (ran->Get()<0.5) flav = Flavour(kf_u); Particle *help1(new Particle(-1,flav,0.5*part->Momentum())); Particle *help2(new Particle(-1,flav.Bar(),help1->Momentum())); help1->SetStatus(part_status::active); help2->SetStatus(part_status::active); AddPartonToString(help1,nhep); delete help1; unsigned int lastc(part->GetFlow(2)); for (++i;i<blob->NInP();++i) { part = blob->InParticle(i); AddPartonToString(part,nhep); if (part->GetFlow(1)==lastc) { lastc=0; break; } } if (lastc!=0) msg_Error()<<METHOD<<"(): Error. Open color string."<<std::endl; AddPartonToString(help2,nhep); delete help2; lastc=0; } else { for (;i<blob->NInP();i++) { part = blob->InParticle(i); AddPartonToString(part,nhep); if (part->GetFlow(1)==0) break; } } } return nhep; }
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"; } } }