Page MenuHomeHEPForge

No OneTemporary

diff --git a/.hgtags b/.hgtags
new file mode 100644
--- /dev/null
+++ b/.hgtags
@@ -0,0 +1,1 @@
+6c1be2daaa215d44a15d33c701f2e17750c3a942 release 1.1
diff --git a/Amplitudes/AmplitudeBase.cc.in b/Amplitudes/AmplitudeBase.cc.in
--- a/Amplitudes/AmplitudeBase.cc.in
+++ b/Amplitudes/AmplitudeBase.cc.in
@@ -1,814 +1,814 @@
// -*- C++ -*-
//
// AmplitudeBase.cc is a part of HJets
// Copyright (C) 2011-2012
// Ken Arnold, Francisco Campanario, Terrance Figy, Simon Platzer and Malin Sjodahl
//
// HJets 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 AmplitudeBase class.
//
#include "AmplitudeBase.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/Repository.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
using namespace HJets;
AmplitudeBase::AmplitudeBase()
: MatchboxAmplitude(), complexMassScheme(true),
mu2Factor(1.0),
theKappaZ(1.0), theKappaW(1.0),
theStableEpsilon(1e-9) {}
AmplitudeBase::~AmplitudeBase() {}
bool AmplitudeBase::canHandle(const PDVector& proc) const {
int n = proc.size();
if ( n != nPartons() + 1 ) {
return false;
}
return HJetsProcessInfo::canHandle(proc,SM());
}
map<cPDVector,vector<AmplitudeInfo> >& AmplitudeBase::amplitudeInfos() {
static map<cPDVector,vector<AmplitudeInfo> > theAmplitudeInfos;
return theAmplitudeInfos;
}
map<cPDVector,map<int, pair<int, double> > >& AmplitudeBase::virtualInfos() {
static map<cPDVector,map<int, pair<int, double> > > theVirtualInfos;
return theVirtualInfos;
}
struct cfless {
inline bool operator() (const vector<size_t>& a,
const vector<size_t>& b) const {
if ( a.size() > b.size() )
return true;
return less<vector<size_t> >()(a,b);
}
};
size_t toColorFull(const set<vector<size_t>,cfless>& cs) {
ostringstream cfids;
cfids << "[";
for ( set<vector<size_t>,cfless>::const_iterator l = cs.begin();
l != cs.end(); ++l ) {
cfids << "{";
for ( vector<size_t>::const_iterator i = l->begin(); i != l->end(); ++i ) {
cfids << *i;
if ( i != l->end()-1 )
cfids << ",";
}
cfids << "}";
}
cfids << "]";
string cfid = cfids.str();
if ( cfid == "[{1,2}{3,4}]" ) return 0;
if ( cfid == "[{1,4}{3,2}]" ) return 1;
if ( cfid == "[{1,5,2}{3,4}]" ) return 0;
if ( cfid == "[{1,5,4}{3,2}]" ) return 1;
if ( cfid == "[{3,5,2}{1,4}]" ) return 2;
if ( cfid == "[{3,5,4}{1,2}]" ) return 3;
if ( cfid == "[{1,5,6,2}{3,4}]" ) return 0;
if ( cfid == "[{1,5,6,4}{3,2}]" ) return 1;
if ( cfid == "[{1,6,5,2}{3,4}]" ) return 2;
if ( cfid == "[{1,6,5,4}{3,2}]" ) return 3;
if ( cfid == "[{3,5,6,2}{1,4}]" ) return 4;
if ( cfid == "[{3,5,6,4}{1,2}]" ) return 5;
if ( cfid == "[{3,6,5,2}{1,4}]" ) return 6;
if ( cfid == "[{3,6,5,4}{1,2}]" ) return 7;
if ( cfid == "[{1,5,2}{3,6,4}]" ) return 8;
if ( cfid == "[{1,5,4}{3,6,2}]" ) return 9;
if ( cfid == "[{1,6,2}{3,5,4}]" ) return 10;
if ( cfid == "[{1,6,4}{3,5,2}]" ) return 11;
if ( cfid == "[{1,2}{3,4}{5,6}]" ) return 0;
if ( cfid == "[{1,2}{3,6}{5,4}]" ) return 1;
if ( cfid == "[{1,4}{3,2}{5,6}]" ) return 2;
if ( cfid == "[{1,4}{3,6}{5,2}]" ) return 3;
if ( cfid == "[{1,6}{3,2}{5,4}]" ) return 4;
if ( cfid == "[{1,6}{3,4}{5,2}]" ) return 5;
assert(false);
return 0;
}
vector<AmplitudeInfo>& AmplitudeBase::amplitudeInfo() {
const cPDVector& proc = mePartonData();
map<cPDVector,vector<AmplitudeInfo> >::iterator i =
amplitudeInfos().find(proc);
if ( i != amplitudeInfos().end() )
return i->second;
#ifdef AMPVERBOSE
// --------------------------------------------------------------------------------
generator()->log() << "--------------------------------------------------------------------------------\n";
generator()->log() << "\n" << name() << "\n";
generator()->log() << "getting amplitudeInfo:\nfor subprocess: ";
for ( cPDVector::const_iterator p = mePartonData().begin();
p != mePartonData().end(); ++p ) {
generator()->log() << (**p).PDGName() << " ";
}
generator()->log() << "\ncrossed to: ";
size_t ampcount = 0;
for ( cPDVector::const_iterator p = amplitudePartonData().begin();
p != amplitudePartonData().end(); ++p, ++ampcount ) {
generator()->log() << ampcount << " : " << (**p).PDGName()
<< " [" << crossingMap()[ampcount] << "] ";
}
generator()->log() << "\n" << flush;
// generator()->log() << "using crossing sign = "
// << crossingSign() << "\n" << flush;
generator()->log() << "amplitude ids map to colour basis ids as:\n" << flush;
for ( map<size_t,size_t>::const_iterator c = amplitudeToColourMap().begin();
c != amplitudeToColourMap().end(); ++c ) {
generator()->log() << "[" << c->first << " -> " << (c->second + 1)
<< "] ";
}
generator()->log() << "\n" << flush;
// --------------------------------------------------------------------------------
#endif
amplitudeInfos()[proc] =
HJetsProcessInfo::getConfigurations(mePartonData(),crossingMap(),SM(),complexMassScheme,
kappaZ(),kappaW());
i = amplitudeInfos().find(proc);
map<size_t,size_t>& cmap = amplitudeToColourMap();
#ifdef AMPVERBOSE
// --------------------------------------------------------------------------------
generator()->log() << "generated amplitude info:\n\n" << flush;
// --------------------------------------------------------------------------------
#endif
for ( vector<AmplitudeInfo>::iterator k = i->second.begin();
k != i->second.end(); ++k ) {
#ifdef AMPVERBOSE
// --------------------------------------------------------------------------------
k->print(generator()->log());
// --------------------------------------------------------------------------------
#endif
map<set<vector<size_t>,cfless>,double> colourStructures;
if ( !k->qqbarEmitted ) {
vector<size_t> ijLine;
ijLine.push_back(cmap[k->ijLine.first]+1);
if ( k->ijLineEmissions.first > 0 )
ijLine.push_back(cmap[k->ijLineEmissions.first]+1);
if ( k->ijLineEmissions.second > 0 )
ijLine.push_back(cmap[k->ijLineEmissions.second]+1);
ijLine.push_back(cmap[k->ijLine.second]+1);
vector<size_t> klLine;
klLine.push_back(cmap[k->klLine.first]+1);
if ( k->klLineEmissions.first > 0 )
klLine.push_back(cmap[k->klLineEmissions.first]+1);
if ( k->klLineEmissions.second > 0 )
klLine.push_back(cmap[k->klLineEmissions.second]+1);
klLine.push_back(cmap[k->klLine.second]+1);
set<vector<size_t>,cfless> cStructure;
cStructure.insert(ijLine);
cStructure.insert(klLine);
colourStructures.insert(make_pair(cStructure,1.));
} else {
if ( k->ijLineEmissions.first > 0 ) {
vector<size_t> klLine;
klLine.push_back(cmap[k->klLine.first]+1);
klLine.push_back(cmap[k->klLine.second]+1);
vector<size_t> ijLineLeading1;
ijLineLeading1.push_back(cmap[k->ijLine.first]+1);
ijLineLeading1.push_back(cmap[k->ijLineEmissions.second]+1);
vector<size_t> ijLineLeading2;
ijLineLeading2.push_back(cmap[k->ijLineEmissions.first]+1);
ijLineLeading2.push_back(cmap[k->ijLine.second]+1);
vector<size_t> ijLineSubleading1;
ijLineSubleading1.push_back(cmap[k->ijLine.first]+1);
ijLineSubleading1.push_back(cmap[k->ijLine.second]+1);
vector<size_t> ijLineSubleading2;
ijLineSubleading2.push_back(cmap[k->ijLineEmissions.first]+1);
ijLineSubleading2.push_back(cmap[k->ijLineEmissions.second]+1);
set<vector<size_t>,cfless> cStructureLeading;
cStructureLeading.insert(klLine);
cStructureLeading.insert(ijLineLeading1);
cStructureLeading.insert(ijLineLeading2);
set<vector<size_t>,cfless> cStructureSubleading;
cStructureSubleading.insert(klLine);
cStructureSubleading.insert(ijLineSubleading1);
cStructureSubleading.insert(ijLineSubleading2);
colourStructures.insert(make_pair(cStructureLeading,0.5));
colourStructures.insert(make_pair(cStructureSubleading,-0.5/3.));
}
if ( k->klLineEmissions.first > 0 ) {
vector<size_t> ijLine;
ijLine.push_back(cmap[k->ijLine.first]+1);
ijLine.push_back(cmap[k->ijLine.second]+1);
vector<size_t> klLineLeading1;
klLineLeading1.push_back(cmap[k->klLine.first]+1);
klLineLeading1.push_back(cmap[k->klLineEmissions.second]+1);
vector<size_t> klLineLeading2;
klLineLeading2.push_back(cmap[k->klLineEmissions.first]+1);
klLineLeading2.push_back(cmap[k->klLine.second]+1);
vector<size_t> klLineSubleading1;
klLineSubleading1.push_back(cmap[k->klLine.first]+1);
klLineSubleading1.push_back(cmap[k->klLine.second]+1);
vector<size_t> klLineSubleading2;
klLineSubleading2.push_back(cmap[k->klLineEmissions.first]+1);
klLineSubleading2.push_back(cmap[k->klLineEmissions.second]+1);
set<vector<size_t>,cfless> cStructureLeading;
cStructureLeading.insert(ijLine);
cStructureLeading.insert(klLineLeading1);
cStructureLeading.insert(klLineLeading2);
set<vector<size_t>,cfless> cStructureSubleading;
cStructureSubleading.insert(ijLine);
cStructureSubleading.insert(klLineSubleading1);
cStructureSubleading.insert(klLineSubleading2);
colourStructures.insert(make_pair(cStructureLeading,0.5));
colourStructures.insert(make_pair(cStructureSubleading,-0.5/3.));
}
}
#ifdef AMPVERBOSE
// --------------------------------------------------------------------------------
generator()->log() << "with colour structures\n";
for ( map<set<vector<size_t>,cfless>,double>::const_iterator c = colourStructures.begin();
c != colourStructures.end(); ++c ) {
generator()->log() << "[";
for ( set<vector<size_t>,cfless>::const_iterator l = c->first.begin();
l != c->first.end(); ++l ) {
generator()->log() << "{";
for ( vector<size_t>::const_iterator i = l->begin(); i != l->end(); ++i ) {
generator()->log() << *i;
if ( i != l->end()-1 )
generator()->log() << ",";
}
generator()->log() << "}";
}
generator()->log() << "]";
generator()->log() << " x " << c->second << "\n";
}
generator()->log() << "\n" << flush;
// --------------------------------------------------------------------------------
#endif
for ( map<set<vector<size_t>,cfless>,double>::const_iterator c = colourStructures.begin();
c != colourStructures.end(); ++c ) {
k->colourTensors[toColorFull(c->first)] = c->second;
}
#ifdef AMPVERBOSE
// --------------------------------------------------------------------------------
generator()->log() << "mapped to colourfull indices as\n";
for ( map<size_t,double>::const_iterator c = k->colourTensors.begin();
c != k->colourTensors.end(); ++c ) {
generator()->log() << c->first << " x " << c->second
<< " / ";
}
generator()->log() << "\n" << flush;
// --------------------------------------------------------------------------------
#endif
}
#ifdef AMPVERBOSE
// --------------------------------------------------------------------------------
generator()->log() << "--------------------------------------------------------------------------------\n"
<< flush;
// --------------------------------------------------------------------------------
#endif
return i->second;
}
Complex AmplitudeBase::bosonFactor(const AmplitudeInfo& c) const {
Complex ijPropagator(-sqr(c.bosonMass/amplitudeScale()),
(c.bosonMass*c.bosonWidth)/sqr(amplitudeScale()));
Complex klPropagator = ijPropagator;
if ( c.ijLineEmissions.first < 0 && c.ijLineEmissions.second < 0 ) {
ijPropagator +=
invariant(c.ijLine.first,c.ijLine.second);
} else if ( c.ijLineEmissions.first > 0 && c.ijLineEmissions.second < 0 ) {
ijPropagator +=
invariant(c.ijLine.first,c.ijLine.second) +
invariant(c.ijLine.first,c.ijLineEmissions.first) +
invariant(c.ijLine.second,c.ijLineEmissions.first);
} else if ( c.ijLineEmissions.first > 0 && c.ijLineEmissions.second > 0 ) {
ijPropagator +=
invariant(c.ijLine.first,c.ijLine.second) +
invariant(c.ijLine.first,c.ijLineEmissions.first) +
invariant(c.ijLine.second,c.ijLineEmissions.first) +
invariant(c.ijLine.first,c.ijLineEmissions.second) +
invariant(c.ijLine.second,c.ijLineEmissions.second) +
invariant(c.ijLineEmissions.first,c.ijLineEmissions.second);
}
if ( c.klLineEmissions.first < 0 && c.klLineEmissions.second < 0 ) {
klPropagator +=
invariant(c.klLine.first,c.klLine.second);
} else if ( c.klLineEmissions.first > 0 && c.klLineEmissions.second < 0 ) {
klPropagator +=
invariant(c.klLine.first,c.klLine.second) +
invariant(c.klLine.first,c.klLineEmissions.first) +
invariant(c.klLine.second,c.klLineEmissions.first);
} else if ( c.klLineEmissions.first > 0 && c.klLineEmissions.second > 0 ) {
klPropagator +=
invariant(c.klLine.first,c.klLine.second) +
invariant(c.klLine.first,c.klLineEmissions.first) +
invariant(c.klLine.second,c.klLineEmissions.first) +
invariant(c.klLine.first,c.klLineEmissions.second) +
invariant(c.klLine.second,c.klLineEmissions.second) +
invariant(c.klLineEmissions.first,c.klLineEmissions.second);
}
if (c.boson == getParticleData(ParticleID::Z0)) {
return (c.higgsCoupling/amplitudeScale())/(ijPropagator*klPropagator);
}
return (c.higgsCoupling/amplitudeScale())/(ijPropagator*klPropagator);
}
inline bool isQuark(cPDPtr p) {
if (p->id() > 0 && p->id() < 7) return true;
return false;
}
inline bool isAntiQuark(cPDPtr p) {
if (p->id() < 0 && p->id() > -7) return true;
return false;
}
inline bool isGluon(cPDPtr p) {
if (p->id() == 21 ) return true;
return false;
}
inline bool isHiggs(cPDPtr p) {
if (p->id() == 25 ) return true;
return false;
}
inline int sign(int a) {
return a < 0 ? -1 : 1;
}
const map<int, pair<int, double> >& AmplitudeBase::virtualInfo() const {
const cPDVector& proc = mePartonData();
map<cPDVector,map<int, pair<int, double> > >::const_iterator i =
virtualInfos().find(proc);
if ( i != virtualInfos().end() )
return i->second;
vector<int> in;
vector<int> out;
int gluon = 0;
int higgs = 0;
// find incoming and outgoing particles in the master topology
if (isQuark(proc[0])) in.push_back(1);
else if (isAntiQuark(proc[0])) out.push_back(-1);
else if (isGluon(proc[0])) gluon = -1;
if (isQuark(proc[1])) in.push_back(2);
else if (isAntiQuark(proc[1])) out.push_back(-2);
else if (isGluon(proc[1])) gluon = -2;
for (int i = 2; i != proc.size(); i++) {
if (isQuark(proc[i])) out.push_back(i+1);
if (isAntiQuark(proc[i])) in.push_back(-i-1);
if (isGluon(proc[i])) gluon = i+1;
if (isHiggs(proc[i])) higgs = i+1;
}
assert(in.size() == 2);
assert(out.size() == 2);
assert(higgs != 0);
//construct a map for the indices
map<int, pair<int, double> > XMap;
for (int i = 0; i < 2; i++) {
XMap[2*i+1] = make_pair (abs(in[i])-1, sign(in[i]));
}
for (int i = 0; i < 2; i++) {
XMap[2*i+2] = make_pair(abs(out[i])-1, sign(out[i]));
}
if ( gluon != 0 ){
XMap[5] = make_pair(abs(gluon)-1, sign(gluon));
XMap[6] = make_pair(higgs-1, 1.0);
}
else
XMap[5] = make_pair(higgs-1, 1.0);
//swap entries 2 and 4 if they cannot be connected to the incoming partons
//by a t-channel diagram
// int one = 1; int two = 2; int three = 3; int four = 4;
// if (proc[XMap.find(one)->second.first]->id() % 2 * XMap.find(one)->second.second
// != proc[XMap.find(two)->second.first]->id() % 2 * XMap.find(two)->second.second){
// // || (abs(proc[XMap.find(one)->second.first]->id())-1) / 2
// // != (abs(proc[XMap.find(two)->second.first]->id())-1) / 2) {
// assert(proc[XMap.find(two)->second.first]->id() % 2 * XMap.find(two)->second.second
// == proc[XMap.find(three)->second.first]->id() % 2 * XMap.find(three)->second.second);
// assert(proc[XMap.find(one)->second.first]->id() % 2 * XMap.find(one)->second.second
// == proc[XMap.find(four)->second.first]->id() % 2 * XMap.find(four)->second.second);
// // assert((abs(proc[XMap.find(two)->second.first]->id())-1) / 2
// // == (abs(proc[XMap.find(three)->second.first]->id())-1) / 2 );
// // assert((abs(proc[XMap.find(one)->second.first]->id())-1) / 2
// // == (abs(proc[XMap.find(four)->second.first]->id())-1) / 2 );
// pair<int,double> buffer = XMap.find(four)->second;
// XMap[four] = XMap.find(two)->second;
// XMap[two] = buffer;
// }
virtualInfos()[proc] = XMap;
i = virtualInfos().find(proc);
return i->second;
}
bool AmplitudeBase::topologyOneIsNC() const{
const cPDVector& proc = mePartonData();
map<int, pair<int, double> > XMap = virtualInfos().find(proc)->second;
if (proc[XMap.find(1)->second.first]->iCharge() * XMap.find(1)->second.second
- proc[XMap.find(2)->second.first]->iCharge() * XMap.find(2)->second.second == ZERO
&& (abs(proc[XMap.find(1)->second.first]->id())-1)/2
== (abs(proc[XMap.find(2)->second.first]->id())-1)/2){
assert(proc[XMap.find(3)->second.first]->iCharge() * XMap.find(3)->second.second
- proc[XMap.find(4)->second.first]->iCharge() * XMap.find(4)->second.second == ZERO);
return true;
}
return false;
}
bool AmplitudeBase::topologyOneIsCC() const{
const cPDVector& proc = mePartonData();
map<int, pair<int, double> > XMap = virtualInfos().find(proc)->second;
if (abs(proc[XMap.find(1)->second.first]->iCharge() * XMap.find(1)->second.second
- proc[XMap.find(2)->second.first]->iCharge() * XMap.find(2)->second.second) == 3
&& (abs(proc[XMap.find(1)->second.first]->id())-1)/2
== (abs(proc[XMap.find(2)->second.first]->id())-1)/2
&& (abs(proc[XMap.find(3)->second.first]->id())-1)/2
== (abs(proc[XMap.find(4)->second.first]->id())-1)/2){
assert(abs(proc[XMap.find(3)->second.first]->iCharge() * XMap.find(3)->second.second
- proc[XMap.find(4)->second.first]->iCharge() * XMap.find(4)->second.second) == 3);
return true;
}
return false;
}
bool AmplitudeBase::topologyTwoIsNC() const{
const cPDVector& proc = mePartonData();
map<int, pair<int, double> > XMap = virtualInfos().find(proc)->second;
if (proc[XMap.find(1)->second.first]->iCharge() * XMap.find(1)->second.second
- proc[XMap.find(4)->second.first]->iCharge() * XMap.find(4)->second.second == ZERO
&& (abs(proc[XMap.find(1)->second.first]->id())-1)/2
== (abs(proc[XMap.find(4)->second.first]->id())-1)/2){
assert(proc[XMap.find(3)->second.first]->iCharge() * XMap.find(3)->second.second
- proc[XMap.find(2)->second.first]->iCharge() * XMap.find(2)->second.second == ZERO);
return true;
}
return false;
}
bool AmplitudeBase::topologyTwoIsCC() const{
const cPDVector& proc = mePartonData();
map<int, pair<int, double> > XMap = virtualInfos().find(proc)->second;
if (abs(proc[XMap.find(1)->second.first]->iCharge() * XMap.find(1)->second.second
- proc[XMap.find(4)->second.first]->iCharge() * XMap.find(4)->second.second) == 3
&& (abs(proc[XMap.find(1)->second.first]->id())-1)/2
== (abs(proc[XMap.find(4)->second.first]->id())-1)/2
&& (abs(proc[XMap.find(3)->second.first]->id())-1)/2
== (abs(proc[XMap.find(2)->second.first]->id())-1)/2){
assert(abs(proc[XMap.find(3)->second.first]->iCharge() * XMap.find(3)->second.second
- proc[XMap.find(2)->second.first]->iCharge() * XMap.find(2)->second.second) == 3);
return true;
}
return false;
}
void AmplitudeBase::getCouplings(double* Recl1, double* Recr1, double* Recl3, double* Recr3,
double* Imcl1, double* Imcr1, double* Imcl3, double* Imcr3,
double* Reghvv, double* Imghvv,
double* mass, double* width, int* isVaW) const{
const cPDVector& proc = mePartonData();
map<int, pair<int, double> > XMap = virtualInfos().find(proc)->second;
for (int i = 0; i < 2; i++) {
Recl1[i]=0.0;
Recr1[i]=0.0;
Recl3[i]=0.0;
Recr3[i]=0.0;
Reghvv[i]=0.0;
Imcl1[i]=0.0;
Imcr1[i]=0.0;
Imcl3[i]=0.0;
Imcr3[i]=0.0;
Imghvv[i]=0.0;
mass[i]=10.0;
width[i]=10.0;
isVaW[i]=0;
}
// fix width
//double gem = sqrt(4.*Constants::pi*SM().alphaEMMZ());
//double s2tw = SM().sin2ThetaW();
//double stw = sqrt(s2tw);
//double ctw = sqrt(1.-s2tw);
- Energy MW = getParticleData(ParticleID::Wplus)->mass();
- Energy MZ = getParticleData(ParticleID::Z0)->mass();
+ Energy MW = getParticleData(ParticleID::Wplus)->hardProcessMass();
+ Energy MZ = getParticleData(ParticleID::Z0)->hardProcessMass();
- Energy WWidth = getParticleData(ParticleID::Wplus)->width();
- Energy ZWidth = getParticleData(ParticleID::Z0)->width();
+ Energy WWidth = getParticleData(ParticleID::Wplus)->hardProcessWidth();
+ Energy ZWidth = getParticleData(ParticleID::Z0)->hardProcessWidth();
//cout << "Wwidth="<< WWidth/GeV << "\n";
//cout << "Zwidth="<< ZWidth/GeV << "\n";
complex<double> alphaQED = SM().alphaEMMZ();
complex<double> c2tw = complex<double>(1.,0.) - SM().sin2ThetaW();
complex<double> s2tw = SM().sin2ThetaW();
complex<double> MW2c = double(sqr(MW/GeV));
complex<double> MWc = sqrt(MW2c);
complex<double> MZ2c = double(sqr(MZ/GeV));
complex<double> MZc = sqrt(MZ2c);
if( complexMassScheme ){
MW2c = complex<double>(sqr(MW/GeV),-MW*WWidth/GeV2);
MWc = sqrt(MW2c);
MZ2c = complex<double>(sqr(MZ/GeV),-MZ*ZWidth/GeV2);
MZc = sqrt(MZ2c);
c2tw = MW2c/MZ2c;
s2tw = complex<double>(1.,0.) - c2tw;
alphaQED = sqrt(2.)*SM().fermiConstant()*MW2c*s2tw/Constants::pi*GeV2;
}
/*cout << "s2tw= "<< s2tw << "\n";
cout << "MZc= " << MZc << "\n";
cout << "MWc= " << MWc << "\n";*/
complex<double> stw = sqrt(s2tw);
complex<double> ctw = sqrt(c2tw);
complex <double> gem = sqrt(4.*Constants::pi*alphaQED);
//get couplings to Z0
double Q = proc[XMap.find(1)->second.first]->iCharge()/3. * XMap.find(1)->second.second;
double I3 = proc[XMap.find(1)->second.first]->id() % 2 == 0 ? 0.5 : -0.5;
complex<double> CUpperR = -gem*Q*stw/ctw;
complex<double> CUpperL = gem*(I3-s2tw*Q)/(stw*ctw);
Q = proc[XMap.find(3)->second.first]->iCharge()/3. * XMap.find(3)->second.second;
I3 = proc[XMap.find(3)->second.first]->id() % 2 == 0 ? 0.5 : -0.5;
complex<double> CLowerR = -gem*Q*stw/ctw;
complex<double> CLowerL = gem*(I3-s2tw*Q)/(stw*ctw);
//find NC topology and fill in couplings
complex<double> ghzz = kappaZ()*gem*MZc/(stw*ctw);
if (topologyOneIsNC()) {
Recl1[0]=CUpperL.real();
Recr1[0]=CUpperR.real();
Recl3[0]=CLowerL.real();
Recr3[0]=CLowerR.real();
Reghvv[0]=ghzz.real();
if (complexMassScheme ){
Imcl1[0]=CUpperL.imag();
Imcr1[0]=CUpperR.imag();
Imcl3[0]=CLowerL.imag();
Imcr3[0]=CLowerR.imag();
Imghvv[0]=ghzz.imag();
// throw "go here";
}
mass[0]=MZ/GeV;
width[0]=ZWidth/GeV;
isVaW[0]=0;
}
if (topologyTwoIsNC()) {
Recl1[1]=CUpperL.real();
Recr1[1]=CUpperR.real();
Recl3[1]=CLowerL.real();
Recr3[1]=CLowerR.real();
Reghvv[1]=ghzz.real();
if (complexMassScheme){
Imcl1[1]=CUpperL.imag();
Imcr1[1]=CUpperR.imag();
Imcl3[1]=CLowerL.imag();
Imcr3[1]=CLowerR.imag();
Imghvv[1]=ghzz.imag();
}
mass[1]=MZ/GeV;
width[1]=ZWidth/GeV;
isVaW[1]=0;
}
//get couplings to W
CUpperL = gem/(sqrt(2.)*stw);
CLowerL = gem/(sqrt(2.)*stw);
complex<double> ghww = kappaW()*gem*MWc/stw;
assert(!(topologyOneIsCC() && topologyTwoIsCC()));
//find CC topology and fill in couplings
if (topologyOneIsCC()) {
Recl1[0]=CUpperL.real();
Recl3[0]=CLowerL.real();
Reghvv[0]=ghww.real();
if (complexMassScheme){
Imcl1[0]=CUpperL.imag();
Imcl3[0]=CLowerL.imag();
Imghvv[0]=ghww.imag();
}
mass[0]=MW/GeV;
width[0]=WWidth/GeV;
isVaW[0]=1;
}
else if (topologyTwoIsCC()) {
Recl1[1]=CUpperL.real();
Recl3[1]=CLowerL.real();
Reghvv[1]=ghww.real();
if (complexMassScheme){
Imcl1[1]=CUpperL.imag();
Imcl3[1]=CLowerL.imag();
Imghvv[1]=ghww.imag();
}
mass[1]=MW/GeV;
width[1]=WWidth/GeV;
isVaW[1]=1;
}
}
// If needed, insert default implementations of virtual function defined
// in the InterfacedBase class here (using ThePEG-interfaced-impl in Emacs).
void AmplitudeBase::persistentOutput(PersistentOStream & os) const {
os << complexMassScheme << mu2Factor
<< theKappaZ << theKappaW << theStableEpsilon;
}
void AmplitudeBase::persistentInput(PersistentIStream & is, int) {
is >> complexMassScheme >> mu2Factor
>> theKappaZ >> theKappaW >> theStableEpsilon;
}
// *** Attention *** The following static variable is needed for the type
// description system in ThePEG. Please check that the template arguments
// are correct (the class and its base class), and that the constructor
// arguments are correct (the class name and the name of the dynamically
// loadable library where the class implementation can be found).
DescribeAbstractClass<AmplitudeBase,Herwig::MatchboxAmplitude>
describeHJetsAmplitudeBase("HJets::AmplitudeBase", "HwMatchboxBuiltin.so HJets.so");
void AmplitudeBase::Init() {
static ClassDocumentation<AmplitudeBase> documentation
("Helicity amplitudes for 0 -> h + jets");
static Switch<AmplitudeBase,bool> interfaceComplexMassScheme
("ComplexMassScheme",
"Switch on or off the complex mass scheme.",
&AmplitudeBase::complexMassScheme, true, false, false);
static SwitchOption interfaceComplexMassSchemeOn
(interfaceComplexMassScheme,
"On",
"Switch on the complex mass scheme.",
true);
static SwitchOption interfaceComplexMassSchemeOff
(interfaceComplexMassScheme,
"Off",
"Switch off the complex mass scheme.",
false);
static Parameter<AmplitudeBase,double> interfaceMu2Factor
("Mu2Factor",
"The t'Hooft scale factor to be changed for validation.",
&AmplitudeBase::mu2Factor, 1.0, 0.0, 0,
false, false, Interface::lowerlim);
static Parameter<AmplitudeBase,double> interfaceKappaZ
("KappaZ",
"The factor to rescale the HZZ coupling.",
&AmplitudeBase::theKappaZ, 1.0, 0, 0,
false, false, Interface::nolimits);
static Parameter<AmplitudeBase,double> interfaceKappaW
("KappaW",
"The factor to rescale the HWW coupling.",
&AmplitudeBase::theKappaW, 1.0, 0, 0,
false, false, Interface::nolimits);
static Parameter<AmplitudeBase,double> interfaceStableEpsilon
("StableEpsilon",
"The threshold for unstable point classification.",
&AmplitudeBase::theStableEpsilon, 1e-9, 0.0, 0,
false, false, Interface::lowerlim);
}
namespace HJets {
struct Banner {
Banner() {
cout << "################################################################################\n"
<< "# #\n"
- << "# HJets++ 1.0 #\n"
+ << "# HJets++ 1.1 #\n"
<< "# ========================================================================== #\n"
<< "# A Matchbox plugin for electroweak Higgs plus #\n"
<< "# two and three jet production at NLO QCD #\n"
<< "# #\n"
<< "# #\n"
<< "# (C) 2012-2014 The HJets++ collaboration #\n"
<< "# ------------------------------------------------------------ #\n"
<< "# Francisco Campanario <francisco.campanario@ific.uv.es> #\n"
<< "# Terrance M. Figy <terrance.figy@hep.manchester.ac.uk> #\n"
<< "# Simon Platzer <simon.plaetzer@desy.de> #\n"
<< "# Malin Sjodahl <malin.sjodahl@thep.lu.se> #\n"
<< "# ------------------------------------------------------------ #\n"
<< "# #\n"
<< "# #\n"
<< "# ========================================================================== #\n"
<< "# #\n"
<< "# HJets++ is licenced under version 2 of the GPL, see COPYING for details. #\n"
<< "# Please respect the MCnet academic guidelines, see GUIDELINES for details. #\n"
<< "# #\n"
<< "# When using HJets++ please cite: #\n"
<< "# #\n"
<< "# F. Campanario, T.M. Figy, S. Platzer and M. Sjodahl: #\n"
<< "# 'Electroweak Higgs plus Three Jet Production at NLO QCD', #\n"
<< "# Phys.Rev.Lett. 111 (2013) 211802, arXiv:1308.2932 [hep-ph] #\n"
<< "# #\n"
<< "################################################################################\n"
<< flush;
Repository::appendReadDir("@prefix@/share/HJets");
}
};
}
HJets::Banner hjetsbanner;
diff --git a/Amplitudes/AmplitudeBase.h b/Amplitudes/AmplitudeBase.h
--- a/Amplitudes/AmplitudeBase.h
+++ b/Amplitudes/AmplitudeBase.h
@@ -1,239 +1,239 @@
// -*- C++ -*-
//
// AmplitudeBase.h is a part of HJets
// Copyright (C) 2011-2012
// Ken Arnold, Francisco Campanario, Terrance Figy, Simon Platzer and Malin Sjodahl
//
// HJets is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
#ifndef HJets_AmplitudeBase_H
#define HJets_AmplitudeBase_H
//
// This is the declaration of the AmplitudeBase class.
//
-#include "Herwig++/MatrixElement/Matchbox/Base/MatchboxAmplitude.h"
-#include "Herwig++/MatrixElement/Matchbox/Builtin/Amplitudes/MatchboxCurrents.h"
+#include "Herwig/MatrixElement/Matchbox/Base/MatchboxAmplitude.h"
+#include "Herwig/MatrixElement/Matchbox/Builtin/Amplitudes/MatchboxCurrents.h"
#include "HJetsProcessInfo.h"
namespace HJets {
using namespace ThePEG;
using namespace Herwig;
//#define AMPVERBOSE
/**
* \brief Tree level helicity amplitudes for 0 -> h + jets
*/
class AmplitudeBase:
public MatchboxAmplitude, public MatchboxCurrents {
public:
/** @name Standard constructors and destructors. */
//@{
/**
* The default constructor.
*/
AmplitudeBase();
/**
* The destructor.
*/
virtual ~AmplitudeBase();
//@}
public:
/**
* Return true, if this amplitude can handle the given process.
*/
virtual bool canHandle(const PDVector&) const;
/**
* Return the (tree-level) order in \f$g_{EM}\f$ in which this matrix
* element is given.
*/
virtual unsigned int orderInGem() const { return 3; }
/**
* Return the (tree-level) order in \f$g_S\f$ in which this matrix
* element is given.
*/
virtual unsigned int orderInGs() const { return nPartons()-4; }
/**
* Flush all cashes.
*/
virtual void flushCaches() {
MatchboxCurrents::reset();
MatchboxAmplitude::flushCaches();
}
/**
* Return the number of partons attached to this amplitude.
*/
virtual int nPartons() const = 0;
/**
* Return true, if one-loop contributions will be evaluated at amplitude level.
*/
virtual bool oneLoopAmplitudes() const { return false; }
/**
* Return true, if one loop corrections are given in the convenctions
* of everything expanded.
*/
virtual bool isExpanded() const { return true; }
//virtual bool isDR() const{return false;}
/**
* Return the virtual amplitude info
*/
const map<int, pair<int, double> >& virtualInfo() const;
/**
* The virtuals info maps.
*/
static map<cPDVector,map<int, pair<int, double> > >& virtualInfos();
/**
* Return the value of the dimensional regularization
* parameter. Note that renormalization scale dependence is fully
* restored in DipoleIOperator.
*/
virtual Energy2 mu2() const { return mu2Factor*lastSHat(); }
protected:
/**
* Return the amplitude configurations to be considered.
*/
vector<AmplitudeInfo>& amplitudeInfo();
/**
* Get the boson propagators and Higgs coupling factor
*/
Complex bosonFactor(const AmplitudeInfo&) const;
/**
* Check if t-channel diagram is a neutral current diagram.
*/
bool topologyOneIsNC() const;
/**
* Check if u-channel diagram is a neutral current diagram.
*/
bool topologyTwoIsNC() const;
/**
* Check if t-channel diagram is a neutral current diagram.
*/
bool topologyOneIsCC() const;
/**
* Check if u-channel diagram is a neutral current diagram.
*/
bool topologyTwoIsCC() const;
/**
* Work out the couplings
*/
void getCouplings(double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*, double*, int*) const;
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();
// If needed, insert declarations of virtual function defined in the
// InterfacedBase class here (using ThePEG-interfaced-decl in Emacs).
protected:
/**
* Return the factor to rescale the HZZ coupling
*/
double kappaZ() const { return theKappaZ; }
/**
* Return the factor to rescale the HWW coupling
*/
double kappaW() const { return theKappaW; }
protected:
/**
* Return the threshold for classifying points as unstable
*/
double stableEpsilon() const { return theStableEpsilon; }
private:
/**
* The amplitude info map.
*/
static map<cPDVector,vector<AmplitudeInfo> >& amplitudeInfos();
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
AmplitudeBase & operator=(const AmplitudeBase &);
/**
* Wether or not the complex mass scheme should be used
*/
bool complexMassScheme;
/**
* A rescaling factor for the t'Hooft mass
*/
double mu2Factor;
/**
* A factor to rescale the HZZ coupling
*/
double theKappaZ;
/**
* A factor to rescale the HWW coupling
*/
double theKappaW;
/**
* The threshold for classifying points as unstable
*/
double theStableEpsilon;
};
}
#endif /* HJets_AmplitudeBase_H */
diff --git a/Amplitudes/Amplitudehqqbarkkbar.cc b/Amplitudes/Amplitudehqqbarkkbar.cc
--- a/Amplitudes/Amplitudehqqbarkkbar.cc
+++ b/Amplitudes/Amplitudehqqbarkkbar.cc
@@ -1,486 +1,489 @@
// -*- C++ -*-
//
// Amplitudehqqbarkkbar.cc is a part of HJets
// Copyright (C) 2011-2012
// Ken Arnold, Francisco Campanario, Terrance Figy, Simon Platzer and Malin Sjodahl
//
// HJets 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 Amplitudehqqbarkkbar class.
//
#include "Amplitudehqqbarkkbar.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
extern "C"
{
void qqhqqvbf_(double PBAR1[4], double PBAR2[4], double PBAR3[4],
double PBAR4[4], double PBAR5[4],
int SIGN[5], double ReCL1[2], double ReCR1[2],
double ReCL3[2], double ReCR3[2],
double ImCL1[2], double ImCR1[2],
double ImCL3[2], double ImCR3[2],
double Mass[2], double Width[2], int IsVaW[2],
int& divMax,
double ReGHVV[2], double ImGHVV[2], double& scale,
double& born, double virt[3]);
}
inline void F77_qqhqqvbf(double PBAR1[4], double PBAR2[4], double PBAR3[4],
double PBAR4[4], double PBAR5[4],
int SIGN[5], double ReCL1[2], double ReCR1[2],
double ReCL3[2], double ReCR3[2],
double ImCL1[2], double ImCR1[2],
double ImCL3[2], double ImCR3[2],
double Mass[2], double Width[2], int IsVaW[2], int& divMax,
double ReGHVV[2], double ImGHVV[2], double& scale,
double& born, double virt[3]){
qqhqqvbf_(PBAR1,PBAR2,PBAR3,PBAR4,PBAR5,SIGN,ReCL1,ReCR1,ReCL3,ReCR3,
ImCL1,ImCR1,ImCL3,ImCR3,Mass,Width,IsVaW,divMax,ReGHVV,ImGHVV,scale,born,virt);
return;
}
using namespace HJets;
Amplitudehqqbarkkbar::Amplitudehqqbarkkbar() {}
Amplitudehqqbarkkbar::~Amplitudehqqbarkkbar() {}
IBPtr Amplitudehqqbarkkbar::clone() const {
return new_ptr(*this);
}
IBPtr Amplitudehqqbarkkbar::fullclone() const {
return new_ptr(*this);
}
void Amplitudehqqbarkkbar::prepareAmplitudes(Ptr<MatchboxMEBase>::tcptr me) {
if ( !calculateTreeAmplitudes() ) {
MatchboxAmplitude::prepareAmplitudes(me);
return;
}
// inform the amplitude cache how many legs we are handling
nPoints(5);
// everything is expressed in dimensionless quantities, referring to
// sqrt(shat) of the collission as the mass unit
amplitudeScale(sqrt(lastSHat()));
// the higgs momentum
Lorentz5Momentum ph = amplitudeMomentum(0);
momentum(0,ph,true,ph.mass());
// the parton momenta
for ( size_t k = 1; k < 5; ++k )
momentum(k,amplitudeMomentum(k),true);
MatchboxAmplitude::prepareAmplitudes(me);
}
Complex Amplitudehqqbarkkbar::evaluate(size_t colourTensor,
const vector<int>& helicities,
Complex& largeN) {
// get configurations we need to consider
const vector<AmplitudeInfo>& confs = amplitudeInfo();
// sum of all contributions
Complex result = 0;
largeN = 0.;
for ( vector<AmplitudeInfo>::const_iterator c = confs.begin();
c != confs.end(); ++c ) {
map<size_t,double>::const_iterator cx = c->colourTensors.find(colourTensor);
if ( cx == c->colourTensors.end() )
continue;
Complex diagram = 0.;
Complex ijL = c->ijLeftCoupling;
Complex ijR = c->ijRightCoupling;
Complex klL = c->klLeftCoupling;
Complex klR = c->klRightCoupling;
int i = c->ijLine.first;
int j = c->ijLine.second;
int k = c->klLine.first;
int l = c->klLine.second;
if ( c->ijLineEmissions.first < 0 && c->ijLineEmissions.second < 0 &&
c->klLineEmissions.first < 0 && c->klLineEmissions.second < 0 ) {
if ( ijL != 0. && klL != 0. ) {
diagram +=
ijL*klL*qqbarLeftCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbarLeftCurrent(k,helicities[k],
l,helicities[l]));
}
if ( ijL != 0. && klR != 0. ) {
diagram +=
ijL*klR*qqbarLeftCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbarRightCurrent(k,helicities[k],
l,helicities[l]));
}
if ( ijR != 0. && klL != 0. ) {
diagram +=
ijR*klL*qqbarRightCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbarLeftCurrent(k,helicities[k],
l,helicities[l]));
}
if ( ijR != 0. && klR != 0. ) {
diagram +=
ijR*klR*qqbarRightCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbarRightCurrent(k,helicities[k],
l,helicities[l]));
}
} else assert(false);
diagram *= bosonFactor(*c)*cx->second * c->fermionSign;
result += diagram;
if ( cx->second > 0. )
largeN += diagram;
}
return result;
}
inline void convert(const Lorentz5Momentum& p, double* res) {
res[0] = p.t()/GeV;
res[1] = p.x()/GeV;
res[2] = p.y()/GeV;
res[3] = p.z()/GeV;
}
double Amplitudehqqbarkkbar::oneLoopInterference() const {
+ if ( !calculateOneLoopInterference() )
+ return lastOneLoopInterference();
const map<int, pair<int, double> >& transmap = virtualInfo();
double pbar1[4];
double pbar2[4];
double pbar3[4];
double pbar4[4];
double pbar5[4];
convert(meMomenta()[transmap.find(1)->second.first],pbar1);
convert(meMomenta()[transmap.find(2)->second.first],pbar2);
convert(meMomenta()[transmap.find(3)->second.first],pbar3);
convert(meMomenta()[transmap.find(4)->second.first],pbar4);
convert(meMomenta()[transmap.find(5)->second.first],pbar5);
int sign[5];
for ( size_t k = 0; k < 5; ++k )
sign[k] = transmap.find(k+1)->second.second;
double Recl1[2];
double Recr1[2];
double Recl3[2];
double Recr3[2];
double Reghvv[2];
double Imcl1[2];
double Imcr1[2];
double Imcl3[2];
double Imcr3[2];
double Imghvv[2];
double mass[2];
double width[2];
int isVaW[2];
getCouplings(Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,Reghvv,Imghvv,mass,width,isVaW);
//int NF = nLight();
int divMax = 2;
double born;
double virt[3];
double scale = mu2()/GeV2;
F77_qqhqqvbf (pbar1,pbar2,pbar3,pbar4,pbar5,sign,Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,
mass,width,isVaW,divMax,Reghvv,Imghvv,scale,born,virt);
double res = (SM().alphaS()/(2.*Constants::pi))*virt[0]*(lastSHat()/GeV2);
#ifdef AMPVERBOSE
const cPDVector& proc = mePartonData();
const cPDVector& proc1 = amplitudePartonData();
map<int, pair<int, double> > XMap = virtualInfos().find(proc)->second;
generator()->log() << "c2="<< virt[2]/born << "\n";
generator()->log() << "c1="<< virt[1]/born << "\n";
generator()->log() << "c0="<< virt[0]/born << "\n";
born*=lastSHat()/GeV2;
generator()->log() << "--------------------- \n";
- generator()->log() << "rb=" << born/me2()/LastMatchboxXCombInfo::crossingSign() << " Base(TF) Diagram:"
+ generator()->log() << "rb=" << born/me2() << " Base(TF) Diagram:"
<< XMap.find(1)->second.first << (XMap.find(1)->second.second > 0 ? "+" : "-") << proc[XMap.find(1)->second.first]->PDGName() << " "
<< XMap.find(3)->second.first << (XMap.find(3)->second.second > 0 ? "+" : "-") << proc[XMap.find(3)->second.first]->PDGName() << " -> "
<< XMap.find(2)->second.first << (XMap.find(2)->second.second > 0 ? "+" : "-") << proc[XMap.find(2)->second.first]->PDGName() << " "
<< XMap.find(4)->second.first << (XMap.find(4)->second.second > 0 ? "+" : "-") << proc[XMap.find(4)->second.first]->PDGName() << " "
<< XMap.find(5)->second.first << (XMap.find(5)->second.second > 0 ? "+" : "-") << proc[XMap.find(5)->second.first]->PDGName() << "\n";
- generator()->log() << "rb=" << born/me2()/LastMatchboxXCombInfo::crossingSign() << " Base(SP) Diagram:"
+ generator()->log() << "rb=" << born/me2() << " Base(SP) Diagram:"
<< crossingMap()[0] << " " << proc1[0]->PDGName() << " "
<< crossingMap()[1] << " " << proc1[1]->PDGName() << " "
<< crossingMap()[2] << " " << proc1[2]->PDGName() << " "
<< crossingMap()[3] << " " << proc1[3]->PDGName() << " "
<< crossingMap()[4] << " " << proc1[4]->PDGName() << "\n";
generator()->log() << "OneisNC= " << topologyOneIsNC()
<< " OneisCC= " << topologyOneIsCC()
<< " TwoisNC= " << topologyTwoIsNC()
<< " TwoisCC= " << topologyTwoIsCC()
<< "\n";
generator()->log() << "sign[0]="<< sign[0]<< "\n";
generator()->log() << "sign[1]="<< sign[1]<< "\n";
generator()->log() << "sign[2]="<< sign[2]<< "\n";
generator()->log() << "sign[3]="<< sign[3]<< "\n";
generator()->log() << "sign[4]="<< sign[4]<< "\n";
generator()->log() << "Recl1[0]="<< Recl1[0] << " Recl3[0]=" << Recl3[0] << "\n";
generator()->log() << "Recr1[0]="<< Recr1[0] << " Recr3[0]=" << Recr3[0] << "\n";
generator()->log() << "Imcl1[0]="<< Imcl1[0] << " Imcl3[0]=" << Imcl3[0] << "\n";
generator()->log() << "Imcr1[0]="<< Imcr1[0] << " Imcr3[0]=" << Imcr3[0] << "\n";
generator()->log() << "Mass[0]="<< mass[0] << "\n";
generator()->log() << "Recl1[1]="<< Recl1[1] << " Recl3[0]=" << Recl3[1] << "\n";
generator()->log() << "Recr1[1]="<< Recr1[1] << " Recr3[0]=" << Recr3[1] << "\n";
generator()->log() << "Imcl1[1]="<< Imcl1[1] << " Imcl3[0]=" << Imcl3[1] << "\n";
generator()->log() << "Imcr1[1]="<< Imcr1[1] << " Imcr3[0]=" << Imcr3[1] << "\n";
generator()->log() << "Mass[1]="<< mass[1] << "\n";
generator()->log() << "born=" << born << "\n";
- generator()->log() << "me2=" << me2()*LastMatchboxXCombInfo::crossingSign() << "\n";
+ generator()->log() << "me2=" << me2() << "\n";
#endif
/*
- double mm = LastMatchboxXCombInfo::crossingSign()*me2();
+ double mm = me2();
born *= lastSHat()/GeV2;
double delta = abs((mm-born)/(mm+born));
if ( mm < 0.0 || born < 0.0 ) {
cerr << "in ";
for ( cPDVector::const_iterator p = mePartonData().begin();
p != mePartonData().end(); ++p )
cerr << (**p).PDGName() << " ";
cerr << setprecision(20);
cerr << "\nfatal : mm = " << mm << " born = " << born << "\n" << flush;
}
if ( delta > 1.e-12 ) {
cerr << "in ";
for ( cPDVector::const_iterator p = mePartonData().begin();
p != mePartonData().end(); ++p )
cerr << (**p).PDGName() << " ";
cerr << setprecision(20);
cerr << "\nproblem : mm = " << mm << " born = " << born
<< " -> delta = " << delta << "\n" << flush;
}
*/
- return LastMatchboxXCombInfo::crossingSign()*res;
+ lastOneLoopInterference(res);
+ return lastOneLoopInterference();
}
double Amplitudehqqbarkkbar::oneLoopDoublePole() const {
const map<int, pair<int, double> >& transmap = virtualInfo();
double pbar1[4];
double pbar2[4];
double pbar3[4];
double pbar4[4];
double pbar5[4];
convert(meMomenta()[transmap.find(1)->second.first],pbar1);
convert(meMomenta()[transmap.find(2)->second.first],pbar2);
convert(meMomenta()[transmap.find(3)->second.first],pbar3);
convert(meMomenta()[transmap.find(4)->second.first],pbar4);
convert(meMomenta()[transmap.find(5)->second.first],pbar5);
int sign[5];
for ( size_t k = 0; k < 5; ++k )
sign[k] = transmap.find(k+1)->second.second;
double Recl1[2];
double Recr1[2];
double Recl3[2];
double Recr3[2];
double Reghvv[2];
double Imcl1[2];
double Imcr1[2];
double Imcl3[2];
double Imcr3[2];
double Imghvv[2];
double mass[2];
double width[2];
int IsVaW[2];
getCouplings(Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,Reghvv,Imghvv,mass,width,IsVaW);
//int NF = nLight();
int divMax = 2;
double born;
double virt[3];
double scale = mu2()/GeV2;
F77_qqhqqvbf (pbar1,pbar2,pbar3,pbar4,pbar5,sign,Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,mass,width,IsVaW,divMax,Reghvv,Imghvv,scale,born,virt);
double res = (SM().alphaS()/(2.*Constants::pi))*virt[2]*(lastSHat()/GeV2);
#ifdef AMPVERBOSE
generator()->log() << "double pole="<< res/4./3./3. << "\n";
#endif
- return LastMatchboxXCombInfo::crossingSign()*res;
+ return res;
}
double Amplitudehqqbarkkbar::oneLoopSinglePole() const {
const map<int, pair<int, double> >& transmap = virtualInfo();
double pbar1[4];
double pbar2[4];
double pbar3[4];
double pbar4[4];
double pbar5[4];
convert(meMomenta()[transmap.find(1)->second.first],pbar1);
convert(meMomenta()[transmap.find(2)->second.first],pbar2);
convert(meMomenta()[transmap.find(3)->second.first],pbar3);
convert(meMomenta()[transmap.find(4)->second.first],pbar4);
convert(meMomenta()[transmap.find(5)->second.first],pbar5);
int sign[5];
for ( size_t k = 0; k < 5; ++k )
sign[k] = transmap.find(k+1)->second.second;
double Recl1[2];
double Recr1[2];
double Recl3[2];
double Recr3[2];
double Reghvv[2];
double Imcl1[2];
double Imcr1[2];
double Imcl3[2];
double Imcr3[2];
double Imghvv[2];
double mass[2];
double width[2];
int IsVaW[2];
getCouplings(Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,Reghvv,Imghvv,mass,width,IsVaW);
//int NF = nLight();
int divMax = 2;
double born;
double virt[3];
double scale = mu2()/GeV2;
F77_qqhqqvbf (pbar1,pbar2,pbar3,pbar4,pbar5,sign,Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,
mass,width,IsVaW,divMax,Reghvv,Imghvv,scale,born,virt);
double res = (SM().alphaS()/(2.*Constants::pi))*virt[1]*(lastSHat()/GeV2);
#ifdef AMPVERBOSE
generator()->log() << "single pole="<< res/4./3./3. << "\n";
#endif
- return LastMatchboxXCombInfo::crossingSign()*res;
+ return res;
}
// If needed, insert default implementations of virtual function defined
// in the InterfacedBase class here (using ThePEG-interfaced-impl in Emacs).
void Amplitudehqqbarkkbar::persistentOutput(PersistentOStream &) const {}
void Amplitudehqqbarkkbar::persistentInput(PersistentIStream &, int) {}
// *** Attention *** The following static variable is needed for the type
// description system in ThePEG. Please check that the template arguments
// are correct (the class and its base class), and that the constructor
// arguments are correct (the class name and the name of the dynamically
// loadable library where the class implementation can be found).
DescribeClass<Amplitudehqqbarkkbar,AmplitudeBase>
describeHJetsAmplitudehqqbarkkbar("HJets::Amplitudehqqbarkkbar", "HwMatchboxBuiltin.so HJets.so");
void Amplitudehqqbarkkbar::Init() {
static ClassDocumentation<Amplitudehqqbarkkbar> documentation
("Helicity amplitudes for 0 -> h q qbar k kbar");
}
diff --git a/Amplitudes/Amplitudehqqbarkkbarg.cc b/Amplitudes/Amplitudehqqbarkkbarg.cc
--- a/Amplitudes/Amplitudehqqbarkkbarg.cc
+++ b/Amplitudes/Amplitudehqqbarkkbarg.cc
@@ -1,691 +1,696 @@
// -*- C++ -*-
//
// Amplitudehqqbarkkbarg.cc is a part of HJets
// Copyright (C) 2011-2012
// Ken Arnold, Francisco Campanario, Terrance Figy, Simon Platzer and Malin Sjodahl
//
// HJets 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 Amplitudehqqbarkkbarg class.
//
#include "Amplitudehqqbarkkbarg.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
extern "C"
{
void qqhqqgvbf_(double PBAR1[4], double PBAR2[4], double PBAR3[4],
double PBAR4[4], double PBAR5[4], double PBAR6[4],
int SIGN[6], double ReCL1[2], double ReCR1[2],
double ReCL3[2], double ReCR3[2],
double ImCL1[2], double ImCR1[2],
double ImCL3[2], double ImCR3[2],
double Mass[2], double Width[2], int IsVaW[2],
int& divMax, int gaugegood[3], int gaugebad[3], double& gaugethres,
double& gaugeacc,
double ReGHVV[2], double ImGHVV[2], double& scale, double& NF,
double& born, double virt[3]);
}
inline void F77_qqhqqgvbf(double PBAR1[4], double PBAR2[4], double PBAR3[4],
double PBAR4[4], double PBAR5[4], double PBAR6[4],
int SIGN[6], double ReCL1[2], double ReCR1[2],
double ReCL3[2], double ReCR3[2],
double ImCL1[2], double ImCR1[2],
double ImCL3[2], double ImCR3[2],
double Mass[2], double Width[2], int IsVaW[2],
int& divMax, int gaugegood[3], int gaugebad[3], double& gaugethres,
double& gaugeacc,
double ReGHVV[2], double ImGHVV[2], double& scale, double& NF,
double& born, double virt[3]){
qqhqqgvbf_(PBAR1,PBAR2,PBAR3,PBAR4,PBAR5,PBAR6,SIGN,ReCL1,ReCR1,ReCL3,ReCR3,
ImCL1,ImCR1,ImCL3,ImCR3,Mass,Width,IsVaW,divMax,
gaugegood,gaugebad,gaugethres,gaugeacc,ReGHVV,ImGHVV,scale,NF,born,virt);
return;
}
using namespace HJets;
struct GaugeStatistics {
unsigned long gaugePassed[3];
unsigned long gaugeFailed[3];
GaugeStatistics();
~GaugeStatistics();
};
GaugeStatistics::GaugeStatistics() {
for ( unsigned int i = 0; i < 3; ++i ) {
gaugePassed[i] = 0;
gaugeFailed[i] = 0;
}
}
GaugeStatistics::~GaugeStatistics() {
if ( (double)gaugePassed[0] > 0 ||
(double)gaugePassed[1] > 0 ||
(double)gaugePassed[2] > 0 ) {
cerr << "\ngauge check summary\n"
<< "--------------------------------------------------------------------------------\n";
if ( gaugePassed[0] > 0 )
cerr << 100*((double)gaugeFailed[0]/(double)gaugePassed[0]) << "% points failing box gauge checks\n";
if ( gaugePassed[1] > 0 )
cerr << 100*((double)gaugeFailed[1]/(double)gaugePassed[1]) << "% points failing abelian hexagon gauge checks\n";
if ( gaugePassed[2] > 0 )
cerr << 100*((double)gaugeFailed[2]/(double)gaugePassed[2]) << "% points failing non-abelian hexagon gauge checks\n";
cerr << "--------------------------------------------------------------------------------\n"
<< flush;
} else if ( (double)gaugeFailed[0] > 0 ||
(double)gaugeFailed[1] > 0 ||
(double)gaugeFailed[2] > 0 ) {
cerr << "\ngauge check fatal: no points passed, some failed!\n" << flush;
}
}
static GaugeStatistics theGaugeStatistics;
Amplitudehqqbarkkbarg::Amplitudehqqbarkkbarg()
: theGaugeThreshold(0.1), theAccuracyCheck(false) {}
Amplitudehqqbarkkbarg::~Amplitudehqqbarkkbarg() {}
IBPtr Amplitudehqqbarkkbarg::clone() const {
return new_ptr(*this);
}
IBPtr Amplitudehqqbarkkbarg::fullclone() const {
return new_ptr(*this);
}
void Amplitudehqqbarkkbarg::prepareAmplitudes(Ptr<MatchboxMEBase>::tcptr me) {
if ( !calculateTreeAmplitudes() ) {
MatchboxAmplitude::prepareAmplitudes(me);
return;
}
// inform the amplitude cache how many legs we are handling
nPoints(6);
// everything is expressed in dimensionless quantities, referring to
// sqrt(shat) of the collission as the mass unit
amplitudeScale(sqrt(lastSHat()));
// the higgs momentum
Lorentz5Momentum ph = amplitudeMomentum(0);
momentum(0,ph,true,ph.mass());
// the parton momenta
for ( size_t k = 1; k < 6; ++k )
momentum(k,amplitudeMomentum(k),true);
MatchboxAmplitude::prepareAmplitudes(me);
}
Complex Amplitudehqqbarkkbarg::evaluate(size_t colourTensor,
const vector<int>& helicities,
Complex& largeN) {
// get configurations we need to consider
const vector<AmplitudeInfo>& confs = amplitudeInfo();
// sum of all contributions
Complex result = 0;
largeN = 0.;
for ( vector<AmplitudeInfo>::const_iterator c = confs.begin();
c != confs.end(); ++c ) {
map<size_t,double>::const_iterator cx = c->colourTensors.find(colourTensor);
if ( cx == c->colourTensors.end() )
continue;
Complex diagram = 0.;
Complex ijL = c->ijLeftCoupling;
Complex ijR = c->ijRightCoupling;
Complex klL = c->klLeftCoupling;
Complex klR = c->klRightCoupling;
int i = c->ijLine.first;
int j = c->ijLine.second;
int k = c->klLine.first;
int l = c->klLine.second;
if ( c->ijLineEmissions.first > 0 && c->ijLineEmissions.second < 0 &&
c->klLineEmissions.first < 0 && c->klLineEmissions.second < 0 ) {
int g = c->ijLineEmissions.first;
if ( ijL != 0. && klL != 0. ) {
diagram +=
ijL*klL*qqbargLeftCurrent(i,helicities[i],
j,helicities[j],
g,helicities[g]).
dot(qqbarLeftCurrent(k,helicities[k],
l,helicities[l]));
}
if ( ijL != 0. && klR != 0. ) {
diagram +=
ijL*klR*qqbargLeftCurrent(i,helicities[i],
j,helicities[j],
g,helicities[g]).
dot(qqbarRightCurrent(k,helicities[k],
l,helicities[l]));
}
if ( ijR != 0. && klL != 0. ) {
diagram +=
ijR*klL*qqbargRightCurrent(i,helicities[i],
j,helicities[j],
g,helicities[g]).
dot(qqbarLeftCurrent(k,helicities[k],
l,helicities[l]));
}
if ( ijR != 0. && klR != 0. ) {
diagram +=
ijR*klR*qqbargRightCurrent(i,helicities[i],
j,helicities[j],
g,helicities[g]).
dot(qqbarRightCurrent(k,helicities[k],
l,helicities[l]));
}
} else if ( c->ijLineEmissions.first < 0 && c->ijLineEmissions.second < 0 &&
c->klLineEmissions.first > 0 && c->klLineEmissions.second < 0 ) {
int g = c->klLineEmissions.first;
if ( ijL != 0. && klL != 0. ) {
diagram +=
ijL*klL*qqbarLeftCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbargLeftCurrent(k,helicities[k],
l,helicities[l],
g,helicities[g]));
}
if ( ijL != 0. && klR != 0. ) {
diagram +=
ijL*klR*qqbarLeftCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbargRightCurrent(k,helicities[k],
l,helicities[l],
g,helicities[g]));
}
if ( ijR != 0. && klL != 0. ) {
diagram +=
ijR*klL*qqbarRightCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbargLeftCurrent(k,helicities[k],
l,helicities[l],
g,helicities[g]));
}
if ( ijR != 0. && klR != 0. ) {
diagram +=
ijR*klR*qqbarRightCurrent(i,helicities[i],
j,helicities[j]).
dot(qqbargRightCurrent(k,helicities[k],
l,helicities[l],
g,helicities[g]));
}
} else assert(false);
diagram *= bosonFactor(*c)*cx->second * c->fermionSign;
result += diagram;
if ( cx->second > 0. )
largeN += diagram;
}
largeN *= sqrt(4.*Constants::pi*SM().alphaS());
return sqrt(4.*Constants::pi*SM().alphaS())*result;
}
inline void convert(const Lorentz5Momentum& p, double* res) {
res[0] = p.t()/GeV;
res[1] = p.x()/GeV;
res[2] = p.y()/GeV;
res[3] = p.z()/GeV;
}
double Amplitudehqqbarkkbarg::oneLoopInterference() const {
+ if ( !calculateOneLoopInterference() )
+ return lastOneLoopInterference();
+
const map<int, pair<int, double> >& transmap = virtualInfo();
double pbar1[4];
double pbar2[4];
double pbar3[4];
double pbar4[4];
double pbar5[4];
double pbar6[4];
convert(meMomenta()[transmap.find(1)->second.first],pbar1);
convert(meMomenta()[transmap.find(3)->second.first],pbar3);
convert(meMomenta()[transmap.find(2)->second.first],pbar2);
convert(meMomenta()[transmap.find(4)->second.first],pbar4);
convert(meMomenta()[transmap.find(5)->second.first],pbar5);
convert(meMomenta()[transmap.find(6)->second.first],pbar6);
int sign[6];
for ( size_t k = 0; k < 6; ++k )
sign[k] = (int) transmap.find(k+1)->second.second;
double Recl1[2];
double Recr1[2];
double Recl3[2];
double Recr3[2];
double Reghvv[2];
double Imcl1[2];
double Imcr1[2];
double Imcl3[2];
double Imcr3[2];
double Imghvv[2];
double mass[2];
double width[2];
int IsVaW[2];
getCouplings(Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,Reghvv,Imghvv,
mass,width,IsVaW);
double NF = nLight();
int gaugegood[3];
int gaugebad[3];
int divMax = 2;
double born;
double virt[3];
double scale = mu2()/GeV2;
double gt = theGaugeThreshold;
double gacc(0.);
#ifdef AMPVERBOSE
generator()->log()<<"scale="<<scale << "\n";
#endif
F77_qqhqqgvbf (pbar1,pbar2,pbar3,pbar4,pbar5,pbar6,sign,Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,mass,width,IsVaW,divMax,gaugegood,gaugebad,gt,gacc,
Reghvv,Imghvv,scale,NF,born,virt);
for (int i = 0; i < 3; i++) {
theGaugeStatistics.gaugePassed[i] += gaugegood[i];
theGaugeStatistics.gaugeFailed[i] += gaugebad[i];
}
double res = 2.*sqr(SM().alphaS())*virt[0]*pow(lastSHat()/GeV2,2);
if (gaugebad[0]+gaugebad[1]+gaugebad[2]) {
throw Veto();
}
if( theAccuracyCheck ){
generator()->log() << "checkacc "<< log10 (abs(gacc))<<"\n";
}
#ifdef AMPVERBOSE
const cPDVector& proc = mePartonData();
map<int, pair<int, double> > XMap = virtualInfos().find(proc)->second;
generator()->log() << setprecision(20);
generator()->log() << "--------------------- \n";
generator()->log() << "c2="<< virt[2]/born << "\n";
generator()->log() << "c1="<< virt[1]/born << "\n";
generator()->log() << "c0="<< virt[0]/born << "\n";
double gs2(SM().alphaS()*4.*Constants::pi);
born*=pow(lastSHat()/GeV2,2)*gs2;
- generator()->log() << "rb=" << born/me2()/LastMatchboxXCombInfo::crossingSign() << " Base Diagram:"
+ generator()->log() << "rb=" << born/me2() << " Base Diagram:"
<< (XMap.find(1)->second.second > 0 ? "+" : "-") << proc[XMap.find(1)->second.first]->PDGName() << " "
<< (XMap.find(3)->second.second > 0 ? "+" : "-") << proc[XMap.find(3)->second.first]->PDGName() << " -> "
<< (XMap.find(2)->second.second > 0 ? "+" : "-") << proc[XMap.find(2)->second.first]->PDGName() << " "
<< (XMap.find(4)->second.second > 0 ? "+" : "-") << proc[XMap.find(4)->second.first]->PDGName() << " "
<< (XMap.find(5)->second.second > 0 ? "+" : "-") << proc[XMap.find(5)->second.first]->PDGName() << " "
<< (XMap.find(6)->second.second > 0 ? "+" : "-") << proc[XMap.find(6)->second.first]->PDGName() << "\n";
generator()->log() << "OneisNC= " << topologyOneIsNC()
<< " OneisCC= " << topologyOneIsCC()
<< " TwoisNC= " << topologyTwoIsNC()
<< " TwoisCC= " << topologyTwoIsCC()
<< "\n";
generator()->log() << "sign[0]="<< sign[0]<< " xmap(1)="<< XMap.find(1)->second.second << "\n";
generator()->log() << "sign[2]="<< sign[2]<< " xmap(3)="<< XMap.find(3)->second.second << "\n";
generator()->log() << "sign[1]="<< sign[1]<< "\n";
generator()->log() << "sign[3]="<< sign[3]<< "\n";
generator()->log() << "sign[4]="<< sign[4]<< "\n";
generator()->log() << "sign[5]="<< sign[5]<< "\n";
generator()->log() << "Recl1[0]="<< Recl1[0] << " Recl3[0]=" << Recl3[0] << "\n";
generator()->log() << "Recr1[0]="<< Recr1[0] << " Recr3[0]=" << Recr3[0] << "\n";
generator()->log() << "Imcl1[0]="<< Imcl1[0] << " Imcl3[0]=" << Imcl3[0] << "\n";
generator()->log() << "Imcr1[0]="<< Imcr1[0] << " Imcr3[0]=" << Imcr3[0] << "\n";
generator()->log() << "Reghvv[0]="<< Reghvv[0]<< " Imghvv[0]=" << Imghvv[0] << "\n";
generator()->log() << "Mass[0]="<< mass[0] << "\n";
generator()->log() << "Recl1[1]="<< Recl1[1] << " Recl3[0]=" << Recl3[1] << "\n";
generator()->log() << "Recr1[1]="<< Recr1[1] << " Recr3[0]=" << Recr3[1] << "\n";
generator()->log() << "Imcl1[1]="<< Imcl1[1] << " Imcl3[0]=" << Imcl3[1] << "\n";
generator()->log() << "Imcr1[1]="<< Imcr1[1] << " Imcr3[0]=" << Imcr3[1] << "\n";
generator()->log() << "Reghvv[1]="<< Reghvv[1] << " Imghvv[1]="<<Imghvv[1] << "\n";
generator()->log() << "Mass[1]="<< mass[1] << "\n";
generator()->log() << "born=" << born << "\n";
- generator()->log() << "me2=" << me2()*LastMatchboxXCombInfo::crossingSign() << "\n";
+ generator()->log() << "me2=" << me2() << "\n";
generator()->log() << "--------------------- \n";
#endif
- return LastMatchboxXCombInfo::crossingSign()*res;
+ lastOneLoopInterference(res);
+
+ return lastOneLoopInterference();
}
double Amplitudehqqbarkkbarg::oneLoopDoublePole() const {
const map<int, pair<int, double> >& transmap = virtualInfo();
double pbar1[4];
double pbar2[4];
double pbar3[4];
double pbar4[4];
double pbar5[4];
double pbar6[4];
convert(meMomenta()[transmap.find(1)->second.first],pbar1);
convert(meMomenta()[transmap.find(3)->second.first],pbar3);
convert(meMomenta()[transmap.find(2)->second.first],pbar2);
convert(meMomenta()[transmap.find(4)->second.first],pbar4);
convert(meMomenta()[transmap.find(5)->second.first],pbar5);
convert(meMomenta()[transmap.find(6)->second.first],pbar6);
int sign[6];
for ( size_t k = 0; k < 6; ++k )
sign[k] = (int) transmap.find(k+1)->second.second;
double Recl1[2];
double Recr1[2];
double Recl3[2];
double Recr3[2];
double Reghvv[2];
double Imcl1[2];
double Imcr1[2];
double Imcl3[2];
double Imcr3[2];
double Imghvv[2];
double mass[2];
double width[2];
int IsVaW[2];
getCouplings(Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,Reghvv,Imghvv,
mass,width,IsVaW);
double NF = nLight();
int gaugegood[3];
int gaugebad[3];
int divMax = 2;
double born;
double virt[3];
double scale = mu2()/GeV2;
double gt = theGaugeThreshold;
double gacc(0.);
#ifdef AMPVERBOSE
generator()->log()<<"scale="<<scale << "\n";
#endif
F77_qqhqqgvbf (pbar1,pbar2,pbar3,pbar4,pbar5,pbar6,sign,Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,mass,width,IsVaW,divMax,gaugegood,gaugebad,
gt,gacc,Reghvv,Imghvv,
scale,NF,born,virt);
double res = 2.*sqr(SM().alphaS())*virt[2]*pow(lastSHat()/GeV2,2);
if (gaugebad[0]+gaugebad[1]+gaugebad[2]) {
throw Veto();
}
/*generator()->log() << "c2="<< virt[2]/born << "\n";
generator()->log() << "c1="<< virt[1]/born << "\n";
generator()->log() << "c0="<< virt[0]/born << "\n";
*/
- return LastMatchboxXCombInfo::crossingSign()*res;
+ return res;
}
double Amplitudehqqbarkkbarg::oneLoopSinglePole() const {
const map<int, pair<int, double> >& transmap = virtualInfo();
double pbar1[4];
double pbar2[4];
double pbar3[4];
double pbar4[4];
double pbar5[4];
double pbar6[4];
convert(meMomenta()[transmap.find(1)->second.first],pbar1);
convert(meMomenta()[transmap.find(3)->second.first],pbar3);
convert(meMomenta()[transmap.find(2)->second.first],pbar2);
convert(meMomenta()[transmap.find(4)->second.first],pbar4);
convert(meMomenta()[transmap.find(5)->second.first],pbar5);
convert(meMomenta()[transmap.find(6)->second.first],pbar6);
int sign[6];
for ( size_t k = 0; k < 6; ++k )
sign[k] = (int) transmap.find(k+1)->second.second;
double Recl1[2];
double Recr1[2];
double Recl3[2];
double Recr3[2];
double Reghvv[2];
double Imcl1[2];
double Imcr1[2];
double Imcl3[2];
double Imcr3[2];
double Imghvv[2];
double mass[2];
double width[2];
int IsVaW[2];
getCouplings(Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,Reghvv,Imghvv,
mass,width,IsVaW);
double NF = nLight();
int gaugegood[3];
int gaugebad[3];
int divMax = 2;
double born;
double virt[3];
double scale = mu2()/GeV2;
double gt = theGaugeThreshold;
double gacc(0.);
#ifdef AMPVERBOSE
generator()->log()<<"scale="<<scale << "\n";
#endif
F77_qqhqqgvbf (pbar1,pbar2,pbar3,pbar4,pbar5,pbar6,sign,Recl1,Recr1,Recl3,Recr3,
Imcl1,Imcr1,Imcl3,Imcr3,
mass,width,IsVaW,divMax,gaugegood,gaugebad,gt,gacc,Reghvv,Imghvv,
scale,NF,born,virt);
double res = 2.*sqr(SM().alphaS())*virt[1]*pow(lastSHat()/GeV2,2);
if (gaugebad[0]+gaugebad[1]+gaugebad[2]) {
throw Veto();
}
/*
generator()->log() << "NLight= "<<NF<< "\n";
generator()->log() << "c2="<< virt[2]/born << "\n";
generator()->log() << "c1="<< virt[1]/born << "\n";
generator()->log() << "c0="<< virt[0]/born << "\n";
const cPDVector& proc = mePartonData();
double CA1 = 3.;
double CF1 = 4./3.;
double msq = me2();
double two(2.);
double cTaTb = colourCorrelatedME2(pair<int,int>(0,1))*
(proc[0]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/abs((meMomenta()[0] + meMomenta()[1]).m2()));
double cT1T2 = colourCorrelatedME2(pair<int,int>(2,3))*
(proc[2]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/abs((meMomenta()[2] + meMomenta()[3]).m2()));
double cT1T3 = colourCorrelatedME2(pair<int,int>(2,4))*
(proc[2]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[2] + meMomenta()[4]).m2())));
double cT2T3 = colourCorrelatedME2(pair<int,int>(3,4))*
(proc[3]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[3] + meMomenta()[4]).m2())));
double cTaT1 = colourCorrelatedME2(pair<int,int>(0,2))*
(proc[0]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[0] + meMomenta()[2]).m2())));
double cTaT2 = colourCorrelatedME2(pair<int,int>(0,3))*
(proc[0]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[0] + meMomenta()[3]).m2())));
double cTaT3 = colourCorrelatedME2(pair<int,int>(0,4))*
(proc[0]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[0] + meMomenta()[4]).m2())));
double cTbT1 = colourCorrelatedME2(pair<int,int>(1,2))*
(proc[1]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[1] + meMomenta()[2]).m2())));
double cTbT2 = colourCorrelatedME2(pair<int,int>(1,3))*
(proc[1]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[1] + meMomenta()[3]).m2())));
double cTbT3 = colourCorrelatedME2(pair<int,int>(1,4))*
(proc[1]->id() == ParticleID::g ? CA1 : CF1)*log(scale*GeV2/(abs((meMomenta()[1] + meMomenta()[4]).m2())));
generator()->log() <<"CA1"<<CA1<< "\n";
double gammaQuark = (3./2.)*CF1;
double gammaGluon = (11./6.)*CA1 - (1./3.)*NF;
double cfac(4.*gammaQuark+gammaGluon);
double res1 =-cfac*msq+2.*(cT1T2 + cT1T3 + cTaT1 + cTbT1 + cT2T3 + cTaT2+ cTbT2 + cTaT3 + cTbT3 + cTaTb);
double gs2(SM().alphaS()*4.*Constants::pi);
born*=pow(lastSHat()/GeV2,2)*gs2;
generator()->log()<<"res1/born="<<res1/me2()<<"\n";
*/
/*
- double mm = LastMatchboxXCombInfo::crossingSign()*me2();
+ double mm = me2();
born *= pow(lastSHat()/GeV2,2);
double delta = abs((mm-born)/(mm+born));
if ( mm < 0.0 || born < 0.0 ) {
cerr << "in ";
for ( cPDVector::const_iterator p = mePartonData().begin();
p != mePartonData().end(); ++p )
cerr << (**p).PDGName() << " ";
cerr << setprecision(20);
cerr << "\nfatal : mm = " << mm << " born = " << born << "\n" << flush;
}
if ( delta > 1.e-12 ) {
cerr << "in ";
for ( cPDVector::const_iterator p = mePartonData().begin();
p != mePartonData().end(); ++p )
cerr << (**p).PDGName() << " ";
cerr << setprecision(20);
cerr << "\nproblem : mm = " << mm << " born = " << born
<< " -> delta = " << delta << "\n" << flush;
}
*/
- return LastMatchboxXCombInfo::crossingSign()*res;
+ return res;
}
// If needed, insert default implementations of virtual function defined
// in the InterfacedBase class here (using ThePEG-interfaced-impl in Emacs).
void Amplitudehqqbarkkbarg::persistentOutput(PersistentOStream & os) const {
os << theGaugeThreshold;
}
void Amplitudehqqbarkkbarg::persistentInput(PersistentIStream & is, int) {
is >> theGaugeThreshold;
}
// *** Attention *** The following static variable is needed for the type
// description system in ThePEG. Please check that the template arguments
// are correct (the class and its base class), and that the constructor
// arguments are correct (the class name and the name of the dynamically
// loadable library where the class implementation can be found).
DescribeClass<Amplitudehqqbarkkbarg,AmplitudeBase>
describeHJetsAmplitudehqqbarkkbarg("HJets::Amplitudehqqbarkkbarg", "HwMatchboxBuiltin.so HJets.so");
void Amplitudehqqbarkkbarg::Init() {
static ClassDocumentation<Amplitudehqqbarkkbarg> documentation
("Helicity amplitudes for 0 -> h q qbar k kbar g");
static Parameter<Amplitudehqqbarkkbarg,double> interfaceGaugeThreshold
("GaugeThreshold",
"The threshold for gauge check failure.",
&Amplitudehqqbarkkbarg::theGaugeThreshold, 0.1, 0.0, 0,
false, false, Interface::lowerlim);
static Switch<Amplitudehqqbarkkbarg,bool> interfaceAccuracyCheck
("AccuracyCheck",
"Turn on check of accuracy of box,pentagon, and hexagons.",
&Amplitudehqqbarkkbarg::theAccuracyCheck, false, false, false);
static SwitchOption interfaceAccuracyCheckOn
(interfaceAccuracyCheck,
"On",
"On",
true);
static SwitchOption interfaceAccuracyCheckOff
(interfaceAccuracyCheck,
"Off",
"Off",
false);
}
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
--- a/INSTALL
+++ /dev/null
@@ -1,365 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-
- Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved. This file is offered as-is,
-without warranty of any kind.
-
-Basic Installation
-==================
-
- Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package. The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package. Some packages provide this
-`INSTALL' file but do not implement all of the features documented
-below. The lack of an optional feature in a given package is not
-necessarily a bug. More recommendations for GNU packages can be found
-in *note Makefile Conventions: (standards)Makefile Conventions.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
- It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring. Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
- The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'. You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
- The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system.
-
- Running `configure' might take a while. While running, it prints
- some messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package, generally using the just-built uninstalled binaries.
-
- 4. Type `make install' to install the programs and any data files and
- documentation. When installing into a prefix owned by root, it is
- recommended that the package be configured and built as a regular
- user, and only the `make install' phase executed with root
- privileges.
-
- 5. Optionally, type `make installcheck' to repeat any self-tests, but
- this time using the binaries in their final installed location.
- This target does not install anything. Running this target as a
- regular user, particularly if the prior `make install' required
- root privileges, verifies that the installation completed
- correctly.
-
- 6. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
- 7. Often, you can also type `make uninstall' to remove the installed
- files again. In practice, not all packages have tested that
- uninstallation works correctly, even though it is required by the
- GNU Coding Standards.
-
- 8. Some packages, particularly those that use Automake, provide `make
- distcheck', which can by used by developers to test that all other
- targets like `make install' and `make uninstall' work correctly.
- This target is generally not run by end users.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. Run `./configure --help'
-for details on some of the pertinent environment variables.
-
- You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment. Here
-is an example:
-
- ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
- *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you can use GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'. This
-is known as a "VPATH" build.
-
- With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory. After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
- On MacOS X 10.5 and later systems, you can create libraries and
-executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor. Like
-this:
-
- ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
- CPP="gcc -E" CXXCPP="g++ -E"
-
- This is not guaranteed to produce working output in all cases, you
-may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
-
-Installation Names
-==================
-
- By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc. You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
-absolute file name.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
- In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files. Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them. In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
-specifications that were not explicitly provided.
-
- The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
-both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
-having to reconfigure or recompile.
-
- The first method involves providing an override variable for each
-affected directory. For example, `make install
-prefix=/alternate/directory' will choose an alternate location for all
-directory configuration variables that were expressed in terms of
-`${prefix}'. Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated. The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
- The second method involves providing the `DESTDIR' variable. For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names. The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
-does not work on platforms that have drive letters. On the other hand,
-it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
-
-Optional Features
-=================
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
- Some packages offer the ability to configure how verbose the
-execution of `make' will be. For these packages, running `./configure
---enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
---disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
-
-Particular systems
-==================
-
- On HP-UX, the default C compiler is not ANSI C compatible. If GNU
-CC is not installed, it is recommended to use the following options in
-order to use an ANSI C compiler:
-
- ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
-
-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
-
- On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file. The option `-nodtk' can be used as
-a workaround. If GNU CC is not installed, it is therefore recommended
-to try
-
- ./configure CC="cc"
-
-and if that doesn't work, try
-
- ./configure CC="cc -nodtk"
-
- On Solaris, don't put `/usr/ucb' early in your `PATH'. This
-directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
-
- On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'. It is recommended to use the following options:
-
- ./configure --prefix=/boot/common
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on. Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
- CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
- OS
- KERNEL-OS
-
- See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
- If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
- If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
- Variables not defined in a site shell script can be set in the
-environment passed to `configure'. However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost. In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'. For example:
-
- ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug. Until the bug is fixed you can use this workaround:
-
- CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
- Print a summary of all of the options to `configure', and exit.
-
-`--help=short'
-`--help=recursive'
- Print a summary of the options unique to this package's
- `configure', and exit. The `short' variant lists options used
- only in the top level, while the `recursive' variant lists options
- also present in any nested packages.
-
-`--version'
-`-V'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`--cache-file=FILE'
- Enable the cache: use and save the results of the tests in FILE,
- traditionally `config.cache'. FILE defaults to `/dev/null' to
- disable caching.
-
-`--config-cache'
-`-C'
- Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made. To
- suppress all normal output, redirect it to `/dev/null' (any error
- messages will still be shown).
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`--prefix=DIR'
- Use DIR as the installation prefix. *note Installation Names::
- for more details, including other options available for fine-tuning
- the installation locations.
-
-`--no-create'
-`-n'
- Run the configure checks, but stop before creating any output
- files.
-
-`configure' also accepts some other, not widely useful, options. Run
-`configure --help' for more details.
-
diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -0,0 +1,8 @@
+HJets++ News -*- outline -*-
+================================================================================
+
+* HJets 1.1 released
+** a major bug has been fixed as the 3-jet virtual contributions
+ used a convention which has not been supported anymore by Matchbox
+
+
diff --git a/README b/README
--- a/README
+++ b/README
@@ -1,43 +1,44 @@
################################################################################
# #
# HJets++ 1.0 #
# ========================================================================== #
# A Matchbox plugin for electroweak Higgs plus #
# two and three jet production at NLO QCD #
# #
# #
# (C) 2012-2014 The HJets++ collaboration #
# ------------------------------------------------------------ #
# Francisco Campanario <francisco.campanario@ific.uv.es> #
# Terrance M. Figy <terrance.figy@hep.manchester.ac.uk> #
# Simon Platzer <simon.plaetzer@desy.de> #
# Malin Sjodahl <malin.sjodahl@thep.lu.se> #
# ------------------------------------------------------------ #
# #
# #
# ========================================================================== #
# #
# HJets++ is licenced under version 2 of the GPL, see COPYING for details. #
# Please respect the MCnet academic guidelines, see GUIDELINES for details. #
# #
# When using HJets++ please cite: #
# #
# F. Campanario, T.M. Figy, S. Platzer and M. Sjodahl: #
# 'Electroweak Higgs plus Three Jet Production at NLO QCD', #
# Phys.Rev.Lett. 111 (2013) 211802, arXiv:1308.2932 [hep-ph] #
# #
################################################################################
Installation
============
-A Herwig++ installation with versions >= 3.0 is required to use HJets++
+A Herwig++ installation with versions >= 3.0 (i.e. Herwig 7.0) is required to
+use HJets++
--with-herwig=path
-informs HJets++'s configure where to look for the Herwig++
+informs HJets++'s configure where to look for the Herwig 7
installation. Installation then proceeds as usual with make and make
-install. Example usage of HJets++ is provided along with the Herwig++
-releases from version 3.0 onwards.
+install. Example usage of HJets++ is provided along with the Herwig 7
+releases.
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,48 +1,51 @@
dnl Process this file with autoconf to produce a configure script.
AC_PREREQ([2.59])
-AC_INIT([HJets],[SVN],[simon.plaetzer@desy.de],[HJets])
+AC_INIT([HJets],[1.1],[simon.plaetzer@desy.de],[HJets])
AC_CONFIG_AUX_DIR([config])
AC_CONFIG_MACRO_DIR([m4])
-AC_CONFIG_SRCDIR(["m4/$PACKAGE_TARNAME.m4"])
+AC_CONFIG_SRCDIR([Amplitudes/AmplitudeBase.h])
AC_CANONICAL_HOST
if test -n "$F77" ; then
AC_MSG_ERROR([F77 is set internally. Please use FC to specify a non-default Fortran compiler.])
fi
AC_LANG([C++])
AM_INIT_AUTOMAKE([1.9 gnu subdir-objects dist-bzip2 -Wall])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl Checks for programs.
+
+AC_PROG_CC
+AC_PROG_CXX
+
AC_PROG_FC([gfortran])
-AC_PROG_F77([gfortran])
-AC_PROG_CXX
+AC_SUBST([F77],[$FC])
+
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_LN_S
-AM_PROG_AR
+m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
-AC_DISABLE_STATIC
-AC_LIBTOOL_DLOPEN
-AC_PROG_LIBTOOL
+LT_PREREQ([2.2.6])
+LT_INIT([disable-static dlopen pic-only])
HJETS_CHECK_HERWIG
HJETS_FORTRAN_FLAGS
AC_CONFIG_FILES([Amplitudes/Makefile
Amplitudes/AmplitudeBase.cc
Virtuals/Amplitudes/Makefile
Virtuals/Integrals/Makefile
Virtuals/MatrixElement/Makefile
Virtuals/TenRed/Makefile
Virtuals/Utilities/Makefile
Virtuals/OneLOop/Makefile
Virtuals/Makefile
include/Makefile
src/Makefile
Makefile])
AC_OUTPUT
diff --git a/m4/HJets.m4 b/m4/HJets.m4
--- a/m4/HJets.m4
+++ b/m4/HJets.m4
@@ -1,48 +1,48 @@
-dnl --- check for Herwig++ --
+dnl --- check for Herwig 7 --
AC_DEFUN([HJETS_CHECK_HERWIG],
[
defaultlocation="${prefix}"
test "x$defaultlocation" = xNONE && defaultlocation="${ac_default_prefix}"
-AC_MSG_CHECKING([for Herwig++/Matchbox in])
+AC_MSG_CHECKING([for Herwig 7 in])
AC_ARG_WITH(herwig,
- AC_HELP_STRING([--with-herwig=DIR],[location of Herwig++ installation]),
+ AC_HELP_STRING([--with-herwig=DIR],[location of Herwig 7 installation]),
[],
[with_herwig="${defaultlocation}"])
AC_MSG_RESULT([$with_herwig])
AS_IF([test "x$with_herwig" != "xno"],
[AC_CHECK_FILES(
${with_herwig}/bin/herwig-config,
[have_herwig=yes], [have_herwig=no])],
[have_herwig=no])
AS_IF([test "x$have_herwig" = "xyes"],
[HERWIGCPPFLAGS=`${with_herwig}/bin/herwig-config --cppflags`
HERWIGLDFLAGS=`${with_herwig}/bin/herwig-config --ldflags`
HERWIGLDLIBS=`${with_herwig}/bin/herwig-config --ldlibs`
],
[AS_IF([test "x$with_herwig" != "xno"],
[AC_MSG_ERROR([Cannot build HJets without Herwig. Please set --with-herwig.])
])
])
AM_CPPFLAGS="-I\$(top_builddir)/include $HERWIGCPPFLAGS"
AM_LDFLAGS="$HERWIGLDFLAGS $HERWIGLDLIBS"
AC_SUBST(AM_CPPFLAGS)
AC_SUBST(AM_LDFLAGS)
])
dnl --- set fortran flags ---
AC_DEFUN([HJETS_FORTRAN_FLAGS],
[
AM_FCFLAGS="$AM_FCFLAGS -fno-automatic -ffixed-line-length-none"
AM_FFLAGS="$AM_FFLAGS -fno-automatic -ffixed-line-length-none"
AC_SUBST(AM_FCFLAGS)
AC_SUBST(AM_FFLAGS)
])
diff --git a/src/HJetsProcesses.in b/src/HJetsProcesses.in
--- a/src/HJetsProcesses.in
+++ b/src/HJetsProcesses.in
@@ -1,25 +1,35 @@
+# -*- ThePEG-repository -*-
+
cd /Herwig/MatrixElements/Matchbox/Amplitudes
mkdir HJets
cd HJets
create HJets::Amplitudehqqbarkkbar Amplitudehqqbarkkbar
set Amplitudehqqbarkkbar:ColourBasis /Herwig/MatrixElements/Matchbox/Amplitudes/TraceBasis
create HJets::Amplitudehqqbarkkbarg Amplitudehqqbarkkbarg
set Amplitudehqqbarkkbarg:ColourBasis /Herwig/MatrixElements/Matchbox/Amplitudes/TraceBasis
create HJets::Amplitudehqqbarkkbargg Amplitudehqqbarkkbargg
set Amplitudehqqbarkkbargg:ColourBasis /Herwig/MatrixElements/Matchbox/Amplitudes/TraceBasis
create HJets::Amplitudehqqbarkkbarrrbar Amplitudehqqbarkkbarrrbar
set Amplitudehqqbarkkbarrrbar:ColourBasis /Herwig/MatrixElements/Matchbox/Amplitudes/TraceBasis
-insert /Herwig/MatrixElements/Matchbox/PPFactory:Amplitudes 0 Amplitudehqqbarkkbar
-insert /Herwig/MatrixElements/Matchbox/PPFactory:Amplitudes 0 Amplitudehqqbarkkbarg
-insert /Herwig/MatrixElements/Matchbox/PPFactory:Amplitudes 0 Amplitudehqqbarkkbargg
-insert /Herwig/MatrixElements/Matchbox/PPFactory:Amplitudes 0 Amplitudehqqbarkkbarrrbar
+insert /Herwig/MatrixElements/Matchbox/Factory:Amplitudes 0 Amplitudehqqbarkkbar
+insert /Herwig/MatrixElements/Matchbox/Factory:Amplitudes 0 Amplitudehqqbarkkbarg
+insert /Herwig/MatrixElements/Matchbox/Factory:Amplitudes 0 Amplitudehqqbarkkbargg
+insert /Herwig/MatrixElements/Matchbox/Factory:Amplitudes 0 Amplitudehqqbarkkbarrrbar
insert /Herwig/MatrixElements/Matchbox/Utility/DiagramGenerator:ExcludeVertices 0 /Herwig/Vertices/FFPVertex
insert /Herwig/MatrixElements/Matchbox/Utility/DiagramGenerator:ExcludeVertices 0 /Herwig/Vertices/FFHVertex
-insert /Herwig/MatrixElements/Matchbox/Utility/DiagramGenerator:ExcludeVertices 0 /Herwig/Vertices/HGGVertex
\ No newline at end of file
+insert /Herwig/MatrixElements/Matchbox/Utility/DiagramGenerator:ExcludeVertices 0 /Herwig/Vertices/HGGVertex
+
+cd /Herwig/Particles
+
+set h0:HardProcessWidth 0*GeV
+do W+:UnsetHardProcessWidth
+do W-:UnsetHardProcessWidth
+do Z0:UnsetHardProcessWidth
+

File Metadata

Mime Type
text/x-diff
Expires
Tue, Nov 19, 7:31 PM (1 d, 11 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805839
Default Alt Text
(97 KB)

Event Timeline