[FieldTrip] reverse source interpolate?

Vitoria Piai v.piai.research at gmail.com
Wed Mar 12 17:50:00 CET 2014


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
> http://mailman.science.ru.nl/mailman/listinfo/fieldtrip

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20140312/c18a913d/attachment-0001.html>


More information about the fieldtrip mailing list