Commit fe3973b9 authored by Daniel Brown's avatar Daniel Brown
Browse files

adding more detectors

parent 56045da2
......@@ -155,7 +155,7 @@ class Component(object):
class AbstractMirrorComponent(Component):
__metaclass__ = abc.ABCMeta
def __init__(self, name, R=None, T=None, L=None, phi=0, Rcx=None, Rcy=None, xbeta=None, ybeta=None, mass=None, r_ap=None, Ix=None, Iy=None):
def __init__(self, name, R=None, T=None, L=None, phi=0, Rcx=None, Rcy=None, xbeta=None, ybeta=None, mass=None, r_ap=None, Ix=None, Iy=None, zmech=None, rxmech=None, rymech=None):
super(AbstractMirrorComponent, self).__init__(name)
if (L != None and R != None and T != None) and SIfloat(R)+SIfloat(T)+SIfloat(L) != 1:
......@@ -183,6 +183,10 @@ class AbstractMirrorComponent(Component):
self.__Iy = AttrParam("Iy", self, SIfloat(Iy))
self.__r_ap = AttrParam("r_ap", self, SIfloat(r_ap))
self.__zmech = AttrParam("zmech", self, zmech)
self.__rxmech = AttrParam("rxmech", self, rxmech)
self.__rymech = AttrParam("rymech", self, rymech)
@property
def L(self): return self.__L
@L.setter
......@@ -243,6 +247,21 @@ class AbstractMirrorComponent(Component):
@ybeta.setter
def ybeta(self,value): self.__ybeta.value = SIfloat(value)
@property
def zmech(self): return self.__zmech
@zmech.setter
def zmech(self,value): self.__zmech.value = value
@property
def rxmech(self): return self.__rxmech
@rxmech.setter
def rxmech(self,value): self.__rxmech.value = value
@property
def rymech(self): return self.__rymech
@rymech.setter
def rymech(self,value): self.__rymech.value = value
@property
def Rc(self):
if self.Rcx == self.Rcy:
......@@ -278,6 +297,12 @@ class AbstractMirrorComponent(Component):
self.Ix = value
elif key in ["Iy","iy"]:
self.Iy = value
elif key in ["zmech", "mech"]:
self.zmech = value
elif key in ["rxmech"]:
self.rxmech = value
elif key in ["rymech"]:
self.rymech = value
else:
return False
......
......@@ -217,10 +217,10 @@ class pd(Detector):
def pdtype(self, value): self.__pdtype = value
def __get_fphi(self, name):
return getattr(self, '_'+ self.__class__.__name__ +'__' + name)
return getattr(self, '_pd__' + name)
def __set_f(self, num, value):
setattr(self, '_'+ self.__class__.__name__ +'__f' + num, float(value))
setattr(self, '_pd__f' + num, float(value))
def __set_phi(self, num, value):
if value == None and num != self.num_demods:
......@@ -337,10 +337,10 @@ class pd(Detector):
return rtn
def qnoised(pd):
class qnoised(pd):
def __init__(self, name, num_demods, node_name, alternate_beam=False, pdtype=None, **kwargs):
pd.__init__(self, name, num_demods, node_name, alternate_beam=False, **kwargs)
super(qnoised, self).__init__(name, num_demods, node_name, alternate_beam=alternate_beam, pdtype=pdtype, **kwargs)
self.__homangle = AttrParam("homangle", self, None)
......@@ -350,31 +350,40 @@ def qnoised(pd):
def homangle(self, value): self.__homangle.value = value
@pd.pdtype.setter
def pdtype(self, value): raise pkex.BasePyKatException("Setting pdtype is not possible with qnoised detectors")
def pdtype(self, value):
raise pkex.BasePyKatException("Setting pdtype is not possible with qnoised detectors")
@pd.senstype.setter
def senstype(self,value): raise pkex.BasePyKatException("qnoised detector has no sensitvity type")
def senstype(self,value):
raise pkex.BasePyKatException("qnoised detector has no sensitvity type")
def parseAttributes(self, values):
for key in values.keys():
if key in ["homangle"]:
self.__homangle.value = values[key]
else:
raise pkex.BasePyKatException("No attribute {0} for qnoised".format(key))
@staticmethod
def parseFinesseText(text):
values = text.split()
if len(values) <= 3:
raise pkex.BasePyKatException("Photodiode code format incorrect '{0}' (2)".format(text))
raise pkex.BasePyKatException("qnoised code format incorrect '{0}' (2)".format(text))
demods = values[2]
demods = int(values[2])
if len(values) <= 4 and demods > 0:
raise pkex.BasePyKatException("Photodiode code format incorrect '{0}' (2)".format(text))
raise pkex.BasePyKatException("qnoised code format incorrect '{0}' (2)".format(text))
elif len(values) > 4 and demods == 0:
raise pkex.BasePyKatException("Photodiode code format incorrect '{0}' (3)".format(text))
raise pkex.BasePyKatException("qnoised code format incorrect '{0}' (3)".format(text))
num_f_phs = len(values) - 4
expected_f_phs = demods * 2
if not (num_f_phs == expected_f_phs or num_f_phs == expected_f_phs-1):
raise pkex.BasePyKatException("Photodiode code format incorrect '{0}' (4)".format(text))
if not (num_f_phs == expected_f_phs or num_f_phs == (expected_f_phs-1)):
raise pkex.BasePyKatException("qnoised code format incorrect '{0}' (4)".format(text))
f = values[3:len(values)-1:2]
phs = values[4:len(values)-1:2]
......@@ -425,7 +434,90 @@ def qnoised(pd):
rtn.extend(p.getFinesseText())
return rtn
class qnoised(pd):
def __init__(self, name, num_demods, node_name, alternate_beam=False, **kwargs):
super(qnoised, self).__init__(name, num_demods, node_name, alternate_beam=alternate_beam, pdtype=None, senstype=None, **kwargs)
@pd.pdtype.setter
def pdtype(self, value):
raise pkex.BasePyKatException("Setting pdtype is not possible with qshot detectors")
@pd.senstype.setter
def senstype(self,value):
raise pkex.BasePyKatException("qshot detector has no sensitvity type")
@staticmethod
def parseFinesseText(text):
values = text.split()
if len(values) <= 3:
raise pkex.BasePyKatException("qshot code format incorrect '{0}' (2)".format(text))
demods = int(values[2])
if len(values) <= 4 and demods > 0:
raise pkex.BasePyKatException("qshot code format incorrect '{0}' (2)".format(text))
elif len(values) > 4 and demods == 0:
raise pkex.BasePyKatException("qshot code format incorrect '{0}' (3)".format(text))
num_f_phs = len(values) - 4
expected_f_phs = demods * 2
if not (num_f_phs == expected_f_phs or num_f_phs == (expected_f_phs-1)):
raise pkex.BasePyKatException("qshot code format incorrect '{0}' (4)".format(text))
f = values[3:len(values)-1:2]
phs = values[4:len(values)-1:2]
dict = {}
for i in range(len(f)):
dict['f{0}'.format(i+1)] = f[i]
for i in range(len(phs)):
dict['phi{0}'.format(i+1)] = phs[i]
node = values[-1]
alt_beam = node[-1] == '*'
if alt_beam:
node = node[0:-1]
return qnoised(values[1], demods, node, alternate_beam=alt_beam, **dict)
def getFinesseText(self) :
rtn = []
if self.enabled:
alt_str = ""
fphi_str = ""
if self.alternate_beam:
alt_str = "*"
for n in range(1, 1+self.num_demods):
fphi_str += " " + str(self.__getattribute__("f"+str(n)))
phi_val = self.__getattribute__("phi"+str(n))
if phi_val != None:
fphi_str += " " + str(phi_val)
senstype = self.senstype
if senstype == None:
senstype = ""
rtn.append("qshot {0} {1} {2} {3}{4}".format(self.name, self.num_demods, fphi_str, self.node.name, alt_str))
if self.scale != None:
rtn.append("scale {1} {0}".format(self.name, self.scale))
for p in self._params:
rtn.extend(p.getFinesseText())
return rtn
def xd(Detector):
def __init__(self, name, node_name, component, motion):
......
......@@ -445,6 +445,10 @@ class kat(object):
obj = pykat.detectors.ad.parseFinesseText(line)
elif(first[0:2] == "pd" and first != "pdtype"):
obj = pykat.detectors.pd.parseFinesseText(line)
elif(first == "qshot"):
obj = pykat.detectors.qshot.parseFinesseText(line)
elif(first == "qnoised"):
obj = pykat.detectors.qnoised.parseFinesseText(line)
elif(first == "xaxis" or first == "xaxis*"):
obj = pykat.commands.xaxis.parseFinesseText(line)
elif(first == "x2axis" or first == "x2axis*"):
......
Supports Markdown
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