diff --git a/Protolist/HolyList-Latest-Phase-Current.xlsx b/Protolist/HolyList-Latest-Phase-Current.xlsx
index 4c79705..769dcbf 100644
Binary files a/Protolist/HolyList-Latest-Phase-Current.xlsx and b/Protolist/HolyList-Latest-Phase-Current.xlsx differ
diff --git a/Protolist/HolyList-Latest-Phase-Final.xlsx b/Protolist/HolyList-Latest-Phase-Final.xlsx
index d8f6712..7515fc6 100644
Binary files a/Protolist/HolyList-Latest-Phase-Final.xlsx and b/Protolist/HolyList-Latest-Phase-Final.xlsx differ
diff --git a/Protolist/HolyList-Latest-Phase-Planned.xlsx b/Protolist/HolyList-Latest-Phase-Planned.xlsx
index 072f225..897b5b6 100644
Binary files a/Protolist/HolyList-Latest-Phase-Planned.xlsx and b/Protolist/HolyList-Latest-Phase-Planned.xlsx differ
diff --git a/layoutexporter.py b/layoutexporter.py
index 4aa0ab1..a01a314 100644
--- a/layoutexporter.py
+++ b/layoutexporter.py
@@ -2,10 +2,10 @@ from containers import VariableContainer
from elements import *
class Exporter:
- def __init__(self):
- self.path = 'onlinemodel/exportedlayouts/layout.py'
+ def __init__(self,version='11.1.2'):
+ self.path = '../Heilige Liste/Python_Code/onlinemodel/layout/layout.py'
self.fid = None
- self.lattice='11.1.2'
+ self.lattice=version
def openFile(self):
print(self.path)
@@ -38,7 +38,7 @@ class Exporter:
fid.write('\t\t\treturn self.build_final()\n\n')
def buildCaseHeader(self,case):
- cases=['_current','_planned','_final']
+ cases=['current','planned','final']
self.fid.write('\tdef build_%s(self):\n' % cases[case])
@@ -55,39 +55,55 @@ class Exporter:
def writeSection(self,Name,Length):
- print('Write Line Container',Name)
self.fid.write('\n\t\t%s=LineContainer("%s",%f)\n' % (Name,Name,Length))
- def writeElement(self,Container,Element):
+ def writeElement(self,Container,Element,varCont=None,idx=0):
prop, typename,off, relative= self.getProp(Element)
if prop is None:
return
self.fid.write('\t\tprop=%s\n' % prop)
- self.fid.write('\t\t%s.append(%s(prop),%f,"%s")\n' % (Container,typename,off,relative))
-
+ if varCont:
+ self.fid.write('\t\t%s.append(%s(prop),%d,%s)\n' % (Container,typename,idx,varCont))
+ else:
+ self.fid.write('\t\t%s.append(%s(prop),%f,"%s")\n' % (Container, typename, off, relative))
def getProp(self,Element):
- if isinstance(Element, Marker) or isinstance(Element, VariableContainer):
+ if isinstance(Element, Marker):
+ if not 'MKBR' in Element.Name:
+ return None,1,1,1
+ if isinstance(Element, VariableContainer):
return None,1,1,1
prop= '{"Tag":"%s","index":%d,"Baugruppe":"%s","Length":%f' % (Element.Tag,Element.index,Element.Baugruppe, Element.Length)
if Element.LengthRes>Element.Length:
prop+=',"LengthRes":%f' % Element.LengthRes
if Element.Tilt>0:
- prop+=',"Tilt":%f' % (Element.Tilt*np.pi/180.)
+ prop+=',"Tilt":%13.10f' % (Element.Tilt*np.pi/180.)
+ if isinstance(Element,Alignment):
+ prop = '{"Tag":"ALIG","index":%d,"dy":%f' % (Element.index,Element.dy)
if isinstance(Element, RF):
- prop+=',"Band":%s' % Element.Band
+ prop+=',"Band":"%s"' % Element.Band
if isinstance(Element,Quadrupole):
if Element.PSChannels > 1:
prop+=',"corx":0,"cory":0'
if isinstance(Element,Dipole):
+ angD=Element.design_angle
+ if Element.branching:
+ ang=0
+ else:
+ ang=angD
+ prop+=',"angle":%f,"design_angle":%f' % (ang,angD)
+ prop+=',"e1":%f,"e2":%f' % (Element.e1,Element.e2)
if Element.PSChannels > 1:
- prop+=',"cor":0"'
+ prop+=',"cor":0'
+ if isinstance(Element,Corrector):
+ if Element.PSChannels >0:
+ prop+=',"corx":0,"cory":0'
if isinstance(Element, Diagnostic):
if Element.Seval > 0:
prop+=',"Seval":%f' % Element.seval
if isinstance(Element,Undulator):
- prop+=',"K"=%f,"ku":%f' % (Element.K,2*np.pi/Element.lambdau)
+ prop+=',"K":%f,"ku":%f' % (Element.K,2*np.pi/Element.lambdau)
prop+='}'
pos = 'absolute'
if Element.relOff:
@@ -97,11 +113,24 @@ class Exporter:
return prop,typename,offs,pos
-
+ def writeVariableLine(self,count,Element):
+ tag='varC%d' % count
+ self.fid.write('\t\t%s=VariableContainer(%f,%f)\n' % (tag,Element.L,Element.Loff))
+ return tag
def buildCaseFooter(self):
+
+
+ self.fid.write('\t\tLinac = LineContainer("")\n')
+ self.fid.write('\t\tLinac.append(Linac10, 0, "relative")\n')
+ self.fid.write('\t\tLinac.append(Linac20, 0, "relative")\n')
+ self.fid.write('\t\tLinac.append(Linac30, 0, "relative")\n\n')
+
+
self.fid.write('\t\tPartsList = [[Injector, -1, 0, "SwissFEL Injector"],\n')
- self.fid.write('\t\t [InjectorDump, 0, 1, "SwissFEL Injector beam dump"]]\n')
+ self.fid.write('\t\t [Linac, 0, -1, "SwissFEL Linac"],\n')
+ self.fid.write('\t\t [Aramis, 1, -1, "Aramis beamline"],\n')
+ self.fid.write('\t\t [Athos, 1, 2, "Athos beamline"]]\n')
self.fid.write('\t\treturn PartsList\n\n')
# PartsList = [[Injector, -1, 0, 'SwissFEL Injector'], # 0
diff --git a/main.py b/main.py
index 47dc813..03d167d 100644
--- a/main.py
+++ b/main.py
@@ -156,27 +156,88 @@ class BeamlineEditor(QtWidgets.QMainWindow, Ui_BeamlineGUI):
def exportOnlineModel(self):
print('Exporting Online Model Layout File...')
- self.exporter= Exporter()
+ version = str(self.UIOMVersion.text())
+ self.exporter= Exporter(version=version)
self.exporter.openFile()
for alt in range(3):
+ print('Writing lattice for Phase:',alt+1)
self.exportOnlineModelCase(alt)
self.exporter.closeFile()
def exportOnlineModelCase(self,alt):
self.exporter.buildCaseHeader(alt)
- secs=['IN','SINBD01']
- references={'IN':'Injector','SINBD01':'InjectorDump'}
+ secs=['IN','10','20','30','AR','AT']
+ branches={'IN':'Injector','10':'Linac10','20':'Linac20','30':'Linac30','AR':'Aramis','AT':'Athos'}
for sec in secs:
- # find element in database
+ # find section element in database
id0 = None
for id in self.elementDB.keys():
ele = self.elementDB[id]
- if isinstance(ele, LineContainer) and ele.Name == sec and ele.firstElementID in self.elementDB.keys():
+ if isinstance(ele, LineContainer) and ele.Name == sec:
id0=id
if id0:
- print('Found Section',sec)
+ print('Found Kingdom:','S'+sec)
else:
continue #skip to next entry
+ # now loop through the subsections:
+ kingEle=self.elementDB[id0]
+ kingName=sec
+ sectionList=[]
+ if kingEle.firstElementID in self.elementDB.keys(): # start Marker, which holds all section of the kingdom
+ tree = self.editor.flatten(kingEle.firstElementID, alt+1)
+ for ele in tree.path:
+ type = self.editor.getElementType(ele)
+ if type =='Start':
+ continue
+ section = self.elementDB[ele]
+ #print('Found Section:','S'+kingName+section.Name)
+ if section.firstElementID in self.elementDB.keys():
+ sectionList.append(section.Name)
+ self.exportOnlineModelSection(section.Name,section.LengthRes,section.firstElementID,alt+1)
+ if tree.primary:
+ treeprimary=self.editor.flatten(tree.primary.node_id, alt+1)
+ for ele in treeprimary.path:
+ type = self.editor.getElementType(ele)
+ if type == 'Start':
+ continue
+ section = self.elementDB[ele]
+ #print('Found Section:','S'+kingName+section.Name)
+ if section.firstElementID in self.elementDB.keys():
+ sectionList.append(section.Name)
+ self.exportOnlineModelSection(section.Name, section.LengthRes, section.firstElementID,
+ alt + 1)
+ self.exporter.writeDomain(branches[sec], sec, kingEle.LengthRes, sectionList)
+ self.exporter.buildCaseFooter()
+ return
+
+ def exportOnlineModelSection(self,Name: str, Lres:float,startID: str, alt:int):
+ self.exporter.writeSection(Name, Lres)
+ tree=self.editor.flatten(startID, alt+1)
+ count=1
+ nextVar=None
+ refIdx=0
+ for i,eleID in enumerate(tree.path[1:]):
+ type = self.editor.getElementType(eleID)
+ if type == 'Variable Line':
+ nextVar=self.exporter.writeVariableLine(count,self.elementDB[eleID])
+ refEle=self.elementDB[eleID].ID
+ if refEle in tree.path:
+ ct = 0
+ refIdx=0
+ for idscan in tree.path:
+ if idscan == refEle:
+ refIdx = ct
+ ct += 1
+ type = self.editor.getElementType(idscan)
+ if type == 'Start' or type == 'Variable Line':
+ ct -=1
+ count+=1
+ else:
+ self.exporter.writeElement(Name,self.elementDB[eleID],nextVar,refIdx)
+ nextVar=None
+ return
+
+ if a > 2:
root = self.elementDB[id0].firstElementID
domain=self.elementDB[root]
tree = self.editor.flatten(root, alt+1)
diff --git a/ui/BeamlineGUI.py b/ui/BeamlineGUI.py
index 41d3e0a..2a214d5 100644
--- a/ui/BeamlineGUI.py
+++ b/ui/BeamlineGUI.py
@@ -84,6 +84,17 @@ class Ui_BeamlineGUI(object):
self.UITolerances.setSizePolicy(sizePolicy)
self.UITolerances.setObjectName("UITolerances")
self.gridLayout.addWidget(self.UITolerances, 1, 1, 1, 1)
+ self.label = QtWidgets.QLabel(self.tab_4)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 2, 0, 1, 1)
+ self.UIOMVersion = QtWidgets.QLineEdit(self.tab_4)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.UIOMVersion.sizePolicy().hasHeightForWidth())
+ self.UIOMVersion.setSizePolicy(sizePolicy)
+ self.UIOMVersion.setObjectName("UIOMVersion")
+ self.gridLayout.addWidget(self.UIOMVersion, 2, 1, 1, 1)
self.verticalLayout_3.addLayout(self.gridLayout)
self.UIUnresolvedElements = QtWidgets.QCheckBox(self.tab_4)
self.UIUnresolvedElements.setChecked(True)
@@ -213,6 +224,8 @@ class Ui_BeamlineGUI(object):
self.UIFlattenOffset.setText(_translate("BeamlineGUI", "-0.1"))
self.lineEdit_2.setText(_translate("BeamlineGUI", "Tolerance"))
self.UITolerances.setText(_translate("BeamlineGUI", "1e-5"))
+ self.label.setText(_translate("BeamlineGUI", "Lattice Tag"))
+ self.UIOMVersion.setText(_translate("BeamlineGUI", "11.1.4"))
self.UIUnresolvedElements.setText(_translate("BeamlineGUI", "List Unresolved Elements"))
self.groupBox.setTitle(_translate("BeamlineGUI", "Branching"))
self.UISimpleBranch.setText(_translate("BeamlineGUI", "Simplified Branching"))
diff --git a/ui/BeamlineGUI.ui b/ui/BeamlineGUI.ui
index d323926..e00def0 100644
--- a/ui/BeamlineGUI.ui
+++ b/ui/BeamlineGUI.ui
@@ -110,6 +110,26 @@ background-color: rgb(13, 15, 26);
+ -
+
+
+ Lattice Tag
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 11.1.4
+
+
+
-