As you can read in the feynmf
documentation, the lines of a diagram are like rubber bands, they stretch as you attach them to other bands (they even have a tension parameter defined). However, the command \fmffreeze
literally freeze the previous draw.
So, I'd draw the loop
\begin{fmffile}{diagram}
\begin{fmfgraph}(40,40)
%%% Draw the loop
\fmfleft{i1,i2}
\fmfright{o1,o2}
\fmf{phantom}{o1,v1}
\fmf{phantom}{v2,o2}
\fmf{phantom}{i2,v3}
\fmf{phantom}{i1,v4}
\fmf{fermion}{v1,v2,v3,v4,v1}
\fmffreeze
\end{fmfgraph}
\end{fmffile}
And them draw the legs
\begin{fmffile}{diagram}
\begin{fmfgraph}(40,40)
%%% Draw the loop
\fmfleft{i1,i2}
\fmfright{o1,o2}
\fmf{phantom}{o1,v1}
\fmf{phantom}{v2,o2}
\fmf{phantom}{i2,v3}
\fmf{phantom}{i1,v4}
\fmf{fermion}{v1,v2,v3,v4,v1}
\fmffreeze
%%% Draw the photons
\fmf{photon}{o1,v1}
\fmf{photon}{v2,o2}
\fmf{photon}{i2,v3}
\fmf{photon}{i1,v4}
\end{fmfgraph}
\end{fmffile}
However, if you have an extra decay, one of the final photons must end into an internal vertex (say v5
), and you'd need an extra final vertex (say o3
)
\begin{fmffile}{diagram}
\begin{fmfgraph}(40,40)
%%% Draw the loop
\fmfleft{i1,i2}
\fmfright{o1,o2,o3}
\fmf{phantom}{o1,v1}
\fmf{phantom}{v2,o3}
\fmf{phantom}{i2,v3}
\fmf{phantom}{i1,v4}
\fmf{fermion}{v1,v2,v3,v4,v1}
\fmffreeze
%%% Draw the photons
\fmf{photon}{o1,v1}
\fmf{photon}{v2,v5}
\fmf{phantom}{v5,o3}
\fmf{photon}{i2,v3}
\fmf{photon}{i1,v4}
\fmffreeze
%%% The extra decay
\fmf{dbl_wiggly}{v5,o2}
\fmf{photon}{v5,o3}
\end{fmfgraph}
\end{fmffile}
I obtained this

Cheers
\fmffreeze
after drawing the loop. Then draw the legs!\documentclass{...}
and ending with\end{document}
. It is especially frustrating when users mention the code they already have but don't bother to share it. That means would-be helpers have to redo everything you've already done before they can begin to help you.