Page MenuHomeHEPForge

No OneTemporary

diff --git a/MatrixElement/MEMinBias.cc b/MatrixElement/MEMinBias.cc
--- a/MatrixElement/MEMinBias.cc
+++ b/MatrixElement/MEMinBias.cc
@@ -1,279 +1,295 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the MEMinBias class.
//
#include "MEMinBias.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Interface/Reference.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Utilities/SimplePhaseSpace.h"
//#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Handlers/StandardXComb.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Handlers/SamplerBase.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
using namespace Herwig;
#include "ThePEG/PDT/EnumParticles.h"
#include "ThePEG/MatrixElement/Tree2toNDiagram.h"
inline bool checkValence(int i,int side,Ptr<StandardEventHandler>::tptr eh){
// Inline function to check for valence quarks of the beam.
// i: pdgid of quark
// side: beam side
// eh: pointer to the eventhandler
int beam= ( side == 0 ) ? eh->incoming().first->id() : eh->incoming().second->id();
vector<int> val;
- if( beam == ParticleID::pplus || beam == ParticleID::n0 ) val = {1,2};
- if( beam == ParticleID::pbarminus || beam == ParticleID::nbar0 ) val = { -1 , -2 };
- if( val.size() == 0 )
- {cerr<<"\n\n MEMinBias: Valence Quarks not defined for pid "<<beam;assert(false);}
- for(auto v:val)if(v==i)return true;
+ switch (beam) {
+ case ParticleID::pplus :
+ case ParticleID::n0 :
+ val = { 1, 2 };
+ break;
+ case ParticleID::pbarminus:
+ case ParticleID::nbar0:
+ val = { -1, -2 };
+ break;
+ case ParticleID::piplus :
+ val = { -1, 2 };
+ break;
+ case ParticleID::piminus :
+ val = { 1, -2 };
+ break;
+ default :
+ cerr << "\n\n MEMinBias: Valence Quarks not defined for pid " << beam;
+ assert(false);
+ };
+ for(const int & v : val )
+ if(v==i) return true;
return false;
}
void MEMinBias::getDiagrams() const {
int maxflav(2);
// Pomeron data
tcPDPtr pom = getParticleData(990);
Ptr<StandardEventHandler>::tptr eh = dynamic_ptr_cast<Ptr<StandardEventHandler>::tptr>(generator()->eventHandler());
for ( int i = 1; i <= maxflav; ++i ) {
for( int j=1; j <= i; ++j){
tcPDPtr q1 = getParticleData(i);
tcPDPtr q1b = q1->CC();
tcPDPtr q2 = getParticleData(j);
tcPDPtr q2b = q2->CC();
// For each flavour we add:
//qq -> qq
if(!onlyValQuarks_) add(new_ptr((Tree2toNDiagram(3), q1, pom, q2, 1, q1, 2, q2, -1)));
else if(checkValence(i,0,eh) && checkValence(j,1,eh) ) add(new_ptr((Tree2toNDiagram(3), q1, pom, q2, 1, q1, 2, q2, -1)));
//qqb -> qqb
if(!onlyValQuarks_) add(new_ptr((Tree2toNDiagram(3), q1, pom, q2b, 1, q1, 2, q2b, -2)));
else if(checkValence(i,0,eh) && checkValence(-j,1,eh) ) add(new_ptr((Tree2toNDiagram(3), q1, pom, q2b, 1, q1, 2, q2b, -2)));
//qbqb -> qbqb
if(!onlyValQuarks_) add(new_ptr((Tree2toNDiagram(3), q1b, pom, q2b, 1, q1b, 2, q2b, -3)));
else if(checkValence(-i,0,eh) && checkValence(-j,1,eh) ) add(new_ptr((Tree2toNDiagram(3), q1b, pom, q2b, 1, q1b, 2, q2b, -3)));
}
}
}
Energy2 MEMinBias::scale() const {
return sqr(Scale_);
}
int MEMinBias::nDim() const {
return 0;
}
void MEMinBias::setKinematics() {
HwMEBase::setKinematics(); // Always call the base class method first.
}
bool MEMinBias::generateKinematics(const double *) {
// generate the masses of the particles
for ( int i = 2, N = meMomenta().size(); i < N; ++i ) {
meMomenta()[i] = Lorentz5Momentum(mePartonData()[i]->constituentMass());
}
Energy q = ZERO;
try {
q = SimplePhaseSpace::
getMagnitude(sHat(), meMomenta()[2].mass(), meMomenta()[3].mass());
} catch ( ImpossibleKinematics & e ) {
return false;
}
Energy pt = ZERO;
meMomenta()[2].setVect(Momentum3( pt, pt, q));
meMomenta()[3].setVect(Momentum3(-pt, -pt, -q));
meMomenta()[2].rescaleEnergy();
meMomenta()[3].rescaleEnergy();
jacobian(1.0);
return true;
}
double MEMinBias::correctionweight() const {
// Here we calculate the weight to restore the inelastic-diffractiveXSec
// given by the MPIHandler.
// First get the eventhandler to get the current cross sections.
Ptr<StandardEventHandler>::tptr eh =
dynamic_ptr_cast<Ptr<StandardEventHandler>::tptr>(generator()->eventHandler());
// All diffractive processes make use of this ME.
// The static map can be used to collect all the sumOfWeights.
static map<XCombPtr,double> weightsmap;
weightsmap[lastXCombPtr()]=lastXComb().stats().sumWeights();
// Define static variable to keep trac of reweighting
static double rew_=1.;
static int countUpdateWeight=50;
static double sumRew=0.;
static double countN=0;
// if we produce events we count
if(eh->integratedXSec()>ZERO)sumRew+=rew_;
if(eh->integratedXSec()>ZERO)countN+=1.;
if(countUpdateWeight<countN){
// Summing all diffractive processes (various initial states)
double sum=0.;
for(auto xx:weightsmap){
sum+=xx.second;
}
double avRew=sumRew/countN;
CrossSection XS_have =eh->sampler()->maxXSec()/eh->sampler()->attempts()*sum;
CrossSection XS_wanted=MPIHandler_->nonDiffractiveXSec();
double deltaN=50;
// Cross section without reweighting: XS_norew
// XS_have = avcsNorm2*XS_norew (for large N)
// We want to determine the rew that allows to get the wanted XS.
// In deltaN points we want (left) and we get (right):
// XS_wanted*(countN+deltaN) = XS_have*countN + rew*deltaN*XS_norew
// Solve for rew:
rew_=avRew*(XS_wanted*(countN+deltaN)-XS_have*countN)/(XS_have*deltaN);
countUpdateWeight+=deltaN;
}
//Make sure we dont produce negative weights.
// TODO: write finalize method that checks if reweighting was performed correctly.
rew_=max(rew_,0.000001);
rew_=min(rew_,10000.0);
return rew_;
}
double MEMinBias::me2() const {
//tuned so it gives the correct normalization for xmin = 0.11
return csNorm_*(sqr(generator()->maximumCMEnergy())/GeV2);
}
CrossSection MEMinBias::dSigHatDR() const {
return me2()*jacobian()/sHat()*sqr(hbarc)*correctionweight();
}
unsigned int MEMinBias::orderInAlphaS() const {
return 2;
}
unsigned int MEMinBias::orderInAlphaEW() const {
return 0;
}
Selector<MEBase::DiagramIndex>
MEMinBias::diagrams(const DiagramVector & diags) const {
Selector<DiagramIndex> sel;
for ( DiagramIndex i = 0; i < diags.size(); ++i )
sel.insert(1.0, i);
return sel;
}
Selector<const ColourLines *>
MEMinBias::colourGeometries(tcDiagPtr diag) const {
static ColourLines qq("1 4, 3 5");
static ColourLines qqb("1 4, -3 -5");
static ColourLines qbqb("-1 -4, -3 -5");
Selector<const ColourLines *> sel;
switch(diag->id()){
case -1:
sel.insert(1.0, &qq);
break;
case -2:
sel.insert(1.0, &qqb);
break;
case -3:
sel.insert(1.0, &qbqb);
break;
}
return sel;
}
IBPtr MEMinBias::clone() const {
return new_ptr(*this);
}
IBPtr MEMinBias::fullclone() const {
return new_ptr(*this);
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<MEMinBias,HwMEBase>
describeHerwigMEMinBias("Herwig::MEMinBias", "HwMEHadron.so");
void MEMinBias::persistentOutput(PersistentOStream & os) const {
os << csNorm_ << ounit(Scale_,GeV) << MPIHandler_;
}
void MEMinBias::persistentInput(PersistentIStream & is, int) {
is >> csNorm_ >> iunit(Scale_,GeV) >> MPIHandler_;
}
void MEMinBias::Init() {
static ClassDocumentation<MEMinBias> documentation
("There is no documentation for the MEMinBias class");
static Parameter<MEMinBias,double> interfacecsNorm
("csNorm",
"Normalization of the min-bias cross section.",
&MEMinBias::csNorm_,
1.0, 0.0, 100.0,
false, false, Interface::limited);
static Parameter<MEMinBias,Energy> interfaceScale
("Scale",
"Scale for the Min Bias matrix element.",
&MEMinBias::Scale_,GeV,
2.0*GeV, 0.0*GeV, 100.0*GeV,
false, false, Interface::limited);
static Reference<MEMinBias,UEBase> interfaceMPIHandler
("MPIHandler",
"The object that administers all additional scatterings.",
&MEMinBias::MPIHandler_, false, false, true, true);
static Switch<MEMinBias , bool> interfaceOnlyVal
("OnlyValence" ,
"Allow the dummy process to only extract valence quarks." ,
&MEMinBias::onlyValQuarks_ , false , false , false );
static SwitchOption interfaceOnlyValYes
( interfaceOnlyVal , "Yes" , "" , true );
static SwitchOption interfaceOnlyValNo
( interfaceOnlyVal , "No" , "" , false );
}
diff --git a/PDF/HwRemDecayer.cc b/PDF/HwRemDecayer.cc
--- a/PDF/HwRemDecayer.cc
+++ b/PDF/HwRemDecayer.cc
@@ -1,2020 +1,2028 @@
// -*- C++ -*-
//
// HwRemDecayer.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2019 The Herwig Collaboration
//
// Herwig is licenced under version 3 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the HwRemDecayer class.
//
#include "HwRemDecayer.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Interface/Reference.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Utilities/UtilityBase.h"
#include "ThePEG/Utilities/SimplePhaseSpace.h"
#include "ThePEG/Utilities/Throw.h"
#include "Herwig/Utilities/EnumParticles.h"
#include "Herwig/Shower/ShowerHandler.h"
using namespace Herwig;
namespace{
const bool dbg = false;
void reShuffle(Lorentz5Momentum &p1, Lorentz5Momentum &p2, Energy m1, Energy m2){
Lorentz5Momentum ptotal(p1+p2);
ptotal.rescaleMass();
if( ptotal.m() < m1+m2 ) {
if(dbg)
cerr << "Not enough energy to perform reshuffling \n";
throw HwRemDecayer::ExtraSoftScatterVeto();
}
Boost boostv = -ptotal.boostVector();
ptotal.boost(boostv);
p1.boost(boostv);
// set the masses and energies,
p1.setMass(m1);
p1.setE(0.5/ptotal.m()*(ptotal.m2()+sqr(m1)-sqr(m2)));
p1.rescaleRho();
// boost back to the lab
p1.boost(-boostv);
p2.boost(boostv);
// set the masses and energies,
p2.setMass(m2);
p2.setE(0.5/ptotal.m()*(ptotal.m2()+sqr(m2)-sqr(m1)));
p2.rescaleRho();
// boost back to the lab
p2.boost(-boostv);
}
}
void HwRemDecayer::initialize(pair<tRemPPtr, tRemPPtr> rems, tPPair beam, Step & step,
Energy forcedSplitScale) {
// the step
thestep = &step;
// valence content of the hadrons
theContent.first = getHadronContent(beam.first);
theContent.second = getHadronContent(beam.second);
// momentum extracted from the hadrons
theUsed.first = Lorentz5Momentum();
theUsed.second = Lorentz5Momentum();
theMaps.first.clear();
theMaps.second.clear();
theX.first = 0.0;
theX.second = 0.0;
theRems = rems;
_forcedSplitScale = forcedSplitScale;
// check remnants attached to the right hadrons
if( (theRems.first && parent(theRems.first ) != beam.first ) ||
(theRems.second && parent(theRems.second) != beam.second) )
throw Exception() << "Remnant order wrong in "
<< "HwRemDecayer::initialize(...)"
<< Exception::runerror;
return;
}
void HwRemDecayer::split(tPPtr parton, HadronContent & content,
tRemPPtr rem, Lorentz5Momentum & used,
PartnerMap &partners, tcPDFPtr pdf, bool first) {
theBeam = parent(rem);
theBeamData = dynamic_ptr_cast<Ptr<BeamParticleData>::const_pointer>
(theBeam->dataPtr());
double currentx = parton->momentum().rho()/theBeam->momentum().rho();
double check = rem==theRems.first ? theX.first : theX.second;
check += currentx;
if(1.0-check < 1e-3) throw ShowerHandler::ExtraScatterVeto();
bool anti;
Lorentz5Momentum lastp(parton->momentum());
int lastID(parton->id());
Energy oldQ(_forcedSplitScale);
_pdf = pdf;
- //do nothing if already valence quark
+ // do nothing if already valence quark
if(first && content.isValenceQuark(parton)) {
//set the extracted value, because otherwise no RemID could be generated.
content.extract(lastID);
// add the particle to the colour partners
partners.push_back(make_pair(parton, tPPtr()));
//set the sign
anti = parton->hasAntiColour() && parton->id()!=ParticleID::g;
if(rem==theRems.first) theanti.first = anti;
else theanti.second = anti;
// add the x and return
if(rem==theRems.first) theX.first += currentx;
else theX.second += currentx;
return;
}
//or gluon for secondaries
else if(!first && lastID == ParticleID::g) {
partners.push_back(make_pair(parton, tPPtr()));
// add the x and return
if(rem==theRems.first) theX.first += currentx;
else theX.second += currentx;
return;
}
// if a sea quark.antiquark forced splitting to a gluon
// Create the new parton with its momentum and parent/child relationship set
PPtr newSea;
if( !(lastID == ParticleID::g ||
lastID == ParticleID::gamma) ) {
newSea = forceSplit(rem, -lastID, oldQ, currentx, lastp, used,content);
ColinePtr cl = new_ptr(ColourLine());
if(newSea->dataPtr()->coloured()) {
if(newSea->id() > 0) cl-> addColoured(newSea);
else cl->addAntiColoured(newSea);
}
// if a secondard scatter finished so return
if(!first || content.isValenceQuark(ParticleID::g) ){
partners.push_back(make_pair(parton, newSea));
// add the x and return
if(rem==theRems.first) theX.first += currentx;
else theX.second += currentx;
if(first) content.extract(ParticleID::g);
return;
}
}
// otherwise evolve back to valence
// final valence splitting
PPtr newValence = forceSplit(rem,
lastID!=ParticleID::gamma ?
ParticleID::g : ParticleID::gamma,
oldQ, currentx , lastp, used, content);
// extract from the hadron to allow remnant to be determined
content.extract(newValence->id());
// case of a gluon going into the hard subprocess
if( lastID == ParticleID::g ) {
partners.push_back(make_pair(parton, tPPtr()));
anti = newValence->hasAntiColour();
if(rem==theRems.first) theanti.first = anti;
else theanti.second = anti;
parton->colourLine(!anti)->addColoured(newValence, anti);
return;
}
else if( !parton->coloured()) {
partners.push_back(make_pair(parton, newValence));
anti = newValence->hasAntiColour();
ColinePtr newLine(new_ptr(ColourLine()));
newLine->addColoured(newValence, anti);
if(rem==theRems.first) theanti.first = anti;
else theanti.second = anti;
// add the x and return
if(rem==theRems.first) theX.first += currentx;
else theX.second += currentx;
return;
}
//The valence quark will always be connected to the sea quark with opposite sign
tcPPtr particle;
if(lastID*newValence->id() < 0){
particle = parton;
partners.push_back(make_pair(newSea, tPPtr()));
}
else {
particle = newSea;
partners.push_back(make_pair(parton, tPPtr()));
}
anti = newValence->hasAntiColour();
if(rem==theRems.first) theanti.first = anti;
else theanti.second = anti;
if(particle->colourLine())
particle->colourLine()->addAntiColoured(newValence);
if(particle->antiColourLine())
particle->antiColourLine()->addColoured(newValence);
// add the x and return
if(rem==theRems.first) theX.first += currentx;
else theX.second += currentx;
return;
}
void HwRemDecayer::doSplit(pair<tPPtr, tPPtr> partons,
pair<tcPDFPtr, tcPDFPtr> pdfs,
bool first) {
if(theRems.first) {
ParticleVector children=theRems.first->children();
for(unsigned int ix=0;ix<children.size();++ix) {
if(children[ix]->dataPtr()==theRems.first->dataPtr())
theRems.first = dynamic_ptr_cast<RemPPtr>(children[ix]);
}
}
if(theRems.second) {
ParticleVector children=theRems.second->children();
for(unsigned int ix=0;ix<children.size();++ix) {
if(children[ix]->dataPtr()==theRems.second->dataPtr())
theRems.second = dynamic_ptr_cast<RemPPtr>(children[ix]);
}
}
// forced splitting for first parton
- if(isPartonic(partons.first )) {
+ if(isPartonic(partons.first )) {
try {
split(partons.first, theContent.first, theRems.first,
theUsed.first, theMaps.first, pdfs.first, first);
}
catch(ShowerHandler::ExtraScatterVeto) {
throw ShowerHandler::ExtraScatterVeto();
}
}
// forced splitting for second parton
if(isPartonic(partons.second)) {
try {
split(partons.second, theContent.second, theRems.second,
theUsed.second, theMaps.second, pdfs.second, first);
// additional check for the remnants
// if can't do the rescale veto the emission
if(!first&&partons.first->data().coloured()&&
partons.second->data().coloured()) {
Lorentz5Momentum pnew[2]=
{theRems.first->momentum() - theUsed.first - partons.first->momentum(),
theRems.second->momentum() - theUsed.second - partons.second->momentum()};
pnew[0].setMass(getParticleData(theContent.first.RemID())->constituentMass());
pnew[0].rescaleEnergy();
pnew[1].setMass(getParticleData(theContent.second.RemID())->constituentMass());
pnew[1].rescaleEnergy();
for(unsigned int iy=0; iy<theRems.first->children().size(); ++iy)
pnew[0] += theRems.first->children()[iy]->momentum();
for(unsigned int iy=0; iy<theRems.second->children().size(); ++iy)
pnew[1] += theRems.second->children()[iy]->momentum();
Lorentz5Momentum ptotal=
theRems.first ->momentum()-partons.first ->momentum()+
theRems.second->momentum()-partons.second->momentum();
// add x limits
if(ptotal.m() < (pnew[0].m() + pnew[1].m()) ) {
if(partons.second->id() != ParticleID::g){
if(partons.second==theMaps.second.back().first)
theUsed.second -= theMaps.second.back().second->momentum();
else
theUsed.second -= theMaps.second.back().first->momentum();
thestep->removeParticle(theMaps.second.back().first);
thestep->removeParticle(theMaps.second.back().second);
}
theMaps.second.pop_back();
theX.second -= partons.second->momentum().rho()/
parent(theRems.second)->momentum().rho();
throw ShowerHandler::ExtraScatterVeto();
}
}
}
catch(ShowerHandler::ExtraScatterVeto){
if(!partons.first||!partons.second||
!theRems.first||!theRems.second)
throw ShowerHandler::ExtraScatterVeto();
//case of the first forcedSplitting worked fine
theX.first -= partons.first->momentum().rho()/
parent(theRems.first)->momentum().rho();
//case of the first interaction
//throw veto immediately, because event get rejected anyway.
if(first) throw ShowerHandler::ExtraScatterVeto();
//secondary interactions have to end on a gluon, if parton
//was NOT a gluon, the forced splitting particles must be removed
if(partons.first->id() != ParticleID::g) {
if(partons.first==theMaps.first.back().first)
theUsed.first -= theMaps.first.back().second->momentum();
else
theUsed.first -= theMaps.first.back().first->momentum();
thestep->removeParticle(theMaps.first.back().first);
thestep->removeParticle(theMaps.first.back().second);
}
theMaps.first.pop_back();
throw ShowerHandler::ExtraScatterVeto();
}
}
// veto if not enough energy for extraction
if( !first &&(theRems.first ->momentum().e() -
partons.first ->momentum().e() < 1.0e-3*MeV ||
theRems.second->momentum().e() -
partons.second->momentum().e() < 1.0e-3*MeV )) {
if(partons.first->id() != ParticleID::g) {
if(partons.first==theMaps.first.back().first)
theUsed.first -= theMaps.first.back().second->momentum();
else
theUsed.first -= theMaps.first.back().first->momentum();
thestep->removeParticle(theMaps.first.back().first);
thestep->removeParticle(theMaps.first.back().second);
}
theMaps.first.pop_back();
if(partons.second->id() != ParticleID::g) {
if(partons.second==theMaps.second.back().first)
theUsed.second -= theMaps.second.back().second->momentum();
else
theUsed.second -= theMaps.second.back().first->momentum();
thestep->removeParticle(theMaps.second.back().first);
thestep->removeParticle(theMaps.second.back().second);
}
theMaps.second.pop_back();
throw ShowerHandler::ExtraScatterVeto();
}
}
void HwRemDecayer::mergeColour(tPPtr pold, tPPtr pnew, bool anti) const {
ColinePtr clnew, clold;
//save the corresponding colour lines
clold = pold->colourLine(anti);
clnew = pnew->colourLine(!anti);
assert(clold);
// There is already a colour line (not the final diquark)
if(clnew){
if( (clnew->coloured().size() + clnew->antiColoured().size()) > 1 ){
if( (clold->coloured().size() + clold->antiColoured().size()) > 1 ){
//join the colour lines
//I don't use the join method, because potentially only (anti)coloured
//particles belong to one colour line
if(clold!=clnew){//procs are not already connected
while ( !clnew->coloured().empty() ) {
tPPtr p = clnew->coloured()[0];
clnew->removeColoured(p);
clold->addColoured(p);
}
while ( !clnew->antiColoured().empty() ) {
tPPtr p = clnew->antiColoured()[0];
clnew->removeAntiColoured(p);
clold->addAntiColoured(p);
}
}
}else{
//if pold is the only member on it's
//colour line, remove it.
clold->removeColoured(pold, anti);
//and add it to clnew
clnew->addColoured(pold, anti);
}
} else{//pnnew is the only member on it's colour line.
clnew->removeColoured(pnew, !anti);
clold->addColoured(pnew, !anti);
}
} else {//there is no coline at all for pnew
clold->addColoured(pnew, !anti);
}
}
void HwRemDecayer::fixColours(PartnerMap partners, bool anti,
double colourDisrupt) const {
PartnerMap::iterator prev;
tPPtr pnew, pold;
assert(partners.size()>=2);
PartnerMap::iterator it=partners.begin();
while(it != partners.end()) {
//skip the first one to have a partner
if(it==partners.begin()){
it++;
continue;
}
prev = it - 1;
//determine the particles to work with
pold = prev->first;
if(prev->second) {
if(!pold->coloured())
pold = prev->second;
else if(pold->hasAntiColour() != anti)
pold = prev->second;
}
assert(pold);
pnew = it->first;
if(it->second) {
if(it->second->colourLine(!anti)) //look for the opposite colour
pnew = it->second;
}
assert(pnew);
// Implement the disruption of colour connections
if( it != partners.end()-1 ) {//last one is diquark-has to be connected
//has to be inside the if statement, so that the probability is
//correctly counted:
if( UseRandom::rnd() < colourDisrupt ){
if(!it->second){//check, whether we have a gluon
mergeColour(pnew, pnew, anti);
}else{
if(pnew==it->first)//be careful about the order
mergeColour(it->second, it->first, anti);
else
mergeColour(it->first, it->second, anti);
}
it = partners.erase(it);
continue;
}
}
// regular merging
mergeColour(pold, pnew, anti);
//end of loop
it++;
}
return;
}
PPtr HwRemDecayer::forceSplit(const tRemPPtr rem, long child, Energy &lastQ,
double &lastx, Lorentz5Momentum &pf,
Lorentz5Momentum &p,
HadronContent & content) const {
static const double eps=1e-6;
// beam momentum
Lorentz5Momentum beam = theBeam->momentum();
// the last scale is minimum of last value and upper limit
Energy minQ=_range*_kinCutoff*sqrt(lastx)/(1-lastx);
if(minQ>lastQ) lastQ=minQ;
// generate the new value of qtilde
// weighted towards the lower value: dP/dQ = 1/Q -> Q(R) =
// Q0 (Qmax/Q0)^R
Energy q;
unsigned int ntry=0,maxtry=100;
double xExtracted = rem==theRems.first ? theX.first : theX.second;
double zmin= lastx/(1.-xExtracted) ,zmax,yy;
if(1-lastx<eps) throw ShowerHandler::ExtraScatterVeto();
do {
q = minQ*pow(lastQ/minQ,UseRandom::rnd());
yy = 1.+0.5*sqr(_kinCutoff/q);
zmax = yy - sqrt(sqr(yy)-1.);
++ntry;
}
while(zmax<zmin&&ntry<maxtry);
if(ntry==maxtry) throw ShowerHandler::ExtraScatterVeto();
if(zmax-zmin<eps) throw ShowerHandler::ExtraScatterVeto();
// now generate z as in FORTRAN HERWIG
// use y = ln(z/(1-z)) as integration variable
double ymin=log(zmin/(1.-zmin));
double ymax=log(zmax/(1.-zmax));
double dely=ymax-ymin;
unsigned int nz=_nbinmax;
dely/=nz;
yy=ymin+0.5*dely;
vector<int> ids;
bool qed = child==22;
if(child==21||child==22) {
ids=content.flav;
for(unsigned int ix=0;ix<ids.size();++ix) ids[ix] *= content.sign;
}
else if(abs(child)<=6) {
ids.push_back(ParticleID::g);
}
else {
ids.push_back(ParticleID::gamma);
qed=true;
}
// probabilities of the different types of possible splitting
map<long,pair<double,vector<double> > > partonprob;
double ptotal(0.);
for(unsigned int iflav=0;iflav<ids.size();++iflav) {
// only do each parton once
if(partonprob.find(ids[iflav])!=partonprob.end()) continue;
// particle data object
tcPDPtr in = getParticleData(ids[iflav]);
double psum(0.);
vector<double> prob;
for(unsigned int iz=0;iz<nz;++iz) {
double ez=exp(yy);
double wr=1.+ez;
double zr=wr/ez;
double wz=1./wr;
double zz=wz*ez;
double coup = !qed ?
_alphaS ->value(sqr(max(wz*q,_kinCutoff))) :
_alphaEM->value(sqr(max(wz*q,_kinCutoff)));
double az=wz*zz*coup;
// g -> q qbar
if(ids[iflav]==ParticleID::g || ids[iflav]==ParticleID::gamma) {
// calculate splitting function
// SP as q is always less than forcedSplitScale, the pdf scale is fixed
// pdfval = _pdf->xfx(theBeamData,in,sqr(q),lastx*zr);
double pdfval=_pdf->xfx(theBeamData,in,sqr(_forcedSplitScale),lastx*zr);
if(pdfval>0.) psum += pdfval*az*0.5*(sqr(zz)+sqr(wz));
}
// q -> q g
else {
// calculate splitting function
// SP as q is always less than forcedSplitScale, the pdf scale is fixed
// pdfval = _pdf->xfx(theBeamData,in,sqr(q),lastx*zr);
double pdfval=_pdf->xfx(theBeamData,in,sqr(_forcedSplitScale),lastx*zr);
if(pdfval>0.) psum += pdfval*az*4./3.*(1.+sqr(wz))*zr;
}
if(psum>0.) prob.push_back(psum);
yy+=dely;
}
if(psum>0.) partonprob[ids[iflav]] = make_pair(psum,prob);
ptotal+=psum;
}
// select the flavour
if(ptotal==0.) throw ShowerHandler::ExtraScatterVeto();
ptotal *= UseRandom::rnd();
map<long,pair<double,vector<double> > >::const_iterator pit;
for(pit=partonprob.begin();pit!=partonprob.end();++pit) {
if(pit->second.first>=ptotal) break;
else ptotal -= pit->second.first;
}
if(pit==partonprob.end())
throw Exception() << "Can't select parton for forced backward evolution in "
<< "HwRemDecayer::forceSplit" << Exception::eventerror;
// select z
unsigned int iz=0;
for(;iz<pit->second.second.size();++iz) {
if(pit->second.second[iz]>ptotal) break;
}
if(iz==pit->second.second.size()) --iz;
double ey=exp(ymin+dely*(float(iz+1)-UseRandom::rnd()));
double z=ey/(1.+ey);
Energy2 pt2=sqr((1.-z)*q)- z*sqr(_kinCutoff);
// create the particle
if(pit->first!=ParticleID::g &&
pit->first!=ParticleID::gamma) child=pit->first;
PPtr parton = getParticleData(child)->produceParticle();
Energy2 emittedm2 = sqr(parton->dataPtr()->constituentMass());
// Now boost pcm and pf to z only frame
Lorentz5Momentum p_ref = Lorentz5Momentum(ZERO, beam.vect());
Lorentz5Momentum n_ref = Lorentz5Momentum(ZERO, -beam.vect());
// generate phi and compute pt of branching
double phi = Constants::twopi*UseRandom::rnd();
Energy pt=sqrt(pt2);
Lorentz5Momentum qt = LorentzMomentum(pt*cos(phi), pt*sin(phi), ZERO, ZERO);
Axis axis(p_ref.vect().unit());
if(axis.perp2()>0.) {
LorentzRotation rot;
double sinth(sqrt(sqr(axis.x())+sqr(axis.y())));
rot.setRotate(acos(axis.z()),Axis(-axis.y()/sinth,axis.x()/sinth,0.));
qt.transform(rot);
}
// compute alpha for previous particle
Energy2 p_dot_n = p_ref*n_ref;
double lastalpha = pf*n_ref/p_dot_n;
Lorentz5Momentum qtout=qt;
Energy2 qtout2=-qt*qt;
double alphaout=(1.-z)/z*lastalpha;
double betaout=0.5*(emittedm2+qtout2)/alphaout/p_dot_n;
Lorentz5Momentum k=alphaout*p_ref+betaout*n_ref+qtout;
k.rescaleMass();
parton->set5Momentum(k);
pf+=k;
lastQ=q;
lastx/=z;
p += parton->momentum();
thestep->addDecayProduct(rem,parton,false);
return parton;
}
void HwRemDecayer::setRemMasses(PPair diquarks) const {
// get the masses of the remnants
Energy mrem[2];
Lorentz5Momentum ptotal,pnew[2];
vector<tRemPPtr> theprocessed;
theprocessed.push_back(theRems.first);
theprocessed.push_back(theRems.second);
// one remnant in e.g. DIS
if(!theprocessed[0]||!theprocessed[1]) {
tRemPPtr rem = theprocessed[0] ? theprocessed[0] : theprocessed[1];
Lorentz5Momentum deltap(rem->momentum());
// find the diquark and momentum we still need in the energy
tPPtr diquark = theprocessed[0] ? diquarks.first : diquarks.second;
vector<PPtr> progenitors;
for(unsigned int ix=0;ix<rem->children().size();++ix) {
if(rem->children()[ix]==diquark) continue;
progenitors.push_back(rem->children()[ix]);
deltap -= rem->children()[ix]->momentum();
}
// now find the total momentum of the hadronic final-state to
// reshuffle against
// find the hadron for this remnant
tPPtr hadron=rem;
do hadron=hadron->parents()[0];
while(!hadron->parents().empty());
// find incoming parton to hard process from this hadron
tPPtr hardin =
generator()->currentEvent()->primaryCollision()->incoming().first==hadron ?
generator()->currentEvent()->primarySubProcess()->incoming().first :
generator()->currentEvent()->primarySubProcess()->incoming().second;
hadron=rem->parents()[0];
while(hadron->id()==ParticleID::Remnant) hadron=hadron->parents()[0];
tPPtr parent=hardin;
vector<PPtr> tempprog;
// find the outgoing particles emitted from the backward shower
do {
assert(!parent->parents().empty());
tPPtr newparent=parent->parents()[0];
if(newparent==hadron) break;
for(unsigned int ix=0;ix<newparent->children().size();++ix) {
if(newparent->children()[ix]!=parent)
findChildren(newparent->children()[ix],tempprog);
}
parent=newparent;
}
while(parent!=hadron);
// add to list of potential particles to reshuffle against in right order
for(unsigned int ix=tempprog.size();ix>0;--ix) progenitors.push_back(tempprog[ix-1]);
// final-state particles which are colour connected
tColinePair lines = make_pair(hardin->colourLine(),hardin->antiColourLine());
vector<PPtr> others;
for(ParticleVector::const_iterator
cit = generator()->currentEvent()->primarySubProcess()->outgoing().begin();
cit!= generator()->currentEvent()->primarySubProcess()->outgoing().end();++cit) {
// colour connected
if(lines.first&&lines.first==(**cit).colourLine()) {
findChildren(*cit,progenitors);
continue;
}
// anticolour connected
if(lines.second&&lines.second==(**cit).antiColourLine()) {
findChildren(*cit,progenitors);
continue;
}
// not connected
for(unsigned int ix=0;ix<(**cit).children().size();++ix)
others.push_back((**cit).children()[ix]);
}
// work out how much of the system needed for rescaling
unsigned int iloc=0;
Lorentz5Momentum psystem,ptotal;
do {
psystem+=progenitors[iloc]->momentum();
ptotal = psystem + deltap;
ptotal.rescaleMass();
psystem.rescaleMass();
++iloc;
if(ptotal.mass() > psystem.mass() + diquark->mass() &&
psystem.mass()>1*MeV && DISRemnantOpt_<2 && ptotal.e() > 0.*GeV ) break;
}
while(iloc<progenitors.size());
if(ptotal.mass() > psystem.mass() + diquark->mass()) --iloc;
if(iloc==progenitors.size()) {
// try touching the lepton in dis as a last restort
for(unsigned int ix=0;ix<others.size();++ix) {
progenitors.push_back(others[ix]);
psystem+=progenitors[iloc]->momentum();
ptotal = psystem + deltap;
ptotal.rescaleMass();
psystem.rescaleMass();
++iloc;
}
--iloc;
if(ptotal.mass() > psystem.mass() + diquark->mass()) {
if(DISRemnantOpt_==0||DISRemnantOpt_==2)
Throw<Exception>() << "Warning had to adjust the momentum of the"
<< " non-colour connected"
<< " final-state, e.g. the scattered lepton in DIS"
<< Exception::warning;
else
throw Exception() << "Can't set remnant momentum without adjusting "
<< "the momentum of the"
<< " non-colour connected"
<< " final-state, e.g. the scattered lepton in DIS"
<< " vetoing event"
<< Exception::eventerror;
}
else {
throw Exception() << "Can't put the remnant on-shell in HwRemDecayer::setRemMasses()"
<< Exception::eventerror;
}
}
psystem.rescaleMass();
LorentzRotation R = Utilities::getBoostToCM(make_pair(psystem, deltap));
Energy pz = SimplePhaseSpace::getMagnitude(sqr(ptotal.mass()),
psystem.mass(), diquark->mass());
LorentzRotation Rs(-(R*psystem).boostVector());
Rs.boost(0.0, 0.0, pz/sqrt(sqr(pz) + sqr(psystem.mass())));
Rs = Rs*R;
// put remnant on shell
deltap.transform(R);
deltap.setMass(diquark->mass());
deltap.setE(sqrt(sqr(diquark->mass())+sqr(pz)));
deltap.rescaleRho();
R.invert();
deltap.transform(R);
Rs = R*Rs;
// apply transformation to required particles to absorb recoil
for(unsigned int ix=0;ix<=iloc;++ix) {
progenitors[ix]->deepTransform(Rs);
}
diquark->set5Momentum(deltap);
}
// two remnants
else {
for(unsigned int ix=0;ix<2;++ix) {
if(!theprocessed[ix]) continue;
pnew[ix]=Lorentz5Momentum();
for(unsigned int iy=0;iy<theprocessed[ix]->children().size();++iy) {
pnew[ix]+=theprocessed[ix]->children()[iy]->momentum();
}
mrem[ix]=sqrt(pnew[ix].m2());
}
// now find the remnant remnant cmf frame
Lorentz5Momentum prem[2]={theprocessed[0]->momentum(),
theprocessed[1]->momentum()};
ptotal=prem[0]+prem[1];
ptotal.rescaleMass();
// boost momenta to this frame
if(ptotal.m()< (pnew[0].m()+pnew[1].m()))
throw Exception() << "Not enough energy in both remnants in "
<< "HwRemDecayer::setRemMasses() "
<< Exception::eventerror;
Boost boostv(-ptotal.boostVector());
ptotal.boost(boostv);
for(unsigned int ix=0;ix<2;++ix) {
prem[ix].boost(boostv);
// set the masses and energies,
prem[ix].setMass(mrem[ix]);
prem[ix].setE(0.5/ptotal.m()*(sqr(ptotal.m())+sqr(mrem[ix])-sqr(mrem[1-ix])));
prem[ix].rescaleRho();
// boost back to the lab
prem[ix].boost(-boostv);
// set the momenta of the remnants
theprocessed[ix]->set5Momentum(prem[ix]);
}
// boost the decay products
Lorentz5Momentum ptemp;
for(unsigned int ix=0;ix<2;++ix) {
Boost btorest(-pnew[ix].boostVector());
Boost bfmrest( prem[ix].boostVector());
for(unsigned int iy=0;iy<theprocessed[ix]->children().size();++iy) {
ptemp=theprocessed[ix]->children()[iy]->momentum();
ptemp.boost(btorest);
ptemp.boost(bfmrest);
theprocessed[ix]->children()[iy]->set5Momentum(ptemp);
}
}
}
}
void HwRemDecayer::initSoftInteractions(Energy ptmin, InvEnergy2 beta){
ptmin_ = ptmin;
beta_ = beta;
}
Energy HwRemDecayer::softPt() const {
Energy2 pt2(ZERO);
double xmin(0.0), xmax(1.0), x(0);
if(beta_ == ZERO){
return UseRandom::rnd(0.0,(double)(ptmin_/GeV))*GeV;
}
if(beta_ < ZERO){
xmin = 1.0;
xmax = exp( -beta_*sqr(ptmin_) );
}else{
xmin = exp( -beta_*sqr(ptmin_) );
xmax = 1.0;
}
x = UseRandom::rnd(xmin, xmax);
pt2 = 1.0/beta_ * log(1/x);
if( pt2 < ZERO || pt2 > sqr(ptmin_) )
throw Exception() << "HwRemDecayer::softPt generation of pt "
<< "outside allowed range [0," << ptmin_/GeV << "]."
<< Exception::runerror;
//ofstream myfile2("softPt.txt", ios::app );
//myfile2 << pt2/GeV2 <<" "<<sqrt(pt2)/GeV<< endl;
//myfile2.close();
return sqrt(pt2);
}
void HwRemDecayer::softKinematics(Lorentz5Momentum &r1, Lorentz5Momentum &r2,
Lorentz5Momentum &g1, Lorentz5Momentum &g2) const {
g1 = Lorentz5Momentum();
g2 = Lorentz5Momentum();
//All necessary variables for the two soft gluons
Energy pt(softPt()), pz(ZERO);
Energy2 pz2(ZERO);
double phi(UseRandom::rnd(2.*Constants::pi));
double x_g1(0.0), x_g2(0.0);
//Get the external momenta
tcPPair beam(generator()->currentEventHandler()->currentCollision()->incoming());
Lorentz5Momentum P1(beam.first->momentum()), P2(beam.second->momentum());
if(dbg){
cerr << "new event --------------------\n"
<< *(beam.first) << *(softRems_.first)
<< "-------------------\n"
<< *(beam.second) << *(softRems_.second) << endl;
}
//parton mass
Energy mp;
if(quarkPair_){
mp = getParticleData(ParticleID::u)->constituentMass();
}else{
mp = mg_;
}
//Get x_g1 and x_g2
//first limits
double xmin = sqr(ptmin_)/4.0/(P1+P2).m2();
double x1max = (r1.e()+abs(r1.z()))/(P1.e() + abs(P1.z()));
double x2max = (r2.e()+abs(r2.z()))/(P2.e() + abs(P2.z()));
double x1;
if(!multiPeriph_){
//now generate according to 1/x
x_g1 = xmin * exp(UseRandom::rnd(log(x1max/xmin)));
x_g2 = xmin * exp(UseRandom::rnd(log(x2max/xmin)));
}else{
if(valOfN_==0) return;
double param = (1/(2*valOfN_+1))*initTotRap_;
do{
// need 1-x instead of x to get the proper final momenta
x1 = UseRandom::rndGauss(gaussWidth_, 1 - (exp(param)-1)/exp(param));
}while(x1 < 0 || x1>=1.0);
x_g1 = x1max*x1;
x_g2 = x2max*x1;
}
if(dbg)
cerr << x1max << " " << x_g1 << endl << x2max << " " << x_g2 << endl;
Lorentz5Momentum ig1, ig2, cmf;
ig1 = x_g1*P1;
ig2 = x_g2*P2;
ig1.setMass(mp);
ig2.setMass(mp);
ig1.rescaleEnergy();
ig2.rescaleEnergy();
cmf = ig1 + ig2;
//boost vector from cmf to lab
Boost boostv(cmf.boostVector());
//outgoing gluons in cmf
g1.setMass(mp);
g2.setMass(mp);
g1.setX(pt*cos(phi));
g2.setX(-pt*cos(phi));
g1.setY(pt*sin(phi));
g2.setY(-pt*sin(phi));
pz2 = cmf.m2()/4 - sqr(mp) - (pt*pt);
if( pz2/GeV2 < 0.0 ){
if(dbg)
cerr << "EXCEPTION not enough energy...." << endl;
throw ExtraSoftScatterVeto();
}
if(!multiPeriph_){
if(UseRandom::rndbool()){
pz = sqrt(pz2);
}else
pz = -sqrt(pz2);
}else{
pz = pz2 > ZERO ? sqrt(pz2) : ZERO;
}
if(dbg)
cerr << "pz1 has been calculated to: " << pz/GeV << endl;
g1.setZ(pz);
g2.setZ(-pz);
g1.rescaleEnergy();
g2.rescaleEnergy();
if(dbg){
cerr << "check inv mass in cmf frame: " << (g1+g2).m()/GeV
<< " vs. lab frame: " << (ig1+ig2).m()/GeV << endl;
}
g1.boost(boostv);
g2.boost(boostv);
//recalc the remnant momenta
Lorentz5Momentum r1old(r1), r2old(r2);
r1 -= g1;
r2 -= g2;
try{
reShuffle(r1, r2, r1old.m(), r2old.m());
}catch(ExtraSoftScatterVeto){
r1 = r1old;
r2 = r2old;
throw ExtraSoftScatterVeto();
}
if(dbg){
cerr << "remnant 1,2 momenta: " << r1/GeV << "--" << r2/GeV << endl;
cerr << "remnant 1,2 masses: " << r1.m()/GeV << " " << r2.m()/GeV << endl;
cerr << "check momenta in the lab..." << (-r1old-r2old+r1+r2+g1+g2)/GeV << endl;
}
}
void HwRemDecayer::doSoftInteractions_old(unsigned int N) {
if(N == 0) return;
if(!softRems_.first || !softRems_.second)
throw Exception() << "HwRemDecayer::doSoftInteractions: no "
<< "Remnants available."
<< Exception::runerror;
if( ptmin_ == -1.*GeV )
throw Exception() << "HwRemDecayer::doSoftInteractions: init "
<< "code has not been called! call initSoftInteractions."
<< Exception::runerror;
Lorentz5Momentum g1, g2;
Lorentz5Momentum r1(softRems_.first->momentum()), r2(softRems_.second->momentum());
unsigned int tries(1), i(0);
for(i=0; i<N; i++){
//check how often this scattering has been regenerated
if(tries > maxtrySoft_) break;
if(dbg){
cerr << "new try \n" << *softRems_.first << *softRems_.second << endl;
}
try{
softKinematics(r1, r2, g1, g2);
}catch(ExtraSoftScatterVeto){
tries++;
i--;
continue;
}
PPair oldrems = softRems_;
PPair gluons = make_pair(addParticle(softRems_.first, ParticleID::g, g1),
addParticle(softRems_.second, ParticleID::g, g2));
//now reset the remnants with the new ones
softRems_.first = addParticle(softRems_.first, softRems_.first->id(), r1);
softRems_.second = addParticle(softRems_.second, softRems_.second->id(), r2);
//do the colour connections
pair<bool, bool> anti = make_pair(oldrems.first->hasAntiColour(),
oldrems.second->hasAntiColour());
ColinePtr cl1 = new_ptr(ColourLine());
ColinePtr cl2 = new_ptr(ColourLine());
// case 2:
oldrems.first->colourLine(anti.first)
->addColoured(gluons.second,anti.second);
cl2->addColoured(softRems_.first, anti.second);
cl2->addColoured(gluons.second, !anti.second);
oldrems.first->colourLine(anti.first)
->addColoured(gluons.second,anti.second);
oldrems.second->colourLine(anti.second)
->addColoured(gluons.first,anti.first);
cl1->addColoured(softRems_.second, anti.first);
cl1->addColoured(gluons.first, !anti.first);
cl2->addColoured(softRems_.first, anti.second);
cl2->addColoured(gluons.second, !anti.second);
//reset counter
tries = 1;
}
if(dbg)
cerr << "generated " << i << "th soft scatters\n";
}
// Solve the reshuffling equation to rescale the remnant momenta
double bisectReshuffling(const vector<PPtr>& particles,
Energy w,
double target = -16., double maxLevel = 80.) {
double level = 0;
double left = 0;
double right = 1;
double check = -1.;
double xi = -1;
while ( level < maxLevel ) {
xi = (left+right)*pow(0.5,level+1.);
check = 0.;
for (vector<PPtr>::const_iterator p = particles.begin(); p != particles.end(); ++p){
check += sqrt(sqr(xi)*((*p)->momentum().vect().mag2())+sqr((*p)->mass()))/w;
}
if ( check==1. || log10(abs(1.-check)) <= target )
break;
left *= 2.;
right *= 2.;
if ( check >= 1. ) {
right -= 1.;
++level;
}
if ( check < 1. ) {
left += 1.;
++level;
}
}
return xi;
}
LorentzRotation HwRemDecayer::rotate(const LorentzMomentum &p) const {
LorentzRotation R;
static const double ptcut = 1e-20;
Energy2 pt2 = sqr(p.x())+sqr(p.y());
Energy2 pp2 = sqr(p.z())+pt2;
double phi, theta;
if(pt2 <= pp2*ptcut) {
if(p.z() > ZERO) theta = 0.;
else theta = Constants::pi;
phi = 0.;
} else {
Energy pp = sqrt(pp2);
Energy pt = sqrt(pt2);
double ct = p.z()/pp;
double cf = p.x()/pt;
phi = -acos(cf);
theta = acos(ct);
}
// Rotate first around the z axis to put p in the x-z plane
// Then rotate around the Y axis to put p on the z axis
R.rotateZ(phi).rotateY(theta);
return R;
}
struct vectorSort{
bool operator() (Lorentz5Momentum i,Lorentz5Momentum j) {return(i.rapidity() < j.rapidity());}
} ySort;
void HwRemDecayer::doSoftInteractions_multiPeriph(unsigned int N) {
if(N == 0) return;
int Nmpi = N;
for(int j=0;j<Nmpi;j++){
///////////////////////
// TODO: parametrization of the ladder multiplicity (need to tune to 900GeV, 7Tev and 13Tev)
// Parameterize the ladder multiplicity to: ladderMult_ = A_0 * (s/1TeV^2)^alpha
// with the two tunable parameters A_0 =ladderNorm_ and alpha = ladderPower_
// Get the collision energy
//Energy energy(generator()->maximumCMEnergy());
//double reference = sqr(energy/TeV);
// double ladderMult_;
// Parametrization of the ladder multiplicity
// ladderMult_ = ladderNorm_ * pow( ( reference ) , ladderPower_ );
double avgN = 2.*ladderMult_*log((softRems_.first->momentum()
+softRems_.second->momentum()).m()/mg_) + ladderbFactor_;
initTotRap_ = abs(softRems_.first->momentum().rapidity())
+abs(softRems_.second->momentum().rapidity());
// Generate the poisson distribution with mean avgN
N=UseRandom::rndPoisson(avgN);
valOfN_=N;
if(N <= 1){
// j--; //TODO: Do we want to make all Nmpi soft MPIs?
// Compare to MaxTryMPI for hard mpis.
continue;
}
if(!softRems_.first || !softRems_.second)
throw Exception() << "HwRemDecayer::doSoftInteractions: no "
<< "Remnants available."
<< Exception::runerror;
if( ptmin_ == -1.*GeV )
throw Exception() << "HwRemDecayer::doSoftInteractions: init "
<< "code has not been called! call initSoftInteractions."
<< Exception::runerror;
// The remnants
PPtr rem1 = softRems_.first;
PPtr rem2 = softRems_.second;
// Vector for the ladder particles
vector<Lorentz5Momentum> ladderMomenta;
// Remnant momenta
Lorentz5Momentum r1(softRems_.first->momentum()), r2(softRems_.second->momentum());
Lorentz5Momentum cm =r1+r2;
// Initialize partons in the ladder
// The toy masses are needed for the correct calculation of the available energy
Lorentz5Momentum sumMomenta;
for(unsigned int i = 0; i < N; i++) {
// choose constituents
Energy newMass = ZERO;
Energy toyMass;
if(i<2){
// u and d have the same mass so its enough to use u
toyMass = getParticleData(ParticleID::u)->constituentMass();
}
else{
toyMass = getParticleData(ParticleID::g)->constituentMass();
}
Lorentz5Momentum cp(ZERO,ZERO,ZERO,newMass,newMass);
// dummy container for the momentum that is used for momentum conservation
Lorentz5Momentum dummy(ZERO,ZERO,ZERO,toyMass,toyMass);
ladderMomenta.push_back(cp);
sumMomenta+=dummy;
}
// Get the beam energy
tcPPair beam(generator()->currentEventHandler()->currentCollision()->incoming());
//Lorentz5Momentum P1(beam.first->momentum()), P2(beam.second->momentum());
// Calculate available energy for the partons
double x1;//,x2;
double param = (1./(valOfN_+1.))*initTotRap_;
do{
// Need 1-x instead of x to get the proper final momenta
// TODO: physical to use different x's (see comment below)
x1 = UseRandom::rndGauss( gaussWidth_ , exp(-param) );
// x2 = UseRandom::rndGauss( gaussWidth_ , exp(-param) );
}while(x1 < 0 || x1>=1.0); // x2 < 0 || x2>=1.0);
// Remnants 1 and 2 need to be rescaled later by this amount
Lorentz5Momentum ig1 = x1*r1;
Lorentz5Momentum ig2 = x1*r2; //TODO: x2*r2
// requires boost of Ladder in x1/x2-dependent
// frame.
// If the remaining remnant energy is not sufficient for the restmass of the remnants
// then continue/try again
if ( cm.m() - (ig1+ig2).m() < r1.m()+r2.m() ){
continue;
}
// The available energy that is used to generate the ladder
// sumMomenta is the the sum of rest masses of the ladder partons
// the available energy goes all into the kinematics
Energy availableEnergy = (ig1+ig2).m() - sumMomenta.m();
// If not enough energy then continue
// The available energy has to be larger then the rest mass of the remnants
if ( availableEnergy < ZERO ) {
// j--; //TODO: Do we want to make all Nmpi soft MPIs?
continue;
}
unsigned int its(0);
// Generate the momenta of the partons in the ladder
if ( !(doPhaseSpaceGenerationGluons(ladderMomenta,availableEnergy,its)) ){
// j--; //TODO: Do we want to make all Nmpi soft MPIs?
continue;
}
// Add gluon mass and rescale
Lorentz5Momentum totalMomPartons;
Lorentz5Momentum totalMassLessPartons;
// Sort the ladder partons according to their rapidity and then choose which ones will be the quarks
sort(ladderMomenta.begin(),ladderMomenta.end(),ySort);
int countPartons=0;
long quarkID=0;
// Choose between up and down quarks
int choice = UseRandom::rnd2(1,1);
switch (choice) {
case 0: quarkID = ParticleID::u; break;
case 1: quarkID = ParticleID::d; break;
}
for (auto &p:ladderMomenta){
totalMomPartons+=p;
// Set the mass of the gluons and the two quarks in the ladder
if(countPartons==0 || countPartons==int(ladderMomenta.size()-1)){
p.setMass( getParticleData(quarkID)->constituentMass() );
}else{
p.setMass( getParticleData(ParticleID::g)->constituentMass() );
}
p.rescaleEnergy();
countPartons++;
}
// Continue if energy conservation is violated
if ( abs(availableEnergy - totalMomPartons.m()) > 1e-8*GeV){
// j--; //TODO: Do we want to make all Nmpi soft MPIs?
continue;
}
// Boost momenta into CM frame
const Boost boostv(-totalMomPartons.boostVector());
Lorentz5Momentum totalMomentumAfterBoost;
for ( unsigned int i=0; i<ladderMomenta.size(); i++){
ladderMomenta[i].boost(boostv);
totalMomentumAfterBoost +=ladderMomenta[i];
}
const Boost boostvR(-cm.boostVector());
r1.boost(boostvR);
r2.boost(boostvR);
// Remaining energy after generation of soft ladder
Energy remainingEnergy = cm.m() - totalMomentumAfterBoost.m();
// Continue if not enough energy
if(remainingEnergy<ZERO) {
// j--; //TODO: Do we want to make all Nmpi soft MPIs?
continue;
}
vector<PPtr> remnants;
rem1->set5Momentum(r1);
rem2->set5Momentum(r2);
remnants.push_back(rem1);
remnants.push_back(rem2);
vector<PPtr> reshuffledRemnants;
Lorentz5Momentum totalMomentumAll;
// Bisect reshuffling for rescaling of remnants
double xi_remnants = bisectReshuffling(remnants,remainingEnergy);
// Rescale remnants
for ( auto &rems: remnants ) {
Lorentz5Momentum reshuffledMomentum;
reshuffledMomentum = xi_remnants*rems->momentum();
reshuffledMomentum.setMass(getParticleData(softRems_.first->id())->constituentMass());
reshuffledMomentum.rescaleEnergy();
reshuffledMomentum.boost(-boostvR);
rems->set5Momentum(reshuffledMomentum);
totalMomentumAll+=reshuffledMomentum;
}
// Then the other particles
for ( auto &p:ladderMomenta ) {
p.boost(-boostvR);
totalMomentumAll+=p;
}
// sanity check
if ( abs(cm.m() - totalMomentumAll.m()) > 1e-8*GeV) {
continue;
}
// sort again
sort(ladderMomenta.begin(),ladderMomenta.end(),ySort);
// Do the colour connections
// Original rems are the ones which are connected to other parts of the event
PPair oldRems_ = softRems_;
pair<bool, bool> anti = make_pair(oldRems_.first->hasAntiColour(),
oldRems_.second->hasAntiColour());
// Replace first remnant
softRems_.first = addParticle(softRems_.first, softRems_.first->id(),
remnants[0]->momentum());
// Connect the old remnant to the new remnant
oldRems_.first->colourLine(anti.first)->addColoured(softRems_.first, anti.first);
// Replace second remnant
softRems_.second = addParticle(softRems_.second, softRems_.second->id(),
remnants[1]->momentum());
// This connects the old remnants to the new remnants
oldRems_.second->colourLine(anti.second)->addColoured(softRems_.second, anti.second);
// Add all partons to the first remnant for the event record
vector<PPtr> partons;
vector<PPtr> quarks;
int count=0;
// Choose the colour connections and position of quark antiquark
// Choose between R1-q-g..g-qbar-R2 or R1-qbar-g...g-q-R2
// (place of quark antiquarks in the ladder)
int quarkPosition = UseRandom::rnd2(1,1);
for (auto &p:ladderMomenta){
if(p.mass()==getParticleData(ParticleID::u)->constituentMass()){
if(count==0){
if(quarkPosition==0){
quarks.push_back(addParticle(softRems_.first, quarkID, p));
count++;
}else{
quarks.push_back(addParticle(softRems_.first, -quarkID, p));
count++;
}
}else{
if(quarkPosition==0){
quarks.push_back(addParticle(softRems_.first, -quarkID, p));
}else{
quarks.push_back(addParticle(softRems_.first, quarkID, p));
}
}
}else{
partons.push_back(addParticle(softRems_.first, ParticleID::g, p));
}
softRems_.first = addParticle(softRems_.first, softRems_.first->id(),
softRems_.first->momentum());
oldRems_.first->colourLine(anti.first)->addColoured(softRems_.first, anti.first);
}
// Need to differenciate between the two quark positions, this defines the
// colour connections to the new remnants and old remnants
if(quarkPosition==0){
// ladder self contained
if(partons.size()==0 && quarks.size()>0){
ColinePtr clq = new_ptr(ColourLine());
clq->addColoured(quarks[0]);
clq->addAntiColoured(quarks[1]);
}
ColinePtr clfirst = new_ptr(ColourLine());
ColinePtr cllast = new_ptr(ColourLine());
if(partons.size()>0){
clfirst->addColoured(quarks[0]);
clfirst->addAntiColoured(partons[0]);
cllast->addAntiColoured(quarks[1]);
cllast->addColoured(partons[partons.size()-1]);
//now the remaining gluons
for (unsigned int i=0; i<partons.size()-1; i++){
ColinePtr cl = new_ptr(ColourLine());
cl->addColoured(partons[i]);
cl->addAntiColoured(partons[i+1]);
}
}
} else {
if(partons.size()==0 && quarks.size()>0){
ColinePtr clq = new_ptr(ColourLine());
clq->addAntiColoured(quarks[0]);
clq->addColoured(quarks[1]);
}
ColinePtr clfirst = new_ptr(ColourLine());
ColinePtr cllast = new_ptr(ColourLine());
if(partons.size()>0){
clfirst->addAntiColoured(quarks[0]);
clfirst->addColoured(partons[0]);
cllast->addColoured(quarks[1]);
cllast->addAntiColoured(partons[partons.size()-1]);
//now the remaining gluons
for (unsigned int i=0; i<partons.size()-1; i++){
ColinePtr cl = new_ptr(ColourLine());
cl->addAntiColoured(partons[i]);
cl->addColoured(partons[i+1]);
}
}
}// end colour connection loop
}// end Nmpi loop
}//end function
// Do the phase space generation here is 1 to 1 the same from UA5 model
bool HwRemDecayer::doPhaseSpaceGenerationGluons(vector<Lorentz5Momentum> &softGluons, Energy CME, unsigned int &its)
const{
// Define the parameters
unsigned int _maxtries = 300;
double alog = log(CME*CME/GeV2);
unsigned int ncl = softGluons.size();
// calculate the slope parameters for the different clusters
// outside loop to save time
vector<Lorentz5Momentum> mom(ncl);
// Sets the slopes depending on the constituent quarks of the cluster
for(unsigned int ix=0;ix<ncl;++ix)
{
mom[ix]=softGluons[ix];
}
// generate the momenta
double eps = 1e-10/double(ncl);
vector<double> xi(ncl);
vector<Energy> tempEnergy(ncl);
Energy sum1(ZERO);
double yy(0.);
// We want to make sure that the first Pt is from the
// desired pt-distribution. If we select the first pt in the
// trial loop we introduce a bias.
Energy firstPt=softPt();
while(its < _maxtries) {
++its;
Energy sumx = ZERO;
Energy sumy = ZERO;
unsigned int iterations(0);
unsigned int _maxtriesNew = 100;
while(iterations < _maxtriesNew) {
iterations++;
Energy sumxIt = ZERO;
Energy sumyIt = ZERO;
bool success=false;
Energy pTmax=ZERO;
for(unsigned int i = 0; i<ncl; ++i) {
// Different options for soft pt sampling
//1) pT1>pT2...pTN
//2) pT1>pT2>..>pTN
//3) flat
//4) y dependent
//5) Frist then flat
int triesPt=0;
Energy pt;
//Energy ptTest;
switch(PtDistribution_) {
case 0: //default softPt()
pt=softPt();
break;
case 1: //pTordered
if(i==0){
pt=softPt();
pTmax=pt;
}else{
do{
pt=softPt();
}while(pt>pTmax);
}
break;
case 2: //strongly pT ordered
if ( i==0 ) {
pt=softPt();
pTmax=pt;
} else {
do {
if ( triesPt==20 ) {
pt=pTmax;
break;
}
pt=softPt();
triesPt++;
} while ( pt>pTmax );
pTmax=pt;
}
break;
case 3: //flat
pt = UseRandom::rnd(0.0,(double)(ptmin_/GeV))*GeV;
break;
case 4: //flat below first pT
if ( i==0 ) {
pt = firstPt;
} else {
pt = firstPt * UseRandom::rnd();
}
break;
case 5: //flat but rising below first pT
if ( i==0 ) {
pt=firstPt;
} else {
pt = firstPt * pow(UseRandom::rnd(),1/2);
}
}
Energy2 ptp = pt*pt;
if(ptp <= ZERO) pt = - sqrt(-ptp);
else pt = sqrt(ptp);
// randomize azimuth
Energy px,py;
//randomize the azimuth, but the last one should cancel all others
if(i<ncl-1){
randAzm(pt,px,py);
// set transverse momentum
mom[i].setX(px);
mom[i].setY(py);
sumxIt += px;
sumyIt += py;
}else{
//calculate azimuth angle s.t
// double factor;
Energy pTdummy;
pTdummy = sqrt(sumxIt*sumxIt+sumyIt*sumyIt);
if( pTdummy < ptmin_ ){
px=-sumxIt;
py=-sumyIt;
mom[i].setX(px);
mom[i].setY(py);
sumxIt+=px;
sumyIt+=py;
sumx = sumxIt;
sumy = sumyIt;
success=true;
}
}
}
if(success){
break;
}
}
sumx /= ncl;
sumy /= ncl;
// find the sum of the transverse mass
Energy sumtm=ZERO;
for(unsigned int ix = 0; ix<ncl; ++ix) {
mom[ix].setX(mom[ix].x()-sumx);
mom[ix].setY(mom[ix].y()-sumy);
Energy2 pt2 = mom[ix].perp2();
// Use the z component of the clusters momentum for temporary storage
mom[ix].setZ(sqrt(pt2+mom[ix].mass2()));
sumtm += mom[ix].z();
}
// if transverse mass greater the CMS try again
if(sumtm > CME) continue;
// randomize the mom vector to get the first and the compensating parton
// at all possible positions:
long (*p_irnd)(long) = UseRandom::irnd;
random_shuffle(mom.begin(),mom.end(),p_irnd);
for(unsigned int i = 0; i<ncl; i++) xi[i] = randUng(0.6,1.0);
// sort into ascending order
sort(xi.begin(), xi.end());
double ximin = xi[0];
double ximax = xi.back()-ximin;
xi[0] = 0.;
for(unsigned int i = ncl-2; i>=1; i--) xi[i+1] = (xi[i]-ximin)/ximax;
xi[1] = 1.;
yy= log(CME*CME/(mom[0].z()*mom[1].z()));
bool suceeded=false;
Energy sum2,sum3,sum4;
for(unsigned int j = 0; j<10; j++) {
sum1 = sum2 = sum3 = sum4 = ZERO;
for(unsigned int i = 0; i<ncl; i++) {
Energy tm = mom[i].z();
double ex = exp(yy*xi[i]);
sum1 += tm*ex;
sum2 += tm/ex;
sum3 += (tm*ex)*xi[i];
sum4 += (tm/ex)*xi[i];
}
double fy = alog-log(sum1*sum2/GeV2);
double dd = (sum3*sum2 - sum1*sum4)/(sum1*sum2);
double dyy = fy/dd;
if(abs(dyy/yy) < eps) {
yy += dyy;
suceeded=true;
break;
}
yy += dyy;
}
if(suceeded){
break;
}
if(its > 100) eps *= 10.;
}
if(its==_maxtries){
return false;
}
// throw Exception() << "Can't generate soft underlying event in "
// << "UA5Handler::generateCylindricalPS"
// << Exception::eventerror;
double zz = log(CME/sum1);
for(unsigned int i = 0; i<ncl; i++) {
Energy tm = mom[i].z();
double E1 = exp(zz + yy*xi[i]);
mom[i].setZ(0.5*tm*(1./E1-E1));
mom[i].setE( 0.5*tm*(1./E1+E1));
softGluons[i]=mom[i];
}
return true;
}
void HwRemDecayer::finalize(double colourDisrupt, unsigned int softInt){
PPair diquarks;
//Do the final Rem->Diquark or Rem->quark "decay"
if(theRems.first) {
diquarks.first = finalSplit(theRems.first, theContent.first.RemID(),
theUsed.first);
theMaps.first.push_back(make_pair(diquarks.first, tPPtr()));
}
if(theRems.second) {
diquarks.second = finalSplit(theRems.second, theContent.second.RemID(),
theUsed.second);
theMaps.second.push_back(make_pair(diquarks.second, tPPtr()));
}
setRemMasses(diquarks);
if(theRems.first) {
fixColours(theMaps.first, theanti.first, colourDisrupt);
if(theContent.first.hadron->id()==ParticleID::pomeron&&
pomeronStructure_==0) fixColours(theMaps.first, !theanti.first, colourDisrupt);
}
if(theRems.second) {
fixColours(theMaps.second, theanti.second, colourDisrupt);
if(theContent.second.hadron->id()==ParticleID::pomeron&&
pomeronStructure_==0) fixColours(theMaps.second, !theanti.second, colourDisrupt);
}
if( !theRems.first || !theRems.second ) return;
//stop here if we don't have two remnants
softRems_ = diquarks;
doSoftInteractions(softInt);
}
HwRemDecayer::HadronContent
HwRemDecayer::getHadronContent(tcPPtr hadron) const {
HadronContent hc;
hc.hadron = hadron->dataPtr();
long id(hadron->id());
// baryon
if(BaryonMatcher::Check(hadron->data())) {
hc.sign = id < 0? -1: 1;
hc.flav.push_back((id = abs(id)/10)%10);
hc.flav.push_back((id /= 10)%10);
hc.flav.push_back((id /= 10)%10);
hc.extracted = -1;
}
else if(hadron->data().id()==ParticleID::gamma ||
(hadron->data().id()==ParticleID::pomeron && pomeronStructure_==1)) {
hc.sign = 1;
for(int ix=1;ix<6;++ix) {
hc.flav.push_back( ix);
hc.flav.push_back(-ix);
}
}
else if(hadron->data().id()==ParticleID::pomeron ) {
hc.sign = 1;
hc.flav.push_back(ParticleID::g);
hc.flav.push_back(ParticleID::g);
}
else if(hadron->data().id()==ParticleID::reggeon ) {
hc.sign = 1;
for(int ix=1;ix<3;++ix) {
hc.flav.push_back( ix);
hc.flav.push_back(-ix);
}
}
+ else {
+ hc.sign = id < 0? -1: 1;
+ hc.flav.push_back(-(id = abs(id)/10)%10);
+ hc.flav.push_back((id = abs(id)/10)%10);
+ if(hc.flav.back()%2!=0) {
+ for(int & i : hc.flav) i *=-1;
+ }
+ }
hc.pomeronStructure = pomeronStructure_;
return hc;
}
long HwRemDecayer::HadronContent::RemID() const{
if(extracted == -1)
throw Exception() << "Try to build a Diquark id without "
<< "having extracted something in "
<< "HwRemDecayer::RemID(...)"
<< Exception::runerror;
//the hadron was a meson or photon
if(flav.size()==2) return sign*flav[(extracted+1)%2];
long remId;
int id1(sign*flav[(extracted+1)%3]),
id2(sign*flav[(extracted+2)%3]),
sign(0), spin(0);
if (abs(id1) > abs(id2)) swap(id1, id2);
sign = (id1 < 0) ? -1 : 1; // Needed for the spin 0/1 part
remId = id2*1000+id1*100;
// Now decide if we have spin 0 diquark or spin 1 diquark
if(id1 == id2) spin = 3; // spin 1
else spin = 1; // otherwise spin 0
remId += sign*spin;
return remId;
}
tPPtr HwRemDecayer::addParticle(tcPPtr parent, long id, Lorentz5Momentum p) const {
PPtr newp = new_ptr(Particle(getParticleData(id)));
newp->set5Momentum(p);
// Add the new remnant to the step, but don't do colour connections
thestep->addDecayProduct(parent,newp,false);
return newp;
}
void HwRemDecayer::findChildren(tPPtr part,vector<PPtr> & particles) const {
if(part->children().empty()) particles.push_back(part);
else {
for(unsigned int ix=0;ix<part->children().size();++ix)
findChildren(part->children()[ix],particles);
}
}
ParticleVector HwRemDecayer::decay(const DecayMode &,
const Particle &, Step &) const {
throw Exception() << "HwRemDecayer::decay(...) "
<< "must not be called explicitely."
<< Exception::runerror;
}
void HwRemDecayer::persistentOutput(PersistentOStream & os) const {
os << ounit(_kinCutoff, GeV) << _range << _zbin << _ybin
<< _nbinmax << _alphaS << _alphaEM << DISRemnantOpt_
<< maxtrySoft_ << colourDisrupt_ << ladderPower_<< ladderNorm_ << ladderMult_ << ladderbFactor_ << pomeronStructure_
<< ounit(mg_,GeV) << ounit(ptmin_,GeV) << ounit(beta_,sqr(InvGeV))
<< allowTop_ << allowLeptons_
<< multiPeriph_ << valOfN_ << initTotRap_ << PtDistribution_;
}
void HwRemDecayer::persistentInput(PersistentIStream & is, int) {
is >> iunit(_kinCutoff, GeV) >> _range >> _zbin >> _ybin
>> _nbinmax >> _alphaS >> _alphaEM >> DISRemnantOpt_
>> maxtrySoft_ >> colourDisrupt_ >> ladderPower_ >> ladderNorm_ >> ladderMult_ >> ladderbFactor_ >> pomeronStructure_
>> iunit(mg_,GeV) >> iunit(ptmin_,GeV) >> iunit(beta_,sqr(InvGeV))
>> allowTop_ >> allowLeptons_
>> multiPeriph_ >> valOfN_ >> initTotRap_ >> PtDistribution_;
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<HwRemDecayer,RemnantDecayer>
describeHerwigHwRemDecayer("Herwig::HwRemDecayer", "HwShower.so");
void HwRemDecayer::Init() {
static ClassDocumentation<HwRemDecayer> documentation
("The HwRemDecayer class decays the remnant for Herwig");
static Parameter<HwRemDecayer,double> interfaceZBinSize
("ZBinSize",
"The size of the vbins in z for the interpolation of the splitting function.",
&HwRemDecayer::_zbin, 0.05, 0.001, 0.1,
false, false, Interface::limited);
static Parameter<HwRemDecayer,int> interfaceMaxBin
("MaxBin",
"Maximum number of z bins",
&HwRemDecayer::_nbinmax, 100, 10, 1000,
false, false, Interface::limited);
static Reference<HwRemDecayer,ShowerAlpha> interfaceAlphaS
("AlphaS",
"Pointer to object to calculate the strong coupling",
&HwRemDecayer::_alphaS, false, false, true, false, false);
static Reference<HwRemDecayer,ShowerAlpha> interfaceAlphaEM
("AlphaEM",
"Pointer to object to calculate the electromagnetic coupling",
&HwRemDecayer::_alphaEM, false, false, true, false, false);
static Parameter<HwRemDecayer,Energy> interfaceKinCutoff
("KinCutoff",
"Parameter kinCutoff used to constrain qtilde",
&HwRemDecayer::_kinCutoff, GeV, 0.75*GeV, 0.5*GeV, 10.0*GeV,
false, false, Interface::limited);
static Parameter<HwRemDecayer,double> interfaceEmissionRange
("EmissionRange",
"Factor above the minimum possible value in which the forced splitting is allowed.",
&HwRemDecayer::_range, 1.1, 1.0, 10.0,
false, false, Interface::limited);
static Switch<HwRemDecayer,unsigned int> interfaceDISRemnantOption
("DISRemnantOption",
"Options for the treatment of the remnant in DIS",
&HwRemDecayer::DISRemnantOpt_, 0, false, false);
static SwitchOption interfaceDISRemnantOptionDefault
(interfaceDISRemnantOption,
"Default",
"Use the minimum number of particles needed to take the recoil"
" and allow the lepton to be used if needed",
0);
static SwitchOption interfaceDISRemnantOptionNoLepton
(interfaceDISRemnantOption,
"NoLepton",
"Use the minimum number of particles needed to take the recoil but"
" veto events where the lepton kinematics would need to be altered",
1);
static SwitchOption interfaceDISRemnantOptionAllParticles
(interfaceDISRemnantOption,
"AllParticles",
"Use all particles in the colour connected system to take the recoil"
" and use the lepton if needed.",
2);
static SwitchOption interfaceDISRemnantOptionAllParticlesNoLepton
(interfaceDISRemnantOption,
"AllParticlesNoLepton",
"Use all the particles in the colour connected system to take the"
" recoil but don't use the lepton.",
3);
static Parameter<HwRemDecayer,unsigned int> interfaceMaxTrySoft
("MaxTrySoft",
"The maximum number of regeneration attempts for an additional soft scattering",
&HwRemDecayer::maxtrySoft_, 10, 0, 100,
false, false, Interface::limited);
static Parameter<HwRemDecayer,double> interfacecolourDisrupt
("colourDisrupt",
"Fraction of connections to additional soft subprocesses, which are colour disrupted.",
&HwRemDecayer::colourDisrupt_,
1.0, 0.0, 1.0,
false, false, Interface::limited);
static Parameter<HwRemDecayer,double> interaceladderPower
("ladderPower",
"The power factor in the ladder parameterization.",
&HwRemDecayer::ladderPower_,
1.0, -5.0, 10.0,
false, false, Interface::limited);
static Parameter<HwRemDecayer,double> interfaceladderNorm
("ladderNorm",
"The normalization factor in the ladder parameterization",
&HwRemDecayer::ladderNorm_,
1.0, 0.0, 10.0,
false, false, Interface::limited);
static Parameter<HwRemDecayer,double> interfaceladderMult
("ladderMult",
"The ladder multiplicity factor ",
&HwRemDecayer::ladderMult_,
1.0, 0.0, 10.0,
false, false, Interface::limited);
static Parameter<HwRemDecayer,double> interfaceladderbFactor
("ladderbFactor",
"The additive factor in the multiperipheral ladder multiplicity.",
&HwRemDecayer::ladderbFactor_,
1.0, 0.0, 10.0,
false, false, Interface::limited);
static Parameter<HwRemDecayer,double> interfacegaussWidth
("gaussWidth",
"The gaussian width of the fluctuation of longitudinal momentum fraction.",
&HwRemDecayer::gaussWidth_,
0.1, 0.0, 1.0,
false, false, Interface::limited);
static Switch<HwRemDecayer,unsigned int> interfacePomeronStructure
("PomeronStructure",
"Option for the treatment of the valance structure of the pomeron",
&HwRemDecayer::pomeronStructure_, 0, false, false);
static SwitchOption interfacePomeronStructureGluon
(interfacePomeronStructure,
"Gluon",
"Assume the pomeron is a two gluon state",
0);
static SwitchOption interfacePomeronStructureQQBar
(interfacePomeronStructure,
"QQBar",
"Assumne the pomeron is q qbar as for the photon,"
" this option is not recommended and is provide for compatiblity with POMWIG",
1);
static Switch<HwRemDecayer,bool> interfaceAllowTop
("AllowTop",
"Allow top quarks in the hadron",
&HwRemDecayer::allowTop_, false, false, false);
static SwitchOption interfaceAllowTopNo
(interfaceAllowTop,
"No",
"Don't allow them",
false);
static SwitchOption interfaceAllowTopYes
(interfaceAllowTop,
"Yes",
"Allow them",
true);
static Switch<HwRemDecayer,bool> interfaceAllowLeptons
("AllowLeptons",
"Allow charged leptons in the hadron",
&HwRemDecayer::allowLeptons_, false, false, false);
static SwitchOption interfaceAllowLeptonsNo
(interfaceAllowLeptons,
"No",
"Don't allow them",
false);
static SwitchOption interfaceAllowLeptonsYes
(interfaceAllowLeptons,
"Yes",
"Allow them",
true);
static Switch<HwRemDecayer,bool> interfaceMultiPeriph
("MultiPeriph",
"Use multiperipheral kinematics",
&HwRemDecayer::multiPeriph_, false, false, false);
static SwitchOption interfaceMultiPeriphNo
(interfaceMultiPeriph,
"No",
"Don't use multiperipheral",
false);
static SwitchOption interfaceMultiPeriphYes
(interfaceMultiPeriph,
"Yes",
"Use multiperipheral kinematics",
true);
static Switch<HwRemDecayer,unsigned int> interfacePtDistribution
("PtDistribution",
"Options for different pT generation methods",
&HwRemDecayer::PtDistribution_, 0, false, false);
static SwitchOption interfacePtDistributionDefault
(interfacePtDistribution,
"Default",
"Default generation of pT",
0);
static SwitchOption interfacePtDistributionOrdered
(interfacePtDistribution,
"Ordered",
"Ordered generation of pT,where the first pT is the hardest",
1);
static SwitchOption interfacePtDistributionStronglyOrdered
(interfacePtDistribution,
"StronglyOrdered",
"Strongly ordered generation of pT",
2);
static SwitchOption interfacePtDistributionFlat
(interfacePtDistribution,
"Flat",
"Sample from a flat pT distribution",
3);
static SwitchOption interfacePtDistributionFlatOrdered
(interfacePtDistribution,
"FlatOrdered",
"First pT normal, then flat",
4);
static SwitchOption interfacePtDistributionFlatOrdered2
(interfacePtDistribution,
"FlatOrdered2",
"First pT normal, then flat but steep",
5);
}
bool HwRemDecayer::canHandle(tcPDPtr particle, tcPDPtr parton) const {
if(! (StandardQCDPartonMatcher::Check(*parton) || parton->id()==ParticleID::gamma)) {
if(abs(parton->id())==ParticleID::t) {
if(!allowTop_)
throw Exception() << "Top is not allowed as a parton in the remnant handling, please "
<< "use a PDF which does not contain top for the remnant"
<< " handling (preferred) or allow top in the remnant using\n"
<< " set " << fullName() << ":AllowTop Yes\n"
<< Exception::runerror;
}
else if(ChargedLeptonMatcher::Check(*parton)) {
if(!allowLeptons_)
throw Exception() << "Charged leptons not allowed as a parton in the remnant handling, please "
<< "use a PDF which does not contain top for the remnant"
<< " handling or allow leptons in the remnant using\n"
<< " set " << fullName() << ":AllowLeptons Yes\n"
<< Exception::runerror;
}
else {
return false;
}
}
return HadronMatcher::Check(*particle) || particle->id()==ParticleID::gamma
|| particle->id()==ParticleID::pomeron || particle->id()==ParticleID::reggeon;
}
bool HwRemDecayer::isPartonic(tPPtr parton) const {
if(parton->parents().empty()) return false;
tPPtr parent = parton->parents()[0];
bool partonic = false;
for(unsigned int ix=0;ix<parent->children().size();++ix) {
if(dynamic_ptr_cast<tRemPPtr>(parent->children()[ix])) {
partonic = true;
break;
}
}
return partonic;
}
diff --git a/Tests/python/make_input_files.py.in b/Tests/python/make_input_files.py.in
--- a/Tests/python/make_input_files.py.in
+++ b/Tests/python/make_input_files.py.in
@@ -1,1614 +1,1625 @@
#! @PYTHON@
# -*- mode: python -*-
from __future__ import print_function
import logging,sys,os
from string import Template
from HerwigInputs import *
import sys
if sys.version_info[:3] < (2,4,0):
print ("rivet scripts require Python version >= 2.4.0... exiting")
sys.exit(1)
if __name__ == "__main__":
import logging
from optparse import OptionParser, OptionGroup
parser = OptionParser(usage="%prog name [...]")
simulation=""
numberOfAddedProcesses=0
def addProcess(thefactory,theProcess,Oas,Oew,scale,mergedlegs,NLOprocesses):
global numberOfAddedProcesses
global simulation
numberOfAddedProcesses+=1
res ="set "+thefactory+":OrderInAlphaS "+Oas+"\n"
res+="set "+thefactory+":OrderInAlphaEW "+Oew+"\n"
res+="do "+thefactory+":Process "+theProcess+" "
if ( mergedlegs != 0 ):
if simulation!="Merging":
print ("simulation is not Merging, trying to add merged legs.")
sys.exit(1)
res+="["
for j in range(mergedlegs):
res+=" j "
res+="]"
res+="\n"
if (NLOprocesses!=0):
if simulation!="Merging":
print ("simulation is not Merging, trying to add NLOProcesses.")
sys.exit(1)
res+="set MergingFactory:NLOProcesses %s \n" % NLOprocesses
if ( scale != "" ):
res+="set "+thefactory+":ScaleChoice /Herwig/MatrixElements/Matchbox/Scales/"+scale+"\n"
return res
addedBRReweighter=False
def addBRReweighter():
global addedBRReweighter
if(addedBRReweighter):
logging.error("Can only add BRReweighter once.")
sys.exit(1)
res="create Herwig::BranchingRatioReweighter /Herwig/Generators/BRReweighter\n"
res+="insert /Herwig/Generators/EventGenerator:EventHandler:PostHadronizationHandlers 0 /Herwig/Generators/BRReweighter\n"
addedBRReweighter=True
return res
selecteddecaymode=False
def selectDecayMode(particle,decaymodes):
global selecteddecaymode
res="do /Herwig/Particles/"+particle+":SelectDecayModes"
for decay in decaymodes:
res+=" /Herwig/Particles/"+particle+"/"+decay
res+="\n"
selecteddecaymode=True
return res
ME_Upsilon = """\
create Herwig::MEee2VectorMeson /Herwig/MatrixElements/MEUpsilon HwMELepton.so
set /Herwig/MatrixElements/MEUpsilon:VectorMeson /Herwig/Particles/Upsilon(4S)
set /Herwig/MatrixElements/MEUpsilon:Coupling 96.72794
""" + insert_ME("MEUpsilon")
(opts, args) = parser.parse_args()
## Check args
if len(args) != 1:
logging.error("Must specify at least input file")
sys.exit(1)
name = args[0]
print (name)
# work out name and type of the collider
(collider,have_hadronic_collider) = identifyCollider(name)
# workout the type of simulation
(simulation,templateName,parameterName,parameters)=identifySimulation(name,collider,have_hadronic_collider)
if simulation=="Merging" :
thefactory="MergingFactory"
else :
thefactory="Factory"
# settings for four flavour scheme
fourFlavour="""
read Matchbox/FourFlavourScheme.in
{bjetgroup}
set /Herwig/Cuts/MatchboxJetMatcher:Group bjet
""".format(bjetgroup=particlegroup(thefactory,'bjet','b','bbar','c', 'cbar',
's','sbar','d','dbar','u','ubar','g'))
# work out the process and parameters
process=StringBuilder()
# DIS
if(collider=="DIS" and "Photo" not in name) :
if(simulation=="") :
if "NoME" in name :
process = StringBuilder("set /Herwig/Shower/ShowerHandler:HardEmission None")
parameterName=parameterName.replace("NoME-","")
parameterName=parameterName.replace("DIS-" ,"")
if "CC" in parameterName :
process += insert_ME("MEDISCC")
else :
process += insert_ME("MEDISNC")
elif(simulation=="Powheg") :
if "CC" in parameterName :
process = StringBuilder(insert_ME("PowhegMEDISCC"))
else :
process = StringBuilder(insert_ME("PowhegMEDISNC"))
elif(simulation=="Matchbox" ) :
if "CC" in name :
if "e-" in parameterName :
process = StringBuilder(addProcess(thefactory,"e- p -> nu_e j","0","2","",0,0))
else :
process = StringBuilder(addProcess(thefactory,"e+ p -> nu_ebar j","0","2","",0,0))
else :
if "e-" in parameterName :
process = StringBuilder(addProcess(thefactory,"e- p -> e- j","0","2","",0,0))
else :
process = StringBuilder(addProcess(thefactory,"e+ p -> e+ j","0","2","",0,0))
elif(simulation=="Merging" ) :
if "CC" in name :
if "e-" in parameterName :
process = StringBuilder(addProcess(thefactory,"e- p -> e- j","0","2","",2,2))
else :
process = StringBuilder(addProcess(thefactory,"e+ p -> e+ j","0","2","",2,2))
else :
if "e-" in parameterName :
process = StringBuilder(addProcess(thefactory,"e- p -> nu_e j","0","2","",2,2))
else :
process = StringBuilder(addProcess(thefactory,"e+ p -> nu_ebar j","0","2","",2,2))
Q2Min=1.
Q2Max=1000000.
if "VeryLow" in name :
Q2Max=20.
parameterName=parameterName.replace("-VeryLowQ2","")
elif "Low" in name :
Q2Min=20.
Q2Max=100.
parameterName=parameterName.replace("-LowQ2","")
elif "Med" in name :
Q2Min=100.
Q2Max=1000.
parameterName=parameterName.replace("-MedQ2","")
elif "High" in name :
Q2Min=1000.
parameterName=parameterName.replace("-HighQ2","")
if "CC" in name :
process+="set /Herwig/Cuts/ChargedCurrentCut:MaxQ2 %s\nset /Herwig/Cuts/ChargedCurrentCut:MinQ2 %s\n" %(Q2Max,Q2Min)
else :
process+="set /Herwig/Cuts/NeutralCurrentCut:MaxQ2 %s\nset /Herwig/Cuts/NeutralCurrentCut:MinQ2 %s\n" %(Q2Max,Q2Min)
# DIS photoproduction
elif(collider=="DIS" and "Photo" in name) :
assert(simulation=="")
ecms=float(parameterName.split("-")[1])
cuts=[3.,6.,10.,ecms]
if "Direct" in parameterName :
parameterName=parameterName.replace("Direct-","")
process = StringBuilder(insert_ME("MEGammaP2Jets",None,"Process","SubProcess"))
elif "Resolved" in parameterName :
process = StringBuilder(insert_ME("MEQCD2to2"))
parameterName=parameterName.replace("Resolved-","")
for i in range(1,len(cuts)) :
tstring = "-Jets-%s"%i
if tstring in parameterName :
process+=jet_kt_cut(cuts[i-1],cuts[i])
parameterName=parameterName.replace(tstring,"")
# EE
elif(collider=="EE") :
if(simulation=="") :
if "gg" in parameterName :
process = StringBuilder("create Herwig::MEee2Higgs2SM /Herwig/MatrixElements/MEee2Higgs2SM\n")
process+=insert_ME("MEee2Higgs2SM","Gluon","Allowed")
elif "LL" in parameterName :
process = StringBuilder(insert_ME("MEee2gZ2ll"))
process += "set /Herwig/MatrixElements/MEee2gZ2ll:Allowed Charged\n"
elif "WW" in parameterName :
process = StringBuilder(insert_ME("MEee2VV"))
process += "set /Herwig/MatrixElements/MEee2VV:Process WW\n"
else :
process = StringBuilder(insert_ME("MEee2gZ2qq"))
try :
ecms = float(parameterName)
if(ecms<=3.75) :
process+= "set /Herwig/MatrixElements/MEee2gZ2qq:MaximumFlavour 3\n"
elif(ecms<=10.6) :
process+= "set /Herwig/MatrixElements/MEee2gZ2qq:MaximumFlavour 4\n"
except :
pass
elif(simulation=="Powheg") :
if "LL" in parameterName :
process = StringBuilder(insert_ME("PowhegMEee2gZ2ll"))
process += "set /Herwig/MatrixElements/PowhegMEee2gZ2ll:Allowed Charged\n"
else :
process = StringBuilder(insert_ME("PowhegMEee2gZ2qq"))
try :
ecms = float(parameterName)
if(ecms<=3.75) :
process+= "set /Herwig/MatrixElements/PowhegMEee2gZ2qq:MaximumFlavour 3\n"
elif(ecms<=10.6) :
process+= "set /Herwig/MatrixElements/PowhegMEee2gZ2qq:MaximumFlavour 4\n"
except :
pass
elif(simulation=="Matchbox" ) :
try :
ecms = float(parameterName)
if(ecms<=3.75) :
process = StringBuilder(addProcess(thefactory,"e- e+ -> u ubar","0","2","",0,0))
process+=addProcess(thefactory,"e- e+ -> d dbar","0","2","",0,0)
process+=addProcess(thefactory,"e- e+ -> s sbar","0","2","",0,0)
elif(ecms<=10.6) :
process = StringBuilder(addProcess(thefactory,"e- e+ -> u ubar","0","2","",0,0))
process+=addProcess(thefactory,"e- e+ -> d dbar","0","2","",0,0)
process+=addProcess(thefactory,"e- e+ -> c cbar","0","2","",0,0)
process+=addProcess(thefactory,"e- e+ -> s sbar","0","2","",0,0)
else :
process = StringBuilder(addProcess(thefactory,"e- e+ -> j j","0","2","",0,0))
except:
process = StringBuilder(addProcess(thefactory,"e- e+ -> j j","0","2","",0,0))
elif(simulation=="Merging" ) :
try :
ecms = float(parameterName)
if(ecms<=10.1) :
process = StringBuilder(addProcess(thefactory,"e- e+ -> j j","0","2","",2,2))
process+="read Matchbox/FourFlavourScheme.in"
else :
process = StringBuilder(addProcess(thefactory,"e- e+ -> j j","0","2","",2,2))
except:
process = StringBuilder(addProcess(thefactory,"e- e+ -> j j","0","2","",2,2))
# EE-Gamma
elif(collider=="EE-Gamma") :
if(simulation=="") :
if("mumu" in parameterName) :
process = StringBuilder(insert_ME("MEgg2ff","Muon"))
process +="set /Herwig/Cuts/Cuts:MHatMin 3.\n"
parameterName=parameterName.replace("Direct-","")
elif( "tautau" in parameterName) :
process = StringBuilder(insert_ME("MEgg2ff","Tau"))
process +="set /Herwig/Cuts/Cuts:MHatMin 3.\n"
parameterName=parameterName.replace("Direct-","")
elif( "Jets" in parameterName) :
if("Direct" in parameterName ) :
process = StringBuilder(insert_ME("MEgg2ff","Quarks"))
parameterName=parameterName.replace("Direct-","")
elif("Single-Resolved" in parameterName ) :
process = StringBuilder(insert_ME("MEGammaP2Jets",None,"Process","SubProcess"))
process+= insert_ME("MEGammaP2Jets",None,"Process","SubProcess2")
parameterName=parameterName.replace("Single-Resolved-","")
else :
process = StringBuilder(insert_ME("MEQCD2to2"))
parameterName=parameterName.replace("Double-Resolved-","")
process+="insert /Herwig/Cuts/Cuts:OneCuts[0] /Herwig/Cuts/JetKtCut"
process+="set /Herwig/Cuts/JetKtCut:MinKT 3."
else :
print ("process not supported for Gamma Gamma processes at EE")
quit()
else :
print ("Only internal matrix elements currently supported for Gamma Gamma processes at EE")
quit()
elif(collider=="GammaGamma") :
if(simulation=="") :
if("mumu" in parameterName) :
process = StringBuilder(insert_ME("MEgg2ff"))
process +="set /Herwig/MatrixElements/MEgg2ff:Process Muon\n"
process +="set /Herwig/Cuts/Cuts:MHatMin 3.\n"
else :
print ("process not supported for Gamma Gamma processes at EE")
quit()
else :
print ("Only internal matrix elements currently supported for Gamma Gamma processes at EE")
quit()
# TVT
elif(collider=="TVT") :
process = StringBuilder("set /Herwig/Generators/EventGenerator:EventHandler:BeamB /Herwig/Particles/pbar-\n")
ecms=1960.
if "Run-II" in parameterName : ecms = 1960.0
elif "Run-I" in parameterName : ecms = 1800.0
elif "900" in parameterName : ecms = 900.0
elif "630" in parameterName : ecms = 630.0
elif "300" in parameterName : ecms = 300.0
process+=collider_lumi(ecms)
if(simulation=="") :
if "PromptPhoton" in parameterName :
process+=insert_ME("MEGammaJet")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 15.\n"
elif "DiPhoton-GammaGamma" in parameterName :
process+=insert_ME("MEGammaGamma")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
parameterName=parameterName.replace("-GammaGamma","")
elif "DiPhoton-GammaJet" in parameterName :
process+=insert_ME("MEGammaJet")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
parameterName=parameterName.replace("-GammaJet","")
elif "UE" in parameterName :
if "Dipole" in parameters["shower"]:
process+="read snippets/MB-DipoleShower.in\n"
else:
process+="read snippets/MB.in\n"
process+="read snippets/Diffraction.in\n"
process += "set /Herwig/Decays/DecayHandler:LifeTimeOption 0\n"
process += "set /Herwig/Decays/DecayHandler:MaxLifeTime 10*mm\n"
elif "Jets" in parameterName :
process+=insert_ME("MEQCD2to2")
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "DiJets" in name :
process +=jet_kt_cut( 30.)
cuts=[100.,300.,600.,900.,ecms]
for i in range(1,len(cuts)) :
tstring = "-DiJets-%s"%i
if tstring in parameterName :
process+=mhat_cut(cuts[i-1],cuts[i])
parameterName=parameterName.replace(tstring,"-DiJets")
else :
if "Run" in parameterName :
cuts=[5.,20.,40.,80.,160.,320.]
elif "300" in parameterName :
cuts=[5.,]
elif "630" in parameterName :
cuts=[5.,20.,40.]
elif "900" in parameterName :
cuts=[5.,]
cuts.append(ecms)
for i in range(1,len(cuts)) :
tstring = "-Jets-%s"%i
if tstring in parameterName :
process+=jet_kt_cut(cuts[i-1],cuts[i])
parameterName=parameterName.replace(tstring,"-Jets")
elif "Run-I-WZ" in parameterName :
process+=insert_ME("MEqq2W2ff","Electron")
process+=insert_ME("MEqq2gZ2ff","Electron")
elif "Run-II-W" in parameterName or "Run-I-W" in parameterName :
process+=insert_ME("MEqq2W2ff","Electron")
elif "Run-II-Z-e" in parameterName or "Run-I-Z" in parameterName :
process +=insert_ME("MEqq2gZ2ff","Electron")
elif "Run-II-Z-LowMass-mu" in parameterName :
process +=insert_ME("MEqq2gZ2ff","Muon")
process+=addLeptonPairCut("25","70")
elif "Run-II-Z-HighMass-mu" in parameterName :
process +=insert_ME("MEqq2gZ2ff","Muon")
process+=addLeptonPairCut("150","600")
elif "Run-II-Z-mu" in parameterName :
process +=insert_ME("MEqq2gZ2ff","Muon")
elif(simulation=="Powheg") :
if "Run-I-WZ" in parameterName :
process+=insert_ME("PowhegMEqq2W2ff","Electron")
process+=insert_ME("PowhegMEqq2gZ2ff","Electron")
elif "Run-II-W" in parameterName or "Run-I-W" in parameterName :
process+=insert_ME("PowhegMEqq2W2ff","Electron")
elif "Run-II-Z-e" in parameterName or "Run-I-Z" in parameterName :
process+=insert_ME("PowhegMEqq2gZ2ff","Electron")
elif "Run-II-Z-LowMass-mu" in parameterName :
process+=insert_ME("PowhegMEqq2gZ2ff","Muon")
process+=addLeptonPairCut("25","70")
elif "Run-II-Z-HighMass-mu" in parameterName :
process+=insert_ME("PowhegMEqq2gZ2ff","Muon")
process+=addLeptonPairCut("150","600")
elif "Run-II-Z-mu" in parameterName :
process+=insert_ME("PowhegMEqq2gZ2ff","Muon")
elif "DiPhoton-GammaGamma" in parameterName :
process+=insert_ME("MEGammaGammaPowheg","GammaGamma")
process+=insert_ME("MEGammaGamma","gg")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
process+=jet_kt_cut(5.)
parameterName=parameterName.replace("-GammaGamma","")
elif "DiPhoton-GammaJet" in parameterName :
process+=insert_ME("MEGammaGammaPowheg","VJet")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
process+=jet_kt_cut(5.)
parameterName=parameterName.replace("-GammaJet","")
elif(simulation=="Matchbox" or simulation=="Merging" ) :
if "Jets" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p -> j j","2","0","MaxJetPtScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p -> j j","2","0","MaxJetPtScale",1,0)
if "DiJets" in parameterName :
process+=addFirstJet("30")+addSecondJet("25")
cuts=[100.,300.,600.,900.,ecms]
for i in range(1,len(cuts)) :
tstring = "-DiJets-%s"%i
if tstring in parameterName :
process+=addJetPairCut(cuts[i-1],cuts[i])
parameterName=parameterName.replace(tstring,"-DiJets")
else :
if "Run" in parameterName :
cuts=[5.,20.,40.,80.,160.,320.]
elif "300" in parameterName :
cuts=[5.,]
elif "630" in parameterName :
cuts=[5.,20.,40.]
elif "900" in parameterName :
cuts=[5.,]
cuts.append(ecms)
for i in range(1,len(cuts)) :
tstring = "-Jets-%s"%i
if tstring in parameterName :
process+=addFirstJet(cuts[i-1],cuts[i])
parameterName=parameterName.replace(tstring,"-Jets")
elif "Run-I-WZ" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p pbar e+ e-","0","2","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p pbar e+ nu","0","2","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p pbar e- nu","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=particlegroup(thefactory,'epm','e+','e-')
process+=particlegroup(thefactory,'epmnu','e+','e-','nu_e','nu_ebar')
process+=addProcess(thefactory,"p pbar epm epmnu","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("60","120")
elif "Run-II-W" in parameterName or "Run-I-W" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p pbar e+ nu","0","2","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p pbar e- nu","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=particlegroup(thefactory,'epm','e+','e-')
process+=addProcess(thefactory,"p pbar epm nu","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("60","120")
elif "Run-II-Z-e" in parameterName or "Run-I-Z" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p pbar e+ e-","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p pbar e+ e-","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("60","120")
elif "Run-II-Z-LowMass-mu" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p pbar mu+ mu-","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p pbar mu+ mu-","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("25","70")
elif "Run-II-Z-HighMass-mu" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p pbar mu+ mu-","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p pbar mu+ mu-","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("150","600")
elif "Run-II-Z-mu" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p pbar mu+ mu-","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p pbar mu+ mu-","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("60","120")
# Star
elif(collider=="Star" ) :
process = StringBuilder("set /Herwig/Decays/DecayHandler:LifeTimeOption 0\n")
process+= "set /Herwig/Decays/DecayHandler:MaxLifeTime 10*mm\n"
process+= "set /Herwig/Generators/EventGenerator:EventHandler:BeamB /Herwig/Particles/p+\n"
process+= collider_lumi(200.0)
process+= "set /Herwig/Cuts/Cuts:X2Min 0.01\n"
if(simulation=="") :
if "UE" in parameterName :
if "Dipole" in parameters["shower"]:
process+="read snippets/MB-DipoleShower.in\n"
else:
process+="read snippets/MB.in\n"
process+="read snippets/Diffraction.in\n"
else :
process+=insert_ME("MEQCD2to2")
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "Jets-1" in parameterName : process+=jet_kt_cut(2.)
elif "Jets-2" in parameterName : process+=jet_kt_cut(5.)
elif "Jets-3" in parameterName : process+=jet_kt_cut(20.)
elif "Jets-4" in parameterName : process+=jet_kt_cut(25.)
else :
logging.error("Star not supported for %s " % simulation)
sys.exit(1)
# ISR and SppS
elif ( collider=="ISR" or collider =="SppS" or collider == "SPS" or collider == "Fermilab" ) :
process = StringBuilder("set /Herwig/Decays/DecayHandler:LifeTimeOption 0\n")
process+="set /Herwig/Decays/DecayHandler:MaxLifeTime 10*mm\n"
if(collider=="SppS") :
process = StringBuilder("set /Herwig/Generators/EventGenerator:EventHandler:BeamB /Herwig/Particles/pbar-\n")
if "17.4" in parameterName : process+=collider_lumi( 17.4)
elif "27.4" in parameterName : process+=collider_lumi( 27.4)
elif "30" in parameterName : process+=collider_lumi( 30.4)
elif "38.8" in parameterName : process+=collider_lumi( 38.8)
elif "44" in parameterName : process+=collider_lumi( 44.4)
elif "53" in parameterName : process+=collider_lumi( 53.0)
elif "62" in parameterName : process+=collider_lumi( 62.2)
elif "63" in parameterName : process+=collider_lumi( 63.0)
elif "200" in parameterName : process+=collider_lumi(200.0)
elif "500" in parameterName : process+=collider_lumi(500.0)
elif "546" in parameterName : process+=collider_lumi(546.0)
elif "900" in parameterName : process+=collider_lumi(900.0)
if "UE" in parameterName :
if(simulation=="") :
if "Dipole" in parameters["shower"]:
process+="read snippets/MB-DipoleShower.in\n"
else:
process+="read snippets/MB.in\n"
+ if "EHS" not in name :
process+="read snippets/Diffraction.in\n"
else :
logging.error(" SppS and ISR not supported for %s " % simulation)
sys.exit(1)
elif "Z-mu" in parameterName :
if simulation == "" :
process+=insert_ME("MEqq2gZ2ff","Muon")
process+=mhat_minm_maxm(2,2,20)
elif simulation == "Powheg" :
process+=insert_ME("PowhegMEqq2gZ2ff","Muon")
process+=mhat_minm_maxm(2,2,20)
elif(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p mu+ mu-","0","2","LeptonPairMassScale",0,0)
process+=addLeptonPairCut("2","20")
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p mu+ mu-","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("2","20")
else :
logging.error(" SppS and ISR not supported for %s " % simulation)
sys.exit(1)
else :
logging.error(" Process not supported for SppS and ISR %s " % parameterName )
sys.exit(1)
# LHC
elif(collider=="LHC") :
ecms=7000.0
if parameterName.startswith("7-") : ecms = 7000.0
elif parameterName.startswith("8-") : ecms = 8000.0
elif parameterName.startswith("13-") : ecms = 13000.0
elif parameterName.startswith("900") : ecms = 900.0
elif parameterName.startswith("2360") : ecms = 2360.0
elif parameterName.startswith("2760") : ecms = 2760.0
elif parameterName.startswith("5-") : ecms = 5020.0
else : ecms = 7000.0
process = StringBuilder(collider_lumi(ecms))
if(simulation=="") :
if "VBF" in parameterName :
process+=insert_ME("MEPP2HiggsVBF")
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "8-" not in parameterName :
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
addedBRReweighter = True
process+="set /Herwig/Particles/tau-:Stable Stable\n"
elif "ggHJet" in parameterName :
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
addedBRReweighter = True
process+="set /Herwig/Particles/tau-:Stable Stable\n"
process+=insert_ME("MEHiggsJet")
process+=jet_kt_cut(20.)
elif "ggH" in parameterName :
process+=insert_ME("MEHiggs")
process+=insert_ME("MEHiggsJet","qqbar")
process+=jet_kt_cut(0.0)
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "8-" not in parameterName :
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
addedBRReweighter = True
process+="set /Herwig/Particles/tau-:Stable Stable\n"
elif "PromptPhoton" in parameterName :
process+=insert_ME("MEGammaJet")
if "PromptPhoton-1" in parameterName :
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
process+="set /Herwig/Cuts/PhotonKtCut:MaxKT 25.\n"
parameterName=parameterName.replace("-1","")
elif "PromptPhoton-2" in parameterName :
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 25.\n"
process+="set /Herwig/Cuts/PhotonKtCut:MaxKT 80.\n"
parameterName=parameterName.replace("-2","")
elif "PromptPhoton-3" in parameterName :
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 80.\n"
process+="set /Herwig/Cuts/PhotonKtCut:MaxKT 150.\n"
parameterName=parameterName.replace("-3","")
elif "PromptPhoton-4" in parameterName :
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 150.\n"
process+="set /Herwig/Cuts/PhotonKtCut:MaxKT 500.\n"
parameterName=parameterName.replace("-4","")
elif "PromptPhoton-5" in parameterName :
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 500.\n"
parameterName=parameterName.replace("-5","")
elif "DiPhoton-GammaGamma" in parameterName :
process+=insert_ME("MEGammaGamma")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
parameterName=parameterName.replace("-GammaGamma","")
elif "DiPhoton-GammaJet" in parameterName :
process+=insert_ME("MEGammaJet")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
parameterName=parameterName.replace("-GammaJet","")
elif "8-WH" in parameterName :
process+=insert_ME("MEPP2WH")
process+=jet_kt_cut(0.0)
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "8-ZH" in parameterName :
process+=insert_ME("MEPP2ZH")
process+=jet_kt_cut(0.0)
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "WH" in parameterName :
process+=selectDecayMode("h0",["h0->b,bbar;"])
process+=selectDecayMode("W+",["W+->nu_e,e+;",
"W+->nu_mu,mu+;"])
addedBRReweighter = True
process+=insert_ME("MEPP2WH")
process+=jet_kt_cut(0.0)
elif "ZH" in parameterName :
process+=selectDecayMode("h0",["h0->b,bbar;"])
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;"])
addedBRReweighter = True
process+=insert_ME("MEPP2ZH")
process+=jet_kt_cut(0.0)
elif "UE" in parameterName or "Cent" in parameterName :
if "Dipole" in parameters["shower"]:
process+="read snippets/MB-DipoleShower.in\n"
else:
process+="set /Herwig/Shower/ShowerHandler:IntrinsicPtGaussian 2.2*GeV\n"
process+="read snippets/MB.in\n"
process+="read snippets/Diffraction.in\n"
if "Long" in parameterName :
process += "set /Herwig/Decays/DecayHandler:MaxLifeTime 100*mm\n"
elif "8-DiJets" in parameterName or "7-DiJets" in parameterName or "13-DiJets" in parameterName :
process+=insert_ME("MEQCD2to2")
process+="set MEQCD2to2:MaximumFlavour 5\n"
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "13-DiJets" not in parameterName :
if "-A" in parameterName :
process+=jet_kt_cut(45.)
process+="set /Herwig/Cuts/JetKtCut:MinEta -3.\n"
process+="set /Herwig/Cuts/JetKtCut:MaxEta 3.\n"
elif "-B" in parameterName :
process+=jet_kt_cut(20.)
process+="set /Herwig/Cuts/JetKtCut:MinEta -2.7\n"
process+="set /Herwig/Cuts/JetKtCut:MaxEta 2.7\n"
elif "-C" in parameterName :
process+=jet_kt_cut(20.)
process+="set /Herwig/Cuts/JetKtCut:MinEta -4.8\n"
process+="set /Herwig/Cuts/JetKtCut:MaxEta 4.8\n"
else :
if "-A" in parameterName :
process+=jet_kt_cut(60.)
process+="set /Herwig/Cuts/JetKtCut:MinEta -3.\n"
process+="set /Herwig/Cuts/JetKtCut:MaxEta 3.\n"
elif "-B" in parameterName :
process+=jet_kt_cut(180.)
process+="set /Herwig/Cuts/JetKtCut:MinEta -3.\n"
process+="set /Herwig/Cuts/JetKtCut:MaxEta 3.\n"
if "DiJets-1" in parameterName : process+=mhat_cut(90.)
elif "DiJets-2" in parameterName : process+=mhat_cut(200.)
elif "DiJets-3" in parameterName : process+=mhat_cut(450.)
elif "DiJets-4" in parameterName : process+=mhat_cut(750.)
elif "DiJets-5" in parameterName : process+=mhat_cut(950.)
elif "DiJets-6" in parameterName : process+=mhat_cut(1550.)
elif "DiJets-7" in parameterName : process+=mhat_cut(2150.)
elif "DiJets-8" in parameterName : process+=mhat_cut(2750.)
elif "DiJets-9" in parameterName : process+=mhat_cut(3750.)
elif "DiJets-10" in parameterName : process+=mhat_cut(4750.)
elif "DiJets-11" in parameterName : process+=mhat_cut(5750.)
elif( "7-Jets" in parameterName
or "8-Jets" in parameterName
or "13-Jets" in parameterName
or "2760-Jets" in parameterName
) :
process+=insert_ME("MEQCD2to2")
process+="set MEQCD2to2:MaximumFlavour 5\n"
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "Jets-10" in parameterName : process+=jet_kt_cut(1800.)
elif "Jets-0" in parameterName : process+=jet_kt_cut(5.)
elif "Jets-1" in parameterName : process+=jet_kt_cut(10.)
elif "Jets-2" in parameterName : process+=jet_kt_cut(20.)
elif "Jets-3" in parameterName : process+=jet_kt_cut(40.)
elif "Jets-4" in parameterName : process+=jet_kt_cut(70.)
elif "Jets-5" in parameterName : process+=jet_kt_cut(150.)
elif "Jets-6" in parameterName : process+=jet_kt_cut(200.)
elif "Jets-7" in parameterName : process+=jet_kt_cut(300.)
elif "Jets-8" in parameterName : process+=jet_kt_cut(500.)
elif "Jets-9" in parameterName : process+=jet_kt_cut(800.)
elif( "-Charm" in parameterName or "-Bottom" in parameterName ) :
if("8-Bottom" in parameterName) :
addBRReweighter()
process+=selectDecayMode("Jpsi",["Jpsi->mu-,mu+;"])
if "Bottom" in parameterName :
process+="cp MEHeavyQuark MEBottom\n"
process+="set MEBottom:QuarkType Bottom\n"
process+=insert_ME("MEBottom")
else :
process+="cp MEHeavyQuark MECharm\n"
process+="set MECharm:QuarkType Charm\n"
process+=insert_ME("MECharm")
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "-0" in parameterName :
if "Bottom" in parameterName :
process+="set MEBottom:Process Pair\n"
process+=jet_kt_cut(0.)
else :
process+=jet_kt_cut(1.)
elif "-1" in parameterName : process+=jet_kt_cut(5.)
elif "-2" in parameterName : process+=jet_kt_cut(15.)
elif "-3" in parameterName : process+=jet_kt_cut(20.)
elif "-4" in parameterName : process+=jet_kt_cut(50.)
elif "-5" in parameterName : process+=jet_kt_cut(80.)
elif "-6" in parameterName : process+=jet_kt_cut(110.)
elif "-7" in parameterName : process+=jet_kt_cut(30.)+mhat_cut(90.)
elif "-8" in parameterName : process+=jet_kt_cut(30.)+mhat_cut(340.)
elif "-9" in parameterName : process+=jet_kt_cut(30.)+mhat_cut(500.)
elif "Top-L" in parameterName :
process+="set MEHeavyQuark:QuarkType Top\n"
process+=insert_ME("MEHeavyQuark")
process+=selectDecayMode("t",["t->nu_e,e+,b;",
"t->nu_mu,mu+,b;"])
process+=addBRReweighter()
elif "Top-SL" in parameterName :
process+="set MEHeavyQuark:QuarkType Top\n"
process+=insert_ME("MEHeavyQuark")
process+="set /Herwig/Particles/t:Synchronized Not_synchronized\n"
process+="set /Herwig/Particles/tbar:Synchronized Not_synchronized\n"
process+=selectDecayMode("t",["t->nu_e,e+,b;","t->nu_mu,mu+,b;"])
process+=selectDecayMode("tbar",["tbar->b,bbar,cbar;",
"tbar->bbar,cbar,d;",
"tbar->bbar,cbar,s;",
"tbar->bbar,s,ubar;",
"tbar->bbar,ubar,d;"])
process+=addBRReweighter()
elif "Top-All" in parameterName :
process+="set MEHeavyQuark:QuarkType Top\n"
process+=insert_ME("MEHeavyQuark")
elif "WZ" in parameterName :
process+=insert_ME("MEPP2VV","WZ")
process+=selectDecayMode("W+",["W+->nu_e,e+;",
"W+->nu_mu,mu+;"])
process+=selectDecayMode("W-",["W-->nu_ebar,e-;",
"W-->nu_mubar,mu-;"])
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;"])
addedBRReweighter = True
elif "WW-emu" in parameterName :
process+=insert_ME("MEPP2VV","WW")
process+="set /Herwig/Particles/W+:Synchronized 0\n"
process+="set /Herwig/Particles/W-:Synchronized 0\n"
process+=selectDecayMode("W+",["W+->nu_e,e+;"])
process+=selectDecayMode("W-",["W-->nu_mubar,mu-;"])
addedBRReweighter = True
elif "WW-ll" in parameterName :
process+=insert_ME("MEPP2VV","WW")
process+=selectDecayMode("W+",["W+->nu_e,e+;","W+->nu_mu,mu+;","W+->nu_tau,tau+;"])
addedBRReweighter = True
elif "ZZ-ll" in parameterName :
process+=insert_ME("MEPP2VV","ZZ")
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;",
"Z0->tau-,tau+;"])
addedBRReweighter = True
elif "ZZ-lv" in parameterName :
process+=insert_ME("MEPP2VV","ZZ")
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;",
"Z0->tau-,tau+;",
"Z0->nu_e,nu_ebar;",
"Z0->nu_mu,nu_mubar;",
"Z0->nu_tau,nu_taubar;"])
addedBRReweighter = True
elif "W-e" in parameterName :
process+=insert_ME("MEqq2W2ff","Electron")
elif "W-mu" in parameterName :
process+=insert_ME("MEqq2W2ff","Muon")
elif "Z-e" in parameterName or "Z-mu" in parameterName :
if "Z-e" in parameterName:
process+=insert_ME("MEqq2gZ2ff","Electron")
else :
process+=insert_ME("MEqq2gZ2ff","Muon")
mcuts=[10,35,75,110,400,ecms]
for i in range(1,6) :
tstring = "-Mass%s"%i
if tstring in parameterName :
process+=mhat_minm_maxm(mcuts[i-1],mcuts[i-1],mcuts[i])
parameterName=parameterName.replace(tstring,"")
elif "Z-nu" in parameterName :
process+=insert_ME("MEqq2gZ2ff","Neutrinos")
elif "W-Jet" in parameterName :
process+=insert_ME("MEWJet","Electron","WDecay")
if "W-Jet-1-e" in parameterName :
process+="set /Herwig/Cuts/WBosonKtCut:MinKT 100.0*GeV\n"
parameterName=parameterName.replace("W-Jet-1-e","W-Jet-e")
elif "W-Jet-2-e" in parameterName :
process+="set /Herwig/Cuts/WBosonKtCut:MinKT 190.0*GeV\n"
parameterName=parameterName.replace("W-Jet-2-e","W-Jet-e")
elif "W-Jet-3-e" in parameterName :
process+="set /Herwig/Cuts/WBosonKtCut:MinKT 270.0*GeV\n"
parameterName=parameterName.replace("W-Jet-3-e","W-Jet-e")
elif "Z-Jet" in parameterName :
if "-e" in parameterName :
process+=insert_ME("MEZJet","Electron","ZDecay")
if "Z-Jet-0-e" in parameterName :
process+="set /Herwig/Cuts/ZBosonKtCut:MinKT 35.0*GeV\n"
parameterName=parameterName.replace("Z-Jet-0-e","Z-Jet-e")
elif "Z-Jet-1-e" in parameterName :
process+="set /Herwig/Cuts/ZBosonKtCut:MinKT 100.0*GeV\n"
parameterName=parameterName.replace("Z-Jet-1-e","Z-Jet-e")
elif "Z-Jet-2-e" in parameterName :
process+="set /Herwig/Cuts/ZBosonKtCut:MinKT 190.0*GeV\n"
parameterName=parameterName.replace("Z-Jet-2-e","Z-Jet-e")
elif "Z-Jet-3-e" in parameterName :
process+="set /Herwig/Cuts/ZBosonKtCut:MinKT 270.0*GeV\n"
parameterName=parameterName.replace("Z-Jet-3-e","Z-Jet-e")
else :
process+=insert_ME("MEZJet","Muon","ZDecay")
process+="set /Herwig/Cuts/ZBosonKtCut:MinKT 35.0*GeV\n"
parameterName=parameterName.replace("Z-Jet-0-mu","Z-Jet-mu")
elif "WGamma" in parameterName :
process+=insert_ME("MEPP2VGamma","1")
process+="set MEPP2VGamma:MassOption 1"
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 10.\n"
if "-e" in parameterName :
process+=selectDecayMode("W+",["W+->nu_e,e+;"])
addedBRReweighter=True
else :
process+=selectDecayMode("W+",["W+->nu_mu,mu+;"])
addedBRReweighter=True
elif "ZGamma" in parameterName :
process+=insert_ME("MEPP2VGamma","2")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 10.\n"
if "-e" in parameterName :
process+=selectDecayMode("Z0",["Z0->e-,e+;"])
addedBRReweighter=True
elif "-mu" in parameterName :
process+=selectDecayMode("Z0",["Z0->mu-,mu+;"])
addedBRReweighter=True
elif "-nu" in parameterName :
process+=selectDecayMode("Z0",["Z0->nu_e,nu_ebar;","Z0->nu_mu,nu_mubar;","Z0->nu_tau,nu_taubar;"])
addedBRReweighter=True
else :
logging.error(" Process %s not supported for internal matrix elements" % name)
sys.exit(1)
elif(simulation=="Powheg") :
if "VBF" in parameterName :
process+=insert_ME("PowhegMEPP2HiggsVBF")
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "8-" not in parameterName :
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
addedBRReweighter = True
process+="set /Herwig/Particles/tau-:Stable Stable\n"
elif "ggHJet" in parameterName :
logging.error(" Process %s not supported for POWHEG matrix elements" % name)
sys.exit(1)
elif "ggH" in parameterName :
process+=insert_ME("PowhegMEHiggs")
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "8-" not in parameterName :
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
addedBRReweighter = True
process+="set /Herwig/Particles/tau-:Stable Stable\n"
elif "8-WH" in parameterName :
process+=insert_ME("PowhegMEPP2WH")
process+=jet_kt_cut(0.0)
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "8-ZH" in parameterName :
process+=insert_ME("PowhegMEPP2ZH")
process+=jet_kt_cut(0.0)
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
addedBRReweighter = True
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
addedBRReweighter = True
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
addedBRReweighter = True
elif "WH" in parameterName :
process+=selectDecayMode("h0",["h0->b,bbar;"])
process+=selectDecayMode("W+",["W+->nu_e,e+;",
"W+->nu_mu,mu+;"])
addedBRReweighter = True
process+=insert_ME("PowhegMEPP2WH")
process+=jet_kt_cut(0.0)
elif "ZH" in parameterName :
process+=selectDecayMode("h0",["h0->b,bbar;"])
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;"])
addedBRReweighter = True
process+=insert_ME("PowhegMEPP2ZH")
process+=jet_kt_cut(0.0)
elif "UE" in parameterName :
logging.error(" Process %s not supported for powheg matrix elements" % name)
sys.exit(1)
elif "WZ" in parameterName :
process+="create Herwig::HwDecayHandler /Herwig/NewPhysics/DecayHandler\n"
process+="set /Herwig/NewPhysics/DecayHandler:NewStep No\n"
process+="set /Herwig/Shower/ShowerHandler:SplitHardProcess No\n";
process+="set /Herwig/Decays/ZDecayer:PhotonGenerator NULL\n";
process+="set /Herwig/Decays/WDecayer:PhotonGenerator NULL\n";
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 0 /Herwig/Particles/tau-\n"
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 1 /Herwig/Particles/tau+\n"
process+="insert /Herwig/Generators/EventGenerator:EventHandler:PreCascadeHandlers 0 /Herwig/NewPhysics/DecayHandler\n"
process+=insert_ME("PowhegMEPP2VV","WZ")
process+=selectDecayMode("W+",["W+->nu_e,e+;",
"W+->nu_mu,mu+;"])
process+=selectDecayMode("W-",["W-->nu_ebar,e-;",
"W-->nu_mubar,mu-;"])
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;"])
addedBRReweighter = True
elif "WW-emu" in parameterName :
process+="create Herwig::HwDecayHandler /Herwig/NewPhysics/DecayHandler\n"
process+="set /Herwig/NewPhysics/DecayHandler:NewStep No\n"
process+="set /Herwig/Shower/ShowerHandler:SplitHardProcess No\n";
process+="set /Herwig/Decays/ZDecayer:PhotonGenerator NULL\n";
process+="set /Herwig/Decays/WDecayer:PhotonGenerator NULL\n";
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 0 /Herwig/Particles/tau-\n"
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 1 /Herwig/Particles/tau+\n"
process+="insert /Herwig/Generators/EventGenerator:EventHandler:PreCascadeHandlers 0 /Herwig/NewPhysics/DecayHandler\n"
process+=insert_ME("PowhegMEPP2VV","WW")
process+="set /Herwig/Particles/W+:Synchronized 0\n"
process+="set /Herwig/Particles/W-:Synchronized 0\n"
process+=selectDecayMode("W+",["W+->nu_e,e+;"])
process+=selectDecayMode("W-",["W-->nu_mubar,mu-;"])
addedBRReweighter = True
elif "WW-ll" in parameterName :
process+="create Herwig::HwDecayHandler /Herwig/NewPhysics/DecayHandler\n"
process+="set /Herwig/NewPhysics/DecayHandler:NewStep No\n"
process+="set /Herwig/Shower/ShowerHandler:SplitHardProcess No\n";
process+="set /Herwig/Decays/ZDecayer:PhotonGenerator NULL\n";
process+="set /Herwig/Decays/WDecayer:PhotonGenerator NULL\n";
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 0 /Herwig/Particles/tau-\n"
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 1 /Herwig/Particles/tau+\n"
process+="insert /Herwig/Generators/EventGenerator:EventHandler:PreCascadeHandlers 0 /Herwig/NewPhysics/DecayHandler\n"
process+=insert_ME("PowhegMEPP2VV","WW")
process+=selectDecayMode("W+",["W+->nu_e,e+;",
"W+->nu_mu,mu+;",
"W+->nu_tau,tau+;"])
addedBRReweighter = True
elif "ZZ-ll" in parameterName :
process+="create Herwig::HwDecayHandler /Herwig/NewPhysics/DecayHandler\n"
process+="set /Herwig/NewPhysics/DecayHandler:NewStep No\n"
process+="set /Herwig/Shower/ShowerHandler:SplitHardProcess No\n";
process+="set /Herwig/Decays/ZDecayer:PhotonGenerator NULL\n";
process+="set /Herwig/Decays/WDecayer:PhotonGenerator NULL\n";
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 0 /Herwig/Particles/tau-\n"
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 1 /Herwig/Particles/tau+\n"
process+="insert /Herwig/Generators/EventGenerator:EventHandler:PreCascadeHandlers 0 /Herwig/NewPhysics/DecayHandler\n"
process+=insert_ME("PowhegMEPP2VV","ZZ")
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;",
"Z0->tau-,tau+;"])
addedBRReweighter = True
elif "ZZ-lv" in parameterName :
process+="create Herwig::HwDecayHandler /Herwig/NewPhysics/DecayHandler\n"
process+="set /Herwig/NewPhysics/DecayHandler:NewStep No\n"
process+="set /Herwig/Shower/ShowerHandler:SplitHardProcess No\n";
process+="set /Herwig/Decays/ZDecayer:PhotonGenerator NULL\n";
process+="set /Herwig/Decays/WDecayer:PhotonGenerator NULL\n";
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 0 /Herwig/Particles/tau-\n"
process+="insert /Herwig/NewPhysics/DecayHandler:Excluded 1 /Herwig/Particles/tau+\n"
process+="insert /Herwig/Generators/EventGenerator:EventHandler:PreCascadeHandlers 0 /Herwig/NewPhysics/DecayHandler\n"
process+=insert_ME("PowhegMEPP2VV","ZZ")
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;",
"Z0->tau-,tau+;",
"Z0->nu_e,nu_ebar;",
"Z0->nu_mu,nu_mubar;",
"Z0->nu_tau,nu_taubar;"])
addedBRReweighter = True
elif "W-e" in parameterName :
process+=insert_ME("PowhegMEqq2W2ff","Electron")
elif "W-mu" in parameterName :
process+=insert_ME("PowhegMEqq2W2ff","Muon")
elif "Z-e" in parameterName or "Z-mu" in parameterName :
if "Z-e" in parameterName:
process+=insert_ME("PowhegMEqq2gZ2ff","Electron")
else :
process+=insert_ME("PowhegMEqq2gZ2ff","Muon")
mcuts=[10,35,75,110,400,ecms]
for i in range(1,6) :
tstring = "-Mass%s"%i
if tstring in parameterName :
process+=mhat_minm_maxm(mcuts[i-1],mcuts[i-1],mcuts[i])
parameterName=parameterName.replace(tstring,"")
elif "Z-nu" in parameterName :
process+=insert_ME("PowhegMEqq2gZ2ff","Neutrinos")
elif "DiPhoton-GammaGamma" in parameterName :
process+=insert_ME("MEGammaGammaPowheg","GammaGamma")
process+=insert_ME("MEGammaGamma","gg")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
process+=jet_kt_cut(5.)
parameterName=parameterName.replace("-GammaGamma","")
elif "DiPhoton-GammaJet" in parameterName :
process+=insert_ME("MEGammaGammaPowheg","VJet")
process+="set /Herwig/Cuts/PhotonKtCut:MinKT 5.\n"
process+=jet_kt_cut(5.)
parameterName=parameterName.replace("-GammaJet","")
else :
logging.error(" Process %s not supported for internal POWHEG matrix elements" % name)
sys.exit(1)
elif( simulation=="Matchbox" or simulation=="Merging" ) :
if "VBF" in parameterName :
parameters["nlo"] = "read Matchbox/VBFNLO.in\n"
if(simulation=="Merging"):
process+="cd /Herwig/Merging/\n"
process+="insert "+thefactory+":DiagramGenerator:RestrictLines 0 /Herwig/Particles/Z0\n"
process+="insert "+thefactory+":DiagramGenerator:RestrictLines 0 /Herwig/Particles/W+\n"
process+="insert "+thefactory+":DiagramGenerator:RestrictLines 0 /Herwig/Particles/W-\n"
process+="insert "+thefactory+":DiagramGenerator:RestrictLines 0 /Herwig/Particles/gamma\n"
process+="do "+thefactory+":DiagramGenerator:TimeLikeRange 0 0\n"
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p h0 j j","0","3","FixedScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p h0 j j","0","3","FixedScale",1,1)
process+=setHardProcessWidthToZero(["h0"])
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 125.7\n"
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
process+=addBRReweighter()
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
process+=addBRReweighter()
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
process+=addBRReweighter()
elif "8-" not in parameterName :
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
process+=addBRReweighter()
process+="set /Herwig/Particles/tau-:Stable Stable\n"
elif "ggHJet" in parameterName :
if(simulation=="Merging"):
logging.warning("ggHJet not explicitly tested for %s " % simulation)
sys.exit(0)
parameters["nlo"] = "read Matchbox/MadGraph-GoSam.in\nread Matchbox/HiggsEffective.in\n"
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
process+=addBRReweighter()
process+="set /Herwig/Particles/tau-:Stable Stable\n"
process+=setHardProcessWidthToZero(["h0"])
process+=addProcess(thefactory,"p p h0 j","3","1","FixedScale",0,0)
process+=addFirstJet("20")
process+="set "+thefactory+":ScaleChoice /Herwig/MatrixElements/Matchbox/Scales/FixedScale\n"
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 125.7\n"
elif "ggH" in parameterName :
parameters["nlo"] = "read Matchbox/MadGraph-GoSam.in\nread Matchbox/HiggsEffective.in\n"
if(simulation=="Merging"):
process+= "cd /Herwig/MatrixElements/Matchbox/Amplitudes\nset OpenLoops:HiggsEff Yes\nset MadGraph:Model heft\n"
process+="cd /Herwig/Merging/\n"
process+=setHardProcessWidthToZero(["h0"])
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p h0","2","1","FixedScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p h0","2","1","FixedScale",2,2)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 125.7\n"
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
process+=addBRReweighter()
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
process+=addBRReweighter()
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
process+=addBRReweighter()
elif "8-" not in parameterName :
process+=selectDecayMode("h0",["h0->tau-,tau+;"])
process+=addBRReweighter()
process+="set /Herwig/Particles/tau-:Stable Stable\n"
elif "8-WH" in parameterName :
if(simulation=="Merging"):
logging.warning("8-WH not explicitly tested for %s " % simulation)
sys.exit(0)
process+=setHardProcessWidthToZero(["h0","W+","W-"])
process+=addProcess(thefactory,"p p W+ h0","0","2","FixedScale",0,0)
process+=addProcess(thefactory,"p p W- h0","0","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 125.7\n"
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
process+=addBRReweighter()
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
process+=addBRReweighter()
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
process+=addBRReweighter()
elif "8-ZH" in parameterName :
if(simulation=="Merging"):
logging.warning("8-ZH not explicitly tested for %s " % simulation)
sys.exit(0)
process+=setHardProcessWidthToZero(["h0","Z0"])
process+=addProcess(thefactory,"p p Z0 h0","0","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 125.7\n"
if "GammaGamma" in parameterName :
process+=selectDecayMode("h0",["h0->gamma,gamma;"])
process+=addBRReweighter()
elif "WW" in parameterName :
process+=selectDecayMode("h0",["h0->W+,W-;"])
process+=addBRReweighter()
elif "ZZ" in parameterName :
process+=selectDecayMode("h0",["h0->Z0,Z0;"])
process+=addBRReweighter()
elif "WH" in parameterName :
if(simulation=="Merging"):
logging.warning("WH not explicitly tested for %s " % simulation)
sys.exit(0)
process+=selectDecayMode("h0",["h0->b,bbar;"])
process+=addBRReweighter()
process+=setHardProcessWidthToZero(["h0"])
process+=addProcess(thefactory,"p p e+ nu h0","0","3","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p p e- nu h0","0","3","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p p mu+ nu h0","0","3","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p p mu- nu h0","0","3","LeptonPairMassScale",0,0)
process+=addLeptonPairCut("60","120")
elif "ZH" in parameterName :
if(simulation=="Merging"):
logging.warning("ZH not explicitly tested for %s " % simulation)
sys.exit(0)
process+=selectDecayMode("h0",["h0->b,bbar;"])
process+=addBRReweighter()
process+=setHardProcessWidthToZero(["h0"])
process+=addProcess(thefactory,"p p e+ e- h0","0","3","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p p mu+ mu- h0","0","3","LeptonPairMassScale",0,0)
process+=addLeptonPairCut("60","120")
elif "UE" in parameterName :
logging.error(" Process %s not supported for Matchbox matrix elements" % name)
sys.exit(1)
elif "8-DiJets" in parameterName or "7-DiJets" in parameterName or "13-DiJets" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p j j","2","0","MaxJetPtScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p j j","2","0","MaxJetPtScale",1,1)
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "13-DiJets" not in parameterName :
if "-A" in parameterName :
process+=addFirstJet("45")
process+=addSecondJet("25")
process+="set /Herwig/Cuts/FirstJet:YRange -3. 3.\n"
process+="set /Herwig/Cuts/SecondJet:YRange -3. 3.\n"
elif "-B" in parameterName :
process+=addFirstJet("20")
process+=addSecondJet("15")
process+="set /Herwig/Cuts/FirstJet:YRange -2.7 2.7\n"
process+="set /Herwig/Cuts/SecondJet:YRange -2.7 2.7\n"
elif "-C" in parameterName :
process+=addFirstJet("20")
process+=addSecondJet("15")
process+="set /Herwig/Cuts/FirstJet:YRange -4.8 4.8\n"
process+="set /Herwig/Cuts/SecondJet:YRange -4.8 4.8\n"
else :
logging.error("Exit 00001")
sys.exit(1)
else :
if "-A" in parameterName :
process+= addFirstJet("75.")
process+=addSecondJet("60.")
process+="set /Herwig/Cuts/JetKtCut:MinEta -3.\n"
process+="set /Herwig/Cuts/JetKtCut:MaxEta 3.\n"
elif "-B" in parameterName :
process+= addFirstJet("220.")
process+=addSecondJet("180.")
process+="set /Herwig/Cuts/JetKtCut:MinEta -3.\n"
process+="set /Herwig/Cuts/JetKtCut:MaxEta 3.\n"
else :
logging.error("Exit 00001")
sys.exit(1)
if "DiJets-1" in parameterName : process+=addJetPairCut("90")
elif "DiJets-2" in parameterName : process+=addJetPairCut("200")
elif "DiJets-3" in parameterName : process+=addJetPairCut("450")
elif "DiJets-4" in parameterName : process+=addJetPairCut("750")
elif "DiJets-5" in parameterName : process+=addJetPairCut("950")
elif "DiJets-6" in parameterName : process+=addJetPairCut("1550")
elif "DiJets-7" in parameterName : process+=addJetPairCut("2150")
elif "DiJets-8" in parameterName : process+=addJetPairCut("2750")
elif "DiJets-9" in parameterName : process+=mhat_cut(3750.)
elif "DiJets-10" in parameterName : process+=mhat_cut(4750.)
elif "DiJets-11" in parameterName : process+=mhat_cut(5750.)
else :
logging.error("Exit 00002")
sys.exit(1)
elif( "7-Jets" in parameterName
or "8-Jets" in parameterName
or "13-Jets" in parameterName
or "2760-Jets" in parameterName
) :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p j j","2","0","MaxJetPtScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p j j","2","0","MaxJetPtScale",1,1)
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "Jets-10" in parameterName : process+=addFirstJet("1800")
elif "Jets-0" in parameterName : process+=addFirstJet("5")
elif "Jets-1" in parameterName : process+=addFirstJet("10")
elif "Jets-2" in parameterName : process+=addFirstJet("20")
elif "Jets-3" in parameterName : process+=addFirstJet("40")
elif "Jets-4" in parameterName : process+=addFirstJet("70")
elif "Jets-5" in parameterName : process+=addFirstJet("150")
elif "Jets-6" in parameterName : process+=addFirstJet("200")
elif "Jets-7" in parameterName : process+=addFirstJet("300")
elif "Jets-8" in parameterName : process+=addFirstJet("500")
elif "Jets-9" in parameterName : process+=addFirstJet("800")
else :
logging.error("Exit 00003")
sys.exit(1)
elif( "-Charm" in parameterName or "-Bottom" in parameterName) :
parameters["bscheme"]=fourFlavour
process+="set /Herwig/Particles/b:HardProcessMass 4.2*GeV\n"
process+="set /Herwig/Particles/bbar:HardProcessMass 4.2*GeV\n"
if("8-Bottom" in parameterName) :
addBRReweighter()
process+=selectDecayMode("Jpsi",["Jpsi->mu-,mu+;"])
if "Bottom" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p b bbar","2","0","MaxJetPtScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p b bbar","2","0","MaxJetPtScale",1,0)
else:
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p c cbar","2","0","MaxJetPtScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p c cbar","2","0","MaxJetPtScale",1,0)
process+="set /Herwig/UnderlyingEvent/MPIHandler:IdenticalToUE 0\n"
if "-0" in parameterName : process+=addFirstJet("0")
elif "-1" in parameterName : process+=addFirstJet("5")
elif "-2" in parameterName : process+=addFirstJet("15")
elif "-3" in parameterName : process+=addFirstJet("20")
elif "-4" in parameterName : process+=addFirstJet("50")
elif "-5" in parameterName : process+=addFirstJet("80")
elif "-6" in parameterName : process+=addFirstJet("110")
elif "-7" in parameterName :
process+=addFirstJet("30")
process+=addSecondJet("25")
process+=addJetPairCut("90")
elif "-8" in parameterName :
process+=addFirstJet("30")
process+=addSecondJet("25")
process+=addJetPairCut("340")
elif "-9" in parameterName :
process+=addFirstJet("30")
process+=addSecondJet("25")
process+=addJetPairCut("500")
else :
logging.error("Exit 00004")
sys.exit(1)
elif "Top-L" in parameterName :
process+=setHardProcessWidthToZero(["t","tbar"])
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p t tbar","2","0","TopPairMTScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p t tbar","2","0","TopPairMTScale",2,2)
process+=selectDecayMode("t",["t->nu_e,e+,b;",
"t->nu_mu,mu+,b;"])
process+=addBRReweighter()
elif "Top-SL" in parameterName :
process+=setHardProcessWidthToZero(["t","tbar"])
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p t tbar","2","0","TopPairMTScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p t tbar","2","0","TopPairMTScale",2,2)
process+="set /Herwig/Particles/t:Synchronized Not_synchronized\n"
process+="set /Herwig/Particles/tbar:Synchronized Not_synchronized\n"
process+=selectDecayMode("t",["t->nu_e,e+,b;",
"t->nu_mu,mu+,b;"])
process+=selectDecayMode("tbar",["tbar->b,bbar,cbar;",
"tbar->bbar,cbar,d;",
"tbar->bbar,cbar,s;",
"tbar->bbar,s,ubar;",
"tbar->bbar,ubar,d;"])
process+=addBRReweighter()
elif "Top-All" in parameterName :
process+=setHardProcessWidthToZero(["t","tbar"])
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p t tbar","2","0","TopPairMTScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p t tbar","2","0","TopPairMTScale",2,2)
elif "WZ" in parameterName :
if(simulation=="Merging"):
logging.warning("WZ not explicitly tested for %s " % simulation)
sys.exit(0)
process+=setHardProcessWidthToZero(["W+","W-","Z0"])
process+=addProcess(thefactory,"p p W+ Z0","0","2","FixedScale",0,0)
process+=addProcess(thefactory,"p p W- Z0","0","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 171.6*GeV\n\n"
process+=selectDecayMode("W+",["W+->nu_e,e+;",
"W+->nu_mu,mu+;"])
process+=selectDecayMode("W-",["W-->nu_ebar,e-;",
"W-->nu_mubar,mu-;"])
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;"])
process+=addBRReweighter()
process+=addLeptonPairCut("60","120")
elif "WW-emu" in parameterName :
if(simulation=="Merging"):
logging.warning("WW-emu not explicitly tested for %s " % simulation)
sys.exit(0)
process+=setHardProcessWidthToZero(["W+","W-","Z0"])
process+=addProcess(thefactory,"p p W+ W-","0","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 160.8*GeV\n"
process+="set /Herwig/Particles/W+:Synchronized 0\n"
process+="set /Herwig/Particles/W-:Synchronized 0\n"
process+=selectDecayMode("W+",["W+->nu_e,e+;"])
process+=selectDecayMode("W-",["W-->nu_mubar,mu-;"])
process+=addBRReweighter()
parameters["bscheme"] = "read Matchbox/FourFlavourScheme.in\n"
process+=addLeptonPairCut("60","120")
elif "WW-ll" in parameterName :
if(simulation=="Merging"):
logging.warning("WW-ll not explicitly tested for %s " % simulation)
sys.exit(0)
process+=setHardProcessWidthToZero(["W+","W-","Z0"])
process+=addProcess(thefactory,"p p W+ W-","0","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 160.8*GeV\n"
process+=selectDecayMode("W+",["W+->nu_e,e+;",
"W+->nu_mu,mu+;",
"W+->nu_tau,tau+;"])
process+=addBRReweighter()
process+=addLeptonPairCut("60","120")
parameters["bscheme"] = "read Matchbox/FourFlavourScheme.in\n"
elif "ZZ-ll" in parameterName :
if(simulation=="Merging"):
logging.warning("ZZ-ll not explicitly tested for %s " % simulation)
sys.exit(0)
process+=setHardProcessWidthToZero(["W+","W-","Z0"])
process+=addProcess(thefactory,"p p Z0 Z0","0","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 182.2*GeV\n"
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;",
"Z0->tau-,tau+;"])
process+=addBRReweighter()
process+=addLeptonPairCut("60","120")
elif "ZZ-lv" in parameterName :
if(simulation=="Merging"):
logging.warning("ZZ-lv not explicitly tested for %s " % simulation)
sys.exit(0)
process+=setHardProcessWidthToZero(["W+","W-","Z0"])
process+=addProcess(thefactory,"p p Z0 Z0","0","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 182.2*GeV\n"
process+=selectDecayMode("Z0",["Z0->e-,e+;",
"Z0->mu-,mu+;",
"Z0->tau-,tau+;",
"Z0->nu_e,nu_ebar;",
"Z0->nu_mu,nu_mubar;",
"Z0->nu_tau,nu_taubar;"])
process+=addBRReweighter()
process+=addLeptonPairCut("60","120")
elif "W-e" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p e+ nu","0","2","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p p e- nu","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=particlegroup(thefactory,'epm','e+','e-')
process+=addProcess(thefactory,"p p epm nu","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("60","120")
elif "W-mu" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p mu+ nu","0","2","LeptonPairMassScale",0,0)
process+=addProcess(thefactory,"p p mu- nu","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=particlegroup(thefactory,'mupm','mu+','mu-')
process+=addProcess(thefactory,"p p mupm nu","0","2","LeptonPairMassScale",2,2)
process+=addLeptonPairCut("60","120")
elif "Z-e" in parameterName or "Z-mu" in parameterName :
if "Z-e" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p e+ e-","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p e+ e-","0","2","LeptonPairMassScale",2,2)
elif "Z-mu" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p mu+ mu-","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p mu+ mu-","0","2","LeptonPairMassScale",2,2)
mcuts=[10,35,75,110,400,ecms]
for i in range(1,6) :
tstring = "-Mass%s"%i
if tstring in parameterName :
process+=addLeptonPairCut(mcuts[i-1],mcuts[i])
parameterName=parameterName.replace(tstring,"")
elif "Z-nu" in parameterName :
if(simulation=="Matchbox"):
process+=addProcess(thefactory,"p p nu nu","0","2","LeptonPairMassScale",0,0)
elif(simulation=="Merging"):
process+=addProcess(thefactory,"p p nu nu","0","2","LeptonPairMassScale",2,2)
elif "Z-jj" in parameterName :
if(simulation=="Merging"):
logging.warning("Z-jj not explicitly tested for %s " % simulation)
sys.exit(0)
process+=addProcess(thefactory,"p p e+ e- j j","2","2","LeptonPairMassScale",0,0)
process+=addFirstJet("40")
process+=addSecondJet("30")
process+=addLeptonPairCut("60","120")
elif "W-Jet" in parameterName :
if(simulation=="Merging"):
logging.warning("W-Jet not explicitly tested for %s " % simulation)
sys.exit(0)
process+=addProcess(thefactory,"p p e+ nu j","1","2","HTScale",0,0)
process+=addProcess(thefactory,"p p e- nu j","1","2","HTScale",0,0)
process+=addLeptonPairCut("60","120")
if "W-Jet-1-e" in parameterName :
process+=addFirstJet("100")
parameterName=parameterName.replace("W-Jet-1-e","W-Jet-e")
elif "W-Jet-2-e" in parameterName :
process+=addFirstJet("190")
parameterName=parameterName.replace("W-Jet-2-e","W-Jet-e")
elif "W-Jet-3-e" in parameterName :
process+=addFirstJet("270")
parameterName=parameterName.replace("W-Jet-3-e","W-Jet-e")
else :
logging.error("Exit 00005")
sys.exit(1)
elif "Z-Jet" in parameterName :
if(simulation=="Merging"):
logging.warning("Z-Jet not explicitly tested for %s " % simulation)
sys.exit(0)
if "-e" in parameterName :
process+=addProcess(thefactory,"p p e+ e- j","1","2","HTScale",0,0)
if "Z-Jet-0-e" in parameterName :
process+=addFirstJet("35")
parameterName=parameterName.replace("Z-Jet-0-e","Z-Jet-e")
elif "Z-Jet-1-e" in parameterName :
process+=addFirstJet("100")
parameterName=parameterName.replace("Z-Jet-1-e","Z-Jet-e")
elif "Z-Jet-2-e" in parameterName :
process+=addFirstJet("190")
parameterName=parameterName.replace("Z-Jet-2-e","Z-Jet-e")
elif "Z-Jet-3-e" in parameterName :
process+=addFirstJet("270")
parameterName=parameterName.replace("Z-Jet-3-e","Z-Jet-e")
else :
logging.error("Exit 00006")
sys.exit(1)
else :
process+=addProcess(thefactory,"p p mu+ mu- j","1","2","HTScale",0,0)
process+=addFirstJet("35")
parameterName=parameterName.replace("Z-Jet-0-mu","Z-Jet-mu")
process+=addLeptonPairCut("60","120")
elif "Z-bb" in parameterName :
if(simulation=="Merging"):
logging.warning("Z-bb not explicitly tested for %s " % simulation)
sys.exit(0)
parameters["bscheme"]=fourFlavour
process+="set /Herwig/Particles/b:HardProcessMass 4.2*GeV\nset /Herwig/Particles/bbar:HardProcessMass 4.2*GeV\n"
process+=addProcess(thefactory,"p p e+ e- b bbar","2","2","FixedScale",0,0)
process+=addLeptonPairCut("66","116")
process+=addFirstJet("18")
process+=addSecondJet("15")
process+=addLeptonPairCut("60","120")
elif "Z-b" in parameterName :
if(simulation=="Merging"):
logging.warning("Z-b not explicitly tested for %s " % simulation)
sys.exit(0)
process+=particlegroup(thefactory,'bjet','b','bbar')
process+=addProcess(thefactory,"p p e+ e- bjet","1","2","FixedScale",0,0)
process+="set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 91.2*GeV\n"
process+=addLeptonPairCut("60","120")
process+=addFirstJet("15")
elif "W-b" in parameterName :
if(simulation=="Merging"):
logging.warning("W-b not explicitly tested for %s " % simulation)
sys.exit(0)
parameters["bscheme"]=fourFlavour
process += "set /Herwig/Particles/b:HardProcessMass 4.2*GeV\nset /Herwig/Particles/bbar:HardProcessMass 4.2*GeV\n"
process+=addProcess(thefactory,"p p e- nu b bbar","2","2","FixedScale",0,0)
process+=addProcess(thefactory,"p p mu+ nu b bbar","2","2","FixedScale",0,0)
process += "set /Herwig/MatrixElements/Matchbox/Scales/FixedScale:FixedScale 80.4*GeV\n"
process+=addFirstJet("30")
process+=addLeptonPairCut("60","120")
else :
logging.error(" Process %s not supported for Matchbox matrix elements" % name)
sys.exit(1)
# LHC-GammaGamma
elif(collider=="LHC-GammaGamma" ) :
if "7" in parameterName : process = StringBuilder(collider_lumi( 7000.0))
elif "8" in parameterName : process = StringBuilder(collider_lumi( 8000.0))
elif "13" in parameterName : process = StringBuilder(collider_lumi(13000.0))
else : process = StringBuilder(collider_lumi( 7000.0))
if(simulation=="") :
process += "cp MEgg2ff MEgg2ee\n"
process += insert_ME("MEgg2ee","Electron")
process += "cp MEgg2ff MEgg2mm\n"
process += insert_ME("MEgg2mm","Muon")
else :
logging.error("LHC-GammaGamma not supported for %s " % simulation)
sys.exit(1)
+pion=False
+if "Pion-" in parameterName and have_hadronic_collider:
+ parameterName = parameterName.replace("Pion-","")
+ pion = True
+
if "EHS" in name :
pFile = os.path.join(collider,"{c}-{pn}.in".format(c="EHS", pn=parameterName))
elif "Photo" == name[0:5] :
pFile = os.path.join(collider,"{c}-{pn}.in".format(c="Photo", pn=parameterName))
else :
pFile = os.path.join(collider,"{c}-{pn}.in".format(c=collider, pn=parameterName))
with open(os.path.join("Rivet",pFile), 'r') as f:
parameters['parameterFile'] = f.read()
parameters['runname'] = 'Rivet-%s' % name
parameters['process'] = str(process)
if have_hadronic_collider :
if "EHS" in name :
parameters['collider'] = "PPCollider.in\nread snippets/FixedTarget-PP.in"
else :
parameters['collider'] = "PPCollider.in"
+if pion :
+ parameters['collider'] +="\nread snippets/PionPDF.in\nset /Herwig/Generators/EventGenerator:EventHandler:BeamA /Herwig/Particles/pi+\n"
+ parameters['collider'] +="set /Herwig/Shower/ShowerHandler:PDFA /Herwig/Partons/PionPDF\nset /Herwig/Shower/ShowerHandler:PDFARemnant /Herwig/Partons/PionPDF\n"
+ parameters['collider'] +="set /Herwig/Partons/PPExtractor:FirstPDF /Herwig/Partons/PionPDF\nset /Herwig/Partons/MPIExtractor:FirstPDF /Herwig/Partons/PionPDF\n"
+ parameters['collider'] +="set /Herwig/EventHandlers/FixedTargetLuminosity:BeamParticle /Herwig/Particles/pi+\n"
#check if selecteddecaymode and addedBRReweighter is consistent
if selecteddecaymode and not addedBRReweighter:
logging.error("Decaymode was selected but no BRReweighter was added.")
sys.exit(1)
if addedBRReweighter and not selecteddecaymode:
logging.error("BRReweighter was added but no Decaymode was selected.")
sys.exit(1)
# check that we only add one process if in merging mode:
if numberOfAddedProcesses > 1 and simulation =="Merging":
logging.error("In Merging only one process is allowed at the moment. See ticket #403.")
sys.exit(1)
# Check if a process was added for Merging or Matchbox:
if numberOfAddedProcesses == 0 and (simulation =="Merging" or simulation =="Matchbox"):
logging.error("No process was selected.")
sys.exit(1)
# get template and write the file
with open(os.path.join("Rivet/Templates",templateName), 'r') as f:
templateText = f.read()
template = Template( templateText )
with open(os.path.join("Rivet",name+".in"), 'w') as f:
f.write( template.substitute(parameters) )
diff --git a/src/defaults/mesons.in b/src/defaults/mesons.in
--- a/src/defaults/mesons.in
+++ b/src/defaults/mesons.in
@@ -1,893 +1,893 @@
# -*- ThePEG-repository -*-
#
# file containing the particle data for the mesons
#
#
# the 1^1S_0 multiplet
#
-create ThePEG::ParticleData pi+
+create ThePEG::BeamParticleData pi+
setup pi+ 211 pi+ 0.13957039 2.5283740149914E-17 0 7804.5 3 0 1 1
create ThePEG::ParticleData pi0
setup pi0 111 pi0 0.1349768 7.7994841897233E-9 0 2.53E-5 0 0 1 0
-create ThePEG::ParticleData pi-
+create ThePEG::BeamParticleData pi-
setup pi- -211 pi- 0.13957039 2.5283740149914E-17 0 7804.5 -3 0 1 1
makeanti pi- pi+
create ThePEG::ParticleData eta
setup eta 221 eta 0.547862 1.31E-6 1.31E-5 0 0 0 1 0
create ThePEG::ParticleData eta'
setup eta' 331 eta' 0.95778 0.000203 0.00203 0 0 0 1 0
create ThePEG::ParticleData eta_c
setup eta_c 441 eta_c 2.9839 0.032 0.16 0 0 0 1 0
create ThePEG::ParticleData eta_b
setup eta_b 551 eta_b 9.3987 0.01 0.1 0 0 0 1 0
create ThePEG::ParticleData K+
setup K+ 321 K+ 0.493677 5.3173524656427E-17 0 3711 3 0 1 1
create ThePEG::ParticleData K0
setup K0 311 K0 0.497611 1.0E+27 0 0 0 0 1 0
create ThePEG::ParticleData K-
setup K- -321 K- 0.493677 5.3173524656427E-17 0 3711 -3 0 1 1
makeanti K- K+
create ThePEG::ParticleData Kbar0
setup Kbar0 -311 Kbar0 0.497611 1.0E+27 0 0 0 0 1 0
makeanti Kbar0 K0
create ThePEG::ParticleData D0
setup D0 421 D0 1.86484 1.6042841463415E-12 0 0.123 0 0 1 0
create ThePEG::ParticleData D+
setup D+ 411 D+ 1.86966 6.3286385503528E-13 0 0.3118 3 0 1 0
create ThePEG::ParticleData Dbar0
setup Dbar0 -421 Dbar0 1.86484 1.6042841463415E-12 0 0.123 0 0 1 0
makeanti Dbar0 D0
create ThePEG::ParticleData D-
setup D- -411 D- 1.86966 6.3286385503528E-13 0 0.3118 -3 0 1 0
makeanti D- D+
create ThePEG::ParticleData D_s+
setup D_s+ 431 D_s+ 1.9682 1.315513E-12 0 0.15 3 0 1 0
create ThePEG::ParticleData D_s-
setup D_s- -431 D_s- 1.9682 1.315513E-12 0 0.15 -3 0 1 0
makeanti D_s- D_s+
create ThePEG::MixedParticleData B0
setup B0 511 B0 5.27965 4.2897163043478E-13 0 0.46 0 0 1 0
newdef B0:DeltaM 3.337134e-13*GeV
newdef B0:DeltaGamma 0.*GeV
newdef B0:PQMagnitude 1.
newdef B0:PQPhase 1.
newdef B0:ZMagnitude 0.
newdef B0:ZPhase 0.
create ThePEG::ParticleData B+
setup B+ 521 B+ 5.27934 3.9386616766467E-13 0 0.501 3 0 1 0
create ThePEG::MixedParticleData Bbar0
setup Bbar0 -511 Bbar0 5.27965 4.2897163043478E-13 0 0.46 0 0 1 0
makeanti Bbar0 B0
newdef Bbar0:Synchronized 0
newdef Bbar0:DeltaM 3.337134e-13*GeV
newdef Bbar0:DeltaGamma 0.*GeV
newdef Bbar0:PQMagnitude 1.
newdef Bbar0:PQPhase 1.
newdef Bbar0:ZMagnitude 0.
newdef Bbar0:ZPhase 0.
create ThePEG::ParticleData B-
setup B- -521 B- 5.27934 3.9386616766467E-13 0 0.501 -3 0 1 0
makeanti B- B+
newdef B-:Synchronized 0
create ThePEG::MixedParticleData B_s0
setup B_s0 531 B_s0 5.36688 4.5051815068493E-13 0 0.438 0 0 1 0
newdef B_s0:DeltaM 1.169642e-11*GeV
newdef B_s0:DeltaGamma 6.676243e-14*GeV
newdef B_s0:PQMagnitude 1.
newdef B_s0:PQPhase 1.
newdef B_s0:ZMagnitude 0.
newdef B_s0:ZPhase 0.
create ThePEG::MixedParticleData B_sbar0
setup B_sbar0 -531 B_sbar0 5.36688 4.5051815068493E-13 0 0.438 0 0 1 0
makeanti B_sbar0 B_s0
newdef B_sbar0:Synchronized 0
newdef B_sbar0:DeltaM 1.169642e-11*GeV
newdef B_sbar0:DeltaGamma 6.676243e-14*GeV
newdef B_sbar0:PQMagnitude 1.
newdef B_sbar0:PQPhase 1.
newdef B_sbar0:ZMagnitude 0.
newdef B_sbar0:ZPhase 0.
create ThePEG::ParticleData B_c+
setup B_c+ 541 B_c+ 6.286 1.4299054347826E-12 0 0.138 3 0 1 0
create ThePEG::ParticleData B_c-
setup B_c- -541 B_c- 6.286 1.4299054347826E-12 0 0.138 -3 0 1 0
makeanti B_c- B_c+
#
# the 1^3S_1 multiplet
#
create ThePEG::ParticleData rho+
setup rho+ 213 rho+ 0.77526 0.1491 0.45 0 3 0 3 0
newdef rho+:WidthLoCut 0.4
newdef rho+:WidthUpCut 0.5
create ThePEG::ParticleData rho0
setup rho0 113 rho0 0.77526 0.1491 0.45 0 0 0 3 0
newdef rho0:WidthLoCut 0.4
newdef rho0:WidthUpCut 0.5
create ThePEG::ParticleData rho-
setup rho- -213 rho- 0.77526 0.1491 0.45 0 -3 0 3 0
makeanti rho- rho+
newdef rho-:WidthLoCut 0.4
newdef rho-:WidthUpCut 0.5
create ThePEG::ParticleData omega
setup omega 223 omega 0.78266 0.00868 0.0868 0 0 0 3 0
create ThePEG::ParticleData phi
setup phi 333 phi 1.019461 0.004249 0.036245 0 0 0 3 0
newdef phi:WidthLoCut 0.03
newdef phi:WidthUpCut 0.04249
create ThePEG::ParticleData Jpsi
setup Jpsi 443 Jpsi 3.096916 9.34E-5 0.000934 0 0 0 3 0
create ThePEG::ParticleData Upsilon
setup Upsilon 553 Upsilon 9.4603 5.402E-5 0.00054 0 0 0 3 0
create ThePEG::ParticleData K*+
setup K*+ 323 K*+ 0.89167 0.0514 0.382 0 3 0 3 0
newdef K*+:WidthLoCut 0.25
newdef K*+:WidthUpCut 0.514
create ThePEG::ParticleData K*0
setup K*0 313 K*0 0.89555 0.0473 0.3615 0 0 0 3 0
newdef K*0:WidthLoCut 0.25
newdef K*0:WidthUpCut 0.473
create ThePEG::ParticleData K*-
setup K*- -323 K*- 0.89167 0.0514 0.382 0 -3 0 3 0
makeanti K*- K*+
newdef K*-:WidthLoCut 0.25
newdef K*-:WidthUpCut 0.514
create ThePEG::ParticleData K*bar0
setup K*bar0 -313 K*bar0 0.89555 0.0473 0.3615 0 0 0 3 0
makeanti K*bar0 K*0
newdef K*bar0:WidthLoCut 0.25
newdef K*bar0:WidthUpCut 0.473
create ThePEG::ParticleData D*0
setup D*0 423 D*0 2.00685 6.8E-5 0.00068 0 0 0 3 0
create ThePEG::ParticleData D*+
setup D*+ 413 D*+ 2.01026 8.34E-5 0.000834 0 3 0 3 0
create ThePEG::ParticleData D*bar0
setup D*bar0 -423 D*bar0 2.00685 6.8E-5 0.00068 0 0 0 3 0
makeanti D*bar0 D*0
create ThePEG::ParticleData D*-
setup D*- -413 D*- 2.01026 8.34E-5 0.000834 0 -3 0 3 0
makeanti D*- D*+
create ThePEG::ParticleData D_s*+
setup D_s*+ 433 D_s*+ 2.1122 4.4E-5 0.00044 0 3 0 3 0
create ThePEG::ParticleData D_s*-
setup D_s*- -433 D_s*- 2.1122 4.4E-5 0.00044 0 -3 0 3 0
makeanti D_s*- D_s*+
create ThePEG::ParticleData B*0
setup B*0 513 B*0 5.32471 2.4E-7 2.4E-6 0 0 0 3 0
create ThePEG::ParticleData B*+
setup B*+ 523 B*+ 5.32471 7.8E-7 7.8E-6 0 3 0 3 0
create ThePEG::ParticleData B*bar0
setup B*bar0 -513 B*bar0 5.32471 2.4E-7 2.4E-6 0 0 0 3 0
makeanti B*bar0 B*0
create ThePEG::ParticleData B*-
setup B*- -523 B*- 5.32471 7.8E-7 7.8E-6 0 -3 0 3 0
makeanti B*- B*+
create ThePEG::ParticleData B_s*0
setup B_s*0 533 B_s*0 5.4154 1.5E-7 1.5E-6 0 0 0 3 0
create ThePEG::ParticleData B_s*bar0
setup B_s*bar0 -533 B_s*bar0 5.4154 1.5E-7 1.5E-6 0 0 0 3 0
makeanti B_s*bar0 B_s*0
create ThePEG::ParticleData B_c*+
setup B_c*+ 543 B_c*+ 6.321 8.0E-8 8.0E-7 0 3 0 3 0
create ThePEG::ParticleData B_c*-
setup B_c*- -543 B_c*- 6.321 8.0E-8 8.0E-7 0 -3 0 3 0
makeanti B_c*- B_c*+
#
# the 1^1P_1 multiplet
#
create ThePEG::ParticleData b_1+
setup b_1+ 10213 b_1+ 1.2295 0.142 0.505 0 3 0 3 0
newdef b_1+:WidthLoCut 0.3
newdef b_1+:WidthUpCut 0.71
create ThePEG::ParticleData b_10
setup b_10 10113 b_10 1.2295 0.142 0.505 0 0 0 3 0
newdef b_10:WidthLoCut 0.3
newdef b_10:WidthUpCut 0.71
create ThePEG::ParticleData b_1-
setup b_1- -10213 b_1- 1.2295 0.142 0.505 0 -3 0 3 0
makeanti b_1- b_1+
newdef b_1-:WidthLoCut 0.3
newdef b_1-:WidthUpCut 0.71
create ThePEG::ParticleData h_1
setup h_1 10223 h_1 1.166 0.375 0.375 0 0 0 3 0
create ThePEG::ParticleData h'_1
setup h'_1 10333 h'_1 1.416 0.09 0.18 0 0 0 3 0
create ThePEG::ParticleData h_c
setup h_c 10443 h_c 3.52538 0.0007 0.007 0 0 0 3 0
create ThePEG::ParticleData h_b
setup h_b 10553 h_b 9.8993 8.94E-5 0.000894 0 0 0 3 0
create ThePEG::ParticleData K_1+
setup K_1+ 10323 K_1+ 1.27 0.09 0.18 0 3 0 3 0
newdef K_1+:VariableRatio 1
create ThePEG::ParticleData K_10
setup K_10 10313 K_10 1.272 0.09 0.18 0 0 0 3 0
newdef K_10:VariableRatio 1
create ThePEG::ParticleData K_1-
setup K_1- -10323 K_1- 1.272 0.09 0.18 0 -3 0 3 0
makeanti K_1- K_1+
newdef K_1-:VariableRatio 1
create ThePEG::ParticleData K_1bar0
setup K_1bar0 -10313 K_1bar0 1.272 0.09 0.18 0 0 0 3 0
makeanti K_1bar0 K_10
newdef K_1bar0:VariableRatio 1
create ThePEG::ParticleData D_10
setup D_10 10423 D_10 2.4221 0.0313 0.0939 0 0 0 3 0
create ThePEG::ParticleData D_1+
setup D_1+ 10413 D_1+ 2.4221 0.0313 0.0939 0 3 0 3 0
create ThePEG::ParticleData D_1bar0
setup D_1bar0 -10423 D_1bar0 2.4221 0.0313 0.0939 0 0 0 3 0
makeanti D_1bar0 D_10
create ThePEG::ParticleData D_1-
setup D_1- -10413 D_1- 2.4221 0.0313 0.0939 0 -3 0 3 0
makeanti D_1- D_1+
create ThePEG::ParticleData D_s1+
setup D_s1+ 10433 D_s1+ 2.53511 0.00092 0.0092 0 3 0 3 0
create ThePEG::ParticleData D_s1-
setup D_s1- -10433 D_s1- 2.53511 0.00092 0.0092 0 -3 0 3 0
makeanti D_s1- D_s1+
create ThePEG::ParticleData B_10
setup B_10 10513 B_10 5.7261 0.0275 0.0825 0 0 0 3 0
create ThePEG::ParticleData B_1+
setup B_1+ 10523 B_1+ 5.7259 0.031 0.093 0 3 0 3 0
create ThePEG::ParticleData B_1bar0
setup B_1bar0 -10513 B_1bar0 5.7261 0.0275 0.0825 0 0 0 3 0
makeanti B_1bar0 B_10
create ThePEG::ParticleData B_1-
setup B_1- -10523 B_1- 5.7259 0.031 0.093 0 -3 0 3 0
makeanti B_1- B_1+
create ThePEG::ParticleData B_s10
setup B_s10 10533 B_s10 5.8287 0.0005 0.005 0 0 0 3 0
create ThePEG::ParticleData B_s1bar0
setup B_s1bar0 -10533 B_s1bar0 5.8287 0.0005 0.005 0 0 0 3 0
makeanti B_s1bar0 B_s10
create ThePEG::ParticleData B_c1+
setup B_c1+ 10543 B_c1+ 6.743 7.3E-5 0.00073 0 3 0 3 0
create ThePEG::ParticleData B_c1-
setup B_c1- -10543 B_c1- 6.743 7.3E-5 0.00073 0 -3 0 3 0
makeanti B_c1- B_c1+
#
# the 1^3P_0 multiplet
#
create ThePEG::ParticleData a'_0+
setup a'_0+ 10211 a'_0+ 1.474 0.265 0.265 0 3 0 1 0
create ThePEG::ParticleData a'_00
setup a'_00 10111 a'_00 1.474 0.265 0.265 0 0 0 1 0
create ThePEG::ParticleData a'_0-
setup a'_0- -10211 a'_0- 1.474 0.265 0.265 0 -3 0 1 0
makeanti a'_0- a'_0+
create ThePEG::ParticleData f'_0
setup f'_0 10221 f'_0 1.395 0.275 0.275 0 0 0 1 0
create ThePEG::ParticleData f_0(1710)
setup f_0(1710) 10331 f_0(1710) 1.704 0.123 0.369 0 0 0 1 0
create ThePEG::ParticleData chi_c0
setup chi_c0 10441 chi_c0 3.41476 0.0104 0.104 0 0 0 1 0
create ThePEG::ParticleData chi_b0
setup chi_b0 10551 chi_b0 9.85944 0.000817 0.00817 0 0 0 1 0
create ThePEG::ParticleData K*_0+
setup K*_0+ 10321 K*_0+ 1.425 0.27 0.79 0 3 0 1 0
newdef K*_0+:WidthLoCut 0.77
newdef K*_0+:WidthUpCut 0.81
create ThePEG::ParticleData K*_00
setup K*_00 10311 K*_00 1.425 0.27 0.79 0 0 0 1 0
newdef K*_00:WidthLoCut 0.77
newdef K*_00:WidthUpCut 0.81
create ThePEG::ParticleData K*_0-
setup K*_0- -10321 K*_0- 1.425 0.27 0.79 0 -3 0 1 0
makeanti K*_0- K*_0+
newdef K*_0-:WidthLoCut 0.77
newdef K*_0-:WidthUpCut 0.81
create ThePEG::ParticleData K*_0bar0
setup K*_0bar0 -10311 K*_0bar0 1.425 0.27 0.79 0 0 0 1 0
makeanti K*_0bar0 K*_00
newdef K*_0bar0:WidthLoCut 0.77
newdef K*_0bar0:WidthUpCut 0.81
create ThePEG::ParticleData D_0*+
setup D_0*+ 10411 D_0*+ 2.343 0.229 0.458 0 3 0 1 0
newdef D_0*+:WidthLoCut 0.229
newdef D_0*+:WidthUpCut 0.687
create ThePEG::ParticleData D_0*0
setup D_0*0 10421 D_0*0 2.343 0.229 0.458 0 0 0 1 0
newdef D_0*0:WidthLoCut 0.229
newdef D_0*0:WidthUpCut 0.687
create ThePEG::ParticleData D_0*-
setup D_0*- -10411 D_0*- 2.343 0.229 0.458 0 -3 0 1 0
makeanti D_0*- D_0*+
newdef D_0*-:WidthLoCut 0.229
newdef D_0*-:WidthUpCut 0.687
create ThePEG::ParticleData D_0*bar0
setup D_0*bar0 -10421 D_0*bar0 2.343 0.229 0.458 0 0 0 1 0
makeanti D_0*bar0 D_0*0
newdef D_0*bar0:WidthLoCut 0.229
newdef D_0*bar0:WidthUpCut 0.687
create ThePEG::ParticleData D_s0+
setup D_s0+ 10431 D_s0+ 2.3178 2.32E-5 0.000232 0 3 0 1 0
create ThePEG::ParticleData D_s0-
setup D_s0- -10431 D_s0- 2.3178 2.32E-5 0.000232 0 -3 0 1 0
makeanti D_s0- D_s0+
create ThePEG::ParticleData B*_00
setup B*_00 10511 B*_00 5.726 0.14 0.28 0 0 0 1 0
create ThePEG::ParticleData B*_0+
setup B*_0+ 10521 B*_0+ 5.726 0.14 0.28 0 3 0 1 0
create ThePEG::ParticleData B*_0bar0
setup B*_0bar0 -10511 B*_0bar0 5.726 0.14 0.28 0 0 0 1 0
makeanti B*_0bar0 B*_00
create ThePEG::ParticleData B*_0-
setup B*_0- -10521 B*_0- 5.726 0.14 0.28 0 -3 0 1 0
makeanti B*_0- B*_0+
create ThePEG::ParticleData B*_s00
setup B*_s00 10531 B*_s00 5.818 0.07 0.0875 0 0 0 1 0
newdef B*_s00:WidthLoCut 0.035
newdef B*_s00:WidthUpCut 0.14
create ThePEG::ParticleData B*_s0bar0
setup B*_s0bar0 -10531 B*_s0bar0 5.818 0.07 0.0875 0 0 0 1 0
makeanti B*_s0bar0 B*_s00
newdef B*_s0bar0:WidthLoCut 0.035
newdef B*_s0bar0:WidthUpCut 0.14
create ThePEG::ParticleData B*_c0+
setup B*_c0+ 10541 B*_c0+ 6.727 5.5E-5 0.00055 0 3 0 1 0
create ThePEG::ParticleData B*_c0-
setup B*_c0- -10541 B*_c0- 6.727 5.5E-5 0.00055 0 -3 0 1 0
makeanti B*_c0- B*_c0+
#
# the 1^3P_1 multiplet
#
create ThePEG::ParticleData a_1+
setup a_1+ 20213 a_1+ 1.23 0.42 0.56 0 3 0 3 0
newdef a_1+:VariableRatio 1
create ThePEG::ParticleData a_10
setup a_10 20113 a_10 1.23 0.42 0.56 0 0 0 3 0
newdef a_10:VariableRatio 1
create ThePEG::ParticleData a_1-
setup a_1- -20213 a_1- 1.23 0.42 0.56 0 -3 0 3 0
makeanti a_1- a_1+
newdef a_1-:VariableRatio 1
create ThePEG::ParticleData f_1
setup f_1 20223 f_1 1.2819 0.0227 0.242 0 0 0 3 0
create ThePEG::ParticleData f'_1
setup f'_1 20333 f'_1 1.4263 0.0545 0.40875 0 0 0 3 0
newdef f'_1:WidthLoCut 0.2725
newdef f'_1:WidthUpCut 0.545
create ThePEG::ParticleData chi_c1
setup chi_c1 20443 chi_c1 3.51067 0.00084 0.0089 0 0 0 3 0
create ThePEG::ParticleData chi_b1
setup chi_b1 20553 chi_b1 9.89278 7.1E-5 0.00071 0 0 0 3 0
create ThePEG::ParticleData K'_1+
setup K'_1+ 20323 K'_1+ 1.403 0.174 0.348 0 3 0 3 0
newdef K'_1+:VariableRatio 1
create ThePEG::ParticleData K'_10
setup K'_10 20313 K'_10 1.403 0.174 0.348 0 0 0 3 0
newdef K'_10:VariableRatio 1
create ThePEG::ParticleData K'_1-
setup K'_1- -20323 K'_1- 1.403 0.174 0.348 0 -3 0 3 0
makeanti K'_1- K'_1+
newdef K'_1-:VariableRatio 1
create ThePEG::ParticleData K'_1bar0
setup K'_1bar0 -20313 K'_1bar0 1.403 0.174 0.348 0 0 0 3 0
makeanti K'_1bar0 K'_10
newdef K'_1bar0:VariableRatio 1
create ThePEG::ParticleData D'_10
setup D'_10 20423 D'_10 2.412 0.314 0.439 0 0 0 3 0
newdef D'_10:WidthLoCut 0.25
newdef D'_10:WidthUpCut 0.628
create ThePEG::ParticleData D'_1+
setup D'_1+ 20413 D'_1+ 2.412 0.314 0.439 0 3 0 3 0
newdef D'_1+:WidthLoCut 0.25
newdef D'_1+:WidthUpCut 0.628
create ThePEG::ParticleData D'_1bar0
setup D'_1bar0 -20423 D'_1bar0 2.412 0.314 0.439 0 0 0 3 0
makeanti D'_1bar0 D'_10
newdef D'_1bar0:WidthLoCut 0.25
newdef D'_1bar0:WidthUpCut 0.628
create ThePEG::ParticleData D'_1-
setup D'_1- -20413 D'_1- 2.412 0.314 0.439 0 -3 0 3 0
makeanti D'_1- D'_1+
newdef D'_1-:WidthLoCut 0.25
newdef D'_1-:WidthUpCut 0.628
create ThePEG::ParticleData D'_s1+
setup D'_s1+ 20433 D'_s1+ 2.4595 3.82E-5 0.000382 0 3 0 3 0
create ThePEG::ParticleData D'_s1-
setup D'_s1- -20433 D'_s1- 2.4595 3.82E-5 0.000382 0 -3 0 3 0
makeanti D'_s1- D'_s1+
create ThePEG::ParticleData B'_10
setup B'_10 20513 B'_10 5.762 0.13 0.26 0 0 0 3 0
create ThePEG::ParticleData B'_1+
setup B'_1+ 20523 B'_1+ 5.762 0.13 0.26 0 3 0 3 0
create ThePEG::ParticleData B'_1bar0
setup B'_1bar0 -20513 B'_1bar0 5.762 0.13 0.26 0 0 0 3 0
makeanti B'_1bar0 B'_10
create ThePEG::ParticleData B'_1-
setup B'_1- -20523 B'_1- 5.762 0.13 0.26 0 -3 0 3 0
makeanti B'_1- B'_1+
create ThePEG::ParticleData B'_s10
setup B'_s10 20533 B'_s10 5.856 0.06 0.075 0 0 0 3 0
newdef B'_s10:WidthLoCut 0.03
newdef B'_s10:WidthUpCut 0.12
create ThePEG::ParticleData B'_s1bar0
setup B'_s1bar0 -20533 B'_s1bar0 5.856 0.06 0.075 0 0 0 3 0
makeanti B'_s1bar0 B'_s10
newdef B'_s1bar0:WidthLoCut 0.03
newdef B'_s1bar0:WidthUpCut 0.12
create ThePEG::ParticleData B'_c1+
setup B'_c1+ 20543 B'_c1+ 6.765 9.1E-5 0.00091 0 3 0 3 0
create ThePEG::ParticleData B'_c1-
setup B'_c1- -20543 B'_c1- 6.765 9.1E-5 0.00091 0 -3 0 3 0
makeanti B'_c1- B'_c1+
#
# the 1^3P_2 multiplet
#
create ThePEG::ParticleData a_2+
setup a_2+ 215 a_2+ 1.3182 0.105 0.21 0 3 0 5 0
create ThePEG::ParticleData a_20
setup a_20 115 a_20 1.3182 0.105 0.21 0 0 0 5 0
create ThePEG::ParticleData a_2-
setup a_2- -215 a_2- 1.3182 0.105 0.21 0 -3 0 5 0
makeanti a_2- a_2+
create ThePEG::ParticleData f_2
setup f_2 225 f_2 1.2755 0.1867 0.18085 0 0 0 5 0
newdef f_2:WidthLoCut 0.175
newdef f_2:WidthUpCut 0.1867
create ThePEG::ParticleData f'_2
setup f'_2 335 f'_2 1.5174 0.086 0.344 0 0 0 5 0
create ThePEG::ParticleData chi_c2
setup chi_c2 445 chi_c2 3.55617 0.00197 0.0206 0 0 0 5 0
create ThePEG::ParticleData chi_b2
setup chi_b2 555 chi_b2 9.91221 0.00017 0.0017 0 0 0 5 0
create ThePEG::ParticleData K*_2+
setup K*_2+ 325 K*_2+ 1.4273 0.1 0.2 0 3 0 5 0
create ThePEG::ParticleData K*_20
setup K*_20 315 K*_20 1.4324 0.109 0.218 0 0 0 5 0
create ThePEG::ParticleData K*_2-
setup K*_2- -325 K*_2- 1.4273 0.1 0.2 0 -3 0 5 0
makeanti K*_2- K*_2+
create ThePEG::ParticleData K*_2bar0
setup K*_2bar0 -315 K*_2bar0 1.4324 0.109 0.218 0 0 0 5 0
makeanti K*_2bar0 K*_20
create ThePEG::ParticleData D*_20
setup D*_20 425 D*_20 2.4611 0.0473 0.2365 0 0 0 5 0
create ThePEG::ParticleData D*_2+
setup D*_2+ 415 D*_2+ 2.4611 0.0473 0.2365 0 3 0 5 0
create ThePEG::ParticleData D*_2bar0
setup D*_2bar0 -425 D*_2bar0 2.4611 0.0473 0.2365 0 0 0 5 0
makeanti D*_2bar0 D*_20
create ThePEG::ParticleData D*_2-
setup D*_2- -415 D*_2- 2.4611 0.0473 0.2365 0 -3 0 5 0
makeanti D*_2- D*_2+
create ThePEG::ParticleData D_s2+
setup D_s2+ 435 D_s2+ 2.5691 0.0169 0.0507 0 3 0 5 0
create ThePEG::ParticleData D_s2-
setup D_s2- -435 D_s2- 2.5691 0.0169 0.0507 0 -3 0 5 0
makeanti D_s2- D_s2+
create ThePEG::ParticleData B_20
setup B_20 515 B_20 5.7395 0.0242 0.121 0 0 0 5 0
create ThePEG::ParticleData B_2+
setup B_2+ 525 B_2+ 5.7372 0.0242 0.121 0 3 0 5 0
create ThePEG::ParticleData B_2bar0
setup B_2bar0 -515 B_2bar0 5.7395 0.0242 0.121 0 0 0 5 0
makeanti B_2bar0 B_20
create ThePEG::ParticleData B_2-
setup B_2- -525 B_2- 5.7372 0.0242 0.121 0 -3 0 5 0
makeanti B_2- B_2+
create ThePEG::ParticleData B_s20
setup B_s20 535 B_s20 5.83986 0.00149 0.0149 0 0 0 5 0
create ThePEG::ParticleData B_s2bar0
setup B_s2bar0 -535 B_s2bar0 5.83986 0.00149 0.0149 0 0 0 5 0
makeanti B_s2bar0 B_s20
create ThePEG::ParticleData B_c2+
setup B_c2+ 545 B_c2+ 6.783 8.3E-5 0.00083 0 3 0 5 0
create ThePEG::ParticleData B_c2-
setup B_c2- -545 B_c2- 6.783 8.3E-5 0.00083 0 -3 0 5 0
makeanti B_c2- B_c2+
#
# the 1^1D_2 multiplet
#
create ThePEG::ParticleData pi_2+
setup pi_2+ 10215 pi_2+ 1.6706 0.258 0.258 0 3 0 5 0
create ThePEG::ParticleData pi_20
setup pi_20 10115 pi_20 1.6706 0.258 0.258 0 0 0 5 0
create ThePEG::ParticleData pi_2-
setup pi_2- -10215 pi_2- 1.6706 0.258 0.258 0 -3 0 5 0
makeanti pi_2- pi_2+
create ThePEG::ParticleData eta_2
setup eta_2 10225 eta_2 1.617 0.181 0.362 0 0 0 5 0
create ThePEG::ParticleData eta'_2
setup eta'_2 10335 eta'_2 1.842 0.225 0.225 0 0 0 5 0
create ThePEG::ParticleData eta_b2
setup eta_b2 10555 eta_b2 10.158 3.2E-5 0.00032 0 0 0 5 0
create ThePEG::ParticleData K_2(1770)+
setup K_2(1770)+ 10325 K_2(1770)+ 1.773 0.186 0.558 0 3 0 5 0
create ThePEG::ParticleData K_2(1770)0
setup K_2(1770)0 10315 K_2(1770)0 1.773 0.186 0.558 0 0 0 5 0
create ThePEG::ParticleData K_2(1770)-
setup K_2(1770)- -10325 K_2(1770)- 1.773 0.186 0.558 0 -3 0 5 0
makeanti K_2(1770)- K_2(1770)+
create ThePEG::ParticleData K_2(1770)bar0
setup K_2(1770)bar0 -10315 K_2(1770)bar0 1.773 0.186 0.558 0 0 0 5 0
makeanti K_2(1770)bar0 K_2(1770)0
create ThePEG::ParticleData B_c2(L)+
setup B_c2(L)+ 10545 B_c2(L)+ 7.036 8.3E-5 0.00083 0 3 0 5 0
create ThePEG::ParticleData B_c2(L)-
setup B_c2(L)- -10545 B_c2(L)- 7.036 8.3E-5 0.00083 0 -3 0 5 0
makeanti B_c2(L)- B_c2(L)+
#
# the 1^3D_1 multiplet
#
create ThePEG::ParticleData rho''+
setup rho''+ 30213 rho''+ 1.72 0.25 0.5 0 3 0 3 0
create ThePEG::ParticleData rho''0
setup rho''0 30113 rho''0 1.72 0.25 0.5 0 0 0 3 0
create ThePEG::ParticleData rho''-
setup rho''- -30213 rho''- 1.72 0.25 0.5 0 -3 0 3 0
makeanti rho''- rho''+
create ThePEG::ParticleData omega''
setup omega'' 30223 omega'' 1.67 0.315 0.63 0 0 0 3 0
create ThePEG::ParticleData phi(2170)
setup phi(2170) 30333 phi(2170) 2.162 0.1 0.3 0 0 0 3 0
create ThePEG::ParticleData psi(3770)
setup psi(3770) 30443 psi(3770) 3.7737 0.0272 0.0816 0 0 0 3 0
newdef psi(3770):WidthLoCut 0.0272
newdef psi(3770):WidthUpCut 0.136
create ThePEG::ParticleData Upsilon_1(1D)
setup Upsilon_1(1D) 30553 Upsilon_1(1D) 10.1551 3.56E-5 0.000356 0 0 0 3 0
create ThePEG::ParticleData K''*+
setup K''*+ 30323 K''*+ 1.718 0.322 0.322 0 3 0 3 0
create ThePEG::ParticleData K''*0
setup K''*0 30313 K''*0 1.718 0.322 0.322 0 0 0 3 0
create ThePEG::ParticleData K''*-
setup K''*- -30323 K''*- 1.718 0.322 0.322 0 -3 0 3 0
makeanti K''*- K''*+
create ThePEG::ParticleData K''*bar0
setup K''*bar0 -30313 K''*bar0 1.718 0.322 0.322 0 0 0 3 0
makeanti K''*bar0 K''*0
create ThePEG::ParticleData D_1*(2760)0
setup D_1*(2760)0 30423 D_1*(2760)0 2.781 0.177 0.354 0 0 0 3 0
create ThePEG::ParticleData D_1*(2760)+
setup D_1*(2760)+ 30413 D_1*(2760)+ 2.781 0.177 0.354 0 3 0 3 0
create ThePEG::ParticleData Dbar_1*(2760)0
setup Dbar_1*(2760)0 -30423 Dbar_1*(2760)0 2.781 0.177 0.354 0 0 0 3 0
makeanti Dbar_1*(2760)0 D_1*(2760)0
create ThePEG::ParticleData D_1*(2760)-
setup D_1*(2760)- -30413 D_1*(2760)- 2.781 0.177 0.354 0 -3 0 3 0
makeanti D_1*(2760)- D_1*(2760)+
create ThePEG::ParticleData D_s1*(2860)+
setup D_s1*(2860)+ 30433 D_s1*(2860)+ 2.859 0.159 0.318 0 3 0 3 0
create ThePEG::ParticleData D_s1*(2860)-
setup D_s1*(2860)- -30433 D_s1*(2860)- 2.859 0.159 0.318 0 -3 0 3 0
makeanti D_s1*(2860)- D_s1*(2860)+
create ThePEG::ParticleData B_c(1D)*+
setup B_c(1D)*+ 30543 B_c(1D)*+ 7.028 9.35E-5 0.000935 0 3 0 3 0
create ThePEG::ParticleData B_c(1D)*-
setup B_c(1D)*- -30543 B_c(1D)*- 7.028 9.35E-5 0.000935 0 -3 0 3 0
makeanti B_c(1D)*- B_c(1D)*+
#
# the 1^3D_2 multiplet
#
create ThePEG::ParticleData psi_2(1D)
setup psi_2(1D) 20445 psi_2(1D) 3.8237 0.00074 0.0074 0 0 0 5 0
create ThePEG::ParticleData Upsilon_2(1D)
setup Upsilon_2(1D) 20555 Upsilon_2(1D) 10.1637 2.8E-5 0.00028 0 0 0 5 0
create ThePEG::ParticleData K_2(1820)+
setup K_2(1820)+ 20325 K_2(1820)+ 1.819 0.264 0.528 0 3 0 5 0
create ThePEG::ParticleData K_2(1820)0
setup K_2(1820)0 20315 K_2(1820)0 1.819 0.264 0.528 0 0 0 5 0
create ThePEG::ParticleData K_2(1820)-
setup K_2(1820)- -20325 K_2(1820)- 1.819 0.264 0.528 0 -3 0 5 0
makeanti K_2(1820)- K_2(1820)+
create ThePEG::ParticleData K_2(1820)bar0
setup K_2(1820)bar0 -20315 K_2(1820)bar0 1.819 0.264 0.528 0 0 0 5 0
makeanti K_2(1820)bar0 K_2(1820)0
create ThePEG::ParticleData D_2(2740)0
setup D_2(2740)0 20425 D_2(2740)0 2.747 0.088 0.264 0 0 0 5 0
create ThePEG::ParticleData D_2(2740)+
setup D_2(2740)+ 20415 D_2(2740)+ 2.747 0.088 0.264 0 3 0 5 0
create ThePEG::ParticleData Dbar_2(2740)0
setup Dbar_2(2740)0 -20425 Dbar_2(2740)0 2.747 0.088 0.264 0 0 0 5 0
makeanti Dbar_2(2740)0 D_2(2740)0
create ThePEG::ParticleData D_2(2740)-
setup D_2(2740)- -20415 D_2(2740)- 2.747 0.088 0.264 0 -3 0 5 0
makeanti D_2(2740)- D_2(2740)+
create ThePEG::ParticleData D_s2(2850)+
setup D_s2(2850)+ 20435 D_s2(2850)+ 2.851 0.052 0.156 0 3 0 5 0
create ThePEG::ParticleData D_s2(2850)-
setup D_s2(2850)- -20435 D_s2(2850)- 2.851 0.052 0.156 0 -3 0 5 0
makeanti D_s2(2850)- D_s2(2850)+
create ThePEG::ParticleData B_c2(H)+
setup B_c2(H)+ 20545 B_c2(H)+ 7.041 9.3E-5 0.00093 0 3 0 5 0
create ThePEG::ParticleData B_c2(H)-
setup B_c2(H)- -20545 B_c2(H)- 7.041 9.3E-5 0.00093 0 -3 0 5 0
makeanti B_c2(H)- B_c2(H)+
#
# the 1^3D_3 multiplet
#
create ThePEG::ParticleData rho_3+
setup rho_3+ 217 rho_3+ 1.6888 0.161 0.592 0 3 0 7 0
newdef rho_3+:WidthLoCut 0.54
newdef rho_3+:WidthUpCut 0.644
create ThePEG::ParticleData rho_30
setup rho_30 117 rho_30 1.6888 0.161 0.592 0 0 0 7 0
newdef rho_30:WidthLoCut 0.54
newdef rho_30:WidthUpCut 0.644
create ThePEG::ParticleData rho_3-
setup rho_3- -217 rho_3- 1.6888 0.161 0.592 0 -3 0 7 0
makeanti rho_3- rho_3+
newdef rho_3-:WidthLoCut 0.54
newdef rho_3-:WidthUpCut 0.644
create ThePEG::ParticleData omega_3
setup omega_3 227 omega_3 1.667 0.168 0.336 0 0 0 7 0
create ThePEG::ParticleData phi_3
setup phi_3 337 phi_3 1.854 0.087 0.435 0 0 0 7 0
create ThePEG::ParticleData psi_3(1D)
setup psi_3(1D) 447 psi_3(1D) 3.84271 0.0028 0.014 0 0 0 7 0
create ThePEG::ParticleData Upsilon_3(1D)
setup Upsilon_3(1D) 557 Upsilon_3(1D) 10.1651 2.55E-5 0.000255 0 0 0 7 0
create ThePEG::ParticleData K_3*+
setup K_3*+ 327 K_3*+ 1.779 0.161 0.477 0 3 0 7 0
create ThePEG::ParticleData K_3*0
setup K_3*0 317 K_3*0 1.779 0.161 0.477 0 0 0 7 0
create ThePEG::ParticleData K_3*-
setup K_3*- -327 K_3*- 1.779 0.161 0.477 0 -3 0 7 0
makeanti K_3*- K_3*+
create ThePEG::ParticleData K_3*bar0
setup K_3*bar0 -317 K_3*bar0 1.779 0.161 0.477 0 0 0 7 0
makeanti K_3*bar0 K_3*0
create ThePEG::ParticleData D_3*(2750)0
setup D_3*(2750)0 427 D_3*(2750)0 2.7631 0.066 0.192 0 0 0 7 0
create ThePEG::ParticleData D_3*(2750)+
setup D_3*(2750)+ 417 D_3*(2750)+ 2.7631 0.066 0.192 0 3 0 7 0
create ThePEG::ParticleData Dbar_3*(2750)0
setup Dbar_3*(2750)0 -427 Dbar_3*(2750)0 2.7631 0.066 0.192 0 0 0 7 0
makeanti Dbar_3*(2750)0 D_3*(2750)0
create ThePEG::ParticleData D_3*(2750)-
setup D_3*(2750)- -417 D_3*(2750)- 2.7631 0.066 0.192 0 -3 0 7 0
makeanti D_3*(2750)- D_3*(2750)+
create ThePEG::ParticleData D_s3*(2860)+
setup D_s3*(2860)+ 437 D_s3*(2860)+ 2.86 0.053 0.159 0 3 0 7 0
create ThePEG::ParticleData D_s3*(2860)-
setup D_s3*(2860)- -437 D_s3*(2860)- 2.86 0.053 0.159 0 -3 0 7 0
makeanti D_s3*(2860)- D_s3*(2860)+
create ThePEG::ParticleData B_c3(1D)*+
setup B_c3(1D)*+ 547 B_c3(1D)*+ 7.045 8.23E-5 0.000823 0 3 0 7 0
create ThePEG::ParticleData B_c3(1D)*-
setup B_c3(1D)*- -547 B_c3(1D)*- 7.045 8.23E-5 0.000823 0 -3 0 7 0
makeanti B_c3(1D)*- B_c3(1D)*+
#
# the 1^3F_4 multiplet
#
#
# the 2^1S_0 multiplet
#
create ThePEG::ParticleData pi'+
setup pi'+ 100211 pi'+ 1.3 0.4 0.4 0 3 0 1 0
create ThePEG::ParticleData pi'0
setup pi'0 100111 pi'0 1.3 0.4 0.4 0 0 0 1 0
create ThePEG::ParticleData pi'-
setup pi'- -100211 pi'- 1.3 0.4 0.4 0 -3 0 1 0
makeanti pi'- pi'+
create ThePEG::ParticleData eta(1295)
setup eta(1295) 100221 eta(1295) 1.294 0.055 0.395 0 0 0 1 0
newdef eta(1295):WidthLoCut 0.24
newdef eta(1295):WidthUpCut 0.55
create ThePEG::ParticleData eta(1475)
setup eta(1475) 100331 eta(1475) 1.475 0.09 0.174 0 0 0 1 0
create ThePEG::ParticleData eta_c(2S)
setup eta_c(2S) 100441 eta_c(2S) 3.6375 0.0113 0.113 0 0 0 1 0
create ThePEG::ParticleData eta_b(2S)
setup eta_b(2S) 100551 eta_b(2S) 9.999 0.0041 0.041 0 0 0 1 0
create ThePEG::ParticleData K'+
setup K'+ 100321 K'+ 1.46 0.26 0.26 0 3 0 1 0
create ThePEG::ParticleData K'0
setup K'0 100311 K'0 1.46 0.26 0.26 0 0 0 1 0
create ThePEG::ParticleData K'-
setup K'- -100321 K'- 1.46 0.26 0.26 0 -3 0 1 0
makeanti K'- K'+
create ThePEG::ParticleData K'bar0
setup K'bar0 -100311 K'bar0 1.46 0.26 0.26 0 0 0 1 0
makeanti K'bar0 K'0
create ThePEG::ParticleData D_0(2550)0
setup D_0(2550)0 100421 D_0(2550)0 2.549 0.165 0.33 0 0 0 1 0
create ThePEG::ParticleData D_0(2550)+
setup D_0(2550)+ 100411 D_0(2550)+ 2.549 0.165 0.33 0 3 0 1 0
create ThePEG::ParticleData Dbar_0(2550)0
setup Dbar_0(2550)0 -100421 Dbar_0(2550)0 2.549 0.165 0.33 0 0 0 1 0
makeanti Dbar_0(2550)0 D_0(2550)0
create ThePEG::ParticleData D_0(2550)-
setup D_0(2550)- -100411 D_0(2550)- 2.549 0.165 0.33 0 -3 0 1 0
makeanti D_0(2550)- D_0(2550)+
create ThePEG::ParticleData D_s0(2590)+
setup D_s0(2590)+ 100431 D_s0(2590)+ 2.591 0.089 0.267 0 3 0 1 0
create ThePEG::ParticleData D_s0(2590)-
setup D_s0(2590)- -100431 D_s0(2590)- 2.591 0.089 0.267 0 -3 0 1 0
makeanti D_s0(2590)- D_s0(2590)+
create ThePEG::ParticleData B_c(2S)+
setup B_c(2S)+ 100541 B_c(2S)+ 6.8712 6.5E-5 0.00065 0 3 0 1 0
create ThePEG::ParticleData B_c(2S)-
setup B_c(2S)- -100541 B_c(2S)- 6.8712 6.5E-5 0.00065 0 -3 0 1 0
makeanti B_c(2S)- B_c(2S)+
#
# the 2^3S_1 multiplet
#
create ThePEG::ParticleData rho'+
setup rho'+ 100213 rho'+ 1.465 0.4 0.4 0 3 0 3 0
create ThePEG::ParticleData rho'0
setup rho'0 100113 rho'0 1.465 0.4 0.4 0 0 0 3 0
create ThePEG::ParticleData rho'-
setup rho'- -100213 rho'- 1.465 0.4 0.4 0 -3 0 3 0
makeanti rho'- rho'+
create ThePEG::ParticleData omega'
setup omega' 100223 omega' 1.41 0.29 0.3225 0 0 0 3 0
newdef omega':WidthLoCut 0.215
newdef omega':WidthUpCut 0.43
create ThePEG::ParticleData phi'
setup phi' 100333 phi' 1.68 0.15 0.3 0 0 0 3 0
create ThePEG::ParticleData psi(2S)
setup psi(2S) 100443 psi(2S) 3.6861 0.000294 0.00337 0 0 0 3 0
create ThePEG::ParticleData Upsilon(2S)
setup Upsilon(2S) 100553 Upsilon(2S) 10.02326 3.198E-5 0.0003198 0 0 0 3 0
create ThePEG::ParticleData K'*+
setup K'*+ 100323 K'*+ 1.414 0.232 0.464 0 3 0 3 0
create ThePEG::ParticleData K'*0
setup K'*0 100313 K'*0 1.414 0.232 0.464 0 0 0 3 0
create ThePEG::ParticleData K'*-
setup K'*- -100323 K'*- 1.414 0.232 0.464 0 -3 0 3 0
makeanti K'*- K'*+
create ThePEG::ParticleData K'*bar0
setup K'*bar0 -100313 K'*bar0 1.414 0.232 0.464 0 0 0 3 0
makeanti K'*bar0 K'*0
create ThePEG::ParticleData D_1*(2600)0
setup D_1*(2600)0 100423 D_1*(2600)0 2.627 0.141 0.282 0 0 0 3 0
create ThePEG::ParticleData D_1*(2600)+
setup D_1*(2600)+ 100413 D_1*(2600)+ 2.627 0.141 0.282 0 3 0 3 0
create ThePEG::ParticleData Dbar_1*(2600)0
setup Dbar_1*(2600)0 -100423 Dbar_1*(2600)0 2.627 0.141 0.282 0 0 0 3 0
makeanti Dbar_1*(2600)0 D_1*(2600)0
create ThePEG::ParticleData D_1*(2600)-
setup D_1*(2600)- -100413 D_1*(2600)- 2.627 0.141 0.282 0 -3 0 3 0
makeanti D_1*(2600)- D_1*(2600)+
create ThePEG::ParticleData D_s1*(2700)+
setup D_s1*(2700)+ 100433 D_s1*(2700)+ 2.714 0.122 0.244 0 3 0 3 0
create ThePEG::ParticleData D_s1*(2700)-
setup D_s1*(2700)- -100433 D_s1*(2700)- 2.714 0.122 0.244 0 -3 0 3 0
makeanti D_s1*(2700)- D_s1*(2700)+
create ThePEG::ParticleData B_c(2S)*+
setup B_c(2S)*+ 100543 B_c(2S)*+ 6.8752 7.2E-5 0.00072 0 3 0 3 0
create ThePEG::ParticleData B_c(2S)*-
setup B_c(2S)*- -100543 B_c(2S)*- 6.8752 7.2E-5 0.00072 0 -3 0 3 0
makeanti B_c(2S)*- B_c(2S)*+
#
# the 2^1P_1 multiplet
#
create ThePEG::ParticleData h_b(2P)
setup h_b(2P) 110553 h_b(2P) 10.2598 8.0E-5 0.0008 0 0 0 3 0
#
# the 2^3P_0 multiplet
#
create ThePEG::ParticleData chi_b0(2P)
setup chi_b0(2P) 110551 chi_b0(2P) 10.2325 0.000887 0.00887 0 0 0 1 0
#
# the 2^3P_1 multiplet
#
create ThePEG::ParticleData chi_b1(2P)
setup chi_b1(2P) 120553 chi_b1(2P) 10.25546 7.87E-5 0.000787 0 0 0 3 0
#
# the 2^3P_2 multiplet
#
create ThePEG::ParticleData chi_c2(2P)
setup chi_c2(2P) 100445 chi_c2(2P) 3.929 0.029 0.24 0 0 0 5 0
newdef chi_c2(2P):WidthLoCut 0.19
newdef chi_c2(2P):WidthUpCut 0.29
create ThePEG::ParticleData chi_b2(2P)
setup chi_b2(2P) 100555 chi_b2(2P) 10.26865 0.0001847 0.001847 0 0 0 5 0
#
# the 2^1D_2 multiplet
#
#
# the 2^3D_1 multiplet
#
create ThePEG::ParticleData Upsilon_1(2D)
setup Upsilon_1(2D) 130553 Upsilon_1(2D) 10.435 2.64E-5 0.000264 0 0 0 3 0
#
# the 2^3D_2 multiplet
#
create ThePEG::ParticleData Upsilon_2(2D)
setup Upsilon_2(2D) 120555 Upsilon_2(2D) 10.441 2.23E-5 0.000223 0 0 0 5 0
#
# the 2^3D_3 multiplet
#
create ThePEG::ParticleData Upsilon_3(2D)
setup Upsilon_3(2D) 100557 Upsilon_3(2D) 10.444 2.02E-5 0.000202 0 0 0 7 0
#
# the 3^1S_0 multiplet
#
create ThePEG::ParticleData eta_b(3S)
setup eta_b(3S) 200551 eta_b(3S) 10.337 0.0027 0.027 0 0 0 1 0
#
# the 3^3S_1 multiplet
#
create ThePEG::ParticleData Upsilon(3S)
setup Upsilon(3S) 200553 Upsilon(3S) 10.3552 2.032E-5 0.0002032 0 0 0 3 0
#
# the 3^1P_1 multiplet
#
#
# the 3^3P_0 multiplet
#
create ThePEG::ParticleData chi_b0(3P)
setup chi_b0(3P) 210551 chi_b0(3P) 10.5007 0.00071 0.0071 0 0 0 1 0
#
# the 3^3P_1 multiplet
#
create ThePEG::ParticleData chi_b1(3P)
setup chi_b1(3P) 220553 chi_b1(3P) 10.5134 6.6E-5 0.00066 0 0 0 3 0
#
# the 3^3P_2 multiplet
#
create ThePEG::ParticleData chi_b2(3P)
setup chi_b2(3P) 200555 chi_b2(3P) 10.524 0.000146 0.00146 0 0 0 5 0
#
# the 4^3S_1 multiplet
#
create ThePEG::ParticleData Upsilon(4S)
setup Upsilon(4S) 300553 Upsilon(4S) 10.5794 0.0205 0.11275 0 0 0 3 0
newdef Upsilon(4S):WidthLoCut 0.0205
newdef Upsilon(4S):WidthUpCut 0.205
#
# the 5^3S_1 multiplet
#
create ThePEG::ParticleData Upsilon(5S)
setup Upsilon(5S) 9000553 Upsilon(5S) 10.8852 0.037 0.185 0 0 0 3 0
#
# The meson which are not part of a multiplet
#
create ThePEG::ParticleData f_0(1500)
setup f_0(1500) 9030221 f_0(1500) 1.506 0.112 0.336 0 0 0 1 0
newdef f_0(1500):VariableRatio 1
create ThePEG::ParticleData sigma
setup sigma 9000221 sigma 0.86 0.88 1.155 0 0 0 1 0
newdef sigma:WidthLoCut 0.55
newdef sigma:WidthUpCut 1.76
create ThePEG::ParticleData f_0
setup f_0 9010221 f_0 0.965 0.1635 0.384 0 0 0 1 0
newdef f_0:VariableRatio 1
newdef f_0:WidthLoCut 0.256
newdef f_0:WidthUpCut 0.512
create ThePEG::ParticleData a_00
setup a_00 9000111 a_00 0.999 0.1778 0.4 0 0 0 1 0
newdef a_00:VariableRatio 1
newdef a_00:WidthLoCut 0.24
newdef a_00:WidthUpCut 0.56
create ThePEG::ParticleData a_0+
setup a_0+ 9000211 a_0+ 0.999 0.1778 0.4 0 3 0 1 0
newdef a_0+:VariableRatio 1
newdef a_0+:WidthLoCut 0.24
newdef a_0+:WidthUpCut 0.56
create ThePEG::ParticleData a_0-
setup a_0- -9000211 a_0- 0.999 0.1778 0.4 0 -3 0 1 0
makeanti a_0- a_0+
newdef a_0-:VariableRatio 1
newdef a_0-:WidthLoCut 0.24
newdef a_0-:WidthUpCut 0.56
create ThePEG::ParticleData eta(1405)
setup eta(1405) 9020221 eta(1405) 1.4098 0.0511 0.38325 0 0 0 1 0
newdef eta(1405):WidthLoCut 0.2555
newdef eta(1405):WidthUpCut 0.511
create ThePEG::ParticleData K_S0
setup K_S0 310 K_S0 0.497611 7.3514250055883E-15 0 26.842 0 0 1 0
create ThePEG::ParticleData K_L0
setup K_L0 130 K_L0 0.497611 1.2871947162427E-17 0 15330 0 0 1 1
create ThePEG::ParticleData kappa0
setup kappa0 9000311 kappa0 0.845 0.468 0.5895 0 0 0 1 0
newdef kappa0:WidthLoCut 0.207
newdef kappa0:WidthUpCut 0.972
create ThePEG::ParticleData kappabar0
setup kappabar0 -9000311 kappabar0 0.845 0.468 0.5895 0 0 0 1 0
makeanti kappabar0 kappa0
newdef kappabar0:WidthLoCut 0.207
newdef kappabar0:WidthUpCut 0.972
create ThePEG::ParticleData kappa-
setup kappa- -9000321 kappa- 0.845 0.468 0.5895 0 -3 0 1 0
newdef kappa-:WidthLoCut 0.207
newdef kappa-:WidthUpCut 0.972
create ThePEG::ParticleData kappa+
setup kappa+ 9000321 kappa+ 0.845 0.468 0.5895 0 3 0 1 0
makeanti kappa+ kappa-
newdef kappa+:WidthLoCut 0.207
newdef kappa+:WidthUpCut 0.972
diff --git a/src/snippets/Makefile.am b/src/snippets/Makefile.am
--- a/src/snippets/Makefile.am
+++ b/src/snippets/Makefile.am
@@ -1,50 +1,51 @@
BUILT_SOURCES = done-all-links
snippetsdir = ${pkgdatadir}/snippets
INPUTFILES = \
CellGridSampler.in \
Diffraction.in \
DipoleMerging.in \
DipoleShowerFiveFlavours.in \
DipoleShowerFourFlavours.in \
EECollider.in \
EPCollider.in \
PECollider.in \
HepMCFixedOrder.in \
HepMC.in \
Matchbox.in \
MB-DipoleShower.in \
MB.in \
MonacoSampler.in \
Particles-SetLonglivedParticlesStable.in \
PDF-CT10.in \
PDF-NNPDF30NLO.in \
+PionPDF.in \
PPCollider.in \
RivetFixedOrder.in \
Rivet.in \
YFS.in \
CMWinQtiledShower.in \
Dipole_AutoTunes_gss.in \
Tune-DotProduct.in \
Tune-DotProduct-Veto.in \
Tune-pT.in \
Tune-Q2.in \
EvolutionScheme-DotProduct.in \
EvolutionScheme-DotProduct-Veto.in \
EvolutionScheme-pT.in \
EvolutionScheme-Q2.in \
FixedTarget.in \
FixedTarget-PP.in \
H7Hadrons.in
dist_snippets_DATA = $(INPUTFILES)
CLEANFILES = done-all-links
done-all-links: $(INPUTFILES)
@echo "Linking input files"
@for i in $(INPUTFILES); do \
if test -f $(srcdir)/$$i -a ! -e $$i; then \
$(LN_S) -f $(srcdir)/$$i; fi; done
@touch done-all-links
diff --git a/src/snippets/PionPDF.in b/src/snippets/PionPDF.in
new file mode 100644
--- /dev/null
+++ b/src/snippets/PionPDF.in
@@ -0,0 +1,21 @@
+# -*- ThePEG-repository -*-
+
+#=============================================================================
+# Set up for charged pion beams
+#
+# The LHAPDF6 library must be available to use this snippet.
+#=============================================================================
+
+cd /Herwig/Partons
+create ThePEG::LHAPDF PionPDF ThePEGLHAPDF.so
+set PionPDF:PDFName xFitterPI_NLO_EIG
+cp HadronRemnants PionRemnants
+cp RemnantDecayer PionRemnantDecayer
+set PionRemnantDecayer:AllowTop Yes
+set PionRemnants:RemnantDecayer PionRemnantDecayer
+set PionPDF:RemnantHandler PionRemnants
+set /Herwig/Particles/pi+:PDF PionPDF
+set /Herwig/Particles/pi-:PDF PionPDF
+
+cd /
+

File Metadata

Mime Type
text/x-diff
Expires
Sat, Dec 21, 3:17 PM (1 d, 6 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4023258
Default Alt Text
(197 KB)

Event Timeline