feyn.gle - a package for drawing Feynman diagrams A.Grozin It is often necessary to produce publication quality Feynman diagrams. I know at least 3 tools intended for this purpose. The LaTeX package FEYNMAN by M.J.S.Levine [1] constructs diagrams from characters available in LaTeX fonts. It is therefore not enough flexible: it permits a few slopes of lines, photon wavelengths and amplitudes, etc. It requires to write a rather lengthy source to produce a moderately complex diagram. The package Axodraw by J.A.M.Vermaseren [2] is much more flexible. It is intended for use in LaTeX documents which will be translated to PostScript by dvips, and directly generates PostScript source for diagrams. From my point of view, it still misses several useful features; and it hardly allows one to produce graphics formats other than PostScript. Finally, there is FEYNMAN application in the Instant TeX package on NeXT. It has a nice graphical user interface, though it is not always easy to select a desired element by mouse in a complicated diagram. In addition to this, it is platform-specific. Due to these reasons, I have written a package of procedures for drawing Feynman diagrams in the gle programming language. This language is sufficiently convenient for programming, though it misses several important features (the absence of local variables and the limitation on a number of global variables are two most striking examples). A gle source for a diagram can be used to produce graphic files in various formats, either directly or with straightforward conversions. Preview is nearly instant, so that it is easy to tune parameters of a diagram by trial and error. It is also easy to include various geometric calculations with square roots, arctangents, etc. to a gle program (this is difficult in TeX packages and impossible in the NeXT graphics environment). To use the package in your gle program, write the line include feyn.gle near the beginning. The package uses many variables beginning from F for internal purposes. To avoid conflicts, don't use variables beginning from this letter in your program. Please ignore error messages "Wrong end" which may be produced occasionally. They are due to a bug in gle, and don't influence a resulting diagram. To draw a fermion (solid) line from (x1,y1) to (x2,y2), use amove x1 y1 @Fermion x2 y2 After that, the pen is left at (x2,y2), so that @Fermion x3 y3 will draw line from (x2,y2) to (x3,y3). The line width can be controlled by set lwidth. amove x1 y1 @Fermion2 x2 y2 x3 y3 draws an arc from (x1,y1) via (x2,y2) to (x3,y3). For such an arc to be uniquely defined, all three points must be different from each other. In order to draw a complete circle, you should call Fermion2 twice. Procedures for other kinds of lines are similar to the ones considered above: they can draw a straight line from the current point to a given point (x,y), or an arc from the current point via (x2,y2) to (x3,y3). They leave the pen at the end point of the line. The call @Double x y draws a double line from the current point to (x,y). The half-distance between lines is determined by the variable DoubleA. The call @Dash x y draws a dashed line to (x,y). The period of the dashed line is DashL, and its fraction DashF is filled. For example, if you want dashes to be twice as long as empty spaces between then, you should set DashF = 2/3. A photon line is drawn by @Photon x y Its half-wavelength is PhotonL, and amplitude - PhotonA. If you want the waves to be in the opposite side, just change the sign of PhotonA. Sometimes you may want both the first half-wave and the last one to be, say, to the left, while the line produced by Photon has an even number of half-waves. In such a case, you can add an extra half-wave by setting PhotonN = +1, or eliminate one half-wave by setting PhotonN = -1. This variable is reset back to 0 after each call. The call @Zigzag x y produces a zigzag line, often used for a vector boson. This procedure is controlled by the same parameters PhotonL, PhotonA, PhotonN. A gluon line is drawn by @Gluon x y Its wavelength is twice PhotonL, and its amplitude is PhotonA (a gluon line always contains an integer number of periods, and PhotonN is not used). The shape of a gluon line is controlled by the winding coefficient GluonW. Wiggles become narrower when you decrease GluonW from its default value 1, and degenerate to edges at 1/pi; at GluonW = 0, a gluon line looks like a photon one. When you increase GluonW, wiggles become wider, and touch each other at GluonW = 1.46529 (this is 1/(pi*sin(x)), where x is the root of x+cot(x)=3*pi/2); beyond this value they overlap. You may often wish to change the sign of PhotonA so that wiggles will be to the opposite side. For example, gluon loops usually look better when wiggles are inside; if an arc curves to the left, this would require a negative PhotonA. You can put an arrow at the middle of the last drawn line of any kind by the call @Arrow 0.5 Similarly, the calls @Arrow 1/3 @Arrow 2/3 will produce two arrows, at 1/2 and 2/3 of the line length from the beginning. The position of an arrow is that of its tip. The length of arrow wings is ArrowL; if it's negative, the arrow will point in a direction opposite to that of the line. Half-width of arrow is ArrowA. The arrow can be displaced in the transverse direction by setting ArrowD non-zero, but this is rarely needed. After drawing an arrow, the pen will be positioned again at the end of the line, so that you can draw another line from this point. A separate arrow near the middle of the last drawn line may be drawn by @Mom 0.5 It is often used for indication of the momentum flowing through the line. The arrow is at the transverse distance MomD from the line, and has half-length MomL. ArrowL and ArrowA are used as parameters of the arrow wings. You will often need to change the sign of MomD to draw an arrow to the other side from the line. In order to get an arrow pointing in the opposite direction, you need to change signs of both MomL and ArrowL. A similar call @DMom 0.5 produces a double arrow (with half-distance between lines DoubleA). Such arrows can be used, e.g., to indicate spin projections. Probably, a better way to understand how to use feyn.gle is to look at the file ftest.gle containing some examples. Send comments and bug reports to A.Grozin@open.ac.uk References [1] M.J.S.Levine, Comp. Phys. Comm. 58 (1990) 181. [2] J.A.M.Vermaseren. Comp. Phys. Comm. 83 (1994) 45. Appendix All procedures and variables exported by the package are described below. Following the wise saying "Don't throw away debugging tools from your program after debugging is complete, because it is not complete" I retained a primitive debugging procedure; you can use it if something goes wrong. ================================ Fermion ================================= @Fermion x y draws fermion line from the current point to x,y @Fermion2 x1 y1 x2 y2 draws fermion line along the arc from the current point via x1,y1 to x2,y2 ========================================================================== ================================ Double ================================== @Double x y draws double line from the current point to x,y @Double2 x1 y1 x2 y2 draws double line along the arc from the current point via x1,y1 to x2,y2 DoubleA (default 0.05) half-distance between lines ========================================================================== ================================ Dashed ================================== @Dash x y draws dashed line from the current point to x,y @Dash2 x1 y1 x2 y2 draws dashed line along the arc from the current point via x1,y1 to x2,y2 DashL (default 0.3) period of the dashed line DashF (default 0.5) fraction of the period that is filled ========================================================================== ================================ Photon ================================== @Photon x y draws photon line from the current point to x,y @Photon2 x1 y1 x2 y2 draws photon line along the arc from the current point via x1,y1 to x2,y2 PhotonL (default 0.1) half-period of the photon line PhotonA (default 0.1) amplitude of the photon line. When positive, the first half-wave is to the left, when negative - to the right. PhotonN (default 0) change of the number of half-periods as calculated from PhotonL. Set to 0 after each call. ========================================================================== ================================ Zigzag ================================== @Zigzag x y draws zigzag line from the current point to x,y @Zigzag2 x1 y1 x2 y2 draws zigzag line along the arc from the current point via x1,y1 to x2,y2 PhotonL, PhotonA, and PhotonN are used ========================================================================== ================================ Gluon =================================== @Gluon x y draws gluon line from the current point to x,y @Gluon2 x1 y1 x2 y2 draws gluon line along the arc from the current point via x1,y1 to x2,y2 PhotonL and PhotonA are used GluonW (default 1) winding coefficient. Wiggles are wider when it is increased and narrower when it is decreased ========================================================================== ================================ Arrow =================================== @Arrow f draws arrow on the last line of any sort, at the fraction of length f from the beginning ArrowL (default 0.5) length of the arrow wings. When negative, arrow points backwards ArrowA (default 0.2) half-width of the arrow ArrowD (default 0, rarely needed) transverse displacement of the arrow from the line. When positive - to the left, when negative - to the right ========================================================================== ================================ Momentum ================================ @Mom f draws an arrow for indication of momentum near the last line, at the fraction of length f from the beginning ArrowL and ArrowA are used MomL (default 0.75) half-length of the arrow MomD (default 0.5) transverse displacement of the arrow from the line. When positive - to the left, when negative - to the right ========================================================================== ========================= Double momentum arrow ========================== @DMom f draws a double arrow near the last line, at the fraction of length f from the beginning DoubleA, MomL, MomD, ArrowL, and ArrowA are used ========================================================================== ================================ Debugging =============================== @fdebug l "name" variable primitive debugging tool. If Debug>=l then writes the name and the value of the variable at DebugX,DebugY and increments DebugY by DebugD. If @fdebug is used inside begin {translate|rotate|scale} ... end, its output will be {translated|rotated|scaled}, and may be outside the screen. Debug (default 0) level of debugging output DebugX (default 1) DebugY (default 1) initial coordinates for debugging output DebugD (default 1) y increment for debugging output. If positive, later output is higher ==========================================================================