From 3f5b2844062288ca1210c0b4e1a1661b6a562cf7 Mon Sep 17 00:00:00 2001 From: Sven Date: Mon, 19 Jan 2026 16:07:14 +0100 Subject: [PATCH] Optimizing matching procedure for SF+ and reporting matching strengths --- OpticsTools.py | 4 ++-- Scripts/SFPlus/matchAramis.madx | 6 +++--- Scripts/SFPlus/matchAthos.madx | 2 +- issues.txt | 6 +++--- model.py | 5 +++++ ui/OpticsToolsGui.py | 8 ++++---- ui/OpticsToolsGui.ui | 14 +++++++------- 7 files changed, 25 insertions(+), 20 deletions(-) diff --git a/OpticsTools.py b/OpticsTools.py index c7ae160..7cba2dd 100644 --- a/OpticsTools.py +++ b/OpticsTools.py @@ -98,8 +98,8 @@ class OpticsTools(QtWidgets.QMainWindow, QtCore.QObject, Ui_OpticsGUI): if self.UISaveMatchSettings.isChecked(): fileName = self.match.scriptdir+'/settings.json' self.saveSettingsdirect(fileName) - if self.UIReportMatchStrength.isChecked(): - self.model.checkMagnetLimit() + + def updateMatchingCase(self): diff --git a/Scripts/SFPlus/matchAramis.madx b/Scripts/SFPlus/matchAramis.madx index 3d59dbd..4da53af 100644 --- a/Scripts/SFPlus/matchAramis.madx +++ b/Scripts/SFPlus/matchAramis.madx @@ -14,7 +14,7 @@ s20bc01.mqua010.k1:=1.; MATCH,SEQUENCE=Swissfel,range=s20sy02$start/s20bc02$end,beta0=twisssep; VARY,NAME=s20bc01.mqua010.k1,STEP=0.0001; VARY,NAME=s20bc01.mqua030.k1,STEP=0.0001; -VARY,NAME=s20bc01.mqua050.k1,STEP=0.0001; +VARY,NAME=s20bc01.mqua060.k1,STEP=0.0001; CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc02$end,betx<4; CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc02$end,bety<90; CONSTRAINT,SEQUENCE=SwissFEL,range= s20bc01$end,betx<250; @@ -260,7 +260,7 @@ sarcl01.mqua190.k1 := -1.475278354; use,sequence=swissfel; MATCH,SEQUENCE=swissfel,range=s20SY02$start/sarma02$start,beta0=twisssep; -VARY,NAME=sarcl01.mqua020.k1,STEP=0.0001; +VARY,NAME=sarcl01.mqua020.k1,STEP=0.0001,lower=-1., upper =1.; VARY,NAME=sarcl01.mqua050.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua080.k1,STEP=0.0001; VARY,NAME=sarcl01.mqua100.k1,STEP=0.0001; @@ -294,7 +294,7 @@ plot,haxis=s,vaxis=betx,bety,range=S30CB15$START/SARCL02$END,colour=100; !----------------- -muAR=0.17; +muAR=0.16; match,SEQUENCE=swissfel,range=sarun02$start/sarun03$end; Vary,name=sarun02.mqua080.k1,step=0.0001; Vary,name=sarun03.mqua080.k1,step=0.0001; diff --git a/Scripts/SFPlus/matchAthos.madx b/Scripts/SFPlus/matchAthos.madx index 30b25ab..00a2c72 100644 --- a/Scripts/SFPlus/matchAthos.madx +++ b/Scripts/SFPlus/matchAthos.madx @@ -117,7 +117,7 @@ twiss,SEQUENCE=swissfel,range=s20sy02$start/Satsy03.mbnd200,beta0=twisssep; plot,haxis=s,vaxis=betx,bety,range=#s/#e,colour=100; plot,haxis=s,vaxis=dx,dy,range=#s/#e,colour=100; -exit; + MATCH,SEQUENCE=SwissFEL,range=s20sy02$start/satbc01$end,beta0=twisssep; VARY,NAME=satsy03.mqua220.k1,STEP=0.0001; diff --git a/issues.txt b/issues.txt index e29a78b..c32a84b 100644 --- a/issues.txt +++ b/issues.txt @@ -8,11 +8,11 @@ 2) switch between references 3) Allo filter to update quadrupoles to be part of the match scripts and not globally written in the code -# + #) Give feedback on the matching results to GUI #) allow for some progress indication of matching - -# #) Check for maximum gradient for matched values 3) Match for sextupoles! + +#) check why program crashes when matching all 3 beamlines diff --git a/model.py b/model.py index 97f5bf9..807f95a 100644 --- a/model.py +++ b/model.py @@ -33,6 +33,7 @@ class Model: def eventHandling(self): self.parent.UITrack.clicked.connect(self.track) + self.parent.UIReportMagnetStrength.clicked.connect(self.checkMagnetLimit) def forceLatticeUpdate(self): self.forceLat=True @@ -308,6 +309,7 @@ class Model: ########################################3 def checkMagnetLimit(self): # using magnet calibration + self.updateEnergy(140.) quad={} quad['QFA'] = [0.15, 0.173, 150.0, 91.1, 0.0, 0.74521, -0.00813, -0.03542, 22.5e-3] # From MEASUREMENT. Documentation: https://intranet.psi.ch/pub/Swiss_FEL/FinQuadrupoles/QFA.pdf @@ -317,6 +319,7 @@ class Model: 1.0] # From DESIGN(?). Documentation: Injector wiki, Subsystems (as of 14th Aug 2014) quad['QFD'] = [0.15, 0.1628, 10.0, 5.6, 0.0, 0.23313, -27.6e-4, 15.5e-4, 0.011] # From Measurement. Documentation: FEL-SS88-007-7.pdf (found in Alfresco: Company Home > Projects > SwissFEL > Facility > 8850 Magnets) + quad['QFDM'] = quad['QFD'] # same type but weaker windings for corrector quad['QFF'] = [0.08, 0.0875, 10.0, 2.9, 0.0, 0.32897, -0.5e-4, -42.9e-4, 0.006] # From Measurement. Documentation: FEL-SS88-008-8.pdf (found in Alfresco) quad['QFM'] = [0.3, 0.311, 50.0, 21.1, 0.0, 0.64541, -0.00296, -0.00617, 0.011] # From Measurement @@ -345,4 +348,6 @@ class Model: k1max=k1brho[bg]/brho rat=np.abs(ele.k1/k1max)*100. print('%s: %5.1f (percent)' % (ele.Name.replace('.','-'),rat)) + else: + print('%s: Unsupported type %s' % (ele.Name.replace('.','-'),bg)) diff --git a/ui/OpticsToolsGui.py b/ui/OpticsToolsGui.py index c317936..f97199f 100644 --- a/ui/OpticsToolsGui.py +++ b/ui/OpticsToolsGui.py @@ -356,9 +356,6 @@ class Ui_OpticsGUI(object): self.UIInitAllMagnets = QtWidgets.QCheckBox(self.widget) self.UIInitAllMagnets.setObjectName("UIInitAllMagnets") self.verticalLayout_3.addWidget(self.UIInitAllMagnets) - self.UIReportMatchStrength = QtWidgets.QCheckBox(self.widget) - self.UIReportMatchStrength.setObjectName("UIReportMatchStrength") - self.verticalLayout_3.addWidget(self.UIReportMatchStrength) self.label_19 = QtWidgets.QLabel(self.widget) font = QtGui.QFont() font.setBold(True) @@ -383,6 +380,9 @@ class Ui_OpticsGUI(object): item = QtWidgets.QTableWidgetItem() self.UIMatchKnobs.setHorizontalHeaderItem(1, item) self.verticalLayout_3.addWidget(self.UIMatchKnobs) + self.UIReportMagnetStrength = QtWidgets.QPushButton(self.widget) + self.UIReportMagnetStrength.setObjectName("UIReportMagnetStrength") + self.verticalLayout_3.addWidget(self.UIReportMagnetStrength) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem1) self.horizontalLayout_4.addWidget(self.widget) @@ -660,13 +660,13 @@ class Ui_OpticsGUI(object): self.UIMatchAramis.setText(_translate("OpticsGUI", "Aramis")) self.UISaveMatchSettings.setText(_translate("OpticsGUI", "Save matched machine settings automtically")) self.UIInitAllMagnets.setText(_translate("OpticsGUI", "Initialize all magnets to zero before matching")) - self.UIReportMatchStrength.setText(_translate("OpticsGUI", "Report matched quadrupole strength")) self.label_19.setText(_translate("OpticsGUI", "Matching Variables")) self.UIModifyKnobs.setText(_translate("OpticsGUI", "Overwrite default values for matching variables ")) item = self.UIMatchKnobs.horizontalHeaderItem(0) item.setText(_translate("OpticsGUI", "Parameter")) item = self.UIMatchKnobs.horizontalHeaderItem(1) item.setText(_translate("OpticsGUI", "Value")) + self.UIReportMagnetStrength.setText(_translate("OpticsGUI", "Report Matched Quadrupole Strength")) self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_3), _translate("OpticsGUI", "Track")) self.groupBox_8.setTitle(_translate("OpticsGUI", "Magnets (Angle/ k1L / k2L)")) self.label_23.setText(_translate("OpticsGUI", "Start")) diff --git a/ui/OpticsToolsGui.ui b/ui/OpticsToolsGui.ui index 8326cea..099aac8 100644 --- a/ui/OpticsToolsGui.ui +++ b/ui/OpticsToolsGui.ui @@ -581,13 +581,6 @@ - - - - Report matched quadrupole strength - - - @@ -628,6 +621,13 @@ + + + + Report Matched Quadrupole Strength + + +