Page MenuHomeHEPForge

No OneTemporary

diff --git a/Decay/General/GeneralTwoBodyDecayer.cc b/Decay/General/GeneralTwoBodyDecayer.cc
--- a/Decay/General/GeneralTwoBodyDecayer.cc
+++ b/Decay/General/GeneralTwoBodyDecayer.cc
@@ -1,835 +1,837 @@
// -*- C++ -*-
//
// GeneralTwoBodyDecayer.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 GeneralTwoBodyDecayer class.
//
#include "GeneralTwoBodyDecayer.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/DecayMode.h"
#include "ThePEG/Utilities/Exception.h"
#include "Herwig/Shower/RealEmissionProcess.h"
#include "Herwig/Utilities/Kinematics.h"
-#include "Herwig/Shower/QTilde/Dark/HiddenValleyModel.h"
+#include "Herwig/Models/HiddenValley/HiddenValleyModel.h"
using namespace Herwig;
ParticleVector GeneralTwoBodyDecayer::decay(const Particle & parent,
const tPDVector & children) const {
// return empty vector if products heavier than parent
Energy mout(ZERO);
for(tPDVector::const_iterator it=children.begin();
it!=children.end();++it) mout+=(**it).massMin();
if(mout>parent.mass()) return ParticleVector();
// generate the decay
bool cc;
int imode=modeNumber(cc,parent.dataPtr(),children);
// generate the kinematics
ParticleVector decay=generate(generateIntermediates(),cc,imode,parent);
// make the colour connections
colourConnections(parent, decay);
// return the answer
return decay;
}
void GeneralTwoBodyDecayer::doinit() {
PerturbativeDecayer::doinit();
assert( incoming_ && outgoing_.size()==2);
//create phase space mode
addMode(new_ptr(PhaseSpaceMode(incoming_,{outgoing_[0],outgoing_[1]},
maxWeight_)));
+
+ _HVmodel = dynamic_ptr_cast<tHiddenValleyPtr>(generator()->standardModel());
}
int GeneralTwoBodyDecayer::modeNumber(bool & cc, tcPDPtr parent,
const tPDVector & children) const {
long parentID = parent->id();
long id1 = children[0]->id();
long id2 = children[1]->id();
cc = false;
long out1 = outgoing_[0]->id();
long out2 = outgoing_[1]->id();
if( parentID == incoming_->id() &&
((id1 == out1 && id2 == out2) ||
(id1 == out2 && id2 == out1)) ) {
return 0;
}
else if(incoming_->CC() && parentID == incoming_->CC()->id()) {
cc = true;
if( outgoing_[0]->CC()) out1 = outgoing_[0]->CC()->id();
if( outgoing_[1]->CC()) out2 = outgoing_[1]->CC()->id();
if((id1 == out1 && id2 == out2) ||
(id1 == out2 && id2 == out1)) return 0;
}
return -1;
}
void GeneralTwoBodyDecayer::
colourConnections(const Particle & parent,
const ParticleVector & out) const {
PDT::Colour incColour(parent.data().iColour());
PDT::Colour outaColour(out[0]->data().iColour());
PDT::Colour outbColour(out[1]->data().iColour());
//incoming colour singlet
if(incColour == PDT::Colour0) {
// colour triplet-colourantitriplet
if((outaColour == PDT::Colour3 && outbColour == PDT::Colour3bar) ||
(outaColour == PDT::Colour3bar && outbColour == PDT::Colour3)) {
bool ac(out[0]->id() < 0);
out[0]->colourNeighbour(out[1],!ac);
}
//colour octet
else if(outaColour == PDT::Colour8 && outbColour == PDT::Colour8) {
out[0]->colourNeighbour(out[1]);
out[0]->antiColourNeighbour(out[1]);
}
// colour singlets
else if(outaColour == PDT::Colour0 && outbColour == PDT::Colour0) {
}
// unknown
else
throw Exception() << "Unknown outgoing colours for decaying "
<< "colour singlet in "
<< "GeneralTwoBodyDecayer::colourConnections "
<< outaColour << " " << outbColour
<< Exception::runerror;
}
//incoming colour triplet
else if(incColour == PDT::Colour3) {
// colour triplet + singlet
if(outaColour == PDT::Colour3 && outbColour == PDT::Colour0) {
out[0]->incomingColour(const_ptr_cast<tPPtr>(&parent));
}
//opposite order
else if(outaColour == PDT::Colour0 && outbColour == PDT::Colour3) {
out[1]->incomingColour(const_ptr_cast<tPPtr>(&parent));
}
// octet + triplet
else if(outaColour == PDT::Colour8 && outbColour == PDT::Colour3) {
out[0]->incomingColour(const_ptr_cast<tPPtr>(&parent));
out[1]->antiColourNeighbour(out[0]);
}
//opposite order
else if(outaColour == PDT::Colour3 && outbColour == PDT::Colour8) {
out[1]->incomingColour(const_ptr_cast<tPPtr>(&parent));
out[0]->antiColourNeighbour(out[1]);
}
else if(outaColour == PDT::Colour3bar && outaColour == PDT::Colour3bar) {
tColinePtr col[2] = {ColourLine::create(out[0],true),
ColourLine::create(out[1],true)};
parent.colourLine()->setSinkNeighbours(col[0],col[1]);
}
else
throw Exception() << "Unknown outgoing colours for decaying "
<< "colour triplet in "
<< "GeneralTwoBodyDecayer::colourConnections() "
<< outaColour << " " << outbColour
<< Exception::runerror;
}
// incoming colour anti triplet
else if(incColour == PDT::Colour3bar) {
// colour antitriplet +singlet
if(outaColour == PDT::Colour3bar && outbColour == PDT::Colour0) {
out[0]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
}
//opposite order
else if(outaColour == PDT::Colour0 && outbColour == PDT::Colour3bar) {
out[1]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
}
//octet + antitriplet
else if(outaColour == PDT::Colour3bar && outbColour == PDT::Colour8) {
out[1]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
out[0]->colourNeighbour(out[1]);
}
//opposite order
else if(outaColour == PDT::Colour8 && outbColour == PDT::Colour3bar) {
out[0]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
out[1]->colourNeighbour(out[0]);
}
else if(outaColour == PDT::Colour3 && outbColour == PDT::Colour3) {
tColinePtr col[2] = {ColourLine::create(out[0]),
ColourLine::create(out[1])};
parent.antiColourLine()->setSourceNeighbours(col[0],col[1]);
}
else
throw Exception() << "Unknown outgoing colours for decaying "
<< "colour antitriplet "
<< "in GeneralTwoBodyDecayer::colourConnections() "
<< outaColour << " " << outbColour
<< Exception::runerror;
}
//incoming colour octet
else if(incColour == PDT::Colour8) {
// triplet-antitriplet
if(outaColour == PDT::Colour3&&outbColour == PDT::Colour3bar) {
out[0]->incomingColour(const_ptr_cast<tPPtr>(&parent));
out[1]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
}
// opposite order
else if(outbColour == PDT::Colour3&&outaColour == PDT::Colour3bar) {
out[0]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
out[1]->incomingColour(const_ptr_cast<tPPtr>(&parent));
}
// neutral octet
else if(outaColour == PDT::Colour0&&outbColour == PDT::Colour8) {
out[1]->incomingColour(const_ptr_cast<tPPtr>(&parent));
out[1]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
}
else if(outbColour == PDT::Colour0&&outaColour == PDT::Colour8) {
out[0]->incomingColour(const_ptr_cast<tPPtr>(&parent));
out[0]->incomingAntiColour(const_ptr_cast<tPPtr>(&parent));
}
else
throw Exception() << "Unknown outgoing colours for decaying "
<< "colour octet "
<< "in GeneralTwoBodyDecayer::colourConnections() "
<< outaColour << " " << outbColour
<< Exception::runerror;
}
else if(incColour == PDT::Colour6) {
if(outaColour == PDT::Colour3 && outbColour == PDT::Colour3) {
tPPtr tempParent = const_ptr_cast<tPPtr>(&parent);
Ptr<MultiColour>::pointer parentColour =
dynamic_ptr_cast<Ptr<MultiColour>::pointer>
(tempParent->colourInfo());
tColinePtr line1 = const_ptr_cast<tColinePtr>(parentColour->colourLines()[0]);
line1->addColoured(dynamic_ptr_cast<tPPtr>(out[0]));
tColinePtr line2 = const_ptr_cast<tColinePtr>(parentColour->colourLines()[1]);
line2->addColoured(dynamic_ptr_cast<tPPtr>(out[1]));
}
else
throw Exception() << "Unknown outgoing colours for decaying "
<< "colour sextet "
<< "in GeneralTwoBodyDecayer::colourConnections() "
<< outaColour << " " << outbColour
<< Exception::runerror;
}
else if(incColour == PDT::Colour6bar) {
if(outaColour == PDT::Colour3bar && outbColour == PDT::Colour3bar) {
tPPtr tempParent = const_ptr_cast<tPPtr>(&parent);
Ptr<MultiColour>::pointer parentColour =
dynamic_ptr_cast<Ptr<MultiColour>::pointer>
(tempParent->colourInfo());
tColinePtr line1 = const_ptr_cast<tColinePtr>(parentColour->antiColourLines()[0]);
line1->addAntiColoured(dynamic_ptr_cast<tPPtr>(out[0]));
tColinePtr line2 = const_ptr_cast<tColinePtr>(parentColour->antiColourLines()[1]);
line2->addAntiColoured(dynamic_ptr_cast<tPPtr>(out[1]));
}
else
throw Exception() << "Unknown outgoing colours for decaying "
<< "colour anti-sextet "
<< "in GeneralTwoBodyDecayer::colourConnections() "
<< outaColour << " " << outbColour
<< Exception::runerror;
}
else
throw Exception() << "Unknown incoming colour in "
<< "GeneralTwoBodyDecayer::colourConnections() "
<< incColour
<< Exception::runerror;
}
bool GeneralTwoBodyDecayer::twoBodyMEcode(const DecayMode & dm, int & mecode,
double & coupling) const {
assert(dm.parent()->id() == incoming_->id());
ParticleMSet::const_iterator pit = dm.products().begin();
long id1 = (*pit)->id();
++pit;
long id2 = (*pit)->id();
long id1t(outgoing_[0]->id()), id2t(outgoing_[1]->id());
mecode = -1;
coupling = 1.;
if( id1 == id1t && id2 == id2t ) {
return true;
}
else if( id1 == id2t && id2 == id1t ) {
return false;
}
else
assert(false);
return false;
}
void GeneralTwoBodyDecayer::persistentOutput(PersistentOStream & os) const {
- os << incoming_ << outgoing_ << maxWeight_;
+ os << incoming_ << outgoing_ << maxWeight_ << _HVmodel;
}
void GeneralTwoBodyDecayer::persistentInput(PersistentIStream & is, int) {
- is >> incoming_ >> outgoing_ >> maxWeight_;
+ is >> incoming_ >> outgoing_ >> maxWeight_ >> _HVmodel;
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeAbstractClass<GeneralTwoBodyDecayer,PerturbativeDecayer>
describeHerwigGeneralTwoBodyDecayer("Herwig::GeneralTwoBodyDecayer", "Herwig.so");
void GeneralTwoBodyDecayer::Init() {
static ClassDocumentation<GeneralTwoBodyDecayer> documentation
("This class is designed to be a base class for all 2 body decays"
"in a general model");
}
double GeneralTwoBodyDecayer::brat(const DecayMode &, const Particle & p,
double oldbrat) const {
ParticleVector children = p.children();
if( children.size() != 2 || !p.data().widthGenerator() )
return oldbrat;
// partial width for this mode
Energy scale = p.mass();
Energy pwidth =
partialWidth( make_pair(p.dataPtr(), scale),
make_pair(children[0]->dataPtr(), children[0]->mass()),
make_pair(children[1]->dataPtr(), children[1]->mass()) );
Energy width = p.data().widthGenerator()->width(p.data(), scale);
return pwidth/width;
}
void GeneralTwoBodyDecayer::doinitrun() {
PerturbativeDecayer::doinitrun();
for(unsigned int ix=0;ix<numberModes();++ix) {
double fact = pow(1.5,int(mode(ix)->incoming().first->iSpin())-1);
mode(ix)->maxWeight(fact*mode(ix)->maxWeight());
}
}
double GeneralTwoBodyDecayer::colourFactor(tcPDPtr in, tcPDPtr out1,
tcPDPtr out2) const {
// identical particle symmetry factor
double output = out1->id()==out2->id() ? 0.5 : 1.;
// colour neutral incoming particle
if(in->iColour()==PDT::Colour0) {
// both colour neutral
if(out1->iColour()==PDT::Colour0 && out2->iColour()==PDT::Colour0)
output *= 1.;
// colour triplet/ antitriplet
else if((out1->iColour()==PDT::Colour3 && out2->iColour()==PDT::Colour3bar) ||
(out1->iColour()==PDT::Colour3bar && out2->iColour()==PDT::Colour3 ) ) {
output *= 3.;
}
// colour octet colour octet
else if(out1->iColour()==PDT::Colour8 && out2->iColour()==PDT::Colour8 ) {
output *= 8.;
}
else if((out1->iColour()==PDT::DarkColourFundamental
&& out2->iColour()==PDT::DarkColourAntiFundamental) ||
(out1->iColour()==PDT::DarkColourAntiFundamental
&& out2->iColour()==PDT::DarkColourFundamental)) {
- output *= 3.;
+ output *= _HVmodel->NC();
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour neutral particle in "
<< "GeneralTwoBodyDecayer::colourFactor() for "
<< in->PDGName() << " -> "
<< out1->PDGName() << " " << out2->PDGName()
<< Exception::runerror;
}
// triplet
else if(in->iColour()==PDT::Colour3) {
// colour triplet + neutral
if((out1->iColour()==PDT::Colour0 && out2->iColour()==PDT::Colour3) ||
(out1->iColour()==PDT::Colour3 && out2->iColour()==PDT::Colour0) ) {
output *= 1.;
}
// colour triplet + octet
else if((out1->iColour()==PDT::Colour8 && out2->iColour()==PDT::Colour3) ||
(out1->iColour()==PDT::Colour3 && out2->iColour()==PDT::Colour8) ) {
output *= 4./3.;
}
// colour anti triplet anti triplet
else if(out1->iColour()==PDT::Colour3bar &&
out2->iColour()==PDT::Colour3bar) {
output *= 2.;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour triplet particle in "
<< "GeneralTwoBodyDecayer::colourFactor() for "
<< in->PDGName() << " -> "
<< out1->PDGName() << " " << out2->PDGName()
<< Exception::runerror;
}
// anti triplet
else if(in->iColour()==PDT::Colour3bar) {
// colour anti triplet + neutral
if((out1->iColour()==PDT::Colour0 && out2->iColour()==PDT::Colour3bar ) ||
(out1->iColour()==PDT::Colour3bar && out2->iColour()==PDT::Colour0 ) ) {
output *= 1.;
}
// colour anti triplet + octet
else if((out1->iColour()==PDT::Colour8 && out2->iColour()==PDT::Colour3bar ) ||
(out1->iColour()==PDT::Colour3bar && out2->iColour()==PDT::Colour8 ) ) {
output *= 4./3.;
}
// colour triplet triplet
else if(out1->iColour()==PDT::Colour3 &&
out2->iColour()==PDT::Colour3) {
output *= 2.;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour anti triplet particle in "
<< "GeneralTwoBodyDecayer::colourFactor() for "
<< in->PDGName() << " -> "
<< out1->PDGName() << " " << out2->PDGName()
<< Exception::runerror;
}
else if(in->iColour()==PDT::Colour8) {
// colour octet + neutral
if((out1->iColour()==PDT::Colour0 && out2->iColour()==PDT::Colour8 ) ||
(out1->iColour()==PDT::Colour8 && out2->iColour()==PDT::Colour0 ) ) {
output *= 1.;
}
// colour triplet/antitriplet
else if((out1->iColour()==PDT::Colour3 && out2->iColour()==PDT::Colour3bar) ||
(out1->iColour()==PDT::Colour3bar && out2->iColour()==PDT::Colour3 ) ) {
output *= 0.5;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour octet particle in "
<< "GeneralTwoBodyDecayer::colourFactor() for "
<< in->PDGName() << " -> "
<< out1->PDGName() << " " << out2->PDGName()
<< Exception::runerror;
}
else if(in->iColour()==PDT::Colour6) {
// colour sextet -> triplet triplet
if( out1->iColour()==PDT::Colour3 && out2->iColour()==PDT::Colour3 ) {
output *= 1.;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour sextet particle in "
<< "GeneralTwoBodyDecayer::colourFactor() for "
<< in->PDGName() << " -> "
<< out1->PDGName() << " " << out2->PDGName()
<< Exception::runerror;
}
else if(in->iColour()==PDT::Colour6bar) {
// colour sextet -> triplet triplet
if( out1->iColour()==PDT::Colour3bar && out2->iColour()==PDT::Colour3bar ) {
output *= 1.;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour anti-sextet particle in "
<< "GeneralTwoBodyDecayer::colourFactor() for "
<< in->PDGName() << " -> "
<< out1->PDGName() << " " << out2->PDGName()
<< Exception::runerror;
}
else
throw Exception() << "Unknown colour "
<< in->iColour() << " for the decaying particle in "
<< "GeneralTwoBodyDecayer::colourFactor() for "
<< in->PDGName() << " -> "
<< out1->PDGName() << " " << out2->PDGName()
<< Exception::runerror;
return output;
}
Energy GeneralTwoBodyDecayer::partialWidth(PMPair inpart, PMPair outa,
PMPair outb) const {
// select the number of the mode
tPDVector children;
children.push_back(const_ptr_cast<PDPtr>(outa.first));
children.push_back(const_ptr_cast<PDPtr>(outb.first));
bool cc;
int nmode=modeNumber(cc,inpart.first,children);
tcPDPtr newchild[2] = {mode(nmode)->outgoing()[0],
mode(nmode)->outgoing()[1]};
// make the particles
Lorentz5Momentum pparent = Lorentz5Momentum(inpart.second);
PPtr parent = inpart.first->produceParticle(pparent);
vector<Lorentz5Momentum> pout(2);
double ctheta,phi;
Kinematics::generateAngles(ctheta,phi);
Kinematics::twoBodyDecay(pparent, outa.second, outb.second,
ctheta, phi,pout[0],pout[1]);
if( ( !cc && outa.first!=newchild[0]) ||
( cc && !(( outa.first->CC() && outa.first->CC() == newchild[0])||
( !outa.first->CC() && outa.first == newchild[0]) )))
swap(pout[0],pout[1]);
tPDVector out = {const_ptr_cast<tPDPtr>(outa.first),
const_ptr_cast<tPDPtr>(outb.first)};
double me = me2(-1,*parent,out,pout,Initialize);
Energy pcm = Kinematics::pstarTwoBodyDecay(inpart.second,
outa.second, outb.second);
return me/(8.*Constants::pi)*pcm;
}
void GeneralTwoBodyDecayer::decayInfo(PDPtr incoming, PDPair outgoing) {
incoming_=incoming;
outgoing_.clear();
outgoing_.push_back(outgoing.first );
outgoing_.push_back(outgoing.second);
}
double GeneralTwoBodyDecayer::matrixElementRatio(const Particle & inpart,
const ParticleVector & decay2,
const ParticleVector & decay3,
MEOption meopt,
ShowerInteraction inter) {
// calculate R/B
tPDVector outgoing = {const_ptr_cast<tPDPtr>(decay2[0]->dataPtr()),
const_ptr_cast<tPDPtr>(decay2[1]->dataPtr())};
const vector<Lorentz5Momentum> mom = {decay2[0]->momentum(),
decay2[1]->momentum()};
double B = me2 (0, inpart, outgoing,mom, meopt);
double R = threeBodyME(0, inpart, decay3, inter, meopt);
return R/B;
}
const vector<DVector> & GeneralTwoBodyDecayer::getColourFactors(const Particle & inpart,
const ParticleVector & decay,
unsigned int & nflow) {
// calculate the colour factors for the three-body decay
vector<int> sing,trip,atrip,oct,sex,asex;
for(unsigned int it=0;it<decay.size();++it) {
if (decay[it]->dataPtr()->iColour() == PDT::Colour0 ) sing. push_back(it);
else if(decay[it]->dataPtr()->iColour() == PDT::Colour3 ) trip. push_back(it);
else if(decay[it]->dataPtr()->iColour() == PDT::Colour3bar ) atrip.push_back(it);
else if(decay[it]->dataPtr()->iColour() == PDT::Colour8 ) oct. push_back(it);
else if(decay[it]->dataPtr()->iColour() == PDT::Colour6 ) sex. push_back(it);
else if(decay[it]->dataPtr()->iColour() == PDT::Colour6bar ) asex. push_back(it);
}
// identical particle symmetry factor
double symFactor=1.;
if (( sing.size()==2 && decay[ sing[0]]->id()==decay[ sing[1]]->id()) ||
( trip.size()==2 && decay[ trip[0]]->id()==decay[ trip[1]]->id()) ||
(atrip.size()==2 && decay[atrip[0]]->id()==decay[atrip[1]]->id()) ||
( oct.size()==2 && decay[ oct[0]]->id()==decay[ oct[1]]->id()) ||
( sex.size()==2 && decay[ sex[0]]->id()==decay[ sex[1]]->id()) ||
( asex.size()==2 && decay[ asex[0]]->id()==decay[ asex[1]]->id()))
symFactor /= 2.;
else if (oct.size()==3 &&
decay[oct[0]]->id()==decay[oct[1]]->id() &&
decay[oct[0]]->id()==decay[oct[2]]->id())
symFactor /= 6.;
colour_ = vector<DVector>(1,DVector(1,symFactor*1.));
// decaying colour singlet
if(inpart.dataPtr()->iColour() == PDT::Colour0) {
if(trip.size()==1 && atrip.size()==1 && oct.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*4.));
}
else if(trip.size()==1 && atrip.size()==1 && sing.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*3.));
}
else if (oct.size()==3){
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*24.));
}
else if(sing.size()==3) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor));
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour scalar particle in "
<< "GeneralTwoBodyDecayer::getColourFactors() for "
<< inpart. dataPtr()->PDGName() << " -> "
<< decay[0]->dataPtr()->PDGName() << " "
<< decay[1]->dataPtr()->PDGName() << " "
<< decay[2]->dataPtr()->PDGName()
<< Exception::runerror;
}
// decaying colour triplet
else if(inpart.dataPtr()->iColour() == PDT::Colour3) {
if(trip.size()==1 && sing.size()==1 && oct.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*4./3.));
}
else if(trip.size()==1 && sing.size()==2) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor));
}
else if(trip.size()==1 && oct.size()==2) {
nflow = 2;
colour_.clear();
colour_.resize(2,DVector(2,0.));
colour_[0][0] = symFactor*16./9.; colour_[0][1] = -symFactor*2./9.;
colour_[1][0] = -symFactor*2./9.; colour_[1][1] = symFactor*16./9.;
}
else if(atrip.size()==2 && sing.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*2.));
}
else if(atrip.size()==2 && oct.size()==1) {
nflow = 2;
colour_.clear();
colour_.resize(2,DVector(2,0.));
colour_[0][0] = 8./3.*symFactor; colour_[0][1] =-4./3.*symFactor;
colour_[1][0] = -4./3.*symFactor; colour_[1][1] = 8./3.*symFactor;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour triplet particle in "
<< "GeneralTwoBodyDecayer::getColourFactors() for "
<< inpart. dataPtr()->PDGName() << " -> "
<< decay[0]->dataPtr()->PDGName() << " "
<< decay[1]->dataPtr()->PDGName() << " "
<< decay[2]->dataPtr()->PDGName()
<< Exception::runerror;
}
// decaying colour anti-triplet
else if(inpart.dataPtr()->iColour() == PDT::Colour3bar) {
if(atrip.size()==1 && sing.size()==1 && oct.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*4./3.));
}
else if(atrip.size()==1 && sing.size()==2) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor));
}
else if(atrip.size()==1 && oct.size()==2){
nflow = 2;
colour_.clear();
colour_ .resize(2,DVector(2,0.));
colour_[0][0] = symFactor*16./9.; colour_[0][1] = -symFactor*2./9.;
colour_[1][0] = -symFactor*2./9.; colour_[1][1] = symFactor*16./9.;
}
else if(trip.size()==2 && sing.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*2.));
}
else if(trip.size()==2 && oct.size()==1) {
nflow = 2;
colour_.clear();
colour_.resize(2,DVector(2,0.));
colour_[0][0] = 8./3.*symFactor; colour_[0][1] =-4./3.*symFactor;
colour_[1][0] = -4./3.*symFactor; colour_[1][1] = 8./3.*symFactor;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for decay colour anti-triplet particle in "
<< "GeneralTwoBodyDecayer::getColourFactors() for "
<< inpart. dataPtr()->PDGName() << " -> "
<< decay[0]->dataPtr()->PDGName() << " "
<< decay[1]->dataPtr()->PDGName() << " "
<< decay[2]->dataPtr()->PDGName()
<< Exception::runerror;
}
// decaying colour octet
else if(inpart.dataPtr()->iColour() == PDT::Colour8) {
if(oct.size()==1 && trip.size()==1 && atrip.size()==1) {
nflow = 2;
colour_.clear();
colour_.resize(2,DVector(2,0.));
colour_[0][0] = symFactor*2./3. ; colour_[0][1] = -symFactor*1./12.;
colour_[1][0] = -symFactor*1./12.; colour_[1][1] = symFactor*2./3. ;
}
else if (sing.size()==1 && trip.size()==1 && atrip.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*0.5));
}
else if (oct.size()==2 && sing.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor*3.));
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for a decaying colour octet particle in "
<< "GeneralTwoBodyDecayer::getColourFactors() for "
<< inpart. dataPtr()->PDGName() << " -> "
<< decay[0]->dataPtr()->PDGName() << " "
<< decay[1]->dataPtr()->PDGName() << " "
<< decay[2]->dataPtr()->PDGName()
<< Exception::runerror;
}
// Sextet
else if(inpart.dataPtr()->iColour() == PDT::Colour6) {
if(trip.size()==2 && sing.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor));
}
else if(trip.size()==2 && oct.size()==1) {
nflow = 2;
colour_.clear();
colour_.resize(2,DVector(2,0.));
colour_[0][0] = 4./3.*symFactor; colour_[0][1] = 1./3.*symFactor;
colour_[1][0] = 1./3.*symFactor; colour_[1][1] = 4./3.*symFactor;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for a decaying colour sextet particle in "
<< "GeneralTwoBodyDecayer::getColourFactors() for "
<< inpart. dataPtr()->PDGName() << " -> "
<< decay[0]->dataPtr()->PDGName() << " "
<< decay[1]->dataPtr()->PDGName() << " "
<< decay[2]->dataPtr()->PDGName()
<< Exception::runerror;
}
// anti Sextet
else if(inpart.dataPtr()->iColour() == PDT::Colour6bar) {
if(atrip.size()==2 && sing.size()==1) {
nflow = 1;
colour_ = vector<DVector>(1,DVector(1,symFactor));
}
else if(atrip.size()==2 && oct.size()==1) {
nflow = 2;
colour_.clear();
colour_.resize(2,DVector(2,0.));
colour_[0][0] = 4./3.*symFactor; colour_[0][1] = 1./3.*symFactor;
colour_[1][0] = 1./3.*symFactor; colour_[1][1] = 4./3.*symFactor;
}
else
throw Exception() << "Unknown colour for the outgoing particles"
<< " for a decaying colour anti-sextet particle in "
<< "GeneralTwoBodyDecayer::getColourFactors() for "
<< inpart. dataPtr()->PDGName() << " -> "
<< decay[0]->dataPtr()->PDGName() << " "
<< decay[1]->dataPtr()->PDGName() << " "
<< decay[2]->dataPtr()->PDGName()
<< Exception::runerror;
}
else
throw Exception() << "Unknown colour for the decaying particle in "
<< "GeneralTwoBodyDecayer::getColourFactors() for "
<< inpart. dataPtr()->PDGName() << " -> "
<< decay[0]->dataPtr()->PDGName() << " "
<< decay[1]->dataPtr()->PDGName() << " "
<< decay[2]->dataPtr()->PDGName()
<< Exception::runerror;
return colour_;
}
const GeneralTwoBodyDecayer::CFlow &
GeneralTwoBodyDecayer::colourFlows(const Particle & inpart,
const ParticleVector & decay) {
// static initialization of commonly used colour structures
static const CFlow init = CFlow(3, CFlowPairVec(1, make_pair(0, 1.)));
static CFlow tripflow = init;
static CFlow atripflow = init;
static CFlow octflow = init;
static CFlow sexflow = init;
static CFlow epsflow = init;
static const CFlow fpflow = CFlow(4, CFlowPairVec(1, make_pair(0, 1.)));
static bool initialized = false;
if (! initialized) {
tripflow[2].resize(2, make_pair(0,1.));
tripflow[2][0] = make_pair(0, 1.);
tripflow[2][1] = make_pair(1,-1.);
tripflow[1][0] = make_pair(1, 1.);
atripflow[1].resize(2, make_pair(0,1.));
atripflow[1][0] = make_pair(0, 1.);
atripflow[1][1] = make_pair(1,-1.);
atripflow[2][0] = make_pair(1, 1.);
octflow[0].resize(2, make_pair(0,1.));
octflow[0][0] = make_pair(0,-1.);
octflow[0][1] = make_pair(1, 1.);
octflow[2][0] = make_pair(1, 1.);
sexflow[0].resize(2, make_pair(0,1.));
sexflow[0][1] = make_pair(1,1.);
sexflow[2][0] = make_pair(1,1.);
epsflow[0].resize(2, make_pair(0,-1.));
epsflow[0][0] = make_pair(0,-1.);
epsflow[0][1] = make_pair(1,-1.);
epsflow[2][0] = make_pair(1,1.);
initialized = true;
}
// main function body
int sing=0,trip=0,atrip=0,oct=0,sex=0,asex=0;
for (size_t it=0; it<decay.size(); ++it) {
switch ( decay[it]->dataPtr()->iColour() ) {
case PDT::Colour0: ++sing; break;
case PDT::Colour3: ++trip; break;
case PDT::Colour3bar: ++atrip; break;
case PDT::Colour8: ++oct; break;
case PDT::Colour6: ++sex; break;
case PDT::Colour6bar: ++asex; break;
/// @todo: handle these better
case PDT::ColourUndefined: break;
case PDT::Coloured: break;
case PDT::DarkColoured: break;
case PDT::DarkColourNeutral: break;
case PDT::DarkColourFundamental: break;
case PDT::DarkColourAntiFundamental: break;
case PDT::DarkColourAdjoint: break;
}
}
const CFlow * retval = 0;
// decaying colour triplet
if(inpart.dataPtr()->iColour() == PDT::Colour3 &&
trip==1 && oct==2) {
retval = &tripflow;
}
// decaying colour anti-triplet
else if(inpart.dataPtr()->iColour() == PDT::Colour3bar &&
atrip==1 && oct==2){
retval = &atripflow;
}
// decaying colour octet
else if(inpart.dataPtr()->iColour() == PDT::Colour8 &&
oct==1 && trip==1 && atrip==1) {
retval = &octflow;
}
// decaying colour sextet
else if(inpart.dataPtr()->iColour() ==PDT::Colour6 &&
oct==1 && trip==2) {
retval = &sexflow;
}
// decaying anti colour sextet
else if(inpart.dataPtr()->iColour() ==PDT::Colour6bar &&
oct==1 && atrip==2) {
retval = &sexflow;
}
// decaying colour triplet (eps)
else if(inpart.dataPtr()->iColour() == PDT::Colour3 &&
atrip==2 && oct==1) {
retval = &epsflow;
}
// decaying colour anti-triplet (eps)
else if(inpart.dataPtr()->iColour() == PDT::Colour3bar &&
trip==2 && oct==1){
retval = &epsflow;
}
else {
retval = &fpflow;
}
return *retval;
}
double GeneralTwoBodyDecayer::threeBodyME(const int , const Particle &,
const ParticleVector &,
ShowerInteraction, MEOption) {
throw Exception() << "Base class GeneralTwoBodyDecayer::threeBodyME() "
<< "called, should have an implementation in the inheriting class"
<< Exception::runerror;
return 0.;
}
diff --git a/Decay/General/GeneralTwoBodyDecayer.h b/Decay/General/GeneralTwoBodyDecayer.h
--- a/Decay/General/GeneralTwoBodyDecayer.h
+++ b/Decay/General/GeneralTwoBodyDecayer.h
@@ -1,295 +1,301 @@
// -*- C++ -*-
//
// GeneralTwoBodyDecayer.h 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.
//
#ifndef HERWIG_GeneralTwoBodyDecayer_H
#define HERWIG_GeneralTwoBodyDecayer_H
//
// This is the declaration of the GeneralTwoBodyDecayer class.
//
#include "Herwig/Decay/PerturbativeDecayer.h"
#include "Herwig/Decay/PhaseSpaceMode.h"
#include "ThePEG/Helicity/Vertex/VertexBase.h"
+#include "Herwig/Models/HiddenValley/HiddenValleyModel.h"
#include "GeneralTwoBodyDecayer.fh"
namespace Herwig {
using namespace ThePEG;
using Helicity::VertexBasePtr;
/** \ingroup Decay
* The GeneralTwoBodyDecayer class is designed to be the base class
* for 2 body decays for some general model. It inherits from
* PerturbativeDecayer and implements the modeNumber() virtual function
* that is the same for all of the decays. A decayer for
* a specific spin configuration should inherit from this and implement
* the me2() and partialWidth() member functions. The colourConnections()
* member should be called from inside me2() in the inheriting decayer
* to set up the colour lines.
*
* @see \ref GeneralTwoBodyDecayerInterfaces "The interfaces"
* defined for GeneralTwoBodyDecayer.
* @see PerturbativeDecayer
*/
class GeneralTwoBodyDecayer: public PerturbativeDecayer {
public:
/** A ParticleData ptr and (possible) mass pair.*/
typedef pair<tcPDPtr, Energy> PMPair;
public:
/**
* The default constructor.
*/
GeneralTwoBodyDecayer() : maxWeight_(1.), colour_(1,DVector(1,1.))
{}
/** @name Virtual functions required by the Decayer2 class. */
//@{
/**
* For a given decay mode and a given particle instance, perform the
* decay and return the decay products. As this is the base class this
* is not implemented.
* @return The vector of particles produced in the decay.
*/
virtual ParticleVector decay(const Particle & parent,
const tPDVector & children) const;
/**
* Which of the possible decays is required
* @param cc Is this mode the charge conjugate
* @param parent The decaying particle
* @param children The decay products
*/
virtual int modeNumber(bool & cc, tcPDPtr parent,const tPDVector & children) const;
/**
* Function to return partial Width
* @param inpart The decaying particle.
* @param outa One of the decay products.
* @param outb The other decay product.
*/
virtual Energy partialWidth(PMPair inpart, PMPair outa,
PMPair outb) const;
/**
* Specify the \f$1\to2\f$ matrix element to be used in the running width
* calculation.
* @param dm The DecayMode
* @param mecode The code for the matrix element as described
* in the GenericWidthGenerator class.
* @param coupling The coupling for the matrix element.
* @return True if the the order of the particles in the
* decayer is the same as the DecayMode tag.
*/
virtual bool twoBodyMEcode(const DecayMode & dm, int & mecode,
double & coupling) const;
/**
* An overidden member to calculate a branching ratio for a certain
* particle instance.
* @param dm The DecayMode of the particle
* @param p The particle object
* @param oldbrat The branching fraction given in the DecayMode object
*/
virtual double brat(const DecayMode & dm, const Particle & p,
double oldbrat) const;
//@}
/**
* Set the information on the decay
*/
virtual void setDecayInfo(PDPtr incoming, PDPair outgoing,
vector<VertexBasePtr>,
map<ShowerInteraction,VertexBasePtr> &,
const vector<map<ShowerInteraction,VertexBasePtr> > &,
map<ShowerInteraction,VertexBasePtr>) =0;
protected:
/** @name Functions used by inheriting decayers. */
//@{
/**
* Set integration weight
* @param wgt Maximum integration weight
*/
void setWeight(double wgt) { maxWeight_ = wgt; }
/**
* Set colour connections
* @param parent Parent particle
* @param out Particle vector containing particles to
* connect colour lines
*/
void colourConnections(const Particle & parent,
const ParticleVector & out) const;
/**
* Compute the spin and colour factor
*/
double colourFactor(tcPDPtr in, tcPDPtr out1, tcPDPtr out2) const;
/**
* Calculate matrix element ratio R/B
*/
double matrixElementRatio(const Particle & inpart, const ParticleVector & decay2,
const ParticleVector & decay3, MEOption meopt,
ShowerInteraction inter);
/**
* Set the information on the decay
*/
void decayInfo(PDPtr incoming, PDPair outgoing);
//@}
public:
/** @name Functions used by the persistent I/O system. */
//@{
/**
* Function used to write out object persistently.
* @param os the persistent output stream written to.
*/
void persistentOutput(PersistentOStream & os) const;
/**
* Function used to read in object persistently.
* @param is the persistent input stream read from.
* @param version the version number of the object when written.
*/
void persistentInput(PersistentIStream & is, int version);
//@}
/**
* The standard Init function used to initialize the interfaces.
* Called exactly once for each class by the class description system
* before the main function starts or
* when this class is dynamically loaded.
*/
static void Init();
protected:
/** @name Standard Interfaced functions. */
//@{
/**
* Initialize this object after the setup phase before saving an
* EventGenerator to disk.
* @throws InitException if object could not be initialized properly.
*/
virtual void doinit();
/**
* Initialize this object. Called in the run phase just before
* a run begins.
*/
virtual void doinitrun();
//@}
protected:
/**
* Member for the generation of additional hard radiation
*/
//@{
/**
* Return the matrix of colour factors
*/
typedef vector<pair<int,double > > CFlowPairVec;
typedef vector<CFlowPairVec> CFlow;
const vector<DVector> & getColourFactors(const Particle & inpart,
const ParticleVector & decay,
unsigned int & nflow);
const CFlow & colourFlows(const Particle & inpart,
const ParticleVector & decay);
/**
* Three-body matrix element including additional QCD radiation
*/
virtual double threeBodyME(const int , const Particle & inpart,
const ParticleVector & decay,
ShowerInteraction inter, MEOption meopt);
//@}
private:
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
GeneralTwoBodyDecayer & operator=(const GeneralTwoBodyDecayer &) = delete;
private:
/**
* Store the incoming particle
*/
PDPtr incoming_;
/**
* Outgoing particles
*/
vector<PDPtr> outgoing_;
/**
* Maximum weight for integration
*/
double maxWeight_;
/**
* Store colour factors for ME calc.
*/
vector<DVector> colour_;
+ /**
+ * Pointer to the Hiddwn Valley object.
+ */
+ tHiddenValleyPtr _HVmodel;
+
};
/**
* Write a map with ShowerInteraction as the key
*/
template<typename T, typename Cmp, typename A>
inline PersistentOStream & operator<<(PersistentOStream & os,
const map<ShowerInteraction,T,Cmp,A> & m) {
os << m.size();
if(m.find(ShowerInteraction::QCD)!=m.end()) {
os << 0 << m.at(ShowerInteraction::QCD);
}
if(m.find(ShowerInteraction::QED)!=m.end()) {
os << 1 << m.at(ShowerInteraction::QED);
}
return os;
}
/**
* Read a map with ShowerInteraction as the key
*/
template <typename T, typename Cmp, typename A>
inline PersistentIStream & operator>>(PersistentIStream & is, map<ShowerInteraction,T,Cmp,A> & m) {
m.clear();
long size;
int k;
is >> size;
while ( size-- && is ) {
is >> k;
if(k==0)
is >> m[ShowerInteraction::QCD];
else if(k==1)
is >> m[ShowerInteraction::QED];
else
assert(false);
}
return is;
}
}
#endif /* HERWIG_GeneralTwoBodyDecayer_H */
diff --git a/Makefile.am b/Makefile.am
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,29 +1,29 @@
SUBDIRS = include \
- Utilities PDT Decay PDF Models \
+ Utilities PDT PDF Models Decay \
Shower Hadronization MatrixElement \
UnderlyingEvent Analysis Looptools Sampling \
API lib src Doc Contrib Tests
EXTRA_DIST = GUIDELINES cat_with_cpplines
DISTCHECK_CONFIGURE_FLAGS = --enable-debug --with-thepeg=$(THEPEGPATH) --with-gsl=$(GSLPATH)
ACLOCAL_AMFLAGS = -I m4
DISTCLEANFILES = config.herwig
libclean:
find . -name '*.la' -delete
cd lib && $(MAKE) $(AM_MAKEFLAGS) clean
cd src && $(MAKE) $(AM_MAKEFLAGS) clean
tests:
cd Tests && $(MAKE) $(AM_MAKEFLAGS) tests
## ThePEG registration
unregister:
cd src && $(MAKE) $(AM_MAKEFLAGS) unregister
register:
cd src && $(MAKE) $(AM_MAKEFLAGS) register
diff --git a/Models/HiddenValley/HiddenValleyFFZPrimeVertex.cc b/Models/HiddenValley/HiddenValleyFFZPrimeVertex.cc
new file mode 100644
--- /dev/null
+++ b/Models/HiddenValley/HiddenValleyFFZPrimeVertex.cc
@@ -0,0 +1,95 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the HiddenValleyFFZPrimeVertex class.
+//
+
+#include "HiddenValleyFFZPrimeVertex.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+#include "HiddenValleyModel.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+
+using namespace Herwig;
+
+void HiddenValleyFFZPrimeVertex::persistentOutput(PersistentOStream & os) const {
+ os << _gl << _gr << _gql << _gqr << _gPrime;
+}
+
+void HiddenValleyFFZPrimeVertex::persistentInput(PersistentIStream & is, int) {
+ is >> _gl >> _gr >> _gql >> _gqr >> _gPrime;
+}
+
+// Static variable needed for the type description system in ThePEG.
+DescribeClass<HiddenValleyFFZPrimeVertex,FFVVertex>
+describeHerwigHiddenValleyFFZPrimeVertex("Herwig::HiddenValleyFFZPrimeVertex", "Herwig.so");
+
+void HiddenValleyFFZPrimeVertex::Init() {
+
+ static ClassDocumentation<HiddenValleyFFZPrimeVertex> documentation
+ ("There is no documentation for the HiddenValleyFFZPrimeVertex class");
+
+}
+
+void HiddenValleyFFZPrimeVertex::setCoupling(Energy2, tcPDPtr a,tcPDPtr,tcPDPtr) {
+ norm(_gPrime);
+ // the left and right couplings
+ int iferm=abs(a->id());
+ if((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)) {
+ left (_gl[iferm]);
+ right(_gr[iferm]);
+ return;
+ }
+ iferm -= ParticleID::darkg;
+ if(iferm<=int(_gql.size())) {
+ left (_gql[iferm]);
+ right(_gqr[iferm]);
+ return;
+ }
+ assert(false);
+}
+
+HiddenValleyFFZPrimeVertex::HiddenValleyFFZPrimeVertex() : _gl(17,0.0), _gr(17,0.0) {
+ orderInGem(1);
+ orderInGs(0);
+ // PDG codes for the particles
+ // the quarks
+ for(int ix=1;ix<7;++ix)
+ addToList(-ix,ix,32);
+ // the leptons
+ for(int ix=11;ix<17;++ix)
+ addToList(-ix,ix,32);
+}
+
+void HiddenValleyFFZPrimeVertex::doinit() {
+ tcHiddenValleyPtr model =
+ dynamic_ptr_cast<tcHiddenValleyPtr>(generator()->standardModel());
+ if(!model)
+ throw InitException() << "Must be using the HiddenValleyModel in "
+ << "HiddenValleyFFZPrimeVertex::doinit()"
+ << Exception::runerror;
+ _gPrime = model->gPrime();
+ // SM couplings
+ _gl.resize(17,0.);
+ _gr.resize(17,0.);
+ for(int ix=1;ix<4;++ix) {
+ _gl[2*ix-1] = model->qL();
+ _gl[2*ix ] = model->qL();
+ _gl[2*ix+9 ] = model->lL();
+ _gl[2*ix+10] = model->lL();
+ _gr[2*ix-1] = model->dR();
+ _gr[2*ix ] = model->uR();
+ _gr[2*ix+9 ] = model->lR();
+ _gr[2*ix+10] = 0. ;
+ }
+ FFVVertex::doinit();
+ _gql.resize(model->NF()+1,0.);
+ _gqr.resize(model->NF()+1,0.);
+ for(int ix=0;ix<int(model->NF());++ix) {
+ int id = ParticleID::darkg+1+ix;
+ addToList(-id,id,32);
+ _gql[ix+1] = model->qCharge()[ix];
+ _gqr[ix+1] = model->qCharge()[ix]-2.;
+ }
+}
diff --git a/Models/HiddenValley/HiddenValleyFFZPrimeVertex.h b/Models/HiddenValley/HiddenValleyFFZPrimeVertex.h
new file mode 100644
--- /dev/null
+++ b/Models/HiddenValley/HiddenValleyFFZPrimeVertex.h
@@ -0,0 +1,132 @@
+// -*- C++ -*-
+#ifndef RADIATIVEZPRIME_HiddenValleyFFZPrimeVertex_H
+#define RADIATIVEZPRIME_HiddenValleyFFZPrimeVertex_H
+//
+// This is the declaration of the HiddenValleyFFZPrimeVertex class.
+//
+
+#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * Here is the documentation of the HiddenValleyFFZPrimeVertex class.
+ *
+ * @see \ref HiddenValleyFFZPrimeVertexInterfaces "The interfaces"
+ * defined for HiddenValleyFFZPrimeVertex.
+ */
+class HiddenValleyFFZPrimeVertex: public Helicity::FFVVertex {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ inline HiddenValleyFFZPrimeVertex();
+
+ /**
+ * Calculate the couplings.
+ * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
+ * @param part1 The ParticleData pointer for the first particle.
+ * @param part2 The ParticleData pointer for the second particle.
+ * @param part3 The ParticleData pointer for the third particle.
+ */
+ virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
+
+public:
+
+ /** @name Functions used by the persistent I/O system. */
+ //@{
+ /**
+ * Function used to write out object persistently.
+ * @param os the persistent output stream written to.
+ */
+ void persistentOutput(PersistentOStream & os) const;
+
+ /**
+ * Function used to read in object persistently.
+ * @param is the persistent input stream read from.
+ * @param version the version number of the object when written.
+ */
+ void persistentInput(PersistentIStream & is, int version);
+ //@}
+
+ /**
+ * The standard Init function used to initialize the interfaces.
+ * Called exactly once for each class by the class description system
+ * before the main function starts or
+ * when this class is dynamically loaded.
+ */
+ static void Init();
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ inline virtual IBPtr clone() const {return new_ptr(*this);}
+
+ /** Make a clone of this object, possibly modifying the cloned object
+ * to make it sane.
+ * @return a pointer to the new object.
+ */
+ inline virtual IBPtr fullclone() const {return new_ptr(*this);}
+ //@}
+
+protected:
+
+ /**
+ * Initialize this object after the setup phase before saving and
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ HiddenValleyFFZPrimeVertex & operator=(const HiddenValleyFFZPrimeVertex &);
+
+
+ /**
+ * Storage of the couplings.
+ */
+ //@{
+ /**
+ * The left couplings of the Standard Model fermions.
+ */
+ vector<double> _gl;
+
+ /**
+ * The right couplings of the Standard Model fermions.
+ */
+ vector<double> _gr;
+ /**
+ * The left couplings of the new fermions.
+ */
+ vector<double> _gql;
+
+ /**
+ * The right couplings of the new fermions.
+ */
+ vector<double> _gqr;
+
+ /**
+ * Coupling
+ */
+ double _gPrime;
+ //@}
+
+};
+
+}
+
+#endif /* RADIATIVEZPRIME_HiddenValleyFFZPrimeVertex_H */
diff --git a/Models/HiddenValley/HiddenValleyModel.cc b/Models/HiddenValley/HiddenValleyModel.cc
new file mode 100644
--- /dev/null
+++ b/Models/HiddenValley/HiddenValleyModel.cc
@@ -0,0 +1,132 @@
+// -*- C++ -*-
+//
+// This is the implementation of the non-inlined, non-templated member
+// functions of the HiddenValleyModel class.
+//
+
+#include "HiddenValleyModel.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Interface/Reference.h"
+#include "ThePEG/Interface/Parameter.h"
+#include "ThePEG/Interface/ParVector.h"
+#include "ThePEG/Interface/Switch.h"
+#include "ThePEG/Utilities/EnumIO.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+
+using namespace Herwig;
+
+HiddenValleyModel::HiddenValleyModel() : groupType_(SU), Nc_(3), Nf_(1),
+ qL_(-0.2), uR_(-0.2), dR_(0.6),
+ lL_(0.6), lR_(-0.2), gPrime_(1./7.),
+ qCharge_(1,-0.2)
+{}
+
+HiddenValleyModel::~HiddenValleyModel() {}
+
+IBPtr HiddenValleyModel::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr HiddenValleyModel::fullclone() const {
+ return new_ptr(*this);
+}
+
+void HiddenValleyModel::persistentOutput(PersistentOStream & os) const {
+ os << oenum(groupType_) << Nc_ << Nf_ << FFZPVertex_
+ << qL_ << uR_ << dR_ << lL_ << lR_ << qCharge_ << gPrime_;
+}
+
+void HiddenValleyModel::persistentInput(PersistentIStream & is, int) {
+ is >> ienum(groupType_) >> Nc_ >> Nf_ >> FFZPVertex_
+ >> qL_ >> uR_ >> dR_ >> lL_ >> lR_ >> qCharge_ >> gPrime_;
+}
+
+ClassDescription<HiddenValleyModel> HiddenValleyModel::initHiddenValleyModel;
+// Definition of the static class description member.
+
+void HiddenValleyModel::Init() {
+
+ static ClassDocumentation<HiddenValleyModel> documentation
+ ("The HiddenValleyModel class is the main class for the Hidden Valley Model.");
+
+ static Switch<HiddenValleyModel,GroupType> interfaceGroupType
+ ("GroupType",
+ "Type of the new unbroken group",
+ &HiddenValleyModel::groupType_, SU, false, false);
+ static SwitchOption interfaceGroupTypeSU
+ (interfaceGroupType,
+ "SU",
+ "Use an SU(N) group",
+ SU);
+
+ static Parameter<HiddenValleyModel,unsigned int> interfaceGroupOrder
+ ("GroupOrder",
+ "The value of the number of 'colours' for the new symmetry group",
+ &HiddenValleyModel::Nc_, 3, 1, 1000,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyModel,unsigned int> interfaceNumberOfFermions
+ ("NumberOfFermions",
+ "The number of fermions charged under the new group",
+ &HiddenValleyModel::Nf_, 1, 1, 100,
+ false, false, Interface::limited);
+
+ static Reference<HiddenValleyModel,AbstractFFVVertex> interfaceVertexFFZPrime
+ ("Vertex/FFZPrime",
+ "The vertex coupling the Zprime to the fermions",
+ &HiddenValleyModel::FFZPVertex_, false, false, true, false, false);
+
+ static ParVector<HiddenValleyModel,double> interfaceQuirkCharges
+ ("QuirkCharges",
+ "The charges under the new U(1) of the new quirks",
+ &HiddenValleyModel::qCharge_, -1, -0.2, -10., 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyModel,double> interfaceZPrimeQL
+ ("ZPrime/QL",
+ "The charge of the left-handed quarks under the new U(1)",
+ &HiddenValleyModel::qL_, -0.2, 10.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyModel,double> interfaceZPrimeUR
+ ("ZPrime/UR",
+ "The charge of the right-handed up quarks under the new U(1)",
+ &HiddenValleyModel::uR_, -0.2, 10.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyModel,double> interfaceZPrimeDR
+ ("ZPrime/DR",
+ "The charge of the right-handed down quarks under the new U(1)",
+ &HiddenValleyModel::uR_, 0.6, 10.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyModel,double> interfaceZPrimeLL
+ ("ZPrime/LL",
+ "The charge of the left-handed leptons under the new U(1)",
+ &HiddenValleyModel::lL_, 0.6, 10.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyModel,double> interfaceZPrimeLR
+ ("ZPrime/LR",
+ "The charge of the right-handed charged leptons under the new U(1)",
+ &HiddenValleyModel::lR_, -0.2, 10.0, 10.0,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyModel,double> interfaceGPrime
+ ("GPrime",
+ "The new gauge coupling",
+ &HiddenValleyModel::gPrime_, 1./7., 0.0, 10.0,
+ false, false, Interface::limited);
+
+}
+
+void HiddenValleyModel::doinit() {
+ addVertex(FFZPVertex_);
+ BSMModel::doinit();
+ FFZPVertex_->init();
+ if(qCharge_.size()!=Nf_)
+ throw InitException() << "Number of new fermions and number of new charges "
+ << "different in HiddenValleyModel::doinit()"
+ << Exception::runerror;
+}
diff --git a/Models/HiddenValley/HiddenValleyModel.h b/Models/HiddenValley/HiddenValleyModel.h
new file mode 100644
--- /dev/null
+++ b/Models/HiddenValley/HiddenValleyModel.h
@@ -0,0 +1,346 @@
+// -*- C++ -*-
+#ifndef HERWIG_HiddenValleyModel_H
+#define HERWIG_HiddenValleyModel_H
+//
+// This is the declaration of the HiddenValleyModel class.
+//
+
+#include "Herwig/Models/General/BSMModel.h"
+#include "ThePEG/Helicity/Vertex/AbstractFFVVertex.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**
+ * Here is the documentation of the HiddenValleyModel class.
+ *
+ * @see \ref HiddenValleyModelInterfaces "The interfaces"
+ * defined for HiddenValleyModel.
+ */
+class HiddenValleyModel: public BSMModel {
+
+/**
+ * Enumeration to define the type of the confining group
+ */
+ enum GroupType { SU, SO, SP };
+
+public:
+
+ /** @name Standard constructors and destructors. */
+ //@{
+ /**
+ * Default constructor
+ */
+ HiddenValleyModel();
+
+ /**
+ * Destructor
+ */
+ virtual ~HiddenValleyModel();
+ //@}
+
+public:
+
+ /**
+ * Properties of the new confining gauge group
+ */
+ //@{
+ /**
+ * The hidden colour charge of the fundamental representation
+ */
+ double CF() const {
+ switch (groupType_) {
+ case SU:
+ return 0.5*(sqr(double(Nc_))-1.)/double(Nc_);
+ case SO:
+ if(Nc_==3) {
+ return (Nc_-1);
+ }
+ else {
+ return 0.5*(Nc_-1);
+ }
+ case SP:
+ return 0.25*(Nc_+1);
+ default:
+ assert(false);
+ }
+ return 0.;
+ }
+
+ /**
+ * The hidden colour charge of the adjoint representation
+ */
+ double CA() const {
+ switch (groupType_) {
+ case SU:
+ return double(Nc_);
+ case SO:
+ if(Nc_==3) {
+ return 2.*(Nc_-2.);
+ }
+ else {
+ return (Nc_-2.);
+ }
+ case SP:
+ return 0.5*(Nc_+2.);
+ default:
+ assert(false);
+ }
+ return 0.;
+ }
+
+ /**
+ * The \f$T_R\f$ colour factor
+ */
+ double TR() const {
+ switch (groupType_) {
+ case SU: case SP:
+ return 0.5;
+ break;
+ case SO:
+ if(Nc_==3) {
+ return 2.;
+ }
+ else {
+ return 1.;
+ }
+ default:
+ assert(false);
+ }
+ return 0.;
+ }
+
+ /**
+ * The type of the group
+ */
+ GroupType groupType() const {return groupType_;}
+
+ /**
+ * The number of colours
+ */
+ unsigned int NC() const {return Nc_;}
+
+ /**
+ * The number of fermions charged under the new group
+ */
+ unsigned int NF() const {return Nf_;}
+ //@}
+
+ /**
+ * Properties of the new U(1) group
+ */
+ //@{
+ /**
+ * Charge of the left-handed quarks
+ */
+ double qL() const {return qL_;}
+
+ /**
+ * Charge of the right-handed up-type quarks
+ */
+ double uR() const {return uR_;}
+
+ /**
+ * Charge of the right-handed down-type quarks
+ */
+ double dR() const {return dR_;}
+
+ /**
+ * Charge of the left-handed leptons
+ */
+ double lL() const {return lL_;}
+
+ /**
+ * Charge of the right-handed charged leptons
+ */
+ double lR() const {return lR_;}
+
+ /**
+ * Coupling
+ */
+ double gPrime() const {return gPrime_;}
+
+ /**
+ * The couplings of the quirks
+ */
+ vector<double> qCharge() const {return qCharge_;}
+ //@}
+
+public:
+
+ /** @name Functions used by the persistent I/O system. */
+ //@{
+ /**
+ * Function used to write out object persistently.
+ * @param os the persistent output stream written to.
+ */
+ void persistentOutput(PersistentOStream & os) const;
+
+ /**
+ * Function used to read in object persistently.
+ * @param is the persistent input stream read from.
+ * @param version the version number of the object when written.
+ */
+ void persistentInput(PersistentIStream & is, int version);
+ //@}
+
+ /**
+ * The standard Init function used to initialize the interfaces.
+ * Called exactly once for each class by the class description system
+ * before the main function starts or
+ * when this class is dynamically loaded.
+ */
+ static void Init();
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr clone() const;
+
+ /** Make a clone of this object, possibly modifying the cloned object
+ * to make it sane.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr fullclone() const;
+ //@}
+
+private:
+
+ /**
+ * The static object used to initialize the description of this class.
+ * Indicates that this is a concrete class with persistent data.
+ */
+ static ClassDescription<HiddenValleyModel> initHiddenValleyModel;
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ HiddenValleyModel & operator=(const HiddenValleyModel &);
+
+protected:
+
+ /** @name Standard Interfaced functions. */
+ //@{
+ /**
+ * Initialize this object after the setup phase before saving an
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+ //@}
+
+private:
+
+ /**
+ * Symmetry group for the new unbroken symmetry
+ */
+ //@{
+ /**
+ * Type of group
+ */
+ GroupType groupType_;
+
+ /**
+ * Order of the group
+ */
+ unsigned int Nc_;
+ //@}
+
+ /**
+ * Number of fermions
+ */
+ unsigned int Nf_;
+
+ /**
+ * Charges etc under the new \f$U(1)\f$ group
+ */
+ //@{
+ /**
+ * Charge of the left-handed quarks
+ */
+ double qL_;
+
+ /**
+ * Charge of the right-handed up-type quarks
+ */
+ double uR_;
+
+ /**
+ * Charge of the right-handed down-type quarks
+ */
+ double dR_;
+
+ /**
+ * Charge of the left-handed leptons
+ */
+ double lL_;
+
+ /**
+ * Charge of the right-handed charged leptons
+ */
+ double lR_;
+
+ /**
+ * Coupling
+ */
+ double gPrime_;
+
+ /**
+ * the vertex
+ */
+ AbstractFFVVertexPtr FFZPVertex_;
+
+ /**
+ * The couplings of the quirks
+ */
+ vector<double> qCharge_;
+ //@}
+};
+
+}
+
+#include "ThePEG/Utilities/ClassTraits.h"
+
+namespace ThePEG {
+
+/** @cond TRAITSPECIALIZATIONS */
+
+/** This template specialization informs ThePEG about the
+ * base classes of HiddenValleyModel. */
+template <>
+struct BaseClassTrait<Herwig::HiddenValleyModel,1> {
+ /** Typedef of the first base class of HiddenValleyModel. */
+ typedef Herwig::BSMModel NthBase;
+};
+
+/** This template specialization informs ThePEG about the name of
+ * the HiddenValleyModel class and the shared object where it is defined. */
+template <>
+struct ClassTraits<Herwig::HiddenValleyModel>
+ : public ClassTraitsBase<Herwig::HiddenValleyModel> {
+ /** Return a platform-independent class name */
+ static string className() { return "Herwig::HiddenValleyModel"; }
+ /**
+ * The name of a file containing the dynamic library where the class
+ * HiddenValleyModel is implemented. It may also include several, space-separated,
+ * libraries if the class HiddenValleyModel depends on other classes (base classes
+ * excepted). In this case the listed libraries will be dynamically
+ * linked in the order they are specified.
+ */
+ static string library() { return "Herwig.so"; }
+};
+
+ThePEG_DECLARE_POINTERS(Herwig::HiddenValleyModel,HiddenValleyPtr);
+
+/** @endcond */
+
+}
+
+#endif /* HERWIG_HiddenValleyModel_H */
diff --git a/Models/HiddenValley/Makefile.am b/Models/HiddenValley/Makefile.am
new file mode 100644
--- /dev/null
+++ b/Models/HiddenValley/Makefile.am
@@ -0,0 +1,17 @@
+BUILT_SOURCES = HV__all.cc
+CLEANFILES = HV__all.cc
+
+HV__all.cc : $(DIR_H_FILES) $(DIR_CC_FILES) Makefile
+ @echo "Concatenating .cc files into $@"
+ @$(top_srcdir)/cat_with_cpplines $(DIR_CC_FILES) > $@
+
+EXTRA_DIST = $(ALL_H_FILES) $(ALL_CC_FILES)
+
+DIR_H_FILES = $(addprefix $(srcdir)/,$(ALL_H_FILES))
+ALL_H_FILES = \
+HiddenValleyModel.h HiddenValleyFFZPrimeVertex.h
+
+DIR_CC_FILES = $(addprefix $(srcdir)/,$(ALL_CC_FILES))
+ALL_CC_FILES = \
+HiddenValleyModel.cc \
+HiddenValleyFFZPrimeVertex.cc
\ No newline at end of file
diff --git a/Models/Makefile.am b/Models/Makefile.am
--- a/Models/Makefile.am
+++ b/Models/Makefile.am
@@ -1,193 +1,199 @@
SUBDIRS = RSModel StandardModel General Susy UED Zprime \
Transplanckian ADD Leptoquarks Sextet TTbAsymm \
- LH LHTP Feynrules DarkMatter
+ LH LHTP Feynrules DarkMatter HiddenValley
noinst_LTLIBRARIES = libHwStandardModel.la
nodist_libHwStandardModel_la_SOURCES = \
StandardModel/SM__all.cc
libHwStandardModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/StandardModel
noinst_LTLIBRARIES += libHwModelGenerator.la
nodist_libHwModelGenerator_la_SOURCES = \
General/ModelGenerator__all.cc
libHwModelGenerator_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/General
+noinst_LTLIBRARIES += libHwHiddenValley.la
+nodist_libHwHiddenValley_la_SOURCES = \
+HiddenValley/HV__all.cc
+
+libHwHiddenValley_la_CPPFLAGS = \
+$(AM_CPPFLAGS) -I$(srcdir)/HiddenValley
if WANT_BSM
pkglib_LTLIBRARIES = \
HwRSModel.la \
HwUED.la \
HwSusy.la \
HwNMSSM.la \
HwRPV.la \
HwZprimeModel.la \
HwTransplanck.la \
HwADDModel.la \
HwLeptoquarkModel.la \
HwSextetModel.la \
HwTTbAModel.la \
HwLHModel.la \
HwDMModel.la \
HwLHTPModel.la
endif
#############
HwRSModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 12:0:0
HwRSModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/RSModel
nodist_HwRSModel_la_SOURCES = \
RSModel/RS__all.cc
#############
HwUED_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 12:0:0
HwUED_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/UED
nodist_HwUED_la_SOURCES = \
UED/UED__all.cc
#############
HwSusy_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 15:0:0
HwSusy_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/Susy
nodist_HwSusy_la_SOURCES = \
Susy/Susy__all.cc
#############
HwNMSSM_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 7:0:0
HwNMSSM_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/Susy/NMSSM
nodist_HwNMSSM_la_SOURCES = \
Susy/NMSSM/NMSSM__all.cc
#############
HwRPV_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 5:0:0
HwRPV_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/Susy/RPV
nodist_HwRPV_la_SOURCES = \
Susy/RPV/RPV__all.cc
#############
HwZprimeModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 5:0:0
HwZprimeModel_la_SOURCES = \
Zprime/ZprimeModel.cc Zprime/ZprimeModelZPQQVertex.cc
#############
HwTransplanck_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 6:0:0
HwTransplanck_la_SOURCES = \
Transplanckian/METRP2to2.cc
#############
HwADDModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 6:0:0
HwADDModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/ADD
nodist_HwADDModel_la_SOURCES = \
ADD/ADD__all.cc
#############
HwLeptoquarkModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 7:0:0
HwLeptoquarkModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/Leptoquarks
nodist_HwLeptoquarkModel_la_SOURCES = \
Leptoquarks/Leptoquark__all.cc
#############
HwSextetModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 5:0:0
HwSextetModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/Sextet
nodist_HwSextetModel_la_SOURCES = \
Sextet/Sextet__all.cc
#############
HwTTbAModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 5:0:0
HwTTbAModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/TTbAsymm
nodist_HwTTbAModel_la_SOURCES = \
TTbAsymm/TTbA__all.cc
#############
HwLHModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 7:0:0
HwLHModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/LH
nodist_HwLHModel_la_SOURCES = \
LH/LH__all.cc
#############
HwDMModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 7:0:0
HwDMModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) -I$(srcdir)/DarkMatter
nodist_HwDMModel_la_SOURCES = \
DarkMatter/DM__all.cc
#############
HwLHTPModel_la_LDFLAGS = \
$(AM_LDFLAGS) -module -version-info 7:0:0
HwLHTPModel_la_LIBADD = \
$(GSLLIBS)
HwLHTPModel_la_CPPFLAGS = \
$(AM_CPPFLAGS) $(GSLINCLUDE) -I$(srcdir)/LHTP
nodist_HwLHTPModel_la_SOURCES = \
LHTP/LHTP__all.cc
#############
diff --git a/Shower/QTilde/Couplings/HiddenValleyAlpha.cc b/Shower/QTilde/Couplings/HiddenValleyAlpha.cc
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/Couplings/HiddenValleyAlpha.cc
@@ -0,0 +1,333 @@
+// -*- C++ -*-
+//
+// HiddenValleyAlpha.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
+// Copyright (C) 2002-2007 The Herwig Collaboration
+//
+// Herwig is licenced under version 2 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 HiddenValleyAlpha class.
+//
+#include "HiddenValleyAlpha.h"
+#include "Herwig/Models/HiddenValley/HiddenValleyModel.h"
+#include "ThePEG/PDT/EnumParticles.h"
+#include "ThePEG/PDT/ParticleData.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Interface/Switch.h"
+#include "ThePEG/Interface/Parameter.h"
+#include "ThePEG/Interface/Command.h"
+#include "ThePEG/Persistency/PersistentOStream.h"
+#include "ThePEG/Persistency/PersistentIStream.h"
+#include "ThePEG/Utilities/Throw.h"
+
+using namespace Herwig;
+
+IBPtr HiddenValleyAlpha::clone() const {
+ return new_ptr(*this);
+}
+
+IBPtr HiddenValleyAlpha::fullclone() const {
+ return new_ptr(*this);
+}
+
+void HiddenValleyAlpha::persistentOutput(PersistentOStream & os) const {
+ os << _asType << _asMaxNP << ounit(_qmin,GeV) << _nloop << _thresopt
+ << ounit(_lambdain,GeV) << _tolerance << _maxtry << _alphamin
+ << ounit(_thresholds,GeV) << ounit(_lambda,GeV) << _ca << _cf << _tr;
+}
+
+void HiddenValleyAlpha::persistentInput(PersistentIStream & is, int) {
+ is >> _asType >> _asMaxNP >> iunit(_qmin,GeV) >> _nloop >> _thresopt
+ >> iunit(_lambdain,GeV) >> _tolerance >> _maxtry >> _alphamin
+ >> iunit(_thresholds,GeV) >> iunit(_lambda,GeV) >> _ca >> _cf >> _tr;
+}
+
+ClassDescription<HiddenValleyAlpha> HiddenValleyAlpha::initHiddenValleyAlpha;
+// Definition of the static class description member.
+
+void HiddenValleyAlpha::Init() {
+
+ static ClassDocumentation<HiddenValleyAlpha> documentation
+ ("This (concrete) class describes the QCD alpha running.");
+
+ static Switch<HiddenValleyAlpha, int> intAsType
+ ("NPAlphaS",
+ "Behaviour of AlphaS in the NP region",
+ &HiddenValleyAlpha::_asType, 1, false, false);
+ static SwitchOption intAsTypeZero
+ (intAsType, "Zero","zero below Q_min", 1);
+ static SwitchOption intAsTypeConst
+ (intAsType, "Const","const as(qmin) below Q_min", 2);
+ static SwitchOption intAsTypeLin
+ (intAsType, "Linear","growing linearly below Q_min", 3);
+ static SwitchOption intAsTypeQuad
+ (intAsType, "Quadratic","growing quadratically below Q_min", 4);
+ static SwitchOption intAsTypeExx1
+ (intAsType, "Exx1", "quadratic from AlphaMaxNP down to as(Q_min)", 5);
+ static SwitchOption intAsTypeExx2
+ (intAsType, "Exx2", "const = AlphaMaxNP below Q_min", 6);
+
+ // default such that as(qmin) = 1 in the current parametrization.
+ // min = Lambda3
+ static Parameter<HiddenValleyAlpha,Energy> intQmin
+ ("Qmin", "Q < Qmin is treated with NP parametrization as of (unit [GeV])",
+ &HiddenValleyAlpha::_qmin, GeV, 0.630882*GeV, 0.330445*GeV,
+ 100.0*GeV,false,false,false);
+
+ static Parameter<HiddenValleyAlpha,double> interfaceAlphaMaxNP
+ ("AlphaMaxNP",
+ "Max value of alpha in NP region, only relevant if NPAlphaS = 5,6",
+ &HiddenValleyAlpha::_asMaxNP, 1.0, 0., 100.0,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyAlpha,unsigned int> interfaceNumberOfLoops
+ ("NumberOfLoops",
+ "The number of loops to use in the alpha_S calculation",
+ &HiddenValleyAlpha::_nloop, 2, 1, 2,
+ false, false, Interface::limited);
+
+ static Switch<HiddenValleyAlpha,bool> interfaceLambdaOption
+ ("LambdaOption",
+ "Option for the calculation of the Lambda used in the simulation from the input"
+ " Lambda_MSbar",
+ &HiddenValleyAlpha::_lambdaopt, false, false, false);
+ static SwitchOption interfaceLambdaOptionfalse
+ (interfaceLambdaOption,
+ "Same",
+ "Use the same value",
+ false);
+ static SwitchOption interfaceLambdaOptionConvert
+ (interfaceLambdaOption,
+ "Convert",
+ "Use the conversion to the Herwig scheme from NPB349, 635",
+ true);
+
+ static Parameter<HiddenValleyAlpha,Energy> interfaceLambdaDark
+ ("LambdaDark",
+ "Input value of Lambda_MSBar",
+ &HiddenValleyAlpha::_lambdain, GeV, 0.208364*GeV, 100.0*MeV, 100.0*GeV,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyAlpha,double> interfaceTolerance
+ ("Tolerance",
+ "The tolerance for discontinuities in alphaS at thresholds.",
+ &HiddenValleyAlpha::_tolerance, 1e-10, 1e-20, 1e-4,
+ false, false, Interface::limited);
+
+ static Parameter<HiddenValleyAlpha,unsigned int> interfaceMaximumIterations
+ ("MaximumIterations",
+ "The maximum number of iterations for the Newton-Raphson method to converge.",
+ &HiddenValleyAlpha::_maxtry, 100, 10, 1000,
+ false, false, Interface::limited);
+
+ static Switch<HiddenValleyAlpha,bool> interfaceThresholdOption
+ ("ThresholdOption",
+ "Whether to use the consistuent or normal masses for the thresholds",
+ &HiddenValleyAlpha::_thresopt, true, false, false);
+ static SwitchOption interfaceThresholdOptionCurrent
+ (interfaceThresholdOption,
+ "Current",
+ "Use the current masses",
+ true);
+ static SwitchOption interfaceThresholdOptionConstituent
+ (interfaceThresholdOption,
+ "Constituent",
+ "Use the constitent masses.",
+ false);
+}
+
+double HiddenValleyAlpha::value(const Energy2 scale) const {
+ pair<short,Energy> nflam;
+ Energy q = sqrt(scale);
+ double val(0.);
+ // special handling if the scale is less than Qmin
+ if (q < _qmin) {
+ nflam = getLamNfTwoLoop(_qmin);
+ double val0 = alphaS(_qmin, nflam.second, nflam.first);
+ switch (_asType) {
+ case 1:
+ // flat, zero; the default type with no NP effects.
+ val = 0.;
+ break;
+ case 2:
+ // flat, non-zero alpha_s = alpha_s(q2min).
+ val = val0;
+ break;
+ case 3:
+ // linear in q
+ val = val0*q/_qmin;
+ break;
+ case 4:
+ // quadratic in q
+ val = val0*sqr(q/_qmin);
+ break;
+ case 5:
+ // quadratic in q, starting off at asMaxNP, ending on as(qmin)
+ val = (val0 - _asMaxNP)*sqr(q/_qmin) + _asMaxNP;
+ break;
+ case 6:
+ // just asMaxNP and constant
+ val = _asMaxNP;
+ break;
+ }
+ }
+ else {
+ // the 'ordinary' case
+ nflam = getLamNfTwoLoop(q);
+ val = alphaS(q, nflam.second, nflam.first);
+ }
+ return scaleFactor() * val;
+}
+
+double HiddenValleyAlpha::overestimateValue() const {
+ return scaleFactor() * _alphamin;
+}
+
+double HiddenValleyAlpha::ratio(const Energy2 scale,double) const {
+ pair<short,Energy> nflam;
+ Energy q = sqrt(scale);
+ double val(0.);
+ // special handling if the scale is less than Qmin
+ if (q < _qmin) {
+ nflam = getLamNfTwoLoop(_qmin);
+ double val0 = alphaS(_qmin, nflam.second, nflam.first);
+ switch (_asType) {
+ case 1:
+ // flat, zero; the default type with no NP effects.
+ val = 0.;
+ break;
+ case 2:
+ // flat, non-zero alpha_s = alpha_s(q2min).
+ val = val0;
+ break;
+ case 3:
+ // linear in q
+ val = val0*q/_qmin;
+ break;
+ case 4:
+ // quadratic in q
+ val = val0*sqr(q/_qmin);
+ break;
+ case 5:
+ // quadratic in q, starting off at asMaxNP, ending on as(qmin)
+ val = (val0 - _asMaxNP)*sqr(q/_qmin) + _asMaxNP;
+ break;
+ case 6:
+ // just asMaxNP and constant
+ val = _asMaxNP;
+ break;
+ }
+ } else {
+ // the 'ordinary' case
+ nflam = getLamNfTwoLoop(q);
+ val = alphaS(q, nflam.second, nflam.first);
+ }
+ // denominator
+ return val/_alphamin;
+}
+
+Energy HiddenValleyAlpha::computeLambda(Energy match,
+ double alpha,
+ unsigned int nflav) const {
+ Energy lamtest=200.0*MeV;
+ double xtest;
+ unsigned int ntry=0;
+ do {
+ ++ntry;
+ xtest=log(sqr(match/lamtest));
+ xtest+= (alpha-alphaS(match,lamtest,nflav))/derivativealphaS(match,lamtest,nflav);
+ lamtest=match/exp(0.5*xtest);
+ }
+ while(abs(alpha-alphaS(match,lamtest,nflav)) > _tolerance && ntry < _maxtry);
+ return lamtest;
+}
+
+pair<short, Energy> HiddenValleyAlpha::getLamNfTwoLoop(Energy q) const {
+ unsigned int ix=1;
+ for(;ix<_thresholds.size();ix++) {
+ if(q<_thresholds[ix]) break;
+ }
+ --ix;
+ return pair<short,Energy>(ix+_nf_light, _lambda[ix]);
+}
+
+void HiddenValleyAlpha::doinit() {
+ ShowerAlpha::doinit();
+ // get the model for parameters
+ tcHiddenValleyPtr model = dynamic_ptr_cast<tcHiddenValleyPtr>
+ (generator()->standardModel());
+ if(!model) throw InitException() << "Must be using the HiddenValleyModel"
+ << " in HiddenValleyAlpha::doinit()"
+ << Exception::runerror;
+ // get the colour factors
+ _ca = model->CA();
+ _cf = model->CF();
+ _tr = model->TR();
+ // get the thresholds
+ _thresholds.push_back(_qmin);
+ _nf_light = 0;
+ for(unsigned int ix=1;ix<=model->NF();++ix) {
+ Energy qmass = getParticleData(ParticleID::darkg+long(ix))->mass();
+ if (qmass > _qmin) _thresholds.push_back(qmass);
+ else _nf_light++;
+ }
+ _lambda.resize(_thresholds.size());
+
+
+ unsigned int nf = _nf_light;
+
+ // Set lambda below heavy quark thresholds to input value
+ _lambda[0]=_lambdain;
+ // convert lambda to the Monte Carlo scheme if needed
+ using Constants::pi;
+ if(_lambdaopt) _lambda[0] *=exp((0.5*_ca*(67./3.-sqr(pi))-_tr*nf*10./3.)/(11*_ca-2*nf))/sqrt(2.);
+
+ // Compute the threshold matching
+ for(int ix=0;ix<int(_thresholds.size())-1;++ix) {
+ _lambda[ix+1] = computeLambda(_thresholds[ix+1],alphaS(_thresholds[ix+1],
+ _lambda[ix],ix),ix+1);
+ }
+ // compute the maximum value of as
+ if ( _asType < 5 ) _alphamin = value(sqr(_qmin)+1.0e-8*sqr(MeV)); // approx as = 1
+ else _alphamin = max(_asMaxNP, value(sqr(_qmin)+1.0e-8*sqr(MeV)));
+ // check consistency lambda_3 < qmin
+ if(_lambda[0]>_qmin)
+ Throw<InitException>() << "The value of Qmin is less than Lambda in "
+ << _qmin/GeV << " < " << _lambda[0]/GeV
+ << " HiddenValleyAlpha::doinit " << Exception::abortnow;
+}
+
+double HiddenValleyAlpha::derivativealphaS(Energy q, Energy lam, int nf) const {
+ using Constants::pi;
+ double lx = log(sqr(q/lam));
+ // N.B. b_1 is divided by 2 due Hw++ convention
+ double b0 = 11./3.*_ca - 4./3.*_tr*nf;
+ double b1 = 17./3.*sqr(_ca) - nf*_tr*(10./3.*_ca+2.*_cf);
+ if(_nloop==1)
+ return -4.*pi/(b0*sqr(lx));
+ else if(_nloop==2)
+ return -4.*pi/(b0*sqr(lx))*(1.-2.*b1/sqr(b0)/lx*(1.-2.*log(lx)));
+ else
+ assert(false);
+ return 0.;
+}
+
+double HiddenValleyAlpha::alphaS(Energy q, Energy lam, int nf) const {
+ using Constants::pi;
+ double lx(log(sqr(q/lam)));
+ // N.B. b_1 is divided by 2 due Hw++ convention
+ double b0 = 11./3.*_ca - 4./3.*_tr*nf;
+ double b1 = 17./3.*sqr(_ca) - nf*_tr*(10./3.*_ca+2.*_cf);
+ // one loop
+ if(_nloop==1)
+ return 4.*pi/(b0*lx);
+ // two loop
+ else if(_nloop==2) {
+ return 4.*pi/(b0*lx)*(1.-2.*b1/sqr(b0)*log(lx)/lx);
+ }
+ else
+ assert(false);
+ return 0.;
+}
diff --git a/Shower/QTilde/Couplings/HiddenValleyAlpha.h b/Shower/QTilde/Couplings/HiddenValleyAlpha.h
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/Couplings/HiddenValleyAlpha.h
@@ -0,0 +1,333 @@
+// -*- C++ -*-
+//
+// HiddenValleyAlpha.h is a part of Herwig - A multi-purpose Monte Carlo event generator
+// Copyright (C) 2002-2007 The Herwig Collaboration
+//
+// Herwig is licenced under version 2 of the GPL, see COPYING for details.
+// Please respect the MCnet academic guidelines, see GUIDELINES for details.
+//
+#ifndef HERWIG_HiddenValleyAlpha_H
+#define HERWIG_HiddenValleyAlpha_H
+//
+// This is the declaration of the HiddenValleyAlpha class.
+//
+
+#include "Herwig/Shower/ShowerAlpha.h"
+#include "ThePEG/Config/Constants.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/** \ingroup Shower
+ *
+ * This concrete class provides the definition of the
+ * pure virtual function value() and overestimateValue() for the
+ * strong coupling.
+ *
+ * A number of different options for the running of the coupling
+ * and its initial definition are supported.
+ *
+ * @see \ref HiddenValleyAlphaInterfaces "The interfaces"
+ * defined for HiddenValleyAlpha.
+ */
+class HiddenValleyAlpha: public ShowerAlpha {
+
+public:
+
+ /**
+ * The default constructor.
+ */
+ HiddenValleyAlpha() : ShowerAlpha(),
+ _qmin(0.630882*GeV), _asType(1), _asMaxNP(1.0),
+ _nloop(2),_thresopt(false),
+ _lambdain(0.208364*GeV),
+ _tolerance(1e-10),
+ _maxtry(100),_alphamin(0.) {}
+
+public:
+
+ /**
+ * Methods to return the coupling
+ */
+ //@{
+ /**
+ * It returns the running coupling value evaluated at the input scale
+ * multiplied by the scale factor scaleFactor().
+ * @param scale The scale
+ * @return The coupling
+ */
+ virtual double value(const Energy2 scale) const;
+
+ /**
+ * It returns the running coupling value evaluated at the input scale
+ * multiplied by the scale factor scaleFactor().
+ */
+ virtual double overestimateValue() const;
+
+ /**
+ * Return the ratio of the coupling at the scale to the overestimated value
+ */
+ virtual double ratio(const Energy2 scale,double factor=1.) const;
+
+ /**
+ * Initialize this coupling.
+ */
+ virtual void initialize() { doinit(); }
+
+ //@}
+
+ /**
+ * Get the value of \f$\Lambda_{\rm QCd}\f$
+ * @param nf number of flavours
+ */
+ Energy lambdaQCD(unsigned int nf) {
+ if (nf <= 3) return _lambda[0];
+ else if (nf==4 || nf==5) return _lambda[nf-3];
+ else return _lambda[3];
+ }
+
+public:
+
+ /** @name Functions used by the persistent I/O system. */
+ //@{
+ /**
+ * Function used to write out object persistently.
+ * @param os the persistent output stream written to.
+ */
+ void persistentOutput(PersistentOStream & os) const;
+
+ /**
+ * Function used to read in object persistently.
+ * @param is the persistent input stream read from.
+ * @param version the version number of the object when written.
+ */
+ void persistentInput(PersistentIStream & is, int version);
+ //@}
+
+ /**
+ * The standard Init function used to initialize the interfaces.
+ * Called exactly once for each class by the class description system
+ * before the main function starts or
+ * when this class is dynamically loaded.
+ */
+ static void Init();
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr clone() const;
+
+ /** Make a clone of this object, possibly modifying the cloned object
+ * to make it sane.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr fullclone() const;
+ //@}
+
+
+protected:
+
+ /** @name Standard Interfaced functions. */
+ //@{
+ /**
+ * Initialize this object after the setup phase before saving an
+ * EventGenerator to disk.
+ * @throws InitException if object could not be initialized properly.
+ */
+ virtual void doinit();
+ //@}
+
+private:
+
+ /**
+ * Member functions which calculate the coupling
+ */
+ //@{
+ /**
+ * The 1,2,3-loop parametrization of \f$\alpha_S\f$.
+ * @param q The scale
+ * @param lam \f$\Lambda_{\rm QCD}\f$
+ * @param nf The number of flavours
+ */
+ double alphaS(Energy q, Energy lam, int nf) const;
+
+ /**
+ * The derivative of \f$\alpha_S\f$ with respect to \f$\ln(Q^2/\Lambda^2)\f$
+ * @param q The scale
+ * @param lam \f$\Lambda_{\rm QCD}\f$
+ * @param nf The number of flavours
+ */
+ double derivativealphaS(Energy q, Energy lam, int nf) const;
+
+ /**
+ * Compute the value of \f$Lambda\f$ needed to get the input value of
+ * the strong coupling at the scale given for the given number of flavours
+ * using the Newton-Raphson method
+ * @param match The scale for the coupling
+ * @param alpha The input coupling
+ * @param nflav The number of flavours
+ */
+ Energy computeLambda(Energy match, double alpha, unsigned int nflav) const;
+
+ /**
+ * Return the value of \f$\Lambda\f$ and the number of flavours at the scale.
+ * @param q The scale
+ * @return The number of flavours at the scale and \f$\Lambda\f$.
+ */
+ pair<short, Energy> getLamNfTwoLoop(Energy q) const;
+ //@}
+
+private:
+
+ /**
+ * The static object used to initialize the description of this class.
+ * Indicates that this is a concrete class with persistent data.
+ */
+ static ClassDescription<HiddenValleyAlpha> initHiddenValleyAlpha;
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ HiddenValleyAlpha & operator=(const HiddenValleyAlpha &);
+
+private:
+
+ /**
+ * Minimum value of the scale
+ */
+ Energy _qmin;
+
+ /**
+ * Parameter controlling the behaviour of \f$\alpha_S\f$ in the
+ * non-perturbative region.
+ */
+ int _asType;
+
+ /**
+ * Another parameter, a possible (maximum) value of alpha in the
+ * non-perturbative region.
+ */
+ double _asMaxNP;
+
+ /**
+ * Thresholds for the different number of flavours
+ */
+ vector<Energy> _thresholds;
+
+ /**
+ * \f$\Lambda\f$ for the different number of flavours
+ */
+ vector<Energy> _lambda;
+
+ /**
+ * Option for the number of loops
+ */
+ unsigned int _nloop;
+
+ /**
+ * Option for the threshold masses
+ */
+ bool _thresopt;
+
+ /**
+ * Input value of Lambda
+ */
+ Energy _lambdain;
+
+ /**
+ * Whether to convert lambda from MSbar scheme
+ */
+ bool _lambdaopt;
+
+ /**
+ * Whether to use input value of alphas(MZ) or lambda
+ */
+ bool _inopt;
+
+ /**
+ * Tolerance for discontinuities at the thresholds
+ */
+ double _tolerance;
+
+ /**
+ * Maximum number of iterations for the Newton-Raphson method to converge
+ */
+ unsigned int _maxtry;
+
+ /**
+ * Number of light flavours (below qmin)
+ */
+ unsigned int _nf_light;
+
+ /**
+ * The minimum value of the coupling
+ */
+ double _alphamin;
+
+ /**
+ * Colour factors
+ */
+ //@{
+ /**
+ * \f$C_A\f$
+ */
+ double _ca;
+ /**
+ * \f$C_A\f$
+ */
+ double _cf;
+
+ /**
+ * \f$T_R\f$
+ */
+ double _tr;
+ //@}
+
+};
+
+}
+
+#include "ThePEG/Utilities/ClassTraits.h"
+
+namespace ThePEG {
+
+/** @cond TRAITSPECIALIZATIONS */
+
+/** This template specialization informs ThePEG about the
+ * base classes of HiddenValleyAlpha. */
+template <>
+struct BaseClassTrait<Herwig::HiddenValleyAlpha,1> {
+ /** Typedef of the first base class of HiddenValleyAlpha. */
+ typedef Herwig::ShowerAlpha NthBase;
+};
+
+/** This template specialization informs ThePEG about the name of
+ * the HiddenValleyAlpha class and the shared object where it is defined. */
+template <>
+struct ClassTraits<Herwig::HiddenValleyAlpha>
+ : public ClassTraitsBase<Herwig::HiddenValleyAlpha> {
+ /** Return a platform-independent class name */
+ static string className() { return "Herwig::HiddenValleyAlpha"; }
+ /**
+ * The name of a file containing the dynamic library where the class
+ * HiddenValleyAlpha is implemented. It may also include several,
+ * space-separated, libraries if the class HiddenValleyAlpha depends on
+ * other classes (base classes excepted). In this case the listed
+ * libraries will be dynamically linked in the order they are
+ * specified.
+ */
+ static string library() { return "HwShower.so Herwig.so"; }
+};
+
+/** @endcond */
+
+}
+
+#endif /* HERWIG_HiddenValleyAlpha_H */
diff --git a/Shower/QTilde/Dark/AdditionalGaugeParticleData.fh b/Shower/QTilde/Dark/AdditionalGaugeParticleData.fh
deleted file mode 100644
--- a/Shower/QTilde/Dark/AdditionalGaugeParticleData.fh
+++ /dev/null
@@ -1,19 +0,0 @@
-// -*- C++ -*-
-//
-// This is the forward declaration of the AdditionalGaugeParticleData class.
-//
-#ifndef HERWIG_AdditionalGaugeParticleData_FH
-#define HERWIG_AdditionalGaugeParticleData_FH
-
-#include "ThePEG/Config/ThePEG.h"
-
-namespace Herwig {
-
-class AdditionalGaugeParticleData;
-
-ThePEG_DECLARE_POINTERS(Herwig::AdditionalGaugeParticleData,
- AdditionalGaugeParticleDataPtr);
-
-}
-
-#endif
diff --git a/Shower/QTilde/Dark/HalfHalfOneDarkSplitFn.cc b/Shower/QTilde/Dark/HalfHalfOneDarkSplitFn.cc
deleted file mode 100644
--- a/Shower/QTilde/Dark/HalfHalfOneDarkSplitFn.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// -*- C++ -*-
-//
-// HalfHalfOneDarkSplitFn.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 HalfHalfOneDarkSplitFn class.
-//
-
-#include "HalfHalfOneDarkSplitFn.h"
-#include "HiddenValleyModel.h"
-#include "ThePEG/PDT/ParticleData.h"
-#include "ThePEG/Interface/ClassDocumentation.h"
-#include "ThePEG/Utilities/DescribeClass.h"
-#include <cassert>
-
-using namespace Herwig;
-
-DescribeNoPIOClass<HalfHalfOneDarkSplitFn,Herwig::Sudakov1to2FormFactor>
-describeHalfHalfOneDarkSplitFn ("Herwig::HalfHalfOneDarkSplitFn","HwShower.so");
-
-void HalfHalfOneDarkSplitFn::Init() {
- // documentation
- static ClassDocumentation<HalfHalfOneDarkSplitFn> documentation
- ("The HalfHalfOneDarkSplitFn class implements the dark coloured q -> qg splitting function");
-}
-
-bool HalfHalfOneDarkSplitFn::checkColours(const IdList & ids) const {
- if(colourStructure()==TripletTripletOctet) {
- if(ids[0]!=ids[1]) return false;
- if((ids[0]->iColour()==PDT::DarkColourFundamental||
- ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
- ids[2]->iColour()==PDT::DarkColourAdjoint) return true;
- return false;
- }
- else if(colourStructure()==OctetOctetOctet) {
- for(unsigned int ix=0;ix<3;++ix) {
- if(ids[ix]->iColour()!=PDT::DarkColourAdjoint) return false;
- }
- return true;
- }
- else if(colourStructure()==OctetTripletTriplet) {
- if(ids[0]->iColour()!=PDT::DarkColourAdjoint) return false;
- if(ids[1]->iColour()==PDT::DarkColourFundamental&&
- ids[2]->iColour()==PDT::DarkColourAntiFundamental)
- return true;
- if(ids[1]->iColour()==PDT::DarkColourAntiFundamental&&
- ids[2]->iColour()==PDT::DarkColourFundamental)
- return true;
- return false;
- }
- else if(colourStructure()==TripletOctetTriplet) {
- if(ids[0]!=ids[2]) return false;
- if((ids[0]->iColour()==PDT::DarkColourFundamental||
- ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
- ids[1]->iColour()==PDT::DarkColourAdjoint) return true;
- return false;
- }
- else {
- assert(false);
- }
- return false;
-}
-
-double HalfHalfOneDarkSplitFn::P(const double z, const Energy2 t,
- const IdList &ids, const bool mass, const RhoDMatrix & ) const {
- double val = (1. + sqr(z))/(1.-z);
- if(mass) {
- Energy m = ids[0]->mass();
- val -= 2.*sqr(m)/t;
- }
- return val;
-}
-
-double HalfHalfOneDarkSplitFn::overestimateP(const double z,
- const IdList & ) const {
- return 2./(1.-z);
-}
-
-double HalfHalfOneDarkSplitFn::ratioP(const double z, const Energy2 t,
- const IdList & ids, const bool mass, const RhoDMatrix & ) const {
- double val = 1. + sqr(z);
- if(mass) {
- Energy m = ids[0]->mass();
- val -= 2.*sqr(m)*(1.-z)/t;
- }
- return 0.5*val;
-}
-
-double HalfHalfOneDarkSplitFn::integOverP(const double z,
- const IdList & ,
- unsigned int PDFfactor) const {
- switch (PDFfactor) {
- case 0:
- return -2.*Math::log1m(z);
- case 1:
- return 2.*log(z/(1.-z));
- case 2:
- return 2./(1.-z);
- case 3:
- default:
- throw Exception() << "HalfHalfOneDarkSplitFn::integOverP() invalid PDFfactor = "
- << PDFfactor << Exception::runerror;
- }
-}
-
-double HalfHalfOneDarkSplitFn::invIntegOverP(const double r, const IdList &,
- unsigned int PDFfactor) const {
- switch (PDFfactor) {
- case 0:
- return 1. - exp(- 0.5*r);
- case 1:
- return 1./(1.-exp(-0.5*r));
- case 2:
- return 1.-2./r;
- case 3:
- default:
- throw Exception() << "HalfHalfOneDarkSplitFn::invIntegOverP() invalid PDFfactor = "
- << PDFfactor << Exception::runerror;
- }
-}
-
-bool HalfHalfOneDarkSplitFn::accept(const IdList &ids) const {
- // 3 particles and in and out fermion same
- if(ids.size()!=3 || ids[0]!=ids[1]) return false;
- if(ids[0]->iSpin()!=PDT::Spin1Half ||
- ids[2]->iSpin()!=PDT::Spin1) return false;
- return checkColours(ids);
-}
-
-vector<pair<int, Complex> >
-HalfHalfOneDarkSplitFn::generatePhiForward(const double, const Energy2, const IdList & ,
- const RhoDMatrix &) {
- // no dependence on the spin density matrix, dependence on off-diagonal terms cancels
- // and rest = splitting function for Tr(rho)=1 as required by defn
- return {{ {0, 1.} }};
-}
-
-vector<pair<int, Complex> >
-HalfHalfOneDarkSplitFn::generatePhiBackward(const double, const Energy2, const IdList & ,
- const RhoDMatrix &) {
- // no dependence on the spin density matrix, dependence on off-diagonal terms cancels
- // and rest = splitting function for Tr(rho)=1 as required by defn
- return {{ {0, 1.} }};
-}
-
-DecayMEPtr HalfHalfOneDarkSplitFn::matrixElement(const double z, const Energy2 t,
- const IdList & ids, const double phi,
- bool timeLike) {
- // calculate the kernal
- DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1Half,PDT::Spin1Half,PDT::Spin1)));
- Energy m = !timeLike ? ZERO : ids[0]->mass();
- double mt = m/sqrt(t);
- double root = sqrt(1.-(1.-z)*sqr(m)/z/t);
- double romz = sqrt(1.-z);
- double rz = sqrt(z);
- Complex phase = exp(Complex(0.,1.)*phi);
- (*kernal)(0,0,0) = -root/romz*phase;
- (*kernal)(1,1,2) = -conj((*kernal)(0,0,0));
- (*kernal)(0,0,2) = root/romz*z/phase;
- (*kernal)(1,1,0) = -conj((*kernal)(0,0,2));
- (*kernal)(1,0,2) = mt*(1.-z)/rz;
- (*kernal)(0,1,0) = conj((*kernal)(1,0,2));
- (*kernal)(0,1,2) = 0.;
- (*kernal)(1,0,0) = 0.;
- return kernal;
-}
diff --git a/Shower/QTilde/Dark/HalfHalfOneDarkSplitFn.h b/Shower/QTilde/Dark/HalfHalfOneDarkSplitFn.h
deleted file mode 100644
--- a/Shower/QTilde/Dark/HalfHalfOneDarkSplitFn.h
+++ /dev/null
@@ -1,189 +0,0 @@
-// -*- C++ -*-
-//
-// HalfHalfOneDarkSplitFn.h 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.
-//
-#ifndef HERWIG_HalfHalfOneDarkSplitFn_H
-#define HERWIG_HalfHalfOneDarkSplitFn_H
-//
-// This is the declaration of the HalfHalfOneDarkSplitFn class.
-//
-
-#include "Herwig/Shower/QTilde/SplittingFunctions/Sudakov1to2FormFactor.h"
-#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
-
-namespace Herwig {
-
-using namespace ThePEG;
-
-/**\ingroup Shower
- *
- * This class provides the concrete implementation of the exact leading-order
- * splitting function for \f$\frac12\to q\frac12 1\f$.
- *
- * In this case the splitting function is given by
- * \f[P(z,t) =C\left(\frac{1+z^2}{1-z}-2\frac{m^2_q}{t}\right),\f]
- * where \f$C\f$ is the corresponding colour factor.
- * Our choice for the overestimate is
- * \f[P_{\rm over}(z) = \frac{2C}{1-z},\f]
- * therefore the integral is
- * \f[\int P_{\rm over}(z) {\rm d}z = -2C\ln(1-z),\f]
- * and its inverse is
- * \f[1-\exp\left(\frac{r}{2C}\right).\f]
- *
- * @see \ref HalfHalfOneDarkSplitFnInterfaces "The interfaces"
- * defined for HalfHalfOneDarkSplitFn.
- */
-class HalfHalfOneDarkSplitFn: public Sudakov1to2FormFactor {
-
-public:
-
- /**
- * Method to check the colours are correct
- */
- virtual bool checkColours(const IdList & ids) const;
-
- /**
- * Concrete implementation of the method to determine whether this splitting
- * function can be used for a given set of particles.
- * @param ids The PDG codes for the particles in the splitting.
- */
- virtual bool accept(const IdList & ids) const;
-
- /**
- * Methods to return the splitting function.
- */
- //@{
- /**
- * The concrete implementation of the splitting function, \f$P(z,t)\f$.
- * @param z The energy fraction.
- * @param t The scale.
- * @param ids The PDG codes for the particles in the splitting.
- * @param mass Whether or not to include the mass dependent terms
- * @param rho The spin density matrix
- */
- virtual double P(const double z, const Energy2 t, const IdList & ids,
- const bool mass, const RhoDMatrix & rho) const;
-
- /**
- * The concrete implementation of the overestimate of the splitting function,
- * \f$P_{\rm over}\f$.
- * @param z The energy fraction.
- * @param ids The PDG codes for the particles in the splitting.
- */
- virtual double overestimateP(const double z, const IdList & ids) const;
-
- /**
- * The concrete implementation of the
- * the ratio of the splitting function to the overestimate, i.e.
- * \f$P(z,t)/P_{\rm over}(z)\f$.
- * @param z The energy fraction.
- * @param t The scale.
- * @param ids The PDG codes for the particles in the splitting.
- * @param mass Whether or not to include the mass dependent terms
- * @param rho The spin density matrix
- */
- virtual double ratioP(const double z, const Energy2 t, const IdList & ids,
- const bool mass, const RhoDMatrix & rho) const;
-
- /**
- * The concrete implementation of the indefinite integral of the
- * overestimated splitting function, \f$P_{\rm over}\f$.
- * @param z The energy fraction.
- * @param ids The PDG codes for the particles in the splitting.
- * @param PDFfactor Which additional factor to include for the PDF
- * 0 is no additional factor,
- * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
- */
- virtual double integOverP(const double z, const IdList & ids,
- unsigned int PDFfactor=0) const;
-
- /**
- * The concrete implementation of the inverse of the indefinite integral.
- * @param r Value of the splitting function to be inverted
- * @param ids The PDG codes for the particles in the splitting.
- * @param PDFfactor Which additional factor to include for the PDF
- * 0 is no additional factor,
- * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
- */
- virtual double invIntegOverP(const double r, const IdList & ids,
- unsigned int PDFfactor=0) const;
- //@}
-
- /**
- * Method to calculate the azimuthal angle
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- * @return The weight
- */
- virtual vector<pair<int,Complex> >
- generatePhiForward(const double z, const Energy2 t, const IdList & ids,
- const RhoDMatrix &);
-
- /**
- * Method to calculate the azimuthal angle for backward evolution
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- * @return The weight
- */
- virtual vector<pair<int,Complex> >
- generatePhiBackward(const double z, const Energy2 t, const IdList & ids,
- const RhoDMatrix &);
-
- /**
- * Calculate the matrix element for the splitting
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- */
- virtual DecayMEPtr matrixElement(const double z, const Energy2 t,
- const IdList & ids, const double phi, bool timeLike);
-
-public:
-
- /**
- * The standard Init function used to initialize the interfaces.
- * Called exactly once for each class by the class description system
- * before the main function starts or
- * when this class is dynamically loaded.
- */
- static void Init();
-
-protected:
-
- /** @name Clone Methods. */
- //@{
- /**
- * Make a simple clone of this object.
- * @return a pointer to the new object.
- */
- virtual IBPtr clone() const {return new_ptr(*this);}
-
- /** Make a clone of this object, possibly modifying the cloned object
- * to make it sane.
- * @return a pointer to the new object.
- */
- virtual IBPtr fullclone() const {return new_ptr(*this);}
- //@}
-
-private:
-
- /**
- * The assignment operator is private and must never be called.
- * In fact, it should not even be implemented.
- */
- HalfHalfOneDarkSplitFn & operator=(const HalfHalfOneDarkSplitFn &) = delete;
-
-};
-
-}
-
-#endif /* HERWIG_HalfHalfOneDarkSplitFn_H */
diff --git a/Shower/QTilde/Dark/HiddenValleyAlpha.cc b/Shower/QTilde/Dark/HiddenValleyAlpha.cc
deleted file mode 100644
--- a/Shower/QTilde/Dark/HiddenValleyAlpha.cc
+++ /dev/null
@@ -1,333 +0,0 @@
-// -*- C++ -*-
-//
-// HiddenValleyAlpha.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
-// Copyright (C) 2002-2007 The Herwig Collaboration
-//
-// Herwig is licenced under version 2 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 HiddenValleyAlpha class.
-//
-#include "HiddenValleyAlpha.h"
-#include "HiddenValleyModel.h"
-#include "ThePEG/PDT/EnumParticles.h"
-#include "ThePEG/PDT/ParticleData.h"
-#include "ThePEG/Interface/ClassDocumentation.h"
-#include "ThePEG/Interface/Switch.h"
-#include "ThePEG/Interface/Parameter.h"
-#include "ThePEG/Interface/Command.h"
-#include "ThePEG/Persistency/PersistentOStream.h"
-#include "ThePEG/Persistency/PersistentIStream.h"
-#include "ThePEG/Utilities/Throw.h"
-
-using namespace Herwig;
-
-IBPtr HiddenValleyAlpha::clone() const {
- return new_ptr(*this);
-}
-
-IBPtr HiddenValleyAlpha::fullclone() const {
- return new_ptr(*this);
-}
-
-void HiddenValleyAlpha::persistentOutput(PersistentOStream & os) const {
- os << _asType << _asMaxNP << ounit(_qmin,GeV) << _nloop << _thresopt
- << ounit(_lambdain,GeV) << _tolerance << _maxtry << _alphamin
- << ounit(_thresholds,GeV) << ounit(_lambda,GeV) << _ca << _cf << _tr;
-}
-
-void HiddenValleyAlpha::persistentInput(PersistentIStream & is, int) {
- is >> _asType >> _asMaxNP >> iunit(_qmin,GeV) >> _nloop >> _thresopt
- >> iunit(_lambdain,GeV) >> _tolerance >> _maxtry >> _alphamin
- >> iunit(_thresholds,GeV) >> iunit(_lambda,GeV) >> _ca >> _cf >> _tr;
-}
-
-ClassDescription<HiddenValleyAlpha> HiddenValleyAlpha::initHiddenValleyAlpha;
-// Definition of the static class description member.
-
-void HiddenValleyAlpha::Init() {
-
- static ClassDocumentation<HiddenValleyAlpha> documentation
- ("This (concrete) class describes the QCD alpha running.");
-
- static Switch<HiddenValleyAlpha, int> intAsType
- ("NPAlphaS",
- "Behaviour of AlphaS in the NP region",
- &HiddenValleyAlpha::_asType, 1, false, false);
- static SwitchOption intAsTypeZero
- (intAsType, "Zero","zero below Q_min", 1);
- static SwitchOption intAsTypeConst
- (intAsType, "Const","const as(qmin) below Q_min", 2);
- static SwitchOption intAsTypeLin
- (intAsType, "Linear","growing linearly below Q_min", 3);
- static SwitchOption intAsTypeQuad
- (intAsType, "Quadratic","growing quadratically below Q_min", 4);
- static SwitchOption intAsTypeExx1
- (intAsType, "Exx1", "quadratic from AlphaMaxNP down to as(Q_min)", 5);
- static SwitchOption intAsTypeExx2
- (intAsType, "Exx2", "const = AlphaMaxNP below Q_min", 6);
-
- // default such that as(qmin) = 1 in the current parametrization.
- // min = Lambda3
- static Parameter<HiddenValleyAlpha,Energy> intQmin
- ("Qmin", "Q < Qmin is treated with NP parametrization as of (unit [GeV])",
- &HiddenValleyAlpha::_qmin, GeV, 0.630882*GeV, 0.330445*GeV,
- 100.0*GeV,false,false,false);
-
- static Parameter<HiddenValleyAlpha,double> interfaceAlphaMaxNP
- ("AlphaMaxNP",
- "Max value of alpha in NP region, only relevant if NPAlphaS = 5,6",
- &HiddenValleyAlpha::_asMaxNP, 1.0, 0., 100.0,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyAlpha,unsigned int> interfaceNumberOfLoops
- ("NumberOfLoops",
- "The number of loops to use in the alpha_S calculation",
- &HiddenValleyAlpha::_nloop, 2, 1, 2,
- false, false, Interface::limited);
-
- static Switch<HiddenValleyAlpha,bool> interfaceLambdaOption
- ("LambdaOption",
- "Option for the calculation of the Lambda used in the simulation from the input"
- " Lambda_MSbar",
- &HiddenValleyAlpha::_lambdaopt, false, false, false);
- static SwitchOption interfaceLambdaOptionfalse
- (interfaceLambdaOption,
- "Same",
- "Use the same value",
- false);
- static SwitchOption interfaceLambdaOptionConvert
- (interfaceLambdaOption,
- "Convert",
- "Use the conversion to the Herwig scheme from NPB349, 635",
- true);
-
- static Parameter<HiddenValleyAlpha,Energy> interfaceLambdaDark
- ("LambdaDark",
- "Input value of Lambda_MSBar",
- &HiddenValleyAlpha::_lambdain, GeV, 0.208364*GeV, 100.0*MeV, 100.0*GeV,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyAlpha,double> interfaceTolerance
- ("Tolerance",
- "The tolerance for discontinuities in alphaS at thresholds.",
- &HiddenValleyAlpha::_tolerance, 1e-10, 1e-20, 1e-4,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyAlpha,unsigned int> interfaceMaximumIterations
- ("MaximumIterations",
- "The maximum number of iterations for the Newton-Raphson method to converge.",
- &HiddenValleyAlpha::_maxtry, 100, 10, 1000,
- false, false, Interface::limited);
-
- static Switch<HiddenValleyAlpha,bool> interfaceThresholdOption
- ("ThresholdOption",
- "Whether to use the consistuent or normal masses for the thresholds",
- &HiddenValleyAlpha::_thresopt, true, false, false);
- static SwitchOption interfaceThresholdOptionCurrent
- (interfaceThresholdOption,
- "Current",
- "Use the current masses",
- true);
- static SwitchOption interfaceThresholdOptionConstituent
- (interfaceThresholdOption,
- "Constituent",
- "Use the constitent masses.",
- false);
-}
-
-double HiddenValleyAlpha::value(const Energy2 scale) const {
- pair<short,Energy> nflam;
- Energy q = sqrt(scale);
- double val(0.);
- // special handling if the scale is less than Qmin
- if (q < _qmin) {
- nflam = getLamNfTwoLoop(_qmin);
- double val0 = alphaS(_qmin, nflam.second, nflam.first);
- switch (_asType) {
- case 1:
- // flat, zero; the default type with no NP effects.
- val = 0.;
- break;
- case 2:
- // flat, non-zero alpha_s = alpha_s(q2min).
- val = val0;
- break;
- case 3:
- // linear in q
- val = val0*q/_qmin;
- break;
- case 4:
- // quadratic in q
- val = val0*sqr(q/_qmin);
- break;
- case 5:
- // quadratic in q, starting off at asMaxNP, ending on as(qmin)
- val = (val0 - _asMaxNP)*sqr(q/_qmin) + _asMaxNP;
- break;
- case 6:
- // just asMaxNP and constant
- val = _asMaxNP;
- break;
- }
- }
- else {
- // the 'ordinary' case
- nflam = getLamNfTwoLoop(q);
- val = alphaS(q, nflam.second, nflam.first);
- }
- return scaleFactor() * val;
-}
-
-double HiddenValleyAlpha::overestimateValue() const {
- return scaleFactor() * _alphamin;
-}
-
-double HiddenValleyAlpha::ratio(const Energy2 scale,double) const {
- pair<short,Energy> nflam;
- Energy q = sqrt(scale);
- double val(0.);
- // special handling if the scale is less than Qmin
- if (q < _qmin) {
- nflam = getLamNfTwoLoop(_qmin);
- double val0 = alphaS(_qmin, nflam.second, nflam.first);
- switch (_asType) {
- case 1:
- // flat, zero; the default type with no NP effects.
- val = 0.;
- break;
- case 2:
- // flat, non-zero alpha_s = alpha_s(q2min).
- val = val0;
- break;
- case 3:
- // linear in q
- val = val0*q/_qmin;
- break;
- case 4:
- // quadratic in q
- val = val0*sqr(q/_qmin);
- break;
- case 5:
- // quadratic in q, starting off at asMaxNP, ending on as(qmin)
- val = (val0 - _asMaxNP)*sqr(q/_qmin) + _asMaxNP;
- break;
- case 6:
- // just asMaxNP and constant
- val = _asMaxNP;
- break;
- }
- } else {
- // the 'ordinary' case
- nflam = getLamNfTwoLoop(q);
- val = alphaS(q, nflam.second, nflam.first);
- }
- // denominator
- return val/_alphamin;
-}
-
-Energy HiddenValleyAlpha::computeLambda(Energy match,
- double alpha,
- unsigned int nflav) const {
- Energy lamtest=200.0*MeV;
- double xtest;
- unsigned int ntry=0;
- do {
- ++ntry;
- xtest=log(sqr(match/lamtest));
- xtest+= (alpha-alphaS(match,lamtest,nflav))/derivativealphaS(match,lamtest,nflav);
- lamtest=match/exp(0.5*xtest);
- }
- while(abs(alpha-alphaS(match,lamtest,nflav)) > _tolerance && ntry < _maxtry);
- return lamtest;
-}
-
-pair<short, Energy> HiddenValleyAlpha::getLamNfTwoLoop(Energy q) const {
- unsigned int ix=1;
- for(;ix<_thresholds.size();ix++) {
- if(q<_thresholds[ix]) break;
- }
- --ix;
- return pair<short,Energy>(ix+_nf_light, _lambda[ix]);
-}
-
-void HiddenValleyAlpha::doinit() {
- ShowerAlpha::doinit();
- // get the model for parameters
- tcHiddenValleyPtr model = dynamic_ptr_cast<tcHiddenValleyPtr>
- (generator()->standardModel());
- if(!model) throw InitException() << "Must be using the HiddenValleyModel"
- << " in HiddenValleyAlpha::doinit()"
- << Exception::runerror;
- // get the colour factors
- _ca = model->CA();
- _cf = model->CF();
- _tr = model->TR();
- // get the thresholds
- _thresholds.push_back(_qmin);
- _nf_light = 0;
- for(unsigned int ix=1;ix<=model->NF();++ix) {
- Energy qmass = getParticleData(ParticleID::darkg+long(ix))->mass();
- if (qmass > _qmin) _thresholds.push_back(qmass);
- else _nf_light++;
- }
- _lambda.resize(_thresholds.size());
-
-
- unsigned int nf = _nf_light;
-
- // Set lambda below heavy quark thresholds to input value
- _lambda[0]=_lambdain;
- // convert lambda to the Monte Carlo scheme if needed
- using Constants::pi;
- if(_lambdaopt) _lambda[0] *=exp((0.5*_ca*(67./3.-sqr(pi))-_tr*nf*10./3.)/(11*_ca-2*nf))/sqrt(2.);
-
- // Compute the threshold matching
- for(int ix=0;ix<int(_thresholds.size())-1;++ix) {
- _lambda[ix+1] = computeLambda(_thresholds[ix+1],alphaS(_thresholds[ix+1],
- _lambda[ix],ix),ix+1);
- }
- // compute the maximum value of as
- if ( _asType < 5 ) _alphamin = value(sqr(_qmin)+1.0e-8*sqr(MeV)); // approx as = 1
- else _alphamin = max(_asMaxNP, value(sqr(_qmin)+1.0e-8*sqr(MeV)));
- // check consistency lambda_3 < qmin
- if(_lambda[0]>_qmin)
- Throw<InitException>() << "The value of Qmin is less than Lambda in "
- << _qmin/GeV << " < " << _lambda[0]/GeV
- << " HiddenValleyAlpha::doinit " << Exception::abortnow;
-}
-
-double HiddenValleyAlpha::derivativealphaS(Energy q, Energy lam, int nf) const {
- using Constants::pi;
- double lx = log(sqr(q/lam));
- // N.B. b_1 is divided by 2 due Hw++ convention
- double b0 = 11./3.*_ca - 4./3.*_tr*nf;
- double b1 = 17./3.*sqr(_ca) - nf*_tr*(10./3.*_ca+2.*_cf);
- if(_nloop==1)
- return -4.*pi/(b0*sqr(lx));
- else if(_nloop==2)
- return -4.*pi/(b0*sqr(lx))*(1.-2.*b1/sqr(b0)/lx*(1.-2.*log(lx)));
- else
- assert(false);
- return 0.;
-}
-
-double HiddenValleyAlpha::alphaS(Energy q, Energy lam, int nf) const {
- using Constants::pi;
- double lx(log(sqr(q/lam)));
- // N.B. b_1 is divided by 2 due Hw++ convention
- double b0 = 11./3.*_ca - 4./3.*_tr*nf;
- double b1 = 17./3.*sqr(_ca) - nf*_tr*(10./3.*_ca+2.*_cf);
- // one loop
- if(_nloop==1)
- return 4.*pi/(b0*lx);
- // two loop
- else if(_nloop==2) {
- return 4.*pi/(b0*lx)*(1.-2.*b1/sqr(b0)*log(lx)/lx);
- }
- else
- assert(false);
- return 0.;
-}
diff --git a/Shower/QTilde/Dark/HiddenValleyAlpha.h b/Shower/QTilde/Dark/HiddenValleyAlpha.h
deleted file mode 100644
--- a/Shower/QTilde/Dark/HiddenValleyAlpha.h
+++ /dev/null
@@ -1,333 +0,0 @@
-// -*- C++ -*-
-//
-// HiddenValleyAlpha.h is a part of Herwig - A multi-purpose Monte Carlo event generator
-// Copyright (C) 2002-2007 The Herwig Collaboration
-//
-// Herwig is licenced under version 2 of the GPL, see COPYING for details.
-// Please respect the MCnet academic guidelines, see GUIDELINES for details.
-//
-#ifndef HERWIG_HiddenValleyAlpha_H
-#define HERWIG_HiddenValleyAlpha_H
-//
-// This is the declaration of the HiddenValleyAlpha class.
-//
-
-#include "Herwig/Shower/ShowerAlpha.h"
-#include "ThePEG/Config/Constants.h"
-
-namespace Herwig {
-
-using namespace ThePEG;
-
-/** \ingroup Shower
- *
- * This concrete class provides the definition of the
- * pure virtual function value() and overestimateValue() for the
- * strong coupling.
- *
- * A number of different options for the running of the coupling
- * and its initial definition are supported.
- *
- * @see \ref HiddenValleyAlphaInterfaces "The interfaces"
- * defined for HiddenValleyAlpha.
- */
-class HiddenValleyAlpha: public ShowerAlpha {
-
-public:
-
- /**
- * The default constructor.
- */
- HiddenValleyAlpha() : ShowerAlpha(),
- _qmin(0.630882*GeV), _asType(1), _asMaxNP(1.0),
- _nloop(2),_thresopt(false),
- _lambdain(0.208364*GeV),
- _tolerance(1e-10),
- _maxtry(100),_alphamin(0.) {}
-
-public:
-
- /**
- * Methods to return the coupling
- */
- //@{
- /**
- * It returns the running coupling value evaluated at the input scale
- * multiplied by the scale factor scaleFactor().
- * @param scale The scale
- * @return The coupling
- */
- virtual double value(const Energy2 scale) const;
-
- /**
- * It returns the running coupling value evaluated at the input scale
- * multiplied by the scale factor scaleFactor().
- */
- virtual double overestimateValue() const;
-
- /**
- * Return the ratio of the coupling at the scale to the overestimated value
- */
- virtual double ratio(const Energy2 scale,double factor=1.) const;
-
- /**
- * Initialize this coupling.
- */
- virtual void initialize() { doinit(); }
-
- //@}
-
- /**
- * Get the value of \f$\Lambda_{\rm QCd}\f$
- * @param nf number of flavours
- */
- Energy lambdaQCD(unsigned int nf) {
- if (nf <= 3) return _lambda[0];
- else if (nf==4 || nf==5) return _lambda[nf-3];
- else return _lambda[3];
- }
-
-public:
-
- /** @name Functions used by the persistent I/O system. */
- //@{
- /**
- * Function used to write out object persistently.
- * @param os the persistent output stream written to.
- */
- void persistentOutput(PersistentOStream & os) const;
-
- /**
- * Function used to read in object persistently.
- * @param is the persistent input stream read from.
- * @param version the version number of the object when written.
- */
- void persistentInput(PersistentIStream & is, int version);
- //@}
-
- /**
- * The standard Init function used to initialize the interfaces.
- * Called exactly once for each class by the class description system
- * before the main function starts or
- * when this class is dynamically loaded.
- */
- static void Init();
-
-protected:
-
- /** @name Clone Methods. */
- //@{
- /**
- * Make a simple clone of this object.
- * @return a pointer to the new object.
- */
- virtual IBPtr clone() const;
-
- /** Make a clone of this object, possibly modifying the cloned object
- * to make it sane.
- * @return a pointer to the new object.
- */
- virtual IBPtr fullclone() const;
- //@}
-
-
-protected:
-
- /** @name Standard Interfaced functions. */
- //@{
- /**
- * Initialize this object after the setup phase before saving an
- * EventGenerator to disk.
- * @throws InitException if object could not be initialized properly.
- */
- virtual void doinit();
- //@}
-
-private:
-
- /**
- * Member functions which calculate the coupling
- */
- //@{
- /**
- * The 1,2,3-loop parametrization of \f$\alpha_S\f$.
- * @param q The scale
- * @param lam \f$\Lambda_{\rm QCD}\f$
- * @param nf The number of flavours
- */
- double alphaS(Energy q, Energy lam, int nf) const;
-
- /**
- * The derivative of \f$\alpha_S\f$ with respect to \f$\ln(Q^2/\Lambda^2)\f$
- * @param q The scale
- * @param lam \f$\Lambda_{\rm QCD}\f$
- * @param nf The number of flavours
- */
- double derivativealphaS(Energy q, Energy lam, int nf) const;
-
- /**
- * Compute the value of \f$Lambda\f$ needed to get the input value of
- * the strong coupling at the scale given for the given number of flavours
- * using the Newton-Raphson method
- * @param match The scale for the coupling
- * @param alpha The input coupling
- * @param nflav The number of flavours
- */
- Energy computeLambda(Energy match, double alpha, unsigned int nflav) const;
-
- /**
- * Return the value of \f$\Lambda\f$ and the number of flavours at the scale.
- * @param q The scale
- * @return The number of flavours at the scale and \f$\Lambda\f$.
- */
- pair<short, Energy> getLamNfTwoLoop(Energy q) const;
- //@}
-
-private:
-
- /**
- * The static object used to initialize the description of this class.
- * Indicates that this is a concrete class with persistent data.
- */
- static ClassDescription<HiddenValleyAlpha> initHiddenValleyAlpha;
-
- /**
- * The assignment operator is private and must never be called.
- * In fact, it should not even be implemented.
- */
- HiddenValleyAlpha & operator=(const HiddenValleyAlpha &);
-
-private:
-
- /**
- * Minimum value of the scale
- */
- Energy _qmin;
-
- /**
- * Parameter controlling the behaviour of \f$\alpha_S\f$ in the
- * non-perturbative region.
- */
- int _asType;
-
- /**
- * Another parameter, a possible (maximum) value of alpha in the
- * non-perturbative region.
- */
- double _asMaxNP;
-
- /**
- * Thresholds for the different number of flavours
- */
- vector<Energy> _thresholds;
-
- /**
- * \f$\Lambda\f$ for the different number of flavours
- */
- vector<Energy> _lambda;
-
- /**
- * Option for the number of loops
- */
- unsigned int _nloop;
-
- /**
- * Option for the threshold masses
- */
- bool _thresopt;
-
- /**
- * Input value of Lambda
- */
- Energy _lambdain;
-
- /**
- * Whether to convert lambda from MSbar scheme
- */
- bool _lambdaopt;
-
- /**
- * Whether to use input value of alphas(MZ) or lambda
- */
- bool _inopt;
-
- /**
- * Tolerance for discontinuities at the thresholds
- */
- double _tolerance;
-
- /**
- * Maximum number of iterations for the Newton-Raphson method to converge
- */
- unsigned int _maxtry;
-
- /**
- * Number of light flavours (below qmin)
- */
- unsigned int _nf_light;
-
- /**
- * The minimum value of the coupling
- */
- double _alphamin;
-
- /**
- * Colour factors
- */
- //@{
- /**
- * \f$C_A\f$
- */
- double _ca;
- /**
- * \f$C_A\f$
- */
- double _cf;
-
- /**
- * \f$T_R\f$
- */
- double _tr;
- //@}
-
-};
-
-}
-
-#include "ThePEG/Utilities/ClassTraits.h"
-
-namespace ThePEG {
-
-/** @cond TRAITSPECIALIZATIONS */
-
-/** This template specialization informs ThePEG about the
- * base classes of HiddenValleyAlpha. */
-template <>
-struct BaseClassTrait<Herwig::HiddenValleyAlpha,1> {
- /** Typedef of the first base class of HiddenValleyAlpha. */
- typedef Herwig::ShowerAlpha NthBase;
-};
-
-/** This template specialization informs ThePEG about the name of
- * the HiddenValleyAlpha class and the shared object where it is defined. */
-template <>
-struct ClassTraits<Herwig::HiddenValleyAlpha>
- : public ClassTraitsBase<Herwig::HiddenValleyAlpha> {
- /** Return a platform-independent class name */
- static string className() { return "Herwig::HiddenValleyAlpha"; }
- /**
- * The name of a file containing the dynamic library where the class
- * HiddenValleyAlpha is implemented. It may also include several,
- * space-separated, libraries if the class HiddenValleyAlpha depends on
- * other classes (base classes excepted). In this case the listed
- * libraries will be dynamically linked in the order they are
- * specified.
- */
- static string library() { return "HwShower.so HwHiddenValley.so"; }
-};
-
-/** @endcond */
-
-}
-
-#endif /* HERWIG_HiddenValleyAlpha_H */
diff --git a/Shower/QTilde/Dark/HiddenValleyFFZPrimeVertex.cc b/Shower/QTilde/Dark/HiddenValleyFFZPrimeVertex.cc
deleted file mode 100644
--- a/Shower/QTilde/Dark/HiddenValleyFFZPrimeVertex.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// -*- C++ -*-
-//
-// This is the implementation of the non-inlined, non-templated member
-// functions of the HiddenValleyFFZPrimeVertex class.
-//
-
-#include "HiddenValleyFFZPrimeVertex.h"
-#include "ThePEG/Interface/ClassDocumentation.h"
-#include "ThePEG/Persistency/PersistentOStream.h"
-#include "ThePEG/Persistency/PersistentIStream.h"
-#include "HiddenValleyModel.h"
-
-using namespace Herwig;
-
-void HiddenValleyFFZPrimeVertex::persistentOutput(PersistentOStream & os) const {
- os << _gl << _gr << _gql << _gqr << _gPrime;
-}
-
-void HiddenValleyFFZPrimeVertex::persistentInput(PersistentIStream & is, int) {
- is >> _gl >> _gr >> _gql >> _gqr >> _gPrime;
-}
-
-ClassDescription<HiddenValleyFFZPrimeVertex> HiddenValleyFFZPrimeVertex::initHiddenValleyFFZPrimeVertex;
-// Definition of the static class description member.
-
-void HiddenValleyFFZPrimeVertex::Init() {
-
- static ClassDocumentation<HiddenValleyFFZPrimeVertex> documentation
- ("There is no documentation for the HiddenValleyFFZPrimeVertex class");
-
-}
-
-void HiddenValleyFFZPrimeVertex::setCoupling(Energy2, tcPDPtr a,tcPDPtr,tcPDPtr) {
- norm(_gPrime);
- // the left and right couplings
- int iferm=abs(a->id());
- if((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16)) {
- left (_gl[iferm]);
- right(_gr[iferm]);
- return;
- }
- iferm -= ParticleID::darkg;
- if(iferm<=int(_gql.size())) {
- left (_gql[iferm]);
- right(_gqr[iferm]);
- return;
- }
- assert(false);
-}
-
-HiddenValleyFFZPrimeVertex::HiddenValleyFFZPrimeVertex() : _gl(17,0.0), _gr(17,0.0) {
- orderInGem(1);
- orderInGs(0);
- // PDG codes for the particles
- // the quarks
- for(int ix=1;ix<7;++ix)
- addToList(-ix,ix,32);
- // the leptons
- for(int ix=11;ix<17;++ix)
- addToList(-ix,ix,32);
-}
-
-void HiddenValleyFFZPrimeVertex::doinit() {
- tcHiddenValleyPtr model =
- dynamic_ptr_cast<tcHiddenValleyPtr>(generator()->standardModel());
- if(!model)
- throw InitException() << "Must be using the HiddenValleyModel in "
- << "HiddenValleyFFZPrimeVertex::doinit()"
- << Exception::runerror;
- _gPrime = model->gPrime();
- // SM couplings
- _gl.resize(17,0.);
- _gr.resize(17,0.);
- for(int ix=1;ix<4;++ix) {
- _gl[2*ix-1] = model->qL();
- _gl[2*ix ] = model->qL();
- _gl[2*ix+9 ] = model->lL();
- _gl[2*ix+10] = model->lL();
- _gr[2*ix-1] = model->dR();
- _gr[2*ix ] = model->uR();
- _gr[2*ix+9 ] = model->lR();
- _gr[2*ix+10] = 0. ;
- }
- FFVVertex::doinit();
- _gql.resize(model->NF()+1,0.);
- _gqr.resize(model->NF()+1,0.);
- for(int ix=0;ix<int(model->NF());++ix) {
- int id = ParticleID::darkg+1+ix;
- addToList(-id,id,32);
- _gql[ix+1] = model->qCharge()[ix];
- _gqr[ix+1] = model->qCharge()[ix]-2.;
- }
-}
diff --git a/Shower/QTilde/Dark/HiddenValleyFFZPrimeVertex.h b/Shower/QTilde/Dark/HiddenValleyFFZPrimeVertex.h
deleted file mode 100644
--- a/Shower/QTilde/Dark/HiddenValleyFFZPrimeVertex.h
+++ /dev/null
@@ -1,173 +0,0 @@
-// -*- C++ -*-
-#ifndef RADIATIVEZPRIME_HiddenValleyFFZPrimeVertex_H
-#define RADIATIVEZPRIME_HiddenValleyFFZPrimeVertex_H
-//
-// This is the declaration of the HiddenValleyFFZPrimeVertex class.
-//
-
-#include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
-
-namespace Herwig {
-
-using namespace ThePEG;
-
-/**
- * Here is the documentation of the HiddenValleyFFZPrimeVertex class.
- *
- * @see \ref HiddenValleyFFZPrimeVertexInterfaces "The interfaces"
- * defined for HiddenValleyFFZPrimeVertex.
- */
-class HiddenValleyFFZPrimeVertex: public Helicity::FFVVertex {
-
-public:
-
- /**
- * The default constructor.
- */
- inline HiddenValleyFFZPrimeVertex();
-
- /**
- * Calculate the couplings.
- * @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
- * @param part1 The ParticleData pointer for the first particle.
- * @param part2 The ParticleData pointer for the second particle.
- * @param part3 The ParticleData pointer for the third particle.
- */
- virtual void setCoupling(Energy2 q2,tcPDPtr part1,tcPDPtr part2,tcPDPtr part3);
-
-public:
-
- /** @name Functions used by the persistent I/O system. */
- //@{
- /**
- * Function used to write out object persistently.
- * @param os the persistent output stream written to.
- */
- void persistentOutput(PersistentOStream & os) const;
-
- /**
- * Function used to read in object persistently.
- * @param is the persistent input stream read from.
- * @param version the version number of the object when written.
- */
- void persistentInput(PersistentIStream & is, int version);
- //@}
-
- /**
- * The standard Init function used to initialize the interfaces.
- * Called exactly once for each class by the class description system
- * before the main function starts or
- * when this class is dynamically loaded.
- */
- static void Init();
-
-protected:
-
- /** @name Clone Methods. */
- //@{
- /**
- * Make a simple clone of this object.
- * @return a pointer to the new object.
- */
- inline virtual IBPtr clone() const {return new_ptr(*this);}
-
- /** Make a clone of this object, possibly modifying the cloned object
- * to make it sane.
- * @return a pointer to the new object.
- */
- inline virtual IBPtr fullclone() const {return new_ptr(*this);}
- //@}
-
-protected:
-
- /**
- * Initialize this object after the setup phase before saving and
- * EventGenerator to disk.
- * @throws InitException if object could not be initialized properly.
- */
- virtual void doinit();
-
-private:
-
- /**
- * The static object used to initialize the description of this class.
- * Indicates that this is a concrete class with persistent data.
- */
- static ClassDescription<HiddenValleyFFZPrimeVertex> initHiddenValleyFFZPrimeVertex;
-
- /**
- * The assignment operator is private and must never be called.
- * In fact, it should not even be implemented.
- */
- HiddenValleyFFZPrimeVertex & operator=(const HiddenValleyFFZPrimeVertex &);
-
-
- /**
- * Storage of the couplings.
- */
- //@{
- /**
- * The left couplings of the Standard Model fermions.
- */
- vector<double> _gl;
-
- /**
- * The right couplings of the Standard Model fermions.
- */
- vector<double> _gr;
- /**
- * The left couplings of the new fermions.
- */
- vector<double> _gql;
-
- /**
- * The right couplings of the new fermions.
- */
- vector<double> _gqr;
-
- /**
- * Coupling
- */
- double _gPrime;
- //@}
-
-};
-
-}
-
-#include "ThePEG/Utilities/ClassTraits.h"
-
-namespace ThePEG {
-
-/** @cond TRAITSPECIALIZATIONS */
-
-/** This template specialization informs ThePEG about the
- * base classes of HiddenValleyFFZPrimeVertex. */
-template <>
-struct BaseClassTrait<Herwig::HiddenValleyFFZPrimeVertex,1> {
- /** Typedef of the first base class of HiddenValleyFFZPrimeVertex. */
- typedef Helicity::FFVVertex NthBase;
-};
-
-/** This template specialization informs ThePEG about the name of
- * the HiddenValleyFFZPrimeVertex class and the shared object where it is defined. */
-template <>
-struct ClassTraits<Herwig::HiddenValleyFFZPrimeVertex>
- : public ClassTraitsBase<Herwig::HiddenValleyFFZPrimeVertex> {
- /** Return a platform-independent class name */
- static string className() { return "Herwig::HiddenValleyFFZPrimeVertex"; }
- /**
- * The name of a file containing the dynamic library where the class
- * HiddenValleyFFZPrimeVertex is implemented. It may also include several, space-separated,
- * libraries if the class HiddenValleyFFZPrimeVertex depends on other classes (base classes
- * excepted). In this case the listed libraries will be dynamically
- * linked in the order they are specified.
- */
- static string library() { return "HwShower.so HwHiddenValley.so"; }
-};
-
-/** @endcond */
-
-}
-
-#endif /* RADIATIVEZPRIME_HiddenValleyFFZPrimeVertex_H */
diff --git a/Shower/QTilde/Dark/HiddenValleyModel.cc b/Shower/QTilde/Dark/HiddenValleyModel.cc
deleted file mode 100644
--- a/Shower/QTilde/Dark/HiddenValleyModel.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// -*- C++ -*-
-//
-// This is the implementation of the non-inlined, non-templated member
-// functions of the HiddenValleyModel class.
-//
-
-#include "HiddenValleyModel.h"
-#include "ThePEG/Interface/ClassDocumentation.h"
-#include "ThePEG/Interface/Reference.h"
-#include "ThePEG/Interface/Parameter.h"
-#include "ThePEG/Interface/ParVector.h"
-#include "ThePEG/Interface/Switch.h"
-#include "ThePEG/Utilities/EnumIO.h"
-#include "ThePEG/Persistency/PersistentOStream.h"
-#include "ThePEG/Persistency/PersistentIStream.h"
-
-using namespace Herwig;
-
-HiddenValleyModel::HiddenValleyModel() : groupType_(SU), Nc_(3), Nf_(1),
- qL_(-0.2), uR_(-0.2), dR_(0.6),
- lL_(0.6), lR_(-0.2), gPrime_(1./7.),
- qCharge_(1,-0.2)
-{}
-
-IBPtr HiddenValleyModel::clone() const {
- return new_ptr(*this);
-}
-
-IBPtr HiddenValleyModel::fullclone() const {
- return new_ptr(*this);
-}
-
-void HiddenValleyModel::persistentOutput(PersistentOStream & os) const {
- os << oenum(groupType_) << Nc_ << Nf_ << FFZPVertex_
- << qL_ << uR_ << dR_ << lL_ << lR_ << qCharge_ << gPrime_;
-}
-
-void HiddenValleyModel::persistentInput(PersistentIStream & is, int) {
- is >> ienum(groupType_) >> Nc_ >> Nf_ >> FFZPVertex_
- >> qL_ >> uR_ >> dR_ >> lL_ >> lR_ >> qCharge_ >> gPrime_;
-}
-
-ClassDescription<HiddenValleyModel> HiddenValleyModel::initHiddenValleyModel;
-// Definition of the static class description member.
-
-void HiddenValleyModel::Init() {
-
- static ClassDocumentation<HiddenValleyModel> documentation
- ("The HiddenValleyModel class is the main class for the Hidden Valley Model.");
-
- static Switch<HiddenValleyModel,GroupType> interfaceGroupType
- ("GroupType",
- "Type of the new unbroken group",
- &HiddenValleyModel::groupType_, SU, false, false);
- static SwitchOption interfaceGroupTypeSU
- (interfaceGroupType,
- "SU",
- "Use an SU(N) group",
- SU);
-
- static Parameter<HiddenValleyModel,unsigned int> interfaceGroupOrder
- ("GroupOrder",
- "The value of the number of 'colours' for the new symmetry group",
- &HiddenValleyModel::Nc_, 3, 1, 1000,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyModel,unsigned int> interfaceNumberOfFermions
- ("NumberOfFermions",
- "The number of fermions charged under the new group",
- &HiddenValleyModel::Nf_, 1, 1, 100,
- false, false, Interface::limited);
-
- static Reference<HiddenValleyModel,AbstractFFVVertex> interfaceVertexFFZPrime
- ("Vertex/FFZPrime",
- "The vertex coupling the Zprime to the fermions",
- &HiddenValleyModel::FFZPVertex_, false, false, true, false, false);
-
- static ParVector<HiddenValleyModel,double> interfaceQuirkCharges
- ("QuirkCharges",
- "The charges under the new U(1) of the new quirks",
- &HiddenValleyModel::qCharge_, -1, -0.2, -10., 10.0,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyModel,double> interfaceZPrimeQL
- ("ZPrime/QL",
- "The charge of the left-handed quarks under the new U(1)",
- &HiddenValleyModel::qL_, -0.2, 10.0, 10.0,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyModel,double> interfaceZPrimeUR
- ("ZPrime/UR",
- "The charge of the right-handed up quarks under the new U(1)",
- &HiddenValleyModel::uR_, -0.2, 10.0, 10.0,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyModel,double> interfaceZPrimeDR
- ("ZPrime/DR",
- "The charge of the right-handed down quarks under the new U(1)",
- &HiddenValleyModel::uR_, 0.6, 10.0, 10.0,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyModel,double> interfaceZPrimeLL
- ("ZPrime/LL",
- "The charge of the left-handed leptons under the new U(1)",
- &HiddenValleyModel::lL_, 0.6, 10.0, 10.0,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyModel,double> interfaceZPrimeLR
- ("ZPrime/LR",
- "The charge of the right-handed charged leptons under the new U(1)",
- &HiddenValleyModel::lR_, -0.2, 10.0, 10.0,
- false, false, Interface::limited);
-
- static Parameter<HiddenValleyModel,double> interfaceGPrime
- ("GPrime",
- "The new gauge coupling",
- &HiddenValleyModel::gPrime_, 1./7., 0.0, 10.0,
- false, false, Interface::limited);
-
-}
-
-void HiddenValleyModel::doinit() {
- addVertex(FFZPVertex_);
- BSMModel::doinit();
- FFZPVertex_->init();
- if(qCharge_.size()!=Nf_)
- throw InitException() << "Number of new fermions and number of new charges "
- << "different in HiddenValleyModel::doinit()"
- << Exception::runerror;
-}
diff --git a/Shower/QTilde/Dark/HiddenValleyModel.h b/Shower/QTilde/Dark/HiddenValleyModel.h
deleted file mode 100644
--- a/Shower/QTilde/Dark/HiddenValleyModel.h
+++ /dev/null
@@ -1,338 +0,0 @@
-// -*- C++ -*-
-#ifndef HERWIG_HiddenValleyModel_H
-#define HERWIG_HiddenValleyModel_H
-//
-// This is the declaration of the HiddenValleyModel class.
-//
-
-#include "Herwig/Models/General/BSMModel.h"
-#include "ThePEG/Helicity/Vertex/AbstractFFVVertex.h"
-
-namespace Herwig {
-
-using namespace ThePEG;
-
-/**
- * Here is the documentation of the HiddenValleyModel class.
- *
- * @see \ref HiddenValleyModelInterfaces "The interfaces"
- * defined for HiddenValleyModel.
- */
-class HiddenValleyModel: public BSMModel {
-
-/**
- * Enumeration to define the type of the confining group
- */
- enum GroupType { SU, SO, SP };
-
-public:
-
- /**
- * The default constructor.
- */
- HiddenValleyModel();
-
-public:
-
- /**
- * Properties of the new confining gauge group
- */
- //@{
- /**
- * The hidden colour charge of the fundamental representation
- */
- double CF() const {
- switch (groupType_) {
- case SU:
- return 0.5*(sqr(double(Nc_))-1.)/double(Nc_);
- case SO:
- if(Nc_==3) {
- return (Nc_-1);
- }
- else {
- return 0.5*(Nc_-1);
- }
- case SP:
- return 0.25*(Nc_+1);
- default:
- assert(false);
- }
- return 0.;
- }
-
- /**
- * The hidden colour charge of the adjoint representation
- */
- double CA() const {
- switch (groupType_) {
- case SU:
- return double(Nc_);
- case SO:
- if(Nc_==3) {
- return 2.*(Nc_-2.);
- }
- else {
- return (Nc_-2.);
- }
- case SP:
- return 0.5*(Nc_+2.);
- default:
- assert(false);
- }
- return 0.;
- }
-
- /**
- * The \f$T_R\f$ colour factor
- */
- double TR() const {
- switch (groupType_) {
- case SU: case SP:
- return 0.5;
- break;
- case SO:
- if(Nc_==3) {
- return 2.;
- }
- else {
- return 1.;
- }
- default:
- assert(false);
- }
- return 0.;
- }
-
- /**
- * The type of the group
- */
- GroupType groupType() const {return groupType_;}
-
- /**
- * The number of colours
- */
- unsigned int NC() const {return Nc_;}
-
- /**
- * The number of fermions charged under the new group
- */
- unsigned int NF() const {return Nf_;}
- //@}
-
- /**
- * Properties of the new U(1) group
- */
- //@{
- /**
- * Charge of the left-handed quarks
- */
- double qL() const {return qL_;}
-
- /**
- * Charge of the right-handed up-type quarks
- */
- double uR() const {return uR_;}
-
- /**
- * Charge of the right-handed down-type quarks
- */
- double dR() const {return dR_;}
-
- /**
- * Charge of the left-handed leptons
- */
- double lL() const {return lL_;}
-
- /**
- * Charge of the right-handed charged leptons
- */
- double lR() const {return lR_;}
-
- /**
- * Coupling
- */
- double gPrime() const {return gPrime_;}
-
- /**
- * The couplings of the quirks
- */
- vector<double> qCharge() const {return qCharge_;}
- //@}
-
-public:
-
- /** @name Functions used by the persistent I/O system. */
- //@{
- /**
- * Function used to write out object persistently.
- * @param os the persistent output stream written to.
- */
- void persistentOutput(PersistentOStream & os) const;
-
- /**
- * Function used to read in object persistently.
- * @param is the persistent input stream read from.
- * @param version the version number of the object when written.
- */
- void persistentInput(PersistentIStream & is, int version);
- //@}
-
- /**
- * The standard Init function used to initialize the interfaces.
- * Called exactly once for each class by the class description system
- * before the main function starts or
- * when this class is dynamically loaded.
- */
- static void Init();
-
-protected:
-
- /** @name Clone Methods. */
- //@{
- /**
- * Make a simple clone of this object.
- * @return a pointer to the new object.
- */
- virtual IBPtr clone() const;
-
- /** Make a clone of this object, possibly modifying the cloned object
- * to make it sane.
- * @return a pointer to the new object.
- */
- virtual IBPtr fullclone() const;
- //@}
-
-private:
-
- /**
- * The static object used to initialize the description of this class.
- * Indicates that this is a concrete class with persistent data.
- */
- static ClassDescription<HiddenValleyModel> initHiddenValleyModel;
-
- /**
- * The assignment operator is private and must never be called.
- * In fact, it should not even be implemented.
- */
- HiddenValleyModel & operator=(const HiddenValleyModel &);
-
-protected:
-
- /** @name Standard Interfaced functions. */
- //@{
- /**
- * Initialize this object after the setup phase before saving an
- * EventGenerator to disk.
- * @throws InitException if object could not be initialized properly.
- */
- virtual void doinit();
- //@}
-
-private:
-
- /**
- * Symmetry group for the new unbroken symmetry
- */
- //@{
- /**
- * Type of group
- */
- GroupType groupType_;
-
- /**
- * Order of the group
- */
- unsigned int Nc_;
- //@}
-
- /**
- * Number of fermions
- */
- unsigned int Nf_;
-
- /**
- * Charges etc under the new \f$U(1)\f$ group
- */
- //@{
- /**
- * Charge of the left-handed quarks
- */
- double qL_;
-
- /**
- * Charge of the right-handed up-type quarks
- */
- double uR_;
-
- /**
- * Charge of the right-handed down-type quarks
- */
- double dR_;
-
- /**
- * Charge of the left-handed leptons
- */
- double lL_;
-
- /**
- * Charge of the right-handed charged leptons
- */
- double lR_;
-
- /**
- * Coupling
- */
- double gPrime_;
-
- /**
- * the vertex
- */
- AbstractFFVVertexPtr FFZPVertex_;
-
- /**
- * The couplings of the quirks
- */
- vector<double> qCharge_;
- //@}
-};
-
-}
-
-#include "ThePEG/Utilities/ClassTraits.h"
-
-namespace ThePEG {
-
-/** @cond TRAITSPECIALIZATIONS */
-
-/** This template specialization informs ThePEG about the
- * base classes of HiddenValleyModel. */
-template <>
-struct BaseClassTrait<Herwig::HiddenValleyModel,1> {
- /** Typedef of the first base class of HiddenValleyModel. */
- typedef Herwig::BSMModel NthBase;
-};
-
-/** This template specialization informs ThePEG about the name of
- * the HiddenValleyModel class and the shared object where it is defined. */
-template <>
-struct ClassTraits<Herwig::HiddenValleyModel>
- : public ClassTraitsBase<Herwig::HiddenValleyModel> {
- /** Return a platform-independent class name */
- static string className() { return "Herwig::HiddenValleyModel"; }
- /**
- * The name of a file containing the dynamic library where the class
- * HiddenValleyModel is implemented. It may also include several, space-separated,
- * libraries if the class HiddenValleyModel depends on other classes (base classes
- * excepted). In this case the listed libraries will be dynamically
- * linked in the order they are specified.
- */
- static string library() { return "HwShower.so HwHiddenValley.so"; }
-};
-
-ThePEG_DECLARE_POINTERS(Herwig::HiddenValleyModel,HiddenValleyPtr);
-
-/** @endcond */
-
-}
-
-#endif /* HERWIG_HiddenValleyModel_H */
diff --git a/Shower/QTilde/Dark/OneHalfHalfDarkSplitFn.cc b/Shower/QTilde/Dark/OneHalfHalfDarkSplitFn.cc
deleted file mode 100644
--- a/Shower/QTilde/Dark/OneHalfHalfDarkSplitFn.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-// -*- C++ -*-
-//
-// OneHalfHalfDarkSplitFn.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 OneHalfHalfDarkSplitFn class.
-//
-
-#include "OneHalfHalfDarkSplitFn.h"
-#include "HiddenValleyModel.h"
-#include "ThePEG/PDT/ParticleData.h"
-#include "ThePEG/Interface/ClassDocumentation.h"
-#include "ThePEG/Utilities/DescribeClass.h"
-
-using namespace Herwig;
-
-DescribeNoPIOClass<OneHalfHalfDarkSplitFn,Herwig::Sudakov1to2FormFactor>
-describeOneHalfHalfDarkSplitFn ("Herwig::OneHalfHalfDarkSplitFn","HwShower.so");
-
-void OneHalfHalfDarkSplitFn::Init() {
-
- static ClassDocumentation<OneHalfHalfDarkSplitFn> documentation
- ("The OneHalfHalfDarkSplitFn class implements the splitting function for g->q qbar");
-
-}
-
-bool OneHalfHalfDarkSplitFn::checkColours(const IdList & ids) const {
- if(colourStructure()==TripletTripletOctet) {
- if(ids[0]!=ids[1]) return false;
- if((ids[0]->iColour()==PDT::DarkColourFundamental||
- ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
- ids[2]->iColour()==PDT::DarkColourAdjoint) return true;
- return false;
- }
- else if(colourStructure()==OctetOctetOctet) {
- for(unsigned int ix=0;ix<3;++ix) {
- if(ids[ix]->iColour()!=PDT::DarkColourAdjoint) return false;
- }
- return true;
- }
- else if(colourStructure()==OctetTripletTriplet) {
- if(ids[0]->iColour()!=PDT::DarkColourAdjoint) return false;
- if(ids[1]->iColour()==PDT::DarkColourFundamental&&
- ids[2]->iColour()==PDT::DarkColourAntiFundamental)
- return true;
- if(ids[1]->iColour()==PDT::DarkColourAntiFundamental&&
- ids[2]->iColour()==PDT::DarkColourFundamental)
- return true;
- return false;
- }
- else if(colourStructure()==TripletOctetTriplet) {
- if(ids[0]!=ids[2]) return false;
- if((ids[0]->iColour()==PDT::DarkColourFundamental||
- ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
- ids[1]->iColour()==PDT::DarkColourAdjoint) return true;
- return false;
- }
- else {
- assert(false);
- }
- return false;
-}
-
-double OneHalfHalfDarkSplitFn::P(const double z, const Energy2 t,
- const IdList &ids, const bool mass, const RhoDMatrix &) const {
- double zz = z*(1.-z);
- double val=1.-2.*zz;
- if(mass) {
- Energy m = ids[1]->mass();
- val +=2.*sqr(m)/t;
- }
- return val;
-}
-
-double OneHalfHalfDarkSplitFn::overestimateP(const double,
- const IdList &) const {
- return 1.;
-}
-
-double OneHalfHalfDarkSplitFn::ratioP(const double z, const Energy2 t,
- const IdList &ids, const bool mass, const RhoDMatrix &) const {
- double zz = z*(1.-z);
- double val = 1.-2.*zz;
- if(mass) {
- Energy m = ids[1]->mass();
- val+= 2.*sqr(m)/t;
- }
- return val;
-}
-
-double OneHalfHalfDarkSplitFn::integOverP(const double z, const IdList & ,
- unsigned int PDFfactor) const {
- switch(PDFfactor) {
- case 0:
- return z;
- case 1:
- return log(z);
- case 2:
- return -log(1.-z);
- case 3:
- return log(z/(1.-z));
- case 4:
- return 2.*sqrt(z);
- case 5:
- return (2./3.)*z*sqrt(z);
- default:
- throw Exception() << "OneHalfHalfDarkSplitFn::integOverP() invalid PDFfactor = "
- << PDFfactor << Exception::runerror;
- }
-}
-
-double OneHalfHalfDarkSplitFn::invIntegOverP(const double r,
- const IdList & ,
- unsigned int PDFfactor) const {
- switch(PDFfactor) {
- case 0:
- return r;
- case 1:
- return exp(r);
- case 2:
- return 1.-exp(-r);
- case 3:
- return 1./(1.+exp(-r));
- case 4:
- return 0.25*sqr(r);
- case 5:
- return pow(1.5*r,2./3.);
- default:
- throw Exception() << "OneHalfHalfDarkSplitFn::integOverP() invalid PDFfactor = "
- << PDFfactor << Exception::runerror;
- }
-}
-
-bool OneHalfHalfDarkSplitFn::accept(const IdList &ids) const {
- if(ids.size()!=3) return false;
- if(ids[1]!=ids[2]->CC()) return false;
- if(ids[1]->iSpin()!=PDT::Spin1Half) return false;
- if(ids[0]->iSpin()!=PDT::Spin1) return false;
- return OneHalfHalfDarkSplitFn::checkColours(ids);
-}
-
-vector<pair<int, Complex> >
-OneHalfHalfDarkSplitFn::generatePhiForward(const double z, const Energy2 t, const IdList & ids,
- const RhoDMatrix & rho) {
- assert(rho.iSpin()==PDT::Spin1);
- double modRho = abs(rho(0,2));
- Energy mq = ids[1]->mass();
- Energy2 mq2 = sqr(mq);
- double fact = z*(1.-z)-mq2/t;
- double max = 1.+2.*fact*(-1.+2.*modRho);
- vector<pair<int, Complex> > output;
- output.push_back(make_pair( 0,(rho(0,0)+rho(2,2))*(1.-2.*fact)/max));
- output.push_back(make_pair(-2,2.*fact*rho(0,2)/max));
- output.push_back(make_pair( 2,2.*fact*rho(2,0)/max));
- return output;
-}
-
-vector<pair<int, Complex> >
-OneHalfHalfDarkSplitFn::generatePhiBackward(const double, const Energy2, const IdList &,
- const RhoDMatrix & ) {
- // no dependance
- return {{ {0, 1.} }};
-}
-
-DecayMEPtr OneHalfHalfDarkSplitFn::matrixElement(const double z, const Energy2 t,
- const IdList & ids, const double phi,
- bool timeLike) {
- static const Complex ii(0.,1.);
- // calculate the kernal
- DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1Half,PDT::Spin1Half)));
- double mt = !timeLike ? ZERO : ids[1]->mass()/sqrt(t);
- double root =sqrt(1.-sqr(mt)/z/(1.-z));
- (*kernal)(0,0,0) = mt/sqrt(z*(1.-z));
- (*kernal)(2,1,1) = (*kernal)(0,0,0);
- (*kernal)(0,0,1) = -z*root*exp(-ii*phi);
- (*kernal)(2,1,0) = -conj((*kernal)(0,0,1));
- (*kernal)(0,1,0) = (1.-z)*exp(-ii*phi)*root;
- (*kernal)(2,0,1) = -conj((*kernal)(0,1,0));
- (*kernal)(0,1,1) = 0.;
- (*kernal)(2,0,0) = 0.;
- return kernal;
-}
diff --git a/Shower/QTilde/Dark/OneHalfHalfDarkSplitFn.h b/Shower/QTilde/Dark/OneHalfHalfDarkSplitFn.h
deleted file mode 100644
--- a/Shower/QTilde/Dark/OneHalfHalfDarkSplitFn.h
+++ /dev/null
@@ -1,194 +0,0 @@
-// -*- C++ -*-
-//
-// OneHalfHalfDarkSplitFn.h 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.
-//
-#ifndef HERWIG_OneHalfHalfDarkSplitFn_H
-#define HERWIG_OneHalfHalfDarkSplitFn_H
-//
-// This is the declaration of the OneHalfHalfDarkSplitFn class.
-//
-
-#include "Herwig/Shower/QTilde/SplittingFunctions/Sudakov1to2FormFactor.h"
-#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
-
-namespace Herwig {
-
-using namespace ThePEG;
-
-/**\ingroup Shower
- *
- * This class provides the concrete implementation of the exact leading-order
- * splitting function for \f$1\to \frac12\frac12\f$.
- *
- * In this case the splitting function is given by
- * \f[P(z,t) =C\left(1-2z(1-z)+2\frac{m_q^2}{t}\right),\f]
- * where \f$C\f$ is the corresponding colour factor
- * Our choice for the overestimate is
- * \f[P_{\rm over}(z) = C,\f]
- * therefore the integral is
- * \f[\int P_{\rm over}(z) {\rm d}z =Cz,\f]
- * and its inverse is
- * \f[\frac{r}{C}\f]
- *
- * @see \ref OneHalfHalfDarkSplitFnInterfaces "The interfaces"
- * defined for OneHalfHalfDarkSplitFn.
- */
-class OneHalfHalfDarkSplitFn: public Sudakov1to2FormFactor {
-
-public:
-
- /**
- * Method to check the colours are correct
- */
- virtual bool checkColours(const IdList & ids) const;
-
- /**
- * Concrete implementation of the method to determine whether this splitting
- * function can be used for a given set of particles.
- * @param ids The PDG codes for the particles in the splitting.
- */
- virtual bool accept(const IdList & ids) const;
-
- /**
- * Methods to return the splitting function.
- */
- //@{
- /**
- * The concrete implementation of the splitting function, \f$P\f$.
- * @param z The energy fraction.
- * @param t The scale.
- * @param ids The PDG codes for the particles in the splitting.
- * @param mass Whether or not to include the mass dependent terms
- * @param rho The spin density matrix
- */
- virtual double P(const double z, const Energy2 t, const IdList & ids,
- const bool mass, const RhoDMatrix & rho) const;
-
-
- /**
- * The concrete implementation of the overestimate of the splitting function,
- * \f$P_{\rm over}\f$.
- * @param z The energy fraction.
- * @param ids The PDG codes for the particles in the splitting.
- */
- virtual double overestimateP(const double z, const IdList & ids) const;
-
- /**
- * The concrete implementation of the
- * the ratio of the splitting function to the overestimate, i.e.
- * \f$P(z,\tilde{q}^2)/P_{\rm over}(z)\f$.
- * @param z The energy fraction.
- * @param t The scale.
- * @param ids The PDG codes for the particles in the splitting.
- * @param mass Whether or not to include the mass dependent terms
- * @param rho The spin density matrix
- */
- virtual double ratioP(const double z, const Energy2 t, const IdList & ids,
- const bool mass, const RhoDMatrix & rho) const;
-
- /**
- * The concrete implementation of the indefinite integral of the
- * overestimated splitting function, \f$P_{\rm over}\f$.
- * @param z The energy fraction.
- * @param ids The PDG codes for the particles in the splitting.
- * @param PDFfactor Which additional factor to include for the PDF
- * 0 is no additional factor,
- * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
- */
- virtual double integOverP(const double z, const IdList & ids,
- unsigned int PDFfactor=0) const;
-
- /**
- * The concrete implementation of the inverse of the indefinite integral.
- * @param r Value of the splitting function to be inverted
- * @param ids The PDG codes for the particles in the splitting.
- * @param PDFfactor Which additional factor to include for the PDF
- * 0 is no additional factor,
- * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
- */
- virtual double invIntegOverP(const double r, const IdList & ids,
- unsigned int PDFfactor=0) const;
- //@}
-
- /**
- * Method to calculate the azimuthal angle
- * @param particle The particle which is branching
- * @param showerkin The ShowerKinematics object
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- * @return The weight
- */
- virtual vector<pair<int,Complex> >
- generatePhiForward(const double z, const Energy2 t, const IdList & ids,
- const RhoDMatrix &);
-
- /**
- * Method to calculate the azimuthal angle
- * @param particle The particle which is branching
- * @param showerkin The ShowerKinematics object
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- * @return The weight
- */
- virtual vector<pair<int,Complex> >
- generatePhiBackward(const double z, const Energy2 t, const IdList & ids,
- const RhoDMatrix &);
-
- /**
- * Calculate the matrix element for the splitting
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- */
- virtual DecayMEPtr matrixElement(const double z, const Energy2 t,
- const IdList & ids, const double phi, bool timeLike);
-
-public:
-
- /**
- * The standard Init function used to initialize the interfaces.
- * Called exactly once for each class by the class description system
- * before the main function starts or
- * when this class is dynamically loaded.
- */
- static void Init();
-
-protected:
-
- /** @name Clone Methods. */
- //@{
- /**
- * Make a simple clone of this object.
- * @return a pointer to the new object.
- */
- virtual IBPtr clone() const {return new_ptr(*this);}
-
- /** Make a clone of this object, possibly modifying the cloned object
- * to make it sane.
- * @return a pointer to the new object.
- */
- virtual IBPtr fullclone() const {return new_ptr(*this);}
- //@}
-
-private:
-
- /**
- * The assignment operator is private and must never be called.
- * In fact, it should not even be implemented.
- */
- OneHalfHalfDarkSplitFn & operator=(const OneHalfHalfDarkSplitFn &) = delete;
-
-};
-
-}
-
-#endif /* HERWIG_OneHalfHalfDarkSplitFn_H */
diff --git a/Shower/QTilde/Dark/OneOneOneDarkSplitFn.cc b/Shower/QTilde/Dark/OneOneOneDarkSplitFn.cc
deleted file mode 100644
--- a/Shower/QTilde/Dark/OneOneOneDarkSplitFn.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-// -*- C++ -*-
-//
-// OneOneOneDarkSplitFn.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 OneOneOneDarkSplitFn class.
-//
-
-#include "OneOneOneDarkSplitFn.h"
-#include "HiddenValleyModel.h"
-#include "ThePEG/PDT/ParticleData.h"
-#include "ThePEG/Interface/ClassDocumentation.h"
-#include "ThePEG/Utilities/DescribeClass.h"
-
-using namespace Herwig;
-
-DescribeNoPIOClass<OneOneOneDarkSplitFn,Herwig::Sudakov1to2FormFactor>
-describeOneOneOneDarkSplitFn ("Herwig::OneOneOneDarkSplitFn","HwShower.so");
-
-void OneOneOneDarkSplitFn::Init() {
-
- static ClassDocumentation<OneOneOneDarkSplitFn> documentation
- ("The OneOneOneDarkSplitFn class implements the g -> gg splitting function");
-
-}
-
-bool OneOneOneDarkSplitFn::checkColours(const IdList & ids) const {
- if(colourStructure()==TripletTripletOctet) {
- if(ids[0]!=ids[1]) return false;
- if((ids[0]->iColour()==PDT::DarkColourFundamental||
- ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
- ids[2]->iColour()==PDT::DarkColourAdjoint) return true;
- return false;
- }
- else if(colourStructure()==OctetOctetOctet) {
- for(unsigned int ix=0;ix<3;++ix) {
- if(ids[ix]->iColour()!=PDT::DarkColourAdjoint) return false;
- }
- return true;
- }
- else if(colourStructure()==OctetTripletTriplet) {
- if(ids[0]->iColour()!=PDT::DarkColourAdjoint) return false;
- if(ids[1]->iColour()==PDT::DarkColourFundamental&&
- ids[2]->iColour()==PDT::DarkColourAntiFundamental)
- return true;
- if(ids[1]->iColour()==PDT::DarkColourAntiFundamental&&
- ids[2]->iColour()==PDT::DarkColourFundamental)
- return true;
- return false;
- }
- else if(colourStructure()==TripletOctetTriplet) {
- if(ids[0]!=ids[2]) return false;
- if((ids[0]->iColour()==PDT::DarkColourFundamental||
- ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
- ids[1]->iColour()==PDT::DarkColourAdjoint) return true;
- return false;
- }
- else {
- assert(false);
- }
- return false;
-}
-
-double OneOneOneDarkSplitFn::P(const double z, const Energy2,
- const IdList & , const bool, const RhoDMatrix &)const {
- return sqr(1.-z*(1.-z))/(z*(1.-z));
-}
-
-double OneOneOneDarkSplitFn::overestimateP(const double z,
- const IdList & ) const {
- return (1/z + 1/(1.-z));
-}
-
-
-double OneOneOneDarkSplitFn::ratioP(const double z, const Energy2,
- const IdList & , const bool, const RhoDMatrix &) const {
- return sqr(1.-z*(1.-z));
-}
-
-double OneOneOneDarkSplitFn::invIntegOverP(const double r,
- const IdList & ,
- unsigned int PDFfactor) const {
- switch(PDFfactor) {
- case 0:
- return 1./(1.+exp(-r));
- case 1:
- case 2:
- case 3:
- default:
- throw Exception() << "OneOneOneDarkSplitFn::integOverP() invalid PDFfactor = "
- << PDFfactor << Exception::runerror;
- }
-}
-
-double OneOneOneDarkSplitFn::integOverP(const double z, const IdList & ,
- unsigned int PDFfactor) const {
- switch(PDFfactor) {
- case 0:
- assert(z>0.&&z<1.);
- return log(z/(1.-z));
- case 1:
- case 2:
- case 3:
- default:
- throw Exception() << "OneOneOneDarkSplitFn::integOverP() invalid PDFfactor = "
- << PDFfactor << Exception::runerror;
- }
-}
-
-bool OneOneOneDarkSplitFn::accept(const IdList & ids) const {
- if(ids.size()!=3) return false;
- for(unsigned int ix=0;ix<ids.size();++ix) {
- if(ids[0]->iSpin()!=PDT::Spin1) return false;
- }
- return OneOneOneDarkSplitFn::checkColours(ids);
-}
-
-vector<pair<int, Complex> >
-OneOneOneDarkSplitFn::generatePhiForward(const double z, const Energy2, const IdList &,
- const RhoDMatrix & rho) {
- assert(rho.iSpin()==PDT::Spin1);
- double modRho = abs(rho(0,2));
- double max = 2.*z*modRho*(1.-z)+sqr(1.-(1.-z)*z)/(z*(1.-z));
- vector<pair<int, Complex> > output;
- output.push_back(make_pair( 0,(rho(0,0)+rho(2,2))*sqr(1.-(1.-z)*z)/(z*(1.-z))/max));
- output.push_back(make_pair(-2,-rho(0,2)*z*(1.-z)/max));
- output.push_back(make_pair( 2,-rho(2,0)*z*(1.-z)/max));
- return output;
-}
-
-vector<pair<int, Complex> >
-OneOneOneDarkSplitFn::generatePhiBackward(const double z, const Energy2, const IdList &,
- const RhoDMatrix & rho) {
- assert(rho.iSpin()==PDT::Spin1);
- double diag = sqr(1 - (1 - z)*z)/(1 - z)/z;
- double off = (1.-z)/z;
- double max = 2.*abs(rho(0,2))*off+diag;
- vector<pair<int, Complex> > output;
- output.push_back(make_pair( 0, (rho(0,0)+rho(2,2))*diag/max));
- output.push_back(make_pair( 2,-rho(0,2) * off/max));
- output.push_back(make_pair(-2,-rho(2,0) * off/max));
- return output;
-}
-
-DecayMEPtr OneOneOneDarkSplitFn::matrixElement(const double z, const Energy2,
- const IdList &, const double phi,
- bool) {
- // calculate the kernal
- DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin1)));
- double omz = 1.-z;
- double root = sqrt(z*omz);
- Complex phase = exp(Complex(0.,1.)*phi);
- (*kernal)(0,0,0) = phase/root;
- (*kernal)(2,2,2) = -conj((*kernal)(0,0,0));
- (*kernal)(0,0,2) = -sqr(z)/root/phase;
- (*kernal)(2,2,0) = -conj((*kernal)(0,0,2));
- (*kernal)(0,2,0) = -sqr(omz)/root/phase;
- (*kernal)(2,0,2) = -conj((*kernal)(0,2,0));
- (*kernal)(0,2,2) = 0.;
- (*kernal)(2,0,0) = 0.;
- return kernal;
-}
diff --git a/Shower/QTilde/Dark/OneOneOneDarkSplitFn.h b/Shower/QTilde/Dark/OneOneOneDarkSplitFn.h
deleted file mode 100644
--- a/Shower/QTilde/Dark/OneOneOneDarkSplitFn.h
+++ /dev/null
@@ -1,190 +0,0 @@
-// -*- C++ -*-
-//
-// OneOneOneDarkSplitFn.h 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.
-//
-#ifndef HERWIG_OneOneOneDarkSplitFn_H
-#define HERWIG_OneOneOneDarkSplitFn_H
-//
-// This is the declaration of the OneOneOneDarkSplitFn class.
-//
-
-#include "Herwig/Shower/QTilde/SplittingFunctions/Sudakov1to2FormFactor.h"
-#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
-
-namespace Herwig {
-
-using namespace ThePEG;
-
-/** \ingroup Shower
- *
- * This class provides the concrete implementation of the exact leading-order
- * splitting function for \f$1\to 11\f$.
- *
- * In this case the splitting function is given by
- * \f[P(z) =2C*\left(\frac{z}{1-z}+\frac{1-z}{z}+z(1-z)\right),\f]
- * where \f$C=\f$ is the corresponding colour factor.
- * Our choice for the overestimate is
- * \f[P_{\rm over}(z) = 2C\left(\frac1z+\frac1{1-z}\right),\f]
- * therefore the integral is
- * \f[\int P_{\rm over}(z) {\rm d}z =2C\ln\left(\frac{z}{1-z}\right),\f]
- * and its inverse is
- * \f[\frac{\exp\left(\frac{r}{2C}\right)}{(1+\exp\left(\frac{r}{2C}\right)}\f]
- *
- *
- * @see \ref OneOneOneDarkSplitFnInterfaces "The interfaces"
- * defined for OneOneOneDarkSplitFn.
- */
-class OneOneOneDarkSplitFn: public Sudakov1to2FormFactor {
-
-public:
-
- /**
- * Method to check the colours are correct
- */
- virtual bool checkColours(const IdList & ids) const;
-
- /**
- * Concrete implementation of the method to determine whether this splitting
- * function can be used for a given set of particles.
- * @param ids The PDG codes for the particles in the splitting.
- */
- virtual bool accept(const IdList & ids) const;
-
- /**
- * Methods to return the splitting function.
- */
- //@{
- /**
- * The concrete implementation of the splitting function, \f$P(z,t)\f$.
- * @param z The energy fraction.
- * @param t The scale.
- * @param ids The PDG codes for the particles in the splitting.
- * @param mass Whether or not to include the mass dependent terms
- * @param rho The spin density matrix
- */
- virtual double P(const double z, const Energy2 t, const IdList & ids,
- const bool mass, const RhoDMatrix & rho) const;
-
- /**
- * The concrete implementation of the overestimate of the splitting function,
- * \f$P_{\rm over}\f$.
- * @param z The energy fraction.
- * @param ids The PDG codes for the particles in the splitting.
- */
- virtual double overestimateP(const double z, const IdList & ids) const;
-
- /**
- * The concrete implementation of the
- * the ratio of the splitting function to the overestimate, i.e.
- * \f$P(z,t)/P_{\rm over}(z)\f$.
- * @param z The energy fraction.
- * @param t The scale.
- * @param ids The PDG codes for the particles in the splitting.
- * @param mass Whether or not to include the mass dependent terms
- * @param rho The spin density matrix
- */
- virtual double ratioP(const double z, const Energy2 t, const IdList & ids,
- const bool mass, const RhoDMatrix & rho) const;
-
- /**
- * The concrete implementation of the indefinite integral of the
- * overestimated splitting function, \f$P_{\rm over}\f$.
- * @param z The energy fraction.
- * @param ids The PDG codes for the particles in the splitting.
- * @param PDFfactor Which additional factor to include for the PDF
- * 0 is no additional factor,
- * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
- */
- virtual double integOverP(const double z, const IdList & ids,
- unsigned int PDFfactor=0) const;
-
- /**
- * The concrete implementation of the inverse of the indefinite integral.
- * @param r Value of the splitting function to be inverted
- * @param ids The PDG codes for the particles in the splitting.
- * @param PDFfactor Which additional factor to include for the PDF
- * 0 is no additional factor,
- * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
- */
- virtual double invIntegOverP(const double r, const IdList & ids,
- unsigned int PDFfactor=0) const;
- //@}
-
- /**
- * Method to calculate the azimuthal angle for forward evolution
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- * @return The weight
- */
- virtual vector<pair<int,Complex> >
- generatePhiForward(const double z, const Energy2 t, const IdList & ids,
- const RhoDMatrix &);
-
- /**
- * Method to calculate the azimuthal angle for backward evolution
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- * @return The weight
- */
- virtual vector<pair<int,Complex> >
- generatePhiBackward(const double z, const Energy2 t, const IdList & ids,
- const RhoDMatrix &);
-
- /**
- * Calculate the matrix element for the splitting
- * @param z The energy fraction
- * @param t The scale \f$t=2p_j\cdot p_k\f$.
- * @param ids The PDG codes for the particles in the splitting.
- * @param The azimuthal angle, \f$\phi\f$.
- */
- virtual DecayMEPtr matrixElement(const double z, const Energy2 t,
- const IdList & ids, const double phi, bool timeLike);
-
-public:
-
- /**
- * The standard Init function used to initialize the interfaces.
- * Called exactly once for each class by the class description system
- * before the main function starts or
- * when this class is dynamically loaded.
- */
- static void Init();
-
-protected:
-
- /** @name Clone Methods. */
- //@{
- /**
- * Make a simple clone of this object.
- * @return a pointer to the new object.
- */
- virtual IBPtr clone() const {return new_ptr(*this);}
-
- /** Make a clone of this object, possibly modifying the cloned object
- * to make it sane.
- * @return a pointer to the new object.
- */
- virtual IBPtr fullclone() const {return new_ptr(*this);}
- //@}
-
-private:
-
- /**
- * The assignment operator is private and must never be called.
- * In fact, it should not even be implemented.
- */
- OneOneOneDarkSplitFn & operator=(const OneOneOneDarkSplitFn &) = delete;
-
-};
-
-}
-
-#endif /* HERWIG_OneOneOneDarkSplitFn_H */
diff --git a/Shower/QTilde/Makefile.am b/Shower/QTilde/Makefile.am
--- a/Shower/QTilde/Makefile.am
+++ b/Shower/QTilde/Makefile.am
@@ -1,61 +1,56 @@
-SUBDIRS = Matching SplittingFunctions/Onium
+SUBDIRS = Matching SplittingFunctions/Onium SplittingFunctions/Dark
pkglib_LTLIBRARIES = HwShower.la
HwShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 30:0:0
HwShower_la_SOURCES = \
Couplings/ShowerAlphaQCD.h Couplings/ShowerAlphaQCD.cc \
Couplings/ShowerAlphaQED.h Couplings/ShowerAlphaQED.cc\
Couplings/ShowerAlphaQCDNP.h Couplings/ShowerAlphaQCDNP.cc\
+Couplings/HiddenValleyAlpha.cc Couplings/HiddenValleyAlpha.h \
QTildeShowerHandler.h QTildeShowerHandler.fh QTildeShowerHandler.cc \
SplittingFunctions/HalfHalfOneSplitFn.h SplittingFunctions/HalfHalfOneSplitFn.cc\
SplittingFunctions/HalfHalfOneEWSplitFn.h SplittingFunctions/HalfHalfOneEWSplitFn.cc\
SplittingFunctions/HalfHalfZeroEWSplitFn.h SplittingFunctions/HalfHalfZeroEWSplitFn.cc\
SplittingFunctions/OneOneOneEWSplitFn.h SplittingFunctions/OneOneOneEWSplitFn.cc\
SplittingFunctions/OneOneOneQEDSplitFn.h SplittingFunctions/OneOneOneQEDSplitFn.cc\
SplittingFunctions/OneOneZeroEWSplitFn.h SplittingFunctions/OneOneZeroEWSplitFn.cc\
SplittingFunctions/ZeroZeroZeroEWSplitFn.h SplittingFunctions/ZeroZeroZeroEWSplitFn.cc\
SplittingFunctions/OneZeroZeroEWSplitFn.h SplittingFunctions/OneZeroZeroEWSplitFn.cc\
SplittingFunctions/ZeroZeroOneEWSplitFn.h SplittingFunctions/ZeroZeroOneEWSplitFn.cc\
SplittingFunctions/OneOneOneSplitFn.h SplittingFunctions/OneOneOneSplitFn.cc\
SplittingFunctions/OneOneOneMassiveSplitFn.h SplittingFunctions/OneOneOneMassiveSplitFn.cc\
SplittingFunctions/ZeroZeroOneSplitFn.h SplittingFunctions/ZeroZeroOneSplitFn.cc\
SplittingFunctions/OneHalfHalfSplitFn.h SplittingFunctions/OneHalfHalfSplitFn.cc\
SplittingFunctions/HalfOneHalfSplitFn.h SplittingFunctions/HalfOneHalfSplitFn.cc\
SplittingFunctions/CMWOneOneOneSplitFn.h SplittingFunctions/CMWOneOneOneSplitFn.cc\
SplittingFunctions/CMWHalfHalfOneSplitFn.h SplittingFunctions/CMWHalfHalfOneSplitFn.cc\
-Dark/EnumParticles.h Dark/HiddenValleyAlpha.cc Dark/HiddenValleyAlpha.h \
-Dark/HiddenValleyModel.cc Dark/HiddenValleyModel.h \
-Dark/HiddenValleyFFZPrimeVertex.cc Dark/HiddenValleyFFZPrimeVertex.h \
-Dark/OneHalfHalfDarkSplitFn.cc Dark/OneHalfHalfDarkSplitFn.h \
-Dark/OneOneOneDarkSplitFn.cc Dark/OneOneOneDarkSplitFn.h \
-Dark/HalfHalfOneDarkSplitFn.cc Dark/HalfHalfOneDarkSplitFn.h \
Kinematics/Decay_QTildeShowerKinematics1to2.cc \
Kinematics/Decay_QTildeShowerKinematics1to2.h \
Kinematics/IS_QTildeShowerKinematics1to2.cc Kinematics/IS_QTildeShowerKinematics1to2.h \
Kinematics/FS_QTildeShowerKinematics1to2.cc Kinematics/FS_QTildeShowerKinematics1to2.h \
Kinematics/KinematicHelpers.h \
Kinematics/KinematicsReconstructor.cc \
Kinematics/KinematicsReconstructor.tcc \
Kinematics/KinematicsReconstructor.h \
Kinematics/KinematicsReconstructor.fh \
Base/HardTree.cc Base/HardTree.h Base/HardTree.fh \
Base/HardBranching.h Base/HardBranching.fh Base/HardBranching.cc\
Base/PartnerFinder.h Base/PartnerFinder.fh Base/PartnerFinder.cc \
Base/ShowerVeto.h Base/ShowerVeto.fh Base/ShowerVeto.cc \
Base/FullShowerVeto.h Base/FullShowerVeto.fh Base/FullShowerVeto.cc \
SplittingFunctions/SplittingGenerator.cc SplittingFunctions/SplittingGenerator.h\
SplittingFunctions/SplittingGenerator.fh \
Base/ShowerTree.h Base/ShowerTree.fh Base/ShowerTree.cc \
ShowerConfig.h ShowerConfig.cc \
Base/Branching.h \
Base/ShowerParticle.cc Base/ShowerParticle.fh Base/ShowerParticle.h \
Kinematics/ShowerKinematics.fh Kinematics/ShowerKinematics.h Kinematics/ShowerKinematics.cc \
Kinematics/ShowerBasis.fh Kinematics/ShowerBasis.h Kinematics/ShowerBasis.cc \
Base/ShowerProgenitor.fh Base/ShowerProgenitor.h \
SplittingFunctions/SudakovFormFactor.cc SplittingFunctions/SudakovFormFactor.h SplittingFunctions/SudakovFormFactor.fh \
SplittingFunctions/SudakovCutOff.cc SplittingFunctions/SudakovCutOff.h SplittingFunctions/SudakovCutOff.fh \
SplittingFunctions/PTCutOff.cc SplittingFunctions/PTCutOff.h \
SplittingFunctions/MassCutOff.cc SplittingFunctions/MassCutOff.h \
SplittingFunctions/VariableMassCutOff.cc SplittingFunctions/VariableMassCutOff.h \
SplittingFunctions/Sudakov1to2FormFactor.h SplittingFunctions/Sudakov1to2FormFactor.fh \
SplittingFunctions/Sudakov1to2FormFactor.cc \
Base/ShowerVertex.cc Base/ShowerVertex.fh Base/ShowerVertex.h
diff --git a/Shower/QTilde/SplittingFunctions/Dark/HalfHalfOneDarkSplitFn.cc b/Shower/QTilde/SplittingFunctions/Dark/HalfHalfOneDarkSplitFn.cc
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/SplittingFunctions/Dark/HalfHalfOneDarkSplitFn.cc
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+//
+// HalfHalfOneDarkSplitFn.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 HalfHalfOneDarkSplitFn class.
+//
+
+#include "HalfHalfOneDarkSplitFn.h"
+#include "Herwig/Models/HiddenValley/HiddenValleyModel.h"
+#include "ThePEG/PDT/ParticleData.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+#include <cassert>
+
+using namespace Herwig;
+
+DescribeNoPIOClass<HalfHalfOneDarkSplitFn,Herwig::Sudakov1to2FormFactor>
+describeHalfHalfOneDarkSplitFn ("Herwig::HalfHalfOneDarkSplitFn","HwDarkShower.so");
+
+void HalfHalfOneDarkSplitFn::Init() {
+ // documentation
+ static ClassDocumentation<HalfHalfOneDarkSplitFn> documentation
+ ("The HalfHalfOneDarkSplitFn class implements the dark coloured q -> qg splitting function");
+}
+
+bool HalfHalfOneDarkSplitFn::checkColours(const IdList & ids) const {
+ if(colourStructure()==TripletTripletOctet) {
+ if(ids[0]!=ids[1]) return false;
+ if((ids[0]->iColour()==PDT::DarkColourFundamental||
+ ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
+ ids[2]->iColour()==PDT::DarkColourAdjoint) return true;
+ return false;
+ }
+ else if(colourStructure()==OctetOctetOctet) {
+ for(unsigned int ix=0;ix<3;++ix) {
+ if(ids[ix]->iColour()!=PDT::DarkColourAdjoint) return false;
+ }
+ return true;
+ }
+ else if(colourStructure()==OctetTripletTriplet) {
+ if(ids[0]->iColour()!=PDT::DarkColourAdjoint) return false;
+ if(ids[1]->iColour()==PDT::DarkColourFundamental&&
+ ids[2]->iColour()==PDT::DarkColourAntiFundamental)
+ return true;
+ if(ids[1]->iColour()==PDT::DarkColourAntiFundamental&&
+ ids[2]->iColour()==PDT::DarkColourFundamental)
+ return true;
+ return false;
+ }
+ else if(colourStructure()==TripletOctetTriplet) {
+ if(ids[0]!=ids[2]) return false;
+ if((ids[0]->iColour()==PDT::DarkColourFundamental||
+ ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
+ ids[1]->iColour()==PDT::DarkColourAdjoint) return true;
+ return false;
+ }
+ else {
+ assert(false);
+ }
+ return false;
+}
+
+double HalfHalfOneDarkSplitFn::P(const double z, const Energy2 t,
+ const IdList &ids, const bool mass, const RhoDMatrix & ) const {
+ double val = (1. + sqr(z))/(1.-z);
+ if(mass) {
+ Energy m = ids[0]->mass();
+ val -= 2.*sqr(m)/t;
+ }
+ return val;
+}
+
+double HalfHalfOneDarkSplitFn::overestimateP(const double z,
+ const IdList & ) const {
+ return 2./(1.-z);
+}
+
+double HalfHalfOneDarkSplitFn::ratioP(const double z, const Energy2 t,
+ const IdList & ids, const bool mass, const RhoDMatrix & ) const {
+ double val = 1. + sqr(z);
+ if(mass) {
+ Energy m = ids[0]->mass();
+ val -= 2.*sqr(m)*(1.-z)/t;
+ }
+ return 0.5*val;
+}
+
+double HalfHalfOneDarkSplitFn::integOverP(const double z,
+ const IdList & ,
+ unsigned int PDFfactor) const {
+ switch (PDFfactor) {
+ case 0:
+ return -2.*Math::log1m(z);
+ case 1:
+ return 2.*log(z/(1.-z));
+ case 2:
+ return 2./(1.-z);
+ case 3:
+ default:
+ throw Exception() << "HalfHalfOneDarkSplitFn::integOverP() invalid PDFfactor = "
+ << PDFfactor << Exception::runerror;
+ }
+}
+
+double HalfHalfOneDarkSplitFn::invIntegOverP(const double r, const IdList &,
+ unsigned int PDFfactor) const {
+ switch (PDFfactor) {
+ case 0:
+ return 1. - exp(- 0.5*r);
+ case 1:
+ return 1./(1.-exp(-0.5*r));
+ case 2:
+ return 1.-2./r;
+ case 3:
+ default:
+ throw Exception() << "HalfHalfOneDarkSplitFn::invIntegOverP() invalid PDFfactor = "
+ << PDFfactor << Exception::runerror;
+ }
+}
+
+bool HalfHalfOneDarkSplitFn::accept(const IdList &ids) const {
+ // 3 particles and in and out fermion same
+ if(ids.size()!=3 || ids[0]!=ids[1]) return false;
+ if(ids[0]->iSpin()!=PDT::Spin1Half ||
+ ids[2]->iSpin()!=PDT::Spin1) return false;
+ return checkColours(ids);
+}
+
+vector<pair<int, Complex> >
+HalfHalfOneDarkSplitFn::generatePhiForward(const double, const Energy2, const IdList & ,
+ const RhoDMatrix &) {
+ // no dependence on the spin density matrix, dependence on off-diagonal terms cancels
+ // and rest = splitting function for Tr(rho)=1 as required by defn
+ return {{ {0, 1.} }};
+}
+
+vector<pair<int, Complex> >
+HalfHalfOneDarkSplitFn::generatePhiBackward(const double, const Energy2, const IdList & ,
+ const RhoDMatrix &) {
+ // no dependence on the spin density matrix, dependence on off-diagonal terms cancels
+ // and rest = splitting function for Tr(rho)=1 as required by defn
+ return {{ {0, 1.} }};
+}
+
+DecayMEPtr HalfHalfOneDarkSplitFn::matrixElement(const double z, const Energy2 t,
+ const IdList & ids, const double phi,
+ bool timeLike) {
+ // calculate the kernal
+ DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1Half,PDT::Spin1Half,PDT::Spin1)));
+ Energy m = !timeLike ? ZERO : ids[0]->mass();
+ double mt = m/sqrt(t);
+ double root = sqrt(1.-(1.-z)*sqr(m)/z/t);
+ double romz = sqrt(1.-z);
+ double rz = sqrt(z);
+ Complex phase = exp(Complex(0.,1.)*phi);
+ (*kernal)(0,0,0) = -root/romz*phase;
+ (*kernal)(1,1,2) = -conj((*kernal)(0,0,0));
+ (*kernal)(0,0,2) = root/romz*z/phase;
+ (*kernal)(1,1,0) = -conj((*kernal)(0,0,2));
+ (*kernal)(1,0,2) = mt*(1.-z)/rz;
+ (*kernal)(0,1,0) = conj((*kernal)(1,0,2));
+ (*kernal)(0,1,2) = 0.;
+ (*kernal)(1,0,0) = 0.;
+ return kernal;
+}
diff --git a/Shower/QTilde/SplittingFunctions/Dark/HalfHalfOneDarkSplitFn.h b/Shower/QTilde/SplittingFunctions/Dark/HalfHalfOneDarkSplitFn.h
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/SplittingFunctions/Dark/HalfHalfOneDarkSplitFn.h
@@ -0,0 +1,189 @@
+// -*- C++ -*-
+//
+// HalfHalfOneDarkSplitFn.h 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.
+//
+#ifndef HERWIG_HalfHalfOneDarkSplitFn_H
+#define HERWIG_HalfHalfOneDarkSplitFn_H
+//
+// This is the declaration of the HalfHalfOneDarkSplitFn class.
+//
+
+#include "Herwig/Shower/QTilde/SplittingFunctions/Sudakov1to2FormFactor.h"
+#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**\ingroup Shower
+ *
+ * This class provides the concrete implementation of the exact leading-order
+ * splitting function for \f$\frac12\to q\frac12 1\f$.
+ *
+ * In this case the splitting function is given by
+ * \f[P(z,t) =C\left(\frac{1+z^2}{1-z}-2\frac{m^2_q}{t}\right),\f]
+ * where \f$C\f$ is the corresponding colour factor.
+ * Our choice for the overestimate is
+ * \f[P_{\rm over}(z) = \frac{2C}{1-z},\f]
+ * therefore the integral is
+ * \f[\int P_{\rm over}(z) {\rm d}z = -2C\ln(1-z),\f]
+ * and its inverse is
+ * \f[1-\exp\left(\frac{r}{2C}\right).\f]
+ *
+ * @see \ref HalfHalfOneDarkSplitFnInterfaces "The interfaces"
+ * defined for HalfHalfOneDarkSplitFn.
+ */
+class HalfHalfOneDarkSplitFn: public Sudakov1to2FormFactor {
+
+public:
+
+ /**
+ * Method to check the colours are correct
+ */
+ virtual bool checkColours(const IdList & ids) const;
+
+ /**
+ * Concrete implementation of the method to determine whether this splitting
+ * function can be used for a given set of particles.
+ * @param ids The PDG codes for the particles in the splitting.
+ */
+ virtual bool accept(const IdList & ids) const;
+
+ /**
+ * Methods to return the splitting function.
+ */
+ //@{
+ /**
+ * The concrete implementation of the splitting function, \f$P(z,t)\f$.
+ * @param z The energy fraction.
+ * @param t The scale.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param mass Whether or not to include the mass dependent terms
+ * @param rho The spin density matrix
+ */
+ virtual double P(const double z, const Energy2 t, const IdList & ids,
+ const bool mass, const RhoDMatrix & rho) const;
+
+ /**
+ * The concrete implementation of the overestimate of the splitting function,
+ * \f$P_{\rm over}\f$.
+ * @param z The energy fraction.
+ * @param ids The PDG codes for the particles in the splitting.
+ */
+ virtual double overestimateP(const double z, const IdList & ids) const;
+
+ /**
+ * The concrete implementation of the
+ * the ratio of the splitting function to the overestimate, i.e.
+ * \f$P(z,t)/P_{\rm over}(z)\f$.
+ * @param z The energy fraction.
+ * @param t The scale.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param mass Whether or not to include the mass dependent terms
+ * @param rho The spin density matrix
+ */
+ virtual double ratioP(const double z, const Energy2 t, const IdList & ids,
+ const bool mass, const RhoDMatrix & rho) const;
+
+ /**
+ * The concrete implementation of the indefinite integral of the
+ * overestimated splitting function, \f$P_{\rm over}\f$.
+ * @param z The energy fraction.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param PDFfactor Which additional factor to include for the PDF
+ * 0 is no additional factor,
+ * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
+ */
+ virtual double integOverP(const double z, const IdList & ids,
+ unsigned int PDFfactor=0) const;
+
+ /**
+ * The concrete implementation of the inverse of the indefinite integral.
+ * @param r Value of the splitting function to be inverted
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param PDFfactor Which additional factor to include for the PDF
+ * 0 is no additional factor,
+ * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
+ */
+ virtual double invIntegOverP(const double r, const IdList & ids,
+ unsigned int PDFfactor=0) const;
+ //@}
+
+ /**
+ * Method to calculate the azimuthal angle
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ * @return The weight
+ */
+ virtual vector<pair<int,Complex> >
+ generatePhiForward(const double z, const Energy2 t, const IdList & ids,
+ const RhoDMatrix &);
+
+ /**
+ * Method to calculate the azimuthal angle for backward evolution
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ * @return The weight
+ */
+ virtual vector<pair<int,Complex> >
+ generatePhiBackward(const double z, const Energy2 t, const IdList & ids,
+ const RhoDMatrix &);
+
+ /**
+ * Calculate the matrix element for the splitting
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ */
+ virtual DecayMEPtr matrixElement(const double z, const Energy2 t,
+ const IdList & ids, const double phi, bool timeLike);
+
+public:
+
+ /**
+ * The standard Init function used to initialize the interfaces.
+ * Called exactly once for each class by the class description system
+ * before the main function starts or
+ * when this class is dynamically loaded.
+ */
+ static void Init();
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr clone() const {return new_ptr(*this);}
+
+ /** Make a clone of this object, possibly modifying the cloned object
+ * to make it sane.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr fullclone() const {return new_ptr(*this);}
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ HalfHalfOneDarkSplitFn & operator=(const HalfHalfOneDarkSplitFn &) = delete;
+
+};
+
+}
+
+#endif /* HERWIG_HalfHalfOneDarkSplitFn_H */
diff --git a/Shower/QTilde/SplittingFunctions/Dark/Makefile.am b/Shower/QTilde/SplittingFunctions/Dark/Makefile.am
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/SplittingFunctions/Dark/Makefile.am
@@ -0,0 +1,8 @@
+pkglib_LTLIBRARIES = HwDarkShower.la
+
+HwDarkShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 1:0:0
+
+HwDarkShower_la_SOURCES = \
+ OneHalfHalfDarkSplitFn.cc OneHalfHalfDarkSplitFn.h \
+ OneOneOneDarkSplitFn.cc OneOneOneDarkSplitFn.h \
+ HalfHalfOneDarkSplitFn.cc HalfHalfOneDarkSplitFn.h
diff --git a/Shower/QTilde/SplittingFunctions/Dark/OneHalfHalfDarkSplitFn.cc b/Shower/QTilde/SplittingFunctions/Dark/OneHalfHalfDarkSplitFn.cc
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/SplittingFunctions/Dark/OneHalfHalfDarkSplitFn.cc
@@ -0,0 +1,187 @@
+// -*- C++ -*-
+//
+// OneHalfHalfDarkSplitFn.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 OneHalfHalfDarkSplitFn class.
+//
+
+#include "OneHalfHalfDarkSplitFn.h"
+#include "Herwig/Models/HiddenValley/HiddenValleyModel.h"
+#include "ThePEG/PDT/ParticleData.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+
+using namespace Herwig;
+
+DescribeNoPIOClass<OneHalfHalfDarkSplitFn,Herwig::Sudakov1to2FormFactor>
+describeOneHalfHalfDarkSplitFn ("Herwig::OneHalfHalfDarkSplitFn","HwDarkShower.so");
+
+void OneHalfHalfDarkSplitFn::Init() {
+
+ static ClassDocumentation<OneHalfHalfDarkSplitFn> documentation
+ ("The OneHalfHalfDarkSplitFn class implements the splitting function for g->q qbar");
+
+}
+
+bool OneHalfHalfDarkSplitFn::checkColours(const IdList & ids) const {
+ if(colourStructure()==TripletTripletOctet) {
+ if(ids[0]!=ids[1]) return false;
+ if((ids[0]->iColour()==PDT::DarkColourFundamental||
+ ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
+ ids[2]->iColour()==PDT::DarkColourAdjoint) return true;
+ return false;
+ }
+ else if(colourStructure()==OctetOctetOctet) {
+ for(unsigned int ix=0;ix<3;++ix) {
+ if(ids[ix]->iColour()!=PDT::DarkColourAdjoint) return false;
+ }
+ return true;
+ }
+ else if(colourStructure()==OctetTripletTriplet) {
+ if(ids[0]->iColour()!=PDT::DarkColourAdjoint) return false;
+ if(ids[1]->iColour()==PDT::DarkColourFundamental&&
+ ids[2]->iColour()==PDT::DarkColourAntiFundamental)
+ return true;
+ if(ids[1]->iColour()==PDT::DarkColourAntiFundamental&&
+ ids[2]->iColour()==PDT::DarkColourFundamental)
+ return true;
+ return false;
+ }
+ else if(colourStructure()==TripletOctetTriplet) {
+ if(ids[0]!=ids[2]) return false;
+ if((ids[0]->iColour()==PDT::DarkColourFundamental||
+ ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
+ ids[1]->iColour()==PDT::DarkColourAdjoint) return true;
+ return false;
+ }
+ else {
+ assert(false);
+ }
+ return false;
+}
+
+double OneHalfHalfDarkSplitFn::P(const double z, const Energy2 t,
+ const IdList &ids, const bool mass, const RhoDMatrix &) const {
+ double zz = z*(1.-z);
+ double val=1.-2.*zz;
+ if(mass) {
+ Energy m = ids[1]->mass();
+ val +=2.*sqr(m)/t;
+ }
+ return val;
+}
+
+double OneHalfHalfDarkSplitFn::overestimateP(const double,
+ const IdList &) const {
+ return 1.;
+}
+
+double OneHalfHalfDarkSplitFn::ratioP(const double z, const Energy2 t,
+ const IdList &ids, const bool mass, const RhoDMatrix &) const {
+ double zz = z*(1.-z);
+ double val = 1.-2.*zz;
+ if(mass) {
+ Energy m = ids[1]->mass();
+ val+= 2.*sqr(m)/t;
+ }
+ return val;
+}
+
+double OneHalfHalfDarkSplitFn::integOverP(const double z, const IdList & ,
+ unsigned int PDFfactor) const {
+ switch(PDFfactor) {
+ case 0:
+ return z;
+ case 1:
+ return log(z);
+ case 2:
+ return -log(1.-z);
+ case 3:
+ return log(z/(1.-z));
+ case 4:
+ return 2.*sqrt(z);
+ case 5:
+ return (2./3.)*z*sqrt(z);
+ default:
+ throw Exception() << "OneHalfHalfDarkSplitFn::integOverP() invalid PDFfactor = "
+ << PDFfactor << Exception::runerror;
+ }
+}
+
+double OneHalfHalfDarkSplitFn::invIntegOverP(const double r,
+ const IdList & ,
+ unsigned int PDFfactor) const {
+ switch(PDFfactor) {
+ case 0:
+ return r;
+ case 1:
+ return exp(r);
+ case 2:
+ return 1.-exp(-r);
+ case 3:
+ return 1./(1.+exp(-r));
+ case 4:
+ return 0.25*sqr(r);
+ case 5:
+ return pow(1.5*r,2./3.);
+ default:
+ throw Exception() << "OneHalfHalfDarkSplitFn::integOverP() invalid PDFfactor = "
+ << PDFfactor << Exception::runerror;
+ }
+}
+
+bool OneHalfHalfDarkSplitFn::accept(const IdList &ids) const {
+ if(ids.size()!=3) return false;
+ if(ids[1]!=ids[2]->CC()) return false;
+ if(ids[1]->iSpin()!=PDT::Spin1Half) return false;
+ if(ids[0]->iSpin()!=PDT::Spin1) return false;
+ return OneHalfHalfDarkSplitFn::checkColours(ids);
+}
+
+vector<pair<int, Complex> >
+OneHalfHalfDarkSplitFn::generatePhiForward(const double z, const Energy2 t, const IdList & ids,
+ const RhoDMatrix & rho) {
+ assert(rho.iSpin()==PDT::Spin1);
+ double modRho = abs(rho(0,2));
+ Energy mq = ids[1]->mass();
+ Energy2 mq2 = sqr(mq);
+ double fact = z*(1.-z)-mq2/t;
+ double max = 1.+2.*fact*(-1.+2.*modRho);
+ vector<pair<int, Complex> > output;
+ output.push_back(make_pair( 0,(rho(0,0)+rho(2,2))*(1.-2.*fact)/max));
+ output.push_back(make_pair(-2,2.*fact*rho(0,2)/max));
+ output.push_back(make_pair( 2,2.*fact*rho(2,0)/max));
+ return output;
+}
+
+vector<pair<int, Complex> >
+OneHalfHalfDarkSplitFn::generatePhiBackward(const double, const Energy2, const IdList &,
+ const RhoDMatrix & ) {
+ // no dependance
+ return {{ {0, 1.} }};
+}
+
+DecayMEPtr OneHalfHalfDarkSplitFn::matrixElement(const double z, const Energy2 t,
+ const IdList & ids, const double phi,
+ bool timeLike) {
+ static const Complex ii(0.,1.);
+ // calculate the kernal
+ DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1Half,PDT::Spin1Half)));
+ double mt = !timeLike ? ZERO : ids[1]->mass()/sqrt(t);
+ double root =sqrt(1.-sqr(mt)/z/(1.-z));
+ (*kernal)(0,0,0) = mt/sqrt(z*(1.-z));
+ (*kernal)(2,1,1) = (*kernal)(0,0,0);
+ (*kernal)(0,0,1) = -z*root*exp(-ii*phi);
+ (*kernal)(2,1,0) = -conj((*kernal)(0,0,1));
+ (*kernal)(0,1,0) = (1.-z)*exp(-ii*phi)*root;
+ (*kernal)(2,0,1) = -conj((*kernal)(0,1,0));
+ (*kernal)(0,1,1) = 0.;
+ (*kernal)(2,0,0) = 0.;
+ return kernal;
+}
diff --git a/Shower/QTilde/SplittingFunctions/Dark/OneHalfHalfDarkSplitFn.h b/Shower/QTilde/SplittingFunctions/Dark/OneHalfHalfDarkSplitFn.h
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/SplittingFunctions/Dark/OneHalfHalfDarkSplitFn.h
@@ -0,0 +1,194 @@
+// -*- C++ -*-
+//
+// OneHalfHalfDarkSplitFn.h 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.
+//
+#ifndef HERWIG_OneHalfHalfDarkSplitFn_H
+#define HERWIG_OneHalfHalfDarkSplitFn_H
+//
+// This is the declaration of the OneHalfHalfDarkSplitFn class.
+//
+
+#include "Herwig/Shower/QTilde/SplittingFunctions/Sudakov1to2FormFactor.h"
+#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/**\ingroup Shower
+ *
+ * This class provides the concrete implementation of the exact leading-order
+ * splitting function for \f$1\to \frac12\frac12\f$.
+ *
+ * In this case the splitting function is given by
+ * \f[P(z,t) =C\left(1-2z(1-z)+2\frac{m_q^2}{t}\right),\f]
+ * where \f$C\f$ is the corresponding colour factor
+ * Our choice for the overestimate is
+ * \f[P_{\rm over}(z) = C,\f]
+ * therefore the integral is
+ * \f[\int P_{\rm over}(z) {\rm d}z =Cz,\f]
+ * and its inverse is
+ * \f[\frac{r}{C}\f]
+ *
+ * @see \ref OneHalfHalfDarkSplitFnInterfaces "The interfaces"
+ * defined for OneHalfHalfDarkSplitFn.
+ */
+class OneHalfHalfDarkSplitFn: public Sudakov1to2FormFactor {
+
+public:
+
+ /**
+ * Method to check the colours are correct
+ */
+ virtual bool checkColours(const IdList & ids) const;
+
+ /**
+ * Concrete implementation of the method to determine whether this splitting
+ * function can be used for a given set of particles.
+ * @param ids The PDG codes for the particles in the splitting.
+ */
+ virtual bool accept(const IdList & ids) const;
+
+ /**
+ * Methods to return the splitting function.
+ */
+ //@{
+ /**
+ * The concrete implementation of the splitting function, \f$P\f$.
+ * @param z The energy fraction.
+ * @param t The scale.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param mass Whether or not to include the mass dependent terms
+ * @param rho The spin density matrix
+ */
+ virtual double P(const double z, const Energy2 t, const IdList & ids,
+ const bool mass, const RhoDMatrix & rho) const;
+
+
+ /**
+ * The concrete implementation of the overestimate of the splitting function,
+ * \f$P_{\rm over}\f$.
+ * @param z The energy fraction.
+ * @param ids The PDG codes for the particles in the splitting.
+ */
+ virtual double overestimateP(const double z, const IdList & ids) const;
+
+ /**
+ * The concrete implementation of the
+ * the ratio of the splitting function to the overestimate, i.e.
+ * \f$P(z,\tilde{q}^2)/P_{\rm over}(z)\f$.
+ * @param z The energy fraction.
+ * @param t The scale.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param mass Whether or not to include the mass dependent terms
+ * @param rho The spin density matrix
+ */
+ virtual double ratioP(const double z, const Energy2 t, const IdList & ids,
+ const bool mass, const RhoDMatrix & rho) const;
+
+ /**
+ * The concrete implementation of the indefinite integral of the
+ * overestimated splitting function, \f$P_{\rm over}\f$.
+ * @param z The energy fraction.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param PDFfactor Which additional factor to include for the PDF
+ * 0 is no additional factor,
+ * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
+ */
+ virtual double integOverP(const double z, const IdList & ids,
+ unsigned int PDFfactor=0) const;
+
+ /**
+ * The concrete implementation of the inverse of the indefinite integral.
+ * @param r Value of the splitting function to be inverted
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param PDFfactor Which additional factor to include for the PDF
+ * 0 is no additional factor,
+ * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
+ */
+ virtual double invIntegOverP(const double r, const IdList & ids,
+ unsigned int PDFfactor=0) const;
+ //@}
+
+ /**
+ * Method to calculate the azimuthal angle
+ * @param particle The particle which is branching
+ * @param showerkin The ShowerKinematics object
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ * @return The weight
+ */
+ virtual vector<pair<int,Complex> >
+ generatePhiForward(const double z, const Energy2 t, const IdList & ids,
+ const RhoDMatrix &);
+
+ /**
+ * Method to calculate the azimuthal angle
+ * @param particle The particle which is branching
+ * @param showerkin The ShowerKinematics object
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ * @return The weight
+ */
+ virtual vector<pair<int,Complex> >
+ generatePhiBackward(const double z, const Energy2 t, const IdList & ids,
+ const RhoDMatrix &);
+
+ /**
+ * Calculate the matrix element for the splitting
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ */
+ virtual DecayMEPtr matrixElement(const double z, const Energy2 t,
+ const IdList & ids, const double phi, bool timeLike);
+
+public:
+
+ /**
+ * The standard Init function used to initialize the interfaces.
+ * Called exactly once for each class by the class description system
+ * before the main function starts or
+ * when this class is dynamically loaded.
+ */
+ static void Init();
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr clone() const {return new_ptr(*this);}
+
+ /** Make a clone of this object, possibly modifying the cloned object
+ * to make it sane.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr fullclone() const {return new_ptr(*this);}
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ OneHalfHalfDarkSplitFn & operator=(const OneHalfHalfDarkSplitFn &) = delete;
+
+};
+
+}
+
+#endif /* HERWIG_OneHalfHalfDarkSplitFn_H */
diff --git a/Shower/QTilde/SplittingFunctions/Dark/OneOneOneDarkSplitFn.cc b/Shower/QTilde/SplittingFunctions/Dark/OneOneOneDarkSplitFn.cc
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/SplittingFunctions/Dark/OneOneOneDarkSplitFn.cc
@@ -0,0 +1,167 @@
+// -*- C++ -*-
+//
+// OneOneOneDarkSplitFn.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 OneOneOneDarkSplitFn class.
+//
+
+#include "OneOneOneDarkSplitFn.h"
+#include "Herwig/Models/HiddenValley/HiddenValleyModel.h"
+#include "ThePEG/PDT/ParticleData.h"
+#include "ThePEG/Interface/ClassDocumentation.h"
+#include "ThePEG/Utilities/DescribeClass.h"
+
+using namespace Herwig;
+
+DescribeNoPIOClass<OneOneOneDarkSplitFn,Herwig::Sudakov1to2FormFactor>
+describeOneOneOneDarkSplitFn ("Herwig::OneOneOneDarkSplitFn","HwDarkShower.so");
+
+void OneOneOneDarkSplitFn::Init() {
+
+ static ClassDocumentation<OneOneOneDarkSplitFn> documentation
+ ("The OneOneOneDarkSplitFn class implements the g -> gg splitting function");
+
+}
+
+bool OneOneOneDarkSplitFn::checkColours(const IdList & ids) const {
+ if(colourStructure()==TripletTripletOctet) {
+ if(ids[0]!=ids[1]) return false;
+ if((ids[0]->iColour()==PDT::DarkColourFundamental||
+ ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
+ ids[2]->iColour()==PDT::DarkColourAdjoint) return true;
+ return false;
+ }
+ else if(colourStructure()==OctetOctetOctet) {
+ for(unsigned int ix=0;ix<3;++ix) {
+ if(ids[ix]->iColour()!=PDT::DarkColourAdjoint) return false;
+ }
+ return true;
+ }
+ else if(colourStructure()==OctetTripletTriplet) {
+ if(ids[0]->iColour()!=PDT::DarkColourAdjoint) return false;
+ if(ids[1]->iColour()==PDT::DarkColourFundamental&&
+ ids[2]->iColour()==PDT::DarkColourAntiFundamental)
+ return true;
+ if(ids[1]->iColour()==PDT::DarkColourAntiFundamental&&
+ ids[2]->iColour()==PDT::DarkColourFundamental)
+ return true;
+ return false;
+ }
+ else if(colourStructure()==TripletOctetTriplet) {
+ if(ids[0]!=ids[2]) return false;
+ if((ids[0]->iColour()==PDT::DarkColourFundamental||
+ ids[0]->iColour()==PDT::DarkColourAntiFundamental) &&
+ ids[1]->iColour()==PDT::DarkColourAdjoint) return true;
+ return false;
+ }
+ else {
+ assert(false);
+ }
+ return false;
+}
+
+double OneOneOneDarkSplitFn::P(const double z, const Energy2,
+ const IdList & , const bool, const RhoDMatrix &)const {
+ return sqr(1.-z*(1.-z))/(z*(1.-z));
+}
+
+double OneOneOneDarkSplitFn::overestimateP(const double z,
+ const IdList & ) const {
+ return (1/z + 1/(1.-z));
+}
+
+
+double OneOneOneDarkSplitFn::ratioP(const double z, const Energy2,
+ const IdList & , const bool, const RhoDMatrix &) const {
+ return sqr(1.-z*(1.-z));
+}
+
+double OneOneOneDarkSplitFn::invIntegOverP(const double r,
+ const IdList & ,
+ unsigned int PDFfactor) const {
+ switch(PDFfactor) {
+ case 0:
+ return 1./(1.+exp(-r));
+ case 1:
+ case 2:
+ case 3:
+ default:
+ throw Exception() << "OneOneOneDarkSplitFn::integOverP() invalid PDFfactor = "
+ << PDFfactor << Exception::runerror;
+ }
+}
+
+double OneOneOneDarkSplitFn::integOverP(const double z, const IdList & ,
+ unsigned int PDFfactor) const {
+ switch(PDFfactor) {
+ case 0:
+ assert(z>0.&&z<1.);
+ return log(z/(1.-z));
+ case 1:
+ case 2:
+ case 3:
+ default:
+ throw Exception() << "OneOneOneDarkSplitFn::integOverP() invalid PDFfactor = "
+ << PDFfactor << Exception::runerror;
+ }
+}
+
+bool OneOneOneDarkSplitFn::accept(const IdList & ids) const {
+ if(ids.size()!=3) return false;
+ for(unsigned int ix=0;ix<ids.size();++ix) {
+ if(ids[0]->iSpin()!=PDT::Spin1) return false;
+ }
+ return OneOneOneDarkSplitFn::checkColours(ids);
+}
+
+vector<pair<int, Complex> >
+OneOneOneDarkSplitFn::generatePhiForward(const double z, const Energy2, const IdList &,
+ const RhoDMatrix & rho) {
+ assert(rho.iSpin()==PDT::Spin1);
+ double modRho = abs(rho(0,2));
+ double max = 2.*z*modRho*(1.-z)+sqr(1.-(1.-z)*z)/(z*(1.-z));
+ vector<pair<int, Complex> > output;
+ output.push_back(make_pair( 0,(rho(0,0)+rho(2,2))*sqr(1.-(1.-z)*z)/(z*(1.-z))/max));
+ output.push_back(make_pair(-2,-rho(0,2)*z*(1.-z)/max));
+ output.push_back(make_pair( 2,-rho(2,0)*z*(1.-z)/max));
+ return output;
+}
+
+vector<pair<int, Complex> >
+OneOneOneDarkSplitFn::generatePhiBackward(const double z, const Energy2, const IdList &,
+ const RhoDMatrix & rho) {
+ assert(rho.iSpin()==PDT::Spin1);
+ double diag = sqr(1 - (1 - z)*z)/(1 - z)/z;
+ double off = (1.-z)/z;
+ double max = 2.*abs(rho(0,2))*off+diag;
+ vector<pair<int, Complex> > output;
+ output.push_back(make_pair( 0, (rho(0,0)+rho(2,2))*diag/max));
+ output.push_back(make_pair( 2,-rho(0,2) * off/max));
+ output.push_back(make_pair(-2,-rho(2,0) * off/max));
+ return output;
+}
+
+DecayMEPtr OneOneOneDarkSplitFn::matrixElement(const double z, const Energy2,
+ const IdList &, const double phi,
+ bool) {
+ // calculate the kernal
+ DecayMEPtr kernal(new_ptr(TwoBodyDecayMatrixElement(PDT::Spin1,PDT::Spin1,PDT::Spin1)));
+ double omz = 1.-z;
+ double root = sqrt(z*omz);
+ Complex phase = exp(Complex(0.,1.)*phi);
+ (*kernal)(0,0,0) = phase/root;
+ (*kernal)(2,2,2) = -conj((*kernal)(0,0,0));
+ (*kernal)(0,0,2) = -sqr(z)/root/phase;
+ (*kernal)(2,2,0) = -conj((*kernal)(0,0,2));
+ (*kernal)(0,2,0) = -sqr(omz)/root/phase;
+ (*kernal)(2,0,2) = -conj((*kernal)(0,2,0));
+ (*kernal)(0,2,2) = 0.;
+ (*kernal)(2,0,0) = 0.;
+ return kernal;
+}
diff --git a/Shower/QTilde/SplittingFunctions/Dark/OneOneOneDarkSplitFn.h b/Shower/QTilde/SplittingFunctions/Dark/OneOneOneDarkSplitFn.h
new file mode 100644
--- /dev/null
+++ b/Shower/QTilde/SplittingFunctions/Dark/OneOneOneDarkSplitFn.h
@@ -0,0 +1,190 @@
+// -*- C++ -*-
+//
+// OneOneOneDarkSplitFn.h 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.
+//
+#ifndef HERWIG_OneOneOneDarkSplitFn_H
+#define HERWIG_OneOneOneDarkSplitFn_H
+//
+// This is the declaration of the OneOneOneDarkSplitFn class.
+//
+
+#include "Herwig/Shower/QTilde/SplittingFunctions/Sudakov1to2FormFactor.h"
+#include "Herwig/Decay/TwoBodyDecayMatrixElement.h"
+
+namespace Herwig {
+
+using namespace ThePEG;
+
+/** \ingroup Shower
+ *
+ * This class provides the concrete implementation of the exact leading-order
+ * splitting function for \f$1\to 11\f$.
+ *
+ * In this case the splitting function is given by
+ * \f[P(z) =2C*\left(\frac{z}{1-z}+\frac{1-z}{z}+z(1-z)\right),\f]
+ * where \f$C=\f$ is the corresponding colour factor.
+ * Our choice for the overestimate is
+ * \f[P_{\rm over}(z) = 2C\left(\frac1z+\frac1{1-z}\right),\f]
+ * therefore the integral is
+ * \f[\int P_{\rm over}(z) {\rm d}z =2C\ln\left(\frac{z}{1-z}\right),\f]
+ * and its inverse is
+ * \f[\frac{\exp\left(\frac{r}{2C}\right)}{(1+\exp\left(\frac{r}{2C}\right)}\f]
+ *
+ *
+ * @see \ref OneOneOneDarkSplitFnInterfaces "The interfaces"
+ * defined for OneOneOneDarkSplitFn.
+ */
+class OneOneOneDarkSplitFn: public Sudakov1to2FormFactor {
+
+public:
+
+ /**
+ * Method to check the colours are correct
+ */
+ virtual bool checkColours(const IdList & ids) const;
+
+ /**
+ * Concrete implementation of the method to determine whether this splitting
+ * function can be used for a given set of particles.
+ * @param ids The PDG codes for the particles in the splitting.
+ */
+ virtual bool accept(const IdList & ids) const;
+
+ /**
+ * Methods to return the splitting function.
+ */
+ //@{
+ /**
+ * The concrete implementation of the splitting function, \f$P(z,t)\f$.
+ * @param z The energy fraction.
+ * @param t The scale.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param mass Whether or not to include the mass dependent terms
+ * @param rho The spin density matrix
+ */
+ virtual double P(const double z, const Energy2 t, const IdList & ids,
+ const bool mass, const RhoDMatrix & rho) const;
+
+ /**
+ * The concrete implementation of the overestimate of the splitting function,
+ * \f$P_{\rm over}\f$.
+ * @param z The energy fraction.
+ * @param ids The PDG codes for the particles in the splitting.
+ */
+ virtual double overestimateP(const double z, const IdList & ids) const;
+
+ /**
+ * The concrete implementation of the
+ * the ratio of the splitting function to the overestimate, i.e.
+ * \f$P(z,t)/P_{\rm over}(z)\f$.
+ * @param z The energy fraction.
+ * @param t The scale.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param mass Whether or not to include the mass dependent terms
+ * @param rho The spin density matrix
+ */
+ virtual double ratioP(const double z, const Energy2 t, const IdList & ids,
+ const bool mass, const RhoDMatrix & rho) const;
+
+ /**
+ * The concrete implementation of the indefinite integral of the
+ * overestimated splitting function, \f$P_{\rm over}\f$.
+ * @param z The energy fraction.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param PDFfactor Which additional factor to include for the PDF
+ * 0 is no additional factor,
+ * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
+ */
+ virtual double integOverP(const double z, const IdList & ids,
+ unsigned int PDFfactor=0) const;
+
+ /**
+ * The concrete implementation of the inverse of the indefinite integral.
+ * @param r Value of the splitting function to be inverted
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param PDFfactor Which additional factor to include for the PDF
+ * 0 is no additional factor,
+ * 1 is \f$1/z\f$, 2 is \f$1/(1-z)\f$ and 3 is \f$1/z/(1-z)\f$
+ */
+ virtual double invIntegOverP(const double r, const IdList & ids,
+ unsigned int PDFfactor=0) const;
+ //@}
+
+ /**
+ * Method to calculate the azimuthal angle for forward evolution
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ * @return The weight
+ */
+ virtual vector<pair<int,Complex> >
+ generatePhiForward(const double z, const Energy2 t, const IdList & ids,
+ const RhoDMatrix &);
+
+ /**
+ * Method to calculate the azimuthal angle for backward evolution
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ * @return The weight
+ */
+ virtual vector<pair<int,Complex> >
+ generatePhiBackward(const double z, const Energy2 t, const IdList & ids,
+ const RhoDMatrix &);
+
+ /**
+ * Calculate the matrix element for the splitting
+ * @param z The energy fraction
+ * @param t The scale \f$t=2p_j\cdot p_k\f$.
+ * @param ids The PDG codes for the particles in the splitting.
+ * @param The azimuthal angle, \f$\phi\f$.
+ */
+ virtual DecayMEPtr matrixElement(const double z, const Energy2 t,
+ const IdList & ids, const double phi, bool timeLike);
+
+public:
+
+ /**
+ * The standard Init function used to initialize the interfaces.
+ * Called exactly once for each class by the class description system
+ * before the main function starts or
+ * when this class is dynamically loaded.
+ */
+ static void Init();
+
+protected:
+
+ /** @name Clone Methods. */
+ //@{
+ /**
+ * Make a simple clone of this object.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr clone() const {return new_ptr(*this);}
+
+ /** Make a clone of this object, possibly modifying the cloned object
+ * to make it sane.
+ * @return a pointer to the new object.
+ */
+ virtual IBPtr fullclone() const {return new_ptr(*this);}
+ //@}
+
+private:
+
+ /**
+ * The assignment operator is private and must never be called.
+ * In fact, it should not even be implemented.
+ */
+ OneOneOneDarkSplitFn & operator=(const OneOneOneDarkSplitFn &) = delete;
+
+};
+
+}
+
+#endif /* HERWIG_OneOneOneDarkSplitFn_H */
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,273 +1,275 @@
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.71])
AC_INIT([Herwig],[devel],[herwig@projects.hepforge.org],[Herwig])
AC_CONFIG_SRCDIR([Utilities/HerwigStrategy.cc])
AC_CONFIG_AUX_DIR([Config])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([Config/config.h])
dnl AC_PRESERVE_HELP_ORDER
AC_CANONICAL_HOST
dnl === disable debug symbols by default =====
if test "x$CXXFLAGS" = "x"; then
CXXFLAGS="-O2 -DBOOST_UBLAS_NDEBUG -Wno-deprecated-declarations -Wno-deprecated-copy"
fi
if test "x$CFLAGS" = "x"; then
CFLAGS=-O2
fi
AC_LANG([C++])
AM_INIT_AUTOMAKE([1.11 subdir-objects gnu dist-bzip2 no-dist-gzip -Wall -Wno-portability])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
dnl Checks for C++ compiler. Handle C++11 flags.
AC_PROG_CXX
AX_CXX_COMPILE_STDCXX([11],[noext],[mandatory])
dnl check for POSIX
AC_CHECK_HEADER([unistd.h],[],
[AC_MSG_ERROR([Herwig needs "unistd.h". Non-POSIX systems are not supported.])])
AC_CHECK_HEADER([sys/stat.h],[],
[AC_MSG_ERROR([Herwig needs "sys/stat.h". Non-POSIX systems are not supported.])])
dnl Checks for programs.
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_LN_S
dnl modified search order
AC_PROG_FC([gfortran g95 g77])
dnl xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn xlf90 f90 pgf90 pghpf epcf90 xlf f77 frt pgf77 cf77 fort77 fl32 af77])
AC_LANG_PUSH([Fortran])
AC_MSG_CHECKING([if the Fortran compiler ($FC) works])
AC_COMPILE_IFELSE(
AC_LANG_PROGRAM([],[ print *[,]"Hello"]),
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
AC_MSG_ERROR([A Fortran compiler is required to build Herwig.])
]
)
AC_LANG_POP([Fortran])
AC_FC_WRAPPERS
LT_PREREQ([2.2.6])
LT_INIT([disable-static dlopen pic-only])
dnl ####################################
dnl ####################################
dnl for Doc/fixinterfaces.pl
AC_PATH_PROG(PERL, perl)
dnl for Models/Feynrules
AM_PATH_PYTHON([2.6],, [:])
AM_CONDITIONAL([HAVE_PYTHON], [test "x$PYTHON" != "x:"])
HERWIG_CHECK_GSL
HERWIG_CHECK_THEPEG
BOOST_REQUIRE([1.41])
BOOST_FIND_HEADER([boost/numeric/ublas/io.hpp])
dnl Boost 1.64 is missing a required header to make these work
dnl we just assume they're there if io.hpp has been found OK above
dnl BOOST_FIND_HEADER([boost/numeric/ublas/matrix.hpp])
dnl BOOST_FIND_HEADER([boost/numeric/ublas/matrix_proxy.hpp])
dnl BOOST_FIND_HEADER([boost/numeric/ublas/matrix_sparse.hpp])
dnl BOOST_FIND_HEADER([boost/numeric/ublas/symmetric.hpp])
dnl BOOST_FIND_HEADER([boost/numeric/ublas/vector.hpp])
BOOST_FIND_HEADER([boost/operators.hpp])
BOOST_TEST()
HERWIG_CHECK_VBFNLO
HERWIG_CHECK_NJET
HERWIG_CHECK_GOSAM
HERWIG_CHECK_GOSAM_CONTRIB
HERWIG_CHECK_OPENLOOPS
HERWIG_CHECK_MADGRAPH
HERWIG_CHECK_EVTGEN
HERWIG_CHECK_PYTHIA
HERWIG_COMPILERFLAGS
HERWIG_LOOPTOOLS
FASTJET_CHECK_FASTJET
HERWIG_ENABLE_MODELS
SHARED_FLAG=-shared
AM_CONDITIONAL(NEED_APPLE_FIXES,
[test "xx${host/darwin/foundit}xx" != "xx${host}xx"])
if test "xx${host/darwin/foundit}xx" != "xx${host}xx"; then
APPLE_DSO_FLAGS=-Wl,-undefined,dynamic_lookup
SHARED_FLAG=-bundle
fi
AC_SUBST([APPLE_DSO_FLAGS])
AC_SUBST([SHARED_FLAG])
AC_SUBST([PYTHON])
AC_CONFIG_FILES([UnderlyingEvent/Makefile
Models/Makefile
Models/StandardModel/Makefile
Models/RSModel/Makefile
Models/General/Makefile
Models/Susy/Makefile
Models/Susy/NMSSM/Makefile
Models/Susy/RPV/Makefile
Models/UED/Makefile
Models/LH/Makefile
Models/DarkMatter/Makefile
Models/LHTP/Makefile
Models/Transplanckian/Makefile
Models/Leptoquarks/Makefile
Models/Zprime/Makefile
Models/TTbAsymm/Makefile
Models/Feynrules/Makefile
Models/Feynrules/python/Makefile-FR
Models/ADD/Makefile
Models/Sextet/Makefile
+ Models/HiddenValley/Makefile
Decay/Makefile
Decay/FormFactors/Makefile
Decay/Tau/Makefile
Decay/Baryon/Makefile
Decay/VectorMeson/Makefile
Decay/Perturbative/Makefile
Decay/HeavyMeson/Makefile
Decay/ScalarMeson/Makefile
Decay/Dalitz/Makefile
Decay/TensorMeson/Makefile
Decay/WeakCurrents/Makefile
Decay/Partonic/Makefile
Decay/General/Makefile
Decay/Radiation/Makefile
Decay/EvtGen/Makefile
Doc/refman.conf
Doc/refman.h
PDT/Makefile
PDF/Makefile
MatrixElement/Makefile
MatrixElement/General/Makefile
MatrixElement/Lepton/Makefile
MatrixElement/Hadron/Makefile
MatrixElement/DIS/Makefile
MatrixElement/Powheg/Makefile
MatrixElement/Gamma/Makefile
MatrixElement/Reweighters/Makefile
MatrixElement/Onium/Makefile
MatrixElement/Matchbox/Makefile
MatrixElement/Matchbox/Base/Makefile
MatrixElement/Matchbox/Utility/Makefile
MatrixElement/Matchbox/Phasespace/Makefile
MatrixElement/Matchbox/Dipoles/Makefile
MatrixElement/Matchbox/InsertionOperators/Makefile
MatrixElement/Matchbox/Matching/Makefile
MatrixElement/Matchbox/Cuts/Makefile
MatrixElement/Matchbox/Scales/Makefile
MatrixElement/Matchbox/ColorFull/Makefile
MatrixElement/Matchbox/CVolver/Makefile
MatrixElement/Matchbox/Builtin/Makefile
MatrixElement/Matchbox/Builtin/Amplitudes/Makefile
MatrixElement/Matchbox/Tests/Makefile
MatrixElement/Matchbox/External/Makefile
MatrixElement/Matchbox/External/BLHAGeneric/Makefile
MatrixElement/Matchbox/External/VBFNLO/Makefile
MatrixElement/Matchbox/External/NJet/Makefile
MatrixElement/Matchbox/External/GoSam/Makefile
MatrixElement/Matchbox/External/OpenLoops/Makefile
MatrixElement/Matchbox/External/MadGraph/Makefile
MatrixElement/Matchbox/External/MadGraph/mg2herwig
MatrixElement/Matchbox/External/GoSam/gosam2herwig
MatrixElement/FxFx/Makefile
Sampling/Makefile
Sampling/CellGrids/Makefile
Shower/Makefile
Shower/QTilde/Makefile
Shower/QTilde/Matching/Makefile
Shower/QTilde/SplittingFunctions/Onium/Makefile
+ Shower/QTilde/SplittingFunctions/Dark/Makefile
Shower/Dipole/Makefile
Shower/Dipole/Base/Makefile
Shower/Dipole/Kernels/Makefile
Shower/Dipole/Kinematics/Makefile
Shower/Dipole/Utility/Makefile
Shower/Dipole/AlphaS/Makefile
Shower/Dipole/SpinCorrelations/Makefile
Utilities/Makefile
Utilities/XML/Makefile
Utilities/Statistics/Makefile
Hadronization/Makefile
lib/Makefile
include/Makefile
src/Makefile
src/defaults/Makefile
src/snippets/Makefile
src/Matchbox/Makefile
src/herwig-config
Doc/Makefile
Doc/HerwigDefaults.in
Looptools/Makefile
Analysis/Makefile
API/Makefile
src/Makefile-UserModules
src/defaults/Analysis.in
src/defaults/MatchboxDefaults.in
src/defaults/Decays.in
src/defaults/decayers.in
src/defaults/setup.gosam.in
src/Matchbox/LO-DefaultShower.in
src/Matchbox/LO-DipoleShower.in
src/Matchbox/MCatLO-DefaultShower.in
src/Matchbox/MCatLO-DipoleShower.in
src/Matchbox/LO-NoShower.in
src/Matchbox/MCatNLO-DefaultShower.in
src/Matchbox/MCatNLO-DipoleShower.in
src/Matchbox/NLO-NoShower.in
src/Matchbox/Powheg-DefaultShower.in
src/Matchbox/Powheg-DipoleShower.in
src/Merging/Makefile
Shower/Dipole/Merging/Makefile
src/defaults/MatchboxMergingDefaults.in
Contrib/Makefile
Contrib/make_makefiles.sh
Tests/Makefile
Makefile])
AC_CONFIG_FILES([Tests/python/rivet_check ],[chmod +x Tests/python/rivet_check ])
AC_CONFIG_FILES([Tests/python/LowEnergy-EE.py ],[chmod +x Tests/python/LowEnergy-EE.py ])
AC_CONFIG_FILES([Tests/python/LowEnergy-Photon.py],[chmod +x Tests/python/LowEnergy-Photon.py])
AC_CONFIG_FILES([Tests/python/OniumSigma.py ],[chmod +x Tests/python/OniumSigma.py ])
AC_CONFIG_FILES([Tests/python/OniumSplitting.py ],[chmod +x Tests/python/OniumSplitting.py ])
AC_CONFIG_FILES([Tests/python/make_input_files.py],[chmod +x Tests/python/make_input_files.py])
AC_CONFIG_FILES([Tests/python/merge-DIS ],[chmod +x Tests/python/merge-DIS ])
AC_CONFIG_FILES([Tests/python/merge-EE ],[chmod +x Tests/python/merge-EE ])
AC_CONFIG_FILES([Tests/python/merge-EE-Gamma ],[chmod +x Tests/python/merge-EE-Gamma ])
AC_CONFIG_FILES([Tests/python/merge-Fixed ],[chmod +x Tests/python/merge-Fixed ])
AC_CONFIG_FILES([Tests/python/merge-GammaGamma ],[chmod +x Tests/python/merge-GammaGamma ])
AC_CONFIG_FILES([Tests/python/merge-LHC-EW ],[chmod +x Tests/python/merge-LHC-EW ])
AC_CONFIG_FILES([Tests/python/merge-LHC-Jets ],[chmod +x Tests/python/merge-LHC-Jets ])
AC_CONFIG_FILES([Tests/python/merge-LHC-Photon ],[chmod +x Tests/python/merge-LHC-Photon ])
AC_CONFIG_FILES([Tests/python/mergeLowEnergy.py ],[chmod +x Tests/python/mergeLowEnergy.py ])
AC_CONFIG_FILES([Tests/python/merge-TVT-EW ],[chmod +x Tests/python/merge-TVT-EW ])
AC_CONFIG_FILES([Tests/python/merge-TVT-Jets ],[chmod +x Tests/python/merge-TVT-Jets ])
AC_CONFIG_FILES([Tests/python/merge-TVT-Photon ],[chmod +x Tests/python/merge-TVT-Photon ])
AC_CONFIG_FILES([Tests/python/plot-EE ],[chmod +x Tests/python/plot-EE ])
AC_CONFIG_FILES([Tests/python/R.py ],[chmod +x Tests/python/R.py ])
AC_CONFIG_FILES([Sampling/herwig-mergegrids ],[chmod +x Sampling/herwig-mergegrids ])
AC_CONFIG_LINKS([Doc/BSMlibs.in:Doc/BSMlibs.in])
AC_CONFIG_FILES([Doc/fixinterfaces.pl],[chmod +x Doc/fixinterfaces.pl])
AC_CONFIG_HEADERS([PDF/SaSPhotonPDF.cc])
HERWIG_OVERVIEW
AC_CONFIG_COMMANDS([summary],[cat config.herwig])
AC_OUTPUT
diff --git a/lib/Makefile.am b/lib/Makefile.am
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1,50 +1,51 @@
pkglib_LTLIBRARIES = Herwig.la
Herwig_la_SOURCES =
Herwig_la_LIBTOOLFLAGS = --tag=CXX
Herwig_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 27:0:0
Herwig_la_LDFLAGS += $(THEPEGLDFLAGS) $(BOOST_SYSTEM_LDFLAGS) $(BOOST_FILESYSTEM_LDFLAGS) $(FCLIBS)
Herwig_la_LIBADD = \
$(top_builddir)/Hadronization/libHwHadronization.la \
$(top_builddir)/Models/libHwStandardModel.la \
+$(top_builddir)/Models/libHwHiddenValley.la \
$(top_builddir)/Decay/libHwDecay.la \
$(top_builddir)/Decay/libHwFormFactor.la \
$(top_builddir)/Decay/libHwDecRad.la \
$(top_builddir)/Utilities/libHwUtils.la \
$(top_builddir)/Models/libHwModelGenerator.la \
$(top_builddir)/Decay/General/libHwGeneralDecay.la \
$(top_builddir)/MatrixElement/General/libHwGeneralME.la \
$(top_builddir)/MatrixElement/libHwME.la \
$(top_builddir)/MatrixElement/Reweighters/libHwReweighters.la \
$(top_builddir)/MatrixElement/Matchbox/libHwMatchbox.la \
$(top_builddir)/Decay/libHwWeakCurrent.la \
$(top_builddir)/Looptools/libHwLooptools.la \
$(top_builddir)/Shower/libHwShower.la \
$(THEPEGLIB) -ldl
dist_noinst_SCRIPTS = fix-osx-path
POSTPROCESSING = done-all-links
if NEED_APPLE_FIXES
POSTPROCESSING += apple-fixes
endif
all-local: $(POSTPROCESSING)
done-all-links: Herwig.la
find $(top_builddir) \( -name '*.so.*' -or -name '*.so' \) \
-not -name 'lib*' -not -path '$(top_builddir)/lib/*' \
-not -path '$(top_builddir)/Tests/*' \
-not -path '$(top_builddir)/.hg/*' -exec $(LN_S) -f \{\} \;
$(LN_S) -f .libs/Herwig*so* .
echo "stamp" > $@
apple-fixes: fix-osx-path done-all-links
./$<
echo "stamp" > $@
clean-local:
rm -f *.so *.so.* done-all-links apple-fixes
diff --git a/src/defaults/Shower.in b/src/defaults/Shower.in
--- a/src/defaults/Shower.in
+++ b/src/defaults/Shower.in
@@ -1,477 +1,445 @@
# -*- ThePEG-repository -*-
############################################################
# Setup of default parton shower
#
# Useful switches for users are marked near the top of
# this file.
#
# Don't edit this file directly, but reset the switches
# in your own input files!
############################################################
library HwMPI.so
library HwShower.so
library HwMatching.so
mkdir /Herwig/Shower
cd /Herwig/Shower
create Herwig::QTildeShowerHandler ShowerHandler
newdef ShowerHandler:MPIHandler /Herwig/UnderlyingEvent/MPIHandler
newdef ShowerHandler:RemDecayer /Herwig/Partons/RemnantDecayer
# use LO PDFs for Shower, can be changed later
newdef ShowerHandler:PDFA /Herwig/Partons/ShowerLOPDF
newdef ShowerHandler:PDFB /Herwig/Partons/ShowerLOPDF
newdef ShowerHandler:PDFARemnant /Herwig/Partons/RemnantPDF
newdef ShowerHandler:PDFBRemnant /Herwig/Partons/RemnantPDF
#####################################
# initial setup, don't change these!
#####################################
create Herwig::SplittingGenerator SplittingGenerator
create Herwig::ShowerAlphaQCD AlphaQCDISR
create Herwig::ShowerAlphaQCD AlphaQCDFSR
create Herwig::ShowerAlphaQED AlphaQED
set AlphaQED:CouplingSource Thompson
create Herwig::ShowerAlphaQED AlphaEW
set AlphaEW:CouplingSource MZ
-create Herwig::HiddenValleyAlpha AlphaDARK
create Herwig::PartnerFinder PartnerFinder
newdef PartnerFinder:PartnerMethod 0
newdef PartnerFinder:ScaleChoice 0
create Herwig::KinematicsReconstructor KinematicsReconstructor
newdef KinematicsReconstructor:ReconstructionOption Colour3
newdef KinematicsReconstructor:InitialStateReconOption SofterFraction
newdef KinematicsReconstructor:InitialInitialBoostOption LongTransBoost
newdef KinematicsReconstructor:FinalFinalWeight Yes
newdef /Herwig/Partons/RemnantDecayer:AlphaS AlphaQCDISR
newdef /Herwig/Partons/RemnantDecayer:AlphaEM AlphaQED
newdef ShowerHandler:PartnerFinder PartnerFinder
newdef ShowerHandler:KinematicsReconstructor KinematicsReconstructor
newdef ShowerHandler:SplittingGenerator SplittingGenerator
newdef ShowerHandler:Interactions ALL
newdef ShowerHandler:SpinCorrelations Yes
newdef ShowerHandler:SoftCorrelations Singular
##################################################################
# Intrinsic pT
#
# Recommended:
# 1.9 GeV for Tevatron W/Z production.
# 2.1 GeV for LHC W/Z production at 10 TeV
# 2.2 GeV for LHC W/Z production at 14 TeV
#
# Set all parameters to 0 to disable
##################################################################
newdef ShowerHandler:IntrinsicPtGaussian 2.2*GeV
newdef ShowerHandler:IntrinsicPtBeta 0
newdef ShowerHandler:IntrinsicPtGamma 0*GeV
newdef ShowerHandler:IntrinsicPtIptmax 0*GeV
#############################################################
# Set up truncated shower handler.
#############################################################
create Herwig::PowhegShowerHandler PowhegShowerHandler
set PowhegShowerHandler:MPIHandler /Herwig/UnderlyingEvent/MPIHandler
set PowhegShowerHandler:RemDecayer /Herwig/Partons/RemnantDecayer
newdef PowhegShowerHandler:PDFA /Herwig/Partons/ShowerLOPDF
newdef PowhegShowerHandler:PDFB /Herwig/Partons/ShowerLOPDF
newdef PowhegShowerHandler:PDFARemnant /Herwig/Partons/RemnantPDF
newdef PowhegShowerHandler:PDFBRemnant /Herwig/Partons/RemnantPDF
newdef PowhegShowerHandler:MPIHandler /Herwig/UnderlyingEvent/MPIHandler
newdef PowhegShowerHandler:RemDecayer /Herwig/Partons/RemnantDecayer
newdef PowhegShowerHandler:PDFA /Herwig/Partons/ShowerLOPDF
newdef PowhegShowerHandler:PDFB /Herwig/Partons/ShowerLOPDF
newdef PowhegShowerHandler:PDFARemnant /Herwig/Partons/RemnantPDF
newdef PowhegShowerHandler:PDFBRemnant /Herwig/Partons/RemnantPDF
newdef PowhegShowerHandler:PartnerFinder PartnerFinder
newdef PowhegShowerHandler:KinematicsReconstructor KinematicsReconstructor
newdef PowhegShowerHandler:SplittingGenerator SplittingGenerator
newdef PowhegShowerHandler:Interactions ALL
newdef PowhegShowerHandler:SpinCorrelations Yes
newdef PowhegShowerHandler:SoftCorrelations Singular
newdef PowhegShowerHandler:IntrinsicPtGaussian 2.2*GeV
newdef PowhegShowerHandler:IntrinsicPtBeta 0
newdef PowhegShowerHandler:IntrinsicPtGamma 0*GeV
newdef PowhegShowerHandler:IntrinsicPtIptmax 0*GeV
newdef PowhegShowerHandler:EvolutionScheme DotProduct
#############################################################
# End of interesting user servicable section.
#
# Anything that follows below should only be touched if you
# know what you're doing.
#
# Really.
#############################################################
#
# a few default values
newdef ShowerHandler:MECorrMode 1
newdef ShowerHandler:EvolutionScheme DotProduct
newdef AlphaQCDISR:ScaleFactor 1.0
newdef AlphaQCDISR:NPAlphaS 2
newdef AlphaQCDISR:Qmin 0.935
newdef AlphaQCDISR:NumberOfLoops 2
newdef AlphaQCDISR:AlphaIn 0.1185
newdef AlphaQCDFSR:ScaleFactor 1.0
newdef AlphaQCDFSR:NPAlphaS 2
newdef AlphaQCDFSR:Qmin 0.935
newdef AlphaQCDFSR:NumberOfLoops 2
newdef AlphaQCDFSR:AlphaIn 0.102337
-newdef AlphaDARK:ScaleFactor 1.0
-newdef AlphaDARK:NPAlphaS 2
-newdef AlphaDARK:Qmin 0.935
-newdef AlphaDARK:NumberOfLoops 2
#
#
#
# Lets set up all the splittings and Sudakovs
# cut-off
create Herwig::PTCutOff PTCutOff
newdef PTCutOff:pTmin 0.654714*GeV
# q -> q g
create Herwig::HalfHalfOneSplitFn QtoQGSudakov
newdef QtoQGSudakov:InteractionType QCD
newdef QtoQGSudakov:Alpha AlphaQCDISR
newdef QtoQGSudakov:Cutoff PTCutOff
newdef QtoQGSudakov:ColourStructure TripletTripletOctet
newdef QtoQGSudakov:AngularOrdered Yes
newdef QtoQGSudakov:StrictAO Yes
newdef QtoQGSudakov:PDFmax 1.9
-create Herwig::HalfHalfOneDarkSplitFn QtoQGDARKSudakov
-newdef QtoQGDARKSudakov:InteractionType DARK
-newdef QtoQGDARKSudakov:Alpha AlphaDARK
-newdef QtoQGDARKSudakov:Cutoff PTCutOff
-newdef QtoQGDARKSudakov:ColourStructure TripletTripletOctet
-newdef QtoQGDARKSudakov:AngularOrdered Yes
-newdef QtoQGDARKSudakov:StrictAO Yes
-newdef QtoQGDARKSudakov:PDFmax 1.9
-
# q -> q gamma
create Herwig::HalfHalfOneSplitFn QtoQGammaSudakov
newdef QtoQGammaSudakov:ColourStructure ChargedChargedNeutral
newdef QtoQGammaSudakov:AngularOrdered Yes
newdef QtoQGammaSudakov:StrictAO Yes
newdef QtoQGammaSudakov:InteractionType QED
newdef QtoQGammaSudakov:Alpha AlphaQED
newdef QtoQGammaSudakov:Cutoff PTCutOff
newdef QtoQGammaSudakov:PDFmax 1.9
# l -> l gamma
cp QtoQGammaSudakov LtoLGammaSudakov
cp PTCutOff LtoLGammaPTCutOff
# Technical parameter to stop evolution.
newdef LtoLGammaPTCutOff:pTmin 0.000001
newdef LtoLGammaSudakov:Cutoff LtoLGammaPTCutOff
# g -> g g
create Herwig::OneOneOneSplitFn GtoGGSudakov
newdef GtoGGSudakov:Alpha AlphaQCDISR
newdef GtoGGSudakov:Cutoff PTCutOff
newdef GtoGGSudakov:PDFmax 2.0
newdef GtoGGSudakov:ColourStructure OctetOctetOctet
newdef GtoGGSudakov:AngularOrdered Yes
newdef GtoGGSudakov:StrictAO Yes
newdef GtoGGSudakov:InteractionType QCD
# W -> W gamma
create Herwig::OneOneOneMassiveSplitFn WtoWGammaSudakov
newdef WtoWGammaSudakov:ColourStructure ChargedChargedNeutral
newdef WtoWGammaSudakov:Cutoff PTCutOff
newdef WtoWGammaSudakov:AngularOrdered Yes
newdef WtoWGammaSudakov:StrictAO Yes
newdef WtoWGammaSudakov:InteractionType QED
newdef WtoWGammaSudakov:Alpha AlphaQED
# g to q qbar
create Herwig::OneHalfHalfSplitFn GtoQQbarSudakov
newdef GtoQQbarSudakov:Alpha AlphaQCDISR
newdef GtoQQbarSudakov:Cutoff PTCutOff
newdef GtoQQbarSudakov:ColourStructure OctetTripletTriplet
newdef GtoQQbarSudakov:AngularOrdered Yes
newdef GtoQQbarSudakov:StrictAO Yes
newdef GtoQQbarSudakov:InteractionType QCD
newdef GtoQQbarSudakov:PDFmax 120.0
# g -> b bbar (separate for efficenicy in ISR)
cp GtoQQbarSudakov GtobbbarSudakov
newdef GtobbbarSudakov:PDFmax 40000.0
# g -> c cbar (separate for efficenicy in ISR)
cp GtoQQbarSudakov GtoccbarSudakov
newdef GtoccbarSudakov:PDFmax 2000.0
# gamma -> q qbar
create Herwig::OneHalfHalfSplitFn GammatoQQbarSudakov
newdef GammatoQQbarSudakov:Alpha AlphaQED
newdef GammatoQQbarSudakov:Cutoff PTCutOff
newdef GammatoQQbarSudakov:ColourStructure NeutralChargedCharged
newdef GammatoQQbarSudakov:AngularOrdered Yes
newdef GammatoQQbarSudakov:StrictAO Yes
newdef GammatoQQbarSudakov:InteractionType QED
newdef GammatoQQbarSudakov:PDFmax 10000.0
# q -> g q
create Herwig::HalfOneHalfSplitFn QtoGQSudakov
newdef QtoGQSudakov:Alpha AlphaQCDISR
newdef QtoGQSudakov:Cutoff PTCutOff
newdef QtoGQSudakov:ColourStructure TripletOctetTriplet
newdef QtoGQSudakov:AngularOrdered Yes
newdef QtoGQSudakov:StrictAO Yes
newdef QtoGQSudakov:InteractionType QCD
# u -> g u (for efficiency)
cp QtoGQSudakov utoGuSudakov
newdef utoGuSudakov:PDFFactor OverOneMinusZ
newdef utoGuSudakov:PDFmax 5.0
# d -> g d (for efficiency)
cp QtoGQSudakov dtoGdSudakov
newdef dtoGdSudakov:PDFFactor OverOneMinusZ
# q -> gamma q
create Herwig::HalfOneHalfSplitFn QtoGammaQSudakov
newdef QtoGammaQSudakov:Alpha AlphaQED
newdef QtoGammaQSudakov:Cutoff PTCutOff
newdef QtoGammaQSudakov:ColourStructure ChargedNeutralCharged
newdef QtoGammaQSudakov:AngularOrdered Yes
newdef QtoGammaQSudakov:StrictAO Yes
newdef QtoGammaQSudakov:InteractionType QED
create Herwig::HalfHalfOneEWSplitFn QtoQWZSudakov
newdef QtoQWZSudakov:InteractionType EW
newdef QtoQWZSudakov:ColourStructure EW
newdef QtoQWZSudakov:Alpha AlphaEW
newdef QtoQWZSudakov:PDFmax 1.9
newdef QtoQWZSudakov:Cutoff PTCutOff
create Herwig::HalfHalfOneEWSplitFn LtoLWZSudakov
newdef LtoLWZSudakov:InteractionType EW
newdef LtoLWZSudakov:ColourStructure EW
newdef LtoLWZSudakov:Alpha AlphaEW
newdef LtoLWZSudakov:PDFmax 1.9
newdef LtoLWZSudakov:Cutoff PTCutOff
create Herwig::HalfHalfZeroEWSplitFn QtoQHSudakov
newdef QtoQHSudakov:InteractionType EW
newdef QtoQHSudakov:ColourStructure EW
newdef QtoQHSudakov:Alpha AlphaEW
newdef QtoQHSudakov:PDFmax 1.9
newdef QtoQHSudakov:Cutoff PTCutOff
cp QtoQHSudakov LtoLHSudakov
create Herwig::OneOneOneEWSplitFn VtoVVSudakov
newdef VtoVVSudakov:InteractionType EW
newdef VtoVVSudakov:ColourStructure EW
newdef VtoVVSudakov:Alpha AlphaQED
newdef VtoVVSudakov:Cutoff PTCutOff
-create Herwig::OneOneOneDarkSplitFn GtoGGDARKSudakov
-newdef GtoGGDARKSudakov:InteractionType DARK
-newdef GtoGGDARKSudakov:ColourStructure OctetOctetOctet
-newdef GtoGGDARKSudakov:AngularOrdered Yes
-newdef GtoGGDARKSudakov:Alpha AlphaDARK
-newdef GtoGGDARKSudakov:StrictAO Yes
-newdef GtoGGDARKSudakov:PDFmax 2.0
-newdef GtoGGDARKSudakov:Cutoff PTCutOff
-
create Herwig::OneOneOneQEDSplitFn GammatoWWSudakov
newdef GammatoWWSudakov:InteractionType QED
newdef GammatoWWSudakov:ColourStructure NeutralChargedCharged
newdef GammatoWWSudakov:Alpha AlphaEW
newdef GammatoWWSudakov:PDFmax 1.9
newdef GammatoWWSudakov:Cutoff PTCutOff
create Herwig::OneOneZeroEWSplitFn VtoVHSudakov
newdef VtoVHSudakov:InteractionType EW
newdef VtoVHSudakov:ColourStructure EW
newdef VtoVHSudakov:Alpha AlphaEW
newdef VtoVHSudakov:PDFmax 1.9
newdef VtoVHSudakov:Cutoff PTCutOff
-create Herwig::OneHalfHalfDarkSplitFn GtoQQbarDARKSudakov
-newdef GtoQQbarDARKSudakov:InteractionType DARK
-newdef GtoQQbarDARKSudakov:ColourStructure OctetTripletTriplet
-newdef GtoQQbarDARKSudakov:AngularOrdered Yes
-newdef GtoQQbarDARKSudakov:StrictAO Yes
-newdef GtoQQbarDARKSudakov:Alpha AlphaDARK
-newdef GtoQQbarDARKSudakov:PDFmax 120.0
-newdef GtoQQbarDARKSudakov:Cutoff PTCutOff
-
create Herwig::ZeroZeroZeroEWSplitFn HtoHHSudakov
newdef HtoHHSudakov:InteractionType EW
newdef HtoHHSudakov:ColourStructure EW
newdef HtoHHSudakov:Alpha AlphaEW
newdef HtoHHSudakov:PDFmax 1.9
newdef HtoHHSudakov:Cutoff PTCutOff
#Use a different Sudakov for FS QCD splittings in order to use a different value of alphaS
cp QtoQGSudakov QtoQGSudakovFSR
cp GtoGGSudakov GtoGGSudakovFSR
cp GtoQQbarSudakov GtoQQbarSudakovFSR
cp GtobbbarSudakov GtobbbarSudakovFSR
cp GtobbbarSudakov GtoccbarSudakovFSR
set QtoQGSudakovFSR:Alpha AlphaQCDFSR
set GtoGGSudakovFSR:Alpha AlphaQCDFSR
set GtoQQbarSudakovFSR:Alpha AlphaQCDFSR
set GtobbbarSudakovFSR:Alpha AlphaQCDFSR
set GtoccbarSudakovFSR:Alpha AlphaQCDFSR
#
# Now add the final splittings
#
do SplittingGenerator:AddFinalSplitting u->u,g; QtoQGSudakovFSR
do SplittingGenerator:AddFinalSplitting d->d,g; QtoQGSudakovFSR
do SplittingGenerator:AddFinalSplitting s->s,g; QtoQGSudakovFSR
do SplittingGenerator:AddFinalSplitting c->c,g; QtoQGSudakovFSR
do SplittingGenerator:AddFinalSplitting b->b,g; QtoQGSudakovFSR
do SplittingGenerator:AddFinalSplitting t->t,g; QtoQGSudakovFSR
#
do SplittingGenerator:AddFinalSplitting g->g,g; GtoGGSudakovFSR
#
do SplittingGenerator:AddFinalSplitting g->u,ubar; GtoQQbarSudakovFSR
do SplittingGenerator:AddFinalSplitting g->d,dbar; GtoQQbarSudakovFSR
do SplittingGenerator:AddFinalSplitting g->s,sbar; GtoQQbarSudakovFSR
do SplittingGenerator:AddFinalSplitting g->c,cbar; GtoccbarSudakovFSR
do SplittingGenerator:AddFinalSplitting g->b,bbar; GtobbbarSudakovFSR
do SplittingGenerator:AddFinalSplitting g->t,tbar; GtoQQbarSudakovFSR
#
do SplittingGenerator:AddFinalSplitting gamma->u,ubar; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->d,dbar; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->s,sbar; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->c,cbar; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->b,bbar; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->t,tbar; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->e-,e+; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->mu-,mu+; GammatoQQbarSudakov
do SplittingGenerator:AddFinalSplitting gamma->tau-,tau+; GammatoQQbarSudakov
#
do SplittingGenerator:AddFinalSplitting u->u,gamma; QtoQGammaSudakov
do SplittingGenerator:AddFinalSplitting d->d,gamma; QtoQGammaSudakov
do SplittingGenerator:AddFinalSplitting s->s,gamma; QtoQGammaSudakov
do SplittingGenerator:AddFinalSplitting c->c,gamma; QtoQGammaSudakov
do SplittingGenerator:AddFinalSplitting b->b,gamma; QtoQGammaSudakov
do SplittingGenerator:AddFinalSplitting t->t,gamma; QtoQGammaSudakov
do SplittingGenerator:AddFinalSplitting e-->e-,gamma; LtoLGammaSudakov
do SplittingGenerator:AddFinalSplitting mu-->mu-,gamma; LtoLGammaSudakov
do SplittingGenerator:AddFinalSplitting tau-->tau-,gamma; LtoLGammaSudakov
do SplittingGenerator:AddFinalSplitting W+->W+,gamma; WtoWGammaSudakov
#
# Now lets add the initial splittings. Remember the form a->b,c; means
# that the current particle b is given and we backward branch to new
# particle a which is initial state and new particle c which is final state
#
do SplittingGenerator:AddInitialSplitting u->u,g; QtoQGSudakov
do SplittingGenerator:AddInitialSplitting d->d,g; QtoQGSudakov
do SplittingGenerator:AddInitialSplitting s->s,g; QtoQGSudakov
do SplittingGenerator:AddInitialSplitting c->c,g; QtoQGSudakov
do SplittingGenerator:AddInitialSplitting b->b,g; QtoQGSudakov
do SplittingGenerator:AddInitialSplitting u->u,gamma; QtoQGammaSudakov
do SplittingGenerator:AddInitialSplitting d->d,gamma; QtoQGammaSudakov
do SplittingGenerator:AddInitialSplitting s->s,gamma; QtoQGammaSudakov
do SplittingGenerator:AddInitialSplitting c->c,gamma; QtoQGammaSudakov
do SplittingGenerator:AddInitialSplitting b->b,gamma; QtoQGammaSudakov
do SplittingGenerator:AddInitialSplitting t->t,gamma; QtoQGammaSudakov
do SplittingGenerator:AddInitialSplitting g->g,g; GtoGGSudakov
#
do SplittingGenerator:AddInitialSplitting g->d,dbar; GtoQQbarSudakov
do SplittingGenerator:AddInitialSplitting g->u,ubar; GtoQQbarSudakov
do SplittingGenerator:AddInitialSplitting g->s,sbar; GtoQQbarSudakov
do SplittingGenerator:AddInitialSplitting g->c,cbar; GtoccbarSudakov
do SplittingGenerator:AddInitialSplitting g->b,bbar; GtobbbarSudakov
#
#do SplittingGenerator:AddInitialSplitting gamma->d,dbar; GammatoQQbarSudakov
#do SplittingGenerator:AddInitialSplitting gamma->u,ubar; GammatoQQbarSudakov
#do SplittingGenerator:AddInitialSplitting gamma->s,sbar; GammatoQQbarSudakov
#do SplittingGenerator:AddInitialSplitting gamma->c,cbar; GammatoQQbarSudakov
#do SplittingGenerator:AddInitialSplitting gamma->b,bbar; GammatoQQbarSudakov
do SplittingGenerator:AddInitialSplitting gamma->e-,e+; GammatoQQbarSudakov
do SplittingGenerator:AddInitialSplitting gamma->mu-,mu+; GammatoQQbarSudakov
do SplittingGenerator:AddInitialSplitting gamma->tau-,tau+; GammatoQQbarSudakov
#
do SplittingGenerator:AddInitialSplitting d->g,d; dtoGdSudakov
do SplittingGenerator:AddInitialSplitting u->g,u; utoGuSudakov
do SplittingGenerator:AddInitialSplitting s->g,s; QtoGQSudakov
do SplittingGenerator:AddInitialSplitting c->g,c; QtoGQSudakov
do SplittingGenerator:AddInitialSplitting b->g,b; QtoGQSudakov
do SplittingGenerator:AddInitialSplitting dbar->g,dbar; dtoGdSudakov
do SplittingGenerator:AddInitialSplitting ubar->g,ubar; utoGuSudakov
do SplittingGenerator:AddInitialSplitting sbar->g,sbar; QtoGQSudakov
do SplittingGenerator:AddInitialSplitting cbar->g,cbar; QtoGQSudakov
do SplittingGenerator:AddInitialSplitting bbar->g,bbar; QtoGQSudakov
#
do SplittingGenerator:AddInitialSplitting d->gamma,d; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting u->gamma,u; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting s->gamma,s; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting c->gamma,c; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting b->gamma,b; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting dbar->gamma,dbar; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting ubar->gamma,ubar; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting sbar->gamma,sbar; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting cbar->gamma,cbar; QtoGammaQSudakov
do SplittingGenerator:AddInitialSplitting bbar->gamma,bbar; QtoGammaQSudakov
#
# Electroweak
#
do SplittingGenerator:AddFinalSplitting u->u,Z0; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting d->d,Z0; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting s->s,Z0; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting c->c,Z0; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting b->b,Z0; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting t->t,Z0; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting u->u,Z0; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting d->d,Z0; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting s->s,Z0; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting c->c,Z0; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting b->b,Z0; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting t->t,Z0; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting u->d,W+; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting c->s,W+; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting d->u,W-; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting s->c,W-; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting u->d,W+; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting c->s,W+; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting d->u,W-; QtoQWZSudakov
do SplittingGenerator:AddInitialSplitting s->c,W-; QtoQWZSudakov
do SplittingGenerator:AddFinalSplitting c->c,h0; QtoQHSudakov
do SplittingGenerator:AddFinalSplitting b->b,h0; QtoQHSudakov
do SplittingGenerator:AddFinalSplitting t->t,h0; QtoQHSudakov
do SplittingGenerator:AddInitialSplitting c->c,h0; QtoQHSudakov
do SplittingGenerator:AddInitialSplitting b->b,h0; QtoQHSudakov
do SplittingGenerator:AddInitialSplitting t->t,h0; QtoQHSudakov
do SplittingGenerator:AddFinalSplitting gamma->W+,W-; GammatoWWSudakov
do SplittingGenerator:AddFinalSplitting Z0->W+,W-; VtoVVSudakov
do SplittingGenerator:AddFinalSplitting W+->W+,gamma; VtoVVSudakov
do SplittingGenerator:AddFinalSplitting W+->W+,Z0; VtoVVSudakov
do SplittingGenerator:AddFinalSplitting W+->W+,h0; VtoVHSudakov
do SplittingGenerator:AddFinalSplitting Z0->Z0,h0; VtoVHSudakov
do SplittingGenerator:AddFinalSplitting h0->h0,h0; HtoHHSudakov
#
# Electroweak l -> l V
#
#do SplittingGenerator:AddFinalSplitting e-->e-,Z0; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting mu-->mu-,Z0; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting tau-->tau-,Z0; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting nu_e->nu_e,Z0; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting nu_mu->nu_mu,Z0; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting nu_tau->nu_tau,Z0; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting e-->nu_e,W-; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting mu-->nu_mu,W-; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting tau-->nu_tau,W-; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting nu_e->e-,W+; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting nu_mu->mu-,W+; LtoLWZSudakov
#do SplittingGenerator:AddFinalSplitting nu_tau->tau-,W+; LtoLWZSudakov

File Metadata

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

Event Timeline