Commit 8f83578f authored by Daniel Brown's avatar Daniel Brown
Browse files

adding parsing of attr commands

parent e634953f
......@@ -20,6 +20,8 @@ yaxis abs:deg
pd pd_cav n3
cav c1 m1 n3 m2 n4
attr m1 Rc 1
"""
kat = finesse.kat()
......
......@@ -243,13 +243,43 @@ class AbstractMirrorComponent(Component):
self.Rcx.value = SIfloat(value)
self.Rcy.value = SIfloat(value)
def parseAttribute(self, key, value):
if key in ["Rcx", "Rx", "ROCx", "rx", "rcx", "rocx"]:
self.Rcx = value
elif key in ["Rcy", "Ry", "ROCy", "ry", "rcy", "rocy"]:
self.Rcy = value
elif key in ["Rc", "ROC", "r", "rc", "roc"]:
self.Rc = value
elif key in ["M, m, Mass, mass"]:
self.mass = value
elif key in ["xbeta, xBeta"]:
self.xbeta = value
elif key in ["ybeta, yBeta"]:
self.ybeta = value
elif key in ["x_off"]:
self.x_offset = value
elif key in ["y_off"]:
self.y_offset = value
elif key in ["r_ap"]:
self.r_ap = value
else:
return False
return True
class mirror(AbstractMirrorComponent):
def __init__(self,name,node1,node2,R=None,T=None,L=None,phi=0,Rcx=None,Rcy=None,xbeta=None,ybeta=None,mass=None, r_ap=None):
super(mirror, self).__init__(name, R, T, L, phi, Rcx, Rcy, xbeta, ybeta, mass, r_ap)
self._requested_node_names.append(node1)
self._requested_node_names.append(node2)
def parseAttributes(self, values):
for key in values.keys():
if not self.parseAttribute(key, values[key]):
raise pkex.BasePyKatException("No attribute {0} for mirrors".format(key))
@staticmethod
def parseFinesseText(text):
values = text.split()
......@@ -301,13 +331,22 @@ class beamSplitter(AbstractMirrorComponent):
self._requested_node_names.append(node3)
self._requested_node_names.append(node4)
self.__alpha = Param("alpha", self, SIfloat(alpha))
self.__alpha = AttrParam("alpha", self, SIfloat(alpha))
@property
def alpha(self): return self.__alpha
@alpha.setter
def alpha(self,value): self.__alpha.value = SIfloat(value)
def parseAttributes(self, values):
for key in values.keys():
if not self.parseAttribute(key, values[key]):
if key == "alpha":
self.alpha = values[key]
else:
raise pkex.BasePyKatException("No attribute {0} for mirrors".format(key))
@staticmethod
def parseFinesseText(text):
values = text.split()
......@@ -365,7 +404,6 @@ class space(Component):
self.__L = Param("L", self, SIfloat(L))
self.__n = Param("n", self, SIfloat(n))
self.__g = AttrParam("g", self, g)
self.__gx = AttrParam("gx", self, gx)
self.__gy = AttrParam("gy", self, gy)
......@@ -379,10 +417,17 @@ class space(Component):
def n(self,value): self.__n.value = SIfloat(value)
@property
def g(self): return self.__g
def g(self):
if self.__gx.value == self.__gy.value:
return self.__g
else:
raise pkex.BasePyKatException("Gouy phase in x and y directions are different, use gx and gy properties instead")
@g.setter
def g(self,value): self.__g.value = SIfloat(value)
def g(self,value):
self.__gx.value = SIfloat(value)
self.__gy.value = SIfloat(value)
@property
def gx(self): return self.__gx
@gx.setter
......@@ -393,6 +438,19 @@ class space(Component):
@gy.setter
def gy(self,value): self.__gy.value = SIfloat(value)
def parseAttributes(self, values):
for key in values.keys():
if key in ["gx","gouyx"]:
self.__gx.value = values[key]
elif key in ["gy", "gouyy"]:
self.__gy.value = values[key]
elif key in ["g, gouy"]:
self.__gx.value = values[key]
self.__gy.value = values[key]
else:
raise pkex.BasePyKatException("No attribute {0} for spaces".format(key))
@staticmethod
def parseFinesseText(text):
values = text.split()
......@@ -747,6 +805,14 @@ class laser(Component):
@phase.setter
def phase(self,value): self.__phase.value = float(value)
def parseAttributes(self, values):
for key in values.keys():
if key == "noise":
self.__noise.value = values[key]
else:
raise pkex.BasePyKatException("No attribute {0} at laser".format(key))
@staticmethod
def parseFinesseText(text):
values = text.split()
......
......@@ -34,6 +34,9 @@ import pykat
import warnings
import re
import itertools
import collections
from collections import namedtuple, OrderedDict
from pykat.node_network import NodeNetwork
......@@ -452,6 +455,8 @@ class kat(object):
after_process.append(line)
elif(first == "pdtype"):
after_process.append(line)
elif(first == "attr"):
after_process.append(line)
elif(first == "noxaxis"):
self.noxaxis = True
elif(first == "phase"):
......@@ -522,6 +527,27 @@ class kat(object):
raise pkex.BasePyKatException("pdtype command `{0}` refers to non-existing detector".format(component_name))
else:
raise pkex.BasePyKatException("pdtype command `{0}` is incorrect.".format(line))
elif(first == "attr"):
v = line.split()
if len(v) < 4:
raise pkex.BasePyKatException("attr command `{0}` is incorrect.".format(line))
else:
# get the component/detector in question
if v[1] in self.__components:
comp = self.__components[v[1]]
elif v[1] in self.__detectors:
comp = self.__detectors[v[1]]
else:
raise pkex.BasePyKatException("Could not find the component '{0}' for attr command in line '{1}'".format(v[1], line))
if len(v[2:]) % 2 == 1:
raise pkex.BasePyKatException("Attr command '{0}' must specify both parameter and value pairs".format(line))
# convert split list to key value pairs
kv = dict(itertools.izip_longest(*[iter(v[2:])] * 2, fillvalue=None))
comp.parseAttributes(kv)
self.__currentTag = NO_BLOCK
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment