Difference between revisions of "Ophyd"

From GISAXS
Jump to: navigation, search
(Beamlines using ophyd)
 
(2 intermediate revisions by the same user not shown)
Line 23: Line 23:
 
One can access [[EPICS]] process variables (PVs) using [http://cars9.uchicago.edu/software/python/pyepics3/ pyEpics]. There are three levels for getting/setting PV values:
 
One can access [[EPICS]] process variables (PVs) using [http://cars9.uchicago.edu/software/python/pyepics3/ pyEpics]. There are three levels for getting/setting PV values:
 
* caget/caput (highest level)
 
* caget/caput (highest level)
 +
** from epics import caget, caput
 +
** caget(pv)
 
* PV.get/PV.put (middle level)
 
* PV.get/PV.put (middle level)
 +
** import epics
 +
** motor = epics.PV(pv)
 +
** motor.value
 +
** motor.put(0.0)
 
* ca.get/ca.put (lowest level)
 
* ca.get/ca.put (lowest level)
  
Any of these methods will work; where performance is not an issue (just setting or reading a few times), any of these methods will work. However, if the values are being read or set repeatedly (e.g. inside a loop), then some methods may work better than others. In particular, "caget/caput" should not be used, since these functions create a new connection with every call. (The connection to the PV is the most time-consuming part). Moreover, generating a connection involves broadcasting to look for the host (which affects network performance).
+
 
 +
Any of these methods will work; where performance is not an issue (just setting or reading a few times), any of these methods will work. However, if the values are being read or set repeatedly (e.g. inside a loop), then some methods may work better than others. In particular, "caget/caput" should not be used, since these functions create a new connection with every call. (The connection to the PV is the most time-consuming part.) Moreover, generating a connection involves broadcasting to look for the host (which affects network performance).
  
 
For better performance, the correct method is to make the connection at the beginning (only once), and then keep reading/setting the PV using that connection. This means using using PV.get/PV.put or ca.get/ca.put.
 
For better performance, the correct method is to make the connection at the beginning (only once), and then keep reading/setting the PV using that connection. This means using using PV.get/PV.put or ca.get/ca.put.
Line 32: Line 39:
 
If you're reading/setting a large number of different PVs (thousands or even more), using the lowest-level (ca.get/ca.put) is the best method.
 
If you're reading/setting a large number of different PVs (thousands or even more), using the lowest-level (ca.get/ca.put) is the best method.
  
 +
One can also do:
 +
* from ophyd import EpicsMotor
 +
* motor = EpicsMotor(pv, name='name')
 +
* motor.user_readback.value
 +
* motor.user_setpoint.set(0.0)
  
 
==Beamlines using ophyd==
 
==Beamlines using ophyd==
Line 38: Line 50:
 
** [[CHX]] (Coherent Hard X-rays)
 
** [[CHX]] (Coherent Hard X-rays)
 
** [[CMS]] (Complex Materials Scattering)
 
** [[CMS]] (Complex Materials Scattering)
 +
** [[SMI]] (Soft Matter Interfaces)
  
 
==See Also==
 
==See Also==
 
* [https://github.com/NSLS-II/ophyd NSLS-II ophyd github]
 
* [https://github.com/NSLS-II/ophyd NSLS-II ophyd github]

Latest revision as of 20:43, 7 November 2016

ophyd is a Python-based interactive environment for instrument control at NSLS-II synchrotron beamlines.

Examples

  • Motors
    • wh_pos() : motor positions
    • mov(dcm_x, 1.0) : move motor
    • movr(dcm_x, -1.0) : relative motion
    • movr([dcm_x, dcm_y], [-1.0,-1.0]) : multiple motions
  • Scan
    • dscan.detectors : list
    • dscan(diff_xh, -1, 1, 25)
  • EPICS
    • Access PVs:
      • caget()
      • caput()
    • Epics signals
      • eiger1M_exposure_time = EpicsSignal('XF:11IDB-BI{Det:Eig1M}cam1:AcquireTime', rw=True, name='eiger1M_exposure_time')
  • Logging
    • grabit : screengrab, copied immediately to Olog notebook.
      • 'i' to enter interactive mode, type text, then to exit+save do 'Esc' then ':wq'.

EPICS

One can access EPICS process variables (PVs) using pyEpics. There are three levels for getting/setting PV values:

  • caget/caput (highest level)
    • from epics import caget, caput
    • caget(pv)
  • PV.get/PV.put (middle level)
    • import epics
    • motor = epics.PV(pv)
    • motor.value
    • motor.put(0.0)
  • ca.get/ca.put (lowest level)


Any of these methods will work; where performance is not an issue (just setting or reading a few times), any of these methods will work. However, if the values are being read or set repeatedly (e.g. inside a loop), then some methods may work better than others. In particular, "caget/caput" should not be used, since these functions create a new connection with every call. (The connection to the PV is the most time-consuming part.) Moreover, generating a connection involves broadcasting to look for the host (which affects network performance).

For better performance, the correct method is to make the connection at the beginning (only once), and then keep reading/setting the PV using that connection. This means using using PV.get/PV.put or ca.get/ca.put.

If you're reading/setting a large number of different PVs (thousands or even more), using the lowest-level (ca.get/ca.put) is the best method.

One can also do:

  • from ophyd import EpicsMotor
  • motor = EpicsMotor(pv, name='name')
  • motor.user_readback.value
  • motor.user_setpoint.set(0.0)

Beamlines using ophyd

  • NSLS-II
    • CSX (Coherent Soft X-rays)
    • CHX (Coherent Hard X-rays)
    • CMS (Complex Materials Scattering)
    • SMI (Soft Matter Interfaces)

See Also