Page History
...
It's a common question to ask what are the rates that the accelerator can generate. The table below lists the rates that are natural for the accelerator. These are the periodic rates that repeat exactly at the ~0.98 second period of the timing/MPS system. Of course, we can generate other rates as well that aren't exactly periodic by doing the sort of thing you described - dropping shots or irregular sequences. This has been useful for the OPCPA laser development in deciding the exact frequencies they will support.
If a base accelerator rate is chosen (e.g. 33kHz) then other rates having the same prime factors as the accelerator rate are allowed, according to this table:
(python3_env) [weaver@lcls-dev3 lcls2-timing-patterns]$ python lcls/fixed_rate_table.py
Matt provides this example of how you can determine if various trigger rates overlap: 16kHz (16581 in the table) has factors (2,2,2,7). 102Hz has factors (2,2,5,5,7,13). It's missing one factor of 2, so it only overlaps 1/2 of the time. 51Hz has (2,2,2,5,5,7,13), so it contains all the factors from 16kHz and thus overlaps 100%.
If a base accelerator rate is chosen (e.g. 33kHz) then other rates having the same prime factors as the accelerator rate are allowed, according to this table:
(python3_env) [weaver@lcls-dev3 lcls2-timing-patterns]$ python lcls/fixed_rate_table.py
rate, Hz | factor | factors
rate, Hz | factor | factors
928571 1 1
464285 2 (2,)
232142 4 (2, 2)
185714 5 (5,)
132653 7 (7,)
116071 8 (2, 2, 2)
92857 10 (2, 5)
71428 13 (13,)
66326 14 (2, 7)
58035 16 (2, 2, 2, 2)
46428 20 (2, 2, 5)
37142 25 (5, 5)
35714 26 (2, 13)
33163 28 (2, 2, 7)
26530 35 (5, 7)
23214 40 (2, 2, 2, 5)
18571 50 (2, 5, 5)
17857 52 (2, 2, 13)
16581 56 (2, 2, 2, 7)
14285 65 (5, 13)
13265 70 (2, 5, 7)
11607 80 (2, 2, 2, 2, 5)
10204 91 (7, 13)
9285 100 (2, 2, 5, 5)
8928 104 (2, 2, 2, 13)
8290 112 (2, 2, 2, 2, 7)
7428 125 (5, 5, 5)
7142 130 (2, 5, 13)
6632 140 (2, 2, 5, 7)
5306 175 (5, 5, 7)
5102 182 (2, 7, 13)
4642 200 (2, 2, 2, 5, 5)
4464 208 (2, 2, 2, 2, 13)
3714 250 (2, 5, 5, 5)
3571 260 (2, 2, 5, 13)
3316 280 (2, 2, 2, 5, 7)
2857 325 (5, 5, 13)
2653 350 (2, 5, 5, 7)
2551 364 (2, 2, 7, 13)
2321 400 (2, 2, 2, 2, 5, 5)
2040 455 (5, 7, 13)
1857 500 (2, 2, 5, 5, 5)
1785 520 (2, 2, 2, 5, 13)
1658 560 (2, 2, 2, 2, 5, 7)
1485 625 (5, 5, 5, 5)
1428 650 (2, 5, 5, 13)
1326 700 (2, 2, 5, 5, 7)
1275 728 (2, 2, 2, 7, 13)
1061 875 (5, 5, 5, 7)
1020 910 (2, 5, 7, 13)
928 1000 (2, 2, 2, 5, 5, 5)
892 1040 (2, 2, 2, 2, 5, 13)
742 1250 (2, 5, 5, 5, 5)
714 1300 (2, 2, 5, 5, 13)
663 1400 (2, 2, 2, 5, 5, 7)
637 1456 (2, 2, 2, 2, 7, 13)
571 1625 (5, 5, 5, 13)
530 1750 (2, 5, 5, 5, 7)
510 1820 (2, 2, 5, 7, 13)
464 2000 (2, 2, 2, 2, 5, 5, 5)
408 2275 (5, 5, 7, 13)
371 2500 (2, 2, 5, 5, 5, 5)
357 2600 (2, 2, 2, 5, 5, 13)
331 2800 (2, 2, 2, 2, 5, 5, 7)
285 3250 (2, 5, 5, 5, 13)
265 3500 (2, 2, 5, 5, 5, 7)
255 3640 (2, 2, 2, 5, 7, 13)
212 4375 (5, 5, 5, 5, 7)
204 4550 (2, 5, 5, 7, 13)
185 5000 (2, 2, 2, 5, 5, 5, 5)
178 5200 (2, 2, 2, 2, 5, 5, 13)
142 6500 (2, 2, 5, 5, 5, 13)
132 7000 (2, 2, 2, 5, 5, 5, 7)
127 7280 (2, 2, 2, 2, 5, 7, 13)
114 8125 (5, 5, 5, 5, 13)
106 8750 (2, 5, 5, 5, 5, 7)
102 9100 (2, 2, 5, 5, 7, 13)
92 10000 (2, 2, 2, 2, 5, 5, 5, 5)
81 11375 (5, 5, 5, 7, 13)
71 13000 (2, 2, 2, 5, 5, 5, 13)
66 14000 (2, 2, 2, 2, 5, 5, 5, 7)
57 16250 (2, 5, 5, 5, 5, 13)
53 17500 (2, 2, 5, 5, 5, 5, 7)
51 18200 (2, 2, 2, 5, 5, 7, 13)
40 22750 (2, 5, 5, 5, 7, 13)
35 26000 (2, 2, 2, 2, 5, 5, 5, 13)
28 32500 (2, 2, 5, 5, 5, 5, 13)
26 35000 (2, 2, 2, 5, 5, 5, 5, 7)
25 36400 (2, 2, 2, 2, 5, 5, 7, 13)
20 45500 (2, 2, 5, 5, 5, 7, 13)
16 56875 (5, 5, 5, 5, 7, 13)
14 65000 (2, 2, 2, 5, 5, 5, 5, 13)
13 70000 (2, 2, 2, 2, 5, 5, 5, 5, 7)
10 91000 (2, 2, 2, 5, 5, 5, 7, 13)
8 113750 (2, 5, 5, 5, 5, 7, 13)
7 130000 (2, 2, 2, 2, 5, 5, 5, 5, 13)
5 182000 (2, 2, 2, 2, 5, 5, 5, 7, 13)
4 227500 (2, 2, 5, 5, 5, 5, 7, 13)
2 455000 (2, 2, 2, 5, 5, 5, 5, 7, 13)
1 910000 (2, 2, 2, 2, 5, 5, 5, 5, 7, 13)
...
Another important method (used especially for low rate 1,10,100Hz triggers that are in-synch with the beam) is to use an event-code generated by ACR (see Control Sequence Bit for currently supported event codes). These event codes already include a destination setting.
Some details:
cpo thinks event codes like "SC_SXR BSA" (e.g. 100Hz is eventcode 30) on that page would be commonly used by the hutches. NOTE: We have seen empirically that these event codes do not include a destination setting, so it is necessary to also select destination 4 with the "select" field set to "inclusive" with them. Matt writes: "Event code 30 will follow the offset used by SXR, but it isn't aware of MPS mitigating the beam rate. We use the destination 4 filter to also pickup when MPS has inhibited the beam."
Some details:
- there are 288 bits of "event there are 288 bits of "event codes" available
- some have well-defined meanings, like the low-rate ones described above (in progress)
- 16 highest bits are hutch specific for sequences (272-287)
- DAQ readout groups are "extra bits" included at end of timing frame
- timing frames have "destinations": e.g. bykiks, and bykikh both go to "bsy" dump
- unlike LCLS1 we will not be using event-codes to understand when bykiks has fired: use destinations instead, in particular DumpBSY for "dropped" or "background" shots
- some devices reference to "sequencer engineer number" and "sequence bit number" instead of "eventcode". The formula to convert between the two: eventcode=(sequenceEngine#<<16 | sequencerBit#).
Trigger Destinations and Types
Timing receivers share a common logic module for generating triggers. They consist of the logical AND of two components, a rate component and a beam destination component.
...
In this example the XPM is configured to insert event codes 272-287 into the timing stream. Four event codes are generated by each sequence engine within the XPM. The XPM has 4 sequence engines allowing 16 event codes total.
Engine | Event Codes |
---|---|
0 | 272256-275259 |
1 | 276260-279263 |
2 | 280264-283267 |
3 | 284268-287271 |
4 | 272-275 |
5 | 276-279 |
6 | 280-283 |
7 | 284-287 |
A current example A current example for doing this is done by executing:
(first use Matt's high-level utility to generate two event codes that run at 10Hz and 100Hz (periods 91000 and 9100 respectively)
(ps-4.5.26) drp-srcf-mon001:psana$ periodicgenerator -p 91000 9100 -s 0 0 -d '10Hz' '100Hz' >& 10hz_100hz.py
(now program sequence engine 0 and start it using the python code generated above. since we're programming engine 0, the first two event codes will be 272,273 according to the above table)
(this command must be executed on a node that can access the XPM PV's, e.g. drp-srcf-*)
(ps-4.5.26) drp-srcf-mon001:psana$ seqprogram --seq 04:10hz_100hz.py --pv DAQ:NEH:XPM:3 --start
** engine 0 fname 10hz_100hz.py **
descset None
seqcodes {0: '10Hz', 1: '100Hz'}
Remove -1
idx 2
Removing seq 2
[10, 1, 5, 3, 0, 0, 0, 0, 2, 0, 6, 2048, 0, 0, 0, 3, 2, 1, 3, 3, 0, 0, 2, 0, 6, 908, 0, 0, 0, 1, 5, 2, 0, 0, 0, 0, 3, 2, 1, 0, 8, 0, 0, 2, 0, 6, 2048, 0, 0, 0, 3, 2, 6, 3, 3, 0, 0, 2, 0, 6, 908, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0]
Confirmed ninstr 10
Sequence found at index 2
desc ['10Hz', '100Hz', '', '', '', '', '', '', '', '', '', '', 'burst', '', '', '']
seqcodes_pv epics:nt/NTTable:1.0
string[] labels [EventCode, Description, Rate, Enabled]
structure value
int[] EventCode [272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287]
string[] Description [10Hz, 100Hz, , , , , , , , , , , burst, , , ]
int[] Rate [11,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
byte[] Enabled [1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1]
string descriptor
alarm_t alarm
int severity 0
int status 0
string message
time_t timeStamp
long secondsPastEpoch 1683163040
int nanoseconds 339389440
int userTag 0(now query the xpm to see what is running in the 4 sequence engines, each having 4 event codes)
(ps-4.5.26) drp-srcf-mon001:psana$ pvget DAQ:NEH:XPM:3:SEQCODES
DAQ:NEH:XPM:3:SEQCODES 2023-05-03 18:17:31.339
EventCode Description Rate Enabled
272 10Hz 10 1
273 100Hz 102 1
274 0 1
275 0 1
276 0 0
277 0 0
278 0 0
279 0 0
280 0 0
281 0 0
282 0 0
283 0 0
284 burst 0 1
285 0 1
286 0 1
287 0 1
(ps-4.5.26) drp-srcf-mon001:psana$
...
self.pv_xpm_part_base = pv_base + ':XPM:%d:PART:%d' % (xpm_master, platform)
self.pva.pv_put(self.pva.pvStepEnd, self.readoutCumulative)
Generating a Low Rate Sequence
From Matt.
periodicgenerator --period 1820000 --start_bucket 91000 --description 'Example 0.5Hz sequence' > 0.5Hseq.py
(ps-4.6.1) bash-4.2$ seqplot --seq 0:0.5Hseq.py --time 4.0
eng 0 fn 0.5Hseq.py
0: FixedRateSync(929kHz) # occ(2048)
1: Branch to line 0 until ctr3=43
2: FixedRateSync(929kHz) # occ(888)
3: ControlRequest word 0x1 [0]
4: FixedRateSync(929kHz) # occ(2048)
5: Branch to line 4 until ctr3=843
6: FixedRateSync(929kHz) # occ(488)
7: Branch unconditional to line 0
start, stop: 0,3640000
engine exited request 0 instr 1 returnaddr None frame 3642047 ccnt [0, 0, 0, 0]
Should show eventcode 272 at bucket 91,000 and every 1,820,000 (2 seconds) after that.