From 493f67fbcae204ce56cff0d76b6799e0eadf2b2e Mon Sep 17 00:00:00 2001 From: Alexandre Gobbo Date: Wed, 18 Apr 2018 09:34:08 +0200 Subject: [PATCH] --- config/devices.properties | 2 + devices/hkl_group.properties | 4 +- plugins/MXSC-1.9.0.jar | Bin 53377 -> 53933 bytes script/diffcalc/diffutils.py | 99 +++++++++++++------ script/diffcalc/testfivec.py | 86 ++++++++++++++++ script/diffcalc/testfourc.py | 84 ++++++++++++++++ script/diffcalc/{difftest.py => testsixc.py} | 2 +- script/test/ExampleContinuousMultipass.py | 21 ++-- 8 files changed, 255 insertions(+), 43 deletions(-) create mode 100644 script/diffcalc/testfivec.py create mode 100644 script/diffcalc/testfourc.py rename script/diffcalc/{difftest.py => testsixc.py} (99%) diff --git a/config/devices.properties b/config/devices.properties index 35117ce..c06ce8f 100755 --- a/config/devices.properties +++ b/config/devices.properties @@ -106,4 +106,6 @@ eta=ch.psi.pshell.device.DummyMotor||||true chi=ch.psi.pshell.device.DummyMotor||||true phi=ch.psi.pshell.device.DummyMotor||||true sixc=ch.psi.pshell.device.MotorGroupBase|mu delta gam eta chi phi||| +fivec=ch.psi.pshell.device.MotorGroupBase|delta gam eta chi phi||| +fourc=ch.psi.pshell.device.MotorGroupBase|delta eta chi phi||| en=ch.psi.pshell.device.DummyPositioner||||true diff --git a/devices/hkl_group.properties b/devices/hkl_group.properties index c24fe48..0aa7810 100644 --- a/devices/hkl_group.properties +++ b/devices/hkl_group.properties @@ -1,2 +1,2 @@ -#Mon Apr 16 15:45:44 CEST 2018 -precision=-1 +#Wed Apr 18 09:33:05 CEST 2018 +precision=4 diff --git a/plugins/MXSC-1.9.0.jar b/plugins/MXSC-1.9.0.jar index fe8ae7a8684bf085f91fadeaba9bde2915fe6b04..36f7cca8f977227baeb81deb6a706705d3c483da 100755 GIT binary patch delta 23965 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 @ULJKlU|UovXJ3@f$y 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 OkTOYxDc<*o_`d+NLCN|6 diff --git a/script/diffcalc/diffutils.py b/script/diffcalc/diffutils.py index 0768c94..3e0a7ea 100644 --- a/script/diffcalc/diffutils.py +++ b/script/diffcalc/diffutils.py @@ -16,10 +16,12 @@ ################################################################################################### #1- Create a MontorGroup with the diffractometer motors -# e.g named 'sixc', containing mu, delta, gam, eta, chi, phi motors +# e.g. 'sixc', containing mu, delta, gam, eta, chi, phi motors +# or 'fivec', containing delta, gam, eta, chi, phi motors +# or 'fourc', containing delta, eta, chi, phi motors #2- Create positioner to read/set the energy in kEv, e.g. named 'en' #3- Execute: run("diffutils") -#4- Execute: setup_sixc(sixc, en) +#4- Execute: setup_diff(sixc, en) from __future__ import absolute_import @@ -29,15 +31,15 @@ import traceback import Jama.Matrix diffcalc_path = os.path.abspath(get_context().setup.expandPath("{script}/Lib/diffcalc")) if not diffcalc_path in sys.path: - sys.path.append('/Users/gobbo_a/dev/pshell/config/home/script/Lib/diffcalc') + sys.path.append(diffcalc_path) import diffcalc from diffcalc import settings -from diffcalc.hkl.you.geometry import SixCircle +from diffcalc.hkl.you.geometry import SixCircle, FiveCircle, FourCircle from diffcalc.hardware import HardwareAdapter from diffcalc.ub.persistence import UbCalculationNonPersister -from diffcalc.gdasupport.minigda.scannable import * -from diffcalc.gdasupport.minigda import command +from diffcalc.gdasupport.minigda.scannable import ScannableBase, ScannableGroup +#from diffcalc.gdasupport.minigda import command from diffcalc.hardware import HardwareAdapter @@ -54,7 +56,6 @@ import ch.psi.pshell.device.Register as Register # Device mapping to difcalc ################################################################################################### class PositionerScannable(ScannableBase): - def __init__(self, positioner): self.positioner = positioner self.name = positioner.name @@ -79,15 +80,31 @@ class PositionerScannable(ScannableBase): class PositionerScannableGroup(ScannableGroup): def __init__(self, name, motors): self.name = name - [mu, delta, gam, eta, chi, phi] = motors - self.mu = PositionerScannable(mu) - self.delta = PositionerScannable(delta) - self.gam = PositionerScannable(gam) - self.eta = PositionerScannable(eta) - self.chi = PositionerScannable(chi) - self.phi = PositionerScannable(phi) - ScannableGroup.__init__(self, self.name, [self.mu, self.delta, self.gam, self.eta, self.chi, self.phi]) - + if len(motors)==6: + [mu, delta, gam, eta, chi, phi] = motors + self.mu = PositionerScannable(mu) + self.delta = PositionerScannable(delta) + self.gam = PositionerScannable(gam) + self.eta = PositionerScannable(eta) + self.chi = PositionerScannable(chi) + self.phi = PositionerScannable(phi) + ScannableGroup.__init__(self, self.name, [self.mu, self.delta, self.gam, self.eta, self.chi, self.phi]) + elif len(motors)==5: + [delta, gam, eta, chi, phi] = motors + self.delta = PositionerScannable(delta) + self.gam = PositionerScannable(gam) + self.eta = PositionerScannable(eta) + self.chi = PositionerScannable(chi) + self.phi = PositionerScannable(phi) + ScannableGroup.__init__(self, self.name, [self.delta, self.gam, self.eta, self.chi, self.phi]) + elif len(motors)==4: + [delta, eta, chi, phi] = motors + self.delta = PositionerScannable(delta) + self.eta = PositionerScannable(eta) + self.chi = PositionerScannable(chi) + self.phi = PositionerScannable(phi) + ScannableGroup.__init__(self, self.name, [self.delta, self.eta, self.chi, self.phi]) + class MotorGroupScannable(PositionerScannableGroup): def __init__(self, motor_group): self.motor_group = motor_group @@ -125,10 +142,10 @@ class ScannableAdapter(HardwareAdapter): class MotorGroupAdapter(ScannableAdapter): def __init__(self, diffractometer, energy, energy_multiplier_to_kev=1): - self.sixc = MotorGroupScannable(sixc) - self.en = PositionerScannable(en) - self.en.level = 3 - ScannableAdapter.__init__(self, self.sixc, self.en, energy_multiplier_to_kev) + self.diffractometer = MotorGroupScannable(diffractometer) + self.energy = PositionerScannable(energy) + self.energy.level = 3 + ScannableAdapter.__init__(self, self.diffractometer, self.energy, energy_multiplier_to_kev) class Wavelength(RegisterBase): def doRead(self): @@ -205,15 +222,30 @@ class HklGroup(RegisterBase, Register.RegisterArray): ################################################################################################### you = None dc, ub, hardware, hkl = None, None, None, None -#en in kev -def setup_sixc(sixc, en): - global you, dc, ub, hardware, hkl +_motor_group = None +def setup_diff(diffractometer, energy): + """ + diffractometer: Motor group containing: + - mu, delta, gam, eta, chi, phi (six circle) or + - delta, gam, eta, chi, phi (ficve circle) or + - delta, eta, chi, phi (four circle) + energy: Positioner having energy in kev + """ + global you, dc, ub, hardware, hkl, _motor_group + _motor_group = diffractometer you =None - settings.hardware = MotorGroupAdapter(sixc, en) - settings.geometry = SixCircle() + if len(diffractometer.motors) == 6: + settings.geometry = SixCircle() + elif len(diffractometer.motors) == 5: + settings.geometry = FiveCircle() + elif len(diffractometer.motors) == 4: + settings.geometry = FourCircle() + else: + raise Exception("Invalid motor group") + settings.hardware = MotorGroupAdapter(diffractometer, energy) settings.ubcalc_persister = UbCalculationNonPersister() - settings.axes_scannable_group = settings.hardware.sixc - settings.energy_scannable = settings.hardware.en + settings.axes_scannable_group = settings.hardware.diffractometer + settings.energy_scannable = settings.hardware.energy settings.ubcalc_strategy = diffcalc.hkl.you.calc.YouUbCalcStrategy() settings.angles_to_hkl_function = diffcalc.hkl.you.calc.youAnglesToHkl from diffcalc.gdasupport import you @@ -242,10 +274,13 @@ def print_axis_setup(): # Acceess functions ################################################################################################### def get_diff(): - return settings.hardware.sixc + return settings.hardware.diffractometer def get_en(): - return settings.hardware.en + return settings.hardware.energy + +def get_motor_group(): + return _motor_group def get_wl(): return you.wl @@ -302,7 +337,11 @@ def hklscan(vector, readables,latency = 0.0, passes = 1, **pars): for pos in vector: #print "Writing ", pos hkl_group.write(pos) - time.sleep(1.0) + time.sleep(0.1) #Make sure is busy + get_motor_group().update() + get_motor_group().waitReady(-1) + time.sleep(latency) + hkl_group.update() scan.append ([h.take(), k.take(), l.take()], [h.getPosition(), k.getPosition(), l.getPosition()], [readable.read() for readable in readables ]) finally: scan.end() diff --git a/script/diffcalc/testfivec.py b/script/diffcalc/testfivec.py new file mode 100644 index 0000000..1fdb9d5 --- /dev/null +++ b/script/diffcalc/testfivec.py @@ -0,0 +1,86 @@ +en.move(20.0) +delta.config.maxSpeed = 50.0 +delta.speed = 50.0 +delta.move(1.0) + +run("diffcalc/diffutils") +###################################################################################################\ +#Setup +################################################################################################### + +setup_diff(fivec, en) +# Set some limits +setup_axis('gam', 0, 179) +setup_axis('delta', 0, 179) +setup_axis('delta', min=0) +setup_axis('phi', cut=-180.0) + +print_axis_setup() + +###################################################################################################\ +#Orientation +################################################################################################### +help(ub.ub) +ub.listub() + +# Create a new ub calculation and set lattice parameters +ub.newub('test') +ub.setlat('cubic', 1, 1, 1, 90, 90, 90) + +# Add 1st reflection (demonstrating the hardware adapter) +settings.hardware.wavelength = 1 +ub.c2th([1, 0, 0]) # energy from hardware +settings.hardware.position = 0, 60, 0, 30, 0, 0 +ub.addref([1, 0, 0])# energy and position from hardware + +# Add 2nd reflection (this time without the harware adapter) +ub.c2th([0, 1, 0], 12.39842) +ub.addref([0, 1, 0], [60, 0, 30, 0, 90], 12.39842) + +# check the state +ub.ub() +ub.checkub() + + + +###################################################################################################\ +#Constraints +################################################################################################### +help(hkl.con) +hkl.con('qaz', 90) +hkl.con('a_eq_b') +hkl.con() + +###################################################################################################\ +#Motion +################################################################################################### +print angles_to_hkl((60., 0., 30., 0., 0.)) +print hkl_to_angles(1, 0, 0) +fivec.write([60, 0, 30, 90, 0]) +print "fivec=" , fivec.position +wl.write(1.0) +print "wl = ", wl.read() + +# Load the last ub calculation used +ub.lastub() +ub.setu ([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) +ub.showref() +ub.swapref(1,2) + +#print you.hkl +#pos(get_hkl()) +hkl_group.read() +#you.hkl.simulateMoveTo([0,1,1]) +#sim(get_hkl(), [0,1,1]) +hkl_group.sim([0.0,1.0,1.0]) +#pos(get_hkl(), [0,1,1]) +hkl_group.write([0.0,1.0,1.0]) + + +###################################################################################################\ +#Scans +################################################################################################### +lscan(l, [sin], 1.0, 1.5, 0.1) +ascan([k,l], [sin], [1.0, 1.0], [1.2, 1.3], [0.1, 0.1], zigzag=True, parallel_positioning = False) +vector = [[1.0,1.0,1.0], [1.0,1.0,1.1], [1.0,1.0,1.2], [1.0,1.0,1.4]] +hklscan(vector, [sin, arr], 0.9) \ No newline at end of file diff --git a/script/diffcalc/testfourc.py b/script/diffcalc/testfourc.py new file mode 100644 index 0000000..2b5bd9d --- /dev/null +++ b/script/diffcalc/testfourc.py @@ -0,0 +1,84 @@ +en.move(20.0) +delta.config.maxSpeed = 50.0 +delta.speed = 50.0 +delta.move(1.0) + +run("diffcalc/diffutils") +###################################################################################################\ +#Setup +################################################################################################### + +setup_diff(fourc, en) +# Set some limits +setup_axis('delta', 0, 179) +setup_axis('delta', min=0) +setup_axis('phi', cut=-180.0) + +print_axis_setup() + +###################################################################################################\ +#Orientation +################################################################################################### +help(ub.ub) +ub.listub() + +# Create a new ub calculation and set lattice parameters +ub.newub('test') +ub.setlat('cubic', 1, 1, 1, 90, 90, 90) + +# Add 1st reflection (demonstrating the hardware adapter) +settings.hardware.wavelength = 1 +ub.c2th([1, 0, 0]) # energy from hardware +settings.hardware.position = 0, 60, 0, 30, 0, 0 +ub.addref([1, 0, 0])# energy and position from hardware + +# Add 2nd reflection (this time without the harware adapter) +ub.c2th([0, 1, 0], 12.39842) +ub.addref([0, 1, 0], [60, 30, 0, 90], 12.39842) + +# check the state +ub.ub() +ub.checkub() + + + +###################################################################################################\ +#Constraints +################################################################################################### +help(hkl.con) +hkl.con('a_eq_b') +hkl.con() + +###################################################################################################\ +#Motion +################################################################################################### +print angles_to_hkl((60., 30., 0., 0.)) +print hkl_to_angles(1, 0, 0) +fourc.write([60, 30, 90, 0]) +print "fourc=" , fourc.position +wl.write(1.0) +print "wl = ", wl.read() + +# Load the last ub calculation used +ub.lastub() +ub.setu ([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) +ub.showref() +ub.swapref(1,2) + +#print you.hkl +#pos(get_hkl()) +hkl_group.read() +#you.hkl.simulateMoveTo([0,1,1]) +#sim(get_hkl(), [0,1,1]) +hkl_group.sim([0.0,1.0,1.0]) +#pos(get_hkl(), [0,1,1]) +hkl_group.write([0.0,1.0,1.0]) + + +###################################################################################################\ +#Scans +################################################################################################### +#lscan(l, [sin], 1.0, 1.5, 0.1) +#ascan([k,l], [sin], [1.0, 1.0], [1.2, 1.3], [0.1, 0.1], zigzag=True, parallel_positioning = False) +vector = [[1.0,1.0,1.0], [1.0,1.0,1.1], [1.0,1.0,1.2], [1.0,1.0,1.4]] +hklscan(vector, [sin, arr]) \ No newline at end of file diff --git a/script/diffcalc/difftest.py b/script/diffcalc/testsixc.py similarity index 99% rename from script/diffcalc/difftest.py rename to script/diffcalc/testsixc.py index 00e5161..f69e368 100644 --- a/script/diffcalc/difftest.py +++ b/script/diffcalc/testsixc.py @@ -8,7 +8,7 @@ run("diffcalc/diffutils") #Setup ################################################################################################### -setup_sixc(sixc, en) +setup_diff(sixc, en) # Set some limits setup_axis('gam', 0, 179) setup_axis('delta', 0, 179) diff --git a/script/test/ExampleContinuousMultipass.py b/script/test/ExampleContinuousMultipass.py index 607c28f..a31ad46 100644 --- a/script/test/ExampleContinuousMultipass.py +++ b/script/test/ExampleContinuousMultipass.py @@ -1,8 +1,9 @@ +import traceback THETA_RANGE = (0.0, 5.0) THETA_STEP = 1.0 PHI_RANGE = (-160.0, +160.0) -PHI_STEP = 40.0 +PHI_STEP = 160.0 #40.0 LATENCY = 0.0 ZIGZAG = True @@ -30,21 +31,21 @@ print "phi_positions: ", phi_positions def before_pass(pass_num, scan): print "Initializing pass ", pass_num - phi = phi_positions[pass_num] + phi = phi_positions[pass_num-1] inp.write(phi) - print "phi = ", phi - - #phi = phi_positions[record.index/THETA_NSTEPS] - #ManipulatorPhi.write(phi) #print "phi = ", phi - #ManipulatorPhi.waitValueInRange(phi, 1.0, 100) + + try: - try: - cscan(MOTORS, SENSORS, THETA_RANGE[0], THETA_RANGE[1], THETA_NSTEPS - 1, time=theta_time, passes = len(phi_positions), zigzag = ZIGZAG, before_pass=before_pass) + while(True): + cscan(MOTORS, SENSORS, THETA_RANGE[0], THETA_RANGE[1], THETA_NSTEPS - 1, latency=0.1, time=theta_time, passes = len(phi_positions), zigzag = ZIGZAG, before_pass=before_pass, check_positions = False) except Exception: - print sys.exc_info()[1] + #print sys.exc_info() + traceback.print_exc() + traceback.print_stack() + print "Caught" finally: if ENDSCAN: