Package pyfeyn :: Module blobs
[hide private]
[frames] | no frames]

Source Code for Module pyfeyn.blobs

  1  """Various blob shapes to represent generic interactions.""" 
  2   
  3  from pyx import * 
  4  import math 
  5   
  6  from diagrams import FeynDiagram 
  7  from points import Point 
  8  from utils import Visible 
  9   
 10   
 11  ## Blob base class 
12 -class Blob(Point, Visible):
13 "Base class for all blob-like objects in Feynman diagrams"
14 - def __init__(self):
15 raise Exception("Blobs are an abstract base class: you can't make them!")
16
17 - def setStrokeStyle(self, strokestyle):
18 self.strokestyles = [strokestyle] 19 return self
20
21 - def clearStrokeStyles(self):
22 self.strokestyles = [] 23 return self
24
25 - def setFillStyle(self, fillstyle):
26 self.fillstyles = [fillstyle] 27 return self
28
29 - def clearFillStyles(self):
30 self.fillstyles = [] 31 return self
32
33 - def addTrafo(self, trafo):
34 self.trafos.append(trafo) 35 return self
36
37 - def clearTrafos(self):
38 self.trafos = [] 39 return self
40
41 - def setPoints(self, points):
42 if points: 43 self.points = points 44 for p in self.points: 45 p.blob = self 46 else: 47 self.points = []
48 49 50 51 52 ## Circle class (a kind of Blob)
53 -class Circle(Blob):
54 "A circular blob" 55 blobshape = "circle" 56
57 - def __init__(self, 58 x = None, y = None, 59 center = None, 60 radius = None, 61 fill = [color.rgb.white], 62 stroke = [color.rgb.black], 63 points = None):
64 if radius: 65 self.radius = float(radius) 66 else: 67 raise Exception("No (or zero) radius specified for blob.") 68 69 if x != None and y != None: 70 self.setXY(x, y) 71 elif center != None: 72 self.setXY(center.getX(), center.getY()) 73 else: 74 raise Exception("No center specified for blob.") 75 76 self.setPoints(points) 77 self.fillstyles = fill 78 self.strokestyles = stroke 79 self.trafos = [] 80 ## Add this to the current diagram automatically 81 FeynDiagram.currentDiagram.add(self)
82
83 - def getPath(self):
84 return path.circle(self.getX(), self.getY(), self.radius)
85
86 - def draw(self, canvas):
87 canvas.fill(self.getPath(), [color.rgb.white]) 88 canvas.fill(self.getPath(), self.fillstyles) 89 canvas.stroke(self.getPath(), self.strokestyles)
90 91 92 ## Ellipse class (a kind of Blob)
93 -class Ellipse(Blob):
94 "An elliptical blob" 95 blobshape = "ellipse" 96
97 - def __init__(self, 98 x = None, y = None, 99 center = None, 100 xradius = None, yradius = None, 101 fill = [color.rgb.white], 102 stroke = [color.rgb.black], 103 points = None):
104 105 if x != None and y != None: 106 self.setXY(x, y) 107 elif center != None: 108 self.setXY(center.getX(), center.getY()) 109 else: 110 raise Exception("No center specified for blob.") 111 112 if xradius: 113 self.setXRadius(xradius) 114 elif yradius: 115 self.setXRadius(yradius) 116 else: 117 raise Exception("No viable candidate for x-radius") 118 119 if yradius: 120 self.setYRadius(yradius) 121 elif xradius: 122 self.setYRadius(xradius) 123 else: 124 raise Exception("No viable candidate for y-radius") 125 126 self.setPoints(points) 127 self.fillstyles = fill 128 self.strokestyles = stroke 129 self.trafos = [] 130 131 ## Add this to the current diagram automatically 132 FeynDiagram.currentDiagram.add(self)
133 134
135 - def getXRadius(self):
136 return self.xrad
137 138
139 - def setXRadius(self, xrad):
140 self.xrad = float(xrad) 141 return self
142 143
144 - def getYRadius():
145 return self.yrad
146 147
148 - def setYRadius(self, yrad):
149 self.yrad = float(yrad) 150 return self
151 152
153 - def getXYRadius():
154 return self.getXRadius(), self.getYRadius()
155 156
157 - def setXYRadius(self, xrad, yrad):
158 self.setXRadius(xrad) 159 self.setYRadius(yrad) 160 return self
161 162
163 - def getPath(self):
164 ucircle = path.circle(self.xpos, self.ypos, 1.0) 165 mytrafo = trafo.scale(self.xrad, self.yrad, self.xpos, self.ypos) 166 epath = ucircle.transformed(mytrafo) 167 return epath
168 169
170 - def draw(self, canvas):
171 canvas.fill(self.getPath(), [color.rgb.white]) 172 canvas.fill(self.getPath(), self.fillstyles) 173 #canvas.stroke(self.getPath(), [color.rgb.white]) 174 canvas.stroke(self.getPath(), self.strokestyles)
175 176 177 ## A dictionary to map feynML blob shape choices to blob classes 178 NamedBlob = { 179 "circle" : Circle, 180 "ellipse" : Ellipse 181 } 182