mono with ecol scan, callable scan info is possible.

This commit is contained in:
2018-06-08 15:53:41 +02:00
parent e91b076bbc
commit 4d4a53efdc
8 changed files with 131 additions and 21 deletions
+3 -2
View File
@@ -81,10 +81,11 @@ class ScanSimple:
if self.checker:
if not self.checker['checker_call'](*self.checker['args'],**self.checker['kwargs']):
return True
if callable(step_info):
tstepinfo = step_info()
self.values_done.append(self.values_todo.pop(0))
self.readbacks.append(readbacks_step)
self.appendScanInfo(values_step,readbacks_step,step_files=filenames,step_info=step_info)
self.appendScanInfo(values_step,readbacks_step,step_files=filenames,step_info=tstepinfo)
self.writeScanInfo()
self.nextStep +=1
return True
+14 -2
View File
@@ -142,8 +142,8 @@ scansBsreadLocal = _scan.Scans(data_base_dir='/sf/bernina/config/com/data/scan_d
bsdaqJF.gain_file = "/sf/bernina/data/p16582/res/gains_I0.h5"
try:
import glob
path = '/sf/bernina/data/p17247/res/JF_pedestal/pedestal_*_res.h5'
list_of_files = glob.glob('/sf/bernina/data/p17247/res/JF_pedestal/pedestal_*_res.h5')
path = '/sf/bernina/data/p17295/res/JF_pedestal/pedestal_*_res.h5'
list_of_files = glob.glob('/sf/bernina/data/p17295/res/JF_pedestal/pedestal_*_res.h5')
latest_file = max(list_of_files, key=os.path.getctime)
bsdaqJF.pede_file = latest_file
except (Exception, ArithmeticError) as e:
@@ -153,3 +153,15 @@ except (Exception, ArithmeticError) as e:
from ..timing.lasertiming import Lxt as _Lxt
lxt = _Lxt()
from ..xoptics.dcm import MonoEcolEnergy, EcolEnergy
monoEcol = MonoEcolEnergy('SAROP21-ODCM098')
ecol = EcolEnergy('dummy')
if 'eco_path' in list(exp_config.keys()):
pass
else:
eco_path = '/sf/bernina/'+ exp_config['pgroup']
+14 -4
View File
@@ -20,13 +20,23 @@ class Laser_Exp:
#Waveplate and Delay stage
self.wp = MotorRecord(Id+'-M534:MOT')
self._delayStg = MotorRecord(self.Id+'-M521:MOTOR_1')
self.pump_delay = DelayStage(self._delayStg)
self._pump_delayStg = MotorRecord(self.Id+'-M521:MOTOR_1')
self.pump_delay = DelayStage(self._pump_delayStg)
#LAM delay stage
self._lam_delayStg = SmarActRecord('SLAAR21-LMTS-LAM11')
#LAM delay stages
self._lam_delayStg_Smar = SmarActRecord('SLAAR21-LMTS-LAM11')
self.lam_delay_Smar = DelayStage(self._lam_delayStg_Smar)
self._lam_delayStg = MotorRecord(self.Id+'-M548:MOT')
self.lam_delay = DelayStage(self._lam_delayStg)
#PALM delay stages
self._palm_delayStg = MotorRecord(self.Id+'-M552:MOT')
self.palm_delay = DelayStage(self._palm_delayStg)
#PSEN delay stages
#self._psen_delayStg = MotorRecord(self.Id+'')
#self.psen_delay = DelayStage(self._pump_delayStg)
#SmarAct ID
self.IdSA = 'SARES23'
+2 -2
View File
@@ -1,2 +1,2 @@
# Thu May 31 22:39:30 2018
0.001990231000000
# Sun Jun 3 20:42:08 2018
0.001996429730000
+2 -2
View File
@@ -1,2 +1,2 @@
# Sat Mar 17 19:39:21 2018
0.001996429000000
# Sun Jun 3 20:42:08 2018
0.001996429730000
+2 -2
View File
@@ -1,2 +1,2 @@
# Thu May 31 22:39:30 2018
0.000000006999952
# Sun Jun 3 20:42:08 2018
0.000000008499738
+17 -7
View File
@@ -43,6 +43,7 @@ def niceTimeToStr(delay,fmt="%+.0f"):
class Storage(object):
""" this class is needed to store the offset in files and read in s """
def __init__(self,pvname):
self._filename = os.path.join(_basefolder,pvname)
self.pvname = pvname
@@ -79,11 +80,11 @@ class Storage(object):
class Pockels_trigger(PV):
""" this class is needed to store the offset in files and read in s """
def __init__(self,pv_basename):
pvname = pv_basename + "-RB"
def __init__(self, pv_get, pv_set, pv_offset_get=None):
pvname = pv_get
PV.__init__(self,pvname)
self._pv_setvalue = PV(pv_basename + "-SP")
self._pv_offset_get = PV(pv_offset_get)
self._pv_setvalue = PV(pv_set)
self._filename = os.path.join(_basefolder,pvname)
self._storage = Storage(pvname)
@@ -91,7 +92,7 @@ class Pockels_trigger(PV):
def offset(self): return self._storage.value
def get_dial(self):
return np.round(super().get()*1e-6,9)
return np.round(super().get()*1e-6,9)+self._pv_offset_get.get()*1e-9 - 7.41e-9
def get(self):
""" convert time to sec """
@@ -171,8 +172,16 @@ class Phase_shifter(PV):
return "Phase Shifter: user,dial = %s , %s"%(user,dial)
_slicer_gate = Pockels_trigger("SLAAR-LTIM02-EVR0:Pul3-Delay")
_sdg1 = Pockels_trigger("SLAAR-LTIM02-EVR0:Pul2-Delay")
_slicer_gate = Pockels_trigger(
"SLAAR-LTIM02-EVR0:Pul3-Delay-RB",
"SLAAR-LTIM02-EVR0:Pul3_NEW_DELAY",
pv_offset_get="SLAAR-LTIM02-EVR0:UnivDlyModule1-Delay1-RB")
_sdg1 = Pockels_trigger(
"SLAAR-LTIM02-EVR0:Pul2-Delay-RB",
"SLAAR-LTIM02-EVR0:Pul2_NEW_DELAY",
pv_offset_get="SLAAR-LTIM02-EVR0:UnivDlyModule1-Delay0-RB")
_phase_shifter = Phase_shifter("SLAAR02-TSPL-EPL")
@@ -199,6 +208,7 @@ class Lxt(object):
def set(self,value):
self.phase_shifter.set(value)
self.slicer_gate.set(-value)
self.sdg1.set(-value)
def get(self):
+77
View File
@@ -77,3 +77,80 @@ class Double_Crystal_Mono:
def __call__(self,value):
self._currentChange = self.changeTo(value)
class EcolEnergy:
def __init__(self,Id, val='SARCL02-MBND100:P-SET',rb='SARCL02-MBND100:P-READ' ,dmov='SFB_BEAM_ENERGY_ECOL:SUM-ERROR-OK'):
self.Id = Id
self.setter = PV(val)
self.readback = PV(rb)
self.dmov = PV(dmov)
self.done = False
def get_current_value(self):
return self.readback.get()
def move_and_wait(self,value,checktime=.01,precision=2):
curr = self.setter.get()
while abs(curr-value)>0.1:
curr = self.setter.get()
self.setter.put(curr + np.sign(value-curr)*.1)
sleep(0.3)
self.setter.put(value)
while abs(self.get_current_value() - value)>precision:
sleep(checktime)
while not self.dmov.get():
#print(self.dmov.get())
sleep(checktime)
def changeTo(self,value,hold=False):
changer = lambda value: self.move_and_wait(value)
return Changer(
target=value,
parent=self,
changer=changer,
hold=hold,
stopper=None)
class MonoEcolEnergy:
def __init__(self,Id):
self.Id = Id
self.name = 'energy_collimator'
self.dcm = Double_Crystal_Mono(Id)
self.ecol = EcolEnergy('ecol_dummy')
self.offset = None
self.MeVperEV = 0.78333
def get_current_value(self):
return self.dcm.get_current_value()
def move_and_wait(self,value):
ch = [self.dcm.changeTo(value),
self.ecol.changeTo(self.calcEcol(value))]
for tc in ch:
tc.wait()
def changeTo(self,value,hold=False):
changer = lambda value: self.move_and_wait(value)
return Changer(
target=value,
parent=self,
changer=changer,
hold=hold,
stopper=self.dcm.stop)
def alignOffsets(self):
mrb = self.dcm.get_current_value()
erb = self.ecol.get_current_value()
self.offset = {'dcm':mrb, 'ecol':erb}
def calcEcol(self,eV):
return (eV-self.offset['dcm'])*self.MeVperEV + self.offset['ecol']