void Signal_Process_FS_QED_Correction::FindProcessPossibleResonances
(const Flavour_Vector& fv, MODEL::Vertex_List& vlist)
{
  const Vertex_Table * vtab(s_model->GetVertexTable());
  Flavour_Vector fslep;
  for (size_t i(2);i<fv.size();++i)
    if (!fv[i].Strong()) fslep.push_back(fv[i]);
  for (Vertex_Table::const_iterator it(vtab->begin());it!=vtab->end();++it) {
    if (it->first.IsOn()      && !it->first.Strong() &&
        it->first.IsMassive() && !it->first.IsDummy()) {
      for (size_t i(0);i<it->second.size();++i) {
        bool on(true);
        double m(it->first.Mass());
        Single_Vertex * v(it->second[i]);
        for (size_t j(1);j<v->nleg;++j) {
          if (!v->on || v->dec)        { on=false; break; }
          if (v->in[j]==v->in[0])      { on=false; break; }
          if (v->in[j].IsDummy())      { on=false; break; }
          if ((m-=v->in[j].Mass())<0.) { on=false; break; }
          bool flavfound(false);
          for (size_t k(0);k<fslep.size();++k)
            if (v->in[j]==fslep[k])    { flavfound=true; break; }
          if (!flavfound)              { on=false; break; }
        }
        if (on) vlist.push_back(v);
      }
    }
  }
}
Beispiel #2
0
void FullAmplitude_External::GetPermutation
(const std::vector<size_t> &ids,std::vector<size_t> &cid,
 Flavour_Vector &cfl,int &nsub,int &psub,int &swap) const
{
  for (size_t i(0);i<ids.size();++i) {
    int id=ids[i]%100;
    if (m_fls[id].StrongCharge()==0) continue;
    cid.push_back(ids[i]);
    cfl.push_back(m_fls[id]);
  }
  psub=nsub=0;
  int rid(-1);
  for (size_t i(0);i<cid.size();++i) {
    int id=cid[i]%100, aid=cid[i]/100;
    if (cfl[i].StrongCharge()==3) rid=aid;
    if (cfl[i].StrongCharge()==-3 &&
	i<cid.size()-1 && aid==rid) {
      if (m_fls[cid[i+1]%100]==m_fls[id].Bar()) ++psub;
      else ++nsub;
    }
    cid[i]=id;
  }
  swap=0;
  std::vector<size_t> fid(cid);
  for (int oswap(-1);oswap<swap;) {
    oswap=swap;
    for (size_t i(1);i<fid.size();++i)
      if (fid[i]<fid[i-1]) {
	std::swap<size_t>(fid[i],fid[i-1]);
	if (m_fls[fid[i]].IsFermion() &&
	    m_fls[fid[i]]==m_fls[fid[i-1]]) ++swap;
      }
  }
}
BH_Sherpa_Interface::BH_Sherpa_Interface(const Process_Info& pi, const Flavour_Vector& flavs) :
  Virtual_ME2_Base(pi, flavs)
{
  bhlme_counter++;

  std::vector<int> kflist;
  for (size_t i=0; i<flavs.size(); ++i) kflist.push_back(flavs[i].HepEvt());

  if (bhf==0) {
#ifndef BH_INTERFACE_BHSETTINGS
    bhf=new BH::BH_interface();
#else
    string bhfile("");
    Data_Reader reader(" ",";","!","=");
    if (reader.ReadFromFile(bhfile,"BH_SETTINGS_FILE")) {
      bhf=new BH::BH_interface(bhfile);
    }
    else bhf=new BH::BH_interface();
#endif
    rpa->gen.AddCitation(1,"The BlackHat library is described in \\cite{Berger:2008sj}.");
    bhf->set("Z_mass",Flavour(kf_Z).Mass());
    bhf->set("Z_width",Flavour(kf_Z).Width());
    bhf->set("W_mass",Flavour(kf_Wplus).Mass());
    bhf->set("W_width",Flavour(kf_Wplus).Width());
    double sin_th_2=MODEL::s_model->ScalarConstant(std::string("sin2_thetaW"));
    if (MODEL::s_model->ScalarNumber(std::string("WidthScheme"))==1)
      sin_th_2=std::abs(MODEL::s_model->ComplexConstant(std::string("csin2_thetaW")));
    bhf->set("sin_th_2",sin_th_2);
    bhf->set("alpha_S",MODEL::s_model->ScalarFunction(std::string("alpha_S")));
    bhf->set("alpha_QED",MODEL::s_model->ScalarFunction(std::string("alpha_QED")));
  }
  
  if (pi.m_fi.m_sv=="FullColor")
    bhf->set("COLOR_MODE",std::string("full_color"));
  else if (pi.m_fi.m_sv=="LeadingColor")
    bhf->set("COLOR_MODE",std::string("leading_color"));
  else if (pi.m_fi.m_sv=="FullMinusLeadingColor")
    bhf->set("COLOR_MODE",std::string("full_minus_leading_color"));
  else if (pi.m_fi.m_sv!="")
    THROW(critical_error,"Invalid option '"+pi.m_fi.m_sv+"'");
  p_BH = bhf->new_ampl(kflist);

}
Beispiel #4
0
PDF::CParam Default_Core_Scale::Calculate(Cluster_Amplitude *const ampl)
{
  DEBUG_FUNC("");
  msg_Debugging()<<*ampl<<"\n";
  if (ampl->Legs().size()==3 && ampl->NIn()==2) {
    double kt2cmin(ampl->Leg(2)->Mom().Abs2());
    return PDF::CParam(kt2cmin,kt2cmin,0.0,kt2cmin,-1);
  }
  double muf2(0.0), mur2(0.0), muq2(0.0);
  Cluster_Amplitude *campl(Cluster(ampl->Copy()));
  if (campl->Legs().size()!=ampl->Legs().size())
    msg_Debugging()<<*campl<<"\n";
  if (campl->Legs().size()!=4) {
    double q2((campl->Leg(0)->Mom()+campl->Leg(1)->Mom()).Abs2());
    Vec4D ewsum;
    for (size_t i(0);i<campl->Legs().size();++i)
      if (!campl->Leg(i)->Flav().Strong()) ewsum+=campl->Leg(i)->Mom();
    if (ewsum==Vec4D()) ewsum=campl->Leg(0)->Mom()+campl->Leg(1)->Mom();
    if (campl->NIn()==2 &&
	campl->Leg(0)->Flav().Strong() &&
	campl->Leg(1)->Flav().Strong()) {// HThat'/2
      q2=ewsum.PPerp();
      for (size_t i(0);i<campl->Legs().size();++i)
	if (campl->Leg(i)->Flav().Strong())
	  q2+=campl->Leg(i)->Mom().PPerp();
      q2=sqr(ewsum.Mass()+q2/2.0);
    }
    campl->Delete();
    return PDF::CParam(q2,dabs(ewsum.Abs2()),0.0,q2,-1);
  }
  Flavour_Vector fl; fl.resize(4);
  fl[0]=campl->Leg(0)->Flav();
  fl[1]=campl->Leg(1)->Flav();
  fl[2]=campl->Leg(2)->Flav();
  fl[3]=campl->Leg(3)->Flav();
  if (fl[0].Strong() && fl[1].Strong()) {// hh collision
    if (fl[2].Strong() && fl[3].Strong()) {
      msg_Debugging()<<"pure QCD like\n";
      double s(2.0*campl->Leg(0)->Mom()*campl->Leg(1)->Mom());
      double t(2.0*campl->Leg(0)->Mom()*campl->Leg(2)->Mom());
      double u(2.0*campl->Leg(0)->Mom()*campl->Leg(3)->Mom());
      muq2=muf2=mur2=-1.0/(1.0/s+1.0/t+1.0/u)/4.0;
    }
    else if (!fl[2].Strong() && !fl[3].Strong()) {
      msg_Debugging()<<"DY like\n";
      muq2=muf2=mur2=(campl->Leg(0)->Mom()+campl->Leg(1)->Mom()).Abs2();
    }
    else if (fl[2].Strong() && !fl[3].Strong()) {
      msg_Debugging()<<"jV like\n";
      muq2=muf2=mur2=campl->Leg(3)->Mom().MPerp2()/4.0;
    }
    else if (!fl[2].Strong() && fl[3].Strong()) {
      msg_Debugging()<<"Vj like\n";
      muq2=muf2=mur2=campl->Leg(2)->Mom().MPerp2()/4.0;
    }
    else THROW(fatal_error,"Internal error.");
  }
  else if (!fl[0].Strong() && !fl[1].Strong()) {// ll collision
    if (fl[2].Strong() && fl[3].Strong()) {
      msg_Debugging()<<"jets like\n";
      muq2=muf2=mur2=(campl->Leg(0)->Mom()+campl->Leg(1)->Mom()).Abs2();
    }
  }
  else {// lh collision
    msg_Debugging()<<"DIS like\n";
    muq2=muf2=mur2=dabs((campl->Leg(fl[0].Strong()?1:0)->Mom()+
			 campl->Leg(fl[2].Strong()?3:2)->Mom()).Abs2());
  }
  campl->Delete();
  msg_Debugging()<<"\\mu_f = "<<sqrt(muf2)<<"\n"
		 <<"\\mu_r = "<<sqrt(mur2)<<"\n"
		 <<"\\mu_q = "<<sqrt(muq2)<<"\n";
  return PDF::CParam(muf2,muq2,0.0,mur2,-1);
}
bool Signal_Process_FS_QED_Correction::FindResonances
(Particle_Vector& pv,std::vector<Particle_Vector>& rpvs,Flavour_Vector& rfl,
 const Vertex_List& vlist)
{
  if (vlist.empty()) return false;
  DEBUG_FUNC("find resonances in "<<pv.size()<<" particles");
  // find a combination in pv for which a vertex exists such that the
  // IS flavour is on-shell within m_resdist times its width
  // book-keep first to later disentangle competing resonances
  // need to book-keep i,j,k,abs(mij-mk)/wk
  std::map<double,std::vector<size_t> > restab;
  for (size_t i(0);i<pv.size();++i) {
    for (size_t j(i+1);j<pv.size();++j) {
      for (size_t k(0);k<vlist.size();++k) {
        double mdist(abs((pv[i]->Momentum()+pv[j]->Momentum()).Mass()
                         -vlist[k]->in[0].Mass())/vlist[k]->in[0].Width());
        if (vlist[k]->nleg==3 &&
            ((pv[i]->Flav()==vlist[k]->in[1] &&
              pv[j]->Flav()==vlist[k]->in[2]) ||
             (pv[i]->Flav()==vlist[k]->in[2] &&
              pv[j]->Flav()==vlist[k]->in[1])) &&
            mdist<m_resdist) {
          size_t ida[3]={i,j,k};
          restab[mdist]=std::vector<size_t>(ida,ida+3);
        }
      }
    }
  }
  if (restab.empty()) {
    msg_Debugging()<<"no resonances found"<<std::endl;
    return false;
  }
  if (msg_LevelIsDebugging()) {
    msg_Debugging()<<"resonances found:\n";
    for (std::map<double,std::vector<size_t> >::const_iterator
         it=restab.begin();it!=restab.end();++it)
      msg_Debugging()<<it->second[0]<<it->second[1]<<it->second[2]<<": "
                     <<vlist[it->second[2]]->in[0]<<" -> "
                     <<vlist[it->second[2]]->in[1]<<" "
                     <<vlist[it->second[2]]->in[2]
                     <<", |m-M|/W="<<it->first<<std::endl;
  }
  Particle_Vector usedparts;
  for (std::map<double,std::vector<size_t> >::const_iterator it=restab.begin();
       it!=restab.end();++it) {
    bool valid(true);
    for (size_t i(0);i<usedparts.size();++i)
      if (pv[it->second[0]]==usedparts[i] ||
          pv[it->second[1]]==usedparts[i]) { valid=false; break; }
    if (!valid) continue;
    usedparts.push_back(pv[it->second[0]]);
    usedparts.push_back(pv[it->second[1]]);
    msg_Debugging()<<"constructing decay: "<<vlist[it->second[2]]->in[0]<<" -> "
                                           <<vlist[it->second[2]]->in[1]<<" "
                                           <<vlist[it->second[2]]->in[2]<<"\n";
    rfl.push_back(vlist[it->second[2]]->in[0]);
    Particle_Vector parts;
    parts.push_back(pv[it->second[0]]);
    parts.push_back(pv[it->second[1]]);
    rpvs.push_back(parts);
  }
  for (Particle_Vector::iterator it=usedparts.begin();it!=usedparts.end();++it)
    for (Particle_Vector::iterator pit=pv.begin();pit!=pv.end();++pit)
      if (*it==*pit) { pv.erase(pit); break; }
  return true;
}
Beispiel #6
0
void Hard_Decay_Handler::SetDecayMasses(Data_Reader *const dr)
{
  ATOOLS::Flavour_Vector allflavs(MODEL::s_model->IncludedFlavours());
  std::vector<size_t> psmassive,psmassless;
  std::vector<size_t> defpsmassive,defpsmassless;
  dr->VectorFromFile(psmassive,"MASSIVE_PS");
  dr->VectorFromFile(psmassless,"MASSLESS_PS");
  bool respect=(bool)dr->GetValue<int>("RESPECT_MASSIVE_FLAG",0);
  // check consistency
  for (size_t i(0);i<psmassive.size();++i)
    if (std::find(psmassless.begin(),psmassless.end(),psmassive[i])!=
        psmassless.end()) THROW(fatal_error,"Inconsinstent input.");
  for (size_t i(0);i<psmassless.size();++i)
    if (Flavour(psmassless[i]).IsMassive())
      THROW(fatal_error,"Cannot shower massive particle massless.");
  // set defaults
  // respect=0 -> def: dusgy massless, rest massive
  // respect=1 -> def: only massive massive, rest massless
  // TODO: need to fill in those that are massive already?
  if (!respect) {
    defpsmassless.push_back(kf_d);
    defpsmassless.push_back(kf_u);
    defpsmassless.push_back(kf_s);
    defpsmassless.push_back(kf_gluon);
    defpsmassless.push_back(kf_photon);
    for (size_t i(0);i<allflavs.size();++i) {
      if (allflavs[i].IsDummy()) continue;
      size_t kf(allflavs[i].Kfcode());
      bool add(true);
      for (size_t j(0);j<defpsmassive.size();++j)
        if (kf==defpsmassive[j]) { add=false; break; }
      for (size_t j(0);j<defpsmassless.size();++j)
        if (kf==defpsmassless[j]) { add=false; break; }
      if (add)  defpsmassive.push_back(kf);
    }
  }
  else {
    for (size_t i(0);i<allflavs.size();++i) {
      if (allflavs[i].IsDummy()) continue;
      size_t kf(allflavs[i].Kfcode());
      bool add(true);
      for (size_t j(0);j<defpsmassive.size();++j)
        if (kf==defpsmassive[j]) { add=false; break; }
      for (size_t j(0);j<defpsmassless.size();++j)
        if (kf==defpsmassless[j]) { add=false; break; }
      if (add && allflavs[i].IsMassive())  defpsmassive.push_back(kf);
      if (add && !allflavs[i].IsMassive()) defpsmassless.push_back(kf);
    }
  }
  // then remove and add those specified manually
  for (size_t i(0);i<psmassive.size();++i) {
    defpsmassless.erase(std::remove(defpsmassless.begin(),defpsmassless.end(),
                                    psmassive[i]),defpsmassless.end());
    if (std::find(defpsmassive.begin(),defpsmassive.end(),psmassive[i])==
        defpsmassive.end()) defpsmassive.push_back(psmassive[i]);
  }
  for (size_t i(0);i<psmassless.size();++i) {
    defpsmassive.erase(std::remove(defpsmassive.begin(),defpsmassive.end(),
                                   psmassless[i]),defpsmassive.end());
    if (std::find(defpsmassless.begin(),defpsmassless.end(),psmassless[i])==
        defpsmassless.end()) defpsmassless.push_back(psmassless[i]);
  }
  // fill massive ones into m_psmass
  for (size_t i(0);i<defpsmassive.size();++i) {
    Flavour fl(defpsmassive[i],0);
    m_decmass.insert(fl);
    m_decmass.insert(fl.Bar());
  }
  Flavour_Vector mf;
  for (Flavour_Set::iterator fit(m_decmass.begin());fit!=m_decmass.end();++fit)
    if (fit->Mass(true)!=fit->Mass(false)) mf.push_back(*fit);
  msg_Info()<<METHOD<<"(): Massive decay flavours: "<<mf<<std::endl;
}
Beispiel #7
0
void FullAmplitude_External::BuildColorMatrix
(const size_t &ci,const size_t &cj) 
{
  m_colfs[ci][cj].
    resize(m_amap.size(),std::vector<Complex>
	   (m_amap.size(),Complex(0.0,0.0)));
  for (size_t a=0;a<m_amap.size();++a) {
    const std::vector<int> &cp(m_amap[a].m_perm);
    int nsuba, psuba, swapa;
    Flavour_Vector fla;
    std::vector<size_t> ida, perma(cp.begin(),cp.end());
    GetPermutation(perma,ida,fla,nsuba,psuba,swapa);
    msg_Debugging()<<"A: "<<perma<<ida<<fla<<" sub = -"<<nsuba<<"/+"<<psuba
		   <<" swap = "<<swapa<<" ( em = "<<ci<<" )\n";
    msg_Indent();
    for (size_t b=a;b<m_amap.size();++b) {
      const std::vector<int> &cp(m_amap[b].m_perm);
      int nsubb, psubb, swapb;
      Flavour_Vector flb;
      std::vector<size_t> idb, permb(cp.begin(),cp.end());
      GetPermutation(permb,idb,flb,nsubb,psubb,swapb);
      msg_Debugging()<<"B: "<<permb<<idb<<flb<<" sub = -"<<nsubb<<"/+"<<psubb
		     <<" swap = "<<swapb<<" ( sp = "<<cj<<" )\n";
      msg_Indent();
      Expression expression(100,100);
      expression.pop_back();
      expression.SetTR(p_calc->TR());
      size_t ad(expression.AIndex()), lf(expression.FIndex()), fl(lf);
      for (size_t i=0;i<fla.size();++i) {
	if (fla[i].StrongCharge()==3) {
	  if (i>0) lf=expression.FIndex();
	  expression.push_back(Delta::New(ida[i]+1,lf));
	  if (ci!=cj) {
	  if (ci==ida[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,lf,nlf));
	    lf=nlf;
	  }
	  }
	}
	else if (fla[i].StrongCharge()==-3) {
	  if (ci!=cj) {
	  if (ci==ida[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,lf,nlf));
	    expression.push_back(CNumber::New(Complex(-1.0)));
	    lf=nlf;
	  }
	  }
	  expression.push_back(Delta::New(lf,ida[i]+1));
	}
	else {
	  if (ci==cj) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ida[i]+1,lf,nlf));
	    lf=nlf;
	  }
	  else {
	  if (ci!=ida[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ida[i]+1,lf,nlf));
	    lf=nlf;
	  }
	  else {
	    size_t la=expression.AIndex();
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(la,lf,nlf));
	    expression.push_back(Adjoint::New(ad,ida[i]+1,la));
	    expression.push_back(CNumber::New(Complex(0.0,-1.0)));
	    lf=nlf;
	  }
	  }
	}
      }
      if (fla.back().StrongCharge()==3 ||
	  fla.back().StrongCharge()==8)
	expression.push_back(Delta::New(lf,fl));
      fl=lf=expression.FIndex();
      for (size_t i=0;i<flb.size();++i) {
	if (flb[i].StrongCharge()==3) {
	  if (i>0) lf=expression.FIndex();
	  expression.push_back(Delta::New(lf,idb[i]+1));
	  if (ci!=cj) {
	  if (cj==idb[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,nlf,lf));
	    lf=nlf;
	  }
	  }
	}
	else if (flb[i].StrongCharge()==-3) {
	  if (ci!=cj) {
	  if (cj==idb[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(ad,nlf,lf));
	    expression.push_back(CNumber::New(Complex(-1.0)));
	    lf=nlf;
	  }
	  }
	  expression.push_back(Delta::New(idb[i]+1,lf));
	}
	else {
	  if (ci==cj) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(idb[i]+1,nlf,lf));
	    lf=nlf;
	  }
	  else {
	  if (cj!=idb[i]) {
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(idb[i]+1,nlf,lf));
	    lf=nlf;
	  }
	  else {
	    size_t la=expression.AIndex();
	    size_t nlf=expression.FIndex();
	    expression.push_back(Fundamental::New(la,nlf,lf));
	    expression.push_back(Adjoint::New(ad,la,idb[i]+1));
	    expression.push_back(CNumber::New(Complex(0.0,-1.0)));
	    lf=nlf;
	  }
	  }
	}
      }
      if (fla.back().StrongCharge()==3 ||
	  flb.back().StrongCharge()==8)
	expression.push_back(Delta::New(fl,lf));
      if (msg_LevelIsDebugging()) expression.Print();
      expression.Evaluate();
      Complex col=expression.Result();
      if (nsuba || nsubb) col/=pow(-expression.NC(),nsuba+nsubb);
      if (psuba || psubb) col/=pow(expression.NC(),psuba+psubb);
      if ((swapa+swapb)%2) col=-col;
      double T2=1.0;
      if (ci!=cj) {
      if (m_fls[ci].StrongCharge()==8) {
	T2=expression.NC()*expression.TR();
	T2/=CSC.CA*CSC.TR;
      }
      else {
	T2=expression.TR()*(expression.NC()-1.0/expression.NC());
	T2/=CSC.CF;
      }
      }
      msg_Debugging()<<"A B^* = "<<col<<" <- sub = -"<<nsuba+nsubb
		     <<"/+"<<psuba+psubb<<", swap = "<<swapa+swapb
		     <<", T2 = "<<T2<<" ("<<a<<","<<b<<")\n";
      m_colfs[ci][cj][a][b]=col/T2;
      m_colfs[ci][cj][b][a]=conj(col)/T2;
    }
  }
}