Support for various app and slic wrapper
This commit is contained in:
@ -2,3 +2,4 @@ from .snap import getSnap
|
||||
from .save import saveDataset
|
||||
from .load import loadDataset
|
||||
from .elog import writeElog
|
||||
from .slic import SlicScan
|
||||
|
@ -50,7 +50,8 @@ def saveDataset(program,data,actuator=None,snap=None,analysis=None,figures=None)
|
||||
writeSnap(hid,snap)
|
||||
hid.close()
|
||||
|
||||
writeFigure(filename,figures)
|
||||
if figures:
|
||||
writeFigure(filename,figures)
|
||||
return filename
|
||||
|
||||
|
||||
@ -83,6 +84,16 @@ def openDataset(program):
|
||||
|
||||
|
||||
def writeData(hid, data, scanrun=1):
|
||||
# write the sensor raw value
|
||||
for ele in data.keys():
|
||||
name=ele.split(':')
|
||||
if len(name)>1:
|
||||
dset=hid.create_dataset('scan_%d/data/%s/%s' % (scanrun, name[0], name[1]), data=data[ele])
|
||||
else:
|
||||
dset=hid.create_dataset('scan_%d/data/%s' % (scanrun, name[0]), data=data[ele])
|
||||
dset.attrs['system'] = getDatasetSystem(name[0])
|
||||
dset.attrs['units'] = 'unknown'
|
||||
# this part is obsolete - dimension should be given from the individual datasets
|
||||
if not 'pid' in data.keys():
|
||||
return
|
||||
shape = data['pid'].shape
|
||||
@ -95,15 +106,7 @@ def writeData(hid, data, scanrun=1):
|
||||
hid.create_dataset("scan_%d/method/samples" % scanrun,data=[nsam])
|
||||
hid.create_dataset("scan_%d/method/dimension" % scanrun,data=[ndim])
|
||||
hid.create_dataset("scan_%d/method/reducedData" % scanrun,data=[0]) # indicating that there is at least a 2D array for scalar data
|
||||
# write the sensor raw value
|
||||
for ele in data.keys():
|
||||
name=ele.split(':')
|
||||
if len(name)>1:
|
||||
dset=hid.create_dataset('scan_%d/data/%s/%s' % (scanrun, name[0], name[1]), data=data[ele])
|
||||
else:
|
||||
dset=hid.create_dataset('scan_%d/data/%s' % (scanrun, name[0]), data=data[ele])
|
||||
dset.attrs['system'] = getDatasetSystem(name[0])
|
||||
dset.attrs['units'] = 'unknown'
|
||||
|
||||
|
||||
def writeActuator(hid,act,scanrun=1):
|
||||
if not act:
|
||||
|
93
interface/slic.py
Normal file
93
interface/slic.py
Normal file
@ -0,0 +1,93 @@
|
||||
import h5py
|
||||
import numpy as np
|
||||
import time
|
||||
from threading import Thread
|
||||
from PyQt5.QtCore import QObject, pyqtSignal
|
||||
|
||||
# to do:
|
||||
# 1 - check if scan thread is running
|
||||
# 2 - import of BSread data
|
||||
|
||||
from sfbd.interface import getSnap
|
||||
|
||||
class SlicScan(QObject):
|
||||
|
||||
siginc = pyqtSignal(int, int) # signal for increment
|
||||
sigterm = pyqtSignal(int) # signal for termination
|
||||
sigsnap = pyqtSignal(bool)
|
||||
|
||||
def __init__(self):
|
||||
QObject.__init__(self)
|
||||
self.clear()
|
||||
|
||||
def clear(self):
|
||||
self.daq = None
|
||||
self.data = None
|
||||
self.act = None
|
||||
self.snap = None
|
||||
|
||||
def start(self,daq,snap=False):
|
||||
self.clear()
|
||||
Thread(target=self.Tmonitor).start()
|
||||
self.startSnap(snap)
|
||||
|
||||
def startSnap(self,snap=False):
|
||||
if not snap:
|
||||
Thread(target=self.Tsnap).start()
|
||||
|
||||
def Tsnap(self):
|
||||
self.snap = getSnap()
|
||||
self.sigsnap.emit(True)
|
||||
|
||||
def Tmonitor(self):
|
||||
mythread = Thread(target=self.Tscanner).start()
|
||||
time.sleep(1)
|
||||
ostep = -1
|
||||
while(self.daq.running()):
|
||||
istep,nstep=self.daq.status()
|
||||
if istep>ostep:
|
||||
ostep=istep
|
||||
self.siginc.emit(istep,nstep)
|
||||
time.sleep(1)
|
||||
if not mythread == None: # wait till scanning thread is done
|
||||
mythread.join()
|
||||
istep,nstep=self.daq.status()
|
||||
self.siginc.emit(istep,nstep)
|
||||
self.data,self.act = importSlicScan(self.daq.info())
|
||||
if hasattr(self.daq,'auxdata'):
|
||||
self.data.update(self.daq.auxdata)
|
||||
self.sigterm.emit(istep==nstep)
|
||||
|
||||
def Tscanner(self):
|
||||
self.daq.scan()
|
||||
|
||||
def stop(self):
|
||||
self.daq.stop()
|
||||
|
||||
|
||||
def importSlicScan(scan_info):
|
||||
if not isinstance(scan_info,dict):
|
||||
return None,None
|
||||
if not 'scan_files' in scan_info.keys():
|
||||
return None,None
|
||||
sfiles = scan_info['scan_files']
|
||||
data = {}
|
||||
for istep, sfile in enumerate(sfiles):
|
||||
hid = h5py.File(sfile[0],'r')
|
||||
for name, h5obj in hid.items():
|
||||
if isinstance(h5obj,h5py.Dataset): # pv channels
|
||||
data[name] = addDatasetToData(data,name,h5obj)
|
||||
elif isinstance(h5obj,h5py.Group): # bs read channels
|
||||
if 'data' in h5obj:
|
||||
data[name] = addDatasetToData(data,name,h5obj['data'])
|
||||
actuator = {}
|
||||
name = scan_info['scan_parameters']['name'][0]
|
||||
actuator[name]=np.array(scan_info['scan_values'])
|
||||
data[name]=np.array(scan_info['scan_readbacks'])
|
||||
return data,actuator
|
||||
|
||||
def addDatasetToData(data,name,h5obj):
|
||||
if not name in data:
|
||||
return np.array([h5obj[()]])
|
||||
else:
|
||||
return np.append(data[name],np.array([h5obj[()]]),axis=0)
|
Reference in New Issue
Block a user