def __init__(self, expname=None, filepath=None, scanname=None): if not expname: expname = PV(pvPrefix + ':IOC.DESC').get() if ' ' in expname: expname = expname.replace(' ', '_') scanname = PV(pvPrefix + ':SCAN:NAME').get() if ' ' in scanname: scanname = scanname.replace(' ', '_') if scanname: scanname = '_' + scanname #targetname=PV(pvPrefix + ':SCAN:TARGETNAME').get() #if ' ' in targetname: targetname=targetname.replace(' ','_') filepathAutoset = PV(pvPrefix + ':DATA:FILEPATH:AUTOSET').get() if not filepath: if filepathAutoset: if os.environ['NFSHOME']: filepath = (os.environ['NFSHOME'] + '/pvScan/' + expname + '/' + now + scanname + '/') else: filepath = '~/pvScan/' + expname + '/' + now + scanname + '/' PV(pvPrefix + ':DATA:FILEPATH').put(filepath) # Write filepath to PV for display else: filepath = PV(pvPrefix + ':DATA:FILEPATH').get(as_string=True) if not filepath.endswith('/'): filepath = filepath + '/' if ' ' in filepath: filepath = filepath.replace(' ', '_') scanmodePv = PV(pvPrefix + ':SCAN:MODE') scanmode = scanmodePv.get() self.expname = expname self.scanname = scanname #self.targetname = targetname self.targetname = '' self.filepath = filepath self.filepathAutoset = filepathAutoset self.scanflag = PV(pvPrefix + ':SCAN:ENABLE').get() self.preScanflag = PV(pvPrefix + ':SCAN:PRESCAN').get() self.scanmodePv = scanmodePv self.scanmode = scanmode
class BasePv(PV): """BasePv class which inherits from pyEpics PV class.""" def __init__(self, pvname, pvnumber=0, rbv=None): # If no name is entered, raise exception and quit: if not pvname: msgPv.put('Failed: Invalid PV') raise Exception('Invalid PV') PV.__init__(self, pvname) self.pvnumber = pvnumber if rbv: rbv = PV(rbv) self.rbv = rbv self.abort = '' if self.pvname and self.pvnumber: PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':VAL.INP').put(self.pvname + ' CPP') if self.rbv and self.pvnumber: PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':RBV.INP').put(self.rbv.pvname + ' CPP') if self.pvnumber: self.desc = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':DESC').get() if ' ' in self.desc: self.desc = self.desc.replace(' ','_') self.start = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':START').get() self.stop = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':STOP').get() self.nsteps = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':NSTEPS').get() self.inc = (self.stop - self.start)/(self.nsteps - 1) self.randomScanflag = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':RANDSCAN').get() randValStr = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':RAND_VALS').get(as_string=True) if not self.randomScanflag: self.scanPos = [x for x in frange(self.start, self.stop, self.inc)] else: self.scanPos = self.shuffleString(randValStr) self.offset = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':OFFSET').get() self.settletime = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':SETTLETIME').get() self.delta = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':DELTA').get() self.pre_start = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':PRE_START').get() self.pre_stop = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':PRE_STOP').get() self.pre_nsteps = PV(pvPrefix + ':SCANPV' + str(self.pvnumber) + ':PRE_NSTEPS').get() # Test for PV validity: if not self.status: print 'PV object: ', self print 'PV status: ', self.status printMsg('PV %s not valid' % (self.pvname)) #raise Exception('PV %s not valid' % (self.pvname)) def pvWait(self, val, delta=0.005, timeout=180.0): """Wait until PV is near readback (or times out) to proceed.""" try: count = 0 pause = 0.2 while self.rbv.get() != val and count < timeout/pause: if math.fabs(self.rbv.get() - val) <= delta: break sleep(pause) count += 1 except TypeError: print "RBV is invalid for %s, pausing for %f seconds." % (self.pvname,timeout) sleep(timeout) def move(self, val, wait=False, delta=0.005, timeout=300.0): """Put with optional wait.""" PV.put(self,val) if wait or self.rbv: if not self.delta: delta = delta else: delta = self.delta self.pvWait(val, delta, timeout) def shuffleString(self, strng): """Shuffle a string of values into a random list of floats. Comma, semicolon, and whitespace delimiters recognized, as well as start:step:stop ranges.""" lst = re.split(r'[;,\s]\s*', strng) rangePat = re.compile(r'([-+]?\d*\.\d+|\d+):([-+]?\d*\.\d+|\d+):([-+]?\d*\.\d+|\d+)') lst = [expandRange(x) if rangePat.match(x) else x for x in lst] lst = flattenList(lst) lst = [float(x) for x in lst if isNumber(x)] random.shuffle(lst) return lst