Data access (Scan/Reco helpers)¶
This page describes how to access scan/reco objects and read dataset files and image data from the Python API.
BrkRaw is read-only with respect to the input dataset: it reads files from a directory/zip/PvDatasets container and returns in-memory objects.
Get a scan (and list what’s available)¶
import brkraw as brk
loader = brk.load("/path/to/study")
print(sorted(loader.avail.keys())) # scan ids
scan = loader.get_scan(3)
print(sorted(scan.avail.keys())) # reco ids under this scan
reco = scan.get_reco(1)
Notes:
loader.availis a mapping of{scan_id: Scan}.scan.availis a mapping of{reco_id: Reco}.
Scan helpers¶
When you load a dataset, BrkRaw attaches convenience helpers onto each scan object so you can access common conversion/inspection pieces directly.
Typical helpers on a scan:
scan.get_dataobj(reco_id=None)→ reconstructed NumPy array(s)scan.get_affine(reco_id=None, space="subject_ras", ...)→ affine matrix/matricesscan.get_nifti1image(reco_id=None, ...)→nibabel.nifti1.Nifti1Imagescan.convert(reco_id=None, format="nifti", ...)→ NIfTI output object(s)scan.get_metadata(reco_id=None, ...)→ metadata mapping for sidecars/specsscan.search_params(key, file=..., reco_id=...)→ parameter search results
The loader also exposes convenience wrappers for common operations:
nii = loader.convert(scan_id=3, reco_id=1, format="nifti")
aff = loader.get_affine(scan_id=3, reco_id=1, space="subject_ras")
data = loader.get_dataobj(scan_id=3, reco_id=1)
File access (parameter files and raw entries)¶
Scan and reco objects are “dataset-backed” nodes that can open files relative to their location in the dataset tree.
Parameter files (auto-parsed)¶
Common parameter files are opened and parsed automatically as Parameters
objects when possible:
scan = loader.get_scan(3)
reco = scan.get_reco(1)
method = scan.method # Parameters
acqp = scan.acqp # Parameters
visu = reco.visu_pars # Parameters
reco_params = reco.reco # Parameters
print(method["Method"])
Reading binary / text entries¶
Non-parameter files are exposed as in-memory file-like buffers:
- text-like content →
io.StringIO - binary-like content →
io.BytesIO
Example: access the reconstructed 2dseq bytes (typically large):
reco = loader.get_scan(3).get_reco(1)
buf = reco["2dseq"] # BytesIO
raw = buf.read()
Explicit vs attribute access¶
Files can be accessed using:
- attribute access (
scan.method,reco.visu_pars) - dictionary-style access (
scan["method"],reco["2dseq"])
If a dataset contains file names that are not valid Python identifiers, prefer the dictionary-style form.
Listing entries under a node¶
scan = loader.get_scan(3)
print(scan.listdir()) # names under the scan folder
reco = scan.get_reco(1)
print(reco.listdir()) # names under the reco folder (e.g. 2dseq, visu_pars)
Get data and affine separately¶
For pipelines that need lower-level access than convert(), you can retrieve
image arrays and affines directly.
scan = loader.get_scan(3)
data = scan.get_dataobj(reco_id=1)
affine = scan.get_affine(reco_id=1, space="subject_ras")
Notes:
- Some scans produce multiple “slice packs”; in that case these APIs may return a tuple of arrays/matrices (one per pack).
spacecontrols the affine coordinate system (raw,scanner,subject_ras).scan.get_affine(...)also accepts optional post-transforms via extra kwargs:flip_x/flip_y/flip_zandrad_x/rad_y/rad_z(radians), applied right before returning.
FID / rawdata access (when available)¶
Some scan types expose FID/rawdata access:
fid = loader.get_fid(scan_id=3)
If the scan has no FID reader, this returns None.