void Soft_Cluster_Handler::FixHHDecay(Cluster * cluster,Blob * blob, const Flavour had1,const Flavour had2, const bool & constrained) { double M = cluster->Mass(), M2 = M*M; double m12 = sqr(had1.HadMass()), m22 = sqr(had2.HadMass()); cluster->BoostInCMSAndRotateOnZ(); double E1((M2+m12-m22)/(2.*M)), pl2(sqr(E1)-m12); bool isbeam(false); double stheta, pt2; double masscor((cluster->GetTrip()->m_flav.HadMass() * cluster->GetAnti()->m_flav.HadMass())/m_pt02); do { stheta = 1.-2.*ran->Get(); pt2 = pl2*sqr(stheta); } while (pt2>m_pt2max*m_pt2maxfac || sqr((*p_as)(pt2,false)/p_as->MaxValue())<ran->Get()); double pt = sqrt(pt2); int sign = cluster->GetTrip()->m_mom[3]<0?-1:1; double pl1 = sign*sqrt(sqr(E1)-sqr(pt)-m12); double cosphi = cos(2.*M_PI*ran->Get()), sinphi = sqrt(1.-cosphi*cosphi); Vec4D p1 = Vec4D(E1,pt*cosphi,pt*sinphi,pl1); Vec4D p2 = cluster->Momentum()-p1; if (p1[0]<0. || p2[0]<0.) throw Return_Value::Retry_Event; cluster->RotateAndBoostBack(p1); cluster->RotateAndBoostBack(p2); cluster->RotateAndBoostBack(); Particle * left(new Particle(-1,had1,p1)); left->SetNumber(); left->SetInfo('P'); left->SetFinalMass(had1.HadMass()); Particle * right(new Particle(-1,had2,p2)); right->SetNumber(); right->SetInfo('P'); right->SetFinalMass(had2.HadMass()); control::s_AHAparticles+=2; if (blob!=NULL) { blob->AddToOutParticles(left); blob->AddToOutParticles(right); } // if (cluster->GetTrip()->m_info=='B' || cluster->GetAnti()->m_info=='B') { // msg_Out()<<"==========================================================\n" // <<"Cluster decay (pt = "<<pt<<") for cluster \n"<<(*cluster)<<"\n" // <<"==> "<<left->Momentum()<<" + "<<right->Momentum()<<" for " // <<left->Flav()<<" + "<<right->Flav()<<"\n" // <<"==========================================================\n"; // } if (m_ana) { Histogram* histo((m_histograms.find(std::string("PT_HH")))->second); histo->Insert(pt); Histogram* histo2((m_histograms.find(std::string("PT2_HH")))->second); histo2->Insert(pt*pt); } }
void Interaction_Model_QCD::c_FFV(std::vector<Single_Vertex>& vertex,int & vanz) { Kabbala kcpl0 = -g3*M_I; Kabbala kcpl1 = kcpl0; for (short int i=1;i<=(m_extension==2?8:6);i++) { Flavour flav = Flavour((kf_code)(i)); if (flav.Strong() && flav.IsOn() && Flavour(kf_gluon).IsOn()) { vertex[vanz].in[0] = flav; vertex[vanz].in[1] = Flavour(kf_gluon); vertex[vanz].in[2] = flav; vertex[vanz].cpl[0] = kcpl0; vertex[vanz].cpl[1] = kcpl1; vertex[vanz].Str = (kcpl0*PR+kcpl1*PL).String(); vertex[vanz].Color.push_back(Color_Function(cf::T,1,2,0,'1','2','0')); vertex[vanz].Lorentz.push_back(LF_Getter::GetObject("Gamma",LF_Key())); vertex[vanz].Lorentz.back()->SetParticleArg(1); vertex[vanz].on = 1; vertex[vanz].oqcd = 1; vertex[vanz].oew = 0; vertex.push_back(Single_Vertex());vanz++; } } }
int Singlet::SplitParton(Parton * mother, Parton * part1, Parton * part2) { iterator plit(begin()); for (;plit!=end();++plit) if (*plit==mother) break; if (plit==end()) THROW(fatal_error,"Internal error"); Flavour flav = mother->GetFlavour(), flav1 = part1->GetFlavour(), flav2 = part2->GetFlavour(); PLiter pos1,pos2; plit = insert(plit,part1); pos1 = plit; plit++; plit = insert(plit,part2); pos2 = plit; part1->SetSing(this); part2->SetSing(this); plit++; m_dels.push_back(mother); plit = erase(plit); if (flav.StrongCharge()==8 && abs(flav1.StrongCharge())==3 && abs(flav2.StrongCharge())==3) { return 1; } return 0; }
void InitialiseGenerator(int argc, char *argv[]) { if(argc<2) { cout<<"Usage: ./SingleDecay <PDG_CODE>"<<endl; THROW(normal_exit,"you didn't specify the decaying particle by PDG code."); } small_sherpa_init(argc, argv); hadrons = new SHERPA::Hadron_Decay_Handler(".", "Fragmentation.dat"); mother_flav = Flavour( (kf_code) abs(ToType<int>(argv[1])) ); mother_flav.SetStable(false); if(ToType<int>(argv[1])<0) mother_flav=mother_flav.Bar(); if(hadrons->DecayMap()->FindDecay(mother_flav)==NULL) THROW(fatal_error, "Didn't find "+ToString<Flavour>(mother_flav)+ " in HadronDecays.dat."); // set all decay channel BR's equal, such that we generate the same amount of // each decay channel to be tested PHASIC::Decay_Table* table=hadrons->DecayMap()->FindDecay(mother_flav); for(size_t i(0);i<table->size();++i) table->UpdateWidth(table->at(i), 1.0); rpa->gen.SetEcms(mother_flav.HadMass()); msg_Info()<<"Welcome. I am decaying a "<<mother_flav<<endl; }
double Soft_Cluster_Handler:: TransformKin(const double MC,const Flavour & flav,const bool & enforce) { double mass2(sqr(flav.HadMass())); double width2(sqr(Max(flav.Width(),1.e-6))); if (!enforce && sqr(MC*MC-mass2)>10.*mass2*width2) return 0.; return pow(sqr(mass2)/(sqr(MC*MC-mass2) + mass2*width2),m_kappa) * pow(mass2*width2/(sqr(MC*MC-mass2) + mass2*width2),m_lambda); }
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 Lund_Interface::AdjustProperties(Flavour flav) { int kc = pycomp(SherpaToIdhep(flav)); if(kc>500) return; // adjust mass double pythiamass = pydat2.pmas[1-1][kc-1]; double sherpamass = flav.HadMass(); flav.SetMass(pythiamass); if( !(abs(sherpamass-pythiamass)/sherpamass < 1.e-2) ) { msg_Info()<<METHOD<<" Adjusted mass of "<<flav<<" ("<<flav.Kfcode() <<") from "<<sherpamass<<" to "<<pythiamass<<" to allow Pythia decays."<<endl; } }
size_t Comix1to3::NHel(const Flavour& fl) { switch(fl.IntSpin()) { case 0: return 1; case 1: return 2; case 2: if (IsZero(fl.Mass())) return 2; else return 3; default: THROW(not_implemented, "Comix not yet capable of spin > 1."); return 0; } }
bool Decay_Channel::FlavourSort(const Flavour &fl1,const Flavour &fl2) { // TODO: Get rid of this custom sorting, but then the hadron decay channel // files have to be changed as well (order mapping in MEs) kf_code kf1(fl1.Kfcode()), kf2(fl2.Kfcode()); if (kf1>kf2) return true; if (kf1<kf2) return false; /* anti anti -> true anti part -> false part anti -> true anti anti -> true */ return !(fl1.IsAnti()&&!fl2.IsAnti()); }
double Hadron_Remnant::MinimalEnergy(const ATOOLS::Flavour &flavour) { if (!m_initialized) { if (!flavour.Strong()) { return p_beam->Beam().HadMass(); } bool found(false); kf_code di[3]; if (flavour.IsQuark()) { short unsigned int j=0; for (Flavour_Vector::const_iterator flit(m_constit.begin()); flit!=m_constit.end();++flit) { if (found || flavour!=*flit) di[j++]=flit->Kfcode(); else found=true; } } Flavour difl; if (!found || flavour.IsGluon()) { int single=-1; for (size_t i=0;i<m_constit.size();++i) { for (size_t j=i+1;j<m_constit.size();++j) { if (m_constit[i]==m_constit[j]) { single=j; break; } } if (single>0) break; } Flavour fl(m_constit[single]); for (short unsigned int j=0, i=0;i<3;i++) if (i!=single) di[j++]=m_constit[i].Kfcode(); if (di[0]>di[1]) difl=Flavour((kf_code)(di[0]*1000+di[1]*100+1)); else if (di[1]>di[0]) difl=Flavour((kf_code)(di[1]*1000+di[0]*100+1)); else difl=Flavour((kf_code)(di[0]*1100+3)); if (m_constit[single].IsAnti()) difl=difl.Bar(); return difl.Mass()+fl.Mass()+flavour.Bar().Mass(); } if (di[0]>di[1]) difl=Flavour((kf_code)(di[0]*1000+di[1]*100+1)); else if (di[1]>di[0]) difl=Flavour((kf_code)(di[1]*1000+di[0]*100+1)); else difl=Flavour((kf_code)(di[0]*1100+3)); if (m_constit[0].IsAnti()) difl=difl.Bar(); return difl.Mass(); } else { if (flavour.IsQuark()) return flavour.Bar().Mass(); } return 0.; }
void Hard_Decay_Handler::ReadDecayTable(Flavour decayer) { DEBUG_FUNC(decayer); if (!m_store_results) return; Data_Reader reader = Data_Reader("|",";","!"); reader.SetAddCommandLine(false); reader.AddComment("#"); reader.AddComment("//"); reader.AddWordSeparator("\t"); reader.SetInputPath(m_resultdir); reader.SetInputFile(decayer.ShellName()); vector<vector<string> > file; if(reader.MatrixFromFile(file)) { for (size_t iline=0; iline<file.size(); ++iline) { if (file[iline].size()==4) { string decaychannel=file[iline][0]; vector<double> results(3); for (size_t i=0; i<3; ++i) results[i]=ToType<double>(file[iline][i+1]); m_read[decayer].insert(make_pair(decaychannel, results)); } else { PRINT_INFO("Wrong format in decay table in "<<m_resultdir); } } } }
Proto_Particle:: Proto_Particle(Flavour flav,Vec4D mom,char info) : m_flav(flav), m_mom(mom), m_info(info), m_mass(hadpars->GetConstituents()->Mass(flav)), m_kt2max(0.), p_partner(NULL) { if (!flav.IsGluon() && !flav.IsDiQuark()) { if (flav.IsQuark() && flav.Kfcode()>5) { std::cerr<<"Error in Proto_Particle::Proto_Particle():\n" <<" Tried to form a cluster particle from a "<<flav<<".\n" <<" Please make sure that heavy coloured objects decay " <<"before they enter hadronization.\n" <<" Will exit the run.\n"; abort(); } } control::s_AHAprotoparticles++; s_actives.push_back(this); }
T3Channel::T3Channel(int _nin,int _nout,Flavour * fl,Flavour res) { nin = _nin; nout = _nout; ms = new double[nin+nout]; for (int i=0;i<nin+nout;i++) ms[i] = ATOOLS::sqr(fl[i].Mass()); rannum = 3*nout-4; rans = new double[rannum]; s = smax = pt2max = sqr(ATOOLS::rpa->gen.Ecms()); pt2min = 0.0; E = 0.5 * sqrt(s); name = "T3-Channel"; if (nout>2) name = ToString(nin)+"->"+ToString(nout)+"_"+name; mass = width = 0.; type = 0; if (res!=Flavour(kf_none)) { mass = res.Mass(); width = res.Width(); type = 1; } p_vegas = new Vegas(rannum,100,name,0); }
void InitialiseAnalysis() { #ifdef USING__ROOT msg_Out()<<"initialising ROOT analysis ..."<<std::endl; ATOOLS::MakeDir("PhotonAnalysisDirectory/SingleDecay/"+mother_flav.ShellName()+"_decays",true,493); rootfile = new TFile(string("PhotonAnalysisDirectory/SingleDecay/"+ mother_flav.ShellName()+"_decays/"+ mother_flav.ShellName()+"__"+ "DAUGHTERS"+".root").c_str(), "RECREATE"); photonmultiplicity = makeTH1D("photon_multiplicity","", 10, -0.5, 10.5, Flavour(kf_photon).RootName()+" multiplicity","Events"); decayframeenergy = makeTH1D("decayframeenergy","", 1000, 0., mother_flav.HadMass(), "total energy radiated in decay frame","Events"); multipoleframeangles = makeTH1D("multipoleframeangles","", 1000, 0., M_PI, "angular radiation pattern","Events"); #endif }
ATOOLS::Blob* Mixing_Handler::PerformMixing(Particle* decayer) const { // explicit mixing in event record Flavour flav = decayer->Flav(); string tag = flav.IsAnti() ? flav.Bar().IDName() : flav.IDName(); if(m_model("Mixing_"+tag,0.0)!=0.0 && decayer->Info()!=char('M')) { double t = DetermineMixingTime(decayer,true)/rpa->hBar(); if(t==0.0) return NULL; double factor = decayer->Flav().QOverP2(); if(decayer->Flav().IsAnti()) factor = 1.0/factor; double dG = decayer->Flav().DeltaGamma()*t/4.0; double dm = decayer->Flav().DeltaM()*t/2.0; Complex i(0.0,1.0); double prob_not_mix = sqr(abs(exp(i*dm)*exp(dG)+exp(-i*dm)*exp(-dG))); double prob_mix = factor*sqr(abs(exp(i*dm)*exp(dG)-exp(-i*dm)*exp(-dG))); if(prob_mix > ran->Get()*(prob_mix+prob_not_mix)) { if(decayer->DecayBlob()) { decayer->DecayBlob()->RemoveOwnedParticles(); delete decayer->DecayBlob(); } decayer->SetStatus(part_status::decayed); decayer->SetInfo('m'); Particle* mixed_part = new Particle(0, decayer->Flav().Bar(), decayer->Momentum(), 'M'); mixed_part->SetFinalMass(decayer->FinalMass()); mixed_part->SetStatus(part_status::active); mixed_part->SetTime(decayer->Time()); Blob* mixingblob = new Blob(); mixingblob->SetType(btp::Hadron_Mixing); mixingblob->SetId(); mixingblob->SetStatus(blob_status::inactive); mixingblob->SetTypeSpec("HADRONS"); mixingblob->AddToInParticles(decayer); mixingblob->AddToOutParticles(mixed_part); mixingblob->SetPosition(decayer->ProductionBlob()->Position()); mixingblob->SetStatus(blob_status::needs_hadrondecays); return mixingblob; } } return NULL; }
void InitialiseGenerator(int argc, char *argv[]) { if(argc<2) { cout<<"Usage: ./SingleDecay <PDG_CODE>"<<endl; THROW(normal_exit,"you didn't specify the decaying particle by PDG code."); } small_sherpa_init(argc, argv); hadrons = new SHERPA::Hadron_Decay_Handler(".", "Fragmentation.dat"); Data_Reader * reader = new Data_Reader(" ",";","!","="); reader->AddWordSeparator("\t"); reader->SetInputPath("./"); reader->SetInputFile("YFS.dat"); photons = new PHOTONS::Photons(reader,true); mother_flav = Flavour( (kf_code) abs(ToType<int>(argv[1])) ); mother_flav.SetStable(false); if(ToType<int>(argv[1])<0) mother_flav=mother_flav.Bar(); rpa->gen.SetEcms(mother_flav.HadMass()); msg_Info()<<"Welcome. I am decaying a "<<mother_flav<<endl; Particle* mother_part = new Particle( 1,mother_flav, Vec4D(mother_flav.HadMass(),0.,0.,0.) ); mother_part->SetTime(); mother_part->SetFinalMass(mother_flav.HadMass()); ref_blob = new Blob(); ref_blob->SetType(btp::Hadron_Decay); ref_blob->SetStatus(blob_status::needs_hadrondecays); ref_blob->AddToInParticles(mother_part); try { hadrons->FillOnshellDecay(ref_blob, NULL); } catch (Return_Value::code ret) { msg_Error()<<METHOD<<" Something went wrong for blob: "<<ref_blob<<endl; return; } }
bool Soft_Cluster_Handler:: ClusterAnnihilation(Cluster * cluster,Flavour & had1,Flavour & had2) { int kfc1(int(cluster->GetTrip()->m_flav.Kfcode())); int kfc2(int(cluster->GetAnti()->m_flav.Kfcode())); kf_code kfc11(kfc1/1000),kfc12((kfc1-kfc11*1000)/100); kf_code kfc21(kfc2/1000),kfc22((kfc2-kfc21*1000)/100); Flavour fl1(kfc11), fl2(kfc12), fl3(kfc21), fl4(kfc22); fl1 = fl1.Bar(); fl2 = fl2.Bar(); Proto_Particle *pp1(new Proto_Particle(fl1,cluster->GetTrip()->m_mom/2.,'l')); Proto_Particle *pp2(new Proto_Particle(fl2,cluster->GetTrip()->m_mom/2.,'l')); Proto_Particle *pp3(new Proto_Particle(fl3,cluster->GetAnti()->m_mom/2.,'l')); Proto_Particle *pp4(new Proto_Particle(fl4,cluster->GetAnti()->m_mom/2.,'l')); bool order(ran->Get()>0.5?true:false); Cluster cluster1((order?pp3:pp4),pp1), cluster2((!order?pp4:pp3),pp2); Flavour_Pair pair1, pair2; pair1.first = cluster1.GetTrip()->m_flav; pair1.first = cluster1.GetAnti()->m_flav; pair2.first = cluster2.GetTrip()->m_flav; pair2.first = cluster2.GetAnti()->m_flav; double mass(cluster->Mass()); double wt1(TransformWeight(&cluster1,had1,true,true)); double wt2(TransformWeight(&cluster2,had2,true,true)); if (wt1<0. || wt2<0.) return false; bool lighter1(wt1>0.), lighter2(wt2>0.); while (had1.Mass()+had2.Mass()>mass && lighter1 && lighter2) { lighter1 = wt1>0.; lighter2 = wt2>0.; if (wt1<=wt2) { if (lighter1) wt1 = TransformWeight(&cluster1,had1,true,true); else if (lighter2) wt2 = TransformWeight(&cluster2,had2,true,true); else return false; } else { if (lighter2) wt2 = TransformWeight(&cluster2,had2,true,true); else if (lighter1) wt1 = TransformWeight(&cluster1,had1,true,true); else return false; } } return true; }
Decay2Channel::Decay2Channel(int _nin,int _nout,const Flavour * fl,Flavour res) { if (_nout != 2 || _nin!=1) { msg_Error()<<"Tried to initialize Decay2Channel with nout = "<<_nin<<" -> "<<_nout<<endl; abort(); } nin = _nin; nout = _nout; ms = new double[nin+nout]; for (short int i=0;i<nin+nout;i++) ms[i] = ATOOLS::sqr(fl[i].Mass()); rannum = 2; rans = new double[rannum]; s = smax = pt2max = sqr(ATOOLS::rpa->gen.Ecms()); pt2min = 0.; E = 0.5 * sqrt(s); name = "Decay2-Channel"; mass = width = 0.; type = 0; if (res!=Flavour(kf_none)) { mass = res.Mass(); width = res.Width(); type = 1; } }
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; }
double Continued_PDF::XPDF(const Flavour & flav,const bool & defmax) { if (flav.IsDiQuark()) { if (m_bunch==Flavour(kf_p_plus) && !flav.IsAnti()) { return XPDF(Flavour(kf_u)); } if (m_bunch==Flavour(kf_p_plus).Bar() && flav.IsAnti()) { return XPDF(Flavour(kf_u).Bar()); } return 0.; } if (m_x<m_xmin) return 0.; if (m_Q2>m_Q02) return p_pdf->GetXPDF(flav); double seapart(0.), valpart(0.); if (m_bunch==Flavour(kf_p_plus)) { if (flav==Flavour(kf_u) || flav==Flavour(kf_d)) { seapart = p_pdf->GetXPDF(flav.Bar())*(m_Q2/m_Q02); valpart = p_pdf->GetXPDF(flav)-p_pdf->GetXPDF(flav.Bar()); } else if (flav==Flavour(kf_gluon)) { seapart = p_pdf->GetXPDF(flav)*(m_Q2/m_Q02); valpart = 1./m_gnorm * pow(1.-m_x,m_geta) * pow(m_x,m_glambda) * m_Snorm * (1.-m_Q2/m_Q02); /* ((p_pdf->GetXPDF(Flavour(kf_u))-p_pdf->GetXPDF(Flavour(kf_u).Bar()) + p_pdf->GetXPDF(Flavour(kf_d))-p_pdf->GetXPDF(Flavour(kf_d).Bar()))/ m_Vnorm) * */ } else seapart = p_pdf->GetXPDF(flav)*(m_Q2/m_Q02); } else if (m_bunch==Flavour(kf_p_plus).Bar()) { if (flav==Flavour(kf_u).Bar() || flav==Flavour(kf_d).Bar()) { seapart = p_pdf->GetXPDF(flav.Bar())*(m_Q2/m_Q02); valpart = p_pdf->GetXPDF(flav)-p_pdf->GetXPDF(flav.Bar()); } else if (flav==Flavour(kf_gluon)) { seapart = p_pdf->GetXPDF(flav)*(m_Q2/m_Q02); valpart = (p_pdf->GetXPDF(Flavour(kf_u).Bar())-p_pdf->GetXPDF(Flavour(kf_u)) + p_pdf->GetXPDF(Flavour(kf_d).Bar())-p_pdf->GetXPDF(Flavour(kf_d))) * m_Snorm/m_Vnorm * (1.-m_Q2/m_Q02); } else seapart = p_pdf->GetXPDF(flav)*(m_Q2/m_Q02); } double total = seapart+valpart; if (defmax && total>m_xpdfmax[flav]) { m_xmaxpdf[flav] = m_x; m_xpdfmax[flav] = total; } return total; }
T1Channel::T1Channel(int _nin,int _nout,Flavour * fl,Flavour res) { if (_nout != 2 || _nin!=2) { msg_Error()<<"Tried to initialize T1Channel with nout = "<<_nin<<" -> "<<_nout<<endl; abort(); } nin = _nin; nout = _nout; ms = new double[nin+nout]; for (int i=0;i<nin+nout;i++) ms[i] = ATOOLS::sqr(fl[i].Mass()); rannum = 3*nout-4; rans = new double[rannum]; s = smax = pt2max = sqr(ATOOLS::rpa->gen.Ecms()); pt2min = 0.0; E = 0.5 * sqrt(s); name = "T-Channel"; mass = width = 0.; type = 0; if (res!=Flavour(kf_none)) { mass = res.Mass(); width = res.Width(); type = 1; } p_vegas = new Vegas(rannum,100,name,0); }
Blob_List* GenerateEvent() { Blob_List* blobs = new Blob_List(); Particle* mother_part = new Particle( 1,mother_flav,Vec4D(mother_flav.HadMass(),0.,0.,0.) ); mother_part->SetTime(); mother_part->SetFinalMass(mother_flav.HadMass()); Blob* blob = blobs->AddBlob(btp::Hadron_Decay); blob->SetStatus(blob_status::needs_hadrondecays); blob->AddToInParticles(mother_part); try { hadrons->FillOnshellDecay(blob, NULL); } catch (Return_Value::code ret) { msg_Error()<<METHOD<<" Something went wrong for event: "<<*blobs <<endl; return blobs; } hadrons->CleanUp(); msg_Events()<<*blobs<<std::endl; return blobs; }
double Lund_Interface::GenerateMass(Flavour flav, double min, double max) { int kc = pycomp(SherpaToIdhep(flav))-1; double peak = pydat2.pmas[1-1][kc]; double w_cut = pydat2.pmas[3-1][kc]; if(w_cut == 0.0) { if(peak<min-Accu() || peak>max+Accu()) return -1.0; else return peak; } else { double finalmin = min>(peak-w_cut)? min : peak-w_cut; double finalmax = max<(peak+w_cut)? max : peak+w_cut; if(finalmin>finalmax) return -1.0; else return flav.RelBWMass(finalmin, finalmax, this->Mass(flav)); } }
Hadron_Decay_Channel* Mixing_Handler::Select(Particle* decayer, const Hadron_Decay_Table& ot) const { Flavour flav = decayer->Flav(); string tag = flav.IsAnti() ? flav.Bar().IDName() : flav.IDName(); if(m_model("Interference_"+tag,0.0)!=0.0) { double lifetime = DetermineMixingTime(decayer,false); bool anti_at_t0 = decayer->Flav().IsAnti(); if(decayer->ProductionBlob()->Type()==btp::Hadron_Mixing) anti_at_t0 = !anti_at_t0; if(lifetime!=0.0) { Hadron_Decay_Table table(ot); double cos_term = cos(flav.DeltaM()/rpa->hBar()*lifetime); double sin_term = sin(flav.DeltaM()/rpa->hBar()*lifetime); double GX, GR, asymmetry, a; for(size_t i=0; i<table.size(); i++) { Hadron_Decay_Channel* hdc = table.at(i); if(hdc->CPAsymmetryS()==0.0 && hdc->CPAsymmetryC()==0.0) continue; if(flav.DeltaGamma()==0.0) { asymmetry = hdc->CPAsymmetryS()*sin_term - hdc->CPAsymmetryC()*cos_term; } else { Complex lambda = hdc->CPAsymmetryLambda(); double l2 = sqr(abs(lambda)); double dG = flav.DeltaGamma()/rpa->hBar(); asymmetry = (2.0*lambda.imag()/(1.0+l2)*sin_term - (1.0-l2)/(1.0+l2)*cos_term)/ (cosh(dG*lifetime/2.0) - 2.0*lambda.real()/(1.0+l2)*sinh(dG*lifetime/2.0)); } GX = hdc->Width(); // partial width of this DC GR = table.TotalWidth()-GX; // partial width of other DCs if(asymmetry>0.0) a = -1.0*GR/2.0/GX/asymmetry+sqrt(sqr(GR)/4.0/sqr(GX)/sqr(asymmetry)+(GR+GX)/GX); else if(asymmetry<0.0) a = -1.0*GR/2.0/GX/asymmetry-sqrt(sqr(GR)/4.0/sqr(GX)/sqr(asymmetry)+(GR+GX)/GX); else a = 0.0; if(anti_at_t0) table.UpdateWidth(hdc, (1.0+a)*GX); else table.UpdateWidth(hdc, (1.0-a)*GX); } return table.Select(); } } return ot.Select(); }
void Interaction_Model_SM_Zprime::c_FFV(vector<Single_Vertex>& vertex,int& vanz) { // create the vertices for the standard model Interaction_Model_SM::c_FFV(vertex,vanz); // create FFV vertices with Z' if it's on kf_code kfZp=32; Flavour flZprime(kfZp); if (flZprime.IsOn()) { // parse through all fermions than couple to Z' and create vertices int PossibleFermions[12] = {1,2,3,4,5,6,11,12,13,14,15,16}; for (int i=0; i<12; i++) { // initialize the currently parsed fermion int FermionNumber = PossibleFermions[i]; Flavour flFermion = Flavour((kf_code)(FermionNumber)); Kabbala B = Kabbala(string("B_{")+flFermion.TexName()+string("}"), flFermion.BaryonNumber()); Kabbala L = Kabbala(string("L_{")+ flFermion.TexName()+string("}"), flFermion.LeptonNumber()); Kabbala Y3R = Kabbala(string("YR_{")+flFermion.TexName()+string("}"), flFermion.IsoWeak()); if (flFermion.IsOn()) { // create the vertex for that particular fermion and a Z'. // Right-handed neutrinos will not take part in any interaction. Kabbala kcpl0; if ((FermionNumber==12)||(FermionNumber==14)||(FermionNumber==16)) {kcpl0 = Kabbala("0.0", 0.);} else {kcpl0 = -M_I * g2 * (Y3R * alphaLR + (L-B)/(alphaLR*2));}; Kabbala kcpl1 = -M_I * g2 * (L-B) / (alphaLR*2); // set couplings and particle info for current vertex vertex[vanz].in[0] = flFermion; vertex[vanz].in[1] = flZprime; vertex[vanz].in[2] = Flavour((kf_code)(FermionNumber)); vertex[vanz].cpl[0] = kcpl0; vertex[vanz].cpl[1] = kcpl1; vertex[vanz].Str = (kcpl0*PR+kcpl1*PL).String(); // Color Function for vertex if (flFermion.Strong()) { vertex[vanz].Color.push_back(Color_Function(cf::D));; vertex[vanz].Color.back().SetParticleArg(0,2); vertex[vanz].Color.back().SetStringArg('0','2'); } else vertex[vanz].Color.push_back(Color_Function(cf::None));; // Lorenz function for vertex vertex[vanz].Lorentz.push_back(LF_Getter::GetObject("Gamma",LF_Key())); vertex[vanz].Lorentz.back()->SetParticleArg(1); vertex[vanz].on = 1; vertex.push_back(Single_Vertex());vanz++; }; }; }; }
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"; } } }
int Vertex::SetVertex(Single_Vertex& orig, Single_Vertex& probe, int i0, int i1, int i2, int i3,int mode) { probe = orig; if ((orig.dec>0 && orig.dec&4) && !((i0==1 && i1==2 && i2==3) || (i0==-2 && i1==3 && i2==-1) || (i0==-3 && i1==-1 && i2==2))) return 0; if ((orig.dec>0 && orig.dec&2) && !(i0==1 && i1==2 && i2==3)) return 0; if (i0<0) probe.in[0] = orig.in[-i0-1].Bar(); else probe.in[0] = orig.in[i0-1]; if (i1<0) probe.in[1] = orig.in[-i1-1].Bar(); else probe.in[1] = orig.in[i1-1]; if (i2<0) probe.in[2] = orig.in[-i2-1].Bar(); else probe.in[2] = orig.in[i2-1]; if (orig.nleg==4) { if (i3<0) probe.in[3] = orig.in[-i3-1].Bar(); else if (i3<99) probe.in[3] = orig.in[i3-1]; } if (CheckExistence(probe)==0) return 0; if (probe.nleg==3) { if (FermionRule(probe)==0) return 0;} int hc = 0; int cnt = 0; for(int i=0;i<orig.nleg;i++) { if(orig.in[i]!=orig.in[i].Bar()) cnt++; } if(cnt>0){ Flavour *flavlist= new Flavour[cnt]; int *flaglist= new int[cnt]; cnt = 0; for(int i=0;i<orig.nleg;i++){ if(orig.in[i]!=orig.in[i].Bar()) { flavlist[cnt] = orig.in[i]; if (i==0) flavlist[cnt] = flavlist[cnt].Bar(); flaglist[cnt] = 0; cnt++; } } for (int i=0;i<cnt;i++) { for (int j=i+1;j<cnt;j++) { if (flavlist[i]==flavlist[j].Bar()) flaglist[i]=flaglist[j]=1; } } for (int i=0;i<cnt;i++) { if (flaglist[i]==0) hc = 1; } delete[] flavlist; delete[] flaglist; } int probehc = 0; if (hc) { // probe = h.c. ??? for (short int i=0;i<orig.nleg;i++) { Flavour flav = orig.in[i]; if (flav!=flav.Bar()) { if (i==0) flav = flav.Bar(); for (short int j=0;j<orig.nleg;j++) { Flavour flav2 = probe.in[j]; if (j==0) flav2 = flav2.Bar(); if (flav2!=flav2.Bar()) { if (flav==flav2.Bar()) { probehc = 1; break; } } } if (probehc) break; } } if (probehc) { int conjugate = 1; for (short int i=0;i<orig.nleg;i++) { //pseudoscalar if (orig.in[i]==Flavour(kf_A0)) conjugate *= -1; } if (orig.Lorentz.front()->Type()=="SSV" || orig.Lorentz.front()->Type()=="VVV") conjugate *= -1; if (conjugate==-1) { for (short int i=0;i<4;i++) probe.cpl[i] = -probe.cpl[i]; } probe.Color.front().Conjugate(); if (probe.Lorentz.front()->String()=="1") { //exchange left and right Kabbala help = probe.cpl[0]; probe.cpl[0] = probe.cpl[1]; probe.cpl[1] = help; } } } if (orig.nleg==3 && (orig.Lorentz.front()->Type()=="FFV")) { //exchange left and right for 'barred' FFV vertices if ((i0==-1 && (!orig.in[0].SelfAnti() || (!orig.in[2].SelfAnti()))) || (i0==-3 && (!orig.in[2].SelfAnti() || (!orig.in[0].SelfAnti())))) { Kabbala help = -probe.cpl[0]; probe.cpl[0] = -probe.cpl[1]; probe.cpl[1] = help; } } if (probe.dec>0 && probe.in[2].IsDummy()) for (short int i=0;i<4;i++) probe.cpl[i] = -probe.cpl[i]; //Color and Lorentz structure changes.... int newIndex[4]; for (short int i=0;i<4;i++) newIndex[i] = -1; for (short int i=0;i<orig.nleg;i++) { Flavour flav = orig.in[i]; if (i==0) flav = flav.Bar(); for (short int j=0;j<orig.nleg;j++) { Flavour flav2 = probe.in[j]; if (j==0) flav2 = flav2.Bar(); if (flav==flav2 || (flav==flav2.Bar() && probehc)) { int hit = 1; for (short int k=0;k<i;k++) { if (newIndex[k]==j) { hit = 0; break; } } if (hit) { newIndex[i] = j; break; } } } } for (size_t i=0;i<probe.Color.size();i++) { ColorExchange(&probe.Color[i],newIndex[0],newIndex[1],newIndex[2],newIndex[3]); } for (size_t i=0;i<probe.Lorentz.size();i++) LorentzExchange(probe.Lorentz[i],newIndex[0],newIndex[1],newIndex[2],newIndex[3]); return 1; }
void InitialiseAnalysis() { #ifdef USING__ROOT map<string, string> tags=Read_Write_Base::GlobalTags(); string filepiece; map<string, string>::const_iterator it=tags.find("TAG_FILE_PIECE"); if(it!=tags.end()) filepiece="."+it->second; Hadron_Decay_Table* table=hadrons->DecayMap()->FindDecay(mother_flav); for(int i(0);i<table->size();++i) { Hadron_Decay_Channel* hdc=table->at(i); string fname = hdc->FileName(); rootfiles[hdc]= new TFile(("Analysis/"+fname.erase(fname.length()-4)+filepiece+".root").c_str(),"RECREATE"); TH1D* hist; int currenthist=0; int noutp(hdc->NOut()); for(int i=0; i<noutp; i++) { Flavour flav = hdc->GetDecayProduct(i); string name = "costheta_"+flav.IDName()+"_"+ToString(i); string xtitle = "cos(#Theta) of "+flav.RootName(); string ytitle = "#frac{1}{#Gamma} #frac{d#Gamma}{dcos(#Theta)}"; hist = makeTH1D(name, "", 50, -1.0, 1.0, xtitle, ytitle); ThetaHists[hdc].push_back(hist); currenthist++; } currenthist=0; for(int i=0; i<noutp; i++) { Flavour flav = hdc->GetDecayProduct(i); string name = "E_"+flav.IDName()+"_"+ToString(i); string xtitle = "E of "+flav.RootName()+" [GeV]"; string ytitle = "#frac{1}{#Gamma} #frac{d#Gamma}{dE} [GeV^{-1}]"; double M = mother_flav.HadMass(); double othermass = 0.0; for(int k=0; k<noutp; k++) { if(k!=i) othermass+=hdc->GetDecayProduct(k).HadMass(); } double Emin = 0.9*flav.HadMass(); double Emax = 1.1/2.0/M*(sqr(M)+sqr(flav.HadMass())-othermass); hist = makeTH1D(name, "", 50, Emin, Emax, xtitle, ytitle); EnergyHists[hdc].push_back(hist); currenthist++; } currenthist=0; for(int i=0; i<noutp; i++) { if(noutp<3) break; for(int j=i+1; j<noutp; j++) { Flavour flav1 = hdc->GetDecayProduct(i); Flavour flav2 = hdc->GetDecayProduct(j); string name = "q2_"+flav1.IDName()+"_"+flav2.IDName()+"_"+ToString(i)+ToString(j); string xtitle = "Inv. Mass q^{2}=(p_{"+flav1.RootName()+"}+p_{" +flav2.RootName()+"})^{2} [GeV^{2}]"; string ytitle = "#frac{1}{#Gamma} #frac{d#Gamma}{dq^{2}} [GeV^{-2}]"; double othermass = 0.0; for(int k=0; k<noutp; k++) { if(k==i || k==j) continue; othermass+=hdc->GetDecayProduct(k).HadMass(); } double q2min = 0.0; double q2max = 1.1*sqr(hdc->GetDecaying().HadMass()-othermass); hist = makeTH1D(name.c_str(), "", 50, q2min, q2max, xtitle, ytitle); TwoInvMassHists[hdc].push_back(hist); currenthist++; } } currenthist=0; for(int i=0; i<noutp; i++) { if(noutp<4) break; for(int j=i+1; j<noutp; j++) { for(int k=j+1; k<noutp; k++) { Flavour flav1 = hdc->GetDecayProduct(i); Flavour flav2 = hdc->GetDecayProduct(j); Flavour flav3 = hdc->GetDecayProduct(k); string name = "q2_"+flav1.IDName()+"_"+flav2.IDName()+"_"+flav3.IDName() +"_"+ToString(i)+ToString(j)+ToString(k); string xtitle = "Inv. Mass q^{2}=(p_{"+flav1.RootName()+ "}+p_{"+flav2.RootName()+"}+p_{"+flav3.RootName()+"})^{2} [GeV^{2}]"; string ytitle = "#frac{1}{#Gamma} #frac{d#Gamma}{dq^{2}} [GeV^{-2}]"; double othermass = 0.0; for(int l=0; l<noutp; l++) { if(l==i || l==j || l==k) continue; othermass+=hdc->GetDecayProduct(k).HadMass(); } double q2min = 0.0; double q2max = 1.1*sqr(hdc->GetDecaying().HadMass()); hist = makeTH1D(name.c_str(), "", 50, q2min, q2max, xtitle, ytitle); ThreeInvMassHists[hdc].push_back(hist); currenthist++; } } } } #endif }
void SM_U1_B::FillSpectrum(const PDF::ISR_Handler_Map& isr) { p_dataread->RereadInFile(); p_constants->insert(make_pair(string("M_Z'"), p_dataread->GetValue<double>("M_Z'",-1.))); p_constants->insert(make_pair(string("g'_1"), p_dataread->GetValue<double>("g'_1",0.))); double MZprime(ScalarConstant(string("M_Z'"))),GZprime(0.),inc; double g1prime(sqr(ScalarConstant(std::string("g'_1")))); FixMix(); msg_Out()<<"Calculate width for Z' with mass = "<<MZprime<<" GeV.\n"; for (short int i=1;i<=6;i++) { Flavour quark = Flavour((kf_code)(i)); double massq = quark.HadMass(); if (!quark.IsOn() || !quark.Strong()) continue; if (i%2) { if (2.*massq>MZprime) continue; GZprime += inc = 3.*MZprime*g1prime/(24.*M_PI)*pow(1.-sqr(2.*massq/MZprime),3./2.); msg_Out()<<" Add Z' --> "<<quark<<"+"<<quark.Bar()<<" ("<<i<<"), " <<" add "<<inc<<" GeV.\n"; } else { double M2 = MZprime*MZprime, mq2 = massq*massq; for (short int j=2;j<=7;j+=2) { Flavour anti = Flavour((kf_code)(j)).Bar(); if (!anti.IsOn() || !anti.Strong()) continue; double massa = anti.HadMass(), ma2 = massa*massa; if (massq+massa>MZprime) continue; Complex mix = ComplexMatrixElement(std::string("UpMix"),i/2-1,j/2-1); double absmix = ATOOLS::sqr(mix.real())+ATOOLS::sqr(mix.imag()); if (ATOOLS::IsZero(absmix)) continue; GZprime += inc = 3.*g1prime*absmix/(24.*M_PI*M2)* ((2.*M2-mq2-ma2)/2.-3.*massq*massa-ATOOLS::sqr(ma2-mq2)/(2.*M2)) * sqrt(ATOOLS::sqr(M2-mq2-ma2)-4.*ma2*mq2)/(2.*MZprime); msg_Out()<<" Add Z' --> "<<quark<<"+"<<anti<<" ("<<i<<"), " <<" add "<<inc<<" GeV.\n"; } } } Flavour flav; flav = Flavour(kf_Z0_2); flav.SetMass(ScalarConstant(string("M_Z'"))); flav.SetHadMass(MZprime); flav.SetMassOn(true); flav.SetWidth(GZprime); msg_Out()<<METHOD<<" initializes Z' boson with \n" <<" mass = "<<MZprime<<" GeV and width = "<<GZprime<<" GeV\n" <<" for g'_1 = "<<ScalarConstant(std::string("g'_1"))<<".\n"; }
void Channel_Generator_Decays::GenerateMasses(int flag,Point** _plist,int pcount, int& rannum,ofstream& sf) { string * lm = new string[pcount]; string * momp = new string[pcount]; int * sflag = new int[pcount]; string mummy; string sum_s_i; string help; for (short int i=0;i<pcount;i++) { lm[i] = LinkedMasses(_plist[i]); mummy += lm[i]; if (_plist[i]->left==0) { if (flag==0 || flag==10) AddToVariables(flag,lm[i],string("ms[")+GetMassIndex(lm[i])+string("]"),0,sf); //sf<<" double s"<<lm[i]<<" = ms["<<lm[i]<<"];"<<endl; momp[i] = string("p[") + GetMassIndex(lm[i]) + string("]"); sflag[i] = 1; //sum_s_i += string("-sqrt(s")+lm[i]+string(")"); help += lm[i]; } else { CalcSmin(flag,"min",lm[i],sf,_plist[i]); momp[i] = string("p") + Order(lm[i]); sflag[i] = 0; } } if (help.length()>0) { //CalcSmin(flag,"restmin",help,sf,0); //sum_s_i = string("-sqrt(s")+Order(help)+string("_restmin)"); CalcSmin(flag,"min",help,sf,0); sum_s_i = string("-sqrt(s")+Order(help)+string("_min)"); } int hit; double maxpole; double res; Flavour flav; string smax; for (;;) { hit = -1; maxpole = -1.; for (short int j=0;j<pcount;j++) { if (sflag[j]==0) { flav = _plist[j]->fl; res = ATOOLS::sqr(flav.Width()*flav.Mass()); if (!ATOOLS::IsZero(res) && Massive(flav)) { if (1./res>maxpole) { maxpole = 1./res; hit = j; } } else { if (hit==-1) hit = j; } } } if (hit==-1) break; smax = string("sqr(sqrt(s")+Order(mummy)+string(")")+sum_s_i; for (short int j=0;j<pcount;j++) { if (sflag[j]==0 && j!=hit) { smax += string("-sqrt(s")+Order(lm[j])+string("_min)"); } } smax += string(")"); AddToVariables(flag,lm[hit] +string("_max"),smax,0,sf); //sf<<" double s"<<Order(lm[hit])<<"_max = "<<smax<<endl; int hi = 0; if (maxpole>0.) { hi = (_plist[hit]->fl).Kfcode(); if (flag>=0) sf<<" Flavour fl"<<lm[hit]<<" = "<<"Flavour((kf_code)("<<hi<<"));"<<endl; } switch (flag) { case -11: case -1: if (maxpole>0.) { m_idc.push_back(string("MP")+ToString(hi)+string("_")+Order(lm[hit])); } else m_idc.push_back(string("MlP_")+Order(lm[hit])); break; case 0: case 10: sf<<" Vec4D "<<momp[hit]<<";"<<endl <<" double s"<<Order(lm[hit])<<";"<<endl; if (maxpole>0.) { sf<<" s"<<Order(lm[hit]) <<" = CE.MassivePropMomenta(fl"<<lm[hit]<<".Mass(),"<<"fl"<<lm[hit]<<".Width(),1," <<"s"<<Order(lm[hit])<<"_min,s"<<Order(lm[hit])<<"_max,ran["<<rannum<<"]);"<<endl; } else { sf<<" s"<<Order(lm[hit])<<" = CE.MasslessPropMomenta(1.,s"<<Order(lm[hit])<<"_min," <<"s"<<Order(lm[hit])<<"_max,ran["<<rannum<<"]);"<<endl; } rannum++; break; default: string s(""); for (int i=0;i<(int)lm[hit].length()-1;i++) s += string("p[")+GetMassIndex(lm[hit][i])+string("]+"); s += string("p[")+GetMassIndex(lm[hit][lm[hit].length()-1])+string("]"); AddToVariables(flag,lm[hit],s,1,sf); AddToVariables(flag,lm[hit],string("dabs(")+momp[hit]+string(".Abs2())"),0,sf); if (maxpole>0.) { sf<<" wt *= CE.MassivePropWeight(fl"<<lm[hit]<<".Mass(),"<<"fl"<<lm[hit]<<".Width(),1," <<"s"<<Order(lm[hit])<<"_min,s"<<Order(lm[hit])<<"_max,"<<"s"<<Order(lm[hit])<<",rans["<<rannum<<"]);"<<endl; } else { sf<<" wt *= CE.MasslessPropWeight(1.,s"<<Order(lm[hit])<<"_min," <<"s"<<Order(lm[hit])<<"_max,s"<<Order(lm[hit])<<",rans["<<rannum<<"]);"<<endl; } rannum++; } sum_s_i += string("-sqrt(s")+Order(lm[hit])+string(")"); sflag[hit] = 1; } delete[] lm; delete[] momp; delete[] sflag; }