Initial test of matching
This commit is contained in:
@@ -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,})
|
||||
|
||||
37
model.py
37
model.py
@@ -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
|
||||
|
||||
64
reference.py
64
reference.py
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user