From 1e6ace6f1f58112b93479cb264def9917a10dfd4 Mon Sep 17 00:00:00 2001 From: gac-x03da Date: Sun, 24 Mar 2019 03:01:35 +0100 Subject: [PATCH] Script execution --- script/users/TUM_multi_XPS_2019.py | 213 +++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 script/users/TUM_multi_XPS_2019.py diff --git a/script/users/TUM_multi_XPS_2019.py b/script/users/TUM_multi_XPS_2019.py new file mode 100644 index 00000000..4716b8aa --- /dev/null +++ b/script/users/TUM_multi_XPS_2019.py @@ -0,0 +1,213 @@ +""" +Arguments: + +""" +LATENCY = 0.0 +MOTORS = [Eph] + +#workfunction = 4.3eV +#262eV : KE = 70eV for B 1s +#200eV : KE = 70eV for Ge 3p + +#POSITIONS_dummy = [300] +#REGION_dummy = {'name': 'dummy', 'elo': 398., 'ehi': 405., 'estep': 1, 'epass': 10, 'tstep': 0.5, 'iter': 1, 'cis': True} +#REGIONS_dummy = [REGION_dummy] + +POSITIONS_1 = [70] +REGION_1 = {'name': 'VB', 'elo': 121., 'ehi': 133., 'estep': 1, 'epass': 10, 'tstep': 0.5, 'iter': 1, 'cis': True} +REGIONS_1 = [REGION_1] + +POSITIONS_2 = [69] +REGION_2 = {'name': 'VB', 'elo': 55., 'ehi': 68., 'estep': 1, 'epass': 10, 'tstep': 0.5, 'iter': 1, 'cis': True} +REGIONS_2 = [REGION_2] + + + +CLOSE_SHUTTER_AT_END = True + +Scienta.setAcquisitionMode(ch.psi.pshell.epics.Scienta.AcquisitionMode.Swept) + +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.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" + + create_dataset(self.channel_begin_dataset_name, 'd') + create_dataset(self.channel_end_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') + + 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}: Polar = {pol}, Azimuth = {azm}, x = {X}, y = {Y}, z = {Z}".format(self.scan_index,pol=self.sample_pos[0],azm=self.sample_pos[1],X=self.sample_pos[2],Y=self.sample_pos[3],Z=self.sample_pos[4]) + + 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 + + Scienta.lowEnergy.write(elo) + Scienta.highEnergy.write(ehi) + Scienta.stepSize.write(self.region['estep']) + Scienta.setPassEnergy(self.region['epass']) + Scienta.stepTime.write(self.region['tstep']) + Scienta.setIterations(self.region['iter']) + Scienta.update() + + append_dataset(self.channel_begin_dataset_name, elo) + append_dataset(self.channel_end_dataset_name, ehi) + append_dataset(self.pass_energy_dataset_name, self.region['epass']) + append_dataset(self.step_energy_dataset_name, self.region['estep']) + append_dataset(self.step_time_dataset_name, self.region['tstep']) + append_dataset(self.iterations_dataset_name, self.region['iter']) + + def read(self): + global current_region_index + current_region_index = self.region_index + self.setup() + print "Photon energy {ephot} eV. Acquiring spectrum {elo}-{ehi} eV.".format(ephot=Eph.read(), elo=Scienta.lowEnergy.value, ehi=Scienta.highEnergy.value) + trig_scienta() + time.sleep(0.5) + sp = Scienta.getSpectrum().read() + return sp + + def getSize(self): + 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): + 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, sample_position): + global SENSORS + + SENSORS = [] + + for (index, region) in enumerate(regions): + reader = SpectrumReader() + reader.sample_pos = sample_position + 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() + + 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]) + + #set_attribute(get_exec_pars().scanPath + + "region{0}/Polar".format(index + 1), "Polar", polar) + #set_attribute(get_exec_pars().scanPath + + "region{0}/Azimuth".format(index + 1), "Azimuth", azimuth) + +try: + setup_live_plots(REGIONS_B) + task = fork(update_live_plots) + # theta (polar), phi (azimuth), x, y, z + sample_pos = [[-9.1,-90.0,-0.6, -0.5, 114.8], + [-9.1,-90.0,-0.6, -0.5, 114.8], + [-9.1,-90.0,-0.6, -0.5, 114.8], + [-9.1,-90.0,-0.6, -0.5, 114.8]] + + for (index, nn) in enumerate(sample_pos): + polar = nn[0] + azimuth = nn[1] + ManipulatorX.move(nn[2]) + ManipulatorY.move(nn[3]) + ManipulatorZ.move(nn[4]) + ManipulatorTheta.move(polar) + #ManipulatorPhi.move(nn[1]) + + if index == 0: + #do_scan(MOTORS, POSITIONS_QUICK, REGIONS_QUICK, LATENCY, nn) + do_scan(MOTORS, POSITIONS_1, REGIONS_1, LATENCY, nn) + do_scan(MOTORS, POSITIONS_2, REGIONS_2, LATENCY, nn) + + #elif index == 1: + #do_scan(MOTORS, POSITIONS_QUICK, REGIONS_QUICK, LATENCY, nn) + #do_scan(MOTORS, POSITIONS_dummy, REGIONS_dummy, LATENCY, nn) + #do_scan(MOTORS, POSITIONS_3, REGIONS_3, LATENCY, nn) + + #elif index == 2: + #do_scan(MOTORS, POSITIONS_4, REGIONS_4, LATENCY, nn) + #do_scan(MOTORS, POSITIONS_5, REGIONS_5, LATENCY, nn) + #elif index == 3: + #do_scan(MOTORS, POSITIONS_6, REGIONS_6, LATENCY, nn) + #do_scan(MOTORS, POSITIONS_7, REGIONS_7, LATENCY, nn) + #do_scan(MOTORS, POSITIONS_dummy2, REGIONS_dummy2, LATENCY, nn) + #do_scan(MOTORS, POSITIONS_8, REGIONS_8, LATENCY, nn) + +finally: + if CLOSE_SHUTTER_AT_END: + after_scan()