brain-zero / space /config.toml
rfick's picture
disco-space a0eaa21cc0a6, brain.toml
b11d6eb verified
Raw History Blame Contribute Delete
9.32 kB
# The DiSCo Space: what is pinned. Every number the app shows comes from pipeline.py on this configuration.
source = "disco" # space/sources/disco.py: the DiSCo phantom (demo: its layout, full: its columnar pack)
[data]
repo = "SubstrateCommons/disco-time-segments" # the public time-segment layout of the DiSCo v2 walk
layout = "disco" # the layout's prefix in the dataset (dmipy_replay.replay.time_segments, format time_segments/2)
revision = "a38679f061f1487b6688ebb37b7ee949da000ea3" # the dataset revision the layout is read at (the OGSE class cos-f50-T20 and the b-tensor class qte-now-80)
manifest_sha256 = "0fe044fd6963de74c6174276e35dd2ddc219d9d4ef2a476df0150ada48e23ef9" # the layout manifest the page was accepted on (checked at load)
pack = "hf://SubstrateCommons/disco-replay/disco" # the replay pack the layout was contracted from: the acceptance test's reference
pack_revision = "b06eb4179a99ef885af73de1ddfbc2f3c230de37"
strands = "substrate/DiSCo_Strands_Trajectories.tck" # the ground truth's strand centrelines (CC BY 4.0) in the replay dataset, read at pack_revision
# The timing classes ("shapes"), each ONE waveform the layout stores (space/classes.py builds it with dmipy-replay's
# sequence builders on the layout's grid, TE = 53.5 ms, 1000 samples; checked against the layout's partition at load): square
# pulses (slew_rate = inf), PGSE unless kind = "pgste" (a stimulated echo storing for TM = Delta - delta) or "ogse"
# (a cosine of `frequency` Hz over `duration` s on each side of the 180, its edges ramped at `slew_rate` T/m/s as built
# at `b_built` s/mm^2: the class stores that one shape at every b). delta / Delta / TE in seconds (an OGSE's delta /
# Delta are the scheme's nominal block and block separation); label is what the app shows.
[shapes."d10.2-D16.7"]
label = "DiSCo δ 10.2 / Δ 16.7 ms (shells b = 0, 1000, 1925)"
delta = 0.0102
Delta = 0.0167
TE = 0.0535
[shapes."d7.6-D45.9"]
label = "DiSCo δ 7.6 / Δ 45.9 ms (shell b = 3091)"
delta = 0.0076
Delta = 0.0459
TE = 0.0535
[shapes."d17.7-D35.8"]
label = "DiSCo δ 17.7 / Δ 35.8 ms (shell b = 13183)"
delta = 0.0177
Delta = 0.0358
TE = 0.0535
[shapes."d12-D24"]
label = "clinical δ 12 / Δ 24 ms"
delta = 0.012
Delta = 0.024
TE = 0.0535
[shapes."d17-D30"]
label = "research δ 17 / Δ 30 ms"
delta = 0.017
Delta = 0.030
TE = 0.0535
[shapes."d8-D20"]
label = "Connectome 2.0 δ 8 / Δ 20 ms"
delta = 0.008
Delta = 0.020
TE = 0.0535
# The stimulated echo matched to DiSCo's b = 3091 shell: the same diffusion time (Delta = delta + TM = 45.9 ms) with
# the magnetisation stored along z for TM, so susceptibility dephasing (and T2) act only during the two deltas.
[shapes."ste-d7.6-TM38.3"]
label = "stimulated echo δ 7.6 / TM 38.3 ms (Δ 45.9 ms, the PGSTE twin of the b = 3091 class)"
delta = 0.0076
Delta = 0.0459
TE = 0.0535
kind = "pgste"
# The paper's cosine OGSE (experiments/disco/disco_acq.py "ogse"): 50 Hz, one 20 ms period each side of the 180.
[shapes."cos-f50-T20"]
label = "cosine OGSE 50 Hz, one 20 ms period each side of the 180 (edges 200 T/m/s, as built at b = 1000)"
kind = "ogse"
frequency = 50.0
duration = 0.020
slew_rate = 200.0
b_built = 1000.0
delta = 0.019975
Delta = 0.020029
TE = 0.0535
# The b-tensor class: three gradient shapes on the spin echo, each in both encoding windows (six stored terms), so one
# class plays every linear, planar and spherical encoding of them at any rotation and b (space/tensor.py). The shapes
# are the three axes of NOW's maximum-b spherical encoding (Sjolund et al. 2015) at TE 53.5 ms designed at 80 mT/m and
# 200 T/m/s per axis (a 4 ms window for the 180), the physical gradient in `waveform` (data/); rotated, a linear or
# spherical row at b 2000 needs about 124 mT/m on one axis: Connectome-class hardware. delta / Delta are the scheme's
# nominal encoding windows (the CSD and the scheme never read them: a b-tensor run fits maps, not FODs).
[shapes."qte-now-80"]
label = "b-tensor class qte-now-80: NOW spherical encoding at TE 53.5 ms, 80 mT/m and 200 T/m/s per axis (Connectome-class when rotated)"
kind = "tensor"
waveform = "classes/qte-now-80.npy"
delta = 0.0229
Delta = 0.0253
TE = 0.0535
# DiSCo's own protocol: which timing class each shell of the dataset's gradient table plays (b in s/mm^2, the
# table's rows are assigned to the nearest b here).
[disco]
shells = [
{ b = 0, shape = "d10.2-D16.7" },
{ b = 1000, shape = "d10.2-D16.7" },
{ b = 1925, shape = "d10.2-D16.7" },
{ b = 3091, shape = "d7.6-D45.9" },
{ b = 13183, shape = "d17.7-D35.8" },
]
# Presets the app offers besides "DiSCo 364" (which comes from the dataset's table): the paper's flagship
# acquisitions (experiments/disco/disco_acq.py), each its gradient table in data/protocols/ (the same files the paper
# replays: b = 0 rows first, then every shell's directions spread by electrostatic repulsion) on one stored class.
[presets."clinical b1000 x 30"]
table = "protocols/clinical"
shape = "d12-D24"
[presets."research 3-shell x 90"]
table = "protocols/research"
shape = "d17-D30"
[presets."Connectome 2.0 b6000 x 60"]
table = "protocols/c2"
shape = "d8-D20"
[presets."cosine OGSE 50 Hz b1000 x 60"]
table = "protocols/ogse"
shape = "cos-f50-T20"
# Tensor-valued encoding: linear and spherical b-tensors interleaved at four b-values on the b-tensor class, the
# b-values and direction counts of Szczepankiewicz et al. 2019's clinical protocol (6, 6, 10, 16 per encoding); the
# same axes for both encodings at each b; one b = 0 row. Its run fits FA (DTI on the linear rows), MD and the
# microscopic FA (the powder averages), not a connectome.
[presets."b-tensor: linear + spherical (Szczepankiewicz 2019), b 100-2000 s/mm²"]
shape = "qte-now-80"
n_b0 = 1
snr = 100 # its own starting SNR: µFA is noise-limited (the other presets start at [noise] snr)
tensor = { bvalues = [100, 700, 1400, 2000], directions = [6, 6, 10, 16], encodings = ["LTE", "STE"] }
# The noise a run starts with: the SNR at M0 (a full water voxel before relaxation) every preset starts at unless it
# states its own.
[noise]
snr = 30
# The tissue and the scanner: the field presets the page offers (T), the default field,
# and whether a run starts with the tiers on. Tissue defaults come from dmipy-sim's white-matter catalogue at the
# nearest cited field (1.5 / 3 / 7 T) and are editable on the page.
[physics]
fields = [0.064, 1.5, 3.0, 7.0, 11.7]
default_field = 3.0
default_on = true
pools = ["intra", "extra"] # the pack's seeded pools (its spec also names a myelin pool nobody was seeded in)
# The scanner menu after "ideal": catalogue machines of dmipy-replay (ScannerLimits.of(key)), each applied with every term
# its entry carries (docs/scanner.md); the phantom sits at a distance from isocentre along a scanner axis (the panel's
# placement, at most 7.9 cm: the whole 1 mm cube inside the Swoop's 8 cm anchor). The Swoop's own gradient needs the
# layout's background vectors (segment_rows(background=True)); a layout without them refuses it by name.
[scanners]
machines = [
{ label = "Hyperfine Swoop 64 mT (permanent magnet, field across the patient)", key = "hyperfine_swoop_64mT" },
{ label = "Siemens Prisma 3 T", key = "siemens_magnetom_prisma_3T" },
{ label = "Siemens Terra 7 T", key = "siemens_magnetom_terra_7T" },
]
default_offset_cm = 7.9
max_offset_cm = 7.9
delivery_per_meas = 0.0036 # s per measurement per replay: bore.delivered_moments over DiSCo's 31,802 live voxels, 1.3 s at 364 (a CPU host)
# The mode: demo = the time-segment layout (the hosted Spaces; seconds; the stored waveforms), full = the columnar
# replay pack itself (minutes per volume; any timing; the scheme upload), read from
# DISCO_COLUMNS (a directory with the columns, or the Hub at 45 MB/s). DISCO_MODE in the environment overrides.
[mode]
mode = "demo"
columns = "hf://SubstrateCommons/disco-replay/disco"
workers = 16
# The compute backend: jax (the reference; the Docker Space) or torch (Hugging Face's shared GPU pool, disco-space#2);
# DISCO_BACKEND in the environment overrides. resident = false streams the layout's packed words to the device a
# chunk at a time on every image (nothing kept: a pool that drops the device between calls, a GPU smaller than one
# class's columns, a CPU host); true keeps the columns an image reads on the device across calls.
[compute]
backend = "jax"
resident = false
[tracking]
density = 4 # seeds per region voxel = density^3 (4 -> 659,840 seeds, the DiSCo score's setting)
step_mm = 0.5
max_angle = 30.0
max_steps = 500
# The acceptance gate (tests/test_acceptance.py) on the DiSCo 364 protocol, noiseless.
[gate]
pearson_count_min = 0.90
missed_pairs_max = 0
reference_max_abs_diff = 1e-3 # the layout's signal against the replay pack's own replay of the same rows at the gate's voxels, over the bare b = 0 signal
reference_voxels = 32 # voxels spread over the pack's index the reference is replayed at
# The reconstruction: DiSCo is single-fibre white matter, so its CSD is the single-tissue Tournier 2007 one on the
# response white_matter_response_tournier07 estimates from the volume. DISCO_RECONSTRUCTION in the environment overrides.
[reconstruction]
method = "tournier07"