[FieldTrip] reverse source interpolate?

Vitoria Piai v.piai.research at gmail.com
Fri Mar 14 07:48:43 CET 2014


Hi Erick,

I already wrote a FAQ yesterday: 
http://fieldtrip.fcdonders.nl/faq/how_can_i_map_source_locations_between_two_different_representations
Probably not as good as you or JM would have written it though (I'm no 
specialist), so please feel free to improve it! :)

Thanks for all the feedback, Vitória

On 3/14/2014 2:05 AM, Erick Ortiz wrote:
> 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 <mailto: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 <mailto: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
>>>>         <mailto: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 <mailto:fieldtrip at donders.ru.nl>
>>>>             http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>>>
>>>>
>>>>
>>>>
>>>>         _______________________________________________
>>>>         fieldtrip mailing list
>>>>         fieldtrip at donders.ru.nl  <mailto:fieldtrip at donders.ru.nl>
>>>>         http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>>
>>>
>>>         _______________________________________________
>>>         fieldtrip mailing list
>>>         fieldtrip at donders.ru.nl <mailto:fieldtrip at donders.ru.nl>
>>>         http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>>
>>>
>>>
>>>
>>>     _______________________________________________
>>>     fieldtrip mailing list
>>>     fieldtrip at donders.ru.nl  <mailto:fieldtrip at donders.ru.nl>
>>>     http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>>
>>     _______________________________________________
>>     fieldtrip mailing list
>>     fieldtrip at donders.ru.nl <mailto: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 <mailto:J.Schoffelen at donders.ru.nl>
>     Telephone: +31-24-3614793 <tel:%2B31-24-3614793>
>
>     http://www.hettaligebrein.nl
>
>
>     _______________________________________________
>     fieldtrip mailing list
>     fieldtrip at donders.ru.nl <mailto:fieldtrip at donders.ru.nl>
>     http://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>
>
>
>
> _______________________________________________
> 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/b25771de/attachment.html>


More information about the fieldtrip mailing list