diff --git a/src/QEDbase.jl b/src/QEDbase.jl index c247838..33e1503 100644 --- a/src/QEDbase.jl +++ b/src/QEDbase.jl @@ -62,6 +62,7 @@ export AbstractDefinitePolarization, AbstractIndefinitePolarization export PolarizationX, PolX, PolarizationY, PolY, AllPolarization, AllPol export AbstractDefiniteSpin, AbstractIndefiniteSpin export SpinUp, SpinDown, AllSpin +export multiplicity using StaticArrays using LinearAlgebra diff --git a/src/particles/particle_spin_pol.jl b/src/particles/particle_spin_pol.jl index 27e8973..c08a060 100644 --- a/src/particles/particle_spin_pol.jl +++ b/src/particles/particle_spin_pol.jl @@ -177,3 +177,15 @@ y-polarized struct PolarizationY <: AbstractDefinitePolarization end const PolY = PolarizationY Base.show(io::IO, ::MIME"text/plain", ::PolY) = print(io, "y-polarized") + +""" + multiplicity(spin_or_pol) + +Return the number of spins or polarizations respresented by `spin_or_pol`, e.g. `multiplicity(SpinUp()) == 1`, but `multiplicity(AllSpin()) = 2`. + +""" +function multiplicity end +multiplicity(::AbstractDefinitePolarization) = 1 +multiplicity(::AbstractDefiniteSpin) = 1 +multiplicity(::AbstractIndefinitePolarization) = 2 +multiplicity(::AbstractIndefiniteSpin) = 2 diff --git a/test/particles.jl b/test/particles.jl index 17a1559..6129c1b 100644 --- a/test/particles.jl +++ b/test/particles.jl @@ -52,6 +52,19 @@ test_broadcast(x::AbstractSpinOrPolarization) = x end end +@testset "multiplicity of spins or pols" begin + @testset "single" begin + @testset "$spin_or_pol" for spin_or_pol in (SpinUp(), SpinDown(), PolX(), PolY()) + @test multiplicity(spin_or_pol) == 1 + end + end + @testset "multiple" begin + @testset "$spin_or_pol" for spin_or_pol in (AllSpin(), AllPol()) + @test multiplicity(spin_or_pol) == 2 + end + end +end + @testset "fermion likes" begin @testset "fermion" begin struct TestFermion <: Fermion end