@@ -1447,7 +1447,6 @@ def init_morph_grayords_wf(
1447
1447
thickness_fsLR
1448
1448
HCP-style thickness file in CIFTI-2 format, resampled to fsLR
1449
1449
"""
1450
- import templateflow .api as tf
1451
1450
from niworkflows .engine .workflows import LiterateWorkflow as Workflow
1452
1451
1453
1452
from smriprep .interfaces .cifti import GenerateDScalar
@@ -1458,8 +1457,6 @@ def init_morph_grayords_wf(
1458
1457
resampled onto fsLR using the Connectome Workbench [@hcppipelines].
1459
1458
"""
1460
1459
1461
- fslr_density = '32k' if grayord_density == '91k' else '59k'
1462
-
1463
1460
inputnode = pe .Node (
1464
1461
niu .IdentityInterface (
1465
1462
fields = [
@@ -1498,18 +1495,121 @@ def init_morph_grayords_wf(
1498
1495
name = 'outputnode' ,
1499
1496
)
1500
1497
1501
- atlases = smriprep .load_data ('atlases' )
1498
+ for metric in ('curv' , 'sulc' , 'thickness' ):
1499
+ resample_and_mask_wf = init_resample_and_mask_wf (
1500
+ grayord_density = grayord_density ,
1501
+ omp_nthreads = omp_nthreads ,
1502
+ mem_gb = 1 ,
1503
+ name = f'resample_and_mask_{ metric } _wf' ,
1504
+ )
1505
+ cifti_metric = pe .JoinNode (
1506
+ GenerateDScalar (grayordinates = grayord_density , scalar_name = metric ),
1507
+ name = f'cifti_{ metric } ' ,
1508
+ joinfield = ['scalar_surfs' ],
1509
+ joinsource = 'hemisource' ,
1510
+ )
1511
+
1512
+ workflow .connect ([
1513
+ (inputnode , resample_and_mask_wf , [
1514
+ (metric , 'inputnode.in_file' ),
1515
+ ('midthickness' , 'inputnode.midthickness' ),
1516
+ ('midthickness_fsLR' , 'inputnode.midthickness_fsLR' ),
1517
+ ('sphere_reg_fsLR' , 'inputnode.sphere_reg_fsLR' ),
1518
+ ('roi' , 'inputnode.cortex_mask' ),
1519
+ ]),
1520
+ (hemisource , resample_and_mask_wf , [('hemi' , 'inputnode.hemi' )]),
1521
+ (resample_and_mask_wf , cifti_metric , [('outputnode.out_file' , 'scalar_surfs' )]),
1522
+ (cifti_metric , outputnode , [
1523
+ ('out_file' , f'{ metric } _fsLR' ),
1524
+ ('out_metadata' , f'{ metric } _metadata' ),
1525
+ ]),
1526
+ ]) # fmt:skip
1527
+
1528
+ return workflow
1529
+
1530
+
1531
+ def init_resample_and_mask_wf (
1532
+ grayord_density : ty .Literal ['91k' , '170k' ],
1533
+ omp_nthreads : int ,
1534
+ mem_gb : float ,
1535
+ name : str = 'resample_and_mask_wf' ,
1536
+ ):
1537
+ """Resample GIFTI surfaces to fsLR space and mask with fsLR ROI.
1538
+
1539
+ Workflow Graph
1540
+ .. workflow::
1541
+ :graph2use: colored
1542
+ :simple_form: yes
1543
+
1544
+ from smriprep.workflows.surfaces import init_resample_and_mask_wf
1545
+ wf = init_resample_and_mask_wf(
1546
+ grayord_density='91k',
1547
+ omp_nthreads=1,
1548
+ mem_gb=1,
1549
+ )
1550
+
1551
+ Parameters
1552
+ ----------
1553
+ grayord_density : :class:`str`
1554
+ Either ``"91k"`` or ``"170k"``, representing the total *grayordinates*.
1555
+ omp_nthreads : :class:`int`
1556
+ Maximum number of threads an individual process may use
1557
+ mem_gb : :class:`float`
1558
+ Size of BOLD file in GB
1559
+ name : :class:`str`
1560
+ Name of workflow (default: ``"resample_and_mask_wf"``)
1561
+
1562
+ Inputs
1563
+ ------
1564
+ midthickness : :class:`list` of :class:`str`
1565
+ Path to left and right hemisphere midthickness GIFTI surfaces.
1566
+ midthickness_fsLR : :class:`list` of :class:`str`
1567
+ Path to left and right hemisphere midthickness GIFTI surfaces in fsLR space.
1568
+ sphere_reg_fsLR : :class:`list` of :class:`str`
1569
+ Path to left and right hemisphere sphere.reg GIFTI surfaces, mapping from subject to fsLR
1570
+
1571
+ Outputs
1572
+ -------
1573
+ metric_fsLR : :class:`list` of :class:`str`
1574
+ Path to metrics resampled as GIFTI files in fsLR space
1575
+
1576
+ """
1577
+ import templateflow .api as tf
1578
+ from nipype .pipeline import engine as pe
1579
+ from niworkflows .interfaces .utility import KeySelect
1580
+
1581
+ fslr_density = '32k' if grayord_density == '91k' else '59k'
1582
+
1583
+ workflow = pe .Workflow (name = name )
1584
+
1585
+ inputnode = pe .Node (
1586
+ niu .IdentityInterface (
1587
+ fields = [
1588
+ 'in_file' ,
1589
+ 'hemi' ,
1590
+ 'midthickness' ,
1591
+ 'midthickness_fsLR' ,
1592
+ 'sphere_reg_fsLR' ,
1593
+ 'cortex_mask' ,
1594
+ ]
1595
+ ),
1596
+ name = 'inputnode' ,
1597
+ )
1598
+
1599
+ outputnode = pe .Node (
1600
+ niu .IdentityInterface (fields = ['out_file' ]),
1601
+ name = 'outputnode' ,
1602
+ )
1603
+
1502
1604
select_surfaces = pe .Node (
1503
1605
KeySelect (
1504
1606
fields = [
1505
- 'curv' ,
1506
- 'sulc' ,
1507
- 'thickness' ,
1508
- 'roi' ,
1607
+ 'in_file' ,
1509
1608
'midthickness' ,
1510
1609
'midthickness_fsLR' ,
1511
1610
'sphere_reg_fsLR' ,
1512
1611
'template_sphere' ,
1612
+ 'cortex_mask' ,
1513
1613
'template_roi' ,
1514
1614
],
1515
1615
keys = ['L' , 'R' ],
@@ -1530,60 +1630,42 @@ def init_morph_grayords_wf(
1530
1630
)
1531
1631
for hemi in ['L' , 'R' ]
1532
1632
]
1633
+ atlases = smriprep .load_data ('atlases' )
1533
1634
select_surfaces .inputs .template_roi = [
1534
1635
str (atlases / f'L.atlasroi.{ fslr_density } _fs_LR.shape.gii' ),
1535
1636
str (atlases / f'R.atlasroi.{ fslr_density } _fs_LR.shape.gii' ),
1536
1637
]
1537
1638
1639
+ resample_to_fsLR = pe .Node (
1640
+ MetricResample (method = 'ADAP_BARY_AREA' , area_surfs = True ),
1641
+ name = 'resample_to_fsLR' ,
1642
+ mem_gb = 1 ,
1643
+ n_procs = omp_nthreads ,
1644
+ )
1645
+ mask_fsLR = pe .Node (MetricMask (), name = 'mask_fsLR' )
1646
+
1538
1647
workflow .connect ([
1539
1648
(inputnode , select_surfaces , [
1540
- ('curv' , 'curv' ),
1541
- ('sulc' , 'sulc' ),
1542
- ('thickness' , 'thickness' ),
1543
- ('roi' , 'roi' ),
1649
+ ('in_file' , 'in_file' ),
1544
1650
('midthickness' , 'midthickness' ),
1545
1651
('midthickness_fsLR' , 'midthickness_fsLR' ),
1546
1652
('sphere_reg_fsLR' , 'sphere_reg_fsLR' ),
1653
+ ('cortex_mask' , 'cortex_mask' ),
1654
+ ('hemi' , 'key' ),
1655
+ ]),
1656
+ (select_surfaces , resample_to_fsLR , [
1657
+ ('in_file' , 'in_file' ),
1658
+ ('sphere_reg_fsLR' , 'current_sphere' ),
1659
+ ('template_sphere' , 'new_sphere' ),
1660
+ ('midthickness' , 'current_area' ),
1661
+ ('midthickness_fsLR' , 'new_area' ),
1662
+ ('cortex_mask' , 'roi_metric' ),
1547
1663
]),
1548
- (hemisource , select_surfaces , [('hemi' , 'key' )]),
1664
+ (select_surfaces , mask_fsLR , [('template_roi' , 'mask' )]),
1665
+ (resample_to_fsLR , mask_fsLR , [('out_file' , 'in_file' )]),
1666
+ (mask_fsLR , outputnode , [('out_file' , 'out_file' )]),
1549
1667
]) # fmt:skip
1550
1668
1551
- for metric in ('curv' , 'sulc' , 'thickness' ):
1552
- resampler = pe .Node (
1553
- MetricResample (method = 'ADAP_BARY_AREA' , area_surfs = True ),
1554
- name = f'resample_{ metric } ' ,
1555
- n_procs = omp_nthreads ,
1556
- )
1557
- mask_fsLR = pe .Node (
1558
- MetricMask (),
1559
- name = f'mask_{ metric } ' ,
1560
- n_procs = omp_nthreads ,
1561
- )
1562
- cifti_metric = pe .JoinNode (
1563
- GenerateDScalar (grayordinates = grayord_density , scalar_name = metric ),
1564
- name = f'cifti_{ metric } ' ,
1565
- joinfield = ['scalar_surfs' ],
1566
- joinsource = 'hemisource' ,
1567
- )
1568
-
1569
- workflow .connect ([
1570
- (select_surfaces , resampler , [
1571
- (metric , 'in_file' ),
1572
- ('sphere_reg_fsLR' , 'current_sphere' ),
1573
- ('template_sphere' , 'new_sphere' ),
1574
- ('midthickness' , 'current_area' ),
1575
- ('midthickness_fsLR' , 'new_area' ),
1576
- ('roi' , 'roi_metric' ),
1577
- ]),
1578
- (select_surfaces , mask_fsLR , [('template_roi' , 'mask' )]),
1579
- (resampler , mask_fsLR , [('out_file' , 'in_file' )]),
1580
- (mask_fsLR , cifti_metric , [('out_file' , 'scalar_surfs' )]),
1581
- (cifti_metric , outputnode , [
1582
- ('out_file' , f'{ metric } _fsLR' ),
1583
- ('out_metadata' , f'{ metric } _metadata' ),
1584
- ]),
1585
- ]) # fmt:skip
1586
-
1587
1669
return workflow
1588
1670
1589
1671
0 commit comments