From e221c9a5d56bcf68d05f21b749cda7ce0909ca7f Mon Sep 17 00:00:00 2001 From: jmcchesn <jmcchesn@aps.anl.gov> Date: Tue, 12 Jul 2022 16:26:29 -0500 Subject: [PATCH] mpa new class --- build/lib/iexcode/instruments/AD_utilities.py | 2 +- build/lib/iexcode/instruments/ARPES.py | 12 +- build/lib/iexcode/instruments/FMB_mirrors.py | 4 - .../iexcode/instruments/IEX_endstations.py | 32 +- build/lib/iexcode/instruments/Kappa.py | 55 +- build/lib/iexcode/instruments/Kappa_Euler.py | 2 +- build/lib/iexcode/instruments/Kappa_det.py | 10 +- build/lib/iexcode/instruments/Motors.py | 5 +- build/lib/iexcode/instruments/beamline.py | 24 +- .../iexcode/instruments/electron_analyzer.py | 54 +- build/lib/iexcode/instruments/logfile.py | 8 +- build/lib/iexcode/instruments/mpa.py | 750 +++++++++--------- build/lib/iexcode/instruments/resolution.py | 28 +- build/lib/iexcode/instruments/staff.py | 4 - build/lib/iexcode/instruments/xrays.py | 62 +- iexcode.egg-info/SOURCES.txt | 2 +- iexcode/instruments/AD_utilities.py | 2 +- iexcode/instruments/ARPES.py | 12 +- iexcode/instruments/FMB_mirrors.py | 4 - iexcode/instruments/IEX_endstations.py | 32 +- iexcode/instruments/Kappa.py | 55 +- iexcode/instruments/Kappa_Euler.py | 2 +- iexcode/instruments/Kappa_det.py | 10 +- iexcode/instruments/Motors.py | 5 +- .../__pycache__/AD_utilities.cpython-37.pyc | Bin 11482 -> 11492 bytes .../__pycache__/ARPES.cpython-37.pyc | Bin 22012 -> 22122 bytes .../__pycache__/FMB_mirrors.cpython-37.pyc | Bin 5479 -> 5342 bytes .../IEX_endstations.cpython-37.pyc | Bin 3164 -> 2849 bytes .../__pycache__/Kappa.cpython-37.pyc | Bin 30320 -> 30594 bytes .../__pycache__/Kappa_Euler.cpython-37.pyc | Bin 3978 -> 3967 bytes .../__pycache__/Kappa_det.cpython-37.pyc | Bin 2325 -> 2336 bytes .../__pycache__/Motors.cpython-37.pyc | Bin 6871 -> 6937 bytes .../__pycache__/beamline.cpython-37.pyc | Bin 2570 -> 2248 bytes .../electron_analyzer.cpython-37.pyc | Bin 23058 -> 22988 bytes .../__pycache__/logfile.cpython-37.pyc | Bin 4639 -> 4460 bytes .../__pycache__/mpa.cpython-37.pyc | Bin 11343 -> 12164 bytes .../__pycache__/resolution.cpython-37.pyc | Bin 3831 -> 4809 bytes .../__pycache__/staff.cpython-37.pyc | Bin 2083 -> 2083 bytes .../__pycache__/xrays.cpython-37.pyc | Bin 18992 -> 18094 bytes iexcode/instruments/beamline.py | 24 +- iexcode/instruments/electron_analyzer.py | 54 +- iexcode/instruments/logfile.py | 8 +- iexcode/instruments/mpa.py | 750 +++++++++--------- iexcode/instruments/resolution.py | 28 +- iexcode/instruments/scratch.py | 44 - iexcode/instruments/staff.py | 4 - iexcode/instruments/xrays.py | 62 +- 47 files changed, 1035 insertions(+), 1115 deletions(-) delete mode 100644 iexcode/instruments/scratch.py diff --git a/build/lib/iexcode/instruments/AD_utilities.py b/build/lib/iexcode/instruments/AD_utilities.py index f8d43d2..15dd0a0 100644 --- a/build/lib/iexcode/instruments/AD_utilities.py +++ b/build/lib/iexcode/instruments/AD_utilities.py @@ -13,7 +13,7 @@ from os.path import join, isfile, exists, dirname from time import sleep from epics import caget, caput -from iexcode.instruments.IEX_endstations import * +from iexcode.instruments.IEX_endstations import BL from iexcode.instruments.files_and_folders import get_next_fileNumber diff --git a/build/lib/iexcode/instruments/ARPES.py b/build/lib/iexcode/instruments/ARPES.py index 90f825f..a2337c0 100644 --- a/build/lib/iexcode/instruments/ARPES.py +++ b/build/lib/iexcode/instruments/ARPES.py @@ -3,7 +3,7 @@ from time import sleep from epics import caget,caput,PV -from iexcode.instruments.IEX_endstations import * +from iexcode.instruments.IEX_endstations import Endstation from iexcode.instruments.staff import staff_detector_dictionary from iexcode.instruments.files_and_folders import check_run,make_user_folders,folder_mda @@ -12,11 +12,12 @@ from iexcode.instruments.logfile import logfile_name_set,logfile_header from iexcode.instruments.conversions_constants import * from iexcode.instruments.utilities import * + from iexcode.instruments.userCalcs import userStringSeq_clear, userStringSeq_pvs +from iexcode.instruments.scanRecord import ScanRecord +from iexcode.instruments.xrays import xrays_detector_dictionary,xrays_reset,xrays_get_all -from iexcode.instruments.scanRecord import * -from iexcode.instruments.Motors import * -from iexcode.instruments.xrays import * +from iexcode.instruments.Motors import Motors from iexcode.instruments.current_amplifiers import * from iexcode.instruments.gate_valves import valve_close, branch_valves from iexcode.instruments.shutters import branch_shutter_close @@ -47,7 +48,8 @@ def ARPES_init(set_folders=True,reset=True,**kwargs): #endstation global BL - BL=Endstation('ARPES',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord) + BL=Endstation('ARPES',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord, + ARPES_log_header,ARPES_log_entries,ARPES_motor_dictionary) #EA try: diff --git a/build/lib/iexcode/instruments/FMB_mirrors.py b/build/lib/iexcode/instruments/FMB_mirrors.py index 888d9b9..083b9e6 100644 --- a/build/lib/iexcode/instruments/FMB_mirrors.py +++ b/build/lib/iexcode/instruments/FMB_mirrors.py @@ -4,7 +4,6 @@ from epics import caget, caput from iexcode.instruments.IEX_endstations import * from iexcode.instruments.utilities import read_dict, print_warning_message -from iexcode.instruments.m3r import m3r_branch M0M1_fpath="/home/beams22/29IDUSER/Documents/User_Macros/Macros_29id/IEX_Dictionaries/Dict_IDCal.txt" @@ -57,9 +56,6 @@ def FMB_mirror_get(mirror_num,verbose=True): message =+ "%.3f"+"/" % rbv if verbose: print(message) - if mirror_num == 3: - mirror_branch = m3r_branch() - print(" => In "+mirror_branch+" branch") return vals def FMB_mirror_move(mirror_num,axis,val,verbose=True): diff --git a/build/lib/iexcode/instruments/IEX_endstations.py b/build/lib/iexcode/instruments/IEX_endstations.py index 94ee6e1..6bff704 100644 --- a/build/lib/iexcode/instruments/IEX_endstations.py +++ b/build/lib/iexcode/instruments/IEX_endstations.py @@ -26,7 +26,7 @@ class Endstation: """ - def __init__(self,endstation_name,scan_ioc,xrays,BL_mode,mda_scanRecord): + def __init__(self,endstation_name,scan_ioc,xrays,BL_mode,mda_scanRecord,log_header,log_entries,Motors): """ intializes the several beamline variables @@ -40,13 +40,16 @@ class Endstation: BL.prefix => 'ARPES_','Kappa_' BL.ioc => previously: BL_ioc() BL.mda_filepath + BL.log_header => dictionary with header list + BL.log_entries => method to get pvs to be written to log file + BL.Motors => motor calls """ global BL endstations_list = ['ARPES','Kappa'] BL_mode_list = ['user','staff'] - if self.endstation_name in endstations_list: + if endstation_name in endstations_list: self.endstation=endstation_name else: print('Not a valid Endstation choice') @@ -74,6 +77,9 @@ class Endstation: self.xrays = xrays self.ioc = scan_ioc self.mda = mda_scanRecord + self.log_header = log_header + self.log_entries = log_entries + self.Motors = Motors def set_logfile_path(): @@ -107,25 +113,3 @@ def BL_mda_filepath(): returns the mda file prefix """ return BL.filepath - -def scalar_cts(self,integration_time=0.1,verbose=True,**kwargs): - """ - Sets the integration time for the scalers - kwargs: - mcp = True/False to sum mpa - Previously: cts, Kappa counts - """ - - if BL.endstation == 'ARPES': - pass - elif BL.endstation == 'Kappa': - Kappa_scalar_pv = "29idMZ0:scaler1.TP" - mpa_Proc1_pv = "29iddMPA:Proc1:" - - caput(Kappa_scalar_pv,integration_time) - - if kwargs["mpa"]: - caput(mpa_Proc1_pv+'NumFilter',floor(time)) - - if verbose: - print("Integration time set to:", str(time)) \ No newline at end of file diff --git a/build/lib/iexcode/instruments/Kappa.py b/build/lib/iexcode/instruments/Kappa.py index 18c9810..c64636c 100644 --- a/build/lib/iexcode/instruments/Kappa.py +++ b/build/lib/iexcode/instruments/Kappa.py @@ -13,17 +13,20 @@ from iexcode.instruments.logfile import logfile_name_set,logfile_header from iexcode.instruments.conversions_constants import * from iexcode.instruments.utilities import * -from iexcode.instruments.userCalcs import userStringSeq_clear, userStringSeq_pvs -from iexcode.instruments.scanRecord import * -from iexcode.instruments.Motors import * -from iexcode.instruments.xrays import * -from iexcode.instruments.current_amplifiers import * +from iexcode.instruments.userCalcs import userStringSeq_clear, userStringSeq_pvs, userCalcOut_clear +from iexcode.instruments.scanRecord import ScanRecord +#from iexcode.instruments.xrays import xrays_reset,xrays_get_all + +from iexcode.instruments.Motors import Motors +from iexcode.instruments.current_amplifiers import SRS, ca_reset_all, Keithley_pv from iexcode.instruments.gate_valves import valve_close, branch_valves from iexcode.instruments.shutters import branch_shutter_close from iexcode.instruments.slits import slit3D_get -from iexcode.instruments.Kappa_det import * +from iexcode.instruments.Kappa_det import Kappa_Detector +from iexcode.instruments.scalers import scaler_cts +from iexcode.instruments.MPA import MPA from iexcode.instruments.spec_stuff import folders_spec @@ -53,15 +56,17 @@ def Kappa_init(set_folders=False,reset=False,**kwargs): #endstation global BL - BL=Endstation('Kappa',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord) + BL=Endstation('Kappa',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord,Kappa_log_header,Kappa_log_entries) #global detectors - global tey, d3, d4, mesh, Kappa_scaler_pv + global tey, d3, d4, mesh, Kappa_scaler_pv, mpa tey = SRS("29idMZ0:scaler1.S2", '29idd:A1') d3 = SRS("29idMZ0:scaler1.S3", '29idd:A2') d4 = SRS("29idMZ0:scaler1.S4", '29idd:A3') mesh = SRS("29idMZ0:scaler1.S14", '29idd:A4') Kappa_scaler_pv = '29idMZ0:scaler1.CNT' + tth_pv = Kappa_motor_dictionary('tth')[3] + mpa = MPA(tth_pv) global tthdet tthdet = Kappa_Detector() @@ -133,7 +138,7 @@ def Kappa_detector_dictionary(**kwargs): 38:"29idMZ0:scaler1_calc1.D", 39:"29idMZ0:scaler1_calc1.E", } - mpa={ + mpa_dets={ 30:"29iddMPA:det1:TotalRate_RBV", 41:"29iddMPA:Stats1:Total_RBV", 42:"29iddMPA:Stats2:Total_RBV", @@ -158,7 +163,7 @@ def Kappa_detector_dictionary(**kwargs): #hkl are listed just a place holders, they are filled in by thier scanning functions det_dict.update(sample_temp) det_dict.update(scalers) - det_dict.update(mpa) + det_dict.update(mpa_dets) det_dict.update(motors) if kwargs['add_vortex']: det_dict.update(vortex) @@ -278,7 +283,7 @@ def Kappa_reset(): #resetting mono and anyother beamline stuff if BL.xrays: - xrays_reset() + JLM="xrays_reset()" #reseting the Kappa Lakeshore @@ -291,7 +296,7 @@ def Kappa_reminder_list(ioc): """ resets scanRecord, current amplifiers, mono limits and synchs motors """ - mda.reset() + BL.mda.reset() if BL.xray: ca_reset_all() @@ -320,8 +325,8 @@ def Kappa_get_all(verbose=True): #beamline info if BL.xray: - beamline_info = xrays_get_all() - vals.update(beamline_info) + JLM="beamline_info = xrays_get_all()" + #vals.update(beamline_info) mesh.get() vals.update({'mesh':mesh.current}) @@ -364,7 +369,7 @@ def Kappa_log_entries(): tey_current = tey.current mesh_current = mesh.current det_name = tthdet.name - mpa_HV = mpa_HV_get() + mpa_HV = mpa.HV_get() m3r_centroid = vals['kphi'] entry_list = ["x","y","z","tth","kth","kap","kphi","TA","TB","TEY","mesh","det_name","mpa_HV","m3r_centroid"] @@ -648,26 +653,26 @@ def Kappa_th2th_scan_sensitivity(th_table,gain_num_table,gain_unit_table,detecto tth_table = 2*th_table kwargs.update("positioner_num",1) - mda.fillin_table(kth_val,kth_rbv,kth_table,**kwargs) + BL.mda.fillin_table(kth_val,kth_rbv,kth_table,**kwargs) kwargs.update("positioner_num",2) - mda.fillin_table(tth_val,tth_rbv,tth_table,**kwargs) + BL.mda.fillin_table(tth_val,tth_rbv,tth_table,**kwargs) kwargs.update("positioner_num",3) - mda.fillin_table(gain_num_pv,"",gain_num_table,**kwargs) + BL.mda.fillin_table(gain_num_pv,"",gain_num_table,**kwargs) kwargs.update("positioner_num",4) - mda.fillin_table(gain_unit_pv,"",gain_unit_table,**kwargs) + BL.mda.fillin_table(gain_unit_pv,"",gain_unit_table,**kwargs) print("\nDon't forget to clear extra positionners at the end of the scan if you were to abort the script using the function:") print(" Clear_Scan_Positioners('Kappa',1)") scaler_cts(kwargs['cts'],verbose=False) if kwargs['execute']: - mda.go(**kwargs) + BL.mda.go(**kwargs) #clean up after scan - mda.table_reset_after(**kwargs) + BL.mda.table_reset_after(**kwargs) scaler_cts(verbose=False) def Kappa_scan_th2th(tth_start,tth_stop,tth_step,th_offset,**kwargs): @@ -830,7 +835,7 @@ def KappaPreset_StrSeq(n,User): scanIOC="Kappa" motorIOC="29idKappa:" motor = ["m2","m3","m4","m9","m8","m7","m1"] - strSeq_pv = userStringSeq_clear(mda,n) + strSeq_pv = userStringSeq_clear(BL.mda,n) if User[0] == "Kappa Grazing": phi0= 0 if User[0] == "Kappa Transfer": phi0= 57 @@ -856,7 +861,7 @@ def KappaPreset_StrSeq(n,User): def Bragg_Angle_CalcOut(d,eV,l): n=7 - userCalcOut_pv = userCalcOut_clear(mda,n) + userCalcOut_pv = userCalcOut_clear(BL.mda,n) h=4.135667516e-15 c=299792458 @@ -906,9 +911,9 @@ def Kappa_safe_state(**kwargs): kwargs.setdefault("shutter_close",True) kwargs.setdefault("valve_close",True) - if kwargs["EA_off"]: + if kwargs["mpa_off"]: try: - mpa_HV_off() + mpa.HV_off() except: print('MPA is not running') diff --git a/build/lib/iexcode/instruments/Kappa_Euler.py b/build/lib/iexcode/instruments/Kappa_Euler.py index 42dfe2f..ea02590 100644 --- a/build/lib/iexcode/instruments/Kappa_Euler.py +++ b/build/lib/iexcode/instruments/Kappa_Euler.py @@ -2,7 +2,7 @@ import numpy as np from epics import caget, caput from iexcode.instruments.userCalcs import userCalcOut_clear -from iexcode.instruments.IEX_endstations import mda +from iexcode.instruments.IEX_endstations import * from iexcode.instruments.userCalcs import userCalcOut_clear #### Obsolete? diff --git a/build/lib/iexcode/instruments/Kappa_det.py b/build/lib/iexcode/instruments/Kappa_det.py index 9a1a190..c001020 100644 --- a/build/lib/iexcode/instruments/Kappa_det.py +++ b/build/lib/iexcode/instruments/Kappa_det.py @@ -1,7 +1,7 @@ from time import sleep from epics import caget, caput -from iexcode.instruments.IEX_endstations import Motors +from iexcode.instruments.Kappa import Kappa_Motors ############################################################################################################## @@ -27,7 +27,7 @@ class Kappa_Detector: #det_name = caget('29idKappa:userStringSeq6.STR1') det_name = caget(det_set_pv) self.name = det_name - tth_val = Motors.get('tth') + tth_val = Kappa_Motors.get('tth') return self.name, tth_val def set(self,det_name,move=True): @@ -43,13 +43,13 @@ class Kappa_Detector: yag: yag 'fluorescence screen' """ #get current value for tth - tth_val = Motors.get('tth') + tth_val = Kappa_Motors.get('tth') #change det if det_name in det_list: caput(det_set_pv,det_name) if move: - Motors.move('tth',tth_val,wait=True,verbose=False) + Kappa_Motors.move('tth',tth_val,wait=True,verbose=False) def tth0_set(move): """ @@ -58,7 +58,7 @@ class Kappa_Detector: only works with d4 """ current_det=caget(det_set_pv,as_string=True) - tth_pv = Motors._motor_dictionary['th'][3] + tth_pv = Kappa_Motors._motor_dictionary['th'][3] if current_det != 'd4': print('tth0 can only be redefined with d4') diff --git a/build/lib/iexcode/instruments/Motors.py b/build/lib/iexcode/instruments/Motors.py index 119b51b..8b8f7ad 100644 --- a/build/lib/iexcode/instruments/Motors.py +++ b/build/lib/iexcode/instruments/Motors.py @@ -3,7 +3,8 @@ from math import floor from epics import caget, caput -from iexcode.instruments.IEX_endstations import * +from iexcode.instruments.IEX_endstations import BL +from iexcode.instruments.scalers import scaler_cts class Motors: @@ -220,7 +221,7 @@ class Motors: outer_loop_list[2]=round(current_value1+outer_loop_list[2],3) outer_loop_list[3]=round(current_value1+outer_loop_list[3],3) - scalar_cts(kwargs['cts'],verbose=True,**kwargs) + scaler_cts(kwargs['cts'],verbose=True,**kwargs) BL.mda.fillin_2D(inner_loop_list,outer_loop_list, outer_scan_dim=kwargs['outer_scan_dim'],**kwargs) diff --git a/build/lib/iexcode/instruments/beamline.py b/build/lib/iexcode/instruments/beamline.py index 6817162..2071446 100644 --- a/build/lib/iexcode/instruments/beamline.py +++ b/build/lib/iexcode/instruments/beamline.py @@ -53,25 +53,13 @@ def last_mda(): ############################################################################################################## - -def print_beeper(scanDIM=1): - """ - Prints pv to copy/paste into the beeper - - Previously: Print_Beeper - """ - branch=BL.branch - if branch == "c": - print("29idcEA:det1:Acquire") - pv=BL.ioc()+":scan"+str(scanDIM)+".FAZE" - print(pv) - print("ID29:BusyRecord") - - -def branch_cams_enable(branch=BL.branch): +def endstation_cams_enable(): """ + should live in cameras """ - cam_dict={'c':[0,1,2],'c':[3,4,6]} # index of cam_list + endstation=BL.endstation + + cam_dict={'ARPES':[0,1,2],'Kappa':[3,4,6]} # index of cam_list pvcam1=PV("29id_ps1:cam1:Acquire") pvcam2=PV("29id_ps2:cam1:Acquire") pvcam3=PV("29id_ps3:cam1:Acquire") @@ -85,7 +73,7 @@ def branch_cams_enable(branch=BL.branch): if pvcam.connected: pvcam.put(0) except: pass - for i in cam_dict[branch]: # turn ON relevant cam + for i in cam_dict[endstation]: # turn ON relevant cam try: if cam_list[i].connected: cam_list[i].put(1) else: print(cam_list[i].pvname+' not connected') diff --git a/build/lib/iexcode/instruments/electron_analyzer.py b/build/lib/iexcode/instruments/electron_analyzer.py index 8cfbb77..119d758 100644 --- a/build/lib/iexcode/instruments/electron_analyzer.py +++ b/build/lib/iexcode/instruments/electron_analyzer.py @@ -22,14 +22,12 @@ from iexcode.instruments.shutters import branch_shutter_close from iexcode.instruments.VLS_PGM import mono_energy_get from iexcode.instruments.files_and_folders import get_next_fileNumber from iexcode.instruments.logfile import * -from iexcode.instruments.ARPES import ARPES_motor_dictionary, ARPES_motor_scan, ARPES_mvsample,ARPES_scan_2D +from iexcode.instruments.ARPES import ARPES_Motors from iexcode.instruments.Scienta import * -def __main__(): - global EA - EA = Scienta() - -mda = BL.mda +global EA +EA = Scienta() + ########################################################################### def EA_ioc_init(**kwargs): @@ -260,8 +258,8 @@ def _scanEAPrefix(ptype,**kwargs): print(ptype) if ptype == "mda": - fpath = mda.filepath[0:-3]+EA.dtype - nextMDA = mda.fileNum + fpath = BL.mda.filepath[0:-3]+EA.dtype + nextMDA = BL.mda.fileNum prefix = "MDAscan"+str.zfill(str(nextMDA),kwargs["nzeros"]) else: prefix = ptype @@ -304,7 +302,7 @@ def scanEA_reset(**kwargs): kwargs.setdefault("scan_dim",1) _scanEATrigger([],"after",**kwargs) - mda.positioners_clear(kwargs["scan_dim"]) + BL.mda.positioners_clear(kwargs["scan_dim"]) def scanEA(EAlist,**kwargs): """ @@ -348,7 +346,7 @@ def scanEA(EAlist,**kwargs): pvCalcOut1=_BE2KE_setupCalc(EAlist[1],"BE_center",10,"29idcScienta:HV:fixedEnergy.VAL") EAlist[1]=caget(pvCalcOut1+'.VAL') arrayP1=list(np.full(sweeps, EAlist[1])) - mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) + BL.mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) EAlist[1]=arrayP1[0] if kwargs['debug']: print('\npvCalcOut1: ',pvCalcOut1) @@ -357,7 +355,7 @@ def scanEA(EAlist,**kwargs): pvCalcOut1=_BE2KE_setupCalc(EAlist[1],"BE_center",10,"29idcScienta:HV:babySweepCenter.VAL") EAlist[1]=caget(pvCalcOut1+'.VAL') arrayP1=list(np.full(sweeps, EAlist[1])) - mda.fillin_table(pvCalcOut1+'PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) + BL.mda.fillin_table(pvCalcOut1+'PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) print('\npvCalcOut1: ',pvCalcOut1) print('Pos1 table:',arrayP1) elif len(EAlist)==7: #Sweep @@ -367,8 +365,8 @@ def scanEA(EAlist,**kwargs): EAlist[2]=caget(pvCalcOut2+'.VAL') arrayP1=list(np.full(sweeps, EAlist[1])) arrayP2=list(np.full(sweeps, EAlist[2])) - mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) - mda.fillin_table(pvCalcOut2+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP2,2) + BL.mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) + BL.mda.fillin_table(pvCalcOut2+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP2,2) if kwargs['debug']: print("\npvCalcOut1",pvCalcOut1) print("\npvCalcOut2",pvCalcOut2) @@ -388,10 +386,10 @@ def scanEA(EAlist,**kwargs): if kwargs['debug']: print("Clearing scan positioners and filling in sweeps") #Fill in Sweeps scan - mda.positioners_clear(**kwargs) + BL.mda.positioners_clear(**kwargs) VAL="" RBV="" - mda.fillin(VAL,RBV,1,sweeps,1,**kwargs) + BL.mda.fillin(VAL,RBV,1,sweeps,1,**kwargs) if kwargs['debug']: scanPV="29id"+kwargs["scanIOC"]+":scan"+str(kwargs["scan_dim"]) print("scanPV: "+scanPV) @@ -414,11 +412,11 @@ def scanEA(EAlist,**kwargs): time.sleep(10) EA.put(EAlist[1]-.05,EAlist[-3],LensMode="Angular") time.sleep(2) - mda.go(**kwargs) + BL.mda.go(**kwargs) #After scan EA_log_update() scanEA_reset(**kwargs) - mda.table_reset_after(**kwargs) + BL.mda.table_reset_after(**kwargs) else: return EAparms @@ -445,10 +443,10 @@ def scanFM(RoughPositions,thList,EAlist,**kwargs): if kwargs['debug']: print(x,y,z,th,chi,phi) - mda.fillin_table(ARPES_motor_dictionary("th")[1],ARPES_motor_dictionary("th")[0],th,positioner_num=1) - mda.fillin_table(ARPES_motor_dictionary("x")[1],ARPES_motor_dictionary("x")[0],x,positioner_num=2) - mda.fillin_table(ARPES_motor_dictionary("y")[1],ARPES_motor_dictionary("y")[0],y,positioner_num=3) - mda.fillin_table(ARPES_motor_dictionary("z")[1],ARPES_motor_dictionary("z")[0],z,positioner_num=4) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("th")[1],ARPES_Motors._motor_dictionary("th")[0],th,positioner_num=1) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("x")[1],ARPES_Motors._motor_dictionary("x")[0],x,positioner_num=2) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("y")[1],ARPES_Motors._motor_dictionary("y")[0],y,positioner_num=3) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("z")[1],ARPES_Motors._motor_dictionary("z")[0],z,positioner_num=4) #setting up EA EAkwargs={ @@ -461,7 +459,7 @@ def scanFM(RoughPositions,thList,EAlist,**kwargs): if kwargs["execute"]==True: print(EAparms) EA.put(EAparms['KineticEnergy'],EAparms['PassEnergy'],LensMode="Angular",Frames=EAparms['Frames'],**kwargs) - mda.go(**kwargs) + BL.mda.go(**kwargs) EA_log_update() scanEA_reset(**kwargs) @@ -520,7 +518,7 @@ def mvth_interp(RoughPositions, thVal,**kwargs): x,y,z,th,chi,phi=interpRoughPositions(RoughPositions,thVal,thVal-.1,1,**kwargs) Pos=[x[0],y[0],z[0],th[0],chi[0],phi[0]] #print("Pos = ",Pos) - ARPES_mvsample(Pos) + ARPES_Motors.mvsample(Pos) def scanEA_hv(hv_start_stop_step_lists,EAlist=[],**kwargs): """ @@ -574,10 +572,10 @@ def scanEA_hv(hv_start_stop_step_lists,EAlist=[],**kwargs): energy(mono_array[0]) #Scanning EA.put(mono_array[0]-EAlist[1],EAparms['PassEnergy'],LensMode="Angular",Frames=EAparms['Frames'],**kwargs) - mda.go(**kwargs) + BL.mda.go(**kwargs) #After scan scanEA_reset(**kwargs) - mda.table_reset_after(**kwargs) + BL.mda.table_reset_after(**kwargs) def scanEA_y(EAlist, start,stop,step,mode='absolute',**kwargs): scanEA_motor(EAlist,'y',start,stop,step,mode=mode,**kwargs) @@ -617,7 +615,7 @@ def scanEA_motor(EAlist, motor,start,stop,step,mode='absolute',**kwargs): scan_dim=2 #hard coded kwargs.update({'scan_dim':scan_dim}) - ARPES_motor_scan(motor,start,stop,step,**kwargs) + ARPES_Motors.scan(motor,start,stop,step,**kwargs) if kwargs['debug']: print("ScanGo scan_dim = ",scan_dim) @@ -664,7 +662,7 @@ def scanEA_Mesh(EAlist,y_start_stop_step,z_start_stop_step,**kwargs): outer_scan_dim=3 #hard coded inner_loop_list = y_start_stop_step.insert(0,"y") outer_loop_list = z_start_stop_step.insert(0,"z") - ARPES_scan_2D(inner_loop_list,outer_loop_list,outer_scan_dim,**kwargs) + ARPES_Motors.scan_2D(inner_loop_list,outer_loop_list,outer_scan_dim,**kwargs) if kwargs['debug']: print("ScanGo scan_dim = ",outer_scan_dim) @@ -672,7 +670,7 @@ def scanEA_Mesh(EAlist,y_start_stop_step,z_start_stop_step,**kwargs): if kwargs['execute']: #Scanning EA.put(EAlist[1],EAparms['PassEnergy'],LensMode="Angular",Frames=EAparms['Frames'],**kwargs) - mda.go(scan_dim=outer_scan_dim) + BL.mda.go(scan_dim=outer_scan_dim) EA_log_update() #After scan diff --git a/build/lib/iexcode/instruments/logfile.py b/build/lib/iexcode/instruments/logfile.py index dec2ce2..cde224d 100644 --- a/build/lib/iexcode/instruments/logfile.py +++ b/build/lib/iexcode/instruments/logfile.py @@ -3,8 +3,6 @@ from os.path import join,isfile from epics import caget, caput from iexcode.instruments.IEX_endstations import * from iexcode.instruments.utilities import today -from iexcode.instruments.ARPES import ARPES_log_entries -from iexcode.instruments.Kappa import Kappa_log_entries ############################################################################################################## @@ -20,10 +18,8 @@ def log_update(): """ updates the log file with the last scan info """ - if BL.endstation_name == 'ARPES': - entry_list,pv_list, format_list = ARPES_log_entries() - elif BL.endstation_name == 'Kappa': - entry_list,pv_list, format_list = Kappa_log_entries() + + entry_list,pv_list, format_list = BL.log_entries() logfile_update(BL.endstation_name,BL.ioc,entry_list,pv_list,format_list) diff --git a/build/lib/iexcode/instruments/mpa.py b/build/lib/iexcode/instruments/mpa.py index 6408b46..a9477f0 100644 --- a/build/lib/iexcode/instruments/mpa.py +++ b/build/lib/iexcode/instruments/mpa.py @@ -4,10 +4,10 @@ import socket from epics import caget, caput from iexcode.instruments.userCalcs import userCalcOut_clear,userStringSeq_clear -from iexcode.instruments.Kappa import Kappa_motor_dictionary,Kappa_cts, mda +from iexcode.instruments.scalers import Kappa_scaler from iexcode.instruments.AD_utilities import AD_ROI_setup -from iexcode.instruments.scalers import scaler_cts -from iexcode.instruments.scanRecord import * +from iexcode.instruments.scanRecord import ScanRecord +from iexcode.instruments.IEX_endstations import BL """ @@ -19,399 +19,409 @@ To do, get busy record in the mpa ioc, get user calcs in the mpa ioc ############################## PVs ############################## ############################################################################################################## mpa_pv = "29iddMPA:" -mpaDet_pv = mpa_pv + "det1:" mpa_busy = "29idcScienta:mybusy2" -userCalc_pv = "29idTest" +userCalc_ioc = "29idTest:" DAC_pv = '29iddau1:dau1:011:DAC' -max_HV = 2990 -ratio = 500 -tth_dLLM=13.73 -tth_dHLM=23.73 - - -def mpa_reset_pv(): - """ - returns the pv used for resetting the mpa - "writing a 1 resets" - """ - return mpa_pv+'C1O' - -def mpa_on_off_pv(): - """ - returns the pv used for turning on/off the mpa - on => caput 1 - off => caput0 - """ - return mpa_pv+'C0O' - -def mpa_HV_pvs(): - """ - returns the pvs for the userCalcout which hold the pvs for the mpa high voltage - """ - val_pv = "29idKappa:userCalcOut9.A" - rbv_pv ="29idKappa:userCalcOut10.OVAL" - return val_pv, rbv_pv - -############################################################################################################## -############################## HV Control ############################## -############################################################################################################## - -def mpa_HV_set(volt,verbose=True): - """ - sets the high voltage for the mpa - - Previously: MPA_HV_Set - """ - val_pv, rbv_pv = mpa_HV_pvs() - volt=min(volt,2990) - - caput(val_pv,volt,wait=True,timeout=18000) - sleep(1) - HV_rbv=caget(rbv_pv) - - if verbose: - print("HV = "+str(HV_rbv)+" V") - - -def mpa_HV_get(): +HV_val_pv = "29idKappa:userCalcOut9.A" +HV_rbv_pv = "29idKappa:userCalcOut10.OVAL" +class MPA: """ - sets the high voltage for the mpa + class for the MPA detector """ - val_pv, rbv_pv = mpa_HV_pvs() - return caget(rbv_pv) + def __init__(self,tth_pv, max_HV = 2990,ratio = 500,tth_dLLM=13.73,tth_dHLM=23.73): + self.pv = mpa_pv + self._reset_pv = mpa_pv+'C1O' + self._det_pv = mpa_pv + "det1:" + self._busy = mpa_busy + self._DAC_pv = DAC_pv + self.max_HV = max_HV + self.ratio = ratio + self.tth_dLLM = tth_dLLM + self.tth_dHLM = tth_dHLM -def mpa_HV_on(): - """ - turns the mpa high voltage on - - Previously: MPA_HV_ON - """ - n_on=1 - tth_pv = Kappa_motor_dictionary('tth')[3] - tth_dial = caget(tth_pv+'.DRBV') - if 13.73<= tth_dial <=23.73: - print('MPA OFF: detector in direct beam (-5 < tth for mcp < 5); move away before turning HV ON.') - else: - caput(mpa_reset_pv,1,wait=True,timeout=18000) - caput(mpa_reset_pv,0,wait=True,timeout=18000) - caput(mpa_on_off_pv,n_on,wait=True,timeout=18000) - print("MPA - HV On") - -def mpa_HV_off(): - """ - turns the mpa high voltage off - - Previously: MPA_HV_OFF - """ - n_off=0 - caput(mpa_on_off_pv,wait=True,timeout=18000) - print("MPA - HV Off") + self._tth_pv = tth_pv + self._reset_pv = mpa_pv+'C1O' #"writing a 1 resets" + self._off_on_pv = mpa_pv+'C0O' #off/on = 0/1 + pass -def mpa_HV_reset(): - """ - resets the mpa high voltage - - Previously: MPA_HV_Reset - """ - caput(mpa_reset_pv,1) - print("MPA - Reset") - -def mpa_HV_scan(start=2400,stop=2990,step=10,**kwargs): - """ - Previously: MPA_HV_scan - """ - kwargs.setdefault('positioner_settling_time',1) - Kappa_cts(1) - val_pv, rbv_pv = mpa_HV_pvs() - mda.fillin(val_pv, rbv_pv,start,stop,step,**kwargs) - mda.go(**kwargs) - -############################################################################################################## -############################## MCP Scripts ############################## -############################################################################################################## -def mpa_ROI_setup(ROI_num=1,xcenter=535,ycenter=539,xsize=50,ysize=50,binX=1,binY=1): - """ - usage: - center of MCP, roiNum = 1 => MPA_ROI_SetUp(1,535,539,50,50) - to set up all use: mpa_ROI_setup_all(xcenter,ycenter) - """ - AD_ROI_setup('29iddMPA',ROI_num,xcenter,ycenter,xsize,ysize,binX,binY) - ROI_pv = mpa_pv+"ROI"+str(ROI_num)+':' - mpa_ROI_stats(ROI_num) + def HV_pvs(self): + """ + returns the pvs for the userCalcout which hold the pvs for the mpa high voltage + """ + val_pv = HV_val_pv + rbv_pv =HV_rbv_pv + return val_pv, rbv_pv + + ############################################################################################################## + ############################## HV Control ############################## + ############################################################################################################## + + def HV_set(self,volt,verbose=True): + """ + sets the high voltage for the mpa + + Previously: MPA_HV_Set + """ + val_pv, rbv_pv = self.HV_pvs() + volt=min(volt,2990) + + caput(val_pv,volt,wait=True,timeout=18000) + sleep(1) + HV_rbv=caget(rbv_pv) + + if verbose: + print("HV = "+str(HV_rbv)+" V") + + + def HV_get(self): + """ + sets the high voltage for the mpa + """ + val_pv, rbv_pv = self.HV_pvs() + + return caget(rbv_pv) + + + def HV_on(self): + """ + turns the mpa high voltage on + + Previously: MPA_HV_ON + """ + try: + n_on=1 + tth_dial = caget(self._tth_pv+'.DRBV') + + if self.tth_dLLM <= tth_dial <= self.tth_dHLM: + print('MPA OFF: detector in direct beam (-5 < tth for mcp < 5); move away before turning HV ON.') + else: + caput(self._reset_pv,1,wait=True,timeout=18000) + caput(self._reset_pv,0,wait=True,timeout=18000) + caput(self._off_on_pv,n_on,wait=True,timeout=18000) + print("MPA - HV On") + except: + print('mpa not running') + + def HV_off(self): + """ + turns the mpa high voltage off + + Previously: MPA_HV_OFF + """ + try: + n_off=0 + caput(self._off_on_pv,n_off,wait=True,timeout=18000) + print("MPA - HV Off") + except: + print('MPA not running') + + + def HV_reset(self): + """ + resets the mpa high voltage + + Previously: MPA_HV_Reset + """ + caput(self._reset_pv,1) + print("MPA - Reset") -def mpa_ROI_setup_all(xcenter=535,ycenter=539): - """ - setup up ROI - 1 => size = 50 x 50 - 2 => size = 100 x 100 - 3 => size = 150 x 150 - 4 => size = 200 x 200 - - """ - mpa_ROI_setup(1,xcenter,ycenter,xsize=50,ysize=50) - mpa_ROI_setup(2,xcenter,ycenter,xsize=100,ysize=100) - mpa_ROI_setup(3,xcenter,ycenter,xsize=150,ysize=150) - mpa_ROI_setup(4,xcenter,ycenter,xsize=200,ysize=200) + def HV_scan(self,start=2400,stop=2990,step=10,**kwargs): + """ + + Previously: MPA_HV_scan + """ + kwargs.setdefault('positioner_settling_time',1) + Kappa_scaler(1) + val_pv, rbv_pv = self._HV_pvs() + BL.mda.fillin(val_pv, rbv_pv,start,stop,step,**kwargs) + BL.mda.go(**kwargs) + + ############################################################################################################## + ############################## MCP Scripts ############################## + ############################################################################################################## + def ROI_setup(self,ROI_num=1,xcenter=535,ycenter=539,xsize=50,ysize=50,binX=1,binY=1): + """ + usage: + center of MCP, roiNum = 1 => MPA_ROI_SetUp(1,535,539,50,50) + to set up all use: mpa_ROI_setup_all(xcenter,ycenter) + """ + AD_ROI_setup('29iddMPA',ROI_num,xcenter,ycenter,xsize,ysize,binX,binY) + self._ROI_stats(ROI_num) -def mpa_ROI_stats(ROI_num): - """ - sequence to enable stats for mpa ROI - """ - ROI_pv=mpa_pv+"ROI"+str(ROI_num)+':' - stats_pv=mpa_pv+"Stats"+str(ROI_num)+':' - caput(stats_pv+'NDArrayPort','ROI'+str(ROI_num)) - caput(stats_pv+'EnableCallbacks','Enable') - caput(stats_pv+'ArrayCallbacks','Enable') - caput(stats_pv+'ComputeStatistics','Yes') - caput(stats_pv+'ComputeCentroid','Yes') - caput(stats_pv+'ComputeProfiles','Yes') - -def _mpa_trigger_calcOut(**kwargs): - """ - writes strSeq and calcOut for MPA this should go into the IOC - - **kwargs: - ADplugin = 'TIFF1:' (default) - """ - - kwargs.setdefault("ADplugin","TIFF1:") - kwargs.setdefault("save_image",False) - - ADplugin = mpa_pv + kwargs["ADplugin"] - Proc1 = mpa_pv + "Proc1:" - - #All this should moved into the MPA IOC - Calcs_mda = ScanRecord("29idTest:") - - desc = "MPA busy" - n=9 - busy_CalcOut = userCalcOut_clear(Calcs_mda,n) - caput(busy_CalcOut+".DESC",desc) - caput(busy_CalcOut+".INPA",mpa_busy+" CP") - caput(busy_CalcOut+".OOPT",'Transition to non-zero') - caput(busy_CalcOut+".OUT",start_strSeq+".PROC PP") - - desc = "MPA start" - n=1 - start_strSeq = userStringSeq_clear(Calcs_mda,n) - caput(start_strSeq+".DESC",desc) - caput(start_strSeq+".LNK1", Proc1+"ResetFilter PP") - caput(start_strSeq+".STR1","Yes") - - desc = "MPA wait" - n=10 - wait_CalcOut = userCalcOut_clear(Calcs_mda,n) - caput(wait_CalcOut+".DESC",desc) - caput(wait_CalcOut+".INPA",Proc1+"NumFilter_RBV") - caput(wait_CalcOut+".INPB",Proc1+"NumFiltered_RBV") - caput(wait_CalcOut+".OOPT",'Transition to non-zero') - caput(wait_CalcOut+".OUT",done_strSeq+".PROC PP") - - desc = "MPA writeDone" - n=1 - done_strSeq = userStringSeq_clear(Calcs_mda,n) - caput(done_strSeq+".DESC","MPA writeDone") - caput(done_strSeq+".LNK1", ADplugin+"WriteFile PP") - caput(done_strSeq+".STR1","Write") - caput(done_strSeq+".LNK1", mpa_busy+" PP") - caput(done_strSeq+".STR1","Done") - + def ROI_setup_all(self,xcenter=535,ycenter=539): + """ + setup up ROI + 1 => size = 50 x 50 + 2 => size = 100 x 100 + 3 => size = 150 x 150 + 4 => size = 200 x 200 + + """ + self._ROI_setup(1,xcenter,ycenter,xsize=50,ysize=50) + self._ROI_setup(2,xcenter,ycenter,xsize=100,ysize=100) + self._ROI_setup(3,xcenter,ycenter,xsize=150,ysize=150) + self._ROI_setup(4,xcenter,ycenter,xsize=200,ysize=200) - -def _mpa_trigger_callback(trigger,saveImg=False,**kwargs): - """ - used for triggering the MPA in the scanRecord, reset Proc1 and waits for finish - trigger: adds/removes trigger to mda (True/False) + def ROI_stats(self,ROI_num): + """ + sequence to enable stats for mpa ROI + """ + ROI_pv=self.pv+"ROI"+str(ROI_num)+':' + stats_pv=self.pv+"Stats"+str(ROI_num)+':' + caput(stats_pv+'NDArrayPort','ROI'+str(ROI_num)) + caput(stats_pv+'EnableCallbacks','Enable') + caput(stats_pv+'ArrayCallbacks','Enable') + caput(stats_pv+'ComputeStatistics','Yes') + caput(stats_pv+'ComputeCentroid','Yes') + caput(stats_pv+'ComputeProfiles','Yes') + + def _trigger_calcOut(self,**kwargs): + """ + writes strSeq and calcOut for MPA this should go into the IOC + + **kwargs: + ADplugin = 'TIFF1:' (default) + """ + + kwargs.setdefault("ADplugin","TIFF1:") + kwargs.setdefault("save_image",False) + + ADplugin = self.pv + kwargs["ADplugin"] + Proc1 = self.pv + "Proc1:" + + #All this should moved into the MPA IOC + Calcs_mda = ScanRecord(userCalc_ioc) - **kwargs: - save_image = False used for appropriate trigger of ROIs - = True also saves an image based on ADplugin type - ADplugin = 'TIFF1:' (default + desc = "MPA busy" + n=9 + busy_CalcOut = userCalcOut_clear(Calcs_mda,n) + caput(busy_CalcOut+".DESC",desc) + caput(busy_CalcOut+".INPA",mpa_busy+" CP") + caput(busy_CalcOut+".OOPT",'Transition to non-zero') + caput(busy_CalcOut+".OUT",start_strSeq+".PROC PP") + + desc = "MPA start" + n=1 + start_strSeq = userStringSeq_clear(Calcs_mda,n) + caput(start_strSeq+".DESC",desc) + caput(start_strSeq+".LNK1", Proc1+"ResetFilter PP") + caput(start_strSeq+".STR1","Yes") + + desc = "MPA wait" + n=10 + wait_CalcOut = userCalcOut_clear(Calcs_mda,n) + caput(wait_CalcOut+".DESC",desc) + caput(wait_CalcOut+".INPA",Proc1+"NumFilter_RBV") + caput(wait_CalcOut+".INPB",Proc1+"NumFiltered_RBV") + caput(wait_CalcOut+".OOPT",'Transition to non-zero') + caput(wait_CalcOut+".OUT",done_strSeq+".PROC PP") + + desc = "MPA writeDone" + n=1 + done_strSeq = userStringSeq_clear(Calcs_mda,n) + caput(done_strSeq+".DESC","MPA writeDone") + caput(done_strSeq+".LNK1", ADplugin+"WriteFile PP") + caput(done_strSeq+".STR1","Write") + caput(done_strSeq+".LNK1", mpa_busy+" PP") + caput(done_strSeq+".STR1","Done") + - by default ADplugin = 29iddMPA:TIFF1: - can use 29iddMPA:HDF1: - """ - - kwargs.setdefault("ADplugin","TIFF1:") - kwargs.setdefault("save_image",False) - - ADplugin = mpa_pv + kwargs['ADplugin'] - _mpa_trigger_calcOut(**kwargs) - - if trigger==True: - caput(ADplugin+"AutoResetFilter","Yes") - if saveImg: - caput(ADplugin+"AutoSave", "No") - caput(ADplugin+"EnableCallbacks", "Enable") + def self_trigger_callback(self,trigger,saveImg=False,**kwargs): + """ + used for triggering the MPA in the scanRecord, reset Proc1 and waits for finish - if trigger==False: - caput(ADplugin+"AutoResetFilter","No") - if saveImg: - caput(ADplugin+"EnableCallbacks", "Disable") - caput(ADplugin+"AutoSave", "Yes") - - return mpa_busy - -def _mpa_prefix(**kwargs): - """ - """ - kwargs.setdefault("debug",False) - - fpath=join(dirname(dirname(mda.filepath)),"mpa",'') - nextMDA = mda.fileNum - prefix="mda"+str.zfill(str(nextMDA),4)+"_mpa" - return prefix - -def mpa_trigger(trigger, **kwargs): - """ - Sets up / Cleans up the ScanRecord to trigger the MPA - - trigger: adds/removes trigger to mda (True/False) - + trigger: adds/removes trigger to mda (True/False) + + **kwargs: + save_image = False used for appropriate trigger of ROIs + = True also saves an image based on ADplugin type + ADplugin = 'TIFF1:' (default - **kwargs: - save_image = False used for appropriate trigger of ROIs - = True also saves an image based on ADplugin type - detTrigNum = 2 (default) - scan_dim = 1 (default) - ADplugin = "TIFF1" / "HDF1" - - Previously: MPA_Trigger - """ - kwargs.setdefault("detTrigNum",2) - kwargs.setdefault("save_image",False) - kwargs.setdefault('scan_dim',1) - kwargs.setdefault("ADplugin","TIFF1:") - - mpa_busy = _mpa_trigger_callback(trigger, **kwargs) - - #adding the MPA to the scanRecord trigger - if trigger == True: - _mpa_prefix(**kwargs) - mda.triggers_set(kwargs['scan_dim'],{2:mpa_busy}) - - if trigger == False: - mda.triggers_set(kwargs['scan_dim'],{2:''}) + by default ADplugin = 29iddMPA:TIFF1: + can use 29iddMPA:HDF1: + """ + + kwargs.setdefault("ADplugin","TIFF1:") + kwargs.setdefault("save_image",False) + + ADplugin = self.pv + kwargs['ADplugin'] + + self._trigger_calcOut(**kwargs) + + if trigger==True: + caput(ADplugin+"AutoResetFilter","Yes") + if saveImg: + caput(ADplugin+"AutoSave", "No") + caput(ADplugin+"EnableCallbacks", "Enable") + + if trigger==False: + caput(ADplugin+"AutoResetFilter","No") + if saveImg: + caput(ADplugin+"EnableCallbacks", "Disable") + caput(ADplugin+"AutoSave", "Yes") + + return mpa_busy + + def _mpa_prefix(self,**kwargs): + """ + """ + kwargs.setdefault("debug",False) + + fpath=join(dirname(dirname(BL.mda.filepath)),"mpa",'') + nextMDA = BL.mda.fileNum + prefix="mda"+str.zfill(str(nextMDA),4)+"_mpa" + return prefix + + def _trigger(self,trigger, **kwargs): + """ + Sets up / Cleans up the ScanRecord to trigger the MPA + + trigger: adds/removes trigger to mda (True/False) + + + **kwargs: + save_image = False used for appropriate trigger of ROIs + = True also saves an image based on ADplugin type + detTrigNum = 2 (default) + scan_dim = 1 (default) + ADplugin = "TIFF1" / "HDF1" + + Previously: MPA_Trigger + """ + kwargs.setdefault("detTrigNum",2) + kwargs.setdefault("save_image",False) + kwargs.setdefault('scan_dim',1) + kwargs.setdefault("ADplugin","TIFF1:") + + mpa_busy = self._mpa_trigger_callback(trigger, **kwargs) + + #adding the MPA to the scanRecord trigger + if trigger == True: + self._mpa_prefix(**kwargs) + BL.mda.triggers_set(kwargs['scan_dim'],{2:mpa_busy}) + + if trigger == False: + BL.mda.triggers_set(kwargs['scan_dim'],{2:''}) -def mpa_save_strSeq(**kwargs): - """ - **kwargs: - ADplugin: "TIFF1:" - """ - kwargs.setdefault("ADplugin","TIFF1:") - - ADplugin = mpa_pv + kwargs["ADplugin"] - - desc = "MCP datamode" - n=2 - strSeq_pv = userStringSeq_clear(mda,n) - caput(strSeq_pv+".DESC",desc) - caput(strSeq_pv+".LNK1",mpaDet_pv+"Acquire CA NMS") - caput(strSeq_pv+".STR1","Done") - caput(strSeq_pv+".WAIT1","Wait") - caput(strSeq_pv+".LNK2",mpaDet_pv+"RunTimeEnable PP NMS") - caput(strSeq_pv+".STR2","1") - caput(strSeq_pv+".WAIT2","Wait") - caput(strSeq_pv+".LNK3",ADplugin+"EnableCallbacks PP NMS") - caput(strSeq_pv+".STR3","1") - -def mpa_freerun_strSeq(): - """ - """ - desc = "MCP freerun" - n=1 - strSeq_pv = userStringSeq_clear(mda,n) - caput(strSeq_pv+".DESC",desc) - caput(strSeq_pv+".LNK1",mpaDet_pv+"Acquire PP NMS") - caput(strSeq_pv+".WAIT1","Wait") - caput(strSeq_pv+".STR1","Done") - caput(strSeq_pv+".LNK2","29iddMPA:TIFF1:EnableCallbacks PP NMS") - caput(strSeq_pv+".STR2","0") - caput(strSeq_pv+".WAIT2","Wait") - caput(strSeq_pv+".LNK3",mpaDet_pv+"RunTimeEnable PP NMS") - caput(strSeq_pv+".STR3","0") - caput(strSeq_pv+".WAIT3","Wait") - caput(strSeq_pv+".LNK4",mpaDet_pv+"Acquire PP NMS") - caput(strSeq_pv+".STR4","Acquire") - - -def mpa_HV_sp_calcOut(): - """ - """ - - desc = "MPA HV SP" - n=9 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - caput(calcOut_pv+".A",0) - caput(calcOut_pv+".B",ratio) - caput(calcOut_pv+".C",max_HV) - caput(calcOut_pv+".CALC$","A") - caput(calcOut_pv+".OCAL$","MIN(A/B,C/B)") - caput(calcOut_pv+".OOPT",1) # On Change - caput(calcOut_pv+".DOPT",1) # Use 0CALC - caput(calcOut_pv+".IVOA",0) # Continue Normally - caput(calcOut_pv+".OUT",DAC_pv+" PP NMS") - -def mpa_HV_rbv_calcOut(): - """ - """ - desc = "MPA HV RBV" - n=10 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - caput(calcOut_pv+".INPA",DAC_pv+' CP NMS') - caput(calcOut_pv+".B",ratio) - caput(calcOut_pv+".CALC$","A*B") - -def mpa_interlock_mpa(): - """ - """ - desc = "MPA Interlock mpa" - n=7 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - tth_pv = Kappa_motor_dictionary('tth')[3] - caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") - caput(calcOut_pv+".B",1) - caput(calcOut_pv+".CALC$","ABS((("+str(tth_dLLM)+"<A && A<"+str(tth_dHLM)+") && (B>0))-1)") - caput(calcOut_pv+".OCAL$",'A') - caput(calcOut_pv+".OOPT",2) # When zero - caput(calcOut_pv+".DOPT",0) # Use CALC - caput(calcOut_pv+".IVOA",0) # Continue Normally - caput(calcOut_pv+".OUT",mpa_on_off_pv()+"PP NMS") + def _save_strSeq(self,**kwargs): + """ + **kwargs: + ADplugin: "TIFF1:" + """ + kwargs.setdefault("ADplugin","TIFF1:") + + ADplugin = self.pv + kwargs["ADplugin"] + + desc = "MCP datamode" + n=2 + strSeq_pv = userStringSeq_clear(BL.mda,n) + caput(strSeq_pv+".DESC",desc) + caput(strSeq_pv+".LNK1",self._det_pv+"Acquire CA NMS") + caput(strSeq_pv+".STR1","Done") + caput(strSeq_pv+".WAIT1","Wait") + caput(strSeq_pv+".LNK2",self._det_pv+"RunTimeEnable PP NMS") + caput(strSeq_pv+".STR2","1") + caput(strSeq_pv+".WAIT2","Wait") + caput(strSeq_pv+".LNK3",ADplugin+"EnableCallbacks PP NMS") + caput(strSeq_pv+".STR3","1") + + def _freerun_strSeq(self): + """ + """ + desc = "MCP freerun" + n=1 + strSeq_pv = userStringSeq_clear(BL.mda,n) + caput(strSeq_pv+".DESC",desc) + caput(strSeq_pv+".LNK1",self._det_pv+"Acquire PP NMS") + caput(strSeq_pv+".WAIT1","Wait") + caput(strSeq_pv+".STR1","Done") + caput(strSeq_pv+".LNK2","29iddMPA:TIFF1:EnableCallbacks PP NMS") + caput(strSeq_pv+".STR2","0") + caput(strSeq_pv+".WAIT2","Wait") + caput(strSeq_pv+".LNK3",self._det_pv+"RunTimeEnable PP NMS") + caput(strSeq_pv+".STR3","0") + caput(strSeq_pv+".WAIT3","Wait") + caput(strSeq_pv+".LNK4",self._det_pv+"Acquire PP NMS") + caput(strSeq_pv+".STR4","Acquire") + + + def _HV_sp_calcOut(self): + """ + """ + + desc = "MPA HV SP" + n=9 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + caput(calcOut_pv+".A",0) + caput(calcOut_pv+".B",self.ratio) + caput(calcOut_pv+".C",self.max_HV) + caput(calcOut_pv+".CALC$","A") + caput(calcOut_pv+".OCAL$","MIN(A/B,C/B)") + caput(calcOut_pv+".OOPT",1) # On Change + caput(calcOut_pv+".DOPT",1) # Use 0CALC + caput(calcOut_pv+".IVOA",0) # Continue Normally + caput(calcOut_pv+".OUT",self._DAC_pv+" PP NMS") + + def _HV_rbv_calcOut(self): + """ + """ + desc = "MPA HV RBV" + n=10 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + caput(calcOut_pv+".INPA",DAC_pv+' CP NMS') + caput(calcOut_pv+".B",self.ratio) + caput(calcOut_pv+".CALC$","A*B") + + def _interlock_mpa(self): + """ + """ + desc = "MPA Interlock mpa" + n=7 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + tth_pv = self._tth_pv + caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") + caput(calcOut_pv+".B",1) + caput(calcOut_pv+".CALC$","ABS((("+str(self.tth_dLLM)+"<A && A<"+str(self.tth_dHLM)+") && (B>0))-1)") + caput(calcOut_pv+".OCAL$",'A') + caput(calcOut_pv+".OOPT",2) # When zero + caput(calcOut_pv+".DOPT",0) # Use CALC + caput(calcOut_pv+".IVOA",0) # Continue Normally + caput(calcOut_pv+".OUT",self._off_on_pv()+"PP NMS") -def mpa_interlock_DAC(): - """ - """ - desc = "MPA Interlock DAC" - n=8 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - tth_pv = Kappa_motor_dictionary('tth')[3] - caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") - caput(calcOut_pv+".B",1) - caput(calcOut_pv+".CALC$","ABS((("+str(tth_dLLM)+"<A && A<"+str(tth_dHLM)+") && (B>0))-1)") - caput(calcOut_pv+".OCAL$",'A') - caput(calcOut_pv+".OOPT",2) # When zero - caput(calcOut_pv+".DOPT",0) # Use CALC - caput(calcOut_pv+".IVOA",0) # Continue Normally - caput(calcOut_pv+".OUT",DAC_pv+"_Se PP NMS") + def _interlock_DAC(self): + """ + """ + desc = "MPA Interlock DAC" + n=8 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + tth_pv = self._tth_pv + caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") + caput(calcOut_pv+".B",1) + caput(calcOut_pv+".CALC$","ABS((("+str(self.tth_dLLM)+"<A && A<"+str(self.tth_dHLM)+") && (B>0))-1)") + caput(calcOut_pv+".OCAL$",'A') + caput(calcOut_pv+".OOPT",2) # When zero + caput(calcOut_pv+".DOPT",0) # Use CALC + caput(calcOut_pv+".IVOA",0) # Continue Normally + caput(calcOut_pv+".OUT",self._DAC_pv+"_Se PP NMS") def reset_mpa_HV(): """ diff --git a/build/lib/iexcode/instruments/resolution.py b/build/lib/iexcode/instruments/resolution.py index a34f891..cd8c836 100644 --- a/build/lib/iexcode/instruments/resolution.py +++ b/build/lib/iexcode/instruments/resolution.py @@ -1,9 +1,35 @@ import numpy as np -from iexcode.instruments.electron_analyzer import resolution_EA +from epics import caget + +from iexcode.instruments.utilities import take_closest_value +from iexcode.instruments.xrays import get_branch, getE, slit_get +from iexcode.instruments.VLS_PGM import mono_grating_get +from iexcode.instruments.electron_analyzer import EA, resolution_EA, getSESslit +from iexcode.instruments.ARPES import ARPES_extra_pvs ############################################################################################################# ############################## Resolution ############################## ############################################################################################################# +def resolution(): + """ + Calculate the theoretical resolution for the current beamline settings: + ARPES: total resolution i.e. sqrt(kbT^2 + analyzer^2 + BL^2); default SES slit = 5. + Kappa: beamline contribution only + """ + branch = get_branch() + grt = mono_grating_get() + hv_eV = getE() + slit_size = take_closest_value([10,20,50,100,200],round(slit_get(),0)) + + if branch == "c": + slit_SES = getSESslit() + PE = int(EA.PassEnergy) + T = caget(ARPES_extra_pvs['TA']) + resolution_ARPES(grt,hv_eV,slit_size,PE,slit_SES,T,verbose=True) + else: + resolution_beamline(grt,hv_eV,slit_size,verbose=True) + + def resolution_calculate_beamline(grt,hv_eV,slit_size): """ diff --git a/build/lib/iexcode/instruments/staff.py b/build/lib/iexcode/instruments/staff.py index b9d6eef..ba5648b 100644 --- a/build/lib/iexcode/instruments/staff.py +++ b/build/lib/iexcode/instruments/staff.py @@ -1,10 +1,6 @@ from os import listdir,mkdir,chmod from os.path import join, isfile, exists -#from .ARPES import folders_ARPES -#from .Kappa import folders_Kappa - - def folders_startup(run): """ Creates the run directories for the following: diff --git a/build/lib/iexcode/instruments/xrays.py b/build/lib/iexcode/instruments/xrays.py index aa02940..b4a4c18 100644 --- a/build/lib/iexcode/instruments/xrays.py +++ b/build/lib/iexcode/instruments/xrays.py @@ -8,7 +8,6 @@ from time import sleep from epics import caget,caput from iexcode.instruments.IEX_endstations import BL -from iexcode.instruments.resolution import * from iexcode.instruments.IEX_VPU import * from iexcode.instruments.VLS_PGM import * from iexcode.instruments.slits import * @@ -18,13 +17,12 @@ from iexcode.instruments.diagnostics import * from iexcode.instruments.m3r import * from iexcode.instruments.logfile import * from iexcode.instruments.utilities import print_warning_message,make_table, take_closest_value -from iexcode.instruments.mpa import * from iexcode.instruments.current_amplifiers import ca_average -from iexcode.instruments.beamline import branch_cams_enable +from iexcode.instruments.beamline import endstation_cams_enable + +from iexcode.instruments.MPA import mpa_HV_on,mpa_HV_off + -from iexcode.instruments.ARPES import ARPES_mprint,ARPES_extra_pvs -from iexcode.instruments.Kappa import Kappa_mprint -from iexcode.instruments.electron_analyzer import getSESslit, EA ############################################################################################################## ############################## resets and detector lists ############################## ############################################################################################################## @@ -104,10 +102,9 @@ def xrays_get_all(verbose=False): vals.update(FMB_mirror_get(1,verbose=True)) vals.update(FMB_mirror_get(3,verbose=True)) print("-----------------------------------------------------------") - vals.update({'ARPES':ARPES_mprint()}) - print("ARPES = ",ARPES_mprint()) - vals.update({'Kappa':Kappa_mprint()}) - print("Kappa = ",Kappa_mprint()) + vals.update({BL.endstation:BL.Motors.mprint()}) + print(BL.endstation+" = ",BL.Motors.mprint()) + print("===========================================================") return vals @@ -143,12 +140,12 @@ def xrays_log_entries(**kwargs): #endstation info if BL.endstation_name == 'ARPES': - endstation_entry, endstation_pv, endstation_format = ARPES_log_entries(**kwargs) + endstation_entry, endstation_pv, endstation_format = BL.log_entries(**kwargs) entry_list.append(endstation_entry) pv_list.append(endstation_pv) format_list.append(endstation_format) elif BL.endstation_name == 'Kappa': - endstation_entry, endstation_pv, endstation_format = Kappa_log_entries(**kwargs) + endstation_entry, endstation_pv, endstation_format = BL.log_entries(**kwargs) entry_list.append(endstation_entry[:-7]) pv_list.append(endstation_pv[:-7]) format_list.append(endstation_format[:-7]) @@ -167,7 +164,7 @@ def xrays_log_entries(**kwargs): #endstation info 2: Fanny can I change to order to get rid of this complication? if BL.endstation_name == 'Kappa': - endstation_entry, endstation_pv, endstation_format = Kappa_log_entries(**kwargs) + endstation_entry, endstation_pv, endstation_format = BL.log_entries(**kwargs) entry_list.append(endstation_entry[-7:]) pv_list.append(endstation_pv[-7:]) format_list.append(endstation_format[-7:]) @@ -289,7 +286,7 @@ def scan_ID(ID_sp_start,ID_sp_stop,ID_sp_step,**kwargs): scan the ID set point """ val_pv,rbv_pv = ID_scan_pvs() - mda.fillin(val_pv,rbv_pv,ID_sp_start,ID_sp_stop,ID_sp_step,**kwargs) + BL.mda.fillin(val_pv,rbv_pv,ID_sp_start,ID_sp_stop,ID_sp_step,**kwargs) def mvmono(val): @@ -357,12 +354,12 @@ def scanhv(start,stop,step,average_pnts=1,**kwargs): """ ca_average(average_pnts) - mono_scan_fillin(mda,start,stop,step,**kwargs) + mono_scan_fillin(BL.mda,start,stop,step,**kwargs) mono_energy_set(start) - mda.go(**kwargs) + BL.mda.go(**kwargs) - mono_scan_after(mda) + mono_scan_after(BL.mda) def scanE(start,stop,step,ID_offset=0,mesh='stay',average_pnts=1,scan_dim=1,**kwargs): @@ -447,8 +444,8 @@ def scanXAS(ID_eV,start_stop_step_lists,**kwargs): #Setting everything back mono_energy_set(ID_eV) - mono_scan_after(mda,scan_dim) - mda.table_reset_after(scan_dim) + mono_scan_after(BL.mda,scan_dim) + BL.mda.table_reset_after(scan_dim) if BL.branch == "d": if kwargs["mcp"]: @@ -487,10 +484,10 @@ def scanXAS_BL(start_stop_step_lists,**kwargs): mono_array,ID_array = BL_energy_tables(start_stop_step_lists) kwargs.update('positioner_num',1) - mono_scan_fillin_table(mda,scan_dim,mono_array,**kwargs) + mono_scan_fillin_table(BL.mda,scan_dim,mono_array,**kwargs) kwargs.update('positioner_num',2) - ID_scan_fillin_table(mda,scan_dim,ID_array,**kwargs) + ID_scan_fillin_table(BL.mda,scan_dim,ID_array,**kwargs) #Averaging and Normalization ca_average(kwargs['average_pnts']) @@ -512,8 +509,8 @@ def scanXAS_BL(start_stop_step_lists,**kwargs): #Setting everything back mono_energy_set(mono_array[0]) - mono_scan_after(mda,scan_dim) - mda.table_reset_after(scan_dim) + mono_scan_after(BL.mda,scan_dim) + BL.mda.table_reset_after(scan_dim) if BL.branch == "d": if kwargs["mcp"]: @@ -626,7 +623,7 @@ def switch_branch(branch, force=False, shutter=True,scan_reset=True,enable_cams= BL.mda.reset() if enable_cams: - branch_cams_enable(branch) + endstation_cams_enable(branch) else: print_warning_message(branch+' is not a valid branch selection') @@ -677,24 +674,7 @@ def slit_get(verbose=True): print(message) return slit_size,slit_center -def resolution(): - """ - Calculate the theoretical resolution for the current beamline settings: - ARPES: total resolution i.e. sqrt(kbT^2 + analyzer^2 + BL^2); default SES slit = 5. - Kappa: beamline contribution only - """ - branch = get_branch() - grt = mono_grating_get() - hv_eV = getE() - slit_size = take_closest_value([10,20,50,100,200],round(slit_get(),0)) - if branch == "c": - slit_SES = getSESslit() - PE = int(EA.PassEnergy) - T = caget(ARPES_extra_pvs['TA']) - resolution_ARPES(grt,hv_eV,slit_size,PE,slit_SES,T,verbose=True) - else: - resolution_beamline(grt,hv_eV,slit_size,verbose=True) diff --git a/iexcode.egg-info/SOURCES.txt b/iexcode.egg-info/SOURCES.txt index e22a33a..4b38e09 100644 --- a/iexcode.egg-info/SOURCES.txt +++ b/iexcode.egg-info/SOURCES.txt @@ -15,6 +15,7 @@ iexcode/instruments/Kappa.py iexcode/instruments/Kappa_Euler.py iexcode/instruments/Kappa_det.py iexcode/instruments/Lakeshore_335.py +iexcode/instruments/MPA.py iexcode/instruments/Motors.py iexcode/instruments/Scienta.py iexcode/instruments/VLS_PGM.py @@ -38,7 +39,6 @@ iexcode/instruments/resolution.py iexcode/instruments/s29_temp_cntl.py iexcode/instruments/scalers.py iexcode/instruments/scanRecord.py -iexcode/instruments/scratch.py iexcode/instruments/shutters.py iexcode/instruments/slits.py iexcode/instruments/spec_stuff.py diff --git a/iexcode/instruments/AD_utilities.py b/iexcode/instruments/AD_utilities.py index f8d43d2..15dd0a0 100644 --- a/iexcode/instruments/AD_utilities.py +++ b/iexcode/instruments/AD_utilities.py @@ -13,7 +13,7 @@ from os.path import join, isfile, exists, dirname from time import sleep from epics import caget, caput -from iexcode.instruments.IEX_endstations import * +from iexcode.instruments.IEX_endstations import BL from iexcode.instruments.files_and_folders import get_next_fileNumber diff --git a/iexcode/instruments/ARPES.py b/iexcode/instruments/ARPES.py index 90f825f..a2337c0 100644 --- a/iexcode/instruments/ARPES.py +++ b/iexcode/instruments/ARPES.py @@ -3,7 +3,7 @@ from time import sleep from epics import caget,caput,PV -from iexcode.instruments.IEX_endstations import * +from iexcode.instruments.IEX_endstations import Endstation from iexcode.instruments.staff import staff_detector_dictionary from iexcode.instruments.files_and_folders import check_run,make_user_folders,folder_mda @@ -12,11 +12,12 @@ from iexcode.instruments.logfile import logfile_name_set,logfile_header from iexcode.instruments.conversions_constants import * from iexcode.instruments.utilities import * + from iexcode.instruments.userCalcs import userStringSeq_clear, userStringSeq_pvs +from iexcode.instruments.scanRecord import ScanRecord +from iexcode.instruments.xrays import xrays_detector_dictionary,xrays_reset,xrays_get_all -from iexcode.instruments.scanRecord import * -from iexcode.instruments.Motors import * -from iexcode.instruments.xrays import * +from iexcode.instruments.Motors import Motors from iexcode.instruments.current_amplifiers import * from iexcode.instruments.gate_valves import valve_close, branch_valves from iexcode.instruments.shutters import branch_shutter_close @@ -47,7 +48,8 @@ def ARPES_init(set_folders=True,reset=True,**kwargs): #endstation global BL - BL=Endstation('ARPES',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord) + BL=Endstation('ARPES',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord, + ARPES_log_header,ARPES_log_entries,ARPES_motor_dictionary) #EA try: diff --git a/iexcode/instruments/FMB_mirrors.py b/iexcode/instruments/FMB_mirrors.py index 888d9b9..083b9e6 100644 --- a/iexcode/instruments/FMB_mirrors.py +++ b/iexcode/instruments/FMB_mirrors.py @@ -4,7 +4,6 @@ from epics import caget, caput from iexcode.instruments.IEX_endstations import * from iexcode.instruments.utilities import read_dict, print_warning_message -from iexcode.instruments.m3r import m3r_branch M0M1_fpath="/home/beams22/29IDUSER/Documents/User_Macros/Macros_29id/IEX_Dictionaries/Dict_IDCal.txt" @@ -57,9 +56,6 @@ def FMB_mirror_get(mirror_num,verbose=True): message =+ "%.3f"+"/" % rbv if verbose: print(message) - if mirror_num == 3: - mirror_branch = m3r_branch() - print(" => In "+mirror_branch+" branch") return vals def FMB_mirror_move(mirror_num,axis,val,verbose=True): diff --git a/iexcode/instruments/IEX_endstations.py b/iexcode/instruments/IEX_endstations.py index 94ee6e1..6bff704 100644 --- a/iexcode/instruments/IEX_endstations.py +++ b/iexcode/instruments/IEX_endstations.py @@ -26,7 +26,7 @@ class Endstation: """ - def __init__(self,endstation_name,scan_ioc,xrays,BL_mode,mda_scanRecord): + def __init__(self,endstation_name,scan_ioc,xrays,BL_mode,mda_scanRecord,log_header,log_entries,Motors): """ intializes the several beamline variables @@ -40,13 +40,16 @@ class Endstation: BL.prefix => 'ARPES_','Kappa_' BL.ioc => previously: BL_ioc() BL.mda_filepath + BL.log_header => dictionary with header list + BL.log_entries => method to get pvs to be written to log file + BL.Motors => motor calls """ global BL endstations_list = ['ARPES','Kappa'] BL_mode_list = ['user','staff'] - if self.endstation_name in endstations_list: + if endstation_name in endstations_list: self.endstation=endstation_name else: print('Not a valid Endstation choice') @@ -74,6 +77,9 @@ class Endstation: self.xrays = xrays self.ioc = scan_ioc self.mda = mda_scanRecord + self.log_header = log_header + self.log_entries = log_entries + self.Motors = Motors def set_logfile_path(): @@ -107,25 +113,3 @@ def BL_mda_filepath(): returns the mda file prefix """ return BL.filepath - -def scalar_cts(self,integration_time=0.1,verbose=True,**kwargs): - """ - Sets the integration time for the scalers - kwargs: - mcp = True/False to sum mpa - Previously: cts, Kappa counts - """ - - if BL.endstation == 'ARPES': - pass - elif BL.endstation == 'Kappa': - Kappa_scalar_pv = "29idMZ0:scaler1.TP" - mpa_Proc1_pv = "29iddMPA:Proc1:" - - caput(Kappa_scalar_pv,integration_time) - - if kwargs["mpa"]: - caput(mpa_Proc1_pv+'NumFilter',floor(time)) - - if verbose: - print("Integration time set to:", str(time)) \ No newline at end of file diff --git a/iexcode/instruments/Kappa.py b/iexcode/instruments/Kappa.py index 18c9810..c64636c 100644 --- a/iexcode/instruments/Kappa.py +++ b/iexcode/instruments/Kappa.py @@ -13,17 +13,20 @@ from iexcode.instruments.logfile import logfile_name_set,logfile_header from iexcode.instruments.conversions_constants import * from iexcode.instruments.utilities import * -from iexcode.instruments.userCalcs import userStringSeq_clear, userStringSeq_pvs -from iexcode.instruments.scanRecord import * -from iexcode.instruments.Motors import * -from iexcode.instruments.xrays import * -from iexcode.instruments.current_amplifiers import * +from iexcode.instruments.userCalcs import userStringSeq_clear, userStringSeq_pvs, userCalcOut_clear +from iexcode.instruments.scanRecord import ScanRecord +#from iexcode.instruments.xrays import xrays_reset,xrays_get_all + +from iexcode.instruments.Motors import Motors +from iexcode.instruments.current_amplifiers import SRS, ca_reset_all, Keithley_pv from iexcode.instruments.gate_valves import valve_close, branch_valves from iexcode.instruments.shutters import branch_shutter_close from iexcode.instruments.slits import slit3D_get -from iexcode.instruments.Kappa_det import * +from iexcode.instruments.Kappa_det import Kappa_Detector +from iexcode.instruments.scalers import scaler_cts +from iexcode.instruments.MPA import MPA from iexcode.instruments.spec_stuff import folders_spec @@ -53,15 +56,17 @@ def Kappa_init(set_folders=False,reset=False,**kwargs): #endstation global BL - BL=Endstation('Kappa',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord) + BL=Endstation('Kappa',kwargs['scan_ioc'],kwargs['xrays'],kwargs['BL_mode'],mda_scanRecord,Kappa_log_header,Kappa_log_entries) #global detectors - global tey, d3, d4, mesh, Kappa_scaler_pv + global tey, d3, d4, mesh, Kappa_scaler_pv, mpa tey = SRS("29idMZ0:scaler1.S2", '29idd:A1') d3 = SRS("29idMZ0:scaler1.S3", '29idd:A2') d4 = SRS("29idMZ0:scaler1.S4", '29idd:A3') mesh = SRS("29idMZ0:scaler1.S14", '29idd:A4') Kappa_scaler_pv = '29idMZ0:scaler1.CNT' + tth_pv = Kappa_motor_dictionary('tth')[3] + mpa = MPA(tth_pv) global tthdet tthdet = Kappa_Detector() @@ -133,7 +138,7 @@ def Kappa_detector_dictionary(**kwargs): 38:"29idMZ0:scaler1_calc1.D", 39:"29idMZ0:scaler1_calc1.E", } - mpa={ + mpa_dets={ 30:"29iddMPA:det1:TotalRate_RBV", 41:"29iddMPA:Stats1:Total_RBV", 42:"29iddMPA:Stats2:Total_RBV", @@ -158,7 +163,7 @@ def Kappa_detector_dictionary(**kwargs): #hkl are listed just a place holders, they are filled in by thier scanning functions det_dict.update(sample_temp) det_dict.update(scalers) - det_dict.update(mpa) + det_dict.update(mpa_dets) det_dict.update(motors) if kwargs['add_vortex']: det_dict.update(vortex) @@ -278,7 +283,7 @@ def Kappa_reset(): #resetting mono and anyother beamline stuff if BL.xrays: - xrays_reset() + JLM="xrays_reset()" #reseting the Kappa Lakeshore @@ -291,7 +296,7 @@ def Kappa_reminder_list(ioc): """ resets scanRecord, current amplifiers, mono limits and synchs motors """ - mda.reset() + BL.mda.reset() if BL.xray: ca_reset_all() @@ -320,8 +325,8 @@ def Kappa_get_all(verbose=True): #beamline info if BL.xray: - beamline_info = xrays_get_all() - vals.update(beamline_info) + JLM="beamline_info = xrays_get_all()" + #vals.update(beamline_info) mesh.get() vals.update({'mesh':mesh.current}) @@ -364,7 +369,7 @@ def Kappa_log_entries(): tey_current = tey.current mesh_current = mesh.current det_name = tthdet.name - mpa_HV = mpa_HV_get() + mpa_HV = mpa.HV_get() m3r_centroid = vals['kphi'] entry_list = ["x","y","z","tth","kth","kap","kphi","TA","TB","TEY","mesh","det_name","mpa_HV","m3r_centroid"] @@ -648,26 +653,26 @@ def Kappa_th2th_scan_sensitivity(th_table,gain_num_table,gain_unit_table,detecto tth_table = 2*th_table kwargs.update("positioner_num",1) - mda.fillin_table(kth_val,kth_rbv,kth_table,**kwargs) + BL.mda.fillin_table(kth_val,kth_rbv,kth_table,**kwargs) kwargs.update("positioner_num",2) - mda.fillin_table(tth_val,tth_rbv,tth_table,**kwargs) + BL.mda.fillin_table(tth_val,tth_rbv,tth_table,**kwargs) kwargs.update("positioner_num",3) - mda.fillin_table(gain_num_pv,"",gain_num_table,**kwargs) + BL.mda.fillin_table(gain_num_pv,"",gain_num_table,**kwargs) kwargs.update("positioner_num",4) - mda.fillin_table(gain_unit_pv,"",gain_unit_table,**kwargs) + BL.mda.fillin_table(gain_unit_pv,"",gain_unit_table,**kwargs) print("\nDon't forget to clear extra positionners at the end of the scan if you were to abort the script using the function:") print(" Clear_Scan_Positioners('Kappa',1)") scaler_cts(kwargs['cts'],verbose=False) if kwargs['execute']: - mda.go(**kwargs) + BL.mda.go(**kwargs) #clean up after scan - mda.table_reset_after(**kwargs) + BL.mda.table_reset_after(**kwargs) scaler_cts(verbose=False) def Kappa_scan_th2th(tth_start,tth_stop,tth_step,th_offset,**kwargs): @@ -830,7 +835,7 @@ def KappaPreset_StrSeq(n,User): scanIOC="Kappa" motorIOC="29idKappa:" motor = ["m2","m3","m4","m9","m8","m7","m1"] - strSeq_pv = userStringSeq_clear(mda,n) + strSeq_pv = userStringSeq_clear(BL.mda,n) if User[0] == "Kappa Grazing": phi0= 0 if User[0] == "Kappa Transfer": phi0= 57 @@ -856,7 +861,7 @@ def KappaPreset_StrSeq(n,User): def Bragg_Angle_CalcOut(d,eV,l): n=7 - userCalcOut_pv = userCalcOut_clear(mda,n) + userCalcOut_pv = userCalcOut_clear(BL.mda,n) h=4.135667516e-15 c=299792458 @@ -906,9 +911,9 @@ def Kappa_safe_state(**kwargs): kwargs.setdefault("shutter_close",True) kwargs.setdefault("valve_close",True) - if kwargs["EA_off"]: + if kwargs["mpa_off"]: try: - mpa_HV_off() + mpa.HV_off() except: print('MPA is not running') diff --git a/iexcode/instruments/Kappa_Euler.py b/iexcode/instruments/Kappa_Euler.py index 42dfe2f..ea02590 100644 --- a/iexcode/instruments/Kappa_Euler.py +++ b/iexcode/instruments/Kappa_Euler.py @@ -2,7 +2,7 @@ import numpy as np from epics import caget, caput from iexcode.instruments.userCalcs import userCalcOut_clear -from iexcode.instruments.IEX_endstations import mda +from iexcode.instruments.IEX_endstations import * from iexcode.instruments.userCalcs import userCalcOut_clear #### Obsolete? diff --git a/iexcode/instruments/Kappa_det.py b/iexcode/instruments/Kappa_det.py index 9a1a190..c001020 100644 --- a/iexcode/instruments/Kappa_det.py +++ b/iexcode/instruments/Kappa_det.py @@ -1,7 +1,7 @@ from time import sleep from epics import caget, caput -from iexcode.instruments.IEX_endstations import Motors +from iexcode.instruments.Kappa import Kappa_Motors ############################################################################################################## @@ -27,7 +27,7 @@ class Kappa_Detector: #det_name = caget('29idKappa:userStringSeq6.STR1') det_name = caget(det_set_pv) self.name = det_name - tth_val = Motors.get('tth') + tth_val = Kappa_Motors.get('tth') return self.name, tth_val def set(self,det_name,move=True): @@ -43,13 +43,13 @@ class Kappa_Detector: yag: yag 'fluorescence screen' """ #get current value for tth - tth_val = Motors.get('tth') + tth_val = Kappa_Motors.get('tth') #change det if det_name in det_list: caput(det_set_pv,det_name) if move: - Motors.move('tth',tth_val,wait=True,verbose=False) + Kappa_Motors.move('tth',tth_val,wait=True,verbose=False) def tth0_set(move): """ @@ -58,7 +58,7 @@ class Kappa_Detector: only works with d4 """ current_det=caget(det_set_pv,as_string=True) - tth_pv = Motors._motor_dictionary['th'][3] + tth_pv = Kappa_Motors._motor_dictionary['th'][3] if current_det != 'd4': print('tth0 can only be redefined with d4') diff --git a/iexcode/instruments/Motors.py b/iexcode/instruments/Motors.py index 119b51b..8b8f7ad 100644 --- a/iexcode/instruments/Motors.py +++ b/iexcode/instruments/Motors.py @@ -3,7 +3,8 @@ from math import floor from epics import caget, caput -from iexcode.instruments.IEX_endstations import * +from iexcode.instruments.IEX_endstations import BL +from iexcode.instruments.scalers import scaler_cts class Motors: @@ -220,7 +221,7 @@ class Motors: outer_loop_list[2]=round(current_value1+outer_loop_list[2],3) outer_loop_list[3]=round(current_value1+outer_loop_list[3],3) - scalar_cts(kwargs['cts'],verbose=True,**kwargs) + scaler_cts(kwargs['cts'],verbose=True,**kwargs) BL.mda.fillin_2D(inner_loop_list,outer_loop_list, outer_scan_dim=kwargs['outer_scan_dim'],**kwargs) diff --git a/iexcode/instruments/__pycache__/AD_utilities.cpython-37.pyc b/iexcode/instruments/__pycache__/AD_utilities.cpython-37.pyc index 763286c8ddcdce49fed5d93a0cf42c0560f773e6..1a6e8475e8f93358fb1fe83baa8349354c91d9ae 100644 GIT binary patch delta 2155 zcmaJ>Pf#0W6z5Ae8z4yuC8dQB2qcs&Nhydr6<dLj(jpKjjkJ7H(~xh0ok=$7mt761 zW9v*0cE(F*t1~*|p*QV}UUG1H^yZA?j2>M**ijGl;*4W2J&5mZ5R!H@hu?d7?|Xmu zy=Sidy5@;{JgrUeyZ7U_8~5*cx=8b#q5O@!kNQXxBdj@hB;QFpfp1~0x0>it=3;K3 z$C!s50@}sem=|a_YiEan`dJ6_0qtQ&SSQc`JIam$?PXo88)zT%vmT&97GS+V`&l0g z0v%u@EX)RP5gKAAnLolLV8d*b4YMe4gKUh&*a_f{8^h!WyDh#@b=XF2hp0WFaPEZy zK5OEBV@7zN1dQ*5w+S^C9kGZX6x@Oy;LMikM7qf3O{F{xe@g;Dli(%1&$#FK2~6G* zj{<%u23>WA##ds9gsQ)Zig1=T>m`{NGuk$7Dd`)Vg&dRl6EgAW@7>+q<RgGx-V07E z!ic79Qrq?ml8p+fx!GB2Kc4`Q%NjKd*CK>@=<4gIt+Pr_PU`s$nN!cSt`+9gESK}L zs__BvLydlSIzpXbmQb>q>DaVlw{GrR)vBwNXng9PC!<jQ^G3vTeIx=7QWD|qK!LcC z*mxJZ6_>3pG#G#H36U}5vFFJMb#5vu%j9yB-FnVXqKzx7a}J56xvn-C2HFP5cy+2R zLfm0^$bA4we%#Q!K`8SBZ|KZ8NF=cq+Er^>TFvBT-i?mk|2oFrnj~+MM*ok!<K$FT zYX6#$u<_^Ng&-9#D(Y5F-U4g*{XEHoKzKhuQWCgiywTC^9YIn3XMC??luT70bo@@T zFQLxLl^{0(P;q24`LPN9G73%uq?8yap<!oG@(Mx_fI1UODYF5=KmG`R4<`8}id$z2 zs-~!VK`;GJ4x^n>GF@Ho{L6mhzjL6@SuV>fx|*VG)7fjf!sV2bm(wfpRocEMSeCg` zV3x>zwp=Wf^x7lps<YU-?)&20!^*8mtE$F&Rw3#A5|WaWOCaFK5O7fV6oLoAg)j{O zt;ONt*jXyb<zk8one4SxLzf5rFOqn5-S4w`pRUlj85p{X{e8BzNy%}LfN56>Ssues zm;k7(uqRM}u}!g*&8W+(rc>j})|Sj05^(lL$-J@d@2W2Jeq%rRbP`~{_o*wkkrYp$ z({l*32s6g)z|G`AE2dC5iZG90<#ZmoD8Ms`@mEnbhfqIwzR);XsGbiUCNns5dsEvq zMTJF0y=>tcbzD>`^5q&?qe9%$0InU(cEuh%5v0Z^;oyz^=2(f;R@-ITrW2;PvNWga zdFm`@VOQa*ICu6KN4W$csAI<>!iE(AaILnNV!5PcxJJbti`G{FNt<pso!~lMk~O_( zoE{943)L%wcgZ}KR1qdXcaSL+lCa&T9fVNPcBUv(`-;psZX0!+gXvZu?IJJ4bGl5$ zOA6DrFH__6(7UVD{u-PCJbp=7zWqXBLYF|sm(k3*w0d?0t8B?Bs{9sOn~std$APLb zp2D~FAE6^MK`t4|$RBV+UXg-PbSybcQZ~ts<=J#Dy(#mB%#LY?d)#1qTMCi&>gQ4m z9-uFW`=j{vYpJ=>jlGr{Md|AZ^?~itq4X7eCGthoS&&4|0z8)1#e`y4kiQ53e7*dD zA2OZkG%IA&Y1+&(nykTH;LjPiqj+iWM|%QPutd1C)FBs@Y^k=+xJcCaB^nm_A&YH} z#jXZ`<9!Gr1Z&R6kQ+xhg)oJH%g^Ho))p)vcLCuN!a4$0SXZ{yfF9#+EKJ<SgINDR D8dLjy delta 2116 zcmaJ?O>A355YF1~*-30S&QH@gzjmB7aqOmv+M+5@h5WZ_>!gkw;uPV&yxk;^+Ry3w znL6eW3h4m}Dzy)2DH2Dd9-tCFAt5f65E9~w#EJt*2thAgkPyAV%qC6ZR^Y=oquHIA zZ|2Rce@TgyZ`|jrt%Bdf&F_})-|_{Ba;q=9nXICOR%e>B2bT_#Dq2Hpx2l$!sfT(& z9-=;a0AvfTqkfP9T2C85w$eu01hS1Dq|G4P=^@$zvV#U_E67gTM%zJl(GJ=PGDy2< z5M+oB(jMBoMV7khQQA)<TZhO}m=4ha8U<qy9i}mQ1higzko@2v1La!BkmG=GP8yv1 zf&2X`-fo{(-XWd#-`?YPje430JE6ur?QqB?bl7jJ?IdJ>qW%~V^%J@5dck7zmS!1w z%h2<}nPPcif8+{Q_<ZdOlfLpJm!Wt>bs^9Ax@N5j`xQ?h6ok+vWzaHKgk$YQ#37XA zndxcaJUt1(ik7hNdd>rlUp-wRQ9Es9SiF#3W?cBj3RdonsdJWPrp0?9j<64V)BVB? zZj**?33Wy0sa@Ii+Ad<Jl25&7$rx1nKsgT1c3N#|nB#24C|2D1-WMhl_G91ULE&C8 zOsZuv5ho9T2Oq_p9=*UhFi7))S>f1S*G*>1Q+55sJAk*F0OCAmZ}@{y&pm(m)C^c6 zE*VRBR&p82c-qvmjJIN7?~}mTFhR0{RK|boKSpNDgZ1AKGGPDJa4slZ^M<*aVXNQ` zzn?~VHwYdEh({ED()KjB`cI*0|Mz^iafmFIziNC$^f^3}TnTCy07|N^Wrs(20uA#3 zNh1b_5eHAA<st%R5$;JNuPsCJdmrNOi&4IS=GuvzX&GiASIGYlhZD_Fa;dB}|LNTP zZw|se%^6D+%%rFr)2|i`&XPu!r4!=|qJGCP$GDNB(&U{guIKWF?MuS5&tvuVrq5=6 zE^Up<sw(S2(z_+ZBW`{YD{MjVA}k{K5IhK%0HC#U8nClMVa4^NP&EB&vZBiaZO;+C zthF^c{7+YC-{|POjQxGKweg6$M?g4@oX(%ev`7GsWZD<dAalF&x@OKT2)D(J)m6qT z2zWcABx7rBf%1jUZ=FY<CILZqK6S}4nB)wDt|8zsacZCKej~ou3fYA*JjozPP6lct z0M8KPSMcang#CjT2p=Qa^7(KB*~FRKncAusg>v377bT{II&YNN;<iW$Wn7*BruJsL z<P07OipD7u$8Q4Gb6L}`<Z%X)5yI;sG)~@b-y}!*F(V$~7@HKXL}K=gS;z`^QHMQ- zU2|{jC~7ee>4mx>g|aNO1E#ij)>X_~8n=XNL&}QkhI)s|_40D>d*m!uS5ihG%N}W= z#9`5e6O2&YnzoKQqZ}7cs53C==I{TYu8e02Ot@Y$sI|5z?6JP<3&MF3UIcvb;;@Ii zg~7010~;@*n|pR)DuG4SWDJvCLvNwxWgZoehWQP=yZ?K%^pB9+_I&>z=Op3kkqOz2 z#nKZkh3Vw%W6p>wNKudtnH2K9#`rmHLpb4it_XWG5+--bpGRu&nfh`d6vY|YW{n#K zZ>ePcK3YFO*w3jt+IQqG-g0ph&m`nflYmdEd{=?ko2b8KzZ`9EJ}lhnG|lPhw5X<< z#VmLx_@sR^iVyFDXnTiHqzPA8sB9hnxVE<&ixc*5(H^+h5Q|;z#F!z3J_I@O6R6D~ o%p%BDxP+RHAon4Q+I5862zL;$ihZTYB0KDlV?CtWei#e=3ngbD$p8QV diff --git a/iexcode/instruments/__pycache__/ARPES.cpython-37.pyc b/iexcode/instruments/__pycache__/ARPES.cpython-37.pyc index 062ed0acd605454bc28bed0f3204edf64921a4eb..638823899b8a5742d22cc711aa7fbd24ab3aa5c6 100644 GIT binary patch delta 7047 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 H<LdtbKIljS delta 6882 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 Jjz^E2_&=YvQ+NOX diff --git a/iexcode/instruments/__pycache__/FMB_mirrors.cpython-37.pyc b/iexcode/instruments/__pycache__/FMB_mirrors.cpython-37.pyc index cc28ad732f71f5749fe7379b7c1c41463fa49469..57c1211c32d375f886d98398dd6a047fcccc963b 100644 GIT binary patch delta 1584 zcmZ8h&u`pB6!zF&uh&_7cVlO>O_Ov(5{g@r5K!7Af<|gcdfFsnqd-Rj<K1zBRqqdt z-GHK$P|+I)6#3FW0Pzp3xbQzzLOpP>1mXlo?iB~#v#WNy*6!!$H}ht`_ue=2&y7EA z<F2l20zCV_JZl|Wmqv{|y}Z8e<!FH^EdNBH8dF&T-eYWrjj`erLW^vc>C6C2XV+MX zmBBJtomJR4SS2>cEH(jFnN`^&L{?ahU4i#Fdy7r6t1x1+>84=MU;cJ)ut?U4VgLbd z#BK4*(ioVbjEr(M!pGz1;@|gG94;UrRgP155kUu_TJwJMaHruk51Y2g$I&kV*fKAn zT?R<R{wY<$$c-L`JlhP1Dse@wnkJYbZXx7rL?uO$Tk)p+oQ%hMZgvURNM!dLKTPtc z9&hzRk7Gn4@z!Y~hW$6z`z$vzU5C*S=?StbR!LQqNloO};JYoxk1G}l;-7P^(pQmm zE`Lvma4tbD^mtAA{9+m=oym*K9~{3RE0Dkxe5a9#;`aMqm+>p$vDGXyoK44&niIG! zF9@l8>IT5G<AtGn;_<5(K7%leFqAlaCdO{#uG8^3?{VkEi<SjJ5<)B9%1?@Xe(**9 z8BwYjHW{xLHpz4x6c(Jcy4W3VA&3Z=8P5aQO2!MfO(dYgkzrab3KjI;C_T<84Ke8S zPQ8!fe+zSDc~H@2$;AT3E+V{*a2??t1RLN?b(#mu2cPV0^Nb_<^v3?tj<enP7zXyY z`3>+L`Ukr}OyoB)@?C%v_`~zpmQ7N6dv-3<%t%&ym==s-|Eb>Zg?{Asx=!GS(d)Fb z3Xjy)9LdUYgW%Knzp)vzGMFkpBD-l-2(0^p)X(Jl(w+J%5@{`=6GGbPwEuSgbyfKi z4rNu1|Iin2k8E8Y+B*8$b00i_`I#0ql^CQ*%AiKRI@mCv!dN*fK_U4BSbLziSM8-z zhq+Wa_JhFhzN|u$g9F5)L=K}~AJOZly&cuna96{&+x-?fC;)=0N(SL;V6{OxgWpS! zh&_^l)_AY6>O^iU@P5R&^d?YL!Z!!!m7hqt4o*HKjd;#9&0FB4%KIBWb2{mr0Gd5A zSCp*j@ek(Bi%pmU3G@R$N^;!oo_L8Ac-`!T;i2Mb|54Czyw=gN0YJrjJ*vGtBp?Es z>-3@?Pl!*&gCi;(fyhTP$fp@J51vAJSOXB0GKtr$iCbG>@7d&V=(lT=UE88^<afOE zG|`;b_uFB5gQb*c{GGKR(wX?NWyQZ*<{7^Y%VeEO&tNK<dGw{aSwU+R0qe{$Z;l%e s(M$<fz?Y~Wc6#h#;N3wrhN!EeSQb@OiKMEkt{GZMo6;=JR4Z!Xe>iSB8UO$Q delta 1749 zcmaJ>O>7%Q6yDiguh$!||JJdc-#Q`v+5RMHqL!AXY1)vWBAiAzii8m|>&zysy7rpc zO{l6=0b1pNxI}y9*aKJO3rCJzDxn_dfH;9TaO8r7#CzkaG7)0s{r362H}n3!nV;?7 zE@tkTrXj(z`1y-gcK9SyA<s|F-#C(J!cVo0hCw8%HHK)C>d&M`nx?1$Uz1MKG&P@* zMuwiD8JYztORF?T^C0Eu6fIB-q&%Ib!?XlaftG0nR$6p~j>5M{-=Jf394y0hqAuAp zzhe?M;fc_9-R{ZDn;H0Hv=>>k#hlL0C%qwZgJ@ZBV%hk<{Bbr7VyNP(M1?Rb{$Bp| zD1~M$hYca13o{Wi01c!5L49kj)~s*UZJAl9R{(64<xtK8aJhTHwJ>s`{gCy8p{anT z{Ce$Pv+Xe!ux8(*2<lJ=kdhUmle8kUQe0JEzK47B1Pk^%RD|G(F7rAOSHg(dnh3{L z=aCok<blgtLFh8viz}>kz~!(z7&=}~OkAA;Yl!7YsxFsENmfZkW~kkfQ40^&uEDzs zZ}?UGb)t3UI8qMPr-Vp{5;Y&n>^M@NN>B7ip_xOyEYWOP5>^EUkc<CLd~`Gkiyy0J zXBT(>B6F;Q|B}_)%hmgxDhT~a*a<cc1`(ZWPPgkqm1C&ER@kY2H*u%N5Z2iAotEo| zTs?3AlWjK)ojsRL;EFQ{RdhA6vo&aKKgeJQz|1oP&EIpQInafp0Fs&`D#;Op6vV5- z9CV_AhMnvEsl6Z?7Qsg1AN9A$WUQoS-W7vK;;<3|_D|Hpk|4dBj>wKHkTJtT`qP1l zx&LBC{AsF4?#9QdDYDS}HZ@6(&ZF}M1RLQZ!X<>u0FU)%eRFp6{k2umSvG<?v-V(n zt+`rz8w?Lt*%i=jd7JByiOgnkC6>AeFFe28v5ClM17`4FW%$SlupyrtW;Y1E$O}46 z-vi#guA|@iQ{=V=`r8f;+@|CEAHpsn@={9bqPay<Br>$ukTt><d*2N`A<)w~b9i1P zgTdJXf?xxZ#7_3vAcj4UrhXc6WS)KVR0_F)6r#^u=V1W;ebO5`$&fV30qxnf-cRNv zspD813N)0JLE3;r{JJ4rX;X)5yPofRombs}dnIyM#MLkgx`=L940Vua@!f1O|0M>+ zb0q1yk|FF?Zx?Pi`&6z*ZN7H3896QAjd6jvhcunAm7bM<POeXblKn3k*b=xjw1t}< zZMMbz1SI{VFsJp09#31B$V$9nmB+<l6CD+#MZVfPTgC`?;x8=gGEcOFC}5m;T;AMn zDBHl=Q~4%EzV*#-;vcN3>+itY4V!EY{MK!<ZkM<kd2Lr537&Af-cBg4FNT46TrSQK z9xoLy9PzT}KH3SWJL`3TTKjFc6NR&IS&J)x-NxL+IK&APyf}wCL5@X~t|8n)SV6#y w267hJi%VBuY6o=Rcb5rxgh-yWoEwvMIN)hnRdii9jf_z+MvbCj>3Kc%4>{&txc~qF diff --git a/iexcode/instruments/__pycache__/IEX_endstations.cpython-37.pyc b/iexcode/instruments/__pycache__/IEX_endstations.cpython-37.pyc index b4ef735bafb06232202d431f08609321d27de902..8e65b8fe990c1e2b9197a6c897ee4d0453c48d44 100644 GIT binary patch delta 1135 zcmZ`%&1=*^6wl;qv)QjIwYF9zU~63jJqS|47OYecZ9!TrrJy0r%yy^EChKHs6(V~O zZ$&6Mc=pnx;K$K_L5~W9|BJr2P1ho8!u;mtz4!aQ_h#~I{QX#cp;mJ>cs~62wzX6{ ztdEoR!<ltUU(=fPj|Xo^uZ&T6DzFS#_hF^q0VtvRw*IP24Qj&fW+W@`+QNff^R;+f z5^B9BM1$SV%I7t-X=zQ%%*=(nx3Fuzo|!uaHFkB8WrPygThsx+Ny~uNvx6SEb#Nb0 zx9_g>-A8?z3H~EmMSs6stteN|+*9QYh})SCSjsFwC$j;|Sqae1uvi7#YBqumUDI5z zcz7&%5b@8y^>?JVuzVv*w*58>C==e?yhnK`c@hWWrMJ&z+bbdwPvt-Xg$g2zrQj?@ zW{1gkLOq#y+e~`h=P8<7%-a`SN*3c6l=50UVgsdzh15zS6LGA9mKO$5ln$~mY4EXW z-CKRMxTdV7pxX_UxtB7b@-OB-spfN*M^ygQn(Qf~Lj&dholRBHF4|T0alvLqnJJ4} zn++DzR0cS?9|s+#oHPt#pC_R>1Al}nEiC(;gfdkJSs!DoEKCFyqYxG65XJyDM+%+% zt95})=0B~lavS{Gs6!mx$rtUWZj*e+j;>E4=O4HTJ~fgu=|iu0PJTC#?Z-JOZQQzq z`IrAg5+(#jV5K&IQ!#aCR+zcxT+Kg~9$Xt%#)gStyeCM4zeCeZF$Dy6^9tDFEW!|) zn1DbC>x47WFQT00ojwnH7{*gIJU}?Qu3#<xf}c{DK2hkQf^u+f9DArtqmVgCN=^yQ zfQ=X0K{Ae{Ov&LYE!O2>Dh%+5ev^1uVhRDL5z`1jo*mw~a~CdtFJkiq@=_eI3U^s` LO})P2*!cbdtilP> delta 1429 zcmZ`&OK%)S5T2gtdF<@V-n<qeoJk@PR-n8%WyM1=iU9?ORlG`~k)mNd-L}Wx-I;XH zI$(`i2?Hk-Va*9RaSOK~PPy<8_yeOHxbXvW<Up!=z0xW&y{hWkdRNWYzn*^HZY<a9 zt_J7kFMqA4jl)Kpd~ta3ZnMP}*y6XuuQGj2>zw%goA1cPLO(bTkOA}&ko*%EBTV1a z_bp~H3b&nW+gfhzSmJz6axEaEcBV7)fDjFCE4R*QC^LIa%V}<d-;Z!>fsxZ~%8VUd ze4P_U;ND^m=uK7uZasMT7}PqbA2U~}tEhhXM1@h%KVdc0t8(?Da*f=cD`$Y+&UN5U zZUV1h6P;%Gl>G5R|BWoU-q9(|8+Up)*GltNn5JP#$C3-bST`TF+_K3>OlDygC!=5# z4tY_U9`TER&DXoWF=S!KDXHXx4N-;N_>PRiQ4lAQScJc&z5H1)Oc?hY;2EIp4v!MS ziXW^C<W%w0imF$@Pg`_|qr1hD-6>Y>t+!8sO1#2OW4;B+vtW>HZo~r~q+z!8dGWV> z|J^g_-~OK<LBX&9B=M6vRjNDJ1TFq^-YgECmA8&7V?o<6!#xbrfoW7MK>)w}2FRj? z?3gfd5)2Q3W-%vKk!O|8brpv_92ZyCaZ9kDRPc@X%V;jc*;$4OW+)w;8^=C2P4g(t z%qgBrbPnWye*Ov1vk&_b0vZo)1lMy5NZtpQY1>mU)<&Nw84=iL#$=x|x^HGWV3!=| zM9U3kzNU#~(3lJ`o*5ZEm|7qpGnt)PGYxY9c9p&F72ei(CcSKnd+{jan?eE0%i<yT zHWHx>0Fwb1QhDz@3dN@Ex|11Hhf(Ui@Abu)UtS3Zl6zU=$??z|rlAVx3BDUAV>$S$ z>qVJ-$5W8@qGUXRy2?eEFsQ)M_gdGk$86QV(w)}4da2*rYod;=_HJ~0B8jdd%F}S- zS8k7oEAb%XVz2$_tE~epp^@(GjxE%uu3-gSvOxHh6z3Cl6b+e)jwMcj>@Uo%AV8PW z-sNIFk-W5~gZoX@ejq2XlTZZdu3v+00@WG(o5O*6A1=-TelU3g6(k~3b6lbmmrz1= zS9eHDr$k%?eMcAP;p%s4J{=;cuvc*bm~Zklj^uO#HPBr|iC990ImKCI2r89nt_}4r fR4>kZ@bbq4{s93uiI1iRkG$qmz45VQO@A)|XBkY4 diff --git a/iexcode/instruments/__pycache__/Kappa.cpython-37.pyc b/iexcode/instruments/__pycache__/Kappa.cpython-37.pyc index b280eebee6bb33b0a5a9ee70a1958a91420d40e9..736a0ae36869c21290ea6c99ada18730aef76083 100644 GIT binary patch delta 11054 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 delta 10776 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 O*}HA7EBQ~S9{PW64r^xs diff --git a/iexcode/instruments/__pycache__/Kappa_Euler.cpython-37.pyc b/iexcode/instruments/__pycache__/Kappa_Euler.cpython-37.pyc index d7e5066528a6d569653c3be9a202fe97ce5d86f4..e36da7b8c710469157f0613f122dab8b950e3934 100644 GIT binary patch delta 559 zcma)&y-EW?6oq$Yvzy86&TM`$3!+4X5Wzxm)7V)E2JO^hih%K^2p9>Qhy=k#L9lWi z#Lg#>{P_@8wiXM%hON$|&~^vroO_Fpb2<0RKTB+fF>0vS7=N_<i1}y`Ro8b94KTnw zv%0phkpULiw}v2)2BJIz8KBB3IN&OGfB{$Tf(KdU404cH&ZCztjMk=~+o%$oT{sC% z6%^z1p1{3MZ1x9Xjl>89ZXXM|iC0iT9^pGwl2huxedA|T(WlL+8V<RhJuQVlDaui* zj>-y{$R{g83$kiA5>StJfP6(w<uLuAC`$GdP?sc-@AgbKGb6<?dXRv*qJexRGud)9 zlXH{gT)Tms(3xzrv0_R*NzM(guU1qqHBVUQ7v0`4bkruScCT~V53z1cw=d)u-*ZZO fEo<@RhF8x17doGcvgs{m335{;Pdvg&PJR9hdP!{F delta 609 zcma)(PfG$p7{;A(cOCb?f{IGXRuDqnS}#RVx1{J6ArVxs2f;1dO|V1IAqb*FGKZiK z5D^rnpCjlN%*C(JH>h_!NXMOFo@eHT-@ME-zq5B0Ytypy1dj0f^SIo%ilo<HT&@SK z!AJrUkZh}g*3fXTf_9T=q#*?iU57O2=mr>IqMKlWjc$PhF1igF$f7&_rxhg`z|qIo zD)B;9c1ofMdfE}R(-O((BCIk&K+xu%;7fFl<oGVVB?UfKilZO;NW3XkrJ*Zt$Vkae zCC^`!8Yzv&$_61t?rHTH$i3$CXEx+f>H!&rZO35Fna^MKA>U8GBa_m1VlZ9Z=Wpha z9~hD`%s72|rcXS4|9~G_1Ed@~PNyrowlI&OR9&H-c7x7kD1TO{%}(ni3aN~15<UO6 zw_uWKLDouA%2H;eRHS%P<X!(#p5&d!nqX_e8Fbstb%LizmKbrVNpLDG%N%C23@-Z* D!fA8x diff --git a/iexcode/instruments/__pycache__/Kappa_det.cpython-37.pyc b/iexcode/instruments/__pycache__/Kappa_det.cpython-37.pyc index 64a16ee6fa9eb6ab0e825aeb9dc61f7afccee3c6..b79f19388690f3f26c6f29f4833f23d50c264c21 100644 GIT binary patch delta 448 zcmZWlze~eF6wc-6CCzEAXsd$=A`-z2>S7mB5C?H`%MxlYVxVox<x<4O!5@1$92IxR zPHuvuI12~P{sr#d%U}y0yl;5#d*AoIyRSXf$UY&Sre5*+ar!tU%{7f09jj|cHqxjW zIn;{qp+;@$+-TIf)+3kV6D@Fuy`?Zf(m!hT`>psm;~C2@XEt|IT6UT=;mthZfhBdi zrD|IaU*3^Fx<w%(mNH~u8yKu2UiEs_hfWEkoQ=NqH-x6ev$=Ti$Cg;B#+@|h%mh|d zfi%0>APG!Xfldve4loNap*r#`q9Z994)tJ<fvOaD&c-_Mqe{DAEa~xBSxB4n^SD2d z##xq4iij`gYHtd*;ds^nSOpjxjWf7v0AX_AV#Cz2fqid|x#9t@>@K9qMLVNOnD$hh ZqN}X)u>896vN9W+2W`;#XCQv?@-IBjVQK&X delta 436 zcmZXPKTE?v7{+s#f0v|ZZJ`z&q~IVC+QC1A*%XS1IJw9zp?VPuZBj001s4ZJ=NiO8 z5I=xhH#c$g8w7OLZ{fWeY{46T!@bY*ywCewy|2=3N?lF8&&P+O^AQb}b#C;`zQru0 zag*8HVq{0-HYe8_Cs&v`+&R#EcN8x+e~>czD7W?#nTYhFvbx#jd!50c6Yxj|X(WA< zVZN4QzRpIkAIKZupcbN*vIz&gx^S~MT%Yyer$DKgjlc0bLNnQmvC#fg=R~E3y>2Rn z0jjb>ZuFC3<QoEx5EZ~2pbD5u9eXClh-LFOcflthm1Vbfa|QIwJ3bR4ie;!)FiXnQ za4=;0Ns>&5WMB5>76mty7j-}bFj+LYfv5p!Q)otX0~4K;+?pWS6It3Q@3s%aDCVi` V$Zis+MW5m#QG-Nq|BJnI8o#b)SFiv8 diff --git a/iexcode/instruments/__pycache__/Motors.cpython-37.pyc b/iexcode/instruments/__pycache__/Motors.cpython-37.pyc index c3ada008630f4d6119799aa0b66f9b538493f799..65303762f5649d738bebae3d0b95eefade32aa4c 100644 GIT binary patch delta 1414 zcmZ`(J8v9S6rMZp9q(rSh{4_<$1!p2ArKTxSjZ%{Fo`JwRs;cw4PrI++*p&$i*sj< z(y&NGP*7R7G6fY45)Et`_zzSmB3(*a3g{>~=g!JOn=sOTI`?tD^ZM>Se(iX@wcTn3 z27V8I|84K~QEQ&<9<97`A@jN(Gh!olQa@{S8_amyh~3zGV8q^+W;cl0`$p&=-CdeC zx8Dhw3dDYta_H?>V*hAr_NVVZWtV(pRg+m!70`>5{VFN)2<`(#Q>{|;d0h1LsrbQw zwtUO{fKAF{^Q#MV111nc22HZtCoqYYvXlHy@%-?*WwXr&9Zl1&B`OGQ?V#*D%DD0l zIqVgJD+~4x$4RUMUY(I&+rM7b6t*U=5_EG!%6S=Db?jL>Fw3X>9pHjjtMYT_=M7>| z_C0=IfQ9DBRk@;ys=iQ;u5v5^Si+l^hj-nNt=4mBCO3D`(}ZRDsBz<*&WX5y64M33 zX|%#%l$G2HLbf22U~zW5J6UnaH-_H@|F932(d8Bp{SGE|o~UR`@9bi*6<S<E7&Q*4 zT396r3C5_Mn7BWYe>Q)-L8Qp3r|Cvz$@3WI>OGnnPPh;W&AgW;IGGopLFZ;ABzct& z|7g9(SVyk6mj+a1P1@jjKjRQpTxY0z5PEg_m+2N|(47!bR;IkC2OiX7I|-;*GG2n8 z9o8P7p|>F67~U!7nm%jdZ+iH+?ORjSs2$~_rgKzo1|9j=^a@*)b2AGAin<$4)U7)i zlX9TwV+V*(52`!SqbCvRCjky_D=Uj5<=#osG|82DP=u}jD9k~vK&5O^6(u1r>j}I> zgck{3CRmUUXI7t@I3@bc@b8(A?7>xv<VSm=Nc$C6rwT-%RO(9R>DUo@bdT@A1}<*F z8;A$r9@F>B7F@v<FaoWX4q1x?b=|>}x|N&cf<vVx51VwyHEttPv9N`p8g;R~wQKMu zu1Dfk?Ih1JskA6cEe_SLvpm`OpVBYRpPw63q^B!eyY^5X%nxo(QREo{QX-rspl4PK z=vA`T2wo?+PVg?l6HaZ>e++mCfn4vL^U1<_zaV>^vrNfBXW7-`JR`s8oZhA(a}Zei c$mv;Z%D<8oaX;mo)LB7qhV(XRHd)j97kfuN5C8xG delta 1324 zcmZuxOKTKC5Z<2G&hBQii7|<Z#yp5w$43<3FCv5x4@wk`f`huuW;$Wa&co{2#dwLJ zh<XcsQNgPqc+tJ6;3;R1BJ|C_;K`$1Ghvn0J$zJGcYRe~Rn5LU@%^|pYgxsd{B1t` zTB~eWLu6*7a&TZVcOmELp7A*68IKev?~!XcJHPQ@LM8i_HhTNtZ{8!*c^T&P1W^(} z)$^AUKMGw~g95s(m^G*uRnuGcHV0k2rd%gw{!w`{g)acJ+5}2yceTNimeBlgIT~nr zszzo^yegwtWeM0?8X&aL4XDUBDbylHg$lK1CyBa3lVScw`%Fyk>N_UWMB9)^iT`=5 z17$R+@Yni>Gni3mt8|TlDotC>QW`9AlLixdDybtIjLMgXThEMJs?{e=|H{0KRA7St zEL<E<H6Ryg2&e{nCD_GG{x*K6Xp^1%X>qK-vlT(qq^Db7ioeK>2^q2oNIx%&8b=m% zrJe<uY!VOqC2VyGP%Z31m_q2F);;9D%}dt1i%2RtaWKMg<CumX^k+Woo3P@D`8eQe z-Irq+lfF(mBZ$Edlc1$^UnOLaUoTJGMUfe4frgEMf}7B^!n6l=K9fI<udo8A#M~gR z(<)BaDQ271PAG`qnbQoKSwyq-qdcPaVo&CU$(GzuZe#$1yxdnIBm89F?sZJCV3)Ek zwI?EUh#FFCdnQh)D#Pn8RF@Jal-Wx{4LnyE%YMD?heBD2Y-?+3l2GV!D<BaXOQIN& z##yf`@)GtU*a$mw{99k;pW$Mm&s)9QZ))qOk<D~#EUGsW>U2jE0ZYl049IIoXQ8`F z=i!7rEW$~NE3aPS@6&lWB~L&Q(#04=YXl+FUHqe47=FkoB<Xg;8Tm#OS*@)Z&SKO# z2~HssT|F`fGxEH(u1?txLs?rrisEz~oN`ud+wuPv@VTMM9UVKEPX!*CYw?Fe>sPul za}NUU9_&KE4=Y=l185yWIEFBbAiuJ|7cphWzYs7a6!_)gaT6`ugdu)^c$7H&#qge^ e==y7w+EKzh7erp8PG_)@441?tT}qE)s=om?8zwIR diff --git a/iexcode/instruments/__pycache__/beamline.cpython-37.pyc b/iexcode/instruments/__pycache__/beamline.cpython-37.pyc index bb16662015007d4b73929f7a716b9331a54537d8..084b895e5db96a6afb98a4b3acb29e2dbfa44245 100644 GIT binary patch delta 839 zcmZWn&1=*^6rY)V?<Tw5QnaOri>M_CrC0<H;z#|s2&J}%)&U7=CS6mrlXQ|TUCB~m z_2NM&@g!2}LA-eL?ztYstL)W_qJM;MwzgJ$!@S>{_vXF%&CGi~w%?eVbDRnS`St1Z zs<ghz#i0-|uEWe$cBU4b8mm7=)MjJ}xg$F-zhYXpaTD|lJdW-19bUt=vPPa=qV`%8 z#}W5(e>DzWRTxl1n4qZH?jCqWRr>5B<&^v646c9pNfz)7C9TB8|80TI10xH3?zNIr zu*f7oWQj)kNPTsdR%1WQ??iDp-)Xy;8bBiCo%TP6xZ33QC?o|kQ;MV^>D`2xeFv4J zb=*S?Gs2XX!c?X)9ng49dN?P{?BgB*v;Y;r3ZM#D1=Ij-KpoHlGzwBEg<5EZUKlOC zXXXm4^|vubThoPk3q3gBv$|u2wXTXMg|(+K{03snXk#5CIqrkC0&^K{%@?>p69{tV zdX?@>VHTAM1bH71EXXA?myhQ9pP0ewCsF^P-tJMo-4!&uvAc}e2z+AWakJ6{$sQ)1 zm^I^QGi*k@8Tjo`_}MTdFg(c*T)sCZYE-+ixNv)kYIprK^~*2D+iRxKAU>#soMpM6 zM+p}SIE4HdY6S`BVUUN6DrqMlXsL*JPW5z?!wGIxjF)@n;_R^=khM<yt>poe%nP~f zqRSA=ra>W9C*^7D!o^9jU1wl;9!mnxqZ<5m+NFf2RLvu}!jOa(rcsa$S<$j@ox4|q tG*OqTA(d<fAxj-=lOZDqd;{}JJ7JwTyehAm$-OEuu}y4j>ce51_1{3fyYT=3 delta 1167 zcmZWo&2Jk;6rVTyX~&KoH^E7(N-G4aRuuXnafpQ~;-*DC5JEVl1XU}0XX0#X?`~(; z5w_O#A?1R4srJwaacB?Rk+}3v;KCgZH#p^tdPRM+OQRrW^nUNnoA+klzK>s*zF)r5 zt=Fpr*X#Lj{l8KAOC8=W4TVpUl7nYgwl7~`4c2@Ddo^A^T-*n?#9DZ2F!~j7m!CcP z9c2Ch9K^@43XA!3*oS8R4}ABrtnCNGVGw$0uRr9jE^K^LR1o&;(WKOhy3#G4K_h=f z--XsMf6#5XF6kh0;eRG*EUm=vh29{#jE96GkcwEzztMkqPc965NqRRJ@~!d6g*^*{ z;Nf`mpO35=m*#DBIt2t@fm-Un72QTkx(F#bgc)SO;2{<7q?FNP0Mx$FUJ|CYNvdb$ z7}|vCZ8D=N&B}Yq3}wem%#bzxqUzw<7D1RMPJHB~k>f}4WPUBiIJtxB$Vm^l)8{<q zqWZ5jKMJC8GMscuPp@0vs;4CQ)8(7%0rT%{bQn)>bT<4)<3RAK(NSrc8Xw)=*t;`r z+}pgl-sz5$$qx4;!M0pO82DGx?2BGF_Yb5ItEi+FM84FLRJdB1*v)&Ni;K#V#z*J# zrc|}U$19^<M@>>gAf^d6?o}k=;Q1`63wW@QilqLD0s}^wHuzFwIy0C#(3tfjok2>N zeGHgI!Yar$<W=N4@&)7u@)~jzc^$cx(M-$q%*f2l8kjRXh5Tn@WlqI3tGv({yaXV- z<Pig+_SY!gN7^OdZe@^>HL^(_bZ6Dc^~}zyYvhoMSEYo$RQZN2tZsQ{utpo}T)cO3 z_TCA;cd|=Z6RW&5HHx|kSM`!uML1Pmd8*p!R99dkxKykmD<FSr{&dw8%0MVnS@EMV z<bKMT)Z%d}E-9rMABDXUcNfIPJhpZ|JU1!ox}_@VA9#Lmlz2Q;bM_hPldA|s%U@d` zth*@T5UG&drnEedMZV`r14kmBNE*gcPlFLJV=#Ce_(>6z%y;bf`%QEcEd?tI)XWs+ tEgGrl5urYCu1Sgr8>o}^C!>gshy0dmx?~war#94R4Q#X6HM?0|d;^zp2`&Ht diff --git a/iexcode/instruments/__pycache__/electron_analyzer.cpython-37.pyc b/iexcode/instruments/__pycache__/electron_analyzer.cpython-37.pyc index 91ff70dc60fd8a66b8eb2c045939a252083917e3..3ebdc4fd88753351e22ad01cdee9eb50dd7c3314 100644 GIT binary patch delta 5737 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 GYW**3m><jl delta 5659 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 diff --git a/iexcode/instruments/__pycache__/logfile.cpython-37.pyc b/iexcode/instruments/__pycache__/logfile.cpython-37.pyc index b49542070a25057382ecc6276ee31b7fe9f44a17..68a3b11783f01b7a8f197290c663bd7183375a04 100644 GIT binary patch delta 1162 zcmaJ=&1(}u6yMooH=E67k|s^shPI}k>0+wX9;_b-Dg{MoOB94f3~OdnWAm}hZVN35 zg7zpv*o!yq(L)as@Z?ny#Ivw}g9rZs!S{A8)(9@l@6En>AHR9;&FlH^v-CzXsS5CY zKK}Y>CD*6p<XOM8wka|BP%z>w#uSh$i!&8uf+d&+Qe#O*K_*#>r9o0Q!7?m+NQ@L4 zWjWBKS)Pr79AV>k1-;P!wCc@~BSO88<bEXq`5Y0mMtK^rhFkn1uw+;_VL6KcuJDE& z2@fJYp+|b6E4spy2&`yV=#sAZTp|J^5MT6OifiQ!UE+8bKhf-LSFN_o8<yi!_^CIV zR(02ArfYFb&Nc6+xTI6u29QEG72QIs5%_na0D?pb&kycJ9un$H*DG7=cYW!OY1^jv zA$tA-1~X#zUX?X!t}ohqVYojrQzzNmX3MJDduO~UX@X1+E=oPom;`TMvU#KJ>XDFG z5>$K|VTfG%uRxCFu7Z)10TALEDTs<F5=zF2Mr6WgJgU6CgyD4(#{F-!ZOgrl(Snx5 z`0U_^vOuoPf-0<Mq{U1l<<!h}#j15UtL{1$=V;A~08n<UgC7I4YNJ!*)83Z4ur`!3 zd2)feZMu&u;NW2I1w|wZu%^H}N-`oZ4UW|VA_v(^-m<p1UIZ&$4(~A!d#(T&+DSaD zEXQFn<kmiRdZ=_f4riA4N}D3_!F#PvHqV0MKrP;~OlI-R#o~q@<0a7XWrTAGI7fUA zz{sAuH%3SHyZ|S<@|%*kLkndj;FG!^4`vOG{K$^AKg^{JW?k<cogn4G7y5!c4f5jL zb36(d_!2kU+m;_`TJ3<1FV{P~WxBe0st8#$A4SL^V1B*=;FE?Chlvbb47F)GZtxiX z;ex|M`rfzn6vgcZ%*ql-J>!WZt!D5tc^(uT2Z_%hgk8ZM7B!@dzNfAkv^{uF%GFkf f?KZ7z1T36!fV7y#X3L7KP-RrfD{&>Ojw!ic9gp;I delta 1333 zcmZuw&2Q646!%OV$8j9TNs}}w6iUmNL8N?0!0sZX1@R#v3IYiv3lW)&Qvz`kJ-gLX zwSrYS?qMryFI><b_kvc+oii8yfw}e0pRk90Z$d?=ur$9ne)HzN-@K16i|>y**NR0; z!|&fWpP!wt?>G(iZs)}1RZV33`N;AurU^|L{X%5>Htuu6e5?6Ikrx(9M-+sOvLuSa zLFtN;a8Z^;SyWI~!~sziwYSWl5p^+(nyP4sCd!(ad#HH_cRpM=<uO_Q^}+oc58M6W zYC9Yx&<kTy-U&vdU|PAe`!{pbZT9$e5gEsvc<WF>?9i6J3@!uLbzJdHghYG61bfM$ zk??KpNoGsiVq1JrS9*^6R+9OqPju4b%5G|#Y?E(i@y!`zs&8Dh7Vujei69BnpZMuZ zGOJk2tm3)i8DL{PAZlO|<PoHUkLvdNVS92Dob*qAa@nPG1!Xd_=;afG8T^k`MRbcf z%wjf!=6IJsWfssGR1wm<`to@S<mX1~ZPDu_l8@FW4!?OV?S&o$QP>`>FQp&!CYv9B z(zm!jkGExZ1ieAxWhSIc<o+<hK6>tVj^Z%6ghnytUCY~Sj+>k#)do^E7%ZmmbN|ee zdyh^0PI*h)X03RaZmZ(uU}^ljd5rzCgesLjnTbRoOK~R{JP12O5bd=%1R!fTLO!#~ zr_7;QyEp8>;dD2D?DA9yG?K+V!rf7jJb#3$m@G7tGZR@l$Wvz(4&L~xwZRM(-Ag|f zj^9u*j0x}Kcmt>uzP;y<G6^S1Wkj#2tou?01w8Aeo;}YB<6Cx@-8+Md4Qt_c7>E#l zURYT1a^Rs3mI=-hsJ1zZJAY>C-Q=Cv!vQ?;%&(Nv|B7=riGXBXnOBWPMl$m<e6^oT z3(el(`ucXAQ!`a?&2fi8Yy8CdgRLkoG&Mlxij~YlFjx&`rXLOzLuqt}5Cw^6O(mvI z=CcG10^$T0(u?k)>i5Nf8lL=>K6mFG+O1$$oI>f<)6|V#%Vsb9tuqv1t2c-fSc`D} z<CYpMHAMao&(*}K`BKvlO$tse2a5!gdeV-{F?krpo=TA7Sk}&ABF!t&P^|UCs|-!z bg9t8nRiD_*HcZ2G&8k^9^X7~-Yu5e;-f0;d diff --git a/iexcode/instruments/__pycache__/mpa.cpython-37.pyc b/iexcode/instruments/__pycache__/mpa.cpython-37.pyc index 706901ac024918e144fc9eece5186afcac389293..d08115e60825b3719c2b6d5775a66c30eaf8a333 100644 GIT binary patch literal 12164 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 literal 11343 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 C!VNS4 diff --git a/iexcode/instruments/__pycache__/resolution.cpython-37.pyc b/iexcode/instruments/__pycache__/resolution.cpython-37.pyc index ff69f443a3bdb693d5a4a10a67e75ff819044f0a..e396add37e1deb4258a5e6078e6261a4e7fb4c97 100644 GIT binary patch delta 2165 zcmZ`(J#5=X6y_aCiJ~N1mj4qwW&)(B>R3&jraw*_z)Fn*wG$Yz;DJCxP&(RSLQ?MW zWJHEj4bIr2XgRcF){I4pZXLP=&CsDsQE)B_c*@u%L*F~umhGlI+;?~HJ-++y-MjbC z^oxrFwPMj!;CuSxZ;ii3z8RS4K7kce7zq@cz(@lcs<ui{rUqK5+q#@<K_<-F+0d|! zFlXnaOb^U3Z|CJa6BNRtT?_~8fpE|sl(KA43Ww|=m>VqjSh35@WO*2eS%DQ{9AV?E zJIG3pi9O0D*bpnjY>W-F5m1h^Q8otS1S4xoWpW=`->#5UZ@QbFfJs@n4?L$Cv|=w7 z&bAx0y^5NepmZACjhgpT4dzR!5eL3-djFKdR@8Dfxhwo=Q_8w(N|zSXBKP7}&=!6x za$t#G)|S@rPuOX2@y_bfn&Ukb+;z6L<0f*!FAF^f{U-GI3jm?)DUTFE0EwW0RH%$F z%2cK?eNz{j(DxLU*`s^(k-Dp}Z1(}>_eBOwHIWs@{oEdTqzhBznK7xrJR=IbWS8!$ zyZWxSn_)R-ew8IkR1(FWTuL;EaUQ}{*!k16;JfJt&351l&l2}!Z*fofO*gRm=d?Cj z+!9^TH`|<hk+2$`8wP&lS+OTDK=Fcfh7M%}7A(;cCw=%;uWH4gbMfYbM*Z%*HEX$% z8+3L&E*G_xyYrRn7V|dTb|5SWsf97MKC-S=d%nBieA(UFau=-r{>@e-xZjZ1VYQ;5 zBW?FFbN5FO<`EdeuK=6?q@-!n`eGgKE4%IS2BgL9$^h3;kN3oN1QjiH-fBmTXHak+ zou;Y}8yYaP%~dy!mm-gEb~r_YeA3O0E~mr&z&VF;s$}iVL8_^nT%`KFZO2<rb28y# zf5$t>JveqsSC>*!f2#25WK&z6GyCp}uuF`mQZgBWZHgLzCMl2!%4b0S!`CsPypU-0 zGs=rele&}-B+qdeOe!i2rQ}QXyBZ${V?Kc}31Ams6KA6xH8HJI;-;j*hd_}MmJ(08 z=F?~`;T+78pR^frKKVntNM@5)+6!VO&vlgit<Q8X9GX@#{he&Od>Q%`=<~K7wfxvS z<ue`apVg7?Pg=bX-VTm!5KXqjaf0wmpshFY^6<m^)04-UpUH)!mc3L(EuRHQX|$DU zn1B2YSXQ!qVlo804ASIDcJeC5@f0yW2C`3~$0YzIgApGCB4ye5Sn?{HzJ(6<F`E7* z$TE&G*eTXlAkpzCmbGB*Xcw!OH~8GQx$|B0$gv{uD#F_cl34yUv9qW;gD{1F+t{=b zr0Q~`o~n>Bue%;Tie}JzfzwLB*rey^A!n^j`RKD}IhEuugVh1$<QH>}%q1_)^)p9- z`wz*)$xp4HBn5?WBPF-^6>yc(+6u>4CuyZQZ)3xQw1S6rGJ(>eJN-ghTXDcHNPf>x zlZ9t50bfgNE&0AU-Ti-Ruq!;|tGM|)2-gr!QswW0%r-vux#&2HZT=pbAa9Oo)+f$C zz~w2*Wu)9aDE>Xp^Bu731zA2s2s5cdo05%R2W^Ewsi{{cA?e%UR!3gAt$SO3GnR$J zp7y<m%@*^jeiRGd4xz%vRVZmt|9mf&mB^kvvbk~0=plDIaj$a8qJ@RZK6_+(%yNBY z%~}2A7SAT_f!Qt=u-?UDQ9I`R*dMZx^E_J0CxNd>zBc(9WP<Spl;IhVMe3+Tq{fF~ ki?svq23Fk|Q`n#dS|B6Ckc}gxpcx~^xKTDsX4xqI3kjO`&;S4c delta 1168 zcmZuwO-vI(6yDkG&vx4`ZH4foEg}{zKMM6`2ndlAXb4nHHi4BgOWkDK#o4V19+U$n zB%aK~c=2Mq=*@(SN4?2Gy_yLJuT3;Dn&`>I_ZG1T?$7sT-g`UmoA1r;<bP)M$z)QK z;QF}nt~`={sCU>iFryMBj${z9vLja&Lm?7XXlPS1LNrVxV8b*;RT|qQMueuRM&mGw z(gaOHOr<()0UM)aUMgf7Sm0`bh$OQ-*QxuqTQjF7wsRqm$PJD2@S@yk<=?`~a-+zv zMZi%03e8)7Jo>m@C>7?5@Xgz%wIE`iWBaCO-?8|cXlth+D}qo#ETJ_Qe<86B{#2Rm z&NhAK%CfUkcb0w2EL+P}$F5mX-m2zF7r&_P+*5#J<=2n;rzdIUb!B(D>sh_@XuOjD z{`||?2cO1R2;-M+_v`%~>2>99?%C*fwl!WUeO??bZoMC4C?e|sC`4Ebj#B_ao*ssG z1m2<%uDP~n1vz`ri5YEs49^9cRNb0u25C8nd946aL?xl%-nSiu<@n3k2cq!}ZSWpu zvMvB2*VaVHyTyE_!?X}>@?dF<M{irK?0S}=HR~9ff75cAZ-Y9l9hbsA9N>5CfP(wF z4MU2D`;#IXZ;$Jwm-od*>J&H{xG8&(z#1A)B|1qr?@#nB^@5kl2qzJG5CW3%!zAU| zDWL`}o}Zc*q{MJlLoPc)nJ$-v0^TD$`GnF&F7cO%Ea~5VpHN8rG<>wrVmCPiEN-Oc zv(TEqY8_$2@8~BM@<^-?;S7L~r&a~I!p;Wc$r)C_2&yDv*6OOY;@cqUA;Hpf%`-kZ zV?y2>|Ey<8aa(K2{-4=evx!G&L9v3)2C(oT!Vtp0G}$@u8R})5`RnFHot?)N<jk;9 zP10-xr-$ffkZ#MLe{zp+(d0|%Y}*CME|3yFnh4kG)wOkYk|#0)*Mmmlk=v6qXl_4F niwOALfhs}0;HaykRhQNsYYa|@<YD_&IT2FZ)r^+XGHUWS4(=Ai diff --git a/iexcode/instruments/__pycache__/staff.cpython-37.pyc b/iexcode/instruments/__pycache__/staff.cpython-37.pyc index c323fc27e5c18ca6a135a8417e28121eee33a507..df7f088dba4cb799008ae549f7e7b4d2d635dcd8 100644 GIT binary patch delta 145 zcmZ21uvmcCiI<m)0SNA|J)6Y7k++?hGm5#SqGTmQ5zpkg%+ZW2lYcTRGV*PfW+`G~ z5e6!p+`}d}c|F@gZXO_~2u$!!j%Jr*RG(bMZp)}Jc?Y|x86QYa0j>Z^DNyVdhfQvN VN@-529V3ue%mySx7)6*klmVNI9d!Tz delta 143 zcmZ21uvmcCiI<m)0SMF=o=x)I$lK1$d5gKEqGTmQ5%1)=%+ZV-lYcTRGV*VhW+`Ht zJc&(~sYq(_8nz|eyg)rgV1jRQG`k$5_T(ydTSmpnJJ?Ol_(5`ta0N(8fnv8fY;yBc VN^?@}7=gTEHXtFwD8j~}3;?gJ9t!{f diff --git a/iexcode/instruments/__pycache__/xrays.cpython-37.pyc b/iexcode/instruments/__pycache__/xrays.cpython-37.pyc index 6d7ea418488f9414d9abefdb6532e7066cd55956..914a5f624aecb4e6115c86b8777ed70d57dd766e 100644 GIT binary patch delta 5471 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 delta 6206 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 SE^obepTC)}P90PHvHu5;;q^uU diff --git a/iexcode/instruments/beamline.py b/iexcode/instruments/beamline.py index 6817162..2071446 100644 --- a/iexcode/instruments/beamline.py +++ b/iexcode/instruments/beamline.py @@ -53,25 +53,13 @@ def last_mda(): ############################################################################################################## - -def print_beeper(scanDIM=1): - """ - Prints pv to copy/paste into the beeper - - Previously: Print_Beeper - """ - branch=BL.branch - if branch == "c": - print("29idcEA:det1:Acquire") - pv=BL.ioc()+":scan"+str(scanDIM)+".FAZE" - print(pv) - print("ID29:BusyRecord") - - -def branch_cams_enable(branch=BL.branch): +def endstation_cams_enable(): """ + should live in cameras """ - cam_dict={'c':[0,1,2],'c':[3,4,6]} # index of cam_list + endstation=BL.endstation + + cam_dict={'ARPES':[0,1,2],'Kappa':[3,4,6]} # index of cam_list pvcam1=PV("29id_ps1:cam1:Acquire") pvcam2=PV("29id_ps2:cam1:Acquire") pvcam3=PV("29id_ps3:cam1:Acquire") @@ -85,7 +73,7 @@ def branch_cams_enable(branch=BL.branch): if pvcam.connected: pvcam.put(0) except: pass - for i in cam_dict[branch]: # turn ON relevant cam + for i in cam_dict[endstation]: # turn ON relevant cam try: if cam_list[i].connected: cam_list[i].put(1) else: print(cam_list[i].pvname+' not connected') diff --git a/iexcode/instruments/electron_analyzer.py b/iexcode/instruments/electron_analyzer.py index 8cfbb77..119d758 100644 --- a/iexcode/instruments/electron_analyzer.py +++ b/iexcode/instruments/electron_analyzer.py @@ -22,14 +22,12 @@ from iexcode.instruments.shutters import branch_shutter_close from iexcode.instruments.VLS_PGM import mono_energy_get from iexcode.instruments.files_and_folders import get_next_fileNumber from iexcode.instruments.logfile import * -from iexcode.instruments.ARPES import ARPES_motor_dictionary, ARPES_motor_scan, ARPES_mvsample,ARPES_scan_2D +from iexcode.instruments.ARPES import ARPES_Motors from iexcode.instruments.Scienta import * -def __main__(): - global EA - EA = Scienta() - -mda = BL.mda +global EA +EA = Scienta() + ########################################################################### def EA_ioc_init(**kwargs): @@ -260,8 +258,8 @@ def _scanEAPrefix(ptype,**kwargs): print(ptype) if ptype == "mda": - fpath = mda.filepath[0:-3]+EA.dtype - nextMDA = mda.fileNum + fpath = BL.mda.filepath[0:-3]+EA.dtype + nextMDA = BL.mda.fileNum prefix = "MDAscan"+str.zfill(str(nextMDA),kwargs["nzeros"]) else: prefix = ptype @@ -304,7 +302,7 @@ def scanEA_reset(**kwargs): kwargs.setdefault("scan_dim",1) _scanEATrigger([],"after",**kwargs) - mda.positioners_clear(kwargs["scan_dim"]) + BL.mda.positioners_clear(kwargs["scan_dim"]) def scanEA(EAlist,**kwargs): """ @@ -348,7 +346,7 @@ def scanEA(EAlist,**kwargs): pvCalcOut1=_BE2KE_setupCalc(EAlist[1],"BE_center",10,"29idcScienta:HV:fixedEnergy.VAL") EAlist[1]=caget(pvCalcOut1+'.VAL') arrayP1=list(np.full(sweeps, EAlist[1])) - mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) + BL.mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) EAlist[1]=arrayP1[0] if kwargs['debug']: print('\npvCalcOut1: ',pvCalcOut1) @@ -357,7 +355,7 @@ def scanEA(EAlist,**kwargs): pvCalcOut1=_BE2KE_setupCalc(EAlist[1],"BE_center",10,"29idcScienta:HV:babySweepCenter.VAL") EAlist[1]=caget(pvCalcOut1+'.VAL') arrayP1=list(np.full(sweeps, EAlist[1])) - mda.fillin_table(pvCalcOut1+'PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) + BL.mda.fillin_table(pvCalcOut1+'PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) print('\npvCalcOut1: ',pvCalcOut1) print('Pos1 table:',arrayP1) elif len(EAlist)==7: #Sweep @@ -367,8 +365,8 @@ def scanEA(EAlist,**kwargs): EAlist[2]=caget(pvCalcOut2+'.VAL') arrayP1=list(np.full(sweeps, EAlist[1])) arrayP2=list(np.full(sweeps, EAlist[2])) - mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) - mda.fillin_table(pvCalcOut2+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP2,2) + BL.mda.fillin_table(pvCalcOut1+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP1,1) + BL.mda.fillin_table(pvCalcOut2+'.PROC',"",kwargs["scanIOC"],kwargs["scan_dim"],arrayP2,2) if kwargs['debug']: print("\npvCalcOut1",pvCalcOut1) print("\npvCalcOut2",pvCalcOut2) @@ -388,10 +386,10 @@ def scanEA(EAlist,**kwargs): if kwargs['debug']: print("Clearing scan positioners and filling in sweeps") #Fill in Sweeps scan - mda.positioners_clear(**kwargs) + BL.mda.positioners_clear(**kwargs) VAL="" RBV="" - mda.fillin(VAL,RBV,1,sweeps,1,**kwargs) + BL.mda.fillin(VAL,RBV,1,sweeps,1,**kwargs) if kwargs['debug']: scanPV="29id"+kwargs["scanIOC"]+":scan"+str(kwargs["scan_dim"]) print("scanPV: "+scanPV) @@ -414,11 +412,11 @@ def scanEA(EAlist,**kwargs): time.sleep(10) EA.put(EAlist[1]-.05,EAlist[-3],LensMode="Angular") time.sleep(2) - mda.go(**kwargs) + BL.mda.go(**kwargs) #After scan EA_log_update() scanEA_reset(**kwargs) - mda.table_reset_after(**kwargs) + BL.mda.table_reset_after(**kwargs) else: return EAparms @@ -445,10 +443,10 @@ def scanFM(RoughPositions,thList,EAlist,**kwargs): if kwargs['debug']: print(x,y,z,th,chi,phi) - mda.fillin_table(ARPES_motor_dictionary("th")[1],ARPES_motor_dictionary("th")[0],th,positioner_num=1) - mda.fillin_table(ARPES_motor_dictionary("x")[1],ARPES_motor_dictionary("x")[0],x,positioner_num=2) - mda.fillin_table(ARPES_motor_dictionary("y")[1],ARPES_motor_dictionary("y")[0],y,positioner_num=3) - mda.fillin_table(ARPES_motor_dictionary("z")[1],ARPES_motor_dictionary("z")[0],z,positioner_num=4) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("th")[1],ARPES_Motors._motor_dictionary("th")[0],th,positioner_num=1) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("x")[1],ARPES_Motors._motor_dictionary("x")[0],x,positioner_num=2) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("y")[1],ARPES_Motors._motor_dictionary("y")[0],y,positioner_num=3) + BL.mda.fillin_table(ARPES_Motors._motor_dictionary("z")[1],ARPES_Motors._motor_dictionary("z")[0],z,positioner_num=4) #setting up EA EAkwargs={ @@ -461,7 +459,7 @@ def scanFM(RoughPositions,thList,EAlist,**kwargs): if kwargs["execute"]==True: print(EAparms) EA.put(EAparms['KineticEnergy'],EAparms['PassEnergy'],LensMode="Angular",Frames=EAparms['Frames'],**kwargs) - mda.go(**kwargs) + BL.mda.go(**kwargs) EA_log_update() scanEA_reset(**kwargs) @@ -520,7 +518,7 @@ def mvth_interp(RoughPositions, thVal,**kwargs): x,y,z,th,chi,phi=interpRoughPositions(RoughPositions,thVal,thVal-.1,1,**kwargs) Pos=[x[0],y[0],z[0],th[0],chi[0],phi[0]] #print("Pos = ",Pos) - ARPES_mvsample(Pos) + ARPES_Motors.mvsample(Pos) def scanEA_hv(hv_start_stop_step_lists,EAlist=[],**kwargs): """ @@ -574,10 +572,10 @@ def scanEA_hv(hv_start_stop_step_lists,EAlist=[],**kwargs): energy(mono_array[0]) #Scanning EA.put(mono_array[0]-EAlist[1],EAparms['PassEnergy'],LensMode="Angular",Frames=EAparms['Frames'],**kwargs) - mda.go(**kwargs) + BL.mda.go(**kwargs) #After scan scanEA_reset(**kwargs) - mda.table_reset_after(**kwargs) + BL.mda.table_reset_after(**kwargs) def scanEA_y(EAlist, start,stop,step,mode='absolute',**kwargs): scanEA_motor(EAlist,'y',start,stop,step,mode=mode,**kwargs) @@ -617,7 +615,7 @@ def scanEA_motor(EAlist, motor,start,stop,step,mode='absolute',**kwargs): scan_dim=2 #hard coded kwargs.update({'scan_dim':scan_dim}) - ARPES_motor_scan(motor,start,stop,step,**kwargs) + ARPES_Motors.scan(motor,start,stop,step,**kwargs) if kwargs['debug']: print("ScanGo scan_dim = ",scan_dim) @@ -664,7 +662,7 @@ def scanEA_Mesh(EAlist,y_start_stop_step,z_start_stop_step,**kwargs): outer_scan_dim=3 #hard coded inner_loop_list = y_start_stop_step.insert(0,"y") outer_loop_list = z_start_stop_step.insert(0,"z") - ARPES_scan_2D(inner_loop_list,outer_loop_list,outer_scan_dim,**kwargs) + ARPES_Motors.scan_2D(inner_loop_list,outer_loop_list,outer_scan_dim,**kwargs) if kwargs['debug']: print("ScanGo scan_dim = ",outer_scan_dim) @@ -672,7 +670,7 @@ def scanEA_Mesh(EAlist,y_start_stop_step,z_start_stop_step,**kwargs): if kwargs['execute']: #Scanning EA.put(EAlist[1],EAparms['PassEnergy'],LensMode="Angular",Frames=EAparms['Frames'],**kwargs) - mda.go(scan_dim=outer_scan_dim) + BL.mda.go(scan_dim=outer_scan_dim) EA_log_update() #After scan diff --git a/iexcode/instruments/logfile.py b/iexcode/instruments/logfile.py index dec2ce2..cde224d 100644 --- a/iexcode/instruments/logfile.py +++ b/iexcode/instruments/logfile.py @@ -3,8 +3,6 @@ from os.path import join,isfile from epics import caget, caput from iexcode.instruments.IEX_endstations import * from iexcode.instruments.utilities import today -from iexcode.instruments.ARPES import ARPES_log_entries -from iexcode.instruments.Kappa import Kappa_log_entries ############################################################################################################## @@ -20,10 +18,8 @@ def log_update(): """ updates the log file with the last scan info """ - if BL.endstation_name == 'ARPES': - entry_list,pv_list, format_list = ARPES_log_entries() - elif BL.endstation_name == 'Kappa': - entry_list,pv_list, format_list = Kappa_log_entries() + + entry_list,pv_list, format_list = BL.log_entries() logfile_update(BL.endstation_name,BL.ioc,entry_list,pv_list,format_list) diff --git a/iexcode/instruments/mpa.py b/iexcode/instruments/mpa.py index 6408b46..a9477f0 100644 --- a/iexcode/instruments/mpa.py +++ b/iexcode/instruments/mpa.py @@ -4,10 +4,10 @@ import socket from epics import caget, caput from iexcode.instruments.userCalcs import userCalcOut_clear,userStringSeq_clear -from iexcode.instruments.Kappa import Kappa_motor_dictionary,Kappa_cts, mda +from iexcode.instruments.scalers import Kappa_scaler from iexcode.instruments.AD_utilities import AD_ROI_setup -from iexcode.instruments.scalers import scaler_cts -from iexcode.instruments.scanRecord import * +from iexcode.instruments.scanRecord import ScanRecord +from iexcode.instruments.IEX_endstations import BL """ @@ -19,399 +19,409 @@ To do, get busy record in the mpa ioc, get user calcs in the mpa ioc ############################## PVs ############################## ############################################################################################################## mpa_pv = "29iddMPA:" -mpaDet_pv = mpa_pv + "det1:" mpa_busy = "29idcScienta:mybusy2" -userCalc_pv = "29idTest" +userCalc_ioc = "29idTest:" DAC_pv = '29iddau1:dau1:011:DAC' -max_HV = 2990 -ratio = 500 -tth_dLLM=13.73 -tth_dHLM=23.73 - - -def mpa_reset_pv(): - """ - returns the pv used for resetting the mpa - "writing a 1 resets" - """ - return mpa_pv+'C1O' - -def mpa_on_off_pv(): - """ - returns the pv used for turning on/off the mpa - on => caput 1 - off => caput0 - """ - return mpa_pv+'C0O' - -def mpa_HV_pvs(): - """ - returns the pvs for the userCalcout which hold the pvs for the mpa high voltage - """ - val_pv = "29idKappa:userCalcOut9.A" - rbv_pv ="29idKappa:userCalcOut10.OVAL" - return val_pv, rbv_pv - -############################################################################################################## -############################## HV Control ############################## -############################################################################################################## - -def mpa_HV_set(volt,verbose=True): - """ - sets the high voltage for the mpa - - Previously: MPA_HV_Set - """ - val_pv, rbv_pv = mpa_HV_pvs() - volt=min(volt,2990) - - caput(val_pv,volt,wait=True,timeout=18000) - sleep(1) - HV_rbv=caget(rbv_pv) - - if verbose: - print("HV = "+str(HV_rbv)+" V") - - -def mpa_HV_get(): +HV_val_pv = "29idKappa:userCalcOut9.A" +HV_rbv_pv = "29idKappa:userCalcOut10.OVAL" +class MPA: """ - sets the high voltage for the mpa + class for the MPA detector """ - val_pv, rbv_pv = mpa_HV_pvs() - return caget(rbv_pv) + def __init__(self,tth_pv, max_HV = 2990,ratio = 500,tth_dLLM=13.73,tth_dHLM=23.73): + self.pv = mpa_pv + self._reset_pv = mpa_pv+'C1O' + self._det_pv = mpa_pv + "det1:" + self._busy = mpa_busy + self._DAC_pv = DAC_pv + self.max_HV = max_HV + self.ratio = ratio + self.tth_dLLM = tth_dLLM + self.tth_dHLM = tth_dHLM -def mpa_HV_on(): - """ - turns the mpa high voltage on - - Previously: MPA_HV_ON - """ - n_on=1 - tth_pv = Kappa_motor_dictionary('tth')[3] - tth_dial = caget(tth_pv+'.DRBV') - if 13.73<= tth_dial <=23.73: - print('MPA OFF: detector in direct beam (-5 < tth for mcp < 5); move away before turning HV ON.') - else: - caput(mpa_reset_pv,1,wait=True,timeout=18000) - caput(mpa_reset_pv,0,wait=True,timeout=18000) - caput(mpa_on_off_pv,n_on,wait=True,timeout=18000) - print("MPA - HV On") - -def mpa_HV_off(): - """ - turns the mpa high voltage off - - Previously: MPA_HV_OFF - """ - n_off=0 - caput(mpa_on_off_pv,wait=True,timeout=18000) - print("MPA - HV Off") + self._tth_pv = tth_pv + self._reset_pv = mpa_pv+'C1O' #"writing a 1 resets" + self._off_on_pv = mpa_pv+'C0O' #off/on = 0/1 + pass -def mpa_HV_reset(): - """ - resets the mpa high voltage - - Previously: MPA_HV_Reset - """ - caput(mpa_reset_pv,1) - print("MPA - Reset") - -def mpa_HV_scan(start=2400,stop=2990,step=10,**kwargs): - """ - Previously: MPA_HV_scan - """ - kwargs.setdefault('positioner_settling_time',1) - Kappa_cts(1) - val_pv, rbv_pv = mpa_HV_pvs() - mda.fillin(val_pv, rbv_pv,start,stop,step,**kwargs) - mda.go(**kwargs) - -############################################################################################################## -############################## MCP Scripts ############################## -############################################################################################################## -def mpa_ROI_setup(ROI_num=1,xcenter=535,ycenter=539,xsize=50,ysize=50,binX=1,binY=1): - """ - usage: - center of MCP, roiNum = 1 => MPA_ROI_SetUp(1,535,539,50,50) - to set up all use: mpa_ROI_setup_all(xcenter,ycenter) - """ - AD_ROI_setup('29iddMPA',ROI_num,xcenter,ycenter,xsize,ysize,binX,binY) - ROI_pv = mpa_pv+"ROI"+str(ROI_num)+':' - mpa_ROI_stats(ROI_num) + def HV_pvs(self): + """ + returns the pvs for the userCalcout which hold the pvs for the mpa high voltage + """ + val_pv = HV_val_pv + rbv_pv =HV_rbv_pv + return val_pv, rbv_pv + + ############################################################################################################## + ############################## HV Control ############################## + ############################################################################################################## + + def HV_set(self,volt,verbose=True): + """ + sets the high voltage for the mpa + + Previously: MPA_HV_Set + """ + val_pv, rbv_pv = self.HV_pvs() + volt=min(volt,2990) + + caput(val_pv,volt,wait=True,timeout=18000) + sleep(1) + HV_rbv=caget(rbv_pv) + + if verbose: + print("HV = "+str(HV_rbv)+" V") + + + def HV_get(self): + """ + sets the high voltage for the mpa + """ + val_pv, rbv_pv = self.HV_pvs() + + return caget(rbv_pv) + + + def HV_on(self): + """ + turns the mpa high voltage on + + Previously: MPA_HV_ON + """ + try: + n_on=1 + tth_dial = caget(self._tth_pv+'.DRBV') + + if self.tth_dLLM <= tth_dial <= self.tth_dHLM: + print('MPA OFF: detector in direct beam (-5 < tth for mcp < 5); move away before turning HV ON.') + else: + caput(self._reset_pv,1,wait=True,timeout=18000) + caput(self._reset_pv,0,wait=True,timeout=18000) + caput(self._off_on_pv,n_on,wait=True,timeout=18000) + print("MPA - HV On") + except: + print('mpa not running') + + def HV_off(self): + """ + turns the mpa high voltage off + + Previously: MPA_HV_OFF + """ + try: + n_off=0 + caput(self._off_on_pv,n_off,wait=True,timeout=18000) + print("MPA - HV Off") + except: + print('MPA not running') + + + def HV_reset(self): + """ + resets the mpa high voltage + + Previously: MPA_HV_Reset + """ + caput(self._reset_pv,1) + print("MPA - Reset") -def mpa_ROI_setup_all(xcenter=535,ycenter=539): - """ - setup up ROI - 1 => size = 50 x 50 - 2 => size = 100 x 100 - 3 => size = 150 x 150 - 4 => size = 200 x 200 - - """ - mpa_ROI_setup(1,xcenter,ycenter,xsize=50,ysize=50) - mpa_ROI_setup(2,xcenter,ycenter,xsize=100,ysize=100) - mpa_ROI_setup(3,xcenter,ycenter,xsize=150,ysize=150) - mpa_ROI_setup(4,xcenter,ycenter,xsize=200,ysize=200) + def HV_scan(self,start=2400,stop=2990,step=10,**kwargs): + """ + + Previously: MPA_HV_scan + """ + kwargs.setdefault('positioner_settling_time',1) + Kappa_scaler(1) + val_pv, rbv_pv = self._HV_pvs() + BL.mda.fillin(val_pv, rbv_pv,start,stop,step,**kwargs) + BL.mda.go(**kwargs) + + ############################################################################################################## + ############################## MCP Scripts ############################## + ############################################################################################################## + def ROI_setup(self,ROI_num=1,xcenter=535,ycenter=539,xsize=50,ysize=50,binX=1,binY=1): + """ + usage: + center of MCP, roiNum = 1 => MPA_ROI_SetUp(1,535,539,50,50) + to set up all use: mpa_ROI_setup_all(xcenter,ycenter) + """ + AD_ROI_setup('29iddMPA',ROI_num,xcenter,ycenter,xsize,ysize,binX,binY) + self._ROI_stats(ROI_num) -def mpa_ROI_stats(ROI_num): - """ - sequence to enable stats for mpa ROI - """ - ROI_pv=mpa_pv+"ROI"+str(ROI_num)+':' - stats_pv=mpa_pv+"Stats"+str(ROI_num)+':' - caput(stats_pv+'NDArrayPort','ROI'+str(ROI_num)) - caput(stats_pv+'EnableCallbacks','Enable') - caput(stats_pv+'ArrayCallbacks','Enable') - caput(stats_pv+'ComputeStatistics','Yes') - caput(stats_pv+'ComputeCentroid','Yes') - caput(stats_pv+'ComputeProfiles','Yes') - -def _mpa_trigger_calcOut(**kwargs): - """ - writes strSeq and calcOut for MPA this should go into the IOC - - **kwargs: - ADplugin = 'TIFF1:' (default) - """ - - kwargs.setdefault("ADplugin","TIFF1:") - kwargs.setdefault("save_image",False) - - ADplugin = mpa_pv + kwargs["ADplugin"] - Proc1 = mpa_pv + "Proc1:" - - #All this should moved into the MPA IOC - Calcs_mda = ScanRecord("29idTest:") - - desc = "MPA busy" - n=9 - busy_CalcOut = userCalcOut_clear(Calcs_mda,n) - caput(busy_CalcOut+".DESC",desc) - caput(busy_CalcOut+".INPA",mpa_busy+" CP") - caput(busy_CalcOut+".OOPT",'Transition to non-zero') - caput(busy_CalcOut+".OUT",start_strSeq+".PROC PP") - - desc = "MPA start" - n=1 - start_strSeq = userStringSeq_clear(Calcs_mda,n) - caput(start_strSeq+".DESC",desc) - caput(start_strSeq+".LNK1", Proc1+"ResetFilter PP") - caput(start_strSeq+".STR1","Yes") - - desc = "MPA wait" - n=10 - wait_CalcOut = userCalcOut_clear(Calcs_mda,n) - caput(wait_CalcOut+".DESC",desc) - caput(wait_CalcOut+".INPA",Proc1+"NumFilter_RBV") - caput(wait_CalcOut+".INPB",Proc1+"NumFiltered_RBV") - caput(wait_CalcOut+".OOPT",'Transition to non-zero') - caput(wait_CalcOut+".OUT",done_strSeq+".PROC PP") - - desc = "MPA writeDone" - n=1 - done_strSeq = userStringSeq_clear(Calcs_mda,n) - caput(done_strSeq+".DESC","MPA writeDone") - caput(done_strSeq+".LNK1", ADplugin+"WriteFile PP") - caput(done_strSeq+".STR1","Write") - caput(done_strSeq+".LNK1", mpa_busy+" PP") - caput(done_strSeq+".STR1","Done") - + def ROI_setup_all(self,xcenter=535,ycenter=539): + """ + setup up ROI + 1 => size = 50 x 50 + 2 => size = 100 x 100 + 3 => size = 150 x 150 + 4 => size = 200 x 200 + + """ + self._ROI_setup(1,xcenter,ycenter,xsize=50,ysize=50) + self._ROI_setup(2,xcenter,ycenter,xsize=100,ysize=100) + self._ROI_setup(3,xcenter,ycenter,xsize=150,ysize=150) + self._ROI_setup(4,xcenter,ycenter,xsize=200,ysize=200) - -def _mpa_trigger_callback(trigger,saveImg=False,**kwargs): - """ - used for triggering the MPA in the scanRecord, reset Proc1 and waits for finish - trigger: adds/removes trigger to mda (True/False) + def ROI_stats(self,ROI_num): + """ + sequence to enable stats for mpa ROI + """ + ROI_pv=self.pv+"ROI"+str(ROI_num)+':' + stats_pv=self.pv+"Stats"+str(ROI_num)+':' + caput(stats_pv+'NDArrayPort','ROI'+str(ROI_num)) + caput(stats_pv+'EnableCallbacks','Enable') + caput(stats_pv+'ArrayCallbacks','Enable') + caput(stats_pv+'ComputeStatistics','Yes') + caput(stats_pv+'ComputeCentroid','Yes') + caput(stats_pv+'ComputeProfiles','Yes') + + def _trigger_calcOut(self,**kwargs): + """ + writes strSeq and calcOut for MPA this should go into the IOC + + **kwargs: + ADplugin = 'TIFF1:' (default) + """ + + kwargs.setdefault("ADplugin","TIFF1:") + kwargs.setdefault("save_image",False) + + ADplugin = self.pv + kwargs["ADplugin"] + Proc1 = self.pv + "Proc1:" + + #All this should moved into the MPA IOC + Calcs_mda = ScanRecord(userCalc_ioc) - **kwargs: - save_image = False used for appropriate trigger of ROIs - = True also saves an image based on ADplugin type - ADplugin = 'TIFF1:' (default + desc = "MPA busy" + n=9 + busy_CalcOut = userCalcOut_clear(Calcs_mda,n) + caput(busy_CalcOut+".DESC",desc) + caput(busy_CalcOut+".INPA",mpa_busy+" CP") + caput(busy_CalcOut+".OOPT",'Transition to non-zero') + caput(busy_CalcOut+".OUT",start_strSeq+".PROC PP") + + desc = "MPA start" + n=1 + start_strSeq = userStringSeq_clear(Calcs_mda,n) + caput(start_strSeq+".DESC",desc) + caput(start_strSeq+".LNK1", Proc1+"ResetFilter PP") + caput(start_strSeq+".STR1","Yes") + + desc = "MPA wait" + n=10 + wait_CalcOut = userCalcOut_clear(Calcs_mda,n) + caput(wait_CalcOut+".DESC",desc) + caput(wait_CalcOut+".INPA",Proc1+"NumFilter_RBV") + caput(wait_CalcOut+".INPB",Proc1+"NumFiltered_RBV") + caput(wait_CalcOut+".OOPT",'Transition to non-zero') + caput(wait_CalcOut+".OUT",done_strSeq+".PROC PP") + + desc = "MPA writeDone" + n=1 + done_strSeq = userStringSeq_clear(Calcs_mda,n) + caput(done_strSeq+".DESC","MPA writeDone") + caput(done_strSeq+".LNK1", ADplugin+"WriteFile PP") + caput(done_strSeq+".STR1","Write") + caput(done_strSeq+".LNK1", mpa_busy+" PP") + caput(done_strSeq+".STR1","Done") + - by default ADplugin = 29iddMPA:TIFF1: - can use 29iddMPA:HDF1: - """ - - kwargs.setdefault("ADplugin","TIFF1:") - kwargs.setdefault("save_image",False) - - ADplugin = mpa_pv + kwargs['ADplugin'] - _mpa_trigger_calcOut(**kwargs) - - if trigger==True: - caput(ADplugin+"AutoResetFilter","Yes") - if saveImg: - caput(ADplugin+"AutoSave", "No") - caput(ADplugin+"EnableCallbacks", "Enable") + def self_trigger_callback(self,trigger,saveImg=False,**kwargs): + """ + used for triggering the MPA in the scanRecord, reset Proc1 and waits for finish - if trigger==False: - caput(ADplugin+"AutoResetFilter","No") - if saveImg: - caput(ADplugin+"EnableCallbacks", "Disable") - caput(ADplugin+"AutoSave", "Yes") - - return mpa_busy - -def _mpa_prefix(**kwargs): - """ - """ - kwargs.setdefault("debug",False) - - fpath=join(dirname(dirname(mda.filepath)),"mpa",'') - nextMDA = mda.fileNum - prefix="mda"+str.zfill(str(nextMDA),4)+"_mpa" - return prefix - -def mpa_trigger(trigger, **kwargs): - """ - Sets up / Cleans up the ScanRecord to trigger the MPA - - trigger: adds/removes trigger to mda (True/False) - + trigger: adds/removes trigger to mda (True/False) + + **kwargs: + save_image = False used for appropriate trigger of ROIs + = True also saves an image based on ADplugin type + ADplugin = 'TIFF1:' (default - **kwargs: - save_image = False used for appropriate trigger of ROIs - = True also saves an image based on ADplugin type - detTrigNum = 2 (default) - scan_dim = 1 (default) - ADplugin = "TIFF1" / "HDF1" - - Previously: MPA_Trigger - """ - kwargs.setdefault("detTrigNum",2) - kwargs.setdefault("save_image",False) - kwargs.setdefault('scan_dim',1) - kwargs.setdefault("ADplugin","TIFF1:") - - mpa_busy = _mpa_trigger_callback(trigger, **kwargs) - - #adding the MPA to the scanRecord trigger - if trigger == True: - _mpa_prefix(**kwargs) - mda.triggers_set(kwargs['scan_dim'],{2:mpa_busy}) - - if trigger == False: - mda.triggers_set(kwargs['scan_dim'],{2:''}) + by default ADplugin = 29iddMPA:TIFF1: + can use 29iddMPA:HDF1: + """ + + kwargs.setdefault("ADplugin","TIFF1:") + kwargs.setdefault("save_image",False) + + ADplugin = self.pv + kwargs['ADplugin'] + + self._trigger_calcOut(**kwargs) + + if trigger==True: + caput(ADplugin+"AutoResetFilter","Yes") + if saveImg: + caput(ADplugin+"AutoSave", "No") + caput(ADplugin+"EnableCallbacks", "Enable") + + if trigger==False: + caput(ADplugin+"AutoResetFilter","No") + if saveImg: + caput(ADplugin+"EnableCallbacks", "Disable") + caput(ADplugin+"AutoSave", "Yes") + + return mpa_busy + + def _mpa_prefix(self,**kwargs): + """ + """ + kwargs.setdefault("debug",False) + + fpath=join(dirname(dirname(BL.mda.filepath)),"mpa",'') + nextMDA = BL.mda.fileNum + prefix="mda"+str.zfill(str(nextMDA),4)+"_mpa" + return prefix + + def _trigger(self,trigger, **kwargs): + """ + Sets up / Cleans up the ScanRecord to trigger the MPA + + trigger: adds/removes trigger to mda (True/False) + + + **kwargs: + save_image = False used for appropriate trigger of ROIs + = True also saves an image based on ADplugin type + detTrigNum = 2 (default) + scan_dim = 1 (default) + ADplugin = "TIFF1" / "HDF1" + + Previously: MPA_Trigger + """ + kwargs.setdefault("detTrigNum",2) + kwargs.setdefault("save_image",False) + kwargs.setdefault('scan_dim',1) + kwargs.setdefault("ADplugin","TIFF1:") + + mpa_busy = self._mpa_trigger_callback(trigger, **kwargs) + + #adding the MPA to the scanRecord trigger + if trigger == True: + self._mpa_prefix(**kwargs) + BL.mda.triggers_set(kwargs['scan_dim'],{2:mpa_busy}) + + if trigger == False: + BL.mda.triggers_set(kwargs['scan_dim'],{2:''}) -def mpa_save_strSeq(**kwargs): - """ - **kwargs: - ADplugin: "TIFF1:" - """ - kwargs.setdefault("ADplugin","TIFF1:") - - ADplugin = mpa_pv + kwargs["ADplugin"] - - desc = "MCP datamode" - n=2 - strSeq_pv = userStringSeq_clear(mda,n) - caput(strSeq_pv+".DESC",desc) - caput(strSeq_pv+".LNK1",mpaDet_pv+"Acquire CA NMS") - caput(strSeq_pv+".STR1","Done") - caput(strSeq_pv+".WAIT1","Wait") - caput(strSeq_pv+".LNK2",mpaDet_pv+"RunTimeEnable PP NMS") - caput(strSeq_pv+".STR2","1") - caput(strSeq_pv+".WAIT2","Wait") - caput(strSeq_pv+".LNK3",ADplugin+"EnableCallbacks PP NMS") - caput(strSeq_pv+".STR3","1") - -def mpa_freerun_strSeq(): - """ - """ - desc = "MCP freerun" - n=1 - strSeq_pv = userStringSeq_clear(mda,n) - caput(strSeq_pv+".DESC",desc) - caput(strSeq_pv+".LNK1",mpaDet_pv+"Acquire PP NMS") - caput(strSeq_pv+".WAIT1","Wait") - caput(strSeq_pv+".STR1","Done") - caput(strSeq_pv+".LNK2","29iddMPA:TIFF1:EnableCallbacks PP NMS") - caput(strSeq_pv+".STR2","0") - caput(strSeq_pv+".WAIT2","Wait") - caput(strSeq_pv+".LNK3",mpaDet_pv+"RunTimeEnable PP NMS") - caput(strSeq_pv+".STR3","0") - caput(strSeq_pv+".WAIT3","Wait") - caput(strSeq_pv+".LNK4",mpaDet_pv+"Acquire PP NMS") - caput(strSeq_pv+".STR4","Acquire") - - -def mpa_HV_sp_calcOut(): - """ - """ - - desc = "MPA HV SP" - n=9 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - caput(calcOut_pv+".A",0) - caput(calcOut_pv+".B",ratio) - caput(calcOut_pv+".C",max_HV) - caput(calcOut_pv+".CALC$","A") - caput(calcOut_pv+".OCAL$","MIN(A/B,C/B)") - caput(calcOut_pv+".OOPT",1) # On Change - caput(calcOut_pv+".DOPT",1) # Use 0CALC - caput(calcOut_pv+".IVOA",0) # Continue Normally - caput(calcOut_pv+".OUT",DAC_pv+" PP NMS") - -def mpa_HV_rbv_calcOut(): - """ - """ - desc = "MPA HV RBV" - n=10 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - caput(calcOut_pv+".INPA",DAC_pv+' CP NMS') - caput(calcOut_pv+".B",ratio) - caput(calcOut_pv+".CALC$","A*B") - -def mpa_interlock_mpa(): - """ - """ - desc = "MPA Interlock mpa" - n=7 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - tth_pv = Kappa_motor_dictionary('tth')[3] - caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") - caput(calcOut_pv+".B",1) - caput(calcOut_pv+".CALC$","ABS((("+str(tth_dLLM)+"<A && A<"+str(tth_dHLM)+") && (B>0))-1)") - caput(calcOut_pv+".OCAL$",'A') - caput(calcOut_pv+".OOPT",2) # When zero - caput(calcOut_pv+".DOPT",0) # Use CALC - caput(calcOut_pv+".IVOA",0) # Continue Normally - caput(calcOut_pv+".OUT",mpa_on_off_pv()+"PP NMS") + def _save_strSeq(self,**kwargs): + """ + **kwargs: + ADplugin: "TIFF1:" + """ + kwargs.setdefault("ADplugin","TIFF1:") + + ADplugin = self.pv + kwargs["ADplugin"] + + desc = "MCP datamode" + n=2 + strSeq_pv = userStringSeq_clear(BL.mda,n) + caput(strSeq_pv+".DESC",desc) + caput(strSeq_pv+".LNK1",self._det_pv+"Acquire CA NMS") + caput(strSeq_pv+".STR1","Done") + caput(strSeq_pv+".WAIT1","Wait") + caput(strSeq_pv+".LNK2",self._det_pv+"RunTimeEnable PP NMS") + caput(strSeq_pv+".STR2","1") + caput(strSeq_pv+".WAIT2","Wait") + caput(strSeq_pv+".LNK3",ADplugin+"EnableCallbacks PP NMS") + caput(strSeq_pv+".STR3","1") + + def _freerun_strSeq(self): + """ + """ + desc = "MCP freerun" + n=1 + strSeq_pv = userStringSeq_clear(BL.mda,n) + caput(strSeq_pv+".DESC",desc) + caput(strSeq_pv+".LNK1",self._det_pv+"Acquire PP NMS") + caput(strSeq_pv+".WAIT1","Wait") + caput(strSeq_pv+".STR1","Done") + caput(strSeq_pv+".LNK2","29iddMPA:TIFF1:EnableCallbacks PP NMS") + caput(strSeq_pv+".STR2","0") + caput(strSeq_pv+".WAIT2","Wait") + caput(strSeq_pv+".LNK3",self._det_pv+"RunTimeEnable PP NMS") + caput(strSeq_pv+".STR3","0") + caput(strSeq_pv+".WAIT3","Wait") + caput(strSeq_pv+".LNK4",self._det_pv+"Acquire PP NMS") + caput(strSeq_pv+".STR4","Acquire") + + + def _HV_sp_calcOut(self): + """ + """ + + desc = "MPA HV SP" + n=9 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + caput(calcOut_pv+".A",0) + caput(calcOut_pv+".B",self.ratio) + caput(calcOut_pv+".C",self.max_HV) + caput(calcOut_pv+".CALC$","A") + caput(calcOut_pv+".OCAL$","MIN(A/B,C/B)") + caput(calcOut_pv+".OOPT",1) # On Change + caput(calcOut_pv+".DOPT",1) # Use 0CALC + caput(calcOut_pv+".IVOA",0) # Continue Normally + caput(calcOut_pv+".OUT",self._DAC_pv+" PP NMS") + + def _HV_rbv_calcOut(self): + """ + """ + desc = "MPA HV RBV" + n=10 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + caput(calcOut_pv+".INPA",DAC_pv+' CP NMS') + caput(calcOut_pv+".B",self.ratio) + caput(calcOut_pv+".CALC$","A*B") + + def _interlock_mpa(self): + """ + """ + desc = "MPA Interlock mpa" + n=7 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + tth_pv = self._tth_pv + caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") + caput(calcOut_pv+".B",1) + caput(calcOut_pv+".CALC$","ABS((("+str(self.tth_dLLM)+"<A && A<"+str(self.tth_dHLM)+") && (B>0))-1)") + caput(calcOut_pv+".OCAL$",'A') + caput(calcOut_pv+".OOPT",2) # When zero + caput(calcOut_pv+".DOPT",0) # Use CALC + caput(calcOut_pv+".IVOA",0) # Continue Normally + caput(calcOut_pv+".OUT",self._off_on_pv()+"PP NMS") -def mpa_interlock_DAC(): - """ - """ - desc = "MPA Interlock DAC" - n=8 - calcOut_pv = userCalcOut_clear(mda,n) - - caput(calcOut_pv+".DESC",desc) - tth_pv = Kappa_motor_dictionary('tth')[3] - caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") - caput(calcOut_pv+".B",1) - caput(calcOut_pv+".CALC$","ABS((("+str(tth_dLLM)+"<A && A<"+str(tth_dHLM)+") && (B>0))-1)") - caput(calcOut_pv+".OCAL$",'A') - caput(calcOut_pv+".OOPT",2) # When zero - caput(calcOut_pv+".DOPT",0) # Use CALC - caput(calcOut_pv+".IVOA",0) # Continue Normally - caput(calcOut_pv+".OUT",DAC_pv+"_Se PP NMS") + def _interlock_DAC(self): + """ + """ + desc = "MPA Interlock DAC" + n=8 + calcOut_pv = userCalcOut_clear(BL.mda,n) + + caput(calcOut_pv+".DESC",desc) + tth_pv = self._tth_pv + caput(calcOut_pv+".INPA",tth_pv+".DRBV CP NMS") + caput(calcOut_pv+".B",1) + caput(calcOut_pv+".CALC$","ABS((("+str(self.tth_dLLM)+"<A && A<"+str(self.tth_dHLM)+") && (B>0))-1)") + caput(calcOut_pv+".OCAL$",'A') + caput(calcOut_pv+".OOPT",2) # When zero + caput(calcOut_pv+".DOPT",0) # Use CALC + caput(calcOut_pv+".IVOA",0) # Continue Normally + caput(calcOut_pv+".OUT",self._DAC_pv+"_Se PP NMS") def reset_mpa_HV(): """ diff --git a/iexcode/instruments/resolution.py b/iexcode/instruments/resolution.py index a34f891..cd8c836 100644 --- a/iexcode/instruments/resolution.py +++ b/iexcode/instruments/resolution.py @@ -1,9 +1,35 @@ import numpy as np -from iexcode.instruments.electron_analyzer import resolution_EA +from epics import caget + +from iexcode.instruments.utilities import take_closest_value +from iexcode.instruments.xrays import get_branch, getE, slit_get +from iexcode.instruments.VLS_PGM import mono_grating_get +from iexcode.instruments.electron_analyzer import EA, resolution_EA, getSESslit +from iexcode.instruments.ARPES import ARPES_extra_pvs ############################################################################################################# ############################## Resolution ############################## ############################################################################################################# +def resolution(): + """ + Calculate the theoretical resolution for the current beamline settings: + ARPES: total resolution i.e. sqrt(kbT^2 + analyzer^2 + BL^2); default SES slit = 5. + Kappa: beamline contribution only + """ + branch = get_branch() + grt = mono_grating_get() + hv_eV = getE() + slit_size = take_closest_value([10,20,50,100,200],round(slit_get(),0)) + + if branch == "c": + slit_SES = getSESslit() + PE = int(EA.PassEnergy) + T = caget(ARPES_extra_pvs['TA']) + resolution_ARPES(grt,hv_eV,slit_size,PE,slit_SES,T,verbose=True) + else: + resolution_beamline(grt,hv_eV,slit_size,verbose=True) + + def resolution_calculate_beamline(grt,hv_eV,slit_size): """ diff --git a/iexcode/instruments/scratch.py b/iexcode/instruments/scratch.py deleted file mode 100644 index ded5e79..0000000 --- a/iexcode/instruments/scratch.py +++ /dev/null @@ -1,44 +0,0 @@ -############################################################################################################## -############################## setting folder from ARPES ############################## -############################################################################################################## -def folders_ARPES(user_name,**kwargs): - """ - Create and sets (if create_only=False) all the folders the current run and ARPES user - Sets the FileName for logging to be "UserName/YYYYMMDD_log.txt using logname_Set()" - - **kwargs: - set_folders = True (default); set the mda and EA scanRecords - = False; only makes the folders (was create_only) - run: run cycle e.g. 2022_1 (default => check_run() ) - ftp = True / False (default); print what needs to be added to the ftps crontab and create additional ftp folders - mda_ioc: will overwrite the default ioc for mda scans - debug - - """ - kwargs.setdefault('set_folders',True) - kwargs.setdefault('run',check_run()) - kwargs.setdefault('ftp',False) - kwargs.setdefault('debug',False) - - run = kwargs['run'] - - if kwargs['debug']: - print("run,folder,user_name,ioc,ftp: ",run,BL.folder,user_name,BL.ioc,kwargs['ftp']) - - # Create User Folder: - make_user_folders(run,BL.folder,user_name,BL.endstation,ftp=kwargs['ftp']) - sleep(5) - - if kwargs["set_folders"]: - # Set up MDA folder: - folder_mda(run,BL.folder,user_name,BL.prefix,BL.ioc) - logfile_name_set(BL.endstation) - logfile_header(BL.endstation,BL.ioc,ARPES_log_header()) - - - #Set up Scienta folders: - try: - userPath = "/net/s29data/export/data_29id"+BL.folder+"/"+run+"/"+user_name+"/" - folders_EA(userPath,filePrefix="EA") - except: - print_warning_message("EA ioc is not running, cannot set folder") \ No newline at end of file diff --git a/iexcode/instruments/staff.py b/iexcode/instruments/staff.py index b9d6eef..ba5648b 100644 --- a/iexcode/instruments/staff.py +++ b/iexcode/instruments/staff.py @@ -1,10 +1,6 @@ from os import listdir,mkdir,chmod from os.path import join, isfile, exists -#from .ARPES import folders_ARPES -#from .Kappa import folders_Kappa - - def folders_startup(run): """ Creates the run directories for the following: diff --git a/iexcode/instruments/xrays.py b/iexcode/instruments/xrays.py index aa02940..b4a4c18 100644 --- a/iexcode/instruments/xrays.py +++ b/iexcode/instruments/xrays.py @@ -8,7 +8,6 @@ from time import sleep from epics import caget,caput from iexcode.instruments.IEX_endstations import BL -from iexcode.instruments.resolution import * from iexcode.instruments.IEX_VPU import * from iexcode.instruments.VLS_PGM import * from iexcode.instruments.slits import * @@ -18,13 +17,12 @@ from iexcode.instruments.diagnostics import * from iexcode.instruments.m3r import * from iexcode.instruments.logfile import * from iexcode.instruments.utilities import print_warning_message,make_table, take_closest_value -from iexcode.instruments.mpa import * from iexcode.instruments.current_amplifiers import ca_average -from iexcode.instruments.beamline import branch_cams_enable +from iexcode.instruments.beamline import endstation_cams_enable + +from iexcode.instruments.MPA import mpa_HV_on,mpa_HV_off + -from iexcode.instruments.ARPES import ARPES_mprint,ARPES_extra_pvs -from iexcode.instruments.Kappa import Kappa_mprint -from iexcode.instruments.electron_analyzer import getSESslit, EA ############################################################################################################## ############################## resets and detector lists ############################## ############################################################################################################## @@ -104,10 +102,9 @@ def xrays_get_all(verbose=False): vals.update(FMB_mirror_get(1,verbose=True)) vals.update(FMB_mirror_get(3,verbose=True)) print("-----------------------------------------------------------") - vals.update({'ARPES':ARPES_mprint()}) - print("ARPES = ",ARPES_mprint()) - vals.update({'Kappa':Kappa_mprint()}) - print("Kappa = ",Kappa_mprint()) + vals.update({BL.endstation:BL.Motors.mprint()}) + print(BL.endstation+" = ",BL.Motors.mprint()) + print("===========================================================") return vals @@ -143,12 +140,12 @@ def xrays_log_entries(**kwargs): #endstation info if BL.endstation_name == 'ARPES': - endstation_entry, endstation_pv, endstation_format = ARPES_log_entries(**kwargs) + endstation_entry, endstation_pv, endstation_format = BL.log_entries(**kwargs) entry_list.append(endstation_entry) pv_list.append(endstation_pv) format_list.append(endstation_format) elif BL.endstation_name == 'Kappa': - endstation_entry, endstation_pv, endstation_format = Kappa_log_entries(**kwargs) + endstation_entry, endstation_pv, endstation_format = BL.log_entries(**kwargs) entry_list.append(endstation_entry[:-7]) pv_list.append(endstation_pv[:-7]) format_list.append(endstation_format[:-7]) @@ -167,7 +164,7 @@ def xrays_log_entries(**kwargs): #endstation info 2: Fanny can I change to order to get rid of this complication? if BL.endstation_name == 'Kappa': - endstation_entry, endstation_pv, endstation_format = Kappa_log_entries(**kwargs) + endstation_entry, endstation_pv, endstation_format = BL.log_entries(**kwargs) entry_list.append(endstation_entry[-7:]) pv_list.append(endstation_pv[-7:]) format_list.append(endstation_format[-7:]) @@ -289,7 +286,7 @@ def scan_ID(ID_sp_start,ID_sp_stop,ID_sp_step,**kwargs): scan the ID set point """ val_pv,rbv_pv = ID_scan_pvs() - mda.fillin(val_pv,rbv_pv,ID_sp_start,ID_sp_stop,ID_sp_step,**kwargs) + BL.mda.fillin(val_pv,rbv_pv,ID_sp_start,ID_sp_stop,ID_sp_step,**kwargs) def mvmono(val): @@ -357,12 +354,12 @@ def scanhv(start,stop,step,average_pnts=1,**kwargs): """ ca_average(average_pnts) - mono_scan_fillin(mda,start,stop,step,**kwargs) + mono_scan_fillin(BL.mda,start,stop,step,**kwargs) mono_energy_set(start) - mda.go(**kwargs) + BL.mda.go(**kwargs) - mono_scan_after(mda) + mono_scan_after(BL.mda) def scanE(start,stop,step,ID_offset=0,mesh='stay',average_pnts=1,scan_dim=1,**kwargs): @@ -447,8 +444,8 @@ def scanXAS(ID_eV,start_stop_step_lists,**kwargs): #Setting everything back mono_energy_set(ID_eV) - mono_scan_after(mda,scan_dim) - mda.table_reset_after(scan_dim) + mono_scan_after(BL.mda,scan_dim) + BL.mda.table_reset_after(scan_dim) if BL.branch == "d": if kwargs["mcp"]: @@ -487,10 +484,10 @@ def scanXAS_BL(start_stop_step_lists,**kwargs): mono_array,ID_array = BL_energy_tables(start_stop_step_lists) kwargs.update('positioner_num',1) - mono_scan_fillin_table(mda,scan_dim,mono_array,**kwargs) + mono_scan_fillin_table(BL.mda,scan_dim,mono_array,**kwargs) kwargs.update('positioner_num',2) - ID_scan_fillin_table(mda,scan_dim,ID_array,**kwargs) + ID_scan_fillin_table(BL.mda,scan_dim,ID_array,**kwargs) #Averaging and Normalization ca_average(kwargs['average_pnts']) @@ -512,8 +509,8 @@ def scanXAS_BL(start_stop_step_lists,**kwargs): #Setting everything back mono_energy_set(mono_array[0]) - mono_scan_after(mda,scan_dim) - mda.table_reset_after(scan_dim) + mono_scan_after(BL.mda,scan_dim) + BL.mda.table_reset_after(scan_dim) if BL.branch == "d": if kwargs["mcp"]: @@ -626,7 +623,7 @@ def switch_branch(branch, force=False, shutter=True,scan_reset=True,enable_cams= BL.mda.reset() if enable_cams: - branch_cams_enable(branch) + endstation_cams_enable(branch) else: print_warning_message(branch+' is not a valid branch selection') @@ -677,24 +674,7 @@ def slit_get(verbose=True): print(message) return slit_size,slit_center -def resolution(): - """ - Calculate the theoretical resolution for the current beamline settings: - ARPES: total resolution i.e. sqrt(kbT^2 + analyzer^2 + BL^2); default SES slit = 5. - Kappa: beamline contribution only - """ - branch = get_branch() - grt = mono_grating_get() - hv_eV = getE() - slit_size = take_closest_value([10,20,50,100,200],round(slit_get(),0)) - if branch == "c": - slit_SES = getSESslit() - PE = int(EA.PassEnergy) - T = caget(ARPES_extra_pvs['TA']) - resolution_ARPES(grt,hv_eV,slit_size,PE,slit_SES,T,verbose=True) - else: - resolution_beamline(grt,hv_eV,slit_size,verbose=True) -- GitLab