def collect(self): if self.data: logger.info('Found leftover data, clearing') self.clear_data() logger.info(f'Starting PPM scan for {self.ppm}') ppm_obj = EpicsSignalRO(self.ppm.upper() + PPM_EXT) #print('getting ', ppm_obj.get()) ppm_obj.wait_for_connection(timeout=1.0) uid = ppm_obj.subscribe(self.data_cb) time.sleep(self.collection_time) # Threading? logger.info('Done collecting PPM data') ppm_obj.unsubscribe(uid)
def ad_prefix(): prefixes = ['13SIM1:', 'XF:31IDA-BI{Cam:Tbl}'] for prefix in prefixes: test_pv = prefix + 'TIFF1:PluginType_RBV' try: sig = EpicsSignalRO(test_pv) sig.wait_for_connection(timeout=2) except TimeoutError: ... else: print('areaDetector detected with prefix:', prefix) return prefix finally: sig.destroy() raise pytest.skip('No areaDetector IOC running')
def ad_prefix(): 'AreaDetector prefix' prefixes = ['13SIM1:', 'XF:31IDA-BI{Cam:Tbl}'] for prefix in prefixes: test_pv = prefix + 'TIFF1:PluginType_RBV' try: sig = EpicsSignalRO(test_pv) sig.wait_for_connection(timeout=2) except TimeoutError: ... else: print('areaDetector detected with prefix:', prefix) return prefix finally: sig.destroy() raise pytest.skip('No areaDetector IOC running')
from ophyd import EpicsSignal from ophyd import EpicsSignalRO from ophyd import EpicsSignalWithRBV from ophyd import PVPositioner from ophyd import Signal import datetime import os import time SECOND = 1 MINUTE = 60 * SECOND HOUR = 60 * MINUTE # write output to log file in userDir, name=MMDD-HHmm-heater-log.txt user_dir = EpicsSignalRO("9idcLAX:userDir", name="user_dir", string=True) user_dir.wait_for_connection() log_file_name = os.path.join( user_dir.get(), datetime.datetime.now().strftime("%m%d-%H%M-heater-log.txt")) # Can't call the instrument package in this module. # Thus, we must re-define these devices here class FeatureMixin(Device): @property def settled(self): return self.done.get() == self.done_value class Linkam_CI94_Device(FeatureMixin, PVPositioner):
class PPM_Record(): def __init__(self, pvname='IM3L0:PPM:SPM:VOLT_BUFFER_RBV', time=1, filename=None): self.collection_time = time self.arr = [] self.pvname = pvname self.sig = EpicsSignalRO(pvname) try: self.sig.wait_for_connection(timeout=3.0) except TimeoutError: print(f'Could not connect to data PV {pvname}, timed out.') print('Either on wrong subnet or the ioc is off.') if filename is not None: self.filename = filename else: self.setFilename() def cb10(self, value, **kwargs): #print('value ',value) # Downsample to 10Hz from 1000Hz for i in range(10): self.arr.append(np.mean(value[100 * i:100 * (i + 1)])) #print('{} values collected'.format(len(self.arr))) def cb100(self, value, **kwargs): # Downsample to 100Hz from 1000Hz for i in range(100): self.arr.append(np.mean(value[10 * i:10 * (i + 1)])) def cb(self, value, **kwargs): self.arr.append(value) def setCollectionTime(self, ctime=None): self.collection_time = ctime def collectData(self, rate=10): if rate == 100: cbid = self.sig.subscribe(self.cb100) elif rate == 10: cbid = self.sig.subscribe(self.cb10) else: cbid = self.sig.subscribe(self.cb) time.sleep(self.collection_time) self.sig.unsubscribe(cbid) def setFilename(self, basename=None, useTime=False): if basename is None: basename = self.pvname.split(':')[0] + '_powermeter_data' if useTime: self.filename = basename + '_{}'.format(int(time.time())) else: self.filename = basename def writeFile(self): #print('saving to {}'.format(self.filename)) with open(self.filename, 'w') as fd: for value in self.arr: print(value, file=fd) #if len(self.arr) == 0: # print('Warning: no data points collected! File is empty!') self.arr = []
def get_motor_pv(label): _pv_signal = EpicsSignalRO(f"{prefix}Kohzu{label}PvSI", name="tmp") _pv_signal.wait_for_connection() return _pv_signal.get(as_string=True)