From d8693e5529dad1066c1350b26114699aac00c068 Mon Sep 17 00:00:00 2001 From: reiche Date: Thu, 12 Jun 2025 17:42:08 +0200 Subject: [PATCH] Writing from sandbox to machine - initial code --- MatchingConfig/Reference.json | 5 ++- Scripts/switchyard.madx | 2 +- generateMatchSettings.py | 11 ++++-- issues.txt | 2 +- model.py | 8 +++- reference.py | 25 ++++++++++++ ui/OpticsToolsGui.py | 39 +++++++++++++++++-- ui/OpticsToolsGui.ui | 73 +++++++++++++++++++++++++++++++---- 8 files changed, 146 insertions(+), 19 deletions(-) diff --git a/MatchingConfig/Reference.json b/MatchingConfig/Reference.json index 0582746..fd2adb1 100644 --- a/MatchingConfig/Reference.json +++ b/MatchingConfig/Reference.json @@ -605,7 +605,10 @@ { "Script": "Scripts/switchyard.madx" } - ] + ], + "User": { + "LEAKDISP": 0.0 + } }, "Athos Diagnostics": { "Variable": [ diff --git a/Scripts/switchyard.madx b/Scripts/switchyard.madx index 734f99f..51e4dcd 100644 --- a/Scripts/switchyard.madx +++ b/Scripts/switchyard.madx @@ -41,7 +41,7 @@ CONSTRAINT, SEQUENCE=swissfel, RANGE=satsy01$end, X<10; LMDIF, CALLS=1000, TOLERANCE=1.E-21; ENDMATCH; -!satsy01.mqua280.k1 = satsy01.mqua280.k1*1.3; +satsy01.mqua280.k1 = satsy01.mqua280.k1*(1+leakdisp); !------------------------------------------ ! close vertical dispersion diff --git a/generateMatchSettings.py b/generateMatchSettings.py index bb3563b..bc7e381 100644 --- a/generateMatchSettings.py +++ b/generateMatchSettings.py @@ -12,9 +12,10 @@ def MatchReference(loc,twiss,limit=None): # limit 1 -> smaller than, 2 -> large return match -def MatchParameter(var0,tar0): - return {'Variable':var0,'Target':tar0} - +def MatchParameter(var0,tar0,user0=None): + if user0 is None: + return {'Variable':var0,'Target':tar0} + return {'Variable':var0,'Target':tar0,'User':user0} path ="MatchingConfig/" label='Reference' @@ -138,7 +139,9 @@ var=['SATSY01-MQUA020','SATSY01-MQUA040','SATSY01-MQUA070','SATSY01-MQUA090','SA 'SATSY01-MQUA300','SATSY02-MQUA010','SATSY02-MQUA110','SATSY02-MQUA120','SATSY02-MQUA230','SATSY03-MQUA010','SATSY03-MQUA040','SATSY03-MQUA070', 'SATSY03-MQUA100','SATSY03-MQUA130','SATCL01-MQUA120','SATCL01-MQUA130','SATCL01-MQUA180','SATCL01-MQUA190'] tar=[{'Script':'Scripts/switchyard.madx'}] -parameter['Switchyard']=MatchParameter(var, tar) +uservar = {'LEAKDISP':0.0} +parameter['Switchyard']=MatchParameter(var, tar,uservar) + var=['SATDI01-MQUA025','SATDI01-MQUA080','SATDI01-MQUA220','SATDI01-MQUA230'] tar = [reference['HERO']] diff --git a/issues.txt b/issues.txt index 34e7196..57b7034 100644 --- a/issues.txt +++ b/issues.txt @@ -1,4 +1,4 @@ - +1) if plotting window is closed, reopen it 2) make matching targets editable 4) export elegant lattice 5) support of other reference files -> fill up the selection list diff --git a/model.py b/model.py index 7695a94..0d8ea22 100644 --- a/model.py +++ b/model.py @@ -41,6 +41,10 @@ class Model: def getVariableInfo(self,varlist): variable = {} for var in varlist: + if isinstance(var,dict): + for key in var.keys(): + variable[key] = {'Val':var[key],'Max':None} + continue ele = self.om.getElement(var.replace('-','.')) if ele is None: variable[var]={'Val':0,'Max':None} @@ -251,8 +255,8 @@ class Model: return if 'Script' in target.keys(): - res,twiss,err = self.madx.callScript(script = target['Script'],sequence=sequence, start=start, end=end,init=itwiss,var=var) - + print(var) + res,twiss,err = self.madx.callScript(script = target['Script'],sequence=sequence, start=start, end=end,init=itwiss,var=var,preset=True) self.updateModelFromMatching(res) self.parent.reference.updateMatchPoint(ID, err) if self.matchplot: diff --git a/reference.py b/reference.py index 5268fe3..43d86ea 100644 --- a/reference.py +++ b/reference.py @@ -1,6 +1,8 @@ import json import copy from PyQt5 import QtCore, QtGui, QtWidgets +from numpy.ma.core import floor_divide + #from fontTools.misc.cython import returns CBeige = QtGui.QColor(250, 240, 200) @@ -18,6 +20,7 @@ class ReferenceManager: self.reference={} self.save={} self.label=None + self.matchfile='' self.twisswidget={'betax':self.parent.UIBetax,'betay':self.parent.UIBetay, 'alphax':self.parent.UIAlphax,'alphay':self.parent.UIAlphay, @@ -62,6 +65,7 @@ class ReferenceManager: def loadReference(self, filename): with open(filename) as f: self.settings = json.load(f) + self.matchfile=filename self.order={ele['MatchID']:i for i,ele in enumerate(self.settings['Order'])} self.reference=self.settings['Reference'] # this are fixed points in the lattice self.label=self.settings['Label'] @@ -77,6 +81,24 @@ class ReferenceManager: self.save[ID]={'betax':twiss.betx[0],'betay':twiss.bety[0],'alphax':twiss.alfx[0],'alphay':twiss.alfy[0]} print('saving twissvalue for',ID,':',self.save[ID]) + def updateUserVariables(self): + ID = str(self.parent.UIMatchLabel.text()) + print(self.settings['Parameter'][ID]) + + return + # ncol = table.columnCount() + # nrow = table.rowCount() + # content={} + # for irow in range(nrow): + # tag = str(table.item(irow,0).text()) + # content[tag]={} + # for icol in range(1,ncol): + # fld = str(table.item(irow,icol).text()) + # content[tag][icol]=fld + # return content + + + def getMatchingPoint(self): idx = self.parent.UIMatchOrder.currentRow() if idx < 0: @@ -112,6 +134,9 @@ class ReferenceManager: varlist = self.parameter[ID]['Variable'] variable = self.parent.model.getVariableInfo(varlist) + if 'User' in self.parameter[ID]: + for key in self.parameter[ID]['User'].keys(): + variable[key]={'Val':self.parameter[ID]['User'][key],'Max':None} cond = {} targets = self.parameter[ID]['Target'] diff --git a/ui/OpticsToolsGui.py b/ui/OpticsToolsGui.py index 3ad13bd..0a84184 100644 --- a/ui/OpticsToolsGui.py +++ b/ui/OpticsToolsGui.py @@ -416,9 +416,11 @@ class Ui_OpticsGUI(object): self.label_17.setObjectName("label_17") self.gridLayout_5.addWidget(self.label_17, 1, 0, 1, 1) self.UIMatchSequence = QtWidgets.QLineEdit(self.tab_2) + self.UIMatchSequence.setReadOnly(True) self.UIMatchSequence.setObjectName("UIMatchSequence") self.gridLayout_5.addWidget(self.UIMatchSequence, 3, 1, 1, 1) self.UIMatchLabel = QtWidgets.QLineEdit(self.tab_2) + self.UIMatchLabel.setReadOnly(True) self.UIMatchLabel.setObjectName("UIMatchLabel") self.gridLayout_5.addWidget(self.UIMatchLabel, 0, 1, 1, 1) self.label_11 = QtWidgets.QLabel(self.tab_2) @@ -428,12 +430,14 @@ class Ui_OpticsGUI(object): self.label_16.setObjectName("label_16") self.gridLayout_5.addWidget(self.label_16, 0, 0, 1, 1) self.UIMatchStart = QtWidgets.QLineEdit(self.tab_2) + self.UIMatchStart.setReadOnly(True) self.UIMatchStart.setObjectName("UIMatchStart") self.gridLayout_5.addWidget(self.UIMatchStart, 1, 1, 1, 1) self.label_12 = QtWidgets.QLabel(self.tab_2) self.label_12.setObjectName("label_12") self.gridLayout_5.addWidget(self.label_12, 2, 0, 1, 1) self.UIMatchEnd = QtWidgets.QLineEdit(self.tab_2) + self.UIMatchEnd.setReadOnly(True) self.UIMatchEnd.setObjectName("UIMatchEnd") self.gridLayout_5.addWidget(self.UIMatchEnd, 2, 1, 1, 1) self.verticalLayout_7.addLayout(self.gridLayout_5) @@ -481,6 +485,8 @@ class Ui_OpticsGUI(object): self.menuFile.setObjectName("menuFile") self.menuHelp = QtWidgets.QMenu(self.menubar) self.menuHelp.setObjectName("menuHelp") + self.menuMatching = QtWidgets.QMenu(self.menubar) + self.menuMatching.setObjectName("menuMatching") OpticsGUI.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(OpticsGUI) self.statusbar.setObjectName("statusbar") @@ -503,7 +509,6 @@ class Ui_OpticsGUI(object): self.actionMatch.setObjectName("actionMatch") self.actionQuit = QtWidgets.QAction(OpticsGUI) self.actionQuit.setEnabled(True) - self.actionQuit.setShortcut("") self.actionQuit.setObjectName("actionQuit") self.actionExport_Lattice = QtWidgets.QAction(OpticsGUI) self.actionExport_Lattice.setEnabled(True) @@ -591,17 +596,37 @@ class Ui_OpticsGUI(object): self.actionNew_Reference.setObjectName("actionNew_Reference") self.actionSave = QtWidgets.QAction(OpticsGUI) self.actionSave.setObjectName("actionSave") + self.actionExport_Elegant_Lattice = QtWidgets.QAction(OpticsGUI) + self.actionExport_Elegant_Lattice.setObjectName("actionExport_Elegant_Lattice") + self.actionOpen_Matching_Script = QtWidgets.QAction(OpticsGUI) + self.actionOpen_Matching_Script.setObjectName("actionOpen_Matching_Script") + self.actionReloadMatch = QtWidgets.QAction(OpticsGUI) + self.actionReloadMatch.setObjectName("actionReloadMatch") + self.actionOpenMatch = QtWidgets.QAction(OpticsGUI) + self.actionOpenMatch.setObjectName("actionOpenMatch") + self.actionOpenMatchEditor = QtWidgets.QAction(OpticsGUI) + self.actionOpenMatchEditor.setObjectName("actionOpenMatchEditor") + self.actionOpenScriptEditor = QtWidgets.QAction(OpticsGUI) + self.actionOpenScriptEditor.setObjectName("actionOpenScriptEditor") self.menuFile.addAction(self.actionOpen_2) self.menuFile.addAction(self.actionSave) self.menuFile.addSeparator() + self.menuFile.addAction(self.actionExport_Elegant_Lattice) + self.menuFile.addSeparator() self.menuFile.addAction(self.actionQuit) + self.menuFile.addSeparator() self.menuHelp.addAction(self.actionAbout) self.menuHelp.addAction(self.actionHelp) + self.menuMatching.addAction(self.actionOpenMatch) + self.menuMatching.addAction(self.actionReloadMatch) + self.menuMatching.addAction(self.actionOpenMatchEditor) + self.menuMatching.addAction(self.actionOpenScriptEditor) self.menubar.addAction(self.menuFile.menuAction()) + self.menubar.addAction(self.menuMatching.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(OpticsGUI) - self.TabMaster.setCurrentIndex(2) + self.TabMaster.setCurrentIndex(0) self.actionQuit.triggered.connect(OpticsGUI.close) # type: ignore QtCore.QMetaObject.connectSlotsByName(OpticsGUI) @@ -651,7 +676,7 @@ class Ui_OpticsGUI(object): self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_8), _translate("OpticsGUI", "Sandbox")) self.UIMatchSelected.setText(_translate("OpticsGUI", "Match Selected")) self.label_14.setText(_translate("OpticsGUI", "Label")) - self.label_15.setText(_translate("OpticsGUI", "Matching Point Order (Closest Ref. Point)")) + self.label_15.setText(_translate("OpticsGUI", "Matching Order (Closest Reference Point)")) self.UIMatchRandom.setText(_translate("OpticsGUI", "Random Initialization")) self.label_21.setText(_translate("OpticsGUI", "Matching Point")) self.label_17.setText(_translate("OpticsGUI", "Start")) @@ -673,6 +698,7 @@ class Ui_OpticsGUI(object): self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_2), _translate("OpticsGUI", "Matching")) self.menuFile.setTitle(_translate("OpticsGUI", "File")) self.menuHelp.setTitle(_translate("OpticsGUI", "Help")) + self.menuMatching.setTitle(_translate("OpticsGUI", "Matching")) self.actionOpen_2.setText(_translate("OpticsGUI", "Open Settings...")) self.actionOpen_2.setShortcut(_translate("OpticsGUI", "Ctrl+O")) self.actionOpen.setText(_translate("OpticsGUI", "Open Model...")) @@ -688,6 +714,7 @@ class Ui_OpticsGUI(object): self.actionMatch.setText(_translate("OpticsGUI", "Match")) self.actionMatch.setShortcut(_translate("OpticsGUI", "Ctrl+M")) self.actionQuit.setText(_translate("OpticsGUI", "Quit")) + self.actionQuit.setShortcut(_translate("OpticsGUI", "Ctrl+Q")) self.actionExport_Lattice.setText(_translate("OpticsGUI", "Export Lattice...")) self.actionExport_Magnet_Settings.setText(_translate("OpticsGUI", "Export Magnet Settings...")) self.actionAbout.setText(_translate("OpticsGUI", "About...")) @@ -727,3 +754,9 @@ class Ui_OpticsGUI(object): self.actionSave_Reference.setText(_translate("OpticsGUI", "Save Reference")) self.actionNew_Reference.setText(_translate("OpticsGUI", "New Reference")) self.actionSave.setText(_translate("OpticsGUI", "Save Settings...")) + self.actionExport_Elegant_Lattice.setText(_translate("OpticsGUI", "Export Elegant Lattice...")) + self.actionOpen_Matching_Script.setText(_translate("OpticsGUI", "Open Matching Script...")) + self.actionReloadMatch.setText(_translate("OpticsGUI", "Reload Current Matching File")) + self.actionOpenMatch.setText(_translate("OpticsGUI", "Open New Matching File...")) + self.actionOpenMatchEditor.setText(_translate("OpticsGUI", "Open Current Matching File in Editor")) + self.actionOpenScriptEditor.setText(_translate("OpticsGUI", "Open Script in Editor")) diff --git a/ui/OpticsToolsGui.ui b/ui/OpticsToolsGui.ui index a3d6ea1..3e84aeb 100644 --- a/ui/OpticsToolsGui.ui +++ b/ui/OpticsToolsGui.ui @@ -24,7 +24,7 @@ - 2 + 0 @@ -636,7 +636,7 @@ - Matching Point Order (Closest Ref. Point) + Matching Order (Closest Reference Point) @@ -691,10 +691,18 @@ - + + + true + + - + + + true + + @@ -711,7 +719,11 @@ - + + + true + + @@ -721,7 +733,11 @@ - + + + true + + @@ -815,7 +831,10 @@ + + + @@ -824,7 +843,17 @@ + + + Matching + + + + + + + @@ -894,7 +923,7 @@ Quit - + Ctrl+Q @@ -1140,6 +1169,36 @@ Save Settings... + + + Export Elegant Lattice... + + + + + Open Matching Script... + + + + + Reload Current Matching File + + + + + Open New Matching File... + + + + + Open Current Matching File in Editor + + + + + Open Script in Editor + +