diff --git a/bin/test_fsig.py b/bin/test_fsig.py index e26ceb3e49e664ce0c208bf1f307b22fafd95fd3..ff96caf8be2cfeda92d6ac6f75f34883b632d28b 100644 --- a/bin/test_fsig.py +++ b/bin/test_fsig.py @@ -25,33 +25,31 @@ qd tran_Q 0 90 n4 qnoised qnd 1 $fs max n4 qshot qsd 1 $fs max n4 -pd1 p1 $fs max n4 -yaxis log re:im +pd1 p1 $fs max n4 -fsig noise m2 1 0 +fsig noise l1 amp 1 0 """ kat = finesse.kat(kat_code=code) -kat.removeLine("fsig noise 9") - -kat.signals.apply(kat.l1.P, 1, 0) -kat.signals.apply(kat.m1.phi, 1, 90) - -kat.add(xaxis('log', [1, 1000], kat.signals.f, 100)) - -out = kat.run(printout=0, printerr=0) - -# using real and imag part compute the complex value of the upper and lower sidebands -a_up = out.y[:,0] + out.y[:,1]*1j -a_lo = out.y[:,2] + out.y[:,3]*-1j - -pl.figure(1) -pl.loglog(out.x, out["p1"]) -pl.xlabel(out.xlabel) -pl.title("Reflection quadratures with no relative carrier phase") -pl.legend(["Amplitude","Phase"]) -pl.show() - -kat.remove(kat.signals) \ No newline at end of file +# kat.signals.apply(kat.m2.z, 1.0, 0.0) +# kat.yaxis = "re:im" +# kat.add(xaxis('log', [1, 1000], kat.signals.f, 1000)) +# +# out = kat.run(printout=0, printerr=0) +# +# a_up = out[kat.up_refl] +# a_lo = out[kat.low_refl] +# +# pl.figure(1) +# ax = pl.subplot(111) +# pl.grid() +# ax.loglog(out.x, abs(a_up)) +# ax = ax.twinx() +# ax.plot(out.x, np.rad2deg(np.angle(a_up)), 'r') +# pl.xlabel(out.xlabel) + +#pl.show() +print(kat.generateKatScript()) +kat.remove(kat.signals) diff --git a/pykat/finesse.py b/pykat/finesse.py index 81bc400b8c51bd22f55d664785be11efde6151fa..2c3f58c2e460ba61909c2f507c3e17750e8c4cd7 100644 --- a/pykat/finesse.py +++ b/pykat/finesse.py @@ -181,7 +181,47 @@ def f__lkat_trace_callback(lkat, trace_info, getCavities, getNodes, getSpaces): trace_info[space.name] = space_trace(gouyx = space.gouy_x, gouyy = space.gouy_y) - +class KatBatch(object): + """ + + """ + + def __init__(self): + from IPython.parallel import Client + + self._c = Client() + self._lb = c.load_balanced_view() + self.lb.block = False + + self._todo = [] + + def _run(dir, commands, **kwargs): + import pykat + kat = pykat.finesse.kat() + kat.verbose = False + kat.parseCommands(commands) + + kw = dict() + + if "cmd_args" in kwargs: + kw["cmd_args"] = kwargs["cmd_args"] + + return kat.run(printerr=1, **kw) + + def addKat(self, kat, **kwargs): + import os + cdir = os.getcwd() + script = "\n".join(kat.generateKatScript()) + self.todo.append(self.lb.apply_async(self._run, script, **kwargs)) + return self.todo[-1] + + def wait(self): + return self.lb.wait(self.todo) + + def results(self): + return self.todo + + def GUILength(L): """ Should scale the lengths in some way to handle km and mm for time being @@ -971,7 +1011,7 @@ class kat(object): if comp._default_fsig() is None: raise pkex.BasePyKatException("Component '{0}' cannot be fsig'd. Line: '{1}'".format(comp.name, line)) - param = None + param_name = None amp = None if len(v) == 5: @@ -984,11 +1024,12 @@ class kat(object): phase = float(v[4]) amp = float(v[5]) else: - param = v[3] + param_name = v[3] freq = float(v[4]) phase = float(v[5]) + elif len(v) == 7: - param = v[3] + param_name = v[3] freq = float(v[4]) phase = float(v[5]) amp = float(v[6]) @@ -996,7 +1037,17 @@ class kat(object): raise pkex.BasePyKatException("'{0}' isnot a valid fsig command".format(line)) self.signals.f = freq - self.signals.apply(comp._default_fsig(), amp, phase, name) + + if param_name is None: + param = comp._default_fsig() + else: + for p in comp._params: + if p.canFsig and p.fsigName == param_name: + param = p + break + + + self.signals.apply(param, amp, phase, name) else: raise pkex.BasePyKatException("Haven't handled parsing of '{0}'".format(line)) @@ -1022,15 +1073,6 @@ class kat(object): except pkex.BasePyKatException as ex: print (ex) - - def getProcess(self, callback, **kwargs): - """ - """ - - cmd = "\n".join(self.generateKatScript()) - - return Process(target=f__lkat_process, args=(callback, cmd, kwargs)) - def run(self, printout=0, printerr=0, plot=None, save_output=False, save_kat=False, kat_name=None, cmd_args=None, getTraceData=False): """ Runs the current simulation setup that has been built thus far. @@ -1404,7 +1446,7 @@ class kat(object): except pkex.BasePyKatException as ex: pkex.PrintError("Error on removing object:", ex) - def undumpNodes(self): + def undumpNodes(self, undumped_name_prefix = "dump"): """ Loops through and removes all dump nodes. Required when running quantum noise calculations using qnoised as noise must be injected in where losses occur, such as power @@ -1416,13 +1458,13 @@ class kat(object): """ i = 0 - node_name = "dump%i" % i + node_name = "%s_%i" % (str(undumped_name_prefix), i) for c in self.components.values(): for n in c.nodes: if n.isDump: while hasattr(kat.nodes, node_name): - node_name = "dump%i" % i + node_name = "%s_%i" % (str(undumped_name_prefix), i) i += 1 self.nodes.replaceNode(c, n, self.nodes.createNode(node_name % i)) @@ -1950,8 +1992,17 @@ class kat(object): rtn.append(name) return rtn + + def _lkat_getProcess(self, callback, **kwargs): + """ + """ + + cmd = "\n".join(self.generateKatScript()) - def lkat_trace(self, getCavities=True, getNodes=True, getSpaces=True): + return Process(target=f__lkat_process, args=(callback, cmd, kwargs)) + + + def _lkat_trace(self, getCavities=True, getNodes=True, getSpaces=True): """ Given the current state of the kat object a new FINESSE process is called and just the beam tracing routine is run. The object that is returned contains all the information diff --git a/pykat/param.py b/pykat/param.py index b5221f81d7e7ece9176637b64e498223c6ebdf04..264de77b1e3e13d2f01da656a3fb3b04b7ab474d 100644 --- a/pykat/param.py +++ b/pykat/param.py @@ -111,6 +111,9 @@ class Param(putable, putter): @property def fsig_name(self): return self.__fsig_name + @property + def fsigName(self): return self.__fsig_name + @property def name(self): return self._name