FeynmanDiagrams.jl/src/generic_process_def.jl

42 lines
2.0 KiB
Julia
Raw Normal View History

2024-06-19 16:47:29 +02:00
_assert_particle_type_tuple(::Tuple{}) = nothing
_assert_particle_type_tuple(t::Tuple{AbstractParticleType,Vararg}) = _assert_particle_type_tuple(t[2:end])
_assert_particle_type_tuple(t::Any) = throw(InvalidInputError("invalid input, provide a tuple of AbstractParticleTypes to construct a GenericQEDProcess"))
struct GenericQEDProcess{INT,OUTT} <: QEDbase.AbstractProcessDefinition where {INT<:Tuple,OUTT<:Tuple}
2024-06-19 16:47:29 +02:00
incoming_particles::INT
outgoing_particles::OUTT
function GenericQEDProcess(in_particles::INT, out_particles::OUTT) where {INT<:Tuple,OUTT<:Tuple}
_assert_particle_type_tuple(in_particles)
_assert_particle_type_tuple(out_particles)
return new{INT,OUTT}(in_particles, out_particles)
end
"""
GenericQEDProcess(in_ph::Int, out_ph::Int, in_el::Int, out_el::Int, in_po::Int, out_po::Int)
Convenience constructor from numbers of input/output photons, electrons and positrons.
"""
function GenericQEDProcess(in_ph::Int, out_ph::Int, in_el::Int, out_el::Int, in_po::Int, out_po::Int)
in_p = ntuple(i -> i <= in_ph ? Photon() : i <= in_ph + in_el ? Electron() : Positron(), in_ph + in_el + in_po)
out_p = ntuple(i -> i <= out_ph ? Photon() : i <= out_ph + out_el ? Electron() : Positron(), out_ph + out_el + out_po)
return GenericQEDProcess(in_p, out_p)
end
2024-06-19 16:47:29 +02:00
end
2024-07-09 18:33:37 +02:00
QEDprocesses.incoming_particles(proc::GenericQEDProcess{INT,OUTT}) where {INT,OUTT} = proc.incoming_particles
QEDprocesses.outgoing_particles(proc::GenericQEDProcess{INT,OUTT}) where {INT,OUTT} = proc.outgoing_particles
2024-06-19 16:47:29 +02:00
function isphysical(proc::GenericQEDProcess)
return (number_particles(proc, Incoming(), Electron()) + number_particles(proc, Outgoing(), Positron()) ==
number_particles(proc, Incoming(), Positron()) + number_particles(proc, Outgoing(), Electron())) &&
number_particles(proc, Incoming()) + number_particles(proc, Outgoing()) >= 2
end
function matrix_element(proc::GenericQEDProcess, psp::PhaseSpacePoint)
return nothing
end