Initial test of matching

This commit is contained in:
2025-05-16 17:52:55 +02:00
parent c50448113a
commit 7ee2384dda
7 changed files with 590 additions and 261 deletions

View File

@@ -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):