Page MenuHomeHEPForge

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
This document is not UTF8. It was detected as ISO-8859-1 (Latin 1) and converted to UTF8 for display.
diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -1,70 +1,69 @@
-\.svn/.*
-Makefile
-Makefile\.in
-\.deps
-\.libs
-.*\.l[ao]
-.*\.so\.*
-.*\.o
-.*~
-.*\.pyc
-.*\.codereplace
-.*\.tar\.(gz|bz2)
-autom4te.cache
-config.herwig
-config.log
-config.status
-configure
-include/Herwig\+\+
-Config/config.guess
-Config/config.h
-Config/config.h.in
-Config/config.sub
-Config/depcomp
-Config/compile
-Config/install-sh
-Config/missing
-Config/stamp-h1
-Config/ar-lib
-Contrib/make_makefiles.sh
-Doc/HerwigDefaults.in
-Doc/fixinterfaces.pl
-Doc/refman.conf
-Doc/refman.h
-Doc/AllInterfaces.h
-Doc/HerwigDefaults.rpo
-Doc/Herwig\+\+-refman.tag
-(src|Utilities)/version.tmp
-(src|Utilities)/version.tmp.new
-INSTALL
-Makefile
-Makefile.in
-Utilities/versionstring.h
-aclocal.m4
-confdefs.h
-conftest.c
-conftest.err
-include/done-all-links
-libtool
-\.dirstamp
-src/herwigopts.h
-src/herwigopts.c
-src/defaults/Analysis.in
-src/herwig-config
-src/.*\.(run|tex|out|log|rpo|spc|top|dump|dot|aux|pdf|ps|png|svg|hepmc|dvi)
-lib/done-all-links
-lib/apple-fixes
-src/Herwig\+\+
-src/defaults/PDF.in
-src/defaults/done-all-links
-src/versionstring.h
-src/tune
-src/tests/.*\.(time|mult|Bmult|chisq)
-Tests/.*/.*\.(top|ps|pyc|info|dat|pdf|png)
-Tests/.*\.(top|ps|pyc|info|dat|pdf|png)
-Tests/.*\.(top|run|tex|mult|Bmult|aida|yoda)
-Tests/Rivet-.*
-Tests/plots
-Tests/.*index.html
-Herwig\+\+\-.\..\..
-Models/Feynrules/python/.*\.(cc|h|run|tex|model|spc)
+Makefile$
+Makefile\.in$
+\.deps$
+\.libs$
+\.l[ao]$
+\.so$
+\.so\.
+\.o$
+~$
+\.pyc$
+\.codereplace$
+\.orig$
+\.tar\.(gz|bz2)$
+^autom4te.cache$
+^config.herwig$
+^config.log$
+^config.status$
+^configure$
+^include/Herwig\+\+$
+^Config/config.guess$
+^Config/config.h$
+^Config/config.h.in$
+^Config/config.sub$
+^Config/depcomp$
+^Config/compile$
+^Config/install-sh$
+^Config/missing$
+^Config/stamp-h1$
+^Config/ar-lib$
+^Contrib/make_makefiles.sh$
+^Doc/HerwigDefaults.in$
+^Doc/fixinterfaces.pl$
+^Doc/refman.conf$
+^Doc/refman.h$
+^Doc/AllInterfaces.h$
+^Doc/HerwigDefaults.rpo$
+^Doc/Herwig\+\+-refman.tag$
+^(src|Utilities)/version.tmp$
+^(src|Utilities)/version.tmp.new$
+^(src|Utilities)/versionstring.h$
+^INSTALL$
+^aclocal.m4$
+^confdefs.h$
+^conftest.c$
+^conftest.err$
+^include/done-all-links$
+^libtool$
+\.dirstamp$
+^src/herwigopts.h$
+^src/herwigopts.c$
+^src/defaults/Analysis.in$
+^src/herwig-config$
+^src/.*\.(run|tex|out|log|rpo|spc|top|dump|dot|aux|pdf|ps|png|svg|hepmc|dvi)$
+^src/Makefile-UserModules$
+^lib/done-all-links$
+^lib/apple-fixes$
+^src/Herwig\+\+
+^src/defaults/PDF.in$
+^src/defaults/done-all-links$
+^src/tune$
+^src/tests/.*\.(time|mult|Bmult|chisq)$
+^Tests/.*/.*\.(top|ps|pyc|info|dat|pdf|png)$
+^Tests/.*\.(top|ps|pyc|info|dat|pdf|png)$
+^Tests/.*\.(top|run|tex|mult|Bmult|aida|yoda)$
+^Tests/Rivet-.*$
+^Tests/plots$
+^Tests/.*index.html$
+^Herwig\+\+\-
+^Models/Feynrules/python/Makefile-FR$
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -1,12 +1,13 @@
168ae2110e964d62fbc1331a1c2e095952a67748 release-2-5-2
3abb4fa42e20e332796c2572334c2d77204cd0e0 release-2-4-2
4796ca080aafd5daa3b7349b015cb1df944428a2 release-2-5-0
76da042f056eb153981b4d005d5474ffb90a5e88 release-2-4-1
81a684a558413c69df314365eabf09893ffd43d8 release-2-6-0
bd75cd00d99f4bdbaed992daf98f0a73c0f91e9b release-2-4-0
ff6ecc8d49ce10299303b050394bd5cb5837f1c3 release-2-5-1
d0389f5453b2c210923e1adc7b872b18269de668 release-2-6-1
f8998033021185942533b824607285feb3fbd2dc release-2-6-1a
cead23e428b9aacaf2d709e722624e54f844498b release-2-6-1b
191db4655439045f912cb21bd905e729d59ec7bc release-2-6-2
edb538156e9c3d64bb842934b4cebf0126aeb9ea release-2-6-3
+eb4a104591859ecac18746b1ad54d6aa0c2a5d1a release-2-7-0
diff --git a/AUTHORS b/AUTHORS
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,37 +1,41 @@
============
-Herwig++ 2.6
+Herwig++ 2.7
============
Please contact <herwig@projects.hepforge.org> for any queries.
========
Authors:
========
Ken Arnold
-Luca d'Errico
+Johannes Bellm
+Nadine Fischer
Stefan Gieseke
David Grellscheid
Keith Hamilton
Andreas Papaefstathiou
Simon Plätzer
Peter Richardson
Christian Röhr
Alex Schofield
+Thomas Schuh
Mike Seymour
Andrzej Siódmok
Martin Stoll
-Bryan Webber
David Winn
+Benedikt Zimmermann
===============
Former authors:
===============
Manuel Bähr
+Luca d'Errico
Martyn Gigg
Seyi Latunde-Dada
Alberto Ribon
Pavel Růžička
Alexander Sherstnev
Philip Stephens
Louise Suter
Jon Tully
+Bryan Webber
diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,2000 +1,2000 @@
Please consult the version control log file for newer entries.
-2009-09-30 Leif Lönnblad <Leif.Lonnblad@thep.lu.se>
+2009-09-30 Leif Lönnblad <Leif.Lonnblad@thep.lu.se>
* src/defaults/HerwigDefaults.in: Change the way the
DefaultStrategy object select which particles are included in a
run.
-2009-09-29 Leif Lönnblad <Leif.Lonnblad@thep.lu.se>
+2009-09-29 Leif Lönnblad <Leif.Lonnblad@thep.lu.se>
* src/Makefile.am (install-data-hook): Install the Herwig
repository inside the default ThePEG repository.
* PDT/GenericMassGenerator.cc,
PDT/GenericWidthGenerator.cc (setParticle): First check if the
argument is a valid name of a (particle) object, then check if
the argument is a general particle name.
2006-10-27 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/Susy/* : Tidy up and correction of some minor errors
* MatrixElement/{MEff2ff, MEff2ss, MEfv2fs, MEvv2ff, MEvv2ss} : Tidy up
of code and moved of diagrams and getDiagrams functions to base class
since they are generic
* MatrixElement/GeneralHardME.{h, cc} : Implemented getDiagrams()
member function here instead of in derived classes
* Models/General/HardProcessConstructor.cc : Tidy up of code
* Models/General/HPDiagram : Fixed doxygen warning and removed
uneeded ThePEG header
2006-10-23 Martyn Gigg <m.a.gigg@dur.ac.uk>
* MatrixElement/VVFFbarME.*, VVSSME.*, FFbarSSME.* : Renamed matrix
elements to be more in line with naming convention
* Models/General/HardProcessConstructor.{h, cc} : Changes to reflect
renaming of MatrixElements
2006-10-19 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/Susy/SSCNZWVertex.* : Added chargino-neutralino-W
vertex.
* Helicity/Vertex/Susy/* : Various corrections to vertices.
* Models/Susy/SusyBase.{h, cc} : Added SSCNWVertex to vertex list
2006-10-19 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/Susy/SSCC{Z, P}Vertex.* : Added chargino-chargino-photon
and chargino-chargino-Z vertices
* Models/Susy/SusyBase.{h, cc} : Added new vertices to list
2006-10-18 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/Scalar/FFSVertex.{h, cc} : Added an integer param to
the setCoupling method to identify off-shell particle in vertex
* Helicity/Vertex/Susy/* : Fixed compiler warnings and various bugs
within the majorana vertices
* Helicity/Vertex/StandardModel/SMFFHVertex.h : Updated to use new
setCoupling method in FFSVertex
* Decay/General/FFSDecayer.cc, Decay/General/SFFDecayer.cc : Updated to
use new setCoupling in FFSVertex
2006-10-10 Martyn Gigg <m.a.gigg@dur.ac.uk>
* MatrixElement/MEff2ff.* : Added matrix element for ffbar to ffbar
* MatrixElement/MEfv2fs.cc : Corrected diagram calculation
* Models/General/HardProcessConstructor.cc, HPDiagram.icc : Changes in
line with matrix element changes
* Helicity/Vertex/Susy/SSNNZVertex.* : Added neutralino-neutralino-
Z vertex
* Helicity/Vertex/Susy/SSCFSVertex.icc : Fixed typo with sin2Theta
where sqrt was forgotten
* Models/Susy/SusyBase.{h, cc} : Added SSNNZVertex to list of vertices
within the Model
2006-10-03 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/General/HPDiagram.*, Models/General/HardProcessConstructor.* :
Changes to the way colourflows are calculated
* MatrixElement/GeneralHardME.* : Changes in matrix element
implementation to reflect the changes in the HardProcessConstructor
and HPDiagram
* Helicity/Vertex/StandardModel/*.icc, Helicity/Vertex/Susy/*.icc :
Replaced memebrs that set the order in alphaS and alphaEM that had
been removed
* Helicity/Vertex/Susy/{SSGFSVertex.cc, SSNFSVertex.cc} : Changed
setCoupling so that vertex is evaluated properly if fermion flow
direction is reversed
2006-08-18 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/General/HPDiagram.{h, icc} : Split off declaration of
HPDiagram structure to separate file and made some changes to the
information that it stores so that MEDiagram in GeneralHardME could
be removed
* Models/General/HardProcessConstructor.* : Changes to use new
object creation methods of ThePEG and tidy up of code (not complete)
* MatrixElement/{GeneralHardME.*, VVFFbarME.*, VVSSME.*} :
Changes to MatrixElements to be compatible with new way in which
HardProcessConstructor creates them
2006-08-17 Martyn Gigg <m.a.gigg@dur.ac.uk>
* MatrixElement/GeneralHardME.{h, icc, cc},
* MatrixElement/VVFFbar.{h, icc, cc} : Changed the method of
calculating the matrix element colour flows
* Models/StandardModel/StandardModel.{h, cc} : Removed obselete
doinitrun method and removed call to setupModel from doinit
* Models/General/* : Changes to the structure of automatic decayer,
decaymode and matrix element creation to utilise new functions in
ThePEG. Requires up-to-date version of ThePEG.
* Decay/General/* : Removed old members not needed now the decayers
are created properly in the EventGenerator and modeNumber virtual
function is now implemented. This required a new member function
colourConnections() that must be called in the me2() function of
each inheriting decayer.
* src/{LEP.in, Model.in} : Removed double initilisation from LEP.in
and removed reference to model pointer from HardProcessConstructor
* Models/Susy/SusyBase.{h, icc, cc} : Implemented getReferences
virtual function so that MixingMatrix objects get cloned.
* Helicity/Vertex/Susy/* : Removed references to SusyBase object and
changed the way in which MixingMatrices were retrieved. They are now
taken from the current event generator and not the Repository.
* Helicity/Vertex/Scalar/SVVLoopVertex.{h, icc} : Replaced interface
doinit, doinitrun and dofinish members that were mistakenly removed.
* Helicity/Vertex/GeneralSVVVertex.icc : Correctly set the type of
vertex in the constructor
2006-07-26 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/Susy/SusyBase.*, Models/General/TwoBodyDecayConstructor.cc,
* Models/General/HardProcessConstructor.cc: Changed use of stringstream
to comply with the new changes in the ThePEG and uninlined 2 functions
in SusyBase that should not have been inlined
2006-07-24 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/Susy/* : Clean up to tidy up code and remove
some unecessary member functions
2006-07-22 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Helicity/Vertex/*Model/*Vertex.*, Models/*Model/*: Fixed memory
leak problem with theback-references to StandardModel by the Vertex
classes. Cleanup of Vertex classes.
* MatrixElement/*.*cc, Decay/Perturbative/*.cc: Used new Model
typedefs HwSMPtr and HwRSPtr
2006-07-18 Martyn Gigg <m.a.gigg@dur.ac.uk>
* MatrixElement/Makefile.am : Fixed spelling error that meant
some files were not included in tar ball
* src/Model.in : Now creates HardProcessConstructor object
by default
* Helicity/Vertex/Susy/SSGSGSGVertex.* : Added gluon-gluino-
gluino vertex
* Models/Susy/SusyBase.* : Added gluon-gluino-gluino vertex
to list of vertices
* Helicity/Vertex/Susy/SSNFSVertex : Corrected error with
retrieving particle mass
* Helicity/Vertex/Scalar/GeneralSVVVertex.h : Changes so that class
shows up in doxygen documentation
* Shower/ShowerHandler.cc : Changed how to deduce whether a particle
is a decay product
* Models/General/TwoBodyDecayConstructor.cc : Taken out repository
stats output
* Decay/MamboDecayer.cc : Fixed colourlines for decaying colour
octet states
* Decay/General/GeneralTwoBodyDecayer.cc : Taken out statement
printing decay modes
2006-07-07 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Merged latest changes from trunk
2006-07-05 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/Scalar/VSSVeretex.cc : Corrected mistake in
function evaluating the vertex
2006-06-30 Martyn Gigg <m.a.gigg@dur.ac.uk>
* MatrixElement/VVSSME.*, FFbarSSME.*: Added new matrix elements
* Helicity/Vertex/* : Tidy up of documentation and added new gluon
gluon-squark-squark vertex
* lib/Makefile.am : StandardModel vertices are now dynamically loaded
* Models/General/HardProcessConstructor.cc : Changed the way diagrams
are created for matrix elements
* Models/Susy/SusyBase.* : Added new vertex to model
2006-07-22 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Helicity/Vertex/*Model/*Vertex.*, Models/*Model/*: Fixed memory
leak problem with theback-references to StandardModel by the Vertex
classes. Cleanup of Vertex classes.
* MatrixElement/*.*cc, Decay/Perturbative/*.cc: Used new Model
typedefs HwSMPtr and HwRSPtr
2006-06-30 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Models/StandardModel/O2AlphaS.*: changed LambdaQCD() output to
return vector starting with Lambda_0 instead of Lambda_1. In line
with ThePEG
2006-06-30 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Models/StandardModel/O2AlphaS.*: changed LambdaQCD() output to
return vector starting with Lambda_0 instead of Lambda_1. In line
with ThePEG
2006-06-13 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Decay/Perturbative/Makefile.am: SMWZDecayer and SMTopDecayer
need to be built by default. Split out HwPerturbativeHiggsDecay.so
2006-06-13 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Decay/Perturbative/Makefile.am: SMWZDecayer and SMTopDecayer
need to be built by default. Split out HwPerturbativeHiggsDecay.so
2006-06-07 David Grellscheid <David.Grellscheid@durham.ac.uk>
* */Makefile.am, acinclude.m4, configure.ac: New decayers only get
built when requested in configure flag. Apple Looptool problem
fixed. Optionally, all Looptool-dependent code can be disabled.
2006-06-07 David Grellscheid <David.Grellscheid@durham.ac.uk>
* */Makefile.am, acinclude.m4, configure.ac: New decayers only get
built when requested in configure flag. Apple Looptool problem
fixed. Optionally, all Looptool-dependent code can be disabled.
2006-06-01 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Analysis/LEPEventShapes.*, Utilities/Histogram.*,
Utilities/Statistic.*: Added support for weighted events.
* src/Herwig++.cc: counter now only updates for every 1% of events.
2006-06-01 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Analysis/LEPEventShapes.*, Utilities/Histogram.*,
Utilities/Statistic.*: Added support for weighted events.
* src/Herwig++.cc: counter now only updates for every 1% of events.
2006-05-30 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/VertexBase.h (Repository): Added storage for the
order in g_s and alpha_em of the vertex
* Helicity/Vertex/StandardModel, Helicity/Vertex/Susy (Repository) :
Changed vertices to incorporate new method for storing order in
couplings and added gluon-sfermion-sfermion vertex
* MatrixElement/GeneralHardME, MatrixElement/FFbarSSME (Repository):
Added new matrix elements
* Decay/MamboDecayer.*, Decay/General (Repository) : Tidy up
* lib/Makefile.am (Repository) : Statically linked new matrix
element library
* Models/General/* (Repository) : Changed to create new matrix
elements and general tidy up
* Models/Susy/SusyBase.* (Repository) : Incorporate new vertices
into model
* Models/Susy/MixingMatrix.icc (Repository) : Changed constructor to
use initialisation syntax
2006-05-30 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/General (Repository): Added HardProcessConstructor class
* Models/Susy/MixingMatrix (Repository): Modified range checking when
returning element of matrix to use at() member of vector
* Decay/General (Repository): Tidy up of decayers
* Helicity/Vertex/Susy (Repository): Fixed bugs where if was using
assignment rather than testing for equality
2006-06-18 Martyn Gigg <m.a.gigg@dur.ac.uk>
* configure.ac (Repository): Added Susy vertices directory
* Models/StandardModel/O2AlphaS.h (Repository): Merged from main branch
* Models/General (Repository): Modified classes to use new decayers
* Models/Susy (Repository): Modified SusyBase reading member funtion
* Helicity/Vertex/Susy (Repository): Added Susy Directory and Vertices
* Models/General/ (Repository): Added New Decayers and and altered old
ones to change the way they search lists
2006-03-13 Peter Richardson <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEPP2HiggsJet.icc (Repository): added matrix element for gamma
gamma and Higgs + jet production
2006-03-13 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/General/TwoBodyDecayConstructor.cc (Repository): Changed in order to create new decayers
* Models/Makefile.am, configure.ac (Repository): Altered to include Susy directory
* Models/Susy (Repository): Added Susy directory and SusyBase class
2006-03-13 Peter Richardson <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEPP2HiggsJet.icc (Repository): added matrix element for gamma
gamma and Higgs + jet production
2006-03-09 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/General (Repository): Added FFSDecayer,VVVDecayer,SSSDecayer
2006-03-02 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Models/StandardModel/O2AlphaS: Added a 2-loop alphaS class using the same
approach as FORTRAN HERWIG to make comparisions easier.
2006-03-02 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Models/StandardModel/O2AlphaS: Added a 2-loop alphaS class using the same
approach as FORTRAN HERWIG to make comparisions easier.
2006-02-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEPP2GammaJet.h (Repository): spin correlation code added to
gamma+jets ME
2006-02-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEQCD2to2 (Repository): QCD 2-to-2 matrix elements added
2006-02-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEPP2GammaJet.h (Repository): spin correlation code added to
gamma+jets ME
2006-02-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEQCD2to2 (Repository): QCD 2-to-2 matrix elements added
2006-02-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Finished the removal of the VectorMesonDecayerBase and TensorMesonDecayerBase
classes
2006-02-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Base class changed in a number of Vector decayers in preparation for the
removal of the VectorMesonDecayerBase class.
2006-02-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Finished the removal of the VectorMesonDecayerBase and TensorMesonDecayerBase
classes
2006-02-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Base class changed in a number of Vector decayers in preparation for the
removal of the VectorMesonDecayerBase class.
2006-02-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* changes to fix change conservation problems from branch merge
and change base class of TensorMeson2MesonDecayer.
2006-02-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* changes to include the matrix element for gamma+jet
2006-02-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* changes to fix change conservation problems from branch merge
and change base class of TensorMeson2MesonDecayer.
2006-02-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* changes to include the matrix element for gamma+jet
2006-02-20 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/General/TwoBodyDecayConstructor.cc (Repository): Changes to create newly added decayers
* Decay/General (Repository): Added more decayers for bsm study
* Helicity/Vertex/VertexBase.h (Repository): Changed getLeft() and getRight() from protected to public
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): Changed one of the special constructors to set particle pointer and momentum properly
* Helicity/Vertex/Scalar/GeneralSVVVertex.cc (Repository): Documentation changes
* Models/RSModel/RSModel.icc (Repository): Added RS Vertices to storage in base class
* Models/StandardModel/StandardModel.cc (Repository): Initialized running mass object in doinit
* Decay/General/GeneralTwoBodyDecayer.h (Repository): Changes to store pointer to vertex in each decayer
2006-02-16 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/HerwigDefaults.in: New handling of cuts in ThePEG
2006-02-16 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/HerwigDefaults.in: New handling of cuts in ThePEG
2006-02-07 David Grellscheid <David.Grellscheid@durham.ac.uk>
* configure.ac, README, AUTHORS: Last updates, tagged and
published as Herwig++-2.0-beta release. Merged release branch into
main up until tag herwig-2-0-beta
2006-02-07 David Grellscheid <David.Grellscheid@durham.ac.uk>
* configure.ac, README, AUTHORS: Last updates, tagged and
published as Herwig++-2.0-beta release. Merged release branch into
main up until tag herwig-2-0-beta
2006-02-03 David Grellscheid <David.Grellscheid@durham.ac.uk>
* MatrixElement/MEqq2W2ll.cc: Bugfix for unititialized
variable. Solves imbalance between W+ and W-.
2006-02-03 David Grellscheid <David.Grellscheid@durham.ac.uk>
* MatrixElement/MEqq2W2ll.cc: Bugfix for unititialized
variable. Solves imbalance between W+ and W-.
2006-02-02 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/ShowerHandler.cc, Hadronization/PartonSplitter.cc: Added
eventerror for spacelike gluons in PartonSplitter. Added check for
QCD-FSR when doing ME corrections.
2006-02-02 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/ShowerHandler.cc, Hadronization/PartonSplitter.cc: Added
eventerror for spacelike gluons in PartonSplitter. Added check for
QCD-FSR when doing ME corrections.
2006-02-01 David Grellscheid <David.Grellscheid@durham.ac.uk>
* all: Branched off herwig-2-0-beta-release branch, then merged
Decay Radiation branch. Structural changes to decayers.
* Utilities/Math.cc, Decay/Perturbative/SMTopDecayer.h,
SMHiggsGGHiggsPPDecayer.h, SMHiggsFermionsDecayer.h: Temporary
fixes to allow compilation.
2006-02-01 David Grellscheid <David.Grellscheid@durham.ac.uk>
* all: Branched off herwig-2-0-beta-release branch, then merged
Decay Radiation branch. Structural changes to decayers.
* Utilities/Math.cc, Decay/Perturbative/SMTopDecayer.h,
SMHiggsGGHiggsPPDecayer.h, SMHiggsFermionsDecayer.h: Temporary
fixes to allow compilation.
2006-01-31 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/Shower.in, Shower/SplittingFunctions: Individual PDFMax
limits for efficiency.
* Decay/HwDecayHandler.cc: Added vertex setting to handle displaced
vertices.
2006-01-31 Martyn Gigg <m.a.gigg@dur.ac.uk>
* src/HerwigDefaults.in: Updating after main-to-bsm merge
* Models/General/TwoBodyDecayConstructor.cc: Added creation of FFV decayer
* Decay/General/FFVDecayer.h (Repository): Added FFVDecayer for bsm
2006-01-31 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/Shower.in, Shower/SplittingFunctions: Individual PDFMax
limits for efficiency.
* Decay/HwDecayHandler.cc: Added vertex setting to handle displaced
vertices.
2006-01-26 David Grellscheid <David.Grellscheid@durham.ac.uk>
* MatrixElements/*: New qq->W->ll and ee->gZ->qq matrix
elements. Replaced default qq->gZ->ll
* src/Analysis.in, Analysis/SimpleLHCAnalysis.*,
Analysis/Histogram.*, Analysis/BasicConsistency.*: Added
SimpleLHCAnalysis, cleaned up Histogram class and BasicConsistency
analysis.
* src/Shower.in, Shower/PartnerFinder.cc,
Shower/KinematicsReconstructor.cc, Shower/Evolver.cc,
Shower/BackwardEvolver.cc: fixed ISR/FSR crash for LHC. This is
NOT a permanent solution, there is no timelike showering of ISR
particles at the moment!
2006-01-26 David Grellscheid <David.Grellscheid@durham.ac.uk>
* MatrixElements/*: New qq->W->ll and ee->gZ->qq matrix
elements. Replaced default qq->gZ->ll
* src/Analysis.in, Analysis/SimpleLHCAnalysis.*,
Analysis/Histogram.*, Analysis/BasicConsistency.*: Added
SimpleLHCAnalysis, cleaned up Histogram class and BasicConsistency
analysis.
* src/Shower.in, Shower/PartnerFinder.cc,
Shower/KinematicsReconstructor.cc, Shower/Evolver.cc,
Shower/BackwardEvolver.cc: fixed ISR/FSR crash for LHC. This is
NOT a permanent solution, there is no timelike showering of ISR
particles at the moment!
2006-01-24 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/MRST.cc: Restructured for speed, high-x problem unchanged
2006-01-24 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/MRST.cc: Restructured for speed, high-x problem unchanged
2006-01-24 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/MRST.cc: Restructured for speed, high-x problem unchanged
2006-01-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Analysis/*: Added more simple analysis handlers for multiplicity
checking and general consistency.
* src/Hadronization.in: reset s-quark weight to 1.0
* PDF/MRST.cc: Added GeV2 to fix wrong PDF behaviour
2006-01-23 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Added basic analysis handlers
2006-01-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Analysis/*: Added more simple analysis handlers for multiplicity
checking and general consistency.
* src/Hadronization.in: reset s-quark weight to 1.0
* PDF/MRST.cc: Added GeV2 to fix wrong PDF behaviour
2006-01-23 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Added basic analysis handlers
2006-01-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Analysis/*: Added more simple analysis handlers for multiplicity
checking and general consistency.
* src/Hadronization.in: reset s-quark weight to 1.0
* PDF/MRST.cc: Added GeV2 to fix wrong PDF behaviour
2006-01-23 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Added basic analysis handlers
2006-01-20 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/General/VFFDecayer.icc (Repository): Altered default contructor to set which list to search
* Models/General/TwoBodyDecayConstructor.cc (Repository): Added functionality to create decaymodes dynamically
2006-01-06 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Various changes to get the forced splitting to work
* Shower/Makefile.am (Repository): Change to Makefile due to move of SudakovFormFactor to SplittingFunctions directory
2006-01-06 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Various changes to get the forced splitting to work
* Shower/Makefile.am (Repository): Change to Makefile due to move of SudakovFormFactor to SplittingFunctions directory
2006-01-06 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Various changes to get the forced splitting to work
* Shower/Makefile.am (Repository): Change to Makefile due to move of SudakovFormFactor to SplittingFunctions directory
2005-12-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Shower/ForwardEvolver.cc (Repository): SplttingFunctions and related classes cleaned up and moved to new directory
2005-12-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Shower/ForwardEvolver.cc (Repository): SplttingFunctions and related classes cleaned up and moved to new directory
2005-12-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Shower/ForwardEvolver.cc (Repository): SplttingFunctions and related classes cleaned up and moved to new directory
2005-12-18 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/SudakovFormFactor.cc: Veto bugs fixed
* Shower/KinematicsReconstructor.cc, Shower/BackwardEvolver.cc:
wrapped forced splittings in '#ifdef PHILSCODE', to make Shower
testing work (also in PDF/BaryonRemnants.cc)
* Shower/SplittingGenerator.cc: small change, wrapped some 'cout'
in a DEBUG_LEVEL test
* Hadronization/ClusterHadronizationHandler.cc: added missing
Remnant code
* src/Shower.in: typo c->c,cbar fixed to g->c,cbar; cleaned up
arrangement
2005-12-18 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/SudakovFormFactor.cc: Veto bugs fixed
* Shower/KinematicsReconstructor.cc, Shower/BackwardEvolver.cc:
wrapped forced splittings in '#ifdef PHILSCODE', to make Shower
testing work (also in PDF/BaryonRemnants.cc)
* Shower/SplittingGenerator.cc: small change, wrapped some 'cout'
in a DEBUG_LEVEL test
* Hadronization/ClusterHadronizationHandler.cc: added missing
Remnant code
* src/Shower.in: typo c->c,cbar fixed to g->c,cbar; cleaned up
arrangement
2005-12-18 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/SudakovFormFactor.cc: Veto bugs fixed
* Shower/KinematicsReconstructor.cc, Shower/BackwardEvolver.cc:
wrapped forced splittings in '#ifdef PHILSCODE', to make Shower
testing work (also in PDF/BaryonRemnants.cc)
* Shower/SplittingGenerator.cc: small change, wrapped some 'cout'
in a DEBUG_LEVEL test
* Hadronization/ClusterHadronizationHandler.cc: added missing
Remnant code
* src/Shower.in: typo c->c,cbar fixed to g->c,cbar; cleaned up
arrangement
2005-12-17 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, src/*.in ( and others ): Full merge of Stefan's Shower
changes, Phil's refactoring of forced splitting, Peter's Remnant
class and Durham bugfixes. NOT tested yet.
* PDF/BaryonRemnants.cc: Remnant and forced splitting don't work
together so far. File contains #defines to choose version. This
must be resolved! NOT tested yet.
2005-12-17 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, src/*.in ( and others ): Full merge of Stefan's Shower
changes, Phil's refactoring of forced splitting, Peter's Remnant
class and Durham bugfixes. NOT tested yet.
* PDF/BaryonRemnants.cc: Remnant and forced splitting don't work
together so far. File contains #defines to choose version. This
must be resolved! NOT tested yet.
2005-12-17 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, src/*.in ( and others ): Full merge of Stefan's Shower
changes, Phil's refactoring of forced splitting, Peter's Remnant
class and Durham bugfixes. NOT tested yet.
* PDF/BaryonRemnants.cc: Remnant and forced splitting don't work
together so far. File contains #defines to choose version. This
must be resolved! NOT tested yet.
2005-12-15 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Helicity/Vertex/Scalar/FFSVertex.h (Repository): Changed access for getting left and right components
2005-12-09 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/General/TwoBodyDecayConstructor.h (Repository): Added functions to create decayer and decay list
2005-12-09 Martyn Gigg <dph3mag@d52.phyip3.dur.ac.uk>
* Decay/General/GeneralTwoBodyDecayer.cc (Repository): Added two body decayer class files
2005-11-15 Pete's account <Peter.Richardson@durham.ac.uk>
* src/StandardModelVertices.in: changes to decay structure to avoid code duplication
2005-11-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Radiation/FFDipole.cc (Repository): changes to FF Dipole
2005-11-15 Pete's account <Peter.Richardson@durham.ac.uk>
* src/StandardModelVertices.in: changes to decay structure to avoid code duplication
2005-11-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Radiation/FFDipole.cc (Repository): changes to FF Dipole
2005-11-04 Martyn Gigg <dph3mag@d31.phyip3.dur.ac.uk>
* Helicity/Vertex/VertexBase.h (Repository): Changed VertexBase to allow for enumerating inheriting vertices
2005-11-01 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Models/General/DecayConstructor.h (Repository): Added DecayConstructor and other files for BSM structure
2005-10-25 Martyn Gigg <dph3mag@d31.phyip3.dur.ac.uk>
* Decay/Perturbative/SMHiggsGGHiggsPPDecayer.h (Repository): Renamed SMHDecayer to SMHiggsGGHiggsPPDecayer
2005-10-25 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src (Repository): correction to ensure HGG and HPP work and minor structure for vertices
2005-10-25 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Models/General/ModelGenerator.fh (Repository): added files for new branch
2005-10-25 Martyn Gigg <dph3mag@d31.phyip3.dur.ac.uk>
* Decay/Perturbative/SMHiggsGGHiggsPPDecayer.h (Repository): Renamed SMHDecayer to SMHiggsGGHiggsPPDecayer
2005-10-25 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src (Repository): correction to ensure HGG and HPP work and minor structure for vertices
2005-10-25 Martyn Gigg <dph3mag@d31.phyip3.dur.ac.uk>
* Decay/Perturbative/SMHiggsGGHiggsPPDecayer.h (Repository): Renamed SMHDecayer to SMHiggsGGHiggsPPDecayer
2005-10-25 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src (Repository): correction to ensure HGG and HPP work and minor structure for vertices
2005-10-24 Martyn Gigg <dph3mag@d31.phyip3.dur.ac.uk>
* Helicity/Vertex/StandardModel/SMHPPVertex.h (Repository): Added SMHPPVertex class
* Helicity/Vertex/StandardModel/SMHGGVertex.h (Repository): Added SMHGGVertex
* Helicity/Vertex/Scalar/SVVLoopVertex.h (Repository): Added SVVLoopVertex class
* Helicity/Vertex/Scalar/GeneralSVVVertex.h (Repository): Added GeneralSVVVertex class
* Decay/Perturbative/SMHDecayer.h (Repository): Added HVV decayer
2005-10-24 Martyn Gigg <dph3mag@d31.phyip3.dur.ac.uk>
* Helicity/Vertex/StandardModel/SMHPPVertex.h (Repository): Added SMHPPVertex class
* Helicity/Vertex/StandardModel/SMHGGVertex.h (Repository): Added SMHGGVertex
* Helicity/Vertex/Scalar/SVVLoopVertex.h (Repository): Added SVVLoopVertex class
* Helicity/Vertex/Scalar/GeneralSVVVertex.h (Repository): Added GeneralSVVVertex class
* Decay/Perturbative/SMHDecayer.h (Repository): Added HVV decayer
2005-10-24 Martyn Gigg <dph3mag@d31.phyip3.dur.ac.uk>
* Helicity/Vertex/StandardModel/SMHPPVertex.h (Repository): Added SMHPPVertex class
* Helicity/Vertex/StandardModel/SMHGGVertex.h (Repository): Added SMHGGVertex
* Helicity/Vertex/Scalar/SVVLoopVertex.h (Repository): Added SVVLoopVertex class
* Helicity/Vertex/Scalar/GeneralSVVVertex.h (Repository): Added GeneralSVVVertex class
* Decay/Perturbative/SMHDecayer.h (Repository): Added HVV decayer
2005-10-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/Vertex/StandardModel/SMFFHVertex.cc (Repository): changes to remove hard-wired value of pi
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): changes to correctly return rho matrix
* Decay/Perturbative/SMWZDecayer.icc (Repository): modifications to SMWZDecayer to clean up code using new constructors to produce spinInfo
* Helicity/Vertex/Vector/FFVVertex.h (Repository): added .fh file for FFVVertex
* Decay/Perturbative/SMWZDecayer.h (Repository): added decayer for H -> f fbar
* Helicity/Vertex/Scalar/Makefile.am (Repository): changes to include .fh file for FFSVertex
2005-10-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/Vertex/StandardModel/SMFFHVertex.cc (Repository): changes to remove hard-wired value of pi
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): changes to correctly return rho matrix
* Decay/Perturbative/SMWZDecayer.icc (Repository): modifications to SMWZDecayer to clean up code using new constructors to produce spinInfo
* Helicity/Vertex/Vector/FFVVertex.h (Repository): added .fh file for FFVVertex
* Decay/Perturbative/SMWZDecayer.h (Repository): added decayer for H -> f fbar
* Helicity/Vertex/Scalar/Makefile.am (Repository): changes to include .fh file for FFSVertex
2005-10-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/Vertex/StandardModel/SMFFHVertex.cc (Repository): changes to remove hard-wired value of pi
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): changes to correctly return rho matrix
* Decay/Perturbative/SMWZDecayer.icc (Repository): modifications to SMWZDecayer to clean up code using new constructors to produce spinInfo
* Helicity/Vertex/Vector/FFVVertex.h (Repository): added .fh file for FFVVertex
* Decay/Perturbative/SMWZDecayer.h (Repository): added decayer for H -> f fbar
* Helicity/Vertex/Scalar/Makefile.am (Repository): changes to include .fh file for FFSVertex
2005-10-07 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/Perturbative/SMTopDecayer.h (Repository): Added TopDecayer
2005-10-07 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.cc (Repository): changes so the reference to the
PartonicHadronizer can be set to null to switch off hadronization.
2005-10-07 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/Perturbative/SMTopDecayer.h (Repository): Added TopDecayer
2005-10-07 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.cc (Repository): changes so the reference to the
PartonicHadronizer can be set to null to switch off hadronization.
2005-10-07 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/Perturbative/SMTopDecayer.h (Repository): Added TopDecayer
2005-10-07 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.cc (Repository): changes so the reference to the
PartonicHadronizer can be set to null to switch off hadronization.
2005-10-05 David Grellscheid <David.Grellscheid@durham.ac.uk>
* acinclude.m4: Fixed bug #8. CLHEPINCLUDE is used correctly now
2005-10-05 David Grellscheid <David.Grellscheid@durham.ac.uk>
* acinclude.m4: Fixed bug #8. CLHEPINCLUDE is used correctly now
2005-10-05 David Grellscheid <David.Grellscheid@durham.ac.uk>
* acinclude.m4: Fixed bug #8. CLHEPINCLUDE is used correctly now
2005-09-30 David Grellscheid <David.Grellscheid@durham.ac.uk>
* configure.ac, Makefile.am: configure switches for Mac OS X
2005-09-30 David Grellscheid <David.Grellscheid@durham.ac.uk>
* configure.ac, Makefile.am: configure switches for Mac OS X
2005-09-30 David Grellscheid <David.Grellscheid@durham.ac.uk>
* configure.ac, Makefile.am: configure switches for Mac OS X
2005-09-29 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/Hw64Decays.in, src/Decays.in: Activated Mambo decayer for
5-body decays in Hw64Decays.in to keep code working
* Utilities/Math.cc: inlined power series
2005-09-29 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Math.h (Repository): changes so private power series for dilog is not publically visible
* Decay/MamboDecayer.h (Repository): removed 5 body decay option from Hw64Decayer
2005-09-29 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/Hw64Decays.in, src/Decays.in: Activated Mambo decayer for
5-body decays in Hw64Decays.in to keep code working
* Utilities/Math.cc: inlined power series
2005-09-29 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Math.h (Repository): changes so private power series for dilog is not publically visible
* Decay/MamboDecayer.h (Repository): removed 5 body decay option from Hw64Decayer
2005-09-29 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/Hw64Decays.in, src/Decays.in: Activated Mambo decayer for
5-body decays in Hw64Decays.in to keep code working
* Utilities/Math.cc: inlined power series
2005-09-29 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Math.h (Repository): changes so private power series for dilog is not publically visible
* Decay/MamboDecayer.h (Repository): removed 5 body decay option from Hw64Decayer
2005-09-28 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Baryon/BaryonFactorizedDecayer.h (Repository): added all .so files needed by library to all classes to ensure correct dynamic loading
* Helicity/Vertex/Tensor/FFTVertex.fh (Repository): added .fh to define pointers for the tensor vertices
2005-09-28 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Baryon/BaryonFactorizedDecayer.h (Repository): added all .so files needed by library to all classes to ensure correct dynamic loading
* Helicity/Vertex/Tensor/FFTVertex.fh (Repository): added .fh to define pointers for the tensor vertices
2005-09-28 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Baryon/BaryonFactorizedDecayer.h (Repository): added all .so files needed by library to all classes to ensure correct dynamic loading
* Helicity/Vertex/Tensor/FFTVertex.fh (Repository): added .fh to define pointers for the tensor vertices
2005-09-27 kmh <kmh@phyip3.dur.ac.uk>
* Decay/Radiation/FFDipole.cc (Module): Implemented boost factor
added some histogramming (PAW).
2005-09-27 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added class description and removed obsolete function
(Repository): Removed unused variables
2005-09-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/DecayPhaseSpaceMode.cc (Repository): change to unmask parameters
2005-09-27 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added class description and removed obsolete function
(Repository): Removed unused variables
2005-09-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/DecayPhaseSpaceMode.cc (Repository): change to unmask parameters
2005-09-27 kmh <kmh@phyip3.dur.ac.uk>
* Decay/Radiation/FFDipole.cc (Module): Implemented boost factor
added some histogramming (PAW).
2005-09-27 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added class description and removed obsolete function
(Repository): Removed unused variables
2005-09-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/DecayPhaseSpaceMode.cc (Repository): change to unmask parameters
2005-09-26 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added MamboDecayer
2005-09-26 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added MamboDecayer
2005-09-26 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added MamboDecayer
2005-09-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* */*.h, */Makefile.am, src/*.in: Restructuring of libraries to
clean up dependencies. Many parts turned into modules.
make clean && make recommended.
2005-09-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* */*.h, */Makefile.am, src/*.in: Restructuring of libraries to
clean up dependencies. Many parts turned into modules.
make clean && make recommended.
2005-09-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* */*.h, */Makefile.am, src/*.in: Restructuring of libraries to
clean up dependencies. Many parts turned into modules.
make clean && make recommended.
2005-09-22 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, UnderlyingEvent/*, lib/Makefile.am,
src/UnderlyingEvent.in, src/Shower.in: Turned Shower and UA5 into
modules.
* src/LEPbb.in, src/HerwigDefaults.in, lib/Makefile.am,
MatrixElement/*: Turned HwME.so into a module.
* Decay/*, PDF/*, PDT/*: bugfixes and warning eliminations from
-Wshadow
2005-09-22 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, UnderlyingEvent/*, lib/Makefile.am,
src/UnderlyingEvent.in, src/Shower.in: Turned Shower and UA5 into
modules.
* src/LEPbb.in, src/HerwigDefaults.in, lib/Makefile.am,
MatrixElement/*: Turned HwME.so into a module.
* Decay/*, PDF/*, PDT/*: bugfixes and warning eliminations from
-Wshadow
2005-09-22 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, UnderlyingEvent/*, lib/Makefile.am,
src/UnderlyingEvent.in, src/Shower.in: Turned Shower and UA5 into
modules.
* src/LEPbb.in, src/HerwigDefaults.in, lib/Makefile.am,
MatrixElement/*: Turned HwME.so into a module.
* Decay/*, PDF/*, PDT/*: bugfixes and warning eliminations from
-Wshadow
2005-09-21 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Helicity/Vertex/RSModel/RSModel*Vertex.h: modified the library()
lines to take care of dependency on HwRSModel.so
2005-09-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): minor changes to ensure special constructor returns a wavefunction
2005-09-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.h (Repository): minor fixes and
cleanup of b to s gamma code
* Hadronization/PartonicHadronizer.cc (Repository): bug fix to
solve problems when vetoing hadronization if intermediates removed
2005-09-21 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Helicity/Vertex/RSModel/RSModel*Vertex.h: modified the library()
lines to take care of dependency on HwRSModel.so
2005-09-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): minor changes to ensure special constructor returns a wavefunction
2005-09-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.h (Repository): minor fixes and
cleanup of b to s gamma code
* Hadronization/PartonicHadronizer.cc (Repository): bug fix to
solve problems when vetoing hadronization if intermediates removed
2005-09-21 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Helicity/Vertex/RSModel/RSModel*Vertex.h: modified the library()
lines to take care of dependency on HwRSModel.so
2005-09-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): minor changes to ensure special constructor returns a wavefunction
2005-09-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.h (Repository): minor fixes and
cleanup of b to s gamma code
* Hadronization/PartonicHadronizer.cc (Repository): bug fix to
solve problems when vetoing hadronization if intermediates removed
2005-09-20 Pete's account <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEee2Z.icc (Repository): Added files for e+e- > Z matrix element
* Decay/Radiation/FFDipole.icc (Repository): Merged Keith's code into the
structure
2005-09-20 Pete's account <Peter.Richardson@durham.ac.uk>
* MatrixElement/MEee2Z.icc (Repository): Added files for e+e- > Z matrix element
* Decay/Radiation/FFDipole.icc (Repository): Merged Keith's code into the
structure
2005-09-19 Pete's account <Peter.Richardson@durham.ac.uk>
* Makefile.am (Repository): changes for new directories
* Decay/Hw64Decayer.cc (Repository): added changes from main branch
* Utilities/Interpolator.cc (Repository): minor bug fixes
* Hadronization/PartonicHadronizer.cc (Repository): minor bug fixes
* Utilities/Math.h (Repository): added math namesapce for mathematical
functions and included the dilog from FORTRAN HERWIG.
2005-09-19 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/*: Removed obsolete MRST99_1.*, renamed MRST.so to HwMRST.so
* Helicity/Vertex/RSModel/*, Models/RSModel/*: Made RS model
dynamically loadable.
2005-09-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Interpolator.cc (Repository): minor bug fixes
* Hadronization/PartonicHadronizer.cc (Repository): minor bug fixes
* Utilities/Math.h (Repository): added math namesapce for mathematical
functions and included the dilog from FORTRAN HERWIG.
2005-09-19 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/*: Removed obsolete MRST99_1.*, renamed MRST.so to HwMRST.so
* Helicity/Vertex/RSModel/*, Models/RSModel/*: Made RS model
dynamically loadable.
2005-09-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Interpolator.cc (Repository): minor bug fixes
* Hadronization/PartonicHadronizer.cc (Repository): minor bug fixes
* Utilities/Math.h (Repository): added math namesapce for mathematical
functions and included the dilog from FORTRAN HERWIG.
2005-09-19 Pete's account <Peter.Richardson@durham.ac.uk>
* Makefile.am (Repository): changes for new directories
* Decay/Hw64Decayer.cc (Repository): added changes from main branch
* Utilities/Interpolator.cc (Repository): minor bug fixes
* Hadronization/PartonicHadronizer.cc (Repository): minor bug fixes
* Utilities/Math.h (Repository): added math namesapce for mathematical
functions and included the dilog from FORTRAN HERWIG.
2005-09-19 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/*: Removed obsolete MRST99_1.*, renamed MRST.so to HwMRST.so
* Helicity/Vertex/RSModel/*, Models/RSModel/*: Made RS model
dynamically loadable.
2005-09-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Interpolator.cc (Repository): minor bug fixes
* Hadronization/PartonicHadronizer.cc (Repository): minor bug fixes
* Utilities/Math.h (Repository): added math namesapce for mathematical
functions and included the dilog from FORTRAN HERWIG.
2005-09-15 David Grellscheid <David.Grellscheid@durham.ac.uk>
* ** multiple files **: small changes to reduce compile warnings
when extra warning flags are enabled.
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Radiation (Repository): changes to add the basic structure for the YODA code
2005-09-30 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Doc/refman.conf (Repository): changes due change in name of repository
* configure.ac, Makefile.am: configure switches for Mac OS X
2005-09-29 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/Hw64Decays.in, src/Decays.in: Activated Mambo decayer for
5-body decays in Hw64Decays.in to keep code working
* Utilities/Math.cc: inlined power series
2005-09-29 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Math.h (Repository): changes so private power series for dilog is not publically visible
* Decay/MamboDecayer.h (Repository): removed 5 body decay option from Hw64Decayer
2005-09-28 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Baryon/BaryonFactorizedDecayer.h (Repository): added all .so files needed by library to all classes to ensure correct dynamic loading
* Helicity/Vertex/Tensor/FFTVertex.fh (Repository): added .fh to define pointers for the tensor vertices
2005-09-27 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added class description and removed obsolete function
(Repository): Removed unused variables
2005-09-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/DecayPhaseSpaceMode.cc (Repository): change to unmask parameters
2005-09-26 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added MamboDecayer
2005-09-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* */*.h, */Makefile.am, src/*.in: Restructuring of libraries to
clean up dependencies. Many parts turned into modules.
make clean && make recommended.
2005-09-22 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, UnderlyingEvent/*, lib/Makefile.am,
src/UnderlyingEvent.in, src/Shower.in: Turned Shower and UA5 into
modules.
* src/LEPbb.in, src/HerwigDefaults.in, lib/Makefile.am,
MatrixElement/*: Turned HwME.so into a module.
* Decay/*, PDF/*, PDT/*: bugfixes and warning eliminations from
-Wshadow
2005-09-21 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Helicity/Vertex/RSModel/RSModel*Vertex.h: modified the library()
lines to take care of dependency on HwRSModel.so
2005-09-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): minor changes to ensure special constructor returns a wavefunction
2005-09-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.h (Repository): minor fixes and
cleanup of b to s gamma code
* Hadronization/PartonicHadronizer.cc (Repository): bug fix to
solve problems when vetoing hadronization if intermediates removed
2005-09-19 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/*: Removed obsolete MRST99_1.*, renamed MRST.so to HwMRST.so
* Helicity/Vertex/RSModel/*, Models/RSModel/*: Made RS model
dynamically loadable.
2005-09-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Interpolator.cc (Repository): minor bug fixes
* Hadronization/PartonicHadronizer.cc (Repository): minor bug fixes
* Utilities/Math.h (Repository): added math namesapce for mathematical
functions and included the dilog from FORTRAN HERWIG.
2005-09-15 David Grellscheid <David.Grellscheid@durham.ac.uk>
* ** multiple files **: small changes to reduce compile warnings
when extra warning flags are enabled.
>>>>>>> 1.44
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/refman.conf (Repository): changes due change in name of
repository
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/WeakCurrents/FourPionNovosibirskCurrent.cc (Repository):
minor bug fixes
2005-09-15 David Grellscheid <David.Grellscheid@durham.ac.uk>
* ** multiple files **: small changes to reduce compile warnings
when extra warning flags are enabled.
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/refman.conf (Repository): changes due change in name of
repository
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/WeakCurrents/FourPionNovosibirskCurrent.cc (Repository):
minor bug fixes
2005-09-15 David Grellscheid <David.Grellscheid@durham.ac.uk>
* ** multiple files **: small changes to reduce compile warnings
when extra warning flags are enabled.
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/refman.conf (Repository): changes due change in name of
repository
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/WeakCurrents/FourPionNovosibirskCurrent.cc (Repository):
minor bug fixes
2005-09-15 David Grellscheid <David.Grellscheid@durham.ac.uk>
* ** multiple files **: small changes to reduce compile warnings
when extra warning flags are enabled.
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Radiation (Repository): changes to add the basic structure for the YODA code
2005-09-30 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Doc/refman.conf (Repository): changes due change in name of repository
* configure.ac, Makefile.am: configure switches for Mac OS X
2005-09-29 David Grellscheid <David.Grellscheid@durham.ac.uk>
* src/Hw64Decays.in, src/Decays.in: Activated Mambo decayer for
5-body decays in Hw64Decays.in to keep code working
* Utilities/Math.cc: inlined power series
2005-09-29 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Math.h (Repository): changes so private power series for dilog is not publically visible
* Decay/MamboDecayer.h (Repository): removed 5 body decay option from Hw64Decayer
2005-09-28 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Baryon/BaryonFactorizedDecayer.h (Repository): added all .so files needed by library to all classes to ensure correct dynamic loading
* Helicity/Vertex/Tensor/FFTVertex.fh (Repository): added .fh to define pointers for the tensor vertices
2005-09-27 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added class description and removed obsolete function
(Repository): Removed unused variables
2005-09-27 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/DecayPhaseSpaceMode.cc (Repository): change to unmask parameters
2005-09-26 Martyn Gigg <m.a.gigg@dur.ac.uk>
* Decay/MamboDecayer.cc (Repository): Added MamboDecayer
2005-09-23 David Grellscheid <David.Grellscheid@durham.ac.uk>
* */*.h, */Makefile.am, src/*.in: Restructuring of libraries to
clean up dependencies. Many parts turned into modules.
make clean && make recommended.
2005-09-22 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Shower/*, UnderlyingEvent/*, lib/Makefile.am,
src/UnderlyingEvent.in, src/Shower.in: Turned Shower and UA5 into
modules.
* src/LEPbb.in, src/HerwigDefaults.in, lib/Makefile.am,
MatrixElement/*: Turned HwME.so into a module.
* Decay/*, PDF/*, PDT/*: bugfixes and warning eliminations from
-Wshadow
2005-09-21 David Grellscheid <David.Grellscheid@durham.ac.uk>
* Helicity/Vertex/RSModel/RSModel*Vertex.h: modified the library()
lines to take care of dependency on HwRSModel.so
2005-09-22 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/ScalarWaveFunction.cc (Repository): minor changes to ensure special constructor returns a wavefunction
2005-09-21 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.h (Repository): minor fixes and
cleanup of b to s gamma code
* Hadronization/PartonicHadronizer.cc (Repository): bug fix to
solve problems when vetoing hadronization if intermediates removed
2005-09-19 David Grellscheid <David.Grellscheid@durham.ac.uk>
* PDF/*: Removed obsolete MRST99_1.*, renamed MRST.so to HwMRST.so
* Helicity/Vertex/RSModel/*, Models/RSModel/*: Made RS model
dynamically loadable.
2005-09-19 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/Interpolator.cc (Repository): minor bug fixes
* Hadronization/PartonicHadronizer.cc (Repository): minor bug fixes
* Utilities/Math.h (Repository): added math namesapce for mathematical
functions and included the dilog from FORTRAN HERWIG.
2005-09-15 David Grellscheid <David.Grellscheid@durham.ac.uk>
* ** multiple files **: small changes to reduce compile warnings
when extra warning flags are enabled.
>>>>>>> 1.44
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/refman.conf (Repository): changes due change in name of
repository
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/WeakCurrents/FourPionNovosibirskCurrent.cc (Repository):
minor bug fixes
2005-09-15 David Grellscheid <David.Grellscheid@durham.ac.uk>
* ** multiple files **: small changes to reduce compile warnings
when extra warning flags are enabled.
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/refman.conf (Repository): changes due change in name of
repository
2005-09-15 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/WeakCurrents/FourPionNovosibirskCurrent.cc (Repository):
minor bug fixes
2005-09-13 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay: changes to many classes due to the new base class
* Hadronization changes to tidy up the PartonicHadronizer and allow the
hadronization to produce off-shell particles.
* Decay/HwDecayerBase.h (Repository): added new base class for
decayers including the Initialize feature of the DecayIntegrator
and dataBaseOutput so this can be used for classes not built on
DecayIntegrator.
* PDT/GenericWidthGenerator.h: changes so that the mass generator
only includes the numerator factor when generating a mass
without the weight to avoid biases towards high masses.
* Decay/DecayConfig.h (Repository): this was really the .fh file
for Hw64Decayer and has been renamed as such.
* Decay/ExampleDecayer (Repository): removed the ExampleDecayer as
it served little purpose and should be replaced by information on
the Wiki.
2005-09-13 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay: changes to many classes due to the new base class
* Hadronization changes to tidy up the PartonicHadronizer and allow the
hadronization to produce off-shell particles.
* Decay/HwDecayerBase.h (Repository): added new base class for
decayers including the Initialize feature of the DecayIntegrator
and dataBaseOutput so this can be used for classes not built on
DecayIntegrator.
* PDT/GenericWidthGenerator.h: changes so that the mass generator
only includes the numerator factor when generating a mass
without the weight to avoid biases towards high masses.
* Decay/DecayConfig.h (Repository): this was really the .fh file
for Hw64Decayer and has been renamed as such.
* Decay/ExampleDecayer (Repository): removed the ExampleDecayer as
it served little purpose and should be replaced by information on
the Wiki.
2005-09-13 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay: changes to many classes due to the new base class
* Hadronization changes to tidy up the PartonicHadronizer and allow the
hadronization to produce off-shell particles.
* Decay/HwDecayerBase.h (Repository): added new base class for
decayers including the Initialize feature of the DecayIntegrator
and dataBaseOutput so this can be used for classes not built on
DecayIntegrator.
* PDT/GenericWidthGenerator.h: changes so that the mass generator
only includes the numerator factor when generating a mass
without the weight to avoid biases towards high masses.
* Decay/DecayConfig.h (Repository): this was really the .fh file
for Hw64Decayer and has been renamed as such.
* Decay/ExampleDecayer (Repository): removed the ExampleDecayer as
it served little purpose and should be replaced by information on
the Wiki.
2005-09-13 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay: changes to many classes due to the new base class
* Hadronization changes to tidy up the PartonicHadronizer and allow the
hadronization to produce off-shell particles.
* Decay/HwDecayerBase.h (Repository): added new base class for
decayers including the Initialize feature of the DecayIntegrator
and dataBaseOutput so this can be used for classes not built on
DecayIntegrator.
* PDT/GenericWidthGenerator.h: changes so that the mass generator
only includes the numerator factor when generating a mass
without the weight to avoid biases towards high masses.
* Decay/DecayConfig.h (Repository): this was really the .fh file
for Hw64Decayer and has been renamed as such.
* Decay/ExampleDecayer (Repository): removed the ExampleDecayer as
it served little purpose and should be replaced by information on
the Wiki.
2005-09-13 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay: changes to many classes due to the new base class
* Hadronization changes to tidy up the PartonicHadronizer and allow the
hadronization to produce off-shell particles.
* Decay/HwDecayerBase.h (Repository): added new base class for
decayers including the Initialize feature of the DecayIntegrator
and dataBaseOutput so this can be used for classes not built on
DecayIntegrator.
* PDT/GenericWidthGenerator.h: changes so that the mass generator
only includes the numerator factor when generating a mass
without the weight to avoid biases towards high masses.
* Decay/DecayConfig.h (Repository): this was really the .fh file
for Hw64Decayer and has been renamed as such.
* Decay/ExampleDecayer (Repository): removed the ExampleDecayer as
it served little purpose and should be replaced by information on
the Wiki.
2005-09-08 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src/HerwigDefaults.in (Repository): changes for the new
treatment of hadronization in partonic decays
* Decay/Baryon/SU3BaryonDecupletOctetPhotonDecayer.cc
(Repository): various minor bug fixes to the decays
2005-09-08 David Grellscheid <dgrell@d2.phyip3.dur.ac.uk>
* lib/Makefile.am: added libHwPartonicDecay.la to the list of
libraries
2005-09-08 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src/HerwigDefaults.in (Repository): changes for the new
treatment of hadronization in partonic decays
* Decay/Baryon/SU3BaryonDecupletOctetPhotonDecayer.cc
(Repository): various minor bug fixes to the decays
2005-09-08 David Grellscheid <dgrell@d2.phyip3.dur.ac.uk>
* lib/Makefile.am: added libHwPartonicDecay.la to the list of
libraries
2005-09-08 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src/HerwigDefaults.in (Repository): changes for the new
treatment of hadronization in partonic decays
* Decay/Baryon/SU3BaryonDecupletOctetPhotonDecayer.cc
(Repository): various minor bug fixes to the decays
2005-09-08 David Grellscheid <dgrell@d2.phyip3.dur.ac.uk>
* lib/Makefile.am: added libHwPartonicDecay.la to the list of
libraries
2005-09-08 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src/HerwigDefaults.in (Repository): changes for the new
treatment of hadronization in partonic decays
* Decay/Baryon/SU3BaryonDecupletOctetPhotonDecayer.cc
(Repository): various minor bug fixes to the decays
2005-09-08 David Grellscheid <dgrell@d2.phyip3.dur.ac.uk>
* lib/Makefile.am: added libHwPartonicDecay.la to the list of
libraries
2005-09-08 Peter Richardson <Peter.Richardson@durham.ac.uk>
* src/HerwigDefaults.in (Repository): changes for the new
treatment of hadronization in partonic decays
* Decay/Baryon/SU3BaryonDecupletOctetPhotonDecayer.cc
(Repository): various minor bug fixes to the decays
2005-09-08 David Grellscheid <dgrell@d2.phyip3.dur.ac.uk>
* lib/Makefile.am: added libHwPartonicDecay.la to the list of
libraries
2005-09-05 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/HerwigRun.cc: changes to documentation to remove some
doxygen errors and more changes due to change in random numbers
from ThePEG
2005-09-05 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/HerwigRun.cc: changes to documentation to remove some
doxygen errors and more changes due to change in random numbers
from ThePEG
2005-09-05 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/HerwigRun.cc: changes to documentation to remove some
doxygen errors and more changes due to change in random numbers
from ThePEG
2005-09-05 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/HerwigRun.cc: changes to documentation to remove some
doxygen errors and more changes due to change in random numbers
from ThePEG
2005-09-05 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Utilities/HerwigRun.cc: changes to documentation to remove some
doxygen errors and more changes due to change in random numbers
from ThePEG
2005-09-04 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/tagfileThePEG.tag (Repository): changes to documentation so
that include is not scanned by doxygen and duplicate base classes
do not appear
* Utilities/Kinematics.cc (Repository): Changes for the changes to
random numbers from ThePEG and improvements to documentation
2005-09-04 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/tagfileThePEG.tag (Repository): changes to documentation so
that include is not scanned by doxygen and duplicate base classes
do not appear
* Utilities/Kinematics.cc (Repository): Changes for the changes to
random numbers from ThePEG and improvements to documentation
2005-09-04 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/tagfileThePEG.tag (Repository): changes to documentation so
that include is not scanned by doxygen and duplicate base classes
do not appear
* Utilities/Kinematics.cc (Repository): Changes for the changes to
random numbers from ThePEG and improvements to documentation
2005-09-04 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/tagfileThePEG.tag (Repository): changes to documentation so
that include is not scanned by doxygen and duplicate base classes
do not appear
* Utilities/Kinematics.cc (Repository): Changes for the changes to
random numbers from ThePEG and improvements to documentation
2005-09-04 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Doc/tagfileThePEG.tag (Repository): changes to documentation so
that include is not scanned by doxygen and duplicate base classes
do not appear
* Utilities/Kinematics.cc (Repository): Changes for the changes to
random numbers from ThePEG and improvements to documentation
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.icc (Repository): changes to partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.fh (Repository): added new
partonic decayers for b to s gamma and weak partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Hadronization/PartonicHadronizer.h (Repository): added new class
for hadronization of partonic b and c decays.
* Hadronization/PartonSplitter.h (Repository): changes to the
hadronization to ensure only the taggws particles are hadronized.
* PDT/GenericWidthGenerator.icc (Repository): S->VV shape and
naive running width option added
* Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc (Repository):
various minor fixes to the decay classes.
* Decay/ScalarMeson/ScalarVectorVectorDecayer.icc (Repository):
added new decayer for S -> VV
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic (Repository): added files for b to s gamma
hadronic mass spectra
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/SpinorWaveFunction.icc (Repository):
changes to helicity classes to move large inlined members to the
.cc files
* Makefile.am (Repository): Interfaces now made automatically
* Decay/Partonic/QuarkoniumDecayer.icc (Repository): changes to
move partonic decayers into a sperate directory
* Decay/HeavyDecayer.icc (Repository): changes to move partonic
decayers into a seperate directory
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Changes for changes to the LorentzRotation in ThePEG
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.icc (Repository): changes to partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.fh (Repository): added new
partonic decayers for b to s gamma and weak partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Hadronization/PartonicHadronizer.h (Repository): added new class
for hadronization of partonic b and c decays.
* Hadronization/PartonSplitter.h (Repository): changes to the
hadronization to ensure only the taggws particles are hadronized.
* PDT/GenericWidthGenerator.icc (Repository): S->VV shape and
naive running width option added
* Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc (Repository):
various minor fixes to the decay classes.
* Decay/ScalarMeson/ScalarVectorVectorDecayer.icc (Repository):
added new decayer for S -> VV
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic (Repository): added files for b to s gamma
hadronic mass spectra
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/SpinorWaveFunction.icc (Repository):
changes to helicity classes to move large inlined members to the
.cc files
* Makefile.am (Repository): Interfaces now made automatically
* Decay/Partonic/QuarkoniumDecayer.icc (Repository): changes to
move partonic decayers into a sperate directory
* Decay/HeavyDecayer.icc (Repository): changes to move partonic
decayers into a seperate directory
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Changes for changes to the LorentzRotation in ThePEG
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.icc (Repository): changes to partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.fh (Repository): added new
partonic decayers for b to s gamma and weak partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Hadronization/PartonicHadronizer.h (Repository): added new class
for hadronization of partonic b and c decays.
* Hadronization/PartonSplitter.h (Repository): changes to the
hadronization to ensure only the taggws particles are hadronized.
* PDT/GenericWidthGenerator.icc (Repository): S->VV shape and
naive running width option added
* Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc (Repository):
various minor fixes to the decay classes.
* Decay/ScalarMeson/ScalarVectorVectorDecayer.icc (Repository):
added new decayer for S -> VV
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic (Repository): added files for b to s gamma
hadronic mass spectra
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/SpinorWaveFunction.icc (Repository):
changes to helicity classes to move large inlined members to the
.cc files
* Makefile.am (Repository): Interfaces now made automatically
* Decay/Partonic/QuarkoniumDecayer.icc (Repository): changes to
move partonic decayers into a sperate directory
* Decay/HeavyDecayer.icc (Repository): changes to move partonic
decayers into a seperate directory
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Changes for changes to the LorentzRotation in ThePEG
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.icc (Repository): changes to partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.fh (Repository): added new
partonic decayers for b to s gamma and weak partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Hadronization/PartonicHadronizer.h (Repository): added new class
for hadronization of partonic b and c decays.
* Hadronization/PartonSplitter.h (Repository): changes to the
hadronization to ensure only the taggws particles are hadronized.
* PDT/GenericWidthGenerator.icc (Repository): S->VV shape and
naive running width option added
* Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc (Repository):
various minor fixes to the decay classes.
* Decay/ScalarMeson/ScalarVectorVectorDecayer.icc (Repository):
added new decayer for S -> VV
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic (Repository): added files for b to s gamma
hadronic mass spectra
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/SpinorWaveFunction.icc (Repository):
changes to helicity classes to move large inlined members to the
.cc files
* Makefile.am (Repository): Interfaces now made automatically
* Decay/Partonic/QuarkoniumDecayer.icc (Repository): changes to
move partonic decayers into a sperate directory
* Decay/HeavyDecayer.icc (Repository): changes to move partonic
decayers into a seperate directory
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Changes for changes to the LorentzRotation in ThePEG
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/HwDecayHandler.icc (Repository): changes to partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic/BtoSGammaDecayer.fh (Repository): added new
partonic decayers for b to s gamma and weak partonic decays
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Hadronization/PartonicHadronizer.h (Repository): added new class
for hadronization of partonic b and c decays.
* Hadronization/PartonSplitter.h (Repository): changes to the
hadronization to ensure only the taggws particles are hadronized.
* PDT/GenericWidthGenerator.icc (Repository): S->VV shape and
naive running width option added
* Decay/ScalarMeson/PScalarVectorFermionsDecayer.cc (Repository):
various minor fixes to the decay classes.
* Decay/ScalarMeson/ScalarVectorVectorDecayer.icc (Repository):
added new decayer for S -> VV
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Decay/Partonic (Repository): added files for b to s gamma
hadronic mass spectra
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Helicity/WaveFunction/SpinorWaveFunction.icc (Repository):
changes to helicity classes to move large inlined members to the
.cc files
* Makefile.am (Repository): Interfaces now made automatically
* Decay/Partonic/QuarkoniumDecayer.icc (Repository): changes to
move partonic decayers into a sperate directory
* Decay/HeavyDecayer.icc (Repository): changes to move partonic
decayers into a seperate directory
2005-09-01 Peter Richardson <Peter.Richardson@durham.ac.uk>
* Changes for changes to the LorentzRotation in ThePEG
diff --git a/Contrib/AcerDetInterface/Makefile.in b/Contrib/AcerDetInterface/Makefile.in
--- a/Contrib/AcerDetInterface/Makefile.in
+++ b/Contrib/AcerDetInterface/Makefile.in
@@ -1,50 +1,50 @@
# -*- Makefile -*- (for emacs)
#
# This Makefile is intended for compiling Herwig++ plugins
# You can find plugins here: INSERT URL
#
# This Makefile received very little testing,
# any bug reports are very welcome!
#
# location of include files
THEPEGINCLUDE =
GSLINCLUDE =
HERWIGINCLUDE =
FC =
FCLIBS =
LDFLAGS =
SHARED_FLAG =
HEPMCLIBS = -L/scratch/richardn/montecarlo/utilities/lib
ACERDETPATH = /scratch/richardn/montecarlo/detector/AcerDET-1.0
ACERDETINCLUDE = -I$(ACERDETPATH)/acerdet_inc
ACERDETLIB = -L$(ACERDETPATH)/acerdet_lib -lacerdet
CERNPATH = /scratch/richardn/montecarlo/detector/lib
-CERNLIB = -L$(CERNPATH) -lpacklib -lmathlib -lkernlib -lphtools -lnsl -lcrypt -ldl
+CERNLIB = -L$(CERNPATH) -lpacklib -lmathlib -lkernlib -lnsl -lcrypt -ldl
INCLUDE = $(THEPEGINCLUDE) $(GSLINCLUDE) $(HERWIGINCLUDE)
#
# C++ flags
#
CXX =
CXXFLAGS =
ALLCCFILES=$(shell echo *.cc)
default : HwAcerDet.so ZAnalysis.so
HwAcerDet.so : AcerDet.cc AcerDet.h AcerDet_files.o
$(CXX) -fPIC $(INCLUDE) $(CXXFLAGS) $(SHARED_FLAG) $(LDFLAGS) \
AcerDet_files.o AcerDet.cc -o HwAcerDet.so \
$(ACERDETLIB) $(CERNLIB) $(HEPMCLIBS) -lHepMC -lHepMCfio $(FCLIBS)
ZAnalysis.so : ZAnalysis.cc ZAnalysis.h
$(CXX) -fPIC $(INCLUDE) $(CXXFLAGS) $(SHARED_FLAG) $(LDFLAGS) \
ZAnalysis.cc -o ZAnalysis.so \
$(ACERDETLIB) $(CERNLIB) $(HEPMCLIBS) -lHepMC -lHepMCfio $(FCLIBS)
AcerDet_files.o: AcerDet_files.f
- $(FC) $(ACERDETINCLUDE) -c -fno-second-underscore AcerDet_files.f
+ $(FC) -fPIC $(ACERDETINCLUDE) -c -fno-second-underscore AcerDet_files.f
clean:
rm -f *.o *.so
\ No newline at end of file
diff --git a/Contrib/Makefile.am b/Contrib/Makefile.am
--- a/Contrib/Makefile.am
+++ b/Contrib/Makefile.am
@@ -1,19 +1,17 @@
EXTRA_DIST = \
AcerDetInterface \
AlpGen \
Analysis2 \
AnomalousHVV \
DecayAnalysis \
HiggsPair \
LeptonME \
-MCPWNLO \
PGSInterface \
RadiativeZPrime \
-TauAnalysis \
-VBFTest
+TauAnalysis
dist-hook:
rm -rf `find $(distdir) -name '.svn' -or -name 'Makefile'`
all:
bash make_makefiles.sh
diff --git a/Contrib/PGSInterface/Makefile.in b/Contrib/PGSInterface/Makefile.in
--- a/Contrib/PGSInterface/Makefile.in
+++ b/Contrib/PGSInterface/Makefile.in
@@ -1,47 +1,47 @@
# -*- Makefile -*- (for emacs)
#
# This Makefile is intended for compiling Herwig++ plugins
# You can find plugins here: INSERT URL
#
# This Makefile received very little testing,
# any bug reports are very welcome!
#
# location of include files (etc)
THEPEGINCLUDE =
GSLINCLUDE =
HERWIGINCLUDE =
FC =
FCLIBS =
LDFLAGS =
SHARED_FLAG =
HEPMCLIBS = -L/scratch/richardn/montecarlo/utilities/lib
PGSPATH = /scratch/richardn/montecarlo/detector/PGS/
PGSLIB = -L$(PGSPATH)/lib -lpgslib -lstdhep -lFmcfio -lpythia -ltauola -lherwig
INCLUDE = $(THEPEGINCLUDE) $(GSLINCLUDE) $(HERWIGINCLUDE)
#
# C++ flags
#
CXX =
CXXFLAGS =
ALLCCFILES=$(shell echo *.cc)
default : HwPGSInterface.so ZAnalysis.so
HwPGSInterface.so : PGSInterface.cc PGSInterface.h PGSInterface.o
$(CXX) -fPIC $(CPPFLAGS) $(INCLUDE) $(CXXFLAGS) $(SHARED_FLAG) $(LDFLAGS) \
PGSInterface.o PGSInterface.cc -o HwPGSInterface.so \
$(PGSLIB) $(HEPMCLIBS) -lHepMC -lHepMCfio $(FCLIBS)
ZAnalysis.so : ZAnalysis.cc ZAnalysis.h
$(CXX) -fPIC $(CPPFLAGS) $(INCLUDE) $(CXXFLAGS) $(SHARED_FLAG) $(LDFLAGS) \
ZAnalysis.cc -o ZAnalysis.so \
$(PGSLIB) $(HEPMCLIBS) -lHepMC -lHepMCfio $(FCLIBS)
PGSInterface.o: PGSInterface.f
- $(FC) -c -fno-second-underscore PGSInterface.f
+ $(FC) -c -fPIC -fno-second-underscore PGSInterface.f
clean:
rm -f *.o *.so
diff --git a/Contrib/PGSInterface/PGSInterface.cc b/Contrib/PGSInterface/PGSInterface.cc
old mode 100755
new mode 100644
diff --git a/Contrib/PGSInterface/PGSInterface.f b/Contrib/PGSInterface/PGSInterface.f
old mode 100755
new mode 100644
diff --git a/Contrib/PGSInterface/PGSInterface.h b/Contrib/PGSInterface/PGSInterface.h
old mode 100755
new mode 100644
diff --git a/Contrib/RadiativeZPrime/AnomalousVVVVertex.cc b/Contrib/RadiativeZPrime/AnomalousVVVVertex.cc
--- a/Contrib/RadiativeZPrime/AnomalousVVVVertex.cc
+++ b/Contrib/RadiativeZPrime/AnomalousVVVVertex.cc
@@ -1,49 +1,50 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the AnomalousVVVVertex class.
//
#include "AnomalousVVVVertex.h"
#include "ThePEG/Helicity/epsilon.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/PDT/EnumParticles.h"
using namespace RadiativeZPrime;
AbstractNoPIOClassDescription<AnomalousVVVVertex>
AnomalousVVVVertex::initAnomalousVVVVertex;
// Definition of the static class description member.
void AnomalousVVVVertex::Init() {
static ClassDocumentation<AnomalousVVVVertex> documentation
("There is no documentation for the AnomalousVVVVertex class");
}
// evaluate the vertex
Complex AnomalousVVVVertex::evaluate(Energy2 q2, const VectorWaveFunction & vec1,
const VectorWaveFunction & vec2,
const VectorWaveFunction & vec3) {
// calculate the coupling
setCoupling(q2,vec1.particle(),vec2.particle(),vec3.particle());
LorentzPolarizationVector eps = epsilon(vec1.wave(),vec2.wave(),vec3.wave());
if(vec1.particle()->id()==ParticleID::gamma)
return norm()*Complex(0.,1.)*(eps*vec1.momentum())*UnitRemoval::InvE;
else if(vec2.particle()->id()==ParticleID::gamma)
return norm()*Complex(0.,1.)*(eps*vec2.momentum())*UnitRemoval::InvE;
else
return norm()*Complex(0.,1.)*(eps*vec3.momentum())*UnitRemoval::InvE;
}
// off-shell vector
VectorWaveFunction AnomalousVVVVertex::evaluate(Energy2, int, tcPDPtr,
const VectorWaveFunction & ,
const VectorWaveFunction &,
- Energy, Energy) {
+ complex<Energy>,
+ complex<Energy>) {
throw Exception() << "AnomalousVVVVertex::evaluate() only implemented "
<< "for the evaluation of the vertex, not for the "
<< "evaluation of the off-shell vector wavefunction"
<< Exception::runerror;
}
diff --git a/Contrib/RadiativeZPrime/AnomalousVVVVertex.h b/Contrib/RadiativeZPrime/AnomalousVVVVertex.h
--- a/Contrib/RadiativeZPrime/AnomalousVVVVertex.h
+++ b/Contrib/RadiativeZPrime/AnomalousVVVVertex.h
@@ -1,138 +1,139 @@
// -*- C++ -*-
#ifndef RADIATIVEZPRIME_AnomalousVVVVertex_H
#define RADIATIVEZPRIME_AnomalousVVVVertex_H
//
// This is the declaration of the AnomalousVVVVertex class.
//
#include "ThePEG/Helicity/Vertex/AbstractVVVVertex.h"
namespace RadiativeZPrime {
using namespace ThePEG;
using namespace ThePEG::Helicity;
/**
* The AnomalousVVVVertex class implements the anomalous Vector-Vector-Vector vertex.
*
* Only the member which evaluates the matrix element is implemented. The vertex
* is defined to be
* \[ i\epsilon_{\mu\nu\alpha\beta}
* \varepsilon^\mu_1 \varepsilon^\nu_2 \varepsilon^\alpha_2 p_1^\beta\]
*
*
* @see \ref AnomalousVVVVertexInterfaces "The interfaces"
* defined for AnomalousVVVVertex.
*/
class AnomalousVVVVertex: public AbstractVVVVertex {
public:
/**
* Members to calculate the helicity amplitude expressions for vertices
* and off-shell particles.
*/
//@{
/**
* Evaluate the vertex.
* @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
* @param vec1 The wavefunction for the first vector.
* @param vec2 The wavefunction for the second vector.
* @param vec3 The wavefunction for the third vector.
*/
virtual Complex evaluate(Energy2 q2, const VectorWaveFunction & vec1,
const VectorWaveFunction & vec2,
const VectorWaveFunction & vec3);
/**
* Evaluate the off-shell vector coming from the vertex.
* @param q2 The scale \f$q^2\f$ for the coupling at the vertex.
* @param iopt Option of the shape of the Breit-Wigner for the off-shell vector.
* @param out The ParticleData pointer for the off-shell vector.
* @param vec2 The wavefunction for the second vector.
* @param vec3 The wavefunction for the third vector.
* @param mass The mass of the off-shell particle if not taken from the ParticleData
* object
* @param width The width of the off-shell particle if not taken from the ParticleData
* object
*/
virtual VectorWaveFunction evaluate(Energy2 q2,int iopt, tcPDPtr out,
const VectorWaveFunction & vec2,
const VectorWaveFunction & vec3,
- Energy mass=-GeV, Energy width=-GeV);
+ complex<Energy> mass=-GeV,
+ complex<Energy> width=-GeV);
//@}
/**
* Calculate the couplings. This method is virtual and must be implemented in
* classes inheriting from this.
* @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)=0;
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();
private:
/**
* The static object used to initialize the description of this class.
* Indicates that this is an abstract class without persistent data.
*/
static AbstractNoPIOClassDescription<AnomalousVVVVertex> initAnomalousVVVVertex;
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
AnomalousVVVVertex & operator=(const AnomalousVVVVertex &);
};
}
#include "ThePEG/Utilities/ClassTraits.h"
namespace ThePEG {
/** @cond TRAITSPECIALIZATIONS */
/** This template specialization informs ThePEG about the
* base classes of AnomalousVVVVertex. */
template <>
struct BaseClassTrait<RadiativeZPrime::AnomalousVVVVertex,1> {
/** Typedef of the first base class of AnomalousVVVVertex. */
typedef Helicity::AbstractVVVVertex NthBase;
};
/** This template specialization informs ThePEG about the name of
* the AnomalousVVVVertex class and the shared object where it is defined. */
template <>
struct ClassTraits<RadiativeZPrime::AnomalousVVVVertex>
: public ClassTraitsBase<RadiativeZPrime::AnomalousVVVVertex> {
/** Return a platform-independent class name */
static string className() { return "RadiativeZPrime::AnomalousVVVVertex"; }
/**
* The name of a file containing the dynamic library where the class
* AnomalousVVVVertex is implemented. It may also include several, space-separated,
* libraries if the class AnomalousVVVVertex 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 "RadiativeZPrime.so"; }
};
/** @endcond */
}
#endif /* RADIATIVEZPRIME_AnomalousVVVVertex_H */
diff --git a/Contrib/RadiativeZPrime/GammaZPrimeZVertex.h b/Contrib/RadiativeZPrime/GammaZPrimeZVertex.h
--- a/Contrib/RadiativeZPrime/GammaZPrimeZVertex.h
+++ b/Contrib/RadiativeZPrime/GammaZPrimeZVertex.h
@@ -1,154 +1,154 @@
// -*- C++ -*-
#ifndef RADIATIVEZPRIME_GammaZPrimeZVertex_H
#define RADIATIVEZPRIME_GammaZPrimeZVertex_H
//
// This is the declaration of the GammaZPrimeZVertex class.
//
#include "AnomalousVVVVertex.h"
namespace RadiativeZPrime {
using namespace ThePEG;
/**
* Here is the documentation of the GammaZPrimeZVertex class.
*
* @see \ref GammaZPrimeZVertexInterfaces "The interfaces"
* defined for GammaZPrimeZVertex.
*/
class GammaZPrimeZVertex: public AnomalousVVVVertex {
public:
/**
* The default constructor.
*/
- inline GammaZPrimeZVertex();
+ GammaZPrimeZVertex();
/**
* Calculate the couplings. This method is virtual and must be implemented in
* classes inheriting from this.
* @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:
/** @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:
/**
* The static object used to initialize the description of this class.
* Indicates that this is a concrete class with persistent data.
*/
static ClassDescription<GammaZPrimeZVertex> initGammaZPrimeZVertex;
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
GammaZPrimeZVertex & operator=(const GammaZPrimeZVertex &);
private:
/**
* Storage of the coupling
*/
double _coup;
};
}
#include "ThePEG/Utilities/ClassTraits.h"
namespace ThePEG {
/** @cond TRAITSPECIALIZATIONS */
/** This template specialization informs ThePEG about the
* base classes of GammaZPrimeZVertex. */
template <>
struct BaseClassTrait<RadiativeZPrime::GammaZPrimeZVertex,1> {
/** Typedef of the first base class of GammaZPrimeZVertex. */
typedef RadiativeZPrime::AnomalousVVVVertex NthBase;
};
/** This template specialization informs ThePEG about the name of
* the GammaZPrimeZVertex class and the shared object where it is defined. */
template <>
struct ClassTraits<RadiativeZPrime::GammaZPrimeZVertex>
: public ClassTraitsBase<RadiativeZPrime::GammaZPrimeZVertex> {
/** Return a platform-independent class name */
static string className() { return "RadiativeZPrime::GammaZPrimeZVertex"; }
/**
* The name of a file containing the dynamic library where the class
* GammaZPrimeZVertex is implemented. It may also include several, space-separated,
* libraries if the class GammaZPrimeZVertex 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 "RadiativeZPrime.so"; }
};
/** @endcond */
}
#endif /* RADIATIVEZPRIME_GammaZPrimeZVertex_H */
diff --git a/Decay/Perturbative/Makefile.am b/Decay/Perturbative/Makefile.am
--- a/Decay/Perturbative/Makefile.am
+++ b/Decay/Perturbative/Makefile.am
@@ -1,18 +1,18 @@
pkglib_LTLIBRARIES = HwPerturbativeDecay.la HwPerturbativeHiggsDecay.la
HwPerturbativeDecay_la_SOURCES = \
SMWDecayer.cc SMWDecayer.h\
SMZDecayer.cc SMZDecayer.h\
SMTopDecayer.cc SMTopDecayer.h\
SMTopPOWHEGDecayer.cc SMTopPOWHEGDecayer.h\
SMZFermionsPOWHEGDecayer.cc SMZFermionsPOWHEGDecayer.h\
SMWFermionsPOWHEGDecayer.cc SMWFermionsPOWHEGDecayer.h
-HwPerturbativeDecay_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 7:1:0
+HwPerturbativeDecay_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 8:0:0
HwPerturbativeHiggsDecay_la_SOURCES = \
SMHiggsFermionsDecayer.cc SMHiggsFermionsDecayer.h \
SMHiggsFermionsPOWHEGDecayer.cc SMHiggsFermionsPOWHEGDecayer.h \
SMHiggsGGHiggsPPDecayer.cc SMHiggsGGHiggsPPDecayer.h\
SMHiggsWWDecayer.cc SMHiggsWWDecayer.h
-HwPerturbativeHiggsDecay_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 7:1:0
+HwPerturbativeHiggsDecay_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 8:0:0
diff --git a/Decay/ScalarMeson/Makefile.am b/Decay/ScalarMeson/Makefile.am
--- a/Decay/ScalarMeson/Makefile.am
+++ b/Decay/ScalarMeson/Makefile.am
@@ -1,20 +1,20 @@
pkglib_LTLIBRARIES = HwSMDecay.la
HwSMDecay_la_SOURCES = \
EtaPiGammaGammaDecayer.cc EtaPiGammaGammaDecayer.h\
EtaPiPiGammaDecayer.cc EtaPiPiGammaDecayer.h \
EtaPiPiPiDecayer.cc EtaPiPiPiDecayer.h \
PScalar4FermionsDecayer.cc PScalar4FermionsDecayer.h\
PScalarLeptonNeutrinoDecayer.cc PScalarLeptonNeutrinoDecayer.h\
PScalarPScalarVectorDecayer.cc PScalarPScalarVectorDecayer.h \
PScalarVectorFermionsDecayer.cc PScalarVectorFermionsDecayer.h\
PScalarVectorVectorDecayer.cc PScalarVectorVectorDecayer.h\
ScalarMesonTensorScalarDecayer.cc ScalarMesonTensorScalarDecayer.h\
ScalarScalarScalarDecayer.cc ScalarScalarScalarDecayer.h \
SemiLeptonicScalarDecayer.cc SemiLeptonicScalarDecayer.h \
ScalarMesonFactorizedDecayer.cc ScalarMesonFactorizedDecayer.h \
ScalarVectorVectorDecayer.h ScalarVectorVectorDecayer.cc \
DtoKPiPiCLEO.h DtoKPiPiCLEO.cc \
DtoKPiPiE691.h DtoKPiPiE691.cc\
DtoKPiPiMarkIII.h DtoKPiPiMarkIII.cc
-HwSMDecay_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 9:0:0
+HwSMDecay_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 9:1:0
diff --git a/Decay/WeakCurrents/ThreeMesonCurrentBase.cc b/Decay/WeakCurrents/ThreeMesonCurrentBase.cc
--- a/Decay/WeakCurrents/ThreeMesonCurrentBase.cc
+++ b/Decay/WeakCurrents/ThreeMesonCurrentBase.cc
@@ -1,248 +1,248 @@
// -*- C++ -*-
//
// ThreeMesonCurrentBase.cc is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2011 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 ThreeMesonCurrentBase class.
//
#include "ThreeMesonCurrentBase.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Helicity/epsilon.h"
#include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
#include "ThePEG/Utilities/DescribeClass.h"
using namespace Herwig;
using namespace ThePEG;
using namespace ThePEG::Helicity;
ThreeMesonCurrentBase::ThreeMesonCurrentBase() {
// the quarks for the different modes
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-3);
addDecayMode(2,-3);
addDecayMode(2,-3);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
addDecayMode(2,-1);
setInitialModes(12);
}
DescribeAbstractNoPIOClass<ThreeMesonCurrentBase,WeakDecayCurrent>
describeHerwigThreeMesonCurrentBase("Herwig::ThreeMesonCurrentBase",
"HwWeakCurrents.so");
void ThreeMesonCurrentBase::Init() {
static ClassDocumentation< ThreeMesonCurrentBase> documentation
("The ThreeMesonCurrentBase class is designed to be the "
"base class for "
"the three meson decays of the tau, ie pi- pi- pi+, pi0 pi0 pi-, "
"K- pi- K+, K0 pi- Kbar0, K- pi0 K0,pi0 pi0 K-, K- pi- pi+, "
"pi- Kbar0 pi0, pi- pi0 eta, K0S pi- K0S, K0L pi- K0L, K0S pi- K0L");
}
// the hadronic currents
vector<LorentzPolarizationVectorE>
ThreeMesonCurrentBase::current(const int imode, const int ichan,
Energy & scale,const ParticleVector & decay,
DecayIntegrator::MEOption meopt) const {
if(meopt==DecayIntegrator::Terminate) {
for(unsigned int ix=0;ix<3;++ix)
ScalarWaveFunction::constructSpinInfo(decay[ix],outgoing,true);
return vector<LorentzPolarizationVectorE>(1,LorentzPolarizationVectorE());
}
// calculate q2,s1,s2,s3
Lorentz5Momentum q;
for(unsigned int ix=0;ix<decay.size();++ix){q+=decay[ix]->momentum();}
q.rescaleMass();
scale=q.mass();
Energy2 q2=q.mass2();
Energy2 s1 = (decay[1]->momentum()+decay[2]->momentum()).m2();
Energy2 s2 = (decay[0]->momentum()+decay[2]->momentum()).m2();
Energy2 s3 = (decay[0]->momentum()+decay[1]->momentum()).m2();
FormFactors F = calculateFormFactors(ichan,imode,q2,s1,s2,s3);
//if(inpart.id()==ParticleID::tauplus){F.F5=conj(F.F5);}
// the first three form-factors
LorentzPolarizationVector vect;
vect = (F.F2-F.F1)*decay[2]->momentum()
+(F.F1-F.F3)*decay[1]->momentum()
+(F.F3-F.F2)*decay[0]->momentum();
// multiply by the transverse projection operator
complex<InvEnergy> dot=(vect*q)/q2;
// scalar and parity violating terms
vect += (F.F4-dot)*q;
- if(F.F5!=InvEnergy3())
+ if(F.F5!=complex<InvEnergy3>())
vect += Complex(0.,1.)*F.F5*Helicity::epsilon(decay[0]->momentum(),
decay[1]->momentum(),
decay[2]->momentum());
// factor to get dimensions correct
return vector<LorentzPolarizationVectorE>(1,q.mass()*vect);
}
bool ThreeMesonCurrentBase::accept(vector<int> id) {
int npip(0),npim(0),nkp(0),nkm(0),
npi0(0),nk0(0),nk0bar(0),neta(0),nks(0),nkl(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(id[ix]==ParticleID::piplus) ++npip;
else if(id[ix]==ParticleID::piminus) ++npim;
else if(id[ix]==ParticleID::Kplus) ++nkp;
else if(id[ix]==ParticleID::Kminus) ++nkm;
else if(id[ix]==ParticleID::pi0) ++npi0;
else if(id[ix]==ParticleID::K0) ++nk0;
else if(id[ix]==ParticleID::Kbar0) ++nk0bar;
else if(id[ix]==ParticleID::eta) ++neta;
else if(id[ix]==ParticleID::K_S0) ++nks;
else if(id[ix]==ParticleID::K_L0) ++nkl;
}
int imode(-1);
if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0;
else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1;
else if( (nkp==1&&nkm==1&&npip==1) ||
(nkp==1&&nkm==1&&npim==1)) imode= 2;
else if( (nk0==1&&nk0bar==1&&npip==1) ||
(nk0==1&&nk0bar==1&&npim==1)) imode= 3;
else if( (nkp==1&&nk0bar==1&&npi0==1) ||
(nkm==1&&npi0==1&&nk0==1)) imode= 4;
else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5;
else if( (npip==1&&npim==1&&nkp==1) ||
(nkm==1&&npim==1&&npip==1) ) imode= 6;
else if( (nk0==1&&npip==1&&npi0==1) ||
(npim==1&&nk0bar==1&&npi0==1)) imode= 7;
else if( (npip==1&&npi0==1&&neta==1) ||
(npim==1&&npi0==1&&neta==1)) imode= 8;
else if( nks==2 && (npip==1||npim==1) ) imode= 9;
else if( nkl==2 && (npip==1||npim==1) ) imode=10;
else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11;
return imode==-1 ? false : acceptMode(imode);
}
unsigned int ThreeMesonCurrentBase::decayMode(vector<int> id) {
int npip(0),npim(0),nkp(0),nkm(0),
npi0(0),nk0(0),nk0bar(0),neta(0),nks(0),nkl(0);
for(unsigned int ix=0;ix<id.size();++ix) {
if(id[ix]==ParticleID::piplus) ++npip;
else if(id[ix]==ParticleID::piminus) ++npim;
else if(id[ix]==ParticleID::Kplus) ++nkp;
else if(id[ix]==ParticleID::Kminus) ++nkm;
else if(id[ix]==ParticleID::pi0) ++npi0;
else if(id[ix]==ParticleID::K0) ++nk0;
else if(id[ix]==ParticleID::Kbar0) ++nk0bar;
else if(id[ix]==ParticleID::eta) ++neta;
else if(id[ix]==ParticleID::K_S0) ++nks;
else if(id[ix]==ParticleID::K_L0) ++nkl;
}
int imode(-1);
if( (npip==2&&npim==1) || (npim==2&&npip==1) ) imode= 0;
else if( (npip==1&&npi0==2) || (npim==1&&npi0==2) ) imode= 1;
else if( (nkp==1&&nkm==1&&npip==1) ||
(nkp==1&&nkm==1&&npim==1)) imode= 2;
else if( (nk0==1&&nk0bar==1&&npip==1) ||
(nk0==1&&nk0bar==1&&npim==1)) imode= 3;
else if( (nkp==1&&nk0bar==1&&npi0==1) ||
(nkm==1&&npi0==1&&nk0==1)) imode= 4;
else if( (nkp==1&&npi0==2) || (npi0==2&&nkm==1) ) imode= 5;
else if( (npip==1&&npim==1&&nkp==1) ||
(nkm==1&&npim==1&&npip==1) ) imode= 6;
else if( (nk0==1&&npip==1&&npi0==1) ||
(npim==1&&nk0bar==1&&npi0==1)) imode= 7;
else if( (npip==1&&npi0==1&&neta==1) ||
(npim==1&&npi0==1&&neta==1)) imode= 8;
else if( nks==2 && (npip==1||npim==1) ) imode= 9;
else if( nkl==2 && (npip==1||npim==1) ) imode=10;
else if( nks==1&&nkl==1 && (npip==1||npim==1) ) imode=11;
return imode;
}
void ThreeMesonCurrentBase::dataBaseOutput(ofstream & output,bool header,
bool create) const {
WeakDecayCurrent::dataBaseOutput(output,header,create);
}
tPDVector ThreeMesonCurrentBase::particles(int icharge, unsigned int imode,int,int) {
tPDVector extpart(3);
if(imode==0) {
extpart[0]=getParticleData(ParticleID::piminus);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::piplus);
}
else if(imode==1) {
extpart[0]=getParticleData(ParticleID::pi0);
extpart[1]=getParticleData(ParticleID::pi0);
extpart[2]=getParticleData(ParticleID::piminus);
}
else if(imode==2) {
extpart[0]=getParticleData(ParticleID::Kminus);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::Kplus);
}
else if(imode==3) {
extpart[0]=getParticleData(ParticleID::K0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::Kbar0);
}
else if(imode==4) {
extpart[0]=getParticleData(ParticleID::Kminus);
extpart[1]=getParticleData(ParticleID::pi0);
extpart[2]=getParticleData(ParticleID::K0);
}
else if(imode==5) {
extpart[0]=getParticleData(ParticleID::pi0);
extpart[1]=getParticleData(ParticleID::pi0);
extpart[2]=getParticleData(ParticleID::Kminus);
}
else if(imode==6) {
extpart[0]=getParticleData(ParticleID::Kminus);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::piplus);
}
else if(imode==7) {
extpart[0]=getParticleData(ParticleID::piminus);
extpart[1]=getParticleData(ParticleID::Kbar0);
extpart[2]=getParticleData(ParticleID::pi0);
}
else if(imode==8) {
extpart[0]=getParticleData(ParticleID::piminus);
extpart[1]=getParticleData(ParticleID::pi0);
extpart[2]=getParticleData(ParticleID::eta);
}
else if(imode==9) {
extpart[0]=getParticleData(ParticleID::K_S0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::K_S0);
}
else if(imode==10) {
extpart[0]=getParticleData(ParticleID::K_L0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::K_L0);
}
else if(imode==11) {
extpart[0]=getParticleData(ParticleID::K_S0);
extpart[1]=getParticleData(ParticleID::piminus);
extpart[2]=getParticleData(ParticleID::K_L0);
}
// conjugate the particles if needed
if(icharge==3) {
for(unsigned int ix=0;ix<3;++ix) {
if(extpart[ix]->CC()) extpart[ix]=extpart[ix]->CC();
}
}
// return the answer
return extpart;
}
diff --git a/DipoleShower/Base/DipoleChain.cc b/DipoleShower/Base/DipoleChain.cc
--- a/DipoleShower/Base/DipoleChain.cc
+++ b/DipoleShower/Base/DipoleChain.cc
@@ -1,332 +1,324 @@
// -*- C++ -*-
//
// DipoleChain.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 DipoleChain class.
//
#include "DipoleChain.h"
#include "Herwig++/DipoleShower/Utility/DipolePartonSplitter.h"
#include <boost/utility.hpp>
-#include <config.h>
-#ifdef HAVE_CXX11
-using std::next;
-#else
-using boost::next;
-#endif
-using boost::prior;
-
using namespace Herwig;
DipoleChain::DipoleChain()
: ggSingleDipole(false) {}
bool DipoleChain::circular () const {
return
(theDipoles.front().leftParticle() ==
theDipoles.back().rightParticle());
}
bool DipoleChain::hasLeftNeighbour (list<Dipole>::const_iterator dc) const {
if ( dc == dipoles().begin() )
return circular();
return true;
}
Dipole& DipoleChain::leftNeighbour (list<Dipole>::iterator dc) {
assert(hasLeftNeighbour(dc));
if ( dc == dipoles().begin() )
return dipoles().back();
return *(--dc);
}
const Dipole& DipoleChain::leftNeighbour (list<Dipole>::const_iterator dc) const {
assert(hasLeftNeighbour(dc));
if ( dc == dipoles().begin() )
return dipoles().back();
return *(--dc);
}
list<Dipole>::iterator DipoleChain::leftNeighbourIterator(list<Dipole>::iterator dc) {
assert(hasLeftNeighbour(dc));
if ( dc == dipoles().begin() )
return --dipoles().end();
return --dc;
}
bool DipoleChain::hasRightNeighbour (list<Dipole>::const_iterator dc) const {
if (dc == --dipoles().end())
return circular();
return true;
}
Dipole& DipoleChain::rightNeighbour (list<Dipole>::iterator dc) {
assert(hasRightNeighbour(dc));
if ( dc == --dipoles().end() )
return dipoles().front();
return *(++dc);
}
const Dipole& DipoleChain::rightNeighbour (list<Dipole>::const_iterator dc) const {
assert(hasRightNeighbour(dc));
if ( dc == --dipoles().end() )
return dipoles().front();
return *(++dc);
}
list<Dipole>::iterator DipoleChain::rightNeighbourIterator(list<Dipole>::iterator dc) {
assert(hasRightNeighbour(dc));
if ( dc == --dipoles().end() )
return dipoles().begin();
return ++dc;
}
void DipoleChain::check() {
- if ( theDipoles.begin() == prior(theDipoles.end()) ) {
+ if ( theDipoles.begin() == boost::prior(theDipoles.end()) ) {
if ( theDipoles.front().leftParticle()->hasColour() &&
theDipoles.front().leftParticle()->hasAntiColour() ) {
assert(theDipoles.front().rightParticle()->hasColour() &&
theDipoles.front().rightParticle()->hasAntiColour());
ggSingleDipole = true;
}
}
}
list<Dipole>::iterator DipoleChain::insertSplitting(list<Dipole>::iterator emittingDipole,
pair<Dipole,Dipole> children,
pair<list<Dipole>::iterator,list<Dipole>::iterator>& childIterators) {
assert(DipolePartonSplitter::colourConnected(children.first.leftParticle(),children.first.rightParticle()) ||
DipolePartonSplitter::colourConnected(children.second.leftParticle(),children.second.rightParticle()));
bool was_circular = circular();
if (hasLeftNeighbour(emittingDipole)) {
list<Dipole>::iterator theLeftNeighbour =
leftNeighbourIterator(emittingDipole);
theLeftNeighbour->rightParticle(children.first.leftParticle());
if ( children.first.leftParticle()->scale() < sqr(theLeftNeighbour->rightScale()) )
theLeftNeighbour->rightScale(sqrt(children.first.leftParticle()->scale()));
theLeftNeighbour->rightPDF(children.first.leftPDF());
theLeftNeighbour->rightFraction(children.first.leftFraction());
theLeftNeighbour->update();
}
if (hasRightNeighbour(emittingDipole)) {
list<Dipole>::iterator theRightNeighbour =
rightNeighbourIterator(emittingDipole);
theRightNeighbour->leftParticle(children.second.rightParticle());
if ( children.second.rightParticle()->scale() < sqr(theRightNeighbour->leftScale()) )
theRightNeighbour->leftScale(sqrt(children.second.rightParticle()->scale()));
theRightNeighbour->leftPDF(children.second.rightPDF());
theRightNeighbour->leftFraction(children.second.rightFraction());
theRightNeighbour->update();
}
if (DipolePartonSplitter::colourConnected(children.first.leftParticle(),children.first.rightParticle()) &&
DipolePartonSplitter::colourConnected(children.second.leftParticle(),children.second.rightParticle())) {
// nothing special to do, just replace the emitting dipole
// by the right one and insert the left one before it
*emittingDipole = children.second;
childIterators.second = emittingDipole;
childIterators.first = dipoles().insert(emittingDipole,children.first);
if ( ggSingleDipole ) {
ggSingleDipole = false;
Dipole miss;
miss.leftParticle(dipoles().back().rightParticle());
miss.rightParticle(dipoles().front().leftParticle());
miss.leftScale(dipoles().back().rightScale());
miss.rightScale(dipoles().front().leftScale());
miss.leftPDF(dipoles().back().rightPDF());
miss.rightPDF(dipoles().front().leftPDF());
miss.leftFraction(dipoles().back().rightFraction());
miss.rightFraction(dipoles().front().leftFraction());
miss.update();
dipoles().push_back(miss);
}
return dipoles().end();
}
if (!DipolePartonSplitter::colourConnected(children.first.leftParticle(),children.first.rightParticle())) {
if ( !was_circular && !ggSingleDipole ) {
*emittingDipole = children.second;
childIterators.second = emittingDipole;
assert(emittingDipole != dipoles().begin());
- childIterators.first = prior(emittingDipole);
+ childIterators.first = boost::prior(emittingDipole);
return emittingDipole;
}
*emittingDipole = children.second;
if ( ggSingleDipole ) {
ggSingleDipole = false;
Dipole miss;
miss.leftParticle(children.second.rightParticle());
miss.rightParticle(children.first.leftParticle());
miss.leftScale(children.second.rightScale());
miss.rightScale(children.first.leftScale());
miss.leftPDF(children.second.rightPDF());
miss.rightPDF(children.first.leftPDF());
miss.leftFraction(children.second.rightFraction());
miss.rightFraction(children.first.leftFraction());
miss.update();
dipoles().push_back(miss);
childIterators.first = dipoles().begin();
- childIterators.second = prior(dipoles().end());
+ childIterators.second = boost::prior(dipoles().end());
return dipoles().end();
}
childIterators.second = emittingDipole;
if ( emittingDipole == dipoles().begin() )
childIterators.first = --dipoles().end();
else
- childIterators.first = prior(emittingDipole);
+ childIterators.first = boost::prior(emittingDipole);
if ( emittingDipole == dipoles().begin() )
return dipoles().end();
dipoles().splice(dipoles().begin(),dipoles(),emittingDipole,dipoles().end());
// explicitly fix iterators in case the splice implementation
// at hand does invalidate iterators (the SGI docu says, it doesn't,
// but it seems that this behaviour is not part of the standard)
childIterators.second = dipoles().begin();
childIterators.first = --dipoles().end();
return dipoles().end();
}
if (!DipolePartonSplitter::colourConnected(children.second.leftParticle(),children.second.rightParticle())) {
if ( !was_circular && !ggSingleDipole ) {
*emittingDipole = children.first;
childIterators.first = emittingDipole;
assert(emittingDipole != --dipoles().end());
- childIterators.second = next(emittingDipole);
- return next(emittingDipole);
+ childIterators.second = boost::next(emittingDipole);
+ return boost::next(emittingDipole);
}
*emittingDipole = children.first;
if ( ggSingleDipole ) {
ggSingleDipole = false;
Dipole miss;
miss.leftParticle(children.second.rightParticle());
miss.rightParticle(children.first.leftParticle());
miss.leftScale(children.second.rightScale());
miss.rightScale(children.first.leftScale());
miss.leftPDF(children.second.rightPDF());
miss.rightPDF(children.first.leftPDF());
miss.leftFraction(children.second.rightFraction());
miss.rightFraction(children.first.leftFraction());
miss.update();
dipoles().push_front(miss);
childIterators.first = dipoles().begin();
- childIterators.second = prior(dipoles().end());
+ childIterators.second = boost::prior(dipoles().end());
return dipoles().end();
}
childIterators.first = emittingDipole;
if ( emittingDipole == --dipoles().end() )
childIterators.second = dipoles().begin();
else
- childIterators.second = next(emittingDipole);
+ childIterators.second = boost::next(emittingDipole);
if ( emittingDipole == --dipoles().end() )
return dipoles().end();
- dipoles().splice(dipoles().begin(),dipoles(),next(emittingDipole),dipoles().end());
+ dipoles().splice(dipoles().begin(),dipoles(),boost::next(emittingDipole),dipoles().end());
// explicitly fix iterators in case the splice implementation
// at hand does invalidate iterators (the SGI docu says, it doesn't,
// but it seems that this behaviour is not part of the standard)
childIterators.first = dipoles().begin();
childIterators.second = --dipoles().end();
return dipoles().end();
}
return dipoles().end();
}
void DipoleChain::updateDipole(list<Dipole>::iterator dip) {
dip->update();
if (hasLeftNeighbour(dip)) {
list<Dipole>::iterator theLeftNeighbour =
leftNeighbourIterator(dip);
theLeftNeighbour->rightParticle(dip->leftParticle());
theLeftNeighbour->rightPDF(dip->leftPDF());
theLeftNeighbour->rightFraction(dip->leftFraction());
theLeftNeighbour->update();
}
if (hasRightNeighbour(dip)) {
list<Dipole>::iterator theRightNeighbour =
rightNeighbourIterator(dip);
theRightNeighbour->leftParticle(dip->rightParticle());
theRightNeighbour->leftPDF(dip->rightPDF());
theRightNeighbour->leftFraction(dip->rightFraction());
theRightNeighbour->update();
}
}
void DipoleChain::print(ostream& os) const {
os << "--- DipoleChain ----------------------------------------------------------------\n";
if ( theDipoles.empty() ) {
os << " *** This DipoleChain is empty. ***\n";
} else {
os << " " << (!circular() ? "non-" : "") << "circular with "
<< theDipoles.size() << " dipoles\n";
for (list<Dipole>::const_iterator dit = theDipoles.begin();
dit != theDipoles.end(); ++dit) {
os << (*dit);
}
}
os << "--------------------------------------------------------------------------------\n";
os << flush;
}
diff --git a/DipoleShower/Base/DipoleEventRecord.cc b/DipoleShower/Base/DipoleEventRecord.cc
--- a/DipoleShower/Base/DipoleEventRecord.cc
+++ b/DipoleShower/Base/DipoleEventRecord.cc
@@ -1,840 +1,838 @@
// -*- C++ -*-
//
// DipoleEventRecord.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 DipoleEventRecord class.
//
#include "DipoleEventRecord.h"
#include "Herwig++/DipoleShower/Utility/DipolePartonSplitter.h"
#include "Herwig++/Shower/ShowerHandler.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/PDF/PartonExtractor.h"
#include <boost/utility.hpp>
-#include <config.h>
-#ifdef HAVE_CXX11
-using std::next;
-#else
-using boost::next;
-#endif
-using boost::prior;
-
#include <algorithm>
using namespace Herwig;
PList DipoleEventRecord::colourOrdered() {
PList colour_ordered;
size_t done_size = outgoing().size();
if (incoming().first->coloured())
++done_size;
if (incoming().second->coloured())
++done_size;
while (colour_ordered.size() != done_size) {
PPtr current;
// start with singlets, as long as we have some
if (find(colour_ordered.begin(),colour_ordered.end(),incoming().first) ==
colour_ordered.end() && incoming().first->coloured()) {
if (!incoming().first->hasColour() || !incoming().first->hasAntiColour())
current = incoming().first;
}
if (!current) {
for (PList::iterator p = outgoing().begin();
p != outgoing().end(); ++p) {
if (find(colour_ordered.begin(),colour_ordered.end(),*p) ==
colour_ordered.end() && (**p).coloured()) {
if (!(**p).hasColour() || !(**p).hasAntiColour()) {
current = *p;
break;
}
}
}
}
if (!current) {
if (find(colour_ordered.begin(),colour_ordered.end(),incoming().second) ==
colour_ordered.end() && incoming().second->coloured()) {
if (!incoming().second->hasColour() || !incoming().second->hasAntiColour())
current = incoming().second;
}
}
// then go on with anything else
if (!current) {
if (find(colour_ordered.begin(),colour_ordered.end(),incoming().first) ==
colour_ordered.end() && incoming().first->coloured()) {
current = incoming().first;
}
}
if (!current) {
for (PList::iterator p = outgoing().begin();
p != outgoing().end(); ++p) {
if (find(colour_ordered.begin(),colour_ordered.end(),*p) ==
colour_ordered.end() && (**p).coloured()) {
current = *p;
break;
}
}
}
if (!current) {
if (find(colour_ordered.begin(),colour_ordered.end(),incoming().second) ==
colour_ordered.end() && incoming().second->coloured()) {
current = incoming().second;
}
}
assert(current);
PPtr next;
Ptr<ColourLine>::ptr walk_the_line;
while (true) {
if (!walk_the_line) {
if (current->hasColour()) {
walk_the_line = current->colourLine();
}
else if (current->hasAntiColour()) {
walk_the_line = current->antiColourLine();
}
}
if (!next)
for (tPVector::const_iterator p = walk_the_line->coloured().begin();
p != walk_the_line->coloured().end(); ++p) {
if (*p == current)
continue;
if (find(outgoing().begin(),outgoing().end(),*p) != outgoing().end() ||
*p == incoming().first ||
*p == incoming().second) {
next = *p;
if (next->hasColour() && next->hasAntiColour()) {
walk_the_line = walk_the_line == next->colourLine() ? next->antiColourLine() : next->colourLine();
}
break;
}
}
if (!next)
for (tPVector::const_iterator p = walk_the_line->antiColoured().begin();
p != walk_the_line->antiColoured().end(); ++p) {
if (*p == current)
continue;
if (find(outgoing().begin(),outgoing().end(),*p) != outgoing().end() ||
*p == incoming().first ||
*p == incoming().second) {
next = *p;
if (next->hasColour() && next->hasAntiColour()) {
walk_the_line = walk_the_line == next->colourLine() ? next->antiColourLine() : next->colourLine();
}
break;
}
}
assert(next);
colour_ordered.push_back(current);
current = next;
// done if next is not a gluon or next is already in colour_ordered
if ((current->hasColour() && !current->hasAntiColour()) ||
(!current->hasColour() && current->hasAntiColour())) {
colour_ordered.push_back(current);
break;
}
if (next->hasColour() && next->hasAntiColour()) {
if (find(colour_ordered.begin(),colour_ordered.end(),next) != colour_ordered.end())
break;
}
next = PPtr();
}
}
return colour_ordered;
}
void DipoleEventRecord::popChain() {
assert(!theChains.empty());
theDoneChains.push_back(DipoleChain());
theDoneChains.back().dipoles().splice(theDoneChains.back().dipoles().begin(),theChains.front().dipoles());
theChains.pop_front();
}
void DipoleEventRecord::popChain(list<DipoleChain>::iterator ch) {
assert(!theChains.empty());
theDoneChains.push_back(DipoleChain());
theDoneChains.back().dipoles().splice(theDoneChains.back().dipoles().begin(),ch->dipoles());
theChains.erase(ch);
}
void DipoleEventRecord::popChains(const list<list<DipoleChain>::iterator>& chs) {
assert(!theChains.empty());
for ( list<list<DipoleChain>::iterator>::const_iterator ch =
chs.begin(); ch != chs.end(); ++ch ) {
theDoneChains.push_back(DipoleChain());
theDoneChains.back().dipoles().splice(theDoneChains.back().dipoles().begin(),(*ch)->dipoles());
}
for ( list<list<DipoleChain>::iterator>::const_iterator ch =
chs.begin(); ch != chs.end(); ++ch )
theChains.erase(*ch);
}
void DipoleEventRecord::findChains(const PList& ordered) {
theChains.clear();
theDoneChains.clear();
DipoleChain current_chain;
bool startIsTriplet =
(ordered.front()->hasColour() && !ordered.front()->hasAntiColour()) ||
(!ordered.front()->hasColour() && ordered.front()->hasAntiColour());
bool endIsTriplet =
(ordered.back()->hasColour() && !ordered.back()->hasAntiColour()) ||
(!ordered.back()->hasColour() && ordered.back()->hasAntiColour());
bool is33bar =
ordered.size() == 2 && startIsTriplet && endIsTriplet;
if (!is33bar) {
for (PList::const_iterator p = ordered.begin();
p != ordered.end(); ++p) {
PList::const_iterator next_it =
- p != --ordered.end() ? next(p) : ordered.begin();
+ p != --ordered.end() ? boost::next(p) : ordered.begin();
if (!DipolePartonSplitter::colourConnected(*p,*next_it)) {
current_chain.check();
theChains.push_back(current_chain);
current_chain.dipoles().clear();
continue;
}
pair<bool,bool> initial_state (false,false);
initial_state.first = (*p == incoming().first || *p == incoming().second);
initial_state.second = (*next_it == incoming().first || *next_it == incoming().second);
pair<int,int> which_in (-1,-1);
if (initial_state.first)
which_in.first = *p == incoming().first ? 0 : 1;
if (initial_state.second)
which_in.second = *next_it == incoming().first ? 0 : 1;
pair<double,double> xs (1.,1.);
if (initial_state.first)
xs.first = *p == incoming().first ? fractions().first : fractions().second;
if (initial_state.second)
xs.second = *next_it == incoming().first ? fractions().first : fractions().second;
pair<PDF,PDF> pdf;
if ( which_in.first == 0 )
pdf.first = pdfs().first;
else if ( which_in.first == 1 )
pdf.first = pdfs().second;
if ( which_in.second == 0 )
pdf.second = pdfs().first;
else if ( which_in.second == 1 )
pdf.second = pdfs().second;
current_chain.dipoles().push_back(Dipole(make_pair(*p,*next_it),pdf,xs));
}
} else {
// treat 2 -> singlet, singlet -> 2 and 1 + singlet -> 1 + singlet special
// to prevent duplicate dipole
assert(DipolePartonSplitter::colourConnected(ordered.front(),ordered.back()));
pair<bool,bool> initial_state (false,false);
initial_state.first = (ordered.front() == incoming().first || ordered.front() == incoming().second);
initial_state.second = (ordered.back() == incoming().first || ordered.back() == incoming().second);
pair<int,int> which_in (-1,-1);
if (initial_state.first)
which_in.first = ordered.front() == incoming().first ? 0 : 1;
if (initial_state.second)
which_in.second = ordered.back() == incoming().first ? 0 : 1;
pair<double,double> xs (1.,1.);
if (initial_state.first)
xs.first = ordered.front() == incoming().first ? fractions().first : fractions().second;
if (initial_state.second)
xs.second = ordered.back() == incoming().first ? fractions().first : fractions().second;
pair<PDF,PDF> pdf;
if ( which_in.first == 0 )
pdf.first = pdfs().first;
else if ( which_in.first == 1 )
pdf.first = pdfs().second;
if ( which_in.second == 0 )
pdf.second = pdfs().first;
else if ( which_in.second == 1 )
pdf.second = pdfs().second;
current_chain.dipoles().push_back(Dipole(make_pair(ordered.front(),ordered.back()),pdf,xs));
}
if (!current_chain.dipoles().empty()) {
current_chain.check();
theChains.push_back(current_chain);
}
}
void DipoleEventRecord::getAll(const ParticleVector& childs,
set<PPtr>& hardSet,
set<PPtr>& outgoingSet) {
for ( ParticleVector::const_iterator p = childs.begin();
p != childs.end(); ++p ) {
if ( ShowerHandler::currentHandler()->eventHandler()->currentCollision()->isRemnant(*p) )
continue;
if ( (**p).children().empty() ) {
if ( (**p).coloured() &&
outgoingSet.find(*p) == outgoingSet.end() )
outgoingSet.insert(*p);
else if ( !(**p).coloured() &&
hardSet.find(*p) == hardSet.end() )
hardSet.insert(*p);
} else {
getAll((**p).children(),hardSet,outgoingSet);
}
}
}
// shamelessly stolen from ShowerTree
void DipoleEventRecord::colourIsolate(const vector<PPtr> & original,
const vector<PPtr> & copy) {
// vectors must have same size
assert(original.size()==copy.size());
// create a temporary map with all the particles to make looping easier
vector<PPair> particles;
particles.reserve(original.size());
for(unsigned int ix=0;ix<original.size();++ix)
particles.push_back(make_pair(copy[ix],original[ix]));
// reset the colour of the copies
vector<PPair>::const_iterator cit,cjt;
for(cit=particles.begin();cit!=particles.end();++cit)
if((*cit).first->colourInfo()) (*cit).first->colourInfo(new_ptr(ColourBase()));
map<tColinePtr,tColinePtr> cmap;
// make the colour connections of the copies
for(cit=particles.begin();cit!=particles.end();++cit) {
ColinePtr c1,newline;
// if particle has a colour line
if((*cit).second->colourLine()&&!(*cit).first->colourLine()) {
c1=(*cit).second->colourLine();
newline=ColourLine::create((*cit).first);
cmap[c1]=newline;
for(cjt=particles.begin();cjt!=particles.end();++cjt) {
if(cjt==cit) continue;
if((*cjt).second->colourLine()==c1)
newline->addColoured((*cjt).first);
else if((*cjt).second->antiColourLine()==c1)
newline->addColoured((*cjt).first,true);
}
}
// if anticolour line
if((*cit).second->antiColourLine()&&!(*cit).first->antiColourLine()) {
c1=(*cit).second->antiColourLine();
newline=ColourLine::create((*cit).first,true);
cmap[c1]=newline;
for(cjt=particles.begin();cjt!=particles.end();++cjt) {
if(cjt==cit) continue;
if((*cjt).second->colourLine()==c1)
newline->addColoured((*cjt).first);
else if((*cjt).second->antiColourLine()==c1)
newline->addColoured((*cjt).first,true);
}
}
}
for ( map<tColinePtr,tColinePtr>::const_iterator c = cmap.begin();
c != cmap.end(); ++c ) {
theColourLines[c->second] = c->first;
}
// sort out sinks and sources
for(cit=particles.begin();cit!=particles.end();++cit) {
tColinePtr cline[2];
tColinePair cpair;
for(unsigned int ix=0;ix<4;++ix) {
cline[0] = ix<2 ? cit->second->colourLine() : cit->second->antiColourLine();
cline[1] = ix<2 ? cit->first ->colourLine() : cit->first ->antiColourLine();
if(cline[0]) {
switch (ix) {
case 0: case 2:
cpair = cline[0]->sinkNeighbours();
break;
case 1: case 3:
cpair = cline[0]->sourceNeighbours();
break;
};
}
else {
cpair = make_pair(tColinePtr(),tColinePtr());
}
if(cline[0]&&cpair.first) {
map<tColinePtr,tColinePtr>::const_iterator
mit[2] = {cmap.find(cpair.first),cmap.find(cpair.second)};
if(mit[0]!=cmap.end()&&mit[1]!=cmap.end()) {
if(ix==0||ix==2) {
cline[1]->setSinkNeighbours(mit[0]->second,mit[1]->second);
}
else {
cline[1]->setSourceNeighbours(mit[0]->second,mit[1]->second);
}
}
}
}
}
}
// shamelessly stolen from ShowerTree
void DipoleEventRecord::updateColour(PPtr particle) {
// if attached to a colour line
if(particle->colourLine()) {
bool reset=false;
// if colour line from hard process reconnect
if(theColourLines.find(particle->colourLine())!=theColourLines.end()) {
ColinePtr c1=particle->colourLine();
c1->removeColoured(particle);
theColourLines[c1]->addColoured(particle);
reset=true;
}
// ensure properly connected to the line
if(!reset) {
ColinePtr c1=particle->colourLine();
c1->removeColoured(particle);
c1->addColoured(particle);
}
}
// if attached to an anticolour line
if(particle->antiColourLine()) {
bool reset=false;
// if anti colour line from hard process reconnect
if(theColourLines.find(particle->antiColourLine())!=theColourLines.end()) {
ColinePtr c1=particle->antiColourLine();
c1->removeColoured(particle,true);
theColourLines[c1]->addColoured(particle,true);
reset=true;
}
if(!reset) {
ColinePtr c1=particle->antiColourLine();
c1->removeColoured(particle,true);
c1->addColoured(particle,true);
}
}
for ( ParticleVector::const_iterator c = particle->children().begin();
c != particle->children().end(); ++c ) {
updateColour(*c);
}
}
const map<PPtr,PPtr>&
DipoleEventRecord::prepare(tSubProPtr subpro,
tStdXCombPtr xc,
const pair<PDF,PDF>& pdf,
bool dipoles) {
theSubProcess = subpro;
theOutgoing.clear();
theHard.clear();
theColourLines.clear();
theOriginals.clear();
PPair in = subpro->incoming();
assert(ShowerHandler::currentHandler());
tPPair beam = ShowerHandler::currentHandler()->generator()->currentEvent()->incoming();
// don't take these from the XComb as it may be null
pair<double,double> xs;
Direction<0> dir(true);
xs.first = in.first->momentum().dirPlus()/beam.first->momentum().dirPlus();
dir.reverse();
xs.second = in.second->momentum().dirPlus()/beam.second->momentum().dirPlus();
theXComb = xc;
thePDFs = pdf;
theFractions = xs;
set<PPtr> allHard;
set<PPtr> allOutgoing;
getAll(in.first->children(),allHard,allOutgoing);
getAll(in.second->children(),allHard,allOutgoing);
vector<PPtr> original;
vector<PPtr> copies;
original.push_back(in.first);
original.push_back(in.second);
copy(allOutgoing.begin(),allOutgoing.end(),back_inserter(original));
for ( vector<PPtr>::const_iterator p = original.begin();
p != original.end(); ++p ) {
PPtr copy = new_ptr(Particle(**p));
copies.push_back(copy);
theOriginals[*p] = copy;
}
colourIsolate(original,copies);
theIncoming.first = copies[0];
ParticleVector children = theIncoming.first->children();
for ( ParticleVector::const_iterator c = children.begin();
c != children.end(); ++c )
theIncoming.first->abandonChild(*c);
theIncoming.second = copies[1];
children = theIncoming.second->children();
for ( ParticleVector::const_iterator c = children.begin();
c != children.end(); ++c )
theIncoming.second->abandonChild(*c);
copy(copies.begin()+2,copies.end(),back_inserter(theOutgoing));
for ( set<PPtr>::const_iterator p = allHard.begin(); p != allHard.end(); ++p ) {
PPtr copy = new_ptr(Particle(**p));
theHard.push_back(copy);
theOriginals[*p] = copy;
}
if ( dipoles ) {
PList cordered = colourOrdered();
findChains(cordered);
}
PList::const_iterator XFirst, XLast;
if ( !theHard.empty() ) {
XFirst = theHard.begin();
XLast = theHard.end();
} else {
XFirst = theOutgoing.begin();
XLast = theOutgoing.end();
}
thePX = (**XFirst).momentum();
++XFirst;
for ( ; XFirst != XLast; ++XFirst )
thePX += (**XFirst).momentum();
return theOriginals;
}
void DipoleEventRecord::clear() {
theSubProcess = SubProPtr();
theXComb = StdXCombPtr();
thePDFs = pair<PDF,PDF>();
theIncoming = PPair();
theOutgoing.clear();
theIntermediates.clear();
theHard.clear();
theChains.clear();
theDoneChains.clear();
theOriginals.clear();
theColourLines.clear();
}
void DipoleEventRecord::update(DipoleSplittingInfo& dsplit) {
if ( incoming().first == dsplit.emitter() ) {
theIntermediates.push_back(dsplit.emitter());
theIncoming.first = dsplit.splitEmitter();
theFractions.first /= dsplit.lastEmitterZ();
} else if ( incoming().first == dsplit.spectator() ) {
theIntermediates.push_back(dsplit.spectator());
theIncoming.first = dsplit.splitSpectator();
theFractions.first /= dsplit.lastSpectatorZ();
}
if ( incoming().second == dsplit.emitter() ) {
theIntermediates.push_back(dsplit.emitter());
theIncoming.second = dsplit.splitEmitter();
theFractions.second /= dsplit.lastEmitterZ();
} else if ( incoming().second == dsplit.spectator() ) {
theIntermediates.push_back(dsplit.spectator());
theIncoming.second = dsplit.splitSpectator();
theFractions.second /= dsplit.lastSpectatorZ();
}
PList::iterator pos;
pos = find(theOutgoing.begin(), theOutgoing.end(), dsplit.emitter());
if (pos != theOutgoing.end()) {
theIntermediates.push_back(*pos);
*pos = dsplit.splitEmitter();
}
pos = find(theOutgoing.begin(), theOutgoing.end(), dsplit.spectator());
if (pos != theOutgoing.end()) {
theIntermediates.push_back(*pos);
*pos = dsplit.splitSpectator();
}
theOutgoing.push_back(dsplit.emission());
if (dsplit.splittingKinematics()->doesTransform()) {
for (PList::iterator p = theIntermediates.begin();
p != theIntermediates.end(); ++p) {
(**p).set5Momentum(dsplit.splittingKinematics()->transform((**p).momentum()));
}
for (PList::iterator h = theHard.begin();
h != theHard.end(); ++h) {
(**h).set5Momentum(dsplit.splittingKinematics()->transform((**h).momentum()));
}
for (PList::iterator p = theOutgoing.begin();
p != theOutgoing.end(); ++p)
if ((*p) != dsplit.splitEmitter() &&
(*p) != dsplit.splitSpectator() &&
(*p) != dsplit.emission())
(**p).set5Momentum(dsplit.splittingKinematics()->transform((**p).momentum()));
}
}
void
DipoleEventRecord::split(list<Dipole>::iterator dip,
list<DipoleChain>::iterator ch,
DipoleSplittingInfo& dsplit,
pair<list<Dipole>::iterator,list<Dipole>::iterator>& childIterators,
DipoleChain*& firstChain, DipoleChain*& secondChain,
bool colourSpectator) {
static DipoleChain empty;
pair<Dipole,Dipole> children = dip->split(dsplit,colourSpectator);
list<Dipole>::iterator breakup =
ch->insertSplitting(dip,children,childIterators);
if ( breakup == ch->dipoles().end() ) {
firstChain = &(*ch);
secondChain = &empty;
} else {
DipoleChain other;
other.dipoles().splice(other.dipoles().end(),ch->dipoles(),breakup,ch->dipoles().end());
chains().push_back(other);
firstChain = &(*ch);
secondChain = &(chains().back());
// explicitly fix iterators in case the splice implementation
// at hand does invalidate iterators (the SGI docu says, it doesn't,
// but it seems that this behaviour is not part of the standard)
childIterators.first = --firstChain->dipoles().end();
childIterators.second = secondChain->dipoles().begin();
}
if ( !colourSpectator )
update(dsplit); // otherwise done by recoil(...)
}
void DipoleEventRecord::recoil(list<Dipole>::iterator dip,
list<DipoleChain>::iterator ch,
DipoleSplittingInfo& dsplit) {
dip->recoil(dsplit);
ch->updateDipole(dip);
update(dsplit);
}
list<pair<list<Dipole>::iterator,list<DipoleChain>::iterator> >
DipoleEventRecord::inDipoles() {
list<pair<list<Dipole>::iterator,list<DipoleChain>::iterator> > res;
for ( list<DipoleChain>::iterator chit = theDoneChains.begin();
chit != theDoneChains.end(); ++chit ) {
bool haveOne = false;
for ( list<Dipole>::iterator dit = chit->dipoles().begin();
dit != chit->dipoles().end(); ++dit ) {
if ( dit->leftPDF().pdf() || dit->rightPDF().pdf() ) {
haveOne = true;
break;
}
}
if ( haveOne ) {
theChains.splice(theChains.begin(),theDoneChains,chit);
for ( list<Dipole>::iterator dit = theChains.front().dipoles().begin();
dit != theChains.front().dipoles().end(); ++dit ) {
if ( dit->leftPDF().pdf() || dit->rightPDF().pdf() ) {
res.push_back(make_pair(dit,theChains.begin()));
}
}
}
}
return res;
}
void DipoleEventRecord::transform(const SpinOneLorentzRotation& rot) {
Lorentz5Momentum tmp;
for (PList::iterator p = theIntermediates.begin();
p != theIntermediates.end(); ++p) {
tmp = (**p).momentum(); tmp = rot * tmp;
(**p).set5Momentum(tmp);
}
for (PList::iterator h = theHard.begin();
h != theHard.end(); ++h) {
tmp = (**h).momentum(); tmp = rot * tmp;
(**h).set5Momentum(tmp);
}
for (PList::iterator p = theOutgoing.begin();
p != theOutgoing.end(); ++p) {
tmp = (**p).momentum(); tmp = rot * tmp;
(**p).set5Momentum(tmp);
}
}
tPPair DipoleEventRecord::fillEventRecord(StepPtr step, bool firstInteraction, bool) {
PPtr inSubPro = subProcess()->incoming().first;
PPtr inParticle;
if ( !(inSubPro->parents().empty()) )
inParticle = inSubPro->parents()[0];
else
inParticle = inSubPro;
PPtr inParton = theOriginals[inSubPro];
theOriginals.erase(inSubPro);
updateColour(incoming().first);
if ( inParticle != inSubPro )
inParticle->abandonChild(inSubPro);
inParton->addChild(inSubPro);
if ( inParticle != inSubPro )
inParticle->addChild(incoming().first);
theIntermediates.push_back(inSubPro);
theIntermediates.push_back(inParton);
inSubPro = subProcess()->incoming().second;
if ( !(inSubPro->parents().empty()) )
inParticle = inSubPro->parents()[0];
else
inParticle = inSubPro;
inParton = theOriginals[inSubPro];
theOriginals.erase(inSubPro);
updateColour(incoming().second);
if ( inParticle != inSubPro )
inParticle->abandonChild(inSubPro);
inParton->addChild(inSubPro);
if ( inParticle != inSubPro )
inParticle->addChild(incoming().second);
theIntermediates.push_back(inSubPro);
theIntermediates.push_back(inParton);
while ( !theOriginals.empty() ) {
PPtr outSubPro = theOriginals.begin()->first;
PPtr outParton = theOriginals.begin()->second;
- theOriginals.erase(theOriginals.begin());
+ // workaround for OS X Mavericks LLVM libc++
+#ifdef _LIBCPP_VERSION
+ map<PPtr,PPtr>::const_iterator beg = theOriginals.begin();
+#else
+ map<PPtr,PPtr>::iterator beg = theOriginals.begin();
+#endif
+ theOriginals.erase(beg);
updateColour(outParton);
outSubPro->addChild(outParton);
theIntermediates.push_back(outSubPro);
}
step->addIntermediates(theIntermediates.begin(),theIntermediates.end());
for (PList::const_iterator p = theOutgoing.begin();
p != theOutgoing.end(); ++p)
step->addDecayProduct(*p);
for (PList::const_iterator p = theHard.begin();
p != theHard.end(); ++p)
step->addDecayProduct(*p);
if ( firstInteraction &&
(theIncoming.first->coloured() ||
theIncoming.second->coloured() ) ) {
ShowerHandler::currentHandler()->lastExtractor()->newRemnants(theSubProcess->incoming(),theIncoming,step);
}
step->addIntermediate(theIncoming.first);
step->addIntermediate(theIncoming.second);
return theIncoming;
}
void DipoleEventRecord::debugLastEvent(ostream& os) const {
bool first = ShowerHandler::currentHandler()->firstInteraction();
os << "--- DipoleEventRecord ----------------------------------------------------------\n";
os << " the " << (first ? "hard" : "secondary") << " subprocess is:\n"
<< (*theSubProcess);
os << " using PDF's " << thePDFs.first.pdf() << " and "
<< thePDFs.second.pdf() << "\n";
os << " chains showering currently:\n";
for ( list<DipoleChain>::const_iterator chit = theChains.begin();
chit != theChains.end(); ++chit )
os << (*chit);
os << " chains which finished showering:\n";
for ( list<DipoleChain>::const_iterator chit = theDoneChains.begin();
chit != theDoneChains.end(); ++chit )
os << (*chit);
os << "--------------------------------------------------------------------------------\n";
os << flush;
}
diff --git a/DipoleShower/Makefile.am b/DipoleShower/Makefile.am
--- a/DipoleShower/Makefile.am
+++ b/DipoleShower/Makefile.am
@@ -1,17 +1,17 @@
SUBDIRS = Base Kernels Kinematics Utility AlphaS
if WANT_DIPOLE
pkglib_LTLIBRARIES = HwDipoleShower.la
endif
-HwDipoleShower_la_LDFLAGS = -module -version-info 2:0:0
+HwDipoleShower_la_LDFLAGS = -module -version-info 3:0:0
HwDipoleShower_la_LIBADD = \
Base/libHwDipoleShowerBase.la \
Kernels/libHwDipoleShowerKernels.la \
Kinematics/libHwDipoleShowerKinematics.la \
Utility/libHwDipoleShowerUtility.la
HwDipoleShower_la_SOURCES = \
DipoleShowerHandler.h DipoleShowerHandler.cc
diff --git a/Exsample2/BinnedStatistics.cc b/Exsample2/BinnedStatistics.cc
--- a/Exsample2/BinnedStatistics.cc
+++ b/Exsample2/BinnedStatistics.cc
@@ -1,43 +1,39 @@
// -*- C++ -*-
//
// GeneralStatictis.cc is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2012 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 BinnedStatistics class.
//
#include "BinnedStatistics.h"
-#include <boost/utility.hpp>
-using boost::next;
-using boost::prior;
-
using namespace Herwig;
BinnedStatistics::~BinnedStatistics() {}
void BinnedStatistics::put(PersistentOStream & os) const {
os << statisticsMap << weightMap
<< selectorMap << lastPoint;
}
void BinnedStatistics::get(PersistentIStream & is) {
is >> statisticsMap >> weightMap
>> selectorMap >> lastPoint;
lastStatistics = &(statisticsMap.upper_bound(lastPoint)->second);
}
void BinnedStatistics::initialize(unsigned int bins) {
weightMap[1.] = 1.;
selectorMap[1.] = make_pair(0.,1.);
double step = 1./bins;
for ( unsigned int i = 1; i <= bins; ++i ) {
statisticsMap[i*step] = GeneralStatistics();
}
}
diff --git a/Exsample2/BinnedStatistics.h b/Exsample2/BinnedStatistics.h
--- a/Exsample2/BinnedStatistics.h
+++ b/Exsample2/BinnedStatistics.h
@@ -1,239 +1,237 @@
// -*- C++ -*-
//
// GeneralStatictis.h is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2012 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_BinnedStatistics_H
#define Herwig_BinnedStatistics_H
//
// This is the declaration of the BinnedStatistics class.
//
#include "GeneralStatistics.h"
#include "ThePEG/Repository/UseRandom.h"
#include <boost/utility.hpp>
-using boost::next;
-using boost::prior;
namespace Herwig {
using namespace ThePEG;
/**
* \ingroup Matchbox
* \author Simon Platzer
*
* \brief Aka histogram, yet not intented for analyses.
*
*/
class BinnedStatistics {
public:
/** @name Standard constructors and destructors. */
//@{
/**
* The default constructor.
*/
BinnedStatistics()
: lastPoint(0.), lastStatistics(0), theWeightThreshold(0.001) {}
/**
* The standard constructor.
*/
BinnedStatistics(unsigned int bins, double threshold = 0.001)
: lastPoint(0.), lastStatistics(0) {
initialize(bins);
theWeightThreshold = threshold;
}
/**
* The destructor.
*/
virtual ~BinnedStatistics();
//@}
public:
/**
* Sample a point and return its weight to be divided out as a bias.
*/
double sample(double& point) {
const pair<double,double>& range =
selectorMap.upper_bound(UseRandom::rnd())->second;
lastPoint = UseRandom::rnd(range.first,range.second);
point = lastPoint;
lastStatistics = &(statisticsMap.upper_bound(lastPoint)->second);
double weight = weightMap.upper_bound(lastPoint)->second;
return 1./weight;
}
/**
* Get a bin corresponding to a given point.
*/
void bin(double point) {
lastPoint = point;
lastStatistics = &(statisticsMap.upper_bound(lastPoint)->second);
}
/**
* Select the last sampled point with a given weight.
*/
void select(double w) {
lastStatistics->select(w);
}
/**
* Accept the last sampled point.
*/
void accept() {
lastStatistics->accept();
}
/**
* Reject the last sampled point.
*/
void reject() {
lastStatistics->reject();
}
/**
* Initialize with flat sampling over the complete range,
* using the given number of bins to accumulate statistics.
*/
void initialize(unsigned int bins);
/**
* Return the bins.
*/
const map<double,GeneralStatistics>& statistics() const {
return statisticsMap;
}
/**
* Update the sampling bins to reflect the accumulated statistics and
* binning used.
*/
template<class Adaptor>
void update(const Adaptor& ap) {
double avgweight = 0.;
size_t bins = 0;
for ( map<double,GeneralStatistics>::const_iterator s =
statisticsMap.begin(); s != statisticsMap.end(); ++s ) {
avgweight += ap.importanceMeasure(s->second);
++bins;
}
avgweight /= bins;
weightMap.clear();
double norm = 0.;
for ( map<double,GeneralStatistics>::const_iterator s =
statisticsMap.begin(); s != statisticsMap.end(); ++s ) {
double weight = ap.importanceMeasure(s->second);
if ( weight < theWeightThreshold*avgweight )
weight = theWeightThreshold*avgweight;
weightMap[s->first] = weight;
norm +=
weight *
- (s != statisticsMap.begin() ? (s->first - prior(s)->first) : s->first);
+ (s != statisticsMap.begin() ? (s->first - boost::prior(s)->first) : s->first);
}
selectorMap.clear();
double current = 0.;
for ( map<double,double>::iterator bw = weightMap.begin();
bw != weightMap.end(); ++bw ) {
bw->second /= norm;
pair<double,double> range =
- make_pair(bw != weightMap.begin() ? prior(bw)->first : 0.,
+ make_pair(bw != weightMap.begin() ? boost::prior(bw)->first : 0.,
bw->first);
current += bw->second*(range.second-range.first);
selectorMap[current] = range;
}
}
/**
* Half those bins, which meet the given predicate
* and update the statistics.
*/
template<class Adaptor>
void adapt(const Adaptor& ap) {
update(ap);
map<double,GeneralStatistics> newBins;
for ( map<double,GeneralStatistics>::const_iterator b
= statisticsMap.begin(); b != statisticsMap.end(); ++b ) {
newBins[b->first] = GeneralStatistics();
if ( ap.adapt(b->second) ) {
double bound =
- b != statisticsMap.begin() ? (prior(b)->first + b->first)/2. : b->first/2.;
+ b != statisticsMap.begin() ? (boost::prior(b)->first + b->first)/2. : b->first/2.;
newBins[bound] = GeneralStatistics();
}
}
statisticsMap = newBins;
}
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 put(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 get(PersistentIStream & is);
//@}
private:
/**
* Map upper bin boundaries to statistics contained.
* The lower bin boundary is always 0.
*/
map<double,GeneralStatistics> statisticsMap;
/**
* Map upper bin boundaries to bin weights currently used.
*/
map<double,double> weightMap;
/**
* Selector map to sample a point
*/
map<double,pair<double,double> > selectorMap;
/**
* The last sampled point.
*/
double lastPoint;
/**
* The statistics relevant to the last sampled point.
*/
GeneralStatistics* lastStatistics;
/**
* The weight threshold which governs the minimum bin weight.
*/
double theWeightThreshold;
};
inline PersistentOStream& operator<<(PersistentOStream& os, const BinnedStatistics& s) {
s.put(os); return os;
}
inline PersistentIStream& operator>>(PersistentIStream& is, BinnedStatistics& s) {
s.get(is); return is;
}
}
#endif /* Herwig_BinnedStatistics_H */
diff --git a/Exsample2/Makefile.am b/Exsample2/Makefile.am
--- a/Exsample2/Makefile.am
+++ b/Exsample2/Makefile.am
@@ -1,39 +1,39 @@
pkglib_LTLIBRARIES = HwExsample2.la
if WANT_DIPOLE
pkglib_LTLIBRARIES += HwExsampleMatchbox.la
endif
-HwExsample2_la_LDFLAGS = -module -version-info 2:0:0
+HwExsample2_la_LDFLAGS = -module -version-info 3:0:0
HwExsample2_la_SOURCES = \
GeneralStatistics.h GeneralStatistics.cc \
BinnedStatistics.h BinnedStatistics.cc \
MultiIterationStatistics.h MultiIterationStatistics.cc \
BinSampler.h BinSampler.cc \
ProjectingSampler.h ProjectingSampler.cc \
GeneralSampler.h GeneralSampler.cc \
ExSampler2.h ExSampler2.cc \
SamplingBias.h SamplingBias.cc \
exsample/cell.icc \
exsample/generator.h \
exsample/linear_interpolator.icc \
exsample/config.h \
exsample/selectors.h \
exsample/adaption_info.h \
exsample/selectors.icc \
exsample/adaption_info.icc \
exsample/exponential_generator.h \
exsample/exponential_generator.icc \
exsample/generator.icc \
exsample/statistics.h \
exsample/linear_interpolator.h \
exsample/cell.h \
exsample/utility.h \
exsample/binary_tree.h \
exsample/statistics.icc
-HwExsampleMatchbox_la_LDFLAGS = -module -version-info 2:0:0
+HwExsampleMatchbox_la_LDFLAGS = -module -version-info 3:0:0
HwExsampleMatchbox_la_SOURCES = \
EnhanceNLOContributions.h EnhanceNLOContributions.cc
diff --git a/Exsample2/exsample/binary_tree.h b/Exsample2/exsample/binary_tree.h
--- a/Exsample2/exsample/binary_tree.h
+++ b/Exsample2/exsample/binary_tree.h
@@ -1,883 +1,883 @@
// -*- C++ -*-
//
// binary_tree.h is part of ExSample -- A Library for Sampling Sudakov-Type Distributions
//
// Copyright (C) 2008-2011 Simon Platzer -- simon.plaetzer@desy.de
//
// ExSample is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
#ifndef EXSAMPLE_binary_tree_h_included
#define EXSAMPLE_binary_tree_h_included
#include "utility.h"
namespace exsample {
/// \brief binary_tree represents a binary tree with the ability to
/// `cascade' visitor objects down the tree
template<class Value>
class binary_tree {
public:
///@name type definitions
//@{
/// define the object type
typedef Value value_type;
//@}
public:
///@name constructors
//@{
/// default constructor
binary_tree()
- : neighbours_(0,0),
- parent_(0), value_(),
+ : neighbours_(),
+ parent_(), value_(),
children_()
{ }
/// construct giving key/cell and parent
binary_tree(const value_type& thevalue,
binary_tree * theparent = 0)
- : neighbours_(0,0), parent_(theparent),
+ : neighbours_(), parent_(theparent),
value_(new value_type(thevalue)),
children_()
{ }
/// binary_tree has a strict ownership; on copying
/// binary trees ownership is transferred
binary_tree(const binary_tree& x)
: neighbours_(x.neighbours_),
parent_(x.parent_), value_(),
children_() {
assert(x.root());
binary_tree& nc_x = const_cast<binary_tree&>(x);
value_.swap(nc_x.value_);
children_.first.swap(nc_x.children_.first);
children_.second.swap(nc_x.children_.second);
nc_x.parent_ = 0;
nc_x.neighbours_.first = 0;
nc_x.neighbours_.second = 0;
}
/// binary_tree has a strict ownership; on copying
/// binary trees ownership is transferred
binary_tree& operator=(const binary_tree& x) {
if (this == &x)
return *this;
assert(x.root());
binary_tree& nc_x = const_cast<binary_tree&>(x);
value_.swap(nc_x.value_);
children_.first.swap(nc_x.children_.first);
children_.second.swap(nc_x.children_.second);
neighbours_ = x.neighbours_;
parent_ = x.parent_;
nc_x.parent_ = 0;
nc_x.neighbours_.first = 0;
nc_x.neighbours_.second = 0;
return *this;
}
//@}
///@name standard-conforming leaf iterators
//@{
public:
class const_iterator;
/// iterator
class iterator {
public:
///@name type definitions for iterator traits
//@{
/// define the iterator category
typedef std::bidirectional_iterator_tag iterator_category;
/// define the difference_type
typedef int difference_type;
/// define the value type
typedef Value value_type;
/// define the reference type
typedef value_type& reference;
/// define the pointer type
typedef value_type * pointer;
//@}
public:
///@name constructors
//@{
/// default constructor
iterator() : pointee(0), post_end(0), pre_begin(0) { }
/// constructor taking pointee
iterator(binary_tree * p, std::size_t end = 0)
: pointee(p), post_end(end), pre_begin(0) { }
//@
public:
///@name comparisons
//@{
/// comparison
bool operator==(const iterator& x) const {
return ((pointee == x.pointee) &&
(post_end == x.post_end) &&
(pre_begin == x.pre_begin));
}
/// comparison
bool operator!=(const iterator& x) const { return !(*this == x); }
//@}
public:
///@name derefrence and indirection
//@{
/// dereference
reference operator*() { return pointee->value(); }
/// indirection
pointer operator->() { return &**this; }
/// return reference to the node
binary_tree& node() { return *pointee; }
//@}
/// return raw pointer to the element pointed to
binary_tree * get() const { return pointee; }
///@name biderectional iterator increment/decrements
//@{
/// pre-increment
iterator& operator++() {
if (post_end) { ++post_end; return *this; }
if (pre_begin) { --pre_begin; return *this; }
if(!(pointee->right_neighbour())) { post_end = 1; return *this; }
pointee = pointee->right_neighbour();
return *this;
}
/// pre-decrement
iterator& operator--() {
if (post_end) { --post_end; return *this; }
if (pre_begin) { ++pre_begin; return *this; }
if(!(pointee->left_neighbour())) { pre_begin = 1; return *this; }
pointee = pointee->left_neighbour();
return *this;
}
/// post-increment
iterator operator++(int) {
iterator tmp = *this;
++(*this);
return tmp;
}
/// post-decrement
iterator operator--(int) {
iterator tmp = *this;
--(*this);
return tmp;
}
//@}
private:
/// friend for conversion
friend class const_iterator;
/// the node pointed to
binary_tree * pointee;
/// the distance from --end() (if above --end())
std::size_t post_end;
/// the distance from begin() (if below begin())
std::size_t pre_begin;
};
/// return begin iterator
iterator begin() { return iterator(left_most()); }
/// return end iterator
iterator end() { return iterator(right_most(),1); }
/// return global begin iterator
iterator global_begin() {
if (!root())
return parent().global_begin();
return iterator(left_most());
}
/// return global end iterator
iterator global_end() {
if (!root())
return parent().global_end();
return iterator(right_most(),1);
}
/// const_iterator
class const_iterator {
public:
///@name type definitions for iterator traits
//@{
/// define the iterator category
typedef std::bidirectional_iterator_tag iterator_category;
/// define the difference type
typedef int difference_type;
/// define the value type
typedef const Value value_type;
/// define the reference type
typedef const value_type& reference;
/// define the pointer type
typedef const value_type * pointer;
//@}
public:
///@name constructors
//@{
/// default constructor
const_iterator() : pointee(0), post_end(0), pre_begin(0) { }
/// constructor taking pointee
const_iterator(const binary_tree * p, std::size_t end = 0)
: pointee(p), post_end(end), pre_begin(0) { }
/// conversion from iterator
const_iterator(const iterator& x)
: pointee(x.pointee), post_end(x.post_end), pre_begin(x.pre_begin) { }
//@}
public:
///@name comparisons
//@{
/// comparison
bool operator==(const const_iterator& x) const {
return ((pointee == x.pointee) &&
(post_end == x.post_end) &&
(pre_begin == x.pre_begin));
}
/// comparison
bool operator!=(const const_iterator& x) const { return !(*this == x); }
//@}
public:
///@name dereference and indirection
//@{
/// dereference
reference operator*() const { return pointee->value(); }
/// indirection
pointer operator->() const { return &**this; }
/// return reference to the node
const binary_tree& node() const { return *pointee; }
//@}
///@name biderectional iterator increment/decrements
//@{
/// pre-increment
const_iterator& operator++() {
if (post_end) { ++post_end; return *this; }
if (pre_begin) { --pre_begin; return *this; }
if(!(pointee->right_neighbour())) { post_end = 1; return *this; }
pointee = pointee->right_neighbour();
return *this;
}
/// pre-decrement
const_iterator& operator--() {
if (post_end) { --post_end; return *this; }
if (pre_begin) { ++pre_begin; return *this; }
if(!(pointee->left_neighbour())) { pre_begin = 1; return *this; }
pointee = pointee->left_neighbour();
return *this;
}
/// post-increment
const_iterator operator++(int) {
const_iterator tmp = *this;
++(*this);
return tmp;
}
/// post-decrement
const_iterator operator--(int) {
const_iterator tmp = *this;
--(*this);
return tmp;
}
//@}
private:
/// the node pointed to
const binary_tree * pointee;
/// the distance from --end() (if above --end())
std::size_t post_end;
/// the distance from begin() (if below begin())
std::size_t pre_begin;
};
/// return begin const_iterator
const_iterator begin() const { return const_iterator(left_most()); }
/// return end const_iterator
const_iterator end() const { return const_iterator(right_most(),1); }
/// return global begin iterator
const_iterator global_begin() const {
if (!root())
return parent().global_begin();
return iterator(left_most());
}
/// return global end iterator
const_iterator global_end() const {
if (!root())
return parent().global_end();
return iterator(right_most(),1);
}
private:
/// set the left neighbour
void left_neighbour(binary_tree * n) { neighbours_.first = n; }
/// set the right neighbour
void right_neighbour(binary_tree * n) { neighbours_.second = n; }
/// get the left neighbour
binary_tree * left_neighbour() const { return neighbours_.first; }
/// get the right neighbour
binary_tree * right_neighbour() const { return neighbours_.second; }
/// return the left-most leaf
binary_tree * left_most() {
if(leaf()) return this;
return left_child().left_most();
}
/// return the right-most leaf
binary_tree * right_most() {
if(leaf()) return this;
return right_child().right_most();
}
/// return the left-most leaf
const binary_tree * left_most() const {
if(leaf()) return this;
return left_child().left_most();
}
/// return the right-most leaf
const binary_tree * right_most() const {
if(leaf()) return this;
return right_child().right_most();
}
/// the iterator is a good friend
friend class binary_tree<value_type>::iterator;
/// the iterator is a good friend
friend class binary_tree<value_type>::const_iterator;
/// the left and right neighbours of this node
std::pair<binary_tree*,binary_tree*> neighbours_;
//@}
public:
/// return true, if this node is empty
bool empty() const { return root() && leaf() && !value_; }
/// clear this node
void clear() {
neighbours_ = std::make_pair<binary_tree*,binary_tree*>(0,0);
parent_ = 0;
value_.reset(0);
if (!leaf()) {
left_child().clear();
right_child().clear();
}
children_.first.reset(0);
children_.second.reset(0);
}
public:
/// split this node
std::pair<iterator,iterator> split(std::pair<value_type,value_type> children) {
assert(leaf());
children_.first.reset(new binary_tree(children.first,this));
children_.second.reset(new binary_tree(children.second,this));
children_.first->left_neighbour(neighbours_.first);
children_.first->right_neighbour(children_.second.get());
children_.second->left_neighbour(children_.first.get());
children_.second->right_neighbour(neighbours_.second);
// adjust original neighbours
if(neighbours_.first) {
neighbours_.first->right_neighbour(children_.first.get());
}
if (neighbours_.second) {
neighbours_.second->left_neighbour(children_.second.get());
}
neighbours_.first = 0; neighbours_.second = 0;
return std::make_pair(iterator(children_.first.get()),iterator(children_.second.get()));
}
public:
/// select using a selector
template<class Selector>
iterator select(const Selector& selector) {
if(leaf()) {
bool use = selector.use(value());
if (use) return iterator(this);
return global_end();
}
std::pair<bool,bool> which(selector.use(value(),left_child().value(),right_child().value()));
assert(!which.first || !which.second);
if (!which.first && !which.second) {
return global_end();
}
if (which.first) {
return left_child().select(selector);
}
else {
return right_child().select(selector);
}
return global_end();
}
/// generate a hash value for the sub-tree
/// selected by the given selector object
template<class Selector, unsigned long bits>
void subtree_hash(const Selector& selector, bit_container<bits>& bhash) {
bhash = bit_container<bits>();
unsigned long pos = 0;
do_subtree_hash<Selector,bits>(selector,bhash,pos);
}
/// accumulate values using a binary function
/// and accessor object
template<class Accessor, class BinaryOp>
typename BinaryOp::result_type accumulate(const Accessor& acc,
BinaryOp binary_op) const {
if (!leaf()) {
return
binary_op(left_child().accumulate(acc,binary_op),
right_child().accumulate(acc,binary_op));
}
return acc.get(value(),true);
}
/// accumulate values only from branches
/// matching a Selector
template<class Selector, class Accessor, class BinaryOp>
typename BinaryOp::result_type accumulate(const Selector& selector,
const Accessor& acc,
BinaryOp binary_op) const {
if (!leaf()) {
std::pair<bool,bool> which(selector.use(value(),left_child().value(),right_child().value()));
assert(which.first || which.second);
if (which.first && which.second) {
return
binary_op(left_child().accumulate(selector,acc,binary_op),
right_child().accumulate(selector,acc,binary_op));
} else if (which.first) {
return left_child().accumulate(selector,acc,binary_op);
} else if (which.second) {
return right_child().accumulate(selector,acc,binary_op);
}
}
return acc.get(value(),true);
}
/// accumulate values using a binary function
/// and accessor object, storing intermediate
/// values in nodes
template<class Accessor, class BinaryOp>
typename BinaryOp::result_type tree_accumulate(const Accessor& acc,
BinaryOp binary_op) {
if (!leaf()) {
acc.set(value()) =
binary_op(left_child().tree_accumulate(acc,binary_op),
right_child().tree_accumulate(acc,binary_op));
return acc.get(value(),false);
}
acc.set(value()) = acc.get(value(),true);
return acc.get(value(),true);
}
/// accumulate values only from branches
/// matching a Selector
template<class Selector, class Accessor, class BinaryOp>
typename BinaryOp::result_type tree_accumulate(const Selector& selector,
const Accessor& acc,
BinaryOp binary_op) {
if (!leaf()) {
std::pair<bool,bool> which(selector.use(value(),left_child().value(),right_child().value()));
assert(which.first || which.second);
if (which.first && which.second) {
acc.set(value()) =
binary_op(left_child().tree_accumulate(selector,acc,binary_op),
right_child().tree_accumulate(selector,acc,binary_op));
} else if (which.first) {
acc.set(value()) = left_child().tree_accumulate(selector,acc,binary_op);
} else if (which.second) {
acc.set(value()) = right_child().tree_accumulate(selector,acc,binary_op);
}
return acc.get(value(),false);
}
acc.set(value()) = acc.get(value(),true);
return acc.get(value(),true);
}
/// forward propagate a visitor to all children nodes
template<class Visitor>
void cascade(Visitor visitor) const {
if (leaf()) {
visitor.visit(value());
return;
} else visitor.visit(value(),left_child().value(),right_child().value());
left_child().cascade(visitor);
right_child().cascade(visitor);
}
/// succesively split using a generator
template<class Generator>
void generate(Generator generator) {
if (root())
value_.reset(new value_type(generator.root()));
if (generator.split()) {
std::pair<iterator,iterator> ch = split(generator.generate(value()));
ch.first.node().generate(generator);
ch.second.node().generate(generator);
}
}
public:
///@name Public member access
//@{
/// return the value held by this node
value_type& value() { return *value_; }
/// return the value held by this node
const value_type& value() const { return *value_; }
/// return true, if this is the root node
bool root() const { return !parent_; }
/// return true, if this node has got children
bool leaf() const { return !(children_.first.get() && children_.second.get()); }
//@}
public:
///@name put and get from streams
//@{
/// forward visitor writing out the tree to given ostream
template<class OStream>
struct ostream_visitor {
/// construct from ostream reference
explicit ostream_visitor(OStream& os) : os_(&os), first_time_(true) {}
/// visit a leaf node
void visit(const value_type&) {
(*os_) << "end_branch";
ostream_traits<OStream>::separator(*os_);
}
/// visit a branching
void visit(const value_type& parent,
const value_type& left, const value_type& right) {
if (first_time_) {
(*os_) << "root_node";
ostream_traits<OStream>::separator(*os_);
parent.put(*os_);
first_time_ = false;
}
(*os_) << "left_child";
ostream_traits<OStream>::separator(*os_);
left.put(*os_);
(*os_) << "right_child";
ostream_traits<OStream>::separator(*os_);
right.put(*os_);
}
private:
/// pointer to the ostream to write to
OStream* os_;
/// whether we are at the or not
bool first_time_;
};
/// generator reading binary tree from istream
template<class IStream>
struct istream_generator {
/// construct from istream reference
explicit istream_generator(IStream& is)
: is_(&is), children_(), tag_("") {}
/// copy constructor
istream_generator(const istream_generator& x)
: is_(x.is_), children_(), tag_("") {}
/// read the root node
value_type root() {
*is_ >> tag_;
assert(tag_ == "root_node");
value_type rnode;
rnode.get(*is_);
return rnode;
}
/// read children nodes
bool split() {
*is_ >> tag_;
if (tag_ == "end_branch") {
return false;
}
assert (tag_ == "left_child");
children_.first.get(*is_);
*is_ >> tag_;
assert(tag_ == "right_child");
children_.second.get(*is_);
return true;
}
/// return the children generated
std::pair<value_type,value_type> generate(const value_type&) {
return children_;
}
/// initialize a leaf
void initialize_leaf(const value_type&) {}
private:
/// pointer to the istream used
IStream* is_;
/// the children currently handled
std::pair<value_type,value_type> children_;
/// temporary storage for tags
std::string tag_;
};
/// put to ostream
template<class OStream>
void put(OStream& os) const {
if (empty()) {
os << "empty";
ostream_traits<OStream>::separator(os);
return;
} else if (root() && leaf()) {
os << "root_only";
ostream_traits<OStream>::separator(os);
value().put(os);
return;
} else {
os << "non_empty";
ostream_traits<OStream>::separator(os);
}
assert(root());
cascade(ostream_visitor<OStream>(os));
}
/// get from istream
template<class IStream>
void get(IStream& is) {
std::string state;
is >> state;
if (state == "empty") {
return;
}
if (state == "root_only") {
value_.reset(new value_type());
value().get(is);
return;
}
assert(empty());
generate(istream_generator<IStream>(is));
}
//@}
private:
/// calculate hash value
template<class Selector, unsigned long bits>
void do_subtree_hash(const Selector& selector,
bit_container<bits>& current,
unsigned long& position,
bool selected = true) const {
if (!leaf()) {
std::pair<bool,bool> which(false,false);
if (selected)
which = selector.use(value(),left_child().value(),right_child().value());
current.bit(position,which.first);
current.bit(position+1,which.second);
position += 2;
left_child().do_subtree_hash(selector,current,position,which.first && selected);
right_child().do_subtree_hash(selector,current,position,which.second && selected);
}
}
private:
///@name private member access
//@{
/// return the parent of this node
binary_tree& parent() { assert(parent_); return *parent_; }
/// return the parent of this node
const binary_tree& parent() const { assert(parent_); return *parent_; }
/// return the left child of this node
binary_tree& left_child() { assert(children_.first.get()); return *children_.first; }
/// return the left child of this node
const binary_tree& left_child() const { assert(children_.first.get()); return *children_.first; }
/// return the right child of this node
binary_tree& right_child() { assert(children_.second.get()); return *children_.second; }
/// return the right child of this node
const binary_tree& right_child() const { assert(children_.second.get()); return *children_.second; }
//@}
private:
/// the parent of this node
binary_tree * parent_;
/// the cell held by this node
boost::scoped_ptr<value_type> value_;
/// the children of this node
std::pair<boost::scoped_ptr<binary_tree>,
boost::scoped_ptr<binary_tree> > children_;
};
}
#endif // EXSAMPLE_binary_tree_h_included
diff --git a/Exsample2/exsample/config.h b/Exsample2/exsample/config.h
--- a/Exsample2/exsample/config.h
+++ b/Exsample2/exsample/config.h
@@ -1,52 +1,45 @@
// -*- C++ -*-
//
// config.h is part of ExSample -- A Library for Sampling Sudakov-Type Distributions
//
// Copyright (C) 2008-2011 Simon Platzer -- simon.plaetzer@desy.de
//
// ExSample is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
#ifndef EXSAMPLE_config_h_included
#define EXSAMPLE_config_h_included
#include <vector>
#include <map>
#include <set>
#include <string>
#include <cmath>
#include <cassert>
#include <climits>
#include <algorithm>
#include <numeric>
#include <limits>
#include <boost/utility.hpp>
#include <boost/scoped_array.hpp>
#include <boost/scoped_ptr.hpp>
#define EXSAMPLE_has_ThePEG
#ifdef EXSAMPLE_has_ThePEG
#include "ThePEG/Persistency/PersistentOStream.h"
#endif // EXSAMPLE_has_ThePEG
namespace exsample {
static const unsigned long parameter_hash_bits = 512;
-#ifdef HAVE_CXX11
- using std::next;
-#else
- using boost::next;
-#endif
- using boost::prior;
-
}
#endif // EXSAMPLE_config_h_included
diff --git a/Exsample2/exsample/exponential_generator.icc b/Exsample2/exsample/exponential_generator.icc
--- a/Exsample2/exsample/exponential_generator.icc
+++ b/Exsample2/exsample/exponential_generator.icc
@@ -1,378 +1,378 @@
// -*- C++ -*-
//
// exponential_generator.icc is part of ExSample -- A Library for Sampling Sudakov-Type Distributions
//
// Copyright (C) 2008-2011 Simon Platzer -- simon.plaetzer@desy.de
//
// ExSample is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
namespace exsample {
template<class Function, class Random>
void exponential_generator<Function,Random>::initialize() {
adaption_info_.dimension = function_->dimension();
adaption_info_.lower_left = function_->support().first;
adaption_info_.upper_right = function_->support().second;
if (adaption_info_.adapt.empty())
adaption_info_.adapt = std::vector<bool>(adaption_info_.dimension,true);
evolution_variable_ = function_->evolution_variable();
evolution_cutoff_ = function_->evolution_cutoff();
sample_variables_ = function_->variable_flags();
sample_other_variables_ = sample_variables_;
sample_other_variables_[evolution_variable_] = false;
last_point_.resize(adaption_info_.dimension);
parametric_selector_ = parametric_selector(&last_point_,sample_other_variables_);
exponent_selector_ = parametric_selector(&last_point_,sample_variables_);
missing_accessor_ = parametric_missing_accessor(&last_parameter_bin_);
parametric_sampler_ = parametric_sampling_selector<rnd_generator<Random> >
(&last_point_,&last_parameter_bin_,sample_other_variables_,rnd_gen_);
if (initialized_) return;
splits_ = 0;
for ( std::size_t k = 0; k < adaption_info_.dimension; ++k ) {
if ( sample_other_variables_[k] )
continue;
parameter_splits_[k].push_back(adaption_info_.lower_left[k]);
parameter_splits_[k].push_back(adaption_info_.upper_right[k]);
}
root_cell_ =
binary_tree<cell>(cell(adaption_info_.lower_left,
adaption_info_.upper_right,
sample_other_variables_,
adaption_info_));
root_cell_.value().info().explore(rnd_gen_,adaption_info_,function_);
root_cell_.value().integral(root_cell_.value().info().volume() * root_cell_.value().info().overestimate());
last_exponent_integrand_.resize(1);
check_events_ = adaption_info_.presampling_points;
initialized_ = true;
}
template<class Function, class Random>
bool exponential_generator<Function,Random>::split () {
if (adaption_info_.freeze_grid == accepts_)
return false;
if (compensating_)
return false;
if (!(*last_cell_).info().bad(adaption_info_)) return false;
bool dosplit = false;
std::pair<std::size_t,double> sp =
(*last_cell_).info().get_split(adaption_info_,dosplit);
if (!dosplit) return false;
if (!adaption_info_.adapt[sp.first]) return false;
if (splits_ == parameter_hash_bits/2)
return false;
++splits_;
last_cell_.node().split((*last_cell_).split(sp,rnd_gen_,function_,adaption_info_,sample_other_variables_));
if ( !sample_other_variables_[sp.first] ) {
if ( std::find(parameter_splits_[sp.first].begin(),parameter_splits_[sp.first].end(),sp.second)
== parameter_splits_[sp.first].end() ) {
parameter_splits_[sp.first].push_back(sp.second);
std::sort(parameter_splits_[sp.first].begin(),parameter_splits_[sp.first].end());
if ( sp.first == evolution_variable_ ) {
last_exponent_integrand_.push_back(0.);
}
}
}
did_split_ = true;
last_point_ = function_->parameter_point();
root_cell_.tree_accumulate(parametric_selector_,integral_accessor_,std::plus<double>());
exponents_.clear();
get_exponent();
return true;
}
template<class Function, class Random>
void exponential_generator<Function,Random>::get_exponent () {
last_parameter_bin_.reset();
root_cell_.subtree_hash (exponent_selector_,last_parameter_bin_);
last_exponent_ = exponents_.find(last_parameter_bin_);
if (last_exponent_ != exponents_.end())
return;
exponents_[last_parameter_bin_] = linear_interpolator();
last_exponent_ = exponents_.find(last_parameter_bin_);
double old_evo = last_point_[evolution_variable_];
std::vector<double>::iterator exp_it = last_exponent_integrand_.begin();
for (std::vector<double>::iterator esp = parameter_splits_[evolution_variable_].begin();
- esp < prior(parameter_splits_[evolution_variable_].end()); ++esp, ++exp_it) {
- last_point_[evolution_variable_] = (*esp + *next(esp))/2.;
+ esp < boost::prior(parameter_splits_[evolution_variable_].end()); ++esp, ++exp_it) {
+ last_point_[evolution_variable_] = (*esp + *boost::next(esp))/2.;
*exp_it = root_cell_.accumulate(parametric_selector_,integral_accessor_,std::plus<double>());
}
- exp_it = prior(last_exponent_integrand_.end());
+ exp_it = boost::prior(last_exponent_integrand_.end());
double total = 0.;
- for (std::vector<double>::iterator esp = prior(parameter_splits_[evolution_variable_].end());
+ for (std::vector<double>::iterator esp = boost::prior(parameter_splits_[evolution_variable_].end());
esp > parameter_splits_[evolution_variable_].begin(); --esp, --exp_it) {
last_exponent_->second.set_interpolation(*esp,total);
- total += (*exp_it) * ((*esp) - (*prior(esp)));
+ total += (*exp_it) * ((*esp) - (*boost::prior(esp)));
}
last_exponent_->second.set_interpolation(parameter_splits_[evolution_variable_].front(),total);
last_point_[evolution_variable_] = old_evo;
}
template<class Function, class Random>
std::set<std::vector<double> >
exponential_generator<Function,Random>::parameter_points() {
std::set<std::vector<double> > res;
std::vector<double> pt(adaption_info_.dimension,0.);
recursive_parameter_points(res,pt,0);
return res;
}
template<class Function, class Random>
void exponential_generator<Function,Random>::
recursive_parameter_points(std::set<std::vector<double> >& res,
std::vector<double>& pt,
size_t current) {
if ( current == adaption_info_.dimension ) {
res.insert(pt);
return;
}
if ( sample_variables_[current] ) {
recursive_parameter_points(res,pt,current+1);
return;
}
for ( std::vector<double>::const_iterator sp =
parameter_splits_[current].begin();
- sp != prior(parameter_splits_[current].end()); ++sp ) {
- pt[current] = (*sp + *next(sp))/2.;
+ sp != boost::prior(parameter_splits_[current].end()); ++sp ) {
+ pt[current] = (*sp + *boost::next(sp))/2.;
recursive_parameter_points(res,pt,current+1);
}
}
template<class Function, class Random>
void exponential_generator<Function,Random>::compensate() {
if (!did_split_) {
exponents_.clear();
root_cell_.value().info().overestimate(last_value_,last_point_);
root_cell_.value().integral(root_cell_.value().info().volume() * root_cell_.value().info().overestimate());
last_point_ = function_->parameter_point();
get_exponent();
return;
}
std::vector<double> themaxpoint = last_point_;
std::set<std::vector<double> > id_points
= parameter_points();
for ( std::set<std::vector<double> >::const_iterator id =
id_points.begin(); id != id_points.end(); ++id ) {
last_point_ = *id;
get_exponent();
}
std::map<bit_container<parameter_hash_bits>,linear_interpolator >
old_exponents = exponents_;
double old_oe = last_cell_->info().overestimate();
last_cell_->info().overestimate(last_value_,themaxpoint);
last_cell_->integral(last_cell_->info().volume() * last_cell_->info().overestimate());
exponents_.clear();
for ( std::set<std::vector<double> >::const_iterator id =
id_points.begin(); id != id_points.end(); ++id ) {
last_point_ = *id;
get_exponent();
std::map<bit_container<parameter_hash_bits>,linear_interpolator >::iterator
old_exp = old_exponents.find(last_parameter_bin_);
std::map<bit_container<parameter_hash_bits>,linear_interpolator >::iterator
new_exp = exponents_.find(last_parameter_bin_);
assert(old_exp != old_exponents.end() && new_exp != exponents_.end());
double old_norm = 1. - std::exp(-(old_exp->second)(adaption_info_.lower_left[evolution_variable_]));
double new_norm = 1. - std::exp(-(new_exp->second)(adaption_info_.lower_left[evolution_variable_]));
for (binary_tree<cell>::iterator it = root_cell_.begin();
it != root_cell_.end(); ++it) {
if ( !it->info().contains_parameter(last_point_,sample_variables_) )
continue;
double old_int = 0.;
double new_int = 0.;
for ( std::vector<double>::const_iterator sp = parameter_splits_[evolution_variable_].begin();
- sp != prior(parameter_splits_[evolution_variable_].end()); ++sp ) {
+ sp != boost::prior(parameter_splits_[evolution_variable_].end()); ++sp ) {
if ( *sp >= it->info().lower_left()[evolution_variable_] &&
*sp < it->info().upper_right()[evolution_variable_] ) {
double xl = *sp;
- double xxl = *next(sp);
+ double xxl = *boost::next(sp);
double old_al =
(old_exp->second.interpolation()[xxl] - old_exp->second.interpolation()[xl]) /
(xxl-xl);
double old_bl =
(xxl * old_exp->second.interpolation()[xl] -
xl * old_exp->second.interpolation()[xxl]) /
(xxl-xl);
double new_al =
(new_exp->second.interpolation()[xxl] - new_exp->second.interpolation()[xl]) /
(xxl-xl);
double new_bl =
(xxl * new_exp->second.interpolation()[xl] -
xl * new_exp->second.interpolation()[xxl]) /
(xxl-xl);
if ( std::abs(old_al) > std::numeric_limits<double>::epsilon() ) {
old_int += (exp(-(old_al*xl+old_bl)) - exp(-(old_al*xxl+old_bl)))/old_al;
} else {
old_int += (xxl-xl)*exp(-old_bl);
}
if ( std::abs(new_al) > std::numeric_limits<double>::epsilon() ) {
new_int += (exp(-(new_al*xl+new_bl)) - exp(-(new_al*xxl+new_bl)))/new_al;
} else {
new_int += (xxl-xl)*exp(-new_bl);
}
}
}
double scaling;
if (it != last_cell_) {
if (old_int > std::numeric_limits<double>::epsilon() &&
new_int > std::numeric_limits<double>::epsilon())
scaling = ((old_norm * new_int) /
(new_norm * old_int)) - 1.;
else
scaling = 0.;
} else {
if (old_int > std::numeric_limits<double>::epsilon() &&
new_int > std::numeric_limits<double>::epsilon())
scaling = ((last_value_ * old_norm * new_int) /
(old_oe * new_norm * old_int)) - 1.;
else
scaling = 0.;
}
it->info().parametric_missing(last_parameter_bin_,
it->info().parametric_missing(last_parameter_bin_) +
static_cast<int>(round(scaling * it->info().attempted())));
if (it->info().parametric_missing(last_parameter_bin_) != 0) {
compensating_ = true;
}
}
}
last_point_ = function_->parameter_point();
}
template<class Function, class Random>
double exponential_generator<Function,Random>::generate () {
if (compensating_) {
compensating_ = false;
for (binary_tree<cell>::iterator it = root_cell_.begin();
it != root_cell_.end(); ++it)
if (it->info().parametric_compensating()) {
compensating_ = true;
break;
}
parametric_sampler_.compensate(compensating_);
}
last_point_ = function_->parameter_point();
if (last_point_[evolution_variable_] < evolution_cutoff_) {
return 0.;
}
unsigned long n_hit_miss = 0;
unsigned long n_select = 0;
double minus_log_r;
root_cell_.tree_accumulate(parametric_selector_,integral_accessor_,std::plus<double>());
get_exponent();
while (true) {
n_select = 0;
minus_log_r = -std::log(rnd_gen_()) + last_exponent_->second(last_point_[evolution_variable_]);
if (!last_exponent_->second.invertible(minus_log_r)) {
return 0.;
}
try {
last_point_[evolution_variable_] = last_exponent_->second.unique_inverse(minus_log_r);
} catch (constant_interpolation& c) {
last_point_[evolution_variable_] = rnd_gen_(c.range.first,c.range.second);
}
assert(!std::isnan(last_point_[evolution_variable_]) &&
!std::isinf(last_point_[evolution_variable_]));
if (last_point_[evolution_variable_] < evolution_cutoff_) {
return 0.;
}
++attempts_;
if (compensating_) {
root_cell_.tree_accumulate(missing_accessor_,std::plus<int>());
}
if (parameter_splits_[evolution_variable_].size() > 2)
root_cell_.tree_accumulate(parametric_selector_,integral_accessor_,std::plus<double>());
if (did_split_)
while ((last_cell_ = root_cell_.select(parametric_sampler_)) == root_cell_.end()) {
root_cell_.tree_accumulate(missing_accessor_,std::plus<int>());
if(++n_select > adaption_info_.maxtry)
throw selection_maxtry();
}
else
last_cell_ = root_cell_.begin();
last_cell_->info().select(rnd_gen_,last_point_,sample_other_variables_);
last_value_ = function_->evaluate(last_point_);
assert(last_value_ >= 0.);
last_cell_->info().selected(last_point_,last_value_,adaption_info_);
if (last_value_ > last_cell_->info().overestimate()) {
if ( std::abs(last_value_)/last_cell_->info().overestimate() > 2. ) {
last_value_ =
last_cell_->info().overestimate()*
(1.+exp(2.*(2.-std::abs(last_value_)/last_cell_->info().overestimate())));
}
compensate();
throw exponential_regenerate();
}
if (last_cell_->info().attempted() % check_events_ == 0) {
if (split()) {
throw exponential_regenerate();
}
}
if (last_value_/last_cell_->info().overestimate() > rnd_gen_())
break;
if(++n_hit_miss > adaption_info_.maxtry)
throw hit_and_miss_maxtry();
}
if (last_value_ == 0.)
return 0.;
++accepts_;
++check_events_;
last_cell_->info().accept();
return 1.;
}
template<class Function, class Random>
template<class OStream>
void exponential_generator<Function,Random>::put (OStream& os) const {
os << check_events_; ostream_traits<OStream>::separator(os);
adaption_info_.put(os);
root_cell_.put(os);
os << did_split_; ostream_traits<OStream>::separator(os);
os << initialized_; ostream_traits<OStream>::separator(os);
os << evolution_variable_; ostream_traits<OStream>::separator(os);
os << evolution_cutoff_; ostream_traits<OStream>::separator(os);
os << sample_variables_; ostream_traits<OStream>::separator(os);
os << sample_other_variables_; ostream_traits<OStream>::separator(os);
os << parameter_splits_; ostream_traits<OStream>::separator(os);
// last_cell_ is selected new so we ignore it here
os << last_point_; ostream_traits<OStream>::separator(os);
os << last_value_; ostream_traits<OStream>::separator(os);
last_parameter_bin_.put(os);
os << exponents_.size(); ostream_traits<OStream>::separator(os);
for ( std::map<bit_container<parameter_hash_bits>,linear_interpolator >::const_iterator
ex = exponents_.begin(); ex != exponents_.end() ; ++ex ) {
ex->first.put(os);
ex->second.put(os);
}
os << last_exponent_integrand_; ostream_traits<OStream>::separator(os);
os << compensating_; ostream_traits<OStream>::separator(os);
os << attempts_; ostream_traits<OStream>::separator(os);
os << accepts_; ostream_traits<OStream>::separator(os);
os << splits_; ostream_traits<OStream>::separator(os);
}
template<class Function, class Random>
template<class IStream>
void exponential_generator<Function,Random>::get (IStream& is) {
is >> check_events_;
adaption_info_.get(is);
root_cell_.get(is);
is >> did_split_ >> initialized_ >> evolution_variable_
>> evolution_cutoff_ >> sample_variables_ >> sample_other_variables_
>> parameter_splits_;
// last_cell_ is selected new so we ignore it here
is >> last_point_ >> last_value_;
last_parameter_bin_.get(is);
size_t dim; is >> dim;
for ( size_t k = 0; k < dim ; ++k ) {
bit_container<parameter_hash_bits> key;
key.get(is);
exponents_[key].get(is);
}
is >> last_exponent_integrand_;
last_exponent_ = exponents_.find(last_parameter_bin_);
is >> compensating_ >> attempts_ >> accepts_ >> splits_;
}
}
diff --git a/Exsample2/exsample/linear_interpolator.icc b/Exsample2/exsample/linear_interpolator.icc
--- a/Exsample2/exsample/linear_interpolator.icc
+++ b/Exsample2/exsample/linear_interpolator.icc
@@ -1,111 +1,111 @@
// -*- C++ -*-
//
// linear_interpolator.icc is part of ExSample -- A Library for Sampling Sudakov-Type Distributions
//
// Copyright (C) 2008-2011 Simon Platzer -- simon.plaetzer@desy.de
//
// ExSample is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
namespace exsample {
inline linear_interpolator::linear_interpolator()
: interpolation_(), range_() {}
inline linear_interpolator::linear_interpolator(const std::map<double,double>& points)
: interpolation_(points) {
reset();
}
inline void linear_interpolator::set_interpolation(double point, double value) {
interpolation_[point] = value;
if (value > range_.second)
range_.second = value;
if(value < range_.first)
range_.first = value;
}
inline void linear_interpolator::reset() {
range_.first = interpolation_.begin()->second;
range_.second = interpolation_.begin()->second;
for (std::map<double,double>::const_iterator c = interpolation_.begin();
c != interpolation_.end(); ++c) {
if (c->second < range_.first)
range_.first = c->second;
if (c->second > range_.second)
range_.second = c->second;
}
}
inline double linear_interpolator::operator()(double x) const {
std::map<double, double>::const_iterator upper =
interpolation_.upper_bound(x);
if (upper == interpolation_.end()) {
upper = interpolation_.upper_bound(x-1e-10);
}
if (upper == interpolation_.end()) {
upper = interpolation_.upper_bound(x+1e-10);
}
assert(upper != interpolation_.begin() &&
upper != interpolation_.end());
- return ((upper->second-prior(upper)->second)*x +
- prior(upper)->second*upper->first - upper->second*prior(upper)->first)/
- (upper->first - prior(upper)->first);
+ return ((upper->second-boost::prior(upper)->second)*x +
+ boost::prior(upper)->second*upper->first - upper->second*boost::prior(upper)->first)/
+ (upper->first - boost::prior(upper)->first);
}
inline double linear_interpolator::unique_inverse(double f) const {
if(!invertible(f)) throw inversion_has_no_solution();
std::map<double, double>::const_iterator lower = interpolation_.begin();
bool gotone = false;
for (; lower != --interpolation_.end(); ++lower)
- if ((lower->second >= f && next(lower)->second <= f) ||
- (lower->second <= f && next(lower)->second >= f)) {
+ if ((lower->second >= f && boost::next(lower)->second <= f) ||
+ (lower->second <= f && boost::next(lower)->second >= f)) {
gotone = true;
break;
}
if(!gotone) throw inversion_has_no_solution();
- if (lower->second == next(lower)->second) {
- throw constant_interpolation(lower->first,next(lower)->first,lower->second);
+ if (lower->second == boost::next(lower)->second) {
+ throw constant_interpolation(lower->first,boost::next(lower)->first,lower->second);
}
- double xdiff = next(lower)->first - lower->first;
- double wdiff = next(lower)->second - lower->second;
- double woffset = lower->second * next(lower)->first - next(lower)->second * lower->first;
+ double xdiff = boost::next(lower)->first - lower->first;
+ double wdiff = boost::next(lower)->second - lower->second;
+ double woffset = lower->second * boost::next(lower)->first - boost::next(lower)->second * lower->first;
return (xdiff/wdiff)*(f - woffset/xdiff);
}
template<class OStream>
void linear_interpolator::put(OStream& os) const {
os << interpolation_.size();
ostream_traits<OStream>::separator(os);
for (std::map<double, double>::const_iterator p
= interpolation_.begin(); p != interpolation_.end(); ++p) {
os << p->first;
ostream_traits<OStream>::separator(os);
os << p->second;
ostream_traits<OStream>::separator(os);
}
os << range_.first;
ostream_traits<OStream>::separator(os);
os << range_.second;
ostream_traits<OStream>::separator(os);
}
template<class IStream>
void linear_interpolator::get(IStream& is) {
std::size_t size;
is >> size;
std::pair<double,double> point;
for (std::size_t k = 0; k < size; ++k) {
is >> point.first >> point.second;
interpolation_.insert(point);
}
is >> range_.first >> range_.second;
}
}
diff --git a/MatrixElement/DIS/Makefile.am b/MatrixElement/DIS/Makefile.am
--- a/MatrixElement/DIS/Makefile.am
+++ b/MatrixElement/DIS/Makefile.am
@@ -1,6 +1,6 @@
pkglib_LTLIBRARIES = HwMEDIS.la
HwMEDIS_la_SOURCES = \
DISBase.h DISBase.cc \
MENeutralCurrentDIS.cc MENeutralCurrentDIS.h \
MEChargedCurrentDIS.cc MEChargedCurrentDIS.h
-HwMEDIS_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 4:1:0
+HwMEDIS_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 5:0:0
diff --git a/MatrixElement/Hadron/MEPP2VGamma.cc b/MatrixElement/Hadron/MEPP2VGamma.cc
--- a/MatrixElement/Hadron/MEPP2VGamma.cc
+++ b/MatrixElement/Hadron/MEPP2VGamma.cc
@@ -1,379 +1,379 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the MEPP2VGamma class.
//
#include "MEPP2VGamma.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/EnumParticles.h"
#include "ThePEG/MatrixElement/Tree2toNDiagram.h"
#include "ThePEG/Handlers/StandardXComb.h"
#include "Herwig++/Models/StandardModel/StandardModel.h"
#include "Herwig++/MatrixElement/HardVertex.h"
using namespace Herwig;
MEPP2VGamma::MEPP2VGamma() : process_(0), maxflavour_(5), massOption_(2)
{}
unsigned int MEPP2VGamma::orderInAlphaS() const {
return 0;
}
unsigned int MEPP2VGamma::orderInAlphaEW() const {
return 2;
}
ClassDescription<MEPP2VGamma> MEPP2VGamma::initMEPP2VGamma;
// Definition of the static class description member.
void MEPP2VGamma::Init() {
static ClassDocumentation<MEPP2VGamma> documentation
("The MEPP2VGamma class simulates the production of"
" W+/-gamma and Z0gamma in hadron-hadron collisions"
" using the 2->2 matrix elements");
static Switch<MEPP2VGamma,unsigned int> interfaceProcess
("Process",
"Which processes to include",
&MEPP2VGamma::process_, 0, false, false);
static SwitchOption interfaceProcessAll
(interfaceProcess,
"All",
"Include all the processes",
0);
static SwitchOption interfaceProcessWGamma
(interfaceProcess,
"WGamma",
"Only include W+/-gamma",
1);
static SwitchOption interfaceProcessZGamma
(interfaceProcess,
"ZGamma",
"Only include ZGamma",
2);
static Parameter<MEPP2VGamma,int> interfaceMaximumFlavour
("MaximumFlavour",
"The maximum flavour allowed for the incoming quarks",
&MEPP2VGamma::maxflavour_, 5, 2, 5,
false, false, Interface::limited);
static Switch<MEPP2VGamma,unsigned int> interfaceMassOption
("MassOption",
"Option for the treatment of the boson masses",
&MEPP2VGamma::massOption_, 1, false, false);
static SwitchOption interfaceMassOptionOnMassShell
(interfaceMassOption,
"OnMassShell",
"The boson is produced on its mass shell",
1);
static SwitchOption interfaceMassOption2
(interfaceMassOption,
"OffShell",
"The bosons are generated off-shell using the mass and width generator.",
2);
}
void MEPP2VGamma::persistentOutput(PersistentOStream & os) const {
os << FFPvertex_ << FFWvertex_ << FFZvertex_ << WWWvertex_
<< process_ << massOption_;
}
void MEPP2VGamma::persistentInput(PersistentIStream & is, int) {
is >> FFPvertex_ >> FFWvertex_ >> FFZvertex_ >> WWWvertex_
>> process_ >> massOption_;
}
Energy2 MEPP2VGamma::scale() const {
return sHat();
}
IBPtr MEPP2VGamma::clone() const {
return new_ptr(*this);
}
IBPtr MEPP2VGamma::fullclone() const {
return new_ptr(*this);
}
void MEPP2VGamma::doinit() {
HwMEBase::doinit();
// mass option
vector<unsigned int> mopt(2,1);
mopt[0]=massOption_;
massOption(mopt);
rescalingOption(2);
// get the vertices we need
// get a pointer to the standard model object in the run
static const tcHwSMPtr hwsm
= dynamic_ptr_cast<tcHwSMPtr>(standardModel());
if (!hwsm) throw InitException() << "hwsm pointer is null in"
<< " MEPP2VGamma::doinit()"
<< Exception::abortnow;
// get pointers to all required Vertex objects
FFZvertex_ = hwsm->vertexFFZ();
FFPvertex_ = hwsm->vertexFFP();
WWWvertex_ = hwsm->vertexWWW();
FFWvertex_ = hwsm->vertexFFW();
}
Selector<const ColourLines *>
MEPP2VGamma::colourGeometries(tcDiagPtr diag) const {
static ColourLines cs("1 -2");
static ColourLines ct("1 2 -3");
Selector<const ColourLines *> sel;
if(diag->id()<-2) sel.insert(1.0, &cs);
else sel.insert(1.0, &ct);
return sel;
}
void MEPP2VGamma::getDiagrams() const {
typedef std::vector<pair<tcPDPtr,tcPDPtr> > Pairvector;
tcPDPtr wPlus = getParticleData(ParticleID::Wplus );
tcPDPtr wMinus = getParticleData(ParticleID::Wminus);
tcPDPtr z0 = getParticleData(ParticleID::Z0 );
tcPDPtr gamma = getParticleData(ParticleID::gamma);
// W+/- gamma
if(process_==0||process_==1) {
// possible parents
Pairvector parentpair;
parentpair.reserve(6);
// don't even think of putting 'break' in here!
switch(maxflavour_) {
case 5:
parentpair.push_back(make_pair(getParticleData(ParticleID::b),
getParticleData(ParticleID::cbar)));
parentpair.push_back(make_pair(getParticleData(ParticleID::b),
getParticleData(ParticleID::ubar)));
case 4:
parentpair.push_back(make_pair(getParticleData(ParticleID::s),
getParticleData(ParticleID::cbar)));
parentpair.push_back(make_pair(getParticleData(ParticleID::d),
getParticleData(ParticleID::cbar)));
case 3:
parentpair.push_back(make_pair(getParticleData(ParticleID::s),
getParticleData(ParticleID::ubar)));
case 2:
parentpair.push_back(make_pair(getParticleData(ParticleID::d),
getParticleData(ParticleID::ubar)));
default:
;
}
// W+ gamma
for(unsigned int ix=0;ix<parentpair.size();++ix) {
add(new_ptr((Tree2toNDiagram(3), parentpair[ix].second->CC(),
parentpair[ix].first, parentpair[ix].first->CC(),
1, wPlus, 2, gamma, -1)));
add(new_ptr((Tree2toNDiagram(3), parentpair[ix].second->CC(),
parentpair[ix].second->CC() , parentpair[ix].first->CC(),
2, wPlus, 1, gamma, -2)));
add(new_ptr((Tree2toNDiagram(2), parentpair[ix].second->CC(),
parentpair[ix].first->CC(), 1, wPlus, 3, wPlus, 3, gamma, -3)));
}
// W- gamma
for(unsigned int ix=0;ix<parentpair.size();++ix) {
add(new_ptr((Tree2toNDiagram(3), parentpair[ix].first,
parentpair[ix].second->CC(),
parentpair[ix].second, 1, wMinus, 2, gamma, -1)));
add(new_ptr((Tree2toNDiagram(3), parentpair[ix].first, parentpair[ix].first ,
parentpair[ix].second, 2, wMinus, 1, gamma, -2)));
add(new_ptr((Tree2toNDiagram(2), parentpair[ix].first,
parentpair[ix].second, 1, wMinus, 3, wMinus, 3, gamma, -3)));
}
}
if(process_==0||process_==2) {
for(int ix=1;ix<=maxflavour_;++ix) {
tcPDPtr qk = getParticleData(ix);
tcPDPtr qb = qk->CC();
add(new_ptr((Tree2toNDiagram(3), qk, qk, qb, 1, z0, 2, gamma, -1)));
add(new_ptr((Tree2toNDiagram(3), qk, qk, qb, 2, z0, 1, gamma, -2)));
}
}
}
Selector<MEBase::DiagramIndex>
MEPP2VGamma::diagrams(const DiagramVector & diags) const {
Selector<DiagramIndex> sel;
for ( DiagramIndex i = 0; i < diags.size(); ++i )
- sel.insert(meInfo()[abs(diags[i]->id())], i);
+ sel.insert(meInfo()[abs(diags[i]->id()) - 1], i);
return sel;
}
double MEPP2VGamma::me2() const {
// setup momenta and particle data for the external wavefunctions
// incoming
SpinorWaveFunction em_in( meMomenta()[0],mePartonData()[0],incoming);
SpinorBarWaveFunction ep_in( meMomenta()[1],mePartonData()[1],incoming);
// outgoing
VectorWaveFunction v1_out(meMomenta()[2],mePartonData()[2],outgoing);
VectorWaveFunction v2_out(meMomenta()[3],mePartonData()[3],outgoing);
vector<SpinorWaveFunction> f1;
vector<SpinorBarWaveFunction> a1;
vector<VectorWaveFunction> v1,v2;
// calculate the wavefunctions
for(unsigned int ix=0;ix<3;++ix) {
if(ix<2) {
em_in.reset(ix);
f1.push_back(em_in);
ep_in.reset(ix);
a1.push_back(ep_in);
}
v1_out.reset(ix);
v1.push_back(v1_out);
if(ix!=1) {
v2_out.reset(ix);
v2.push_back(v2_out);
}
}
if(mePartonData()[2]->id()==ParticleID::Z0) {
return ZGammaME(f1,a1,v1,v2,false);
}
else {
return WGammaME(f1,a1,v1,v2,false);
}
}
double MEPP2VGamma::ZGammaME(vector<SpinorWaveFunction> & f1,
vector<SpinorBarWaveFunction> & a1,
vector<VectorWaveFunction> & v1,
vector<VectorWaveFunction> & v2,
bool calc) const {
double output(0.);
vector<double> me(3,0.0);
if(calc) me_.reset(ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1));
vector<Complex> diag(2,0.0);
SpinorWaveFunction inter;
for(unsigned int ihel1=0;ihel1<2;++ihel1) {
for(unsigned int ihel2=0;ihel2<2;++ihel2) {
for(unsigned int ohel1=0;ohel1<3;++ohel1) {
for(unsigned int ohel2=0;ohel2<2;++ohel2) {
inter = FFZvertex_->evaluate(scale(),5,f1[ihel1].particle(),
f1[ihel1],v1[ohel1]);
diag[0] = FFPvertex_->evaluate(scale(),inter,a1[ihel2],v2[ohel2]);
inter = FFPvertex_->evaluate(scale(),5,f1[ihel1].particle(),
f1[ihel1] ,v2[ohel2]);
diag[1] = FFZvertex_->evaluate(scale(),inter,a1[ihel2],v1[ohel1]);
// individual diagrams
for (size_t ii=0; ii<2; ++ii) me[ii] += std::norm(diag[ii]);
// full matrix element
diag[0] += diag[1];
output += std::norm(diag[0]);
// storage of the matrix element for spin correlations
if(calc) me_(ihel1,ihel2,ohel1,ohel2) = diag[0];
}
}
}
}
DVector save(3);
for (size_t i = 0; i < 3; ++i) {
save[i] = 0.25 * me[i];
}
meInfo(save);
return 0.25*output/3.;
}
double MEPP2VGamma::WGammaME(vector<SpinorWaveFunction> & f1,
vector<SpinorBarWaveFunction> & a1,
vector<VectorWaveFunction> & v1,
vector<VectorWaveFunction> & v2,
bool calc) const {
double output(0.);
vector<double> me(3,0.0);
if(calc) me_.reset(ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1));
vector<Complex> diag(3,0.0);
SpinorWaveFunction inter;
for(unsigned int ihel1=0;ihel1<2;++ihel1) {
for(unsigned int ihel2=0;ihel2<2;++ihel2) {
VectorWaveFunction interW =
FFWvertex_->evaluate(scale(),3,v1[0].particle(),
f1[ihel1],a1[ihel2]);
for(unsigned int ohel1=0;ohel1<3;++ohel1) {
for(unsigned int ohel2=0;ohel2<2;++ohel2) {
// t-channel diagrams
inter = FFWvertex_->evaluate(scale(),5,a1[ihel1].particle(),
f1[ihel1],v1[ohel1]);
diag[0] = FFPvertex_->evaluate(scale(),inter,a1[ihel2],v2[ohel2]);
inter = FFPvertex_->evaluate(scale(),5,f1[ihel1].particle(),
f1[ihel1] ,v2[ohel2]);
diag[1] = FFWvertex_->evaluate(scale(),inter,a1[ihel2],v1[ohel1]);
// s-channel diagram
diag[2] = WWWvertex_->evaluate(scale(),interW,v1[ohel1],v2[ohel2]);
// individual diagrams
for (size_t ii=0; ii<3; ++ii) me[ii] += std::norm(diag[ii]);
// full matrix element
diag[0] += diag[1]+diag[2];
output += std::norm(diag[0]);
// storage of the matrix element for spin correlations
if(calc) me_(ihel1,ihel2,ohel1,ohel2) = diag[0];
}
}
}
}
DVector save(3);
for (size_t i = 0; i < 3; ++i) save[i] = 0.25 * me[i];
meInfo(save);
// spin and colour factors
output *= 0.25/3.;
// testing code
// int iu = abs(mePartonData()[0]->id());
// int id = abs(mePartonData()[1]->id());
// if(iu%2!=0) swap(iu,id);
// iu = (iu-2)/2;
// id = (id-1)/2;
// double ckm = SM().CKM(iu,id);
// InvEnergy4 dsigdt = Constants::pi*sqr(SM().alphaEM(scale()))
// /6./sqr(sHat())/SM().sin2ThetaW()*sqr(1./(1.+tHat()/uHat())-1./3.)*
// (sqr(tHat())+sqr(uHat())+2.*sqr(getParticleData(ParticleID::Wplus)->mass())*sHat())/
// tHat()/uHat();
// double test = 16.*ckm*Constants::pi*sqr(sHat())*dsigdt;
// cerr << "testing W gamma " << test << " " << output << " "
// << (test-output)/(test+output) << "\n";
return output;
}
void MEPP2VGamma::constructVertex(tSubProPtr sub) {
// extract the particles in the hard process
ParticleVector hard;
hard.push_back(sub->incoming().first);
hard.push_back(sub->incoming().second);
hard.push_back(sub->outgoing()[0]);
hard.push_back(sub->outgoing()[1]);
// order of particles
unsigned int order[4]={0,1,2,3};
if(hard[order[0]]->id()<0) swap(order[0],order[1]);
vector<SpinorWaveFunction> q;
vector<SpinorBarWaveFunction> qb;
SpinorWaveFunction (q ,hard[order[0]],incoming,false);
SpinorBarWaveFunction(qb,hard[order[1]],incoming,false);
vector<VectorWaveFunction> w1,w2;
if(hard[order[2]]->id()==ParticleID::gamma)
swap(order[2],order[3]);
VectorWaveFunction (w1,hard[order[2]],outgoing,true ,false);
VectorWaveFunction (w2,hard[order[3]],outgoing,true ,true );
w2[1]=w2[2];
// q qbar -> Z gamma
if(hard[order[2]]->id()==ParticleID::Z0) {
ZGammaME(q,qb,w1,w2,true);
}
// q qbar -> W gamma
else {
WGammaME(q,qb,w1,w2,true);
}
// construct the vertex
HardVertexPtr hardvertex=new_ptr(HardVertex());
// set the matrix element for the vertex
hardvertex->ME(me_);
// set the pointers and to and from the vertex
for(unsigned int ix=0;ix<4;++ix)
hard[order[ix]]->spinInfo()->productionVertex(hardvertex);
}
diff --git a/MatrixElement/Hadron/Makefile.am b/MatrixElement/Hadron/Makefile.am
--- a/MatrixElement/Hadron/Makefile.am
+++ b/MatrixElement/Hadron/Makefile.am
@@ -1,27 +1,27 @@
pkglib_LTLIBRARIES = HwMEHadron.la
HwMEHadron_la_SOURCES = \
MEqq2gZ2ff.cc MEqq2gZ2ff.h \
MEqq2W2ff.cc MEqq2W2ff.h \
MEPP2GammaJet.h MEPP2GammaJet.cc\
MEQCD2to2.h MEQCD2to2.cc\
MEPP2HiggsJet.h MEPP2HiggsJet.cc\
MEPP2GammaGamma.h MEPP2GammaGamma.cc \
MEPP2QQ.h MEPP2QQ.cc \
MEPP2QQHiggs.h MEPP2QQHiggs.cc \
MEPP2Higgs.h MEPP2Higgs.cc\
MEPP2WH.h MEPP2WH.cc \
MEPP2ZH.h MEPP2ZH.cc \
MEPP2WJet.cc MEPP2WJet.h \
MEPP2ZJet.cc MEPP2ZJet.h \
MEPP2VV.cc MEPP2VV.h \
MEPP2VGamma.cc MEPP2VGamma.h \
MEPP2HiggsVBF.cc MEPP2HiggsVBF.h \
MEPP2SingleTop.cc MEPP2SingleTop.h \
MEMinBias.h MEMinBias.cc
-HwMEHadron_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 5:1:0
+HwMEHadron_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 6:0:0
pkglib_LTLIBRARIES += HwMEHadronFast.la
HwMEHadronFast_la_SOURCES = \
MEQCD2to2Fast.h MEQCD2to2Fast.cc
-HwMEHadronFast_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 3:0:0
+HwMEHadronFast_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 4:0:0
diff --git a/MatrixElement/Lepton/MEee2VV.cc b/MatrixElement/Lepton/MEee2VV.cc
--- a/MatrixElement/Lepton/MEee2VV.cc
+++ b/MatrixElement/Lepton/MEee2VV.cc
@@ -1,429 +1,429 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the MEee2VV class.
//
#include "MEee2VV.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/EnumParticles.h"
#include "ThePEG/MatrixElement/Tree2toNDiagram.h"
#include "ThePEG/Handlers/StandardXComb.h"
#include "Herwig++/Models/StandardModel/StandardModel.h"
#include "Herwig++/MatrixElement/HardVertex.h"
#include "ThePEG/PDF/PolarizedBeamParticleData.h"
using namespace Herwig;
MEee2VV::MEee2VV() : process_(0), massOption_(2) {}
void MEee2VV::doinit() {
HwMEBase::doinit();
massOption(vector<unsigned int>(2,massOption_));
rescalingOption(2);
// get the vertices we need
// get a pointer to the standard model object in the run
static const tcHwSMPtr hwsm
= dynamic_ptr_cast<tcHwSMPtr>(standardModel());
if (!hwsm) throw InitException() << "hwsm pointer is null in"
<< " MEee2VV::doinit()"
<< Exception::abortnow;
// get pointers to all required Vertex objects
FFZvertex_ = hwsm->vertexFFZ();
FFPvertex_ = hwsm->vertexFFP();
WWWvertex_ = hwsm->vertexWWW();
FFWvertex_ = hwsm->vertexFFW();
}
void MEee2VV::getDiagrams() const {
// get the particle data objects we need
tcPDPtr wPlus = getParticleData(ParticleID::Wplus );
tcPDPtr wMinus = getParticleData(ParticleID::Wminus);
tcPDPtr z0 = getParticleData(ParticleID::Z0 );
tcPDPtr gamma = getParticleData(ParticleID::gamma);
tcPDPtr em = getParticleData(ParticleID::eminus);
tcPDPtr ep = getParticleData(ParticleID::eplus);
tcPDPtr nu_e = getParticleData(ParticleID::nu_e);
if(process_==0||process_==1) {
// s-channel Z0 for W+W- production
add(new_ptr((Tree2toNDiagram(2), em, ep, 1, z0, 3, wMinus, 3, wPlus, -2)));
// s-channel photon for W+W- production
add(new_ptr((Tree2toNDiagram(2), em, ep, 1, gamma, 3, wMinus, 3, wPlus, -1)));
// t channel for W+W- production
add(new_ptr((Tree2toNDiagram(3), em, nu_e, ep, 1, wMinus, 2, wPlus, -3)));
}
if(process_==0||process_==2) {
add(new_ptr((Tree2toNDiagram(3), em, em, ep, 1, z0, 2, z0, -1)));
add(new_ptr((Tree2toNDiagram(3), em, em, ep, 2, z0, 1, z0, -2)));
}
}
Energy2 MEee2VV::scale() const {
return sHat();
}
unsigned int MEee2VV::orderInAlphaS() const {
return 0;
}
unsigned int MEee2VV::orderInAlphaEW() const {
return 2;
}
Selector<const ColourLines *>
MEee2VV::colourGeometries(tcDiagPtr ) const {
static ColourLines cl("");
Selector<const ColourLines *> sel;
sel.insert(1.0, &cl);
return sel;
}
IBPtr MEee2VV::clone() const {
return new_ptr(*this);
}
IBPtr MEee2VV::fullclone() const {
return new_ptr(*this);
}
ClassDescription<MEee2VV> MEee2VV::initMEee2VV;
// Definition of the static class description member.
void MEee2VV::Init() {
static ClassDocumentation<MEee2VV> documentation
("The MEee2VV class simulates the processes e+e->W+W-"
" and e+e-->Z0Z0 using a 2->2 matrix element");
static Switch<MEee2VV,unsigned int> interfaceProcess
("Process",
"Which processes to include",
&MEee2VV::process_, 0, false, false);
static SwitchOption interfaceProcessAll
(interfaceProcess,
"All",
"Include WW and ZZ",
0);
static SwitchOption interfaceProcessWW
(interfaceProcess,
"WW",
"Only include WW",
1);
static SwitchOption interfaceProcessZZ
(interfaceProcess,
"ZZ",
"Only include ZZ",
2);
static Switch<MEee2VV,unsigned int> interfaceMassOption
("MassOption",
"Option for the treatment of the W/Z mass",
&MEee2VV::massOption_, 1, false, false);
static SwitchOption interfaceMassOptionOnMassShell
(interfaceMassOption,
"OnMassShell",
"The W/Z is produced on its mass shell",
1);
static SwitchOption interfaceMassOption2
(interfaceMassOption,
"OffShell",
"The W/Z is generated off-shell using the mass and width generator.",
2);
}
void MEee2VV::persistentOutput(PersistentOStream & os) const {
os << process_ << massOption_
<< FFPvertex_ << FFWvertex_ << FFZvertex_ << WWWvertex_;
}
void MEee2VV::persistentInput(PersistentIStream & is, int) {
is >> process_ >> massOption_
>> FFPvertex_ >> FFWvertex_ >> FFZvertex_ >> WWWvertex_;
}
double MEee2VV::me2() const {
// setup momenta and particle data for the external wavefunctions
// incoming
SpinorWaveFunction em_in( meMomenta()[0],mePartonData()[0],incoming);
SpinorBarWaveFunction ep_in( meMomenta()[1],mePartonData()[1],incoming);
// outgoing
VectorWaveFunction v1_out(meMomenta()[2],mePartonData()[2],outgoing);
VectorWaveFunction v2_out(meMomenta()[3],mePartonData()[3],outgoing);
vector<SpinorWaveFunction> f1;
vector<SpinorBarWaveFunction> a1;
vector<VectorWaveFunction> v1,v2;
// calculate the wavefunctions
for(unsigned int ix=0;ix<3;++ix) {
if(ix<2) {
em_in.reset(ix);
f1.push_back(em_in);
ep_in.reset(ix);
a1.push_back(ep_in);
}
v1_out.reset(ix);
v1.push_back(v1_out);
v2_out.reset(ix);
v2.push_back(v2_out);
}
// e+e- > Z Z
if(v1[0].particle()->id()==ParticleID::Z0) {
return ZZME(f1,a1,v1,v2);
}
// e+e- > W+W-
else {
return WWME(f1,a1,v1,v2);
}
}
double MEee2VV::WWME(vector<SpinorWaveFunction> & f1,
vector<SpinorBarWaveFunction> & a1,
vector<VectorWaveFunction> & v1,
vector<VectorWaveFunction> & v2) const {
double output(0.);
vector<double> me(3,0.0);
me_.reset(ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1));
ProductionMatrixElement hme[3]={ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1),
ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1),
ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1)};
// particle data for the t-channel intermediate
tcPDPtr nu_e = getParticleData(ParticleID::nu_e);
tcPDPtr gamma = getParticleData(ParticleID::gamma);
tcPDPtr z0 = getParticleData(ParticleID::Z0);
vector<Complex> diag(3,0.0);
for(unsigned int ihel1=0;ihel1<2;++ihel1) {
for(unsigned int ihel2=0;ihel2<2;++ihel2) {
VectorWaveFunction interP =
FFPvertex_->evaluate(scale(),3,gamma,f1[ihel1],a1[ihel2]);
VectorWaveFunction interZ =
FFZvertex_->evaluate(scale(),3,z0 ,f1[ihel1],a1[ihel2]);
for(unsigned int ohel1=0;ohel1<3;++ohel1) {
for(unsigned int ohel2=0;ohel2<3;++ohel2) {
diag[0] = WWWvertex_->evaluate(scale(),interP,v2[ohel2],v1[ohel1]);
// s-channel Z0
diag[1] = WWWvertex_->evaluate(scale(),interZ,v2[ohel2],v1[ohel1]);
// t-channel neutrino
SpinorWaveFunction inter_nu_e =
FFWvertex_->evaluate(scale(),1,nu_e,f1[ihel1],v1[ohel1]);
diag[2] =
FFWvertex_->evaluate(scale(),inter_nu_e,a1[ihel2],v2[ohel2]);
// individual diagrams
for (size_t ii=0; ii<3; ++ii) {
me[ii] += std::norm(diag[ii]);
hme[ii](ihel1,ihel2,ohel1,ohel2) = diag[ii];
}
// full matrix element
diag[0] += diag[1]+diag[2];
output += std::norm(diag[0]);
// storage of the matrix element for spin correlations
me_(ihel1,ihel2,ohel1,ohel2) = diag[0];
}
}
}
}
DVector save(3);
for (size_t i = 0; i < 3; ++i) save[i] = 0.25 * me[i];
output *= 0.25;
// polarization stuff
tcPolarizedBeamPDPtr beam[2] =
{dynamic_ptr_cast<tcPolarizedBeamPDPtr>(mePartonData()[0]),
dynamic_ptr_cast<tcPolarizedBeamPDPtr>(mePartonData()[1])};
if( beam[0] || beam[1] ) {
RhoDMatrix rho[2] = {beam[0] ? beam[0]->rhoMatrix() : RhoDMatrix(mePartonData()[0]->iSpin()),
beam[1] ? beam[1]->rhoMatrix() : RhoDMatrix(mePartonData()[1]->iSpin())};
for(unsigned int i=0;i<3;++i) me[i] = hme[i].average(rho[0],rho[1]);
output = me_.average(rho[0],rho[1]);
}
meInfo(save);
// testing code
// double xW = SM().sin2ThetaW();
// double Q=-1.;
// double l = 2.*(-0.5-Q*xW);
// double r =-2.*Q*xW;
// Energy2 mW2 = sqr(getParticleData(ParticleID::Wplus)->mass());
// Energy2 mZ2 = sqr(getParticleData(ParticleID::Z0)->mass());
// Energy2 sh=sHat(),th=tHat(),uh=uHat();
// double A = (th*uh/sqr(mW2)-1.)*(0.25-mW2/sh+3.*sqr(mW2/sh))
// +sh/mW2-4;
// double bracket =
// A*(sqr(Q+0.25*(l+r)/xW*sh/(sh-mZ2))+
// sqr( 0.25*(l-r)/xW*sh/(sh-mZ2)));
// if(Q>0) swap(uh,th);
// double I = (th*uh/sqr(mW2)-1.)*(0.25-0.5*mW2/sh-sqr(mW2)/sh/th)
// +sh/mW2-2.+2.*mW2/th;
// double E = (th*uh/sqr(mW2)-1.)*(0.25+sqr(mW2/th))+sh/mW2;
// if(Q<0.)
// bracket += 0.5/xW*(Q+0.5*l/xW*sh/(sh-mZ2))*I+0.125/sqr(xW)*E;
// else
// bracket +=-0.5/xW*(Q+0.5*l/xW*sh/(sh-mZ2))*I+0.125/sqr(xW)*E;
// InvEnergy4 dsigdt = 2.*Constants::pi*sqr(SM().alphaEM(scale()))/sqr(sh)*bracket;
// double test = 16.*Constants::pi*sqr(sHat())*dsigdt;
// cerr << "testing " << test << " " << output << " " << test/output << "\n";
return output;
}
double MEee2VV::ZZME(vector<SpinorWaveFunction> & f1,
vector<SpinorBarWaveFunction> & a1,
vector<VectorWaveFunction> & v1,
vector<VectorWaveFunction> & v2) const {
double output(0.);
vector<double> me(3,0.0);
me_.reset(ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1));
ProductionMatrixElement hme[2]={ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1),
ProductionMatrixElement(PDT::Spin1Half,PDT::Spin1Half,
PDT::Spin1,PDT::Spin1)};
tcPDPtr em = getParticleData(ParticleID::eminus);
vector<Complex> diag(2,0.0);
SpinorWaveFunction inter;
for(unsigned int ihel1=0;ihel1<2;++ihel1) {
for(unsigned int ihel2=0;ihel2<2;++ihel2) {
for(unsigned int ohel1=0;ohel1<3;++ohel1) {
for(unsigned int ohel2=0;ohel2<3;++ohel2) {
inter = FFZvertex_->evaluate(scale(),1,em,f1[ihel1] ,v1[ohel1]);
diag[0] = FFZvertex_->evaluate(scale(),inter,a1[ihel2],v2[ohel2]);
inter = FFZvertex_->evaluate(scale(),1,em,f1[ihel1] ,v2[ohel2]);
diag[1] = FFZvertex_->evaluate(scale(),inter,a1[ihel2],v1[ohel1]);
// individual diagrams
for (size_t ii=0; ii<2; ++ii) {
me[ii] += std::norm(diag[ii]);
hme[ii](ihel1,ihel2,ohel1,ohel2) = diag[ii];
}
// full matrix element
diag[0] += diag[1];
output += std::norm(diag[0]);
// storage of the matrix element for spin correlations
me_(ihel1,ihel2,ohel1,ohel2) = diag[0];
}
}
}
}
DVector save(3);
for (size_t i = 0; i < 3; ++i) save[i] = 0.25 * me[i];
meInfo(save);
// spin average
output *= 0.25;
// polarization stuff
tcPolarizedBeamPDPtr beam[2] =
{dynamic_ptr_cast<tcPolarizedBeamPDPtr>(mePartonData()[0]),
dynamic_ptr_cast<tcPolarizedBeamPDPtr>(mePartonData()[1])};
if( beam[0] || beam[1] ) {
RhoDMatrix rho[2] = {beam[0] ? beam[0]->rhoMatrix() : RhoDMatrix(mePartonData()[0]->iSpin()),
beam[1] ? beam[1]->rhoMatrix() : RhoDMatrix(mePartonData()[1]->iSpin())};
for(unsigned int i=0;i<2;++i) me[i] = hme[i].average(rho[0],rho[1]);
output = me_.average(rho[0],rho[1]);
}
// identical particle factor
output /= 2.;
// testing code
// double xW = SM().sin2ThetaW();
// double Q=-1.;
// double l = 2.*(-0.5-Q*xW);
// double r =-2.*Q*xW;
// Energy2 mZ2 = sqr(getParticleData(ParticleID::Z0)->mass());
// Energy2 sh=sHat(),th=tHat(),uh=uHat();
// InvEnergy4 dsigdt = Constants::pi*sqr(SM().alphaEM(scale()))/32.*
// (pow(l,4)+pow(r,4))/sqr(xW)/sqr(1.-xW)/sqr(sh)
// *(th/uh+uh/th+4.*mZ2*sh/th/uh-sqr(mZ2)*(1./sqr(th)+1./sqr(uh)));
// double test = 16.*Constants::pi*sqr(sHat())*dsigdt;
// cerr << "testing " << (test-output)/(test+output) << "\n";
return output;
}
Selector<MEBase::DiagramIndex>
MEee2VV::diagrams(const DiagramVector & diags) const {
vector<double> last(3);
if ( lastXCombPtr() ) {
for(unsigned int ix=0;ix<3;++ix) last[ix] = meInfo()[ix];
}
Selector<DiagramIndex> sel;
for ( DiagramIndex i = 0; i < diags.size(); ++i ) {
- if(diags[i]->id() >= -3 ) sel.insert(last[-diags[i]->id()],i);
+ if(diags[i]->id() >= -3 ) sel.insert(last[-diags[i]->id() - 1],i);
}
return sel;
}
double MEee2VV::getCosTheta(double ctmin, double ctmax, const double r) {
double rand = r;
Energy2 m12 = sqr(meMomenta()[2].mass());
Energy2 m22 = sqr(meMomenta()[3].mass());
Energy2 D1 = sHat()-m12-m22;
Energy4 lambda = sqr(D1) - 4*m12*m22;
double D = D1 / sqrt(lambda);
if(abs(mePartonData()[2]->id())==ParticleID::Wplus) {
double fraction = (D-ctmax)/(D-ctmin);
double costh = D - (D - ctmin) * pow(fraction, rand);
jacobian((costh - D) * log(fraction));
return costh;
}
else {
double prob = 0.5;
double costh;
double fraction1 = (D-ctmax)/(D-ctmin);
double fraction2 = (D+ctmin)/(D+ctmax);
if(rand<=prob) {
rand /=prob;
costh = D - (D - ctmin) * pow(fraction1, rand);
}
else {
rand = (rand-prob)/(1.-prob);
costh =-D + (D + ctmax) * pow(fraction2, rand);
}
jacobian(1./(prob /((costh - D) * log(fraction1))-
(1.-prob)/((costh + D) * log(fraction2))));
return costh;
}
}
void MEee2VV::constructVertex(tSubProPtr sub) {
// extract the particles in the hard process
ParticleVector hard;
hard.push_back(sub->incoming().first);
hard.push_back(sub->incoming().second);
hard.push_back(sub->outgoing()[0]);
hard.push_back(sub->outgoing()[1]);
// order of particles
unsigned int order[4]={0,1,2,3};
if(hard[order[0]]->id()<0) swap(order[0],order[1]);
if(hard[order[3]]->id()<0) swap(order[2],order[3]);
vector<SpinorWaveFunction> f;
vector<SpinorBarWaveFunction> fbar;
SpinorWaveFunction (f ,hard[order[0]],incoming,false);
SpinorBarWaveFunction(fbar,hard[order[1]],incoming,false);
vector<VectorWaveFunction> w1,w2;
VectorWaveFunction (w1,hard[order[2]],outgoing,true ,false);
VectorWaveFunction (w2,hard[order[3]],outgoing,true ,false);
if(hard[order[2]]->id()==ParticleID::Z0) {
ZZME(f,fbar,w1,w2);
}
else {
WWME(f,fbar,w1,w2);
}
// construct the vertex
HardVertexPtr hardvertex=new_ptr(HardVertex());
// set the matrix element for the vertex
hardvertex->ME(me_);
// set the pointers and to and from the vertex
for(unsigned int ix=0;ix<4;++ix) {
tcSpinPtr spin = hard[order[ix]]->spinInfo();
if(ix<2) {
tcPolarizedBeamPDPtr beam =
dynamic_ptr_cast<tcPolarizedBeamPDPtr>(hard[ix]->dataPtr());
if(beam) spin->rhoMatrix() = beam->rhoMatrix();
}
spin->productionVertex(hardvertex);
}
}
diff --git a/MatrixElement/Lepton/Makefile.am b/MatrixElement/Lepton/Makefile.am
--- a/MatrixElement/Lepton/Makefile.am
+++ b/MatrixElement/Lepton/Makefile.am
@@ -1,9 +1,9 @@
pkglib_LTLIBRARIES = HwMELepton.la
HwMELepton_la_SOURCES = \
MEee2gZ2qq.h MEee2gZ2qq.cc\
MEee2gZ2ll.h MEee2gZ2ll.cc\
MEee2ZH.h MEee2ZH.cc\
MEee2HiggsVBF.h MEee2HiggsVBF.cc \
MEee2VV.h MEee2VV.cc \
MEee2VectorMeson.h MEee2VectorMeson.cc
-HwMELepton_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 4:0:1
+HwMELepton_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 5:0:0
diff --git a/MatrixElement/Matchbox/InsertionOperators/DipoleMIOperator.cc b/MatrixElement/Matchbox/InsertionOperators/DipoleMIOperator.cc
--- a/MatrixElement/Matchbox/InsertionOperators/DipoleMIOperator.cc
+++ b/MatrixElement/Matchbox/InsertionOperators/DipoleMIOperator.cc
@@ -1,304 +1,305 @@
// -*- C++ -*-
//
// DipoleMIOperator.cc is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2012 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 DipoleMIOperator class.
//
#include "DipoleMIOperator.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/StandardModel/StandardModelBase.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/Throw.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "Herwig++/MatrixElement/Matchbox/Base/DipoleRepository.h"
+#include "ThePEG/PDT/DecayMode.h"
#include <gsl/gsl_sf_dilog.h>
// TODO: remove
// only for checking for NaN or inf
#include <gsl/gsl_math.h>
using namespace Herwig;
using Constants::pi;
DipoleMIOperator::DipoleMIOperator()
: MatchboxInsertionOperator(),
CA(-1.0), CF(-1.0),
gammaQuark(-1.0), gammaGluon(-1.0),
KQuark(-1.0), KGluon(-1.0) {}
DipoleMIOperator::~DipoleMIOperator() {}
IBPtr DipoleMIOperator::clone() const {
return new_ptr(*this);
}
IBPtr DipoleMIOperator::fullclone() const {
return new_ptr(*this);
}
void DipoleMIOperator::setXComb(tStdXCombPtr xc) {
MatchboxInsertionOperator::setXComb(xc);
CA = SM().Nc();
CF = (SM().Nc()*SM().Nc()-1.0)/(2.*SM().Nc());
gammaQuark = (3./2.)*CF;
gammaGluon = (11./6.)*CA - (1./3.)*lastBorn()->nLight();
KQuark = (7./2.-sqr(pi)/6.)*CF;
KGluon = (67./18.-sqr(pi)/6.)*CA-(5./9.)*lastBorn()->nLight();
if ( isDR() ) {
gammaQuark -= CF/2.;
gammaGluon -= CA/6.;
}
}
bool DipoleMIOperator::apply(const cPDVector& pd) const {
for ( cPDVector::const_iterator p = pd.begin();
p != pd.end(); ++p ) {
for ( cPDVector::const_iterator q = pd.begin();
q != pd.end(); ++q ) {
if ( p == q )
continue;
if ( apply(*p,*q) )
return true;
}
}
return false;
}
bool DipoleMIOperator::apply(tcPDPtr pd1, tcPDPtr pd2) const {
return
(abs(pd1->id()) < 7 || pd1->id() == ParticleID::g) &&
(abs(pd2->id()) < 7 || pd2->id() == ParticleID::g) &&
(pd1->mass() != ZERO || pd2->mass() != ZERO);
}
double DipoleMIOperator::me2() const {
if ( !isCS() )
throw InitException() <<
"DipoleMIOperator only implemented in the Catani-Seymour scheme.";
double res = 0.;
int idj = 0; int idk = 0;
for ( cPDVector::const_iterator j = mePartonData().begin();
j != mePartonData().end(); ++j, ++idj ) {
idk = 0;
for ( cPDVector::const_iterator k = mePartonData().begin();
k != mePartonData().end(); ++k, ++idk ) {
if ( j == k || lastBorn()->noDipole(idj,idk) )
continue;
if ( !apply(*j,*k) )
continue;
// NOTE: massless dipoles handled by DipoleIOperator
// sum over massive flavours occurs in j==gluon contribution
if ( abs((*j)->id()) < 6 && (*j)->mass() == ZERO &&
(*k)->mass() == ZERO )
continue;
// NOTE: j,k = incoming same contribution as in DipoleIOperator
if ( idj < 2 && idk < 2 )
continue;
Energy2 sjk = 2.*meMomenta()[idj]*meMomenta()[idk];
double kappa=0.;
res +=
( ((**j).id() == ParticleID::g ? CA : CF) *
( ( idj >= 2 ? Vj(**j,**k,sjk,kappa) : Vj(**j,**k,sjk,2./3.,true) )
- sqr(pi)/3. ) +
((**j).id() == ParticleID::g ? GammaGluon() : GammaQuark(**j,sjk)) +
// factor (1.+log(mu2/sjk)) absorbed in Gamma_j
((**j).id() == ParticleID::g ? gammaGluon : gammaQuark) +
((**j).id() == ParticleID::g ? KGluon : KQuark) ) *
lastBorn()->colourCorrelatedME2(make_pair(idj,idk));
// contributions counted here AND in DipoleIOperator if j,k, massless
// (here only if j==gluon)
// subtract DipoleIOperator contribution.
if ( (**j).mass() == ZERO && (**k).mass() == ZERO )
res -=
( ((**j).id() == ParticleID::g ? CA : CF) * (-sqr(pi)/3.) +
((**j).id() == ParticleID::g ? gammaGluon : gammaQuark) +
((**j).id() == ParticleID::g ? KGluon : KQuark) ) *
lastBorn()->colourCorrelatedME2(make_pair(idj,idk));
}
}
res *= ( - lastBorn()->lastAlphaS() / (2.*pi) );
if( gsl_isnan(res) ) cout << "DipoleMIOperator::me2 nan" << endl;
if( gsl_isinf(res) ) cout << "DipoleMIOperator::me2 inf" << endl;
return res;
}
double DipoleMIOperator::GammaQuark(const ParticleData& j, Energy2 sjk) const {
if ( j.mass() == ZERO )
return 0.;
// massive quark, last term see above!
// CF * (-log(mu2/sjk) + 1/2 log(mj2/mu2) - 2) + 3/2 CF * log(mu2/sjk)
return CF * ( 0.5*log(sqr(j.mass())/sjk) - 2. );
}
// TODO: kill
double DipoleMIOperator::GammaGluon() const {
// main contribution cancels with VjNS, only finite 1/eps remainder
return 0.;
}
// NOTE: no finite remainder of epsilon poles here.
double DipoleMIOperator::Vj(const ParticleData& j, const ParticleData& k,
Energy2 sjk, double kappa, bool mFSetEmpty) const {
double res = 0.;
Energy2 mj2 = sqr(j.mass()), mk2 = sqr(k.mass());
Energy2 Qjk2 = sjk + mj2 + mk2;
Energy Qjk = sqrt(Qjk2);
Energy mj = j.mass(), mk = k.mass();
double vjk = rootOfKallen(Qjk2,mj2,mk2) / sjk;
double rho = sqrt( abs(1.-vjk)/(1.+vjk) ); // abs() because for small mass 1.-vjk can get O(-1.e-16)
double rhoj = sqrt( ( 1. - vjk + 2.*mj2/Qjk2 / (1.-mj2/Qjk2-mk2/Qjk2) ) /
( 1. + vjk + 2.*mj2/Qjk2 / (1.-mj2/Qjk2-mk2/Qjk2) ) );
double rhok = sqrt( ( 1. - vjk + 2.*mk2/Qjk2 / (1.-mj2/Qjk2-mk2/Qjk2) ) /
( 1. + vjk + 2.*mk2/Qjk2 / (1.-mj2/Qjk2-mk2/Qjk2) ) );
ParticleData l = ( mj2 == ZERO ? k : j );
// S part (6.20)
// both masses zero
if( mj2 == ZERO && mk2 == ZERO );
// one mass zero
else if( mj2 == ZERO || mk2 == ZERO ) {
Energy2 m2 = sqr(l.mass());
res += -1./4.*sqr(log(m2/sjk)) - sqr(pi)/12. -
1./2.*log(m2/sjk)*log(sjk/Qjk2) - 1./2.*log(m2/Qjk2)*log(sjk/Qjk2);
}
// no mass zero
else if( mj2 != ZERO && mk2 != ZERO ) {
res += 1./vjk * ( -1./4.*sqr(log(rhoj*rhoj)) - 1./4.*sqr(log(rhok*rhok)) -
sqr(pi)/6. + ( rho==0. ? 0. : log(rho)*log(Qjk2/sjk) ) );
}
// NS part (6.21)-(6.26)
// V_q (j is quark)
// j is massive quark
if( mj2 != ZERO ) {
assert( abs(j.id()) < 7);
res += gammaQuark/CF * log(sjk/Qjk2); // iff j and/or k is massive quark (6.21),(6.22)
// k is massive quark (6.21)
if( mk2 != ZERO ) {
assert( abs(k.id()) < 7);
res += 1./vjk * ( ( rho==0. ? 0. : log(rho*rho)*log(1.+rho*rho) ) + 2.*gsl_sf_dilog(rho*rho) -
gsl_sf_dilog(1.-rhoj*rhoj) - gsl_sf_dilog(1.-rhok*rhok) - sqr(pi)/6. ) +
log((Qjk-mk)/Qjk) - 2.*log((sqr(Qjk-mk)-mj2)/Qjk2) - 2.*mj2/sjk*log(mj/(Qjk-mk)) -
mk/(Qjk-mk) + 2.*mk*(2.*mk-Qjk)/sjk + sqr(pi)/2.;
}
// k is massless parton (6.22)
else {
res += sqr(pi)/6. - gsl_sf_dilog(sjk/Qjk2) -
2.*log(sjk/Qjk2) - mj2/sjk*log(mj2/Qjk2);
}
}
// V_q / V_g (j is massless parton)
else {
// k is massless parton
if( mk == ZERO ) {
// only contribution if j is gluon
if( j.id() == ParticleID::g ) {
// sum over all quark flavours
if( !mFSetEmpty )
// TODO: make fmax depend on matrix element
for( int f=1; f< 6; ++f ) {
Energy2 mF2 = sqr( getParticleData(f)->mass() );
// only heavy quarks
if( mF2 == ZERO ) continue;
// sum only over quarks which meet special condition
if( sjk <= 4.*sqrt(mF2)*(sqrt(mF2)+mk) )
continue;
double rho1 = sqrt( 1. - 4.*mF2 / sqr(Qjk-mk) );
res += 2./3./CA * ( log((1.+rho1)/2.) - rho1/3.*(3.+sqr(rho1)) - 0.5*log(mF2/Qjk2) );
}
}
}
// k is massive quark
else {
assert( abs(k.id()) < 7);
// part common to j massless quark or gluon
res += sqr(pi)/6. - gsl_sf_dilog(sjk/Qjk2);
// j is massless (incoming) quark
if( abs(j.id()) < 7)
res += gammaQuark/CF * ( log(sjk/Qjk2) - 2.*log((Qjk-mk)/Qjk) - 2.*mk/(Qjk+mk) );
// j is gluon
else if( j.id() == ParticleID::g ) {
// part independent of other heavy quark flavours
res += gammaGluon/CA * ( log(sjk/Qjk2) - 2.*log((Qjk-mk)/Qjk) - 2.*mk/(Qjk+mk) ) +
(kappa-2./3.) * mk2/sjk * (1./CA*lastBorn()->nLight()-1.) * log(2.*mk/(Qjk+mk));
// part containing other heavy quark flavours
if( !mFSetEmpty )
// TODO: make fmax dependent on matrix element
for( int f=1; f< 6; ++f ) {
Energy2 mF2 = sqr( getParticleData(f)->mass() );
// only heavy quarks
if( mF2 == ZERO ) continue;
// sum only over quarks which meet special condition
if( sjk <= 4.*sqrt(mF2)*(sqrt(mF2)+mk) )
continue;
double rho1 = sqrt( 1. - 4.*mF2 / sqr(Qjk-mk) );
double rho2 = sqrt( 1. - 4.*mF2 / (Qjk2-mk2) );
res += 2./3./CA * ( log((Qjk-mk)/Qjk) + mk*rho1*rho1*rho1/(Qjk+mk) + log((1.+rho1)/2.) -
rho1/3.*(3.+sqr(rho1)) - 1./2.*log(mF2/Qjk2) ) +
1./CA * ( rho2*rho2*rho2*log((rho2-rho1)/(rho2+rho1)) - log((1.-rho1)/(1.+rho1)) -
8.*rho1*mF2/sjk );
}
}
}
}
return res;
}
void DipoleMIOperator::persistentOutput(PersistentOStream & os) const {
os << CA << CF << gammaQuark << gammaGluon << KQuark << KGluon;
}
void DipoleMIOperator::persistentInput(PersistentIStream & is, int) {
is >> CA >> CF >> gammaQuark >> gammaGluon >> KQuark >> KGluon;
}
// *** 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<DipoleMIOperator,MatchboxInsertionOperator>
describeHerwigDipoleMIOperator("Herwig::DipoleMIOperator", "HwMatchbox.so");
void DipoleMIOperator::Init() {
static ClassDocumentation<DipoleMIOperator> documentation
("DipoleMIOperator");
DipoleRepository::registerInsertionOperator<0,DipoleMIOperator>("MassiveIOperator");
}
diff --git a/MatrixElement/Matchbox/Makefile.am b/MatrixElement/Matchbox/Makefile.am
--- a/MatrixElement/Matchbox/Makefile.am
+++ b/MatrixElement/Matchbox/Makefile.am
@@ -1,23 +1,23 @@
SUBDIRS = \
Base Utility Phasespace \
Dipoles InsertionOperators Matching \
Builtin External Tests
if WANT_DIPOLE
pkglib_LTLIBRARIES = HwMatchbox.la
endif
-HwMatchbox_la_LDFLAGS = -module -version-info 2:0:0
+HwMatchbox_la_LDFLAGS = -module -version-info 3:0:0
HwMatchbox_la_LIBADD = \
Base/libHwMatchboxBase.la \
Utility/libHwMatchboxUtility.la \
Phasespace/libHwMatchboxPhasespace.la \
Dipoles/libHwMatchboxDipoles.la \
InsertionOperators/libHwMatchboxInsertionOperators.la \
Matching/libHwMatchboxMatching.la \
Builtin/Amplitudes/libHwMatchboxBuiltinAmplitudes.la \
External/BLHAGeneric/libHwMatchboxExternalBLHAGeneric.la \
Tests/libHwMatchboxTests.la
HwMatchbox_la_SOURCES = \
MatchboxFactory.h MatchboxFactory.fh MatchboxFactory.cc
diff --git a/MatrixElement/Matchbox/Utility/ColourBasis.cc b/MatrixElement/Matchbox/Utility/ColourBasis.cc
--- a/MatrixElement/Matchbox/Utility/ColourBasis.cc
+++ b/MatrixElement/Matchbox/Utility/ColourBasis.cc
@@ -1,1210 +1,1215 @@
// -*- C++ -*-
//
// ColourBasis.cc is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2012 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 ColourBasis class.
//
#include "ColourBasis.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Switch.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"
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/matrix_proxy.hpp>
#include <iterator>
using std::ostream_iterator;
#include "DiagramDrawer.h"
using namespace Herwig;
using boost::numeric::ublas::trans;
-using boost::numeric::ublas::conj;
+
+// default gcc on SLC6 confuses this with std::conj,
+// use explicit namespacing in the code instead
+//
+// using boost::numeric::ublas::conj;
+
using boost::numeric::ublas::row;
using boost::numeric::ublas::column;
using boost::numeric::ublas::prod;
ColourBasis::ColourBasis()
: theLargeN(false), theSearchPath("."), didRead(false), didWrite(false) {}
ColourBasis::~ColourBasis() {
for ( map<Ptr<Tree2toNDiagram>::tcptr,vector<ColourLines*> >::iterator cl =
theColourLineMap.begin(); cl != theColourLineMap.end(); ++cl ) {
for ( vector<ColourLines*>::iterator c = cl->second.begin();
c != cl->second.end(); ++c ) {
if ( *c )
delete *c;
}
}
theColourLineMap.clear();
}
// If needed, insert default implementations of virtual function defined
// in the InterfacedBase class here (using ThePEG-interfaced-impl in Emacs).
bool ColourBasis::colourConnected(const cPDVector& sub,
const vector<PDT::Colour>& basis,
const pair<int,bool>& i,
const pair<int,bool>& j,
size_t a) const {
// translate process to basis ids
map<cPDVector,map<size_t,size_t> >::const_iterator trans
= indexMap().find(sub);
assert(trans != indexMap().end());
int idColoured = i.second ? j.first : i.first;
idColoured = trans->second.find(idColoured)->second;
int idAntiColoured = i.second ? i.first : j.first;
idAntiColoured = trans->second.find(idAntiColoured)->second;
return colourConnected(basis,idColoured,idAntiColoured,a);
}
const string& ColourBasis::orderingString(const cPDVector& sub,
const map<size_t,size_t>& colourToAmplitude,
size_t tensorId) {
const vector<PDT::Colour>& basis = normalOrderedLegs(sub);
map<size_t,string>& orderings = theOrderingStringIdentifiers[basis][colourToAmplitude];
if ( orderings.empty() ) {
map<size_t,vector<vector<size_t> > > tensors =
basisList(basis);
for ( map<size_t,vector<vector<size_t> > >::const_iterator t =
tensors.begin(); t != tensors.end(); ++t ) {
ostringstream oid;
for ( vector<vector<size_t> >::const_iterator s = t->second.begin();
s != t->second.end(); ++s ) {
oid << "[";
for ( vector<size_t>::const_iterator l = s->begin();
l != s->end(); ++l ) {
map<size_t,size_t>::const_iterator trans =
colourToAmplitude.find(*l);
assert(trans != colourToAmplitude.end());
oid << trans->second << (l != --(s->end()) ? "," : "");
}
oid << "]";
}
orderings[t->first] = oid.str();
}
}
return orderings[tensorId];
}
const vector<vector<size_t> >& ColourBasis::ordering(const cPDVector& sub,
const map<size_t,size_t>& colourToAmplitude,
size_t tensorId) {
const vector<PDT::Colour>& basis = normalOrderedLegs(sub);
map<size_t,vector<vector<size_t> > >& orderings = theOrderingIdentifiers[basis][colourToAmplitude];
if ( orderings.empty() ) {
map<size_t,vector<vector<size_t> > > tensors =
basisList(basis);
for ( map<size_t,vector<vector<size_t> > >::const_iterator t =
tensors.begin(); t != tensors.end(); ++t ) {
orderings[t->first] = t->second;
}
}
return orderings[tensorId];
}
vector<PDT::Colour> ColourBasis::normalOrderMap(const cPDVector& sub) {
vector<PDT::Colour> allLegs = projectColour(sub);
vector<PDT::Colour> legs = normalOrder(allLegs);
if ( allLegs[0] == PDT::Colour3 )
allLegs[0] = PDT::Colour3bar;
else if ( allLegs[0] == PDT::Colour3bar )
allLegs[0] = PDT::Colour3;
if ( allLegs[1] == PDT::Colour3 )
allLegs[1] = PDT::Colour3bar;
else if ( allLegs[1] == PDT::Colour3bar )
allLegs[1] = PDT::Colour3;
if ( theIndexMap.find(sub) == theIndexMap.end() ) {
map<size_t,size_t> trans;
vector<PDT::Colour> checkLegs = legs;
size_t n = checkLegs.size();
for ( size_t i = 0; i < allLegs.size(); ++i ) {
size_t j = 0;
while ( checkLegs[j] != allLegs[i] ) {
++j; if ( j == n ) break;
}
if ( j == n ) continue;
trans[i] = j;
checkLegs[j] = PDT::ColourUndefined;
}
theIndexMap[sub] = trans;
}
return legs;
}
const vector<PDT::Colour>& ColourBasis::normalOrderedLegs(const cPDVector& sub) const {
static vector<PDT::Colour> empty;
map<cPDVector,vector<PDT::Colour> >::const_iterator n =
theNormalOrderedLegs.find(sub);
if ( n != theNormalOrderedLegs.end() )
return n->second;
return empty;
}
size_t ColourBasis::prepare(const cPDVector& sub,
bool noCorrelations) {
vector<PDT::Colour> legs = normalOrderMap(sub);
bool doPrepare = false;
if ( theNormalOrderedLegs.find(sub) == theNormalOrderedLegs.end() )
theNormalOrderedLegs[sub] = legs;
if ( theScalarProducts.find(legs) == theScalarProducts.end() )
doPrepare = true;
if ( doPrepare )
doPrepare = !readBasis(legs);
size_t dim = doPrepare ? prepareBasis(legs) : theScalarProducts[legs].size1();
if ( theCharges.find(legs) != theCharges.end() )
return dim;
if ( !doPrepare && noCorrelations )
return dim;
symmetric_matrix<double,upper>& sp =
theScalarProducts.insert(make_pair(legs,symmetric_matrix<double,upper>(dim,dim))).first->second;
for ( size_t a = 0; a < dim; ++a )
for ( size_t b = a; b < dim; ++b )
sp(a,b) = scalarProduct(a,b,legs);
if ( noCorrelations )
return dim;
vector<PDT::Colour> legsPlus = legs;
legsPlus.push_back(PDT::Colour8);
legsPlus = normalOrder(legsPlus);
bool doPreparePlus = theScalarProducts.find(legsPlus) == theScalarProducts.end();
size_t dimPlus = doPreparePlus ? prepareBasis(legsPlus) : theScalarProducts[legsPlus].size1();
symmetric_matrix<double,upper>& spPlus =
doPreparePlus ?
theScalarProducts.insert(make_pair(legsPlus,symmetric_matrix<double,upper>(dimPlus,dimPlus))).first->second :
theScalarProducts[legsPlus];
if ( doPreparePlus ) {
for ( size_t a = 0; a < dimPlus; ++a )
for ( size_t b = a; b < dimPlus; ++b )
spPlus(a,b) = scalarProduct(a,b,legsPlus);
}
typedef map<size_t,compressed_matrix<double> > cMap;
cMap& cm = theCharges.insert(make_pair(legs,cMap())).first->second;
typedef map<size_t,vector<pair<size_t,size_t> > > ccMap;
ccMap& ccm = theChargeNonZeros.insert(make_pair(legs,ccMap())).first->second;
tmp.resize(dimPlus,dim);
for ( size_t i = 0; i < legs.size(); ++i ) {
size_t nonZero = 0;
vector<pair<size_t,size_t> > nonZeros;
for ( size_t a = 0; a < dimPlus; ++a )
for ( size_t b = 0; b < dim; ++b ) {
tmp(a,b) = tMatrixElement(i,a,b,legsPlus,legs);
if ( tmp(a,b) != 0. ) {
++nonZero;
nonZeros.push_back(make_pair(a,b));
}
}
ccm.insert(make_pair(i,nonZeros));
compressed_matrix<double>& tm =
cm.insert(make_pair(i,compressed_matrix<double>(dimPlus,dim,nonZero))).first->second;
for ( size_t a = 0; a < dimPlus; ++a )
for ( size_t b = 0; b < dim; ++b ) {
if ( tmp(a,b) != 0. )
tm(a,b) = tmp(a,b);
}
}
map<pair<size_t,size_t>,symmetric_matrix<double,upper> >& xm = theCorrelators[legs];
for ( size_t i = 0; i < legs.size(); ++i )
for ( size_t j = i+1; j < legs.size(); ++j ) {
symmetric_matrix<double,upper>& mm =
xm.insert(make_pair(make_pair(i,j),symmetric_matrix<double,upper>(dim,dim))).first->second;
chargeProduct(cm[i],ccm[i],spPlus,cm[j],ccm[j],mm);
}
return dim;
}
void ColourBasis::chargeProduct(const compressed_matrix<double>& ti,
const vector<pair<size_t,size_t> >& tiNonZero,
const symmetric_matrix<double,upper>& X,
const compressed_matrix<double>& tj,
const vector<pair<size_t,size_t> >& tjNonZero,
symmetric_matrix<double,upper>& result) const {
for ( size_t i = 0; i < result.size1(); ++i )
for ( size_t j = i; j < result.size1(); ++j )
result(i,j) = 0.;
for ( vector<pair<size_t,size_t> >::const_iterator i = tiNonZero.begin();
i != tiNonZero.end(); ++i )
for ( vector<pair<size_t,size_t> >::const_iterator j = tjNonZero.begin();
j != tjNonZero.end(); ++j ) {
if ( j->second < i->second )
continue;
result(i->second,j->second) +=
ti(i->first,i->second)*tj(j->first,j->second)*X(i->first,j->first);
}
}
void ColourBasis::chargeProductAdd(const compressed_matrix<double>& ti,
const vector<pair<size_t,size_t> >& tiNonZero,
const matrix<Complex>& X,
const compressed_matrix<double>& tj,
const vector<pair<size_t,size_t> >& tjNonZero,
matrix<Complex>& result,
double factor) const {
for ( vector<pair<size_t,size_t> >::const_iterator i = tiNonZero.begin();
i != tiNonZero.end(); ++i )
for ( vector<pair<size_t,size_t> >::const_iterator j = tjNonZero.begin();
j != tjNonZero.end(); ++j ) {
result(i->first,j->first) += factor*
ti(i->first,i->second)*tj(j->first,j->second)*X(i->second,j->second);
}
}
string ColourBasis::cfstring(const list<list<pair<int,bool> > >& flow) {
ostringstream out("");
for ( list<list<pair<int,bool> > >::const_iterator line =
flow.begin(); line != flow.end(); ++line ) {
for ( list<pair<int,bool> >::const_iterator node =
line->begin(); node != line->end(); ++node ) {
out << (node->second ? "-" : "") << (node->first+1) << " ";
}
if ( line != --(flow.end()) )
out << ", ";
}
return out.str();
}
vector<string> ColourBasis::makeFlows(Ptr<Tree2toNDiagram>::tcptr diag,
size_t dim) const {
vector<string> res(dim);
list<list<list<pair<int,bool> > > > fdata =
colourFlows(diag);
cPDVector ext;
tcPDVector dext = diag->external();
copy(dext.begin(),dext.end(),back_inserter(ext));
vector<PDT::Colour> colouredLegs =
normalOrder(projectColour(ext));
for ( list<list<list<pair<int,bool> > > >::const_iterator flow =
fdata.begin(); flow != fdata.end(); ++flow ) {
for ( size_t i = 0; i < dim; ++i ) {
bool matches = true;
for ( list<list<pair<int,bool> > >::const_iterator line =
flow->begin(); line != flow->end(); ++line ) {
pair<int,bool> front(diag->externalId(line->front().first),line->front().second);
if ( front.first < 2 )
front.second = !front.second;
pair<int,bool> back(diag->externalId(line->back().first),line->back().second);
if ( back.first < 2 )
back.second = !back.second;
if ( !colourConnected(ext,colouredLegs,front,back,i) ) {
matches = false;
break;
}
}
if ( matches ) {
res[i] = cfstring(*flow);
}
}
}
bool gotone = false;
for ( vector<string>::const_iterator f = res.begin();
f != res.end(); ++f ) {
if ( *f != "" ) {
gotone = true;
break;
}
}
if ( !gotone ) {
generator()->log() << "warning no color flow found for diagram\n";
DiagramDrawer::drawDiag(generator()->log(),*diag);
}
return res;
}
size_t ColourBasis::prepare(const MEBase::DiagramVector& diags,
bool noCorrelations) {
size_t dim = 0;
for ( MEBase::DiagramVector::const_iterator d = diags.begin();
d != diags.end(); ++d ) {
Ptr<Tree2toNDiagram>::tcptr dd = dynamic_ptr_cast<Ptr<Tree2toNDiagram>::ptr>(*d);
assert(dd);
dim = prepare(dd->partons(),noCorrelations);
if ( !haveColourFlows() || theFlowMap.find(dd) != theFlowMap.end() )
continue;
theFlowMap[dd] = makeFlows(dd,dim);
}
return dim;
}
bool matchEnd(int a, pair<int,bool> b,
Ptr<Tree2toNDiagram>::tcptr diag) {
if ( a != b.first )
return false;
if ( b.first != diag->nSpace()-1 ) {
return
!b.second ?
diag->allPartons()[b.first]->hasColour() :
diag->allPartons()[b.first]->hasAntiColour();
} else {
return
!b.second ?
diag->allPartons()[b.first]->hasAntiColour() :
diag->allPartons()[b.first]->hasColour();
}
return false;
}
bool findPath(pair<int,bool> a, pair<int,bool> b,
Ptr<Tree2toNDiagram>::tcptr diag,
list<pair<int,bool> >& path,
bool backward) {
assert(a.first==0 ? !backward : true);
if ( path.empty() )
path.push_back(a);
if ( !backward ) {
if ( diag->children(a.first).first == -1 )
return matchEnd(a.first,b,diag);
pair<int,int> children = diag->children(a.first);
bool cc = (children.first == diag->nSpace()-1);
if ( diag->allPartons()[children.first]->coloured() )
if ( !cc ?
(!a.second ?
diag->allPartons()[children.first]->hasColour() :
diag->allPartons()[children.first]->hasAntiColour()) :
(!a.second ?
diag->allPartons()[children.first]->hasAntiColour() :
diag->allPartons()[children.first]->hasColour()) ) {
pair<int,bool> next(children.first,a.second);
path.push_back(next);
if ( !findPath(next,b,diag,path,false) ) {
path.pop_back();
} else return true;
}
cc = (children.second == diag->nSpace()-1);
if ( diag->allPartons()[children.second]->coloured() )
if ( !cc ?
(!a.second ?
diag->allPartons()[children.second]->hasColour() :
diag->allPartons()[children.second]->hasAntiColour()) :
(!a.second ?
diag->allPartons()[children.second]->hasAntiColour() :
diag->allPartons()[children.second]->hasColour()) ) {
pair<int,bool> next(children.second,a.second);
path.push_back(next);
if ( !findPath(next,b,diag,path,false) ) {
path.pop_back();
} else return true;
}
if ( path.size() == 1 )
path.pop_back();
return false;
} else {
int parent = diag->parent(a.first);
pair<int,int> neighbours = diag->children(parent);
int neighbour = a.first == neighbours.first ? neighbours.second : neighbours.first;
if ( matchEnd(parent,b,diag) ) {
path.push_back(b);
return true;
}
if ( matchEnd(neighbour,b,diag) ) {
path.push_back(b);
return true;
}
if ( diag->allPartons()[neighbour]->coloured() )
if ( a.second ?
diag->allPartons()[neighbour]->hasColour() :
diag->allPartons()[neighbour]->hasAntiColour() ) {
pair<int,bool> next(neighbour,!a.second);
path.push_back(next);
if ( !findPath(next,b,diag,path,false) ) {
path.pop_back();
} else return true;
}
if ( parent == 0 ) {
if ( path.size() == 1 )
path.pop_back();
return false;
}
if ( diag->allPartons()[parent]->coloured() )
if ( !a.second ?
diag->allPartons()[parent]->hasColour() :
diag->allPartons()[parent]->hasAntiColour() ) {
pair<int,bool> next(parent,a.second);
path.push_back(next);
if ( !findPath(next,b,diag,path,true) ) {
path.pop_back();
} else return true;
}
if ( path.size() == 1 )
path.pop_back();
return false;
}
return false;
}
list<pair<int,bool> > ColourBasis::colouredPath(pair<int,bool> a, pair<int,bool> b,
Ptr<Tree2toNDiagram>::tcptr diag) {
list<pair<int,bool> > res;
if ( a.first == b.first )
return res;
bool aIn = (a.first < 2);
bool bIn = (b.first < 2);
if ( (aIn && bIn) || (!aIn && !bIn) )
if ( (a.second && b.second) ||
(!a.second && !b.second) )
return res;
if ( (aIn && !bIn) || (!aIn && bIn) )
if ( (!a.second && b.second) ||
(a.second && !b.second) )
return res;
if ( a.first > b.first )
swap(a,b);
a.first = diag->diagramId(a.first);
b.first = diag->diagramId(b.first);
if ( a.first == diag->nSpace()-1 )
a.second = !a.second;
if ( b.first == diag->nSpace()-1 )
b.second = !b.second;
if ( !findPath(a,b,diag,res,a.first != 0) )
return res;
if ( b.first == diag->nSpace()-1 ) {
res.back().second = !res.back().second;
}
if ( a.first == diag->nSpace()-1 ) {
res.front().second = !res.front().second;
}
return res;
}
list<list<list<pair<int,bool> > > >
ColourBasis::colourFlows(Ptr<Tree2toNDiagram>::tcptr diag) {
vector<pair<int,bool> > connectSource;
vector<pair<int,bool> > connectSink;
for ( size_t i = 0; i != diag->partons().size(); ++i ) {
if ( i < 2 && diag->partons()[i]->hasAntiColour() )
connectSource.push_back(make_pair(i,true));
if ( i < 2 && diag->partons()[i]->hasColour() )
connectSink.push_back(make_pair(i,false));
if ( i > 1 && diag->partons()[i]->hasColour() )
connectSource.push_back(make_pair(i,false));
if ( i > 1 && diag->partons()[i]->hasAntiColour() )
connectSink.push_back(make_pair(i,true));
}
assert(connectSource.size() == connectSink.size());
list<list<list<pair<int,bool> > > > ret;
do {
vector<pair<int,bool> >::iterator source =
connectSource.begin();
vector<pair<int,bool> >::iterator sink =
connectSink.begin();
list<list<pair<int,bool> > > res;
for ( ; source != connectSource.end(); ++source, ++sink ) {
if ( source->first == sink->first ) {
res.clear();
break;
}
list<pair<int,bool> > line =
colouredPath(*source,*sink,diag);
if ( line.empty() ) {
res.clear();
break;
}
res.push_back(line);
}
if ( !res.empty() ) {
// check, if all dressed properly
vector<pair<int,int> > dressed((*diag).allPartons().size(),make_pair(0,0));
for ( size_t p = 0; p < diag->allPartons().size(); ++p ) {
if ( diag->allPartons()[p]->hasColour() &&
!diag->allPartons()[p]->hasAntiColour() )
dressed[p].first = 1;
if ( diag->allPartons()[p]->hasAntiColour() &&
!diag->allPartons()[p]->hasColour() )
dressed[p].second = 1;
if ( diag->allPartons()[p]->hasAntiColour() &&
diag->allPartons()[p]->hasColour() ) {
dressed[p].first = 1; dressed[p].second = 1;
}
}
for ( list<list<pair<int,bool> > >::const_iterator l = res.begin();
l != res.end(); ++l ) {
for ( list<pair<int,bool> >::const_iterator n = l->begin();
n != l->end(); ++n ) {
if ( !(n->second) )
dressed[n->first].first -= 1;
else
dressed[n->first].second -= 1;
}
}
for ( vector<pair<int,int> >::const_iterator d = dressed.begin();
d != dressed.end(); ++d ) {
if ( d->first != 0 || d->second != 0 ) {
res.clear();
break;
}
}
if ( !res.empty() )
ret.push_back(res);
}
} while ( std::next_permutation(connectSink.begin(),connectSink.end()) );
return ret;
}
void ColourBasis::updateColourLines(Ptr<Tree2toNDiagram>::tcptr dd) {
map<Ptr<Tree2toNDiagram>::tcptr,vector<string> >::const_iterator cl =
theFlowMap.find(dd);
assert(cl != theFlowMap.end());
vector<ColourLines*> clines(cl->second.size());
for ( size_t k = 0; k < cl->second.size(); ++k ) {
if ( cl->second[k] == "" ) {
clines[k] = 0;
continue;
}
clines[k] = new ColourLines(cl->second[k]);
}
theColourLineMap[cl->first] = clines;
}
map<Ptr<Tree2toNDiagram>::tcptr,vector<ColourLines*> >&
ColourBasis::colourLineMap() {
if ( !theColourLineMap.empty() )
return theColourLineMap;
for ( map<Ptr<Tree2toNDiagram>::tcptr,vector<string> >::const_iterator cl =
theFlowMap.begin(); cl != theFlowMap.end(); ++cl ) {
vector<ColourLines*> clines(cl->second.size());
for ( size_t k = 0; k < cl->second.size(); ++k ) {
if ( cl->second[k] == "" ) {
clines[k] = 0;
continue;
}
clines[k] = new ColourLines(cl->second[k]);
}
theColourLineMap[cl->first] = clines;
}
return theColourLineMap;
}
Selector<const ColourLines *> ColourBasis::colourGeometries(tcDiagPtr diag,
const map<vector<int>,CVector>& amps) {
Ptr<Tree2toNDiagram>::tcptr dd =
dynamic_ptr_cast<Ptr<Tree2toNDiagram>::tcptr>(diag);
assert(dd && theFlowMap.find(dd) != theFlowMap.end());
map<Ptr<Tree2toNDiagram>::tcptr,vector<ColourLines*> >::const_iterator colit =
colourLineMap().find(dd);
if ( colit == colourLineMap().end() )
updateColourLines(dd);
colit = colourLineMap().find(dd);
const vector<ColourLines*>& cl = colit->second;
Selector<const ColourLines *> sel;
size_t dim = amps.begin()->second.size();
assert(dim == cl.size());
double w = 0.;
for ( size_t i = 0; i < dim; ++i ) {
if ( !cl[i] )
continue;
w = 0.;
for ( map<vector<int>,CVector>::const_iterator a = amps.begin();
a != amps.end(); ++a )
w += real(conj((a->second)(i))*((a->second)(i)));
if ( w > 0. )
sel.insert(w,cl[i]);
}
assert(!sel.empty());
return sel;
}
const symmetric_matrix<double,upper>& ColourBasis::scalarProducts(const cPDVector& sub) const {
map<cPDVector,vector<PDT::Colour> >::const_iterator lit =
theNormalOrderedLegs.find(sub);
assert(lit != theNormalOrderedLegs.end());
ScalarProductMap::const_iterator spit =
theScalarProducts.find(lit->second);
assert(spit != theScalarProducts.end());
return spit->second;
}
const compressed_matrix<double>& ColourBasis::charge(const cPDVector& sub, size_t iIn) const {
map<cPDVector,vector<PDT::Colour> >::const_iterator lit =
theNormalOrderedLegs.find(sub);
assert(lit != theNormalOrderedLegs.end());
ChargeMap::const_iterator ct =
theCharges.find(lit->second);
assert(ct != theCharges.end());
map<cPDVector,map<size_t,size_t> >::const_iterator trans
= theIndexMap.find(sub);
assert(trans != theIndexMap.end());
size_t i = trans->second.find(iIn)->second;
map<size_t,compressed_matrix<double> >::const_iterator cit
= ct->second.find(i);
assert(cit != ct->second.end());
return cit->second;
}
const vector<pair<size_t,size_t> >& ColourBasis::chargeNonZero(const cPDVector& sub, size_t iIn) const {
map<cPDVector,vector<PDT::Colour> >::const_iterator lit =
theNormalOrderedLegs.find(sub);
assert(lit != theNormalOrderedLegs.end());
ChargeNonZeroMap::const_iterator ct =
theChargeNonZeros.find(lit->second);
assert(ct != theChargeNonZeros.end());
map<cPDVector,map<size_t,size_t> >::const_iterator trans
= theIndexMap.find(sub);
assert(trans != theIndexMap.end());
size_t i = trans->second.find(iIn)->second;
map<size_t,vector<pair<size_t,size_t> > >::const_iterator cit
= ct->second.find(i);
assert(cit != ct->second.end());
return cit->second;
}
const symmetric_matrix<double,upper>& ColourBasis::correlator(const cPDVector& sub,
const pair<size_t,size_t>& ijIn) const {
map<cPDVector,vector<PDT::Colour> >::const_iterator lit =
theNormalOrderedLegs.find(sub);
assert(lit != theNormalOrderedLegs.end());
CorrelatorMap::const_iterator cit =
theCorrelators.find(lit->second);
assert(cit != theCorrelators.end());
map<cPDVector,map<size_t,size_t> >::const_iterator trans
= theIndexMap.find(sub);
assert(trans != theIndexMap.end());
pair<size_t,size_t> ij(trans->second.find(ijIn.first)->second,
trans->second.find(ijIn.second)->second);
if ( ij.first > ij.second )
swap(ij.first,ij.second);
map<pair<size_t,size_t>,symmetric_matrix<double,upper> >::const_iterator cijit
= cit->second.find(ij);
assert(cijit != cit->second.end());
return cijit->second;
}
double ColourBasis::me2(const cPDVector& sub,
const map<vector<int>,CVector>& amps) const {
const symmetric_matrix<double,upper>& sp = scalarProducts(sub);
double res = 0.;
for ( map<vector<int>,CVector>::const_iterator a = amps.begin();
a != amps.end(); ++a ) {
- res += real(inner_prod(conj(a->second),prod(sp,a->second)));
+ res += real(inner_prod(boost::numeric::ublas::conj(a->second),prod(sp,a->second)));
}
return res;
}
double ColourBasis::interference(const cPDVector& sub,
const map<vector<int>,CVector>& amps1,
const map<vector<int>,CVector>& amps2) const {
const symmetric_matrix<double,upper>& sp = scalarProducts(sub);
double res = 0.;
map<vector<int>,CVector>::const_iterator a = amps1.begin();
map<vector<int>,CVector>::const_iterator b = amps2.begin();
for ( ; a != amps1.end(); ++a, ++b ) {
assert(a->first == b->first);
- res += 2.*real(inner_prod(conj(a->second),prod(sp,b->second)));
+ res += 2.*real(inner_prod(boost::numeric::ublas::conj(a->second),prod(sp,b->second)));
}
assert(!isnan(res));
return res;
}
double ColourBasis::colourCorrelatedME2(const pair<size_t,size_t>& ij,
const cPDVector& sub,
const map<vector<int>,CVector>& amps) const {
const symmetric_matrix<double,upper>& cij = correlator(sub,ij);
double res = 0.;
for ( map<vector<int>,CVector>::const_iterator a = amps.begin();
a != amps.end(); ++a ) {
- res += real(inner_prod(conj(a->second),prod(cij,a->second)));
+ res += real(inner_prod(boost::numeric::ublas::conj(a->second),prod(cij,a->second)));
}
return res;
}
Complex ColourBasis::interference(const cPDVector& sub,
const CVector& left,
const CVector& right) const {
const symmetric_matrix<double,upper>& sp = scalarProducts(sub);
- return inner_prod(conj(left),prod(sp,right));
+ return inner_prod(boost::numeric::ublas::conj(left),prod(sp,right));
}
Complex ColourBasis::colourCorrelatedInterference(const pair<size_t,size_t>& ij,
const cPDVector& sub,
const CVector& left,
const CVector& right) const {
const symmetric_matrix<double,upper>& cij = correlator(sub,ij);
- return inner_prod(conj(left),prod(cij,right));
+ return inner_prod(boost::numeric::ublas::conj(left),prod(cij,right));
}
double ColourBasis::me2(const cPDVector& sub,
const matrix<Complex>& amp) const {
const symmetric_matrix<double,upper>& sp = scalarProducts(sub);
double tr = 0;
size_t n = amp.size1();
for ( size_t i = 0; i < n; ++i ) {
tr += real(inner_prod(row(sp,i),column(amp,i)));
}
return tr;
}
double ColourBasis::colourCorrelatedME2(const pair<size_t,size_t>& ij,
const cPDVector& sub,
const matrix<Complex>& amp) const {
const symmetric_matrix<double,upper>& cij = correlator(sub,ij);
double tr = 0;
size_t n = amp.size1();
for ( size_t i = 0; i < n; ++i ) {
tr += real(inner_prod(row(cij,i),column(amp,i)));
}
return tr;
}
struct pickColour {
PDT::Colour operator()(tcPDPtr p) const {
return p->iColour();
}
};
vector<PDT::Colour> ColourBasis::projectColour(const cPDVector& sub) const {
vector<PDT::Colour> res(sub.size());
transform(sub.begin(),sub.end(),res.begin(),pickColour());
return res;
}
vector<PDT::Colour> ColourBasis::normalOrder(const vector<PDT::Colour>& legs) const {
vector<PDT::Colour> crosslegs = legs;
if ( crosslegs[0] == PDT::Colour3 )
crosslegs[0] = PDT::Colour3bar;
else if ( crosslegs[0] == PDT::Colour3bar )
crosslegs[0] = PDT::Colour3;
if ( crosslegs[1] == PDT::Colour3 )
crosslegs[1] = PDT::Colour3bar;
else if ( crosslegs[1] == PDT::Colour3bar )
crosslegs[1] = PDT::Colour3;
int n3 = count_if(crosslegs.begin(),crosslegs.end(),matchRep(PDT::Colour3));
int n8 = count_if(crosslegs.begin(),crosslegs.end(),matchRep(PDT::Colour8));
vector<PDT::Colour> ordered(2*n3+n8,PDT::Colour8);
int i = 0;
while ( i < 2*n3 ) {
ordered[i] = PDT::Colour3;
ordered[i+1] = PDT::Colour3bar;
i+=2;
}
return ordered;
}
string ColourBasis::file(const vector<PDT::Colour>& sub) const {
string res = "";
for ( vector<PDT::Colour>::const_iterator lit = sub.begin();
lit != sub.end(); ++lit ) {
if ( *lit == PDT::Colour3 )
res += "3";
if ( *lit == PDT::Colour3bar )
res += "3bar";
if ( *lit == PDT::Colour8 )
res += "8";
}
if ( largeN() )
res += "largeN";
return res;
}
void ColourBasis::writeBasis(const string& prefix) const {
if ( didWrite )
return;
set<vector<PDT::Colour> > legs;
for ( map<cPDVector,vector<PDT::Colour> >::const_iterator lit
= theNormalOrderedLegs.begin(); lit != theNormalOrderedLegs.end(); ++lit ) {
legs.insert(lit->second);
}
string searchPath = theSearchPath;
if ( searchPath != "" )
if ( *(--searchPath.end()) != '/' )
searchPath += "/";
for ( set<vector<PDT::Colour> >::const_iterator known = legs.begin();
known != legs.end(); ++known ) {
string fname = searchPath + prefix + file(*known) + ".cdat";
ifstream check(fname.c_str());
if ( check ) continue;
ofstream out(fname.c_str());
if ( !out )
throw Exception() << "ColourBasis failed to open "
<< fname << " for storing colour basis information."
<< Exception::abortnow;
out << setprecision(18);
const symmetric_matrix<double,upper>& sp =
theScalarProducts.find(*known)->second;
write(sp,out);
if ( theCharges.find(*known) != theCharges.end() ) {
out << "#charges\n";
const map<size_t,compressed_matrix<double> >& tm =
theCharges.find(*known)->second;
const map<size_t,vector<pair<size_t,size_t> > >& tc =
theChargeNonZeros.find(*known)->second;
map<size_t,vector<pair<size_t,size_t> > >::const_iterator kc =
tc.begin();
for ( map<size_t,compressed_matrix<double> >::const_iterator k = tm.begin();
k != tm.end(); ++k, ++kc ) {
out << k->first << "\n";
write(k->second,out,kc->second);
}
const map<pair<size_t,size_t>,symmetric_matrix<double,upper> >& cm =
theCorrelators.find(*known)->second;
for ( map<pair<size_t,size_t>,symmetric_matrix<double,upper> >::const_iterator k =
cm.begin(); k != cm.end(); ++k ) {
out << k->first.first << "\n" << k->first.second << "\n";
write(k->second,out);
}
} else {
out << "#nocharges\n";
}
out << flush;
}
didWrite = true;
}
bool ColourBasis::readBasis(const vector<PDT::Colour>& legs) {
string searchPath = theSearchPath;
if ( searchPath != "" )
if ( *(--searchPath.end()) != '/' )
searchPath += "/";
string fname = searchPath + file(legs) + ".cdat";
ifstream in(fname.c_str());
if ( !in )
return false;
read(theScalarProducts[legs],in);
string tag; in >> tag;
if ( tag != "#nocharges" ) {
for ( size_t k = 0; k < legs.size(); ++k ) {
size_t i; in >> i;
read(theCharges[legs][i],in,theChargeNonZeros[legs][i]);
}
for ( size_t k = 0; k < legs.size()*(legs.size()-1)/2; ++k ) {
size_t i,j; in >> i >> j;
read(theCorrelators[legs][make_pair(i,j)],in);
}
}
readBasisDetails(legs);
return true;
}
void ColourBasis::readBasis() {
if ( didRead )
return;
string searchPath = theSearchPath;
if ( searchPath != "" )
if ( *(--searchPath.end()) != '/' )
searchPath += "/";
set<vector<PDT::Colour> > legs;
for ( map<cPDVector,vector<PDT::Colour> >::const_iterator lit
= theNormalOrderedLegs.begin(); lit != theNormalOrderedLegs.end(); ++lit )
legs.insert(lit->second);
for ( set<vector<PDT::Colour> >::const_iterator known = legs.begin();
known != legs.end(); ++known ) {
if ( theScalarProducts.find(*known) != theScalarProducts.end() )
continue;
string fname = searchPath + file(*known) + ".cdat";
if ( !readBasis(*known) )
throw Exception() << "ColourBasis failed to open "
<< fname << " for reading colour basis information."
<< Exception::abortnow;
}
didRead = true;
}
void ColourBasis::write(const symmetric_matrix<double,upper>& m, ostream& os) const {
os << m.size1() << "\n";
for ( size_t i = 0; i < m.size1(); ++i )
for ( size_t j = i; j < m.size1(); ++j )
os << m(i,j) << "\n";
os << flush;
}
void ColourBasis::read(symmetric_matrix<double,upper>& m, istream& is) {
size_t s; is >> s;
m.resize(s);
for ( size_t i = 0; i < m.size1(); ++i )
for ( size_t j = i; j < m.size1(); ++j )
is >> m(i,j);
}
void ColourBasis::write(const compressed_matrix<double>& m, ostream& os,
const vector<pair<size_t,size_t> >& nonZeros) const {
os << nonZeros.size() << "\n"
<< m.size1() << "\n"
<< m.size2() << "\n";
for ( vector<pair<size_t,size_t> >::const_iterator nz = nonZeros.begin();
nz != nonZeros.end(); ++nz )
os << nz->first << "\n" << nz->second << "\n"
<< m(nz->first,nz->second) << "\n";
os << flush;
}
void ColourBasis::read(compressed_matrix<double>& m, istream& is,
vector<pair<size_t,size_t> >& nonZeros) {
size_t nonZero, size1, size2;
is >> nonZero >> size1 >> size2;
nonZeros.resize(nonZero);
m = compressed_matrix<double>(size1,size2,nonZero);
for ( size_t k = 0; k < nonZero; ++k ) {
size_t i,j; double val;
is >> i >> j >> val;
nonZeros[k] = make_pair(i,j);
m(i,j) = val;
}
}
void ColourBasis::doinit() {
HandlerBase::doinit();
readBasis();
}
void ColourBasis::dofinish() {
HandlerBase::dofinish();
writeBasis();
}
void ColourBasis::doinitrun() {
HandlerBase::doinitrun();
readBasis();
}
void ColourBasis::persistentOutput(PersistentOStream & os) const {
os << theLargeN << theSearchPath << theNormalOrderedLegs
<< theIndexMap << theFlowMap << theOrderingStringIdentifiers << theOrderingIdentifiers;
writeBasis();
}
void ColourBasis::persistentInput(PersistentIStream & is, int) {
is >> theLargeN >> theSearchPath >> theNormalOrderedLegs
>> theIndexMap >> theFlowMap >> theOrderingStringIdentifiers >> theOrderingIdentifiers;
readBasis();
}
// *** 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<ColourBasis,HandlerBase>
describeColourBasis("Herwig::ColourBasis", "HwMatchbox.so");
void ColourBasis::Init() {
static ClassDocumentation<ColourBasis> documentation
("ColourBasis is an interface to a colour basis "
"implementation.");
static Parameter<ColourBasis,string> interfaceSearchPath
("SearchPath",
"Set the search path for pre-computed colour basis data.",
&ColourBasis::theSearchPath, ".",
false, false);
static Switch<ColourBasis,bool> interfaceLargeN
("LargeN",
"Switch on or off large-N evaluation.",
&ColourBasis::theLargeN, false, false, false);
static SwitchOption interfaceLargeNOn
(interfaceLargeN,
"On",
"Work in N=infinity",
true);
static SwitchOption interfaceLargeNOff
(interfaceLargeN,
"Off",
"Work in N=3",
false);
}
diff --git a/MatrixElement/Powheg/Makefile.am b/MatrixElement/Powheg/Makefile.am
--- a/MatrixElement/Powheg/Makefile.am
+++ b/MatrixElement/Powheg/Makefile.am
@@ -1,15 +1,15 @@
pkglib_LTLIBRARIES = HwPowhegMEHadron.la HwPowhegMELepton.la
-HwPowhegMEHadron_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 5:1:1
+HwPowhegMEHadron_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 6:0:0
HwPowhegMEHadron_la_SOURCES = \
MEqq2gZ2ffPowheg.cc MEqq2gZ2ffPowheg.h \
MEqq2W2ffPowheg.cc MEqq2W2ffPowheg.h \
MEPP2HiggsPowheg.cc MEPP2HiggsPowheg.h \
MEPP2WHPowheg.cc MEPP2WHPowheg.h \
MEPP2ZHPowheg.cc MEPP2ZHPowheg.h \
MEPP2VVPowheg.cc MEPP2VVPowheg.h \
VVKinematics.cc VVKinematics.h \
MEPP2HiggsVBFPowheg.h MEPP2HiggsVBFPowheg.cc
HwPowhegMELepton_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 1:0:0
HwPowhegMELepton_la_SOURCES = \
MEee2gZ2qqPowheg.cc MEee2gZ2qqPowheg.h
diff --git a/Models/Feynrules/exampleInputs/MGv5_Model.pdf b/Models/Feynrules/exampleInputs/MGv5_Model.pdf
deleted file mode 100644
index 5da5b8b01b53b51ecb9353f72c9be4350725d96e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
diff --git a/Models/General/ModelGenerator.cc b/Models/General/ModelGenerator.cc
--- a/Models/General/ModelGenerator.cc
+++ b/Models/General/ModelGenerator.cc
@@ -1,523 +1,523 @@
// -*- C++ -*-
//
// ModelGenerator.cc is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2011 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 ModelGenerator class.
//
#include "ModelGenerator.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Reference.h"
#include "ThePEG/Interface/RefVector.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/DecayMode.h"
#include "ThePEG/Repository/CurrentGenerator.h"
#include "BSMWidthGenerator.h"
#include "Herwig++/PDT/GenericMassGenerator.h"
#include "Herwig++/Decay/DecayIntegrator.h"
#include "ThePEG/Repository/BaseRepository.h"
using namespace Herwig;
IBPtr ModelGenerator::clone() const {
return new_ptr(*this);
}
IBPtr ModelGenerator::fullclone() const {
return new_ptr(*this);
}
void ModelGenerator::persistentOutput(PersistentOStream & os) const {
os << hardProcessConstructors_ << _theDecayConstructor << particles_
<< offshell_ << Offsel_ << BRnorm_ << twoBodyOnly_ << howOffShell_
<< Npoints_ << Iorder_ << BWshape_ << brMin_ << decayOutput_;
}
void ModelGenerator::persistentInput(PersistentIStream & is, int) {
is >> hardProcessConstructors_ >> _theDecayConstructor >> particles_
>> offshell_ >> Offsel_ >> BRnorm_ >> twoBodyOnly_ >> howOffShell_
>> Npoints_ >> Iorder_ >> BWshape_ >> brMin_ >> decayOutput_;
}
ClassDescription<ModelGenerator> ModelGenerator::initModelGenerator;
// Definition of the static class description member.
void ModelGenerator::Init() {
static ClassDocumentation<ModelGenerator> documentation
("This class controls the the use of BSM physics.",
"BSM physics was produced using the algorithm of "
"\\cite{Gigg:2007cr,Gigg:2008yc}",
"\\bibitem{Gigg:2007cr} M.~Gigg and P.~Richardson, \n"
"Eur.\\ Phys.\\ J.\\ C {\\bf 51} (2007) 989.\n"
"%%CITATION = EPHJA,C51,989;%%\n"
" %\\cite{Gigg:2008yc}\n"
"\\bibitem{Gigg:2008yc}\n"
" M.~A.~Gigg and P.~Richardson,\n"
" %``Simulation of Finite Width Effects in Physics Beyond the Standard Model,''\n"
" arXiv:0805.3037 [hep-ph].\n"
" %%CITATION = ARXIV:0805.3037;%%\n"
);
static RefVector<ModelGenerator,HardProcessConstructor>
interfaceHardProcessConstructors
("HardProcessConstructors",
"The objects to construct hard processes",
&ModelGenerator::hardProcessConstructors_, -1,
false, false, true, false, false);
static Reference<ModelGenerator,Herwig::DecayConstructor>
interfaceDecayConstructor
("DecayConstructor",
"Pointer to DecayConstructor helper class",
&ModelGenerator::_theDecayConstructor, false, false, true, false);
static RefVector<ModelGenerator,ThePEG::ParticleData> interfaceModelParticles
("DecayParticles",
"ParticleData pointers to the particles requiring spin correlation "
"decayers. If decay modes do not exist they will also be created.",
&ModelGenerator::particles_, -1, false, false, true, false);
static RefVector<ModelGenerator,ParticleData> interfaceOffshell
("Offshell",
"The particles to treat as off-shell",
&ModelGenerator::offshell_, -1, false, false, true, false);
static Switch<ModelGenerator,int> interfaceWhichOffshell
("WhichOffshell",
"A switch to determine which particles to create mass and width "
"generators for.",
&ModelGenerator::Offsel_, 0, false, false);
static SwitchOption interfaceWhichOffshellSelected
(interfaceWhichOffshell,
"Selected",
"Only create mass and width generators for the particles specified",
0);
static SwitchOption interfaceWhichOffshellAll
(interfaceWhichOffshell,
"All",
"Treat all particles specified in the DecayParticles "
"list as off-shell",
1);
static Switch<ModelGenerator,bool> interfaceBRNormalize
("BRNormalize",
"Whether to normalize the partial widths to BR*total width for an "
"on-shell particle",
&ModelGenerator::BRnorm_, true, false, false);
static SwitchOption interfaceBRNormalizeNormalize
(interfaceBRNormalize,
"Yes",
"Normalize the partial widths",
true);
static SwitchOption interfaceBRNormalizeNoNormalize
(interfaceBRNormalize,
"No",
"Do not normalize the partial widths",
false);
static Parameter<ModelGenerator,int> interfacePoints
("InterpolationPoints",
"Number of points to use for interpolation tables when needed",
&ModelGenerator::Npoints_, 10, 5, 1000,
false, false, true);
static Parameter<ModelGenerator,unsigned int>
interfaceInterpolationOrder
("InterpolationOrder", "The interpolation order for the tables",
&ModelGenerator::Iorder_, 1, 1, 5,
false, false, Interface::limited);
static Switch<ModelGenerator,int> interfaceBreitWignerShape
("BreitWignerShape",
"Controls the shape of the mass distribution generated",
&ModelGenerator::BWshape_, 0, false, false);
static SwitchOption interfaceBreitWignerShapeDefault
(interfaceBreitWignerShape,
"Default",
"Running width with q in numerator and denominator width factor",
0);
static SwitchOption interfaceBreitWignerShapeFixedWidth
(interfaceBreitWignerShape,
"FixedWidth",
"Use a fixed width",
1);
static SwitchOption interfaceBreitWignerShapeNoq
(interfaceBreitWignerShape,
"Noq",
"Use M rather than q in the numerator and denominator width factor",
2);
static SwitchOption interfaceBreitWignerShapeNoNumerator
(interfaceBreitWignerShape,
"NoNumerator",
"Neglect the numerator factors",
3);
static Switch<ModelGenerator,bool> interfaceTwoBodyOnly
("TwoBodyOnly",
"Whether to use only two-body or all modes in the running width calculation",
&ModelGenerator::twoBodyOnly_, false, false, false);
static SwitchOption interfaceTwoBodyOnlyYes
(interfaceTwoBodyOnly,
"Yes",
"Only use two-body modes",
true);
static SwitchOption interfaceTwoBodyOnlyNo
(interfaceTwoBodyOnly,
"No",
"Use all modes",
false);
static Parameter<ModelGenerator,double> interfaceMinimumBR
("MinimumBR",
"The minimum branching fraction to include",
&ModelGenerator::brMin_, 1e-6, 0.0, 1.0,
false, false, Interface::limited);
static Switch<ModelGenerator,unsigned int> interfaceDecayOutput
("DecayOutput",
"Option to control the output of the decay mode information",
&ModelGenerator::decayOutput_, 1, false, false);
static SwitchOption interfaceDecayOutputNone
(interfaceDecayOutput,
"None",
"No output",
0);
static SwitchOption interfaceDecayOutputPlain
(interfaceDecayOutput,
"Plain",
"Default plain text output",
1);
static SwitchOption interfaceDecayOutputSLHA
(interfaceDecayOutput,
"SLHA",
"Output in the Susy Les Houches Accord format",
2);
static Parameter<ModelGenerator,double> interfaceMinimumWidthFraction
("MinimumWidthFraction",
"Minimum fraction of the particle's mass the width can be"
" for the off-shell treatment.",
&ModelGenerator::minWidth_, 1e-6, 1e-15, 1.,
false, false, Interface::limited);
- static Parameter<ModelGenerator,double> interfaceHowMucchOffShell
- ("HowMucchOffShell",
+ static Parameter<ModelGenerator,double> interfaceHowMuchOffShell
+ ("HowMuchOffShell",
"The multiple of the particle's width by which it is allowed to be off-shell",
&ModelGenerator::howOffShell_, 5., 0.0, 100.,
false, false, Interface::limited);
}
namespace {
/// Helper function for sorting by mass
inline bool massIsLess(tcPDPtr a, tcPDPtr b) {
return a->mass() < b->mass();
}
// Helper function to find minimum possible mass of a particle
inline Energy minimumMass(tcPDPtr parent) {
Energy output(Constants::MaxEnergy);
for(set<tDMPtr>::const_iterator dit = parent->decayModes().begin();
dit != parent->decayModes().end(); ++dit) {
Energy outMass(ZERO);
for(unsigned int ix=0;ix<(**dit).orderedProducts().size();++ix) {
outMass += (**dit).orderedProducts()[ix]->massMin();
}
output = min(output,outMass);
}
return output;
}
}
void ModelGenerator::doinit() {
useMe();
Interfaced::doinit();
// make sure the model is initialized
Ptr<Herwig::StandardModel>::pointer model
= dynamic_ptr_cast<Ptr<Herwig::StandardModel>::pointer>(generator()->standardModel());
model->init();
// and the vertices
for(size_t iv = 0; iv < model->numberOfVertices(); ++iv)
model->vertex(iv)->init();
// uniq and sort DecayParticles list by mass
set<PDPtr> tmp(particles_.begin(),particles_.end());
particles_.assign(tmp.begin(),tmp.end());
sort(particles_.begin(),particles_.end(),massIsLess);
//create decayers and decaymodes (if necessary)
if( _theDecayConstructor ) {
_theDecayConstructor->init();
_theDecayConstructor->createDecayers(particles_,brMin_);
}
// write out decays with spin correlations
ostream & os = CurrentGenerator::current().misc();
ofstream ofs;
if ( decayOutput_ > 1 ) {
string filename
= CurrentGenerator::current().filename() + "-BR.spc";
ofs.open(filename.c_str());
}
if(decayOutput_!=0) {
if(decayOutput_==1) {
os << "# The decay modes listed below will have spin\n"
<< "# correlations included when they are generated.\n#\n#";
}
else {
ofs << "# Herwig++ decay tables in SUSY Les Houches accord format\n";
ofs << "Block DCINFO # Program information\n";
ofs << "1 Herwig++ # Decay Calculator\n";
ofs << "2 " << generator()->strategy()->versionstring()
<< " # Version number\n";
}
}
//create mass and width generators for the requested particles
set<PDPtr> offShell;
if( Offsel_ == 0 ) offShell = set<PDPtr>(offshell_.begin() ,offshell_.end() );
else offShell = set<PDPtr>(particles_.begin(),particles_.end());
for(PDVector::iterator pit = particles_.begin();
pit != particles_.end(); ++pit) {
tPDPtr parent = *pit;
// Check decays for ones where quarks cannot be put on constituent
// mass-shell
checkDecays(parent);
parent->reset();
parent->update();
if( parent->CC() ) parent->CC()->synchronize();
if( parent->decaySelector().empty() ) {
parent->stable(true);
parent->width(ZERO);
parent->widthCut(ZERO);
parent->massGenerator(tGenericMassGeneratorPtr());
parent->widthGenerator(tGenericWidthGeneratorPtr());
}
else {
if(parent->mass()*minWidth_>parent->width()) {
parent->massGenerator(tGenericMassGeneratorPtr());
parent->widthGenerator(tGenericWidthGeneratorPtr());
}
else {
if( offShell.find(*pit) != offShell.end() ) {
createWidthGenerator(*pit);
}
else {
parent->massGenerator(tGenericMassGeneratorPtr());
parent->widthGenerator(tGenericWidthGeneratorPtr());
}
}
if ( decayOutput_ == 2 )
writeDecayModes(ofs, parent);
else
writeDecayModes(os, parent);
}
if( parent->massGenerator() ) {
Energy minMass = minimumMass(parent);
Energy offShellNess = howOffShell_*parent->width();
if(minMass>parent->mass()-offShellNess) {
offShellNess = parent->mass()-minMass;
}
parent->widthCut(offShellNess);
parent->massGenerator()->reset();
if(decayOutput_==1)
os << "# " <<parent->PDGName() << " will be considered off-shell.\n#\n";
}
if( parent->widthGenerator() ) parent->widthGenerator()->reset();
}
//Now construct hard processes given that we know which
//objects have running widths
for(unsigned int ix=0;ix<hardProcessConstructors_.size();++ix) {
hardProcessConstructors_[ix]->init();
hardProcessConstructors_[ix]->constructDiagrams();
}
}
void ModelGenerator::checkDecays(PDPtr parent) {
if( parent->stable() ) {
if(parent->coloured())
cerr << "Warning: No decays for coloured particle " << parent->PDGName() << "\n\n"
<< "have been calcluated in BSM model.\n"
<< "This may cause problems in the hadronization phase.\n"
<< "You may have forgotten to switch on the decay mode calculation using\n"
<< " set TwoBodyDC:CreateDecayModes Yes\n"
<< " set ThreeBodyDC:CreateDecayModes Yes\n"
<< " set WeakDecayConstructor:CreateDecayModes Yes\n"
<< "or the decays of this particle are missing from your\n"
<< "input spectrum and decay file in the SLHA format.\n\n";
return;
}
DecaySet::iterator dit = parent->decayModes().begin();
DecaySet::iterator dend = parent->decayModes().end();
Energy oldwidth(parent->width()), newwidth(ZERO);
bool rescalebrat(false);
double brsum(0.);
for(; dit != dend; ++dit ) {
if( !(**dit).on() ) continue;
Energy release((**dit).parent()->mass());
tPDVector::const_iterator pit = (**dit).orderedProducts().begin();
tPDVector::const_iterator pend =(**dit).orderedProducts().end();
for( ; pit != pend; ++pit ) {
release -= (**pit).constituentMass();
}
if( (**dit).brat() < brMin_ || release < ZERO ) {
if( release < ZERO )
cerr << "Warning: The shower cannot be generated using this decay "
<< (**dit).tag() << " because it is too close to threshold.\nIt "
<< "will be switched off and the branching fractions of the "
<< "remaining modes rescaled.\n";
rescalebrat = true;
generator()->preinitInterface(*dit, "OnOff", "set", "Off");
generator()->preinitInterface(*dit, "BranchingRatio",
"set", "0.0");
DecayIntegratorPtr decayer = dynamic_ptr_cast<DecayIntegratorPtr>((**dit).decayer());
if(decayer) {
generator()->preinitInterface(decayer->fullName(), "Initialize", "set","0");
}
}
else {
brsum += (**dit).brat();
newwidth += (**dit).brat()*oldwidth;
}
}
if( ( rescalebrat || abs(brsum - 1.) > 1e-12 ) && !parent->decayModes().empty()) {
dit = parent->decayModes().begin();
dend = parent->decayModes().end();
double factor = oldwidth/newwidth;
brsum = 0.;
for( ; dit != dend; ++dit ) {
if( !(**dit).on() ) continue;
double newbrat = ((**dit).brat())*factor;
brsum += newbrat;
ostringstream brf;
brf << setprecision(13) << newbrat;
generator()->preinitInterface(*dit, "BranchingRatio",
"set", brf.str());
}
parent->width(newwidth);
if( newwidth > ZERO ) parent->cTau(hbarc/newwidth);
}
}
namespace {
struct DecayModeOrdering {
bool operator()(tcDMPtr m1, tcDMPtr m2) {
if(m1->brat()!=m2->brat()) {
return m1->brat()>m2->brat();
}
else {
if(m1->products().size()==m2->products().size()) {
ParticleMSet::const_iterator it1=m1->products().begin();
ParticleMSet::const_iterator it2=m2->products().begin();
do {
if((**it1).id()!=(**it2).id()) {
return (**it1).id()>(**it2).id();
}
++it1;
++it2;
}
while(it1!=m1->products().end()&&
it2!=m2->products().end());
assert(false);
}
else
return m1->products().size()<m2->products().size();
}
return false;
}
};
}
void ModelGenerator::writeDecayModes(ostream & os, tcPDPtr parent) const {
if(decayOutput_==0) return;
set<tcDMPtr,DecayModeOrdering> modes;
for(set<tDMPtr>::const_iterator dit = parent->decayModes().begin();
dit != parent->decayModes().end(); ++dit) {
if((**dit).on()) modes.insert((*dit));
}
if(decayOutput_==1) {
os << " Parent: " << parent->PDGName() << " Mass (GeV): "
<< parent->mass()/GeV << " Total Width (GeV): "
<< parent->width()/GeV << endl;
os << std::left << std::setw(40) << '#'
<< std::left << std::setw(20) << "Partial Width/GeV"
<< "BR\n";
for(set<tcDMPtr,DecayModeOrdering>::iterator dit=modes.begin();
dit!=modes.end();++dit)
os << std::left << std::setw(40) << (**dit).tag()
<< std::left << std::setw(20) << (**dit).brat()*parent->width()/GeV
<< (**dit).brat() << '\n';
os << "#\n#";
}
else if(decayOutput_==2) {
os << "# \t PDG \t Width\n";
os << "DECAY\t" << parent->id() << "\t" << parent->width()/GeV << "\t # " << parent->PDGName() << "\n";
for(set<tcDMPtr,DecayModeOrdering>::iterator dit=modes.begin();
dit!=modes.end();++dit) {
os << "\t" << std::left << std::setw(10)
<< (**dit).brat() << "\t" << (**dit).orderedProducts().size()
<< "\t";
for(unsigned int ix=0;ix<(**dit).orderedProducts().size();++ix)
os << std::right << std::setw(10)
<< (**dit).orderedProducts()[ix]->id() ;
for(unsigned int ix=(**dit).orderedProducts().size();ix<4;++ix)
os << "\t";
os << "# " << (**dit).tag() << "\n";
}
}
}
void ModelGenerator::createWidthGenerator(tPDPtr p) {
string wn = p->fullName() + string("-WGen");
string mn = p->fullName() + string("-MGen");
GenericMassGeneratorPtr mgen = dynamic_ptr_cast<GenericMassGeneratorPtr>
(generator()->preinitCreate("Herwig::GenericMassGenerator", mn));
BSMWidthGeneratorPtr wgen = dynamic_ptr_cast<BSMWidthGeneratorPtr>
(generator()->preinitCreate("Herwig::BSMWidthGenerator", wn));
//set the particle interface
mgen->particle(p);
wgen->particle(p);
//set the generator interfaces in the ParticleData object
generator()->preinitInterface(p, "Mass_generator","set", mn);
generator()->preinitInterface(p, "Width_generator","set", wn);
//allow the branching fraction of this particle type to vary
p->variableRatio(true);
if( p->CC() ) p->CC()->variableRatio(true);
//initialize the generators
generator()->preinitInterface(mgen, "Initialize", "set", "Yes");
generator()->preinitInterface(wgen, "Initialize", "set", "Yes");
string norm = BRnorm_ ? "Yes" : "No";
generator()->preinitInterface(wgen, "BRNormalize", "set", norm);
string twob = twoBodyOnly_ ? "Yes" : "No";
generator()->preinitInterface(wgen, "TwoBodyOnly", "set", twob);
ostringstream os;
os << Npoints_;
generator()->preinitInterface(wgen, "Points", "set", os.str());
os.str("");
os << Iorder_;
generator()->preinitInterface(wgen, "InterpolationOrder", "set",
os.str());
os.str("");
os << BWshape_;
generator()->preinitInterface(mgen, "BreitWignerShape", "set",
os.str());
}
diff --git a/Models/LH/Makefile.am b/Models/LH/Makefile.am
--- a/Models/LH/Makefile.am
+++ b/Models/LH/Makefile.am
@@ -1,16 +1,16 @@
if WANT_BSM
pkglib_LTLIBRARIES = HwLHModel.la
endif
HwLHModel_la_SOURCES = \
LHModel.h LHModel.fh LHModel.cc \
LHFFZVertex.h LHFFZVertex.cc \
LHFFPVertex.h LHFFPVertex.cc \
LHFFGVertex.h LHFFGVertex.cc \
LHFFWVertex.h LHFFWVertex.cc \
LHWWWVertex.h LHWWWVertex.cc \
LHWWWWVertex.h LHWWWWVertex.cc \
LHFFHVertex.h LHFFHVertex.cc \
LHWWHVertex.h LHWWHVertex.cc \
LHWHHVertex.h LHWHHVertex.cc \
LHWWHHVertex.h LHWWHHVertex.cc
-HwLHModel_la_LDFLAGS = -module -version-info 3:0:0
+HwLHModel_la_LDFLAGS = -module -version-info 3:1:0
diff --git a/Models/LHTP/Makefile.am b/Models/LHTP/Makefile.am
--- a/Models/LHTP/Makefile.am
+++ b/Models/LHTP/Makefile.am
@@ -1,17 +1,17 @@
if WANT_BSM
pkglib_LTLIBRARIES = HwLHTPModel.la
endif
HwLHTPModel_la_SOURCES = \
LHTPModel.fh LHTPModel.cc LHTPModel.h \
LHTPWWHVertex.cc LHTPWWHVertex.h \
LHTPFFGVertex.cc LHTPFFGVertex.h \
LHTPFFPVertex.cc LHTPFFPVertex.h \
LHTPFFWVertex.cc LHTPFFWVertex.h \
LHTPFFZVertex.cc LHTPFFZVertex.h \
LHTPWWWVertex.cc LHTPWWWVertex.h \
LHTPHHHVertex.cc LHTPHHHVertex.h \
LHTPWHHVertex.cc LHTPWHHVertex.h \
LHTPFFHVertex.cc LHTPFFHVertex.h
-HwLHTPModel_la_LDFLAGS = -module -version-info 3:0:0
+HwLHTPModel_la_LDFLAGS = -module -version-info 3:1:0
HwLHTPModel_la_LIBADD= $(GSLLIBS)
HwLHTPModel_la_CPPFLAGS= $(AM_CPPFLAGS) $(GSLINCLUDE)
diff --git a/Models/Sextet/Makefile.am b/Models/Sextet/Makefile.am
--- a/Models/Sextet/Makefile.am
+++ b/Models/Sextet/Makefile.am
@@ -1,13 +1,13 @@
if WANT_BSM
pkglib_LTLIBRARIES = HwSextetModel.la
endif
HwSextetModel_la_SOURCES = SextetParticles.h \
SextetModel.cc SextetModel.h SextetModel.fh \
SextetGSSVertex.cc SextetGSSVertex.h \
SextetGGSSVertex.cc SextetGGSSVertex.h \
SextetGVVVertex.cc SextetGVVVertex.h \
SextetGGVVVertex.cc SextetGGVVVertex.h \
SextetFFSVertex.cc SextetFFSVertex.h \
SextetFFVVertex.cc SextetFFVVertex.h
-HwSextetModel_la_LDFLAGS = -module -version-info 1:0:0
+HwSextetModel_la_LDFLAGS = -module -version-info 1:1:0
diff --git a/Models/StandardModel/SMFFHVertex.cc b/Models/StandardModel/SMFFHVertex.cc
--- a/Models/StandardModel/SMFFHVertex.cc
+++ b/Models/StandardModel/SMFFHVertex.cc
@@ -1,99 +1,99 @@
// -*- C++ -*-
//
// SMFFHVertex.cc is a part of Herwig++ - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2011 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 SMFFHVertex class.
//
#include "SMFFHVertex.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Config/Constants.h"
using namespace Herwig;
IBPtr SMFFHVertex::clone() const {
return new_ptr(*this);
}
IBPtr SMFFHVertex::fullclone() const {
return new_ptr(*this);
}
SMFFHVertex::SMFFHVertex() {
// set up for the couplings
_couplast=InvEnergy();
_idlast=0;
_q2last=ZERO;
_masslast=ZERO;
_mw=ZERO;
orderInGem(1);
orderInGs(0);
}
void SMFFHVertex::doinit() {
// PDG codes for the particles
// the quarks
for(int ix=1;ix<7;++ix) {
addToList(-ix, ix, 25);
}
// the leptons
for(int ix=11;ix<17;ix+=2) {
addToList(-ix, ix, 25);
}
_theSM = dynamic_ptr_cast<tcHwSMPtr>(generator()->standardModel());
if (!_theSM)
throw InitException();
_mw= getParticleData(ThePEG::ParticleID::Wplus)->mass();
FFSVertex::doinit();
}
void SMFFHVertex::persistentOutput(PersistentOStream & os) const {
os << _theSM << ounit(_mw,GeV);
}
void SMFFHVertex::persistentInput(PersistentIStream & is, int) {
is >> _theSM >> iunit(_mw,GeV);
}
ClassDescription<SMFFHVertex>
SMFFHVertex::initSMFFHVertex;
// Definition of the static class description member.
void SMFFHVertex::Init() {
static ClassDocumentation<SMFFHVertex> documentation
("The SMFFHVertex class is the implementation"
" of the helicity amplitude calculation of the Standard Model Higgs"
" fermion-antiferiom vertex.");
}
void SMFFHVertex::setCoupling(Energy2 q2,tcPDPtr aa,tcPDPtr, tcPDPtr) {
int iferm=abs(aa->id());
// left and right couplings set to one
left (1.);
right(1.);
// first the overall normalisation
- if(q2!=_q2last||_couplast==0./GeV) {
+ if(q2!=_q2last||_couplast==complex<InvEnergy>()) {
_couplast = -0.5*weakCoupling(q2)/_mw;
_q2last=q2;
_idlast=iferm;
assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16));
_masslast=_theSM->mass(q2,aa);
}
else if(iferm!=_idlast) {
_idlast=iferm;
assert((iferm>=1 && iferm<=6)||(iferm>=11 &&iferm<=16));
_masslast=_theSM->mass(q2,aa);
}
norm(_couplast*_masslast);
}
diff --git a/Models/Susy/Makefile.am b/Models/Susy/Makefile.am
--- a/Models/Susy/Makefile.am
+++ b/Models/Susy/Makefile.am
@@ -1,34 +1,34 @@
SUBDIRS = NMSSM RPV
if WANT_BSM
pkglib_LTLIBRARIES = HwSusy.la
endif
HwSusy_la_SOURCES = SusyBase.cc SusyBase.h SusyBase.fh \
MSSM.cc MSSM.h MSSM.fh\
MixingMatrix.h MixingMatrix.fh MixingMatrix.cc\
SSCFSVertex.cc SSCFSVertex.h \
SSGFSVertex.cc SSGFSVertex.h \
SSHSFSFVertex.cc SSHSFSFVertex.h \
SSNFSVertex.cc SSNFSVertex.h \
SSWSSVertex.cc SSWSSVertex.h \
SSWGSSVertex.cc SSWGSSVertex.h \
SSGSSVertex.cc SSGSSVertex.h \
SSGGSQSQVertex.cc SSGGSQSQVertex.h \
SSGSGSGVertex.cc SSGSGSGVertex.h \
SSNNZVertex.cc SSNNZVertex.h \
SSCCZVertex.cc SSCCZVertex.h \
SSCNWVertex.cc SSCNWVertex.h \
SSFFHVertex.cc SSFFHVertex.h \
SSGOGOHVertex.cc SSGOGOHVertex.h \
SSWWHVertex.cc SSWWHVertex.h \
SSWWHHVertex.cc SSWWHHVertex.h \
SSWHHVertex.cc SSWHHVertex.h \
SSHHHVertex.cc SSHHHVertex.h \
SSHGGVertex.cc SSHGGVertex.h \
SSHPPVertex.cc SSHPPVertex.h \
SSNNPVertex.h SSNNPVertex.cc \
SSGNGVertex.h SSGNGVertex.cc \
SSNCTVertex.h SSNCTVertex.cc \
SSGVNHVertex.h SSGVNHVertex.cc\
SSGVNVVertex.h SSGVNVVertex.cc\
SSGVFSVertex.h SSGVFSVertex.cc
-HwSusy_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 9:1:0
+HwSusy_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 10:0:0
diff --git a/Models/Susy/NMSSM/Makefile.am b/Models/Susy/NMSSM/Makefile.am
--- a/Models/Susy/NMSSM/Makefile.am
+++ b/Models/Susy/NMSSM/Makefile.am
@@ -1,15 +1,15 @@
if WANT_BSM
pkglib_LTLIBRARIES = HwNMSSM.la
endif
HwNMSSM_la_SOURCES = \
NMSSM.cc NMSSM.h NMSSM.fh \
NMSSMFFHVertex.h NMSSMFFHVertex.cc \
NMSSMWWHVertex.h NMSSMWWHVertex.cc \
NMSSMWHHVertex.h NMSSMWHHVertex.cc \
NMSSMHSFSFVertex.h NMSSMHSFSFVertex.cc\
NMSSMGOGOHVertex.h NMSSMGOGOHVertex.cc \
NMSSMHHHVertex.h NMSSMHHHVertex.cc \
NMSSMGGHVertex.h NMSSMGGHVertex.cc \
NMSSMPPHVertex.h NMSSMPPHVertex.cc \
NMSSMWWHHVertex.h NMSSMWWHHVertex.cc
-HwNMSSM_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 2:1:0
+HwNMSSM_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 3:0:0
diff --git a/Models/Susy/RPV/Makefile.am b/Models/Susy/RPV/Makefile.am
--- a/Models/Susy/RPV/Makefile.am
+++ b/Models/Susy/RPV/Makefile.am
@@ -1,15 +1,15 @@
if WANT_BSM
pkglib_LTLIBRARIES = HwRPV.la
endif
HwRPV_la_SOURCES = \
RPV.cc RPV.h RPV.fh \
RPVLLEVertex.h RPVLLEVertex.cc\
RPVLQDVertex.h RPVLQDVertex.cc\
RPVUDDVertex.h RPVUDDVertex.cc\
RPVFFZVertex.h RPVFFZVertex.cc\
RPVFFWVertex.h RPVFFWVertex.cc\
RPVWSSVertex.h RPVWSSVertex.cc\
RPVFFSVertex.h RPVFFSVertex.cc\
RPVWWHVertex.h RPVWWHVertex.cc\
RPVSSSVertex.h RPVSSSVertex.cc
-HwRPV_la_LDFLAGS = -module
+HwRPV_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 1:0:0
diff --git a/Models/UED/Makefile.am b/Models/UED/Makefile.am
--- a/Models/UED/Makefile.am
+++ b/Models/UED/Makefile.am
@@ -1,20 +1,20 @@
if WANT_BSM
pkglib_LTLIBRARIES = HwUED.la
endif
HwUED_la_SOURCES = \
UEDBase.cc UEDBase.h UEDBase.fh \
UEDF1F1Z0Vertex.cc UEDF1F1Z0Vertex.h \
UEDF1F1G0Vertex.cc UEDF1F1G0Vertex.h \
UEDF1F0G1Vertex.cc UEDF1F0G1Vertex.h \
UEDG1G1G0Vertex.cc UEDG1G1G0Vertex.h \
UEDG0G0G1G1Vertex.cc UEDG0G0G1G1Vertex.h \
UEDF1F1P0Vertex.cc UEDF1F1P0Vertex.h \
UEDF1F1W0Vertex.cc UEDF1F1W0Vertex.h \
UEDF1F0W1Vertex.cc UEDF1F0W1Vertex.h \
UEDP0H1H1Vertex.cc UEDP0H1H1Vertex.h \
UEDZ0H1H1Vertex.cc UEDZ0H1H1Vertex.h \
UEDW0A1H1Vertex.cc UEDW0A1H1Vertex.h \
UEDZ0A1h1Vertex.cc UEDZ0A1h1Vertex.h \
UEDW0W1W1Vertex.cc UEDW0W1W1Vertex.h \
UEDF1F0H1Vertex.cc UEDF1F0H1Vertex.h
-HwUED_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 7:1:0
+HwUED_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 8:0:0
diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,1321 +1,1375 @@
Herwig++ News (emacs -*- outline -*- format)
-* Herwig++-2.7.0 release: 2013-10-XX
+* Herwig++-2.7.0 release: 2013-10-28
+
+** UFO interface to Feynman rules generators
+ Herwig++ now includes "ufo2herwig", a tool that automatically
+ creates all required files to run a BSM model from a UFO
+ directory. The conversion has been extensively tested against
+ Feynrules models MSSM, NMSSM, RS, Technicolor,
+ and less extensively with most of the
+ other models in the Feynrules model database.
+ We expect that following this release there will be no further
+ hard-coded new physics models added to Herwig++ and that future
+ models will be included using the UFO interface.
** Shower uncertainties
A first set of scaling parameters to estimate shower uncertainties
is provided for both the angular ordered as well as the dipole
- shower.
+ shower; they are Evolver:HardScaleFactor and ShowerAlphaQCD:
+ RenormalizationScaleFactor.
** Rewrite of Matchbox NLO matching
The NLO matching implementation has been rewritten and is now more
flexible and consistent. Profile scales are provided for the
hardest emission both for the dipole shower and matrix element
correction matching.
** BLHA2 Interface and new processes
Matchbox now features a generic BLHA2 interface to one-loop
amplitude codes and now also includes W and W+jet production as
well as Higss production in gluon fusion as builtin processes.
** Impoved dipole shower kinematics parametrization
The kinematics parametrization for emissions in the dipole shower
has been made more efficient.
+** W and Z Powheg decays
+ Decays of W and Z bosons now use the Powheg decayers by default.
+
+** Improved treatment of beam remnants
+ The handling of beam remnants has been improved in multiple
+ contexts, leading to a much lower error rate at p+/p- collisions.
+ An additional value "VeryHard" for ClusterFissioner:RemnantOption
+ can be used to disable any special treatment of beam remnant
+ clusters.
+
+** New underlying event tune
+ Herwig++ now uses tune UE-EE-5-MRST by default. Other related tunes
+ can be obtained from the Herwig++ tunes page
+
+** Improvements in BSM code
+ The UFO development identified many sign fixes in rarely used BSM
+ vertices; many improvements were made to general decayers, allowing
+ four-body decays in BSM for the first time; Powheg is enabled in
+ General two-body decayers; and the handling of colour
+ sextets has been improved.
+
+** A new HiggsPair matrix element in Contrib.
+
+** A new matrix element for single top production.
+
+** The Higgs mass is now set to 125.9 GeV (from PDG 2013 update).
+
+** C++-11 testing
+ To help with the coming transition to C++-11, we provide the new
+ --enable-stdcxx11 configure flag. Please try to test builds with
+ this flag enabled and let us know any problems, but do not use this
+ in production code yet. In future releases, this flag will be on by
+ default.
+
+** Other changes
+*** Many new Rivet analyses have been included in the Tests directory.
+*** Cleaned Shower header structure; grouped shower parameters into one struct.
+*** The boolean Powheg flag in HwMEBase changed to an enumeration.
+
+
+
+
* Herwig++-2.6.3 release: 2013-02-22
** Decay vertex positioning in HepMC output
Pseudo-vertices that Herwig++ inserts for technical reasons will
now not contribute to the Lorentz positions of downstream vertices.
Thanks to ATLAS for the bug report!
** Updated Rivet tests
Herwig's library of Rivet test runs has been brought up-to-date
with new analyses that were recently published by the Rivet
collaboration.
* Herwig++-2.6.2 release: 2013-01-30
** Fixes for PDF and scale choices in POWHEG events
Scale settings for MPI and the regular shower are now correct in
POWHEG events. This should fix reported anomalies in POWHEG jet rates.
NLO PDFs are now also set consistently in the example input files.
** Ticket #373: Branching ratio factors in cross-section
If any decay modes are selectively disabled, setting the following
post-handler will cause all reported cross-sections to include the
branching ratio factor(s) from the previous stages correctly:
create Herwig::BranchingRatioReweighter BRreweight
insert LHCGenerator:EventHandler:PostDecayHandlers 0 BRreweight
** Anomalous vertices now possible in MEfftoVH
** Interactive shell does not quit on error
** Better warning messages for events from inconsistent LHEF files
** Possible division by zero error fixed in BSM branching ratio calculations
** Decayer and ME changes to improve checkpointing
The checkpointing changes in ThePEG 1.8.2 are implemented here, too. Regular
dump files are consistent now.
* Herwig++-2.6.1 release: 2012-10-16
** Configure switches
The various switches to turn off compilation of BSM models have
been unified into a single '--disable-models'. A new flag
'--disable-dipole' can be used to turn off the compilation of the
Dipole and Matchbox codes.
** Ticket #348: Search path for repository 'read' command
The search path for the 'read' command is configurable on the
command line with the -i and -I switches. By default, the
installation location is now included in the search path, so that
'Herwig++ read LEP.in' will work in an empty directory. The current
working directory will always be searched first.
The rarely used "Herwig++ init" command has been made consistent
with 'read' and 'run' and should now be used without the '-i' flag.
** Width treatment in BSM
The width treatment in BSM decay chains has been greatly improved
and is now switched on by default in the .model files. To get the
old behaviour, use
set /Herwig/NewPhysics/NewModel:WhichOffshell Selected
** New BSM models
Little Higgs models with and without T-parity are now available.
** Resonance photon lifetime
A lifetime bug affecting decays of pi0 to e+e-X was fixed. The
virtual photon is not part of the event record anymore.
** Ticket #371: Hard diffraction FPE
Herwig++ 2.6.0 introduced a bug into the diffraction code which
would abort any runs. This is now fixed.
** O2AlphaS
Support for setting quark masses different from the particle data
objects as introduced in ThePEG 1.8.1 has been enabled.
** Matchbox
Several improvements and bug fixes are included for
Matchbox. Amplitudes relevant to pp -> Z+jet and crossed processes
at NLO are now available, and various scale choices have been added
in a more flexible way. All subtraction dipoles for massive quarks
are now included.
** Dipole shower
Parameters to perform scale variations in the shower have been
added to estimate uncertainties. A bug in showering off gg -> h has
been fixed.
** Minor fixes
*** Two broken colour structures in GeneralHardME
*** Susy Higgs mixing matrix
*** BaryonFactorizedDecayer out-of-bounds access
*** Mass values in SimpleLHCAnalysis
* Herwig++-2.6.0 release: 2012-05-21 (tagged at SVN r7407)
** New NLO framework
Matchbox, a flexible and very general framework for performing NLO
calculations at fixed order or matched to parton showers is
provided with this release.
** Dipole shower algorithm
A first implementation of the coherent dipole shower algorithm by
Plätzer and Gieseke (arXiv:0909.5593 and arXiv:1109.6256) is
available.
** Alternative samplers and the ExSample library
The ExSample library by Plätzer (arXiv:1108.6182) is shipped along
with Herwig++ in an extended version. The extended version provides
SamplerBase objects which can be used alternatively to the default
ACDCSampler.
** New BSM models
*** New colour sextet diquark model
A colour sextet diquark model has been included, as described in
Richardson and Winn (arXiv:1108.6154).
*** Models reproducing the CDF t-tbar asymmetry
Four models that can reproduce the reported t-tbar asymmetry have
been included.
*** Zprime
A simple standard model extension by one additional heavy neutral
vector boson.
** Interface to AlpGen, with MLM merging
The Contrib directory contains a new interface to the AlpGen matrix
element generator. AlpGen events must be preprocessed with the
provided AlpGenToLH.exe tool before they can be used. More
information can be found in the Herwig++ 2.6 release note.
** HiggsVBF Powheg
Higgs boson production by vector boson fusion is available at NLO
in the POWHEG scheme, as described in d'Errico, Richardson
(arXiv:1106.2983). The Powheg DIS processes were available in
Herwig++-2.5.2 already.
** Statistical colour reconnection
Alternative mechanisms to minimize the colour length Sum(m_clu)
before the hadronization stage, based on Metropolis and annealing
algorithms.
** Energy extrapolation of underlying-event tunes
To describe underlying-event data at different c.m. energies, the
energy-dependent parameter pT_min will now be adjusted
automatically, following a power-law. The new tune parameters are
the value at 7000 GeV "MPIHandler:pTmin0", and MPIHandler:Power.
** Ticket #239: Reporting of minimum-bias cross-section
When simulating minimum-bias events using the MEMinBias matrix
element, the correct unitarized cross section can now be reported
via the standard facilities; it is no longer necessary to extract
it from the .log file of the run. The corresponding functionality
is enabled by inserting a MPIXSecReweighter object as a
post-subprocess handler:
create Herwig::MPIXSecReweighter MPIXSecReweighter
insert LHCHandler:PostSubProcessHandlers 0 MPIXSecReweighter
** Dependency on 'boost'
Herwig++ now requires the boost headers to build; if not detected
in standard locations, specify with the --with-boost configure
option.
** Tests directory
The Tests directory now contains input cards for almost all Rivet
analyses. A full comparison run can be initiated with 'make tests'.
** Minor changes
*** Default LHC energy now 8 TeV
All LHC-based defaults have now been updated to use 8 TeV as the
center-of-mass energy.
*** Herwig::ExtraParticleID -> ThePEG::ParticleID
The namespace for additional particles has been unified into
ThePEG::ParticleID
*** MEee2VectorMeson
The e+e- -> vector meson matrix element has moved from Contrib into
HwMELepton.so
*** SUSY numerics fixes
Better handling of rare numerical instabilities.
*** YODA output for Rivet
The built-in histogramming handler can now output data in the YODA
format used by Rivet.
*** Consistency checks in SLHA file reader
Better warnings for inconsistent SusyLHA files
*** better colour flow checking for development
** Bug fixes
*** Extremely offshell W from top decay
Numerical improvements for very off-shell W bosons coming from top
decays.
*** Ticket #367: problems in using SUSY + LHE
Susy events from Les Houches event files are now handled better.
*** Infinite loop in remnant decayer
The remnant decayer will now abort after 100 tries.
*** Fix to HiggsVBF LO diagrams
The diagram structure of HiggsVBF LO matrix elements has been fixed.
*** LEP thrust fix
The calculation of the transverse momentum of a branching from the
evolution variable in final-state radiation can now be
changed. While formally a sub-leading choice this enables a better
description of the thrust distribution in e+e- collisions at
small values of the thrust. Currently the default behaviour, where
the cut-off masses are used in the calculation, remains the same
as previous versions.
* Herwig++-2.5.2 release: 2011-11-01 (tagged at SVN r6928)
** Optional new jet vetoing model
The jet vetoing model by Schofield and Seymour (arXiv:1103.4811) is
available via Evolver:ColourEvolutionMethod,
PartnerFinder:PartnerMethod and SplittingFunction:SplittingColourMethod.
The default behaviour is unchanged.
** MPI tune
Version 3 of the MPI tunes is now the default. Please note that the
pT parameter is energy-dependent and needs to be modified when an
LHC run is not at 7 TeV.
The latest tunes are always available at
http://projects.hepforge.org/herwig/trac/wiki/MB_UE_tunes
** MPI PDFs
MPI PDFs can now be controlled independently.
** Initialization time speedup
A new BSMModel base class was introduced between StandardModel and
the BSM model classes. Together with a restructured decay mode
initialization, this offers significantly faster startup times for
BSM runs. ThreeBodyDecays can now always be switched on without a
large speed penalty.
** Decay mode file
Decay mode files in the SLHA format can now be read separately in
any BSM model with 'set Model:DecayFileName filename'
** Powheg DIS
Charged- and neutral-current DIS processes implementing the POWHEG
method are now available.
** Diffraction models
Xi cut implemented in PomeronFlux
** Ticket #352: Colour reconnection fixed in DIS
** Ticket #353: Improved numerical stability in chargino decays
** Ticket #358: Infinite loop in top events with pT cut in shower
** Ticket #361: Problem with duplicate 2-body modes in BSM
** Tickets #362 / #363: Crashes with baryon number violating models
Particle decays in SUSY models with RPV now work correctly in the
colour 8 -> 3,3,3 case. Colour reshuffling now works for RPV
clusters.
** Improved Fastjet detection
The configure step uses fastjet-config to make sure all header file
paths are seen.
** Darwin 11 / OS X Lion
A configure bug was fixed which prevented 'make check' from
succeeding on OS X Lion.
** Vertex classes
The specification of QED / QCD orders has been moved to the vertex
constructors, to allow ThePEG consistency checks. WWHH vertices in
MSSM and NMSSM were fixed. Some Leptoquark and UED vertices fixed.
** Hadronization
Cleanup of obsolete code.
* Herwig++-2.5.1 release: 2011-06-24 (tagged at SVN r6609)
** Example input files at 7 TeV
All our example input files for LHC now have their beam energy set
to 7 TeV instead of 14 TeV.
** Colour reconnection on by default
The colour reconnection tunes are now the default setup. Version 2
of the tunes replaces the *-1 tunes, which had a problem with LEP
event shapes.
** Run name tags
Aded possibility to add a tag to the run name when running with the
'-t' option. One run file can thus be run with different seeds and
results stored in different output files.
** Floating point exceptions
The new command line option -D enables floating point error checking.
** General improvements to WeakCurrent decays
** Remnant decayer
Hardwired gluon mass was removed.
** WeakCurrentDecayConstructor
Instead of specifying separate Particle1...Particle5 vectors for
the decay modes, the new interface DecayModes can be filled with
decay tags in the standard syntax.
** BSM: improvements to handling of vertex and model initialisation
** Powheg Higgs
Option to use pT or mT as the scale in alphaS and for the
factorization scale in the PDFs
** Ticket #337: Tau polarization wrong in charged Higgs decay
** Ticket #339: Colour flows in GeneralThreeBody Decayers for 3bar -> 8 3bar 1
** Ticket #340: Crash for resonant zero-width particles
** Ticket #341: Varying scale for BSM processes
The scale used is now ResonantProcessConstructor:ScaleFactor or
TwoToTwoProcessConstructor:ScaleFactor multiplied by sHat.
** Ticket #346: Chargino decays
Chargino decayers now automatically switch between the mesonic
decays for mass differences less than 2 GeV and the normal partonic
decays above 2 GeV.
** Ticket #349: Stop by default on input file errors
The '--exitonerror' flag is now the default behaviour for the
Herwig++ binary. To switch back to the old behaviour,
'--noexitonerror' is required.
** Ticket #351: Four-body stop decays
** Tested with gcc-4.6
* Herwig++-2.5.0 release: 2011-02-08 (tagged at SVN r6274)
** Uses ThePEG-1.7.0
Herwig++ 2.5.0 requires ThePEG 1.7.0 to benefit from various
improvements, particularly: handling of diffractive processes;
respecting LD_LIBRARY_PATH when loading dynamic libraries,
including LHAPDF; improvements to repository commands for decay
modes. See ThePEG's NEWS file for more details.
** POWHEG improvements
*** New POWHEG processes
Simulation at NLO accuracy using the POWHEG method is now
available for hadronic diboson production (pp to WW,WZ,ZZ), Higgs
decays to heavy quarks, and e+e- to two jets or ttbar, including
full mass dependence.
*** Input file changes
The input files for setting up POWHEG process simulation have been
simplified. See the example files LHC-Powheg.in and TVT-Powheg.in
for the improved command list.
*** Structural changes
The POWHEG backend in the shower code has been restructured to
make future additions easier: PowhegEvolver has merged with
Evolver; both the matrix element corrections and real corrections
in the POWHEG scheme are implemented directly in the ME or Decayer
classes.
** New processes at leading order
*** Photon initiated processes
We have added a matrix element for dijet production in gamma
hadron collisions.
*** Bottom and charm in heavy quark ME
The option of bottom and charm quarks is now supported for heavy
quark production in MEHeavyQuark.
** Colour reconnection
The cluster hadronization model has been extended by an option to
reconnect coloured constituents between clusters with a given
probability. This new model is different from the colour
reconnection model used in FORTRAN HERWIG, and improves the
description of minimum bias and underlying event data.
** Diffractive Processes
Both single and double diffractive processes are now supported in
Herwig++. The Pomeron PDF is implemented using a fit to HERA data,
and a pion PDF can be used to model reggeon flux.
** BSM physics
*** New models
We have added new BSM models, particularly ADD-type extra
dimension models and the next-to-minimal supersymmetric standard
model (NMSSM). Effects of leptoquarks can as well be simulated.
*** Vertex additions
We have added flavour changing stop interactions (stop -
neutralino - charm) and gravitino interactions with particular
emphasis on numerical stability for very light gravitinos.
Tri-linear Higgs and Higgs-Higgs/Vector-Vector four-vertices are
available as well.
*** Input file changes
The SUSY model can now also extract the SLHA information from the
header of a Les Houches event file: replace the SLHA file name
in the example input files with the LH file name.
*** Structure
The backend structure of the HardProcessConstructor has changed,
to allow easier inclusion of new process constructors. Some 2->3
BSM scattering processes involving neutral higgs bosons are now
included. The spin handling has been improved in the background.
** Shower splitting code reorganized
The selection of spin structures has been decoupled from the choice
of colour structure. This gives more flexibility in implementing
new splittings. Selected splittings can be disabled in the input
files.
** B mixing
B mixing, and indirect CP violation in the B meson system are
included now.
** Looptools
The Looptools directory has been updated to reflect T.Hahn's
Looptools 2.6.
** Contrib changes
The ROOT interface has been removed as deprecated. The MCPWNLO code
has temporarily been removed from the Contrib directory as a major
review of this code is required. Additionally, there are various
fixes to all other codes shipped in Contrib.
** DIS improvements
The momentum reshuffling in DIS events has been improved.
** mu and nu beams
mu, nu_e and nu_mu and their antiparticles are now available as
beam particles. They are all supported in the DIS matrix
elements. mu+ mu- collisions are supported in the general
matrix element code for BSM models, but not yet in the hard-coded
matrix elements for lepton-lepton scattering.
** Structural changes
*** Inline code
Inline code has been merged into the header files, .icc files were
removed.
*** Silent build
By default, Herwig++ now builds with silent build rules. To get
the old behaviour, run 'make V=1'.
*** Debug level
The debug level on the command line will now always have priority.
*** Event counter
The event counter has been simplified.
*** Interpolator persistency
Interpolators can now be written persistently.
** Ticket #307: Momentum violation check in BasicConsistency
Added parameters AbsoluteMomentumTolerance and
RelativeMomentumTolerance
** Example POWHEG input files
The example input files for Powheg processes now set the NLO
alpha_S correctly, and are run as part of 'make check'.
** Truncated shower
A problem which lead to the truncated shower not being applied in
some cases has been fixed.
** Fixes to numerical problems
Minor problems with values close to zero were fixed in several
locations.
** Remove duplicated calculation of event shapes
An accidental duplication in the calculation of event shapes was
removed, they are now only calculated once per event. Several other
minor issues in the event shape calculations have also been fixed.
** MRST PDFs fixed
An initialization problem in the internal MRST PDFs was fixed.
** Vertex scale choice
The scale in the Vertex classes can now be zero where
possible.
** Treatment of -N flag
The Herwig++ main program now correctly treats the -N flag
as optional.
** Numerical stability improved
The numerical stability in the 'RunningMass' and
'QTildeReconstructor' classes has been improved. The
stability of the boosts in the SOPTHY code for the
simulation of QED radiation has been improved.
The accuracy of boosts in the z-direction has been improved to
fix problems with extremely high p_T partons.
** Bugfix in initial state splittings
A bug in the implementation of the PDF weight in initial-state
qbar -> qbar g splittings has been fixed.
** Bugfix in chargino neutralino vertices
A bug in the 'chi+- chi0 W-+' and charged
Higgs-sfermions vertices has been fixed.
** Remove uninitialized variables written to repository
A number of uninitialised variables which were written to the
repository have been initialised to zero to avoid problems on some
systems.
** Fix to QED radiation in hadronic collisions
The longitudinal boost of the centre-of-mass frame in hadronic
collisions is correctly accounted for now in the generation of QED
radiation.
** Fix to numerical problems in two-body decays
Numerical problems have been fixed, which appeared in the rare case
that the three-momenta of the decay products in two-body decays are
zero in the rest frame of the decay particle.
** A problem with forced splittings in the Remnant was fixed.
** ME correction for W+- decays applied properly
The matrix element correction for QCD radiation in W+- decays
which was not being applied is now correctly used.
** Top quark decays from SLHA file
The presence of top quark decay modes in SLHA files is now handled
correctly.
** Exceptional shower reconstruction kinematics
Additional protection against problems due to the shower
reconstruction leading to partons with x>1 has been added.
** Ordering of particles in BSM processes
Changes have been made to allow arbitrary ordering of the outgoing
particles in BSM processes.
** Bugfixes in tau decays
Two bugs involving tau decays have been fixed. The wrong masses
were used in the 'KPiCurrent' class for the scalar form factors
and a mistake in the selection of decay products lead to
tau- --> pi0 K- being generated instead of tau- --> eta K-.
** Avoid crashes in baryon number violating processes.
To avoid crashes, better protection has been introduced for the
case where diquarks cannot be formed from the quarks in a
baryon-number violating process. In addition, the parents of the
baryon-number violating clusters have been changed to avoid
problems with the conversion of the events to HepMC.
** QED radiation in W- decays
A bug in the 'QEDRadiationHandler' class which resulted
in no QED radiation being generated in W- decays has been fixed.
** A number of minor fixes to the SUSY models have been made.
** Partial width calculations in BSM models
A fix for the direction of the incoming particle in the calculation
of two-body partial widths in BSM models has been made.
** LoopTools improvements
The LoopTools cache is now cleared more frequently to
reduce the amount of memory used by the particle.
** Negative gluino masses are now correctly handled.
** A problem with mixing matrices which are not square has been fixed.
** Removed duplicate diagram
The 'MEee2gZ2ll' class has been fixed to only include the
photon exchange diagram once rather than twice as previously.
** Fix for duplicate particles in DecayConstructor
A problem has been fixed which occurred if the same particle was
included in the list of DecayConstructor:DecayParticles.
** Fixes for UED model vertices
A number of minor problems in the vertices for the UED model have
been fixed.
** Include missing symmetry factor
The missing identical-particle symmetry factor in
'MEPP2GammaGamma' has been included.
** Fix floating point problem in top decays
A floating point problem in the matrix element correction for top
decays has been fixed.
* Herwig++-2.4.2 release: 2009-12-11 (tagged at SVN r5022)
** Ticket #292: Tau decay numerical instability
The momentum assignment in tau decays contained numerical
instabilities which have been fixed by postponing the tau decay
until after the parton shower. A new interface setting
DecayHandler:Excluded is available to prevent decays in the shower
step. This is enabled by default for tau only.
** Ticket #290: Missing MSSM colour structure
The missing colour structure for gluino -> gluon neutralino was added.
** Ticket #294: Zero momentum in some decays
Some rare phase space points lead to zero momentum in two-body
decays. This has been fixed.
** Ticket #295: Stability of QED radiation for lepton collider processes
The numerical stability of QED radiation momenta was improved
further.
** Ticket #296: K0 oscillation vertex was wrong
The oscillation from K0 to K0_L/S now takes place at the production
vertex of K0.
** Ticket #289: Undefined variables in repository
On some system configurations, undefined variables were written to
the repository. These have been fixed.
** Fixed QED radiation for hadron processes
The longitudinal boost of the centre-of-mass frame in hadronic
collisions is correctly accounted for now.
** Numerical stability fixes
Small fixes in RunningMass and QTildeReconstructor.
** Powheg example input files
The example input files for Powheg processes now set the NLO
alpha_S correctly, and are run as part of 'make check'.
** OS X builds for Snow Leopard
Snow Leopard machines will now be recognized as a 64bit
architecture.
* Herwig++-2.4.1 release: 2009-11-19 (tagged at SVN r4932)
** Uses ThePEG-1.6.0
Herwig++ now requires ThePEG-1.6.0 to benefit from the improved
helicity code there. If you have self-written vertex classes, see
ThePEG's NEWS file for conversion instructions.
** Vertex improvements
ThePEG's new helicity code allowed major simplification of the vertex
implementations for all Standard Model and BSM physics models.
** New Transplanckian scattering model
An example configuration is in LHC-TRP.in
** BSM ModelGenerator as branching ratio calculator
The BSM ModelGenerator has a new switch to output the branching
ratios for a given SLHA file in SLHA format, which can then be used
elsewhere.
** BSM debugging: HardProcessConstructor
New interface 'Excluded' to exclude certain particles from
intermediate lines.
** Chargino-Neutralino-W vertex fixed
** Spin correlations
are now switched on by default for all perturbative decays.
** Ticket #276: Scale choice in BSM models' HardProcessConstructor
New interface 'ScaleChoice' to choose process scale between
- sHat (default for colour neutral intermediates) and
- transverse mass (default for all other processes).
** Ticket #287: Powheg process scale choice
The default choice is now the mass of the colour-singlet system.
** Ticket #278: QED radiation for BSM
Soft QED radiation is now enabled in BSM decays and all
perturbative decays by default.
** Ticket #279: Full 1-loop QED radiation for Z decays
Soft QED radiation in Z decays is now fully 1-loop by default.
** Ticket #280: Redirect all files to stdout
This is now implemented globally. The files previously ending in
-UE.out and -BSMinfo.out are now appended to the log file. They now
also obey the EventGenerator:UseStdout flag.
** Ticket #270: LaTeX output updated
After each run, a LaTeX file is produced that contains the full
list of citations. Please include the relevant ones in publications.
** Ticket #256: Mac OS X problems
An initialization problem that affected only some configurations has
been identified and fixed.
** Tests directory added
This contains many .in files, to exercise most matrix
elements.
** Minor fixes
*** Prevent rare x>1 partons in shower reconstruction.
*** SUSY-LHA parameter EXTPAR can be used to set tan beta
*** Improved Fastjet detection at configure time
* Herwig++-2.4.0 release: 2009-09-01 (tagged at SVN r4616)
** New matrix elements
We have added a built-in implementation of several new matrix elements:
PP --> WW / WZ / ZZ
PP --> W gamma / Z gamma
PP --> VBF Higgs
PP --> Higgs tt / Higgs bb
e+e- --> WW / ZZ
gamma gamma --> ff / WW
** Base code improvements
*** Ticket #257: Remnant handling
A problem with forced splittings in the Remnant was fixed.
*** Ticket #264: Soft matrix element correction
A problem with emissions form antiquarks was fixed.
** PDF sets
*** New default set
MRST LO** is the new default PDF set. LO* is also available built-in.
*** Shower PDFs can be set separately from the hard process
Use the 'ShowerHandler:PDF' interface.
** Parameter tunes
Shower, hadronization and underlying event parameters were retuned
against LEP and Tevatron data respectively.
** BSM module improvements
*** Ticket #259: read error for some UED models
Arbitrary ordering of outgoing lines in the process description is now
possible.
*** Ticket #266: branching ratio sums
The warning threshold for branching ratios not summing to 1 has
been relaxed. It is now a user interface parameter.
*** Ticket #267: Top decay modes
Top decay modes listed in SLHA files are now handled correctly.
** QED radiation
*** Ticket #241: Soft QED radiation is now enabled by default
*** Ticket #265: Radiation off W+ and W- is now handled correctly
** Interfaces
*** Ticket #243: Fastjet
Fastjet is now the only supported jet finder code. All example
analyses have been converted to use Fastjet.
*** KtJet and CLHEP interfaces have been removed.
*** New interfaces to AcerDet and PGS available in Contrib
*** MCPWnlo distributed in Contrib
*** HepMC and Rivet interfaces moved to ThePEG
** Ticket #239: Inelastic cross-section for MinBias
This information is now available in the ...-UE.out files.
** Technical changes
*** Ticket #186
Configure now looks for ThePEG in the --prefix location first.
*** Configure information
Important configuration information is listed at the end of the
'configure' run and in the file 'config.thepeg'. Please provide
this file in any bug reports.
*** New ZERO object
The ZERO object can be used to set any dimensionful quantity to
zero. This avoids explicit constructs like 0.0*GeV.
*** Exception specifiers removed
Client code changes are needed in doinit() etc., simply remove the
exception specifier after the function name.
*** Ticket #263: Tau polarizations can be forced in TauDecayer
* Herwig++-2.3.2 release: 2009-05-08 (tagged at SVN r4249)
** SUSY enhancements
*** Ticket #245: Select inclusive / exclusive production
Using the new 'HardProcessConstructor:Processes' switch options
'SingleParticleInclusive', 'TwoParticleInclusive' or 'Exclusive'
*** Improved three-body decay generation
Several problems were fixed, incl. tickets #249 #250 #251
Thanks to J.Tattersall and K.Rolbiecki for the stress-testing!
*** Looptools fix
Release 2.3.1 had broken the Looptools initialization.
*** Improved warning message texts
** Ticket #237:
Values of q2last can now be zero where possible.
** Ticket #240:
The Herwig++ main program now correctly treats the -N flag as optional.
** Ticket #246:
Extreme pT partons fixed by improving accuracy of z boosts.
** DIS
Improved parton shower momentum reshuffling.
** Minimum Bias events
The zero-momentum interacting particle used for
bookkeeping is now labelled as a pomeron.
** User Makefile
Makefile-UserModules does not enable -pedantic anymore. User's ROOT
code will not compile otherwise.
** Build system
Small fixes in the build system.
* Herwig++-2.3.1 release: 2009-03-31 (tagged at SVN r4140)
** Initial state showers
The PDF veto was wrongly applied to qbar->qbar g splittings.
** User interaction
The Makefile-UserModules now includes the Herwig version number.
The -N flag to 'Herwig++ run' is optional now, as was always intended.
** Contrib
The contrib directory is now included in the tarball. The omission
was accidental.
** Numerical accuracy
Minor problems with values close to zero were fixed in several
locations.
** LEP event shapes
An accidental duplication was removed, they are now only calculated
once per event.
** MRST PDF code
Initialization problem fixed.
** Mac OS X
The configure script was improved to detect libraries better.
** Libtool
Updated to version 2.2.6
* Herwig++-2.3.0 release: 2008-12-02 (tagged at SVN r3939)
** Major release, with many new features and bug fixes
** Extension to lepton-hadron collisions
** Inclusion of several processes accurate at next-to-leading order
in the POsitive Weight Hardest Emission Generator (POWHEG) scheme
** Inclusion of three-body decays and finite-width effects
in BSM processes
** New procedure for reconstructing kinematics of the parton shower
based on the colour structure of the hard scattering process
** New model for baryon decays including excited baryon multiplets
** Addition of a soft component to the multiple scattering model
of the underlying event and the option to choose more than one hard
scattering explicitly
** New matrix elements for DIS and e+e- processes
** New /Contrib directory added
containing external modules that will hopefully be of use to some
users but are not expected to be needed by most users and are not
supported at the same level as the main Herwig++ code
** Minor changes to improve the physics simulation:
*** IncomingPhotonEvolver added
to allow the simulation of partonic processes with incoming photons
in hadron collisions
*** KTRapidityCut added
to allow cuts on the p_T and rapidity, rather than just the p_T and
pseudorapidity used in SimpleKTCut. This is now used by default for
cuts on massive particles such as the $W^\pm$, $Z^0$ and Higgs
bosons and the top quark
*** Several changes to the decayers of B mesons
both to resolve problems with the modelling of partonic decays and
improve agreement with $\Upsilon(4s)$ data
*** Changes to allow values other than transverse mass of final-state particles as maximum transverse momentum for radiation in parton shower
either SCALUP for Les Houches events or the scale of the hard
process for internally generated hard processes
*** Changed defaults for intrinsic transverse momentum in hadron collisions
to 1.9GeV, 2.1GeV and 2.2GeV for the Tevatron and LHC at 10 TeV and
14 TeV, respectively
*** Pdfinfo object is now created in the HepMC interface
However in order to support all versions of HepMC containing this
feature the PDF set is not specified as not all versions contain
this information
*** New option of only decaying particles with lifetimes below user specified value
*** New options for the cut-off in the shower
and some obsolete parameters removed
*** Added option of switching off certain decay modes in BSM models
*** Added a Matcher for Higgs boson
to allow cuts to be placed on it
*** Diffractive particles deleted from default input files
they were not previously used
** Technical changes:
*** Some AnalysisHandler classes comparing to LEP data have been renamed
e.g. MultiplicityCount becomes LEPMultiplicityCount to avoid
confusion with those supplied in /Contrib for observables at the
Upsilon(4s) resonance
*** Reorganisation to remove the majority of the .icc files
by moving inlined functions to headers in an effort to improve
compile time
*** Restructured the decay libraries to reduce the amount of memory allocation
and de-allocation which improves run-time performance
*** The switch to turn off LoopTools has been removed
because LoopTools is now used by several core modules. As LoopTools
does not work on 64-bit platforms with g77 this build option is not
supported
*** Removed support for obsolete version of HepMC supplied with CLHEP
and improved the support for different units options with HepMC
*** EvtGen interface has been removed until it is more stable
*** Support for ROOT has been removed
it was not previously used
*** CKKW infrastructure has been removed from the release
until a concrete implementation is available
*** Default optimisation has been increased from -O2 to -O3
*** Handling of the fortran compiler has been improved
mainly due to improvements in the autotools
*** Use of FixedAllocator for Particle objects in ThePEG has been removed
as it had no performance benefits
** Bugs fixed:
*** Problems with the mother/daughter relations in the hard process
and diagram selection in W+- and Z0 production in association with a
hard jet
*** In general matrix element code for fermion-vector to fermion-scalar
where the outgoing fermion is coloured and the scalar neutral
*** In the selection of diagrams in some associated squark gaugino processes
*** h0->mu+mu- was being generated when h0->tau+tau-
*** Normalisation in the Histogram class for non unit-weight events
*** Protection against negative PDF values has been improved
these can occur when using NLO PDF sets
*** Lifetime for BSM particles is now automatically calculated
at the same time as the width
*** Hadrons containing a top quark now treated like hadrons containing BSM particles
in order to support this possibility
*** Several ambiguous uses of unsigned int
*** Several variables that may have been used undefined
*** Several memory leaks at initialisation
*** The configuration now aborts if no fortran compiler is found
as this is required to compile Looptools
*** Several minor floating point errors that did not affect results
* Herwig++-2.2.1 release: 2008-07-09 (tagged at SVN r3434)
** Ticket #181: BSM shower with a decay close to threshold
Now fixed.
** Ticket #191: Split SUSY crash
Improved error message.
** Ticket #192: using SCALUP as the pT veto in the shower
Now implemented.
** Ticket #194: production processes of ~chi_1(2)-
Fixed bug in the diagram creation.
** Removed unused particles
DiffractiveParticles.in was removed, they were never produced.
** Hadronization
Top quark clusters now possible, handled as 'exotic' clusters.
** Improved handling of decay modes
See ThePEG-1.3.0. 'defaultparticle' command is now obsolete.
** Multi-Parton interactions
Increased phase space sampling to have less than 1% uncertainty on
average multiplicity.
** New libtool version
gfortran is now used as default if it is available. Set FC=g77 to
override this.
** Fixed several memory leaks
** Memory allocation
Now using plain 'new' and 'delete'.
* Herwig++-2.2.0 release: 2008-04-18 (tagged at SVN r3195)
** Major release: now as stand-alone library
Herwig++ is now a stand-alone dlopen() plugin to ThePEG.
No compile-time linking to Herwig code is required. The Herwig++
binary is a simple executable steering ThePEG, which can
be replaced by other frontends (such as setupThePEG / runThePEG).
** New matrix elements
p p -> W + jet / Z + jet / W + higgs / Z + higgs
e+ e- -> Z + higgs
** Looptools
Updated to version 2.2.
** Ticket #141: segfault from using 'run' command
Fixed by using default allocators in Herwig++, and the
Repository::cleanup() method in ThePEG 1.2.0.
** Ticket #157: broken gsl library path on some 64bit systems
Paths with lib64 are correctly identified now.
** Ticket #159: p_t spectrum of ttbar pair
Fixed identical particle multiplier in Sudakov form factor.
** Ticket #161: glibc segfault
Rare segfault in MPI handler fixed.
** Ticket #165: rare infinite loop in four-body decay
All 4-body decays without dedicated decayers now use the Mambo algorithm.
A loop guard has been introduced to 3-body decays to avoid infinite retries.
** Ticket #166: rare infinite loop in top ME correction
These very rare events (O(1) in 10^7) close to mass threshold
now are discarded.
** Higgs width fixes
** SatPDF
Optionally, the PDF extrapolation behaviour outside a given range
can now be specified.
** gcc 4.3
Herwig++-2.2 compiles cleanly with the new gcc 4.3 series.
* Herwig++-2.1.4 release: 2008-03-03 (tagged at SVN r3024)
** Ticket #152: Vertex positions
All vertex positions of unphysical particles are set to zero until
a fix for the previous nonsensical values can be implemented.
* Herwig++-2.1.3 release: 2008-02-25 (tagged at SVN r2957)
** Ticket #129: Baryon decays
Fix for baryon decay modes.
** Ticket #131: HepMC
Check if IO_GenEvent exists
** Ticket #134: Hadronization
Smearing of hadron directions in cluster decay fixed.
** Ticket #137: HepMC
HepMC conversion allows specification of energy and length units to
be used.
** Ticket #139: Neutral kaons
Ratio K_L / K_S corrected.
** Ticket #140 / #141: Crash on shutdown
Event generation from the 'read' stage or an interface now shuts
down cleanly. Fixes a crash bug introduced in 2.1.1 which affected
external APIs to ThePEG / Herwig.
** Ticket #146: BSM models can be disabled
To save build time, some or all of the BSM models can be disabled
using the '--enable-models' configure switch.
** Reorganised .model files
The .model files now include the model-specific particles, too.
** Re-tune
Re-tuned hadronization parameters to LEP data.
** Other fixes in
QSPAC implementation in Shower; Multi-parton interaction tuning;
MRST initialization
* Herwig++-2.1.2 release: 2008-01-05 (tagged at SVN r2694)
** Ticket #127
Thanks to a patch submitted by Fred Stober, HepMCFile now can
output event files in all supported formats.
** Ticket #128
Fixed incorrect value of pi in histogram limits.
** Other fixes in
CKKW Qtilde clusterers, BSM width cut, SUSY mixing matrices.
* Herwig++-2.1.1 release: 2007-12-08 (tagged at SVN r2589)
** Bug #123
Fixed a bug with particle lifetimes which resulted in nan for some
vertex positions.
** Secondary scatters
Fixed bug which gave intrinsic pT to secondary scatters.
** gcc abs bug detection
configure now checks for and works around
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34130
** CKKW reweighting
Fixed wrong check for top quarks.
** MPIHandler
Fixed call order ambiguity.
* Herwig++-2.1.0 release: 2007-11-20 (tagged at SVN r2542)
** Major new release
Herwig++-2.1 includes significant improvements, including
multi-parton interactions, BSM physics and a new hadronic decay
model, tuned to LEP data.
For an overview of the changes, please see the release note
arXiv:0711.3137
* Herwig++-2.0.3 release: 2007-08-21 (tagged at SVN r2101)
** Bug #90
nan in top decay ME corrections fixed.
** unlisted
Colour flow fix in LightClusterDecayer
** unlisted
Updated version of MultiplicityCount analysis handler.
* Herwig++-2.0.2 release: 2007-07-06 (tagged at SVN r1716)
** Bug #80
Separation of HepMC from CLHEP is handled properly now.
** Bug #83
Workaround for OS X header problem
** unlisted
Veto on very hard emissions from Shower.
** unlisted
Detailed documentation in .in files
* Herwig++-2.0.1 release: 2006-12-05 (tagged at SVN r1195)
** Bug #54
ClusterFissioner vertex calculation fixed.
** Bug #57
Crash when showering W+jet events supplied by Les Houches interface.
** Bug #59
Fix for #57 applied to LHC events.
** Bug #60
Segfault when PDF is set to NoPDF.
** Bug #61
Missing weight factor for I=0 mesons
** Bug #62
Spinor vertex calculations broken when spinor rep is not default rep.
** Bug #63
Top decay never produces tau.
** Bug #69
TTbar and HiggsJet analysis handlers fixed.
** unlisted
Reorganization of Hadronization module gives 30% speedup.
Thanks to Vincenzo Innocente at CMS for his profiling work!
** unlisted
cleaner automake files in include/ and src/
** unlisted
Hw64 hadron selection algorithm 'abortnow' fixed.
** unlisted
Top/LeptonDalitzAnalysis removed (only worked with modified code).
** unlisted
removed f'_0 from particle list, decays were not handled
* Herwig++-2.0.0 release: 2006-09-28 (tagged at SVN r1066)
** Full simulation of hadron collisions
diff --git a/README b/README
--- a/README
+++ b/README
@@ -1,61 +1,61 @@
==============
-Herwig++ 2.6.3
+Herwig++ 2.7.0
==============
-This is the release of Herwig++ 2.6.3, a multi purpose event
+This is the release of Herwig++ 2.7.0, a multi purpose event
generator for high energy physics.
The Herwig++ distribution contains an adapted version of LoopTools 2.6
<http://www.feynarts.de/looptools/>.
Please contact <herwig@projects.hepforge.org> to be added to our
list of users. This will allow you to make full use of the Wiki and
bug tracker at http://projects.hepforge.org/herwig/trac/
BUILD AND INSTALL
=================
Generic installation instructions are in the file INSTALL.
Before attempting to build Herwig++, you'll need to get ThePEG
installed.
Herwig++ uses some functions from the GNU scientific library GSL. The
gsl libraries and header files must be available on your system.
-Usually they can be found in a package called libgsl-dev.
+Usually they can be found in a package called libgsl-dev or gsl-devel.
------
ThePEG
------
-Download ThePEG 1.8.2 or later from
+Download ThePEG 1.9.0 or later from
http://projects.hepforge.org/herwig/versions
Do not build this package inside the Herwig++ source directory!
$ tar xjvf ThePEG-*.tar.bz2
$ cd ThePEG*
$ ./configure --prefix=/path/where/ThePEG/should/be/installed
$ make
$ make check
$ make install
Optional configure switches include --enable-unitchecks for checking
dimensional correctness of physical expressions in the code, and
--with-LHAPDF for linking against the LHAPDF library. See './configure
--help' for more details.
--------
Herwig++
--------
Download Herwig++, then
$ tar xjvf Herwig++-*.tar.bz2
$ cd Herwig++*
$ ./configure --prefix=/path/where/Herwig++/should/be/installed --with-thepeg=/path/where/ThePEG/was/installed
$ make
$ make check
$ make install
More detailed instructions can be found on the Herwig++ home page at
http://projects.hepforge.org/herwig/trac/wiki/HerwigInstallation
diff --git a/Shower/Makefile.am b/Shower/Makefile.am
--- a/Shower/Makefile.am
+++ b/Shower/Makefile.am
@@ -1,48 +1,48 @@
pkglib_LTLIBRARIES = HwShower.la
-HwShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 16:0:0
+HwShower_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 17:0:0
HwShower_la_LIBADD = \
$(top_builddir)/PDF/libHwRemDecayer.la \
$(top_builddir)/PDF/libHwMPIPDF.la
HwShower_la_SOURCES = \
UEBase.h UEBase.cc UEBase.fh \
Couplings/ShowerAlphaQCD.h Couplings/ShowerAlphaQCD.cc \
ShowerHandler.h ShowerHandler.fh ShowerHandler.cc \
SplittingFunctions/HalfHalfOneSplitFn.h SplittingFunctions/HalfHalfOneSplitFn.cc\
SplittingFunctions/OneOneOneSplitFn.h SplittingFunctions/OneOneOneSplitFn.cc\
SplittingFunctions/ZeroZeroOneSplitFn.h SplittingFunctions/ZeroZeroOneSplitFn.cc\
SplittingFunctions/OneHalfHalfSplitFn.h SplittingFunctions/OneHalfHalfSplitFn.cc\
SplittingFunctions/HalfOneHalfSplitFn.h SplittingFunctions/HalfOneHalfSplitFn.cc\
Default/QTildeSudakov.cc Default/QTildeSudakov.h\
Default/QTildeModel.cc Default/QTildeModel.h\
Default/Decay_QTildeShowerKinematics1to2.cc \
Default/Decay_QTildeShowerKinematics1to2.h \
Default/IS_QTildeShowerKinematics1to2.cc Default/IS_QTildeShowerKinematics1to2.h \
Default/FS_QTildeShowerKinematics1to2.cc Default/FS_QTildeShowerKinematics1to2.h \
Default/QTildeShowerKinematics1to2.cc Default/QTildeShowerKinematics1to2.fh\
Default/QTildeShowerKinematics1to2.h \
Default/QTildeFinder.cc Default/QTildeFinder.h\
Default/QTildeReconstructor.cc Default/QTildeReconstructor.h \
Base/KinematicsReconstructor.cc \
Base/KinematicsReconstructor.h \
Base/KinematicsReconstructor.fh \
Base/ShowerModel.cc Base/ShowerModel.h Base/ShowerModel.fh \
Base/PartnerFinder.h Base/PartnerFinder.fh Base/PartnerFinder.cc \
Base/Evolver.h Base/Evolver.fh Base/Evolver.cc \
Base/ShowerVeto.h Base/ShowerVeto.fh Base/ShowerVeto.cc
noinst_LTLIBRARIES = libHwShower.la
libHwShower_la_SOURCES = ShowerConfig.h \
Base/Branching.h \
Base/ShowerParticle.cc Base/ShowerParticle.fh Base/ShowerParticle.h \
Base/ShowerKinematics.fh Base/ShowerKinematics.h Base/ShowerKinematics.cc \
Base/ShowerTree.h Base/ShowerTree.fh Base/ShowerTree.cc \
Base/ShowerProgenitor.fh Base/ShowerProgenitor.h \
Base/HardTree.h Base/HardTree.fh Base/HardTree.cc\
Base/SudakovFormFactor.cc Base/SudakovFormFactor.h Base/SudakovFormFactor.fh \
Base/HardBranching.h Base/HardBranching.fh Base/HardBranching.cc\
Couplings/ShowerAlpha.h Couplings/ShowerAlpha.cc Couplings/ShowerAlpha.fh\
SplittingFunctions/SplittingGenerator.cc SplittingFunctions/SplittingGenerator.h\
SplittingFunctions/SplittingGenerator.fh \
SplittingFunctions/SplittingFunction.h SplittingFunctions/SplittingFunction.fh \
SplittingFunctions/SplittingFunction.cc
diff --git a/UnderlyingEvent/Makefile.am b/UnderlyingEvent/Makefile.am
--- a/UnderlyingEvent/Makefile.am
+++ b/UnderlyingEvent/Makefile.am
@@ -1,15 +1,15 @@
pkglib_LTLIBRARIES = HwUA5.la
HwUA5_la_SOURCES = UA5Handler.cc UA5Handler.h UA5Handler.icc
HwUA5_la_LDFLAGS= $(AM_LDFLAGS) -module -version-info 5:1:0
pkglib_LTLIBRARIES += HwMPI.la
HwMPI_la_SOURCES = MPISampler.cc MPISampler.h MPISampler.icc \
MPISampler.fh MPIHandler.cc \
MPIHandler.fh MPIHandler.h \
ProcessHandler.cc ProcessHandler.icc \
ProcessHandler.fh ProcessHandler.h \
MPIXSecReweighter.h MPIXSecReweighter.cc \
stat.h
-HwMPI_la_LDFLAGS= $(AM_LDFLAGS) -module -version-info 11:0:0
+HwMPI_la_LDFLAGS= $(AM_LDFLAGS) -module -version-info 12:0:0
HwMPI_la_LIBADD= $(GSLLIBS)
HwMPI_la_CPPFLAGS= $(AM_CPPFLAGS) $(GSLINCLUDE)
diff --git a/lib/Makefile.am b/lib/Makefile.am
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1,48 +1,48 @@
pkglib_LTLIBRARIES = Herwig.la
Herwig_la_SOURCES =
Herwig_la_LIBTOOLFLAGS = --tag=CXX
-Herwig_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 13:1:0
+Herwig_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 14:0:0
Herwig_la_LDFLAGS += $(THEPEGLDFLAGS) $(FCLIBS)
Herwig_la_LIBADD = \
$(top_builddir)/Hadronization/libHwHadronization.la \
$(top_builddir)/Models/StandardModel/libHwStandardModel.la \
$(top_builddir)/Decay/libHwDecay.la \
$(top_builddir)/Decay/FormFactors/libHwFormFactor.la \
$(top_builddir)/Decay/Radiation/libHwDecRad.la \
$(top_builddir)/Utilities/libHwUtils.la \
$(top_builddir)/Models/General/libHwModelGenerator.la \
$(top_builddir)/Decay/General/libHwGeneralDecay.la \
$(top_builddir)/MatrixElement/General/libHwGeneralME.la \
$(top_builddir)/MatrixElement/libHwME.la \
$(top_builddir)/Decay/WeakCurrents/libHwWeakCurrent.la \
$(top_builddir)/Looptools/libHwLooptools.la \
$(top_builddir)/Shower/libHwShower.la \
$(THEPEGLIB) -ldl
-noinst_SCRIPT = fix-osx-path
+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
if test ! -L Herwig++ ; then $(LN_S) -f . Herwig++ ; fi
find $(top_builddir) \( -name '*.so.*' -or -name '*.so' \) \
-not -name 'lib*' -not -path '$(top_builddir)/lib/*' \
-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/Makefile.am b/src/Makefile.am
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,190 +1,193 @@
SUBDIRS = defaults
AUTOMAKE_OPTIONS = -Wno-portability
defaultsdir = ${pkgdatadir}/defaults
bin_PROGRAMS = Herwig++
Herwig___SOURCES = Herwig++.cc herwigopts.c herwigopts.h
BUILT_SOURCES = herwigopts.c herwigopts.h
Herwig___LDFLAGS = $(AM_LDFLAGS) -export-dynamic $(THEPEGLDFLAGS)
Herwig___LDADD = $(THEPEGLIB) -ldl
Herwig___CPPFLAGS = $(AM_CPPFLAGS) \
-DHERWIG_PKGDATADIR="\"$(pkgdatadir)\"" \
-DHERWIG_PKGLIBDIR="\"$(pkglibdir)\"" \
-DTHEPEG_PKGLIBDIR="\"$(THEPEGPATH)/lib/ThePEG\""
bin_SCRIPTS = herwig-config
HELPERFILES = CMSSM40.1.1.slha RPV3.1.slha NMSSM.spc \
ADD.model \
Leptoquark.model \
LH.model \
LHTP.model \
MSSM.model \
MUED.model \
NMSSM.model \
RPV-Bi.model \
RPV-Tri.model \
RS.model \
Sextet.model \
TTBA.model \
Zprime.model \
RPV-BI.slha \
RPV-TRI.slha \
RPV-UDD.slha
INPUTFILES = \
DIS.in \
DIS-Matchbox.in \
GammaGamma.in \
ILC.in \
ILC-MSSM.in \
ILC-MUED.in \
ILC-RS.in \
LEP.in \
LEP-Matchbox.in \
LHC-ADD.in \
LHC-diffractive.in \
LHC-GammaGamma.in \
LHC.in \
LHC-Matchbox.in \
LHC-LQ.in \
LHC-MSSM.in \
LHC-MUED.in \
LHC-NMSSM.in \
LHC-Powheg.in \
LHC-RPV.in \
LHC-RS.in \
LHC-Sextet.in \
LHC-TRP.in \
LHC-TTBA.in \
LHC-MB.in \
LHC-ZP.in \
TVT.in \
TVT-Matchbox.in \
TVT-Powheg.in \
TVT-TTBA.in \
LHC-LH.in \
LHC-LHTP.in
dist_pkgdata_DATA = $(INPUTFILES) $(HELPERFILES)
pkgdata_DATA = Makefile-UserModules
CLEANFILES = HerwigDefaults.rpo \
*.run *.log *.out *.tex \
multi.test *.output probs.test chisq.value \
LHC-RS-BR.spc LHC-MSSM-BR.spc LHC-RPV-BR.spc
## checking targets ##
HerwigDefaults.rpo: Herwig++ $(srcdir)/defaults/*.in defaults/PDF.in defaults/Analysis.in $(top_builddir)/lib/*.so
./Herwig++ init -L$(top_builddir)/lib defaults/HerwigDefaults.in -D
check_BSM_Full=
check_BSM=
if WANT_BSM
check_BSM += check-LHC-RPV check-LHC-RS
check_BSM_Full += \
check-LHC-RPV check-LHC-MSSM check-ILC-MSSM \
check-LHC-NMSSM \
check-LHC-MUED check-ILC-MUED \
check-LHC-RS check-ILC-RS check-LHC-ADD \
check-LHC-LH check-LHC-LHTP \
check-LHC-TRP \
check-LHC-TTBA check-TVT-TTBA \
check-LHC-ZP \
check-LHC-LQ \
check-LHC-Sextet
endif
check-local: check-LEP check-LHC $(check_BSM) check-DIS check-ILC check-GammaGamma check-LHC-Powheg
check-Powheg: check-LHC-Powheg check-TVT-Powheg
check-BSM: $(check_BSM_Full)
check_Matchbox=
if WANT_DIPOLE
check_Matchbox += \
check-LEP-Matchbox check-DIS-Matchbox check-LHC-Matchbox check-TVT-Matchbox
endif
check-Matchbox: $(check_Matchbox)
check-extra: check-LHC-diffractive check-LHC-GammaGamma check-LHC-MB check-TVT
check-all: check-local check-Powheg check-BSM check-Matchbox check-extra
link-helper-files:
@for i in $(HELPERFILES); do \
if test -f $(srcdir)/$$i -a ! -e $$i; then \
$(LN_S) -f $(srcdir)/$$i; fi; done
CHECKCOMMAND = ./Herwig++ run $(notdir $(subst .in,.run,$<)) -N500 -d1 -D
check-%: $(srcdir)/%.in HerwigDefaults.rpo link-helper-files
./Herwig++ read $< -D
@echo $(CHECKCOMMAND)
@$(CHECKCOMMAND) && echo "# $@ OK #" \
|| (echo "###### $@ BAD ######"; false)
## valgrind targets ##
VALGRIND=valgrind --leak-check=full --num-callers=25 --freelist-vol=100000000 --leak-resolution=med --trace-children=yes
valgrind: valgrind-init valgrind-read valgrind-run
valgrind-init:
$(VALGRIND) ./Herwig++ init -d1 -D -L$(top_builddir)/lib defaults/HerwigDefaults.in \
&> /tmp/valgrind-init.log
valgrind-read:
$(VALGRIND) ./Herwig++ read -d1 -D LHC.in &> /tmp/valgrind-read.log
valgrind-run:
$(VALGRIND) ./Herwig++ run -d1 -D -N5 LHC.run &> /tmp/valgrind-run.log
SETUPTHEPEG=$(THEPEGPATH)/bin/setupThePEG
THEPEGREPO=$(THEPEGPATH)/lib/ThePEG/ThePEGDefaults.rpo
install-data-hook:
@echo Creating repository
@./Herwig++ init -L$(DESTDIR)$(pkglibdir) -i$(DESTDIR)$(pkgdatadir) $(DESTDIR)$(defaultsdir)/HerwigDefaults.in --repo=$(DESTDIR)$(pkgdatadir)/HerwigDefaults.rpo
- @if test -n "$(DESTDIR)"; then sed -i -e "s@$(DESTDIR)@@g" $(DESTDIR)$(pkgdatadir)/HerwigDefaults.rpo; fi
+ @if test -n "$(DESTDIR)"; \
+ then sed -i.bak -e "s@$(DESTDIR)@@g" $(DESTDIR)$(pkgdatadir)/HerwigDefaults.rpo; \
+ rm -f $(DESTDIR)$(pkgdatadir)/HerwigDefaults.rpo.bak; \
+ fi
uninstall-hook:
rm -f $(DESTDIR)$(pkgdatadir)/HerwigDefaults.rpo
register: register-with-thepeg-repo
register-with-thepeg-repo:
@if test -x "$(SETUPTHEPEG)" -a -w "$(THEPEGREPO)"; \
then echo Registering with ThePEG; \
"$(SETUPTHEPEG)" --init \
$(DESTDIR)$(defaultsdir)/HerwigDefaults.in \
-r "$(THEPEGREPO)" -o "$(THEPEGREPO)" \
-i $(DESTDIR)$(pkgdatadir) \
-l$(DESTDIR)$(pkglibdir) ; \
if test -n "$(DESTDIR)"; \
then sed -i -e "s@$(DESTDIR)@@g" "$(THEPEGREPO)" ; fi ; \
fi
unregister : unregister-from-thepeg-repo
unregister-from-thepeg-repo:
@if test -x "$(SETUPTHEPEG)" -a -w "$(THEPEGREPO)"; \
then echo Unregistering with ThePEG; \
"$(SETUPTHEPEG)" --init defaults/HerwigCleanup.in \
-r "$(THEPEGREPO)" -o "$(THEPEGREPO)" \
-l$(DESTDIR)$(pkglibdir) ; \
fi
EXTRA_DIST = herwigopts.ggo
GENGETOPT = gengetopt
%opts.h %opts.c : %opts.ggo
$(GENGETOPT) < $<
diff --git a/src/defaults/DipoleShowerParameters-NLO.in b/src/defaults/DipoleShowerParameters-NLO.in
--- a/src/defaults/DipoleShowerParameters-NLO.in
+++ b/src/defaults/DipoleShowerParameters-NLO.in
@@ -1,155 +1,155 @@
################################################################################
# Setup the dipole shower parameters
################################################################################
cd /Herwig/DipoleShower
################################################################################
# setup alphas and PDFs
################################################################################
cp NLOAlphaS AlphaS
-set AlphaS:input_alpha_s 0.1281179
+set AlphaS:input_alpha_s 0.1271103
set AlphaS:freezing_scale 0.0*GeV
set /Herwig/Model:QCD/RunningAlphaS AlphaS
set /Herwig/Partons/PDFSet:PDFName CT10.LHgrid
################################################################################
# matching parameters
################################################################################
-set /Herwig/MatrixElements/Matchbox/MEMatching:FFPtCut 1.045505*GeV
+set /Herwig/MatrixElements/Matchbox/MEMatching:FFPtCut 1.014259*GeV
set /Herwig/MatrixElements/Matchbox/MEMatching:FFScreeningScale 0.0*GeV
set /Herwig/MatrixElements/Matchbox/MEMatching:FIPtCut 1.0*GeV
set /Herwig/MatrixElements/Matchbox/MEMatching:FIScreeningScale 0.0*GeV
set /Herwig/MatrixElements/Matchbox/MEMatching:IIPtCut 1.0*GeV
set /Herwig/MatrixElements/Matchbox/MEMatching:IIScreeningScale 0.0*GeV
-set /Herwig/MatrixElements/Matchbox/DipoleMatching:FFPtCut 1.045505*GeV
+set /Herwig/MatrixElements/Matchbox/DipoleMatching:FFPtCut 1.014259*GeV
set /Herwig/MatrixElements/Matchbox/DipoleMatching:FFScreeningScale 0.0*GeV
set /Herwig/MatrixElements/Matchbox/DipoleMatching:FIPtCut 1.0*GeV
set /Herwig/MatrixElements/Matchbox/DipoleMatching:FIScreeningScale 0.0*GeV
set /Herwig/MatrixElements/Matchbox/DipoleMatching:IIPtCut 1.0*GeV
set /Herwig/MatrixElements/Matchbox/DipoleMatching:IIScreeningScale 0.0*GeV
################################################################################
# shower parameters
################################################################################
set DipoleShowerHandler:GlobalAlphaS AlphaS
set DipoleShowerHandler:EvolutionOrdering ChainPtOrdering
set IntrinsicPtGenerator:ValenceIntrinsicPtScale 1.26905*GeV
set IntrinsicPtGenerator:SeaIntrinsicPtScale 1.1613*GeV
cd /Herwig/DipoleShower/Kinematics
-set FFLightKinematics:IRCutoff 1.045505*GeV
+set FFLightKinematics:IRCutoff 1.014259*GeV
set FILightKinematics:IRCutoff 1.0*GeV
set IFLightKinematics:IRCutoff 1.0*GeV
set IILightKinematics:IRCutoff 1.0*GeV
################################################################################
# shower parameters at boundary to non-perturbative domain
################################################################################
-set /Herwig/Particles/g:ConstituentMass 0.747233*GeV
+set /Herwig/Particles/g:ConstituentMass 0.7899848*GeV
cd /Herwig/DipoleShower/Kernels
set FFgx2ggxDipoleKernel:ScreeningScale 0.0*GeV
set FFqx2qgxDipoleKernel:ScreeningScale 0.0*GeV
set FFgx2uuxDipoleKernel:ScreeningScale 0.0*GeV
set FFgx2ddxDipoleKernel:ScreeningScale 0.0*GeV
set FFgx2ssxDipoleKernel:ScreeningScale 0.0*GeV
set FFgx2ccxDipoleKernel:ScreeningScale 0.0*GeV
set FFgx2bbxDipoleKernel:ScreeningScale 0.0*GeV
set FIgx2ggxDipoleKernel:ScreeningScale 0.0*GeV
set FIqx2qgxDipoleKernel:ScreeningScale 0.0*GeV
set FIgx2uuxDipoleKernel:ScreeningScale 0.0*GeV
set FIgx2ddxDipoleKernel:ScreeningScale 0.0*GeV
set FIgx2ssxDipoleKernel:ScreeningScale 0.0*GeV
set FIgx2ccxDipoleKernel:ScreeningScale 0.0*GeV
set FIgx2bbxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2ggxDipoleKernel:ScreeningScale 0.0*GeV
set IFqx2qgxDipoleKernel:ScreeningScale 0.0*GeV
set IFqx2gqxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2uubarxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2ubaruxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2ddbarxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2dbardxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2ssbarxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2sbarsxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2ccbarxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2cbarcxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2bbbarxDipoleKernel:ScreeningScale 0.0*GeV
set IFgx2bbarbxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2ggxDipoleKernel:ScreeningScale 0.0*GeV
set IIqx2qgxDipoleKernel:ScreeningScale 0.0*GeV
set IIqx2gqxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2uubarxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2ubaruxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2ddbarxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2dbardxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2ssbarxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2sbarsxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2ccbarxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2cbarcxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2bbbarxDipoleKernel:ScreeningScale 0.0*GeV
set IIgx2bbarbxDipoleKernel:ScreeningScale 0.0*GeV
################################################################################
# hadronization parameters
################################################################################
cd /Herwig/Hadronization
-set ClusterFissioner:ClMaxLight 3.209052*GeV
-set ClusterFissioner:ClPowLight 1.0
-set ClusterFissioner:PSplitLight 0.7023353
+set ClusterFissioner:ClMaxLight 3.274090*GeV
+set ClusterFissioner:ClPowLight 10.0
+set ClusterFissioner:PSplitLight 0.7183601
set ClusterDecayer:ClDirLight 1
set ClusterDecayer:ClSmrLight 3.118342
-set ClusterFissioner:ClMaxCharm 3.209052*GeV
-set ClusterFissioner:ClPowCharm 1.0
-set ClusterFissioner:PSplitCharm 0.7023353
+set ClusterFissioner:ClMaxCharm 3.274090*GeV
+set ClusterFissioner:ClPowCharm 10.0
+set ClusterFissioner:PSplitCharm 0.7183601
set ClusterDecayer:ClDirCharm 1
set ClusterDecayer:ClSmrCharm 3.118342
set LightClusterDecayer:SingleHadronLimitCharm 0.0
-set ClusterFissioner:ClMaxBottom 3.209052*GeV
-set ClusterFissioner:ClPowBottom 1.0
-set ClusterFissioner:PSplitBottom 0.7023353
+set ClusterFissioner:ClMaxBottom 3.274090*GeV
+set ClusterFissioner:ClPowBottom 10.0
+set ClusterFissioner:PSplitBottom 0.7183601
set ClusterDecayer:ClDirBottom 1
set ClusterDecayer:ClSmrBottom 3.118342
set LightClusterDecayer:SingleHadronLimitBottom 0.0
set HadronSelector:PwtUquark 1.0
set HadronSelector:PwtDquark 1.0
set HadronSelector:PwtSquark 1.0
set HadronSelector:PwtCquark 1.0
set HadronSelector:PwtBquark 1.0
set HadronSelector:PwtDIquark 1.0
set HadronSelector:SngWt 1.0
set HadronSelector:DecWt 1.0
cd /

File Metadata

Mime Type
text/x-diff
Expires
Sat, Dec 21, 4:22 PM (21 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4023431
Default Alt Text
(367 KB)

Event Timeline