Major rework. Testing basic tracking.

This commit is contained in:
2026-01-09 16:40:19 +01:00
parent 0a4bdc335f
commit 7227e30b13
9 changed files with 429 additions and 1073 deletions
+6 -126
View File
@@ -29,12 +29,10 @@ class Model:
# flag to enfore new lattice
self.forceLat=True
# hook up events
self.matchplot=True
self.eventHandling()
def eventHandling(self):
self.parent.UITrack.clicked.connect(self.track)
#self.parent.UIMatchSelected.clicked.connect(self.match)
def forceLatticeUpdate(self):
self.forceLat=True
@@ -45,33 +43,6 @@ class Model:
def getInitialEnergy(self):
return self.om.EnergyAt(self.energyReference)[0]
def getVariableInfo(self,varlist):
variable = {}
for var in varlist:
if isinstance(var,dict):
for key in var.keys():
variable[key] = {'Val':var[key],'Max':None}
continue
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 updateFromMachine(self,machine):
pol = ['LH', 'LV+', 'LV-', 'C+', 'C-', 'ZL']
mag = machine['Magnet']
@@ -180,106 +151,10 @@ class Model:
self.startEnergy = settings['Energy']['energy']
self.energyReference = settings['Energy']['location']
self.startTwiss = settings['InitialCondition']
print(self.startTwiss)
self.updateEnergy(self.startEnergy)
print(settings['Energy']['energy'])
print('Energy in system',self.om.EnergyAt(self.energyReference)[0])
print('Settings loaded (Reference Energy:',self.om.EnergyAt(self.energyReference)[0],')')
self.forceLat=True
##############################33
# tracking
def match(self):
config = self.parent.reference.getMatchingPoint()
if config is False:
return
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:
itwiss = None
var={}
nvar=0
for key in config['variable'].keys():
nvar+=1
key0=key.replace('-','.').lower()
if 'mqua' in key0 or 'mqsk' in key0:
key0+='.k1'
elif 'msex' in key0:
key0+='.k2'
elif 'mkac' in key0 or 'mkdc' in key0:
key0+='.cory'
var[key0]=config['variable'][key]
target = config['target']
if 'Preset' in target:
self.updateModelFromMatching(target['Preset'])
self.parent.reference.updateMatchPoint(ID, 0)
return
if 'Script' in target.keys():
print(var)
res,twiss,err = self.madx.callScript(script = target['Script'],sequence=sequence, start=start, end=end,init=itwiss,var=var,preset=True)
self.updateModelFromMatching(res)
self.parent.reference.updateMatchPoint(ID, err)
if self.matchplot:
energy = self.calcEnergyProfile(twiss)
self.parent.plot.newData(twiss, energy)
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.updateModelFromMatching(res)
if config['save'] == True:
self.parent.reference.saveTwiss(ID,twiss)
self.parent.reference.updateMatchPoint(ID,err)
if self.matchplot:
energy = self.calcEnergyProfile(twiss)
self.parent.plot.newData(twiss,energy)
def updateModelFromMatching(self,var):
for magm in var.keys():
mag0 = magm[0:15]
@@ -301,6 +176,7 @@ class Model:
ele.design_kick = val
ele.cory = val
print('Updating %s to design_kick: %8.4f' % (mag0, val))
##################
# tracking
@@ -313,8 +189,12 @@ class Model:
end = end[0:7]
refloc, twiss0 = self.parent.reference.getReference()
if 'SWISSFEL' in refloc.upper():
refloc = 'SINLH01$START'
if refloc.upper() == 'START':
refloc = start.upper()
if self.startEnergy is None:
self.startEnergy = self.om.EnergyAt(self.energyReference)[0]*1e-6
twiss0['energy'] = self.startEnergy*1e-3 # convert to GeV for madx
start, end = self.checkRange(start, end, refloc[0:7])
if start is None: