Initial test of matching

This commit is contained in:
2025-05-14 17:54:00 +02:00
committed by Sven
parent 6d7a794726
commit 99f0fef690
3 changed files with 87 additions and 31 deletions

View File

@@ -2,8 +2,8 @@ import json
varypar={'min:':-1e-6,'max:':1e-6,'preset':0}
def MatchStep(ref,id,end, dest,sequence='SwissFEL',saveTwiss=False):
match={'Reference':ref,'MatchID':id,'End':end, 'Destination':dest,'Sequence':sequence}
def MatchStep(ref,id,end, dest,sequence='SwissFEL',saveTwiss=None):
match={'Reference':ref,'MatchID':id,'End':end, 'Destination':dest,'Sequence':sequence,'Save':saveTwiss}
return match
def MatchParameter(var0,tar0):
@@ -52,7 +52,7 @@ label='Reference'
order = []
order.append(MatchStep('Start', 'Laser Heater','SINLH02','SATBD01'))
order.append(MatchStep(None, 'SINSB04', None,'SATBD01','SINSB04',True))
#order.append(MatchStep('Laser Heater', 'Match to SINSB04','Dependent','Athos'))
order.append(MatchStep('Laser Heater', 'Match to SINSB04','SINSB04','SATBD04'))
#order.append(MatchStep('Laser Heater', 'Bunch Compressor 1','Fixed','Athos'))
#order.append(MatchStep('Bunch Compressor 1', 'Linac 1','Periodic','Athos'))
#order.append(MatchStep('Bunch Compressor 1', 'Match to Linac 1','Dependent','Athos'))
@@ -63,21 +63,16 @@ var = ['SINLH01-MQUA020', 'SINLH01-MQUA040','SINLH01-MQUA050','SINLH01-MQUA070',
parameter['Laser Heater'] = MatchParameter(var,[{'Reference':'Laser Heater'}])
var = ['SINSB04-MQUA130','SINSB04-MQUA230']
parameter['SINSB04'] = MatchParameter(var,[{'Fixed':{'Location':'#e','Twiss':{'MUX':0.2,'MUY':0.2}}}])
var = ['SINLH02-MQUA410','SINLH03-MQUA030','SINLH03-MQUA040','SINLH03-MQUA060','SINLH03-MQUA080','SINSB03-MQUA130']
parameter['Match to SINSB04']=MatchParameter(var,[{'Save':{'Location':'sinsb04$start','SaveID':'SINSB04'}}])
dependence={}
dependence['SINSB04-MQUA230']=['SINSB03-MQUA230']
dependence['S10CB01-MQUA230']=['S20CB02-MQUA230','S10DI01-MQUA120'] + ['S20CB%2.2d-MQUA430' %i for i in range(3,9)]
dependence['S10CB01-MQUA430']=['S20CB02-MQUA430'] + ['S20CB%2.2d-MQUA230' %i for i in range(3,9)]
#periodic={}
#target=[MatchCondition('MUX',0.2,'#e','='), MatchCondition('MUY',0.2,'#e','=')]
#variable = ['SINSB04-MQUA130','SINSB04-MQUA230']
#periodic['SINSB04']=MatchPeriodic('SINSB04',variable,target,{})
#target=[MatchCondition('MUX',0.1883,'#e','='), MatchCondition('MUY',0.1883,'#e','=')]
#variable = ['S10CB01-MQUA230','S10CB01-MQUA430']
#periodic['Linac 1']=MatchPeriodic('S10CB01',variable,target,{})
reference={}
reference['Start'] = MatchReference('start',{'betax':29.971,'alphax':0.003,'betay':26.00,'alphay':-0.288})
reference['Laser Heater'] = MatchReference('sinlh02.mqua410$start',{'betax': 11.2, 'alphax': 3.2,'betay': 0.8, 'alphay': 0.75,})

View File

@@ -169,7 +169,10 @@ class Model:
def match(self):
config = self.parent.reference.getMatchingPoint()
config,ID = self.parent.reference.getMatchingPoint()
if config is None:
return
self.setBranch(config['Destination'])
if config['Reference'] is None:
start='#s'
@@ -198,13 +201,31 @@ class Model:
res,twiss,err=self.madx.match(sequence=config['Sequence'], start=start, end=end,
init=itwiss, var=var, const=conf0,
preset=False,random=False)
print(res)
print(err)
plot = True
if plot:
energy = self.calcEnergyProfile(twiss)
print('Plotting')
self.parent.plot.newData(twiss,energy)
if not config['Save'] == False:
self.parent.reference.saveTwiss(ID,twiss)
self.parent.reference.updateMatchPoint(ID,err)
self.updateModelFromMatching(res)
energy = self.calcEnergyProfile(twiss)
self.parent.plot.newData(twiss,energy)
def updateModelFromMatching(self,var):
for magm in var.keys():
if 'mqua' in magm or 'mqsk' in magm:
mag0 = magm[0:15]
val = var[magm]
ele=self.om.getElement(mag0)
if not ele is None:
ele.k1 = val
print('Updating %s to k1: %8.4f' % (mag0, val))
magnets=self.parent.reference.getDependence(mag0)
if not magnets is None:
for magd in magnets:
ele = self.om.getElement(magd)
if not ele is None:
ele.k1 = val
print('Updating %s to k1: %8.4f' % (magd, val))
##################
# tracking

View File

@@ -16,6 +16,7 @@ class ReferenceManager:
self.parent = parent
self.settings={}
self.reference={}
self.save={}
self.label=None
self.twisswidget={'betax':self.parent.UIBetax,'betay':self.parent.UIBetay,
@@ -28,9 +29,17 @@ class ReferenceManager:
self.loadReference('Settings/Reference.json')
self.parent.UITrackReference.currentIndexChanged.connect(self.updateReferenceWidgets)
#self.parent.UIMatchOrder.itemClicked.connect(self.updateMatchingPoint)
self.parent.UIMatchOrder.itemClicked.connect(self.displayMatchingPoint)
def clearMatching(self):
self.save.clear()
def updateMatchOrder(self):
self.parent.UIMatchOrder.clear()
for i,ele in enumerate(self.settings['Order']):
self.parent.UIMatchOrder.addItem(ele['MatchID'])
self.parent.UIMatchOrder.item(i).setBackground(CBeige)
def loadReference(self, filename):
with open(filename) as f:
@@ -39,18 +48,22 @@ class ReferenceManager:
self.reference=self.settings['Reference']
self.label=self.settings['Label']
self.parameter=self.settings['Parameter']
self.dependence=self.settings['Dependence']
self.save.clear()
self.parent.UIMatchSequenceLabel.setText(self.label)
self.updateReferenceComboBox()
self.updateReferenceWidgets()
self.updateMatchOrder()
def saveTwiss(self, ID, twiss):
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 getMatchingPoint(self):
idx = self.parent.UIMatchOrder.currentRow()
if idx < 0:
return None
return None,None
ID = str(self.parent.UIMatchOrder.item(idx).text())
print('Matching Step Label:', ID)
@@ -76,6 +89,16 @@ class ReferenceManager:
con = {key: {'Val': tar['Fixed']['Twiss'][key], 'Condition': 0} for key in tar['Fixed']['Twiss'].keys()}
target[loc]=con
ncon += len(con.keys())
elif 'Save' in tar.keys():
loc=tar['Save']['Location']
IDsave = tar['Save']['SaveID']
if not IDsave in self.save.keys():
print('Needs first the matching point of',IDsave)
return
con = {key:{'Val': self.save[IDsave][key],'Condition':0} for key in self.save[IDsave].keys()}
target[loc]=con
ncon += len(con.keys())
print('Saved Target',loc,target[loc])
if nvar>ncon:
dummycon={}
for key in order['Reference']['Twiss'].keys():
@@ -84,19 +107,35 @@ class ReferenceManager:
ncon+=1
target['#s']=dummycon
order['Target'] = target
return order
return order, ID
def updateMatchPoint(self,ID,val):
idx = self.order[ID]
if val < 1e-6:
color = CGreen
elif val < 1:
color = CYellow
else:
color = CRed
self.parent.UIMatchOrder.item(idx).setBackground(color)
def getDependence(self,ele):
eletag=ele.upper().replace('.','-')
if eletag in self.dependence.keys():
return [mag.lower().replace('-','.') for mag in self.dependence[eletag]]
else:
return None
#--------------------------------
# match info
def updateMatchOrder(self):
self.parent.UIMatchOrder.clear()
for i,ele in enumerate(self.settings['Order']):
self.parent.UIMatchOrder.addItem(ele['MatchID'])
self.parent.UIMatchOrder.item(i).setBackground(CBeige)
def updateMatchingPoint(self):
def displayMatchingPoint(self):
order,ID = self.getMatchingPoint()
self.parent.UIMatchLabel.setText(ID)
return
def getoldMatchingPoint(self):
idx = self.parent.UIMatchOrder.currentRow()
if idx < 0:
return
@@ -181,7 +220,8 @@ class ReferenceManager:
def getReferenceLocation(self):
return str(self.parent.UITrackLocation.text())
####################################################
###### only relevant for tracking
##### interaction of the tracking reference point
def swithToUserDefinedLocation(self):