Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7878650
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
153 KB
Subscribers
None
View Options
diff --git a/Shower/Base/Evolver.cc b/Shower/Base/Evolver.cc
deleted file mode 100644
--- a/Shower/Base/Evolver.cc
+++ /dev/null
@@ -1,3280 +0,0 @@
-// -*- C++ -*-
-//
-// Evolver.cc is a part of Herwig - A multi-purpose Monte Carlo event generator
-// Copyright (C) 2002-2011 The Herwig Collaboration
-//
-// Herwig is licenced under version 2 of the GPL, see COPYING for details.
-// Please respect the MCnet academic guidelines, see GUIDELINES for details.
-//
-//
-// This is the implementation of the non-inlined, non-templated member
-// functions of the Evolver class.
-//
-#include "Evolver.h"
-#include "ThePEG/Interface/ClassDocumentation.h"
-#include "ThePEG/Interface/Reference.h"
-#include "ThePEG/Interface/RefVector.h"
-#include "ThePEG/Interface/Switch.h"
-#include "ThePEG/Interface/Parameter.h"
-#include "ThePEG/Persistency/PersistentOStream.h"
-#include "ThePEG/Persistency/PersistentIStream.h"
-#include "Herwig/Shower/Base/ShowerParticle.h"
-#include "ThePEG/Utilities/EnumIO.h"
-#include "ShowerKinematics.h"
-#include "ThePEG/PDT/EnumParticles.h"
-#include "ThePEG/Repository/EventGenerator.h"
-#include "ThePEG/Handlers/EventHandler.h"
-#include "ThePEG/Handlers/StandardEventHandler.h"
-#include "ThePEG/Utilities/Throw.h"
-#include "ShowerTree.h"
-#include "ShowerProgenitor.h"
-#include "KinematicsReconstructor.h"
-#include "PartnerFinder.h"
-#include "ThePEG/Handlers/StandardXComb.h"
-#include "ThePEG/PDT/DecayMode.h"
-#include "Herwig/Shower/ShowerHandler.h"
-#include "ThePEG/Utilities/DescribeClass.h"
-#include "ShowerVertex.h"
-#include "ThePEG/Repository/CurrentGenerator.h"
-#include "Herwig/MatrixElement/Matchbox/Base/SubtractedME.h"
-#include "Herwig/MatrixElement/Matchbox/MatchboxFactory.h"
-#include "ThePEG/Handlers/StandardXComb.h"
-
-using namespace Herwig;
-
-namespace {
-
- /**
- * A struct to order the particles in the same way as in the DecayMode's
- */
- struct ParticleOrdering {
- /**
- * Operator for the ordering
- * @param p1 The first ParticleData object
- * @param p2 The second ParticleData object
- */
- bool operator() (tcPDPtr p1, tcPDPtr p2) {
- return abs(p1->id()) > abs(p2->id()) ||
- ( abs(p1->id()) == abs(p2->id()) && p1->id() > p2->id() ) ||
- ( p1->id() == p2->id() && p1->fullName() > p2->fullName() );
- }
- };
- typedef multiset<tcPDPtr,ParticleOrdering> OrderedParticles;
-
- /**
- * Cached lookup of decay modes.
- * Generator::findDecayMode() is not efficient.
- */
- tDMPtr findDecayMode(const string & tag) {
- static map<string,DMPtr> cache;
- map<string,DMPtr>::const_iterator pos = cache.find(tag);
-
- if ( pos != cache.end() )
- return pos->second;
-
- tDMPtr dm = CurrentGenerator::current().findDecayMode(tag);
- cache[tag] = dm;
- return dm;
- }
-}
-
-DescribeClass<Evolver,Interfaced>
-describeEvolver ("Herwig::Evolver","HwShower.so");
-
-bool Evolver::_hardEmissionModeWarn = true;
-bool Evolver::_missingTruncWarn = true;
-
-IBPtr Evolver::clone() const {
- return new_ptr(*this);
-}
-
-IBPtr Evolver::fullclone() const {
- return new_ptr(*this);
-}
-
-void Evolver::persistentOutput(PersistentOStream & os) const {
- os << _model << _splittingGenerator << _maxtry
- << _meCorrMode << _hardVetoMode << _hardVetoRead << _hardVetoReadOption
- << _limitEmissions << _spinOpt << _softOpt << _hardPOWHEG
- << ounit(_iptrms,GeV) << _beta << ounit(_gamma,GeV) << ounit(_iptmax,GeV)
- << _vetoes << _fullShowerVetoes << _nReWeight << _reWeight
- << _trunc_Mode << _hardEmissionMode << _reconOpt
- << isMCatNLOSEvent << isMCatNLOHEvent
- << isPowhegSEvent << isPowhegHEvent
- << theFactorizationScaleFactor << theRenormalizationScaleFactor << ounit(muPt,GeV)
- << oenum(interaction_) << _maxTryFSR << _maxFailFSR << _fracFSR;
-}
-
-void Evolver::persistentInput(PersistentIStream & is, int) {
- is >> _model >> _splittingGenerator >> _maxtry
- >> _meCorrMode >> _hardVetoMode >> _hardVetoRead >> _hardVetoReadOption
- >> _limitEmissions >> _spinOpt >> _softOpt >> _hardPOWHEG
- >> iunit(_iptrms,GeV) >> _beta >> iunit(_gamma,GeV) >> iunit(_iptmax,GeV)
- >> _vetoes >> _fullShowerVetoes >> _nReWeight >> _reWeight
- >> _trunc_Mode >> _hardEmissionMode >> _reconOpt
- >> isMCatNLOSEvent >> isMCatNLOHEvent
- >> isPowhegSEvent >> isPowhegHEvent
- >> theFactorizationScaleFactor >> theRenormalizationScaleFactor >> iunit(muPt,GeV)
- >> ienum(interaction_) >> _maxTryFSR >> _maxFailFSR >> _fracFSR;
-}
-
-void Evolver::doinit() {
- Interfaced::doinit();
- // calculate max no of FSR vetos
- _maxFailFSR = max(int(_maxFailFSR), int(_fracFSR*double(generator()->N())));
- // check on the reweighting
- for(unsigned int ix=0;ix<_fullShowerVetoes.size();++ix) {
- if(_fullShowerVetoes[ix]->behaviour()==1) {
- _reWeight = true;
- break;
- }
- }
- if(_reWeight && maximumTries()<_nReWeight) {
- throw Exception() << "Reweight being performed in the shower but the number of attempts for the"
- << "shower is less than that for the reweighting.\n"
- << "Maximum number of attempt for the shower "
- << fullName() << ":MaxTry is " << maximumTries() << "\nand for reweighting is "
- << fullName() << ":NReWeight is " << _nReWeight << "\n"
- << "we recommend the number of attempts is 10 times the number for reweighting\n"
- << Exception::runerror;
- }
-}
-
-void Evolver::Init() {
-
- static ClassDocumentation<Evolver> documentation
- ("This class is responsible for carrying out the showering,",
- "including the kinematics reconstruction, in a given scale range,"
- "including the option of the POWHEG approach to simulated next-to-leading order"
- " radiation\\cite{Nason:2004rx}.",
- "%\\cite{Nason:2004rx}\n"
- "\\bibitem{Nason:2004rx}\n"
- " P.~Nason,\n"
- " ``A new method for combining NLO QCD with shower Monte Carlo algorithms,''\n"
- " JHEP {\\bf 0411} (2004) 040\n"
- " [arXiv:hep-ph/0409146].\n"
- " %%CITATION = JHEPA,0411,040;%%\n");
-
- static Reference<Evolver,SplittingGenerator>
- interfaceSplitGen("SplittingGenerator",
- "A reference to the SplittingGenerator object",
- &Herwig::Evolver::_splittingGenerator,
- false, false, true, false);
-
- static Reference<Evolver,ShowerModel> interfaceShowerModel
- ("ShowerModel",
- "The pointer to the object which defines the shower evolution model.",
- &Evolver::_model, false, false, true, false, false);
-
- static Parameter<Evolver,unsigned int> interfaceMaxTry
- ("MaxTry",
- "The maximum number of attempts to generate the shower from a"
- " particular ShowerTree",
- &Evolver::_maxtry, 100, 1, 100000,
- false, false, Interface::limited);
-
- static Parameter<Evolver,unsigned int> interfaceNReWeight
- ("NReWeight",
- "The number of attempts for the shower when reweighting",
- &Evolver::_nReWeight, 100, 10, 10000,
- false, false, Interface::limited);
-
- static Switch<Evolver, unsigned int> ifaceMECorrMode
- ("MECorrMode",
- "Choice of the ME Correction Mode",
- &Evolver::_meCorrMode, 1, false, false);
- static SwitchOption off
- (ifaceMECorrMode,"No","MECorrections off", 0);
- static SwitchOption on
- (ifaceMECorrMode,"Yes","hard+soft on", 1);
- static SwitchOption hard
- (ifaceMECorrMode,"Hard","only hard on", 2);
- static SwitchOption soft
- (ifaceMECorrMode,"Soft","only soft on", 3);
-
- static Switch<Evolver, unsigned int> ifaceHardVetoMode
- ("HardVetoMode",
- "Choice of the Hard Veto Mode",
- &Evolver::_hardVetoMode, 1, false, false);
- static SwitchOption HVoff
- (ifaceHardVetoMode,"No","hard vetos off", 0);
- static SwitchOption HVon
- (ifaceHardVetoMode,"Yes","hard vetos on", 1);
- static SwitchOption HVIS
- (ifaceHardVetoMode,"Initial", "only IS emissions vetoed", 2);
- static SwitchOption HVFS
- (ifaceHardVetoMode,"Final","only FS emissions vetoed", 3);
-
- static Switch<Evolver, unsigned int> ifaceHardVetoRead
- ("HardVetoScaleSource",
- "If hard veto scale is to be read",
- &Evolver::_hardVetoRead, 0, false, false);
- static SwitchOption HVRcalc
- (ifaceHardVetoRead,"Calculate","Calculate from hard process", 0);
- static SwitchOption HVRread
- (ifaceHardVetoRead,"Read","Read from XComb->lastScale", 1);
-
- static Switch<Evolver, bool> ifaceHardVetoReadOption
- ("HardVetoReadOption",
- "Apply read-in scale veto to all collisions or just the primary one?",
- &Evolver::_hardVetoReadOption, false, false, false);
- static SwitchOption AllCollisions
- (ifaceHardVetoReadOption,
- "AllCollisions",
- "Read-in pT veto applied to primary and secondary collisions.",
- false);
- static SwitchOption PrimaryCollision
- (ifaceHardVetoReadOption,
- "PrimaryCollision",
- "Read-in pT veto applied to primary but not secondary collisions.",
- true);
-
- static Parameter<Evolver, Energy> ifaceiptrms
- ("IntrinsicPtGaussian",
- "RMS of intrinsic pT of Gaussian distribution:\n"
- "2*(1-Beta)*exp(-sqr(intrinsicpT/RMS))/sqr(RMS)",
- &Evolver::_iptrms, GeV, ZERO, ZERO, 1000000.0*GeV,
- false, false, Interface::limited);
-
- static Parameter<Evolver, double> ifacebeta
- ("IntrinsicPtBeta",
- "Proportion of inverse quadratic distribution in generating intrinsic pT.\n"
- "(1-Beta) is the proportion of Gaussian distribution",
- &Evolver::_beta, 0, 0, 1,
- false, false, Interface::limited);
-
- static Parameter<Evolver, Energy> ifacegamma
- ("IntrinsicPtGamma",
- "Parameter for inverse quadratic:\n"
- "2*Beta*Gamma/(sqr(Gamma)+sqr(intrinsicpT))",
- &Evolver::_gamma,GeV, ZERO, ZERO, 100000.0*GeV,
- false, false, Interface::limited);
-
- static Parameter<Evolver, Energy> ifaceiptmax
- ("IntrinsicPtIptmax",
- "Upper bound on intrinsic pT for inverse quadratic",
- &Evolver::_iptmax,GeV, ZERO, ZERO, 100000.0*GeV,
- false, false, Interface::limited);
-
- static RefVector<Evolver,ShowerVeto> ifaceVetoes
- ("Vetoes",
- "The vetoes to be checked during showering",
- &Evolver::_vetoes, -1,
- false,false,true,true,false);
-
- static RefVector<Evolver,FullShowerVeto> interfaceFullShowerVetoes
- ("FullShowerVetoes",
- "The vetos to be appliede on the full final state of the shower",
- &Evolver::_fullShowerVetoes, -1, false, false, true, false, false);
-
- static Switch<Evolver,unsigned int> interfaceLimitEmissions
- ("LimitEmissions",
- "Limit the number and type of emissions for testing",
- &Evolver::_limitEmissions, 0, false, false);
- static SwitchOption interfaceLimitEmissionsNoLimit
- (interfaceLimitEmissions,
- "NoLimit",
- "Allow an arbitrary number of emissions",
- 0);
- static SwitchOption interfaceLimitEmissionsOneInitialStateEmission
- (interfaceLimitEmissions,
- "OneInitialStateEmission",
- "Allow one emission in the initial state and none in the final state",
- 1);
- static SwitchOption interfaceLimitEmissionsOneFinalStateEmission
- (interfaceLimitEmissions,
- "OneFinalStateEmission",
- "Allow one emission in the final state and none in the initial state",
- 2);
- static SwitchOption interfaceLimitEmissionsHardOnly
- (interfaceLimitEmissions,
- "HardOnly",
- "Only allow radiation from the hard ME correction",
- 3);
- static SwitchOption interfaceLimitEmissionsOneEmission
- (interfaceLimitEmissions,
- "OneEmission",
- "Allow one emission in either the final state or initial state, but not both",
- 4);
-
- static Switch<Evolver,bool> interfaceTruncMode
- ("TruncatedShower", "Include the truncated shower?",
- &Evolver::_trunc_Mode, 1, false, false);
- static SwitchOption interfaceTruncMode0
- (interfaceTruncMode,"No","Truncated Shower is OFF", 0);
- static SwitchOption interfaceTruncMode1
- (interfaceTruncMode,"Yes","Truncated Shower is ON", 1);
-
- static Switch<Evolver,int> interfaceHardEmissionMode
- ("HardEmissionMode",
- "Whether to use ME corrections or POWHEG for the hardest emission",
- &Evolver::_hardEmissionMode, 0, false, false);
- static SwitchOption interfaceHardEmissionModeDecayMECorrection
- (interfaceHardEmissionMode,
- "DecayMECorrection",
- "Old fashioned ME correction for decays only",
- -1);
- static SwitchOption interfaceHardEmissionModeMECorrection
- (interfaceHardEmissionMode,
- "MECorrection",
- "Old fashioned ME correction",
- 0);
- static SwitchOption interfaceHardEmissionModePOWHEG
- (interfaceHardEmissionMode,
- "POWHEG",
- "Powheg style hard emission using internal matrix elements",
- 1);
- static SwitchOption interfaceHardEmissionModeMatchboxPOWHEG
- (interfaceHardEmissionMode,
- "MatchboxPOWHEG",
- "Powheg style emission for the hard process using Matchbox",
- 2);
- static SwitchOption interfaceHardEmissionModeFullPOWHEG
- (interfaceHardEmissionMode,
- "FullPOWHEG",
- "Powheg style emission for the hard process using Matchbox "
- "and decays using internal matrix elements",
- 3);
-
- static Switch<Evolver,ShowerInteraction::Type > interfaceInteraction
- ("Interaction",
- "The interactions to be used in the shower",
- &Evolver::interaction_, ShowerInteraction::QEDQCD, false, false);
- static SwitchOption interfaceInteractionQCD
- (interfaceInteraction,
- "QCDOnly",
- "Only QCD",
- ShowerInteraction::QCD);
- static SwitchOption interfaceInteractionQEDOnly
- (interfaceInteraction,
- "QEDOnly",
- "Only QED",
- ShowerInteraction::QED);
- static SwitchOption interfaceInteractionEWOnly
- (interfaceInteraction,
- "EWOnly",
- "Only EW",
- ShowerInteraction::EW);
- static SwitchOption interfaceInteractionQEDQCD
- (interfaceInteraction,
- "QEDQCD",
- "QED and QCD",
- ShowerInteraction::QEDQCD);
- static SwitchOption interfaceInteractionALL
- (interfaceInteraction,
- "ALL",
- "QED, QCD and EW",
- ShowerInteraction::ALL);
-
- static Switch<Evolver,unsigned int> interfaceReconstructionOption
- ("ReconstructionOption",
- "Treatment of the reconstruction of the transverse momentum of "
- "a branching from the evolution scale.",
- &Evolver::_reconOpt, 0, false, false);
- static SwitchOption interfaceReconstructionOptionCutOff
- (interfaceReconstructionOption,
- "CutOff",
- "Use the cut-off masses in the calculation",
- 0);
- static SwitchOption interfaceReconstructionOptionOffShell
- (interfaceReconstructionOption,
- "OffShell",
- "Use the off-shell masses in the calculation veto the emission of the parent,"
- " no veto in generation of emissions from children",
- 1);
- static SwitchOption interfaceReconstructionOptionOffShell2
- (interfaceReconstructionOption,
- "OffShell2",
- "Use the off-shell masses in the calculation veto the emissions from the children."
- " no veto in generation of emissions from children",
- 2);
- static SwitchOption interfaceReconstructionOptionOffShell3
- (interfaceReconstructionOption,
- "OffShell3",
- "Use the off-shell masses in the calculation veto the emissions from the children."
- " veto in generation of emissions from children using cut-off for second parton",
- 3);
- static SwitchOption interfaceReconstructionOptionOffShell4
- (interfaceReconstructionOption,
- "OffShell4",
- "Ass OffShell3 but with a restriction on the mass of final-state"
- " jets produced via backward evolution.",
- 4);
-
- static Switch<Evolver,unsigned int> interfaceSpinCorrelations
- ("SpinCorrelations",
- "Treatment of spin correlations in the parton shower",
- &Evolver::_spinOpt, 1, false, false);
- static SwitchOption interfaceSpinCorrelationsOff
- (interfaceSpinCorrelations,
- "No",
- "No spin correlations",
- 0);
- static SwitchOption interfaceSpinCorrelationsSpin
- (interfaceSpinCorrelations,
- "Yes",
- "Include the azimuthal spin correlations only",
- 1);
-
- static Switch<Evolver,unsigned int> interfaceSoftCorrelations
- ("SoftCorrelations",
- "Option for the treatment of soft correlations in the parton shower",
- &Evolver::_softOpt, 2, false, false);
- static SwitchOption interfaceSoftCorrelationsNone
- (interfaceSoftCorrelations,
- "No",
- "No soft correlations",
- 0);
- static SwitchOption interfaceSoftCorrelationsFull
- (interfaceSoftCorrelations,
- "Full",
- "Use the full eikonal",
- 1);
- static SwitchOption interfaceSoftCorrelationsSingular
- (interfaceSoftCorrelations,
- "Singular",
- "Use original Webber-Marchisini form",
- 2);
-
- static Switch<Evolver,bool> interfaceHardPOWHEG
- ("HardPOWHEG",
- "Treatment of powheg emissions which are too hard to have a shower interpretation",
- &Evolver::_hardPOWHEG, false, false, false);
- static SwitchOption interfaceHardPOWHEGAsShower
- (interfaceHardPOWHEG,
- "AsShower",
- "Still interpret as shower emissions",
- false);
- static SwitchOption interfaceHardPOWHEGRealEmission
- (interfaceHardPOWHEG,
- "RealEmission",
- "Generate shower from the real emmission configuration",
- true);
-
- static Parameter<Evolver,unsigned int> interfaceMaxTryFSR
- ("MaxTryFSR",
- "The maximum number of attempted FSR emissions in"
- " the generation of the FSR",
- &Evolver::_maxTryFSR, 100000, 10, 100000000,
- false, false, Interface::limited);
-
- static Parameter<Evolver,unsigned int> interfaceMaxFailFSR
- ("MaxFailFSR",
- "Maximum number of failures generating the FSR",
- &Evolver::_maxFailFSR, 100, 1, 100000000,
- false, false, Interface::limited);
-
-
- static Parameter<Evolver,double> interfaceFSRFailureFraction
- ("FSRFailureFraction",
- "Maximum fraction of events allowed to fail due to too many FSR emissions",
- &Evolver::_fracFSR, 0.001, 1e-10, 1,
- false, false, Interface::limited);
-}
-
-void Evolver::generateIntrinsicpT(vector<ShowerProgenitorPtr> particlesToShower) {
- _intrinsic.clear();
- if ( !ipTon() || !isISRadiationON() ) return;
- // don't do anything for the moment for secondary scatters
- if( !ShowerHandler::currentHandler()->firstInteraction() ) return;
- // generate intrinsic pT
- for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
- // only consider initial-state particles
- if(particlesToShower[ix]->progenitor()->isFinalState()) continue;
- if(!particlesToShower[ix]->progenitor()->dataPtr()->coloured()) continue;
- Energy ipt;
- if(UseRandom::rnd() > _beta) {
- ipt=_iptrms*sqrt(-log(UseRandom::rnd()));
- }
- else {
- ipt=_gamma*sqrt(pow(1.+sqr(_iptmax/_gamma), UseRandom::rnd())-1.);
- }
- pair<Energy,double> pt = make_pair(ipt,UseRandom::rnd(Constants::twopi));
- _intrinsic[particlesToShower[ix]] = pt;
- }
-}
-
-void Evolver::setupMaximumScales(const vector<ShowerProgenitorPtr> & p,
- XCPtr xcomb) {
- // let POWHEG events radiate freely
- if(_hardEmissionMode>0&&hardTree()) {
- vector<ShowerProgenitorPtr>::const_iterator ckt = p.begin();
- for (; ckt != p.end(); ckt++) (*ckt)->maxHardPt(Constants::MaxEnergy);
- return;
- }
- // return if no vetos
- if (!hardVetoOn()) return;
- // find out if hard partonic subprocess.
- bool isPartonic(false);
- map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator
- cit = _currenttree->incomingLines().begin();
- Lorentz5Momentum pcm;
- for(; cit!=currentTree()->incomingLines().end(); ++cit) {
- pcm += cit->first->progenitor()->momentum();
- isPartonic |= cit->first->progenitor()->coloured();
- }
- // find minimum pt from hard process, the maximum pt from all outgoing
- // coloured lines (this is simpler and more general than
- // 2stu/(s^2+t^2+u^2)). Maximum scale for scattering processes will
- // be transverse mass.
- Energy ptmax = generator()->maximumCMEnergy();
- // general case calculate the scale
- if (!hardVetoXComb()||
- (hardVetoReadOption()&&
- !ShowerHandler::currentHandler()->firstInteraction())) {
- // scattering process
- if(currentTree()->isHard()) {
- assert(xcomb);
- // coloured incoming particles
- if (isPartonic) {
- map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator
- cjt = currentTree()->outgoingLines().begin();
- for(; cjt!=currentTree()->outgoingLines().end(); ++cjt) {
- if (cjt->first->progenitor()->coloured())
- ptmax = min(ptmax,cjt->first->progenitor()->momentum().mt());
- }
- }
- if (ptmax == generator()->maximumCMEnergy() ) ptmax = pcm.m();
- if(hardVetoXComb()&&hardVetoReadOption()&&
- !ShowerHandler::currentHandler()->firstInteraction()) {
- ptmax=min(ptmax,sqrt(xcomb->lastShowerScale()));
- }
- }
- // decay, incoming() is the decaying particle.
- else {
- ptmax = currentTree()->incomingLines().begin()->first
- ->progenitor()->momentum().mass();
- }
- }
- // hepeup.SCALUP is written into the lastXComb by the
- // LesHouchesReader itself - use this by user's choice.
- // Can be more general than this.
- else {
- if(currentTree()->isHard()) {
- assert(xcomb);
- ptmax = sqrt( xcomb->lastShowerScale() );
- }
- else {
- ptmax = currentTree()->incomingLines().begin()->first
- ->progenitor()->momentum().mass();
- }
- }
- ptmax *= ShowerHandler::currentHandler()->hardScaleFactor();
- // set maxHardPt for all progenitors. For partonic processes this
- // is now the max pt in the FS, for non-partonic processes or
- // processes with no coloured FS the invariant mass of the IS
- vector<ShowerProgenitorPtr>::const_iterator ckt = p.begin();
- for (; ckt != p.end(); ckt++) (*ckt)->maxHardPt(ptmax);
-}
-
-void Evolver::setupHardScales(const vector<ShowerProgenitorPtr> & p,
- XCPtr xcomb) {
- if ( hardVetoXComb() &&
- (!hardVetoReadOption() ||
- ShowerHandler::currentHandler()->firstInteraction()) ) {
- Energy hardScale = ZERO;
- if(currentTree()->isHard()) {
- assert(xcomb);
- hardScale = sqrt( xcomb->lastShowerScale() );
- }
- else {
- hardScale = currentTree()->incomingLines().begin()->first
- ->progenitor()->momentum().mass();
- }
- hardScale *= ShowerHandler::currentHandler()->hardScaleFactor();
- vector<ShowerProgenitorPtr>::const_iterator ckt = p.begin();
- for (; ckt != p.end(); ckt++) (*ckt)->hardScale(hardScale);
- muPt = hardScale;
- }
-}
-
-void Evolver::showerHardProcess(ShowerTreePtr hard, XCPtr xcomb) {
-
-
- isMCatNLOSEvent = false;
- isMCatNLOHEvent = false;
- isPowhegSEvent = false;
- isPowhegHEvent = false;
-
- Ptr<SubtractedME>::tptr subme;
- Ptr<MatchboxMEBase>::tptr me;
- Ptr<SubtractionDipole>::tptr dipme;
-
- Ptr<StandardXComb>::ptr sxc = dynamic_ptr_cast<Ptr<StandardXComb>::ptr>(xcomb);
-
- if ( sxc ) {
- subme = dynamic_ptr_cast<Ptr<SubtractedME>::tptr>(sxc->matrixElement());
- me = dynamic_ptr_cast<Ptr<MatchboxMEBase>::tptr>(sxc->matrixElement());
- dipme = dynamic_ptr_cast<Ptr<SubtractionDipole>::tptr>(sxc->matrixElement());
- }
-
- if ( subme ) {
- if ( subme->showerApproximation() ) {
- theShowerApproximation = subme->showerApproximation();
- // separate MCatNLO and POWHEG-type corrections
- if ( !subme->showerApproximation()->needsSplittingGenerator() ) {
- if ( subme->realShowerSubtraction() )
- isMCatNLOHEvent = true;
- else if ( subme->virtualShowerSubtraction() )
- isMCatNLOSEvent = true;
- }
- else {
- if ( subme->realShowerSubtraction() )
- isPowhegHEvent = true;
- else if ( subme->virtualShowerSubtraction() || subme->loopSimSubtraction() )
- isPowhegSEvent = true;
- }
- }
- } else if ( me ) {
- if ( me->factory()->showerApproximation() ) {
- theShowerApproximation = me->factory()->showerApproximation();
- if ( !me->factory()->showerApproximation()->needsSplittingGenerator() )
- isMCatNLOSEvent = true;
- else
- isPowhegSEvent = true;
- }
- }
-
- string error = "Inconsistent hard emission set-up in Evolver::showerHardProcess(). ";
- if ( ( isMCatNLOSEvent || isMCatNLOHEvent ) ){
- if (_hardEmissionMode > 1)
- throw Exception() << error
- << "Cannot generate POWHEG matching with MC@NLO shower "
- << "approximation. Add 'set Evolver:HardEmissionMode 0' to input file."
- << Exception::runerror;
- if ( ShowerHandler::currentHandler()->canHandleMatchboxTrunc())
- throw Exception() << error
- << "Cannot use truncated qtilde shower with MC@NLO shower "
- << "approximation. Set LHCGenerator:EventHandler"
- << ":CascadeHandler to '/Herwig/Shower/ShowerHandler' or "
- << "'/Herwig/DipoleShower/DipoleShowerHandler'."
- << Exception::runerror;
- }
- else if ( ((isPowhegSEvent || isPowhegHEvent) || dipme) &&
- _hardEmissionMode < 2){
- if ( ShowerHandler::currentHandler()->canHandleMatchboxTrunc())
- throw Exception() << error
- << "Unmatched events requested for POWHEG shower "
- << "approximation. Set Evolver:HardEmissionMode to "
- << "'MatchboxPOWHEG' or 'FullPOWHEG'."
- << Exception::runerror;
- else if (_hardEmissionModeWarn){
- _hardEmissionModeWarn = false;
- _hardEmissionMode+=2;
- throw Exception() << error
- << "Unmatched events requested for POWHEG shower "
- << "approximation. Changing Evolver:HardEmissionMode from "
- << _hardEmissionMode-2 << " to " << _hardEmissionMode
- << Exception::warning;
- }
- }
-
- if ( isPowhegSEvent || isPowhegHEvent) {
- if (theShowerApproximation->needsTruncatedShower() &&
- !ShowerHandler::currentHandler()->canHandleMatchboxTrunc() )
- throw Exception() << error
- << "Current shower handler cannot generate truncated shower. "
- << "Set Generator:EventHandler:CascadeHandler to "
- << "'/Herwig/Shower/PowhegShowerHandler'."
- << Exception::runerror;
- }
- else if ( dipme && _missingTruncWarn){
- _missingTruncWarn=false;
- throw Exception() << "Warning: POWHEG shower approximation used without "
- << "truncated shower. Set Generator:EventHandler:"
- << "CascadeHandler to '/Herwig/Shower/PowhegShowerHandler' and "
- << "'MEMatching:TruncatedShower Yes'."
- << Exception::warning;
- }
- else if ( !dipme && _hardEmissionMode > 1 &&
- ShowerHandler::currentHandler()->firstInteraction())
- throw Exception() << error
- << "POWHEG matching requested for LO events. Include "
- << "'set Factory:ShowerApproximation MEMatching' in input file."
- << Exception::runerror;
-
- _hardme = HwMEBasePtr();
- // extract the matrix element
- tStdXCombPtr lastXC = dynamic_ptr_cast<tStdXCombPtr>(xcomb);
- if(lastXC) {
- _hardme = dynamic_ptr_cast<HwMEBasePtr>(lastXC->matrixElement());
- }
- _decayme = HwDecayerBasePtr();
- // set the current tree
- currentTree(hard);
- hardTree(HardTreePtr());
- // number of attempts if more than one interaction switched on
- unsigned int interactionTry=0;
- do {
- try {
- // generate the showering
- doShowering(true,xcomb);
- // if no vetos return
- return;
- }
- catch (InteractionVeto) {
- currentTree()->clear();
- ++interactionTry;
- }
- }
- while(interactionTry<=5);
- throw Exception() << "Too many tries for shower in "
- << "Evolver::showerHardProcess()"
- << Exception::eventerror;
-}
-
-void Evolver::hardMatrixElementCorrection(bool hard) {
- // set the initial enhancement factors for the soft correction
- _initialenhance = 1.;
- _finalenhance = 1.;
- // if hard matrix element switched off return
- if(!MECOn(hard)) return;
- // see if we can get the correction from the matrix element
- // or decayer
- if(hard) {
- if(_hardme&&_hardme->hasMECorrection()) {
- _hardme->initializeMECorrection(_currenttree,
- _initialenhance,_finalenhance);
- if(hardMEC(hard))
- _hardme->applyHardMatrixElementCorrection(_currenttree);
- }
- }
- else {
- if(_decayme&&_decayme->hasMECorrection()) {
- _decayme->initializeMECorrection(_currenttree,
- _initialenhance,_finalenhance);
- if(hardMEC(hard))
- _decayme->applyHardMatrixElementCorrection(_currenttree);
- }
- }
-}
-
-ShowerParticleVector Evolver::createTimeLikeChildren(tShowerParticlePtr, IdList ids) {
- // Create the ShowerParticle objects for the two children of
- // the emitting particle; set the parent/child relationship
- // if same as definition create particles, otherwise create cc
- ShowerParticleVector children;
- for(unsigned int ix=0;ix<2;++ix) {
- children.push_back(new_ptr(ShowerParticle(ids[ix+1],true)));
- if(children[ix]->id()==_progenitor->id()&&!ids[ix+1]->stable())
- children[ix]->set5Momentum(Lorentz5Momentum(_progenitor->progenitor()->mass()));
- else
- children[ix]->set5Momentum(Lorentz5Momentum(ids[ix+1]->mass()));
- }
- return children;
-}
-
-bool Evolver::timeLikeShower(tShowerParticlePtr particle,
- ShowerInteraction::Type type,
- Branching fb, bool first) {
- // don't do anything if not needed
- if(_limitEmissions == 1 || hardOnly() ||
- ( _limitEmissions == 2 && _nfs != 0) ||
- ( _limitEmissions == 4 && _nfs + _nis != 0) ) {
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return false;
- }
- // too many tries
- if(_nFSR>=_maxTryFSR) {
- ++_nFailedFSR;
- // too many failed events
- if(_nFailedFSR>=_maxFailFSR)
- throw Exception() << "Too many events have failed due to too many shower emissions, in\n"
- << "Evolver::timeLikeShower(). Terminating run\n"
- << Exception::runerror;
- throw Exception() << "Too many attempted emissions in Evolver::timeLikeShower()\n"
- << Exception::eventerror;
- }
- // generate the emission
- ShowerParticleVector children;
- int ntry=0;
- // generate the emission
- if(!fb.kinematics)
- fb = selectTimeLikeBranching(particle,type,HardBranchingPtr());
- // no emission, return
- if(!fb.kinematics) {
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return false;
- }
- Branching fc[2];
- bool setupChildren = true;
- while (ntry<50) {
- fc[0] = Branching();
- fc[1] = Branching();
- ++ntry;
- assert(fb.kinematics);
- // has emitted
- // Assign the shower kinematics to the emitting particle.
- if(setupChildren) {
- ++_nFSR;
- particle->showerKinematics(fb.kinematics);
- // check highest pT
- if(fb.kinematics->pT()>progenitor()->highestpT())
- progenitor()->highestpT(fb.kinematics->pT());
- // create the children
- children = createTimeLikeChildren(particle,fb.ids);
- // update the children
- particle->showerKinematics()->
- updateChildren(particle, children,fb.type,_reconOpt>=3);
- // update number of emissions
- ++_nfs;
- if(_limitEmissions!=0) {
- if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
- if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return true;
- }
- setupChildren = false;
- }
- // select branchings for children
- fc[0] = selectTimeLikeBranching(children[0],type,HardBranchingPtr());
- fc[1] = selectTimeLikeBranching(children[1],type,HardBranchingPtr());
- // old default
- if(_reconOpt==0) {
- // shower the first particle
- if(fc[0].kinematics) timeLikeShower(children[0],type,fc[0],false);
- if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
- // shower the second particle
- if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],false);
- if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
- break;
- }
- // Herwig default
- else if(_reconOpt==1) {
- // shower the first particle
- if(fc[0].kinematics) timeLikeShower(children[0],type,fc[0],false);
- if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
- // shower the second particle
- if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],false);
- if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
- // branching has happened
- particle->showerKinematics()->updateParent(particle, children,fb.type);
- // clean up the vetoed emission
- if(particle->virtualMass()==ZERO) {
- particle->showerKinematics(ShoKinPtr());
- for(unsigned int ix=0;ix<children.size();++ix)
- particle->abandonChild(children[ix]);
- children.clear();
- if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- // generate the new emission
- fb = selectTimeLikeBranching(particle,type,HardBranchingPtr());
- // no emission, return
- if(!fb.kinematics) {
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return false;
- }
- setupChildren = true;
- continue;
- }
- else
- break;
- }
- // veto children
- else if(_reconOpt>=2) {
- // cut-off masses for the branching
- const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
- // compute the masses of the children
- Energy masses[3];
- for(unsigned int ix=0;ix<2;++ix) {
- if(fc[ix].kinematics) {
- const vector<Energy> & vm = fc[ix].sudakov->virtualMasses(fc[ix].ids);
- Energy2 q2 =
- fc[ix].kinematics->z()*(1.-fc[ix].kinematics->z())*sqr(fc[ix].kinematics->scale());
- if(fc[ix].ids[0]->id()!=ParticleID::g) q2 += sqr(vm[0]);
- masses[ix+1] = sqrt(q2);
- }
- else {
- masses[ix+1] = virtualMasses[ix+1];
- }
- }
- masses[0] = fb.ids[0]->id()!=ParticleID::g ? virtualMasses[0] : ZERO;
- double z = fb.kinematics->z();
- Energy2 pt2 = z*(1.-z)*(z*(1.-z)*sqr(fb.kinematics->scale()) + sqr(masses[0]))
- - sqr(masses[1])*(1.-z) - sqr(masses[2])*z;
- if(pt2>=ZERO) {
- break;
- }
- else {
- // reset the scales for the children
- for(unsigned int ix=0;ix<2;++ix) {
- if(fc[ix].kinematics)
- children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
- else
- children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
- children[ix]->virtualMass(ZERO);
- }
- }
- }
- };
- if(_reconOpt>=2) {
- // shower the first particle
- if(fc[0].kinematics) timeLikeShower(children[0],type,fc[0],false);
- if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
- // shower the second particle
- if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],false);
- if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
- // branching has happened
- particle->showerKinematics()->updateParent(particle, children,fb.type);
- }
- if(first&&!children.empty())
- particle->showerKinematics()->resetChildren(particle,children);
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return true;
-}
-
-bool
-Evolver::spaceLikeShower(tShowerParticlePtr particle, PPtr beam,
- ShowerInteraction::Type type) {
- //using the pdf's associated with the ShowerHandler assures, that
- //modified pdf's are used for the secondary interactions via
- //CascadeHandler::resetPDFs(...)
- tcPDFPtr pdf;
- if(ShowerHandler::currentHandler()->firstPDF().particle() == _beam)
- pdf = ShowerHandler::currentHandler()->firstPDF().pdf();
- if(ShowerHandler::currentHandler()->secondPDF().particle() == _beam)
- pdf = ShowerHandler::currentHandler()->secondPDF().pdf();
- Energy freeze = ShowerHandler::currentHandler()->pdfFreezingScale();
- // don't do anything if not needed
- if(_limitEmissions == 2 || hardOnly() ||
- ( _limitEmissions == 1 && _nis != 0 ) ||
- ( _limitEmissions == 4 && _nis + _nfs != 0 ) ) {
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return false;
- }
- Branching bb;
- // generate branching
- while (true) {
- bb=_splittingGenerator->chooseBackwardBranching(*particle,beam,
- _initialenhance,
- _beam,type,
- pdf,freeze);
- // return if no emission
- if(!bb.kinematics) {
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return false;
- }
- // if not vetoed break
- if(!spaceLikeVetoed(bb,particle)) break;
- // otherwise reset scale and continue
- particle->vetoEmission(bb.type,bb.kinematics->scale());
- if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
- }
- // assign the splitting function and shower kinematics
- particle->showerKinematics(bb.kinematics);
- if(bb.kinematics->pT()>progenitor()->highestpT())
- progenitor()->highestpT(bb.kinematics->pT());
- // For the time being we are considering only 1->2 branching
- // particles as in Sudakov form factor
- tcPDPtr part[2]={bb.ids[0],bb.ids[2]};
- // Now create the actual particles, make the otherChild a final state
- // particle, while the newParent is not
- ShowerParticlePtr newParent = new_ptr(ShowerParticle(part[0],false));
- ShowerParticlePtr otherChild = new_ptr(ShowerParticle(part[1],true,true));
- ShowerParticleVector theChildren;
- theChildren.push_back(particle);
- theChildren.push_back(otherChild);
- //this updates the evolution scale
- particle->showerKinematics()->
- updateParent(newParent, theChildren,bb.type);
- // update the history if needed
- _currenttree->updateInitialStateShowerProduct(_progenitor,newParent);
- _currenttree->addInitialStateBranching(particle,newParent,otherChild);
- // for the reconstruction of kinematics, parent/child
- // relationships are according to the branching process:
- // now continue the shower
- ++_nis;
- bool emitted = _limitEmissions==0 ?
- spaceLikeShower(newParent,beam,type) : false;
- if(newParent->spinInfo()) newParent->spinInfo()->develop();
- // now reconstruct the momentum
- if(!emitted) {
- if(_intrinsic.find(_progenitor)==_intrinsic.end()) {
- bb.kinematics->updateLast(newParent,ZERO,ZERO);
- }
- else {
- pair<Energy,double> kt=_intrinsic[_progenitor];
- bb.kinematics->updateLast(newParent,
- kt.first*cos(kt.second),
- kt.first*sin(kt.second));
- }
- }
- particle->showerKinematics()->
- updateChildren(newParent, theChildren,bb.type,_reconOpt>=4);
- if(_limitEmissions!=0) {
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return true;
- }
- // perform the shower of the final-state particle
- timeLikeShower(otherChild,type,Branching(),true);
- updateHistory(otherChild);
- if(theChildren[1]->spinInfo()) theChildren[1]->spinInfo()->develop();
- // return the emitted
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return true;
-}
-
-void Evolver::showerDecay(ShowerTreePtr decay) {
- _decayme = HwDecayerBasePtr();
- _hardme = HwMEBasePtr();
- // find the decayer
- // try the normal way if possible
- tDMPtr dm = decay->incomingLines().begin()->first->original() ->decayMode();
- if(!dm) dm = decay->incomingLines().begin()->first->copy() ->decayMode();
- if(!dm) dm = decay->incomingLines().begin()->first->progenitor()->decayMode();
- // otherwise make a string and look it up
- if(!dm) {
- string tag = decay->incomingLines().begin()->first->original()->dataPtr()->name()
- + "->";
- OrderedParticles outgoing;
- for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator
- it=decay->outgoingLines().begin();it!=decay->outgoingLines().end();++it) {
- if(abs(decay->incomingLines().begin()->first->original()->id()) == ParticleID::t &&
- abs(it->first->original()->id())==ParticleID::Wplus &&
- decay->treelinks().size() == 1) {
- ShowerTreePtr Wtree = decay->treelinks().begin()->first;
- for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator
- it2=Wtree->outgoingLines().begin();it2!=Wtree->outgoingLines().end();++it2) {
- outgoing.insert(it2->first->original()->dataPtr());
- }
- }
- else {
- outgoing.insert(it->first->original()->dataPtr());
- }
- }
- for(OrderedParticles::const_iterator it=outgoing.begin(); it!=outgoing.end();++it) {
- if(it!=outgoing.begin()) tag += ",";
- tag +=(**it).name();
- }
- tag += ";";
- dm = findDecayMode(tag);
- }
- if(dm) _decayme = dynamic_ptr_cast<HwDecayerBasePtr>(dm->decayer());
- // set the ShowerTree to be showered
- currentTree(decay);
- decay->applyTransforms();
- hardTree(HardTreePtr());
- unsigned int interactionTry=0;
- do {
- try {
- // generate the showering
- doShowering(false,XCPtr());
- // if no vetos
- // force calculation of spin correlations
- SpinPtr spInfo = decay->incomingLines().begin()->first->progenitor()->spinInfo();
- if(spInfo) {
- if(!spInfo->developed()) spInfo->needsUpdate();
- spInfo->develop();
- }
- // and then return
- return;
- }
- catch (InteractionVeto) {
- currentTree()->clear();
- ++interactionTry;
- }
- }
- while(interactionTry<=5);
- throw Exception() << "Too many tries for QED shower in Evolver::showerDecay()"
- << Exception::eventerror;
-}
-
-bool Evolver::spaceLikeDecayShower(tShowerParticlePtr particle,
- const ShowerParticle::EvolutionScales & maxScales,
- Energy minmass,ShowerInteraction::Type type,
- Branching fb) {
- // too many tries
- if(_nFSR>=_maxTryFSR) {
- ++_nFailedFSR;
- // too many failed events
- if(_nFailedFSR>=_maxFailFSR)
- throw Exception() << "Too many events have failed due to too many shower emissions, in\n"
- << "Evolver::timeLikeShower(). Terminating run\n"
- << Exception::runerror;
- throw Exception() << "Too many attempted emissions in Evolver::timeLikeShower()\n"
- << Exception::eventerror;
- }
- // generate the emission
- ShowerParticleVector children;
- int ntry=0;
- // generate the emission
- if(!fb.kinematics)
- fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,
- HardBranchingPtr());
- // no emission, return
- if(!fb.kinematics) return false;
- Branching fc[2];
- bool setupChildren = true;
- while (ntry<50) {
- if(particle->virtualMass()==ZERO)
- particle->virtualMass(_progenitor->progenitor()->mass());
- fc[0] = Branching();
- fc[1] = Branching();
- ++ntry;
- assert(fb.kinematics);
- // has emitted
- // Assign the shower kinematics to the emitting particle.
- if(setupChildren) {
- ++_nFSR;
- // Assign the shower kinematics to the emitting particle.
- particle->showerKinematics(fb.kinematics);
- if(fb.kinematics->pT()>progenitor()->highestpT())
- progenitor()->highestpT(fb.kinematics->pT());
- // create the ShowerParticle objects for the two children
- children = createTimeLikeChildren(particle,fb.ids);
- // updateChildren the children
- particle->showerKinematics()->
- updateChildren(particle, children, fb.type,_reconOpt>=3);
- setupChildren = false;
- }
- // select branchings for children
- fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,
- type,HardBranchingPtr());
- fc[1] = selectTimeLikeBranching (children[1],type,HardBranchingPtr());
- // old default
- if(_reconOpt==0) {
- // shower the first particle
- _currenttree->updateInitialStateShowerProduct(_progenitor,children[0]);
- _currenttree->addInitialStateBranching(particle,children[0],children[1]);
- if(fc[0].kinematics) spaceLikeDecayShower(children[0],maxScales,minmass,type,Branching());
- // shower the second particle
- if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],true);
- updateHistory(children[1]);
- // branching has happened
- break;
- }
- // Herwig default
- else if(_reconOpt==1) {
- // shower the first particle
- _currenttree->updateInitialStateShowerProduct(_progenitor,children[0]);
- _currenttree->addInitialStateBranching(particle,children[0],children[1]);
- if(fc[0].kinematics) spaceLikeDecayShower(children[0],maxScales,minmass,type,Branching());
- // shower the second particle
- if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],true);
- updateHistory(children[1]);
- // branching has happened
- particle->showerKinematics()->updateParent(particle, children,fb.type);
- // clean up the vetoed emission
- if(particle->virtualMass()==ZERO) {
- particle->showerKinematics(ShoKinPtr());
- for(unsigned int ix=0;ix<children.size();++ix)
- particle->abandonChild(children[ix]);
- children.clear();
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- // generate the new emission
- fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,
- HardBranchingPtr());
- // no emission, return
- if(!fb.kinematics) {
- return false;
- }
- setupChildren = true;
- continue;
- }
- else
- break;
- }
- else if(_reconOpt>=2) {
- // cut-off masses for the branching
- const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
- // compute the masses of the children
- Energy masses[3];
- // space-like children
- masses[1] = children[0]->virtualMass();
- // time-like child
- if(fc[1].kinematics) {
- const vector<Energy> & vm = fc[1].sudakov->virtualMasses(fc[1].ids);
- Energy2 q2 =
- fc[1].kinematics->z()*(1.-fc[1].kinematics->z())*sqr(fc[1].kinematics->scale());
- if(fc[1].ids[0]->id()!=ParticleID::g) q2 += sqr(vm[0]);
- masses[2] = sqrt(q2);
- }
- else {
- masses[2] = virtualMasses[2];
- }
- masses[0]=particle->virtualMass();
- double z = fb.kinematics->z();
- Energy2 pt2 = (1.-z)*(z*sqr(masses[0])-sqr(masses[1])-z/(1.-z)*sqr(masses[2]));
- if(pt2>=ZERO) {
- break;
- }
- else {
- // reset the scales for the children
- for(unsigned int ix=0;ix<2;++ix) {
- if(fc[ix].kinematics)
- children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
- else {
- if(ix==0)
- children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,Constants::MaxEnergy);
- else
- children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
- }
- }
- children[0]->virtualMass(_progenitor->progenitor()->mass());
- children[1]->virtualMass(ZERO);
- }
- }
- };
- if(_reconOpt>=2) {
- // In the case of splittings which involves coloured particles,
- // set properly the colour flow of the branching.
- // update the history if needed
- _currenttree->updateInitialStateShowerProduct(_progenitor,children[0]);
- _currenttree->addInitialStateBranching(particle,children[0],children[1]);
- // shower the first particle
- if(fc[0].kinematics) spaceLikeDecayShower(children[0],maxScales,minmass,type,Branching());
- // shower the second particle
- if(fc[1].kinematics) timeLikeShower(children[1],type,fc[1],true);
- updateHistory(children[1]);
- // branching has happened
- particle->showerKinematics()->updateParent(particle, children,fb.type);
- }
- // branching has happened
- return true;
-}
-
-vector<ShowerProgenitorPtr> Evolver::setupShower(bool hard) {
- // generate POWHEG hard emission if needed
- if(_hardEmissionMode>0) hardestEmission(hard);
- ShowerInteraction::Type inter = interaction_;
- if(_hardtree&&inter!=ShowerInteraction::QEDQCD && inter!=ShowerInteraction::ALL) {
- inter = _hardtree->interaction();
- }
- // set the initial colour partners
- setEvolutionPartners(hard,inter,false);
- // generate hard me if needed
- if(_hardEmissionMode==0 ||
- (!hard && _hardEmissionMode==-1)) hardMatrixElementCorrection(hard);
- // get the particles to be showered
- vector<ShowerProgenitorPtr> particlesToShower =
- currentTree()->extractProgenitors();
- // remake the colour partners if needed
- if(_currenttree->hardMatrixElementCorrection()) {
- setEvolutionPartners(hard,interaction_,true);
- _currenttree->resetShowerProducts();
- }
- // return the answer
- return particlesToShower;
-}
-
-void Evolver::setEvolutionPartners(bool hard,ShowerInteraction::Type type,
- bool clear) {
- // match the particles in the ShowerTree and hardTree
- if(hardTree() && !hardTree()->connect(currentTree()))
- throw Exception() << "Can't match trees in "
- << "Evolver::setEvolutionPartners()"
- << Exception::eventerror;
- // extract the progenitors
- vector<ShowerParticlePtr> particles =
- currentTree()->extractProgenitorParticles();
- // clear the partners if needed
- if(clear) {
- for(unsigned int ix=0;ix<particles.size();++ix) {
- particles[ix]->partner(ShowerParticlePtr());
- particles[ix]->clearPartners();
- }
- }
- // sort out the colour partners
- if(hardTree()) {
- // find the partner
- for(unsigned int ix=0;ix<particles.size();++ix) {
- tHardBranchingPtr partner =
- hardTree()->particles()[particles[ix]]->colourPartner();
- if(!partner) continue;
- for(map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- it=hardTree()->particles().begin();
- it!=hardTree()->particles().end();++it) {
- if(it->second==partner) particles[ix]->partner(it->first);
- }
- if(!particles[ix]->partner())
- throw Exception() << "Can't match partners in "
- << "Evolver::setEvolutionPartners()"
- << Exception::eventerror;
- }
- }
- // Set the initial evolution scales
- showerModel()->partnerFinder()->
- setInitialEvolutionScales(particles,!hard,type,!_hardtree);
- if(hardTree() && _hardPOWHEG) {
- bool tooHard=false;
- map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- eit=hardTree()->particles().end();
- for(unsigned int ix=0;ix<particles.size();++ix) {
- map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- mit = hardTree()->particles().find(particles[ix]);
- Energy hardScale(ZERO);
- ShowerPartnerType::Type type(ShowerPartnerType::Undefined);
- // final-state
- if(particles[ix]->isFinalState()) {
- if(mit!= eit && !mit->second->children().empty()) {
- hardScale = mit->second->scale();
- type = mit->second->type();
- }
- }
- // initial-state
- else {
- if(mit!= eit && mit->second->parent()) {
- hardScale = mit->second->parent()->scale();
- type = mit->second->parent()->type();
- }
- }
- if(type!=ShowerPartnerType::Undefined) {
- if(type==ShowerPartnerType::QED) {
- tooHard |= particles[ix]->scales().QED_noAO<hardScale;
- }
- else if(type==ShowerPartnerType::QCDColourLine) {
- tooHard |= particles[ix]->scales().QCD_c_noAO<hardScale;
- }
- else if(type==ShowerPartnerType::QCDAntiColourLine) {
- tooHard |= particles[ix]->scales().QCD_ac_noAO<hardScale;
- }
- else if(type==ShowerPartnerType::EW) {
- tooHard |= particles[ix]->scales().EW<hardScale;
- }
- }
- }
- if(tooHard) convertHardTree(hard,type);
- }
-}
-
-void Evolver::updateHistory(tShowerParticlePtr particle) {
- if(!particle->children().empty()) {
- ShowerParticleVector theChildren;
- for(unsigned int ix=0;ix<particle->children().size();++ix) {
- ShowerParticlePtr part = dynamic_ptr_cast<ShowerParticlePtr>
- (particle->children()[ix]);
- theChildren.push_back(part);
- }
- // update the history if needed
- if(particle==_currenttree->getFinalStateShowerProduct(_progenitor))
- _currenttree->updateFinalStateShowerProduct(_progenitor,
- particle,theChildren);
- _currenttree->addFinalStateBranching(particle,theChildren);
- for(unsigned int ix=0;ix<theChildren.size();++ix)
- updateHistory(theChildren[ix]);
- }
-}
-
-bool Evolver::startTimeLikeShower(ShowerInteraction::Type type) {
- _nFSR = 0;
- // initialize basis vectors etc
- progenitor()->progenitor()->initializeFinalState();
- if(hardTree()) {
- map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- eit=hardTree()->particles().end(),
- mit = hardTree()->particles().find(progenitor()->progenitor());
- if( mit != eit && !mit->second->children().empty() ) {
- bool output=truncatedTimeLikeShower(progenitor()->progenitor(),
- mit->second ,type,Branching(),true);
- if(output) updateHistory(progenitor()->progenitor());
- return output;
- }
- }
- // do the shower
- bool output = hardOnly() ? false :
- timeLikeShower(progenitor()->progenitor() ,type,Branching(),true) ;
- if(output) updateHistory(progenitor()->progenitor());
- return output;
-}
-
-bool Evolver::startSpaceLikeShower(PPtr parent, ShowerInteraction::Type type) {
- // initialise the basis vectors
- progenitor()->progenitor()->initializeInitialState(parent);
- if(hardTree()) {
- map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- eit =hardTree()->particles().end(),
- mit = hardTree()->particles().find(progenitor()->progenitor());
- if( mit != eit && mit->second->parent() ) {
- return truncatedSpaceLikeShower( progenitor()->progenitor(),
- parent, mit->second->parent(), type );
- }
- }
- // perform the shower
- return hardOnly() ? false :
- spaceLikeShower(progenitor()->progenitor(),parent,type);
-}
-
-bool Evolver::
-startSpaceLikeDecayShower(const ShowerParticle::EvolutionScales & maxScales,
- Energy minimumMass,ShowerInteraction::Type type) {
- _nFSR = 0;
- // set up the particle basis vectors
- progenitor()->progenitor()->initializeDecay();
- if(hardTree()) {
- map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- eit =hardTree()->particles().end(),
- mit = hardTree()->particles().find(progenitor()->progenitor());
- if( mit != eit && mit->second->parent() ) {
- HardBranchingPtr branch=mit->second;
- while(branch->parent()) branch=branch->parent();
- return truncatedSpaceLikeDecayShower(progenitor()->progenitor(),maxScales,
- minimumMass, branch ,type, Branching());
- }
- }
- // perform the shower
- return hardOnly() ? false :
- spaceLikeDecayShower(progenitor()->progenitor(),maxScales,minimumMass,type,Branching());
-}
-
-bool Evolver::timeLikeVetoed(const Branching & fb,
- ShowerParticlePtr particle) {
- // work out type of interaction
- ShowerInteraction::Type type = convertInteraction(fb.type);
- // check whether emission was harder than largest pt of hard subprocess
- if ( hardVetoFS() && fb.kinematics->pT() > _progenitor->maxHardPt() )
- return true;
- // soft matrix element correction veto
- if( softMEC()) {
- if(_hardme && _hardme->hasMECorrection()) {
- if(_hardme->softMatrixElementVeto(_progenitor,particle,fb))
- return true;
- }
- else if(_decayme && _decayme->hasMECorrection()) {
- if(_decayme->softMatrixElementVeto(_progenitor,particle,fb))
- return true;
- }
- }
- // veto on maximum pt
- if(fb.kinematics->pT()>_progenitor->maximumpT(type)) return true;
- // general vetos
- if (fb.kinematics && !_vetoes.empty()) {
- bool vetoed=false;
- for (vector<ShowerVetoPtr>::iterator v = _vetoes.begin();
- v != _vetoes.end(); ++v) {
- bool test = (**v).vetoTimeLike(_progenitor,particle,fb);
- switch((**v).vetoType()) {
- case ShowerVeto::Emission:
- vetoed |= test;
- break;
- case ShowerVeto::Shower:
- if(test) throw VetoShower();
- break;
- case ShowerVeto::Event:
- if(test) throw Veto();
- break;
- }
- }
- if(vetoed) return true;
- }
- if ( ShowerHandler::currentHandler()->firstInteraction() &&
- ShowerHandler::currentHandler()->profileScales() ) {
- double weight =
- ShowerHandler::currentHandler()->profileScales()->
- hardScaleProfile(_progenitor->hardScale(),fb.kinematics->pT());
- if ( UseRandom::rnd() > weight )
- return true;
- }
- return false;
-}
-
-bool Evolver::spaceLikeVetoed(const Branching & bb,
- ShowerParticlePtr particle) {
- // work out type of interaction
- ShowerInteraction::Type type = convertInteraction(bb.type);
- // check whether emission was harder than largest pt of hard subprocess
- if (hardVetoIS() && bb.kinematics->pT() > _progenitor->maxHardPt())
- return true;
- // apply the soft correction
- if( softMEC() && _hardme && _hardme->hasMECorrection() ) {
- if(_hardme->softMatrixElementVeto(_progenitor,particle,bb))
- return true;
- }
- // the more general vetos
-
- // check vs max pt for the shower
- if(bb.kinematics->pT()>_progenitor->maximumpT(type)) return true;
-
- if (!_vetoes.empty()) {
- bool vetoed=false;
- for (vector<ShowerVetoPtr>::iterator v = _vetoes.begin();
- v != _vetoes.end(); ++v) {
- bool test = (**v).vetoSpaceLike(_progenitor,particle,bb);
- switch ((**v).vetoType()) {
- case ShowerVeto::Emission:
- vetoed |= test;
- break;
- case ShowerVeto::Shower:
- if(test) throw VetoShower();
- break;
- case ShowerVeto::Event:
- if(test) throw Veto();
- break;
- }
- }
- if (vetoed) return true;
- }
- if ( ShowerHandler::currentHandler()->firstInteraction() &&
- ShowerHandler::currentHandler()->profileScales() ) {
- double weight =
- ShowerHandler::currentHandler()->profileScales()->
- hardScaleProfile(_progenitor->hardScale(),bb.kinematics->pT());
- if ( UseRandom::rnd() > weight )
- return true;
- }
- return false;
-}
-
-bool Evolver::spaceLikeDecayVetoed( const Branching & fb,
- ShowerParticlePtr particle) {
- // work out type of interaction
- ShowerInteraction::Type type = convertInteraction(fb.type);
- // apply the soft correction
- if( softMEC() && _decayme && _decayme->hasMECorrection() ) {
- if(_decayme->softMatrixElementVeto(_progenitor,particle,fb))
- return true;
- }
- // veto on hardest pt in the shower
- if(fb.kinematics->pT()> _progenitor->maximumpT(type)) return true;
- // general vetos
- if (!_vetoes.empty()) {
- bool vetoed=false;
- for (vector<ShowerVetoPtr>::iterator v = _vetoes.begin();
- v != _vetoes.end(); ++v) {
- bool test = (**v).vetoSpaceLike(_progenitor,particle,fb);
- switch((**v).vetoType()) {
- case ShowerVeto::Emission:
- vetoed |= test;
- break;
- case ShowerVeto::Shower:
- if(test) throw VetoShower();
- break;
- case ShowerVeto::Event:
- if(test) throw Veto();
- break;
- }
- if (vetoed) return true;
- }
- }
- return false;
-}
-
-void Evolver::hardestEmission(bool hard) {
- HardTreePtr ISRTree;
- if( ( _hardme && _hardme->hasPOWHEGCorrection()!=0 && _hardEmissionMode< 2) ||
- ( _decayme && _decayme->hasPOWHEGCorrection()!=0 && _hardEmissionMode!=2) ) {
- if(_hardme) {
- assert(hard);
- _hardtree = _hardme->generateHardest( currentTree(),interaction_);
- }
- else {
- assert(!hard);
- _hardtree = _decayme->generateHardest( currentTree() );
- }
- // store initial state POWHEG radiation
- if(_hardtree && _hardme && _hardme->hasPOWHEGCorrection()==1)
- ISRTree=_hardtree;
- }
-
- else if (_hardEmissionMode>1 && hard) {
- // Get minimum pT cutoff used in shower approximation
- Energy maxpt = 1.*GeV;
- int colouredIn = 0;
- int colouredOut = 0;
- for( map< ShowerProgenitorPtr, tShowerParticlePtr >::iterator it
- = currentTree()->outgoingLines().begin();
- it != currentTree()->outgoingLines().end(); ++it ) {
- if( it->second->coloured() ) colouredOut+=1;
- }
- for( map< ShowerProgenitorPtr, ShowerParticlePtr >::iterator it
- = currentTree()->incomingLines().begin();
- it != currentTree()->incomingLines().end(); ++it ) {
- if( ! it->second->coloured() ) colouredIn+=1;
- }
-
- if ( theShowerApproximation ){
- if ( theShowerApproximation->ffPtCut() == theShowerApproximation->fiPtCut() &&
- theShowerApproximation->ffPtCut() == theShowerApproximation->iiPtCut() )
- maxpt = theShowerApproximation->ffPtCut();
- else if ( colouredIn == 2 && colouredOut == 0 )
- maxpt = theShowerApproximation->iiPtCut();
- else if ( colouredIn == 0 && colouredOut > 1 )
- maxpt = theShowerApproximation->ffPtCut();
- else if ( colouredIn == 2 && colouredOut == 1 )
- maxpt = min(theShowerApproximation->iiPtCut(), theShowerApproximation->fiPtCut());
- else if ( colouredIn == 1 && colouredOut > 1 )
- maxpt = min(theShowerApproximation->ffPtCut(), theShowerApproximation->fiPtCut());
- else
- maxpt = min(min(theShowerApproximation->iiPtCut(), theShowerApproximation->fiPtCut()),
- theShowerApproximation->ffPtCut());
- }
-
- // Generate hardtree from born and real emission subprocesses
- _hardtree = ShowerHandler::currentHandler()->generateCKKW(currentTree());
-
- // Find transverse momentum of hardest emission
- if (_hardtree){
- for(set<HardBranchingPtr>::iterator it=_hardtree->branchings().begin();
- it!=_hardtree->branchings().end();++it) {
- if ((*it)->parent() && (*it)->status()==HardBranching::Incoming)
- maxpt=(*it)->branchingParticle()->momentum().perp();
- if ((*it)->children().size()==2 && (*it)->status()==HardBranching::Outgoing){
- if ((*it)->branchingParticle()->id()!=21 &&
- abs((*it)->branchingParticle()->id())>5 ){
- if ((*it)->children()[0]->branchingParticle()->id()==21 ||
- abs((*it)->children()[0]->branchingParticle()->id())<6)
- maxpt=(*it)->children()[0]->branchingParticle()->momentum().perp();
- else if ((*it)->children()[1]->branchingParticle()->id()==21 ||
- abs((*it)->children()[1]->branchingParticle()->id())<6)
- maxpt=(*it)->children()[1]->branchingParticle()->momentum().perp();
- }
- else {
- if ( abs((*it)->branchingParticle()->id())<6){
- if (abs((*it)->children()[0]->branchingParticle()->id())<6)
- maxpt = (*it)->children()[1]->branchingParticle()->momentum().perp();
- else
- maxpt = (*it)->children()[0]->branchingParticle()->momentum().perp();
- }
- else maxpt = (*it)->children()[1]->branchingParticle()->momentum().perp();
- }
- }
- }
- }
-
-
- // Hardest (pt) emission should be the first powheg emission.
- maxpt=min(sqrt(ShowerHandler::currentHandler()->lastXCombPtr()->lastShowerScale()),maxpt);
-
- // Set maxpt to pT of emission when showering POWHEG real-emission subprocesses
- if (!isPowhegSEvent && !isPowhegHEvent){
- vector<int> outGluon;
- vector<int> outQuark;
- map< ShowerProgenitorPtr, tShowerParticlePtr >::iterator it;
- for( it = currentTree()->outgoingLines().begin();
- it != currentTree()->outgoingLines().end(); ++it ) {
- if ( abs(it->second->id())< 6) outQuark.push_back(it->second->id());
- if ( it->second->id()==21 ) outGluon.push_back(it->second->id());
- }
- if (outGluon.size() + outQuark.size() == 1){
- for( it = currentTree()->outgoingLines().begin();
- it != currentTree()->outgoingLines().end(); ++it ) {
- if ( abs(it->second->id())< 6 || it->second->id()==21 )
- maxpt = it->second->momentum().perp();
- }
- }
- else if (outGluon.size() + outQuark.size() > 1){
- // assume qqbar pair from a Z/gamma
- if (outGluon.size()==1 && outQuark.size() == 2 && outQuark[0]==-outQuark[1]){
- for( it = currentTree()->outgoingLines().begin();
- it != currentTree()->outgoingLines().end(); ++it ) {
- if ( it->second->id()==21 )
- maxpt = it->second->momentum().perp();
- }
- }
- // otherwise take the lowest pT avoiding born DY events
- else {
- maxpt = generator()->maximumCMEnergy();
- for( it = currentTree()->outgoingLines().begin();
- it != currentTree()->outgoingLines().end(); ++it ) {
- if ( abs(it->second->id())< 6 || it->second->id()==21 )
- maxpt = min(maxpt,it->second->momentum().perp());
- }
- }
- }
- }
-
- // set maximum pT for subsequent emissions from S events
- if ( isPowhegSEvent || (!isPowhegSEvent && !isPowhegHEvent)){
- for( map< ShowerProgenitorPtr, tShowerParticlePtr >::iterator it
- = currentTree()->outgoingLines().begin();
- it != currentTree()->outgoingLines().end(); ++it ) {
- if( ! it->second->coloured() ) continue;
- it->first->maximumpT(maxpt, ShowerInteraction::QCD );
- }
- for( map< ShowerProgenitorPtr, ShowerParticlePtr >::iterator it
- = currentTree()->incomingLines().begin();
- it != currentTree()->incomingLines().end(); ++it ) {
- if( ! it->second->coloured() ) continue;
- it->first->maximumpT(maxpt, ShowerInteraction::QCD );
- }
- }
- }
- else
- _hardtree = ShowerHandler::currentHandler()->generateCKKW(currentTree());
-
- // if hard me doesn't have a FSR powheg
- // correction use decay powheg correction
- if (_hardme && _hardme->hasPOWHEGCorrection()<2) {
- // check for intermediate colour singlet resonance
- const ParticleVector inter = _hardme->subProcess()->intermediates();
- if (inter.size()!=1 ||
- inter[0]->momentum().m2()/GeV2 < 0 ||
- inter[0]->dataPtr()->iColour()!=PDT::Colour0){
- if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
- return;
- }
-
- map<ShowerProgenitorPtr, tShowerParticlePtr > out = currentTree()->outgoingLines();
- // ignore cases where outgoing particles are not coloured
- if (out.size()!=2 ||
- out. begin()->second->dataPtr()->iColour()==PDT::Colour0 ||
- out.rbegin()->second->dataPtr()->iColour()==PDT::Colour0) {
- if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
- return;
- }
-
- // look up decay mode
- tDMPtr dm;
- string tag;
- string inParticle = inter[0]->dataPtr()->name() + "->";
- vector<string> outParticles;
- outParticles.push_back(out.begin ()->first->progenitor()->dataPtr()->name());
- outParticles.push_back(out.rbegin()->first->progenitor()->dataPtr()->name());
- for (int it=0; it<2; ++it){
- tag = inParticle + outParticles[it] + "," + outParticles[(it+1)%2] + ";";
- dm = generator()->findDecayMode(tag);
- if(dm) break;
- }
-
- // get the decayer
- HwDecayerBasePtr decayer;
- if(dm) decayer = dynamic_ptr_cast<HwDecayerBasePtr>(dm->decayer());
- // check if decayer has a FSR POWHEG correction
- if (!decayer || decayer->hasPOWHEGCorrection()<2){
- if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
- return;
- }
-
- // generate the hardest emission
- ShowerDecayMap decay;
- PPtr in = new_ptr(*inter[0]);
- ShowerTreePtr decayTree = new_ptr(ShowerTree(in, decay));
- HardTreePtr FSRTree = decayer->generateHardest(decayTree);
- if (!FSRTree) {
- if(_hardtree) connectTrees(currentTree(),_hardtree,hard);
- return;
- }
-
- // if there is no ISRTree make _hardtree from FSRTree
- if (!ISRTree){
- vector<HardBranchingPtr> inBranch,hardBranch;
- for(map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator
- cit =currentTree()->incomingLines().begin();
- cit!=currentTree()->incomingLines().end();++cit ) {
- inBranch.push_back(new_ptr(HardBranching(cit->second,SudakovPtr(),
- HardBranchingPtr(),
- HardBranching::Incoming)));
- inBranch.back()->beam(cit->first->original()->parents()[0]);
- hardBranch.push_back(inBranch.back());
- }
- if(inBranch[0]->branchingParticle()->dataPtr()->coloured()) {
- inBranch[0]->colourPartner(inBranch[1]);
- inBranch[1]->colourPartner(inBranch[0]);
- }
- for(set<HardBranchingPtr>::iterator it=FSRTree->branchings().begin();
- it!=FSRTree->branchings().end();++it) {
- if((**it).branchingParticle()->id()!=in->id())
- hardBranch.push_back(*it);
- }
- hardBranch[2]->colourPartner(hardBranch[3]);
- hardBranch[3]->colourPartner(hardBranch[2]);
- HardTreePtr newTree = new_ptr(HardTree(hardBranch,inBranch,
- ShowerInteraction::QCD));
- _hardtree = newTree;
- }
-
- // Otherwise modify the ISRTree to include the emission in FSRTree
- else {
- vector<tShowerParticlePtr> FSROut, ISROut;
- set<HardBranchingPtr>::iterator itFSR, itISR;
- // get outgoing particles
- for(itFSR =FSRTree->branchings().begin();
- itFSR!=FSRTree->branchings().end();++itFSR){
- if ((**itFSR).status()==HardBranching::Outgoing)
- FSROut.push_back((*itFSR)->branchingParticle());
- }
- for(itISR =ISRTree->branchings().begin();
- itISR!=ISRTree->branchings().end();++itISR){
- if ((**itISR).status()==HardBranching::Outgoing)
- ISROut.push_back((*itISR)->branchingParticle());
- }
-
- // find COM frame formed by outgoing particles
- LorentzRotation eventFrameFSR, eventFrameISR;
- eventFrameFSR = ((FSROut[0]->momentum()+FSROut[1]->momentum()).findBoostToCM());
- eventFrameISR = ((ISROut[0]->momentum()+ISROut[1]->momentum()).findBoostToCM());
-
- // find rotation between ISR and FSR frames
- int j=0;
- if (ISROut[0]->id()!=FSROut[0]->id()) j=1;
- eventFrameISR.rotateZ( (eventFrameFSR*FSROut[0]->momentum()).phi()-
- (eventFrameISR*ISROut[j]->momentum()).phi() );
- eventFrameISR.rotateY( (eventFrameFSR*FSROut[0]->momentum()).theta()-
- (eventFrameISR*ISROut[j]->momentum()).theta() );
- eventFrameISR.invert();
-
- for (itFSR=FSRTree->branchings().begin();
- itFSR!=FSRTree->branchings().end();++itFSR){
- if ((**itFSR).branchingParticle()->id()==in->id()) continue;
- for (itISR =ISRTree->branchings().begin();
- itISR!=ISRTree->branchings().end();++itISR){
- if ((**itISR).status()==HardBranching::Incoming) continue;
- if ((**itFSR).branchingParticle()->id()==
- (**itISR).branchingParticle()->id()){
- // rotate FSRTree particle to ISRTree event frame
- (**itISR).branchingParticle()->setMomentum(eventFrameISR*
- eventFrameFSR*
- (**itFSR).branchingParticle()->momentum());
- (**itISR).branchingParticle()->rescaleMass();
- // add the children of the FSRTree particles to the ISRTree
- if(!(**itFSR).children().empty()){
- (**itISR).addChild((**itFSR).children()[0]);
- (**itISR).addChild((**itFSR).children()[1]);
- // rotate momenta to ISRTree event frame
- (**itISR).children()[0]->branchingParticle()->setMomentum(eventFrameISR*
- eventFrameFSR*
- (**itFSR).children()[0]->branchingParticle()->momentum());
- (**itISR).children()[1]->branchingParticle()->setMomentum(eventFrameISR*
- eventFrameFSR*
- (**itFSR).children()[1]->branchingParticle()->momentum());
- }
- }
- }
- }
- _hardtree = ISRTree;
- }
- }
- if(_hardtree){
- connectTrees(currentTree(),_hardtree,hard);
- }
-}
-
-bool Evolver::truncatedTimeLikeShower(tShowerParticlePtr particle,
- HardBranchingPtr branch,
- ShowerInteraction::Type type,
- Branching fb, bool first) {
- // select a branching if we don't have one
- if(!fb.kinematics)
- fb = selectTimeLikeBranching(particle,type,branch);
- // must be an emission, the forced one it not a truncated one
- assert(fb.kinematics);
- ShowerParticleVector children;
- int ntry=0;
- Branching fc[2];
- bool setupChildren = true;
- while (ntry<50) {
- if(!fc[0].hard) fc[0] = Branching();
- if(!fc[1].hard) fc[1] = Branching();
- ++ntry;
- // Assign the shower kinematics to the emitting particle.
- if(setupChildren) {
- ++_nFSR;
- // Assign the shower kinematics to the emitting particle.
- particle->showerKinematics(fb.kinematics);
- if(fb.kinematics->pT()>progenitor()->highestpT())
- progenitor()->highestpT(fb.kinematics->pT());
- // create the children
- children = createTimeLikeChildren(particle,fb.ids);
- // update the children
- particle->showerKinematics()->
- updateChildren(particle, children,fb.type,_reconOpt>=3);
- setupChildren = false;
- }
- // select branchings for children
- if(!fc[0].kinematics) {
- // select branching for first particle
- if(!fb.hard && fb.iout ==1 )
- fc[0] = selectTimeLikeBranching(children[0],type,branch);
- else if(fb.hard && !branch->children()[0]->children().empty() )
- fc[0] = selectTimeLikeBranching(children[0],type,branch->children()[0]);
- else
- fc[0] = selectTimeLikeBranching(children[0],type,HardBranchingPtr());
- }
- // select branching for the second particle
- if(!fc[1].kinematics) {
- // select branching for first particle
- if(!fb.hard && fb.iout ==2 )
- fc[1] = selectTimeLikeBranching(children[1],type,branch);
- else if(fb.hard && !branch->children()[1]->children().empty() )
- fc[1] = selectTimeLikeBranching(children[1],type,branch->children()[1]);
- else
- fc[1] = selectTimeLikeBranching(children[1],type,HardBranchingPtr());
- }
- // old default
- if(_reconOpt==0 || (_reconOpt==1 && fb.hard) ) {
- // shower the first particle
- if(fc[0].kinematics) {
- // the parent has truncated emission and following line
- if(!fb.hard && fb.iout == 1)
- truncatedTimeLikeShower(children[0],branch,type,fc[0],false);
- // hard emission and subsquent hard emissions
- else if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[0],false);
- }
- if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
- // shower the second particle
- if(fc[1].kinematics) {
- // the parent has truncated emission and following line
- if(!fb.hard && fb.iout == 2)
- truncatedTimeLikeShower(children[1],branch,type,fc[1],false);
- // hard emission and subsquent hard emissions
- else if(fb.hard && !branch->children()[1]->children().empty() )
- truncatedTimeLikeShower(children[1],branch->children()[1],type,fc[1],false);
- else
- timeLikeShower(children[1],type,fc[1],false);
- }
- if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
- // branching has happened
- particle->showerKinematics()->updateParent(particle, children,fb.type);
- break;
- }
- // H7 default
- else if(_reconOpt==1) {
- // shower the first particle
- if(fc[0].kinematics) {
- // the parent has truncated emission and following line
- if(!fb.hard && fb.iout == 1)
- truncatedTimeLikeShower(children[0],branch,type,fc[0],false);
- else
- timeLikeShower(children[0],type,fc[0],false);
- }
- if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
- // shower the second particle
- if(fc[1].kinematics) {
- // the parent has truncated emission and following line
- if(!fb.hard && fb.iout == 2)
- truncatedTimeLikeShower(children[1],branch,type,fc[1],false);
- else
- timeLikeShower(children[1],type,fc[1],false);
- }
- if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
- // branching has happened
- particle->showerKinematics()->updateParent(particle, children,fb.type);
- // clean up the vetoed emission
- if(particle->virtualMass()==ZERO) {
- particle->showerKinematics(ShoKinPtr());
- for(unsigned int ix=0;ix<children.size();++ix)
- particle->abandonChild(children[ix]);
- children.clear();
- if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- // generate the new emission
- fb = selectTimeLikeBranching(particle,type,branch);
- // must be at least hard emission
- assert(fb.kinematics);
- setupChildren = true;
- continue;
- }
- else
- break;
- }
- else if(_reconOpt>=2) {
- // cut-off masses for the branching
- const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
- // compute the masses of the children
- Energy masses[3];
- for(unsigned int ix=0;ix<2;++ix) {
- if(fc[ix].kinematics) {
- const vector<Energy> & vm = fc[ix].sudakov->virtualMasses(fc[ix].ids);
- Energy2 q2 =
- fc[ix].kinematics->z()*(1.-fc[ix].kinematics->z())*sqr(fc[ix].kinematics->scale());
- if(fc[ix].ids[0]->id()!=ParticleID::g) q2 += sqr(vm[0]);
- masses[ix+1] = sqrt(q2);
- }
- else {
- masses[ix+1] = virtualMasses[ix+1];
- }
- }
- masses[0] = fb.ids[0]->id()!=ParticleID::g ? virtualMasses[0] : ZERO;
- double z = fb.kinematics->z();
- Energy2 pt2 = z*(1.-z)*(z*(1.-z)*sqr(fb.kinematics->scale()) + sqr(masses[0]))
- - sqr(masses[1])*(1.-z) - sqr(masses[2])*z;
- if(pt2>=ZERO) {
- break;
- }
- // if only the hard emission have to accept it
- else if ((fc[0].hard && !fc[1].kinematics) ||
- (fc[1].hard && !fc[0].kinematics) ) {
- break;
- }
- else {
- // reset the scales for the children
- for(unsigned int ix=0;ix<2;++ix) {
- if(fc[ix].hard) continue;
- if(fc[ix].kinematics && ! fc[ix].hard )
- children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
- else
- children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
- children[ix]->virtualMass(ZERO);
- }
- }
- }
- };
- if(_reconOpt>=2) {
- // shower the first particle
- if(fc[0].kinematics) {
- // the parent has truncated emission and following line
- if(!fb.hard && fb.iout == 1)
- truncatedTimeLikeShower(children[0],branch,type,fc[0],false);
- // hard emission and subsquent hard emissions
- else if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[0],false);
- }
- if(children[0]->spinInfo()) children[0]->spinInfo()->develop();
- // shower the second particle
- if(fc[1].kinematics) {
- // the parent has truncated emission and following line
- if(!fb.hard && fb.iout == 2)
- truncatedTimeLikeShower(children[1],branch,type,fc[1],false);
- // hard emission and subsquent hard emissions
- else if(fb.hard && !branch->children()[1]->children().empty() )
- truncatedTimeLikeShower(children[1],branch->children()[1],type,fc[1],false);
- else
- timeLikeShower(children[1],type,fc[1],false);
- }
- if(children[1]->spinInfo()) children[1]->spinInfo()->develop();
- // branching has happened
- particle->showerKinematics()->updateParent(particle, children,fb.type);
- }
- if(first&&!children.empty())
- particle->showerKinematics()->resetChildren(particle,children);
- if(particle->spinInfo()) particle->spinInfo()->develop();
- return true;
-}
-
-bool Evolver::truncatedSpaceLikeShower(tShowerParticlePtr particle, PPtr beam,
- HardBranchingPtr branch,
- ShowerInteraction::Type type) {
- tcPDFPtr pdf;
- if(ShowerHandler::currentHandler()->firstPDF().particle() == beamParticle())
- pdf = ShowerHandler::currentHandler()->firstPDF().pdf();
- if(ShowerHandler::currentHandler()->secondPDF().particle() == beamParticle())
- pdf = ShowerHandler::currentHandler()->secondPDF().pdf();
- Energy freeze = ShowerHandler::currentHandler()->pdfFreezingScale();
- Branching bb;
- // parameters of the force branching
- double z(0.);
- HardBranchingPtr timelike;
- for( unsigned int ix = 0; ix < branch->children().size(); ++ix ) {
- if( branch->children()[ix]->status() ==HardBranching::Outgoing) {
- timelike = branch->children()[ix];
- }
- if( branch->children()[ix]->status() ==HardBranching::Incoming )
- z = branch->children()[ix]->z();
- }
- // generate truncated branching
- tcPDPtr part[2];
- if(z>=0.&&z<=1.) {
- while (true) {
- if( !isTruncatedShowerON() || hardOnly() ) break;
- bb = splittingGenerator()->chooseBackwardBranching( *particle,
- beam, 1., beamParticle(),
- type , pdf,freeze);
- if( !bb.kinematics || bb.kinematics->scale() < branch->scale() ) {
- bb = Branching();
- break;
- }
- // particles as in Sudakov form factor
- part[0] = bb.ids[0];
- part[1] = bb.ids[2];
- double zsplit = bb.kinematics->z();
- // apply the vetos for the truncated shower
- // if doesn't carry most of momentum
- ShowerInteraction::Type type2 = convertInteraction(bb.type);
- if(type2==branch->sudakov()->interactionType() &&
- zsplit < 0.5) {
- particle->vetoEmission(bb.type,bb.kinematics->scale());
- continue;
- }
- // others
- if( part[0]->id() != particle->id() || // if particle changes type
- bb.kinematics->pT() > progenitor()->maximumpT(type2) || // pt veto
- bb.kinematics->scale() < branch->scale()) { // angular ordering veto
- particle->vetoEmission(bb.type,bb.kinematics->scale());
- continue;
- }
- // and those from the base class
- if(spaceLikeVetoed(bb,particle)) {
- particle->vetoEmission(bb.type,bb.kinematics->scale());
- continue;
- }
- break;
- }
- }
- if( !bb.kinematics ) {
- //do the hard emission
- ShoKinPtr kinematics =
- branch->sudakov()->createInitialStateBranching( branch->scale(), z, branch->phi(),
- branch->children()[0]->pT() );
- // assign the splitting function and shower kinematics
- particle->showerKinematics( kinematics );
- if(kinematics->pT()>progenitor()->highestpT())
- progenitor()->highestpT(kinematics->pT());
- // For the time being we are considering only 1->2 branching
- // Now create the actual particles, make the otherChild a final state
- // particle, while the newParent is not
- ShowerParticlePtr newParent =
- new_ptr( ShowerParticle( branch->branchingParticle()->dataPtr(), false ) );
- ShowerParticlePtr otherChild =
- new_ptr( ShowerParticle( timelike->branchingParticle()->dataPtr(),
- true, true ) );
- ShowerParticleVector theChildren;
- theChildren.push_back( particle );
- theChildren.push_back( otherChild );
- particle->showerKinematics()->
- updateParent( newParent, theChildren, branch->type());
- // update the history if needed
- currentTree()->updateInitialStateShowerProduct( progenitor(), newParent );
- currentTree()->addInitialStateBranching( particle, newParent, otherChild );
- // for the reconstruction of kinematics, parent/child
- // relationships are according to the branching process:
- // now continue the shower
- bool emitted=false;
- if(!hardOnly()) {
- if( branch->parent() ) {
- emitted = truncatedSpaceLikeShower( newParent, beam, branch->parent() , type);
- }
- else {
- emitted = spaceLikeShower( newParent, beam , type);
- }
- }
- if( !emitted ) {
- if( intrinsicpT().find( progenitor() ) == intrinsicpT().end() ) {
- kinematics->updateLast( newParent, ZERO, ZERO );
- }
- else {
- pair<Energy,double> kt = intrinsicpT()[progenitor()];
- kinematics->updateLast( newParent,
- kt.first*cos( kt.second ),
- kt.first*sin( kt.second ) );
- }
- }
- particle->showerKinematics()->
- updateChildren( newParent, theChildren,bb.type,false);
- if(hardOnly()) return true;
- // perform the shower of the final-state particle
- if( timelike->children().empty() ) {
- timeLikeShower( otherChild , type,Branching(),true);
- }
- else {
- truncatedTimeLikeShower( otherChild, timelike , type,Branching(), true);
- }
- updateHistory(otherChild);
- // return the emitted
- return true;
- }
- // assign the splitting function and shower kinematics
- particle->showerKinematics( bb.kinematics );
- if(bb.kinematics->pT()>progenitor()->highestpT())
- progenitor()->highestpT(bb.kinematics->pT());
- // For the time being we are considering only 1->2 branching
- // Now create the actual particles, make the otherChild a final state
- // particle, while the newParent is not
- ShowerParticlePtr newParent = new_ptr( ShowerParticle( part[0], false ) );
- ShowerParticlePtr otherChild = new_ptr( ShowerParticle( part[1], true, true ) );
- ShowerParticleVector theChildren;
- theChildren.push_back( particle );
- theChildren.push_back( otherChild );
- particle->showerKinematics()->
- updateParent( newParent, theChildren, bb.type);
- // update the history if needed
- currentTree()->updateInitialStateShowerProduct( progenitor(), newParent );
- currentTree()->addInitialStateBranching( particle, newParent, otherChild );
- // for the reconstruction of kinematics, parent/child
- // relationships are according to the branching process:
- // now continue the shower
- bool emitted = truncatedSpaceLikeShower( newParent, beam, branch,type);
- // now reconstruct the momentum
- if( !emitted ) {
- if( intrinsicpT().find( progenitor() ) == intrinsicpT().end() ) {
- bb.kinematics->updateLast( newParent, ZERO, ZERO );
- }
- else {
- pair<Energy,double> kt = intrinsicpT()[ progenitor() ];
- bb.kinematics->updateLast( newParent,
- kt.first*cos( kt.second ),
- kt.first*sin( kt.second ) );
- }
- }
- particle->showerKinematics()->
- updateChildren( newParent, theChildren, bb.type,false);
- // perform the shower of the final-state particle
- timeLikeShower( otherChild , type,Branching(),true);
- updateHistory(otherChild);
- // return the emitted
- return true;
-}
-
-bool Evolver::
-truncatedSpaceLikeDecayShower(tShowerParticlePtr particle,
- const ShowerParticle::EvolutionScales & maxScales,
- Energy minmass, HardBranchingPtr branch,
- ShowerInteraction::Type type, Branching fb) {
- // select a branching if we don't have one
- if(!fb.kinematics)
- fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,branch);
- // must be an emission, the forced one it not a truncated one
- assert(fb.kinematics);
- ShowerParticleVector children;
- int ntry=0;
- Branching fc[2];
- bool setupChildren = true;
- while (ntry<50) {
- if(!fc[0].hard) fc[0] = Branching();
- if(!fc[1].hard) fc[1] = Branching();
- ++ntry;
- if(setupChildren) {
- ++_nFSR;
- // Assign the shower kinematics to the emitting particle.
- particle->showerKinematics(fb.kinematics);
- if(fb.kinematics->pT()>progenitor()->highestpT())
- progenitor()->highestpT(fb.kinematics->pT());
- // create the ShowerParticle objects for the two children
- children = createTimeLikeChildren(particle,fb.ids);
- // updateChildren the children
- particle->showerKinematics()->
- updateChildren(particle, children, fb.type,_reconOpt>=3);
- setupChildren = false;
- }
- // select branchings for children
- if(!fc[0].kinematics) {
- if(children[0]->id()==particle->id()) {
- // select branching for first particle
- if(!fb.hard)
- fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,type,branch);
- else if(fb.hard && ! branch->children()[0]->children().empty() )
- fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,type,
- branch->children()[0]);
- else
- fc[0] = selectSpaceLikeDecayBranching(children[0],maxScales,minmass,type,
- HardBranchingPtr());
- }
- else {
- // select branching for first particle
- if(fb.hard && !branch->children()[0]->children().empty() )
- fc[0] = selectTimeLikeBranching(children[0],type,branch->children()[0]);
- else
- fc[0] = selectTimeLikeBranching(children[0],type,HardBranchingPtr());
- }
- }
- // select branching for the second particle
- if(!fc[1].kinematics) {
- if(children[1]->id()==particle->id()) {
- // select branching for first particle
- if(!fb.hard)
- fc[1] = selectSpaceLikeDecayBranching(children[1],maxScales,minmass,type,branch);
- else if(fb.hard && ! branch->children()[1]->children().empty() )
- fc[1] = selectSpaceLikeDecayBranching(children[1],maxScales,minmass,type,
- branch->children()[1]);
- else
- fc[1] = selectSpaceLikeDecayBranching(children[1],maxScales,minmass,type,
- HardBranchingPtr());
- }
- else {
- if(fb.hard && !branch->children()[1]->children().empty() )
- fc[1] = selectTimeLikeBranching(children[1],type,branch->children()[1]);
- else
- fc[1] = selectTimeLikeBranching(children[1],type,HardBranchingPtr());
- }
- }
- // old default
- if(_reconOpt==0 || (_reconOpt==1 && fb.hard) ) {
- // update the history if needed
- currentTree()->updateInitialStateShowerProduct(progenitor(),children[0]);
- currentTree()->addInitialStateBranching(particle,children[0],children[1]);
- // shower the first particle
- if(fc[0].kinematics) {
- if(children[0]->id()==particle->id()) {
- if(!fb.hard)
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch,type,fc[0]);
- else if(fb.hard && ! branch->children()[0]->children().empty() )
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch->children()[0],type,fc[0]);
- else
- spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[0]);
- }
- else {
- if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[0],false);
- }
- }
- // shower the second particle
- if(fc[1].kinematics) {
- if(children[0]->id()==particle->id()) {
- if(!fb.hard)
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch,type,fc[1]);
- else if(fb.hard && ! branch->children()[0]->children().empty() )
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch->children()[0],type,fc[1]);
- else
- spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[1]);
- }
- else {
- if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[1],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[1],false);
- }
- }
- updateHistory(children[1]);
- // branching has happened
- break;
- }
- // H7 default
- else if(_reconOpt==1) {
- // update the history if needed
- currentTree()->updateInitialStateShowerProduct(progenitor(),children[0]);
- currentTree()->addInitialStateBranching(particle,children[0],children[1]);
- // shower the first particle
- if(fc[0].kinematics) {
- if(children[0]->id()==particle->id()) {
- if(!fb.hard)
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch,type,fc[0]);
- else if(fb.hard && ! branch->children()[0]->children().empty() )
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch->children()[0],type,fc[0]);
- else
- spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[0]);
- }
- else {
- if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[0],false);
- }
- }
- // shower the second particle
- if(fc[1].kinematics) {
- if(children[0]->id()==particle->id()) {
- if(!fb.hard)
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch,type,fc[1]);
- else if(fb.hard && ! branch->children()[0]->children().empty() )
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch->children()[0],type,fc[1]);
- else
- spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[1]);
- }
- else {
- if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[1],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[1],false);
- }
- }
- // clean up the vetoed emission
- if(particle->virtualMass()==ZERO) {
- particle->showerKinematics(ShoKinPtr());
- for(unsigned int ix=0;ix<children.size();++ix)
- particle->abandonChild(children[ix]);
- children.clear();
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- // generate the new emission
- fb = selectSpaceLikeDecayBranching(particle,maxScales,minmass,type,branch);
- // must be at least hard emission
- assert(fb.kinematics);
- setupChildren = true;
- continue;
- }
- else {
- updateHistory(children[1]);
- break;
- }
- }
- else if(_reconOpt>=2) {
- // cut-off masses for the branching
- const vector<Energy> & virtualMasses = fb.sudakov->virtualMasses(fb.ids);
- // compute the masses of the children
- Energy masses[3];
- // space-like children
- masses[1] = children[0]->virtualMass();
- // time-like child
- if(fc[1].kinematics) {
- const vector<Energy> & vm = fc[1].sudakov->virtualMasses(fc[1].ids);
- Energy2 q2 =
- fc[1].kinematics->z()*(1.-fc[1].kinematics->z())*sqr(fc[1].kinematics->scale());
- if(fc[1].ids[0]->id()!=ParticleID::g) q2 += sqr(vm[0]);
- masses[2] = sqrt(q2);
- }
- else {
- masses[2] = virtualMasses[2];
- }
- masses[0]=particle->virtualMass();
- double z = fb.kinematics->z();
- Energy2 pt2 = (1.-z)*(z*sqr(masses[0])-sqr(masses[1])-z/(1.-z)*sqr(masses[2]));
- if(pt2>=ZERO) {
- break;
- }
- else {
- // reset the scales for the children
- for(unsigned int ix=0;ix<2;++ix) {
- if(fc[ix].kinematics)
- children[ix]->vetoEmission(fc[ix].type,fc[ix].kinematics->scale());
- else {
- if(ix==0)
- children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,Constants::MaxEnergy);
- else
- children[ix]->vetoEmission(ShowerPartnerType::QCDColourLine,ZERO);
- }
- }
- children[0]->virtualMass(_progenitor->progenitor()->mass());
- children[1]->virtualMass(ZERO);
- }
- }
- };
- if(_reconOpt>=2) {
- // update the history if needed
- currentTree()->updateInitialStateShowerProduct(progenitor(),children[0]);
- currentTree()->addInitialStateBranching(particle,children[0],children[1]);
- // shower the first particle
- if(fc[0].kinematics) {
- if(children[0]->id()==particle->id()) {
- if(!fb.hard)
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch,type,fc[0]);
- else if(fb.hard && ! branch->children()[0]->children().empty() )
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch->children()[0],type,fc[0]);
- else
- spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[0]);
- }
- else {
- if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[0],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[0],false);
- }
- }
- // shower the second particle
- if(fc[1].kinematics) {
- if(children[0]->id()==particle->id()) {
- if(!fb.hard)
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch,type,fc[1]);
- else if(fb.hard && ! branch->children()[0]->children().empty() )
- truncatedSpaceLikeDecayShower( children[0],maxScales,minmass,
- branch->children()[0],type,fc[1]);
- else
- spaceLikeDecayShower( children[0],maxScales,minmass,type,fc[1]);
- }
- else {
- if(fb.hard && !branch->children()[0]->children().empty() )
- truncatedTimeLikeShower(children[0],branch->children()[0],type,fc[1],false);
- // normal shower
- else
- timeLikeShower(children[0],type,fc[1],false);
- }
- }
- updateHistory(children[1]);
- }
- return true;
-}
-
-void Evolver::connectTrees(ShowerTreePtr showerTree,
- HardTreePtr hardTree, bool hard ) {
- ShowerParticleVector particles;
- // find the Sudakovs
- for(set<HardBranchingPtr>::iterator cit=hardTree->branchings().begin();
- cit!=hardTree->branchings().end();++cit) {
- // Sudakovs for ISR
- if((**cit).parent()&&(**cit).status()==HardBranching::Incoming) {
- ++_nis;
- vector<long> br(3);
- br[0] = (**cit).parent()->branchingParticle()->id();
- br[1] = (**cit). branchingParticle()->id();
- br[2] = (**cit).parent()->children()[0]==*cit ?
- (**cit).parent()->children()[1]->branchingParticle()->id() :
- (**cit).parent()->children()[0]->branchingParticle()->id();
- BranchingList branchings = splittingGenerator()->initialStateBranchings();
- if(br[1]<0&&br[0]==br[1]) {
- br[0] = abs(br[0]);
- br[1] = abs(br[1]);
- }
- else if(br[1]<0) {
- br[1] = -br[1];
- br[2] = -br[2];
- }
- long index = abs(br[1]);
- SudakovPtr sudakov;
- for(BranchingList::const_iterator cjt = branchings.lower_bound(index);
- cjt != branchings.upper_bound(index); ++cjt ) {
- IdList ids = cjt->second.particles;
- if(ids[0]->id()==br[0]&&ids[1]->id()==br[1]&&ids[2]->id()==br[2]) {
- sudakov=cjt->second.sudakov;
- break;
- }
- }
- if(!sudakov) throw Exception() << "Can't find Sudakov for the hard emission in "
- << "Evolver::connectTrees() for ISR"
- << Exception::runerror;
- (**cit).parent()->sudakov(sudakov);
- }
- // Sudakovs for FSR
- else if(!(**cit).children().empty()) {
- ++_nfs;
- vector<long> br(3);
- br[0] = (**cit) .branchingParticle()->id();
- br[1] = (**cit).children()[0]->branchingParticle()->id();
- br[2] = (**cit).children()[1]->branchingParticle()->id();
- BranchingList branchings = splittingGenerator()->finalStateBranchings();
- if(br[0]<0) {
- br[0] = abs(br[0]);
- br[1] = abs(br[1]);
- br[2] = abs(br[2]);
- }
- long index = br[0];
- SudakovPtr sudakov;
- for(BranchingList::const_iterator cjt = branchings.lower_bound(index);
- cjt != branchings.upper_bound(index); ++cjt ) {
- IdList ids = cjt->second.particles;
- if(ids[0]->id()==br[0]&&ids[1]->id()==br[1]&&ids[2]->id()==br[2]) {
- sudakov=cjt->second.sudakov;
- break;
- }
- }
- if(!sudakov) throw Exception() << "Can't find Sudakov for the hard emission in "
- << "Evolver::connectTrees()"
- << Exception::runerror;
- (**cit).sudakov(sudakov);
- }
- }
- // calculate the evolution scale
- for(set<HardBranchingPtr>::iterator cit=hardTree->branchings().begin();
- cit!=hardTree->branchings().end();++cit) {
- particles.push_back((*cit)->branchingParticle());
- }
- showerModel()->partnerFinder()->
- setInitialEvolutionScales(particles,!hard,hardTree->interaction(),
- !hardTree->partnersSet());
- hardTree->partnersSet(true);
- // inverse reconstruction
- if(hard) {
- showerModel()->kinematicsReconstructor()->
- deconstructHardJets(hardTree,ShowerHandler::currentHandler()->evolver(),
- hardTree->interaction());
- }
- else
- showerModel()->kinematicsReconstructor()->
- deconstructDecayJets(hardTree,ShowerHandler::currentHandler()->evolver(),
- hardTree->interaction());
- // now reset the momenta of the showering particles
- vector<ShowerProgenitorPtr> particlesToShower;
- for(map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator
- cit=showerTree->incomingLines().begin();
- cit!=showerTree->incomingLines().end();++cit )
- particlesToShower.push_back(cit->first);
- // extract the showering particles
- for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator
- cit=showerTree->outgoingLines().begin();
- cit!=showerTree->outgoingLines().end();++cit )
- particlesToShower.push_back(cit->first);
- // match them
- map<ShowerProgenitorPtr,HardBranchingPtr> partners;
- for(set<HardBranchingPtr>::const_iterator bit=hardTree->branchings().begin();
- bit!=hardTree->branchings().end();++bit) {
- Energy2 dmin( 1e30*GeV2 );
- ShowerProgenitorPtr partner;
- for(vector<ShowerProgenitorPtr>::const_iterator pit=particlesToShower.begin();
- pit!=particlesToShower.end();++pit) {
- if(partners.find(*pit)!=partners.end()) continue;
- if( (**bit).branchingParticle()->id() != (**pit).progenitor()->id() ) continue;
- if( (**bit).branchingParticle()->isFinalState() !=
- (**pit).progenitor()->isFinalState() ) continue;
- if( (**pit).progenitor()->isFinalState() ) {
- Energy2 dtest =
- sqr( (**pit).progenitor()->momentum().x() - (**bit).showerMomentum().x() ) +
- sqr( (**pit).progenitor()->momentum().y() - (**bit).showerMomentum().y() ) +
- sqr( (**pit).progenitor()->momentum().z() - (**bit).showerMomentum().z() ) +
- sqr( (**pit).progenitor()->momentum().t() - (**bit).showerMomentum().t() );
- // add mass difference for identical particles (e.g. Z0 Z0 production)
- dtest += 1e10*sqr((**pit).progenitor()->momentum().m()-(**bit).showerMomentum().m());
- if( dtest < dmin ) {
- partner = *pit;
- dmin = dtest;
- }
- }
- else {
- // ensure directions are right
- if((**pit).progenitor()->momentum().z()/(**bit).showerMomentum().z()>ZERO) {
- partner = *pit;
- break;
- }
- }
- }
- if(!partner) throw Exception() << "Failed to match shower and hard trees in Evolver::hardestEmission"
- << Exception::eventerror;
- partners[partner] = *bit;
- }
- for(vector<ShowerProgenitorPtr>::const_iterator pit=particlesToShower.begin();
- pit!=particlesToShower.end();++pit) {
- HardBranchingPtr partner = partners[*pit];
- if((**pit).progenitor()->dataPtr()->stable()) {
- (**pit).progenitor()->set5Momentum(partner->showerMomentum());
- (**pit).copy()->set5Momentum(partner->showerMomentum());
- }
- else {
- Lorentz5Momentum oldMomentum = (**pit).progenitor()->momentum();
- Lorentz5Momentum newMomentum = partner->showerMomentum();
- LorentzRotation boost( oldMomentum.findBoostToCM(),oldMomentum.e()/oldMomentum.mass());
- (**pit).progenitor()->transform(boost);
- (**pit).copy() ->transform(boost);
- boost = LorentzRotation(-newMomentum.findBoostToCM(),newMomentum.e()/newMomentum.mass());
- (**pit).progenitor()->transform(boost);
- (**pit).copy() ->transform(boost);
- }
- }
- // correction boosts for daughter trees
- for(map<tShowerTreePtr,pair<tShowerProgenitorPtr,tShowerParticlePtr> >::const_iterator
- tit = showerTree->treelinks().begin();
- tit != showerTree->treelinks().end();++tit) {
- ShowerTreePtr decayTree = tit->first;
- map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator
- cit = decayTree->incomingLines().begin();
- // reset the momentum of the decay particle
- Lorentz5Momentum oldMomentum = cit->first->progenitor()->momentum();
- Lorentz5Momentum newMomentum = tit->second.second->momentum();
- LorentzRotation boost( oldMomentum.findBoostToCM(),oldMomentum.e()/oldMomentum.mass());
- decayTree->transform(boost,true);
- boost = LorentzRotation(-newMomentum.findBoostToCM(),newMomentum.e()/newMomentum.mass());
- decayTree->transform(boost,true);
- }
-}
-
-void Evolver::doShowering(bool hard,XCPtr xcomb) {
- // zero number of emissions
- _nis = _nfs = 0;
- // if MC@NLO H event and limited emissions
- // indicate both final and initial state emission
- if ( isMCatNLOHEvent && _limitEmissions != 0 ) {
- _nis = _nfs = 1;
- }
- // extract particles to shower
- vector<ShowerProgenitorPtr> particlesToShower(setupShower(hard));
- // setup the maximum scales for the shower
- if (hardVetoOn()) setupMaximumScales(particlesToShower,xcomb);
- // set the hard scales for the profiles
- setupHardScales(particlesToShower,xcomb);
- // specific stuff for hard processes and decays
- Energy minmass(ZERO), mIn(ZERO);
- // hard process generate the intrinsic p_T once and for all
- if(hard) {
- generateIntrinsicpT(particlesToShower);
- }
- // decay compute the minimum mass of the final-state
- else {
- for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
- if(particlesToShower[ix]->progenitor()->isFinalState()) {
- if(particlesToShower[ix]->progenitor()->dataPtr()->stable())
- minmass += particlesToShower[ix]->progenitor()->dataPtr()->constituentMass();
- else
- minmass += particlesToShower[ix]->progenitor()->mass();
- }
- else {
- mIn = particlesToShower[ix]->progenitor()->mass();
- }
- }
- // throw exception if decay can't happen
- if ( minmass > mIn ) {
- throw Exception() << "Evolver.cc: Mass of decaying particle is "
- << "below constituent masses of decay products."
- << Exception::eventerror;
- }
- }
- bool reWeighting = _reWeight && hard && ShowerHandler::currentHandler()->firstInteraction();
- double eventWeight=0.;
- unsigned int nTryReWeight(0);
- // create random particle vector
- vector<ShowerProgenitorPtr> tmp;
- unsigned int nColouredIncoming = 0;
- while(particlesToShower.size()>0){
- unsigned int xx=UseRandom::irnd(particlesToShower.size());
- tmp.push_back(particlesToShower[xx]);
- particlesToShower.erase(particlesToShower.begin()+xx);
- }
- particlesToShower=tmp;
- for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
- if(!particlesToShower[ix]->progenitor()->isFinalState() &&
- particlesToShower[ix]->progenitor()->coloured()) ++nColouredIncoming;
- }
- bool switchRecon = hard && nColouredIncoming !=1;
- // main shower loop
- unsigned int ntry(0);
- bool reconstructed = false;
- do {
- // clear results of last attempt if needed
- if(ntry!=0) {
- currentTree()->clear();
- setEvolutionPartners(hard,interaction_,true);
- _nis = _nfs = 0;
- // if MC@NLO H event and limited emissions
- // indicate both final and initial state emission
- if ( isMCatNLOHEvent && _limitEmissions != 0 ) {
- _nis = _nfs = 1;
- }
- for(unsigned int ix=0; ix<particlesToShower.size();++ix) {
- SpinPtr spin = particlesToShower[ix]->progenitor()->spinInfo();
- if(spin && spin->decayVertex() &&
- dynamic_ptr_cast<tcSVertexPtr>(spin->decayVertex())) {
- spin->decayVertex(VertexPtr());
- }
- }
- }
- // loop over particles
- for(unsigned int ix=0;ix<particlesToShower.size();++ix) {
- // extract the progenitor
- progenitor(particlesToShower[ix]);
- // final-state radiation
- if(progenitor()->progenitor()->isFinalState()) {
- if(!isFSRadiationON()) continue;
- // perform shower
- progenitor()->hasEmitted(startTimeLikeShower(interaction_));
- }
- // initial-state radiation
- else {
- if(!isISRadiationON()) continue;
- // hard process
- if(hard) {
- // get the PDF
- setBeamParticle(_progenitor->beam());
- assert(beamParticle());
- // perform the shower
- // set the beam particle
- tPPtr beamparticle=progenitor()->original();
- if(!beamparticle->parents().empty())
- beamparticle=beamparticle->parents()[0];
- // generate the shower
- progenitor()->hasEmitted(startSpaceLikeShower(beamparticle,
- interaction_));
- }
- // decay
- else {
- // skip colour and electrically neutral particles
- if(!progenitor()->progenitor()->dataPtr()->coloured() &&
- !progenitor()->progenitor()->dataPtr()->charged()) {
- progenitor()->hasEmitted(false);
- continue;
- }
- // perform shower
- // set the scales correctly. The current scale is the maximum scale for
- // emission not the starting scale
- ShowerParticle::EvolutionScales maxScales(progenitor()->progenitor()->scales());
- progenitor()->progenitor()->scales() = ShowerParticle::EvolutionScales();
- if(progenitor()->progenitor()->dataPtr()->charged()) {
- progenitor()->progenitor()->scales().QED = progenitor()->progenitor()->mass();
- progenitor()->progenitor()->scales().QED_noAO = progenitor()->progenitor()->mass();
- }
- if(progenitor()->progenitor()->hasColour()) {
- progenitor()->progenitor()->scales().QCD_c = progenitor()->progenitor()->mass();
- progenitor()->progenitor()->scales().QCD_c_noAO = progenitor()->progenitor()->mass();
- }
- if(progenitor()->progenitor()->hasAntiColour()) {
- progenitor()->progenitor()->scales().QCD_ac = progenitor()->progenitor()->mass();
- progenitor()->progenitor()->scales().QCD_ac_noAO = progenitor()->progenitor()->mass();
- }
- progenitor()->progenitor()->scales().EW = progenitor()->progenitor()->mass();
- progenitor()->progenitor()->scales().EW_noAO = progenitor()->progenitor()->mass();
- // perform the shower
- progenitor()->hasEmitted(startSpaceLikeDecayShower(maxScales,minmass,
- interaction_));
- }
- }
- // do the kinematic reconstruction, checking if it worked
- reconstructed = hard ?
- showerModel()->kinematicsReconstructor()->
- reconstructHardJets (currentTree(),intrinsicpT(),interactions_[inter],
- switchRecon && ntry>maximumTries()/2) :
- showerModel()->kinematicsReconstructor()->
- reconstructDecayJets(currentTree(),interactions_[inter]);
- if(!reconstructed) continue;
- // apply vetos on the full shower
- for(vector<FullShowerVetoPtr>::const_iterator it=_fullShowerVetoes.begin();
- it!=_fullShowerVetoes.end();++it) {
- int veto = (**it).applyVeto(currentTree());
- if(veto<0) continue;
- // veto the shower
- if(veto==0) {
- reconstructed = false;
- break;
- }
- // veto the shower and reweight
- else if(veto==1) {
- reconstructed = false;
- break;
- }
- // veto the event
- else if(veto==2) {
- throw Veto();
- }
- }
- if(reWeighting) {
- if(reconstructed) eventWeight += 1.;
- reconstructed=false;
- ++nTryReWeight;
- if(nTryReWeight==_nReWeight) {
- reWeighting = false;
- if(eventWeight==0.) throw Veto();
- }
- }
- }
- // do the kinematic reconstruction, checking if it worked
- reconstructed = hard ?
- showerModel()->kinematicsReconstructor()->
- reconstructHardJets (currentTree(),intrinsicpT(),interaction_,
- switchRecon && ntry>maximumTries()/2) :
- showerModel()->kinematicsReconstructor()->
- reconstructDecayJets(currentTree(),interaction_);
- }
- while(!reconstructed&&maximumTries()>++ntry);
- // check if failed to generate the shower
- if(ntry==maximumTries()) {
- if(hard)
- throw ShowerHandler::ShowerTriesVeto(ntry);
- else
- throw Exception() << "Failed to generate the shower after "
- << ntry << " attempts in Evolver::showerDecay()"
- << Exception::eventerror;
- }
- // handle the weights and apply any reweighting required
- if(nTryReWeight>0) {
- tStdEHPtr seh = dynamic_ptr_cast<tStdEHPtr>(generator()->currentEventHandler());
- static bool first = true;
- if(seh) {
- seh->reweight(eventWeight/double(nTryReWeight));
- }
- else if(first) {
- generator()->log() << "Reweighting the shower only works with internal Herwig7 processes"
- << "Presumably you are showering Les Houches Events. These will not be"
- << "reweighted\n";
- first = false;
- }
- }
- // tree has now showered
- _currenttree->hasShowered(true);
- hardTree(HardTreePtr());
-}
-
-void Evolver:: convertHardTree(bool hard,ShowerInteraction::Type type) {
- map<ColinePtr,ColinePtr> cmap;
- // incoming particles
- for(map<ShowerProgenitorPtr,ShowerParticlePtr>::const_iterator
- cit=currentTree()->incomingLines().begin();cit!=currentTree()->incomingLines().end();++cit) {
- map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- mit = hardTree()->particles().find(cit->first->progenitor());
- // put the colour lines in the map
- ShowerParticlePtr oldParticle = cit->first->progenitor();
- ShowerParticlePtr newParticle = mit->second->branchingParticle();
- ColinePtr cLine = oldParticle-> colourLine();
- ColinePtr aLine = oldParticle->antiColourLine();
- if(newParticle->colourLine() &&
- cmap.find(newParticle-> colourLine())==cmap.end())
- cmap[newParticle-> colourLine()] = cLine;
- if(newParticle->antiColourLine() &&
- cmap.find(newParticle->antiColourLine())==cmap.end())
- cmap[newParticle->antiColourLine()] = aLine;
- // check whether or not particle emits
- bool emission = mit->second->parent();
- if(emission) {
- if(newParticle->colourLine()) {
- ColinePtr ctemp = newParticle-> colourLine();
- ctemp->removeColoured(newParticle);
- }
- if(newParticle->antiColourLine()) {
- ColinePtr ctemp = newParticle->antiColourLine();
- ctemp->removeAntiColoured(newParticle);
- }
- newParticle = mit->second->parent()->branchingParticle();
- }
- // get the new colour lines
- ColinePtr newCLine,newALine;
- // sort out colour lines
- if(newParticle->colourLine()) {
- ColinePtr ctemp = newParticle-> colourLine();
- ctemp->removeColoured(newParticle);
- if(cmap.find(ctemp)!=cmap.end()) {
- newCLine = cmap[ctemp];
- }
- else {
- newCLine = new_ptr(ColourLine());
- cmap[ctemp] = newCLine;
- }
- }
- // and anticolour lines
- if(newParticle->antiColourLine()) {
- ColinePtr ctemp = newParticle->antiColourLine();
- ctemp->removeAntiColoured(newParticle);
- if(cmap.find(ctemp)!=cmap.end()) {
- newALine = cmap[ctemp];
- }
- else {
- newALine = new_ptr(ColourLine());
- cmap[ctemp] = newALine;
- }
- }
- // remove colour lines from old particle
- if(aLine) {
- aLine->removeAntiColoured(cit->first->copy());
- aLine->removeAntiColoured(cit->first->progenitor());
- }
- if(cLine) {
- cLine->removeColoured(cit->first->copy());
- cLine->removeColoured(cit->first->progenitor());
- }
- // add particle to colour lines
- if(newCLine) newCLine->addColoured (newParticle);
- if(newALine) newALine->addAntiColoured(newParticle);
- // insert new particles
- cit->first->copy(newParticle);
- ShowerParticlePtr sp(new_ptr(ShowerParticle(*newParticle,1,false)));
- cit->first->progenitor(sp);
- currentTree()->incomingLines()[cit->first]=sp;
- cit->first->perturbative(!emission);
- // and the emitted particle if needed
- if(emission) {
- ShowerParticlePtr newOut = mit->second->parent()->children()[1]->branchingParticle();
- if(newOut->colourLine()) {
- ColinePtr ctemp = newOut-> colourLine();
- ctemp->removeColoured(newOut);
- assert(cmap.find(ctemp)!=cmap.end());
- cmap[ctemp]->addColoured (newOut);
- }
- if(newOut->antiColourLine()) {
- ColinePtr ctemp = newOut->antiColourLine();
- ctemp->removeAntiColoured(newOut);
- assert(cmap.find(ctemp)!=cmap.end());
- cmap[ctemp]->addAntiColoured(newOut);
- }
- ShowerParticlePtr sout=new_ptr(ShowerParticle(*newOut,1,true));
- ShowerProgenitorPtr out=new_ptr(ShowerProgenitor(cit->first->original(),newOut,sout));
- out->perturbative(false);
- currentTree()->outgoingLines().insert(make_pair(out,sout));
- }
- if(hard) {
- // sort out the value of x
- if(mit->second->beam()->momentum().z()>ZERO) {
- sp->x(newParticle->momentum(). plus()/mit->second->beam()->momentum(). plus());
- }
- else {
- sp->x(newParticle->momentum().minus()/mit->second->beam()->momentum().minus());
- }
- }
- }
- // outgoing particles
- for(map<ShowerProgenitorPtr,tShowerParticlePtr>::const_iterator
- cit=currentTree()->outgoingLines().begin();cit!=currentTree()->outgoingLines().end();++cit) {
- map<tShowerTreePtr,pair<tShowerProgenitorPtr,
- tShowerParticlePtr> >::const_iterator tit;
- for(tit = currentTree()->treelinks().begin();
- tit != currentTree()->treelinks().end();++tit) {
- if(tit->second.first && tit->second.second==cit->first->progenitor())
- break;
- }
- map<ShowerParticlePtr,tHardBranchingPtr>::const_iterator
- mit = hardTree()->particles().find(cit->first->progenitor());
- if(mit==hardTree()->particles().end()) continue;
- // put the colour lines in the map
- ShowerParticlePtr oldParticle = cit->first->progenitor();
- ShowerParticlePtr newParticle = mit->second->branchingParticle();
- ShowerParticlePtr newOut;
- ColinePtr cLine = oldParticle-> colourLine();
- ColinePtr aLine = oldParticle->antiColourLine();
- if(newParticle->colourLine() &&
- cmap.find(newParticle-> colourLine())==cmap.end())
- cmap[newParticle-> colourLine()] = cLine;
- if(newParticle->antiColourLine() &&
- cmap.find(newParticle->antiColourLine())==cmap.end())
- cmap[newParticle->antiColourLine()] = aLine;
- // check whether or not particle emits
- bool emission = !mit->second->children().empty();
- if(emission) {
- if(newParticle->colourLine()) {
- ColinePtr ctemp = newParticle-> colourLine();
- ctemp->removeColoured(newParticle);
- }
- if(newParticle->antiColourLine()) {
- ColinePtr ctemp = newParticle->antiColourLine();
- ctemp->removeAntiColoured(newParticle);
- }
- newParticle = mit->second->children()[0]->branchingParticle();
- newOut = mit->second->children()[1]->branchingParticle();
- if(newParticle->id()!=oldParticle->id()&&newParticle->id()==newOut->id())
- swap(newParticle,newOut);
- }
- // get the new colour lines
- ColinePtr newCLine,newALine;
- // sort out colour lines
- if(newParticle->colourLine()) {
- ColinePtr ctemp = newParticle-> colourLine();
- ctemp->removeColoured(newParticle);
- if(cmap.find(ctemp)!=cmap.end()) {
- newCLine = cmap[ctemp];
- }
- else {
- newCLine = new_ptr(ColourLine());
- cmap[ctemp] = newCLine;
- }
- }
- // and anticolour lines
- if(newParticle->antiColourLine()) {
- ColinePtr ctemp = newParticle->antiColourLine();
- ctemp->removeAntiColoured(newParticle);
- if(cmap.find(ctemp)!=cmap.end()) {
- newALine = cmap[ctemp];
- }
- else {
- newALine = new_ptr(ColourLine());
- cmap[ctemp] = newALine;
- }
- }
- // remove colour lines from old particle
- if(aLine) {
- aLine->removeAntiColoured(cit->first->copy());
- aLine->removeAntiColoured(cit->first->progenitor());
- }
- if(cLine) {
- cLine->removeColoured(cit->first->copy());
- cLine->removeColoured(cit->first->progenitor());
- }
- // special for unstable particles
- if(newParticle->id()==oldParticle->id() &&
- (tit!=currentTree()->treelinks().end()||!oldParticle->dataPtr()->stable())) {
- Lorentz5Momentum oldMomentum = oldParticle->momentum();
- Lorentz5Momentum newMomentum = newParticle->momentum();
- LorentzRotation boost( oldMomentum.findBoostToCM(),oldMomentum.e()/oldMomentum.mass());
- if(tit!=currentTree()->treelinks().end()) tit->first->transform(boost,false);
- oldParticle->transform(boost);
- boost = LorentzRotation(-newMomentum.findBoostToCM(),newMomentum.e()/newMomentum.mass());
- oldParticle->transform(boost);
- if(tit!=currentTree()->treelinks().end()) tit->first->transform(boost,false);
- newParticle=oldParticle;
- }
- // add particle to colour lines
- if(newCLine) newCLine->addColoured (newParticle);
- if(newALine) newALine->addAntiColoured(newParticle);
- // insert new particles
- cit->first->copy(newParticle);
- ShowerParticlePtr sp(new_ptr(ShowerParticle(*newParticle,1,true)));
- cit->first->progenitor(sp);
- currentTree()->outgoingLines()[cit->first]=sp;
- cit->first->perturbative(!emission);
- // and the emitted particle if needed
- if(emission) {
- if(newOut->colourLine()) {
- ColinePtr ctemp = newOut-> colourLine();
- ctemp->removeColoured(newOut);
- assert(cmap.find(ctemp)!=cmap.end());
- cmap[ctemp]->addColoured (newOut);
- }
- if(newOut->antiColourLine()) {
- ColinePtr ctemp = newOut->antiColourLine();
- ctemp->removeAntiColoured(newOut);
- assert(cmap.find(ctemp)!=cmap.end());
- cmap[ctemp]->addAntiColoured(newOut);
- }
- ShowerParticlePtr sout=new_ptr(ShowerParticle(*newOut,1,true));
- ShowerProgenitorPtr out=new_ptr(ShowerProgenitor(cit->first->original(),newOut,sout));
- out->perturbative(false);
- currentTree()->outgoingLines().insert(make_pair(out,sout));
- }
- // update any decay products
- if(tit!=currentTree()->treelinks().end())
- currentTree()->updateLink(tit->first,make_pair(cit->first,sp));
- }
- // reset the tree
- currentTree()->resetShowerProducts();
- // reextract the particles and set the colour partners
- vector<ShowerParticlePtr> particles =
- currentTree()->extractProgenitorParticles();
- // clear the partners
- for(unsigned int ix=0;ix<particles.size();++ix) {
- particles[ix]->partner(ShowerParticlePtr());
- particles[ix]->clearPartners();
- }
- // clear the tree
- hardTree(HardTreePtr());
- // Set the initial evolution scales
- showerModel()->partnerFinder()->
- setInitialEvolutionScales(particles,!hard,type,!_hardtree);
-}
-
-Branching Evolver::selectTimeLikeBranching(tShowerParticlePtr particle,
- ShowerInteraction::Type type,
- HardBranchingPtr branch) {
- Branching fb;
- unsigned int iout=0;
- while (true) {
- // break if doing truncated shower and no truncated shower needed
- if(branch && (!isTruncatedShowerON()||hardOnly())) break;
- fb=_splittingGenerator->chooseForwardBranching(*particle,_finalenhance,type);
- // no emission break
- if(!fb.kinematics) break;
- // special for truncated shower
- if(branch) {
- // check haven't evolved too far
- if(fb.kinematics->scale() < branch->scale()) {
- fb=Branching();
- break;
- }
- // find the truncated line
- iout=0;
- if(fb.ids[1]->id()!=fb.ids[2]->id()) {
- if(fb.ids[1]->id()==particle->id()) iout=1;
- else if (fb.ids[2]->id()==particle->id()) iout=2;
- }
- else if(fb.ids[1]->id()==particle->id()) {
- if(fb.kinematics->z()>0.5) iout=1;
- else iout=2;
- }
- // apply the vetos for the truncated shower
- // no flavour changing branchings
- if(iout==0) {
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- continue;
- }
- double zsplit = iout==1 ? fb.kinematics->z() : 1-fb.kinematics->z();
- // only if same interaction for forced branching
- ShowerInteraction::Type type2 = convertInteraction(fb.type);
- // and evolution
- if(type2==branch->sudakov()->interactionType()) {
- if(zsplit < 0.5 || // hardest line veto
- fb.kinematics->scale()*zsplit < branch->scale() ) { // angular ordering veto
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- continue;
- }
- }
- // pt veto
- if(fb.kinematics->pT() > progenitor()->maximumpT(type2)) {
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- continue;
- }
- }
- // standard vetos for all emissions
- if(timeLikeVetoed(fb,particle)) {
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- if(particle->spinInfo()) particle->spinInfo()->decayVertex(VertexPtr());
- continue;
- }
- break;
- }
- // normal case
- if(!branch) {
- if(fb.kinematics) fb.hard = false;
- return fb;
- }
- // truncated emission
- if(fb.kinematics) {
- fb.hard = false;
- fb.iout = iout;
- return fb;
- }
- // otherwise need to return the hard emission
- // construct the kinematics for the hard emission
- ShoKinPtr showerKin=
- branch->sudakov()->createFinalStateBranching(branch->scale(),
- branch->children()[0]->z(),
- branch->phi(),
- branch->children()[0]->pT());
- IdList idlist(3);
- idlist[0] = particle->dataPtr();
- idlist[1] = branch->children()[0]->branchingParticle()->dataPtr();
- idlist[2] = branch->children()[1]->branchingParticle()->dataPtr();
- fb = Branching( showerKin, idlist, branch->sudakov(),branch->type() );
- fb.hard = true;
- fb.iout=0;
- // return it
- return fb;
-}
-
-Branching Evolver::selectSpaceLikeDecayBranching(tShowerParticlePtr particle,
- const ShowerParticle::EvolutionScales & maxScales,
- Energy minmass,ShowerInteraction::Type type,
- HardBranchingPtr branch) {
- Branching fb;
- unsigned int iout=0;
- while (true) {
- // break if doing truncated shower and no truncated shower needed
- if(branch && (!isTruncatedShowerON()||hardOnly())) break;
- // select branching
- fb=_splittingGenerator->chooseDecayBranching(*particle,maxScales,minmass,
- _initialenhance,type);
- // return if no radiation
- if(!fb.kinematics) break;
- // special for truncated shower
- if(branch) {
- // check haven't evolved too far
- if(fb.kinematics->scale() < branch->scale()) {
- fb=Branching();
- break;
- }
- // find the truncated line
- iout=0;
- if(fb.ids[1]->id()!=fb.ids[2]->id()) {
- if(fb.ids[1]->id()==particle->id()) iout=1;
- else if (fb.ids[2]->id()==particle->id()) iout=2;
- }
- else if(fb.ids[1]->id()==particle->id()) {
- if(fb.kinematics->z()>0.5) iout=1;
- else iout=2;
- }
- // apply the vetos for the truncated shower
- // no flavour changing branchings
- if(iout==0) {
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- continue;
- }
- ShowerInteraction::Type type2 = convertInteraction(fb.type);
- double zsplit = iout==1 ? fb.kinematics->z() : 1-fb.kinematics->z();
- if(type2==branch->sudakov()->interactionType()) {
- if(zsplit < 0.5 || // hardest line veto
- fb.kinematics->scale()*zsplit < branch->scale() ) { // angular ordering veto
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- continue;
- }
- }
- // pt veto
- if(fb.kinematics->pT() > progenitor()->maximumpT(type2)) {
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- continue;
- }
- }
- // if not vetoed break
- if(spaceLikeDecayVetoed(fb,particle)) {
- // otherwise reset scale and continue
- particle->vetoEmission(fb.type,fb.kinematics->scale());
- continue;
- }
- break;
- }
- // normal case
- if(!branch) {
- if(fb.kinematics) fb.hard = false;
- return fb;
- }
- // truncated emission
- if(fb.kinematics) {
- fb.hard = false;
- fb.iout = iout;
- return fb;
- }
- // otherwise need to return the hard emission
- // construct the kinematics for the hard emission
- ShoKinPtr showerKin=
- branch->sudakov()->createDecayBranching(branch->scale(),
- branch->children()[0]->z(),
- branch->phi(),
- branch->children()[0]->pT());
- IdList idlist(3);
- idlist[0] = particle->dataPtr();
- idlist[1] = branch->children()[0]->branchingParticle()->dataPtr();
- idlist[2] = branch->children()[1]->branchingParticle()->dataPtr();
- // create the branching
- fb = Branching( showerKin, idlist, branch->sudakov(),ShowerPartnerType::QCDColourLine );
- fb.hard=true;
- fb.iout=0;
- // return it
- return fb;
-}
diff --git a/Shower/Base/Evolver.h b/Shower/Base/Evolver.h
deleted file mode 100644
--- a/Shower/Base/Evolver.h
+++ /dev/null
@@ -1,935 +0,0 @@
-// -*- C++ -*-
-//
-// Evolver.h is a part of Herwig - A multi-purpose Monte Carlo event generator
-// Copyright (C) 2002-2011 The Herwig Collaboration
-//
-// Herwig is licenced under version 2 of the GPL, see COPYING for details.
-// Please respect the MCnet academic guidelines, see GUIDELINES for details.
-//
-#ifndef HERWIG_Evolver_H
-#define HERWIG_Evolver_H
-//
-// This is the declaration of the Evolver class.
-//
-
-#include "ThePEG/Interface/Interfaced.h"
-#include "Herwig/Shower/SplittingFunctions/SplittingGenerator.h"
-#include "ShowerModel.h"
-#include "ThePEG/PDF/BeamParticleData.h"
-#include "ShowerTree.h"
-#include "ShowerProgenitor.fh"
-#include "Herwig/Shower/ShowerHandler.fh"
-#include "Branching.h"
-#include "ShowerVeto.h"
-#include "FullShowerVeto.h"
-#include "HardTree.h"
-#include "ThePEG/Handlers/XComb.h"
-#include "Evolver.fh"
-#include "Herwig/MatrixElement/HwMEBase.h"
-#include "Herwig/Decay/HwDecayerBase.h"
-#include "Herwig/MatrixElement/Matchbox/Matching/ShowerApproximation.h"
-#include "Herwig/Utilities/Statistic.h"
-
-namespace Herwig {
-
-using namespace ThePEG;
-
-/**\ingroup Shower
- * Exception class
- * used to communicate failure of QED shower
- */
-struct InteractionVeto {};
-
-/** \ingroup Shower
- * The Evolver class class performs the sohwer evolution of hard scattering
- * and decay processes in Herwig.
- *
- * @see \ref EvolverInterfaces "The interfaces"
- * defined for Evolver.
- */
-class Evolver: public Interfaced {
-
-/**
- * The ShowerHandler is a friend to set some parameters at initialisation
- */
-friend class ShowerHandler;
-
-public:
-
- /**
- * Pointer to an XComb object
- */
- typedef Ptr<XComb>::pointer XCPtr;
-
-public:
-
- /**
- * Default Constructor
- */
- Evolver() : _maxtry(100), _meCorrMode(1), _hardVetoMode(1),
- _hardVetoRead(0), _reconOpt(0),
- _hardVetoReadOption(false),
- _iptrms(ZERO), _beta(0.), _gamma(ZERO), _iptmax(),
- _limitEmissions(0), _initialenhance(1.), _finalenhance(1.),
- _nReWeight(100), _reWeight(false),
- interaction_(ShowerInteraction::QEDQCD), _trunc_Mode(true), _hardEmissionMode(0),
- _spinOpt(1), _softOpt(2), _hardPOWHEG(false),
- theFactorizationScaleFactor(1.0),
- theRenormalizationScaleFactor(1.0), muPt(ZERO),
- _maxTryFSR(100000),_maxFailFSR(100),_fracFSR(0.001),
- _nFSR(0), _nFailedFSR(0)
- {}
-
- /**
- * Members to perform the shower
- */
- //@{
- /**
- * Perform the shower of the hard process
- */
- virtual void showerHardProcess(ShowerTreePtr,XCPtr);
-
- /**
- * Perform the shower of a decay
- */
- virtual void showerDecay(ShowerTreePtr);
- //@}
-
- /**
- * Access to the flags and shower variables
- */
- //@{
- /**
- * Is there any showering switched on
- */
- bool showeringON() const { return isISRadiationON() || isFSRadiationON(); }
-
- /**
- * It returns true/false if the initial-state radiation is on/off.
- */
- bool isISRadiationON() const { return _splittingGenerator->isISRadiationON(); }
-
- /**
- * It returns true/false if the final-state radiation is on/off.
- */
- bool isFSRadiationON() const { return _splittingGenerator->isFSRadiationON(); }
-
- /**
- * Get the ShowerModel
- */
- ShowerModelPtr showerModel() const {return _model;}
-
- /**
- * Get the SplittingGenerator
- */
- tSplittingGeneratorPtr splittingGenerator() const { return _splittingGenerator; }
-
- /**
- * Mode for hard emissions
- */
- int hardEmissionMode() const {return _hardEmissionMode;}
-
- /**
- * Switch on or off hard vetoes
- */
- void restrictPhasespace(bool yes) {
- if ( yes )
- _hardVetoMode = 1;
- else
- _hardVetoMode = 0;
- }
-
- /**
- * Switch on or off hard veto scale from muF
- */
- void hardScaleIsMuF(bool yes) {
- if ( yes )
- _hardVetoRead = 1;
- else
- _hardVetoRead = 0;
- }
- //@}
-
- /**
- * Connect the Hard and Shower trees
- */
- virtual void connectTrees(ShowerTreePtr showerTree, HardTreePtr hardTree, bool hard );
-
- /**
- * Access to switches for spin correlations
- */
- //@{
- /**
- * Spin Correlations
- */
- unsigned int spinCorrelations() const {
- return _spinOpt;
- }
-
- /**
- * Soft correlations
- */
- unsigned int softCorrelations() const {
- return _softOpt;
- }
-
- /**
- * Any correlations
- */
- bool correlations() const {
- return _spinOpt!=0||_softOpt!=0;
- }
- //@}
-
-
- /**
- * Set the factorization scale factor
- */
- void factorizationScaleFactor(double f) {
- if ( f == theFactorizationScaleFactor )
- return;
- theFactorizationScaleFactor = f;
- splittingGenerator()->factorizationScaleFactor(f);
- }
-
- /**
- * Set the renormalization scale factor
- */
- void renormalizationScaleFactor(double f) {
- if ( f == theRenormalizationScaleFactor )
- return;
- theRenormalizationScaleFactor = f;
- splittingGenerator()->renormalizationScaleFactor(f);
- }
-
-public:
-
- /** @name Functions used by the persistent I/O system. */
- //@{
- /**
- * Function used to write out object persistently.
- * @param os the persistent output stream written to.
- */
- void persistentOutput(PersistentOStream & os) const;
-
- /**
- * Function used to read in object persistently.
- * @param is the persistent input stream read from.
- * @param version the version number of the object when written.
- */
- void persistentInput(PersistentIStream & is, int version);
- //@}
-
- /**
- * The standard Init function used to initialize the interfaces.
- * Called exactly once for each class by the class description system
- * before the main function starts or
- * when this class is dynamically loaded.
- */
- static void Init();
-
-protected:
-
- /**
- * Perform the shower
- */
- void doShowering(bool hard,XCPtr);
-
- /**
- * Generate the hard matrix element correction
- */
- virtual void hardMatrixElementCorrection(bool);
-
- /**
- * Generate the hardest emission
- */
- virtual void hardestEmission(bool hard);
-
- /**
- * Extract the particles to be showered, set the evolution scales
- * and apply the hard matrix element correction
- * @param hard Whether this is a hard process or decay
- * @return The particles to be showered
- */
- virtual vector<ShowerProgenitorPtr> setupShower(bool hard);
-
- /**
- * set the colour partners
- */
- virtual void setEvolutionPartners(bool hard,ShowerInteraction::Type,
- bool clear);
-
- /**
- * Methods to perform the evolution of an individual particle, including
- * recursive calling on the products
- */
- //@{
- /**
- * It does the forward evolution of the time-like input particle
- * (and recursively for all its radiation products).
- * accepting only emissions which conforms to the showerVariables
- * and soft matrix element correction.
- * If at least one emission has occurred then the method returns true.
- * @param particle The particle to be showered
- */
- virtual bool timeLikeShower(tShowerParticlePtr particle, ShowerInteraction::Type,
- Branching fb, bool first);
-
- /**
- * It does the backward evolution of the space-like input particle
- * (and recursively for all its time-like radiation products).
- * accepting only emissions which conforms to the showerVariables.
- * If at least one emission has occurred then the method returns true
- * @param particle The particle to be showered
- * @param beam The beam particle
- */
- virtual bool spaceLikeShower(tShowerParticlePtr particle,PPtr beam,
- ShowerInteraction::Type);
-
- /**
- * If does the forward evolution of the input on-shell particle
- * involved in a decay
- * (and recursively for all its time-like radiation products).
- * accepting only emissions which conforms to the showerVariables.
- * @param particle The particle to be showered
- * @param maxscale The maximum scale for the shower.
- * @param minimumMass The minimum mass of the final-state system
- */
- virtual bool
- spaceLikeDecayShower(tShowerParticlePtr particle,
- const ShowerParticle::EvolutionScales & maxScales,
- Energy minimumMass,ShowerInteraction::Type,
- Branching fb);
-
- /**
- * Truncated shower from a time-like particle
- */
- virtual bool truncatedTimeLikeShower(tShowerParticlePtr particle,
- HardBranchingPtr branch,
- ShowerInteraction::Type type,
- Branching fb, bool first);
-
- /**
- * Truncated shower from a space-like particle
- */
- virtual bool truncatedSpaceLikeShower(tShowerParticlePtr particle,PPtr beam,
- HardBranchingPtr branch,
- ShowerInteraction::Type type);
-
- /**
- * Truncated shower from a time-like particle
- */
- virtual bool truncatedSpaceLikeDecayShower(tShowerParticlePtr particle,
- const ShowerParticle::EvolutionScales & maxScales,
- Energy minimumMass, HardBranchingPtr branch,
- ShowerInteraction::Type type, Branching fb);
- //@}
-
- /**
- * Switches for matrix element corrections
- */
- //@{
- /**
- * Any ME correction?
- */
- bool MECOn(bool hard) const {
- return ( _hardEmissionMode == 0 ||
- (!hard && _hardEmissionMode ==-1) ) &&
- _meCorrMode > 0;
- }
-
- /**
- * Any hard ME correction?
- */
- bool hardMEC(bool hard) const {
- return ( _hardEmissionMode == 0 ||
- (!hard && _hardEmissionMode ==-1) ) &&
- (_meCorrMode == 1 || _meCorrMode == 2);
- }
-
- /**
- * Any soft ME correction?
- */
- bool softMEC() const {
- return ( _hardEmissionMode == 0 ||
- (_currenttree->isDecay() && _hardEmissionMode ==-1) ) &&
- (_meCorrMode == 1 || _meCorrMode > 2);
- }
- //@}
-
- /**
- * Is the truncated shower on?
- */
- bool isTruncatedShowerON() const {return _trunc_Mode;}
-
- /**
- * Switch for intrinsic pT
- */
- //@{
- /**
- * Any intrinsic pT?
- */
- bool ipTon() const {
- return _iptrms != ZERO || ( _beta == 1.0 && _gamma != ZERO && _iptmax !=ZERO );
- }
- //@}
-
- /**@name Additional shower vetoes */
- //@{
- /**
- * Insert a veto.
- */
- void addVeto (ShowerVetoPtr v) { _vetoes.push_back(v); }
-
- /**
- * Remove a veto.
- */
- void removeVeto (ShowerVetoPtr v) {
- vector<ShowerVetoPtr>::iterator vit = find(_vetoes.begin(),_vetoes.end(),v);
- if (vit != _vetoes.end())
- _vetoes.erase(vit);
- }
-
- //@}
-
- /**
- * Switches for vetoing hard emissions
- */
- //@{
- /**
- * Vetos on?
- */
- bool hardVetoOn() const { return _hardVetoMode > 0; }
-
- /**
- * veto hard emissions in IS shower?
- */
- bool hardVetoIS() const { return _hardVetoMode == 1 || _hardVetoMode == 2; }
-
- /**
- * veto hard emissions in FS shower?
- */
- bool hardVetoFS() const { return _hardVetoMode == 1 || _hardVetoMode > 2; }
-
- /**
- * veto hard emissions according to lastScale from XComb?
- */
- bool hardVetoXComb() const {return (_hardVetoRead == 1);}
-
- /**
- * Returns true if the hard veto read-in is to be applied to only
- * the primary collision and false otherwise.
- */
- bool hardVetoReadOption() const {return _hardVetoReadOption;}
- //@}
-
- /**
- * Enhancement factors for radiation needed to generate the soft matrix
- * element correction.
- */
- //@{
- /**
- * Access the enhancement factor for initial-state radiation
- */
- double initialStateRadiationEnhancementFactor() const { return _initialenhance; }
-
- /**
- * Access the enhancement factor for final-state radiation
- */
- double finalStateRadiationEnhancementFactor() const { return _finalenhance; }
-
- /**
- * Set the enhancement factor for initial-state radiation
- */
- void initialStateRadiationEnhancementFactor(double in) { _initialenhance=in; }
-
- /**
- * Set the enhancement factor for final-state radiation
- */
- void finalStateRadiationEnhancementFactor(double in) { _finalenhance=in; }
- //@}
-
- /**
- * Access to set/get the HardTree currently beinging showered
- */
- //@{
- /**
- * The HardTree currently being showered
- */
- tHardTreePtr hardTree() {return _hardtree;}
-
- /**
- * The HardTree currently being showered
- */
- void hardTree(tHardTreePtr in) {_hardtree = in;}
- //@}
-
- /**
- * Access/set the beam particle for the current initial-state shower
- */
- //@{
- /**
- * Get the beam particle data
- */
- Ptr<BeamParticleData>::const_pointer beamParticle() const { return _beam; }
-
- /**
- * Set the beam particle data
- */
- void setBeamParticle(Ptr<BeamParticleData>::const_pointer in) { _beam=in; }
- //@}
-
- /**
- * Set/Get the current tree being evolverd for inheriting classes
- */
- //@{
- /**
- * Get the tree
- */
- tShowerTreePtr currentTree() { return _currenttree; }
-
- /**
- * Set the tree
- */
- void currentTree(tShowerTreePtr tree) { _currenttree=tree; }
-
- //@}
-
- /**
- * Access the maximum number of attempts to generate the shower
- */
- unsigned int maximumTries() const { return _maxtry; }
-
- /**
- * Set/Get the ShowerProgenitor for the current shower
- */
- //@{
- /**
- * Access the progenitor
- */
- ShowerProgenitorPtr progenitor() { return _progenitor; }
-
- /**
- * Set the progenitor
- */
- void progenitor(ShowerProgenitorPtr in) { _progenitor=in; }
- //@}
-
- /**
- * Calculate the intrinsic \f$p_T\f$.
- */
- virtual void generateIntrinsicpT(vector<ShowerProgenitorPtr>);
-
- /**
- * Access to the intrinsic \f$p_T\f$ for inheriting classes
- */
- map<tShowerProgenitorPtr,pair<Energy,double> > & intrinsicpT() { return _intrinsic; }
-
- /**
- * find the maximally allowed pt acc to the hard process.
- */
- void setupMaximumScales(const vector<ShowerProgenitorPtr> &,XCPtr);
-
- /**
- * find the relevant hard scales for profile scales.
- */
- void setupHardScales(const vector<ShowerProgenitorPtr> &,XCPtr);
-
- /**
- * Return the relevant hard scale to be used in the profile scales
- */
- Energy hardScale() const {
- return muPt;
- }
-
- /**
- * Convert the HardTree into an extra shower emission
- */
- void convertHardTree(bool hard,ShowerInteraction::Type type);
-
-protected:
-
- /**
- * Start the shower of a timelike particle
- */
- virtual bool startTimeLikeShower(ShowerInteraction::Type);
-
- /**
- * Update of the time-like stuff
- */
- void updateHistory(tShowerParticlePtr particle);
-
- /**
- * Start the shower of a spacelike particle
- */
- virtual bool startSpaceLikeShower(PPtr,ShowerInteraction::Type);
-
- /**
- * Start the shower of a spacelike particle
- */
- virtual bool
- startSpaceLikeDecayShower(const ShowerParticle::EvolutionScales & maxScales,
- Energy minimumMass,ShowerInteraction::Type);
-
- /**
- * Select the branching for the next time-like emission
- */
- Branching selectTimeLikeBranching(tShowerParticlePtr particle,
- ShowerInteraction::Type type,
- HardBranchingPtr branch);
-
- /**
- * Select the branching for the next space-like emission in a decay
- */
- Branching selectSpaceLikeDecayBranching(tShowerParticlePtr particle,
- const ShowerParticle::EvolutionScales & maxScales,
- Energy minmass,ShowerInteraction::Type type,
- HardBranchingPtr branch);
- /**
- * Create the timelike child of a branching
- */
- ShowerParticleVector createTimeLikeChildren(tShowerParticlePtr particle,
- IdList ids);
-
- /**
- * Vetos for the timelike shower
- */
- virtual bool timeLikeVetoed(const Branching &,ShowerParticlePtr);
-
- /**
- * Vetos for the spacelike shower
- */
- virtual bool spaceLikeVetoed(const Branching &,ShowerParticlePtr);
-
- /**
- * Vetos for the spacelike shower
- */
- virtual bool spaceLikeDecayVetoed(const Branching &,ShowerParticlePtr);
-
- /**
- * Only generate the hard emission, for testing only.
- */
- bool hardOnly() const {return _limitEmissions==3;}
-
-public:
-
- /** @name MC@NLO diagnostics */
- //@{
-
- /**
- * True, if Matchbox MC@NLO S-event
- */
- bool wasMCatNLOSEvent() const { return isMCatNLOSEvent; }
-
- /**
- * True, if matchbox MC@NLO H-event
- */
- bool wasMCatNLOHEvent() const { return isMCatNLOHEvent; }
-
- //@}
-
-protected:
-
- /** @name Clone Methods. */
- //@{
- /**
- * Make a simple clone of this object.
- * @return a pointer to the new object.
- */
- virtual IBPtr clone() const;
-
- /** Make a clone of this object, possibly modifying the cloned object
- * to make it sane.
- * @return a pointer to the new object.
- */
- virtual IBPtr fullclone() const;
- //@}
-
-protected:
-
- /** @name Standard Interfaced functions. */
- //@{
- /**
- * Initialize this object after the setup phase before saving an
- * EventGenerator to disk.
- * @throws InitException if object could not be initialized properly.
- */
- virtual void doinit();
- //@}
-
-private:
-
- /**
- * The assignment operator is private and must never be called.
- * In fact, it should not even be implemented.
- */
- Evolver & operator=(const Evolver &);
-
-private:
-
- /**
- * Pointer to the model for the shower evolution model
- */
- ShowerModelPtr _model;
-
- /**
- * Pointer to the splitting generator
- */
- SplittingGeneratorPtr _splittingGenerator;
-
- /**
- * Maximum number of tries to generate the shower of a particular tree
- */
- unsigned int _maxtry;
-
- /**
- * Matrix element correction switch
- */
- unsigned int _meCorrMode;
-
- /**
- * Hard emission veto switch
- */
- unsigned int _hardVetoMode;
-
- /**
- * Hard veto to be read switch
- */
- unsigned int _hardVetoRead;
-
- /**
- * Control of the reconstruction option
- */
- unsigned int _reconOpt;
-
- /**
- * If hard veto pT scale is being read-in this determines
- * whether the read-in value is applied to primary and
- * secondary (MPI) scatters or just the primary one, with
- * the usual computation of the veto being performed for
- * the secondary (MPI) scatters.
- */
- bool _hardVetoReadOption;
-
- /**
- * rms intrinsic pT of Gaussian distribution
- */
- Energy _iptrms;
-
- /**
- * Proportion of inverse quadratic intrinsic pT distribution
- */
- double _beta;
-
- /**
- * Parameter for inverse quadratic: 2*Beta*Gamma/(sqr(Gamma)+sqr(intrinsicpT))
- */
- Energy _gamma;
-
- /**
- * Upper bound on intrinsic pT for inverse quadratic
- */
- Energy _iptmax;
-
- /**
- * Limit the number of emissions for testing
- */
- unsigned int _limitEmissions;
-
- /**
- * The progenitor of the current shower
- */
- ShowerProgenitorPtr _progenitor;
-
- /**
- * Matrix element
- */
- HwMEBasePtr _hardme;
-
- /**
- * Decayer
- */
- HwDecayerBasePtr _decayme;
-
- /**
- * The ShowerTree currently being showered
- */
- ShowerTreePtr _currenttree;
-
- /**
- * The HardTree currently being showered
- */
- HardTreePtr _hardtree;
-
- /**
- * Radiation enhancement factors for use with the veto algorithm
- * if needed by the soft matrix element correction
- */
- //@{
- /**
- * Enhancement factor for initial-state radiation
- */
- double _initialenhance;
-
- /**
- * Enhancement factor for final-state radiation
- */
- double _finalenhance;
- //@}
-
- /**
- * The beam particle data for the current initial-state shower
- */
- Ptr<BeamParticleData>::const_pointer _beam;
-
- /**
- * Storage of the intrinsic \f$p_t\f$ of the particles
- */
- map<tShowerProgenitorPtr,pair<Energy,double> > _intrinsic;
-
- /**
- * Vetoes
- */
- vector<ShowerVetoPtr> _vetoes;
-
- /**
- * Full Shower Vetoes
- */
- vector<FullShowerVetoPtr> _fullShowerVetoes;
-
- /**
- * Number of iterations for reweighting
- */
- unsigned int _nReWeight;
-
- /**
- * Whether or not we are reweighting
- */
- bool _reWeight;
-
- /**
- * number of IS emissions
- */
- unsigned int _nis;
-
- /**
- * Number of FS emissions
- */
- unsigned int _nfs;
-
- /**
- * The option for wqhich interactions to use
- */
- ShowerInteraction::Type interaction_;
-
- /**
- * Truncated shower switch
- */
- bool _trunc_Mode;
-
- /**
- * Count of the number of truncated emissions
- */
- unsigned int _truncEmissions;
-
- /**
- * Mode for the hard emissions
- */
- int _hardEmissionMode;
-
- /**
- * Option to include spin correlations
- */
- unsigned int _spinOpt;
-
- /**
- * Option for the kernal for soft correlations
- */
- unsigned int _softOpt;
-
- /**
- * Option for hard radiation in POWHEG events
- */
- bool _hardPOWHEG;
-
- /**
- * True, if Matchbox MC@NLO S-event
- */
- bool isMCatNLOSEvent;
-
- /**
- * True, if matchbox MC@NLO H-event
- */
- bool isMCatNLOHEvent;
-
- /**
- * True, if Matchbox Powheg S-event
- */
- bool isPowhegSEvent;
-
- /**
- * True, if matchbox Powheg H-event
- */
- bool isPowhegHEvent;
-
- /**
- * The shower approximation to provide the hard scale profile
- */
- Ptr<ShowerApproximation>::tptr theShowerApproximation;
-
- /**
- * The factorization scale factor.
- */
- double theFactorizationScaleFactor;
-
- /**
- * The renormalization scale factor.
- */
- double theRenormalizationScaleFactor;
-
- /**
- * True if no warnings about incorrect hard emission
- * mode setting have been issued yet
- */
- static bool _hardEmissionModeWarn;
-
- /**
- * True if no warnings about missing truncated shower
- * have been issued yet
- */
- static bool _missingTruncWarn;
-
- /**
- * The relevant hard scale to be used in the profile scales
- */
- Energy muPt;
-
- /**
- * Maximum number of emission attempts for FSR
- */
- unsigned int _maxTryFSR;
-
- /**
- * Maximum number of failures for FSR generation
- */
- unsigned int _maxFailFSR;
-
- /**
- * Failure fraction for FSR generation
- */
- double _fracFSR;
-
- /**
- * Counter for number of FSR emissions
- */
- unsigned int _nFSR;
-
- /**
- * Counter for the number of failed events due to FSR emissions
- */
- unsigned int _nFailedFSR;
-};
-
-}
-
-#endif /* HERWIG_Evolver_H */
diff --git a/Shower/QTilde/Base/Evolver.fh b/Shower/QTilde/Base/Evolver.fh
deleted file mode 100644
--- a/Shower/QTilde/Base/Evolver.fh
+++ /dev/null
@@ -1,22 +0,0 @@
-// -*- C++ -*-
-//
-// This is the forward declaration of the Evolver class.
-//
-#ifndef HERWIG_Evolver_FH
-#define HERWIG_Evolver_FH
-
-#include "ThePEG/Config/Pointers.h"
-
-namespace Herwig {
-
-class Evolver;
-
-}
-
-namespace ThePEG {
-
-ThePEG_DECLARE_POINTERS(Herwig::Evolver,EvolverPtr);
-
-}
-
-#endif
diff --git a/Shower/QTilde/Base/PartnerFinder.h b/Shower/QTilde/Base/PartnerFinder.h
--- a/Shower/QTilde/Base/PartnerFinder.h
+++ b/Shower/QTilde/Base/PartnerFinder.h
@@ -1,235 +1,234 @@
// -*- C++ -*-
//
// PartnerFinder.h is a part of Herwig - A multi-purpose Monte Carlo event generator
// Copyright (C) 2002-2011 The Herwig Collaboration
//
// Herwig is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
#ifndef HERWIG_PartnerFinder_H
#define HERWIG_PartnerFinder_H
//
// This is the declaration of the PartnerFinder class.
//
#include "Herwig/Shower/QTilde/ShowerConfig.h"
#include "ThePEG/Interface/Interfaced.h"
-#include "Evolver.fh"
#include "PartnerFinder.fh"
namespace Herwig {
using namespace ThePEG;
/**
* typedef of a pair of particle for calculating the evolution scales
*/
typedef pair<tShowerParticlePtr,tShowerParticlePtr> ShowerPPair;
/** \ingroup Shower
*
* This class is responsible of two related tasks:
* - it finds the partners
* - for each pair of partners (and interaction therefore)
* it sets the initial evolution scales of both of them.
*
* In general the finding of the partners is performed by this class but
* the calculation of the initial evolution scales should be implemented
* for different shower evolution models in classes inheriting from this one.
* Notice that a given particle has, in general, a different partner
* for each different interaction; however, given a partner, its
* initial evolution scale, Q, is purely a kinematical relationship
* between the pair, without dependence on the dynamics (i.e. type of interaction).
*
* @see \ref PartnerFinderInterfaces "The interfaces"
* defined for PartnerFinder.
*/
class PartnerFinder: public Interfaced {
public:
/**
* The default constructor.
*/
PartnerFinder() : partnerMethod_(0), QEDPartner_(0), scaleChoice_(0) {}
/**
* Given in input a collection of particles (ShowerParticle objects),
* each of these methods set the initial evolution scales of those particles,
* between the ones given in input, that do not have yet their
* evolution scale set.
* The input collection of particles can be either the full collection of
* showering particles (kept in the main class ShowerHandler,
* in the case isDecayCase is false, or simply, in the case isDecayCase
* is true, the decaying particle and its decay products.
* The methods returns true, unless something wrong (inconsistencies,
* or undefined values) happens.
*
* These methods are virtual but in most cases inheriting classes should not
* need to overide them as they simply find the relevant partner and call
* one of the calculateScale members to calculate the scale.
*/
//@{
/**
* Set the initial scales
* @param particles The particles to be considered
* @param isDecayCase Whether or not this is a decay
* @param setPartners Whether to set the colour partners or just the scales
*/
virtual void setInitialEvolutionScales(const ShowerParticleVector &particles,
const bool isDecayCase,
ShowerInteraction::Type,
const bool setPartners=true);
//@}
public:
/** @name Functions used by the persistent I/O system. */
//@{
/**
* Function used to write out object persistently.
* @param os the persistent output stream written to.
*/
void persistentOutput(PersistentOStream & os) const;
/**
* Function used to read in object persistently.
* @param is the persistent input stream read from.
* @param version the version number of the object when written.
*/
void persistentInput(PersistentIStream & is, int version);
//@}
/**
* The standard Init function used to initialize the interfaces.
* Called exactly once for each class by the class description system
* before the main function starts or
* when this class is dynamically loaded.
*/
static void Init();
protected:
/**
* Members to set the scales for different interactions
*/
//@{
/**
* Set initial scales for a QCD interaction
*/
virtual void setInitialQCDEvolutionScales(const ShowerParticleVector &particles,
const bool isDecayCase,
const bool setPartners=true);
/**
* Set initial scales for a QED interaction
*/
virtual void setInitialQEDEvolutionScales(const ShowerParticleVector &particles,
const bool isDecayCase,
const bool setPartners=true);
/**
* Set initial scales for a EW interaction
*/
virtual void setInitialEWEvolutionScales(const ShowerParticleVector &particles,
const bool isDecayCase,
const bool setPartners=true);
//@}
/**
* Find the QCD partners
* @param particle The particle to find the partners for
* @param particles The full set of particles to search
*/
vector< pair<ShowerPartnerType::Type, tShowerParticlePtr> >
findQCDPartners(tShowerParticlePtr particle, const ShowerParticleVector &particles);
/**
* Find the QED partners
* @param particle The particle to find the partners for
* @param particles The full set of particles to search
*/
vector< pair<double, tShowerParticlePtr> >
findQEDPartners(tShowerParticlePtr particle, const ShowerParticleVector &particles,
const bool isDecayCase);
/**
* Find the EW partners
* @param particle The particle to find the partners for
* @param particles The full set of particles to search
*/
vector< pair<double, tShowerParticlePtr> >
findEWPartners(tShowerParticlePtr particle, const ShowerParticleVector &particles,
const bool isDecayCase);
/**
* Given a pair of particles, supposedly partners w.r.t. an interaction,
* this method returns their initial evolution scales as a pair.
* If something wrong happens, it returns the null (ZERO,ZERO) pair.
* This method is used by the above setXXXInitialEvolutionScales
* methods.
* These methods must be overiden in inheriting classes
*/
//@{
/**
* General method to calculate the initial evolution scales
*/
virtual pair<Energy,Energy> calculateInitialEvolutionScales(const ShowerPPair &,
const bool isDecayCase);
/**
* Calculate the initial evolution scales for two final-state particles
*/
virtual pair<Energy,Energy> calculateFinalFinalScales(const ShowerPPair &)=0;
/**
* Calculate the initial evolution scales for two initial-state particles
*/
virtual pair<Energy,Energy> calculateInitialInitialScales(const ShowerPPair &)=0;
/**
* Calculate the initial evolution scales for one initial
* and one final-state particles
*/
virtual pair<Energy,Energy> calculateInitialFinalScales(const ShowerPPair &,
const bool isDecayCase)=0;
//@}
protected:
/**
* Find weakling interacting particles
*/
bool weaklyInteracting(tcPDPtr pd) {
long id = abs(pd->id());
return ( id==ParticleID::Wplus || id ==ParticleID::Z0 || (id>=1 && id<=6 ) || (id>=11 && id<=16));
}
private:
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
PartnerFinder & operator=(const PartnerFinder &);
private:
/**
* Method for choosing colour partner
*/
int partnerMethod_;
/**
* Choice for the QED radiation partner
*/
int QEDPartner_;
/**
* Choice of the scale
*/
int scaleChoice_;
};
}
#endif /* HERWIG_PartnerFinder_H */
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 6:33 PM (1 d, 20 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805612
Default Alt Text
(153 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment