Macro performing an scan using the Maia detector.
#!/bin/env python
import PyTango
import time
from sardana.macroserver.macro import macro, Type
__all__ = ["maia_scan"]
counter = 0
class HookPars:
pass
def hook_pre_move(self, hook_pars):
global counter
PetraCurrentDevice = PyTango.DeviceProxy("petra/globals/keyword")
while PetraCurrentDevice.BeamCurrent.value < 15.:
self.output("Petra Current below 15 mA. Current Value " + str(PetraCurrentDevice.BeamCurrent.value) + ". Waiting...")
time.sleep(1.)
m = self.macros
if counter%2==0:
self.output("Axis 0 to right: " + str(hook_pars.mot0_right))
m.mv(hook_pars.mot0,hook_pars.mot0_right)
else:
self.output("Axis 0 to left: " + str(hook_pars.mot0_left))
m.mv(hook_pars.mot0,hook_pars.mot0_left)
if counter!=0:
self.output(str(float(counter)/float(hook_pars.pixel_size1)*100.) + "% done, runtime " + str((time.time()-hook_pars.starttime)/60.) + " minutes, remaining time" + str( (time.time()-hook_pars.starttime)/60.*(float(hook_pars.pixel_size1-counter)/float(counter)) ) + " minutes")
counter = counter + 1
@macro( param_def = [
['mot0', Type.Moveable, None, 'Internal motor'],
['pixel_origin0', Type.Float, None, 'Pixel origin internal motor'],
['scan_range0', Type.Float, None, 'Scan range internal motor'],
['pixel_pitch0', Type.Float, None, 'Pixel pitch internal motor'],
['scan_dwell', Type.Float, None, 'Scan time per pixel'],
['mot1', Type.Moveable, None, 'External motor'],
['pixel_origin1', Type.Float, None, 'Pixel origin external motor'],
['scan_range1', Type.Float, None, 'Scan range external motor'],
['pixel_pitch1', Type.Float, None, 'Pixel pitch external motor'],
['info_comment', Type.String, " ", 'Comment to be written in the maia scan info'] ])
def maia_scan( self, mot0, pixel_origin0, scan_range0, pixel_pitch0, scan_dwell, mot1, pixel_origin1, scan_range1, pixel_pitch1, info_comment):
""" scans with maia detector """
maia_logger = self.getEnv('MaiaLoggerDevice')
maia_scan = self.getEnv('MaiaScanDevice')
maia_processing = self.getEnv('MaiaProcessingDevice')
maia_axis0 = self.getEnv('MaiaAxis0Device')
maia_axis1 = self.getEnv('MaiaAxis1Device')
energy_device = self.getEnv('EnergyDevice')
keithley_device = self.getEnv('KeithleyDevice')
maia_sample = self.getEnv('MaiaSampleDevice')
MaiaLogger=PyTango.DeviceProxy(maia_logger)
MaiaScan=PyTango.DeviceProxy(maia_scan)
MaiaProcessing=PyTango.DeviceProxy(maia_processing)
MaiaAxis0=PyTango.DeviceProxy(maia_axis0)
MaiaAxis1=PyTango.DeviceProxy(maia_axis1)
EnergyDevice = PyTango.DeviceProxy(energy_device)
KeithleyDevice = PyTango.DeviceProxy(keithley_device)
mono_energy=EnergyDevice.position/1000.
keithley_gain=1.E9/10**(KeithleyDevice.Gain)
# Move motors to the start positions
startpos0 = pixel_origin0 - pixel_pitch0
macro_mov_starpos0 , pars = self.createMacro('mv', mot0, startpos0)
self.runMacro(macro_mov_starpos0)
startpos1 = pixel_origin1
macro_mov_starpos1 , pars = self.createMacro('mv', mot1, startpos1)
self.runMacro(macro_mov_starpos1)
# Send values to the maia detector
ScanInfo=str('"{energy:'+str(mono_energy)+',IC_sensitivity:'+str(keithley_gain)+',sample:\\"'+info_comment+'\\"}"')
pixel_size0 = (int)(scan_range0/pixel_pitch0)
pixel_size1 = (int)(scan_range1/pixel_pitch1)
MaiaAxis1.PositionScale = pixel_pitch1
MaiaAxis0.position = pixel_origin0 - pixel_pitch0
MaiaAxis1.position = pixel_origin1
MaiaAxis0.ScanSize = pixel_size0
MaiaAxis1.ScanSize = pixel_size1
MaiaAxis0.PixelPitch = pixel_pitch0
MaiaAxis1.PixelPitch = pixel_pitch1
MaiaAxis0.PixelOrigin = pixel_origin0
MaiaAxis1.PixelOrigin = pixel_origin1
MaiaScan.ScanDwell = scan_dwell
MaiaScan.ScanInfo = ScanInfo
# Set mot0 to the desired slew rate
# SlewDouble is still not accesible in the sardana motor
mot0_tango = PyTango.DeviceProxy(mot0.TangoDevice)
mot0_old_slewrate=mot0_tango.SlewDouble
mot0_desired_slewrate = pixel_pitch0/scan_dwell
mot0_tango.SlewDouble = mot0_desired_slewrate
starttime=time.time()
MaiaLogger.NewRun()
MaiaProcessing.PixelEnable = 1
MaiaLogger.NewRun()
MaiaScan.ScanNew = 1
# Start the scan
global counter
counter = 0
mot0_left = pixel_origin0 + pixel_size0*pixel_pitch0
mot0_right = pixel_origin0
start_pos = pixel_origin1
final_pos = pixel_origin1 + scan_range1
nr_interv = (int)(scan_range1/pixel_pitch1)
integ_time = 1.
macro,pars = self.createMacro('ascan', mot1, start_pos, final_pos, nr_interv, integ_time)
hook_pars = HookPars()
hook_pars.mot0 = mot0
hook_pars.mot0_left = mot0_left
hook_pars.mot0_right = mot0_right
hook_pars.MaiaScan = MaiaScan
hook_pars.pixel_size1 = pixel_size1
hook_pars.starttime = starttime
f = lambda : hook_pre_move( self, hook_pars)
macro.hooks = [
(f, ["pre-move"]),
]
self.runMacro(macro)
# After finishing the scan
MaiaLogger.EndRun()
MaiaProcessing.PixelEnable = 0
mot0_tango.SlewDouble = mot0_old_slewrate