Page MenuHomeHEPForge

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/Changes-API.md b/Changes-API.md
index eb61cf5..8bc5826 100644
--- a/Changes-API.md
+++ b/Changes-API.md
@@ -1,70 +1,73 @@
# Changelog for HEJ API
This log lists only changes on the HEJ API. These are primarily code changes
relevant for calling HEJ as an API. This file should only be read as an addition
to `Changes.md`, where the main features are documented.
## Version 2.X
### 2.X.0
* Made `MatrixElement.tree_kin(...)` and `MatrixElement.tree_param(...)` public
* New class `CrossSectionAccumulator` to keep track of Cross Section of the
different subproccess
* New template struct `Parameters` similar to old `Weights`
- `Weights` are now an alias for `Parameters<double>`. Calling `Weights` did
not change
- `Weights.hh` was replaced by `Parameters.hh`. The old `Weights.hh` header
will be removed in HEJ Version 2.2.0
* Function to multiplication and division of `EventParameters.weight` by double
- This can be combined with `Parameters`, e.g.
`Parameters<EventParameters>*Weights`, see also `Events.parameters()`
- Moved `EventParameters` to `Parameters.hh` header
* Restructured `Event` class
- `Event` can now only be build from a (new) `Event::EventData` class
- Removed default constructor for `Event`
- `Event::EventData` replaces the old `UnclusteredEvent` struct.
- `UnclusteredEvent` is now deprecated, and will be removed in HEJ Version
2.3.0
- Removed `Event.unclustered()` function
- Added new member function `Events.parameters()`, to directly access
(underlying) `Parameters<EventParameters>`
- New member functions `begin_partons`, `end_partons` with aliases
`cbegin_partons`, `cend_partons` for constant iterators over
outgoing partons.
* New function `Event::EventData.reconstruct_intermediate()` to reconstruct
bosons from decays, e.g. `positron + nu_e => Wp`
* Added optional Colour charges to particles (`Particle.colour`)
- Colour connection in the HEJ limit can be generated via
`Event.generate_colours` (automatically done in the resummation)
* New abstact `EventReader` class, as base for reading events from files
- Moved LHE file reader to `HEJ::LesHouchesReader`
- New `HEJ::HDF5Reader` to read `hdf5` files
* New function `Analysis.initialise(LHEF::HEPRUP const &)` to pass `HEPRUP` to
the analysis.
* Renamed `EventType::nonHEJ` to `EventType::non_resummable` and `is_HEJ()`
to `is_resummable()` such that Run card is consistent with internal workings
+* new class `EWConstants` replaces previously hardcoded `vev`
+ - `EWConstants` have to be set in the general `config` and the
+ `MatrixElementConfig`
* Replaced `HepMCInterface` and `HepMCWriter` by `HepMCInterfaceX` and
`HepMCWriterX` respectivly, with `X` being the major version of HepMC (2 or 3)
## Version 2.0
### 2.0.5
* no further changes to API
### 2.0.4
* Fixed wrong path of `HEJ_INCLUDE_DIR` in `hej-config.cmake`
### 2.0.3
* no further changes to API
### 2.0.2
* no further changes to API
### 2.0.1
* no further changes to API
diff --git a/Changes.md b/Changes.md
index 758d3e1..6685a19 100644
--- a/Changes.md
+++ b/Changes.md
@@ -1,61 +1,67 @@
# Changelog
This is the log for changes to the HEJ program. Further changes to the HEJ API
are documented in `Changes-API.md`. If you are using HEJ as a library, please
also read the changes there.
## Version 2.X
### 2.X.0
* Resummation for W bosons with jets
- New subleading processes `extremal qqx` & `central qqx` for a quark and
anti-quark in the final state, e.g. `g g => u d_bar Wm g` (the other
subleading processes also work with W's)
- `HEJFOG` can generate mutliple jets together with a (off-shell) W bosons
decaying into lepton & neutrino
* Resummation can now be performed on `unordered` subleading processes
in pure jets.
* Allow multiplication and division of multiple scale functions e.g.
`H_T/2*m_j1j2`
* Print cross sections at end of run
* Follow HepMC convention for particle Status codes: incoming = 11,
decaying = 2, outgoing = 1 (unchanged)
* Partons now have a Colour charge
- Colours are read from and written to LHE files
- For reweighted events the colours are created according to leading colour in
the FKL limit
* Grouped `event treatment` for subleading channels together in runcard
- Rename `non-HEJ` processes to `non-resummable`
+* Read electro-weak constants from input
+ - new mandatory setting `vev` to change vacuum expectation value
+ - new mandatory settings `particle properties` to specify mass & width of
+ bosons
+ - FOG: decays are now specified in `decays` setting (previously under
+ `particle properties`)
* Allow changing the regulator lambda in input (`regulator parameter`, only for
advanced users)
* Use `git-lfs` for raw data in test (`make test` now requires `git-lfs`)
* Added support to read `hdf5` event files suggested in
[arXiv:1905.05120](https://arxiv.org/abs/1905.05120) (needs
[HighFive](https://github.com/BlueBrain/HighFive))
* Support input with avarage weight equal to the cross section (`IDWTUP=1 or 4`)
* Dropped support for HepMC 3.0.0, either HepMC version 2 or >3.1 is required
- It is now possible to write out both HepMC 2 and HepMC 3 events at the same
time
## 2.0.5
* Fixed event classification for input not ordered in rapidity
### 2.0.4
* Fixed wrong path of `HEJ_INCLUDE_DIR` in `hej-config.cmake`
### 2.0.3
* Fixed parsing of (numerical factor) * (base scale) in configuration
* Don't change scale names, but sanitise Rivet output file names instead
### 2.0.2
* Changed scale names to `"_over_"` and `"_times_"` for proper file names (was
`"/"` and `"*"` before)
### 2.0.1
* Fixed name of fixed-order generator in error message.
diff --git a/FixedOrderGen/configFO.yml b/FixedOrderGen/configFO.yml
index cf3fc4a..6b9bfb7 100644
--- a/FixedOrderGen/configFO.yml
+++ b/FixedOrderGen/configFO.yml
@@ -1,79 +1,84 @@
## number of generated events
events: 200
jets:
min pt: 20
peak pt: 30
algorithm: antikt
R: 0.4
max rapidity: 5
beam:
energy: 6500
particles: [p, p]
pdf: 230000
process: p p => h 4j
## fraction of events with two extremal emissions in one direction
## that contain an subleading emission e.g. unordered emission
subleading fraction: 0.00
## Allow different subleading configurations
## By default all implemented processes are allowed.
#
# subleading channels:
# - unordered
# - qqx
scales: max jet pperp
event output:
- HEJFO.lhe
# - HEJFO_events.hepmc
+# Vacuum expectation value
+vev: 246.2196508
+
particle properties:
Higgs:
mass: 125
width: 0.004165
- decays: {into: [photon, photon], branching ratio: 0.0023568762400521404}
- Wp:
- mass: 80.385
- width: 2.085
- decays: {into: [e+, nu_e], branching ratio: 1}
- Wm:
+ W:
mass: 80.385
width: 2.085
- decays: {into: [e-, nu_e_bar], branching ratio: 1}
+ Z:
+ mass: 91.187
+ width: 2.495
random generator:
name: mixmax
# seed: 1
+decays:
+ Higgs: {into: [photon, photon], branching ratio: 0.0023568762400521404}
+ Wp: {into: [e+, nu_e], branching ratio: 1}
+ Wm: {into: [e-, nu_e_bar]} # equivalent to "branching ratio: 1"
+
## unweighting parameters
## remove to obtain weighted events
# unweight:
# sample size: 200 # should be similar to "events:", but not more than ~10000
# max deviation: 0
## to use a rivet analysis
#
# analysis:
# rivet: MC_XS # rivet analysis name
# output: HEJ # name of the yoda files, ".yoda" and scale suffix will be added
#
## to use a custom analysis
#
# analysis:
# plugin: /path/to/libmyanalysis.so
# my analysis parameter: some value
## parameters for Higgs-gluon couplings
## this requires compilation with qcdloop
#
# Higgs coupling:
# use impact factors: false
# mt: 174
# include bottom: true
# mb: 4.7
diff --git a/FixedOrderGen/include/Decay.hh b/FixedOrderGen/include/Decay.hh
index 05d9c75..f6d3ec8 100644
--- a/FixedOrderGen/include/Decay.hh
+++ b/FixedOrderGen/include/Decay.hh
@@ -1,16 +1,27 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#pragma once
-#include "HEJ/PDG_codes.hh"
+#include <unordered_map>
#include <vector>
+#include "HEJ/PDG_codes.hh"
+
namespace HEJFOG{
struct Decay{
std::vector<HEJ::ParticleID> products;
double branching_ratio;
};
+ #if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ < 6)
+ // gcc version < 6 explicitly needs hash function for enum
+ // see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60970
+ using ParticlesDecayMap
+ = std::unordered_map<HEJ::ParticleID, std::vector<Decay>, std::hash<int>>;
+ #else
+ using ParticlesDecayMap
+ = std::unordered_map<HEJ::ParticleID, std::vector<Decay>>;
+ #endif
}
diff --git a/FixedOrderGen/include/EventGenerator.hh b/FixedOrderGen/include/EventGenerator.hh
index 896f0f6..e345a81 100644
--- a/FixedOrderGen/include/EventGenerator.hh
+++ b/FixedOrderGen/include/EventGenerator.hh
@@ -1,62 +1,65 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#pragma once
#include "HEJ/MatrixElement.hh"
#include "HEJ/optional.hh"
#include "HEJ/PDF.hh"
#include "HEJ/RNG.hh"
#include "Beam.hh"
+#include "Decay.hh"
#include "JetParameters.hh"
-#include "ParticleProperties.hh"
#include "Process.hh"
#include "Status.hh"
namespace HEJ{
class Event;
class HiggsCouplingSettings;
class ScaleGenerator;
+ class EWConstants;
}
//! Namespace for HEJ Fixed Order Generator
namespace HEJFOG{
class EventGenerator{
public:
EventGenerator(
Process process,
Beam beam,
HEJ::ScaleGenerator scale_gen,
JetParameters jets,
int pdf_id,
double subl_change,
unsigned int subl_channels,
- ParticlesPropMap particles_properties,
+ ParticlesDecayMap particle_decays,
HEJ::HiggsCouplingSettings Higgs_coupling,
+ HEJ::EWConstants ew_parameters,
HEJ::RNG & ran
);
HEJ::optional<HEJ::Event> gen_event();
Status status() const {
return status_;
}
private:
HEJ::PDF pdf_;
HEJ::MatrixElement ME_;
HEJ::ScaleGenerator scale_gen_;
Process process_;
JetParameters jets_;
Beam beam_;
Status status_;
double subl_change_;
unsigned int subl_channels_;
- ParticlesPropMap particles_properties_;
+ ParticlesDecayMap particle_decays_;
+ HEJ::EWConstants ew_parameters_;
std::reference_wrapper<HEJ::RNG> ran_;
};
}
diff --git a/FixedOrderGen/include/ParticleProperties.hh b/FixedOrderGen/include/ParticleProperties.hh
deleted file mode 100644
index d38a0ec..0000000
--- a/FixedOrderGen/include/ParticleProperties.hh
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * \authors The HEJ collaboration (see AUTHORS for details)
- * \date 2019
- * \copyright GPLv2 or later
- */
-#pragma once
-
-#include <vector>
-#include <unordered_map>
-
-#include "Decay.hh"
-
-namespace HEJFOG{
- struct ParticleProperties{
- double mass;
- double width;
- std::vector<Decay> decays;
- };
- #if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ < 6)
- // gcc version < 6 explicitly needs hash function for enum
- // see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60970
- using ParticlesPropMap
- = std::unordered_map<HEJ::ParticleID, ParticleProperties, std::hash<int>>;
- #else
- using ParticlesPropMap
- = std::unordered_map<HEJ::ParticleID, ParticleProperties>;
- #endif
-}
diff --git a/FixedOrderGen/include/PhaseSpacePoint.hh b/FixedOrderGen/include/PhaseSpacePoint.hh
index 3fc11b9..16bcd9d 100644
--- a/FixedOrderGen/include/PhaseSpacePoint.hh
+++ b/FixedOrderGen/include/PhaseSpacePoint.hh
@@ -1,225 +1,230 @@
/** \file PhaseSpacePoint.hh
* \brief Contains the PhaseSpacePoint Class
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#pragma once
#include <bitset>
#include <vector>
#include "HEJ/Event.hh"
#include "HEJ/Particle.hh"
#include "HEJ/PDF.hh"
#include "HEJ/PDG_codes.hh"
#include "HEJ/RNG.hh"
#include "JetParameters.hh"
-#include "ParticleProperties.hh"
+#include "Decay.hh"
#include "Status.hh"
+namespace HEJ{
+ class EWConstants;
+}
+
namespace HEJFOG{
class Process;
using HEJ::Particle;
//! A point in resummation phase space
class PhaseSpacePoint{
public:
//! Default PhaseSpacePoint Constructor
- PhaseSpacePoint() = default;
+ PhaseSpacePoint() = delete;
//! PhaseSpacePoint Constructor
/**
* @param proc The process to generate
* @param jet_properties Jet defintion & cuts
* @param pdf The pdf set (used for sampling)
* @param E_beam Energie of the beam
* @param subl_chance Chance to turn a potentially unordered
* emission into an actual one
* @param subl_channels Possible subleading channels.
* see HEJFOG::Subleading
* @param particle_properties Properties of producted boson
*
* Initially, only FKL phase space points are generated. subl_chance gives
* the change of turning one emissions into a subleading configuration,
* i.e. either unordered or central quark/anti-quark pair. Unordered
* emissions require that the most extremal emission in any direction is
* a quark or anti-quark and the next emission is a gluon. Quark/anti-quark
* pairs are only generated for W processes. At most one subleading
* emission will be generated in this way.
*/
PhaseSpacePoint(
Process const & proc,
JetParameters const & jet_properties,
HEJ::PDF & pdf, double E_beam,
double subl_chance,
unsigned int subl_channels,
- ParticlesPropMap const & particles_properties,
+ ParticlesDecayMap const & particle_decays,
+ HEJ::EWConstants const & ew_parameters,
HEJ::RNG & ran
);
//! Get Weight Function
/**
* @returns Weight of Event
*/
double weight() const{
return weight_;
}
Status status() const{
return status_;
}
//! Get Incoming Function
/**
* @returns Incoming Particles
*/
std::array<Particle, 2> const & incoming() const{
return incoming_;
}
//! Get Outgoing Function
/**
* @returns Outgoing Particles
*/
std::vector<Particle> const & outgoing() const{
return outgoing_;
}
std::unordered_map<size_t, std::vector<Particle>> const & decays() const{
return decays_;
}
private:
/**
* @internal
* @brief Generate LO parton momentum
*
* @param count Number of partons to generate
* @param is_pure_jets If true ensures momentum conservation in x and y
* @param jet_param Jet properties to fulfil
* @param max_pt max allowed pt for a parton (typically E_CMS)
* @param ran Random Number Generator
*
* @returns Momentum of partons
*
* Ensures that each parton is in its own jet.
* Generation is independent of parton flavour. Output is sorted in rapidity.
*/
std::vector<fastjet::PseudoJet> gen_LO_partons(
int count, bool is_pure_jets,
JetParameters const & jet_param,
double max_pt,
HEJ::RNG & ran
);
Particle gen_boson(
HEJ::ParticleID bosonid, double mass, double width,
HEJ::RNG & ran
);
template<class ParticleMomenta>
fastjet::PseudoJet gen_last_momentum(
ParticleMomenta const & other_momenta,
double mass_square, double y
) const;
bool jets_ok(
std::vector<fastjet::PseudoJet> const & Born_jets,
std::vector<fastjet::PseudoJet> const & partons
) const;
/**
* @internal
* @brief Generate incoming partons according to the PDF
*
* @param uf Scale used in the PDF
*/
void reconstruct_incoming(
Process const & proc, unsigned int subl_channels,
HEJ::PDF & pdf, double E_beam,
double uf,
HEJ::RNG & ran
);
/**
* @internal
* @brief Returns list of all allowed initial states partons
*/
std::array<std::bitset<11>,2> filter_partons(
Process const & proc, unsigned int const subl_channels,
HEJ::RNG & ran
);
HEJ::ParticleID generate_incoming_id(
size_t beam_idx, double x, double uf, HEJ::PDF & pdf,
std::bitset<11> allowed_partons, HEJ::RNG & ran
);
bool momentum_conserved(double ep) const;
HEJ::Particle const & most_backward_FKL(
std::vector<HEJ::Particle> const & partons
) const;
HEJ::Particle const & most_forward_FKL(
std::vector<HEJ::Particle> const & partons
) const;
HEJ::Particle & most_backward_FKL(std::vector<HEJ::Particle> & partons) const;
HEJ::Particle & most_forward_FKL(std::vector<HEJ::Particle> & partons) const;
bool extremal_FKL_ok(
std::vector<fastjet::PseudoJet> const & partons
) const;
double random_normal(double stddev, HEJ::RNG & ran);
/**
* @internal
* @brief Turns a FKL configuration into a subleading one
*
* @param chance Change to switch to subleading configuration
* @param channels Allowed channels for subleading process
* @param proc Process to decide which subleading
* configurations are allowed
*
* With a chance of "chance" the FKL configuration is either turned into
* a unordered configuration or, for A/W/Z bosons, a configuration with
* a central quark/anti-quark pair.
*/
void maybe_turn_to_subl(double chance, unsigned int channels,
Process const & proc, HEJ::RNG & ran);
void turn_to_uno(bool can_be_uno_backward, bool can_be_uno_forward, HEJ::RNG & ran);
void turn_to_qqx(bool allow_strange, HEJ::RNG & ran);
//! decay where we select the decay channel
std::vector<Particle> decay_boson(
HEJ::Particle const & parent,
std::vector<Decay> const & decays,
HEJ::RNG & ran
);
//! generate decay products of a boson
std::vector<Particle> decay_boson(
HEJ::Particle const & parent,
std::vector<HEJ::ParticleID> const & decays,
HEJ::RNG & ran
);
/// @brief setup outgoing partons to ensure correct coupling to boson
void couple_boson(HEJ::ParticleID boson, HEJ::RNG & ran);
Decay select_decay_channel(
std::vector<Decay> const & decays,
HEJ::RNG & ran
);
double gen_hard_pt(
int np, double ptmin, double ptmax, double y,
HEJ::RNG & ran
);
double gen_soft_pt(int np, double ptmax, HEJ::RNG & ran);
double gen_parton_pt(
int count, JetParameters const & jet_param, double ptmax, double y,
HEJ::RNG & ran
);
double weight_;
Status status_;
std::array<Particle, 2> incoming_;
std::vector<Particle> outgoing_;
//! Particle decays in the format {outgoing index, decay products}
std::unordered_map<size_t, std::vector<Particle>> decays_;
};
HEJ::Event::EventData to_EventData(PhaseSpacePoint const & psp);
}
diff --git a/FixedOrderGen/include/config.hh b/FixedOrderGen/include/config.hh
index 71c748b..d302168 100644
--- a/FixedOrderGen/include/config.hh
+++ b/FixedOrderGen/include/config.hh
@@ -1,43 +1,45 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#pragma once
#include "yaml-cpp/yaml.h"
#include "HEJ/HiggsCouplingSettings.hh"
#include "HEJ/optional.hh"
#include "HEJ/config.hh"
#include "HEJ/output_formats.hh"
#include "HEJ/exceptions.hh"
+#include "HEJ/EWConstants.hh"
-#include "Process.hh"
-#include "JetParameters.hh"
#include "Beam.hh"
-#include "ParticleProperties.hh"
+#include "Decay.hh"
+#include "JetParameters.hh"
+#include "Process.hh"
#include "UnweightSettings.hh"
namespace HEJFOG{
struct Config{
Process process;
int events;
JetParameters jets;
Beam beam;
int pdf_id;
double subleading_fraction;
unsigned int subleading_channels; //! < see HEJFOG::Subleading
- ParticlesPropMap particles_properties;
+ ParticlesDecayMap particle_decays;
YAML::Node analysis_parameters;
HEJ::ScaleConfig scales;
std::vector<HEJ::OutputFile> output;
HEJ::RNGConfig rng;
HEJ::HiggsCouplingSettings Higgs_coupling;
+ HEJ::EWConstants ew_parameters;
HEJ::optional<UnweightSettings> unweight;
};
Config load_config(std::string const & config_file);
}
diff --git a/FixedOrderGen/src/EventGenerator.cc b/FixedOrderGen/src/EventGenerator.cc
index da0f2a5..8058577 100644
--- a/FixedOrderGen/src/EventGenerator.cc
+++ b/FixedOrderGen/src/EventGenerator.cc
@@ -1,85 +1,90 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include "EventGenerator.hh"
#include "Process.hh"
#include "Beam.hh"
#include "JetParameters.hh"
#include "PhaseSpacePoint.hh"
-#include "HEJ/Event.hh"
#include "HEJ/config.hh"
+#include "HEJ/Event.hh"
+#include "HEJ/EWConstants.hh"
namespace HEJFOG{
EventGenerator::EventGenerator(
Process process,
Beam beam,
HEJ::ScaleGenerator scale_gen,
JetParameters jets,
int pdf_id,
double subl_change,
unsigned int subl_channels,
- ParticlesPropMap particles_properties,
+ ParticlesDecayMap particle_decays,
HEJ::HiggsCouplingSettings Higgs_coupling,
+ HEJ::EWConstants ew_parameters,
HEJ::RNG & ran
):
pdf_{pdf_id, beam.particles[0], beam.particles[1]},
ME_{
[this](double mu){ return pdf_.Halphas(mu); },
HEJ::MatrixElementConfig{
false,
- std::move(Higgs_coupling)
+ std::move(Higgs_coupling),
+ ew_parameters
}
},
scale_gen_{std::move(scale_gen)},
process_{std::move(process)},
jets_{std::move(jets)},
beam_{std::move(beam)},
subl_change_{subl_change},
subl_channels_{subl_channels},
- particles_properties_{std::move(particles_properties)},
+ particle_decays_{std::move(particle_decays)},
+ ew_parameters_{ew_parameters},
ran_{ran}
{
}
HEJ::optional<HEJ::Event> EventGenerator::gen_event(){
HEJFOG::PhaseSpacePoint psp{
process_,
jets_,
pdf_, beam_.energy,
subl_change_, subl_channels_,
- particles_properties_,
+ particle_decays_,
+ ew_parameters_,
ran_
};
status_ = psp.status();
if(status_ != good) return {};
HEJ::Event ev = scale_gen_(
HEJ::Event{
to_EventData( std::move(psp) ).cluster( jets_.def, jets_.min_pt)
}
);
ev.generate_colours(ran_);
const double shat = HEJ::shat(ev);
const double xa = (ev.incoming()[0].E()-ev.incoming()[0].pz())/(2.*beam_.energy);
const double xb = (ev.incoming()[1].E()+ev.incoming()[1].pz())/(2.*beam_.energy);
// evaluate matrix element
ev.parameters() *= ME_.tree(ev)/(shat*shat);
// and PDFs
ev.central().weight *= pdf_.pdfpt(0,xa,ev.central().muf, ev.incoming()[0].type);
ev.central().weight *= pdf_.pdfpt(0,xb,ev.central().muf, ev.incoming()[1].type);
for(size_t i = 0; i < ev.variations().size(); ++i){
auto & var = ev.variations(i);
var.weight *= pdf_.pdfpt(0,xa,var.muf, ev.incoming()[0].type);
var.weight *= pdf_.pdfpt(0,xb,var.muf, ev.incoming()[1].type);
}
return ev;
}
}
diff --git a/FixedOrderGen/src/PhaseSpacePoint.cc b/FixedOrderGen/src/PhaseSpacePoint.cc
index 02880b6..3ff9ddb 100644
--- a/FixedOrderGen/src/PhaseSpacePoint.cc
+++ b/FixedOrderGen/src/PhaseSpacePoint.cc
@@ -1,695 +1,693 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include "PhaseSpacePoint.hh"
#include <algorithm>
#include "CLHEP/Vector/LorentzVector.h"
#include "HEJ/Constants.hh"
+#include "HEJ/EWConstants.hh"
#include "HEJ/exceptions.hh"
#include "HEJ/kinematics.hh"
#include "HEJ/Particle.hh"
#include "HEJ/utility.hh"
#include "Process.hh"
#include "Subleading.hh"
using namespace HEJ;
namespace HEJFOG{
static_assert(
std::numeric_limits<double>::has_quiet_NaN,
"no quiet NaN for double"
);
constexpr double NaN = std::numeric_limits<double>::quiet_NaN();
HEJ::Event::EventData to_EventData(PhaseSpacePoint const & psp){
HEJ::Event::EventData result;
result.incoming = psp.incoming();
assert(result.incoming.size() == 2);
result.outgoing=psp.outgoing();
// technically Event::EventData doesn't have to be sorted,
// but PhaseSpacePoint should be anyway
assert(
std::is_sorted(
begin(result.outgoing), end(result.outgoing),
HEJ::rapidity_less{}
)
);
assert(result.outgoing.size() >= 2);
result.decays=psp.decays();
result.parameters.central= {NaN, NaN, psp.weight() };
return result;
}
namespace{
bool can_swap_to_uno(
HEJ::Particle const & p1, HEJ::Particle const & p2
){
return is_parton(p1)
&& p1.type != pid::gluon
&& p2.type == pid::gluon;
}
size_t count_gluons(std::vector<Particle>::const_iterator first,
std::vector<Particle>::const_iterator last){
return std::count_if(first, last, [](Particle const & p)
{return p.type == pid::gluon;});
}
/** assumes FKL configurations between first and last,
* else there can be a quark in a non-extreme position
* e.g. uno configuration gqg would pass
*/
bool can_change_to_qqx(
std::vector<Particle>::const_iterator first,
std::vector<Particle>::const_iterator last){
return 1 < count_gluons(first,last);
}
bool is_AWZ_proccess(Process const & proc){
return proc.boson && is_AWZ_boson(*proc.boson);
}
bool is_up_type(Particle const & part){
return HEJ::is_anyquark(part) && !(abs(part.type)%2);
}
bool is_down_type(Particle const & part){
return HEJ::is_anyquark(part) && abs(part.type)%2;
}
bool can_couple_to_W(Particle const & part, pid::ParticleID const W_id){
const int W_charge = W_id>0?1:-1;
return abs(part.type)<5
&& ( (W_charge*part.type > 0 && is_up_type(part))
|| (W_charge*part.type < 0 && is_down_type(part)) );
}
}
void PhaseSpacePoint::maybe_turn_to_subl(
double chance,
unsigned int const channels,
Process const & proc,
HEJ::RNG & ran
){
if(proc.njets <= 2) return;
assert(outgoing_.size() >= 2);
// decide what kind of subleading process is allowed
bool allow_uno = false;
bool allow_strange = true;
const size_t nout = outgoing_.size();
const bool can_be_uno_backward = (channels&Subleading::uno)
&& can_swap_to_uno(outgoing_[0], outgoing_[1]);
const bool can_be_uno_forward = (channels&Subleading::uno)
&& can_swap_to_uno(outgoing_[nout-1], outgoing_[nout-2]);
allow_uno = can_be_uno_backward || can_be_uno_forward;
bool allow_qqx = false;
if(is_AWZ_proccess(proc)) {
allow_qqx = (channels&Subleading::qqx)
&& can_change_to_qqx(outgoing_.cbegin(), outgoing_.cend());
if(std::none_of(outgoing_.cbegin(), outgoing_.cend(),
[&proc](Particle const & p){ return can_couple_to_W(p, *proc.boson);})) {
// enforce qqx if A/W/Z can't couple somewhere else
assert(allow_qqx);
allow_uno = false;
chance = 1.;
// strange not allowed for W
if(abs(*proc.boson)== pid::Wp) allow_strange = false;
}
}
if(!allow_uno && !allow_qqx) return;
if(ran.flat() < chance){
weight_ /= chance;
if(allow_uno && !allow_qqx){
turn_to_uno(can_be_uno_backward, can_be_uno_forward, ran);
} else if (!allow_uno && allow_qqx) {
turn_to_qqx(allow_strange, ran);
} else {
assert( allow_uno && allow_qqx);
if(ran.flat() < 0.5) turn_to_uno(can_be_uno_backward, can_be_uno_forward, ran);
else turn_to_qqx(allow_strange, ran);
weight_ *= 2.;
}
} else weight_ /= 1 - chance;
}
void PhaseSpacePoint::turn_to_uno(
const bool can_be_uno_backward, const bool can_be_uno_forward,
HEJ::RNG & ran
){
if(!can_be_uno_backward && !can_be_uno_forward) return;
const size_t nout = outgoing_.size();
if(can_be_uno_backward && can_be_uno_forward){
if(ran.flat() < 0.5){
std::swap(outgoing_[0].type, outgoing_[1].type);
} else {
std::swap(outgoing_[nout-1].type, outgoing_[nout-2].type);
}
weight_ *= 2.;
} else if(can_be_uno_backward){
std::swap(outgoing_[0].type, outgoing_[1].type);
} else {
assert(can_be_uno_forward);
std::swap(outgoing_[nout-1].type, outgoing_[nout-2].type);
}
}
void PhaseSpacePoint::turn_to_qqx(const bool allow_strange, HEJ::RNG & ran){
/// find first and last gluon in FKL chain
auto first = std::find_if(outgoing_.begin(), outgoing_.end(),
[](Particle const & p){return p.type == pid::gluon;});
std::vector<Particle*> FKL_gluons;
for(auto p = first; p!=outgoing_.end(); ++p){
if(p->type == pid::gluon) FKL_gluons.push_back(&*p);
else if(is_anyquark(*p)) break;
}
const size_t ng = FKL_gluons.size();
if(ng < 2)
throw std::logic_error("not enough gluons to create qqx");
// select flavour of quark
const double r1 = 2.*ran.flat()-1.;
const double max_flavour = allow_strange?n_f:n_f-1;
weight_ *= max_flavour*2;
int flavour = pid::down + std::floor(std::abs(r1)*max_flavour);
flavour*=r1<0.?-1:1;
// select gluon for switch
const size_t idx = floor((ng-1) * ran.flat());
weight_ *= (ng-1);
FKL_gluons[idx]->type = ParticleID(flavour);
FKL_gluons[idx+1]->type = ParticleID(-flavour);
}
template<class ParticleMomenta>
fastjet::PseudoJet PhaseSpacePoint::gen_last_momentum(
ParticleMomenta const & other_momenta,
const double mass_square, const double y
) const {
std::array<double,2> pt{0.,0.};
for (auto const & p: other_momenta) {
pt[0]-= p.px();
pt[1]-= p.py();
}
const double mperp = sqrt(pt[0]*pt[0]+pt[1]*pt[1]+mass_square);
const double pz=mperp*sinh(y);
const double E=mperp*cosh(y);
return {pt[0], pt[1], pz, E};
}
namespace {
//! adds a particle to target (in correct rapidity ordering)
//! @returns positon of insertion
auto insert_particle(std::vector<HEJ::Particle> & target,
HEJ::Particle && particle
){
const auto pos = std::upper_bound(
begin(target),end(target),particle,rapidity_less{}
);
target.insert(pos, std::move(particle));
return pos;
}
}
PhaseSpacePoint::PhaseSpacePoint(
- Process const & proc_in,
+ Process const & proc,
JetParameters const & jet_param,
HEJ::PDF & pdf, double E_beam,
double const subl_chance,
unsigned int const subl_channels,
- ParticlesPropMap const & particles_properties_in,
+ ParticlesDecayMap const & particle_decays,
+ HEJ::EWConstants const & ew_parameters,
HEJ::RNG & ran
)
{
- auto proc{ proc_in };
- auto particles_properties{ particles_properties_in };
+ // auto proc{ proc_in }; // @TODO remove
assert(proc.njets >= 2);
- if(proc.boson
- && particles_properties.find(*(proc.boson))
- == particles_properties.end())
- throw HEJ::missing_option("Boson "
- +std::to_string(*(proc.boson))+" can't be generated: missing properties");
status_ = good;
weight_ = 1;
const int nout = proc.njets + (proc.boson?1:0) + proc.boson_decay.size();
outgoing_.reserve(nout);
// generate parton momenta
const bool is_pure_jets = (nout == proc.njets);
auto partons = gen_LO_partons(
proc.njets, is_pure_jets, jet_param, E_beam, ran
);
// pre fill flavour with gluons
for(auto&& p_out: partons) {
outgoing_.emplace_back(Particle{pid::gluon, std::move(p_out), {}});
}
if(status_ != good) return;
if(proc.boson){ // decay boson
- const auto & boson_prop = particles_properties.at(*proc.boson);
+ const auto & boson_prop = ew_parameters.prop(*proc.boson) ;
auto boson{ gen_boson(*proc.boson, boson_prop.mass, boson_prop.width, ran) };
const auto pos{insert_particle(outgoing_, std::move(boson))};
const size_t boson_idx = std::distance(begin(outgoing_), pos);
- if( !proc.boson_decay.empty() ){
+ const auto & boson_decay = particle_decays.find(*proc.boson);
+ if( !proc.boson_decay.empty() ){ // decay given in proc
decays_.emplace(
boson_idx,
decay_boson(outgoing_[boson_idx], proc.boson_decay, ran)
);
- } else if( !boson_prop.decays.empty() ){
+ } else if( boson_decay != particle_decays.end()
+ && !boson_decay->second.empty() ){ // decay given explicitly
decays_.emplace(
boson_idx,
- decay_boson(outgoing_[boson_idx], boson_prop.decays, ran)
+ decay_boson(outgoing_[boson_idx], boson_decay->second, ran)
);
}
}
// normalisation of momentum-conserving delta function
weight_ *= pow(2*M_PI, 4);
/** @TODO
* uf (jet_param.min_pt) doesn't correspond to our final scale choice.
* The HEJ scale generators currently expect a full event as input,
* so fixing this is not completely trivial
*/
reconstruct_incoming(proc, subl_channels, pdf, E_beam, jet_param.min_pt, ran);
if(status_ != good) return;
// set outgoing states
most_backward_FKL(outgoing_).type = incoming_[0].type;
most_forward_FKL(outgoing_).type = incoming_[1].type;
maybe_turn_to_subl(subl_chance, subl_channels, proc, ran);
if(proc.boson) couple_boson(*proc.boson, ran);
}
double PhaseSpacePoint::gen_hard_pt(
int np , double ptmin, double ptmax, double y,
HEJ::RNG & ran
) {
// heuristic parameters for pt sampling
const double ptpar = ptmin + np/5.;
const double arg_small_y = atan((ptmax - ptmin)/ptpar);
const double y_cut = 3.;
const double r1 = ran.flat();
if(y < y_cut){
const double pt = ptmin + ptpar*tan(r1*arg_small_y);
const double temp = cos(r1*arg_small_y);
weight_ *= pt*ptpar*arg_small_y/(temp*temp);
return pt;
}
const double ptpar2 = ptpar/(1 + 5*(y-y_cut));
const double temp = 1. - std::exp((ptmin-ptmax)/ptpar2);
const double pt = ptmin - ptpar2*std::log(1-r1*temp);
weight_ *= pt*ptpar2*temp/(1-r1*temp);
return pt;
}
double PhaseSpacePoint::gen_soft_pt(int np, double max_pt, HEJ::RNG & ran) {
constexpr double ptpar = 4.;
const double r = ran.flat();
const double pt = max_pt + ptpar/np*std::log(r);
weight_ *= pt*ptpar/(np*r);
return pt;
}
double PhaseSpacePoint::gen_parton_pt(
int count, JetParameters const & jet_param, double max_pt, double y,
HEJ::RNG & ran
) {
constexpr double p_small_pt = 0.02;
if(! jet_param.peak_pt) {
return gen_hard_pt(count, jet_param.min_pt, max_pt, y, ran);
}
const double r = ran.flat();
if(r > p_small_pt) {
weight_ /= 1. - p_small_pt;
return gen_hard_pt(count, *jet_param.peak_pt, max_pt, y, ran);
}
weight_ /= p_small_pt;
const double pt = gen_soft_pt(count, *jet_param.peak_pt, ran);
if(pt < jet_param.min_pt) {
weight_=0.0;
status_ = not_enough_jets;
return jet_param.min_pt;
}
return pt;
}
std::vector<fastjet::PseudoJet> PhaseSpacePoint::gen_LO_partons(
int np, bool is_pure_jets,
JetParameters const & jet_param,
double max_pt,
HEJ::RNG & ran
){
if (np<2) throw std::invalid_argument{"Not enough partons in gen_LO_partons"};
weight_ /= pow(16.*pow(M_PI,3),np);
weight_ /= std::tgamma(np+1); //remove rapidity ordering
std::vector<fastjet::PseudoJet> partons;
partons.reserve(np);
for(int i = 0; i < np; ++i){
const double y = -jet_param.max_y + 2*jet_param.max_y*ran.flat();
weight_ *= 2*jet_param.max_y;
const bool is_last_parton = i+1 == np;
if(is_pure_jets && is_last_parton) {
constexpr double parton_mass_sq = 0.;
partons.emplace_back(gen_last_momentum(partons, parton_mass_sq, y));
break;
}
const double phi = 2*M_PI*ran.flat();
weight_ *= 2.0*M_PI;
const double pt = gen_parton_pt(np, jet_param, max_pt, y, ran);
if(weight_ == 0.0) return {};
partons.emplace_back(fastjet::PtYPhiM(pt, y, phi));
assert(jet_param.min_pt <= partons[i].pt());
assert(partons[i].pt() <= max_pt+1e-5);
}
// Need to check that at LO, the number of jets = number of partons;
fastjet::ClusterSequence cs(partons, jet_param.def);
auto cluster_jets=cs.inclusive_jets(jet_param.min_pt);
if (cluster_jets.size()!=unsigned(np)){
weight_=0.0;
status_ = not_enough_jets;
return {};
}
std::sort(begin(partons), end(partons), rapidity_less{});
return partons;
}
Particle PhaseSpacePoint::gen_boson(
HEJ::ParticleID bosonid, double mass, double width,
HEJ::RNG & ran
){
// Usual phase space measure
weight_ /= 16.*pow(M_PI, 3);
// Generate a y Gaussian distributed around 0
/// @TODO check magic numbers for different boson Higgs
/// @TODO better sampling for W
const double stddev_y = 1.6;
const double y = random_normal(stddev_y, ran);
const double r1 = ran.flat();
const double s_boson = mass*(
mass + width*tan(M_PI/2.*r1 + (r1-1.)*atan(mass/width))
);
// off-shell s_boson sampling, compensates for Breit-Wigner
/// @TODO use a flag instead
if(abs(bosonid) == pid::Wp){
weight_/=M_PI*M_PI*8.;
weight_*= mass*width*( M_PI+2.*atan(mass/width) )
/ ( 1. + cos( M_PI*r1 + 2.*(r1-1.)*atan(mass/width) ) );
}
auto p = gen_last_momentum(outgoing_, s_boson, y);
return Particle{bosonid, std::move(p), {}};
}
Particle const & PhaseSpacePoint::most_backward_FKL(
std::vector<Particle> const & partons
) const{
if(!HEJ::is_parton(partons[0])) return partons[1];
return partons[0];
}
Particle const & PhaseSpacePoint::most_forward_FKL(
std::vector<Particle> const & partons
) const{
const size_t last_idx = partons.size() - 1;
if(!HEJ::is_parton(partons[last_idx])) return partons[last_idx-1];
return partons[last_idx];
}
Particle & PhaseSpacePoint::most_backward_FKL(
std::vector<Particle> & partons
) const{
if(!HEJ::is_parton(partons[0])) return partons[1];
return partons[0];
}
Particle & PhaseSpacePoint::most_forward_FKL(
std::vector<Particle> & partons
) const{
const size_t last_idx = partons.size() - 1;
if(!HEJ::is_parton(partons[last_idx])) return partons[last_idx-1];
return partons[last_idx];
}
namespace {
/// partons are ordered: even = anti, 0 = gluon
ParticleID index_to_pid(size_t i){
if(!i) return pid::gluon;
return static_cast<ParticleID>(i%2?(i+1)/2:-i/2);
}
/// partons are ordered: even = anti, 0 = gluon
size_t pid_to_index(ParticleID id){
if(id==pid::gluon) return 0;
return id>0?id*2-1:abs(id)*2;
}
std::bitset<11> init_allowed(ParticleID const id){
if(abs(id) == pid::proton)
return ~0;
std::bitset<11> out = 0;
if(is_parton(id))
out[pid_to_index(id)] = 1;
return out;
}
/// decides which "index" (see index_to_pid) are allowed for process
std::bitset<11> allowed_quarks(ParticleID const boson){
std::bitset<11> allowed = ~0;
if(abs(boson) == pid::Wp){
// special case W:
// Wp: anti-down or up-type quark, no b/t -> 0001100110(1) = 205
// Wm: down or anti-up-type quark, no b/t -> 0010011001(1) = 307
allowed = boson>0?205:307;
}
return allowed;
}
}
/**
* checks which partons are allowed as initial state:
* 1. only allow what is given in the Runcard (p -> all)
* 2. A/W/Z require something to couple to
* a) no qqx => no incoming gluon
* b) 2j => no incoming gluon
* c) 3j => can couple OR is gluon => 2 gluons become qqx later
*/
std::array<std::bitset<11>,2> PhaseSpacePoint::filter_partons(
Process const & proc, unsigned int const subl_channels, HEJ::RNG & ran
){
std::array<std::bitset<11>,2> allowed_partons{
init_allowed(proc.incoming[0]),
init_allowed(proc.incoming[1])
};
bool const allow_qqx = subl_channels&Subleading::qqx;
// special case A/W/Z
if(is_AWZ_proccess(proc) && ((proc.njets < 4) || !allow_qqx)){
// all possible incoming states
auto allowed(allowed_quarks(*proc.boson));
if(proc.njets == 2 || !allow_qqx) allowed[0]=0;
// possible states per leg
std::array<std::bitset<11>,2> const maybe_partons{
allowed_partons[0]&allowed, allowed_partons[1]&allowed};
if(maybe_partons[0].any() && maybe_partons[1].any()){
// two options to get allowed initial state => choose one at random
const size_t idx = ran.flat() < 0.5;
allowed_partons[idx] = maybe_partons[idx];
// else choose the possible
} else if(maybe_partons[0].any()) {
allowed_partons[0] = maybe_partons[0];
} else if(maybe_partons[1].any()) {
allowed_partons[1] = maybe_partons[1];
} else{
throw std::invalid_argument{"Incoming state not allowed."};
}
}
return allowed_partons;
}
void PhaseSpacePoint::reconstruct_incoming(
Process const & proc, unsigned int const subl_channels,
HEJ::PDF & pdf, double E_beam,
double uf,
HEJ::RNG & ran
){
std::tie(incoming_[0].p, incoming_[1].p) = incoming_momenta(outgoing_);
// calculate xa, xb
const double sqrts=2*E_beam;
const double xa=(incoming_[0].p.e()-incoming_[0].p.pz())/sqrts;
const double xb=(incoming_[1].p.e()+incoming_[1].p.pz())/sqrts;
// abort if phase space point is outside of collider energy reach
if (xa>1. || xb>1.){
weight_=0;
status_ = too_much_energy;
return;
}
auto const & ids = proc.incoming;
std::array<std::bitset<11>,2> allowed_partons(
filter_partons(proc, subl_channels, ran));
for(size_t i = 0; i < 2; ++i){
if(ids[i] == pid::proton || ids[i] == pid::p_bar){
// pick ids according to pdfs
incoming_[i].type =
generate_incoming_id(i, i?xb:xa, uf, pdf, allowed_partons[i], ran);
} else {
assert(allowed_partons[i][pid_to_index(ids[i])]);
incoming_[i].type = ids[i];
}
}
assert(momentum_conserved(1e-7));
}
HEJ::ParticleID PhaseSpacePoint::generate_incoming_id(
size_t const beam_idx, double const x, double const uf,
HEJ::PDF & pdf, std::bitset<11> allowed_partons, HEJ::RNG & ran
){
std::array<double,11> pdf_wt;
pdf_wt[0] = allowed_partons[0]?fabs(pdf.pdfpt(beam_idx,x,uf,pid::gluon)):0.;
double pdftot = pdf_wt[0];
for(size_t i = 1; i < pdf_wt.size(); ++i){
pdf_wt[i] = allowed_partons[i]?4./9.*fabs(pdf.pdfpt(beam_idx,x,uf,index_to_pid(i))):0;
pdftot += pdf_wt[i];
}
const double r1 = pdftot * ran.flat();
double sum = 0;
for(size_t i=0; i < pdf_wt.size(); ++i){
if (r1 < (sum+=pdf_wt[i])){
weight_*= pdftot/pdf_wt[i];
return index_to_pid(i);
}
}
std::cerr << "Error in choosing incoming parton: "<<x<<" "<<uf<<" "
<<sum<<" "<<pdftot<<" "<<r1<<std::endl;
throw std::logic_error{"Failed to choose parton flavour"};
}
void PhaseSpacePoint::couple_boson(
HEJ::ParticleID const boson, HEJ::RNG & ran
){
if(abs(boson) != pid::Wp) return; // only matters for W
/// @TODO this could be use to sanity check gamma and Z
// find all possible quarks
std::vector<Particle*> allowed_parts;
for(auto & part: outgoing_){
// Wp -> up OR anti-down, Wm -> anti-up OR down, no bottom
if ( can_couple_to_W(part, boson) )
allowed_parts.push_back(&part);
}
if(allowed_parts.size() == 0){
throw std::logic_error{"Found no parton for coupling with boson"};
}
// select one and flip it
size_t idx = 0;
if(allowed_parts.size() > 1){
/// @TODO more efficient sampling
/// old code: probability[i] = exp(parton[i].y - W.y)
idx = floor(ran.flat()*allowed_parts.size());
weight_ *= allowed_parts.size();
}
const int W_charge = boson>0?1:-1;
allowed_parts[idx]->type =
static_cast<ParticleID>( allowed_parts[idx]->type - W_charge );
}
double PhaseSpacePoint::random_normal(
double stddev,
HEJ::RNG & ran
){
const double r1 = ran.flat();
const double r2 = ran.flat();
const double lninvr1 = -log(r1);
const double result = stddev*sqrt(2.*lninvr1)*cos(2.*M_PI*r2);
weight_ *= exp(result*result/(2*stddev*stddev))*sqrt(2.*M_PI)*stddev;
return result;
}
bool PhaseSpacePoint::momentum_conserved(double ep) const{
fastjet::PseudoJet diff;
for(auto const & in: incoming()) diff += in.p;
for(auto const & out: outgoing()) diff -= out.p;
return nearby_ep(diff, fastjet::PseudoJet{}, ep);
}
Decay PhaseSpacePoint::select_decay_channel(
std::vector<Decay> const & decays,
HEJ::RNG & ran
){
double br_total = 0.;
for(auto const & decay: decays) br_total += decay.branching_ratio;
// adjust weight
// this is given by (channel branching ratio)/(chance to pick channel)
// where (chance to pick channel) =
// (channel branching ratio)/(total branching ratio)
weight_ *= br_total;
if(decays.size()==1) return decays.front();
const double r1 = br_total*ran.flat();
double br_sum = 0.;
for(auto const & decay: decays){
br_sum += decay.branching_ratio;
if(r1 < br_sum) return decay;
}
throw std::logic_error{"unreachable"};
}
std::vector<Particle> PhaseSpacePoint::decay_boson(
HEJ::Particle const & parent,
std::vector<Decay> const & decays,
HEJ::RNG & ran
){
const auto channel = select_decay_channel(decays, ran);
return decay_boson(parent, channel.products, ran);
}
std::vector<Particle> PhaseSpacePoint::decay_boson(
HEJ::Particle const & parent,
std::vector<HEJ::ParticleID> const & decays,
HEJ::RNG & ran
){
if(decays.size() != 2){
throw HEJ::not_implemented{
"only decays into two particles are implemented"
};
}
std::vector<Particle> decay_products(decays.size());
for(size_t i = 0; i < decays.size(); ++i){
decay_products[i].type = decays[i];
}
// choose polar and azimuth angle in parent rest frame
const double E = parent.m()/2;
const double theta = 2.*M_PI*ran.flat();
const double cos_phi = 2.*ran.flat()-1.;
const double sin_phi = sqrt(1. - cos_phi*cos_phi); // Know 0 < phi < pi
const double px = E*cos(theta)*sin_phi;
const double py = E*sin(theta)*sin_phi;
const double pz = E*cos_phi;
decay_products[0].p.reset(px, py, pz, E);
decay_products[1].p.reset(-px, -py, -pz, E);
for(auto & particle: decay_products) particle.p.boost(parent.p);
return decay_products;
}
}
diff --git a/FixedOrderGen/src/config.cc b/FixedOrderGen/src/config.cc
index f0d6197..c3f099d 100644
--- a/FixedOrderGen/src/config.cc
+++ b/FixedOrderGen/src/config.cc
@@ -1,408 +1,427 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include "config.hh"
#include <cctype>
#include "Subleading.hh"
#include "HEJ/config.hh"
#include "HEJ/YAMLreader.hh"
namespace HEJFOG{
using HEJ::set_from_yaml;
using HEJ::set_from_yaml_if_defined;
using HEJ::pid::ParticleID;
namespace{
//! Get YAML tree of supported options
/**
* The configuration file is checked against this tree of options
* in assert_all_options_known.
*/
YAML::Node const & get_supported_options(){
const static YAML::Node supported = [](){
YAML::Node supported;
static const auto opts = {
"process", "events", "subleading fraction","subleading channels",
- "scales", "scale factors", "max scale ratio", "pdf",
+ "scales", "scale factors", "max scale ratio", "pdf", "vev",
"event output", "analysis", "import scales"
};
// add subnodes to "supported" - the assigned value is irrelevant
for(auto && opt: opts) supported[opt] = "";
for(auto && jet_opt: {"min pt", "peak pt", "algorithm", "R", "max rapidity"}){
supported["jets"][jet_opt] = "";
}
- for(auto && particle_type: {"Higgs", "Wp", "W+", "Wm", "W-", "Z"}){
+ for(auto && particle_type: {"Higgs", "W", "Z"}){
for(auto && particle_opt: {"mass", "width"}){
supported["particle properties"][particle_type][particle_opt] = "";
}
- supported["particle properties"][particle_type]["decays"]["into"] = "";
- supported["particle properties"][particle_type]["decays"]["branching ratio"] = "";
+ }
+ for(auto && particle_type: {"Higgs", "Wp", "W+", "Wm", "W-", "Z"}){
+ for(auto && particle_opt: {"into", "branching ratio"}){
+ supported["decays"][particle_type][particle_opt] = "";
+ }
}
for(auto && opt: {"mt", "use impact factors", "include bottom", "mb"}){
supported["Higgs coupling"][opt] = "";
}
for(auto && beam_opt: {"energy", "particles"}){
supported["beam"][beam_opt] = "";
}
for(auto && unweight_opt: {"sample size", "max deviation"}){
supported["unweight"][unweight_opt] = "";
}
for(auto && opt: {"name", "seed"}){
supported["random generator"][opt] = "";
}
return supported;
}();
return supported;
}
JetParameters get_jet_parameters(
YAML::Node const & node, std::string const & entry
){
const auto p = HEJ::get_jet_parameters(node, entry);
JetParameters result;
result.def = p.def;
result.min_pt = p.min_pt;
set_from_yaml(result.max_y, node, entry, "max rapidity");
set_from_yaml_if_defined(result.peak_pt, node, entry, "peak pt");
if(result.peak_pt && *result.peak_pt <= result.min_pt)
throw std::invalid_argument{
"Value of option 'peak pt' has to be larger than 'min pt'."
};
return result;
}
Beam get_Beam(
YAML::Node const & node, std::string const & entry
){
Beam beam;
std::vector<HEJ::ParticleID> particles;
set_from_yaml(beam.energy, node, entry, "energy");
set_from_yaml_if_defined(particles, node, entry, "particles");
if(! particles.empty()){
for(HEJ::ParticleID particle: particles){
if(particle != HEJ::pid::p && particle != HEJ::pid::p_bar){
throw std::invalid_argument{
"Unsupported value in option " + entry + ": particles:"
" only proton ('p') and antiproton ('p_bar') beams are supported"
};
}
}
if(particles.size() != 2){
throw std::invalid_argument{"Not exactly two beam particles"};
}
beam.particles.front() = particles.front();
beam.particles.back() = particles.back();
}
return beam;
}
std::vector<std::string> split(
std::string const & str, std::string const & delims
){
std::vector<std::string> result;
for(size_t begin, end = 0; end != str.npos;){
begin = str.find_first_not_of(delims, end);
if(begin == str.npos) break;
end = str.find_first_of(delims, begin + 1);
result.emplace_back(str.substr(begin, end - begin));
}
return result;
}
std::invalid_argument invalid_incoming(std::string const & what){
return std::invalid_argument{
"Incoming particle type " + what + " not supported,"
" incoming particles have to be 'p', 'p_bar' or partons"
};
}
std::invalid_argument invalid_outgoing(std::string const & what){
return std::invalid_argument{
"Outgoing particle type " + what + " not supported,"
" outgoing particles have to be 'j', 'photon', 'H', 'Wm', 'Wp', 'e-', 'e+', 'nu_e', 'nu_e_bar'"
};
}
HEJ::ParticleID reconstruct_boson_id(
std::vector<HEJ::ParticleID> const & ids
){
assert(ids.size()==2);
const int pidsum = ids[0] + ids[1];
if(pidsum == +1) {
assert(HEJ::is_antilepton(ids[0]));
if(HEJ::is_antineutrino(ids[0])) {
throw HEJ::not_implemented{"lepton-flavour violating final state"};
}
assert(HEJ::is_neutrino(ids[1]));
// charged antilepton + neutrino means we had a W+
return HEJ::pid::Wp;
}
if(pidsum == -1) {
assert(HEJ::is_antilepton(ids[0]));
if(HEJ::is_neutrino(ids[1])) {
throw HEJ::not_implemented{"lepton-flavour violating final state"};
}
assert(HEJ::is_antineutrino(ids[0]));
// charged lepton + antineutrino means we had a W-
return HEJ::pid::Wm;
}
throw HEJ::not_implemented{
"final state with leptons "+HEJ::name(ids[0])+" and "+HEJ::name(ids[1])
+" not supported"
};
}
Process get_process(
YAML::Node const & node, std::string const & entry
){
Process result;
std::string process_string;
set_from_yaml(process_string, node, entry);
assert(! process_string.empty());
const auto particles = split(process_string, " \n\t\v=>");
if(particles.size() < 3){
throw std::invalid_argument{
"Bad format in option process: '" + process_string
+ "', expected format is 'in1 in2 => out1 ...'"
};
}
result.incoming.front() = HEJ::to_ParticleID(particles[0]);
result.incoming.back() = HEJ::to_ParticleID(particles[1]);
for(size_t i = 0; i < result.incoming.size(); ++i){
const HEJ::ParticleID in = result.incoming[i];
if(
in != HEJ::pid::proton && in != HEJ::pid::p_bar
&& !HEJ::is_parton(in)
){
throw invalid_incoming(particles[i]);
}
}
result.njets = 0;
for(size_t i = result.incoming.size(); i < particles.size(); ++i){
assert(! particles[i].empty());
if(particles[i] == "j") ++result.njets;
else if(std::isdigit(particles[i].front())
&& particles[i].back() == 'j')
result.njets += std::stoi(particles[i]);
else{
const auto pid = HEJ::to_ParticleID(particles[i]);
if(pid==HEJ::pid::Higgs || pid==HEJ::pid::Wp || pid==HEJ::pid::Wm){
if(result.boson)
throw std::invalid_argument{
"More than one outgoing boson is not supported"
};
if(!result.boson_decay.empty())
throw std::invalid_argument{
"Production of a boson together with a lepton is not supported"
};
result.boson = pid;
} else if (HEJ::is_anylepton(pid)){
// Do not accept more leptons, if two leptons are already mentioned
if( result.boson_decay.size()>=2 )
throw std::invalid_argument{"Too many leptons provided"};
if(result.boson)
throw std::invalid_argument{
"Production of a lepton together with a boson is not supported"
};
result.boson_decay.emplace_back(pid);
} else {
throw invalid_outgoing(particles[i]);
}
}
}
if(result.njets < 2){
throw std::invalid_argument{
"Process has to include at least two jets ('j')"
};
}
if(!result.boson_decay.empty()){
std::sort(begin(result.boson_decay),end(result.boson_decay));
assert(!result.boson);
result.boson = reconstruct_boson_id(result.boson_decay);
}
return result;
}
HEJFOG::Subleading to_subleading_channel(YAML::Node const & yaml){
std::string name;
using namespace HEJFOG::channels;
set_from_yaml(name, yaml);
if(name == "none")
return none;
if(name == "all")
return all;
if(name == "unordered" || name == "uno")
return uno;
if(name == "qqx")
return qqx;
throw HEJ::unknown_option("Unknown subleading channel '"+name+"'");
}
unsigned int get_subleading_channels(YAML::Node const & node){
using YAML::NodeType;
using namespace HEJFOG::channels;
// all channels allowed by default
if(!node) return all;
switch(node.Type()){
case NodeType::Undefined:
return all;
case NodeType::Null:
return none;
case NodeType::Scalar:
return to_subleading_channel(node);
case NodeType::Map:
throw HEJ::invalid_type{"map is not a valid option for subleading channels"};
case NodeType::Sequence:
unsigned int channels = HEJFOG::Subleading::none;
for(auto && channel_node: node){
channels |= get_subleading_channels(channel_node);
}
return channels;
}
throw std::logic_error{"unreachable"};
}
- Decay get_decay(YAML::Node const & node){
+ Decay get_decay(YAML::Node const & node,
+ std::string const & entry, std::string const & boson
+ ){
Decay decay;
- set_from_yaml(decay.products, node, "into");
+ set_from_yaml(decay.products, node, entry, boson, "into");
decay.branching_ratio=1;
- set_from_yaml_if_defined(decay.branching_ratio, node, "branching ratio");
+ set_from_yaml_if_defined(decay.branching_ratio, node, entry, boson,
+ "branching ratio");
return decay;
}
- std::vector<Decay> get_decays(YAML::Node const & node){
+ std::vector<Decay> get_decays(YAML::Node const & node,
+ std::string const & entry, std::string const & boson
+ ){
using YAML::NodeType;
- if(!node) return {};
- switch(node.Type()){
+ if(!node[entry][boson]) return {};
+ switch(node[entry][boson].Type()){
case NodeType::Null:
case NodeType::Undefined:
return {};
case NodeType::Scalar:
throw HEJ::invalid_type{"value is not a list of decays"};
case NodeType::Map:
- return {get_decay(node)};
+ return {get_decay(node, entry, boson)};
case NodeType::Sequence:
std::vector<Decay> result;
- for(auto && decay_str: node){
- result.emplace_back(get_decay(decay_str));
+ for(auto && decay_str: node[entry][boson]){
+ result.emplace_back(get_decay(decay_str, entry, boson));
}
return result;
}
throw std::logic_error{"unreachable"};
}
- ParticleProperties get_particle_properties(
- YAML::Node const & node, std::string const & entry
+ ParticlesDecayMap get_all_decays(YAML::Node const & node,
+ std::string const & entry
){
- ParticleProperties result;
- set_from_yaml(result.mass, node, entry, "mass");
- set_from_yaml(result.width, node, entry, "width");
- try{
- result.decays = get_decays(node[entry]["decays"]);
- }
- catch(HEJ::missing_option const & ex){
- throw HEJ::missing_option{entry + ": decays: " + ex.what()};
- }
- catch(HEJ::invalid_type const & ex){
- throw HEJ::invalid_type{entry + ": decays: " + ex.what()};
+ if(!node[entry]) return {};
+ if(!node[entry].IsMap())
+ throw HEJ::invalid_type{entry + " have to be a map"};
+ ParticlesDecayMap result;
+ for(auto const & sub_node: node[entry]) {
+ const auto boson = sub_node.first.as<std::string>();
+ const auto id = HEJ::to_ParticleID(boson);
+ result.emplace(id, get_decays(node, entry, boson));
}
return result;
}
- ParticlesPropMap get_all_particles_properties(YAML::Node const & node){
- ParticlesPropMap result;
- for(auto const & entry: node) {
- const auto name = entry.first.as<std::string>();
- const auto id = HEJ::to_ParticleID(name);
- result.emplace(id, get_particle_properties(node,name));
- }
+ HEJ::ParticleProperties get_particle_properties(
+ YAML::Node const & node, std::string const & entry,
+ std::string const & boson
+ ){
+ HEJ::ParticleProperties result;
+ set_from_yaml(result.mass, node, entry, boson, "mass");
+ set_from_yaml(result.width, node, entry, boson, "width");
+ return result;
+ }
+
+ HEJ::EWConstants get_ew_parameters(YAML::Node const & node){
+ HEJ::EWConstants result;
+ double vev;
+ set_from_yaml(vev, node, "vev");
+ result.set_vevWZH(vev,
+ get_particle_properties(node, "particle properties", "W"),
+ get_particle_properties(node, "particle properties", "Z"),
+ get_particle_properties(node, "particle properties", "Higgs")
+ );
return result;
}
UnweightSettings get_unweight(
YAML::Node const & node, std::string const & entry
){
UnweightSettings result;
set_from_yaml(result.sample_size, node, entry, "sample size");
if(result.sample_size <= 0){
throw std::invalid_argument{
"negative sample size " + std::to_string(result.sample_size)
};
}
set_from_yaml(result.max_dev, node, entry, "max deviation");
return result;
}
Config to_Config(YAML::Node const & yaml){
try{
HEJ::assert_all_options_known(yaml, get_supported_options());
}
catch(HEJ::unknown_option const & ex){
throw HEJ::unknown_option{std::string{"Unknown option '"} + ex.what() + "'"};
}
Config config;
config.process = get_process(yaml, "process");
set_from_yaml(config.events, yaml, "events");
config.jets = get_jet_parameters(yaml, "jets");
config.beam = get_Beam(yaml, "beam");
for(size_t i = 0; i < config.process.incoming.size(); ++i){
const auto & in = config.process.incoming[i];
using namespace HEJ::pid;
if( (in == p || in == p_bar) && in != config.beam.particles[i]){
throw std::invalid_argument{
"Particle type of beam " + std::to_string(i+1) + " incompatible"
+ " with type of incoming particle " + std::to_string(i+1)
};
}
}
set_from_yaml(config.pdf_id, yaml, "pdf");
set_from_yaml(config.subleading_fraction, yaml, "subleading fraction");
if(config.subleading_fraction < 0 || config.subleading_fraction > 1){
throw std::invalid_argument{
"subleading fraction has to be between 0 and 1"
};
}
if(config.subleading_fraction == 0)
config.subleading_channels = Subleading::none;
else
config.subleading_channels = get_subleading_channels(yaml["subleading channels"]);
- if(yaml["particle properties"]){
- config.particles_properties = get_all_particles_properties(
- yaml["particle properties"]);
+ config.ew_parameters = get_ew_parameters(yaml);
+ config.particle_decays = get_all_decays(yaml, "decays");
+ if(config.process.boson // check that Ws always decay
+ && std::abs(*config.process.boson) == HEJ::ParticleID::Wp
+ && config.process.boson_decay.empty()
+ ){
+ auto const & decay = config.particle_decays.find(*config.process.boson);
+ if(decay == config.particle_decays.end() || decay->second.empty())
+ throw std::invalid_argument{
+ "Decay for "+HEJ::name(*config.process.boson)+" is required"};
}
- if(config.process.boson
- && config.particles_properties.find(*(config.process.boson))
- == config.particles_properties.end())
- throw HEJ::missing_option("Process wants to generate boson "
- +std::to_string(*(config.process.boson))+", but particle properties are missing");
set_from_yaml_if_defined(config.analysis_parameters, yaml, "analysis");
config.scales = HEJ::to_ScaleConfig(yaml);
set_from_yaml_if_defined(config.output, yaml, "event output");
config.rng = HEJ::to_RNGConfig(yaml, "random generator");
config.Higgs_coupling = HEJ::get_Higgs_coupling(yaml, "Higgs coupling");
if(yaml["unweight"]) config.unweight = get_unweight(yaml, "unweight");
return config;
}
} // namespace anonymous
Config load_config(std::string const & config_file){
try{
return to_Config(YAML::LoadFile(config_file));
}
catch(...){
std::cerr << "Error reading " << config_file << ":\n ";
throw;
}
}
}
diff --git a/FixedOrderGen/src/main.cc b/FixedOrderGen/src/main.cc
index 461202a..d0b83a3 100644
--- a/FixedOrderGen/src/main.cc
+++ b/FixedOrderGen/src/main.cc
@@ -1,233 +1,234 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include <algorithm>
#include <chrono>
#include <fstream>
#include <iostream>
#include <map>
#include <memory>
#include "yaml-cpp/yaml.h"
#include "LHEF/LHEF.h"
#include "HEJ/CombinedEventWriter.hh"
#include "HEJ/CrossSectionAccumulator.hh"
#include "HEJ/get_analysis.hh"
#include "HEJ/LesHouchesWriter.hh"
#include "HEJ/make_RNG.hh"
#include "HEJ/ProgressBar.hh"
#include "HEJ/stream.hh"
#include "config.hh"
#include "EventGenerator.hh"
#include "PhaseSpacePoint.hh"
#include "Unweighter.hh"
#include "Version.hh"
namespace{
constexpr auto banner =
" __ ___ __ ______ __ "
" __ \n / / / (_)___ _/ /_ / ____/___ "
" ___ _________ ___ __ / /__ / /______ \n "
" / /_/ / / __ `/ __ \\ / __/ / __ \\/ _ \\/ ___/ __ `/ / / / __ / / _"
" \\/ __/ ___/ \n / __ / / /_/ / / / / / /___/ /"
" / / __/ / / /_/ / /_/ / / /_/ / __/ /_(__ ) "
" \n /_/ /_/_/\\__, /_/ /_/ /_____/_/ /_/\\___/_/ \\__, /\\__, / \\___"
"_/\\___/\\__/____/ \n ____///__/ "
"__ ____ ///__//____/ ______ __ "
" \n / ____(_) _____ ____/ / / __ \\_________/ /__ _____ / "
"____/__ ____ ___ _________ _/ /_____ _____\n / /_ / / |/_/ _ \\/ __"
" / / / / / ___/ __ / _ \\/ ___/ / / __/ _ \\/ __ \\/ _ \\/ ___/ __ `/ "
"__/ __ \\/ ___/\n / __/ / /> </ __/ /_/ / / /_/ / / / /_/ / __/ / "
" / /_/ / __/ / / / __/ / / /_/ / /_/ /_/ / / \n /_/ /_/_/|_|\\___"
"/\\__,_/ \\____/_/ \\__,_/\\___/_/ \\____/\\___/_/ /_/\\___/_/ "
"\\__,_/\\__/\\____/_/ \n";
constexpr double invGeV2_to_pb = 389379292.;
constexpr long long max_warmup_events = 10000;
}
HEJFOG::Config load_config(char const * filename){
try{
return HEJFOG::load_config(filename);
}
catch(std::exception const & exc){
std::cerr << "Error: " << exc.what() << '\n';
std::exit(EXIT_FAILURE);
}
}
std::unique_ptr<HEJ::Analysis> get_analysis(
YAML::Node const & parameters
){
try{
return HEJ::get_analysis(parameters);
}
catch(std::exception const & exc){
std::cerr << "Failed to load analysis: " << exc.what() << '\n';
std::exit(EXIT_FAILURE);
}
}
int main(int argn, char** argv) {
using namespace std::string_literals;
if (argn < 2) {
std::cerr << "\n# Usage:\n." << argv[0] << " config_file\n";
return EXIT_FAILURE;
}
std::cout << banner;
std::cout << "Version " << HEJFOG::Version::String()
<< ", revision " << HEJFOG::Version::revision() << std::endl;
fastjet::ClusterSequence::print_banner();
using clock = std::chrono::system_clock;
const auto start_time = clock::now();
// read configuration
auto config = load_config(argv[1]);
std::unique_ptr<HEJ::Analysis> analysis = get_analysis(
config.analysis_parameters
);
assert(analysis != nullptr);
auto ran = HEJ::make_RNG(config.rng.name, config.rng.seed);
assert(ran != nullptr);
HEJ::ScaleGenerator scale_gen{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
std::move(scale_gen),
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
*ran
};
LHEF::HEPRUP heprup;
heprup.IDBMUP=std::pair<long,long>(config.beam.particles[0], config.beam.particles[1]);
heprup.EBMUP=std::make_pair(config.beam.energy, config.beam.energy);
heprup.PDFGUP=std::make_pair(0,0);
heprup.PDFSUP=std::make_pair(config.pdf_id,config.pdf_id);
heprup.NPRUP=1;
heprup.XSECUP=std::vector<double>(1.);
heprup.XERRUP=std::vector<double>(1.);
heprup.LPRUP=std::vector<int>{1};
heprup.generators.emplace_back(LHEF::XMLTag{});
heprup.generators.back().name = HEJFOG::Version::package_name();
heprup.generators.back().version = HEJFOG::Version::String();
HEJ::CombinedEventWriter writer{config.output, heprup};
HEJ::optional<HEJFOG::Unweighter> unweighter{};
std::map<HEJFOG::Status, int> status_counter;
std::vector<HEJ::Event> events;
int trials = 0;
// warm-up phase to train unweighter
if(config.unweight) {
std::cout << "Calibrating unweighting ...\n";
const auto warmup_start = clock::now();
const size_t warmup_events = config.unweight->sample_size;
HEJ::ProgressBar<size_t> warmup_progress{std::cout, warmup_events};
for(; events.size() < warmup_events; ++trials){
auto ev = generator.gen_event();
++status_counter[generator.status()];
assert( (generator.status() == HEJFOG::good) == bool(ev) );
if(generator.status() == HEJFOG::good && analysis->pass_cuts(*ev, *ev)) {
events.emplace_back(std::move(*ev));
++warmup_progress;
}
}
std::cout << std::endl;
unweighter = HEJFOG::Unweighter{
begin(events), end(events), config.unweight->max_dev, *ran,
config.jets.peak_pt?(*config.jets.peak_pt):0.
};
std::vector<HEJ::Event> unweighted_events;
for(auto && ev: events) {
auto unweighted = unweighter->unweight(std::move(ev));
if(unweighted) {
unweighted_events.emplace_back(std::move(*unweighted));
}
}
events = std::move(unweighted_events);
if(events.empty()) {
std::cerr <<
"Failed to generate events. Please increase \"unweight: sample size\""
" or reduce \"unweight: max deviation\"\n";
return EXIT_FAILURE;
}
const auto warmup_end = clock::now();
const double completion = static_cast<double>(events.size())/config.events;
const std::chrono::duration<double> remaining_time =
(warmup_end- warmup_start)*(1./completion - 1);
const auto finish = clock::to_time_t(
std::chrono::time_point_cast<std::chrono::seconds>(warmup_end + remaining_time)
);
std::cout
<< "Generated " << events.size() << "/" << config.events << " events ("
<< static_cast<int>(std::round(100*completion)) << "%)\n"
<< "Estimated remaining generation time: "
<< remaining_time.count() << " seconds ("
<< std::put_time(std::localtime(&finish), "%c") << ")\n\n";
}
HEJ::ProgressBar<long long> progress{std::cout, config.events};
progress.increment(events.size());
events.reserve(config.events);
for(; events.size() < static_cast<size_t>(config.events); ++trials){
auto ev = generator.gen_event();
++status_counter[generator.status()];
assert( (generator.status() == HEJFOG::good) == bool(ev) );
if(generator.status() == HEJFOG::good && analysis->pass_cuts(*ev, *ev)) {
if(unweighter) {
auto unweighted = unweighter->unweight(std::move(*ev));
if(! unweighted) continue;
ev = std::move(unweighted);
}
events.emplace_back(std::move(*ev));
++progress;
}
}
std::cout << std::endl;
HEJ::CrossSectionAccumulator xs;
for(auto & ev: events){
ev.parameters() *= invGeV2_to_pb/trials;
analysis->fill(ev, ev);
writer.write(ev);
xs.fill(ev);
}
analysis->finalise();
const std::chrono::duration<double> run_time = (clock::now() - start_time);
std::cout << "\nTask Runtime: " << run_time.count() << " seconds.\n\n";
std::cout << xs << '\n';
for(auto && entry: status_counter){
const double fraction = static_cast<double>(entry.second)/trials;
const int percent = std::round(100*fraction);
std::cout << "status "
<< std::left << std::setw(16) << (to_string(entry.first) + ":")
<< " [";
for(int i = 0; i < percent/2; ++i) std::cout << '#';
for(int i = percent/2; i < 50; ++i) std::cout << ' ';
std::cout << "] " << percent << "%\n";
}
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/2j.cc b/FixedOrderGen/t/2j.cc
index 36380a7..7d0ebd6 100644
--- a/FixedOrderGen/t/2j.cc
+++ b/FixedOrderGen/t/2j.cc
@@ -1,66 +1,67 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cmath>
#include <cassert>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Mixmax.hh"
#include "HEJ/Event.hh"
#include "HEJ/PDF.hh"
#include "HEJ/MatrixElement.hh"
using namespace HEJFOG;
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 86.42031848*1e6; //calculated with "combined" HEJ svn r3480
auto config = load_config("config_2j.yml");
HEJ::Mixmax ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << '\n';
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.01*xs);
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/4j.cc b/FixedOrderGen/t/4j.cc
index a5c33a9..b9fdef1 100644
--- a/FixedOrderGen/t/4j.cc
+++ b/FixedOrderGen/t/4j.cc
@@ -1,67 +1,68 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cmath>
#include <cassert>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Mixmax.hh"
#include "HEJ/Event.hh"
#include "HEJ/PDF.hh"
#include "HEJ/MatrixElement.hh"
using namespace HEJFOG;
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 0.81063619*1e6; //calculated with "combined" HEJ svn r3480
auto config = load_config("config_2j.yml");
config.process.njets = 4;
HEJ::Mixmax ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << '\n';
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.03*xs);
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/W_2j_classify.cc b/FixedOrderGen/t/W_2j_classify.cc
index bf1d22b..62e8779 100644
--- a/FixedOrderGen/t/W_2j_classify.cc
+++ b/FixedOrderGen/t/W_2j_classify.cc
@@ -1,152 +1,158 @@
/**
* \brief check that the PSP generates only "valid" W + 2 jets events
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
+#include "Decay.hh"
#include "JetParameters.hh"
-#include "ParticleProperties.hh"
#include "PhaseSpacePoint.hh"
#include "Process.hh"
#include "Subleading.hh"
+#include "HEJ/EWConstants.hh"
#include "HEJ/Mixmax.hh"
#include "HEJ/PDF.hh"
#include "HEJ/utility.hh"
using namespace HEJFOG;
using namespace HEJ;
namespace {
void print_psp(PhaseSpacePoint const & psp){
std::cerr << "Process:\n"
<< psp.incoming()[0].type << " + "<< psp.incoming()[1].type << " -> ";
for(auto const & out: psp.outgoing()){
std::cerr << out.type << " ";
}
std::cerr << "\n";
}
void bail_out(PhaseSpacePoint const & psp, std::string msg){
print_psp(psp);
throw std::logic_error{msg};
}
bool is_up_type(Particle const & part){
return HEJ::is_anyquark(part) && !(abs(part.type)%2);
}
bool is_down_type(Particle const & part){
return HEJ::is_anyquark(part) && abs(part.type)%2;
}
bool check_W2j(PhaseSpacePoint const & psp, ParticleID const W_type){
bool found_quark = false;
bool found_anti = false;
std::vector<Particle> out_partons;
std::vector<Particle> Wp;
for(auto const & p: psp.outgoing()){
if(p.type == W_type) Wp.push_back(p);
else if(is_parton(p)) out_partons.push_back(p);
else bail_out(psp, "Found particle with is not "
+std::to_string(int(W_type))+" or parton");
}
if(Wp.size() != 1 || out_partons.size() != 2){
bail_out(psp, "Found wrong number of outgoing partons");
}
for(size_t j=0; j<2; ++j){
auto const & in = psp.incoming()[j];
auto const & out = out_partons[j];
if(is_quark(in) || is_antiquark(in)) {
found_quark = true;
if(in.type != out.type) { // switch in quark type -> Wp couples to it
if(found_anti){ // already found qq for coupling to W
bail_out(psp, "Found second up/down pair");
} else if(abs(in.type)>4 || abs(out.type)>4){
bail_out(psp, "Found bottom/top pair");
}
found_anti = true;
if( is_up_type(in)) { // "up" in
if(W_type > 0){
// -> only allowed u -> Wp + d
if(in.type < 0 || is_up_type(out) || out.type < 0)
bail_out(psp, "u -/> Wp + d");
} else {
// -> only allowed ux -> Wm + dx
if(in.type > 0 || is_up_type(out) || out.type > 0)
bail_out(psp, "ux -/> Wm + dx");
}
} else { // "down" in
if(W_type > 0){
// -> only allowed dx -> Wp + ux
if(in.type > 0 || is_down_type(out) || out.type > 0)
bail_out(psp, "dx -/> Wp + ux");
} else {
// -> only allowed d -> Wm + u
if(in.type < 0 || is_down_type(out) || out.type < 0)
bail_out(psp, "d -/> Wm + u");
}
}
}
}
}
if(!found_quark) {
bail_out(psp, "Found no initial quarks");
} else if(!found_anti){
bail_out(psp, "Found no up/down pair");
}
return true;
}
}
int main(){
constexpr size_t n_psp_base = 1337;
const JetParameters jet_para{
fastjet::JetDefinition(fastjet::JetAlgorithm::antikt_algorithm, 0.4), 30, 5, 30};
PDF pdf(11000, pid::proton, pid::proton);
constexpr double E_cms = 13000.;
constexpr double subl_change = 0.5;
constexpr auto subl_channels = Subleading::all;
- const ParticlesPropMap boson_prop{
- {pid::Wp, {91.1876, 2.085, {Decay{ {pid::e_bar, pid::nu_e}, 1.}} }},
- {pid::Wm, {91.1876, 2.085, {Decay{ {pid::e, pid::nu_e_bar}, 1.}} }}
+ const ParticlesDecayMap boson_decays{
+ {pid::Wp, {Decay{ {pid::e_bar, pid::nu_e}, 1.} }},
+ {pid::Wm, {Decay{ {pid::e, pid::nu_e_bar}, 1.} }}
};
+ const EWConstants ew_constants{246.2196508,
+ ParticleProperties{80.385, 2.085},
+ ParticleProperties{91.187, 2.495},
+ ParticleProperties{125, 0.004165}
+ };
HEJ::Mixmax ran{};
// Wp2j
Process proc {{pid::proton,pid::proton}, 2, pid::Wp, {}};
size_t n_psp = n_psp_base;
for( size_t i = 0; i<n_psp; ++i){
const PhaseSpacePoint psp{proc,jet_para,pdf,E_cms, subl_change,subl_channels,
- boson_prop, ran};
+ boson_decays, ew_constants, ran};
if(psp.status()==good){
check_W2j(psp, *proc.boson);
} else { // bad process -> try again
++n_psp;
}
}
std::cout << "Wp+2j: Took " << n_psp << " to generate "
<< n_psp_base << " successfully PSP (" << 1.*n_psp/n_psp_base << " trials/PSP)" << std::endl;
// Wm2j
proc = Process{{pid::proton,pid::proton}, 2, pid::Wm, {}};
n_psp = n_psp_base;
for( size_t i = 0; i<n_psp; ++i){
const PhaseSpacePoint psp{proc,jet_para,pdf,E_cms, subl_change,subl_channels,
- boson_prop, ran};
+ boson_decays, ew_constants, ran};
if(psp.status()==good){
check_W2j(psp, *proc.boson);
} else { // bad process -> try again
++n_psp;
}
}
std::cout << "Wm+2j: Took " << n_psp << " to generate "
<< n_psp_base << " successfully PSP (" << 1.*n_psp/n_psp_base << " trials/PSP)" << std::endl;
std::cout << "All processes passed." << std::endl;
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/W_nj_classify.cc b/FixedOrderGen/t/W_nj_classify.cc
index bb95029..542ac76 100644
--- a/FixedOrderGen/t/W_nj_classify.cc
+++ b/FixedOrderGen/t/W_nj_classify.cc
@@ -1,184 +1,190 @@
/**
* \brief check that the PSP generates the all W+jet subleading processes
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include "JetParameters.hh"
-#include "ParticleProperties.hh"
+#include "Decay.hh"
#include "PhaseSpacePoint.hh"
#include "Process.hh"
#include "Subleading.hh"
#include "HEJ/Event.hh"
+#include "HEJ/EWConstants.hh"
#include "HEJ/Mixmax.hh"
#include "HEJ/PDF.hh"
#include "HEJ/utility.hh"
using namespace HEJFOG;
using namespace HEJ;
namespace {
void print_psp(PhaseSpacePoint const & psp){
std::cerr << "Process:\n"
<< psp.incoming()[0].type << " + "<< psp.incoming()[1].type << " -> ";
for(auto const & out: psp.outgoing()){
std::cerr << out.type << " ";
}
std::cerr << "\n";
}
void bail_out(PhaseSpacePoint const & psp, std::string msg){
print_psp(psp);
throw std::logic_error{msg};
}
}
int main(){
constexpr size_t n_psp_base = 10375;
const JetParameters jet_para{
fastjet::JetDefinition(fastjet::JetAlgorithm::antikt_algorithm, 0.4), 30, 5, 30};
PDF pdf(11000, pid::proton, pid::proton);
constexpr double E_cms = 13000.;
constexpr double subl_change = 0.8;
- const ParticlesPropMap boson_prop{
- {pid::Wp, {91.1876, 2.085, {Decay{ {pid::e_bar, pid::nu_e}, 1.}} }},
- {pid::Wm, {91.1876, 2.085, {Decay{ {pid::e, pid::nu_e_bar}, 1.}} }}
+ const ParticlesDecayMap boson_decays{
+ {pid::Wp, {Decay{ {pid::e_bar, pid::nu_e}, 1.} }},
+ {pid::Wm, {Decay{ {pid::e, pid::nu_e_bar}, 1.} }}
};
+ const EWConstants ew_constants{246.2196508,
+ ParticleProperties{80.385, 2.085},
+ ParticleProperties{91.187, 2.495},
+ ParticleProperties{125, 0.004165}
+ };
HEJ::Mixmax ran{};
auto subl_channels = Subleading::all;
std::vector<event_type::EventType> allowed_types{event_type::FKL,
event_type::unob, event_type::unof, event_type::qqxexb, event_type::qqxexf};
std::cout << "Wp3j" << std::endl;
// Wp3j
Process proc {{pid::proton,pid::proton}, 3, pid::Wp, {}};
size_t n_psp = n_psp_base;
std::unordered_map<event_type::EventType, size_t> type_counter;
for( size_t i = 0; i<n_psp; ++i){
const PhaseSpacePoint psp{proc,jet_para,pdf,E_cms, subl_change,subl_channels,
- boson_prop, ran};
+ boson_decays, ew_constants, ran};
if(psp.status()==good){
const Event ev{ to_EventData(psp).cluster(jet_para.def, jet_para.min_pt) };
++type_counter[ev.type()];
if( std::find(allowed_types.cbegin(), allowed_types.cend(), ev.type())
== allowed_types.cend()) {
bail_out(psp, "Found not allowed event of type "
+std::string(event_type::name(ev.type())));
}
} else { // bad process -> try again
++n_psp;
}
}
std::cout << "Wp+3j: Took " << n_psp << " to generate "
<< n_psp_base << " successfully PSP (" << 1.*n_psp/n_psp_base << " trials/PSP)" << std::endl;
std::cout << "States by classification:\n";
for(auto const & entry: type_counter){
const double fraction = static_cast<double>(entry.second)/n_psp_base;
const int percent = std::round(100*fraction);
std::cout << std::left << std::setw(25)
<< (event_type::name(entry.first) + std::string(":"))
<< entry.second << " (" << percent << "%)\n";
}
for(auto const & t: allowed_types){
if(type_counter[t] < 0.05 * n_psp_base){
std::cerr << "Less than 5% of the events are of type " << event_type::name(t) << std::endl;
return EXIT_FAILURE;
}
}
// Wm3j - only uno
proc = Process{{pid::proton,pid::proton}, 3, pid::Wm, {}};
n_psp = n_psp_base;
subl_channels = Subleading::uno;
allowed_types = {event_type::FKL, event_type::unob, event_type::unof};
type_counter.clear();
for( size_t i = 0; i<n_psp; ++i){
const PhaseSpacePoint psp{proc,jet_para,pdf,E_cms, subl_change,subl_channels,
- boson_prop, ran};
+ boson_decays, ew_constants, ran};
if(psp.status()==good){
const Event ev{ to_EventData(psp).cluster(jet_para.def, jet_para.min_pt) };
++type_counter[ev.type()];
if( std::find(allowed_types.cbegin(), allowed_types.cend(), ev.type())
== allowed_types.cend()) {
bail_out(psp, "Found not allowed event of type "
+std::string(event_type::name(ev.type())));
}
} else { // bad process -> try again
++n_psp;
}
}
std::cout << "Wm+3j (only uno): Took " << n_psp << " to generate "
<< n_psp_base << " successfully PSP (" << 1.*n_psp/n_psp_base << " trials/PSP)" << std::endl;
std::cout << "States by classification:\n";
for(auto const & entry: type_counter){
const double fraction = static_cast<double>(entry.second)/n_psp_base;
const int percent = std::round(100*fraction);
std::cout << std::left << std::setw(25)
<< (event_type::name(entry.first) + std::string(":"))
<< entry.second << " (" << percent << "%)\n";
}
for(auto const & t: allowed_types){
if(type_counter[t] < 0.05 * n_psp_base){
std::cerr << "Less than 5% of the events are of type " << event_type::name(t) << std::endl;
return EXIT_FAILURE;
}
}
// Wm4j
proc = Process{{pid::proton,pid::proton}, 4, pid::Wm, {}};
n_psp = n_psp_base;
subl_channels = Subleading::all;
allowed_types = {event_type::FKL,
event_type::unob, event_type::unof, event_type::qqxexb, event_type::qqxexf,
event_type::qqxmid};
type_counter.clear();
for( size_t i = 0; i<n_psp; ++i){
const PhaseSpacePoint psp{proc,jet_para,pdf,E_cms, subl_change,subl_channels,
- boson_prop, ran};
+ boson_decays, ew_constants, ran};
if(psp.status()==good){
const Event ev{ to_EventData(psp).cluster(jet_para.def, jet_para.min_pt)};
++type_counter[ev.type()];
if( std::find(allowed_types.cbegin(), allowed_types.cend(), ev.type())
== allowed_types.cend()) {
bail_out(psp, "Found not allowed event of type "
+std::string(event_type::name(ev.type())));
}
} else { // bad process -> try again
++n_psp;
}
}
std::cout << "Wm+4j: Took " << n_psp << " to generate "
<< n_psp_base << " successfully PSP (" << 1.*n_psp/n_psp_base << " trials/PSP)" << std::endl;
std::cout << "States by classification:\n";
for(auto const & entry: type_counter){
const double fraction = static_cast<double>(entry.second)/n_psp_base;
const int percent = std::round(100*fraction);
std::cout << std::left << std::setw(25)
<< (event_type::name(entry.first) + std::string(":"))
<< entry.second << " (" << percent << "%)\n";
}
for(auto const & t: allowed_types){
if(type_counter[t] < 0.03 * n_psp_base){
std::cerr << "Less than 3% of the events are of type " << event_type::name(t) << std::endl;
return EXIT_FAILURE;
}
}
std::cout << "All processes passed." << std::endl;
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/W_reconstruct_enu.cc b/FixedOrderGen/t/W_reconstruct_enu.cc
index 1db956a..badb36a 100644
--- a/FixedOrderGen/t/W_reconstruct_enu.cc
+++ b/FixedOrderGen/t/W_reconstruct_enu.cc
@@ -1,71 +1,72 @@
/**
* \brief that the reconstruction of the W works
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Event.hh"
#include "HEJ/Mixmax.hh"
using namespace HEJFOG;
using namespace HEJ;
namespace {
constexpr size_t num_events = 1000;
constexpr double invGeV2_to_pb = 389379292.;
}
double get_xs(std::string config_name){
auto config { load_config(config_name) };
config.events = num_events;
HEJ::Mixmax ran{1};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
xs += ev->central().weight;
}
return xs;
}
int main(){
double xs_W{ get_xs("config_Wp_2j.yml")};
double xs_enu{ get_xs("config_Wp_2j_decay.yml")};
if(std::abs(xs_W/xs_enu-1.)>1e-6){
std::cerr << "Reconstructing the W in the runcard gave a different results ("
<< xs_W << " vs. "<< xs_enu << " -> " << std::abs(xs_W/xs_enu-1.)*100 << "%)\n";
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/config_2j.yml b/FixedOrderGen/t/config_2j.yml
index 4431412..3b605fd 100644
--- a/FixedOrderGen/t/config_2j.yml
+++ b/FixedOrderGen/t/config_2j.yml
@@ -1,28 +1,36 @@
events: 100000
jets:
min pt: 30
R: 0.4
algorithm: antikt
max rapidity: 5
beam:
energy: 6500
particles: [p, p]
pdf: 11000
process: p p => 2j
subleading fraction: 0.1
subleading channels: none
scales: 125
random generator:
name: mixmax
particle properties:
Higgs:
mass: 125
width: 0
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/config_Wp_2j.yml b/FixedOrderGen/t/config_Wp_2j.yml
index 1f3874d..14b9216 100644
--- a/FixedOrderGen/t/config_Wp_2j.yml
+++ b/FixedOrderGen/t/config_Wp_2j.yml
@@ -1,27 +1,35 @@
events: 200000
jets:
min pt: 30
R: 0.4
algorithm: antikt
max rapidity: 5
beam:
energy: 6500
particles: [p, p]
pdf: 11000
process: p p => e+ nu_e 2j
subleading fraction: 0.37
scales: 125
particle properties:
- Wp:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
mass: 80.385
width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
random generator:
name: mixmax
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/config_Wp_2j_decay.yml b/FixedOrderGen/t/config_Wp_2j_decay.yml
index 7979293..37ce351 100644
--- a/FixedOrderGen/t/config_Wp_2j_decay.yml
+++ b/FixedOrderGen/t/config_Wp_2j_decay.yml
@@ -1,28 +1,38 @@
events: 200000
jets:
min pt: 30
R: 0.4
algorithm: antikt
max rapidity: 5
beam:
energy: 6500
particles: [p, p]
pdf: 11000
process: p p => Wp 2j
subleading fraction: 0.37
scales: 125
particle properties:
- Wp:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
mass: 80.385
width: 2.085
- decays: {into: [e+, nu_e], branching ratio: 1}
+ Z:
+ mass: 91.187
+ width: 2.495
+
+decays:
+ Wp: {into: [e+, nu_e], branching ratio: 1}
random generator:
name: mixmax
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/config_h_2j.yml b/FixedOrderGen/t/config_h_2j.yml
index b5a4ff9..7e8695e 100644
--- a/FixedOrderGen/t/config_h_2j.yml
+++ b/FixedOrderGen/t/config_h_2j.yml
@@ -1,28 +1,36 @@
events: 200000
jets:
min pt: 30
R: 0.4
algorithm: antikt
max rapidity: 5
beam:
energy: 6500
particles: [p, p]
pdf: 11000
process: p p => h 2j
subleading fraction: 0.37
subleading channels: none
scales: 125
particle properties:
Higgs:
mass: 125
width: 0
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
random generator:
name: mixmax
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/config_h_2j_decay.yml b/FixedOrderGen/t/config_h_2j_decay.yml
index fb157e9..d8ec47e 100644
--- a/FixedOrderGen/t/config_h_2j_decay.yml
+++ b/FixedOrderGen/t/config_h_2j_decay.yml
@@ -1,28 +1,38 @@
events: 200000
jets:
min pt: 30
R: 0.4
algorithm: antikt
max rapidity: 5
beam:
energy: 6500
particles: [p, p]
pdf: 11000
process: p p => h 2j
subleading fraction: 0
scales: 125
particle properties:
Higgs:
mass: 125
width: 0.00407
- decays: {into: [photon, photon], branching ratio: 0.00228}
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
+decays:
+ Higgs: {into: [photon, photon], branching ratio: 0.00228}
random generator:
name: mixmax
+
+vev: 246.2196508
diff --git a/FixedOrderGen/t/h_2j.cc b/FixedOrderGen/t/h_2j.cc
index 0c557ad..e993a8d 100644
--- a/FixedOrderGen/t/h_2j.cc
+++ b/FixedOrderGen/t/h_2j.cc
@@ -1,74 +1,75 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cmath>
#include <cassert>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Mixmax.hh"
#include "HEJ/Event.hh"
#include "HEJ/PDF.hh"
#include "HEJ/MatrixElement.hh"
using namespace HEJFOG;
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 2.04928; // +- 0.00377252
//calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
auto config = load_config("config_h_2j.yml");
HEJ::Mixmax ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
const auto the_Higgs = std::find_if(
begin(ev->outgoing()), end(ev->outgoing()),
[](HEJ::Particle const & p){ return p.type == HEJ::ParticleID::h; }
);
assert(the_Higgs != end(ev->outgoing()));
if(std::abs(the_Higgs->rapidity()) > 5.) continue;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << std::endl;
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.01*xs);
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/h_2j_decay.cc b/FixedOrderGen/t/h_2j_decay.cc
index 49a942d..0d25f19 100644
--- a/FixedOrderGen/t/h_2j_decay.cc
+++ b/FixedOrderGen/t/h_2j_decay.cc
@@ -1,93 +1,94 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cmath>
#include <cassert>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Event.hh"
#include "HEJ/MatrixElement.hh"
#include "HEJ/Particle.hh"
#include "HEJ/PDF.hh"
#include "HEJ/Ranlux64.hh"
#include "HEJ/utility.hh"
using namespace HEJFOG;
bool pass_dR_cut(
std::vector<fastjet::PseudoJet> const & jets,
std::vector<HEJ::Particle> const & photons
){
constexpr double delta_R_min = 0.7;
for(auto const & jet: jets){
for(auto const & photon: photons){
if(jet.delta_R(photon.p) < delta_R_min) return false;
}
}
return true;
}
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 0.00429198; // +- 1.0488e-05
//calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
auto config = load_config("config_h_2j_decay.yml");
HEJ::Ranlux64 ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
assert(ev->decays().size() == 1);
const auto decay = begin(ev->decays());
assert(ev->outgoing().size() > decay->first);
const auto & the_Higgs = ev->outgoing()[decay->first];
assert(the_Higgs.type == HEJ::pid::Higgs);
assert(decay->second.size() == 2);
auto const & gamma = decay->second;
assert(gamma[0].type == HEJ::pid::photon);
assert(gamma[1].type == HEJ::pid::photon);
assert(HEJ::nearby_ep(gamma[0].p + gamma[1].p, the_Higgs.p, 1e-6));
if(!pass_dR_cut(ev->jets(), gamma)) continue;
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << std::endl;
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.012*xs);
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/h_3j.cc b/FixedOrderGen/t/h_3j.cc
index fc01803..8d134ca 100644
--- a/FixedOrderGen/t/h_3j.cc
+++ b/FixedOrderGen/t/h_3j.cc
@@ -1,75 +1,76 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cmath>
#include <cassert>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Ranlux64.hh"
#include "HEJ/Event.hh"
#include "HEJ/MatrixElement.hh"
#include "HEJ/PDF.hh"
using namespace HEJFOG;
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 1.07807; // +- 0.0071
//calculated with HEJ revision 93efdc851b02a907a6fcc63956387f9f4c1111c2 +1
auto config = load_config("config_h_2j.yml");
config.process.njets = 3;
HEJ::Ranlux64 ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
const auto the_Higgs = std::find_if(
begin(ev->outgoing()), end(ev->outgoing()),
[](HEJ::Particle const & p){ return p.type == HEJ::ParticleID::h; }
);
assert(the_Higgs != end(ev->outgoing()));
if(std::abs(the_Higgs->rapidity()) > 5.) continue;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << std::endl;
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.02*xs);
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/h_3j_uno1.cc b/FixedOrderGen/t/h_3j_uno1.cc
index 1bb407c..94bc80e 100644
--- a/FixedOrderGen/t/h_3j_uno1.cc
+++ b/FixedOrderGen/t/h_3j_uno1.cc
@@ -1,79 +1,80 @@
/**
* check that adding uno emissions doesn't change the FKL cross section
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cassert>
#include <cmath>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Ranlux64.hh"
#include "Subleading.hh"
#include "HEJ/Event.hh"
#include "HEJ/MatrixElement.hh"
#include "HEJ/PDF.hh"
using namespace HEJFOG;
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 0.0243548; // +- 0.000119862
//calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
auto config = load_config("config_h_2j.yml");
config.process.njets = 3;
config.process.incoming = {HEJ::pid::u, HEJ::pid::u};
config.subleading_channels = HEJFOG::Subleading::uno;
HEJ::Ranlux64 ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
int uno_found = 0;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
if(ev->type() != HEJ::event_type::FKL){
++uno_found;
continue;
}
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << '\n';
std::cout << uno_found << " events with unordered emission" << std::endl;
assert(uno_found > 0);
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.05*xs);
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/h_3j_uno2.cc b/FixedOrderGen/t/h_3j_uno2.cc
index eb67ba9..ab069d9 100644
--- a/FixedOrderGen/t/h_3j_uno2.cc
+++ b/FixedOrderGen/t/h_3j_uno2.cc
@@ -1,74 +1,75 @@
/**
* check uno cross section
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cassert>
#include <cmath>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Ranlux64.hh"
#include "Subleading.hh"
#include "HEJ/Event.hh"
#include "HEJ/MatrixElement.hh"
#include "HEJ/PDF.hh"
using namespace HEJFOG;
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 0.00347538; // +- 3.85875e-05
//calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
auto config = load_config("config_h_2j.yml");
config.process.njets = 3;
config.process.incoming = {HEJ::pid::u, HEJ::pid::u};
config.subleading_fraction = 1.;
config.subleading_channels = HEJFOG::Subleading::uno;
HEJ::Ranlux64 ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
if(ev->type() == HEJ::event_type::FKL) continue;
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << std::endl;
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.05*xs);
return EXIT_SUCCESS;
}
diff --git a/FixedOrderGen/t/h_5j.cc b/FixedOrderGen/t/h_5j.cc
index 8a94527..cbcd7a2 100644
--- a/FixedOrderGen/t/h_5j.cc
+++ b/FixedOrderGen/t/h_5j.cc
@@ -1,71 +1,72 @@
/**
* This is a regression test
* the reference cross section has not been checked against any other program
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#ifdef NDEBUG
#undef NDEBUG
#endif
#include <algorithm>
#include <cassert>
#include <cmath>
#include <iostream>
#include "config.hh"
#include "EventGenerator.hh"
#include "HEJ/Ranlux64.hh"
#include "HEJ/Event.hh"
#include "HEJ/MatrixElement.hh"
#include "HEJ/PDF.hh"
using namespace HEJFOG;
int main(){
constexpr double invGeV2_to_pb = 389379292.;
constexpr double xs_ref = 0.252273; // +- 0.00657742
//calculated with HEJ revision 9570e3809613272ac4b8bf3236279ba23cf64d20
auto config = load_config("config_h_2j.yml");
config.process.njets = 5;
HEJ::Ranlux64 ran{};
HEJFOG::EventGenerator generator{
config.process,
config.beam,
HEJ::ScaleGenerator{
config.scales.base,
config.scales.factors,
config.scales.max_ratio
},
config.jets,
config.pdf_id,
config.subleading_fraction,
config.subleading_channels,
- config.particles_properties,
+ config.particle_decays,
config.Higgs_coupling,
+ config.ew_parameters,
ran
};
double xs = 0., xs_err = 0.;
for (int trials = 0; trials < config.events; ++trials){
auto ev = generator.gen_event();
if(generator.status() != good) continue;
assert(ev);
ev->central().weight *= invGeV2_to_pb;
ev->central().weight /= config.events;
xs += ev->central().weight;
xs_err += ev->central().weight*ev->central().weight;
}
xs_err = std::sqrt(xs_err);
std::cout << xs_ref << " ~ " << xs << " +- " << xs_err << std::endl;
assert(std::abs(xs - xs_ref) < 3*xs_err);
assert(xs_err < 0.06*xs);
return EXIT_SUCCESS;
}
diff --git a/config.yml b/config.yml
index a0fabd4..dd3f465 100644
--- a/config.yml
+++ b/config.yml
@@ -1,100 +1,115 @@
# number of attempted resummation phase space points for each input event
trials: 10
min extparton pt: 30 # minimum transverse momentum of extremal partons
# maximum soft transverse momentum fraction in extremal jets
#
# max ext soft pt fraction: 0.1
resummation jets: # resummation jet properties
min pt: 35 # minimum jet transverse momentum
algorithm: antikt # jet clustering algorithm
R: 0.4 # jet R parameter
fixed order jets: # properties of input jets
min pt: 30
# by default, algorithm and R are like for resummation jets
# treatment of he various event classes
# the supported settings are: reweight, keep, discard
# non-resummable events cannot be reweighted
event treatment:
FKL: reweight
unordered: keep
extremal qqx: keep
central qqx: keep
non-resummable: keep
# central scale choice or choices
#
# scales: [125, max jet pperp, H_T/2, 2*jet invariant mass, m_j1j2]
scales: 91.188
# factors by which the central scales should be multiplied
# renormalisation and factorisation scales are varied independently
#
# scale factors: [0.5, 0.7071, 1, 1.41421, 2]
# maximum ratio between renormalisation and factorisation scale
#
# max scale ratio: 2.0001
# import scale setting functions
#
# import scales:
# lib_my_scales.so: [scale0,scale1]
log correction: false # whether or not to include higher order logs
# event output files
#
# the supported formats are
# - Les Houches (suffix .lhe)
# - HepMC2 (suffix .hepmc)
# - HepMC3 (suffix .hepmc3 or .hepmc)
# TODO: - ROOT ntuples (suffix .root)
#
# An output file's format is deduced either automatically from the suffix
# or from an explicit specification, e.g.
# - Les Houches: outfile
event output:
- HEJ.lhe
# - HEJ_events.hepmc
# to use a rivet analysis
#
# analysis:
# rivet: MC_XS # rivet analysis name
# output: HEJ # name of the yoda files, ".yoda" and scale suffix will be added
#
# to use a custom analysis
#
# analysis:
# plugin: /path/to/libmyanalysis.so
# my analysis parameter: some value
# selection of random number generator and seed
# the choices are
# - mixmax (seed is an integer)
# - ranlux64 (seed is a filename containing parameters)
random generator:
name: mixmax
# seed: 1
+# Vacuum expectation value
+vev: 246.2196508
+
+# Properties of the weak gauge bosons
+particle properties:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
# parameters for Higgs-gluon couplings
# this requires compilation with qcdloop
#
# Higgs coupling:
# use impact factors: false
# mt: 174
# include bottom: true
# mb: 4.7
## ---------------------------------------------------------------------- ##
## The following settings are only intended for advances users. ##
## Please DO NOT SET them unless you know exactly what you are doing! ##
## ---------------------------------------------------------------------- ##
#
# regulator parameter: 0.2 # The regulator lambda for the subtraction terms
diff --git a/doc/sphinx/HEJ.rst b/doc/sphinx/HEJ.rst
index cc6171d..6ae67be 100644
--- a/doc/sphinx/HEJ.rst
+++ b/doc/sphinx/HEJ.rst
@@ -1,326 +1,359 @@
.. _`Running HEJ 2`:
Running HEJ 2
=============
Quick start
-----------
In order to run HEJ 2, you need a configuration file and a file
containing fixed-order events. A sample configuration is given by the
:file:`config.yml` file distributed together with HEJ 2. Events in the
Les Houches Event File format can be generated with standard Monte Carlo
generators like `MadGraph5_aMC@NLO <https://launchpad.net/mg5amcnlo>`_
or `Sherpa <https://sherpa.hepforge.org/trac/wiki>`_. If HEJ 2 was
compiled with `HDF5 <https://www.hdfgroup.org/>`_ support, it can also
read event files in the format suggested in
`arXiv:1905.05120 <https://arxiv.org/abs/1905.05120>`_.
HEJ 2 assumes that the cross section is given by the sum of the event
weights. Depending on the fixed-order generator it may be necessary to
adjust the weights in the Les Houches Event File accordingly.
The processes supported by HEJ 2 are
- Pure multijet production
- Production of a Higgs boson with jets
- Production of a W boson with jets
..
- *TODO* Production of a Z boson or photon with jets
where at least two jets are required in each case. For the time being,
only leading-order events are supported.
After generating an event file :file:`events.lhe` adjust the parameters
under the `fixed order jets`_ setting in :file:`config.yml` to the
settings in the fixed-order generation. Resummation can then be added by
running::
HEJ config.yml events.lhe
Using the default settings, this will produce an output event file
:file:`HEJ.lhe` with events including high-energy resummation.
When using the `Docker image <https://hub.docker.com/r/hejdock/hej>`_,
HEJ can be run with
.. code-block:: bash
docker run -v $PWD:$PWD -w $PWD hejdock/hej HEJ config.yml events.lhe
.. _`HEJ 2 settings`:
Settings
--------
HEJ 2 configuration files follow the `YAML <http://yaml.org/>`_
format. The following configuration parameters are supported:
.. _`trials`:
**trials**
High-energy resummation is performed by generating a number of
resummation phase space configurations corresponding to an input
fixed-order event. This parameter specifies how many such
configurations HEJ 2 should try to generate for each input
event. Typical values vary between 10 and 100.
.. _`min extparton pt`:
**min extparton pt**
Specifies the minimum transverse momentum in GeV of the most forward
and the most backward parton. This setting is needed to regulate an
otherwise uncancelled divergence. Its value should be slightly below
the minimum transverse momentum of jets specified by `resummation
jets: min pt`_. See also the `max ext soft pt fraction`_ setting.
.. _`max ext soft pt fraction`:
**max ext soft pt fraction**
Specifies the maximum fraction that soft radiation can contribute to
the transverse momentum of each the most forward and the most backward
jet. Values between around 0.05 and 0.1 are recommended. See also the
`min extparton pt`_ setting.
.. _`fixed order jets`:
**fixed order jets**
This tag collects a number of settings specifying the jet definition
in the event input. The settings should correspond to the ones used in
the fixed-order Monte Carlo that generated the input events.
.. _`fixed order jets: min pt`:
**min pt**
Minimum transverse momentum in GeV of fixed-order jets.
.. _`fixed order jets: algorithm`:
**algorithm**
The algorithm used to define jets. Allowed settings are
:code:`kt`, :code:`cambridge`, :code:`antikt`,
:code:`cambridge for passive`. See the `FastJet
<http://fastjet.fr/>`_ documentation for a description of these
algorithms.
.. _`fixed order jets: R`:
**R**
The R parameter used in the jet algorithm, roughly corresponding
to the jet radius in the plane spanned by the rapidity and the
azimuthal angle.
.. _`resummation jets`:
**resummation jets**
This tag collects a number of settings specifying the jet definition
in the observed, i.e. resummed events. These settings are optional, by
default the same values as for the `fixed order jets`_ are assumed.
.. _`resummation jets: min pt`:
**min pt**
Minimum transverse momentum in GeV of resummation jets. This
should be between 25% and 50% larger than the minimum transverse
momentum of fixed order jets set by `fixed order jets: min pt`_.
.. _`resummation jets: algorithm`:
**algorithm**
The algorithm used to define jets. The HEJ 2 approach to
resummation relies on properties of :code:`antikt` jets, so this
value is strongly recommended. For a list of possible other
values, see the `fixed order jets: algorithm`_ setting.
.. _`resummation jets: R`:
**R**
The R parameter used in the jet algorithm.
.. _`event treatment`:
**event treatment**
Specify how to treat different event types. The different event types
contribute to different orders in the high-energy limit. The possible values
are :code:`reweight` to enable resummation, :code:`keep` to keep the events as
they are up to a possible change of renormalisation and factorisation scale,
and :code:`discard` to discard these events.
.. _`FKL`:
**FKL**
Specifies how to treat events respecting FKL rapidity ordering. These
configurations are dominant in the high-energy limit.
.. _`unordered`:
**unordered**
Specifies how to treat events with one emission that does not respect FKL
ordering, e.g. :code:`u d => g u d`. In the high-energy limit, such
configurations are logarithmically suppressed compared to FKL
configurations.
.. _`extremal qqx`:
**extremal qqx**
Specifies how to treat events with a quark-antiquark pair as extremal
partons in rapidity, e.g. :code:`g d => u u_bar d`. In the high-energy
limit, such configurations are logarithmically suppressed compared to FKL
configurations. :code:`reweight` is currently only supported for W boson
plus jets production.
.. _`central qqx`:
**central qqx**
Specifies how to treat events with a quark-antiquark pair central in
rapidity, e.g. :code:`g g => g u u_bar g`. In the high-energy limit, such
configurations are logarithmically suppressed compared to FKL
configurations. :code:`reweight` is currently only supported for W boson
plus jets production.
.. _`non-resummable`:
**non-resummable**
Specifies how to treat events where no resummation is possible. Only
:code:`keep` or :code:`discard` are valid options, *not* :code:`reweight`
for obvious reasons.
- .. _`scales`:
+.. _`scales`:
**scales**
Specifies the renormalisation and factorisation scales for the output
events. This can either be a single entry or a list :code:`[scale1,
scale2, ...]`. For the case of a list the first entry defines the
central scale. Possible values are fixed numbers to set the scale in
GeV or the following:
- :code:`H_T`: The sum of the scalar transverse momenta of all
final-state particles
- :code:`max jet pperp`: The maximum transverse momentum of all jets
- :code:`jet invariant mass`: Sum of the invariant masses of all jets
- :code:`m_j1j2`: Invariant mass between the two hardest jets.
Scales can be multiplied or divided by overall factors, e.g. :code:`H_T/2`.
It is also possible to import scales from an external library, see
:ref:`Custom scales`
.. _`scale factors`:
**scale factors**
A list of numeric factors by which each of the `scales`_ should be
multiplied. Renormalisation and factorisation scales are varied
independently. For example, a list with entries :code:`[0.5, 2]`
would give the four scale choices (0.5μ\ :sub:`r`, 0.5μ\ :sub:`f`);
(0.5μ\ :sub:`r`, 2μ\ :sub:`f`); (2μ\ :sub:`r`, 0.5μ\ :sub:`f`); (2μ\
:sub:`r`, 2μ\ :sub:`f`) in this order. The ordering corresponds to
the order of the final event weights.
.. _`max scale ratio`:
**max scale ratio**
Specifies the maximum factor by which renormalisation and
factorisation scales may difer. For a value of :code:`2` and the
example given for the `scale factors`_ the scale choices
(0.5μ\ :sub:`r`, 2μ\ :sub:`f`) and (2μ\ :sub:`r`, 0.5μ\ :sub:`f`)
will be discarded.
.. _`log correction`:
**log correction**
Whether to include corrections due to the evolution of the strong
coupling constant in the virtual corrections. Allowed values are
:code:`true` and :code:`false`.
.. _`event output`:
**event output**
Specifies the name of a single event output file or a list of such
files. The file format is either specified explicitly or derived from
the suffix. For example, :code:`events.lhe` or, equivalently
:code:`Les Houches: events.lhe` generates an output event file
:code:`events.lhe` in the Les Houches format. The supported formats
are
- :code:`file.lhe` or :code:`Les Houches: file`: The Les Houches
event file format.
- :code:`file.hepmc2` or :code:`HepMC2: file`: HepMC format version 2.
- :code:`file.hepmc3` or :code:`HepMC3: file`: HepMC format version 3.
- :code:`file.hepmc` or :code:`HepMC: file`: The latest supported
version of the HepMC format, currently version 3.
.. _`random generator`:
**random generator**
Sets parameters for random number generation.
.. _`random generator: name`:
**name**
Which random number generator to use. Currently, :code:`mixmax`
and :code:`ranlux64` are supported. Mixmax is recommended. See
the `CLHEP documentation
<http://proj-clhep.web.cern.ch/proj-clhep/index.html#docu>`_ for
details on the generators.
.. _`random generator: seed`:
**seed**
The seed for random generation. This should be a single number for
:code:`mixmax` and the name of a state file for :code:`ranlux64`.
.. _`analysis`:
**analysis**
Name and Setting for the event analyses; either a custom
analysis plugin or Rivet. For the first the :code:`plugin` sub-entry
should be set to the analysis file path. All further entries are passed on
to the analysis. To use Rivet a list of Rivet analyses have to be
given in :code:`rivet` and prefix for the yoda file has to be set
through :code:`output`. See :ref:`Writing custom analyses` for details.
+.. _`vev`:
+
+**vev**
+ Higgs vacuum expectation value in GeV. All electro-weak constants are derived
+ from this together with the `particle properties`_.
+
+.. _`particle properties`:
+
+**particle properties**
+
+ Specifies various properties of the different particles (Higgs, W or Z). All
+ electro-weak constants are derived from these together with the :ref:`vacuum
+ expectation value<vev>`.
+
+.. _`particle properties: particle`:
+
+ **Higgs, W or Z**
+ The particle (Higgs, |W+| or |W-|, Z) for which the following properties
+ are defined.
+
+ .. |W+| replace:: W\ :sup:`+`
+ .. |W-| replace:: W\ :sup:`-`
+
+ .. _`particle properties: particle: mass`:
+
+ **mass**
+ The mass of the particle in GeV.
+
+ .. _`particle properties: particle: width`:
+
+ **width**
+ The total decay width of the particle in GeV.
+
.. _`Higgs coupling`:
**Higgs coupling**
This collects a number of settings concerning the effective coupling
of the Higgs boson to gluons. This is only relevant for the
production process of a Higgs boson with jets and only supported if
HEJ 2 was compiled with `QCDLoop
<https://github.com/scarrazza/qcdloop>`_ support.
.. _`Higgs coupling: use impact factors`:
**use impact factors**
Whether to use impact factors for the coupling to the most forward
and most backward partons. Impact factors imply the infinite
top-quark mass limit.
.. _`Higgs coupling: mt`:
**mt**
The value of the top-quark mass in GeV. If this is not specified,
the limit of an infinite mass is taken.
.. _`Higgs coupling: include bottom`:
**include bottom**
Whether to include the Higgs coupling to bottom quarks.
.. _`Higgs coupling: mb`:
**mb**
The value of the bottom-quark mass in GeV. Only used for the Higgs
coupling, external bottom-quarks are always assumed to be massless.
Advanced Settings
~~~~~~~~~~~~~~~~~
All of the following settings are optional. Please **do not set** any of the
following options, unless you know exactly what you are doing. The default
behaviour gives the most reliable results for a wide range of observables.
.. _`regulator parameter`:
**regulator parameter**
Slicing parameter to regularise the subtraction term, called :math:`\lambda`
in `arxiv:1706.01002 <https://arxiv.org/abs/1706.01002>`_. Default is 0.2
diff --git a/doc/sphinx/HEJFOG.rst b/doc/sphinx/HEJFOG.rst
index 4a22e7d..7c33009 100644
--- a/doc/sphinx/HEJFOG.rst
+++ b/doc/sphinx/HEJFOG.rst
@@ -1,310 +1,295 @@
The HEJ Fixed Order Generator
=============================
For high jet multiplicities event generation with standard fixed-order
generators becomes increasingly cumbersome. For example, the
leading-order production of a Higgs Boson with five or more jets is
computationally prohibitively expensive.
To this end, HEJ 2 provides the ``HEJFOG`` fixed-order generator
that allows to generate events with high jet multiplicities. To
facilitate the computation the limit of Multi-Regge Kinematics with
large invariant masses between all outgoing particles is assumed in the
matrix elements. The typical use of the ``HEJFOG`` is to supplement
low-multiplicity events from standard generators with high-multiplicity
events before using the HEJ 2 program to add high-energy
resummation.
Installation
------------
The ``HEJFOG`` comes bundled together with HEJ 2 and the
installation is very similar. After downloading HEJ 2 and
installing the prerequisites as described in :ref:`Installation` the
``HEJFOG`` can be installed with::
cmake /path/to/FixedOrderGen -DCMAKE_INSTALL_PREFIX=target/directory
make install
where :file:`/path/to/FixedOrderGen` refers to the :file:`FixedOrderGen`
subdirectory in the HEJ 2 directory. If HEJ 2 was
installed to a non-standard location, it may be necessary to specify the
directory containing :file:`HEJ-config.cmake`. If the base installation
directory is :file:`/path/to/HEJ`, :file:`HEJ-config.cmake` should be
found in :file:`/path/to/HEJ/lib/cmake/HEJ` and the commands for
installing the ``HEJFOG`` would read::
cmake /path/to/FixedOrderGen -DHEJ_DIR=/path/to/HEJ/lib/cmake/HEJ -DCMAKE_INSTALL_PREFIX=target/directory
make install
The installation can be tested with::
make test
provided that the CT10nlo PDF set is installed.
Running the fixed-order generator
---------------------------------
After installing the ``HEJFOG`` you can modify the provided
configuration file :file:`configFO.yml` and run the generator with::
HEJFOG configFO.yml
The resulting event file, by default named :file:`HEJFO.lhe`, can then be
fed into HEJ 2 like any event file generated from a standard
fixed-order generator, see :ref:`Running HEJ 2`.
Settings
--------
Similar to HEJ 2, the ``HEJFOG`` uses a `YAML
<http://yaml.org/>`_ configuration file. The settings are
.. _`process`:
**process**
The scattering process for which events are being generated. The
format is
:code:`in1 in2 => out1 out2 ...`
The incoming particles, :code:`in1`, :code:`in2` can be
- quarks: :code:`u`, :code:`d`, :code:`u_bar`, and so on
- gluons: :code:`g`
- protons :code:`p` or antiprotons :code:`p_bar`
The outgoing particles, can be
- jets: :code:`j`, multiple jets can be grouped together e.g. :code:`2j`
- - bosons: Any gauge boson, they require `particle properties`_
+ - bosons: Any gauge boson, they might further :ref:`decay<decays>`
- leptons: if they can be reconstructed to a :code:`W+` or :code:`W-`,
e.g. :code:`e+ nu_e`
At most one of the outgoing particles can be a boson, the rest has to be
partonic. At the moment only Higgs :code:`h`, :code:`W+` and :code:`W-`
bosons are supported. All other outgoing particles are jets. There have to be
at least two jets. Instead of the leptons decays of the bosons can be added
- through the :ref:`particle properties<particle properties: particle:
- decays>`. The latter is required to decay a Higgs boson. So :code:`p p => Wp
- j j` is the same as :code:`p p => e+ nu_e 2j`, if the decay :code:`Wp => e+
- nu_e` is specified in `particle properties`_.
+ through the :ref:`decays<decays>`. The latter is required to decay a Higgs
+ boson. So :code:`p p => Wp j j` is the same as :code:`p p => e+ nu_e 2j`, if
+ the decay :code:`Wp => e+ nu_e` is specified in `decays`_.
.. _`events`:
**events**
Specifies the number of events to generate.
.. _`jets`:
**jets**
Defines the properties of the generated jets.
.. _`jets: min pt`:
**min pt**
Minimum jet transverse momentum in GeV.
.. _`jets: peak pt`:
**peak pt**
Optional setting to specify the dominant jet transverse momentum
in GeV. If the generated events are used as input for HEJ
resummation, this should be set to the minimum transverse momentum
of the resummation jets. In all cases it has to be larger than
:code:`min pt`. The effect is that only a small fraction of jets
will be generated with a transverse momentum below the value of
this setting.
.. _`jets: algorithm`:
**algorithm**
The algorithm used to define jets. Allowed settings are
:code:`kt`, :code:`cambridge`, :code:`antikt`,
:code:`cambridge for passive`. See the `FastJet
<http://fastjet.fr/>`_ documentation for a description of these
algorithms.
.. _`jets: R`:
**R**
The R parameter used in the jet algorithm.
.. _`jets: max rapidity`:
**max rapidity**
Maximum absolute value of the jet rapidity.
.. _`beam`:
**beam**
Defines various properties of the collider beam.
.. _`beam: energy`:
**energy**
The beam energy in GeV. For example, the 13
TeV LHC corresponds to a value of 6500.
.. _`beam: particles`:
**particles**
A list :code:`[p1, p2]` of two beam particles. The only supported
entries are protons :code:`p` and antiprotons :code:`p_bar`.
.. _`pdf`:
**pdf**
The `LHAPDF number <https://lhapdf.hepforge.org/pdfsets>`_ of the PDF set.
For example, 230000 corresponds to an NNPDF 2.3 NLO PDF set.
.. _`subleading fraction`:
**subleading fraction**
This setting is related to the fraction of events that are not a FKL
configuration. All possible subleading process are listed in
:ref:`subleading channels<subleading channels>`. This value must be
positive and not larger than 1. It should typically be chosen between
0.01 and 0.1. Note that while this parameter influences the chance of
generating subleading configurations, it generally does not
correspond to the actual fraction of subleading events.
.. _`subleading channels`:
**subleading channels**
Optional parameters to select a specific subleading process, multiple
channels can be selected at once. If multiple subleading configurations
are possible one will be selected at random for each event, thus each
final state will include at most one subleading process, e.g. either
:code:`unordered` or :code:`qqx`. Only has an effect if
:code:`subleading fraction` is non-zero. The following values are allowed:
- :code:`all`: All channels allowed. This is the default.
- :code:`none`: No subleading contribution, only the leading (FKL)
configurations are allowed. This is equivalent to
:code:`subleading fraction: 0`.
- :code:`unordered`: Unordered emission allowed.
Unordered emission are any rapidity ordering where exactly one gluon is
emitted outside the rapidity ordering required in FKL events. More
precisely, if at least one of the incoming particles is a quark or
antiquark and there are more than two jets in the final state,
:code:`subleading fraction` states the probability that the flavours
of the outgoing particles are assigned in such a way that an unordered
configuration arises.
- :code:`qqx`: Production of a quark-antiquark pair. In the leading
(FKL) configurations all partons except for the most backward and
forward ones are gluons. If the :code:`qqx` channel is allowed,
:code:`subleading fraction` gives the probability of emitting a
quark-antiquark pair in place of two gluons that are adjacent in
rapidity. Quark-antiquark pairs are currently only implemented for
W boson production.
.. _`unweight`:
**unweight**
This setting defines the parameters for the partial unweighting of
events. You can disable unweighting by removing this entry from the
configuration file.
.. _`unweight: sample size`:
**sample size**
The number of weighted events used to calibrate the unweighting.
A good default is to set this to the number of target
`events`_. If the number of `events`_ is large this can
lead to significant memory consumption and a lower value should be
chosen. Contrarily, for large multiplicities the unweighting
efficiency becomes worse and the sample size should be increased.
.. _`unweight: max deviation`:
**max deviation**
Controls the range of events to which unweighting is applied. A
larger value means that a larger fraction of events are unweighted.
Typical values are between -1 and 1.
-.. _`particle properties`:
+.. _`decays`:
-**particle properties**
- Specifies various properties of the different particles (Higgs, W or Z).
- This is only relevant if the chosen `process`_ is the production of the
- corresponding particles with jets. E.g. for the `process`_
- :code:`p p => h 2j` the :code:`mass`, :code:`width` and (optionally)
- :code:`decays` of the :code:`Higgs` boson are required, while all other
- particle properties will be ignored.
-
-.. _`particle properties: particle`:
-
- **Higgs, W+, W- or Z**
- The particle (Higgs, |W+|, |W-|, Z) for which the following
- properties are defined.
-
- .. |W+| replace:: W\ :sup:`+`
- .. |W-| replace:: W\ :sup:`-`
-
- .. _`particle properties: particle: mass`:
-
- **mass**
- The mass of the particle in GeV.
-
- .. _`particle properties: particle: width`:
-
- **width**
- The total decay width of the particle in GeV.
+**decays**
+ Optional setting specifying the decays of the particle. Only the decay
+ into two particles is implemented. Each decay has the form
- .. _`particle properties: particle: decays`:
+ :code:`boson: {into: [p1,p2], branching ratio: r}`
- **decays**
- Optional setting specifying the decays of the particle. Only the decay
- into two particles is implemented. Each decay has the form
+ where :code:`boson` is the corresponding boson, :code:`p1` and :code:`p2` are
+ the particle names of the decay product (e.g. :code:`photon`) and :code:`r`
+ is the branching ratio. The branching ratio is optional (:code:`1` by
+ default).
- :code:`{into: [p1,p2], branching ratio: r}`
+ Decays of a Higgs boson are treated as the production and subsequent
+ decay of an on-shell Higgs boson, so decays into e.g. Z bosons are not
+ supported. In contrast W bosons are decayed off-shell, thus the
+ branching ratio should not be specified or set to :code:`1`.
- where :code:`p1` and :code:`p2` are the particle names of the
- decay product (e.g. :code:`photon`) and :code:`r` is the branching
- ratio. The branching ratio is optional (:code:`1` by default).
-
- Decays of a Higgs boson are treated as the production and subsequent
- decay of an on-shell Higgs boson, so decays into e.g. Z bosons are not
- supported. In contrast W bosons are decayed off-shell, thus the
- branching ratio should not be changed or set to :code:`1`.
-
-.. _`scales`:
+.. _`FOG scales`:
**scales**
- Specifies the renormalisation and factorisation scales for the output
- events. For details, see the corresponding entry in the HEJ 2
- :ref:`HEJ 2 settings`. Note that this should usually be a
- single value, as the weights resulting from additional scale choices
- will simply be ignored when adding high-energy resummation with HEJ 2.
+ Specifies the renormalisation and factorisation scales for the output events.
+ For details, see the corresponding entry in the HEJ 2
+ :ref:`settings<scales>`. Note that this should usually be a single value, as
+ the weights resulting from additional scale choices will simply be ignored
+ when adding high-energy resummation with HEJ 2.
-.. _`event output`:
+.. _`FOG event output`:
**event output**
- Specifies the name of a single event output file or a list of such
- files. See the corresponding entry in the HEJ 2
- :ref:`HEJ 2 settings` for details.
+ Specifies the name of a single event output file or a list of such files. See
+ the corresponding entry in the HEJ 2 :ref:`settings<event output>` for
+ details.
.. _`RanLux init`:
-.. _`random generator`:
+.. _`FOG random generator`:
**random generator**
Sets parameters for random number generation. See the HEJ 2
- :ref:`HEJ 2 settings` for details.
+ :ref:`settings<random generator>` for details.
-.. _`analysis`:
+.. _`FOG analysis`:
**analysis**
Specifies the name and settings for a custom analysis library. This
can be useful to specify cuts at the fixed-order level. See the
- corresponding entry in the HEJ 2 :ref:`HEJ 2 settings`
+ corresponding entry in the HEJ 2 :ref:`settings<analysis>`
for details.
-.. _`Higgs coupling`:
+.. _`FOG vev`:
+
+**vev**
+ Higgs vacuum expectation value in GeV. All electro-weak constants are derived
+ from this together with the :ref:`particle properties <FOG particle
+ properties>`.
+
+.. _`FOG particle properties`:
+
+**particle properties**
+ Specifies various properties of the different particles (Higgs, W or Z).
+ These have to be specified for all bosons. See the corresponding entry in the
+ HEJ 2 :ref:`settings<particle properties>` for details.
+
+.. _`FOG Higgs coupling`:
**Higgs coupling**
- This collects a number of settings concerning the effective coupling
- of the Higgs boson to gluons. See the corresponding entry in the
- HEJ 2 :ref:`HEJ 2 settings` for details.
+ This collects a number of settings concerning the effective coupling of the
+ Higgs boson to gluons. See the corresponding entry in the HEJ 2
+ :ref:`settings<Higgs coupling>` for details.
diff --git a/include/HEJ/Constants.hh b/include/HEJ/Constants.hh
index 19be946..0bcd2ac 100644
--- a/include/HEJ/Constants.hh
+++ b/include/HEJ/Constants.hh
@@ -1,41 +1,33 @@
/** \file
* \brief Header file defining all global constants used for HEJ
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#pragma once
namespace HEJ{
/// @name QCD parameters
//@{
constexpr double N_C = 3.; //!< number of Colours
constexpr double C_A = N_C; //!< \f$C_A\f$
constexpr double C_F = (N_C*N_C - 1.)/(2.*N_C); //!< \f$C_F\f$
constexpr double t_f = 0.5; //!< \f$t_f\f$
constexpr double n_f = 5.; //!< number light flavours
constexpr double beta0 = 11./3.*C_A - 4./3.*t_f*n_f; //!< \f$\beta_0\f$
//@}
-/// @name QFT parameters
-//@{
- constexpr double vev = 246.2196508; //!< Higgs vacuum expectation value in GeV
- constexpr double gw = 0.653233; //!< elector-weak coupling
- constexpr double MW = 80.419; //!< The W mass in GeV/c^2
- constexpr double GammaW = 2.0476; //!< the W width in GeV/c^2
-
- //@}
/// @name Generation Parameters
//@{
//! @brief Default scale for virtual correction
//! \f$\lambda\f$ cf. eq. (20) in \cite Andersen:2011hs
constexpr double CLAMBDA = 0.2;
constexpr double CMINPT = 0.2; //!< minimal \f$p_t\f$ of all partons
//@}
/// @name Conventional Parameters
//@{
//! Value of first colour for colour dressing, according to LHE convention
//! \cite Boos:2001cv
constexpr int COLOUR_OFFSET = 501;
//@}
}
diff --git a/include/HEJ/EWConstants.hh b/include/HEJ/EWConstants.hh
new file mode 100644
index 0000000..b055b34
--- /dev/null
+++ b/include/HEJ/EWConstants.hh
@@ -0,0 +1,89 @@
+/** \file
+ * \brief Defines the electro weak parameters
+ *
+ * \authors The HEJ collaboration (see AUTHORS for details)
+ * \date 2019
+ * \copyright GPLv2 or later
+ */
+#pragma once
+
+#include <cmath>
+
+#include "HEJ/exceptions.hh"
+#include "HEJ/PDG_codes.hh"
+
+namespace HEJ {
+ //! collection of basic particle properties
+ struct ParticleProperties{
+ double mass;
+ double width;
+ };
+
+ //! Collection of electro-weak constants
+ class EWConstants {
+ public:
+ EWConstants() = default;
+ //! initialise by Vacuum expectation value & boson properties
+ EWConstants(
+ double vev, //!< vacuum expectation value
+ ParticleProperties const & Wprop, //!< W boson mass & width
+ ParticleProperties const & Zprop, //!< Z boson mass & width
+ ParticleProperties const & Hprop //!< Higgs boson mass & width
+ ): set{true},vev_{vev}, Wprop_{Wprop}, Zprop_{Zprop}, Hprop_{Hprop} {}
+ //! set constants by Vacuum expectation value & boson properties
+ void set_vevWZH(
+ double vev, //!< vacuum expectation value
+ ParticleProperties const & Wprop, //!< W boson mass & width
+ ParticleProperties const & Zprop, //!< Z boson mass & width
+ ParticleProperties const & Hprop //!< Higgs boson mass & width
+ ){
+ set = true; vev_= vev; Wprop_= Wprop; Zprop_= Zprop; Hprop_= Hprop;
+ }
+ //! vacuum expectation value
+ double vev() const {check_set(); return vev_;}
+ //! Properties of the W boson
+ ParticleProperties const & Wprop() const {check_set(); return Wprop_;}
+ //! Properties of the Z boson
+ ParticleProperties const & Zprop() const {check_set(); return Zprop_;}
+ //! Properties of the Higgs boson
+ ParticleProperties const & Hprop() const {check_set(); return Hprop_;}
+ //! access Properties by boson id
+ ParticleProperties const & prop(ParticleID const id) const {
+ using namespace pid;
+ switch(id){
+ case Wp:
+ case Wm:
+ return Wprop();
+ case Z:
+ return Zprop();
+ case h:
+ return Hprop();
+ default:
+ throw std::invalid_argument("No properties available for particle "+name(id));
+ }
+ }
+ //! cosine of Weinberg angle
+ double cos_tw() const {return Wprop().mass/Zprop().mass;}
+ //! cosine square of Weinberg angle
+ double cos2_tw() const {return cos_tw()*cos_tw();}
+ //! sinus Weinberg angle
+ double sin_tw() const {return sqrt(sin2_tw());}
+ //! sinus square of Weinberg angle
+ double sin2_tw() const {return 1. - cos2_tw();}
+ //! elector magnetic coupling
+ double alpha_em() const {return e2()/4./M_PI;}
+ //! weak coupling
+ double alpha_w() const {return gw2()/2.;}
+ private:
+ double gw2() const {return 4*Wprop().mass/vev()*Wprop().mass/vev();}
+ double e2() const {return gw2()*sin2_tw();}
+ void check_set() const {
+ if(!set) throw std::invalid_argument("EW constants not specified");
+ }
+ bool set{false};
+ double vev_;
+ ParticleProperties Wprop_;
+ ParticleProperties Zprop_;
+ ParticleProperties Hprop_;
+ };
+}
diff --git a/include/HEJ/Hjets.hh b/include/HEJ/Hjets.hh
index 1f234e7..9ccb831 100644
--- a/include/HEJ/Hjets.hh
+++ b/include/HEJ/Hjets.hh
@@ -1,384 +1,403 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
/** \file
* \brief Functions computing the square of current contractions in H+Jets.
*
* This file contains all the H+Jet specific components to compute
* the current contractions for valid HEJ processes, to form a full
* H+Jets ME, currently one would have to use functions from the
* jets.hh header also. We have FKL and also unordered components for
* H+Jets.
*
* @TODO add a namespace
*/
#pragma once
#include <CLHEP/Vector/LorentzVector.h>
typedef CLHEP::HepLorentzVector HLV;
//! Square of gg->gg Higgs+Jets Scattering Current
/**
* @param p1out Momentum of final state gluon
* @param p1in Momentum of initial state gluon
* @param p2out Momentum of final state gluon
* @param p2in Momentum of intial state gluon
* @param q1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for gg->gg Scattering
*
* g~p1 g~p2
* should be called with q1 meant to be contracted with p2 in first part of vertex
* (i.e. if g is backward, q1 is forward)
*/
double ME_H_gg (HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV q1, HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of gq->gq Higgs+Jets Scattering Current with Higgs before Gluon
/**
* @param p1out Momentum of final state gluon
* @param p1in Momentum of initial state gluon
* @param p2out Momentum of final state gluon
* @param p2in Momentum of intial state gluon
* @param pH Momentum of Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contraction
*/
double ME_Houtside_gq(HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV pH,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qg->qg Higgs+Jets Scattering Current
/**
* @param p1out Momentum of final state quark
* @param p1in Momentum of initial state quark
* @param p2out Momentum of final state gluon
* @param p2in Momentum of intial state gluon
* @param q1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qg->qg Scattering
*
* q~p1 g~p2 (i.e. ALWAYS p1 for quark, p2 for gluon)
* should be called with q1 meant to be contracted with p2 in first part of vertex
* (i.e. if g is backward, q1 is forward)
*/
double ME_H_qg (HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV q1, HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qbarg->qbarg Higgs+Jets Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param p1in Momentum of initial state anti-quark
* @param p2out Momentum of final state gluon
* @param p2in Momentum of intial state gluon
* @param q1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qbarg->qbarg Scattering
*
* qbar~p1 g~p2 (i.e. ALWAYS p1 for anti-quark, p2 for gluon)
* should be called with q1 meant to be contracted with p2 in first part of vertex
* (i.e. if g is backward, q1 is forward)
*/
double ME_H_qbarg (HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV q1, HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qQ->qQ Higgs+Jets Scattering Current
/**
* @param p1out Momentum of final state quark
* @param p1in Momentum of initial state quark
* @param p2out Momentum of final state quark
* @param p2in Momentum of intial state quark
* @param q1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qQ->qQ Scattering
*
* q~p1 Q~p2 (i.e. ALWAYS p1 for quark, p2 for quark)
* should be called with q1 meant to be contracted with p2 in first part of vertex
* (i.e. if Q is backward, q1 is forward)
*/
double ME_H_qQ (HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV q1, HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qQbar->qQbar Higgs+Jets Scattering Current
/**
* @param p1out Momentum of final state quark
* @param p1in Momentum of initial state quark
* @param p2out Momentum of final state anti-quark
* @param p2in Momentum of intial state anti-quark
* @param q1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qQ->qQ Scattering
*
* q~p1 Qbar~p2 (i.e. ALWAYS p1 for quark, p2 for anti-quark)
* should be called with q1 meant to be contracted with p2 in first part of vertex
* (i.e. if Qbar is backward, q1 is forward)
*/
double ME_H_qQbar (HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV q1, HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qbarQ->qbarQ Higgs+Jets Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param p1in Momentum of initial state anti-quark
* @param p2out Momentum of final state quark
* @param p2in Momentum of intial state quark
* @param q1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qbarQ->qbarQ Scattering
*
* qbar~p1 Q~p2 (i.e. ALWAYS p1 for anti-quark, p2 for quark)
* should be called with q1 meant to be contracted with p2 in first part of vertex
* (i.e. if Q is backward, q1 is forward)
*/
double ME_H_qbarQ (HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV q1, HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qbarQbar->qbarQbar Higgs+Jets Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param p1in Momentum of initial state anti-quark
* @param p2out Momentum of final state anti-quark
* @param p2in Momentum of intial state anti-quark
* @param q1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qbarQbar->qbarQbar Scattering
*
* qbar~p1 Qbar~p2 (i.e. ALWAYS p1 for anti-quark, p2 for anti-quark)
* should be called with q1 meant to be contracted with p2 in first part of vertex
* (i.e. if Qbar is backward, q1 is forward)
*/
double ME_H_qbarQbar (HLV p1out, HLV p1in,
HLV p2out, HLV p2in,
HLV q1, HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! @name Unordered backwards
//! @{
//! Square of qbarQ->qbarQg Higgs+Jets Unordered b Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param p1in Momentum of initial state anti-quark
* @param pg Momentum of unordered b gluon
* @param p2out Momentum of final state quark
* @param p2in Momentum of intial state quark
* @param qH1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qbarQ->qbarQg Scattering
*
* This construction is taking rapidity order: p1out >> p2out > pg
*/
double ME_H_unob_qbarQ (HLV p1out, HLV p1in,
HLV pg, HLV p2out,
HLV p2in, HLV qH1,
HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qQ->qQg Higgs+Jets Unordered b Scattering Current
/**
* @param p1out Momentum of final state quark
* @param p1in Momentum of initial state quark
* @param pg Momentum of unordered b gluon
* @param p2out Momentum of final state quark
* @param p2in Momentum of intial state quark
* @param qH1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qQ->qQg Scattering
*
* This construction is taking rapidity order: p1out >> p2out > pg
*/
double ME_H_unob_qQ (HLV p1out, HLV p1in,
HLV pg, HLV p2out,
HLV p2in, HLV qH1,
HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qQbar->qQbarg Higgs+Jets Unordered b Scattering Current
/**
* @param p1out Momentum of final state quark
* @param p1in Momentum of initial state quark
* @param pg Momentum of unordered b gluon
* @param p2out Momentum of final state anti-quark
* @param p2in Momentum of intial state anti-quark
* @param qH1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qQbar->qQbarg Scattering
*
* This construction is taking rapidity order: p1out >> p2out > pg
*/
double ME_H_unob_qQbar (HLV p1out, HLV p1in,
HLV pg, HLV p2out,
HLV p2in, HLV qH1,
HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of qbarQbar->qbarQbarg Higgs+Jets Unordered b Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param p1in Momentum of initial state anti-quark
* @param pg Momentum of unordered b gluon
* @param p2out Momentum of final state anti-quark
* @param p2in Momentum of intial state anti-quark
* @param qH1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for qbarQbar->qbarQbarg Scattering
*
* This construction is taking rapidity order: p1out >> p2out > pg
*/
double ME_H_unob_qbarQbar (HLV p1out, HLV p1in,
HLV pg, HLV p2out,
HLV p2in, HLV qH1,
HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of gQbar->gQbarg Higgs+Jets Unordered b Scattering Current
/**
* @param p1out Momentum of final state gluon
* @param p1in Momentum of initial state gluon
* @param pg Momentum of unordered b gluon
* @param p2out Momentum of final state anti-quark
* @param p2in Momentum of intial state anti-quark
* @param qH1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for gQbar->gQbarg Scattering
*
* This construction is taking rapidity order: p1out >> p2out > pg
*/
double ME_H_unob_gQbar (HLV p1out, HLV p1in,
HLV pg, HLV p2out,
HLV p2in, HLV qH1,
HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! Square of gQ->gQg Higgs+Jets Unordered b Scattering Current
/**
* @param p1out Momentum of final state gluon
* @param p1in Momentum of initial state gluon
* @param pg Momentum of unordered b gluon
* @param p2out Momentum of final state quark
* @param p2in Momentum of intial state quark
* @param qH1 Momentum of t-channel propagator before Higgs
* @param qH2 Momentum of t-channel propagator after Higgs
* @param mt Top quark mass
* @param include_bottom Specifies whether bottom corrections are included
* @param mb Bottom quark mass
+ * @param vev Vacuum expectation value
* @returns Square of the current contractions for gQ->gQg Scattering
*
* This construction is taking rapidity order: p1out >> p2out > pg
*/
double ME_H_unob_gQ (HLV p1out, HLV p1in,
HLV pg, HLV p2out,
HLV p2in, HLV qH1,
HLV qH2,
double mt,
- bool include_bottom, double mb);
+ bool include_bottom, double mb, double vev);
//! @}
//! @name impact factors for Higgs + jet
//! @{
//! Implements Eq. (4.22) in \cite DelDuca:2003ba with modifications to incoming plus momenta
/**
* @param p2 Momentum of Particle 2
* @param p1 Momentum of Particle 1
* @param pH Momentum of Higgs
+ * @param vev Vacuum expectation value
* @returns Value of Eq. (4.22) in \cite DelDuca:2003ba with modifications
*
* This gives the impact factor. First it determines whether this is the
* case \f$p1p\sim php\gg p3p\f$ or the opposite
*/
-double C2gHgm(HLV p2, HLV p1, HLV pH);
+double C2gHgm(HLV p2, HLV p1, HLV pH, double vev);
//! Implements Eq. (4.23) in \cite DelDuca:2003ba with modifications to incoming plus momenta
/**
* @param p2 Momentum of Particle 2
* @param p1 Momentum of Particle 1
* @param pH Momentum of Higgs
+ * @param vev Vacuum expectation value
* @returns Value of Eq. (4.23) in \cite DelDuca:2003ba
*
* This gives the impact factor. First it determines whether this is the
* case \f$p1p\sim php\gg p3p\f$ or the opposite
*/
-double C2gHgp(HLV p2, HLV p1, HLV pH);
+double C2gHgp(HLV p2, HLV p1, HLV pH, double vev);
//! Implements Eq. (4.22) in \cite DelDuca:2003ba
/**
* @param p2 Momentum of Particle 2
* @param p1 Momentum of Particle 1
* @param pH Momentum of Higgs
+ * @param vev Vacuum expectation value
* @returns Value of Eq. (4.22) in \cite DelDuca:2003ba
*
* This gives the impact factor. First it determines whether this is the
* case \f$p1p\sim php\gg p3p\f$ or the opposite
+ *
+ * @TODO remove this function is not used
*/
-double C2qHqm(HLV p2, HLV p1, HLV pH);
+double C2qHqm(HLV p2, HLV p1, HLV pH, double vev);
//! @}
diff --git a/include/HEJ/MatrixElement.hh b/include/HEJ/MatrixElement.hh
index 7f9e372..e62ae7e 100644
--- a/include/HEJ/MatrixElement.hh
+++ b/include/HEJ/MatrixElement.hh
@@ -1,187 +1,187 @@
/** \file
* \brief Contains the MatrixElement Class
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#pragma once
#include <functional>
#include <vector>
#include "fastjet/PseudoJet.hh"
-#include "HEJ/PDG_codes.hh"
-#include "HEJ/Parameters.hh"
#include "HEJ/config.hh"
+#include "HEJ/Parameters.hh"
+#include "HEJ/PDG_codes.hh"
namespace CLHEP {
class HepLorentzVector;
}
namespace HEJ{
class Event;
class Particle;
//! Class to calculate the squares of matrix elements
class MatrixElement{
public:
/** \brief MatrixElement Constructor
* @param alpha_s Function taking the renormalisation scale
* and returning the strong coupling constant
* @param conf General matrix element settings
*/
MatrixElement(
std::function<double (double)> alpha_s,
MatrixElementConfig conf
);
/**
* \brief squares of regulated HEJ matrix elements
* @param event The event for which to calculate matrix elements
* @returns The squares of HEJ matrix elements including virtual corrections
*
* This function returns one value for the central parameter choice
* and one additional value for each entry in \ref Event.variations().
* See eq. (22) in \cite Andersen:2011hs for the definition of the squared
* matrix element.
*
* \internal Relation to standard HEJ Met2: MatrixElement = Met2*shat^2/(pdfta*pdftb)
*/
Weights operator()(Event const & event) const;
//! Squares of HEJ tree-level matrix elements
/**
* @param event The event for which to calculate matrix elements
* @returns The squares of HEJ matrix elements without virtual corrections
*
* cf. eq. (22) in \cite Andersen:2011hs
*/
Weights tree(Event const & event) const;
/**
* \brief Virtual corrections to matrix element squares
* @param event The event for which to calculate matrix elements
* @returns The virtual corrections to the squares of the matrix elements
*
* The all order virtual corrections to LL in the MRK limit is
* given by replacing 1/t in the scattering amplitude according to the
* lipatov ansatz.
*
* cf. second-to-last line of eq. (22) in \cite Andersen:2011hs
* note that indices are off by one, i.e. out[0].p corresponds to p_1
*/
Weights virtual_corrections(Event const & event) const;
/**
* \brief Scale-dependent part of tree-level matrix element squares
* @param event The event for which to calculate matrix elements
* @returns The scale-dependent part of the squares of the
* tree-level matrix elements
*
* The tree-level matrix elements factorises into a renormalisation-scale
* dependent part, given by the strong coupling to some power, and a
* scale-independent remainder. This function only returns the former parts
* for the central scale choice and all \ref Event.variations().
*
* @see tree, tree_kin
*/
Weights tree_param(Event const & event) const;
/**
* \brief Kinematic part of tree-level matrix element squares
* @param event The event for which to calculate matrix elements
* @returns The kinematic part of the squares of the
* tree-level matrix elements
*
* The tree-level matrix elements factorises into a renormalisation-scale
* dependent part, given by the strong coupling to some power, and a
* scale-independent remainder. This function only returns the latter part.
* Since it does not depend on the parameter variations, only a single value
* is returned.
*
* @see tree, tree_param
*/
double tree_kin(Event const & event) const;
private:
double tree_param(
Event const & event,
double mur
) const;
double virtual_corrections_W(
Event const & event,
double mur,
Particle const & WBoson
) const;
double virtual_corrections(
Event const & event,
double mur
) const;
//! \internal cf. last line of eq. (22) in \cite Andersen:2011hs
double omega0(
double alpha_s, double mur,
fastjet::PseudoJet const & q_j
) const;
double tree_kin_jets(
Event const & ev
) const;
double tree_kin_W(
Event const & ev
) const;
double tree_kin_Higgs(
Event const & ev
) const;
double tree_kin_Higgs_first(
Event const & ev
) const;
double tree_kin_Higgs_last(
Event const & ev
) const;
/**
* \internal
* \brief Higgs inbetween extremal partons.
*
* Note that in the case of unordered emission, the Higgs is *always*
* treated as if in between the extremal (FKL) partons, even if its
* rapidity is outside the extremal parton rapidities
*/
double tree_kin_Higgs_between(
Event const & ev
) const;
double tree_param_partons(
double alpha_s, double mur,
std::vector<Particle> const & partons
) const;
std::vector<int> in_extremal_jet_indices(
std::vector<fastjet::PseudoJet> const & partons
) const;
std::vector<Particle> tag_extremal_jet_partons(
Event const & ev
) const;
double MH2_forwardH(
CLHEP::HepLorentzVector const & p1out,
CLHEP::HepLorentzVector const & p1in,
pid::ParticleID type2,
CLHEP::HepLorentzVector const & p2out,
CLHEP::HepLorentzVector const & p2in,
CLHEP::HepLorentzVector const & pH,
double t1, double t2
) const;
std::function<double (double)> alpha_s_;
MatrixElementConfig param_;
};
}
diff --git a/include/HEJ/Wjets.hh b/include/HEJ/Wjets.hh
index 9ad9d78..fedf84a 100644
--- a/include/HEJ/Wjets.hh
+++ b/include/HEJ/Wjets.hh
@@ -1,409 +1,458 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
/** \file
* \brief Functions computing the square of current contractions in W+Jets.
*
* This file contains all the W+Jet specific components to compute
* the current contractions for valid HEJ processes, to form a full
* W+Jets ME, currently one would have to use functions from the
* jets.hh header also. We can calculate all subleading processes for
* W+Jets.
*
* @TODO add a namespace
*/
#pragma once
#include <vector>
#include <CLHEP/Vector/LorentzVector.h>
typedef CLHEP::HepLorentzVector HLV;
+namespace HEJ{
+ class ParticleProperties;
+}
+
//! Square of qQ->qenuQ W+Jets Scattering Current
/**
* @param p1out Momentum of final state quark
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param p1in Momentum of initial state quark
* @param p2out Momentum of final state quark
* @param p2in Momentum of intial state quark
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qQ->qenuQ Scattering
*
* This returns the square of the current contractions in qQ->qenuQ scattering
* with an emission of a W Boson.
*/
-double ME_W_qQ (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in);
+double ME_W_qQ (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! Square of qbarQ->qbarenuQ W+Jets Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param p1in Momentum of initial state anti-quark
* @param p2out Momentum of final state quark
* @param p2in Momentum of intial state quark
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qbarQ->qbarenuQ Scattering
*
* This returns the square of the current contractions in qbarQ->qbarenuQ
* scattering with an emission of a W Boson.
*/
-double ME_W_qbarQ (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in);
+double ME_W_qbarQ (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! Square of qQbar->qenuQbar W+Jets Scattering Current
/**
* @param p1out Momentum of final state quark
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param p1in Momentum of initial state quark
* @param p2out Momentum of final state anti-quark
* @param p2in Momentum of intial state anti-quark
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qQbar->qenuQbar Scattering
*
* This returns the square of the current contractions in qQbar->qenuQbar
* scattering with an emission of a W Boson.
*/
-double ME_W_qQbar (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in);
+double ME_W_qQbar (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! Square of qbarQbar->qbarenuQbar W+Jets Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param p1in Momentum of initial state anti-quark
* @param p2out Momentum of final state anti-quark
* @param p2in Momentum of intial state anti-quark
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qbarQbar->qbarenuQbar Scattering
*
* This returns the square of the current contractions in qbarQbar->qbarenuQbar
* scattering with an emission of a W Boson.
*/
-double ME_W_qbarQbar (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in);
+double ME_W_qbarQbar (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! Square of qg->qenug W+Jets Scattering Current
/**
* @param p1out Momentum of final state quark
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param p1in Momentum of initial state quark
* @param p2out Momentum of final state gluon
* @param p2in Momentum of intial state gluon
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qg->qenug Scattering
*
* This returns the square of the current contractions in qg->qenug scattering
* with an emission of a W Boson.
*/
-double ME_W_qg (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in);
+double ME_W_qg (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! Square of qbarg->qbarenug W+Jets Scattering Current
/**
* @param p1out Momentum of final state anti-quark
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param p1in Momentum of initial state anti-quark
* @param p2out Momentum of final state gluon
* @param p2in Momentum of intial state gluon
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qbarg->qbarenug Scattering
*
* This returns the square of the current contractions in qbarg->qbarenug
* scattering with an emission of a W Boson.
*/
-double ME_W_qbarg (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in);
+double ME_W_qbarg (HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! qQg Wjets Unordered backwards opposite leg to W
/**
* @param p1out Momentum of final state quark a
* @param p1in Momentum of initial state quark a
* @param p2out Momentum of final state quark b
* @param p2in Momentum of intial state quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qQ->qQg Scattering
*
* This returns the square of the current contractions in qQg->qQg scattering
* with an emission of a W Boson.
*/
-double ME_W_unob_qQ (HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+double ME_W_unob_qQ (HLV p1out, HLV p1in, HLV p2out, HLV p2in,HLV pg,
+ HLV plbar, HLV pl, HEJ::ParticleProperties const & wprop);
//! qbarQg Wjets Unordered backwards opposite leg to W
/**
* @param p1out Momentum of final state anti-quark a
* @param p1in Momentum of initial state anti-quark a
* @param p2out Momentum of final state quark b
* @param p2in Momentum of intial state quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qbarQ->qbarQg Scattering
*
* This returns the square of the current contractions in qbarQg->qbarQg
* scattering with an emission of a W Boson.
*/
double ME_W_unob_qbarQ (HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl,
+ HEJ::ParticleProperties const & wprop);
//! qQbarg Wjets Unordered backwards opposite leg to W
/**
* @param p1out Momentum of final state quark a
* @param p1in Momentum of initial state quark a
* @param p2out Momentum of final state anti-quark b
* @param p2in Momentum of intial state anti-quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qQbar->qQbarg Scattering
*
* This returns the square of the current contractions in qQbarg->qQbarg
* scattering with an emission of a W Boson.
*/
double ME_W_unob_qQbar (HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl,
+ HEJ::ParticleProperties const & wprop);
//! qbarQbarg Wjets Unordered backwards opposite leg to W
/**
* @param p1out Momentum of final state anti-quark a
* @param p1in Momentum of initial state anti-quark a
* @param p2out Momentum of final state anti-quark b
* @param p2in Momentum of intial state anti-quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qbarQbar->qbarQbarg Scattering
*
* This returns the square of the current contractions in qbarQbarg->qbarQbarg
* scattering with an emission of a W Boson.
*/
double ME_W_unob_qbarQbar (HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl,
+ HEJ::ParticleProperties const & wprop);
//! W+uno same leg
/**
* @param p1out Momentum of final state quark a
* @param p1in Momentum of initial state quark a
* @param p2out Momentum of final state quark b
* @param p2in Momentum of intial state quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qQ->qQg Scattering
*
* This returns the square of the current contractions in gqQ->gqQ scattering
* with an emission of a W Boson.
*/
double ME_Wuno_qQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl, HEJ::ParticleProperties const & wprop);
//! W+uno same leg. quark anti-quark
/**
* @param p1out Momentum of final state quark a
* @param p1in Momentum of initial state quark a
* @param p2out Momentum of final state anti-quark b
* @param p2in Momentum of intial state anti-quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qQbar->gqQbar Scattering
*
* This returns the square of the current contractions in gqQbar->gqQbar
* scattering with an emission of a W Boson. (Unordered Same Leg)
*/
double ME_Wuno_qQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl, HEJ::ParticleProperties const & wprop);
//! W+uno same leg. quark gluon
/**
* @param p1out Momentum of final state quark a
* @param p1in Momentum of initial state quark a
* @param p2out Momentum of final state gluon b
* @param p2in Momentum of intial state gluon b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qg->gqg Scattering
*
* This returns the square of the current contractions in qg->gqg scattering
* with an emission of a W Boson.
*/
double ME_Wuno_qg(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl,
+ HEJ::ParticleProperties const & wprop);
//! W+uno same leg. anti-quark quark
/**
* @param p1out Momentum of final state anti-quark a
* @param p1in Momentum of initial state anti-quark a
* @param p2out Momentum of final state quark b
* @param p2in Momentum of intial state quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qbarQ->gqbarQ Scattering
*
* This returns the square of the current contractions in qbarQ->gqbarQ
* scattering with an emission of a W Boson.
*/
double ME_Wuno_qbarQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl, HEJ::ParticleProperties const & wprop);
//! W+uno same leg. anti-quark anti-quark
/**
* @param p1out Momentum of final state anti-quark a
* @param p1in Momentum of initial state anti-quark a
* @param p2out Momentum of final state anti-quark b
* @param p2in Momentum of intial state anti-quark b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qbarQbar->gqbarQbar Scattering
*
* This returns the square of the current contractions in gqbarQbar->qbarQbar
* scattering with an emission of a W Boson.
*/
-double ME_Wuno_qbarQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+double ME_Wuno_qbarQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in,HLV pg,
+ HLV plbar, HLV pl,
+ HEJ::ParticleProperties const & wprop);
//! W+uno same leg. anti-quark gluon
/**
* @param p1out Momentum of final state anti-quark a
* @param p1in Momentum of initial state anti-quark a
* @param p2out Momentum of final state gluon b
* @param p2in Momentum of intial state gluon b
* @param pg Momentum of final state unordered gluon
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for ->gqbarg Scattering
*
* This returns the square of the current contractions in qbarg->gqbarg
* scattering with an emission of a W Boson.
*/
double ME_Wuno_qbarg(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pg,
- HLV plbar, HLV pl);
+ HLV plbar, HLV pl, HEJ::ParticleProperties const & wprop);
//! W+Extremal qqx. qxqQ
/**
* @param pgin Momentum of initial state gluon
* @param pqout Momentum of final state quark a
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param pqbarout Momentum of final state anti-quark a
* @param p2out Momentum of initial state anti-quark b
* @param p2in Momentum of final state gluon b
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for ->qbarqQ Scattering
*
* Calculates the square of the current contractions with extremal qqbar pair
* production. This is calculated through the use of crossing symmetry.
*/
-double ME_WExqqx_qbarqQ(HLV pgin, HLV pqout,HLV plbar,HLV pl, HLV pqbarout, HLV p2out, HLV p2in);
+double ME_WExqqx_qbarqQ(HLV pgin, HLV pqout,HLV plbar,HLV pl, HLV pqbarout,
+ HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! W+Extremal qqx. qqxQ
/**
* @param pgin Momentum of initial state gluon
* @param pqout Momentum of final state quark a
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param pqbarout Momentum of final state anti-quark a
* @param p2out Momentum of initial state anti-quark b
* @param p2in Momentum of final state gluon b
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for ->qqbarQ Scattering
*
* Calculates the square of the current contractions with extremal qqbar pair
* production. This is calculated through the use of crossing symmetry.
*/
-double ME_WExqqx_qqbarQ(HLV pgin, HLV pqout,HLV plbar,HLV pl, HLV pqbarout, HLV p2out, HLV p2in);
+double ME_WExqqx_qqbarQ(HLV pgin, HLV pqout,HLV plbar,HLV pl, HLV pqbarout,
+ HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! W+Extremal qqx. gg->qxqg
/**
* @param pgin Momentum of initial state gluon
* @param pqout Momentum of final state quark a
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param pqbarout Momentum of final state anti-quark a
* @param p2out Momentum of initial state gluon b
* @param p2in Momentum of final state gluon b
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for gg->qbarqg Scattering
*
* Calculates the square of the current contractions with extremal qqbar pair
* production. This is calculated through the use of crossing symmetry.
*/
-double ME_WExqqx_qbarqg(HLV pgin, HLV pqout,HLV plbar,HLV pl, HLV pqbarout, HLV p2out, HLV p2in);
+double ME_WExqqx_qbarqg(HLV pgin, HLV pqout,HLV plbar,HLV pl, HLV pqbarout,
+ HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! W+Extremal qqx. gg->qqxg
/**
* @param pgin Momentum of initial state gluon
* @param pqout Momentum of final state quark a
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param pqbarout Momentum of final state anti-quark a
* @param p2out Momentum of initial state gluon a
* @param p2in Momentum of final state gluon b
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for gg->qqbarg Scattering
*
* Calculates the square of the current contractions with extremal qqbar pair
* production. This is calculated through the use of crossing symmetry.
*/
-double ME_WExqqx_qqbarg(HLV pgin, HLV pqbarout,HLV plbar,HLV pl, HLV pqout, HLV p2out, HLV p2in);
+double ME_WExqqx_qqbarg(HLV pgin, HLV pqbarout,HLV plbar,HLV pl, HLV pqout,
+ HLV p2out, HLV p2in,
+ HEJ::ParticleProperties const & wprop);
//! W+Extremal qqx. gg->qqxg. qqx on forwards leg, W emission backwards leg.
/**
* @param pa Momentum of initial state (anti-)quark
* @param pb Momentum of initial state gluon
* @param p1 Momentum of final state (anti-)quark (after W emission)
* @param p2 Momentum of final state anti-quark
* @param p3 Momentum of final state quark
* @param plbar Momentum of final state anti-lepton
* @param pl Momentum of final state lepton
* @param aqlinepa Is opposite extremal leg to qqx a quark or antiquark line
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for gq->qqbarqW Scattering
*
* Calculates the square of the current contractions with extremal qqbar pair
* production. This is calculated via current contraction of existing currents.
* Assumes qqx split from forwards leg, W emission from backwards leg.
* Switch input (pa<->pb, p1<->pn) if calculating forwards qqx.
*/
-double ME_W_Exqqx_QQq(HLV pa, HLV pb, HLV p1, HLV p2, HLV p3,HLV plbar,HLV pl, bool aqlinepa);
+double ME_W_Exqqx_QQq(HLV pa, HLV pb, HLV p1, HLV p2, HLV p3,HLV plbar, HLV pl,
+ bool aqlinepa, HEJ::ParticleProperties const & wprop);
//! W+Jets qqxCentral. qqx W emission.
/**
* @param pa Momentum of initial state particle a
* @param pb Momentum of initial state particle b
* @param pl Momentum of final state lepton
* @param plbar Momentum of final state anti-lepton
* @param partons Vector of outgoing parton momenta
* @param aqlinepa True= pa is anti-quark
* @param aqlinepb True= pb is anti-quark
* @param qqxmarker Ordering of the qqbar pair produced (qqx vs qxq)
* @param nabove Number of lipatov vertices "above" qqbar pair
* @param nbelow Number of lipatov vertices "below" qqbar pair
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qq>qQQbarWq Scattering
*
* Calculates the square of the current contractions with extremal qqbar pair
* production. This is calculated through the use of crossing symmetry.
*/
double ME_WCenqqx_qq(HLV pa, HLV pb,HLV pl,HLV plbar, std::vector<HLV> partons,
- bool aqlinepa, bool aqlinepb, bool qqxmarker, int nabove);
+ bool aqlinepa, bool aqlinepb, bool qqxmarker, int nabove,
+ HEJ::ParticleProperties const & wprop);
//! W+Jets qqxCentral. W emission from backwards leg.
/**
* @param ka Momentum of initial state particle a
* @param kb Momentum of initial state particle b
* @param pl Momentum of final state lepton
* @param plbar Momentum of final state anti-lepton
* @param partons outgoing parton momenta
* @param aqlinepa True= pa is anti-quark
* @param aqlinepb True= pb is anti-quark
* @param qqxmarker Ordering of the qqbar pair produced (qqx vs qxq)
* @param nabove Number of lipatov vertices "above" qqbar pair
* @param nbelow Number of lipatov vertices "below" qqbar pair
* @param forwards Swap to emission off front leg TODO:remove so args can be const
+ * @param wpro Mass and width of the W boson
* @returns Square of the current contractions for qq>qQQbarWq Scattering
*
* Calculates the square of the current contractions with extremal qqbar pair
* production. This is calculated through the use of crossing symmetry.
*/
double ME_W_Cenqqx_qq(HLV ka, HLV kb,HLV pl,HLV plbar, std::vector<HLV> partons,
bool aqlinepa, bool aqlinepb, bool qqxmarker, int nabove,
- int nbelow, bool forwards);
+ int nbelow, bool forwards,
+ HEJ::ParticleProperties const & wprop);
diff --git a/include/HEJ/config.hh b/include/HEJ/config.hh
index c6a002c..0655088 100644
--- a/include/HEJ/config.hh
+++ b/include/HEJ/config.hh
@@ -1,190 +1,198 @@
/** \file
* \brief HEJ 2 configuration parameters
*
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#pragma once
#include <string>
#include "fastjet/JetDefinition.hh"
#include "yaml-cpp/yaml.h"
#include "HEJ/Constants.hh"
#include "HEJ/event_types.hh"
+#include "HEJ/EWConstants.hh"
#include "HEJ/HiggsCouplingSettings.hh"
#include "HEJ/optional.hh"
#include "HEJ/output_formats.hh"
#include "HEJ/ScaleFunction.hh"
namespace HEJ{
//! Jet parameters
struct JetParameters{
fastjet::JetDefinition def; /**< Jet Definition */
double min_pt; /**< Minimum Jet Transverse Momentum */
};
//! Settings for scale variation
struct ScaleConfig{
//! Base scale choices
std::vector<ScaleFunction> base;
//! Factors for multiplicative scale variation
std::vector<double> factors;
//! Maximum ratio between renormalisation and factorisation scale
double max_ratio;
};
//! Settings for random number generator
struct RNGConfig {
//! Random number generator name
std::string name;
//! Optional initial seed
optional<std::string> seed;
};
/**! Possible treatments for fixed-order input events.
*
* The program will decide on how to treat an event based on
* the value of this enumeration.
*/
enum class EventTreatment{
reweight, /**< Perform resummation */
keep, /**< Keep the event */
discard, /**< Discard the event */
};
//! Container to store the treatments for various event types
using EventTreatMap = std::map<event_type::EventType, EventTreatment>;
/**! Input parameters.
*
* This struct handles stores all configuration parameters
* needed in a HEJ 2 run.
*
* \internal To add a new option:
* 1. Add a member to the Config struct.
* 2. Inside "src/YAMLreader.cc":
* - Add the option name to the "supported" Node in
* get_supported_options.
* - Initialise the new Config member in to_Config.
* The functions set_from_yaml (for mandatory options) and
* set_from_yaml_if_defined (non-mandatory) may be helpful.
* 3. Add a new entry (with short description) to config.yaml
* 4. Update the user documentation in "doc/Sphinx/"
*/
struct Config {
//! Parameters for scale variation
ScaleConfig scales;
//! Resummation jet properties
JetParameters resummation_jets;
//! Fixed-order jet properties
JetParameters fixed_order_jets;
//! Minimum transverse momentum for extremal partons
double min_extparton_pt;
//! Maximum transverse momentum fraction from soft radiation in extremal jets
double max_ext_soft_pt_fraction;
//! The regulator lambda for the subtraction terms
double regulator_lambda = CLAMBDA;
//! Number of resummation configurations to generate per fixed-order event
int trials;
//! Whether to include the logarithmic correction from \f$\alpha_s\f$ running
bool log_correction;
//! Event output files names and formats
std::vector<OutputFile> output;
//! Parameters for random number generation
RNGConfig rng;
//! Map to decide what to do for different event types
EventTreatMap treat;
//! Parameters for custom analyses
YAML::Node analysis_parameters;
//! Settings for effective Higgs-gluon coupling
HiggsCouplingSettings Higgs_coupling;
+ //! elector weak parameters
+ EWConstants ew_parameters;
};
//! Configuration options for the PhaseSpacePoint class
struct PhaseSpacePointConfig {
//! Properties of resummation jets
JetParameters jet_param;
//! Minimum transverse momentum for extremal partons
double min_extparton_pt;
//! Maximum transverse momentum fraction from soft radiation in extremal jets
double max_ext_soft_pt_fraction;
};
//! Configuration options for the MatrixElement class
struct MatrixElementConfig {
MatrixElementConfig() = default;
MatrixElementConfig(
bool log_correction,
HiggsCouplingSettings Higgs_coupling,
+ EWConstants ew_parameters,
double regulator_lambda = CLAMBDA
):
- log_correction(log_correction),
- Higgs_coupling(Higgs_coupling),
- regulator_lambda(regulator_lambda)
+ log_correction{log_correction},
+ Higgs_coupling{Higgs_coupling},
+ ew_parameters{ew_parameters},
+ regulator_lambda{regulator_lambda}
{}
//! Whether to include the logarithmic correction from \f$\alpha_s\f$ running
bool log_correction;
//! Settings for effective Higgs-gluon coupling
HiggsCouplingSettings Higgs_coupling;
+ //! elector weak parameters
+ EWConstants ew_parameters;
//! The regulator lambda for the subtraction terms
double regulator_lambda = CLAMBDA;
};
//! Configuration options for the EventReweighter class
struct EventReweighterConfig {
//! Settings for phase space point generation
PhaseSpacePointConfig psp_config;
//! Settings for matrix element calculation
MatrixElementConfig ME_config;
//! Properties of resummation jets
JetParameters jet_param;
//! Treatment of the various event types
EventTreatMap treat;
};
/**! Extract PhaseSpacePointConfig from Config
*
* \internal We do not provide a PhaseSpacePointConfig constructor from Config
* so that PhaseSpacePointConfig remains an aggregate.
* This faciliates writing client code (e.g. the HEJ fixed-order generator)
* that creates a PhaseSpacePointConfig *without* a Config object.
*
* @see to_MatrixElementConfig, to_EventReweighterConfig
*/
inline
PhaseSpacePointConfig to_PhaseSpacePointConfig(Config const & conf) {
return {
conf.resummation_jets,
conf.min_extparton_pt,
conf.max_ext_soft_pt_fraction
};
}
/**! Extract MatrixElementConfig from Config
*
* @see to_PhaseSpacePointConfig, to_EventReweighterConfig
*/
inline
MatrixElementConfig to_MatrixElementConfig(Config const & conf) {
- return {conf.log_correction, conf.Higgs_coupling, conf.regulator_lambda};
+ return {conf.log_correction, conf.Higgs_coupling,
+ conf.ew_parameters, conf.regulator_lambda};
}
/**! Extract EventReweighterConfig from Config
*
* @see to_PhaseSpacePointConfig, to_MatrixElementConfig
*/
inline
EventReweighterConfig to_EventReweighterConfig(Config const & conf) {
return {
to_PhaseSpacePointConfig(conf),
to_MatrixElementConfig(conf),
conf.resummation_jets, conf.treat
};
}
} // namespace HEJ
diff --git a/src/Hjets.cc b/src/Hjets.cc
index 665f0a1..0f8912b 100644
--- a/src/Hjets.cc
+++ b/src/Hjets.cc
@@ -1,1083 +1,1085 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include "HEJ/jets.hh"
#include "HEJ/Hjets.hh"
#include <assert.h>
#include <limits>
#include "HEJ/Constants.hh"
#ifdef HEJ_BUILD_WITH_QCDLOOP
#include "qcdloop/qcdloop.h"
#endif
const COM looprwfactor = (COM(0.,1.)*M_PI*M_PI)/pow((2.*M_PI),4);
constexpr double infinity = std::numeric_limits<double>::infinity();
namespace {
// Loop integrals
#ifdef HEJ_BUILD_WITH_QCDLOOP
COM B0DD(HLV q, double mq)
{
static std::vector<std::complex<double>> result(3);
static auto ql_B0 = [](){
ql::Bubble<std::complex<double>,double,double> ql_B0;
ql_B0.setCacheSize(100);
return ql_B0;
}();
static std::vector<double> masses(2);
static std::vector<double> momenta(1);
for(auto & m: masses) m = mq*mq;
momenta.front() = q.m2();
ql_B0.integral(result, 1, masses, momenta);
return result[0];
}
COM C0DD(HLV q1, HLV q2, double mq)
{
static std::vector<std::complex<double>> result(3);
static auto ql_C0 = [](){
ql::Triangle<std::complex<double>,double,double> ql_C0;
ql_C0.setCacheSize(100);
return ql_C0;
}();
static std::vector<double> masses(3);
static std::vector<double> momenta(3);
for(auto & m: masses) m = mq*mq;
momenta[0] = q1.m2();
momenta[1] = q2.m2();
momenta[2] = (q1+q2).m2();
ql_C0.integral(result, 1, masses, momenta);
return result[0];
}
COM D0DD(HLV q1,HLV q2, HLV q3, double mq)
{
static std::vector<std::complex<double>> result(3);
static auto ql_D0 = [](){
ql::Box<std::complex<double>,double,double> ql_D0;
ql_D0.setCacheSize(100);
return ql_D0;
}();
static std::vector<double> masses(4);
static std::vector<double> momenta(6);
for(auto & m: masses) m = mq*mq;
momenta[0] = q1.m2();
momenta[1] = q2.m2();
momenta[2] = q3.m2();
momenta[3] = (q1+q2+q3).m2();
momenta[4] = (q1+q2).m2();
momenta[5] = (q2+q3).m2();
ql_D0.integral(result, 1, masses, momenta);
return result[0];
}
COM A1(HLV q1, HLV q2, double mt)
// As given in Eq. (B.2) of VDD
{
double q12,q22,Q2;
HLV Q;
double Delta3,mt2;
COM ans(COM(0.,0.));
q12=q1.m2();
q22=q2.m2();
Q=-q1-q2; // Define all momenta ingoing as in appendix of VDD
Q2=Q.m2();
Delta3=q12*q12+q22*q22+Q2*Q2-2*q12*q22-2*q12*Q2-2*q22*Q2;
assert(mt > 0.);
mt2=mt*mt;
ans=looprwfactor*COM(0,-1)*C0DD(q1,q2,mt)*( 4.*mt2/Delta3*(Q2-q12-q22)
-1.-4.*q12*q22/Delta3-12.*q12*q22*Q2/Delta3/Delta3*(q12+q22-Q2) )
- looprwfactor*COM(0,-1)*( B0DD(q2,mt)-B0DD(Q,mt) )
* ( 2.*q22/Delta3+12.*q12*q22/Delta3/Delta3*(q22-q12+Q2) )
- looprwfactor*COM(0,-1)*( B0DD(q1,mt)-B0DD(Q,mt) )
* ( 2.*q12/Delta3+12.*q12*q22/Delta3/Delta3*(q12-q22+Q2) )
- 2./Delta3/16/M_PI/M_PI*(q12+q22-Q2);
return ans;
}
COM A2(HLV q1, HLV q2, double mt)
// As given in Eq. (B.2) of VDD, but with high energy limit
// of invariants taken.
{
double q12,q22,Q2;
HLV Q;
double Delta3,mt2;
COM ans(COM(0.,0.));
assert(mt > 0.);
mt2=mt*mt;
q12=q1.m2();
q22=q2.m2();
Q=-q1-q2; // Define all momenta ingoing as in appendix of VDD
Q2=Q.m2();
Delta3=q12*q12+q22*q22+Q2*Q2-2*q12*q22-2*q12*Q2-2*q22*Q2;
ans=looprwfactor*COM(0,-1)*C0DD(q1,q2,mt)*( 2.*mt2+1./2.*(q12+q22-Q2)
+2.*q12*q22*Q2/Delta3 )
+looprwfactor*COM(0,-1)*(B0DD(q2,mt)-B0DD(Q,mt))
*q22*(q22-q12-Q2)/Delta3
+looprwfactor*COM(0,-1)*(B0DD(q1,mt)-B0DD(Q,mt))
*q12*(q12-q22-Q2)/Delta3+1./16/M_PI/M_PI;
return ans;
}
#else // no QCDloop
COM A1(HLV, HLV, double) {
throw std::logic_error{"A1 called without QCDloop support"};
}
COM A2(HLV, HLV, double) {
throw std::logic_error{"A2 called without QCDloop support"};
}
#endif
void to_current(const HLV & q, current & ret){
ret[0]=q.e();
ret[1]=q.x();
ret[2]=q.y();
ret[3]=q.z();
}
/**
* @brief Higgs vertex contracted with current @param C1 and @param C2
*/
COM cHdot(const current & C1, const current & C2, const current & q1,
- const current & q2, double mt, bool incBot, double mb)
+ const current & q2, double mt, bool incBot, double mb, double vev)
{
if (mt == infinity) {
- return (cdot(C1,C2)*cdot(q1,q2)-cdot(C1,q2)*cdot(C2,q1))/(3*M_PI*HEJ::vev);
+ return (cdot(C1,C2)*cdot(q1,q2)-cdot(C1,q2)*cdot(C2,q1))/(3*M_PI*vev);
}
else {
HLV vq1,vq2;
vq1.set(q1[1].real(),q1[2].real(),q1[3].real(),q1[0].real());
vq2.set(q2[1].real(),q2[2].real(),q2[3].real(),q2[0].real());
// first minus sign obtained because of q1-difference to VDD
- // Factor is because 4 mt^2 g^2/HEJ::vev A1 -> 16 pi mt^2/HEJ::vev alphas,
+ // Factor is because 4 mt^2 g^2/vev A1 -> 16 pi mt^2/vev alphas,
if(!(incBot))
- return 16.*M_PI*mt*mt/HEJ::vev*(-cdot(C1,q2)*cdot(C2,q1)*A1(-vq1,vq2,mt)
+ return 16.*M_PI*mt*mt/vev*(-cdot(C1,q2)*cdot(C2,q1)*A1(-vq1,vq2,mt)
-cdot(C1,C2)*A2(-vq1,vq2,mt));
else
- return 16.*M_PI*mt*mt/HEJ::vev*(-cdot(C1,q2)*cdot(C2,q1)*A1(-vq1,vq2,mt)
+ return 16.*M_PI*mt*mt/vev*(-cdot(C1,q2)*cdot(C2,q1)*A1(-vq1,vq2,mt)
-cdot(C1,C2)*A2(-vq1,vq2,mt))
- + 16.*M_PI*mb*mb/HEJ::vev*(-cdot(C1,q2)*cdot(C2,q1)*A1(-vq1,vq2,mb)
+ + 16.*M_PI*mb*mb/vev*(-cdot(C1,q2)*cdot(C2,q1)*A1(-vq1,vq2,mb)
-cdot(C1,C2)*A2(-vq1,vq2,mb));
}
}
//@{
/**
* @brief Higgs+Jets FKL Contributions, function to handle all incoming types.
* @param p1out Outgoing Particle 1. (W emission)
* @param p1in Incoming Particle 1. (W emission)
* @param p2out Outgoing Particle 2 (Quark, unordered emission this side.)
* @param p2in Incoming Particle 2 (Quark, unordered emission this side.)
* @param q1 t-channel momenta into higgs vertex
* @param q2 t-channel momenta out of higgs vertex
* @param mt top mass (inf or value)
* @param incBot Bool, to include bottom mass (true) or not (false)?
* @param mb bottom mass (value)
* @param pg Unordered Gluon momenta
* @param aqlineb Bool. Is Backwards quark line an anti-quark line?
* @param aqlinef Bool. Is Forwards quark line an anti-quark line?
*
* Calculates j^\mu H j_\mu. FKL with higgs vertex somewhere in the FKL chain.
* Handles all possible incoming states.
*/
double j_h_j(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
HLV q1, HLV q2, double mt, bool incBot,
- double mb, bool aqlineb, bool aqlinef){
+ double mb, double vev, bool aqlineb, bool aqlinef){
current j1p,j1m,j2p,j2m, q1v, q2v;
// Note need to flip helicities in anti-quark case.
joi(p1out,!aqlineb, p1in,!aqlineb, j1p);
joi(p1out, aqlineb, p1in, aqlineb, j1m);
joi(p2out,!aqlinef, p2in,!aqlinef, j2p);
joi(p2out, aqlinef, p2in, aqlinef, j2m);
to_current(q1, q1v);
to_current(q2, q2v);
- COM Mmp=cHdot(j1m,j2p,q1v,q2v,mt, incBot, mb);
- COM Mmm=cHdot(j1m,j2m,q1v,q2v,mt, incBot, mb);
- COM Mpp=cHdot(j1p,j2p,q1v,q2v,mt, incBot, mb);
- COM Mpm=cHdot(j1p,j2m,q1v,q2v,mt, incBot, mb);
+ COM Mmp=cHdot(j1m,j2p,q1v,q2v,mt, incBot, mb, vev);
+ COM Mmm=cHdot(j1m,j2m,q1v,q2v,mt, incBot, mb, vev);
+ COM Mpp=cHdot(j1p,j2p,q1v,q2v,mt, incBot, mb, vev);
+ COM Mpm=cHdot(j1p,j2m,q1v,q2v,mt, incBot, mb, vev);
// average over helicities
const double sst=(abs2(Mmp)+abs2(Mmm)+abs2(Mpp)+abs2(Mpm))/4.;
return sst/((p1in-p1out).m2()*(p2in-p2out).m2()*q1.m2()*q2.m2());
}
} // namespace anonymous
double ME_H_qQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV q1, HLV q2,
- double mt, bool incBot, double mb){
- return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, false, false);
+ double mt, bool incBot, double mb, double vev){
+ return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, vev, false, false);
}
double ME_H_qQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV q1, HLV q2,
- double mt, bool incBot, double mb){
- return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, false, true);
+ double mt, bool incBot, double mb, double vev){
+ return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, vev, false, true);
}
double ME_H_qbarQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV q1, HLV q2,
- double mt, bool incBot, double mb){
- return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, true, false);
+ double mt, bool incBot, double mb, double vev){
+ return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, vev, true, false);
}
double ME_H_qbarQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV q1, HLV q2,
- double mt, bool incBot, double mb){
- return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, true, true);
+ double mt, bool incBot, double mb, double vev){
+ return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, vev, true, true);
}
double ME_H_qg(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV q1, HLV q2,
- double mt, bool incBot, double mb){
- return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, false, false)
+ double mt, bool incBot, double mb, double vev){
+ return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, vev, false, false)
* K_g(p2out,p2in)/HEJ::C_A;
}
double ME_H_qbarg(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV q1, HLV q2,
- double mt, bool incBot, double mb){
- return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, true, false)
+ double mt, bool incBot, double mb, double vev){
+ return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, vev, true, false)
* K_g(p2out,p2in)/HEJ::C_A;
}
double ME_H_gg(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV q1, HLV q2,
- double mt, bool incBot, double mb){
- return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, false, false)
+ double mt, bool incBot, double mb, double vev){
+ return j_h_j(p1out, p1in, p2out, p2in, q1, q2, mt, incBot, mb, vev, false, false)
* K_g(p2out,p2in)/HEJ::C_A * K_g(p1out,p1in)/HEJ::C_A;
}
//@}
namespace {
//@{
/// @brief Higgs vertex contracted with one current
CCurrent jH(HLV pout, bool helout, HLV pin,
bool helin, HLV q1, HLV q2,
- double mt, bool incBot, double mb)
+ double mt, bool incBot, double mb, double vev)
{
CCurrent j2 = joi(pout,helout,pin,helin);
CCurrent jq2(q2.e(),q2.px(),q2.py(),q2.pz());
if(mt == infinity)
- return ((q1.dot(q2))*j2 - j2.dot(q1)*jq2)/(3*M_PI*HEJ::vev);
+ return ((q1.dot(q2))*j2 - j2.dot(q1)*jq2)/(3*M_PI*vev);
else
{
if(incBot)
- return (-16.*M_PI*mb*mb/HEJ::vev*j2.dot(q1)*jq2*A1(-q1,q2,mb)
- -16.*M_PI*mb*mb/HEJ::vev*j2*A2(-q1,q2,mb))
- + (-16.*M_PI*mt*mt/HEJ::vev*j2.dot(q1)*jq2*A1(-q1,q2,mt)
- -16.*M_PI*mt*mt/HEJ::vev*j2*A2(-q1,q2,mt));
+ return (-16.*M_PI*mb*mb/vev*j2.dot(q1)*jq2*A1(-q1,q2,mb)
+ -16.*M_PI*mb*mb/vev*j2*A2(-q1,q2,mb))
+ + (-16.*M_PI*mt*mt/vev*j2.dot(q1)*jq2*A1(-q1,q2,mt)
+ -16.*M_PI*mt*mt/vev*j2*A2(-q1,q2,mt));
else
- return (-16.*M_PI*mt*mt/HEJ::vev*j2.dot(q1)*jq2*A1(-q1,q2,mt)
- -16.*M_PI*mt*mt/HEJ::vev*j2*A2(-q1,q2,mt));
+ return (-16.*M_PI*mt*mt/vev*j2.dot(q1)*jq2*A1(-q1,q2,mt)
+ -16.*M_PI*mt*mt/vev*j2*A2(-q1,q2,mt));
}
}
//@}
//@{
/**
* @brief Higgs+Jets Unordered Contributions, function to handle all incoming types.
* @param pg Unordered Gluon momenta
* @param p1out Outgoing Particle 1. (W emission)
* @param p1in Incoming Particle 1. (W emission)
* @param p2out Outgoing Particle 2 (Quark, unordered emission this side.)
* @param p2in Incoming Particle 2 (Quark, unordered emission this side.)
* @param q1 t-channel momenta into higgs vertex
* @param q2 t-channel momenta out of higgs vertex
* @param mt top mass (inf or value)
* @param incBot Bool, to include bottom mass (true) or not (false)?
* @param mb bottom mass (value)
* @param aqlineb Bool. Is Backwards quark line an anti-quark line?
* @param aqlinef Bool. Is Forwards quark line an anti-quark line?
*
* Calculates j_{uno}^\mu H j_\mu. Unordered with higgs vertex
* somewhere in the FKL chain. Handles all possible incoming states.
*/
double juno_h_j(HLV pg, HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV qH1, HLV qH2,
- double mt, bool incBot, double mb, bool aqlineb
+ double mt, bool incBot, double mb, double vev, bool aqlineb
){
// This construction is taking rapidity order: pg > p1out >> p2out
HLV q1=p1in-p1out; // Top End
HLV q2=-(p2in-p2out); // Bottom End
HLV qg=p1in-p1out-pg; // Extra bit post-gluon
// Note <p1|eps|pa> current split into two by gauge choice.
// See James C's Thesis (p72). <p1|eps|pa> -> <p1|pg><pg|pa>
CCurrent mj1p=joi(p1out,!aqlineb, p1in,!aqlineb);
CCurrent mj1m=joi(p1out, aqlineb, p1in, aqlineb);
CCurrent jgap=joi(pg, !aqlineb, p1in,!aqlineb);
CCurrent jgam=joi(pg, aqlineb, p1in, aqlineb);
// Note for function joo(): <p1+|pg+> = <pg-|p1->.
CCurrent j2gp=joo(p1out, !aqlineb, pg, !aqlineb);
CCurrent j2gm=joo(p1out, aqlineb, pg, aqlineb);
- CCurrent mjH2p=jH(p2out, true,p2in, true,qH1,qH2,mt,incBot,mb);
- CCurrent mjH2m=jH(p2out,false,p2in,false,qH1,qH2,mt,incBot,mb);
+ CCurrent mjH2p=jH(p2out, true,p2in, true,qH1,qH2,mt,incBot,mb, vev);
+ CCurrent mjH2m=jH(p2out,false,p2in,false,qH1,qH2,mt,incBot,mb, vev);
// Dot products of these which occur again and again
COM MHmp=mj1m.dot(mjH2p);
COM MHmm=mj1m.dot(mjH2m);
COM MHpp=mj1p.dot(mjH2p);
COM MHpm=mj1p.dot(mjH2m);
CCurrent p2o(p2out), p2i(p2in), p1o(p1out), p1i(p1in), qsum(q1+qg);
CCurrent Lmm=(qsum*(MHmm) + (-2.*mjH2m.dot(pg))*mj1m + 2.*mj1m.dot(pg)*mjH2m
+ ( p2o/pg.dot(p2out) + p2i/pg.dot(p2in) )*( qg.m2()*MHmm/2.) )/q1.m2();
CCurrent Lmp=(qsum*(MHmp) + (-2.*mjH2p.dot(pg))*mj1m + 2.*mj1m.dot(pg)*mjH2p
+ ( p2o/pg.dot(p2out) + p2i/pg.dot(p2in) )*( qg.m2()*MHmp/2.) )/q1.m2();
CCurrent Lpm=(qsum*(MHpm) + (-2.*mjH2m.dot(pg))*mj1p + 2.*mj1p.dot(pg)*mjH2m
+ ( p2o/pg.dot(p2out) + p2i/pg.dot(p2in) )*( qg.m2()*MHpm/2.) )/q1.m2();
CCurrent Lpp=(qsum*(MHpp) + (-2.*mjH2p.dot(pg))*mj1p + 2.*mj1p.dot(pg)*mjH2p
+ ( p2o/pg.dot(p2out) + p2i/pg.dot(p2in) )*( qg.m2()*MHpp/2.) )/q1.m2();
CCurrent U1mm=(jgam.dot(mjH2m)*j2gm+2.*p1o*MHmm)/(p1out+pg).m2();
CCurrent U1mp=(jgam.dot(mjH2p)*j2gm+2.*p1o*MHmp)/(p1out+pg).m2();
CCurrent U1pm=(jgap.dot(mjH2m)*j2gp+2.*p1o*MHpm)/(p1out+pg).m2();
CCurrent U1pp=(jgap.dot(mjH2p)*j2gp+2.*p1o*MHpp)/(p1out+pg).m2();
CCurrent U2mm=((-1.)*j2gm.dot(mjH2m)*jgam+2.*p1i*MHmm)/(p1in-pg).m2();
CCurrent U2mp=((-1.)*j2gm.dot(mjH2p)*jgam+2.*p1i*MHmp)/(p1in-pg).m2();
CCurrent U2pm=((-1.)*j2gp.dot(mjH2m)*jgap+2.*p1i*MHpm)/(p1in-pg).m2();
CCurrent U2pp=((-1.)*j2gp.dot(mjH2p)*jgap+2.*p1i*MHpp)/(p1in-pg).m2();
constexpr double cf=HEJ::C_F;
double amm=cf*(2.*vre(Lmm-U1mm,Lmm+U2mm))+2.*cf*cf/3.*vabs2(U1mm+U2mm);
double amp=cf*(2.*vre(Lmp-U1mp,Lmp+U2mp))+2.*cf*cf/3.*vabs2(U1mp+U2mp);
double apm=cf*(2.*vre(Lpm-U1pm,Lpm+U2pm))+2.*cf*cf/3.*vabs2(U1pm+U2pm);
double app=cf*(2.*vre(Lpp-U1pp,Lpp+U2pp))+2.*cf*cf/3.*vabs2(U1pp+U2pp);
double ampsq=-(amm+amp+apm+app)/(q2.m2()*qH2.m2());
// Now add the t-channels for the Higgs
ampsq/=qH1.m2()*qg.m2();
ampsq/=16.;
// Factor of (Cf/Ca) for each quark to match ME_H_qQ.
ampsq*=HEJ::C_F*HEJ::C_F/HEJ::C_A/HEJ::C_A;
return ampsq;
}
} // namespace anonymous
double ME_H_unob_qQ(HLV pg, HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV qH1,
- HLV qH2, double mt, bool incBot, double mb){
- return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, false);
+ HLV qH2, double mt, bool incBot, double mb, double vev){
+ return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, vev, false);
}
double ME_H_unob_qbarQ(HLV pg, HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV qH1, HLV qH2, double mt, bool incBot, double mb){
- return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, true);
+ HLV qH1, HLV qH2, double mt, bool incBot, double mb, double vev){
+ return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, vev, true);
}
double ME_H_unob_qQbar(HLV pg, HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV qH1, HLV qH2, double mt, bool incBot, double mb){
- return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, false);
+ HLV qH1, HLV qH2, double mt, bool incBot, double mb, double vev){
+ return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, vev, false);
}
double ME_H_unob_qbarQbar(HLV pg, HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV qH1, HLV qH2, double mt, bool incBot, double mb){
- return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, true);
+ HLV qH1, HLV qH2, double mt, bool incBot, double mb, double vev){
+ return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, vev, true);
}
double ME_H_unob_gQ(HLV pg, HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV qH1, HLV qH2, double mt, bool incBot, double mb){
- return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, false)*K_g(p2out,p2in)/HEJ::C_F;
+ HLV qH1, HLV qH2, double mt, bool incBot, double mb, double vev){
+ return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, vev, false)
+ *K_g(p2out,p2in)/HEJ::C_F;
}
double ME_H_unob_gQbar(HLV pg, HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV qH1, HLV qH2, double mt, bool incBot, double mb){
- return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, true)*K_g(p2out,p2in)/HEJ::C_F;
+ HLV qH1, HLV qH2, double mt, bool incBot, double mb, double vev){
+ return juno_h_j(pg, p1out, p1in, p2out, p2in, qH1, qH2, mt, incBot, mb, vev, true)
+ *K_g(p2out,p2in)/HEJ::C_F;
}
//@}
// Begin finite mass stuff
#ifdef HEJ_BUILD_WITH_QCDLOOP
namespace {
// All the stuff needed for the box functions in qg->qgH now...
COM E1(HLV k1, HLV k2, HLV kh, double mq){
HLV q2=-(k1+k2+kh);
double Delta, Sigma, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
Sigma = 4.*s12*s34 - pow(S1+S2,2);
return looprwfactor*(-s12*D0DD(k2, k1, q2, mq)*(1 - 8.*mq*mq/s12 + S2/(2.*s12) +
S2*(s12 - 8.*mq*mq)*(s34 + S1)/(2.*s12*Delta) +
2.*(s34 + S1)*(s34 + S1)/Delta +
S2*pow((s34 + S1),3)/Delta/Delta) - ((s12 + S2)*C0DD(k2,
k1 + q2, mq) -
s12*C0DD(k1, k2, mq) + (S1 - S2)*C0DD(k1 + k2, q2, mq) -
S1*C0DD(k1, q2,
mq))*(S2*(s12 - 4.*mq*mq)/(2.*s12*Delta) +
2.*(s34 + S1)/Delta +
S2*pow((s34 + S1),2)/Delta/Delta) + (C0DD(k1, q2, mq) -
C0DD(k1 + k2, q2, mq))*(1. - 4.*mq*mq/s12) -
C0DD(k1 + k2, q2, mq)*2.*s34/
S1 - (B0DD(k1 + q2, mq) -
B0DD(k1 + k2 + q2, mq))*2.*s34*(s34 +
S1)/(S1*Delta) + (B0DD(q2, mq) -
B0DD(k1 + k2 + q2, mq) +
s12*C0DD(k1 + k2, q2,
mq))*(2.*s34*(s34 +
S1)*(S1 - S2)/(Delta*Sigma) +
2.*s34*(s34 + S1)/(S1*Delta)) + (B0DD(k1 + k2, mq) -
B0DD(k1 + k2 + q2,
mq) - (s34 + S1 + S2)*C0DD(k1 + k2, q2, mq))*2.*(s34 +
S1)*(2.*s12*s34 -
S2*(S1 + S2))/(Delta*Sigma));
}
COM F1(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, Sigma, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
Sigma = 4.*s12*s34 - pow(S1+S2,2);
return looprwfactor*(-S2*D0DD(k1, k2, q2,
mq)*(0.5 - (s12 - 8.*mq*mq)*(s34 + S2)/(2.*Delta) -
s12*pow((s34 + S2),3)/Delta/Delta) + ((s12 + S1)*C0DD(k1,
k2 + q2, mq) -
s12*C0DD(k1, k2, mq) - (S1 - S2)*C0DD(k1 + k2, q2, mq) -
S2*C0DD(k2, q2,
mq))*(S2*(s12 - 4.*mq*mq)/(2.*s12*Delta) +
S2*pow((s34 + S2),2)/Delta/Delta)
- (C0DD(k1 + k2, q2, mq) - C0DD(k1, k2 + q2, mq))*(1. - 4.*mq*mq/s12)
- C0DD(k1, k2 + q2, mq) + (B0DD(k2 + q2, mq) -
B0DD(k1 + k2 + q2,
mq))*2.*pow((s34 + S2),2)/((s12 + S1)*Delta) - (B0DD(
q2, mq) - B0DD(k1 + k2 + q2, mq) +
s12*C0DD(k1 + k2, q2, mq))*2.*s34*(s34 +
S2)*(S2 - S1)/(Delta*Sigma) + (B0DD(
k1 + k2, mq) -
B0DD(k1 + k2 + q2,
mq) - (s34 + S1 + S2)*C0DD(k1 + k2, q2, mq))*2.*(s34 +
S2)*(2.*s12*s34 -
S2*(S1 + S2))/(Delta*Sigma));
}
COM G1(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
return looprwfactor*(S2*D0DD(k1, q2, k2,
mq)*(Delta/s12/s12 - 4.*mq*mq/s12) -
S2*((s12 + S1)*C0DD(k1, k2 + q2, mq) -
S1*C0DD(k1, q2, mq))*(1./
s12/s12 - (s12 - 4.*mq*mq)/(2.*s12*Delta)) -
S2*((s12 + S2)*C0DD(k1 + q2, k2, mq) -
S2*C0DD(k2, q2, mq))*(1./
s12/s12 + (s12 - 4.*mq*mq)/(2.*s12*Delta)) -
C0DD(k1, q2, mq) - (C0DD(k1, k2 + q2, mq) -
C0DD(k1, q2, mq))*4.*mq*mq/
s12 + (B0DD(k1 + q2, mq) - B0DD(k1 + k2 + q2, mq))*2./
s12 + (B0DD(k1 + q2, mq) -
B0DD(q2, mq))*2.*s34/(s12*S1) + (B0DD(k2 + q2, mq) -
B0DD(k1 + k2 + q2, mq))*2.*(s34 + S2)/(s12*(s12 + S1)));
}
COM E4(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, Sigma, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
Sigma = 4.*s12*s34 - pow(S1+S2,2);
return looprwfactor* (-s12*D0DD(k2, k1, q2,
mq)*(0.5 - (S1 - 8.*mq*mq)*(s34 + S1)/(2.*Delta) -
s12*pow((s34 + S1),3)/Delta/Delta) + ((s12 + S2)*C0DD(k2,
k1 + q2, mq) -
s12*C0DD(k1, k2, mq) + (S1 - S2)*C0DD(k1 + k2, q2, mq) -
S1*C0DD(k1, q2, mq))*((S1 - 4.*mq*mq)/(2.*Delta) +
s12*pow((s34 + S1),2)/Delta/Delta) -
C0DD(k1 + k2, q2, mq) + (B0DD(k1 + q2, mq) -
B0DD(k1 + k2 + q2, mq))*(2.*s34/Delta +
2.*s12*(s34 + S1)/((s12 + S2)*Delta)) - (B0DD(
q2, mq) - B0DD(k1 + k2 + q2, mq) +
s12*C0DD(k1 + k2, q2,
mq))*((2.*s34*(2.*s12*s34 - S2*(S1 + S2) +
s12*(S1 - S2)))/(Delta*Sigma)) + (B0DD(k1 + k2, mq) -
B0DD(k1 + k2 + q2, mq) - (s34 + S1 + S2)*C0DD(k1 + k2, q2, mq))
*((2.*s12*(2.*s12*s34 - S1*(S1 + S2) + s34*(S2 - S1)))/(Delta*Sigma)));
}
COM F4(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, Sigma, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
Sigma = 4.*s12*s34 - pow(S1+S2,2);
return looprwfactor* (-s12*D0DD(k1, k2, q2,
mq)*(0.5 + (S1 - 8.*mq*mq)*(s34 + S2)/(2.*Delta) +
s12*pow((s34 + S2),3)/Delta/Delta) - ((s12 + S1)*C0DD(k1,
k2 + q2, mq) -
s12*C0DD(k1, k2, mq) - (S1 - S2)*C0DD(k1 + k2, q2, mq) -
S2*C0DD(k2, q2, mq))*((S1 - 4.*mq*mq)/(2.*Delta) +
s12*pow((s34 + S2),2)/Delta/Delta) -
C0DD(k1 + k2, q2, mq) - (B0DD(k2 + q2, mq) -
B0DD(k1 + k2 + q2, mq))*2.*(s34 +
S2)/Delta + (B0DD(q2, mq) -
B0DD(k1 + k2 + q2, mq) +
s12*C0DD(k1 + k2, q2, mq))*2.*s34*(2.*s12*s34 -
S1*(S1 + S2) +
s12*(S2 - S1))/(Delta*Sigma) - (B0DD(k1 + k2, mq) -
B0DD(k1 + k2 + q2, mq) - (s34 + S1 + S2)*C0DD(k1 + k2, q2, mq))
*(2.*s12*(2.*s12*s34 - S2*(S1 + S2) + s34*(S1 - S2))/(Delta*Sigma)));
}
COM G4(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
return looprwfactor* (-D0DD(k1, q2, k2,
mq)*(Delta/s12 + (s12 + S1)/2. -
4.*mq*mq) + ((s12 + S1)*C0DD(k1, k2 + q2, mq) -
S1*C0DD(k1, q2, mq))*(1./
s12 - (S1 - 4.*mq*mq)/(2.*Delta)) + ((s12 + S2)*C0DD(
k1 + q2, k2, mq) -
S2*C0DD(k2, q2, mq))*(1./
s12 + (S1 - 4.*mq*mq)/(2.*Delta)) + (B0DD(
k1 + k2 + q2, mq) -
B0DD(k1 + q2, mq))*2./(s12 + S2));
}
COM E10(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, Sigma, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
Sigma = 4.*s12*s34 - pow(S1+S2,2);
return looprwfactor*(-s12*D0DD(k2, k1, q2, mq)*((s34 + S1)/Delta +
12.*mq*mq*S1*(s34 + S1)/Delta/Delta -
4.*s12*S1*pow((s34 + S1),3)/Delta/Delta/Delta) - ((s12 + S2)*C0DD(k2, k1 + q2, mq) -
s12*C0DD(k1, k2, mq) + (S1 - S2)*C0DD(k1 + k2, q2, mq) -
S1*C0DD(k1, q2, mq))*(1./Delta +
4.*mq*mq*S1/Delta/Delta -
4.*s12*S1*pow((s34 + S1),2)/Delta/Delta/Delta) +
C0DD(k1 + k2, q2, mq)*(4.*s12*s34*(S1 - S2)/(Delta*Sigma) -
4.*(s12 -
2.*mq*mq)*(2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma)) + (B0DD(k1 + q2, mq) -
B0DD(k1 + k2 + q2, mq))*(4.*(s34 + S1)/((s12 + S2)*Delta) +
8.*S1*(s34 + S1)/Delta/Delta) + (B0DD(q2, mq) -
B0DD(k1 + k2 + q2, mq) +
s12*C0DD(k1 + k2, q2, mq))*(12.*s34*(2.*s12 + S1 +
S2)*(2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma*Sigma) -
4.*s34*(4.*s12 + 3.*S1 +
S2)/(Delta*Sigma) +
8.*s12*s34*(s34*(s12 + S2) -
S1*(s34 +
S1))/(Delta*Delta*Sigma)) + (B0DD(k1 + k2, mq) -
B0DD(k1 + k2 + q2, mq) - (s34 + S1 + S2)*C0DD(k1 + k2, q2,
mq))*(12.*s12*(2.*s34 + S1 +
S2)*(2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma*Sigma) +
8.*s12*S1*(s34*(s12 + S2) -
S1*(s34 +
S1))/(Delta*Delta*Sigma))) + (COM(0.,1.)/(4.*M_PI*M_PI))*((2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma));
}
COM F10(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, Sigma, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
Sigma = 4.*s12*s34 - pow(S1+S2,2);
return looprwfactor* (s12*D0DD(k1, k2, q2,
mq)*((s34 + S2)/Delta - 4.*mq*mq/Delta +
12.*mq*mq*s34*(s12 + S1)/Delta/Delta -
4.*s12*pow((s34 + S2),2)/Delta/Delta -
4.*s12*S1*pow((s34 + S2),3)/Delta/Delta/Delta) + ((s12 + S1)*C0DD(k1, k2 + q2, mq) -
s12*C0DD(k1, k2, mq) - (S1 - S2)*C0DD(k1 + k2, q2, mq) -
S2*C0DD(k2, q2, mq))*(1./Delta +
4.*mq*mq*S1/Delta/Delta -
4.*s12*(s34 + S2)/Delta/Delta -
4.*s12*S1*pow((s34 + S2),2)/Delta/Delta/Delta) -
C0DD(k1 + k2, q2, mq)*(4.*s12*s34/(S2*Delta) +
4.*s12*s34*(S2 - S1)/(Delta*Sigma) +
4.*(s12 -
2.*mq*mq)*(2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma)) - (B0DD(
k2 + q2, mq) -
B0DD(k1 + k2 + q2, mq))*(4.*s34/(S2*Delta) +
8.*s34*(s12 + S1)/Delta/Delta) - (B0DD(q2, mq) -
B0DD(k1 + k2 + q2, mq) +
s12*C0DD(k1 + k2, q2,
mq))*(-12*s34*(2*s12 + S1 +
S2)*(2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma*Sigma) -
4.*s12*s34*s34/(S2*Delta*Delta) +
4.*s34*S1/(Delta*Sigma) -
4.*s34*(s12*s34*(2.*s12 + S2) -
S1*S1*(2.*s12 +
S1))/(Delta*Delta*Sigma)) - (B0DD(k1 + k2, mq) -
B0DD(k1 + k2 + q2, mq) - (s34 + S1 + S2)*C0DD(k1 + k2, q2, mq))*(-12.*s12*(2.*s34 + S1 +
S2)*(2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma*Sigma) +
8.*s12*(2.*s34 + S1)/(Delta*Sigma) -
8.*s12*s34*(2.*s12*s34 - S1*(S1 + S2) +
s12*(S2 -
S1))/(Delta*Delta*Sigma))) + (COM(0.,1.)/(4.*M_PI*M_PI))*((2.*s12*s34 -
S1*(S1 + S2))/(Delta*Sigma));
}
COM G10(HLV k1, HLV k2, HLV kh, double mq){
HLV q2 = -(k1+k2+kh);
double Delta, S1, S2, s12, s34;
S1 = 2.*k1.dot(q2);
S2 = 2.*k2.dot(q2);
s12 = 2.*k1.dot(k2);
s34 = q2.m2();
Delta = s12*s34 - S1*S2;
return looprwfactor* (-D0DD(k1, q2, k2, mq)*(1. +
4.*S1*mq*mq/Delta) + ((s12 + S1)*C0DD(k1,
k2 + q2, mq) -
S1*C0DD(k1, q2, mq))*(1./Delta +
4.*S1*mq*mq/Delta/Delta) - ((s12 + S2)*C0DD(k1 + q2,
k2, mq) - S2*C0DD(k2, q2, mq))*(1./Delta +
4.*S1*mq*mq/Delta/Delta) + (B0DD(k1 + k2 + q2, mq) -
B0DD(k1 + q2, mq))*4.*(s34 +
S1)/(Delta*(s12 + S2)) + (B0DD(q2, mq) -
B0DD(k2 + q2, mq))*4.*s34/(Delta*S2));
}
COM H1(HLV k1, HLV k2, HLV kh, double mq){
return E1(k1,k2,kh,mq)+F1(k1,k2,kh,mq)+G1(k1,k2,kh,mq);
}
COM H4(HLV k1, HLV k2, HLV kh, double mq){
return E4(k1,k2,kh,mq)+F4(k1,k2,kh,mq)+G4(k1,k2,kh,mq);
}
COM H10(HLV k1, HLV k2, HLV kh, double mq){
return E10(k1,k2,kh,mq)+F10(k1,k2,kh,mq)+G10(k1,k2,kh,mq);
}
COM H2(HLV k1, HLV k2, HLV kh, double mq){
return -1.*H1(k2,k1,kh,mq);
}
COM H5(HLV k1, HLV k2, HLV kh, double mq){
return -1.*H4(k2,k1,kh,mq);
}
COM H12(HLV k1, HLV k2, HLV kh, double mq){
return -1.*H10(k2,k1,kh,mq);
}
// FL and FT functions
COM FL(HLV q1, HLV q2, double mq){
HLV Q = q1 + q2;
double detQ2 = q1.m2()*q2.m2() - q1.dot(q2)*q1.dot(q2);
return -1./(2.*detQ2)*((2.-
3.*q1.m2()*q2.dot(Q)/detQ2)*(B0DD(q1, mq) -
B0DD(Q, mq)) + (2. -
3.*q2.m2()*q1.dot(Q)/detQ2)*(B0DD(q2, mq) -
B0DD(Q, mq)) - (4.*mq*mq + q1.m2() + q2.m2() +
Q.m2() - 3.*q1.m2()*q2.m2()*Q.m2()/detQ2)*C0DD(
q1, q2, mq) - 2.);
}
COM FT(HLV q1, HLV q2, double mq){
HLV Q = q1 + q2;
double detQ2 = q1.m2()*q2.m2() - q1.dot(q2)*q1.dot(q2);
return -1./(2.*detQ2)*(Q.m2()*(B0DD(q1, mq) + B0DD(q2, mq) - 2.*B0DD(Q, mq) -
2.*q1.dot(q2)*C0DD(q1, q2, mq)) + (q1.m2() -
q2.m2()) *(B0DD(q1, mq) - B0DD(q2, mq))) -
q1.dot(q2)*FL(q1, q2, mq);
}
HLV ParityFlip(HLV p){
HLV flippedVector;
flippedVector.setE(p.e());
flippedVector.setX(-p.x());
flippedVector.setY(-p.y());
flippedVector.setZ(-p.z());
return flippedVector;
}
/// @brief HC amp for qg->qgH with finite top (i.e. j^{++}_H)
void g_gH_HC(HLV pa, HLV p1,
- HLV pH, double mq, current &retAns)
+ HLV pH, double mq, double vev, current &retAns)
{
current cura1,pacur,p1cur,pHcur,conjeps1,conjepsH1,epsa,epsHa,epsHapart1,
epsHapart2,conjepsH1part1,conjepsH1part2;
COM ang1a,sqa1;
- const double F = 4.*mq*mq/HEJ::vev;
+ const double F = 4.*mq*mq/vev;
// Easier to have the whole thing as current object so I can use cdot functionality.
// Means I need to write pa,p1 as current objects
to_current(pa, pacur);
to_current(p1,p1cur);
to_current(pH,pHcur);
bool gluonforward = true;
if(pa.z() < 0)
gluonforward = false;
//HEJ gauge
jio(pa,false,p1,false,cura1);
if(gluonforward){
// sqrt(2pa_-/p1_-)*p1_perp/abs(p1_perp)
ang1a = sqrt(pa.plus()*p1.minus())*(p1.x()+COM(0.,1.)*p1.y())/p1.perp();
// sqrt(2pa_-/p1_-)*p1_perp*/abs(p1_perp)
sqa1 = sqrt(pa.plus()*p1.minus())*(p1.x()-COM(0.,1.)*p1.y())/p1.perp();
} else {
ang1a = sqrt(pa.minus()*p1.plus());
sqa1 = sqrt(pa.minus()*p1.plus());
}
const double prop = (pa-p1-pH).m2();
cmult(-1./sqrt(2)/ang1a,cura1,conjeps1);
cmult(1./sqrt(2)/sqa1,cura1,epsa);
const COM Fta = FT(-pa,pa-pH,mq)/(pa-pH).m2();
const COM Ft1 = FT(-p1-pH,p1,mq)/(p1+pH).m2();
const COM h4 = H4(p1,-pa,pH,mq);
const COM h5 = H5(p1,-pa,pH,mq);
const COM h10 = H10(p1,-pa,pH,mq);
const COM h12 = H12(p1,-pa,pH,mq);
cmult(Fta*pa.dot(pH), epsa, epsHapart1);
cmult(-1.*Fta*cdot(pHcur,epsa), pacur, epsHapart2);
cmult(Ft1*cdot(pHcur,conjeps1), p1cur, conjepsH1part1);
cmult(-Ft1*p1.dot(pH), conjeps1, conjepsH1part2);
cadd(epsHapart1, epsHapart2, epsHa);
cadd(conjepsH1part1, conjepsH1part2, conjepsH1);
const COM aH1 = cdot(pHcur, cura1);
current T1,T2,T3,T4,T5,T6,T7,T8,T9,T10;
if(gluonforward){
cmult(sqrt(2.)*sqrt(p1.plus()/pa.plus())*prop/sqa1, conjepsH1, T1);
cmult(-sqrt(2.)*sqrt(pa.plus()/p1.plus())*prop/ang1a, epsHa, T2);
}
else{
cmult(-sqrt(2.)*sqrt(p1.minus()/pa.minus())
*((p1.x()-COM(0.,1.)*p1.y())/p1.perp())*prop/sqa1, conjepsH1, T1);
cmult(sqrt(2.)*sqrt(pa.minus()/p1.minus())
*((p1.x()-COM(0.,1.)*p1.y())/p1.perp())*prop/ang1a, epsHa, T2);
}
cmult(sqrt(2.)/ang1a*aH1, epsHa, T3);
cmult(sqrt(2.)/sqa1*aH1, conjepsH1, T4);
cmult(-sqrt(2.)*Fta*pa.dot(p1)*aH1/sqa1, conjeps1, T5);
cmult(-sqrt(2.)*Ft1*pa.dot(p1)*aH1/ang1a, epsa, T6);
cmult(-aH1/sqrt(2.)/sqa1*h4*8.*COM(0.,1.)*M_PI*M_PI, conjeps1, T7);
cmult(aH1/sqrt(2.)/ang1a*h5*8.*COM(0.,1.)*M_PI*M_PI, epsa, T8);
cmult(aH1*aH1/2./ang1a/sqa1*h10*8.*COM(0.,1.)*M_PI*M_PI, pacur, T9);
cmult(-aH1*aH1/2./ang1a/sqa1*h12*8.*COM(0.,1.)*M_PI*M_PI, p1cur, T10);
current ans;
for(int i=0;i<4;i++)
{
ans[i] = T1[i]+T2[i]+T3[i]+T4[i]+T5[i]+T6[i]+T7[i]+T8[i]+T9[i]+T10[i];
}
retAns[0] = F/prop*ans[0];
retAns[1] = F/prop*ans[1];
retAns[2] = F/prop*ans[2];
retAns[3] = F/prop*ans[3];
}
/// @brief HNC amp for qg->qgH with finite top (i.e. j^{+-}_H)
- void g_gH_HNC(HLV pa, HLV p1, HLV pH, double mq, current &retAns)
+ void g_gH_HNC(HLV pa, HLV p1, HLV pH, double mq, double vev, current &retAns)
{
- const double F = 4.*mq*mq/HEJ::vev;
+ const double F = 4.*mq*mq/vev;
COM ang1a,sqa1;
current conjepsH1,epsHa,p1cur,pacur,pHcur,conjeps1,epsa,paplusp1cur,
p1minuspacur,cur1a,cura1,epsHapart1,epsHapart2,conjepsH1part1,
conjepsH1part2;
// Find here if pa, meaning the gluon, is forward or backward
bool gluonforward = true;
if(pa.z() < 0)
gluonforward = false;
jio(pa,true,p1,true,cura1);
joi(p1,true,pa,true,cur1a);
to_current(pa,pacur);
to_current(p1,p1cur);
to_current(pH,pHcur);
to_current(pa+p1,paplusp1cur);
to_current(p1-pa,p1minuspacur);
const COM aH1 = cdot(pHcur,cura1);
const COM oneHa = std::conj(aH1); // = cdot(pHcur,cur1a)
if(gluonforward){
// sqrt(2pa_-/p1_-)*p1_perp/abs(p1_perp)
ang1a = sqrt(pa.plus()*p1.minus())*(p1.x()+COM(0.,1.)*p1.y())/p1.perp();
// sqrt(2pa_-/p1_-)*p1_perp*/abs(p1_perp)
sqa1 = sqrt(pa.plus()*p1.minus())*(p1.x()-COM(0.,1.)*p1.y())/p1.perp();
}
else {
ang1a = sqrt(pa.minus()*p1.plus());
sqa1 = sqrt(pa.minus()*p1.plus());
}
const double prop = (pa-p1-pH).m2();
cmult(1./sqrt(2)/sqa1, cur1a, epsa);
cmult(-1./sqrt(2)/sqa1, cura1, conjeps1);
const COM phase = cdot(conjeps1, epsa);
const COM Fta = FT(-pa,pa-pH,mq)/(pa-pH).m2();
const COM Ft1 = FT(-p1-pH,p1,mq)/(p1+pH).m2();
const COM Falpha = FT(p1-pa,pa-p1-pH,mq);
const COM Fbeta = FL(p1-pa,pa-p1-pH,mq);
const COM h1 = H1(p1,-pa, pH, mq);
const COM h2 = H2(p1,-pa, pH, mq);
const COM h4 = H4(p1,-pa, pH, mq);
const COM h5 = H5(p1,-pa, pH, mq);
const COM h10 = H10(p1,-pa, pH, mq);
const COM h12 = H12(p1,-pa, pH, mq);
cmult(Fta*pa.dot(pH), epsa, epsHapart1);
cmult(-1.*Fta*cdot(pHcur,epsa), pacur, epsHapart2);
cmult(Ft1*cdot(pHcur,conjeps1), p1cur, conjepsH1part1);
cmult(-Ft1*p1.dot(pH), conjeps1, conjepsH1part2);
cadd(epsHapart1, epsHapart2, epsHa);
cadd(conjepsH1part1, conjepsH1part2, conjepsH1);
current T1,T2,T3,T4,T5a,T5b,T6,T7,T8a,T8b,T9,T10,T11a,
T11b,T12a,T12b,T13;
if(gluonforward){
cmult(sqrt(2.)*sqrt(p1.plus()/pa.plus())*prop/sqa1, conjepsH1, T1);
cmult(-sqrt(2.)*sqrt(pa.plus()/p1.plus())*prop/sqa1, epsHa, T2);
}
else{
cmult(-sqrt(2.)*sqrt(p1.minus()/pa.minus())*((p1.x()-COM(0.,1.)*p1.y())/p1.perp())
*prop/sqa1, conjepsH1, T1);
cmult(sqrt(2.)*sqrt(pa.minus()/p1.minus())*((p1.x()+COM(0.,1.)*p1.y())/p1.perp())
*prop/sqa1, epsHa, T2);
}
const COM boxdiagFact = 8.*COM(0.,1.)*M_PI*M_PI;
cmult(aH1*sqrt(2.)/sqa1, epsHa, T3);
cmult(oneHa*sqrt(2.)/sqa1, conjepsH1, T4);
cmult(-2.*phase*Fta*pa.dot(pH), p1cur, T5a);
cmult(2.*phase*Ft1*p1.dot(pH), pacur, T5b);
cmult(-sqrt(2.)*Fta*p1.dot(pa)*oneHa/sqa1, conjeps1, T6);
cmult(-sqrt(2.)*Ft1*pa.dot(p1)*aH1/sqa1, epsa, T7);
cmult(-boxdiagFact*phase*h2, pacur, T8a);
cmult(boxdiagFact*phase*h1, p1cur, T8b);
cmult(boxdiagFact*aH1/sqrt(2.)/sqa1*h5, epsa, T9);
cmult(-boxdiagFact*oneHa/sqrt(2.)/sqa1*h4, conjeps1, T10);
cmult(boxdiagFact*aH1*oneHa/2./sqa1/sqa1*h10, pacur, T11a);
cmult(-boxdiagFact*aH1*oneHa/2./sqa1/sqa1*h12, p1cur, T11b);
cmult(-phase/(pa-p1).m2()*Falpha*(p1-pa).dot(pa-p1-pH), paplusp1cur, T12a);
cmult(phase/(pa-p1).m2()*Falpha*(pa+p1).dot(pa-p1-pH), p1minuspacur, T12b);
cmult(-phase*Fbeta*(pa-p1-pH).m2(), paplusp1cur, T13);
current ans;
for(int i=0;i<4;i++)
{
ans[i] = T1[i]+T2[i]+T3[i]+T4[i]+T5a[i]+T5b[i]+T6[i]+T7[i]+T8a[i]+T8b[i]
+T9[i]+T10[i]+T11a[i]+T11b[i]+T12a[i]+T12b[i]+T13[i];
}
retAns[0] = F/prop*ans[0];
retAns[1] = F/prop*ans[1];
retAns[2] = F/prop*ans[2];
retAns[3] = F/prop*ans[3];
}
} // namespace anonymous
// JDC - new amplitude with Higgs emitted close to gluon with full mt effects.
// Keep usual HEJ-style function call
double ME_Houtside_gq(HLV p1out, HLV p1in, HLV p2out, HLV p2in, HLV pH,
- double mq, bool includeBottom, double mq2
+ double mq, bool includeBottom, double mq2, double vev
){
current cur2bplus,cur2bminus, cur2bplusFlip, cur2bminusFlip;
current retAns,retAnsb;
joi(p2out,true,p2in,true,cur2bplus);
joi(p2out,false,p2in,false,cur2bminus);
joi(ParityFlip(p2out),true,ParityFlip(p2in),true,cur2bplusFlip);
joi(ParityFlip(p2out),false,ParityFlip(p2in),false,cur2bminusFlip);
COM app1,app2,apm1,apm2;
COM app3, app4, apm3, apm4;
if(!includeBottom)
{
- g_gH_HC(p1in,p1out,pH,mq,retAns);
+ g_gH_HC(p1in,p1out,pH,mq,vev,retAns);
app1=cdot(retAns,cur2bplus);
app2=cdot(retAns,cur2bminus);
- g_gH_HC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,retAns);
+ g_gH_HC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,vev,retAns);
app3=cdot(retAns,cur2bplusFlip);
app4=cdot(retAns,cur2bminusFlip);
// And non-conserving bits
- g_gH_HNC(p1in,p1out,pH,mq,retAns);
+ g_gH_HNC(p1in,p1out,pH,mq,vev,retAns);
apm1=cdot(retAns,cur2bplus);
apm2=cdot(retAns,cur2bminus);
- g_gH_HNC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,retAns);
+ g_gH_HNC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,vev,retAns);
apm3=cdot(retAns,cur2bplusFlip);
apm4=cdot(retAns,cur2bminusFlip);
} else {
- g_gH_HC(p1in,p1out,pH,mq,retAns);
- g_gH_HC(p1in,p1out,pH,mq2,retAnsb);
+ g_gH_HC(p1in,p1out,pH,mq,vev,retAns);
+ g_gH_HC(p1in,p1out,pH,mq2,vev,retAnsb);
app1=cdot(retAns,cur2bplus) + cdot(retAnsb,cur2bplus);
app2=cdot(retAns,cur2bminus) + cdot(retAnsb,cur2bminus);
- g_gH_HC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,retAns);
- g_gH_HC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq2,retAnsb);
+ g_gH_HC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,vev,retAns);
+ g_gH_HC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq2,vev,retAnsb);
app3=cdot(retAns,cur2bplusFlip) + cdot(retAnsb,cur2bplusFlip);
app4=cdot(retAns,cur2bminusFlip) + cdot(retAnsb,cur2bminusFlip);
// And non-conserving bits
- g_gH_HNC(p1in,p1out,pH,mq,retAns);
- g_gH_HNC(p1in,p1out,pH,mq2,retAnsb);
+ g_gH_HNC(p1in,p1out,pH,mq,vev,retAns);
+ g_gH_HNC(p1in,p1out,pH,mq2,vev,retAnsb);
apm1=cdot(retAns,cur2bplus) + cdot(retAnsb,cur2bplus);
apm2=cdot(retAns,cur2bminus) + cdot(retAnsb,cur2bminus);
- g_gH_HNC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,retAns);
- g_gH_HNC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq2,retAnsb);
+ g_gH_HNC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq,vev,retAns);
+ g_gH_HNC(ParityFlip(p1in),ParityFlip(p1out),ParityFlip(pH),mq2,vev,retAnsb);
apm3=cdot(retAns,cur2bplusFlip) + cdot(retAnsb,cur2bplusFlip);
apm4=cdot(retAns,cur2bminusFlip) + cdot(retAnsb,cur2bminusFlip);
}
return abs2(app1) + abs2(app2) + abs2(app3) + abs2(app4) + abs2(apm1)
+ abs2(apm2) + abs2(apm3) + abs2(apm4);
}
#endif // HEJ_BUILD_WITH_QCDLOOP
-double C2gHgm(HLV p2, HLV p1, HLV pH)
+double C2gHgm(HLV p2, HLV p1, HLV pH, double vev)
{
- static double A=1./(3.*M_PI*HEJ::vev);
+ const double A=1./(3.*M_PI*vev);
// Implements Eq. (4.22) in hep-ph/0301013 with modifications to incoming plus momenta
double s12,p1p,p2p;
COM p1perp,p3perp,phperp;
// Determine first whether this is the case p1p\sim php>>p3p or the opposite
s12=p1.invariantMass2(-p2);
if (p2.pz()>0.) { // case considered in hep-ph/0301013
p1p=p1.plus();
p2p=p2.plus();
} else { // opposite case
p1p=p1.minus();
p2p=p2.minus();
}
p1perp=p1.px()+COM(0,1)*p1.py();
phperp=pH.px()+COM(0,1)*pH.py();
p3perp=-(p1perp+phperp);
COM temp=COM(0,1)*A/(2.*s12)*(p2p/p1p*conj(p1perp)*p3perp+p1p/p2p*p1perp*conj(p3perp));
temp=temp*conj(temp);
return temp.real();
}
-double C2gHgp(HLV p2, HLV p1, HLV pH)
+double C2gHgp(HLV p2, HLV p1, HLV pH, double vev)
{
- static double A=1./(3.*M_PI*HEJ::vev);
+ const double A=1./(3.*M_PI*vev);
// Implements Eq. (4.23) in hep-ph/0301013
double s12,php,p1p,phm;
COM p1perp,p3perp,phperp;
// Determine first whether this is the case p1p\sim php>>p3p or the opposite
s12=p1.invariantMass2(-p2);
if (p2.pz()>0.) { // case considered in hep-ph/0301013
php=pH.plus();
phm=pH.minus();
p1p=p1.plus();
} else { // opposite case
php=pH.minus();
phm=pH.plus();
p1p=p1.minus();
}
p1perp=p1.px()+COM(0,1)*p1.py();
phperp=pH.px()+COM(0,1)*pH.py();
p3perp=-(p1perp+phperp);
COM temp=-COM(0,1)*A/(2.*s12)*( conj(p1perp*p3perp)*pow(php/p1p,2)/(1.+php/p1p)
+s12*(pow(conj(phperp),2)/(pow(abs(phperp),2)+p1p*phm)
-pow(conj(p3perp)
+(1.+php/p1p)*conj(p1perp),2)/((1.+php/p1p)*(pH.m2()+2.*p1.dot(pH)))) );
temp=temp*conj(temp);
return temp.real();
}
-double C2qHqm(HLV p2, HLV p1, HLV pH)
+double C2qHqm(HLV p2, HLV p1, HLV pH, double vev)
{
- static double A=1./(3.*M_PI*HEJ::vev);
+ const double A=1./(3.*M_PI*vev);
// Implements Eq. (4.22) in hep-ph/0301013
double s12,p2p,p1p;
COM p1perp,p3perp,phperp;
// Determine first whether this is the case p1p\sim php>>p3p or the opposite
s12=p1.invariantMass2(-p2);
if (p2.pz()>0.) { // case considered in hep-ph/0301013
p2p=p2.plus();
p1p=p1.plus();
} else { // opposite case
p2p=p2.minus();
p1p=p1.minus();
}
p1perp=p1.px()+COM(0,1)*p1.py();
phperp=pH.px()+COM(0,1)*pH.py();
p3perp=-(p1perp+phperp);
COM temp=A/(2.*s12)*( sqrt(p2p/p1p)*p3perp*conj(p1perp)
+sqrt(p1p/p2p)*p1perp*conj(p3perp) );
temp=temp*conj(temp);
return temp.real();
}
diff --git a/src/MatrixElement.cc b/src/MatrixElement.cc
index c94d305..dad1f93 100644
--- a/src/MatrixElement.cc
+++ b/src/MatrixElement.cc
@@ -1,1502 +1,1512 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include "HEJ/MatrixElement.hh"
#include <algorithm>
#include <assert.h>
#include <limits>
#include <math.h>
#include <stddef.h>
#include <unordered_map>
#include <utility>
#include "CLHEP/Vector/LorentzVector.h"
#include "HEJ/Constants.hh"
#include "HEJ/Wjets.hh"
#include "HEJ/Hjets.hh"
#include "HEJ/jets.hh"
#include "HEJ/PDG_codes.hh"
#include "HEJ/event_types.hh"
#include "HEJ/Event.hh"
#include "HEJ/exceptions.hh"
#include "HEJ/Particle.hh"
#include "HEJ/utility.hh"
namespace HEJ{
double MatrixElement::omega0(
double alpha_s, double mur,
fastjet::PseudoJet const & q_j
) const {
const double lambda = param_.regulator_lambda;
const double result = - alpha_s*N_C/M_PI*log(q_j.perp2()/(lambda*lambda));
if(! param_.log_correction) return result;
// use alpha_s(sqrt(q_j*lambda)), evolved to mur
return (
1. + alpha_s/(4.*M_PI)*beta0*log(mur*mur/(q_j.perp()*lambda))
)*result;
}
Weights MatrixElement::operator()(Event const & event) const {
return tree(event)*virtual_corrections(event);
}
Weights MatrixElement::tree(Event const & event) const {
return tree_param(event)*tree_kin(event);
}
Weights MatrixElement::tree_param(Event const & event) const {
if(! is_resummable(event.type())) {
return Weights{0., std::vector<double>(event.variations().size(), 0.)};
}
Weights result;
// only compute once for each renormalisation scale
std::unordered_map<double, double> known;
result.central = tree_param(event, event.central().mur);
known.emplace(event.central().mur, result.central);
for(auto const & var: event.variations()) {
const auto ME_it = known.find(var.mur);
if(ME_it == end(known)) {
const double wt = tree_param(event, var.mur);
result.variations.emplace_back(wt);
known.emplace(var.mur, wt);
}
else {
result.variations.emplace_back(ME_it->second);
}
}
return result;
}
Weights MatrixElement::virtual_corrections(Event const & event) const {
if(! is_resummable(event.type())) {
return Weights{0., std::vector<double>(event.variations().size(), 0.)};
}
Weights result;
// only compute once for each renormalisation scale
std::unordered_map<double, double> known;
result.central = virtual_corrections(event, event.central().mur);
known.emplace(event.central().mur, result.central);
for(auto const & var: event.variations()) {
const auto ME_it = known.find(var.mur);
if(ME_it == end(known)) {
const double wt = virtual_corrections(event, var.mur);
result.variations.emplace_back(wt);
known.emplace(var.mur, wt);
}
else {
result.variations.emplace_back(ME_it->second);
}
}
return result;
}
double MatrixElement::virtual_corrections_W(
Event const & event,
double mur,
Particle const & WBoson
) const{
auto const & in = event.incoming();
const auto partons = filter_partons(event.outgoing());
fastjet::PseudoJet const & pa = in.front().p;
#ifndef NDEBUG
fastjet::PseudoJet const & pb = in.back().p;
double const norm = (in.front().p + in.back().p).E();
#endif
assert(std::is_sorted(partons.begin(), partons.end(), rapidity_less{}));
assert(partons.size() >= 2);
assert(pa.pz() < pb.pz());
fastjet::PseudoJet q = pa - partons[0].p;
size_t first_idx = 0;
size_t last_idx = partons.size() - 1;
bool wc = true;
bool wqq = false;
// With extremal qqx or unordered gluon outside the extremal
// partons then it is not part of the FKL ladder and does not
// contribute to the virtual corrections. W emitted from the
// most backward leg must be taken into account in t-channel
if (event.type() == event_type::FKL) {
if (in[0].type != partons[0].type ){
q -= WBoson.p;
wc = false;
}
}
else if (event.type() == event_type::unob) {
q -= partons[1].p;
++first_idx;
if (in[0].type != partons[1].type ){
q -= WBoson.p;
wc = false;
}
}
else if (event.type() == event_type::qqxexb) {
q -= partons[1].p;
++first_idx;
if (abs(partons[0].type) != abs(partons[1].type)){
q -= WBoson.p;
wc = false;
}
}
if(event.type() == event_type::unof
|| event.type() == event_type::qqxexf){
--last_idx;
}
size_t first_idx_qqx = last_idx;
size_t last_idx_qqx = last_idx;
//if qqxMid event, virtual correction do not occur between
//qqx pair.
if(event.type() == event_type::qqxmid){
const auto backquark = std::find_if(
begin(partons) + 1, end(partons) - 1 ,
[](Particle const & s){ return (s.type != pid::gluon); }
);
if(backquark == end(partons) || (backquark+1)->type==pid::gluon) return 0;
if(abs(backquark->type) != abs((backquark+1)->type)) {
wqq=true;
wc=false;
}
last_idx = std::distance(begin(partons), backquark);
first_idx_qqx = last_idx+1;
}
double exponent = 0;
const double alpha_s = alpha_s_(mur);
for(size_t j = first_idx; j < last_idx; ++j){
exponent += omega0(alpha_s, mur, q)*(
partons[j+1].rapidity() - partons[j].rapidity()
);
q -=partons[j+1].p;
} // End Loop one
if (last_idx != first_idx_qqx) q -= partons[last_idx+1].p;
if (wqq) q -= WBoson.p;
for(size_t j = first_idx_qqx; j < last_idx_qqx; ++j){
exponent += omega0(alpha_s, mur, q)*(
partons[j+1].rapidity() - partons[j].rapidity()
);
q -= partons[j+1].p;
}
if (wc) q -= WBoson.p;
assert(
nearby(q, -1*pb, norm)
|| is_AWZH_boson(partons.back().type)
|| event.type() == event_type::unof
|| event.type() == event_type::qqxexf
);
return exp(exponent);
}
double MatrixElement::virtual_corrections(
Event const & event,
double mur
) const{
auto const & in = event.incoming();
auto const & out = event.outgoing();
fastjet::PseudoJet const & pa = in.front().p;
#ifndef NDEBUG
fastjet::PseudoJet const & pb = in.back().p;
double const norm = (in.front().p + in.back().p).E();
#endif
const auto AWZH_boson = std::find_if(
begin(out), end(out),
[](Particle const & p){ return is_AWZH_boson(p); }
);
if(AWZH_boson != end(out) && abs(AWZH_boson->type) == pid::Wp){
return virtual_corrections_W(event, mur, *AWZH_boson);
}
assert(std::is_sorted(out.begin(), out.end(), rapidity_less{}));
assert(out.size() >= 2);
assert(pa.pz() < pb.pz());
fastjet::PseudoJet q = pa - out[0].p;
size_t first_idx = 0;
size_t last_idx = out.size() - 1;
// if there is a Higgs boson, extremal qqx or unordered gluon
// outside the extremal partons then it is not part of the FKL
// ladder and does not contribute to the virtual corrections
if((out.front().type == pid::Higgs)
|| event.type() == event_type::unob
|| event.type() == event_type::qqxexb){
q -= out[1].p;
++first_idx;
}
if((out.back().type == pid::Higgs)
|| event.type() == event_type::unof
|| event.type() == event_type::qqxexf){
--last_idx;
}
size_t first_idx_qqx = last_idx;
size_t last_idx_qqx = last_idx;
//if qqxMid event, virtual correction do not occur between
//qqx pair.
if(event.type() == event_type::qqxmid){
const auto backquark = std::find_if(
begin(out) + 1, end(out) - 1 ,
[](Particle const & s){ return (s.type != pid::gluon && is_parton(s.type)); }
);
if(backquark == end(out) || (backquark+1)->type==pid::gluon) return 0;
last_idx = std::distance(begin(out), backquark);
first_idx_qqx = last_idx+1;
}
double exponent = 0;
const double alpha_s = alpha_s_(mur);
for(size_t j = first_idx; j < last_idx; ++j){
exponent += omega0(alpha_s, mur, q)*(
out[j+1].rapidity() - out[j].rapidity()
);
q -= out[j+1].p;
}
if (last_idx != first_idx_qqx) q -= out[last_idx+1].p;
for(size_t j = first_idx_qqx; j < last_idx_qqx; ++j){
exponent += omega0(alpha_s, mur, q)*(
out[j+1].rapidity() - out[j].rapidity()
);
q -= out[j+1].p;
}
assert(
nearby(q, -1*pb, norm)
|| out.back().type == pid::Higgs
|| event.type() == event_type::unof
|| event.type() == event_type::qqxexf
);
return exp(exponent);
}
-} // namespace HEJ
namespace {
//! Lipatov vertex for partons emitted into extremal jets
double C2Lipatov(
CLHEP::HepLorentzVector const & qav,
CLHEP::HepLorentzVector const & qbv,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & p2
){
CLHEP::HepLorentzVector temptrans=-(qav+qbv);
CLHEP::HepLorentzVector p5=qav-qbv;
CLHEP::HepLorentzVector CL=temptrans
+ p1*(qav.m2()/p5.dot(p1) + 2.*p5.dot(p2)/p1.dot(p2))
- p2*(qbv.m2()/p5.dot(p2) + 2.*p5.dot(p1)/p1.dot(p2));
return -CL.dot(CL);
}
//! Lipatov vertex with soft subtraction for partons emitted into extremal jets
double C2Lipatovots(
CLHEP::HepLorentzVector const & qav,
CLHEP::HepLorentzVector const & qbv,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & p2,
double lambda
) {
double kperp=(qav-qbv).perp();
if (kperp>lambda)
return C2Lipatov(qav, qbv, p1, p2)/(qav.m2()*qbv.m2());
double Cls=(C2Lipatov(qav, qbv, p1, p2)/(qav.m2()*qbv.m2()));
return Cls-4./(kperp*kperp);
}
//! Lipatov vertex
double C2Lipatov( // B
CLHEP::HepLorentzVector const & qav,
CLHEP::HepLorentzVector const & qbv,
CLHEP::HepLorentzVector const & pim,
CLHEP::HepLorentzVector const & pip,
CLHEP::HepLorentzVector const & pom,
CLHEP::HepLorentzVector const & pop
){
CLHEP::HepLorentzVector temptrans=-(qav+qbv);
CLHEP::HepLorentzVector p5=qav-qbv;
CLHEP::HepLorentzVector CL=temptrans
+ qav.m2()*(1./p5.dot(pip)*pip + 1./p5.dot(pop)*pop)/2.
- qbv.m2()*(1./p5.dot(pim)*pim + 1./p5.dot(pom)*pom)/2.
+ ( pip*(p5.dot(pim)/pip.dot(pim) + p5.dot(pom)/pip.dot(pom))
+ pop*(p5.dot(pim)/pop.dot(pim) + p5.dot(pom)/pop.dot(pom))
- pim*(p5.dot(pip)/pip.dot(pim) + p5.dot(pop)/pop.dot(pim))
- pom*(p5.dot(pip)/pip.dot(pom) + p5.dot(pop)/pop.dot(pom)) )/2.;
return -CL.dot(CL);
}
//! Lipatov vertex with soft subtraction
double C2Lipatovots(
CLHEP::HepLorentzVector const & qav,
CLHEP::HepLorentzVector const & qbv,
CLHEP::HepLorentzVector const & pa,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & p2,
double lambda
) {
double kperp=(qav-qbv).perp();
if (kperp>lambda)
return C2Lipatov(qav, qbv, pa, pb, p1, p2)/(qav.m2()*qbv.m2());
double Cls=(C2Lipatov(qav, qbv, pa, pb, p1, p2)/(qav.m2()*qbv.m2()));
double temp=Cls-4./(kperp*kperp);
return temp;
}
/** Matrix element squared for tree-level current-current scattering
* @param aptype Particle a PDG ID
* @param bptype Particle b PDG ID
* @param pg Unordered gluon momentum
* @param pn Particle n Momentum
* @param pb Particle b Momentum
* @param p1 Particle 1 Momentum
* @param pa Particle a Momentum
* @returns ME Squared for Tree-Level Current-Current Scattering
*
* @note The unof contribution can be calculated by reversing the argument ordering.
*/
double ME_uno_current(
int aptype, int bptype,
CLHEP::HepLorentzVector const & pg,
CLHEP::HepLorentzVector const & pn,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & pa
){
assert(aptype!=21); // aptype cannot be gluon
if (bptype==21) {
if (aptype > 0)
return ME_unob_qg(pg,p1,pa,pn,pb);
else
return ME_unob_qbarg(pg,p1,pa,pn,pb);
}
else if (bptype<0) { // ----- || -----
if (aptype > 0)
return ME_unob_qQbar(pg,p1,pa,pn,pb);
else
return ME_unob_qbarQbar(pg,p1,pa,pn,pb);
}
else { //bptype == quark
if (aptype > 0)
return ME_unob_qQ(pg,p1,pa,pn,pb);
else
return ME_unob_qbarQ(pg,p1,pa,pn,pb);
}
}
/** Matrix element squared for tree-level current-current scattering
* @param aptype Particle a PDG ID
* @param bptype Particle b PDG ID
* @param pn Particle n Momentum
* @param pb Particle b Momentum
* @param p1 Particle 1 Momentum
* @param pa Particle a Momentum
* @returns ME Squared for Tree-Level Current-Current Scattering
*/
double ME_current(
int aptype, int bptype,
CLHEP::HepLorentzVector const & pn,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & pa
){
if (aptype==21&&bptype==21) {
return ME_gg(pn,pb,p1,pa);
} else if (aptype==21&&bptype!=21) {
if (bptype > 0)
return ME_qg(pn,pb,p1,pa);
else
return ME_qbarg(pn,pb,p1,pa);
}
else if (bptype==21&&aptype!=21) { // ----- || -----
if (aptype > 0)
return ME_qg(p1,pa,pn,pb);
else
return ME_qbarg(p1,pa,pn,pb);
}
else { // they are both quark
if (bptype>0) {
if (aptype>0)
return ME_qQ(pn,pb,p1,pa);
else
return ME_qQbar(pn,pb,p1,pa);
}
else {
if (aptype>0)
return ME_qQbar(p1,pa,pn,pb);
else
return ME_qbarQbar(pn,pb,p1,pa);
}
}
throw std::logic_error("unknown particle types");
}
/** Matrix element squared for tree-level current-current scattering With W+Jets
* @param aptype Particle a PDG ID
* @param bptype Particle b PDG ID
* @param pn Particle n Momentum
* @param pb Particle b Momentum
* @param p1 Particle 1 Momentum
* @param pa Particle a Momentum
* @param wc Boolean. True->W Emitted from b. Else; emitted from leg a
* @returns ME Squared for Tree-Level Current-Current Scattering
*/
double ME_W_current(
int aptype, int bptype,
CLHEP::HepLorentzVector const & pn,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & pa,
CLHEP::HepLorentzVector const & plbar,
CLHEP::HepLorentzVector const & pl,
- bool const wc
+ bool const wc, ParticleProperties const & Wprop
){
// We know it cannot be gg incoming.
assert(!(aptype==21 && bptype==21));
if (aptype==21&&bptype!=21) {
if (bptype > 0)
- return ME_W_qg(pn,plbar,pl,pb,p1,pa);
+ return ME_W_qg(pn,plbar,pl,pb,p1,pa,Wprop);
else
- return ME_W_qbarg(pn,plbar,pl,pb,p1,pa);
+ return ME_W_qbarg(pn,plbar,pl,pb,p1,pa,Wprop);
}
else if (bptype==21&&aptype!=21) { // ----- || -----
if (aptype > 0)
- return ME_W_qg(p1,plbar,pl,pa,pn,pb);
+ return ME_W_qg(p1,plbar,pl,pa,pn,pb,Wprop);
else
- return ME_W_qbarg(p1,plbar,pl,pa,pn,pb);
+ return ME_W_qbarg(p1,plbar,pl,pa,pn,pb,Wprop);
}
else { // they are both quark
if (wc==true){ // emission off b, (first argument pbout)
if (bptype>0) {
if (aptype>0)
- return ME_W_qQ(pn,plbar,pl,pb,p1,pa);
+ return ME_W_qQ(pn,plbar,pl,pb,p1,pa,Wprop);
else
- return ME_W_qQbar(pn,plbar,pl,pb,p1,pa);
+ return ME_W_qQbar(pn,plbar,pl,pb,p1,pa,Wprop);
}
else {
if (aptype>0)
- return ME_W_qbarQ(pn,plbar,pl,pb,p1,pa);
+ return ME_W_qbarQ(pn,plbar,pl,pb,p1,pa,Wprop);
else
- return ME_W_qbarQbar(pn,plbar,pl,pb,p1,pa);
+ return ME_W_qbarQbar(pn,plbar,pl,pb,p1,pa,Wprop);
}
}
else{ // emission off a, (first argument paout)
if (aptype > 0) {
if (bptype > 0)
- return ME_W_qQ(p1,plbar,pl,pa,pn,pb);
+ return ME_W_qQ(p1,plbar,pl,pa,pn,pb,Wprop);
else
- return ME_W_qQbar(p1,plbar,pl,pa,pn,pb);
+ return ME_W_qQbar(p1,plbar,pl,pa,pn,pb,Wprop);
}
else { // a is anti-quark
if (bptype > 0)
- return ME_W_qbarQ(p1,plbar,pl,pa,pn,pb);
+ return ME_W_qbarQ(p1,plbar,pl,pa,pn,pb,Wprop);
else
- return ME_W_qbarQbar(p1,plbar,pl,pa,pn,pb);
+ return ME_W_qbarQbar(p1,plbar,pl,pa,pn,pb,Wprop);
}
}
}
throw std::logic_error("unknown particle types");
}
/** Matrix element squared for backwards uno tree-level current-current
* scattering With W+Jets
*
* @param aptype Particle a PDG ID
* @param bptype Particle b PDG ID
* @param pn Particle n Momentum
* @param pb Particle b Momentum
* @param p1 Particle 1 Momentum
* @param pa Particle a Momentum
* @param pg Unordered gluon momentum
* @param wc Boolean. True->W Emitted from b. Else; emitted from leg a
* @returns ME Squared for unob Tree-Level Current-Current Scattering
*
* @note The unof contribution can be calculated by reversing the argument ordering.
*/
double ME_W_uno_current(
int aptype, int bptype,
CLHEP::HepLorentzVector const & pn,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & pa,
CLHEP::HepLorentzVector const & pg,
CLHEP::HepLorentzVector const & plbar,
CLHEP::HepLorentzVector const & pl,
- bool const wc
+ bool const wc, ParticleProperties const & Wprop
){
// we know they are not both gluons
if (bptype == 21 && aptype != 21) { // b gluon => W emission off a
if (aptype > 0)
- return ME_Wuno_qg(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_Wuno_qg(p1,pa,pn,pb,pg,plbar,pl,Wprop);
else
- return ME_Wuno_qbarg(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_Wuno_qbarg(p1,pa,pn,pb,pg,plbar,pl,Wprop);
}
else { // they are both quark
if (wc) {// emission off b, i.e. b is first current
if (bptype>0){
if (aptype>0)
- return ME_W_unob_qQ(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_W_unob_qQ(p1,pa,pn,pb,pg,plbar,pl,Wprop);
else
- return ME_W_unob_qQbar(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_W_unob_qQbar(p1,pa,pn,pb,pg,plbar,pl,Wprop);
}
else{
if (aptype>0)
- return ME_W_unob_qbarQ(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_W_unob_qbarQ(p1,pa,pn,pb,pg,plbar,pl,Wprop);
else
- return ME_W_unob_qbarQbar(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_W_unob_qbarQbar(p1,pa,pn,pb,pg,plbar,pl,Wprop);
}
}
else {// wc == false, emission off a, i.e. a is first current
if (aptype > 0) {
if (bptype > 0) //qq
- return ME_Wuno_qQ(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_Wuno_qQ(p1,pa,pn,pb,pg,plbar,pl,Wprop);
else //qqbar
- return ME_Wuno_qQbar(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_Wuno_qQbar(p1,pa,pn,pb,pg,plbar,pl,Wprop);
}
else { // a is anti-quark
if (bptype > 0) //qbarq
- return ME_Wuno_qbarQ(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_Wuno_qbarQ(p1,pa,pn,pb,pg,plbar,pl,Wprop);
else //qbarqbar
- return ME_Wuno_qbarQbar(p1,pa,pn,pb,pg,plbar,pl);
+ return ME_Wuno_qbarQbar(p1,pa,pn,pb,pg,plbar,pl,Wprop);
}
}
}
throw std::logic_error("unknown particle types");
}
/** \brief Matrix element squared for backward qqx tree-level current-current
* scattering With W+Jets
*
* @param aptype Particle a PDG ID
* @param bptype Particle b PDG ID
* @param pa Initial state a Momentum
* @param pb Initial state b Momentum
* @param pq Final state q Momentum
* @param pqbar Final state qbar Momentum
* @param pn Final state n Momentum
* @param plbar Final state anti-lepton momentum
* @param pl Final state lepton momentum
* @param wc Boolean. True->W Emitted from b. Else; emitted from leg a
* @returns ME Squared for qqxb Tree-Level Current-Current Scattering
*
* @note calculate forwards qqx contribution by reversing argument ordering.
*/
double ME_W_qqx_current(
int aptype, int bptype,
CLHEP::HepLorentzVector const & pa,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & pq,
CLHEP::HepLorentzVector const & pqbar,
CLHEP::HepLorentzVector const & pn,
CLHEP::HepLorentzVector const & plbar,
CLHEP::HepLorentzVector const & pl,
- bool const swap_q_qx, bool const wc
+ bool const swap_q_qx, bool const wc,
+ ParticleProperties const & Wprop
){
// CAM factors for the qqx amps, and qqbar ordering (default, qbar extremal)
// const bool swap_q_qx= pqbar.rapidity() > pq.rapidity();
const double CFbackward = K_g( (swap_q_qx)?pq:pqbar ,pa)/HEJ::C_F;
// With qqbar we could have 2 incoming gluons and W Emission
if (aptype==21&&bptype==21) {//a gluon, b gluon gg->qqbarWg
// This will be a wqqx emission as there is no other possible W Emission Site.
if (swap_q_qx)
- return ME_WExqqx_qqbarg(pa, pqbar, plbar, pl, pq, pn, pb)*CFbackward;
+ return ME_WExqqx_qqbarg(pa, pqbar, plbar, pl, pq, pn, pb, Wprop)*CFbackward;
else
- return ME_WExqqx_qbarqg(pa, pq, plbar, pl, pqbar, pn, pb)*CFbackward;
+ return ME_WExqqx_qbarqg(pa, pq, plbar, pl, pqbar, pn, pb, Wprop)*CFbackward;
}
else if (aptype==21&&bptype!=21 ) {//a gluon => W emission off b leg or qqx
if (!wc){ // W Emitted from backwards qqx
if (swap_q_qx)
- return ME_WExqqx_qqbarQ(pa, pqbar, plbar, pl, pq, pn, pb)*CFbackward;
+ return ME_WExqqx_qqbarQ(pa, pqbar, plbar, pl, pq, pn, pb, Wprop)*CFbackward;
else
- return ME_WExqqx_qbarqQ(pa, pq, plbar, pl, pqbar, pn, pb)*CFbackward;
+ return ME_WExqqx_qbarqQ(pa, pq, plbar, pl, pqbar, pn, pb, Wprop)*CFbackward;
}
else { // W Must be emitted from forwards leg.
if (swap_q_qx)
- return ME_W_Exqqx_QQq(pb, pa, pn, pqbar, pq, plbar, pl, bptype<0)*CFbackward;
+ return ME_W_Exqqx_QQq(pb, pa, pn, pqbar, pq, plbar, pl, bptype<0, Wprop)*CFbackward;
else
- return ME_W_Exqqx_QQq(pb, pa, pn, pq, pqbar, plbar, pl, bptype<0)*CFbackward;
+ return ME_W_Exqqx_QQq(pb, pa, pn, pq, pqbar, plbar, pl, bptype<0, Wprop)*CFbackward;
}
}
throw std::logic_error("Incompatible incoming particle types with qqxb");
}
/* \brief Matrix element squared for central qqx tree-level current-current
* scattering With W+Jets
*
* @param aptype Particle a PDG ID
* @param bptype Particle b PDG ID
* @param nabove Number of gluons emitted before central qqxpair
* @param nbelow Number of gluons emitted after central qqxpair
* @param pa Initial state a Momentum
* @param pb Initial state b Momentum\
* @param pq Final state qbar Momentum
* @param pqbar Final state q Momentum
* @param partons Vector of all outgoing partons
* @param plbar Final state anti-lepton momentum
* @param pl Final state lepton momentum
* @param wqq Boolean. True siginfies W boson is emitted from Central qqx
* @param wc Boolean. wc=true signifies w boson emitted from leg b; if wqq=false.
* @returns ME Squared for qqxmid Tree-Level Current-Current Scattering
*/
double ME_W_qqxmid_current(
int aptype, int bptype,
int nabove, int nbelow,
CLHEP::HepLorentzVector const & pa,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & pq,
CLHEP::HepLorentzVector const & pqbar,
std::vector<HLV> const & partons,
CLHEP::HepLorentzVector const & plbar,
CLHEP::HepLorentzVector const & pl,
- bool const wqq, bool const wc
+ bool const wqq, bool const wc,
+ ParticleProperties const & Wprop
){
// CAM factors for the qqx amps, and qqbar ordering (default, pq backwards)
const bool swap_q_qx=pqbar.rapidity() < pq.rapidity();
double wt=1.;
if (aptype==21) wt*=K_g(partons.front(),pa)/HEJ::C_F;
if (bptype==21) wt*=K_g(partons.back(),pb)/HEJ::C_F;
if(wqq)
return wt*ME_WCenqqx_qq(pa, pb, pl, plbar, partons,(bptype<0),(aptype<0),
- swap_q_qx, nabove);
+ swap_q_qx, nabove, Wprop);
return wt*ME_W_Cenqqx_qq(pa, pb, pl, plbar, partons, (bptype<0), (aptype<0),
- swap_q_qx, nabove, nbelow, wc);
+ swap_q_qx, nabove, nbelow, wc, Wprop);
}
/** \brief Matrix element squared for tree-level current-current scattering with Higgs
* @param aptype Particle a PDG ID
* @param bptype Particle b PDG ID
* @param pn Particle n Momentum
* @param pb Particle b Momentum
* @param p1 Particle 1 Momentum
* @param pa Particle a Momentum
* @param qH t-channel momentum before Higgs
* @param qHp1 t-channel momentum after Higgs
* @returns ME Squared for Tree-Level Current-Current Scattering with Higgs
*/
double ME_Higgs_current(
int aptype, int bptype,
CLHEP::HepLorentzVector const & pn,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & pa,
CLHEP::HepLorentzVector const & qH, // t-channel momentum before Higgs
CLHEP::HepLorentzVector const & qHp1, // t-channel momentum after Higgs
- double mt, bool include_bottom, double mb
+ double mt, bool include_bottom, double mb, double vev
){
if (aptype==21&&bptype==21) // gg initial state
- return ME_H_gg(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb);
+ return ME_H_gg(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb,vev);
else if (aptype==21&&bptype!=21) {
if (bptype > 0)
- return ME_H_qg(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb)*4./9.;
+ return ME_H_qg(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb,vev)*4./9.;
else
- return ME_H_qbarg(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb)*4./9.;
+ return ME_H_qbarg(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb,vev)*4./9.;
}
else if (bptype==21&&aptype!=21) {
if (aptype > 0)
- return ME_H_qg(p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb)*4./9.;
+ return ME_H_qg(p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev)*4./9.;
else
- return ME_H_qbarg(p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb)*4./9.;
+ return ME_H_qbarg(p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev)*4./9.;
}
else { // they are both quark
if (bptype>0) {
if (aptype>0)
- return ME_H_qQ(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb)*4.*4./(9.*9.);
+ return ME_H_qQ(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb,vev)*4.*4./(9.*9.);
else
- return ME_H_qQbar(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb)*4.*4./(9.*9.);
+ return ME_H_qQbar(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb,vev)*4.*4./(9.*9.);
}
else {
if (aptype>0)
- return ME_H_qQbar(p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb)*4.*4./(9.*9.);
+ return ME_H_qQbar(p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev)*4.*4./(9.*9.);
else
- return ME_H_qbarQbar(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb)*4.*4./(9.*9.);
+ return ME_H_qbarQbar(pn,pb,p1,pa,-qHp1,-qH,mt,include_bottom,mb,vev)*4.*4./(9.*9.);
}
}
throw std::logic_error("unknown particle types");
}
/** \brief Current matrix element squared with Higgs and unordered backward emission
* @param aptype Particle A PDG ID
* @param bptype Particle B PDG ID
* @param pn Particle n Momentum
* @param pb Particle b Momentum
* @param pg Unordered back Particle Momentum
* @param p1 Particle 1 Momentum
* @param pa Particle a Momentum
* @param qH t-channel momentum before Higgs
* @param qHp1 t-channel momentum after Higgs
* @returns ME Squared with Higgs and unordered backward emission
*
* @note This function assumes unordered gluon backwards from pa-p1 current.
* For unof, reverse call order
*/
double ME_Higgs_current_uno(
int aptype, int bptype,
CLHEP::HepLorentzVector const & pg,
CLHEP::HepLorentzVector const & pn,
CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1,
CLHEP::HepLorentzVector const & pa,
CLHEP::HepLorentzVector const & qH, // t-channel momentum before Higgs
CLHEP::HepLorentzVector const & qHp1, // t-channel momentum after Higgs
- double mt, bool include_bottom, double mb
+ double mt, bool include_bottom, double mb, double vev
){
if (bptype==21&&aptype!=21) {
if (aptype > 0)
- return ME_H_unob_gQ(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb);
+ return ME_H_unob_gQ(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev);
else
- return ME_H_unob_gQbar(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb);
+ return ME_H_unob_gQbar(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev);
}
else { // they are both quark
if (aptype>0) {
if (bptype>0)
- return ME_H_unob_qQ(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb);
+ return ME_H_unob_qQ(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev);
else
- return ME_H_unob_qbarQ(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb);
+ return ME_H_unob_qbarQ(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev);
}
else {
if (bptype>0)
- return ME_H_unob_qQbar(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb);
+ return ME_H_unob_qQbar(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev);
else
- return ME_H_unob_qbarQbar(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb);
+ return ME_H_unob_qbarQbar(pg,p1,pa,pn,pb,-qH,-qHp1,mt,include_bottom,mb,vev);
}
}
throw std::logic_error("unknown particle types");
}
CLHEP::HepLorentzVector to_HepLorentzVector(HEJ::Particle const & particle){
return {particle.p.px(), particle.p.py(), particle.p.pz(), particle.p.E()};
}
void validate(HEJ::MatrixElementConfig const & config) {
#ifndef HEJ_BUILD_WITH_QCDLOOP
if(!config.Higgs_coupling.use_impact_factors) {
throw std::invalid_argument{
"Invalid Higgs coupling settings.\n"
"HEJ without QCDloop support can only use impact factors.\n"
"Set use_impact_factors to true or recompile HEJ.\n"
};
}
#endif
if(config.Higgs_coupling.use_impact_factors
&& config.Higgs_coupling.mt != std::numeric_limits<double>::infinity()) {
throw std::invalid_argument{
"Conflicting settings: "
"impact factors may only be used in the infinite top mass limit"
};
}
}
} // namespace anonymous
-namespace HEJ{
MatrixElement::MatrixElement(
std::function<double (double)> alpha_s,
MatrixElementConfig conf
):
alpha_s_{std::move(alpha_s)},
param_{std::move(conf)}
{
validate(param_);
}
double MatrixElement::tree_kin(
Event const & ev
) const {
if(! is_resummable(ev.type())) return 0.;
auto AWZH_boson = std::find_if(
begin(ev.outgoing()), end(ev.outgoing()),
[](Particle const & p){return is_AWZH_boson(p);}
);
if(AWZH_boson == end(ev.outgoing()))
return tree_kin_jets(ev);
switch(AWZH_boson->type){
case pid::Higgs:
return tree_kin_Higgs(ev);
case pid::Wp:
case pid::Wm:
return tree_kin_W(ev);
// TODO
case pid::photon:
case pid::Z:
default:
throw not_implemented("Emission of boson of unsupported type");
}
}
namespace{
constexpr int extremal_jet_idx = 1;
constexpr int no_extremal_jet_idx = 0;
bool treat_as_extremal(Particle const & parton){
return parton.p.user_index() == extremal_jet_idx;
}
template<class InputIterator>
double FKL_ladder_weight(
InputIterator begin_gluon, InputIterator end_gluon,
CLHEP::HepLorentzVector const & q0,
CLHEP::HepLorentzVector const & pa, CLHEP::HepLorentzVector const & pb,
CLHEP::HepLorentzVector const & p1, CLHEP::HepLorentzVector const & pn,
double lambda
){
double wt = 1;
auto qi = q0;
for(auto gluon_it = begin_gluon; gluon_it != end_gluon; ++gluon_it){
assert(gluon_it->type == pid::gluon);
const auto g = to_HepLorentzVector(*gluon_it);
const auto qip1 = qi - g;
if(treat_as_extremal(*gluon_it)){
wt *= C2Lipatovots(qip1, qi, pa, pb, lambda)*C_A;
} else{
wt *= C2Lipatovots(qip1, qi, pa, pb, p1, pn, lambda)*C_A;
}
qi = qip1;
}
return wt;
}
} // namespace anonymous
std::vector<Particle> MatrixElement::tag_extremal_jet_partons(
Event const & ev
) const{
auto out_partons = filter_partons(ev.outgoing());
if(out_partons.size() == ev.jets().size()){
// no additional emissions in extremal jets, don't need to tag anything
for(auto & parton: out_partons){
parton.p.set_user_index(no_extremal_jet_idx);
}
return out_partons;
}
const auto & jets = ev.jets();
assert(jets.size() >= 2);
auto most_backward = begin(jets);
auto most_forward = end(jets) - 1;
// skip jets caused by unordered emission or qqx
if(ev.type() == event_type::unob || ev.type() == event_type::qqxexb){
assert(jets.size() >= 3);
++most_backward;
}
else if(ev.type() == event_type::unof || ev.type() == event_type::qqxexf){
assert(jets.size() >= 3);
--most_forward;
}
const auto extremal_jet_indices = ev.particle_jet_indices(
{*most_backward, *most_forward}
);
assert(extremal_jet_indices.size() == out_partons.size());
for(size_t i = 0; i < out_partons.size(); ++i){
assert(HEJ::is_parton(out_partons[i]));
const int idx = (extremal_jet_indices[i]>=0)?
extremal_jet_idx:
no_extremal_jet_idx;
out_partons[i].p.set_user_index(idx);
}
return out_partons;
}
namespace {
template<class InIter, class partIter>
double tree_kin_jets_uno(InIter BeginIn, InIter EndIn, partIter BeginPart,
partIter EndPart, double lambda){
const auto pa = to_HepLorentzVector(*BeginIn);
const auto pb = to_HepLorentzVector(*(EndIn-1));
const auto pg = to_HepLorentzVector(*BeginPart);
const auto p1 = to_HepLorentzVector(*(BeginPart+1));
const auto pn = to_HepLorentzVector(*(EndPart-1));
const double current_factor = ME_uno_current(
(BeginIn)->type, (EndIn-1)->type, pg, pn, pb, p1, pa
)/(4.*(N_C*N_C - 1.));
const double ladder_factor = FKL_ladder_weight(
(BeginPart+2), (EndPart-1),
pa-p1-pg, pa, pb, p1, pn, lambda
);
return current_factor*ladder_factor;
}
}
double MatrixElement::tree_kin_jets(Event const & ev) const {
auto const & incoming = ev.incoming();
const auto partons = tag_extremal_jet_partons(ev);
if (ev.type()==HEJ::event_type::FKL){
const auto pa = to_HepLorentzVector(incoming[0]);
const auto pb = to_HepLorentzVector(incoming[1]);
const auto p1 = to_HepLorentzVector(partons.front());
const auto pn = to_HepLorentzVector(partons.back());
return ME_current(
incoming[0].type, incoming[1].type,
pn, pb, p1, pa
)/(4.*(N_C*N_C - 1.))*FKL_ladder_weight(
begin(partons) + 1, end(partons) - 1,
pa - p1, pa, pb, p1, pn,
param_.regulator_lambda
);
}
else if (ev.type()==HEJ::event_type::unordered_backward){
return tree_kin_jets_uno(incoming.begin(), incoming.end(),
partons.begin(), partons.end(),
param_.regulator_lambda);
}
else if (ev.type()==HEJ::event_type::unordered_forward){
return tree_kin_jets_uno(incoming.rbegin(), incoming.rend(),
partons.rbegin(), partons.rend(),
param_.regulator_lambda);
}
else {
throw std::logic_error("Can only reweight FKL or uno processes in Pure Jets");
}
}
namespace{
double tree_kin_W_FKL(
int aptype, int bptype, HLV pa, HLV pb,
std::vector<Particle> const & partons,
HLV plbar, HLV pl,
- double lambda
+ double lambda, ParticleProperties const & Wprop
){
auto p1 = to_HepLorentzVector(partons[0]);
auto pn = to_HepLorentzVector(partons[partons.size() - 1]);
const auto begin_ladder = cbegin(partons) + 1;
const auto end_ladder = cend(partons) - 1;
bool wc = aptype==partons[0].type; //leg b emits w
auto q0 = pa - p1;
if(!wc)
q0 -= pl + plbar;
const double current_factor = ME_W_current(
aptype, bptype, pn, pb,
- p1, pa, plbar, pl, wc
+ p1, pa, plbar, pl, wc, Wprop
);
const double ladder_factor = FKL_ladder_weight(
begin_ladder, end_ladder,
q0, pa, pb, p1, pn,
lambda
);
return current_factor*ladder_factor;
}
template<class InIter, class partIter>
double tree_kin_W_uno(InIter BeginIn, partIter BeginPart,
partIter EndPart, const HLV & plbar, const HLV & pl,
- double lambda){
+ double lambda, ParticleProperties const & Wprop){
const auto pa = to_HepLorentzVector(*BeginIn);
const auto pb = to_HepLorentzVector(*(BeginIn+1));
const auto pg = to_HepLorentzVector(*BeginPart);
const auto p1 = to_HepLorentzVector(*(BeginPart+1));
const auto pn = to_HepLorentzVector(*(EndPart-1));
bool wc = (BeginIn)->type==(BeginPart+1)->type; //leg b emits w
auto q0 = pa - p1 - pg;
if(!wc)
q0 -= pl + plbar;
const double current_factor = ME_W_uno_current(
(BeginIn)->type, (BeginIn+1)->type, pn, pb,
- p1, pa, pg, plbar, pl, wc
+ p1, pa, pg, plbar, pl, wc, Wprop
);
const double ladder_factor = FKL_ladder_weight(
BeginPart+2, EndPart-1,
q0, pa, pb, p1, pn,
lambda
);
return current_factor*C_A*C_A/(N_C*N_C-1.)*ladder_factor;
}
template<class InIter, class partIter>
double tree_kin_W_qqx(InIter BeginIn, partIter BeginPart,
partIter EndPart, const HLV & plbar, const HLV & pl,
- double lambda){
+ double lambda, ParticleProperties const & Wprop){
const bool swap_q_qx=is_quark(*BeginPart);
const auto pa = to_HepLorentzVector(*BeginIn);
const auto pb = to_HepLorentzVector(*(BeginIn+1));
const auto pq = to_HepLorentzVector(*(BeginPart+(swap_q_qx?0:1)));
const auto pqbar = to_HepLorentzVector(*(BeginPart+(swap_q_qx?1:0)));
const auto p1 = to_HepLorentzVector(*(BeginPart));
const auto pn = to_HepLorentzVector(*(EndPart-1));
const bool wc = (BeginIn+1)->type!=(EndPart-1)->type; //leg b emits w
auto q0 = pa - pq - pqbar;
if(!wc)
q0 -= pl + plbar;
const double current_factor = ME_W_qqx_current(
(BeginIn)->type, (BeginIn+1)->type, pa, pb,
- pq, pqbar, pn, plbar, pl, swap_q_qx, wc
+ pq, pqbar, pn, plbar, pl, swap_q_qx, wc, Wprop
);
const double ladder_factor = FKL_ladder_weight(
BeginPart+2, EndPart-1,
q0, pa, pb, p1, pn,
lambda
);
return current_factor*C_A*C_A/(N_C*N_C-1.)*ladder_factor;
}
double tree_kin_W_qqxmid(
int aptype, int bptype, HLV pa, HLV pb,
std::vector<Particle> const & partons,
HLV plbar, HLV pl,
- double lambda
+ double lambda, ParticleProperties const & Wprop
){
HLV pq,pqbar;
const auto backmidquark = std::find_if(
begin(partons)+1, end(partons)-1,
[](Particle const & s){ return s.type != pid::gluon; }
);
assert(backmidquark!=end(partons)-1);
if (is_quark(backmidquark->type)){
pq = to_HepLorentzVector(*backmidquark);
pqbar = to_HepLorentzVector(*(backmidquark+1));
}
else {
pqbar = to_HepLorentzVector(*backmidquark);
pq = to_HepLorentzVector(*(backmidquark+1));
}
auto p1 = to_HepLorentzVector(partons[0]);
auto pn = to_HepLorentzVector(partons[partons.size() - 1]);
auto q0 = pa - p1;
// t-channel momentum after qqx
auto qqxt = q0;
bool wc, wqq;
if (backmidquark->type == -(backmidquark+1)->type){ // Central qqx does not emit
wqq=false;
if (aptype==partons[0].type) {
wc = true;
}
else{
wc = false;
q0-=pl+plbar;
}
}
else{
wqq = true;
wc = false;
qqxt-=pl+plbar;
}
const auto begin_ladder = cbegin(partons) + 1;
const auto end_ladder_1 = (backmidquark);
const auto begin_ladder_2 = (backmidquark+2);
const auto end_ladder = cend(partons) - 1;
for(auto parton_it = begin_ladder; parton_it < begin_ladder_2; ++parton_it){
qqxt -= to_HepLorentzVector(*parton_it);
}
int nabove = std::distance(begin_ladder, backmidquark);
int nbelow = std::distance(begin_ladder_2, end_ladder);
std::vector<HLV> partonsHLV;
partonsHLV.reserve(partons.size());
for (size_t i = 0; i != partons.size(); ++i) {
partonsHLV.push_back(to_HepLorentzVector(partons[i]));
}
const double current_factor = ME_W_qqxmid_current(
aptype, bptype, nabove, nbelow, pa, pb,
- pq, pqbar, partonsHLV, plbar, pl, wqq, wc
+ pq, pqbar, partonsHLV, plbar, pl, wqq, wc, Wprop
);
const double ladder_factor = FKL_ladder_weight(
begin_ladder, end_ladder_1,
q0, pa, pb, p1, pn,
lambda
)*FKL_ladder_weight(
begin_ladder_2, end_ladder,
qqxt, pa, pb, p1, pn,
lambda
);
return current_factor*C_A*C_A/(N_C*N_C-1.)*ladder_factor;
}
} // namespace anonymous
double MatrixElement::tree_kin_W(Event const & ev) const {
using namespace event_type;
auto const & incoming(ev.incoming());
auto const & decays(ev.decays());
HLV plbar, pl;
for (auto& x: decays) {
if (x.second.at(0).type < 0){
plbar = to_HepLorentzVector(x.second.at(0));
pl = to_HepLorentzVector(x.second.at(1));
}
else{
pl = to_HepLorentzVector(x.second.at(0));
plbar = to_HepLorentzVector(x.second.at(1));
}
}
const auto pa = to_HepLorentzVector(incoming[0]);
const auto pb = to_HepLorentzVector(incoming[1]);
const auto partons = tag_extremal_jet_partons(ev);
if(ev.type() == FKL){
return tree_kin_W_FKL(incoming[0].type, incoming[1].type,
pa, pb, partons, plbar, pl,
- param_.regulator_lambda);
+ param_.regulator_lambda,
+ param_.ew_parameters.Wprop());
}
if(ev.type() == unordered_backward){
return tree_kin_W_uno(cbegin(incoming), cbegin(partons),
cend(partons), plbar, pl,
- param_.regulator_lambda);
+ param_.regulator_lambda,
+ param_.ew_parameters.Wprop());
}
if(ev.type() == unordered_forward){
return tree_kin_W_uno(crbegin(incoming), crbegin(partons),
crend(partons), plbar, pl,
- param_.regulator_lambda);
+ param_.regulator_lambda,
+ param_.ew_parameters.Wprop());
}
if(ev.type() == extremal_qqxb){
return tree_kin_W_qqx(cbegin(incoming), cbegin(partons),
cend(partons), plbar, pl,
- param_.regulator_lambda);
+ param_.regulator_lambda,
+ param_.ew_parameters.Wprop());
}
if(ev.type() == extremal_qqxf){
return tree_kin_W_qqx(crbegin(incoming), crbegin(partons),
crend(partons), plbar, pl,
- param_.regulator_lambda);
+ param_.regulator_lambda,
+ param_.ew_parameters.Wprop());
}
assert(ev.type() == central_qqx);
return tree_kin_W_qqxmid(incoming[0].type, incoming[1].type,
pa, pb, partons, plbar, pl,
- param_.regulator_lambda);
+ param_.regulator_lambda,
+ param_.ew_parameters.Wprop());
}
double MatrixElement::tree_kin_Higgs(Event const & ev) const {
if(is_uno(ev.type())){
return tree_kin_Higgs_between(ev);
}
if(ev.outgoing().front().type == pid::Higgs){
return tree_kin_Higgs_first(ev);
}
if(ev.outgoing().back().type == pid::Higgs){
return tree_kin_Higgs_last(ev);
}
return tree_kin_Higgs_between(ev);
}
namespace {
// Colour acceleration multipliers, for gluons see eq. (7) in arXiv:0910.5113
#ifdef HEJ_BUILD_WITH_QCDLOOP
// TODO: code duplication with jets.cc
double K_g(double p1minus, double paminus) {
return 1./2.*(p1minus/paminus + paminus/p1minus)*(C_A - 1./C_A) + 1./C_A;
}
double K_g(
CLHEP::HepLorentzVector const & pout,
CLHEP::HepLorentzVector const & pin
) {
if(pin.z() > 0) return K_g(pout.plus(), pin.plus());
return K_g(pout.minus(), pin.minus());
}
double K(
ParticleID type,
CLHEP::HepLorentzVector const & pout,
CLHEP::HepLorentzVector const & pin
) {
if(type == ParticleID::gluon) return K_g(pout, pin);
return C_F;
}
#endif
// Colour factor in strict MRK limit
double K_MRK(ParticleID type) {
return (type == ParticleID::gluon)?C_A:C_F;
}
}
double MatrixElement::MH2_forwardH(
CLHEP::HepLorentzVector const & p1out,
CLHEP::HepLorentzVector const & p1in,
ParticleID type2,
CLHEP::HepLorentzVector const & p2out,
CLHEP::HepLorentzVector const & p2in,
CLHEP::HepLorentzVector const & pH,
double t1, double t2
) const{
ignore(p2out, p2in);
const double shat = p1in.invariantMass2(p2in);
+ const double vev = param_.ew_parameters.vev();
// gluon case
#ifdef HEJ_BUILD_WITH_QCDLOOP
if(!param_.Higgs_coupling.use_impact_factors){
return K(type2, p2out, p2in)*C_A*1./(16*M_PI*M_PI)*t1/t2*ME_Houtside_gq(
p1out, p1in, p2out, p2in, pH,
param_.Higgs_coupling.mt, param_.Higgs_coupling.include_bottom,
- param_.Higgs_coupling.mb
+ param_.Higgs_coupling.mb, vev
)/(4*(N_C*N_C - 1));
}
#endif
return K_MRK(type2)/C_A*9./2.*shat*shat*(
- C2gHgp(p1in,p1out,pH) + C2gHgm(p1in,p1out,pH)
+ C2gHgp(p1in,p1out,pH,vev) + C2gHgm(p1in,p1out,pH,vev)
)/(t1*t2);
}
double MatrixElement::tree_kin_Higgs_first(Event const & ev) const {
auto const & incoming = ev.incoming();
auto const & outgoing = ev.outgoing();
assert(outgoing.front().type == pid::Higgs);
if(outgoing[1].type != pid::gluon) {
assert(incoming.front().type == outgoing[1].type);
return tree_kin_Higgs_between(ev);
}
const auto pH = to_HepLorentzVector(outgoing.front());
const auto partons = tag_extremal_jet_partons(
ev
);
const auto pa = to_HepLorentzVector(incoming[0]);
const auto pb = to_HepLorentzVector(incoming[1]);
const auto p1 = to_HepLorentzVector(partons.front());
const auto pn = to_HepLorentzVector(partons.back());
const auto q0 = pa - p1 - pH;
const double t1 = q0.m2();
const double t2 = (pn - pb).m2();
return MH2_forwardH(
p1, pa, incoming[1].type, pn, pb, pH,
t1, t2
)*FKL_ladder_weight(
begin(partons) + 1, end(partons) - 1,
q0, pa, pb, p1, pn,
param_.regulator_lambda
);
}
double MatrixElement::tree_kin_Higgs_last(Event const & ev) const {
auto const & incoming = ev.incoming();
auto const & outgoing = ev.outgoing();
assert(outgoing.back().type == pid::Higgs);
if(outgoing[outgoing.size()-2].type != pid::gluon) {
assert(incoming.back().type == outgoing[outgoing.size()-2].type);
return tree_kin_Higgs_between(ev);
}
const auto pH = to_HepLorentzVector(outgoing.back());
const auto partons = tag_extremal_jet_partons(
ev
);
const auto pa = to_HepLorentzVector(incoming[0]);
const auto pb = to_HepLorentzVector(incoming[1]);
auto p1 = to_HepLorentzVector(partons.front());
const auto pn = to_HepLorentzVector(partons.back());
auto q0 = pa - p1;
const double t1 = q0.m2();
const double t2 = (pn + pH - pb).m2();
return MH2_forwardH(
pn, pb, incoming[0].type, p1, pa, pH,
t2, t1
)*FKL_ladder_weight(
begin(partons) + 1, end(partons) - 1,
q0, pa, pb, p1, pn,
param_.regulator_lambda
);
}
namespace {
template<class InIter, class partIter>
double tree_kin_Higgs_uno(InIter BeginIn, InIter EndIn, partIter BeginPart,
partIter EndPart, const HLV & qH, const HLV & qHp1,
- double mt, bool inc_bot, double mb){
+ double mt, bool inc_bot, double mb, double vev){
const auto pa = to_HepLorentzVector(*BeginIn);
const auto pb = to_HepLorentzVector(*(EndIn-1));
const auto pg = to_HepLorentzVector(*BeginPart);
const auto p1 = to_HepLorentzVector(*(BeginPart+1));
const auto pn = to_HepLorentzVector(*(EndPart-1));
return ME_Higgs_current_uno(
(BeginIn)->type, (EndIn-1)->type, pg, pn, pb, p1, pa,
- qH, qHp1, mt, inc_bot, mb
+ qH, qHp1, mt, inc_bot, mb, vev
);
}
}
double MatrixElement::tree_kin_Higgs_between(Event const & ev) const {
using namespace event_type;
auto const & incoming = ev.incoming();
auto const & outgoing = ev.outgoing();
const auto the_Higgs = std::find_if(
begin(outgoing), end(outgoing),
[](Particle const & s){ return s.type == pid::Higgs; }
);
assert(the_Higgs != end(outgoing));
const auto pH = to_HepLorentzVector(*the_Higgs);
const auto partons = tag_extremal_jet_partons(ev);
const auto pa = to_HepLorentzVector(incoming[0]);
const auto pb = to_HepLorentzVector(incoming[1]);
auto p1 = to_HepLorentzVector(
partons[(ev.type() == unob)?1:0]
);
auto pn = to_HepLorentzVector(
partons[partons.size() - ((ev.type() == unof)?2:1)]
);
auto first_after_Higgs = begin(partons) + (the_Higgs-begin(outgoing));
assert(
(first_after_Higgs == end(partons) && (
(ev.type() == unob)
|| partons.back().type != pid::gluon
))
|| first_after_Higgs->rapidity() >= the_Higgs->rapidity()
);
assert(
(first_after_Higgs == begin(partons) && (
(ev.type() == unof)
|| partons.front().type != pid::gluon
))
|| (first_after_Higgs-1)->rapidity() <= the_Higgs->rapidity()
);
// always treat the Higgs as if it were in between the extremal FKL partons
if(first_after_Higgs == begin(partons)) ++first_after_Higgs;
else if(first_after_Higgs == end(partons)) --first_after_Higgs;
// t-channel momentum before Higgs
auto qH = pa;
for(auto parton_it = begin(partons); parton_it != first_after_Higgs; ++parton_it){
qH -= to_HepLorentzVector(*parton_it);
}
auto q0 = pa - p1;
auto begin_ladder = begin(partons) + 1;
auto end_ladder = end(partons) - 1;
double current_factor;
if(ev.type() == FKL){
current_factor = ME_Higgs_current(
incoming[0].type, incoming[1].type,
pn, pb, p1, pa, qH, qH - pH,
param_.Higgs_coupling.mt,
- param_.Higgs_coupling.include_bottom, param_.Higgs_coupling.mb
+ param_.Higgs_coupling.include_bottom, param_.Higgs_coupling.mb,
+ param_.ew_parameters.vev()
);
}
else if(ev.type() == unob){
current_factor = HEJ::C_A*HEJ::C_A/2*tree_kin_Higgs_uno(
begin(incoming), end(incoming), begin(partons),
end(partons), qH, qH-pH, param_.Higgs_coupling.mt,
- param_.Higgs_coupling.include_bottom, param_.Higgs_coupling.mb
+ param_.Higgs_coupling.include_bottom, param_.Higgs_coupling.mb,
+ param_.ew_parameters.vev()
);
const auto p_unob = to_HepLorentzVector(partons.front());
q0 -= p_unob;
p1 += p_unob;
++begin_ladder;
}
else if(ev.type() == unof){
current_factor = HEJ::C_A*HEJ::C_A/2*tree_kin_Higgs_uno(
rbegin(incoming), rend(incoming), rbegin(partons),
rend(partons), qH-pH, qH, param_.Higgs_coupling.mt,
- param_.Higgs_coupling.include_bottom, param_.Higgs_coupling.mb
+ param_.Higgs_coupling.include_bottom, param_.Higgs_coupling.mb,
+ param_.ew_parameters.vev()
);
pn += to_HepLorentzVector(partons.back());
--end_ladder;
}
else{
throw std::logic_error("Can only reweight FKL or uno processes in H+Jets");
}
const double ladder_factor = FKL_ladder_weight(
begin_ladder, first_after_Higgs,
q0, pa, pb, p1, pn,
param_.regulator_lambda
)*FKL_ladder_weight(
first_after_Higgs, end_ladder,
qH - pH, pa, pb, p1, pn,
param_.regulator_lambda
);
return current_factor*C_A*C_A/(N_C*N_C-1.)*ladder_factor;
}
namespace {
- double get_AWZH_coupling(Event const & ev, double alpha_s) {
+ double get_AWZH_coupling(Event const & ev, double alpha_s, double alpha_w) {
const auto AWZH_boson = std::find_if(
begin(ev.outgoing()), end(ev.outgoing()),
[](auto const & p){return is_AWZH_boson(p);}
);
if(AWZH_boson == end(ev.outgoing())) return 1.;
switch(AWZH_boson->type){
case pid::Higgs:
return alpha_s*alpha_s;
case pid::Wp:
case pid::Wm:
- return gw*gw*gw*gw/4.;
+ return alpha_w*alpha_w;
// TODO
case pid::photon:
case pid::Z:
default:
throw not_implemented("Emission of boson of unsupported type");
}
}
}
double MatrixElement::tree_param(Event const & ev, double mur) const {
assert(is_resummable(ev.type()));
const auto begin_partons = ev.begin_partons();
const auto end_partons = ev.end_partons();
const auto num_partons = std::distance(begin_partons, end_partons);
const double alpha_s = alpha_s_(mur);
const double gs2 = 4.*M_PI*alpha_s;
double res = std::pow(gs2, num_partons);
if(param_.log_correction){
// use alpha_s(q_perp), evolved to mur
assert(num_partons >= 2);
const auto first_emission = std::next(begin_partons);
const auto last_emission = std::prev(end_partons);
for(auto parton = first_emission; parton != last_emission; ++parton){
res *= 1. + alpha_s/(2.*M_PI)*beta0*log(mur/parton->perp());
}
}
- return get_AWZH_coupling(ev, alpha_s)*res;
+ return get_AWZH_coupling(ev, alpha_s, param_.ew_parameters.alpha_w())*res;
}
} // namespace HEJ
diff --git a/src/Wjets.cc b/src/Wjets.cc
index ce810f8..5490f4d 100644
--- a/src/Wjets.cc
+++ b/src/Wjets.cc
@@ -1,1087 +1,1136 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
-#include "HEJ/jets.hh"
#include "HEJ/Wjets.hh"
-#include "HEJ/Tensor.hh"
-#include "HEJ/Constants.hh"
#include <array>
-
#include <iostream>
+#include "HEJ/Constants.hh"
+#include "HEJ/EWConstants.hh"
+#include "HEJ/jets.hh"
+#include "HEJ/Tensor.hh"
+
using HEJ::Tensor;
using HEJ::init_sigma_index;
using HEJ::metric;
using HEJ::rank3_current;
using HEJ::rank5_current;
using HEJ::eps;
using HEJ::to_tensor;
using HEJ::Helicity;
using HEJ::angle;
using HEJ::square;
using HEJ::flip;
+using HEJ::ParticleProperties;
namespace helicity = HEJ::helicity;
namespace { // Helper Functions
// FKL W Helper Functions
- double WProp (const HLV & plbar, const HLV & pl){
- COM propW = COM(0.,-1.)/( (pl+plbar).m2() - HEJ::MW*HEJ::MW + COM(0.,1.)*HEJ::MW*HEJ::GammaW);
+ double WProp (const HLV & plbar, const HLV & pl, ParticleProperties const & wprop){
+ COM propW = COM(0.,-1.)/( (pl+plbar).m2() - wprop.mass*wprop.mass
+ + COM(0.,1.)*wprop.mass*wprop.width);
double PropFactor=(propW*conj(propW)).real();
return PropFactor;
}
namespace {
// FKL current including W emission off negative helicities
// See eq. (87) {eq:jW-} in developer manual
// Note that the terms are rearranged
Tensor<1> jW_minus(
HLV const & pa, HLV const & p1,
HLV const & plbar, HLV const & pl
){
using HEJ::helicity::minus;
const double tWin = (pa-pl-plbar).m2();
const double tWout = (p1+pl+plbar).m2();
// C++ arithmetic operators are evaluated left-to-right,
// so the following first computes complex scalar coefficients,
// which then multiply a current, reducing the number
// of multiplications
return 2.*(
+ angle(p1, pl)*square(p1, plbar)/tWout
+ square(pa, plbar)*angle(pa, pl)/tWin
)*HEJ::current(p1, pa, helicity::minus)
+ 2.*angle(p1, pl)*square(pl, plbar)/tWout
*HEJ::current(pl, pa, helicity::minus)
+ 2.*square(pa, plbar)*angle(pl, plbar)/tWin
*HEJ::current(p1, plbar, helicity::minus);
}
}
// FKL current including W emission
// see eqs. (87), (88) {eq:jW-}, {eq:jW+} in developer manual
Tensor<1> jW(
HLV const & pa, HLV const & p1,
HLV const & plbar, HLV const & pl,
Helicity h
){
if(h == helicity::minus) {
return jW_minus(pa, p1, plbar, pl);
}
return jW_minus(pa, p1, pl, plbar).complex_conj();
}
/**
* @brief W+Jets Unordered Contribution Helper Functions
* @returns result of equation (4.1.28) in Helen's Thesis (p.100)
*/
double jM2Wuno(HLV pg, HLV p1,HLV plbar, HLV pl, HLV pa, Helicity h1,
- HLV p2, HLV pb, Helicity h2, Helicity pol
- ){
+ HLV p2, HLV pb, Helicity h2, Helicity pol,
+ ParticleProperties const & wprop
+ ){
//@TODO Simplify the below (less Tensor class?)
init_sigma_index();
HLV pW = pl+plbar;
HLV q1g=pa-pW-p1-pg;
HLV q1 = pa-p1-pW;
HLV q2 = p2-pb;
const double taW = (pa-pW).m2();
const double taW1 = (pa-pW-p1).m2();
const double tb2 = (pb-p2).m2();
const double tb2g = (pb-p2-pg).m2();
const double s1W = (p1+pW).m2();
const double s1gW = (p1+pW+pg).m2();
const double s1g = (p1+pg).m2();
const double tag = (pa-pg).m2();
const double taWg = (pa-pW-pg).m2();
//use p1 as ref vec in pol tensor
Tensor<1> epsg = eps(pg,p2,pol);
Tensor<1> epsW = HEJ::current(pl,plbar,helicity::minus);
Tensor<1> j2b = HEJ::current(p2,pb,h2);
Tensor<1> Tq1q2 = to_tensor((q1+q2)/taW1 + (pb/pb.dot(pg)
+p2/p2.dot(pg)) * tb2/(2*tb2g));
Tensor<3> J31a = rank3_current(p1, pa, h1);
Tensor<2> J2_qaW =J31a.contract((pa-pW)/taW, 2);
Tensor<2> J2_p1W =J31a.contract((p1+pW)/s1W, 2);
Tensor<3> L1a = outer(Tq1q2, J2_qaW);
Tensor<3> L1b = outer(Tq1q2, J2_p1W);
Tensor<3> L2a = outer(-pg-q1,J2_qaW)/taW1;
Tensor<3> L2b = outer(-pg-q1, J2_p1W)/taW1;
Tensor<3> L3 = outer(metric(), J2_qaW.contract(pg-q2,1)+J2_p1W.contract(pg-q2,2))/taW1;
Tensor<3> L(0.);
Tensor<5> J51a = rank5_current(p1, pa, h1);
Tensor<4> J_qaW = J51a.contract((pa-pW),4);
Tensor<4> J_qag = J51a.contract(pa-pg,4);
Tensor<4> J_p1gW = J51a.contract(p1+pg+pW,4);
Tensor<3> U1a = J_qaW.contract(p1+pg,2);
Tensor<3> U1b = J_p1gW.contract(p1+pg,2);
Tensor<3> U1c = J_p1gW.contract(p1+pW,2);
Tensor<3> U1(0.);
Tensor<3> U2a = J_qaW.contract(pa-pg-pW,2);
Tensor<3> U2b = J_qag.contract(pa-pg-pW,2);
Tensor<3> U2c = J_qag.contract(p1+pW,2);
Tensor<3> U2(0.);
for(int nu=0; nu<4;nu++){
for(int mu=0;mu<4;mu++){
for(int rho=0;rho<4;rho++){
L(nu, mu, rho) = L1a(nu,mu,rho) + L1b(nu,rho,mu)
+ L2a(mu,nu,rho) + L2b(mu,rho,nu) + L3(mu,nu,rho);
U1(nu, mu, rho) = U1a(nu, mu, rho) / (s1g*taW)
+ U1b(nu,rho,mu) / (s1g*s1gW) + U1c(rho,nu,mu) / (s1W*s1gW);
U2(nu,mu,rho) = U2a(mu,nu,rho) / (taWg*taW)
+ U2b(mu,rho,nu) / (taWg*tag) + U2c(rho,mu,nu) / (s1W*tag);
}
}
}
COM X = ((((U1-L).contract(epsW,3)).contract(j2b,2)).contract(epsg,1));
COM Y = ((((U2+L).contract(epsW,3)).contract(j2b,2)).contract(epsg,1));
double amp = HEJ::C_A*HEJ::C_F*HEJ::C_F/2.*(norm(X)+norm(Y)) - HEJ::C_F/2.*(X*conj(Y)).real();
double t1 = q1g.m2();
double t2 = q2.m2();
- double WPropfact = WProp(plbar, pl);
-
//Divide by WProp
- amp*=WPropfact;
+ amp*=WProp(plbar, pl, wprop);
//Divide by t-channels
amp/=(t1*t2);
return amp;
}
// Relevant Wqqx Helper Functions.
//g->qxqlxl (Calculates gluon to qqx Current. See JV_\mu in WSubleading Notes)
Tensor <1> gtqqxW(HLV pq,HLV pqbar,HLV pl,HLV plbar){
//@TODO Simplify the calculation below (Less Tensor class use?)
double s2AB=(pl+plbar+pq).m2();
double s3AB=(pl+plbar+pqbar).m2();
// Define llx current.
Tensor<1> ABCur = HEJ::current(pl, plbar, helicity::minus);
//blank 3 Gamma Current
Tensor<3> JV23 = rank3_current(pq,pqbar,helicity::minus);
// Components of g->qqW before W Contraction
Tensor<2> JV1 = JV23.contract((pq + pl + plbar),2)/(s2AB);
Tensor<2> JV2 = JV23.contract((pqbar + pl + plbar),2)/(s3AB);
// g->qqW Current. Note Minus between terms due to momentum flow.
// Also note: (-I)^2 from W vert. (I) from Quark prop.
Tensor<1> JVCur = (JV1.contract(ABCur,1) - JV2.contract(ABCur,2))*COM(0.,-1.);
return JVCur;
}
// Helper Functions Calculate the Crossed Contribution
Tensor <2> MCrossW(HLV pa, HLV, HLV, HLV, HLV pq, HLV pqbar, HLV pl,
HLV plbar, std::vector<HLV> partons, int nabove
){
//@TODO Simplify the calculation below Maybe combine with MCross?
// Useful propagator factors
double s2AB=(pl+plbar+pq).m2();
double s3AB=(pl+plbar+pqbar).m2();
HLV q1, q3;
q1=pa;
for(int i=0; i<nabove+1;i++){
q1=q1-partons.at(i);
}
q3 = q1 - pq - pqbar - pl - plbar;
double tcro1=(q3+pq).m2();
double tcro2=(q1-pqbar).m2();
// Define llx current.
Tensor<1> ABCur = HEJ::current(pl, plbar,helicity::minus);
//Blank 5 gamma Current
Tensor<5> J523 = rank5_current(pq,pqbar,helicity::minus);
// 4 gamma currents (with 1 contraction already).
Tensor<4> J_q3q = J523.contract((q3 + pq),2);
Tensor<4> J_2AB = J523.contract((pq + pl + plbar),2);
// Components of Crossed Vertex Contribution
Tensor<3> Xcro1 = J_q3q.contract((pqbar + pl + plbar),3);
Tensor<3> Xcro2 = J_q3q.contract((q1 - pqbar),3);
Tensor<3> Xcro3 = J_2AB.contract((q1 - pqbar),3);
// Term Denominators Taken Care of at this stage
Tensor<2> Xcro1Cont = Xcro1.contract(ABCur,3)/(tcro1*s3AB);
Tensor<2> Xcro2Cont = Xcro2.contract(ABCur,2)/(tcro1*tcro2);
Tensor<2> Xcro3Cont = Xcro3.contract(ABCur,1)/(s2AB*tcro2);
//Initialise the Crossed Vertex Object
Tensor<2> Xcro(0.);
for(int mu=0; mu<4;mu++){
for(int nu=0;nu<4;nu++){
Xcro(mu,nu) = -(-Xcro1Cont(nu,mu)+Xcro2Cont(nu,mu)+Xcro3Cont(nu,mu));
}
}
return Xcro;
}
// Helper Functions Calculate the Uncrossed Contribution
Tensor <2> MUncrossW(HLV pa, HLV, HLV, HLV, HLV pq, HLV pqbar,
HLV pl, HLV plbar, std::vector<HLV> partons, int nabove
){
//@TODO Simplify the calculation below Maybe combine with MUncross?
double s2AB=(pl+plbar+pq).m2();
double s3AB=(pl+plbar+pqbar).m2();
HLV q1, q3;
q1=pa;
for(int i=0; i<nabove+1;i++){
q1=q1-partons.at(i);
}
q3 = q1 - pl - plbar - pq - pqbar;
double tunc1 = (q1-pq).m2();
double tunc2 = (q3+pqbar).m2();
// Define llx current.
Tensor<1> ABCur = HEJ::current(pl, plbar, helicity::minus);
//Blank 5 gamma Current
Tensor<5> J523 = rank5_current(pq,pqbar,helicity::minus);
// 4 gamma currents (with 1 contraction already).
Tensor<4> J_2AB = J523.contract((pq + pl + plbar),2);
Tensor<4> J_q1q = J523.contract((q1 - pq),2);
// 2 Contractions taken care of.
Tensor<3> Xunc1 = J_2AB.contract((q3 + pqbar),3);
Tensor<3> Xunc2 = J_q1q.contract((q3 + pqbar),3);
Tensor<3> Xunc3 = J_q1q.contract((pqbar + pl + plbar),3);
// Term Denominators Taken Care of at this stage
Tensor<2> Xunc1Cont = Xunc1.contract(ABCur,1)/(s2AB*tunc2);
Tensor<2> Xunc2Cont = Xunc2.contract(ABCur,2)/(tunc1*tunc2);
Tensor<2> Xunc3Cont = Xunc3.contract(ABCur,3)/(tunc1*s3AB);
//Initialise the Uncrossed Vertex Object
Tensor<2> Xunc(0.);
for(int mu=0; mu<4;mu++){
for(int nu=0;nu<4;nu++){
Xunc(mu,nu) = -(- Xunc1Cont(mu,nu)+Xunc2Cont(mu,nu) +Xunc3Cont(mu,nu));
}
}
return Xunc;
}
// Helper Functions Calculate the g->qqxW (Eikonal) Contributions
Tensor <2> MSymW(HLV pa, HLV p1, HLV pb, HLV p4, HLV pq, HLV pqbar,
HLV pl,HLV plbar, std::vector<HLV> partons, int nabove
){
//@TODO Simplify the calculation below Maybe combine with MSym?
double sa2=(pa+pq).m2();
double s12=(p1+pq).m2();
double sa3=(pa+pqbar).m2();
double s13=(p1+pqbar).m2();
double saA=(pa+pl).m2();
double s1A=(p1+pl).m2();
double saB=(pa+plbar).m2();
double s1B=(p1+plbar).m2();
double sb2=(pb+pq).m2();
double s42=(p4+pq).m2();
double sb3=(pb+pqbar).m2();
double s43=(p4+pqbar).m2();
double sbA=(pb+pl).m2();
double s4A=(p4+pl).m2();
double sbB=(pb+plbar).m2();
double s4B=(p4+plbar).m2();
double s23AB=(pl+plbar+pq+pqbar).m2();
HLV q1,q3;
q1=pa;
for(int i=0;i<nabove+1;i++){
q1-=partons.at(i);
}
q3=q1-pq-pqbar-plbar-pl;
double t1 = (q1).m2();
double t3 = (q3).m2();
// g->qqW Current (Factors of sqrt2 dealt with in this function.)
Tensor<1> JV = gtqqxW(pq,pqbar,pl,plbar);
// 1a gluon emisson Contribution
Tensor<3> X1a = outer(metric(), p1*(t1/(s12+s13+s1A+s1B))
+ pa*(t1/(sa2+sa3+saA+saB)) );
Tensor<2> X1aCont = X1a.contract(JV,3);
//4b gluon emission Contribution
Tensor<3> X4b = outer(metric(), p4*(t3/(s42+s43+s4A+s4B))
+ pb*(t3/(sb2+sb3+sbA+sbB)) );
Tensor<2> X4bCont = X4b.contract(JV,3);
//Set up each term of 3G diagram.
Tensor<3> X3g1 = outer(q1+pq+pqbar+pl+plbar, metric());
Tensor<3> X3g2 = outer(q3-pq-pqbar-pl-plbar, metric());
Tensor<3> X3g3 = outer(q1+q3, metric());
// Note the contraction of indices changes term by term
Tensor<2> X3g1Cont = X3g1.contract(JV,3);
Tensor<2> X3g2Cont = X3g2.contract(JV,2);
Tensor<2> X3g3Cont = X3g3.contract(JV,1);
// XSym is an amalgamation of x1a, X4b and X3g.
// Makes sense from a colour factor point of view.
Tensor<2>Xsym(0.);
for(int mu=0; mu<4;mu++){
for(int nu=0;nu<4;nu++){
Xsym(mu,nu) = (X3g1Cont(nu,mu) + X3g2Cont(mu,nu) - X3g3Cont(nu,mu))
+ (X1aCont(mu,nu) - X4bCont(mu,nu));
}
}
return Xsym/s23AB;
}
Tensor <2> MCross(HLV pa, HLV pq, HLV pqbar, std::vector<HLV> partons,
Helicity hq, int nabove
){
//@TODO Simplify the calculation below Maybe combine with MCrossW?
HLV q1;
q1=pa;
for(int i=0;i<nabove+1;i++){
q1-=partons.at(i);
}
double t2=(q1-pqbar).m2();
//Blank 3 gamma Current
Tensor<3> J323 = rank3_current(pq,pqbar,hq);
// 2 gamma current (with 1 contraction already).
Tensor<2> XCroCont = J323.contract((q1-pqbar),2)/(t2);
//Initialise the Crossed Vertex
Tensor<2> Xcro(0.);
for(int mu=0; mu<4;mu++){
for(int nu=0;nu<4;nu++){
Xcro(mu,nu) = XCroCont(nu,mu);
}
}
return Xcro;
}
// Helper Functions Calculate the Uncrossed Contribution
Tensor <2> MUncross(HLV pa, HLV pq,HLV pqbar, std::vector<HLV> partons,
Helicity hq, int nabove
){
//@TODO Simplify the calculation below Maybe combine with MUncrossW?
HLV q1;
q1=pa;
for(int i=0;i<nabove+1;i++){
q1-=partons.at(i);
}
double t2 = (q1-pq).m2();
//Blank 3 gamma Current
Tensor<3> J323 = rank3_current(pq,pqbar,hq);
// 2 gamma currents (with 1 contraction already).
Tensor<2> XUncCont = J323.contract((q1-pq),2)/t2;
//Initialise the Uncrossed Vertex
Tensor<2> Xunc(0.);
for(int mu=0; mu<4;mu++){
for(int nu=0;nu<4;nu++){
Xunc(mu,nu) = -XUncCont(mu,nu);
}
}
return Xunc;
}
// Helper Functions Calculate the Eikonal Contributions
Tensor <2> MSym(HLV pa, HLV p1, HLV pb, HLV p4, HLV pq, HLV pqbar,
std::vector<HLV> partons, Helicity hq, int nabove
){
//@TODO Simplify the calculation below Maybe combine with MsymW?
HLV q1, q3;
q1=pa;
for(int i=0;i<nabove+1;i++){
q1-=partons.at(i);
}
q3 = q1-pq-pqbar;
double t1 = (q1).m2();
double t3 = (q3).m2();
double s23 = (pq+pqbar).m2();
double sa2 = (pa+pq).m2();
double sa3 = (pa+pqbar).m2();
double s12 = (p1+pq).m2();
double s13 = (p1+pqbar).m2();
double sb2 = (pb+pq).m2();
double sb3 = (pb+pqbar).m2();
double s42 = (p4+pq).m2();
double s43 = (p4+pqbar).m2();
Tensor<1> qqxCur = HEJ::current(pq, pqbar, hq);
// // 1a gluon emisson Contribution
Tensor<3> X1a = outer(metric(), p1*(t1/(s12+s13))+ pa*(t1/(sa2+sa3)));
Tensor<2> X1aCont = X1a.contract(qqxCur,3);
// //4b gluon emission Contribution
Tensor<3> X4b = outer(metric(), p4*(t3/(s42+s43)) + pb*(t3/(sb2+sb3)));
Tensor<2> X4bCont = X4b.contract(qqxCur,3);
// New Formulation Corresponding to New Analytics
Tensor<3> X3g1 = outer(q1+pq+pqbar, metric());
Tensor<3> X3g2 = outer(q3-pq-pqbar, metric());
Tensor<3> X3g3 = outer(q1+q3, metric());
// Note the contraction of indices changes term by term
Tensor<2> X3g1Cont = X3g1.contract(qqxCur,3);
Tensor<2> X3g2Cont = X3g2.contract(qqxCur,2);
Tensor<2> X3g3Cont = X3g3.contract(qqxCur,1);
Tensor<2>Xsym(0.);
for(int mu=0; mu<4;mu++){
for(int nu=0;nu<4;nu++){
Xsym(mu, nu) = COM(0,1) * ( (X3g1Cont(nu,mu) + X3g2Cont(mu,nu)
- X3g3Cont(nu,mu)) + (X1aCont(mu,nu) - X4bCont(mu,nu)) );
}
}
return Xsym/s23;
}
//! W+Jets FKL Contributions
/**
* @brief W+Jets FKL Contributions, function to handle all incoming types.
* @param p1out Outgoing Particle 1. (W emission)
* @param plbar Outgoing election momenta
* @param pl Outgoing neutrino momenta
* @param p1in Incoming Particle 1. (W emission)
* @param p2out Outgoing Particle 2
* @param p2in Incoming Particle 2
* @param aqlineb Bool. Is Backwards quark line an anti-quark line?
* @param aqlinef Bool. Is Forwards quark line an anti-quark line?
*
* Calculates j_W ^\mu j_\mu.
* Handles all possible incoming states.
*/
double jW_j( HLV p1out, HLV plbar, HLV pl, HLV p1in, HLV p2out, HLV p2in,
- bool aqlineb, bool /* aqlinef */
+ bool aqlineb, bool /* aqlinef */,
+ ParticleProperties const & wprop
){
using helicity::minus;
using helicity::plus;
const HLV q1=p1in-p1out-plbar-pl;
const HLV q2=-(p2in-p2out);
- const double WPropfact = WProp(plbar, pl);
+ const double WPropfact = WProp(plbar, pl, wprop);
const auto j_W = COM{0,-1}*jW(p1in, p1out, plbar, pl, aqlineb?plus:minus);
double Msqr = 0.;
for(const auto h: {plus, minus}) {
const auto j = HEJ::current(p2out, p2in, h);
Msqr += abs2(j_W.contract(j, 1));
}
// Division by colour and Helicity average (Nc2-1)(4)
// Multiply by Cf^2
return HEJ::C_F*HEJ::C_F*WPropfact*Msqr/(q1.m2()*q2.m2()*(HEJ::N_C*HEJ::N_C - 1)*4);
}
} // Anonymous Namespace
-double ME_W_qQ (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in){
- return jW_j(p1out, plbar, pl, p1in, p2out, p2in, false, false);
+double ME_W_qQ (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jW_j(p1out, plbar, pl, p1in, p2out, p2in, false, false, wprop);
}
-double ME_W_qQbar (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in){
- return jW_j(p1out, plbar, pl, p1in, p2out, p2in, false, true);
+double ME_W_qQbar (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jW_j(p1out, plbar, pl, p1in, p2out, p2in, false, true, wprop);
}
-double ME_W_qbarQ (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in){
- return jW_j(p1out, plbar, pl, p1in, p2out, p2in, true, false);
+double ME_W_qbarQ (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jW_j(p1out, plbar, pl, p1in, p2out, p2in, true, false, wprop);
}
-double ME_W_qbarQbar (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in){
- return jW_j(p1out, plbar, pl, p1in, p2out, p2in, true, true);
+double ME_W_qbarQbar (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jW_j(p1out, plbar, pl, p1in, p2out, p2in, true, true, wprop);
}
-double ME_W_qg (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in){
- return jW_j(p1out, plbar, pl, p1in, p2out, p2in, false, false)*K_g(p2out, p2in)/HEJ::C_F;
+double ME_W_qg (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jW_j(p1out, plbar, pl, p1in, p2out, p2in, false, false, wprop)
+ *K_g(p2out, p2in)/HEJ::C_F;
}
-double ME_W_qbarg (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in){
- return jW_j(p1out, plbar, pl, p1in, p2out, p2in, true, false)*K_g(p2out, p2in)/HEJ::C_F;
+double ME_W_qbarg (HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jW_j(p1out, plbar, pl, p1in, p2out, p2in, true, false, wprop)
+ *K_g(p2out, p2in)/HEJ::C_F;
}
namespace{
/**
* @brief W+Jets Unordered Contributions, function to handle all incoming types.
* @param p1out Outgoing Particle 1. (W emission)
* @param plbar Outgoing election momenta
* @param pl Outgoing neutrino momenta
* @param p1in Incoming Particle 1. (W emission)
* @param p2out Outgoing Particle 2 (Quark, unordered emission this side.)
* @param p2in Incoming Particle 2 (Quark, unordered emission this side.)
* @param pg Unordered Gluon momenta
* @param aqlineb Bool. Is Backwards quark line an anti-quark line?
* @param aqlinef Bool. Is Forwards quark line an anti-quark line?
*
* Calculates j_W ^\mu j_{uno}_\mu. Ie, unordered with W emission opposite side.
* Handles all possible incoming states.
*/
double jW_juno(HLV p1out, HLV plbar, HLV pl,HLV p1in, HLV p2out,
- HLV p2in, HLV pg, bool aqlineb, bool aqlinef){
+ HLV p2in, HLV pg, bool aqlineb, bool aqlinef,
+ ParticleProperties const & wprop
+ ){
using helicity::minus;
using helicity::plus;
const HLV q1=p1in-p1out-plbar-pl;
const HLV q2=-(p2in-p2out-pg);
const HLV q3=-(p2in-p2out);
const Helicity fhel = aqlinef?plus:minus;
const auto j_W = jW(p1in, p1out, plbar, pl, aqlineb?plus:minus);
const auto mj2p = HEJ::current(p2out, p2in, flip(fhel));
const auto mj2m = HEJ::current(p2out, p2in, fhel);
const auto jgbp = HEJ::current(pg, p2in, flip(fhel));
const auto jgbm = HEJ::current(pg, p2in, fhel);
const auto j2gp = HEJ::current(p2out, pg, flip(fhel));
const auto j2gm = HEJ::current(p2out, pg, fhel);
// Dot products of these which occur again and again
COM MWmp=j_W.dot(mj2p); // And now for the Higgs ones
COM MWmm=j_W.dot(mj2m);
const auto qsum = to_tensor(q2+q3);
const auto p1o = to_tensor(p1out);
const auto p1i = to_tensor(p1in);
const auto p2o = to_tensor(p2out);
const auto p2i = to_tensor(p2in);
const auto Lmm=( (-1.)*qsum*(MWmm) + (-2.*COM{j_W.dot(pg)})*mj2m + 2.*COM{mj2m.dot(pg)}*j_W
+ ( p1o/pg.dot(p1out) + p1i/pg.dot(p1in) )*( q2.m2()*MWmm/2. ) )/q3.m2();
const auto Lmp=( (-1.)*qsum*(MWmp) + (-2.*COM{j_W.dot(pg)})*mj2p + 2.*COM{mj2p.dot(pg)}*j_W
+ ( p1o/pg.dot(p1out) + p1i/pg.dot(p1in) )*( q2.m2()*MWmp/2. ) )/q3.m2();
const auto U1mm=(COM{jgbm.dot(j_W)}*j2gm+2.*p2o*MWmm)/(p2out+pg).m2();
const auto U1mp=(COM{jgbp.dot(j_W)}*j2gp+2.*p2o*MWmp)/(p2out+pg).m2();
const auto U2mm=((-1.)*COM{j2gm.dot(j_W)}*jgbm+2.*p2i*MWmm)/(p2in-pg).m2();
const auto U2mp=((-1.)*COM{j2gp.dot(j_W)}*jgbp+2.*p2i*MWmp)/(p2in-pg).m2();
double amm,amp;
amm=HEJ::C_F*(2.*vre(Lmm-U1mm,Lmm+U2mm))+2.*HEJ::C_F*HEJ::C_F/3.*abs2(U1mm+U2mm);
amp=HEJ::C_F*(2.*vre(Lmp-U1mp,Lmp+U2mp))+2.*HEJ::C_F*HEJ::C_F/3.*abs2(U1mp+U2mp);
double ampsq=-(amm+amp);
//Divide by WProp
- ampsq*=WProp(plbar, pl);
+ ampsq*=WProp(plbar, pl, wprop);
return ampsq/((16)*(q2.m2()*q1.m2()));
}
}
double ME_W_unob_qQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, false, false);
+ return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, false, false, wprop);
}
double ME_W_unob_qQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, false, true);
+ return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, false, true, wprop);
}
double ME_W_unob_qbarQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, true, false);
+ return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, true, false, wprop);
}
double ME_W_unob_qbarQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, true, true);
+ return jW_juno(p2out, plbar, pl, p2in, p1out, p1in, pg, true, true, wprop);
}
namespace{
/**
* @brief W+Jets Unordered Contributions, function to handle all incoming types.
* @param pg Unordered Gluon momenta
* @param p1out Outgoing Particle 1. (Quark - W and Uno emission)
* @param plbar Outgoing election momenta
* @param pl Outgoing neutrino momenta
* @param p1in Incoming Particle 1. (Quark - W and Uno emission)
* @param p2out Outgoing Particle 2
* @param p2in Incoming Particle 2
* @param aqlineb Bool. Is Backwards quark line an anti-quark line?
*
* Calculates j_W_{uno} ^\mu j_\mu. Ie, unordered with W emission same side.
* Handles all possible incoming states. Note this handles both forward and back-
* -ward Wuno emission. For forward, ensure p1out is the uno and W emission parton.
* @TODO: Include separate wrapper functions for forward and backward to clean up
* ME_W_unof_current in `MatrixElement.cc`.
*/
double jWuno_j(HLV pg, HLV p1out, HLV plbar, HLV pl, HLV p1in,
- HLV p2out, HLV p2in, bool aqlineb
+ HLV p2out, HLV p2in, bool aqlineb,
+ ParticleProperties const & wprop
){
//Calculate different Helicity choices
const Helicity h = aqlineb?helicity::plus:helicity::minus;
- double ME2mpp = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,helicity::plus,helicity::plus);
- double ME2mpm = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,helicity::plus,helicity::minus);
- double ME2mmp = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,helicity::minus,helicity::plus);
- double ME2mmm = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,helicity::minus,helicity::minus);
+ double ME2mpp = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,
+ helicity::plus,helicity::plus, wprop);
+ double ME2mpm = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,
+ helicity::plus,helicity::minus, wprop);
+ double ME2mmp = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,
+ helicity::minus,helicity::plus, wprop);
+ double ME2mmm = jM2Wuno(pg, p1out,plbar,pl,p1in,h,p2out,p2in,
+ helicity::minus,helicity::minus, wprop);
//Helicity sum and average over initial states
return (ME2mpp + ME2mpm + ME2mmp + ME2mmm)/(4.*HEJ::C_A*HEJ::C_A);
}
}
double ME_Wuno_qQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl, ParticleProperties const & wprop
){
- return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, false);
+ return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, false, wprop);
}
double ME_Wuno_qQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, false);
+ return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, false, wprop);
}
double ME_Wuno_qbarQ(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, true);
+ return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, true, wprop);
}
double ME_Wuno_qbarQbar(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, true);
+ return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, true, wprop);
}
double ME_Wuno_qg(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl, ParticleProperties const & wprop
){
- return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, false)*K_g(p2out, p2in)/HEJ::C_F;
+ return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, false, wprop)
+ *K_g(p2out, p2in)/HEJ::C_F;
}
double ME_Wuno_qbarg(HLV p1out, HLV p1in, HLV p2out, HLV p2in,
- HLV pg, HLV plbar, HLV pl
+ HLV pg, HLV plbar, HLV pl,
+ ParticleProperties const & wprop
){
- return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, true)*K_g(p2out, p2in)/HEJ::C_F;
+ return jWuno_j(pg, p1out, plbar, pl, p1in, p2out, p2in, true, wprop)
+ *K_g(p2out, p2in)/HEJ::C_F;
}
/**
* @brief W+Jets Extremal qqx Contributions, function to handle all incoming types.
* @param pgin Incoming gluon which will split into qqx.
* @param pqout Quark of extremal qqx outgoing (W-Emission).
* @param plbar Outgoing anti-lepton momenta
* @param pl Outgoing lepton momenta
* @param pqbarout Anti-quark of extremal qqx pair. (W-Emission)
* @param pout Outgoing Particle 2 (end of FKL chain)
* @param p2in Incoming Particle 2
* @param aqlinef Bool. Is Forwards quark line an anti-quark line?
*
* Calculates j_W_{qqx} ^\mu j_\mu. Ie, Ex-QQX with W emission same side.
* Handles all possible incoming states. Calculated via crossing symmetry from jWuno_j.
*/
double jWqqx_j(HLV pgin, HLV pqout, HLV plbar, HLV pl,
- HLV pqbarout, HLV p2out, HLV p2in, bool aqlinef){
+ HLV pqbarout, HLV p2out, HLV p2in, bool aqlinef,
+ ParticleProperties const & wprop
+){
//Calculate Different Helicity Configurations.
const Helicity h = aqlinef?helicity::plus:helicity::minus;
- double ME2mpp = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,helicity::plus,helicity::plus);
- double ME2mpm = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,helicity::plus,helicity::minus);
- double ME2mmp = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,helicity::minus,helicity::plus);
- double ME2mmm = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,helicity::minus,helicity::minus);
+ double ME2mpp = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,
+ helicity::plus,helicity::plus, wprop);
+ double ME2mpm = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,
+ helicity::plus,helicity::minus, wprop);
+ double ME2mmp = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,
+ helicity::minus,helicity::plus, wprop);
+ double ME2mmm = jM2Wuno(-pgin, pqout,plbar,pl,-pqbarout,h,p2out,p2in,
+ helicity::minus,helicity::minus, wprop);
//Helicity sum and average over initial states.
double ME2 = (ME2mpp + ME2mpm + ME2mmp + ME2mmm)/(4.*HEJ::C_A*HEJ::C_A);
//Correct colour averaging after crossing:
ME2*=(3.0/8.0);
return ME2;
}
double ME_WExqqx_qbarqQ(HLV pgin, HLV pqout, HLV plbar, HLV pl,
- HLV pqbarout, HLV p2out, HLV p2in){
- return jWqqx_j(pgin, pqout, plbar, pl, pqbarout, p2out, p2in, false);
+ HLV pqbarout, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jWqqx_j(pgin, pqout, plbar, pl, pqbarout, p2out, p2in, false, wprop);
}
double ME_WExqqx_qqbarQ(HLV pgin, HLV pqbarout, HLV plbar, HLV pl,
- HLV pqout, HLV p2out, HLV p2in){
- return jWqqx_j(pgin, pqbarout, plbar, pl, pqout, p2out, p2in, true);
+ HLV pqout, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jWqqx_j(pgin, pqbarout, plbar, pl, pqout, p2out, p2in, true, wprop);
}
double ME_WExqqx_qbarqg(HLV pgin, HLV pqout, HLV plbar, HLV pl,
- HLV pqbarout, HLV p2out, HLV p2in){
- return jWqqx_j(pgin, pqout, plbar, pl, pqbarout, p2out, p2in, false)*K_g(p2out,p2in)/HEJ::C_F;
+ HLV pqbarout, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jWqqx_j(pgin, pqout, plbar, pl, pqbarout, p2out, p2in, false, wprop)
+ *K_g(p2out,p2in)/HEJ::C_F;
}
double ME_WExqqx_qqbarg(HLV pgin, HLV pqbarout, HLV plbar, HLV pl,
- HLV pqout, HLV p2out, HLV p2in){
- return jWqqx_j(pgin, pqbarout, plbar, pl, pqout, p2out, p2in, true)*K_g(p2out,p2in)/HEJ::C_F;
+ HLV pqout, HLV p2out, HLV p2in,
+ ParticleProperties const & wprop
+){
+ return jWqqx_j(pgin, pqbarout, plbar, pl, pqout, p2out, p2in, true, wprop)
+ *K_g(p2out,p2in)/HEJ::C_F;
}
namespace {
//Function to calculate Term 1 in Equation 3.23 in James Cockburn's Thesis.
Tensor<1> qggm1(HLV pb, HLV p2, HLV p3, Helicity hel2, Helicity helg, HLV refmom){
//@TODO Simplify the calculation below. (Less Tensor class use?)
double t1 = (p3-pb)*(p3-pb);
// Gauge choice in polarisation tensor. (see JC's Thesis)
Tensor<1> epsg = eps(pb, refmom, helg);
Tensor<3> qqCurBlank = rank3_current(p2,p3,hel2);
Tensor<2> qqCur = qqCurBlank.contract(p3-pb,2);
Tensor<1> gqqCur = qqCur.contract(epsg,2)/t1;
return gqqCur*(-1);
}
//Function to calculate Term 2 in Equation 3.23 in James Cockburn's Thesis.
Tensor<1> qggm2(HLV pb, HLV p2, HLV p3, Helicity hel2, Helicity helg, HLV refmom){
//@TODO Simplify the calculation below (Less Tensor class use?)
double t1 = (p2-pb)*(p2-pb);
// Gauge choice in polarisation tensor. (see JC's Thesis)
Tensor<1> epsg = eps(pb,refmom, helg);
Tensor<3> qqCurBlank = rank3_current(p2,p3,hel2);
Tensor<2> qqCur = qqCurBlank.contract(p2-pb,2);
Tensor<1> gqqCur = qqCur.contract(epsg,1)/t1;
return gqqCur;
}
//Function to calculate Term 3 in Equation 3.23 in James Cockburn's Thesis.
Tensor<1> qggm3(HLV pb, HLV p2, HLV p3, Helicity hel2, Helicity helg, HLV refmom){
//@TODO Simplify the calculation below (Less Tensor class use?)
double s23 = (p2+p3)*(p2+p3);
// Gauge choice in polarisation tensor. (see JC's Thesis)
Tensor<1> epsg = eps(pb, refmom, helg);
Tensor<3> qqCurBlank1 = outer(p2+p3, metric())/s23;
Tensor<3> qqCurBlank2 = outer(pb, metric())/s23;
Tensor<1> Cur23 = HEJ::current(p2, p3,hel2);
Tensor<2> qqCur1 = qqCurBlank1.contract(Cur23,3);
Tensor<2> qqCur2 = qqCurBlank2.contract(Cur23,3);
Tensor<2> qqCur3 = qqCurBlank2.contract(Cur23,1);
Tensor<1> gqqCur = (qqCur1.contract(epsg,1)
- qqCur2.contract(epsg,2)
+ qqCur3.contract(epsg,1))*2*COM(0,1);
return gqqCur;
}
}
// no wqq emission
double ME_W_Exqqx_QQq(HLV pa, HLV pb, HLV p1, HLV p2,
- HLV p3,HLV plbar, HLV pl, bool aqlinepa
+ HLV p3,HLV plbar, HLV pl, bool aqlinepa,
+ ParticleProperties const & wprop
){
using helicity::minus;
using helicity::plus;
init_sigma_index();
// 2 independent helicity choices (complex conjugation related).
Tensor<1> TMmmm1 = qggm1(pb,p2,p3,minus,minus, pa);
Tensor<1> TMmmm2 = qggm2(pb,p2,p3,minus,minus, pa);
Tensor<1> TMmmm3 = qggm3(pb,p2,p3,minus,minus, pa);
Tensor<1> TMpmm1 = qggm1(pb,p2,p3,minus,plus, pa);
Tensor<1> TMpmm2 = qggm2(pb,p2,p3,minus,plus, pa);
Tensor<1> TMpmm3 = qggm3(pb,p2,p3,minus,plus, pa);
// Build the external quark line W Emmision
Tensor<1> cur1a = jW(pa,p1,plbar,pl, aqlinepa?plus:minus);
//Contract with the qqxCurrent.
COM Mmmm1 = TMmmm1.contract(cur1a,1);
COM Mmmm2 = TMmmm2.contract(cur1a,1);
COM Mmmm3 = TMmmm3.contract(cur1a,1);
COM Mpmm1 = TMpmm1.contract(cur1a,1);
COM Mpmm2 = TMpmm2.contract(cur1a,1);
COM Mpmm3 = TMpmm3.contract(cur1a,1);
//Colour factors:
COM cm1m1,cm2m2,cm3m3,cm1m2,cm1m3,cm2m3;
cm1m1=8./3.;
cm2m2=8./3.;
cm3m3=6.;
cm1m2 =-1./3.;
cm1m3 = -3.*COM(0.,1.);
cm2m3 = 3.*COM(0.,1.);
//Sqaure and sum for each helicity config:
double Mmmm = real( cm1m1*pow(abs(Mmmm1),2) + cm2m2*pow(abs(Mmmm2),2)
+ cm3m3*pow(abs(Mmmm3),2) + 2.*real(cm1m2*Mmmm1*conj(Mmmm2))
+ 2.*real(cm1m3*Mmmm1*conj(Mmmm3))
+ 2.*real(cm2m3*Mmmm2*conj(Mmmm3)) );
double Mpmm = real( cm1m1*pow(abs(Mpmm1),2) + cm2m2*pow(abs(Mpmm2),2)
+ cm3m3*pow(abs(Mpmm3),2) + 2.*real(cm1m2*Mpmm1*conj(Mpmm2))
+ 2.*real(cm1m3*Mpmm1*conj(Mpmm3))
+ 2.*real(cm2m3*Mpmm2*conj(Mpmm3)) );
// Divide by WProp
- double WPropfact = WProp(plbar, pl);
-
+ const double WPropfact = WProp(plbar, pl, wprop);
return (2*WPropfact*(Mmmm+Mpmm)/24./4.)/(pa-p1-pl-plbar).m2()/(p2+p3-pb).m2();
}
// W+Jets qqxCentral
double ME_WCenqqx_qq(HLV pa, HLV pb,HLV pl, HLV plbar, std::vector<HLV> partons,
- bool aqlinepa, bool aqlinepb, bool qqxmarker, int nabove
+ bool aqlinepa, bool aqlinepb, bool qqxmarker, int nabove,
+ ParticleProperties const & wprop
){
init_sigma_index();
HLV pq, pqbar, p1, p4;
if (qqxmarker){
pqbar = partons[nabove+1];
pq = partons[nabove+2];}
else{
pq = partons[nabove+1];
pqbar = partons[nabove+2];}
p1 = partons.front();
p4 = partons.back();
Tensor<1> T1am, T4bm, T1ap, T4bp;
if(!(aqlinepa)){
T1ap = HEJ::current(p1, pa, helicity::plus);
T1am = HEJ::current(p1, pa, helicity::minus);}
else if(aqlinepa){
T1ap = HEJ::current(pa, p1, helicity::plus);
T1am = HEJ::current(pa, p1, helicity::minus);}
if(!(aqlinepb)){
T4bp = HEJ::current(p4, pb, helicity::plus);
T4bm = HEJ::current(p4, pb, helicity::minus);}
else if(aqlinepb){
T4bp = HEJ::current(pb, p4, helicity::plus);
T4bm = HEJ::current(pb, p4, helicity::minus);}
// Calculate the 3 separate contributions to the effective vertex
Tensor<2> Xunc = MUncrossW(pa, p1, pb, p4, pq, pqbar, pl, plbar, partons, nabove);
Tensor<2> Xcro = MCrossW( pa, p1, pb, p4, pq, pqbar, pl, plbar, partons, nabove);
Tensor<2> Xsym = MSymW( pa, p1, pb, p4, pq, pqbar, pl, plbar, partons, nabove);
// 4 Different Helicity Choices (Differs from Pure Jet Case, where there is
// also the choice in qqbar helicity.
// (- - hel choice)
COM M_mmUnc = (((Xunc).contract(T1am,1)).contract(T4bm,1));
COM M_mmCro = (((Xcro).contract(T1am,1)).contract(T4bm,1));
COM M_mmSym = (((Xsym).contract(T1am,1)).contract(T4bm,1));
// (- + hel choice)
COM M_mpUnc = (((Xunc).contract(T1am,1)).contract(T4bp,1));
COM M_mpCro = (((Xcro).contract(T1am,1)).contract(T4bp,1));
COM M_mpSym = (((Xsym).contract(T1am,1)).contract(T4bp,1));
// (+ - hel choice)
COM M_pmUnc = (((Xunc).contract(T1ap,1)).contract(T4bm,1));
COM M_pmCro = (((Xcro).contract(T1ap,1)).contract(T4bm,1));
COM M_pmSym = (((Xsym).contract(T1ap,1)).contract(T4bm,1));
// (+ + hel choice)
COM M_ppUnc = (((Xunc).contract(T1ap,1)).contract(T4bp,1));
COM M_ppCro = (((Xcro).contract(T1ap,1)).contract(T4bp,1));
COM M_ppSym = (((Xsym).contract(T1ap,1)).contract(T4bp,1));
//Colour factors:
COM cmsms,cmumu,cmcmc,cmsmu,cmsmc,cmumc;
cmsms=3.;
cmumu=4./3.;
cmcmc=4./3.;
cmsmu =3./2.*COM(0.,1.);
cmsmc = -3./2.*COM(0.,1.);
cmumc = -1./6.;
// Work Out Interference in each case of helicity:
double amp_mm = real(cmsms*pow(abs(M_mmSym),2)
+cmumu*pow(abs(M_mmUnc),2)
+cmcmc*pow(abs(M_mmCro),2)
+2.*real(cmsmu*M_mmSym*conj(M_mmUnc))
+2.*real(cmsmc*M_mmSym*conj(M_mmCro))
+2.*real(cmumc*M_mmUnc*conj(M_mmCro)));
double amp_mp = real(cmsms*pow(abs(M_mpSym),2)
+cmumu*pow(abs(M_mpUnc),2)
+cmcmc*pow(abs(M_mpCro),2)
+2.*real(cmsmu*M_mpSym*conj(M_mpUnc))
+2.*real(cmsmc*M_mpSym*conj(M_mpCro))
+2.*real(cmumc*M_mpUnc*conj(M_mpCro)));
double amp_pm = real(cmsms*pow(abs(M_pmSym),2)
+cmumu*pow(abs(M_pmUnc),2)
+cmcmc*pow(abs(M_pmCro),2)
+2.*real(cmsmu*M_pmSym*conj(M_pmUnc))
+2.*real(cmsmc*M_pmSym*conj(M_pmCro))
+2.*real(cmumc*M_pmUnc*conj(M_pmCro)));
double amp_pp = real(cmsms*pow(abs(M_ppSym),2)
+cmumu*pow(abs(M_ppUnc),2)
+cmcmc*pow(abs(M_ppCro),2)
+2.*real(cmsmu*M_ppSym*conj(M_ppUnc))
+2.*real(cmsmc*M_ppSym*conj(M_ppCro))
+2.*real(cmumc*M_ppUnc*conj(M_ppCro)));
double amp=((amp_mm+amp_mp+amp_pm+amp_pp)/(9.*4.));
HLV q1,q3;
q1=pa;
for(int i=0;i<nabove+1;i++){
q1-=partons.at(i);
}
q3 = q1 - pq - pqbar - pl - plbar;
double t1 = (q1).m2();
double t3 = (q3).m2();
//Divide by t-channels
amp/=(t1*t1*t3*t3);
//Divide by WProp
- double WPropfact = WProp(plbar, pl);
- amp*=WPropfact;
+ amp*=WProp(plbar, pl, wprop);
return amp;
}
// no wqq emission
double ME_W_Cenqqx_qq(HLV pa, HLV pb,HLV pl,HLV plbar, std::vector<HLV> partons,
bool aqlinepa, bool aqlinepb, bool qqxmarker, int nabove,
- int nbelow, bool forwards
+ int nbelow, bool forwards, ParticleProperties const & wprop
){
using helicity::minus;
using helicity::plus;
init_sigma_index();
if (!forwards){ //If Emission from Leg a instead, flip process.
std::swap(pa, pb);
std::reverse(partons.begin(),partons.end());
std::swap(aqlinepa, aqlinepb);
qqxmarker = !qqxmarker;
std::swap(nabove,nbelow);
}
HLV pq, pqbar, p1,p4;
if (qqxmarker){
pqbar = partons[nabove+1];
pq = partons[nabove+2];}
else{
pq = partons[nabove+1];
pqbar = partons[nabove+2];}
p1 = partons.front();
p4 = partons.back();
Tensor<1> T1am(0.), T1ap(0.);
if(!(aqlinepa)){
T1ap = HEJ::current(p1, pa, plus);
T1am = HEJ::current(p1, pa, minus);}
else if(aqlinepa){
T1ap = HEJ::current(pa, p1, plus);
T1am = HEJ::current(pa, p1, minus);}
Tensor <1> T4bm = jW(pb, p4, plbar, pl, aqlinepb?plus:minus);
// Calculate the 3 separate contributions to the effective vertex
Tensor<2> Xunc_m = MUncross(pa, pq, pqbar,partons, minus, nabove);
Tensor<2> Xcro_m = MCross( pa, pq, pqbar,partons, minus, nabove);
Tensor<2> Xsym_m = MSym( pa, p1, pb, p4, pq, pqbar, partons, minus, nabove);
Tensor<2> Xunc_p = MUncross(pa, pq, pqbar,partons, plus, nabove);
Tensor<2> Xcro_p = MCross( pa, pq, pqbar,partons, plus, nabove);
Tensor<2> Xsym_p = MSym( pa, p1, pb, p4, pq, pqbar, partons, plus, nabove);
// (- - hel choice)
COM M_mmUnc = (((Xunc_m).contract(T1am,1)).contract(T4bm,1));
COM M_mmCro = (((Xcro_m).contract(T1am,1)).contract(T4bm,1));
COM M_mmSym = (((Xsym_m).contract(T1am,1)).contract(T4bm,1));
// (- + hel choice)
COM M_mpUnc = (((Xunc_p).contract(T1am,1)).contract(T4bm,1));
COM M_mpCro = (((Xcro_p).contract(T1am,1)).contract(T4bm,1));
COM M_mpSym = (((Xsym_p).contract(T1am,1)).contract(T4bm,1));
// (+ - hel choice)
COM M_pmUnc = (((Xunc_m).contract(T1ap,1)).contract(T4bm,1));
COM M_pmCro = (((Xcro_m).contract(T1ap,1)).contract(T4bm,1));
COM M_pmSym = (((Xsym_m).contract(T1ap,1)).contract(T4bm,1));
// (+ + hel choice)
COM M_ppUnc = (((Xunc_p).contract(T1ap,1)).contract(T4bm,1));
COM M_ppCro = (((Xcro_p).contract(T1ap,1)).contract(T4bm,1));
COM M_ppSym = (((Xsym_p).contract(T1ap,1)).contract(T4bm,1));
//Colour factors:
COM cmsms,cmumu,cmcmc,cmsmu,cmsmc,cmumc;
cmsms=3.;
cmumu=4./3.;
cmcmc=4./3.;
cmsmu =3./2.*COM(0.,1.);
cmsmc = -3./2.*COM(0.,1.);
cmumc = -1./6.;
// Work Out Interference in each case of helicity:
double amp_mm = real(cmsms*pow(abs(M_mmSym),2)
+cmumu*pow(abs(M_mmUnc),2)
+cmcmc*pow(abs(M_mmCro),2)
+2.*real(cmsmu*M_mmSym*conj(M_mmUnc))
+2.*real(cmsmc*M_mmSym*conj(M_mmCro))
+2.*real(cmumc*M_mmUnc*conj(M_mmCro)));
double amp_mp = real(cmsms*pow(abs(M_mpSym),2)
+cmumu*pow(abs(M_mpUnc),2)
+cmcmc*pow(abs(M_mpCro),2)
+2.*real(cmsmu*M_mpSym*conj(M_mpUnc))
+2.*real(cmsmc*M_mpSym*conj(M_mpCro))
+2.*real(cmumc*M_mpUnc*conj(M_mpCro)));
double amp_pm = real(cmsms*pow(abs(M_pmSym),2)
+cmumu*pow(abs(M_pmUnc),2)
+cmcmc*pow(abs(M_pmCro),2)
+2.*real(cmsmu*M_pmSym*conj(M_pmUnc))
+2.*real(cmsmc*M_pmSym*conj(M_pmCro))
+2.*real(cmumc*M_pmUnc*conj(M_pmCro)));
double amp_pp = real(cmsms*pow(abs(M_ppSym),2)
+cmumu*pow(abs(M_ppUnc),2)
+cmcmc*pow(abs(M_ppCro),2)
+2.*real(cmsmu*M_ppSym*conj(M_ppUnc))
+2.*real(cmsmc*M_ppSym*conj(M_ppCro))
+2.*real(cmumc*M_ppUnc*conj(M_ppCro)));
double amp=((amp_mm+amp_mp+amp_pm+amp_pp)/(9.*4.));
HLV q1,q3;
q1=pa;
for(int i=0;i<nabove+1;i++){
q1-=partons.at(i);
}
q3 = q1 - pq - pqbar;
double t1 = (q1).m2();
double t3 = (q3).m2();
//Divide by t-channels
amp/=(t1*t1*t3*t3);
//Divide by WProp
- double WPropfact = WProp(plbar, pl);
- amp*=WPropfact;
+ amp*=WProp(plbar, pl, wprop);
return amp;
}
diff --git a/src/YAMLreader.cc b/src/YAMLreader.cc
index 96caa71..e352b3d 100644
--- a/src/YAMLreader.cc
+++ b/src/YAMLreader.cc
@@ -1,480 +1,509 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include "HEJ/YAMLreader.hh"
#include <algorithm>
#include <iostream>
#include <limits>
#include <map>
#include <string>
#include <unordered_map>
#include <vector>
#include <dlfcn.h>
#include "HEJ/ScaleFunction.hh"
#include "HEJ/event_types.hh"
#include "HEJ/output_formats.hh"
#include "HEJ/Constants.hh"
namespace HEJ{
class Event;
namespace{
//! Get YAML tree of supported options
/**
* The configuration file is checked against this tree of options
* in assert_all_options_known.
*/
YAML::Node const & get_supported_options(){
const static YAML::Node supported = [](){
YAML::Node supported;
static const auto opts = {
"trials", "min extparton pt", "max ext soft pt fraction",
"scales", "scale factors", "max scale ratio", "import scales",
- "log correction", "event output", "analysis", "regulator parameter"
+ "log correction", "event output", "analysis", "regulator parameter",
+ "vev"
};
// add subnodes to "supported" - the assigned value is irrelevant
for(auto && opt: opts) supported[opt] = "";
for(auto && jet_opt: {"min pt", "algorithm", "R"}){
supported["resummation jets"][jet_opt] = "";
supported["fixed order jets"][jet_opt] = "";
}
for(auto && opt: {"mt", "use impact factors", "include bottom", "mb"}){
supported["Higgs coupling"][opt] = "";
}
for(auto && opt: {"name", "seed"}){
supported["random generator"][opt] = "";
}
for(auto && opt: {"FKL", "unordered", "extremal qqx", "central qqx", "non-resummable"}){
supported["event treatment"][opt] = "";
}
+ for(auto && particle_type: {"Higgs", "W", "Z"}){
+ for(auto && particle_opt: {"mass", "width"}){
+ supported["particle properties"][particle_type][particle_opt] = "";
+ }
+ }
return supported;
}();
return supported;
}
fastjet::JetAlgorithm to_JetAlgorithm(std::string const & algo){
using namespace fastjet;
static const std::map<std::string, fastjet::JetAlgorithm> known = {
{"kt", kt_algorithm},
{"cambridge", cambridge_algorithm},
{"antikt", antikt_algorithm},
{"cambridge for passive", cambridge_for_passive_algorithm},
{"plugin", plugin_algorithm}
};
const auto res = known.find(algo);
if(res == known.end()){
throw std::invalid_argument("Unknown jet algorithm \"" + algo + "\"");
}
return res->second;
}
EventTreatment to_EventTreatment(std::string const & name){
static const std::map<std::string, EventTreatment> known = {
{"reweight", EventTreatment::reweight},
{"keep", EventTreatment::keep},
{"discard", EventTreatment::discard}
};
const auto res = known.find(name);
if(res == known.end()){
throw std::invalid_argument("Unknown event treatment \"" + name + "\"");
}
return res->second;
}
} // namespace anonymous
namespace detail{
void set_from_yaml(fastjet::JetAlgorithm & setting, YAML::Node const & yaml){
setting = to_JetAlgorithm(yaml.as<std::string>());
}
void set_from_yaml(EventTreatment & setting, YAML::Node const & yaml){
setting = to_EventTreatment(yaml.as<std::string>());
}
void set_from_yaml(ParticleID & setting, YAML::Node const & yaml){
setting = to_ParticleID(yaml.as<std::string>());
}
} // namespace detail
JetParameters get_jet_parameters(
YAML::Node const & node,
std::string const & entry
){
assert(node);
JetParameters result;
fastjet::JetAlgorithm jet_algo = fastjet::antikt_algorithm;
double R;
set_from_yaml_if_defined(jet_algo, node, entry, "algorithm");
set_from_yaml(R, node, entry, "R");
result.def = fastjet::JetDefinition{jet_algo, R};
set_from_yaml(result.min_pt, node, entry, "min pt");
return result;
}
RNGConfig to_RNGConfig(
YAML::Node const & node,
std::string const & entry
){
assert(node);
RNGConfig result;
set_from_yaml(result.name, node, entry, "name");
set_from_yaml_if_defined(result.seed, node, entry, "seed");
return result;
}
+ ParticleProperties get_particle_properties(
+ YAML::Node const & node, std::string const & entry,
+ std::string const & boson
+ ){
+ ParticleProperties result;
+ set_from_yaml(result.mass, node, entry, boson, "mass");
+ set_from_yaml(result.width, node, entry, boson, "width");
+ return result;
+ }
+
+ EWConstants get_ew_parameters(YAML::Node const & node){
+ EWConstants result;
+ double vev;
+ set_from_yaml(vev, node, "vev");
+ result.set_vevWZH(vev,
+ get_particle_properties(node, "particle properties", "W"),
+ get_particle_properties(node, "particle properties", "Z"),
+ get_particle_properties(node, "particle properties", "Higgs")
+ );
+ return result;
+ }
+
HiggsCouplingSettings get_Higgs_coupling(
YAML::Node const & node,
std::string const & entry
){
assert(node);
static constexpr double mt_max = 2e4;
#ifndef HEJ_BUILD_WITH_QCDLOOP
if(node[entry]){
throw std::invalid_argument{
"Higgs coupling settings require building HEJ 2 "
"with QCDloop support"
};
}
#endif
HiggsCouplingSettings settings;
set_from_yaml_if_defined(settings.mt, node, entry, "mt");
set_from_yaml_if_defined(settings.mb, node, entry, "mb");
set_from_yaml_if_defined(settings.include_bottom, node, entry, "include bottom");
set_from_yaml_if_defined(settings.use_impact_factors, node, entry, "use impact factors");
if(settings.use_impact_factors){
if(settings.mt != std::numeric_limits<double>::infinity()){
throw std::invalid_argument{
"Conflicting settings: "
"impact factors may only be used in the infinite top mass limit"
};
}
}
else{
// huge values of the top mass are numerically unstable
settings.mt = std::min(settings.mt, mt_max);
}
return settings;
}
FileFormat to_FileFormat(std::string const & name){
static const std::map<std::string, FileFormat> known = {
{"Les Houches", FileFormat::Les_Houches},
{"HepMC", FileFormat::HepMC},
{"HepMC2", FileFormat::HepMC2},
{"HepMC3", FileFormat::HepMC3}
};
const auto res = known.find(name);
if(res == known.end()){
throw std::invalid_argument("Unknown file format \"" + name + "\"");
}
return res->second;
}
std::string extract_suffix(std::string const & filename){
size_t separator = filename.rfind('.');
if(separator == filename.npos) return {};
return filename.substr(separator + 1);
}
FileFormat format_from_suffix(std::string const & filename){
const std::string suffix = extract_suffix(filename);
if(suffix == "lhe") return FileFormat::Les_Houches;
if(suffix == "hepmc") return FileFormat::HepMC;
if(suffix == "hepmc3") return FileFormat::HepMC3;
if(suffix == "hepmc2") return FileFormat::HepMC2;
throw std::invalid_argument{
"Can't determine format for output file \"" + filename + "\""
};
}
void assert_all_options_known(
YAML::Node const & conf, YAML::Node const & supported
){
if(!conf.IsMap()) return;
if(!supported.IsMap()) throw invalid_type{"must not have sub-entries"};
for(auto const & entry: conf){
const auto name = entry.first.as<std::string>();
if(! supported[name]) throw unknown_option{name};
/* check sub-options, e.g. 'resummation jets: min pt'
* we don't check analysis sub-options
* those depend on the analysis being used and should be checked there
* similar for "import scales"
*/
if(name != "analysis" && name != "import scales"){
try{
assert_all_options_known(conf[name], supported[name]);
}
catch(unknown_option const & ex){
throw unknown_option{name + ": " + ex.what()};
}
catch(invalid_type const & ex){
throw invalid_type{name + ": " + ex.what()};
}
}
}
}
} // namespace HEJ
namespace YAML {
Node convert<HEJ::OutputFile>::encode(HEJ::OutputFile const & outfile) {
Node node;
node[to_string(outfile.format)] = outfile.name;
return node;
};
bool convert<HEJ::OutputFile>::decode(Node const & node, HEJ::OutputFile & out) {
switch(node.Type()){
case NodeType::Map: {
YAML::const_iterator it = node.begin();
out.format = HEJ::to_FileFormat(it->first.as<std::string>());
out.name = it->second.as<std::string>();
return true;
}
case NodeType::Scalar:
out.name = node.as<std::string>();
out.format = HEJ::format_from_suffix(out.name);
return true;
default:
return false;
}
}
} // namespace YAML
namespace HEJ{
namespace detail{
void set_from_yaml(OutputFile & setting, YAML::Node const & yaml){
setting = yaml.as<OutputFile>();
}
}
namespace{
void update_fixed_order_jet_parameters(
JetParameters & fixed_order_jets, YAML::Node const & yaml
){
if(!yaml["fixed order jets"]) return;
set_from_yaml_if_defined(
fixed_order_jets.min_pt, yaml, "fixed order jets", "min pt"
);
fastjet::JetAlgorithm algo = fixed_order_jets.def.jet_algorithm();
set_from_yaml_if_defined(algo, yaml, "fixed order jets", "algorithm");
double R = fixed_order_jets.def.R();
set_from_yaml_if_defined(R, yaml, "fixed order jets", "R");
fixed_order_jets.def = fastjet::JetDefinition{algo, R};
}
// like std::stod, but throw if not the whole string can be converted
double to_double(std::string const & str){
std::size_t pos;
const double result = std::stod(str, &pos);
if(pos < str.size()){
throw std::invalid_argument(str + " is not a valid double value");
}
return result;
}
using EventScale = double (*)(Event const &);
void import_scale_functions(
std::string const & file,
std::vector<std::string> const & scale_names,
std::unordered_map<std::string, EventScale> & known
) {
auto handle = dlopen(file.c_str(), RTLD_NOW);
char * error = dlerror();
if(error != nullptr) throw std::runtime_error{error};
for(auto const & scale: scale_names) {
void * sym = dlsym(handle, scale.c_str());
error = dlerror();
if(error != nullptr) throw std::runtime_error{error};
known.emplace(scale, reinterpret_cast<EventScale>(sym));
}
}
auto get_scale_map(
YAML::Node const & yaml
) {
std::unordered_map<std::string, EventScale> scale_map;
scale_map.emplace("H_T", H_T);
scale_map.emplace("max jet pperp", max_jet_pt);
scale_map.emplace("jet invariant mass", jet_invariant_mass);
scale_map.emplace("m_j1j2", m_j1j2);
if(yaml["import scales"]) {
if(! yaml["import scales"].IsMap()) {
throw invalid_type{"Entry 'import scales' is not a map"};
}
for(auto const & import: yaml["import scales"]) {
const auto file = import.first.as<std::string>();
const auto scale_names =
import.second.IsSequence()
?import.second.as<std::vector<std::string>>()
:std::vector<std::string>{import.second.as<std::string>()};
import_scale_functions(file, scale_names, scale_map);
}
}
return scale_map;
}
// simple (as in non-composite) scale functions
/**
* An example for a simple scale function would be H_T,
* H_T/2 is then composite (take H_T and then divide by 2)
*/
ScaleFunction parse_simple_ScaleFunction(
std::string const & scale_fun,
std::unordered_map<std::string, EventScale> const & known
) {
assert(
scale_fun.empty() ||
(!std::isspace(scale_fun.front()) && !std::isspace(scale_fun.back()))
);
const auto it = known.find(scale_fun);
if(it != end(known)) return {it->first, it->second};
try{
const double scale = to_double(scale_fun);
return {scale_fun, FixedScale{scale}};
} catch(std::invalid_argument const &){}
throw std::invalid_argument{"Unknown scale choice: \"" + scale_fun + "\""};
}
std::string trim_front(std::string const & str){
const auto new_begin = std::find_if(
begin(str), end(str), [](char c){ return ! std::isspace(c); }
);
return std::string(new_begin, end(str));
}
std::string trim_back(std::string str){
size_t pos = str.size() - 1;
// use guaranteed wrap-around behaviour to check whether we have
// traversed the whole string
for(; pos < str.size() && std::isspace(str[pos]); --pos) {}
str.resize(pos + 1); // note that pos + 1 can be 0
return str;
}
ScaleFunction parse_ScaleFunction(
std::string const & scale_fun,
std::unordered_map<std::string, EventScale> const & known
){
assert(
scale_fun.empty() ||
(!std::isspace(scale_fun.front()) && !std::isspace(scale_fun.back()))
);
// parse from right to left => a/b/c gives (a/b)/c
const size_t delim = scale_fun.find_last_of("*/");
if(delim == scale_fun.npos){
return parse_simple_ScaleFunction(scale_fun, known);
}
const std::string first = trim_back(std::string{scale_fun, 0, delim});
const std::string second = trim_front(std::string{scale_fun, delim+1});
if(scale_fun[delim] == '/'){
return parse_ScaleFunction(first, known)
/ parse_ScaleFunction(second, known);
}
else{
assert(scale_fun[delim] == '*');
return parse_ScaleFunction(first, known)
* parse_ScaleFunction(second, known);
}
}
EventTreatMap get_event_treatment(
YAML::Node const & node, std::string const & entry
){
using namespace event_type;
EventTreatMap treat {
{no_2_jets, EventTreatment::discard},
{bad_final_state, EventTreatment::discard},
{FKL, EventTreatment::discard},
{unob, EventTreatment::discard},
{unof, EventTreatment::discard},
{qqxexb, EventTreatment::discard},
{qqxexf, EventTreatment::discard},
{qqxmid, EventTreatment::discard},
{non_resummable, EventTreatment::discard}
};
set_from_yaml(treat.at(FKL), node, entry, "FKL");
set_from_yaml(treat.at(unob), node, entry, "unordered");
treat.at(unof) = treat.at(unob);
set_from_yaml(treat.at(qqxexb), node, entry, "extremal qqx");
treat.at(qqxexf) = treat.at(qqxexb);
set_from_yaml(treat.at(qqxmid), node, entry, "central qqx");
set_from_yaml(treat.at(non_resummable), node, entry, "non-resummable");
if(treat[non_resummable] == EventTreatment::reweight){
throw std::invalid_argument{"Cannot reweight Fixed Order events"};
}
return treat;
}
Config to_Config(YAML::Node const & yaml){
try{
assert_all_options_known(yaml, get_supported_options());
}
catch(unknown_option const & ex){
throw unknown_option{std::string{"Unknown option '"} + ex.what() + "'"};
}
Config config;
config.resummation_jets = get_jet_parameters(yaml, "resummation jets");
config.fixed_order_jets = config.resummation_jets;
update_fixed_order_jet_parameters(config.fixed_order_jets, yaml);
set_from_yaml(config.min_extparton_pt, yaml, "min extparton pt");
// Sets the standard value, then changes this if defined
config.regulator_lambda=CLAMBDA;
set_from_yaml_if_defined(config.regulator_lambda, yaml, "regulator parameter");
config.max_ext_soft_pt_fraction = 0.1;
set_from_yaml_if_defined(
config.max_ext_soft_pt_fraction, yaml, "max ext soft pt fraction"
);
set_from_yaml(config.trials, yaml, "trials");
set_from_yaml(config.log_correction, yaml, "log correction");
config.treat = get_event_treatment(yaml, "event treatment");
set_from_yaml_if_defined(config.output, yaml, "event output");
config.rng = to_RNGConfig(yaml, "random generator");
set_from_yaml_if_defined(config.analysis_parameters, yaml, "analysis");
config.scales = to_ScaleConfig(yaml);
+ config.ew_parameters = get_ew_parameters(yaml);
config.Higgs_coupling = get_Higgs_coupling(yaml, "Higgs coupling");
return config;
}
} // namespace anonymous
ScaleConfig to_ScaleConfig(YAML::Node const & yaml){
ScaleConfig config;
auto scale_funs = get_scale_map(yaml);
std::vector<std::string> scales;
set_from_yaml(scales, yaml, "scales");
config.base.reserve(scales.size());
std::transform(
begin(scales), end(scales), std::back_inserter(config.base),
[scale_funs](auto const & entry){
return parse_ScaleFunction(entry, scale_funs);
}
);
set_from_yaml_if_defined(config.factors, yaml, "scale factors");
config.max_ratio = std::numeric_limits<double>::infinity();
set_from_yaml_if_defined(config.max_ratio, yaml, "max scale ratio");
return config;
}
Config load_config(std::string const & config_file){
try{
return to_Config(YAML::LoadFile(config_file));
}
catch(...){
std::cerr << "Error reading " << config_file << ":\n ";
throw;
}
}
} // namespace HEJ
diff --git a/t/ME_data/ME_Wm.dat b/t/ME_data/ME_Wm.dat
index f61a711..b563c9f 100644
--- a/t/ME_data/ME_Wm.dat
+++ b/t/ME_data/ME_Wm.dat
@@ -1,1308 +1,1308 @@
-2.928675692e-06
-1.647116461e-06
-6.792853649e-07
-8.309213874e-05
-1.188586835e-09
-7.418850985e-09
-4.641858351e-07
-4.469299635e-07
-6.109075964e-06
-2.937428029e-06
-4.834759305e-06
-8.223080997e-06
-1.984882889e-06
-4.724373663e-06
-2.284512955e-07
-6.086791509e-08
-9.402879575e-07
-2.134932663e-05
-1.344153838e-06
-6.325190057e-08
-5.042205822e-06
-0.0002285013435
-2.294857015e-06
-6.277759204e-05
-1.337020968e-07
-3.953835541e-06
-9.658506379e-05
-2.316868337e-06
-2.819688016e-07
-0.0001081216619
-3.432998402e-06
-3.368523741e-06
-1.11288709e-08
-3.29543466e-07
-3.989570061e-10
-1.948796723e-05
-3.510830208e-07
-3.210202477e-07
-3.239728865e-06
-8.604875852e-06
-7.617842534e-10
-1.878886612e-06
-8.602552313e-09
-2.905134545e-09
-9.580831652e-08
-2.761377426e-07
-1.121758088e-05
-8.305715929e-07
-3.094575366e-06
-9.009051399e-07
-3.660116555e-07
-4.545389317e-08
-1.619299497e-09
-0.01367636241
-3.915774786e-06
-2.025205952e-06
-3.6814996e-09
-4.179895596e-06
-3.07283947e-08
-8.89627591e-07
-3.025959937e-08
-1.817403251e-09
-4.337439968e-10
-1.271896091e-06
-6.045011555e-06
-9.89332115e-09
-1.214106087e-05
-2.958683161e-08
-2.061281825e-09
-1.93033348e-05
-6.299313702e-07
-2.644016282e-07
-2.061367847e-06
-4.34253878e-05
-8.291732575e-07
-2.499007952e-06
-4.358489891e-06
-9.241699824e-05
-9.12437674e-05
-0.0001159481718
-2.350252878e-06
-7.845324212e-06
-0.000638536879
-4.723440426e-08
-6.954486577e-09
-5.357700283e-06
-1.473730225e-07
-1.054004829e-07
-5.920067571e-07
-1.175811475e-05
-1.546221661e-07
-0.0004236100189
-3.617420289e-06
-4.516879429e-05
-3.955718614e-05
-0.0001365328248
-5.126170478e-05
-1.077742001e-06
-1.018758481e-08
-2.310396111e-09
-6.836738619e-07
-5.827603078e-09
-1.557658774e-09
-6.048954972e-05
-1.652858793e-07
-2.956993046e-07
-3.715591231e-06
-1.403931806e-08
-2.060713606e-07
-0.001033146046
-9.773118638e-07
-2.935985027e-05
-1.151256054e-05
-7.794713809e-06
-2.17436307e-05
-4.056751186e-08
-2.955377882e-08
-8.030872004e-05
-2.603215792e-07
-0.0001681672442
-2.930133644e-08
-7.197036394e-05
-1.920989813e-06
-3.637607439e-09
-7.893842383e-06
-0.0001175217074
-4.802925073e-10
-4.83556567e-07
-2.878827354e-05
-1.898723086e-09
-2.754516812e-08
-1.403679092e-10
-5.826558306e-07
-2.433773671e-06
-7.927708105e-06
-1.020983626e-08
-1.052585256e-07
-7.737192672e-06
-3.400645867e-06
-2.714553382e-08
-2.377796617e-09
-0.0001490868071
-9.612832588e-11
-1.654742249e-05
-1.57073488e-07
-1.609407803e-06
-6.946367688e-08
-0.04337790658
-9.860795665e-06
-1.103405546e-05
-0.01558805851
-1.359140493e-06
-2.104988229e-07
-4.483328013e-08
-2.527261731e-08
-4.136266286e-07
-1.75962763e-07
-4.16236019e-07
-3.66072855e-07
-2.475097776e-06
-2.142069091e-05
-3.962234552e-07
-5.0752339e-06
-2.831972358e-08
-8.260228591e-08
-2.191466894e-08
-7.392657036e-05
-5.57330681e-10
-1.264513056e-08
-3.373173459e-05
-1.515657759e-07
-4.183645033e-07
-1.162296215e-07
-7.731815775e-06
-1.077601875e-05
-2.331663061e-07
-4.316286429e-10
-4.05516744e-09
-1.282346148e-09
-1.905147472e-09
-2.799718364e-07
-6.430044079e-08
-3.336162544e-07
-2.847516226e-07
-2.8800296e-05
-5.034816791e-08
-0.0001697859258
-7.357868068e-08
-1.312972542e-07
-1.494668933e-07
-1.309682993e-09
-1.452620265e-08
-7.003475182e-07
-2.392867531e-06
-6.228302547e-06
-2.32207831e-07
-8.172158542e-08
-4.289261389e-07
-2.619009165e-07
-7.684975193e-06
-3.9300806e-10
-1.235480059e-06
-4.345702611e-07
-1.019591398e-07
-1.014400081e-05
-1.198511446e-05
-3.072393212e-05
-2.47145635e-06
-6.141459748e-06
-2.217791841e-05
-7.506816715e-07
-4.156597855e-07
-0.0003928655193
-6.192512495e-07
-9.058620171e-07
-7.767884384e-06
-1.506541078e-06
-1.438366886e-08
-1.393919618e-07
-7.338405876e-05
-1.013840918e-07
-1.941618603e-05
-1.098271271e-06
-7.583485063e-07
-1.924040495e-08
-2.683414048e-06
-0.0005387206665
-4.514003014e-09
-7.345041607e-06
-4.863384343e-08
-5.137710227e-07
-1.341025387e-07
-1.385096075e-09
-0.001475731456
-4.766899706e-09
-2.788152153e-07
-4.885059085e-07
-4.389966638e-07
-0.0006056993831
-2.260959244e-06
-1.622050932e-07
-8.044376305e-07
-0.002874337098
-8.545204208e-05
-2.859915875e-07
-3.520051428e-05
-3.83840617e-05
-6.701394914e-12
-6.711555934e-09
-1.221714284e-07
-4.175432874e-09
-1.276099272e-06
-9.349373741e-06
-5.093349519e-07
-2.102059997e-05
-2.546943624e-06
-4.307372366e-07
-0.0001405081607
-1.532593492e-06
-0.004327081818
-1.798381994e-07
-0.0002232914245
-1.177488117e-07
-1.784201554e-06
-2.027515818e-09
-3.74919864e-07
-1.128537898e-07
-4.135413677e-05
-2.009104635e-08
-8.773550962e-07
-9.824802351e-10
-1.631528339e-07
-2.288354101e-05
-2.035248598e-07
-0.0001019103655
-3.912289372e-06
-5.329003459e-08
-3.815264848e-10
-1.388142926e-05
-2.066904312e-08
-9.173930152e-07
-6.957230348e-09
-2.903877008e-05
-4.478794954e-09
-6.770693006e-07
-9.714079428e-08
-1.998883986e-05
-0.001799109057
-1.236217788e-08
-1.118375624e-05
-1.144499288e-07
-1.1864756e-06
-4.716258378e-06
-3.464456734e-07
-7.532453996e-11
-1.742294659e-06
-1.345426643e-06
-8.449545648e-08
-8.954221651e-07
-2.432487759e-06
-0.0001400677698
-0.001713444386
-1.075048353e-07
-4.105406541e-05
-3.733656311e-07
-1.984952182e-06
-0.001480322688
-0.0001151217974
-0.00209287627
-3.27555809e-06
-2.185782336e-09
-0.0004548139237
-0.01477027961
-3.934273672e-05
-0.001243829892
-5.430764382e-08
-4.380856265e-07
-4.297458002e-06
-1.467632945e-08
-1.820453663e-08
-2.699514835e-09
-8.420814307e-07
-8.634913084e-10
-1.182745993e-06
-8.508146264e-09
-7.184712053e-07
-1.192590185e-06
-1.766408443e-08
-0.002934313619
-1.283384372e-06
-6.255055172e-06
-8.703331507e-06
-9.664774229e-06
-2.675288802e-09
-3.392650797e-08
-0.0001071682868
-5.832833131e-09
-8.881117172e-08
-0.0002166070842
-1.248608916e-08
-1.726759584e-06
-2.99705455e-06
-2.119854874e-07
-7.412646571e-06
-2.755998704e-08
-9.960376424e-06
-3.051416349e-05
-1.129492506e-08
-2.619064731e-08
-5.532504512e-10
-2.177158595e-10
-0.0003851956976
-4.247896087e-05
-1.005180535e-08
-7.063067217e-08
-0.0002453874122
-6.569452237e-09
-2.430119913e-06
-1.727937098e-07
-1.211730869e-05
-9.94795514e-06
-0.0001605757277
-5.961378248e-08
-1.63764285e-06
-1.925056588e-07
-1.895751671e-05
-3.584139499e-09
-2.424148932e-07
-0.001006931825
-1.003162717e-06
-1.237484464e-06
-2.006432918e-06
-1.665677334e-05
-8.731387573e-06
-1.333871332e-07
-7.301399559e-09
-0.0005093528313
-7.645422963e-08
-2.020202554e-06
-6.813091876e-08
-1.10814416e-06
-1.95551597e-05
-2.003879505e-06
-3.670933614e-07
-1.728622505e-07
-0.0007263797041
-1.41191122028095e-05
-1.571311147e-07
-3.392287113e-06
-1.377047714e-09
-6.630650805e-07
-5.227904356e-08
-1.127011492e-06
-0.0003754771874
-1.865169444e-07
-6.576952888e-06
-3.329497044e-06
-7.07257004e-06
-2.88154104e-07
-1.985441412e-07
-6.929088895e-08
-2.512260458e-06
-6.217791051e-06
-3.877741985e-07
-1.707903155e-08
-5.10233078e-08
-4.572653519e-09
-0.1095009268
-7.449132821e-07
-2.09740422e-06
-9.378911822e-09
-7.910046337e-08
-1.223499404e-05
-2.672193111e-10
-2.314556691e-08
-3.503343355e-13
-1.602894349e-07
-5.890632996e-07
-1.487885964e-05
-1.978704988e-05
-2.552121299e-08
-3.565602472e-08
-0.0004467518296
-9.443687582e-10
-1.363026913e-06
-2.235788016e-07
-1.136525751e-07
-2.962478329e-08
-9.303967807e-06
-3.925082515e-10
-1.017880604e-05
-1.434347997e-08
-4.47759051e-06
-1.996980966e-09
-4.66863509e-05
-5.845204451e-06
-1.509519246e-07
-1.741949098e-06
-2.215116471e-10
-1.532616641e-06
-1.571651059e-08
-7.107477006e-05
-7.234687759e-06
-1.621643207e-06
-2.56453036e-08
-8.069391642e-09
-2.035933164e-07
-7.550717369310519e-08
-8.659572881e-06
-0.0004321439671563004
-3.337724504e-05
-4.782082889e-05
-2.323101105e-08
-1.19309915e-05
-0.0001350492201
-2.75397447e-06
-1.823126697e-08
-2.411767675e-05
-2.283494193e-09
-3.766390067e-08
-3.588343942e-05
-6.787383948e-05
-8.832490704e-10
-7.778718617e-10
-1.917361443e-08
-5.849351718e-06
-2.28541183e-06
-6.146818441e-06
-1.827359426e-05
-3.231234221e-05
-9.921186251e-07
-3.779404373e-09
-1.924149804e-05
-7.698409214e-06
-1.221205448e-06
-1.642479046e-06
-3.301215266e-07
-0.0004602920172
-3.293196018e-07
-3.950685019e-07
-2.805273751e-05
-1.739207752e-08
-3.773037585e-06
-1.537008391e-06
-2.434913209e-08
-8.315956868e-05
-6.88859927e-06
-6.869368159e-08
-4.672444205e-09
-7.02639721e-05
-7.305366536e-07
-2.162269825e-05
-0.0004328624246
-1.653264992e-07
-1.553411281e-05
-5.165593047e-10
-2.153731042e-10
-8.592408471e-09
-8.974979512e-09
-7.520620911e-07
-2.080333069e-07
-1.653991504e-07
-9.9043617e-09
-6.542874961e-09
-0.0005318553158
-1.144555776e-05
-6.936210932e-05
-7.62010085e-08
-1.834443898e-08
-8.099206646e-06
-1.946663573e-09
-4.916072586e-06
-2.013222915e-05
-8.510967278e-07
-3.442296018e-07
-1.194853419e-07
-1.251233575e-07
-2.847893723e-06
-2.519238034e-06
-3.662564708e-07
-1.646271735e-07
-5.373793619e-07
-4.353476735e-08
-8.727968448e-08
-1.053026857e-05
-1.083603462e-06
-1.461412043e-06
-1.220147207e-06
-0.0009307060856
-3.48570189e-07
-2.208034886e-08
-8.740398335e-08
-0.0001005182181
-5.658935843e-06
-3.660460092e-07
-5.210218655e-06
-1.176510494e-09
-1.167510222e-09
-1.74723538e-07
-4.652418777e-10
-1.639422267e-06
-9.200100093e-06
-0.0001764752281
-7.379070775e-09
-2.542944745e-07
-3.717769041983323e-06
-4.778249403e-10
-6.09916388e-07
-7.389397856e-06
-1.030208854e-08
-5.091853226e-08
-1.929321992e-06
-2.953703561e-07
-1.428266933e-08
-3.65646162e-05
-8.358213962e-06
-1.269052515e-05
-3.142034606e-10
-1.192354439e-08
-3.42519028e-07
-1.238073279e-05
-4.592188983e-07
-4.907760576e-08
-2.605803561e-07
-1.290266109e-06
-8.91015308e-08
-1.171147313e-05
-6.948329894e-06
-0.0001320627046
-4.467361346e-08
-1.343011103e-06
-4.69742523e-09
-1.674877668e-07
-1.158457021e-07
-7.247035325e-08
-0.0001328992567
-1.456012145e-05
-1.974800428e-05
-9.916997919e-05
-7.076016655e-07
-7.36330363e-07
-8.750739052e-07
-2.098702267e-05
-1.224885671e-06
-6.974041336e-07
-6.433390899e-08
-1.654868124e-05
-0.0009302881479
-1.821579155e-07
-6.800514105e-07
-1.766155755e-07
-8.004650647e-07
-9.941901599e-05
-2.06752057e-05
-5.066538235e-11
-1.506772094e-06
-8.10845767e-05
-7.610845142e-05
-0.0002115710954
-2.12571763e-09
-2.910738954e-06
-9.48875277e-06
-1.847390948e-06
-7.436554496e-05
-1.286439322e-10
-1.413106449e-06
-4.724231895e-08
-5.001854028e-07
-1.14055774e-06
-6.718621271e-11
-8.472867506e-09
-8.494930984e-08
-2.498427647e-07
-6.987204698e-06
-4.08117914e-06
-2.82229796e-07
-3.98589612e-09
-6.278231145e-05
-9.793860499e-07
-9.666736058e-07
-2.708628413e-06
-3.490044251e-07
-3.782645161e-10
-8.131830282e-08
-6.664325458e-06
-2.365503287e-08
-1.096958037e-06
-3.776083109e-07
-2.990539686e-08
-0.002754346975
-4.047644861e-07
-1.411988389e-07
-3.694067085e-08
-0.0002320708655
-3.71338597e-07
-3.835998288e-05
-2.623922776e-05
-6.474281304e-10
-0.0003219022096
-3.356011806e-07
-5.603569089e-09
-9.856721257e-08
-2.793861685e-07
-5.195375958e-06
-2.632243695e-06
-6.350302361e-07
-3.302377879e-10
-3.043526423e-08
-2.372803041e-08
-6.617140209e-06
-6.330476168e-07
-1.870130608e-06
-2.338555597e-07
-4.591171378e-10
-5.61933523e-05
-1.955958771e-08
-3.044175709e-08
-5.161106748e-08
-0.0001378680549
-2.750711746e-09
-2.289389014e-08
-4.001113699e-09
-2.236415233e-10
-3.473425904e-06
-7.311516826e-06
-8.898096465e-08
-1.481216022e-08
-2.435208033e-12
-1.189787819e-10
-5.333724185e-06
-4.66437667e-11
-2.381386364e-10
-1.249165957e-08
-1.128630934e-07
-1.550941521e-06
-2.297705942e-12
-5.846728434e-10
-4.069354108e-10
-4.063144762e-08
-1.749554102e-08
-5.155167146e-11
-1.688297139e-11
-2.774930205e-09
-6.091667068e-08
-2.87170322e-10
-3.66643664e-10
-8.258926512e-10
-7.390910771e-09
-1.48715158e-10
-6.565786352e-12
-3.475089984e-09
-2.002380042e-09
-7.274321744e-11
-6.359749104e-09
-7.940393308e-13
-1.098611945e-06
-7.438494044e-07
-2.339207348e-10
-4.499165346e-09
-3.082882191e-09
-1.878464872e-10
-4.005585989e-09
-2.63828057e-10
-2.218789497e-09
-5.827641219e-09
-1.543332934e-10
-4.907581247e-10
-6.901620609e-10
-2.088068542e-13
-7.837109261e-10
-1.937213353e-10
-1.715044299e-08
-4.069918057e-06
-2.91951045e-08
-1.565114165e-08
-3.443423804e-08
-1.256948998e-07
-4.363190898e-09
-2.287393528e-12
-6.966944807e-09
-5.995890076e-08
-1.289835012e-10
-1.695089305e-10
-2.301282525e-11
-9.445474271e-09
-2.115405965e-08
-1.662358545e-09
-1.025068565e-09
-9.719373728e-11
-1.732767627e-11
-4.41946888e-11
-5.657095809e-11
-5.288528777290672e-07
-5.324238867e-07
-2.221589565e-07
-2.48971658e-09
-2.994534368049623e-09
-1.075626423e-09
-7.782686578e-11
-2.946128307e-11
-3.399399058e-11
-1.446405065e-08
-2.187225844e-08
-7.820238975e-09
-2.40229777e-09
-7.46594076e-10
-1.281010307e-06
-3.598219943e-08
-1.251224651967984e-08
-3.332304338e-11
-7.617797708e-10
-9.909367591e-11
-4.653906139e-10
-3.587191007e-06
-4.446718734e-08
-1.894297128e-09
-4.744577059e-05
-4.433959517e-09
-2.210850439e-08
-1.036168503e-09
-1.103345617e-07
-4.995240386e-08
-8.363740584e-12
-3.281022886e-10
-3.148002148e-08
-6.330439107e-10
-3.863775656e-10
-5.96035067e-10
-4.255627067e-11
-1.165981634e-07
-2.50543766e-09
-1.33188621e-10
-9.172189534e-07
-6.582275731e-08
-1.542558412e-10
-1.297572348e-09
-8.107196167e-09
-2.070977659e-06
-6.93677041e-09
-2.329665548e-07
-2.684341075e-07
-3.375521064e-12
-4.781691571e-11
-5.350983865e-09
-9.177711402e-10
-3.059268527e-08
-1.113405482e-07
-5.998651665e-10
-3.911876462e-10
-1.176693635e-08
-8.69340171e-10
-2.320788866e-05
-2.036112191e-07
-3.21298594e-08
-7.12985182e-08
-1.481220144e-09
-9.13398584e-07
-9.416502413e-11
-1.481517933e-08
-2.317808347e-06
-3.901257454e-08
-4.627625989e-12
-2.494572686e-08
-9.094749026e-10
-1.731947437e-08
-2.095822035e-08
-7.215930164e-08
-2.372708431e-09
-9.374174236e-13
-1.029823717e-11
-5.170363884761981e-07
-3.317414045e-07
-1.109713675e-08
-6.47170925e-07
-1.864432618e-06
-3.397275076e-11
-4.168205664e-08
-1.346830208e-11
-3.171866069e-06
-7.866352681e-11
-3.289251567e-10
-7.057976269e-14
-2.67944287e-07
-4.480095364e-10
-2.542532019e-10
-1.046877898e-09
-4.692930721e-12
-5.841384928e-10
-5.254681082e-07
-9.003591534e-11
-3.637362188e-13
-9.047013259e-09
-1.769883631e-08
-9.48770427e-07
-1.037626188e-10
-7.931261407e-08
-2.511617984e-07
-1.749603857e-09
-1.158718175e-07
-1.833652906e-06
-4.450176914e-08
-5.71537314e-10
-1.070556403e-10
-2.448737924e-10
-6.262272951e-06
-2.141707476e-08
-4.258981326e-09
-5.49246536e-09
-9.566266675e-12
-3.797543387e-11
-2.705369876e-08
-4.238910221e-07
-1.784747449e-09
-3.595414385e-08
-3.222996111e-09
-6.210164067e-05
-2.258039015e-08
-1.191514021e-13
-1.513303142e-06
-9.658853509e-11
-5.082215114e-06
-9.44022394e-10
-8.437053744e-09
-1.463048848e-10
-3.444930056e-09
-7.868562747e-12
-1.272388225e-11
-3.427574116e-10
-8.990110201e-08
-2.83369365e-11
-3.0757007e-10
-5.265605701e-14
-4.26291208e-13
-7.393316606e-13
-5.385884913e-05
-8.367430153e-10
-1.271720599e-05
-8.40960929e-11
-6.150536572e-08
-5.764038353e-10
-1.4827533e-05
-2.322813811e-10
-4.431637476e-09
-1.319799794e-08
-1.965682244e-09
-5.782112632e-06
-7.526132679e-07
-1.075618822e-09
-1.712525448e-09
-3.952010247e-07
-3.136663182e-10
-1.366784094e-10
-2.291961377e-13
-7.468862634e-11
-2.13931093e-07
-2.325391866e-09
-7.657293509e-07
-3.023206769e-07
-1.974192114e-11
-2.239591754e-13
-1.575764712e-08
-3.894706527845038e-07
-2.463427596e-09
-1.169483637e-07
-7.445202399e-07
-3.876016309e-06
-6.204312046e-07
-5.089616453e-10
-2.563342578e-13
-4.109081761499578e-09
-8.534723944e-11
-3.062921512e-14
-5.084635637e-08
-3.964438906e-09
-9.56064042e-09
-5.713458485e-07
-8.602373058e-10
-9.674381801e-09
-5.575533604e-08
-7.736937052e-10
-5.25696461e-10
-2.604611015e-08
-5.185877553e-08
-5.136914596e-07
-4.457967612e-09
-7.087532094e-06
-2.866869842e-09
-2.555695269e-07
-1.14983411e-06
-2.121499808e-11
-6.538598731e-11
-4.397576097e-10
-1.68339254e-10
-7.632177773e-10
-3.194450213e-07
-4.743002807e-08
-5.174172592e-09
-1.378394044e-06
-0.0001075134541
-0.0002104593459
-1.291514756e-09
-1.113812317e-09
-2.836821935e-07
-2.119414007e-05
-3.257830135e-07
-6.904331208e-08
-1.133565101e-07
-2.515736584e-07
-2.868370103e-07
-1.316255824e-07
-1.143196584e-07
-6.920318567e-10
-1.261652011e-08
-7.917924522e-13
-7.954494796e-10
-6.551135771e-09
-5.085806996e-09
-1.197408695e-11
-7.765435603e-11
-1.137649191e-10
-9.984771335e-11
-1.206636661e-07
-9.837079112e-09
-3.488285266e-08
-4.035219127e-08
-1.411962856e-08
-1.030986206e-07
-0.0001339305599
-2.858760077e-12
-3.300471596e-09
-1.938419056e-10
-3.176459434e-12
-1.739161428e-09
-4.024412744e-07
-3.711167254e-08
-3.68209028e-09
-9.299354827e-11
-4.060060302e-10
-1.4612779e-05
-9.474942894e-11
-6.71405306e-14
-2.422793691e-09
-1.239892236e-07
-2.586764905e-08
-3.834829456e-09
-4.981089193e-08
-5.890823747e-10
-1.712560509e-13
-5.885874705e-12
-3.850099718e-12
-5.815334596e-10
-2.871382336e-07
-3.360539652e-09
-4.474272729e-08
-4.854260426e-09
-6.835712438e-09
-4.513662362e-10
-1.937015923e-09
-3.204387319e-07
-2.834110865e-06
-2.373908594e-10
-8.959130596e-10
-2.230101714e-07
-2.935469223e-08
-1.283653118e-05
-1.768922904e-09
-1.023937016e-07
-1.810088219e-10
-1.898013563e-06
-1.555535859e-07
-2.081843632e-11
-1.130189635e-07
-5.044203176e-10
-4.419441096e-10
-8.383860763e-08
-1.081590063e-05
-4.255989963e-09
-4.961325451e-09
-4.722044461e-12
-2.605827829e-07
-6.302277862e-12
-7.401606994e-11
-5.826773899e-09
-3.775837499e-06
-7.970709192e-06
-1.077514227e-08
-4.597223421e-10
-6.830064994e-09
-2.132411988e-10
-3.596324757e-11
-6.420547725e-09
-2.577236401e-09
-3.303229315e-09
-6.18774819e-09
-4.85351932e-08
-4.830745338e-10
-3.720076558e-06
-1.356666145e-08
-2.380000545e-09
-6.934200897e-11
-3.297569231e-09
-3.435257108e-10
-5.29774949e-08
-4.382596642e-09
-2.15867853e-08
-5.682155814e-12
-2.87290739e-07
-1.68447438e-10
-3.702374348e-08
-4.342623412e-10
-6.279260244e-08
-2.403676166e-08
-6.186547757e-09
-1.906369995e-07
-4.632234292e-10
-2.755342608e-09
-1.375328487e-08
-2.872876599e-08
-6.101397141e-07
-3.268512848e-10
-2.065059787e-07
-2.629402008e-09
-4.962476519e-11
-1.388892596e-10
-6.600566104e-08
-2.769850168e-07
-8.89254745e-07
-4.790857584e-07
-8.513434203e-09
-2.371056219e-11
-1.969882102e-08
-1.194180775e-06
-2.536127752e-06
-3.538123306e-11
-7.535922813e-11
-3.279643366e-09
-5.915578256e-09
-3.02572337e-12
-2.425014125e-08
-1.736441207e-08
-9.148487522e-11
-2.773967859e-09
-6.97620218e-08
-1.281934525e-09
-3.47740087e-11
-7.026364385e-12
-3.159133311e-08
-2.31268605e-06
-1.021090566e-11
-6.311611218e-10
-3.496527402152061e-09
-5.006407047e-09
-1.086254132e-09
-6.442848457e-07
-3.40398573e-08
-1.040533844e-07
-2.015250069e-08
-2.367399296e-08
-1.455786943e-08
-4.519557691e-07
-6.28474478e-08
-1.681943257e-08
-3.350671592e-10
-1.788948112e-11
-8.659128848e-08
-1.581729673e-10
-3.16899147e-08
-1.269452476e-09
-3.307661094e-11
-6.743047887e-11
-4.30353612e-10
-1.049230002e-07
-7.726948943e-12
-5.740327635e-07
-7.011998453e-07
-5.337360544e-09
-6.364224996e-09
-6.365307921e-10
-7.724490255e-10
-2.368415063e-08
-1.761719259305042e-07
-3.074395438e-08
-5.988468898e-06
-1.432688658e-12
-7.971925347e-11
-1.851944696e-07
-1.679623381e-10
-6.480885684e-06
-9.759515118e-09
-3.448768806e-09
-7.000972121e-11
-2.170432891e-09
-5.016191785e-09
-1.49812676e-09
-5.87915813e-10
-6.048689475e-10
-1.149696962e-08
-8.392285319e-11
-2.869985172e-13
-9.120207147e-09
-1.023039271e-06
-1.843349283e-11
-1.00493373e-06
-1.437966503e-09
-3.104285805e-06
-3.736848159e-10
-9.594800986e-11
-1.232024101e-11
-3.535931521e-07
-7.131216184e-08
-2.337326742e-10
-2.82410779e-07
-3.138271299e-08
-5.494774408e-12
-3.07020008e-12
-2.011245542e-10
-1.461453727e-11
-3.082048934e-09
-1.460968738e-10
-3.186600527e-07
-8.613894657e-10
-4.227362638e-07
-1.132945088e-08
-1.385877833e-08
-2.535124307e-09
-5.647614453e-08
-1.712204167e-10
-9.689130473e-07
-2.23306088e-09
-2.607948681e-11
-1.678634611e-13
-2.258659145e-06
-1.695727868e-09
-1.706090682e-11
-4.758749915e-12
-1.426536131e-05
-1.449437791e-07
-4.24476422e-08
-3.617494916e-10
-8.345680248e-12
-7.09135827e-13
-8.179812515e-09
-3.323888637e-09
-1.436305431e-08
-5.885631636e-10
-3.584884074e-08
-9.15498181e-09
-9.640861937e-11
-1.908907816e-09
-2.558536978e-10
-5.232929043e-10
-1.261308954e-09
-2.535469757e-10
-1.402741054722527e-06
-9.405064753e-10
-1.920855926e-07
-4.40419547e-11
-5.00514635e-10
-1.406592654e-07
-4.52773411e-10
-4.146849421e-07
-1.166300995e-07
-7.051208905e-09
-4.118573924e-09
-9.269115967e-07
-1.08066004e-10
-1.045618377e-06
-4.94758944e-07
-6.160229109e-12
-1.351649588024934e-08
-2.784256537e-09
-1.934517844e-08
-5.314666753e-13
-1.357165448e-09
-4.977436192e-12
-6.477152561e-11
-4.234578629e-08
-4.918295292e-13
-3.683451803e-08
-3.727223271e-09
-1.040244287e-09
-6.604553745e-10
-3.806952288e-09
-1.097089218e-08
-1.705682648e-08
-6.319891143e-07
-1.574130537e-09
-3.013782963e-08
-4.772880086e-09
-3.679484278e-09
-8.938611559e-10
-5.601588127e-09
-1.526952592e-05
-3.497239887e-10
-9.33354413e-08
-1.359301132e-08
-6.404370059e-11
-1.535628496e-11
-2.243494388e-09
-4.662210325e-09
-1.022052539e-10
-1.383917366e-07
-1.619072147e-12
-1.507995029e-08
-2.056138551e-09
-1.984766447e-05
-5.313284134e-09
-1.04749306e-08
-1.156452533e-07
-1.201443255e-06
-1.584111891e-09
-2.09858386e-11
-3.445445203e-09
-4.164676e-06
-4.092776954e-12
-9.944337818e-10
-5.276009823e-09
-3.628978704e-11
-2.197020798e-10
-1.052815682e-08
-1.068627029e-08
-3.831431452e-11
-1.364029236e-07
-3.403124343e-10
-5.38162347e-08
-6.729323819e-12
-1.207769187e-07
-4.017542328e-09
-1.315684128e-08
-7.126836658e-11
-1.491126652e-07
-7.209030864e-10
-6.628062787e-08
-1.21591155e-10
-6.230923352e-09
-0.000101234359
-5.30942773e-10
-5.741385346e-10
-2.429893426e-08
-7.325998025e-12
-3.533987787e-09
-7.926231814e-10
-8.291189826e-11
-3.746302962e-11
-5.242302307e-11
-8.718447375e-08
-6.176050515e-11
-6.09961364e-09
-2.644343829e-09
-2.306901235e-08
-7.322320056e-10
-1.884045094e-06
-3.755632286e-08
-1.659778169e-08
-5.495025114e-08
-3.546727594e-09
-2.674246643e-07
-1.028252112e-09
-9.289249703e-06
-7.959960572e-08
-1.068081079e-11
-5.674343265e-07
-6.214463157e-09
-1.601066932e-06
-1.977738539e-06
-3.462786645e-07
-7.373697384e-09
-5.726726532e-12
+2.928617337e-06
+1.647083496e-06
+6.792718307e-07
+8.309052795e-05
+1.188563005e-09
+7.418703203e-09
+4.64176585e-07
+4.469210588e-07
+6.108953218e-06
+2.937369558e-06
+4.834662872e-06
+8.222916804e-06
+1.984842145e-06
+4.724279533e-06
+2.284467423e-07
+6.086670249e-08
+9.402694313e-07
+2.134890127e-05
+1.344127063e-06
+6.325064033e-08
+5.042105356e-06
+0.0002284967536
+2.294811317e-06
+6.277634042e-05
+1.336994329e-07
+3.953756759e-06
+9.658399826e-05
+2.316822172e-06
+2.819631851e-07
+0.0001081195238
+3.432930003e-06
+3.368456504e-06
+1.112864917e-08
+3.295369143e-07
+3.989490572e-10
+1.948758233e-05
+3.510758397e-07
+3.210138517e-07
+3.239664339e-06
+8.604705327e-06
+7.617690755e-10
+1.878849261e-06
+8.602382866e-09
+2.905076666e-09
+9.580640762e-08
+2.761322408e-07
+1.121735761e-05
+8.305550955e-07
+3.094512747e-06
+9.008871903e-07
+3.660037761e-07
+4.545298754e-08
+1.619265714e-09
+0.01367608992
+3.915696743e-06
+2.025165585e-06
+3.681426282e-09
+4.179813437e-06
+3.072778246e-08
+8.896098616e-07
+3.025899647e-08
+1.817366927e-09
+4.337353756e-10
+1.271872323e-06
+6.04489128e-06
+9.893120074e-09
+1.214081986e-05
+2.958624219e-08
+2.061238904e-09
+1.930294996e-05
+6.299188205e-07
+2.643963602e-07
+2.06132771e-06
+4.342452252e-05
+8.291567369e-07
+2.498958153e-06
+4.358403281e-06
+9.241515571e-05
+9.124195104e-05
+0.000115945869
+2.350206043e-06
+7.845167967e-06
+0.000638524343
+4.723346316e-08
+6.954346838e-09
+5.357593527e-06
+1.473700863e-07
+1.053983829e-07
+5.919949754e-07
+1.175787989e-05
+1.546190854e-07
+0.0004236014522
+3.617348006e-06
+4.516789165e-05
+3.955639799e-05
+0.0001365301129
+5.126068859e-05
+1.077721123e-06
+1.018738183e-08
+2.31035007e-09
+6.836601309e-07
+5.827486967e-09
+1.557627741e-09
+6.04883445e-05
+1.652825805e-07
+2.956934131e-07
+3.715517348e-06
+1.403902522e-08
+2.060672536e-07
+0.001033124848
+9.772923916e-07
+2.935927964e-05
+1.151232995e-05
+7.794558457e-06
+2.174319802e-05
+4.056670359e-08
+2.955320268e-08
+8.030711247e-05
+2.603164139e-07
+0.0001681638933
+2.93007525e-08
+7.196892999e-05
+1.920951539e-06
+3.637534963e-09
+7.893685649e-06
+0.0001175194162
+4.802829388e-10
+4.835469293e-07
+2.878769998e-05
+1.898685256e-09
+2.754462006e-08
+1.403651125e-10
+5.826442197e-07
+2.43372504e-06
+7.927550152e-06
+1.020962274e-08
+1.052564287e-07
+7.737037652e-06
+3.40057811e-06
+2.714499296e-08
+2.377749398e-09
+0.0001490838408
+9.612641064e-11
+1.654718689e-05
+1.570703582e-07
+1.609375559e-06
+6.94622935e-08
+0.04337706424
+9.860599192e-06
+1.103383561e-05
+0.01558774793
+1.359111595e-06
+2.104947148e-07
+4.483240938e-08
+2.52721137e-08
+4.136183848e-07
+1.75959296e-07
+4.162277212e-07
+3.660655583e-07
+2.475053461e-06
+2.142026381e-05
+3.962155608e-07
+5.075132791e-06
+2.831915934e-08
+8.260063969e-08
+2.191422806e-08
+7.392509744e-05
+5.57319664e-10
+1.264487785e-08
+3.373106258e-05
+1.515627561e-07
+4.183562189e-07
+1.162273072e-07
+7.731661725e-06
+1.077580922e-05
+2.331616561e-07
+4.316200243e-10
+4.055086645e-09
+1.282320598e-09
+1.905109513e-09
+2.799643084e-07
+6.42991509e-08
+3.336097219e-07
+2.847456008e-07
+2.87996438e-05
+5.034716477e-08
+0.0001697825431
+7.357721468e-08
+1.312946382e-07
+1.494639153e-07
+1.309657132e-09
+1.452591322e-08
+7.003335472e-07
+2.392819852e-06
+6.228178425e-06
+2.32203151e-07
+8.171995835e-08
+4.289175929e-07
+2.618956983e-07
+7.684822085e-06
+3.930002297e-10
+1.235455443e-06
+4.345617106e-07
+1.019571055e-07
+1.014379889e-05
+1.198488003e-05
+3.072332076e-05
+2.471407108e-06
+6.141337359e-06
+2.217748858e-05
+7.506667147e-07
+4.156515027e-07
+0.0003928577459
+6.192388402e-07
+9.058439765e-07
+7.767728411e-06
+1.506511059e-06
+1.438338227e-08
+1.393891846e-07
+7.338259665e-05
+1.013820716e-07
+1.941576288e-05
+1.098253136e-06
+7.583333968e-07
+1.924002116e-08
+2.683360604e-06
+0.0005387099327
+4.513913649e-09
+7.344897056e-06
+4.863287455e-08
+5.137627244e-07
+1.340998671e-07
+1.385068639e-09
+0.001475702054
+4.766804909e-09
+2.788096601e-07
+4.884961794e-07
+4.389879349e-07
+0.000605687279
+2.260914346e-06
+1.622018609e-07
+8.044214563e-07
+0.00287427997
+8.545033973e-05
+2.859858841e-07
+3.519981239e-05
+3.838329691e-05
+6.701261402e-12
+6.711423424e-09
+1.221689939e-07
+4.175349671e-09
+1.276073867e-06
+9.349187354e-06
+5.09324804e-07
+2.102018112e-05
+2.546892483e-06
+4.307286548e-07
+0.0001405053615
+1.532562441e-06
+0.0043269957
+1.798346185e-07
+0.0002232869764
+1.177464656e-07
+1.784165987e-06
+2.027475413e-09
+3.749124642e-07
+1.128514896e-07
+4.135331177e-05
+2.009064605e-08
+8.773376156e-07
+9.824605427e-10
+1.631495832e-07
+2.288308451e-05
+2.035208047e-07
+0.0001019083349
+3.912211406e-06
+5.328897283e-08
+3.815188832e-10
+1.388115787e-05
+2.066863131e-08
+9.173747359e-07
+6.957092901e-09
+2.903819076e-05
+4.478705717e-09
+6.770557613e-07
+9.713885883e-08
+1.99884353e-05
+0.00179907318
+1.236193169e-08
+1.118353017e-05
+1.144476494e-07
+1.186451992e-06
+4.716164372e-06
+3.464387694e-07
+7.532303889e-11
+1.742260009e-06
+1.345400054e-06
+8.449377298e-08
+8.954043245e-07
+2.432439258e-06
+0.000140064979
+0.001713410238
+1.075027005e-07
+4.105324765e-05
+3.733581957e-07
+1.98491263e-06
+0.001480293332
+0.000115119501
+0.002092834408
+3.27549321e-06
+2.185738747e-09
+0.0004548048702
+0.01476996084
+3.934195111e-05
+0.001243805117
+5.430656178e-08
+4.380768976e-07
+4.297371205e-06
+1.467603532e-08
+1.820417519e-08
+2.69946112e-09
+8.420646529e-07
+8.634740669e-10
+1.18272243e-06
+8.507977199e-09
+7.184568904e-07
+1.19256643e-06
+1.766373439e-08
+0.002934256247
+1.283358802e-06
+6.25493059e-06
+8.703159136e-06
+9.664582837e-06
+2.675235499e-09
+3.392583208e-08
+0.0001071661518
+5.832716966e-09
+8.880940377e-08
+0.0002166027692
+1.248584038e-08
+1.726725176e-06
+2.996994836e-06
+2.119813038e-07
+7.412498676e-06
+2.755943745e-08
+9.960177922e-06
+3.051353704e-05
+1.129469998e-08
+2.619012548e-08
+5.532394281e-10
+2.177115217e-10
+0.000385188033
+4.24781146e-05
+1.005160549e-08
+7.062926491e-08
+0.0002453825231
+6.569321281e-09
+2.430064335e-06
+1.72790267e-07
+1.211706684e-05
+9.947756935e-06
+0.0001605725284
+5.961264107e-08
+1.637610222e-06
+1.925017924e-07
+1.895713903e-05
+3.584070555e-09
+2.424100642e-07
+0.00100691167
+1.00314273e-06
+1.237459693e-06
+2.006393648e-06
+1.665644179e-05
+8.731214124e-06
+1.333844755e-07
+7.301254085e-09
+0.0005093424595
+7.645270509e-08
+2.020155895e-06
+6.812955519e-08
+1.108122048e-06
+1.955477011e-05
+2.003839607e-06
+3.670861157e-07
+1.728588066e-07
+0.0007263652123
+1.411883089e-05
+1.57127984e-07
+3.392219563e-06
+1.377020396e-09
+6.630519487e-07
+5.22780019e-08
+1.126988334e-06
+0.0003754697012
+1.865132299e-07
+6.576821868e-06
+3.329430704e-06
+7.072429086e-06
+2.881483653e-07
+1.985401854e-07
+6.928951207e-08
+2.512210403e-06
+6.217628744e-06
+3.877664708e-07
+1.707869127e-08
+5.102229121e-08
+4.572562413e-09
+0.1094987466
+7.448984403e-07
+2.097362549e-06
+9.378724955e-09
+7.909888639e-08
+1.223474695e-05
+2.672139756e-10
+2.314510579e-08
+3.503273554e-13
+1.60286267e-07
+5.890515619e-07
+1.487856468e-05
+1.978663079e-05
+2.552070699e-08
+3.56553144e-08
+0.000446743015
+9.443500031e-10
+1.362999756e-06
+2.23574347e-07
+1.136503384e-07
+2.962418624e-08
+9.303781273e-06
+3.925004271e-10
+1.017860324e-05
+1.434319467e-08
+4.477501165e-06
+1.99694118e-09
+4.66854211e-05
+5.845087896e-06
+1.50948917e-07
+1.741914174e-06
+2.215072337e-10
+1.532586108e-06
+1.571619745e-08
+7.107335402e-05
+7.234543614e-06
+1.621610925e-06
+2.564479119e-08
+8.069230827e-09
+2.035891754e-07
+7.550566928e-08
+8.659400091e-06
+0.000432135357
+3.337658317e-05
+4.781987615e-05
+2.323054819e-08
+1.193074871e-05
+0.0001350465294
+2.75391678e-06
+1.823090373e-08
+2.411719368e-05
+2.283448741e-09
+3.766315025e-08
+3.588272465e-05
+6.787248878e-05
+8.832303026e-10
+7.778563208e-10
+1.917323241e-08
+5.849230322e-06
+2.285366293e-06
+6.146695971e-06
+1.827323017e-05
+3.231169839e-05
+9.920988726e-07
+3.779329381e-09
+1.924111467e-05
+7.69825658e-06
+1.221181117e-06
+1.642446586e-06
+3.301149504e-07
+0.0004602831218
+3.293132243e-07
+3.950606305e-07
+2.805226741e-05
+1.739173102e-08
+3.772962441e-06
+1.536977768e-06
+2.43486381e-08
+8.315791148e-05
+6.888462138e-06
+6.869231292e-08
+4.672351113e-09
+7.026257201e-05
+7.305220983e-07
+2.162227029e-05
+0.0004328538034
+1.653230976e-07
+1.553380485e-05
+5.165496905e-10
+2.153688131e-10
+8.592237275e-09
+8.974803982e-09
+7.52047119e-07
+2.080291683e-07
+1.653958549e-07
+9.904164203e-09
+6.542744984e-09
+0.000531844742
+1.144533099e-05
+6.936072576e-05
+7.619949025e-08
+1.834407348e-08
+8.099045298e-06
+1.946623224e-09
+4.915974524e-06
+2.013182511e-05
+8.510788604e-07
+3.442227405e-07
+1.19482958e-07
+1.251208094e-07
+2.847837381e-06
+2.519188271e-06
+3.662492908e-07
+1.646238933e-07
+5.373686421e-07
+4.353389866e-08
+8.727794552e-08
+1.053005806e-05
+1.083581872e-06
+1.461382853e-06
+1.220121571e-06
+0.0009306878204
+3.485645992e-07
+2.207991124e-08
+8.740223411e-08
+0.0001005162172
+5.658823113e-06
+3.660387161e-07
+5.210114851e-06
+1.176487053e-09
+1.16748696e-09
+1.747200576e-07
+4.652326082e-10
+1.639389602e-06
+9.199916708e-06
+0.0001764717118
+7.378923764e-09
+2.542894196e-07
+3.717694969e-06
+4.778153607e-10
+6.099042667e-07
+7.389253413e-06
+1.03018836e-08
+5.091752513e-08
+1.929282765e-06
+2.953644841e-07
+1.428238895e-08
+3.65638878e-05
+8.358046608e-06
+1.269027303e-05
+3.141972004e-10
+1.192330682e-08
+3.425122036e-07
+1.238048594e-05
+4.592097513e-07
+4.907663521e-08
+2.605751798e-07
+1.290240408e-06
+8.909975732e-08
+1.171123948e-05
+6.948191451e-06
+0.0001320600695
+4.467272334e-08
+1.342984323e-06
+4.697331637e-09
+1.674844316e-07
+1.158433939e-07
+7.246890859e-08
+0.0001328966329
+1.455983069e-05
+1.974761595e-05
+9.916801323e-05
+7.07587568e-07
+7.363156082e-07
+8.750552305e-07
+2.098660427e-05
+1.224863673e-06
+6.973895334e-07
+6.433262719e-08
+1.65483483e-05
+0.0009302696124
+1.821542748e-07
+6.800378641e-07
+1.766120464e-07
+8.004491159e-07
+9.941703505e-05
+2.067479421e-05
+5.066437288e-11
+1.506742077e-06
+8.108300003e-05
+7.610696189e-05
+0.0002115668797
+2.125674742e-09
+2.910679195e-06
+9.488563678e-06
+1.847352953e-06
+7.436406293e-05
+1.286413705e-10
+1.413078284e-06
+4.724137688e-08
+5.001760652e-07
+1.140535015e-06
+6.718486985e-11
+8.472698691e-09
+8.494761782e-08
+2.498377868e-07
+6.987065516e-06
+4.081098152e-06
+2.822241728e-07
+3.985816309e-09
+6.27810604e-05
+9.793665521e-07
+9.666541857e-07
+2.708574051e-06
+3.489974641e-07
+3.782569786e-10
+8.131668264e-08
+6.664191677e-06
+2.365456156e-08
+1.096935914e-06
+3.77600791e-07
+2.990480133e-08
+0.002754292096
+4.047564209e-07
+1.411960244e-07
+3.69399348e-08
+0.0002320662158
+3.713311984e-07
+3.835921825e-05
+2.623885825e-05
+6.474152282e-10
+0.0003218958043
+3.35594494e-07
+5.603457411e-09
+9.856525159e-08
+2.793807664e-07
+5.195272481e-06
+2.632191143e-06
+6.350175836e-07
+3.302312082e-10
+3.043465789e-08
+2.372756421e-08
+6.617008787e-06
+6.330350038e-07
+1.87009364e-06
+2.338509504e-07
+4.591079902e-10
+5.619228611e-05
+1.955919798e-08
+3.044115064e-08
+5.161003917e-08
+0.0001378653082
+2.75065694e-09
+2.289343402e-08
+4.00103398e-09
+2.236370675e-10
+3.473356692e-06
+7.311371105e-06
+8.897919195e-08
+1.481186501e-08
+2.435159627e-12
+1.189764093e-10
+5.333618139e-06
+4.664283736e-11
+2.381338932e-10
+1.249141019e-08
+1.128608436e-07
+1.550910634e-06
+2.297659982e-12
+5.846612314e-10
+4.069273229e-10
+4.063063753e-08
+1.749519244e-08
+5.155065374e-11
+1.688263366e-11
+2.774873693e-09
+6.091545766e-08
+2.871646004e-10
+3.666363559e-10
+8.258762033e-10
+7.390763165e-09
+1.487121411e-10
+6.565655534e-12
+3.475020746e-09
+2.002340151e-09
+7.274176809e-11
+6.359622393e-09
+7.94023499e-13
+1.098589837e-06
+7.438345866e-07
+2.339160741e-10
+4.499075704e-09
+3.082821024e-09
+1.878422387e-10
+4.005506099e-09
+2.638228004e-10
+2.218745508e-09
+5.827525081e-09
+1.543301813e-10
+4.907483457e-10
+6.901483311e-10
+2.088026801e-13
+7.836953093e-10
+1.937174755e-10
+1.715010225e-08
+4.069836853e-06
+2.919452232e-08
+1.565082965e-08
+3.4433546e-08
+1.256924112e-07
+4.363104327e-09
+2.287347968e-12
+6.966805897e-09
+5.995770348e-08
+1.289809313e-10
+1.695055516e-10
+2.301236675e-11
+9.445286023e-09
+2.11536282e-08
+1.662325435e-09
+1.025048152e-09
+9.719163301e-11
+1.732729349e-11
+4.419380825e-11
+5.656983099e-11
+5.288423408e-07
+5.324133016e-07
+2.221547731e-07
+2.489666974e-09
+2.994474704e-09
+1.075604993e-09
+7.782531146e-11
+2.946069638e-11
+3.399331328e-11
+1.446376248e-08
+2.187182264e-08
+7.82008326e-09
+2.402248677e-09
+7.465791364e-10
+1.280984452e-06
+3.59815576e-08
+1.251199722e-08
+3.332237947e-11
+7.61764668e-10
+9.909170155e-11
+4.653813812e-10
+3.587118654e-06
+4.446631546e-08
+1.894259386e-09
+4.744482097e-05
+4.433870092e-09
+2.21080639e-08
+1.03614786e-09
+1.103323529e-07
+4.99514086e-08
+8.363573856e-12
+3.280957443e-10
+3.14793974e-08
+6.330314597e-10
+3.863698763e-10
+5.960231262e-10
+4.255542277e-11
+1.165958403e-07
+2.505387626e-09
+1.331859656e-10
+9.172006774e-07
+6.582144563e-08
+1.542525158e-10
+1.297546413e-09
+8.107028639e-09
+2.070936394e-06
+6.936632176e-09
+2.329619212e-07
+2.684287588e-07
+3.375453851e-12
+4.7815963e-11
+5.350876399e-09
+9.177530263e-10
+3.059207574e-08
+1.113388771e-07
+5.998531569e-10
+3.911798644e-10
+1.176672437e-08
+8.693228501e-10
+2.320742865e-05
+2.036071812e-07
+3.212921899e-08
+7.129708873e-08
+1.481190721e-09
+9.133803854e-07
+9.416314797e-11
+1.481488075e-08
+2.317757165e-06
+3.901179725e-08
+4.627532631e-12
+2.494522948e-08
+9.09456782e-10
+1.731912929e-08
+2.095780184e-08
+7.215786392e-08
+2.372661172e-09
+9.373987463e-13
+1.029803199e-11
+5.17026087e-07
+3.317347932e-07
+1.109691565e-08
+6.471580259e-07
+1.86439548e-06
+3.397207388e-11
+4.168122616e-08
+1.346803365e-11
+3.171802872e-06
+7.86619595e-11
+3.289183668e-10
+7.057835645e-14
+2.679389626e-07
+4.480005874e-10
+2.542481361e-10
+1.046857042e-09
+4.692837219e-12
+5.841268544e-10
+5.254576286e-07
+9.00341232e-11
+3.637289725e-13
+9.046831583e-09
+1.769848077e-08
+9.487515449e-07
+1.037605514e-10
+7.931101427e-08
+2.511567859e-07
+1.749569007e-09
+1.158694791e-07
+1.833616371e-06
+4.450088162e-08
+5.71525937e-10
+1.070535073e-10
+2.448689122e-10
+6.262140377e-06
+2.141665922e-08
+4.258896529e-09
+5.492356181e-09
+9.566075733e-12
+3.797467443e-11
+2.705317002e-08
+4.238826701e-07
+1.78471189e-09
+3.595342753e-08
+3.222931873e-09
+6.210042731e-05
+2.257994023e-08
+1.191490301e-13
+1.51327299e-06
+9.658649632e-11
+5.082113798e-06
+9.440035937e-10
+8.436889449e-09
+1.463019698e-10
+3.444876867e-09
+7.868402056e-12
+1.272362874e-11
+3.427505822e-10
+8.989931067e-08
+2.83363773e-11
+3.075639475e-10
+5.26550054e-14
+4.262827162e-13
+7.39316909e-13
+5.385777656e-05
+8.367263438e-10
+1.27169587e-05
+8.409442881e-11
+6.150414316e-08
+5.763923047e-10
+1.482724362e-05
+2.322767476e-10
+4.431549181e-09
+1.319773505e-08
+1.965643997e-09
+5.781996728e-06
+7.525982729e-07
+1.075597391e-09
+1.712491312e-09
+3.951931507e-07
+3.136603556e-10
+1.366756862e-10
+2.291915354e-13
+7.468688547e-11
+2.139268308e-07
+2.325345469e-09
+7.657140694e-07
+3.023146836e-07
+1.974153842e-11
+2.23954747e-13
+1.575733249e-08
+3.894628929e-07
+2.463378514e-09
+1.169459922e-07
+7.445054153e-07
+3.875934136e-06
+6.204189806e-07
+5.089515047e-10
+2.563291505e-13
+4.108999891e-09
+8.53455392e-11
+3.062860485e-14
+5.084534294e-08
+3.964359924e-09
+9.560449902e-09
+5.713347391e-07
+8.602201637e-10
+9.674189092e-09
+5.575422411e-08
+7.7367829e-10
+5.256859943e-10
+2.604559111e-08
+5.185774593e-08
+5.136812252e-07
+4.457880285e-09
+7.08739055e-06
+2.866812716e-09
+2.555644334e-07
+1.149811348e-06
+2.121457778e-11
+6.538468276e-11
+4.397488469e-10
+1.683362541e-10
+7.632025686e-10
+3.194386969e-07
+4.742908307e-08
+5.174073262e-09
+1.378366535e-06
+0.0001075113033
+0.0002104550971
+1.291489023e-09
+1.113788764e-09
+2.836765427e-07
+2.11937165e-05
+3.257765239e-07
+6.904195422e-08
+1.133542583e-07
+2.515686455e-07
+2.868313218e-07
+1.316229576e-07
+1.143173676e-07
+6.920180685e-10
+1.261626874e-08
+7.91776628e-13
+7.95433631e-10
+6.551051251e-09
+5.085705662e-09
+1.197384838e-11
+7.765260495e-11
+1.137626508e-10
+9.984571963e-11
+1.206612408e-07
+9.836882175e-09
+3.4882158e-08
+4.035134021e-08
+1.411934725e-08
+1.030965664e-07
+0.0001339279091
+2.858703113e-12
+3.300405884e-09
+1.93837976e-10
+3.176396146e-12
+1.739126777e-09
+4.024332505e-07
+3.711093586e-08
+3.682019148e-09
+9.299169562e-11
+4.059979323e-10
+1.46124585e-05
+9.47475461e-11
+6.713919288e-14
+2.422745433e-09
+1.239867471e-07
+2.586712504e-08
+3.834753794e-09
+4.980992443e-08
+5.89070658e-10
+1.712526376e-13
+5.885757434e-12
+3.850022999e-12
+5.81521873e-10
+2.871328231e-07
+3.360472696e-09
+4.474183737e-08
+4.854163466e-09
+6.835578263e-09
+4.513572379e-10
+1.936977318e-09
+3.204323474e-07
+2.834054461e-06
+2.373861791e-10
+8.958952159e-10
+2.230057738e-07
+2.935410608e-08
+1.283627624e-05
+1.768887803e-09
+1.023916614e-07
+1.810052154e-10
+1.897974483e-06
+1.555504868e-07
+2.081802153e-11
+1.130167125e-07
+5.044103042e-10
+4.419353612e-10
+8.383693984e-08
+1.081564925e-05
+4.255910847e-09
+4.961228471e-09
+4.721951011e-12
+2.605775896e-07
+6.302152575e-12
+7.401459523e-11
+5.826657822e-09
+3.775763541e-06
+7.970550383e-06
+1.07749277e-08
+4.597131766e-10
+6.829928693e-09
+2.132369311e-10
+3.596253106e-11
+6.42042013e-09
+2.577185048e-09
+3.303168482e-09
+6.187624832e-09
+4.853422661e-08
+4.830648803e-10
+3.720002445e-06
+1.356639118e-08
+2.379953128e-09
+6.934062739e-11
+3.297503516e-09
+3.435188638e-10
+5.297642673e-08
+4.382508996e-09
+2.158635352e-08
+5.682041402e-12
+2.872850108e-07
+1.684440833e-10
+3.702296758e-08
+4.342536978e-10
+6.27913514e-08
+2.403628029e-08
+6.186423798e-09
+1.906331939e-07
+4.632141066e-10
+2.75528781e-09
+1.375301157e-08
+2.872819245e-08
+6.101281782e-07
+3.268447178e-10
+2.065018598e-07
+2.62934962e-09
+4.962377554e-11
+1.388864923e-10
+6.600434666e-08
+2.769795382e-07
+8.892370488e-07
+4.79076441e-07
+8.513265484e-09
+2.371009137e-11
+1.969842854e-08
+1.194156708e-06
+2.53608333e-06
+3.538052912e-11
+7.535772739e-11
+3.279577835e-09
+5.915460368e-09
+3.02566311e-12
+2.424965552e-08
+1.736406389e-08
+9.148306031e-11
+2.773912766e-09
+6.976061878e-08
+1.281910328e-09
+3.477331578e-11
+7.026224303e-12
+3.159072911e-08
+2.312639776e-06
+1.021070205e-11
+6.311485446e-10
+3.496457737e-09
+5.006307921e-09
+1.086232952e-09
+6.442720089e-07
+3.403922546e-08
+1.040513338e-07
+2.01520989e-08
+2.367352254e-08
+1.455757844e-08
+4.519467641e-07
+6.28461962e-08
+1.681912432e-08
+3.350604832e-10
+1.788912469e-11
+8.65895426e-08
+1.581698325e-10
+3.168928376e-08
+1.269427393e-09
+3.307594478e-11
+6.742913842e-11
+4.303451928e-10
+1.049209168e-07
+7.72679499e-12
+5.740213241e-07
+7.011858745e-07
+5.337254201e-09
+6.364098195e-09
+6.365181097e-10
+7.724336147e-10
+2.368368232e-08
+1.761684159e-07
+3.074352635e-08
+5.988348578e-06
+1.432660113e-12
+7.971765332e-11
+1.851907721e-07
+1.679589918e-10
+6.480753213e-06
+9.759320168e-09
+3.448700092e-09
+7.000832649e-11
+2.170389647e-09
+5.016091717e-09
+1.498097082e-09
+5.879045351e-10
+6.04856896e-10
+1.149674113e-08
+8.39211811e-11
+2.869929102e-13
+9.120025443e-09
+1.023019663e-06
+1.843312565e-11
+1.004917355e-06
+1.437937821e-09
+3.104223957e-06
+3.736773683e-10
+9.594609818e-11
+1.231999544e-11
+3.535861091e-07
+7.131073672e-08
+2.337280167e-10
+2.824053112e-07
+3.138209131e-08
+5.494664929e-12
+3.070138908e-12
+2.011205543e-10
+1.461424596e-11
+3.081987435e-09
+1.46093963e-10
+3.186536889e-07
+8.613722973e-10
+4.227278814e-07
+1.132922515e-08
+1.38585023e-08
+2.535073827e-09
+5.647503952e-08
+1.712170102e-10
+9.68893623e-07
+2.23301625e-09
+2.607896714e-11
+1.678599102e-13
+2.258614162e-06
+1.695694084e-09
+1.706056963e-11
+4.7586551e-12
+1.42650763e-05
+1.449408916e-07
+4.244679669e-08
+3.617422863e-10
+8.345513919e-12
+7.09121725e-13
+8.179649539e-09
+3.323822411e-09
+1.436276816e-08
+5.885513695e-10
+3.584811231e-08
+9.154788215e-09
+9.640669763e-11
+1.908867792e-09
+2.558486e-10
+5.232824781e-10
+1.261283666e-09
+2.53541926e-10
+1.402713106e-06
+9.404881776e-10
+1.920817629e-07
+4.404107301e-11
+5.005042888e-10
+1.406564629e-07
+4.527644024e-10
+4.146766934e-07
+1.166277032e-07
+7.051068181e-09
+4.11849211e-09
+9.268930022e-07
+1.080637902e-10
+1.045597589e-06
+4.947490967e-07
+6.160106382e-12
+1.351622658e-08
+2.784201053e-09
+1.934479305e-08
+5.314561342e-13
+1.357138484e-09
+4.977337067e-12
+6.477023506e-11
+4.234494139e-08
+4.918197299e-13
+3.683378601e-08
+3.727148631e-09
+1.040223561e-09
+6.604422035e-10
+3.806876455e-09
+1.097067221e-08
+1.705648579e-08
+6.319765378e-07
+1.574099802e-09
+3.013722918e-08
+4.77278499e-09
+3.679411129e-09
+8.938433543e-10
+5.60147652e-09
+1.526922169e-05
+3.497170215e-10
+9.33335016e-08
+1.359274e-08
+6.404241971e-11
+1.5355979e-11
+2.243449688e-09
+4.662114978e-09
+1.022032175e-10
+1.383890446e-07
+1.619039888e-12
+1.507964967e-08
+2.056097551e-09
+1.984726853e-05
+5.313179169e-09
+1.04747219e-08
+1.156429507e-07
+1.201419215e-06
+1.584080335e-09
+2.098542248e-11
+3.445376555e-09
+4.164592916e-06
+4.092695408e-12
+9.944139167e-10
+5.275904704e-09
+3.628906351e-11
+2.196977166e-10
+1.052794797e-08
+1.068605738e-08
+3.831355591e-11
+1.364002007e-07
+3.403056538e-10
+5.381516624e-08
+6.729189153e-12
+1.207745127e-07
+4.017462281e-09
+1.315657914e-08
+7.126694662e-11
+1.491096858e-07
+7.20888103e-10
+6.627930817e-08
+1.215887355e-10
+6.230801001e-09
+0.0001012323593
+5.309321999e-10
+5.741270954e-10
+2.429844937e-08
+7.32585206e-12
+3.533917464e-09
+7.92607808e-10
+8.291024594e-11
+3.746228723e-11
+5.242197859e-11
+8.718274092e-08
+6.175927737e-11
+6.099493891e-09
+2.644291342e-09
+2.306855272e-08
+7.322174164e-10
+1.884007562e-06
+3.755557449e-08
+1.659745103e-08
+5.494894979e-08
+3.546656967e-09
+2.674192614e-07
+1.028231645e-09
+9.289065159e-06
+7.959800508e-08
+1.068059708e-11
+5.674230217e-07
+6.214339587e-09
+1.601035056e-06
+1.977699126e-06
+3.462717682e-07
+7.373550469e-09
+5.726612432e-12
diff --git a/t/ME_data/ME_Wp.dat b/t/ME_data/ME_Wp.dat
index d0ea85e..4aeb8be 100644
--- a/t/ME_data/ME_Wp.dat
+++ b/t/ME_data/ME_Wp.dat
@@ -1,1289 +1,1289 @@
-0.0001355719843
-3.608722394e-05
-4.306341977e-07
-9.75550325e-07
-7.965530581e-08
-1.158741173e-06
-2.661842361e-06
-2.304823849e-09
-2.352135748e-07
-1.829734536e-06
-7.663338505e-10
-1.356612268e-07
-3.025163716e-07
-9.674843355e-08
-1.085770422e-08
-1.140610095e-07
-9.611408258e-06
-9.926075902e-06
-0.0002395617261
-3.935061026e-07
-1.135288394e-06
-3.820200425e-06
-9.707596176e-05
-1.989871947e-08
-4.670964333e-06
-6.369460664e-08
-5.769266019e-06
-6.100771968e-07
-4.177606366e-07
-5.131150139e-05
-2.623663409e-08
-9.921267961e-07
-2.818624505e-05
-2.357728349e-06
-1.529409143e-07
-3.812118593e-09
-4.089891622e-06
-5.519579034e-08
-3.108467374e-05
-6.275083184e-07
-0.0004711631231
-1.064846011e-10
-3.599907223e-07
-0.0005693437265
-5.34425931e-06
-1.369519561e-07
-4.610580273e-08
-2.759136394e-08
-0.0002011662853
-8.792673722e-06
-2.70389791e-06
-1.871336935e-09
-6.645206867e-07
-0.01345911877
-8.025796761e-06
-1.131187139e-07
-2.178470183e-07
-3.510890525e-05
-1.89984448e-07
-1.045126464e-06
-1.869095439e-06
-2.768546736e-06
-8.551014251e-08
-7.773400289e-07
-4.5314433e-06
-1.601178083e-06
-1.364165586e-07
-5.968291371e-08
-1.972884889e-07
-7.870126436e-08
-1.027083098e-09
-1.687474041e-07
-6.312089331e-10
-3.39183549e-07
-4.915897747e-06
-1.471309784e-08
-5.806965374e-07
-1.107356106e-06
-2.913951187e-05
-2.124038907e-06
-2.12990617e-07
-1.356428765e-06
-2.199225431e-08
-9.711358047e-08
-0.0001385574072
-6.515223687e-07
-2.5352989e-05
-9.498820108e-06
-7.275411577e-08
-3.660521512e-08
-1.057452473e-07
-6.037071105e-08
-1.535388649e-05
-8.248385786e-07
-3.681438798e-07
-6.978799537e-07
-0.0001134623553
-0.0031723732
-0.0002184140303
-1.851576802e-06
-2.387181833e-07
-0.0002408737584
-2.563590676e-07
-1.00063883e-09
-4.85334472e-06
-1.037554067e-07
-7.119588313e-06
-2.561893885e-06
-6.552784786e-08
-2.50165186e-08
-3.2201158e-08
-4.669232163e-07
-1.713318068e-05
-1.245254933e-09
-7.470170632e-06
-1.121794755e-10
-2.566806176e-08
-0.0006902527912
-1.619690794e-08
-0.007842917065
-3.718578869e-05
-0.0007152647352
-3.366873265e-05
-3.59028058e-05
-0.0001083353837
-1.746053028e-07
-2.714474997e-05
-5.495139342e-05
-6.535082147e-05
-5.041690089e-07
-3.546093001e-06
-1.20179547e-08
-2.615186338e-08
-0.005544505766
-2.669153731e-08
-1.124413228e-07
-2.097675954e-07
-0.0004497023181
-3.522902236e-06
-3.609796532e-10
-2.381544279e-06
-0.0001723836121
-8.005109621e-06
-2.558975219e-05
-1.661304558e-05
-7.830074882e-06
-8.689123182e-05
-1.604221799e-05
-1.56327932e-07
-7.475227989e-08
-3.375281865e-08
-7.208470216e-08
-5.524155313e-10
-5.4103721e-09
-9.793444078e-05
-1.21018869e-06
-5.403237142e-06
-9.396037828e-07
-9.218690916e-07
-1.916819566e-05
-2.17787046e-06
-0.0003020897621
-6.197213158e-08
-7.288410467e-08
-1.364194249e-05
-1.038835664e-05
-1.181892899e-07
-5.005163224e-06
-3.611225632e-08
-1.221974588e-08
-1.94276032e-05
-3.734309395e-06
-0.0001093995311
-2.068051728e-06
-8.857508826e-06
-4.173118216e-06
-6.957949482e-09
-1.448277035e-06
-4.552053973e-07
-1.37143731e-06
-8.5249063e-07
-1.659141616e-09
-1.245863146e-07
-0.0002242637796
-3.699075976e-06
-2.084644637e-10
-2.212848431e-08
-8.425415515e-08
-2.259085486e-07
-0.007259912738
-4.467602944e-06
-3.025351312e-06
-1.224941318e-08
-1.156121552e-07
-1.910495837e-06
-6.957101383e-08
-3.814134717e-08
-4.664811166e-07
-1.051815656e-05
-8.36147558e-09
-6.131289047e-07
-6.896621501e-06
-2.902398388e-05
-7.595782532e-09
-1.528994856e-08
-5.225540702e-09
-3.429459178e-05
-2.622252649e-09
-0.0005682063775
-7.453799253e-07
-1.807441554e-05
-9.740982954e-07
-2.028479208e-06
-9.039653513e-08
-2.480442432e-06
-0.0004804561254
-1.082404101e-08
-2.792579118e-06
-0.0002121921023
-9.812552552e-05
-7.828391194e-07
-0.001456303526
-1.94354748e-08
-8.760573751e-08
-6.867301069e-10
-1.796235147e-07
-3.651695166e-07
-1.227417157e-07
-6.64659658e-06
-8.406970208e-05
-0.001885290461
-0.000157033045
-2.314708694e-06
-0.0002982727329
-0.003229609172
-2.427561837e-10
-1.896038488e-06
-1.190944746e-08
-4.219946428e-07
-7.272059603e-08
-1.59196208e-06
-2.437096045e-07
-2.465458718e-10
-3.867407912e-06
-7.355333688e-09
-3.882793721e-06
-0.003249948479
-1.636247339e-05
-0.0003223793747
-2.270764736e-05
-1.158210386e-07
-4.80342984e-06
-1.938501144e-06
-1.000117331e-06
-7.966527985e-08
-1.977164443e-05
-3.69784658e-06
-0.0001118273673
-8.542125832e-09
-3.549018039e-05
-4.419576288e-08
-0.0004157235871
-1.269135254e-06
-1.336086217e-09
-0.0001810766875
-5.607527407e-08
-7.073836906e-08
-6.226377903e-05
-3.842917677e-07
-6.352283685e-05
-1.76753472e-08
-0.002554251882
-1.646539129e-08
-1.960645519e-08
-0.0002646806777
-1.199915455e-05
-2.978511607e-08
-0.000116967724
-1.112499633e-08
-4.229712985e-07
-4.907009823e-08
-1.380172172e-06
-1.086563459e-05
-4.639365797e-08
-5.978112399e-07
-7.468593264e-08
-2.128107625e-08
-3.477532299e-06
-1.453714307e-09
-3.088717592e-05
-3.041172747e-05
-2.604198178e-07
-1.592445808e-06
-1.544432861e-07
-3.372379466e-06
-0.0001468104602
-5.574767897e-07
-4.759127919e-10
-0.0009306719674
-5.974247994e-06
-0.0002033151455
-2.248619967e-06
-1.737478692e-05
-3.508166071e-06
-2.435499227e-09
-6.369003912e-06
-9.703728971e-09
-1.74070901e-06
-3.283306645e-07
-1.701425136e-08
-4.192916377e-08
-4.498844071e-05
-3.83404553e-05
-1.152621936e-09
-1.27759414e-05
-0.0002811237244
-1.725068759e-07
-1.077501154e-06
-0.004189517285
-1.659706256e-07
-1.343358874e-07
-8.327570632e-07
-2.346076524e-05
-5.667318083e-07
-1.495443263e-09
-6.283129175e-07
-7.691168557e-09
-1.613371819e-08
-4.367733457e-08
-1.328415079e-09
-1.452913735e-06
-2.025555437e-07
-1.293144251e-06
-3.674495466e-07
-4.037694296e-06
-2.086123444e-08
-1.579986535e-06
-7.231915707e-10
-3.157016501e-07
-0.0003660037215
-0.0008949054585
-5.638174283e-08
-3.2885886e-06
-5.432504554e-08
-5.18075933e-10
-5.121203913e-08
-1.939450987e-08
-1.979142876e-05
-2.529002473e-08
-0.0002538283061
-3.803979134e-05
-7.172326632e-06
-2.759109713e-06
-3.708776662e-06
-4.712989924e-08
-0.0001084418496
-5.277822093e-08
-4.364063475e-08
-1.209898063e-07
-3.136890903e-08
-1.044095046e-07
-6.962956273e-08
-6.454347396e-06
-2.03105437e-09
-4.064764161e-07
-1.125205303e-06
-3.916696455e-06
-5.611785349e-07
-1.848611742e-07
-2.582403205e-07
-8.8398711e-05
-2.850327029e-06
-2.108292593e-07
-1.232805054e-08
-9.539250223e-08
-0.006539873403
-2.250946039e-05
-1.89348364e-07
-2.619177604e-11
-3.531432382e-10
-1.155035358e-07
-1.892463999e-07
-1.339909549e-08
-5.529398846e-08
-1.151900114e-05
-0.005889721927
-8.216256879e-05
-1.557120111e-07
-9.089312296e-08
-4.410189877e-07
-4.125658696e-08
-1.888812401e-07
-5.72690691e-05
-1.874559047e-09
-9.008458744e-12
-1.709044888e-05
-1.67931414e-07
-8.335566244e-06
-1.141598503e-08
-0.002680457238
-1.068398085e-08
-1.957183797e-06
-2.244367588e-05
-1.231910933e-05
-4.629935793e-05
-4.576227205e-06
-1.980987775e-08
-3.939110441e-07
-2.650096111e-05
-8.45374912e-06
-3.87197728e-08
-0.002862691173
-4.135291614e-08
-0.0002240310513
-1.62602432e-07
-1.446697749e-07
-1.815721752e-06
-3.82343665e-07
-1.519921818e-06
-7.180741224e-10
-3.485436765e-05
-7.358200547e-08
-7.791803722e-06
-7.340098859e-07
-1.648829751e-05
-5.701378028e-07
-1.101811994e-07
-2.180113561e-08
-0.005048614692
-1.410953605e-08
-1.796629437e-05
-3.537585739e-05
-2.035011418e-05
-1.003894868e-08
-0.0007063058628
-8.670593589e-05
-6.826393725e-08
-5.90070804e-06
-1.447352925e-08
-1.072050501e-05
-2.460311e-05
-3.38994689e-08
-3.77746866e-07
-7.004891026e-07
-3.633307257e-05
-4.394910272e-07
-7.401654738e-07
-0.004667703557
-4.822544046e-07
-1.289604482e-08
-0.0001296636722
-1.38703251e-06
-2.915976119e-05
-1.716214639e-07
-2.901236713e-08
-7.505249455e-10
-7.295055264e-08
-5.765824764e-07
-3.265772439e-08
-1.700596569e-06
-3.410463373e-08
-7.817851601e-06
-0.0001713594978
-4.092939984e-08
-9.555130708e-08
-2.412195504e-06
-3.183516899e-09
-0.0006930495513
-1.228003614e-07
-8.804659671e-05
-2.135176373e-06
-4.693017626e-06
-5.98436871e-08
-2.487744792e-06
-1.776206809e-07
-6.533684691e-07
-1.608251404e-06
-4.483048806e-06
-1.390213066e-06
-2.463272535e-09
-0.0001373179164
-4.692519626e-10
-6.223649822e-09
-3.026899162e-06
-5.540599649e-08
-5.422865068e-08
-8.715360349e-08
-3.005262075e-06
-4.491517193e-06
-1.296332143e-08
-8.034151055e-07
-8.445675436e-07
-1.331376027e-08
-1.808252928e-06
-4.811825495e-06
-3.356636619e-06
-3.718204068e-07
-1.633210686e-06
-1.145748502e-06
-1.082083663e-06
-6.645503932e-07
-7.690064745e-06
-9.446655788e-07
-0.0001628165971
-0.0004161529432
-2.733182258e-06
-4.797981787e-06
-0.0001243192011
-0.0004489774905
-4.018994469e-08
-6.294131882e-05
-0.0006300937981
-3.276976793e-07
-5.253447018e-07
-6.013623386e-09
-6.133379953e-07
-7.498082273e-08
-9.70785668e-08
-2.892020376e-07
-0.0008858499734
-5.834224897e-12
-2.657258195e-05
-1.937050603e-08
-1.014207814e-08
-2.078416478e-09
-9.09266244e-09
-1.171070672e-06
-6.18600885e-07
-7.316626326e-08
-1.137929257e-05
-3.926212477e-07
-9.411347448e-08
-2.358881565e-05
-4.562416832e-07
-8.746279414e-07
-2.158977111e-07
-7.68251659e-08
-4.623476813e-08
-1.822643013e-09
-5.649636691e-07
-8.861095682e-07
-3.661799019e-06
-0.005151284521
-1.33326149e-08
-0.01070078066
-3.557312234e-07
-7.956098508e-07
-1.102026406e-05
-9.099091102e-08
-9.76046916e-07
-4.026076856e-07
-3.148718363e-05
-3.652135323e-08
-5.83259011e-08
-0.0002758602956
-5.979826148e-06
-2.336313349e-06
-1.214278297e-06
-1.25701869e-05
-4.380095687e-07
-8.01469849e-07
-0.00316958096
-9.221623949e-05
-4.690760742e-07
-7.648050663e-07
-1.418690894e-05
-2.220802074e-07
-3.142017749e-07
-1.911591032e-07
-2.45298426e-08
-0.0001445594441
-2.061494003e-07
-1.315444256e-09
-3.270418427e-05
-2.302140371e-07
-4.002095191e-06
-1.609778389e-06
-1.156198845e-08
-4.49026945e-08
-0.0002105189831
-1.502882545e-10
-0.0003938508262
-2.359522703e-06
-5.766519564e-05
-4.012744154e-07
-1.060136498e-07
-0.000214176753
-2.679472391e-06
-1.069264028e-05
-2.484323067e-09
-0.0001019831637
-1.193130901e-06
-1.086707804e-06
-1.985358343e-07
-1.172768569e-10
-4.982454227e-07
-2.574859959e-05
-0.001250253045
-2.058059347e-09
-1.333980568e-07
-9.818785061e-09
-5.154088274e-07
-0.0001083933403
-1.428558727e-06
-1.746251251e-05
-2.151559249e-05
-0.01028504094
-7.323992261e-07
-2.685867501e-08
-4.250514259e-05
-0.0004356795855
-3.28945742e-07
-0.003236859534
-3.00756172e-08
-2.793887221e-06
-1.897911806e-05
-1.619728379e-07
-8.95372942e-05
-4.802035497e-06
-7.858933592e-06
-7.610830748e-07
-2.314286619e-05
-4.939775908e-09
-4.92614662e-09
-8.469370317e-07
-3.809251938e-05
-8.402086849e-09
-4.426806359e-07
-2.426544223e-06
-3.814110772e-08
-1.746240046e-06
-1.524462135e-07
-7.921180879e-05
-2.101358689e-07
-4.839237017e-07
-5.352096872e-07
-4.622274946e-05
-0.001900140657
-1.924092071e-06
-0.00143054632
-4.980473899e-08
-0.001646505279
-1.600615665e-05
-2.692315114e-06
-4.189143306e-06
-9.988552464e-08
-3.325410401e-05
-1.063371193e-06
-4.230272909e-06
-3.988538107e-06
-0.0001050685431
-5.986075089e-08
-2.025564122e-06
-4.34519194e-07
-8.910595284e-05
-2.543273713e-06
-0.0002129943925
-8.738486453e-06
-4.913962461e-09
-3.353322522e-08
-3.330632645e-05
-1.951511181e-06
-1.384784662e-05
-2.148337293e-07
-1.685318775e-07
-1.114845659e-07
-6.02083664e-05
-1.280889362e-07
-4.215297005e-07
-3.062431729e-07
-6.986710671e-07
-1.615334628e-07
-1.317663184e-07
-0.0008030210999
-2.015927373e-05
-5.191868083e-06
-5.500044246e-07
-7.15420681e-08
-0.0002157285878
-9.440043769e-07
-6.512957712e-08
-1.03903574e-08
-0.0001795918484
-1.962894846e-05
-1.739516157e-07
-2.125764853e-08
-1.743490742e-05
-1.541416437e-06
-3.39198022e-06
-8.359097007e-06
-1.415613754e-09
-7.887560312e-07
-1.745081942e-07
-1.93272986e-07
-9.82806121e-07
-1.291461771e-07
-9.278171463e-05
-4.264104348e-06
-3.754456141e-07
-3.45261236e-05
-8.101309383e-06
-4.056256867e-09
-2.25304959e-07
-1.172523689e-05
-4.796449477e-07
-3.785295788e-09
-2.390481376e-05
-5.308836572e-08
-4.670596214e-05
-6.758177723e-05
-3.147635808e-09
-1.661568333e-05
-5.893559314e-08
-3.900939991e-05
-3.504262189e-08
-8.675964675e-05
-0.000133599036
-1.302314857e-06
-1.146394401e-06
-6.394208991e-06
-2.519497163e-05
-0.000136705096
-4.154554201e-09
-2.099823438e-06
-2.146448637e-05
-1.233863139e-09
-0.001728401026
-4.092153785e-05
-0.007151464488
-4.760189089e-09
-0.0007525693775
-1.763213602e-08
-2.706320224e-07
-4.16893951e-06
-6.81377324e-07
-6.199680386e-06
-1.450358333e-09
-0.001178944037
-3.552524899e-07
-0.001006339432
-3.6848606e-07
-2.167674886e-07
-2.537842237e-06
-7.658583081e-07
-2.591411922e-07
-4.604356596e-08
-4.168374132e-07
-7.238778416e-09
-1.170127812e-06
-4.393582246e-07
-0.0007919329994
-1.028777638e-06
-6.918341744e-08
-9.436340567e-08
-1.591183982e-06
-2.089478665e-06
-1.613369096e-07
-3.637102367e-07
-9.604978456e-07
-9.357975907e-07
-2.887515361e-06
-6.126247876e-06
-1.015660593e-05
-5.755045288e-06
-0.002323684389
-8.012996825e-07
-5.265198999e-07
-0.0002032569176
-1.451031358e-07
-5.47702166e-07
-7.468912832e-07
-1.172272852e-05
-5.000191344e-06
-1.572889839e-06
-6.442065446e-08
-2.908881614e-05
-4.569176417e-05
-0.0003671971122
-1.009483851e-07
-1.696662821e-09
-1.138346236e-08
-7.716922346e-07
-3.529252962e-06
-6.363107446e-07
-1.932801605e-07
-5.985835074e-07
-3.856272451e-06
-8.483829546e-07
-7.519170568e-09
-6.046535627e-06
-8.332015402e-05
-0.0004929270086
-1.066348746e-06
-6.354668794e-05
-2.325179699e-05
-3.330122089e-07
-7.907070499e-09
-3.51499146e-06
-6.69519437e-06
-7.791955277e-08
-3.007407175e-09
-1.687262336e-06
-2.966015735e-06
-2.551884972e-08
-0.02757047144
-1.902124553e-06
-1.85886341e-06
-1.174589642e-07
-6.265121215e-07
-0.0001498056381
-2.510077496e-07
-0.003704558141
-7.864571581e-05
-1.77636514e-08
-0.0002011705268
-4.239853221e-06
-1.05657366e-06
-0.0008521527281
-4.768494505e-07
-5.244547978e-06
-0.0001425035783
-4.507288271e-07
-3.09253883e-07
-0.007681533917
-1.571813451e-07
-3.341400742e-08
-9.577252639e-07
-1.135355463e-09
-1.20086557e-07
-4.167792379e-06
-7.827764132e-06
-1.444125408e-06
-2.56704074e-05
-3.703109696e-07
-2.683372002e-05
-2.223174581e-07
-1.771597066e-05
-1.154476033e-07
-4.676107605e-07
-1.045592241e-08
-5.174222885e-07
-8.73448236e-07
-1.146406684e-08
-8.784051991e-07
-7.500525642e-10
-1.921656555e-05
-5.899142263e-08
-7.304760895e-05
-1.070817369e-08
-2.432332986e-05
-2.466303926e-09
-1.587801133e-05
-5.253580132e-08
-1.186388122e-06
-2.513054159e-08
-2.878256017e-05
-1.268594971e-09
-4.036344626e-07
-1.480245095e-05
-0.007764649543
-1.266626553e-05
-2.673316926e-07
-2.052285927e-07
-3.026411679e-09
-3.958784182e-09
-5.153150954e-10
-2.304903783e-10
-4.001726091e-09
-5.422669345e-12
-1.07974246e-08
-7.876103608e-07
-2.049298389e-13
-2.452583297e-10
-6.723994075e-09
-1.881390674e-09
-8.769216371e-09
-1.325727129e-07
-8.79685468e-10
-8.598808624e-09
-1.838871103e-09
-1.411793652e-09
-3.180735553e-09
-1.657163942e-09
-6.291661793e-07
-1.407385603e-08
-2.446407049e-10
-3.694685136e-06
-7.168304193e-08
-1.515131205e-07
-5.976833111e-07
-9.943757037e-11
-1.770333366e-10
-6.826832537e-10
-3.501999566e-09
-1.003726186e-11
-2.246679298e-10
-1.56313715e-08
-1.258803576e-08
-1.510698432e-09
-1.860286401e-08
-7.436044673e-11
-8.891994306e-11
-8.343726078e-07
-7.82113065e-10
-7.372198961e-09
-1.7379478e-08
-4.796628257e-10
-1.006843272e-11
-2.297522445e-07
-2.96433985e-09
-5.119472399e-06
-1.217098718e-09
-1.247856004e-10
-2.379923838e-10
-6.847023565e-08
-1.126084699e-08
-9.366371857e-09
-8.815353934e-13
-1.248942678e-09
-1.28799905e-06
-1.862006169e-05
-5.986015285e-09
-3.576379278e-09
-1.396207937e-07
-5.597776909e-09
-1.227869193e-07
-3.184775395e-10
-1.281548492e-09
-3.785370229e-08
-8.065381915e-10
-1.797326508e-08
-4.870916557e-09
-1.481421747e-08
-6.148653826e-13
-2.607686069e-08
-7.503399307e-09
-7.31997834e-10
-3.917579692e-06
-2.456001118e-09
-1.635872696e-09
-1.504286856e-07
-4.626076248e-12
-2.544705877e-10
-2.326334148e-09
-1.209465237e-07
-9.76623574e-09
-2.844168649e-07
-1.201220073e-06
-7.295130141e-08
-2.673472441e-08
-3.217663506e-11
-3.051103331e-08
-8.28476209e-08
-2.058274741e-10
-2.829620954e-09
-6.317741319e-05
-5.647654869e-08
-3.939846598e-09
-6.94535699e-09
-2.688849469e-09
-1.246699517e-07
-1.659904595e-07
-2.236198242e-05
-9.48051308e-09
-9.500858057e-07
-7.271132888e-08
-4.043174967e-07
-7.378146611e-10
-1.15122787e-07
-3.25624697e-08
-1.170385948e-12
-5.503757963e-08
-1.043829653e-11
-1.203555505e-08
-1.075568487e-10
-8.108086268e-07
-4.847855376e-11
-7.343632999e-06
-1.187566426e-11
-3.504033234e-08
-7.018111165e-12
-2.46365153e-10
-1.851835159e-10
-1.513115014e-09
-8.018682005e-09
-3.929445257e-06
-2.084075835e-07
-5.951216622e-10
-3.507041226e-06
-5.267974518e-12
-3.372609243e-06
-1.694025855e-11
-1.867025942e-10
-2.116504705e-10
-3.831483934e-10
-6.969465032e-05
-1.539468087e-08
-1.101455293e-11
-1.388260307e-10
-5.247853733e-08
-4.682122196e-08
-1.641630864e-10
-2.193600975e-08
-1.553226091e-09
-2.996160922e-08
-2.723720585e-11
-1.94231471e-09
-1.292957006e-11
-3.828518709e-12
-1.610161368e-08
-1.687340239e-06
-1.925507093e-09
-4.366763058e-13
-6.454544637e-07
-6.024146948e-07
-2.580279684e-10
-1.225823158e-05
-1.999348472e-11
-4.860969642e-11
-2.362388726e-08
-1.373679959e-08
-3.790417277e-12
-1.087173802e-08
-3.129309985e-07
-1.364398599e-09
-1.715322136e-05
-3.172978915e-08
-1.823609884e-08
-3.114527252e-09
-3.26147148e-10
-2.126201737e-05
-5.67083409e-08
-9.666272186e-10
-7.465320939e-10
-1.354621046e-10
-2.460861093e-08
-1.087512595e-09
-2.736687172e-07
-5.11303402e-10
-6.306214806e-07
-3.166204304e-09
-2.044824307e-08
-6.895612872e-10
-6.672834049e-11
-5.398174219e-09
-1.015670186e-07
-5.845736032e-10
-4.836786585e-08
-5.100824595e-10
-1.572989158e-08
-1.787382013e-10
-1.632652197e-08
-7.017280062e-08
-7.320290175e-12
-3.029928398e-11
-1.409128876e-12
-1.23856674e-06
-8.502728239e-08
-3.438550409e-08
-4.863721153e-07
-5.154439531e-07
-2.08972413e-09
-3.431301197e-10
-1.781924049e-08
-1.544286506e-09
-4.308676963e-09
-2.652066437e-09
-1.604320244e-11
-1.019690001e-05
-1.123300801e-09
-2.815571339e-12
-1.072295152e-10
-6.773569517e-09
-2.399435656e-09
-1.754777793e-07
-6.11811144e-11
-8.592783988e-06
-6.887732464e-11
-1.799971693e-09
-2.674451287e-10
-1.267733301e-08
-1.616784133e-09
-2.418432767e-10
-2.161777683e-07
-3.59476746e-06
-1.314807779e-05
-3.035190047e-06
-5.146947381e-12
-8.12518705e-07
-2.904383899e-07
-8.278936106e-08
-1.491259803e-12
-3.232769716e-10
-3.014861034e-07
-3.869348362e-08
-4.060145209e-09
-2.722588244e-09
-1.252225236e-06
-8.534092377e-10
-1.170269795e-13
-1.013048209e-07
-1.173680889e-10
-1.230879501e-06
-3.603057249e-07
-2.340497478e-10
-1.622753821e-07
-1.855112238e-10
-1.873444014e-13
-1.477984664e-10
-5.974804124e-09
-5.502900531e-08
-6.238844281e-09
-2.281648653e-08
-2.708668242e-09
-8.942323853e-07
-8.600240627e-08
-5.31399731e-08
-1.1503287e-06
-4.275682333e-10
-2.53579699e-12
-1.472728627e-07
-2.054544355e-10
-2.452448293e-06
-2.149816531e-09
-1.302067002e-08
-1.354519207e-05
-1.493773809e-10
-4.155193611e-09
-1.975443913e-09
-7.883829759e-09
-3.017039098e-08
-6.106751813e-07
-7.433047934e-09
-3.802076122e-08
-1.356542653e-08
-7.945943977e-11
-6.146929104e-09
-1.06127379e-06
-3.425627165e-09
-4.724471453e-09
-2.264989501e-06
-5.206993078e-12
-1.90383962e-11
-5.585175902e-09
-5.143389714e-12
-8.796345158e-08
-2.018357685e-09
-7.316136952e-07
-6.365052389e-11
-5.084402064e-08
-4.955635943e-10
-7.57908344e-10
-1.041589492e-10
-1.067922679e-10
-2.629806672e-10
-7.25350299e-09
-3.644402439e-09
-3.524112279e-06
-1.911510927e-10
-7.705863931e-09
-9.497501985e-06
-1.776186632e-07
-7.672061364e-12
-1.053749529e-07
-4.528511106e-07
-2.689071802e-11
-2.172737512e-09
-1.388580492e-10
-8.063945293e-10
-5.664095782e-08
-1.744805218e-09
-2.052101608e-11
-2.11086039e-11
-4.471965164e-07
-1.547872699e-09
-1.123990847e-08
-1.220466556e-08
-7.86940138e-07
-1.643506198e-10
-1.008594322e-08
-3.353990714e-07
-6.498831028e-10
-1.784315352e-10
-3.805121546e-07
-8.427309526e-07
-1.498075756e-09
-1.039473919e-10
-1.111563522e-08
-1.747513537e-09
-2.355165347e-09
-1.678234532e-08
-2.202228295e-10
-5.649821709e-08
-7.451026015e-08
-3.278979106e-11
-3.654252985e-11
-1.935636311e-11
-4.454493635e-09
-1.468840448e-11
-6.571279637e-09
-6.056988847e-10
-1.45101906e-07
-1.129031522e-10
-1.042132417e-11
-3.257388556e-11
-9.125965382e-09
-1.157786708e-08
-1.347062065e-10
-1.772554211e-07
-2.066007249e-07
-1.183381188e-10
-4.340661853e-11
-1.724089243e-07
-1.017527503e-09
-4.44819414e-08
-9.298037883e-10
-1.457982064e-08
-1.344707238e-06
-3.942998333e-10
-6.43175857e-10
-2.598344201e-09
-9.723411144e-11
-5.888094132e-07
-1.25096091e-08
-1.918965374e-08
-1.266172494e-09
-2.35856138e-08
-9.312557307e-07
-4.777100833e-09
-1.10131928e-05
-4.4646416e-10
-7.607866734e-08
-5.154676048e-10
-2.264518551e-08
-8.764203667e-09
-8.615359565e-07
-1.40030428e-06
-2.971220432e-07
-1.703066362e-09
-9.085894745e-08
-7.676857842e-09
-3.495643794e-07
-5.348620008e-10
-8.55049288e-10
-5.359621176e-10
-3.270584284e-08
-2.199342971e-11
-3.481833909e-07
-6.965993643e-10
-1.079185991e-09
-2.042388119e-11
-1.522460286e-08
-1.814688226e-09
-3.798271467e-08
-3.25158391e-06
-1.339564567e-08
-1.067207795e-10
-2.907408723e-09
-2.121056488e-09
-1.929150312e-10
-5.485146496e-10
-2.944552971e-10
-3.400562268e-09
-2.722315508e-07
-1.103475417e-07
-4.918181731e-10
-1.403530819e-08
-1.186111191e-10
-2.383852963e-09
-6.366433665e-10
-2.884801863e-08
-3.233653865e-09
-0.0001662977522
-2.949009635e-10
-2.818141893e-08
-2.146479379e-09
-2.878568427e-11
-1.429984069e-11
-2.151490158e-11
-4.991815647e-07
-7.60856163e-11
-4.322197412e-08
-8.515744987e-10
-4.522027747e-09
-4.658966436e-08
-4.872475335e-10
-1.225955162e-08
-9.732456622e-09
-5.55287071e-08
+0.0001355692831
+3.608650493e-05
+4.306256176e-07
+9.75530888e-07
+7.965371874e-08
+1.158718086e-06
+2.661789326e-06
+2.304777927e-09
+2.352088884e-07
+1.82969808e-06
+7.663185819e-10
+1.356585238e-07
+3.025103442e-07
+9.674650592e-08
+1.085748789e-08
+1.140587369e-07
+9.611216759e-06
+9.925878133e-06
+0.000239556953
+3.934982623e-07
+1.135265775e-06
+3.820124311e-06
+9.70740276e-05
+1.9898323e-08
+4.670871268e-06
+6.369333758e-08
+5.769151072e-06
+6.100650415e-07
+4.177523131e-07
+5.131047905e-05
+2.623611134e-08
+9.921070288e-07
+2.818568347e-05
+2.357681373e-06
+1.529378671e-07
+3.81204264e-09
+4.089810134e-06
+5.519469061e-08
+3.10840544e-05
+6.274958158e-07
+0.0004711537356
+1.064824795e-10
+3.599835498e-07
+0.0005693323828
+5.34415283e-06
+1.369492275e-07
+4.610488411e-08
+2.759081421e-08
+0.0002011622772
+8.792498535e-06
+2.703844037e-06
+1.87129965e-09
+6.645074467e-07
+0.01345885061
+8.025636853e-06
+1.131164601e-07
+2.178426779e-07
+3.510820573e-05
+1.899806627e-07
+1.04510564e-06
+1.869058199e-06
+2.768491575e-06
+8.55084388e-08
+7.773245411e-07
+4.531353015e-06
+1.601146181e-06
+1.364138406e-07
+5.968172458e-08
+1.972845581e-07
+7.86996963e-08
+1.027062634e-09
+1.687440419e-07
+6.311963568e-10
+3.39176791e-07
+4.915799802e-06
+1.471280469e-08
+5.806849675e-07
+1.107334043e-06
+2.913893129e-05
+2.123996588e-06
+2.129863733e-07
+1.356401739e-06
+2.199181613e-08
+9.711164556e-08
+0.0001385546466
+6.515093877e-07
+2.535248387e-05
+9.498630852e-06
+7.27526662e-08
+3.660448579e-08
+1.057431404e-07
+6.036950822e-08
+1.535358058e-05
+8.248221444e-07
+3.681365448e-07
+6.97866049e-07
+0.0001134600947
+0.003172309993
+0.0002184096786
+1.851539911e-06
+2.38713427e-07
+0.0002408689592
+2.563539598e-07
+1.000618893e-09
+4.853248021e-06
+1.037533394e-07
+7.119446461e-06
+2.561842841e-06
+6.552654227e-08
+2.501602017e-08
+3.220051642e-08
+4.669139132e-07
+1.713283931e-05
+1.245230123e-09
+7.470021795e-06
+1.121772404e-10
+2.566755035e-08
+0.0006902390385
+1.619658523e-08
+0.007842760801
+3.718504779e-05
+0.0007152504841
+3.366806183e-05
+3.590209047e-05
+0.0001083332252
+1.746018239e-07
+2.714420914e-05
+5.495029856e-05
+6.534951941e-05
+5.041589637e-07
+3.546022348e-06
+1.201771525e-08
+2.615134233e-08
+0.005544395296
+2.66910055e-08
+1.124390825e-07
+2.09763416e-07
+0.0004496933581
+3.522832045e-06
+3.609724609e-10
+2.381496829e-06
+0.0001723801775
+8.004950126e-06
+2.558924233e-05
+1.661271458e-05
+7.829918874e-06
+8.688950059e-05
+1.604189836e-05
+1.563248173e-07
+7.475079052e-08
+3.375214615e-08
+7.208326593e-08
+5.524045248e-10
+5.410264303e-09
+9.793248952e-05
+1.210164578e-06
+5.403129487e-06
+9.39585062e-07
+9.218507242e-07
+1.916781375e-05
+2.177827067e-06
+0.0003020837432
+6.197089683e-08
+7.288265251e-08
+1.364167069e-05
+1.038814966e-05
+1.181869351e-07
+5.0050635e-06
+3.611153681e-08
+1.221950242e-08
+1.942721612e-05
+3.734234992e-06
+0.0001093973514
+2.068010524e-06
+8.857332348e-06
+4.17303507e-06
+6.95781085e-09
+1.448248179e-06
+4.551963277e-07
+1.371409986e-06
+8.524736448e-07
+1.659108559e-09
+1.245838323e-07
+0.0002242593113
+3.699002275e-06
+2.084603102e-10
+2.212804342e-08
+8.425247645e-08
+2.259040476e-07
+0.00725976809
+4.467513931e-06
+3.025291035e-06
+1.224916912e-08
+1.156098517e-07
+1.910457772e-06
+6.956962769e-08
+3.814058724e-08
+4.664718224e-07
+1.0517947e-05
+8.361308985e-09
+6.131166886e-07
+6.896484091e-06
+2.90234056e-05
+7.595631192e-09
+1.528964392e-08
+5.225436587e-09
+3.429390849e-05
+2.622200403e-09
+0.0005681950565
+7.453650742e-07
+1.807405542e-05
+9.740788873e-07
+2.028438792e-06
+9.039473405e-08
+2.480393012e-06
+0.0004804465528
+1.082382535e-08
+2.792523478e-06
+0.0002121878745
+9.812357045e-05
+7.82823522e-07
+0.00145627451
+1.943508756e-08
+8.760399204e-08
+6.867164243e-10
+1.796199359e-07
+3.651622409e-07
+1.227392702e-07
+6.646464152e-06
+8.406802706e-05
+0.001885252898
+0.0001570299162
+2.314662575e-06
+0.00029826679
+0.003229544825
+2.42751347e-10
+1.896000711e-06
+1.190921017e-08
+4.219862349e-07
+7.271914713e-08
+1.591930361e-06
+2.437047488e-07
+2.465409596e-10
+3.867330857e-06
+7.355187139e-09
+3.882716359e-06
+0.003249883727
+1.636214738e-05
+0.0003223729516
+2.270719493e-05
+1.15818731e-07
+4.803334136e-06
+1.938462521e-06
+1.000097405e-06
+7.966369258e-08
+1.97712505e-05
+3.697772904e-06
+0.0001118251392
+8.541955637e-09
+3.548947328e-05
+4.419488231e-08
+0.0004157153041
+1.269109967e-06
+1.336059596e-09
+0.0001810730797
+5.607415682e-08
+7.073695965e-08
+6.226253847e-05
+3.84284111e-07
+6.352157121e-05
+1.767499503e-08
+0.002554200991
+1.646506323e-08
+1.960606455e-08
+0.0002646754042
+1.199891548e-05
+2.978452263e-08
+0.0001169653935
+1.112477467e-08
+4.229628711e-07
+4.906912054e-08
+1.380144673e-06
+1.086541811e-05
+4.639273361e-08
+5.97799329e-07
+7.468444459e-08
+2.128065224e-08
+3.477463012e-06
+1.453685343e-09
+3.088656052e-05
+3.041112154e-05
+2.604146292e-07
+1.592414079e-06
+1.544402089e-07
+3.372312274e-06
+0.0001468075351
+5.574656824e-07
+4.759033098e-10
+0.0009306534246
+5.974128962e-06
+0.0002033110946
+2.248575165e-06
+1.737444074e-05
+3.508096174e-06
+2.435450701e-09
+6.368877015e-06
+9.703535632e-09
+1.740674328e-06
+3.283241228e-07
+1.701391237e-08
+4.192832836e-08
+4.498754436e-05
+3.833969139e-05
+1.152598971e-09
+1.277568685e-05
+0.0002811181233
+1.725034388e-07
+1.077479686e-06
+0.004189433812
+1.659673188e-07
+1.343332109e-07
+8.327404712e-07
+2.34602978e-05
+5.667205166e-07
+1.495413468e-09
+6.283003988e-07
+7.691015317e-09
+1.613339674e-08
+4.367646433e-08
+1.328388611e-09
+1.452884787e-06
+2.02551508e-07
+1.293118486e-06
+3.674422254e-07
+4.037613848e-06
+2.08608188e-08
+1.579955055e-06
+7.231771617e-10
+3.1569536e-07
+0.0003659964292
+0.0008948876283
+5.638061947e-08
+3.288523078e-06
+5.432396316e-08
+5.180656108e-10
+5.121101877e-08
+1.939412345e-08
+1.979103443e-05
+2.528952084e-08
+0.0002538232488
+3.803903342e-05
+7.172183729e-06
+2.75905474e-06
+3.708702768e-06
+4.712896021e-08
+0.000108439689
+5.277716937e-08
+4.363976525e-08
+1.209873957e-07
+3.136828403e-08
+1.044074244e-07
+6.962817542e-08
+6.454218798e-06
+2.031013903e-09
+4.064683174e-07
+1.125182884e-06
+3.916618418e-06
+5.611673539e-07
+1.84857491e-07
+2.582351752e-07
+8.839694973e-05
+2.850270239e-06
+2.108250587e-07
+1.232780491e-08
+9.539060161e-08
+0.006539743101
+2.250901191e-05
+1.893445914e-07
+2.619125419e-11
+3.531362021e-10
+1.155012345e-07
+1.892426293e-07
+1.339882852e-08
+5.529288677e-08
+1.151877164e-05
+0.00588960458
+8.216093177e-05
+1.557089087e-07
+9.089131199e-08
+4.410102007e-07
+4.125576496e-08
+1.888774768e-07
+5.726792806e-05
+1.874521698e-09
+9.008279257e-12
+1.709010837e-05
+1.679280681e-07
+8.335400164e-06
+1.141575757e-08
+0.002680403832
+1.068376798e-08
+1.957144802e-06
+2.244322871e-05
+1.231886388e-05
+4.629843546e-05
+4.576136028e-06
+1.980948305e-08
+3.939031957e-07
+2.65004331e-05
+8.453580686e-06
+3.871900134e-08
+0.002862634137
+4.135209222e-08
+0.0002240265876
+1.625991922e-07
+1.446668925e-07
+1.815685575e-06
+3.823360471e-07
+1.519891535e-06
+7.180598153e-10
+3.485367321e-05
+7.35805394e-08
+7.791648477e-06
+7.339952614e-07
+1.648796899e-05
+5.701264433e-07
+1.101790041e-07
+2.180070124e-08
+0.005048514103
+1.410925493e-08
+1.79659364e-05
+3.537515255e-05
+2.034970872e-05
+1.003874866e-08
+0.0007062917902
+8.670420835e-05
+6.826257715e-08
+5.900590474e-06
+1.447324088e-08
+1.072029142e-05
+2.460261981e-05
+3.389879349e-08
+3.777393397e-07
+7.004751459e-07
+3.633234866e-05
+4.394822707e-07
+7.401507266e-07
+0.004667610557
+4.822447961e-07
+1.289578788e-08
+0.0001296610888
+1.387004875e-06
+2.915918021e-05
+1.716180445e-07
+2.901178909e-08
+7.505099919e-10
+7.294909916e-08
+5.765709885e-07
+3.265707371e-08
+1.700562686e-06
+3.410395422e-08
+7.817695837e-06
+0.0001713560836
+4.092858435e-08
+9.55494033e-08
+2.412147443e-06
+3.18345347e-09
+0.0006930357429
+1.227979147e-07
+8.804484246e-05
+2.135133831e-06
+4.692924121e-06
+5.984249476e-08
+2.487695226e-06
+1.77617142e-07
+6.533554512e-07
+1.608219361e-06
+4.482959485e-06
+1.390185368e-06
+2.463223456e-09
+0.0001373151805
+4.692426131e-10
+6.223525821e-09
+3.026838853e-06
+5.540489257e-08
+5.422757022e-08
+8.715186702e-08
+3.005202198e-06
+4.491427703e-06
+1.296306315e-08
+8.033990981e-07
+8.445507163e-07
+1.3313495e-08
+1.8082169e-06
+4.811729624e-06
+3.356569741e-06
+3.718129986e-07
+1.633178145e-06
+1.145725674e-06
+1.082062104e-06
+6.645371526e-07
+7.689911527e-06
+9.446467571e-07
+0.0001628133531
+0.0004161446517
+2.733127802e-06
+4.797886191e-06
+0.0001243167241
+0.000448968545
+4.018914394e-08
+6.294006476e-05
+0.000630081244
+3.276911502e-07
+5.253342347e-07
+6.01350357e-09
+6.133257751e-07
+7.49793288e-08
+9.707663258e-08
+2.891962755e-07
+0.0008858323235
+5.834108655e-12
+2.657205251e-05
+1.937012009e-08
+1.014187607e-08
+2.078375068e-09
+9.092481277e-09
+1.171047339e-06
+6.185885599e-07
+7.316480548e-08
+1.137906585e-05
+3.92613425e-07
+9.411159935e-08
+2.358834566e-05
+4.56232593e-07
+8.746105152e-07
+2.158934095e-07
+7.682363523e-08
+4.623384694e-08
+1.822606698e-09
+5.649524127e-07
+8.860919132e-07
+3.66172606e-06
+0.005151181886
+1.333234926e-08
+0.01070056746
+3.557241357e-07
+7.955939989e-07
+1.102004449e-05
+9.09890981e-08
+9.760274691e-07
+4.02599664e-07
+3.148655627e-05
+3.652062557e-08
+5.832473901e-08
+0.0002758547993
+5.979707005e-06
+2.336266799e-06
+1.214254103e-06
+1.256993645e-05
+4.380008417e-07
+8.014538804e-07
+0.003169517808
+9.221440216e-05
+4.690667282e-07
+7.647898282e-07
+1.418662628e-05
+2.220757827e-07
+3.141955147e-07
+1.911552946e-07
+2.452935386e-08
+0.0001445565639
+2.061452929e-07
+1.315418046e-09
+3.270353267e-05
+2.302094503e-07
+4.002015452e-06
+1.609746316e-06
+1.156175809e-08
+4.490179986e-08
+0.0002105147887
+1.502852601e-10
+0.0003938429791
+2.359475691e-06
+5.766404671e-05
+4.012664204e-07
+1.060115376e-07
+0.0002141724857
+2.679419004e-06
+1.069242724e-05
+2.484273569e-09
+0.0001019811318
+1.193107128e-06
+1.086686152e-06
+1.985318786e-07
+1.172745202e-10
+4.982354956e-07
+2.574808657e-05
+0.001250228135
+2.058018342e-09
+1.333953989e-07
+9.818589429e-09
+5.153985583e-07
+0.0001083911806
+1.428530264e-06
+1.746216459e-05
+2.151516381e-05
+0.01028483602
+7.323846337e-07
+2.685813988e-08
+4.250429571e-05
+0.0004356709049
+3.28939188e-07
+0.003236795043
+3.007501797e-08
+2.793831556e-06
+1.897873992e-05
+1.619696108e-07
+8.953551025e-05
+4.80193982e-06
+7.858777009e-06
+7.610679109e-07
+2.314240509e-05
+4.939677487e-09
+4.926048471e-09
+8.469201572e-07
+3.809176042e-05
+8.401919445e-09
+4.426718159e-07
+2.426495876e-06
+3.814034779e-08
+1.746205254e-06
+1.524431761e-07
+7.921023056e-05
+2.101316821e-07
+4.839140599e-07
+5.351990236e-07
+4.622182851e-05
+0.001900102798
+1.924053736e-06
+0.001430517818
+4.980374668e-08
+0.001646472474
+1.600583774e-05
+2.692261472e-06
+4.189059841e-06
+9.98835345e-08
+3.325344145e-05
+1.063350006e-06
+4.230188624e-06
+3.988458639e-06
+0.0001050664497
+5.985955822e-08
+2.025523764e-06
+4.345105365e-07
+8.910417748e-05
+2.543223041e-06
+0.0002129901487
+8.738312346e-06
+4.913864555e-09
+3.35325571e-08
+3.330566284e-05
+1.951472299e-06
+1.384757071e-05
+2.148294489e-07
+1.685285196e-07
+1.114823446e-07
+6.020716679e-05
+1.280863842e-07
+4.215213019e-07
+3.062370712e-07
+6.986571467e-07
+1.615302443e-07
+1.317636931e-07
+0.0008030051004
+2.015887208e-05
+5.191764639e-06
+5.499934662e-07
+7.154064268e-08
+0.0002157242896
+9.439855684e-07
+6.512827947e-08
+1.039015038e-08
+0.0001795882702
+1.962855737e-05
+1.739481498e-07
+2.125722499e-08
+1.743456005e-05
+1.541385725e-06
+3.391912637e-06
+8.358930459e-06
+1.415585549e-09
+7.887403159e-07
+1.745047173e-07
+1.932691352e-07
+9.827865394e-07
+1.29143604e-07
+9.277986603e-05
+4.26401939e-06
+3.754381337e-07
+3.452543569e-05
+8.101147971e-06
+4.056176049e-09
+2.2530047e-07
+1.172500327e-05
+4.796353912e-07
+3.78522037e-09
+2.390433748e-05
+5.308730798e-08
+4.670503157e-05
+6.758043071e-05
+3.147573094e-09
+1.661535227e-05
+5.89344189e-08
+3.900862268e-05
+3.504192369e-08
+8.675791814e-05
+0.0001335963742
+1.30228891e-06
+1.14637156e-06
+6.394081592e-06
+2.519446964e-05
+0.0001367023723
+4.154471425e-09
+2.099781601e-06
+2.146405871e-05
+1.233838555e-09
+0.001728366589
+4.092072252e-05
+0.007151322001
+4.760094246e-09
+0.0007525543832
+1.763178471e-08
+2.706266303e-07
+4.168856448e-06
+6.813637481e-07
+6.199556862e-06
+1.450329435e-09
+0.001178920548
+3.552454118e-07
+0.001006319382
+3.684787183e-07
+2.167631697e-07
+2.537791672e-06
+7.65843049e-07
+2.591360291e-07
+4.604264858e-08
+4.168291081e-07
+7.23863419e-09
+1.170104498e-06
+4.393494707e-07
+0.0007919172208
+1.02875714e-06
+6.918203902e-08
+9.436152555e-08
+1.591152279e-06
+2.089437034e-06
+1.613336951e-07
+3.637029901e-07
+9.604787084e-07
+9.357789457e-07
+2.887457829e-06
+6.126125816e-06
+1.015640357e-05
+5.754930623e-06
+0.002323638092
+8.012837173e-07
+5.265094095e-07
+0.0002032528678
+1.451002447e-07
+5.476912535e-07
+7.46876402e-07
+1.172249495e-05
+5.000091719e-06
+1.5728585e-06
+6.441937094e-08
+2.908823657e-05
+4.56908538e-05
+0.0003671897961
+1.009463738e-07
+1.696629017e-09
+1.138323555e-08
+7.716768592e-07
+3.529182645e-06
+6.362980666e-07
+1.932763096e-07
+5.985715811e-07
+3.856195618e-06
+8.483660513e-07
+7.519020755e-09
+6.046415155e-06
+8.331849394e-05
+0.0004929171874
+1.0663275e-06
+6.354542182e-05
+2.325133372e-05
+3.330055739e-07
+7.906912957e-09
+3.514921427e-06
+6.695060974e-06
+7.791800029e-08
+3.007347254e-09
+1.687228718e-06
+2.965956639e-06
+2.551834128e-08
+0.02756992212
+1.902086655e-06
+1.858826374e-06
+1.174566239e-07
+6.264996388e-07
+0.0001498026534
+2.510027485e-07
+0.003704484331
+7.864414886e-05
+1.776329747e-08
+0.0002011665187
+4.239768745e-06
+1.056552608e-06
+0.0008521357496
+4.768399496e-07
+5.244443485e-06
+0.0001425007391
+4.507198467e-07
+3.092477214e-07
+0.007681380868
+1.571782134e-07
+3.341334167e-08
+9.57706182e-07
+1.135332842e-09
+1.200841644e-07
+4.167709339e-06
+7.82760817e-06
+1.444096635e-06
+2.566989594e-05
+3.703035915e-07
+2.683318538e-05
+2.223130286e-07
+1.771561768e-05
+1.154453031e-07
+4.676014437e-07
+1.045571408e-08
+5.174119793e-07
+8.734308333e-07
+1.146383843e-08
+8.783876977e-07
+7.500376201e-10
+1.921618268e-05
+5.899024727e-08
+7.304615354e-05
+1.070796034e-08
+2.432284524e-05
+2.466254787e-09
+1.587769497e-05
+5.253475459e-08
+1.186364484e-06
+2.513004088e-08
+2.87819867e-05
+1.268569695e-09
+4.036264205e-07
+1.480215602e-05
+0.007764494839
+1.266601317e-05
+2.673263662e-07
+2.052245037e-07
+3.026351381e-09
+3.958705306e-09
+5.153048282e-10
+2.30485786e-10
+4.00164636e-09
+5.422561302e-12
+1.079720947e-08
+7.875946683e-07
+2.049257559e-13
+2.452534431e-10
+6.723860105e-09
+1.881353189e-09
+8.769041652e-09
+1.325700715e-07
+8.79667941e-10
+8.5986373e-09
+1.838834465e-09
+1.411765524e-09
+3.18067218e-09
+1.657130925e-09
+6.291536437e-07
+1.407357562e-08
+2.446358306e-10
+3.694611522e-06
+7.168161371e-08
+1.515101018e-07
+5.976714028e-07
+9.943558916e-11
+1.770298093e-10
+6.826696518e-10
+3.501929792e-09
+1.003706187e-11
+2.246634535e-10
+1.563106006e-08
+1.258778496e-08
+1.510668332e-09
+1.860249337e-08
+7.435896516e-11
+8.89181714e-11
+8.343559836e-07
+7.820974821e-10
+7.372052076e-09
+1.737913173e-08
+4.796532688e-10
+1.006823211e-11
+2.297476668e-07
+2.964280788e-09
+5.119370398e-06
+1.217074468e-09
+1.247831141e-10
+2.37987642e-10
+6.846887143e-08
+1.126062262e-08
+9.36618524e-09
+8.815178295e-13
+1.248917793e-09
+1.287973388e-06
+1.86196907e-05
+5.985896019e-09
+3.576308021e-09
+1.396180119e-07
+5.597665378e-09
+1.227844729e-07
+3.184711941e-10
+1.281522958e-09
+3.785294808e-08
+8.065221219e-10
+1.797290698e-08
+4.870819508e-09
+1.481392231e-08
+6.148531319e-13
+2.607634113e-08
+7.503249808e-09
+7.319832495e-10
+3.917501637e-06
+2.455952184e-09
+1.635840103e-09
+1.504256884e-07
+4.625984077e-12
+2.544655175e-10
+2.326287797e-09
+1.209441139e-07
+9.766041156e-09
+2.844111981e-07
+1.20119614e-06
+7.294984792e-08
+2.673419175e-08
+3.217599397e-11
+3.051042541e-08
+8.284597023e-08
+2.058233732e-10
+2.829564576e-09
+6.317615443e-05
+5.647542344e-08
+3.939768099e-09
+6.94521861e-09
+2.688795896e-09
+1.246674677e-07
+1.659871523e-07
+2.236153688e-05
+9.480324188e-09
+9.50066876e-07
+7.270988017e-08
+4.04309441e-07
+7.377999608e-10
+1.151204932e-07
+3.256182092e-08
+1.170362629e-12
+5.503648305e-08
+1.043808855e-11
+1.203531525e-08
+1.075547057e-10
+8.107924721e-07
+4.847758787e-11
+7.343486683e-06
+1.187542764e-11
+3.503963419e-08
+7.017971335e-12
+2.463602443e-10
+1.851798263e-10
+1.513084866e-09
+8.01852224e-09
+3.929366966e-06
+2.084034312e-07
+5.951098049e-10
+3.506971351e-06
+5.267869558e-12
+3.372542047e-06
+1.693992103e-11
+1.866988743e-10
+2.116462536e-10
+3.831407595e-10
+6.969326172e-05
+1.539437415e-08
+1.101433347e-11
+1.388232647e-10
+5.247749174e-08
+4.682028909e-08
+1.641598156e-10
+2.193557269e-08
+1.553195144e-09
+2.996101226e-08
+2.723666317e-11
+1.942276011e-09
+1.292931245e-11
+3.828442429e-12
+1.610129287e-08
+1.68730662e-06
+1.925468729e-09
+4.366676054e-13
+6.454416036e-07
+6.024026922e-07
+2.580228274e-10
+1.225798734e-05
+1.999308637e-11
+4.860872791e-11
+2.362341657e-08
+1.373652589e-08
+3.790341756e-12
+1.087152141e-08
+3.129247636e-07
+1.364371415e-09
+1.71528796e-05
+3.172915696e-08
+1.82357355e-08
+3.114465198e-09
+3.261406498e-10
+2.126159374e-05
+5.670721103e-08
+9.666079594e-10
+7.465172199e-10
+1.354594056e-10
+2.460812063e-08
+1.087490927e-09
+2.736632646e-07
+5.112932147e-10
+6.30608916e-07
+3.16614122e-09
+2.044783566e-08
+6.895475483e-10
+6.672701099e-11
+5.398066665e-09
+1.01564995e-07
+5.845619561e-10
+4.836690216e-08
+5.100722965e-10
+1.572957817e-08
+1.787346401e-10
+1.632619667e-08
+7.017140249e-08
+7.320144324e-12
+3.02986803e-11
+1.409100801e-12
+1.238542063e-06
+8.502558829e-08
+3.438481899e-08
+4.863624248e-07
+5.154336834e-07
+2.089682494e-09
+3.431232831e-10
+1.781888545e-08
+1.544255738e-09
+4.308591117e-09
+2.652013597e-09
+1.604288279e-11
+1.019669685e-05
+1.12327842e-09
+2.815515241e-12
+1.072273787e-10
+6.773434559e-09
+2.399387849e-09
+1.75474283e-07
+6.117989542e-11
+8.592612784e-06
+6.887595232e-11
+1.79993583e-09
+2.674398001e-10
+1.267708042e-08
+1.616751919e-09
+2.418384582e-10
+2.161734611e-07
+3.594695838e-06
+1.314781583e-05
+3.035129573e-06
+5.146844833e-12
+8.125025163e-07
+2.904326031e-07
+8.278771155e-08
+1.491230091e-12
+3.232705305e-10
+3.014800965e-07
+3.869271268e-08
+4.060064314e-09
+2.722533999e-09
+1.252200287e-06
+8.533922342e-10
+1.170246478e-13
+1.013028025e-07
+1.173657504e-10
+1.230854977e-06
+3.602985461e-07
+2.340450846e-10
+1.622721489e-07
+1.855075276e-10
+1.873406688e-13
+1.477955216e-10
+5.974685081e-09
+5.502790891e-08
+6.238719977e-09
+2.281603193e-08
+2.708614274e-09
+8.942145684e-07
+8.600069274e-08
+5.313891433e-08
+1.15030578e-06
+4.275597144e-10
+2.535746467e-12
+1.472699284e-07
+2.05450342e-10
+2.45239943e-06
+2.149773698e-09
+1.302041059e-08
+1.354492219e-05
+1.493744046e-10
+4.155110822e-09
+1.975404554e-09
+7.883672681e-09
+3.016978986e-08
+6.106630141e-07
+7.432899837e-09
+3.802000369e-08
+1.356515625e-08
+7.945785661e-11
+6.146806632e-09
+1.061252645e-06
+3.425558912e-09
+4.724377322e-09
+2.264944373e-06
+5.206889333e-12
+1.903801687e-11
+5.585064622e-09
+5.143287236e-12
+8.796169898e-08
+2.01831747e-09
+7.315991184e-07
+6.364925571e-11
+5.084300761e-08
+4.955537206e-10
+7.578932433e-10
+1.04156874e-10
+1.067901402e-10
+2.629754276e-10
+7.25335847e-09
+3.644329828e-09
+3.524042064e-06
+1.911472842e-10
+7.705710398e-09
+9.497312756e-06
+1.776151243e-07
+7.671908505e-12
+1.053728533e-07
+4.52842088e-07
+2.689018224e-11
+2.172694222e-09
+1.388552825e-10
+8.063784626e-10
+5.66398293e-08
+1.744770454e-09
+2.052060722e-11
+2.110818333e-11
+4.471876064e-07
+1.547841859e-09
+1.123968452e-08
+1.220442239e-08
+7.869244588e-07
+1.643473453e-10
+1.008574226e-08
+3.353923888e-07
+6.498701544e-10
+1.784279801e-10
+3.805045733e-07
+8.427141619e-07
+1.498045908e-09
+1.039453208e-10
+1.111541375e-08
+1.747478719e-09
+2.355118422e-09
+1.678201094e-08
+2.202184418e-10
+5.649709141e-08
+7.45087756e-08
+3.278913775e-11
+3.654180177e-11
+1.935597745e-11
+4.454404883e-09
+1.468811182e-11
+6.57114871e-09
+6.056868166e-10
+1.45099015e-07
+1.129009027e-10
+1.042111653e-11
+3.257323655e-11
+9.125783554e-09
+1.15776364e-08
+1.347035226e-10
+1.772518894e-07
+2.065966085e-07
+1.18335761e-10
+4.340575369e-11
+1.724054892e-07
+1.017507229e-09
+4.448105514e-08
+9.297852627e-10
+1.457953015e-08
+1.344680446e-06
+3.942919772e-10
+6.431630422e-10
+2.598292431e-09
+9.723217413e-11
+5.887976816e-07
+1.250935985e-08
+1.91892714e-08
+1.266147267e-09
+2.358514388e-08
+9.312371762e-07
+4.777005653e-09
+1.101297338e-05
+4.464552646e-10
+7.607715154e-08
+5.154573346e-10
+2.264473432e-08
+8.764029047e-09
+8.615187911e-07
+1.40027638e-06
+2.971161233e-07
+1.70303243e-09
+9.085713716e-08
+7.676704887e-09
+3.495574146e-07
+5.348513441e-10
+8.550322518e-10
+5.35951439e-10
+3.270519121e-08
+2.199299151e-11
+3.481764536e-07
+6.965854851e-10
+1.079164489e-09
+2.042347426e-11
+1.522429952e-08
+1.81465207e-09
+3.79819579e-08
+3.251519125e-06
+1.339537878e-08
+1.067186532e-10
+2.907350796e-09
+2.121014228e-09
+1.929111876e-10
+5.485037209e-10
+2.944494304e-10
+3.400494514e-09
+2.722261269e-07
+1.103453431e-07
+4.918083741e-10
+1.403502855e-08
+1.186087559e-10
+2.383805467e-09
+6.366306819e-10
+2.884744386e-08
+3.233589437e-09
+0.0001662944389
+2.948950879e-10
+2.818085744e-08
+2.146436612e-09
+2.878511074e-11
+1.429955578e-11
+2.151447291e-11
+4.991716189e-07
+7.608410036e-11
+4.322111296e-08
+8.515575318e-10
+4.52193765e-09
+4.65887361e-08
+4.872378255e-10
+1.225930736e-08
+9.732262711e-09
+5.552760073e-08
diff --git a/t/ME_data/ME_w_FKL_tree.dat b/t/ME_data/ME_w_FKL_tree.dat
index 3c21bd1..aa38bd9 100644
--- a/t/ME_data/ME_w_FKL_tree.dat
+++ b/t/ME_data/ME_w_FKL_tree.dat
@@ -1,556 +1,556 @@
-1.66735e-10
-4.4041e-08
-5.92405e-10
-0.0366658
-3.02387e-05
-6.33019e-05
-1.3673e-05
-0.0181281
-0.0140049
-2.7364e-07
-1.42529e-06
-0.376058
-1.4039e-07
-0.000204353
-3.25009e-06
-0.0202204
-4.52458e-06
-0.577611
-0.00126865
-1.42403e-05
-5.69446e-05
-3.24538e-06
-6.95782e-06
-502.564
-0.5466
-5.6995e-08
-0.0172244
-4.88591e-06
-1.38707e-07
-3.05536e-07
-0.00398169
-1.53828e-09
-7.82136e-12
-0.000227506
-4.39617e-08
-0.00013258
-0.000308858
-1.19829e-09
-2.09184e-06
-4.61199e-10
-0.00033569
-444.624
-2.96405
-6.36854e-09
-4.08676e-07
-0.14296
-2.36192e-08
-0.000639599
-2.76895e-06
-0.00415682
-1.31852e-09
-0.0549343
-7.37083e-05
-1.55399
-1.27455e-07
-3.36237e-07
-3.20486e-10
-3.5427e-05
-3.09312e-08
-0.0143784
-4.62088e-07
-9.02783
-0.00219736
-1.57684e-09
-1.32025e-05
-1.21352e-09
-2.81855e-07
-0.000574464
-1.50161e-07
-0.00157949
-0.000365113
-1.00946e-05
-0.0132691
-1.66234e-07
-2.28424e-07
-0.000192614
-18453.2
-0.000166803
-2.09525e-06
-3.20392e-07
-2.31454e-05
-0.000354074
-0.037135
-0.000172935
-4543.48
-4.26989e-05
-462.744
-2.12671e-09
-0.000418861
-5.95467e-05
-109.695
-235.696
-5.95639e-10
-1.72486e-05
-2.91207e-08
-1.81559e-05
-0.000350347
-7.02993e-08
-0.0704984
-2.96942e-07
-7.6676e-11
-5.13603e-05
-2.97235e-06
-0.223145
-1.64837e-07
-2.89016e-13
-9.51596e-12
-0.00375317
-1.85032e-07
-2.34686e-05
-1.20398e-05
-7.04312e-06
-2.02827e-06
-0.00464863
-2.03636e-05
-1.04609
-0.00591302
-4.77803e-07
-2.01462e-06
-0.000182964
-0.0489411
-2.61445e-09
-0.000100035
-5148.58
-0.000216259
-0.000332495
-6.04945e-08
-8.57456e-05
-2.76748e-05
-1.25562e-12
-0.000422337
-0.00133835
-0.00744617
-1.14326
-1.43195e-08
-6.38635e-07
-0.00862448
-4.37711e-06
-0.212646
-4.61289e+06
-4.01648e-05
-1.0193e-10
-2.31501e-05
-1.15591e-08
-1.13292e-07
-6.22732e-06
-2.5339e-05
-5.253e-08
-0.0957011
-0.00346245
-0.00202415
-0.000809109
-9.25638e-08
-0.00377243
-0.0273365
-4.03002e-07
-3.29569e-08
-7.93097e-06
-3.40496e-08
-0.000230937
-1.81192e-11
-6.81293e-10
-3.40697e-05
-0.240183
-0.00378173
-109851
-6.14314e-07
-1.35922e-06
-3.41102e-11
-3.51399e-07
-0.000198309
-0.000188839
-6.76021e-08
-0.000284694
-1.43864e-08
-5.16049e-09
-5.62878e-05
-0.770015
-0.247726
-9.93266e-09
-3.18242e-07
-1.00451e-05
-3.30423e-05
-1.06448
-6.225e-07
-6.60516e-08
-1.17284e-05
-0.00509921
-1.99188e-06
-1.50062e-10
-2.80521e-07
-2.828e-06
-0.445898
-2.33741e-08
-0.0750609
-1.61982e-08
-2.38598e-06
-3.91605e-10
-0.00044492
-9.87935e-05
-6.33457e-06
-0.00212007
-1.7068e-05
-12800.8
-7.84114e-05
-3.56353e-06
-1.53868e-07
-0.000147522
-1.59291e-06
-0.0760704
-6.16233e-07
-0.0110517
-0.132904
-0.0208312
-2.65967e-08
-5.05612e-05
-0.00799967
-6.28914e-07
-3.67441e-07
-0.711692
-1.4769e-07
-0.00133689
-9.65703e-05
-0.000140625
-0.000165611
-1.4526e-10
-84.6939
-7.30804e-05
-4.34679e-05
-1.13212e-05
-9.76841e-07
-0.138946
-0.857284
-4.80432e-07
-159.45
-0.0037607
-0.000330063
-8.6496e-05
-0.969737
-0.0461401
-548.271
-3.43983e-07
-3.45997e-06
-1.404e-12
-1.60387e-05
-4.70059e-07
-4630.86
-8.43376e-05
-7.53079e-06
-1.23222e-12
-0.0482061
-7.35608
-3.0975e-05
-1.80607e-05
-6.0602e-06
-1.25394e-08
-1.04957e-06
-3.32049e-06
-5.35062e-07
-0.00359605
-7.3544e-08
-9.09049e-06
-1.36527e-10
-2.98454e-06
-2.66174e-05
-7395.92
-3.77381e-07
-1.82459e-07
-0.0035087
-3.15536e-07
-0.00029903
-4.47086e-08
-0.000322599
-3.19833e-05
-1.44715e-05
-2.91342e-07
-3.66301e-07
-4.57968e-05
-5.56722e-10
-6.5099e-07
-1.54889e-07
-0.000163301
-2.26083e-11
-0.00015639
-3.58445e-05
-4.53362e-07
-2.07853e-05
-0.000543815
-0.000193472
-5.55595e-05
-0.0003522
-2.36567e-05
-4.95004e-06
-5.22835
-1.45351e-05
-0.00108416
-0.00155746
-0.740537
-2.04926e-06
-6.74606e-07
-0.525897
-2.86106e-09
-0.00140433
-9.73885e-07
-7.87825e-07
-9.11382e-07
-1.03271e-05
-0.00819761
-9.34316e-07
-102.715
-3.12936e-06
-8.17265e-05
-0.793069
-0.0394783
-0.249998
-3.2951e-10
-3.14814e-05
-6.84633e-07
-4.12731e-08
-3.30826
-3.83301e-05
-5.17716e-11
-0.00863598
-4.86168e-13
-2.07733
-1.52121e-05
-0.00762508
-3.9995e-07
-1.20631e-07
-8.72061e-14
-0.167408
-0.0349983
-2.80134e-08
-0.000149104
-42.7578
-0.0174395
-0.000805168
-4.51894e-05
-1.13497e-08
-0.00223994
-0.327996
-2.51105e-06
-6.52328e-06
-0.00307739
-0.00010686
-0.0826528
-3.40586e-09
-4.443e-08
-3.13325e-09
-0.393115
-2.24245e-05
-0.514506
-0.012296
-2.91465e-08
-6.13021e-11
-0.0106812
-2.1283e-05
-0.219704
-0.000904437
-0.00613495
-4.52535e-07
-0.00248037
-0.00206347
-9.02615e-05
-1.5555e-07
-5.08439e-06
-8.87029e-05
-0.00398221
-6.00901e-08
-3.42807e-06
-6.36962e-06
-1.09107e-05
-5.67e-06
-1.39205
-4.60967e-06
-0.101108
-0.0930008
-4.45779e-09
-0.000216392
-8.08965e-13
-0.00669366
-0.31851
-1.95031e-09
-1.27845e-08
-1.75725
-6.02183e-06
-9.47245e-06
-2.73499e-09
-1.31829e-06
-2.70901e-06
-6541.91
-0.0432065
-3.53221e-07
-6.71928e-05
-0.787997
-0.000468341
-0.0260916
-8.38173e-07
-9.59311
-1.42948e-06
-3.57455e-07
-9.90402e-07
-3.97145
-0.0663521
-1.9818e-06
-0.000625738
-1.44948e-06
-1.71863e-06
-3.2594e-06
-0.413732
-5.49708e-09
-81359.3
-9.32927e-06
-9.07516e-08
-8.47019e-06
-529.796
-8.03296
-2.46034e-05
-4.02271e-05
-6.76255e-05
-1.28593
-0.000184522
-5.46581e-11
-0.0292004
-0.00286131
-2.53505e-05
-2.14022e-10
-0.0119781
-3.36826e-11
-2.26669e-07
-3.71746e-07
-1.63972e-09
-1.79883e-05
-1.12241e-06
-0.000786734
-3.75728e-11
-1.04631e-05
-1.83096e-06
-0.000908951
-1.19379e-08
-5.85447e-06
-1.6532e-08
-3.08531e-05
-5.15335e-09
-6.67385e-08
-0.000987984
-0.0218896
-0.000673661
-1.4376e-07
-0.00919708
-1.93858e-06
-3.72294e-05
-0.00374186
-81844.1
-2.98802e-06
-0.113867
-3.84423e-06
-7.78978e-06
-40.3067
-1.64835e-06
-3773.67
-4.4311e-12
-0.031312
-0.000274236
-5.74005e-10
-4.09009e-06
-0.00976802
-6.13682e-07
-1.89011e-06
-3.18096e-07
-6.37238e-06
-7.34926e-06
-1.05138e-11
-0.00014211
-0.435855
-1.14883e-06
-8.41324e-08
-1.65963e-07
-0.000258003
-0.000278053
-3.97598e-06
-0.00385072
-6.17263e-06
-4.28477e+09
-3.35054e-05
-5.38143e-05
-26.8569
-0.000212268
-4.56831e-07
-2.43236e-06
-0.00044186
-1.61801
-1.29384e-05
-7.09936e-05
-0.0632148
-2.28731e-06
-8.46878e-06
-3.02247e-06
-4.90988e-08
-1.56847e-11
-63.7539
-3.22618e-07
-7.88706e-05
-4.0831e-07
-2.56971e-05
-0.00368127
-3.40935e-05
-7.56007e-08
-5.57694e-09
-2.19208e-07
-0.241623
-1.2466e-07
-1.21792e-06
-2.99997e-06
-7.90484e-05
-44.0162
-7.27495e-11
-0.255535
-20.4483
-1.10093e-09
-0.799591
-2.4149e-05
-0.0275875
-0.523435
-1.05659e-06
-0.0372607
-2.63343e-08
-9.11403e-07
-0.000531948
-3.19487e-07
-1.22984e-11
-468.197
-1.06812e-09
-0.00768798
-1.39065e-05
-0.000886794
-1.76499e-10
-1.0843e-05
-0.00534105
-2.39915e-11
-4.19033e-05
-0.00318565
-8.05371
-5.87035e-10
-1.77471e-07
-78509.9
-15.3982
-6.79612e-07
-1.14968e-06
-0.0236821
-8.65278e-05
-0.317341
-0.0186315
-1.09832e-10
-5.45839e-10
-5.49319e-09
+1.667315186e-10
+4.404017066e-08
+5.923929781e-10
+0.03666508128
+3.023811892e-05
+6.330069238e-05
+1.36727288e-05
+0.01812778747
+0.01400462796
+2.736345606e-07
+1.425266567e-06
+0.3760505288
+1.403875301e-07
+0.0002043491653
+3.250027572e-06
+0.02021997455
+4.524485983e-06
+0.5775996967
+0.001268626202
+1.423999659e-05
+5.69434408e-05
+3.245314232e-06
+6.957684481e-06
+502.5539886
+0.546589066
+5.699382516e-08
+0.01722406921
+4.885817083e-06
+1.387043832e-07
+3.055296275e-07
+0.00398161282
+1.538254389e-09
+7.821206371e-12
+0.0002275010776
+4.396085722e-08
+0.0001325770945
+0.0003088523271
+1.198263944e-09
+2.091801125e-06
+4.611899697e-10
+0.0003356833523
+444.6157154
+2.96399638
+6.368416799e-09
+4.086675293e-07
+0.1429569459
+2.36187578e-08
+0.0006395867848
+2.768892451e-06
+0.004156740339
+1.318496977e-09
+0.05493318836
+7.370685032e-05
+1.553957194
+1.274528902e-07
+3.362298367e-07
+3.204793071e-10
+3.54263096e-05
+3.093057968e-08
+0.01437807329
+4.620789095e-07
+9.027648503
+0.00219731232
+1.576808023e-09
+1.320220278e-05
+1.213500059e-09
+2.818491773e-07
+0.0005744528724
+1.501581137e-07
+0.001579455845
+0.0003651063047
+1.009436798e-05
+0.01326887726
+1.662304251e-07
+2.284194017e-07
+0.0001926104561
+18452.86145
+0.0001668000837
+2.095206203e-06
+3.203861113e-07
+2.314498192e-05
+0.0003540670002
+0.03713432111
+0.0001729313353
+4543.387336
+4.269801921e-05
+462.7351718
+2.126669342e-09
+0.0004188528579
+5.954551619e-05
+109.6927325
+235.6910069
+5.956272743e-10
+1.724826126e-05
+2.912010673e-08
+1.815557177e-05
+0.0003503405878
+7.0297927e-08
+0.07049700072
+2.969361912e-07
+7.667451411e-11
+5.135925587e-05
+2.972291616e-06
+0.2231408191
+1.648337501e-07
+2.890101433e-13
+9.515775559e-12
+0.0037530943
+1.850285892e-07
+2.346815717e-05
+1.203952406e-05
+7.042982993e-06
+2.028234987e-06
+0.004648534414
+2.036316202e-05
+1.046064594
+0.005912907534
+4.777939797e-07
+2.014579042e-06
+0.0001829605307
+0.04894013785
+2.614399079e-09
+0.0001000331728
+5148.47905
+0.0002162546666
+0.0003324886286
+6.049331808e-08
+8.57439134e-05
+2.767430164e-05
+1.255594728e-12
+0.000422328537
+0.001338320445
+0.007446024285
+1.143239994
+1.43191943e-08
+6.386226048e-07
+0.008624305643
+4.377026988e-06
+0.2126420458
+4612797.152
+4.016402807e-05
+1.019281655e-10
+2.314965225e-05
+1.155885575e-08
+1.132900933e-07
+6.227196475e-06
+2.533846927e-05
+5.252893646e-08
+0.09569925128
+0.003462382521
+0.0020241107
+0.000809092856
+9.256197468e-08
+0.003772354596
+0.02733597207
+4.029936956e-07
+3.295628446e-08
+7.930818292e-06
+3.404892e-08
+0.0002309328405
+1.811887164e-11
+6.812796603e-10
+3.406900397e-05
+0.2401784991
+0.003781651045
+109848.5319
+6.143017017e-07
+1.359193255e-06
+3.410957871e-11
+3.513925831e-07
+0.000198305341
+0.0001888354563
+6.760072294e-08
+0.0002846881218
+1.438607888e-08
+5.16039209e-09
+5.628667659e-05
+0.7699996394
+0.2477210875
+9.932465848e-09
+3.182352803e-07
+1.004494585e-05
+3.304169857e-05
+1.06445732
+6.224879045e-07
+6.605030351e-08
+1.172820826e-05
+0.005099112092
+1.991844825e-06
+1.50059318e-10
+2.805156093e-07
+2.827944566e-06
+0.4458888367
+2.337368164e-08
+0.0750594269
+1.619790162e-08
+2.385931472e-06
+3.915978966e-10
+0.0004449108452
+9.879150505e-05
+6.33444184e-06
+0.002120032931
+1.706764242e-05
+12800.56009
+7.840986998e-05
+3.563455571e-06
+1.538647921e-07
+0.0001475188555
+1.592883514e-06
+0.07606888819
+6.162212068e-07
+0.01105149681
+0.1329009412
+0.02083080371
+2.659620874e-08
+5.05602241e-05
+0.007999515094
+6.289014493e-07
+3.674334869e-07
+0.7116777276
+1.476867013e-07
+0.001336862253
+9.656841695e-05
+0.00014062231
+0.0001656081822
+1.452573321e-10
+84.69223131
+7.307891053e-05
+4.346706606e-05
+1.132101435e-05
+9.768221047e-07
+0.1389427947
+0.8572671404
+4.804230693e-07
+159.4469445
+0.003760629048
+0.0003300569962
+8.649428587e-05
+0.9697186064
+0.04613922975
+548.2597606
+3.439759113e-07
+3.459902785e-06
+1.403967881e-12
+1.603836846e-05
+4.70050048e-07
+4630.768694
+8.433593526e-05
+7.530639033e-06
+1.232192916e-12
+0.04820512745
+7.355937182
+3.097434638e-05
+1.806033422e-05
+6.060085027e-06
+1.253910765e-08
+1.049551452e-06
+3.320423212e-06
+5.350515263e-07
+0.003595978468
+7.35425805e-08
+9.090306272e-06
+1.365243147e-10
+2.984479239e-06
+2.661683236e-05
+7395.770412
+3.773738847e-07
+1.824555912e-07
+0.003508627071
+3.155299621e-07
+0.0002990237065
+4.470773979e-08
+0.0003225923823
+3.198267575e-05
+1.447122399e-05
+2.913359853e-07
+3.662938837e-07
+4.579591824e-05
+5.56710874e-10
+6.509772869e-07
+1.548860114e-07
+0.0001632982761
+2.26078942e-11
+0.0001563867319
+3.584381226e-05
+4.533535792e-07
+2.078486912e-05
+0.0005438046165
+0.0001934684099
+5.555844851e-05
+0.0003521935685
+2.36562676e-05
+4.949944419e-06
+5.228243829
+1.453484426e-05
+0.001084136247
+0.001557434021
+0.7405224934
+2.049217645e-06
+6.74592423e-07
+0.5258867438
+2.861005053e-09
+0.001404306405
+9.73866179e-07
+7.878094127e-07
+9.113639959e-07
+1.032693853e-05
+0.008197450272
+9.342974707e-07
+102.7129827
+3.129298248e-06
+8.172492317e-05
+0.7930532571
+0.03947753434
+0.2499930764
+3.295030571e-10
+3.148075144e-05
+6.846196446e-07
+4.12723336e-08
+3.308198517
+3.832929736e-05
+5.177059508e-11
+0.008635809082
+4.861589384e-13
+2.077292464
+1.521176383e-05
+0.007624935655
+3.99942051e-07
+1.206289002e-07
+8.720444999e-14
+0.1674051817
+0.03499759944
+2.801286086e-08
+0.0001491013213
+42.75697312
+0.01743917696
+0.000805152034
+4.518853522e-05
+1.134944356e-08
+0.002239900545
+0.3279897581
+2.510997933e-06
+6.523150073e-06
+0.003077328186
+0.0001068583252
+0.08265116311
+3.405794705e-09
+4.442918359e-08
+3.133188614e-09
+0.3931073001
+2.242401179e-05
+0.514495615
+0.01229571692
+2.914589812e-08
+6.13008955e-11
+0.01068101981
+2.12826257e-05
+0.2197000211
+0.0009044190984
+0.00613483036
+4.525265269e-07
+0.002480316843
+0.00206343391
+9.025978488e-05
+1.555465877e-07
+5.08428788e-06
+8.870110503e-05
+0.003982127756
+6.008888734e-08
+3.428007477e-06
+6.369497712e-06
+1.091047307e-05
+5.669888154e-06
+1.392027111
+4.609583801e-06
+0.1011063476
+0.0929989694
+4.457706325e-09
+0.0002163878214
+8.089493354e-13
+0.00669353176
+0.3185037668
+1.950268359e-09
+1.278425165e-08
+1.757219468
+6.021713895e-06
+9.472265881e-06
+2.734935172e-09
+1.318260485e-06
+2.708957193e-06
+6541.780132
+0.04320561368
+3.532141311e-07
+6.719153951e-05
+0.7879815796
+0.0004683319739
+0.02609109045
+8.381565463e-07
+9.592917303
+1.429446876e-06
+3.574476868e-07
+9.903821423e-07
+3.971367614
+0.06635086057
+1.981764538e-06
+0.0006257260869
+1.449454172e-06
+1.718595234e-06
+3.259331452e-06
+0.4137235511
+5.496974987e-09
+81357.72715
+9.329083772e-06
+9.074979936e-08
+8.470022064e-06
+529.7853256
+8.032804461
+2.460295783e-05
+4.022634352e-05
+6.76241946e-05
+1.285904395
+0.0001845179753
+5.465705536e-11
+0.0291998017
+0.002861256225
+2.534997204e-05
+2.14017616e-10
+0.01197790638
+3.368197968e-11
+2.266647534e-07
+3.717389776e-07
+1.639683132e-09
+1.798794617e-05
+1.12238298e-06
+0.0007867185765
+3.757207913e-11
+1.046286915e-05
+1.830925286e-06
+0.000908932743
+1.193763383e-08
+5.854353695e-06
+1.653169705e-08
+3.085250875e-05
+5.153252213e-09
+6.673716131e-08
+0.0009879644937
+0.02188915105
+0.0006736478856
+1.437570188e-07
+0.00919689793
+1.938540628e-06
+3.722872132e-05
+0.003741783731
+81842.52348
+2.987965499e-06
+0.1138645144
+3.844157179e-06
+7.789627934e-06
+40.30585138
+1.648319001e-06
+3773.592309
+4.431009224e-12
+0.03131139901
+0.0002742309107
+5.739935794e-10
+4.090014138e-06
+0.009767828669
+6.136698719e-07
+1.890077151e-06
+3.180893624e-07
+6.37225809e-06
+7.349117366e-06
+1.051360193e-11
+0.0001421072399
+0.4358467006
+1.148805789e-06
+8.413074125e-08
+1.659597018e-07
+0.0002579982621
+0.0002780472867
+3.975906181e-06
+0.003850647449
+6.17251411e-06
+4284683661
+3.350469943e-05
+5.381322199e-05
+26.85638779
+0.0002122633368
+4.568221053e-07
+2.432312982e-06
+0.0004418514628
+1.617974668
+1.293817999e-05
+7.099221858e-05
+0.06321356494
+2.287265277e-06
+8.4686102e-06
+3.022407149e-06
+4.909788141e-08
+1.568437743e-11
+63.75266761
+3.22612034e-07
+7.886901688e-05
+4.083024982e-07
+2.569662114e-05
+0.003681192521
+3.40928287e-05
+7.559921595e-08
+5.576827397e-09
+2.192042242e-07
+0.2416181335
+1.246573476e-07
+1.21789116e-06
+2.99990951e-06
+7.904684879e-05
+44.01535081
+7.274811089e-11
+0.255530375
+20.44788446
+1.100905094e-09
+0.7995748363
+2.414849244e-05
+0.02758696241
+0.5234252152
+1.056566077e-06
+0.0372599436
+2.633376081e-08
+9.113851924e-07
+0.0005319377128
+3.194810891e-07
+1.229820626e-11
+468.1881533
+1.068098842e-09
+0.007687828727
+1.390625724e-05
+0.000886776436
+1.764959754e-10
+1.084277463e-05
+0.005340941026
+2.399107396e-11
+4.190251504e-05
+0.003185585077
+8.053545372
+5.870235443e-10
+1.774670694e-07
+78508.30739
+15.39791168
+6.795987735e-07
+1.149657598e-06
+0.0236816412
+8.652613007e-05
+0.3173346064
+0.01863118456
+1.098294659e-10
+5.458278616e-10
+5.493083019e-09
diff --git a/t/ME_data/config_mt.yml b/t/ME_data/config_mt.yml
index fd871f3..25be9fd 100644
--- a/t/ME_data/config_mt.yml
+++ b/t/ME_data/config_mt.yml
@@ -1,31 +1,44 @@
trials: 1
min extparton pt: 30
resummation jets:
min pt: 30
algorithm: antikt
R: 0.4
fixed order jets:
min pt: 30
event treatment:
FKL: reweight
unordered: reweight
extremal qqx: discard
central qqx: discard
non-resummable: discard
scales: 125
log correction: false
random generator:
name: mixmax
seed: 1
+vev: 246.2196508
+
+particle properties:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
Higgs coupling:
use impact factors: false
mt: 174
include bottom: false
diff --git a/t/ME_data/config_mtinf.yml b/t/ME_data/config_mtinf.yml
index 0400893..f1a8f7b 100644
--- a/t/ME_data/config_mtinf.yml
+++ b/t/ME_data/config_mtinf.yml
@@ -1,26 +1,39 @@
trials: 1
min extparton pt: 30
resummation jets:
min pt: 30
algorithm: antikt
R: 0.4
fixed order jets:
min pt: 30
event treatment:
FKL: reweight
unordered: reweight
extremal qqx: discard
central qqx: discard
non-resummable: discard
scales: 125
log correction: false
+vev: 246.2196508
+
+particle properties:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
random generator:
name: mixmax
seed: 1
diff --git a/t/ME_data/config_mtmb.yml b/t/ME_data/config_mtmb.yml
index 3c7ce17..eb0075a 100644
--- a/t/ME_data/config_mtmb.yml
+++ b/t/ME_data/config_mtmb.yml
@@ -1,32 +1,45 @@
trials: 1
min extparton pt: 30
resummation jets:
min pt: 30
algorithm: antikt
R: 0.4
fixed order jets:
min pt: 30
event treatment:
FKL: reweight
unordered: reweight
extremal qqx: discard
central qqx: discard
non-resummable: discard
scales: 125
log correction: false
random generator:
name: mixmax
seed: 1
+vev: 246.2196508
+
+particle properties:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
Higgs coupling:
use impact factors: false
mt: 174
include bottom: true
mb: 4.7
diff --git a/t/ME_data/config_w_ME.yml b/t/ME_data/config_w_ME.yml
index c389201..27d826b 100644
--- a/t/ME_data/config_w_ME.yml
+++ b/t/ME_data/config_w_ME.yml
@@ -1,26 +1,39 @@
trials: 1
min extparton pt: 30
resummation jets:
min pt: 30
algorithm: antikt
R: 0.4
fixed order jets:
min pt: 30
event treatment:
FKL: reweight
unordered: reweight
extremal qqx: reweight
central qqx: reweight
non-resummable: discard
scales: 125
log correction: false
+vev: 246.2196508
+
+particle properties:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
+ mass: 80.419
+ width: 2.0476
+ Z:
+ mass: 91.187
+ width: 2.495
+
random generator:
name: mixmax
seed: 1
diff --git a/t/check_res.cc b/t/check_res.cc
index 274427b..f9fc0d0 100644
--- a/t/check_res.cc
+++ b/t/check_res.cc
@@ -1,166 +1,171 @@
/**
* \authors The HEJ collaboration (see AUTHORS for details)
* \date 2019
* \copyright GPLv2 or later
*/
#include <iostream>
#include <math.h>
#include "LHEF/LHEF.h"
#include "HEJ/Event.hh"
#include "HEJ/EventReweighter.hh"
#include "HEJ/Mixmax.hh"
#include "HEJ/stream.hh"
#define ASSERT(x) if(!(x)) { \
std::cerr << "Assertion '" #x "' failed.\n"; \
return EXIT_FAILURE; \
}
namespace{
const fastjet::JetDefinition jet_def{fastjet::kt_algorithm, 0.4};
const fastjet::JetDefinition Born_jet_def{jet_def};
constexpr double Born_jetptmin = 30;
constexpr double extpartonptmin = 30;
constexpr double max_ext_soft_pt_fraction = 0.1;
constexpr double jetptmin = 35;
constexpr bool log_corr = false;
+ const HEJ::ParticleProperties Wprop{80.385, 2.085};
+ const HEJ::ParticleProperties Zprop{91.187, 2.495};
+ const HEJ::ParticleProperties Hprop{125, 0.004165};
+ constexpr double vev = 246.2196508;
using EventTreatment = HEJ::EventTreatment;
using namespace HEJ::event_type;
HEJ::EventTreatMap treat{
{no_2_jets, EventTreatment::discard},
{bad_final_state, EventTreatment::discard},
{non_resummable, EventTreatment::discard},
{unof, EventTreatment::discard},
{unob, EventTreatment::discard},
{qqxexb, EventTreatment::discard},
{qqxexf, EventTreatment::discard},
{qqxmid, EventTreatment::discard},
{FKL, EventTreatment::reweight}
};
/// true if colour is allowed for particle
bool correct_colour(HEJ::Particle const & part){
if(HEJ::is_AWZH_boson(part) && !part.colour) return true;
if(!part.colour) return false;
int const colour = part.colour->first;
int const anti_colour = part.colour->second;
if(part.type == HEJ::ParticleID::gluon)
return colour != anti_colour && colour > 0 && anti_colour > 0;
if(HEJ::is_quark(part))
return anti_colour == 0 && colour > 0;
return colour == 0 && anti_colour > 0;
}
bool correct_colour(HEJ::Event const & ev){
if(!HEJ::event_type::is_resummable(ev.type()))
return true;
for(auto const & part: ev.incoming()){
if(!correct_colour(part))
return false;
}
for(auto const & part: ev.outgoing()){
if(!correct_colour(part))
return false;
}
return true;
}
};
int main(int argn, char** argv) {
if(argn == 5 && std::string(argv[4]) == "unof"){
--argn;
treat[unof] = EventTreatment::reweight;
treat[unob] = EventTreatment::discard;
treat[FKL] = EventTreatment::discard;
}
if(argn == 5 && std::string(argv[4]) == "unob"){
--argn;
treat[unof] = EventTreatment::discard;
treat[unob] = EventTreatment::reweight;
treat[FKL] = EventTreatment::discard;
}
else if(argn == 5 && std::string(argv[4]) == "splitf"){
--argn;
treat[qqxexb] = EventTreatment::discard;
treat[qqxexf] = EventTreatment::reweight;
treat[FKL] = EventTreatment::discard;
}
else if(argn == 5 && std::string(argv[4]) == "splitb"){
--argn;
treat[qqxexb] = EventTreatment::reweight;
treat[qqxexf] = EventTreatment::discard;
treat[FKL] = EventTreatment::discard;
}
else if(argn == 5 && std::string(argv[4]) == "qqxmid"){
--argn;
treat[qqxmid] = EventTreatment::reweight;
treat[FKL] = EventTreatment::discard;
}
if(argn != 4){
std::cerr << "Usage: check_res eventfile xsection tolerance [uno]";
return EXIT_FAILURE;
}
const double xsec_ref = std::stod(argv[2]);
const double tolerance = std::stod(argv[3]);
HEJ::istream in{argv[1]};
LHEF::Reader reader{in};
HEJ::PhaseSpacePointConfig psp_conf;
psp_conf.jet_param = HEJ::JetParameters{jet_def, jetptmin};
psp_conf.min_extparton_pt = extpartonptmin;
psp_conf.max_ext_soft_pt_fraction = max_ext_soft_pt_fraction;
HEJ::MatrixElementConfig ME_conf;
ME_conf.log_correction = log_corr;
ME_conf.Higgs_coupling = HEJ::HiggsCouplingSettings{};
+ ME_conf.ew_parameters.set_vevWZH(vev, Wprop, Zprop, Hprop);
HEJ::EventReweighterConfig conf;
conf.psp_config = std::move(psp_conf);
conf.ME_config = std::move(ME_conf);
conf.jet_param = psp_conf.jet_param;
conf.treat = treat;
reader.readEvent();
const bool has_Higgs = std::find(
begin(reader.hepeup.IDUP),
end(reader.hepeup.IDUP),
25
) != end(reader.hepeup.IDUP);
const double mu = has_Higgs?125.:91.188;
HEJ::ScaleGenerator scale_gen{
{{std::to_string(mu), HEJ::FixedScale{mu}}}, {}, 1.
};
HEJ::Mixmax ran{};
HEJ::EventReweighter hej{reader.heprup, std::move(scale_gen), conf, ran};
double xsec = 0.;
double xsec_err = 0.;
do{
auto ev_data = HEJ::Event::EventData{reader.hepeup};
ev_data.reconstruct_intermediate();
HEJ::Event ev{
ev_data.cluster(
Born_jet_def, Born_jetptmin
)
};
auto resummed_events = hej.reweight(ev, 100);
for(auto const & ev: resummed_events) {
ASSERT(correct_colour(ev));
ASSERT(isfinite(ev.central().weight));
xsec += ev.central().weight;
xsec_err += ev.central().weight*ev.central().weight;
}
} while(reader.readEvent());
xsec_err = std::sqrt(xsec_err);
const double significance =
std::abs(xsec - xsec_ref) / std::sqrt( xsec_err*xsec_err + tolerance*tolerance );
std::cout << xsec_ref << " +/- " << tolerance << " ~ "
<< xsec << " +- " << xsec_err << " => " << significance << " sigma\n";
if(significance > 3.){
std::cerr << "Cross section is off by over 3 sigma!\n";
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
diff --git a/t/jet_config.yml b/t/jet_config.yml
index 9309e04..9d7dc31 100644
--- a/t/jet_config.yml
+++ b/t/jet_config.yml
@@ -1,28 +1,41 @@
trials: 10
min extparton pt: 30
resummation jets:
min pt: 35
algorithm: antikt
R: 0.4
fixed order jets:
min pt: 30
event treatment:
FKL: reweight
unordered: keep
extremal qqx: discard
central qqx: keep
non-resummable: keep
log correction: false
scales: 91.188
random generator:
name: ranlux64
+vev: 246.2196508
+
+particle properties:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
event output:
- tst.lhe
diff --git a/t/jet_config_with_import.yml b/t/jet_config_with_import.yml
index 924cad3..446a58c 100644
--- a/t/jet_config_with_import.yml
+++ b/t/jet_config_with_import.yml
@@ -1,31 +1,44 @@
trials: 10
min extparton pt: 30
resummation jets:
min pt: 35
algorithm: antikt
R: 0.4
fixed order jets:
min pt: 30
event treatment:
FKL: reweight
unordered: discard
extremal qqx: discard
central qqx: discard
non-resummable: discard
log correction: false
scales: softest_jet_pt
event output:
- tst.lhe
random generator:
name: ranlux64
+vev: 246.2196508
+
+particle properties:
+ Higgs:
+ mass: 125
+ width: 0.004165
+ W:
+ mass: 80.385
+ width: 2.085
+ Z:
+ mass: 91.187
+ width: 2.495
+
import scales:
./libscales.so: softest_jet_pt

File Metadata

Mime Type
text/x-diff
Expires
Sun, Feb 23, 2:28 PM (22 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4486614
Default Alt Text
(475 KB)

Event Timeline