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
zcma)Ad2C$88GrNkK5ZwycH<;I;@BG-J9c~oCvj}!BbOZ;8<K3Gn~mpr5AR`SpB>w5
zSkVMfxf(jCf|P<oNz{~^g^~gaw5SrQpodDU_Vph?r6R3_sM@Mj6>7h4p5ttm6m?ho
zn{U4P=6K)tn{Vdrw_YaiW{JDc<+4lgY5(baN7qk3<Sr+_eW>ok43VfrZLzuuNvS^}
z1%0%D7M_&+n`jYT1!V&rqQ$i2B=I-WQd$O@>u5RkK-omSbWKQ}BD8|8h4yB;j;;s&
zW?D(BplqSlv<Avnx`Eb0xrJ_|bx^j^dg_C+oo=EHCo_`2gErFZK+zeJV6Z0I41;Z@
zyJ!n-1?hUan{J_PAa&6_w4HW<w2gMst<YmTy`FYKxr1(_+o9~HJ7_nQJLyi^17#2G
zrF~HL(i><$lznu74nlbYHI7TZy_din+$(=lKs0CXjiUqOf#IZ@WU1`G4Ht~W&tJB_
zWYpw=UOsJ`HJ+DPBfrmZz~va|4MdWYfk+~vR`D-v!=#DtweN0fgwdFQ>p;@%Aw?Y@
z7*E9_>H(;yi~tg`61EviR+asU{dJkN@H<>%#LIu_y4_qU^nA>{mTcrncl%%+DE!vm
z{+ZZpD3V|uP}O8QrJ1H?f@;`rpNhnkk=giBh3V7g%srKiQH7-f1HFg&pWWl6E8AUQ
zB^~Q<L|aTrqyq6IRWw^_GMEq|YrxUXsbh*VlhVvnEErc(jDV7PdAhK>stVifqrp^a
zAfd3(0$Y!5+Yveu8u%Xy*JU(!EE&Re1!iYxP*pU!Zy)nv`$hnt$?r_fD3dA+g7>D9
znq5h#Y#|Vfq*To^Gp7rVsU(XBRlQ=ERu=M~&IJL0X_lur1p}w50VI=^&lgpaUHs9a
zPmk^dg(mq3+YN%xpt&wDY=%W((i=c47Uq-LHk8rX`4c&Dmaq~8R}S=^2ZNLuKq5vA
z<G$>rRpm0oPA=J9f=|cX2<RtPi_poBlpOH-ooXbm1X9XmGC@<hGw@%Pc*t}7FC{+W
z&z6*)lZ(C3&2OQKI>90#HiCn6@L!aBoMO-xs1LF+{`c}OvWGW&N;Vz=jnBa<q0r|=
zid=a#Jun-2)YDWv0WE&#Q3ZUf1cFm4aHftw<LPqbu$KSTvzq*jo4i}rgur|fqmLha
zX#DMkU#f$Td;99<RXJ*i8mWa^?~*-|YKof6q~ivmwH!B6n`&KxAHU$O&3s!W)Si}4
z$V5`@VCkTaGKo5=>j4>hIEBVtCM{dI(uTA=C8x=Q<hW_MwE$X8qQ83yveOwtq%@(#
zBb_3w6-F=0A6M8Cx(fAPm=K27CtPk=t#{yaYu@t+xBAVAMTI3(Y(G3B+k<d~-%`=M
zx)sC;V9`-jZ9!<`k5{y13U#lGxC<^F!M1t?5iGG;Ez3Jp1VS?{LN%tdq#X@i2qg$e
zUseO)Gi#<9bzw%)`FJbpuLtm363V<f+~2DUBdxRXTq>d2B*5R`m%@ljHYb6vj7+u4
zR#Hl={EoF=GRYrZ`-Q^;2J8^RP5jKd+es&1yM9|$4ilhBD-84vwC)`M=Bl$ZHw0so
zUcRt?eRmSta4PXZhG1S3%xD53EiFluQ27i7n}j54fKW;gLcow3OGf_w`mXB3V91c`
zEC?{-GwHrW&gtYm!W$|*`>weoF=4^>X9_H<0jAe?q`@h>3A+sjSRpNLMl1Zp(%Sf`
z%Et=6ubR@*2|^2}Wgt!y-&WNrlPG6ZZFQ$r11(D%1U(G2JZ(hj6iLLEyLd#GAMp3|
zF2?G%g3p$lDxgVbr}<EI+(x2~C1=_|OSq%jgJZv6T~AK)FRBld-|<5=Rn?!vJoP8g
z9bg)DPXUk7Ikfb+1%6i0@<(dck%RoznjvyO|4&UbY2?it4pgFf>1A`Z?1ThEl&{oD
zH2dU+uw1+1S<Rx%E0eRTGQsq;fsqn9p2c}{-8xdvN9yXx8a`Lo3d!Vr-MwUlx7CM9
zfPc3>c~cKsuLaP|gW@EBEGhE+?Vt;teiT3Fcd{_lU~gc{h|jA>QEY~ljIXDl7#Of5
z5BfZrBOq!{+z63GKn)&^!C8W>GpIM~dVL2`(D(}i%jd<gl1c?b3fq9jE89hrLrJy^
zRTz7%NDQcxLr-!(H^a=Q@1`Aa+W*VfK@`4ulecyXdsqf~XM!w#RbEEDS?Adnp4`-!
zsfMj&hp!vHt4JX!Ce=`LiW=5YgF4h+{<?vXZW(F@L@U&c@GXb-3gR@Cq7Js_Dx;lj
z6gn7PHiJ|sv%6sdlLi3%IPr$kU?=muwqbfl)TEl1EYx;}P%C8J%d*8Ir6Chj`vXRx
z1?1&rJ4cS4;|%|C!|H>}EzX=4lyL+Tb$w|Bca9y(XlI5SqL_&qVa~$G<l}b8^p%Ze
zE>)G&4#93))Xw`GYgZei4j`#PBmk!%tt-3Oc!^{LQ^g6V^D_m{I<b7;08x|Gu#af&
znPe)WMv`#j2qb3X8kyI~0vkmGvM6#j5EHvHG2S9dJqXBMhGfkp?g+4<5_DQ|gn!gj
zoXJbx8SGOE;4gwJ5!?d<G%|^k2ibxMiq1>Hz&p`)g?K)v=DsmG8w!suFE`~ktKofc
ztI1*CH?YgS2=^h}Bk^0C%PQ_dIWO}H@(m83=ck%WOX`XE8f74n)8Gc$Y$WdN>&<5k
z#k%Lv8?Xt7pcrB0T;0+_I{3LQgKhVK2G<doOve1CI2K|bXk<zw`NxN5oSIEc{)1Px
zZ5<M+S;R)1hO;<<e#?M;kz}eunFVz0IDlpfG8SAA*E`J|WWhv8(G2n6JR9dvv~4!m
zq2WFJH*M9$S3f1YA6kCR9qmJq?Z(^po0jCX?F>KLeoscsj|pqUXAow3RIKs2R4_gh
zQ+#&z0JQo|YWU`${!Hvk-i2u&#JRtTmIeq+zLy>GIq(hK1r;_!<jW_CshX^-m)T>`
zYZ8>=gU5&oe&Q(kgumHwH~AwU?CkbN?Lcl>kQ-^POV+3@>dc<*eAtlDNiD*(XdURq
zYi?JiIQg!kt#Gv<u*lLqFx9mQ>~jhJ3TNw#T!pqp2!#k$2!f!PhKtw{tP8H*hSJyh
zkG56ryOI!3p%NMB7nB=H`t9*#A{h`N^;>uM>r%ew#9IR#!r?gwuid`Mj2VtS&TrZt
zCKLSP_Oj+B99KmC>X>WR<>PyyA000IOW0X%+%Y(YeSpSiurTY}=1Cmpdk9Y<EFpZ=
zsEb26qn_j6+2J7<`71jH+M>oZNy~7tG)@`QW{ejkF@r~9Q>uyD(l$KoK?4^`Do@Mo
zHPsxo@W$>M55#iG4lQm-dp2>Wafl@5%!a$i<eHrL{;#O=I|j-#J-G5~rX<FoY2<QT
zG4pF?{mn^mo{eEok*BT>ZBAsbWFfn7n`RQpi(T<vYo7a7!mek{t79Z0u$M3OmTxMC
zi=$n3${XR-Gs~i3<y^AC!dCXgMgCFmemQF7Eqx_r3Gk^SZ5BQ?pih_md23%y3GNN_
zXW;{Q1-k4@-gi-6_m#dJ<;j7%uW%y}2lr2&BO{5F!c;wZSde*v*8cz7nKt1}f6+o9
zr3RS_$Ss3w9D;wk1Nn7>9TitQPjf629Ih+jV>~nHEnFp>Xay&_iP^xO&7L3pl)z={
zkzFmd7*kC?Hmzq;W9l}hYVu4(GqL1sg6d1{<e%=^QJOc6DLmIYz4$cm-R&V4vWIui
zlLAa4p_8ut&p)huuoK?dKiac1BRKOMG>8e<3n;yaAQ*+O?LI4e2^CoYjU?DBSa}uU
zhX^mD+K4$JKL?nm7hA(~Z{UW*93)xH@O;H^I^o5}3s)lchQycl{>dzoo0s3euYdP7
zmIIH9Cr19N9676!6D^vYXw6yLYuqzj*_G!K*C@W%2Zn<2crcLo`O3lwF02%mRt}{b
z4o~)0HZ^?bmmOx<KX~{WD`d~3BZSu+D6P0oGva%iW`egPxWv8%ZN9=Q%k~?>b1ev$
z7tWvB-{!lBBfN=_w|aN(>cext=VY{<yv;jD?;FO`aM4&vl@J6Ak6b;DxGc>WOhpo!
zg#~FVv|m}9Sg+5bFGmEC1T}J$mGOcxZ&}{l=IMFt{Tc5WD<SV>Zyp;Y84<PpIN2P)
zB_~R^pi~Lqv*~Yd!e|tmgeBe+ggH9~(j`1K**w7V`+})Q*P|CNRU_a#GQ(b>_uj=%
zX^*hK<d({zwG2%f5QY#iQL;6B%lI&<;CGI{*^hzn8JYM?%ZmT91>oN{zYQQTA>J#R
zu}9vsy5Pkz8Joph9sD=;IX^j3M?TIzGhvbk^DM165DsgHtGIqt6|hS<ClSXi6i?{2
z+@hcV^X3jx&6^H1ljHnr2gZoTUpS!3{tEu$ffBy$pp$=iu$13=aI37X0aY=7`d}TX
z)@J;c@yQ7M9TwCN@g`jSW`r&Tk>vNG<VOf0Od=!^ZbP^m;UR?k5%31X9!EHfa1P-N
z!m|h$5Z*v|3*l|49q=6#KSsdk%yFG?jrdd3x*h&EoQ)~nnEO+Ho;_4+b`q<>Y~&vt
GYW**3m><jl

delta 5659
zcmai2Yiv}<6~1%#{qTALzt%Q>g6+i^gRu?4Hpbw!F<@hZd2Jr6>z(V}wfEu7Uh~Ql
z(?FY)6dIUFQPV_m+UBLCA<d>FAt`Osri!A_=1-;S=1)>JLbMS|D)kj9YR{Q#Y_lcp
zuI`yLXJ*dKob%0@bMFUPa^W@N*_xN<l;F4W<khh+C(e6H$e+*Ge=?J(57s9df(;3O
z&`%^PQAd2$s6_Lr_p}sjR98<l1)Jy+x)f?_=rURWWiuV1MYQ-d39h9j)CZDvw3L=X
z*+R?d@`yZ6Xa%i=_Vu)iR)f5i*3eog+vp0q63TX3N9&>7KxZ1LADE4F6>Ws_4!W8)
zLAi;pq0LZsL?lqQmaYS3opc9XPg{ZOqC06DZ3k{M-9<Ohjlgx&JLo1Dv4wWfPAGe5
z7u^iyR@zOsK)H?f(5+DR(rvUC$^Z?}zSEL7*hl;6b`bPa^Ipk6$YuGn8M9v0vu8N4
zH<U<eDHfu!uog=t6?RPbE|#amN>caCNe-u##8h0>^Nc#Sg<5*UX!4ss0?ame(&z|H
zIwdKDN-!xI^2<Tn-f&D!YKkrgoINi{tPJ|FGXAOkfX^NZC6rh)6e`ETG7w2-%YkOU
zlHV{BonNxOYGI`y;Bou(^0}c<WjH{01$siUR5%n%#<W^K;20$9`D2cOHO36{-JB6s
z+Z))Mj>oh^AWWNqNW@N98+IwpdYo^`q@BO-9wF7dJnuehgOKwl^Oln){#IU_cMS-F
z_MYCU_;e(eWE~egWo5aOjHlvMW$93$=WgEa*-N^!XFPUNUWY>+aW$C+n^RSH2>T(+
zTKLQPKA7^o{LR(4N8LHBq|<?<$|A>DJ+7e#NhgvPUhl2w2zuhF$apNShNh>eqN%#P
zbr)NU?M*=ZmY_R5rG_=8fJw$vK_{4<9Sg-{X)VZ4ddn(u)|?0S1BG+SF7P+KjbsP^
z)O%yB7u4zCKeiL~nu2*Z=bd6P(Akeu;=F#DZ9yIll<OTgs*b7(>@?8xB6LVwfk?!R
zrXS3<EiI8@^Fsv#g}8X;L4syrtC4i_mkJJ)>TWHTP(x`ooJ!L4;u-kzLLYgBZz%MW
zyRu5*vvNT-3=7(*s*SQ(gzZKp9lWf>=N3xaq29;#@GT{qI(Gp->L<EGNr%!J>?kq>
zTO9+b-^C2)i_u8tw`%yIiC-#NQ?L(Og6=VOJjK+IGOnqNt>OPH*;JWhU{46W9q7Ro
zMO5|yAMvd(i^1S9o*4Y0N$^2Cr(5__zOA*ICQq2CjoQB{`y|agVJVhQm_TMdVWtkv
zHfz^x++MnJ=7L73Gb5jpiKIE8pOd<ZCF-VmXJzQ`5)x0bG}ptOF=ga&IYZ8o6PCHw
zd}y_Z@p-cz>V29JDMKjnNskb=2DC59)hqfEx)kN5Fd?WnCY)<nW(?rJDZT0w1`k@3
z$5oa}vtigDL%Xvv{!&@<vJJq33m8SwMkIIe8)dDLe8c_%5$F)sj6`^_1Gu0K(LXeu
z5Z=%&$DtZGptA`(<{>FW;zzOyh~KJPrnF;IssYjv$~W_K<wZMgbrw^h<!|t$5r2}y
zP2evhSnaZ%6c8&ZmCdr3IL%9mmw4cD!oLLmOyxJqzj9T<C>BJrpZ|UNeWa7KijL}A
zC(*s3t$~)E0YJ1iJ+)1Vhs*hID=Ntpzfs{MtGT_hQl2&O#>!1IccUi6G{aCk<To3Z
zLG%cy>Px0l=@^D@j5^`CsxYwUZ4aUW!Vpto)+RunaS%;z*+Uouee-C<GiZkg&}fp<
zEBI%XPvp;PmW*_YQ17G+uvpC>tJ=UntZJ>lpqXfK#w0v%q9qwKa*vSY_*{RV=>IHl
ztlnUA%>w*r8DC!G<EN_&@;{sFQx1J(c7Z=vodBJcMB^K48ps8%)Z9rv<UgyauJ{~g
zX*dPI)Lavuae(JJ;Aznb8$5RHLTv@v#Vc$3$w?lmZ6@XXvDyRt^V;&PXGK(AId4MU
zrXE$p)0#TUj5vVDkF_94^6%GGkV<~JuAbEJKi0K?!ovD9WH+C!j}nDD8dCcL*l{Hg
z-P*^Lgqnu1C*pGkWRb_ehrbuP*#y+U1=up=FE!k?5IzK?MJ!K12R6m8HuxG5;<_6_
z47Z@BjKx(Z9DFazt%lq{|2SXbFZ4Cy(0OR<awNreposBqzt4qX$w0tX9`<h}5&nd~
zbY&EE*#bRN3QOD)LQ!rtu+hdp@~`$+0pt<X9{3~33rH2z+@gkcl%TANuU%Ev=Y~jb
zCPmProVYDTvJ;MqTV85*k~$%Sk+K!F$?QRxDr^FRKQ}x!ctps%ho4_HnXg%>10ZIH
zc!wNc(zt9LaISe7ayFloF;kg3&zb=arU^6jaL@N}pW;g6vLTRp=4Hs?C@W-rViYw~
zJM}&xpKxkch=wHNglOmjXj*&{wF<xnH8}&b!3?$uJAbcn<q`+L&V;bjoTnrN;;XB#
zlRAMdamg5n(qKoUOyCL+tuAX(KMC^uHAOQcSSQCt3<Tt0PbP-nhul247@}!0vWEO_
z0V2Hs?p&2k?MY2XqQi5CJ}s_%5ee8y)Ki264Q=2>Amst9&KL***6-Fmw<-x*wdgKL
z57+{9zKvtfAbA+cLqK#>I2zMUQ$Xy2p2;H$i=^4Nur(*T2{iQ$zKAiV4%#I*#8BSR
z>?o`u;%}BAnz~IMfJz;4XAd<$V=6H0hem?KGXTX9tK>`9uOl72cYR+gE&!Jq3a8>h
zO9Bglah;6oB$2xU^Z0Z!{11L*{l<QDgOLV^%jYmoU|jEj`V`Yt$`FR^ejvI<VN5wD
zY^qxorX(Y(Zb~Re*(mR7U27F#^&y^attq&5%j`Qa`uF^W)_$^|f6=<zlmYk#+8&${
zvx6NV6v(0zD}jpN$<9I%v}n=&im?xN8-ufR(20E)h;9Oh=Wf!KI1KhMKw*+^#&b&z
zX^`2IFeofbd|&%A`A-th6jt#w?JD`0f8M^i2#_orNS^2H6Rzy`4Ud{;3;+vf90xCB
z(zvNgTtK&ARzO~$7dQ7m&^rfS1EvC(OL4#wBwi%qQWr4ADClMatau%<Q#{^LwQB*A
zkDw6o78C&Mhs-vSN~S`>XS#i$*Whx^BvNfiaifRx_#Zk}S=|t#*ethqM#(;YZ)b7y
z4^Z#zZcO{!jd`pOtqTvNt?W7edS~AVjscwh5DTkuY<>hhdj`p~NdB+Z;{%JdKF^1`
zeB^B&?F#UVUBzWogDej~1eYnqEy%^FJSnp`G|PmQf6`U!gQzs?fEEwLHOJGK`^`nA
z?DEYca_u57ex2|5`7I?gUmtZ?8a8n=^oW3>TaC93R*c&d_t=8(`cXE9<N+iLvBoKk
zqg%wACd;wW%z}~ToomFzoa2Rd9z=6h03$7da55J{%y6$Pg~ZG$yX88#t*o-}$^0$j
zfbJG}#4U3fn2c#wqJ+w5vkZT!r+anAma%87<0d1z!!2O)Nh}WbcV(=?{wB0PyCiH6
ziTN_HJy_m*7ViRwxC@-wk*!zcivMZ#5#AK2ANzWP1DfzW4c&bAz_X%TW68A2H0Fa!
zuE}p_Z3o-Oe;rum5@<F|%KsH;FTd5Cx@!*DgK9c@jPL9#^?HR3?O;PUv6|S$>~!A^
z0@)AUzRrnW*5xCU?0){#_Cl+X!SKu5yNYtuTB3(rCXfG^=MDJC<!t@HQId~wB62!!
z_r*umkGokle|bmum_W@dxFd|Y>{TRLB!*_-{C4&l3VsSiCrS1?R^CMN29irCHsjgP
zJ?oaq<1Nv{SNQIoW#kH<+<DC^0#!9XxT|;IHuLHh5#w{GcP*M;POj7CWXqy8yv;w|
zRkbN+?|H-cN*wA}5(y=g{1CB<flh)K1`lLM1@MA^`BWWY?_|3NzwzIe`Q1?8owr#b
z`w8w?n8$_Oyp41-zRl<sc!7X)@f~RMdl!}+G(``uLvnNBd}?>A{}-s?mq>C}?^(S1
z=;4p})!l96U2YnFco1)}<K`-=M!+iz4#Q>XW+fd<>Ncj(7HD5sn^>>kW-Lc|izqr7
zV-@_P;nJp@xvi5&ar9r&WSA66m@GnOfQck~KU*`>M`nZ<hoOxf0dgI?v3roK0^)ZV
zFG!*jCJ@GJCf@X-J39*8bvss%0h!CxEn5sZTJ?Gj61?;nj*49U0DnbWME~m^iC^1O
z46g<M-ZMy6@WH)5??o@bs~9FXK|6j?3c;79paV!~RHW~%s4HiqdGO|yicjOa8hjr5
zk`Is8lWW<dqZYX@r>7kip;|X&%f`i%&;EjQ5^-Nb@w8D}Tx{pR+TTw6{LB5#<bJ;D
zz=#~I;3p3j@bd>k@Dc5c12tSZSj7DYH}Yjr9ywU=HexxZB+SRX2YoYhAL+!`H{+wn
z7&fj)(uSlPi3sn5$lZk`hD1d&g+yH5;;KK7RZNXUKEh^^dk)F-NHD0gi%2dbxdNn1
z0GYju_4konLxMYBWK3bKa**lvPWXa09alGFh)>_eQ-@aCOYlYAY&G%654HRUVGseh

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