Examples

Magnetic Particle Spectroscopy (MPS)

The following is an example setup of an MPS system based on a RedPitaya StemLab 125-14. It has the following configuration directory:

MPS/
├── Sequences/
│   └── MPSSequence.toml
├── Protocols/
│   └── MPSProtocol.toml
└── Scanner.toml

It features two Devices: the RedPitayaDAQ device, which is responsible for signal generation and acquisition, and a virtual Device called TxDAQController. The latter Device is responsible for checking the amplitude and phase of channels that require control and iteratively improving them until the deviation has fallen below a given threshold.

The RedPitayaDAQ features one transmit channel excitation and two receive channel rx_main and feedback_main. The transmit channel is configured with calibration values, both for itself and for the feedback channel it is associated with. All channel are mapped to the channel of the Red Pitaya hardware.

To perform an MPS experiement one can use the MPIMeasurementProtocol, which takes a background and a foreground measurement and is capable of storing both in an MDF.

Scanner.toml

[General]
boreSize = "6mm"
facility = "Universitätsklinikum Hamburg-Eppendorf"
manufacturer = "IBI"
name = "MPS"
topology = "MPS"
gradient = "0T/m"

[Runtime]
datasetStore = "/opt/data/MPS"
defaultProtocol = "MPSMeasurement"
producerThreadID = 2
consumerThreadID = 3
protocolThreadID = 4

[Devices]
initializationOrder = [
  "txController",
  "rp_cluster"
]

[Devices.rp_cluster]
deviceType = "RedPitayaDAQ"
dependencies = ["txController"]
ips = ["192.168.1.100"]
rampingMode = "STARTUP"
rampingFraction = 0.2
triggerMode = "INTERNAL"

[Devices.rp_cluster.excitation]
type = "tx"
channel = 1
limitPeak = "1.0V"
sinkImpedance = "HIGH"
calibration = "20.5V/T"
feedback.channelID = "feedback_main"
feedback.calibration = "0.017T/V"

[Devices.rp_cluster.rx_main]
type = "rx"
channel = 1

[Devices.rp_cluster.feedback_main]
type = "rx"
channel = 2

[Devices.txController]
deviceType = "TxDAQController"
dependencies = ["rp_cluster"]
phaseAccuracy = 0.1
amplitudeAccuracy = 0.01
maxControlSteps = 10

MPSProtocol.toml

type = "MPIMeasurementProtocol"
description = "Default measurement protocol for the MPS scanner. Acquires a background and forground measurement"
targetScanner = "MPS"

sequence = "MPSSequence"
controlTx = true
fgFrames = 10
bgFrames = 10

MPSSequence.toml

[General]
name = "MPSSequence"
description = "A sequence with a 26.042 kHz excitation frequency."
targetScanner = "MPS"
baseFrequency = "125.0MHz"

[Fields]

[Fields.ex]
safeStartInterval = "0.1s"
safeEndInterval = "0.1s"
safeErrorInterval = "0.1s"
control = true
decouple = false

[Fields.ex.excitation]
offset = "0.0mT"

[Fields.ex.excitation.c1]
divider = 4800
amplitude = ["20mT"]
phase = ["0.0rad"]
waveform = "sine"

[Acquisition]
channels = ["rx_main"]
bandwidth = "3.90625MHz"
numPeriodsPerFrame = 1
numFrames = 1
numAverages = 1000
numFrameAverages = 1