diff --git a/generateMatchSettings.py b/generateMatchSettings.py
index fd0bfef..05045c1 100644
--- a/generateMatchSettings.py
+++ b/generateMatchSettings.py
@@ -1,26 +1,32 @@
import json
-varypar={'min:':-1e-6,'max:':1e-6,'preset':0}
-def MatchStep(ref,id,end, dest,sequence='SwissFEL',saveTwiss=None):
+def MatchStep(ref,id,end, dest,sequence=None,saveTwiss=None):
match={'Reference':ref,'MatchID':id,'End':end, 'Destination':dest,'Sequence':sequence,'Save':saveTwiss}
return match
-def MatchParameter(var0,tar0):
- var={key: varypar for key in var0}
- tar= tar0
- return {'Variable':var,'Target':tar}
-
-def MatchReference(loc,twiss):
+def MatchReference(loc,twiss,limit=None): # limit 1 -> smaller than, 2 -> larger than (default is euqal)
match ={'Location': loc, 'Twiss': twiss}
+ if not limit is None:
+ match['Limit'] = limit
return match
+def MatchParameter(var0,tar0):
+ return {'Variable':var0,'Target':tar0}
path ="Settings/"
label='Reference'
order = []
+# order of elements:
+# - Match starting point with Twiss, None has no initial condition and starts with #s
+# - ID to find additional parameteters
+# - Last section in tracking/matching. If none it tracks to the end (#e)
+# - destination: selection of branch by giving a unique section name (e.g. SARBD01 for Aramis)
+# - sequence: sequence to use. If it is a list of sequence then a temporary sequence is used. Default to swissfel
+# - flag to last twiss parameters, needed for other routines to refer to.
+
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','SINSB04','SATBD01'))
@@ -31,49 +37,89 @@ order.append(MatchStep('Bunch Compressor 1', 'End of Linac 1','S10BC01','SATBD01
order.append(MatchStep('Bunch Compressor 1', 'Bunch Compressor 2','S10MA01','SATBD01'))
order.append(MatchStep(None, 'Linac 2', None,'SATBD01',['S20CB01','S20CB02'],True))
order.append(MatchStep('Bunch Compressor 2', 'Match to Linac 2','S20CB04','SATBD01'))
-order.append(MatchStep(None, 'Resonant Kicker',None,'SATBD01','S20SY02'))
+order.append(MatchStep('Bunch Compressor 2', 'Match to Switchyard','S20SY02','SATBD01'))
+order.append(MatchStep('Switchyard', 'Resonant Kicker','S20SY02','SATBD01'))
+#order.append(MatchStep('Switchyard', 'Switchyard','SATSY03','SATBD01'))
+
+# list of references with fixed twiss parameters
+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,})
+reference['Bunch Compressor 1'] = MatchReference('sindi02.mqua020$start',{'betax': 11.1557, 'alphax': -1.17,'betay': 50, 'alphay': 0.})
+reference['Bunch Compressor 2'] = MatchReference('s10ma01.mqua020$start',{'betax': 6.14, 'alphax': -0.83,'betay': 22.86, 'alphay': -1.18})
+reference['Switchyard'] = MatchReference('s20sy02$start',{'betax': 48.26, 'alphax': 7.322,'betay': 14.293, 'alphay': -3.513})
+reference['Linac3'] = MatchReference('s30cb10.mqua430$start',{'betax': 8.83,'alphax': 0.548,'betay': 30.44,'alphay': -1.866})
+reference['Aramis Stopper'] = MatchReference('sarma01.mqua010$start',{'betax': 2.304, 'alphax': -1.4045, 'betay': 25.929, 'alphay': -6.363})
+reference['Athos HERO'] = MatchReference('satdi01.mqua250$start',{'betax': 35.76, 'alphax': -1.166,'betay': 24.087, 'alphay': 0.648})
+reference['Athos Deflector'] = MatchReference('satbd01.mqua010$start',{'betax': 50, 'alphax': 0,'betay': 50, 'alphay': 0})
+
+
+
parameter={}
var = ['SINLH01-MQUA020', 'SINLH01-MQUA040','SINLH01-MQUA050','SINLH01-MQUA070','SINLH02-MQUA010']
-parameter['Laser Heater'] = MatchParameter(var,[{'Reference':'Laser Heater'}])
+tar = [reference['Laser Heater']]
+parameter['Laser Heater'] = MatchParameter(var,tar)
var = ['SINSB04-MQUA130','SINSB04-MQUA230']
-parameter['SINSB04'] = MatchParameter(var,[{'Fixed':{'Location':'#e','Twiss':{'MUX':0.2,'MUY':0.2}}}])
+tar =[MatchReference('#e',{'MUX':0.2,'MUY':0.2})]
+parameter['SINSB04'] = MatchParameter(var,tar)
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'}}])
+tar =[{'Location':'sinsb04$start','SavedID':'SINSB04'}]
+parameter['Match to SINSB04']=MatchParameter(var,tar)
var = ['SINBC01-MQUA020','SINBC01-MQUA050','SINBC01-MQUA070','SINBC01-MQUA090','SINBC01-MQUA110','SINDI01-MQUA020','SINDI01-MQUA070']
-parameter['Bunch Compressor 1']=MatchParameter(var,[{'Reference':'Bunch Compressor 1'},
- {'Fixed':{'Location':'sinbc02.mbnd400','Limit':1,'Twiss':{'betax':5.1,'betay':100}}},
- {'Fixed':{'Location':'sinbc01.mqua110$end','Limit':1,'Twiss':{'betax':100}}}])
+tar =[reference['Bunch Compressor 1'],
+ MatchReference('sinbc02.mbnd400',{'betax':5.1,'betay':100},1),
+ MatchReference('sinbc01.mqua110$end',{'betax':100},1)]
+parameter['Bunch Compressor 1']=MatchParameter(var, tar)
var = ['S10CB02-MQUA230','S10CB02-MQUA430']
-parameter['Linac 1'] = MatchParameter(var,[{'Fixed':{'Location':'#e','Twiss':{'MUX':0.1883,'MUY':0.1883}}}])
+tar = [MatchReference('#e',{'MUX':0.1883,'MUY':0.1883})]
+parameter['Linac 1'] = MatchParameter(var, tar)
+
var = ['S10CB01-MQUA230','S10CB01-MQUA430','SINDI02-MQUA020','SINDI02-MQUA030','SINDI02-MQUA050','SINDI02-MQUA060','SINDI02-MQUA090']
-parameter['Match to Linac 1']=MatchParameter(var,[{'Save':{'Location':'s10cb02$start','SaveID':'Linac 1'}}])
+tar =[{'Location':'s10cb02$start','SavedID':'Linac 1'}]
+parameter['Match to Linac 1']=MatchParameter(var,tar)
+
var = ['S10CB07-MQUA430','S10CB08-MQUA230','S10CB08-MQUA430','S10CB09-MQUA230']
-parameter['End of Linac 1']=MatchParameter(var,[{'Fixed':{'Location':'s10bc01.mqua020$start','Twiss':{'betax':4.88,'betay':16.11,'alphax':0.5546,'alphay':-1.81}}}])
+tar = [MatchReference('s10bc01.mqua020$start',{'betax':4.88,'betay':16.11,'alphax':0.5546,'alphay':-1.81})]
+parameter['End of Linac 1']=MatchParameter(var, tar)
+
var = ['S10BC01-MQUA020','S10BC01-MQUA040','S10BC01-MQUA060','S10BC01-MQUA080','S10BC01-MQUA100']
-parameter['Bunch Compressor 2']=MatchParameter(var,[{'Reference':'Bunch Compressor 2'}])
+tar = [reference['Bunch Compressor 2']]
+parameter['Bunch Compressor 2']=MatchParameter(var,tar)
+
+var = ['S20CB01-MQUA430','S20CB02-MQUA430']
+tar = [MatchReference('#e', {'MUX': 0.2, 'MUY': 0.2})]
+parameter['Linac 2'] = MatchParameter(var, tar)
-var = ['S20CB02-MQUA430','S20CB02-MQUA430']
-parameter['Linac 2'] = MatchParameter(var,[{'Fixed':{'Location':'#e','Twiss':{'MUX':0.2,'MUY':0.2}}}])
var = ['S10MA01-MQUA020','S10MA01-MQUA050','S10MA01-MQUA070','S10MA01-MQUA110','S10MA01-MQUA130']
-parameter['Match to Linac 2']=MatchParameter(var,[{'Save':{'Location':'s20cb01$start','SaveID':'Linac 2'}}])
+tar =[{'Location':'s20cb01$start','SavedID':'Linac 2'}]
+parameter['Match to Linac 2']=MatchParameter(var, tar)
-var = ['S20SY02-MQUA070','S20SY02-MQUA100','S20SY02-MQUA140','S20SY02-MQUA180','S20SY02-MKDC010','S20SY02-MKDC020','S20SY02-MKDC030','S20SY02-MKDC040','S20SY02-MKDC050']
-parameter['Resonant Kicker']=MatchParameter(var,[{'Script':{'Location':'File','Script':'Scripts/switchyard.madx'}}])
+var = ['S20SY01-MQUA020','S20SY01-MQUA030','S20SY01-MQUA050','S20SY01-MQUA080']
+tar = [reference['Switchyard']]
+parameter['Match to Switchyard']=MatchParameter(var, tar)
+
+
+var = ['S20SY02-MQUA070','S20SY02-MQUA100','S20SY02-MQUA140','S20SY02-MQUA180','S20SY02-MKDC010','S20SY02-MKAC020','S20SY02-MKDC030','S20SY02-MKAC040','S20SY02-MKDC050']
+tar=[{'Script':'Scripts/switchyard_kicker.madx'}]
+parameter['Resonant Kicker']=MatchParameter(var, tar)
dependence={}
dependence['SINSB04-MQUA230']=['SINSB03-MQUA230']
dependence['S10CB02-MQUA230']=['S10DI01-MQUA120'] + ['S10CB%2.2d-MQUA430' % i for i in range(3,9)]
dependence['S10CB02-MQUA430']=['S10CB%2.2d-MQUA230' % i for i in range(3,9)]
dependence['S20CB01-MQUA430']=['S20CB03-MQUA430']
+dependence['SATSY01-MQUA090']=['SATSY01-MQUA210']
+dependence['SATSY01-MQUA070']=['SATSY01-MQUA230']
+dependence['SATSY01-MQUA040']=['SATSY01-MQUA260']
reference={}
@@ -81,7 +127,7 @@ reference['Start'] = MatchReference('start',{'betax':29.971,'alphax':0.003,'beta
reference['Laser Heater'] = MatchReference('sinlh02.mqua410$start',{'betax': 11.2, 'alphax': 3.2,'betay': 0.8, 'alphay': 0.75,})
reference['Bunch Compressor 1'] = MatchReference('sindi02.mqua020$start',{'betax': 11.1557, 'alphax': -1.17,'betay': 50, 'alphay': 0.})
reference['Bunch Compressor 2'] = MatchReference('s10ma01.mqua020$start',{'betax': 6.14, 'alphax': -0.83,'betay': 22.86, 'alphay': -1.18})
-reference['Switchyard'] = MatchReference('s20sy02.mqua070$start',{'betax': 12.99, 'alphax': 3.7011,'betay': 46.339, 'alphay': -6.501})
+reference['Switchyard'] = MatchReference('s20sy02$start',{'betax': 48.26, 'alphax': 7.322,'betay': 14.293, 'alphay': -3.513})
reference['Linac3'] = MatchReference('s30cb10.mqua430$start',{'betax': 8.83,'alphax': 0.548,'betay': 30.44,'alphay': -1.866})
reference['Aramis Stopper'] = MatchReference('sarma01.mqua010$start',{'betax': 2.304, 'alphax': -1.4045, 'betay': 25.929, 'alphay': -6.363})
reference['Athos HERO'] = MatchReference('satdi01.mqua250$start',{'betax': 35.76, 'alphax': -1.166,'betay': 24.087, 'alphay': 0.648})
diff --git a/model.py b/model.py
index d770e39..6cbb065 100644
--- a/model.py
+++ b/model.py
@@ -4,12 +4,15 @@ import numpy as np
from onlinemodel.core import Facility
from onlinemodel.madx import CMadX
+from sipbuild.generator.outputs.formatters import variable
converttwiss= {'betax':'betx','betay':'bety','alphax':'alfx','alphay':'alfy',
'etax':'dx','etay':'dy','etapx':'dpx','etapy':'dpy','mux':'mux','muy':'muy',
'x':'x','y':'y','px':'px','py':'py','energy':'energy'}
+maxgradient= {'QFF':50.,'QFM':50,'QFD':20,'QFS':20,'QFDM':20,'QFA':31.75,'HFA':37.,'HFB':1445}
+
class Model:
def __init__(self, phase=0, parent=None):
print('Initializing online model ...')
@@ -24,6 +27,7 @@ class Model:
self.energyReference ='SINLH02.MBND100'
# hook up events
+ self.matchplot=True
self.eventHandling()
def eventHandling(self):
@@ -34,6 +38,29 @@ class Model:
def getLatticeVersion(self):
return self.om.Version
+ def getVariableInfo(self,varlist):
+ variable = {}
+ for var in varlist:
+ ele = self.om.getElement(var.replace('-','.'))
+ if ele is None:
+ variable[var]={'Val':0,'Max':None}
+ else:
+ if 'MQUA' in var or 'MQSK' in var or 'MSEX' in var:
+ bg = ele.Baugruppe
+ Brho = self.om.EnergyAt(var.replace('-','.'))[0]/3e8
+ if bg in maxgradient.keys():
+ mgrad=maxgradient[bg]/Brho
+ else:
+ mgrad=None
+ if 'MSEX' in var:
+ variable[var]={'Val':ele.k2,'Max':mgrad}
+ else:
+ variable[var] = {'Val': ele.k1, 'Max': mgrad}
+ else:
+ variable[var]={'Val':0,'Max':None}
+ return variable
+
+
def updateEnergy(self,E0):
if isinstance(E0,list):
E0=E0[0]
@@ -169,28 +196,27 @@ class Model:
def match(self):
- config,ID, status = self.parent.reference.getMatchingPoint()
- if status is False:
+ config = self.parent.reference.getMatchingPoint()
+ if config is False:
return
- self.setBranch(config['Destination'])
- sequence = config['Sequence']
- if isinstance(sequence,list):
- length = [self.om.getSection(ele).LengthRes for ele in sequence]
- sequence =self.madx.buildSequence(sequence,length,'seqcompund')
-
- if config['Reference'] is None:
- start='#s'
- end='#e'
- itwiss=None
+ self.setBranch(config['destination'])
+ sequence = config['sequence']
+ ID = config['ID']
+ start=config['start']['Location']
+ end=config['end']
+ if len(end) == 7:
+ end=end+'$end'
+ if 'Twiss' in config['start']:
+ itwiss = {converttwiss[key.lower()]: config['start']['Twiss'][key] for key in
+ config['start']['Twiss'].keys()}
else:
- start=config['Reference']['Location']
- if start.upper() == 'START':
- start='#s'
- end = config['End']+'$end'
- itwiss = {converttwiss[key.lower()]:config['Reference']['Twiss'][key] for key in config['Reference']['Twiss'].keys()}
+ itwiss = None
+
+
var={}
- random = self.parent.UIMatchRandom.isChecked()
- for key in config['Variable'].keys():
+ nvar=0
+ for key in config['variable'].keys():
+ nvar+=1
key0=key.replace('-','.').lower()
if 'mqua' in key0 or 'mqsk' in key0:
key0+='.k1'
@@ -198,32 +224,64 @@ class Model:
key0+='.k2'
elif 'mkac' in key0 or 'mkdc' in key0:
key0+='.cory'
+ var[key0]=config['variable'][key]
- var[key0]=config['Variable'][key]
- conf0={}
- if 'File' in config['Target'].keys():
- twiss,err=self.madx.callScript(config['Target']['File']['File'],sequence,start,end)
- else:
- for key in config['Target'].keys():
- sconf = config['Target'][key]
- conf0[key] = {converttwiss[key0.lower()]:sconf[key0] for key0 in sconf.keys()}
- res,twiss,err=self.madx.match(sequence=sequence, start=start, end=end,
- init=itwiss, var=var, const=conf0,
- preset=False,random=random)
- if not config['Save'] == False:
+ target = config['target']
+ if 'Script' in target.keys():
+ res,twiss,err = self.madx.callScript(script = target['Script'],sequence=sequence, start=start, end=end,var=var)
+ self.endMatching()
+ return
+
+ ncon = 0
+ condilist = {}
+ for key in target.keys():
+ condi={}
+ for ele in target[key]:
+ if isinstance(ele,tuple):
+ condi[converttwiss[ele[0].lower()]]={'Condition': ele[1],'Val':ele[2]}
+ ncon+=1
+ elif isinstance(ele,str):
+ print('Needs matching results from', ele)
+ return
+ condilist[key]=condi
+ print('Variables:',nvar)
+ print('Conditions:',ncon)
+ if nvar > ncon:
+ print('Adding dummy constraints from initial conditions')
+ if not start in condilist.keys():
+ condilist[start]={}
+ condi={}
+ for twkey in itwiss.keys():
+ if ncon < nvar:
+ condi[twkey]={'Condition':0,'Val':itwiss[twkey]}
+ ncon+=1
+ condilist[start]=condi
+
+ for key in condilist.keys():
+ print(key,condilist[key])
+
+ random = self.parent.UIMatchRandom.isChecked()
+ res,twiss,err=self.madx.match(sequence=sequence, start=start, end=end,
+ init=itwiss, var=var, const=condilist,
+ preset=False,random=random)
+ self.endMatching()
+
+ def endMatching(self):
+ self.updateModelFromMatching(res)
+ if config['save'] == True:
self.parent.reference.saveTwiss(ID,twiss)
self.parent.reference.updateMatchPoint(ID,err)
- #self.updateModelFromMatching(res)
+ if self.matchplot:
+ energy = self.calcEnergyProfile(twiss)
+ self.parent.plot.newData(twiss,energy)
- energy = self.calcEnergyProfile(twiss)
- self.parent.plot.newData(twiss,energy)
def updateModelFromMatching(self,var):
for magm in var.keys():
+ mag0 = magm[0:15]
+ val = var[magm]
+ ele = self.om.getElement(mag0)
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))
@@ -234,8 +292,11 @@ class Model:
if not ele is None:
ele.k1 = val
print('Updating %s to k1: %8.4f' % (magd, val))
-
-
+ elif 'mkac' in magm or 'mkdc' in magm:
+ if not ele is None:
+ ele.design_kick = val
+ ele.cory = val
+ print('Updating %s to design_kick: %8.4f' % (mag0, val))
##################
# tracking
diff --git a/reference.py b/reference.py
index e0948e0..2a6e2f8 100644
--- a/reference.py
+++ b/reference.py
@@ -49,7 +49,7 @@ class ReferenceManager:
with open(filename) as f:
self.settings = json.load(f)
self.order={ele['MatchID']:i for i,ele in enumerate(self.settings['Order'])}
- self.reference=self.settings['Reference']
+ self.reference=self.settings['Reference'] # this are fixed points in the lattice
self.label=self.settings['Label']
self.parameter=self.settings['Parameter']
self.dependence=self.settings['Dependence']
@@ -66,63 +66,69 @@ class ReferenceManager:
def getMatchingPoint(self):
idx = self.parent.UIMatchOrder.currentRow()
if idx < 0:
- return None,None,False
+ return None
- status = True
ID = str(self.parent.UIMatchOrder.item(idx).text())
idx = self.order[ID] # get index in the list
- order = copy.deepcopy(self.settings['Order'][idx]) # getting the specific entry from the order list
- if not order['Reference'] is None: # has a fixed referenc epoint instead of periodic solution
- twiss0 = self.getReferenceByTag(order['Reference']) # get the starting parameters by its reference
- order['Reference'] = twiss0 # put it back into the order variable
- order['Variable'] = self.parameter[ID]['Variable']
- nvar = len(order['Variable'].keys())
- target0= self.parameter[ID]['Target']
- target = {}
- ncon = 0
- for tar in target0:
- if 'Reference' in tar.keys():
- par=self.getReferenceByTag(tar['Reference'])
- loc = par['Location']
- con = {key:{'Val':par['Twiss'][key],'Condition':0} for key in par['Twiss'].keys()}
- target[loc]=con
- ncon += len(con.keys())
- elif 'Script' in tar.keys():
- loc = tar['Script']['Location']
- file = tar['Script']['Script']
- target[loc] = {'File':file} # all condition are in the script
- ncon += 100
- elif 'Fixed' in tar.keys():
- loc=tar['Fixed']['Location']
- if 'Limit' in tar['Fixed'].keys():
- condi = tar['Fixed']['Limit']
+ order = copy.deepcopy(self.settings['Order'][idx])
+ destination = order['Destination']
+ save = order['Save']
+
+ sequence = order['Sequence']
+ if not sequence is None:
+ if isinstance(sequence,str):
+ start = sequence+'$start'
+ end = sequence+'$end'
+ elif isinstance(sequence,list):
+ start = sequence[0]+'$start'
+ end = sequence[-1]+'$end'
+ twiss0 = {'Location': start, 'twiss': {}}
+ else:
+ end = order['End']
+ if end is None:
+ end = '#e'
+ start = order['Reference']
+ if start is None:
+ twiss0 = {'Location':'#s','twiss':{}}
+ else:
+ twiss0 = self.getReferenceByTag(order['Reference'])
+ if twiss0['Location'].upper() == 'START':
+ twiss0['Location']= '#s'
+ sequence='swissfel'
+
+ varlist = self.parameter[ID]['Variable']
+ variable = self.parent.model.getVariableInfo(varlist)
+
+ cond = {}
+ targets = self.parameter[ID]['Target']
+ for target in targets:
+ if 'Location' in target.keys():
+ loc = target['Location']
+ if not loc in cond.keys():
+ cond[loc]=[]
+ if 'Limit' in target.keys():
+ limit = target['Limit']
else:
- condi = 0
- con = {key: {'Val': tar['Fixed']['Twiss'][key], 'Condition': condi} 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)
- status = False
- con = {}
- ncon+=100 # make sure that this will abort any matching and not filled by dummy constraints
- else:
- con = {key:{'Val': self.save[IDsave][key],'Condition':0} for key in self.save[IDsave].keys()}
- ncon += len(con.keys())
- target[loc]=con
- print('Saved Target',loc,target[loc])
- if nvar>ncon:
- dummycon={}
- for key in order['Reference']['Twiss'].keys():
- if ncon < nvar:
- dummycon[key]={'Val':order['Reference']['Twiss'][key],'Condition':0}
- ncon+=1
- target['#s']=dummycon
- order['Target'] = target
- return order, ID, status
+ limit = 0
+ if 'Twiss' in target.keys():
+ for key0 in target['Twiss'].keys():
+ cond[loc].append((key0,limit,target['Twiss'][key0]))
+ elif 'SavedID':
+ if target['SavedID'] in self.save.keys():
+ twisssaved = self.save[target['SavedID']]
+ for twkey in twisssaved.keys():
+ cond[loc].append((twkey,0,twisssaved[twkey]))
+ else:
+ cond[loc].append(target['SavedID'])
+ elif 'Script' in target.keys():
+ cond['Script']=target['Script']
+
+ config={'ID':ID,'start':twiss0,'end':end,
+ 'destination':destination,'sequence':sequence,
+ 'variable':variable,'target':cond,'save':save}
+ return config
+
+
def updateMatchPoint(self,ID,val):
idx = self.order[ID]
@@ -150,42 +156,56 @@ class ReferenceManager:
# match info
def displayMatchingPoint(self):
- order,ID,status = self.getMatchingPoint()
- if status is None:
- return
- self.parent.UIMatchLabel.setText(ID)
- if order['Reference'] is None:
- self.parent.UIMatchStart.setText('Start')
- else:
- self.parent.UIMatchStart.setText(order['Reference']['Location'])
- self.parent.UIMatchKnobs.clear()
- for ele in order['Variable'].keys():
- self.parent.UIMatchKnobs.addItem(ele)
- self.parent.UIMatchTargets.clear()
+ config = self.getMatchingPoint()
+ if config is None:
+ return
+ self.parent.UIMatchLabel.setText(config['ID'])
+ self.parent.UIMatchStart.setText(config['start']['Location'])
+ self.parent.UIMatchEnd.setText(config['end'])
+ self.parent.UIMatchSequence.setText(config['sequence'])
+
+ self.parent.UIMatchKnobs.setColumnCount(3)
+ self.parent.UIMatchKnobs.setRowCount(len(config['variable'].keys()))
+ for i , key in enumerate(config['variable'].keys()):
+ self.parent.UIMatchKnobs.setItem(i, 0, QtWidgets.QTableWidgetItem(key))
+ self.parent.UIMatchKnobs.setItem(i, 1, QtWidgets.QTableWidgetItem('%7.3f' % config['variable'][key]['Val']))
+ arg = config['variable'][key]['Max']
+ if arg is None:
+ self.parent.UIMatchKnobs.setItem(i, 2, QtWidgets.QTableWidgetItem(''))
+ else:
+ self.parent.UIMatchKnobs.setItem(i, 2, QtWidgets.QTableWidgetItem('%7.3f' % arg))
+ self.parent.UIMatchKnobs.resizeColumnsToContents()
+ self.parent.UIMatchKnobs.verticalHeader().hide()
+
self.parent.UIMatchTargets.setColumnCount(2)
self.parent.UIMatchTargets.setRowCount(0)
- irow = 0
- sym=['=','<','>']
- for key0 in order['Target'].keys():
- info = order['Target'][key0]
- for key in info.keys():
- self.parent.UIMatchTargets.insertRow(irow)
- if key == 'File':
- self.parent.UIMatchTargets.setItem(irow, 0, QtWidgets.QTableWidgetItem('Script'))
- self.parent.UIMatchTargets.setItem(irow, 1, QtWidgets.QTableWidgetItem(info['File']))
- else:
- self.parent.UIMatchTargets.setItem(irow, 0, QtWidgets.QTableWidgetItem(key0))
- val = '%7.3f' % info[key]['Val']
- txt = key + sym[info[key]['Condition']] + val.strip()
- self.parent.UIMatchTargets.setItem(irow, 1, QtWidgets.QTableWidgetItem(txt))
- irow+=1
- if irow == 0:
- self.parent.UIMatchTargets.insertRow(irow)
- self.parent.UIMatchTargets.setItem(0, 0, QtWidgets.QTableWidgetItem('Needs previous matching'))
+ if 'Script' in config['target'].keys():
+ self.parent.UIMatchTargets.insertRow(0)
+ self.parent.UIMatchTargets.setItem(0, 0, QtWidgets.QTableWidgetItem('Script'))
+ self.parent.UIMatchTargets.setItem(0, 1, QtWidgets.QTableWidgetItem(config['target']['Script']))
+ else:
+ irow = 0
+ for key in config['target'].keys():
+ for ele in config['target'][key]:
+ self.parent.UIMatchTargets.insertRow(irow)
+ self.parent.UIMatchTargets.setItem(irow, 0, QtWidgets.QTableWidgetItem(key))
+ if isinstance(ele, tuple):
+ fld = self.convertTargetTuple(ele)
+ self.parent.UIMatchTargets.setItem(irow, 1, QtWidgets.QTableWidgetItem(fld))
+ elif isinstance(ele,str):
+ self.parent.UIMatchTargets.setItem(irow, 1, QtWidgets.QTableWidgetItem('Result from: %s ' % ele))
self.parent.UIMatchTargets.resizeColumnsToContents()
self.parent.UIMatchTargets.verticalHeader().hide()
- self.parent.UIMatchTargets.horizontalHeader().hide()
return
+
+ def convertTargetTuple(self,tuple_in):
+ sym = ['=', '<', '>']
+ retval = tuple_in[0]+sym[int(tuple_in[1])]
+ if tuple_in[2] is None:
+ return retval+'undefined'
+ flt = '%7.3f' % tuple_in[2]
+ return retval + flt.strip()
+
#--------------------------------
# obtaining reference data
def getReference(self):
diff --git a/ui/OpticsPlotGui.py b/ui/OpticsPlotGui.py
index e27a0ff..fca8863 100644
--- a/ui/OpticsPlotGui.py
+++ b/ui/OpticsPlotGui.py
@@ -39,57 +39,89 @@ class Ui_OpticsPlotGUI(object):
self.verticalLayout_5.addWidget(self.label_31)
self.gridLayout_4 = QtWidgets.QGridLayout()
self.gridLayout_4.setObjectName("gridLayout_4")
- self.PEtax = QtWidgets.QPushButton(self.widget_2)
- self.PEtax.setCheckable(True)
- self.PEtax.setObjectName("PEtax")
- self.gridLayout_4.addWidget(self.PEtax, 2, 0, 1, 1)
- self.PEtay = QtWidgets.QPushButton(self.widget_2)
- self.PEtay.setCheckable(True)
- self.PEtay.setObjectName("PEtay")
- self.gridLayout_4.addWidget(self.PEtay, 2, 1, 1, 1)
- self.PBetax = QtWidgets.QPushButton(self.widget_2)
- self.PBetax.setCheckable(True)
- self.PBetax.setChecked(True)
- self.PBetax.setObjectName("PBetax")
- self.gridLayout_4.addWidget(self.PBetax, 0, 0, 1, 1)
- self.PR56 = QtWidgets.QPushButton(self.widget_2)
- self.PR56.setCheckable(True)
- self.PR56.setObjectName("PR56")
- self.gridLayout_4.addWidget(self.PR56, 5, 0, 1, 1)
- self.PMux = QtWidgets.QPushButton(self.widget_2)
- self.PMux.setCheckable(True)
- self.PMux.setObjectName("PMux")
- self.gridLayout_4.addWidget(self.PMux, 4, 0, 1, 1)
- self.PMuy = QtWidgets.QPushButton(self.widget_2)
- self.PMuy.setCheckable(True)
- self.PMuy.setObjectName("PMuy")
- self.gridLayout_4.addWidget(self.PMuy, 4, 1, 1, 1)
- self.PAlphax = QtWidgets.QPushButton(self.widget_2)
- self.PAlphax.setCheckable(True)
- self.PAlphax.setObjectName("PAlphax")
- self.gridLayout_4.addWidget(self.PAlphax, 1, 0, 1, 1)
- self.PBetay = QtWidgets.QPushButton(self.widget_2)
- self.PBetay.setCheckable(True)
- self.PBetay.setChecked(True)
- self.PBetay.setObjectName("PBetay")
- self.gridLayout_4.addWidget(self.PBetay, 0, 1, 1, 1)
+ self.PY = QtWidgets.QPushButton(self.widget_2)
+ self.PY.setCheckable(True)
+ self.PY.setObjectName("PY")
+ self.gridLayout_4.addWidget(self.PY, 3, 1, 1, 1)
+ self.PR22 = QtWidgets.QPushButton(self.widget_2)
+ self.PR22.setEnabled(False)
+ self.PR22.setObjectName("PR22")
+ self.gridLayout_4.addWidget(self.PR22, 7, 1, 1, 1)
+ self.PAlphay = QtWidgets.QPushButton(self.widget_2)
+ self.PAlphay.setCheckable(True)
+ self.PAlphay.setObjectName("PAlphay")
+ self.gridLayout_4.addWidget(self.PAlphay, 1, 1, 1, 1)
+ self.PR12 = QtWidgets.QPushButton(self.widget_2)
+ self.PR12.setEnabled(False)
+ self.PR12.setObjectName("PR12")
+ self.gridLayout_4.addWidget(self.PR12, 6, 1, 1, 1)
self.PEnergy = QtWidgets.QPushButton(self.widget_2)
self.PEnergy.setEnabled(True)
self.PEnergy.setCheckable(True)
self.PEnergy.setObjectName("PEnergy")
self.gridLayout_4.addWidget(self.PEnergy, 5, 1, 1, 1)
- self.PAlphay = QtWidgets.QPushButton(self.widget_2)
- self.PAlphay.setCheckable(True)
- self.PAlphay.setObjectName("PAlphay")
- self.gridLayout_4.addWidget(self.PAlphay, 1, 1, 1, 1)
+ self.PMux = QtWidgets.QPushButton(self.widget_2)
+ self.PMux.setCheckable(True)
+ self.PMux.setObjectName("PMux")
+ self.gridLayout_4.addWidget(self.PMux, 4, 0, 1, 1)
+ self.PBetax = QtWidgets.QPushButton(self.widget_2)
+ self.PBetax.setCheckable(True)
+ self.PBetax.setChecked(True)
+ self.PBetax.setObjectName("PBetax")
+ self.gridLayout_4.addWidget(self.PBetax, 0, 0, 1, 1)
+ self.PAlphax = QtWidgets.QPushButton(self.widget_2)
+ self.PAlphax.setCheckable(True)
+ self.PAlphax.setObjectName("PAlphax")
+ self.gridLayout_4.addWidget(self.PAlphax, 1, 0, 1, 1)
+ self.PR56 = QtWidgets.QPushButton(self.widget_2)
+ self.PR56.setCheckable(True)
+ self.PR56.setObjectName("PR56")
+ self.gridLayout_4.addWidget(self.PR56, 5, 0, 1, 1)
+ self.PR33 = QtWidgets.QPushButton(self.widget_2)
+ self.PR33.setEnabled(False)
+ self.PR33.setObjectName("PR33")
+ self.gridLayout_4.addWidget(self.PR33, 8, 0, 1, 1)
+ self.PR34 = QtWidgets.QPushButton(self.widget_2)
+ self.PR34.setEnabled(False)
+ self.PR34.setObjectName("PR34")
+ self.gridLayout_4.addWidget(self.PR34, 8, 1, 1, 1)
+ self.PEtax = QtWidgets.QPushButton(self.widget_2)
+ self.PEtax.setCheckable(True)
+ self.PEtax.setObjectName("PEtax")
+ self.gridLayout_4.addWidget(self.PEtax, 2, 0, 1, 1)
self.PX = QtWidgets.QPushButton(self.widget_2)
self.PX.setCheckable(True)
self.PX.setObjectName("PX")
self.gridLayout_4.addWidget(self.PX, 3, 0, 1, 1)
- self.PY = QtWidgets.QPushButton(self.widget_2)
- self.PY.setCheckable(True)
- self.PY.setObjectName("PY")
- self.gridLayout_4.addWidget(self.PY, 3, 1, 1, 1)
+ self.PEtay = QtWidgets.QPushButton(self.widget_2)
+ self.PEtay.setCheckable(True)
+ self.PEtay.setObjectName("PEtay")
+ self.gridLayout_4.addWidget(self.PEtay, 2, 1, 1, 1)
+ self.PR11 = QtWidgets.QPushButton(self.widget_2)
+ self.PR11.setEnabled(False)
+ self.PR11.setObjectName("PR11")
+ self.gridLayout_4.addWidget(self.PR11, 6, 0, 1, 1)
+ self.PBetay = QtWidgets.QPushButton(self.widget_2)
+ self.PBetay.setCheckable(True)
+ self.PBetay.setChecked(True)
+ self.PBetay.setObjectName("PBetay")
+ self.gridLayout_4.addWidget(self.PBetay, 0, 1, 1, 1)
+ self.PR21 = QtWidgets.QPushButton(self.widget_2)
+ self.PR21.setEnabled(False)
+ self.PR21.setObjectName("PR21")
+ self.gridLayout_4.addWidget(self.PR21, 7, 0, 1, 1)
+ self.PMuy = QtWidgets.QPushButton(self.widget_2)
+ self.PMuy.setCheckable(True)
+ self.PMuy.setObjectName("PMuy")
+ self.gridLayout_4.addWidget(self.PMuy, 4, 1, 1, 1)
+ self.PR43 = QtWidgets.QPushButton(self.widget_2)
+ self.PR43.setEnabled(False)
+ self.PR43.setObjectName("PR43")
+ self.gridLayout_4.addWidget(self.PR43, 9, 0, 1, 1)
+ self.PR44 = QtWidgets.QPushButton(self.widget_2)
+ self.PR44.setEnabled(False)
+ self.PR44.setObjectName("PR44")
+ self.gridLayout_4.addWidget(self.PR44, 9, 1, 1, 1)
self.verticalLayout_5.addLayout(self.gridLayout_4)
self.gridLayout_5 = QtWidgets.QGridLayout()
self.gridLayout_5.setObjectName("gridLayout_5")
@@ -289,18 +321,26 @@ class Ui_OpticsPlotGUI(object):
_translate = QtCore.QCoreApplication.translate
OpticsPlotGUI.setWindowTitle(_translate("OpticsPlotGUI", "SwissFEL Optics"))
self.label_31.setText(_translate("OpticsPlotGUI", "Plotting"))
- self.PEtax.setText(_translate("OpticsPlotGUI", "Etax"))
- self.PEtay.setText(_translate("OpticsPlotGUI", "Etay"))
- self.PBetax.setText(_translate("OpticsPlotGUI", "Betax"))
- self.PR56.setText(_translate("OpticsPlotGUI", "R56"))
- self.PMux.setText(_translate("OpticsPlotGUI", "Mux"))
- self.PMuy.setText(_translate("OpticsPlotGUI", "Muy"))
- self.PAlphax.setText(_translate("OpticsPlotGUI", "Alphax"))
- self.PBetay.setText(_translate("OpticsPlotGUI", "Betay"))
- self.PEnergy.setText(_translate("OpticsPlotGUI", "Energy"))
- self.PAlphay.setText(_translate("OpticsPlotGUI", "AlphaY"))
- self.PX.setText(_translate("OpticsPlotGUI", "X"))
self.PY.setText(_translate("OpticsPlotGUI", "Y"))
+ self.PR22.setText(_translate("OpticsPlotGUI", "R22"))
+ self.PAlphay.setText(_translate("OpticsPlotGUI", "AlphaY"))
+ self.PR12.setText(_translate("OpticsPlotGUI", "R12"))
+ self.PEnergy.setText(_translate("OpticsPlotGUI", "Energy"))
+ self.PMux.setText(_translate("OpticsPlotGUI", "Mux"))
+ self.PBetax.setText(_translate("OpticsPlotGUI", "Betax"))
+ self.PAlphax.setText(_translate("OpticsPlotGUI", "Alphax"))
+ self.PR56.setText(_translate("OpticsPlotGUI", "R56"))
+ self.PR33.setText(_translate("OpticsPlotGUI", "R33"))
+ self.PR34.setText(_translate("OpticsPlotGUI", "R34"))
+ self.PEtax.setText(_translate("OpticsPlotGUI", "Etax"))
+ self.PX.setText(_translate("OpticsPlotGUI", "X"))
+ self.PEtay.setText(_translate("OpticsPlotGUI", "Etay"))
+ self.PR11.setText(_translate("OpticsPlotGUI", "R11"))
+ self.PBetay.setText(_translate("OpticsPlotGUI", "Betay"))
+ self.PR21.setText(_translate("OpticsPlotGUI", "R21"))
+ self.PMuy.setText(_translate("OpticsPlotGUI", "Muy"))
+ self.PR43.setText(_translate("OpticsPlotGUI", "R43"))
+ self.PR44.setText(_translate("OpticsPlotGUI", "R44"))
self.label_22.setText(_translate("OpticsPlotGUI", "Plot Start"))
self.PStart.setText(_translate("OpticsPlotGUI", "0"))
self.label_21.setText(_translate("OpticsPlotGUI", "Plot End"))
diff --git a/ui/OpticsPlotGui.ui b/ui/OpticsPlotGui.ui
index 7a1fc9c..e34e27f 100644
--- a/ui/OpticsPlotGui.ui
+++ b/ui/OpticsPlotGui.ui
@@ -43,20 +43,63 @@
-
-
-
-
+
-
+
- Etax
+ Y
true
- -
-
+
-
+
+
+ false
+
- Etay
+ R22
+
+
+
+ -
+
+
+ AlphaY
+
+
+ true
+
+
+
+ -
+
+
+ false
+
+
+ R12
+
+
+
+ -
+
+
+ true
+
+
+ Energy
+
+
+ true
+
+
+
+ -
+
+
+ Mux
true
@@ -76,36 +119,6 @@
- -
-
-
- R56
-
-
- true
-
-
-
- -
-
-
- Mux
-
-
- true
-
-
-
- -
-
-
- Muy
-
-
- true
-
-
-
-
@@ -116,36 +129,40 @@
- -
-
+
-
+
- Betay
+ R56
true
-
- true
-
- -
-
+
-
+
- true
+ false
- Energy
-
-
- true
+ R33
- -
-
+
-
+
+
+ false
+
- AlphaY
+ R34
+
+
+
+ -
+
+
+ Etax
true
@@ -162,16 +179,79 @@
- -
-
+
-
+
- Y
+ Etay
true
+ -
+
+
+ false
+
+
+ R11
+
+
+
+ -
+
+
+ Betay
+
+
+ true
+
+
+ true
+
+
+
+ -
+
+
+ false
+
+
+ R21
+
+
+
+ -
+
+
+ Muy
+
+
+ true
+
+
+
+ -
+
+
+ false
+
+
+ R43
+
+
+
+ -
+
+
+ false
+
+
+ R44
+
+
+
-
diff --git a/ui/OpticsToolsGui.py b/ui/OpticsToolsGui.py
index a13ecff..7b74c03 100644
--- a/ui/OpticsToolsGui.py
+++ b/ui/OpticsToolsGui.py
@@ -389,34 +389,58 @@ class Ui_OpticsGUI(object):
self.label_17 = QtWidgets.QLabel(self.tab_2)
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.setObjectName("UIMatchSequence")
+ self.gridLayout_5.addWidget(self.UIMatchSequence, 3, 1, 1, 1)
self.UIMatchLabel = QtWidgets.QLineEdit(self.tab_2)
self.UIMatchLabel.setObjectName("UIMatchLabel")
self.gridLayout_5.addWidget(self.UIMatchLabel, 0, 1, 1, 1)
+ self.label_11 = QtWidgets.QLabel(self.tab_2)
+ self.label_11.setObjectName("label_11")
+ self.gridLayout_5.addWidget(self.label_11, 3, 0, 1, 1)
self.label_16 = QtWidgets.QLabel(self.tab_2)
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.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.setObjectName("UIMatchEnd")
+ self.gridLayout_5.addWidget(self.UIMatchEnd, 2, 1, 1, 1)
self.verticalLayout_7.addLayout(self.gridLayout_5)
self.label_19 = QtWidgets.QLabel(self.tab_2)
self.label_19.setObjectName("label_19")
self.verticalLayout_7.addWidget(self.label_19)
- self.UIMatchKnobs = QtWidgets.QListWidget(self.tab_2)
+ self.UIMatchKnobs = QtWidgets.QTableWidget(self.tab_2)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.UIMatchKnobs.sizePolicy().hasHeightForWidth())
self.UIMatchKnobs.setSizePolicy(sizePolicy)
self.UIMatchKnobs.setObjectName("UIMatchKnobs")
+ self.UIMatchKnobs.setColumnCount(3)
+ self.UIMatchKnobs.setRowCount(0)
+ item = QtWidgets.QTableWidgetItem()
+ self.UIMatchKnobs.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.UIMatchKnobs.setHorizontalHeaderItem(1, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.UIMatchKnobs.setHorizontalHeaderItem(2, item)
self.verticalLayout_7.addWidget(self.UIMatchKnobs)
self.label_20 = QtWidgets.QLabel(self.tab_2)
self.label_20.setObjectName("label_20")
self.verticalLayout_7.addWidget(self.label_20)
self.UIMatchTargets = QtWidgets.QTableWidget(self.tab_2)
self.UIMatchTargets.setObjectName("UIMatchTargets")
- self.UIMatchTargets.setColumnCount(0)
+ self.UIMatchTargets.setColumnCount(2)
self.UIMatchTargets.setRowCount(0)
+ item = QtWidgets.QTableWidgetItem()
+ self.UIMatchTargets.setHorizontalHeaderItem(0, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.UIMatchTargets.setHorizontalHeaderItem(1, item)
self.verticalLayout_7.addWidget(self.UIMatchTargets)
self.horizontalLayout_9.addLayout(self.verticalLayout_7)
spacerItem2 = QtWidgets.QSpacerItem(242, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
@@ -603,9 +627,21 @@ class Ui_OpticsGUI(object):
self.UIMatchRandom.setText(_translate("OpticsGUI", "Random Initialization"))
self.label_21.setText(_translate("OpticsGUI", "Matching Point"))
self.label_17.setText(_translate("OpticsGUI", "Start"))
+ self.label_11.setText(_translate("OpticsGUI", "Sequence"))
self.label_16.setText(_translate("OpticsGUI", "Match"))
+ self.label_12.setText(_translate("OpticsGUI", "End"))
self.label_19.setText(_translate("OpticsGUI", "Knobs"))
+ item = self.UIMatchKnobs.horizontalHeaderItem(0)
+ item.setText(_translate("OpticsGUI", "Parameter"))
+ item = self.UIMatchKnobs.horizontalHeaderItem(1)
+ item.setText(_translate("OpticsGUI", "Value"))
+ item = self.UIMatchKnobs.horizontalHeaderItem(2)
+ item.setText(_translate("OpticsGUI", "Limit"))
self.label_20.setText(_translate("OpticsGUI", "Target"))
+ item = self.UIMatchTargets.horizontalHeaderItem(0)
+ item.setText(_translate("OpticsGUI", "Location"))
+ item = self.UIMatchTargets.horizontalHeaderItem(1)
+ item.setText(_translate("OpticsGUI", "Condition"))
self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_2), _translate("OpticsGUI", "Matching"))
self.menuFile.setTitle(_translate("OpticsGUI", "File"))
self.menuHelp.setTitle(_translate("OpticsGUI", "Help"))
diff --git a/ui/OpticsToolsGui.ui b/ui/OpticsToolsGui.ui
index a4ca532..7d5eedd 100644
--- a/ui/OpticsToolsGui.ui
+++ b/ui/OpticsToolsGui.ui
@@ -642,9 +642,19 @@
+ -
+
+
-
+ -
+
+
+ Sequence
+
+
+
-
@@ -655,6 +665,16 @@
-
+ -
+
+
+ End
+
+
+
+ -
+
+
-
@@ -665,13 +685,28 @@
-
-
+
0
0
+
+
+ Parameter
+
+
+
+
+ Value
+
+
+
+
+ Limit
+
+
-
@@ -682,7 +717,18 @@
-
-
+
+
+
+ Location
+
+
+
+
+ Condition
+
+
+