herwig is hosted by Hepforge, IPPP Durham
Herwig 7.3.0
ClusterFissioner.h
1// -*- C++ -*-
2//
3// ClusterFissioner.h is a part of Herwig - A multi-purpose Monte Carlo event generator
4// Copyright (C) 2002-2019 The Herwig Collaboration
5//
6// Herwig is licenced under version 3 of the GPL, see COPYING for details.
7// Please respect the MCnet academic guidelines, see GUIDELINES for details.
8//
9#ifndef HERWIG_ClusterFissioner_H
10#define HERWIG_ClusterFissioner_H
11
12#include <ThePEG/Interface/Interfaced.h>
13#include "CluHadConfig.h"
14#include "HadronSelector.h"
15#include "ClusterFissioner.fh"
16#include "CheckId.h"
17
18namespace Herwig {
19using namespace ThePEG;
20
21 //class Cluster; // forward declaration
22
73
74public:
75
82
84
102 tPVector fission(ClusterVector & clusters, bool softUEisOn);
103
104public:
105
113
119 void persistentInput(PersistentIStream & is, int version);
121
125 static void Init();
126
127protected:
128
135 virtual IBPtr clone() const;
136
141 virtual IBPtr fullclone() const;
143
144private:
145
150
170 void cut(stack<ClusterPtr> &,
171 ClusterVector&, tPVector & finalhadrons, bool softUEisOn);
172
173public:
174
178 typedef pair<PPtr,PPtr> PPair;
179
183 typedef pair<PPair,PPair> cutType;
184
201 virtual cutType cutTwo(ClusterPtr &, tPVector & finalhadrons, bool softUEisOn);
202
206 virtual cutType cutThree(ClusterPtr &, tPVector & finalhadrons, bool softUEisOn);
208public:
209
216 PPair produceHadron(tcPDPtr hadron, tPPtr newPtr, const Lorentz5Momentum &a,
217 const LorentzPoint &b) const;
218
219protected:
220
224 Energy2 clustermass(const ClusterPtr & cluster) const;
225
230 virtual void drawNewFlavour(PPtr& newPtr1, PPtr& newPtr2, const ClusterPtr & cluster) const {
231 if (_enhanceSProb == 0){
232 drawNewFlavour(newPtr1,newPtr2);
233 }
234 else {
235 drawNewFlavourEnhanced(newPtr1,newPtr2,clustermass(cluster));
236 }
237 }
238
244 virtual pair<Energy,Energy> drawNewMasses(Energy Mc, bool soft1, bool soft2,
245 Lorentz5Momentum& pClu1, Lorentz5Momentum& pClu2,
246 tPPtr ptrQ1, Lorentz5Momentum& pQ1,
247 tPPtr, Lorentz5Momentum& pQone,
248 tPPtr, Lorentz5Momentum& pQtwo,
249 tPPtr ptrQ2, Lorentz5Momentum& pQ2) const {
250
251 pair<Energy,Energy> result;
252
253 double exp1=_pSplitLight;
254 double exp2=_pSplitLight;
255
256 if (CheckId::isExotic(ptrQ1->dataPtr())) exp1 = _pSplitExotic;
257 else if(CheckId::hasBottom(ptrQ1->dataPtr()))exp1 = _pSplitBottom;
258 else if(CheckId::hasCharm(ptrQ1->dataPtr())) exp1 = _pSplitCharm;
259
260 if (CheckId::isExotic(ptrQ2->dataPtr())) exp2 = _pSplitExotic;
261 else if(CheckId::hasBottom(ptrQ2->dataPtr())) exp2 = _pSplitBottom;
262 else if(CheckId::hasCharm(ptrQ2->dataPtr())) exp2 = _pSplitCharm;
263
264 result.first = drawChildMass(Mc,pQ1.mass(),pQ2.mass(),pQone.mass(),exp1,soft1);
265 result.second = drawChildMass(Mc,pQ2.mass(),pQ1.mass(),pQtwo.mass(),exp2,soft2);
266
267 pClu1.setMass(result.first);
268 pClu2.setMass(result.second);
269
270 return result;
271
272 }
273
278 virtual void calculateKinematics(const Lorentz5Momentum &pClu,
279 const Lorentz5Momentum &p0Q1,
280 const bool toHadron1, const bool toHadron2,
281 Lorentz5Momentum &pClu1, Lorentz5Momentum &pClu2,
282 Lorentz5Momentum &pQ1, Lorentz5Momentum &pQb,
283 Lorentz5Momentum &pQ2, Lorentz5Momentum &pQ2b) const;
284
285protected:
286
295 PPair produceCluster(tPPtr ptrQ, tPPtr newPtr, const Lorentz5Momentum &a,
296 const LorentzPoint &b, const Lorentz5Momentum &c,
297 const Lorentz5Momentum &d, const bool rem,
298 tPPtr spect=tPPtr(), bool remSpect=false) const;
299
305 void drawNewFlavour(PPtr& newPtrPos, PPtr& newPtrNeg) const;
306
313 void drawNewFlavourEnhanced(PPtr& newPtrPos,PPtr& newPtrNeg, Energy2 mass2) const;
314
315
342 Energy drawChildMass(const Energy M, const Energy m1, const Energy m2,
343 const Energy m, const double exp, const bool soft) const;
344
352 void calculatePositions(const Lorentz5Momentum &pClu,
353 const LorentzPoint & positionClu,
354 const Lorentz5Momentum & pClu1,
355 const Lorentz5Momentum & pClu2,
356 LorentzPoint & positionClu1,
357 LorentzPoint & positionClu2 ) const;
358
359protected:
360
366 HadronSelectorPtr hadronSelector() const {return _hadronSelector;}
367
371 Energy btClM() const {return _btClM;}
372
376 double pSplitLight() const {return _pSplitLight;}
377
381 double pSplitBottom() const {return _pSplitBottom;}
382
386 double pSplitCharm() const {return _pSplitCharm;}
387
391 double pSplitExotic() const {return _pSplitExotic;}
393
394private:
395
401 bool ProbablityFunction(double scale, double threshold);
402
406 bool isHeavy(tcClusterPtr );
407
411 HadronSelectorPtr _hadronSelector;
412
418 Energy _clMaxLight;
419 Energy _clMaxBottom;
420 Energy _clMaxCharm;
421 Energy _clMaxExotic;
423
427 double _clPowLight;
428 double _clPowBottom;
429 double _clPowCharm;
430 double _clPowExotic;
432
436 double _pSplitLight;
437 double _pSplitBottom;
438 double _pSplitCharm;
439 double _pSplitExotic;
440
441
442 // weights for alternaive cluster fission
443 double _fissionPwtUquark;
444 double _fissionPwtDquark;
445 double _fissionPwtSquark;
446
451
456
458
462 Energy _btClM;
463
468
472 Tension _kappa;
473
479
484
490
495 const double _maxScale = 20.;
496
501
506
511
512};
513
514}
515
516#endif /* HERWIG_ClusterFissioner_H */
This class handles clusters which are too heavy.
double pSplitLight() const
Cluster splitting paramater for light quarks.
HadronSelectorPtr _hadronSelector
A pointer to a Herwig::HadronSelector object for generating hadrons.
pair< PPair, PPair > cutType
Definition for use in the cut function.
virtual cutType cutTwo(ClusterPtr &, tPVector &finalhadrons, bool softUEisOn)
Splits the input cluster.
double pSplitCharm() const
Cluster splitting paramater for charm quarks.
int _massMeasure
Flag that switches between mass measures used in strangeness enhancement: cluster mass,...
int _iopRem
Flag used to determine what distributions to use for the cluster masses.
void persistentInput(PersistentIStream &is, int version)
Function used to read in object persistently.
void cut(stack< ClusterPtr > &, ClusterVector &, tPVector &finalhadrons, bool softUEisOn)
This method directs the splitting of the heavy clusters.
int _fissionCluster
Flag used to determine between normal cluster fission and alternative cluster fission.
Energy2 _kinThresholdShift
Shifts from the kinetic threshold in ClausterFissioner.
static void Init()
Standard Init function used to initialize the interfaces.
double _probPowFactor
Power factor in ClausterFissioner bell probablity function.
Energy2 clustermass(const ClusterPtr &cluster) const
Function that returns either the cluster mass or the lambda measure.
virtual pair< Energy, Energy > drawNewMasses(Energy Mc, bool soft1, bool soft2, Lorentz5Momentum &pClu1, Lorentz5Momentum &pClu2, tPPtr ptrQ1, Lorentz5Momentum &pQ1, tPPtr, Lorentz5Momentum &pQone, tPPtr, Lorentz5Momentum &pQtwo, tPPtr ptrQ2, Lorentz5Momentum &pQ2) const
Calculate the masses and possibly kinematics of the cluster fission at hand; if claculateKineamtics i...
double _probShift
Shifts from the center in ClausterFissioner bell probablity function.
virtual void calculateKinematics(const Lorentz5Momentum &pClu, const Lorentz5Momentum &p0Q1, const bool toHadron1, const bool toHadron2, Lorentz5Momentum &pClu1, Lorentz5Momentum &pClu2, Lorentz5Momentum &pQ1, Lorentz5Momentum &pQb, Lorentz5Momentum &pQ2, Lorentz5Momentum &pQ2b) const
Calculate the final kinematics of a heavy cluster decay C->C1 + C2, if not already performed by drawN...
PPair produceHadron(tcPDPtr hadron, tPPtr newPtr, const Lorentz5Momentum &a, const LorentzPoint &b) const
Produces a hadron and returns the flavour drawn from the vacuum.
void persistentOutput(PersistentOStream &os) const
Function used to write out object persistently.
HadronSelectorPtr hadronSelector() const
Access to the hadron selector.
ClusterFissioner & operator=(const ClusterFissioner &)=delete
Private and non-existent assignment operator.
int _kinematicThresholdChoice
Flag to choose static or dynamic kinematic thresholds in cluster splittings.
int _enhanceSProb
Flag that switches between no strangeness enhancement, scaling enhancement, and exponential enhanceme...
ClusterFissioner()
Default constructor.
Energy drawChildMass(const Energy M, const Energy m1, const Energy m2, const Energy m, const double exp, const bool soft) const
Produces the mass of a child cluster.
virtual void drawNewFlavour(PPtr &newPtr1, PPtr &newPtr2, const ClusterPtr &cluster) const
Draw a new flavour for the given cluster; currently defaults to the default model.
void calculatePositions(const Lorentz5Momentum &pClu, const LorentzPoint &positionClu, const Lorentz5Momentum &pClu1, const Lorentz5Momentum &pClu2, LorentzPoint &positionClu1, LorentzPoint &positionClu2) const
Determine the positions of the two children clusters.
virtual IBPtr clone() const
Make a simple clone of this object.
tPVector fission(ClusterVector &clusters, bool softUEisOn)
Splits the clusters which are too heavy.
double pSplitExotic() const
Cluster splitting paramater for exotic particles.
Energy _m0Fission
Parameter that governs the strangeness enhancement scaling.
Energy _btClM
Parameter used (2/b) for the beam cluster mass generation.
Energy btClM() const
Access to soft-cluster parameter.
Tension _kappa
The string constant.
pair< PPtr, PPtr > PPair
Definition for easy passing of two particles.
void drawNewFlavour(PPtr &newPtrPos, PPtr &newPtrNeg) const
Returns the new quark-antiquark pair needed for fission of a heavy cluster.
double pSplitBottom() const
Cluster splitting paramater for bottom quarks.
bool ProbablityFunction(double scale, double threshold)
Smooth probability for dynamic threshold cuts: @scale the current scale, e.g.
void drawNewFlavourEnhanced(PPtr &newPtrPos, PPtr &newPtrNeg, Energy2 mass2) const
Returns the new quark-antiquark pair needed for fission of a heavy cluster.
bool isHeavy(tcClusterPtr)
Check if a cluster is heavy enough to split again.
PPair produceCluster(tPPtr ptrQ, tPPtr newPtr, const Lorentz5Momentum &a, const LorentzPoint &b, const Lorentz5Momentum &c, const Lorentz5Momentum &d, const bool rem, tPPtr spect=tPPtr(), bool remSpect=false) const
Produces a cluster from the flavours passed in.
virtual IBPtr fullclone() const
Make a clone of this object, possibly modifying the cloned object to make it sane.
virtual cutType cutThree(ClusterPtr &, tPVector &finalhadrons, bool softUEisOn)
Split three-component cluster.
const double _maxScale
Constant variable which stops the scale from being to large, and not worth calculating.
vector< ClusterPtr > ClusterVector
This file contains the typedef declarations used in Hadronization.
Definition: CluHadConfig.h:38
bool isExotic(tcPDPtr par1, tcPDPtr par2=PDPtr(), tcPDPtr par3=PDPtr())
Return true, if any of the possible input particle pointer is an exotic quark, e.g.
bool hasCharm(tcPDPtr par1, tcPDPtr par2=PDPtr(), tcPDPtr par3=PDPtr())
Return true if any of the possible three input particles has c-flavour; false otherwise....
bool hasBottom(tcPDPtr par1, tcPDPtr par2=PDPtr(), tcPDPtr par3=PDPtr())
Return true if any of the possible three input particles has b-flavour; false otherwise.
-*- C++ -*-
ThePEG::Ptr< Particle >::transient_pointer tPPtr
ThePEG::Ptr< InterfacedBase >::pointer IBPtr
vector< tPPtr > tPVector
ThePEG::Ptr< Particle >::pointer PPtr
ThePEG::Ptr< ParticleData >::transient_const_pointer tcPDPtr