From 4d4a53efdcfee6bcda31b4701ecccee071ff0818 Mon Sep 17 00:00:00 2001 From: Roman Mankowsky Date: Fri, 8 Jun 2018 15:53:41 +0200 Subject: [PATCH] mono with ecol scan, callable scan info is possible. --- acquisition/scan.py | 5 +- instruments/bernina.py | 16 +++++- loptics/bernina_experiment.py | 18 ++++-- timing/SLAAR-LTIM02-EVR0:Pul2-Delay-RB | 4 +- timing/SLAAR-LTIM02-EVR0:Pul3-Delay-RB | 4 +- timing/SLAAR02-TSPL-EPL:CURR_DELTA_T | 4 +- timing/lasertiming.py | 24 +++++--- xoptics/dcm.py | 77 ++++++++++++++++++++++++++ 8 files changed, 131 insertions(+), 21 deletions(-) diff --git a/acquisition/scan.py b/acquisition/scan.py index 553da58..fa4f102 100755 --- a/acquisition/scan.py +++ b/acquisition/scan.py @@ -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 diff --git a/instruments/bernina.py b/instruments/bernina.py index 52e4ca4..ee9de7c 100755 --- a/instruments/bernina.py +++ b/instruments/bernina.py @@ -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'] diff --git a/loptics/bernina_experiment.py b/loptics/bernina_experiment.py index 55b8b44..d1881f6 100755 --- a/loptics/bernina_experiment.py +++ b/loptics/bernina_experiment.py @@ -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' diff --git a/timing/SLAAR-LTIM02-EVR0:Pul2-Delay-RB b/timing/SLAAR-LTIM02-EVR0:Pul2-Delay-RB index 9e9db53..5e6e0c4 100644 --- a/timing/SLAAR-LTIM02-EVR0:Pul2-Delay-RB +++ b/timing/SLAAR-LTIM02-EVR0:Pul2-Delay-RB @@ -1,2 +1,2 @@ -# Thu May 31 22:39:30 2018 -0.001990231000000 \ No newline at end of file +# Sun Jun 3 20:42:08 2018 +0.001996429730000 \ No newline at end of file diff --git a/timing/SLAAR-LTIM02-EVR0:Pul3-Delay-RB b/timing/SLAAR-LTIM02-EVR0:Pul3-Delay-RB index 985728c..5e6e0c4 100644 --- a/timing/SLAAR-LTIM02-EVR0:Pul3-Delay-RB +++ b/timing/SLAAR-LTIM02-EVR0:Pul3-Delay-RB @@ -1,2 +1,2 @@ -# Sat Mar 17 19:39:21 2018 -0.001996429000000 +# Sun Jun 3 20:42:08 2018 +0.001996429730000 \ No newline at end of file diff --git a/timing/SLAAR02-TSPL-EPL:CURR_DELTA_T b/timing/SLAAR02-TSPL-EPL:CURR_DELTA_T index 8a94216..0557723 100644 --- a/timing/SLAAR02-TSPL-EPL:CURR_DELTA_T +++ b/timing/SLAAR02-TSPL-EPL:CURR_DELTA_T @@ -1,2 +1,2 @@ -# Thu May 31 22:39:30 2018 -0.000000006999952 \ No newline at end of file +# Sun Jun 3 20:42:08 2018 +0.000000008499738 \ No newline at end of file diff --git a/timing/lasertiming.py b/timing/lasertiming.py index 3726076..7d4aebe 100644 --- a/timing/lasertiming.py +++ b/timing/lasertiming.py @@ -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): diff --git a/xoptics/dcm.py b/xoptics/dcm.py index 42a9266..fbc35fc 100755 --- a/xoptics/dcm.py +++ b/xoptics/dcm.py @@ -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'] + + + + +