Skip to content
Snippets Groups Projects
Commit 0a7dda36 authored by Sean Leavey's avatar Sean Leavey
Browse files

Added abstract class for mirror and beamSplitter classes, providing all of the...

Added abstract class for mirror and beamSplitter classes, providing all of the shared functionality.
parent d2d35516
No related branches found
No related tags found
No related merge requests found
...@@ -9,6 +9,7 @@ import pykat.exceptions as pkex ...@@ -9,6 +9,7 @@ import pykat.exceptions as pkex
import pykat import pykat
from pykat.node_network import * from pykat.node_network import *
from pykat.exceptions import * from pykat.exceptions import *
import abc
import pykat.gui.resources import pykat.gui.resources
import pykat.gui.graphics import pykat.gui.graphics
...@@ -49,6 +50,8 @@ class NodeGaussSetter(object): ...@@ -49,6 +50,8 @@ class NodeGaussSetter(object):
self.__node.setGauss(self.__comp, self.qx, complex(value)) self.__node.setGauss(self.__comp, self.qx, complex(value))
class Component(object): class Component(object):
__metaclass__ = abc.ABCMeta
def __init__(self, name): def __init__(self, name):
self.__name = name self.__name = name
self._svgItem = None self._svgItem = None
...@@ -117,11 +120,15 @@ class Component(object) : ...@@ -117,11 +120,15 @@ class Component(object) :
return getattr(self, '__nodesetter_' + name) return getattr(self, '__nodesetter_' + name)
@staticmethod @staticmethod
@abc.abstractmethod
def parseFinesseText(text): def parseFinesseText(text):
"""Parses Finesse syntax"""
raise NotImplementedError("This function is not implemented") raise NotImplementedError("This function is not implemented")
@staticmethod
@abc.abstractmethod
def getFinesseText(self): def getFinesseText(self):
""" Base class for individual finesse optical components """ """ Base class for individual Finesse optical components """
raise NotImplementedError("This function is not implemented") raise NotImplementedError("This function is not implemented")
def getQGraphicsItem(self): def getQGraphicsItem(self):
...@@ -136,8 +143,6 @@ class Component(object) : ...@@ -136,8 +143,6 @@ class Component(object) :
@property @property
def id(self): return self.__id def id(self): return self.__id
class Param(float): class Param(float):
def __new__(self,name,value): def __new__(self,name,value):
return float.__new__(self,SIfloat(value)) return float.__new__(self,SIfloat(value))
...@@ -147,17 +152,12 @@ class Param(float): ...@@ -147,17 +152,12 @@ class Param(float):
name = property(lambda self: self.__name) name = property(lambda self: self.__name)
class mirror(Component): class AbstractMirrorComponent(Component):
def __init__(self,name,node1,node2,R=0,T=0,phi=0,Rcx=0,Rcy=0,xbeta=0,ybeta=0,mass=0, r_ap=0): __metaclass__ = abc.ABCMeta
Component.__init__(self,name)
self._requested_node_names.append(node1)
self._requested_node_names.append(node2)
def __init__(self, name, R=0, T=0, phi=0, Rcx=0, Rcy=0, xbeta=0, ybeta=0, mass=0, r_ap=0):
super(AbstractMirrorComponent, self).__init__(name)
self.__r_ap = SIfloat(r_ap)
self.__mass = SIfloat(mass)
self.__R = SIfloat(R) self.__R = SIfloat(R)
self.__T = SIfloat(T) self.__T = SIfloat(T)
self.__phi = SIfloat(phi) self.__phi = SIfloat(phi)
...@@ -165,6 +165,20 @@ class mirror(Component): ...@@ -165,6 +165,20 @@ class mirror(Component):
self.__Rcy = SIfloat(Rcy) self.__Rcy = SIfloat(Rcy)
self.__xbeta = SIfloat(xbeta) self.__xbeta = SIfloat(xbeta)
self.__ybeta = SIfloat(ybeta) self.__ybeta = SIfloat(ybeta)
self.__mass = SIfloat(mass)
self.__r_ap = SIfloat(r_ap)
def getAttributeText(self):
rtn = []
if self.Rcx != 0: rtn.append("attr {0} Rcx {1}".format(self.name,self.__Rcx))
if self.Rcy != 0: rtn.append("attr {0} Rcy {1}".format(self.name,self.__Rcy))
if self.xbeta != 0: rtn.append("attr {0} xbeta {1}".format(self.name,self.__xbeta))
if self.ybeta != 0: rtn.append("attr {0} ybeta {1}".format(self.name,self.__ybeta))
if self.mass != 0: rtn.append("attr {0} mass {1}".format(self.name,self.__mass))
if self.r_ap != 0: rtn.append("attr {0} r_ap {1}".format(self.name,self.__r_ap))
return rtn
@property @property
def r_ap(self): return Param('r_ap', self.__r_ap) def r_ap(self): return Param('r_ap', self.__r_ap)
...@@ -223,6 +237,13 @@ class mirror(Component): ...@@ -223,6 +237,13 @@ class mirror(Component):
self.Rcx = SIfloat(value) self.Rcx = SIfloat(value)
self.Rcy = SIfloat(value) self.Rcy = SIfloat(value)
class mirror(AbstractMirrorComponent):
def __init__(self,name,node1,node2,R=0,T=0,phi=0,Rcx=0,Rcy=0,xbeta=0,ybeta=0,mass=0, r_ap=0):
super(mirror, self).__init__(name, R, T, phi, Rcx, Rcy, xbeta, ybeta, mass, r_ap)
self._requested_node_names.append(node1)
self._requested_node_names.append(node2)
@staticmethod @staticmethod
def parseFinesseText(text): def parseFinesseText(text):
values = text.split(" ") values = text.split(" ")
...@@ -244,20 +265,14 @@ class mirror(Component): ...@@ -244,20 +265,14 @@ class mirror(Component):
values.pop(0) # remove initial value values.pop(0) # remove initial value
return mirror(values[0], values[4], values[5], R=values[1], T=1.0-SIfloat(values[1])-SIfloat(values[2]), phi=values[3]) return mirror(values[0], values[4], values[5], R=values[1], T=1.0-SIfloat(values[1])-SIfloat(values[2]), phi=values[3])
def getFinesseText(self): def getFinesseText(self):
rtn = [] rtn = []
rtn.append('m {0} {1} {2} {3} {4} {5}'.format( rtn.append('m {0} {1} {2} {3} {4} {5}'.format(
self.name, self.__R, self.__T, self.__phi, self.name, self.R, self.T, self.phi,
self.nodes[0].name, self.nodes[1].name)) self.nodes[0].name, self.nodes[1].name))
if self.r_ap != 0: rtn.append("attr {0} r_ap {1}".format(self.name,self.__r_ap)) rtn.append(super(mirror, self).getAttributeText())
if self.mass != 0: rtn.append("attr {0} mass {1}".format(self.name,self.__mass))
if self.Rcx != 0: rtn.append("attr {0} Rcx {1}".format(self.name,self.__Rcx))
if self.Rcy != 0: rtn.append("attr {0} Rcy {1}".format(self.name,self.__Rcy))
if self.xbeta != 0: rtn.append("attr {0} xbeta {1}".format(self.name,self.__xbeta))
if self.ybeta != 0: rtn.append("attr {0} ybeta {1}".format(self.name,self.__ybeta))
return rtn return rtn
...@@ -267,76 +282,22 @@ class mirror(Component): ...@@ -267,76 +282,22 @@ class mirror(Component):
return self._svgItem return self._svgItem
class beamSplitter(Component): class beamSplitter(AbstractMirrorComponent):
def __init__(self,name,node1,node2,node3,node4,R=0,T=0,phi=0,alpha=0,Rcx=0,Rcy=0,xbeta=0,ybeta=0,mass=0): def __init__(self, name, node1, node2, node3, node4, R = 0, T = 0, phi = 0, alpha = 0, Rcx = 0, Rcy = 0, xbeta = 0, ybeta = 0, mass = 0, r_ap = 0):
Component.__init__(self,name) super(beamSplitter, self).__init__(name, R, T, phi, Rcx, Rcy, xbeta, ybeta, mass, r_ap)
self._requested_node_names.append(node1) self._requested_node_names.append(node1)
self._requested_node_names.append(node2) self._requested_node_names.append(node2)
self._requested_node_names.append(node3) self._requested_node_names.append(node3)
self._requested_node_names.append(node4) self._requested_node_names.append(node4)
self.__R = SIfloat(R)
self.__T = SIfloat(T)
self.__alpha = SIfloat(alpha) self.__alpha = SIfloat(alpha)
self.__phi = SIfloat(phi)
self.__Rcx = SIfloat(Rcx)
self.__Rcy = SIfloat(Rcy)
self.__xbeta = SIfloat(xbeta)
self.__ybeta = SIfloat(ybeta)
@property
def R(self): return Param('R', self.__R)
@R.setter
def R(self,value): self.__R = SIfloat(value)
@property
def T(self): return Param('T', self.__T)
@T.setter
def T(self,value): self.__T = SIfloat(value)
@property
def phi(self): return Param('phi', self.__phi)
@phi.setter
def phi(self,value): self.__phi = SIfloat(value)
@property @property
def alpha(self): return Param('alpha', self.__alpha) def alpha(self): return Param('alpha', self.__alpha)
@alpha.setter @alpha.setter
def alpha(self,value): self.__alpha = SIfloat(value) def alpha(self,value): self.__alpha = SIfloat(value)
@property
def Rcx(self): return Param('Rcx', self.__Rcx)
@Rcx.setter
def Rcx(self,value): self.__Rcx = SIfloat(value)
@property
def Rcy(self): return Param('Rcy', self.__Rcy)
@Rcy.setter
def Rcy(self,value): self.__Rcy = SIfloat(value)
@property
def xbeta(self): return Param('xbeta', self.__xbeta)
@xbeta.setter
def xbeta(self,value): self.__xbeta = SIfloat(value)
@property
def ybeta(self): return Param('ybeta', self.__ybeta)
@ybeta.setter
def ybeta(self,value): self.__ybeta = SIfloat(value)
@property
def Rc(self):
if self.Rcx == self.Rcy:
return self.Rcx
else:
return [self.Rcx, self.Rcy]
@Rc.setter
def Rc(self,value):
self.Rcx = SIfloat(value)
self.Rcy = SIfloat(value)
@staticmethod @staticmethod
def parseFinesseText(text): def parseFinesseText(text):
values = text.split(" ") values = text.split(" ")
...@@ -362,15 +323,12 @@ class beamSplitter(Component): ...@@ -362,15 +323,12 @@ class beamSplitter(Component):
rtn = [] rtn = []
rtn.append('bs {0} {1} {2} {3} {4} {5} {6} {7} {8}'.format( rtn.append('bs {0} {1} {2} {3} {4} {5} {6} {7} {8}'.format(
self.name, self.__R, self.__T, self.__phi, self.name, self.R, self.T, self.phi,
self.__alpha, self.nodes[0].name, self.alpha, self.nodes[0].name,
self.nodes[1].name, self.nodes[2].name, self.nodes[1].name, self.nodes[2].name,
self.nodes[3].name)) self.nodes[3].name))
if self.Rcx != 0: rtn.append("attr {0} Rcx {1}".format(self.name,self.__Rcx)) rtn.append(super(beamSplitter, self).getAttributeText())
if self.Rcy != 0: rtn.append("attr {0} Rcy {1}".format(self.name,self.__Rcy))
if self.xbeta != 0: rtn.append("attr {0} xbeta {1}".format(self.name,self.__xbeta))
if self.ybeta != 0: rtn.append("attr {0} ybeta {1}".format(self.name,self.__ybeta))
return rtn return rtn
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment