diff --git a/pykat/components.py b/pykat/components.py index 2cbc48edc8ab9ae7a96f9b8b2c0364eaec75859e..4ad2983cdcb869913a62d07594269a26146f271a 100644 --- a/pykat/components.py +++ b/pykat/components.py @@ -341,14 +341,13 @@ class beamSplitter(AbstractMirrorComponent): class space(Component): def __init__(self, name, node1, node2, L=0, n=1): - Component.__init__(self,name,) + Component.__init__(self, name) self._requested_node_names.append(node1) self._requested_node_names.append(node2) self.__L = SIfloat(L) self.__n = SIfloat(n) - self._QItem = None @property def L(self): return Param('L', self.__L) @@ -385,7 +384,120 @@ class space(Component): if self._QItem == None: self._QItem = pykat.gui.graphics.SpaceQGraphicsItem(self) - return self._QItem + return self._QItem + +class grating(Component): + def __init__(self, name, node1, node2, node3 = None, node4 = None, n = 2, d = 0, eta_0 = 0, eta_1 = 0, eta_2 = 0, eta_3 = 0, rho_0 = 0, alpha = 0): # TODO: implement Rcx, Rcy and Rc + Component.__init__(self, name) + + self._requested_node_names.append(node1) + self._requested_node_names.append(node2) + + if n > 2: + if node3 != None: + self._requested_node_names.append(node3) + else: + raise exceptions.RuntimeError("Grating node 3 not specified") + + if n > 3: + if node4 != None: + self._requested_node_names.append(node4) + else: + raise exceptions.RuntimeError("Grating node 4 not specified") + + if n > 4 or n < 2: + raise exceptions.RuntimeError("Grating must have between 2 and 4 ports") + + self.__n = n + self.__d = SIfloat(d) + self.__eta_0 = SIfloat(eta_0) + self.__eta_1 = SIfloat(eta_1) + self.__eta_2 = SIfloat(eta_2) + self.__eta_3 = SIfloat(eta_3) + self.__rho_0 = SIfloat(rho_0) + self.__alpha = SIfloat(alpha) + + @property + def n(self): return Param('n', self.__n) + @n.setter + def n(self, value): + if value < 2 or value > 4: + raise exceptions.RuntimeError("Grating must have between 2 and 4 ports") + else: + self.__n = value + + @property + def d(self): return Param('d', self.__d) + @d.setter + def d(self, value): self.__d = SIfloat(value) + + @property + def eta_0(self): return Param('eta_0', self.__eta_0) + @eta_0.setter + def eta_0(self, value): self.__eta_0 = SIfloat(value) + + @property + def eta_1(self): return Param('eta_1', self.__eta_1) + @eta_1.setter + def eta_1(self, value): self.__eta_1 = SIfloat(value) + + @property + def eta_2(self): return Param('eta_2', self.__eta_2) + @eta_2.setter + def eta_2(self, value): self.__eta_2 = SIfloat(value) + + @property + def eta_3(self): return Param('eta_3', self.__eta_3) + @eta_3.setter + def eta_3(self, value): self.__eta_3 = SIfloat(value) + + @property + def rho_0(self): return Param('rho_0', self.__rho_0) + @rho_0.setter + def rho_0(self, value): self.__rho_0 = SIfloat(value) + + @property + def alpha(self): return Param('alpha', self.__alpha) + @alpha.setter + def alpha(self, value): self.__alpha = SIfloat(value) + + @staticmethod + def parseFinesseText(text): + values = text.split(" ") + + if values[0][0 : 2] != "gr": + raise exceptions.RuntimeError("'{0}' not a valid Finesse grating command".format(text)) + + if len(values[0]) > 2: + if int(values[0][2]) > 4 or int(values[0][2]) < 2: + raise exceptions.RuntimeError("Grating must have between 2 and 4 ports") + else: + n = int(values[0][2]) + else: + n = 2 + + values.pop(0) # remove initial value + + if n == 2: + return grating(values[0], values[2], values[3], None, None, n, values[1]) + elif n == 3: + return grating(values[0], values[2], values[3], values[4], None, n, values[1]) + else: + return grating(values[0], values[2], values[3], values[4], values[5], n, values[1]) + + def getFinesseText(self): + if self.__n == 2: + return 'gr{0} {1} {2} {3} {4}'.format(self.__n, self.name, self.__d, self.nodes[0].name, self.nodes[1].name) + elif self.__n == 3: + return 'gr{0} {1} {2} {3} {4} {5}'.format(self.__n, self.name, self.__d, self.nodes[0].name, self.nodes[1].name, self.nodes[2].name) + else: + return 'gr{0} {1} {2} {3} {4}'.format(self.__n, self.name, self.__d, self.nodes[0].name, self.nodes[1].name, self.nodes[2].name, self.nodes[3].name) + + def getQGraphicsItem(self): + if self._QItem == None: + self._QItem = pykat.gui.graphics.SpaceQGraphicsItem(self) # TODO: make SVG graphic for grating + + return self._QItem class laser(Component): def __init__(self,name,node,P=1,f_offset=0,phase=0): diff --git a/pykat/finesse.py b/pykat/finesse.py index 2301c603103bbeccc6b504f6642a8d177340a86e..f028de162ca0ea15752cd810e723c8db069173d4 100644 --- a/pykat/finesse.py +++ b/pykat/finesse.py @@ -205,6 +205,8 @@ class kat(object): obj = pykat.components.laser.parseFinesseText(line) elif(first[0:2] == "bs"): obj = pykat.components.beamSplitter.parseFinesseText(line) + elif(first[0:2] == "gr"): + obj = pykat.components.grating.parseFinesseText(line) elif(first[0:2] == "pd"): obj = pykat.detectors.photodiode.parseFinesseText(line) elif(first == "xaxis" or first == "x2axis" or first == "xaxis*" or first == "x2axis*"):