Hadronic Rescattering
This page describes a model for hadronic rescattering. (Not to
be confused with partonic rescattering, an optional part of the
Multiparton Interactions
framework.) Specifically, it is assumed that the hadrons produced
can scatter against each other on the way out, before the fragmenting
system has had time to expand enough that the hadrons get free. This
is happening in parallel with rapid decays, i.e. mainly strong such.
A prerequisite is that the space-time production vertices of hadrons
from string fragmentation are known. This was implemented in
[Fer18], and is described separately on the
Hadron Vertex Information
page. A smaller further smearing is obtained from the
Parton Vertex Information
transverse displacement of separate MPI vertices.
The main on/off switch for rescattering is
HadronLevel:Rescatter
, which by the default is off, since
rescattering slows down the generation of events considerably, and since
there are no detailed tunes with rescattering as of yet. The model
requires space-time information on hadron production vertices to be set, as
obtained with Fragmentation:setVertices = on
and optionally also
PartonVertex:setVertex = on
.
In some studies not all events are of interest, for example if studying
jet production and no jets with sufficently high pT are produced.
In those cases, it is possible to save a significant amount of time by
vetoing the event before rescattering has take place, by overriding the
canVetoAfterHadronization
and
doVetoAfterHadronization
methods of the
UserHooks class.
Technically, the processes here are the same as used in the
Low-energy QCD Processes
framework, i.e. it is the same partial cross sections and the same
hadronization setup that is used in both cases. The two play different
functions, however, either representing the primary collision as there
or secondary rescattering collisions as here.
An important part of rescattering is resonance formation. Resonance hadrons
are labelled as such by setting varWidth = on
. Such particles
can then form as resonances through all of their two-body hadronic decay
channels. Newly added particles with varWidth = on
will
automatically be detected upon initialization. As a practical example,
a version of this framework was used to calculate the production of
prompt tetraquark and pentaquark production at the LHC, assuming a
molecular state model. See [Ilt21] for details.
The implementation is rather sophisticated for rescattering at low
energies, where the vast majority of interactions occur. It is less
appropriate at higher energies, where the lack of MPIs leads to too
few hadrons being produced. The rescattering rate becomes vanishingly
small before that is a problem, however. What this simplification buys
is the capability to switch between different colliding hadron
combinations without any need for a reinitialization.
Currently there are only a few options available:
mode
Rescattering:impactModel
(default = 1
; minimum = 0
; maximum = 1
)
Impact-parameter shape of the opacity, i.e. rescattering
probability, with a width determined such that the current
rescattering cross section is reproduced, given the maximal
opacity below.
option
0 : Solid disk with constant opacity out to a sharp edge.
option
1 : Gaussian fall-off of the opacity.
parm
Rescattering:opacity
(default = 0.9
; minimum = 0.
; maximum = 1.
)
Gives the probability of scattering at impact parameter 0.
parm
Rescattering:bMax
(default = 5.
; minimum = 0.
; maximum = 100.
)
Maximum allowed impact parameter for a rescattering to occur,
expressed in units of fm. This cuts off the tail of a Gaussian
impact-parameter profile, and more generally puts a (generous)
limit on how large a cross section can become.
parm
Rescattering:tau0RapidDecay
(default = 100.
; minimum = 10.
)
For hadrons with a nominal invariant lifetime below this value,
expressed in fm, their decays are considered in the same time-ordered
sequence as rescatterings, while the rest of the decays are considered
separately after the rescatterings. Note that the actual lifetime is
drawn from an exponential distribution, with the nominal lifetime
giving the average value.
flag
Rescattering:scatterManyTimes
(default = on
)
When on, particles that have rescattered can scatter again.
flag
Rescattering:quickCheck
(default = on
)
When on, a quick check is made that a pair of hadrons that is moving
away from each other cannot rescatter. This is done in the CM frame
of the event, not in that of the pair itself as done later. It therefore
rejects a small fraction (order 10%) of rescatterings that would have
been acceptable when viewed in the pair rest frame, but with a
significant gain in event generation time.
flag
Rescattering:nearestNeighbours
(default = on
)
Allow or not hadrons that have been produced as nearest neighbours
on a string to rescatter against each other. There is no matter of
principle to forbid it, but such effects implicitly are already
included in current tunes without rescattering, so to include it
will require a larger retuning effort than not to. If off also
forbid hadrons that already scattered (primarily elastically)
to immediately scatter against each other again.
flag
Rescattering:delayRegeneration
(default = on
)
If on then forbid a scattered hadron from scattering again within
a given regeneration time, while if off a hadron can scatter
immediately afterwards. This applies to hadrons that emerge directly
from the scattering, i.e. mainly in elastic and excitation. It is
also relevant for the undiffracted hadron in single diffraction.
Hadrons produced via string fragmentation automatically get a time
delay by that. The size of the delay is given by the next parameter.
parm
Rescattering:tauRegeneration
(default = 1.
; minimum = 0.
; maximum = 2.
)
When a hadron should be assigned a regeneration invariant time this is
done according to an exponential with average value given by this
parameter, expressed in units of fm.
mode
Rescattering:boostDir
(default = 0
; minimum = 0
; maximum = 3
)
Direction of boost below, 0 off, 1 - 3 give x, y and z respectively.
parm
Rescattering:boost
(default = 0.
)
Boosts the event before rescattering, by this many units of rapidity.
For testing purposes.
flag
Rescattering:useVelocityFrame
(default = off
)
Use center of velocity instead of center of momentum to determine rescattering
origin.
flag
Rescattering:inelastic
(default = on
)
If turned off, all rescatterings will be treated as elastic. Used primarily
for model tests.
Nucleon excitations
In rescattering, nucleon-nucleon interactions can produce resonance particles.
This is implemented as N N → N X or N N → Delta X,
where N is a nucleon (p or n), Delta
refers to a Delta(1232) particle, and X is a nucleon
excitation such as p(1520)+ or Delta(1600)+. For the sake of
efficiency, the relevant cross sections are parameterized ahead of time. This
is handled by the NucleonExcitations
class.
For all excitation processes, the cross section is independent of the isospin
of the involved particles. This means that the calculations can be
simplified by using "id masks" of the various particles. We define
the mask of a particle as its id code with the quark content removed.
For example, the p(1520)+ particle (id = 102214
)
has mask 100004, which is the same for n(1520)0.
The following methods of the NucleonExcitations
class are
available.
bool NucleonExcitations::check()
run a check to validate the loaded cross section data. Returns whether
successful.
vector<int> NucleonExcitations::getExcitationMasks()
search the particle database and returns a list of id masks for all
implemented nucleon excitations. A particle is defined as a potential
nucleon excitation if its quark content is uud (except for
p+).
vector<pair<int, int>> NucleonExcitations::getChannels()
returns a list of all parameterized excitation channels. Each returned
pair
contains the masks of the two outgoing
particles. For each excitation X (as defined by
getExcitationMasks
), there are two possible excitation
channels, N N → N X and N N → Delta
X. Note that the masks for N and Delta are
0002
and 0004
, respectively.
double NucleonExcitations::sigmaExTotal(double eCM)
returns the total excitation cross section for two nucleons colliding at the
specified CM energy, using parameterized values.
double NucleonExcitations::sigmaExPartial(double eCM, int maskC, int maskD)
returns the cross section for the process N N → C D at the
specified CM energy, using parameterized values.
bool NucleonExcitations::pickExcitation(int idA, int idB, double eCM, int& idCOut, double& mCOut, int& idDOut, double& mDOut)
pick an excitation channel for the incoming particles with the specified
CM energy, using parameterized cross sections. If successful, the outgoing
particle ids are written to idAOut
and idBOut
,
and their corresponding masses are written to mAOut
and
mBOut
. Returns whether successful.
double NucleonExcitations::sigmaCalc(double eCM)
double sigmaCalc(double eCM, int maskC, int maskD)
calculate the total excitation cross section or the partial cross section
for the process N N → C D, without using the parameterized
cross sections.
bool NucleonExcitations::parameterizeAll(int precision, double threshold = 8.)
clear all parameterized cross sections and recalculatesthem for all possible
excitation channels, using excitations found with
getExcitationMasks
.
bool NucleonExcitations::save(ostream& stream)
bool NucleonExcitations::save(string file = "HadronWidths.dat")
write all parameterized cross sections in an xml format to the
specified stream or file.