[FieldTrip] [full-message] Failure to import cortical surface extracted with Freesurfer into Matlab using ft_read_headshape

Darinka Trübutschek darinkat87 at gmail.com
Thu May 2 13:50:52 CEST 2019


Dear Jan-Mathijs,

many thanks for this! Your patched version of the read_surf function indeed
works for me - so, many thanks for your help!

I have already contacted the freesurfer folks to inform them about the
issue and will look into whether this might warrant a more general update
on their side, too.

Again, thanks a lot and all the best,
Darinka

On Thu, May 2, 2019 at 8:56 AM Schoffelen, J.M. (Jan Mathijs) <
jan.schoffelen at donders.ru.nl> wrote:

> Hi Darinka,
>
> If I comment out one of the ‘fgets’ I can read the file. I suggest you
> check whether your reported issue is an isolated one, i.e. it only occurs
> in this specific file,  or a more general. If the latter, I’d contact the
> freesurfer people to make them aware of the problem. Even better would be
> to provide them with a patched version of read_surf.m (based on the
> slightly more recent version they host on
> https://github.com/freesurfer/freesurfer), where code improvements can be
> suggested by means of a Pull Request. A not so elegant solution would be,
> to check whether the vnum and fnum are integers, and if not, rewind to the
> beginning of the file and do the reading with a single fgets.
>
> Below screenshot shows some (old) documentation about the fileformat I
> found online. It seems that in your file the comment is terminated by a
> single “\n”, and not by two of them, as is expected currently in read_surf.
> It may be that Freeview etc. did not suffer, because it is more robust.
>
> Further below, I have pasted a version of read_surf (based on the latest
> version of the freesurfer repo) that should work in your case.
>
> Best wishes,
> Jan-Mathijs
>
>
>
> %%%%%%%%%%%%%%%%%%%%%
> % PATCHED VERSION
>
> function [vertex_coords, faces, magic] = read_surf(fname)
> %
> % [vertex_coords, faces] = read_surf(fname)
> % reads a the vertex coordinates and face lists from a surface file
> % note that reading the faces from a quad file can take a very long
> % time due to the goofy format that they are stored in. If the faces
> % output variable is not specified, they will not be read so it
> % should execute pretty quickly.
> %
>
>
>
>
> %
> % read_surf.m
> %
> % Original Author: Bruce Fischl
> % CVS Revision Info:
> %    $Author: fischl $
> %    $Date: 2014/04/30 12:59:03 $
> %    $Revision: 1.7 $
> %
> % Copyright © 2011 The General Hospital Corporation (Boston, MA) "MGH"
> %
> % Terms and conditions for use, reproduction, distribution and contribution
> % are found in the 'FreeSurfer Software License Agreement' contained
> % in the file 'LICENSE' found in the FreeSurfer distribution, and here:
> %
> % https://surfer.nmr.mgh.harvard.edu/fswiki/FreeSurferSoftwareLicense
> %
> % Reporting: freesurfer at nmr.mgh.harvard.edu
> %
>
>
>
>
> %fid = fopen(fname, 'r') ;
> %nvertices = fscanf(fid, '%d', 1);
> %all = fscanf(fid, '%d %f %f %f %f\n', [5, nvertices]) ;
> %curv = all(5, :)' ;
>
>
> % open it as a big-endian file
>
>
>
>
> %QUAD_FILE_MAGIC_NUMBER =  (-1 & 0x00ffffff) ;
> %NEW_QUAD_FILE_MAGIC_NUMBER =  (-3 & 0x00ffffff) ;
>
>
> TRIANGLE_FILE_MAGIC_NUMBER =  16777214 ;
> QUAD_FILE_MAGIC_NUMBER =  16777215 ;
> NEW_QUAD_FILE_MAGIC_NUMBER =  16777213 ;
>
>
> fid = fopen(fname, 'rb', 'b') ;
> if (fid < 0)
>   str = sprintf('could not open surface file %s.', fname) ;
>   error(str) ;
> end
> magic = fread3(fid) ;
>
>
> if((magic == QUAD_FILE_MAGIC_NUMBER) | (magic ==
> NEW_QUAD_FILE_MAGIC_NUMBER))
>   vnum = fread3(fid) ;
>   fnum = fread3(fid) ;
>   vertex_coords = fread(fid, vnum*3, 'int16') ./ 100 ;
>   if (nargout > 1)
>     for i=1:fnum
>       for n=1:4
>   faces(i,n) = fread3(fid) ;
>       end
>     end
>   end
> elseif (magic == TRIANGLE_FILE_MAGIC_NUMBER)
>   fgets(fid) ;
>   fgets(fid) ;
>   vnum = fread(fid, 1, 'int32') ;
>   fnum = fread(fid, 1, 'int32') ;
>   % possibly the comment line was not followed by two \n’s, this patch is
> suggested by J.M.Schoffelen, 20190502
>   if ~isa(vnum, 'int32') || ~isa(fnum, 'int32’)
>     frewind(fid);
>     fread3(fid);
>     fgets(fid);
>     vnum = fread(fid, 1, 'int32') ;
>     fnum = fread(fid, 1, 'int32') ;
>   end
>   vertex_coords = fread(fid, vnum*3, 'float32') ;
>   if (nargout > 1)
>     faces = fread(fid, fnum*3, 'int32') ;
>     faces = reshape(faces, 3, fnum)' ;
>   end
> else
>   fprintf('ERROR: magic number %d unknown\n',magic);
>   vertex_coords = [];
>   faces = [];
>   return;
> end
>
>
> vertex_coords = reshape(vertex_coords, 3, vnum)' ;
> fclose(fid) ;
>
>
>
>
>
> On 1 May 2019, at 16:56, Darinka Trübutschek <darinkat87 at gmail.com> wrote:
>
> Dear Jan,
>
> thanks for your reply.
>
> Yes, I can confirm that I am calling the read_surf function included with
> the fieldtrip toolbox. I think the problem (perhaps specific to me?) might
> arise from the fact that the surface files I recently generated with
> freesurfer (e.g., the attached lh.pial from sample subject bert) differ
> slightly in their format from previous ones?
>
> For example, when reading in a previously generated file (that works) into
> matlab using the read_surf function from fieldtrip, I get the following:
>
> fid = fopen(fname, 'rb', 'b') ;
> if (fid < 0)
>   str = sprintf('could not open curvature file %s.', fname) ;
>   error(str) ;
> end
> magic = fread3(fid) ;
>
> magic = 16777214;
>
> >> a = fgets(fid);
> >> a
>
> a =
>
>     'created by dante on Fri Jul 20 21:37:20 2018
>      '
> >> b = fgets(fid);
> >> b
>
> b =
>
>     '
>      '
>
> >>   vnum = fread(fid, 1, 'int32') ;
>   fnum = fread(fid, 1, 'int32') ;
> >> vnum
>
> vnum =
>
>       147285
>
> >> fnum
>
> fnum =
>
>       294566
> When I do the same with the surfaces I just generated (for example, for
> the attached lh_pial from sample subject bert), variable b no longer
> corresponds to a newline, but actually already contains some information.
>
> fname =
>
>     '/home/darinka/Test_Freesurfer/subjects/bert/surf/lh.pial'
>
> >> fid = fopen(fname, 'rb', 'b') ;
> if (fid < 0)
>   str = sprintf('could not open curvature file %s.', fname) ;
>   error(str) ;
> end
> magic = fread3(fid) ;
> >> a = fgets(fid);
> >> a
>
> a =
>
>     'created by darinka on Fri Apr  5 15:33:41 2019
>      '
> >> b = fgets(fid);
> >> b
>
> b =
>
>     ' XI ������� ����Z    ��s����%��g� D�\    ¾=��ٴ���� "�ZR�B@¾����(�¿5����.{#�T���
> ¾~��Z���P½���o��$¾@��h ���¾� ��
>      '
>
> >>
>
> >>   vnum = fread(fid, 1, 'int32') ;
>   fnum = fread(fid, 1, 'int32') ;
> >> vnum
>
> vnum =
>
>   -1.0516e+09
>
> >> fnum
>
> fnum =
>
>   -1.0276e+09
>
> I am not sure as to why exactly this discrepancy seems to exist
> (especially given that the visualization in freeview works fine for either
> one) and whether it is specific to my setup or something more general, but
> I was hoping that someone with more expertise in these specific functions
> might be able to point me in the right direction?
>
> Again, many thanks for your help and all the best,
> Darinka
>
>
>
>
> On Wed, May 1, 2019 at 3:28 PM Schoffelen, J.M. (Jan Mathijs) <
> jan.schoffelen at donders.ru.nl> wrote:
>
>> Hi Darinka,
>>
>> I cannot confirm your problem, although admittedly I have used different
>> software versions (matlab/fieldtrip/freesurfer) etc.
>> The problem seems to occur in read_surf, which is not maintained by us,
>> but comes from the freesurfer folks. Can you confirm that the version of
>> read_surf that the call to ft_read_headshape ends up using is in
>> external/freesurfer?
>>
>>
>> best wishes,
>> Jan-Mathijs
>>
>>
>> On 1 May 2019, at 14:56, Darinka Trübutschek <darinkat87 at gmail.com>
>> wrote:
>>
>> Dear fieldtrip community,
>>
>> Sorry for double-posting - my original message somehow seems to have been
>> cut short...
>>
>>
>> I am currently trying to import cortical surfaces extracted with
>> freesurfer (version: freesurfer-linux-centos7_x86_64-dev-20190403-dacefd1)
>> into Matlab (version: R2018b) using the fieldtrip function
>> ft_read_headshape (version: 20190329). All of this is run in an Ubuntu
>> 18.04.2 LTS environment. While all of the extracted surfaces seem fine upon
>> visual inspection in freeview, the import into Matlab fails, throwing the
>> following error message:
>>
>> pial = ft_read_headshape('freesurfer/surf/lh.pial');
>> Error using fread
>> Invalid size.
>>
>> Error in read_surf (line 72)
>>   vertex_coords = fread(fid, vnum*3, 'float32') ;
>>
>> Error in ft_read_headshape (line 909)
>>     [pos, tri] = read_surf(filename);
>>
>> It is most certainly related to the fact that, both for the number of
>> vertices (vnum) and the number of faces (fnum), the function read_surf
>> returns non-sensible (?) values (i.e., vnum = -1.0263e+09 and fnum  =
>> -1.0529e+09). The same code produces no error when run on the same pial
>> surface extracted with a different version of freesurfer
>> (freesurfer-Linux-centos6_x86_64-stable-pub-v6.0.0-2beb96c) in a different
>> Ubuntu environment (Ubuntu 16.04 LTS).
>>
>> As visual inspection in Freeview of the 2 surfaces from the two different
>> Freesurfer versions reveals no obvious differences, I am therefore at a
>> loss as where exactly to start to fix this problem and would be grateful
>> for any help.
>>
>> Many thanks!
>> Darinka
>>
>> --
>> Darinka Trübutschek, PhD
>>
>> Department of Experimental Psychology
>> Anna Watts Building
>> Radcliffe Observatory Quarter
>> Woodstock Road
>> Oxford, OX2 6GG
>> UK
>>
>> website: https://sites.google.com/site/dtruebutschek/
>> _______________________________________________
>> fieldtrip mailing list
>> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>> https://doi.org/10.1371/journal.pcbi.1002202
>>
>>
>> _______________________________________________
>> fieldtrip mailing list
>> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
>> https://doi.org/10.1371/journal.pcbi.1002202
>>
>
>
> --
> Darinka Trübutschek, PhD
>
> Department of Experimental Psychology
> Anna Watts Building
> Radcliffe Observatory Quarter
> Woodstock Road
> Oxford, OX2 6GG
> UK
>
> website: https://sites.google.com/site/dtruebutschek/
> <lh.pial>
>
>
> _______________________________________________
> fieldtrip mailing list
> https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
> https://doi.org/10.1371/journal.pcbi.1002202
>


-- 
Darinka Trübutschek, PhD

Department of Experimental Psychology
Anna Watts Building
Radcliffe Observatory Quarter
Woodstock Road
Oxford, OX2 6GG
UK

website: https://sites.google.com/site/dtruebutschek/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20190502/5b380423/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Screen Shot 2019-05-02 at 09.26.55.png
Type: image/png
Size: 359603 bytes
Desc: not available
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20190502/5b380423/attachment-0002.png>
-------------- next part --------------
_______________________________________________
fieldtrip mailing list
https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
https://doi.org/10.1371/journal.pcbi.1002202


More information about the fieldtrip mailing list