Files
dev/script/__Lib/diffcalc_old/startup/i21.py
2019-03-20 13:52:00 +01:00

263 lines
8.5 KiB
Python

from startup._common_imports import * # @UnusedWildImport
from diffcalc.gdasupport.minigda.scannable import ScannableMotionWithScannableFieldsBase # @UnusedImport
from startup.beamlinespecific.i21 import I21SampleStage, I21DiffractometerStage, I21TPLab
if not GDA:
import startup._demo
else:
# import __main__ # @UnresolvedImport
from __main__ import diodetth,m5tth,sapolar,satilt,saazimuth,sax,say,saz, energy # @UnresolvedImport
LOCAL_MANUAL = "http://confluence.diamond.ac.uk/x/UoIQAw"
# Diffcalc i21
# ======== ===
# delta diodetth or m5tth
# eta sapolar
# chi satilt + 90deg
# phi saazimuth
### Create dummy scannables ###
if GDA:
# assert 'diodetth' in __main__.__dict__ #GDA name is diodetth
# assert 'm5tth' in __main__.__dict__ #GDA name is m5tth - m5 has 2 mirrors with fixed tth offset
# assert 'sapolar' in __main__.__dict__ #GDA name is sapolar
# assert 'satilt' in __main__.__dict__ #GDA name is satilt - fix 90 deg offset
# assert 'saazimuth' in __main__.__dict__ #GDA name is saazimuth
# assert 'sax'in __main__.__dict__
# assert 'say'in __main__.__dict__
# assert 'saz'in __main__.__dict__
print "WARNING: saz may need to be reversed to agree with diffcalc"
xyz_eta = ScannableGroup('xyz_eta', [sax, say, saz]) # @UndefinedVariable
else:
diodetth = Dummy('diodetth')
m5tth = Dummy('m5tth')
sapolar = Dummy('sapolar')
satilt = Dummy('satilt')
saazimuth = Dummy('saazimuth')
sax = Dummy('sax')
say = Dummy('say')
saz = Dummy('saz')
xyz_eta = ScannableGroup('xyz_eta', [sax, say, saz])
sa = I21SampleStage('sa', sapolar, satilt, saazimuth, xyz_eta)
sapolar = sa.sapolar
satilt = sa.satilt
saazimuth = sa.saazimuth
tp_phi = sa.tp_phi_scannable
def centresample():
sa.centresample()
def zerosample():
sa.zerosample()
def toolpoint_on():
sa.centre_toolpoint = True
def toolpoint_off():
sa.centre_toolpoint = False
tp_lab = I21TPLab('tp_lab', sa)
tp_labx = tp_lab.tp_labx
tp_laby = tp_lab.tp_laby
tp_labz = tp_lab.tp_labz
_fourc = I21DiffractometerStage('_fourc', diodetth, sa, chi_offset = 90)
delta = _fourc.delta
eta = _fourc.eta
chi = _fourc.chi
phi = _fourc.phi
from diffcalc.hardware import setmax, setmin, hardware,setcut
### Wrap i21 names to get diffcalc names
if GDA:
def usediode():
_fourc.delta_scn = diodetth
setmin(delta, 0)
setmax(delta, 180)
def usevessel():
_fourc.delta_scn = m5tth # note, if changed also update in _fourc_vessel constructor!
setmin(delta, 0)
setmax(delta, 150)
# raise Exception('need gda class for wrapping scannables. There is one somewhere')
# import what_is_its_name as XYZ # @UnresolvedImport
# delta = XYZ(diode_tth, 'delta') # or vessel_tth
# eta = XYZ(sapolar, 'eta')
# chi = XYZ(satilt, 'chi', 90) # chi = satilt + 90deg
# phi = XYZ(saazimuth, 'phi')
#
# def usediode():
# raise Exception('needs implementing')
#
# def usevessel():
# raise Exception('needs implementing')
from gda.jython.commands.GeneralCommands import alias # @UnresolvedImport
alias("usediode")
alias("usevessel")
alias("centresample")
alias("zerosample")
alias("toolpoint_on")
alias("toolpoint_off")
else:
from diffcalc.gdasupport.minigda.scannable import ScannableAdapter
from IPython.core.magic import register_line_magic # @UnresolvedImport
from diffcmd.ipython import parse_line
# delta = ScannableAdapter(diodetth, 'delta') # or vessel_tth
# eta = ScannableAdapter(sapolar, 'eta')
# chi = ScannableAdapter(satilt, 'chi', 90) # chi = satilt + 90deg
# phi = ScannableAdapter(saazimuth, 'phi')
def usediode():
_fourc.delta_scn = diodetth
setmin(delta, 0)
setmax(delta, 180)
def usevessel():
_fourc.delta_scn = m5tth
setmin(delta, 0)
setmax(delta, 150)
if IPYTHON:
from IPython import get_ipython # @UnresolvedImport @UnusedImport
register_line_magic(parse_line(usediode, globals()))
del usediode
register_line_magic(parse_line(usevessel, globals()))
del usevessel
register_line_magic(parse_line(centresample, globals()))
del centresample
register_line_magic(parse_line(zerosample, globals()))
del zerosample
register_line_magic(parse_line(toolpoint_on, globals()))
del toolpoint_on
register_line_magic(parse_line(toolpoint_off, globals()))
del toolpoint_off
print "Created i21 bespoke commands: usediode & usevessel"
if GDA:
en=energy
if float(en.getPosition()) == 0: # no energy value - dummy?
en(800)
else:
en = Dummy('en')
en(800)
en.level = 3
### Configure and import diffcalc objects ###
ESMTGKeV = 0.001
settings.hardware = ScannableHardwareAdapter(_fourc, en, ESMTGKeV)
settings.geometry = diffcalc.hkl.you.geometry.FourCircle() # @UndefinedVariable
settings.energy_scannable = en
settings.axes_scannable_group= _fourc
settings.energy_scannable_multiplier_to_get_KeV = ESMTGKeV
from diffcalc.gdasupport.you import * # @UnusedWildImport
# fourc is created in diffcalc.gdasupport.you. Add some I21 hints into it
fourc.hint_generator = _fourc.get_hints # (the callablemethod) # @UndefinedVariable
if GDA:
print "Running in GDA --- aliasing commands"
alias_commands(globals())
### Load the last ub calculation used
from diffcalc.ub.ub import lastub
lastub()
### Set i21 specifi limits
print "INFO: diffcalc limits set in $diffcalc/startup/i21.py taken from http://confluence.diamond.ac.uk/pages/viewpage.action?pageId=51413586"
setmin(delta, 0)
setmax(delta, 150) #defult to m5tth limits
setmin(chi, 60)
setmax(chi, 135)
setmin(eta, 0)
setmax(eta, 360)
setmin(phi, -179)
setmax(phi, 179)
#http://jira.diamond.ac.uk/browse/I21-361
setcut(eta, 0.0)
setcut(phi, -180)
print "Current hardware limits set to:"
hardware()
### Create i21 bespoke secondary hkl devices
# Warning: this breaks the encapsulation provided by the diffcalc.dc.you public
# interface, and may be prone to breakage in future.
print 'Creating i21 bespoke scannables:'
from diffcalc.dc import dcyou as _dc
from diffcalc.gdasupport.scannable.diffractometer import DiffractometerScannableGroup
from diffcalc.gdasupport.scannable.hkl import Hkl
print '- fourc_vessel & hkl_vessel'
_fourc_vessel = I21DiffractometerStage('_fourc_vessel', m5tth, sa, chi_offset = 90)
fourc_vessel = DiffractometerScannableGroup('fourc_vessel', _dc, _fourc_vessel)
fourc_vessel.hint_generator = _fourc_vessel.get_hints
hkl_vessel = Hkl('hkl_vessel', _fourc_vessel, _dc)
h_vessel, k_vessel, l_vessel = hkl_vessel.h, hkl_vessel.k, hkl_vessel.l
print '- fourc_lowq & hkl_lowq'
LOWQ_OFFSET_ADDED_TO_DELTA_WHEN_READING = -8
_fourc_lowq = I21DiffractometerStage(
'_fourc_lowq', m5tth, sa, chi_offset=90,
delta_offset=LOWQ_OFFSET_ADDED_TO_DELTA_WHEN_READING)
fourc_lowq = DiffractometerScannableGroup('fourc_lowq', _dc, _fourc_lowq)
fourc_lowq.hint_generator = _fourc_lowq.get_hints
hkl_lowq = Hkl('hkl_lowq', _fourc_lowq, _dc)
h_lowq, k_lowq, l_lowq = hkl_lowq.h, hkl_lowq.k, hkl_lowq.l
print '- fourc_highq & hkl_highq'
highq_OFFSET_ADDED_TO_DELTA_WHEN_READING = 0
_fourc_highq = I21DiffractometerStage(
'_fourc_highq', m5tth, sa, chi_offset=90,
delta_offset=highq_OFFSET_ADDED_TO_DELTA_WHEN_READING)
fourc_highq = DiffractometerScannableGroup('fourc_highq', _dc, _fourc_highq)
fourc_highq.hint_generator = _fourc_highq.get_hints
hkl_highq = Hkl('hkl_highq', _fourc_highq, _dc)
h_highq, k_highq, l_highq = hkl_highq.h, hkl_highq.k, hkl_highq.l
# vessel
print '- fourc_diode & hkl_diode'
_fourc_diode = I21DiffractometerStage('_fourc_diode', diodetth, sa, chi_offset = 90)
fourc_diode = DiffractometerScannableGroup('fourc_diode', _dc, _fourc_diode)
fourc_diode.hint_generator = _fourc_diode.get_hints
hkl_diode = Hkl('hkl_diode', _fourc_diode, _dc)
h_diode, k_diode, l_diode = hkl_diode.h, hkl_diode.k, hkl_diode.l
### Demo ###
if not GDA:
class I21Demo(startup._demo.Demo):
def __init__(self, namespace):
startup._demo.Demo.__init__(self, namespace, 'fourc')
def i21(self):
startup._demo.print_heading('i21 scannables demo')
self.echorun_magiccmd_list([
'sa',
'pos sapolar 1',
'pos satilt 2',
'pos saazimuth 3',
'pos m5tth 4',
'usevessel',
'fourc'])
if not GDA:
demo = I21Demo(globals())