Beam current and accumulated charge
WebDAQ reads the beam current from one of three sources — a TetrAMM, an RBD 9103, or a monitored value already published to Graphite — and integrates it into two separate numbers. Both appear on the dashboard in the Beam & Charge card, and both end up in the run record.
Whichever source you pick behaves identically everywhere else: the same plot, the
same current.txt, the same accumulated charge. Choose it in
Settings → Current Measurement Module.
1. The two charges, and why they differ
Figure |
Integrates |
Reset |
Use |
|---|---|---|---|
This run |
only while a run is in progress |
at every run start |
Normalisation for the online analysis: counts per unit charge for this measurement. |
Total |
always, run or no run |
only when you press reset |
How much beam this target has seen, so you know how old it is. |
That is the whole design. The run figure must cover the run and nothing else, or a cross section comes out wrong; the total must not skip the beam delivered while you were setting up, or it stops being a target history.
The run figure follows the DAQ’s own run state, not the browser. If you close the tab, if the run is stopped by the auto-restart, or if the run saves no data, the charge is still integrated for exactly the length of the run. It is written into the run’s metadata when the run ends.
How it is integrated. The readings are joined by straight lines (a ramping
beam counts as a ramp, not a staircase). From the start of the run to its first
reading the first one is held, and from its last reading to the stop the last
one is: the charge covers the run from start to stop, not just the stretch
between two readings. The Data page integrates current.txt over the same span
(the run’s start and stop are in its metadata.json), and so does RUReader for
the ROOT file, so the three numbers agree. Runs recorded before v5.0 counted
the live figure only up to the last reading, which made it a little lower than
it should be — in a short run, by a few percent.
A small dot next to This run on the dashboard card shows whether it is integrating: green during a run, grey between runs. A number that is not moving between runs is correct behaviour, not a stalled readout.
2. TetrAMM
Four-channel picoammeter on Ethernet. Settings → Current Module.
Setting |
Where |
Meaning |
|---|---|---|
IP address |
Settings → Current Module |
Factory default is |
Port |
same |
|
Charge channel |
same |
Which of the four inputs is integrated into the charge. The others are still recorded. |
Device parameters live in conf/tetram.json and are pushed to the instrument at
initialisation:
Parameter |
Default |
Meaning |
|---|---|---|
|
|
Number of channels read out (1–4). Reading fewer channels is faster. |
|
|
Measurement range. |
|
|
Samples averaged per reported value. Higher = quieter and slower. |
|
|
Output format. |
|
|
External trigger mode. |
|
|
Acquisitions per trigger. |
Wiring. The TetrAMM is a current sink: connect the Faraday cup (or the target insulated from ground) to a channel input, and keep the cable short and screened. A floating or noisy input shows as a current that follows nothing — check with the beam off first; a well-connected channel reads a few pA.
If it does not connect. The TetrAMM answers on its own subnet. From the DAQ
machine, ping 169.254.145.10 must work before WebDAQ can. A link-local address
means the PC needs an interface on 169.254.x.x.
3. RBD 9103
Single-channel picoammeter on USB (a serial port). Settings → Current Module.
Setting |
Where |
Meaning |
|---|---|---|
Serial port |
Settings → Current Module |
|
Baud rate |
same |
|
High-speed mode |
same |
Faster sampling, more noise per sample. |
Device parameters live in conf/rbd9103.json and are sent as the instrument’s
own command codes:
Parameter |
Default |
Meaning |
|---|---|---|
|
|
|
|
|
Rolling average over 32 samples. |
|
|
Normal input. |
|
|
Internal bias off. |
|
|
Sampling interval in ms. |
Choosing the filter. The filter is the trade between seeing a beam trip
quickly and having a stable number. F032 at 1000 ms sampling means the reading
follows the beam over ~30 s. For tuning the accelerator, drop it; for a long
run, keep it.
4. Monitored value (a Graphite metric)
Not every setup has a picoammeter on the target. If the accelerator already publishes its own beam current to the laboratory’s Graphite server, WebDAQ can use that number directly. Settings → Current Measurement Module → Monitored value.
Setting |
Meaning |
|---|---|
Metric path |
The Graphite path, e.g. |
Metric unit |
The unit the metric is published in — nA, µA, mA or A. Everything downstream works in µA; getting this wrong scales the accumulated charge by the same factor. |
Poll interval |
How often Graphite is asked. Polling faster than the value is published adds load without adding samples. |
The module is read-only: it does not configure the accelerator, it just follows the number. The charge is integrated by the trapezoid rule using the metric’s own timestamps, not wall-clock, so a poll that returns three archived points contributes the charge of those three points.
What it refuses to integrate. A monitored value is not a dedicated instrument, and it fails in ways a picoammeter does not:
Gaps. If Graphite is unreachable for ten minutes, those ten minutes count as unmeasured and contribute nothing. The alternative — assuming the current held — would invent charge that was never delivered.
NaN and negative readings are dropped. A NaN would poison the running total irrecoverably; a negative reading, which is what an unplugged or wrongly-wired readout produces, would silently subtract charge that really was delivered. Zero is kept, because beam off is a real measurement.
Connected on this module means the metric is arriving, not that the Graphite server answers. A reachable server publishing nothing for this path reads as disconnected, which is the honest answer — otherwise a run could start against a dead number.
Note
One Graphite server, set in Settings → Monitoring, has two ports that are easy to confuse. Its Carbon port (2003) is where WebDAQ sends the measured current, together with the DAQ rates. Its web (render) API port is where it reads values back — including this module and the long-run history behind the current plot. A monitored value that never arrives is usually the web port set to 2003.
5. The current plot
The dashboard plots the beam current from the start of the run. Two behaviours are worth understanding:
The plot is binned, not thinned. However long the run, the server reduces the window to a fixed number of points before sending it, so a three-day run costs the browser the same as a three-minute one. Each point carries the mean and the extremes of its time bin, drawn as a shaded band — so a two-second beam trip that a plain average would smooth away stays visible even when one bin spans seven minutes. The averaging window is shown next to the plot whenever it exceeds a couple of seconds.
It refreshes at the rate it can meaningfully change. A short window updates every second; a multi-day run updates every fifteen. A long run therefore makes the dashboard lighter, not heavier.
When the run is stopped the plot shows a rolling window instead — 30 s to 5 min, selectable above the plot.
For a run longer than the in-memory buffer (roughly fourteen hours), the history is fetched from Graphite, which is why the plot is complete even if you open the dashboard on the third day of a run.
6. What is recorded
File |
Written when |
Contents |
|---|---|---|
|
during a run with data saving on |
Time and current, one row per sample. |
Run metadata (database) |
at run stop |
The run’s accumulated charge, alongside target, voltages and notes. |
|
during a run |
The current as a Graphite metric, if you added it on the Stats page. |
The current.txt file is written only when data saving is enabled. The charge
integration is not: it follows the run itself, so a no-save run still reports its
charge.
7. Checks that catch most problems
Beam off, current near zero? If not, the input is floating or picking up noise. Nothing downstream will be right until this is.
Beam on, current follows the accelerator? Compare against the accelerator’s own reading in Grafana. A constant factor means a wrong range or a split current path; a lag means too much filtering.
Between runs, does This run stay still while Total climbs? That is the expected behaviour. If This run moves between runs, the DAQ still thinks a run is in progress — check the run state on the dashboard.
After a run, does the logbook entry show a charge? It is written at run stop. Zero means the picoammeter was disconnected or the current was zero for the whole run.
When you change the target, clear the lifetime figure with Reset Total Charge
in the run control bar on the dashboard. Nothing else clears it — not a restart,
not a new run — and the new value is written to conf/current.json straight
away, so the old total does not come back.