Version: SMASH-3.4
input_keys.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2022-2026
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #ifndef SRC_INCLUDE_SMASH_INPUT_KEYS_H_
11 #define SRC_INCLUDE_SMASH_INPUT_KEYS_H_
12 
13 #include <array>
14 #include <filesystem>
15 #include <functional>
16 #include <map>
17 #include <set>
18 #include <string>
19 #include <utility>
20 #include <variant>
21 #include <vector>
22 
23 #include "einhard.hpp"
24 
25 #include "constants.h"
26 #include "forwarddeclarations.h"
27 #include "key.h"
28 #include "pdgcode.h"
29 
30 namespace smash {
31 
32 /**
33  * A namespace to keep track of all ever existed sections in the input file
34  *
35  * \note The naming convention for members of this class is the following: Any
36  * subsection variable gets as prefix the first letter of the section it
37  * is subsection of. Prefixes are separated by underscores and therefore
38  * we use camel-case style in the variable name itself to separate words.
39  * This is not consistent with the rest of the codebase, but for a good
40  * reason. Also remember that a double underscore is reserved in C++ for
41  * the C++ implementation (e.g STL).
42  *
43  * \attention Keep members of such a class in blocks corresponding to sections
44  * from the top-level of the file. Keep blocks alphabetically sorted.
45  */
46 namespace InputSections {
47 
48 /**
49  * A simple struct to represent input sections.
50  *
51  * This struct contains a raw pointer to the parent section and the name of the
52  * section itself. The parent pointer is used to reconstruct the full path of
53  * labels to reach a given section from the top-level section. This is needed to
54  * declare \c Key objects which need the full path of labels. A \c Section can
55  * be implicitly converted to \c KeyLabels and this is desired by design (after
56  * all a %YAML section is a key with a map as value).
57  *
58  * \attention Objects of type \c Section are meant to be created at compile time
59  * and they are not meant to be ever modified (note the \c constexpr
60  * constructor). This is a crucial aspect that guarantees that compile-time
61  * construction of sections will not hit any SIOF issue. Materialization into
62  * \c KeyLabels is done at runtime when \c InputKeys members are initialized.
63  */
64 struct Section {
65  /// A pointer to the parent section
66  const Section *const parent = nullptr;
67  /// The name of the section
68  const std::string_view name = "";
69 
70  /**
71  * Construct a new section
72  *
73  * \param name_in The name of the section
74  * \param parent_in A pointer to the parent section
75  */
76  explicit constexpr Section(std::string_view name_in,
77  const Section *parent_in = nullptr)
78  : parent{parent_in}, name{name_in} {}
79 
80  /**
81  * Convert the section to a list of labels
82  *
83  * \return A list of labels representing the full path to the section
84  */
85  [[nodiscard]] operator KeyLabels() const { return materialize(); }
86 
87  private:
88  /**
89  * Materialize the section into a list of labels
90  *
91  * \return A list of labels representing the full path to the section
92  */
93  [[nodiscard]] KeyLabels materialize() const {
94  KeyLabels labels = {name};
95  auto current = parent;
96  while (current) {
97  labels.emplace_back(current->name);
98  current = current->parent;
99  }
100  std::reverse(labels.begin(), labels.end());
101  return labels;
102  }
103 };
104 
105 /**
106  * Add a child section to a parent section
107  *
108  * \param parent The parent section
109  * \param child The name of the child section
110  *
111  * \return The new section
112  */
113 constexpr Section operator+(const Section &parent, std::string_view child) {
114  return Section{child, &parent};
115 }
116 
117 /// Section for the collision term
118 inline constexpr Section collisionTerm{"Collision_Term"};
119 /// Subsection for the dileptons
120 inline constexpr Section c_dileptons =
121  InputSections::collisionTerm + "Dileptons";
122 /// Subsection for the Pauli blocking mechanism
123 inline constexpr Section c_pauliBlocking =
124  InputSections::collisionTerm + "Pauli_Blocking";
125 /// Subsection for the photons
126 inline constexpr Section c_photons = InputSections::collisionTerm + "Photons";
127 /// Subsection for heavy flavor
128 inline constexpr Section c_heavyFlavor =
129  InputSections::collisionTerm + "Heavy_Flavor";
130 /// Subsection for the string parameters
131 inline constexpr Section c_stringParameters =
132  InputSections::collisionTerm + "String_Parameters";
133 /// Subsection for the string transition
134 inline constexpr Section c_stringTransition =
135  InputSections::collisionTerm + "String_Transition";
136 /// Subsection for the hard string transition
137 inline constexpr Section c_hardStringTransition =
138  InputSections::collisionTerm + "Hard_String_Transition";
139 /// Section for the forced thermalization
140 inline constexpr Section forcedThermalization{"Forced_Thermalization"};
141 
142 /// General section
143 inline constexpr Section general{"General"};
144 /// Subsection for the minimum-nonempty-ensembles mechanism
145 inline constexpr Section g_minEnsembles =
146  InputSections::general + "Minimum_Nonempty_Ensembles";
147 
148 /// Section for the lattice
149 inline constexpr Section lattice{"Lattice"};
150 
151 /// Section for the logging
152 inline constexpr Section logging{"Logging"};
153 
154 /// Section for the modus specific information
155 inline constexpr Section modi{"Modi"};
156 /// Subsection for the box modus
157 inline constexpr Section m_box = InputSections::modi + "Box";
158 /// Subsection for the jet in box modus
159 inline constexpr Section m_b_jet = InputSections::m_box + "Jet";
160 /// Subsection for the collider modus
161 inline constexpr Section m_collider = InputSections::modi + "Collider";
162 /// Subsection for the impact information in collider modus
163 inline constexpr Section m_c_impact = InputSections::m_collider + "Impact";
164 /// Subsection for the initial conditions in collider modus
165 inline constexpr Section m_c_initialConditions =
166  InputSections::m_collider + "Initial_Conditions";
167 /// Subsection for the projectile in collider modus
168 inline constexpr Section m_c_projectile =
169  InputSections::m_collider + "Projectile";
170 /// Subsection for the alpha-clustered projectile in collider modus
171 inline constexpr Section m_c_p_alphaClustered =
172  InputSections::m_c_projectile + "Alpha_Clustered";
173 /// Subsection for the custom projectile in collider modus
174 inline constexpr Section m_c_p_custom =
176 /// Subsection for the deformed projectile in collider modus
177 inline constexpr Section m_c_p_deformed =
178  InputSections::m_c_projectile + "Deformed";
179 /// Subsection for the projectile orientation in collider modus
180 inline constexpr Section m_c_p_orientation =
181  InputSections::m_c_projectile + "Orientation";
182 /// Subsection for the target in collider modus
183 inline constexpr Section m_c_target = InputSections::m_collider + "Target";
184 /// Subsection for the alpha-clustered target in collider modus
185 inline constexpr Section m_c_t_alphaClustered =
186  InputSections::m_c_target + "Alpha_Clustered";
187 /// Subsection for the custom target in collider modus
188 inline constexpr Section m_c_t_custom = InputSections::m_c_target + "Custom";
189 /// Subsection for the deformed target in collider modus
190 inline constexpr Section m_c_t_deformed =
191  InputSections::m_c_target + "Deformed";
192 /// Subsection for the target orientation in collider modus
193 inline constexpr Section m_c_t_orientation =
194  InputSections::m_c_target + "Orientation";
195 /// Subsection for the list modus
196 inline constexpr Section m_list = InputSections::modi + "List";
197 /// Subsection for the list-box modus
198 inline constexpr Section m_listBox = InputSections::modi + "ListBox";
199 /// Subsection for the sphere modus
200 inline constexpr Section m_sphere = InputSections::modi + "Sphere";
201 /// Subsection for the jet in sphere modus
202 inline constexpr Section m_s_jet = InputSections::m_sphere + "Jet";
203 
204 /// Section for the output information
205 inline constexpr Section output{"Output"};
206 /// Subsection for the output collisions content
207 inline constexpr Section o_collisions = InputSections::output + "Collisions";
208 /// Subsection for the output Coulomb content
209 inline constexpr Section o_coulomb = InputSections::output + "Coulomb";
210 /// Subsection for the output dileptons content
211 inline constexpr Section o_dileptons = InputSections::output + "Dileptons";
212 /// Subsection for the output initial conditions content
213 inline constexpr Section o_initialConditions =
214  InputSections::output + "Initial_Conditions";
215 /// Subsection for the output particles content
216 inline constexpr Section o_particles = InputSections::output + "Particles";
217 /// Subsection for the output photons content
218 inline constexpr Section o_photons = InputSections::output + "Photons";
219 /// Subsection for the output Rivet content
220 inline constexpr Section o_rivet = InputSections::output + "Rivet";
221 /// Subsection for the output Rivet weights information
222 inline constexpr Section o_r_weights = InputSections::o_rivet + "Weights";
223 /// Subsection for the output thermodynamics content
224 inline constexpr Section o_thermodynamics =
225  InputSections::output + "Thermodynamics";
226 
227 /// Section for the potentials information
228 inline constexpr Section potentials{"Potentials"};
229 /// Subsection for the Coulomb potentials information
230 inline constexpr Section p_coulomb = InputSections::potentials + "Coulomb";
231 /// Subsection for the momentum-dependent potentials information
232 inline constexpr Section p_momentumDependence =
233  InputSections::potentials + "Momentum_Dependence";
234 /// Subsection for the Skyrme potentials information
235 inline constexpr Section p_skyrme = InputSections::potentials + "Skyrme";
236 /// Subsection for the symmetry potentials information
237 inline constexpr Section p_symmetry = InputSections::potentials + "Symmetry";
238 /// Subsection for the VDF potentials information
239 inline constexpr Section p_vdf = InputSections::potentials + "VDF";
240 }; // namespace InputSections
241 
242 /*!\Userguide
243  * \page doxypage_input
244  *
245  * There are three input files used by SMASH:
246  *
247  * - `config.yaml` for configuring the simulation. This file is required. See
248  * \ref doxypage_input_configuration.
249  * - `particles.txt` for defining the particles used by SMASH. This file is
250  * optional. See \ref doxypage_input_particles.
251  * - `decaymodes.txt` for defining the decays (and corresponding resonance
252  * formations) possible in SMASH. This file is
253  * optional. See \ref doxypage_input_decaymodes.
254  *
255  * \page doxypage_input_configuration
256  *
257  * SMASH is configured via an input file in %YAML format. Typically you will
258  * start from the supplied `config.yaml` file and modify it according to your
259  * needs. If you ever make a mistake there and specify a configuration key that
260  * SMASH does not recognize, then on startup it will tell you about the keys it
261  * could not make any sense of.
262  *
263  * \anchor input_configuration_copy_mechanism_ \attention
264  * By default, SMASH copies the `config.yaml` file used to set up the SMASH run
265  * to the output directory of the simulation. For the sake of reproducibility,
266  * the randomly generated number seed (if the user specified a negative seed) is
267  * inserted into the copied file. The used particles and decay modes are
268  * appended there as well. For this purpose, a `particles` and a `decaymodes`
269  * key are used and their values are a one-line version of the corresponding
270  * files (see \ref doxypage_input_particles and \ref doxypage_input_decaymodes
271  * for information about them). To manually input the values of these keys is
272  * not an intended use case and you are discouraged from doing so. On the other
273  * hand, you could use the %YAML file copied by SMASH to the output directory
274  * for reproducibility purposes. In this case, since particles and decay modes
275  * are included in the configuration file, using a particles and/or a decay
276  * modes file as well should be avoided, otherwise the configuration content
277  * will be ignored.
278  *
279  * \par The available keys are documented on the following pages:
280  * \li \ref doxypage_input_conf_general
281  * \li \ref doxypage_input_conf_logging
282  * \li \ref doxypage_input_conf_collision_term
283  * \li \ref doxypage_input_conf_modi
284  * \li \ref doxypage_input_conf_output
285  * \li \ref doxypage_input_conf_lattice
286  * \li \ref doxypage_input_conf_potentials
287  * \li \ref doxypage_input_conf_forced_therm
288  *
289  * \note
290  * In the evolution of the software some new input keys have been introduced and
291  * some other removed. From `SMASH-3.0` a systematic deprecation and removal
292  * mechanism has been introduced, such that a key can be marked as deprecated
293  * by developer in some version and been removed in a later release. Therefore,
294  * it can be easily read in the code in which version a key has been introduced,
295  * deprecated or removed. Refer to the documentation of the `InputKeys` class in
296  * the developer guide for further information. For completeness, removed keys
297  * are not entirely removed from the documentation and they are collected in a
298  * \ref doxypage_input_conf_removed_keys "dedicated page".
299  *
300  * \par Information on formatting of the input file
301  *
302  * The input file is made of sections, i.e. of keys containing as "value" a
303  * series of keys and/or sections. In order to identify the content of a
304  * section, it is important to keep a consistent indentation in the input file.
305  * The convention is to use 4 spaces indentation in order to specify keys inside
306  * a section. For example:
307  * \verbatim
308  Output:
309  Output_Interval: 1.0
310  Particles:
311  Format: ["Oscar2013"]
312  \endverbatim
313  * This is a part of the input file. The `Output_Interval` key belongs to the
314  * `Output` section, whereas `%Particles` is in turn a section containing the
315  * `Format` key.
316  *
317  *
318  * \ifnot user
319  * \par The relevant functions and classes for input are:
320  * \li \ref Configuration
321  * \li \ref ExperimentBase::create()
322  * \li \ref ColliderModus
323  * \li \ref BoxModus
324  * \li \ref SphereModus
325  * \li \ref ListModus
326  * \li \ref ListBoxModus
327  * \endif
328  */
329 
330 /*!\Userguide
331  * \page doxypage_input_conf_removed_keys
332  *
333  * The following list collects all configuration keys that have been removed at
334  * some point from SMASH. Each removed key is written here using its %YAML full
335  * path in the %YAML tree, i.e. including section names from the top-level. Full
336  * stops are used as separators as they are never included in key names. For
337  * example, a key listed as <tt>Top.Sub.Name</tt> refers to the \c Name key in
338  * the \c Sub section which in turn is contained in the \c Top section.
339  */
340 
341 /*!\Userguide
342  * \page doxypage_input_short_ref
343  *
344  * This is a look-up reference of input keys. Refer to each corresponding page
345  * for a detailed description of each key.
346  */
347 
348 /*!\Userguide
349  * \page doxypage_input_conf_general
350  *
351  * This section in the `config.yaml` file contains all general/global
352  * configuration options to SMASH. Before describing all possible keys in
353  * detail, let's start off with a couple of examples.
354  *
355  * The `General` section in SMASH input file might read as follows:
356  *
357  *\verbatim
358  General:
359  Modus: "Collider"
360  Delta_Time: 0.1
361  Testparticles: 1
362  Gaussian_Sigma: 1.0
363  Gauss_Cutoff_In_Sigma: 3.0
364  End_Time: 100.0
365  Randomseed: -1
366  Nevents: 20
367  Use_Grid: true
368  Time_Step_Mode: "Fixed"
369  \endverbatim
370  *
371  * In the case of an expanding sphere setup, change the \key Modus and provide
372  * further information about the expansion.
373  *\verbatim
374  Modus: "Sphere"
375  MetricType: "MasslessFRW"
376  Expansion_Rate: 0.1
377  \endverbatim
378  */
379 
380 /*!\Userguide
381  * \page doxypage_input_conf_general_mne
382  *
383  * Instead of defining the number of events it is possible to define a minimum
384  * number of ensembles in which an interaction took place. Using this option
385  * by providing a `Minimum_Nonempty_Ensembles` section in the input file,
386  * events will be calculated until the desired number of non-empty ensembles
387  * is generated. If the <tt>\ref key_gen_nevents_ "Nevents"</tt> key is not
388  * specified, <b>this section with all its required keys must be present in the
389  * SMASH input file</b>.
390  *
391  * Without parallel ensembles (`Ensembles: 1`) the number of ensembles is equal
392  * to the number of events, so that this option will provide the desired number
393  * of non-empty events.
394  */
395 
396 /*!\Userguide
397  * \page doxypage_input_conf_logging
398  *
399  * The `Logging` section in the input file controls the logging levels for
400  * different areas of the code, each of which can have a different verbosity
401  * level. All keys and hence the section itself are optional. Valid key values
402  * are the following:
403  * - `"ALL"` &rarr; Log all messages (default)
404  * - `"TRACE"` &rarr; The lowest level for messages describing the program flow
405  * - `"DEBUG"` &rarr; Debug messages
406  * - `"INFO"` &rarr; Messages of informational nature
407  * - `"WARN"` &rarr; Warning messages
408  * - `"ERROR"` &rarr; Non-fatal errors
409  * - `"FATAL"` &rarr; Messages that indicate terminal application failure
410  * - `"OFF"` &rarr; If selected no messages will be printed to the output
411  *
412  * Note that the logging levels `TRACE` and `DEBUG` are only available in
413  * debug builds (i.e. running `cmake` with `-DCMAKE_BUILD_TYPE=Debug`).
414  *
415  * \warning
416  * In the following you will find more logging areas that as user you are
417  * probably going to need. Most of them are useful to developers e.g. for
418  * debugging purposes and that's also the reason why, in Release mode, only few
419  * logging areas appear in the standard output. If the explanation of a given
420  * key looks cryptic to you, you are likely not going to need that key. For the
421  * sake of completeness, though, we list here all possible logging areas, trying
422  * to list first those logging areas that might most likely be relevant for the
423  * user.
424  */
425 
426 /*!\Userguide
427  * \page doxypage_input_conf_collision_term
428  *
429  * The `Collision_Term` section in the input file can be used to configure SMASH
430  * interactions. Before describing each possible key in detail, it is useful to
431  * give some taste with a couple of examples.
432  *
433  * <h3> A real life example </h3>
434  *
435  * The following section in the input file configures SMASH to include all but
436  * strangeness exchange involving 2 &harr; 2 scatterings, to treat N + Nbar
437  * processes as resonance formations and to not force decays at the end of the
438  * simulation. The elastic cross section is globally set to 30 mbarn and the
439  * \f$ \sqrt{s} \f$ cutoff for elastic nucleon + nucleon collisions is 1.93 GeV.
440  * All collisions are performed isotropically and 2 &harr; 1 processes are
441  * forbidden.
442  *
443  *\verbatim
444  Collision_Term:
445  Included_2to2: ["Elastic","NN_to_NR","NN_to_DR","KN_to_KN","KN_to_KDelta"]
446  Two_to_One: true
447  Force_Decays_At_End: false
448  NNbar_Treatment: "resonances"
449  Elastic_Cross_Section: 30.0
450  Elastic_NN_Cutoff_Sqrts: 1.93
451  Isotropic: true
452  \endverbatim
453  *
454  * If necessary, all collisions can be turned off by adding
455  *\verbatim
456  No_Collisions: True
457  \endverbatim
458  * in the configuration file.
459  *
460  * <h3> Configuring deuteron multi-particle reactions </h3>
461  *
462  * The following example configures SMASH to include deuteron multi-particle
463  * reactions scatterings.
464  *\verbatim
465  Collision_Term:
466  Collision_Criterion: Stochastic
467  Multi_Particle_Reactions: ["Deuteron_3to2"]
468  \endverbatim
469  * Note, that the that the fake baryon resonance d' should not be included in
470  * the \e particles.txt file, otherwise `PiDeuteron_to_pidprime` and
471  * `NDeuteron_to_Ndprime` have to be excluded from `Included_2to2` by listing
472  * all 2-to-2 reactions except those two.
473  *
474  * <hr>
475  * In this page many generic keys are described. For information about further
476  * tuning possibilities, see the following pages:
477  * - \ref doxypage_input_conf_ct_pauliblocker
478  * - \ref doxypage_input_conf_ct_string_transition
479  * - \ref doxypage_input_conf_ct_hard_string_transition
480  * - \ref doxypage_input_conf_ct_string_parameters
481  * - \ref doxypage_input_conf_ct_dileptons
482  * - \ref doxypage_input_conf_ct_photons
483  * - \ref doxypage_input_conf_ct_heavy_flavor
484  * - \ref doxypage_input_conf_ct_spin_interactions
485  */
486 
487 /*!\Userguide
488  * \page doxypage_input_conf_ct_pauliblocker
489  *
490  * Pauli blocking can be activated and customized using the `Pauli_Blocking`
491  * section within `Collision_Term`. For example:
492  *\verbatim
493  Collision_Term:
494  Pauli_Blocking:
495  Spatial_Averaging_Radius: 1.86
496  Gaussian_Cutoff: 2.2
497  Momentum_Averaging_Radius: 0.08
498  \endverbatim
499  */
500 
501 /*!\Userguide
502  * \page doxypage_input_conf_ct_string_transition
503  *
504  * Within `Collision_Term` section, the `String_Transition` section can be
505  * used to modify a series of parameters which interpolate linearly the cross
506  * section transition between resonances and strings. This also controls the
507  * shape of the total cross section around the intermediate energies. If this
508  * section is omitted, default values are used.
509  *
510  * For example, this creates a relaxed transition starting immediately at the
511  mass threshold:
512  *\verbatim
513  Collision_Term:
514  String_Transition:
515  Sqrts_Range_NN: [1.9,4.5]
516  Sqrts_Range_Npi: [1.1,2.5]
517  Sqrts_Lower: 0
518  Sqrts_Range_Width: 1.5
519  \endverbatim
520  */
521 
522 /*!\Userguide
523  * \page doxypage_input_conf_ct_string_parameters
524  *
525  * Within `Collision_Term` section, the `String_Parameters` section can be used
526  * to modify a series of parameters which affect the string fragmentation.
527  */
528 
529 /*!\Userguide
530  * \page doxypage_input_conf_ct_dileptons
531  *
532  * Dilepton production can be enabled in the corresponding `Dileptons`
533  * section in the `Collision_Term` one of the configuration file.
534  * Remember to also activate the dilepton output in the output section.
535  */
536 
537 /*!\Userguide
538  * \page doxypage_input_conf_ct_photons
539  *
540  * Photon production can be enabled in the corresponding `Photon` section
541  * in the `Collision_Term` one of the configuration file.
542  * Remember to also activate the photon output in the output section.
543  */
544 
545 /*!\Userguide
546  * \page doxypage_input_conf_ct_heavy_flavor
547  *
548  * The subsection `Heavy_Flavor` of the `Collision_Term` section can be used to
549  * modify the suppression parameters for AQM cross sections regarding bottom and
550  * charm hadrons. For example:
551  *\verbatim
552  Collision_Term:
553  Heavy_Flavor:
554  AQM_Bottom_Suppression: 0.93
555  AQM_Charm_Suppression: 0.8
556  \endverbatim
557  */
558 
559 /*!\Userguide
560  * \page doxypage_input_conf_ct_spin_interactions
561  *
562  * The subsection `Spin_Interactions` of the `Collision_Term` section can be
563  * used to modify spin-interactions. The allowed keys are: `On`, which includes
564  * all available spin interactions and `Off`, which excludes all spin
565  * interactions.
566  *
567  * For example:
568  *\verbatim
569  Collision_Term:
570  Spin_Interactions: On
571  \endverbatim
572  */
573 
574 /*!\Userguide
575  * \page doxypage_input_conf_ct_hard_string_transition
576  *
577  * The subsection `Hard_String_Transition` of the `Collision_Term` section
578  * controls how the non-diffractive string excitation is split into soft and
579  * hard components.
580  *
581  * The transition mode is selected via the `Mode` key:
582  * - `Exponential`: use the exponential splitting of the non-diffractive
583  * cross section. The probability for a purely soft non-diffractive
584  * interaction is given by
585  * \f[
586  * P_{\mathrm{soft}} =
587  * \exp\!\left(-\frac{\sigma_{\mathrm{hard}}}
588  * {\sigma_{\mathrm{ND}}}\right),
589  * \f]
590  * where \f$\sigma_{\mathrm{hard}}\f$ is the hard string cross section and
591  * \f$\sigma_{\mathrm{ND}}\f$ the total non-diffractive cross section. The
592  * hard non-diffractive contribution follows from
593  * \f$\sigma_{\mathrm{ND,hard}} =
594  * \sigma_{\mathrm{ND}} - \sigma_{\mathrm{ND,soft}}\f$.
595  * - `Custom_Range`: use a smooth, user-defined transition from soft to hard
596  * string excitation as a function of the collision energy.
597  *
598  * For `Custom_Range`, the transition is controlled by `Energy_Range`
599  * (in \f$\sqrt{s}\f$ measured in GeV). The first value specifies the lower
600  * bound and the second value the upper bound of the transition region.
601  * Below this range only soft string excitation is used, above it only hard
602  * string excitation is used, and inside the range the probability for hard
603  * string excitation increases smoothly with energy.
604  *
605  * For example:
606  * \verbatim
607  Collision_Term:
608  Hard_String_Transition:
609  Mode: Custom_Range
610  Energy_Range: [10.0, 20.0]
611  \endverbatim
612 * Enabling hard string interactions at lower collision energies changes
613 * baryon stopping. Therefore, some string-fragmentation and MPI parameters
614 * may need to be adjusted. The following setup can be used as a starting
615 * point for studies with an early hard-string transition:
616 *\verbatim
617 Collision_Term:
618  Hard_String_Transition:
619  Mode: Custom_Range
620  Energy_Range: [10.0, 11.0]
621  String_Parameters:
622  StringZ_A_Leading: 0.2
623  StringZ_B_Leading: 5.0
624  Damp_Popcorn: 0.0
625  String_Sigma_T: 0.3
626  Pythia_Settings:
627  - "MultipartonInteractions:ecmPow = 0.152"
628 \endverbatim
629 * These parameters are intended as a phenomenological starting point for
630 * dedicated studies. They should not be interpreted as a tuned parameter set,
631 * and further tuning may be required for quantitative applications.
632 */
633 
634 /*!\Userguide
635  * \page doxypage_input_conf_modi
636  *
637  * The `Modi` section is the place where the specified <tt>\ref key_gen_modus_
638  * "Modus"</tt> shall be configured. For each possibility refer to the
639  * corresponding documentation page:
640  * - \ref doxypage_input_conf_modi_collider
641  * - \ref doxypage_input_conf_modi_sphere
642  * - \ref doxypage_input_conf_modi_box
643  * - \ref doxypage_input_conf_modi_list
644  * - \ref doxypage_input_conf_modi_listbox
645  *
646  * The `Modi` section has to contain a section named after the chosen modus and
647  * in it the corresponding customization takes place.
648  *
649  * \note In some very rare cases, SMASH will throw an error that an integer
650  * overflow would occur constructing the system grid. This happens if the grid
651  * at a fixed grid size is constructed with too many cells. One case where this
652  * might occur is the `List` modus, if the input particle list contains
653  * particles with nonphysically large position values.
654  */
655 
656 /*!\Userguide
657  * \page doxypage_input_conf_modi_collider
658  *
659  * The `Collider` modus can be customized using the options here below.
660  * To further configure the projectile, target and the impact parameter, see
661  * - \ref doxypage_input_conf_modi_C_proj_targ and
662  * - \ref doxypage_input_conf_modi_C_impact_parameter.
663  *
664  * \attention
665  * The incident energy can be specified in different ways and one (and only one)
666  * of these must be used. Alternatively, one can specify the individual beam
667  * energies or momenta in the `Projectile` and `Target` sections (see \ref
668  * doxypage_input_conf_modi_C_proj_targ for details). In this
669  * case, one must give either `E_Tot` or `E_Kin` or `P_Lab` for both
670  * `Projectile` and `Target`.
671  *
672  * <hr>
673  */
674 
675 /*!\Userguide
676  * \page doxypage_input_conf_modi_C_proj_targ
677  *
678  * Within the `Collider` section, two sections can be used for further
679  * customizations:
680  * - `Projectile` &rarr; Section for projectile nucleus. The projectile will
681  * start at \f$z<0\f$ and fly in positive \f$z\f$-direction, at \f$x\ge 0\f$.
682  * - `Target` &rarr; Section for target nucleus. The target will start at
683  * \f$z>0\f$ and fly in negative \f$z\f$-direction, at \f$x \le 0\f$.
684  *
685  * <b>All keys described here below can be specified in the `Projectile` and/or
686  * in the `Target` section.</b> Examples are given after the keys description.
687  */
688 
689 /*!\Userguide
690  * \page doxypage_input_conf_modi_C_impact_parameter
691  *
692  * Within the `Collider` section, the `Impact` section can be used to specify
693  * information about the impact parameter, defined as the distance \unit{in fm}
694  * of the two straight lines that the center of masses of the nuclei travel on.
695  * The separation of the two colliding nuclei is by default along the x-axis.
696  * If the `Impact` section is not specified, default values here below will be
697  * used, e.g. the impact parameter will be set to 0 fm.
698  *
699  * \warning
700  * Note that there are no safeguards to prevent you from specifying negative
701  * impact parameters. The value chosen here is simply the x-component of
702  * \f$\mathbf{b}\f$. The result will be that the projectile and target will have
703  * switched position in x.
704  */
705 
706 /*!\Userguide
707  * \page doxypage_input_conf_modi_C_initial_conditions
708  *
709  * <h2> Fluidization conditions </h2>
710  *
711  * Currently there are two implemented conditions for selecting hadrons from a
712  * collision as input for a hydrodynamic evolution, controlled by \key Type.
713  * Namely, they are `Constant_Tau`, which relies on the hadron's hyperbolic
714  * time, and `Dynamic`, where the condition is that the energy density around
715  * the hadron exceeds a defined threshold. In both cases, particles that obey
716  * the fluidization condition are written to the \key Initial_Conditions output,
717  * which must be included in the config.
718  *
719  * <h3> Constant tau </h3>
720  *
721  * The hyperbolic time is taken from the \key Proper_Time field in the
722  * \key Initial_Conditions subsection when configuring the output. If this
723  * information is not provided, the default value corresponds to the passing
724  * time of the two nuclei, where all primary interactions are expected to
725  * have occured:
726  * \f[
727  * \tau_0 = (r_\mathrm{p} \ + \ r_\mathrm{t})
728  * \ \left(\left(\frac{\sqrt{s_\mathrm{NN}}} {2 \ m_\mathrm{N}}\right)^2 -
729  * 1\right)^{-1/2} \f] Therein, \f$ r_\mathrm{p} \f$ and \f$ r_\mathrm{t} \f$
730  * denote the radii of the projectile and target nucleus, respectively, \f$
731  * \sqrt{s_\mathrm{NN}}\f$ is the collision energy per nucleon and \f$
732  * m_\mathrm{N} \f$ the nucleon mass. Note though that, if the passing time is
733  * smaller than 0.5 fm, the default proper time of the hypersurface is taken to
734  * be \f$\tau = 0.5\ \mathrm{fm}\f$ as a minimum bound to ensure the proper time
735  * is large enough to also extract reasonable initial conditions at RHIC/LHC
736  * energies. If desired, this lowest possible value can also be specified in the
737  * configuration file with the \key Lower_Bound field. This is best applied to
738  * higher beam energies, where the majority of the system is expected to behave
739  * as a fluid starting with a Bjorken picture.
740  *
741  * Internally, the particles that cross the hypersurface are removed from the
742  * evolution.
743  *
744  * <h3> Dynamic with energy density </h3>
745  *
746  * Hydrodynamics is in general applicable for systems in or close to
747  * equilibrium. A hadron gas will always be driven towards equilibration, but
748  * this will be faster if the temperature or density is higher. This can be
749  * effectively captured by conditioning the fluid-like behavior to the local
750  * energy density: if it is higher than a given value, then this region can be
751  * considered a fluid. By default, the threshold energy density is set to 0.5
752  * GeV/fm³, but this can be controlled with the \key Energy_Density_Threshold.
753  * This procedure is based on \iref{Akamatsu:2018olk}, where particles
754  * that suffered elastic collisions are not fluidizable, but here they are
755  * included by default. If desired, this can be changed with the
756  * \key Fluidizable_Processes key.\n \n
757  *
758  * The threshold condition is evaluated at every time step in a lattice
759  * centered at the origin that starts with a fixed length of 40 fm in each
760  * direction (for zero \key Minimum_Time), but grows linearly every 5 fm after
761  * the first 20 fm until \key Maximum_Time, such that even particles at the
762  * speed of light are always contained in the lattice. The number of cells is
763  * fixed, meaning that each cell increases in size. <hr>
764  */
765 
766 /*!\Userguide
767  * \page doxypage_input_conf_modi_sphere
768  */
769 
770 /*!\Userguide
771  * \page doxypage_input_conf_modi_box
772  * \attention
773  * To perform the box simulation, SMASH introduces a grid to divide space into
774  * cells and the choice of the minimum cell size is driven by physics. In
775  * particular, the box is split into cells which have to be larger than the
776  * maximum interaction range of a particle traveling at the speed of light
777  * throughout a time step. Therefore the choice of the <tt>\ref
778  * key_gen_delta_time_ "Delta_Time"</tt> and <tt>\ref key_MB_length_
779  * "Length"</tt> keys has to be done carefully. Larger time steps will require a
780  * larger minimum cell size which, in turn, will need a larger box, since at
781  * least 2 cells in each direction have to exist (because of periodic boundary
782  * conditions). If this condition is not fulfilled, SMASH will abort with an
783  * error. It is worth mentioning that using <tt>\ref key_gen_testparticles_
784  * "Testparticles"</tt> might also be advantageous, as they reduce the
785  * particles maximum interaction length and, hence, the minimal cell size.
786  *
787  * \attention
788  * Furthermore, even if the grid can be constructed, the value of `Delta_Time`
789  * is connected to another aspect and it should not be chosen too large, since
790  * the frequency with which collisions through the walls are searched for is
791  * performed only once in each time step. A rough approximation (imposed in the
792  * code) is that \f$ 10\cdot\mathtt{Delta\_Time} \le \mathtt{Length} \f$,
793  * and a smaller time step than the provided one might be needed in case SMASH
794  * aborts with an error about this aspect.
795  *
796  * \warning Because the box modus is intended to simulate an equilibrated hadron
797  * gas, features that break detailed balance should not be used, such as
798  * `"Strings"` (see \ref key_CT_strings_ "here") and the `"TopDown"` approach of
799  * evaluating total cross sections (see \ref key_CT_totXsStrategy_ "here").
800  */
801 
802 /*!\Userguide
803  * \page doxypage_input_conf_modi_list
804  * The `List` modus provides a modus for hydro afterburner calculations. It
805  * takes per default files with a list of particles in \ref oscar2013_format
806  * "Oscar 2013 format" as an input. The input format can be adapted to a certain
807  * extent using the key
808  * <tt>\ref key_ML_optional_quantities_ "Optional_Quantities"</tt>.
809  * The provided particles are treated as a starting setup. Multiple events per
810  * file are supported. In the following, the input keys are listed with a short
811  * description, an example is given and some information about the input
812  * particle files is provided.
813  *
814  * \warning
815  * Because of how interactions between particles are found, SMASH might get
816  * stuck if more than two particles in the provided input particles file are at
817  * the same identical 4-position. Therefore, SMASH aborts with an error in such
818  * a case, reporting the faulty positions to the user. Even if it results in a
819  * (usually small) overhead at the beginning of the run, all events are checked
820  * before starting the simulation and possible errors about all events are
821  * reported. This is preferred to have SMASH crash after a (potentially large)
822  * number of events. It is the user's responsibility to decide how to handle
823  * such cases, depending on their framework and setup.
824  *
825  * \attention
826  * In `List` modus, the provided list of particles has to match information
827  * contained in the particles file (either the SMASH default one or that
828  * provided via the `-p` option), when appropriate. In particular, the mass of
829  * stable particles has to match that of the particles file. In case of a
830  * mismatch, the latter is used (modifying its energy to put the particle back
831  * on shell) and the user warned. Furthermore, all particles have to be on their
832  * mass shell. If not, their energy is adjusted and the user warned. Note that
833  * this type of warning is given only once and <b>it is the user's
834  * responsibility to ensure that this is a desired behaviour</b>.
835  */
836 
837 /*!\Userguide
838  * \page doxypage_input_conf_modi_listbox
839  *
840  * The `ListBox` modus provides the possibility to initialize a box with a given
841  * set of particles. This modus uses all functionality from the `List` modus
842  * itself. The only difference is that one has to specify the length of the box.
843  * Apart from that, the usage should be equivalent to \ref
844  * doxypage_input_conf_modi_list "the \c List modus". Refer to it for more
845  * details.
846  *
847  * <h3> Configuration example </h3>
848  * \verbatim
849  Modi:
850  ListBox:
851  File_Directory: "particle_lists_in"
852  File_Prefix: "event"
853  Shift_Id: 0
854  Length: 10.0
855 
856  \endverbatim
857  */
858 
859 /*!\Userguide
860  * \page doxypage_input_conf_output
861  *
862  * To produce a certain output content it is necessary to explicitly configure
863  * it in the `Output` section of the configuration file. This means, that the
864  * `Output` section needs to contain one or more subsection for each desired
865  * content. Additionally, there are general output configuration parameters that
866  * can be used for further customization.
867  */
868 
869 /*!\Userguide
870  * \page doxypage_input_conf_lattice
871  *
872  * It is possible to configure a lattice for the 3D space, which can be useful
873  * to speed up the computation of the potentials. Note though, that this goes in
874  * hand with a loss of accuracy: If the lattice is applied, the evaluation of
875  * the potentials is carried out only on the nodes of the lattice. Intermediate
876  * values are interpolated.
877  *
878  * The configuration of a lattice is usually not necessary, it is however
879  * required if the \ref doxypage_output_vtk "Thermodynamic VTK Output",
880  * the \ref doxypage_output_thermodyn_lattice "Thermodynamic Lattice Output",
881  * the <tt>\ref key_lattice_pot_affect_threshold_
882  * "Potentials_Affect_Thresholds"</tt>, the \ref doxypage_input_conf_pot_coulomb
883  * "Coulomb potentials", or the \ref input_output_coulomb_ "Coulomb VTK output"
884  * option is enabled. To configure the thermodynamic output, use
885  * \ref doxypage_input_conf_output "the \c Output section".
886  *
887  * To enable a lattice it is necessary to add a `Lattice` section with the
888  * following parameters. If no `Lattice` section is used in the configuration,
889  * no lattice will be used at all.
890  */
891 
892 /*!\Userguide
893  * \page doxypage_input_lattice_default_parameters
894  *
895  * The default configuration for the \ref doxypage_input_conf_lattice depends on
896  * the modus and is in most cases based on some heuristic to approximate the
897  * region in space that particles usually reach during the evolution.
898  *
899  * <h3>Collider</h3>
900  * The maximum expected longitudinal velocity is approximated to the speed of
901  * light \f$v_z=1\f$ and the maximum expected velocity in each transverse
902  * direction is \f$v_x=v_y = 0.7\f$. Assuming an \f$R=5\f$ fm nucleus that is
903  * contracted along the z-direction by \f$\gamma = \frac{\sqrt{s_{NN}}}{2m_N}\f$
904  * and the particles propagating until \ref key_gen_end_time_ "end time", we end
905  * up with
906  * \f[ z_{\rm max} = \frac{5\,{\rm fm}}{\gamma} + t_{\rm end} \f]
907  * \f[ x_{\rm max} = y_{\rm max} = 5\,{\rm fm} + 0.7 t_{\rm end}\,.\f]
908  * The lattice then covers the range \f$ -x_{\rm max} < x < x_{\rm max}\f$,
909  * \f$-y_{\rm max} < y < y_{\rm max}\f$ and \f$-z_{\rm max} <z< z_{\rm max}\f$.
910  * The cell size in all directions is 0.8 fm. However, if \ref
911  * key_gen_smearing_mode_ "a smearing" requiring a lattice (where the smearing
912  * length is bound to the lattice cell length) is used, the cell size in
913  * z-direction is contracted to \f$\frac{0.8\,{\rm fm}}{\gamma}\f$. \note A
914  * minimum size of 30 fm is imposed since the heuristic above for determining
915  * the lattice expects the end time to be large compared to the nucleus size.
916  *
917  * <h3>Box and ListBox</h3>
918  * The lattice covers exactly the entire box from 0 to \ref key_MB_length_
919  * "box length" in x, y and z. The cell size is 0.5 fm and only in this case the
920  * lattice is <tt>\ref key_lattice_periodic_ "periodic"</tt>.
921  *
922  * <h3>Sphere</h3>
923  * Since the sphere has an initial <tt>\ref key_MS_radius_ "Radius"</tt>,
924  * the maximum distance in all directions can be estimated to
925  * \f[ x_{\rm max} = y_{\rm max} = z_{\rm max} = R_0 + t_{\rm end} \f]
926  * using the speed of light as a maximum expansion velocity.
927  * The cell size is 0.8 fm in each direction.
928  *
929  * <h3>List</h3>
930  * <b>There is no default for the `List` modus.</b> It is basically impossible
931  * to foresee how such a modus is used and, hence, the region covered by the
932  * lattice has to be actively specified by the user. If an automatic lattice
933  * creation is requested, SMASH will terminate with an error.
934  */
935 
936 /*!\Userguide
937  * \page doxypage_input_conf_potentials
938  *
939  * SMASH simulation supports two sets of nuclear potentials:
940  * -# Skyrme with (optional) Symmetry potentials;
941  * -# VDF (vector density functional) model potentials, \iref{Sorensen:2020ygf}.
942  *
943  * In addition to these nuclear potentials, Coulomb potentials can also be
944  * enabled.
945  *
946  * \note Skyrme and Symmetry potentials do not need to be both active, but if
947  * one of the two is enabled, then one cannot use VDF potentials.
948  *
949  * Skyrme and VDF potentials both describe the behavior of symmetric nuclear
950  * matter. The symmetry potential can adjust the Skyrme potential (but not the
951  * VDF potential) to include effects due to isospin. The Skyrme and Symmetry
952  * potentials are semi-relativistic, while the VDF potential is fully
953  * relativistic. A momentum-dependent term can be added to the Skyrme potential.
954  * The additional term is not treated in a fully Lorentz-invariant way. Visit
955  * the following subpages for more information:
956  * - \ref doxypage_input_conf_pot_skyrme
957  * - \ref doxypage_input_conf_pot_symmetry
958  * - \ref doxypage_input_conf_pot_VDF
959  * - \ref doxypage_input_conf_pot_coulomb
960  * - \ref doxypage_input_conf_pot_momentum_dependence
961  *
962  * \warning A large enough number of <tt>\ref key_gen_ensembles_
963  * "Ensembles"</tt>, <tt>\ref key_gen_testparticles_ "Testparticles"</tt>,
964  * or a combination of both must be used for a stable evaluation of densities
965  * needed to compute the potentials. We recommend minimal values of 20 ensembles
966  * and 10 testparticles (see \iref{Mohs:2024gyc}).
967  *
968  * <h3> Configuring potentials </h3>
969  *
970  * The following snippet of the configuration file configures SMASH such that
971  * the Skyrme as well as the Symmetry potential are activated for the
972  * simulation. There is however no requirement to include both simultaneously.
973  * They can be switched on and off individually.
974  *\verbatim
975  Potentials:
976  Skyrme:
977  Skyrme_A: -209.2
978  Skyrme_B: 156.4
979  Skyrme_Tau: 1.35
980  Symmetry:
981  S_Pot: 18.0
982  Coulomb:
983  R_Cut: 5.0
984  \endverbatim
985  * Note that the Coulomb potential requires a <tt>\ref
986  * doxypage_input_conf_lattice "Lattice"</tt> while for the other potentials it
987  * can be used as an optimisation.
988  *
989  * <h3> Configuring VDF potentials </h3>
990  *
991  * The following snippets from the configuration file configure SMASH such
992  * that the VDF potential is activated for the simulation.
993  *
994  * In the first example, VDF potentials are configured to reproduce the default
995  * SMASH Skyrme potentials (without the symmetry potential, as it is not
996  * described within the VDF model):
997  *\verbatim
998  Potentials:
999  VDF:
1000  Sat_rhoB: 0.168
1001  Powers: [2.0, 2.35]
1002  Coeffs: [-209.2, 156.5]
1003  \endverbatim
1004  *
1005  * In the second example, VDF potentials are configured to describe nuclear
1006  * matter with saturation density of \f$\rho_0 = \mathrm{0.160 fm}^{-3}\f$,
1007  * binding energy of \f$B_0 = -16.3\f$ MeV, the critical point of the
1008  * ordinary nuclear liquid-gas phase transition at \f$T_c^{(N)} = 18\f$ MeV and
1009  * \f$\rho_c^{(N)} = 0.375 \rho_0\f$, the critical point of the conjectured
1010  * "QGP-like" phase transition at \f$T_c^{(Q)} = 100\f$ MeV and
1011  * \f$\rho_c^{(Q)} = 3.0\rho_0\f$, and the boundaries of the spinodal region
1012  * of the "QGP-like" phase transition at \f$\eta_L = 2.50 \rho_0\f$ and
1013  * \f$\eta_R = 3.315 \rho_0\f$:
1014  *\verbatim
1015  Potentials:
1016  VDF:
1017  Sat_rhoB: 0.160
1018  Powers: [1.7681391, 3.5293515, 5.4352788, 6.3809822]
1019  Coeffs: [-8.450948e+01, 3.843139e+01, -7.958557e+00, 1.552594e+00]
1020  \endverbatim
1021  * <h3> Configuring the momentum dependence </h3>
1022  * The momentum-dependent term can be added to the Skyrme potential. In order
1023  * to activate it one has to specify the parameters C and Lambda in MeV and
1024  * 1/fm respectively in the "Momentum_Dependence" section under "Potentials".
1025  * Note that the parameters from the momentum-dependent term and the Skyrme
1026  * potential need to be consistent in order to reproduce nuclear ground
1027  * state properties. An example of parameters corresponding to a
1028  * medium-stiff (K=290 MeV) equation of state is given in the following.
1029  * \verbatim
1030  Potentials:
1031  Symmetry:
1032  S_Pot: 18.0
1033  Skyrme:
1034  Skyrme_Tau: 1.76
1035  Skyrme_B: 57.2
1036  Skyrme_A: -29.3
1037  Momentum_Dependence:
1038  C: -63.5
1039  Lambda: 2.13
1040 \endverbatim
1041  */
1042 
1043 /*!\Userguide
1044  * \page doxypage_input_conf_pot_skyrme
1045  *
1046  * The Skyrme potential has the form
1047  * \f[ U_{Sk} = A(\rho/\rho_0) + B (\rho/\rho_0)^{\tau} \,, \f]
1048  * where \f$\rho\f$ is baryon density in the local Eckart rest frame.
1049  * Its parameters must be specified in the `Skyrme` subsection of the
1050  * `%Potentials` one.
1051  */
1052 
1053 /*!\Userguide
1054  * \page doxypage_input_conf_pot_symmetry
1055  *
1056  * The symmetry potential has the form
1057  * \f[ U_{Sym} = \pm 2 S_{pot} \frac{I_3}{I} \frac{\rho_{I_3}}{\rho_0}
1058  * + S(\rho_B)\left(\frac{\rho_{I_3}}{\rho_B}\right)^2 \,, \f]
1059  * where \f$ \rho_{I_3}\f$ is the density of the relative isospin \f$ I_3/I
1060  * \f$ and \f$ \rho_B \f$ is the net baryon density and
1061  * \f[ S(\rho_B)=12.3\,\mathrm{MeV}\times
1062  * \left(\frac{\rho_B}{\rho_0}\right)^{2/3}+
1063  * 20\,\mathrm{MeV}\times\left(\frac{\rho_B}{\rho_0}\right)^\gamma\;. \f]
1064  * Parameters must be specified in the `Symmetry` subsection of the
1065  * `%Potentials` one.
1066  */
1067 
1068 /*!\Userguide
1069  * \page doxypage_input_conf_pot_VDF
1070  *
1071  * The VDF potential is a four-vector of the form
1072  * \f[
1073  * A^{\mu} = \sum_{i=1}^N C_i
1074  * \left(\frac{\rho}{\rho_0}\right)^{b_i - 2}
1075  * \frac{j^{\mu}}{\rho_0} \,,
1076  * \f]
1077  * where \f$j^{\mu}\f$ is baryon 4-current, \f$\rho\f$ is baryon density in the
1078  * local Eckart rest frame, and \f$\rho_0\f$ is the saturation density. The
1079  * parameters of the potential, the coefficients \f$C_i\f$ and the powers
1080  * \f$b_i\f$, are fitted to reproduce a chosen set of properties of dense
1081  * nuclear matter, and in particular these may include describing two first
1082  * order phase transitions: the well-known phase transition in ordinary nuclear
1083  * matter, and a transition at high baryon densities meant to model a possible
1084  * QCD phase transition (a "QGP-like" phase transition); see
1085  * \iref{Sorensen:2020ygf} for details and example parameter sets for the case
1086  * \f$N=4\f$. The user can decide how many terms \f$N\f$ should enter the
1087  * potential by populating the coefficients and powers vectors in the config
1088  * file with a chosen number of entries. The number of coefficients must match
1089  * the number of powers.
1090  *
1091  * The potential parameters must be specified in the `VDF` subsection of the
1092  * `%Potentials` one.
1093  */
1094 
1095 /*!\Userguide
1096  * \page doxypage_input_conf_pot_coulomb
1097  *
1098  * The Coulomb potential in SMASH includes the electric and magnetic field.
1099  * For simplicity we assume magnetostatics such that the fields can be
1100  * directly calculated as
1101  * \f[
1102  * \mathbf{E}(\mathbf{r})
1103  * = -\boldsymbol{\nabla} \phi(\mathbf{r})
1104  * = -\boldsymbol{\nabla}\int\frac{\rho(\mathbf{r}')}
1105  * {|\mathbf{r}-\mathbf{r}'|} dV'
1106  * = \int\frac{\rho(\mathbf{r}')(\mathbf{r}-\mathbf{r}')}
1107  * {|\mathbf{r}-\mathbf{r}'|^3}dV'
1108  * \f]
1109  * and
1110  * \f[
1111  * \mathbf{B}(\mathbf{r})
1112  * = \boldsymbol{\nabla}\times\mathbf{A}(\mathbf{r})
1113  * = \boldsymbol{\nabla}\times
1114  * \int\frac{\mathbf{j}(\mathbf{r}')}{|\mathbf{r}-\mathbf{r}'|}dV'
1115  * = \int\mathbf{j}(\mathbf{r}')\times
1116  * \frac{\mathbf{r}-\mathbf{r}'}{|\mathbf{r}-\mathbf{r}'|^3}dV'\;.
1117  * \f]
1118  * These integrals are solved numerically on the SMASH lattice, where the
1119  * discretized equations read
1120  * \f[
1121  * \mathbf{E}(\mathbf{r}_j)
1122  * = \sum_{i\neq j} \frac{\rho(\mathbf{r}_i)(\mathbf{r}_j-\mathbf{r}_i)}
1123  * {|\mathbf{r}_j-\mathbf{r}_i|^3}\Delta V
1124  * \f]
1125  * and
1126  * \f[
1127  * \mathbf{B}(\mathbf{r}_j)
1128  * = \sum_{i\neq j}\mathbf{j}(\mathbf{r}_i)\times
1129  * \frac{\mathbf{r}_j-\mathbf{r}_i}
1130  * {|\mathbf{r}_j-\mathbf{r}_i|^3} \Delta V
1131  * \f]
1132  * with the lattice cell volume \f$ \Delta V \f$. For efficiency the integration
1133  * volume is cut at \f$ R_\mathrm{cut} \f$, which is taken from the
1134  * configuration. Note that in the final equations the summand for \f$i=j\f$
1135  * drops out because the contribution from that cell to the integral vanishes if
1136  * one assumes the current and density to be constant in the cell.
1137  */
1138 
1139 /*!\Userguide
1140  * \page doxypage_input_conf_pot_momentum_dependence
1141  * A momentum-dependent term of the potential can be added to the Skyrme
1142  * parametrisation. In total the potential has the following form:
1143  * \f[
1144  * U(\mathbf{r}, \mathbf{p}) = A\frac{\rho(\mathbf{r})}{\rho_0} +
1145  * B\left(\frac{\rho(\mathbf{r})}{\rho_0}\right)^\tau +
1146  * \frac{2C}{\rho_0}g\int\frac{d^3p'}{(2\pi)^3}\frac{f(\mathbf{r},
1147  * \mathbf{p}')}{1+\left(\frac{\mathbf{p}-\mathbf{p}'}{\Lambda}\right)^2}
1148  * \f]
1149  * This shape of the potential is taken from \iref{Welke:1988zz}
1150  * and includes an integral over momentum. This integral is quite costly to
1151  * evaluate during runtime and to reduce numerical cost, following the GiBUU
1152  * implementation \iref{Buss:2011mx}, we make the assumption that the
1153  * distribution function takes the form of cold nuclear matter \f$ f(\mathbf{r},
1154  * \mathbf{p}) = \Theta(p-p_F)\f$, where \f$ p_F \f$ is the Fermi momentum. Note
1155  * that the Fermi momentum depends on the density and therefore on the position
1156  * in general. With this assumption the integral has an analytic solution and
1157  * can be evaluated relatively quickly. When choosing the parameters \f$ C \f$
1158  * and \f$ \Lambda\f$ it is important to make sure that nuclear ground state
1159  * properties are realistic. In other words the momentum dependence parameters
1160  * have to be constrained together with the Skyrme potential parameters.
1161  */
1162 
1163 /*!\Userguide
1164  * \page doxypage_input_conf_forced_therm
1165  *
1166  * Forced thermalization for certain regions is applied if the corresponding
1167  * `Forced_Thermalization` section is present in the configuration file.
1168  */
1169 
1170 /**
1171  * A container to keep track of all ever existed input keys.
1172  *
1173  * @remark This class has been implemented in SMASH-3.0 and for all existing
1174  * keys at that point in time it has been determined in which past
1175  * version each key had been introduced. Therefore the user can read in
1176  * this class whether a key is compatible and can be used with a given
1177  * SMASH version. However, **keys that have existed and were removed
1178  * before SMASH-3.0 are not included here**.
1179  *
1180  * @remark Each input key exists as static constant member and a reference to it
1181  * is stored in the InputKeys::list container. Therefore, the following
1182  * steps are needed in order to add a new key.
1183  * -# Add a new member being consistent with the existing notation. If
1184  * the new key belongs to a new section, you need to first create a
1185  * new member in InputSections staying consistent with the existing
1186  * notation there, too. Otherwise, find out the InputSections member
1187  * to which the new key belongs and use it in its initialisation.
1188  * Use \c _ to separate YAML sections in the new variable name and
1189  * use a name that reflects sections. A double underscore in C++ is
1190  * reserved and should not be used in identifiers; hence it must not
1191  * be used to separate sections. If any label consists of more than
1192  * one word, use lowerCamelCase convention, although this violates
1193  * the general codebase rules (it adds readability in this case).
1194  * Abbreviations are allowed, but be consistent if any already
1195  * exists. <b>Keys must be alphabetically ordered within the same
1196  * documentation section</b> (this usually matches the %YAML section)
1197  * and you need to manually ensure this.
1198  * -# Add some description to the user guide, using the same format
1199  * as for the other existing keys. In particular, one of the Doxygen
1200  * aliases among `\required_key`, `\required_key_no_line`,
1201  * `\optional_key` and `\optional_key_no_line` should be used. The
1202  * first two need four arguments (anchor in documentation, key name,
1203  * key type, validator) while the last two need 5 (the same four as
1204  * for required keys plus the default key value). Add as well a
1205  * Doxygen documentation to the new class member, by simply using
1206  * there the `\see_key` alias that needs as single argument the key
1207  * anchor in documentation you defined in the user guide.
1208  * -# If the newly introduced key has a new type w.r.t. all existing
1209  * keys, you need to add it to the \c key_references_variant alias.
1210  * In particular, you need to add a type to the \c std::variant which
1211  * will be <tt>std::reference_wrapper<const Key<NEW_TYPE>></tt> with
1212  * \c NEW_TYPE replaced by the type of your new key.
1213  * -# Add a reference to the newly introduced variable to the
1214  * InputKeys::list container. This must be done using \c std::cref as
1215  * for the other references. Respecting the members order is welcome.
1216  *
1217  * @note Validators are functions that take a value of the key type as an
1218  * argument and return a boolean indicating whether the value is valid or
1219  * not. If a key does not require a validator, use the default one
1220  * provided in the `detail` namespace. The C++ type system together with
1221  * how the Configuration class is implemented (cf. Configuration::Value
1222  * conversion operators) ensure that keys of types like `enum` (or `bool`)
1223  * cannot be assigned invalid values, so they do not require a validator.
1224  * However, this is an implementation detail and in the user guide all of
1225  * these keys are simply strings. Therefore, it is important to specify
1226  * that only valid values are accepted for such keys, which can be done by
1227  * using the <tt>\\any_valid</tt> Doxygen alias.
1228  *
1229  * @attention If you need to deprecate or to mark a key as not valid anymore,
1230  * add the corresponding SMASH version to the \c Key member
1231  * constructor invocation. <b>Do not remove a member if that key
1232  * is not valid any more!</b> It is intended to track here keys
1233  * that were existing in the past and are not accepted anymore.
1234  * After having added the version in which the key has been
1235  * deprecated or removed to the member definition, <b>adjust the user
1236  * documentation by either stating that the key is deprecated or by
1237  * moving it to the list of removed keys in the for this purpose
1238  * \ref doxypage_input_conf_removed_keys "dedicated page"</b>. This
1239  * shall be done using the `\list_removed_key` Doxygen alias. If in
1240  * doing so a full page is removed, make sure that all references to
1241  * it are removed, too. If a key is removed and no user guide key to
1242  * refer to exists anymore (which is almost always the case), change
1243  * the `\see_key` Doxygen alias to `\removed_key` in the member
1244  * documentation (pass the SMASH version number to it in which the
1245  * key has been removed as second additional argument). Look at
1246  * already \ref doxypage_input_conf_removed_keys "removed keys" for
1247  * examples.
1248  *
1249  * @note Ordering of members in this class is imposed by how keys shall appear
1250  * in the documentation. For example, in the `General` section, all
1251  * mandatory keys are listed first and all optional afterwards <b>in
1252  * alphabetical order</b>, keep it so. Although not strictly necessary,
1253  * all keys belonging to the same page are put next to each other.
1254  */
1255 struct InputKeys {
1256  /**
1257  * Get the list of valid quantity labels object.
1258  *
1259  * \note This function uses the construct-on-first-use idiom to create the
1260  * list of valid quantity labels as a function-local static variable. This
1261  * makes it possible to use the list at static storage initialization time.
1262  *
1263  * \return A constant reference to the list of valid quantity labels, which is
1264  * a \c std::set of <tt>std::string_view</tt>.
1265  */
1266  static const std::set<std::string_view>
1268  static const std::set<std::string_view> valid_labels{"t",
1269  "x",
1270  "y",
1271  "z",
1272  "mass",
1273  "p0",
1274  "px",
1275  "py",
1276  "pz",
1277  "pdg",
1278  "ID",
1279  "id",
1280  "charge",
1281  "ncoll",
1282  "form_time",
1283  "xsecfac",
1284  "proc_id_origin",
1285  "proc_type_origin",
1286  "time_last_coll",
1287  "pdg_mother1",
1288  "pdg_mother2",
1289  "baryon_number",
1290  "strangeness",
1291  "0",
1292  "tau",
1293  "eta",
1294  "eta_s",
1295  "mt",
1296  "Rap",
1297  "y_rap",
1298  "spin0",
1299  "spinx",
1300  "spiny",
1301  "spinz",
1302  "perturbative_weight"};
1303  return valid_labels;
1304  }
1305 
1306  /**
1307  * \see_key{input_configuration_copy_mechanism_}
1308  */
1309  inline static const Key<std::string> particles{
1310  {"particles"}, {"0.30"}, detail::get_default_validator<std::string>()};
1311  /**
1312  * \see_key{input_configuration_copy_mechanism_}
1313  */
1314  inline static const Key<std::string> decaymodes{
1315  {"decaymodes"}, {"0.30"}, detail::get_default_validator<std::string>()};
1316 
1317  /*!\Userguide
1318  * \page doxypage_input_conf_general
1319  * <hr>
1320  * <h3> Mandatory keys </h3>
1321  */
1322 
1323  /*!\Userguide
1324  * \page doxypage_input_conf_general
1325  * \required_key_no_line{key_gen_end_time_,End_Time,double,\f$x>0\f$}
1326  *
1327  * The time \unit{in fm} after which the evolution is stopped. Note
1328  * that the starting time depends on the chosen `Modus`.
1329  */
1330  /**
1331  * \see_key{key_gen_end_time_}
1332  */
1333  inline static const Key<double> gen_endTime{
1334  InputSections::general + "End_Time",
1335  {"0.50"},
1336  [](const double &value) noexcept { return value > 0; }};
1337 
1338  /*!\Userguide
1339  * \page doxypage_input_conf_general
1340  * \required_key{key_gen_modus_,Modus,string,\any_valid}
1341  *
1342  * Selects a modus for the calculation, e.g.\ infinite matter
1343  * calculation, collision of two particles or collision of nuclei. The modus
1344  * will be configured in the <tt>\ref doxypage_input_conf_modi "Modi"</tt>
1345  * section. Recognized values are:
1346  * - `"Collider"` &rarr; For collisions of nuclei or compound objects. See
1347  * \ref doxypage_input_conf_modi_collider "here" for further information.
1348  * - `"Sphere"` &rarr; For calculations of the expansion of a thermalized
1349  * sphere. See \ref doxypage_input_conf_modi_sphere "here" for further
1350  * information.
1351  * - `"Box"` &rarr; For infinite matter calculation in a rectangular box. See
1352  * \ref doxypage_input_conf_modi_box "here" for further information.
1353  * - `"List"` &rarr; For given external particle list. See
1354  * \ref doxypage_input_conf_modi_list "here" for further information.
1355  * - `"ListBox"` &rarr; For given external particle list in the Box. See
1356  * \ref doxypage_input_conf_modi_listbox "here" for further information.
1357  */
1358  /**
1359  * \see_key{key_gen_modus_}
1360  */
1361  inline static const Key<std::string> gen_modus{
1362  InputSections::general + "Modus",
1363  {"0.50"},
1364  [](const std::string &value) noexcept {
1365  const std::set<std::string> valid_values = {"Box", "Collider", "List",
1366  "ListBox", "Sphere"};
1367  return valid_values.count(value) > 0;
1368  }};
1369 
1370  /*!\Userguide
1371  * \page doxypage_input_conf_general
1372  * \required_key{key_gen_nevents_,Nevents,int,\f$x>0\f$}
1373  *
1374  * Number of events to calculate.
1375  *
1376  * This key may be omitted on constraint that a minimum number
1377  * of ensembles containing interactions is requested, see
1378  * \ref doxypage_input_conf_general_mne.
1379  */
1380  /**
1381  * \see_key{key_gen_nevents_}
1382  */
1383  inline static const Key<int> gen_nevents{
1384  InputSections::general + "Nevents",
1385  {"0.50"},
1386  [](const int &value) noexcept { return value > 0; }};
1387 
1388  /*!\Userguide
1389  * \page doxypage_input_conf_general
1390  * \required_key{key_gen_randomseed_,Randomseed,64bits-int,\none}
1391  *
1392  * Initial seed for the random number generator. If this is negative, the
1393  * seed will be randomly generated by the operating system.
1394  */
1395  /**
1396  * \see_key{key_gen_randomseed_}
1397  */
1398  inline static const Key<int64_t> gen_randomseed{
1399  InputSections::general + "Randomseed",
1400  {"0.50"},
1401  detail::get_default_validator<int64_t>()};
1402 
1403  /*!\Userguide
1404  * \page doxypage_input_conf_general_mne
1405  * \required_key{key_gen_mnee_maximum_ensembles_,Maximum_Ensembles_Run,int,\f$x>0\f$}
1406  *
1407  * Maximum number of ensembles run. This number serves as a safeguard
1408  * against SMASH unexpectedly running for a long time.
1409  */
1410  /**
1411  * \see_key{key_gen_mnee_maximum_ensembles_}
1412  */
1414  InputSections::g_minEnsembles + "Maximum_Ensembles_Run",
1415  {"2.2"},
1416  [](const int &value) noexcept { return value > 0; }};
1417 
1418  /*!\Userguide
1419  * \page doxypage_input_conf_general_mne
1420  * \required_key{key_gen_mnee_number_,Number,int,\f$x>0\f$}
1421  *
1422  * The number of desired non-empty ensembles.\n
1423  */
1424  /**
1425  * \see_key{key_gen_mnee_number_}
1426  */
1428  InputSections::g_minEnsembles + "Number",
1429  {"1.3"},
1430  [](const int &value) noexcept { return value > 0; }};
1431 
1432  /*!\Userguide
1433  * \page doxypage_input_conf_general
1434  * <hr>
1435  * <h3> Optional keys </h3>
1436  */
1437 
1438  /*!\Userguide
1439  * \page doxypage_input_conf_general
1440  * \optional_key_no_line{key_gen_delta_time_,Delta_Time,double,1.0,\f$x>0\f$}
1441  *
1442  * Fixed time step \unit{in fm} at which the collision-finding grid is
1443  * recreated, and, if potentials are on, momenta are updated according to the
1444  * equations of motion. The collision-finding grid finds all the collisions
1445  * from time t_{beginning_of_timestep} until time t_{beginning_of_timestep} +
1446  * `Delta_Time`, and puts them into a vector. The collisions are then sorted
1447  * in order of occurrence, and particles are propagated from collision to
1448  * collision. After each performed collision, additional collisions are found
1449  * for outgoing particles and merged into the sorted vector.
1450  *
1451  * If potentials are on, the `Delta_Time` should be small enough, typically
1452  * around 0.1 fm. However, if potentials are off, it can be arbitrarily
1453  * large. In this case it only influences the runtime, but not physics.
1454  * If `Time_Step_Mode = "None"` is chosen, then the user-provided value of
1455  * `Delta_Time` is ignored and `Delta_Time` is set to the `End_Time`.
1456  */
1457  /**
1458  * \see_key{key_gen_delta_time_}
1459  */
1460  inline static const Key<double> gen_deltaTime{
1461  InputSections::general + "Delta_Time",
1462  1.0,
1463  {"0.50"},
1464  [](const double &value) noexcept { return value > 0; }};
1465 
1466  /*!\Userguide
1467  * \page doxypage_input_conf_general
1468  * \optional_key{key_gen_derivatives_mode_,Derivatives_Mode,string,"Covariant
1469  * Gaussian",\any_valid}
1470  *
1471  * The mode of calculating the gradients, for example gradients of baryon
1472  * current. Currently SMASH supports two derivatives modes:
1473  * - <tt>"Covariant Gaussian"</tt> and
1474  * - <tt>"Finite difference"</tt>.
1475  *
1476  * Covariant Gaussian derivatives can be used when Covariant Gaussian smearing
1477  * is used; they are Lorentz covariant, but they do not calculate the time
1478  * derivative of the current properly. The `"Finite difference"` mode requires
1479  * using the lattice, and the derivatives are calculated based on finite
1480  * differences of a given quantity at adjacent lattice nodes; this mode is
1481  * numerically more efficient.
1482  */
1483  /**
1484  * \see_key{key_gen_derivatives_mode_}
1485  */
1487  InputSections::general + "Derivatives_Mode",
1489  {"2.1"},
1490  detail::get_default_validator<DerivativesMode>()};
1491 
1492  /*!\Userguide
1493  * \page doxypage_input_conf_general
1494  * \optional_key{key_gen_discrete_weight_,Discrete_Weight,double,1./3,\f$\frac{1}{7}<x<1\f$}
1495  *
1496  * Parameter for Discrete smearing: Weight given to particle density at the
1497  * the center node; cannot be smaller than 1./7 (the boundary case of 1./7
1498  * results in an even distribution of particle's density over the center node
1499  * and 6 neighboring nodes).
1500  */
1501  /**
1502  * \see_key{key_gen_discrete_weight_}
1503  */
1505  InputSections::general + "Discrete_Weight",
1506  1. / 3,
1507  {"2.1"},
1508  [](const double &value) noexcept {
1509  return value > 1. / 7. && value < 1.;
1510  }};
1511 
1512  /*!\Userguide
1513  * \page doxypage_input_conf_general
1514  * \optional_key{key_gen_ensembles_,Ensembles,int,1,\f$x>0\f$}
1515  *
1516  * Number of parallel ensembles in the simulation.
1517  *
1518  * An ensemble is an instance of the system, and without mean-field potentials
1519  * it is practically equivalent to a completely separate and uncorrelated
1520  * event. Each ensemble is an independent simulation: initialization,
1521  * collisions, decays, box wall crossings, and propagation of particles is
1522  * performed independently within each ensemble.
1523  *
1524  * However, the densities and mean-field potentials are computed as averages
1525  * over all ensembles (within a given event). This process can be also viewed
1526  * as calculating densities and mean-fields by summing over particles in all
1527  * ensembles combined, where each particle contributes to the local charge
1528  * with a weight of 1/n_ensembles. Such technique is called the *parallel
1529  * ensemble* technique. It increases the statistics necessary for a precise
1530  * density calculation without increasing the number of collisions, which is
1531  * not the case in the *full ensemble* method (see <tt>\ref
1532  * key_gen_testparticles_ "Testparticles"</tt> description). Because of this,
1533  * the parallel ensembles technique is computationally faster than the full
1534  * ensemble technique.
1535  */
1536  /**
1537  * \see_key{key_gen_ensembles_}
1538  */
1539  inline static const Key<int> gen_ensembles{
1540  InputSections::general + "Ensembles",
1541  1,
1542  {"2.1"},
1543  [](const int &value) noexcept { return value > 0; }};
1544 
1545  /*!\Userguide
1546  * \page doxypage_input_conf_general
1547  * \optional_key{key_gen_expansion_rate_,Expansion_Rate,double,0.1,\none}
1548  *
1549  * Corresponds to the speed of expansion of the universe in non-Minkowski
1550  * metrics if <tt>\ref key_gen_metric_type_ "Metric_Type"</tt> is any other
1551  * than `"NoExpansion"`.
1552  *
1553  * It corresponds to \f$b_r/l_0\f$ if the metric type is `"MasslessFRW"` or
1554  * `"MassiveFRW"`, and to the parameter b in the exponential expansion where
1555  * \f$a(t) ~ e^{bt/2}\f$.
1556  *
1557  * Refer to section 2 of \iref{Tindall:2016try} for more information about
1558  * possible range of values and their physical meaning.
1559  */
1560  /**
1561  * \see_key{key_gen_expansion_rate_}
1562  */
1563  inline static const Key<double> gen_expansionRate{
1564  InputSections::general + "Expansion_Rate",
1565  0.1,
1566  {"1.1"},
1567  detail::get_default_validator<double>()};
1568 
1569  /*!\Userguide
1570  * \page doxypage_input_conf_general
1571  * \optional_key{key_gen_field_derivatives_mode_,Field_Derivatives_Mode,string,
1572  * "Chain Rule",\any_valid}
1573  *
1574  * The mode of calculating field derivatives entering the equations of motion
1575  * (only available for the VDF potentials). The mean-field equations of motion
1576  * are proportional to temporal and spatial derivatives of the potential,
1577  * which themselves depend on the baryon number density. When calculating
1578  * these derivatives numerically, one can either take finite differences of
1579  * the potential itself (direct field derivatives), or use the chain rule and
1580  * take finite differences of the baryon number density (chain rule field
1581  * derivatives). Using direct field derivatives is numerically (slightly) more
1582  * stable. For more information and explicit equations, see section 4.2.5 (p.
1583  * 130) and Table 4.3 (p. 137) of \iref{Sorensen:2021zxd}.
1584  *
1585  * - `"Direct"` &rarr; Induces using the computed values of the baryon
1586  * 4-current on the lattice to calculate a lattice of the 4-field
1587  * \f$A^\mu\f$, finite differences of which are used to obtain the VDF
1588  * equations of motion.
1589  * - `"Chain Rule"` &rarr; Uses the chain rule and finite differences of the
1590  * baryon number 4-current to obtain the the VDF equations of motion.
1591  */
1592  /**
1593  * \see_key{key_gen_derivatives_mode_}
1594  */
1596  InputSections::general + "Field_Derivatives_Mode",
1598  {"2.1"},
1599  detail::get_default_validator<FieldDerivativesMode>()};
1600 
1601  /*!\Userguide
1602  * \page doxypage_input_conf_general
1603  * \optional_key{key_gen_gauss_cutoff_in_sigma_,Gauss_Cutoff_In_Sigma,double,4.0,
1604  * \f$2\leq x\leq10\f$}
1605  *
1606  * Parameter for Covariant Gaussian smearing: Distance in sigma at which
1607  * gaussian is considered 0. Lower bound avoids density loss; upper bound
1608  * avoids slow computation.
1609  */
1610  /**
1611  * \see_key{key_gen_gauss_cutoff_in_sigma_}
1612  */
1614  InputSections::general + "Gauss_Cutoff_In_Sigma",
1615  4.0,
1616  {"0.80"},
1617  [](const double &value) noexcept {
1618  return value >= 2.0 && value <= 10.0;
1619  }};
1620 
1621  /*!\Userguide
1622  * \page doxypage_input_conf_general
1623  * \optional_key{key_gen_gaussian_sigma_,Gaussian_Sigma,double,1.0,\f$0.1<x<3\f$}
1624  *
1625  * Parameter for Covariant Gaussian smearing: Width \unit{in fm} of Gaussian
1626  * distributions that represent Wigner density of particles. Technically any
1627  * positive value is allowed, but other than accepted values may lead to
1628  * unstable behavior.
1629  */
1630  /**
1631  * \see_key{key_gen_gaussian_sigma_}
1632  */
1634  InputSections::general + "Gaussian_Sigma",
1635  1.0,
1636  {"0.60"},
1637  [](const double &value) noexcept { return value > 0.1 && value < 3.0; }};
1638 
1639  /*!\Userguide
1640  * \page doxypage_input_conf_general
1641  * \optional_key{key_gen_metric_type_,Metric_Type,string,"NoExpansion",\any_valid}
1642  *
1643  * Select which kind of expansion the metric should have. This needs only be
1644  * specified for the sphere modus. Possible values:
1645  * - `"NoExpansion"` &rarr; Default SMASH run, with Minkowski metric
1646  * - `"MasslessFRW"` &rarr; FRW expansion going as \f$t^{1/2}\f$
1647  * - `"MassiveFRW"` &rarr; FRW expansion going as \f$t^{2/3}\f$
1648  * - `"Exponential"` &rarr; FRW expansion going as \f$e^{t/2}\f$
1649  *
1650  * Refer to section 2 of \iref{Tindall:2016try} for more information about
1651  * possible range of values and their physical meaning.
1652  */
1653  /**
1654  * \see_key{key_gen_metric_type_}
1655  */
1656  inline static const Key<ExpansionMode> gen_metricType{
1657  InputSections::general + "Metric_Type",
1659  {"1.1"},
1660  detail::get_default_validator<ExpansionMode>()};
1661 
1662  /*!\Userguide
1663  * \page doxypage_input_conf_removed_keys
1664  *
1665  * \list_removed_key{key_gen_rfdd_mode_,General.Rest_Frame_Density_Derivatives_Mode,3.0}.
1666  */
1667  /**
1668  * \removed_key{key_gen_rfdd_mode_,3.0}
1669  */
1670  inline static const Key<RestFrameDensityDerivativesMode>
1672  InputSections::general + "Rest_Frame_Density_Derivatives_Mode",
1674  {"2.1", "3.0", "3.0"},
1675  detail::get_default_validator<RestFrameDensityDerivativesMode>()};
1676 
1677  /*!\Userguide
1678  * \page doxypage_input_conf_general
1679  * \optional_key{key_gen_smearing_mode_,Smearing_Mode,string,"Covariant
1680  * Gaussian",\any_valid}
1681  *
1682  * The mode of smearing for density calculation.
1683  *
1684  * Smearing is necessary to ensure a smooth gradient calculation, and it can
1685  * be thought of as smoothing out charge density fluctuations due to the
1686  * finite number of test-particles used. In general, this is done by
1687  * distributing the contribution to charge density from a given particle
1688  * according to some prescription. For example, in Gaussian smearing the
1689  * charge density of a particle is given by a Gaussian with some chosen width,
1690  * centered at the position of the particle; the Gaussian is normalized such
1691  * that integrating over the entire space yields the charge of the particle.
1692  * In result, the particle's charge is "smeared" over the space around it.
1693  * Note that the case with no smearing is recovered when the charge
1694  * contribution from each particle is taken to be a Dirac delta function
1695  * centered at the position of the particle.
1696  *
1697  * Currently, SMASH supports three smearing modes:
1698  * -# <tt>"Covariant Gaussian"</tt>\n
1699  * This smearing represents the charge density of a particle as a Gaussian
1700  * centered at the position of a particle; the user can specify the width
1701  * and the cutoff of the Gaussian (the employed Gaussians, in principle
1702  * non-zero over the entire available space, are "cut off" at some distance
1703  * r_cut from the particle to improve calculation time). This smearing is
1704  * Lorentz covariant which results in correct density profiles of
1705  * relativistic systems. The downside of the smearing is its long
1706  * computation time, as well as the fact that when the density is added to
1707  * lattice nodes, it is done so by Euler approximation (using the density
1708  * value at the lattice node), which does not conserve the number of
1709  * particles on the lattice.
1710  * -# <tt>"Triangular"</tt>\n
1711  * This smearing requires lattice; it represents the charge density of a
1712  * particle in a given space direction as a "triangle" peaking at the
1713  * particle's position and linearly decreasing over a specified range. The
1714  * user specifies the range of the smearing in units of lattice spacings.
1715  * This smearing is relatively fast, and it does conserve the number of
1716  * particles on the lattice (due to the fact that the Euler integration is
1717  * exact for a linear function).
1718  * -# <tt>"Discrete"</tt>\n
1719  * This smearing requires lattice; the easiest of all smearing modes, it
1720  * adds a specified portion of the particle's charge density to a node
1721  * closest to the particle's position, and distributes the remainder evenly
1722  * among the 6 nearest neighbor nodes. The user specifies the weight given
1723  * to the center node; for example, if this weight is 1/3, then each of the
1724  * six nearest neighbor nodes gets 1/9 of the particle's charge. This
1725  * smearing is extremely fast, but is also rather coarse and requires using
1726  * a large number of test-particles to produce smooth gradients.
1727  */
1728  /**
1729  * \see_key{key_gen_smearing_mode_}
1730  */
1732  InputSections::general + "Smearing_Mode",
1734  {"2.1"},
1735  detail::get_default_validator<SmearingMode>()};
1736 
1737  /*!\Userguide
1738  * \page doxypage_input_conf_general
1739  * \optional_key{key_gen_testparticles_,Testparticles,int,1,\f$x>0\f$}
1740  *
1741  * Number of test-particles per real particle in the simulation.
1742  *
1743  * The number of initial sampled particles is increased by this factor,
1744  * while all cross sections are decreased by this factor. In this
1745  * way the mean free path does not change. Larger number of testparticles
1746  * helps to reduce spurious effects of geometric collision criterion
1747  * (see \iref{Cheng:2001dz}). It also reduces correlations related
1748  * to collisions and decays (but not the ones related to mean fields),
1749  * therefore the larger the number of testparticles, the closer the results
1750  * of the simulations should be to the solution of the Boltzmann equation.
1751  * These advantages come at a cost of a larger computational time.
1752  *
1753  * Testparticles are a way to increase statistics necessary for
1754  * precise density calculation, which is why they are needed for mean-field
1755  * potentials. The technique of using testparticles for mean field
1756  * is called the *full ensemble* technique. The number of collisions (and
1757  * consequently the simulation time) scales as square of the number of
1758  * testparticles, and that is why a full ensemble is slower than a parallel
1759  * ensemble.
1760  */
1761  /**
1762  * \see_key{key_gen_testparticles_}
1763  */
1764  inline static const Key<int> gen_testparticles{
1765  InputSections::general + "Testparticles",
1766  1,
1767  {"0.50"},
1768  [](const int &value) noexcept {
1769  if (value >= 150) {
1770  logg[LogArea::Configuration::id].warn(
1771  "Number of testparticles is very large, which may lead to long"
1772  "runtime. Make sure that this is intended.");
1773  }
1774  return value > 0;
1775  }};
1776 
1777  /*!\Userguide
1778  * \page doxypage_input_conf_general
1779  * \optional_key{key_gen_time_step_mode_,Time_Step_Mode,string,"Fixed",\any_valid}
1780  *
1781  * The mode of time stepping. Possible values:
1782  * - `"None"` &rarr; `Delta_Time` is set to the `End_Time`. This cannot be
1783  * used with potentials.
1784  * - `"Fixed"`&rarr; Fixed-sized time steps at which collision-finding grid is
1785  * created. More efficient for systems with many particles. The `Delta_Time`
1786  * is provided by user.
1787  *
1788  * For `Delta_Time` explanation see \ref key_gen_delta_time_ "here".
1789  *
1790  * If the box modus is employed, only the `"Fixed"` time step mode can be used
1791  * and the value of `Delta_Time` cannot be too large. For a more detailed
1792  * explanation, see \ref doxypage_input_conf_modi_box "box modus".
1793  *
1794  */
1795  /**
1796  * \see_key{key_gen_time_step_mode_}
1797  */
1799  InputSections::general + "Time_Step_Mode",
1801  {"0.85"},
1802  detail::get_default_validator<TimeStepMode>()};
1803 
1804  /*!\Userguide
1805  * \page doxypage_input_conf_general
1806  * \optional_key{key_gen_triangular_range_,Triangular_Range,double,2.0,\f$x>0\f$}
1807  *
1808  * Parameter for Triangular smearing: Half of the base of a symmetric triangle
1809  * that represents particle density, in units of lattice spacings.
1810  */
1811  /**
1812  * \see_key{key_gen_triangular_range_}
1813  */
1815  InputSections::general + "Triangular_Range",
1816  2.0,
1817  {"2.1"},
1818  [](const double &value) noexcept { return value > 0; }};
1819 
1820  /*!\Userguide
1821  * \page doxypage_input_conf_general
1822  * \optional_key{key_gen_use_grid_,Use_Grid,bool,true,\none}
1823  *
1824  * - `true` &rarr; A grid is used to reduce the combinatorics of interaction
1825  * lookup.
1826  * - `false` &rarr; No grid is used.
1827  */
1828  /**
1829  * \see_key{key_gen_use_grid_}
1830  */
1831  inline static const Key<bool> gen_useGrid{
1832  InputSections::general + "Use_Grid",
1833  true,
1834  {"0.80"},
1835  detail::get_default_validator<bool>()};
1836 
1837  /*!\Userguide
1838  * \page doxypage_input_conf_logging
1839  * <hr>
1840  * <h3> Setting the default for all logging areas </h3>
1841  *
1842  * \optional_key_no_line{key_log_default_,default,string,ALL,\any_valid}
1843  *
1844  * It determines the default logging level for all areas. This is annotated by
1845  * \key ${default} in each of the following keys.
1846  */
1847  /**
1848  * \see_key{key_log_default_}
1849  */
1851  InputSections::logging + "default",
1852  einhard::ALL,
1853  {"0.50"},
1854  detail::get_default_validator<einhard::LogLevel>()};
1855 
1856  /*!\Userguide
1857  * \page doxypage_input_conf_logging
1858  * <hr>
1859  * <h3> Most user-relevant logging areas </h3>
1860  *
1861  * \optional_key_no_line{key_log_box_,Box,string,$\{\ref key_log_default_
1862  * "default"\},\any_valid}
1863  *
1864  * Messages specific to the box modus implementation belong to this area.
1865  */
1866  /**
1867  * \see_key{key_log_box_}
1868  */
1869  inline static const Key<einhard::LogLevel> log_box{
1870  InputSections::logging + "Box",
1872  {"0.30"},
1873  detail::get_default_validator<einhard::LogLevel>()};
1874 
1875  /*!\Userguide
1876  * \page doxypage_input_conf_logging
1877  * \optional_key{key_log_collider_,Collider,string,$\{\ref key_log_default_
1878  * "default"\},\any_valid}
1879  *
1880  * Messages specific to the collider modus implementation belong to this area.
1881  */
1882  /**
1883  * \see_key{key_log_collider_}
1884  */
1886  InputSections::logging + "Collider",
1888  {"0.30"},
1889  detail::get_default_validator<einhard::LogLevel>()};
1890 
1891  /*!\Userguide
1892  * \page doxypage_input_conf_logging
1893  * \optional_key{key_log_configuration_,%Configuration,string,$\{\ref
1894  * key_log_default_ "default"\},\any_valid}
1895  *
1896  * Messages about the input configuration file belong to this area.
1897  */
1898  /**
1899  * \see_key{key_log_configuration_}
1900  */
1902  InputSections::logging + "Configuration",
1904  {"3.0"},
1905  detail::get_default_validator<einhard::LogLevel>()};
1906 
1907  /*!\Userguide
1908  * \page doxypage_input_conf_logging
1909  * \optional_key{key_log_experiment_,%Experiment,string,$\{\ref
1910  * key_log_default_ "default"\},\any_valid}
1911  *
1912  * Messages mostly coming from the `Experiment` class belong to this area.
1913  */
1914  /**
1915  * \see_key{key_log_experiment_}
1916  */
1918  InputSections::logging + "Experiment",
1920  {"0.50"},
1921  detail::get_default_validator<einhard::LogLevel>()};
1922 
1923  /*!\Userguide
1924  * \page doxypage_input_conf_logging
1925  * \optional_key{key_log_grandcan_thermalizer_,GrandcanThermalizer,string,$\{\ref
1926  * key_log_default_ "default"\},\any_valid}
1927  *
1928  * Messages about the gran-canonical thermalization belong to this area.
1929  */
1930  /**
1931  * \see_key{key_log_grandcan_thermalizer_}
1932  */
1934  InputSections::logging + "GrandcanThermalizer",
1936  {"1.2"},
1937  detail::get_default_validator<einhard::LogLevel>()};
1938 
1939  /*!\Userguide
1940  * \page doxypage_input_conf_logging
1941  * \optional_key{key_log_initial_conditions_,InitialConditions,string,$\{\ref
1942  * key_log_default_ "default"\},\any_valid}
1943  *
1944  * Messages about initial conditions belong to this area.
1945  */
1946  /**
1947  * \see_key{key_log_initial_conditions_}
1948  */
1950  InputSections::logging + "InitialConditions",
1952  {"1.8"},
1953  detail::get_default_validator<einhard::LogLevel>()};
1954 
1955  /*!\Userguide
1956  * \page doxypage_input_conf_logging
1957  * \optional_key{key_log_list_,List,string,$\{\ref key_log_default_
1958  * "default"\},\any_valid}
1959  *
1960  * Messages specific to the list modus implementation belong to this area.
1961  */
1962  /**
1963  * \see_key{key_log_list_}
1964  */
1965  inline static const Key<einhard::LogLevel> log_list{
1966  InputSections::logging + "List",
1968  {"0.60"},
1969  detail::get_default_validator<einhard::LogLevel>()};
1970 
1971  /*!\Userguide
1972  * \page doxypage_input_conf_logging
1973  * \optional_key{key_log_main_,Main,string,$\{\ref key_log_default_
1974  * "default"\},\any_valid}
1975  *
1976  * Messages coming from top-level of the application belong to this area.
1977  */
1978  /**
1979  * \see_key{key_log_main_}
1980  */
1981  inline static const Key<einhard::LogLevel> log_main{
1982  InputSections::logging + "Main",
1984  {"0.50"},
1985  detail::get_default_validator<einhard::LogLevel>()};
1986 
1987  /*!\Userguide
1988  * \page doxypage_input_conf_logging
1989  * \optional_key{key_log_output_,Output,string,$\{\ref key_log_default_
1990  * "default"\},\any_valid}
1991  *
1992  * Messages output functionality belong to this area.
1993  */
1994  /**
1995  * \see_key{key_log_output_}
1996  */
1997  inline static const Key<einhard::LogLevel> log_output{
1998  InputSections::logging + "Output",
2000  {"0.60"},
2001  detail::get_default_validator<einhard::LogLevel>()};
2002 
2003  /*!\Userguide
2004  * \page doxypage_input_conf_logging
2005  * \optional_key{key_log_potentials_,Potentials,string,$\{\ref
2006  * key_log_default_ "default"\},\any_valid}
2007  *
2008  * Messages regarding the potentials belong to this area.
2009  */
2010  /**
2011  * \see_key{key_log_potentials_}
2012  */
2014  InputSections::logging + "Potentials",
2016  {"3.1"},
2017  detail::get_default_validator<einhard::LogLevel>()};
2018 
2019  /*!\Userguide
2020  * \page doxypage_input_conf_logging
2021  * \optional_key{key_log_rootsolver_,RootSolver,string,$\{\ref
2022  * key_log_default_ "default"\},\any_valid}
2023  *
2024  * Messages specific to the root finding belong to this area.
2025  */
2026  /**
2027  * \see_key{key_log_rootsolver_}
2028  */
2030  InputSections::logging + "RootSolver",
2032  {"3.1"},
2033  detail::get_default_validator<einhard::LogLevel>()};
2034 
2035  /*!\Userguide
2036  * \page doxypage_input_conf_logging
2037  * \optional_key{key_log_sphere_,Sphere,string,$\{\ref key_log_default_
2038  * "default"\},\any_valid}
2039  *
2040  * Messages specific to the sphere modus implementation belong to this area.
2041  */
2042  /**
2043  * \see_key{key_log_sphere_}
2044  */
2045  inline static const Key<einhard::LogLevel> log_sphere{
2046  InputSections::logging + "Sphere",
2048  {"0.30"},
2049  detail::get_default_validator<einhard::LogLevel>()};
2050 
2051  /*!\Userguide
2052  * \page doxypage_input_conf_logging
2053  * <hr>
2054  * <h3> Most technical logging areas (in alphabetical order) </h3>
2055  *
2056  * \optional_key_no_line{key_log_action_,%Action,string,$\{\ref
2057  * key_log_default_ "default"\},\any_valid}
2058  *
2059  * Messages mostly coming from the `Action` class belong to this area.
2060  */
2061  /**
2062  * \see_key{key_log_action_}
2063  */
2064  inline static const Key<einhard::LogLevel> log_action{
2065  InputSections::logging + "Action",
2067  {"0.50"},
2068  detail::get_default_validator<einhard::LogLevel>()};
2069 
2070  /*!\Userguide
2071  * \page doxypage_input_conf_logging
2072  * \optional_key{key_log_clock_,%Clock,string,$\{\ref key_log_default_
2073  * "default"\},\any_valid}
2074  *
2075  * Messages coming from clock implementation belong to this area.
2076  */
2077  /**
2078  * \see_key{key_log_clock_}
2079  */
2080  inline static const Key<einhard::LogLevel> log_clock{
2081  InputSections::logging + "Clock",
2083  {"0.50"},
2084  detail::get_default_validator<einhard::LogLevel>()};
2085 
2086  /*!\Userguide
2087  * \page doxypage_input_conf_logging
2088  * \optional_key{key_log_cross_sections_,%CrossSections,string,$\{\ref
2089  * key_log_default_ "default"\},\any_valid}
2090  *
2091  * Messages about cross sections belong to this area.
2092  */
2093  /**
2094  * \see_key{key_log_cross_sections_}
2095  */
2097  InputSections::logging + "CrossSections",
2099  {"1.3"},
2100  detail::get_default_validator<einhard::LogLevel>()};
2101 
2102  /*!\Userguide
2103  * \page doxypage_input_conf_logging
2104  * \optional_key{key_log_decay_modes_,%DecayModes,string,$\{\ref
2105  * key_log_default_ "default"\},\any_valid}
2106  *
2107  * Messages coming from decay tools belong to this area.
2108  */
2109  /**
2110  * \see_key{key_log_decay_modes_}
2111  */
2113  InputSections::logging + "DecayModes",
2115  {"0.50"},
2116  detail::get_default_validator<einhard::LogLevel>()};
2117 
2118  /*!\Userguide
2119  * \page doxypage_input_conf_logging
2120  * \optional_key{key_log_density_,Density,string,$\{\ref key_log_default_
2121  * "default"\},\any_valid}
2122  *
2123  * Messages coming from density calculations belong to this area.
2124  */
2125  /**
2126  * \see_key{key_log_density_}
2127  */
2129  InputSections::logging + "Density",
2131  {"0.60"},
2132  detail::get_default_validator<einhard::LogLevel>()};
2133 
2134  /*!\Userguide
2135  * \page doxypage_input_conf_logging
2136  * \optional_key{key_log_distributions_,Distributions,string,$\{\ref
2137  * key_log_default_ "default"\},\any_valid}
2138  *
2139  * Messages about quantity distributions belong to this area.
2140  */
2141  /**
2142  * \see_key{key_log_distributions_}
2143  */
2145  InputSections::logging + "Distributions",
2147  {"0.50"},
2148  detail::get_default_validator<einhard::LogLevel>()};
2149 
2150  /*!\Userguide
2151  * \page doxypage_input_conf_logging
2152  * \optional_key{key_log_find_scatter_,FindScatter,string,$\{\ref
2153  * key_log_default_ "default"\},\any_valid}
2154  *
2155  * Messages coming from search tools for scattering belong to this area.
2156  */
2157  /**
2158  * \see_key{key_log_find_scatter_}
2159  */
2161  InputSections::logging + "FindScatter",
2163  {"0.50"},
2164  detail::get_default_validator<einhard::LogLevel>()};
2165 
2166  /*!\Userguide
2167  * \page doxypage_input_conf_logging
2168  * \optional_key{key_log_fpe_,Fpe,string,$\{\ref key_log_default_
2169  * "default"\},\any_valid}
2170  *
2171  * Messages about floating point exceptions belong to this area.
2172  */
2173  /**
2174  * \see_key{key_log_fpe_}
2175  */
2176  inline static const Key<einhard::LogLevel> log_fpe{
2177  InputSections::logging + "Fpe",
2179  {"0.80"},
2180  detail::get_default_validator<einhard::LogLevel>()};
2181 
2182  /*!\Userguide
2183  * \page doxypage_input_conf_logging
2184  * \optional_key{key_log_grid_,%Grid,string,$\{\ref key_log_default_
2185  * "default"\},\any_valid}
2186  *
2187  * Messages coming from the grid implementation belong to this area.
2188  */
2189  /**
2190  * \see_key{key_log_grid_}
2191  */
2192  inline static const Key<einhard::LogLevel> log_grid{
2193  InputSections::logging + "Grid",
2195  {"0.50"},
2196  detail::get_default_validator<einhard::LogLevel>()};
2197 
2198  /*!\Userguide
2199  * \page doxypage_input_conf_logging
2200  * \optional_key{key_log_hyper_surface_crossing_,HyperSurfaceCrossing,string,$\{\ref
2201  * key_log_default_ "default"\},\any_valid}
2202  *
2203  * Messages about hypersurface crossing belong to this area.
2204  */
2205  /**
2206  * \see_key{key_log_hyper_surface_crossing_}
2207  */
2209  InputSections::logging + "HyperSurfaceCrossing",
2211  {"1.7"},
2212  detail::get_default_validator<einhard::LogLevel>()};
2213 
2214  /*!\Userguide
2215  * \page doxypage_input_conf_logging
2216  * \optional_key{key_log_input_parser_,InputParser,string,$\{\ref
2217  * key_log_default_ "default"\},\any_valid}
2218  *
2219  * Messages coming from input parsing tools belong to this area.
2220  */
2221  /**
2222  * \see_key{key_log_input_parser_}
2223  */
2225  InputSections::logging + "InputParser",
2227  {"0.50"},
2228  detail::get_default_validator<einhard::LogLevel>()};
2229 
2230  /*!\Userguide
2231  * \page doxypage_input_conf_logging
2232  * \optional_key{key_log_lattice_,Lattice,string,$\{\ref key_log_default_
2233  * "default"\},\any_valid}
2234  *
2235  * Messages coming from the lattice implementation belong to this area.
2236  */
2237  /**
2238  * \see_key{key_log_lattice_}
2239  */
2241  InputSections::logging + "Lattice",
2243  {"0.80"},
2244  detail::get_default_validator<einhard::LogLevel>()};
2245 
2246  /*!\Userguide
2247  * \page doxypage_input_conf_logging
2248  * \optional_key{key_log_nucleus_,%Nucleus,string,$\{\ref key_log_default_
2249  * "default"\},\any_valid}
2250  *
2251  * Messages coming from the nucleus implementation belong to this area.
2252  */
2253  /**
2254  * \see_key{key_log_nucleus_}
2255  */
2257  InputSections::logging + "Nucleus",
2259  {"0.30"},
2260  detail::get_default_validator<einhard::LogLevel>()};
2261 
2262  /*!\Userguide
2263  * \page doxypage_input_conf_logging
2264  * \optional_key{key_log_particle_type_,%ParticleType,string,$\{\ref
2265  * key_log_default_ "default"\},\any_valid}
2266  *
2267  * Messages coming from particle types implementation belong to this area.
2268  */
2269  /**
2270  * \see_key{key_log_particle_type_}
2271  */
2273  InputSections::logging + "ParticleType",
2275  {"0.50"},
2276  detail::get_default_validator<einhard::LogLevel>()};
2277 
2278  /*!\Userguide
2279  * \page doxypage_input_conf_logging
2280  * \optional_key{key_log_pauli_blocking_,PauliBlocking,string,$\{\ref
2281  * key_log_default_ "default"\},\any_valid}
2282  *
2283  * Messages about Pauli blocking belong to this area.
2284  */
2285  /**
2286  * \see_key{key_log_pauli_blocking_}
2287  */
2289  InputSections::logging + "PauliBlocking",
2291  {"0.7.1"},
2292  detail::get_default_validator<einhard::LogLevel>()};
2293 
2294  /*!\Userguide
2295  * \page doxypage_input_conf_logging
2296  * \optional_key{key_log_propagation_,Propagation,string,$\{\ref
2297  * key_log_default_ "default"\},\any_valid}
2298  *
2299  * Messages about particles propagation belong to this area.
2300  */
2301  /**
2302  * \see_key{key_log_propagation_}
2303  */
2305  InputSections::logging + "Propagation",
2307  {"0.7.1"},
2308  detail::get_default_validator<einhard::LogLevel>()};
2309 
2310  /*!\Userguide
2311  * \page doxypage_input_conf_logging
2312  * \optional_key{key_log_pythia_,Pythia,string,$\{\ref key_log_default_
2313  * "default"\},\any_valid}
2314  *
2315  * Messages coming from Pythia usage in SMASH belong to this area.
2316  */
2317  /**
2318  * \see_key{key_log_pythia_}
2319  */
2320  inline static const Key<einhard::LogLevel> log_pythia{
2321  InputSections::logging + "Pythia",
2323  {"1.0"},
2324  detail::get_default_validator<einhard::LogLevel>()};
2325 
2326  /*!\Userguide
2327  * \page doxypage_input_conf_logging
2328  * \optional_key{key_log_resonances_,Resonances,string,$\{\ref
2329  *key_log_default_ "default"\},\any_valid}
2330  *
2331  ** Messages coming from resonances aspects belong to this area.
2332  */
2333  /**
2334  * \see_key{key_log_resonances_}
2335  */
2337  InputSections::logging + "Resonances",
2339  {"0.50"},
2340  detail::get_default_validator<einhard::LogLevel>()};
2341 
2342  /*!\Userguide
2343  * \page doxypage_input_conf_logging
2344  * \optional_key{key_log_scatter_action_,%ScatterAction,string,$\{\ref
2345  * key_log_default_ "default"\},\any_valid}
2346  *
2347  * Messages about scattering events belong to this area.
2348  */
2349  /**
2350  * \see_key{key_log_scatter_action_}
2351  */
2353  InputSections::logging + "ScatterAction",
2355  {"0.50"},
2356  detail::get_default_validator<einhard::LogLevel>()};
2357 
2358  /*!\Userguide
2359  * \page doxypage_input_conf_logging
2360  * \optional_key{key_log_scatter_action_multi_,%ScatterActionMulti,string,$\{\ref
2361  * key_log_default_ "default"\},\any_valid}
2362  *
2363  * Messages about scattering events with multiple particles belong to this
2364  * area.
2365  */
2366  /**
2367  * \see_key{key_log_scatter_action_multi_}
2368  */
2370  InputSections::logging + "ScatterActionMulti",
2372  {"2.0"},
2373  detail::get_default_validator<einhard::LogLevel>()};
2374 
2375  /*!\Userguide
2376  * \page doxypage_input_conf_logging
2377  * \optional_key{key_log_tmn_,Tmn,string,$\{\ref key_log_default_
2378  * "default"\},\any_valid}
2379  *
2380  * Messages about the energy momentum tensor belong to this area.
2381  */
2382  /**
2383  * \see_key{key_log_tmn_}
2384  */
2385  inline static const Key<einhard::LogLevel> log_tmn{
2386  InputSections::logging + "Tmn",
2388  {"0.80"},
2389  detail::get_default_validator<einhard::LogLevel>()};
2390 
2391  /*!\Userguide
2392  * \page doxypage_input_conf_removed_keys
2393  *
2394  * \list_removed_key{key_version_,Version,3.2}
2395  */
2396  /**
2397  * \removed_key{key_version_,3.2}
2398  */
2399  inline static const Key<std::string> version{
2400  {"Version"},
2401  {"1.0", "3.0", "3.2"},
2402  detail::get_default_validator<std::string>()};
2403 
2404  /*!\Userguide
2405  * \page doxypage_input_conf_ct_heavy_flavor
2406  * \optional_key{key_CT_HF_AQM_b_suppression_,AQM_Bottom_Suppression,double,
2407  * 0.93,\f$0\leq x\leq 1\f$}
2408  *
2409  * Suppression parameter for AQM cross sections involving a bottom hadron.
2410  * Default value taken from Angantyr (\iref{Bierlich:2022pfr}).
2411  */
2412  /**
2413  * \see_key{key_CT_additional_el_cs_}
2414  */
2416  InputSections::c_heavyFlavor + "AQM_Bottom_Suppression",
2417  0.93,
2418  {"3.2"},
2419  [](const double &value) noexcept {
2420  return value >= 0.0 && value <= 1.0;
2421  }};
2422 
2423  /*!\Userguide
2424  * \page doxypage_input_conf_ct_heavy_flavor
2425  * \optional_key{key_CT_HF_AQM_c_suppression_,AQM_Charm_Suppression,double,
2426  * 0.8,\f$0\leq x\leq 1\f$}
2427  *
2428  * Suppression parameter for AQM cross sections involving a charm hadron.
2429  * Default value taken from Angantyr (\iref{Bierlich:2022pfr}).
2430  */
2431  /**
2432  * \see_key{key_CT_additional_el_cs_}
2433  */
2435  InputSections::c_heavyFlavor + "AQM_Charm_Suppression",
2436  0.8,
2437  {"3.2"},
2438  [](const double &value) noexcept {
2439  return value >= 0.0 && value <= 1.0;
2440  }};
2441 
2442  /*!\Userguide
2443  * \page doxypage_input_conf_collision_term
2444  * \optional_key{key_CT_additional_el_cs_,Additional_Elastic_Cross_Section,
2445  * double,0.0,\none}
2446  *
2447  * Add an additional constant contribution \unit{in mb} to the elastic cross
2448  * section.
2449  * \warning Most elastic cross sections are constrained by experimental data.
2450  * Adding an additional contribution to them will therefore lead to
2451  * nonphysical results and is only meant for explorative studies.
2452  */
2453  /**
2454  * \see_key{key_CT_additional_el_cs_}
2455  */
2457  InputSections::collisionTerm + "Additional_Elastic_Cross_Section",
2458  0.0,
2459  {"2.0"},
2460  [](const double &value) noexcept {
2461  if (value < 0.0 || value > 300.0) {
2462  logg[LogArea::Configuration::id].warn(
2463  "The additional elastic cross section is set to a value that is "
2464  "either negative or very large,\nwhich may lead to nonphysical "
2465  "results. Make sure that this is intended.");
2466  }
2467  return true;
2468  }};
2469 
2470  /*!\Userguide
2471  * \page doxypage_input_conf_ct_heavy_flavor
2472  * \optional_key{key_CT_charm_rescattering_,Charm_Rescattering_Method,string,
2473  * "resonances",\any_valid}
2474  *
2475  * With this key, the method of charm rescattering at lower energies can be
2476  * chosen for two to two reactions including charmed hadrons that are
2477  * mentioned in <tt>\ref key_CT_included_2to2_ "Included_2to2"</tt>.
2478  *
2479  * - `"resonances"` &rarr; Charm interactions are realized via resonance
2480  * formations.
2481  * - `"T-matrix"` &rarr; Tabulated cross sections (\iref{Abreu:2011ic},
2482  * \iref{Tolos:2013kva}, \iref{Torres-Rincon:2014ffa}) are used, which
2483  * handle elastic and inelastic binary collisions.
2484  * @attention Currently, only the following interactions are included:
2485  * \f$ D\pi \leftrightarrow D\pi \f$, \f$ D\eta \leftrightarrow D\eta \f$,
2486  * \f$ DK \leftrightarrow DK \f$, \f$ DN \leftrightarrow DN \f$,
2487  * \f$ D\Delta \leftrightarrow D\Delta \f$, \f$ D^*\pi \leftrightarrow
2488  * D^*\pi \f$, \f$ D^*\eta \leftrightarrow D^*\eta \f$, and \f$ D^*K
2489  * \leftrightarrow D^*K \f$.<br>
2490  * \f$ N \f$ refers to protons and neutrons and \f$\Delta\f$ to
2491  * \f$\Delta\f$(1232), including all their antiparticles, and D* to
2492  * D*(2007) and D*(2010). All other interactions including charmed hadrons
2493  * are treated via intermediate resonances.<br>
2494  * When using this option of charm rescattering,
2495  * <tt>\ref key_CT_force_decays_at_end_ "Force_Decays_At_End"</tt> should
2496  * be set to true to handle decays properly.
2497  * - `"none"` &rarr; Interactions of charmed hadrons will not be taken into
2498  * account, i.e. their cross sections are set to zero.
2499  *
2500  * @note
2501  * This config key facilitates disabling the two to two interactions of
2502  * charmed hadrons that would otherwise be included via `"Charm_T-matrix"` in
2503  * <tt>\ref key_CT_included_2to2_ "Included_2to2"</tt>, without listing
2504  * every possible value except `"Charm_T-matrix"`.
2505  */
2506  /**
2507  * \see_key{key_CT_charm_rescattering_}
2508  */
2510  InputSections::c_heavyFlavor + "Charm_Rescattering_Method",
2512  {"3.4"},
2513  detail::get_default_validator<CharmRescattering>()};
2514 
2515  /*!\Userguide
2516  * \page doxypage_input_conf_collision_term
2517  * \optional_key{key_CT_collision_criterion_,Collision_Criterion,string,
2518  * "Covariant",\any_valid}
2519  *
2520  * The following collision criterions can be used.
2521  *
2522  * - `"Covariant"` &rarr; <b>Covariant collision criterion</b>\n
2523  * The covariant collision criterion uses a covariant expression of the
2524  * two-particle impact parameter in the two-particle center-of-momentum
2525  * frame, which allows for its calculation in the computational frame
2526  * without boosting. Furthermore, it calculates the collision times used for
2527  * the collision ordering in the two-particle center-of-momentum frame.
2528  * Further details are described in \iref{Hirano:2012yy}.
2529  *
2530  * - `"Geometric"` &rarr; <b>Geometric collision criterion</b>\n
2531  * The geometric collision criterion calculates the two-particle impact
2532  * parameter as the closest approach distance in the two-particle
2533  * center-of-momentum frame by boosting to the respective frame. The
2534  * collision time used for the ordering is calculated as the time of the
2535  * closest approach in the computational frame. For further details, see
2536  * \iref{Bass:1998ca}.
2537  *
2538  * - `"Stochastic"` &rarr; <b>Stochastic collision criterion</b>\n
2539  * The stochastic collision criterion employs a probability to decide
2540  * whether particles collide inside a given space-time cell. The probability
2541  * is derived directly from the scattering rate given by the Boltzmann
2542  * equation. The stochastic criterion is the only criterion that allows to
2543  * treat multi-particle reactions. For more details, see
2544  * \iref{Staudenmaier:2021lrg}.
2545  *
2546  * \note
2547  * The stochastic criterion is only applicable within limits. For example,
2548  * it might not lead to reasonable results for very dilute systems like pp
2549  * collisions. Futhermore, the fixed time step mode is required. The
2550  * assumption for the criterion is that only one reaction per particle per
2551  * timestep occurs. Therefore, small enough timesteps (<tt>\ref
2552  * key_gen_delta_time_ "Delta_Time"</tt>) have to be used. In doubt, test if
2553  * the results change with smaller timesteps. Since the probability value is
2554  * not by defintion limited to 1 in case of large timesteps, an error is
2555  * thrown if it gets larger than 1.
2556  */
2557  /**
2558  * \see_key{key_CT_collision_criterion_}
2559  */
2561  InputSections::collisionTerm + "Collision_Criterion",
2563  {"1.7"},
2564  detail::get_default_validator<CollisionCriterion>()};
2565 
2566  /*!\Userguide
2567  * \page doxypage_input_conf_collision_term
2568  * \optional_key{key_CT_cs_scaling_,Cross_Section_Scaling,double,1.0,\f$x>0\f$}
2569  *
2570  * Scale all cross sections by a global factor.
2571  * \warning Most cross sections are constrained by experimental data. Scaling
2572  * them will therefore lead to nonphysical results and is only meant for
2573  * explorative studies.
2574  */
2575  /**
2576  * \see_key{key_CT_cs_scaling_}
2577  */
2579  InputSections::collisionTerm + "Cross_Section_Scaling",
2580  1.0,
2581  {"2.0"},
2582  [](const double &value) noexcept { return value > 0.0; }};
2583 
2584  /*!\Userguide
2585  * \page doxypage_input_conf_collision_term
2586  * \optional_key{key_CT_elastic_cross_section_,Elastic_Cross_Section,
2587  * double,-1.0,\f$x \geq 0 \lor x=-1\f$}
2588  *
2589  * If a non-negative value is given, it will override the parametrized
2590  * elastic cross sections (which are energy-dependent) with a constant value
2591  * \unit{in mb}. This constant elastic cross section is used for all
2592  * collisions.
2593  */
2594  /**
2595  * \see_key{key_CT_elastic_cross_section_}
2596  */
2598  InputSections::collisionTerm + "Elastic_Cross_Section",
2599  -1.0,
2600  {"1.2"},
2601  [](const double &value) noexcept {
2602  return value >= 0.0 || value == -1.0;
2603  }};
2604 
2605  /*!\Userguide
2606  * \page doxypage_input_conf_collision_term
2607  * \optional_key{key_CT_elastic_nn_cutoff_sqrts_,Elastic_NN_Cutoff_Sqrts,
2608  * double,1.98,\f$1.876 \leq x \leq 2.014\f$}
2609  *
2610  * The elastic collisions between two nucleons with \f$\sqrt{s}\f$ below
2611  * the specified value (\unit{in GeV}) cannot happen.
2612  * - `Elastic_NN_Cutoff_Sqrts` < 1.876 &rarr;
2613  * Below the threshold energy of the elastic collision, not accepted.
2614  * - `Elastic_NN_Cutoff_Sqrts` > 2.014 &rarr;
2615  * Beyond the threshold energy of the inelastic collision
2616  * \f$NN\rightarrow NN\pi\f$, not accepted.
2617  */
2618  /**
2619  * \see_key{key_CT_elastic_nn_cutoff_sqrts_}
2620  */
2622  InputSections::collisionTerm + "Elastic_NN_Cutoff_Sqrts",
2623  1.98,
2624  {"1.0"},
2625  [](const double &value) noexcept {
2626  return value >= 2 * nucleon_mass &&
2627  value <= 2 * nucleon_mass + pion_mass;
2628  }};
2629 
2630  /*!\Userguide
2631  * \page doxypage_input_conf_collision_term
2632  * \optional_key{key_CT_fixed_min_cell_length_,Fixed_Min_Cell_Length,
2633  * double,2.5,\f$x>0\f$}
2634  *
2635  * The (minimal) length \unit{in fm} used for the grid cells of the stochastic
2636  * criterion, only. Collisions are searched within grid cells only. Cell
2637  * lengths are scaled up so that grid contains all particles if fraction of a
2638  * cell length would remain at end of the grid.
2639  */
2640  /**
2641  * \see_key{key_CT_fixed_min_cell_length_}
2642  */
2644  InputSections::collisionTerm + "Fixed_Min_Cell_Length",
2645  2.5,
2646  {"2.1"},
2647  [](const double &value) noexcept { return value > 0.0; }};
2648 
2649  /*!\Userguide
2650  * \page doxypage_input_conf_collision_term
2651  * \optional_key{key_CT_force_decays_at_end_,Force_Decays_At_End,bool,true,\none}
2652  *
2653  * - `true` &rarr; Force all resonances to decay after last timestep.
2654  * - `false` &rarr; Don't force decays (final output can contain resonances).
2655  */
2656  /**
2657  * \see_key{key_CT_force_decays_at_end_}
2658  */
2660  InputSections::collisionTerm + "Force_Decays_At_End",
2661  true,
2662  {"0.60"},
2663  detail::get_default_validator<bool>()};
2664 
2665  /*!\Userguide
2666  * \page doxypage_input_conf_collision_term
2667  * \optional_key{key_CT_decay_initial_,Decay_Initial_Particles,bool,true,\none}
2668  *
2669  * Allow or prohibit initial state particles from decaying before their first
2670  * collision. This is relevant when, for instance, studying the interactions
2671  * a resonance can go through. This prevails over \key `Force_Decays_At_End`
2672  */
2673  /**
2674  * \see_key{key_CT_decay_initial_}
2675  */
2676  inline static const Key<bool> collTerm_decayInitial{
2677  InputSections::collisionTerm + "Decay_Initial_Particles",
2678  true,
2679  {"3.0"},
2680  detail::get_default_validator<bool>()};
2681 
2682  /*!\Userguide
2683  * \page doxypage_input_conf_collision_term
2684  * \optional_key{key_CT_included_2to2_,Included_2to2,list of
2685  * strings,["All"],\any_valid}
2686  *
2687  * List that contains all possible 2 &harr; 2 process categories. Each process
2688  * of the listed category can be performed within the simulation. Possible
2689  * categories are:
2690  * - `"Elastic"` &rarr; elastic binary scatterings
2691  * - `"NN_to_NR"` &rarr; nucleon + nucleon &harr; nucleon + resonance
2692  * - `"NN_to_DR"` &rarr; nucleon + nucleon &harr; delta + resonance
2693  * - `"KN_to_KN"` &rarr; kaon + nucleon &harr; kaon + nucleon
2694  * - `"KN_to_KDelta"` &rarr; kaon + nucleon &harr; kaon + delta
2695  * - `"Strangeness_exchange"` &rarr; processes with strangeness exchange
2696  * - `"NNbar"` &rarr; annihilation processes, when NNbar_treatment is set to
2697  * resonances; this is superseded if NNbar_treatment is set to anything else
2698  * - `"PiDeuteron_to_NN"` &rarr; deuteron + pion &harr; nucleon + nucleon and
2699  * its CPT-conjugate
2700  * - `"PiDeuteron_to_pidprime"` &rarr; deuteron + pion &harr; d' + pion
2701  * - `"NDeuteron_to_Ndprime"` &rarr; deuteron + (anti-)nucleon &harr;
2702  * d' + (anti-)nucleon, and their CPT-conjugates
2703  * - `"Charm_T-matrix"` &rarr; D meson + light meson &harr; D meson + light
2704  * meson, D meson + nucleon &harr; D meson + nucleon, D meson + \f$\Delta\f$
2705  * &harr; D meson + \f$\Delta\f$, and D* + light meson &harr; D* + light
2706  * meson, where D* refers to D*(2007) and D*(2010), Currently, included
2707  * light mesons are pions, etas, kaons; nucleons refer to protons and
2708  * neutrons;\f$\Delta\f$ to \f$\Delta\f$(1232); and all their corresponding
2709  * antiparticles are considered as well. Only taken into account if
2710  * <tt>\ref key_CT_charm_rescattering_ "Charm_Rescattering_Method"</tt> is
2711  * set to `T-matrix`. Otherwise, collisions including charmed hadrons are
2712  * treated via intermediate resonances.
2713  * - `"All"` &rarr; include all binary processes, no necessity to list each
2714  * single category
2715  *
2716  * Detailed balance is preserved by these reaction switches: if a forward
2717  * reaction is off then the reverse is automatically off too.
2718  *
2719  * \warning If `"Elastic"` is the only process allowed, the
2720  * `"Total_Cross_Section_Strategy"` must be set as `"BottomUp"`, otherwise
2721  * SMASH fails. See <tt>\ref key_CT_totXsStrategy_
2722  * "Total_Cross_Section_Strategy"</tt> for more information.
2723  */
2724  /**
2725  * \see_key{key_CT_included_2to2_}
2726  */
2728  InputSections::collisionTerm + "Included_2to2",
2729  ReactionsBitSet{}.set(), // All interactions => all bit set
2730  {"1.3"},
2731  detail::get_default_validator<ReactionsBitSet>()};
2732 
2733  /*!\Userguide
2734  * \page doxypage_input_conf_removed_keys
2735  *
2736  * \list_removed_key{key_CT_include_decays_end_,Collision_Term.Include_Weak_And_EM_Decays_At_The_End,3.2}.
2737  * This key was renamed as <tt>\ref key_CT_ignore_decay_width_end_
2738  * "Ignore_Minimum_Decay_Width_For_Decays_At_The_End"</tt>.
2739  */
2740  /**
2741  * \removed_key{key_CT_include_decays_end_,3.2}
2742  */
2744  InputSections::collisionTerm + "Include_Weak_And_EM_Decays_At_The_End",
2745  false,
2746  {"2.2", "3.1", "3.2"},
2747  detail::get_default_validator<bool>()};
2748 
2749  /*!\Userguide
2750  * \page doxypage_input_conf_collision_term
2751  * \optional_key{key_CT_ignore_decay_width_end_,
2752  * Ignore_Minimum_Decay_Width_For_Decays_At_The_End,bool,false,\none}
2753  *
2754  * If enabled, all non-strong decays are performed at the end of the
2755  * simulation, including weak and electro-magnetic ones. In particular, all
2756  * decays in the *decaymodes.txt* file are considered at the end, even for
2757  * hadrons usually considered stable (i.e. with an on-shell width smaller than
2758  * the width cutoff, see note in \ref doxypage_input_decaymodes), for example
2759  * \f$\Sigma\f$, \f$\pi\f$ or \f$\eta\f$. Note that for isospin violating
2760  * decay modes all possible isospin combination have to be manually specified
2761  * in the *decaymodes.txt* file.
2762  *
2763  * \warning If `true`, this option removes the particles that decay from the
2764  * evolution, so the Dileptons output will not contain final state decays.
2765  * Therefore we do not recommend its usage for dilepton studies.
2766  */
2767  /**
2768  * \see_key{key_CT_ignore_decay_width_end_}
2769  */
2772  "Ignore_Minimum_Decay_Width_For_Decays_At_The_End",
2773  false,
2774  {"3.2"},
2775  detail::get_default_validator<bool>()};
2776 
2777  /*!\Userguide
2778  * \page doxypage_input_conf_collision_term
2779  * \optional_key{key_CT_isotropic_,Isotropic,bool,false,\none}
2780  *
2781  * Do all collisions isotropically.
2782  */
2783  /**
2784  * \see_key{key_CT_isotropic_}
2785  */
2786  inline static const Key<bool> collTerm_isotropic{
2787  InputSections::collisionTerm + "Isotropic",
2788  false,
2789  {"0.7.1"},
2790  detail::get_default_validator<bool>()};
2791 
2792  /*!\Userguide
2793  * \page doxypage_input_conf_collision_term
2794  * \optional_key{key_CT_max_cs_,Maximum_Cross_Section,double,
2795  * 200</tt> or <tt>2000,\f$x>0\f$}
2796  *
2797  * The maximal cross section \unit{in mb} that should be used when looking for
2798  * collisions. This means that all particle pairs, whose transverse distance
2799  * is smaller or equal to \f$\sqrt{\sigma_\mathrm{max}/\pi}\f$, will be
2800  * checked for collisions. <b>The default value is usually set to 200 mb</b>
2801  * and this value occurs in the Delta peak of the \f$\pi+p\f$ cross section.
2802  * Many SMASH cross sections diverge close at the threshold; these divergent
2803  * parts are effectively cut off. If deuteron production via d' is considered,
2804  * then the default is increased to 2000 mb to function correctly (see
2805  * \iref{Oliinychenko:2018ugs}). The maximal cross section is scaled with
2806  * <tt>\ref key_CT_cs_scaling_ "Cross_Section_Scaling"</tt> factor.
2807  *
2808  * \attention This cutoff breaks detailed balance, so when investigating
2809  * thermal properties with the "Geometric" or "Covariant" options for the
2810  * <tt>\ref key_CT_collision_criterion_ "Collision_Criterion"</tt>, it might
2811  * be important to set this key to a higher value. For a box of
2812  * \f$(10\ \mathrm{fm})^3\f$ in volume, the value of 750 mb is recommended.
2813  */
2814  /**
2815  * \see_key{key_CT_max_cs_}
2816  */
2818  InputSections::collisionTerm + "Maximum_Cross_Section",
2820  {"2.0"},
2821  [](const double &value) noexcept {
2822  if ((value < 200 && value > 0) || value > 2000) {
2823  logg[LogArea::Configuration::id].warn(
2824  "The maximum cross section is set to a value that is either "
2825  "smaller than 200 mb or larger than 2000 mb,\nwhich may lead to "
2826  "nonphysical results. Make sure that this is intended.");
2827  }
2828  return value > 0.0;
2829  }};
2830 
2831  /*!\Userguide
2832  * \page doxypage_input_conf_collision_term
2833  * \optional_key{key_CT_mp_reactions_,Multi_Particle_Reactions,list of
2834  * strings,[],\any_valid}
2835  *
2836  * List of reactions with more than 2 in- or outgoing particles that contains
2837  * all possible multi-particle process categories. Multi particle reactions
2838  * only work with the stochastic collision criterion. Possible categories are:
2839  * - `"Meson_3to1"` &rarr; Mesonic 3-to-1 reactions:
2840  * <table>
2841  * <tr>
2842  * <td> \f$\strut\pi^0\pi^+\pi^-\leftrightarrow\omega\f$
2843  * <td> \f$\strut\pi^0\pi^+\pi^-\leftrightarrow\phi\f$
2844  * <td> \f$\strut\eta\pi^+\pi^-\leftrightarrow\eta'\f$
2845  * <td> \f$\strut\eta\pi^0\pi^0\leftrightarrow\eta'\f$
2846  * </table>
2847  * Since detailed balance is enforced, the corresponding decays also have to
2848  * be added in decaymodes.txt to enable the reactions.
2849  * - `"Deuteron_3to2"` &rarr; Deuteron 3-to-2 reactions:
2850  * <table>
2851  * <tr>
2852  * <td> \f$\strut \pi pn\leftrightarrow\pi d\f$
2853  * <td> \f$\strut Npn\leftrightarrow Nd\f$
2854  * <td> \f$\strut \bar{N}pn\leftrightarrow\bar{N}d\f$
2855  * </table>
2856  * The deuteron has to be uncommented in particles.txt as well.
2857  * Do not uncomment d' or make sure to exclude 2-body reactions involving
2858  * the d' (i.e. no `"PiDeuteron_to_pidprime"` and `"NDeuteron_to_Ndprime"`
2859  * in `Included_2to2`). Otherwise, the deuteron reactions are implicitly
2860  * double-counted.
2861  * - `"A3_Nuclei_4to2"` &rarr; Create or destroy A = 3 nuclei (triton, He-3,
2862  * hypertriton) by 4 &harr; 2 catalysis reactions such as
2863  * \f$X NNN \leftrightarrow X t\f$, where \f$X\f$ can be a pion, nucleon, or
2864  * antinucleon.
2865  * - `"NNbar_5to2"` &rarr; 5-to-2 back-reaction for NNbar annihilation:
2866  * \f$\pi^0\pi^+\pi^-\pi^+\pi^- \rightarrow N\bar{N}\f$. Since detailed
2867  * balance is enforced, `NNbar_Treatment` has to be set to "two to five" for
2868  * this option.
2869  */
2870  /**
2871  * \see_key{key_CT_mp_reactions_}
2872  */
2873  inline static const Key<MultiParticleReactionsBitSet>
2875  InputSections::collisionTerm + "Multi_Particle_Reactions",
2876  MultiParticleReactionsBitSet{}.reset(), // Empty list => no bit set
2877  {"2.0"},
2878  detail::get_default_validator<MultiParticleReactionsBitSet>()};
2879 
2880  /*!\Userguide
2881  * \page doxypage_input_conf_collision_term
2882  * \optional_key{key_CT_nnbar_treatment_,NNbar_Treatment,string,"strings",\any_valid}
2883  *
2884  * - `"no annihilation"` &rarr; No annihilation of NNbar is performed.
2885  * - `"resonances"` &rarr; Annihilation through
2886  * \f$N\bar{N}\rightarrow\rho h_1(1170)\f$; combined with
2887  * \f$\rho\rightarrow\pi\pi\f$ and \f$h_1(1170)\rightarrow\pi\rho\f$, which
2888  * gives 5 pions on average. This option requires `"NNbar"` to be enabled in
2889  * <tt>\ref key_CT_included_2to2_ "Included_2to2"</tt>.
2890  * - `"two to five"` &rarr; Direct Annhilation of NNbar to \f$5\pi\f$,
2891  * matching the resonance treatment:
2892  * \f$N\bar{N}\rightarrow\pi^0\pi^+\pi^-\pi^+\pi^-\f$.
2893  * This option requires `"NNbar_5to2"` to be enabled in
2894  * <tt>\ref key_CT_mp_reactions_ "Multi_Particle_Reactions"</tt>.
2895  * - `"strings"` &rarr; Annihilation through string fragmentation.
2896  */
2897  /**
2898  * \see_key{key_CT_nnbar_treatment_}
2899  */
2901  InputSections::collisionTerm + "NNbar_Treatment",
2903  {"1.3"},
2904  detail::get_default_validator<NNbarTreatment>()};
2905 
2906  /*!\Userguide
2907  * \page doxypage_input_conf_collision_term
2908  * \optional_key{key_CT_no_collisions_,No_Collisions,bool,false,\none}
2909  *
2910  * Disable all possible collisions, only allow decays to occur if not
2911  * forbidden by other options. Useful for running SMASH as a decay
2912  * afterburner, but not recommended in general, because it breaks the detailed
2913  * balance.
2914  */
2915  /**
2916  * \see_key{key_CT_no_collisions_}
2917  */
2918  inline static const Key<bool> collTerm_noCollisions{
2919  InputSections::collisionTerm + "No_Collisions",
2920  false,
2921  {"1.3"},
2922  detail::get_default_validator<bool>()};
2923 
2924  /*!\Userguide
2925  * \page doxypage_input_conf_collision_term
2926  * \optional_key{key_CT_warn_high_prob_,Only_Warn_For_High_Probability,bool,false,\none}
2927  *
2928  * Only warn and not error for reaction probabilities higher than 1.
2929  * This switch is meant for very long production runs with the stochastic
2930  * criterion. It has no effect on the other criteria. If enabled, it is the
2931  * user's responsibility to make sure that the warning, that the probability
2932  * has slipped above 1, is printed very rarely.
2933  */
2934  /**
2935  * \see_key{key_CT_warn_high_prob_}
2936  */
2938  InputSections::collisionTerm + "Only_Warn_For_High_Probability",
2939  false,
2940  {"3.0"},
2941  detail::get_default_validator<bool>()};
2942 
2943  /*!\Userguide
2944  * \page doxypage_input_conf_collision_term
2945  * \optional_key{key_CT_pseudoresonance_,Pseudoresonance,string,
2946  * "LargestFromUnstable",\any_valid}
2947  *
2948  * Due to the lack of known high-mass resonances for several processes, the
2949  * energy region between resonances and strings might lack inelastic
2950  * processes, which is referred to as “inelastic gap”. To mitigate this,
2951  * “pseudo-resonances” based on existing resonances can be extended to fill
2952  * said gap, using the difference between the high energy parametrization of
2953  * the total cross section and the sum of cross sections from all processes
2954  * as a proxy for how large it is. Candidates are resonances that decay
2955  * into the incoming pair. Possible options for this key are
2956  * - `"None"` &rarr;
2957  * No pseudo-resonance is created.
2958  * - `"Largest"` &rarr;
2959  * Use the resonance with largest mass.
2960  * - `"Closest"` &rarr;
2961  * Select the resonance that has the closest pole mass to the available
2962  * energy (\f$\sqrt{s}\f$ of the incoming pair).
2963  * - `"LargestFromUnstable"` &rarr;
2964  * Same as `"Largest"` but a pseudo-resonance is used only for processes
2965  * that have at least one incoming unstable particle.
2966  * - `"ClosestFromUnstable"` &rarr;
2967  * Same as `"Closest"` but a pseudo-resonance is used only for processes
2968  * that have at least one incoming unstable particle.
2969  */
2970  /**
2971  * \see_key{key_CT_pseudoresonance_}
2972  */
2974  InputSections::collisionTerm + "Pseudoresonance",
2976  {"3.1"},
2977  detail::get_default_validator<PseudoResonance>()};
2978 
2979  /*!\Userguide
2980  * \page doxypage_input_conf_collision_term
2981  * \optional_key{key_CT_res_lifetime_mod_,Resonance_Lifetime_Modifier,double,
2982  * 1.0,\f$x>0\f$}
2983  *
2984  * Multiplicative factor by which to scale the resonance lifetimes up or down.
2985  * This additionally has the effect of modifying the initial densities by
2986  * the same factor in the case of a box initialized with thermal
2987  * multiplicities (see <tt>\ref key_MB_use_thermal_mult_
2988  * "Box: Use_Thermal_Multiplicities"</tt>).
2989  *
2990  * \warning This option is not fully physically consistent with some of the
2991  * other assumptions used in SMASH; notably, modifying this value **will**
2992  * break detailed balance in any gas which allows resonances to collide
2993  * inelastically, as this option breaks the relationship between the width and
2994  * lifetime of resonances. Note as well that in such cases, using a value of
2995  * 0.0 is known to make SMASH hang; it is recommended to use a small non-zero
2996  * value instead in these cases.
2997  */
2998  /**
2999  * \see_key{key_CT_res_lifetime_mod_}
3000  */
3002  InputSections::collisionTerm + "Resonance_Lifetime_Modifier",
3003  1.0,
3004  {"1.8"},
3005  [](const double &value) noexcept { return value > 0.0; }};
3006 
3007  /*!\Userguide
3008  * \page doxypage_input_conf_ct_spin_interactions
3009  * \optional_key{key_CT_spin_interactions_,Spin_Interactions,string,"Off",\any_valid}
3010  *
3011  * Whether or not to enable spin interactions in binary collisions.
3012  * \note So far we only include a spin flip in elastic scatterings.
3013  */
3014  /**
3015  * \see_key{key_CT_spin_interactions_}
3016  */
3018  InputSections::collisionTerm + "Spin_Interactions",
3020  {"3.3"},
3021  detail::get_default_validator<SpinInteractionType>()};
3022 
3023  /*!\Userguide
3024  * \page doxypage_input_conf_collision_term
3025  * \optional_key{key_CT_strings_,Strings,bool,
3026  * (\ref key_gen_modus_ "Modus"!="Box"),\none}
3027  *
3028  * - `true` &rarr; String excitation is enabled
3029  * - `false` &rarr; String excitation is disabled
3030  */
3031  /**
3032  * \see_key{key_CT_strings_}
3033  */
3034  inline static const Key<bool> collTerm_strings{
3035  InputSections::collisionTerm + "Strings",
3037  {"1.0"},
3038  detail::get_default_validator<bool>()};
3039 
3040  /*!\Userguide
3041  * \page doxypage_input_conf_collision_term
3042  * \optional_key{key_CT_string_with_prob_,Strings_with_Probability,bool,true,\none}
3043  *
3044  * - `true` &rarr;
3045  * String processes are triggered according to a probability increasing
3046  * smoothly with the collisional energy from 0 to 1 in a certain energy
3047  * window. At energies beyond that window, all the inelastic scatterings are
3048  * via strings, while at the energies below that window, all the scatterings
3049  * are via non-string processes. One should be careful that in this
3050  * approach, the scatterings via resoances are also suppressed in the
3051  * intermediate energy region, and vanishes at high energies, e.g.
3052  * \f$p\pi\rightarrow\Delta\rightarrow\Sigma K\f$
3053  * can't happen at a collisional energy beyond 2.2 GeV in this approach.
3054  * Therefore, the cross sections of the scatterings to the certain final
3055  * states, which might be crucial for the production of the rare species,
3056  * will be reduced at the high energies.
3057  * - `false` &rarr;
3058  * String processes always happen as long as the collisional energy exceeds
3059  * the threshold value by 0.9 GeV, and the parametrized total cross section
3060  * is larger than the sum of cross sections contributed by the non-string
3061  * processes. The string cross section is thus obtained by taking the
3062  * difference between them.
3063  */
3064  /**
3065  * \see_key{key_CT_string_with_prob_}
3066  */
3068  InputSections::collisionTerm + "Strings_with_Probability",
3069  true,
3070  {"1.3"},
3071  detail::get_default_validator<bool>()};
3072 
3073  /*!\Userguide
3074  * \page doxypage_input_conf_collision_term
3075  * \optional_key{key_CT_totXsStrategy_,Total_Cross_Section_Strategy,string,
3076  * "TopDownMeasured",\any_valid}
3077  *
3078  * Which strategy to use when evaluating total cross sections for collision
3079  * finding. Currently, possible options are
3080  * - `"BottomUp"` &rarr;
3081  * Partial cross sections of a given initial state are summed up. This
3082  * matches most inclusive experimental cross sections with the 3- and 4-star
3083  * hadronic list from PDG2018, but is susceptible to changes once new
3084  * resonances are added in the \ref doxypage_input_particles "particles"
3085  * file.
3086  * - `"TopDown"` &rarr;
3087  * The total cross section of measured processes is parametrized, and the
3088  * partial cross sections are rescaled to match it. Unmeasured processes use
3089  * the high energy parametrization even in low energies, ignoring possible
3090  * resonance peaks, and scaled with AQM. This is then insensitive to changes
3091  * in the input hadronic list.
3092  * - `"TopDownMeasured"` &rarr;
3093  * Mixes the options above, with parametrizations only for \f$NN, N\bar{N},
3094  * NK, N\pi,\f$ and \f$\pi\pi\f$. Remaining processes use sum of partial
3095  * cross sections.
3096  *
3097  * \note In a box calculation, using the `"BottomUp"` strategy is recommended
3098  * to preserve detailed balance.
3099  */
3100  /**
3101  * \see_key{key_CT_totXsStrategy_}
3102  */
3104  InputSections::collisionTerm + "Total_Cross_Section_Strategy",
3106  {"3.1"},
3107  detail::get_default_validator<TotalCrossSectionStrategy>()};
3108 
3109  /*!\Userguide
3110  * \page doxypage_input_conf_collision_term
3111  * \optional_key{key_CT_two_to_one_,Two_to_One,bool,true,\none}
3112  *
3113  * Enable 2 &harr; 1 processes (resonance formation and decays).
3114  */
3115  /**
3116  * \see_key{key_CT_two_to_one_}
3117  */
3118  inline static const Key<bool> collTerm_twoToOne{
3119  InputSections::collisionTerm + "Two_to_One",
3120  true,
3121  {"0.85"},
3122  detail::get_default_validator<bool>()};
3123 
3124  /*!\Userguide
3125  * \page doxypage_input_conf_collision_term
3126  * \optional_key{key_CT_use_aqm_,Use_AQM,bool,true,\none}
3127  *
3128  * Turn on AQM cross-sections for exotic combination of particles
3129  * (baryon-baryon cross-sections are scaled from proton-proton high energy
3130  * parametrization, for example). This includes both elastic and non-elastic
3131  * contributions; non-elastic contributions go through string fragmentation.
3132  * Turning off strings or elastic collisions while leaving this on will
3133  * result in the corresponding part of the AQM cross-sections to also be off.
3134  * Cross-sections parametrization are scaled according to
3135  * \f[
3136  * \frac{\sigma^{\mathrm{AQM}}_{\mathrm{process}}}
3137  * {\sigma^{\mathrm{AQM}}_\mathrm{ref\_process}}
3138  * \sigma^{\mathrm{param}}_\mathrm{ref\_process}
3139  * \f]
3140  * where "process" refers to a generic process and "ref_process" to a
3141  * reference process such as \f$pp\f$ for which solid parametrizations exist.
3142  * The AQM cross-section for a process involving the incoming particles
3143  * \f$1\f$ and \f$2\f$ is determined by the following calculation:
3144  * \f[
3145  * \sigma^{\mathrm{AQM}}_{12} = 40 \left( \frac{2}{3}
3146  * \right)^{n_\mathrm{meson}} (1 - 0.4 x^s_1) (1 - 0.4 x^s_2) (1 - \kappa^c
3147  * x^c_1) (1 - \kappa^c x^c_2) (1 - \kappa^b x^b_1) (1 - \kappa^b x^b_2) \f]
3148  * with \f$n_\mathrm{meson}\f$ being the number of mesons in the process,
3149  * \f$x^s_{1,2}\f$ the fraction of strange quarks, \f$x^c_{1,2}\f$ the
3150  * fraction of charm quarks, and \f$x^b_{1,2}\f$ the fraction of bottom quarks
3151  * of the hadrons \f$1\f$ and \f$2\f$. \f$ \kappa^c \f$ and \f$ \kappa^b \f$
3152  * are the respective suppression factors for interactions involving charm and
3153  * bottom hadrons (see
3154  * <tt>\ref key_CT_HF_AQM_c_suppression_ "AQM_Charm_Suppression"</tt> and
3155  * <tt>\ref key_CT_HF_AQM_b_suppression_ "AQM_Bottom_Suppression"</tt> for the
3156  * default values and how to specify alternate values in the configuration
3157  * file). See \iref{Bass:1998ca} for AQM only considering strangeness and
3158  * \iref{Bierlich:2022pfr} for the charm and bottom suppression factors.
3159  *
3160  * @attention
3161  * If <tt>\ref key_CT_totXsStrategy_ "Total_Cross_Section_Strategy"</tt> is
3162  * set to `TopDown` or `TopDownMeasured` it is not possible to turn AQM off
3163  * completely. It is necessary for the total parametrizations of cross
3164  * sections.
3165  */
3166  /**
3167  * \see_key{key_CT_use_aqm_}
3168  */
3169  inline static const Key<bool> collTerm_useAQM{
3170  InputSections::collisionTerm + "Use_AQM",
3171  true,
3172  {"1.3"},
3173  detail::get_default_validator<bool>()};
3174 
3175  /*!\Userguide
3176  * \page doxypage_input_conf_ct_hard_string_transition
3177  * \optional_key{key_CT_hard_string_transition_mode_,
3178  * Mode,string,Exponential,\any_valid}
3179  *
3180  * Select the mode used for the transition from soft to hard string
3181  * excitation.
3182  *
3183  * - Exponential: use exponential suppression based on the hard
3184  * string cross section in the Pythia multiparton interaction (MPI)
3185  * framework.
3186  * - Custom_Range: use a smooth transition from soft to hard string excitation
3187  * within a user-defined invariant energy range.
3188  *
3189  * In this mode, the transition follows a sinusoidal function within the
3190  * interval defined by Energy_Range, ensuring a smooth and continuous
3191  * interpolation between the soft and hard regimes.
3192  *
3193  * For Custom_Range, the transition is controlled by Energy_Range.
3194  */
3195  /**
3196  * \see_key{key_CT_hard_string_transition_mode_}
3197  */
3198  inline static const Key<HardStringTransitionMode>
3202  {"3.4"},
3203  detail::get_default_validator<HardStringTransitionMode>()};
3204 
3205  /*!\Userguide
3206  * \page doxypage_input_conf_ct_hard_string_transition
3207  * \optional_key{key_CT_hard_string_transition_energyRange_,
3208  * Energy_Range,list of two doubles,[10.0\,200.0],
3209  * \f$E_1 \ge 10\f$ and \f$E_1 < E_2\f$}
3210  *
3211  * Invariant energy range (\f$\sqrt{s}\f$) \unit{GeV} used for the custom
3212  * transition from soft to hard string excitation.
3213  *
3214  * This key is only used when Mode is set to Custom_Range. For \f$\sqrt{s}\f$
3215  * below the lower bound, only soft string excitation is used. For
3216  * \f$\sqrt{s}\f$ above the upper bound, only hard string excitation is used.
3217  *
3218  * Within the specified range, the transition probability is interpolated
3219  * smoothly from the soft to the hard regime.
3220  *
3221  * The lower bound must be greater than or equal to 10 \unit{GeV} and strictly
3222  * smaller than the upper bound.
3223  */
3224  /**
3225  * \see_key{key_CT_hard_string_transition_energyRange_}
3226  */
3227  inline static const Key<std::pair<double, double>>
3229  InputSections::c_hardStringTransition + "Energy_Range",
3230  std::make_pair(10.0, 200.0),
3231  {"3.4"},
3232  [](const std::pair<double, double> &value) noexcept {
3233  return value.first >= 10.0 && value.first < value.second;
3234  }};
3235 
3236  /*!\Userguide
3237  * \page doxypage_input_conf_ct_pauliblocker
3238  * \optional_key{key_CT_PB_gaussian_cutoff_,Gaussian_Cutoff,double,
3239  * 2.2,\f$1\leq x\leq10\f$}
3240  *
3241  * Radius \unit{in fm} at which Gaussians used for smoothing are
3242  * cut. It should be larger than \ref
3243  * key_CT_PB_spatial_averaging_radius_ "Spatial_Averaging_Radius".
3244  */
3245  /**
3246  * \see_key{key_CT_PB_gaussian_cutoff_}
3247  */
3249  InputSections::c_pauliBlocking + "Gaussian_Cutoff",
3250  2.2,
3251  {"0.7.1"},
3252  [](const double &value) noexcept {
3253  return value >= 1.0 && value <= 10.0;
3254  }};
3255 
3256  /*!\Userguide
3257  * \page doxypage_input_conf_ct_pauliblocker
3258  * \optional_key{key_CT_PB_momentum_av_radius_,Momentum_Averaging_Radius,
3259  * double,0.08,\f$x>0\f$}
3260  *
3261  * Radius \unit{in GeV} of sphere for averaging in the momentum space.
3262  */
3263  /**
3264  * \see_key{key_CT_PB_momentum_av_radius_}
3265  */
3266  inline static const Key<double>
3268  InputSections::c_pauliBlocking + "Momentum_Averaging_Radius",
3269  0.08,
3270  {"0.7.1"},
3271  [](const double &value) noexcept { return value > 0.0; }};
3272 
3273  /*!\Userguide
3274  * \page doxypage_input_conf_ct_pauliblocker
3275  * \optional_key{key_CT_PB_spatial_averaging_radius_,Spatial_Averaging_Radius,
3276  * double,1.86,\f$x>0\f$}
3277  *
3278  * Radius \unit{in fm} of sphere for averaging in the coordinate space. It
3279  * should be smaller than \ref key_CT_PB_gaussian_cutoff_ "Gaussian_Cutoff".
3280  */
3281  /**
3282  * \see_key{key_CT_PB_spatial_averaging_radius_}
3283  */
3285  InputSections::c_pauliBlocking + "Spatial_Averaging_Radius",
3286  1.86,
3287  {"0.7.1"},
3288  [](const double &value) noexcept { return value > 0.0; }};
3289 
3290  /*!\Userguide
3291  * \page doxypage_input_conf_ct_string_transition
3292  * \optional_key{key_CT_ST_KN_offset_,KN_Offset,double,15.15,\none}
3293  *
3294  * Offset \unit{in GeV} to turn on the strings for KN reactions.
3295  */
3296  /**
3297  * \see_key{key_CT_ST_KN_offset_}
3298  */
3300  InputSections::c_stringTransition + "KN_Offset",
3301  15.15,
3302  {"3.0"},
3303  detail::get_default_validator<double>()};
3304 
3305  /*!\Userguide
3306  * \page doxypage_input_conf_ct_string_transition
3307  * \optional_key{key_CT_ST_pipi_offset_,PiPi_Offset,double,1.12,\none}
3308  *
3309  * Offset \unit{in GeV} to turn on the strings and elastic processes
3310  * for \f$\pi\pi\f$ reactions (this is an exception because the normal AQM
3311  * behavior destroys the cross section at very low \f$\sqrt{s}\f$ and around
3312  * the \f$f_2\f$ peak)
3313  */
3314  /**
3315  * \see_key{key_CT_ST_pipi_offset_}
3316  */
3318  InputSections::c_stringTransition + "PiPi_Offset",
3319  1.12,
3320  {"3.0"},
3321  detail::get_default_validator<double>()};
3322 
3323  /*!\Userguide
3324  * \page doxypage_input_conf_ct_string_transition
3325  * \optional_key{key_CT_ST_lower_,Sqrts_Lower,double,0.9,\none}
3326  *
3327  * Lower end of transition region \unit{in GeV} for the remaining
3328  * interactions, in case of AQM this is added to the sum of masses.
3329  */
3330  /**
3331  * \see_key{key_CT_ST_lower_}
3332  */
3334  InputSections::c_stringTransition + "Sqrts_Lower",
3335  0.9,
3336  {"3.0"},
3337  detail::get_default_validator<double>()};
3338 
3339  /*!\Userguide
3340  * \page doxypage_input_conf_ct_string_transition
3341  * \optional_key{key_CT_ST_rangeNN_,Sqrts_Range_NN,list of two doubles,
3342  * [3.5\,4.5],\f$x_1 \geq 1.876 \land x_1 < x_2\f$}
3343  *
3344  * Transition range in NN collisions \unit{in GeV}. The lowest value for the
3345  * first parameter is the mass threshold 1.876. The default is tuned to
3346  * reproduce experimental exclusive cross section data, and at the same time
3347  * produce excitation functions that are as smooth as possible. The default of
3348  * a 1 GeV range is preserved.
3349  */
3350  /**
3351  * \see_key{key_CT_ST_rangeNN_}
3352  */
3353  inline static const Key<std::pair<double, double>>
3355  InputSections::c_stringTransition + "Sqrts_Range_NN",
3356  std::make_pair(3.5, 4.5),
3357  {"3.0"},
3358  [](const std::pair<double, double> &value) noexcept {
3359  const bool valid =
3360  value.first >= 2 * nucleon_mass && value.first < value.second;
3361  if (valid && std::abs(value.second - value.first) != 1.0) {
3362  logg[LogArea::Configuration::id].warn(
3363  "The string transition range for NN collisions is set to a "
3364  "range larger than 1 GeV, which may lead to nonphysical\n"
3365  "results. Make sure that this is intended.");
3366  }
3367  return valid;
3368  }};
3369 
3370  /*!\Userguide
3371  * \page doxypage_input_conf_ct_string_transition
3372  * \optional_key{key_CT_ST_rangeNPi_,Sqrts_Range_Npi,list of two doubles,
3373  * [1.9\,2.2],\f$x_1 \geq 1.076 \land x_1 < x_2\f$}
3374  *
3375  * Transition region in N\f$\pi\f$ scatterings \unit{in GeV}. The lowest value
3376  * for the first parameter is the mass threshold 1.076.
3377  */
3378  /**
3379  * \see_key{key_CT_ST_rangeNPi_}
3380  */
3381  inline static const Key<std::pair<double, double>>
3383  InputSections::c_stringTransition + "Sqrts_Range_Npi",
3384  std::make_pair(1.9, 2.2),
3385  {"3.0"},
3386  [](const std::pair<double, double> &value) noexcept {
3387  return value.first >= nucleon_mass + pion_mass &&
3388  value.first < value.second;
3389  }};
3390 
3391  /*!\Userguide
3392  * \page doxypage_input_conf_ct_string_transition
3393  * \optional_key{key_CT_ST_range_width_,Sqrts_Range_Width,double,1.0,\none}
3394  *
3395  * Width of the transition region \unit{in GeV} for the remaining
3396  * interactions, in case of AQM this is added to <tt>\ref key_CT_ST_lower_
3397  * "Sqrts_Lower"</tt>.
3398  */
3399  /**
3400  * \see_key{key_CT_ST_range_width_}
3401  */
3403  InputSections::c_stringTransition + "Sqrts_Range_Width",
3404  1.0,
3405  {"3.0"},
3406  detail::get_default_validator<double>()};
3407 
3408  /*!\Userguide
3409  * \page doxypage_input_conf_ct_string_parameters
3410  * \optional_key{key_CT_SP_diquark_supp_,Diquark_Supp,double,0.04,
3411  * \f$0\leq x\leq 1\f$}
3412  *
3413  * Diquark suppression factor. Defines the probability to produce a diquark
3414  * antidiquark pair relative to producing a qurk antiquark pair.
3415  */
3416  /**
3417  * \see_key{key_CT_SP_diquark_supp_}
3418  */
3420  InputSections::c_stringParameters + "Diquark_Supp",
3421  0.04,
3422  {"1.3", "3.4"},
3423  [](const double &value) noexcept {
3424  return value >= 0.0 && value <= 1.0;
3425  }};
3426 
3427  /*!\Userguide
3428  * \page doxypage_input_conf_ct_string_parameters
3429  * \optional_key{key_CT_SP_form_time_factor_,Form_Time_Factor,double,
3430  * 1.0,\f$x>0\f$}
3431  *
3432  * Factor to be multiplied with the formation time of string fragments from
3433  * the soft string routine.
3434  */
3435  /**
3436  * \see_key{key_CT_SP_form_time_factor_}
3437  */
3439  InputSections::c_stringParameters + "Form_Time_Factor",
3440  1.0,
3441  {"1.4"},
3442  [](const double &value) noexcept { return value > 0.0; }};
3443 
3444  /*!\Userguide
3445  * \page doxypage_input_conf_ct_string_parameters
3446  * \optional_key{key_CT_SP_formation_time_,Formation_Time,double,1.0,\f$x>0\f$}
3447  *
3448  * Parameter for formation time in string fragmentation, \unit{in fm}.
3449  */
3450  /**
3451  * \see_key{key_CT_SP_formation_time_}
3452  */
3454  InputSections::c_stringParameters + "Formation_Time",
3455  1.0,
3456  {"1.0"},
3457  [](const double &value) noexcept { return value > 0.0; }};
3458 
3459  /*!\Userguide
3460  * \page doxypage_input_conf_ct_string_parameters
3461  * \optional_key{key_CT_SP_gluon_beta_,Gluon_Beta,double,0.5,\f$x>0\f$}
3462  *
3463  * Parameter \f$\beta\f$ in parton distribution function for gluons,
3464  * \f[\mathrm{PDF}_g(x) \propto \frac{1}{x}(1-x)^{\beta+1}\;.\f]
3465  */
3466  /**
3467  * \see_key{key_CT_SP_gluon_beta_}
3468  */
3470  InputSections::c_stringParameters + "Gluon_Beta",
3471  0.5,
3472  {"1.3"},
3473  [](const double &value) noexcept { return value > 0.0; }};
3474 
3475  /*!\Userguide
3476  * \page doxypage_input_conf_ct_string_parameters
3477  * \optional_key{key_CT_SP_gluon_pmin_,Gluon_Pmin,double,0.001,\f$x>0\f$}
3478  *
3479  * Smallest possible scale for gluon lightcone momentum \unit{in GeV}.
3480  * This is divided by \f$\sqrt{s}\f$ to get the minimum fraction to be sampled
3481  * from PDF shown in <tt>\ref key_CT_SP_gluon_beta_ "Gluon_Beta"</tt>.
3482  */
3483  /**
3484  * \see_key{key_CT_SP_gluon_pmin_}
3485  */
3487  InputSections::c_stringParameters + "Gluon_Pmin",
3488  0.001,
3489  {"1.3"},
3490  [](const double &value) noexcept { return value > 0.0; }};
3491 
3492  /*!\Userguide
3493  * \page doxypage_input_conf_ct_string_parameters
3494  * \optional_key{key_CT_SP_m_dependent_formation_t_,
3495  * Mass_Dependent_Formation_Times,bool,false,\none}
3496  *
3497  * Whether the formation time of string fragments should depend on their mass.
3498  * If it is set to `true`, the formation time is calculated as
3499  * \f$\tau = \sqrt{2}\frac{m}{\kappa} \f$.
3500  */
3501  /**
3502  * \see_key{key_CT_SP_m_dependent_formation_t_}
3503  */
3505  InputSections::c_stringParameters + "Mass_Dependent_Formation_Times",
3506  false,
3507  {"1.5.2"},
3508  detail::get_default_validator<bool>()};
3509 
3510  /*!\Userguide
3511  * \page doxypage_input_conf_ct_string_parameters
3512  * \optional_key{key_CT_SP_quark_alpha_,Quark_Alpha,double,2.0,\f$x>0\f$}
3513  *
3514  * Parameter \f$\alpha\f$ in parton distribution function for quarks,
3515  * \f[\mathrm{PDF}_q\propto x^{\alpha-1}(1-x)^{\beta-1}\;.\f]
3516  */
3517  /**
3518  * \see_key{key_CT_SP_quark_alpha_}
3519  */
3521  InputSections::c_stringParameters + "Quark_Alpha",
3522  2.0,
3523  {"1.3"},
3524  [](const double &value) noexcept { return value > 0.0; }};
3525 
3526  /*!\Userguide
3527  * \page doxypage_input_conf_ct_string_parameters
3528  * \optional_key{key_CT_SP_quark_beta_,Quark_Beta,double,7.0,\f$x>0\f$}
3529  *
3530  * Parameter \f$\beta\f$ in PDF for quarks shown in <tt>\ref
3531  * key_CT_SP_quark_alpha_ "Quark_Alpha"</tt>.
3532  */
3533  /**
3534  * \see_key{key_CT_SP_quark_beta_}
3535  */
3537  InputSections::c_stringParameters + "Quark_Beta",
3538  7.0,
3539  {"1.3"},
3540  [](const double &value) noexcept { return value > 0.0; }};
3541 
3542  /*!\Userguide
3543  * \page doxypage_input_conf_ct_string_parameters
3544  * \optional_key{key_CT_SP_popcorn_rate_,Popcorn_Rate,double,
3545  * 0.5,\f$0\leq x\leq 2\f$}
3546  *
3547  * Parameter StringFlav:popcornRate, which determines production rate of
3548  * popcorn mesons in string fragmentation. It is possible to produce a popcorn
3549  * meson from the diquark end of a string with certain probability (i.e.,
3550  * diquark to meson + diquark).
3551  */
3552  /**
3553  * \see_key{key_CT_SP_popcorn_rate_}
3554  */
3556  InputSections::c_stringParameters + "Popcorn_Rate",
3557  0.5,
3558  {"1.6", "3.4"},
3559  [](const double &value) noexcept {
3560  return value >= 0.0 && value <= 2.0;
3561  }};
3562 
3563  /*!\Userguide
3564  * \page doxypage_input_conf_ct_string_parameters
3565  * \optional_key{key_CT_SP_damp_popcorn_,Damp_Popcorn,double,0.5,\f$0\leq
3566  * x\leq 1\f$}
3567  *
3568  * Controls whether a diquark endpoint may hadronize via the popcorn
3569  * mechanism into a leading meson before producing the baryon.
3570  *
3571  * A value of \f$1\f$ corresponds to normal popcorn production, while
3572  * \f$0\f$ suppresses popcorn completely such that the diquark always
3573  * fragments directly into a leading baryon. Intermediate values interpolate
3574  * between these two limits.
3575  *
3576  * Corresponds to Pythia's
3577  * <tt>BeamRemnants:dampPopcorn</tt> parameter.
3578  */
3579  /**
3580  * \see_key{key_CT_SP_damp_popcorn_}
3581  */
3583  InputSections::c_stringParameters + "Damp_Popcorn",
3584  0.5,
3585  {"3.4"},
3586  [](const double &value) noexcept {
3587  return value >= 0.0 && value <= 1.0;
3588  }};
3589 
3590  /*!\Userguide
3591  * \page doxypage_input_conf_ct_string_parameters
3592  * \optional_key{key_CT_SP_power_part_formation_,Power_Particle_Formation,
3593  * double,±1,\none}
3594  *
3595  * The default value of this parameter is `+1` if
3596  * \f$\sqrt{s}<200\,\mathrm{GeV}\f$ and `-1` otherwise. If positive, the
3597  * power with which the cross section scaling factor of string fragments
3598  * grows in time until it reaches 1. If negative, the scaling factor will be
3599  * constant and jump to 1 once the particle forms.
3600  */
3601  /**
3602  * \see_key{key_CT_SP_power_part_formation_}
3603  */
3605  InputSections::c_stringParameters + "Power_Particle_Formation",
3607  {"1.4"},
3608  detail::get_default_validator<double>()};
3609 
3610  /*!\Userguide
3611  * \page doxypage_input_conf_ct_string_parameters
3612  * \optional_key{key_CT_SP_probability_p_to_duu_,Prob_proton_to_d_uu,
3613  * double,1./3,\f$0<x\leq 1\f$}
3614  *
3615  * Probability of splitting an (anti)nucleon into the quark it has only once
3616  * and the diquark it contains twice in terms of flavour in the soft string
3617  * routine.
3618  */
3619  /**
3620  * \see_key{key_CT_SP_probability_p_to_duu_}
3621  */
3623  InputSections::c_stringParameters + "Prob_proton_to_d_uu",
3624  1.0 / 3,
3625  {"1.5"},
3626  [](const double &value) noexcept { return value > 0.0 && value <= 1.0; }};
3627 
3628  /*!\Userguide
3629  * \page doxypage_input_conf_ct_string_parameters
3630  * \optional_key{key_CT_SP_separate_fragment_bar_,Separate_Fragment_Baryon,
3631  * bool,true,\none}
3632  *
3633  * Whether to use a separate fragmentation function for leading baryons in
3634  * non-diffractive string processes.
3635  */
3636  /**
3637  * \see_key{key_CT_SP_separate_fragment_bar_}
3638  */
3640  InputSections::c_stringParameters + "Separate_Fragment_Baryon",
3641  true,
3642  {"1.6"},
3643  detail::get_default_validator<bool>()};
3644 
3645  /*!\Userguide
3646  * \page doxypage_input_conf_ct_string_parameters
3647  * \optional_key{key_CT_SP_sigma_perp_,Sigma_Perp,double,0.42,\f$x>0\f$}
3648  *
3649  * Parameter \f$\sigma_\perp\f$ \unit{in GeV} in the distribution for
3650  * transverse momentum transfer between colliding hadrons \f$p_\perp\f$ and
3651  * string mass \f$M_X\f$,
3652  * \f[
3653  * \frac{d^3N}{dM^2_Xd^2\mathbf{p_\perp}}\propto
3654  * \frac{1}{M_X^2} \exp\left(-\frac{p_\perp^2}{\sigma_\perp^2}\right)\;.
3655  * \f]
3656  */
3657  /**
3658  * \see_key{key_CT_SP_sigma_perp_}
3659  */
3661  InputSections::c_stringParameters + "Sigma_Perp",
3662  0.42,
3663  {"1.3"},
3664  [](const double &value) noexcept { return value > 0.0; }};
3665 
3666  /*!\Userguide
3667  * \page doxypage_input_conf_ct_string_parameters
3668  * \optional_key{key_CT_SP_strange_supp_,Strange_Supp,double,0.16,
3669  * \f$0\leq x\leq 1\f$}
3670  *
3671  * Strangeness suppression factor \f$\lambda\f$,
3672  * \f[\lambda=
3673  * \frac{P(s\bar{s})}{P(u\bar{u})\vphantom{\bar{d}}}=
3674  * \frac{P(s\bar{s})}{P(d\bar{d})}\;.
3675  * \f]
3676  * Defines the probability to produce a \f$s\bar{s}\f$ pair relative to
3677  * producing a light \f$q\bar{q}\f$ pair.
3678  */
3679  /**
3680  * \see_key{key_CT_SP_strange_supp_}
3681  */
3683  InputSections::c_stringParameters + "Strange_Supp",
3684  0.16,
3685  {"1.3", "3.4"},
3686  [](const double &value) noexcept {
3687  return value >= 0.0 && value <= 1.0;
3688  }};
3689 
3690  /*!\Userguide
3691  * \page doxypage_input_conf_ct_string_parameters
3692  * \optional_key{key_CT_SP_string_sigma_t_,String_Sigma_T,double,
3693  * 0.5,\f$0\le x\le 1\f$}
3694  *
3695  * Standard deviation \unit{in GeV} in Gaussian for transverse momentum
3696  * distributed to string fragments during fragmentation.
3697  */
3698  /**
3699  * \see_key{key_CT_SP_string_sigma_t_}
3700  */
3702  InputSections::c_stringParameters + "String_Sigma_T",
3703  0.5,
3704  {"1.3", "3.4"},
3705  [](const double &value) noexcept {
3706  return value >= 0.0 && value <= 1.0;
3707  }};
3708 
3709  /*!\Userguide
3710  * \page doxypage_input_conf_ct_string_parameters
3711  * \optional_key{key_CT_SP_string_tension_,String_Tension,double,1.0,
3712  * \f$x\geq 0\f$}
3713  *
3714  * String tension \f$\kappa\f$ \unit{in GeV/fm} connecting massless quarks
3715  * in Hamiltonian, \f[H=|p_1|+|p_2|+\kappa |x_1-x_2|\;.\f] This parameter is
3716  * only used to determine particles' formation times according to the yo-yo
3717  * formalism (in the soft string routine for now).
3718  */
3719  /**
3720  * \see_key{key_CT_SP_string_tension_}
3721  */
3723  InputSections::c_stringParameters + "String_Tension",
3724  1.0,
3725  {"1.3"},
3726  [](const double &value) noexcept { return value >= 0.0; }};
3727 
3728  /*!\Userguide
3729  * \page doxypage_input_conf_ct_string_parameters
3730  * \optional_key{key_CT_SP_stringz_a_,StringZ_A,double,1.0,
3731  * \f$0\leq x\leq 2\f$}
3732  *
3733  * Parameter \f$a\f$ in Pythia fragmentation function \f$f(z)\f$,
3734  * \f[f(z) = \frac{1}{z} (1-z)^a \exp\left(-b\frac{m_T^2}{z}\right)\;.\f]
3735  */
3736  /**
3737  * \see_key{key_CT_SP_stringz_a_}
3738  */
3740  InputSections::c_stringParameters + "StringZ_A",
3741  1.0,
3742  {"1.3", "3.4"},
3743  [](const double &value) noexcept {
3744  return value >= 0.0 && value <= 2.0;
3745  }};
3746 
3747  /*!\Userguide
3748  * \page doxypage_input_conf_ct_string_parameters
3749  * \optional_key{key_CT_SP_stringz_a_leading_,StringZ_A_Leading,double,0.0,
3750  * \f$0\leq x\leq 2\f$}
3751  *
3752  * Parameter \f$a\f$ in Lund fragmentation function (see <tt>\ref
3753  * key_CT_SP_stringz_a_ "StringZ_A"</tt>) used to sample the light cone
3754  * momentum fraction of leading baryons in non-diffractive string processes.
3755  */
3756  /**
3757  * \see_key{key_CT_SP_stringz_a_leading_}
3758  */
3760  InputSections::c_stringParameters + "StringZ_A_Leading",
3761  0.0,
3762  {"1.6", "3.4"},
3763  [](const double &value) noexcept {
3764  return value >= 0.0 && value <= 2.0;
3765  }};
3766 
3767  /*!\Userguide
3768  * \page doxypage_input_conf_ct_string_parameters
3769  * \optional_key{key_CT_SP_stringz_b_,StringZ_B,double,0.3,
3770  * \f$0\leq x\leq 2\f$}
3771  *
3772  * Parameter \f$b\f$ \unit{in 1/GeV²} in Pythia fragmentation function shown
3773  * in <tt>\ref key_CT_SP_stringz_a_ "StringZ_A"</tt>.
3774  */
3775  /**
3776  * \see_key{key_CT_SP_stringz_b_}
3777  */
3779  InputSections::c_stringParameters + "StringZ_B",
3780  0.3,
3781  {"1.3", "3.4"},
3782  [](const double &value) noexcept {
3783  return value >= 0.0 && value <= 2.0;
3784  }};
3785 
3786  /*!\Userguide
3787  * \page doxypage_input_conf_ct_string_parameters
3788  * \optional_key{key_CT_SP_stringz_b_leading_,StringZ_B_Leading,double,
3789  * 3.0,\f$0.2\leq x\leq 5\f$}
3790  *
3791  * Parameter \f$b\f$ \unit{in 1/GeV²} in Lund fraghmentation function (see
3792  * <tt>\ref key_CT_SP_stringz_a_ "StringZ_B"</tt>) used to sample the light
3793  * cone momentum fraction of leading baryons in non-diffractive string
3794  * processes.
3795  */
3796  /**
3797  * \see_key{key_CT_SP_stringz_b_leading_}
3798  */
3800  InputSections::c_stringParameters + "StringZ_B_Leading",
3801  3.0,
3802  {"1.6", "3.4"},
3803  [](const double &value) noexcept {
3804  return value >= 0.2 && value <= 5.0;
3805  }};
3806 
3807  /*!\Userguide
3808  * \page doxypage_input_conf_ct_string_parameters
3809  * \optional_key{key_CT_SP_use_monash_tune_,Use_Monash_Tune,bool,
3810  * false,\none}
3811  *
3812  * Whether to use the Monash tune \iref{Skands:2014pea} for all string
3813  * processes. By default, the Monash tune is disabled.
3814  */
3815  /**
3816  * \see_key{key_CT_SP_use_monash_tune_}
3817  */
3819  InputSections::c_stringParameters + "Use_Monash_Tune",
3820  false,
3821  {"3.0", "3.4"},
3822  detail::get_default_validator<bool>()};
3823 
3824  /*!\Userguide
3825  * \page doxypage_input_conf_ct_string_parameters
3826  * \optional_key{key_CT_SP_unformed_xsec_suppression_,
3827  * Unformed_Xsec_Suppression,double,0.7,
3828  * \f$0 \le x \le 1\f$}
3829  *
3830  * Applies an additional suppression factor to the interaction cross
3831  * sections of unformed hadrons.
3832  *
3833  * This parameter rescales the effective cross sections of hadrons during
3834  * their formation time and can be used to tune the interaction strength of
3835  * unformed hadrons in dense environments.
3836  *
3837  * Notes:
3838  * - A value of 1.0 corresponds to no additional suppression.
3839  * - Values smaller than 1.0 reduce the interaction probability of unformed
3840  * hadrons.
3841  * - This parameter serves as a phenomenological tuning knob.
3842  */
3843  /**
3844  * \see_key{key_CT_SP_unformed_xsec_suppression_}
3845  */
3846 
3848  InputSections::c_stringParameters + "Unformed_Xsec_Suppression",
3849  0.7,
3850  {"3.4"},
3851  [](const double &value) noexcept {
3852  return value >= 0.0 && value <= 1.0;
3853  }};
3854 
3855  /*!\Userguide
3856  * \page doxypage_input_conf_ct_string_parameters
3857  * \optional_key{key_CT_SP_pythia_settings_,
3858  * Pythia_Settings,list of strings,[],\none}
3859  *
3860  * Additional Pythia 8 settings passed directly to the internal Pythia
3861  * instances used for string fragmentation.
3862  *
3863  * In the %YAML configuration file, provide each Pythia 8 setting as a
3864  * separate string:
3865  *
3866  * \code{.yaml}
3867  * Pythia_Settings:
3868  * - 'StringZ:aLund = 0.68'
3869  * - 'StringZ:bLund = 0.98'
3870  * \endcode
3871  *
3872  * In the future, this option will replace SMASH input parameters that map
3873  * one-to-one to individual Pythia 8 settings.
3874  *
3875  * The settings are applied after the corresponding SMASH string parameters.
3876  * Therefore, if the same Pythia 8 setting is configured both through a SMASH
3877  * input key and through `Pythia_Settings`, the value specified in
3878  * `Pythia_Settings` takes precedence.
3879  *
3880  * Invalid Pythia 8 settings cause SMASH to terminate during initialization.
3881  */
3882  /**
3883  * \see_key{key_CT_SP_pythia_settings_}
3884  */
3885  inline static const Key<std::vector<std::string>>
3887  InputSections::c_stringParameters + "Pythia_Settings",
3888  std::vector<std::string>{},
3889  {"3.4"},
3890  detail::get_default_validator<std::vector<std::string>>()};
3891 
3892  /*!\Userguide
3893  * \page doxypage_input_conf_ct_dileptons
3894  * \optional_key{key_CT_dileptons_decays_,Decays,bool,false,\none}
3895  *
3896  * Whether or not to enable dilepton production
3897  * from hadron decays. This includes direct
3898  * decays as well as Dalitz decays. Dilepton
3899  * decays additionally have to be uncommented in
3900  * the used *decaymodes.txt* file (see also \ref
3901  * input_collision_term_dileptons_note_ "this
3902  * note").
3903  */
3904  /**
3905  * \see_key{key_CT_dileptons_decays_}
3906  */
3908  InputSections::c_dileptons + "Decays",
3909  false,
3910  {"0.50"},
3911  detail::get_default_validator<bool>()};
3912 
3913  /*!\Userguide
3914  * \page doxypage_input_conf_ct_dileptons
3915  * \optional_key{key_CT_dileptons_bremsstrahlung_,Bremsstrahlung,bool,false,
3916  * \none}
3917  *
3918  * Whether or not to enable dilepton production via bremsstrahlung in
3919  * neutron-proton interactions. The approach follows the meson-exchange
3920  * approximation depicted in \iref{Shyam:2010vr}.
3921  */
3922  /**
3923  * \see_key{key_CT_dileptons_bremsstrahlung_}
3924  */
3926  InputSections::c_dileptons + "Bremsstrahlung",
3927  false,
3928  {"3.4"},
3929  detail::get_default_validator<bool>()};
3930 
3931  /*!\Userguide
3932  * \page doxypage_input_conf_ct_dileptons
3933  * \optional_key{key_CT_dileptons_pion_form_factor_,Pion_Form_Factor,string,
3934  * "Off",\any_valid}
3935  *
3936  * - `"Off"` &rarr; Implicitly using a factor of 1.
3937  * - `"FF1"` &rarr; Photon couples to pion direclty via \f$\rho_0\f$ meson.
3938  * - `"FF2"` &rarr; Photon couples 40% directly to intrinsic quark structure
3939  * of pion and 60% indirectly via \f$\rho_0\f$ meson.
3940  *
3941  * This key is only relevant if \key Bremsstrahlung is `true`.
3942  * Note that selecting option "FF2" leads to unphysical peaks at \f$\lambda\f$
3943  * cutoff. Usage is therefore not recommended above the energy scales
3944  * investigated by \iref{Shyam:2010vr}.
3945  */
3946  /**
3947  * \see_key{key_CT_dileptons_pion_form_factor_}
3948  */
3949  inline static const Key<DileptonBremsPionFormFactor>
3951  InputSections::c_dileptons + "Pion_Form_Factor",
3953  {"3.4"},
3954  detail::get_default_validator<DileptonBremsPionFormFactor>()};
3955 
3956  /*!\Userguide
3957  * \page doxypage_input_conf_ct_photons
3958  * \optional_key{key_CT_photons_2to2_scatterings_,2to2_Scatterings,bool,false,
3959  * \none}
3960  *
3961  * Whether or not to enable photon production in mesonic scattering
3962  * processes.
3963  */
3964  /**
3965  * \see_key{key_CT_photons_2to2_scatterings_}
3966  */
3968  InputSections::c_photons + "2to2_Scatterings",
3969  false,
3970  {"1.8"},
3971  detail::get_default_validator<bool>()};
3972 
3973  /*!\Userguide
3974  * \page doxypage_input_conf_ct_photons
3975  * \optional_key{key_CT_photons_bremsstrahlung_,Bremsstrahlung,bool,false,
3976  * \none}
3977  *
3978  * Whether or not to enable photon production in bremsstrahlung processes.
3979  */
3980  /**
3981  * \see_key{key_CT_photons_bremsstrahlung_}
3982  */
3984  InputSections::c_photons + "Bremsstrahlung",
3985  false,
3986  {"1.8"},
3987  detail::get_default_validator<bool>()};
3988 
3989  /*!\Userguide
3990  * \page doxypage_input_conf_ct_photons
3991  * \required_key{key_CT_photons_fractional_photons,Fractional_Photons,
3992  * int,\f$x\geq 1\f$}
3993  *
3994  * Number of fractional photons sampled per single perturbatively produced
3995  * photon.
3996  */
3997  /**
3998  * \see_key{key_CT_photons_fractional_photons}
3999  */
4001  InputSections::c_photons + "Fractional_Photons",
4002  {"1.8"},
4003  [](const int &value) noexcept {
4004  if (value > 100'000) {
4005  logg[LogArea::Configuration::id].warn(
4006  "The number of fractional photons per perturbatively produced "
4007  "photon is set to a very large value, which may lead to long\n"
4008  "runtimes. Make sure that this is intended.");
4009  }
4010  return value >= 1;
4011  }};
4012 
4013  /*!\Userguide
4014  * \page doxypage_input_conf_modi_collider
4015  *
4016  * \par Ways to specify incident energies &rarr; Only one can be given!
4017  *
4018  * \required_key_no_line{key_MC_e_kin_,E_Kin,double,\f$x>0\f$}
4019  *
4020  * Defines the energy of the collision by the kinetic energy per nucleon of
4021  * the projectile nucleus, \unit{in AGeV}. This assumes the target nucleus
4022  * is at rest. Note, this can also be given per-beam as described in \ref
4023  * doxypage_input_conf_modi_C_proj_targ. This key can be
4024  * omitted if the incident energy is specified in a different way.
4025  */
4026  /**
4027  * \see_key{key_MC_e_kin_}
4028  */
4029  inline static const Key<double> modi_collider_eKin{
4030  InputSections::m_collider + "E_Kin",
4031  {"0.50"},
4032  [](const double &value) noexcept { return value > 0; }};
4033 
4034  /*!\Userguide
4035  * \page doxypage_input_conf_modi_collider
4036  * \required_key_no_line{key_MC_e_tot_,E_Tot,double,\f$x>0\f$}
4037  *
4038  * Defines the energy of the collision by the total energy per nucleon of
4039  * the projectile nucleus, \unit{in AGeV}. This assumes the target nucleus
4040  * is at rest. Note, this can also be given per-beam as described in \ref
4041  * doxypage_input_conf_modi_C_proj_targ. This key can be
4042  * omitted if the incident energy is specified in a different way.
4043  */
4044  /**
4045  * \see_key{key_MC_e_tot_}
4046  */
4047  inline static const Key<double> modi_collider_eTot{
4048  InputSections::m_collider + "E_Tot",
4049  {"2.0.2"},
4050  [](const double &value) noexcept { return value > 0; }};
4051 
4052  /*!\Userguide
4053  * \page doxypage_input_conf_modi_collider
4054  * \required_key_no_line{key_MC_p_lab_,P_Lab,double,\f$x>0\f$}
4055  *
4056  * Defines the energy of the collision by the initial momentum per nucleon
4057  * of the projectile nucleus, \unit{in AGeV}. This assumes the target
4058  * nucleus is at rest. This must be positive. Note, this can also be given
4059  * per-beam as described in \ref doxypage_input_conf_modi_C_proj_targ. This
4060  * key can be omitted if the incident energy is specified in a different
4061  * way.
4062  */
4063  /**
4064  * \see_key{key_MC_p_lab_}
4065  */
4066  inline static const Key<double> modi_collider_pLab{
4067  InputSections::m_collider + "P_Lab",
4068  {"0.50"},
4069  [](const double &value) noexcept { return value > 0; }};
4070 
4071  /*!\Userguide
4072  * \page doxypage_input_conf_modi_collider
4073  * \required_key_no_line{key_MC_sqrtsnn_,Sqrtsnn,double,\f$x>0\f$}
4074  *
4075  * Defines the energy of the collision \unit{in GeV} as center-of-mass
4076  * energy in the collision of two hadrons, one for each nucleus, having the
4077  * average mass of all the hadrons composing the given nucleus. This key can
4078  * be omitted if the incident energy is specified in a different way.
4079  */
4080  /**
4081  * \see_key{key_MC_sqrtsnn_}
4082  */
4083  inline static const Key<double> modi_collider_sqrtSNN{
4084  InputSections::m_collider + "Sqrtsnn",
4085  {"0.50"},
4086  [](const double &value) noexcept { return value > 0; }};
4087 
4088  /*!\Userguide
4089  * \page doxypage_input_conf_modi_collider
4090  * \optional_key{key_MC_calc_frame_,Calculation_Frame,string,
4091  * "center of velocity",\any_valid}
4092  *
4093  * The frame in which the collision is calculated. Possible values are
4094  * - `"center of velocity"`
4095  * - `"center of mass"`
4096  * - `"fixed target"`
4097  *
4098  * \note
4099  * Using `E_Tot`, `E_kin` or `P_Lab` to quantify the collision energy is not
4100  * sufficient to configure a collision in a fixed target frame. You need to
4101  * additionally change the `Calculation_Frame`. Any format of incident
4102  * energy can however be combined with any calculation frame, the provided
4103  * incident energy is then intrinsically translated to the quantity needed
4104  * for the computation.
4105  */
4106  /**
4107  * \see_key{key_MC_calc_frame_}
4108  */
4110  InputSections::m_collider + "Calculation_Frame",
4112  {"0.50"},
4113  detail::get_default_validator<CalculationFrame>()};
4114 
4115  /*!\Userguide
4116  * \page doxypage_input_conf_modi_collider
4117  * \optional_key{key_MC_collision_within_nucleus_,Collisions_Within_Nucleus,
4118  * bool,false,\none}
4119  *
4120  * Determine whether to allow the first collisions within the same nucleus.
4121  * - `true` &rarr; First collisions within the same nucleus allowed.
4122  * - `false` &rarr; First collisions within the same nucleus forbidden.
4123  */
4124  /**
4125  * \see_key{key_MC_collision_within_nucleus_}
4126  */
4128  InputSections::m_collider + "Collisions_Within_Nucleus",
4129  false,
4130  {"1.0"},
4131  detail::get_default_validator<bool>()};
4132 
4133  /*!\Userguide
4134  * \page doxypage_input_conf_modi_collider
4135  * \optional_key{key_MC_fermi_motion_,Fermi_Motion,string,"off",\any_valid}
4136  *
4137  * - `"on"` &rarr; Switch Fermi motion on, it is recommended to also
4138  * activate potentials.
4139  * - `"off"` &rarr; Switch Fermi motion off.
4140  * - `"frozen"` &rarr; Use "frozen" if you want to use Fermi motion
4141  * without potentials.
4142  */
4143  /**
4144  * \see_key{key_MC_fermi_motion_}
4145  */
4147  InputSections::m_collider + "Fermi_Motion",
4149  {"0.60"},
4150  detail::get_default_validator<FermiMotion>()};
4151 
4152  /*!\Userguide
4153  * \page doxypage_input_conf_modi_collider
4154  * \optional_key{key_MC_initial_distance_,Initial_Distance,
4155  * double,4.0,\f$x>0\f$}
4156  *
4157  * The initial distance of the two nuclei \unit{in fm}:
4158  * \f$z_{\rm min}^{\rm target} - z_{\rm max}^{\rm projectile}\f$.
4159  *
4160  * @note This distance is applied before the Lorentz boost to the chosen
4161  * calculation frame, and thus the actual distance may be different.
4162  */
4163  /**
4164  * \see_key{key_MC_initial_distance_}
4165  */
4167  InputSections::m_collider + "Initial_Distance",
4168  4.0,
4169  {"0.50"},
4170  [](const double &value) noexcept { return value > 0; }};
4171 
4172  /*!\Userguide
4173  * \page doxypage_input_conf_modi_C_proj_targ
4174  * \optional_key{key_MC_PT_diffusiveness_,Diffusiveness,double,
4175  * </tt>\f$d(A)\f$<tt>, \f$0\le d \le1\f$}
4176  *
4177  * Diffusiveness of the Woods-Saxon distribution for the nucleus \unit{in
4178  * fm}. In general, the default value is \f[ d(A)=\begin{cases}
4179  * 0.545 & A \le 16\\
4180  * 0.54 & A > 16
4181  * \end{cases}\;.
4182  * \f]
4183  * For copper, zirconium, ruthenium, xenon, gold, lead and uranium, a more
4184  * specific default value is used (see nucleus.cc).
4185  */
4186  /**
4187  * \see_key{key_MC_PT_diffusiveness_}
4188  */
4190  InputSections::m_c_projectile + "Diffusiveness",
4192  {"0.90"},
4193  [](const double &value) noexcept { return value >= 0 && value <= 1; }};
4194  /**
4195  * \see_key{key_MC_PT_diffusiveness_}
4196  */
4198  InputSections::m_c_target + "Diffusiveness",
4200  {"0.90"},
4201  [](const double &value) noexcept { return value >= 0 && value <= 1; }};
4202 
4203  /*!\Userguide
4204  * \page doxypage_input_conf_modi_C_proj_targ
4205  * \required_key{key_MC_PT_particles_,%Particles,map<int\,int>,\none}
4206  *
4207  * A map in which the keys are PDG codes and the values are number of
4208  * particles with that PDG code that should be in the current nucleus.
4209  * For example:
4210  * - `{2212: 82, 2112: 126}` &rarr; a lead-208 nucleus (82 protons and 126
4211  * neutrons = 208 nucleons)
4212  * - `{2212: 1, 2112: 1, 3122: 1}` &rarr; for Hyper-Triton (one proton, one
4213  * neutron and one \f$\Lambda\f$).
4214  */
4215  /**
4216  * \see_key{key_MC_PT_particles_}
4217  */
4218  inline static const Key<std::map<PdgCode, int>>
4220  InputSections::m_c_projectile + "Particles",
4221  {"0.50"},
4222  [](const auto &value) noexcept {
4223  return !value.empty() && std::all_of(value.begin(), value.end(),
4224  [](const auto &entry) {
4225  return entry.second > 0;
4226  });
4227  }};
4228  /**
4229  * \see_key{key_MC_PT_particles_}
4230  */
4231  inline static const Key<std::map<PdgCode, int>>
4233  InputSections::m_c_target + "Particles",
4234  {"0.50"},
4235  [](const auto &value) noexcept {
4236  return !value.empty() && std::all_of(value.begin(), value.end(),
4237  [](const auto &entry) {
4238  return entry.second > 0;
4239  });
4240  }};
4241 
4242  /*!\Userguide
4243  * \page doxypage_input_conf_modi_C_proj_targ
4244  * \optional_key{key_MC_PT_radius_,Radius,double,</tt>\f$r(A)\f$<tt>,\f$r>0\f$}
4245  *
4246  * Radius of nucleus \unit{in fm}. In general, the default value is
4247  * \f[
4248  * r(A)=\begin{cases}
4249  * 1.2 \, A^{1/3} & A \le 16\\
4250  * 1.12 \, A^{1/3} - 0.86 \, A^{-1/3} & A > 16
4251  * \end{cases}\;.
4252  * \f]
4253  * For copper, zirconium, ruthenium, xenon, gold, lead, and uranium, a more
4254  * specific default value is used (see nucleus.cc).
4255  */
4256  /**
4257  * \see_key{key_MC_PT_radius_}
4258  */
4260  InputSections::m_c_projectile + "Radius",
4262  {"0.50"},
4263  [](const double &value) noexcept { return value > 0; }};
4264  /**
4265  * \see_key{key_MC_PT_radius_}
4266  */
4268  InputSections::m_c_target + "Radius",
4270  {"0.50"},
4271  [](const double &value) noexcept { return value > 0; }};
4272 
4273  /*!\Userguide
4274  * \page doxypage_input_conf_modi_C_proj_targ
4275  * \optional_key{key_MC_PT_saturation_density_,Saturation_Density,double,
4276  * </tt>\f$\int\rho(r)\:\mathrm{d}^3r=N_{nucleons}\f$<tt>,
4277  * \f$0.1\le\rho\le0.2\f$}
4278  *
4279  * Saturation density of the nucleus \unit{in 1/fm³}.
4280  * If not any value is specified, the saturation density is calculated such
4281  * that the integral over the Woods-Saxon distribution returns the number of
4282  * nucleons in the nucleus.
4283  */
4284  /**
4285  * \see_key{key_MC_PT_saturation_density_}
4286  */
4288  InputSections::m_c_projectile + "Saturation_Density",
4290  {"0.50"},
4291  [](const double &value) noexcept {
4292  return value >= 0.1 && value <= 0.2;
4293  }};
4294  /**
4295  * \see_key{key_MC_PT_saturation_density_}
4296  */
4298  InputSections::m_c_target + "Saturation_Density",
4300  {"0.50"},
4301  [](const double &value) noexcept {
4302  return value >= 0.1 && value <= 0.2;
4303  }};
4304 
4305  /*!\Userguide
4306  * \page doxypage_input_conf_modi_C_proj_targ
4307  * <hr>
4308  * \par Possible incident energies given per beam
4309  *
4310  * \required_key_no_line{key_MC_PT_e_kin_,E_Kin,double,\f$x>0\f$}
4311  *
4312  * Set the kinetic energy \unit{in GeV} per particle of the beam. This key,
4313  * if used, must be present in both `Projectile` and `Target` section. This
4314  * key can be omitted if the incident energy is specified in a different
4315  * way.
4316  */
4317  /**
4318  * \see_key{key_MC_PT_e_kin_}
4319  */
4322  {"0.50"},
4323  [](const double &value) noexcept { return value > 0; }};
4324  /**
4325  * \see_key{key_MC_PT_e_kin_}
4326  */
4328  InputSections::m_c_target + "E_Kin",
4329  {"0.50"},
4330  [](const double &value) noexcept { return value > 0; }};
4331 
4332  /*!\Userguide
4333  * \page doxypage_input_conf_modi_C_proj_targ
4334  * \required_key_no_line{key_MC_PT_e_tot_,E_Tot,double,\f$x>0\f$}
4335  *
4336  * Set the totat energy \unit{in GeV} per particle of the beam. This key,
4337  * if used, must be present in both `Projectile` and `Target` section. This
4338  * key can be omitted if the incident energy is specified in a different
4339  * way.
4340  */
4341  /**
4342  * \see_key{key_MC_PT_e_tot_}
4343  */
4346  {"2.0.2"},
4347  [](const double &value) noexcept { return value > 0; }};
4348  /**
4349  * \see_key{key_MC_PT_e_tot_}
4350  */
4352  InputSections::m_c_target + "E_Tot",
4353  {"2.0.2"},
4354  [](const double &value) noexcept { return value > 0; }};
4355 
4356  /*!\Userguide
4357  * \page doxypage_input_conf_modi_C_proj_targ
4358  * \required_key_no_line{key_MC_PT_p_lab_,P_Lab,double,\f$x>0\f$}
4359  *
4360  * Set the momentum \unit{in GeV} per particle of the beam. This key,
4361  * if used, must be present in both `Projectile` and `Target` section. This
4362  * key can be omitted if the incident energy is specified in a different
4363  * way.
4364  *
4365  * \note
4366  * If the beam specific kinetic energy or momentum is set using either of
4367  * these keys, then it must be specified in the same way (not necessarily
4368  * same value) for both beams. This is for example useful to simulate for
4369  * p-Pb collisions at the LHC, where the centre-of-mass system does not
4370  * correspond to the laboratory system (see \ref
4371  * input_modi_collider_projectile_and_target_ex1_ "example").
4372  */
4373  /**
4374  * \see_key{key_MC_PT_p_lab_}
4375  */
4378  {"0.50"},
4379  [](const double &value) noexcept { return value > 0; }};
4380  /**
4381  * \see_key{key_MC_PT_p_lab_}
4382  */
4384  InputSections::m_c_target + "P_Lab",
4385  {"0.50"},
4386  [](const double &value) noexcept { return value > 0; }};
4387 
4388  /*!\Userguide
4389  * \page doxypage_input_conf_modi_C_proj_targ
4390  * <hr>
4391  * <h3> Custom nuclei </h3>
4392  *
4393  * It is possible to further customize the projectile and/or target using
4394  * the `Custom` section, which should then contain few required keys, if
4395  * given.
4396  *
4397  * \required_key_no_line{key_MC_PT_custom_file_dir_,File_Directory,
4398  * string, <b>Existing directory</b>}
4399  *
4400  * The directory where the external list with the nucleon configurations
4401  * is located. <b>Make sure to use an absolute path!</b>
4402  */
4403  /**
4404  * \see_key{key_MC_PT_custom_file_dir_}
4405  */
4406  inline static const Key<std::string>
4408  InputSections::m_c_p_custom + "File_Directory",
4409  {"1.6"},
4410  [](const std::string &value) noexcept {
4411  return std::filesystem::is_directory(value);
4412  }};
4413  /**
4414  * \see_key{key_MC_PT_custom_file_dir_}
4415  */
4416  inline static const Key<std::string>
4418  InputSections::m_c_t_custom + "File_Directory",
4419  {"1.6"},
4420  [](const std::string &value) noexcept {
4421  return std::filesystem::is_directory(value);
4422  }};
4423 
4424  /*!\Userguide
4425  * \page doxypage_input_conf_modi_C_proj_targ
4426  * \required_key_no_line{key_MC_PT_custom_file_name_,File_Name,string,
4427  * <b>Possible filename on Linux OS</b>}
4428  *
4429  * The file name of the external list with the nucleon configurations.
4430  */
4431  /**
4432  * \see_key{key_MC_PT_custom_file_name_}
4433  */
4435  InputSections::m_c_p_custom + "File_Name",
4436  {"1.6"},
4437  [](const std::string &value) noexcept {
4438  if (value.empty() || value == "." || value == "..")
4439  return false;
4440  else
4441  return std::none_of(value.begin(), value.end(),
4442  [](auto c) { return c == '/' || c == '\0'; });
4443  }};
4444  /**
4445  * \see_key{key_MC_PT_custom_file_name_}
4446  */
4448  InputSections::m_c_t_custom + "File_Name",
4449  {"1.6"},
4450  [](const std::string &value) noexcept {
4451  if (value.empty() || value == "." || value == "..")
4452  return false;
4453  else
4454  return std::none_of(value.begin(), value.end(),
4455  [](auto c) { return c == '/' || c == '\0'; });
4456  }};
4457 
4458  /*!\Userguide
4459  * \page doxypage_input_conf_modi_C_proj_targ
4460  * <hr>
4461  * <h3> Deformed nuclei </h3>
4462  *
4463  * It is possible to deform the projectile and/or target nuclei using the
4464  * `Deformed` section, which should then contain some configuration, if
4465  * given.
4466  *
4467  * \required_key_no_line{key_MC_PT_deformed_auto_,Automatic,bool,\none}
4468  *
4469  * - `true` &rarr; Set parameters of spherical deformation based on mass
4470  * number of the nucleus. Currently the following deformed nuclei are
4471  * implemented: Cu, Zr, Ru, Au, Pb, U, and Xe (see deformednucleus.cc). If
4472  * set to `true` the other parameters should not be provided.
4473  * - `false` &rarr; Manually set parameters of spherical deformation. This
4474  * requires the additional specification of at least one among `Beta_2`,
4475  * `Beta_3`, `Beta_4`, which follow \iref{Moller:1993ed} and
4476  * \iref{Schenke:2019ruo}. These parameters enter the radius in the
4477  * Wood-Saxon profile as follows,
4478  * \f[
4479  * R(\theta,\phi) = R_0 \cdot \biggl\{
4480  * 1+
4481  * \beta_2\,\Bigl[\cos\gamma\, Y_2^0(\theta,\phi) +
4482  * \sqrt{2}\,\sin\gamma\,\Re\bigl(Y_2^2(\theta,\phi)\bigr)\Bigr]+
4483  * \beta_3^{\phantom{0}}\,Y_3^0(\theta,\phi)+
4484  * \beta_4^{\phantom{0}}\,Y_4^0(\theta,\phi)
4485  * \biggr\}
4486  * \f]
4487  * and are set to 0 if not specified.
4488  */
4489  /**
4490  * \see_key{key_MC_PT_deformed_auto_}
4491  */
4493  InputSections::m_c_p_deformed + "Automatic",
4494  {"1.5"},
4495  detail::get_default_validator<bool>()};
4496  /**
4497  * \see_key{key_MC_PT_deformed_auto_}
4498  */
4500  InputSections::m_c_t_deformed + "Automatic",
4501  {"1.5"},
4502  detail::get_default_validator<bool>()};
4503 
4504  /*!\Userguide
4505  * \page doxypage_input_conf_modi_C_proj_targ
4506  * \optional_key_no_line{key_MC_PT_deformed_betaII_,Beta_2,double,0.0,
4507  * \f$-1\le\beta_2\le1\f$}
4508  *
4509  * The deformation coefficient \f$\beta_2\f$ for the spherical harmonic
4510  * \f$Y_2^0\f$ in \f$R(\theta,\phi)\f$ \ref key_MC_PT_deformed_auto_
4511  * "above".
4512  */
4513  /**
4514  * \see_key{key_MC_PT_deformed_betaII_}
4515  */
4517  InputSections::m_c_p_deformed + "Beta_2",
4518  0.0,
4519  {"1.5"},
4520  [](const double &value) noexcept { return value >= -1 && value <= 1; }};
4521  /**
4522  * \see_key{key_MC_PT_deformed_betaII_}
4523  */
4525  InputSections::m_c_t_deformed + "Beta_2",
4527  {"1.5"},
4528  [](const double &value) noexcept { return value >= -1 && value <= 1; }};
4529 
4530  /*!\Userguide
4531  * \page doxypage_input_conf_modi_C_proj_targ
4532  * \optional_key_no_line{key_MC_PT_deformed_betaIII_,Beta_3,double,0.0,
4533  * \f$-1\le\beta_3\le1\f$}
4534  *
4535  * The deformation coefficient \f$\beta_3\f$ for the spherical harmonic
4536  * \f$Y_3^0\f$ in \f$R(\theta,\phi)\f$ \ref key_MC_PT_deformed_auto_
4537  * "above".
4538  */
4539  /**
4540  * \see_key{key_MC_PT_deformed_betaIII_}
4541  */
4543  InputSections::m_c_p_deformed + "Beta_3",
4544  0.0,
4545  {"3.0"},
4546  [](const double &value) noexcept { return value >= -1 && value <= 1; }};
4547  /**
4548  * \see_key{key_MC_PT_deformed_betaIII_}
4549  */
4551  InputSections::m_c_t_deformed + "Beta_3",
4553  {"3.0"},
4554  [](const double &value) noexcept { return value >= -1 && value <= 1; }};
4555 
4556  /*!\Userguide
4557  * \page doxypage_input_conf_modi_C_proj_targ
4558  * \optional_key_no_line{key_MC_PT_deformed_betaIV_,Beta_4,double,0.0,
4559  * \f$-1\le\beta_4\le1\f$}
4560  *
4561  * The deformation coefficient \f$\beta_4\f$ for the spherical harmonic
4562  * \f$Y_4^0\f$ in \f$R(\theta,\phi)\f$ \ref key_MC_PT_deformed_auto_
4563  * "above".
4564  */
4565  /**
4566  * \see_key{key_MC_PT_deformed_betaIV_}
4567  */
4569  InputSections::m_c_p_deformed + "Beta_4",
4570  0.0,
4571  {"1.5"},
4572  [](const double &value) noexcept { return value >= -1 && value <= 1; }};
4573  /**
4574  * \see_key{key_MC_PT_deformed_betaIV_}
4575  */
4577  InputSections::m_c_t_deformed + "Beta_4",
4579  {"1.5"},
4580  [](const double &value) noexcept { return value >= -1 && value <= 1; }};
4581 
4582  /*!\Userguide
4583  * \page doxypage_input_conf_modi_C_proj_targ
4584  * \optional_key_no_line{key_MC_PT_deformed_gamma_,Gamma,double,0.0,
4585  * \f$0\le\gamma\le\pi\f$}
4586  *
4587  * The parameter describes triaxiality \f$\gamma\f$ of the nucleus in
4588  * \f$R(\theta,\phi)\f$ \ref key_MC_PT_deformed_auto_ "above".
4589  */
4590  /**
4591  * \see_key{key_MC_PT_deformed_gamma_}
4592  */
4595  0.0,
4596  {"3.0"},
4597  [](const double &value) noexcept { return value >= 0 && value <= M_PI; }};
4598  /**
4599  * \see_key{key_MC_PT_deformed_gamma_}
4600  */
4604  {"3.0"},
4605  [](const double &value) noexcept { return value >= 0 && value <= M_PI; }};
4606 
4607  /*!\Userguide
4608  * \page doxypage_input_conf_modi_C_proj_targ
4609  * <hr>
4610  * <h3> Alpha-Clustered oxygen nuclei </h3>
4611  *
4612  * It is possible to have alpha-clustered projectile and/or target
4613  * **oxygen** nuclei using the `Alpha_Clustered` section, which should then
4614  * contain some configuration, if given. This will create four Helium nuclei
4615  * that are placed on the vertices of a regular tetrahedron with center in
4616  * the origin, \f$\left(0,0,0\right)\f$. The initial positions of these
4617  * vertices are the following: \f[ \left(1,0,0\right),\; \left(-\frac{1}{3},
4618  * \frac{\sqrt{8}}{3}, 0\right),\; \left(-\frac{1}{3}, -\frac{\sqrt{8}}{6},
4619  * \frac{\sqrt{24}}{6}\right),\; \left(-\frac{1}{3}, -\frac{\sqrt{8}}{6},
4620  * -\frac{\sqrt{24}}{6}\right)\quad. \f] This means there is one vertex on
4621  * the x-axis and the rest lie on a plane parallel to the y-z plane. For
4622  * colliding them with a specific orientation refer to the `Orientation`
4623  * section.
4624  *
4625  * \required_key_no_line{key_MC_PT_alphaClustered_auto_,Automatic,bool,\none}
4626  *
4627  * - `true` &rarr; Automatically set the side length of the tetrahedron used
4628  * for alpha-clustering.
4629  * - `false` &rarr; Manually set the side length of the tetrahedron used for
4630  * alpha-clustering.
4631  */
4632  /**
4633  * \see_key{key_MC_PT_alphaClustered_auto_}
4634  */
4635  inline static const Key<bool>
4638  {"3.2"},
4639  detail::get_default_validator<bool>()};
4640  /**
4641  * \see_key{key_MC_PT_alphaClustered_auto_}
4642  */
4645  {"3.2"},
4646  detail::get_default_validator<bool>()};
4647 
4648  /*!\Userguide
4649  * \page doxypage_input_conf_modi_C_proj_targ
4650  * \optional_key_no_line{key_MC_PT_alphaClustered_sideLength_,Side_Length,
4651  * double,3.42,\f$x>0\f$}
4652  *
4653  * The sidelength \unit{in fm} of the regular tetrahedron used for
4654  * alpha-clustering. The default value of 3.42 fm was taken from
4655  * \iref{Li:2020vrg}.
4656  */
4657  /**
4658  * \see_key{key_MC_PT_alphaClustered_sideLength_}
4659  */
4660  inline static const Key<double>
4662  InputSections::m_c_p_alphaClustered + "Side_Length",
4663  3.42,
4664  {"3.2"},
4665  [](const double &value) noexcept { return value > 0; }};
4666  /**
4667  * \see_key{key_MC_PT_alphaClustered_sideLength_}
4668  */
4669  inline static const Key<double>
4671  InputSections::m_c_t_alphaClustered + "Side_Length",
4673  .default_value(),
4674  {"3.2"},
4675  [](const double &value) noexcept { return value > 0; }};
4676 
4677  /*!\Userguide
4678  * \page doxypage_input_conf_modi_C_proj_targ
4679  * <hr>
4680  * <h3> Defining orientation </h3>
4681  *
4682  * In the `Orientation` section it is possible to specify the orientation of
4683  * the nucleus by rotations which are performed about the axes of a
4684  * coordinate system that is fixed with respect to the nucleus and whose
4685  * axes are parallel to those of the computational frame before the first
4686  * rotation. Note that the nucleus is first rotated around the z-axis by
4687  * phi, then around the now rotated x-axis by theta and then around the
4688  * rotated z-axis by psi.
4689  *
4690  * \optional_key_no_line{key_MC_PT_orientation_phi_,Phi,double,0.0,
4691  * \f$0\le\phi\le 2\pi\f$}
4692  *
4693  * The angle by which to rotate the nucleus about the z-axis.
4694  */
4695  /**
4696  * \see_key{key_MC_PT_orientation_phi_}
4697  */
4700  0.0,
4701  {"0.50"},
4702  [](const double &value) noexcept {
4703  return value >= 0 && value <= 2 * M_PI;
4704  }};
4705  /**
4706  * \see_key{key_MC_PT_orientation_phi_}
4707  */
4711  {"0.50"},
4712  [](const double &value) noexcept {
4713  return value >= 0 && value <= 2 * M_PI;
4714  }};
4715  /*!\Userguide
4716  * \page doxypage_input_conf_modi_C_proj_targ
4717  * \optional_key_no_line{key_MC_PT_orientation_theta_,Theta,double,0.0,
4718  * \f$0\le\theta\le\pi\f$}
4719  *
4720  * The angle by which to rotate the nucleus about the rotated x-axis.
4721  */
4722  /**
4723  * \see_key{key_MC_PT_orientation_theta_}
4724  */
4727  0.0,
4728  {"0.50"},
4729  [](const double &value) noexcept { return value >= 0 && value <= M_PI; }};
4730  /**
4731  * \see_key{key_MC_PT_orientation_theta_}
4732  */
4736  {"0.50"},
4737  [](const double &value) noexcept { return value >= 0 && value <= M_PI; }};
4738  /*!\Userguide
4739  * \page doxypage_input_conf_modi_C_proj_targ
4740  * \optional_key_no_line{key_MC_PT_orientation_psi_,Psi,double,0.0,
4741  * \f$0\le\psi\le 2\pi\f$}
4742  *
4743  * The angle by which to rotate the nucleus about the rotated z-axis.
4744  */
4745  /**
4746  * \see_key{key_MC_PT_orientation_psi_}
4747  */
4750  0.0,
4751  {"3.0"},
4752  [](const double &value) noexcept {
4753  return value >= 0 && value <= 2 * M_PI;
4754  }};
4755  /**
4756  * \see_key{key_MC_PT_orientation_psi_}
4757  */
4761  {"3.0"},
4762  [](const double &value) noexcept {
4763  return value >= 0 && value <= 2 * M_PI;
4764  }};
4765 
4766  /*!\Userguide
4767  * \page doxypage_input_conf_modi_C_proj_targ
4768  * \optional_key_no_line{key_MC_PT_orientation_random_,Random_Rotation,
4769  * bool,false,\none}
4770  *
4771  * Whether the created nucleus object should be randomly rotated in space.
4772  */
4773  /**
4774  * \see_key{key_MC_PT_orientation_random_}
4775  */
4777  InputSections::m_c_p_orientation + "Random_Rotation",
4778  false,
4779  {"1.7"},
4780  detail::get_default_validator<bool>()};
4781  /**
4782  * \see_key{key_MC_PT_orientation_random_}
4783  */
4785  InputSections::m_c_t_orientation + "Random_Rotation",
4787  {"1.7"},
4788  detail::get_default_validator<bool>()};
4789 
4790  /*!\Userguide
4791  * \page doxypage_input_conf_modi_C_impact_parameter
4792  * \optional_key{key_MC_impact_max_,Max,double,0.0,\f$x\ge0\f$}
4793  *
4794  * Like `Range: [0.0, Max]`. Note that if both `Range` and `Max` are
4795  * specified, `Max` takes precedence (\unit{in fm}).
4796  */
4797  /**
4798  * \see_key{key_MC_impact_max_}
4799  */
4801  InputSections::m_c_impact + "Max",
4802  0.0,
4803  {"0.50"},
4804  [](const double &value) noexcept { return value >= 0; }};
4805 
4806  /*!\Userguide
4807  * \page doxypage_input_conf_modi_C_impact_parameter
4808  * \optional_key{key_MC_impact_rnd_reaction_plane_,Random_Reaction_Plane,
4809  * bool,false,\none}
4810  *
4811  * Rotate the direction of the separation of the two nuclei due to the
4812  * impact parameter with a uniform random angle in the x-y plane.
4813  */
4814  /**
4815  * \see_key{key_MC_impact_rnd_reaction_plane_}
4816  */
4818  InputSections::m_c_impact + "Random_Reaction_Plane",
4819  false,
4820  {"1.8"},
4821  detail::get_default_validator<bool>()};
4822 
4823  /*!\Userguide
4824  * \page doxypage_input_conf_modi_C_impact_parameter
4825  * \optional_key{key_MC_impact_range_,Range,list of two doubles,[0.0\,0.0],
4826  * \f$x_i\ge0\f$}
4827  *
4828  * A list of minimal and maximal impact parameters \unit{in fm} between
4829  * which \f$b\f$ should be chosen. The order of these is not important.
4830  */
4831  /**
4832  * \see_key{key_MC_impact_range_}
4833  */
4835  InputSections::m_c_impact + "Range",
4836  std::array<double, 2>{{0.0, 0.0}},
4837  {"0.50"},
4838  [](const std::array<double, 2> &value) noexcept {
4839  return value[0] >= 0 && value[1] >= 0;
4840  }};
4841 
4842  /*!\Userguide
4843  * \page doxypage_input_conf_modi_C_impact_parameter
4844  * \optional_key{key_MC_impact_sample_,Sample,string,"quadratic",\any_valid}
4845  *
4846  * Distribution according to which the impact parameter is sampled.
4847  * Possible alternatives:
4848  *
4849  * - `"uniform"` &rarr; use uniform sampling of the impact parameter
4850  * (uniform in \f$b\f$: \f$dP(b) = db\f$)
4851  * - `"quadratic"` &rarr; use areal (aka quadratic) input sampling (the
4852  * probability of an input parameter range is proportional to the area
4853  * corresponding to that range, uniform in \f$b^2\f$:
4854  * \f$dP(b) = b\,db\f$).
4855  * - `"custom"` &rarr; creates a custom distribution of piecewise linear
4856  * functions based on the provided impact parameter `Values` and the
4857  * corresponding `Yields` (likelihood of that impact parameter value
4858  * to be sampled). This distribution is used to randomly sample the
4859  * impact parameter using rejection sampling. Note that both these
4860  * keys, `Values` and `Yields` are required when using `Sample:
4861  * "custom"`.
4862  */
4863  /**
4864  * \see_key{key_MC_impact_sample_}
4865  */
4867  InputSections::m_c_impact + "Sample",
4869  {"0.50"},
4870  detail::get_default_validator<Sampling>()};
4871 
4872  /*!\Userguide
4873  * \page doxypage_input_conf_modi_C_impact_parameter
4874  * \optional_key{key_MC_impact_value_,Value,double,0.0,\f$x\ge0\f$}
4875  *
4876  * Fixed value for the impact parameter \unit{in fm}.
4877  * \attention If this value is set, all further `Impact` keys are ignored.
4878  */
4879  /**
4880  * \see_key{key_MC_impact_value_}
4881  */
4883  InputSections::m_c_impact + "Value",
4884  0.0,
4885  {"0.50"},
4886  [](const double &value) noexcept { return value >= 0; }};
4887 
4888  /*!\Userguide
4889  * \page doxypage_input_conf_modi_C_impact_parameter
4890  * <hr>
4891  * \par Custom sampling
4892  * \required_key_no_line{key_MC_impact_values_,Values,list of doubles,
4893  * \f$x_i\ge0\f$}
4894  *
4895  * Impact parameter `Values` \unit{in fm} used to build the custom
4896  * distribution. Each element of `Values` corresponds to an element of
4897  * `Yields`, these are connected through piecewise linear functions to
4898  * create the distribution. Must be same length as `Yields`. This key can be
4899  * omitted if `Sample` is not set to `"custom"`.
4900  */
4901  /**
4902  * \see_key{key_MC_impact_values_}
4903  */
4905  InputSections::m_c_impact + "Values",
4906  {"0.80"},
4907  [](const std::vector<double> &value) noexcept {
4908  return std::all_of(
4909  value.begin(), value.end(),
4910  [](const double entry) noexcept { return entry >= 0; });
4911  }};
4912 
4913  /*!\Userguide
4914  * \page doxypage_input_conf_modi_C_impact_parameter
4915  * \required_key_no_line{key_MC_impact_yields_,Yields,list of doubles,
4916  * \f$x_i\ge0\f$}
4917  *
4918  * Each element of `Yields` indicates the likelihood of sampling the
4919  * corresponding impact parameter in `Values`. Between the specified points
4920  * of `Values` and `Yields`, linear interpolation is used to build the
4921  * custom distribution. `Yields` must be same length as `Values`. It does
4922  * not need to be normed. This key is needed if and only if `Sample` is set
4923  * to `"custom"`.
4924  */
4925  /**
4926  * \see_key{key_MC_impact_sample_}
4927  */
4929  InputSections::m_c_impact + "Yields",
4930  {"0.80"},
4931  [](const std::vector<double> &value) noexcept {
4932  return std::all_of(
4933  value.begin(), value.end(),
4934  [](const double entry) noexcept { return entry >= 0; });
4935  }};
4936 
4937  /*!\Userguide
4938  * \page doxypage_input_conf_modi_C_initial_conditions
4939  *
4940  * \required_key_no_line{key_MC_IC_type_,Type,string,\any_valid}
4941  *
4942  * Type of initial conditions provided. Possible values are:
4943  * - `"Constant_Tau"` &rarr; a hypersurface of constant \f$\tau\f$ is used.
4944  * - `"Dynamic"` &rarr; regions with sufficient energy density become fluid
4945  * cells, with its particles written to the IC output. \n
4946  * .
4947  * The parameters for each are described below. If a key that does not match
4948  * the type is present in the configuration file, SMASH will throw. <hr>
4949  */
4950  /**
4951  * \see_key{key_MC_IC_type_}
4952  */
4953  inline static const Key<FluidizationType>
4956  {"3.2"},
4957  detail::get_default_validator<FluidizationType>()};
4958 
4959  /*!\Userguide
4960  * \page doxypage_input_conf_modi_C_initial_conditions
4961  * <h3> Parameters for fluidization at constant tau </h3>
4962  * \optional_key_no_line{key_MC_IC_lower_bound_,Lower_Bound,double,
4963  * 0.5,\f$x>0\f$}
4964  *
4965  * Lower bound \unit{in fm} for the IC proper time if
4966  * <tt>\ref key_MC_IC_proper_time_ "Proper_Time"</tt> is not provided. It is
4967  * only used if the constant tau initial condition is active.
4968  */
4969  /**
4970  * \see_key{key_MC_IC_lower_bound_}
4971  */
4973  InputSections::m_c_initialConditions + "Lower_Bound",
4974  0.5,
4975  {"3.2"},
4976  [](const double &value) noexcept { return value > 0; }};
4977 
4978  /*!\Userguide
4979  * \page doxypage_input_conf_modi_C_initial_conditions
4980  * \optional_key_no_line{key_MC_IC_proper_time_,Proper_Time,double,
4981  * </tt>\f$f(t_{np})\f$<tt>, \f$x>0\f$}
4982  *
4983  * Proper time \unit{in fm} at which hypersurface is created. Its default
4984  * value depends on the nuclei passing time \f$t_{np}\f$ as follows,
4985  * \f[
4986  * f(t_{np})=\begin{cases}
4987  * \mathrm{\texttt{Lower_Bound}} & t_{np} \le
4988  * \mathrm{\texttt{Lower_Bound}}\\ t_{np} & t_{np} >
4989  * \mathrm{\texttt{Lower_Bound}} \end{cases}\;. \f] It is only used if the
4990  * constant tau initial condition is active.
4991  */
4992  /**
4993  * \see_key{key_MC_IC_proper_time_}
4994  */
4996  InputSections::m_c_initialConditions + "Proper_Time",
4998  {"3.2"},
4999  [](const double &value) noexcept { return value > 0; }};
5000 
5001  /*!\Userguide
5002  * \page doxypage_input_conf_modi_C_initial_conditions
5003  * \optional_key_no_line{key_MC_IC_proper_time_scaling_,Proper_Time_Scaling,
5004  * double,1.0,\f$x>0\f$}
5005  *
5006  * A scaling factor by which the proper time at which the switching
5007  * hypersurface is created is multiplied. This parameter is used in the
5008  * Bayesian analysis in \iref{Gotz:2025wnv}. It is only used if the constant
5009  * tau initial condition is active and the <tt>\ref key_MC_IC_proper_time_
5010  * "Proper_Time"</tt> key is not provided.
5011  */
5012  /**
5013  * \see_key{key_MC_IC_proper_time_scaling_}
5014  */
5016  InputSections::m_c_initialConditions + "Proper_Time_Scaling",
5017  1.0,
5018  {"3.3"},
5019  [](const double &value) noexcept { return value > 0; }};
5020 
5021  /*!\Userguide
5022  * \page doxypage_input_conf_modi_C_initial_conditions
5023  * \optional_key_no_line{key_MC_IC_pt_cut_,pT_Cut,double,
5024  * </tt>No cut is done<tt>,\f$x\ge0\f$}
5025  *
5026  * If set, employ a transverse momentum cut for particles contributing to
5027  * the initial conditions for hydrodynamics. A positive value \unit{in GeV}
5028  * is expected. Only particles characterized by
5029  * \f$0<p_T<\mathrm{\texttt{pT_Cut}}\f$ are printed to the output file.
5030  * A value of 0 corresponds to no cut. It is only used if the constant tau
5031  * initial condition is active.
5032  */
5033  /**
5034  * \see_key{key_output_IC_pt_cut_}
5035  */
5038  0.0,
5039  {"3.2"},
5040  [](const double &value) noexcept { return value >= 0; }};
5041 
5042  /*!\Userguide
5043  * \page doxypage_input_conf_modi_C_initial_conditions
5044  * \optional_key_no_line{key_MC_IC_rapidity_cut_,Rapidity_Cut,double,
5045  * </tt>No cut is done<tt>,\f$x\ge0\f$}
5046  *
5047  * If set, employ a rapidity cut for particles contributing to the initial
5048  * conditions for hydrodynamics. A positive value is expected and the cut is
5049  * employed symmetrically around 0. Only particles characterized by
5050  * \f$|\mathrm{\texttt{Rapidity_Cut}}|<y\f$ are printed to the
5051  * output file. A value of 0 corresponds to no cut. It is only used if the
5052  * constant tau initial condition is active.
5053  */
5054  /**
5055  * \see_key{key_MC_IC_rapidity_cut_}
5056  */
5058  InputSections::m_c_initialConditions + "Rapidity_Cut",
5059  0.0,
5060  {"3.2"},
5061  [](const double &value) noexcept { return value >= 0; }};
5062 
5063  /*!\Userguide
5064  * \page doxypage_input_conf_modi_C_initial_conditions
5065  * <hr>
5066  * <h3> Parameters for dynamic fluidization </h3>
5067  * \optional_key_no_line{key_MC_IC_eden_threshold_,Energy_Density_Threshold,
5068  * double,0.5,\f$x>0\f$}
5069  *
5070  * Set the minimum energy density \unit{in GeV/fm³} for a particle to be
5071  * considered fluid. It is only used if the dynamic initial condition is
5072  * active.
5073  */
5074  /**
5075  * \see_key{key_MC_IC_eden_threshold_}
5076  */
5078  InputSections::m_c_initialConditions + "Energy_Density_Threshold",
5079  0.5,
5080  {"3.2"},
5081  [](const double &value) noexcept { return value > 0; }};
5082 
5083  /*!\Userguide
5084  * \page doxypage_input_conf_modi_C_initial_conditions
5085  * \optional_key_no_line{key_MC_IC_mintime_,Minimum_Time,double,0.0,
5086  * \f$x\ge0\f$}
5087  *
5088  * Set the minimum time \unit{in fm} for a particle to be considered fluid.
5089  * If larger than 10 fm, the initial lattice size also increases. It is only
5090  * used if the dynamic initial condition is active.
5091  */
5092  /**
5093  * \see_key{key_MC_IC_mintime_}
5094  */
5096  InputSections::m_c_initialConditions + "Minimum_Time",
5097  0.0,
5098  {"3.2"},
5099  [](const double &value) noexcept { return value >= 0; }};
5100 
5101  /*!\Userguide
5102  * \page doxypage_input_conf_modi_C_initial_conditions
5103  * \optional_key_no_line{key_MC_IC_maxtime_,Maximum_Time,double,100,\f$x>0\f$}
5104  *
5105  * Set the maximum time \unit{in fm} for a particle to be considered fluid.
5106  * For efficiency in production runs, it is recommended to set to a lower
5107  * value. It is only used if the dynamic initial condition is active.
5108  */
5109  /**
5110  * \see_key{key_MC_IC_maxtime_}
5111  */
5113  InputSections::m_c_initialConditions + "Maximum_Time",
5114  100,
5115  {"3.2"},
5116  [](const double &value) noexcept { return value > 0; }};
5117 
5118  /*!\Userguide
5119  * \page doxypage_input_conf_modi_C_initial_conditions
5120  * \optional_key_no_line{key_MC_IC_fluid_cells_,Fluidization_Cells,int,80,
5121  * \f$x\ge2\f$}
5122  *
5123  * Fixed number of cells in each direction to select fluidizing particles.
5124  * Ideally the cell should be small enough for a meaningful interpolation.
5125  */
5126  /**
5127  * \see_key{key_MC_IC_fluid_cells_}
5128  */
5130  InputSections::m_c_initialConditions + "Fluidization_Cells",
5131  100,
5132  {"3.2"},
5133  [](const int &value) noexcept { return value >= 2; }};
5134 
5135  /*!\Userguide
5136  * \page doxypage_input_conf_modi_C_initial_conditions
5137  * \optional_key_no_line{key_MC_IC_fluidizable_processes,Fluidizable_Processes,
5138  * list of strings,"All",\any_valid}
5139  *
5140  * Determines which process types can have outgoing particles as
5141  * fluidizable. Possible values are:
5142  * - `"All"`
5143  * - `"Elastic"`: Elastic \f$2\to2\f$
5144  * - `"Decay"`: All \f$1\to N\f$ processes
5145  * - `"Inelastic"`: All \f$N\to1\f$ processes
5146  * - `"SoftString"`
5147  * - `"HardString"`
5148  *
5149  * The argument for allowing string processes to produce fluidizable
5150  * hadrons, even though they break detailed balance, is that the system is
5151  * expanding, so the fragmentation products are driven towards equilibration
5152  * when the medium becomes large enough, which happens if the fluidization
5153  * happens after their formation time.
5154  */
5155  /**
5156  * \see_key{key_MC_IC_fluidizable_processes}
5157  */
5158  inline static const Key<FluidizableProcessesBitSet>
5160  InputSections::m_c_initialConditions + "Fluidizable_Processes",
5161  FluidizableProcessesBitSet{}.set(), // all processes
5162  {"3.2"},
5163  detail::get_default_validator<FluidizableProcessesBitSet>()};
5164 
5165  /*!\Userguide
5166  * \page doxypage_input_conf_modi_C_initial_conditions
5167  * \optional_key_no_line{key_MC_IC_delay_initial_elastic,Delay_Initial_Elastic,
5168  * bool,true,\none}
5169  *
5170  * Whether the first elastic scatterings of initial nucleons are excluded
5171  * from the list of fluidizable processes. Since the core-corona interaction
5172  * is only elastic, this prevents some instantaneous fluidization.
5173  */
5174  /**
5175  * \see_key{key_MC_IC_delay_initial_elastic}
5176  */
5177  inline static const Key<bool>
5179  InputSections::m_c_initialConditions + "Delay_Initial_Elastic",
5180  true,
5181  {"3.3"},
5182  detail::get_default_validator<bool>()};
5183 
5184  /*!\Userguide
5185  * \page doxypage_input_conf_modi_C_initial_conditions
5186  * \optional_key_no_line{key_MC_IC_form_time_fraction_,Formation_Time_Fraction,
5187  * double,1.0,\f$x\ge0\f$}
5188  *
5189  * Fraction of the formation time after which a particle can fluidize. It is
5190  * non-negative, and can assume values above 1. Setting it to 0 corresponds
5191  * to ignoring formation time. This is only relevant if string fragmentation
5192  * can produce fluidizable particles.
5193  */
5194  /**
5195  * \see_key{key_MC_IC_form_time_fraction_}
5196  */
5197  inline static const Key<double>
5199  InputSections::m_c_initialConditions + "Formation_Time_Fraction",
5200  1.0,
5201  {"3.2"},
5202  [](const double &value) noexcept { return value >= 0; }};
5203 
5204  /*!\Userguide
5205  * \page doxypage_input_conf_modi_sphere
5206  * <h3> Mandatory keys </h3>
5207  */
5208 
5209  /*!\Userguide
5210  * \page doxypage_input_conf_modi_sphere
5211  * \required_key_no_line{key_MS_init_mult_,Init_Multiplicities,
5212  * map<int\,int>,\f$n_i>0\f$}
5213  *
5214  * Initial multiplicities per particle species. The value of this key shall
5215  * be a map of PDG number and amount \f$n_i\f$ corresponding to it. Use this
5216  * key to specify how many particles of each species will be initialized.
5217  * This key cannot be used if <tt>\ref key_MS_use_thermal_mult_
5218  * "Use_Thermal_Multiplicities"</tt> is `true`.
5219  */
5220  /**
5221  * \see_key{key_MS_init_mult_}
5222  */
5223  inline static const Key<std::map<PdgCode, int>>
5225  InputSections::m_sphere + "Init_Multiplicities",
5226  {"0.50"},
5227  [](const auto &value) noexcept {
5228  return !value.empty() && std::all_of(value.begin(), value.end(),
5229  [](const auto &entry) {
5230  return entry.second > 0;
5231  });
5232  }};
5233 
5234  /*!\Userguide
5235  * \page doxypage_input_conf_modi_sphere
5236  * \required_key{key_MS_radius_,Radius,double,\f$x>0\f$}
5237  *
5238  * Radius of the sphere \unit{in fm}.
5239  */
5240  /**
5241  * \see_key{key_MS_radius_}
5242  */
5243  inline static const Key<double> modi_sphere_radius{
5244  InputSections::m_sphere + "Radius",
5245  {"0.50"},
5246  [](const double &value) noexcept { return value > 0.0; }};
5247 
5248  /*!\Userguide
5249  * \page doxypage_input_conf_modi_sphere
5250  * \required_key{key_MS_start_time_,Start_Time,double,\none}
5251  *
5252  * Starting time of sphere calculation \unit{in fm}.
5253  */
5254  /**
5255  * \see_key{key_MS_start_time_}
5256  */
5257  inline static const Key<double> modi_sphere_startTime{
5258  InputSections::m_sphere + "Start_Time",
5259  {"0.50"},
5260  detail::get_default_validator<double>()};
5261 
5262  /*!\Userguide
5263  * \page doxypage_input_conf_modi_sphere
5264  * \required_key{key_MS_temperature_,Temperature,double,\f$x>0\f$}
5265  *
5266  * Temperature \unit{in GeV} to sample momenta in the sphere.
5267  */
5268  /**
5269  * \see_key{key_MS_radius_}
5270  */
5272  InputSections::m_sphere + "Temperature",
5273  {"1.5.2"},
5274  [](const double &value) noexcept { return value > 0.0; }};
5275 
5276  /*!\Userguide
5277  * \page doxypage_input_conf_modi_sphere
5278  * <hr>
5279  * <h3> Optional keys </h3>
5280  */
5281 
5282  /*!\Userguide
5283  * \page doxypage_input_conf_modi_sphere
5284  * \optional_key_no_line{key_MS_account_res_widths_,Account_Resonance_Widths,
5285  * bool,true,\none}
5286  *
5287  * This key is considered only in case of thermal initialization and the
5288  * following two behaviors can be chosen:
5289  * - `true` &rarr; Account for resonance spectral functions, while computing
5290  * multiplicities and sampling masses.
5291  * - `false` &rarr; Simply use pole masses.
5292  */
5293  /**
5294  * \see_key{key_MS_account_res_widths_}
5295  */
5297  InputSections::m_sphere + "Account_Resonance_Widths",
5298  true,
5299  {"1.7"},
5300  detail::get_default_validator<bool>()};
5301 
5302  /*!\Userguide
5303  * \page doxypage_input_conf_modi_sphere
5304  * \optional_key{key_MS_add_radial_velocity_,Add_Radial_Velocity,double,0.0,
5305  * \f$0 \le x \le 1\f$}
5306  *
5307  * This can be used in order to give each particle in the sphere an
5308  * additional velocity in radial direction of the size \f$u_r = u_0 \,
5309  * \left(\frac{r}{R}\right)^n\f$ with \f$u_0\f$ being the parameter of this
5310  * feature, \f$r\f$ the radial coordinate of the particle and \f$R\f$ the
5311  * total radius of the sphere. \f$u_0\f$ can only take values in \f$[0,
5312  * 1]\f$ and a value of 0 is equivalent to omitting this key (i.e. not
5313  * attributing any additional radial velocity). The exponent \f$n\f$ is set
5314  * by <tt>\ref key_MS_add_radial_velocity_exponent
5315  * "Add_Radial_Velocity_Exponent"</tt>.
5316  */
5317  /**
5318  * \see_key{key_MS_add_radial_velocity_}
5319  */
5321  InputSections::m_sphere + "Add_Radial_Velocity",
5322  0.0,
5323  {"2.2"},
5324  [](const double &value) noexcept {
5325  return value >= 0.0 && value <= 1.0;
5326  }};
5327 
5328  /*!\Userguide
5329  * \page doxypage_input_conf_modi_sphere
5330  * \optional_key{key_MS_add_radial_velocity_exponent,
5331  * Add_Radial_Velocity_Exponent,double,1.0,\f$x\ge 0\f$}
5332  *
5333  * Exponent in the initial radial flow profile (see
5334  * <tt>\ref key_MS_add_radial_velocity_ "Add_Radial_Velocity"</tt>).
5335  */
5336  /**
5337  * \see_key{key_MS_add_radial_velocity_exponent}
5338  */
5340  InputSections::m_sphere + "Add_Radial_Velocity_Exponent",
5341  1.0,
5342  {"3.3"},
5343  [](const double &value) noexcept { return value >= 0.0; }};
5344 
5345  /*!\Userguide
5346  * \page doxypage_input_conf_modi_sphere
5347  * \optional_key{key_MS_use_bar_chem_pot_,Baryon_Chemical_Potential,double,
5348  * 0.0,\none}
5349  *
5350  * Baryon chemical potential \f$\mu_B\f$ \unit{in GeV}. This key is used to
5351  * compute thermal densities \f$n_i\f$ only if
5352  * <tt>\ref key_MS_use_thermal_mult_ "Use_Thermal_Multiplicities"</tt> is
5353  * `true`.
5354  */
5355  /**
5356  * \see_key{key_MS_use_bar_chem_pot_}
5357  */
5359  InputSections::m_sphere + "Baryon_Chemical_Potential",
5360  0.0,
5361  {"1.0"},
5362  detail::get_default_validator<double>()};
5363 
5364  /*!\Userguide
5365  * \page doxypage_input_conf_modi_sphere
5366  * \optional_key{key_MS_charge_chem_pot_,Charge_Chemical_Potential,double,
5367  * 0.0,\none}
5368  *
5369  * Charge chemical potential \f$\mu_Q\f$ \unit{in GeV}. This key is used to
5370  * compute thermal densities \f$n_i\f$ only if
5371  * <tt>\ref key_MS_use_thermal_mult_ "Use_Thermal_Multiplicities"</tt> is
5372  * `true`.
5373  */
5374  /**
5375  * \see_key{key_MS_charge_chem_pot_}
5376  */
5378  InputSections::m_sphere + "Charge_Chemical_Potential",
5379  0.0,
5380  {"2.1"},
5381  detail::get_default_validator<double>()};
5382 
5383  /*!\Userguide
5384  * \page doxypage_input_conf_modi_sphere
5385  * \optional_key{key_MS_initial_cond_,Initial_Condition,string,
5386  * "thermal momenta",\any_valid}
5387  *
5388  * Initial distribution to use for momenta of particles. Mainly used in the
5389  * expanding universe scenario, options are:
5390  * - `"thermal momenta"` &rarr; equilibrium Boltzmann distribution
5391  * - `"thermal momenta quantum"` &rarr; equilibrium Fermi-Dirac or
5392  * Bose-Einstein distribution
5393  * - `"IC_ES"` &rarr; off-equilibrium distribution
5394  * - `"IC_1M"` &rarr; off-equilibrium distribution
5395  * - `"IC_2M"` &rarr; off-equilibrium distribution
5396  * - `"IC_Massive"` &rarr; off-equilibrium distribution
5397  *
5398  * See \iref{Bazow:2016oky} and \iref{Tindall:2016try} for further
5399  * explanations about the different distribution functions.
5400  */
5401  /**
5402  * \see_key{key_MS_initial_cond_}
5403  */
5405  InputSections::m_sphere + "Initial_Condition",
5407  {"1.1"},
5408  detail::get_default_validator<SphereInitialCondition>()};
5409 
5410  /*!\Userguide
5411  * \page doxypage_input_conf_modi_sphere
5412  * \optional_key{key_MS_strange_chem_pot_,Strange_Chemical_Potential,double,
5413  * 0.0,\none}
5414  *
5415  * Strangeness chemical potential \f$\mu_S\f$ \unit{in GeV}. This key is
5416  * used to compute thermal densities \f$n_i\f$ only if <tt>\ref
5417  * key_MS_use_thermal_mult_ "Use_Thermal_Multiplicities"</tt> is `true`.
5418  */
5419  /**
5420  * \see_key{key_MS_strange_chem_pot_}
5421  */
5423  InputSections::m_sphere + "Strange_Chemical_Potential",
5424  0.0,
5425  {"1.0"},
5426  detail::get_default_validator<double>()};
5427 
5428  /*!\Userguide
5429  * \page doxypage_input_conf_modi_sphere
5430  * \optional_key{key_MS_hf_multiplier_,Heavy_Flavor_Multiplier,double,
5431  * 0.0,\none}
5432  *
5433  * Multiply the thermal multiplicity of heavy flavor particles. This is a
5434  * way to perturbatively obtain more statistics on heavy hadron observables
5435  * with fewer events, under the assumption that these hadrons are
5436  * sufficiently rare to not interact with each other. It is the user's
5437  * responsibility to ensure that such assumption holds and that particle
5438  * yields are properly normalized in the analysis.
5439  *
5440  * By default, it is set to 0 so that no heavy flavor is initialized. For
5441  * any positive value, a partial density is computed as described in \ref
5442  * key_MS_use_thermal_mult_ "Use_Thermal_Multiplicities" and multiplied by
5443  * it. Naturally, with a value of 1, each hadron corresponds to a real
5444  * thermalized hadron.
5445  */
5446  /**
5447  * \see_key{key_MS_hf_multiplier_}
5448  */
5450  InputSections::m_sphere + "Heavy_Flavor_Multiplier",
5451  0.0,
5452  {"3.3"},
5453  detail::get_default_validator<double>()};
5454 
5455  /*!\Userguide
5456  * \page doxypage_input_conf_modi_sphere
5457  * \optional_key{key_MS_use_thermal_mult_,Use_Thermal_Multiplicities,bool,
5458  * false,\none}
5459  *
5460  * The system is initialized with all particle species of the particle table
5461  * that belong to the hadron gas equation of state, see
5462  * HadronGasEos::is_eos_particle(). The multiplicities are sampled from
5463  * Poisson distributions \f$\mathrm{Poi}(n_i V)\f$, where \f$n_i\f$ are the
5464  * grand-canonical thermal densities of the corresponding species and
5465  * \f$V\f$ is the system volume. This option simulates the grand-canonical
5466  * ensemble, where the number of particles is not fixed from event to event.
5467  *
5468  * If this option is set to `true`, <tt>\ref key_MS_init_mult_
5469  * "Init_Multiplicities"</tt> cannot be used.
5470  */
5471  /**
5472  * \see_key{key_MS_use_thermal_mult_}
5473  */
5475  InputSections::m_sphere + "Use_Thermal_Multiplicities",
5476  false,
5477  {"1.0"},
5478  detail::get_default_validator<bool>()};
5479 
5480  /*!\Userguide
5481  * \page doxypage_input_conf_modi_sphere
5482  * <hr>
5483  * <h3> Specifying jets </h3>
5484  *
5485  * The `Jet` section within the `Sphere` one is used to put a single high
5486  * energy particle (a "jet") in the center of the system, on an outbound
5487  * trajectory along the x-axis. If no PDG code is specified, but the section
5488  * is given, an error about the missing key is raised.
5489  */
5490 
5491  /*!\Userguide
5492  * \page doxypage_input_conf_modi_sphere
5493  * \required_key_no_line{key_MS_jet_jet_pdg_,Jet_PDG,int,\none}
5494  *
5495  * The type of particle to be used as a jet, as given by its PDG code.
5496  */
5497  /**
5498  * \see_key{key_MS_jet_jet_pdg_}
5499  */
5501  InputSections::m_s_jet + "Jet_PDG",
5502  {"1.5.2"},
5503  detail::get_default_validator<PdgCode>()};
5504 
5505  /*!\Userguide
5506  * \page doxypage_input_conf_modi_sphere
5507  * \optional_key_no_line{key_MS_jet_jet_momentum_,Jet_Momentum,double,20.0,
5508  * \f$x>0\f$}
5509  *
5510  * The initial momentum \unit{in GeV} to give to the jet particle.
5511  */
5512  /**
5513  * \see_key{key_MS_jet_jet_momentum_}
5514  */
5516  InputSections::m_s_jet + "Jet_Momentum",
5517  20.0,
5518  {"1.5.2"},
5519  [](const double &value) noexcept { return value > 0.0; }};
5520 
5521  /*!\Userguide
5522  * \page doxypage_input_conf_modi_sphere
5523  * \optional_key_no_line{key_MS_jet_jet_position_,Jet_Position,
5524  * list of 3 doubles,[0.0\, 0.0\, 0.0],\none}
5525  *
5526  * Coordinates (x,y,z) \unit{in fm} where the jet particle is initially
5527  * positioned.
5528  */
5529  /**
5530  * \see_key{key_MS_jet_jet_position_}
5531  */
5533  InputSections::m_s_jet + "Jet_Position",
5534  std::array<double, 3>{{0.0, 0.0, 0.0}},
5535  {"3.3"},
5536  detail::get_default_validator<std::array<double, 3>>()};
5537 
5538  /*!\Userguide
5539  * \page doxypage_input_conf_modi_sphere
5540  * \optional_key_no_line{key_MS_jet_backtoback_,Back_To_Back,bool,false,\none}
5541  *
5542  * Whether to create a jet with the corresponding antiparticle in the
5543  * opposite direction with the same momentum. If the particle is a singlet,
5544  * such as the neutral pion, it is considered its own antiparticle.
5545  */
5546  /**
5547  * \see_key{key_MS_jet_backtoback_}
5548  */
5550  InputSections::m_s_jet + "Back_To_Back",
5551  false,
5552  {"3.3"},
5553  detail::get_default_validator<bool>()};
5554 
5555  /*!\Userguide
5556  * \page doxypage_input_conf_modi_sphere
5557  * \optional_key_no_line{key_MS_jet_b2b_separation,Back_To_Back_Separation,
5558  * double,0.01,\f$x>0\f$}
5559  *
5560  * Separation \unit{in fm} between the back to back jets. Each jet particle
5561  * is translated by half of this value in the direction of motion. Can only
5562  * be used if \ref key_MS_jet_backtoback_ "Back_To_Back" is true. A small
5563  * value is used by default to prevent interactions between the jets.
5564  */
5565  /**
5566  * \see_key{key_MS_jet_b2b_separation}
5567  */
5569  InputSections::m_s_jet + "Back_To_Back_Separation",
5570  0.01,
5571  {"3.3"},
5572  [](const double &value) noexcept { return value > 0.0; }};
5573 
5574  /*!\Userguide
5575  * \page doxypage_input_conf_modi_box
5576  * <hr>
5577  * <h3> Mandatory keys </h3>
5578  */
5579 
5580  /*!\Userguide
5581  * \page doxypage_input_conf_modi_box
5582  * \required_key_no_line{key_MB_init_mult_,Init_Multiplicities,
5583  * map<int\,int>,\f$n_i>0\f$}
5584  *
5585  * See &nbsp;
5586  * <tt>\ref key_MS_init_mult_ "Sphere: Init_Multiplicities"</tt>.
5587  */
5588  /**
5589  * \see_key{key_MB_init_mult_}
5590  */
5591  inline static const Key<std::map<PdgCode, int>>
5593  InputSections::m_box + "Init_Multiplicities",
5594  {"0.50"},
5595  [](const auto &value) noexcept {
5596  return !value.empty() && std::all_of(value.begin(), value.end(),
5597  [](const auto &entry) {
5598  return entry.second > 0;
5599  });
5600  }};
5601 
5602  /*!\Userguide
5603  * \page doxypage_input_conf_modi_box
5604  * \required_key{key_MB_initial_condition_,Initial_Condition,string,\any_valid}
5605  *
5606  * Controls initial momentum distribution of particles.
5607  * - `"peaked momenta"` &rarr; All particles have momentum \f$p=3\,T\f$,
5608  * where \f$T\f$ is the temperature. Directions of momenta are uniformly
5609  * distributed.
5610  * - `"thermal momenta"` &rarr; Momenta are sampled from a Maxwell-Boltzmann
5611  * distribution.
5612  * - `"thermal momenta quantum"` &rarr; Momenta are sampled from a
5613  * Fermi-Dirac distribution or a Bose-Einstein distribution, depending on
5614  * the type of particle.
5615  */
5616  /**
5617  * \see_key{key_MB_initial_condition_}
5618  */
5620  InputSections::m_box + "Initial_Condition",
5621  {"0.50"},
5622  detail::get_default_validator<BoxInitialCondition>()};
5623 
5624  /*!\Userguide
5625  * \page doxypage_input_conf_modi_box
5626  * \required_key{key_MB_length_,Length,double,\f$x>0\f$}
5627  *
5628  * Length of the cube's edge \unit{in fm}.
5629  */
5630  /**
5631  * \see_key{key_MB_length_}
5632  */
5633  inline static const Key<double> modi_box_length{
5634  InputSections::m_box + "Length",
5635  {"0.50"},
5636  [](const double &value) noexcept { return value > 0.0; }};
5637 
5638  /*!\Userguide
5639  * \page doxypage_input_conf_modi_box
5640  * \required_key{key_MB_start_time_,Start_Time,double,\none}
5641  *
5642  * Starting time of the simulation \unit{in fm}. All particles in the box
5643  * are initialized with \f$x^0=\f$`Start_Time`.
5644  */
5645  /**
5646  * \see_key{key_MB_start_time_}
5647  */
5648  inline static const Key<double> modi_box_startTime{
5649  InputSections::m_box + "Start_Time",
5650  {"0.50"},
5651  detail::get_default_validator<double>()};
5652 
5653  /*!\Userguide
5654  * \page doxypage_input_conf_modi_box
5655  * \required_key{key_MB_temperature_,Temperature,double,\f$x>0\f$}
5656  *
5657  * Temperature \unit{in GeV} of the box.
5658  */
5659  /**
5660  * \see_key{key_MB_temperature_}
5661  */
5662  inline static const Key<double> modi_box_temperature{
5663  InputSections::m_box + "Temperature",
5664  {"0.50"},
5665  [](const double &value) noexcept { return value > 0.0; }};
5666 
5667  /*!\Userguide
5668  * \page doxypage_input_conf_modi_box
5669  * <hr>
5670  * <h3> Optional keys </h3>
5671  */
5672 
5673  /*!\Userguide
5674  * \page doxypage_input_conf_modi_box
5675  * \optional_key_no_line{key_MB_account_res_widths_,Account_Resonance_Widths,
5676  * bool,true,\none}
5677  *
5678  * See &nbsp;
5679  * <tt>\ref key_MS_account_res_widths_
5680  * "Sphere: Account_Resonance_Widths"</tt>.
5681  *
5682  * \note
5683  * Normally, one wants this option `true`. For example, for the detailed
5684  * balance studies, it is better to account for spectral functions, because
5685  * then at \f$t=0\f$ one has exactly the expected thermal grand-canonical
5686  * multiplicities, that can be compared to final ones. However, by toggling
5687  * `true` to `false` one can observe the effect of spectral functions on the
5688  * multiplicity. This is useful for understanding the implications of
5689  * different ways of sampling resonances in hydrodynamics.
5690  */
5691  /**
5692  * \see_key{key_MB_account_res_widths_}
5693  */
5695  InputSections::m_box + "Account_Resonance_Widths",
5696  true,
5697  {"1.7"},
5698  detail::get_default_validator<bool>()};
5699 
5700  /*!\Userguide
5701  * \page doxypage_input_conf_modi_box
5702  * \optional_key{key_MB_use_bar_chem_pot_,Baryon_Chemical_Potential,
5703  * double,0.0,\none}
5704  *
5705  * See &nbsp;
5706  * <tt>\ref key_MS_use_bar_chem_pot_ "Sphere:
5707  * Baryon_Chemical_Potential"</tt>.
5708  */
5709  /**
5710  * \see_key{key_MB_use_bar_chem_pot_}
5711  */
5713  InputSections::m_box + "Baryon_Chemical_Potential",
5714  0.0,
5715  {"1.0"},
5716  detail::get_default_validator<double>()};
5717 
5718  /*!\Userguide
5719  * \page doxypage_input_conf_modi_box
5720  * \optional_key{key_MB_charge_chem_pot_,Charge_Chemical_Potential,
5721  * double,0.0,\none}
5722  *
5723  * See &nbsp;
5724  * <tt>\ref key_MS_charge_chem_pot_ "Sphere:
5725  * Charge_Chemical_Potential"</tt>.
5726  */
5727  /**
5728  * \see_key{key_MB_charge_chem_pot_}
5729  */
5731  InputSections::m_box + "Charge_Chemical_Potential",
5732  0.0,
5733  {"2.0"},
5734  detail::get_default_validator<double>()};
5735 
5736  /*!\Userguide
5737  * \page doxypage_input_conf_modi_box
5738  * \optional_key{key_MB_equilibration_time_,Equilibration_Time,double,-1.0,\none}
5739  *
5740  * Time \unit{in fm} after which the output of the box is written out. The
5741  * first time however will be printed. This is useful if one wants to
5742  * simulate boxes for very long times and knows at which time the box
5743  * reaches its thermal and chemical equilibrium. The default set to -1 is
5744  * meaning that output is written from beginning on, if this key is not
5745  * given.
5746  */
5747  /**
5748  * \see_key{key_MB_equilibration_time_}
5749  */
5751  InputSections::m_box + "Equilibration_Time",
5752  -1.0,
5753  {"1.8"},
5754  detail::get_default_validator<double>()};
5755 
5756  /*!\Userguide
5757  * \page doxypage_input_conf_modi_box
5758  * \optional_key{key_MB_strange_chem_pot_,Strange_Chemical_Potential,
5759  * double,0.0,\none}
5760  *
5761  * See &nbsp;
5762  * <tt>\ref key_MS_strange_chem_pot_
5763  * "Sphere: Strange_Chemical_Potential"</tt>.
5764  */
5765  /**
5766  * \see_key{key_MB_strange_chem_pot_}
5767  */
5769  InputSections::m_box + "Strange_Chemical_Potential",
5770  0.0,
5771  {"1.0"},
5772  detail::get_default_validator<double>()};
5773 
5774  /*!\Userguide
5775  * \page doxypage_input_conf_modi_box
5776  * \optional_key{key_MB_use_thermal_mult_,Use_Thermal_Multiplicities,
5777  * bool,false,\none}
5778  *
5779  * See &nbsp;
5780  * <tt>\ref key_MS_use_thermal_mult_
5781  * "Sphere: Use_Thermal_Multiplicities"</tt>.
5782  */
5783  /**
5784  * \see_key{key_MB_use_thermal_mult_}
5785  */
5787  InputSections::m_box + "Use_Thermal_Multiplicities",
5788  false,
5789  {"1.0"},
5790  detail::get_default_validator<bool>()};
5791 
5792  /*!\Userguide
5793  * \page doxypage_input_conf_modi_box
5794  * <hr>
5795  * <h3> Specifying jets </h3>
5796  *
5797  * The `Jet` section can be specified in the `Box` section with the same
5798  * meaning it has for the `Sphere` modus. It is namely possible to put a
5799  * jet in the center of the box, on a outbound trajectory along the x-axis.
5800  * Also here, if no PDG code is specified, but the section is given, an
5801  * error about the missing key is raised.
5802  */
5803 
5804  /*!\Userguide
5805  * \page doxypage_input_conf_modi_box
5806  * \optional_key_no_line{key_MB_jet_jet_momentum_,Jet_Momentum,
5807  * double,20.0,\f$x>0\f$}
5808  *
5809  * See &nbsp;
5810  * <tt>\ref key_MS_jet_jet_momentum_ "Sphere: Jet: Jet_Momentum"</tt>.
5811  */
5812  /**
5813  * \see_key{key_MB_jet_jet_momentum_}
5814  */
5816  InputSections::m_b_jet + "Jet_Momentum",
5817  20.0,
5818  {"1.7"},
5819  [](const double &value) noexcept { return value > 0.0; }};
5820 
5821  /*!\Userguide
5822  * \page doxypage_input_conf_modi_box
5823  * \required_key_no_line{key_MB_jet_jet_pdg_,Jet_PDG,int,\none}
5824  *
5825  * See &nbsp;
5826  * <tt>\ref key_MS_jet_jet_pdg_ "Sphere: Jet: Jet_PDG"</tt>.
5827  */
5828  /**
5829  * \see_key{key_MB_jet_jet_pdg_}
5830  */
5831  inline static const Key<PdgCode> modi_box_jet_jetPdg{
5832  InputSections::m_b_jet + "Jet_PDG",
5833  {"1.7"},
5834  detail::get_default_validator<PdgCode>()};
5835 
5836  /*!\Userguide
5837  * \page doxypage_input_conf_modi_list
5838  * \required_key{key_ML_file_dir_,File_Directory,string,
5839  * <b>Existing directory</b>}
5840  *
5841  * Directory for the external particle lists. Although relative paths to the
5842  * execution directory should work, you are encouraged to <b>prefer absolute
5843  * paths</b>.
5844  */
5845  /**
5846  * \see_key{key_ML_file_dir_}
5847  */
5849  InputSections::m_list + "File_Directory",
5850  {"0.60"},
5851  [](const std::string &value) noexcept {
5852  return std::filesystem::is_directory(value);
5853  }};
5854 
5855  /*!\Userguide
5856  * \page doxypage_input_conf_modi_list
5857  * \required_key{key_ML_filename_,Filename,string,
5858  * <b>Possible filename on Linux OS</b>}
5859  *
5860  * External particle lists filename. This key shall be omitted if
5861  * <tt>\ref key_ML_file_prefix_ "List: File_Prefix"</tt> is used. By using
5862  * this key, it is understood that all events to be processed are contained
5863  * in the given file, as this is the only one which will be read.
5864  */
5865  /**
5866  * \see_key{key_ML_filename_}
5867  */
5869  InputSections::m_list + "Filename",
5870  {"3.1"},
5871  [](const std::string &value) noexcept {
5872  if (value.empty() || value == "." || value == "..")
5873  return false;
5874  else
5875  return std::none_of(value.begin(), value.end(),
5876  [](auto c) { return c == '/' || c == '\0'; });
5877  }};
5878 
5879  /*!\Userguide
5880  * \page doxypage_input_conf_modi_list
5881  * \required_key{key_ML_file_prefix_,File_Prefix,string,\none}
5882  *
5883  * Prefix for the external particle lists file. This key shall be omitted if
5884  * <tt>\ref key_ML_filename_ "List: Filename"</tt> is used.
5885  */
5886  /**
5887  * \see_key{key_ML_file_prefix_}
5888  */
5890  InputSections::m_list + "File_Prefix",
5891  {"0.60"},
5892  detail::get_default_validator<std::string>()};
5893 
5894  /*!\Userguide
5895  * \page doxypage_input_conf_modi_list
5896  * \optional_key{key_ML_shift_id_,Shift_Id,int,0,\none}
5897  *
5898  * Index of the \b first processed particle list file. Files with index
5899  * smaller than the specidifed value are skipped. This key is considered
5900  * when <tt>\ref key_ML_file_prefix_ "List: File_Prefix"</tt> is used to
5901  * specify which particles list file(s) should be read. If, instead, the
5902  * user specifies the <tt>\ref key_ML_filename_ "List: Filename"</tt> key,
5903  * this key is ignored.
5904  */
5905  /**
5906  * \see_key{key_ML_shift_id_}
5907  */
5908  inline static const Key<int> modi_list_shiftId{
5909  InputSections::m_list + "Shift_Id",
5910  0,
5911  {"0.60"},
5912  detail::get_default_validator<int>()};
5913 
5914  /*!\Userguide
5915  * \page doxypage_input_conf_modi_list
5916  * \optional_key{key_ML_optional_quantities_,Optional_Quantities,list of
5917  * strings,["ID"\, "charge"],\any_valid}
5918  *
5919  * Extra columns to be expected in the input file containing the list of
5920  * particles. This is useful to e.g. continue a SMASH run that was paused
5921  * while taking into account the formation time and cross section scaling
5922  * properly.
5923  *
5924  * The order of the quantities in the key value should respect the order of
5925  * the extra columns in the input file.
5926  *
5927  * \attention It will cause wrong read-ins to leave out columns in between
5928  * and there is no safety mechanism in place.
5929  *
5930  * Available quantities:
5931  * - <tt>"ID"</tt> &rarr; Particle identifier represented by an integer,
5932  * unique for each particle in an event. Even if provided, the IDs will
5933  * be set during the SMASH run in the order the particles are initialized.
5934  * - <tt>"charge"</tt> &rarr; The particle's electric charge in units of the
5935  * elementary charge e. This is only used for a consistency check and the
5936  * charge will be set according to the PDG code data.
5937  * - <tt>"ncoll"</tt> &rarr; Number of collisions the particle already went
5938  * through.
5939  * - <tt>"form_time"</tt> &rarr; Formation time. By default it is set to
5940  * the time coordinate (first column in the input).
5941  * - <tt>"xsecfac"</tt> &rarr; Scaling factor for the cross section,
5942  * limited between 0 and 1. By default it is 1.
5943  * - <tt>"proc_type"</tt> &rarr; Type of the last interaction (See
5944  * \ref doxypage_output_process_types)
5945  * - <tt>"time_last_coll"</tt> &rarr; Time when the last interaction
5946  * happened.
5947  * - <tt>"pdg_mother1"</tt> &rarr; Parent of the particle.
5948  * - <tt>"pdg_mother2"</tt> &rarr; Second parent of the particle.
5949  * - <tt>"spin0"</tt> &rarr; 0-th component of the spin vector.
5950  * - <tt>"spinx"</tt> &rarr; 1-st component of the spin vector.
5951  * - <tt>"spiny"</tt> &rarr; 2-nd component of the spin vector.
5952  * - <tt>"spinz"</tt> &rarr; 3-rd component of the spin vector.
5953  * - <tt>"perturbative_weight"</tt> &rarr; weight for treating heavy flavor
5954  * hadrons perturbatively.
5955  *
5956  * Be aware that the default setting of this key considers "ID" and
5957  * "charge", which also have to be set by the user if these quantities are
5958  * in the provided particle lists and other optional quantities are included
5959  * as well. Hence, it is possible to leave out "ID" and "charge" in the
5960  * input lists. Optional quantities that are not provided by the user as
5961  * extra column in the input file are set to their default value when SMASH
5962  * reads in the input file with the list of particles. Unless stated
5963  * differently, this default value is 0.
5964  *
5965  * \attention The code does a minimal validation to see if the quantities
5966  * are internally meaningful, but no check is done on the physics content.
5967  * For instance, SMASH will not complain if a proton is said to originate
5968  * from a pion via wall crossing. Ensuring the correctness of the input is
5969  * the user's resposibility.
5970  * \note If a floating point is given where an integer should be, only a
5971  * warning is issued, as that might be on purpose.
5972  */
5973  /**
5974  * \see_key{key_ML_optional_quantities_}
5975  */
5976  inline static const Key<std::vector<std::string>>
5978  InputSections::m_list + "Optional_Quantities",
5979  std::vector<std::string>{"ID", "charge"},
5980  {"3.3"},
5981  [](const std::vector<std::string> &value) noexcept {
5982  const std::set<std::string> valid_quantities{"ID",
5983  "charge",
5984  "ncoll",
5985  "form_time",
5986  "xsecfac",
5987  "proc_type",
5988  "time_last_coll",
5989  "pdg_mother1",
5990  "pdg_mother2",
5991  "spin0",
5992  "spinx",
5993  "spiny",
5994  "spinz",
5995  "perturbative_weight"};
5996  return std::all_of(
5997  value.begin(), value.end(),
5998  [&valid_quantities](const std::string &quantity) {
5999  return valid_quantities.count(quantity) > 0;
6000  });
6001  }};
6002 
6003  /*!\Userguide
6004  * \page doxypage_input_conf_modi_listbox
6005  * \required_key{key_MLB_file_dir_,File_Directory,string,
6006  * <b>Existing directory</b>}
6007  *
6008  * See &nbsp;
6009  * <tt>\ref key_ML_file_dir_ "List: File_Directory"</tt>.
6010  */
6011  /**
6012  * \see_key{key_MLB_file_dir_}
6013  */
6015  InputSections::m_listBox + "File_Directory",
6016  {"2.1"},
6017  [](const std::string &value) noexcept {
6018  return std::filesystem::is_directory(value);
6019  }};
6020 
6021  /*!\Userguide
6022  * \page doxypage_input_conf_modi_listbox
6023  * \required_key{key_MLB_filename_,Filename,string,
6024  * <b>Possible filename on Linux OS</b>}
6025  *
6026  * See &nbsp;
6027  * <tt>\ref key_ML_filename_ "List: Filename"</tt>.
6028  */
6029  /**
6030  * \see_key{key_MLB_filename_}
6031  */
6033  InputSections::m_listBox + "Filename",
6034  {"3.1"},
6035  [](const std::string &value) noexcept {
6036  if (value.empty() || value == "." || value == "..")
6037  return false;
6038  else
6039  return std::none_of(value.begin(), value.end(),
6040  [](auto c) { return c == '/' || c == '\0'; });
6041  }};
6042 
6043  /*!\Userguide
6044  * \page doxypage_input_conf_modi_listbox
6045  * \required_key{key_MLB_file_prefix_,File_Prefix,string,\none}
6046  *
6047  * See &nbsp;
6048  * <tt>\ref key_ML_file_prefix_ "List: File_Prefix"</tt>.
6049  */
6050  /**
6051  * \see_key{key_MLB_file_prefix_}
6052  */
6054  InputSections::m_listBox + "File_Prefix",
6055  {"2.1"},
6056  detail::get_default_validator<std::string>()};
6057 
6058  /*!\Userguide
6059  * \page doxypage_input_conf_modi_listbox
6060  * \required_key{key_MLB_length_,Length,double,\f$x>0\f$}
6061  *
6062  * See &nbsp;
6063  * <tt>\ref key_MB_length_ "Box: Length"</tt>.
6064  */
6065  /**
6066  * \see_key{key_MLB_length_}
6067  */
6068  inline static const Key<double> modi_listBox_length{
6069  InputSections::m_listBox + "Length",
6070  {"2.1"},
6071  [](const double &value) noexcept { return value > 0.0; }};
6072 
6073  /*!\Userguide
6074  * \page doxypage_input_conf_modi_listbox
6075  * \optional_key{key_MLB_shift_id_,Shift_Id,int,0,\none}
6076  *
6077  * See &nbsp;
6078  * <tt>\ref key_ML_shift_id_ "List: Shift_Id"</tt>.
6079  */
6080  /**
6081  * \see_key{key_MLB_shift_id_}
6082  */
6083  inline static const Key<int> modi_listBox_shiftId{
6084  InputSections::m_listBox + "Shift_Id",
6085  0,
6086  {"2.1"},
6087  detail::get_default_validator<int>()};
6088 
6089  /*!\Userguide
6090  * \page doxypage_input_conf_modi_listbox
6091  * \optional_key{key_MLB_optional_quantities_,Optional_Quantities,list of
6092  * strings,["ID"\, "charge"],\any_valid}
6093  *
6094  * See &nbsp;
6095  * <tt>\ref key_ML_optional_quantities_ "List: Optional_Quantities"</tt>.
6096  */
6097  /**
6098  * \see_key{key_MLB_optional_quantities_}
6099  */
6100  inline static const Key<std::vector<std::string>>
6102  InputSections::m_listBox + "Optional_Quantities",
6103  std::vector<std::string>{"ID", "charge"},
6104  {"3.3"},
6105  [](const std::vector<std::string> &value) noexcept {
6106  const std::set<std::string> valid_quantities{"ID",
6107  "charge",
6108  "ncoll",
6109  "form_time",
6110  "xsecfac",
6111  "proc_type",
6112  "time_last_coll",
6113  "pdg_mother1",
6114  "pdg_mother2",
6115  "spin0",
6116  "spinx",
6117  "spiny",
6118  "spinz",
6119  "perturbative_weight"};
6120  return std::all_of(
6121  value.begin(), value.end(),
6122  [&valid_quantities](const std::string &quantity) {
6123  return valid_quantities.count(quantity) > 0;
6124  });
6125  }};
6126 
6127  /*!\Userguide
6128  * \page doxypage_input_conf_output
6129  *
6130  * <h2> General output configuration parameters </h2>
6131  *
6132  * \optional_key_no_line{key_output_density_type_,Density_Type,string,
6133  * "none",\any_valid}
6134  *
6135  * Determines which kind of density is printed into the headers of the
6136  * collision files. Possible values are:
6137  * - `"hadron"` &rarr; Total hadronic density
6138  * - `"baryon"` &rarr; Net baryon density
6139  * - `"baryonic isospin"` &rarr; Baryonic isospin density
6140  * - `"pion"` &rarr; Pion density
6141  * - `"none"` &rarr; Do not calculate density, print 0.0
6142  */
6143  /**
6144  * \see_key{key_output_density_type_}
6145  */
6147  InputSections::output + "Density_Type",
6149  {"0.60"},
6150  detail::get_default_validator<DensityType>()};
6151 
6152  /*!\Userguide
6153  * \page doxypage_input_conf_output
6154  * \optional_key{key_output_out_interval_,Output_Interval,double,
6155  * \ref key_gen_end_time_ "End_Time",\f$x>0\f$}
6156  *
6157  * Defines the period of intermediate output of the status of the simulated
6158  * system in Standard Output and other output formats which support this
6159  * functionality (\unit{in fm}).
6160  */
6161  /**
6162  * \see_key{key_output_out_interval_}
6163  */
6164  inline static const Key<double> output_outputInterval{
6165  InputSections::output + "Output_Interval",
6167  {"0.50"},
6168  [](double x) noexcept { return x > 0.0; }};
6169 
6170  /*!\Userguide
6171  * \page doxypage_input_conf_output
6172  * \optional_key{key_output_out_times_,Output_Times,list of doubles,
6173  * use \ref key_output_out_interval_ "Output_Interval", \none}
6174  *
6175  * Explicitly defines the times \unit{in fm} where output is generated in
6176  the
6177  * form of a list. This cannot be used in combination with
6178  `Output_Interval`.
6179  * Output times outside the simulation time are ignored and both the initial
6180  * and final time are always considered. The following example will produce
6181  * output at event start, event end and at the specified times as long as
6182  they
6183  * are within the simulation time.
6184  *\verbatim
6185  Output:
6186  Output_Times: [-0.1, 0.0, 1.0, 2.0, 10.0]
6187  \endverbatim
6188  */
6189  /**
6190  * \see_key{key_output_out_times_}
6191  */
6193  InputSections::output + "Output_Times",
6195  {"1.7"},
6196  detail::get_default_validator<std::vector<double>>()};
6197 
6198  /*!\Userguide
6199  * \page doxypage_input_conf_output
6200  * <hr>
6201  * <h2> Output format independently of the specific output content </h2>
6202  *
6203  * A dedicated subsection in the `Output` section exists for every single
6204  * output content and dedicated options are described further below. Refer
6205  * to \ref output_contents_ "output contents" for the list of possible
6206  * contents. Independently of the content, i.e. in every subsection, it is
6207  * always necessary (and probably desired) to provide the format in which
6208  * the output should be generated.
6209  *
6210  * \required_key_no_line{key_output_content_format_,Format, list of strings,
6211  * \any_valid}
6212  *
6213  * List of formats for writing particular content. Available formats for
6214  * every content are listed and described \ref output_contents_ "here",
6215  * while \ref list_of_output_formats "here" all possible output formats are
6216  * given.
6217  *
6218  * \warning If a `Format` list in a content `section` is not given or it is
6219  * left empty, i.e. `Format: []`, SMASH will abort with a fatal error.
6220  * Furthermore, SMASH also aborts if a not existing format is given in the
6221  * formats list. This is meant to prevent against e.g. losing output
6222  * information because of a typo in the configuration file. If no output for
6223  * a given content is desired, you can suppress it by using `Format:
6224  * ["None"]`. However, it is not allowed to use valid formats together with
6225  * the `"None"` special "format" string.
6226  */
6227  /**
6228  * \see_key{key_output_content_format_}
6229  *
6230  * \note We use here an empty container as default, since no format is like
6231  * a specified empty one and hence it makes it easier in the validation.
6232  */
6234  InputSections::o_particles + "Format",
6235  {"1.2"},
6236  [](const std::vector<std::string> &values) noexcept {
6237  if (values.empty())
6238  return false;
6239  bool has_none =
6240  std::any_of(values.begin(), values.end(),
6241  [](const std::string &s) { return s == "None"; });
6242  if (has_none)
6243  return values.size() == 1;
6244  std::set<std::string> allowed_set = {
6245  "ASCII", "Oscar1999", "Oscar2013", "Binary",
6246  "Oscar2013_bin", "Root", "VTK", "HepMC",
6247  "HepMC_asciiv3", "HepMC_treeroot"};
6248  return std::none_of(values.begin(), values.end(),
6249  [&allowed_set](const std::string &s) {
6250  return allowed_set.count(s) == 0;
6251  });
6252  }};
6253  /**
6254  * \see_key{key_output_content_format_}
6255  */
6257  InputSections::o_collisions + "Format",
6258  {"1.2"},
6259  [](const std::vector<std::string> &values) noexcept {
6260  if (values.empty())
6261  return false;
6262  bool has_none =
6263  std::any_of(values.begin(), values.end(),
6264  [](const std::string &s) { return s == "None"; });
6265  if (has_none)
6266  return values.size() == 1;
6267  std::set<std::string> allowed_set = {
6268  "ASCII", "Oscar1999", "Oscar2013",
6269  "Binary", "Oscar2013_bin", "Root",
6270  "HepMC", "HepMC_asciiv3", "HepMC_treeroot"};
6271  return std::none_of(values.begin(), values.end(),
6272  [&allowed_set](const std::string &s) {
6273  return allowed_set.count(s) == 0;
6274  });
6275  }};
6276  /**
6277  * \see_key{key_output_content_format_}
6278  */
6280  InputSections::o_dileptons + "Format",
6281  {"0.85"},
6282  [](const std::vector<std::string> &values) noexcept {
6283  if (values.empty())
6284  return false;
6285  bool has_none =
6286  std::any_of(values.begin(), values.end(),
6287  [](const std::string &s) { return s == "None"; });
6288  if (has_none)
6289  return values.size() == 1;
6290  std::set<std::string> allowed_set = {"ASCII", "Oscar1999",
6291  "Oscar2013", "Binary",
6292  "Oscar2013_bin", "Root"};
6293  return std::none_of(values.begin(), values.end(),
6294  [&allowed_set](const std::string &s) {
6295  return allowed_set.count(s) == 0;
6296  });
6297  }};
6298  /**
6299  * \see_key{key_output_content_format_}
6300  */
6302  InputSections::o_photons + "Format",
6303  {"1.0"},
6304  [](const std::vector<std::string> &values) noexcept {
6305  if (values.empty())
6306  return false;
6307  bool has_none =
6308  std::any_of(values.begin(), values.end(),
6309  [](const std::string &s) { return s == "None"; });
6310  if (has_none)
6311  return values.size() == 1;
6312  std::set<std::string> allowed_set = {"ASCII", "Oscar1999",
6313  "Oscar2013", "Binary",
6314  "Oscar2013_bin", "Root"};
6315  return std::none_of(values.begin(), values.end(),
6316  [&allowed_set](const std::string &s) {
6317  return allowed_set.count(s) == 0;
6318  });
6319  }};
6320  /**
6321  * \see_key{key_output_content_format_}
6322  */
6323  inline static const Key<std::vector<std::string>>
6326  {"1.7"},
6327  [](const std::vector<std::string> &values) noexcept {
6328  if (values.empty())
6329  return false;
6330  bool has_none =
6331  std::any_of(values.begin(), values.end(),
6332  [](const std::string &s) { return s == "None"; });
6333  if (has_none)
6334  return values.size() == 1;
6335  std::set<std::string> allowed_set = {
6336  "For_vHLLE", "ASCII", "Oscar1999", "Oscar2013",
6337  "Binary", "Oscar2013_bin", "Root"};
6338  return std::none_of(values.begin(), values.end(),
6339  [&allowed_set](const std::string &s) {
6340  return allowed_set.count(s) == 0;
6341  });
6342  }};
6343  /**
6344  * \see_key{key_output_content_format_}
6345  */
6347  InputSections::o_rivet + "Format",
6348  {"2.0.2"},
6349  [](const std::vector<std::string> &values) noexcept {
6350  if (values.empty())
6351  return false;
6352  bool has_none =
6353  std::any_of(values.begin(), values.end(),
6354  [](const std::string &s) { return s == "None"; });
6355  if (has_none)
6356  return values.size() == 1;
6357  std::set<std::string> allowed_set = {"YODA", "YODA-full"};
6358  return std::none_of(values.begin(), values.end(),
6359  [&allowed_set](const std::string &s) {
6360  return allowed_set.count(s) == 0;
6361  });
6362  }};
6363  /**
6364  * \see_key{key_output_content_format_}
6365  */
6367  InputSections::o_coulomb + "Format",
6368  {"2.1"},
6369  [](const std::vector<std::string> &values) noexcept {
6370  if (values.empty())
6371  return false;
6372  bool has_none =
6373  std::any_of(values.begin(), values.end(),
6374  [](const std::string &s) { return s == "None"; });
6375  if (has_none)
6376  return values.size() == 1;
6377  std::set<std::string> allowed_set = {"VTK"};
6378  return std::none_of(values.begin(), values.end(),
6379  [&allowed_set](const std::string &s) {
6380  return allowed_set.count(s) == 0;
6381  });
6382  }};
6383  /**
6384  * \see_key{key_output_content_format_}
6385  */
6386  inline static const Key<std::vector<std::string>>
6389  {"1.2"},
6390  [](const std::vector<std::string> &values) noexcept {
6391  if (values.empty())
6392  return false;
6393  bool has_none =
6394  std::any_of(values.begin(), values.end(),
6395  [](const std::string &s) { return s == "None"; });
6396  if (has_none)
6397  return values.size() == 1;
6398  std::set<std::string> allowed_set = {"Lattice_ASCII", "ASCII",
6399  "Lattice_Binary", "VTK"};
6400  return std::none_of(values.begin(), values.end(),
6401  [&allowed_set](const std::string &s) {
6402  return allowed_set.count(s) == 0;
6403  });
6404  }};
6405 
6406  /*!\Userguide
6407  * \page doxypage_input_conf_output
6408  * <hr>
6409  * <h2> Content-specific output options </h2>
6410  * \anchor input_output_content_specific_
6411  *
6412  * Every possible content-specific section is documented in the following.
6413  * Refer to \ref doxypage_input_conf_output_examples for a small selection
6414  * of possible output configurations.
6415  *
6416  * <hr>
6417  * <h3> &diams; %Particles </h3>
6418  *
6419  * \optional_key_no_line{key_output_particles_extended_,Extended,bool,
6420  * false,\none}
6421  *
6422  * &rArr; Ignored with `Oscar1999`, `ASCII`, `Binary`, `VTK`,
6423  * `HepMC_asciiv3` and `HepMC_treeroot` formats.
6424  * - `true` &rarr; Print extended information for each particle
6425  * - `false` &rarr; Regular output for each particle
6426  */
6427  /**
6428  * \see_key{key_output_particles_extended_}
6429  */
6431  InputSections::o_particles + "Extended",
6432  false,
6433  {"1.2"},
6434  detail::get_default_validator<bool>()};
6435 
6436  /*!\Userguide
6437  * \page doxypage_input_conf_output
6438  * \optional_key_no_line{key_output_particles_quantities_,Quantities,
6439  * list of strings,</tt><b>empty list</b><tt>,\any_valid}
6440  *
6441  * &rArr; If using the `ASCII` or `Binary` format, a non-empty list must be
6442  * specified. An error will be produced if a non-empty `Quantities` key is
6443  * specified without including `ASCII` or `Binary` as format.
6444  * See \ref doxypage_output_ascii for the possible values.
6445  */
6446  /**
6447  * \see_key{key_output_particles_quantities_}
6448  */
6450  InputSections::o_particles + "Quantities",
6451  std::vector<std::string>{},
6452  {"3.2"},
6453  [](const std::vector<std::string> &values) noexcept {
6454  if (values.empty())
6455  return true;
6456  const auto &allowed_set =
6458  return std::none_of(values.begin(), values.end(),
6459  [&allowed_set](const std::string &s) {
6460  return allowed_set.count(s) == 0;
6461  });
6462  }};
6463 
6464  /*!\Userguide
6465  * \page doxypage_input_conf_output
6466  * \optional_key_no_line{key_output_particles_only_final_,Only_Final,string,
6467  * "Yes",\any_valid}
6468  *
6469  * &rArr; Ignored with `VTK`, `HepMC_asciiv3` and `HepMC_treeroot` formats.
6470  * - `"Yes"` &rarr; Print only final particle list.
6471  * - `"IfNotEmpty"` &rarr; Print only final particle list, but only if event
6472  * is not empty (i.e. any collisions happened between projectile and
6473  * target). Useful to save disk space.
6474  * - `"No"` &rarr; Particle list at output interval including initial time.
6475  */
6476  /**
6477  * \see_key{key_output_particles_only_final_}
6478  */
6480  InputSections::o_particles + "Only_Final",
6482  {"0.50"},
6483  detail::get_default_validator<OutputOnlyFinal>()};
6484 
6485  /*!\Userguide
6486  * \page doxypage_input_conf_output
6487  * <hr>
6488  * <h3> &diams; Collisions </h3>
6489  * &rArr; Format `VTK` not available
6490  *
6491  * \optional_key_no_line{key_output_collisions_extended_,Extended,bool,
6492  * false,\none}
6493  *
6494  * &rArr; Ignored with `Oscar1999`, `ASCII`, `Binary`, `HepMC_asciiv3` and
6495  * `HepMC_treeroot` formats.
6496  * - `true` &rarr; Print extended information for each particle
6497  * - `false` &rarr; Regular output for each particle
6498  */
6499  /**
6500  * \see_key{key_output_collisions_extended_}
6501  */
6503  InputSections::o_collisions + "Extended",
6504  false,
6505  {"1.2"},
6506  detail::get_default_validator<bool>()};
6507 
6508  /*!\Userguide
6509  * \page doxypage_input_conf_output
6510  * \optional_key_no_line{key_output_collisions_quantities_,Quantities,
6511  * list of strings,</tt><b>empty list</b><tt>,\any_valid}
6512  *
6513  * &rArr; If using the `ASCII` or `Binary` format, a non-empty list must be
6514  * specified. An error will be produced if a non-empty `Quantities` key is
6515  * specified without including `ASCII` or `Binary` as format.
6516  * See \ref doxypage_output_ascii for the possible values.
6517  */
6518  /**
6519  * \see_key{key_output_collisions_quantities_}
6520  */
6521  inline static const Key<std::vector<std::string>>
6523  InputSections::o_collisions + "Quantities",
6524  std::vector<std::string>{},
6525  {"3.2"},
6526  [](const std::vector<std::string> &values) noexcept {
6527  if (values.empty())
6528  return true;
6529  const auto &allowed_set =
6531  return std::none_of(values.begin(), values.end(),
6532  [&allowed_set](const std::string &s) {
6533  return allowed_set.count(s) == 0;
6534  });
6535  }};
6536 
6537  /*!\Userguide
6538  * \page doxypage_input_conf_output
6539  * \optional_key_no_line{key_output_collisions_print_start_end_,
6540  * Print_Start_End,bool,false,\none}
6541  *
6542  * &rArr; Ignored with `Root`, `HepMC_asciiv3` and `HepMC_treeroot` formats.
6543  * - `true` &rarr; Initial and final particle list is printed out
6544  * - `false` &rarr; Initial and final particle list is not printed out
6545  */
6546  /**
6547  * \see_key{key_output_collisions_print_start_end_}
6548  */
6550  InputSections::o_collisions + "Print_Start_End",
6551  false,
6552  {"0.50"},
6553  detail::get_default_validator<bool>()};
6554 
6555  /*!\Userguide
6556  * \page doxypage_input_conf_output
6557  * <hr>
6558  * <h3> &diams; Dileptons </h3>
6559  * &rArr; Only `ASCII`, `Binary` and `Root` formats.
6560  *
6561  * \optional_key_no_line{key_output_dileptons_extended_,Extended,bool,
6562  * false,\none}
6563  *
6564  * &rArr; Ignored with `Oscar1999`, `ASCII` and `Binary` formats.
6565  * - `true` &rarr; Print extended information for each particle
6566  * - `false` &rarr; Regular output for each particle
6567  */
6568  /**
6569  * \see_key{key_output_dileptons_extended_}
6570  */
6572  InputSections::o_dileptons + "Extended",
6573  false,
6574  {"1.2"},
6575  detail::get_default_validator<bool>()};
6576 
6577  /*!\Userguide
6578  * \page doxypage_input_conf_output
6579  * \optional_key_no_line{key_output_dileptons_quantities_,Quantities,
6580  * list of strings,</tt><b>empty list</b><tt>,\any_valid}
6581  *
6582  * &rArr; If using the `ASCII` or `Binary` format, a non-empty list must be
6583  * specified. An error will be produced if a non-empty `Quantities` key is
6584  * specified without including `ASCII` or `Binary` as format.
6585  * See \ref doxypage_output_ascii for the possible values.
6586  */
6587  /**
6588  * \see_key{key_output_dileptons_quantities_}
6589  */
6591  InputSections::o_dileptons + "Quantities",
6592  std::vector<std::string>{},
6593  {"3.3"},
6594  [](const std::vector<std::string> &values) noexcept {
6595  if (values.empty())
6596  return true;
6597  const auto &allowed_set =
6599  return std::none_of(values.begin(), values.end(),
6600  [&allowed_set](const std::string &s) {
6601  return allowed_set.count(s) == 0;
6602  });
6603  }};
6604 
6605  /*!\Userguide
6606  * \page doxypage_input_conf_output
6607  * <hr>
6608  * <h3> &diams; Photons </h3>
6609  * &rArr; Only `ASCII`, `Binary` and `Root` formats.
6610  *
6611  * \optional_key_no_line{key_output_photons_extended_,Extended,bool,
6612  * false,\none}
6613  *
6614  * &rArr; Ignored with `Oscar1999`, `ASCII` and `Binary` formats.
6615  * - `true` &rarr; Print extended information for each particle
6616  * - `false` &rarr; Regular output for each particle
6617  */
6618  /**
6619  * \see_key{key_output_photons_extended_}
6620  */
6621  inline static const Key<bool> output_photons_extended{
6622  InputSections::o_photons + "Extended",
6623  false,
6624  {"1.5"},
6625  detail::get_default_validator<bool>()};
6626 
6627  /*!\Userguide
6628  * \page doxypage_input_conf_output
6629  * \optional_key_no_line{key_output_photons_quantities_,Quantities,
6630  * list of strings,</tt><b>empty list</b><tt>,\any_valid}
6631  *
6632  * &rArr; If using the `ASCII` or `Binary` format, a non-empty list must be
6633  * specified. An error will be produced if a non-empty `Quantities` key is
6634  * specified without including `ASCII` or `Binary` as format.
6635  * See \ref doxypage_output_ascii for the possible values.
6636  */
6637  /**
6638  * \see_key{key_output_photons_quantities_}
6639  */
6641  InputSections::o_photons + "Quantities",
6642  std::vector<std::string>{},
6643  {"3.3"},
6644  [](const std::vector<std::string> &values) noexcept {
6645  if (values.empty())
6646  return true;
6647  const auto &allowed_set =
6649  return std::none_of(values.begin(), values.end(),
6650  [&allowed_set](const std::string &s) {
6651  return allowed_set.count(s) == 0;
6652  });
6653  }};
6654 
6655  /*!\Userguide
6656  * \page doxypage_input_conf_output
6657  * <hr>
6658  * <h3> &diams; Initial_Conditions </h3>
6659  * &rArr; Only `ASCII`, `Binary` and `Root`.
6660  *
6661  * \optional_key_no_line{key_output_IC_extended_,Extended,bool,false,\none}
6662  *
6663  * &rArr; Ignored with `Oscar1999`, `ASCII`, and `Binary` formats.
6664  * - `true` &rarr; Print extended information for each particle
6665  * - `false` &rarr; Regular output for each particle
6666  */
6667  /**
6668  * \see_key{key_output_IC_extended_}
6669  */
6672  false,
6673  {"1.7"},
6674  detail::get_default_validator<bool>()};
6675 
6676  /*!\Userguide
6677  * \page doxypage_input_conf_output
6678  * \optional_key_no_line{key_output_IC_quantities_,Quantities,
6679  * list of strings,</tt><b>empty list</b><tt>,\any_valid}
6680  *
6681  * &rArr; If using the `ASCII` or `Binary` format, a non-empty list must be
6682  * specified. An error will be produced if a non-empty `Quantities` key is
6683  * specified without including `ASCII` or `Binary` as format.
6684  * See \ref doxypage_output_ascii for the possible values.
6685  */
6686  /**
6687  * \see_key{key_output_IC_quantities_}
6688  */
6689  inline static const Key<std::vector<std::string>>
6691  InputSections::o_initialConditions + "Quantities",
6692  std::vector<std::string>{},
6693  {"3.3"},
6694  [](const std::vector<std::string> &values) noexcept {
6695  if (values.empty())
6696  return true;
6697  const auto &allowed_set =
6699  return std::none_of(values.begin(), values.end(),
6700  [&allowed_set](const std::string &s) {
6701  return allowed_set.count(s) == 0;
6702  });
6703  }};
6704 
6705  /*!\Userguide
6706  * \page doxypage_input_conf_removed_keys
6707  *
6708  * \list_removed_key{key_output_IC_lower_bound_,Output.Initial_Conditions.Lower_Bound,3.3}.
6709  * This key \ref key_MC_IC_lower_bound_ "was moved" into the
6710  * <tt>Modi.Collider.Initial_Conditions</tt> section.
6711  */
6712  /**
6713  * \removed_key{key_output_IC_lower_bound_,3.3}
6714  */
6716  InputSections::o_initialConditions + "Lower_Bound",
6717  0.5,
6718  {"1.8", "3.2", "3.3"},
6719  detail::get_default_validator<double>()};
6720 
6721  /*!\Userguide
6722  * \page doxypage_input_conf_removed_keys
6723  *
6724  * \list_removed_key{key_output_IC_proper_time_,Output.Initial_Conditions.Proper_Time,3.3}.
6725  * This key \ref key_MC_IC_proper_time_ "was moved" into the
6726  * <tt>Modi.Collider.Initial_Conditions</tt> section.
6727  */
6728  /**
6729  * \removed_key{key_output_IC_proper_time_,3.3}
6730  */
6732  InputSections::o_initialConditions + "Proper_Time",
6734  {"1.7", "3.2", "3.3"},
6735  detail::get_default_validator<double>()};
6736 
6737  /*!\Userguide
6738  * \page doxypage_input_conf_removed_keys
6739  *
6740  * \list_removed_key{key_output_IC_pt_cut_,Output.Initial_Conditions.pT_Cut,3.3}.
6741  * This key \ref key_MC_IC_pt_cut_ "was moved" into the
6742  * <tt>Modi.Collider.Initial_Conditions</tt> section.
6743  */
6744  /**
6745  * \removed_key{key_output_IC_pt_cut_,3.3}
6746  */
6750  {"2.2", "3.2", "3.3"},
6751  detail::get_default_validator<double>()};
6752 
6753  /*!\Userguide
6754  * \page doxypage_input_conf_removed_keys
6755  *
6756  * \list_removed_key{key_output_IC_rapidity_cut_,Output.Initial_Conditions.Rapidity_Cut,3.3}.
6757  * This key \ref key_MC_IC_rapidity_cut_ "was moved" into the
6758  * <tt>Modi.Collider.Initial_Conditions</tt> section.
6759  */
6760  /**
6761  * \removed_key{key_output_IC_rapidity_cut_,3.3}
6762  */
6764  InputSections::o_initialConditions + "Rapidity_Cut",
6766  {"2.2", "3.2", "3.3"},
6767  detail::get_default_validator<double>()};
6768 
6769  /*!\Userguide
6770  * \page doxypage_input_conf_output
6771  * <hr> \anchor input_output_rivet_
6772  * <h3> &diams; Rivet </h3>
6773  * &rArr; Only `YODA` format (see \ref doxypage_output_rivet "here" for
6774  * more information about the format).
6775  *
6776  * \note In the following, <b>no default</b> means that, if the key is
6777  * omitted, Rivet default behavior will be used.
6778  *
6779  * \optional_key_no_line{key_output_rivet_analyses_,Analyses,list of
6780  * strings,
6781  * </tt><b>no default</b><tt>,\none}
6782  *
6783  * This key specifies the analyses (including possible options) to add to
6784  * the Rivet analysis.
6785  */
6786  /**
6787  * \see_key{key_output_rivet_analyses_}
6788  */
6790  InputSections::o_rivet + "Analyses",
6792  {"2.0.2"},
6793  detail::get_default_validator<std::vector<std::string>>()};
6794 
6795  /*!\Userguide
6796  * \page doxypage_input_conf_output
6797  * \optional_key_no_line{key_output_rivet_cross_sections_,Cross_Section,
6798  * list of two doubles,</tt><b>no default</b><tt>,\none}
6799  *
6800  * Set the cross-section \unit{in pb}.
6801  */
6802  /**
6803  * \see_key{key_output_rivet_cross_sections_}
6804  */
6806  InputSections::o_rivet + "Cross_Section",
6808  {"2.0.2"},
6809  detail::get_default_validator<std::array<double, 2>>()};
6810 
6811  /*!\Userguide
6812  * \page doxypage_input_conf_output
6813  * \optional_key_no_line{key_output_rivet_ignore_beams_,Ignore_Beams,bool,
6814  * true,\none}
6815  *
6816  * Ask Rivet to not validate beams before running analyses. This is needed
6817  * if you use the <tt>\ref key_MC_fermi_motion_ "Fermi_Motion"</tt> option
6818  * that disrupts the collision energy event-by-event.
6819  */
6820  /**
6821  * \see_key{key_output_rivet_ignore_beams_}
6822  */
6824  InputSections::o_rivet + "Ignore_Beams",
6825  true,
6826  {"2.0.2"},
6827  detail::get_default_validator<bool>()};
6828 
6829  /*!\Userguide
6830  * \page doxypage_input_conf_output
6831  * \optional_key_no_line{key_output_rivet_logging_,Logging,map<string\,string>,
6832  * </tt><b>no default</b><tt>,\none}
6833  *
6834  * Specifies log levels for various parts of Rivet, including analyses. Each
6835  * entry is a log name followed by a log level (one among `"TRACE"`,
6836  * `"DEBUG"`, `"INFO"`, `"WARN"`, `"ERROR"`, and `"FATAL"`).
6837  */
6838  /**
6839  * \see_key{key_output_rivet_logging_}
6840  */
6841  inline static const Key<std::map<std::string, std::string>>
6843  InputSections::o_rivet + "Logging",
6845  {"0.50"},
6846  detail::get_default_validator<std::map<std::string, std::string>>()};
6847 
6848  /*!\Userguide
6849  * \page doxypage_input_conf_output
6850  * \optional_key_no_line{key_output_rivet_paths_,Paths,list of strings,
6851  * </tt><b>no default</b><tt>,\none}
6852  *
6853  * This key specifies the directories that Rivet will search for analyses
6854  * and data files related to the analyses.
6855  */
6856  /**
6857  * \see_key{key_output_rivet_paths_}
6858  */
6860  InputSections::o_rivet + "Paths",
6862  {"2.0.2"},
6863  detail::get_default_validator<std::vector<std::string>>()};
6864 
6865  /*!\Userguide
6866  * \page doxypage_input_conf_output
6867  * \optional_key_no_line{key_output_rivet_preloads_,Preloads,list of
6868  * strings,
6869  * </tt><b>no default</b><tt>,\none}
6870  *
6871  * Specify data files to read into Rivet (e.g., centrality calibrations) at
6872  * start-up.
6873  */
6874  /**
6875  * \see_key{key_output_rivet_preloads_}
6876  */
6878  InputSections::o_rivet + "Preloads",
6880  {"2.0.2"},
6881  detail::get_default_validator<std::vector<std::string>>()};
6882 
6883  /*!\Userguide
6884  * \page doxypage_input_conf_output
6885  *
6886  * <h3> Weights keys </h3>
6887  *
6888  * Some operations about weights can be customized in the `Weights` section.
6889  *
6890  * \optional_key_no_line{key_output_rivet_weights_cap_,Cap,double,
6891  * </tt><b>no default</b><tt>,\none}
6892  *
6893  * Cap weights to this value.
6894  */
6895  /**
6896  * \see_key{key_output_rivet_weights_cap_}
6897  */
6901  {"2.0.2"},
6902  detail::get_default_validator<double>()};
6903 
6904  /*!\Userguide
6905  * \page doxypage_input_conf_output
6906  * \optional_key_no_line{key_output_rivet_weights_deselect_,Deselect,
6907  * list of strings, </tt><b>no default</b><tt>,\none}
6908  *
6909  * De-select these weights for processing.
6910  */
6911  /**
6912  * \see_key{key_output_rivet_weights_deselect_}
6913  */
6914  inline static const Key<std::vector<std::string>>
6916  InputSections::o_r_weights + "Deselect",
6918  {"2.0.2"},
6919  detail::get_default_validator<std::vector<std::string>>()};
6920 
6921  /*!\Userguide
6922  * \page doxypage_input_conf_output
6923  * \optional_key_no_line{key_output_rivet_weights_nlo_smearing_,NLO_Smearing,
6924  * double, </tt><b>no default</b><tt>,\none}
6925  *
6926  * Smearing histogram binning by given fraction of bin widths to avoid NLO
6927  * counter events to flow into neighboring bin.
6928  */
6929  /**
6930  * \see_key{key_output_rivet_weights_nlo_smearing_}
6931  */
6933  InputSections::o_r_weights + "NLO_Smearing",
6935  {"2.0.2"},
6936  detail::get_default_validator<double>()};
6937 
6938  /*!\Userguide
6939  * \page doxypage_input_conf_output
6940  * \optional_key_no_line{key_output_rivet_weights_no_multi_,No_Multi,bool,
6941  * </tt><b>no default</b><tt>,\none}
6942  *
6943  * Ask Rivet not to do multi-weight processing.
6944  */
6945  /**
6946  * \see_key{key_output_rivet_weights_no_multi_}
6947  */
6949  InputSections::o_r_weights + "No_Multi",
6951  {"2.0.2"},
6952  detail::get_default_validator<bool>()};
6953 
6954  /*!\Userguide
6955  * \page doxypage_input_conf_output
6956  * \optional_key_no_line{key_output_rivet_weights_nominal_,Nominal,string,
6957  * </tt><b>no default</b><tt>,\none}
6958  *
6959  * The nominal weight name.
6960  */
6961  /**
6962  * \see_key{key_output_rivet_weights_nominal_}
6963  */
6965  InputSections::o_r_weights + "Nominal",
6967  {"2.0.2"},
6968  detail::get_default_validator<std::string>()};
6969 
6970  /*!\Userguide
6971  * \page doxypage_input_conf_output
6972  * \optional_key_no_line{key_output_rivet_weights_select_,Select,
6973  * list of strings, </tt><b>no default</b><tt>,\none}
6974  *
6975  * Select these weights for processing.
6976  */
6977  /**
6978  * \see_key{key_output_rivet_weights_select_}
6979  */
6981  InputSections::o_r_weights + "Select",
6983  {"2.0.2"},
6984  detail::get_default_validator<std::vector<std::string>>()};
6985 
6986  /*!\Userguide
6987  * \page doxypage_input_conf_output
6988  * <hr> \anchor input_output_coulomb_
6989  * <h3> &diams; Coulomb </h3>
6990  * &rArr; Only `VTK` format.
6991  *
6992  * No content-specific output options, apart from the <tt>\ref
6993  * key_output_content_format_ "Format"</tt> key which only accepts
6994  * `["VTK"]`. \note This output requires \ref
6995  * doxypage_input_conf_pot_coulomb "coulomb potential" to be enabled which
6996  * in turn requires a \ref doxypage_input_conf_lattice, both of which have
6997  * to be specified in the conguration file.
6998  */
6999 
7000  /*!\Userguide
7001  * \page doxypage_input_conf_output
7002  * <hr> \anchor input_output_thermodynamics_
7003  * <h3> &diams; Thermodynamics </h3>
7004  *
7005  * The user can print thermodynamical quantities
7006  * -# on the spatial lattice to VTK output;
7007  * -# on the spatial lattice to ASCII or Binary output;
7008  * -# at a given point to ASCII output;
7009  * -# averaged over all particles to ASCII output.
7010  *
7011  * <b>About 1 and 2:</b> Note that this output requires a lattice, which
7012  * needs to be enabled in the conguration file and is regulated by the
7013  * options of \ref doxypage_input_conf_lattice. See \ref doxypage_output_vtk
7014  * for further information on 1 and \ref doxypage_output_thermodyn_lattice
7015  * for 2.
7016  *
7017  * <b>About 3 and 4:</b> See \ref doxypage_output_thermodyn for
7018  * further information.
7019  *
7020  * \optional_key_no_line{key_output_thermo_only_part_,Only_Participants,bool,
7021  * false,\none}
7022  *
7023  * If set to `true`, only participants are included in the computation of
7024  * the energy momentum tensor and of the Eckart currents. In this context, a
7025  * hadron is considered as a participant if it had at least one collision.
7026  * When using \ref doxypage_input_conf_potentials "Potentials" this option
7027  * must be either left unset or set to `false`. The reason behind this
7028  * limitation is that in this case hadrons can influence the evolution of
7029  * the system even without collisions.
7030  */
7031  /**
7032  * \see_key{key_output_thermo_only_part_}
7033  */
7035  InputSections::o_thermodynamics + "Only_Participants",
7036  false,
7037  {"2.1"},
7038  detail::get_default_validator<bool>()};
7039 
7040  /*!\Userguide
7041  * \page doxypage_input_conf_output
7042  * \optional_key_no_line{key_output_thermo_ignore_unformed_,Ignore_Unformed,
7043  * bool, false,\none}
7044  *
7045  * Whether the thermodynamic calculation should consider unformed (or
7046  * preformed) particles or not.
7047  *
7048  * Unformed particles are traditionally those created by string
7049  * fragmentation, such that their density should contribute to
7050  * thermodynamics. However, we use the formation time also to ignore
7051  * particles that are not really present yet in the simulation, for example
7052  * in afterburner/ListModus calculations. In these cases, one might want to
7053  * ignore unformed particles when evaluating thermodynamic properties.
7054  */
7055  /**
7056  * \see_key{key_output_thermo_ignore_unformed_}
7057  */
7059  InputSections::o_thermodynamics + "Ignore_Unformed",
7060  false,
7061  {"3.4"},
7062  detail::get_default_validator<bool>()};
7063 
7064  /*!\Userguide
7065  * \page doxypage_input_conf_output
7066  * \optional_key_no_line{key_output_thermo_position_,Position,
7067  * list of 3 doubles,[0.0\, 0.0\, 0.0],\none}
7068  *
7069  * Point at which thermodynamic quantities are computed (\unit{in fm}).
7070  */
7071  /**
7072  * \see_key{key_output_thermo_position_}
7073  */
7075  InputSections::o_thermodynamics + "Position",
7076  std::array<double, 3>{{0.0, 0.0, 0.0}},
7077  {"1.0"},
7078  detail::get_default_validator<std::array<double, 3>>()};
7079 
7080  /*!\Userguide
7081  * \page doxypage_input_conf_output
7082  * \optional_key_no_line{key_output_thermo_quantities_,Quantities,
7083  * list of strings,[],\any_valid}
7084  *
7085  * List of thermodynamic quantities that are printed to the output.
7086  * Possible quantities are:
7087  * - `"rho_eckart"` &rarr; Eckart rest frame density.
7088  * - `"tmn"` &rarr; Energy-momentum tensor \f$T^{\mu\nu}(t,x,y,z)\f$.
7089  * - `"tmn_landau"` &rarr; Energy-momentum tensor in the Landau rest frame.
7090  * This tensor is computed by boosting \f$T^{\mu\nu}(t,x,y,z)\f$ to the
7091  * local rest frame, where \f$T^{0i}\f$ = 0.
7092  * - `"landau_velocity"` &rarr; Velocity of the Landau rest frame. The
7093  * velocity is obtained from the energy-momentum tensor
7094  * \f$T^{\mu\nu}(t,x,y,z)\f$ by solving the generalized eigenvalue
7095  * equation \f$(T^{\mu\nu} - \lambda g^{\mu\nu})u_{\mu}=0\f$.
7096  * - `"j_QBS"` &rarr; Electric (Q), baryonic (B) and strange (S) currents
7097  * \f$j^{\mu}_{QBS}(t,x,y,z) \f$; note that all currents are given in
7098  * units of "number of charges"; multiply the electric current by the
7099  * elementary charge \f$\sqrt{4 \pi \alpha_{EM}} \f$ for charge units.
7100  */
7101  /**
7102  * \see_key{key_output_thermo_type_}
7103  */
7104  inline static const Key<std::set<ThermodynamicQuantity>>
7106  InputSections::o_thermodynamics + "Quantities",
7107  std::set<ThermodynamicQuantity>{},
7108  {"1.0"},
7109  detail::get_default_validator<std::set<ThermodynamicQuantity>>()};
7110 
7111  /*!\Userguide
7112  * \page doxypage_input_conf_output
7113  * \optional_key_no_line{key_output_thermo_smearing_,Smearing,bool,true,\none}
7114  *
7115  * Using Gaussian smearing for computing thermodynamic quantities or not.
7116  * This triggers whether thermodynamic quantities are evaluated at a fixed
7117  * point
7118  * (`true`) or summed over all particles (`false`).
7119  * - `true` &rarr; smearing applied
7120  * - `false` &rarr; smearing not applied
7121  *
7122  * The contribution to the energy-momentum tensor and current (be it
7123  * electric, baryonic or strange) from a single particle in its rest frame
7124  * is: \f[\begin{eqnarray}
7125  * j^{\mu} = B \frac{p_0^{\mu}}{p_0^0} W \\
7126  * T^{\mu \nu} = \frac{p_0^{\mu}p_0^{\nu}}{p_0^0} W
7127  * \end{eqnarray}
7128  * \f]
7129  * with B being the charge of interest and W being the weight given to this
7130  * particle. Normally, if one computes thermodynamic quantities at a point,
7131  * smearing should be applied, and then \f$W\f$ takes on the following
7132  * shape: \f[ W = (2 \pi \sigma^2)^{-3/2} \exp\left(
7133  * - \frac{(\mathbf{r}-\mathbf{r}_0(t))^2}{2\sigma^2}
7134  * \right)\f]
7135  * It can however be useful to compute the thermodynamic quantities of all
7136  * particles in a box with \f$W=1\f$, which would correspond to
7137  * <tt>"Smearing: false"</tt>. Note that using this option changes the units
7138  * of the thermodynamic quantities, as they are no longer spatially
7139  * normalized. One should divide this quantity by the volume of the box to
7140  * restore units to the correct ones.
7141  */
7142  /**
7143  * \see_key{key_output_thermo_smearing_}
7144  */
7146  InputSections::o_thermodynamics + "Smearing",
7147  true,
7148  {"1.0"},
7149  detail::get_default_validator<bool>()};
7150 
7151  /*!\Userguide
7152  * \page doxypage_input_conf_output
7153  * \optional_key_no_line{key_output_thermo_type_,Type,string,
7154  * "baryon",\any_valid}
7155  *
7156  * Particle type taken into consideration, one among
7157  * - `"hadron"`
7158  * - `"baryon"` (corresponds to "net baryon")
7159  * - `"baryonic isospin"`
7160  * - `"pion"`
7161  * - `"none"`
7162  * - `"total isospin"`
7163  */
7164  /**
7165  * \see_key{key_output_thermo_type_}
7166  */
7170  {"1.0"},
7171  detail::get_default_validator<DensityType>()};
7172 
7173  /*!\Userguide
7174  * \page doxypage_input_conf_lattice
7175  * \required_key{key_lattice_automatic_,Automatic,bool,\none}
7176  *
7177  * Whether to automatically determine the geometry of the lattice. If set to
7178  * `False`, both <tt>\ref key_lattice_cell_number_ "Cell_Number"</tt> and
7179  * <tt>\ref key_lattice_origin_ "Origin"</tt> and <tt>\ref
7180  * key_lattice_sizes_ "Sizes"</tt> keys must be specified. If set to `True`
7181  * at least one of the geometrical properties must be omitted. SMASH will
7182  * determine the missing properties as described in \ref
7183  * doxypage_input_lattice_default_parameters.
7184  *
7185  * \attention
7186  * Specifying only \b some geometrical parameters (among `Cell_Number`,
7187  * `Origin` and `Sizes`) and letting SMASH determine the remaining ones
7188  * should be carefully done as it might give an undesired result. This is
7189  * due to the fact that SMASH determines the full geometry of the lattice as
7190  * described in \ref doxypage_input_lattice_default_parameters and **only
7191  * afterwards** the provided keys are overwriting the calculated ones.
7192  * Therefore, for example, specifing only the `Origin` will shift the
7193  * automatically determined lattice and this might not be the desired
7194  * effect.
7195  */
7196  /**
7197  * \see_key{key_lattice_automatic_}
7198  */
7199  inline static const Key<bool> lattice_automatic{
7200  InputSections::lattice + "Automatic",
7201  {"3.0"},
7202  detail::get_default_validator<bool>()};
7203 
7204  /*!\Userguide
7205  * \page doxypage_input_conf_lattice
7206  * \optional_key{key_lattice_cell_number_,Cell_Number,list of 3 ints,
7207  * </tt>depends on <tt>\ref key_gen_modus_ "Modus", \f$x_i>0\f$}
7208  * (see \ref doxypage_input_lattice_default_parameters)
7209  *
7210  * Number of cells in x, y, z directions.
7211  *
7212  * \attention Lattice is used to calculate bulk quantities such as baryon
7213  * density or energy density. The choice of the number of cells, together
7214  * with the chosen lattice size, affects the results: too coarse of a
7215  * lattice will average over large volumes of space (which may yield dubious
7216  * results), while too fine of a lattice may lead the calculation toward
7217  * Poisson-like noise (because there is not enough particles to provide the
7218  * necessary statistics). As guidance, one can argue that microscopic
7219  * hadronic transport should resolve structures on the order of about 1 fm,
7220  * so that one should choose lattice cell number and lattice size that
7221  * result in cell size of about 1 fm. Using lattices corresponding to larger
7222  * cell sizes can be fine if this is what is intended. Using lattices with
7223  * cell sizes of about 0.5 fm may be risky, and smaller lattice sizes are
7224  * not not advised.
7225  *
7226  * \note A too large number of cells can lead to long runtime and/or large
7227  * memory usage. This aspect is clearly related to the choice of the
7228  * <tt>\ref key_lattice_sizes_ "Sizes"</tt> key and these two keys should be
7229  * chosen together. Make sure to choose the lattice geometry carefully and
7230  * check the results for convergence with respect to it.
7231  */
7232  /**
7233  * \see_key{key_lattice_cell_number_}
7234  */
7236  InputSections::lattice + "Cell_Number",
7238  {"0.80"},
7239  [](const std::array<int, 3> &value) noexcept {
7240  if (std::abs(value[0] * value[1] * value[2]) > 15'000'000) {
7241  logg[LogArea::Configuration::id].warn(
7242  "Number of total cells for lattice is very large, which may "
7243  "lead "
7244  "to long runtime and/or large memory usage.\nMake sure this is "
7245  "intended (refer to the documentation for more information).");
7246  }
7247  return value[0] > 0 && value[1] > 0 && value[2] > 0;
7248  }};
7249 
7250  /*!\Userguide
7251  * \page doxypage_input_conf_lattice
7252  * \optional_key{key_lattice_origin_,Origin,list of 3 doubles,
7253  * </tt>depends on <tt>\ref key_gen_modus_ "Modus",\none}
7254  * (see \ref doxypage_input_lattice_default_parameters)
7255  *
7256  * The lattice covers a cuboid region whose vertices \f$V_n\f$ are uniquely
7257  * identified by the origin coordinates \f$(O_x, O_y, O_z)\f$ and the
7258  * lattice sizes \f$(L_x, L_y, L_z)\f$ as follows: \f[ V_n = (O_x+i\cdot
7259  * L_x, O_y+j\cdot L_y, O_z+k\cdot L_z) \f] where
7260  * \f$(i,j,k)\in\{0,1\}\times\{0,1\}\times\{0,1\}\f$. Coordinates of the
7261  * lattice are given \unit{in fm}.
7262  */
7263  /**
7264  * \see_key{key_lattice_origin_}
7265  */
7267  InputSections::lattice + "Origin",
7269  {"0.80"},
7270  detail::get_default_validator<std::array<double, 3>>()};
7271 
7272  /*!\Userguide
7273  * \page doxypage_input_conf_lattice
7274  * \optional_key{key_lattice_periodic_,Periodic,bool,
7275  * (\ref key_gen_modus_ "Modus" == "Box"
7276  * || \ref key_gen_modus_ "Modus" == "ListBox"),\none}
7277  *
7278  * Use periodic continuation or not. With periodic continuation
7279  * \f$(x,y,z) + (i\cdot L_x,\,j\cdot L_y,\,k\cdot L_z) \equiv (x,y,z)\f$
7280  * with \f$i,\,j,\,k\in\mathbb{Z}\f$ and \f$L_x,\,L_y,\,L_z\f$ being the
7281  * lattice sizes.
7282  */
7283  /**
7284  * \see_key{key_lattice_periodic_}
7285  */
7286  inline static const Key<bool> lattice_periodic{
7287  InputSections::lattice + "Periodic",
7289  {"0.80"},
7290  detail::get_default_validator<bool>()};
7291 
7292  /*!\Userguide
7293  * \page doxypage_input_conf_lattice
7294  * \optional_key{key_lattice_pot_affect_threshold_,
7295  * Potentials_Affect_Thresholds,bool,false,\none}
7296  *
7297  * Include potential effects, since mean field potentials change the
7298  * threshold energies of the actions.
7299  */
7300  /**
7301  * \see_key{key_lattice_pot_affect_threshold_}
7302  */
7304  InputSections::lattice + "Potentials_Affect_Thresholds",
7305  false,
7306  {"1.3"},
7307  detail::get_default_validator<bool>()};
7308 
7309  /*!\Userguide
7310  * \page doxypage_input_conf_lattice
7311  * \optional_key{key_lattice_sizes_,Sizes,list of 3 doubles,
7312  * </tt>depends on <tt>\ref key_gen_modus_ "Modus", \f$x_i>0\f$}
7313  * (see \ref doxypage_input_lattice_default_parameters)
7314  *
7315  * Sizes of lattice in x, y, z directions \unit{in fm}.
7316  *
7317  * \note Lattice is used to calculate bulk quantities such as baryon
7318  * density or energy density and the choice of its size can have a
7319  * significant impact on the results. A too small lattice size may lead to
7320  * inaccurate results, becuase part of the system might not be covered,
7321  * while a too large lattice size may lead to long runtime and large memory
7322  * usage, depending on the value of the <tt>\ref key_lattice_cell_number_
7323  * "Cell_Number"</tt> key. These two keys should be chosen together. Make
7324  * sure to choose the lattice geometry carefully and check the results for
7325  * convergence with respect to it.
7326  */
7327  /**
7328  * \see_key{key_lattice_sizes_}
7329  */
7331  InputSections::lattice + "Sizes",
7333  {"0.80"},
7334  [](const std::array<double, 3> &value) noexcept {
7335  const int max = 200; // as int to print it nicer in warning
7336  if (value[0] > max || value[1] > max || value[2] > max) {
7337  logg[LogArea::Configuration::id].warn(
7338  "Lattice size(s) larger than " + std::to_string(max) +
7339  " fm may lead to long runtime or large memory usage\nor even "
7340  "inaccurate results depending on the number of cells chosen.\n"
7341  "Make sure this is intended (refer to the documentation for "
7342  "more "
7343  "information).");
7344  }
7345  return value[0] > 0 && value[1] > 0 && value[2] > 0;
7346  }};
7347 
7348  /*!\Userguide
7349  * \page doxypage_input_conf_potentials
7350  * \optional_key{key_potentials_use_potentials_outside_lattice_,
7351  * Use_Potentials_Outside_Lattice,bool,true,\none}
7352  *
7353  * Whether to include the potentials also for particles that have left the
7354  * lattice. If set to false, the particles will propagate on straight lines
7355  * once they leave the volume that is covered by the lattice.
7356  */
7357  /**
7358  * \see_key{key_potentials_use_potentials_outside_lattice_}
7359  */
7361  InputSections::potentials + "Use_Potentials_Outside_Lattice",
7362  true,
7363  {"3.1"},
7364  detail::get_default_validator<bool>()};
7365 
7366  /*!\Userguide
7367  * \page doxypage_input_conf_pot_skyrme
7368  * \required_key{key_potentials_skyrme_a_,Skyrme_A,double,\f$x<0\f$}
7369  *
7370  * Parameter \f$A\f$ of Skyrme potential \unit{in MeV}.
7371  */
7372  /**
7373  * \see_key{key_potentials_skyrme_a_}
7374  */
7376  InputSections::p_skyrme + "Skyrme_A",
7377  {"0.60"},
7378  [](const double &value) noexcept { return value < 0; }};
7379 
7380  /*!\Userguide
7381  * \page doxypage_input_conf_pot_skyrme
7382  * \required_key{key_potentials_skyrme_b_,Skyrme_B,double,\f$x>0\f$}
7383  *
7384  * Parameter \f$B\f$ of Skyrme potential \unit{in MeV}.
7385  */
7386  /**
7387  * \see_key{key_potentials_skyrme_b_}
7388  */
7390  InputSections::p_skyrme + "Skyrme_B",
7391  {"0.60"},
7392  [](const double &value) noexcept { return value > 0; }};
7393 
7394  /*!\Userguide
7395  * \page doxypage_input_conf_pot_skyrme
7396  * \required_key{key_potentials_skyrme_tau_,Skyrme_Tau,double,
7397  * \f$x>\frac{2}{3}\f$}
7398  *
7399  * Parameter \f$\tau\f$ of Skyrme potential.
7400  */
7401  /**
7402  * \see_key{key_potentials_skyrme_tau_}
7403  */
7405  InputSections::p_skyrme + "Skyrme_Tau",
7406  {"0.60"},
7407  [](const double &value) noexcept { return value > 2.0 / 3.0; }};
7408 
7409  /*!\Userguide
7410  * \page doxypage_input_conf_pot_symmetry
7411  * \optional_key{key_potentials_symmetry_gamma_,gamma,double,
7412  * </tt>do not consider last term in \f$S(\rho_B)\f$<tt>,\f$x>0\f$}
7413  *
7414  * Exponent \f$\gamma\f$ in formula for \f$S(\rho_B)\f$. If `gamma` is
7415  * specified, the baryon density dependence is included in the potential.
7416  * Otherwise only the first term of the potential will be taken into
7417  * account.
7418  */
7419  /**
7420  * \see_key{key_potentials_symmetry_gamma_}
7421  */
7423  InputSections::p_symmetry + "gamma",
7425  {"1.7"},
7426  [](const double &value) noexcept { return value > 0; }};
7427 
7428  /*!\Userguide
7429  * \page doxypage_input_conf_pot_symmetry
7430  * \required_key{key_potentials_symmetry_s_pot_,S_Pot,double,\none}
7431  *
7432  * Parameter \f$S_{pot}\f$ of symmetry potential \unit{in MeV}. Note that
7433  * \iref{Mohs:2024gyc} Bayesian analysis suggests \f$0<S_{pot}<30\f$.
7434  */
7435  /**
7436  * \see_key{key_potentials_symmetry_s_pot_}
7437  */
7439  InputSections::p_symmetry + "S_Pot",
7440  {"0.60"},
7441  detail::get_default_validator<double>()};
7442 
7443  /*!\Userguide
7444  * \page doxypage_input_conf_pot_VDF
7445  * \required_key{key_potentials_vdf_coeffs_,Coeffs,list of doubles,\none}
7446  *
7447  * Parameters \f$C_i\f$ of the VDF potential \unit{in MeV}.
7448  */
7449  /**
7450  * \see_key{key_potentials_vdf_coeffs_}
7451  */
7453  InputSections::p_vdf + "Coeffs",
7454  {"2.1"},
7455  detail::get_default_validator<std::vector<double>>()};
7456 
7457  /*!\Userguide
7458  * \page doxypage_input_conf_pot_VDF
7459  * \required_key{key_potentials_vdf_powers_,Powers,list of doubles,
7460  * \f$x_i > 0\f$}
7461  *
7462  * Parameters \f$b_i\f$ of the VDF potential.
7463  *
7464  * \warning
7465  * You need to provide as many entries for `Powers` as provided for
7466  * `Coeffs`.
7467  */
7468  /**
7469  * \see_key{key_potentials_vdf_powers_}
7470  */
7472  InputSections::p_vdf + "Powers",
7473  {"2.1"},
7474  [](const std::vector<double> &value) noexcept {
7475  return std::all_of(value.begin(), value.end(),
7476  [](double x) { return x > 0; });
7477  }};
7478 
7479  /*!\Userguide
7480  * \page doxypage_input_conf_pot_VDF
7481  * \required_key{key_potentials_vdf_sat_rhoB_,Sat_rhoB,double,
7482  * \f$0.13 \le x \le 0.19\f$}
7483  *
7484  * The saturation density of nuclear matter \unit{in 1/fm³}.
7485  */
7486  /**
7487  * \see_key{key_potentials_vdf_sat_rhoB_}
7488  */
7490  InputSections::p_vdf + "Sat_rhoB",
7491  {"2.1"},
7492  [](const double &value) noexcept {
7493  return value >= 0.13 && value <= 0.19;
7494  }};
7495 
7496  /*!\Userguide
7497  * \page doxypage_input_conf_pot_coulomb
7498  * \required_key{key_potentials_coulomb_r_cut_,R_Cut,double,\f$x>0\f$}
7499  *
7500  * The radius value \unit{in fm} at which the integration volume is cut.
7501  */
7502  /**
7503  * \see_key{key_potentials_coulomb_r_cut_}
7504  */
7506  InputSections::p_coulomb + "R_Cut",
7507  {"2.1"},
7508  [](const double &value) noexcept { return value > 0; }};
7509 
7510  /*!\Userguide
7511  * \page doxypage_input_conf_pot_momentum_dependence
7512  * \required_key{key_potentials_momentum_dependence_C,C,double,\none}
7513  *
7514  * Parameter \f$ C \f$ of the momentum-dependent term of the potential
7515  * \unit{in MeV}.
7516  */
7517  /**
7518  * \see_key{key_potentials_momentum_dependence_C}
7519  */
7522  {"3.1"},
7523  detail::get_default_validator<double>()};
7524 
7525  /*!\Userguide
7526  * \page doxypage_input_conf_pot_momentum_dependence
7527  * \required_key{key_potentials_momentum_dependence_Lambda,Lambda,
7528  * double,\f$x \ne 0\f$}
7529  *
7530  * Parameter \f$ \Lambda \f$ of the momentum-dependent term in the
7531  * potential \unit{in 1/fm}.
7532  */
7533  /**
7534  * \see_key{key_potentials_momentum_dependence_Lambda}
7535  */
7538  {"3.1"},
7539  [](const double &value) noexcept { return value != 0; }};
7540 
7541  /*!\Userguide
7542  * \page doxypage_input_conf_forced_therm
7543  * <hr>
7544  * <h3> Mandatory keys </h3>
7545  */
7546 
7547  /*!\Userguide
7548  * \page doxypage_input_conf_forced_therm
7549  * \required_key_no_line{key_forced_therm_cell_number_,Cell_Number,list of 3
7550  * ints,\f$x_i > 0\f$}
7551  *
7552  * Number of cells in each direction (x,y,z).
7553  */
7554  /**
7555  * \see_key{key_forced_therm_cell_number_}
7556  */
7558  InputSections::forcedThermalization + "Cell_Number",
7559  {"1.1"},
7560  [](const std::array<int, 3> &value) noexcept {
7561  const bool valid = value[0] > 0 && value[1] > 0 && value[2] > 0;
7562  if (valid && value[0] * value[1] * value[2] > 2'000'000) {
7563  logg[LogArea::Configuration::id].warn(
7564  "Number of total cells for forced thermalization is very "
7565  "large, "
7566  "which may lead to long runtime. Make sure this is intended.");
7567  }
7568  return valid;
7569  }};
7570 
7571  /*!\Userguide
7572  * \page doxypage_input_conf_forced_therm
7573  * \required_key_no_line{key_forced_therm_critical_edens_,Critical_Edens,
7574  * double,\f$x \in (0\, 2]\f$}
7575  *
7576  * Critical energy density \unit{in GeV/fm³} above which forced
7577  * thermalization is applied (see \iref{Oliinychenko:2016vkg} for more
7578  * information on the constraint).
7579  */
7580  /**
7581  * \see_key{key_forced_therm_critical_edens_}
7582  */
7584  InputSections::forcedThermalization + "Critical_Edens",
7585  {"1.1"},
7586  [](const double &value) noexcept { return value > 0 && value <= 2; }};
7587 
7588  /*!\Userguide
7589  * \page doxypage_input_conf_forced_therm
7590  * \required_key_no_line{key_forced_therm_start_time_,Start_Time,double,\none}
7591  *
7592  * Time \unit{in fm} after which forced thermalization may be applied, if
7593  * the energy density is sufficiently high.
7594  */
7595  /**
7596  * \see_key{key_forced_therm_start_time_}
7597  */
7599  InputSections::forcedThermalization + "Start_Time",
7600  {"1.1"},
7601  [](const double &value) noexcept {
7602  if (value < 0 || value > 50) {
7603  logg[LogArea::Configuration::id].warn(
7604  "Start time for forced thermalization outside [0,50] is "
7605  "suspicious. Make sure this is intended.");
7606  }
7607  return true;
7608  }};
7609 
7610  /*!\Userguide
7611  * \page doxypage_input_conf_forced_therm
7612  * \required_key_no_line{key_forced_therm_timestep_,Timestep,
7613  * double,\f$x \in (0\,4]\f$}
7614  *
7615  * Timestep of thermalization \unit{in fm} (see \iref{Oliinychenko:2016vkg}
7616  * for more information on the constraint).
7617  */
7618  /**
7619  * \see_key{key_forced_therm_timestep_}
7620  */
7623  {"1.1"},
7624  [](const double &value) noexcept { return value > 0 && value <= 4; }};
7625 
7626  /*!\Userguide
7627  * \page doxypage_input_conf_forced_therm
7628  * <hr>
7629  * <h3> Optional keys </h3>
7630  */
7631 
7632  /*!\Userguide
7633  * \page doxypage_input_conf_forced_therm
7634  * \optional_key_no_line{key_forced_therm_algorithm_,Algorithm,string,"biased
7635  * BF",\any_valid}
7636  *
7637  * Algorithm applied to enforce thermalization, see
7638  * \iref{Oliinychenko:2016vkg} for more details.
7639  * - `"unbiased BF"` &rarr; slowest, but theoretically most robust
7640  * - `"biased BF"` &rarr; faster, but theoretically less robust
7641  * - `"mode sampling"` &rarr; fastest, but least robust
7642  */
7643  /**
7644  * \see_key{key_forced_therm_algorithm_}
7645  */
7646  inline static const Key<ThermalizationAlgorithm>
7650  {"1.1"},
7651  detail::get_default_validator<ThermalizationAlgorithm>()};
7652 
7653  /*!\Userguide
7654  * \page doxypage_input_conf_forced_therm
7655  * \required_key_no_line{key_forced_therm_lattice_sizes_,Lattice_Sizes,list
7656  * of 3 doubles,\f$x_i > 0\f$}
7657  *
7658  * The lattice is placed such that the center is [0.0,0.0,0.0].
7659  * If one wants to have a central cell with center at [0.0,0.0,0.0] then
7660  * number of cells should be odd (2k+1) in every direction.
7661  *
7662  * `Lattice_Sizes` is required for all modi, except the `"Box"` modus. In
7663  * case of `"Box"` modus, the lattice is set up automatically to match the
7664  * box size, and the user should not (and is not allowed to) specify it.
7665  * Sizes are to be specified \unit{in fm}.
7666  */
7667  /**
7668  * \see_key{key_forced_therm_lattice_sizes_}
7669  */
7670  inline static const Key<std::array<double, 3>>
7672  InputSections::forcedThermalization + "Lattice_Sizes",
7673  {"1.1"},
7674  [](const std::array<double, 3> &value) noexcept {
7675  const int max = 200; // as int to print it nicer in warning
7676  if (value[0] > max || value[1] > max || value[2] > max) {
7677  logg[LogArea::Configuration::id].warn(
7678  "Lattice size(s) for forced thermalization larger than " +
7679  std::to_string(max) +
7680  " fm may lead to long runtime. Make sure this is "
7681  "intended.");
7682  }
7683  return (value[0] > 0 && value[1] > 0 && value[2] > 0);
7684  }};
7685 
7686  /*!\Userguide
7687  * \page doxypage_input_conf_forced_therm
7688  * \optional_key{key_forced_therm_microcanonical_,Microcanonical,bool,false,\none}
7689  *
7690  * Enforce energy conservation or not as part of sampling algorithm.
7691  * Relevant for biased and unbiased Becattini-Ferroni (BF) algorithms. If
7692  * this option is on, samples with energies deviating too far from the
7693  * initial one will be rejected. This is different from simple energy and
7694  * momentum renormalization, which is done in the end anyway. If energy
7695  * conservation is enforced at sampling, the distributions become
7696  * microcanonical instead of canonical. One particular effect is that
7697  * multiplicity distributions become narrower.
7698  *
7699  * The downside of having this option on is that the sampling takes
7700  * significantly longer time.
7701  */
7702  /**
7703  * \see_key{key_forced_therm_microcanonical_}
7704  */
7706  InputSections::forcedThermalization + "Microcanonical",
7707  false,
7708  {"1.7"},
7709  detail::get_default_validator<bool>()};
7710 
7711  /// Alias for the type to be used in the list of keys.
7712  using key_references_variant = std::variant<
7713  std::reference_wrapper<const Key<bool>>,
7714  std::reference_wrapper<const Key<int>>,
7715  std::reference_wrapper<const Key<int64_t>>,
7716  std::reference_wrapper<const Key<double>>,
7717  std::reference_wrapper<const Key<std::string>>,
7718  std::reference_wrapper<const Key<std::array<int, 3>>>,
7719  std::reference_wrapper<const Key<std::array<double, 2>>>,
7720  std::reference_wrapper<const Key<std::array<double, 3>>>,
7721  std::reference_wrapper<const Key<std::pair<double, double>>>,
7722  std::reference_wrapper<const Key<std::vector<double>>>,
7723  std::reference_wrapper<const Key<std::vector<std::string>>>,
7724  std::reference_wrapper<const Key<std::set<ThermodynamicQuantity>>>,
7725  std::reference_wrapper<const Key<std::map<PdgCode, int>>>,
7726  std::reference_wrapper<const Key<std::map<std::string, std::string>>>,
7727  std::reference_wrapper<const Key<einhard::LogLevel>>,
7728  std::reference_wrapper<const Key<BoxInitialCondition>>,
7729  std::reference_wrapper<const Key<CalculationFrame>>,
7730  std::reference_wrapper<const Key<CharmRescattering>>,
7731  std::reference_wrapper<const Key<CollisionCriterion>>,
7732  std::reference_wrapper<const Key<DensityType>>,
7733  std::reference_wrapper<const Key<DerivativesMode>>,
7734  std::reference_wrapper<const Key<ExpansionMode>>,
7735  std::reference_wrapper<const Key<FermiMotion>>,
7736  std::reference_wrapper<const Key<DileptonBremsPionFormFactor>>,
7737  std::reference_wrapper<const Key<FieldDerivativesMode>>,
7738  std::reference_wrapper<const Key<FluidizableProcessesBitSet>>,
7739  std::reference_wrapper<const Key<FluidizationType>>,
7740  std::reference_wrapper<const Key<MultiParticleReactionsBitSet>>,
7741  std::reference_wrapper<const Key<SpinInteractionType>>,
7742  std::reference_wrapper<const Key<NNbarTreatment>>,
7743  std::reference_wrapper<const Key<OutputOnlyFinal>>,
7744  std::reference_wrapper<const Key<PdgCode>>,
7745  std::reference_wrapper<const Key<PseudoResonance>>,
7746  std::reference_wrapper<const Key<ReactionsBitSet>>,
7747  std::reference_wrapper<const Key<RestFrameDensityDerivativesMode>>,
7748  std::reference_wrapper<const Key<Sampling>>,
7749  std::reference_wrapper<const Key<SmearingMode>>,
7750  std::reference_wrapper<const Key<SphereInitialCondition>>,
7751  std::reference_wrapper<const Key<ThermalizationAlgorithm>>,
7752  std::reference_wrapper<const Key<TimeStepMode>>,
7753  std::reference_wrapper<const Key<HardStringTransitionMode>>,
7754  std::reference_wrapper<const Key<TotalCrossSectionStrategy>>>;
7755 
7756  /**
7757  * Get list of references to all existing SMASH keys.
7758  *
7759  * \attention Here the Construct-On-First-Use idiom is used to avoid the
7760  * static initialization order fiasco. This means that the list
7761  * of keys is only initialized when this method is called for the first
7762  * time. Therefore, it is guaranteed that all keys are already initialized
7763  * when the list is created.
7764  */
7765  static const std::vector<key_references_variant> &all_keys();
7766 
7767  /**
7768  * Get the logging Key given a logging area.
7769  *
7770  * @param area Logging area as \c std::string_view .
7771  * @return Constant reference to the database key found.
7772  */
7773  static const Key<einhard::LogLevel> &get_logging_key(std::string_view area) {
7774  return get_key_reference<einhard::LogLevel>({"Logging", std::string{area}});
7775  }
7776 
7777  /**
7778  * Get the output format key object
7779  *
7780  * @param content The output content as \c std::string_view .
7781  * @return Constant reference to the database key found.
7782  */
7784  std::string_view content) {
7785  return get_key_reference<std::vector<std::string>>(
7786  {"Output", std::string{content}, "Format"});
7787  }
7788 
7789  private:
7790  /**
7791  * Get a key reference object given the key labels.
7792  *
7793  * @tparam T The type of the Key.
7794  * @param labels The Key labels.
7795  * @return The reference to the found Key.
7796  *
7797  * @throw std::invalid_argument if no Key was found.
7798  *
7799  * @note This function internally use another method into which it might
7800  * have been merged. This has not been done to separate the finding
7801  * operation with the reference extraction out from the variant.
7802  */
7803  template <typename T>
7804  static const Key<T> &get_key_reference(const KeyLabels &labels) {
7805  using key_reference = std::reference_wrapper<const Key<T>>;
7806  auto candidate = InputKeys::find_key(labels);
7807  if (candidate.has_value()) {
7808  return std::get<key_reference>(candidate.value());
7809  } else {
7810  throw std::invalid_argument("No database key with keys \"" +
7811  join(labels, ": ") + "\" was found.");
7812  }
7813  }
7814 
7815  /**
7816  * Find a Key in the database given its labels.
7817  *
7818  * @param labels The Key labels.
7819  * @return An \c std::optional<key_references_variant> object which contains
7820  * the Key (in the \c std::variant of references) if found,
7821  * \c std::nullopt otherwise.
7822  */
7823  static std::optional<key_references_variant> find_key(
7824  const KeyLabels &labels);
7825 };
7826 
7827 /*!\Userguide
7828 * \page doxypage_input_conf_general_mne
7829 * <hr>
7830 * <h3> Examples </h3>
7831 *
7832 * In the following example, the number of desired non-empty events is 1000
7833 * with a maximum number of 2000 events to be calculated. In this case the
7834 * calculation will stop either if 1000 events are not empty or 2000 events
7835 * have been calculated.
7836 * \verbatim
7837 General:
7838  Modus: Collider
7839  Minimum_Nonempty_Ensembles:
7840  Number: 1000
7841  Maximum_Ensembles_Run: 2000
7842  Ensembles: 1
7843 \endverbatim
7844 *
7845 * In contrast to the first example, in the next example we use 20 parallel
7846 * ensembles. Here, the maximum number of ensembles run is 2000. The
7847 calculation
7848 * will continue until either this number of ensembles is reached or 1000
7849 * ensembles contain interactions. Note that an event consists of 20 ensembles.
7850 * The 20 ensembles run in parallel, so the number of non-empty ensembles in
7851 the
7852 * ouput is between 1000 and 1019.
7853 * \verbatim
7854 General:
7855  Modus: Collider
7856  Minimum_Nonempty_Ensembles:
7857  Number: 1000
7858  Maximum_Ensembles_Run: 2000
7859  Ensembles: 20
7860 \endverbatim
7861 */
7862 
7863 /*!\Userguide
7864  * \page doxypage_input_conf_logging
7865  * <hr>
7866  * <h3> Example: Configuring the Logging Area </h3>
7867  *
7868  * To activate different logging levels for different logging areas, change
7869  the
7870  * default level for the desired areas. For example:
7871  *\verbatim
7872  Logging:
7873  default: "WARN"
7874  Main: "INFO"
7875  Experiment: "INFO"
7876  Pythia: "DEBUG"
7877  Fpe: "OFF"
7878  \endverbatim
7879  *
7880  * This will set all levels to `WARN` verbosity, still asking for
7881  * informational messages of `Main` and `%Experiment` areas. Furthermore,
7882  * `Pythia` debug messages are requested, while any floating point exception
7883  * message is turned off.
7884  */
7885 
7886 /*!\Userguide
7887  * \page doxypage_input_conf_ct_string_parameters
7888  * <hr>
7889  * <h3> Example of string parameters customization </h3>
7890  *
7891  *\verbatim
7892  Collision_Term:
7893  Strings: True
7894  String_Parameters:
7895  String_Tension: 1.0
7896  Gluon_Beta: 0.5
7897  Gluon_Pmin: 0.001
7898  Quark_Alpha: 2.0
7899  Quark_Beta: 7.0
7900  Strange_Supp: 0.16
7901  Diquark_Supp: 0.036
7902  Sigma_Perp: 0.42
7903  StringZ_A_Leading: 0.2
7904  StringZ_B_Leading: 2.0
7905  StringZ_A: 2.0
7906  StringZ_B: 0.55
7907  String_Sigma_T: 0.5
7908  Prob_proton_to_d_uu: 0.33
7909  Separate_Fragment_Baryon: True
7910  Popcorn_Rate: 0.15
7911  \endverbatim
7912  */
7913 
7914 /*!\Userguide
7915  * \page doxypage_input_conf_ct_dileptons
7916  * <hr>
7917  * <h3> Example of dileptons configuration </h3>
7918  *
7919  * The following example configures the dilepton production for dileptons
7920  * originating from resonance decays and bremsstrahlung. In addition, the
7921  * extended OSCAR2013 dilepton output is enabled.
7922  *
7923  *\verbatim
7924  Output:
7925  Dileptons:
7926  Format: ["Oscar2013"]
7927  Extended: True
7928  Collision_Term:
7929  Dileptons:
7930  Decays: True
7931  Bremsstrahlung: True
7932  Pion_Form_Factor: "FF1"
7933  \endverbatim
7934  *
7935  * <hr>
7936  * <h2> Dilepton production in SMASH </h2>
7937  *
7938  * The treatment of Dilepton Decays is special:
7939  * - Dileptons are treated via the time integration method, also called
7940  * *shining*, as e.g. described in \iref{Schmidt:2008hm}, chapter 2D.
7941  * This means that, because dilepton decays are so rare, possible decays are
7942  * written in the output at every hadron propagation without ever performing
7943  * them. The are weighted with a "shining weight" to compensate for the
7944  * over-production.
7945  * - The shining weight can be found in the weight element of the output.
7946  * - String products are further weighted by their cross section scaling
7947  * parameter, which depends on the formation time.
7948  * - The shining method is implemented in the DecayActionsFinderDilepton,
7949  * which is automatically enabled together with the dilepton output.
7950  *
7951  * \anchor input_collision_term_dileptons_note_ \note
7952  * If you want dilepton decays, you have to modify the *decaymodes.txt* file
7953  * of your choice, which you then specify as the input with the `-d` command
7954  * line option. <b>Without this decay modes modification the dilepton output
7955  * will be empty</b>. Dilepton decays are commented out by default. Therefore,
7956  * you need to uncomment them. For the N(1520) Dalitz decay, two
7957  * treatments are available: Either by proxy of the \f$\rho N\f$ decay, which
7958  * is enabled by default (and leads to a dilepton Dalitz decay, if
7959  * \f$\rho \rightarrow e^+e^-\f$ is also enabled) or as a direct Dalitz decay
7960  * to \f$e^+e^- N\f$. If using the latter, comment-out the \f$\rho N\f$ decay
7961  * to avoid double counting. The form factor in the direct case, is constant
7962  * and fixed at the real photon point. Furthermore note, that for dilepton
7963  * decays, new decay channels can \b not simply be added to the
7964  * *decaymodes.txt* file. You also have to modify the decay width formulas
7965  * \c TwoBodyDecayDilepton::width and \c ThreeBodyDecayDilepton::diff_width
7966  * in *decaytype.cc* file.
7967  *
7968  */
7969 
7970 /*!\Userguide
7971  * \page doxypage_input_conf_ct_photons
7972  * <hr>
7973  * <h3> Example of photons configuration </h3>
7974  *
7975  * The following example configures the photon production in both binary
7976  * scatterings and bremsstrahlung processes, where 1000 fractional photons are
7977  * sampled per single perturbatively produced photon. In addition, the binary
7978  * photon output with Oscar2013 list of quantities is enabled.
7979  *
7980  *\verbatim
7981  Output:
7982  Photons:
7983  Format: ["Oscar2013_bin"]
7984  Collision_Term:
7985  Photons:
7986  Fractional_Photons: 1000
7987  2to2_Scatterings: True
7988  Bremsstrahlung: True
7989  \endverbatim
7990  *
7991  * <hr>
7992  * <h2> Photon production in SMASH </h2>
7993  *
7994  * Photons are treated perturbatively and are produced from binary
7995  * scattering processes. Their production follows the framework from Turbide
7996  * et al. described in \iref{Turbide:2006zz}. Following the perturbative
7997  * treatment, the produced photons do not contribute to the evolution of the
7998  * hadronic system. They are rather direcly printed to the photon output.
7999  * The mechanism for photon production is the following:
8000  * -# Look for hadronic interactions of particles that are also incoming
8001  * particles of a photon process. Currently, the latter include binar
8002  * scatterings of \f$ \pi \f$ and \f$ \rho \f$ mesons in the case of
8003  * photons from 2-to-2-scatterings or \f$ \pi \f$ scatterings in the case
8004  * of bremsstrahlung photons.
8005  * -# Perform the photon action and write the results to the photon output.
8006  * The final state particles are not of interest anymore as they are not
8007  * propagated further in the evolution. To account for the probability that
8008  * photon processes are significantly less likely than hadronic processes,
8009  * the produced photons are weighted according to the ratio of the photon
8010  * cross section to the hadronic cross section used to find the
8011  * interaction, \f[W = \frac{\sigma_\gamma}{\sigma_\mathrm{hadronic}}\;.\f]
8012  * This weight can be found in the weight element of the photon output,
8013  * denoted as `photon_weight` there.
8014  * -# Perform the original hadronic action based on which the photon action
8015  * was found. Propagate all final states particles throughout the hadronic
8016  * evolution as if no photon action had occured.
8017  *
8018  * As photons are produced very rarely, a lot of statistics is necessery to
8019  * yield useful results. Alternatively, it it possible to use fractional
8020  * photons (see \ref input_output_content_specific_
8021  * "Content-specific output options" on how to activate them).
8022  * This means that for each produced photon, \f$ N_{\text{Frac}} \f$
8023  * photons are actually sampled with different kinematic properties so that
8024  * more phase space is covered. In case fractional photons are used, the
8025  * weight for 2-to-2-scatterings is redefined as
8026  * \f[ W = \frac{\frac{\mathrm{d}\sigma_\gamma}{\mathrm{d}t} \ (t_2 - t_1)}{
8027  * N_\mathrm{frac} \ \sigma_{\mathrm{had}}}. \f]
8028  *
8029  * Unlike for binary scatterings, the final state kinematics of bremsstrahlung
8030  * processes are not entirly defined from the incoming particles. Moreover,
8031  * the final state momentum of the photon and as well as the scattering angle
8032  * with respect to the incoming pion collision axis are free parameters whose
8033  * distribution is encapsulated in the the differential cross section
8034  * \f$ \frac{\mathrm{d}^2\sigma_\gamma}{\mathrm{d}k\ \mathrm{d} \theta}\f$.
8035  * For numerical reasons and as the differential cross section can be
8036  * approximately factorized over the common \f$ k \f$ and
8037  * \f$ \theta \f$ range, \f$ \frac{\mathrm{d}\sigma_\gamma}{\mathrm{d}k}\f$
8038  * and \f$ \frac{\mathrm{d}\sigma_\gamma}{\mathrm{d} \theta}\f$ are considered
8039  * separately. Consequently, the weighting factor in the case of
8040  * bremsstrahlung photons is redefined as:
8041  * \f[
8042  * W = \frac{
8043  * \sqrt{\frac{\mathrm{d}\sigma_\gamma}{\mathrm{d}k} \ \Delta k \
8044  * \frac{\mathrm{d}\sigma_\gamma}{\mathrm{d}\theta}\ \Delta\theta}
8045  * }{N_\mathrm{frac}\ \sigma_{\mathrm{had}}}\;,
8046  * \f]
8047  * where \f$ \Delta k \f$ and \f$ \Delta\theta \f$ correspond to the
8048  * available \f$ k \f$ and \f$ \theta \f$ ranges.
8049  *
8050  * \note As photons are treated perturbatively, the produced photons are only
8051  * written to the photon output, but neither to the usual collision output,
8052  * nor to the particle lists.
8053  */
8054 
8055 /*!\Userguide
8056  * \page doxypage_input_conf_modi_collider
8057  * <hr>
8058  * <h3> Example of heavy-ion collision configuration </h3>
8059  *
8060  * The following example configures a Cu63-Cu63 collision at
8061  * \f$\sqrt{s_{NN}}=3.0\,\mathrm{GeV}\f$ with zero impact parameter and Fermi
8062  * motion taken into consideration. The calculation frame is the default,
8063  * center of velocity, and the nuclei are not deformed. Refer to
8064  * \ref doxypage_input_conf_modi_C_proj_targ for information about the
8065  * `Particles` and `Target` sections.
8066  *
8067  *\verbatim
8068  Modi:
8069  Collider:
8070  Projectile:
8071  Particles: {2212: 29, 2112: 34}
8072  Target:
8073  Particles: {2212: 29, 2112: 34}
8074  Sqrtsnn: 3.0
8075  \endverbatim
8076  *
8077  * To further use Fermi motion and allow the first collisions within the
8078  * projectile or target nucleus, the corresponding options need to be
8079  * activated by means of:
8080  *\verbatim
8081  Fermi_Motion: "on"
8082  Collisions_Within_Nucleus: True
8083  \endverbatim
8084  *
8085  * Additionally, the impact parameter may be specified manually. See
8086  * \ref doxypage_input_conf_modi_C_impact_parameter for an example.
8087  * <hr>
8088  *
8089  * \note
8090  * By default, executing SMASH from the codebase build folder without further
8091  * specifying the configuration, particles and decay modes files, a collider
8092  * simulation is set up according to the default _config.yaml_,
8093  * _particles.txt_ and _decaymodes.txt_ files located in the _**input**_
8094  * directory at the top-level of the codebase. However, changing the
8095  * _**input**_ directory content will not affect the default SMASH run,
8096  * unless a clean build folder is created over again. This is because the
8097  * triplet of input files are transformed into another triplet of files into
8098  * the build directory when `cmake` is run. Hence prefer to use `smash`
8099  * command line options in case you want to refer to possibly modified
8100  * configuration, particles and decay modes files.\n
8101  * To run SMASH in the (default) collider setup, execute
8102  * \verbatim
8103  ./smash
8104  \endverbatim
8105  * from the codebase build folder.
8106  */
8107 
8108 /*!\Userguide
8109  * \page doxypage_input_conf_modi_C_proj_targ
8110  * <hr>
8111  * \anchor input_modi_collider_projectile_and_target_ex1_
8112  * <h3> p-Pb collisions at the LHC </h3>
8113  *
8114  * Note that SMASH performs its calculation in the centre-of-velocity and the
8115  * particles are returned in the centre-of-mass frame. The particles therefore
8116  * need to be boosted by the rapidity of the centre-of-mass (-0.465 for p-Pb
8117  * at 5.02TeV).
8118  * \verbatim
8119  Modi:
8120  Collider:
8121  Calculation_Frame: center of velocity
8122  Impact:
8123  Random_Reaction_Plane: True
8124  Range: [0, 8.5]
8125  Projectile:
8126  E_Tot: 1580
8127  Particles:
8128  2212: 82
8129  2112: 126
8130  Target:
8131  E_Tot: 4000
8132  Particles:
8133  2212: 1
8134  2112: 0
8135  \endverbatim
8136  *
8137  * <hr>
8138  * \anchor input_modi_collider_projectile_and_target_ex2_
8139  * <h3> Configuring custom nuclei from external file </h3>
8140  *
8141  * The following example illustrates how to configure a center-of-mass
8142  heavy-ion
8143  * collision with nuclei generated from an external file. The nucleon
8144  positions
8145  * are not sampled by SMASH but read in from an external file. The given path
8146  * and name of the external file are made up and should be defined by the user
8147  * according to the used file.
8148  *\verbatim
8149  Modi:
8150  Collider:
8151  Projectile:
8152  Particles: {2212: 79, 2112: 118}
8153  Custom:
8154  File_Directory: "/home/username/custom_lists"
8155  File_Name: "Au197_custom.txt"
8156  Target:
8157  Particles: {2212: 79, 2112: 118}
8158  Custom:
8159  File_Directory: "/home/username/custom_lists"
8160  File_Name: "Au197_custom.txt"
8161  Sqrtsnn: 7.7
8162  \endverbatim
8163  *
8164  * The _Au197_custom.txt_ file should be formatted as follows:
8165  *
8166  * <div class="fragment">
8167  * <div class="line"><span class="preprocessor"> 0.20100624 0.11402423
8168  * -2.40964466 0 0</span></div>
8169  * <div class="line"><span class="preprocessor"> 1.69072087 -3.21471918
8170  * 1.06050693 0 1</span></div>
8171  * <div class="line"><span class="preprocessor">-1.95791109 -3.51483782
8172  * 2.47294656 1 1</span></div>
8173  * <div class="line"><span class="preprocessor"> 0.43554894 4.35250733
8174  * 0.13331011 1 0</span></div>
8175  * <div class="line"><span class="preprocessor"> ...</span></div>
8176  * </div>
8177  *
8178  * It contains 5 columns (x, y, z, s, c). The first three columns specify the
8179  * spatial cordinates \unit{in fm}. The fourth column denotes the spin
8180  * projection. The fifth contains the charge with 1 and 0 for protons and
8181  * neutrons respectively. In the example given the first line defines a
8182  neutron
8183  * and the second one a proton. Please make sure that your file contains as
8184  many
8185  * particles as you specified in the configuration. For the example considered
8186  * here, the file needs to contain 79 protons and 118 neutrons in the first
8187  197
8188  * lines. And the same number in the following 197 lines. The read in nuclei
8189  are
8190  * randomly rotated and recentered. Therefore you can run SMASH even if your
8191  * file does not contain enough nuclei for the number of events you want to
8192  * simulate as the missing nuclei are generated by rotation of the given
8193  * configurations.
8194  *
8195  * \note
8196  * SMASH is shipped with an example configuration file to set up a collision
8197  * with externally generated nucleon positions. This requires a particle list
8198  to
8199  * be read in. Both, the configuration file and the particle list, are located
8200  * in the _**input/custom_nucleus**_ folder at the top-level of SMASH
8201  codebase.
8202  * To run SMASH with the provided example configuration and particle list,
8203  execute
8204  * \verbatim
8205  ./smash -i INPUT_DIR/custom_nucleus/config.yaml
8206  \endverbatim
8207  * where `INPUT_DIR` needs to be replaced by the path to the input directory
8208  * at the top-level of SMASH codebase.
8209  *
8210  * <hr>
8211  * \anchor input_modi_collider_projectile_and_target_ex3_
8212  * <h3> Configuring a deformed nucleus </h3>
8213  *
8214  * To configure a fixed target heavy-ion collision with deformed nuclei, whose
8215  * spherical deformation is explicitly declared, it can be done according to
8216  * the following example. For explanatory (and not physics) reasons, the
8217  * projectile's Woods-Saxon distribution is initialized automatically and
8218  * its spherical deformation manually, while the target nucleus is configured
8219  * just the opposite.
8220  *\verbatim
8221  Modi:
8222  Collider:
8223  Projectile:
8224  Particles: {2212: 29, 2112: 34}
8225  Deformed:
8226  # Manually set deformation parameters
8227  Automatic: false
8228  Beta_2: 0.1
8229  Beta_3: 0.2
8230  Beta_4: 0.3
8231  Orientation:
8232  Theta: 0.8
8233  Phi: 0.02
8234  Psi: 0.13
8235  Target:
8236  Particles: {2212: 29, 2112: 34}
8237  # manually set Woods-Saxon parameters
8238  Saturation_Density: 0.1968
8239  Diffusiveness: 0.8
8240  Radius: 2.0
8241  Deformed:
8242  # Automatically set deformation parameters
8243  Automatic: true
8244  Orientation:
8245  # Randomly rotate nucleus
8246  Random_Rotation: true
8247  E_kin: 1.2
8248  Calculation_Frame: "fixed target"
8249  \endverbatim
8250  *
8251  * <hr>
8252  * \anchor input_modi_collider_projectile_and_target_ex4_
8253  * <h3> Configuring an alpha-clustered nucleus </h3>
8254  *
8255  * The following example shows how to setup projectile and target using
8256  * alpha-clustering in an O-O collision. The projectile is automatically
8257  * initialized, while the target nucleus is manually configured specifying a
8258  * side length of the tetrahedron (this serves only for demonstration purposes
8259  * and in real situations projectile and target should be initialised in the
8260  * same way).
8261  *\verbatim
8262  Modi:
8263  Collider:
8264  Projectile:
8265  Particles: {2212: 8, 2112: 8} #Oxygen16
8266  Alpha_Clustered:
8267  Automatic: "True" # Use default 3.42 for the side length
8268  Target:
8269  Particles: {2212: 8, 2112: 8} #Oxygen16
8270  Alpha_Clustered:
8271  Automatic: "False"
8272  Side_Length: 4.2
8273  Sqrtsnn: 200
8274  Fermi_Motion: frozen
8275  \endverbatim
8276  */
8277 
8278 /*!\Userguide
8279  * \page doxypage_input_conf_modi_C_impact_parameter
8280  * <hr>
8281  * <h3> Configuring the Impact Parameter </h3>
8282  *
8283  * The impact parameter can be configured to have a fixed value in the
8284  * `Collider` subsection of `Modi`. In addition, the initial distance of the
8285  * nuclei in \f$z\f$-direction is assigned a specific value. This does not
8286  * affect the time at which the nuclei will collide, but only changes the
8287  start
8288  * time of the simulation as the nuclei are further apart when the simulation
8289  * begins.
8290  *\verbatim
8291  Modi:
8292  Collider:
8293  Impact:
8294  Value: 0.1
8295  \endverbatim
8296  * The impact parameter may further be sampled within a certain impact
8297  parameter
8298  * range. By default, a quadratic distribution is used for the sampling.
8299  * However, this may be set to `"uniform"` if necessary.
8300  *\verbatim
8301  Modi:
8302  Collider:
8303  Impact:
8304  Sample: "quadratic"
8305  Range: [3.0, 6.0]
8306  \endverbatim
8307  * A custom impact parameter distribution based on a set of `Values` and
8308  * `Yields`, can be configured as follows:
8309  *\verbatim
8310  Modi:
8311  Collider:
8312  Impact:
8313  Sample: "custom"
8314  Values: [0.0, 3.0, 6.0, 9.0]
8315  Yields: [0.000000, 2.999525, 5.959843, 6.995699]
8316  \endverbatim
8317  */
8318 
8319 /*!\Userguide
8320 * \page doxypage_input_conf_modi_C_initial_conditions
8321 * <hr>
8322 * <h3> Extracting initial conditions for hydrodynamic evolution </h3>
8323 *
8324 * The following example configures the initial conditions for hydrodynamics
8325 * for a Au+Au collision at \f$\sqrt{s_{NN}}=200\ \mathrm{GeV}\f$ at
8326 midrapidity
8327 * (\f$-1<y<1\f$). In addition, the extended OSCAR2013 and "For_vHLLE" outputs
8328 * are enabled.
8329 *
8330 *\verbatim
8331 Output:
8332  Initial_Conditions:
8333  Format: ["For_vHLLE","Oscar2013"]
8334  Extended: True
8335 Modi:
8336  Collider:
8337  Projectile:
8338  Particles: {2212: 79, 2112: 118} #Gold197
8339  Target:
8340  Particles: {2212: 79, 2112: 118} #Gold197
8341  Sqrtsnn: 200
8342  Initial_Conditions:
8343  Type: "Constant_Tau"
8344  Rapidity_Cut: 1
8345 \endverbatim
8346 */
8347 
8348 /*!\Userguide
8349  * \page doxypage_input_conf_modi_sphere
8350  * <hr>
8351  * <h3> Configuring a sphere simulation </h3>
8352  *
8353  * The following example configures an expanding sphere with a radius of 5 fm
8354  * at a temperature of 200 MeV. The particles are initialized with thermal
8355  * momenta at a start time of 0 fm. The particle numbers at initialization are
8356  * 100 \f$ \pi^+ \f$, 100 \f$ \pi^0 \f$, 100 \f$ \pi^- \f$, 50 protons and 50
8357  * neutrons.
8358  *
8359  *\verbatim
8360  Modi:
8361  Sphere:
8362  Radius: 5.0
8363  Temperature: 0.2
8364  Initial_Condition: "thermal momenta"
8365  Start_Time: 0.0
8366  Init_Multiplicities:
8367  211: 100
8368  111: 100
8369  -211: 100
8370  2212: 50
8371  2112: 50
8372  \endverbatim
8373  *
8374  * It is also possible to initialize a sphere based on thermal multiplicities.
8375  * This is done via
8376  *\verbatim
8377  Modi:
8378  Sphere:
8379  Radius: 10.0
8380  Temperature: 0.2
8381  Use_Thermal_Multiplicities: True
8382  \endverbatim
8383  *
8384  * If one wants to simulate a jet in the hadronic medium, this can be done by
8385  * using the following configuration setup:
8386  *\verbatim
8387  Modi:
8388  Sphere:
8389  Radius: 10.0
8390  Temperature: 0.2
8391  Use_Thermal_Multiplicities: True
8392  Jet:
8393  Jet_PDG: 211
8394  Jet_Momentum: 100.0
8395 \endverbatim
8396  *
8397  * \note
8398  * SMASH is shipped with an example configuration file to set up an expanding
8399  * sphere simulation initialized with predefined initial particle
8400  * multiplicities. This file is located in the _**input/sphere**_ folder at
8401  * the top-level of SMASH codebase. To run SMASH with the provided example
8402  * configuration for the sphere system, execute
8403  * \verbatim
8404  ./smash -i INPUT_DIR/sphere/config.yaml
8405  \endverbatim
8406  * where `INPUT_DIR` needs to be replaced by the path to the input directory
8407  * at the top-level of SMASH codebase.
8408  *
8409  */
8410 
8411 /*!\Userguide
8412  * \page doxypage_input_conf_modi_box
8413  * <hr>
8414  * <h3> Configuring a Box Simulation </h3>
8415  *
8416  * The following example configures an infinite matter simulation in a Box
8417 with
8418  * 10 fm cube length at a temperature of 200 MeV. The particles are
8419 initialized
8420  * with thermal momenta at a start time of 10 fm. The particle numbers at
8421  * initialization are 100 \f$ \pi^+ \f$, 100 \f$ \pi^0 \f$, 100 \f$ \pi^- \f$,
8422  * 50 protons and 50 neutrons.
8423  *
8424  *\verbatim
8425  Modi:
8426  Box:
8427  Length: 10.0
8428  Start_Time: 0.0
8429  Temperature: 0.2
8430  Initial_Condition: "thermal momenta"
8431  Start_Time: 10.0
8432  Init_Multiplicities:
8433  211: 100
8434  111: 100
8435  -211: 100
8436  2212: 50
8437  2112: 50
8438  \endverbatim
8439  * On the contrary, it is also possible to initialize a thermal box based on
8440  * thermal multiplicities. This is done via
8441  *\verbatim
8442  Modi:
8443  Box:
8444  Length: 10.0
8445  Start_Time: 0.0
8446  Temperature: 0.2
8447  Use_Thermal_Multiplicities: True
8448  Initial_Condition: "thermal momenta"
8449  Baryon_Chemical_Potential: 0.0
8450  Strange_Chemical_Potential: 0.0
8451  Charge_Chemical_Potential: 0.0
8452  Account_Resonance_Widths: True
8453  \endverbatim
8454  *
8455  * If one wants to simulate a jet in the hadronic medium, this can be done
8456  * by using the following configuration setup:
8457  *\verbatim
8458  Modi:
8459  Box:
8460  Length: 10.0
8461  Temperature: 0.2
8462  Use_Thermal_Multiplicities: True
8463  Initial_Condition: "thermal momenta"
8464  Jet:
8465  Jet_PDG: 211
8466  Jet_Momentum: 100.0
8467 \endverbatim
8468  *
8469  * \note\anchor modi_box_usage_remark
8470  * The box modus is most useful for infinite matter simulations with thermal
8471 and
8472  * chemical equilibration and detailed balance. Detailed balance can however
8473 not
8474  * be conserved if 3-body decays (or higher) are performed. To yield useful
8475  * results applying a SMASH box simulation, it is therefore necessary to
8476 modify
8477  * the provided default _particles.txt_ and _decaymodes.txt_ files by removing
8478  * 3-body and higher order decays from the decay modes file and all
8479  * corresponding particles that can no longer be produced from the particles
8480  * file. In addition, strings need to be turned off, since they also break
8481  * detailed balance due to lacking backreactions, and the total cross section
8482  * should be computed by summing the partial processes.\n\n
8483  * SMASH is shipped with example files (_config.yaml_, _particles.txt_ and
8484  * _decaymodes.txt_) meeting the above mentioned requirements to set up an
8485  * infinite matter simulation. These files are located in the _**input/box**_
8486  * folder at the top-level of SMASH codebase. To run SMASH with the provided
8487  * example configuration for the box system, execute
8488  * \n
8489  * \verbatim
8490  ./smash -i INPUT_DIR/box/config.yaml\
8491  -p INPUT_DIR/box/particles.txt\
8492  -d INPUT_DIR/box/decaymodes.txt
8493  \endverbatim
8494  * where `INPUT_DIR` needs to be replaced by the path to the input directory
8495  * at the top-level of SMASH codebase.
8496  */
8497 
8498 /*!\Userguide
8499  * \page doxypage_input_conf_modi_list
8500  * <hr>
8501  * <h3> Configuring an afterburner simulation </h3>
8502  *
8503  * The following example sets up an afterburner simulation for a set of
8504  particle
8505  * files located in _**particle_lists_in**_ folder. The files are named as
8506  * _event10_, _event11_, etc. (the first being number 10 is specified by the
8507  key
8508  * `Shift_Id`). SMASH is run once for each event in the folder.
8509  * \verbatim
8510  Modi:
8511  List:
8512  File_Directory: "particle_lists_in"
8513  File_Prefix: "event"
8514  Shift_Id: 10
8515  \endverbatim
8516  *
8517  * Alternatively, if all events are contained in a single file (or if only one
8518  * file has to be processed), the following configuration can be used (SMASH
8519  * will then read the *particle_lists_in/single_file_to_be_used.dat* file).
8520  * \verbatim
8521  Modi:
8522  List:
8523  File_Directory: "particle_lists_in"
8524  Filename: "single_file_to_be_used.dat"
8525  \endverbatim
8526  *
8527  * <hr>
8528  * <h2> Some information about the structure of input particle file </h2>
8529  *
8530  * This is how an input particle file might look like:
8531  * <div class="fragment">
8532  * <div class="line"><span class="preprocessor">#!OSCAR2013 particle_lists
8533  * t x y z mass p0 px py pz pdg ID charge</span></div>
8534  * <div class="line"><span class="preprocessor">\# Units: fm fm fm fm
8535  * GeV GeV GeV GeV GeV none none none</span></div>
8536  * <div class="line"><span class="preprocessor">\# event 0</span></div>
8537  * <div class="line"><span class="preprocessor">0.1 6.42036 1.66473 9.38499
8538  * 0.138 0.232871 0.116953 -0.115553 0.090303 111 0 0</span></div>
8539  * <div class="line"><span class="preprocessor">\# event 0 end</span></div>
8540  * <div class="line"><span class="preprocessor">\# event 1</span></div>
8541  * <div class="line"><span class="preprocessor">0.1 6.42036 1.66473 9.38499
8542  * 0.138 0.232871 0.116953 -0.115553 0.090303 111 0 0</span></div>
8543  * <div class="line"><span class="preprocessor">\# event 1 end</span></div>
8544  * </div>
8545  * Each colum contains the described quantities. In particular, in the example
8546  * above, one \f$\pi^0\f$ with spatial coordinates
8547  * \f[(t, x, y, z) = (0.1, 6.42036, 1.66473, 9.38499)\,\mathrm{fm}\f]
8548  * and 4-momentum
8549  * \f[(p_0,p_x,p_y,p_z)=(0.232871,0.116953,-0.115553,0.090303)\,\mathrm{GeV}\f]
8550  * with mass = 0.138 GeV, pdg = 111, ID = 0 and charge 0 will be initialized
8551  for
8552  * the first event (and also for the second event).
8553  *
8554  * \note
8555  * SMASH is shipped with an example configuration file to set up an
8556  afterburner
8557  * simulation by means of the list modus. This also requires a particle list
8558  to
8559  * be read in. Both, the configuration file and the particle list, are located
8560  * in the _**input/list**_ folder at the top-level of SMASH codebase. To run
8561  * SMASH with the provided example configuration and particle list, execute
8562  * \verbatim
8563  ./smash -i INPUT_DIR/list/config.yaml
8564  \endverbatim
8565  * where `INPUT_DIR` needs to be replaced by the path to the input directory
8566  * at the top-level of SMASH codebase.
8567  */
8568 
8569 /*!\Userguide
8570  * \page doxypage_input_conf_lattice
8571  * <hr>
8572  * <h3> Configuring the Lattice </h3>
8573  *
8574  * The following example configures the lattice with the origin in (0,0,0), 20
8575  * cells of 10 fm size in each direction and with periodic boundary
8576  conditions.
8577  * The potential effects on the thresholds are taken into consideration. Note
8578  * that, as the origin is by definition the left down near corner of the cell,
8579  * center is located at (5, 5, 5).
8580  *\verbatim
8581  Lattice:
8582  Automatic: False
8583  Origin: [0.0, 0.0, 0.0]
8584  Sizes: [10.0, 10.0, 10.0]
8585  Cell_Number: [20, 20, 20]
8586  Periodic: True
8587  Potentials_Affect_Thresholds: True
8588  \endverbatim
8589  * A default lattice is also available for each modus. In this case the
8590  * lattice is setup automatically with reasonable size, cell number and
8591  * placement.
8592  * See \ref doxypage_input_lattice_default_parameters for more details on the
8593  * defaults. The default lattice is used if the `"Lattice"` section in the
8594  * configuration is given as shown in the following example.
8595  *\verbatim
8596  Lattice:
8597  Automatic: True
8598  \endverbatim
8599  *
8600  * It is also possible to explicity set some lattice parameters and use the
8601  * default for the rest. See the following example for the `"Box"` modus:
8602  *\verbatim
8603  Lattice:
8604  Automatic: True
8605  Cell_Number: [20, 20, 20]
8606  \endverbatim
8607  * As explicitly specified, there will be twenty cells for each direction.
8608  * The origin and the sizes of the lattice are automatically set such
8609  * that the lattice exactly covers the entire box.
8610  */
8611 
8612 /*!\Userguide
8613  * \page doxypage_input_conf_forced_therm
8614  * <hr>
8615  * <h3> Configuring forced thermalization </h3>
8616  *
8617  * The following example activates forced thermalization in cells in which the
8618  * energy density is above 0.3 GeV/fm³. The lattice is initialized with 21
8619  * cells in x and y direction and 101 cells in z-direction. The lattice size
8620  is
8621  * 20 fm in x and y direction and 50 fm in z-direction. The thermalization is
8622  * applied only for times later than 10 fm with a timestep of 1 fm. The
8623  * sampling is done according to the "biased BF" algorithm.
8624  *\verbatim
8625  Forced_Thermalization:
8626  Lattice_Sizes: [20.0, 20.0, 50.0]
8627  Cell_Number: [21, 21, 101]
8628  Critical_Edens: 0.3
8629  Start_Time: 10.0
8630  Timestep: 1.0
8631  Algorithm: "biased BF"
8632  \endverbatim
8633  */
8634 
8635 } // namespace smash
8636 
8637 #endif // SRC_INCLUDE_SMASH_INPUT_KEYS_H_
default_type default_value() const
Get the default value of the key.
Definition: key.h:217
Collection of useful constants that are known at compile time.
This is the main include file for Einhard.
@ Off
Don't use form factors, i.e. multiply by 1.
@ Off
Don't use fermi motion.
@ Strings
Use string fragmentation.
@ Resonances
Charm interactions via resonances.
@ Fixed
Use fixed time step.
@ Exponential
Legacy exponential splitting based on the hard string cross section.
std::bitset< 5 > FluidizableProcessesBitSet
@ TopDownMeasured
Mix the two above, using the parametrizations only for measured processes, and summing up partials fo...
@ Quadratic
Sample from areal / quadratic distribution.
std::bitset< 4 > MultiParticleReactionsBitSet
Container for the n to m reactions in the code.
@ Covariant
Covariant Criterion.
@ ThermalMomentaBoltzmann
A thermalized ensemble is generated, with momenta sampled from a Maxwell-Boltzmann distribution.
@ LargestFromUnstable
Heaviest possible resonance from processes with at least one resonance in the incoming particles.
std::bitset< 11 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
@ Yes
Print only final-state particles.
@ Off
No spin interactions.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > & logg
An array that stores all pre-configured Logger objects.
Definition: logging.h:245
@ ALL
Log all message.
Definition: einhard.hpp:110
constexpr Section p_skyrme
Subsection for the Skyrme potentials information.
Definition: input_keys.h:235
constexpr Section c_pauliBlocking
Subsection for the Pauli blocking mechanism.
Definition: input_keys.h:123
constexpr Section p_vdf
Subsection for the VDF potentials information.
Definition: input_keys.h:239
constexpr Section m_c_p_deformed
Subsection for the deformed projectile in collider modus.
Definition: input_keys.h:177
constexpr Section m_collider
Subsection for the collider modus.
Definition: input_keys.h:161
constexpr Section m_c_t_deformed
Subsection for the deformed target in collider modus.
Definition: input_keys.h:190
constexpr Section o_rivet
Subsection for the output Rivet content.
Definition: input_keys.h:220
constexpr Section m_c_target
Subsection for the target in collider modus.
Definition: input_keys.h:183
constexpr Section m_c_t_alphaClustered
Subsection for the alpha-clustered target in collider modus.
Definition: input_keys.h:185
constexpr Section m_c_p_custom
Subsection for the custom projectile in collider modus.
Definition: input_keys.h:174
constexpr Section output
Section for the output information.
Definition: input_keys.h:205
constexpr Section m_c_p_alphaClustered
Subsection for the alpha-clustered projectile in collider modus.
Definition: input_keys.h:171
constexpr Section logging
Section for the logging.
Definition: input_keys.h:152
constexpr Section o_initialConditions
Subsection for the output initial conditions content.
Definition: input_keys.h:213
constexpr Section m_box
Subsection for the box modus.
Definition: input_keys.h:157
constexpr Section collisionTerm
Section for the collision term.
Definition: input_keys.h:118
constexpr Section o_coulomb
Subsection for the output Coulomb content.
Definition: input_keys.h:209
constexpr Section m_c_initialConditions
Subsection for the initial conditions in collider modus.
Definition: input_keys.h:165
constexpr Section o_thermodynamics
Subsection for the output thermodynamics content.
Definition: input_keys.h:224
constexpr Section g_minEnsembles
Subsection for the minimum-nonempty-ensembles mechanism.
Definition: input_keys.h:145
constexpr Section c_photons
Subsection for the photons.
Definition: input_keys.h:126
constexpr Section m_c_t_orientation
Subsection for the target orientation in collider modus.
Definition: input_keys.h:193
constexpr Section m_c_projectile
Subsection for the projectile in collider modus.
Definition: input_keys.h:168
constexpr Section general
General section.
Definition: input_keys.h:143
constexpr Section p_coulomb
Subsection for the Coulomb potentials information.
Definition: input_keys.h:230
constexpr Section c_heavyFlavor
Subsection for heavy flavor.
Definition: input_keys.h:128
constexpr Section forcedThermalization
Section for the forced thermalization.
Definition: input_keys.h:140
constexpr Section o_r_weights
Subsection for the output Rivet weights information.
Definition: input_keys.h:222
constexpr Section m_c_p_orientation
Subsection for the projectile orientation in collider modus.
Definition: input_keys.h:180
constexpr Section c_hardStringTransition
Subsection for the hard string transition.
Definition: input_keys.h:137
constexpr Section o_photons
Subsection for the output photons content.
Definition: input_keys.h:218
constexpr Section c_dileptons
Subsection for the dileptons.
Definition: input_keys.h:120
constexpr Section m_c_t_custom
Subsection for the custom target in collider modus.
Definition: input_keys.h:188
constexpr Section potentials
Section for the potentials information.
Definition: input_keys.h:228
constexpr Section lattice
Section for the lattice.
Definition: input_keys.h:149
constexpr Section m_s_jet
Subsection for the jet in sphere modus.
Definition: input_keys.h:202
constexpr Section c_stringParameters
Subsection for the string parameters.
Definition: input_keys.h:131
constexpr Section o_dileptons
Subsection for the output dileptons content.
Definition: input_keys.h:211
constexpr Section m_listBox
Subsection for the list-box modus.
Definition: input_keys.h:198
constexpr Section modi
Section for the modus specific information.
Definition: input_keys.h:155
constexpr Section o_collisions
Subsection for the output collisions content.
Definition: input_keys.h:207
constexpr Section m_c_impact
Subsection for the impact information in collider modus.
Definition: input_keys.h:163
constexpr Section m_sphere
Subsection for the sphere modus.
Definition: input_keys.h:200
constexpr Section p_symmetry
Subsection for the symmetry potentials information.
Definition: input_keys.h:237
constexpr Section m_list
Subsection for the list modus.
Definition: input_keys.h:196
constexpr Section m_b_jet
Subsection for the jet in box modus.
Definition: input_keys.h:159
constexpr Section p_momentumDependence
Subsection for the momentum-dependent potentials information.
Definition: input_keys.h:232
constexpr Section o_particles
Subsection for the output particles content.
Definition: input_keys.h:216
constexpr Section operator+(const Section &parent, std::string_view child)
Add a child section to a parent section.
Definition: input_keys.h:113
constexpr Section c_stringTransition
Subsection for the string transition.
Definition: input_keys.h:134
Definition: action.h:24
@ Dependent
Default value which depends on other keys
std::vector< std::string_view > KeyLabels
Descriptive alias for storing key labels, i.e.
Definition: key.h:46
bool all_of(Container &&c, UnaryPredicate &&p)
Convenience wrapper for std::all_of that operates on a complete container.
Definition: algorithms.h:80
std::string to_string(ThermodynamicQuantity quantity)
Convert a ThermodynamicQuantity enum value to its corresponding string.
Definition: stringify.cc:26
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:69
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:76
std::string join(const std::vector< std::string > &v, std::string_view delim)
Join strings using delimiter.
A container to keep track of all ever existed input keys.
Definition: input_keys.h:1255
static const Key< double > collTerm_stringParam_probabilityPToDUU
See user guide description for more information.
Definition: input_keys.h:3622
static const Key< double > collTerm_stringParam_powerParticleFormation
See user guide description for more information.
Definition: input_keys.h:3604
std::variant< std::reference_wrapper< const Key< bool > >, std::reference_wrapper< const Key< int > >, std::reference_wrapper< const Key< int64_t > >, std::reference_wrapper< const Key< double > >, std::reference_wrapper< const Key< std::string > >, std::reference_wrapper< const Key< std::array< int, 3 > >>, std::reference_wrapper< const Key< std::array< double, 2 > >>, std::reference_wrapper< const Key< std::array< double, 3 > >>, std::reference_wrapper< const Key< std::pair< double, double > >>, std::reference_wrapper< const Key< std::vector< double > >>, std::reference_wrapper< const Key< std::vector< std::string > >>, std::reference_wrapper< const Key< std::set< ThermodynamicQuantity > >>, std::reference_wrapper< const Key< std::map< PdgCode, int > >>, std::reference_wrapper< const Key< std::map< std::string, std::string > >>, std::reference_wrapper< const Key< einhard::LogLevel > >, std::reference_wrapper< const Key< BoxInitialCondition > >, std::reference_wrapper< const Key< CalculationFrame > >, std::reference_wrapper< const Key< CharmRescattering > >, std::reference_wrapper< const Key< CollisionCriterion > >, std::reference_wrapper< const Key< DensityType > >, std::reference_wrapper< const Key< DerivativesMode > >, std::reference_wrapper< const Key< ExpansionMode > >, std::reference_wrapper< const Key< FermiMotion > >, std::reference_wrapper< const Key< DileptonBremsPionFormFactor > >, std::reference_wrapper< const Key< FieldDerivativesMode > >, std::reference_wrapper< const Key< FluidizableProcessesBitSet > >, std::reference_wrapper< const Key< FluidizationType > >, std::reference_wrapper< const Key< MultiParticleReactionsBitSet > >, std::reference_wrapper< const Key< SpinInteractionType > >, std::reference_wrapper< const Key< NNbarTreatment > >, std::reference_wrapper< const Key< OutputOnlyFinal > >, std::reference_wrapper< const Key< PdgCode > >, std::reference_wrapper< const Key< PseudoResonance > >, std::reference_wrapper< const Key< ReactionsBitSet > >, std::reference_wrapper< const Key< RestFrameDensityDerivativesMode > >, std::reference_wrapper< const Key< Sampling > >, std::reference_wrapper< const Key< SmearingMode > >, std::reference_wrapper< const Key< SphereInitialCondition > >, std::reference_wrapper< const Key< ThermalizationAlgorithm > >, std::reference_wrapper< const Key< TimeStepMode > >, std::reference_wrapper< const Key< HardStringTransitionMode > >, std::reference_wrapper< const Key< TotalCrossSectionStrategy > >> key_references_variant
Alias for the type to be used in the list of keys.
Definition: input_keys.h:7754
static const Key< einhard::LogLevel > log_rootsolver
See user guide description for more information.
Definition: input_keys.h:2029
static const Key< bool > potentials_use_potentials_outside_lattice
See user guide description for more information.
Definition: input_keys.h:7360
static const Key< double > modi_collider_projectile_saturationDensity
See user guide description for more information.
Definition: input_keys.h:4287
static const Key< double > collTerm_stringTrans_lower
See user guide description for more information.
Definition: input_keys.h:3333
static const Key< double > modi_collider_projectile_radius
See user guide description for more information.
Definition: input_keys.h:4259
static const Key< double > collTerm_stringParam_formationTime
See user guide description for more information.
Definition: input_keys.h:3453
static const Key< bool > output_initialConditions_extended
See user guide description for more information.
Definition: input_keys.h:6670
static const Key< std::pair< double, double > > collTerm_stringTrans_rangeNpi
See user guide description for more information.
Definition: input_keys.h:3382
static const Key< bool > collTerm_photons_twoToTwoScatterings
See user guide description for more information.
Definition: input_keys.h:3967
static const Key< double > collTerm_stringTrans_range_width
See user guide description for more information.
Definition: input_keys.h:3402
static const Key< einhard::LogLevel > log_crossSections
See user guide description for more information.
Definition: input_keys.h:2096
static const Key< bool > collTerm_stringParam_useMonashTune
See user guide description for more information.
Definition: input_keys.h:3818
static const Key< DensityType > output_densityType
See user guide description for more information.
Definition: input_keys.h:6146
static const Key< double > forcedThermalization_criticalEDensity
See user guide description for more information.
Definition: input_keys.h:7583
static const Key< double > collTerm_stringParam_sigmaPerp
See user guide description for more information.
Definition: input_keys.h:3660
static const Key< double > potentials_momentum_dependence_C
See user guide description for more information.
Definition: input_keys.h:7520
static const Key< double > modi_collider_projectile_eKin
See user guide description for more information.
Definition: input_keys.h:4320
static const Key< std::vector< std::string > > output_photons_format
See user guide description for more information.
Definition: input_keys.h:6301
static const Key< double > modi_sphere_addRadialVelocity
See user guide description for more information.
Definition: input_keys.h:5320
static const Key< double > modi_collider_target_orientation_theta
See user guide description for more information.
Definition: input_keys.h:4733
static const Key< einhard::LogLevel > log_lattice
See user guide description for more information.
Definition: input_keys.h:2240
static const Key< std::pair< double, double > > collTerm_hardStringTransition_energyRange
See user guide description for more information.
Definition: input_keys.h:3228
static const Key< bool > modi_collider_collisionWithinNucleus
See user guide description for more information.
Definition: input_keys.h:4127
static const Key< double > collTerm_stringParam_gluonPMin
See user guide description for more information.
Definition: input_keys.h:3486
static const Key< double > modi_listBox_length
See user guide description for more information.
Definition: input_keys.h:6068
static const Key< std::vector< std::string > > output_collisions_format
See user guide description for more information.
Definition: input_keys.h:6256
static const Key< double > collTerm_stringParam_stringZALeading
See user guide description for more information.
Definition: input_keys.h:3759
static const Key< double > modi_collider_target_pLab
See user guide description for more information.
Definition: input_keys.h:4383
static const Key< double > modi_sphere_addRadialVelocityExponent
See user guide description for more information.
Definition: input_keys.h:5339
static const Key< double > collTerm_resonanceLifetimeModifier
See user guide description for more information.
Definition: input_keys.h:3001
static const Key< std::string > particles
See user guide description for more information.
Definition: input_keys.h:1309
static const Key< double > modi_collider_target_eTot
See user guide description for more information.
Definition: input_keys.h:4351
static const Key< double > modi_box_temperature
See user guide description for more information.
Definition: input_keys.h:5662
static const Key< std::map< PdgCode, int > > modi_sphere_initialMultiplicities
See user guide description for more information.
Definition: input_keys.h:5224
static const Key< double > modi_sphere_chargeChemicalPotential
See user guide description for more information.
Definition: input_keys.h:5377
static const Key< double > modi_collider_initialDistance
See user guide description for more information.
Definition: input_keys.h:4166
static const Key< std::vector< std::string > > output_rivet_weights_select
See user guide description for more information.
Definition: input_keys.h:6980
static const Key< bool > output_rivet_weights_noMulti
See user guide description for more information.
Definition: input_keys.h:6948
static const Key< einhard::LogLevel > log_hyperSurfaceCrossing
See user guide description for more information.
Definition: input_keys.h:2208
static const Key< double > modi_collider_projectile_diffusiveness
See user guide description for more information.
Definition: input_keys.h:4189
static const Key< bool > modi_collider_projectile_deformed_automatic
See user guide description for more information.
Definition: input_keys.h:4492
static const Key< std::vector< std::string > > collTerm_stringParam_pythiaSettings
See user guide description for more information.
Definition: input_keys.h:3886
static const Key< double > modi_collider_projectile_deformed_beta3
See user guide description for more information.
Definition: input_keys.h:4542
static const Key< double > modi_sphere_temperature
See user guide description for more information.
Definition: input_keys.h:5271
static const Key< double > collTerm_stringParam_unformedXsecSuppression
See user guide description for more information.
Definition: input_keys.h:3847
static const Key< std::array< double, 3 > > modi_sphere_jet_jetPosition
See user guide description for more information.
Definition: input_keys.h:5532
static const Key< ReactionsBitSet > collTerm_includedTwoToTwo
See user guide description for more information.
Definition: input_keys.h:2727
static const Key< double > modi_collider_target_saturationDensity
See user guide description for more information.
Definition: input_keys.h:4297
static const Key< PdgCode > modi_sphere_jet_jetPdg
See user guide description for more information.
Definition: input_keys.h:5500
static const Key< bool > modi_box_useThermalMultiplicities
See user guide description for more information.
Definition: input_keys.h:5786
static const Key< std::string > output_rivet_weights_nominal
See user guide description for more information.
Definition: input_keys.h:6964
static const Key< std::set< ThermodynamicQuantity > > output_thermodynamics_quantites
See user guide description for more information.
Definition: input_keys.h:7105
static const Key< bool > forcedThermalization_microcanonical
See user guide description for more information.
Definition: input_keys.h:7705
static const std::vector< key_references_variant > & all_keys()
Get list of references to all existing SMASH keys.
Definition: input_keys.cc:32
static const Key< einhard::LogLevel > log_inputParser
See user guide description for more information.
Definition: input_keys.h:2224
static const Key< std::string > modi_collider_projectile_custom_fileDirectory
See user guide description for more information.
Definition: input_keys.h:4407
static const Key< double > collTerm_pauliBlocking_momentumAveragingRadius
See user guide description for more information.
Definition: input_keys.h:3267
static const Key< double > modi_collider_eKin
See user guide description for more information.
Definition: input_keys.h:4029
static const Key< double > modi_collider_pLab
See user guide description for more information.
Definition: input_keys.h:4066
static const Key< bool > collTerm_noCollisions
See user guide description for more information.
Definition: input_keys.h:2918
static const Key< double > modi_box_baryonChemicalPotential
See user guide description for more information.
Definition: input_keys.h:5712
static const Key< bool > modi_collider_target_orientation_randRot
See user guide description for more information.
Definition: input_keys.h:4784
static const Key< bool > collTerm_stringParam_mDependentFormationTimes
See user guide description for more information.
Definition: input_keys.h:3504
static const Key< bool > modi_collider_initialConditions_delayInitialElastic
See user guide description for more information.
Definition: input_keys.h:5178
static const Key< FluidizationType > modi_collider_initialConditions_type
See user guide description for more information.
Definition: input_keys.h:4954
static const Key< double > modi_collider_sqrtSNN
See user guide description for more information.
Definition: input_keys.h:4083
static const Key< int > modi_collider_initialConditions_fluidCells
See user guide description for more information.
Definition: input_keys.h:5129
static const Key< DensityType > output_thermodynamics_type
See user guide description for more information.
Definition: input_keys.h:7167
static const Key< double > modi_collider_projectile_orientation_theta
See user guide description for more information.
Definition: input_keys.h:4725
static const Key< double > collTerm_stringParam_diquarkSuppression
See user guide description for more information.
Definition: input_keys.h:3419
static const Key< double > collTerm_crossSectionScaling
See user guide description for more information.
Definition: input_keys.h:2578
static const Key< einhard::LogLevel > log_pythia
See user guide description for more information.
Definition: input_keys.h:2320
static const Key< double > modi_sphere_jet_jetMomentum
See user guide description for more information.
Definition: input_keys.h:5515
static const Key< einhard::LogLevel > log_main
See user guide description for more information.
Definition: input_keys.h:1981
static const Key< double > modi_box_length
See user guide description for more information.
Definition: input_keys.h:5633
static const Key< int > collTerm_photons_fractionalPhotons
See user guide description for more information.
Definition: input_keys.h:4000
static const Key< std::array< double, 3 > > forcedThermalization_latticeSizes
See user guide description for more information.
Definition: input_keys.h:7671
static const Key< std::vector< double > > modi_collider_impact_values
See user guide description for more information.
Definition: input_keys.h:4904
static const Key< einhard::LogLevel > log_scatterAction
See user guide description for more information.
Definition: input_keys.h:2352
static const Key< double > modi_collider_impact_value
See user guide description for more information.
Definition: input_keys.h:4882
static const Key< einhard::LogLevel > & get_logging_key(std::string_view area)
Get the logging Key given a logging area.
Definition: input_keys.h:7773
static const Key< std::vector< double > > potentials_vdf_powers
See user guide description for more information.
Definition: input_keys.h:7471
static const Key< double > forcedThermalization_startTime
See user guide description for more information.
Definition: input_keys.h:7598
static const Key< double > modi_collider_target_radius
See user guide description for more information.
Definition: input_keys.h:4267
static const Key< einhard::LogLevel > log_initialConditions
See user guide description for more information.
Definition: input_keys.h:1949
static const Key< double > modi_collider_projectile_deformed_beta4
See user guide description for more information.
Definition: input_keys.h:4568
static const Key< bool > modi_sphere_accountResonanceWidths
See user guide description for more information.
Definition: input_keys.h:5296
static const Key< std::map< PdgCode, int > > modi_collider_target_particles
See user guide description for more information.
Definition: input_keys.h:4232
static const Key< double > collTerm_stringParam_formTimeFactor
See user guide description for more information.
Definition: input_keys.h:3438
static const Key< std::vector< std::string > > output_thermodynamics_format
See user guide description for more information.
Definition: input_keys.h:6387
static const Key< double > modi_collider_target_diffusiveness
See user guide description for more information.
Definition: input_keys.h:4197
static const Key< double > potentials_coulomb_rCut
See user guide description for more information.
Definition: input_keys.h:7505
static const Key< einhard::LogLevel > log_decayModes
See user guide description for more information.
Definition: input_keys.h:2112
static const Key< double > output_initialConditions_rapidityCut
This key has been removed in SMASH-3.3 version.
Definition: input_keys.h:6763
static const Key< CharmRescattering > collTerm_charmRescatteringMethod
See user guide description for more information.
Definition: input_keys.h:2509
static const Key< double > collTerm_stringParam_quarkAlpha
See user guide description for more information.
Definition: input_keys.h:3520
static const Key< bool > modi_box_accountResonanceWidths
See user guide description for more information.
Definition: input_keys.h:5694
static const Key< bool > modi_collider_impact_randomReactionPlane
See user guide description for more information.
Definition: input_keys.h:4817
static const Key< T > & get_key_reference(const KeyLabels &labels)
Get a key reference object given the key labels.
Definition: input_keys.h:7804
static const Key< std::vector< std::string > > modi_listBox_optionalQuantities
See user guide description for more information.
Definition: input_keys.h:6101
static const Key< einhard::LogLevel > log_grandcanThermalizer
See user guide description for more information.
Definition: input_keys.h:1933
static const Key< double > modi_collider_initialConditions_scaling
See user guide description for more information.
Definition: input_keys.h:5015
static const Key< bool > collTerm_decayInitial
See user guide description for more information.
Definition: input_keys.h:2676
static const Key< std::array< double, 2 > > modi_collider_impact_range
See user guide description for more information.
Definition: input_keys.h:4834
static const Key< std::string > version
This key has been removed in SMASH-3.2 version.
Definition: input_keys.h:2399
static const Key< int > gen_minNonEmptyEnsembles_number
See user guide description for more information.
Definition: input_keys.h:1427
static const Key< int64_t > gen_randomseed
See user guide description for more information.
Definition: input_keys.h:1398
static const Key< std::string > modi_list_fileDirectory
See user guide description for more information.
Definition: input_keys.h:5848
static const Key< double > modi_collider_initialConditions_maxTime
See user guide description for more information.
Definition: input_keys.h:5112
static const Key< double > collTerm_stringParam_stringZA
See user guide description for more information.
Definition: input_keys.h:3739
static const Key< einhard::LogLevel > log_action
See user guide description for more information.
Definition: input_keys.h:2064
static const Key< std::string > gen_modus
See user guide description for more information.
Definition: input_keys.h:1361
static const Key< double > gen_smearingTriangularRange
See user guide description for more information.
Definition: input_keys.h:1814
static const Key< double > modi_collider_initialConditions_minTime
See user guide description for more information.
Definition: input_keys.h:5095
static const Key< einhard::LogLevel > log_grid
See user guide description for more information.
Definition: input_keys.h:2192
static const Key< double > modi_sphere_startTime
See user guide description for more information.
Definition: input_keys.h:5257
static const Key< bool > output_rivet_ignoreBeams
See user guide description for more information.
Definition: input_keys.h:6823
static const Key< double > modi_sphere_heavyFlavorMultiplier
See user guide description for more information.
Definition: input_keys.h:5449
static const Key< bool > lattice_periodic
See user guide description for more information.
Definition: input_keys.h:7286
static const Key< double > collTerm_stringParam_strangeSuppression
See user guide description for more information.
Definition: input_keys.h:3682
static const Key< int > gen_minNonEmptyEnsembles_maximumEnsembles
See user guide description for more information.
Definition: input_keys.h:1413
static const Key< double > gen_expansionRate
See user guide description for more information.
Definition: input_keys.h:1563
static const Key< double > modi_box_equilibrationTime
See user guide description for more information.
Definition: input_keys.h:5750
static const Key< std::string > modi_listBox_filePrefix
See user guide description for more information.
Definition: input_keys.h:6053
static const Key< FluidizableProcessesBitSet > modi_collider_initialConditions_fluidProcesses
See user guide description for more information.
Definition: input_keys.h:5159
static const Key< einhard::LogLevel > log_yamlConfiguration
See user guide description for more information.
Definition: input_keys.h:1901
static const Key< SphereInitialCondition > modi_sphere_initialCondition
See user guide description for more information.
Definition: input_keys.h:5404
static const Key< double > potentials_skyrme_skyrmeB
See user guide description for more information.
Definition: input_keys.h:7389
static const Key< double > output_outputInterval
See user guide description for more information.
Definition: input_keys.h:6164
static const Key< bool > collTerm_onlyWarnForHighProbability
See user guide description for more information.
Definition: input_keys.h:2937
static const Key< double > collTerm_additionalElasticCrossSection
See user guide description for more information.
Definition: input_keys.h:2456
static const Key< std::map< PdgCode, int > > modi_collider_projectile_particles
See user guide description for more information.
Definition: input_keys.h:4219
static const Key< bool > collTerm_stringsWithProbability
See user guide description for more information.
Definition: input_keys.h:3067
static const Key< double > potentials_momentum_dependence_Lambda
See user guide description for more information.
Definition: input_keys.h:7536
static const Key< einhard::LogLevel > log_particleType
See user guide description for more information.
Definition: input_keys.h:2272
static const Key< double > collTerm_stringParam_stringSigmaT
See user guide description for more information.
Definition: input_keys.h:3701
static const Key< bool > output_thermodynamics_ignoreUnformed
See user guide description for more information.
Definition: input_keys.h:7058
static const Key< double > gen_smearingGaussianSigma
See user guide description for more information.
Definition: input_keys.h:1633
static const Key< bool > modi_collider_target_deformed_automatic
See user guide description for more information.
Definition: input_keys.h:4499
static const Key< bool > collTerm_dileptons_bremsstrahlung
See user guide description for more information.
Definition: input_keys.h:3925
static const Key< double > modi_collider_initialConditions_eDenThreshold
See user guide description for more information.
Definition: input_keys.h:5077
static const Key< double > modi_box_jet_jetMomentum
See user guide description for more information.
Definition: input_keys.h:5815
static const Key< double > modi_collider_target_eKin
See user guide description for more information.
Definition: input_keys.h:4327
static const Key< CalculationFrame > modi_collider_calculationFrame
See user guide description for more information.
Definition: input_keys.h:4109
static const Key< double > modi_sphere_radius
See user guide description for more information.
Definition: input_keys.h:5243
static const Key< std::vector< std::string > > modi_list_optionalQuantities
See user guide description for more information.
Definition: input_keys.h:5977
static const Key< double > potentials_skyrme_skyrmeA
See user guide description for more information.
Definition: input_keys.h:7375
static const Key< einhard::LogLevel > log_sphere
See user guide description for more information.
Definition: input_keys.h:2045
static const Key< std::string > modi_list_filename
See user guide description for more information.
Definition: input_keys.h:5868
static const Key< bool > collTerm_dileptons_decays
See user guide description for more information.
Definition: input_keys.h:3907
static const Key< std::vector< std::string > > output_initialConditions_quantities
See user guide description for more information.
Definition: input_keys.h:6690
static const Key< double > modi_collider_impact_max
See user guide description for more information.
Definition: input_keys.h:4800
static const Key< double > collTerm_stringParam_stringZB
See user guide description for more information.
Definition: input_keys.h:3778
static const Key< double > potentials_symmetry_gamma
See user guide description for more information.
Definition: input_keys.h:7422
static const Key< bool > collTerm_strings
See user guide description for more information.
Definition: input_keys.h:3034
static const Key< std::vector< std::string > > output_rivet_preloads
See user guide description for more information.
Definition: input_keys.h:6877
static const Key< DerivativesMode > gen_derivativesMode
See user guide description for more information.
Definition: input_keys.h:1486
static const Key< bool > modi_sphere_jet_backToBack
See user guide description for more information.
Definition: input_keys.h:5549
static const Key< std::vector< double > > modi_collider_impact_yields
See user guide description for more information.
Definition: input_keys.h:4928
static const Key< double > modi_collider_initialConditions_formTimeFraction
See user guide description for more information.
Definition: input_keys.h:5198
static const Key< ThermalizationAlgorithm > forcedThermalization_algorithm
See user guide description for more information.
Definition: input_keys.h:7647
static const Key< double > collTerm_stringParam_quarkBeta
See user guide description for more information.
Definition: input_keys.h:3536
static const Key< std::vector< std::string > > output_particles_format
See user guide description for more information.
Definition: input_keys.h:6233
static const Key< double > collTerm_pauliBlocking_gaussianCutoff
See user guide description for more information.
Definition: input_keys.h:3248
static const Key< double > output_rivet_weights_cap
See user guide description for more information.
Definition: input_keys.h:6898
static const Key< std::string > decaymodes
See user guide description for more information.
Definition: input_keys.h:1314
static const Key< std::vector< std::string > > output_photons_quantities
See user guide description for more information.
Definition: input_keys.h:6640
static const Key< bool > collTerm_forceDecaysAtEnd
See user guide description for more information.
Definition: input_keys.h:2659
static const Key< bool > output_particles_extended
See user guide description for more information.
Definition: input_keys.h:6430
static const Key< double > modi_collider_target_deformed_beta2
See user guide description for more information.
Definition: input_keys.h:4524
static const Key< double > forcedThermalization_timestep
See user guide description for more information.
Definition: input_keys.h:7621
static const Key< double > modi_collider_target_alphaClustered_sideLength
See user guide description for more information.
Definition: input_keys.h:4670
static const Key< double > gen_endTime
See user guide description for more information.
Definition: input_keys.h:1333
static const Key< double > modi_box_startTime
See user guide description for more information.
Definition: input_keys.h:5648
static const Key< bool > collTerm_photons_bremsstrahlung
See user guide description for more information.
Definition: input_keys.h:3983
static std::optional< key_references_variant > find_key(const KeyLabels &labels)
Find a Key in the database given its labels.
Definition: input_keys.cc:14
static const Key< PseudoResonance > collTerm_pseudoresonance
See user guide description for more information.
Definition: input_keys.h:2973
static const Key< double > gen_smearingGaussCutoffInSigma
See user guide description for more information.
Definition: input_keys.h:1613
static const Key< double > collTerm_stringParam_popcornRate
See user guide description for more information.
Definition: input_keys.h:3555
static const Key< int > gen_nevents
See user guide description for more information.
Definition: input_keys.h:1383
static const Key< einhard::LogLevel > log_resonances
See user guide description for more information.
Definition: input_keys.h:2336
static const Key< double > gen_smearingDiscreteWeight
See user guide description for more information.
Definition: input_keys.h:1504
static const Key< double > collTerm_elasticNNCutoffSqrts
See user guide description for more information.
Definition: input_keys.h:2621
static const Key< int > modi_listBox_shiftId
See user guide description for more information.
Definition: input_keys.h:6083
static const Key< ExpansionMode > gen_metricType
See user guide description for more information.
Definition: input_keys.h:1656
static const Key< int > gen_ensembles
See user guide description for more information.
Definition: input_keys.h:1539
static const Key< einhard::LogLevel > log_list
See user guide description for more information.
Definition: input_keys.h:1965
static const Key< std::array< double, 3 > > lattice_origin
See user guide description for more information.
Definition: input_keys.h:7266
static const Key< double > modi_collider_target_deformed_beta4
See user guide description for more information.
Definition: input_keys.h:4576
static const Key< einhard::LogLevel > log_nucleus
See user guide description for more information.
Definition: input_keys.h:2256
static const Key< bool > collTerm_isotropic
See user guide description for more information.
Definition: input_keys.h:2786
static const Key< double > collTerm_fixedMinCellLength
See user guide description for more information.
Definition: input_keys.h:2643
static const Key< einhard::LogLevel > log_pauliBlocking
See user guide description for more information.
Definition: input_keys.h:2288
static const Key< double > collTerm_stringParam_stringZBLeading
See user guide description for more information.
Definition: input_keys.h:3799
static const Key< double > collTerm_stringTrans_pipiOffset
See user guide description for more information.
Definition: input_keys.h:3317
static const Key< double > modi_collider_projectile_alphaClustered_sideLength
See user guide description for more information.
Definition: input_keys.h:4661
static const Key< double > potentials_skyrme_skyrmeTau
See user guide description for more information.
Definition: input_keys.h:7404
static const Key< MultiParticleReactionsBitSet > collTerm_multiParticleReactions
See user guide description for more information.
Definition: input_keys.h:2874
static const Key< double > modi_sphere_baryonChemicalPotential
See user guide description for more information.
Definition: input_keys.h:5358
static const Key< double > output_initialConditions_properTime
This key has been removed in SMASH-3.3 version.
Definition: input_keys.h:6731
static const Key< double > modi_collider_target_orientation_phi
See user guide description for more information.
Definition: input_keys.h:4708
static const Key< einhard::LogLevel > log_default
See user guide description for more information.
Definition: input_keys.h:1850
static const Key< double > collTerm_maximumCrossSection
See user guide description for more information.
Definition: input_keys.h:2817
static const Key< bool > collTerm_useAQM
See user guide description for more information.
Definition: input_keys.h:3169
static const Key< einhard::LogLevel > log_box
See user guide description for more information.
Definition: input_keys.h:1869
static const Key< einhard::LogLevel > log_experiment
See user guide description for more information.
Definition: input_keys.h:1917
static const Key< std::vector< std::string > > output_coulomb_format
See user guide description for more information.
Definition: input_keys.h:6366
static const Key< einhard::LogLevel > log_fpe
See user guide description for more information.
Definition: input_keys.h:2176
static const Key< std::array< double, 3 > > lattice_sizes
See user guide description for more information.
Definition: input_keys.h:7330
static const Key< std::vector< std::string > > output_initialConditions_format
See user guide description for more information.
Definition: input_keys.h:6324
static const Key< double > modi_collider_initialConditions_lowerBound
See user guide description for more information.
Definition: input_keys.h:4972
static const Key< TotalCrossSectionStrategy > collTerm_totXsStrategy
See user guide description for more information.
Definition: input_keys.h:3103
static const Key< double > modi_collider_eTot
See user guide description for more information.
Definition: input_keys.h:4047
static const Key< std::array< int, 3 > > lattice_cellNumber
See user guide description for more information.
Definition: input_keys.h:7235
static const Key< std::array< double, 3 > > output_thermodynamics_position
See user guide description for more information.
Definition: input_keys.h:7074
static const Key< double > collTerm_elasticCrossSection
See user guide description for more information.
Definition: input_keys.h:2597
static const Key< std::vector< std::string > > output_rivet_paths
See user guide description for more information.
Definition: input_keys.h:6859
static const Key< double > output_initialConditions_lowerBound
This key has been removed in SMASH-3.3 version.
Definition: input_keys.h:6715
static const Key< double > modi_collider_projectile_orientation_psi
See user guide description for more information.
Definition: input_keys.h:4748
static const Key< bool > output_collisions_extended
See user guide description for more information.
Definition: input_keys.h:6502
static const Key< OutputOnlyFinal > output_particles_onlyFinal
See user guide description for more information.
Definition: input_keys.h:6479
static const Key< std::vector< std::string > > output_dileptons_format
See user guide description for more information.
Definition: input_keys.h:6279
static const Key< std::vector< std::string > > output_rivet_format
See user guide description for more information.
Definition: input_keys.h:6346
static const Key< std::string > modi_collider_target_custom_fileName
See user guide description for more information.
Definition: input_keys.h:4447
static const Key< double > modi_collider_projectile_deformed_beta2
See user guide description for more information.
Definition: input_keys.h:4516
static const Key< std::string > modi_collider_projectile_custom_fileName
See user guide description for more information.
Definition: input_keys.h:4434
static const Key< einhard::LogLevel > log_findScatter
See user guide description for more information.
Definition: input_keys.h:2160
static const Key< double > collTerm_stringParam_stringTension
See user guide description for more information.
Definition: input_keys.h:3722
static const Key< double > modi_box_strangeChemicalPotential
See user guide description for more information.
Definition: input_keys.h:5768
static const Key< SpinInteractionType > collTerm_spinInteractions
See user guide description for more information.
Definition: input_keys.h:3017
static const Key< double > modi_box_chargeChemicalPotential
See user guide description for more information.
Definition: input_keys.h:5730
static const Key< std::vector< std::string > > output_particles_quantities
See user guide description for more information.
Definition: input_keys.h:6449
static const Key< double > modi_collider_projectile_deformed_gamma
See user guide description for more information.
Definition: input_keys.h:4593
static const Key< double > collTerm_pauliBlocking_spatialAveragingRadius
See user guide description for more information.
Definition: input_keys.h:3284
static const Key< PdgCode > modi_box_jet_jetPdg
See user guide description for more information.
Definition: input_keys.h:5831
static const Key< std::vector< std::string > > output_rivet_analyses
See user guide description for more information.
Definition: input_keys.h:6789
static const Key< bool > output_dileptons_extended
See user guide description for more information.
Definition: input_keys.h:6571
static const Key< CollisionCriterion > collTerm_collisionCriterion
See user guide description for more information.
Definition: input_keys.h:2560
static const Key< einhard::LogLevel > log_clock
See user guide description for more information.
Definition: input_keys.h:2080
static const Key< einhard::LogLevel > log_distributions
See user guide description for more information.
Definition: input_keys.h:2144
static const Key< double > potentials_symmetry_sPot
See user guide description for more information.
Definition: input_keys.h:7438
static const Key< int > modi_list_shiftId
See user guide description for more information.
Definition: input_keys.h:5908
static const Key< SmearingMode > gen_smearingMode
See user guide description for more information.
Definition: input_keys.h:1731
static const Key< HardStringTransitionMode > collTerm_hardStringTransition_mode
See user guide description for more information.
Definition: input_keys.h:3199
static const Key< bool > gen_useGrid
See user guide description for more information.
Definition: input_keys.h:1831
static const Key< einhard::LogLevel > log_output
See user guide description for more information.
Definition: input_keys.h:1997
static const Key< std::string > modi_list_filePrefix
See user guide description for more information.
Definition: input_keys.h:5889
static const Key< bool > output_thermodynamics_onlyParticipants
See user guide description for more information.
Definition: input_keys.h:7034
static const Key< std::array< double, 2 > > output_rivet_crossSection
See user guide description for more information.
Definition: input_keys.h:6805
static const Key< double > modi_collider_projectile_pLab
See user guide description for more information.
Definition: input_keys.h:4376
static const Key< std::vector< std::string > > output_rivet_weights_deselect
See user guide description for more information.
Definition: input_keys.h:6915
static const Key< FieldDerivativesMode > gen_fieldDerivativesMode
See user guide description for more information.
Definition: input_keys.h:1595
static const Key< einhard::LogLevel > log_density
See user guide description for more information.
Definition: input_keys.h:2128
static const Key< double > modi_collider_target_deformed_gamma
See user guide description for more information.
Definition: input_keys.h:4601
static const Key< einhard::LogLevel > log_propagation
See user guide description for more information.
Definition: input_keys.h:2304
static const Key< einhard::LogLevel > log_scatterActionMulti
See user guide description for more information.
Definition: input_keys.h:2369
static const Key< double > output_initialConditions_pTCut
This key has been removed in SMASH-3.3 version.
Definition: input_keys.h:6747
static const Key< bool > modi_collider_projectile_alphaClustered_automatic
See user guide description for more information.
Definition: input_keys.h:4636
static const Key< RestFrameDensityDerivativesMode > gen_restFrameDensityDerivativeMode
This key has been removed in SMASH-3.0 version.
Definition: input_keys.h:1671
static const Key< einhard::LogLevel > log_collider
See user guide description for more information.
Definition: input_keys.h:1885
static const Key< bool > collTerm_ignoreDecayWidthAtTheEnd
See user guide description for more information.
Definition: input_keys.h:2770
static const Key< double > modi_sphere_jet_backToBackSeparation
See user guide description for more information.
Definition: input_keys.h:5568
static const Key< std::string > modi_listBox_filename
See user guide description for more information.
Definition: input_keys.h:6032
static const Key< Sampling > modi_collider_impact_sample
See user guide description for more information.
Definition: input_keys.h:4866
static const Key< double > modi_collider_initialConditions_rapidityCut
See user guide description for more information.
Definition: input_keys.h:5057
static const Key< double > modi_collider_projectile_eTot
See user guide description for more information.
Definition: input_keys.h:4344
static const Key< bool > modi_sphere_useThermalMultiplicities
See user guide description for more information.
Definition: input_keys.h:5474
static const Key< double > collTerm_HF_AQMbSuppression
See user guide description for more information.
Definition: input_keys.h:2415
static const Key< bool > output_collisions_printStartEnd
See user guide description for more information.
Definition: input_keys.h:6549
static const Key< double > collTerm_stringTrans_KNOffset
See user guide description for more information.
Definition: input_keys.h:3299
static const std::set< std::string_view > & get_list_of_valid_quantity_labels() noexcept
Get the list of valid quantity labels object.
Definition: input_keys.h:1267
static const Key< bool > collTerm_includeDecaysAtTheEnd
This key has been removed in SMASH-3.2 version.
Definition: input_keys.h:2743
static const Key< NNbarTreatment > collTerm_nnbarTreatment
See user guide description for more information.
Definition: input_keys.h:2900
static const Key< einhard::LogLevel > log_tmn
See user guide description for more information.
Definition: input_keys.h:2385
static const Key< std::string > modi_collider_target_custom_fileDirectory
See user guide description for more information.
Definition: input_keys.h:4417
static const Key< std::pair< double, double > > collTerm_stringTrans_rangeNN
See user guide description for more information.
Definition: input_keys.h:3354
static const Key< bool > lattice_automatic
See user guide description for more information.
Definition: input_keys.h:7199
static const Key< double > gen_deltaTime
See user guide description for more information.
Definition: input_keys.h:1460
static const Key< std::vector< double > > output_outputTimes
See user guide description for more information.
Definition: input_keys.h:6192
static const Key< bool > output_thermodynamics_smearing
See user guide description for more information.
Definition: input_keys.h:7145
static const Key< BoxInitialCondition > modi_box_initialCondition
See user guide description for more information.
Definition: input_keys.h:5619
static const Key< double > potentials_vdf_satRhoB
See user guide description for more information.
Definition: input_keys.h:7489
static const Key< std::map< std::string, std::string > > output_rivet_logging
See user guide description for more information.
Definition: input_keys.h:6842
static const Key< std::vector< std::string > > & get_output_format_key(std::string_view content)
Get the output format key object.
Definition: input_keys.h:7783
static const Key< double > collTerm_stringParam_gluonBeta
See user guide description for more information.
Definition: input_keys.h:3469
static const Key< bool > lattice_potentialsAffectThreshold
See user guide description for more information.
Definition: input_keys.h:7303
static const Key< double > collTerm_HF_AQMcSuppression
See user guide description for more information.
Definition: input_keys.h:2434
static const Key< std::array< int, 3 > > forcedThermalization_cellNumber
See user guide description for more information.
Definition: input_keys.h:7557
static const Key< einhard::LogLevel > log_potentials
See user guide description for more information.
Definition: input_keys.h:2013
static const Key< double > modi_collider_target_orientation_psi
See user guide description for more information.
Definition: input_keys.h:4758
static const Key< double > output_rivet_weights_nloSmearing
See user guide description for more information.
Definition: input_keys.h:6932
static const Key< double > modi_collider_projectile_orientation_phi
See user guide description for more information.
Definition: input_keys.h:4698
static const Key< std::vector< std::string > > output_dileptons_quantities
See user guide description for more information.
Definition: input_keys.h:6590
static const Key< FermiMotion > modi_collider_fermiMotion
See user guide description for more information.
Definition: input_keys.h:4146
static const Key< bool > collTerm_stringParam_separateFragmentBaryon
See user guide description for more information.
Definition: input_keys.h:3639
static const Key< bool > output_photons_extended
See user guide description for more information.
Definition: input_keys.h:6621
static const Key< double > modi_collider_initialConditions_properTime
See user guide description for more information.
Definition: input_keys.h:4995
static const Key< std::vector< std::string > > output_collisions_quantities
See user guide description for more information.
Definition: input_keys.h:6522
static const Key< bool > collTerm_twoToOne
See user guide description for more information.
Definition: input_keys.h:3118
static const Key< bool > modi_collider_projectile_orientation_randRot
See user guide description for more information.
Definition: input_keys.h:4776
static const Key< std::map< PdgCode, int > > modi_box_initialMultiplicities
See user guide description for more information.
Definition: input_keys.h:5592
static const Key< double > modi_collider_initialConditions_pTCut
See user guide description for more information.
Definition: input_keys.h:5036
static const Key< DileptonBremsPionFormFactor > collTerm_dileptons_pion_form_factor
See user guide description for more information.
Definition: input_keys.h:3950
static const Key< double > modi_sphere_strangeChemicalPotential
See user guide description for more information.
Definition: input_keys.h:5422
static const Key< int > gen_testparticles
See user guide description for more information.
Definition: input_keys.h:1764
static const Key< double > collTerm_stringParam_dampPopcorn
See user guide description for more information.
Definition: input_keys.h:3582
static const Key< std::string > modi_listBox_fileDirectory
See user guide description for more information.
Definition: input_keys.h:6014
static const Key< TimeStepMode > gen_timeStepMode
See user guide description for more information.
Definition: input_keys.h:1798
static const Key< bool > modi_collider_target_alphaClustered_automatic
See user guide description for more information.
Definition: input_keys.h:4643
static const Key< std::vector< double > > potentials_vdf_coeffs
See user guide description for more information.
Definition: input_keys.h:7452
static const Key< double > modi_collider_target_deformed_beta3
See user guide description for more information.
Definition: input_keys.h:4550
A simple struct to represent input sections.
Definition: input_keys.h:64
constexpr Section(std::string_view name_in, const Section *parent_in=nullptr)
Construct a new section.
Definition: input_keys.h:76
const std::string_view name
The name of the section.
Definition: input_keys.h:68
const Section *const parent
A pointer to the parent section.
Definition: input_keys.h:66
KeyLabels materialize() const
Materialize the section into a list of labels.
Definition: input_keys.h:93