diff --git a/generateMatchSettings.py b/generateMatchSettings.py index fe640bc..cf18906 100644 --- a/generateMatchSettings.py +++ b/generateMatchSettings.py @@ -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,}) diff --git a/model.py b/model.py index 68ba03a..eb47612 100644 --- a/model.py +++ b/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 diff --git a/reference.py b/reference.py index 755de74..bc67668 100644 --- a/reference.py +++ b/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):