SoftAxis: creating axes on the fly¶
BLISS provides a helper which wraps any python object with a Axis
interface allowing it to be used in a scan.
Lets say you have a python object:
class Maxipix(object):
_energy = 12.34
@property
def energy_threshold(self):
return self._energy
@energy_threshold.setter
def energy_threshold(self, new_energy):
self._energy = new_energy
@property
def temperature(self):
return 30 + 10*random.random()
mpx1 = Maxipix()
…and you would like to scan the energy threshold which is a property of
your object. All you have to do is wrap your object with a bliss SoftAxis
(for the sake of the example we also added a temperature counter so we can
count something):
from bliss.common.standard import ascan, SoftAxis, SoftCounter
# counter from an object property
mpx1_temp = SoftCounter(mpx1, 'temperature', name='mpx1_temp')
# create an Axis out of the Maxipix energy_threshold
# * read the position means read energy_threshold property
# * move means write the energy_threshold property
mpx1_energy = SoftAxis('mpx1_energy', mpx1, position='energy_threshold',
move='energy_threshold')
# You can use it like a "normal" bliss axis
# (although no fancy backlash, acceleration, velocity parameter)
print(mpx1_energy.position)
# now you can scan the energy_threshold like this:
ascan(mpx1_energy, 10, 20, 100, 0.1, mpx1_temp)
position and move are flexible. They can be object property names, object method names or reference to object methods. Here is an example:
from bliss.common.standard import SoftAxis
class Pilatus(object):
_energy = 12.34
def get_energy(self):
return self._energy
def set_energy(self, new_energy):
self._energy = new_energy
pilatus1 = Pilatus()
ptus_energy = SoftAxis('ptus_energy', pilatus1, position='get_energy',
move=pilatus1.set_energy)
Particularly useful might be tango attributes or commands as axes:
from bliss.common.tango import DeviceProxy
magnet1 = DeviceProxy('id31/magnet/1')
mag1_axis = SoftAxis('mfield', magnet1, position='field',
move='SetField')
print(mag_axis.position)
Note
Take care of the names you give to axes. If you give a name which is already assigned to another bliss object you risk replacing it in setup_globals with your object