[FieldTrip] reverse source interpolate?

Erick Ortiz erick.ortiz at med.uni-tuebingen.de
Fri Mar 14 02:05:23 CET 2014


Thanks for shedding light on the issue, JM: I tested your suggestion and it
worked brilliantly, far faster and more elegant than the script I wrote
years ago. (in my defense, it was only run a couple of times, to label our
standard grids...)

The old mni2tal question creeps again into the discussion. I would like to
use the AFNI atlas, but the conversion introduces too much distortion. For
the others (AAL, SPM17/18, Brainweb), all is fine. See attached figure
comparing AFNI (blue) with Brainweb grey_matter (red).

I might get around to add this to the FAQ next week. :-)

Vitória, there is a number of other atlases you can use instead of AFNI
then. Either from the link below or any MNI-aligned template, using JM's
procedure now it takes 3 seconds to re-label your grid.
http://fieldtrip.fcdonders.nl/template/atlas

Best,
Erick



On Thu, Mar 13, 2014 at 1:00 PM, jan-mathijs schoffelen <
jan.schoffelen at donders.ru.nl> wrote:

> Hi Vitória, Erick, Cornelius et al,
>
> Allow me to chime in to this Brazilio-German interaction ;-).
> It seems to me that the discussion consists of a few separable elements.
>
> -The first one pertains to the specific question how to map source
> locations between two different representations (source with pos versus
> volumetric MRI-type image with a transform).
> -The other one relates to some atlas related business, i.e. mapping
> locations that have a specific anatomical label to specific MEG source
> space locations.
> -And then there's a third one, which is important for 2, and pertains to
> the usual complicated stuff of mapping between different coordinate systems.
>
> There are several ways to achieve what Vitória is looking for, and I think
> that Erick already solved it, but recent changes in FieldTrip make it quite
> straightforward.
>
> So here goes my recipe:
> 1 I would go along with Erick to do my beamformer source reconstruction on
> a subject-specific grid, which is inverse-warped from a regular grid
> defined on the MNI-template.
> 2 If we take this template grid, which can be found in
> ~/fieldtrip/template/sourcemodel, you can interpolate the atlas of your
> choice onto this sourcemodel, using ft_sourceinterpolate. Reading in of the
> atlas nowadays indeed should be done with ft_read_atlas (ft_prepare_atlas
> will be deprecated soon), and my personal taste would be NOT to use the
> afni atlas, because this one is defined in Talairach space, which is
> slightly different from MNI-space, and although FT accounts for the
> differences I am not sure how accurate this is. Anyway, one could do
> something like atlas = ft_read_atlas('~/fieldtrip/template/atlas/....'),
> load the template sourcemodel with the resolution you need (i.e. the
> resolution you used in your beamformer grid), and call
> ft_sourceinterpolate: cfg = []; cfg.interpmethod = 'nearest'; cfg.parameter
> = 'tissue'; sourcemodel2 = ft_sourceinterpolate(cfg,atlas,sourcemodel); %
> NOTE: ensure that the units are consistent in atlas and sourcemodel, if not
> use ft_convert_units
> 3 Step 2 should have given you sourcemodel2 with a field 'tissue', that
> represents the anatomical labels, according to the corresponding atlas.
> Atlas.tissuelabel gives the labels that correspond to the numbers in the
> tissue field.
> 4 Then, without the need to call ft_sourceinterpolate, nor
> ft_volumenormalise on your source-reconstructed data, you can do indx =
> find(sourcemodel2.tissue==x), where x is the number of your choice, and you
> directly get the indices of the source positions in your 'source' variable,
> that have this particular anatomical label.
> 5 Then, you can do whatever you like with it, e.g. take a max or mean or
> whatever...
>
> I hope I was clear enough, and that someone feels inclined to make this
> into a FAQ on the FieldTrip wiki ;-).
>
> Best wishes,
> Jan-Mathijs
>
>
>
> On Mar 12, 2014, at 5:50 PM, Vitoria Piai wrote:
>
>  Dear Erick,
>
> "simply label and/or define my ROI in the MNI grid. When I warp to the
> individuals, everything is in place without a hitch" -> that sounds like a
> good thing to do.
> Is this a very complicated thing to do? Would you mind sharing a piece of
> code or some tips for how I could achieve it?
>
> Thanks once more, Vitória
>
> On 3/12/2014 11:37 AM, Erick Ortiz wrote:
>
>   Dear Vitoria,
>
>  What I do usually, is to simply label and/or define my ROI in the MNI
> grid. When I warp to the individuals, everything is in place without a
> hitch.
>
>  About the interpolation, I cannot help much more. I have been using my
> own tools for years, and I was not following the support of atlases in
> Fieldtrip.I tried it today, but had issues with coordinate system labeling
> when defining a ROI (I updated to the latest version by SVN):
>
> afni = ft_read_atlas('template/atlas/afni/TTatlas+tlrc.HEAD');
> cfg              = [];
> cfg.method       = 'ortho';
> cfg.interactive  = 'yes';
> cfg.funparameter = 'coh';
> cfg.atlas        = afni;
> cfg.coordsys     = 'mni';
> % cfg.roi          = 'Middle Temporal Gyrus';
> % cfg.inputcoord   = 'tal';
> ft_sourceplot(cfg, interp);
>
> Also note that I had to use ft_read_atlas, because ft_prepare_atlas does
> not generate the brick0label/brick1label fields.
>
>  It works well, but if I try to define a ROI (uncommenting the two lines),
> I get the error "The field cfg.inputcoord is required". There seems to be
> some confusion between inputcoord and coordsys.
>
> It can be because I was doing something wrong: maybe a Fieldtrip developer
> could comment on that?
>
>  Best,
> Erick
>
>
>
>  On Wed, Mar 12, 2014 at 9:24 AM, Vitoria Piai <v.piai.research at gmail.com>wrote:
>
>>  Dear Erick,
>>
>> Thanks for your detailed reply.
>> I've been using individual MNI-warped grids (point 4 below) and I'm
>> always using ft_convert_unit so those points are alright in my data.
>>
>> The reason why I do need to interpolate (at least, I think I need), is
>> because I'm looking for max 'pow' in anatomically defined regions given the
>> afni atlas. I managed to get it to work by interpolating to the mri and
>> looking for max 'pow' given a label (e.g., 'Middle Temporal Gyrus') using
>> ft_volumelookup.
>> Do you have any experience with this approach (searching within
>> anatomical labels) without having to interpolate?
>>
>> Thanks once more, Vitória
>>
>>
>>
>>
>> On 3/11/2014 6:35 PM, Erick Ortiz wrote:
>>
>> Dear Vitória and Cornelius,
>>
>> this is a common problem, and maybe it would be good to clarify the
>> strategies that can be used here. I hope this can help others in a similar
>> situation, which I have found many times.
>>
>> 1) You are trying to convert voxel indexes to head (CTF) coordinates. In
>> this case, there are two mistakes in the code:
>> 1a) pos = warp_apply( pinv( sourceNAIInt.transform ), posInt,
>> 'homogeneous' );
>> ... should be done with sourceNAIInt, not mri. The transforms are
>> different, in general; e.g. note the downsample=2.
>> 1b) use cfg.locationcoordinates = 'head', as commented by JM in a
>> previous post. Or remove this line, since 'head' is the default.
>>
>> 2) But if you are working with the same subject/grid, there is no need
>> for interpolation at all. Simply find the grid position with highest 'pow'
>> and take its position.
>>     [dummy,ind] = max(source.avg.pow);
>>     pos = source.pos(ind,:);
>>
>> 3) However, this is not possible when using different grids, e.g. in a
>> grand average in MNI coordinates. Find the peak ('pos') in the interpolated
>> volume, as in Cornelius' code, then find the index of the nearest grid
>> position for a common (again, MNI) grid. This is also in JM's message.
>>
>> dpos = source.pos - repmat( pos, size(source.pos,1), 1 );
>> [dummy,ind] = min(sum(dpos.^2,2));
>>
>> 4) What I have been using, and strongly recommend, is an MNI grid warped
>> to the subject's anatomy, according to this procedure:
>>
>> http://fieldtrip.fcdonders.nl/example/create_single-subject_grids_in_individual_head_space_that_are_all_aligned_in_mni_space
>>
>> This would give you both the benefits of working in MNI coordinates, and
>> the ease of having a common grid across subjects (for instance, enabling
>> solution #2). Still, some projects do call for one of the other options.
>>
>> Just a couple of details:
>> - Pay utmost attention to coordinate systems and units. For instance, it
>> is common to confuse unlabeled cm for mm, and either of these with voxels.
>> Try to also label all structures as CTF or SPM (MNI).
>> - Using pinv instead of inv is usually a good idea. Here, it is a not an
>> issue, but matrix inversion in MATLAB can lead to a world of hurt to the
>> unwary.
>>
>> Best,
>> Erick
>>
>>
>>
>> On Tue, Mar 11, 2014 at 4:04 PM, Vitoria Piai <v.piai.research at gmail.com>wrote:
>>
>>>  Dear FT-ers,
>>>
>>> I found an old posting to the mailing list (see below) that never got
>>> answered so my question still holds: given a location I found in the
>>> interpolated source, how do I find back the same location in .pos of the
>>> non-interpolated data?
>>> I can try and go around it by finding the corresponding MNI coordinates
>>> in the interpolated data (which by now I have to do by hand, so not optimal
>>> anyways), and then look for those coordinates in .pos. But I was wondering,
>>> like Cornelius was in his post, whether there is a neater way to get this
>>> information.
>>>
>>> Thanks a lot for the help,
>>> Vitória
>>>
>>>
>>>    >>>>>>>>>>>>>>
>>>>
>>>> Hi mailing list,
>>>>
>>>> I'm still struggling with the conversion of coordinates between source
>>>> and
>>>> interpolated source space.
>>>> For example, if i have the position of a single grid point how do i get
>>>> the
>>>> corresponding voxel  in the interpolated source structure. Or the other
>>>> way
>>>> around, how to get the grid point which corresponds to a voxel (e.g the
>>>> max
>>>> voxel) in the interpolated source structure.
>>>>
>>>> I think this should be a common problem when working with virtual
>>>> electrodes, shouldn't it?
>>>>
>>>> To make things easier i put together a example with the data from the
>>>> source tutorial where i tried to calculated the grid pos of the max
>>>> voxel
>>>> in the interpolated source.
>>>>
>>>> clear all;
>>>> load sourcePost_nocon;               % source structure from tutorial
>>>> mri = ft_read_mri('Subject01.mri');  % mri of subject01 from tutorial
>>>>
>>>> sourceNAI = sourcePost_nocon;
>>>> sourceNAI.avg.pow = sourcePost_nocon.avg.pow ./
>>>> sourcePost_nocon.avg.noise;
>>>> sourceNAI=rmfield(sourceNAI,'freq'); % had to remove that to let
>>>>
>>>> cfg = [];
>>>> cfg.downsample = 2;
>>>> cfg.parameter = 'avg.pow';
>>>> sourceNAIInt = ft_sourceinterpolate(cfg, sourceNAI , mri);
>>>>
>>>> % Find position of max activity
>>>> [dum, maxindx] = max(sourceNAIInt.avg.pow(:));
>>>> [xi, yi, zi] = ind2sub(sourceNAIInt.dim, maxindx);
>>>> posInt=[xi, yi, zi];
>>>>
>>>> % Plot interpolated source with position of max activity
>>>> cfg              = [];
>>>> cfg.method       = 'ortho';
>>>> cfg.funparameter = 'avg.pow';
>>>> cfg.locationcoordinates = 'voxel';
>>>> cfg.location      = posInt;          % location of max activity is
>>>> marked
>>>> correctly.
>>>> figure;
>>>> ft_sourceplot(cfg,sourceNAIInt);
>>>>
>>>> % Transform coordinate back to uninterpolated source???
>>>> dpos = warp_apply(inv(mri.transform), posInt, 'homogeneous');
>>>>
>>>>
>>>> % Plot uninterpolated source with position aquired from interpolated
>>>> source
>>>> cfg              = [];
>>>> cfg.method       = 'ortho';
>>>> cfg.funparameter = 'avg.pow';
>>>> cfg.locationcoordinates = 'voxel';
>>>> cfg.location      = dpos;               % unfortunately this coordinate
>>>> is
>>>> obviously wrong!!! WHY?
>>>> figure;
>>>> ft_sourceplot(cfg,sourceNAI);
>>>>
>>>>
>>>> Unfortunately the solution of Jan Mathijs did not work, nor did mine :(
>>>>
>>>> Any ideas???
>>>>
>>>> Cornelius
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> fieldtrip mailing list
>>> fieldtrip at donders.ru.nl
>>> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>>
>>
>>
>>
>> _______________________________________________
>> fieldtrip mailing listfieldtrip at donders.ru.nlhttp://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>
>>
>>
>> _______________________________________________
>> fieldtrip mailing list
>> fieldtrip at donders.ru.nl
>> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>
>
>
>
> _______________________________________________
> fieldtrip mailing listfieldtrip at donders.ru.nlhttp://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>
>
>  _______________________________________________
> fieldtrip mailing list
> fieldtrip at donders.ru.nl
> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>
>
> Jan-Mathijs Schoffelen, MD PhD
>
> Donders Institute for Brain, Cognition and Behaviour,
> Centre for Cognitive Neuroimaging,
> Radboud University Nijmegen, The Netherlands
>
> Max Planck Institute for Psycholinguistics,
> Nijmegen, The Netherlands
>
> J.Schoffelen at donders.ru.nl
> Telephone: +31-24-3614793
>
> http://www.hettaligebrein.nl
>
>
> _______________________________________________
> fieldtrip mailing list
> fieldtrip at donders.ru.nl
> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20140314/53a5ea8e/attachment-0002.html>


More information about the fieldtrip mailing list