diff --git a/pykat/detectors.py b/pykat/detectors.py index 006f9969e16444cef8bc426b72dbed9fcd2a035a..6e2f4090578e554ec63470e81b6f9562cee39300 100644 --- a/pykat/detectors.py +++ b/pykat/detectors.py @@ -12,6 +12,8 @@ from pykat.gui.graphics import * from pykat.node_network import * from pykat.param import Param +import pykat.exceptions as pkex +import warnings class Detector(object) : def __init__(self, name,node): @@ -93,11 +95,11 @@ class pd(Detector): # of how many the user specifies. Later we add properties to # those which correspond to the number of demodulations - self.__f1 = Param("f1", self, 0) - self.__f2 = Param("f2", self, 0) - self.__f3 = Param("f3", self, 0) - self.__f4 = Param("f4", self, 0) - self.__f5 = Param("f5", self, 0) + self.__f1 = Param("f1", self, None) + self.__f2 = Param("f2", self, None) + self.__f3 = Param("f3", self, None) + self.__f4 = Param("f4", self, None) + self.__f5 = Param("f5", self, None) self.__phi1 = Param("phi1", self, None) self.__phi2 = Param("phi2", self, None) @@ -105,6 +107,27 @@ class pd(Detector): self.__phi4 = Param("phi4", self, None) self.__phi5 = Param("phi5", self, None) + fs = [self.__f1, self.__f2, self.__f3, self.__f4, self.__f5] + ps = [self.__phi1, self.__phi2, self.__phi3, self.__phi4, self.__phi5] + + for i in range(num_demods): + f = 'f{0}'.format(i+1) + + if f in kwargs: + fs[i].value = kwargs[f] + else: + raise pkex.BasePyKatException("Missing demodulation frequency {0} (f{0})".format(i+1)) + + p = 'phi{0}'.format(i+1) + + if p in kwargs: + if kwargs[p] == None and i<num_demods-1: + raise pkex.BasePyKatException("Missing demodulation phase {0} (phi{0})".format(i+1)) + + ps[i].value = kwargs[p] + elif i<num_demods-1: + raise pkex.BasePyKatException("Missing demodulation phase {0} (phi{0})".format(i+1)) + # define new class for assigning new attributes cls = type(self) self.__class__ = type(cls.__name__, (cls,), {}) @@ -179,6 +202,50 @@ class pd(Detector): else: return + @staticmethod + def parseFinesseText(text): + values = text.split(" ") + demods = 0 + senstype = None + + if len(values[0]) == 4: + senstype = values[0][2] + demods = int(values[0][3]) + elif len(values[0]) == 3: + demods = int(values[0][2]) + elif len(values[0] != 2): + raise pkex.BasePyKatException("Photodiode code format incorrect '{0}'".format(text)) + + if len(values) <= 3 and demods > 0: + raise pkex.BasePyKatException("Photodiode code format incorrect '{0}'".format(text)) + elif len(values) >= 3 and demods == 0: + raise pkex.BasePyKatException("Photodiode code format incorrect '{0}'".format(text)) + + num_f_phs = len(values) - 3 + expected_f_phs = demods * 2 + + if num_f_phs != expected_f_phs and num_f_phs-1 != expected_f_phs: + raise pkex.BasePyKatException("Photodiode code format incorrect '{0}'".format(text)) + + f = values[2:len(values)-1:2] + phs = values[3: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 pd(values[1], demods, node, senstype=senstype, alternate_beam=alt_beam, **dict) + + def getFinesseText(self) : rtn = [] @@ -251,7 +318,7 @@ class photodiode(Detector): @pdtype.setter def pdtype(self, value): self.__pdtype = value - def __init__(self, name, node, senstype="", num_demods=0, demods=[], pdtype=None): + def __init__(self, name, node, senstype="", num_demods=0, demods=[], pdtype=None): Detector.__init__(self, name, node) if num_demods>2: diff --git a/pykat/finesse.py b/pykat/finesse.py index c974be1b1ae619394a55633e8a58862f88ff8102..1a7d3af7c4ccf523be9fedafe427303b767066d6 100644 --- a/pykat/finesse.py +++ b/pykat/finesse.py @@ -393,7 +393,7 @@ class kat(object): elif(first[0:3] == "mod"): obj = pykat.components.modulator.parseFinesseText(line) elif(first[0:2] == "pd" and first != "pdtype"): - obj = pykat.detectors.photodiode.parseFinesseText(line) + obj = pykat.detectors.pd.parseFinesseText(line) elif(first == "xaxis" or first == "xaxis*"): obj = pykat.commands.xaxis.parseFinesseText(line) elif(first == "x2axis" or first == "x2axis*"):