ODF Peak values

Hi there,

I am looking at the peak values of the ODFs. Why are they bigger than one?
If I understand correctly… I have three vectors inside (9 values) in the 4D data.
Is it not normalized to be between -1 and 1 ?

Do I understand correctly?

And since there are 9 values= three vectors…are they mirrored. Because MRView shows symmetrical?

Thanks for the great work,


The output does indeed contain 3× the stated number of peaks, so the first 3 volumes correspond to the [x y z] components of peak 1, the next 3 to peak 2, etc.

There is no normalisation applied to these vectors - the amplitude corresponds to the amplitude of the FOD along that peak. That way you can actually derive the peak amplitudes from these images if you need to. For example, to get the amplitude of peak 1, extract the first 3 volumes and compute the per-voxel norm of these values:

mrconvert peaks.mif -coord 3 0:2 - | mrmath - rms -axis 3 peak1_amplitude.mif

Also, the FOD itself is not normalised, so there is no guarantee that the peaks will be capped at any particular value. And even if it was normalised, the amplitude of the peaks will depend on the harmonic order: a higher harmonic order allows for sharper peaks, and these peaks will be higher amplitude if the overall integral is to be preserved.

Yes, they will be mirrored in the display. This is because in diffusion MRI, orientations are typically assumed to be non-directed (if that makes any sense…), in that direction +x is the same as direction -x.

Thanks for the anser,
at the end I read the peaks in matlab and played a little arround.
With your provided matlab function its easy,

thanks for that to.


I am wondering if a normalization to unit lenght is possible? The norm of my peaks have to be one for further investigation? Is there a way of doing it with the mrtrix tools mrcalc or mrmath? Because the way I tried it didnt work:

  1. calculate the norm of the peaks file (axis 3) via mrmath
  2. calculate the reciprocal of the norm (1/n) via mrcalc
  3. separate the peak file to 3x3d files and calculate via mrcalc with 1/n
  4. separate the peak file to 3x3d files and calculate via mrcalc with 1/n, merge files.
  5. merge files
    I checked the results with mrview but I could see anything, the image was just black!
    I guess I did it the wrong way!
    Thank you
    Happy for any kind of help!

Yes, it’s not the most obvious thing… You were on the right track, but some of the steps aren’t quite right. Before I suggest anything though:

I don’t think there’s any command in MRtrix3 that would require unit vectors here… (?) Maybe you mean you need unit vectors for some other reason?

In any case, these commands should do the trick:

  1. split peaks file into individual peak vector images before computing the norm:

    $ mrconvert peaks.mif -coord 3 0:2 peak1.mif
    $ mrconvert peaks.mif -coord 3 3:5 peak2.mif
    $ mrconvert peaks.mif -coord 3 6:8 peak3.mif
  2. normalise each individual peak image:

    $ mrmath.exe peak1.mif -axis 3 norm - | mrcalc.exe peak1.mif - -div peak1_norm.mif

    Note that this uses both pipes and the ‘broadcasting’ feature in mrcalc (allowing processing of images of different dimensionality, as described in the last paragraph of the description) - I’m using the ‘broadcasting’ term here in the same sense as used in e.g. numpy.

    Repeat as necessary for peak2.mif, etc.

  3. merge files again (if needed - depends what you want to do):

    $ mrcat peak1_norm.mif peak2_norm.mif peak3_norm.mif -axis 3  peaks_norm.mif

Hope that does the trick…?

Yep everything worked well!
Thank you for your help!