Example #1
0
 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
Example #2
0
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