Table of Contents |
---|
...
Connection to the production controls system is handled mainly via EPICS Channel Access PVs (as well as limited use of AIDA-PVA for klystron timing statuses). During real-time streamingupdating, callback functions are used when a change in each live quantity of interest is broadcast over the network. When live quantities change, these callbacks will either (a) submit update instructions to a shared queue or (b) request a recalculation of the live momentum profile by the LEM-watcher
thread. Additionally, a second daemon thread (model-update
) will periodically empty the queue and execute all the scheduled update commands and then update the BmadLiveModel.live and .LEM
data structures.
Real-time controls-system monitoring is accomplished using PV callback functions.
...
there are three "watcher" daemon threads that monitor extant machine settings. Each thread will submit instructions for updates to the simulation to one of two shared update queues.
acc1-watcher
and acc2-watcher
These are the main passive device monitoring threads. acc1 is responsible for monitoring all quadrupole magnets in the accelerator, while acc2 id responsible for monitoring dipoles, sextupoles and other miscellaneous devices.
LEM
LEM (LINAC energy management) is a set of algorithms responsible for estimating the beam momentum profile and calculating the corresponding lattice quad settings. This code only calculates the momentum profile, errors and magnet settings. Actually setting magnets in the accelerator will be handled by a LEM server GUI (coming soon...).
BmadLiveModel
will monitors the klystron complement and bend magnet settings to calculate the live momentum profile of the beam- Periodically, the server will use the live momentum profile to calculate energy errors and magnet settings, which are published to a table PV
Detailed overview of LEM implementation: LEM_notes-3.pdf
LEM-watcher
Daemon thread spawned by BmadLiveModel
, responsible for calculating the live beam momentum profile as described below, and for submitting update requests for cavity voltages and phases to the command queue, as well as linac amplitude, chirp and fudge values
...
PyTao
updates
The BmadLiveModel
python class loads the FACET2E lattice and runs a local copy of pytao.Tao
. This instance of tao is both the engine used by the class to update the live lattice, as well as a part of the public interface of the code. BmadLiveModel.tao
is a publicly accessible attribute of the class itself
...
This thread is responsible for executing all the submitted update requests using Tao, and to for updating derived quantities (BLEM) and python data structures.
- empty the command device update queue of (approximately*) all submitted updates
- run all the
set ele
commands, then re-calculate lattice parameters - update the
live.p0c, live.e_tot, live.twiss, live.quads, live.bends, live.rf , live.LEM
data structures
LEM
LEM (LINAC energy management) is a set of algorithms responsible for estimating the beam momentum profile and calculating the corresponding lattice quad settings. This code only calculates the momentum profile, errors and magnet settings. Actually setting magnets in the accelerator will be handled by a LEM server GUI (coming soon...).
BmadLiveModel
will monitors the klystron complement and bend magnet settings to calculate the live momentum profile of the beam- Periodically, the server will use the live momentum profile to calculate energy errors and magnet settings, which are published to a table PV
Detailed overview of LEM implementation: LEM_notes-3.pdf
LEM-watcher
This is the second daemon thread spawned by BmadLiveModel
and is responsible for calculating the live beam momentum profile as described below, and for submitting update requests for cavity voltages and phases to the command queue.
...
- empty the LEM update queue and set the
live.LEM
amplitude, chirp and fudge values
PVA model server(s)
The principal use case for the BmadLiveModel is running a real-time live model server. This server runs its own BmadLiveModel
, and then publishes live model data to scalar and table PVs accessible on the controls system via EPICS PVAccess. The code for the live model itself is relatively simple, and is derived from the lcls_live_model server.
For performance, there are actually two production services. Both recalculate and update PVs once per second.
- Model Server 1: This server is responsible for updating live twiss parameters and LEM data.
- Model Server 2: This service is responsible for publishing R matrices
Access to the live Bmad model server (for twiss/rmat data), is mediated by the python meme
service
...
- SLAC network master repository:
/afs/slac/g/cd/swe/git/repos/slac/FACET/F2_live_model.git
- Production deployment:
/usr/local/tools/python/F2_live_model
- GitHub mirror: F2_live_model.git
...
- The public interface to the code is documented here: f2-live-model.readthedocs.io/
BmadLiveModel
operates in three distinct modes, depending on the input flags at construction:
...
f2m = BmadLiveModel(design_only=True)
...
Static design data only.
BmadLiveModel.live
is not defined
...
f2m = BmadLiveModel(instanced=True)
f2m.refresh_all()
# --> your code here
...
This mode is designed for making lattice tweaks in Tao relative to extant machine settings.
The refresh_all()
function is used to update model data.
...
f2m = BmadLiveModel()
f2m.start()
# --> your code here
f2m.stop
or:
with BmadLiveModel() as f2m:
# --> your code here
...
This is the default mode. Provides live data at the minimum latency, but has a higher background processing cost.
Use of the context manager (i.e. the with
keyword) is the most pythonic practice, but manual start()
and stop()
functions are also defined.
...
Details
Model server data description
PV name | table columns | notes |
---|---|---|
BMAD:SYS0:1:FACET2E:LIVE:TWISS | element, device_name, s, z, length, p0c, alpha_x, beta_x, eta_x, etap_x, psi_x, alpha_y, ..., psi_y | |
BMAD:SYS0:1:FACET2E:LIVE:RMAT | element, device_name, s, z, length, r11, r12, r13, r14, r15, r16, r21, r22, ..., r65, r66 | linear maps from the beginning of the linac to the downstream face of each element |
BMAD:SYS0:1:FACET2E:LIVE:URMAT | element, device_name, s, z, length, r11, r12, r13, r14, r15, r16, r21, r22, ..., r65, r66 | single-element linear maps (i.e. from the upstream to downstream face of each) |
BMAD:SYS0:1:FACET2E:DESIGN:TWISS | element, device_name, s, z, length, p0c, alpha_x, beta_x, eta_x, etap_x, psi_x, alpha_y, ..., psi_y | |
BMAD:SYS0:1:FACET2E:DESIGN:RMAT | element, device_name, s, z, length, r11, r12, r13, r14, r15, r16, r21, r22, ..., r65, r66 | |
BMAD:SYS0:1:FACET2E:DESIGN:URMAT | element, device_name, s, z, length, r11, r12, r13, r14, r15, r16, r21, r22, ..., r65, r66 | |
BMAD:SYS0:1:FACET2E:LEM:DATA | element, device_name, s, z, length, EREF, E_ref, E_act, E_err, BLEM, BDES, BDES_SAVE final data TBD (but single NTTable seems simpler than lcls-style per-device PVs)EACT, EERR, BLEM_DESIGN, BLEM_EXTANT |
Additionally, the service will publish scalar PVs of the estimated linac amplitudes/chirps/fudges by calculated by LEM. Their names are as follows:
...
where <XX>
is a "LEM region", either L0
, L1
, L2
or L3
, for a total of an additional 12 PVs. (ex: BMAD:SYS0:1:FACET2E:LEM:L2_FUDGE
). There is an additional read/write PV: BMAD:SYS0:1:FACET2E:LEM:PROFILE
which stores the last known extant momentum profile to which current rf settings are compared.
Dependencies
numpy, spicyscipy
pyEPICS
p4p
Bmad + Tao
Pytao
facet2-lattice
- The live model needs to run on the production network (primarily on
facet-srv02
)
...
Source: F2_live_model/ | Details |
---|---|
docs/ | sphinx config files |
config~/docs/ | model config files for sphinx |
facet2e.yaml | config for the FACET2E live model & server |
unaliased-elements.csv | supplemental text file of device alias (control system name) info |
~/.readthedocs.yaml | config for readthedocs.io doc generation |
~/structs.py | auxiliary data structures for holding beamline data |
~/bmad.py | implements the BmadLiveModel class |
| live model PVA service |
| Jupyter notebook with simple examples of how to use BmadLiveModel |