Login  Register

Re: T2* computation...

Posted by Fred Damen on Feb 07, 2020; 5:49pm
URL: http://imagej.273.s1.nabble.com/T2-computation-tp5022909p5022926.html

Greetings Gonzalo,

Nope, the compute method as specified, loops over every voxel in every
slice, save those excluded by mask, and produces a separate volume
(entries in the returned ImagePlus[]) for each returned parameter. There
are other F_Project methods that allow you to select a subset of both
slices and frames, see documentation and/or code.  Also, the 'loop' over
spatial voxels is threaded.

If you are doing only one time constant, the GUI interface is all you
need, albeit, if you desire a linearized fit, you will need to take the
natural log of the dataset first. (The theilsen linear regressor is more
resilient to noise/outliers than the least squares regressors).

mea cupla: The documentation wiki for F_Project does not explicitly state
that the slice label should be 'var = val' or 'var val' on the first slice
of each volume/frame for the 'val(s)' to be used as the independent
variable values passed as 'x'.

Enjoy,

Fred

On Fri, February 7, 2020 1:51 am, Gonzalo Rojas Costa wrote:

> Hi Fred:
>
> I need to compute T2* mapping for brain images... the adquisition has 120
> axial slices with 8 different TEs (GE protocol)... using your ImageJ
> plugin
> I could process one slice, but is  very tedious to compute the 120
> slices... is there any command line method (or other method) to automate
> the calculation ?
>
> Sincerely
>
>
> Gonzalo Rojas Costa
>
>
> El vie., 7 de febrero de 2020 05:04, Fred Damen <[hidden email]>
> escribió:
>
>> If you are looking to determine a single time constant, then I assume
>> either the plugin you had found or my plugins, that I selflessly
>> plugged,
>> should work.  If you are looking to determine two time constants then I
>> do
>> not know of any existing software specifically for this.  Osirix/Heros
>> might have something available; as these are DICOM / medical imaging
>> based
>> kitchen sinc tools.  Writing your own will be challenging unless the
>> time
>> constants are very different and you have plenty of SNR.  I have
>> attached
>> a plugin that I just scribbled together that might work. I have not even
>> tried to compile it, but most of it is cut and pasted from existing
>> code.
>> Use at your own risk. At least it is a starting point.
>>
>> Curious, why use GE for this and what are you going to do wtih T2(?)
>> once
>> determined?
>>
>> Fred
>>
>>
>> import ij.*;
>> import ij.process.*;
>> import ij.gui.*;
>> import java.awt.*;
>> import ij.plugin.*;
>> import ij.plugin.frame.*;
>>
>> public class T2s_fit implements PlugIn {
>>
>>    public void run(String arg) {
>>       ImagePlus imp = IJ.getImage();
>>
>>       ImagePlus mask = (new
>> Duplicator()).run(imp,1,1,1,imp.getNSlices(),1,1);
>>       IJ.run(mask, "32-bit", "");
>>       IJ.run(mask,"Convert to Mask", "method=Huang background=Default
>> calculate");
>>       IJ.run(mask, "Fill Holes", "stack");
>>
>>       ImagePlus[] pimps = F_Project.compute(imp, new F_Project.Compute()
>> {
>>            @Override
>>            public double[] compute(double[] x, double[] y) {
>>               if (x == null) return new double[4];
>>
>>               int demarcation = // frame # where faster timeconstant
>> signal below noise
>>               double[][] xy = arrSubSet(x,arrln(y),new
>> int[]{demarcation,x.length-1});
>>               double mbslow = F_Project.theilsen(xy[0],xy[1]);
>>               double T2slow = -mbslow[0];
>>               double S0slow = Math.exp(mbslow[1]);
>>               xy = arrSubSet(x,arrDiff(y,signal(x,T2slow,S0slow)),new
>> int[]{0,demarcation});
>>               double mbfast = F_Project.theilsen(xy[0],xy[1]);
>>               double T2fast = -mbfast[0];
>>               double S0fast = Math.exp(mbfast[1]);
>>               return new double[]{T2slow,T2fast,S0slow,S0fast};
>>
>>               }
>>            }, mask, new ImagePlus[0]);
>>
>>       for(pimp : pimps)
>>          pimp.show();
>>       }
>>
>>    public static double[] signal(double[] ts, double tau, double S0) {
>>       double[] S = new double[ts.length];
>>       for(int i=0; i<ts.length; i)
>>          S[i] = S0*Math.exp(-ts[i]/tau);
>>       return S;
>>       }
>>    public static double[][] arrSubSet(double[] x, double[] y, int[] r) {
>>       if (r[1]<r[0]) return new double[2][0];
>>       double[][] ans = new double[2][r[1]-r[0]+1];
>>       for(int i=0; i<ans[0].length; i++) {
>>          ans[0][i] = x[i+r[0]];
>>          ans[1][i] = y[i+r[0]];
>>          }
>>       return ans;
>>       }
>>    public static double[] arrDiff(double[] a, double[] b) {
>>       double[] ans = new double[a.length];
>>       for(int i=0; i<a.length; i++) {
>>          ans[i] = a[i] - b[i];
>>          }
>>       return ans;
>>       }
>>    public static double[] arrln(double[] a) {
>>       double[] ans = new double[a.length];
>>       for(int i=0; i<a.length; i++) {
>>          ans[i] = Math.log(a[i]);
>>          }
>>       return ans;
>>       }
>> }
>>
>>
>>
>>
>> On Wed, February 5, 2020 2:14 am, Gonzalo Rojas Costa wrote:
>> > Hi Fred:,
>> >
>> > Thanks you very much for your detailed answers...
>> >
>> > I have gradient echo images for T2* mapping with 8 equally spaced
>> different TE values... could you please tell me which imagej plugin or
>> other software could I use to compute T2 mapping (T2* mapping)?
>> >
>> > Sincerely
>> >
>> >
>> > Gonzalo Rojas Costa
>> >
>> >
>> > El mié., 5 de febrero de 2020 02:36, Fred Damen <[hidden email]>
>> escribió:
>> >
>> >> Greetings Gonzalo,
>> >>
>> >> If you tell me what you are conceptually trying to accomplish, I
>> could
>> better guide you.
>> >>
>> >> Technically, all MR images are T2* weighted, as R2* (1/T2*) is the
>> observed rate at which the MR signal attenuates due to the spins
>> dephasing. Using a spin-echo sequence, the spins dephased by deltaB0 are
>> rephased during image acquisition window and thus eliminates the T2'
>> information from the image; thus making spin-echo the acquisition method
>> of choice for T2 mapping.  If using a gradient echo sequence is a
>> requirement, then I assume that you can acquire enough images with
>> properly spaced TE(s) such that you can do a bi-exponential fit to
>> extract
>> >> both T2 and T2'.  Although note, that deltaB0 causes
>> >> blurring/displacement
>> >> in addition to signal attenuation.
>> >>
>> >> Enjoy,
>> >>
>> >> Fred
>> >>
>> >> On Mon, February 3, 2020 2:53 pm, Gonzalo Rojas Costa wrote:
>> >> > Hi Fred:
>> >> >
>> >> > For T2* mapping I mean T2 mapping for gradient echo sequence...
>> >> >
>> >> > Sincerely,
>> >> >
>> >> >
>> >> > Gonzalo Rojas Costa
>> >> >
>> >> >
>> >> > El lun., 3 de febrero de 2020 21:06, Fred Damen <[hidden email]>
>> escribió:
>> >> >
>> >> >> Greetings,
>> >> >>
>> >> >> It depends on what exactly what you mean by T2* mapping?
>> >> >>
>> >> >> If you are referring to determining the time constant then the
>> same
>> >> post
>> >> >> processing plugin will work.  1/T2* = 1/T2 + 1/T2'; A spin echo
>> pulse sequence eliminates, i.e, reduces to negligible level, the T2'
>> >> component
>> >> >> leaving just the T2 component.  A gradient echo sequence includes
>> the T2'
>> >> >> component.
>> >> >>
>> >> >> If you are referring to creating deltaB0 map, then you need to do
>> a
>> linear
>> >> >> fit to the phase image, albeit with special handling of the phase
>> >> wrap.
>> >> >> I
>> >> >> have a plugin for this. (I have not yet dressed the code up for
>> >> release
>> >> >> though)
>> >> >>
>> >> >> If you are referring to Susceptibility Weighted Imaging, I do not
>> >> know
>> >> >> of
>> >> >> a ImageJ plugin, albeit there are other tools out there.
>> >> >>
>> >> >> Enjoy,
>> >> >>
>> >> >> Fred
>> >> >>
>> >> >> On Mon, February 3, 2020 12:44 pm, Gonzalo Rojas Costa wrote:
>> >> >> > Hi:
>> >> >> >
>> >> >> >   Which plugin computes T2* mapping ?.. Because "MRI Analysis
>> >> >> Calculator
>> >> >> > v1.0" only computes T2 mapping...
>> >> >> >
>> >> >> >   Sincerely,
>> >> >> >
>> >> >> >
>> >> >> > Gonzalo Rojas Costa
>> >> >> > Chair LABMAN (OHBM)
>> >> >> >
>> >> >> > Laboratory for Advanced Medical Image Processing
>> >> >> > Department of Radiology
>> >> >> > Health Innovation Center
>> >> >> > Clínica las Condes
>> >> >> > Lo Fontecilla 441, Las Condes, Santiago, Chile.
>> >> >> > Tel: 56-2-2105170
>> >> >> > Cel: 56-9-97771785
>> >> >> > http://www.aribrain.info
>> >> >> > https://scholar.google.com/citations?user=LO7LZ3oAAAAJ
>> >> >> > https://www.researchgate.net/profile/Gonzalo_Rojas2
>> >> >> > http://www.researcherid.com/rid/B-2036-2013
>> >> >> > https://cl.linkedin.com/in/gonzalorojascosta
>> >> >> >
>> >> >> > --
>> >> >> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>> >> >> >
>> >> >>
>> >> >> --
>> >> >> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>> >> >>
>> >> >
>> >> > --
>> >> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>> >> >
>> >>
>> >> --
>> >> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>> >>
>> >
>> > --
>> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>> >
>>
>> --
>> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>>
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html