CORSIKA  @c8_version@
The framework to simulate particle cascades for astroparticle physics
Physics Processes and Modules

Physics processes in CORSIKA 8 are clustered in ProcessSequence and SwitchProcessSequence containers. More...

Classes

struct  corsika::BaseProcess< TDerived >
 Each process in C8 must derive from BaseProcess. More...
 
class  corsika::BoundaryCrossingProcess< TDerived >
 Processes acting on the particles traversion from one volume into another volume. More...
 
class  corsika::CascadeEquationsProcess< TDerived >
 Processes executing cascade-equations calculations. More...
 
class  corsika::ContinuousProcess< TDerived >
 Processes with continuous effects along a particle Trajectory. More...
 
class  corsika::ContinuousProcessIndex
 To index individual processes (continuous processes) inside a ProcessSequence. More...
 
class  corsika::ContinuousProcessStepLength
 To store step length in LengthType and unique index in ProcessSequence of shortest step ContinuousProcess. More...
 
struct  corsika::DecayProcess< TDerived >
 Process decribing the decay of particles. More...
 
class  corsika::InteractionCounter< TCountedProcess >
 Wrapper around an InteractionProcess that fills histograms of the number of calls to doInteraction() binned in projectile energy (both in lab and center-of-mass frame) and species. More...
 
class  corsika::InteractionHistogram
 Class that creates and stores histograms of collisions \(dN/dE_{lab}\), \(dN/d\sqrt{s}\) which is used by class InteractionCounter. More...
 
class  corsika::InteractionLengthModifier< TUnderlyingProcess >
 
class  corsika::InteractionProcess< TModel >
 Process describing the interaction of particles. More...
 
class  corsika::NullModel
 Process that does nothing. More...
 
class  corsika::SecondariesProcess< TDerived >
 Processes acting on the secondaries produced by other processes. More...
 
class  corsika::StackProcess< TDerived >
 Process to act on the entire particle stack. More...
 
class  corsika::SwitchProcessSequence< TCondition, TSequence, USequence, IndexFirstProcess, IndexOfProcess1, IndexOfProcess2 >
 Class to switch between two process branches. More...
 
class  corsika::ProcessSequence< TProcess1, TProcess2, ProcessIndexOffset, IndexOfProcess1, IndexOfProcess2 >
 Definition of a static process list/sequence. More...
 

Detailed Description

Physics processes in CORSIKA 8 are clustered in ProcessSequence and SwitchProcessSequence containers.

The former is a mere (ordered) collection, while the latter has the option to switch between two alternative ProcessSequences.

Depending on the type of data to act on and on the allowed actions of processes there are several interface options:

And all processes (including ProcessSequence and SwitchProcessSequence) are derived from BaseProcess.

Processes of any type (e.g. p1, p2, p3,...) can be assembled into a ProcessSequence using the make_sequence factory function.

auto sequence1 = make_sequence(p1, p2, p3);
auto sequence2 = make_sequence(p4, p5, p6, p7);
auto sequence3 = make_sequence(sequence1, sequemce2, p8, p9);

Note, if the order of processes matters, the order of occurence in the ProcessSequence determines the executiion order.

SecondariesProcess alyways act on new secondaries produced (i.e. in InteractionProcess and DecayProcess) in the scope of their ProcessSequence. For example if i1 and i2 are InteractionProcesses and s1 is a SecondariesProcess, then:

auto sequence = make_sequence(i1, make_sequence(i2, s1))

will result in s1 acting only on the particles produced by i2 and not by i1. This can be very useful, e.g. to fine tune thinning.

A special type of ProcessSequence is SwitchProcessSequence, which has two branches and a functor that can select between these two branches.

auto sequence = make_switch(sequence1, sequence2, selector);

where the only requirement to selector is that it provides a SwitchResult operator()(Particle const& particle) const method. Thus, based on the dynamic properties of particle the functor can make its decision. This is clearly important for switching between low-energy and high-energy models, but not limited to this. The selection can even be done with a lambda function.