Commit bd378f92 authored by Andreas Freise's avatar Andreas Freise
Browse files

Merge branch 'master' of gitmaster.atlas.aei.uni-hannover.de:pykat/pykat

parents 5a5c246a 2fecc0f6
...@@ -28,7 +28,6 @@ for tem in maxtem: ...@@ -28,7 +28,6 @@ for tem in maxtem:
r = kat.run() r = kat.run()
pl.plot(r.x/1e-3, r.y, label="maxtem={0}".format(tem)) pl.plot(r.x/1e-3, r.y, label="maxtem={0}".format(tem))
pl.ylabel("Reflected Power [W]") pl.ylabel("Reflected Power [W]")
pl.xlabel("Mirror aperture [mm]") pl.xlabel("Mirror aperture [mm]")
pl.legend() pl.legend()
......
...@@ -6,12 +6,13 @@ from pykat.detectors import * ...@@ -6,12 +6,13 @@ from pykat.detectors import *
from pykat.components import * from pykat.components import *
from pykat.commands import * from pykat.commands import *
from pykat.structs import * from pykat.structs import *
#from pykat.plotting import *
import numpy as np import numpy as np
import pylab as pl import pylab as pl
code = """ code = """
l l1 1 0 0 n1 #l l1 1 0 0 n1
s s1 1 n3 n4
""" """
kat = finesse.kat(kat_code = code) kat = finesse.kat(kat_code = code)
......
...@@ -32,21 +32,21 @@ class NodeGaussSetter(object): ...@@ -32,21 +32,21 @@ class NodeGaussSetter(object):
@q.setter @q.setter
def q(self, value): def q(self, value):
self.__node.setGauss(self.__comp, value) self.__node.setGauss(self.__comp, complex(value))
@property @property
def qx(self): def qx(self):
return self.__node.qx return self.__node.qx
@qx.setter @qx.setter
def qx(self, value): def qx(self, value):
self.__node.setGauss(self.__comp, value) self.__node.setGauss(self.__comp, complex(value))
@property @property
def qy(self): def qy(self):
return self.__node.qy return self.__node.qy
@qy.setter @qy.setter
def qy(self, value): def qy(self, value):
self.__node.setGauss(self.__comp, self.qx, value) self.__node.setGauss(self.__comp, self.qx, complex(value))
class Component(object) : class Component(object) :
def __init__(self, name): def __init__(self, name):
...@@ -94,8 +94,8 @@ class Component(object) : ...@@ -94,8 +94,8 @@ class Component(object) :
# now we have a list of which to remove # now we have a list of which to remove
for key in key_rm: for key in key_rm:
ns = self.__dict__[key] ns = self.__dict__[key]
detattr(self, '__nodesetter_' + ns._node.name) delattr(self, '__nodesetter_' + ns.node.name)
delattr(self, ns._node.name) delattr(self.__class__, ns.node.name)
for node in self.nodes: for node in self.nodes:
if type(node) != pykat.node_network.DumpNode: if type(node) != pykat.node_network.DumpNode:
...@@ -313,22 +313,7 @@ class space(Component): ...@@ -313,22 +313,7 @@ class space(Component):
if self._QItem == None: if self._QItem == None:
self._QItem = pykat.gui.graphics.SpaceQGraphicsItem(self) self._QItem = pykat.gui.graphics.SpaceQGraphicsItem(self)
return self._QItem return self._QItem
# def changeNode(self, node_old, node_new):
# '''
# Called when a space's node has been connected
# to another components node
# '''
# node_new.connect(self)
# node_old.disconnect(self)
# if self._nodes[0] == node_old:
# self._nodes[0] = node_new
# if self._nodes[1] == node_old:
# self._nodes[1] = node_newf
class laser(Component): class laser(Component):
def __init__(self,name,node,P=1,f_offset=0,phase=0): def __init__(self,name,node,P=1,f_offset=0,phase=0):
......
...@@ -42,6 +42,9 @@ from pykat.components import Component ...@@ -42,6 +42,9 @@ from pykat.components import Component
from pykat.commands import Command, xaxis from pykat.commands import Command, xaxis
from pykat.gui.gui import pyKatGUI from pykat.gui.gui import pyKatGUI
from PyQt4.QtCore import QCoreApplication
from PyQt4.QtGui import QApplication
NO_GUI = False NO_GUI = False
NO_BLOCK = "NO_BLOCK" NO_BLOCK = "NO_BLOCK"
...@@ -474,12 +477,20 @@ class kat(object): ...@@ -474,12 +477,20 @@ class kat(object):
if NO_GUI: if NO_GUI:
print "No PyQt4 module was installed so cannot open a GUI" print "No PyQt4 module was installed so cannot open a GUI"
else: else:
self.app = QCoreApplication.instance()
created = False
if self.app == None:
created = True
self.app = QApplication([""])
if self.pykatgui == None: if self.pykatgui == None:
#self.app = QtGui.QApplication([""])
self.pykatgui = pyKatGUI(self) self.pykatgui = pyKatGUI(self)
self.pykatgui.main() self.pykatgui.main()
else: else:
self.pykatgui.show() self.pykatgui.show()
if created: self.app.exec_()
def getComponents(self): def getComponents(self):
return self.__components.values() return self.__components.values()
......
...@@ -8,6 +8,7 @@ Created on Fri Feb 01 09:13:03 2013 ...@@ -8,6 +8,7 @@ Created on Fri Feb 01 09:13:03 2013
from PyQt4.QtGui import * from PyQt4.QtGui import *
from PyQt4.Qt import * from PyQt4.Qt import *
from PyQt4 import QtSvg from PyQt4 import QtSvg
from PyQt4.QtSvg import QGraphicsSvgItem
import pykat.components import pykat.components
import exceptions import exceptions
...@@ -56,16 +57,16 @@ class SpaceQGraphicsItem(QGraphicsLineItem): ...@@ -56,16 +57,16 @@ class SpaceQGraphicsItem(QGraphicsLineItem):
@property @property
def space(self): return self.__space def space(self): return self.__space
def refresh(self): def refresh(self):
nodes = self.__space.getNodes() nodes = self.__space.nodes
conn = nodes[0].amIConnected(self.__space) conn = nodes[0].amIConnected(self.__space)
x1 = 0 x1 = 0
y1 = 0 y1 = 0
x2 = 0 x2 = 0
y2 = 0 y2 = 0
if conn[0]: if conn[0]:
if conn[1] != None: if conn[1] != None:
if self.__n1 is not None: if self.__n1 is not None:
...@@ -178,7 +179,7 @@ class ComponentQGraphicsItem(QtSvg.QGraphicsSvgItem): ...@@ -178,7 +179,7 @@ class ComponentQGraphicsItem(QtSvg.QGraphicsSvgItem):
def itemChange(self, change, value): def itemChange(self, change, value):
# if the item is moved then update any spaces attached to it # if the item is moved then update any spaces attached to it
if change == QGraphicsItem.ItemPositionHasChanged: if change == QGraphicsItem.ItemPositionHasChanged:
nodes = self.__component.getNodes() nodes = self.__component.nodes
for n in nodes: for n in nodes:
conn = n.amIConnected(self.__component) conn = n.amIConnected(self.__component)
...@@ -187,4 +188,4 @@ class ComponentQGraphicsItem(QtSvg.QGraphicsSvgItem): ...@@ -187,4 +188,4 @@ class ComponentQGraphicsItem(QtSvg.QGraphicsSvgItem):
conn[1].getQGraphicsItem().refresh() conn[1].getQGraphicsItem().refresh()
return QGraphicsSvgItem.itemChange(self, change, value) return QGraphicsSvgItem.itemChange(self, change, value)
\ No newline at end of file
...@@ -5,7 +5,7 @@ Created on Tue Jan 29 11:35:48 2013 ...@@ -5,7 +5,7 @@ Created on Tue Jan 29 11:35:48 2013
@author: Daniel @author: Daniel
""" """
from pykat.components import Component from pykat.components import Component, space
from pykat.detectors import Detector from pykat.detectors import Detector
from PyQt4 import QtGui, QtCore from PyQt4 import QtGui, QtCore
...@@ -16,11 +16,11 @@ import qt_gui ...@@ -16,11 +16,11 @@ import qt_gui
import functools import functools
class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow): class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow):
def __init__(self, kat,parent=None): def __init__(self, kat, parent=None):
super(pyKatGUI, self).__init__(parent) super(pyKatGUI, self).__init__(parent)
self.setupUi(self) self.setupUi(self)
self.graphicsView = pyKatGraphicsView(self.centralwidget) self.graphicsView = pyKatGraphicsView(self.centralwidget, kat)
self.graphicsView.setObjectName("graphicsView") self.graphicsView.setObjectName("graphicsView")
self.graphicsView.setViewportUpdateMode(QGraphicsView.FullViewportUpdate) self.graphicsView.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)
self.graphicsView.viewport().setMouseTracking(True) self.graphicsView.viewport().setMouseTracking(True)
...@@ -41,8 +41,11 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow): ...@@ -41,8 +41,11 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow):
self.actionExport_to_SVG.triggered.connect(lambda: self.exportToSVG()) self.actionExport_to_SVG.triggered.connect(lambda: self.exportToSVG())
self.actionClose.triggered.connect(lambda: self.close) self.actionClose.triggered.connect(lambda: self.close)
self.kat = kat self._kat = kat
@property
def kat(self): return self._kat
def main(self): def main(self):
self.show() self.show()
...@@ -52,7 +55,6 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow): ...@@ -52,7 +55,6 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow):
return self.__scene return self.__scene
def addComponentsToScene(self): def addComponentsToScene(self):
for c in self.kat.getComponents(): for c in self.kat.getComponents():
self.addComponentToScene(c) self.addComponentToScene(c)
...@@ -120,7 +122,27 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow): ...@@ -120,7 +122,27 @@ class pyKatGUI(QtGui.QMainWindow, qt_gui.Ui_MainWindow):
self.kat.add(l) self.kat.add(l)
self.addComponentToScene(l,x,y) self.addComponentToScene(l,x,y)
def disconnect(self, node):
comps = self.kat.nodes.getNodeComponents(node)
spaces = [c for c in comps if isinstance(c, space)]
if len(spaces) > 0:
dis_comp = spaces[0]
else:
dis_comp = comps[0]
new_node_name = self.kat.getNewNodeNames("n", 1)
new_node = self.kat.nodes.createNode(new_node_name[0])
self.kat.nodes.replaceNode(dis_comp, node, new_node)
# refresh all the graphics that might be affected
for c in node.components + new_node.components:
if c != None:
c.getQGraphicsItem().refresh()
class pyKatGraphicsScene(QGraphicsScene): class pyKatGraphicsScene(QGraphicsScene):
def drawBackground(self, painter, rect): def drawBackground(self, painter, rect):
size = 10 size = 10
...@@ -149,9 +171,9 @@ class pyKatGraphicsScene(QGraphicsScene): ...@@ -149,9 +171,9 @@ class pyKatGraphicsScene(QGraphicsScene):
painter.drawLine(y, rect.top(), y, rect.bottom()) painter.drawLine(y, rect.top(), y, rect.bottom())
class pyKatGraphicsView(QGraphicsView): class pyKatGraphicsView(QGraphicsView):
def __init__(self,val): def __init__(self, val, kat):
QGraphicsView.__init__(self,val) QGraphicsView.__init__(self, val)
self._kat = kat
self.__selected_item = None self.__selected_item = None
self.__prev_pt = None self.__prev_pt = None
self.setMouseTracking(True) self.setMouseTracking(True)
...@@ -189,8 +211,11 @@ class pyKatGraphicsView(QGraphicsView): ...@@ -189,8 +211,11 @@ class pyKatGraphicsView(QGraphicsView):
menu.addAction("Delete") menu.addAction("Delete")
if isinstance(item,NodeQGraphicItem): if isinstance(item,NodeQGraphicItem):
menu.addSeparator() menu.addSeparator()
menu.addAction("Disconnect") comps = self._kat.nodes.getNodeComponents(item.node)
if(comps.count(None) == 0):
action = menu.addAction("Disconnect")
action.triggered.connect(functools.partial(gui.disconnect, item.node))
menu.popup(ev.globalPos()); menu.popup(ev.globalPos());
...@@ -244,8 +269,7 @@ class pyKatGraphicsView(QGraphicsView): ...@@ -244,8 +269,7 @@ class pyKatGraphicsView(QGraphicsView):
# connect space of node dragged to the component node # connect space of node dragged to the component node
# the space node that has been dragged gets deleted and we # the space node that has been dragged gets deleted and we
# replace it with the components # replace it with the components
space.changeNode(node_s, node_c) self._kat.nodes.replaceNode(space, node_s, node_c)
node_s.remove() # now remove from node network completly
# then refresh the graphical items # then refresh the graphical items
qspace.refresh() qspace.refresh()
......
...@@ -9,6 +9,7 @@ import pykat.gui.graphics ...@@ -9,6 +9,7 @@ import pykat.gui.graphics
import pykat.exceptions as pkex import pykat.exceptions as pkex
from pykat.components import Component from pykat.components import Component
from pykat.detectors import Detector from pykat.detectors import Detector
from pykat.utilities.optics.gaussian_beams import gauss_param
class NodeNetwork(object): class NodeNetwork(object):
def __init__(self, kat): def __init__(self, kat):
...@@ -47,17 +48,54 @@ class NodeNetwork(object): ...@@ -47,17 +48,54 @@ class NodeNetwork(object):
change_callback() change_callback()
def replaceNode(self, comp, node_old, node_new):
if node_new.components.count(None) == 0:
raise pkex.BasePyKatException("New node already connected to two components")
if comp not in node_old.components:
raise pkex.BasePyKatException("Old node not attached to component")
if comp in node_new.components:
raise pkex.BasePyKatException("New node already attached to component")
# add component to new node component list
new_node_comps = list(node_new.components)
new_node_comps[new_node_comps.index(None)] = comp
self.__nodeComponents[node_new.id] = tuple(new_node_comps)
# remove component from old node list
old_node_comps = list(node_old.components)
old_node_comps[old_node_comps.index(comp)] = None
self.__nodeComponents[node_old.id] = tuple(old_node_comps)
comp_nodes = list(comp.nodes)
comp_nodes[comp_nodes.index(node_old)] = node_new
self.__componentNodes[comp.id] = tuple(comp_nodes)
# if old node is no longer connected to anything then delete it
if node_old.components.count(None) == 2:
self.removeNode(node_old)
self.__componentCallback[comp.id]()
def connectNodeToComp(self, node, comp, do_callback=True): def connectNodeToComp(self, node, comp, do_callback=True):
if node.id in self.__nodeComponents: if node.id in self.__nodeComponents:
comps = self.__nodeComponents[node.id] comps = self.__nodeComponents[node.id]
else: else:
comps = () comps = (None,) * 2
if len(comps) >= 2: if len(comps) >= 2 and comps[0] != None and comps[1] != None:
raise pkex.BasePyKatException("Node is already connected to 2 components") raise pkex.BasePyKatException("Node is already connected to 2 components")
l = list(comps) l = list(comps)
l.append(comp)
if l[0] == None:
l[0] = comp
elif l[1] == None:
l[1] = comp
else:
raise pkex.BasePyKatException("Connected to two coponents already")
self.__nodeComponents[node.id] = tuple(l) self.__nodeComponents[node.id] = tuple(l)
...@@ -76,6 +114,7 @@ class NodeNetwork(object): ...@@ -76,6 +114,7 @@ class NodeNetwork(object):
self.__node_id += 1 self.__node_id += 1
self.__add_node_attr(n) # add node as a member of this object, e.g. kat.nodes.n self.__add_node_attr(n) # add node as a member of this object, e.g. kat.nodes.n
self.__nodes[node_name] = n self.__nodes[node_name] = n
self.__nodeComponents[n.id] = (None, None)
return n return n
def removeNode(self, node): def removeNode(self, node):
...@@ -133,8 +172,11 @@ class NodeNetwork(object): ...@@ -133,8 +172,11 @@ class NodeNetwork(object):
print "node: {0} connected:{1} {2}->{3} {4}".format( print "node: {0} connected:{1} {2}->{3} {4}".format(
n.name,n.isConnected(),comp1, comp2, detectors) n.name,n.isConnected(),comp1, comp2, detectors)
def getComponentNodes(self, comp): return self.__componentNodes[comp.id] def getComponentNodes(self, comp):
def getNodeComponents(self, node): return self.__nodeComponents[node.id] return self.__componentNodes[comp.id]
def getNodeComponents(self, node):
return self.__nodeComponents[node.id]
def __add_node_attr(self, node): def __add_node_attr(self, node):
...@@ -152,8 +194,8 @@ class NodeNetwork(object): ...@@ -152,8 +194,8 @@ class NodeNetwork(object):
raise exceptions.ValueError("Argument is not of type Node") raise exceptions.ValueError("Argument is not of type Node")
name = node.name name = node.name
detattr(self.__class__, '__node_' + name) delattr(self, '__node_' + name)
delattr(self, name) delattr(self.__class__, name)
def __get_node_attr(self, name): def __get_node_attr(self, name):
return getattr(self, '__node_' + name) return getattr(self, '__node_' + name)
...@@ -200,11 +242,11 @@ class Node(object): ...@@ -200,11 +242,11 @@ class Node(object):
self.__q_comp = component self.__q_comp = component
if len(args) == 1: if len(args) == 1:
self.__q_x = args[0] self.__q_x = gauss_param(q=args[0])
self.__q_y = args[0] self.__q_y = gauss_param(q=args[0])
elif len(args) == 2: elif len(args) == 2:
self.__q_x = args[0] self.__q_x = gauss_param(q=args[0])
self.__q_y = args[1] self.__q_y = gauss_param(q=args[1])
else: else:
raise pkex.BasePyKatException("Must specify either 1 Gaussian beam parameter or 2 for astigmatic beams") raise pkex.BasePyKatException("Must specify either 1 Gaussian beam parameter or 2 for astigmatic beams")
...@@ -222,7 +264,7 @@ class Node(object): ...@@ -222,7 +264,7 @@ class Node(object):
return rtn return rtn
def isConnected(self): def isConnected(self):
if (self.components[0] is not None) and (self.self.components[1] is not None): if (self.components[0] is not None) and (self.components[1] is not None):
return True return True
else: else:
return False return False
...@@ -256,7 +298,7 @@ class Node(object): ...@@ -256,7 +298,7 @@ class Node(object):
if comps[1] == None: if comps[1] == None:
ix = -1 ix = -1
else: else:
ix = comps[1].getNodes().index(self) ix = comps[1].nodes.index(self)
return [True, comps[1], ix] return [True, comps[1], ix]
...@@ -264,7 +306,7 @@ class Node(object): ...@@ -264,7 +306,7 @@ class Node(object):
if comps[0] == None: if comps[0] == None:
ix = -1 ix = -1
else: else:
ix = comps[0].getNodes().index(self) ix = comps[0].nodes.index(self)
return [True, comps[0], ix] return [True, comps[0], ix]
else: else:
......
import os
import exceptions
import numpy as np
from pykat.node_network import NodeNetwork
from pykat.detectors import Detector
from pykat.components import Component
from pykat.commands import Command, xaxis
components = np.array(['m','m1','m2','l','s','bs','bs1','bs2','pd','pd*'])
commands = np.array(['attr','tem','tem*','gauss','gauss*','gauss**','cav','conf'])
# some commands we ignore, we do the plotting with pyhton
# so don't need
ignore = ['gnuterm']
def parse_kat_file(kat_filename):
kat_cmps = [] # holds the components found in kat file
kat_cmds = [] # holds the commands found in kat file
katfile = open(kat_filename,'r')
for line in katfile.readlines():
arg = line.split(' ')[0]
# c
if (components == arg).any():
kat_cmps.append()
elif (commands == arg).any():
print ""
def parse_m(line):
return line
\ No newline at end of file
...@@ -14,6 +14,7 @@ class gauss_param(object): ...@@ -14,6 +14,7 @@ class gauss_param(object):
q = gauss_param(w0=w0, z=z) q = gauss_param(w0=w0, z=z)
q = gauss_param(z=z, zr=zr) q = gauss_param(z=z, zr=zr)
q = gauss_param(wz=wz, rc=rc) q = gauss_param(wz=wz, rc=rc)
q = gauss_param(q=a) # where a is a complex number
or change default wavelength and refractive index with: or change default wavelength and refractive index with: