Skip to content

Commit

Permalink
fixes #86
Browse files Browse the repository at this point in the history
  • Loading branch information
prjemian committed Jan 5, 2021
1 parent d46a4f7 commit 59979a0
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 2 deletions.
60 changes: 58 additions & 2 deletions hkl/diffract.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,12 @@ def __init__(self, prefix, calc_kw=None, decision_fcn=None,
self.energy.subscribe(
self._energy_changed, event_type=Signal.SUB_VALUE)

self.energy_offset.subscribe(
self._energy_offset_changed, event_type=Signal.SUB_VALUE)

self.energy_units.subscribe(
self._energy_units_changed, event_type=Signal.SUB_VALUE)

@property
def _calc_energy_update_permitted(self):
"""return boolean `True` if permitted"""
Expand All @@ -223,9 +229,59 @@ def _energy_changed(self, value=None, **kwargs):
if self._calc_energy_update_permitted:
self._update_calc_energy(value)

def _energy_offset_changed(self, value=None, **kwargs):
"""
Callback indicating that the energy offset signal was updated.
.. note::
The ``energy_offset`` signal is subscribed to this method
in the :meth:`Diffractometer.__init__()` method.
"""
if not self.connected:
logger.warning(
(
"%s not fully connected,"
" '%s.calc.energy_offset' not updated"
),
self.name, self.name)
return

# TODO: is there a loop back through _update_calc_energy?
# raise NotImplementedError(f"units = {self.energy_units.get()}")
try:
energy = pint.Quantity(
self.calc.energy, "keV"
).to(
self.energy_units.get()
)
except Exception as exc:
raise NotImplementedError(f"units = {self.energy_units.get()}: {exc}")
self.energy.put(energy.magnitude - value)

def _energy_units_changed(self, value=None, **kwargs):
"""
Callback indicating that the energy units signal was updated.
.. note::
The ``energy_units`` signal is subscribed to this method
in the :meth:`Diffractometer.__init__()` method.
"""
if not self.connected:
logger.warning(
(
"%s not fully connected,"
" '%s.calc.energy_units' not updated"
),
self.name, self.name)
return

# TODO: is there a loop back through _update_calc_energy?
energy = pint.Quantity(self.calc.energy, "keV").to(value)
self.energy.put(energy.magnitude - self.energy_offset.get())

def _update_calc_energy(self, value=None, **kwargs):
"""
writes self.calc.energy from value or self.energy
writes ``self.calc.energy`` from ``value`` or ``self.energy``.
"""
if not self.connected:
logger.warning(
Expand All @@ -234,7 +290,7 @@ def _update_calc_energy(self, value=None, **kwargs):
return

# use either supplied value or get from signal
value = value or self.energy.get()
value = float(value or self.energy.get())

# energy_offset has same units as energy
value += self.energy_offset.get()
Expand Down
24 changes: 24 additions & 0 deletions hkl/tests/test_diffract.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,27 @@ def test_energy_units(fourc):
.magnitude,
fourc.energy.get(),
)

fourc.energy_units.put("keV")
fourc.energy.put(8)
fourc.energy_offset.put(0.015)
assert fourc.calc.energy == 8.0
assert round(fourc.energy.get(), 6) == 7.985
fourc.energy.put(8)
assert fourc.calc.energy == 8.015
assert round(fourc.energy.get(), 6) == 8

# issue #86
# changing units or offset changes .energy, not .calc.energy
fourc.energy_units.put("eV")
assert fourc.calc.energy == 8.015
assert round(fourc.energy.get(), 1) == 8015
fourc.energy.put(8000)
assert round(fourc.calc.energy, 8) == 8.000015
assert round(fourc.energy.get(), 1) == 8000
fourc.energy_offset.put(15)
assert round(fourc.calc.energy, 8) == 8.000015
assert round(fourc.energy.get(), 1) == 7985
fourc.energy.put(8000)
assert round(fourc.calc.energy, 8) == 8.015
assert round(fourc.energy.get(), 1) == 8000

0 comments on commit 59979a0

Please sign in to comment.