Add convenient constructor for GeneriicQEDProcess and improve type stability
This commit is contained in:
parent
2b7c02c223
commit
ddd3cc7053
@ -65,17 +65,16 @@ struct FeynmanDiagram{N,E,U,T,M,FM} <: AbstractTreeLevelFeynmanDiagram where {N,
|
|||||||
@assert T == length(tauon_perm)
|
@assert T == length(tauon_perm)
|
||||||
N = E + U + T
|
N = E + U + T
|
||||||
|
|
||||||
fm = FlatMatrix(structure)
|
return new{N,E,U,T,M,FlatMatrix{Int64,2 * N - 2 + M,N}}(FlatMatrix(structure), NTuple{E,Int}(elec_perm), NTuple{U,Int}(muon_perm), NTuple{T,Int}(tauon_perm))
|
||||||
return new{N,E,U,T,M,typeof(fm)}(fm, NTuple{E,Int}(elec_perm), NTuple{U,Int}(muon_perm), NTuple{T,Int}(tauon_perm))
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function virtual_particles(diagram::FeynmanDiagram{N,E,U,T,M,FM})
|
function virtual_particles(diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM}
|
||||||
|
|
||||||
return NTuple{N,Tuple{QEDbase.AbstractParticleType,BitArray,BitArray}}()
|
return NTuple{N,Tuple{QEDbase.AbstractParticleType,BitArray,BitArray}}()
|
||||||
end
|
end
|
||||||
|
|
||||||
function vertices(::AbstractTreeLevelFeynmanDiagram)
|
function vertices(diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM}
|
||||||
|
|
||||||
return NTuple{N,VertexType}()
|
return NTuple{N,VertexType}()
|
||||||
end
|
end
|
||||||
@ -174,7 +173,8 @@ function Base.length(it::FeynmanDiagramIterator{E,U,T,M}) where {E,U,T,M}
|
|||||||
return factorial(M + 3 * N - 3, 2 * N - 1) * factorial(E) * factorial(U) * factorial(T)
|
return factorial(M + 3 * N - 3, 2 * N - 1) * factorial(E) * factorial(U) * factorial(T)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Base.iterate(iter::FeynmanDiagramIterator)
|
function Base.iterate(iter::FeynmanDiagramIterator{E,U,T,M}) where {E,U,T,M}
|
||||||
|
N = E + U + T
|
||||||
f = FeynmanDiagram(iter.photon_structure, iter.e_perms[iter.e_index], iter.u_perms[iter.u_index], iter.t_perms[iter.t_index], iter.e, iter.u, iter.t, iter.m)
|
f = FeynmanDiagram(iter.photon_structure, iter.e_perms[iter.e_index], iter.u_perms[iter.u_index], iter.t_perms[iter.t_index], iter.e, iter.u, iter.t, iter.m)
|
||||||
return (
|
return (
|
||||||
f,
|
f,
|
||||||
@ -182,7 +182,7 @@ function Base.iterate(iter::FeynmanDiagramIterator)
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Base.iterate(iter::FeynmanDiagramIterator, ::Nothing)
|
function Base.iterate(iter::FeynmanDiagramIterator{E,U,T,M}, ::Nothing) where {E,U,T,M}
|
||||||
iter.t_index += 1
|
iter.t_index += 1
|
||||||
|
|
||||||
if iter.t_index > length(iter.t_perms)
|
if iter.t_index > length(iter.t_perms)
|
||||||
@ -204,6 +204,7 @@ function Base.iterate(iter::FeynmanDiagramIterator, ::Nothing)
|
|||||||
(iter.photon_structure, _) = photon_iter_result
|
(iter.photon_structure, _) = photon_iter_result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
N = E + U + T
|
||||||
f = FeynmanDiagram(iter.photon_structure, iter.e_perms[iter.e_index], iter.u_perms[iter.u_index], iter.t_perms[iter.t_index], iter.e, iter.u, iter.t, iter.m)
|
f = FeynmanDiagram(iter.photon_structure, iter.e_perms[iter.e_index], iter.u_perms[iter.u_index], iter.t_perms[iter.t_index], iter.e, iter.u, iter.t, iter.m)
|
||||||
return (
|
return (
|
||||||
f,
|
f,
|
||||||
|
@ -16,6 +16,17 @@ struct GenericQEDProcess{INT,OUTT} <: AbstractProcessDefinition where {INT<:Tupl
|
|||||||
|
|
||||||
return new{INT,OUTT}(in_particles, out_particles)
|
return new{INT,OUTT}(in_particles, out_particles)
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
QEDprocesses.incoming_particles(proc::GenericQEDProcess) = proc.incoming_particles
|
QEDprocesses.incoming_particles(proc::GenericQEDProcess) = proc.incoming_particles
|
||||||
|
Loading…
x
Reference in New Issue
Block a user