fphammerle / freesurfer-surface

Python Library to Read and Write Surface Files in Freesurfer's TriangularSurface Format
https://pypi.org/project/freesurfer-surface/
GNU General Public License v3.0
8 stars 0 forks source link
brain cortex freesurfer gyrus mesh neuroimaging surface

freesurfer-surface

.. image:: https://img.shields.io/badge/code%20style-black-000000.svg :target: https://github.com/psf/black .. image:: https://github.com/fphammerle/freesurfer-surface/workflows/tests/badge.svg :target: https://github.com/fphammerle/freesurfer-surface/actions .. image:: https://ipfs.io/ipfs/QmP8k5H4MkfspFxQxdL2kEZ4QQWQjF8xwPYD35KvNH4CA6/20230429T090002+0200/s3.amazonaws.com/assets.coveralls.io/badges/coveralls_100.svg :target: https://github.com/fphammerle/freesurfer-surface/actions .. image:: https://img.shields.io/pypi/v/freesurfer-surface.svg :target: https://pypi.org/project/freesurfer-surface/#history .. image:: https://img.shields.io/pypi/pyversions/freesurfer-surface.svg :target: https://pypi.org/project/freesurfer-surface/ .. image:: https://zenodo.org/badge/185943856.svg :target: https://zenodo.org/badge/latestdoi/185943856

Python Library to Read and Write Surface Files in Freesurfer’s TriangularSurface Format

Freesurfer https://surfer.nmr.mgh.harvard.edu/

Install

.. code:: sh

pip3 install --user freesurfer-surface

Usage

Read Surface File


.. code:: python

    from freesurfer_surface import Surface

    surface = Surface.read_triangular('bert/surf/lh.pial')

    for vertex in surface.vertices[:3]:
        print(vertex)

    vertex_0 = surface.vertices[0]
    print('coordinates of vertex #0:', (vertex_0.right, vertex_0.anterior, vertex_0.superior))

    for triangle_index, triangle in enumerate(surface.triangles[:4]):
        print(f'\ntriangle #{triangle_index}:')
        print('vertex indices:', triangle.vertex_indices)
        print('vertex coordinates:')
        for vertex in surface.select_vertices(triangle.vertex_indices):
            print((vertex.right, vertex.anterior, vertex.superior))

Edit Surface File

.. code:: python

from freesurfer_surface import Surface, Vertex, Triangle
surface = Surface.read_triangular('bert/surf/lh.pial'))
vertex_a = surface.add_vertex(Vertex(0.0, 0.0, 0.0))
vertex_b = surface.add_vertex(Vertex(1.0, 1.0, 1.0))
vertex_c = surface.add_vertex(Vertex(2.0, 2.0, 2.0))
surface.triangles.append(Triangle((vertex_a, vertex_b, vertex_c)))
surface.write_triangular('somewhere/else/lh.pial')

List Labels in Annotation File


.. code:: python

    from freesurfer_surface import Annotation

    annotation = Annotation.read('tests/subjects/fabian/label/lh.aparc.annot')
    for label in annotation.labels.values():
        print(label.index, label.hex_color_code, label.name)

or

.. code:: sh

    $ freesurfer-annotation-labels tests/subjects/fabian/label/lh.aparc.annot
    index  color    name
    0      #190519  unknown
    1      #196428  bankssts
    2      #7d64a0  caudalanteriorcingulate
    3      #641900  caudalmiddlefrontal
    ...
    33     #4614aa  temporalpole
    34     #9696c8  transversetemporal
    35     #ffc020  insula

Find Border of Labelled Region

.. code:: python

from freesurfer_surface import Surface
surface = Surface.read_triangular('bert/surf/lh.pial'))
surface.load_annotation_file('bert/label/lh.aparc.annot')
region, = filter(lambda l: l.name == 'precentral',
                 annotation.labels.values())
print(surface.find_label_border_polygonal_chains(region))

Tests

.. code:: sh

pip3 install --user pipenv
git clone https://github.com/fphammerle/freesurfer-surface.git
cd freesurfer-surface
pipenv run pylint freesurfer_surface
pipenv run pytest --cov=freesurfer_surface