Debugging dispersion and xtcav app plugins

This commit is contained in:
2023-07-26 13:32:43 +02:00
parent 25e717e132
commit fff0c81070
4 changed files with 66 additions and 38 deletions

View File

@ -57,8 +57,6 @@ class Dispersion:
self.Nsteps = 2 self.Nsteps = 2
self.Nsamples = 1 self.Nsamples = 1
def setBranch(self,branch = 'Aramis'): def setBranch(self,branch = 'Aramis'):
self.sc = None self.sc = None
if branch == 'Athos Dump': if branch == 'Athos Dump':
@ -97,29 +95,37 @@ class Dispersion:
# define adjustable # define adjustable
self.adj = PVAdjustable(self.adjSV,pvname_readback = self.adjRB, accuracy = 0.1,ID = self.adjSV, name = self.name) self.adj = PVAdjustable(self.adjSV,pvname_readback = self.adjRB, accuracy = 0.1,ID = self.adjSV, name = self.name)
val = self.adj.get_current_value(readback=False) val = self.adj.get_current_value(readback=False)
# dval = self.amp*scl if self.adj2SV:
# self.values=np.linspace(val-dval,val+dval,num=self.N) self.adj2 = PVAdjustable(self.adj2SV,pvname_readback = self.adj2RB, accuracy = 0.1,ID = self.adjSV, name = self.name)
dval = 0 val2 = self.adj.get_current_value(readback=False)
values = np.linspace(val-dval,val+dval, num = self.N) dval = self.amp*scl * 0
# create scanner backend # create scanner backend
self.sc=self.scanner.ascan_list(self.adj, values, # list of adjustables and their values if self.adj2SV:
filename=self.branch, # relative directory for data self.sc=self.scanner.a2scan(self.adj, val-dval, val+dval,
start_immediately = False, # wait for execution to performe pre-action items self.adj2, val+dval, val-dval,
n_pulses=self.Ns, # steps self.Ns, # steps
return_to_initial_values=True)# return to initial values filename=self.branch, # relative directory for data
start_immediately = False, # wait for execution to performe pre-action items
return_to_initial_values=True) # return to initial values
else:
self.sc=self.scanner.ascan(self.adj, val-dval, val+dval,
self.Ns, # steps
filename=self.branch, # relative directory for data
start_immediately = False, # wait for execution to performe pre-action items
return_to_initial_values=True) # return to initial values
# self.preaction() ###### self.preaction()
self.sc.run() # run scan self.sc.run()
# self.auxdata = getAux(self.aux) self.auxdata = getAux(self.aux)
# self.postaction() ####### self.postaction()
self.bsc.stop() # stop the queue self.bsc.stop() # stop the queue
#################################
# definition of the individual branches
def setupAthosDump(self): def setupAthosDump(self):
# pathes and name tags # branch and name tag
self.branch='Athos_Dump' self.branch='Athos_Dump'
self.name ='SATCB01-Linac' self.name ='SATCB01-Linac'
@ -135,6 +141,8 @@ class Dispersion:
# adjustable # adjustable
self.adjSV = 'SATCB01-RSYS:SET-BEAM-PHASE' self.adjSV = 'SATCB01-RSYS:SET-BEAM-PHASE'
self.adjRB = 'SATCB01-RSYS:GET-BEAM-PHASE' self.adjRB = 'SATCB01-RSYS:GET-BEAM-PHASE'
self.adj2SV = None
self.adj2RB = None
self.amp = 30 # the amplitude of the scan, which can be scaled self.amp = 30 # the amplitude of the scan, which can be scaled
# acquisition # acquisition
@ -145,13 +153,11 @@ class Dispersion:
# auxiliar data to be read one # auxiliar data to be read one
self.aux = getRFCalibrationChannels(sensor2,'SATCL01-MBND100:ENERGY-OP') self.aux = getRFCalibrationChannels(sensor2,'SATCL01-MBND100:ENERGY-OP')
def setupAramis(self): def setupAramis(self):
# branch and name tag
self.branch='Aramis' self.branch='Aramis'
pgroup = '%s-%s' % (self.pgroup,self.branch) self.name = 'Linac3'
self.path = '/sf/data/'+pgroup
# pre-scan item # pre-scan item
self.pre = {} self.pre = {}
self.pre['SFB_BEAM_DUMP_AR:ONOFF1']={'Val':0,'InitVal':0} self.pre['SFB_BEAM_DUMP_AR:ONOFF1']={'Val':0,'InitVal':0}
@ -160,23 +166,28 @@ class Dispersion:
self.pre['SFB_ORBIT_SAR:ONOFF1']={'Val':0,'InitVal':0} self.pre['SFB_ORBIT_SAR:ONOFF1']={'Val':0,'InitVal':0}
for pv in self.pre.keys(): for pv in self.pre.keys():
self.pre[pv]['adj']=PVAdjustable(pv) self.pre[pv]['adj']=PVAdjustable(pv)
# adjustable # adjustable
self.adjSV = 'S30:SET-E-GAIN-OP' self.adjSV = 'S30:SET-E-GAIN-OP'
self.adjRB = 'S30:GET-E-GAIN-OP' self.adjRB = 'S30:GET-E-GAIN-OP'
self.adj = PVAdjustable(self.adjSV,pvname_readback = self.adjRB, accuracy = 0.1,ID = self.adjSV, name = "Linac3") self.adj2SV = None
self.adj2RB = None
self.amp = 20 # the amplitude of the scan, which can be scaled self.amp = 20 # the amplitude of the scan, which can be scaled
# acquisition # acquisition
sensor1 = getBSChannels('SAR.*DBPM.*:[XY]1$') sensor1 = getBSChannels('SAR.*DBPM.*:[XY]1$')
sensor2 = getBSChannels('S[23].*-RLLE-DSP:.*-VS$') sensor2 = getBSChannels('S[23].*-RLLE-DSP:.*-VS$')
self.sensor = sensor1+sensor2 self.sensor = sensor1+sensor2
self.acq = [BSAcquisition(".",pgroup, default_channels=self.sensor)]
# auxiliar data to be read one # auxiliar data to be read one
self.aux = self.getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP') self.aux = self.getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP')
def setupAthos(self): def setupAthos(self):
self.branch='Aramis' # branch and name tag
pgroup = '%s-%s' % (self.pgroup,self.branch) self.branch='Athos'
self.path = '/sf/data/'+pgroup self.name = 'Linac2+3'
# pre-scan item # pre-scan item
self.pre = {} self.pre = {}
self.pre['SFB_BEAM_DUMP_AT:ONOFF1']={'Val':0,'InitVal':0} self.pre['SFB_BEAM_DUMP_AT:ONOFF1']={'Val':0,'InitVal':0}
@ -187,24 +198,25 @@ class Dispersion:
self.pre['SFB_ORBIT_SAT_%2.2d:ONOFF1' % i ]={'Val':0,'InitVal':0} self.pre['SFB_ORBIT_SAT_%2.2d:ONOFF1' % i ]={'Val':0,'InitVal':0}
for pv in self.pre.keys(): for pv in self.pre.keys():
self.pre[pv]['adj']=PVAdjustable(pv) self.pre[pv]['adj']=PVAdjustable(pv)
# adjustable # adjustable
self.adjSV = 'S20:SET-E-GAIN-OP' self.adjSV = 'S20:SET-E-GAIN-OP'
self.adjRB = 'S20:GET-E-GAIN-OP' self.adjRB = 'S20:GET-E-GAIN-OP'
self.adj = PVAdjustable(self.adjSV,pvname_readback = self.adjRB, accuracy = 0.1,ID = self.adjSV, name = "Linac 2 and 3") self.adj2SV = 'S30:SET-E-GAIN-OP' # counter adjustable
# self.adj2SV = 'S30:SET-E-GAIN-OP' self.adj2RB = 'S30:GET-E-GAIN-OP'
# self.adj2RB = 'S30:GET-E-GAIN-OP'
# self.adj2 = PVAdjustable(self.adj2SV,pvname_readback = self.adj2RB, accuracy = 0.1)
# self.adj = CounterAdjustable(self.adj1,self.adj2) # combine the two channels
self.amp = 10 # the amplitude of the scan, which can be scaled self.amp = 10 # the amplitude of the scan, which can be scaled
# acquisition # acquisition
sensor1 = getBSChannels('SAT[SDC].*DBPM.*:[XY]2$') sensor1 = getBSChannels('SAT[SDC].*DBPM.*:[XY]2$')
sensor2 = getBSChannels('S[2].*-RLLE-DSP:.*-VS$') sensor2 = getBSChannels('S[2].*-RLLE-DSP:.*-VS$')
self.sensor = sensor1+sensor2 self.sensor = sensor1+sensor2
self.acq = [BSAcquisition(".",pgroup, default_channels=self.sensor)]
# auxiliar data to be read one # auxiliar data to be read one
self.aux = self.getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP') self.aux = self.getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP')
#########################
# some basic interaction with the scan functionality
def preaction(self): def preaction(self):
@ -215,7 +227,6 @@ class Dispersion:
def postaction(self): def postaction(self):
for key in self.pre.keys(): for key in self.pre.keys():
self.pre[key]['adj'].set_target_value(self.pre[key]['InitVal']) self.pre[key]['adj'].set_target_value(self.pre[key]['InitVal'])
def stop(self): def stop(self):
if self.sc is None: if self.sc is None:
@ -243,7 +254,7 @@ class Dispersion:
#-------------------- #--------------------
# for debugging # main implementation for debugging
if __name__ == '__main__': if __name__ == '__main__':

5
app/runDispersionTools.sh Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
export PYTHONPATH=/sf/bd/packages/slic:/sf/bd/packages/bstrd:$PYTHONPATH
python dispersiontools.py

View File

@ -14,7 +14,9 @@ class XTCAVStabilizer:
# the PV # the PV
self.PVTCAV = PV('SATMA02-RMSM:SM-GET',connection_timeout=0.9, callback=self.stateChanged) self.PVTCAV = PV('SATMA02-RMSM:SM-GET',connection_timeout=0.9, callback=self.stateChanged)
self.state=self.PVTCAV.value == 9 self.state=self.PVTCAV.value == 9
self.PVVolt = PV('SATMA02-RSYS:SET-ACC-VOLT')
self.PVPhase = PV('SATMA02-RSYS:SET-BEAM-PHASE')
# the BS channels # the BS channels
self.bs = BSCache(100000,10000) # 100 second timeout, size for 100 second data taken self.bs = BSCache(100000,10000) # 100 second timeout, size for 100 second data taken
self.channels = ['SATBD02-DBPM040:X2','SATMA02-RLLE-DSP:PHASE-VS','SATBD02-DBPM040:X2-VALID'] self.channels = ['SATBD02-DBPM040:X2','SATMA02-RLLE-DSP:PHASE-VS','SATBD02-DBPM040:X2-VALID']
@ -22,6 +24,15 @@ class XTCAVStabilizer:
self.bs.get_vars(self.channels) # this starts the stream into the cache self.bs.get_vars(self.channels) # this starts the stream into the cache
self.bs.stop() self.bs.stop()
def getPhase(self):
return self.PVPhase.value
def setPhase(self,phi):
self.PVPhase.set(phi)
def getVoltage(self):
return self.PVVolt.value
def stateChanged(self,pvname=None, value=0, **kws): def stateChanged(self,pvname=None, value=0, **kws):
self.state = value == 9 self.state = value == 9

View File

@ -33,7 +33,7 @@ class SlicScan(QObject):
self.daq=daq self.daq=daq
Thread(target=self.Tmonitor).start() Thread(target=self.Tmonitor).start()
def Tmonitor(self): def Tmonitor(self):
mythread = Thread(target=self.Tscanner).start() mythread = Thread(target=self.Tscanner).start()
time.sleep(1) time.sleep(1)
ostep = -1 ostep = -1
@ -63,6 +63,7 @@ class SlicScan(QObject):
def Tsnap(self): def Tsnap(self):
self.snap = getSnap() self.snap = getSnap()
print('Acquired snap')
self.sigsnap.emit(True) self.sigsnap.emit(True)
def stop(self): def stop(self):