Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
*.pyc
MANIFEST
pyxnat.egg-info/
bbrc_pyxnat.egg-info/
build/
dist/
*.DS_Store*
Expand Down
68 changes: 64 additions & 4 deletions pyxnat/core/derivatives/donsurf.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,68 @@
XNAT_RESOURCE_NAME = 'DONSURF'


def aparc(self):
"""Returns cortical features as estimated by `DONSURF`."""
def aparc(self, metric='GM-MD'):
"""
Retrieves cortical features as estimated by `DONSURF`.

from .freesurfer import aparc as fs_aparc
return fs_aparc(self)
Parameters
----------
metric : str, optional
DONSURF metric to retrieve aparc statistics for. Available metrics
are 'GM-MD', 'GM-MD-koo', and 'SWM-MD'. Defaults to 'GM-MD'.

Returns
-------
pandas.DataFrame
Cortical DONSURF features for the selected `metric`.
"""

import pandas as pd

volumes = ['BrainSegVol', 'BrainSegVolNotVent', 'BrainSegVolNotVentSurf',
'CortexVol', 'SupraTentorialVol', 'SupraTentorialVolNotVent',
'eTIV']
unitless = ['NumVert']
surfaces = ['WhiteSurfArea']
thickness = ['MeanThickness']
columns = ['StructName', 'NumVert', 'SurfArea', 'GrayVol', 'ThickAvg',
'ThickStd', 'MeanCurv', 'GausCurv', 'FoldInd', 'CurvInd']

table = []
if metric not in ['GM-MD', 'SWM-MD', 'GM-MD-koo']:
raise Exception(f'Invalid DONSURF metric "{metric}".')

files = list(self.files(f'{metric}/stats/*h.aparc.stats'))
for f in files:

uri = f._uri
side = {'l': 'left', 'r': 'right'}[uri.split('/')[-1][0]]

res = self._intf.get(uri).text.split('\n')

res2 = [e for e in res if e.startswith('# Measure ')]

measurements = {'Volume_mm3': volumes,
'Thickness_mm': thickness,
'SurfArea_mm2': surfaces,
'unitless': unitless}

for unit, data in measurements.items():
for each in data:
m = [e for e in res2 if each == e.split(', ')[1]]
if len(m) == 1:
m = float(m[0].split(', ')[-2])
table.append([None, unit, each, m])

res2 = [e for e in res if not e.startswith('#')]
d2 = [[each for each in e.split(' ') if each != ''] for e in res2]
d2 = pd.DataFrame(d2, columns=columns).dropna()
d3 = d2.set_index('StructName').to_dict()

for m, aparc in d3.items():
for region, value in aparc.items():
row = [side, m, region, value]
table.append(row)

columns = ['side', 'measurement', 'region', 'value']
return pd.DataFrame(table, columns=columns)
2 changes: 1 addition & 1 deletion pyxnat/core/derivatives/validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def extract_snapshots(fp):
for page in range(len(doc)):
xrefs.extend([img[0] for img in doc.get_page_images(page)])
xrefs = sorted(set(xrefs))
for k, xref in enumerate(xrefs[1:]):
for k, xref in enumerate(xrefs):
pix = fitz.Pixmap(doc, xref)
fp_snap = op.join(dn, "{}_{}.png".format(bn, k))
if pix.n >= 5: # CMYK: convert to RGB first
Expand Down
15 changes: 9 additions & 6 deletions pyxnat/tests/test_resource_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,15 @@ def test_cat12_volumes():

def test_donsurf():
r = e1.resource('DONSURF')
st = r.aparc()
left = float(st.query('measurement == "CurvInd" &'\
'region == "insula" & side == "left"')['value'])
right = float(st.query('measurement == "CurvInd" &'\
'region == "insula" & side == "right"')['value'])
assert(left == 15.7 and right == 15.8)
gm_md = r.aparc()
gm_md_pvc = r.aparc(metric='GM-MD-koo')
q = 'measurement == "ThickAvg" & region == "entorhinal" & side == "{side}"'
left = float(gm_md.query(q.format(side='left')).value.iloc[0])
right = float(gm_md.query(q.format(side='right')).value.iloc[0])
left_pvc = float(gm_md_pvc.query(q.format(side='left')).value.iloc[0])
right_pvc = float(gm_md_pvc.query(q.format(side='right')).value.iloc[0])
assert left == 7.25 and right == 7.534
assert left > left_pvc and right > right_pvc


def test_freesurfer7_extras_brainstem_volumes():
Expand Down
Loading