Example 2: Perfusion Analysis using pcASL


The purpose of this example is essentailly do a better job of the analysis we did in Example 1 on the same data using the BASIL tools in FSL. Thus this example incorporates various corrections, for motion and distortion, as outlined in Chapter 2 of the primer. The example then goes on to explore calibration (Chapter 5), partial volume correction (Chapter 6) and analysis using epochs (Chapter 7).

NOTE that we reccomend you use FSL v6 AND the latest pre-release of BASIL for these exercises (v3.9.22 or greater).

For this example you should use the Single PLD pcASL dataset set. This ASL data was acquired using pcASL labelling with a label duration of 1.8 seconds and a post-labelling delay (PLD) of 1.8 seconds, following the recommendations of the ASL consensus paper.

Get the data

Perfusion Quantification

(Primer Example Boxes 1.3, 3.1, 3.2 & 5.1)

We can proceed to do the full quantification using a single call to oxford_asl as we did in Example 1, only now with a few extra options:

  oxford_asl -i asltc -o oxasl --wp --casl --iaf=tc --tis=3.6 --bolus=1.8 --slicedt=0.0452 --spatial --mc -c aslcalib --tr 4.8 --cblip=aslcalib_PA --pedir=y --echospacing=0.00095

Note that we have now specified:

  • That motion correction is to be done: --mc. This is simply an application of mcflirt to the ASL series, as well as realignment of the calibration images to the series too.
  • That distortion correction is to be done using a blip-reversed calibration image, the phase encoding direction being along y (anterior-posterior axis) and the effective echo spacing of the images: --cblip=aslcalib_PA.nii.gz --pedir=y --echospacing=0.00095.
  • That automated spatial regularisation (a 'spatial prior') should be implmented on the estimated perfusion image: --spatial. This will reduce the appearance of noise in the final perfusion image and effect the minimum ammount of smoothing appropriate for the data.
  • For this analysis we still have oxford_asl into 'White Paper' mode (--wp).Specifically this tells it to use the simplest kinetic model that assumes all delivered blood-water has the same T1 as that of blood (see Chapter 4 of the ASL primer for more information) and that the Arterial Transit Time should be treated as 0 seconds.

    To view the final result:

    fsleyes oxasl/native_space/perfusion_calib.nii.gz

    The result will be similar to the analysis in Example 1 although the effect of distortion correction should be noticeable in the anterior protion of the brain. The effects of motion correction are less obvious, this data does not have a lot of motion corruption in it.

    Making use of Structural Images

    (Primer Example Boxes 3.4 & 6.1)

    Thus far all of the analyses have relied purely on the ASL data alone. However, often you will have a (higher resolution) structural image in the same subject and would like to use this as well, at the very least as part of the proceess to transform the perfusion images into some template space.

    We can repeat the analysis above but now providing structural information to oxford_asl. The recommended way to do this is to take your T1 weighted structural image (which is most common) and firstly process using fsl_anat, passing the output directly from that tool to oxford_asl:

      fsl_anat T1.nii.gz
      oxford_asl -i asltc -o oxasl --wp --casl --iaf=tc --tis=3.6 --bolus=1.8 --slicedt=0.0452 --spatial --moco \
      -c aslcalib --tr 4.8 --cblip=aslcalib_PA --pedir=y --echospacing=0.00095 --fslanat=T1.anat

    This analysis will take longer overall, although the extra time is taken up doing registration between ASL and structural images.

    You will now find some new results in the output directory:

  • oxasl/struct_space - this sub-drectory contains results transformed into the same space as the structural image. The files in here will match those in the native_space subdirectry of the earlier analysis, i.e., containing perfusion images with and without calibration.
  • oxasl/native_space/asl2struct.mat - this is the (linear) transformation between ASL and structural space. It can be used along with a transofrmation between sturcutral and template space to transofrm the ASL data into the template space. It was used to creat the results in oxasl/struct_space.
  • oxasl/native_space/perfusion_calib_gm_mean.txt - this contains the result of calculating the perfusion within a gray matter mask, these are in ml/100g/min. The mask was derived from the partial volume estimates created by fsl_anat and transformed into ASL space followed by thresholding at 70%. This is a helpful check on the absolute perfusion values found and it is not aytpical too see values in the range 30-50 here. There is also a white matter result (for which a threshold of 90% was used).
  • oxasl/native_space/gm_mask.nii.gz - this is the gray matter mask used in the above calculations. There is also the associated white matter mask.
  • oxasl/native_space/gm_roi.nii.gz - this is another mask that represents areas in which there is some grey matter (at least 10% from the partial volume estimates). This can be useful for visualisation, but mainly when looking at partial volume corrected data.
  • Reference Tissue Calibration

    (Primer Examples Boxes 5.3 & 5.4)

    Thus far the calibration to get perfsion in units of ml/100g/min has been done using a voxelwise division of the realtive perfusion image by the (suitbaly corrected) calibration image - so called 'voxelwise' calibration. This is in keeping with the recommendations of the ASL White Paper for a simple to implement quantitative analysis. However, we could also choose to use a reference tissue to derive a single value for the equilirbirum mangetizstion of arterial blood and use that in the calibnration process:

      oxford_asl -i asltc -o oxasl --bat=0 --casl --iaf=tc --tis=3.6 --bolus=1.8 --slicedt=0.0452 --spatial --moco \
      -c aslcalib --tr 4.8 --cblip=aslcalib_PA --pedir=y --echospacing=0.00095 --fslanat=T1.anat

    Notice the change in the command: --wp has been replaced by --bat=0. In this run oxford_asl is no longer in 'White Paper' mode, but we are keeping with the assumption (implicitly) made by the ASL White Paper that arterial transit time is zero (for historical reasons oxford_asl calls it bat rather than att). The major difference is that will now by default use the CSF partial volume estimates to automatically generate a ventricle mask and calcuate the equilirbirum mangetization of arterial blood from this reference 'tissue' as part of the calibration. Note that we can force which calibration process oxford_asl uses with the --cmethod option.

    The resulting perfusion images should look very similar to those produce using the voxelwise calibration, and the absolute values should be similar too. For this, and many datasets, the two methods are broadly equivalent. You can check on some of the interim calcuations for the calibration by looking in the oxasl/calib subdirectory: here you will find the value of the estimated equilirbirum mangetization of arterial blood for this dataset in M0.txt and the reference tissue mask in refmask.nii.gz. It is worth checking that the latter does indeed only lie in the venticles when overlaid on an ASL image (e.g. the perfusion image or the calibration image), it should be conservative, i.e., only select voxels well within the ventricles and not on the boundary with white matter.

    Partial Volume Correction

    (Primer Example Box 6.3)

    Having dealt with structural image and in the process obtained partial volume estimates we are now in a position to do partial volume correction. This does more than simply attempt to estimate the mean perfusion within the grey matter by the definition of an ROI based on the partial voume estimates, but attempts to derive and image of gray matter perfusion directly (along with a separate image for white matter).

    As long as the structural image is available oxford_asl will allow you to do partial volume correction by the addition of the --pvcorr option:

      oxford_asl -i asltc -o oxasl --bat=0 --casl --iaf=tc --tis=3.6 --bolus=1.8 --slicedt=0.0452 --spatial --moco \
      -c aslcalib --tr 4.8 --cblip=aslcalib_PA --pedir=y --echospacing=0.00095 --fslanat=T1.anat --pvcorr

    In the results directory you will still find an analysis performed without partial volume correction in oxasl/native_space as before. The results of partial volume correction can be found in oxasl/native_space/pvcorr. This new subdirectory has the sam structure as the non-corrected results, only now perfusion_calib.nii.gz is an estimate of perfusion only in gray matter, it has been joined by a new set of images for the estimation of white matter perfusion, e.g., perfusion_wm_calib.nii.gz. It may be more helpful to look at perfusion_calib_masked.nii.gz (and the equivalent perfusion_wm_calib_masked.nii.gz) since this has been masked to include on voxels with more than 10% gray matter (white matter), i.e., voxels in which it is reasonable to interpret the gray matter (white matter) perfusion values.

    Analysis in Epochs

    (Primer Example Box 7.2)

    It is possible to analyse subsets of this ASL data to look for potential fluctuations in perfusion during the scan. As this was a resting scan wemight not expect to see large chanages; but, the principles of analysing 'epochs' of data can be applied in setigns where gradual or unpredictable perfusion changes might occur

    For epoch analysis we have to specifcy the 'length' of the epoch to use (number of volumes to be extracted for each perfusion image created) and the overlap between epochs (again the number of volumes). Here we will use epochs of 10 volumes with an overlap of 5, giving a total of 5 epochs.

      oxford_asl -i asltc -o oxasl --bat=0 --casl --iaf=tc --tis=3.6 --bolus=1.8 --slicedt=0.0452 --spatial --moco \
      -c aslcalib --tr 4.8 --fslanat=T1.anat \
      --elen=10 --eol=5

    As before this will produce a perfusion image using the whole of the data which is found in the native_space subdirectory. This will have been joined by a series of sub_directories, epoch0000 ... epoch0004, that contain the results of analysis of only the label-control images in each epoch.

    ADVANCED: Distortion correction using TOPUP

    (Primer Example Box 3.2)

    In this example we have allowed oxford_asl to do the distortion correction, which uses TOPUP internally. You can opt to do this for yourself, which may be necessary if your data is not in the form oxford_asl expects, e.g., you do not have blip-reversed calibration images.

    To do distortion correction using TOPUP on this data you would need to do the following:

    Run TOPUP to estimate the distortion.

    fslmerge -t aslcalib_blipped aslcalib aslcalib_PA 
    echo "0 1 0 0.06" > topup_params.txt
    echo "0 -1 0 0.06" >> topup_params.txt
    topup --imain=aslcalib_blipped --datain=topup_params.txt --config=b02b0.cnf --out=topup_results

    Apply the correction to the calibration images.

        applytopup --imain=aslcalib,aslcalib_PA --inindex=1,2
        --datain=topup_params.txt --topup=topup_results --out=aslcalib_corr --method=jac

    Apply the correction to the ASL series.

        applytopup --imain=asltc --datain=topup_params.txt
        --inindex=1 --topup=topup_results --out=asltc_corr --method=jac

    We can do a quick check to see if this has worked by looking at the PWI, which we can generate using asl_file:

    asl_file --data=id${id}_asltc_corr --ntis=1 --iaf=tc --diff --out=asldiffdata_corr --mean=asldiffdata_corr_mean

    Compare this to the uncorrected case:

    asl_file --data=asltc --ntis=1 --iaf=tc --diff --out=asldiffdata --mean=asldiffdata_mean
    fsleyes asldiffdata_mean asldiffdata_corr_mean

    Ideally we would like to apply motion correction together with distortion correction (having derived suitable estimates of their separate effects first). A pragmatic compromise would be to do the motion correction first and then the disotortion correction.

    ADVANCED: Partial Volume Correction using Linear Regression

    (Primer Example Box 6.2)

    The partial volume correction in oxford_asl is based on a method that exploits the Bayesian inference methods built into BASIL. However, you can opt to use the alternative Linear Regression approach should you wish. To do this you have to do the correction in a first step, using asl_file, prior to quantification using oxford_asl:

    # get partial volume estimates into the ASL space
    convert_xfm -omat struct2asl.mat -inverse oxasl/native_space/asl2struct.mat
    applywarp --ref=asltc --in=T1.anat/T1_fast_pve_1 --out=pvgminasl --premat=struct2asl.mat --super --interp=spline --superlevel=4
    # do linear regression on the ASL difference data
    asl_file --data=asltc --ntis=1 --iaf=tc --diff --out=asldiffdata
    asl_file --data=asldiffdata --ntis=1 --iaf=diff --mask=oxasl/native_space/mask \
    --pvgm=pvgminasl --pvwm=pvwminasl --kernel=5 --out=asldiff_LR
    # do the quantification on the LR corrected difference data
        oxford_asl -i asldiff_LR -o oxasl_LR --spatial --bat=0 --iaf=diff --casl --tis=3.6 --bolus=1.8 --slicedt=0.0452 \
    -c aslcalib --csf=oxasl/calib/refmask --cmethod=single
       fslmaths oxasl_LR/native_space/perfusion_calib -mas oxasl/native_space/gm_mask LR_perfusion_calib_masked

    Note that we have made use of the results from a previous run of oxford_asl on the non-corrected data for things like the brain mask, transformation between ASL and structural space and the grey matter mask. This routine only computes gray matter perfusion, a similar approach could be taken for white matter.