Gadgetron examples
Gadgetron is an open source project for medical image reconstruction and can be used with Tyger. These examples assume that you have ismrmrd installed.
Basic example
Generate some test data with:
ismrmrd_generate_cartesian_shepp_loganThis will generate a testdata.h5 file. You can then run a reconstruction with:
ismrmrd_hdf5_to_stream -i testdata.h5 --use-stdout \
| tyger run exec -f basic_gadgetron.yml \
| ismrmrd_stream_to_hdf5 --use-stdin -o out_basic.h5basic_gadgetron.yml looks like this:
job:
codespec:
image: ghcr.io/gadgetron/gadgetron/gadgetron_ubuntu_rt_nocuda:latest
buffers:
inputs:
- input
outputs:
- output
args:
- "-c"
- "default.xml"
- "--from_stream"
- "-i"
- "$(INPUT_PIPE)"
- "-o"
- "$(OUTPUT_PIPE)"
resources:
requests:
cpu: 1Using dependent measurements
It is common in MRI to perform a noise reference scan before the main scan. The noise scan is used to estimate a noise covariance matrix and the subsequent scan is reconstructed after noise pre-whitening using this covariance matrix.
For this example, download the noise and main scan raw data files:
curl -OL https://aka.ms/tyger/docs/samples/dependencies/noise_scan.h5
curl -OL https://aka.ms/tyger/docs/samples/dependencies/main_scan.h5Compute noise covariance matrix
Start by creating buffers for the noise data and covariance matrix:
noise_buffer_id=$(tyger buffer create)
noise_covariance_buffer_id=$(tyger buffer create)Then write the noise data to the buffer:
ismrmrd_hdf5_to_stream -i noise_scan.h5 --use-stdout \
| tyger buffer write $noise_buffer_idNow compute the noise covariance matrix using the two buffers:
tyger run exec -f noise_gadgetron.yml \
-b input=$noise_buffer_id \
-b noisecovariance=$noise_covariance_buffer_idnoise_gadgetron.yml looks like this:
job:
codespec:
image: ghcr.io/gadgetron/gadgetron/gadgetron_ubuntu_rt_nocuda:latest
buffers:
inputs:
- input
outputs:
- noisecovariance
args:
- "-c"
- "default_measurement_dependencies.xml"
- "--from_stream"
- "-i"
- "$(INPUT_PIPE)"
- "-o"
- /dev/null
- --disable_storage
- 'true'
- --parameter
- noisecovarianceout=$(NOISECOVARIANCE_PIPE)Reconstruction
We are ready to reconstruct the main scan data by referencing the noise covariance matrix buffer:
ismrmrd_hdf5_to_stream -i main_scan.h5 --use-stdout \
| tyger run exec -f snr_gadgetron.yml --logs -b noisecovariance=$noise_covariance_buffer_id \
| ismrmrd_stream_to_hdf5 --use-stdin -o main-scan-recon.h5snr_gadgetron.yml looks like this (note the two input buffers):
job:
codespec:
image: ghcr.io/gadgetron/gadgetron/gadgetron_ubuntu_rt_nocuda:latest
buffers:
inputs:
- input
- noisecovariance
outputs:
- output
args:
- "-c"
- "Generic_Cartesian_FFT.xml"
- "--from_stream"
- "-i"
- "$(INPUT_PIPE)"
- "-o"
- "$(OUTPUT_PIPE)"
- --disable_storage
- 'true'
- --parameter
- noisecovariancein=$(NOISECOVARIANCE_PIPE)Distributed reconstruction
Next is an example that uses a distributed run. First, download the raw data:
curl -OL https://aka.ms/tyger/docs/samples/binning.h5Then run:
ismrmrd_hdf5_to_stream -i binning.h5 --use-stdout \
| tyger run exec -f distributed_gadgetron.yml --logs \
| ismrmrd_stream_to_hdf5 --use-stdin -o out_binning.h5distributed_gadgetron.yml looks like this:
job:
codespec:
image: ghcr.io/gadgetron/gadgetron/gadgetron_ubuntu_rt_nocuda:latest
buffers:
inputs:
- input
outputs:
- output
args:
- "-c"
- "CMR_2DT_RTCine_KspaceBinning_Cloud.xml"
- "--from_stream"
- "-i"
- "$(INPUT_PIPE)"
- "-o"
- "$(OUTPUT_PIPE)"
env:
GADGETRON_REMOTE_WORKER_COMMAND: printenv TYGER_GADGETRON_WORKER_ENDPOINT_ADDRESSES
resources:
requests:
cpu: 1
worker:
codespec:
image: ghcr.io/gadgetron/gadgetron/gadgetron_ubuntu_rt_nocuda:latest
args: []
endpoints:
gadgetron: 9002
resources:
requests:
cpu: 3000m
memory: 4G
limits:
memory: 4G
replicas: 2This run is made up of a job with two worker replicas.