Major rework. Testing basic tracking.
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user