diff --git a/notebooks/diagram_generation.ipynb b/notebooks/diagram_generation.ipynb index 99f7525..25d3e49 100644 --- a/notebooks/diagram_generation.ipynb +++ b/notebooks/diagram_generation.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -65,50 +65,72 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Dict{VirtualParticle, Vector{Tuple{VirtualParticle, VirtualParticle}}} with 254 entries:\n", + " positron: \t01000010 | 11 => [(photon: \t00000000 | 10, positron: \t01000010 | 01),…\n", + " positron: \t11010000 | 11 => [(photon: \t00000000 | 10, positron: \t11010000 | 01),…\n", + " electron: \t10100011 | 00 => [(photon: \t00000010 | 00, electron: \t10100001 | 00),…\n", + " positron: \t11000000 | 11 => [(photon: \t00000000 | 10, positron: \t11000000 | 01),…\n", + " positron: \t00010100 | 01 => [(photon: \t00000100 | 00, positron: \t00010000 | 01),…\n", + " positron: \t01001000 | 11 => [(photon: \t00000000 | 10, positron: \t01001000 | 01),…\n", + " positron: \t11000110 | 01 => [(photon: \t00000010 | 00, positron: \t11000100 | 01),…\n", + " electron: \t10001011 | 10 => [(photon: \t00000000 | 10, electron: \t10001011 | 00),…\n", + " positron: \t00100000 | 11 => [(photon: \t00000000 | 10, positron: \t00100000 | 01),…\n", + " positron: \t01010000 | 11 => [(photon: \t00000000 | 10, positron: \t01010000 | 01),…\n", + " electron: \t11101001 | 00 => [(photon: \t00001000 | 00, electron: \t11100001 | 00),…\n", + " electron: \t00100101 | 10 => [(photon: \t00000000 | 10, electron: \t00100101 | 00),…\n", + " electron: \t11000101 | 00 => [(photon: \t00000100 | 00, electron: \t11000001 | 00),…\n", + " electron: \t01101001 | 00 => [(photon: \t00001000 | 00, electron: \t01100001 | 00),…\n", + " positron: \t00101000 | 01 => [(photon: \t00001000 | 00, positron: \t00100000 | 01),…\n", + " positron: \t00011000 | 11 => [(photon: \t00000000 | 10, positron: \t00011000 | 01),…\n", + " positron: \t00011010 | 01 => [(photon: \t00000010 | 00, positron: \t00011000 | 01),…\n", + " electron: \t10000101 | 10 => [(photon: \t00000000 | 10, electron: \t10000101 | 00),…\n", + " electron: \t10000111 | 00 => [(photon: \t00000010 | 00, electron: \t10000101 | 00),…\n", + " ⋮ => ⋮" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "pseudo_particles = FeynmanDiagramGenerator._pseudo_virtual_particles(proc)\n", - "\n", - "pairs = Dict{VirtualParticle, Vector{Tuple{VirtualParticle, VirtualParticle}}}()\n", - "for p in all_particles\n", - " pairs[p] = particle_pairs(p, [all_particles..., pseudo_particles...])\n", - " #println(\"$p has $(length(pairs[p])) children: $(pairs[p])\")\n", - "end\n", - "\n", - "#pairs" + "pairs = FeynmanDiagramGenerator.particle_pairs(all_particles)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "280-element Vector{Tuple{VirtualParticle, VirtualParticle, VirtualParticle}}:\n", - " (photon: \t00000000 | 10, electron: \t11001101 | 00, positron: \t00110010 | 01)\n", - " (photon: \t00000000 | 10, electron: \t01101001 | 00, positron: \t10010110 | 01)\n", - " (photon: \t00000000 | 10, electron: \t01010101 | 00, positron: \t10101010 | 01)\n", - " (photon: \t00000000 | 10, electron: \t11000111 | 00, positron: \t00111000 | 01)\n", - " (photon: \t00000000 | 10, electron: \t11101001 | 00, positron: \t00010110 | 01)\n", - " (photon: \t00000000 | 10, electron: \t00101101 | 00, positron: \t11010010 | 01)\n", - " (photon: \t00000000 | 10, electron: \t11100101 | 00, positron: \t00011010 | 01)\n", - " (photon: \t00000000 | 10, electron: \t01010011 | 00, positron: \t10101100 | 01)\n", - " (photon: \t00000000 | 10, electron: \t00001111 | 00, positron: \t11110000 | 01)\n", " (photon: \t00000000 | 10, electron: \t01001011 | 00, positron: \t10110100 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00010111 | 00, positron: \t11101000 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00110011 | 00, positron: \t11001100 | 01)\n", + " (photon: \t00000000 | 10, electron: \t10111001 | 00, positron: \t01000110 | 01)\n", + " (photon: \t00000000 | 10, electron: \t10110101 | 00, positron: \t01001010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t11110001 | 00, positron: \t00001110 | 01)\n", + " (photon: \t00000000 | 10, electron: \t11010011 | 00, positron: \t00101100 | 01)\n", + " (photon: \t00000000 | 10, electron: \t01001101 | 00, positron: \t10110010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t11101001 | 00, positron: \t00010110 | 01)\n", + " (photon: \t00000000 | 10, electron: \t10011011 | 00, positron: \t01100100 | 01)\n", " ⋮\n", - " (photon: \t01000000 | 00, electron: \t10011011 | 00, positron: \t00100100 | 11)\n", - " (photon: \t01000000 | 00, electron: \t10110011 | 00, positron: \t00001100 | 11)\n", - " (photon: \t01000000 | 00, electron: \t00110101 | 00, positron: \t10001010 | 11)\n", - " (photon: \t01000000 | 00, electron: \t00011101 | 00, positron: \t10100010 | 11)\n", - " (photon: \t01000000 | 00, electron: \t10101101 | 00, positron: \t00010010 | 11)\n", - " (photon: \t01000000 | 00, electron: \t10001011 | 10, positron: \t00110100 | 01)\n", - " (photon: \t01000000 | 00, electron: \t00001011 | 10, positron: \t10110100 | 01)\n", - " (photon: \t01000000 | 00, electron: \t10001111 | 00, positron: \t00110000 | 11)\n", - " (photon: \t01000000 | 00, electron: \t10100011 | 10, positron: \t00011100 | 01)" + " (photon: \t01000000 | 00, electron: \t00111001 | 00, positron: \t10000110 | 11)\n", + " (photon: \t01000000 | 00, electron: \t00000111 | 10, positron: \t10111000 | 01)\n", + " (photon: \t01000000 | 00, electron: \t00011011 | 00, positron: \t10100100 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10101011 | 00, positron: \t00010100 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10000111 | 10, positron: \t00111000 | 01)\n", + " (photon: \t01000000 | 00, electron: \t10100101 | 10, positron: \t00011010 | 01)\n", + " (photon: \t01000000 | 00, electron: \t00100111 | 00, positron: \t10011000 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10001101 | 10, positron: \t00110010 | 01)\n", + " (photon: \t01000000 | 00, electron: \t10011101 | 00, positron: \t00100010 | 11)" ] }, "metadata": {}, @@ -121,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -174,7 +196,6 @@ " return s\n", "end\n", "\n", - "n(last(all_particles))\n", "s = 0\n", "for (ph, e, p) in triples\n", " s += n(ph) * n(e) * n(p)\n", diff --git a/src/diagrams/diagrams.jl b/src/diagrams/diagrams.jl index 22afa20..1a772af 100644 --- a/src/diagrams/diagrams.jl +++ b/src/diagrams/diagrams.jl @@ -303,26 +303,33 @@ function are_total(a::VirtualParticle, b::VirtualParticle, c::VirtualParticle) return true end -""" - pairs +function particle_pairs(particles::Vector) + pairs = Dict{VirtualParticle,Vector{Tuple{VirtualParticle,VirtualParticle}}}() -For a particle `vp` and a vector of `particles`, return a Vector of pairs of particles from the vector containing all pairs whose joint contributions are equal to the contributions of `vp`. -""" -function particle_pairs(vp::VirtualParticle, particles::Vector) - # momentum contributions are unique among particles, so each particle can only have at most one partner - result_pairs = Vector{Tuple{VirtualParticle,VirtualParticle}}() + proc = QEDbase.process(first(particles)) + # make sure the "smallest" particles come first, i.e. those with few contributors + all_particles = sort([_pseudo_virtual_particles(proc)..., particles...]) - # TODO: make this less awful - for i in eachindex(particles) - a = particles[i] - for b in particles[i+1:end] - if make_up(a, b, vp) - push!(result_pairs, (a, b)) + # find pairs for every particle after the external ones (those can't have pairs) + for p_i in number_incoming_particles(proc)+number_outgoing_particles(proc)+1:length(all_particles) + p = all_particles[p_i] + pairs[p] = Vector{Tuple{VirtualParticle,VirtualParticle}}() + + # only need to consider external particles and virtual particles that come before p_i + for p_a_i in 1:p_i-2 + # and only partners between a and p_i + for p_b_i in p_a_i+1:p_i-1 + p_a = all_particles[p_a_i] + p_b = all_particles[p_b_i] + + if make_up(p_a, p_b, p) + push!(pairs[p], (p_a, p_b)) + end end end end - return result_pairs + return pairs end function total_particle_triples(particles::Vector)