diff --git a/acquisition/bs_data.py b/acquisition/bs_data.py index 6c5ef3f..50da211 100755 --- a/acquisition/bs_data.py +++ b/acquisition/bs_data.py @@ -5,6 +5,7 @@ import zmq import os import data_api as api import datetime +from threading import Thread class BStools: @@ -62,6 +63,40 @@ class BStools: data.to_hdf(fina,"/data") + def acquire(self,file_name=None,Npulses=100): + def acquire(file_name=None, Npulses=None): + self.h5(fina=file_name,N_pulses=Npulses) + file_name += '.h5' + return Acquisition(acquire=acquire,acquisition_kwargs={'file_name':file_name, 'Npulses':Npulses},hold=False) + + def wait_done(self): + self.check_running() + self.check_still_running() +class Acquisition: + def __init__(self, parent=None, acquire=None, acquisition_kwargs = {}, hold=True, stopper=None): + self.acquisition_kwargs = acquisition_kwargs + self.file_name = acquisition_kwargs['file_name'] + self._acquire = acquire + self._stopper = stopper + self._thread = Thread(target=self._acquire,kwargs=(acquisition_kwargs)) + if not hold: + self._thread.start() + def wait(self): + self._thread.join() + + def start(self): + self._thread.start() + + def status(self): + if self._thread.ident is None: + return 'waiting' + else: + if self._isAlive: + return 'acquiring' + else: + return 'done' + def stop(self): + self._stopper() diff --git a/acquisition/scan.py b/acquisition/scan.py index 9d95618..8be5db9 100755 --- a/acquisition/scan.py +++ b/acquisition/scan.py @@ -1,10 +1,12 @@ import pyscan import os import json +import numpy as np class ScanSimple: - def __init__(self,adjustables,values,counterCallers,fina,basepath='',scan_info_dir=''): + def __init__(self,adjustables,values,counterCallers,fina,Npulses=100,basepath='',scan_info_dir=''): self.Nsteps = len(values) + self.pulses_per_step = Npulses self.adjustables = adjustables self.values_todo = values self.values_done = [] @@ -26,7 +28,7 @@ class ScanSimple: def get_filename(self,stepNo,Ndigits=4): fina = os.path.join(self.basepath,self.fina) - fina += '_setp%04d.h5'%stepNo + fina += '_step%04d'%stepNo return fina def doNextStep(self,step_info=None): @@ -39,12 +41,16 @@ class ScanSimple: ms.append(adj.changeTo(tv)) for tm in ms: tm.wait() + filenames = [] + acs = [] for ctr in self.counterCallers: - ms.append(ctr.acquire(file_name=fina)) - for tm in ms: - tm.wait() + acq = ctr.acquire(file_name=fina,Npulses=self.pulses_per_step) + filenames.append(acq.file_name) + acs.append(acq) + for ta in acs: + ta.wait() self.values_done.append(self.values_todo.pop(0)) - self.appendScanInfo(values_step,fina,step_info=step_info) + self.appendScanInfo(values_step,filenames,step_info=step_info) self.writeScanInfo() self.nextStep +=1 @@ -65,5 +71,18 @@ class ScanSimple: done = not self.doNextStep() +class Scans: + def __init__(self,data_base_dir='',scan_info_dir='',default_counters=[]): + self.data_base_dir = data_base_dir + self.scan_info_dir = scan_info_dir + self._default_counters = default_counters + + def ascan(self,adjustable,start_pos,end_pos,N_intervals,N_pulses,file_name=None,start_immediately=True): + positions = np.linspace(start_pos,end_pos,N_intervals+1) + values = [[tp] for tp in positions] + s = ScanSimple([adjustable],values,self._default_counters,file_name,Npulses=100,basepath=self.data_base_dir,scan_info_dir=self.scan_info_dir) + if start_immediately: + s.scanAll() + return s diff --git a/devices_general/detectors.py b/devices_general/detectors.py index 20d1652..808d3e3 100755 --- a/devices_general/detectors.py +++ b/devices_general/detectors.py @@ -9,6 +9,7 @@ from bsread import source, SUB import subprocess import h5py from time import sleep +from threading import Thread try: import sys @@ -116,8 +117,7 @@ class FeDigitizer: class DiodeDigitizer: def __init__(self,Id,VME_crate=None,link=None, - ch_0=7,ch_1=8, - elog=None): + ch_0=7,ch_1=8, elog=None): self.Id = Id if VME_crate: self.diode_0 = FeDigitizer('%s:Lnk%dCh%d'%(VME_crate,link,ch_0)) @@ -183,9 +183,6 @@ class JF: else: sleep(time_interval) - - - def start(self): self.client.start() print("start acquisition") @@ -202,3 +199,46 @@ class JF: self.start() pass + def acquire(self,file_name=None,Npulses=100): + def acquire(file_name=None, Npulses=None): + self.detector_config.update(dict(cycles=Npulses)) + self.writer_config.update(dict(output_file=file_name)) + self.reset() + DetectorIntegrationClient.set_config(self,self.writer_config, self.backend_config, self.detector_config) + self.client.start() + self.check_running() + self.check_still_running() + + return Acquisition(acquire=acquire,acquisition_kwargs={'file_name':file_name, 'Npulses':Npulses},hold=False) + + def wait_done(self): + self.check_running() + self.check_still_running() + + +class Acquisition: + def __init__(self, parent=None, acquire=None, acquisition_kwargs = {}, hold=True, stopper=None): + self.acquisition_kwargs = acquisition_kwargs + self._acquire = acquire + self._stopper = stopper + self._thread = Thread(target=self._acquire,kwargs=(acquisition_kwargs)) + if not hold: + self._thread.start() + + def wait(self): + self._thread.join() + + def start(self): + self._thread.start() + + def status(self): + if self._thread.ident is None: + return 'waiting' + else: + if self._isAlive: + return 'acquiring' + else: + return 'done' + def stop(self): + self._stopper() + diff --git a/instruments/bernina.py b/instruments/bernina.py index 209cc8e..e7ab0f0 100755 --- a/instruments/bernina.py +++ b/instruments/bernina.py @@ -86,4 +86,5 @@ channellist = dict(bernina_channel_list= parseChannelListFile('/sf/bernina/config/com/channel_lists/default_channel_list')) bsdaq = BStools(default_channel_list=channellist,default_file_path='%s') -from ..acquisition import scan +from ..acquisition import scan as _scan +scans = _scan.Scans(data_base_dir='/sf/bernina/config/com/data/scan_data',scan_info_dir='/sf/bernina/config/com/data/scan_info',default_counters=[bsdaq])