- Config name
model: b1_damBIDS suffixTB1DAMMethod family- Field Mapping Acquired volumes
- 2 Fit granularity
- voxelwise
Maps the transmit (B1+) field from two spoiled gradient-echo volumes acquired at flip angles alpha and twice alpha. The ratio of the two signals depends only on the achieved flip angle, so proton density and receive sensitivity cancel and the map needs no calibration. The result is dimensionless — the achieved flip angle as a fraction of the nominal one — and feeds the B1 correction of models such as MTsat and VFA.
Signal model¶
| Symbol | Quantity | Unit |
|---|---|---|
B1 | Relative transmit field | — |
A | Signal amplitude | — |
What the model reads¶
A series of 2 volumes indexed by FlipAngle. Volumes are matched to these identities by value, so reordering the acquisition yields an identical fit.
| # | FlipAngle |
|---|---|
| 1 | 60 |
| 2 | 120 |
Where the protocol comes from¶
In a BIDS dataset these values are resolved for you:
| Protocol parameter | Source | Key | Resolved |
|---|---|---|---|
FlipAngle | sidecar field | FlipAngle | per volume |
Inputs¶

Figure 1:The 2 acquired volumes, each labeled with the identity the model reads it by.
Outputs¶
| Map | BIDS suffix | Unit | Fit bounds | Fitted |
|---|---|---|---|---|
B1 | TB1map | — | 0 … 2 | free |
Diagnostic outputs
Reported by the fit but not written as BIDS derivatives: they describe the fit rather than the tissue, and have no BIDS suffix to be written under.
| Output |
|---|
A |

Figure 2:Fitted maps for one example subject.
Usage¶
The acquisition comes from the sidecars, so recipes/bids/b1_dam_config.yaml carries only algorithm options:
model: b1_dam
# B1 = |acos(S(2a) / (2 * S(a)))| / a, with the map dimensionless (1.0 = the
# nominal flip angle was achieved). BIDS input: the two flip angles are read
# from the JSON sidecars via the model's protocol_schema(), so they are not
# declared here. The TB1DAM collection is assembled by flip index. Example:
#
# qmrust fit --bids-dir <dataset> \
# --config recipes/bids/b1_dam_config.yaml --output-dir out
# BIDS mask selection. Left blank: this example dataset ships no mask, and
# naming one here would claim otherwise. Blank means "whatever mask is
# present", so a dataset of your own that has one is masked by it.
mask:
desc: ""qmrust fit --bids-dir ds-mydata \
--config recipes/bids/b1_dam_config.yaml --output-dir outFitted maps are written as BIDS derivatives:
out/derivatives/qmrust/sub-01/fmap/
sub-01_TB1map.nii.gz
sub-01_TB1map.jsonNo sidecars, so recipes/non-bids/b1_dam_config.yaml declares the acquisition itself:
model: b1_dam
# non-BIDS: protocol from this file; mask via --mask.
# Nominal flip angles in degrees (BIDS-MRI convention), in acquisition order.
# The double-angle identity only holds when the second angle is twice the
# first, so the pair is validated before the fit runs. qMRLab's b1_dam default
# protocol is alpha = 60 degrees.
flip_angles:
- 60
- 120
# There are no fit options: the estimate is closed form.
#
# Two uses:
# - bidsify a qMRLab dataset (SFalpha.mat / SF2alpha.mat plus Mask.mat) from
# --mat-dir; this config is the --config input:
#
# qmrust bidsify --model b1_dam --mat-dir <dir> \
# --config recipes/non-bids/b1_dam_config.yaml --subject 01 --out ds
#
# - fit a stacked 4D NIfTI whose two volumes are [alpha, 2*alpha]:
#
# qmrust fit --data sfalpha_sf2alpha.nii.gz --mask Mask.mat \
# --config recipes/non-bids/b1_dam_config.yaml --output-dir out_b1qmrust fit --data data.nii.gz --mask mask.nii.gz \
--config recipes/non-bids/b1_dam_config.yaml \
--output-dir outSee Fitting without BIDS.
model: b1_dam
# Simulation: the acquisition comes from this file. Nominal flip angles in
# degrees (BIDS-MRI convention), in acquisition order. The double-angle
# identity only holds when the second angle is twice the first.
flip_angles:
- 60
- 120
# Ground truth: B1 is a normalized scaling of the nominal flip angle, so 1.0 is
# a perfectly delivered pulse. A is the signal amplitude.
sim:
params: { B1: 1.0, A: 1000.0 }
noise: { type: rician, snr: 100.0 }
seed: 0
trials: 100
sweep: { param: B1, start: 0.6, stop: 1.4, steps: 10 }
distributions:
B1: { mean: 1.0, std: 0.1 }qmrust sim signal --config recipes/sim/b1_dam_sim.yaml --output signal.json
qmrust sim single-voxel --config recipes/sim/b1_dam_sim.yaml --output sv.json
qmrust sim sensitivity --config recipes/sim/b1_dam_sim.yaml --output sens.json
qmrust sim montecarlo --config recipes/sim/b1_dam_sim.yaml --output mc.jsonSee Simulation.
The same core, compiled to WebAssembly:
import init, { fit_volume } from './pkg/qmrust_wasm.js';
await init();
const maps = fit_volume(configYaml, data, [nx, ny, nz, nt],
JSON.stringify(volumeIds), mask, '{}');Try it on real data in the playground, or read Browser & wasm.

Figure 3:One voxel’s measured data with the model’s forward signal at the fitted parameters. The curve is computed by the same Rust code that does the fitting.
Implementation¶
model.rs— theModelimplementation: measurement contract, protocol schema, BIDS outputs.fit.rs— the numerical fit.config.rs— configuration and validation.
Fully-resolved configuration
Every default materialized, as qmrust dump-config prints it.
model: b1_dam
flip_angles:
- 60.0
- 120.0References¶
Insko & Bolinger (1993)
- Insko, E. K., & Bolinger, L. (1993). Mapping of the radiofrequency field. Journal of Magnetic Resonance, Series A, 103(1), 82–85.