First working scan

This commit is contained in:
2017-11-25 19:22:24 +01:00
parent b95815b90b
commit 2de58d68d5
4 changed files with 107 additions and 12 deletions
+35
View File
@@ -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()
+25 -6
View File
@@ -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
+45 -5
View File
@@ -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()
+2 -1
View File
@@ -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])