Closedown

This commit is contained in:
gac-x03da
2022-07-04 17:41:41 +02:00
parent 4778cf94a0
commit 05fa5acbf3
11 changed files with 14 additions and 1316 deletions

View File

@@ -1,4 +1,4 @@
#Wed Jun 15 17:37:31 CEST 2022
#Thu Jun 30 12:18:32 CEST 2022
autoSaveScanData=true
simulation=false
commandExecutionEvents=false
@@ -26,7 +26,7 @@ dataServerPort=-1
hideServerMessages=false
serverPort=8080
versionTrackingEnabled=true
dataPath={data}/{year}/{month}/pereira/pshell-{date}-{time}-{name}
dataPath={data}/{year}/{month}/karadan/pshell-{date}-{time}-{name}
serverEnabled=false
dataScanReleaseRecords=true
depthDimension=2

View File

@@ -1,7 +1,7 @@
#Sat Jun 18 22:38:26 CEST 2022
pgroup=p19571
proposal=20211675
proposer=pereira
#Thu Jun 30 12:19:13 CEST 2022
pgroup=p19764
proposal=20220567
proposer=karadan
prefix=
sample=hBN
authors=Zviadi Zarkua, Muhammad Saad, Matz Nissen, Renan Villarreal
sample=Si reference
authors=KaradanPrajith

View File

@@ -1,4 +1,4 @@
#Tue Jun 21 05:01:07 CEST 2022
LastRunDate=220621
FileSequentialNumber=13130
DaySequentialNumber=8
#Mon Jul 04 12:51:10 CEST 2022
LastRunDate=220704
FileSequentialNumber=13220
DaySequentialNumber=3

View File

@@ -1,4 +1,4 @@
#Tue Jun 21 04:04:33 CEST 2022
#Wed Jun 22 11:59:03 CEST 2022
spatialCalOffsetY=NaN
spatialCalOffsetX=NaN
dataPolling=500
@@ -11,7 +11,7 @@ spatialCalScaleY=NaN
colormapMax=150.0
rescaleOffset=0.0
roiWidth=-1
colormap=Temperature
colormap=Grayscale
pollingBackground=false
invert=false
colormapMin=0.0

View File

@@ -1,43 +0,0 @@
import ch.psi.pshell.plot.RangeSelectionPlot.RangeSelection as RangeSelection
REFERENCE_POSITION = {'X':1.2 ,'Y':0.0, 'Z':110.6, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
SAMPLE_POSITION = {'X':0.65 ,'Y':0.0, 'Z':115.0, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
def move_to_position(pdict):
ManipulatorX.move(pdict['X'])
ManipulatorY.move(pdict['Y'])
ManipulatorZ.move(pdict['Z'])
ManipulatorTheta.move(pdict['Theta'])
ManipulatorTilt.move(pdict['Tilt'])
ManipulatorPhi.move(pdict['Phi'])
#Au600
move_to_position(REFERENCE_POSITION)
rs = RangeSelection(347.0,354.0)
rs.setVars([1., 1., 1, 800.]) #Time, Size, Iteration, photon energy
set_exec_pars(name="Scan1")
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":100})
set_exec_pars(open=False)
set_exec_pars(name="Scan2")
#flush_data()
#In600
move_to_position(SAMPLE_POSITION)
#rs = RangeSelection(140.0,153.0)
rs = RangeSelection(347.0,354.0)
rs.setVars([1., 1., 1, 800.]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":100})
flush_data()

View File

@@ -1,343 +0,0 @@
"""
Line/vector/area/holo scan of multiple spectral regions
save this script into your script/user folder before editing!
usage:
1. uncomment one of the MOTORS lines.
add another line if necessary.
2. uncomment one of the scan blocks and adjust the parameters.
add another block if necessary.
3. declare the regions.
4. add the regions to the REGIONS list.
5. run the script.
"""
# dummy scan (time series)
MOTORS = [Eph]
# photon energy scan (do not include 'ephot' in regions in this case!)
#MOTORS = [Eph]
# phi scan
#MOTORS = [ManipulatorPhi]
# holo scan
#MOTORS = (ManipulatorPhi, ManipulatorTheta)
# 2D YZ scan
#MOTORS = [ManipulatorY, ManipulatorZ]
# line scan [start, stop, step]
#POSITIONS = [0., 10., 0.5]
#SCAN = 'lscan'
# vector scan [pos1, pos2, pos3, ...]
POSITIONS = [600., 900.]
SCAN = 'vscan'
# area scan [(start1, start2), (stop1, stop2), (step1, step2)]
# corresponding to (positioner1, positioner2)
#POSITIONS = [(-1., 114.), (+1., 116.), (20, 20)]
#ZIGZAG = True
#SCAN = 'ascan'
# holo scan
#PHI_RANGE = (-160.0, 160.0) # (tuple (min, max))
#THETA_RANGE = (-9.0, 81.0) # (tuple (min, max))
#STEPS = (40.0, 1.0) # (tuple (phi, theta))
#ZIGZAG = True
#POSITIONS = [(PHI_RANGE[0], THETA_RANGE[0]), (PHI_RANGE[1], THETA_RANGE[1]), STEPS]
#SCAN = 'ascan'
# seconds to wait between positioning command and triggering the detector
LATENCY = 0.0
# region setup
#
# for each region, define a python dictionary with the following items.
# optional items can be left unspecified and will default to the indicated values.
# for swept mode, include 'elo', 'ehi', 'estep', 'iter' values, but do not include 'efix'.
# for fixed mode, include 'efix' value, but do not include 'elo', 'ehi', 'estep', 'iter'.
#
# 'name': user-specific name of the region (for graph title and RegionName attribute in data file)
# 'elo': lower kinetic energy boundary of the spectrum
# 'ehi': upper kinetic energy boundary of the spectrum
# 'estep': energy step size
# 'efix': center kinetic energy in fixed mode
# 'epass': pass energy
# 'ephot': photon energy (default: unchanged)
# 'tstep': dwell time in seconds
# 'iter': number of iterations/sweeps (default 1)
# 'cis': True = constant initial state (photoemission line), False = constant final state (Auger peak), (default False)
# 'slit': exit slit (default: unchanged)
# First window should be set to first photon energy (see energies above)
REFERENCE_POSITION = {'X':1.2 ,'Y':0.0, 'Z':110.6, 'Theta':-9.1, 'Tilt':0.9, 'Phi':-90.0}
SAMPLE_POSITION = {'X':0.65 ,'Y':0.0, 'Z':115.0, 'Theta':-9.1, 'Tilt':0.9, 'Phi':-90.0}
REGION1 = {'name': 'AuFermi', 'ephot':600. , 'elo': 595., 'ehi':597.0, 'estep':0.1, 'epass': 20., 'tstep': 1., 'iter': 1, 'cis': False, 'position': 'reference'}
REGION2 = {'name': 'In3d','ephot':600., 'elo': 140., 'ehi':153.0, 'estep':0.1, 'epass': 20., 'tstep': 1., 'iter': 1, 'cis': False, 'position': 'sample'}
REGION3 = {'name': 'AuFermi', 'ephot':900. , 'elo': 895., 'ehi':897.0, 'estep':0.1, 'epass': 20., 'tstep': 1., 'iter': 1, 'cis': False, 'position': 'reference'}
REGION4 = {'name': 'Au4f', 'ephot':900. , 'elo': 895., 'ehi':897.0, 'estep':0.1, 'epass': 20., 'tstep': 1., 'iter': 1, 'cis': False, 'position': 'reference'}
REGION5 = {'name': 'In3d','ephot':900., 'elo': 440., 'ehi':453.0, 'estep':0.1, 'epass': 20., 'tstep': 1., 'iter': 1, 'cis': False, 'position': 'sample'}
# list of region dictionaries to execute at each scan position
REGIONS = [REGION1, REGION2, REGION3, REGION4]
# close beam shutter and turn off analyser at the end of the scan
CLOSE_SHUTTER_AT_END = True
def move_to_position(pdict):
ManipulatorX.move(pdict['X'])
ManipulatorY.move(pdict['Y'])
ManipulatorZ.move(pdict['Z'])
ManipulatorTheta.move(pdict['Theta'])
ManipulatorTilt.move(pdict['Tilt'])
ManipulatorPhi.move(pdict['Phi'])
# --- DO NOT EDIT BELOW THIS LINE! ---
set_exec_pars(keep=False)
def check_region(region):
"""
check region dictionary items and apply defaults where necessary
"""
region['fixed'] = 'efix' in region
if region['fixed']:
region['elo'] = region['efix']
region['ehi'] = region['efix']
if 'iter' not in region:
region['iter'] = 1
print("region {0}: setting default iter = {1}".format(region['name'], region['iter']))
if 'cis' not in region:
region['cis'] = False
print("region {0}: setting default cis = {1}".format(region['name'], region['cis']))
class SpectrumReader(ReadonlyRegisterBase, ReadonlyRegisterArray):
def initialize(self):
#super(SpectrumReader, self).initialize()
self.scan_index = -1
def create_datasets(self):
path = get_exec_pars().scanPath + self.region_name + "/"
if self.region['fixed']:
self.channel_center_dataset_name = path + "ScientaChannelCenter"
create_dataset(self.channel_center_dataset_name, 'd')
else:
self.channel_begin_dataset_name = path + "ScientaChannelBegin"
self.channel_end_dataset_name = path + "ScientaChannelEnd"
self.step_energy_dataset_name = path + "ScientaStepEnergy"
create_dataset(self.channel_begin_dataset_name, 'd')
create_dataset(self.channel_end_dataset_name, 'd')
create_dataset(self.step_energy_dataset_name, 'd')
if 'epass' in self.region:
self.pass_energy_dataset_name = path + "ScientaPassEnergy"
create_dataset(self.pass_energy_dataset_name, 'd')
if 'tstep' in self.region:
self.step_time_dataset_name = path + "ScientaStepTime"
create_dataset(self.step_time_dataset_name, 'd')
if 'iter' in self.region:
self.iterations_dataset_name = path + "ScientaIterations"
create_dataset(self.iterations_dataset_name, 'd')
if 'slit' in self.region:
self.slit_dataset_name = path + "ExitSlit"
create_dataset(self.slit_dataset_name, 'd')
if 'position' in self.region:
position_names = {key:path + "Position"+ key for key in ['X','Y','Z','Theta','Tilt','Phi']}
self.position_dataset_names = position_names
for datanames in self.position_dataset_names.values():
create_dataset(datanames, 'd')
def setup(self):
# print("spectrum.setup")
if self.scan_index != get_exec_pars().index:
self.scan_index = get_exec_pars().index
self.create_datasets()
if self.region_index == 0:
print "scan {0}".format(self.scan_index)
edelta = 0.0
try:
ephot = self.region['ephot']
Eph.move(ephot)
except KeyError:
ephot = Eph.take(100)
if isinstance(ephot, float) and ephot > 0.:
try:
if self.region['cis']:
edelta = ephot - self.ephot_start
except AttributeError:
self.ephot_start = ephot
elo = self.region['elo'] + edelta
ehi = self.region['ehi'] + edelta
if self.region['fixed']:
Scienta.setAcquisitionMode(ch.psi.pshell.epics.Scienta.AcquisitionMode.Fixed)
Scienta.centerEnergy.write(elo)
append_dataset(self.channel_center_dataset_name, elo)
else:
Scienta.setAcquisitionMode(ch.psi.pshell.epics.Scienta.AcquisitionMode.Swept)
Scienta.lowEnergy.write(elo)
Scienta.highEnergy.write(ehi)
Scienta.stepSize.write(self.region['estep'])
append_dataset(self.channel_begin_dataset_name, elo)
append_dataset(self.channel_end_dataset_name, ehi)
append_dataset(self.step_energy_dataset_name, self.region['estep'])
try:
Scienta.setPassEnergy(int(self.region['epass']))
append_dataset(self.pass_energy_dataset_name, self.region['epass'])
except KeyError:
pass
try:
Scienta.stepTime.write(self.region['tstep'])
append_dataset(self.step_time_dataset_name, self.region['tstep'])
except KeyError:
pass
try:
Scienta.setIterations(self.region['iter'])
append_dataset(self.iterations_dataset_name, self.region['iter'])
except KeyError:
pass
try:
ExitSlit.write(self.region['slit'])
append_dataset(self.slit_dataset_name, self.region['slit'])
except KeyError:
pass
if self.region['position'] == 'sample':
move_to_position(SAMPLE_POSITION)
for name in SAMPLE_POSITION.keys():
append_dataset(self.position_dataset_names[name], SAMPLE_POSITION[name])
elif self.region['position'] == 'reference':
move_to_position(REFERENCE_POSITION)
for name in REFERENCE_POSITION.keys():
append_dataset(self.position_dataset_names[name], SAMPLE_POSITION[name])
Scienta.update()
def read(self):
# print("spectrum.read")
global current_region_index
current_region_index = self.region_index
self.setup()
print("Acquiring region {0}.".format(self.region['name']))
trig_scienta()
time.sleep(0.5)
sp = Scienta.getSpectrum().read()
return sp
def getSize(self):
if self.region['fixed']:
nx = 992
else:
nx = int((self.region['ehi'] - self.region['elo']) / self.region['estep']) + 1
return nx
class ImageReader(ReadonlyRegisterBase, ReadonlyRegisterMatrix):
def read(self):
# print("image.read")
return Scienta.getDataMatrix().read()
def getWidth(self):
if self.region['fixed']:
nx = 992
else:
nx = int((self.region['ehi'] - self.region['elo']) / self.region['estep']) + 1
return nx
def getHeight(self):
ny = Scienta.slices.read()
return ny
def setup_live_plots(regions):
global live_plots
global current_region_index
names = [region['name'] for region in regions]
live_plots = plot(None, names, title="Live Spectra")
current_region_index = 0
def update_live_plots():
global live_plots
global current_region_index
try:
while get_context().state.running:
y = Scienta.spectrum.take(100)
x = Scienta.spectrumX
try:
series = live_plots[current_region_index].getSeries(0)
series.setData(x, y)
except IndexError:
pass
time.sleep(1.0)
finally:
print "Stopping live spectra"
def do_scan(scan, motors, positions, regions, latency):
global SENSORS
SENSORS = []
for (index, region) in enumerate(regions):
check_region(region)
reader = SpectrumReader()
reader.region_index = index
reader.region_name = "region{0}".format(index + 1)
reader.region = region
reader.initialize()
set_device_alias(reader, reader.region_name + "/ScientaSpectrum")
SENSORS.append(reader)
image = ImageReader()
image.region_index = index
image.region = region
image.initialize()
set_device_alias(image, reader.region_name + "/ScientaImage")
SENSORS.append(image)
SENSORS.append(SampleCurrent)
SENSORS.append(RefCurrent)
adjust_sensors()
set_adc_averaging()
if scan == 'ascan':
ascan(motors, SENSORS, positions[0], positions[1], positions[2], latency, False, zigzag = True, before_read=wait_beam, after_read = after_readout)
elif scan == 'lscan':
lscan(motors, SENSORS, positions[0], positions[1], positions[2], latency, False, before_read=wait_beam, after_read = after_readout)
elif scan == 'vscan':
vscan(motors, SENSORS, positions, True, latency,False, before_read=wait_beam, after_read = after_readout)
else:
print('unknown scan mode {}'.format(scan))
for (index, region) in enumerate(regions):
set_attribute(get_exec_pars().scanPath + "region{0}/ScientaSpectrum".format(index + 1), "RegionName", region['name'])
set_attribute(get_exec_pars().scanPath + "region{0}/ScientaImage".format(index + 1), "RegionName", region['name'])
set_attribute(get_exec_pars().scanPath, "Regions", [region['name'] for region in regions])
try:
setup_live_plots(REGIONS)
task = fork(update_live_plots)
do_scan(SCAN, MOTORS, POSITIONS, REGIONS, LATENCY)
finally:
if CLOSE_SHUTTER_AT_END:
after_scan()

View File

@@ -1,340 +0,0 @@
"""
Line/vector/area/holo scan of multiple spectral regions
save this script into your script/user folder before editing!
usage:
1. uncomment one of the MOTORS lines.
add another line if necessary.
2. uncomment one of the scan blocks and adjust the parameters.
add another block if necessary.
3. declare the regions.
4. add the regions to the REGIONS list.
5. run the script.
"""
# dummy scan (time series)
MOTORS = [dummy]
# photon energy scan (do not include 'ephot' in regions in this case!)
#MOTORS = [Eph]
# phi scan
#MOTORS = [ManipulatorPhi]
# holo scan
#MOTORS = (ManipulatorPhi, ManipulatorTheta)
# 2D YZ scan
#MOTORS = [ManipulatorY, ManipulatorZ]
# line scan [start, stop, step]
POSITIONS = [0.]
SCAN = 'vscan'
# vector scan [pos1, pos2, pos3, ...]
#POSITIONS = [600., 900.]
#SCAN = 'vscan'
# area scan [(start1, start2), (stop1, stop2), (step1, step2)]
# corresponding to (positioner1, positioner2)
#POSITIONS = [(-1., 114.), (+1., 116.), (20, 20)]
#ZIGZAG = True
#SCAN = 'ascan'
# holo scan
#PHI_RANGE = (-160.0, 160.0) # (tuple (min, max))
#THETA_RANGE = (-9.0, 81.0) # (tuple (min, max))
#STEPS = (40.0, 1.0) # (tuple (phi, theta))
#ZIGZAG = True
#POSITIONS = [(PHI_RANGE[0], THETA_RANGE[0]), (PHI_RANGE[1], THETA_RANGE[1]), STEPS]
#SCAN = 'ascan'
# seconds to wait between positioning command and triggering the detector
LATENCY = 0.0
# region setup
#
# for each region, define a python dictionary with the following items.
# optional items can be left unspecified and will default to the indicated values.
# for swept mode, include 'elo', 'ehi', 'estep', 'iter' values, but do not include 'efix'.
# for fixed mode, include 'efix' value, but do not include 'elo', 'ehi', 'estep', 'iter'.
#
# 'name': user-specific name of the region (for graph title and RegionName attribute in data file)
# 'elo': lower kinetic energy boundary of the spectrum
# 'ehi': upper kinetic energy boundary of the spectrum
# 'estep': energy step size
# 'efix': center kinetic energy in fixed mode
# 'epass': pass energy
# 'ephot': photon energy (default: unchanged)
# 'tstep': dwell time in seconds
# 'iter': number of iterations/sweeps (default 1)
# 'cis': True = constant initial state (photoemission line), False = constant final state (Auger peak), (default False)
# 'slit': exit slit (default: unchanged)
# First window should be set to first photon energy (see energies above)
REFERENCE_POSITION = {'X':3.01 ,'Y':0, 'Z':118, 'Theta':-6.2, 'Tilt':0, 'Phi':0}
SAMPLE_POSITION = {'X':3.01 ,'Y':0, 'Z':118, 'Theta':-6.2, 'Tilt':0, 'Phi':0}
REGION1 = {'name': 'AuFermi', 'ephot':144. , 'elo': 138.5, 'ehi':140, 'estep':0.01, 'epass': 10., 'tstep': 1., 'iter': 1, 'cis': False, 'position': 'reference'}
REGION2 = {'name': 'VB','ephot':144., 'elo': 138.4, 'ehi':139.8, 'estep':0.01, 'epass': 10., 'tstep': 4., 'iter': 1, 'cis': False, 'position': 'sample'}
REGION3 = {'name': 'As3d','ephot':144., 'elo': 96., 'ehi':101.0, 'estep':0.03, 'epass': 10., 'tstep': 1., 'iter': 1, 'cis': False, 'position': 'sample'}
# list of region dictionaries to execute at each scan position
REGIONS = [REGION1, REGION2]#, REGION3, REGION4, REGION5]
# close beam shutter and turn off analyser at the end of the scan
CLOSE_SHUTTER_AT_END = False
def move_to_position(pdict):
ManipulatorX.move(pdict['X'])
ManipulatorY.move(pdict['Y'])
ManipulatorZ.move(pdict['Z'])
ManipulatorTheta.move(pdict['Theta'])
ManipulatorTilt.move(pdict['Tilt'])
ManipulatorPhi.move(pdict['Phi'])
# --- DO NOT EDIT BELOW THIS LINE! ---
set_exec_pars(keep=False)
def check_region(region):
"""
check region dictionary items and apply defaults where necessary
"""
region['fixed'] = 'efix' in region
if region['fixed']:
region['elo'] = region['efix']
region['ehi'] = region['efix']
if 'iter' not in region:
region['iter'] = 1
print("region {0}: setting default iter = {1}".format(region['name'], region['iter']))
if 'cis' not in region:
region['cis'] = False
print("region {0}: setting default cis = {1}".format(region['name'], region['cis']))
class SpectrumReader(ReadonlyRegisterBase, ReadonlyRegisterArray):
def initialize(self):
#super(SpectrumReader, self).initialize()
self.scan_index = -1
def create_datasets(self):
path = get_exec_pars().scanPath + self.region_name + "/"
if self.region['fixed']:
self.channel_center_dataset_name = path + "ScientaChannelCenter"
create_dataset(self.channel_center_dataset_name, 'd')
else:
self.channel_begin_dataset_name = path + "ScientaChannelBegin"
self.channel_end_dataset_name = path + "ScientaChannelEnd"
self.step_energy_dataset_name = path + "ScientaStepEnergy"
create_dataset(self.channel_begin_dataset_name, 'd')
create_dataset(self.channel_end_dataset_name, 'd')
create_dataset(self.step_energy_dataset_name, 'd')
if 'epass' in self.region:
self.pass_energy_dataset_name = path + "ScientaPassEnergy"
create_dataset(self.pass_energy_dataset_name, 'd')
if 'tstep' in self.region:
self.step_time_dataset_name = path + "ScientaStepTime"
create_dataset(self.step_time_dataset_name, 'd')
if 'iter' in self.region:
self.iterations_dataset_name = path + "ScientaIterations"
create_dataset(self.iterations_dataset_name, 'd')
if 'slit' in self.region:
self.slit_dataset_name = path + "ExitSlit"
create_dataset(self.slit_dataset_name, 'd')
if 'position' in self.region:
position_names = {key:path + "Position"+ key for key in ['X','Y','Z','Theta','Tilt','Phi']}
self.position_dataset_names = position_names
for datanames in self.position_dataset_names.values():
create_dataset(datanames, 'd')
def setup(self):
# print("spectrum.setup")
if self.scan_index != get_exec_pars().index:
self.scan_index = get_exec_pars().index
self.create_datasets()
if self.region_index == 0:
print "scan {0}".format(self.scan_index)
edelta = 0.0
try:
ephot = self.region['ephot']
Eph.move(ephot)
except KeyError:
ephot = Eph.take(100)
if isinstance(ephot, float) and ephot > 0.:
try:
if self.region['cis']:
edelta = ephot - self.ephot_start
except AttributeError:
self.ephot_start = ephot
elo = self.region['elo'] + edelta
ehi = self.region['ehi'] + edelta
if self.region['fixed']:
Scienta.setAcquisitionMode(ch.psi.pshell.epics.Scienta.AcquisitionMode.Fixed)
Scienta.centerEnergy.write(elo)
append_dataset(self.channel_center_dataset_name, elo)
else:
Scienta.setAcquisitionMode(ch.psi.pshell.epics.Scienta.AcquisitionMode.Swept)
Scienta.lowEnergy.write(elo)
Scienta.highEnergy.write(ehi)
Scienta.stepSize.write(self.region['estep'])
append_dataset(self.channel_begin_dataset_name, elo)
append_dataset(self.channel_end_dataset_name, ehi)
append_dataset(self.step_energy_dataset_name, self.region['estep'])
try:
Scienta.setPassEnergy(int(self.region['epass']))
append_dataset(self.pass_energy_dataset_name, self.region['epass'])
except KeyError:
pass
try:
Scienta.stepTime.write(self.region['tstep'])
append_dataset(self.step_time_dataset_name, self.region['tstep'])
except KeyError:
pass
try:
Scienta.setIterations(self.region['iter'])
append_dataset(self.iterations_dataset_name, self.region['iter'])
except KeyError:
pass
try:
ExitSlit.write(self.region['slit'])
append_dataset(self.slit_dataset_name, self.region['slit'])
except KeyError:
pass
if self.region['position'] == 'sample':
move_to_position(SAMPLE_POSITION)
for name in SAMPLE_POSITION.keys():
append_dataset(self.position_dataset_names[name], SAMPLE_POSITION[name])
elif self.region['position'] == 'reference':
move_to_position(REFERENCE_POSITION)
for name in REFERENCE_POSITION.keys():
append_dataset(self.position_dataset_names[name], SAMPLE_POSITION[name])
Scienta.update()
def read(self):
# print("spectrum.read")
global current_region_index
current_region_index = self.region_index
self.setup()
print("Acquiring region {0}.".format(self.region['name']))
trig_scienta()
time.sleep(0.5)
sp = Scienta.getSpectrum().read()
return sp
def getSize(self):
if self.region['fixed']:
nx = 992
else:
nx = int((self.region['ehi'] - self.region['elo']) / self.region['estep']) + 1
return nx
class ImageReader(ReadonlyRegisterBase, ReadonlyRegisterMatrix):
def read(self):
# print("image.read")
return Scienta.getDataMatrix().read()
def getWidth(self):
if self.region['fixed']:
nx = 992
else:
nx = int((self.region['ehi'] - self.region['elo']) / self.region['estep']) + 1
return nx
def getHeight(self):
ny = Scienta.slices.read()
return ny
def setup_live_plots(regions):
global live_plots
global current_region_index
names = [region['name'] for region in regions]
live_plots = plot(None, names, title="Live Spectra")
current_region_index = 0
def update_live_plots():
global live_plots
global current_region_index
try:
while get_context().state.running:
y = Scienta.spectrum.take(100)
x = Scienta.spectrumX
try:
series = live_plots[current_region_index].getSeries(0)
series.setData(x, y)
except IndexError:
pass
time.sleep(1.0)
finally:
print "Stopping live spectra"
def do_scan(scan, motors, positions, regions, latency):
global SENSORS
SENSORS = []
for (index, region) in enumerate(regions):
check_region(region)
reader = SpectrumReader()
reader.region_index = index
reader.region_name = "region{0}".format(index + 1)
reader.region = region
reader.initialize()
set_device_alias(reader, reader.region_name + "/ScientaSpectrum")
SENSORS.append(reader)
image = ImageReader()
image.region_index = index
image.region = region
image.initialize()
set_device_alias(image, reader.region_name + "/ScientaImage")
SENSORS.append(image)
SENSORS.append(SampleCurrent)
SENSORS.append(RefCurrent)
adjust_sensors()
set_adc_averaging()
if scan == 'ascan':
ascan(motors, SENSORS, positions[0], positions[1], positions[2], latency, False, zigzag = True, before_read=wait_beam, after_read = after_readout)
elif scan == 'lscan':
lscan(motors, SENSORS, positions[0], positions[1], positions[2], latency, False, before_read=wait_beam, after_read = after_readout)
elif scan == 'vscan':
vscan(motors, SENSORS, positions, True, latency,False, before_read=wait_beam, after_read = after_readout)
else:
print('unknown scan mode {}'.format(scan))
for (index, region) in enumerate(regions):
set_attribute(get_exec_pars().scanPath + "region{0}/ScientaSpectrum".format(index + 1), "RegionName", region['name'])
set_attribute(get_exec_pars().scanPath + "region{0}/ScientaImage".format(index + 1), "RegionName", region['name'])
set_attribute(get_exec_pars().scanPath, "Regions", [region['name'] for region in regions])
try:
setup_live_plots(REGIONS)
task = fork(update_live_plots)
do_scan(SCAN, MOTORS, POSITIONS, REGIONS, LATENCY)
finally:
if CLOSE_SHUTTER_AT_END:
after_scan()

View File

@@ -1,316 +0,0 @@
"""
Discrete scan (vector scan) of multiple spectral regions
"""
# scan positioner: Eph = photon energy
#MOTORS = (ManipulatorPhi, ManipulatorTheta)
#MOTORS = [ManipulatorPhi]
MOTORS = [dummy]
# comma-separated discrete list of scan positions
#POSITIONS = [(PHI_RA
#POSITIONS = [(PNGE[0], THETA_RANGE[0]), (PHI_RANGE[1], THETA_RANGE[1]), STEPS]
#POSITIONS = [-175., 180., 5.]
# seconds to wait between positioning command and triggering the detector
LATENCY = 0.0
# region setup
#
# for each region, define a python dictionary with the following items.
# optional items can be left unspecified and will default to the indicated values.
# for swept mode, include 'elo', 'ehi', 'estep', 'iter' values, but do not include 'efix'.
# for fixed mode, include 'efix' value, but do not include 'elo', 'ehi', 'estep', 'iter'.
#
# 'name': user-specific name of the region (for graph title and RegionName attribute in data file)
# 'elo': lower kinetic energy boundary of the spectrum
# 'ehi': upper kinetic energy boundary of the spectrum
# 'estep': energy step size
# 'efix': center kinetic energy in fixed mode
# 'epass': pass energy
# 'tstep': dwell time in seconds
# 'iter': number of iterations/sweeps (default 1)
# 'cis': True = constant initial state (photoemission line), False = constant final state (Auger peak), (default False)
# 'slit': exit slit (default current value)
#REGION1 = {'name': 'VB62eV', 'ephot': 62, 'efix': 1222.1, 'epass': 200., 'tstep': 20., 'iter': 1, 'cis': False}
#REGION2 = {'name': 'off-resonance', 'ephot': 1235.0, 'efix': 1219.4, 'epass': 200., 'tstep': 20., 'iter': 1, 'cis': False}
#REGION1 = {'name': 'VB62eV', 'ephot': 62, 'elo': 49.0, 'ehi': 58.0, 'estep': 0.002, 'epass': 10, 'tstep': 0.5, 'iter': 1, 'cis': False}
#REGION1 = {'name': 'VB62eVzoom', 'elo': 54.0, 'ehi': 58.0, 'estep': 0.002, 'epass': 10.0, 'tstep': 0.5, 'iter': 1, 'cis': True}
# close beam shutter and turn off analyser at the end of the scan
CLOSE_SHUTTER_AT_END = False
# --- DO NOT EDIT BELOW THIS LINE! ---
set_exec_pars(keep=False)
def check_region(region):
"""
check region dictionary items and apply defaults where necessary
"""
region['fixed'] = 'efix' in region
if region['fixed']:
region['elo'] = region['efix']
region['ehi'] = region['efix']
if 'iter' not in region:
region['iter'] = 1
print("region {0}: setting default iter = {1}".format(region['name'], region['iter']))
if 'cis' not in region:
region['cis'] = False
print("region {0}: setting default cis = {1}".format(region['name'], region['cis']))
if 'slit' not in region:
region['slit'] = ExitSlit.read()
print("region {0}: setting default slit = {1}".format(region['name'], region['slit']))
class SpectrumReader(ReadonlyRegisterBase, ReadonlyRegisterArray):
def initialize(self):
#super(SpectrumReader, self).initialize()
self.scan_index = -1
def create_datasets(self):
path = get_exec_pars().scanPath + self.region_name + "/"
self.channel_begin_dataset_name = path + "ScientaChannelBegin"
self.channel_end_dataset_name = path + "ScientaChannelEnd"
self.channel_center_dataset_name = path + "ScientaChannelCenter"
self.pass_energy_dataset_name = path + "ScientaPassEnergy"
self.step_energy_dataset_name = path + "ScientaStepEnergy"
self.step_time_dataset_name = path + "ScientaStepTime"
self.iterations_dataset_name = path + "ScientaIterations"
self.slit_dataset_name = path + "ExitSlit"
create_dataset(self.channel_begin_dataset_name, 'd')
create_dataset(self.channel_end_dataset_name, 'd')
create_dataset(self.channel_center_dataset_name, 'd')
create_dataset(self.pass_energy_dataset_name, 'd')
create_dataset(self.step_energy_dataset_name, 'd')
create_dataset(self.step_time_dataset_name, 'd')
create_dataset(self.iterations_dataset_name, 'd')
create_dataset(self.slit_dataset_name, 'd')
def setup(self):
if self.scan_index != get_exec_pars().index:
self.scan_index = get_exec_pars().index
self.create_datasets()
if self.region_index == 0:
print "scan {0}".format(self.scan_index)
#ephot = Eph.read()
#try:
# if self.region['cis']:
# edelta = ephot - self.ephot_start
# else:
# edelta = 0.0
#except AttributeError:
# self.ephot_start = ephot
edelta = 0.0
elo = self.region['elo'] + edelta
ehi = self.region['ehi'] + edelta
try:
Eph.write(self.region['ephot'])
except KeyError:
pass
if self.region['fixed']:
Scienta.setAcquisitionMode(ch.psi.pshell.epics.Scienta.AcquisitionMode.Fixed)
Scienta.centerEnergy.write(elo)
else:
Scienta.setAcquisitionMode(ch.psi.pshell.epics.Scienta.AcquisitionMode.Swept)
Scienta.lowEnergy.write(elo)
Scienta.highEnergy.write(ehi)
Scienta.stepSize.write(self.region['estep'])
Scienta.setPassEnergy(int(self.region['epass']))
Scienta.stepTime.write(self.region['tstep'])
Scienta.setIterations(self.region['iter'])
ExitSlit.write(self.region['slit'])
Scienta.update()
if self.region['fixed']:
append_dataset(self.channel_center_dataset_name, elo)
else:
append_dataset(self.channel_begin_dataset_name, elo)
append_dataset(self.channel_end_dataset_name, ehi)
append_dataset(self.step_energy_dataset_name, self.region['estep'])
append_dataset(self.pass_energy_dataset_name, self.region['epass'])
append_dataset(self.step_time_dataset_name, self.region['tstep'])
append_dataset(self.iterations_dataset_name, self.region['iter'])
append_dataset(self.slit_dataset_name, self.region['slit'])
def read(self):
global current_region_index
current_region_index = self.region_index
self.setup()
print("Acquiring region {0}.".format(self.region['name']))
trig_scienta()
time.sleep(0.5)
sp = Scienta.getSpectrum().read()
return sp
def getSize(self):
if self.region['fixed']:
nx = 992
else:
nx = int((self.region['ehi'] - self.region['elo']) / self.region['estep']) + 1
return nx
class ImageReader(ReadonlyRegisterBase, ReadonlyRegisterMatrix):
def read(self):
return Scienta.getDataMatrix().read()
def getWidth(self):
if self.region['fixed']:
nx = 992
else:
nx = int((self.region['ehi'] - self.region['elo']) / self.region['estep']) + 1
return nx
def getHeight(self):
ny = Scienta.slices.read()
return ny
def setup_live_plots(regions):
global live_plots
global current_region_index
names = [region['name'] for region in regions]
live_plots = plot(None, names, title="Live Spectra")
current_region_index = 0
def update_live_plots():
global live_plots
global current_region_index
try:
while get_context().state.running:
y = Scienta.spectrum.take(100)
x = Scienta.spectrumX
try:
series = live_plots[current_region_index].getSeries(0)
series.setData(x, y)
except IndexError:
pass
time.sleep(1.0)
finally:
print "Stopping live spectra"
def do_scan(motors, positions, regions, latency):
global SENSORS
SENSORS = []
for (index, region) in enumerate(regions):
check_region(region)
reader = SpectrumReader()
reader.region_index = index
reader.region_name = "region{0}".format(index + 1)
reader.region = region
reader.initialize()
set_device_alias(reader, reader.region_name + "/ScientaSpectrum")
SENSORS.append(reader)
image = ImageReader()
image.region_index = index
image.region = region
image.initialize()
set_device_alias(image, reader.region_name + "/ScientaImage")
SENSORS.append(image)
SENSORS.append(SampleCurrent)
SENSORS.append(RefCurrent)
adjust_sensors()
set_adc_averaging()
#ascan(motors, SENSORS, positions[0], positions[1], positions[2], latency, False, zigzag = True, before_read=wait_beam, after_read = after_readout)
#lscan(motors, SENSORS, positions[0], positions[1], positions[2], latency, False, before_read=wait_beam, after_read = after_readout)
vscan(motors, SENSORS, positions, True, latency,False, before_read=wait_beam, after_read = after_readout)
for (index, region) in enumerate(regions):
set_attribute(get_exec_pars().scanPath + "region{0}/ScientaSpectrum".format(index + 1), "RegionName", region['name'])
set_attribute(get_exec_pars().scanPath + "region{0}/ScientaImage".format(index + 1), "RegionName", region['name'])
set_attribute(get_exec_pars().scanPath, "Regions", [region['name'] for region in regions])
class PhysicalLocation():
def __init__(self, X, Y, Z, theta, tilt, phi):
self.X = X
self.Y = Y
self.Z = Z
self.theta = theta
self.tilt = tilt
self.phi = phi
def move_to_location(self):
ManipulatorX.move(self.X)
ManipulatorY.move(self.Y)
ManipulatorZ.move(self.Z)
ManipulatorTheta.move(self.theta)
ManipulatorTilt.move(self.tilt)
ManipulatorPhi.move(self.phi)
#VARS
sample = PhysicalLocation(-4.1,-0.5,115.1,-8.8,0.7,-90.0)
goldReference = PhysicalLocation(-3.4,4.4,111.6,-8.8,0.7,90.0)
dosing = PhysicalLocation(-4.1,-0.5,115.1,51.0,0.7,-90.0)
sample.move_to_location()
energies = [300,400,500]
for e in energies:
try:
Eph.move(e)
goldReference.move_to_location()
goldRegions = goldRegion(e, "fixed")
do_scan(MOTORS, POSITIONS, goldRegions, LATENCY)
sample.move_to_location()
sampleRegions =
do_scan(MOTORS, POSITIONS, sampleRegions, LATENCY)
def goldRegion(energy, scan_type):
if scan_type == "fixed":
return [{'name': 'Au', 'ephot': 1237.7, 'efix': 1222.1, 'epass': 50., 'tstep': 5., 'iter': 1, 'cis': False}]
elif scan_type == "swept":
return [{'name': 'Au', 'elo': 54.0, 'ehi': 58.0, 'estep': 0.002, 'epass': 10.0, 'tstep': 0.5, 'iter': 1, 'cis': False}]
def sampleRegion(energy, scan_type):
epass = 10.0
tstep = 0.5
estep = 0.002
if scan_type == "In4d":
e1 = energy - 4.5 - 18
e2 = energy - 4.5 - 17
return [{'name': scan_type, 'elo': 54.0, 'ehi': 58.0, 'estep': estep, 'epass': epass, 'tstep': tstep, 'iter': 1, 'cis': False}]
elif scan_type == "Sb4d":
e1 = energy - 4.5 - 33
e2 = energy - 4.5 - 32
elif scan_type == "In3d":
e1 = energy - 4.5 - 451
e2 = energy - 4.5 - 444
return [{'name': scan_type, 'elo': 54.0, 'ehi': 58.0, 'estep': estep, 'epass': epass, 'tstep': tstep, 'iter': 1, 'cis': False}]
goldReference.move_to_location()
thisregion =
sample.move_to_location()
thisregion = {'name': 'In3d', 'ephot': 1237.7, 'efix': 1222.1, 'epass': 50., 'tstep': 5., 'iter': 1, 'cis': False}

View File

@@ -1,88 +0,0 @@
import ch.psi.pshell.plot.RangeSelectionPlot.RangeSelection as RangeSelection
REFERENCE_POSITION = {'X':1.4 ,'Y':0.0, 'Z':110.6, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
SAMPLE_POSITION = {'X':1.4 ,'Y':0.6, 'Z':116.5, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
def move_to_position(pdict):
ManipulatorX.move(pdict['X'])
ManipulatorY.move(pdict['Y'])
ManipulatorZ.move(pdict['Z'])
ManipulatorTheta.move(pdict['Theta'])
ManipulatorTilt.move(pdict['Tilt'])
ManipulatorPhi.move(pdict['Phi'])
binding_center_Au_Ef=0.;
window_Au_Ef=4.;
time_Au_Ef = 15.
binding_center_Au_4f=86.;
window_Au_4f=15.;
time_Au_4f = 2.
binding_center_As_3d=43.;
window_As_3d=15.;
time_As_3d=50.
energies = [1450,950,450]
exit_slit_dict = {1450:50, 950:25, 450:25}
pass_energy_dict = {1450:50, 950:20, 450:20}
for e in energies:
photon_energy = float(e)
ExitSlit.write(exit_slit_dict[e])
#####################################################
#Au-fermi
set_exec_pars(name="Au-Fermi-"+str(e)+"eV")
move_to_position(REFERENCE_POSITION)
center_Au = photon_energy - 4.5 - binding_center_Au_Ef
rs = RangeSelection(center_Au-window_Au_Ef/2.,center_Au+window_Au_Ef/2.)
rs.setVars([time_Au_Ef, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":pass_energy_dict[e]})
set_exec_pars(open=False)
#####################################################
#Au-4f
set_exec_pars(name="Au-4f-"+str(e)+"eV")
center_Au_4f = photon_energy - 4.5 - binding_center_Au_4f
rs = RangeSelection(center_Au_4f-window_Au_4f/2.,center_Au_4f+window_Au_4f/2.)
rs.setVars([time_Au_4f, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":pass_energy_dict[e]})
set_exec_pars(open=False)
#####################################################
#As
set_exec_pars(name="As-3d-"+str(e)+"eV")
move_to_position(SAMPLE_POSITION)
center_As_3d = photon_energy - 4.5 - binding_center_As_3d
rs = RangeSelection(center_As_3d-window_As_3d/2.,center_As_3d+window_As_3d/2.)
rs.setVars([time_As_3d, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":pass_energy_dict[e]})
set_exec_pars(open=False)

View File

@@ -1,84 +0,0 @@
import ch.psi.pshell.plot.RangeSelectionPlot.RangeSelection as RangeSelection
REFERENCE_POSITION = {'X':1.4 ,'Y':0.0, 'Z':110.6, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
SAMPLE_POSITION = {'X':1.4 ,'Y':0.6, 'Z':116.5, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
def move_to_position(pdict):
ManipulatorX.move(pdict['X'])
ManipulatorY.move(pdict['Y'])
ManipulatorZ.move(pdict['Z'])
ManipulatorTheta.move(pdict['Theta'])
ManipulatorTilt.move(pdict['Tilt'])
ManipulatorPhi.move(pdict['Phi'])
binding_center_Au_Ef=0.;
window_Au_Ef=4.;
time_Au_Ef = 0.01
binding_center_Au_4f=86.;
window_Au_4f=15.;
time_Au_4f = 0.01
binding_center_As_3d=43.;
window_As_3d=15.;
time_As_3d=0.01
energies = [1450,950,450]
for e in energies:
photon_energy = float(e)
#####################################################
#Au-fermi
set_exec_pars(name="Au-Fermi-"+str(e)+"eV")
move_to_position(REFERENCE_POSITION)
center_Au = photon_energy - 4.5 - binding_center_Au_Ef
rs = RangeSelection(center_Au-window_Au_Ef/2.,center_Au+window_Au_Ef/2.)
rs.setVars([time_Au_Ef, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":50})
set_exec_pars(open=False)
#####################################################
#Au-4f
set_exec_pars(name="Au-4f-"+str(e)+"eV")
center_Au_4f = photon_energy - 4.5 - binding_center_Au_4f
rs = RangeSelection(center_Au_4f-window_Au_4f/2.,center_Au_4f+window_Au_4f/2.)
rs.setVars([time_Au_4f, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":50})
set_exec_pars(open=False)
#####################################################
#As
set_exec_pars(name="As-3d-"+str(e)+"eV")
move_to_position(SAMPLE_POSITION)
center_As_3d = photon_energy - 4.5 - binding_center_As_3d
rs = RangeSelection(center_As_3d-window_As_3d/2.,center_As_3d+window_As_3d/2.)
rs.setVars([time_As_3d, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":50})
set_exec_pars(open=False)

View File

@@ -1,88 +0,0 @@
import ch.psi.pshell.plot.RangeSelectionPlot.RangeSelection as RangeSelection
REFERENCE_POSITION = {'X':1.4 ,'Y':0.0, 'Z':110.6, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
SAMPLE_POSITION = {'X':1.4 ,'Y':0.6, 'Z':116.5, 'Theta':-9.1, 'Tilt':0.8, 'Phi':-90.0}
def move_to_position(pdict):
ManipulatorX.move(pdict['X'])
ManipulatorY.move(pdict['Y'])
ManipulatorZ.move(pdict['Z'])
ManipulatorTheta.move(pdict['Theta'])
ManipulatorTilt.move(pdict['Tilt'])
ManipulatorPhi.move(pdict['Phi'])
binding_center_Au_Ef=0.;
window_Au_Ef=4.;
time_Au_Ef = 15.
binding_center_Au_4f=86.;
window_Au_4f=15.;
time_Au_4f = 2.
binding_center_As_3d=43.;
window_As_3d=15.;
time_As_3d=50.
energies = [1450,950,450]
exit_slit_dict = {1450:50, 950:25, 450:25}
pass_energy_dict = {1450:50, 950:20, 450:20}
for e in energies:
photon_energy = float(e)
ExitSlit.write(exit_slit_dict[e])
#####################################################
#Au-fermi
set_exec_pars(name="Au-Fermi-"+str(e)+"eV")
move_to_position(REFERENCE_POSITION)
center_Au = photon_energy - 4.5 - binding_center_Au_Ef
rs = RangeSelection(center_Au-window_Au_Ef/2.,center_Au+window_Au_Ef/2.)
rs.setVars([time_Au_Ef, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":pass_energy_dict[e]})
set_exec_pars(open=False)
#####################################################
#Au-4f
set_exec_pars(name="Au-4f-"+str(e)+"eV")
center_Au_4f = photon_energy - 4.5 - binding_center_Au_4f
rs = RangeSelection(center_Au_4f-window_Au_4f/2.,center_Au_4f+window_Au_4f/2.)
rs.setVars([time_Au_4f, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":pass_energy_dict[e]})
set_exec_pars(open=False)
#####################################################
#As
set_exec_pars(name="As-3d-"+str(e)+"eV")
move_to_position(SAMPLE_POSITION)
center_As_3d = photon_energy - 4.5 - binding_center_As_3d
rs = RangeSelection(center_As_3d-window_As_3d/2.,center_As_3d+window_As_3d/2.)
rs.setVars([time_As_3d, 0.05, 1, photon_energy]) #Time, Size, Iteration, photon energy
run("XPSSpectrum", {"save_scienta_image":True,
"ranges":[rs, ],
"ENDSCAN":False,
"pass_energy":pass_energy_dict[e]})
set_exec_pars(open=False)