diff --git a/acquisition/scan.py b/acquisition/scan.py index c6dd45c..ee67acb 100755 --- a/acquisition/scan.py +++ b/acquisition/scan.py @@ -93,9 +93,29 @@ class Scans: 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) + s = ScanSimple([adjustable],values,self._default_counters,file_name,Npulses=N_pulses,basepath=self.data_base_dir,scan_info_dir=self.scan_info_dir) if start_immediately: s.scanAll() return s + def rscan(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) + current = adjustable.get_current_value() + values = [[tp+current] for tp in positions] + s = ScanSimple([adjustable],values,self._default_counters,file_name,Npulses=N_pulses,basepath=self.data_base_dir,scan_info_dir=self.scan_info_dir) + if start_immediately: + s.scanAll() + return s + + def dscan(self,*args,**kwargs): + print('Warning: dscan will be deprecated for rscan unless someone explains what it stands for in spec!') + return self.rscan(*args,**kwargs) + + def ascanList(self,adjustable,posList,N_pulses,file_name=None,start_immediately=True): + positions = posList + values = [[tp] for tp in positions] + s = ScanSimple([adjustable],values,self._default_counters,file_name,Npulses=N_pulses,basepath=self.data_base_dir,scan_info_dir=self.scan_info_dir) + if start_immediately: + s.scanAll() + return s diff --git a/timing/lasertiming.py b/timing/lasertiming.py index b81e81e..9e8d843 100644 --- a/timing/lasertiming.py +++ b/timing/lasertiming.py @@ -4,7 +4,8 @@ import numpy as np import time from ..devices_general.utilities import Changer -_basefolder = "/sf/bernina/config/par/lasertiming" + +_basefolder = "/sf/bernina/config/com/data/src/lasertiming" def timeToStr(value,n=12): fmt = "%%+.%df" % n @@ -34,6 +35,8 @@ def niceTimeToStr(delay,fmt="%+.0f"): ret = fmt % (delay*1e12) + "fs" elif 1e-18 <= a_delay < 1e-15: ret = fmt % (delay*1e12) + "as" + elif a_delay < 1e-18: + ret = "0s" else: ret = str(delay) +"s" return ret @@ -117,7 +120,7 @@ _OSCILLATOR_PERIOD = 1/71.368704e6 class Phase_shifter(PV): """ this class is needed to store the offset in files and read in ps """ - def __init__(self,pv_basename="SLAAR01-TSPL-EPL",dial_max=14.05e-9): + def __init__(self,pv_basename="SLAAR01-TSPL-EPL",dial_max=14.0056e-9,precision=100e-15): pvname = pv_basename+":CURR_DELTA_T" PV.__init__(self,pvname) self._filename = os.path.join(_basefolder,pvname) @@ -125,6 +128,7 @@ class Phase_shifter(PV): self._pv_execute = PV(pv_basename + ":SET_NEW_PHASE.PROC") self._storage = Storage(pvname) self.dial_max = dial_max + self.retry = precision @property def offset(self): return self._storage.value @@ -141,7 +145,8 @@ class Phase_shifter(PV): if value == None: value = self.get_dial() self._storage.store( value ) - def move(self,value): + def move(self,value,accuracy=None): + if accuracy is None: accuracy = self.retry dial = value + self.offset dial = np.mod(dial,_OSCILLATOR_PERIOD) if dial > self.dial_max: dial = self.dial_max @@ -149,7 +154,10 @@ class Phase_shifter(PV): self._pv_setvalue.put(dial_ps) time.sleep(0.1) self._pv_execute.put(1) - while( np.abs(self.get_dial()-dial) > 100e-15 ): time.sleep(0.2) + #print(accuracy) + while( np.abs(self.get_dial()-dial) > accuracy ): + #print(np.abs(self.get_dial()-dial)) + time.sleep(0.2) def set(self,value): newoffset = self.get_dial()-value @@ -169,8 +177,6 @@ _phase_shifter = Phase_shifter("SLAAR01-TSPL-EPL") _POCKELS_CELL_RESOLUTION = 7e-9 - - class Lxt(object): def __init__(self): self.sdg1 = _sdg1 @@ -183,10 +189,10 @@ class Lxt(object): def move_sdg(self,value): self.sdg1.move(value) - def move(self,value): + def move(self,value,accuracy=None): self.sdg1.move(-value) self.slicer_gate.move(-value) - self.phase_shifter.move(value) + self.phase_shifter.move(value,accuracy=accuracy) def set(self,value): self.phase_shifter.set(value) @@ -203,25 +209,6 @@ class Lxt(object): delay = int(idx_pulse)*_OSCILLATOR_PERIOD - phase_shifter return -delay - def changeTo(self, value, hold=False): - """ Adjustable convention""" - - changer = lambda value: self.move(\ - value) - return Changer( - target=value, - parent=self, - mover=changer, - hold=hold, - stopper=None) - - - def get_current_value(self): - return self.get() - - def set_current_value(self,value): - self.set(value) - def changeTo(self, value, hold=False): """ Adjustable convention""" @@ -242,7 +229,7 @@ class Lxt(object): self.set(value) def __repr__(self): - delay = niceTimeToStr(self.get()) + delay = niceTimeToStr(lxt.get()) return "delay = %s"%(delay) - +lxt = Lxt()