diff --git a/app/adaptiveorbit.py b/app/adaptiveorbit.py index 3b847fe..7889ac0 100644 --- a/app/adaptiveorbit.py +++ b/app/adaptiveorbit.py @@ -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 diff --git a/app/dispersiontools.py b/app/dispersiontools.py index e13bbcc..c1789a8 100644 --- a/app/dispersiontools.py +++ b/app/dispersiontools.py @@ -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') ######################### diff --git a/interface/slic.py b/interface/slic.py index 51edbe7..a37b814 100644 --- a/interface/slic.py +++ b/interface/slic.py @@ -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() diff --git a/interface/snap.py b/interface/snap.py index c1f7b17..714504b 100644 --- a/interface/snap.py +++ b/interface/snap.py @@ -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"):