After debugging the dispersion tool during machine development shift
This commit is contained in:
@ -27,11 +27,11 @@ class AdaptiveOrbit:
|
||||
idx = '070'
|
||||
if bpm == 5 or bpm ==14:
|
||||
idx='410'
|
||||
self.ATchx.append('SATUN%2.2d-DBPM%s:X1' % (bpm,idx))
|
||||
self.ATchy.append('SATUN%2.2d-DBPM%s:Y1' % (bpm,idx))
|
||||
self.ATchx.append('SATUN%2.2d-DBPM%s:X2' % (bpm,idx))
|
||||
self.ATchy.append('SATUN%2.2d-DBPM%s:Y2' % (bpm,idx))
|
||||
self.bsAT = self.initBSStream([self.ATch0]+self.ATchx+self.ATchy)
|
||||
self.pvAT = self.initPV(self.ATchx)
|
||||
self.kickerAR = self.initPV(['SATMA01-MCRX610:I-SET','SATMA01-MCRY610:I-SET','SATUN05-MCRX420:I-SET','SATUN05-MCRY420:I-SET','SFB_ORBIT_SAT:ONOFF1'])
|
||||
self.kickerAT = self.initPV(['SATMA01-MCRX610:I-SET','SATMA01-MCRY610:I-SET','SATUN05-MCRX420:I-SET','SATUN05-MCRY420:I-SET','SFB_ORBIT_SAT:ONOFF1'])
|
||||
|
||||
# select first beamline
|
||||
self.isAramis = True
|
||||
@ -39,14 +39,7 @@ class AdaptiveOrbit:
|
||||
|
||||
def initBSStream(self,channels):
|
||||
print("Initializing BSstream")
|
||||
bs = BSCache(100000,10000) # 1 second time out, capazity for 100 second.
|
||||
# bs.stop()
|
||||
# for cnl in channels[1:]:
|
||||
# if not is_available(cnl):
|
||||
# raise ValueError(f"BS-Channel {cbl} is not available")
|
||||
# res = make_channel_config(cnl,None,None)
|
||||
# bs.channels[res]=res
|
||||
# bs.get_var(channels[0]) # this starts also the stream into the cache
|
||||
bs = BSCache(100000,100000) # 1000 second time out, capazity for 1000 second.
|
||||
bs.get_vars(channels)
|
||||
return bs
|
||||
|
||||
@ -54,8 +47,11 @@ class AdaptiveOrbit:
|
||||
print("Initializing EPICS Channels")
|
||||
pvs = []
|
||||
for x in chx:
|
||||
pvs.append(PV(x.replace(':X1',':X-REF-FB')))
|
||||
pvs.append(PV(x.replace(':X1',':Y-REF-FB')))
|
||||
if ':X1' in x or ':X2' in x:
|
||||
pvs.append(PV(x.replace(':X1',':X-REF-FB')))
|
||||
pvs.append(PV(x.replace(':X1',':Y-REF-FB')))
|
||||
else:
|
||||
pvs.append(PV(x))
|
||||
con = [pv.wait_for_connection(timeout=0.2) for pv in pvs]
|
||||
for i, val in enumerate(con):
|
||||
if val is False:
|
||||
@ -78,7 +74,7 @@ class AdaptiveOrbit:
|
||||
if beamline == 'Aramis':
|
||||
self.isAramis = True
|
||||
else:
|
||||
self.isAthos = True
|
||||
self.isAramis = False
|
||||
|
||||
# all routine for accessing the machine (read/write)
|
||||
|
||||
@ -100,9 +96,9 @@ class AdaptiveOrbit:
|
||||
if self.isAramis:
|
||||
for i in range(len(fbval)):
|
||||
self.pvAR[i].value = fbval[i]
|
||||
return
|
||||
for i in range(len(fbval)):
|
||||
self.pvAT[i].value = fbval[i]
|
||||
else:
|
||||
for i in range(len(fbval)):
|
||||
self.pvAT[i].value = fbval[i]
|
||||
|
||||
def getPVNames(self):
|
||||
if self.isAramis:
|
||||
@ -120,7 +116,6 @@ class AdaptiveOrbit:
|
||||
return [pv.value for pv in self.kickerAT]
|
||||
|
||||
def setKicker(self,vals):
|
||||
return
|
||||
if self.isAramis:
|
||||
for i,val in enumerate(vals):
|
||||
self.kickerAR[i].value = val
|
||||
|
@ -53,9 +53,10 @@ class Dispersion:
|
||||
self.pgroup='%s/%s' % (dirpath,self.scanname)
|
||||
self.scandir='/sf/data/'+self.pgroup
|
||||
|
||||
self.setBranch('Athos Dump') # enfore Athos dump settings for now
|
||||
self.setBranch(branch) # enfore Athos dump settings for now
|
||||
self.Nsteps = 2
|
||||
self.Nsamples = 1
|
||||
self.bsc = None
|
||||
|
||||
def setBranch(self,branch = 'Aramis'):
|
||||
self.sc = None
|
||||
@ -65,8 +66,11 @@ class Dispersion:
|
||||
self.setupAramis()
|
||||
elif branch == 'Athos':
|
||||
self.setupAthos()
|
||||
elif branch =='Bunch Compressor 2':
|
||||
self.setupBC2()
|
||||
else:
|
||||
self.branch = None
|
||||
return self.branch
|
||||
|
||||
def setup(self,scl = 1, Nsteps=5, Nsamples=10):
|
||||
# the setup is done from the main thread. Therefore I have to define the BSC here
|
||||
@ -74,8 +78,10 @@ class Dispersion:
|
||||
self.Ns= Nsamples
|
||||
self.scale = scl
|
||||
# define stream
|
||||
print('Getting BSCache')
|
||||
self.bsc = BSCache(100000,10000) # 100 second timeout, size for 100 second data taken
|
||||
self.bsc.get_vars(self.sensor) # this starts the stream into the cache
|
||||
print('Getting BSCache done')
|
||||
|
||||
def scan(self):
|
||||
# core routine to do all action. Will be a thread of the slic scanner wrapper
|
||||
@ -97,33 +103,70 @@ class Dispersion:
|
||||
val = self.adj.get_current_value(readback=False)
|
||||
if self.adj2SV:
|
||||
self.adj2 = PVAdjustable(self.adj2SV,pvname_readback = self.adj2RB, accuracy = 0.1,ID = self.adjSV, name = self.name)
|
||||
val2 = self.adj.get_current_value(readback=False)
|
||||
dval = self.amp*scl * 0
|
||||
val2 = self.adj2.get_current_value(readback=False)
|
||||
dval = self.amp*self.scale
|
||||
print(self.adjSV,' - Scan Range:',val-dval,'to',val+dval)
|
||||
if self.adj2SV:
|
||||
print(self.adj2SV,' - Scan Range:',val2+dval,'to',val2-dval)
|
||||
|
||||
# create scanner backend
|
||||
if self.adj2SV:
|
||||
self.sc=self.scanner.a2scan(self.adj, val-dval, val+dval,
|
||||
self.adj2, val+dval, val-dval,
|
||||
self.Ns, # steps
|
||||
self.adj2, val2+dval, val2-dval,
|
||||
n_intervals = self.N-1, # steps
|
||||
n_pulses = self.Ns, # samples
|
||||
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
|
||||
n_intervals = self.N-1, # steps
|
||||
n_pulses = self.Ns, # samples
|
||||
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
|
||||
|
||||
# get aux data first
|
||||
self.auxdata = getAux(self.aux)
|
||||
self.preaction()
|
||||
self.sc.run()
|
||||
self.auxdata = getAux(self.aux)
|
||||
self.postaction()
|
||||
self.bsc.stop() # stop the queue
|
||||
|
||||
|
||||
|
||||
#################################
|
||||
# definition of the individual branches
|
||||
|
||||
def setupBC2(self):
|
||||
# branch and name tag
|
||||
self.branch='Bunch Compressor 2'
|
||||
self.name ='BC2'
|
||||
|
||||
# pre-scan item - needs an adjustment of the dipole current of about 2.3e-3 - to be implemented later.
|
||||
self.pre = {}
|
||||
self.pre['SFB_COMPRESSION_BC2_AR:ONOFF1']={'Val':0,'InitVal':0}
|
||||
self.pre['SFB_COMPRESSION_BC2_AR:ONOFF2']={'Val':0,'InitVal':0}
|
||||
self.pre['SFB_ORBIT_S10:ONOFF1']={'Val':0,'InitVal':0}
|
||||
for pv in self.pre.keys():
|
||||
self.pre[pv]['adj']=PVAdjustable(pv)
|
||||
|
||||
# adjustable
|
||||
self.adjSV = 'S10:SET-E-GAIN-OP'
|
||||
self.adjRB = 'S10:GET-E-GAIN-OP'
|
||||
self.adj2SV = 'S20:SET-E-GAIN-OP' # counter adjustable
|
||||
self.adj2RB = 'S20:GET-E-GAIN-OP'
|
||||
self.amp = 5 # the amplitude of the scan, which can be scaled
|
||||
|
||||
|
||||
# acquisition
|
||||
sensor1 = getBSChannels('S10[BM].*-DBPM.*:[XY]1$')
|
||||
sensor2 = getBSChannels('S1.*-RLLE-DSP:.*-VS$')
|
||||
self.sensor = sensor1+sensor2
|
||||
|
||||
# auxiliar data to be read one
|
||||
self.aux = getRFCalibrationChannels(sensor2,'SINBC02-MBND100:ENERGY-OP')
|
||||
|
||||
def setupAthosDump(self):
|
||||
# branch and name tag
|
||||
self.branch='Athos_Dump'
|
||||
@ -175,12 +218,12 @@ class Dispersion:
|
||||
self.amp = 20 # the amplitude of the scan, which can be scaled
|
||||
|
||||
# acquisition
|
||||
sensor1 = getBSChannels('SAR.*DBPM.*:[XY]1$')
|
||||
sensor1 = getBSChannels('SAR[CMU].*DBPM.*:[XY]1$')
|
||||
sensor2 = getBSChannels('S[23].*-RLLE-DSP:.*-VS$')
|
||||
self.sensor = sensor1+sensor2
|
||||
|
||||
# auxiliar data to be read one
|
||||
self.aux = self.getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP')
|
||||
self.aux = getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP')
|
||||
|
||||
|
||||
def setupAthos(self):
|
||||
@ -204,7 +247,7 @@ class Dispersion:
|
||||
self.adjRB = 'S20:GET-E-GAIN-OP'
|
||||
self.adj2SV = 'S30:SET-E-GAIN-OP' # counter adjustable
|
||||
self.adj2RB = 'S30:GET-E-GAIN-OP'
|
||||
self.amp = 10 # the amplitude of the scan, which can be scaled
|
||||
self.amp = 5 # the amplitude of the scan, which can be scaled
|
||||
|
||||
# acquisition
|
||||
sensor1 = getBSChannels('SAT[SDC].*DBPM.*:[XY]2$')
|
||||
@ -212,7 +255,7 @@ class Dispersion:
|
||||
self.sensor = sensor1+sensor2
|
||||
|
||||
# auxiliar data to be read one
|
||||
self.aux = self.getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP')
|
||||
self.aux = getRFCalibrationChannels(sensor2,'S10BC02-MBND100:ENERGY-OP')
|
||||
|
||||
|
||||
#########################
|
||||
|
@ -31,10 +31,10 @@ class SlicScan(QObject):
|
||||
self.clear()
|
||||
self.doSnap = snap
|
||||
self.daq=daq
|
||||
Thread(target=self.Tmonitor).start()
|
||||
Thread(name='Scan-Monitor',target=self.Tmonitor).start()
|
||||
|
||||
def Tmonitor(self):
|
||||
mythread = Thread(target=self.Tscanner).start()
|
||||
mythread = Thread(name='Slic-Scanner',target=self.Tscanner).start()
|
||||
time.sleep(1)
|
||||
ostep = -1
|
||||
while(self.daq.running()):
|
||||
@ -59,7 +59,7 @@ class SlicScan(QObject):
|
||||
self.daq.scan()
|
||||
|
||||
def startSnap(self):
|
||||
Thread(target=self.Tsnap).start()
|
||||
Thread(name='Snap-Acquisition',target=self.Tsnap).start()
|
||||
|
||||
def Tsnap(self):
|
||||
self.snap = getSnap()
|
||||
|
@ -59,8 +59,7 @@ def getSnap(pvs=None):
|
||||
for i,pv in enumerate(pvs):
|
||||
if val[i]: # filter out None values
|
||||
ret[pv]=float(val[i])
|
||||
epics.ca.clear_cache()
|
||||
|
||||
# epics.ca.clear_cache()
|
||||
return ret
|
||||
|
||||
def saveSnap(pvs={},label="", comment = "generated by application"):
|
||||
|
Reference in New Issue
Block a user